golly-2.5-src/0000755000175100001440000000000012156146016010273 500000000000000golly-2.5-src/gui-wx/0000755000175100001440000000000012156146016011513 500000000000000golly-2.5-src/gui-wx/configure/0000755000175100001440000000000012156146016013474 500000000000000golly-2.5-src/gui-wx/configure/m4/0000755000175100001440000000000012156146014014012 500000000000000golly-2.5-src/gui-wx/configure/m4/shlib.m40000644000175100001440000000147312156145314015304 00000000000000dnl Hackish check to determine the exact name of a dynamic library required to dnl run a specific executable. dnl dnl Usage: dnl CHECK_SHLIB_USED(variable,exec-path,lib-name,value-if-not-found) dnl Where: dnl `variable' is the name of the variable to be set to the full library name dnl `exec-path' is the full (absolute or relative) path to the executable dnl `lib-name' is the basename of the library (e.g. `perl' for `libperl.so') dnl `value-if-not-found' is the value set when the library is not found. AC_DEFUN([CHECK_SHLIB_USED], [ AC_MSG_CHECKING([for $3 shared library used by $2]) [$1=`$OBJDUMP -p "$2" \ | $EGREP -i 'NEEDED +lib$3[0-9.]*[.]so|DLL Name: +$3[0-9.]*[.]dll' \ | $SED 's/^.* //'`] AS_IF([test "x$]$1[" != x], [ AC_MSG_RESULT([$]$1) ], [ AC_MSG_RESULT([not found]) $1=$4 ]) ]) golly-2.5-src/gui-wx/configure/m4/wximage.m40000644000175100001440000000133212156145314015636 00000000000000dnl --------------------------------------------------------------------------- dnl Custom test to check for presence of specific image handlers in wxWindows. dnl Assumes WX_CONFIG_CHECK has already passed. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_CHECK_IMAGE_HANDLER], [ AC_LANG_PUSH([C++]) save_CXXFLAGS=$CXXFLAGS save_LIBS=$LIBS CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS" LIBS="$LIBS $WX_LIBS" AC_MSG_CHECKING([for ]$1[ image handler]) AC_LINK_IFELSE([AC_LANG_SOURCE([ #include int main() { new wx]$1[Handler(); } ])], [AC_MSG_RESULT([yes]); AC_DEFINE([HAVE_WX_]$1[_HANDLER])], [AC_MSG_RESULT([no])] ) CXXFLAGS=$save_CXXFLAGS LIBS=$save_LIBS AC_LANG_POP() ]) golly-2.5-src/gui-wx/configure/m4/wxwin.m40000644000175100001440000011730712156145314015363 00000000000000dnl --------------------------------------------------------------------------- dnl Author: wxWidgets development team, dnl Francesco Montorsi, dnl Bob McCown (Mac-testing) dnl Creation date: 24/11/2001 dnl RCS-ID: $Id$ dnl --------------------------------------------------------------------------- dnl =========================================================================== dnl Table of Contents of this macro file: dnl ------------------------------------- dnl dnl SECTION A: wxWidgets main macros dnl - WX_CONFIG_OPTIONS dnl - WX_CONFIG_CHECK dnl - WXRC_CHECK dnl - WX_STANDARD_OPTIONS dnl - WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS dnl - WX_DETECT_STANDARD_OPTION_VALUES dnl dnl SECTION B: wxWidgets-related utilities dnl - WX_LIKE_LIBNAME dnl - WX_ARG_ENABLE_YESNOAUTO dnl - WX_ARG_WITH_YESNOAUTO dnl dnl SECTION C: messages to the user dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN dnl - WX_STANDARD_OPTIONS_SUMMARY_MSG_END dnl - WX_BOOLOPT_SUMMARY dnl dnl The special "WX_DEBUG_CONFIGURE" variable can be set to 1 to enable extra dnl debug output on stdout from these macros. dnl =========================================================================== dnl --------------------------------------------------------------------------- dnl Macros for wxWidgets detection. Typically used in configure.in as: dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl WX_CONFIG_OPTIONS dnl ... dnl ... dnl WX_CONFIG_CHECK([2.6.0], [wxWin=1]) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.3.4 or above. dnl ]) dnl fi dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LIBS="$LIBS $WX_LIBS" dnl dnl If you want to support standard --enable-debug/unicode/shared options, you dnl may do the following: dnl dnl ... dnl AC_CANONICAL_SYSTEM dnl dnl # define configure options dnl WX_CONFIG_OPTIONS dnl WX_STANDARD_OPTIONS([debug,unicode,shared,toolkit,wxshared]) dnl dnl # basic configure checks dnl ... dnl dnl # we want to always have DEBUG==WX_DEBUG and UNICODE==WX_UNICODE dnl WX_DEBUG=$DEBUG dnl WX_UNICODE=$UNICODE dnl dnl WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS dnl WX_CONFIG_CHECK([2.8.0], [wxWin=1],,[html,core,net,base],[$WXCONFIG_FLAGS]) dnl WX_DETECT_STANDARD_OPTION_VALUES dnl dnl # write the output files dnl AC_CONFIG_FILES([Makefile ...]) dnl AC_OUTPUT dnl dnl # optional: just to show a message to the user dnl WX_STANDARD_OPTIONS_SUMMARY_MSG dnl dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl WX_CONFIG_OPTIONS dnl dnl adds support for --wx-prefix, --wx-exec-prefix, --with-wxdir and dnl --wx-config command line options dnl --------------------------------------------------------------------------- AC_DEFUN([WX_CONFIG_OPTIONS], [ AC_ARG_WITH(wxdir, [ --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH], [ wx_config_name="$withval/wx-config" wx_config_args="--inplace"]) AC_ARG_WITH(wx-config, [ --with-wx-config=CONFIG wx-config script to use (optional)], wx_config_name="$withval" ) AC_ARG_WITH(wx-prefix, [ --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional)], wx_config_prefix="$withval", wx_config_prefix="") AC_ARG_WITH(wx-exec-prefix, [ --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional)], wx_config_exec_prefix="$withval", wx_config_exec_prefix="") ]) dnl Helper macro for checking if wx version is at least $1.$2.$3, set's dnl wx_ver_ok=yes if it is: AC_DEFUN([_WX_PRIVATE_CHECK_VERSION], [ wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $1; then wx_ver_ok=yes else if test $wx_config_major_version -eq $1; then if test $wx_config_minor_version -gt $2; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $2; then if test $wx_config_micro_version -ge $3; then wx_ver_ok=yes fi fi fi fi fi fi ]) dnl --------------------------------------------------------------------------- dnl WX_CONFIG_CHECK(VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND dnl [, WX-LIBS [, ADDITIONAL-WX-CONFIG-FLAGS]]]]) dnl dnl Test for wxWidgets, and define WX_C*FLAGS, WX_LIBS and WX_LIBS_STATIC dnl (the latter is for static linking against wxWidgets). Set WX_CONFIG_NAME dnl environment variable to override the default name of the wx-config script dnl to use. Set WX_CONFIG_PATH to specify the full path to wx-config - in this dnl case the macro won't even waste time on tests for its existence. dnl dnl Optional WX-LIBS argument contains comma- or space-separated list of dnl wxWidgets libraries to link against. If it is not specified then WX_LIBS dnl and WX_LIBS_STATIC will contain flags to link with all of the core dnl wxWidgets libraries. dnl dnl Optional ADDITIONAL-WX-CONFIG-FLAGS argument is appended to wx-config dnl invocation command in present. It can be used to fine-tune lookup of dnl best wxWidgets build available. dnl dnl Example use: dnl WX_CONFIG_CHECK([2.6.0], [wxWin=1], [wxWin=0], [html,core,net] dnl [--unicode --debug]) dnl --------------------------------------------------------------------------- dnl dnl Get the cflags and libraries from the wx-config script dnl AC_DEFUN([WX_CONFIG_CHECK], [ dnl do we have wx-config name: it can be wx-config or wxd-config or ... if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi dnl deal with optional prefixes if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi dnl don't search the PATH if WX_CONFIG_NAME is absolute filename if test -x "$WX_CONFIG_NAME" ; then AC_MSG_CHECKING(for wx-config) WX_CONFIG_PATH="$WX_CONFIG_NAME" AC_MSG_RESULT($WX_CONFIG_PATH) else AC_PATH_PROG(WX_CONFIG_PATH, $WX_CONFIG_NAME, no, "$WX_LOOKUP_PATH:$PATH") fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=ifelse([$1], ,2.2.1,$1) if test -z "$5" ; then AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version]) else AC_MSG_CHECKING([for wxWidgets version >= $min_wx_version ($5)]) fi dnl don't add the libraries ($4) to this variable as this would result in dnl an error when it's used with --version below WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $5" WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` _WX_PRIVATE_CHECK_VERSION([$wx_requested_major_version], [$wx_requested_minor_version], [$wx_requested_micro_version]) if test -n "$wx_ver_ok"; then AC_MSG_RESULT(yes (version $WX_VERSION)) WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs $4` dnl is this even still appropriate? --static is a real option now dnl and WX_CONFIG_WITH_ARGS is likely to contain it if that is dnl what the user actually wants, making this redundant at best. dnl For now keep it in case anyone actually used it in the past. AC_MSG_CHECKING([for wxWidgets static library]) WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs $4 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi dnl starting with version 2.2.6 wx-config has --cppflags argument wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi dnl starting with version 2.7.0 wx-config has --rescomp option wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then dnl cannot give any useful info for resource compiler WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then dnl no choice but to define all flags like CFLAGS WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags $4` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else dnl we have CPPFLAGS included in CFLAGS included in CXXFLAGS WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags $4` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags $4` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags $4` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi ifelse([$2], , :, [$2]) else if test "x$WX_VERSION" = x; then dnl no wx-config at all AC_MSG_RESULT(no) else AC_MSG_RESULT(no (version $WX_VERSION is not new enough)) fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" if test ! -z "$5"; then wx_error_message=" The configuration you asked for $PACKAGE_NAME requires a wxWidgets build with the following settings: $5 but such build is not available. To see the wxWidgets builds available on this system, please use 'wx-config --list' command. To use the default build, returned by 'wx-config --selected-config', use the options with their 'auto' default values." fi wx_error_message=" The requested wxWidgets build couldn't be found. $wx_error_message If you still get this error, then check that 'wx-config' is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is $1 or above." ifelse([$3], , AC_MSG_ERROR([$wx_error_message]), [$3]) fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" ifelse([$3], , :, [$3]) fi AC_SUBST(WX_CPPFLAGS) AC_SUBST(WX_CFLAGS) AC_SUBST(WX_CXXFLAGS) AC_SUBST(WX_CFLAGS_ONLY) AC_SUBST(WX_CXXFLAGS_ONLY) AC_SUBST(WX_LIBS) AC_SUBST(WX_LIBS_STATIC) AC_SUBST(WX_VERSION) AC_SUBST(WX_RESCOMP) dnl need to export also WX_VERSION_MINOR and WX_VERSION_MAJOR symbols dnl to support wxpresets bakefiles (we export also WX_VERSION_MICRO for completeness): WX_VERSION_MAJOR="$wx_config_major_version" WX_VERSION_MINOR="$wx_config_minor_version" WX_VERSION_MICRO="$wx_config_micro_version" AC_SUBST(WX_VERSION_MAJOR) AC_SUBST(WX_VERSION_MINOR) AC_SUBST(WX_VERSION_MICRO) ]) dnl --------------------------------------------------------------------------- dnl Get information on the wxrc program for making C++, Python and xrs dnl resource files. dnl dnl AC_ARG_ENABLE(...) dnl AC_ARG_WITH(...) dnl ... dnl WX_CONFIG_OPTIONS dnl ... dnl WX_CONFIG_CHECK(2.6.0, wxWin=1) dnl if test "$wxWin" != 1; then dnl AC_MSG_ERROR([ dnl wxWidgets must be installed on your system dnl but wx-config script couldn't be found. dnl dnl Please check that wx-config is in path, the directory dnl where wxWidgets libraries are installed (returned by dnl 'wx-config --libs' command) is in LD_LIBRARY_PATH or dnl equivalent variable and wxWidgets version is 2.6.0 or above. dnl ]) dnl fi dnl dnl WXRC_CHECK([HAVE_WXRC=1], [HAVE_WXRC=0]) dnl if test "x$HAVE_WXRC" != x1; then dnl AC_MSG_ERROR([ dnl The wxrc program was not installed or not found. dnl dnl Please check the wxWidgets installation. dnl ]) dnl fi dnl dnl CPPFLAGS="$CPPFLAGS $WX_CPPFLAGS" dnl CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS_ONLY" dnl CFLAGS="$CFLAGS $WX_CFLAGS_ONLY" dnl dnl LDFLAGS="$LDFLAGS $WX_LIBS" dnl --------------------------------------------------------------------------- dnl --------------------------------------------------------------------------- dnl WXRC_CHECK([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl dnl Test for wxWidgets' wxrc program for creating either C++, Python or XRS dnl resources. The variable WXRC will be set and substituted in the configure dnl script and Makefiles. dnl dnl Example use: dnl WXRC_CHECK([wxrc=1], [wxrc=0]) dnl --------------------------------------------------------------------------- dnl dnl wxrc program from the wx-config script dnl AC_DEFUN([WXRC_CHECK], [ AC_ARG_VAR([WXRC], [Path to wxWidget's wxrc resource compiler]) if test "x$WX_CONFIG_NAME" = x; then AC_MSG_ERROR([The wxrc tests must run after wxWidgets test.]) else AC_MSG_CHECKING([for wxrc]) if test "x$WXRC" = x ; then dnl wx-config --utility is a new addition to wxWidgets: _WX_PRIVATE_CHECK_VERSION(2,5,3) if test -n "$wx_ver_ok"; then WXRC=`$WX_CONFIG_WITH_ARGS --utility=wxrc` fi fi if test "x$WXRC" = x ; then AC_MSG_RESULT([not found]) ifelse([$2], , :, [$2]) else AC_MSG_RESULT([$WXRC]) ifelse([$1], , :, [$1]) fi AC_SUBST(WXRC) fi ]) dnl --------------------------------------------------------------------------- dnl WX_LIKE_LIBNAME([output-var] [prefix], [name]) dnl dnl Sets the "output-var" variable to the name of a library named with same dnl wxWidgets rule. dnl E.g. for output-var=='lib', name=='test', prefix='mine', sets dnl the $lib variable to: dnl 'mine_gtk2ud_test-2.8' dnl if WX_PORT=gtk2, WX_UNICODE=1, WX_DEBUG=1 and WX_RELEASE=28 dnl --------------------------------------------------------------------------- AC_DEFUN([WX_LIKE_LIBNAME], [ wx_temp="$2""_""$WX_PORT" dnl add the [u][d] string if test "$WX_UNICODE" = "1"; then wx_temp="$wx_temp""u" fi if test "$WX_DEBUG" = "1"; then wx_temp="$wx_temp""d" fi dnl complete the name of the lib wx_temp="$wx_temp""_""$3""-$WX_VERSION_MAJOR.$WX_VERSION_MINOR" dnl save it in the user's variable $1=$wx_temp ]) dnl --------------------------------------------------------------------------- dnl WX_ARG_ENABLE_YESNOAUTO/WX_ARG_WITH_YESNOAUTO dnl dnl Two little custom macros which define the ENABLE/WITH configure arguments. dnl Macro arguments: dnl $1 = the name of the --enable / --with feature dnl $2 = the name of the variable associated dnl $3 = the description of that feature dnl $4 = the default value for that feature dnl $5 = additional action to do in case option is given with "yes" value dnl --------------------------------------------------------------------------- AC_DEFUN([WX_ARG_ENABLE_YESNOAUTO], [AC_ARG_ENABLE($1, AC_HELP_STRING([--enable-$1], [$3 (default is $4)]), [], [enableval="$4"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --enable-$1 option]) if test "$enableval" = "yes" ; then AC_MSG_RESULT([yes]) $2=1 $5 elif test "$enableval" = "no" ; then AC_MSG_RESULT([no]) $2=0 elif test "$enableval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) $2="auto" else AC_MSG_ERROR([ Unrecognized option value (allowed values: yes, no, auto) ]) fi ]) AC_DEFUN([WX_ARG_WITH_YESNOAUTO], [AC_ARG_WITH($1, AC_HELP_STRING([--with-$1], [$3 (default is $4)]), [], [withval="$4"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --with-$1 option]) if test "$withval" = "yes" ; then AC_MSG_RESULT([yes]) $2=1 $5 dnl NB: by default we don't allow --with-$1=no option dnl since it does not make much sense ! elif test "$6" = "1" -a "$withval" = "no" ; then AC_MSG_RESULT([no]) $2=0 elif test "$withval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) $2="auto" else AC_MSG_ERROR([ Unrecognized option value (allowed values: yes, auto) ]) fi ]) dnl --------------------------------------------------------------------------- dnl WX_STANDARD_OPTIONS([options-to-add]) dnl dnl Adds to the configure script one or more of the following options: dnl --enable-[debug|unicode|shared|wxshared|wxdebug] dnl --with-[gtk|msw|motif|x11|mac|mgl|dfb] dnl --with-wxversion dnl Then checks for their presence and eventually set the DEBUG, UNICODE, SHARED, dnl PORT, WX_SHARED, WX_DEBUG, variables to one of the "yes", "no", "auto" values. dnl dnl Note that e.g. UNICODE != WX_UNICODE; the first is the value of the dnl --enable-unicode option (in boolean format) while the second indicates dnl if wxWidgets was built in Unicode mode (and still is in boolean format). dnl --------------------------------------------------------------------------- AC_DEFUN([WX_STANDARD_OPTIONS], [ dnl the following lines will expand to WX_ARG_ENABLE_YESNOAUTO calls if and only if dnl the $1 argument contains respectively the debug,unicode or shared options. dnl be careful here not to set debug flag if only "wxdebug" was specified ifelse(regexp([$1], [\bdebug]), [-1],, [WX_ARG_ENABLE_YESNOAUTO([debug], [DEBUG], [Build in debug mode], [auto])]) ifelse(index([$1], [unicode]), [-1],, [WX_ARG_ENABLE_YESNOAUTO([unicode], [UNICODE], [Build in Unicode mode], [auto])]) ifelse(regexp([$1], [\bshared]), [-1],, [WX_ARG_ENABLE_YESNOAUTO([shared], [SHARED], [Build as shared library], [auto])]) dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-toolkit since it's an option dnl which must be able to accept the auto|gtk1|gtk2|msw|... values ifelse(index([$1], [toolkit]), [-1],, [ AC_ARG_WITH([toolkit], AC_HELP_STRING([--with-toolkit], [Build against a specific wxWidgets toolkit (default is auto)]), [], [withval="auto"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --with-toolkit option]) if test "$withval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) TOOLKIT="auto" else TOOLKIT="$withval" dnl PORT must be one of the allowed values if test "$TOOLKIT" != "gtk1" -a "$TOOLKIT" != "gtk2" -a \ "$TOOLKIT" != "msw" -a "$TOOLKIT" != "motif" -a \ "$TOOLKIT" != "x11" -a "$TOOLKIT" != "mac" -a \ "$TOOLKIT" != "mgl" -a "$TOOLKIT" != "dfb" ; then AC_MSG_ERROR([ Unrecognized option value (allowed values: auto, gtk1, gtk2, msw, motif, x11, mac, mgl, dfb) ]) fi AC_MSG_RESULT([$TOOLKIT]) fi ]) dnl ****** IMPORTANT ******* dnl Unlike for the UNICODE setting, you can build your program in dnl shared mode against a static build of wxWidgets. Thus we have the dnl following option which allows these mixtures. E.g. dnl dnl ./configure --disable-shared --with-wxshared dnl dnl will build your library in static mode against the first available dnl shared build of wxWidgets. dnl dnl Note that's not possible to do the viceversa: dnl dnl ./configure --enable-shared --without-wxshared dnl dnl Doing so you would try to build your library in shared mode against a static dnl build of wxWidgets. This is not possible (you would mix PIC and non PIC code) ! dnl A check for this combination of options is in WX_DETECT_STANDARD_OPTION_VALUES dnl (where we know what 'auto' should be expanded to). dnl dnl If you try to build something in ANSI mode against a UNICODE build dnl of wxWidgets or in RELEASE mode against a DEBUG build of wxWidgets, dnl then at best you'll get ton of linking errors ! dnl ************************ ifelse(index([$1], [wxshared]), [-1],, [ WX_ARG_WITH_YESNOAUTO( [wxshared], [WX_SHARED], [Force building against a shared build of wxWidgets, even if --disable-shared is given], [auto], [], [1]) ]) dnl Just like for SHARED and WX_SHARED it may happen that some adventurous dnl peoples will want to mix a wxWidgets release build with a debug build of dnl his app/lib. So, we have both DEBUG and WX_DEBUG variables. ifelse(index([$1], [wxdebug]), [-1],, [ WX_ARG_WITH_YESNOAUTO( [wxdebug], [WX_DEBUG], [Force building against a debug build of wxWidgets, even if --disable-debug is given], [auto], [], [1]) ]) dnl WX_ARG_WITH_YESNOAUTO cannot be used for --with-wxversion since it's an option dnl which accepts the "auto|2.6|2.7|2.8|2.9|3.0" etc etc values ifelse(index([$1], [wxversion]), [-1],, [ AC_ARG_WITH([wxversion], AC_HELP_STRING([--with-wxversion], [Build against a specific version of wxWidgets (default is auto)]), [], [withval="auto"]) dnl Show a message to the user about this option AC_MSG_CHECKING([for the --with-wxversion option]) if test "$withval" = "auto" ; then AC_MSG_RESULT([will be automatically detected]) WX_RELEASE="auto" else wx_requested_major_version=`echo $withval | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\1/'` wx_requested_minor_version=`echo $withval | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).*/\2/'` dnl both vars above must be exactly 1 digit if test "${#wx_requested_major_version}" != "1" -o \ "${#wx_requested_minor_version}" != "1" ; then AC_MSG_ERROR([ Unrecognized option value (allowed values: auto, 2.6, 2.7, 2.8, 2.9, 3.0) ]) fi WX_RELEASE="$wx_requested_major_version"".""$wx_requested_minor_version" AC_MSG_RESULT([$WX_RELEASE]) fi ]) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] DEBUG: $DEBUG, WX_DEBUG: $WX_DEBUG" echo "[[dbg]] UNICODE: $UNICODE, WX_UNICODE: $WX_UNICODE" echo "[[dbg]] SHARED: $SHARED, WX_SHARED: $WX_SHARED" echo "[[dbg]] TOOLKIT: $TOOLKIT, WX_TOOLKIT: $WX_TOOLKIT" echo "[[dbg]] VERSION: $VERSION, WX_RELEASE: $WX_RELEASE" fi ]) dnl --------------------------------------------------------------------------- dnl WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS dnl dnl Sets the WXCONFIG_FLAGS string using the SHARED,DEBUG,UNICODE variable values dnl which are different from "auto". dnl Thus this macro needs to be called only once all options have been set. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS], [ if test "$WX_SHARED" = "1" ; then WXCONFIG_FLAGS="--static=no " elif test "$WX_SHARED" = "0" ; then WXCONFIG_FLAGS="--static=yes " fi if test "$WX_DEBUG" = "1" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=yes " elif test "$WX_DEBUG" = "0" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=no " fi dnl The user should have set WX_UNICODE=UNICODE if test "$WX_UNICODE" = "1" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=yes " elif test "$WX_UNICODE" = "0" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=no " fi if test "$TOOLKIT" != "auto" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--toolkit=$TOOLKIT " fi if test "$WX_RELEASE" != "auto" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--version=$WX_RELEASE " fi dnl strip out the last space of the string WXCONFIG_FLAGS=${WXCONFIG_FLAGS% } if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] WXCONFIG_FLAGS: $WXCONFIG_FLAGS" fi ]) dnl --------------------------------------------------------------------------- dnl _WX_SELECTEDCONFIG_CHECKFOR([RESULTVAR], [STRING], [MSG] dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl dnl Outputs the given MSG. Then searches the given STRING in the wxWidgets dnl additional CPP flags and put the result of the search in WX_$RESULTVAR dnl also adding the "yes" or "no" message result to MSG. dnl --------------------------------------------------------------------------- AC_DEFUN([_WX_SELECTEDCONFIG_CHECKFOR], [ if test "$$1" = "auto" ; then dnl The user does not have particular preferences for this option; dnl so we will detect the wxWidgets relative build setting and use it AC_MSG_CHECKING([$3]) dnl set WX_$1 variable to 1 if the $WX_SELECTEDCONFIG contains the $2 dnl string or to 0 otherwise. dnl NOTE: 'expr match STRING REGEXP' cannot be used since on Mac it dnl doesn't work; we use 'expr STRING : REGEXP' instead WX_$1=$(expr "$WX_SELECTEDCONFIG" : ".*$2.*") if test "$WX_$1" != "0"; then WX_$1=1 AC_MSG_RESULT([yes]) ifelse([$4], , :, [$4]) else WX_$1=0 AC_MSG_RESULT([no]) ifelse([$5], , :, [$5]) fi else dnl Use the setting given by the user WX_$1=$$1 fi ]) dnl --------------------------------------------------------------------------- dnl WX_DETECT_STANDARD_OPTION_VALUES dnl dnl Detects the values of the following variables: dnl 1) WX_RELEASE dnl 2) WX_UNICODE dnl 3) WX_DEBUG dnl 4) WX_SHARED (and also WX_STATIC) dnl 5) WX_PORT dnl from the previously selected wxWidgets build; this macro in fact must be dnl called *after* calling the WX_CONFIG_CHECK macro. dnl dnl Note that the WX_VERSION_MAJOR, WX_VERSION_MINOR symbols are already set dnl by WX_CONFIG_CHECK macro dnl --------------------------------------------------------------------------- AC_DEFUN([WX_DETECT_STANDARD_OPTION_VALUES], [ dnl IMPORTANT: WX_VERSION contains all three major.minor.micro digits, dnl while WX_RELEASE only the major.minor ones. WX_RELEASE="$WX_VERSION_MAJOR""$WX_VERSION_MINOR" if test $WX_RELEASE -lt 26 ; then AC_MSG_ERROR([ Cannot detect the wxWidgets configuration for the selected wxWidgets build since its version is $WX_VERSION < 2.6.0; please install a newer version of wxWidgets. ]) fi dnl The wx-config we are using understands the "--selected_config" dnl option which returns an easy-parseable string ! WX_SELECTEDCONFIG=$($WX_CONFIG_WITH_ARGS --selected_config) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] Using wx-config --selected-config" echo "[[dbg]] WX_SELECTEDCONFIG: $WX_SELECTEDCONFIG" fi dnl we could test directly for WX_SHARED with a line like: dnl _WX_SELECTEDCONFIG_CHECKFOR([SHARED], [shared], dnl [if wxWidgets was built in SHARED mode]) dnl but wx-config --selected-config DOES NOT outputs the 'shared' dnl word when wx was built in shared mode; it rather outputs the dnl 'static' word when built in static mode. if test $WX_SHARED = "1"; then STATIC=0 elif test $WX_SHARED = "0"; then STATIC=1 elif test $WX_SHARED = "auto"; then STATIC="auto" fi dnl Now set the WX_UNICODE, WX_DEBUG, WX_STATIC variables _WX_SELECTEDCONFIG_CHECKFOR([UNICODE], [unicode], [if wxWidgets was built with UNICODE enabled]) _WX_SELECTEDCONFIG_CHECKFOR([DEBUG], [debug], [if wxWidgets was built in DEBUG mode]) _WX_SELECTEDCONFIG_CHECKFOR([STATIC], [static], [if wxWidgets was built in STATIC mode]) dnl init WX_SHARED from WX_STATIC if test "$WX_STATIC" != "0"; then WX_SHARED=0 else WX_SHARED=1 fi AC_SUBST(WX_UNICODE) AC_SUBST(WX_DEBUG) AC_SUBST(WX_SHARED) dnl detect the WX_PORT to use if test "$TOOLKIT" = "auto" ; then dnl The user does not have particular preferences for this option; dnl so we will detect the wxWidgets relative build setting and use it AC_MSG_CHECKING([which wxWidgets toolkit was selected]) WX_GTKPORT1=$(expr "$WX_SELECTEDCONFIG" : ".*gtk1.*") WX_GTKPORT2=$(expr "$WX_SELECTEDCONFIG" : ".*gtk2.*") WX_MSWPORT=$(expr "$WX_SELECTEDCONFIG" : ".*msw.*") WX_MOTIFPORT=$(expr "$WX_SELECTEDCONFIG" : ".*motif.*") WX_OSXCOCOAPORT=$(expr "$WX_SELECTEDCONFIG" : ".*osx_cocoa.*") WX_OSXCARBONPORT=$(expr "$WX_SELECTEDCONFIG" : ".*osx_carbon.*") WX_X11PORT=$(expr "$WX_SELECTEDCONFIG" : ".*x11.*") WX_MGLPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mgl.*") WX_DFBPORT=$(expr "$WX_SELECTEDCONFIG" : ".*dfb.*") WX_PORT="unknown" if test "$WX_GTKPORT1" != "0"; then WX_PORT="gtk1"; fi if test "$WX_GTKPORT2" != "0"; then WX_PORT="gtk2"; fi if test "$WX_MSWPORT" != "0"; then WX_PORT="msw"; fi if test "$WX_MOTIFPORT" != "0"; then WX_PORT="motif"; fi if test "$WX_OSXCOCOAPORT" != "0"; then WX_PORT="osx_cocoa"; fi if test "$WX_OSXCARBONPORT" != "0"; then WX_PORT="osx_carbon"; fi if test "$WX_X11PORT" != "0"; then WX_PORT="x11"; fi if test "$WX_MGLPORT" != "0"; then WX_PORT="mgl"; fi if test "$WX_DFBPORT" != "0"; then WX_PORT="dfb"; fi dnl NOTE: backward-compatible check for wx2.8; in wx2.9 the mac dnl ports are called 'osx_cocoa' and 'osx_carbon' (see above) WX_MACPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mac.*") if test "$WX_MACPORT" != "0"; then WX_PORT="mac"; fi dnl check at least one of the WX_*PORT has been set ! if test "$WX_PORT" = "unknown" ; then AC_MSG_ERROR([ Cannot detect the currently installed wxWidgets port ! Please check your 'wx-config --cxxflags'... ]) fi AC_MSG_RESULT([$WX_PORT]) else dnl Use the setting given by the user if test -z "$TOOLKIT" ; then WX_PORT=$TOOLKIT else dnl try with PORT WX_PORT=$PORT fi fi AC_SUBST(WX_PORT) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[[dbg]] Values of all WX_* options after final detection:" echo "[[dbg]] WX_DEBUG: $WX_DEBUG" echo "[[dbg]] WX_UNICODE: $WX_UNICODE" echo "[[dbg]] WX_SHARED: $WX_SHARED" echo "[[dbg]] WX_RELEASE: $WX_RELEASE" echo "[[dbg]] WX_PORT: $WX_PORT" fi dnl Avoid problem described in the WX_STANDARD_OPTIONS which happens when dnl the user gives the options: dnl ./configure --enable-shared --without-wxshared dnl or just do dnl ./configure --enable-shared dnl but there is only a static build of wxWidgets available. if test "$WX_SHARED" = "0" -a "$SHARED" = "1"; then AC_MSG_ERROR([ Cannot build shared library against a static build of wxWidgets ! This error happens because the wxWidgets build which was selected has been detected as static while you asked to build $PACKAGE_NAME as shared library and this is not possible. Use the '--disable-shared' option to build $PACKAGE_NAME as static library or '--with-wxshared' to use wxWidgets as shared library. ]) fi dnl now we can finally update the DEBUG,UNICODE,SHARED options dnl to their final values if they were set to 'auto' if test "$DEBUG" = "auto"; then DEBUG=$WX_DEBUG fi if test "$UNICODE" = "auto"; then UNICODE=$WX_UNICODE fi if test "$SHARED" = "auto"; then SHARED=$WX_SHARED fi if test "$TOOLKIT" = "auto"; then TOOLKIT=$WX_PORT fi dnl in case the user needs a BUILD=debug/release var... if test "$DEBUG" = "1"; then BUILD="debug" elif test "$DEBUG" = "0" -o "$DEBUG" = ""; then BUILD="release" fi dnl respect the DEBUG variable adding the optimize/debug flags dnl NOTE: the CXXFLAGS are merged together with the CPPFLAGS so we dnl don't need to set them, too if test "$DEBUG" = "1"; then CXXFLAGS="$CXXFLAGS -g -O0" CFLAGS="$CFLAGS -g -O0" else CXXFLAGS="$CXXFLAGS -O2" CFLAGS="$CFLAGS -O2" fi ]) dnl --------------------------------------------------------------------------- dnl WX_BOOLOPT_SUMMARY([name of the boolean variable to show summary for], dnl [what to print when var is 1], dnl [what to print when var is 0]) dnl dnl Prints $2 when variable $1 == 1 and prints $3 when variable $1 == 0. dnl This macro mainly exists just to make configure.ac scripts more readable. dnl dnl NOTE: you need to use the [" my message"] syntax for 2nd and 3rd arguments dnl if you want that m4 avoid to throw away the spaces prefixed to the dnl argument value. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_BOOLOPT_SUMMARY], [ if test "x$$1" = "x1" ; then echo $2 elif test "x$$1" = "x0" ; then echo $3 else echo "$1 is $$1" fi ]) dnl --------------------------------------------------------------------------- dnl WX_STANDARD_OPTIONS_SUMMARY_MSG dnl dnl Shows a summary message to the user about the WX_* variable contents. dnl This macro is used typically at the end of the configure script. dnl --------------------------------------------------------------------------- AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG], [ echo echo " The wxWidgets build which will be used by $PACKAGE_NAME $PACKAGE_VERSION" echo " has the following settings:" WX_BOOLOPT_SUMMARY([WX_DEBUG], [" - DEBUG build"], [" - RELEASE build"]) WX_BOOLOPT_SUMMARY([WX_UNICODE], [" - UNICODE mode"], [" - ANSI mode"]) WX_BOOLOPT_SUMMARY([WX_SHARED], [" - SHARED mode"], [" - STATIC mode"]) echo " - VERSION: $WX_VERSION" echo " - PORT: $WX_PORT" ]) dnl --------------------------------------------------------------------------- dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN, WX_STANDARD_OPTIONS_SUMMARY_MSG_END dnl dnl Like WX_STANDARD_OPTIONS_SUMMARY_MSG macro but these two macros also gives info dnl about the configuration of the package which used the wxpresets. dnl dnl Typical usage: dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN dnl echo " - Package setting 1: $SETTING1" dnl echo " - Package setting 2: $SETTING1" dnl ... dnl WX_STANDARD_OPTIONS_SUMMARY_MSG_END dnl dnl --------------------------------------------------------------------------- AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_BEGIN], [ echo echo " ----------------------------------------------------------------" echo " Configuration for $PACKAGE_NAME $PACKAGE_VERSION successfully completed." echo " Summary of main configuration settings for $PACKAGE_NAME:" WX_BOOLOPT_SUMMARY([DEBUG], [" - DEBUG build"], [" - RELEASE build"]) WX_BOOLOPT_SUMMARY([UNICODE], [" - UNICODE mode"], [" - ANSI mode"]) WX_BOOLOPT_SUMMARY([SHARED], [" - SHARED mode"], [" - STATIC mode"]) ]) AC_DEFUN([WX_STANDARD_OPTIONS_SUMMARY_MSG_END], [ WX_STANDARD_OPTIONS_SUMMARY_MSG echo echo " Now, just run make." echo " ----------------------------------------------------------------" echo ]) dnl --------------------------------------------------------------------------- dnl Deprecated macro wrappers dnl --------------------------------------------------------------------------- AC_DEFUN([AM_OPTIONS_WXCONFIG], [WX_CONFIG_OPTIONS]) AC_DEFUN([AM_PATH_WXCONFIG], [ WX_CONFIG_CHECK([$1],[$2],[$3],[$4],[$5]) ]) golly-2.5-src/gui-wx/configure/sources.am0000644000175100001440000006635512156145615015441 00000000000000libgolly_a_SOURCES = ../../gollybase/bigint.h ../../gollybase/generationsalgo.h ../../gollybase/ghashbase.h ../../gollybase/hlifealgo.h ../../gollybase/jvnalgo.h ../../gollybase/lifealgo.h ../../gollybase/lifepoll.h ../../gollybase/liferender.h ../../gollybase/liferules.h ../../gollybase/platform.h ../../gollybase/qlifealgo.h ../../gollybase/readpattern.h ../../gollybase/ruleloaderalgo.h ../../gollybase/ruletable_algo.h ../../gollybase/ruletreealgo.h ../../gollybase/util.h ../../gollybase/viewport.h ../../gollybase/writepattern.h ../../gollybase/bigint.cpp ../../gollybase/generationsalgo.cpp ../../gollybase/ghashbase.cpp ../../gollybase/ghashdraw.cpp ../../gollybase/hlifealgo.cpp ../../gollybase/hlifedraw.cpp ../../gollybase/jvnalgo.cpp ../../gollybase/lifealgo.cpp ../../gollybase/lifepoll.cpp ../../gollybase/liferender.cpp ../../gollybase/liferules.cpp ../../gollybase/qlifealgo.cpp ../../gollybase/qlifedraw.cpp ../../gollybase/readpattern.cpp ../../gollybase/ruleloaderalgo.cpp ../../gollybase/ruletable_algo.cpp ../../gollybase/ruletreealgo.cpp ../../gollybase/util.cpp ../../gollybase/viewport.cpp ../../gollybase/writepattern.cpp golly_SOURCES = ../../gui-wx/wxalgos.h ../../gui-wx/wxedit.h ../../gui-wx/wxgolly.h ../../gui-wx/wxhelp.h ../../gui-wx/wxinfo.h ../../gui-wx/wxlayer.h ../../gui-wx/wxmain.h ../../gui-wx/wxperl.h ../../gui-wx/wxprefs.h ../../gui-wx/wxpython.h ../../gui-wx/wxrender.h ../../gui-wx/wxrule.h ../../gui-wx/wxscript.h ../../gui-wx/wxselect.h ../../gui-wx/wxstatus.h ../../gui-wx/wxtimeline.h ../../gui-wx/wxundo.h ../../gui-wx/wxutils.h ../../gui-wx/wxview.h ../../gui-wx/wxalgos.cpp ../../gui-wx/wxcontrol.cpp ../../gui-wx/wxedit.cpp ../../gui-wx/wxfile.cpp ../../gui-wx/wxgolly.cpp ../../gui-wx/wxhelp.cpp ../../gui-wx/wxinfo.cpp ../../gui-wx/wxlayer.cpp ../../gui-wx/wxmain.cpp ../../gui-wx/wxperl.cpp ../../gui-wx/wxprefs.cpp ../../gui-wx/wxpython.cpp ../../gui-wx/wxrender.cpp ../../gui-wx/wxrule.cpp ../../gui-wx/wxscript.cpp ../../gui-wx/wxselect.cpp ../../gui-wx/wxstatus.cpp ../../gui-wx/wxtimeline.cpp ../../gui-wx/wxundo.cpp ../../gui-wx/wxutils.cpp ../../gui-wx/wxview.cpp gollydatadir = $(pkgdatadir)/Patterns/Life/ nobase_dist_gollydata_DATA = ../../Help/about.gif ../../Help/about.html ../../Help/Algorithms/Generations.html ../../Help/Algorithms/HashLife.html ../../Help/Algorithms/JvN.html ../../Help/Algorithms/QuickLife.html ../../Help/Algorithms/RuleLoader.html ../../Help/algos.html ../../Help/archives.html ../../Help/bounded.html ../../Help/changes.html ../../Help/control.html ../../Help/credits.html ../../Help/edit.html ../../Help/file.html ../../Help/formats.html ../../Help/help.html ../../Help/index.html ../../Help/intro.html ../../Help/layer.html ../../Help/Lexicon/lex_1.htm ../../Help/Lexicon/lex_a.htm ../../Help/Lexicon/lex_b.htm ../../Help/Lexicon/lex_bib.htm ../../Help/Lexicon/lex_c.htm ../../Help/Lexicon/lex_d.htm ../../Help/Lexicon/lex_e.htm ../../Help/Lexicon/lex_f.htm ../../Help/Lexicon/lex_g.htm ../../Help/Lexicon/lex_h.htm ../../Help/Lexicon/lex.htm ../../Help/Lexicon/lex_i.htm ../../Help/Lexicon/lex_j.htm ../../Help/Lexicon/lex_k.htm ../../Help/Lexicon/lex_l.htm ../../Help/Lexicon/lex_m.htm ../../Help/Lexicon/lex_n.htm ../../Help/Lexicon/lex_o.htm ../../Help/Lexicon/lex_p.htm ../../Help/Lexicon/lex_q.htm ../../Help/Lexicon/lex_r.htm ../../Help/Lexicon/lex_s.htm ../../Help/Lexicon/lex_t.htm ../../Help/Lexicon/lex_u.htm ../../Help/Lexicon/lex_v.htm ../../Help/Lexicon/lex_w.htm ../../Help/Lexicon/lex_x.htm ../../Help/Lexicon/lex_y.htm ../../Help/Lexicon/lex_z.htm ../../Help/Lexicon/modify.pl ../../Help/mouse.html ../../Help/perl.html ../../Help/problems.html ../../Help/python.html ../../Help/refs.html ../../Help/tips.html ../../Help/view.html ../../Patterns/Banks/Banks-I-demo.rle ../../Patterns/Banks/Banks-II-demo.rle ../../Patterns/Banks/Banks-III-demo.rle ../../Patterns/Banks/Banks-IV-constructor.rle.gz ../../Patterns/Banks/Banks-IV-demo.rle ../../Patterns/Codd/clocking-on-demo.rle ../../Patterns/Codd/coders-demo.rle ../../Patterns/Codd/construction-arm-demo.rle ../../Patterns/Codd/crossover-unidir-demo.rle ../../Patterns/Codd/decoder-4bit-demo.rle.gz ../../Patterns/Codd/echo-discriminator.rle ../../Patterns/Codd/echo-switch-demo.rle ../../Patterns/Codd/extend-coder-demo.rle ../../Patterns/Codd/gates-demo.rle ../../Patterns/Codd/golly-constructor.rle.gz ../../Patterns/Codd/Goucher-replicator.mc.gz ../../Patterns/Codd/repeater-emitter-demo.rle ../../Patterns/Codd/sensing-demo.rle ../../Patterns/Codd/sheathing-demo.rle ../../Patterns/Codd/sheathing-problems.rle ../../Patterns/Codd/signals-demo.rle ../../Patterns/Codd/tape-reader-demo.rle ../../Patterns/Devore/crossover.rle ../../Patterns/Devore/Devore-body.rle ../../Patterns/Devore/Devore-rep.rle ../../Patterns/Devore/discriminator.rle ../../Patterns/Generations/Banner.mcl ../../Patterns/Generations/Bloomerang.mcl ../../Patterns/Generations/Burst.mcl ../../Patterns/Generations/Caterpillars.mcl ../../Patterns/Generations/Delta.rle ../../Patterns/Generations/Ebb-and-Flow.mcl ../../Patterns/Generations/Fireworks.mcl ../../Patterns/Generations/Lava.mcl ../../Patterns/Generations/Lines.mcl ../../Patterns/Generations/MeteorGuns.mcl ../../Patterns/Generations/Nova.mcl ../../Patterns/Generations/Perfect-spiral.mcl ../../Patterns/Generations/Sawfish.rle ../../Patterns/Generations/SediMental.mcl ../../Patterns/Generations/Steeplechase.mcl ../../Patterns/Generations/Transers.mcl ../../Patterns/Generations/What-a-mess.mcl ../../Patterns/HashLife/broken-lines.mc ../../Patterns/HashLife/catacryst.mc ../../Patterns/HashLife/gotts-dots.mc ../../Patterns/HashLife/hashlife-oddity1.mc ../../Patterns/HashLife/hashlife-oddity2.mc ../../Patterns/HashLife/hexadecimal.mc.gz ../../Patterns/HashLife/jagged2.mc ../../Patterns/HashLife/jagged.mc ../../Patterns/HashLife/logarithmic-width.mc ../../Patterns/HashLife/metacatacryst.mc ../../Patterns/HashLife/metapixel-galaxy.mc.gz ../../Patterns/HashLife/metapixel-p216-gun.mc.gz ../../Patterns/HashLife/metapixel-parity64.mc.gz ../../Patterns/HashLife/mosquito5.mc ../../Patterns/HashLife/nick-gotts-1.mc ../../Patterns/HashLife/nick-gotts-2.mc ../../Patterns/HashLife/puzzle.mc ../../Patterns/HashLife/ruler.mc ../../Patterns/HashLife/totalperiodic.mc ../../Patterns/HashLife/unlimited-novelty.mc ../../Patterns/HashLife/wedge-grow.mc ../../Patterns/HashLife/wolfram22.mc ../../Patterns/JvN/Boustrophedon-replicator.rle ../../Patterns/JvN/cell-coders-demo.rle ../../Patterns/JvN/codon4-auto-retract.rle ../../Patterns/JvN/codon5-auto-retract.rle ../../Patterns/JvN/construction-arm-demo.rle ../../Patterns/JvN/counter-demo.rle ../../Patterns/JvN/golly-constructor.rle ../../Patterns/JvN/Hutton-replicator.rle ../../Patterns/JvN/JvN-loop-replicator.rle.gz ../../Patterns/JvN/N-compressed-replicator.rle ../../Patterns/JvN/NP-mutation.rle.gz ../../Patterns/JvN/NP-replicator.rle.gz ../../Patterns/JvN/partial-constructor.mc.gz ../../Patterns/JvN/read-arm-demo.rle ../../Patterns/JvN/sphinx.mc.gz ../../Patterns/JvN/sphinx-midpoint.mc.gz ../../Patterns/JvN/sphinx-spark.mc.gz ../../Patterns/Life/Bounded-Grids/agar-p3.rle ../../Patterns/Life/Bounded-Grids/cross-surface.rle ../../Patterns/Life/Bounded-Grids/herringbone-agar-p14.rle ../../Patterns/Life/Bounded-Grids/Klein-bottle.rle ../../Patterns/Life/Bounded-Grids/lightspeed-bubble.rle ../../Patterns/Life/Bounded-Grids/pulsars-in-tube.rle ../../Patterns/Life/Bounded-Grids/sphere.rle ../../Patterns/Life/Bounded-Grids/torus.rle ../../Patterns/Life/Bounded-Grids/torus-with-shift.rle ../../Patterns/Life/Breeders/breeder.lif ../../Patterns/Life/Breeders/c4-diag-switch-engines.rle ../../Patterns/Life/Breeders/LWSS-breeder.rle ../../Patterns/Life/Breeders/p100-H-channel-breeder.rle ../../Patterns/Life/Breeders/p90-rake-factory.rle ../../Patterns/Life/Breeders/pi-blink-breeder1.rle ../../Patterns/Life/Breeders/pi-blink-breeder2.rle ../../Patterns/Life/Breeders/rake-breeder.rle ../../Patterns/Life/Breeders/slide-breeder.rle ../../Patterns/Life/Breeders/spacefiller.rle ../../Patterns/Life/Breeders/switch-engine-breeder-MR.rle ../../Patterns/Life/Breeders/switch-engine-breeder.rle ../../Patterns/Life/Guns/2c5-spaceship-gun-p416.rle ../../Patterns/Life/Guns/2c5-spaceship-gun-p690.rle ../../Patterns/Life/Guns/7-in-a-row-Cordership-V-gun.rle ../../Patterns/Life/Guns/Cordership-gun-p784.rle ../../Patterns/Life/Guns/golly-ticker.rle ../../Patterns/Life/Guns/gun-p165mwss.rle ../../Patterns/Life/Guns/p690-PT-Cordership-gun.rle ../../Patterns/Life/Guns/pseudo-p34-gun.rle ../../Patterns/Life/Guns/vacuum-cleaner.rle ../../Patterns/Life-Like/alt-wicks.py ../../Patterns/Life-Like/coral.rle ../../Patterns/Life-Like/Day-and-Night-gun-and-antigun.rle ../../Patterns/Life-Like/ice-nine.rle ../../Patterns/Life-Like/Morley/breeder2.rle ../../Patterns/Life-Like/Morley/enterprise-gun.rle ../../Patterns/Life-Like/Morley/growing-ship.rle ../../Patterns/Life-Like/p168-knightship.rle ../../Patterns/Life-Like/persian-rugs.lif ../../Patterns/Life-Like/replicator.rle ../../Patterns/Life-Like/spiral-growth.rle ../../Patterns/Life-Like/white-whale.rle ../../Patterns/Life/Methuselahs/acorn.lif ../../Patterns/Life/Methuselahs/ark1.rle ../../Patterns/Life/Methuselahs/ark2.rle ../../Patterns/Life/Methuselahs/blom.rle ../../Patterns/Life/Methuselahs/iwona.rle ../../Patterns/Life/Methuselahs/justyna.rle ../../Patterns/Life/Methuselahs/lidka-predecessor.rle ../../Patterns/Life/Methuselahs/natural-LWSS.rle ../../Patterns/Life/Methuselahs/rabbits.lif ../../Patterns/Life/Methuselahs/rabbits-relation-17423.rle ../../Patterns/Life/Methuselahs/rabbits-relation-17465.rle ../../Patterns/Life/Methuselahs/temp-pulsars-big-s.rle ../../Patterns/Life/Miscellaneous/blockstacker.rle ../../Patterns/Life/Miscellaneous/Calcyman-primer.zip ../../Patterns/Life/Miscellaneous/Cambrian-Explosion.rle ../../Patterns/Life/Miscellaneous/diagfuse1.rle ../../Patterns/Life/Miscellaneous/die658.rle ../../Patterns/Life/Miscellaneous/elbow-ladders.rle ../../Patterns/Life/Miscellaneous/fermat-primes.rle ../../Patterns/Life/Miscellaneous/four-primers.rle.gz ../../Patterns/Life/Miscellaneous/infinity-hotel0.rle ../../Patterns/Life/Miscellaneous/infinity-hotel1.rle ../../Patterns/Life/Miscellaneous/infinity-hotel2.rle ../../Patterns/Life/Miscellaneous/infinity-hotel3.rle ../../Patterns/Life/Miscellaneous/lightspeed.rle ../../Patterns/Life/Miscellaneous/loggrow-corder.rle ../../Patterns/Life/Miscellaneous/sawtooth6b.rle ../../Patterns/Life/Miscellaneous/tubstretch-c124b.rle ../../Patterns/Life/Miscellaneous/twinprimes.rle ../../Patterns/Life/Miscellaneous/wicks-DRH-2002.rle ../../Patterns/Life/Oscillators/billiard-table.rle ../../Patterns/Life/Oscillators/DRH-oscillators.rle ../../Patterns/Life/Oscillators/extensible-low-period.rle ../../Patterns/Life/Oscillators/glider-stream-crystal.rle ../../Patterns/Life/Oscillators/low-period.rle ../../Patterns/Life/Oscillators/p103079214841.rle ../../Patterns/Life/Oscillators/p138.rle ../../Patterns/Life/Oscillators/p59-glider-loop.py ../../Patterns/Life/Oscillators/queen-bee-turn.rle ../../Patterns/Life/Oscillators/traffic-light-hasslers.rle ../../Patterns/Life/Oscillators/unique-high-period.rle ../../Patterns/Life/Puffers/c4-diagonal-puffer.rle ../../Patterns/Life/Puffers/line-puffer-superstable.rle ../../Patterns/Life/Puffers/line-puffer-unstable.rle ../../Patterns/Life/Puffers/p100-H-track-puffer.rle ../../Patterns/Life/Puffers/pi-fuse-puffer.rle ../../Patterns/Life/Puffers/puffer-2c5.rle ../../Patterns/Life/Puffers/puffer-train.rle ../../Patterns/Life/Puffers/zigzag-wickstretcher.rle ../../Patterns/Life/Rakes/2c5-engineless-rake-p185.rle ../../Patterns/Life/Rakes/2c5-spaceship-rake-p240.rle ../../Patterns/Life/Rakes/basic-rakes.rle ../../Patterns/Life/Rakes/c2-Cordership-rake.rle ../../Patterns/Life/Rakes/c3-forward-rake-p333.rle ../../Patterns/Life/Rakes/c4-sideways-rake.rle ../../Patterns/Life/Rakes/c5-adjustable-rake.rle ../../Patterns/Life/Rakes/forward-LWSS-rake-p90.rle ../../Patterns/Life/Rakes/p270-frothing-puffer-rake.rle ../../Patterns/Life/Rakes/spider-rake.rle ../../Patterns/Life/Signal-Circuitry/advancer.rle ../../Patterns/Life/Signal-Circuitry/constructor-memory-loop.rle ../../Patterns/Life/Signal-Circuitry/constructor-memory-tape.rle ../../Patterns/Life/Signal-Circuitry/heisenblinker-30.rle ../../Patterns/Life/Signal-Circuitry/heisenburp-30.rle ../../Patterns/Life/Signal-Circuitry/heisenburp-46-natural.rle ../../Patterns/Life/Signal-Circuitry/heisenburp-46.rle ../../Patterns/Life/Signal-Circuitry/Herschel-conduit-stamp-collection.rle ../../Patterns/Life/Signal-Circuitry/lightspeed-telegraph.rle ../../Patterns/Life/Signal-Circuitry/p30-racetrack.rle ../../Patterns/Life/Signal-Circuitry/p46racetrack.rle ../../Patterns/Life/Signal-Circuitry/reflectors2.rle ../../Patterns/Life/Signal-Circuitry/reflectors.rle ../../Patterns/Life/Signal-Circuitry/signal-turn.rle ../../Patterns/Life/Signal-Circuitry/stargate.rle ../../Patterns/Life/Signal-Circuitry/traffic-lights-extruder.rle ../../Patterns/Life/Signal-Circuitry/Turing-Machine-3-state.rle ../../Patterns/Life/Signal-Circuitry/Unit-Life-Cell-512x512.rle ../../Patterns/Life/Signal-Circuitry/Unit-Life-Deep-Cell.rle ../../Patterns/Life/Spaceships/2c5-orthogonal.rle ../../Patterns/Life/Spaceships/adjustable-Corder-lineship.rle ../../Patterns/Life/Spaceships/c3-orthogonal.rle ../../Patterns/Life/Spaceships/c4-diagonal.rle ../../Patterns/Life/Spaceships/c4-orthogonal.rle ../../Patterns/Life/Spaceships/Corder-lineship.rle ../../Patterns/Life/Spaceships/Cordership-boat-burner.rle ../../Patterns/Life/Spaceships/Cordership-LWSS-freeze-tag.rle ../../Patterns/Life/Spaceships/corderships.rle ../../Patterns/Life/Spaceships/diagonal.rle ../../Patterns/Life/Spaceships/orthogonal.rle ../../Patterns/Life/Spaceships/short-thin-race.rle ../../Patterns/Life/Spaceships/smallest-low-period.rle ../../Patterns/Life/Spaceships/spaceship-types.rle ../../Patterns/Life/Still-Lifes/1998-eater-stamp-collection.rle ../../Patterns/Life/Still-Lifes/eaters-misc.rle ../../Patterns/Life/Still-Lifes/eaters.rle ../../Patterns/Life/Still-Lifes/random.rle ../../Patterns/Life/Still-Lifes/ss-eaters.rle ../../Patterns/Life/Still-Lifes/stripey.rle ../../Patterns/Life/Syntheses/109-still-lifes.rle ../../Patterns/Life/Syntheses/29-still-lifes.rle ../../Patterns/Life/Syntheses/blockish-and-blockic-seeds.rle ../../Patterns/Life/Syntheses/life-integer-constructions.rle ../../Patterns/Life/Syntheses/make-harbor.rle ../../Patterns/Life/Syntheses/make-lightbulb.rle ../../Patterns/Life/Syntheses/make-osc-p3.rle ../../Patterns/Life/Syntheses/make-osc-p4.rle ../../Patterns/Life/Syntheses/make-osc-p5-plus.rle ../../Patterns/Life/Syntheses/make-p11.rle ../../Patterns/Life/Syntheses/make-p18.rle ../../Patterns/Life/Syntheses/make-p33.rle ../../Patterns/Life/Syntheses/oscillator-syntheses.rle ../../Patterns/Life/Syntheses/slow-salvo-eater-recipes.rle ../../Patterns/Life/Syntheses/two-glider-collisions.rle ../../Patterns/Loops/Byl-Loop.rle ../../Patterns/Loops/Chou-Reggia-Loop-1.rle ../../Patterns/Loops/Chou-Reggia-Loop-2.rle ../../Patterns/Loops/Evoloop-finite.rle ../../Patterns/Loops/Evoloop.rle ../../Patterns/Loops/Langtons-Loops.rle ../../Patterns/Loops/Perrier-Loop.rle ../../Patterns/Loops/Perrier-Parenthesis-Checker.rle ../../Patterns/Loops/SDSR-Loop.rle ../../Patterns/Loops/Tempesti-Loop.rle ../../Patterns/Margolus/BBM.rle ../../Patterns/Margolus/CrittersCircle.rle ../../Patterns/Margolus/CrittersOscillators.rle ../../Patterns/Margolus/DLA.rle ../../Patterns/Margolus/HPP_large.rle ../../Patterns/Margolus/HPP.rle ../../Patterns/Margolus/Sand.rle ../../Patterns/Margolus/Sand-Test.rle ../../Patterns/Margolus/TMGas_largeWithHole.rle ../../Patterns/Margolus/TMGas.rle ../../Patterns/Margolus/TripATron_BlockAligned.rle ../../Patterns/Margolus/TripATron.rle ../../Patterns/Other-Rules/Ed-rep.rle ../../Patterns/Other-Rules/golly-ants.rle ../../Patterns/Other-Rules/HPP-demo.rle ../../Patterns/Other-Rules/HPP-demo-small.rle ../../Patterns/Other-Rules/Langtons-Ant.rle ../../Patterns/Other-Rules/life-on-the-edge.rle ../../Patterns/Other-Rules/life-on-the-slope.rle ../../Patterns/Patersons-Worms/worm-1040512.rle ../../Patterns/Patersons-Worms/worm-1042015.rle ../../Patterns/Patersons-Worms/worm-1042020.rle ../../Patterns/Patersons-Worms/worm-1252121.rle ../../Patterns/Patersons-Worms/worm-1525115.rle ../../Patterns/Turmites/AlienCounter.rle ../../Patterns/Turmites/ComputerArt.rle ../../Patterns/Turmites/Extinction.rle ../../Patterns/Turmites/FibonacciSpiral.rle ../../Patterns/Turmites/Highway2074575.rle ../../Patterns/Turmites/LangtonsAnt_LLRR.rle ../../Patterns/Turmites/Perfectionist.rle ../../Patterns/Turmites/TriangularAnt_period92.rle ../../Patterns/Turmites/TriangularLangtonsAnt.rle ../../Patterns/Turmites/WormTrails.rle ../../Patterns/WireWorld/circuit.mcl ../../Patterns/WireWorld/clocks.mcl ../../Patterns/WireWorld/flip-flop.mcl ../../Patterns/WireWorld/gate-AND.mcl ../../Patterns/WireWorld/gate-NOT.mcl ../../Patterns/WireWorld/gate-OR.mcl ../../Patterns/WireWorld/gate-XOR.mcl ../../Patterns/WireWorld/Langtons-ant.zip ../../Patterns/WireWorld/memory-cell.mcl ../../Patterns/WireWorld/NickGardner.mcl ../../Patterns/WireWorld/NylesHeise.mcl ../../Patterns/WireWorld/primes.mc ../../Patterns/WireWorld/unary-multiplier.mcl ../../Rules/AbsoluteTurmite_0N21S10E00S01W11N2.rule ../../Rules/AbsoluteTurmite_0S11W11E21S21W00N0.rule ../../Rules/AbsoluteTurmite_1N10S11S30N21W01N11S20E1.rule ../../Rules/Banks-III.rule ../../Rules/Banks-II.rule ../../Rules/Banks-I.rule ../../Rules/Banks-IV.rule ../../Rules/BBM-Margolus-emulated.rule ../../Rules/BriansBrain.rule ../../Rules/Byl-Loop.rule ../../Rules/Caterpillars.rule ../../Rules/Chou-Reggia-1.rule ../../Rules/Chou-Reggia-2.rule ../../Rules/Codd2.rule ../../Rules/Codd.rule ../../Rules/CrittersMargolus_emulated.rule ../../Rules/Devore.rule ../../Rules/DLA-Margolus-emulated.rule ../../Rules/Ed-rep.rule ../../Rules/Evoloop-finite.rule ../../Rules/Evoloop.rule ../../Rules/HPPMargolus_emulated.rule ../../Rules/HPP.rule ../../Rules/LangtonsAnt_LLRR.rule ../../Rules/Langtons-Ant.rule ../../Rules/Langtons-Loops.rule ../../Rules/LifeHistory.rule ../../Rules/LifeOnTheEdge.rule ../../Rules/LifeOnTheSlope.rule ../../Rules/Life.rule ../../Rules/Perrier.rule ../../Rules/Sand-Margolus-emulated.rule ../../Rules/Sand-square4cyclic_emulated.rule ../../Rules/SDSR-Loop.rule ../../Rules/StarWars.rule ../../Rules/TableGenerators/make-ruletable.cpp ../../Rules/Tempesti.rule ../../Rules/TMGasMargolus_emulated.rule ../../Rules/TreeGenerators/LifeOnTheEdge.cpp ../../Rules/TreeGenerators/LifeOnTheSlope.cpp ../../Rules/TreeGenerators/RuleTreeGen.cpp ../../Rules/TreeGenerators/RuleTreeGen.java ../../Rules/TreeGenerators/RuleTreeGen.pl ../../Rules/TreeGenerators/RuleTreeGen.py ../../Rules/TripATronMargolus_emulated.rule ../../Rules/TriTurmite_120010.rule ../../Rules/Turmite_1202822111121111812a0281282.rule ../../Rules/Turmite_121181121020.rule ../../Rules/Turmite_180121020081.rule ../../Rules/Turmite_181181121010.rule ../../Rules/WireWorld.rule ../../Rules/Worm-1040512.rule ../../Rules/Worm-1042015.rule ../../Rules/Worm-1042020.rule ../../Rules/Worm-1252121.rule ../../Rules/Worm-1525115.rule ../../Rules/Worm-complement.rule ../../Rules/Worm-shared.rule ../../Scripts/Perl/density.pl ../../Scripts/Perl/envelope.pl ../../Scripts/Perl/giffer.pl ../../Scripts/Perl/goto.pl ../../Scripts/Perl/invert.pl ../../Scripts/Perl/make-torus.pl ../../Scripts/Perl/oscar.pl ../../Scripts/Perl/p1100-MWSS-gun.pl ../../Scripts/Perl/pop-plot.pl ../../Scripts/Perl/shift.pl ../../Scripts/Perl/tile.pl ../../Scripts/Perl/tile-with-clip.pl ../../Scripts/Python/bricklayer.py ../../Scripts/Python/density.py ../../Scripts/Python/draw-lines.py ../../Scripts/Python/envelope.py ../../Scripts/Python/flood-fill.py ../../Scripts/Python/glife/base.py ../../Scripts/Python/glife/BuiltinIcons.py ../../Scripts/Python/glife/EmulateHexagonal.py ../../Scripts/Python/glife/EmulateMargolus.py ../../Scripts/Python/glife/EmulateOneDimensional.py ../../Scripts/Python/glife/EmulateTriangular.py ../../Scripts/Python/glife/gun24.py ../../Scripts/Python/glife/gun256.py ../../Scripts/Python/glife/gun30.py ../../Scripts/Python/glife/gun46.py ../../Scripts/Python/glife/herschel.py ../../Scripts/Python/glife/__init__.py ../../Scripts/Python/glife/ReadRuleTable.py ../../Scripts/Python/glife/RuleTree.py ../../Scripts/Python/glife/text.py ../../Scripts/Python/glife/WriteBMP.py ../../Scripts/Python/glife/WriteRuleTable.py ../../Scripts/Python/goto_expression.py ../../Scripts/Python/goto.py ../../Scripts/Python/gun-demo.py ../../Scripts/Python/heisenburp.py ../../Scripts/Python/invert.py ../../Scripts/Python/life-integer-gun30.py ../../Scripts/Python/make-Banks-IV-constructor.py ../../Scripts/Python/make-Codd-constructor.py ../../Scripts/Python/make-Devore-tape.py ../../Scripts/Python/make-torus.py ../../Scripts/Python/Margolus/convert-MCell-string.py ../../Scripts/Python/Margolus/export.py ../../Scripts/Python/Margolus/import.py ../../Scripts/Python/metafier.py ../../Scripts/Python/move-object.py ../../Scripts/Python/move-selection.py ../../Scripts/Python/oscar.py ../../Scripts/Python/p1100-MWSS-gun.py ../../Scripts/Python/pd-glider.py ../../Scripts/Python/pop-plot.py ../../Scripts/Python/Rule-Generators/AbsoluteHexTurmite-gen.py ../../Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py ../../Scripts/Python/Rule-Generators/FredkinModN-gen.py ../../Scripts/Python/Rule-Generators/HexTurmite-gen.py ../../Scripts/Python/Rule-Generators/icon-exporter.py ../../Scripts/Python/Rule-Generators/icon-importer.py ../../Scripts/Python/Rule-Generators/Langtons-Ant-gen.py ../../Scripts/Python/Rule-Generators/make-ruletree.py ../../Scripts/Python/Rule-Generators/RuleTableToTree.py ../../Scripts/Python/Rule-Generators/TriTurmite-gen.py ../../Scripts/Python/Rule-Generators/Turmite-gen.py ../../Scripts/Python/shift.py ../../Scripts/Python/slide-show.py ../../Scripts/Python/tile.py ../../Scripts/Python/tile-with-clip.py EXTRA_DIST = ../../gui-wx/makefile-gtk ../../gui-wx/makefile-mac ../../gui-wx/makefile-win ../../gui-wx/CMakeLists.txt ../../gui-wx/Info.plist.in ../../gui-wx/local-win-template.mk ../../gui-wx/golly.rc ../../gui-wx/configure/autogen.sh ../../gui-wx/icons ../../gui-wx/bitmaps ../../docs ../../gui-ios/Golly/algos.h ../../gui-ios/Golly/algos.m ../../gui-ios/Golly/beep.aiff ../../gui-ios/Golly/control.h ../../gui-ios/Golly/control.m ../../gui-ios/Golly/Default-Landscape~ipad.png ../../gui-ios/Golly/Default-Portrait~ipad.png ../../gui-ios/Golly/en.lproj/InfoPlist.strings ../../gui-ios/Golly/file.h ../../gui-ios/Golly/file.m ../../gui-ios/Golly/GollyAppDelegate.h ../../gui-ios/Golly/GollyAppDelegate.m ../../gui-ios/Golly/Golly-Info.plist ../../gui-ios/Golly/Golly-Prefix.pch ../../gui-ios/Golly/help@2x.png ../../gui-ios/Golly/help.png ../../gui-ios/Golly/HelpViewController.h ../../gui-ios/Golly/HelpViewController.m ../../gui-ios/Golly/HelpViewController.xib ../../gui-ios/Golly/Icon@2x.png ../../gui-ios/Golly/Icon.png ../../gui-ios/Golly/InfoViewController.h ../../gui-ios/Golly/InfoViewController.m ../../gui-ios/Golly/InfoViewController.xib ../../gui-ios/Golly/iTunesArtwork ../../gui-ios/Golly/iTunesArtwork@2x ../../gui-ios/Golly/layer.h ../../gui-ios/Golly/layer.m ../../gui-ios/Golly/main.m ../../gui-ios/Golly/MiniZip/crypt.h ../../gui-ios/Golly/MiniZip/ioapi.c ../../gui-ios/Golly/MiniZip/ioapi.h ../../gui-ios/Golly/MiniZip/mztools.c ../../gui-ios/Golly/MiniZip/mztools.h ../../gui-ios/Golly/MiniZip/unzip.c ../../gui-ios/Golly/MiniZip/unzip.h ../../gui-ios/Golly/MiniZip/zip.c ../../gui-ios/Golly/MiniZip/zip.h ../../gui-ios/Golly/Objective-Zip/FileInZipInfo.h ../../gui-ios/Golly/Objective-Zip/FileInZipInfo.m ../../gui-ios/Golly/Objective-Zip/ZipException.h ../../gui-ios/Golly/Objective-Zip/ZipException.m ../../gui-ios/Golly/Objective-Zip/ZipFile.h ../../gui-ios/Golly/Objective-Zip/ZipFile.m ../../gui-ios/Golly/Objective-Zip/ZipReadStream.h ../../gui-ios/Golly/Objective-Zip/ZipReadStream.m ../../gui-ios/Golly/Objective-Zip/ZipWriteStream.h ../../gui-ios/Golly/Objective-Zip/ZipWriteStream.m ../../gui-ios/Golly/open@2x.png ../../gui-ios/Golly/open.png ../../gui-ios/Golly/OpenViewController.h ../../gui-ios/Golly/OpenViewController.m ../../gui-ios/Golly/OpenViewController.xib ../../gui-ios/Golly/pattern@2x.png ../../gui-ios/Golly/pattern.png ../../gui-ios/Golly/PatternViewController.h ../../gui-ios/Golly/PatternViewController.m ../../gui-ios/Golly/PatternViewController.xib ../../gui-ios/Golly/PatternView.h ../../gui-ios/Golly/PatternView.m ../../gui-ios/Golly/prefs.h ../../gui-ios/Golly/prefs.m ../../gui-ios/Golly/render.h ../../gui-ios/Golly/render.m ../../gui-ios/Golly/RuleViewController.h ../../gui-ios/Golly/RuleViewController.m ../../gui-ios/Golly/RuleViewController.xib ../../gui-ios/Golly/SaveViewController.h ../../gui-ios/Golly/SaveViewController.m ../../gui-ios/Golly/SaveViewController.xib ../../gui-ios/Golly/select.h ../../gui-ios/Golly/select.m ../../gui-ios/Golly/settings@2x.png ../../gui-ios/Golly/settings.png ../../gui-ios/Golly/SettingsViewController.h ../../gui-ios/Golly/SettingsViewController.m ../../gui-ios/Golly/SettingsViewController.xib ../../gui-ios/Golly/StatePickerController.h ../../gui-ios/Golly/StatePickerController.m ../../gui-ios/Golly/StatePickerController.xib ../../gui-ios/Golly/StatePickerView.h ../../gui-ios/Golly/StatePickerView.m ../../gui-ios/Golly/StateView.h ../../gui-ios/Golly/StateView.m ../../gui-ios/Golly/status.h ../../gui-ios/Golly/status.m ../../gui-ios/Golly/StatusView.h ../../gui-ios/Golly/StatusView.m ../../gui-ios/Golly/triangle-down.png ../../gui-ios/Golly/triangle-right.png ../../gui-ios/Golly/undo.h ../../gui-ios/Golly/undo.m ../../gui-ios/Golly/utils.h ../../gui-ios/Golly/utils.m ../../gui-ios/Golly/view.h ../../gui-ios/Golly/view.m ../../gui-ios/Golly.xcodeproj/project.pbxproj ../../gui-ios/Golly.xcodeproj/project.xcworkspace/contents.xcworkspacedata ../../gui-ios/Help/about.gif ../../gui-ios/Help/about.html ../../gui-ios/Help/Algorithms/Generations.html ../../gui-ios/Help/Algorithms/HashLife.html ../../gui-ios/Help/Algorithms/JvN.html ../../gui-ios/Help/Algorithms/QuickLife.html ../../gui-ios/Help/Algorithms/RuleLoader.html ../../gui-ios/Help/algos.html ../../gui-ios/Help/archives.html ../../gui-ios/Help/bounded.html ../../gui-ios/Help/changes.html ../../gui-ios/Help/credits.html ../../gui-ios/Help/formats.html ../../gui-ios/Help/help.html ../../gui-ios/Help/index.html ../../gui-ios/Help/intro.html ../../gui-ios/Help/Lexicon/fix-lex-files.py ../../gui-ios/Help/Lexicon/lex_1.htm ../../gui-ios/Help/Lexicon/lex_a.htm ../../gui-ios/Help/Lexicon/lex_b.htm ../../gui-ios/Help/Lexicon/lex_bib.htm ../../gui-ios/Help/Lexicon/lex_c.htm ../../gui-ios/Help/Lexicon/lex_d.htm ../../gui-ios/Help/Lexicon/lex_e.htm ../../gui-ios/Help/Lexicon/lex_f.htm ../../gui-ios/Help/Lexicon/lex_g.htm ../../gui-ios/Help/Lexicon/lex_h.htm ../../gui-ios/Help/Lexicon/lex.htm ../../gui-ios/Help/Lexicon/lex_i.htm ../../gui-ios/Help/Lexicon/lex_j.htm ../../gui-ios/Help/Lexicon/lex_k.htm ../../gui-ios/Help/Lexicon/lex_l.htm ../../gui-ios/Help/Lexicon/lex_m.htm ../../gui-ios/Help/Lexicon/lex_n.htm ../../gui-ios/Help/Lexicon/lex_o.htm ../../gui-ios/Help/Lexicon/lex_p.htm ../../gui-ios/Help/Lexicon/lex_q.htm ../../gui-ios/Help/Lexicon/lex_r.htm ../../gui-ios/Help/Lexicon/lex_s.htm ../../gui-ios/Help/Lexicon/lex_t.htm ../../gui-ios/Help/Lexicon/lex_u.htm ../../gui-ios/Help/Lexicon/lex_v.htm ../../gui-ios/Help/Lexicon/lex_w.htm ../../gui-ios/Help/Lexicon/lex_x.htm ../../gui-ios/Help/Lexicon/lex_y.htm ../../gui-ios/Help/Lexicon/lex_z.htm ../../gui-ios/Help/open.html ../../gui-ios/Help/pattern.html ../../gui-ios/Help/problems.html ../../gui-ios/Help/refs.html ../../gui-ios/Help/settings.html ../../gui-ios/Help/tips.html ../../docs golly-2.5-src/gui-wx/configure/Makefile.in0000644000175100001440000044621412156145627015503 00000000000000# Makefile.in generated by automake 1.13.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 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@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd 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@ target_triplet = @target@ bin_PROGRAMS = golly$(EXEEXT) bgolly$(EXEEXT) noinst_PROGRAMS = RuleTableToTree$(EXEEXT) DIST_COMMON = $(srcdir)/sources.am $(srcdir)/Makefile.in \ $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) depcomp $(nobase_dist_gollydata_DATA) \ ar-lib config.guess config.sub install-sh missing @WINDOWS_TRUE@am__append_1 = gollyres.o subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/shlib.m4 \ $(top_srcdir)/m4/wximage.m4 $(top_srcdir)/m4/wxwin.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LIBRARIES = $(noinst_LIBRARIES) ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libgolly_a_AR = $(AR) $(ARFLAGS) libgolly_a_LIBADD = am_libgolly_a_OBJECTS = bigint.$(OBJEXT) generationsalgo.$(OBJEXT) \ ghashbase.$(OBJEXT) ghashdraw.$(OBJEXT) hlifealgo.$(OBJEXT) \ hlifedraw.$(OBJEXT) jvnalgo.$(OBJEXT) lifealgo.$(OBJEXT) \ lifepoll.$(OBJEXT) liferender.$(OBJEXT) liferules.$(OBJEXT) \ qlifealgo.$(OBJEXT) qlifedraw.$(OBJEXT) readpattern.$(OBJEXT) \ ruleloaderalgo.$(OBJEXT) ruletable_algo.$(OBJEXT) \ ruletreealgo.$(OBJEXT) util.$(OBJEXT) viewport.$(OBJEXT) \ writepattern.$(OBJEXT) libgolly_a_OBJECTS = $(am_libgolly_a_OBJECTS) am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(docdir)" \ "$(DESTDIR)$(gollydatadir)" PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) am_RuleTableToTree_OBJECTS = RuleTableToTree.$(OBJEXT) RuleTableToTree_OBJECTS = $(am_RuleTableToTree_OBJECTS) RuleTableToTree_DEPENDENCIES = libgolly.a am_bgolly_OBJECTS = bgolly.$(OBJEXT) bgolly_OBJECTS = $(am_bgolly_OBJECTS) bgolly_DEPENDENCIES = libgolly.a am_golly_OBJECTS = golly-wxalgos.$(OBJEXT) golly-wxcontrol.$(OBJEXT) \ golly-wxedit.$(OBJEXT) golly-wxfile.$(OBJEXT) \ golly-wxgolly.$(OBJEXT) golly-wxhelp.$(OBJEXT) \ golly-wxinfo.$(OBJEXT) golly-wxlayer.$(OBJEXT) \ golly-wxmain.$(OBJEXT) golly-wxperl.$(OBJEXT) \ golly-wxprefs.$(OBJEXT) golly-wxpython.$(OBJEXT) \ golly-wxrender.$(OBJEXT) golly-wxrule.$(OBJEXT) \ golly-wxscript.$(OBJEXT) golly-wxselect.$(OBJEXT) \ golly-wxstatus.$(OBJEXT) golly-wxtimeline.$(OBJEXT) \ golly-wxundo.$(OBJEXT) golly-wxutils.$(OBJEXT) \ golly-wxview.$(OBJEXT) golly_OBJECTS = $(am_golly_OBJECTS) am__DEPENDENCIES_1 = golly_DEPENDENCIES = $(am__DEPENDENCIES_1) libgolly.a $(am__append_1) golly_LINK = $(CXXLD) $(golly_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libgolly_a_SOURCES) $(RuleTableToTree_SOURCES) \ $(bgolly_SOURCES) $(golly_SOURCES) DIST_SOURCES = $(libgolly_a_SOURCES) $(RuleTableToTree_SOURCES) \ $(bgolly_SOURCES) $(golly_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac 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 = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } DATA = $(doc_DATA) $(nobase_dist_gollydata_DATA) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope AM_RECURSIVE_TARGETS = cscope DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BINDISTSUFFIX = @BINDISTSUFFIX@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GOLLYDIR = @GOLLYDIR@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL = @PERL@ PERL_INCLUDE = @PERL_INCLUDE@ PYTHON = @PYTHON@ PYTHON_INCLUDE = @PYTHON_INCLUDE@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SRCDISTSUFFIX = @SRCDISTSUFFIX@ STRIP = @STRIP@ VERSION = @VERSION@ WX_CFLAGS = @WX_CFLAGS@ WX_CFLAGS_ONLY = @WX_CFLAGS_ONLY@ WX_CONFIG_PATH = @WX_CONFIG_PATH@ WX_CPPFLAGS = @WX_CPPFLAGS@ WX_CXXFLAGS = @WX_CXXFLAGS@ WX_CXXFLAGS_ONLY = @WX_CXXFLAGS_ONLY@ WX_DEBUG = @WX_DEBUG@ WX_LIBS = @WX_LIBS@ WX_LIBS_STATIC = @WX_LIBS_STATIC@ WX_PORT = @WX_PORT@ WX_RESCOMP = @WX_RESCOMP@ WX_SHARED = @WX_SHARED@ WX_UNICODE = @WX_UNICODE@ WX_VERSION = @WX_VERSION@ WX_VERSION_MAJOR = @WX_VERSION_MAJOR@ WX_VERSION_MICRO = @WX_VERSION_MICRO@ WX_VERSION_MINOR = @WX_VERSION_MINOR@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ACLOCAL_AMFLAGS = -I m4 AM_CPPFLAGS = -I$(top_srcdir)/../../gollybase/ AM_CXXFLAGS = -DGOLLYDIR="$(GOLLYDIR)" -Wall -fno-strict-aliasing AM_LDFLAGS = -Wl,--as-needed noinst_LIBRARIES = libgolly.a doc_DATA = ../../docs/License.html ../../docs/ReadMe.html libgolly_a_SOURCES = ../../gollybase/bigint.h \ ../../gollybase/generationsalgo.h ../../gollybase/ghashbase.h \ ../../gollybase/hlifealgo.h ../../gollybase/jvnalgo.h \ ../../gollybase/lifealgo.h ../../gollybase/lifepoll.h \ ../../gollybase/liferender.h ../../gollybase/liferules.h \ ../../gollybase/platform.h ../../gollybase/qlifealgo.h \ ../../gollybase/readpattern.h ../../gollybase/ruleloaderalgo.h \ ../../gollybase/ruletable_algo.h \ ../../gollybase/ruletreealgo.h ../../gollybase/util.h \ ../../gollybase/viewport.h ../../gollybase/writepattern.h \ ../../gollybase/bigint.cpp ../../gollybase/generationsalgo.cpp \ ../../gollybase/ghashbase.cpp ../../gollybase/ghashdraw.cpp \ ../../gollybase/hlifealgo.cpp ../../gollybase/hlifedraw.cpp \ ../../gollybase/jvnalgo.cpp ../../gollybase/lifealgo.cpp \ ../../gollybase/lifepoll.cpp ../../gollybase/liferender.cpp \ ../../gollybase/liferules.cpp ../../gollybase/qlifealgo.cpp \ ../../gollybase/qlifedraw.cpp ../../gollybase/readpattern.cpp \ ../../gollybase/ruleloaderalgo.cpp \ ../../gollybase/ruletable_algo.cpp \ ../../gollybase/ruletreealgo.cpp ../../gollybase/util.cpp \ ../../gollybase/viewport.cpp ../../gollybase/writepattern.cpp golly_SOURCES = ../../gui-wx/wxalgos.h ../../gui-wx/wxedit.h ../../gui-wx/wxgolly.h ../../gui-wx/wxhelp.h ../../gui-wx/wxinfo.h ../../gui-wx/wxlayer.h ../../gui-wx/wxmain.h ../../gui-wx/wxperl.h ../../gui-wx/wxprefs.h ../../gui-wx/wxpython.h ../../gui-wx/wxrender.h ../../gui-wx/wxrule.h ../../gui-wx/wxscript.h ../../gui-wx/wxselect.h ../../gui-wx/wxstatus.h ../../gui-wx/wxtimeline.h ../../gui-wx/wxundo.h ../../gui-wx/wxutils.h ../../gui-wx/wxview.h ../../gui-wx/wxalgos.cpp ../../gui-wx/wxcontrol.cpp ../../gui-wx/wxedit.cpp ../../gui-wx/wxfile.cpp ../../gui-wx/wxgolly.cpp ../../gui-wx/wxhelp.cpp ../../gui-wx/wxinfo.cpp ../../gui-wx/wxlayer.cpp ../../gui-wx/wxmain.cpp ../../gui-wx/wxperl.cpp ../../gui-wx/wxprefs.cpp ../../gui-wx/wxpython.cpp ../../gui-wx/wxrender.cpp ../../gui-wx/wxrule.cpp ../../gui-wx/wxscript.cpp ../../gui-wx/wxselect.cpp ../../gui-wx/wxstatus.cpp ../../gui-wx/wxtimeline.cpp ../../gui-wx/wxundo.cpp ../../gui-wx/wxutils.cpp ../../gui-wx/wxview.cpp gollydatadir = $(pkgdatadir)/Patterns/Life/ nobase_dist_gollydata_DATA = ../../Help/about.gif \ ../../Help/about.html ../../Help/Algorithms/Generations.html \ ../../Help/Algorithms/HashLife.html \ ../../Help/Algorithms/JvN.html \ ../../Help/Algorithms/QuickLife.html \ ../../Help/Algorithms/RuleLoader.html ../../Help/algos.html \ ../../Help/archives.html ../../Help/bounded.html \ ../../Help/changes.html ../../Help/control.html \ ../../Help/credits.html ../../Help/edit.html \ ../../Help/file.html ../../Help/formats.html \ ../../Help/help.html ../../Help/index.html \ ../../Help/intro.html ../../Help/layer.html \ ../../Help/Lexicon/lex_1.htm ../../Help/Lexicon/lex_a.htm \ ../../Help/Lexicon/lex_b.htm ../../Help/Lexicon/lex_bib.htm \ ../../Help/Lexicon/lex_c.htm ../../Help/Lexicon/lex_d.htm \ ../../Help/Lexicon/lex_e.htm ../../Help/Lexicon/lex_f.htm \ ../../Help/Lexicon/lex_g.htm ../../Help/Lexicon/lex_h.htm \ ../../Help/Lexicon/lex.htm ../../Help/Lexicon/lex_i.htm \ ../../Help/Lexicon/lex_j.htm ../../Help/Lexicon/lex_k.htm \ ../../Help/Lexicon/lex_l.htm ../../Help/Lexicon/lex_m.htm \ ../../Help/Lexicon/lex_n.htm ../../Help/Lexicon/lex_o.htm \ ../../Help/Lexicon/lex_p.htm ../../Help/Lexicon/lex_q.htm \ ../../Help/Lexicon/lex_r.htm ../../Help/Lexicon/lex_s.htm \ ../../Help/Lexicon/lex_t.htm ../../Help/Lexicon/lex_u.htm \ ../../Help/Lexicon/lex_v.htm ../../Help/Lexicon/lex_w.htm \ ../../Help/Lexicon/lex_x.htm ../../Help/Lexicon/lex_y.htm \ ../../Help/Lexicon/lex_z.htm ../../Help/Lexicon/modify.pl \ ../../Help/mouse.html ../../Help/perl.html \ ../../Help/problems.html ../../Help/python.html \ ../../Help/refs.html ../../Help/tips.html ../../Help/view.html \ ../../Patterns/Banks/Banks-I-demo.rle \ ../../Patterns/Banks/Banks-II-demo.rle \ ../../Patterns/Banks/Banks-III-demo.rle \ ../../Patterns/Banks/Banks-IV-constructor.rle.gz \ ../../Patterns/Banks/Banks-IV-demo.rle \ ../../Patterns/Codd/clocking-on-demo.rle \ ../../Patterns/Codd/coders-demo.rle \ ../../Patterns/Codd/construction-arm-demo.rle \ ../../Patterns/Codd/crossover-unidir-demo.rle \ ../../Patterns/Codd/decoder-4bit-demo.rle.gz \ ../../Patterns/Codd/echo-discriminator.rle \ ../../Patterns/Codd/echo-switch-demo.rle \ ../../Patterns/Codd/extend-coder-demo.rle \ ../../Patterns/Codd/gates-demo.rle \ ../../Patterns/Codd/golly-constructor.rle.gz \ ../../Patterns/Codd/Goucher-replicator.mc.gz \ ../../Patterns/Codd/repeater-emitter-demo.rle \ ../../Patterns/Codd/sensing-demo.rle \ ../../Patterns/Codd/sheathing-demo.rle \ ../../Patterns/Codd/sheathing-problems.rle \ ../../Patterns/Codd/signals-demo.rle \ ../../Patterns/Codd/tape-reader-demo.rle \ ../../Patterns/Devore/crossover.rle \ ../../Patterns/Devore/Devore-body.rle \ ../../Patterns/Devore/Devore-rep.rle \ ../../Patterns/Devore/discriminator.rle \ ../../Patterns/Generations/Banner.mcl \ ../../Patterns/Generations/Bloomerang.mcl \ ../../Patterns/Generations/Burst.mcl \ ../../Patterns/Generations/Caterpillars.mcl \ ../../Patterns/Generations/Delta.rle \ ../../Patterns/Generations/Ebb-and-Flow.mcl \ ../../Patterns/Generations/Fireworks.mcl \ ../../Patterns/Generations/Lava.mcl \ ../../Patterns/Generations/Lines.mcl \ ../../Patterns/Generations/MeteorGuns.mcl \ ../../Patterns/Generations/Nova.mcl \ ../../Patterns/Generations/Perfect-spiral.mcl \ ../../Patterns/Generations/Sawfish.rle \ ../../Patterns/Generations/SediMental.mcl \ ../../Patterns/Generations/Steeplechase.mcl \ ../../Patterns/Generations/Transers.mcl \ ../../Patterns/Generations/What-a-mess.mcl \ ../../Patterns/HashLife/broken-lines.mc \ ../../Patterns/HashLife/catacryst.mc \ ../../Patterns/HashLife/gotts-dots.mc \ ../../Patterns/HashLife/hashlife-oddity1.mc \ ../../Patterns/HashLife/hashlife-oddity2.mc \ ../../Patterns/HashLife/hexadecimal.mc.gz \ ../../Patterns/HashLife/jagged2.mc \ ../../Patterns/HashLife/jagged.mc \ ../../Patterns/HashLife/logarithmic-width.mc \ ../../Patterns/HashLife/metacatacryst.mc \ ../../Patterns/HashLife/metapixel-galaxy.mc.gz \ ../../Patterns/HashLife/metapixel-p216-gun.mc.gz \ ../../Patterns/HashLife/metapixel-parity64.mc.gz \ ../../Patterns/HashLife/mosquito5.mc \ ../../Patterns/HashLife/nick-gotts-1.mc \ ../../Patterns/HashLife/nick-gotts-2.mc \ ../../Patterns/HashLife/puzzle.mc \ ../../Patterns/HashLife/ruler.mc \ ../../Patterns/HashLife/totalperiodic.mc \ ../../Patterns/HashLife/unlimited-novelty.mc \ ../../Patterns/HashLife/wedge-grow.mc \ ../../Patterns/HashLife/wolfram22.mc \ ../../Patterns/JvN/Boustrophedon-replicator.rle \ ../../Patterns/JvN/cell-coders-demo.rle \ ../../Patterns/JvN/codon4-auto-retract.rle \ ../../Patterns/JvN/codon5-auto-retract.rle \ ../../Patterns/JvN/construction-arm-demo.rle \ ../../Patterns/JvN/counter-demo.rle \ ../../Patterns/JvN/golly-constructor.rle \ ../../Patterns/JvN/Hutton-replicator.rle \ ../../Patterns/JvN/JvN-loop-replicator.rle.gz \ ../../Patterns/JvN/N-compressed-replicator.rle \ ../../Patterns/JvN/NP-mutation.rle.gz \ ../../Patterns/JvN/NP-replicator.rle.gz \ ../../Patterns/JvN/partial-constructor.mc.gz \ ../../Patterns/JvN/read-arm-demo.rle \ ../../Patterns/JvN/sphinx.mc.gz \ ../../Patterns/JvN/sphinx-midpoint.mc.gz \ ../../Patterns/JvN/sphinx-spark.mc.gz \ ../../Patterns/Life/Bounded-Grids/agar-p3.rle \ ../../Patterns/Life/Bounded-Grids/cross-surface.rle \ ../../Patterns/Life/Bounded-Grids/herringbone-agar-p14.rle \ ../../Patterns/Life/Bounded-Grids/Klein-bottle.rle \ ../../Patterns/Life/Bounded-Grids/lightspeed-bubble.rle \ ../../Patterns/Life/Bounded-Grids/pulsars-in-tube.rle \ ../../Patterns/Life/Bounded-Grids/sphere.rle \ ../../Patterns/Life/Bounded-Grids/torus.rle \ ../../Patterns/Life/Bounded-Grids/torus-with-shift.rle \ ../../Patterns/Life/Breeders/breeder.lif \ ../../Patterns/Life/Breeders/c4-diag-switch-engines.rle \ ../../Patterns/Life/Breeders/LWSS-breeder.rle \ ../../Patterns/Life/Breeders/p100-H-channel-breeder.rle \ ../../Patterns/Life/Breeders/p90-rake-factory.rle \ ../../Patterns/Life/Breeders/pi-blink-breeder1.rle \ ../../Patterns/Life/Breeders/pi-blink-breeder2.rle \ ../../Patterns/Life/Breeders/rake-breeder.rle \ ../../Patterns/Life/Breeders/slide-breeder.rle \ ../../Patterns/Life/Breeders/spacefiller.rle \ ../../Patterns/Life/Breeders/switch-engine-breeder-MR.rle \ ../../Patterns/Life/Breeders/switch-engine-breeder.rle \ ../../Patterns/Life/Guns/2c5-spaceship-gun-p416.rle \ ../../Patterns/Life/Guns/2c5-spaceship-gun-p690.rle \ ../../Patterns/Life/Guns/7-in-a-row-Cordership-V-gun.rle \ ../../Patterns/Life/Guns/Cordership-gun-p784.rle \ ../../Patterns/Life/Guns/golly-ticker.rle \ ../../Patterns/Life/Guns/gun-p165mwss.rle \ ../../Patterns/Life/Guns/p690-PT-Cordership-gun.rle \ ../../Patterns/Life/Guns/pseudo-p34-gun.rle \ ../../Patterns/Life/Guns/vacuum-cleaner.rle \ ../../Patterns/Life-Like/alt-wicks.py \ ../../Patterns/Life-Like/coral.rle \ ../../Patterns/Life-Like/Day-and-Night-gun-and-antigun.rle \ ../../Patterns/Life-Like/ice-nine.rle \ ../../Patterns/Life-Like/Morley/breeder2.rle \ ../../Patterns/Life-Like/Morley/enterprise-gun.rle \ ../../Patterns/Life-Like/Morley/growing-ship.rle \ ../../Patterns/Life-Like/p168-knightship.rle \ ../../Patterns/Life-Like/persian-rugs.lif \ ../../Patterns/Life-Like/replicator.rle \ ../../Patterns/Life-Like/spiral-growth.rle \ ../../Patterns/Life-Like/white-whale.rle \ ../../Patterns/Life/Methuselahs/acorn.lif \ ../../Patterns/Life/Methuselahs/ark1.rle \ ../../Patterns/Life/Methuselahs/ark2.rle \ ../../Patterns/Life/Methuselahs/blom.rle \ ../../Patterns/Life/Methuselahs/iwona.rle \ ../../Patterns/Life/Methuselahs/justyna.rle \ ../../Patterns/Life/Methuselahs/lidka-predecessor.rle \ ../../Patterns/Life/Methuselahs/natural-LWSS.rle \ ../../Patterns/Life/Methuselahs/rabbits.lif \ ../../Patterns/Life/Methuselahs/rabbits-relation-17423.rle \ ../../Patterns/Life/Methuselahs/rabbits-relation-17465.rle \ ../../Patterns/Life/Methuselahs/temp-pulsars-big-s.rle \ ../../Patterns/Life/Miscellaneous/blockstacker.rle \ ../../Patterns/Life/Miscellaneous/Calcyman-primer.zip \ ../../Patterns/Life/Miscellaneous/Cambrian-Explosion.rle \ ../../Patterns/Life/Miscellaneous/diagfuse1.rle \ ../../Patterns/Life/Miscellaneous/die658.rle \ ../../Patterns/Life/Miscellaneous/elbow-ladders.rle \ ../../Patterns/Life/Miscellaneous/fermat-primes.rle \ ../../Patterns/Life/Miscellaneous/four-primers.rle.gz \ ../../Patterns/Life/Miscellaneous/infinity-hotel0.rle \ ../../Patterns/Life/Miscellaneous/infinity-hotel1.rle \ ../../Patterns/Life/Miscellaneous/infinity-hotel2.rle \ ../../Patterns/Life/Miscellaneous/infinity-hotel3.rle \ ../../Patterns/Life/Miscellaneous/lightspeed.rle \ ../../Patterns/Life/Miscellaneous/loggrow-corder.rle \ ../../Patterns/Life/Miscellaneous/sawtooth6b.rle \ ../../Patterns/Life/Miscellaneous/tubstretch-c124b.rle \ ../../Patterns/Life/Miscellaneous/twinprimes.rle \ ../../Patterns/Life/Miscellaneous/wicks-DRH-2002.rle \ ../../Patterns/Life/Oscillators/billiard-table.rle \ ../../Patterns/Life/Oscillators/DRH-oscillators.rle \ ../../Patterns/Life/Oscillators/extensible-low-period.rle \ ../../Patterns/Life/Oscillators/glider-stream-crystal.rle \ ../../Patterns/Life/Oscillators/low-period.rle \ ../../Patterns/Life/Oscillators/p103079214841.rle \ ../../Patterns/Life/Oscillators/p138.rle \ ../../Patterns/Life/Oscillators/p59-glider-loop.py \ ../../Patterns/Life/Oscillators/queen-bee-turn.rle \ ../../Patterns/Life/Oscillators/traffic-light-hasslers.rle \ ../../Patterns/Life/Oscillators/unique-high-period.rle \ ../../Patterns/Life/Puffers/c4-diagonal-puffer.rle \ ../../Patterns/Life/Puffers/line-puffer-superstable.rle \ ../../Patterns/Life/Puffers/line-puffer-unstable.rle \ ../../Patterns/Life/Puffers/p100-H-track-puffer.rle \ ../../Patterns/Life/Puffers/pi-fuse-puffer.rle \ ../../Patterns/Life/Puffers/puffer-2c5.rle \ ../../Patterns/Life/Puffers/puffer-train.rle \ ../../Patterns/Life/Puffers/zigzag-wickstretcher.rle \ ../../Patterns/Life/Rakes/2c5-engineless-rake-p185.rle \ ../../Patterns/Life/Rakes/2c5-spaceship-rake-p240.rle \ ../../Patterns/Life/Rakes/basic-rakes.rle \ ../../Patterns/Life/Rakes/c2-Cordership-rake.rle \ ../../Patterns/Life/Rakes/c3-forward-rake-p333.rle \ ../../Patterns/Life/Rakes/c4-sideways-rake.rle \ ../../Patterns/Life/Rakes/c5-adjustable-rake.rle \ ../../Patterns/Life/Rakes/forward-LWSS-rake-p90.rle \ ../../Patterns/Life/Rakes/p270-frothing-puffer-rake.rle \ ../../Patterns/Life/Rakes/spider-rake.rle \ ../../Patterns/Life/Signal-Circuitry/advancer.rle \ ../../Patterns/Life/Signal-Circuitry/constructor-memory-loop.rle \ ../../Patterns/Life/Signal-Circuitry/constructor-memory-tape.rle \ ../../Patterns/Life/Signal-Circuitry/heisenblinker-30.rle \ ../../Patterns/Life/Signal-Circuitry/heisenburp-30.rle \ ../../Patterns/Life/Signal-Circuitry/heisenburp-46-natural.rle \ ../../Patterns/Life/Signal-Circuitry/heisenburp-46.rle \ ../../Patterns/Life/Signal-Circuitry/Herschel-conduit-stamp-collection.rle \ ../../Patterns/Life/Signal-Circuitry/lightspeed-telegraph.rle \ ../../Patterns/Life/Signal-Circuitry/p30-racetrack.rle \ ../../Patterns/Life/Signal-Circuitry/p46racetrack.rle \ ../../Patterns/Life/Signal-Circuitry/reflectors2.rle \ ../../Patterns/Life/Signal-Circuitry/reflectors.rle \ ../../Patterns/Life/Signal-Circuitry/signal-turn.rle \ ../../Patterns/Life/Signal-Circuitry/stargate.rle \ ../../Patterns/Life/Signal-Circuitry/traffic-lights-extruder.rle \ ../../Patterns/Life/Signal-Circuitry/Turing-Machine-3-state.rle \ ../../Patterns/Life/Signal-Circuitry/Unit-Life-Cell-512x512.rle \ ../../Patterns/Life/Signal-Circuitry/Unit-Life-Deep-Cell.rle \ ../../Patterns/Life/Spaceships/2c5-orthogonal.rle \ ../../Patterns/Life/Spaceships/adjustable-Corder-lineship.rle \ ../../Patterns/Life/Spaceships/c3-orthogonal.rle \ ../../Patterns/Life/Spaceships/c4-diagonal.rle \ ../../Patterns/Life/Spaceships/c4-orthogonal.rle \ ../../Patterns/Life/Spaceships/Corder-lineship.rle \ ../../Patterns/Life/Spaceships/Cordership-boat-burner.rle \ ../../Patterns/Life/Spaceships/Cordership-LWSS-freeze-tag.rle \ ../../Patterns/Life/Spaceships/corderships.rle \ ../../Patterns/Life/Spaceships/diagonal.rle \ ../../Patterns/Life/Spaceships/orthogonal.rle \ ../../Patterns/Life/Spaceships/short-thin-race.rle \ ../../Patterns/Life/Spaceships/smallest-low-period.rle \ ../../Patterns/Life/Spaceships/spaceship-types.rle \ ../../Patterns/Life/Still-Lifes/1998-eater-stamp-collection.rle \ ../../Patterns/Life/Still-Lifes/eaters-misc.rle \ ../../Patterns/Life/Still-Lifes/eaters.rle \ ../../Patterns/Life/Still-Lifes/random.rle \ ../../Patterns/Life/Still-Lifes/ss-eaters.rle \ ../../Patterns/Life/Still-Lifes/stripey.rle \ ../../Patterns/Life/Syntheses/109-still-lifes.rle \ ../../Patterns/Life/Syntheses/29-still-lifes.rle \ ../../Patterns/Life/Syntheses/blockish-and-blockic-seeds.rle \ ../../Patterns/Life/Syntheses/life-integer-constructions.rle \ ../../Patterns/Life/Syntheses/make-harbor.rle \ ../../Patterns/Life/Syntheses/make-lightbulb.rle \ ../../Patterns/Life/Syntheses/make-osc-p3.rle \ ../../Patterns/Life/Syntheses/make-osc-p4.rle \ ../../Patterns/Life/Syntheses/make-osc-p5-plus.rle \ ../../Patterns/Life/Syntheses/make-p11.rle \ ../../Patterns/Life/Syntheses/make-p18.rle \ ../../Patterns/Life/Syntheses/make-p33.rle \ ../../Patterns/Life/Syntheses/oscillator-syntheses.rle \ ../../Patterns/Life/Syntheses/slow-salvo-eater-recipes.rle \ ../../Patterns/Life/Syntheses/two-glider-collisions.rle \ ../../Patterns/Loops/Byl-Loop.rle \ ../../Patterns/Loops/Chou-Reggia-Loop-1.rle \ ../../Patterns/Loops/Chou-Reggia-Loop-2.rle \ ../../Patterns/Loops/Evoloop-finite.rle \ ../../Patterns/Loops/Evoloop.rle \ ../../Patterns/Loops/Langtons-Loops.rle \ ../../Patterns/Loops/Perrier-Loop.rle \ ../../Patterns/Loops/Perrier-Parenthesis-Checker.rle \ ../../Patterns/Loops/SDSR-Loop.rle \ ../../Patterns/Loops/Tempesti-Loop.rle \ ../../Patterns/Margolus/BBM.rle \ ../../Patterns/Margolus/CrittersCircle.rle \ ../../Patterns/Margolus/CrittersOscillators.rle \ ../../Patterns/Margolus/DLA.rle \ ../../Patterns/Margolus/HPP_large.rle \ ../../Patterns/Margolus/HPP.rle \ ../../Patterns/Margolus/Sand.rle \ ../../Patterns/Margolus/Sand-Test.rle \ ../../Patterns/Margolus/TMGas_largeWithHole.rle \ ../../Patterns/Margolus/TMGas.rle \ ../../Patterns/Margolus/TripATron_BlockAligned.rle \ ../../Patterns/Margolus/TripATron.rle \ ../../Patterns/Other-Rules/Ed-rep.rle \ ../../Patterns/Other-Rules/golly-ants.rle \ ../../Patterns/Other-Rules/HPP-demo.rle \ ../../Patterns/Other-Rules/HPP-demo-small.rle \ ../../Patterns/Other-Rules/Langtons-Ant.rle \ ../../Patterns/Other-Rules/life-on-the-edge.rle \ ../../Patterns/Other-Rules/life-on-the-slope.rle \ ../../Patterns/Patersons-Worms/worm-1040512.rle \ ../../Patterns/Patersons-Worms/worm-1042015.rle \ ../../Patterns/Patersons-Worms/worm-1042020.rle \ ../../Patterns/Patersons-Worms/worm-1252121.rle \ ../../Patterns/Patersons-Worms/worm-1525115.rle \ ../../Patterns/Turmites/AlienCounter.rle \ ../../Patterns/Turmites/ComputerArt.rle \ ../../Patterns/Turmites/Extinction.rle \ ../../Patterns/Turmites/FibonacciSpiral.rle \ ../../Patterns/Turmites/Highway2074575.rle \ ../../Patterns/Turmites/LangtonsAnt_LLRR.rle \ ../../Patterns/Turmites/Perfectionist.rle \ ../../Patterns/Turmites/TriangularAnt_period92.rle \ ../../Patterns/Turmites/TriangularLangtonsAnt.rle \ ../../Patterns/Turmites/WormTrails.rle \ ../../Patterns/WireWorld/circuit.mcl \ ../../Patterns/WireWorld/clocks.mcl \ ../../Patterns/WireWorld/flip-flop.mcl \ ../../Patterns/WireWorld/gate-AND.mcl \ ../../Patterns/WireWorld/gate-NOT.mcl \ ../../Patterns/WireWorld/gate-OR.mcl \ ../../Patterns/WireWorld/gate-XOR.mcl \ ../../Patterns/WireWorld/Langtons-ant.zip \ ../../Patterns/WireWorld/memory-cell.mcl \ ../../Patterns/WireWorld/NickGardner.mcl \ ../../Patterns/WireWorld/NylesHeise.mcl \ ../../Patterns/WireWorld/primes.mc \ ../../Patterns/WireWorld/unary-multiplier.mcl \ ../../Rules/AbsoluteTurmite_0N21S10E00S01W11N2.rule \ ../../Rules/AbsoluteTurmite_0S11W11E21S21W00N0.rule \ ../../Rules/AbsoluteTurmite_1N10S11S30N21W01N11S20E1.rule \ ../../Rules/Banks-III.rule ../../Rules/Banks-II.rule \ ../../Rules/Banks-I.rule ../../Rules/Banks-IV.rule \ ../../Rules/BBM-Margolus-emulated.rule \ ../../Rules/BriansBrain.rule ../../Rules/Byl-Loop.rule \ ../../Rules/Caterpillars.rule ../../Rules/Chou-Reggia-1.rule \ ../../Rules/Chou-Reggia-2.rule ../../Rules/Codd2.rule \ ../../Rules/Codd.rule \ ../../Rules/CrittersMargolus_emulated.rule \ ../../Rules/Devore.rule ../../Rules/DLA-Margolus-emulated.rule \ ../../Rules/Ed-rep.rule ../../Rules/Evoloop-finite.rule \ ../../Rules/Evoloop.rule ../../Rules/HPPMargolus_emulated.rule \ ../../Rules/HPP.rule ../../Rules/LangtonsAnt_LLRR.rule \ ../../Rules/Langtons-Ant.rule ../../Rules/Langtons-Loops.rule \ ../../Rules/LifeHistory.rule ../../Rules/LifeOnTheEdge.rule \ ../../Rules/LifeOnTheSlope.rule ../../Rules/Life.rule \ ../../Rules/Perrier.rule \ ../../Rules/Sand-Margolus-emulated.rule \ ../../Rules/Sand-square4cyclic_emulated.rule \ ../../Rules/SDSR-Loop.rule ../../Rules/StarWars.rule \ ../../Rules/TableGenerators/make-ruletable.cpp \ ../../Rules/Tempesti.rule \ ../../Rules/TMGasMargolus_emulated.rule \ ../../Rules/TreeGenerators/LifeOnTheEdge.cpp \ ../../Rules/TreeGenerators/LifeOnTheSlope.cpp \ ../../Rules/TreeGenerators/RuleTreeGen.cpp \ ../../Rules/TreeGenerators/RuleTreeGen.java \ ../../Rules/TreeGenerators/RuleTreeGen.pl \ ../../Rules/TreeGenerators/RuleTreeGen.py \ ../../Rules/TripATronMargolus_emulated.rule \ ../../Rules/TriTurmite_120010.rule \ ../../Rules/Turmite_1202822111121111812a0281282.rule \ ../../Rules/Turmite_121181121020.rule \ ../../Rules/Turmite_180121020081.rule \ ../../Rules/Turmite_181181121010.rule \ ../../Rules/WireWorld.rule ../../Rules/Worm-1040512.rule \ ../../Rules/Worm-1042015.rule ../../Rules/Worm-1042020.rule \ ../../Rules/Worm-1252121.rule ../../Rules/Worm-1525115.rule \ ../../Rules/Worm-complement.rule ../../Rules/Worm-shared.rule \ ../../Scripts/Perl/density.pl ../../Scripts/Perl/envelope.pl \ ../../Scripts/Perl/giffer.pl ../../Scripts/Perl/goto.pl \ ../../Scripts/Perl/invert.pl ../../Scripts/Perl/make-torus.pl \ ../../Scripts/Perl/oscar.pl \ ../../Scripts/Perl/p1100-MWSS-gun.pl \ ../../Scripts/Perl/pop-plot.pl ../../Scripts/Perl/shift.pl \ ../../Scripts/Perl/tile.pl \ ../../Scripts/Perl/tile-with-clip.pl \ ../../Scripts/Python/bricklayer.py \ ../../Scripts/Python/density.py \ ../../Scripts/Python/draw-lines.py \ ../../Scripts/Python/envelope.py \ ../../Scripts/Python/flood-fill.py \ ../../Scripts/Python/glife/base.py \ ../../Scripts/Python/glife/BuiltinIcons.py \ ../../Scripts/Python/glife/EmulateHexagonal.py \ ../../Scripts/Python/glife/EmulateMargolus.py \ ../../Scripts/Python/glife/EmulateOneDimensional.py \ ../../Scripts/Python/glife/EmulateTriangular.py \ ../../Scripts/Python/glife/gun24.py \ ../../Scripts/Python/glife/gun256.py \ ../../Scripts/Python/glife/gun30.py \ ../../Scripts/Python/glife/gun46.py \ ../../Scripts/Python/glife/herschel.py \ ../../Scripts/Python/glife/__init__.py \ ../../Scripts/Python/glife/ReadRuleTable.py \ ../../Scripts/Python/glife/RuleTree.py \ ../../Scripts/Python/glife/text.py \ ../../Scripts/Python/glife/WriteBMP.py \ ../../Scripts/Python/glife/WriteRuleTable.py \ ../../Scripts/Python/goto_expression.py \ ../../Scripts/Python/goto.py ../../Scripts/Python/gun-demo.py \ ../../Scripts/Python/heisenburp.py \ ../../Scripts/Python/invert.py \ ../../Scripts/Python/life-integer-gun30.py \ ../../Scripts/Python/make-Banks-IV-constructor.py \ ../../Scripts/Python/make-Codd-constructor.py \ ../../Scripts/Python/make-Devore-tape.py \ ../../Scripts/Python/make-torus.py \ ../../Scripts/Python/Margolus/convert-MCell-string.py \ ../../Scripts/Python/Margolus/export.py \ ../../Scripts/Python/Margolus/import.py \ ../../Scripts/Python/metafier.py \ ../../Scripts/Python/move-object.py \ ../../Scripts/Python/move-selection.py \ ../../Scripts/Python/oscar.py \ ../../Scripts/Python/p1100-MWSS-gun.py \ ../../Scripts/Python/pd-glider.py \ ../../Scripts/Python/pop-plot.py \ ../../Scripts/Python/Rule-Generators/AbsoluteHexTurmite-gen.py \ ../../Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py \ ../../Scripts/Python/Rule-Generators/FredkinModN-gen.py \ ../../Scripts/Python/Rule-Generators/HexTurmite-gen.py \ ../../Scripts/Python/Rule-Generators/icon-exporter.py \ ../../Scripts/Python/Rule-Generators/icon-importer.py \ ../../Scripts/Python/Rule-Generators/Langtons-Ant-gen.py \ ../../Scripts/Python/Rule-Generators/make-ruletree.py \ ../../Scripts/Python/Rule-Generators/RuleTableToTree.py \ ../../Scripts/Python/Rule-Generators/TriTurmite-gen.py \ ../../Scripts/Python/Rule-Generators/Turmite-gen.py \ ../../Scripts/Python/shift.py \ ../../Scripts/Python/slide-show.py \ ../../Scripts/Python/tile.py \ ../../Scripts/Python/tile-with-clip.py EXTRA_DIST = ../../gui-wx/makefile-gtk ../../gui-wx/makefile-mac \ ../../gui-wx/makefile-win ../../gui-wx/CMakeLists.txt \ ../../gui-wx/Info.plist.in ../../gui-wx/local-win-template.mk \ ../../gui-wx/golly.rc ../../gui-wx/configure/autogen.sh \ ../../gui-wx/icons ../../gui-wx/bitmaps ../../docs \ ../../gui-ios/Golly/algos.h ../../gui-ios/Golly/algos.m \ ../../gui-ios/Golly/beep.aiff ../../gui-ios/Golly/control.h \ ../../gui-ios/Golly/control.m \ ../../gui-ios/Golly/Default-Landscape~ipad.png \ ../../gui-ios/Golly/Default-Portrait~ipad.png \ ../../gui-ios/Golly/en.lproj/InfoPlist.strings \ ../../gui-ios/Golly/file.h ../../gui-ios/Golly/file.m \ ../../gui-ios/Golly/GollyAppDelegate.h \ ../../gui-ios/Golly/GollyAppDelegate.m \ ../../gui-ios/Golly/Golly-Info.plist \ ../../gui-ios/Golly/Golly-Prefix.pch \ ../../gui-ios/Golly/help@2x.png ../../gui-ios/Golly/help.png \ ../../gui-ios/Golly/HelpViewController.h \ ../../gui-ios/Golly/HelpViewController.m \ ../../gui-ios/Golly/HelpViewController.xib \ ../../gui-ios/Golly/Icon@2x.png ../../gui-ios/Golly/Icon.png \ ../../gui-ios/Golly/InfoViewController.h \ ../../gui-ios/Golly/InfoViewController.m \ ../../gui-ios/Golly/InfoViewController.xib \ ../../gui-ios/Golly/iTunesArtwork \ ../../gui-ios/Golly/iTunesArtwork@2x \ ../../gui-ios/Golly/layer.h ../../gui-ios/Golly/layer.m \ ../../gui-ios/Golly/main.m ../../gui-ios/Golly/MiniZip/crypt.h \ ../../gui-ios/Golly/MiniZip/ioapi.c \ ../../gui-ios/Golly/MiniZip/ioapi.h \ ../../gui-ios/Golly/MiniZip/mztools.c \ ../../gui-ios/Golly/MiniZip/mztools.h \ ../../gui-ios/Golly/MiniZip/unzip.c \ ../../gui-ios/Golly/MiniZip/unzip.h \ ../../gui-ios/Golly/MiniZip/zip.c \ ../../gui-ios/Golly/MiniZip/zip.h \ ../../gui-ios/Golly/Objective-Zip/FileInZipInfo.h \ ../../gui-ios/Golly/Objective-Zip/FileInZipInfo.m \ ../../gui-ios/Golly/Objective-Zip/ZipException.h \ ../../gui-ios/Golly/Objective-Zip/ZipException.m \ ../../gui-ios/Golly/Objective-Zip/ZipFile.h \ ../../gui-ios/Golly/Objective-Zip/ZipFile.m \ ../../gui-ios/Golly/Objective-Zip/ZipReadStream.h \ ../../gui-ios/Golly/Objective-Zip/ZipReadStream.m \ ../../gui-ios/Golly/Objective-Zip/ZipWriteStream.h \ ../../gui-ios/Golly/Objective-Zip/ZipWriteStream.m \ ../../gui-ios/Golly/open@2x.png ../../gui-ios/Golly/open.png \ ../../gui-ios/Golly/OpenViewController.h \ ../../gui-ios/Golly/OpenViewController.m \ ../../gui-ios/Golly/OpenViewController.xib \ ../../gui-ios/Golly/pattern@2x.png \ ../../gui-ios/Golly/pattern.png \ ../../gui-ios/Golly/PatternViewController.h \ ../../gui-ios/Golly/PatternViewController.m \ ../../gui-ios/Golly/PatternViewController.xib \ ../../gui-ios/Golly/PatternView.h \ ../../gui-ios/Golly/PatternView.m ../../gui-ios/Golly/prefs.h \ ../../gui-ios/Golly/prefs.m ../../gui-ios/Golly/render.h \ ../../gui-ios/Golly/render.m \ ../../gui-ios/Golly/RuleViewController.h \ ../../gui-ios/Golly/RuleViewController.m \ ../../gui-ios/Golly/RuleViewController.xib \ ../../gui-ios/Golly/SaveViewController.h \ ../../gui-ios/Golly/SaveViewController.m \ ../../gui-ios/Golly/SaveViewController.xib \ ../../gui-ios/Golly/select.h ../../gui-ios/Golly/select.m \ ../../gui-ios/Golly/settings@2x.png \ ../../gui-ios/Golly/settings.png \ ../../gui-ios/Golly/SettingsViewController.h \ ../../gui-ios/Golly/SettingsViewController.m \ ../../gui-ios/Golly/SettingsViewController.xib \ ../../gui-ios/Golly/StatePickerController.h \ ../../gui-ios/Golly/StatePickerController.m \ ../../gui-ios/Golly/StatePickerController.xib \ ../../gui-ios/Golly/StatePickerView.h \ ../../gui-ios/Golly/StatePickerView.m \ ../../gui-ios/Golly/StateView.h \ ../../gui-ios/Golly/StateView.m ../../gui-ios/Golly/status.h \ ../../gui-ios/Golly/status.m ../../gui-ios/Golly/StatusView.h \ ../../gui-ios/Golly/StatusView.m \ ../../gui-ios/Golly/triangle-down.png \ ../../gui-ios/Golly/triangle-right.png \ ../../gui-ios/Golly/undo.h ../../gui-ios/Golly/undo.m \ ../../gui-ios/Golly/utils.h ../../gui-ios/Golly/utils.m \ ../../gui-ios/Golly/view.h ../../gui-ios/Golly/view.m \ ../../gui-ios/Golly.xcodeproj/project.pbxproj \ ../../gui-ios/Golly.xcodeproj/project.xcworkspace/contents.xcworkspacedata \ ../../gui-ios/Help/about.gif ../../gui-ios/Help/about.html \ ../../gui-ios/Help/Algorithms/Generations.html \ ../../gui-ios/Help/Algorithms/HashLife.html \ ../../gui-ios/Help/Algorithms/JvN.html \ ../../gui-ios/Help/Algorithms/QuickLife.html \ ../../gui-ios/Help/Algorithms/RuleLoader.html \ ../../gui-ios/Help/algos.html ../../gui-ios/Help/archives.html \ ../../gui-ios/Help/bounded.html \ ../../gui-ios/Help/changes.html \ ../../gui-ios/Help/credits.html \ ../../gui-ios/Help/formats.html ../../gui-ios/Help/help.html \ ../../gui-ios/Help/index.html ../../gui-ios/Help/intro.html \ ../../gui-ios/Help/Lexicon/fix-lex-files.py \ ../../gui-ios/Help/Lexicon/lex_1.htm \ ../../gui-ios/Help/Lexicon/lex_a.htm \ ../../gui-ios/Help/Lexicon/lex_b.htm \ ../../gui-ios/Help/Lexicon/lex_bib.htm \ ../../gui-ios/Help/Lexicon/lex_c.htm \ ../../gui-ios/Help/Lexicon/lex_d.htm \ ../../gui-ios/Help/Lexicon/lex_e.htm \ ../../gui-ios/Help/Lexicon/lex_f.htm \ ../../gui-ios/Help/Lexicon/lex_g.htm \ ../../gui-ios/Help/Lexicon/lex_h.htm \ ../../gui-ios/Help/Lexicon/lex.htm \ ../../gui-ios/Help/Lexicon/lex_i.htm \ ../../gui-ios/Help/Lexicon/lex_j.htm \ ../../gui-ios/Help/Lexicon/lex_k.htm \ ../../gui-ios/Help/Lexicon/lex_l.htm \ ../../gui-ios/Help/Lexicon/lex_m.htm \ ../../gui-ios/Help/Lexicon/lex_n.htm \ ../../gui-ios/Help/Lexicon/lex_o.htm \ ../../gui-ios/Help/Lexicon/lex_p.htm \ ../../gui-ios/Help/Lexicon/lex_q.htm \ ../../gui-ios/Help/Lexicon/lex_r.htm \ ../../gui-ios/Help/Lexicon/lex_s.htm \ ../../gui-ios/Help/Lexicon/lex_t.htm \ ../../gui-ios/Help/Lexicon/lex_u.htm \ ../../gui-ios/Help/Lexicon/lex_v.htm \ ../../gui-ios/Help/Lexicon/lex_w.htm \ ../../gui-ios/Help/Lexicon/lex_x.htm \ ../../gui-ios/Help/Lexicon/lex_y.htm \ ../../gui-ios/Help/Lexicon/lex_z.htm \ ../../gui-ios/Help/open.html ../../gui-ios/Help/pattern.html \ ../../gui-ios/Help/problems.html ../../gui-ios/Help/refs.html \ ../../gui-ios/Help/settings.html ../../gui-ios/Help/tips.html \ ../../docs golly_CPPFLAGS = $(AM_CPPFLAGS) $(WX_CPPFLAGS) $(PERL_INCLUDE) $(PYTHON_INCLUDE) golly_CXXFLAGS = $(AM_CXXFLAGS) $(WX_CXXFLAGS_ONLY) golly_LDADD = $(WX_LIBS) libgolly.a $(am__append_1) bgolly_SOURCES = ../../cmdline/bgolly.cpp bgolly_LDADD = libgolly.a RuleTableToTree_SOURCES = ../../cmdline/RuleTableToTree.cpp RuleTableToTree_LDADD = libgolly.a srcdistdir = $(PACKAGE)-$(VERSION)$(SRCDISTSUFFIX) bindistdir = $(PACKAGE)-$(VERSION)$(BINDISTSUFFIX) all: all-am .SUFFIXES: .SUFFIXES: .cpp .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/sources.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(srcdir)/sources.am: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libgolly.a: $(libgolly_a_OBJECTS) $(libgolly_a_DEPENDENCIES) $(EXTRA_libgolly_a_DEPENDENCIES) $(AM_V_at)-rm -f libgolly.a $(AM_V_AR)$(libgolly_a_AR) libgolly.a $(libgolly_a_OBJECTS) $(libgolly_a_LIBADD) $(AM_V_at)$(RANLIB) libgolly.a install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) RuleTableToTree$(EXEEXT): $(RuleTableToTree_OBJECTS) $(RuleTableToTree_DEPENDENCIES) $(EXTRA_RuleTableToTree_DEPENDENCIES) @rm -f RuleTableToTree$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(RuleTableToTree_OBJECTS) $(RuleTableToTree_LDADD) $(LIBS) bgolly$(EXEEXT): $(bgolly_OBJECTS) $(bgolly_DEPENDENCIES) $(EXTRA_bgolly_DEPENDENCIES) @rm -f bgolly$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(bgolly_OBJECTS) $(bgolly_LDADD) $(LIBS) golly$(EXEEXT): $(golly_OBJECTS) $(golly_DEPENDENCIES) $(EXTRA_golly_DEPENDENCIES) @rm -f golly$(EXEEXT) $(AM_V_CXXLD)$(golly_LINK) $(golly_OBJECTS) $(golly_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/RuleTableToTree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bgolly.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bigint.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/generationsalgo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghashbase.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ghashdraw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxalgos.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxcontrol.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxedit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxgolly.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxhelp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxinfo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxlayer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxmain.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxperl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxprefs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxpython.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxrender.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxrule.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxscript.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxselect.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxstatus.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxtimeline.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxundo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxutils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/golly-wxview.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hlifealgo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hlifedraw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jvnalgo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lifealgo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lifepoll.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liferender.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/liferules.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qlifealgo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qlifedraw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/readpattern.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ruleloaderalgo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ruletable_algo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ruletreealgo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viewport.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/writepattern.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` bigint.o: ../../gollybase/bigint.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bigint.o -MD -MP -MF $(DEPDIR)/bigint.Tpo -c -o bigint.o `test -f '../../gollybase/bigint.cpp' || echo '$(srcdir)/'`../../gollybase/bigint.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bigint.Tpo $(DEPDIR)/bigint.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/bigint.cpp' object='bigint.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bigint.o `test -f '../../gollybase/bigint.cpp' || echo '$(srcdir)/'`../../gollybase/bigint.cpp bigint.obj: ../../gollybase/bigint.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bigint.obj -MD -MP -MF $(DEPDIR)/bigint.Tpo -c -o bigint.obj `if test -f '../../gollybase/bigint.cpp'; then $(CYGPATH_W) '../../gollybase/bigint.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/bigint.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bigint.Tpo $(DEPDIR)/bigint.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/bigint.cpp' object='bigint.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bigint.obj `if test -f '../../gollybase/bigint.cpp'; then $(CYGPATH_W) '../../gollybase/bigint.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/bigint.cpp'; fi` generationsalgo.o: ../../gollybase/generationsalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT generationsalgo.o -MD -MP -MF $(DEPDIR)/generationsalgo.Tpo -c -o generationsalgo.o `test -f '../../gollybase/generationsalgo.cpp' || echo '$(srcdir)/'`../../gollybase/generationsalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/generationsalgo.Tpo $(DEPDIR)/generationsalgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/generationsalgo.cpp' object='generationsalgo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o generationsalgo.o `test -f '../../gollybase/generationsalgo.cpp' || echo '$(srcdir)/'`../../gollybase/generationsalgo.cpp generationsalgo.obj: ../../gollybase/generationsalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT generationsalgo.obj -MD -MP -MF $(DEPDIR)/generationsalgo.Tpo -c -o generationsalgo.obj `if test -f '../../gollybase/generationsalgo.cpp'; then $(CYGPATH_W) '../../gollybase/generationsalgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/generationsalgo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/generationsalgo.Tpo $(DEPDIR)/generationsalgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/generationsalgo.cpp' object='generationsalgo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o generationsalgo.obj `if test -f '../../gollybase/generationsalgo.cpp'; then $(CYGPATH_W) '../../gollybase/generationsalgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/generationsalgo.cpp'; fi` ghashbase.o: ../../gollybase/ghashbase.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ghashbase.o -MD -MP -MF $(DEPDIR)/ghashbase.Tpo -c -o ghashbase.o `test -f '../../gollybase/ghashbase.cpp' || echo '$(srcdir)/'`../../gollybase/ghashbase.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ghashbase.Tpo $(DEPDIR)/ghashbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ghashbase.cpp' object='ghashbase.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ghashbase.o `test -f '../../gollybase/ghashbase.cpp' || echo '$(srcdir)/'`../../gollybase/ghashbase.cpp ghashbase.obj: ../../gollybase/ghashbase.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ghashbase.obj -MD -MP -MF $(DEPDIR)/ghashbase.Tpo -c -o ghashbase.obj `if test -f '../../gollybase/ghashbase.cpp'; then $(CYGPATH_W) '../../gollybase/ghashbase.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ghashbase.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ghashbase.Tpo $(DEPDIR)/ghashbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ghashbase.cpp' object='ghashbase.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ghashbase.obj `if test -f '../../gollybase/ghashbase.cpp'; then $(CYGPATH_W) '../../gollybase/ghashbase.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ghashbase.cpp'; fi` ghashdraw.o: ../../gollybase/ghashdraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ghashdraw.o -MD -MP -MF $(DEPDIR)/ghashdraw.Tpo -c -o ghashdraw.o `test -f '../../gollybase/ghashdraw.cpp' || echo '$(srcdir)/'`../../gollybase/ghashdraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ghashdraw.Tpo $(DEPDIR)/ghashdraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ghashdraw.cpp' object='ghashdraw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ghashdraw.o `test -f '../../gollybase/ghashdraw.cpp' || echo '$(srcdir)/'`../../gollybase/ghashdraw.cpp ghashdraw.obj: ../../gollybase/ghashdraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ghashdraw.obj -MD -MP -MF $(DEPDIR)/ghashdraw.Tpo -c -o ghashdraw.obj `if test -f '../../gollybase/ghashdraw.cpp'; then $(CYGPATH_W) '../../gollybase/ghashdraw.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ghashdraw.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ghashdraw.Tpo $(DEPDIR)/ghashdraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ghashdraw.cpp' object='ghashdraw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ghashdraw.obj `if test -f '../../gollybase/ghashdraw.cpp'; then $(CYGPATH_W) '../../gollybase/ghashdraw.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ghashdraw.cpp'; fi` hlifealgo.o: ../../gollybase/hlifealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hlifealgo.o -MD -MP -MF $(DEPDIR)/hlifealgo.Tpo -c -o hlifealgo.o `test -f '../../gollybase/hlifealgo.cpp' || echo '$(srcdir)/'`../../gollybase/hlifealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hlifealgo.Tpo $(DEPDIR)/hlifealgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/hlifealgo.cpp' object='hlifealgo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hlifealgo.o `test -f '../../gollybase/hlifealgo.cpp' || echo '$(srcdir)/'`../../gollybase/hlifealgo.cpp hlifealgo.obj: ../../gollybase/hlifealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hlifealgo.obj -MD -MP -MF $(DEPDIR)/hlifealgo.Tpo -c -o hlifealgo.obj `if test -f '../../gollybase/hlifealgo.cpp'; then $(CYGPATH_W) '../../gollybase/hlifealgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/hlifealgo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hlifealgo.Tpo $(DEPDIR)/hlifealgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/hlifealgo.cpp' object='hlifealgo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hlifealgo.obj `if test -f '../../gollybase/hlifealgo.cpp'; then $(CYGPATH_W) '../../gollybase/hlifealgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/hlifealgo.cpp'; fi` hlifedraw.o: ../../gollybase/hlifedraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hlifedraw.o -MD -MP -MF $(DEPDIR)/hlifedraw.Tpo -c -o hlifedraw.o `test -f '../../gollybase/hlifedraw.cpp' || echo '$(srcdir)/'`../../gollybase/hlifedraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hlifedraw.Tpo $(DEPDIR)/hlifedraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/hlifedraw.cpp' object='hlifedraw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hlifedraw.o `test -f '../../gollybase/hlifedraw.cpp' || echo '$(srcdir)/'`../../gollybase/hlifedraw.cpp hlifedraw.obj: ../../gollybase/hlifedraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT hlifedraw.obj -MD -MP -MF $(DEPDIR)/hlifedraw.Tpo -c -o hlifedraw.obj `if test -f '../../gollybase/hlifedraw.cpp'; then $(CYGPATH_W) '../../gollybase/hlifedraw.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/hlifedraw.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/hlifedraw.Tpo $(DEPDIR)/hlifedraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/hlifedraw.cpp' object='hlifedraw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o hlifedraw.obj `if test -f '../../gollybase/hlifedraw.cpp'; then $(CYGPATH_W) '../../gollybase/hlifedraw.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/hlifedraw.cpp'; fi` jvnalgo.o: ../../gollybase/jvnalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT jvnalgo.o -MD -MP -MF $(DEPDIR)/jvnalgo.Tpo -c -o jvnalgo.o `test -f '../../gollybase/jvnalgo.cpp' || echo '$(srcdir)/'`../../gollybase/jvnalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/jvnalgo.Tpo $(DEPDIR)/jvnalgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/jvnalgo.cpp' object='jvnalgo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o jvnalgo.o `test -f '../../gollybase/jvnalgo.cpp' || echo '$(srcdir)/'`../../gollybase/jvnalgo.cpp jvnalgo.obj: ../../gollybase/jvnalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT jvnalgo.obj -MD -MP -MF $(DEPDIR)/jvnalgo.Tpo -c -o jvnalgo.obj `if test -f '../../gollybase/jvnalgo.cpp'; then $(CYGPATH_W) '../../gollybase/jvnalgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/jvnalgo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/jvnalgo.Tpo $(DEPDIR)/jvnalgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/jvnalgo.cpp' object='jvnalgo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o jvnalgo.obj `if test -f '../../gollybase/jvnalgo.cpp'; then $(CYGPATH_W) '../../gollybase/jvnalgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/jvnalgo.cpp'; fi` lifealgo.o: ../../gollybase/lifealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lifealgo.o -MD -MP -MF $(DEPDIR)/lifealgo.Tpo -c -o lifealgo.o `test -f '../../gollybase/lifealgo.cpp' || echo '$(srcdir)/'`../../gollybase/lifealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lifealgo.Tpo $(DEPDIR)/lifealgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/lifealgo.cpp' object='lifealgo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lifealgo.o `test -f '../../gollybase/lifealgo.cpp' || echo '$(srcdir)/'`../../gollybase/lifealgo.cpp lifealgo.obj: ../../gollybase/lifealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lifealgo.obj -MD -MP -MF $(DEPDIR)/lifealgo.Tpo -c -o lifealgo.obj `if test -f '../../gollybase/lifealgo.cpp'; then $(CYGPATH_W) '../../gollybase/lifealgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/lifealgo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lifealgo.Tpo $(DEPDIR)/lifealgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/lifealgo.cpp' object='lifealgo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lifealgo.obj `if test -f '../../gollybase/lifealgo.cpp'; then $(CYGPATH_W) '../../gollybase/lifealgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/lifealgo.cpp'; fi` lifepoll.o: ../../gollybase/lifepoll.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lifepoll.o -MD -MP -MF $(DEPDIR)/lifepoll.Tpo -c -o lifepoll.o `test -f '../../gollybase/lifepoll.cpp' || echo '$(srcdir)/'`../../gollybase/lifepoll.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lifepoll.Tpo $(DEPDIR)/lifepoll.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/lifepoll.cpp' object='lifepoll.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lifepoll.o `test -f '../../gollybase/lifepoll.cpp' || echo '$(srcdir)/'`../../gollybase/lifepoll.cpp lifepoll.obj: ../../gollybase/lifepoll.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT lifepoll.obj -MD -MP -MF $(DEPDIR)/lifepoll.Tpo -c -o lifepoll.obj `if test -f '../../gollybase/lifepoll.cpp'; then $(CYGPATH_W) '../../gollybase/lifepoll.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/lifepoll.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lifepoll.Tpo $(DEPDIR)/lifepoll.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/lifepoll.cpp' object='lifepoll.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o lifepoll.obj `if test -f '../../gollybase/lifepoll.cpp'; then $(CYGPATH_W) '../../gollybase/lifepoll.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/lifepoll.cpp'; fi` liferender.o: ../../gollybase/liferender.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liferender.o -MD -MP -MF $(DEPDIR)/liferender.Tpo -c -o liferender.o `test -f '../../gollybase/liferender.cpp' || echo '$(srcdir)/'`../../gollybase/liferender.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liferender.Tpo $(DEPDIR)/liferender.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/liferender.cpp' object='liferender.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liferender.o `test -f '../../gollybase/liferender.cpp' || echo '$(srcdir)/'`../../gollybase/liferender.cpp liferender.obj: ../../gollybase/liferender.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liferender.obj -MD -MP -MF $(DEPDIR)/liferender.Tpo -c -o liferender.obj `if test -f '../../gollybase/liferender.cpp'; then $(CYGPATH_W) '../../gollybase/liferender.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/liferender.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liferender.Tpo $(DEPDIR)/liferender.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/liferender.cpp' object='liferender.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liferender.obj `if test -f '../../gollybase/liferender.cpp'; then $(CYGPATH_W) '../../gollybase/liferender.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/liferender.cpp'; fi` liferules.o: ../../gollybase/liferules.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liferules.o -MD -MP -MF $(DEPDIR)/liferules.Tpo -c -o liferules.o `test -f '../../gollybase/liferules.cpp' || echo '$(srcdir)/'`../../gollybase/liferules.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liferules.Tpo $(DEPDIR)/liferules.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/liferules.cpp' object='liferules.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liferules.o `test -f '../../gollybase/liferules.cpp' || echo '$(srcdir)/'`../../gollybase/liferules.cpp liferules.obj: ../../gollybase/liferules.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT liferules.obj -MD -MP -MF $(DEPDIR)/liferules.Tpo -c -o liferules.obj `if test -f '../../gollybase/liferules.cpp'; then $(CYGPATH_W) '../../gollybase/liferules.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/liferules.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/liferules.Tpo $(DEPDIR)/liferules.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/liferules.cpp' object='liferules.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o liferules.obj `if test -f '../../gollybase/liferules.cpp'; then $(CYGPATH_W) '../../gollybase/liferules.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/liferules.cpp'; fi` qlifealgo.o: ../../gollybase/qlifealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT qlifealgo.o -MD -MP -MF $(DEPDIR)/qlifealgo.Tpo -c -o qlifealgo.o `test -f '../../gollybase/qlifealgo.cpp' || echo '$(srcdir)/'`../../gollybase/qlifealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qlifealgo.Tpo $(DEPDIR)/qlifealgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/qlifealgo.cpp' object='qlifealgo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o qlifealgo.o `test -f '../../gollybase/qlifealgo.cpp' || echo '$(srcdir)/'`../../gollybase/qlifealgo.cpp qlifealgo.obj: ../../gollybase/qlifealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT qlifealgo.obj -MD -MP -MF $(DEPDIR)/qlifealgo.Tpo -c -o qlifealgo.obj `if test -f '../../gollybase/qlifealgo.cpp'; then $(CYGPATH_W) '../../gollybase/qlifealgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/qlifealgo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qlifealgo.Tpo $(DEPDIR)/qlifealgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/qlifealgo.cpp' object='qlifealgo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o qlifealgo.obj `if test -f '../../gollybase/qlifealgo.cpp'; then $(CYGPATH_W) '../../gollybase/qlifealgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/qlifealgo.cpp'; fi` qlifedraw.o: ../../gollybase/qlifedraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT qlifedraw.o -MD -MP -MF $(DEPDIR)/qlifedraw.Tpo -c -o qlifedraw.o `test -f '../../gollybase/qlifedraw.cpp' || echo '$(srcdir)/'`../../gollybase/qlifedraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qlifedraw.Tpo $(DEPDIR)/qlifedraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/qlifedraw.cpp' object='qlifedraw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o qlifedraw.o `test -f '../../gollybase/qlifedraw.cpp' || echo '$(srcdir)/'`../../gollybase/qlifedraw.cpp qlifedraw.obj: ../../gollybase/qlifedraw.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT qlifedraw.obj -MD -MP -MF $(DEPDIR)/qlifedraw.Tpo -c -o qlifedraw.obj `if test -f '../../gollybase/qlifedraw.cpp'; then $(CYGPATH_W) '../../gollybase/qlifedraw.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/qlifedraw.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/qlifedraw.Tpo $(DEPDIR)/qlifedraw.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/qlifedraw.cpp' object='qlifedraw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o qlifedraw.obj `if test -f '../../gollybase/qlifedraw.cpp'; then $(CYGPATH_W) '../../gollybase/qlifedraw.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/qlifedraw.cpp'; fi` readpattern.o: ../../gollybase/readpattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT readpattern.o -MD -MP -MF $(DEPDIR)/readpattern.Tpo -c -o readpattern.o `test -f '../../gollybase/readpattern.cpp' || echo '$(srcdir)/'`../../gollybase/readpattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readpattern.Tpo $(DEPDIR)/readpattern.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/readpattern.cpp' object='readpattern.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o readpattern.o `test -f '../../gollybase/readpattern.cpp' || echo '$(srcdir)/'`../../gollybase/readpattern.cpp readpattern.obj: ../../gollybase/readpattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT readpattern.obj -MD -MP -MF $(DEPDIR)/readpattern.Tpo -c -o readpattern.obj `if test -f '../../gollybase/readpattern.cpp'; then $(CYGPATH_W) '../../gollybase/readpattern.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/readpattern.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/readpattern.Tpo $(DEPDIR)/readpattern.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/readpattern.cpp' object='readpattern.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o readpattern.obj `if test -f '../../gollybase/readpattern.cpp'; then $(CYGPATH_W) '../../gollybase/readpattern.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/readpattern.cpp'; fi` ruleloaderalgo.o: ../../gollybase/ruleloaderalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ruleloaderalgo.o -MD -MP -MF $(DEPDIR)/ruleloaderalgo.Tpo -c -o ruleloaderalgo.o `test -f '../../gollybase/ruleloaderalgo.cpp' || echo '$(srcdir)/'`../../gollybase/ruleloaderalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ruleloaderalgo.Tpo $(DEPDIR)/ruleloaderalgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ruleloaderalgo.cpp' object='ruleloaderalgo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ruleloaderalgo.o `test -f '../../gollybase/ruleloaderalgo.cpp' || echo '$(srcdir)/'`../../gollybase/ruleloaderalgo.cpp ruleloaderalgo.obj: ../../gollybase/ruleloaderalgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ruleloaderalgo.obj -MD -MP -MF $(DEPDIR)/ruleloaderalgo.Tpo -c -o ruleloaderalgo.obj `if test -f '../../gollybase/ruleloaderalgo.cpp'; then $(CYGPATH_W) '../../gollybase/ruleloaderalgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ruleloaderalgo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ruleloaderalgo.Tpo $(DEPDIR)/ruleloaderalgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ruleloaderalgo.cpp' object='ruleloaderalgo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ruleloaderalgo.obj `if test -f '../../gollybase/ruleloaderalgo.cpp'; then $(CYGPATH_W) '../../gollybase/ruleloaderalgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ruleloaderalgo.cpp'; fi` ruletable_algo.o: ../../gollybase/ruletable_algo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ruletable_algo.o -MD -MP -MF $(DEPDIR)/ruletable_algo.Tpo -c -o ruletable_algo.o `test -f '../../gollybase/ruletable_algo.cpp' || echo '$(srcdir)/'`../../gollybase/ruletable_algo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ruletable_algo.Tpo $(DEPDIR)/ruletable_algo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ruletable_algo.cpp' object='ruletable_algo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ruletable_algo.o `test -f '../../gollybase/ruletable_algo.cpp' || echo '$(srcdir)/'`../../gollybase/ruletable_algo.cpp ruletable_algo.obj: ../../gollybase/ruletable_algo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ruletable_algo.obj -MD -MP -MF $(DEPDIR)/ruletable_algo.Tpo -c -o ruletable_algo.obj `if test -f '../../gollybase/ruletable_algo.cpp'; then $(CYGPATH_W) '../../gollybase/ruletable_algo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ruletable_algo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ruletable_algo.Tpo $(DEPDIR)/ruletable_algo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ruletable_algo.cpp' object='ruletable_algo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ruletable_algo.obj `if test -f '../../gollybase/ruletable_algo.cpp'; then $(CYGPATH_W) '../../gollybase/ruletable_algo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ruletable_algo.cpp'; fi` ruletreealgo.o: ../../gollybase/ruletreealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ruletreealgo.o -MD -MP -MF $(DEPDIR)/ruletreealgo.Tpo -c -o ruletreealgo.o `test -f '../../gollybase/ruletreealgo.cpp' || echo '$(srcdir)/'`../../gollybase/ruletreealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ruletreealgo.Tpo $(DEPDIR)/ruletreealgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ruletreealgo.cpp' object='ruletreealgo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ruletreealgo.o `test -f '../../gollybase/ruletreealgo.cpp' || echo '$(srcdir)/'`../../gollybase/ruletreealgo.cpp ruletreealgo.obj: ../../gollybase/ruletreealgo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT ruletreealgo.obj -MD -MP -MF $(DEPDIR)/ruletreealgo.Tpo -c -o ruletreealgo.obj `if test -f '../../gollybase/ruletreealgo.cpp'; then $(CYGPATH_W) '../../gollybase/ruletreealgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ruletreealgo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ruletreealgo.Tpo $(DEPDIR)/ruletreealgo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/ruletreealgo.cpp' object='ruletreealgo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o ruletreealgo.obj `if test -f '../../gollybase/ruletreealgo.cpp'; then $(CYGPATH_W) '../../gollybase/ruletreealgo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/ruletreealgo.cpp'; fi` util.o: ../../gollybase/util.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT util.o -MD -MP -MF $(DEPDIR)/util.Tpo -c -o util.o `test -f '../../gollybase/util.cpp' || echo '$(srcdir)/'`../../gollybase/util.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/util.Tpo $(DEPDIR)/util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/util.cpp' object='util.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o util.o `test -f '../../gollybase/util.cpp' || echo '$(srcdir)/'`../../gollybase/util.cpp util.obj: ../../gollybase/util.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT util.obj -MD -MP -MF $(DEPDIR)/util.Tpo -c -o util.obj `if test -f '../../gollybase/util.cpp'; then $(CYGPATH_W) '../../gollybase/util.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/util.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/util.Tpo $(DEPDIR)/util.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/util.cpp' object='util.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o util.obj `if test -f '../../gollybase/util.cpp'; then $(CYGPATH_W) '../../gollybase/util.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/util.cpp'; fi` viewport.o: ../../gollybase/viewport.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT viewport.o -MD -MP -MF $(DEPDIR)/viewport.Tpo -c -o viewport.o `test -f '../../gollybase/viewport.cpp' || echo '$(srcdir)/'`../../gollybase/viewport.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/viewport.Tpo $(DEPDIR)/viewport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/viewport.cpp' object='viewport.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o viewport.o `test -f '../../gollybase/viewport.cpp' || echo '$(srcdir)/'`../../gollybase/viewport.cpp viewport.obj: ../../gollybase/viewport.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT viewport.obj -MD -MP -MF $(DEPDIR)/viewport.Tpo -c -o viewport.obj `if test -f '../../gollybase/viewport.cpp'; then $(CYGPATH_W) '../../gollybase/viewport.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/viewport.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/viewport.Tpo $(DEPDIR)/viewport.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/viewport.cpp' object='viewport.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o viewport.obj `if test -f '../../gollybase/viewport.cpp'; then $(CYGPATH_W) '../../gollybase/viewport.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/viewport.cpp'; fi` writepattern.o: ../../gollybase/writepattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT writepattern.o -MD -MP -MF $(DEPDIR)/writepattern.Tpo -c -o writepattern.o `test -f '../../gollybase/writepattern.cpp' || echo '$(srcdir)/'`../../gollybase/writepattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/writepattern.Tpo $(DEPDIR)/writepattern.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/writepattern.cpp' object='writepattern.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o writepattern.o `test -f '../../gollybase/writepattern.cpp' || echo '$(srcdir)/'`../../gollybase/writepattern.cpp writepattern.obj: ../../gollybase/writepattern.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT writepattern.obj -MD -MP -MF $(DEPDIR)/writepattern.Tpo -c -o writepattern.obj `if test -f '../../gollybase/writepattern.cpp'; then $(CYGPATH_W) '../../gollybase/writepattern.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/writepattern.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/writepattern.Tpo $(DEPDIR)/writepattern.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gollybase/writepattern.cpp' object='writepattern.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o writepattern.obj `if test -f '../../gollybase/writepattern.cpp'; then $(CYGPATH_W) '../../gollybase/writepattern.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gollybase/writepattern.cpp'; fi` RuleTableToTree.o: ../../cmdline/RuleTableToTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT RuleTableToTree.o -MD -MP -MF $(DEPDIR)/RuleTableToTree.Tpo -c -o RuleTableToTree.o `test -f '../../cmdline/RuleTableToTree.cpp' || echo '$(srcdir)/'`../../cmdline/RuleTableToTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/RuleTableToTree.Tpo $(DEPDIR)/RuleTableToTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../cmdline/RuleTableToTree.cpp' object='RuleTableToTree.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o RuleTableToTree.o `test -f '../../cmdline/RuleTableToTree.cpp' || echo '$(srcdir)/'`../../cmdline/RuleTableToTree.cpp RuleTableToTree.obj: ../../cmdline/RuleTableToTree.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT RuleTableToTree.obj -MD -MP -MF $(DEPDIR)/RuleTableToTree.Tpo -c -o RuleTableToTree.obj `if test -f '../../cmdline/RuleTableToTree.cpp'; then $(CYGPATH_W) '../../cmdline/RuleTableToTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../../cmdline/RuleTableToTree.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/RuleTableToTree.Tpo $(DEPDIR)/RuleTableToTree.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../cmdline/RuleTableToTree.cpp' object='RuleTableToTree.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o RuleTableToTree.obj `if test -f '../../cmdline/RuleTableToTree.cpp'; then $(CYGPATH_W) '../../cmdline/RuleTableToTree.cpp'; else $(CYGPATH_W) '$(srcdir)/../../cmdline/RuleTableToTree.cpp'; fi` bgolly.o: ../../cmdline/bgolly.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bgolly.o -MD -MP -MF $(DEPDIR)/bgolly.Tpo -c -o bgolly.o `test -f '../../cmdline/bgolly.cpp' || echo '$(srcdir)/'`../../cmdline/bgolly.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bgolly.Tpo $(DEPDIR)/bgolly.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../cmdline/bgolly.cpp' object='bgolly.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bgolly.o `test -f '../../cmdline/bgolly.cpp' || echo '$(srcdir)/'`../../cmdline/bgolly.cpp bgolly.obj: ../../cmdline/bgolly.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT bgolly.obj -MD -MP -MF $(DEPDIR)/bgolly.Tpo -c -o bgolly.obj `if test -f '../../cmdline/bgolly.cpp'; then $(CYGPATH_W) '../../cmdline/bgolly.cpp'; else $(CYGPATH_W) '$(srcdir)/../../cmdline/bgolly.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/bgolly.Tpo $(DEPDIR)/bgolly.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../cmdline/bgolly.cpp' object='bgolly.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o bgolly.obj `if test -f '../../cmdline/bgolly.cpp'; then $(CYGPATH_W) '../../cmdline/bgolly.cpp'; else $(CYGPATH_W) '$(srcdir)/../../cmdline/bgolly.cpp'; fi` golly-wxalgos.o: ../../gui-wx/wxalgos.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxalgos.o -MD -MP -MF $(DEPDIR)/golly-wxalgos.Tpo -c -o golly-wxalgos.o `test -f '../../gui-wx/wxalgos.cpp' || echo '$(srcdir)/'`../../gui-wx/wxalgos.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxalgos.Tpo $(DEPDIR)/golly-wxalgos.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxalgos.cpp' object='golly-wxalgos.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxalgos.o `test -f '../../gui-wx/wxalgos.cpp' || echo '$(srcdir)/'`../../gui-wx/wxalgos.cpp golly-wxalgos.obj: ../../gui-wx/wxalgos.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxalgos.obj -MD -MP -MF $(DEPDIR)/golly-wxalgos.Tpo -c -o golly-wxalgos.obj `if test -f '../../gui-wx/wxalgos.cpp'; then $(CYGPATH_W) '../../gui-wx/wxalgos.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxalgos.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxalgos.Tpo $(DEPDIR)/golly-wxalgos.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxalgos.cpp' object='golly-wxalgos.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxalgos.obj `if test -f '../../gui-wx/wxalgos.cpp'; then $(CYGPATH_W) '../../gui-wx/wxalgos.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxalgos.cpp'; fi` golly-wxcontrol.o: ../../gui-wx/wxcontrol.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxcontrol.o -MD -MP -MF $(DEPDIR)/golly-wxcontrol.Tpo -c -o golly-wxcontrol.o `test -f '../../gui-wx/wxcontrol.cpp' || echo '$(srcdir)/'`../../gui-wx/wxcontrol.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxcontrol.Tpo $(DEPDIR)/golly-wxcontrol.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxcontrol.cpp' object='golly-wxcontrol.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxcontrol.o `test -f '../../gui-wx/wxcontrol.cpp' || echo '$(srcdir)/'`../../gui-wx/wxcontrol.cpp golly-wxcontrol.obj: ../../gui-wx/wxcontrol.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxcontrol.obj -MD -MP -MF $(DEPDIR)/golly-wxcontrol.Tpo -c -o golly-wxcontrol.obj `if test -f '../../gui-wx/wxcontrol.cpp'; then $(CYGPATH_W) '../../gui-wx/wxcontrol.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxcontrol.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxcontrol.Tpo $(DEPDIR)/golly-wxcontrol.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxcontrol.cpp' object='golly-wxcontrol.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxcontrol.obj `if test -f '../../gui-wx/wxcontrol.cpp'; then $(CYGPATH_W) '../../gui-wx/wxcontrol.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxcontrol.cpp'; fi` golly-wxedit.o: ../../gui-wx/wxedit.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxedit.o -MD -MP -MF $(DEPDIR)/golly-wxedit.Tpo -c -o golly-wxedit.o `test -f '../../gui-wx/wxedit.cpp' || echo '$(srcdir)/'`../../gui-wx/wxedit.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxedit.Tpo $(DEPDIR)/golly-wxedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxedit.cpp' object='golly-wxedit.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxedit.o `test -f '../../gui-wx/wxedit.cpp' || echo '$(srcdir)/'`../../gui-wx/wxedit.cpp golly-wxedit.obj: ../../gui-wx/wxedit.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxedit.obj -MD -MP -MF $(DEPDIR)/golly-wxedit.Tpo -c -o golly-wxedit.obj `if test -f '../../gui-wx/wxedit.cpp'; then $(CYGPATH_W) '../../gui-wx/wxedit.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxedit.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxedit.Tpo $(DEPDIR)/golly-wxedit.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxedit.cpp' object='golly-wxedit.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxedit.obj `if test -f '../../gui-wx/wxedit.cpp'; then $(CYGPATH_W) '../../gui-wx/wxedit.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxedit.cpp'; fi` golly-wxfile.o: ../../gui-wx/wxfile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxfile.o -MD -MP -MF $(DEPDIR)/golly-wxfile.Tpo -c -o golly-wxfile.o `test -f '../../gui-wx/wxfile.cpp' || echo '$(srcdir)/'`../../gui-wx/wxfile.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxfile.Tpo $(DEPDIR)/golly-wxfile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxfile.cpp' object='golly-wxfile.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxfile.o `test -f '../../gui-wx/wxfile.cpp' || echo '$(srcdir)/'`../../gui-wx/wxfile.cpp golly-wxfile.obj: ../../gui-wx/wxfile.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxfile.obj -MD -MP -MF $(DEPDIR)/golly-wxfile.Tpo -c -o golly-wxfile.obj `if test -f '../../gui-wx/wxfile.cpp'; then $(CYGPATH_W) '../../gui-wx/wxfile.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxfile.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxfile.Tpo $(DEPDIR)/golly-wxfile.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxfile.cpp' object='golly-wxfile.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxfile.obj `if test -f '../../gui-wx/wxfile.cpp'; then $(CYGPATH_W) '../../gui-wx/wxfile.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxfile.cpp'; fi` golly-wxgolly.o: ../../gui-wx/wxgolly.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxgolly.o -MD -MP -MF $(DEPDIR)/golly-wxgolly.Tpo -c -o golly-wxgolly.o `test -f '../../gui-wx/wxgolly.cpp' || echo '$(srcdir)/'`../../gui-wx/wxgolly.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxgolly.Tpo $(DEPDIR)/golly-wxgolly.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxgolly.cpp' object='golly-wxgolly.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxgolly.o `test -f '../../gui-wx/wxgolly.cpp' || echo '$(srcdir)/'`../../gui-wx/wxgolly.cpp golly-wxgolly.obj: ../../gui-wx/wxgolly.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxgolly.obj -MD -MP -MF $(DEPDIR)/golly-wxgolly.Tpo -c -o golly-wxgolly.obj `if test -f '../../gui-wx/wxgolly.cpp'; then $(CYGPATH_W) '../../gui-wx/wxgolly.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxgolly.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxgolly.Tpo $(DEPDIR)/golly-wxgolly.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxgolly.cpp' object='golly-wxgolly.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxgolly.obj `if test -f '../../gui-wx/wxgolly.cpp'; then $(CYGPATH_W) '../../gui-wx/wxgolly.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxgolly.cpp'; fi` golly-wxhelp.o: ../../gui-wx/wxhelp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxhelp.o -MD -MP -MF $(DEPDIR)/golly-wxhelp.Tpo -c -o golly-wxhelp.o `test -f '../../gui-wx/wxhelp.cpp' || echo '$(srcdir)/'`../../gui-wx/wxhelp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxhelp.Tpo $(DEPDIR)/golly-wxhelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxhelp.cpp' object='golly-wxhelp.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxhelp.o `test -f '../../gui-wx/wxhelp.cpp' || echo '$(srcdir)/'`../../gui-wx/wxhelp.cpp golly-wxhelp.obj: ../../gui-wx/wxhelp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxhelp.obj -MD -MP -MF $(DEPDIR)/golly-wxhelp.Tpo -c -o golly-wxhelp.obj `if test -f '../../gui-wx/wxhelp.cpp'; then $(CYGPATH_W) '../../gui-wx/wxhelp.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxhelp.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxhelp.Tpo $(DEPDIR)/golly-wxhelp.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxhelp.cpp' object='golly-wxhelp.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxhelp.obj `if test -f '../../gui-wx/wxhelp.cpp'; then $(CYGPATH_W) '../../gui-wx/wxhelp.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxhelp.cpp'; fi` golly-wxinfo.o: ../../gui-wx/wxinfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxinfo.o -MD -MP -MF $(DEPDIR)/golly-wxinfo.Tpo -c -o golly-wxinfo.o `test -f '../../gui-wx/wxinfo.cpp' || echo '$(srcdir)/'`../../gui-wx/wxinfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxinfo.Tpo $(DEPDIR)/golly-wxinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxinfo.cpp' object='golly-wxinfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxinfo.o `test -f '../../gui-wx/wxinfo.cpp' || echo '$(srcdir)/'`../../gui-wx/wxinfo.cpp golly-wxinfo.obj: ../../gui-wx/wxinfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxinfo.obj -MD -MP -MF $(DEPDIR)/golly-wxinfo.Tpo -c -o golly-wxinfo.obj `if test -f '../../gui-wx/wxinfo.cpp'; then $(CYGPATH_W) '../../gui-wx/wxinfo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxinfo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxinfo.Tpo $(DEPDIR)/golly-wxinfo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxinfo.cpp' object='golly-wxinfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxinfo.obj `if test -f '../../gui-wx/wxinfo.cpp'; then $(CYGPATH_W) '../../gui-wx/wxinfo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxinfo.cpp'; fi` golly-wxlayer.o: ../../gui-wx/wxlayer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxlayer.o -MD -MP -MF $(DEPDIR)/golly-wxlayer.Tpo -c -o golly-wxlayer.o `test -f '../../gui-wx/wxlayer.cpp' || echo '$(srcdir)/'`../../gui-wx/wxlayer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxlayer.Tpo $(DEPDIR)/golly-wxlayer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxlayer.cpp' object='golly-wxlayer.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxlayer.o `test -f '../../gui-wx/wxlayer.cpp' || echo '$(srcdir)/'`../../gui-wx/wxlayer.cpp golly-wxlayer.obj: ../../gui-wx/wxlayer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxlayer.obj -MD -MP -MF $(DEPDIR)/golly-wxlayer.Tpo -c -o golly-wxlayer.obj `if test -f '../../gui-wx/wxlayer.cpp'; then $(CYGPATH_W) '../../gui-wx/wxlayer.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxlayer.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxlayer.Tpo $(DEPDIR)/golly-wxlayer.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxlayer.cpp' object='golly-wxlayer.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxlayer.obj `if test -f '../../gui-wx/wxlayer.cpp'; then $(CYGPATH_W) '../../gui-wx/wxlayer.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxlayer.cpp'; fi` golly-wxmain.o: ../../gui-wx/wxmain.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxmain.o -MD -MP -MF $(DEPDIR)/golly-wxmain.Tpo -c -o golly-wxmain.o `test -f '../../gui-wx/wxmain.cpp' || echo '$(srcdir)/'`../../gui-wx/wxmain.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxmain.Tpo $(DEPDIR)/golly-wxmain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxmain.cpp' object='golly-wxmain.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxmain.o `test -f '../../gui-wx/wxmain.cpp' || echo '$(srcdir)/'`../../gui-wx/wxmain.cpp golly-wxmain.obj: ../../gui-wx/wxmain.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxmain.obj -MD -MP -MF $(DEPDIR)/golly-wxmain.Tpo -c -o golly-wxmain.obj `if test -f '../../gui-wx/wxmain.cpp'; then $(CYGPATH_W) '../../gui-wx/wxmain.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxmain.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxmain.Tpo $(DEPDIR)/golly-wxmain.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxmain.cpp' object='golly-wxmain.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxmain.obj `if test -f '../../gui-wx/wxmain.cpp'; then $(CYGPATH_W) '../../gui-wx/wxmain.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxmain.cpp'; fi` golly-wxperl.o: ../../gui-wx/wxperl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxperl.o -MD -MP -MF $(DEPDIR)/golly-wxperl.Tpo -c -o golly-wxperl.o `test -f '../../gui-wx/wxperl.cpp' || echo '$(srcdir)/'`../../gui-wx/wxperl.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxperl.Tpo $(DEPDIR)/golly-wxperl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxperl.cpp' object='golly-wxperl.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxperl.o `test -f '../../gui-wx/wxperl.cpp' || echo '$(srcdir)/'`../../gui-wx/wxperl.cpp golly-wxperl.obj: ../../gui-wx/wxperl.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxperl.obj -MD -MP -MF $(DEPDIR)/golly-wxperl.Tpo -c -o golly-wxperl.obj `if test -f '../../gui-wx/wxperl.cpp'; then $(CYGPATH_W) '../../gui-wx/wxperl.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxperl.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxperl.Tpo $(DEPDIR)/golly-wxperl.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxperl.cpp' object='golly-wxperl.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxperl.obj `if test -f '../../gui-wx/wxperl.cpp'; then $(CYGPATH_W) '../../gui-wx/wxperl.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxperl.cpp'; fi` golly-wxprefs.o: ../../gui-wx/wxprefs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxprefs.o -MD -MP -MF $(DEPDIR)/golly-wxprefs.Tpo -c -o golly-wxprefs.o `test -f '../../gui-wx/wxprefs.cpp' || echo '$(srcdir)/'`../../gui-wx/wxprefs.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxprefs.Tpo $(DEPDIR)/golly-wxprefs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxprefs.cpp' object='golly-wxprefs.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxprefs.o `test -f '../../gui-wx/wxprefs.cpp' || echo '$(srcdir)/'`../../gui-wx/wxprefs.cpp golly-wxprefs.obj: ../../gui-wx/wxprefs.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxprefs.obj -MD -MP -MF $(DEPDIR)/golly-wxprefs.Tpo -c -o golly-wxprefs.obj `if test -f '../../gui-wx/wxprefs.cpp'; then $(CYGPATH_W) '../../gui-wx/wxprefs.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxprefs.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxprefs.Tpo $(DEPDIR)/golly-wxprefs.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxprefs.cpp' object='golly-wxprefs.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxprefs.obj `if test -f '../../gui-wx/wxprefs.cpp'; then $(CYGPATH_W) '../../gui-wx/wxprefs.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxprefs.cpp'; fi` golly-wxpython.o: ../../gui-wx/wxpython.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxpython.o -MD -MP -MF $(DEPDIR)/golly-wxpython.Tpo -c -o golly-wxpython.o `test -f '../../gui-wx/wxpython.cpp' || echo '$(srcdir)/'`../../gui-wx/wxpython.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxpython.Tpo $(DEPDIR)/golly-wxpython.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxpython.cpp' object='golly-wxpython.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxpython.o `test -f '../../gui-wx/wxpython.cpp' || echo '$(srcdir)/'`../../gui-wx/wxpython.cpp golly-wxpython.obj: ../../gui-wx/wxpython.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxpython.obj -MD -MP -MF $(DEPDIR)/golly-wxpython.Tpo -c -o golly-wxpython.obj `if test -f '../../gui-wx/wxpython.cpp'; then $(CYGPATH_W) '../../gui-wx/wxpython.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxpython.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxpython.Tpo $(DEPDIR)/golly-wxpython.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxpython.cpp' object='golly-wxpython.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxpython.obj `if test -f '../../gui-wx/wxpython.cpp'; then $(CYGPATH_W) '../../gui-wx/wxpython.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxpython.cpp'; fi` golly-wxrender.o: ../../gui-wx/wxrender.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxrender.o -MD -MP -MF $(DEPDIR)/golly-wxrender.Tpo -c -o golly-wxrender.o `test -f '../../gui-wx/wxrender.cpp' || echo '$(srcdir)/'`../../gui-wx/wxrender.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxrender.Tpo $(DEPDIR)/golly-wxrender.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxrender.cpp' object='golly-wxrender.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxrender.o `test -f '../../gui-wx/wxrender.cpp' || echo '$(srcdir)/'`../../gui-wx/wxrender.cpp golly-wxrender.obj: ../../gui-wx/wxrender.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxrender.obj -MD -MP -MF $(DEPDIR)/golly-wxrender.Tpo -c -o golly-wxrender.obj `if test -f '../../gui-wx/wxrender.cpp'; then $(CYGPATH_W) '../../gui-wx/wxrender.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxrender.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxrender.Tpo $(DEPDIR)/golly-wxrender.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxrender.cpp' object='golly-wxrender.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxrender.obj `if test -f '../../gui-wx/wxrender.cpp'; then $(CYGPATH_W) '../../gui-wx/wxrender.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxrender.cpp'; fi` golly-wxrule.o: ../../gui-wx/wxrule.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxrule.o -MD -MP -MF $(DEPDIR)/golly-wxrule.Tpo -c -o golly-wxrule.o `test -f '../../gui-wx/wxrule.cpp' || echo '$(srcdir)/'`../../gui-wx/wxrule.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxrule.Tpo $(DEPDIR)/golly-wxrule.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxrule.cpp' object='golly-wxrule.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxrule.o `test -f '../../gui-wx/wxrule.cpp' || echo '$(srcdir)/'`../../gui-wx/wxrule.cpp golly-wxrule.obj: ../../gui-wx/wxrule.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxrule.obj -MD -MP -MF $(DEPDIR)/golly-wxrule.Tpo -c -o golly-wxrule.obj `if test -f '../../gui-wx/wxrule.cpp'; then $(CYGPATH_W) '../../gui-wx/wxrule.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxrule.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxrule.Tpo $(DEPDIR)/golly-wxrule.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxrule.cpp' object='golly-wxrule.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxrule.obj `if test -f '../../gui-wx/wxrule.cpp'; then $(CYGPATH_W) '../../gui-wx/wxrule.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxrule.cpp'; fi` golly-wxscript.o: ../../gui-wx/wxscript.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxscript.o -MD -MP -MF $(DEPDIR)/golly-wxscript.Tpo -c -o golly-wxscript.o `test -f '../../gui-wx/wxscript.cpp' || echo '$(srcdir)/'`../../gui-wx/wxscript.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxscript.Tpo $(DEPDIR)/golly-wxscript.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxscript.cpp' object='golly-wxscript.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxscript.o `test -f '../../gui-wx/wxscript.cpp' || echo '$(srcdir)/'`../../gui-wx/wxscript.cpp golly-wxscript.obj: ../../gui-wx/wxscript.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxscript.obj -MD -MP -MF $(DEPDIR)/golly-wxscript.Tpo -c -o golly-wxscript.obj `if test -f '../../gui-wx/wxscript.cpp'; then $(CYGPATH_W) '../../gui-wx/wxscript.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxscript.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxscript.Tpo $(DEPDIR)/golly-wxscript.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxscript.cpp' object='golly-wxscript.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxscript.obj `if test -f '../../gui-wx/wxscript.cpp'; then $(CYGPATH_W) '../../gui-wx/wxscript.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxscript.cpp'; fi` golly-wxselect.o: ../../gui-wx/wxselect.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxselect.o -MD -MP -MF $(DEPDIR)/golly-wxselect.Tpo -c -o golly-wxselect.o `test -f '../../gui-wx/wxselect.cpp' || echo '$(srcdir)/'`../../gui-wx/wxselect.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxselect.Tpo $(DEPDIR)/golly-wxselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxselect.cpp' object='golly-wxselect.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxselect.o `test -f '../../gui-wx/wxselect.cpp' || echo '$(srcdir)/'`../../gui-wx/wxselect.cpp golly-wxselect.obj: ../../gui-wx/wxselect.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxselect.obj -MD -MP -MF $(DEPDIR)/golly-wxselect.Tpo -c -o golly-wxselect.obj `if test -f '../../gui-wx/wxselect.cpp'; then $(CYGPATH_W) '../../gui-wx/wxselect.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxselect.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxselect.Tpo $(DEPDIR)/golly-wxselect.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxselect.cpp' object='golly-wxselect.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxselect.obj `if test -f '../../gui-wx/wxselect.cpp'; then $(CYGPATH_W) '../../gui-wx/wxselect.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxselect.cpp'; fi` golly-wxstatus.o: ../../gui-wx/wxstatus.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxstatus.o -MD -MP -MF $(DEPDIR)/golly-wxstatus.Tpo -c -o golly-wxstatus.o `test -f '../../gui-wx/wxstatus.cpp' || echo '$(srcdir)/'`../../gui-wx/wxstatus.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxstatus.Tpo $(DEPDIR)/golly-wxstatus.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxstatus.cpp' object='golly-wxstatus.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxstatus.o `test -f '../../gui-wx/wxstatus.cpp' || echo '$(srcdir)/'`../../gui-wx/wxstatus.cpp golly-wxstatus.obj: ../../gui-wx/wxstatus.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxstatus.obj -MD -MP -MF $(DEPDIR)/golly-wxstatus.Tpo -c -o golly-wxstatus.obj `if test -f '../../gui-wx/wxstatus.cpp'; then $(CYGPATH_W) '../../gui-wx/wxstatus.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxstatus.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxstatus.Tpo $(DEPDIR)/golly-wxstatus.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxstatus.cpp' object='golly-wxstatus.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxstatus.obj `if test -f '../../gui-wx/wxstatus.cpp'; then $(CYGPATH_W) '../../gui-wx/wxstatus.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxstatus.cpp'; fi` golly-wxtimeline.o: ../../gui-wx/wxtimeline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxtimeline.o -MD -MP -MF $(DEPDIR)/golly-wxtimeline.Tpo -c -o golly-wxtimeline.o `test -f '../../gui-wx/wxtimeline.cpp' || echo '$(srcdir)/'`../../gui-wx/wxtimeline.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxtimeline.Tpo $(DEPDIR)/golly-wxtimeline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxtimeline.cpp' object='golly-wxtimeline.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxtimeline.o `test -f '../../gui-wx/wxtimeline.cpp' || echo '$(srcdir)/'`../../gui-wx/wxtimeline.cpp golly-wxtimeline.obj: ../../gui-wx/wxtimeline.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxtimeline.obj -MD -MP -MF $(DEPDIR)/golly-wxtimeline.Tpo -c -o golly-wxtimeline.obj `if test -f '../../gui-wx/wxtimeline.cpp'; then $(CYGPATH_W) '../../gui-wx/wxtimeline.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxtimeline.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxtimeline.Tpo $(DEPDIR)/golly-wxtimeline.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxtimeline.cpp' object='golly-wxtimeline.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxtimeline.obj `if test -f '../../gui-wx/wxtimeline.cpp'; then $(CYGPATH_W) '../../gui-wx/wxtimeline.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxtimeline.cpp'; fi` golly-wxundo.o: ../../gui-wx/wxundo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxundo.o -MD -MP -MF $(DEPDIR)/golly-wxundo.Tpo -c -o golly-wxundo.o `test -f '../../gui-wx/wxundo.cpp' || echo '$(srcdir)/'`../../gui-wx/wxundo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxundo.Tpo $(DEPDIR)/golly-wxundo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxundo.cpp' object='golly-wxundo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxundo.o `test -f '../../gui-wx/wxundo.cpp' || echo '$(srcdir)/'`../../gui-wx/wxundo.cpp golly-wxundo.obj: ../../gui-wx/wxundo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxundo.obj -MD -MP -MF $(DEPDIR)/golly-wxundo.Tpo -c -o golly-wxundo.obj `if test -f '../../gui-wx/wxundo.cpp'; then $(CYGPATH_W) '../../gui-wx/wxundo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxundo.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxundo.Tpo $(DEPDIR)/golly-wxundo.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxundo.cpp' object='golly-wxundo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxundo.obj `if test -f '../../gui-wx/wxundo.cpp'; then $(CYGPATH_W) '../../gui-wx/wxundo.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxundo.cpp'; fi` golly-wxutils.o: ../../gui-wx/wxutils.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxutils.o -MD -MP -MF $(DEPDIR)/golly-wxutils.Tpo -c -o golly-wxutils.o `test -f '../../gui-wx/wxutils.cpp' || echo '$(srcdir)/'`../../gui-wx/wxutils.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxutils.Tpo $(DEPDIR)/golly-wxutils.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxutils.cpp' object='golly-wxutils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxutils.o `test -f '../../gui-wx/wxutils.cpp' || echo '$(srcdir)/'`../../gui-wx/wxutils.cpp golly-wxutils.obj: ../../gui-wx/wxutils.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxutils.obj -MD -MP -MF $(DEPDIR)/golly-wxutils.Tpo -c -o golly-wxutils.obj `if test -f '../../gui-wx/wxutils.cpp'; then $(CYGPATH_W) '../../gui-wx/wxutils.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxutils.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxutils.Tpo $(DEPDIR)/golly-wxutils.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxutils.cpp' object='golly-wxutils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxutils.obj `if test -f '../../gui-wx/wxutils.cpp'; then $(CYGPATH_W) '../../gui-wx/wxutils.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxutils.cpp'; fi` golly-wxview.o: ../../gui-wx/wxview.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxview.o -MD -MP -MF $(DEPDIR)/golly-wxview.Tpo -c -o golly-wxview.o `test -f '../../gui-wx/wxview.cpp' || echo '$(srcdir)/'`../../gui-wx/wxview.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxview.Tpo $(DEPDIR)/golly-wxview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxview.cpp' object='golly-wxview.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxview.o `test -f '../../gui-wx/wxview.cpp' || echo '$(srcdir)/'`../../gui-wx/wxview.cpp golly-wxview.obj: ../../gui-wx/wxview.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -MT golly-wxview.obj -MD -MP -MF $(DEPDIR)/golly-wxview.Tpo -c -o golly-wxview.obj `if test -f '../../gui-wx/wxview.cpp'; then $(CYGPATH_W) '../../gui-wx/wxview.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxview.cpp'; fi` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/golly-wxview.Tpo $(DEPDIR)/golly-wxview.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='../../gui-wx/wxview.cpp' object='golly-wxview.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(golly_CPPFLAGS) $(CPPFLAGS) $(golly_CXXFLAGS) $(CXXFLAGS) -c -o golly-wxview.obj `if test -f '../../gui-wx/wxview.cpp'; then $(CYGPATH_W) '../../gui-wx/wxview.cpp'; else $(CYGPATH_W) '$(srcdir)/../../gui-wx/wxview.cpp'; fi` install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) install-nobase_dist_gollydataDATA: $(nobase_dist_gollydata_DATA) @$(NORMAL_INSTALL) @list='$(nobase_dist_gollydata_DATA)'; test -n "$(gollydatadir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(gollydatadir)'"; \ $(MKDIR_P) "$(DESTDIR)$(gollydatadir)" || exit 1; \ fi; \ $(am__nobase_list) | while read dir files; do \ xfiles=; for file in $$files; do \ if test -f "$$file"; then xfiles="$$xfiles $$file"; \ else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \ test -z "$$xfiles" || { \ test "x$$dir" = x. || { \ echo " $(MKDIR_P) '$(DESTDIR)$(gollydatadir)/$$dir'"; \ $(MKDIR_P) "$(DESTDIR)$(gollydatadir)/$$dir"; }; \ echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(gollydatadir)/$$dir'"; \ $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(gollydatadir)/$$dir" || exit $$?; }; \ done uninstall-nobase_dist_gollydataDATA: @$(NORMAL_UNINSTALL) @list='$(nobase_dist_gollydata_DATA)'; test -n "$(gollydatadir)" || list=; \ $(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \ dir='$(DESTDIR)$(gollydatadir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(PROGRAMS) $(DATA) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(docdir)" "$(DESTDIR)$(gollydatadir)"; 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \ clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-docDATA install-nobase_dist_gollydataDATA install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-docDATA \ uninstall-nobase_dist_gollydataDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-am clean \ clean-binPROGRAMS clean-cscope clean-generic \ clean-noinstLIBRARIES clean-noinstPROGRAMS cscope \ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ distcheck distclean distclean-compile distclean-generic \ distclean-tags distcleancheck distdir distuninstallcheck dvi \ dvi-am html html-am info info-am install install-am \ install-binPROGRAMS install-data install-data-am \ install-docDATA install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-nobase_dist_gollydataDATA \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-docDATA uninstall-nobase_dist_gollydataDATA @WINDOWS_TRUE@gollyres.o: ../golly.rc; $(WX_RESCOMP) $< $@ srcdist: mkdir -p $(srcdistdir)/gui-wx/configure make distdir=$(srcdistdir)/gui-wx/configure distdir tardir=$(srcdistdir) && $(am__tar) \ | GZIP=$(GZIP_ENV) gzip -c >$(srcdistdir).tar.gz rm -r $(srcdistdir) bindist: make bindir=/ pkgdatadir=/ docdir=/ GOLLYDIR= \ DESTDIR=$(builddir)/$(bindistdir) clean all install-strip tardir=$(bindistdir) && $(am__tar) \ | GZIP=$(GZIP_ENV) gzip -c >$(bindistdir).tar.gz rm -r $(bindistdir) # 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: golly-2.5-src/gui-wx/configure/Makefile.am0000644000175100001440000000242712156144506015457 00000000000000ACLOCAL_AMFLAGS = -I m4 AM_CPPFLAGS = -I$(top_srcdir)/../../gollybase/ AM_CXXFLAGS = -DGOLLYDIR="$(GOLLYDIR)" -Wall -fno-strict-aliasing AM_LDFLAGS = -Wl,--as-needed bin_PROGRAMS = golly bgolly noinst_PROGRAMS = RuleTableToTree noinst_LIBRARIES = libgolly.a doc_DATA = ../../docs/License.html ../../docs/ReadMe.html include sources.am golly_CPPFLAGS = $(AM_CPPFLAGS) $(WX_CPPFLAGS) $(PERL_INCLUDE) $(PYTHON_INCLUDE) golly_CXXFLAGS = $(AM_CXXFLAGS) $(WX_CXXFLAGS_ONLY) golly_LDADD = $(WX_LIBS) libgolly.a if WINDOWS golly_LDADD += gollyres.o gollyres.o: ../golly.rc; $(WX_RESCOMP) $< $@ endif bgolly_SOURCES = ../../cmdline/bgolly.cpp bgolly_LDADD = libgolly.a RuleTableToTree_SOURCES = ../../cmdline/RuleTableToTree.cpp RuleTableToTree_LDADD = libgolly.a srcdistdir=$(PACKAGE)-$(VERSION)$(SRCDISTSUFFIX) bindistdir=$(PACKAGE)-$(VERSION)$(BINDISTSUFFIX) srcdist: mkdir -p $(srcdistdir)/gui-wx/configure make distdir=$(srcdistdir)/gui-wx/configure distdir tardir=$(srcdistdir) && $(am__tar) \ | GZIP=$(GZIP_ENV) gzip -c >$(srcdistdir).tar.gz rm -r $(srcdistdir) bindist: make bindir=/ pkgdatadir=/ docdir=/ GOLLYDIR= \ DESTDIR=$(builddir)/$(bindistdir) clean all install-strip tardir=$(bindistdir) && $(am__tar) \ | GZIP=$(GZIP_ENV) gzip -c >$(bindistdir).tar.gz rm -r $(bindistdir) golly-2.5-src/gui-wx/configure/configure0000755000175100001440000073177112156145630015344 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for golly 2.5. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='golly' PACKAGE_TARNAME='golly' PACKAGE_VERSION='2.5' PACKAGE_STRING='golly 2.5' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="../../cmdline/bgolly.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LINUX_FALSE LINUX_TRUE MAC_FALSE MAC_TRUE WINDOWS_FALSE WINDOWS_TRUE SRCDISTSUFFIX BINDISTSUFFIX PYTHON_INCLUDE PERL_INCLUDE RESCOMP_FALSE RESCOMP_TRUE WX_PORT WX_SHARED WX_DEBUG WX_UNICODE WX_VERSION_MICRO WX_VERSION_MINOR WX_VERSION_MAJOR WX_RESCOMP WX_VERSION WX_LIBS_STATIC WX_LIBS WX_CXXFLAGS_ONLY WX_CFLAGS_ONLY WX_CXXFLAGS WX_CFLAGS WX_CPPFLAGS WX_CONFIG_PATH LIBOBJS CPP OBJDUMP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX RANLIB SED EGREP GREP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ac_ct_AR AR PYTHON PERL GOLLYDIR AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules with_zlib with_perl_shlib with_python_shlib enable_dependency_tracking enable_largefile with_wxdir with_wx_config with_wx_prefix with_wx_exec_prefix enable_debug enable_unicode enable_shared with_toolkit with_wxshared ' ac_precious_vars='build_alias host_alias target_alias GOLLYDIR PERL PYTHON CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= 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=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -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_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$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 ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$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 | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$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 ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) 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 | -n) 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 ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$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_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=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 ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # 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 the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` 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 test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # 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 <<_ACEOF \`configure' configures golly 2.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/golly] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --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 System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of golly 2.5:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-largefile omit support for large files --enable-debug Build in debug mode (default is auto) --enable-unicode Build in Unicode mode (default is auto) --enable-shared Build as shared library (default is auto) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-zlib support reading compressed pattern files with zlib --with-perl-shlib=ARG name of the Perl library when loaded dynamically (e.g. libperl.so.5.12) --with-python-shlib=ARG name of the Python library when loaded dynamically (e.g. libpython2.6.so) --with-wxdir=PATH Use uninstalled version of wxWidgets in PATH --with-wx-config=CONFIG wx-config script to use (optional) --with-wx-prefix=PREFIX Prefix where wxWidgets is installed (optional) --with-wx-exec-prefix=PREFIX Exec prefix where wxWidgets is installed (optional) --with-toolkit Build against a specific wxWidgets toolkit (default is auto) --with-wxshared Force building against a shared build of wxWidgets, even if --disable-shared is given (default is auto) Some influential environment variables: GOLLYDIR golly data directory [default=DATADIR/golly] PERL Perl 5 interpreter PYTHON Python 2 interpreter CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF golly configure 2.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* 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_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by golly $as_me 2.5, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu 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 elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.13' # 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 # AmigaOS /C/install, which installs bootblocks on floppy discs # 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" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /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 for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir 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. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&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}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # 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 ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $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". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file 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" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='golly' VERSION='2.5' # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Custom configure arguments: # Check whether --with-zlib was given. if test "${with_zlib+set}" = set; then : withval=$with_zlib; else with_zlib=yes fi # Check whether --with-perl-shlib was given. if test "${with_perl_shlib+set}" = set; then : withval=$with_perl_shlib; else with_perl_shlib=check fi # Check whether --with-python-shlib was given. if test "${with_python_shlib+set}" = set; then : withval=$with_python_shlib; else with_python_shlib=check fi # Check for build tools: DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi 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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_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 $# != 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 ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* 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; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; 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; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} { $as_echo "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 $as_echo_n "checking the archiver ($AR) interface... " >&6; } if ${am_cv_ar_interface+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 $as_echo "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi if test "x$OBJDUMP" = x; then : as_fn_error $? "missing objdump" "$LINENO" 5 fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi # Check for standard header files: ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else 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 confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #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)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in inttypes.h limits.h stdint.h stdlib.h string.h sys/time.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Check for compiler characteristics: ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi # Check for large file support (enabled by default) # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi # Check for library functions for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if ${ac_cv_func_realloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "#define HAVE_REALLOC 1" >>confdefs.h else $as_echo "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac $as_echo "#define realloc rpl_realloc" >>confdefs.h fi for ac_func in gettimeofday memset pow strchr strdup strrchr do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Find wxWidgets # Check whether --with-wxdir was given. if test "${with_wxdir+set}" = set; then : withval=$with_wxdir; wx_config_name="$withval/wx-config" wx_config_args="--inplace" fi # Check whether --with-wx-config was given. if test "${with_wx_config+set}" = set; then : withval=$with_wx_config; wx_config_name="$withval" fi # Check whether --with-wx-prefix was given. if test "${with_wx_prefix+set}" = set; then : withval=$with_wx_prefix; wx_config_prefix="$withval" else wx_config_prefix="" fi # Check whether --with-wx-exec-prefix was given. if test "${with_wx_exec_prefix+set}" = set; then : withval=$with_wx_exec_prefix; wx_config_exec_prefix="$withval" else wx_config_exec_prefix="" fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; else enableval="auto" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the --enable-debug option" >&5 $as_echo_n "checking for the --enable-debug option... " >&6; } if test "$enableval" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } DEBUG=1 elif test "$enableval" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } DEBUG=0 elif test "$enableval" = "auto" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: will be automatically detected" >&5 $as_echo "will be automatically detected" >&6; } DEBUG="auto" else as_fn_error $? " Unrecognized option value (allowed values: yes, no, auto) " "$LINENO" 5 fi # Check whether --enable-unicode was given. if test "${enable_unicode+set}" = set; then : enableval=$enable_unicode; else enableval="auto" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the --enable-unicode option" >&5 $as_echo_n "checking for the --enable-unicode option... " >&6; } if test "$enableval" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } UNICODE=1 elif test "$enableval" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } UNICODE=0 elif test "$enableval" = "auto" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: will be automatically detected" >&5 $as_echo "will be automatically detected" >&6; } UNICODE="auto" else as_fn_error $? " Unrecognized option value (allowed values: yes, no, auto) " "$LINENO" 5 fi # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; else enableval="auto" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the --enable-shared option" >&5 $as_echo_n "checking for the --enable-shared option... " >&6; } if test "$enableval" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SHARED=1 elif test "$enableval" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SHARED=0 elif test "$enableval" = "auto" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: will be automatically detected" >&5 $as_echo "will be automatically detected" >&6; } SHARED="auto" else as_fn_error $? " Unrecognized option value (allowed values: yes, no, auto) " "$LINENO" 5 fi # Check whether --with-toolkit was given. if test "${with_toolkit+set}" = set; then : withval=$with_toolkit; else withval="auto" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the --with-toolkit option" >&5 $as_echo_n "checking for the --with-toolkit option... " >&6; } if test "$withval" = "auto" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: will be automatically detected" >&5 $as_echo "will be automatically detected" >&6; } TOOLKIT="auto" else TOOLKIT="$withval" if test "$TOOLKIT" != "gtk1" -a "$TOOLKIT" != "gtk2" -a \ "$TOOLKIT" != "msw" -a "$TOOLKIT" != "motif" -a \ "$TOOLKIT" != "x11" -a "$TOOLKIT" != "mac" -a \ "$TOOLKIT" != "mgl" -a "$TOOLKIT" != "dfb" ; then as_fn_error $? " Unrecognized option value (allowed values: auto, gtk1, gtk2, msw, motif, x11, mac, mgl, dfb) " "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TOOLKIT" >&5 $as_echo "$TOOLKIT" >&6; } fi # Check whether --with-wxshared was given. if test "${with_wxshared+set}" = set; then : withval=$with_wxshared; else withval="auto" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the --with-wxshared option" >&5 $as_echo_n "checking for the --with-wxshared option... " >&6; } if test "$withval" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } WX_SHARED=1 elif test "1" = "1" -a "$withval" = "no" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } WX_SHARED=0 elif test "$withval" = "auto" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: will be automatically detected" >&5 $as_echo "will be automatically detected" >&6; } WX_SHARED="auto" else as_fn_error $? " Unrecognized option value (allowed values: yes, auto) " "$LINENO" 5 fi if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[dbg] DEBUG: $DEBUG, WX_DEBUG: $WX_DEBUG" echo "[dbg] UNICODE: $UNICODE, WX_UNICODE: $WX_UNICODE" echo "[dbg] SHARED: $SHARED, WX_SHARED: $WX_SHARED" echo "[dbg] TOOLKIT: $TOOLKIT, WX_TOOLKIT: $WX_TOOLKIT" echo "[dbg] VERSION: $VERSION, WX_RELEASE: $WX_RELEASE" fi WX_DEBUG=$DEBUG WX_UNICODE=$UNICODE if test "$WX_SHARED" = "1" ; then WXCONFIG_FLAGS="--static=no " elif test "$WX_SHARED" = "0" ; then WXCONFIG_FLAGS="--static=yes " fi if test "$WX_DEBUG" = "1" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=yes " elif test "$WX_DEBUG" = "0" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--debug=no " fi if test "$WX_UNICODE" = "1" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=yes " elif test "$WX_UNICODE" = "0" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--unicode=no " fi if test "$TOOLKIT" != "auto" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--toolkit=$TOOLKIT " fi if test "$WX_RELEASE" != "auto" ; then WXCONFIG_FLAGS="$WXCONFIG_FLAGS""--version=$WX_RELEASE " fi WXCONFIG_FLAGS=${WXCONFIG_FLAGS% } if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[dbg] WXCONFIG_FLAGS: $WXCONFIG_FLAGS" fi if test x${WX_CONFIG_NAME+set} != xset ; then WX_CONFIG_NAME=wx-config fi if test "x$wx_config_name" != x ; then WX_CONFIG_NAME="$wx_config_name" fi if test x$wx_config_exec_prefix != x ; then wx_config_args="$wx_config_args --exec-prefix=$wx_config_exec_prefix" WX_LOOKUP_PATH="$wx_config_exec_prefix/bin" fi if test x$wx_config_prefix != x ; then wx_config_args="$wx_config_args --prefix=$wx_config_prefix" WX_LOOKUP_PATH="$WX_LOOKUP_PATH:$wx_config_prefix/bin" fi if test "$cross_compiling" = "yes"; then wx_config_args="$wx_config_args --host=$host_alias" fi if test -x "$WX_CONFIG_NAME" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wx-config" >&5 $as_echo_n "checking for wx-config... " >&6; } WX_CONFIG_PATH="$WX_CONFIG_NAME" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else # Extract the first word of "$WX_CONFIG_NAME", so it can be a program name with args. set dummy $WX_CONFIG_NAME; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_WX_CONFIG_PATH+:} false; then : $as_echo_n "(cached) " >&6 else case $WX_CONFIG_PATH in [\\/]* | ?:[\\/]*) ac_cv_path_WX_CONFIG_PATH="$WX_CONFIG_PATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy=""$WX_LOOKUP_PATH:$PATH"" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_WX_CONFIG_PATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_WX_CONFIG_PATH" && ac_cv_path_WX_CONFIG_PATH="no" ;; esac fi WX_CONFIG_PATH=$ac_cv_path_WX_CONFIG_PATH if test -n "$WX_CONFIG_PATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_CONFIG_PATH" >&5 $as_echo "$WX_CONFIG_PATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$WX_CONFIG_PATH" != "no" ; then WX_VERSION="" min_wx_version=2.8.0 if test -z "$WXCONFIG_FLAGS" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets version >= $min_wx_version ($WXCONFIG_FLAGS)" >&5 $as_echo_n "checking for wxWidgets version >= $min_wx_version ($WXCONFIG_FLAGS)... " >&6; } fi WX_CONFIG_WITH_ARGS="$WX_CONFIG_PATH $wx_config_args $WXCONFIG_FLAGS" WX_VERSION=`$WX_CONFIG_WITH_ARGS --version 2>/dev/null` wx_config_major_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_config_minor_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_config_micro_version=`echo $WX_VERSION | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_requested_major_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` wx_requested_minor_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` wx_requested_micro_version=`echo $min_wx_version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` wx_ver_ok="" if test "x$WX_VERSION" != x ; then if test $wx_config_major_version -gt $wx_requested_major_version; then wx_ver_ok=yes else if test $wx_config_major_version -eq $wx_requested_major_version; then if test $wx_config_minor_version -gt $wx_requested_minor_version; then wx_ver_ok=yes else if test $wx_config_minor_version -eq $wx_requested_minor_version; then if test $wx_config_micro_version -ge $wx_requested_micro_version; then wx_ver_ok=yes fi fi fi fi fi fi if test -n "$wx_ver_ok"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (version $WX_VERSION)" >&5 $as_echo "yes (version $WX_VERSION)" >&6; } WX_LIBS=`$WX_CONFIG_WITH_ARGS --libs ` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for wxWidgets static library" >&5 $as_echo_n "checking for wxWidgets static library... " >&6; } WX_LIBS_STATIC=`$WX_CONFIG_WITH_ARGS --static --libs 2>/dev/null` if test "x$WX_LIBS_STATIC" = "x"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi wx_has_cppflags="" if test $wx_config_major_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -gt 2; then wx_has_cppflags=yes else if test $wx_config_minor_version -eq 2; then if test $wx_config_micro_version -ge 6; then wx_has_cppflags=yes fi fi fi fi fi wx_has_rescomp="" if test $wx_config_major_version -gt 2; then wx_has_rescomp=yes else if test $wx_config_major_version -eq 2; then if test $wx_config_minor_version -ge 7; then wx_has_rescomp=yes fi fi fi if test "x$wx_has_rescomp" = x ; then WX_RESCOMP= else WX_RESCOMP=`$WX_CONFIG_WITH_ARGS --rescomp` fi if test "x$wx_has_cppflags" = x ; then WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags ` WX_CPPFLAGS=$WX_CFLAGS WX_CXXFLAGS=$WX_CFLAGS WX_CFLAGS_ONLY=$WX_CFLAGS WX_CXXFLAGS_ONLY=$WX_CFLAGS else WX_CPPFLAGS=`$WX_CONFIG_WITH_ARGS --cppflags ` WX_CXXFLAGS=`$WX_CONFIG_WITH_ARGS --cxxflags ` WX_CFLAGS=`$WX_CONFIG_WITH_ARGS --cflags ` WX_CFLAGS_ONLY=`echo $WX_CFLAGS | sed "s@^$WX_CPPFLAGS *@@"` WX_CXXFLAGS_ONLY=`echo $WX_CXXFLAGS | sed "s@^$WX_CFLAGS *@@"` fi : else if test "x$WX_VERSION" = x; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (version $WX_VERSION is not new enough)" >&5 $as_echo "no (version $WX_VERSION is not new enough)" >&6; } fi WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" if test ! -z "$WXCONFIG_FLAGS"; then wx_error_message=" The configuration you asked for $PACKAGE_NAME requires a wxWidgets build with the following settings: $WXCONFIG_FLAGS but such build is not available. To see the wxWidgets builds available on this system, please use 'wx-config --list' command. To use the default build, returned by 'wx-config --selected-config', use the options with their 'auto' default values." fi wx_error_message=" The requested wxWidgets build couldn't be found. $wx_error_message If you still get this error, then check that 'wx-config' is in path, the directory where wxWidgets libraries are installed (returned by 'wx-config --libs' command) is in LD_LIBRARY_PATH or equivalent variable and wxWidgets version is 2.8.0 or above." as_fn_error $? "missing wxWidgets" "$LINENO" 5 fi else WX_CFLAGS="" WX_CPPFLAGS="" WX_CXXFLAGS="" WX_LIBS="" WX_LIBS_STATIC="" WX_RESCOMP="" as_fn_error $? "missing wxWidgets" "$LINENO" 5 fi WX_VERSION_MAJOR="$wx_config_major_version" WX_VERSION_MINOR="$wx_config_minor_version" WX_VERSION_MICRO="$wx_config_micro_version" WX_RELEASE="$WX_VERSION_MAJOR""$WX_VERSION_MINOR" if test $WX_RELEASE -lt 26 ; then as_fn_error $? " Cannot detect the wxWidgets configuration for the selected wxWidgets build since its version is $WX_VERSION < 2.6.0; please install a newer version of wxWidgets. " "$LINENO" 5 fi WX_SELECTEDCONFIG=$($WX_CONFIG_WITH_ARGS --selected_config) if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[dbg] Using wx-config --selected-config" echo "[dbg] WX_SELECTEDCONFIG: $WX_SELECTEDCONFIG" fi if test $WX_SHARED = "1"; then STATIC=0 elif test $WX_SHARED = "0"; then STATIC=1 elif test $WX_SHARED = "auto"; then STATIC="auto" fi if test "$UNICODE" = "auto" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if wxWidgets was built with UNICODE enabled" >&5 $as_echo_n "checking if wxWidgets was built with UNICODE enabled... " >&6; } WX_UNICODE=$(expr "$WX_SELECTEDCONFIG" : ".*unicode.*") if test "$WX_UNICODE" != "0"; then WX_UNICODE=1 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else WX_UNICODE=0 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi else WX_UNICODE=$UNICODE fi if test "$DEBUG" = "auto" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if wxWidgets was built in DEBUG mode" >&5 $as_echo_n "checking if wxWidgets was built in DEBUG mode... " >&6; } WX_DEBUG=$(expr "$WX_SELECTEDCONFIG" : ".*debug.*") if test "$WX_DEBUG" != "0"; then WX_DEBUG=1 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else WX_DEBUG=0 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi else WX_DEBUG=$DEBUG fi if test "$STATIC" = "auto" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if wxWidgets was built in STATIC mode" >&5 $as_echo_n "checking if wxWidgets was built in STATIC mode... " >&6; } WX_STATIC=$(expr "$WX_SELECTEDCONFIG" : ".*static.*") if test "$WX_STATIC" != "0"; then WX_STATIC=1 { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : else WX_STATIC=0 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } : fi else WX_STATIC=$STATIC fi if test "$WX_STATIC" != "0"; then WX_SHARED=0 else WX_SHARED=1 fi if test "$TOOLKIT" = "auto" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking which wxWidgets toolkit was selected" >&5 $as_echo_n "checking which wxWidgets toolkit was selected... " >&6; } WX_GTKPORT1=$(expr "$WX_SELECTEDCONFIG" : ".*gtk1.*") WX_GTKPORT2=$(expr "$WX_SELECTEDCONFIG" : ".*gtk2.*") WX_MSWPORT=$(expr "$WX_SELECTEDCONFIG" : ".*msw.*") WX_MOTIFPORT=$(expr "$WX_SELECTEDCONFIG" : ".*motif.*") WX_OSXCOCOAPORT=$(expr "$WX_SELECTEDCONFIG" : ".*osx_cocoa.*") WX_OSXCARBONPORT=$(expr "$WX_SELECTEDCONFIG" : ".*osx_carbon.*") WX_X11PORT=$(expr "$WX_SELECTEDCONFIG" : ".*x11.*") WX_MGLPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mgl.*") WX_DFBPORT=$(expr "$WX_SELECTEDCONFIG" : ".*dfb.*") WX_PORT="unknown" if test "$WX_GTKPORT1" != "0"; then WX_PORT="gtk1"; fi if test "$WX_GTKPORT2" != "0"; then WX_PORT="gtk2"; fi if test "$WX_MSWPORT" != "0"; then WX_PORT="msw"; fi if test "$WX_MOTIFPORT" != "0"; then WX_PORT="motif"; fi if test "$WX_OSXCOCOAPORT" != "0"; then WX_PORT="osx_cocoa"; fi if test "$WX_OSXCARBONPORT" != "0"; then WX_PORT="osx_carbon"; fi if test "$WX_X11PORT" != "0"; then WX_PORT="x11"; fi if test "$WX_MGLPORT" != "0"; then WX_PORT="mgl"; fi if test "$WX_DFBPORT" != "0"; then WX_PORT="dfb"; fi WX_MACPORT=$(expr "$WX_SELECTEDCONFIG" : ".*mac.*") if test "$WX_MACPORT" != "0"; then WX_PORT="mac"; fi if test "$WX_PORT" = "unknown" ; then as_fn_error $? " Cannot detect the currently installed wxWidgets port ! Please check your 'wx-config --cxxflags'... " "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WX_PORT" >&5 $as_echo "$WX_PORT" >&6; } else if test -z "$TOOLKIT" ; then WX_PORT=$TOOLKIT else WX_PORT=$PORT fi fi if test "$WX_DEBUG_CONFIGURE" = "1"; then echo "[dbg] Values of all WX_* options after final detection:" echo "[dbg] WX_DEBUG: $WX_DEBUG" echo "[dbg] WX_UNICODE: $WX_UNICODE" echo "[dbg] WX_SHARED: $WX_SHARED" echo "[dbg] WX_RELEASE: $WX_RELEASE" echo "[dbg] WX_PORT: $WX_PORT" fi if test "$WX_SHARED" = "0" -a "$SHARED" = "1"; then as_fn_error $? " Cannot build shared library against a static build of wxWidgets ! This error happens because the wxWidgets build which was selected has been detected as static while you asked to build $PACKAGE_NAME as shared library and this is not possible. Use the '--disable-shared' option to build $PACKAGE_NAME as static library or '--with-wxshared' to use wxWidgets as shared library. " "$LINENO" 5 fi if test "$DEBUG" = "auto"; then DEBUG=$WX_DEBUG fi if test "$UNICODE" = "auto"; then UNICODE=$WX_UNICODE fi if test "$SHARED" = "auto"; then SHARED=$WX_SHARED fi if test "$TOOLKIT" = "auto"; then TOOLKIT=$WX_PORT fi if test "$DEBUG" = "1"; then BUILD="debug" elif test "$DEBUG" = "0" -o "$DEBUG" = ""; then BUILD="release" fi if test "$DEBUG" = "1"; then CXXFLAGS="$CXXFLAGS -g -O0" CFLAGS="$CFLAGS -g -O0" else CXXFLAGS="$CXXFLAGS -O2" CFLAGS="$CFLAGS -O2" fi if test "x$WX_RESCOMP" != x; then RESCOMP_TRUE= RESCOMP_FALSE='#' else RESCOMP_TRUE='#' RESCOMP_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu save_CXXFLAGS=$CXXFLAGS save_LIBS=$LIBS CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS" LIBS="$LIBS $WX_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BMP image handler" >&5 $as_echo_n "checking for BMP image handler... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { new wxBMPHandler(); } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; $as_echo "#define HAVE_WX_BMP_HANDLER 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXXFLAGS=$save_CXXFLAGS LIBS=$save_LIBS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu save_CXXFLAGS=$CXXFLAGS save_LIBS=$LIBS CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS" LIBS="$LIBS $WX_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIF image handler" >&5 $as_echo_n "checking for GIF image handler... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { new wxGIFHandler(); } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; $as_echo "#define HAVE_WX_GIF_HANDLER 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXXFLAGS=$save_CXXFLAGS LIBS=$save_LIBS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu save_CXXFLAGS=$CXXFLAGS save_LIBS=$LIBS CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS" LIBS="$LIBS $WX_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PNG image handler" >&5 $as_echo_n "checking for PNG image handler... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { new wxPNGHandler(); } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; $as_echo "#define HAVE_WX_PNG_HANDLER 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXXFLAGS=$save_CXXFLAGS LIBS=$save_LIBS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu save_CXXFLAGS=$CXXFLAGS save_LIBS=$LIBS CXXFLAGS="$CXXFLAGS $WX_CXXFLAGS" LIBS="$LIBS $WX_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFF image handler" >&5 $as_echo_n "checking for TIFF image handler... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main() { new wxTIFFHandler(); } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; }; $as_echo "#define HAVE_WX_TIFF_HANDLER 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext CXXFLAGS=$save_CXXFLAGS LIBS=$save_LIBS ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Find Perl for ac_prog in perl5 perl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $PERL in [\\/]* | ?:[\\/]*) ac_cv_path_PERL="$PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PERL=$ac_cv_path_PERL if test -n "$PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PERL" >&5 $as_echo "$PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PERL" && break done if test "x$PERL" = x; then : as_fn_error $? "missing Perl" "$LINENO" 5 fi PERL_INCLUDE=`$PERL -MExtUtils::Embed -e ccopts` if test "x$with_perl_shlib" = xcheck; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl shared library used by $PERL" >&5 $as_echo_n "checking for perl shared library used by $PERL... " >&6; } shlib=`$OBJDUMP -p "$PERL" \ | $EGREP -i 'NEEDED +libperl[0-9.]*[.]so|DLL Name: +perl[0-9.]*[.]dll' \ | $SED 's/^.* //'` if test "x$shlib" != x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $shlib" >&5 $as_echo "$shlib" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } shlib= fi else shlib=$with_perl_shlib fi if test "x$shlib" = x; then : as_fn_error $? "could not determine Perl shared library name" "$LINENO" 5 fi cat >>confdefs.h <<_ACEOF #define PERL_SHLIB $shlib _ACEOF # Find Python for ac_prog in python2 python do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PYTHON+:} false; then : $as_echo_n "(cached) " >&6 else case $PYTHON in [\\/]* | ?:[\\/]*) ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PYTHON=$ac_cv_path_PYTHON if test -n "$PYTHON"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5 $as_echo "$PYTHON" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$PYTHON" && break done if test "x$PYTHON" = x; then : as_fn_error $? "missing Python" "$LINENO" 5 fi PYTHON_INCLUDE=-I"'`$PYTHON -c "import distutils.sysconfig; print(distutils.sysconfig.get_python_inc())"`'" if test "x$with_python_shlib" = xcheck; then : shlib=`$PYTHON -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('LDLIBRARY') or '')"` if test "x$shlib" = x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for python shared library used by $PYTHON" >&5 $as_echo_n "checking for python shared library used by $PYTHON... " >&6; } shlib=`$OBJDUMP -p "$PYTHON" \ | $EGREP -i 'NEEDED +libpython[0-9.]*[.]so|DLL Name: +python[0-9.]*[.]dll' \ | $SED 's/^.* //'` if test "x$shlib" != x; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: $shlib" >&5 $as_echo "$shlib" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } shlib= fi fi else shlib=$with_python_shlib fi if test "x$shlib" = x; then : as_fn_error $? "could not determine Python shared library name" "$LINENO" 5 fi cat >>confdefs.h <<_ACEOF #define PYTHON_SHLIB $shlib _ACEOF # Find zlib (unless explicitly disabled) if test "x$with_zlib" != xno; then : ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : else as_fn_error $? "missing zlib" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gzopen" >&5 $as_echo_n "checking for library containing gzopen... " >&6; } if ${ac_cv_search_gzopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gzopen (); int main () { return gzopen (); ; return 0; } _ACEOF for ac_lib in '' z; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_gzopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_gzopen+:} false; then : break fi done if ${ac_cv_search_gzopen+:} false; then : else ac_cv_search_gzopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gzopen" >&5 $as_echo "$ac_cv_search_gzopen" >&6; } ac_res=$ac_cv_search_gzopen if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else as_fn_error $? "missing zlib" "$LINENO" 5 fi $as_echo "#define ZLIB 1" >>confdefs.h fi # Definitions used in the source: cat >>confdefs.h <<_ACEOF #define VERSION $PACKAGE_VERSION _ACEOF GOLLYDIR=${GOLLYDIR:-'${pkgdatadir}'} # Determine which of three supported target operating systems we will compile # for, and set a suffix for binary distributions accordingly: case $target_os in cygwin* | mingw* | pw32* | cegcc*) id=win ;; darwin* | rhapsody*) id=mac ;; linux*) id=gtk ;; *) id= ;; esac case $target_cpu in *64) bits=64 ;; *) bits= ;; esac BINDISTSUFFIX=${id:+-$id$bits} SRCDISTSUFFIX=-src if test x$id = xwin ; then WINDOWS_TRUE= WINDOWS_FALSE='#' else WINDOWS_TRUE='#' WINDOWS_FALSE= fi if test x$id = xmac ; then MAC_TRUE= MAC_FALSE='#' else MAC_TRUE='#' MAC_FALSE= fi if test x$id = xgtk ; then LINUX_TRUE= LINUX_FALSE='#' else LINUX_TRUE='#' LINUX_FALSE= fi # Generate output ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # 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, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # 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. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${RESCOMP_TRUE}" && test -z "${RESCOMP_FALSE}"; then as_fn_error $? "conditional \"RESCOMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WINDOWS_TRUE}" && test -z "${WINDOWS_FALSE}"; then as_fn_error $? "conditional \"WINDOWS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAC_TRUE}" && test -z "${MAC_FALSE}"; then as_fn_error $? "conditional \"MAC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LINUX_TRUE}" && test -z "${LINUX_FALSE}"; then as_fn_error $? "conditional \"LINUX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by golly $as_me 2.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ golly config.status 2.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo echo " The wxWidgets build which will be used by $PACKAGE_NAME $PACKAGE_VERSION" echo " has the following settings:" if test "x$WX_DEBUG" = "x1" ; then echo " - DEBUG build" elif test "x$WX_DEBUG" = "x0" ; then echo " - RELEASE build" else echo "WX_DEBUG is $WX_DEBUG" fi if test "x$WX_UNICODE" = "x1" ; then echo " - UNICODE mode" elif test "x$WX_UNICODE" = "x0" ; then echo " - ANSI mode" else echo "WX_UNICODE is $WX_UNICODE" fi if test "x$WX_SHARED" = "x1" ; then echo " - SHARED mode" elif test "x$WX_SHARED" = "x0" ; then echo " - STATIC mode" else echo "WX_SHARED is $WX_SHARED" fi echo " - VERSION: $WX_VERSION" echo " - PORT: $WX_PORT" golly-2.5-src/gui-wx/configure/configure.ac0000644000175100001440000000761112156145314015707 00000000000000AC_PREREQ(2.61) AC_INIT([golly], [2.5]) AC_CANONICAL_TARGET AM_INIT_AUTOMAKE([-Wall -Werror foreign no-define]) AC_CONFIG_SRCDIR([../../cmdline/bgolly.cpp]) # Custom configure arguments: AC_ARG_WITH([zlib], [AS_HELP_STRING([--with-zlib], [support reading compressed pattern files with zlib])], , [with_zlib=yes]) AC_ARG_WITH([perl-shlib], [AS_HELP_STRING([--with-perl-shlib=ARG], [name of the Perl library when loaded dynamically (e.g. libperl.so.5.12)])], , [with_perl_shlib=check]) AC_ARG_WITH([python-shlib], [AS_HELP_STRING([--with-python-shlib=ARG], [name of the Python library when loaded dynamically (e.g. libpython2.6.so)])], , [with_python_shlib=check]) AC_ARG_VAR([GOLLYDIR], [golly data directory [default=DATADIR/golly]]) AC_ARG_VAR([PERL], [Perl 5 interpreter]) AC_ARG_VAR([PYTHON], [Python 2 interpreter]) # Check for build tools: m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) AC_PROG_GREP AC_PROG_EGREP AC_PROG_SED AC_PROG_RANLIB AC_PROG_CXX AC_CHECK_TOOL([OBJDUMP], [objdump]) AS_IF([test "x$OBJDUMP" = x], [AC_MSG_ERROR([missing objdump])]) AC_CHECK_TOOL([STRIP], [strip]) # Check for standard header files: AC_CHECK_HEADERS([inttypes.h limits.h stdint.h stdlib.h string.h sys/time.h]) # Check for compiler characteristics: AC_TYPE_SIZE_T # Check for large file support (enabled by default) AC_SYS_LARGEFILE # Check for library functions AC_FUNC_MALLOC AC_FUNC_REALLOC AC_CHECK_FUNCS([gettimeofday memset pow strchr strdup strrchr]) # Find wxWidgets WX_CONFIG_OPTIONS WX_STANDARD_OPTIONS([debug,unicode,shared,toolkit,wxshared]) WX_DEBUG=$DEBUG WX_UNICODE=$UNICODE WX_CONVERT_STANDARD_OPTIONS_TO_WXCONFIG_FLAGS WX_CONFIG_CHECK([2.8.0], , [AC_MSG_ERROR([missing wxWidgets])], , [$WXCONFIG_FLAGS]) WX_DETECT_STANDARD_OPTION_VALUES AM_CONDITIONAL([RESCOMP], [test "x$WX_RESCOMP" != x]) WX_CHECK_IMAGE_HANDLER([BMP]) WX_CHECK_IMAGE_HANDLER([GIF]) WX_CHECK_IMAGE_HANDLER([PNG]) WX_CHECK_IMAGE_HANDLER([TIFF]) # Find Perl AC_PATH_PROGS([PERL], [perl5 perl]) AS_IF([test "x$PERL" = x], [AC_MSG_ERROR([missing Perl])]) AC_SUBST([PERL_INCLUDE], [`$PERL -MExtUtils::Embed -e ccopts`]) AS_IF([test "x$with_perl_shlib" = xcheck], [CHECK_SHLIB_USED([shlib], [$PERL], [perl])], [shlib=$with_perl_shlib] ) AS_IF([test "x$shlib" = x], AC_MSG_ERROR([could not determine Perl shared library name])) AC_DEFINE_UNQUOTED([PERL_SHLIB], [$shlib]) # Find Python AC_PATH_PROGS(PYTHON, [python2 python]) AS_IF([test "x$PYTHON" = x], [AC_MSG_ERROR([missing Python])]) AC_SUBST([PYTHON_INCLUDE], [-I"'`$PYTHON -c "import distutils.sysconfig; print(distutils.sysconfig.get_python_inc())"`'"]) AS_IF([test "x$with_python_shlib" = xcheck], [ [shlib=`$PYTHON -c "import distutils.sysconfig; print(distutils.sysconfig.get_config_var('LDLIBRARY') or '')"`] AS_IF([test "x$shlib" = x], [CHECK_SHLIB_USED([shlib], [$PYTHON], [python])]) ], [ shlib=$with_python_shlib ] ) AS_IF([test "x$shlib" = x], AC_MSG_ERROR([could not determine Python shared library name])) AC_DEFINE_UNQUOTED([PYTHON_SHLIB], [$shlib]) # Find zlib (unless explicitly disabled) AS_IF([test "x$with_zlib" != xno], [ AC_CHECK_HEADER([zlib.h], , [AC_MSG_ERROR([missing zlib])]) AC_SEARCH_LIBS([gzopen], [z], , [AC_MSG_ERROR([missing zlib])]) AC_DEFINE(ZLIB) ] ) # Definitions used in the source: AC_DEFINE_UNQUOTED([VERSION], [$PACKAGE_VERSION]) GOLLYDIR=${GOLLYDIR:-'${pkgdatadir}'} # Determine which of three supported target operating systems we will compile # for, and set a suffix for binary distributions accordingly: case $target_os in cygwin* | mingw* | pw32* | cegcc*) id=win ;; darwin* | rhapsody*) id=mac ;; linux*) id=gtk ;; *) id= ;; esac case $target_cpu in *64) bits=64 ;; *) bits= ;; esac AC_SUBST([BINDISTSUFFIX], [${id:+-$id$bits}]) AC_SUBST([SRCDISTSUFFIX], [-src]) AM_CONDITIONAL([WINDOWS], [test x$id = xwin ]) AM_CONDITIONAL([MAC], [test x$id = xmac ]) AM_CONDITIONAL([LINUX], [test x$id = xgtk ]) # Generate output AC_CONFIG_FILES([Makefile]) AC_OUTPUT WX_STANDARD_OPTIONS_SUMMARY_MSG golly-2.5-src/gui-wx/configure/aclocal.m40000644000175100001440000011562312156145626015272 00000000000000# generated automatically by aclocal 1.13.2 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file 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. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file 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. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.13' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.13.2], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.13.2])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # Copyright (C) 2011-2013 Free Software Foundation, Inc. # # This file 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. # AM_PROG_AR([ACT-IF-FAIL]) # ------------------------- # Try to determine the archiver interface, and trigger the ar-lib wrapper # if it is needed. If the detection of archiver interface fails, run # ACT-IF-FAIL (default is to abort configure with a proper error message). AC_DEFUN([AM_PROG_AR], [AC_BEFORE([$0], [LT_INIT])dnl AC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([ar-lib])dnl AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false]) : ${AR=ar} AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface], [am_cv_ar_interface=ar AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])], [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([am_ar_try]) if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a ]) ]) case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) m4_default([$1], [AC_MSG_ERROR([could not determine $AR interface])]) ;; esac AC_SUBST([AR])dnl ]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file 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. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file 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. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file 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. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file 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. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file 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 macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file 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. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file 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. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file 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. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file 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. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file 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. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file 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. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # 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 ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $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 if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file 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. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file 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. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file 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. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file 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. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/shlib.m4]) m4_include([m4/wximage.m4]) m4_include([m4/wxwin.m4]) golly-2.5-src/gui-wx/configure/depcomp0000755000175100001440000005570312156145627015012 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-10-18.11; # UTC # Copyright (C) 1999-2013 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, see . # 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. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interferences from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # 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: golly-2.5-src/gui-wx/configure/ar-lib0000755000175100001440000001330212156145627014516 00000000000000#! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2012-03-01.08; # UTC # Copyright (C) 2010-2013 Free Software Foundation, Inc. # Written by Peter Rosin . # # 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, see . # 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. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <. # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: golly-2.5-src/gui-wx/configure/config.sub0000755000175100001440000010565712156145627015424 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-04-24' # This file 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 3 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, see . # # 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx | dvp \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze*) basic_machine=microblaze-xilinx ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mipsEE* | ee | ps2) basic_machine=mips64r5900el-scei case $os in -linux*) ;; *) os=-elf ;; esac ;; iop) basic_machine=mipsel-scei os=-irx ;; dvp) basic_machine=dvp-scei os=-elf ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -irx* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or1k-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: golly-2.5-src/gui-wx/configure/install-sh0000755000175100001440000003325512156145627015437 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # 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. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # 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 $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # 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: golly-2.5-src/gui-wx/configure/missing0000755000175100001440000001533112156145627015025 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 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, see . # 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 case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # 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: golly-2.5-src/gui-wx/configure/autogen.sh0000755000175100001440000000110412156145570015415 00000000000000#!/bin/bash -e rm -f sources.am echo libgolly_a_SOURCES = ../../gollybase/*.{h,cpp} >>sources.am echo golly_SOURCES = ../../gui-wx/*.{h,cpp} >>sources.am echo 'gollydatadir = $(pkgdatadir)/Patterns/Life/' >>sources.am echo nobase_dist_gollydata_DATA = `find ../../{Help,Patterns,Rules,Scripts} -type f | sort` >>sources.am echo EXTRA_DIST = ../../gui-wx/{makefile-{gtk,mac,win},CMakeLists.txt,Info.plist.in,*.mk,*.rc,configure/autogen.sh,icons,bitmaps} ../../docs $(find ../../gui-ios -type f | sort) ../../docs >>sources.am aclocal -I m4 automake --add-missing --copy autoconf golly-2.5-src/gui-wx/wxalgos.h0000644000175100001440000001232212156145314013270 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXALGOS_H_ #define _WXALGOS_H_ #include "lifealgo.h" // Golly supports multiple algorithms. The first algorithm // registered must *always* be qlifealgo. The second must // *always* be hlifealgo. (These are to support old scripts.) // The order of the rest do not matter and indeed should soon // be capable of being dynamic. enum { QLIFE_ALGO, // QuickLife HLIFE_ALGO // HashLife }; const int MAX_ALGOS = 50; // maximum number of algorithms typedef int algo_type; // 0..MAX_ALGOS-1 // A class for all the static info we need about a particular algorithm. class AlgoData : public staticAlgoInfo { public: AlgoData(); ~AlgoData(); virtual void setDefaultBaseStep(int v) { defbase = v; } virtual void setDefaultMaxMem(int v) { algomem = v; } static AlgoData& tick(); // static allocator // additional data bool canhash; // algo uses hashing? int algomem; // maximum memory (in MB) int defbase; // default base step wxColor statusrgb; // status bar color wxBrush* statusbrush; // corresponding brush wxBitmap** icons7x7; // icon bitmaps for scale 1:8 wxBitmap** icons15x15; // icon bitmaps for scale 1:16 wxBitmap** icons31x31; // icon bitmaps for scale 1:32 // default color scheme bool gradient; // use color gradient? wxColor fromrgb; // color at start of gradient wxColor torgb; // color at end of gradient // if gradient is false then use these colors for each cell state unsigned char algor[256]; unsigned char algog[256]; unsigned char algob[256]; }; extern AlgoData* algoinfo[MAX_ALGOS]; // static info for each algorithm extern wxMenu* algomenu; // menu of algorithm names extern wxMenu* algomenupop; // copy of algomenu for PopupMenu calls extern algo_type initalgo; // initial algorithm // the following bitmaps are grayscale icons that can be used with any rules // with any number of states extern wxBitmap** circles7x7; // circular icons for scale 1:8 extern wxBitmap** circles15x15; // circular icons for scale 1:16 extern wxBitmap** circles31x31; // circular icons for scale 1:32 extern wxBitmap** diamonds7x7; // diamond icons for scale 1:8 extern wxBitmap** diamonds15x15; // diamond icons for scale 1:16 extern wxBitmap** diamonds31x31; // diamond icons for scale 1:32 extern wxBitmap** hexagons7x7; // hexagonal icons for scale 1:8 extern wxBitmap** hexagons15x15; // hexagonal icons for scale 1:16 extern wxBitmap** hexagons31x31; // hexagonal icons for scale 1:32 // NOTE: the triangular icons are only suitable for a 4-state rule that // is emulating a triangular neighborhood with 2 triangles per cell extern wxBitmap** triangles7x7; // triangular icons for scale 1:8 extern wxBitmap** triangles15x15; // triangular icons for scale 1:16 extern wxBitmap** triangles31x31; // triangular icons for scale 1:32 void InitAlgorithms(); // Initialize above data. Must be called before reading the prefs file. void DeleteAlgorithms(); // Deallocate memory allocated in InitAlgorithms() lifealgo* CreateNewUniverse(algo_type algotype, bool allowcheck = true); // Create a new universe of given type. If allowcheck is true then // event checking is allowed; ie. poller is set to wxGetApp().Poller(). const char* GetAlgoName(algo_type algotype); // Return name of given algorithm. This name appears in various menus // and is also stored in the prefs file. int NumAlgos(); // Return current number of algorithms. bool MultiColorImage(wxImage& image); // Return true if image contains at least one color that isn't a shade of gray. bool LoadIconFile(const wxString& path, int maxstate, wxBitmap*** out7x7, wxBitmap*** out15x15, wxBitmap*** out31x31); // Return true if we can successfully load icon bitmaps from given file. wxBitmap** CreateIconBitmaps(const char** xpmdata, int maxstates); // Create icon bitmaps using the given XPM data. wxBitmap** ScaleIconBitmaps(wxBitmap** srcicons, int size); // Create scaled versions of the given icon bitmaps. void FreeIconBitmaps(wxBitmap** icons); // Delete the given icon bitmaps. #endif golly-2.5-src/gui-wx/wxedit.h0000644000175100001440000000311412156145314013107 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXEDIT_H_ #define _WXEDIT_H_ // Edit bar routines: void CreateEditBar(wxWindow* parent); // Create edit bar window above given parent window, // but underneath layer bar if present. int EditBarHeight(); // Return height of edit bar. void ResizeEditBar(int wd); // Change width of edit bar. void UpdateEditBar(bool active); // Update state of buttons in edit bar. void ToggleEditBar(); // Show/hide edit bar. void ToggleAllStates(); // Show/hide all cell states in expanded edit bar. void ShiftEditBar(int yamount); // Shift edit bar up/down by given amount. void CycleDrawingState(bool higher); // Cycle current drawing state to next higher/lower state. #endif golly-2.5-src/gui-wx/wxgolly.h0000755000175100001440000000434312156145314013320 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXGOLLY_H_ #define _WXGOLLY_H_ // need some forward declarations class lifepoll; class MainFrame; class PatternView; class StatusBar; // Define our application class: class GollyApp : public wxApp { public: // called on application startup virtual bool OnInit(); #ifdef __WXMAC__ // called in response to an open-document event; // eg. when a file is dropped onto the app icon virtual void MacOpenFile(const wxString& fullPath); #endif // put app icon in given frame void SetFrameIcon(wxFrame* frame); // event poller is used by non-wx modules to process events lifepoll* Poller(); void PollerReset(); void PollerInterrupt(); }; DECLARE_APP(GollyApp) // so other files can use wxGetApp // At the risk of offending C++ purists, we use some globals to simplify code: // "mainptr->GetRect()" is more readable than "wxGetApp().GetMainFrame()->GetRect()". extern MainFrame* mainptr; // main window extern PatternView* viewptr; // current viewport window (possibly a tile) extern PatternView* bigview; // big viewport window (encloses all tiles) extern StatusBar* statusptr; // status bar window extern wxStopWatch* stopwatch; // global stopwatch (started in OnInit) extern bool insideYield; // processing an event via Yield()? #endif golly-2.5-src/gui-wx/wxhelp.h0000644000175100001440000000343712156145314013122 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXHELP_H_ #define _WXHELP_H_ // Routines for displaying html help files stored in the Help folder: void ShowHelp(const wxString& filepath); // Open a modeless window and display the given html file. // If filepath is empty then either the help window is brought to the // front if it's open, or it is opened and the most recent html file // is displayed. const wxString SHOW_KEYBOARD_SHORTCUTS = wxT("keyboard.html"); // If ShowHelp is called with this string then a temporary HTML file // is created to show the user's current keyboard shortcuts. void ShowAboutBox(); // Open a modal dialog and display info about the app. void LoadLexiconPattern(); // Load the lexicon pattern clicked by user. void LoadRule(const wxString& rulestring); // Load recently installed .rule/table/tree/colors/icons file. wxFrame* GetHelpFrame(); // Return a pointer to the help window. #endif golly-2.5-src/gui-wx/wxinfo.h0000644000175100001440000000227012156145314013117 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXINFO_H_ #define _WXINFO_H_ // Routines for displaying comments in a pattern file: // Open a modeless window and display the comments in given file. void ShowInfo(const wxString& filepath); // Return a pointer to the info window. wxFrame* GetInfoFrame(); #endif golly-2.5-src/gui-wx/wxlayer.h0000644000175100001440000002531712156145314013307 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXLAYER_H_ #define _WXLAYER_H_ #include "bigint.h" // for bigint class #include "viewport.h" // for viewport class #include "wxselect.h" // for Selection class #include "wxundo.h" // for UndoRedo class #include "wxalgos.h" // for algo_type // Golly supports multiple layers. Each layer is a separate universe // (unless cloned) with its own algorithm, rule, viewport, window title, // selection, undo/redo history, etc. class Layer { public: Layer(); ~Layer(); // if this is a cloned layer then cloneid is > 0 and all the other clones // have the same cloneid int cloneid; lifealgo* algo; // this layer's universe (shared by clones) algo_type algtype; // type of universe (index into algoinfo) bool hyperspeed; // use acceleration while generating? bool showhashinfo; // show hashing info? bool autofit; // auto fit pattern while generating? bool dirty; // user has modified pattern? bool savedirty; // state of dirty flag before drawing/script change bool stayclean; // script has reset dirty flag? int currbase; // current base step int currexpo; // current step exponent int drawingstate; // current drawing state wxCursor* curs; // current cursor UndoRedo* undoredo; // undo/redo history (shared by clones) // each layer (cloned or not) has its own viewport for displaying patterns; // note that we use a pointer to the viewport to allow temporary switching // in wxrender.cpp (eg. in DrawStackedLayers) viewport* view; // WARNING: this string is used to remember the current rule when // switching to another layer; to determine the current rule at any // time, use currlayer->algo->getrule() wxString rule; Selection currsel; // current selection Selection savesel; // for saving/restoring selection bigint originx; // X origin offset bigint originy; // Y origin offset wxString currfile; // full path of current pattern file wxString currname; // name seen in window title and Layer menu // for saving and restoring starting pattern algo_type startalgo; // starting algorithm bool savestart; // need to save starting pattern? bool startdirty; // starting state of dirty flag wxString startfile; // file for saving starting pattern wxString startname; // starting currname wxString startrule; // starting rule bigint startgen; // starting generation (>= 0) bigint startx, starty; // starting location int startbase; // starting base step int startexpo; // starting step exponent int startmag; // starting scale Selection startsel; // starting selection // temporary file used to restore starting pattern or to show comments; // each non-cloned layer uses a different temporary file wxString tempstart; // used when tilelayers is true PatternView* tilewin; // tile window wxRect tilerect; // tile window's size and position // color scheme for this layer wxColor fromrgb; // start of gradient wxColor torgb; // end of gradient unsigned char cellr[256]; // red components for states 0..255 unsigned char cellg[256]; // green components for states 0..255 unsigned char cellb[256]; // blue components for states 0..255 wxBrush* deadbrush; // brush for drawing dead cells wxPen* gridpen; // pen for drawing plain grid wxPen* boldpen; // pen for drawing bold grid // icons for this layer wxBitmap** icons7x7; // icons for scale 1:8 wxBitmap** icons15x15; // icons for scale 1:16 wxBitmap** icons31x31; // icons for scale 1:32 bool multicoloricons; // are icons multi-colored? (grayscale if not) // used if the layer has a timeline (see wxtimeline.cpp) int currframe; // current frame in timeline int autoplay; // +ve = play forwards, -ve = play backwards, 0 = stop int tlspeed; // controls speed at which frames are played long lastframe; // time (in msecs) when last frame was displayed }; const int MAX_LAYERS = 10; // maximum number of layers extern int numlayers; // number of existing layers extern int numclones; // number of cloned layers extern int currindex; // index of current layer (0..numlayers-1) extern Layer* currlayer; // pointer to current layer void AddLayer(); // Add a new layer (with an empty universe) and make it the current layer. // The first call creates the initial layer. Later calls insert the // new layer immediately after the old current layer. The new layer // inherits the same type of universe, the same rule, the same scale // and location, and the same cursor. void CloneLayer(); // Like AddLayer but shares the same universe and undo/redo history // as the current layer. All the current layer's settings are duplicated // and most will be kept synchronized; ie. changing one clone changes all // the others, but each cloned layer has a separate viewport so the same // pattern can be viewed at different scales and locations. void SyncClones(); // If the current layer is a clone then this call ensures the universe // and settings in its other clones are correctly synchronized. void DuplicateLayer(); // Like AddLayer but makes a copy of the current layer's pattern. // Also duplicates all the current settings but, unlike a cloned layer, // the settings are not kept synchronized. void DeleteLayer(); // Delete the current layer. The current layer changes to the previous // index, unless layer 0 was deleted, in which case the current layer // is the new layer at index 0. void DeleteOtherLayers(); // Delete all layers except the current layer. void SetLayer(int index); // Set the current layer using the given index (0..numlayers-1). void MoveLayer(int fromindex, int toindex); // Move the layer at fromindex to toindex and make it the current layer. // This is called by MoveLayerDialog and the movelayer script command. void MoveLayerDialog(); // Bring up a dialog that allows the user to move the current layer // to a new index (which becomes the current layer). void NameLayerDialog(); // Bring up a dialog that allows the user to change the name of the // current layer. void MarkLayerDirty(); // Set dirty flag in current layer and any of its clones. // Also prefix window title and layer name(s) with an asterisk. void MarkLayerClean(const wxString& title); // Reset dirty flag in current layer and any of its clones. // Also set window title, removing asterisk from it and layer name(s). void ToggleSyncViews(); // Toggle the syncviews flag. When true, every layer uses the same // scale and location as the current layer. void ToggleSyncCursors(); // Toggle the synccursors flag. When true, every layer uses the same // cursor as the current layer. void ToggleStackLayers(); // Toggle the stacklayers flag. When true, the rendering code displays // all layers using the same scale and location as the current layer. // Layer 0 is drawn first (100% opaque), then all the other layers // are drawn as overlays using an opacity set by the user. The colors // for the live cells in each layer can be set via the Prefs dialog. void ToggleTileLayers(); // Toggle the tilelayers flag. When true, the rendering code displays // all layers in tiled sub-windows. bool CanSwitchLayer(int index); // Return true if the user can switch to the given layer. void SwitchToClickedTile(int index); // If allowed, change current layer to clicked tile. void ResizeLayers(int wd, int ht); // Resize the viewport in all layers. Layer* GetLayer(int index); // Return a pointer to the layer specified by the given index. bool RestoreRule(const wxString& rule); // Try to set the current layer's rule to a previously known rule. // If this succeeds return true, but if it fails then warn the user, // switch to the current algorithm's default rule, and return false. // The latter can happen if the given rule's table/tree file was // deleted or was edited and some sort of error introduced. // Layer bar routines: void CreateLayerBar(wxWindow* parent); // Create layer bar window at top of given parent window. int LayerBarHeight(); // Return height of layer bar. void ResizeLayerBar(int wd); // Change width of layer bar. void UpdateLayerBar(bool active); // Update state of buttons in layer bar. void UpdateLayerButton(int index, const wxString& name); // Update the name in the specified layer button. void RedrawLayerBar(); // Redraw layer bar. This is needed because UpdateLayerBar doesn't // refresh the layer bar (to avoid unwanted flashing). void ToggleLayerBar(); // Show/hide the layer bar. // move this color stuff into wxcolors.*??? void CreateColorGradient(); // Create a color gradient for the current layer using // currlayer->fromrgb and currlayer->torgb. void UpdateCloneColors(); // If current layer has clones then update their colors. void UpdateLayerColors(); // Update the cell colors and icons for the current layer (and its clones) // according to the current algo and rule. Must be called very soon // after any algo/rule change, and before the viewport is updated. void InvertCellColors(); // Invert the cell colors in all layers, including the dead cell color, // grid lines, and the colors in all icon bitmaps. void SetLayerColors(); // Open a dialog to change the current layer's colors. #endif golly-2.5-src/gui-wx/wxmain.h0000755000175100001440000002710412156145314013116 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXMAIN_H_ #define _WXMAIN_H_ #include "wx/splitter.h" // for wxSplitterWindow, wxSplitterEvent #include "wx/dirctrl.h" // for wxGenericDirCtrl #include "wx/treectrl.h" // for wxTreeCtrl, wxTreeEvent #include "wx/dataobj.h" // for wxTextDataObject #include "bigint.h" // for bigint #include "lifealgo.h" // for lifealgo #include "writepattern.h" // for pattern_format #include "wxprefs.h" // for MAX_RECENT #include "wxalgos.h" // for MAX_ALGOS, algo_type #include "wxlayer.h" // for MAX_LAYERS // Golly's main window: class MainFrame : public wxFrame { public: MainFrame(); ~MainFrame(); // update functions void UpdateEverything(); void UpdateUserInterface(bool active); void UpdateToolBar(bool active); void EnableAllMenus(bool enable); void UpdateMenuItems(bool active); void UpdatePatternAndStatus(); void UpdateStatus(); void UpdateMenuAccelerators(); // clipboard functions bool ClipboardHasText(); bool CopyTextToClipboard(const wxString& text); bool GetTextFromClipboard(wxTextDataObject* data); bool ClipboardContainsRule(); void OpenClipboard(); void RunClipboard(); // file functions void OpenFile(const wxString& path, bool remember = true); void LoadPattern(const wxString& path, const wxString& newtitle, bool updatestatus = true, bool updateall = true); void NewPattern(const wxString& title = _("untitled")); void CreateUniverse(); void SetWindowTitle(const wxString& filename); void OpenPattern(); void OpenScript(); void ToggleShowPatterns(); void ToggleShowScripts(); void ChangePatternDir(); void ChangeScriptDir(); void SetPatternDir(const wxString& newdir); void SetScriptDir(const wxString& newdir); bool SavePattern(); bool SaveCurrentLayer(); const char* SaveFile(const wxString& path, const wxString& format, bool remember); const char* WritePattern(const wxString& path, pattern_format format, output_compression compression, int top, int left, int bottom, int right); void CheckBeforeRunning(const wxString& scriptpath, bool remember, const wxString& zippath); bool ExtractZipEntry(const wxString& zippath, const wxString& entryname, const wxString& outfile); #if wxUSE_DRAG_AND_DROP wxDropTarget* NewDropTarget(); #endif // edit functions void ToggleAllowUndo(); void RestorePattern(bigint& gen, const wxString& filename, bigint& x, bigint& y, int mag, int base, int expo); // prefs functions void SetRandomFillPercentage(); void SetMinimumStepExponent(); void UpdateStepExponent(); void ShowPrefsDialog(const wxString& page = wxEmptyString); // control functions void GeneratePattern(); void GoFaster(); void GoSlower(); void Stop(); void DisplayTimingInfo(); void NextGeneration(bool useinc); void ToggleAutoFit(); void ToggleHyperspeed(); void ToggleHashInfo(); void SetStepExponent(int newexpo); void SetGenIncrement(); bool SaveStartingPattern(); void ResetPattern(bool resetundo = true); void SetGeneration(); const char* ChangeGenCount(const char* genstring, bool inundoredo = false); void SetBaseStep(); void ClearOutsideGrid(); void ReduceCellStates(int newmaxstate); void ShowRuleDialog(); void ConvertOldRules(); wxString CreateRuleFiles(const wxSortedArrayString& deprecated, const wxSortedArrayString& ziprules); void ChangeAlgorithm(algo_type newalgotype, const wxString& newrule = wxEmptyString, bool inundoredo = false); bool CreateBorderCells(lifealgo* curralgo); bool DeleteBorderCells(lifealgo* curralgo); void ClearRect(lifealgo* curralgo, int top, int left, int bottom, int right); // view functions void ToggleStatusBar(); void ToggleExactNumbers(); void ToggleToolBar(); void ToggleFullScreen(); void ShowPatternInfo(); void ResizeSplitWindow(int wd, int ht); void ResizeStatusBar(int wd, int ht); wxWindow* RightPane(); // layer functions void UpdateLayerItem(int index); void AppendLayerItem(); void RemoveLayerItem(); // miscellaneous functions void OnTreeClick(wxMouseEvent& event); void EditFile(const wxString& filepath); void QuitApp(); bool generating; // currently generating pattern? bool fullscreen; // in full screen mode? bool showbanner; // showing banner message? bool keepmessage; // don't clear message created by script? bool command_pending; // user selected a command while generating? bool draw_pending; // user wants to draw while generating? wxCommandEvent cmdevent; // the pending command wxMouseEvent mouseevent; // the pending draw // temporary files wxString clipfile; // name of temporary file for storing clipboard data wxString perlfile; // name of temporary Perl script wxString pythonfile; // name of temporary Python script // store files passed via command line (processed in first OnIdle) wxArrayString pendingfiles; private: // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() // event handlers void OnMenu(wxCommandEvent& event); void OnSetFocus(wxFocusEvent& event); void OnActivate(wxActivateEvent& event); void OnSize(wxSizeEvent& event); void OnIdle(wxIdleEvent& event); void OnDirTreeExpand(wxTreeEvent& event); void OnDirTreeCollapse(wxTreeEvent& event); void OnDirTreeSelection(wxTreeEvent& event); void OnSashDblClick(wxSplitterEvent& event); void OnOneTimer(wxTimerEvent& event); void OnErase(wxEraseEvent& event); void OnPaint(wxPaintEvent& event); void OnClose(wxCloseEvent& event); // file functions bool LoadImage(const wxString& path); void MySetTitle(const wxString& title); wxString GetBaseName(const wxString& path); void SaveSucceeded(const wxString& path); void AddRecentPattern(const wxString& path); void OpenRecentPattern(int id); void ClearMissingPatterns(); void ClearAllPatterns(); void AddRecentScript(const wxString& path); void OpenRecentScript(int id); void ClearMissingScripts(); void ClearAllScripts(); wxString GetScriptFileName(const wxString& text); void OpenZipFile(const wxString& path); // control functions void DisplayPattern(); bool StepPattern(); // miscellaneous functions void CreateMenus(); void CreateToolbar(); void CreateDirControls(); void SimplifyTree(wxString& dir, wxTreeCtrl* treectrl, wxTreeItemId root); void DeselectTree(wxTreeCtrl* treectrl, wxTreeItemId root); void DoPendingAction(bool restart); // splittable window contains pattern/script directory in left pane // and layer bar plus viewport window in right pane wxSplitterWindow* splitwin; wxGenericDirCtrl* patternctrl; wxGenericDirCtrl* scriptctrl; int minexpo; // currexpo at maximum delay (must be <= 0) long whentosee; // when to do next gen (if currexpo < 0) long begintime, endtime; // for timing info double begingen, endgen; // ditto }; // ids for menu commands enum { // File menu // wxID_NEW, // wxID_OPEN, ID_OPEN_CLIP = wxID_HIGHEST + 1, ID_OPEN_RECENT, // last 2 items in Open Recent submenu ID_CLEAR_MISSING_PATTERNS = ID_OPEN_RECENT + MAX_RECENT + 1, ID_CLEAR_ALL_PATTERNS, ID_SHOW_PATTERNS, ID_PATTERN_DIR, // wxID_SAVE, ID_SAVE_XRLE, ID_RUN_SCRIPT, ID_RUN_CLIP, ID_RUN_RECENT, // last 2 items in Run Recent submenu ID_CLEAR_MISSING_SCRIPTS = ID_RUN_RECENT + MAX_RECENT + 1, ID_CLEAR_ALL_SCRIPTS, ID_SHOW_SCRIPTS, ID_SCRIPT_DIR, // wxID_PREFERENCES, // wxID_EXIT, // Edit menu // due to wxMac bugs we don't use wxID_UNDO/REDO/CUT/COPY/CLEAR/PASTE/SELECTALL // (problems occur when info window or a modal dialog is active, and we can't // change the Undo/Redo menu labels) ID_UNDO, ID_REDO, ID_CUT, ID_COPY, ID_NO_UNDO, ID_CLEAR, ID_OUTSIDE, ID_PASTE, ID_PMODE, ID_PLOCATION, ID_PASTE_SEL, ID_SELECTALL, ID_REMOVE, ID_SHRINK, ID_SHRINKFIT, // there's currently no menu item for "Shrink and Fit" ID_RANDOM, ID_FLIPTB, ID_FLIPLR, ID_ROTATEC, ID_ROTATEA, ID_CMODE, // Paste Location submenu ID_PL_TL, ID_PL_TR, ID_PL_BR, ID_PL_BL, ID_PL_MID, // Paste Mode submenu ID_PM_AND, ID_PM_COPY, ID_PM_OR, ID_PM_XOR, // Cursor Mode submenu ID_DRAW, ID_PICK, ID_SELECT, ID_MOVE, ID_ZOOMIN, ID_ZOOMOUT, // Control menu ID_START, ID_NEXT, ID_STEP, ID_RESET, ID_SETGEN, ID_FASTER, ID_SLOWER, ID_SETBASE, ID_AUTO, ID_HYPER, ID_HINFO, ID_RECORD, ID_DELTIME, ID_SETALGO, ID_SETRULE, ID_CONVERT, // Set Algorithm submenu ID_ALGO0, ID_ALGOMAX = ID_ALGO0 + MAX_ALGOS - 1, // View menu ID_FULL, ID_FIT, ID_FIT_SEL, ID_MIDDLE, ID_RESTORE00, // wxID_ZOOM_IN, // wxID_ZOOM_OUT, ID_SET_SCALE, ID_TOOL_BAR, ID_LAYER_BAR, ID_EDIT_BAR, ID_ALL_STATES, ID_STATUS_BAR, ID_EXACT, ID_GRID, ID_ICONS, ID_INVERT, ID_BUFF, ID_TIMELINE, ID_INFO, // Set Scale submenu ID_SCALE_1, ID_SCALE_2, ID_SCALE_4, ID_SCALE_8, ID_SCALE_16, ID_SCALE_32, // Layer menu ID_ADD_LAYER, ID_CLONE, ID_DUPLICATE, ID_DEL_LAYER, ID_DEL_OTHERS, ID_MOVE_LAYER, ID_NAME_LAYER, ID_SET_COLORS, ID_SYNC_VIEW, ID_SYNC_CURS, ID_STACK, ID_TILE, ID_LAYER0, ID_LAYERMAX = ID_LAYER0 + MAX_LAYERS - 1, // Help menu ID_HELP_INDEX, ID_HELP_INTRO, ID_HELP_TIPS, ID_HELP_ALGOS, ID_HELP_KEYBOARD, ID_HELP_MOUSE, ID_HELP_PERL, ID_HELP_PYTHON, ID_HELP_LEXICON, ID_HELP_ARCHIVES, ID_HELP_FILE, ID_HELP_EDIT, ID_HELP_CONTROL, ID_HELP_VIEW, ID_HELP_LAYER, ID_HELP_HELP, ID_HELP_REFS, ID_HELP_FORMATS, ID_HELP_BOUNDED, ID_HELP_PROBLEMS, ID_HELP_CHANGES, ID_HELP_CREDITS, // these ids aren't associated with any menu item ID_LOAD_LEXICON, // load lexicon pattern ID_HELP_BUTT // help button in tool bar }; #endif golly-2.5-src/gui-wx/wxperl.h0000644000175100001440000000223612156145314013130 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXPERL_H_ #define _WXPERL_H_ void RunPerlScript(const wxString& filepath); // Run the given .pl file. void AbortPerlScript(); // Abort the currently running Perl script. void FinishPerlScripting(); // Called when app is quitting. #endif golly-2.5-src/gui-wx/wxprefs.h0000644000175100001440000004201712156145314013306 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXPREFS_H_ #define _WXPREFS_H_ // Routines for getting, saving and changing user preferences: void GetPrefs(); // Read preferences from the GollyPrefs file. void SavePrefs(); // Write preferences to the GollyPrefs file. bool ChangePrefs(const wxString& page); // Open a modal dialog so user can change various preferences. // Returns true if the user hits OK (so client can call SavePrefs). void ChooseTextEditor(wxWindow* parent, wxString& result); // Let user select their preferred text editor. The result is the // path to the application or empty if the user cancels the dialog. char* ReplaceDeprecatedAlgo(char* algoname); // If given algo name is deprecated then return replacement name, // otherwise return same name. // Global preference data: extern wxString gollydir; // path of directory containing app extern wxString datadir; // path of directory for user-specific data extern wxString tempdir; // path of directory for temporary data extern wxString rulesdir; // path of directory for app's rule data extern wxString userrules; // path of directory for user's rule data extern wxString downloaddir; // path of directory for downloaded data extern int debuglevel; // for displaying debug info if > 0 extern int mainx; // main window's location extern int mainy; extern int mainwd; // main window's size extern int mainht; extern bool maximize; // maximize main window? extern int helpx; // help window's location extern int helpy; extern int helpwd; // help window's size extern int helpht; extern int helpfontsize; // font size in help window extern int infox; // info window's location extern int infoy; extern int infowd; // info window's size extern int infoht; extern int rulex; // rule dialog's location extern int ruley; extern int ruleexwd; // rule dialog's extra size extern int ruleexht; extern bool showalgohelp; // show algorithm help in rule dialog? extern char initrule[]; // initial rule extern bool initautofit; // initial autofit setting extern bool inithyperspeed; // initial hyperspeed setting extern bool initshowhashinfo; // initial showhashinfo setting extern bool savexrle; // save RLE file using XRLE format? extern bool showtips; // show button tips? extern bool showtool; // show tool bar? extern bool showlayer; // show layer bar? extern bool showedit; // show edit bar? extern bool showallstates; // show all cell states in edit bar? extern bool showstatus; // show status bar? extern bool showexact; // show exact numbers in status bar? extern bool showtimeline; // show timeline bar? extern bool showgridlines; // display grid lines? extern bool showicons; // display icons for cell states? extern bool swapcolors; // swap colors used for cell states? extern bool buffered; // use wxWdgets buffering to avoid flicker? extern bool scrollpencil; // scroll if pencil cursor is dragged outside view? extern bool scrollcross; // scroll if cross cursor is dragged outside view? extern bool scrollhand; // scroll if hand cursor is dragged outside view? extern bool allowundo; // allow undo/redo? extern bool restoreview; // should reset/undo restore view? extern bool allowbeep; // okay to play beep sound? extern int controlspos; // position of translucent controls extern int canchangerule; // if > 0 then paste can change rule extern int randomfill; // random fill percentage extern int opacity; // percentage opacity of live cells in overlays extern int tileborder; // width of tiled window borders extern int mingridmag; // minimum mag to draw grid lines extern int boldspacing; // spacing of bold grid lines extern bool showboldlines; // show bold grid lines? extern bool mathcoords; // show Y values increasing upwards? extern bool syncviews; // synchronize viewports? extern bool synccursors; // synchronize cursors? extern bool stacklayers; // stack all layers? extern bool tilelayers; // tile all layers? extern bool askonnew; // ask to save changes before creating new pattern? extern bool askonload; // ask to save changes before loading pattern file? extern bool askondelete; // ask to save changes before deleting layer? extern bool askonquit; // ask to save changes before quitting app? extern int newmag; // mag setting for new pattern extern bool newremovesel; // new pattern removes selection? extern bool openremovesel; // opening pattern removes selection? extern wxCursor* newcurs; // cursor after creating new pattern extern wxCursor* opencurs; // cursor after opening pattern extern int mousewheelmode; // 0:Ignore, 1:forward=ZoomOut, 2:forward=ZoomIn extern int thumbrange; // thumb box scrolling range in terms of view wd/ht extern int mindelay; // minimum millisec delay extern int maxdelay; // maximum millisec delay extern wxString opensavedir; // directory for Open and Save dialogs extern wxString rundir; // directory for Run Script dialog extern wxString icondir; // directory used by Load Icon File button extern wxString choosedir; // directory used by Choose File button extern wxString patterndir; // directory used by Show Patterns extern wxString scriptdir; // directory used by Show Scripts extern wxString texteditor; // path of user's preferred text editor extern wxString perllib; // name of Perl library (loaded at runtime) extern wxString pythonlib; // name of Python library (loaded at runtime) extern int dirwinwd; // width of pattern/script directory window extern bool showpatterns; // show pattern directory? extern bool showscripts; // show script directory? extern wxMenu* patternSubMenu; // submenu of recent pattern files extern wxMenu* scriptSubMenu; // submenu of recent script files extern int numpatterns; // current number of recent pattern files extern int numscripts; // current number of recent script files extern int maxpatterns; // maximum number of recent pattern files extern int maxscripts; // maximum number of recent script files extern wxArrayString namedrules; // We maintain an array of named rules, where each string is of the form // "name of rule|B.../S...". The first string is always "Life|B3/S23". // Keyboard shortcuts: // define the actions that can be invoked by various key combinations typedef enum { DO_NOTHING = 0, // null action must be zero DO_OPENFILE, // open a chosen pattern/script/html file // rest are in alphabetical order (well, almost) DO_ABOUT, // about Golly DO_ADD, // add layer DO_ADVANCEOUT, // advance outside DO_ADVANCE, // advance selection DO_AUTOFIT, // auto fit DO_BUFFERED, // buffered DO_CHANGE00, // change origin DO_CLEAROUT, // clear outside DO_CLEAR, // clear selection DO_CLONE, // clone layer DO_COPY, // copy selection DO_CURSDRAW, // cursor mode: draw DO_CURSMOVE, // cursor mode: move DO_CURSPICK, // cursor mode: pick DO_CURSSEL, // cursor mode: select DO_CURSIN, // cursor mode: zoom in DO_CURSOUT, // cursor mode: zoom out DO_CUT, // cut selection DO_CURSCYCLE, // cycle cursor mode DO_PASTELOC, // cycle paste location DO_PASTEMODE, // cycle paste mode DO_DELETE, // delete layer DO_DELOTHERS, // delete other layers DO_DELTIME, // delete timeline DO_DISABLE, // disable undo/redo DO_DUPLICATE, // duplicate layer DO_FASTER, // faster DO_FIT, // fit pattern DO_FITSEL, // fit selection DO_FLIPLR, // flip left-right DO_FLIPTB, // flip top-bottom DO_FULLSCREEN, // full screen DO_HYPER, // hyperspeed DO_INVERT, // invert colors DO_MIDDLE, // middle DO_MOVELAYER, // move layer... DO_NAMELAYER, // name layer... DO_NEWPATT, // new pattern DO_NEXTGEN, // next generation DO_NEXTSTEP, // next step DO_NEXTHIGHER, // next higher state DO_NEXTLOWER, // next lower state DO_OPENCLIP, // open clipboard DO_OPENPATT, // open pattern... DO_PASTE, // paste DO_PASTESEL, // paste to selection DO_INFO, // pattern info DO_PLAYBACK, // play timeline backwards DO_PREFS, // preferences... DO_QUIT, // quit Golly DO_RANDFILL, // random fill DO_REDO, // redo DO_REMOVESEL, // remove selection DO_RESET, // reset DO_RESTORE00, // restore origin DO_ROTATEACW, // rotate anticlockwise DO_ROTATECW, // rotate clockwise DO_RUNCLIP, // run clipboard DO_RUNSCRIPT, // run script... DO_SAVEXRLE, // save extended rle DO_SAVE, // save pattern... DO_DOWN, // scroll down DO_LEFT, // scroll left DO_RIGHT, // scroll right DO_UP, // scroll up DO_NE, // scroll NE DO_NW, // scroll NW DO_SE, // scroll SE DO_SW, // scroll SW DO_SELALL, // select all DO_SETBASE, // set base step... DO_SETGEN, // set generation... DO_SETCOLORS, // set layer colors... DO_PATTDIR, // set pattern folder... DO_SETRULE, // set rule... DO_SCALE1, // set scale 1:1 DO_SCALE2, // set scale 1:2 DO_SCALE4, // set scale 1:4 DO_SCALE8, // set scale 1:8 DO_SCALE16, // set scale 1:16 DO_SCALE32, // set scale 1:32 DO_SCRIPTDIR, // set script folder... DO_SHOWSTATES, // show all states DO_SHOWICONS, // show cell icons DO_SHOWEDIT, // show edit bar DO_SHOWEXACT, // show exact numbers DO_SHOWGRID, // show grid lines DO_HASHINFO, // show hash info DO_HELP, // show help DO_SHOWLAYER, // show layer bar DO_PATTERNS, // show patterns DO_SCRIPTS, // show scripts DO_SHOWSTATUS, // show status bar DO_SHOWTIME, // show timeline DO_TIMING, // show timing DO_SHOWTOOL, // show tool bar DO_SHRINKFIT, // shrink and fit DO_SHRINK, // shrink selection DO_SLOWER, // slower DO_STACK, // stack layers DO_STARTSTOP, // start/stop generating DO_RECORD, // start/stop recording DO_SYNCCURS, // synchronize cursors DO_SYNCVIEWS, // synchronize views DO_TILE, // tile layers DO_UNDO, // undo DO_HASHING, // use hashing DO_ZOOMIN, // zoom in DO_ZOOMOUT, // zoom out MAX_ACTIONS } action_id; typedef struct { action_id id; // one of the above wxString file; // non-empty if id is DO_OPENFILE } action_info; action_info FindAction(int key, int modifiers); // return the action info for the given key and modifier set wxString GetAccelerator(action_id action); // return a string, possibly empty, containing the menu item // accelerator(s) for the given action void RemoveAccelerator(wxMenuBar* mbar, int item, action_id action); // remove any accelerator from given menu item void SetAccelerator(wxMenuBar* mbar, int item, action_id action); // update accelerator for given menu item using given action wxString GetShortcutTable(); // return HTML data to display current keyboard shortcuts // Colors: extern wxColor* borderrgb; // color for border around bounded grid extern wxColor* selectrgb; // color for selected cells extern wxColor* pastergb; // color for pasted pattern extern wxBrush* borderbrush; // brush for filling grid border extern wxPen* pastepen; // pen for drawing paste rect void SetBrushesAndPens(); // update colors in above brushes and pens void FreeDefaultColors(); // deallocate memory allocated by CreateDefaultColors() // Various constants: const int minmainwd = 200; // main window's minimum width const int minmainht = 100; // main window's minimum height const int minhelpwd = 400; // help window's minimum width const int minhelpht = 100; // help window's minimum height const int minfontsize = 6; // minimum value of helpfontsize const int maxfontsize = 30; // maximum value of helpfontsize const int mininfowd = 400; // info window's minimum width const int mininfoht = 100; // info window's minimum height const int MAX_RECENT = 100; // maximum value of maxpatterns and maxscripts const int MAX_SPACING = 1000; // maximum value of boldspacing const int MIN_MEM_MB = 0; // minimum value of maximum memory const int MAX_MEM_MB = // maximum value of maximum memory sizeof(char*) <= 4 ? 4000 : 100000000; const int MAX_BASESTEP = 2000000000; // maximum base step const int MAX_DELAY = 5000; // maximum mindelay or maxdelay const int MAX_THUMBRANGE = 500; // maximum thumbrange const int MIN_DIRWD = 50; // minimum dirwinwd // Following are used by GetPrefs() before the view window is created: typedef enum { TopLeft, TopRight, BottomRight, BottomLeft, Middle } paste_location; typedef enum { And, Copy, Or, Xor } paste_mode; extern paste_location plocation; // location of cursor in paste rectangle extern paste_mode pmode; // logical paste mode // get/set plocation const char* GetPasteLocation(); void SetPasteLocation(const char* s); // get/set pmode const char* GetPasteMode(); void SetPasteMode(const char* s); // Cursor modes: extern wxCursor* curs_pencil; // for drawing cells extern wxCursor* curs_pick; // for picking cell states extern wxCursor* curs_cross; // for selecting cells extern wxCursor* curs_hand; // for moving view by dragging extern wxCursor* curs_zoomin; // for zooming in to a clicked cell extern wxCursor* curs_zoomout; // for zooming out from a clicked cell void FreeCursors(); // deallocate memory allocated by CreateCursors() const char* CursorToString(wxCursor* curs); // convert given cursor to corresponding string in Cursor Mode submenu wxCursor* StringToCursor(const char* s); // convert given string to a cursor (NULL if s is not valid) int CursorToIndex(wxCursor* curs); // convert given cursor to an index: 0 for curs_pencil, etc wxCursor* IndexToCursor(int i); // convert given index to a cursor (NULL if i is not in valid range) #endif golly-2.5-src/gui-wx/wxpython.h0000644000175100001440000000225212156145314013505 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXPYTHON_H_ #define _WXPYTHON_H_ void RunPythonScript(const wxString& filepath); // Run the given .py file. void AbortPythonScript(); // Abort the currently running Python script. void FinishPythonScripting(); // Called when app is quitting. #endif golly-2.5-src/gui-wx/wxrender.h0000755000175100001440000000734712156145314013460 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXRENDER_H_ #define _WXRENDER_H_ // Routines and data for rendering the viewport window: void InitDrawingData(); // Initialize drawing data (such as the image used to draw selections). // Must be called AFTER the viewport window has been created. void DestroyDrawingData(); // Call this when the main window is destroyed. void DrawView(wxDC& dc, int tileindex); // Draw the current pattern, grid lines, selection, etc. // The given tile index is only used when drawing tiled layers. void DrawOneIcon(wxDC& dc, int x, int y, wxBitmap* icon, unsigned char deadr, unsigned char deadg, unsigned char deadb, unsigned char liver, unsigned char liveg, unsigned char liveb, bool multicolor); // Draw the given icon using the given dead cell and live cell colors. void DrawSelection(wxDC &dc, wxRect& rect); // Draw the translucent selection image in the given rectangle. // We need to export this for drawing individual cells. void SetSelectionColor(); // Update the selection image's color. class lifealgo; void CreatePasteImage(lifealgo* pastealgo, wxRect& bbox); // Create an image used to draw the given paste pattern. // The given bounding box is not necessarily the *minimal* bounding box because // the paste pattern might have blank borders (in fact it could be empty). void DestroyPasteImage(); // Destroy the image created above (call when user clicks to end paste). void CreateTranslucentControls(); // Create the bitmap for translucent controls and set controlswd and // controlsht. Must be called BEFORE the viewport window is created. extern int controlswd; // width of translucent controls extern int controlsht; // height of translucent controls // control ids must match button order in controls bitmap typedef enum { NO_CONTROL = 0, // no current control (must be first) STEP1_CONTROL, // set step exponent to zero (ie. step by 1) SLOWER_CONTROL, // decrease step exponent FASTER_CONTROL, // increase step exponent FIT_CONTROL, // fit entire pattern in viewport ZOOMIN_CONTROL, // zoom in ZOOMOUT_CONTROL, // zoom out NW_CONTROL, // pan north west UP_CONTROL, // pan up NE_CONTROL, // pan north east LEFT_CONTROL, // pan left MIDDLE_CONTROL, // pan to 0,0 RIGHT_CONTROL, // pan right SW_CONTROL, // pan south west DOWN_CONTROL, // pan down SE_CONTROL // pan south east } control_id; extern control_id currcontrol; // currently clicked control control_id WhichControl(int x, int y); // Return the control at the given location in the controls bitmap. #endif golly-2.5-src/gui-wx/wxrule.h0000644000175100001440000000240212156145314013130 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXRULE_H_ #define _WXRULE_H_ bool ChangeRule(); // Open a dialog that lets the user change the current rule. // Return true if the rule change succeeds. Note that the // current algorithm might also change. wxString GetRuleName(const wxString& rulestring); // If given rule has a name then return name, otherwise return the rule. #endif golly-2.5-src/gui-wx/wxscript.h0000644000175100001440000001111712156145314013470 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXSCRIPT_H_ #define _WXSCRIPT_H_ #include "lifealgo.h" // for lifealgo class extern bool inscript; // Is a script currently running? We allow access to this flag // so clients can temporarily save and restore its setting. extern bool passkeys; extern bool passclicks; // Pass keyboard and/or mouse events to script? Both flags are initially false // at the start of a script; both become true if the script calls getevent. // If the script calls getkey (deprecated) then only passkeys becomes true. extern bool canswitch; // Can user switch layers while a script is running? extern bool stop_after_script; // Stop generating pattern after running script? void RunScript(const wxString& filename); // Run the given Perl or Python script. void PassClickToScript(const bigint& x, const bigint& y, int button, int modifiers); // Called if a script is running and user clicks mouse. void PassKeyToScript(int key, int modifiers = 0); // Called if a script is running and user hits a key. // Can also be used to abort a script by passing WXK_ESCAPE. void ShowTitleLater(); // Called if a script is running and window title has changed. void ChangeCell(int x, int y, int oldstate, int newstate); // A setcell/putcells command is changing state of cell at x,y. void SavePendingChanges(bool checkgenchanges = true); // Called to save any pending cell changes made by ChangeCell calls. // If checkgenchanges is true then it will also save any pending // generating changes. This lets us accumulate consecutive cell/gen // changes in a single undo/redo change node, which is better for // scripts like invert.py that can call setcell() many times, or // for scripts like oscar.py that can call run() many times. // Must be called BEFORE all undoredo->Remember... calls but // only if inscript && allowundo && !currlayer->stayclean. void FinishScripting(); // Called when app quits to abort a running script. // Following are used in wxperl.cpp and wxpython.cpp: extern bool autoupdate; // update display after changing current universe? extern bool allowcheck; // allow event checking? extern wxString scripterr; // Perl/Python error message extern wxString mousepos; // current mouse position const char abortmsg[] = "GOLLY: ABORT SCRIPT"; // special message used to indicate that the script was aborted void DoAutoUpdate(); // update display if autoupdate is true // The following Golly Script Functions are used to reduce code duplication. // They are called by corresponding pl_* and py_* functions in wxperl.cpp // and wxpython.cpp respectively. const char* GSF_open(char* filename, int remember); const char* GSF_save(char* filename, char* format, int remember); const char* GSF_setdir(char* dirname, char* newdir); const char* GSF_getdir(char* dirname); const char* GSF_setalgo(char* algostring); const char* GSF_setrule(char* rulestring); const char* GSF_setgen(char* genstring); const char* GSF_setpos(char* x, char* y); const char* GSF_setcell(int x, int y, int newstate); const char* GSF_paste(int x, int y, char* mode); const char* GSF_checkpos(lifealgo* algo, int x, int y); const char* GSF_checkrect(int x, int y, int wd, int ht); int GSF_hash(int x, int y, int wd, int ht); bool GSF_setoption(char* optname, int newval, int* oldval); bool GSF_getoption(char* optname, int* optval); bool GSF_setcolor(char* colname, wxColor& newcol, wxColor& oldcol); bool GSF_getcolor(char* colname, wxColor& color); void GSF_setname(char* name, int index); void GSF_select(int x, int y, int wd, int ht); void GSF_getevent(wxString& event, int get); const char* GSF_doevent(const wxString& event); void GSF_getkey(char* s); void GSF_dokey(char* ascii); void GSF_update(); void GSF_exit(char* errmsg); #endif golly-2.5-src/gui-wx/wxselect.h0000644000175100001440000001477012156145314013453 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXSELECT_H_ #define _WXSELECT_H_ #include "bigint.h" // for bigint #include "lifealgo.h" // for lifealgo // Most editing functions operate on the current selection. // The Selection class encapsulates all selection-related operations. class Selection { public: Selection(); Selection(int t, int l, int b, int r); ~Selection(); bool operator==(const Selection& sel) const; bool operator!=(const Selection& sel) const; bool Exists(); // return true if the selection exists void Deselect(); // remove the selection bool TooBig(); // return true if any selection edge is outside the editable limits void DisplaySize(); // display the selection's size in the status bar void SetRect(int x, int y, int wd, int ht); // set the selection to the given rectangle void GetRect(int* x, int* y, int* wd, int* ht); // return the selection rectangle void SetEdges(bigint& t, bigint& l, bigint& b, bigint& r); // set the selection using the given rectangle edges void CheckGridEdges(); // change selection edges if necessary to ensure they are inside a bounded grid bool Contains(bigint& t, bigint& l, bigint& b, bigint& r); // return true if the selection encloses the given rectangle bool Outside(bigint& t, bigint& l, bigint& b, bigint& r); // return true if the selection is completely outside the given rectangle bool ContainsCell(int x, int y); // return true if the given cell is within the selection void Advance(); // advance the pattern inside the selection by one generation void AdvanceOutside(); // advance the pattern outside the selection by one generation void Modify(const bigint& xclick, const bigint& yclick, bigint& anchorx, bigint& anchory, bool* forceh, bool* forcev); // modify the existing selection based on where the user clicked void SetLeftRight(const bigint& x, const bigint& anchorx); // set the selection's left and right edges void SetTopBottom(const bigint& y, const bigint& anchory); // set the selection's top and bottom edges void Fit(); // fit the selection inside the current viewport void Shrink(bool fit); // shrink the selection so it just encloses all the live cells // and optionally fit the new selection inside the current viewport bool Visible(wxRect* visrect); // return true if the selection is visible in the current viewport // and, if visrect is not NULL, set it to the visible rectangle void Clear(); // kill all cells inside the selection void ClearOutside(); // kill all cells outside the selection void CopyToClipboard(bool cut); // copy the selection to the clipboard (using RLE format) and // optionally clear the selection if cut is true bool CanPaste(const bigint& wd, const bigint& ht, bigint& top, bigint& left); // return true if the selection fits inside a rectangle of size ht x wd; // if so then top and left are set to the selection's top left corner void RandomFill(); // randomly fill the selection bool Flip(bool topbottom, bool inundoredo); // return true if selection was successfully flipped bool Rotate(bool clockwise, bool inundoredo); // return true if selection was successfully rotated private: bool SaveOutside(bigint& t, bigint& l, bigint& b, bigint& r); // remember live cells outside the selection void EmptyUniverse(); // kill all cells by creating a new, empty universe void AddRun(int state, int multistate, unsigned int &run, unsigned int &linelen, char* &chptr); void AddEOL(char* &chptr); // these routines are used by CopyToClipboard to create RLE data bool SaveDifferences(lifealgo* oldalgo, lifealgo* newalgo, int itop, int ileft, int ibottom, int iright); // compare same rectangle in the given universes and remember the differences // in cell states; return false only if user aborts lengthy comparison bool FlipRect(bool topbottom, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int top, int left, int bottom, int right); // called by Flip to flip given rectangle from source universe to // destination universe and optionally kill cells in the source rectangle; // return false only if user aborts lengthy flip bool RotateRect(bool clockwise, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int itop, int ileft, int ibottom, int iright, int ntop, int nleft, int nbottom, int nright); // called by Rotate to rotate given rectangle from source universe to // destination universe and optionally kill cells in the source rectangle; // return false only if user aborts lengthy rotation bool RotatePattern(bool clockwise, bigint& newtop, bigint& newbottom, bigint& newleft, bigint& newright, bool inundoredo); // called by Rotate when the selection encloses the entire pattern; // return false only if user aborts lengthy rotation bigint seltop, selleft, selbottom, selright; // currently we only support a single rectangular selection // which is represented by these edges; eventually we might // support arbitrarily complex selection shapes by maintaining // a list or dynamic array of non-overlapping rectangles bool exists; // does the selection exist? }; #endif golly-2.5-src/gui-wx/wxstatus.h0000755000175100001440000000723612156145314013521 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXSTATUS_H_ #define _WXSTATUS_H_ #include "bigint.h" // for bigint // Define a child window for status bar at top of main frame: class StatusBar : public wxWindow { public: StatusBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht); ~StatusBar(); void ClearMessage(); // erase bottom line of status bar void DisplayMessage(const wxString& s); // display message on bottom line of status bar void ErrorMessage(const wxString& s); // beep and display message on bottom line of status bar void SetMessage(const wxString& s); // set message string without displaying it (until next update) void UpdateXYLocation(); // XY location needs to be updated void CheckMouseLocation(bool active); // check location of mouse and update XY location if necessary wxString Stringify(const bigint& b); // convert given number to string suitable for display int GetCurrentDelay(); // return current delay (in millisecs) wxFont* GetStatusFont() { return statusfont; } int GetTextAscent() { return textascent; } int statusht; // status bar height (0 if not visible, else STATUS_HT or STATUS_EXHT) private: // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() // event handlers void OnPaint(wxPaintEvent& event); void OnMouseDown(wxMouseEvent& event); void OnEraseBackground(wxEraseEvent& event); bool ClickInGenBox(int x, int y); bool ClickInScaleBox(int x, int y); bool ClickInStepBox(int x, int y); void SetStatusFont(wxDC& dc); void DisplayText(wxDC& dc, const wxString& s, wxCoord x, wxCoord y); void DrawStatusBar(wxDC& dc, wxRect& updaterect); wxBitmap* statbitmap; // status bar bitmap int statbitmapwd; // width of status bar bitmap int statbitmapht; // height of status bar bitmap int h_gen; // horizontal position of "Generation" int h_pop; // horizontal position of "Population" int h_scale; // horizontal position of "Scale" int h_step; // horizontal position of "Step" int h_xy; // horizontal position of "XY" int textascent; // vertical adjustment used in DrawText calls wxString statusmsg; // for messages on bottom line bigint currx, curry; // cursor location in cell coords bool showxy; // show cursor's XY location? wxFont* statusfont; // status bar font }; extern const int STATUS_HT; // normal status bar height extern const int STATUS_EXHT; // height when showing exact numbers #endif golly-2.5-src/gui-wx/wxtimeline.h0000644000175100001440000000463512156145314014001 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXTIMELINE_H_ #define _WXTIMELINE_H_ // Timeline support: void CreateTimelineBar(wxWindow* parent); // Create timeline bar window at bottom of given parent window. int TimelineBarHeight(); // Return height of timeline bar. void ResizeTimelineBar(int y, int wd); // Move and/or resize timeline bar. void UpdateTimelineBar(bool active); // Update state of buttons in timeline bar. void ToggleTimelineBar(); // Show/hide timeline bar. void StartStopRecording(); // If recording a timeline then stop, otherwise start a new recording // (if no timeline exists) or extend the existing timeline. void DeleteTimeline(); // Delete the existing timeline. void InitTimelineFrame(); // Go to the first frame in the recently loaded timeline. bool TimelineExists(); // Does a timeline exist in the current algorithm? bool AutoPlay(); // Called in MainFrame::OnIdle so we can check if the next // timeline frame needs to be displayed. Returns true if we are // in autoplay mode and so another idle event needs to be sent. void PlayTimeline(int direction); // Play timeline forwards if given direction is +ve, or backwards // if direction is -ve, or stop if direction is 0. void PlayTimelineFaster(); // Increase the rate at which timeline frames are displayed. void PlayTimelineSlower(); // Decrease the rate at which timeline frames are displayed. void ResetTimelineSpeed(); // Reset autoplay speed to 0 (no delay, no frame skipping). bool TimelineIsPlaying(); // Return true if timeline is in autoplay mode. #endif golly-2.5-src/gui-wx/wxundo.h0000644000175100001440000001450212156145314013132 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXUNDO_H_ #define _WXUNDO_H_ #include "bigint.h" // for bigint class #include "wxselect.h" // for Selection class class Layer; // need this because wxlayer.h includes wxundo.h #include "wxlayer.h" // for Layer class #include "wxalgos.h" // for algo_type // This module implements unlimited undo/redo: typedef struct { int x; // cell's x position int y; // cell's y position int oldstate; // old state int newstate; // new state } cell_change; // stores a single cell change class UndoRedo { public: UndoRedo(); ~UndoRedo(); void SaveCellChange(int x, int y, int oldstate, int newstate); // cell at x,y has changed state void ForgetCellChanges(); // ignore cell changes made by any previous SaveCellChange calls bool RememberCellChanges(const wxString& action, bool olddirty); // remember cell changes made by any previous SaveCellChange calls, // and the state of the layer's dirty flag BEFORE the change; // the given action string will be appended to the Undo/Redo items; // return true if one or more cells changed state, false otherwise void RememberFlip(bool topbot, bool olddirty); // remember flip's direction void RememberRotation(bool clockwise, bool olddirty); // remember simple rotation (selection includes entire pattern) void RememberRotation(bool clockwise, Selection& oldsel, Selection& newsel, bool olddirty); // remember rotation's direction and old and new selections; // this variant assumes SaveCellChange may have been called void RememberSelection(const wxString& action); // remember selection change (no-op if selection hasn't changed) void RememberGenStart(); // remember info before generating the current pattern void RememberGenFinish(); // remember generating change after pattern has finished generating void AddGenChange(); // in some situations the undo list is empty but ResetPattern can still // be called because the gen count is > startgen, so this routine adds // a generating change to the undo list so the user can Undo or Reset // (and then Redo if they wish) void SyncUndoHistory(); // called by ResetPattern to synchronize the undo history void RememberSetGen(bigint& oldgen, bigint& newgen, bigint& oldstartgen, bool oldsave); // remember change of generation count void RememberNameChange(const wxString& oldname, const wxString& oldcurrfile, bool oldsave, bool olddirty); // remember change to current layer's name void DeletingClone(int index); // the given cloned layer is about to be deleted, so we must ignore // any later name changes involving this layer void RememberRuleChange(const wxString& oldrule); // remember rule change void RememberAlgoChange(algo_type oldalgo, const wxString& oldrule); // remember algorithm change, including a possible rule change // and possible cell changes (SaveCellChange may have been called) void RememberScriptStart(); // remember that script is about to start; this allows us to undo/redo // any changes made by the script all at once void RememberScriptFinish(); // remember that script has ended void DuplicateHistory(Layer* oldlayer, Layer* newlayer); // duplicate old layer's undo/redo history in new layer bool savecellchanges; // script's cell changes need to be remembered? bool savegenchanges; // script's gen changes need to be remembered? bool doingscriptchanges; // are script's changes being undone/redone? bool CanUndo(); // can a change be undone? bool CanRedo(); // can an undone change be redone? void UndoChange(); // undo a change void RedoChange(); // redo an undone change void UpdateUndoRedoItems(); // update Undo/Redo items in Edit menu void ClearUndoRedo(); // clear all undo/redo history private: wxList undolist; // list of undoable changes wxList redolist; // list of redoable changes cell_change* cellarray; // dynamic array of cell changes unsigned int numchanges; // number of cell changes unsigned int maxchanges; // number allocated bool badalloc; // malloc/realloc failed? wxString prevfile; // for saving pattern at start of gen change bigint prevgen; // generation count at start of gen change bigint prevx, prevy; // viewport position at start of gen change int prevmag; // scale at start of gen change int prevbase; // base step at start of gen change int prevexpo; // step exponent at start of gen change Selection prevsel; // selection at start of gen change int startcount; // unfinished RememberGenStart calls bool fixsetgen; // setgen node needs to be updated? void SaveCurrentPattern(const wxString& tempfile); // save current pattern to given temporary file void UpdateUndoItem(const wxString& action); void UpdateRedoItem(const wxString& action); // update the Undo/Redo items in the Edit menu }; #endif golly-2.5-src/gui-wx/wxutils.h0000644000175100001440000000734412156145314013333 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXUTILS_H_ #define _WXUTILS_H_ // Various utility routines: void Note(const wxString& msg); // Display given message in a modal dialog. void Warning(const wxString& msg); // Beep and display message in a modal dialog. void Fatal(const wxString& msg); // Beep, display message in a modal dialog, then exit app. void Beep(); // Play beep sound, depending on preference setting. bool GetString(const wxString& title, const wxString& prompt, const wxString& instring, wxString& outstring); // Display a dialog box to get a string from the user. // Returns false if user hits Cancel button. bool GetInteger(const wxString& title, const wxString& prompt, int inval, int minval, int maxval, int* outval); // Display a dialog box to get an integer value from the user. // Returns false if user hits Cancel button. int SaveChanges(const wxString& query, const wxString& msg); // Ask user if changes should be saved and return following result: // 2 if user selects Yes/Save button, // 1 if user selects No/Don't Save button, // 0 if user selects Cancel button. void BeginProgress(const wxString& dlgtitle); // Call at the start of a lengthy task. The cursor changes to indicate // the app is busy but the progress dialog won't appear immediately. bool AbortProgress(double fraction_done, const wxString& newmsg); // Call frequently while the task is being carried out. The progress // dialog only appears if the task is likely to take more than a few secs. // Pass in a fraction from 0.0 to 1.0 indicating how much has been done, // or any negative value to show an indeterminate progress gauge. // The given string can be used to display extra information. // The call returns true if the user cancels the progress dialog. void EndProgress(); // Call when the task has finished (even if it was aborted). void FillRect(wxDC& dc, wxRect& rect, wxBrush& brush); // Fill given rectangle using given brush. void CreatePaleBitmap(const wxBitmap& inmap, wxBitmap& outmap); // Create a pale gray version of given bitmap. bool IsScriptFile(const wxString& filename); // Return true if the given file is a Perl or Python script. // It simply checks if the file's extension is .pl or .py // (ignoring case). bool IsHTMLFile(const wxString& filename); // Return true if the given file's extension is .htm or .html // (ignoring case). bool IsTextFile(const wxString& filename); // Return true if the given file's extension is .txt or .doc, // or if it's not a HTML file and its name contains "readme" // (ignoring case). bool IsZipFile(const wxString& filename); // Return true if the given file's extension is .zip or .gar // (ignoring case). bool IsRuleFile(const wxString& filename); // Return true if the given file is a rule-related file with // an extension of .rule or .table or .tree or .colors or .icons // (ignoring case). #endif golly-2.5-src/gui-wx/wxview.h0000755000175100001440000002041312156145314013140 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _WXVIEW_H_ #define _WXVIEW_H_ #include "bigint.h" // for bigint #include "lifealgo.h" // for lifealgo #include "wxselect.h" // for Selection // Define a child window for viewing and editing patterns: class PatternView : public wxWindow { public: PatternView(wxWindow* parent, wxCoord x, wxCoord y, int wd, int ht, long style); ~PatternView(); // edit functions void CutSelection(); void CopySelection(); void ClearSelection(); void ClearOutsideSelection(); bool GetClipboardPattern(lifealgo** tempalgo, bigint* t, bigint* l, bigint* b, bigint* r); void PasteClipboard(bool toselection); void AbortPaste(); void CyclePasteLocation(); void CyclePasteMode(); void DisplaySelectionSize(); bool SelectionExists(); void SelectAll(); void RemoveSelection(); void ShrinkSelection(bool fit); void RandomFill(); bool FlipSelection(bool topbottom, bool inundoredo = false); bool RotateSelection(bool clockwise, bool inundoredo = false); void SetCursorMode(wxCursor* curs); void CycleCursorMode(); bool CopyRect(int top, int left, int bottom, int right, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, const wxString& progmsg); void CopyAllRect(int top, int left, int bottom, int right, lifealgo* srcalgo, lifealgo* destalgo, const wxString& progmsg); void SaveCurrentSelection(); void RememberNewSelection(const wxString& action); bool OutsideLimits(bigint& t, bigint& l, bigint& b, bigint& r); // return true if given rect is outside getcell/setcell limits bool GetCellPos(bigint& xpos, bigint& ypos); // return true and get mouse location's cell coords if over viewport bool PointInView(int x, int y); // return true if given screen position is in viewport // view functions void ZoomOut(); void ZoomIn(); void SetPixelsPerCell(int pxlspercell); void FitPattern(); void FitSelection(); void ViewOrigin(); void ChangeOrigin(); void RestoreOrigin(); void SetViewSize(int wd, int ht); bool GridVisible(); void ToggleGridLines(); void ToggleCellIcons(); void ToggleCellColors(); void ToggleBuffering(); void UpdateScrollBars(); // update thumb positions void CheckCursor(bool active); // make sure cursor is up to date int GetMag(); // get magnification (..., -1=2:1, 0=1:1, 1=1:2, ...) void SetMag(int newmag); void SetPosMag(const bigint& x, const bigint& y, int mag); void GetPos(bigint& x, bigint& y); void FitInView(int force); bool CellVisible(const bigint& x, const bigint& y); bool CellInGrid(const bigint& x, const bigint& y); bool PointInGrid(int x, int y); void TestAutoFit(); // process keyboard and mouse events void ProcessKey(int key, int modifiers); void ProcessClick(int x, int y, int button, int modifiers); void ProcessClickedControl(); // data bool waitingforclick; // waiting for paste click? bool drawingcells; // drawing cells due to dragging mouse? bool selectingcells; // selecting cells due to dragging mouse? bool movingview; // moving view due to dragging mouse? bool nopattupdate; // disable pattern updates? bool showcontrols; // draw translucent controls? wxRect controlsrect; // location of translucent controls wxRect pasterect; // area to be pasted wxCursor* oldcursor; // non-NULL if shift key has toggled cursor int tileindex; // if the tileindex is >= 0 then this is a tiled window (such windows // lie on top of the main viewport window when tilelayers is true); // the tileindex matches the layer position private: // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() // event handlers void OnPaint(wxPaintEvent& event); void OnSize(wxSizeEvent& event); void OnKeyDown(wxKeyEvent& event); void OnKeyUp(wxKeyEvent& event); void OnChar(wxKeyEvent& event); void OnMouseDown(wxMouseEvent& event); void OnMouseUp(wxMouseEvent& event); #if wxCHECK_VERSION(2, 8, 0) void OnMouseCaptureLost(wxMouseCaptureLostEvent& event); #endif void OnMouseWheel(wxMouseEvent& event); void OnMouseMotion(wxMouseEvent& event); void OnMouseEnter(wxMouseEvent& event); void OnMouseExit(wxMouseEvent& event); void OnDragTimer(wxTimerEvent& event); void OnScroll(wxScrollWinEvent& event); void OnEraseBackground(wxEraseEvent& event); // edit functions void ShowDrawing(); void DrawOneCell(wxDC& dc, int cx, int cy, int oldstate, int newstate); void StartDrawingCells(int x, int y); void DrawCells(int x, int y); void PickCell(int x, int y); void StartSelectingCells(int x, int y, bool shiftdown); void SelectCells(int x, int y); void StartMovingView(int x, int y); void MoveView(int x, int y); void StopDraggingMouse(); void RestoreSelection(); void ZoomInPos(int x, int y); void ZoomOutPos(int x, int y); void SetPasteRect(wxRect& rect, bigint& wd, bigint& ht); void PasteTemporaryToCurrent(bool toselection, bigint top, bigint left, bigint bottom, bigint right); bool FlipPastePattern(bool topbottom); bool RotatePastePattern(bool clockwise); // scroll functions void PanUp(int amount); void PanDown(int amount); void PanLeft(int amount); void PanRight(int amount); void PanNE(); void PanNW(); void PanSE(); void PanSW(); int SmallScroll(int xysize); int BigScroll(int xysize); // data wxBitmap* viewbitmap; // viewport bitmap used in OnPaint int viewbitmapwd; // width of viewport bitmap int viewbitmapht; // height of viewport bitmap wxTimer* dragtimer; // timer used while dragging mouse int cellx, celly; // current cell's 32-bit position bigint bigcellx, bigcelly; // current cell's position int initselx, initsely; // location of initial selection click bool forceh; // resize selection horizontally? bool forcev; // resize selection vertically? bigint anchorx, anchory; // anchor cell of current selection Selection prevsel; // previous selection int drawstate; // new cell state (0..255) wxBrush* cellbrush; // brush used to draw live cells int pastex, pastey; // where user wants to paste clipboard pattern int hthumb, vthumb; // current thumb box positions int realkey; // key code set by OnKeyDown wxString debugkey; // display debug info for OnKeyDown and OnChar }; const wxString empty_pattern = _("All cells are dead."); const wxString empty_selection = _("There are no live cells in the selection."); const wxString empty_outside = _("There are no live cells outside the selection."); const wxString no_selection = _("There is no selection."); const wxString selection_too_big = _("Selection is outside +/- 10^9 boundary."); const wxString pattern_too_big = _("Pattern is outside +/- 10^9 boundary."); const wxString origin_restored = _("Origin restored."); #endif golly-2.5-src/gui-wx/wxalgos.cpp0000644000175100001440000010307312156145314013627 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/filename.h" // for wxFileName #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "generationsalgo.h" #include "jvnalgo.h" #include "ruleloaderalgo.h" #include "wxgolly.h" // for wxGetApp #include "wxmain.h" // for ID_ALGO0 #include "wxutils.h" // for Fatal, Warning #include "wxprefs.h" // for gollydir #include "wxlayer.h" // for currlayer #include "wxalgos.h" // ----------------------------------------------------------------------------- // exported data: wxMenu* algomenu; // menu of algorithm names wxMenu* algomenupop; // copy of algomenu for PopupMenu calls algo_type initalgo = QLIFE_ALGO; // initial layer's algorithm AlgoData* algoinfo[MAX_ALGOS]; // static info for each algorithm wxBitmap** circles7x7; // circular icons for scale 1:8 wxBitmap** circles15x15; // circular icons for scale 1:16 wxBitmap** circles31x31; // circular icons for scale 1:32 wxBitmap** diamonds7x7; // diamond-shaped icons for scale 1:8 wxBitmap** diamonds15x15; // diamond-shaped icons for scale 1:16 wxBitmap** diamonds31x31; // diamond-shaped icons for scale 1:32 wxBitmap** hexagons7x7; // hexagonal icons for scale 1:8 wxBitmap** hexagons15x15; // hexagonal icons for scale 1:16 wxBitmap** hexagons31x31; // hexagonal icons for scale 1:32 wxBitmap** triangles7x7; // triangular icons for scale 1:8 wxBitmap** triangles15x15; // triangular icons for scale 1:16 wxBitmap** triangles31x31; // triangular icons for scale 1:32 // ----------------------------------------------------------------------------- // These default cell colors were generated by continuously finding the // color furthest in rgb space from the closest of the already selected // colors, black, and white. static unsigned char default_colors[] = { 48,48,48, // better if state 0 is dark gray (was 255,127,0) 0,255,127,127,0,255,148,148,148,128,255,0,255,0,128, 0,128,255,1,159,0,159,0,1,255,254,96,0,1,159,96,255,254, 254,96,255,126,125,21,21,126,125,125,21,126,255,116,116,116,255,116, 116,116,255,228,227,0,28,255,27,255,27,28,0,228,227,227,0,228, 27,28,255,59,59,59,234,195,176,175,196,255,171,194,68,194,68,171, 68,171,194,72,184,71,184,71,72,71,72,184,169,255,188,252,179,63, 63,252,179,179,63,252,80,9,0,0,80,9,9,0,80,255,175,250, 199,134,213,115,100,95,188,163,0,0,188,163,163,0,188,203,73,0, 0,203,73,73,0,203,94,189,0,189,0,94,0,94,189,187,243,119, 55,125,32,125,32,55,32,55,125,255,102,185,102,185,255,120,209,168, 208,166,119,135,96,192,182,255,41,83,153,130,247,88,55,89,247,55, 88,55,247,87,75,0,0,87,75,75,0,87,200,135,59,51,213,127, 255,255,162,255,37,182,37,182,255,228,57,117,142,163,210,57,117,228, 193,255,246,188,107,123,123,194,107,145,59,5,5,145,59,59,5,145, 119,39,198,40,197,23,197,23,40,23,40,197,178,199,158,255,201,121, 134,223,223,39,253,84,149,203,15,203,15,149,15,149,203,152,144,90, 143,75,139,71,97,132,224,65,219,65,219,224,255,255,40,218,223,69, 74,241,0,241,0,74,0,74,241,122,171,51,220,211,227,61,127,87, 90,124,176,36,39,13,165,142,255,255,38,255,38,255,255,83,50,107, 224,142,165,255,181,9,9,255,181,181,9,255,140,238,70,255,74,5, 74,5,255,138,84,51,31,172,101,177,115,17,221,0,0,0,221,0, 0,0,221,220,255,200,0,41,50,255,150,205,178,45,116,113,255,189, 47,0,44,40,119,171,205,107,255,177,115,172,133,73,236,109,0,168, 168,46,207,188,181,203,212,188,35,90,97,52,39,209,184,41,164,152, 227,46,70,46,70,227,211,156,255,98,146,222,136,56,95,102,54,152, 86,142,0,142,0,86,0,86,142,86,223,96,246,135,46,4,208,120, 212,233,158,177,92,214,104,147,88,149,240,147,227,93,148,72,255,133, 209,27,194,147,255,255,44,93,0,160,36,158,182,233,0,96,94,217, 218,103,88,163,154,38,118,114,139,94,0,43,113,164,174,168,188,114, 0,23,119,42,86,93,255,226,202,80,191,155,255,158,136,0,247,62, 234,146,88,0,183,229,110,212,36,0,143,161,105,191,210,133,164,0, 41,30,89,164,0,132,30,89,42,178,222,217,121,22,11,221,107,22, 69,151,255,45,158,3,158,3,45,3,45,158,86,42,29,9,122,22, 213,209,110,53,221,57,159,101,91,93,140,45,247,213,37,185,34,0, 0,185,34,34,0,185,236,0,172,210,180,78,231,107,221,162,49,43, 43,162,49,49,43,162,36,248,213,114,0,214,213,36,248,149,34,243, 185,158,167,144,122,224,34,245,149,255,31,98,31,98,255,152,200,193, 255,80,95,128,123,63,102,62,72,255,62,148,151,226,108,159,99,255, 226,255,126,98,223,136,80,95,255,225,153,15,73,41,211,212,71,41, 83,217,187,180,235,79,0,166,127,251,135,243,229,41,0,41,0,229, 82,255,216,141,174,249,249,215,255,167,31,79,31,79,167,213,102,185, 255,215,83,4,2,40,224,171,220,41,0,4,6,50,90,221,15,113, 15,113,221,33,0,115,108,23,90,182,215,36 }; // ----------------------------------------------------------------------------- // Note that all the default icons are grayscale bitmaps. // These icons are used for lots of different rules with different numbers // of states, and at rendering time we will replace the white pixels in each // icon with the cell's state color to avoid "color shock" when switching // between icon and non-icon view. Gray pixels are used to do anti-aliasing. // XPM data for default 7x7 icon static const char* default7x7[] = { // width height ncolors chars_per_pixel "7 7 4 1", // colors ". c #000000", // black will be transparent "D c #404040", "E c #E0E0E0", "W c #FFFFFF", // white // pixels ".DEWED.", "DWWWWWD", "EWWWWWE", "WWWWWWW", "EWWWWWE", "DWWWWWD", ".DEWED." }; // XPM data for default 15x15 icon static const char* default15x15[] = { // width height ncolors chars_per_pixel "15 15 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............", "....DBWWWBD....", "...BWWWWWWWB...", "..BWWWWWWWWWB..", ".DWWWWWWWWWWWD.", ".BWWWWWWWWWWWB.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".BWWWWWWWWWWWB.", ".DWWWWWWWWWWWD.", "..BWWWWWWWWWB..", "...BWWWWWWWB...", "....DBWWWBD....", "..............." }; // XPM data for default 31x31 icon static const char* default31x31[] = { // width height ncolors chars_per_pixel "31 31 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............................", "...............................", "..........DCBWWWWWBCD..........", ".........CWWWWWWWWWWWC.........", ".......DWWWWWWWWWWWWWWWD.......", "......BWWWWWWWWWWWWWWWWWB......", ".....BWWWWWWWWWWWWWWWWWWWB.....", "....DWWWWWWWWWWWWWWWWWWWWWD....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "....WWWWWWWWWWWWWWWWWWWWWWW....", "....DWWWWWWWWWWWWWWWWWWWWWD....", ".....BWWWWWWWWWWWWWWWWWWWB.....", "......BWWWWWWWWWWWWWWWWWB......", ".......DWWWWWWWWWWWWWWWD.......", ".........CWWWWWWWWWWWC.........", "..........DCBWWWWWBCD..........", "...............................", "..............................." }; // XPM data for the 7x7 icon used for hexagonal CA static const char* hex7x7[] = { // width height ncolors chars_per_pixel "7 7 3 1", // colors ". c #000000", // black will be transparent "C c #808080", "W c #FFFFFF", // white // pixels ".WWC...", "WWWWW..", "WWWWWW.", "CWWWWWC", ".WWWWWW", "..WWWWW", "...CWW."}; // XPM data for the 15x15 icon used for hexagonal CA static const char* hex15x15[] = { // width height ncolors chars_per_pixel "15 15 3 1", // colors ". c #000000", // black will be transparent "C c #808080", "W c #FFFFFF", // white // pixels "...WWC.........", "..WWWWWC.......", ".WWWWWWWWC.....", "WWWWWWWWWWW....", "WWWWWWWWWWWW...", "CWWWWWWWWWWWC..", ".WWWWWWWWWWWW..", ".CWWWWWWWWWWWC.", "..WWWWWWWWWWWW.", "..CWWWWWWWWWWWC", "...WWWWWWWWWWWW", "....WWWWWWWWWWW", ".....CWWWWWWWW.", ".......CWWWWW..", ".........CWW..."}; // XPM data for 31x31 icon used for hexagonal CA static const char* hex31x31[] = { // width height ncolors chars_per_pixel "31 31 3 1", // colors ". c #000000", // black will be transparent "C c #808080", "W c #FFFFFF", // white // pixels ".....WWC.......................", "....WWWWWC.....................", "...WWWWWWWWC...................", "..WWWWWWWWWWWC.................", ".WWWWWWWWWWWWWWC...............", "WWWWWWWWWWWWWWWWWC.............", "WWWWWWWWWWWWWWWWWWWC...........", "CWWWWWWWWWWWWWWWWWWWWC.........", ".WWWWWWWWWWWWWWWWWWWWWW........", ".CWWWWWWWWWWWWWWWWWWWWWC.......", "..WWWWWWWWWWWWWWWWWWWWWW.......", "..CWWWWWWWWWWWWWWWWWWWWWC......", "...WWWWWWWWWWWWWWWWWWWWWW......", "...CWWWWWWWWWWWWWWWWWWWWWC.....", "....WWWWWWWWWWWWWWWWWWWWWW.....", "....CWWWWWWWWWWWWWWWWWWWWWC....", ".....WWWWWWWWWWWWWWWWWWWWWW....", ".....CWWWWWWWWWWWWWWWWWWWWWC...", "......WWWWWWWWWWWWWWWWWWWWWW...", "......CWWWWWWWWWWWWWWWWWWWWWC..", ".......WWWWWWWWWWWWWWWWWWWWWW..", ".......CWWWWWWWWWWWWWWWWWWWWWC.", "........WWWWWWWWWWWWWWWWWWWWWW.", ".........CWWWWWWWWWWWWWWWWWWWWC", "...........CWWWWWWWWWWWWWWWWWWW", ".............CWWWWWWWWWWWWWWWWW", "...............CWWWWWWWWWWWWWW.", ".................CWWWWWWWWWWW..", "...................CWWWWWWWW...", ".....................CWWWWW....", ".......................CWW....." }; // XPM data for the 7x7 icon used for von Neumann CA static const char* vn7x7[] = { // width height ncolors chars_per_pixel "7 7 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels "...W...", "..WWW..", ".WWWWW.", "WWWWWWW", ".WWWWW.", "..WWW..", "...W..." }; // XPM data for the 15x15 icon used for von Neumann CA static const char* vn15x15[] = { // width height ncolors chars_per_pixel "15 15 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "..............." }; // XPM data for 31x31 icon used for von Neumann CA static const char* vn31x31[] = { // width height ncolors chars_per_pixel "31 31 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "..............................." }; // XPM data for the 7x7 icons used by 4-state rules emulating a triangular neighborhood static const char* tri7x7[] = { // width height ncolors chars_per_pixel "7 21 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels for state 1 ".......", "W......", "WW.....", "WWW....", "WWWW...", "WWWWW..", "WWWWWW.", // pixels for state 2 ".WWWWWW", "..WWWWW", "...WWWW", "....WWW", ".....WW", "......W", ".......", // pixels for state 3 ".WWWWWW", "W.WWWWW", "WW.WWWW", "WWW.WWW", "WWWW.WW", "WWWWW.W", "WWWWWW." }; // XPM data for the 15x15 icons used by 4-state rules emulating a triangular neighborhood static const char* tri15x15[] = { // width height ncolors chars_per_pixel "15 45 2 1", // colors ". c #000000", "W c #FFFFFF", // pixels for state 1 "...............", "W..............", "WW.............", "WWW............", "WWWW...........", "WWWWW..........", "WWWWWW.........", "WWWWWWW........", "WWWWWWWW.......", "WWWWWWWWW......", "WWWWWWWWWW.....", "WWWWWWWWWWW....", "WWWWWWWWWWWW...", "WWWWWWWWWWWWW..", "WWWWWWWWWWWWWW.", // pixels for state 2 ".WWWWWWWWWWWWWW", "..WWWWWWWWWWWWW", "...WWWWWWWWWWWW", "....WWWWWWWWWWW", ".....WWWWWWWWWW", "......WWWWWWWWW", ".......WWWWWWWW", "........WWWWWWW", ".........WWWWWW", "..........WWWWW", "...........WWWW", "............WWW", ".............WW", "..............W", "...............", // pixels for state 3 ".WWWWWWWWWWWWWW", "W.WWWWWWWWWWWWW", "WW.WWWWWWWWWWWW", "WWW.WWWWWWWWWWW", "WWWW.WWWWWWWWWW", "WWWWW.WWWWWWWWW", "WWWWWW.WWWWWWWW", "WWWWWWW.WWWWWWW", "WWWWWWWW.WWWWWW", "WWWWWWWWW.WWWWW", "WWWWWWWWWW.WWWW", "WWWWWWWWWWW.WWW", "WWWWWWWWWWWW.WW", "WWWWWWWWWWWWW.W", "WWWWWWWWWWWWWW." }; // XPM data for the 31x31 icons used by 4-state rules emulating a triangular neighborhood static const char* tri31x31[] = { // width height ncolors chars_per_pixel "31 93 2 1", // colors ". c #000000", "W c #FFFFFF", // pixels for state 1 "...............................", "W..............................", "WW.............................", "WWW............................", "WWWW...........................", "WWWWW..........................", "WWWWWW.........................", "WWWWWWW........................", "WWWWWWWW.......................", "WWWWWWWWW......................", "WWWWWWWWWW.....................", "WWWWWWWWWWW....................", "WWWWWWWWWWWW...................", "WWWWWWWWWWWWW..................", "WWWWWWWWWWWWWW.................", "WWWWWWWWWWWWWWW................", "WWWWWWWWWWWWWWWW...............", "WWWWWWWWWWWWWWWWW..............", "WWWWWWWWWWWWWWWWWW.............", "WWWWWWWWWWWWWWWWWWW............", "WWWWWWWWWWWWWWWWWWWW...........", "WWWWWWWWWWWWWWWWWWWWW..........", "WWWWWWWWWWWWWWWWWWWWWW.........", "WWWWWWWWWWWWWWWWWWWWWWW........", "WWWWWWWWWWWWWWWWWWWWWWWW.......", "WWWWWWWWWWWWWWWWWWWWWWWWW......", "WWWWWWWWWWWWWWWWWWWWWWWWWW.....", "WWWWWWWWWWWWWWWWWWWWWWWWWWW....", "WWWWWWWWWWWWWWWWWWWWWWWWWWWW...", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW..", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.", // pixels for state 2 ".WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "..WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "...WWWWWWWWWWWWWWWWWWWWWWWWWWWW", "....WWWWWWWWWWWWWWWWWWWWWWWWWWW", ".....WWWWWWWWWWWWWWWWWWWWWWWWWW", "......WWWWWWWWWWWWWWWWWWWWWWWWW", ".......WWWWWWWWWWWWWWWWWWWWWWWW", "........WWWWWWWWWWWWWWWWWWWWWWW", ".........WWWWWWWWWWWWWWWWWWWWWW", "..........WWWWWWWWWWWWWWWWWWWWW", "...........WWWWWWWWWWWWWWWWWWWW", "............WWWWWWWWWWWWWWWWWWW", ".............WWWWWWWWWWWWWWWWWW", "..............WWWWWWWWWWWWWWWWW", "...............WWWWWWWWWWWWWWWW", "................WWWWWWWWWWWWWWW", ".................WWWWWWWWWWWWWW", "..................WWWWWWWWWWWWW", "...................WWWWWWWWWWWW", "....................WWWWWWWWWWW", ".....................WWWWWWWWWW", "......................WWWWWWWWW", ".......................WWWWWWWW", "........................WWWWWWW", ".........................WWWWWW", "..........................WWWWW", "...........................WWWW", "............................WWW", ".............................WW", "..............................W", "...............................", // pixels for state 3 ".WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "W.WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "WW.WWWWWWWWWWWWWWWWWWWWWWWWWWWW", "WWW.WWWWWWWWWWWWWWWWWWWWWWWWWWW", "WWWW.WWWWWWWWWWWWWWWWWWWWWWWWWW", "WWWWW.WWWWWWWWWWWWWWWWWWWWWWWWW", "WWWWWW.WWWWWWWWWWWWWWWWWWWWWWWW", "WWWWWWW.WWWWWWWWWWWWWWWWWWWWWWW", "WWWWWWWW.WWWWWWWWWWWWWWWWWWWWWW", "WWWWWWWWW.WWWWWWWWWWWWWWWWWWWWW", "WWWWWWWWWW.WWWWWWWWWWWWWWWWWWWW", "WWWWWWWWWWW.WWWWWWWWWWWWWWWWWWW", "WWWWWWWWWWWW.WWWWWWWWWWWWWWWWWW", "WWWWWWWWWWWWW.WWWWWWWWWWWWWWWWW", "WWWWWWWWWWWWWW.WWWWWWWWWWWWWWWW", "WWWWWWWWWWWWWWW.WWWWWWWWWWWWWWW", "WWWWWWWWWWWWWWWW.WWWWWWWWWWWWWW", "WWWWWWWWWWWWWWWWW.WWWWWWWWWWWWW", "WWWWWWWWWWWWWWWWWW.WWWWWWWWWWWW", "WWWWWWWWWWWWWWWWWWW.WWWWWWWWWWW", "WWWWWWWWWWWWWWWWWWWW.WWWWWWWWWW", "WWWWWWWWWWWWWWWWWWWWW.WWWWWWWWW", "WWWWWWWWWWWWWWWWWWWWWW.WWWWWWWW", "WWWWWWWWWWWWWWWWWWWWWWW.WWWWWWW", "WWWWWWWWWWWWWWWWWWWWWWWW.WWWWWW", "WWWWWWWWWWWWWWWWWWWWWWWWW.WWWWW", "WWWWWWWWWWWWWWWWWWWWWWWWWW.WWWW", "WWWWWWWWWWWWWWWWWWWWWWWWWWW.WWW", "WWWWWWWWWWWWWWWWWWWWWWWWWWWW.WW", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW.W", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW." }; // ----------------------------------------------------------------------------- wxBitmap** CreateIconBitmaps(const char** xpmdata, int maxstates) { if (xpmdata == NULL) return NULL; wxImage image(xpmdata); #ifdef __WXMSW__ if (!image.HasAlpha()) { // add alpha channel and set to opaque image.InitAlpha(); } #endif #ifdef __WXGTK__ // need alpha channel on Linux image.SetMaskColour(0, 0, 0); // make black transparent #endif wxBitmap allicons(image, -1); // RGBA int wd = allicons.GetWidth(); int numicons = allicons.GetHeight() / wd; if (numicons > 255) numicons = 255; // play safe wxBitmap** iconptr = (wxBitmap**) malloc(256 * sizeof(wxBitmap*)); if (iconptr) { // initialize all pointers (not just those < maxstates) for (int i = 0; i < 256; i++) iconptr[i] = NULL; for (int i = 0; i < numicons; i++) { wxRect rect(0, i*wd, wd, wd); // add 1 to skip iconptr[0] (ie. dead state) iconptr[i+1] = new wxBitmap(allicons.GetSubBitmap(rect)); } if (numicons < maxstates-1 && iconptr[numicons]) { // duplicate last icon wxRect rect(0, (numicons-1)*wd, wd, wd); for (int i = numicons; i < maxstates-1; i++) { iconptr[i+1] = new wxBitmap(allicons.GetSubBitmap(rect)); } } } return iconptr; } // ----------------------------------------------------------------------------- void FreeIconBitmaps(wxBitmap** icons) { if (icons) { for (int i = 0; i < 256; i++) delete icons[i]; free(icons); } } // ----------------------------------------------------------------------------- wxBitmap** ScaleIconBitmaps(wxBitmap** srcicons, int size) { if (srcicons == NULL) return NULL; wxBitmap** iconptr = (wxBitmap**) malloc(256 * sizeof(wxBitmap*)); if (iconptr) { for (int i = 0; i < 256; i++) { if (srcicons[i] == NULL) { iconptr[i] = NULL; } else { wxImage image = srcicons[i]->ConvertToImage(); #ifdef __WXGTK__ // fix wxGTK bug when converting black-and-white bitmap (black pixels are 1,2,3 not 0,0,0) if (image.CountColours(2) <= 2) { int numpixels = image.GetWidth() * image.GetHeight(); unsigned char* newdata = (unsigned char*) malloc(numpixels * 3); if (newdata) { unsigned char* p = image.GetData(); unsigned char* n = newdata; for (int j = 0; j < numpixels; j++) { unsigned char r = *p++; unsigned char g = *p++; unsigned char b = *p++; if (r == 1 && g == 2 && b == 3) { // change to black *n++ = 0; *n++ = 0; *n++ = 0; } else { // probably white *n++ = r; *n++ = g; *n++ = b; } } image.SetData(newdata); // image now owns pointer } } #endif // do NOT scale using wxIMAGE_QUALITY_HIGH (thin lines can disappear) image.Rescale(size, size, wxIMAGE_QUALITY_NORMAL); #ifdef __WXMSW__ if (!image.HasAlpha()) { // add alpha channel and set to opaque image.InitAlpha(); } #endif iconptr[i] = new wxBitmap(image, -1); } } } return iconptr; } // ----------------------------------------------------------------------------- static void CreateDefaultIcons(AlgoData* ad) { if (ad->defxpm7x7 || ad->defxpm15x15 || ad->defxpm31x31) { // create icons using given algo's default XPM data ad->icons7x7 = CreateIconBitmaps(ad->defxpm7x7, ad->maxstates); ad->icons15x15 = CreateIconBitmaps(ad->defxpm15x15, ad->maxstates); ad->icons31x31 = CreateIconBitmaps(ad->defxpm31x31, ad->maxstates); // create scaled bitmaps if size(s) not supplied if (!ad->icons7x7) { if (ad->icons15x15) // scale down 15x15 bitmaps ad->icons7x7 = ScaleIconBitmaps(ad->icons15x15, 7); else // scale down 31x31 bitmaps ad->icons7x7 = ScaleIconBitmaps(ad->icons31x31, 7); } if (!ad->icons15x15) { if (ad->icons31x31) // scale down 31x31 bitmaps ad->icons15x15 = ScaleIconBitmaps(ad->icons31x31, 15); else // scale up 7x7 bitmaps ad->icons15x15 = ScaleIconBitmaps(ad->icons7x7, 15); } if (!ad->icons31x31) { if (ad->icons15x15) // scale up 15x15 bitmaps ad->icons31x31 = ScaleIconBitmaps(ad->icons15x15, 31); else // scale up 7x7 bitmaps ad->icons31x31 = ScaleIconBitmaps(ad->icons7x7, 31); } } else { // algo didn't supply any icons so use static XPM data defined above ad->icons7x7 = CreateIconBitmaps(default7x7, ad->maxstates); ad->icons15x15 = CreateIconBitmaps(default15x15, ad->maxstates); ad->icons31x31 = CreateIconBitmaps(default31x31, ad->maxstates); } } // ----------------------------------------------------------------------------- AlgoData::AlgoData() { algomem = defbase = 0; statusbrush = NULL; icons7x7 = NULL; icons15x15 = NULL; icons31x31 = NULL; } // ----------------------------------------------------------------------------- AlgoData::~AlgoData() { FreeIconBitmaps(icons7x7); FreeIconBitmaps(icons15x15); FreeIconBitmaps(icons31x31); delete statusbrush; } // ----------------------------------------------------------------------------- AlgoData& AlgoData::tick() { AlgoData* r = new AlgoData(); algoinfo[r->id] = r; return *r; } // ----------------------------------------------------------------------------- void InitAlgorithms() { // qlife must be 1st and hlife must be 2nd qlifealgo::doInitializeAlgoInfo(AlgoData::tick()); hlifealgo::doInitializeAlgoInfo(AlgoData::tick()); // nicer if the rest are in alphabetical order generationsalgo::doInitializeAlgoInfo(AlgoData::tick()); jvnalgo::doInitializeAlgoInfo(AlgoData::tick()); ruleloaderalgo::doInitializeAlgoInfo(AlgoData::tick()); // algomenu is used for the Control > Set Algorithm submenu; // algomenupop is used when the tool bar's algo button is pressed // (we can't share a single menu for both purposes because we get // assert messages with wxOSX and wxGTK 2.9+) algomenu = new wxMenu(); algomenupop = new wxMenu(); // init algoinfo array for (int i = 0; i < NumAlgos(); i++) { AlgoData* ad = algoinfo[i]; if (ad->algoName == 0 || ad->creator == 0) Fatal(_("Algorithm did not set name and/or creator")); wxString name = wxString(ad->algoName, wxConvLocal); algomenu->AppendCheckItem(ID_ALGO0 + i, name); algomenupop->AppendCheckItem(ID_ALGO0 + i, name); // does algo use hashing? ad->canhash = ad->defbase == 8; //!!! safer method needed??? // set status bar background by cycling thru a few pale colors switch (i % 9) { case 0: ad->statusrgb.Set(255, 255, 206); break; // pale yellow case 1: ad->statusrgb.Set(226, 250, 248); break; // pale blue case 2: ad->statusrgb.Set(255, 233, 233); break; // pale pink case 3: ad->statusrgb.Set(225, 255, 225); break; // pale green case 4: ad->statusrgb.Set(243, 225, 255); break; // pale purple case 5: ad->statusrgb.Set(255, 220, 180); break; // pale orange case 6: ad->statusrgb.Set(200, 255, 255); break; // pale aqua case 7: ad->statusrgb.Set(200, 200, 200); break; // pale gray case 8: ad->statusrgb.Set(255, 255, 255); break; // white } ad->statusbrush = new wxBrush(ad->statusrgb); // initialize default color scheme if (ad->defr[0] == ad->defr[1] && ad->defg[0] == ad->defg[1] && ad->defb[0] == ad->defb[1]) { // colors are nonsensical, probably unset, so use above defaults unsigned char* rgbptr = default_colors; for (int c = 0; c < ad->maxstates; c++) { ad->defr[c] = *rgbptr++; ad->defg[c] = *rgbptr++; ad->defb[c] = *rgbptr++; } } ad->gradient = ad->defgradient; ad->fromrgb.Set(ad->defr1, ad->defg1, ad->defb1); ad->torgb.Set(ad->defr2, ad->defg2, ad->defb2); for (int c = 0; c < ad->maxstates; c++) { ad->algor[c] = ad->defr[c]; ad->algog[c] = ad->defg[c]; ad->algob[c] = ad->defb[c]; } CreateDefaultIcons(ad); } circles7x7 = CreateIconBitmaps(default7x7,256); circles15x15 = CreateIconBitmaps(default15x15,256); circles31x31 = CreateIconBitmaps(default31x31,256); diamonds7x7 = CreateIconBitmaps(vn7x7,256); diamonds15x15 = CreateIconBitmaps(vn15x15,256); diamonds31x31 = CreateIconBitmaps(vn31x31,256); hexagons7x7 = CreateIconBitmaps(hex7x7,256); hexagons15x15 = CreateIconBitmaps(hex15x15,256); hexagons31x31 = CreateIconBitmaps(hex31x31,256); // these icons can only be used with 4-state rules triangles7x7 = CreateIconBitmaps(tri7x7,4); triangles15x15 = CreateIconBitmaps(tri15x15,4); triangles31x31 = CreateIconBitmaps(tri31x31,4); } // ----------------------------------------------------------------------------- void DeleteAlgorithms() { for (int i = 0; i < NumAlgos(); i++) delete algoinfo[i]; FreeIconBitmaps(circles7x7); FreeIconBitmaps(circles15x15); FreeIconBitmaps(circles31x31); FreeIconBitmaps(diamonds7x7); FreeIconBitmaps(diamonds15x15); FreeIconBitmaps(diamonds31x31); FreeIconBitmaps(hexagons7x7); FreeIconBitmaps(hexagons15x15); FreeIconBitmaps(hexagons31x31); FreeIconBitmaps(triangles7x7); FreeIconBitmaps(triangles15x15); FreeIconBitmaps(triangles31x31); delete algomenupop; } // ----------------------------------------------------------------------------- lifealgo* CreateNewUniverse(algo_type algotype, bool allowcheck) { lifealgo* newalgo = algoinfo[algotype]->creator(); if (newalgo == NULL) Fatal(_("Failed to create new universe!")); if (algoinfo[algotype]->algomem >= 0) newalgo->setMaxMemory(algoinfo[algotype]->algomem); if (allowcheck) newalgo->setpoll(wxGetApp().Poller()); return newalgo; } // ----------------------------------------------------------------------------- const char* GetAlgoName(algo_type algotype) { return algoinfo[algotype]->algoName; } // ----------------------------------------------------------------------------- int NumAlgos() { return staticAlgoInfo::getNumAlgos(); } // ----------------------------------------------------------------------------- bool MultiColorImage(wxImage& image) { // return true if image contains at least one color that isn't a shade of gray int numpixels = image.GetWidth() * image.GetHeight(); unsigned char* p = image.GetData(); // p points to RGBRGB... (ie. no alpha data) for (int i = 0; i < numpixels; i++) { unsigned char r = *p++; unsigned char g = *p++; unsigned char b = *p++; if (r != g || g != b) { if (image.CountColours(2) <= 2) { // Golly 2.4 and older treated two-color icons as monochrome // so we need to convert the image to black-and-white image = image.ConvertToMono(r, g, b); return false; // grayscale image } else { return true; // multi-color image } } } return false; // grayscale image } // ----------------------------------------------------------------------------- bool LoadIconFile(const wxString& path, int maxstate, wxBitmap*** out7x7, wxBitmap*** out15x15, wxBitmap*** out31x31) { wxImage image; if (!image.LoadFile(path)) { Warning(_("Could not load icon bitmaps from file:\n") + path); return false; } // check for multi-color icons currlayer->multicoloricons = MultiColorImage(image); #ifdef __WXMSW__ if (!image.HasAlpha()) { // add alpha channel and set to opaque image.InitAlpha(); } #endif #ifdef __WXGTK__ // need alpha channel on Linux image.SetMaskColour(0, 0, 0); // make black transparent #endif wxBitmap allicons(image, -1); // RGBA int wd = allicons.GetWidth(); int ht = allicons.GetHeight(); // check dimensions if (ht != 15 && ht != 22) { Warning(_("Wrong bitmap height in icon file (must be 15 or 22):\n") + path); return false; } if (wd % 15 != 0) { Warning(_("Wrong bitmap width in icon file (must be multiple of 15):\n") + path); return false; } // first extract 15x15 icons int numicons = wd / 15; if (numicons > 255) numicons = 255; // play safe wxBitmap** iconptr = (wxBitmap**) malloc(256 * sizeof(wxBitmap*)); if (iconptr) { for (int i = 0; i < 256; i++) iconptr[i] = NULL; for (int i = 0; i < numicons; i++) { wxRect rect(i*15, 0, 15, 15); // add 1 to skip iconptr[0] (ie. dead state) iconptr[i+1] = new wxBitmap(allicons.GetSubBitmap(rect)); } if (numicons < maxstate && iconptr[numicons]) { // duplicate last icon wxRect rect((numicons-1)*15, 0, 15, 15); for (int i = numicons; i < maxstate; i++) { iconptr[i+1] = new wxBitmap(allicons.GetSubBitmap(rect)); } } // if there is an extra icon at the right end of the multi-color icons then // store it in iconptr[0] -- it will be used later in UpdateCurrentColors() // to set the color of state 0 if (currlayer->multicoloricons && (wd / 15) > maxstate) { wxRect rect(maxstate*15, 0, 15, 15); iconptr[0] = new wxBitmap(allicons.GetSubBitmap(rect)); } } *out15x15 = iconptr; if (ht == 22) { // extract 7x7 icons (at bottom left corner of each 15x15 icon) iconptr = (wxBitmap**) malloc(256 * sizeof(wxBitmap*)); if (iconptr) { for (int i = 0; i < 256; i++) iconptr[i] = NULL; for (int i = 0; i < numicons; i++) { wxRect rect(i*15, 15, 7, 7); // add 1 to skip iconptr[0] (ie. dead state) iconptr[i+1] = new wxBitmap(allicons.GetSubBitmap(rect)); } if (numicons < maxstate && iconptr[numicons]) { // duplicate last icon wxRect rect((numicons-1)*15, 15, 7, 7); for (int i = numicons; i < maxstate; i++) { iconptr[i+1] = new wxBitmap(allicons.GetSubBitmap(rect)); } } } *out7x7 = iconptr; } else { // create 7x7 icons by scaling down 15x15 icons *out7x7 = ScaleIconBitmaps(*out15x15, 7); } // create 31x31 icons by scaling up 15x15 icons *out31x31 = ScaleIconBitmaps(*out15x15, 31); return true; } golly-2.5-src/gui-wx/wxcontrol.cpp0000644000175100001440000031204012156145314014176 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/dir.h" // for wxDir #include "wx/file.h" // for wxFile #include "wx/filename.h" // for wxFileName #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "util.h" // for linereader #include "wxgolly.h" // for wxGetApp, statusptr, viewptr, bigview #include "wxutils.h" // for BeginProgress, GetString, etc #include "wxprefs.h" // for allowundo, etc #include "wxrule.h" // for ChangeRule #include "wxhelp.h" // for LoadLexiconPattern #include "wxstatus.h" // for statusptr->... #include "wxselect.h" // for Selection #include "wxview.h" // for viewptr->... #include "wxscript.h" // for inscript, PassKeyToScript #include "wxmain.h" // for MainFrame #include "wxundo.h" // for undoredo->... #include "wxalgos.h" // for *_ALGO, algo_type, CreateNewUniverse, etc #include "wxlayer.h" // for currlayer, etc #include "wxrender.h" // for DrawView #include "wxtimeline.h" // for TimelineExists, UpdateTimelineBar, etc #include // for std::runtime_error and std::exception #include // for std::ostringstream // This module implements Control menu functions. // ----------------------------------------------------------------------------- bool MainFrame::SaveStartingPattern() { if ( currlayer->algo->getGeneration() > currlayer->startgen ) { // don't do anything if current gen count > starting gen return true; } // save current rule, dirty flag, scale, location, etc currlayer->startname = currlayer->currname; currlayer->startrule = wxString(currlayer->algo->getrule(), wxConvLocal); currlayer->startdirty = currlayer->dirty; currlayer->startmag = viewptr->GetMag(); viewptr->GetPos(currlayer->startx, currlayer->starty); currlayer->startbase = currlayer->currbase; currlayer->startexpo = currlayer->currexpo; currlayer->startalgo = currlayer->algtype; // if this layer is a clone then save some settings in other clones if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->startname = cloneptr->currname; cloneptr->startx = cloneptr->view->x; cloneptr->starty = cloneptr->view->y; cloneptr->startmag = cloneptr->view->getmag(); cloneptr->startbase = cloneptr->currbase; cloneptr->startexpo = cloneptr->currexpo; } } } // save current selection currlayer->startsel = currlayer->currsel; if ( !currlayer->savestart ) { // no need to save pattern; ResetPattern will load currfile currlayer->startfile.Clear(); return true; } // save starting pattern in tempstart file // use CanWriteFormat(MC_format)??? if ( currlayer->algo->hyperCapable() ) { // much faster to save pattern in a macrocell file const char* err = WritePattern(currlayer->tempstart, MC_format, no_compression, 0, 0, 0, 0); if (err) { statusptr->ErrorMessage(wxString(err,wxConvLocal)); // don't allow user to continue generating return false; } } else { // can only save as RLE if edges are within getcell/setcell limits bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Starting pattern is outside +/- 10^9 boundary.")); // don't allow user to continue generating return false; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); // use XRLE format so the pattern's top left location and the current // generation count are stored in the file const char* err = WritePattern(currlayer->tempstart, XRLE_format, no_compression, itop, ileft, ibottom, iright); if (err) { statusptr->ErrorMessage(wxString(err,wxConvLocal)); // don't allow user to continue generating return false; } } currlayer->startfile = currlayer->tempstart; // ResetPattern will load tempstart return true; } // ----------------------------------------------------------------------------- void MainFrame::ResetPattern(bool resetundo) { if (currlayer->algo->getGeneration() == currlayer->startgen) return; if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(ID_RESET); /* can't use wxPostEvent here because Yield processes all pending events: // send Reset command to event queue wxCommandEvent resetevt(wxEVT_COMMAND_MENU_SELECTED, ID_RESET); wxPostEvent(this->GetEventHandler(), resetevt); */ return; } if (inscript) stop_after_script = true; if (currlayer->algo->getGeneration() < currlayer->startgen) { // if this happens then startgen logic is wrong Warning(_("Current gen < starting gen!")); return; } if (currlayer->startfile.IsEmpty() && currlayer->currfile.IsEmpty()) { // if this happens then savestart logic is wrong Warning(_("Starting pattern cannot be restored!")); return; } if (allowundo && !currlayer->stayclean && inscript) { // script called reset() SavePendingChanges(); currlayer->undoredo->RememberGenStart(); } // save current algo and rule algo_type oldalgo = currlayer->algtype; wxString oldrule = wxString(currlayer->algo->getrule(), wxConvLocal); // restore pattern and settings saved by SaveStartingPattern; // first restore algorithm currlayer->algtype = currlayer->startalgo; // restore starting pattern if ( currlayer->startfile.IsEmpty() ) { // restore pattern from currfile LoadPattern(currlayer->currfile, wxEmptyString); } else { // restore pattern from startfile LoadPattern(currlayer->startfile, wxEmptyString); } if (currlayer->algo->getGeneration() != currlayer->startgen) { // LoadPattern failed to reset the gen count to startgen // (probably because the user deleted the starting pattern) // so best to clear the pattern and reset the gen count CreateUniverse(); currlayer->algo->setGeneration(currlayer->startgen); } // ensure savestart flag is correct currlayer->savestart = !currlayer->startfile.IsEmpty(); // restore settings saved by SaveStartingPattern RestoreRule(currlayer->startrule); currlayer->currname = currlayer->startname; currlayer->dirty = currlayer->startdirty; if (restoreview) { viewptr->SetPosMag(currlayer->startx, currlayer->starty, currlayer->startmag); } // restore step size and set increment currlayer->currbase = currlayer->startbase; currlayer->currexpo = currlayer->startexpo; SetGenIncrement(); // if this layer is a clone then restore some settings in other clones if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->currname = cloneptr->startname; if (restoreview) { cloneptr->view->setpositionmag(cloneptr->startx, cloneptr->starty, cloneptr->startmag); } cloneptr->currbase = cloneptr->startbase; cloneptr->currexpo = cloneptr->startexpo; // also synchronize dirty flags and update items in Layer menu cloneptr->dirty = currlayer->dirty; UpdateLayerItem(i); } } } // restore selection currlayer->currsel = currlayer->startsel; // switch to default colors if algo/rule changed wxString newrule = wxString(currlayer->algo->getrule(), wxConvLocal); if (oldalgo != currlayer->algtype || oldrule != newrule) { UpdateLayerColors(); } // update window title in case currname, rule or dirty flag changed; // note that UpdateLayerItem(currindex) gets called SetWindowTitle(currlayer->currname); UpdateEverything(); if (allowundo && !currlayer->stayclean) { if (inscript) { // script called reset() so remember gen change // (RememberGenStart was called above) currlayer->undoredo->RememberGenFinish(); } else if (resetundo) { // wind back the undo history to the starting pattern currlayer->undoredo->SyncUndoHistory(); } } } // ----------------------------------------------------------------------------- void MainFrame::RestorePattern(bigint& gen, const wxString& filename, bigint& x, bigint& y, int mag, int base, int expo) { // called to undo/redo a generating change if (gen == currlayer->startgen) { // restore starting pattern (false means don't call SyncUndoHistory) ResetPattern(false); } else { // restore pattern in given filename; // false means don't update status bar (algorithm should NOT change) LoadPattern(filename, wxEmptyString, false); if (currlayer->algo->getGeneration() != gen) { // filename could not be loaded for some reason, // so best to clear the pattern and set the expected gen count CreateUniverse(); currlayer->algo->setGeneration(gen); } // restore step size and set increment currlayer->currbase = base; currlayer->currexpo = expo; SetGenIncrement(); // restore position and scale, if allowed if (restoreview) viewptr->SetPosMag(x, y, mag); UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- const char* MainFrame::ChangeGenCount(const char* genstring, bool inundoredo) { // disallow alphabetic chars in genstring for (unsigned int i = 0; i < strlen(genstring); i++) if ( (genstring[i] >= 'a' && genstring[i] <= 'z') || (genstring[i] >= 'A' && genstring[i] <= 'Z') ) return "Alphabetic character is not allowed in generation string."; bigint oldgen = currlayer->algo->getGeneration(); bigint newgen(genstring); if (genstring[0] == '+' || genstring[0] == '-') { // leading +/- sign so make newgen relative to oldgen bigint relgen = newgen; newgen = oldgen; newgen += relgen; if (newgen < bigint::zero) newgen = bigint::zero; } // set stop_after_script BEFORE testing newgen == oldgen so scripts // can call setgen("+0") to prevent further generating if (inscript) stop_after_script = true; if (newgen == oldgen) return NULL; if (!inundoredo && allowundo && !currlayer->stayclean && inscript) { // script called setgen() SavePendingChanges(); } // need IsParityShifted() method??? if (currlayer->algtype == QLIFE_ALGO && newgen.odd() != oldgen.odd()) { // qlife stores pattern in different bits depending on gen parity, // so we need to create a new qlife universe, set its gen, copy the // current pattern to the new universe, then switch to that universe bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { return "Pattern is too big to copy."; } // create a new universe of same type and same rule lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); const char* err = newalgo->setrule(currlayer->algo->getrule()); if (err) { delete newalgo; return "Current rule is no longer valid!"; } newalgo->setGeneration(newgen); // copy pattern if ( !viewptr->CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, newalgo, false, _("Copying pattern")) ) { delete newalgo; return "Failed to copy pattern."; } // switch to new universe delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); } else { currlayer->algo->setGeneration(newgen); } if (!inundoredo) { // save some settings for RememberSetGen below bigint oldstartgen = currlayer->startgen; bool oldsave = currlayer->savestart; // may need to change startgen and savestart if (oldgen == currlayer->startgen || newgen <= currlayer->startgen) { currlayer->startgen = newgen; currlayer->savestart = true; } if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberSetGen(oldgen, newgen, oldstartgen, oldsave); } } UpdateStatus(); return NULL; } // ----------------------------------------------------------------------------- void MainFrame::SetGeneration() { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(ID_SETGEN); return; } bigint oldgen = currlayer->algo->getGeneration(); wxString result; wxString prompt = _("Enter a new generation count:"); prompt += _("\n(+n/-n is relative to current count)"); if ( GetString(_("Set Generation"), prompt, wxString(oldgen.tostring(), wxConvLocal), result) ) { const char* err = ChangeGenCount(result.mb_str(wxConvLocal)); if (err) { Warning(wxString(err,wxConvLocal)); } else { // Reset/Undo/Redo items might become enabled or disabled // (we need to do this if user clicked "Generation=..." text) UpdateMenuItems(IsActive()); } } } // ----------------------------------------------------------------------------- void MainFrame::GoFaster() { if (TimelineExists()) { PlayTimelineFaster(); } else { currlayer->currexpo++; SetGenIncrement(); // only need to refresh status bar UpdateStatus(); if (generating && currlayer->currexpo < 0) { whentosee -= statusptr->GetCurrentDelay(); } } } // ----------------------------------------------------------------------------- void MainFrame::GoSlower() { if (TimelineExists()) { PlayTimelineSlower(); } else { if (currlayer->currexpo > minexpo) { currlayer->currexpo--; SetGenIncrement(); // only need to refresh status bar UpdateStatus(); if (generating && currlayer->currexpo < 0) { if (currlayer->currexpo == -1) { // need to initialize whentosee rather than increment it whentosee = stopwatch->Time() + statusptr->GetCurrentDelay(); } else { whentosee += statusptr->GetCurrentDelay(); } } } else { Beep(); } } } // ----------------------------------------------------------------------------- void MainFrame::SetBaseStep() { int i; if ( GetInteger(_("Set Base Step"), _("Temporarily change the current base step:"), currlayer->currbase, 2, MAX_BASESTEP, &i) ) { currlayer->currbase = i; SetGenIncrement(); UpdateStatus(); } } // ----------------------------------------------------------------------------- void MainFrame::DisplayPattern() { // this routine is similar to UpdatePatternAndStatus() but if tiled windows // exist it only updates the current tile if possible; ie. it's not a clone // and tile views aren't synchronized if (tilelayers && numlayers > 1 && !syncviews && currlayer->cloneid == 0) { // only update the current tile viewptr->Refresh(false); #ifdef __WXMAC__ if (!showstatus) viewptr->Update(); // else let statusptr->Update() update viewport #else viewptr->Update(); #endif } else { // update main viewport window, possibly including all tile windows // (tile windows are children of bigview) if (numlayers > 1 && (stacklayers || tilelayers)) { bigview->Refresh(false); #ifdef __WXMAC__ if (!showstatus) bigview->Update(); // else let statusptr->Update() update viewport #else bigview->Update(); #endif } else { viewptr->Refresh(false); #ifdef __WXMAC__ if (!showstatus) viewptr->Update(); // else let statusptr->Update() update viewport #else viewptr->Update(); #endif } } if (showstatus) { statusptr->CheckMouseLocation(IsActive()); statusptr->Refresh(false); statusptr->Update(); } } // ----------------------------------------------------------------------------- static void JoinTwistedEdges(lifealgo* curralgo) { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (curralgo->htwist && curralgo->vtwist) { // cross-surface // eg. :C4,3 // a l k j i d // l A B C D i // h E F G H e // d I J K L a // i d c b a l for (int x = gl; x <= gr; x++) { int twistedx = gr - x + gl; int state = curralgo->getcell(twistedx, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(twistedx, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { int twistedy = gb - y + gt; int state = curralgo->getcell(gl, twistedy); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, twistedy); if (state > 0) curralgo->setcell(bl, y, state); } // copy grid's corner cells to SAME corners in border // (these cells are topologically different to non-corner cells) curralgo->setcell(bl, bt, curralgo->getcell(gl, gt)); curralgo->setcell(br, bt, curralgo->getcell(gr, gt)); curralgo->setcell(br, bb, curralgo->getcell(gr, gb)); curralgo->setcell(bl, bb, curralgo->getcell(gl, gb)); } else if (curralgo->htwist) { // Klein bottle with top and bottom edges twisted 180 degrees // eg. :K4*,3 // i l k j i l // d A B C D a // h E F G H e // l I J K L i // a d c b a d for (int x = gl; x <= gr; x++) { int twistedx = gr - x + gl; int state = curralgo->getcell(twistedx, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(twistedx, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with no twist int state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(bl, y, state); } // do corner cells curralgo->setcell(bl, bt, curralgo->getcell(gl, gb)); curralgo->setcell(br, bt, curralgo->getcell(gr, gb)); curralgo->setcell(bl, bb, curralgo->getcell(gl, gt)); curralgo->setcell(br, bb, curralgo->getcell(gr, gt)); } else { // curralgo->vtwist // Klein bottle with left and right edges twisted 180 degrees // eg. :K4,3* // d i j k l a // l A B C D i // h E F G H e // d I J K L a // l a b c d i for (int x = gl; x <= gr; x++) { // join top and bottom edges with no twist int state = curralgo->getcell(x, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(x, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { int twistedy = gb - y + gt; int state = curralgo->getcell(gl, twistedy); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, twistedy); if (state > 0) curralgo->setcell(bl, y, state); } // do corner cells curralgo->setcell(bl, bt, curralgo->getcell(gr, gt)); curralgo->setcell(br, bt, curralgo->getcell(gl, gt)); curralgo->setcell(bl, bb, curralgo->getcell(gr, gb)); curralgo->setcell(br, bb, curralgo->getcell(gl, gb)); } } // ----------------------------------------------------------------------------- static void JoinTwistedAndShiftedEdges(lifealgo* curralgo) { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (curralgo->hshift != 0) { // Klein bottle with shift by 1 on twisted horizontal edge (with even number of cells) // eg. :K4*+1,3 // j i l k j i // d A B C D a // h E F G H e // l I J K L i // b a d c b a int state, twistedx, shiftedx; for (int x = gl; x <= gr; x++) { // join top and bottom edges with a twist and then shift by 1 twistedx = gr - x + gl; shiftedx = twistedx - 1; if (shiftedx < gl) shiftedx = gr; state = curralgo->getcell(shiftedx, gb); if (state > 0) curralgo->setcell(x, bt, state); state = curralgo->getcell(shiftedx, gt); if (state > 0) curralgo->setcell(x, bb, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with no twist or shift state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(bl, y, state); } // do corner cells shiftedx = gl - 1; if (shiftedx < gl) shiftedx = gr; curralgo->setcell(bl, bt, curralgo->getcell(shiftedx, gb)); curralgo->setcell(bl, bb, curralgo->getcell(shiftedx, gt)); shiftedx = gr - 1; if (shiftedx < gl) shiftedx = gr; curralgo->setcell(br, bt, curralgo->getcell(shiftedx, gb)); curralgo->setcell(br, bb, curralgo->getcell(shiftedx, gt)); } else { // curralgo->vshift != 0 // Klein bottle with shift by 1 on twisted vertical edge (with even number of cells) // eg. :K3,4*+1 // f j k l d // c A B C a // l D E F j // i G H I g // f J K L d // c a b c a int state, twistedy, shiftedy; for (int x = gl; x <= gr; x++) { // join top and bottom edges with no twist or shift state = curralgo->getcell(x, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(x, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with a twist and then shift by 1 twistedy = gb - y + gt; shiftedy = twistedy - 1; if (shiftedy < gt) shiftedy = gb; state = curralgo->getcell(gr, shiftedy); if (state > 0) curralgo->setcell(bl, y, state); state = curralgo->getcell(gl, shiftedy); if (state > 0) curralgo->setcell(br, y, state); } // do corner cells shiftedy = gt - 1; if (shiftedy < gt) shiftedy = gb; curralgo->setcell(bl, bt, curralgo->getcell(gr, shiftedy)); curralgo->setcell(br, bt, curralgo->getcell(gl, shiftedy)); shiftedy = gb - 1; if (shiftedy < gt) shiftedy = gb; curralgo->setcell(bl, bb, curralgo->getcell(gr, shiftedy)); curralgo->setcell(br, bb, curralgo->getcell(gl, shiftedy)); } } // ----------------------------------------------------------------------------- static void JoinShiftedEdges(lifealgo* curralgo, int gwd, int ght, // grid wd and ht int hshift, int vshift) // horizontal and vertical shifts { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (hshift != 0) { // torus with horizontal shift // eg. :T4+1,3 // k l i j k l // d A B C D a // h E F G H e // l I J K L i // a b c d a b int state, shiftedx; for (int x = gl; x <= gr; x++) { // join top and bottom edges with a horizontal shift shiftedx = x - hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; state = curralgo->getcell(shiftedx, gb); if (state > 0) curralgo->setcell(x, bt, state); shiftedx = x + hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; state = curralgo->getcell(shiftedx, gt); if (state > 0) curralgo->setcell(x, bb, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with no shift state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(bl, y, state); } // do corner cells shiftedx = gr - hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; curralgo->setcell(bl, bt, curralgo->getcell(shiftedx, gb)); shiftedx = gl - hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; curralgo->setcell(br, bt, curralgo->getcell(shiftedx, gb)); shiftedx = gr + hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; curralgo->setcell(bl, bb, curralgo->getcell(shiftedx, gt)); shiftedx = gl + hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; curralgo->setcell(br, bb, curralgo->getcell(shiftedx, gt)); } else { // vshift != 0 // torus with vertical shift // eg. :T4,3+1 // h i j k l a // l A B C D e // d E F G H i // h I J K L a // l a b c d e int state, shiftedy; for (int x = gl; x <= gr; x++) { // join top and bottom edges with no shift state = curralgo->getcell(x, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(x, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with a vertical shift shiftedy = y - vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; state = curralgo->getcell(gr, shiftedy); if (state > 0) curralgo->setcell(bl, y, state); shiftedy = y + vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; state = curralgo->getcell(gl, shiftedy); if (state > 0) curralgo->setcell(br, y, state); } // do corner cells shiftedy = gb - vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; curralgo->setcell(bl, bt, curralgo->getcell(gr, shiftedy)); shiftedy = gb + vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; curralgo->setcell(br, bt, curralgo->getcell(gl, shiftedy)); shiftedy = gt - vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; curralgo->setcell(bl, bb, curralgo->getcell(gr, shiftedy)); shiftedy = gt + vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; curralgo->setcell(br, bb, curralgo->getcell(gl, shiftedy)); } } // ----------------------------------------------------------------------------- static void JoinAdjacentEdges(lifealgo* curralgo, int pt, int pl, int pb, int pr) // pattern edges { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; // sphere // eg. :S3 // a a d g c // a A B C g // b D E F h // c G H I i // g c f i i // copy live cells in top edge to left border for (int x = pl; x <= pr; x++) { int state; int skip = curralgo->nextcell(x, gt, state); if (skip < 0) break; x += skip; if (state > 0) curralgo->setcell(bl, gt + (x - gl), state); } // copy live cells in left edge to top border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(gl + (y - gt), bt, state); } // copy live cells in bottom edge to right border for (int x = pl; x <= pr; x++) { int state; int skip = curralgo->nextcell(x, gb, state); if (skip < 0) break; x += skip; if (state > 0) curralgo->setcell(br, gt + (x - gl), state); } // copy live cells in right edge to bottom border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(gl + (y - gt), bb, state); } // copy grid's corner cells to SAME corners in border curralgo->setcell(bl, bt, curralgo->getcell(gl, gt)); curralgo->setcell(br, bt, curralgo->getcell(gr, gt)); curralgo->setcell(br, bb, curralgo->getcell(gr, gb)); curralgo->setcell(bl, bb, curralgo->getcell(gl, gb)); } // ----------------------------------------------------------------------------- static void JoinEdges(lifealgo* curralgo, int gwd, int ght, // grid wd and ht int pt, int pl, int pb, int pr) // pattern edges { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (ght > 0) { // copy live cells in top edge to bottom border for (int x = pl; x <= pr; x++) { int state; int skip = curralgo->nextcell(x, gt, state); if (skip < 0) break; x += skip; if (state > 0) curralgo->setcell(x, bb, state); } // copy live cells in bottom edge to top border for (int x = pl; x <= pr; x++) { int state; int skip = curralgo->nextcell(x, gb, state); if (skip < 0) break; x += skip; if (state > 0) curralgo->setcell(x, bt, state); } } if (gwd > 0) { // copy live cells in left edge to right border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(br, y, state); } // copy live cells in right edge to left border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(bl, y, state); } } if (gwd > 0 && ght > 0) { // copy grid's corner cells to opposite corners in border curralgo->setcell(bl, bt, curralgo->getcell(gr, gb)); curralgo->setcell(br, bt, curralgo->getcell(gl, gb)); curralgo->setcell(br, bb, curralgo->getcell(gl, gt)); curralgo->setcell(bl, bb, curralgo->getcell(gr, gt)); } } // ----------------------------------------------------------------------------- bool MainFrame::CreateBorderCells(lifealgo* curralgo) { // no need to do anything if there is no pattern or if the grid is a bounded plane if (curralgo->isEmpty() || curralgo->boundedplane) return true; int gwd = curralgo->gridwd; int ght = curralgo->gridht; bigint top, left, bottom, right; curralgo->findedges(&top, &left, &bottom, &right); // no need to do anything if pattern is completely inside grid edges if ( (gwd == 0 || (curralgo->gridleft < left && curralgo->gridright > right)) && (ght == 0 || (curralgo->gridtop < top && curralgo->gridbottom > bottom)) ) { return true; } // if grid has infinite width or height then pattern might be too big to use setcell/getcell if ( (gwd == 0 || ght == 0) && viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Pattern is too big!")); // return false so caller can exit step() loop return false; } if (curralgo->sphere) { // to get a sphere we join top edge with left edge, and right edge with bottom edge; // note that grid must be square (gwd == ght) int pl = left.toint(); int pt = top.toint(); int pr = right.toint(); int pb = bottom.toint(); JoinAdjacentEdges(curralgo, pt, pl, pb, pr); } else if (curralgo->htwist || curralgo->vtwist) { // Klein bottle or cross-surface if ( (curralgo->htwist && curralgo->hshift != 0 && (gwd & 1) == 0) || (curralgo->vtwist && curralgo->vshift != 0 && (ght & 1) == 0) ) { // Klein bottle with shift is only possible if the shift is on the // twisted edge and that edge has an even number of cells JoinTwistedAndShiftedEdges(curralgo); } else { JoinTwistedEdges(curralgo); } } else if (curralgo->hshift != 0 || curralgo->vshift != 0) { // torus with horizontal or vertical shift JoinShiftedEdges(curralgo, gwd, ght, curralgo->hshift, curralgo->vshift); } else { // unshifted torus or infinite tube int pl = left.toint(); int pt = top.toint(); int pr = right.toint(); int pb = bottom.toint(); JoinEdges(curralgo, gwd, ght, pt, pl, pb, pr); } curralgo->endofpattern(); return true; } // ----------------------------------------------------------------------------- void MainFrame::ClearRect(lifealgo* curralgo, int top, int left, int bottom, int right) { int cx, cy, v; for ( cy = top; cy <= bottom; cy++ ) { for ( cx = left; cx <= right; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > right) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell so delete it cx += skip; curralgo->setcell(cx, cy, 0); } else { cx = right + 1; // done this row } } } } // ----------------------------------------------------------------------------- bool MainFrame::DeleteBorderCells(lifealgo* curralgo) { // no need to do anything if there is no pattern if (curralgo->isEmpty()) return true; int gwd = curralgo->gridwd; int ght = curralgo->gridht; // need to find pattern edges because pattern may have expanded beyond grid // (typically by 2 cells, but could be more if rule allows births in empty space) bigint top, left, bottom, right; curralgo->findedges(&top, &left, &bottom, &right); // no need to do anything if grid encloses entire pattern if ( (gwd == 0 || (curralgo->gridleft <= left && curralgo->gridright >= right)) && (ght == 0 || (curralgo->gridtop <= top && curralgo->gridbottom >= bottom)) ) { return true; } if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Pattern is too big!")); // return false so caller can exit step() loop return false; } // set pattern edges int pl = left.toint(); int pt = top.toint(); int pr = right.toint(); int pb = bottom.toint(); // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); if (ght > 0 && pt < gt) { // delete live cells above grid ClearRect(curralgo, pt, pl, gt-1, pr); pt = gt; // reduce size of rect below } if (ght > 0 && pb > gb) { // delete live cells below grid ClearRect(curralgo, gb+1, pl, pb, pr); pb = gb; // reduce size of rect below } if (gwd > 0 && pl < gl) { // delete live cells left of grid ClearRect(curralgo, pt, pl, pb, gl-1); } if (gwd > 0 && pr > gr) { // delete live cells right of grid ClearRect(curralgo, pt, gr+1, pb, pr); } curralgo->endofpattern(); return true; } // ----------------------------------------------------------------------------- bool MainFrame::StepPattern() { lifealgo* curralgo = currlayer->algo; if (curralgo->gridwd > 0 || curralgo->gridht > 0) { // bounded grid, so temporarily set the increment to 1 so we can call // CreateBorderCells() and DeleteBorderCells() around each step() int savebase = currlayer->currbase; int saveexpo = currlayer->currexpo; bigint inc = curralgo->getIncrement(); curralgo->setIncrement(1); while (inc > 0) { if (wxGetApp().Poller()->checkevents()) { SetGenIncrement(); // restore correct increment return false; } if (savebase != currlayer->currbase || saveexpo != currlayer->currexpo) { // user changed step base/exponent, so best to simply exit loop break; } if (!CreateBorderCells(curralgo)) { SetGenIncrement(); // restore correct increment return false; } curralgo->step(); if (!DeleteBorderCells(curralgo)) { SetGenIncrement(); // restore correct increment return false; } inc -= 1; } // safe way to restore correct increment in case user altered step base/exponent SetGenIncrement(); } else { if (wxGetApp().Poller()->checkevents()) return false; curralgo->step(); } if (currlayer->autofit) viewptr->FitInView(0); if (!IsIconized()) DisplayPattern(); /*!!! enable this code if we ever implement isPeriodic() if (autostop) { int period = curralgo->isPeriodic(); if (period > 0) { if (period == 1) { if (curralgo->isEmpty()) { statusptr->DisplayMessage(_("Pattern is empty.")); } else { statusptr->DisplayMessage(_("Pattern is stable.")); } } else { wxString s; s.Printf(_("Pattern is oscillating (period = %d)."), period); statusptr->DisplayMessage(s); } return false; } } */ return true; } // ----------------------------------------------------------------------------- void MainFrame::GeneratePattern() { if (generating || viewptr->drawingcells || viewptr->waitingforclick) { Beep(); return; } if (currlayer->algo->isEmpty()) { statusptr->ErrorMessage(empty_pattern); return; } if (currlayer->algo->isrecording()) { // don't attempt to save starting pattern here (let DeleteTimeline do it) } else if (!SaveStartingPattern()) { return; } // GeneratePattern is never called while running a script so no need // to test inscript or currlayer->stayclean if (allowundo) currlayer->undoredo->RememberGenStart(); // for DisplayTimingInfo begintime = stopwatch->Time(); begingen = currlayer->algo->getGeneration().todouble(); // for hyperspeed int hypdown = 64; generating = true; // avoid re-entry wxGetApp().PollerReset(); UpdateUserInterface(IsActive()); // only show hashing info while generating, otherwise Mac app can crash // after a paste due to hlifealgo::resize() calling lifestatus() which // then causes the viewport to be repainted for some inexplicable reason lifealgo::setVerbose( currlayer->showhashinfo ); if (currlayer->currexpo < 0) whentosee = stopwatch->Time() + statusptr->GetCurrentDelay(); while (true) { if (currlayer->currexpo < 0) { // slow down by only doing one gen every GetCurrentDelay() millisecs long currmsec = stopwatch->Time(); if (currmsec >= whentosee) { if (!StepPattern()) break; // add delay to current time rather than currmsec whentosee = stopwatch->Time() + statusptr->GetCurrentDelay(); } else { // process events while we wait if (wxGetApp().Poller()->checkevents()) break; // don't hog CPU but keep sleep duration short (ie. <= mindelay) wxMilliSleep(1); } } else { // currexpo >= 0 so advance pattern by currlayer->algo->getIncrement() gens if (!StepPattern()) break; if (currlayer->algo->isrecording()) { if (showtimeline) UpdateTimelineBar(IsActive()); if (currlayer->algo->getframecount() == MAX_FRAME_COUNT) { wxString msg; msg.Printf(_("No more frames can be recorded (maximum = %d)."), MAX_FRAME_COUNT); Warning(msg); break; } } else if (currlayer->hyperspeed && currlayer->algo->hyperCapable()) { hypdown--; if (hypdown == 0) { hypdown = 64; GoFaster(); } } } } generating = false; lifealgo::setVerbose(0); // for DisplayTimingInfo endtime = stopwatch->Time(); endgen = currlayer->algo->getGeneration().todouble(); // display the final pattern if (currlayer->autofit) viewptr->FitInView(0); if (command_pending || draw_pending) { // let the pending command/draw do the update below } else { UpdateEverything(); } // GeneratePattern is never called while running a script so no need // to test inscript or currlayer->stayclean; note that we must call // RememberGenFinish BEFORE processing any pending command if (allowundo) currlayer->undoredo->RememberGenFinish(); // stop recording any timeline before processing any pending command if (currlayer->algo->isrecording()) { currlayer->algo->stoprecording(); if (currlayer->algo->getframecount() > 0) { // probably best to go to last frame currlayer->currframe = currlayer->algo->getframecount() - 1; currlayer->autoplay = 0; currlayer->tlspeed = 0; currlayer->algo->gotoframe(currlayer->currframe); if (currlayer->autofit) viewptr->FitInView(1); } if (!showtimeline) ToggleTimelineBar(); UpdateUserInterface(true); } DoPendingAction(true); // true means we can restart generating loop } // ----------------------------------------------------------------------------- void MainFrame::DoPendingAction(bool restart) { if (command_pending) { command_pending = false; int id = cmdevent.GetId(); switch (id) { // don't restart the generating loop after some commands case wxID_NEW: NewPattern(); break; case wxID_OPEN: OpenPattern(); break; case ID_OPEN_CLIP: OpenClipboard(); break; case ID_RESET: ResetPattern(); break; case ID_SETGEN: SetGeneration(); break; case ID_UNDO: currlayer->undoredo->UndoChange(); break; case ID_ADD_LAYER: AddLayer(); break; case ID_DUPLICATE: DuplicateLayer(); break; case ID_LOAD_LEXICON: LoadLexiconPattern(); break; default: if ( id > ID_OPEN_RECENT && id <= ID_OPEN_RECENT + numpatterns ) { OpenRecentPattern(id); } else if ( id > ID_RUN_RECENT && id <= ID_RUN_RECENT + numscripts ) { OpenRecentScript(id); if (restart && !stop_after_script) { wxCommandEvent goevt(wxEVT_COMMAND_MENU_SELECTED, ID_START); wxPostEvent(this->GetEventHandler(), goevt); // avoid clearing status message due to script like density.py keepmessage = true; } } else if ( id == ID_RUN_SCRIPT ) { OpenScript(); if (restart && !stop_after_script) { wxCommandEvent goevt(wxEVT_COMMAND_MENU_SELECTED, ID_START); wxPostEvent(this->GetEventHandler(), goevt); // avoid clearing status message due to script like density.py keepmessage = true; } } else if ( id == ID_RUN_CLIP ) { RunClipboard(); if (restart && !stop_after_script) { wxCommandEvent goevt(wxEVT_COMMAND_MENU_SELECTED, ID_START); wxPostEvent(this->GetEventHandler(), goevt); // avoid clearing status message due to script like density.py keepmessage = true; } } else if ( id >= ID_LAYER0 && id <= ID_LAYERMAX ) { int oldcloneid = currlayer->cloneid; SetLayer(id - ID_LAYER0); // continue generating if new layer is a clone of old layer if (restart && currlayer->cloneid > 0 && currlayer->cloneid == oldcloneid) { wxCommandEvent goevt(wxEVT_COMMAND_MENU_SELECTED, ID_START); wxPostEvent(this->GetEventHandler(), goevt); } } else if ( id == ID_DEL_LAYER ) { int wasclone = currlayer->cloneid > 0 && ((currindex == 0 && currlayer->cloneid == GetLayer(1)->cloneid) || (currindex > 0 && currlayer->cloneid == GetLayer(currindex-1)->cloneid)); DeleteLayer(); // continue generating if new layer is/was a clone of old layer if (restart && wasclone) { wxCommandEvent goevt(wxEVT_COMMAND_MENU_SELECTED, ID_START); wxPostEvent(this->GetEventHandler(), goevt); } } else { // temporarily pretend the tool/layer/edit bars are not showing // to avoid Update[Tool/Layer/Edit]Bar changing button states bool saveshowtool = showtool; showtool = false; bool saveshowlayer = showlayer; showlayer = false; bool saveshowedit = showedit; showedit = false; // process the pending command cmdevent.SetEventType(wxEVT_COMMAND_MENU_SELECTED); cmdevent.SetEventObject(this); this->GetEventHandler()->ProcessEvent(cmdevent); // restore tool/layer/edit bar flags showtool = saveshowtool; showlayer = saveshowlayer; showedit = saveshowedit; if (restart) { // call GeneratePattern again wxCommandEvent goevt(wxEVT_COMMAND_MENU_SELECTED, ID_START); wxPostEvent(this->GetEventHandler(), goevt); } } } } if (draw_pending) { draw_pending = false; // temporarily pretend the tool/layer/edit bars are not showing // to avoid Update[Tool/Layer/Edit]Bar changing button states bool saveshowtool = showtool; showtool = false; bool saveshowlayer = showlayer; showlayer = false; bool saveshowedit = showedit; showedit = false; UpdateEverything(); // do the drawing mouseevent.SetEventType(wxEVT_LEFT_DOWN); mouseevent.SetEventObject(viewptr); viewptr->GetEventHandler()->ProcessEvent(mouseevent); while (viewptr->drawingcells) { wxGetApp().Yield(true); wxMilliSleep(5); // don't hog CPU } // restore tool/layer/edit bar flags showtool = saveshowtool; showlayer = saveshowlayer; showedit = saveshowedit; if (restart) { // call GeneratePattern again wxCommandEvent goevt(wxEVT_COMMAND_MENU_SELECTED, ID_START); wxPostEvent(this->GetEventHandler(), goevt); } } } // ----------------------------------------------------------------------------- void MainFrame::DisplayTimingInfo() { if (viewptr->waitingforclick) return; if (generating) { endtime = stopwatch->Time(); endgen = currlayer->algo->getGeneration().todouble(); } if (endtime > begintime) { double secs = (double)(endtime - begintime) / 1000.0; double gens = endgen - begingen; wxString s; s.Printf(_("%g gens in %g secs (%g gens/sec)."), gens, secs, gens/secs); statusptr->DisplayMessage(s); } } // ----------------------------------------------------------------------------- void MainFrame::Stop() { if (inscript) { PassKeyToScript(WXK_ESCAPE); } else if (generating) { wxGetApp().PollerInterrupt(); } } // ----------------------------------------------------------------------------- // this global flag is used to avoid re-entrancy in NextGeneration() // due to holding down the space/tab key static bool inNextGen = false; void MainFrame::NextGeneration(bool useinc) { if (inNextGen) return; inNextGen = true; if (!inscript && generating) { // we must be in GeneratePattern() loop, so abort it Stop(); inNextGen = false; return; } if (viewptr->drawingcells || viewptr->waitingforclick) { Beep(); inNextGen = false; return; } // best if generating stops after running a script like oscar.py or goto.py if (inscript) stop_after_script = true; lifealgo* curralgo = currlayer->algo; if (curralgo->isEmpty()) { statusptr->ErrorMessage(empty_pattern); inNextGen = false; return; } if (!SaveStartingPattern()) { inNextGen = false; return; } if (allowundo) { if (currlayer->stayclean) { // script has called run/step after a new/open command has set // stayclean true by calling MarkLayerClean if (curralgo->getGeneration() == currlayer->startgen) { // starting pattern has just been saved so we need to remember // this gen change in case user does a Reset after script ends // (RememberGenFinish will be called at the end of RunScript) if (currlayer->undoredo->savegenchanges) { // script must have called reset command, so we need to call // RememberGenFinish to match earlier RememberGenStart currlayer->undoredo->savegenchanges = false; currlayer->undoredo->RememberGenFinish(); } currlayer->undoredo->RememberGenStart(); } } else { // !currlayer->stayclean if (inscript) { // pass in false so we don't test savegenchanges flag; // ie. we only want to save pending cell changes here SavePendingChanges(false); } currlayer->undoredo->RememberGenStart(); } } // curralgo->step() calls checkevents() so set generating flag generating = true; // only show hashing info while generating lifealgo::setVerbose( currlayer->showhashinfo ); // avoid doing some things if NextGeneration is called from a script; // ie. by a run/step command if (!inscript) { if (useinc) { // for DisplayTimingInfo begintime = stopwatch->Time(); begingen = curralgo->getGeneration().todouble(); } wxGetApp().PollerReset(); viewptr->CheckCursor(IsActive()); } bool boundedgrid = (curralgo->gridwd > 0 || curralgo->gridht > 0); if (useinc) { // step by current increment if (curralgo->getIncrement() > bigint::one && !inscript) { UpdateToolBar(IsActive()); UpdateMenuItems(IsActive()); } if (boundedgrid) { // temporarily set the increment to 1 so we can call CreateBorderCells() // and DeleteBorderCells() around each step() int savebase = currlayer->currbase; int saveexpo = currlayer->currexpo; bigint inc = curralgo->getIncrement(); curralgo->setIncrement(1); while (inc > 0) { if (wxGetApp().Poller()->checkevents()) break; if (savebase != currlayer->currbase || saveexpo != currlayer->currexpo) { // user changed step base/exponent, so reset increment to 1 inc = curralgo->getIncrement(); curralgo->setIncrement(1); } if (!CreateBorderCells(curralgo)) break; curralgo->step(); if (!DeleteBorderCells(curralgo)) break; inc -= 1; } // safe way to restore correct increment in case user altered base/expo in above loop SetGenIncrement(); } else { curralgo->step(); } } else { // step by 1 gen bigint saveinc = curralgo->getIncrement(); curralgo->setIncrement(1); if (boundedgrid) CreateBorderCells(curralgo); curralgo->step(); if (boundedgrid) DeleteBorderCells(curralgo); curralgo->setIncrement(saveinc); } generating = false; lifealgo::setVerbose(0); if (!inscript) { if (useinc) { // for DisplayTimingInfo (we add 1 millisec here in case it took < 1 millisec) endtime = stopwatch->Time() + 1; endgen = curralgo->getGeneration().todouble(); } // autofit is only used when doing many gens if (currlayer->autofit && useinc && curralgo->getIncrement() > bigint::one) viewptr->FitInView(0); UpdateEverything(); } // we must call RememberGenFinish BEFORE processing any pending command if (allowundo && !currlayer->stayclean) currlayer->undoredo->RememberGenFinish(); // process any pending command seen via checkevents() in curralgo->step() if (!inscript) DoPendingAction(false); // false means don't restart generating loop inNextGen = false; } // ----------------------------------------------------------------------------- void MainFrame::ToggleAutoFit() { currlayer->autofit = !currlayer->autofit; // we only use autofit when generating; that's why the Auto Fit item // is in the Control menu and not in the View menu if (generating && currlayer->autofit) { viewptr->FitInView(0); UpdateEverything(); } } // ----------------------------------------------------------------------------- void MainFrame::ToggleHyperspeed() { currlayer->hyperspeed = !currlayer->hyperspeed; } // ----------------------------------------------------------------------------- void MainFrame::ToggleHashInfo() { currlayer->showhashinfo = !currlayer->showhashinfo; // only show hashing info while generating if (generating) lifealgo::setVerbose( currlayer->showhashinfo ); } // ----------------------------------------------------------------------------- void MainFrame::ClearOutsideGrid() { // check current pattern and clear any live cells outside bounded grid bool patternchanged = false; bool savechanges = allowundo && !currlayer->stayclean; // might also need to truncate selection currlayer->currsel.CheckGridEdges(); if (currlayer->algo->isEmpty()) return; // check if current pattern is too big to use nextcell/setcell bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Pattern too big to check (outside +/- 10^9 boundary).")); return; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); // no need to do anything if pattern is entirely within grid int gtop = currlayer->algo->gridtop.toint(); int gleft = currlayer->algo->gridleft.toint(); int gbottom = currlayer->algo->gridbottom.toint(); int gright = currlayer->algo->gridright.toint(); if (currlayer->algo->gridwd == 0) { // grid has infinite width gleft = INT_MIN; gright = INT_MAX; } if (currlayer->algo->gridht == 0) { // grid has infinite height gtop = INT_MIN; gbottom = INT_MAX; } if (itop >= gtop && ileft >= gleft && ibottom <= gbottom && iright <= gright) { return; } int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; bool abort = false; int v = 0; BeginProgress(_("Checking cells outside grid")); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (cx < gleft || cx > gright || cy < gtop || cy > gbottom) { // clear cell outside grid if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); curralgo->setcell(cx, cy, 0); patternchanged = true; } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, wxEmptyString); if (abort) break; } } if (abort) break; } curralgo->endofpattern(); EndProgress(); if (patternchanged) { statusptr->ErrorMessage(_("Pattern was truncated (live cells were outside grid).")); } } // ----------------------------------------------------------------------------- void MainFrame::ReduceCellStates(int newmaxstate) { // check current pattern and reduce any cell states > newmaxstate bool patternchanged = false; bool savechanges = allowundo && !currlayer->stayclean; // check if current pattern is too big to use nextcell/setcell bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Pattern too big to check (outside +/- 10^9 boundary).")); return; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; bool abort = false; int v = 0; BeginProgress(_("Checking cell states")); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (v > newmaxstate) { // reduce cell's current state to largest state if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, newmaxstate); curralgo->setcell(cx, cy, newmaxstate); patternchanged = true; } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, wxEmptyString); if (abort) break; } } if (abort) break; } curralgo->endofpattern(); EndProgress(); if (patternchanged) { statusptr->ErrorMessage(_("Pattern has changed (new rule has fewer states).")); } } // ----------------------------------------------------------------------------- void MainFrame::ShowRuleDialog() { if (inscript || viewptr->waitingforclick) return; if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(ID_SETRULE); return; } algo_type oldalgo = currlayer->algtype; wxString oldrule = wxString(currlayer->algo->getrule(), wxConvLocal); int oldmaxstate = currlayer->algo->NumCellStates() - 1; // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange viewptr->SaveCurrentSelection(); if (ChangeRule()) { // if ChangeAlgorithm was called then we're done if (currlayer->algtype != oldalgo) { // except we have to call UpdateEverything here now that the main window is active UpdateEverything(); return; } // show new rule in window title (but don't change file name); // even if the rule didn't change we still need to do this because // the user might have simply added/deleted a named rule SetWindowTitle(wxEmptyString); // check if the rule string changed, or the number of states changed // (the latter might happen if user edited a table/tree file) wxString newrule = wxString(currlayer->algo->getrule(), wxConvLocal); int newmaxstate = currlayer->algo->NumCellStates() - 1; if (oldrule != newrule || oldmaxstate != newmaxstate) { // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } // rule change might have changed the number of cell states; // if there are fewer states then pattern might change if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } if (allowundo) { currlayer->undoredo->RememberRuleChange(oldrule); } } // switch to default colors and icons for new rule (we need to do this even if // oldrule == newrule in case there's a new/changed .colors or .icons file) UpdateLayerColors(); // pattern or colors or icons might have changed UpdateEverything(); } } // ----------------------------------------------------------------------------- void MainFrame::ChangeAlgorithm(algo_type newalgotype, const wxString& newrule, bool inundoredo) { if (newalgotype == currlayer->algtype) return; // check if current pattern is too big to use nextcell/setcell bigint top, left, bottom, right; if ( !currlayer->algo->isEmpty() ) { currlayer->algo->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Pattern cannot be converted (outside +/- 10^9 boundary).")); return; } } if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(ID_ALGO0 + newalgotype); return; } // save changes if undo/redo is enabled and script isn't constructing a pattern // and we're not undoing/redoing an earlier algo change bool savechanges = allowundo && !currlayer->stayclean && !inundoredo; if (savechanges && inscript) { // note that we must save pending gen changes BEFORE changing algo type // otherwise temporary files won't be the correct type (mc or rle) SavePendingChanges(); } // selection might change if grid becomes smaller, // so save current selection for RememberAlgoChange if (savechanges) viewptr->SaveCurrentSelection(); bool rulechanged = false; wxString oldrule = wxString(currlayer->algo->getrule(), wxConvLocal); // change algorithm type, reset step size, and update status bar immediately algo_type oldalgo = currlayer->algtype; currlayer->algtype = newalgotype; currlayer->currbase = algoinfo[newalgotype]->defbase; currlayer->currexpo = 0; UpdateStatus(); // create a new universe of the requested flavor lifealgo* newalgo = CreateNewUniverse(newalgotype); if (inundoredo) { // switch to given newrule const char* err = newalgo->setrule( newrule.mb_str(wxConvLocal) ); if (err) newalgo->setrule( newalgo->DefaultRule() ); } else { const char* err; if (newrule.IsEmpty()) { // try to use same rule err = newalgo->setrule( currlayer->algo->getrule() ); } else { // switch to newrule err = newalgo->setrule( newrule.mb_str(wxConvLocal) ); rulechanged = true; } if (err) { wxString defrule = wxString(newalgo->DefaultRule(), wxConvLocal); if (newrule.IsEmpty() && oldrule.Find(':') >= 0) { // switch to new algo's default rule, but preserve the topology in oldrule // so we can do things like switch from "LifeHistory:T30,20" in RuleLoader // to "B3/S23:T30,20" in QuickLife if (defrule.Find(':') >= 0) { // default rule shouldn't have a suffix but play safe and remove it defrule = defrule.BeforeFirst(':'); } defrule += wxT(":"); defrule += oldrule.AfterFirst(':'); } err = newalgo->setrule( defrule.mb_str(wxConvLocal) ); // shouldn't ever fail but play safe if (err) newalgo->setrule( newalgo->DefaultRule() ); rulechanged = true; } } // set same gen count newalgo->setGeneration( currlayer->algo->getGeneration() ); bool patternchanged = false; if ( !currlayer->algo->isEmpty() ) { // copy pattern in current universe to new universe int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; bool abort = false; int v = 0; BeginProgress(_("Converting pattern")); // set newalgo's grid edges so we can save cells that are outside grid int gtop = newalgo->gridtop.toint(); int gleft = newalgo->gridleft.toint(); int gbottom = newalgo->gridbottom.toint(); int gright = newalgo->gridright.toint(); if (newalgo->gridwd == 0) { // grid has infinite width gleft = INT_MIN; gright = INT_MAX; } if (newalgo->gridht == 0) { // grid has infinite height gtop = INT_MIN; gbottom = INT_MAX; } // need to check for state change if new algo has fewer states than old algo int newmaxstate = newalgo->NumCellStates() - 1; lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (cx < gleft || cx > gright || cy < gtop || cy > gbottom) { // cx,cy is outside grid if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); // no need to clear cell from curralgo (that universe will soon be deleted) patternchanged = true; } else { if (v > newmaxstate) { // reduce v to largest state in new algo if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, newmaxstate); v = newmaxstate; patternchanged = true; } newalgo->setcell(cx, cy, v); } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, wxEmptyString); if (abort) break; } } if (abort) break; } newalgo->endofpattern(); EndProgress(); } // delete old universe and point current universe to new universe delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); // if new grid is bounded then we might need to truncate the selection if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { currlayer->currsel.CheckGridEdges(); } // switch to default colors for new algo+rule UpdateLayerColors(); if (!inundoredo) { if (rulechanged) { // show new rule in window title (but don't change file name) SetWindowTitle(wxEmptyString); // if pattern exists and is at starting gen then set savestart true // so that SaveStartingPattern will save pattern to suitable file // (and thus ResetPattern will work correctly) if ( currlayer->algo->getGeneration() == currlayer->startgen && !currlayer->algo->isEmpty() ) { currlayer->savestart = true; } if (newrule.IsEmpty()) { if (patternchanged) { statusptr->ErrorMessage(_("Rule has changed and pattern has changed.")); } else { // don't beep statusptr->DisplayMessage(_("Rule has changed.")); } } else { if (patternchanged) { statusptr->ErrorMessage(_("Algorithm has changed and pattern has changed.")); } else { // don't beep statusptr->DisplayMessage(_("Algorithm has changed.")); } } } else if (patternchanged) { statusptr->ErrorMessage(_("Pattern has changed.")); } if (!inscript) { UpdateEverything(); } } if (savechanges) { currlayer->undoredo->RememberAlgoChange(oldalgo, oldrule); } } // ----------------------------------------------------------------------------- static wxString CreateTABLE(const wxString& tablepath) { wxString contents = wxT("\n@TABLE\n\n"); // append contents of .table file FILE* f = fopen(tablepath.mb_str(wxConvLocal), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; contents += wxString(linebuf, wxConvLocal); contents += wxT("\n"); } reader.close(); } else { std::ostringstream oss; oss << "Could not read .table file:\n" << tablepath.mb_str(wxConvLocal); throw std::runtime_error(oss.str().c_str()); } return contents; } // ----------------------------------------------------------------------------- static wxString CreateEmptyTABLE(const wxString& folder, const wxString& prefix, const wxSortedArrayString& allfiles) { // create a valid table that does nothing wxString contents = wxT("\nThis file contains colors and/or icons shared by "); contents += prefix; contents += wxT("-* rules.\n"); contents += wxT("\n@TABLE\n\n"); // search allfiles for 1st prefix-*.table/tree file and extract numstates and neighborhood wxString numstates, neighborhood; for (size_t n = 0; n < allfiles.GetCount(); n++) { wxString filename = allfiles[n]; if (filename.EndsWith(wxT(".table")) || filename.EndsWith(wxT(".tree"))) { if (prefix == filename.BeforeLast('-')) { wxString filepath = folder + filename; FILE* f = fopen(filepath.mb_str(wxConvLocal), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; if (strncmp(linebuf, "n_states:", 9) == 0) { numstates = wxString(linebuf,wxConvLocal) + wxT("\n"); } else if (strncmp(linebuf, "num_states=", 11) == 0) { // convert to table syntax numstates = wxT("n_states:") + wxString(linebuf+11,wxConvLocal); numstates += wxT("\n"); } else if (strncmp(linebuf, "neighborhood:", 13) == 0) { neighborhood = wxString(linebuf,wxConvLocal) + wxT("\n"); break; } else if (strncmp(linebuf, "num_neighbors=", 14) == 0) { // convert to table syntax neighborhood = wxT("neighborhood:"); if (linebuf[14] == '4') neighborhood += wxT("vonNeumann\n"); else neighborhood += wxT("Moore\n"); break; } } reader.close(); } else { std::ostringstream oss; oss << "Could not read .table/tree file:\n" << filepath.mb_str(wxConvLocal); throw std::runtime_error(oss.str().c_str()); } } } } if (numstates.length() == 0) { numstates = wxT("n_states:256\n"); wxString msg = _("Could not find ") + prefix; msg += _("-*.table/tree to set n_states in "); msg += prefix; msg += _("-shared.rule."); Warning(msg); } contents += numstates; contents += neighborhood; contents += wxT("symmetries:none\n"); // anything valid would do contents += wxT("# do nothing\n"); // no transitions return contents; } // ----------------------------------------------------------------------------- static wxString CreateTREE(const wxString& treepath) { wxString contents = wxT("\n@TREE\n\n"); // append contents of .tree file FILE* f = fopen(treepath.mb_str(wxConvLocal), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; contents += wxString(linebuf, wxConvLocal); contents += wxT("\n"); } reader.close(); } else { std::ostringstream oss; oss << "Could not read .tree file:\n" << treepath.mb_str(wxConvLocal); throw std::runtime_error(oss.str().c_str()); } return contents; } // ----------------------------------------------------------------------------- static wxString CreateCOLORS(const wxString& colorspath) { wxString contents = wxT("\n@COLORS\n\n"); FILE* f = fopen(colorspath.mb_str(wxConvLocal), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; int skip = 0; if (strncmp(linebuf, "color", 5) == 0 || strncmp(linebuf, "gradient", 8) == 0) { // strip off everything before 1st digit while (linebuf[skip] && (linebuf[skip] < '0' || linebuf[skip] > '9')) { skip++; } } contents += wxString(linebuf + skip, wxConvLocal); contents += wxT("\n"); } reader.close(); } else { std::ostringstream oss; oss << "Could not read .colors file:\n" << colorspath.mb_str(wxConvLocal); throw std::runtime_error(oss.str().c_str()); } return contents; } // ----------------------------------------------------------------------------- static wxString CreateStateColors(wxImage image, int numicons) { wxString contents = wxT("\n@COLORS\n\n"); // if the last icon has only 1 color then assume it is the extra 15x15 icon // supplied to set the color of state 0 if (numicons > 1) { wxImage icon = image.GetSubImage(wxRect((numicons-1)*15, 0, 15, 15)); if (icon.CountColours(1) == 1) { unsigned char* idata = icon.GetData(); unsigned char R = idata[0]; unsigned char G = idata[1]; unsigned char B = idata[2]; contents += wxString::Format(wxT("0 %d %d %d\n"), R, G, B); numicons--; } } // set non-icon colors for each live state to the average of the non-black pixels // in each 15x15 icon (note we've skipped the extra icon detected above) for (int i = 0; i < numicons; i++) { wxImage icon = image.GetSubImage(wxRect(i*15, 0, 15, 15)); int nbcount = 0; // non-black pixels int totalR = 0; int totalG = 0; int totalB = 0; unsigned char* idata = icon.GetData(); for (int y = 0; y < 15; y++) { for (int x = 0; x < 15; x++) { long pos = (y * 15 + x) * 3; unsigned char R = idata[pos]; unsigned char G = idata[pos+1]; unsigned char B = idata[pos+2]; if (R > 0 || G > 0 || B > 0) { // non-black pixel nbcount++; totalR += R; totalG += G; totalB += B; } } } if (nbcount > 0) { contents += wxString::Format(wxT("%d %d %d %d\n"), i+1, totalR/nbcount, totalG/nbcount, totalB/nbcount); } else { // unlikely, but avoid div by zero contents += wxString::Format(wxT("%d 0 0 0\n"), i+1); } } return contents; } // ----------------------------------------------------------------------------- static wxString hex2(int i) { // convert given number from 0..255 into 2 hex digits wxString result = wxT("xx"); const char* hexdigit = "0123456789ABCDEF"; result[0] = hexdigit[i / 16]; result[1] = hexdigit[i % 16]; return result; } // ----------------------------------------------------------------------------- static wxString CreateXPM(const wxString& iconspath, wxImage image, int size, int numicons) { // create XPM data for given set of icons wxString contents = wxT("\nXPM\n"); int charsperpixel = 1; const char* cindex = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; wxImageHistogram histogram; int numcolors = image.ComputeHistogram(histogram); if (numcolors > 256) { std::ostringstream oss; oss << "Image in " << iconspath.mb_str(wxConvLocal) << " has more than 256 colors."; throw std::runtime_error(oss.str().c_str()); } if (numcolors > 26) charsperpixel = 2; // AABA..PA, ABBB..PB, ... , APBP..PP contents += wxT("/* width height num_colors chars_per_pixel */\n"); contents += wxString::Format(wxT("\"%d %d %d %d\"\n"), size, size*numicons, numcolors, charsperpixel); contents += wxT("/* colors */\n"); int n = 0; for (wxImageHistogram::iterator entry = histogram.begin(); entry != histogram.end(); ++entry) { unsigned long key = entry->first; unsigned char R = (key & 0xFF0000) >> 16; unsigned char G = (key & 0x00FF00) >> 8; unsigned char B = (key & 0x0000FF); if (R == 0 && G == 0 && B == 0) { // nicer to show . or .. for black pixels contents += wxT("\"."); if (charsperpixel == 2) contents += wxT("."); contents += wxT(" c #000000\"\n"); } else { wxString hexcolor = wxT("#"); hexcolor += hex2(R); hexcolor += hex2(G); hexcolor += hex2(B); contents += wxT("\""); if (charsperpixel == 1) { contents += cindex[n]; } else { contents += cindex[n % 16]; contents += cindex[n / 16]; } contents += wxT(" c "); contents += hexcolor; contents += wxT("\"\n"); } n++; } for (int i = 0; i < numicons; i++) { contents += wxString::Format(wxT("/* icon for state %d */\n"), i+1); wxImage icon = image.GetSubImage(wxRect(i*15, 0, size, size)); unsigned char* idata = icon.GetData(); for (int y = 0; y < size; y++) { contents += wxT("\""); for (int x = 0; x < size; x++) { long pos = (y * size + x) * 3; unsigned char R = idata[pos]; unsigned char G = idata[pos+1]; unsigned char B = idata[pos+2]; if (R == 0 && G == 0 && B == 0) { // nicer to show . or .. for black pixels contents += wxT("."); if (charsperpixel == 2) contents += wxT("."); } else { n = 0; unsigned long thisRGB = wxImageHistogram::MakeKey(R,G,B); for (wxImageHistogram::iterator entry = histogram.begin(); entry != histogram.end(); ++entry) { if (thisRGB == entry->first) break; n++; } if (charsperpixel == 1) { contents += cindex[n]; } else { contents += cindex[n % 16]; contents += cindex[n / 16]; } } } contents += wxT("\"\n"); } } return contents; } // ----------------------------------------------------------------------------- static wxString CreateICONS(const wxString& iconspath, bool nocolors) { wxString contents = wxT("\n@ICONS\n"); wxImage image; if (image.LoadFile(iconspath)) { int wd = image.GetWidth(); int ht = image.GetHeight(); if (ht != 15 && ht != 22) { std::ostringstream oss; oss << "Image in " << iconspath.mb_str(wxConvLocal) << " has incorrect height (should be 15 or 22)."; throw std::runtime_error(oss.str().c_str()); } if (wd % 15 > 0) { std::ostringstream oss; oss << "Image in " << iconspath.mb_str(wxConvLocal) << " has incorrect width (should be multiple of 15)."; throw std::runtime_error(oss.str().c_str()); } int numicons = wd / 15; // WARNING: MultiColorImage must be called 1st in the next test because // we want image to be converted to black-and-white if it only uses 2 colors // (for compatibility with Golly 2.4 and older) if (MultiColorImage(image) && nocolors) { // the .icons file is multi-color and there was no .colors file, // so prepend a @COLORS section that sets non-icon colors contents = CreateStateColors(image.GetSubImage(wxRect(0,0,wd,15)), numicons) + contents; } if (ht == 15) { contents += CreateXPM(iconspath, image, 15, numicons); } else { contents += CreateXPM(iconspath, image.GetSubImage(wxRect(0,0,wd,15)), 15, numicons); contents += CreateXPM(iconspath, image.GetSubImage(wxRect(0,15,wd,7)), 7, numicons); } } else { std::ostringstream oss; oss << "Could not load image from .icons file:\n" << iconspath.mb_str(wxConvLocal); throw std::runtime_error(oss.str().c_str()); } return contents; } // ----------------------------------------------------------------------------- static void CreateOneRule(const wxString& rulefile, const wxString& folder, const wxSortedArrayString& allfiles, wxString& htmlinfo) { wxString tabledata, treedata, colordata, icondata; wxString rulename = rulefile.BeforeLast('.'); if (rulename.EndsWith(wxT("-shared"))) { // create a .rule file with colors and/or icons shared by other .rule files wxString prefix = rulename.BeforeLast('-'); tabledata = CreateEmptyTABLE(folder, prefix, allfiles); wxString sharedcolors = prefix + wxT(".colors"); if (allfiles.Index(sharedcolors) != wxNOT_FOUND) colordata = CreateCOLORS(folder + sharedcolors); wxString sharedicons = prefix + wxT(".icons"); if (allfiles.Index(sharedicons) != wxNOT_FOUND) icondata = CreateICONS(folder + sharedicons, colordata.length() == 0); } else { wxString tablefile = rulename + wxT(".table"); wxString treefile = rulename + wxT(".tree"); wxString colorsfile = rulename + wxT(".colors"); wxString iconsfile = rulename + wxT(".icons"); if (allfiles.Index(tablefile) != wxNOT_FOUND) tabledata = CreateTABLE(folder + tablefile); if (allfiles.Index(treefile) != wxNOT_FOUND) treedata = CreateTREE(folder + treefile); if (allfiles.Index(colorsfile) != wxNOT_FOUND) colordata = CreateCOLORS(folder + colorsfile); if (allfiles.Index(iconsfile) != wxNOT_FOUND) icondata = CreateICONS(folder + iconsfile, colordata.length() == 0); } wxString contents = wxT("@RULE ") + rulename + wxT("\n"); contents += tabledata; contents += treedata; contents += colordata; contents += icondata; // write contents to .rule file wxString rulepath = folder + rulefile; wxFile outfile(rulepath, wxFile::write); if (outfile.IsOpened()) { outfile.Write(contents); outfile.Close(); } else { std::ostringstream oss; oss << "Could not create rule file:\n" << rulepath.mb_str(wxConvLocal); throw std::runtime_error(oss.str().c_str()); } // append created file to htmlinfo htmlinfo += _(""); htmlinfo += rulefile; htmlinfo += _("
\n"); } // ----------------------------------------------------------------------------- static bool SharedColorsIcons(const wxString& prefix, const wxSortedArrayString& allfiles) { // return true if prefix.colors/icons is shared by at least one prefix-*.table/tree file for (size_t n = 0; n < allfiles.GetCount(); n++) { wxString filename = allfiles[n]; if (filename.EndsWith(wxT(".table")) || filename.EndsWith(wxT(".tree"))) { if (prefix == filename.BeforeLast('-')) { return true; } } } // prefix-*.table/tree does not exist in allfiles return false; } // ----------------------------------------------------------------------------- static int ConvertRules(const wxString& folder, bool supplied, wxString& htmlinfo) { wxString filename, rulefile, rulename; int depcount = 0; if (!wxFileName::DirExists(folder)) { // this might happen if user deleted/renamed folder while Golly is running std::ostringstream oss; oss << "Directory does not exist:\n" << folder.mb_str(wxConvLocal); throw std::runtime_error(oss.str().c_str()); } wxDir dir(folder); if (!dir.IsOpened()) { std::ostringstream oss; oss << "Failed to open directory:\n" << folder.mb_str(wxConvLocal); throw std::runtime_error(oss.str().c_str()); } htmlinfo += wxT("

\n"); if (supplied) { htmlinfo += _("New .rule files created in the supplied Rules folder:
\n("); } else { htmlinfo += _("New .rule files created in your rules folder:
\n("); } htmlinfo += folder; htmlinfo += _(")

\n"); // build an array of all files in the given folder (using a sorted array speeds up Index calls) wxSortedArrayString allfiles; bool found = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES | wxDIR_HIDDEN); while (found) { allfiles.Add(filename); found = dir.GetNext(&filename); } // create an array of candidate .rule files to be created wxSortedArrayString candidates; for (size_t n = 0; n < allfiles.GetCount(); n++) { filename = allfiles[n]; rulename = filename.BeforeLast('.'); bool colorsicons = filename.EndsWith(wxT(".colors")) || filename.EndsWith(wxT(".icons")); bool tabletree = filename.EndsWith(wxT(".table")) || filename.EndsWith(wxT(".tree")); if (colorsicons || tabletree) { depcount++; if (colorsicons) { if (SharedColorsIcons(rulename, allfiles)) { // colors and/or icons will be shared by one or more rulename-*.rule files rulefile = rulename + wxT("-shared.rule"); } else { rulefile = rulename + wxT(".rule"); } } else { // .table/tree file rulefile = rulename + wxT(".rule"); } // add .rule file to candidates if it hasn't been added yet // and if it doesn't already exist if (candidates.Index(rulefile) == wxNOT_FOUND && allfiles.Index(rulefile) == wxNOT_FOUND) { candidates.Add(rulefile); } } } // create the new .rule files for (size_t n = 0; n < candidates.GetCount(); n++) { CreateOneRule(candidates[n], folder, allfiles, htmlinfo); } if (candidates.GetCount() == 0) { htmlinfo += _("None.\n"); } return depcount; } // ----------------------------------------------------------------------------- static void ShowCreatedRules(wxString& htmlinfo) { wxString header = _("Converted Rules\n"); header += _("\n"); htmlinfo = header + htmlinfo; htmlinfo += _("\n"); wxString htmlfile = tempdir + _("converted-rules.html"); wxFile outfile(htmlfile, wxFile::write); if (outfile.IsOpened()) { outfile.Write(htmlinfo); outfile.Close(); ShowHelp(htmlfile); } else { Warning(_("Could not create html file:\n") + htmlfile); } } // ----------------------------------------------------------------------------- static void DeleteOldRules(const wxString& folder) { if (wxFileName::DirExists(folder)) { wxDir dir(folder); if (dir.IsOpened()) { // build an array of all files in the given folder wxArrayString allfiles; wxString filename; bool found = dir.GetFirst(&filename, wxEmptyString, wxDIR_FILES | wxDIR_HIDDEN); while (found) { allfiles.Add(filename); found = dir.GetNext(&filename); } // delete all the .table/tree/colors/icons files for (size_t n = 0; n < allfiles.GetCount(); n++) { filename = allfiles[n]; if ( filename.EndsWith(wxT(".colors")) || filename.EndsWith(wxT(".icons")) || filename.EndsWith(wxT(".table")) || filename.EndsWith(wxT(".tree")) ) { wxRemoveFile(folder + filename); } } } } } // ----------------------------------------------------------------------------- void MainFrame::ConvertOldRules() { if (inscript || viewptr->waitingforclick) return; if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(ID_CONVERT); return; } // look for deprecated .table/tree/colors/icons files and create corresponding .rule files wxString htmlinfo; bool aborted = false; int depcount = 0; // number of deprecated files try { // look in the supplied Rules folder first, then in the user's rules folder depcount += ConvertRules(rulesdir, true, htmlinfo); depcount += ConvertRules(userrules, false, htmlinfo); } catch(const std::exception& e) { // display message set by throw std::runtime_error(...) Warning(wxString(e.what(),wxConvLocal)); aborted = true; // nice to also show error message in help window htmlinfo += _("\n

*** CONVERSION ABORTED DUE TO ERROR ***\n

"); htmlinfo += wxString(e.what(),wxConvLocal); } // display the results in the help window ShowCreatedRules(htmlinfo); if (!aborted && depcount > 0) { // ask user if it's ok to delete all the deprecated files int answer = wxMessageBox(_("Do you want to delete all the old .table/tree/colors/icons files?"), _("Delete deprecated files?"), wxICON_QUESTION | wxYES_NO, wxGetActiveWindow()); if (answer == wxYES) { DeleteOldRules(rulesdir); DeleteOldRules(userrules); } } } // ----------------------------------------------------------------------------- wxString MainFrame::CreateRuleFiles(const wxSortedArrayString& deprecated, const wxSortedArrayString& ziprules) { // use the given list of deprecated .table/tree/colors/icons files // (recently extracted from a .zip file and installed in userrules) // to create new .rule files, except those in ziprules (they were in // the .zip file and have already been installed) wxString htmlinfo; bool aborted = false; try { // create an array of candidate .rule files to be created wxString rulefile, filename, rulename; wxSortedArrayString candidates; for (size_t n = 0; n < deprecated.GetCount(); n++) { filename = deprecated[n]; rulename = filename.BeforeLast('.'); if (filename.EndsWith(wxT(".colors")) || filename.EndsWith(wxT(".icons"))) { if (SharedColorsIcons(rulename, deprecated)) { // colors and/or icons will be shared by one or more rulename-*.rule files rulefile = rulename + wxT("-shared.rule"); } else { rulefile = rulename + wxT(".rule"); } } else { // .table/tree file rulefile = rulename + wxT(".rule"); } // add .rule file to candidates if it hasn't been added yet // and if it isn't in the zip file (ie. already installed) if (candidates.Index(rulefile) == wxNOT_FOUND && ziprules.Index(rulefile) == wxNOT_FOUND) { candidates.Add(rulefile); } } // create the new .rule files (unlike ConvertRules, here we overwrite any // existing .rule files in case the zip file's contents have changed) for (size_t n = 0; n < candidates.GetCount(); n++) { CreateOneRule(candidates[n], userrules, deprecated, htmlinfo); } } catch(const std::exception& e) { // display message set by throw std::runtime_error(...) Warning(wxString(e.what(),wxConvLocal)); aborted = true; // nice to also show error message in help window htmlinfo += _("\n

*** CONVERSION ABORTED DUE TO ERROR ***\n

"); htmlinfo += wxString(e.what(),wxConvLocal); } if (!aborted) { // delete all the deprecated files for (size_t n = 0; n < deprecated.GetCount(); n++) { wxRemoveFile(userrules + deprecated[n]); } } return htmlinfo; } golly-2.5-src/gui-wx/wxedit.cpp0000644000175100001440000010144412156145314013447 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/dcbuffer.h" // for wxBufferedPaintDC #if wxUSE_TOOLTIPS #include "wx/tooltip.h" // for wxToolTip #endif #include "bigint.h" #include "lifealgo.h" #include "wxgolly.h" // for viewptr, statusptr, mainptr #include "wxmain.h" // for mainptr->... #include "wxutils.h" // for Fatal #include "wxprefs.h" // for showedit, showallstates, etc #include "wxstatus.h" // for statusptr->... #include "wxscript.h" // for inscript #include "wxview.h" // for viewptr->... #include "wxrender.h" // for DrawOneIcon #include "wxlayer.h" // for currlayer, LayerBarHeight, SetLayerColors #include "wxundo.h" // for currlayer->undoredo->... #include "wxtimeline.h" // for TimelineExists #include "wxedit.h" // ----------------------------------------------------------------------------- enum { // ids for bitmap buttons in edit bar UNDO_BUTT = 0, REDO_BUTT, DRAW_BUTT, PICK_BUTT, SELECT_BUTT, MOVE_BUTT, ZOOMIN_BUTT, ZOOMOUT_BUTT, ALLSTATES_BUTT, NUM_BUTTONS, // must be after all buttons STATE_BAR }; #ifdef __WXMSW__ // bitmaps are loaded via .rc file #else // bitmaps for edit bar buttons #include "bitmaps/undo.xpm" #include "bitmaps/redo.xpm" #include "bitmaps/draw.xpm" #include "bitmaps/pick.xpm" #include "bitmaps/select.xpm" #include "bitmaps/move.xpm" #include "bitmaps/zoomin.xpm" #include "bitmaps/zoomout.xpm" #include "bitmaps/allstates.xpm" // bitmaps for down state of toggle buttons #include "bitmaps/draw_down.xpm" #include "bitmaps/pick_down.xpm" #include "bitmaps/select_down.xpm" #include "bitmaps/move_down.xpm" #include "bitmaps/zoomin_down.xpm" #include "bitmaps/zoomout_down.xpm" #include "bitmaps/allstates_down.xpm" #endif // width and height of bitmap buttons #if defined(__WXOSX_COCOA__) || defined(__WXGTK__) const int BUTTON_WD = 28; const int BUTTON_HT = 28; #else const int BUTTON_WD = 24; const int BUTTON_HT = 24; #endif // ----------------------------------------------------------------------------- // Define edit bar window: // derive from wxPanel so we get current theme's background color on Windows class EditBar : public wxPanel { public: EditBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht); ~EditBar(); // add a bitmap button to edit bar void AddButton(int id, const wxString& tip); // add gap between buttons void AddSeparator(); // enable/disable button void EnableButton(int id, bool enable); // set state of a toggle button void SelectButton(int id, bool select); // update scroll bar void UpdateScrollBar(); // detect press and release of a bitmap button void OnButtonDown(wxMouseEvent& event); void OnButtonUp(wxMouseEvent& event); void OnKillFocus(wxFocusEvent& event); private: // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() // event handlers void OnPaint(wxPaintEvent& event); void OnMouseDown(wxMouseEvent& event); void OnButton(wxCommandEvent& event); void OnScroll(wxScrollEvent& event); void SetEditFont(wxDC& dc); void DisplayText(wxDC& dc, const wxString& s, wxCoord x, wxCoord y); void DrawAllStates(wxDC& dc, int wd); void DrawEditBar(wxDC& dc, int wd, int ht); // bitmaps for normal or down state wxBitmap normbutt[NUM_BUTTONS]; wxBitmap downbutt[NUM_BUTTONS]; #ifdef __WXMSW__ // on Windows we need bitmaps for disabled buttons wxBitmap disnormbutt[NUM_BUTTONS]; wxBitmap disdownbutt[NUM_BUTTONS]; #endif // remember state of toggle buttons to avoid unnecessary drawing; // 0 = not yet initialized, 1 = selected, -1 = not selected int buttstate[NUM_BUTTONS]; // positioning data used by AddButton and AddSeparator int ypos, xpos, smallgap, biggap; wxBitmap* editbitmap; // edit bar bitmap int editbitmapwd; // width of edit bar bitmap int editbitmapht; // height of edit bar bitmap wxRect colorbox; // box showing current color wxRect iconbox; // box showing current icon wxScrollBar* drawbar; // scroll bar for changing drawing state int firststate; // first visible state (if showing all states) int h_col1; // horizontal position of labels int h_col2; // horizontal position of info for state 0 int digitwd; // width of digit in edit bar font int digitht; // height of digit in edit bar font int textascent; // vertical adjustment used in DrawText calls wxFont* editfont; // edit bar font }; BEGIN_EVENT_TABLE(EditBar, wxPanel) EVT_PAINT ( EditBar::OnPaint) EVT_LEFT_DOWN ( EditBar::OnMouseDown) EVT_LEFT_DCLICK ( EditBar::OnMouseDown) EVT_BUTTON (wxID_ANY, EditBar::OnButton) EVT_COMMAND_SCROLL (STATE_BAR, EditBar::OnScroll) END_EVENT_TABLE() // ----------------------------------------------------------------------------- EditBar* editbarptr = NULL; // global pointer to edit bar const int BIGHT = 80; // height of edit bar if showallstates const int SMALLHT = 32; // height of edit bar if not showallstates static int editbarht; // current height (BIGHT or SMALLHT) const int LINEHT = 14; // distance between each baseline const int BASELINE1 = SMALLHT+LINEHT-1; // baseline of 1st line const int BASELINE2 = BASELINE1+LINEHT; // baseline of 2nd line const int BASELINE3 = BASELINE2+LINEHT; // baseline of 3rd line const int COLWD = 22; // column width of state/color/icon info const int BOXWD = 9; // width (and height) of small color/icon boxes const int BOXSIZE = 17; // width and height of colorbox and iconbox const int BOXGAP = 8; // gap between colorbox and iconbox const int PAGESIZE = 10; // scroll amount when paging // edit bar buttons (must be global to use Connect/Disconnect on Windows) wxBitmapButton* ebbutt[NUM_BUTTONS]; // ----------------------------------------------------------------------------- EditBar::EditBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht) : wxPanel(parent, wxID_ANY, wxPoint(xorg,yorg), wxSize(wd,ht), wxNO_FULL_REPAINT_ON_RESIZE) { #ifdef __WXGTK__ // avoid erasing background on GTK+ SetBackgroundStyle(wxBG_STYLE_CUSTOM); #endif // init bitmaps for normal state normbutt[UNDO_BUTT] = wxBITMAP(undo); normbutt[REDO_BUTT] = wxBITMAP(redo); normbutt[DRAW_BUTT] = wxBITMAP(draw); normbutt[PICK_BUTT] = wxBITMAP(pick); normbutt[SELECT_BUTT] = wxBITMAP(select); normbutt[MOVE_BUTT] = wxBITMAP(move); normbutt[ZOOMIN_BUTT] = wxBITMAP(zoomin); normbutt[ZOOMOUT_BUTT] = wxBITMAP(zoomout); normbutt[ALLSTATES_BUTT] = wxBITMAP(allstates); // toggle buttons also have a down state downbutt[DRAW_BUTT] = wxBITMAP(draw_down); downbutt[PICK_BUTT] = wxBITMAP(pick_down); downbutt[SELECT_BUTT] = wxBITMAP(select_down); downbutt[MOVE_BUTT] = wxBITMAP(move_down); downbutt[ZOOMIN_BUTT] = wxBITMAP(zoomin_down); downbutt[ZOOMOUT_BUTT] = wxBITMAP(zoomout_down); downbutt[ALLSTATES_BUTT] = wxBITMAP(allstates_down); #ifdef __WXMSW__ for (int i = 0; i < NUM_BUTTONS; i++) { CreatePaleBitmap(normbutt[i], disnormbutt[i]); } CreatePaleBitmap(downbutt[DRAW_BUTT], disdownbutt[DRAW_BUTT]); CreatePaleBitmap(downbutt[PICK_BUTT], disdownbutt[PICK_BUTT]); CreatePaleBitmap(downbutt[SELECT_BUTT], disdownbutt[SELECT_BUTT]); CreatePaleBitmap(downbutt[MOVE_BUTT], disdownbutt[MOVE_BUTT]); CreatePaleBitmap(downbutt[ZOOMIN_BUTT], disdownbutt[ZOOMIN_BUTT]); CreatePaleBitmap(downbutt[ZOOMOUT_BUTT], disdownbutt[ZOOMOUT_BUTT]); CreatePaleBitmap(downbutt[ALLSTATES_BUTT], disdownbutt[ALLSTATES_BUTT]); #endif for (int i = 0; i < NUM_BUTTONS; i++) { buttstate[i] = 0; } // init position variables used by AddButton and AddSeparator #ifdef __WXGTK__ // buttons are a different size in wxGTK xpos = 2; ypos = 2; smallgap = 6; #else xpos = 4; ypos = (32 - BUTTON_HT) / 2; smallgap = 4; #endif biggap = 16; // add buttons AddButton(UNDO_BUTT, _("Undo")); AddButton(REDO_BUTT, _("Redo")); AddSeparator(); AddButton(DRAW_BUTT, _("Draw")); AddButton(PICK_BUTT, _("Pick")); AddButton(SELECT_BUTT, _("Select")); AddButton(MOVE_BUTT, _("Move")); AddButton(ZOOMIN_BUTT, _("Zoom in")); AddButton(ZOOMOUT_BUTT, _("Zoom out")); AddSeparator(); AddButton(ALLSTATES_BUTT, _("Show/hide all states")); // create font for text in edit bar and set textascent for use in DisplayText #ifdef __WXMSW__ // use smaller, narrower font on Windows editfont = wxFont::New(8, wxDEFAULT, wxNORMAL, wxNORMAL); int major, minor; wxGetOsVersion(&major, &minor); if ( major > 5 || (major == 5 && minor >= 1) ) { // 5.1+ means XP or later (Vista if major >= 6) textascent = 11; } else { textascent = 10; } #elif defined(__WXGTK__) // use smaller font on GTK editfont = wxFont::New(8, wxMODERN, wxNORMAL, wxNORMAL); textascent = 11; #elif defined(__WXOSX_COCOA__) // we need to specify facename to get Monaco instead of Courier editfont = wxFont::New(10, wxMODERN, wxNORMAL, wxNORMAL, false, wxT("Monaco")); textascent = 10; #elif defined(__WXMAC__) editfont = wxFont::New(10, wxMODERN, wxNORMAL, wxNORMAL); textascent = 10; #else editfont = wxFont::New(10, wxMODERN, wxNORMAL, wxNORMAL); textascent = 10; #endif if (editfont == NULL) Fatal(_("Failed to create edit bar font!")); // determine horizontal offsets for info in edit bar wxClientDC dc(this); int textwd, textht; SetEditFont(dc); h_col1 = 4; dc.GetTextExtent(_("State:"), &textwd, &textht); h_col2 = h_col1 + textwd + 4; dc.GetTextExtent(_("9"), &digitwd, &digitht); digitht -= 4; editbitmap = NULL; editbitmapwd = -1; editbitmapht = -1; // add scroll bar int scrollbarwd = 100; #ifdef __WXMAC__ int scrollbarht = 15; // must be this height on Mac #else int scrollbarht = BOXSIZE; #endif int x = xpos + 3*digitwd + BOXGAP + 2*(BOXSIZE + BOXGAP); int y = (SMALLHT - (scrollbarht + 1)) / 2; drawbar = new wxScrollBar(this, STATE_BAR, wxPoint(x, y), wxSize(scrollbarwd, scrollbarht), wxSB_HORIZONTAL); if (drawbar == NULL) Fatal(_("Failed to create scroll bar!")); firststate = 0; } // ----------------------------------------------------------------------------- EditBar::~EditBar() { delete editfont; delete editbitmap; delete drawbar; } // ----------------------------------------------------------------------------- void EditBar::SetEditFont(wxDC& dc) { dc.SetFont(*editfont); dc.SetTextForeground(*wxBLACK); dc.SetBrush(*wxBLACK_BRUSH); dc.SetBackgroundMode(wxTRANSPARENT); } // ----------------------------------------------------------------------------- void EditBar::DisplayText(wxDC& dc, const wxString& s, wxCoord x, wxCoord y) { // DrawText's y parameter is top of text box but we pass in baseline // so adjust by textascent which depends on platform and OS version -- yuk! dc.DrawText(s, x, y - textascent); } // ----------------------------------------------------------------------------- void EditBar::DrawAllStates(wxDC& dc, int wd) { DisplayText(dc, _("State:"), h_col1, BASELINE1); DisplayText(dc, _("Color:"), h_col1, BASELINE2); DisplayText(dc, _("Icon:"), h_col1, BASELINE3); wxBitmap** iconmaps = currlayer->icons7x7; dc.SetPen(*wxBLACK_PEN); // calculate number of (completely) visible states int visstates = (wd - h_col2) / COLWD; if (visstates >= currlayer->algo->NumCellStates()) { // all states are visible firststate = 0; visstates = currlayer->algo->NumCellStates(); } else { // change firststate if necessary so that drawing state is visible if (currlayer->drawingstate < firststate) { firststate = currlayer->drawingstate; } else if (currlayer->drawingstate >= firststate + visstates) { firststate = currlayer->drawingstate - visstates + 1; } // may need to reduce firststate if window width has increased if (firststate + visstates >= currlayer->algo->NumCellStates()) { firststate = currlayer->algo->NumCellStates() - visstates; } } // add 1 to visstates so we see partial box at right edge for (int i = firststate; i < firststate + visstates + 1; i++) { // this test is needed because we added 1 to visstates if (i >= currlayer->algo->NumCellStates()) break; wxString strbuf; wxRect r; int x; // draw state value strbuf.Printf(_("%d"), i); x = (int)(h_col2 + (i - firststate) * COLWD + (COLWD - strbuf.length() * digitwd) / 2); DisplayText(dc, strbuf, x, BASELINE1); // draw color box x = 1 + h_col2 + (i - firststate) * COLWD + (COLWD - BOXWD) / 2; wxColor color(currlayer->cellr[i], currlayer->cellg[i], currlayer->cellb[i]); r = wxRect(x, BASELINE2 - BOXWD, BOXWD, BOXWD); dc.SetBrush(wxBrush(color)); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); // draw icon box r = wxRect(x, BASELINE3 - BOXWD, BOXWD, BOXWD); if (iconmaps && iconmaps[i]) { dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); DrawOneIcon(dc, x + 1, BASELINE3 - BOXWD + 1, iconmaps[i], currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0], currlayer->cellr[i], currlayer->cellg[i], currlayer->cellb[i], currlayer->multicoloricons); } else { dc.SetBrush(wxBrush(color)); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } } // draw rect around current drawing state if (currlayer->drawingstate >= firststate && currlayer->drawingstate <= firststate + visstates) { int x = 1 + h_col2 + (currlayer->drawingstate - firststate) * COLWD; #ifdef __WXGTK__ wxRect r(x, SMALLHT + 1, COLWD - 1, BIGHT - SMALLHT - 5); #else wxRect r(x, SMALLHT + 2, COLWD - 1, BIGHT - SMALLHT - 5); #endif dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } dc.SetPen(wxNullPen); } // ----------------------------------------------------------------------------- void EditBar::DrawEditBar(wxDC& dc, int wd, int ht) { wxRect r = wxRect(0, 0, wd, ht); #ifdef __WXMAC__ wxBrush brush(wxColor(202,202,202)); FillRect(dc, r, brush); #endif #ifdef __WXMSW__ // use theme background color on Windows wxBrush brush(GetBackgroundColour()); FillRect(dc, r, brush); #endif // draw gray border line at bottom edge #if defined(__WXMSW__) dc.SetPen(*wxGREY_PEN); #elif defined(__WXMAC__) wxPen linepen(wxColor(140,140,140)); dc.SetPen(linepen); #else dc.SetPen(*wxLIGHT_GREY_PEN); #endif dc.DrawLine(0, r.GetBottom(), r.width, r.GetBottom()); dc.SetPen(wxNullPen); // reset drawing state in case it's no longer valid (due to algo/rule change) if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) { currlayer->drawingstate = 1; } SetEditFont(dc); // for DisplayText calls if (showallstates) DrawAllStates(dc, wd); dc.SetPen(*wxBLACK_PEN); // draw current drawing state int state = currlayer->drawingstate; int x = xpos; int y = SMALLHT - 8; wxString strbuf; if (state < 10) x += digitwd; if (state < 100) x += digitwd; strbuf.Printf(_("%d"), state); DisplayText(dc, strbuf, x, y - (BOXSIZE - digitht)/2); wxColor cellcolor(currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state]); // draw color box x = xpos + 3*digitwd + BOXGAP; colorbox = wxRect(x, y - BOXSIZE, BOXSIZE, BOXSIZE); dc.SetBrush(wxBrush(cellcolor)); dc.DrawRectangle(colorbox); dc.SetBrush(wxNullBrush); // draw icon box wxBitmap** iconmaps = currlayer->icons15x15; x += BOXSIZE + BOXGAP; iconbox = wxRect(x, y - BOXSIZE, BOXSIZE, BOXSIZE); if (iconmaps && iconmaps[state]) { dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(iconbox); dc.SetBrush(wxNullBrush); DrawOneIcon(dc, x + 1, y - BOXSIZE + 1, iconmaps[state], currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0], currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state], currlayer->multicoloricons); } else { dc.SetBrush(wxBrush(cellcolor)); dc.DrawRectangle(iconbox); dc.SetBrush(wxNullBrush); } // show whether color or icon mode is selected dc.SetBrush(*wxTRANSPARENT_BRUSH); if (showicons) { iconbox.Inflate(2,2); dc.DrawRectangle(iconbox); iconbox.Inflate(-2,-2); } else { colorbox.Inflate(2,2); dc.DrawRectangle(colorbox); colorbox.Inflate(-2,-2); } dc.SetBrush(wxNullBrush); dc.SetPen(wxNullPen); } // ----------------------------------------------------------------------------- void EditBar::OnPaint(wxPaintEvent& WXUNUSED(event)) { int wd, ht; GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; #if defined(__WXMAC__) || defined(__WXGTK__) // windows on Mac OS X and GTK+ 2.0 are automatically buffered wxPaintDC dc(this); #else // use wxWidgets buffering to avoid flicker if (wd != editbitmapwd || ht != editbitmapht) { // need to create a new bitmap for edit bar delete editbitmap; editbitmap = new wxBitmap(wd, ht); editbitmapwd = wd; editbitmapht = ht; } if (editbitmap == NULL) Fatal(_("Not enough memory to render edit bar!")); wxBufferedPaintDC dc(this, *editbitmap); #endif if (showedit) DrawEditBar(dc, wd, ht); } // ----------------------------------------------------------------------------- void EditBar::OnMouseDown(wxMouseEvent& event) { // on Win/Linux we need to reset keyboard focus to viewport window viewptr->SetFocus(); mainptr->showbanner = false; statusptr->ClearMessage(); if (inscript) return; // let script control drawing state int x = event.GetX(); int y = event.GetY(); if (showallstates) { // user can change drawing state by clicking in appropriate box int right = h_col2 + COLWD * currlayer->algo->NumCellStates(); int box = -1; if (x > h_col2 && x < right && y > SMALLHT) { box = (x - h_col2) / COLWD + firststate; } if (box >= 0 && box < currlayer->algo->NumCellStates() && currlayer->drawingstate != box) { currlayer->drawingstate = box; Refresh(false); UpdateScrollBar(); return; } } if (event.LeftDClick()) { // open Set Layer Colors dialog if user double-clicks in color/icon box if (colorbox.Contains(x,y) || iconbox.Contains(x,y)) { SetLayerColors(); } } else { // user can change color/icon mode by clicking in color/icon box if (colorbox.Contains(x,y) && showicons) { viewptr->ToggleCellIcons(); } else if (iconbox.Contains(x,y) && !showicons) { viewptr->ToggleCellIcons(); } } } // ----------------------------------------------------------------------------- void EditBar::OnButton(wxCommandEvent& event) { #ifdef __WXMAC__ // close any open tool tip window (fixes wxMac bug?) wxToolTip::RemoveToolTips(); #endif mainptr->showbanner = false; statusptr->ClearMessage(); int id = event.GetId(); int cmdid; switch (id) { case UNDO_BUTT: cmdid = ID_UNDO; break; case REDO_BUTT: cmdid = ID_REDO; break; case DRAW_BUTT: cmdid = ID_DRAW; break; case PICK_BUTT: cmdid = ID_PICK; break; case SELECT_BUTT: cmdid = ID_SELECT; break; case MOVE_BUTT: cmdid = ID_MOVE; break; case ZOOMIN_BUTT: cmdid = ID_ZOOMIN; break; case ZOOMOUT_BUTT: cmdid = ID_ZOOMOUT; break; case ALLSTATES_BUTT: cmdid = ID_ALL_STATES; break; default: Warning(_("Unexpected button id!")); return; } // call MainFrame::OnMenu after OnButton finishes wxCommandEvent cmdevt(wxEVT_COMMAND_MENU_SELECTED, cmdid); wxPostEvent(mainptr->GetEventHandler(), cmdevt); // avoid possible problems viewptr->SetFocus(); } // ----------------------------------------------------------------------------- void EditBar::OnScroll(wxScrollEvent& event) { WXTYPE type = event.GetEventType(); if (type == wxEVT_SCROLL_LINEUP) { currlayer->drawingstate--; if (currlayer->drawingstate < 0) currlayer->drawingstate = 0; Refresh(false); } else if (type == wxEVT_SCROLL_LINEDOWN) { currlayer->drawingstate++; if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) currlayer->drawingstate = currlayer->algo->NumCellStates() - 1; Refresh(false); } else if (type == wxEVT_SCROLL_PAGEUP) { currlayer->drawingstate -= PAGESIZE; if (currlayer->drawingstate < 0) currlayer->drawingstate = 0; Refresh(false); } else if (type == wxEVT_SCROLL_PAGEDOWN) { currlayer->drawingstate += PAGESIZE; if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) currlayer->drawingstate = currlayer->algo->NumCellStates() - 1; Refresh(false); } else if (type == wxEVT_SCROLL_THUMBTRACK) { currlayer->drawingstate = event.GetPosition(); if (currlayer->drawingstate < 0) currlayer->drawingstate = 0; if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) currlayer->drawingstate = currlayer->algo->NumCellStates() - 1; Refresh(false); } else if (type == wxEVT_SCROLL_THUMBRELEASE) { UpdateScrollBar(); } #ifndef __WXMAC__ viewptr->SetFocus(); // need on Win/Linux #endif } // ----------------------------------------------------------------------------- void EditBar::OnKillFocus(wxFocusEvent& event) { int id = event.GetId(); ebbutt[id]->SetFocus(); // don't let button lose focus } // ----------------------------------------------------------------------------- void EditBar::OnButtonDown(wxMouseEvent& event) { // edit bar button has been pressed int id = event.GetId(); // connect a handler that keeps focus with the pressed button ebbutt[id]->Connect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(EditBar::OnKillFocus)); event.Skip(); } // ----------------------------------------------------------------------------- void EditBar::OnButtonUp(wxMouseEvent& event) { // edit bar button has been released int id = event.GetId(); wxPoint pt = ebbutt[id]->ScreenToClient( wxGetMousePosition() ); int wd, ht; ebbutt[id]->GetClientSize(&wd, &ht); wxRect r(0, 0, wd, ht); // diconnect kill-focus handler ebbutt[id]->Disconnect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(EditBar::OnKillFocus)); viewptr->SetFocus(); if (r.Contains(pt)) { // call OnButton wxCommandEvent buttevt(wxEVT_COMMAND_BUTTON_CLICKED, id); buttevt.SetEventObject(ebbutt[id]); ebbutt[id]->GetEventHandler()->ProcessEvent(buttevt); } } // ----------------------------------------------------------------------------- void EditBar::AddButton(int id, const wxString& tip) { ebbutt[id] = new wxBitmapButton(this, id, normbutt[id], wxPoint(xpos,ypos), wxSize(BUTTON_WD, BUTTON_HT)); if (ebbutt[id] == NULL) { Fatal(_("Failed to create edit bar button!")); } else { xpos += BUTTON_WD + smallgap; ebbutt[id]->SetToolTip(tip); #ifdef __WXMSW__ // fix problem with edit bar buttons when generating/inscript // due to focus being changed to viewptr ebbutt[id]->Connect(id, wxEVT_LEFT_DOWN, wxMouseEventHandler(EditBar::OnButtonDown)); ebbutt[id]->Connect(id, wxEVT_LEFT_UP, wxMouseEventHandler(EditBar::OnButtonUp)); #endif } } // ----------------------------------------------------------------------------- void EditBar::AddSeparator() { xpos += biggap - smallgap; } // ----------------------------------------------------------------------------- void EditBar::EnableButton(int id, bool enable) { if (enable == ebbutt[id]->IsEnabled()) return; #ifdef __WXMSW__ if (id == DRAW_BUTT && currlayer->curs == curs_pencil) { ebbutt[id]->SetBitmapDisabled(disdownbutt[id]); } else if (id == PICK_BUTT && currlayer->curs == curs_pick) { ebbutt[id]->SetBitmapDisabled(disdownbutt[id]); } else if (id == SELECT_BUTT && currlayer->curs == curs_cross) { ebbutt[id]->SetBitmapDisabled(disdownbutt[id]); } else if (id == MOVE_BUTT && currlayer->curs == curs_hand) { ebbutt[id]->SetBitmapDisabled(disdownbutt[id]); } else if (id == ZOOMIN_BUTT && currlayer->curs == curs_zoomin) { ebbutt[id]->SetBitmapDisabled(disdownbutt[id]); } else if (id == ZOOMOUT_BUTT && currlayer->curs == curs_zoomout) { ebbutt[id]->SetBitmapDisabled(disdownbutt[id]); } else if (id == ALLSTATES_BUTT && showallstates) { ebbutt[id]->SetBitmapDisabled(disdownbutt[id]); } else { ebbutt[id]->SetBitmapDisabled(disnormbutt[id]); } #endif ebbutt[id]->Enable(enable); } // ----------------------------------------------------------------------------- void EditBar::SelectButton(int id, bool select) { if (select) { if (buttstate[id] == 1) return; buttstate[id] = 1; ebbutt[id]->SetBitmapLabel(downbutt[id]); } else { if (buttstate[id] == -1) return; buttstate[id] = -1; ebbutt[id]->SetBitmapLabel(normbutt[id]); } ebbutt[id]->Refresh(false); } // ----------------------------------------------------------------------------- void EditBar::UpdateScrollBar() { drawbar->SetScrollbar(currlayer->drawingstate, 1, currlayer->algo->NumCellStates(), PAGESIZE, true); } // ----------------------------------------------------------------------------- void CreateEditBar(wxWindow* parent) { // create edit bar underneath layer bar int wd, ht; parent->GetClientSize(&wd, &ht); editbarht = showallstates ? BIGHT : SMALLHT; editbarptr = new EditBar(parent, 0, LayerBarHeight(), wd, editbarht); if (editbarptr == NULL) Fatal(_("Failed to create edit bar!")); editbarptr->Show(showedit); } // ----------------------------------------------------------------------------- int EditBarHeight() { return (showedit ? editbarht : 0); } // ----------------------------------------------------------------------------- void ResizeEditBar(int wd) { if (editbarptr) { editbarptr->SetSize(wd, editbarht); } } // ----------------------------------------------------------------------------- void UpdateEditBar(bool active) { if (editbarptr && showedit) { if (viewptr->waitingforclick) active = false; bool timeline = TimelineExists(); // set state of toggle buttons editbarptr->SelectButton(DRAW_BUTT, currlayer->curs == curs_pencil); editbarptr->SelectButton(PICK_BUTT, currlayer->curs == curs_pick); editbarptr->SelectButton(SELECT_BUTT, currlayer->curs == curs_cross); editbarptr->SelectButton(MOVE_BUTT, currlayer->curs == curs_hand); editbarptr->SelectButton(ZOOMIN_BUTT, currlayer->curs == curs_zoomin); editbarptr->SelectButton(ZOOMOUT_BUTT, currlayer->curs == curs_zoomout); editbarptr->SelectButton(ALLSTATES_BUTT, showallstates); // CanUndo() returns false if drawing/selecting cells so the user can't undo // while in those modes (by pressing a key), but we want the Undo button to // appear to be active bool canundo = (allowundo && (viewptr->drawingcells || viewptr->selectingcells)) || currlayer->undoredo->CanUndo(); editbarptr->EnableButton(UNDO_BUTT, active && !timeline && canundo); editbarptr->EnableButton(REDO_BUTT, active && !timeline && currlayer->undoredo->CanRedo()); editbarptr->EnableButton(DRAW_BUTT, active); editbarptr->EnableButton(PICK_BUTT, active); editbarptr->EnableButton(SELECT_BUTT, active); editbarptr->EnableButton(MOVE_BUTT, active); editbarptr->EnableButton(ZOOMIN_BUTT, active); editbarptr->EnableButton(ZOOMOUT_BUTT, active); editbarptr->EnableButton(ALLSTATES_BUTT, active); editbarptr->Refresh(false); // drawing state might have changed editbarptr->UpdateScrollBar(); } } // ----------------------------------------------------------------------------- void ToggleEditBar() { showedit = !showedit; wxRect r = bigview->GetRect(); if (showedit) { // show edit bar at top of viewport window or underneath layer bar r.y += editbarht; r.height -= editbarht; ResizeEditBar(r.width); } else { // hide edit bar r.y -= editbarht; r.height += editbarht; } bigview->SetSize(r); editbarptr->Show(showedit); // needed on Windows if (showlayer) { // line at bottom of layer bar may need to be added/removed RedrawLayerBar(); } mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void ToggleAllStates() { showallstates = !showallstates; editbarht = showallstates ? BIGHT : SMALLHT; if (showedit) { int diff = BIGHT - SMALLHT; if (!showallstates) diff *= -1; wxRect r = bigview->GetRect(); ResizeEditBar(r.width); r.y += diff; r.height -= diff; bigview->SetSize(r); mainptr->UpdateEverything(); } else if (showallstates) { // show the edit bar using new height ToggleEditBar(); } else { mainptr->UpdateMenuItems(mainptr->IsActive()); } } // ----------------------------------------------------------------------------- void ShiftEditBar(int yamount) { int x, y; editbarptr->GetPosition(&x, &y); editbarptr->Move(x, y + yamount); } // ----------------------------------------------------------------------------- void CycleDrawingState(bool higher) { if (viewptr->drawingcells) return; int maxstate = currlayer->algo->NumCellStates() - 1; if (higher) { if (currlayer->drawingstate == maxstate) currlayer->drawingstate = 0; else currlayer->drawingstate++; } else { if (currlayer->drawingstate == 0) currlayer->drawingstate = maxstate; else currlayer->drawingstate--; } if (showedit) { editbarptr->Refresh(false); editbarptr->UpdateScrollBar(); } } golly-2.5-src/gui-wx/wxfile.cpp0000644000175100001440000021231012156145314013434 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/file.h" // for wxFile #include "wx/filename.h" // for wxFileName #include "wx/menuitem.h" // for SetText #include "wx/clipbrd.h" // for wxTheClipboard #include "wx/dataobj.h" // for wxTextDataObject #include "wx/zipstrm.h" // for wxZipEntry, wxZipInputStream #include "wx/wfstream.h" // for wxFFileInputStream #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "readpattern.h" // for readpattern #include "writepattern.h" // for writepattern, pattern_format #include "wxgolly.h" // for wxGetApp, statusptr, viewptr, bigview #include "wxutils.h" // for Warning #include "wxprefs.h" // for SavePrefs, allowundo, userrules, etc #include "wxrule.h" // for GetRuleName #include "wxinfo.h" // for GetInfoFrame #include "wxstatus.h" // for statusptr->... #include "wxview.h" // for viewptr->... #include "wxrender.h" // for SetSelectionColor #include "wxscript.h" // for RunScript, inscript #include "wxmain.h" // for MainFrame, etc #include "wxundo.h" // for currlayer->undoredo->... #include "wxalgos.h" // for CreateNewUniverse, algo_type, algoinfo, etc #include "wxlayer.h" // for currlayer, etc #include "wxhelp.h" // for ShowHelp, LoadRule #include "wxtimeline.h" // for InitTimelineFrame, ToggleTimelineBar, etc #if defined(__WXMAC__) && !defined(__WXOSX_COCOA__) #include // for OpaqueWindowPtr, etc #include "wx/mac/corefoundation/cfstring.h" // for wxMacCFStringHolder #endif #ifdef __WXMAC__ // convert path to decomposed UTF8 so fopen will work #define FILEPATH path.fn_str() #else #define FILEPATH path.mb_str(wxConvLocal) #endif #if wxCHECK_VERSION(2,9,0) // some wxMenuItem method names have changed in wx 2.9 #define GetText GetItemLabel #define SetText SetItemLabel #endif // File menu functions: // ----------------------------------------------------------------------------- wxString MainFrame::GetBaseName(const wxString& path) { // extract basename from given path return path.AfterLast(wxFILE_SEP_PATH); } // ----------------------------------------------------------------------------- void MainFrame::MySetTitle(const wxString& title) { // fix if SetTitle still causes window refresh in Cocoa version!!! #if defined(__WXMAC__) && !defined(__WXOSX_COCOA__) // avoid wxMac's SetTitle call -- it causes an undesirable window refresh SetWindowTitleWithCFString((OpaqueWindowPtr*)this->MacGetWindowRef(), wxMacCFStringHolder(title, wxFONTENCODING_DEFAULT)); #else SetTitle(title); #endif } // ----------------------------------------------------------------------------- void MainFrame::SetWindowTitle(const wxString& filename) { if ( !filename.IsEmpty() ) { // remember current file name currlayer->currname = filename; // show currname in current layer's menu item UpdateLayerItem(currindex); } if (inscript) { // avoid window title flashing; eg. script might be switching layers ShowTitleLater(); return; } wxString prefix = wxEmptyString; // display asterisk if pattern has been modified if (currlayer->dirty) prefix += wxT("*"); int cid = currlayer->cloneid; while (cid > 0) { // display one or more "=" chars to indicate this is a cloned layer prefix += wxT("="); cid--; } wxString rule = GetRuleName( wxString(currlayer->algo->getrule(),wxConvLocal) ); wxString wtitle; #ifdef __WXMAC__ wtitle.Printf(_("%s%s [%s]"), prefix.c_str(), currlayer->currname.c_str(), rule.c_str()); #else wtitle.Printf(_("%s%s [%s] - Golly"), prefix.c_str(), currlayer->currname.c_str(), rule.c_str()); #endif // nicer to truncate a really long title??? MySetTitle(wtitle); } // ----------------------------------------------------------------------------- void MainFrame::SetGenIncrement() { if (currlayer->currexpo > 0) { bigint inc = 1; // set increment to currbase^currexpo int i = currlayer->currexpo; while (i > 0) { inc.mul_smallint(currlayer->currbase); i--; } currlayer->algo->setIncrement(inc); } else { currlayer->algo->setIncrement(1); } } // ----------------------------------------------------------------------------- void MainFrame::CreateUniverse() { // save current rule wxString oldrule = wxString(currlayer->algo->getrule(), wxConvLocal); // delete old universe and create new one of same type delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); // ensure new universe uses same rule (and thus same # of cell states) RestoreRule(oldrule); // increment has been reset to 1 but that's probably not always desirable // so set increment using current step size SetGenIncrement(); } // ----------------------------------------------------------------------------- void MainFrame::NewPattern(const wxString& title) { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(wxID_NEW); return; } if (askonnew && !inscript && currlayer->dirty && !SaveCurrentLayer()) return; if (inscript) stop_after_script = true; currlayer->savestart = false; currlayer->currfile.Clear(); currlayer->startgen = 0; // reset step size before CreateUniverse calls SetGenIncrement currlayer->currbase = algoinfo[currlayer->algtype]->defbase; currlayer->currexpo = 0; // create new, empty universe of same type and using same rule CreateUniverse(); // reset timing info used in DisplayTimingInfo endtime = begintime = 0; // clear all undo/redo history currlayer->undoredo->ClearUndoRedo(); if (newremovesel) currlayer->currsel.Deselect(); if (newcurs) currlayer->curs = newcurs; viewptr->SetPosMag(bigint::zero, bigint::zero, newmag); // best to restore true origin if (currlayer->originx != bigint::zero || currlayer->originy != bigint::zero) { currlayer->originx = 0; currlayer->originy = 0; statusptr->SetMessage(origin_restored); } // restore default colors for current algo/rule UpdateLayerColors(); MarkLayerClean(title); // calls SetWindowTitle UpdateEverything(); } // ----------------------------------------------------------------------------- static bool IsImageFile(const wxString& path) { wxString ext = path.AfterLast('.'); // if path has no extension then ext == path if (ext == path) return false; // supported extensions match image handlers added in GollyApp::OnInit() return ext.IsSameAs(wxT("bmp"),false) || ext.IsSameAs(wxT("gif"),false) || ext.IsSameAs(wxT("png"),false) || ext.IsSameAs(wxT("tif"),false) || ext.IsSameAs(wxT("tiff"),false) || ext.IsSameAs(wxT("icons"),false) || // we don't actually support JPEG files but let LoadImage handle them ext.IsSameAs(wxT("jpg"),false) || ext.IsSameAs(wxT("jpeg"),false); } // ----------------------------------------------------------------------------- bool MainFrame::LoadImage(const wxString& path) { // don't try to load JPEG file wxString ext = path.AfterLast('.'); if ( ext.IsSameAs(wxT("jpg"),false) || ext.IsSameAs(wxT("jpeg"),false) ) { Warning(_("Golly cannot import JPEG data, only BMP/GIF/PNG/TIFF.")); // pattern will be empty return true; } wxImage image; if ( image.LoadFile(path) ) { // don't change the current rule here -- that way the image can // be loaded into any algo unsigned char maskr, maskg, maskb; bool hasmask = image.GetOrFindMaskColour(&maskr, &maskg, &maskb); int wd = image.GetWidth(); int ht = image.GetHeight(); unsigned char* idata = image.GetData(); int x, y; lifealgo* curralgo = currlayer->algo; for (y = 0; y < ht; y++) { for (x = 0; x < wd; x++) { long pos = (y * wd + x) * 3; unsigned char r = idata[pos]; unsigned char g = idata[pos+1]; unsigned char b = idata[pos+2]; if ( hasmask && r == maskr && g == maskg && b == maskb ) { // treat transparent pixel as a dead cell } else if ( r < 255 || g < 255 || b < 255 ) { // treat non-white pixel as a live cell curralgo->setcell(x, y, 1); } } } curralgo->endofpattern(); } else { Warning(_("Could not load image from file!")); } return true; } // ----------------------------------------------------------------------------- void MainFrame::LoadPattern(const wxString& path, const wxString& newtitle, bool updatestatus, bool updateall) { if ( !wxFileName::FileExists(path) ) { Warning(_("The file does not exist:\n") + path); return; } // newtitle is only empty if called from ResetPattern/RestorePattern if (!newtitle.IsEmpty()) { if (askonload && !inscript && currlayer->dirty && !SaveCurrentLayer()) return; if (inscript) stop_after_script = true; currlayer->savestart = false; currlayer->currfile = path; // reset step size now in case UpdateStatus is called below currlayer->currbase = algoinfo[currlayer->algtype]->defbase; currlayer->currexpo = 0; if (GetInfoFrame()) { // comments will no longer be relevant so close info window GetInfoFrame()->Close(true); } // reset timing info used in DisplayTimingInfo endtime = begintime = 0; // clear all undo/redo history currlayer->undoredo->ClearUndoRedo(); } if (!showbanner) statusptr->ClearMessage(); // set nopattupdate BEFORE UpdateStatus() call so we see gen=0 and pop=0; // in particular, it avoids getPopulation being called which would // slow down hlife pattern loading viewptr->nopattupdate = true; if (updatestatus) { // update all of status bar so we don't see different colored lines; // on Mac, DrawView also gets called if there are pending updates UpdateStatus(); } // save current algo and rule algo_type oldalgo = currlayer->algtype; wxString oldrule = wxString(currlayer->algo->getrule(), wxConvLocal); // delete old universe and create new one of same type delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); if (!newtitle.IsEmpty()) { // show new file name in window title but no rule (which readpattern can change); // nicer if user can see file name while loading a very large pattern MySetTitle(_("Loading ") + newtitle); } if (IsImageFile(path)) { // ensure new universe uses same rule RestoreRule(oldrule); LoadImage(path); viewptr->nopattupdate = false; } else { const char* err = readpattern(FILEPATH, *currlayer->algo); if (err) { wxString bigerr = _("File could not be loaded by any algorithm."); wxString algoname = wxString(GetAlgoName(currlayer->algtype), wxConvLocal); bigerr += wxString::Format(_("\n\nError from %s:\n"), algoname.c_str()); bigerr += wxString(err, wxConvLocal); // cycle thru all other algos until readpattern succeeds for (int i = 0; i < NumAlgos(); i++) { if (i != oldalgo) { currlayer->algtype = i; delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); // readpattern will call setrule err = readpattern(FILEPATH, *currlayer->algo); if (err) { algoname = wxString(GetAlgoName(currlayer->algtype), wxConvLocal); bigerr += wxString::Format(_("\n\nError from %s:\n"), algoname.c_str()); bigerr += wxString(err, wxConvLocal); } else { break; } } } viewptr->nopattupdate = false; if (err) { // no algo could read pattern so restore original algo and rule currlayer->algtype = oldalgo; delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); RestoreRule(oldrule); Warning(bigerr); } } viewptr->nopattupdate = false; } if (!newtitle.IsEmpty()) { MarkLayerClean(newtitle); // calls SetWindowTitle if (TimelineExists()) { // we've loaded a .mc file with a timeline so go to 1st frame InitTimelineFrame(); if (!showtimeline) ToggleTimelineBar(); // switch to the base step and exponent used to record the timeline pair be = currlayer->algo->getbaseexpo(); currlayer->currbase = be.first; currlayer->currexpo = be.second; } else { // restore default base step for current algo // (currlayer->currexpo was set to 0 above) currlayer->currbase = algoinfo[currlayer->algtype]->defbase; } SetGenIncrement(); // restore default colors for current algo/rule UpdateLayerColors(); if (openremovesel) currlayer->currsel.Deselect(); if (opencurs) currlayer->curs = opencurs; viewptr->FitInView(1); currlayer->startgen = currlayer->algo->getGeneration(); // might be > 0 if (updateall) UpdateEverything(); showbanner = false; } else { // ResetPattern/RestorePattern does the update } } // ----------------------------------------------------------------------------- void MainFrame::CheckBeforeRunning(const wxString& scriptpath, bool remember, const wxString& zippath) { bool ask; if (zippath.IsEmpty()) { // script was downloaded via "get:" link (script is in downloaddir -- // see GetURL in wxhelp.cpp) so always ask user if it's okay to run ask = true; } else { // script is included in zip file (scriptpath starts with tempdir) so only // ask user if zip file was downloaded via "get:" link ask = zippath.StartsWith(downloaddir); } if (ask) { UpdateEverything(); // in case OpenZipFile called LoadPattern #ifdef __WXMAC__ wxSetCursor(*wxSTANDARD_CURSOR); #endif // create our own dialog with a View button??? probably no need now that // user can ctrl/right-click on link to open script in their text editor wxString msg = scriptpath + _("\n\nClick \"No\" if the script is from an untrusted source."); int answer = wxMessageBox(msg, _("Do you want to run this script?"), wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT, wxGetActiveWindow()); switch (answer) { case wxYES: break; case wxNO: return; default: return; // No } } // also do this??? // save script info (download path or zip path + script entry) in list of safe scripts // (stored in prefs file) so we can search for this script and not ask again Raise(); if (remember) AddRecentScript(scriptpath); RunScript(scriptpath); } // ----------------------------------------------------------------------------- bool MainFrame::ExtractZipEntry(const wxString& zippath, const wxString& entryname, const wxString& outfile) { wxFFileInputStream instream(zippath); if (!instream.Ok()) { Warning(_("Could not create input stream for zip file:\n") + zippath); return false; } wxZipInputStream zip(instream); wxZipEntry* entry; while ((entry = zip.GetNextEntry()) != NULL) { wxString thisname = entry->GetName(); if (thisname == entryname) { // we've found the desired entry so copy entry data to given output file wxFileOutputStream outstream(outfile); if (outstream.Ok()) { // read and write in chunks so we can show a progress dialog const int BUFFER_SIZE = 4000; char buf[BUFFER_SIZE]; size_t incount = 0; size_t outcount = 0; size_t lastread, lastwrite; double filesize = (double) entry->GetSize(); if (filesize <= 0.0) filesize = -1.0; // show indeterminate progress BeginProgress(_("Extracting file")); while (true) { zip.Read(buf, BUFFER_SIZE); lastread = zip.LastRead(); if (lastread == 0) break; outstream.Write(buf, lastread); lastwrite = outstream.LastWrite(); incount += lastread; outcount += lastwrite; if (incount != outcount) { Warning(_("Error occurred while writing file:\n") + outfile); break; } char msg[128]; sprintf(msg, "File size: %.2f MB", double(incount) / 1048576.0); if (AbortProgress((double)incount / filesize, wxString(msg,wxConvLocal))) { outcount = 0; break; } } EndProgress(); if (incount == outcount) { // successfully copied entry data to outfile delete entry; return true; } else { // delete incomplete outfile if (wxFileExists(outfile)) wxRemoveFile(outfile); } } else { Warning(_("Could not open output stream for file:\n") + outfile); } delete entry; return false; } delete entry; } // should not get here Warning(_("Could not find zip file entry:\n") + entryname); return false; } // ----------------------------------------------------------------------------- static bool RuleInstalled(wxZipInputStream& zip, const wxString& rulepath) { wxFileOutputStream outstream(rulepath); bool ok = outstream.Ok(); if (ok) { zip.Read(outstream); ok = (outstream.GetLastError() == wxSTREAM_NO_ERROR); } return ok; } // ----------------------------------------------------------------------------- void MainFrame::OpenZipFile(const wxString& zippath) { // Process given zip file in the following manner: // - If it contains any .rule files then extract and install those // files into userrules (the user's rules directory). // - If the zip file is "complex" (contains any folders, rule files, text files, // or more than one pattern, or more than one script), build a temporary html // file with clickable links to each file entry and show it in the help window. // - If the zip file contains at most one pattern and at most one script (both // at the root level) then load the pattern (if present) and then run the script // (if present and if allowed). const wxString indent = wxT("    "); bool dirseen = false; bool diffdirs = (userrules != rulesdir); wxString firstdir = wxEmptyString; wxString lastpattern = wxEmptyString; wxString lastscript = wxEmptyString; int patternseps = 0; // # of separators in lastpattern int scriptseps = 0; // # of separators in lastscript int patternfiles = 0; int scriptfiles = 0; int textfiles = 0; // includes html files int rulefiles = 0; int deprecated = 0; // # of .table/tree/colors/icons files wxSortedArrayString deplist; // list of installed deprecated files wxSortedArrayString rulelist; // list of installed .rule files wxString contents = wxT("") + GetBaseName(zippath); contents += wxT("\n"); contents += wxT("\n"); contents += wxT("

\n"); contents += wxT("Zip file: "); contents += zippath; contents += wxT("

\n"); contents += wxT("Contents:
\n"); wxFFileInputStream instream(zippath); if (!instream.Ok()) { Warning(_("Could not create input stream for zip file:\n") + zippath); return; } wxZipInputStream zip(instream); // examine each entry in zip file and build contents string; // also install any .rule files wxZipEntry* entry; while ((entry = zip.GetNextEntry()) != NULL) { wxString name = entry->GetName(); if (name.StartsWith(wxT("__MACOSX")) || name.EndsWith(wxT(".DS_Store"))) { // ignore meta-data stuff in zip file created on Mac } else { // indent depending on # of separators in name unsigned int sepcount = 0; unsigned int i = 0; unsigned int len = (unsigned int)name.length(); while (i < len) { if (name[i] == wxFILE_SEP_PATH) sepcount++; i++; } // check if 1st directory has multiple separators (eg. in jslife.zip) if (entry->IsDir() && !dirseen && sepcount > 1) { firstdir = name.BeforeFirst(wxFILE_SEP_PATH); contents += firstdir; contents += wxT("
\n"); } for (i = 1; i < sepcount; i++) contents += indent; if (entry->IsDir()) { // remove terminating separator from directory name name = name.BeforeLast(wxFILE_SEP_PATH); name = name.AfterLast(wxFILE_SEP_PATH); if (dirseen && name == firstdir) { // ignore dir already output earlier (eg. in jslife.zip) } else { contents += name; contents += wxT("
\n"); } dirseen = true; } else { // entry is for some sort of file wxString filename = name.AfterLast(wxFILE_SEP_PATH); if (dirseen) contents += indent; if ( IsRuleFile(filename) && !filename.EndsWith(wxT(".rule")) ) { // this is a deprecated .table/tree/colors/icons file contents += filename; contents += indent; contents += wxT("[deprecated]"); deprecated++; // install it into userrules so it can be used below to create a .rule file wxString outfile = userrules + filename; if (RuleInstalled(zip, outfile)) { deplist.Add(filename); } else { contents += indent; contents += wxT("INSTALL FAILED!"); } } else { // user can extract file via special "unzip:" link contents += wxT(""); contents += filename; contents += wxT(""); if ( IsRuleFile(filename) ) { // extract and install .rule file into userrules wxString outfile = userrules + filename; if (RuleInstalled(zip, outfile)) { // file successfully installed rulelist.Add(filename); contents += indent; contents += wxT("[installed]"); if (diffdirs) { // check if this file overrides similarly named file in rulesdir wxString clashfile = rulesdir + filename; if (wxFileExists(clashfile)) { contents += indent; contents += wxT("(overrides file in Rules folder)"); } } } else { // file could not be installed contents += indent; contents += wxT("[NOT installed]"); // file is probably incomplete so best to delete it if (wxFileExists(outfile)) wxRemoveFile(outfile); } rulefiles++; } else if ( IsHTMLFile(filename) || IsTextFile(filename) ) { textfiles++; } else if ( IsScriptFile(filename) ) { scriptfiles++; lastscript = name; scriptseps = sepcount; } else { patternfiles++; lastpattern = name; patternseps = sepcount; } } contents += wxT("
\n"); } } delete entry; } // end while if (rulefiles > 0) { contents += wxT("

Files marked as \"[installed]\" have been stored in your rules folder:
\n"); contents += userrules; contents += wxT("\n"); } if (deprecated > 0) { wxString newrules = CreateRuleFiles(deplist, rulelist); if (newrules.length() > 0) { contents += wxT("

Files marked as \"[deprecated]\" have been used to create new .rule files:
\n"); contents += newrules; } } contents += wxT("\n"); if (dirseen || rulefiles > 0 || deprecated > 0 || textfiles > 0 || patternfiles > 1 || scriptfiles > 1) { // complex zip, so write contents to a temporary html file and display it in help window; // use a unique file name so user can go back/forwards wxString htmlfile = wxFileName::CreateTempFileName(tempdir + wxT("zip_contents_")); wxRemoveFile(htmlfile); htmlfile += wxT(".html"); wxFile outfile(htmlfile, wxFile::write); if (outfile.IsOpened()) { outfile.Write(contents); outfile.Close(); ShowHelp(htmlfile); } else { Warning(_("Could not create html file:\n") + htmlfile); } } if (patternfiles <= 1 && scriptfiles <= 1 && patternseps == 0 && scriptseps == 0) { // load lastpattern (if present), then run lastscript (if present); // the script might be a long-running one that allows user interaction, // so it's best to run it AFTER calling ShowHelp above if (patternfiles == 1) { wxString tempfile = tempdir + lastpattern.AfterLast(wxFILE_SEP_PATH); if (ExtractZipEntry(zippath, lastpattern, tempfile)) { Raise(); // don't call AddRecentPattern(tempfile) here; OpenFile has added // zippath to recent patterns LoadPattern(tempfile, GetBaseName(tempfile), true, scriptfiles == 0); } } if (scriptfiles == 1) { wxString tempfile = tempdir + lastscript.AfterLast(wxFILE_SEP_PATH); if (ExtractZipEntry(zippath, lastscript, tempfile)) { // run script depending on safety check CheckBeforeRunning(tempfile, false, zippath); } else { // should never happen but play safe UpdateEverything(); } } } } // ----------------------------------------------------------------------------- static bool RuleCanBeFound(const wxString& path) { // ensure given path to .rule file is a full path wxString fullpath = path; wxFileName fname(fullpath); if (!fname.IsAbsolute()) fullpath = gollydir + path; // check that .rule file is in userrules or rulesdir wxString dir = fullpath.BeforeLast(wxFILE_SEP_PATH); dir += wxFILE_SEP_PATH; if (dir == userrules || dir == rulesdir) { return true; } else { wxString msg = _("You need to move "); msg += fullpath.AfterLast(wxFILE_SEP_PATH); msg += _(" into your rules folder ("); msg += userrules; msg += _(") so the RuleLoader algorithm can find it."); Warning(msg); return false; } } // ----------------------------------------------------------------------------- void MainFrame::OpenFile(const wxString& path, bool remember) { if (IsHTMLFile(path)) { // show HTML file in help window ShowHelp(path); return; } if (IsTextFile(path)) { // open text file in user's preferred text editor EditFile(path); return; } if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; // assume remember is true (should only be false if called from a script) if ( IsScriptFile(path) ) { AddRecentScript(path); cmdevent.SetId(ID_RUN_RECENT + 1); } else { AddRecentPattern(path); cmdevent.SetId(ID_OPEN_RECENT + 1); } return; } if (IsScriptFile(path)) { // execute script if (remember) AddRecentScript(path); RunScript(path); } else if (IsZipFile(path)) { // process zip file if (remember) AddRecentPattern(path); // treat it like a pattern OpenZipFile(path); } else if (IsRuleFile(path)) { // switch to rule, but only if it's in rulesdir or userrules if (RuleCanBeFound(path)) LoadRule(path.AfterLast(wxFILE_SEP_PATH).BeforeLast('.')); } else { // load pattern if (remember) AddRecentPattern(path); // ensure path is a full path because a script might want to reset() to it // (in which case the cwd is the script's directory, not gollydir) wxString newpath = path; wxFileName fname(newpath); if (!fname.IsAbsolute()) newpath = gollydir + path; LoadPattern(newpath, GetBaseName(path)); } } // ----------------------------------------------------------------------------- void MainFrame::AddRecentPattern(const wxString& inpath) { if (inpath.IsEmpty()) return; wxString path = inpath; if (path.StartsWith(gollydir)) { // remove gollydir from start of path path.erase(0, gollydir.length()); } // duplicate any ampersands so they appear in menu path.Replace(wxT("&"), wxT("&&")); // put given path at start of patternSubMenu #ifdef __WXGTK__ // avoid wxGTK bug in FindItem if path contains underscores int id = wxNOT_FOUND; for (int i = 0; i < numpatterns; i++) { wxMenuItem* item = patternSubMenu->FindItemByPosition(i); wxString temp = item->GetText(); temp.Replace(wxT("__"), wxT("_")); temp.Replace(wxT("&"), wxT("&&")); if (temp == path) { id = ID_OPEN_RECENT + 1 + i; break; } } #else int id = patternSubMenu->FindItem(path); #endif if ( id == wxNOT_FOUND ) { if ( numpatterns < maxpatterns ) { // add new path numpatterns++; id = ID_OPEN_RECENT + numpatterns; patternSubMenu->Insert(numpatterns - 1, id, path); } else { // replace last item with new path wxMenuItem* item = patternSubMenu->FindItemByPosition(maxpatterns - 1); item->SetText(path); id = ID_OPEN_RECENT + maxpatterns; } } // path exists in patternSubMenu if ( id > ID_OPEN_RECENT + 1 ) { // move path to start of menu wxMenuItem* item; while ( id > ID_OPEN_RECENT + 1 ) { wxMenuItem* previtem = patternSubMenu->FindItem(id - 1); wxString prevpath = previtem->GetText(); #ifdef __WXGTK__ // remove duplicate underscores prevpath.Replace(wxT("__"), wxT("_")); prevpath.Replace(wxT("&"), wxT("&&")); #endif item = patternSubMenu->FindItem(id); item->SetText(prevpath); id--; } item = patternSubMenu->FindItem(id); item->SetText(path); } } // ----------------------------------------------------------------------------- void MainFrame::AddRecentScript(const wxString& inpath) { if (inpath.IsEmpty()) return; wxString path = inpath; if (path.StartsWith(gollydir)) { // remove gollydir from start of path path.erase(0, gollydir.length()); } // duplicate ampersands so they appear in menu path.Replace(wxT("&"), wxT("&&")); // put given path at start of scriptSubMenu #ifdef __WXGTK__ // avoid wxGTK bug in FindItem if path contains underscores int id = wxNOT_FOUND; for (int i = 0; i < numscripts; i++) { wxMenuItem* item = scriptSubMenu->FindItemByPosition(i); wxString temp = item->GetText(); temp.Replace(wxT("__"), wxT("_")); temp.Replace(wxT("&"), wxT("&&")); if (temp == path) { id = ID_RUN_RECENT + 1 + i; break; } } #else int id = scriptSubMenu->FindItem(path); #endif if ( id == wxNOT_FOUND ) { if ( numscripts < maxscripts ) { // add new path numscripts++; id = ID_RUN_RECENT + numscripts; scriptSubMenu->Insert(numscripts - 1, id, path); } else { // replace last item with new path wxMenuItem* item = scriptSubMenu->FindItemByPosition(maxscripts - 1); item->SetText(path); id = ID_RUN_RECENT + maxscripts; } } // path exists in scriptSubMenu if ( id > ID_RUN_RECENT + 1 ) { // move path to start of menu wxMenuItem* item; while ( id > ID_RUN_RECENT + 1 ) { wxMenuItem* previtem = scriptSubMenu->FindItem(id - 1); wxString prevpath = previtem->GetText(); #ifdef __WXGTK__ // remove duplicate underscores prevpath.Replace(wxT("__"), wxT("_")); prevpath.Replace(wxT("&"), wxT("&&")); #endif item = scriptSubMenu->FindItem(id); item->SetText(prevpath); id--; } item = scriptSubMenu->FindItem(id); item->SetText(path); } } // ----------------------------------------------------------------------------- void MainFrame::OpenPattern() { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(wxID_OPEN); return; } wxString filetypes = _("All files (*)|*"); filetypes += _("|RLE (*.rle)|*.rle"); filetypes += _("|Macrocell (*.mc)|*.mc"); filetypes += _("|Gzip (*.gz)|*.gz"); filetypes += _("|Life 1.05/1.06 (*.lif)|*.lif"); filetypes += _("|dblife (*.l)|*.l"); filetypes += _("|MCell (*.mcl)|*.mcl"); filetypes += _("|Zip (*.zip;*.gar)|*.zip;*.gar"); filetypes += _("|BMP (*.bmp)|*.bmp"); filetypes += _("|GIF (*.gif)|*.gif"); filetypes += _("|PNG (*.png)|*.png"); filetypes += _("|TIFF (*.tiff;*.tif)|*.tiff;*.tif"); wxFileDialog opendlg(this, _("Choose a pattern"), opensavedir, wxEmptyString, filetypes, wxFD_OPEN | wxFD_FILE_MUST_EXIST); #ifdef __WXGTK__ // opensavedir is ignored above (bug in wxGTK 2.8.0???) opendlg.SetDirectory(opensavedir); #endif if ( opendlg.ShowModal() == wxID_OK ) { wxFileName fullpath( opendlg.GetPath() ); opensavedir = fullpath.GetPath(); OpenFile( opendlg.GetPath() ); } } // ----------------------------------------------------------------------------- void MainFrame::OpenScript() { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(ID_RUN_SCRIPT); return; } wxString filetypes = _("Perl or Python (*.pl;*.py)|*.pl;*.py"); filetypes += _("|Perl (*.pl)|*.pl"); filetypes += _("|Python (*.py)|*.py"); wxFileDialog opendlg(this, _("Choose a script"), rundir, wxEmptyString, filetypes, wxFD_OPEN | wxFD_FILE_MUST_EXIST); #ifdef __WXGTK__ // rundir is ignored above (bug in wxGTK 2.8.0???) opendlg.SetDirectory(rundir); #endif if ( opendlg.ShowModal() == wxID_OK ) { wxFileName fullpath( opendlg.GetPath() ); rundir = fullpath.GetPath(); AddRecentScript( opendlg.GetPath() ); RunScript( opendlg.GetPath() ); } } // ----------------------------------------------------------------------------- bool MainFrame::CopyTextToClipboard(const wxString& text) { bool result = true; if (wxTheClipboard->Open()) { if ( !wxTheClipboard->SetData(new wxTextDataObject(text)) ) { Warning(_("Could not copy text to clipboard!")); result = false; } wxTheClipboard->Close(); } else { Warning(_("Could not open clipboard!")); result = false; } return result; } // ----------------------------------------------------------------------------- #if wxCHECK_VERSION(2,9,0) // wxTextDataObject also has GetText and SetText methods so don't change them #undef GetText #undef SetText #endif bool MainFrame::GetTextFromClipboard(wxTextDataObject* textdata) { bool gotdata = false; if ( wxTheClipboard->Open() ) { if ( wxTheClipboard->IsSupported( wxDF_TEXT ) ) { gotdata = wxTheClipboard->GetData( *textdata ); if (!gotdata) { statusptr->ErrorMessage(_("Could not get clipboard text!")); } } else if ( wxTheClipboard->IsSupported( wxDF_BITMAP ) ) { wxBitmapDataObject bmapdata; gotdata = wxTheClipboard->GetData( bmapdata ); if (gotdata) { // convert bitmap data to text data wxString str; wxBitmap bmap = bmapdata.GetBitmap(); wxImage image = bmap.ConvertToImage(); if (image.Ok()) { /* there doesn't seem to be any mask or alpha info, at least on Mac if (bmap.GetMask() != NULL) Warning(_("Bitmap has mask!")); if (image.HasMask()) Warning(_("Image has mask!")); if (image.HasAlpha()) Warning(_("Image has alpha!")); */ int wd = image.GetWidth(); int ht = image.GetHeight(); unsigned char* idata = image.GetData(); int x, y; for (y = 0; y < ht; y++) { for (x = 0; x < wd; x++) { long pos = (y * wd + x) * 3; if ( idata[pos] < 255 || idata[pos+1] < 255 || idata[pos+2] < 255 ) { // non-white pixel is a live cell str += 'o'; } else { // white pixel is a dead cell str += '.'; } } str += '\n'; } textdata->SetText(str); } else { statusptr->ErrorMessage(_("Could not convert clipboard bitmap!")); gotdata = false; } } else { statusptr->ErrorMessage(_("Could not get clipboard bitmap!")); } } else { statusptr->ErrorMessage(_("No data in clipboard.")); } wxTheClipboard->Close(); } else { statusptr->ErrorMessage(_("Could not open clipboard!")); } return gotdata; } // ----------------------------------------------------------------------------- bool MainFrame::ClipboardContainsRule() { wxTextDataObject data; if (!GetTextFromClipboard(&data)) return false; wxString cliptext = data.GetText(); if (!cliptext.StartsWith(wxT("@RULE "))) return false; // extract rule name wxString rulename; int i = 6; while (cliptext[i] > ' ') { rulename += cliptext[i]; i++; } // check if rulename.rule already exists wxString rulepath = userrules + rulename; rulepath += wxT(".rule"); if (wxFileExists(rulepath)) { wxString question = _("Do you want to replace the existing ") + rulename; question += _(".rule with the version in the clipboard?"); int answer = wxMessageBox(question, _("Replace existing .rule file?"), wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT, wxGetActiveWindow()); if (answer == wxNO) { // don't overwrite existing .rule file return true; } } // create rulename.rule in user-specific rules folder wxFile rulefile(rulepath, wxFile::write); if (!rulefile.IsOpened()) { Warning(_("Could not open .rule file for writing:\n") + rulepath); return true; } if (!rulefile.Write(data.GetText())) { Warning(_("Could not write clipboard data to .rule file!")); rulefile.Close(); return true; } rulefile.Close(); statusptr->DisplayMessage(_("Created ") + rulepath); // now switch to the newly created rule LoadRule(rulename); return true; } // ----------------------------------------------------------------------------- void MainFrame::OpenClipboard() { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(ID_OPEN_CLIP); return; } // if clipboard text starts with "@RULE rulename" then install rulename.rule // and switch to that rule if (ClipboardContainsRule()) return; // load and view pattern data stored in clipboard wxTextDataObject data; if (GetTextFromClipboard(&data)) { // copy clipboard data to tempstart so we can handle all formats // supported by readpattern wxFile outfile(currlayer->tempstart, wxFile::write); if ( outfile.IsOpened() ) { outfile.Write( data.GetText() ); outfile.Close(); LoadPattern(currlayer->tempstart, _("clipboard")); // do NOT delete tempstart -- it can be reloaded by ResetPattern // or used by ShowPatternInfo } else { statusptr->ErrorMessage(_("Could not create tempstart file!")); } } } // ----------------------------------------------------------------------------- wxString MainFrame::GetScriptFileName(const wxString& text) { // examine given text to see if it contains Perl or Python code; // if "use" or "my" occurs at start of line then we assume Perl, // if "import" or "from" occurs at start of line then we assume Python, // otherwise we compare counts for dollars + semicolons vs colons int dollars = 0; int semicolons = 0; int colons = 0; int linelen = 0; // need to be careful converting Unicode wxString to char* wxCharBuffer buff = text.mb_str(wxConvLocal); const char* p = (const char*) buff; while (*p) { switch (*p) { case '#': // probably a comment, so ignore rest of line while (*p && *p != 13 && *p != 10) p++; linelen = 0; if (*p) p++; break; case 34: // double quote -- ignore until quote closes, even multiple lines p++; while (*p && *p != 34) p++; linelen = 0; if (*p) p++; break; case 39: // single quote -- ignore until quote closes p++; while (*p && *p != 39 && *p != 13 && *p != 10) p++; linelen = 0; if (*p) p++; break; case '$': dollars++; linelen++; p++; break; case ':': colons++; linelen++; p++; break; case ';': semicolons++; linelen++; p++; break; case 13: case 10: // if colon/semicolon is at eol then count it twice if (linelen > 0 && p[-1] == ':') colons++; if (linelen > 0 && p[-1] == ';') semicolons++; linelen = 0; p++; break; case ' ': // look for language-specific keyword at start of line if (linelen == 2 && strncmp(p-2,"my",2) == 0) return perlfile; if (linelen == 3 && strncmp(p-3,"use",3) == 0) return perlfile; if (linelen == 4 && strncmp(p-4,"from",4) == 0) return pythonfile; if (linelen == 6 && strncmp(p-6,"import",6) == 0) return pythonfile; // don't break default: if (linelen == 0 && (*p == ' ' || *p == 9)) { // ignore spaces/tabs at start of line } else { linelen++; } p++; } } /* check totals: char msg[128]; sprintf(msg, "dollars=%d semicolons=%d colons=%d", dollars, semicolons, colons); Note(wxString(msg,wxConvLocal)); */ if (dollars + semicolons > colons) return perlfile; else return pythonfile; } // ----------------------------------------------------------------------------- void MainFrame::RunClipboard() { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(ID_RUN_CLIP); return; } // run script stored in clipboard wxTextDataObject data; if (GetTextFromClipboard(&data)) { // scriptfile extension depends on whether the clipboard data // contains Perl or Python code wxString scriptfile = GetScriptFileName( data.GetText() ); // copy clipboard data to scriptfile wxFile outfile(scriptfile, wxFile::write); if (outfile.IsOpened()) { #ifdef __WXMAC__ if (scriptfile == perlfile) { // Perl script, so replace CRs with LFs wxString str = data.GetText(); str.Replace(wxT("\015"), wxT("\012")); outfile.Write( str ); } else { outfile.Write( data.GetText() ); } #else outfile.Write( data.GetText() ); #endif outfile.Close(); RunScript(scriptfile); } else { statusptr->ErrorMessage(_("Could not create script file!")); } } } #if wxCHECK_VERSION(2,9,0) // restore new wxMenuItem method names in wx 2.9 #define GetText GetItemLabel #define SetText SetItemLabel #endif // ----------------------------------------------------------------------------- void MainFrame::OpenRecentPattern(int id) { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(id); return; } wxMenuItem* item = patternSubMenu->FindItem(id); if (item) { wxString path = item->GetText(); #ifdef __WXGTK__ // remove duplicate underscores path.Replace(wxT("__"), wxT("_")); #endif // remove duplicate ampersands path.Replace(wxT("&&"), wxT("&")); // if path isn't absolute then prepend Golly directory wxFileName fname(path); if (!fname.IsAbsolute()) path = gollydir + path; // path might be a zip file so call OpenFile rather than LoadPattern OpenFile(path); } } // ----------------------------------------------------------------------------- void MainFrame::OpenRecentScript(int id) { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(id); return; } wxMenuItem* item = scriptSubMenu->FindItem(id); if (item) { wxString path = item->GetText(); #ifdef __WXGTK__ // remove duplicate underscores path.Replace(wxT("__"), wxT("_")); #endif // remove duplicate ampersands path.Replace(wxT("&&"), wxT("&")); // if path isn't absolute then prepend Golly directory wxFileName fname(path); if (!fname.IsAbsolute()) path = gollydir + path; AddRecentScript(path); RunScript(path); } } // ----------------------------------------------------------------------------- void MainFrame::ClearMissingPatterns() { int pos = 0; while (pos < numpatterns) { wxMenuItem* item = patternSubMenu->FindItemByPosition(pos); wxString path = item->GetText(); #ifdef __WXGTK__ // remove duplicate underscores path.Replace(wxT("__"), wxT("_")); #endif // remove duplicate ampersands path.Replace(wxT("&&"), wxT("&")); // if path isn't absolute then prepend Golly directory wxFileName fname(path); if (!fname.IsAbsolute()) path = gollydir + path; if (wxFileExists(path)) { // keep this item pos++; } else { // remove this item by shifting up later items int nextpos = pos + 1; while (nextpos < numpatterns) { wxMenuItem* nextitem = patternSubMenu->FindItemByPosition(nextpos); #ifdef __WXGTK__ // avoid wxGTK bug if item contains underscore wxString temp = nextitem->GetText(); temp.Replace(wxT("__"), wxT("_")); temp.Replace(wxT("&"), wxT("&&")); item->SetText( temp ); #else item->SetText( nextitem->GetText() ); #endif item = nextitem; nextpos++; } // delete last item patternSubMenu->Delete(item); numpatterns--; } } wxMenuBar* mbar = GetMenuBar(); if (mbar) mbar->Enable(ID_OPEN_RECENT, numpatterns > 0); } // ----------------------------------------------------------------------------- void MainFrame::ClearMissingScripts() { int pos = 0; while (pos < numscripts) { wxMenuItem* item = scriptSubMenu->FindItemByPosition(pos); wxString path = item->GetText(); #ifdef __WXGTK__ // remove duplicate underscores path.Replace(wxT("__"), wxT("_")); #endif // remove duplicate ampersands path.Replace(wxT("&&"), wxT("&")); // if path isn't absolute then prepend Golly directory wxFileName fname(path); if (!fname.IsAbsolute()) path = gollydir + path; if (wxFileExists(path)) { // keep this item pos++; } else { // remove this item by shifting up later items int nextpos = pos + 1; while (nextpos < numscripts) { wxMenuItem* nextitem = scriptSubMenu->FindItemByPosition(nextpos); #ifdef __WXGTK__ // avoid wxGTK bug if item contains underscore wxString temp = nextitem->GetText(); temp.Replace(wxT("__"), wxT("_")); temp.Replace(wxT("&"), wxT("&&")); item->SetText( temp ); #else item->SetText( nextitem->GetText() ); #endif item = nextitem; nextpos++; } // delete last item scriptSubMenu->Delete(item); numscripts--; } } wxMenuBar* mbar = GetMenuBar(); if (mbar) mbar->Enable(ID_RUN_RECENT, numscripts > 0); } // ----------------------------------------------------------------------------- void MainFrame::ClearAllPatterns() { while (numpatterns > 0) { patternSubMenu->Delete( patternSubMenu->FindItemByPosition(0) ); numpatterns--; } wxMenuBar* mbar = GetMenuBar(); if (mbar) mbar->Enable(ID_OPEN_RECENT, false); } // ----------------------------------------------------------------------------- void MainFrame::ClearAllScripts() { while (numscripts > 0) { scriptSubMenu->Delete( scriptSubMenu->FindItemByPosition(0) ); numscripts--; } wxMenuBar* mbar = GetMenuBar(); if (mbar) mbar->Enable(ID_RUN_RECENT, false); } // ----------------------------------------------------------------------------- const char* MainFrame::WritePattern(const wxString& path, pattern_format format, output_compression compression, int top, int left, int bottom, int right) { // if the format is RLE_format and the grid is bounded then force XRLE_format so that // position info is recorded (this position will be used when the file is read) if (format == RLE_format && (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0)) format = XRLE_format; const char* err = writepattern(FILEPATH, *currlayer->algo, format, compression, top, left, bottom, right); #ifdef __WXMAC__ if (!err) { // set the file's creator and type wxFileName filename(path); wxUint32 creator = 'GoLy'; wxUint32 type = 'GoLR'; // RLE or XRLE if (format == MC_format) { type = 'GoLM'; } #if defined(__WXOSX_COCOA__) // there is no Cocoa call to set file type and creator creator = 'GoLy'; // avoid compiler warning #else filename.MacSetTypeAndCreator(type, creator); #endif } #endif return err; } // ----------------------------------------------------------------------------- bool MainFrame::SavePattern() { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(wxID_SAVE); return false; } wxString filetypes; int MCindex, RLEindex; // initially all formats are not allowed (use any -ve number) MCindex = RLEindex = -1; // adding "*.gz" to the file types avoids a duplication bug in the wxOSX app wxString MCfiles, RLEfiles; MCfiles = _("Macrocell (*.mc)|*.mc"); MCfiles += _("|Compressed Macrocell (*.mc.gz)|*.mc.gz;*.gz"); if (savexrle) { RLEfiles = _("Extended RLE (*.rle)|*.rle"); RLEfiles += _("|Compressed Extended RLE (*.rle.gz)|*.rle.gz;*.gz"); } else { RLEfiles = _("RLE (*.rle)|*.rle"); RLEfiles += _("|Compressed RLE (*.rle.gz)|*.rle.gz;*.gz"); } bigint top, left, bottom, right; int itop, ileft, ibottom, iright; currlayer->algo->findedges(&top, &left, &bottom, &right); if (currlayer->algo->hyperCapable()) { // algorithm uses hashlife if ( viewptr->OutsideLimits(top, left, bottom, right) ) { // too big so only allow saving as MC file itop = ileft = ibottom = iright = 0; filetypes = MCfiles; MCindex = 0; } else { // allow saving as MC or RLE file itop = top.toint(); ileft = left.toint(); ibottom = bottom.toint(); iright = right.toint(); filetypes = MCfiles; filetypes += _("|"); filetypes += RLEfiles; MCindex = 0; RLEindex = 1; } } else { // allow saving file only if pattern is small enough if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Pattern is outside +/- 10^9 boundary.")); return false; } itop = top.toint(); ileft = left.toint(); ibottom = bottom.toint(); iright = right.toint(); filetypes = RLEfiles; RLEindex = 0; } wxFileDialog savedlg( this, _("Save pattern"), opensavedir, currlayer->currname, filetypes, wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); #ifdef __WXGTK__ // opensavedir is ignored above (bug in wxGTK 2.8.0???) savedlg.SetDirectory(opensavedir); #endif if ( savedlg.ShowModal() == wxID_OK ) { wxFileName fullpath( savedlg.GetPath() ); opensavedir = fullpath.GetPath(); wxString ext = fullpath.GetExt(); pattern_format format; output_compression compression = no_compression; // detect if user supplied a compression suffix (.gz) if ( ext.IsSameAs(wxT("gz"),false) ) { compression = gzip_compression; ext = wxFileName(fullpath.GetName()).GetExt(); } // if user supplied a known extension then use that format if it is // allowed, otherwise use current format specified in filter menu if ( ext.IsSameAs(wxT("rle"),false) && RLEindex >= 0 ) { format = savexrle ? XRLE_format : RLE_format; } else if ( ext.IsSameAs(wxT("mc"),false) && MCindex >= 0 ) { format = MC_format; } else if ( savedlg.GetFilterIndex()/2 == MCindex ) { format = MC_format; if (savedlg.GetFilterIndex()%2) compression = gzip_compression; } else if ( savedlg.GetFilterIndex()/2 == RLEindex ) { format = savexrle ? XRLE_format : RLE_format; if (savedlg.GetFilterIndex()%2) compression = gzip_compression; } else { statusptr->ErrorMessage(_("Bug in SavePattern!")); return false; } const char* err = WritePattern(savedlg.GetPath(), format, compression, itop, ileft, ibottom, iright); if (err) { statusptr->ErrorMessage(wxString(err,wxConvLocal)); } else { statusptr->DisplayMessage(_("Pattern saved in file: ") + savedlg.GetPath()); AddRecentPattern(savedlg.GetPath()); SaveSucceeded(savedlg.GetPath()); return true; } } return false; } // ----------------------------------------------------------------------------- // called by script command to save current pattern to given file const char* MainFrame::SaveFile(const wxString& path, const wxString& fileformat, bool remember) { bigint top, left, bottom, right; int itop, ileft, ibottom, iright; currlayer->algo->findedges(&top, &left, &bottom, &right); wxString format = fileformat.Lower(); output_compression compression = no_compression; if (format.EndsWith(wxT(".gz"))) { compression = gzip_compression; } // check that given file format is valid pattern_format pattfmt; if (format.StartsWith(wxT("rle"))) { if ( viewptr->OutsideLimits(top, left, bottom, right) ) { return "Pattern is too big to save as RLE."; } pattfmt = savexrle ? XRLE_format : RLE_format; itop = top.toint(); ileft = left.toint(); ibottom = bottom.toint(); iright = right.toint(); } else if (format.StartsWith(wxT("mc"))) { if (!currlayer->algo->hyperCapable()) { return "Macrocell format is not supported by the current algorithm."; } pattfmt = MC_format; // writepattern will ignore itop, ileft, ibottom, iright itop = ileft = ibottom = iright = 0; } else { return "Unknown pattern format."; } const char* err = WritePattern(path, pattfmt, compression, itop, ileft, ibottom, iright); if (!err) { if (remember) AddRecentPattern(path); SaveSucceeded(path); } return err; } // ----------------------------------------------------------------------------- void MainFrame::SaveSucceeded(const wxString& path) { // save old info for RememberNameChange wxString oldname = currlayer->currname; wxString oldfile = currlayer->currfile; bool oldsave = currlayer->savestart; bool olddirty = currlayer->dirty; if (allowundo && !currlayer->stayclean && inscript) { SavePendingChanges(); } if ( currlayer->algo->getGeneration() == currlayer->startgen ) { // no need to save starting pattern (ResetPattern can load currfile) currlayer->currfile = path; currlayer->savestart = false; } // set dirty flag false and update currlayer->currname MarkLayerClean(GetBaseName(path)); if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberNameChange(oldname, oldfile, oldsave, olddirty); } } // ----------------------------------------------------------------------------- void MainFrame::ToggleShowPatterns() { if (splitwin->IsSplit()) dirwinwd = splitwin->GetSashPosition(); #ifndef __WXMAC__ // hide scroll bars bigview->SetScrollbar(wxHORIZONTAL, 0, 0, 0, true); bigview->SetScrollbar(wxVERTICAL, 0, 0, 0, true); #endif showpatterns = !showpatterns; if (showpatterns && showscripts) { showscripts = false; splitwin->Unsplit(scriptctrl); splitwin->SplitVertically(patternctrl, RightPane(), dirwinwd); } else { if (splitwin->IsSplit()) { // hide left pane splitwin->Unsplit(patternctrl); } else { splitwin->SplitVertically(patternctrl, RightPane(), dirwinwd); } viewptr->SetFocus(); } #ifndef __WXMAC__ // restore scroll bars bigview->UpdateScrollBars(); #endif } // ----------------------------------------------------------------------------- void MainFrame::ToggleShowScripts() { if (splitwin->IsSplit()) dirwinwd = splitwin->GetSashPosition(); #ifndef __WXMAC__ // hide scroll bars bigview->SetScrollbar(wxHORIZONTAL, 0, 0, 0, true); bigview->SetScrollbar(wxVERTICAL, 0, 0, 0, true); #endif showscripts = !showscripts; if (showscripts && showpatterns) { showpatterns = false; splitwin->Unsplit(patternctrl); splitwin->SplitVertically(scriptctrl, RightPane(), dirwinwd); } else { if (splitwin->IsSplit()) { // hide left pane splitwin->Unsplit(scriptctrl); } else { splitwin->SplitVertically(scriptctrl, RightPane(), dirwinwd); } viewptr->SetFocus(); } #ifndef __WXMAC__ // restore scroll bars bigview->UpdateScrollBars(); #endif } // ----------------------------------------------------------------------------- void MainFrame::ChangePatternDir() { wxDirDialog dirdlg(this, _("Choose a new pattern folder"), patterndir, wxDD_NEW_DIR_BUTTON); if (dirdlg.ShowModal() == wxID_OK) SetPatternDir(dirdlg.GetPath()); } // ----------------------------------------------------------------------------- void MainFrame::ChangeScriptDir() { wxDirDialog dirdlg(this, _("Choose a new script folder"), scriptdir, wxDD_NEW_DIR_BUTTON); if (dirdlg.ShowModal() == wxID_OK) SetScriptDir(dirdlg.GetPath()); } // ----------------------------------------------------------------------------- void MainFrame::SetPatternDir(const wxString& newdir) { if (patterndir != newdir) { patterndir = newdir; if (showpatterns) { // show new pattern directory SimplifyTree(patterndir, patternctrl->GetTreeCtrl(), patternctrl->GetRootId()); } } } // ----------------------------------------------------------------------------- void MainFrame::SetScriptDir(const wxString& newdir) { if (scriptdir != newdir) { scriptdir = newdir; if (showscripts) { // show new script directory SimplifyTree(scriptdir, scriptctrl->GetTreeCtrl(), scriptctrl->GetRootId()); } } } // ----------------------------------------------------------------------------- void MainFrame::SetStepExponent(int newexpo) { currlayer->currexpo = newexpo; if (currlayer->currexpo < minexpo) currlayer->currexpo = minexpo; SetGenIncrement(); } // ----------------------------------------------------------------------------- void MainFrame::SetMinimumStepExponent() { // set minexpo depending on mindelay and maxdelay minexpo = 0; if (mindelay > 0) { int d = mindelay; minexpo--; while (d < maxdelay) { d *= 2; minexpo--; } } } // ----------------------------------------------------------------------------- void MainFrame::UpdateStepExponent() { SetMinimumStepExponent(); if (currlayer->currexpo < minexpo) currlayer->currexpo = minexpo; SetGenIncrement(); } // ----------------------------------------------------------------------------- void MainFrame::ShowPrefsDialog(const wxString& page) { if (viewptr->waitingforclick) return; if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(wxID_PREFERENCES); return; } if (inscript) { // safe to allow prefs dialog while script is running??? // if so, maybe we need some sort of warning like this: // Warning(_("The currently running script might clobber any changes you make.")); } int oldtileborder = tileborder; int oldcontrolspos = controlspos; if (ChangePrefs(page)) { // user hit OK button // selection color may have changed SetSelectionColor(); // if maxpatterns was reduced then we may need to remove some paths while (numpatterns > maxpatterns) { numpatterns--; patternSubMenu->Delete( patternSubMenu->FindItemByPosition(numpatterns) ); } // if maxscripts was reduced then we may need to remove some paths while (numscripts > maxscripts) { numscripts--; scriptSubMenu->Delete( scriptSubMenu->FindItemByPosition(numscripts) ); } // randomfill might have changed SetRandomFillPercentage(); // if mindelay/maxdelay changed then may need to change minexpo and currexpo UpdateStepExponent(); // maximum memory might have changed for (int i = 0; i < numlayers; i++) { Layer* layer = GetLayer(i); AlgoData* ad = algoinfo[layer->algtype]; if (ad->algomem >= 0) layer->algo->setMaxMemory(ad->algomem); } // tileborder might have changed if (tilelayers && numlayers > 1 && tileborder != oldtileborder) { int wd, ht; bigview->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; ResizeLayers(wd, ht); } // position of translucent controls might have changed if (controlspos != oldcontrolspos) { int wd, ht; if (tilelayers && numlayers > 1) { for (int i = 0; i < numlayers; i++) { Layer* layer = GetLayer(i); layer->tilewin->GetClientSize(&wd, &ht); layer->tilewin->SetViewSize(wd, ht); } } bigview->GetClientSize(&wd, &ht); bigview->SetViewSize(wd, ht); } SavePrefs(); } // safer to update everything even if user hit Cancel UpdateEverything(); } golly-2.5-src/gui-wx/wxgolly.cpp0000755000175100001440000003045112156145314013652 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ // A GUI for Golly, implemented in wxWidgets (www.wxwidgets.org). // Unfinished code is flagged by "!!!". // Uncertain code is flagged by "???". #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/image.h" // for wxImage #include "wx/stdpaths.h" // for wxStandardPaths #include "wx/sysopt.h" // for wxSystemOptions #include "wx/filename.h" // for wxFileName #include "wx/fs_inet.h" // for wxInternetFSHandler #include "wx/fs_zip.h" // for wxZipFSHandler #include "lifepoll.h" #include "util.h" // for lifeerrors #include "wxgolly.h" // defines GollyApp class #include "wxmain.h" // defines MainFrame class #include "wxstatus.h" // defines StatusBar class #include "wxview.h" // defines PatternView class #include "wxutils.h" // for Warning, Fatal, BeginProgress, etc #include "wxprefs.h" // for GetPrefs, gollydir, rulesdir, userrules #ifdef __WXMSW__ // app icons are loaded via .rc file #else #include "icons/appicon.xpm" #endif // ----------------------------------------------------------------------------- // Create a new application object: this macro will allow wxWidgets to create // the application object during program execution and also implements the // accessor function wxGetApp() which will return the reference of the correct // type (ie. GollyApp and not wxApp). IMPLEMENT_APP(GollyApp) // ----------------------------------------------------------------------------- #define STRINGIFY(arg) STR2(arg) #define STR2(arg) #arg MainFrame* mainptr = NULL; // main window PatternView* viewptr = NULL; // current viewport window (possibly a tile) PatternView* bigview = NULL; // main viewport window StatusBar* statusptr = NULL; // status bar window wxStopWatch* stopwatch; // global stopwatch bool insideYield = false; // processing an event via Yield()? // ----------------------------------------------------------------------------- // let non-wx modules call Fatal, Warning, BeginProgress, etc class wx_errors : public lifeerrors { public: virtual void fatal(const char* s) { Fatal(wxString(s,wxConvLocal)); } virtual void warning(const char* s) { Warning(wxString(s,wxConvLocal)); } virtual void status(const char* s) { statusptr->DisplayMessage(wxString(s,wxConvLocal)); } virtual void beginprogress(const char* s) { BeginProgress(wxString(s,wxConvLocal)); // init flag for isaborted() calls in non-wx modules aborted = false; } virtual bool abortprogress(double f, const char* s) { return AbortProgress(f, wxString(s,wxConvLocal)); } virtual void endprogress() { EndProgress(); } virtual const char* getuserrules() { // need to be careful converting Unicode wxString to char* dirbuff = userrules.mb_str(wxConvLocal); return (const char*) dirbuff; } virtual const char* getrulesdir() { // need to be careful converting Unicode wxString to char* dirbuff = rulesdir.mb_str(wxConvLocal); return (const char*) dirbuff; } private: wxCharBuffer dirbuff; }; wx_errors wxerrhandler; // create instance // ----------------------------------------------------------------------------- // let non-wx modules process events class wx_poll : public lifepoll { public: virtual int checkevents(); virtual void updatePop(); long nextcheck; }; void CallYield() { if (mainptr->IsActive()) { // make sure viewport window keeps keyboard focus viewptr->SetFocus(); } insideYield = true; wxGetApp().Yield(true); insideYield = false; } int wx_poll::checkevents() { #ifdef __WXMSW__ // on Windows it seems that Time has a higher overhead than Yield CallYield(); #else // on Mac/Linux it is faster to avoid calling Yield too often long t = stopwatch->Time(); if (t > nextcheck) { nextcheck = t + 100; // call 10 times per sec CallYield(); } #endif return isInterrupted(); } void wx_poll::updatePop() { if (showstatus) { statusptr->Refresh(false); } } wx_poll wxpoller; // create instance lifepoll* GollyApp::Poller() { return &wxpoller; } void GollyApp::PollerReset() { wxpoller.resetInterrupted(); wxpoller.nextcheck = 0; } void GollyApp::PollerInterrupt() { wxpoller.setInterrupted(); wxpoller.nextcheck = 0; } // ----------------------------------------------------------------------------- void SetAppDirectory(const char* argv0) { #ifdef __WXMSW__ // on Windows we need to reset current directory to app directory if user // dropped file from somewhere else onto app to start it up (otherwise we // can't find Help files) wxString appdir = wxStandardPaths::Get().GetDataDir(); wxString currdir = wxGetCwd(); if ( currdir.CmpNoCase(appdir) != 0 ) wxSetWorkingDirectory(appdir); // avoid VC++ warning wxUnusedVar(argv0); #elif defined(__WXMAC__) // wxMac has set current directory to location of .app bundle so no need // to do anything #else // assume Unix // first, try to switch to GOLLYDIR if that is set to a sensible value: static const char *gd = STRINGIFY(GOLLYDIR); if ( *gd == '/' && wxSetWorkingDirectory(wxString(gd,wxConvLocal)) ) { return; } // otherwise, use the executable directory as the application directory. // user might have started app from a different directory so find // last "/" in argv0 and change cwd if "/" isn't part of "./" prefix unsigned int pos = strlen(argv0); while (pos > 0) { pos--; if (argv0[pos] == '/') break; } if ( pos > 0 && !(pos == 1 && argv0[0] == '.') ) { char appdir[2048]; if (pos < sizeof(appdir)) { strncpy(appdir, argv0, pos); appdir[pos] = 0; wxSetWorkingDirectory(wxString(appdir,wxConvLocal)); } } #endif } // ----------------------------------------------------------------------------- void GollyApp::SetFrameIcon(wxFrame* frame) { // set frame icon #ifdef __WXMSW__ // create a bundle with 32x32 and 16x16 icons wxIconBundle icb(wxICON(appicon0)); icb.AddIcon(wxICON(appicon1)); frame->SetIcons(icb); #else // use appicon.xpm on other platforms (ignored on Mac) frame->SetIcon(wxICON(appicon)); #endif } // ----------------------------------------------------------------------------- #ifdef __WXMAC__ // open file double-clicked or dropped onto Golly icon void GollyApp::MacOpenFile(const wxString& fullPath) { mainptr->Raise(); mainptr->OpenFile(fullPath); } #endif // ----------------------------------------------------------------------------- // app execution starts here bool GollyApp::OnInit() { SetAppName(_("Golly")); // for use in Warning/Fatal dialogs // create a stopwatch so we can use Time() to get elapsed millisecs stopwatch = new wxStopWatch(); // set variable seed for later rand() calls srand(time(0)); #if defined(__WXMAC__) && !wxCHECK_VERSION(2,7,2) // prevent rectangle animation when windows open/close wxSystemOptions::SetOption(wxMAC_WINDOW_PLAIN_TRANSITION, 1); // prevent position problem in wxTextCtrl with wxTE_DONTWRAP style // (but doesn't fix problem with I-beam cursor over scroll bars) wxSystemOptions::SetOption(wxMAC_TEXTCONTROL_USE_MLTE, 1); #endif // get current working directory before calling SetAppDirectory wxString initdir = wxFileName::GetCwd(); if (initdir.Last() != wxFILE_SEP_PATH) initdir += wxFILE_SEP_PATH; // make sure current working directory contains application otherwise // we can't open Help files SetAppDirectory( wxString(argv[0]).mb_str(wxConvLocal) ); // now set global gollydir for use in GetPrefs and elsewhere gollydir = wxFileName::GetCwd(); if (gollydir.Last() != wxFILE_SEP_PATH) gollydir += wxFILE_SEP_PATH; // let non-wx modules call Fatal, Warning, BeginProgress, etc lifeerrors::seterrorhandler(&wxerrhandler); // allow .html files to include common graphic formats, // and .icons files to be in any of these formats; // note that wxBMPHandler is always installed, so it needs not be added, // and we can assume that if HAVE_WX_BMP_HANDLER is not defined, then // the handlers have not been auto-detected (and we just install them all). #if !defined(HAVE_WX_BMP_HANDLER) || defined(HAVE_WX_GIF_HANDLER) wxImage::AddHandler(new wxGIFHandler); #endif #if !defined(HAVE_WX_BMP_HANDLER) || defined(HAVE_WX_PNG_HANDLER) wxImage::AddHandler(new wxPNGHandler); #endif #if !defined(HAVE_WX_BMP_HANDLER) || defined(HAVE_WX_TIFF_HANDLER) wxImage::AddHandler(new wxTIFFHandler); #endif // wxInternetFSHandler is needed to allow downloading files wxFileSystem::AddHandler(new wxInternetFSHandler); wxFileSystem::AddHandler(new wxZipFSHandler); // get main window location and other user preferences GetPrefs(); // create main window (also initializes viewptr, bigview, statusptr) mainptr = new MainFrame(); if (mainptr == NULL) Fatal(_("Failed to create main window!")); // initialize some stuff before showing main window mainptr->SetRandomFillPercentage(); mainptr->SetMinimumStepExponent(); wxString banner = _("This is Golly version "); banner += _(STRINGIFY(VERSION)); banner += _(". Copyright 2013 The Golly Gang."); statusptr->SetMessage(banner); mainptr->NewPattern(); // script/pattern files are stored in the pendingfiles array for later processing // in OnIdle; this avoids a crash in Win app if a script is run before showing // the main window, and also avoids event problems in Win app with a long-running // script (eg. user can't hit escape to abort script) const wxString START_PERL = wxT("golly-start.pl"); const wxString START_PYTHON = wxT("golly-start.py"); wxString startscript = gollydir + START_PERL; if (wxFileExists(startscript)) { mainptr->pendingfiles.Add(startscript); } else { // look in user-specific data directory startscript = datadir + START_PERL; if (wxFileExists(startscript)) { mainptr->pendingfiles.Add(startscript); } } startscript = gollydir + START_PYTHON; if (wxFileExists(startscript)) { mainptr->pendingfiles.Add(startscript); } else { // look in user-specific data directory startscript = datadir + START_PYTHON; if (wxFileExists(startscript)) { mainptr->pendingfiles.Add(startscript); } } // argc is > 1 if command line has one or more script/pattern files for (int n = 1; n < argc; n++) { wxFileName filename(argv[n]); // convert given path to a full path if not one already; this allows users // to do things like "../golly bricklayer.py" from within Scripts folder if (!filename.IsAbsolute()) filename = initdir + argv[n]; mainptr->pendingfiles.Add(filename.GetFullPath()); } // show main window if (maximize) mainptr->Maximize(true); mainptr->Show(true); SetTopWindow(mainptr); // true means call wxApp::OnRun() which will enter the main event loop; // false means exit immediately return true; } golly-2.5-src/gui-wx/wxhelp.cpp0000644000175100001440000012614212156145314013454 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/wxhtml.h" // for wxHtmlWindow #include "wx/file.h" // for wxFile #include "wx/protocol/http.h" // for wxHTTP #include "wx/wfstream.h" // for wxFileOutputStream, wxFileInputStream #include "wx/zipstrm.h" // for wxZipInputStream #include "lifealgo.h" // for lifealgo class #include "wxgolly.h" // for wxGetApp, mainptr, viewptr #include "wxmain.h" // for mainptr->... #include "wxview.h" // for viewptr->... #include "wxutils.h" // for Warning, BeginProgress, etc #include "wxprefs.h" // for GetShortcutTable, helpfontsize, gollydir, etc #include "wxscript.h" // for inscript #include "wxlayer.h" // for numlayers, GetLayer, etc #include "wxalgos.h" // for QLIFE_ALGO #include "wxhelp.h" // ----------------------------------------------------------------------------- // define a modeless help window: class HelpFrame : public wxFrame { public: HelpFrame(); void SetStatus(const wxString& text) { status->SetLabel(text); } bool infront; // help window is active? private: // ids for buttons in help window (see also wxID_CLOSE) enum { ID_BACK_BUTT = wxID_HIGHEST + 1, ID_FORWARD_BUTT, ID_CONTENTS_BUTT }; // event handlers void OnActivate(wxActivateEvent& event); void OnBackButton(wxCommandEvent& event); void OnForwardButton(wxCommandEvent& event); void OnContentsButton(wxCommandEvent& event); void OnCloseButton(wxCommandEvent& event); void OnClose(wxCloseEvent& event); wxStaticText* status; // status line at bottom of help window // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(HelpFrame, wxFrame) EVT_ACTIVATE ( HelpFrame::OnActivate) EVT_BUTTON (ID_BACK_BUTT, HelpFrame::OnBackButton) EVT_BUTTON (ID_FORWARD_BUTT, HelpFrame::OnForwardButton) EVT_BUTTON (ID_CONTENTS_BUTT, HelpFrame::OnContentsButton) EVT_BUTTON (wxID_CLOSE, HelpFrame::OnCloseButton) EVT_CLOSE ( HelpFrame::OnClose) END_EVENT_TABLE() // ----------------------------------------------------------------------------- // define a child window for displaying html info: class HtmlView : public wxHtmlWindow { public: HtmlView(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : wxHtmlWindow(parent, id, pos, size, style) { editlink = false; linkrect = wxRect(0,0,0,0); } virtual void OnLinkClicked(const wxHtmlLinkInfo& link); virtual void OnCellMouseHover(wxHtmlCell* cell, wxCoord x, wxCoord y); void ClearStatus(); // clear help window's status line void SetFontSizes(int size); void ChangeFontSizes(int size); void CheckAndLoad(const wxString& filepath); void StartTimer() { htmltimer = new wxTimer(this, wxID_ANY); // call OnTimer 10 times per sec htmltimer->Start(100, wxTIMER_CONTINUOUS); } void StopTimer() { htmltimer->Stop(); delete htmltimer; } bool editlink; // open clicked file in editor? bool canreload; // can OnSize call CheckAndLoad? private: #ifdef __WXMSW__ // see HtmlView::OnKeyUp for why we do this void OnKeyUp(wxKeyEvent& event); #else void OnKeyDown(wxKeyEvent& event); #endif void OnChar(wxKeyEvent& event); void OnSize(wxSizeEvent& event); void OnMouseMotion(wxMouseEvent& event); void OnMouseLeave(wxMouseEvent& event); void OnMouseDown(wxMouseEvent& event); void OnTimer(wxTimerEvent& event); wxTimer* htmltimer; wxRect linkrect; // rect for cell containing link // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(HtmlView, wxHtmlWindow) #ifdef __WXMSW__ // see HtmlView::OnKeyUp for why we do this EVT_KEY_UP (HtmlView::OnKeyUp) #else EVT_KEY_DOWN (HtmlView::OnKeyDown) #endif EVT_CHAR (HtmlView::OnChar) EVT_SIZE (HtmlView::OnSize) EVT_MOTION (HtmlView::OnMouseMotion) EVT_ENTER_WINDOW (HtmlView::OnMouseMotion) EVT_LEAVE_WINDOW (HtmlView::OnMouseLeave) EVT_LEFT_DOWN (HtmlView::OnMouseDown) EVT_RIGHT_DOWN (HtmlView::OnMouseDown) EVT_TIMER (wxID_ANY, HtmlView::OnTimer) END_EVENT_TABLE() // ----------------------------------------------------------------------------- HelpFrame* helpptr = NULL; // help window HtmlView* htmlwin = NULL; // html child window wxButton* backbutt; // back button wxButton* forwbutt; // forwards button wxButton* contbutt; // Contents button long whenactive; // when help window became active (elapsed millisecs) const wxString helphome = _("Help/index.html"); // contents page wxString currhelp = helphome; // current help file const wxString lexicon_name = _("lexicon"); // name of lexicon layer int lexlayer; // index of existing lexicon layer (-ve if not present) wxString lexpattern; // lexicon pattern data // prefix of most recent full URL in a html get ("get:http://.../foo.html") // to allow later relative gets ("get:foo.rle") wxString urlprefix = wxEmptyString; const wxString HTML_PREFIX = _("GET---"); // prepended to html filename // ----------------------------------------------------------------------------- wxFrame* GetHelpFrame() { return helpptr; } // ----------------------------------------------------------------------------- // create the help window HelpFrame::HelpFrame() : wxFrame(NULL, wxID_ANY, _(""), wxPoint(helpx,helpy), wxSize(helpwd,helpht)) { wxGetApp().SetFrameIcon(this); #ifdef __WXMSW__ // use current theme's background colour SetBackgroundColour(wxNullColour); #endif htmlwin = new HtmlView(this, wxID_ANY, // specify small size to avoid clipping scroll bar on resize wxDefaultPosition, wxSize(30,30), wxHW_DEFAULT_STYLE | wxSUNKEN_BORDER); htmlwin->StartTimer(); htmlwin->SetBorders(4); htmlwin->SetFontSizes(helpfontsize); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL); backbutt = new wxButton(this, ID_BACK_BUTT, _("<"), wxDefaultPosition, wxSize(40,wxDefaultCoord)); hbox->Add(backbutt, 0, wxALL | wxALIGN_LEFT, 10); forwbutt = new wxButton(this, ID_FORWARD_BUTT, _(">"), wxDefaultPosition, wxSize(40,wxDefaultCoord)); hbox->Add(forwbutt, 0, wxTOP | wxBOTTOM | wxALIGN_LEFT, 10); contbutt = new wxButton(this, ID_CONTENTS_BUTT, _("Contents")); hbox->Add(contbutt, 0, wxALL | wxALIGN_LEFT, 10); hbox->AddStretchSpacer(1); wxButton* closebutt = new wxButton(this, wxID_CLOSE, _("Close")); closebutt->SetDefault(); hbox->Add(closebutt, 0, wxALL | wxALIGN_RIGHT, 10); vbox->Add(hbox, 0, wxALL | wxEXPAND | wxALIGN_TOP, 0); vbox->Add(htmlwin, 1, wxLEFT | wxRIGHT | wxEXPAND | wxALIGN_TOP, 10); status = new wxStaticText(this, wxID_STATIC, wxEmptyString); #ifdef __WXMAC__ status->SetWindowVariant(wxWINDOW_VARIANT_SMALL); #endif wxBoxSizer* statbox = new wxBoxSizer(wxHORIZONTAL); statbox->Add(status); vbox->AddSpacer(2); vbox->Add(statbox, 0, wxLEFT | wxALIGN_LEFT, 10); vbox->AddSpacer(4); SetMinSize(wxSize(minhelpwd, minhelpht)); SetSizer(vbox); // expand sizer now to avoid seeing small htmlwin and buttons in top left corner vbox->SetDimension(0, 0, helpwd, helpht); } // ----------------------------------------------------------------------------- void UpdateHelpButtons() { backbutt->Enable( htmlwin->HistoryCanBack() ); forwbutt->Enable( htmlwin->HistoryCanForward() ); // check for title used in Help/index.html contbutt->Enable( htmlwin->GetOpenedPageTitle() != _("Golly Help: Contents") ); wxString location = htmlwin->GetOpenedPage(); if ( !location.IsEmpty() ) { // set currhelp so user can close help window and then open same page currhelp = location; // if filename starts with HTML_PREFIX then set urlprefix to corresponding // url so any later relative "get:foo.rle" links will work wxString filename = location.AfterLast('/'); if (filename.StartsWith(HTML_PREFIX)) { // replace HTML_PREFIX with "http://" and convert spaces to '/' // (ie. reverse what we did in GetURL) urlprefix = filename; urlprefix.Replace(HTML_PREFIX, wxT("http://"), false); // do once urlprefix.Replace(wxT(" "), wxT("/")); urlprefix = urlprefix.BeforeLast('/'); urlprefix += wxT("/"); // must end in slash } } htmlwin->ClearStatus(); htmlwin->SetFocus(); // for keyboard shortcuts } // ----------------------------------------------------------------------------- void ShowHelp(const wxString& filepath) { // display given html file in help window if (helpptr) { // help window exists so bring it to front and display given file if (!filepath.IsEmpty()) { htmlwin->CheckAndLoad(filepath); UpdateHelpButtons(); } helpptr->Raise(); } else { helpptr = new HelpFrame(); if (helpptr == NULL) { Warning(_("Could not create help window!")); return; } // assume our .html files contain a tag htmlwin->SetRelatedFrame(helpptr, _("%s")); if (!filepath.IsEmpty()) { htmlwin->CheckAndLoad(filepath); } else { htmlwin->CheckAndLoad(currhelp); } // prevent HtmlView::OnSize calling CheckAndLoad twice htmlwin->canreload = false; helpptr->Show(true); UpdateHelpButtons(); // must be after Show to avoid hbar appearing on Mac // allow HtmlView::OnSize to call CheckAndLoad if window is resized htmlwin->canreload = true; } whenactive = 0; } // ----------------------------------------------------------------------------- void HelpFrame::OnActivate(wxActivateEvent& event) { // note that helpptr->IsActive() is not always reliable so we set infront flag infront = event.GetActive(); if (infront) { // help window is being activated whenactive = stopwatch->Time(); // ensure correct menu items, esp after help window // is clicked while app is in background mainptr->UpdateMenuItems(false); } event.Skip(); } // ----------------------------------------------------------------------------- void HelpFrame::OnBackButton(wxCommandEvent& WXUNUSED(event)) { if ( htmlwin->HistoryBack() ) { UpdateHelpButtons(); } else { Beep(); } } // ----------------------------------------------------------------------------- void HelpFrame::OnForwardButton(wxCommandEvent& WXUNUSED(event)) { if ( htmlwin->HistoryForward() ) { UpdateHelpButtons(); } else { Beep(); } } // ----------------------------------------------------------------------------- void HelpFrame::OnContentsButton(wxCommandEvent& WXUNUSED(event)) { ShowHelp(helphome); } // ----------------------------------------------------------------------------- void HelpFrame::OnCloseButton(wxCommandEvent& WXUNUSED(event)) { Close(true); } // ----------------------------------------------------------------------------- void HelpFrame::OnClose(wxCloseEvent& WXUNUSED(event)) { #ifdef __WXMSW__ if (!IsIconized()) { #endif // save current location and size for later use in SavePrefs wxRect r = GetRect(); helpx = r.x; helpy = r.y; helpwd = r.width; helpht = r.height; #ifdef __WXMSW__ } #endif // stop htmltimer immediately (if we do it in ~HtmlView dtor then timer // only stops when app becomes idle) htmlwin->StopTimer(); Destroy(); // also deletes all child windows (buttons, etc) helpptr = NULL; } // ----------------------------------------------------------------------------- void LoadRule(const wxString& rulestring) { // load recently installed .rule/table/tree/colors/icons file wxString oldrule = wxString(currlayer->algo->getrule(),wxConvLocal); int oldmaxstate = currlayer->algo->NumCellStates() - 1; // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange viewptr->SaveCurrentSelection(); mainptr->Raise(); if (mainptr->generating) { Warning(_("Cannot change rule while generating a pattern.")); // or stop and create pending event??? see ID_LOAD_LEXICON return; } else if (inscript) { Warning(_("Cannot change rule while a script is running.")); return; } const char* err = currlayer->algo->setrule( rulestring.mb_str(wxConvLocal) ); if (err) { // try to find another algorithm that supports the given rule for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { lifealgo* tempalgo = CreateNewUniverse(i); err = tempalgo->setrule( rulestring.mb_str(wxConvLocal) ); delete tempalgo; if (!err) { // change the current algorithm and switch to the new rule mainptr->ChangeAlgorithm(i, rulestring); if (i != currlayer->algtype) { RestoreRule(oldrule); Warning(_("Algorithm could not be changed (pattern is too big to convert).")); return; } else { mainptr->SetWindowTitle(wxEmptyString); mainptr->UpdateEverything(); return; } } } } // should only get here if .rule/table/tree file contains some sort of error RestoreRule(oldrule); Warning(_("Rule is not valid in any algorithm: ") + rulestring); return; } wxString newrule = wxString(currlayer->algo->getrule(),wxConvLocal); if (oldrule != newrule) { // show new rule in main window's title but don't change name mainptr->SetWindowTitle(wxEmptyString); // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { mainptr->ClearOutsideGrid(); } } // new rule might have changed the number of cell states; // if there are fewer states then pattern might change int newmaxstate = currlayer->algo->NumCellStates() - 1; if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { mainptr->ReduceCellStates(newmaxstate); } // update colors and/or icons for the new rule UpdateLayerColors(); // pattern might have changed or colors/icons might have changed mainptr->UpdateEverything(); if (oldrule != newrule) { if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberRuleChange(oldrule); } } } // ----------------------------------------------------------------------------- bool DownloadFile(const wxString& url, const wxString& filepath) { bool result = false; wxHTTP http; http.SetTimeout(5); // secs http.SetHeader(wxT("Accept") , wxT("*/*")); // any file type http.SetHeader(wxT("User-Agent"), wxT("Golly")); // Connect() wants a server address (eg. "www.foo.com"), not a full URL wxString temp = url.AfterFirst('/'); while (temp[0] == '/') temp = temp.Mid(1); size_t slashpos = temp.Find('/'); wxString server = temp.Left(slashpos); if (http.Connect(server, 80)) { // GetInputStream() wants everything after the server address wxString respath = temp.Right(temp.length() - slashpos); wxInputStream* instream = http.GetInputStream(respath); if (instream) { wxFileOutputStream outstream(filepath); if (outstream.Ok()) { // read and write in chunks so we can show a progress dialog const int BUFFER_SIZE = 4000; // seems ok (on Mac at least) char buf[BUFFER_SIZE]; size_t incount = 0; size_t outcount = 0; size_t lastread, lastwrite; double filesize = (double) instream->GetSize(); if (filesize <= 0.0) filesize = -1.0; // show indeterminate progress BeginProgress(_("Downloading file")); while (true) { instream->Read(buf, BUFFER_SIZE); lastread = instream->LastRead(); if (lastread == 0) break; outstream.Write(buf, lastread); lastwrite = outstream.LastWrite(); incount += lastread; outcount += lastwrite; if (incount != outcount) { Warning(_("Error occurred while writing file:\n") + filepath); break; } char msg[128]; sprintf(msg, "File size: %.2f MB", double(incount) / 1048576.0); if (AbortProgress((double)incount / filesize, wxString(msg,wxConvLocal))) { // force false result outcount = 0; break; } } EndProgress(); result = (incount == outcount); if (!result) { // delete incomplete filepath if (wxFileExists(filepath)) wxRemoveFile(filepath); } } else { Warning(_("Could not open output stream for file:\n") + filepath); } delete instream; } else { int err = http.GetError(); if (err == wxPROTO_NOFILE) { Warning(_("Remote file does not exist:\n") + url); } else { // we get wxPROTO_NETERR (generic network error) with some naughty servers // that use LF rather than CRLF to terminate HTTP header messages // eg: http://fano.ics.uci.edu/ca/rules/b0135s014/g1.lif // (wxProtocol::ReadLine needs to be made more tolerant) Warning(wxString::Format(_("Could not download file (error %d):\n"),err) + url); } } } else { Warning(_("Could not connect to server:\n") + server); } http.Close(); return result; } // ----------------------------------------------------------------------------- void GetURL(const wxString& url) { wxString fullurl; if (url.StartsWith(wxT("http:"))) { fullurl = url; } else { // relative get, so prepend prefix set earlier in UpdateHelpButtons fullurl = urlprefix + url; } wxString filename = fullurl.AfterLast('/'); // remove ugly stuff at start of file names downloaded from ConwayLife.com if (filename.StartsWith(wxT("download.php?f=")) || filename.StartsWith(wxT("pattern.asp?p=")) || filename.StartsWith(wxT("script.asp?s="))) { filename = filename.AfterFirst('='); } // create full path for downloaded file based on given url; // first remove initial "http://" wxString filepath = fullurl.AfterFirst('/'); while (filepath[0] == '/') filepath = filepath.Mid(1); if (IsHTMLFile(filename)) { // create special name for html file so UpdateHelpButtons can detect it // and set urlprefix filepath.Replace(wxT("/"), wxT(" ")); // assume url has no spaces filepath = HTML_PREFIX + filepath; } else { // no need for url info in file name filepath = filename; } #ifdef __WXMSW__ // replace chars that can appear in URLs but are not allowed in filenames on Windows filepath.Replace(wxT("*"), wxT("_")); filepath.Replace(wxT("?"), wxT("_")); #endif if (IsRuleFile(filename)) { // create file in user's rules directory (rulesdir might be read-only) filepath = userrules + filename; } else if (IsHTMLFile(filename)) { // nicer to store html files in temporary directory filepath = tempdir + filepath; } else { // all other files are stored in user's download directory filepath = downloaddir + filepath; } // try to download the file if ( !DownloadFile(fullurl, filepath) ) return; if (htmlwin->editlink) { if (IsRuleFile(filename) && filename.Lower().EndsWith(wxT(".icons"))) { // let user see b&w image in .icons file mainptr->Raise(); mainptr->OpenFile(filepath); } else { mainptr->EditFile(filepath); } return; } if (IsHTMLFile(filename)) { // display html file in help window; // search file for any simple img links and also download those files??? // maybe in version 3! htmlwin->LoadPage(filepath); } else if (IsRuleFile(filename)) { // load corresponding rule LoadRule(filename.BeforeLast('.')); } else if (IsTextFile(filename)) { // open text file in user's text editor mainptr->EditFile(filepath); } else if (IsZipFile(filename)) { // open zip file (don't raise main window here) mainptr->OpenFile(filepath); } else if (IsScriptFile(filename)) { // run script depending on safety check; if it is allowed to run // then we remember script in the Run Recent submenu mainptr->CheckBeforeRunning(filepath, true, wxEmptyString); } else { // assume pattern file, so try to load it mainptr->Raise(); mainptr->OpenFile(filepath); } if (helpptr && helpptr->infront) UpdateHelpButtons(); } // ----------------------------------------------------------------------------- void UnzipFile(const wxString& zippath, const wxString& entry) { wxString filename = entry.AfterLast(wxFILE_SEP_PATH); wxString tempfile = tempdir + filename; if ( IsRuleFile(filename) ) { // rule-related file should have already been extracted and installed // into userrules, so check that file exists and load rule wxString rulefile = userrules + filename; if (wxFileExists(rulefile)) { if (htmlwin->editlink) { if (filename.Lower().EndsWith(wxT(".icons"))) { // let user see b&w image in .icons file mainptr->Raise(); mainptr->OpenFile(rulefile); } else { mainptr->EditFile(rulefile); } } else { // load corresponding rule LoadRule(filename.BeforeLast('.')); } } else { Warning(_("Rule-related file was not installed:\n") + rulefile); } } else if ( mainptr->ExtractZipEntry(zippath, entry, tempfile) ) { if (htmlwin->editlink) { mainptr->EditFile(tempfile); } else if ( IsHTMLFile(filename) ) { // display html file htmlwin->LoadPage(tempfile); if (helpptr && helpptr->infront) UpdateHelpButtons(); } else if ( IsTextFile(filename) ) { // open text file in user's text editor mainptr->EditFile(tempfile); } else if ( IsScriptFile(filename) ) { // run script depending on safety check; note that because the script is // included in a zip file we don't remember it in the Run Recent submenu mainptr->CheckBeforeRunning(tempfile, false, zippath); } else { // open pattern but don't remember in Open Recent menu mainptr->Raise(); mainptr->OpenFile(tempfile, false); } } } // ----------------------------------------------------------------------------- void ClickLexiconPattern(const wxHtmlCell* htmlcell) { if (htmlcell) { wxHtmlContainerCell* parent = htmlcell->GetParent(); if (parent) { parent = parent->GetParent(); if (parent) { wxHtmlCell* container = parent->GetFirstChild(); // extract pattern data and store in lexpattern lexpattern.Clear(); while (container) { wxHtmlCell* cell = container->GetFirstChild(); while (cell) { wxString celltext = cell->ConvertToText(NULL); if (celltext.IsEmpty()) { // probably a formatting cell } else { lexpattern += celltext; // append eol char(s) #ifdef __WXMSW__ // use DOS line ending (CR+LF) on Windows lexpattern += '\r'; lexpattern += '\n'; #else // use LF on Linux or Mac lexpattern += '\n'; #endif } cell = cell->GetNext(); } container = container->GetNext(); } if (!lexpattern.IsEmpty()) { mainptr->Raise(); // look for existing lexicon layer lexlayer = -1; for (int i = 0; i < numlayers; i++) { if (GetLayer(i)->currname == lexicon_name) { lexlayer = i; break; } } if (lexlayer < 0 && numlayers == MAX_LAYERS) { Warning(_("Cannot create new layer for lexicon pattern.")); return; } if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_LOAD_LEXICON); return; } LoadLexiconPattern(); } } } } } // ----------------------------------------------------------------------------- void LoadLexiconPattern() { // switch to existing lexicon layer or create a new such layer if (lexlayer >= 0) { SetLayer(lexlayer); } else { AddLayer(); mainptr->SetWindowTitle(lexicon_name); } // copy lexpattern data to tempstart file so we can handle // all formats supported by readpattern wxFile outfile(currlayer->tempstart, wxFile::write); if ( outfile.IsOpened() ) { outfile.Write(lexpattern); outfile.Close(); // all Life Lexicon patterns assume we're using Conway's Life so try // switching to B3/S23 or Life; if that fails then switch to QuickLife const char* err = currlayer->algo->setrule("B3/S23"); if (err) { // try "Life" in case current algo is RuleLoader and Life.table/tree exists // (also had to make a similar change to the loadpattern code in readpattern.cpp) err = currlayer->algo->setrule("Life"); } if (err) { mainptr->ChangeAlgorithm(QLIFE_ALGO, wxString("B3/S23",wxConvLocal)); } // load lexicon pattern into current layer mainptr->LoadPattern(currlayer->tempstart, lexicon_name); } else { Warning(_("Could not create tempstart file!")); } } // ----------------------------------------------------------------------------- void HtmlView::OnLinkClicked(const wxHtmlLinkInfo& link) { #ifdef __WXMAC__ if ( stopwatch->Time() - whenactive < 500 ) { // avoid problem on Mac: // ignore click in link if the help window was in the background; // this isn't fail safe because OnLinkClicked is only called AFTER // the mouse button is released (better soln would be to set an // ignoreclick flag in OnMouseDown handler if click occurred very // soon after activate) return; } #endif wxString url = link.GetHref(); if ( url.StartsWith(wxT("http:")) || url.StartsWith(wxT("mailto:")) ) { // pass http/mailto URL to user's preferred browser/emailer if ( !wxLaunchDefaultBrowser(url) ) Warning(_("Could not open URL in browser!")); } else if ( url.StartsWith(wxT("get:")) ) { if (mainptr->generating) { Warning(_("Cannot download file while generating a pattern.")); // or stop and create pending event??? see ID_LOAD_LEXICON } else if (inscript) { Warning(_("Cannot download file while a script is running.")); } else if (editlink && IsZipFile(url)) { Warning(_("Opening a zip file in a text editor is not a good idea.")); } else { // download clicked file GetURL( url.AfterFirst(':') ); } } else if ( url.StartsWith(wxT("unzip:")) ) { if (inscript) { Warning(_("Cannot extract zip entry while a script is running.")); } else { // extract clicked entry from zip file wxString zippath = url.AfterFirst(':'); wxString entry = url.AfterLast(':'); zippath = zippath.BeforeLast(':'); UnzipFile(zippath, entry); } } else if ( url.StartsWith(wxT("edit:")) ) { // open clicked file in user's preferred text editor wxString path = url.AfterFirst(':'); #ifdef __WXMSW__ path.Replace(wxT("/"), wxT("\\")); #endif wxFileName fname(path); if (!fname.IsAbsolute()) path = gollydir + path; mainptr->EditFile(path); } else if ( url.StartsWith(wxT("lexpatt:")) ) { if (inscript) { Warning(_("Cannot load lexicon pattern while a script is running.")); } else { // user clicked on pattern in Life Lexicon ClickLexiconPattern( link.GetHtmlCell() ); } } else if ( url.StartsWith(wxT("prefs:")) ) { if (inscript) { Warning(_("Cannot change preferences while a script is running.")); } else { // user clicked on link to Preferences dialog mainptr->ShowPrefsDialog( url.AfterFirst(':') ); } } else if ( url.StartsWith(wxT("open:")) ) { if (inscript) { Warning(_("Cannot open file while a script is running.")); } else { // open clicked file wxString path = url.AfterFirst(':'); #ifdef __WXMSW__ path.Replace(wxT("/"), wxT("\\")); #endif wxFileName fname(path); if (!fname.IsAbsolute()) path = gollydir + path; if (editlink) { mainptr->EditFile(path); } else { mainptr->Raise(); mainptr->OpenFile(path); } } } else if ( url.StartsWith(wxT("rule:")) ) { LoadRule( url.AfterFirst(':') ); } else { // assume it's a link to a local target or another help file CheckAndLoad(url); if (helpptr && helpptr->infront) UpdateHelpButtons(); } } // ----------------------------------------------------------------------------- void HtmlView::OnCellMouseHover(wxHtmlCell* cell, wxCoord x, wxCoord y) { if (helpptr && helpptr->infront && cell) { wxHtmlLinkInfo* link = cell->GetLink(x,y); if (link) { wxString href = link->GetHref(); href.Replace(wxT("&"), wxT("&&")); helpptr->SetStatus(href); wxPoint pt = ScreenToClient( wxGetMousePosition() ); linkrect = wxRect(pt.x-x, pt.y-y, cell->GetWidth(), cell->GetHeight()); } else { ClearStatus(); } } } // ----------------------------------------------------------------------------- void HtmlView::OnMouseMotion(wxMouseEvent& event) { if (helpptr && helpptr->infront && !linkrect.IsEmpty()) { int x = event.GetX(); int y = event.GetY(); if (!linkrect.Contains(x,y)) ClearStatus(); } event.Skip(); } // ----------------------------------------------------------------------------- void HtmlView::OnMouseLeave(wxMouseEvent& event) { if (helpptr && helpptr->infront) { ClearStatus(); } event.Skip(); } // ----------------------------------------------------------------------------- void HtmlView::ClearStatus() { if (helpptr) { helpptr->SetStatus(wxEmptyString); linkrect = wxRect(0,0,0,0); } } // ----------------------------------------------------------------------------- #if defined(__WXMAC__) && wxCHECK_VERSION(2,9,0) // wxMOD_CONTROL has been changed to mean Command key down (sheesh!) #define wxMOD_CONTROL wxMOD_RAW_CONTROL #define ControlDown RawControlDown #endif void HtmlView::OnMouseDown(wxMouseEvent& event) { // set flag so ctrl/right-clicked file can be opened in editor // (this is consistent with how we handle clicks in pattern/script pane) editlink = event.ControlDown() || event.RightDown(); event.Skip(); } // ----------------------------------------------------------------------------- void HtmlView::CheckAndLoad(const wxString& filepath) { if (filepath == SHOW_KEYBOARD_SHORTCUTS) { // build HTML string to display current keyboard shortcuts wxString contents = GetShortcutTable(); // write contents to file and call LoadPage so that back/forwards buttons work wxString htmlfile = tempdir + SHOW_KEYBOARD_SHORTCUTS; wxFile outfile(htmlfile, wxFile::write); if (outfile.IsOpened()) { outfile.Write(contents); outfile.Close(); LoadPage(htmlfile); } else { Warning(_("Could not create file:\n") + htmlfile); // might as well show contents SetPage(contents); currhelp = SHOW_KEYBOARD_SHORTCUTS; } } else if ( filepath.StartsWith(_("Help/")) ) { // prepend location of Golly so user can open help while running a script wxString fullpath = gollydir + filepath; LoadPage(fullpath); } else { // assume full path or local link LoadPage(filepath); } } // ----------------------------------------------------------------------------- #ifdef __WXMSW__ // we have to use OnKeyUp handler on Windows otherwise wxHtmlWindow's OnKeyUp // gets called which detects ctrl-C and clobbers our clipboard fix void HtmlView::OnKeyUp(wxKeyEvent& event) #else // we have to use OnKeyDown handler on Mac -- if OnKeyUp handler is used and // cmd-C is pressed quickly then key code is 400!!! void HtmlView::OnKeyDown(wxKeyEvent& event) #endif { int key = event.GetKeyCode(); if (event.CmdDown()) { // let cmd-A select all text if (key == 'A') { SelectAll(); return; } #ifdef __WXMAC__ // let cmd-W close help window or about box if (key == 'W') { GetParent()->Close(true); return; } #endif } if ( event.CmdDown() || event.AltDown() ) { if ( key == 'C' ) { // copy any selected text to the clipboard wxString text = SelectionToText(); if ( text.Length() > 0 ) { if ( helpptr && helpptr->infront && GetOpenedPageTitle().StartsWith(wxT("Life Lexicon")) ) { // avoid wxHTML bug when copying text inside <pre>...</pre>!!! // if there are at least 2 lines and the 1st line is twice // the size of the 2nd line then insert \n in middle of 1st line if ( text.Freq('\n') > 0 ) { wxString line1 = text.BeforeFirst('\n'); wxString aftern = text.AfterFirst('\n'); wxString line2 = aftern.BeforeFirst('\n'); size_t line1len = line1.Length(); size_t line2len = line2.Length(); if ( line1len == 2 * line2len ) { wxString left = text.Left(line2len); wxString right = text.Mid(line2len); text = left; text += '\n'; text += right; } } } mainptr->CopyTextToClipboard(text); } } else { event.Skip(); } } else { // this handler is also called from ShowAboutBox if ( helpptr == NULL || !helpptr->infront ) { if ( key == WXK_NUMPAD_ENTER ) { // fix wxMac problem: allow enter key to close about box GetParent()->Close(true); return; } event.Skip(); return; } // let escape/return/enter key close help window if ( key == WXK_ESCAPE || key == WXK_RETURN || key == WXK_NUMPAD_ENTER ) { helpptr->Close(true); } else if ( key == WXK_HOME ) { ShowHelp(helphome); } else { event.Skip(); } } } // ----------------------------------------------------------------------------- void HtmlView::OnChar(wxKeyEvent& event) { // this handler is also called from ShowAboutBox if ( helpptr == NULL || !helpptr->infront ) { event.Skip(); return; } int key = event.GetKeyCode(); if ( key == '+' || key == '=' || key == WXK_ADD ) { if ( helpfontsize < maxfontsize ) { helpfontsize++; ChangeFontSizes(helpfontsize); } } else if ( key == '-' || key == WXK_SUBTRACT ) { if ( helpfontsize > minfontsize ) { helpfontsize--; ChangeFontSizes(helpfontsize); } } else if ( key == '[' || key == WXK_LEFT ) { if ( HistoryBack() ) { UpdateHelpButtons(); } } else if ( key == ']' || key == WXK_RIGHT ) { if ( HistoryForward() ) { UpdateHelpButtons(); } } else { event.Skip(); // so up/down arrows and pg up/down keys work } } // ----------------------------------------------------------------------------- // avoid scroll position being reset to top when wxHtmlWindow is resized void HtmlView::OnSize(wxSizeEvent& event) { int x, y; GetViewStart(&x, &y); // save current position wxHtmlWindow::OnSize(event); wxString currpage = GetOpenedPage(); if ( !currpage.IsEmpty() && canreload ) { CheckAndLoad(currpage); // reload page Scroll(x, y); // scroll to old position } // prevent wxHtmlWindow::OnSize being called again event.Skip(false); } // ----------------------------------------------------------------------------- void HtmlView::OnTimer(wxTimerEvent& WXUNUSED(event)) { if (helpptr && helpptr->infront) { // send idle event to html window so cursor gets updated // even while app is busy doing something else (eg. generating) wxIdleEvent idleevent; #if wxCHECK_VERSION(2,9,2) // SendIdleEvents is now in wxWindow SendIdleEvents(idleevent); #else wxGetApp().SendIdleEvents(this, idleevent); #endif } } // ----------------------------------------------------------------------------- void HtmlView::SetFontSizes(int size) { // set font sizes for <FONT SIZE=-2> to <FONT SIZE=+4> int f_sizes[7]; f_sizes[0] = int(size * 0.6); f_sizes[1] = int(size * 0.8); f_sizes[2] = size; f_sizes[3] = int(size * 1.2); f_sizes[4] = int(size * 1.4); f_sizes[5] = int(size * 1.6); f_sizes[6] = int(size * 1.8); #ifdef __WXOSX_COCOA__ SetFonts(wxT("Lucida Grande"), wxT("Monaco"), f_sizes); #else SetFonts(wxEmptyString, wxEmptyString, f_sizes); #endif } // ----------------------------------------------------------------------------- void HtmlView::ChangeFontSizes(int size) { // changing font sizes resets pos to top, so save and restore pos int x, y; GetViewStart(&x, &y); SetFontSizes(size); if (y > 0) Scroll(-1, y); } // ----------------------------------------------------------------------------- void ShowAboutBox() { if (viewptr->waitingforclick) return; wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); wxDialog dlg(mainptr, wxID_ANY, wxString(_("About Golly"))); HtmlView* html = new HtmlView(&dlg, wxID_ANY, wxDefaultPosition, #if wxCHECK_VERSION(2,9,0) // work around SetSize bug below!!! wxSize(400, 320), #elif defined(__WXGTK__) wxSize(460, 220), #else wxSize(386, 220), #endif wxHW_SCROLLBAR_NEVER | wxSUNKEN_BORDER); html->SetBorders(0); #ifdef __WXOSX_COCOA__ html->SetFontSizes(helpfontsize); #endif html->CheckAndLoad(_("Help/about.html")); // avoid HtmlView::OnSize calling CheckAndLoad again html->canreload = false; // this call seems to be ignored in __WXOSX_COCOA__!!! html->SetSize(html->GetInternalRepresentation()->GetWidth(), html->GetInternalRepresentation()->GetHeight()); topsizer->Add(html, 1, wxALL, 10); wxButton* okbutt = new wxButton(&dlg, wxID_OK, _("OK")); okbutt->SetDefault(); topsizer->Add(okbutt, 0, wxBOTTOM | wxALIGN_CENTER, 10); dlg.SetSizer(topsizer); topsizer->Fit(&dlg); dlg.Centre(); dlg.ShowModal(); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������golly-2.5-src/gui-wx/wxinfo.cpp���������������������������������������������������������������������0000644�0001751�0000144�00000017172�12156145314�013461� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "readpattern.h" // for readcomments #include "wxgolly.h" // for wxGetApp, mainptr #include "wxmain.h" // for mainptr->... #include "wxutils.h" // for Warning #include "wxprefs.h" // for infox/y/wd/ht and mininfo* #include "wxinfo.h" // ----------------------------------------------------------------------------- // define a modeless window to display pattern info: class InfoFrame : public wxFrame { public: InfoFrame(char *comments); private: // event handlers void OnActivate(wxActivateEvent& event); void OnCloseButton(wxCommandEvent& event); void OnClose(wxCloseEvent& event); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(InfoFrame, wxFrame) EVT_ACTIVATE ( InfoFrame::OnActivate) EVT_BUTTON (wxID_CLOSE, InfoFrame::OnCloseButton) EVT_CLOSE ( InfoFrame::OnClose) END_EVENT_TABLE() // ----------------------------------------------------------------------------- InfoFrame *infoptr = NULL; // pattern info window wxFrame* GetInfoFrame() { return infoptr; } // ----------------------------------------------------------------------------- // define a child window for viewing comments: class TextView : public wxTextCtrl { public: TextView(wxWindow *parent, wxWindowID id, const wxString &value, const wxPoint& pos, const wxSize& size, long style) : wxTextCtrl(parent, id, value, pos, size, style) { } private: // event handlers void OnKeyDown(wxKeyEvent& event); // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(TextView, wxTextCtrl) EVT_KEY_DOWN (TextView::OnKeyDown) END_EVENT_TABLE() // ----------------------------------------------------------------------------- void TextView::OnKeyDown(wxKeyEvent& event) { int key = event.GetKeyCode(); #ifdef __WXMAC__ // let cmd-W close info window if (event.CmdDown() && key == 'W') { infoptr->Close(true); return; } // let cmd-A select all text if (event.CmdDown() && key == 'A') { SetSelection(-1, -1); return; } #endif if ( event.CmdDown() || event.AltDown() ) { // let default handler see things like cmd-C event.Skip(); } else { // let escape/return/enter key close info window if ( key == WXK_ESCAPE || key == WXK_RETURN || key == WXK_NUMPAD_ENTER ) { infoptr->Close(true); } else { event.Skip(); } } } // ----------------------------------------------------------------------------- // create the pattern info window InfoFrame::InfoFrame(char *comments) : wxFrame(NULL, wxID_ANY, _("Pattern Info"), wxPoint(infox,infoy), wxSize(infowd,infoht)) { wxGetApp().SetFrameIcon(this); #ifdef __WXMSW__ // use current theme's background colour SetBackgroundColour(wxNullColour); #endif TextView* textctrl = new TextView(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_RICH | // needed for font changing on Windows wxTE_MULTILINE | wxTE_READONLY | wxTE_DONTWRAP); // use a fixed-width font wxTextAttr textattr(wxNullColour, wxNullColour, #if defined(__WXOSX_COCOA__) // we need to specify facename to get Monaco instead of Courier wxFont(12, wxMODERN, wxNORMAL, wxNORMAL, false, wxT("Monaco"))); #elif defined(__WXMAC__) wxFont(11, wxMODERN, wxNORMAL, wxNORMAL)); #else wxFont(10, wxMODERN, wxNORMAL, wxNORMAL)); #endif textctrl->SetDefaultStyle(textattr); if (comments[0] == 0) { textctrl->WriteText(_("No comments found.")); } else { textctrl->WriteText(wxString(comments,wxConvLocal)); #if defined(__WXOSX_COCOA__) // sigh... wxOSX seems to ignore SetDefaultStyle textctrl->SetStyle(0, strlen(comments), textattr); #endif } textctrl->ShowPosition(0); textctrl->SetInsertionPoint(0); wxButton *closebutt = new wxButton(this, wxID_CLOSE, _("Close")); closebutt->SetDefault(); wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL); vbox->Add(textctrl, 1, wxLEFT | wxRIGHT | wxTOP | wxEXPAND | wxALIGN_TOP, 10); vbox->Add(closebutt, 0, wxALL | wxALIGN_CENTER, 10); SetMinSize(wxSize(mininfowd, mininfoht)); SetSizer(vbox); #ifdef __WXMAC__ // expand sizer now to avoid flicker vbox->SetDimension(0, 0, infowd, infoht); #endif // need this on Linux textctrl->SetFocus(); } // ----------------------------------------------------------------------------- void InfoFrame::OnActivate(wxActivateEvent& event) { if ( event.GetActive() ) { // ensure correct menu items, esp after info window // is clicked while app is in background mainptr->UpdateMenuItems(false); } event.Skip(); } // ----------------------------------------------------------------------------- void InfoFrame::OnCloseButton(wxCommandEvent& WXUNUSED(event)) { Close(true); } // ----------------------------------------------------------------------------- void InfoFrame::OnClose(wxCloseEvent& WXUNUSED(event)) { #ifdef __WXMSW__ if (!IsIconized()) { #endif // save current location and size for later use in SavePrefs wxRect r = GetRect(); infox = r.x; infoy = r.y; infowd = r.width; infoht = r.height; #ifdef __WXMSW__ } #endif Destroy(); // also deletes all child windows (buttons, etc) infoptr = NULL; } // ----------------------------------------------------------------------------- #ifdef __WXMAC__ // convert path to decomposed UTF8 so fopen will work #define FILEPATH filepath.fn_str() #else #define FILEPATH filepath.mb_str(wxConvLocal) #endif void ShowInfo(const wxString& filepath) { if (infoptr) { // info window exists so just bring it to front infoptr->Raise(); return; } // buffer for receiving comment data (allocated by readcomments) char *commptr = NULL; // read and display comments in current pattern file const char *err = readcomments(FILEPATH, &commptr); if (err) { Warning(wxString(err,wxConvLocal)); } else { infoptr = new InfoFrame(commptr); if (infoptr == NULL) { Warning(_("Could not create info window!")); } else { infoptr->Show(true); } } if (commptr) free(commptr); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������golly-2.5-src/gui-wx/wxlayer.cpp��������������������������������������������������������������������0000644�0001751�0000144�00000345777�12156145314�013661� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #if wxUSE_TOOLTIPS #include "wx/tooltip.h" // for wxToolTip #endif #include "wx/rawbmp.h" // for wxAlphaPixelData #include "wx/filename.h" // for wxFileName #include "wx/colordlg.h" // for wxColourDialog #include "wx/tglbtn.h" // for wxToggleButton #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "viewport.h" #include "util.h" // for linereader #include "wxgolly.h" // for wxGetApp, mainptr, viewptr, bigview, statusptr #include "wxmain.h" // for mainptr->... #include "wxedit.h" // for ShiftEditBar #include "wxselect.h" // for Selection #include "wxview.h" // for viewptr->... #include "wxstatus.h" // for statusptr->... #include "wxutils.h" // for Warning, FillRect, CreatePaleBitmap, etc #include "wxrender.h" // for DrawOneIcon #include "wxprefs.h" // for initrule, swapcolors, userrules, rulesdir, etc #include "wxscript.h" // for inscript #include "wxundo.h" // for UndoRedo, etc #include "wxalgos.h" // for algo_type, initalgo, algoinfo, CreateNewUniverse, etc #include "wxlayer.h" #ifdef _MSC_VER #pragma warning(disable:4702) // disable "unreachable code" warnings from MSVC #endif #include <map> // for std::map #ifdef _MSC_VER #pragma warning(default:4702) // enable "unreachable code" warnings #endif // ----------------------------------------------------------------------------- const int layerbarht = 32; // height of layer bar int numlayers = 0; // number of existing layers int numclones = 0; // number of cloned layers int currindex = -1; // index of current layer Layer* currlayer = NULL; // pointer to current layer Layer* layer[MAX_LAYERS]; // array of layers bool cloneavail[MAX_LAYERS]; // for setting unique cloneid bool cloning = false; // adding a cloned layer? bool duplicating = false; // adding a duplicated layer? algo_type oldalgo; // algorithm in old layer wxString oldrule; // rule in old layer int oldmag; // scale in old layer bigint oldx; // X position in old layer bigint oldy; // Y position in old layer wxCursor* oldcurs; // cursor mode in old layer // ids for bitmap buttons in layer bar enum { LAYER_0 = 0, // LAYER_0 must be first id LAYER_LAST = LAYER_0 + MAX_LAYERS - 1, ADD_LAYER, CLONE_LAYER, DUPLICATE_LAYER, DELETE_LAYER, STACK_LAYERS, TILE_LAYERS, NUM_BUTTONS // must be last }; #ifdef __WXMSW__ // bitmaps are loaded via .rc file #else // bitmaps for some layer bar buttons #include "bitmaps/add.xpm" #include "bitmaps/clone.xpm" #include "bitmaps/duplicate.xpm" #include "bitmaps/delete.xpm" #include "bitmaps/stack.xpm" #include "bitmaps/stack_down.xpm" #include "bitmaps/tile.xpm" #include "bitmaps/tile_down.xpm" #endif // ----------------------------------------------------------------------------- // Define layer bar window: // derive from wxPanel so we get current theme's background color on Windows class LayerBar : public wxPanel { public: LayerBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht); ~LayerBar() {} // add a button to layer bar void AddButton(int id, const wxString& tip); // add a horizontal gap between buttons void AddSeparator(); // enable/disable button void EnableButton(int id, bool enable); // set state of a toggle button void SelectButton(int id, bool select); // might need to expand/shrink width of layer buttons void ResizeLayerButtons(); // detect press and release of button void OnButtonDown(wxMouseEvent& event); void OnButtonUp(wxMouseEvent& event); void OnMouseMotion(wxMouseEvent& event); void OnKillFocus(wxFocusEvent& event); private: // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() // event handlers void OnPaint(wxPaintEvent& event); void OnSize(wxSizeEvent& event); void OnMouseDown(wxMouseEvent& event); void OnButton(wxCommandEvent& event); // bitmaps for normal or down state wxBitmap normbutt[NUM_BUTTONS]; wxBitmap downbutt[NUM_BUTTONS]; #ifdef __WXMSW__ // on Windows we need bitmaps for disabled buttons wxBitmap disnormbutt[NUM_BUTTONS]; wxBitmap disdownbutt[NUM_BUTTONS]; #endif // positioning data used by AddButton and AddSeparator int ypos, xpos, smallgap, biggap; int downid; // id of currently pressed layer button int currbuttwd; // current width of each layer button }; BEGIN_EVENT_TABLE(LayerBar, wxPanel) EVT_PAINT ( LayerBar::OnPaint) EVT_SIZE ( LayerBar::OnSize) EVT_LEFT_DOWN ( LayerBar::OnMouseDown) EVT_BUTTON (wxID_ANY, LayerBar::OnButton) EVT_TOGGLEBUTTON (wxID_ANY, LayerBar::OnButton) END_EVENT_TABLE() static LayerBar* layerbarptr = NULL; // global pointer to layer bar // layer bar buttons must be global to use Connect/Disconnect on Windows; // note that bitmapbutt[0..MAX_LAYERS-1] are not used, but it simplifies // our logic to have those dummy indices static wxBitmapButton* bitmapbutt[NUM_BUTTONS] = {NULL}; static wxToggleButton* togglebutt[MAX_LAYERS] = {NULL}; // width and height of toggle buttons const int MAX_TOGGLE_WD = 128; const int MIN_TOGGLE_WD = 48; #if defined(__WXMSW__) const int TOGGLE_HT = 22; #elif defined(__WXGTK__) const int TOGGLE_HT = 24; #elif defined(__WXOSX_COCOA__) const int TOGGLE_HT = 24; #else const int TOGGLE_HT = 20; #endif // width and height of bitmap buttons #if defined(__WXOSX_COCOA__) || defined(__WXGTK__) const int BUTTON_WD = 28; const int BUTTON_HT = 28; #else const int BUTTON_WD = 24; const int BUTTON_HT = 24; #endif const wxString SWITCH_LAYER = _("Switch to this layer"); // ----------------------------------------------------------------------------- LayerBar::LayerBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht) : wxPanel(parent, wxID_ANY, wxPoint(xorg,yorg), wxSize(wd,ht), wxNO_FULL_REPAINT_ON_RESIZE) { #ifdef __WXGTK__ // avoid erasing background on GTK+ SetBackgroundStyle(wxBG_STYLE_CUSTOM); #endif // init bitmaps for normal state normbutt[ADD_LAYER] = wxBITMAP(add); normbutt[CLONE_LAYER] = wxBITMAP(clone); normbutt[DUPLICATE_LAYER] = wxBITMAP(duplicate); normbutt[DELETE_LAYER] = wxBITMAP(delete); normbutt[STACK_LAYERS] = wxBITMAP(stack); normbutt[TILE_LAYERS] = wxBITMAP(tile); // some bitmap buttons also have a down state downbutt[STACK_LAYERS] = wxBITMAP(stack_down); downbutt[TILE_LAYERS] = wxBITMAP(tile_down); #ifdef __WXMSW__ // create bitmaps for disabled buttons CreatePaleBitmap(normbutt[ADD_LAYER], disnormbutt[ADD_LAYER]); CreatePaleBitmap(normbutt[CLONE_LAYER], disnormbutt[CLONE_LAYER]); CreatePaleBitmap(normbutt[DUPLICATE_LAYER], disnormbutt[DUPLICATE_LAYER]); CreatePaleBitmap(normbutt[DELETE_LAYER], disnormbutt[DELETE_LAYER]); CreatePaleBitmap(normbutt[STACK_LAYERS], disnormbutt[STACK_LAYERS]); CreatePaleBitmap(normbutt[TILE_LAYERS], disnormbutt[TILE_LAYERS]); // create bitmaps for disabled buttons in down state CreatePaleBitmap(downbutt[STACK_LAYERS], disdownbutt[STACK_LAYERS]); CreatePaleBitmap(downbutt[TILE_LAYERS], disdownbutt[TILE_LAYERS]); #endif // init position variables used by AddButton and AddSeparator biggap = 16; #ifdef __WXGTK__ // buttons are a different size in wxGTK xpos = 2; ypos = 2; smallgap = 6; #else xpos = 4; ypos = (32 - BUTTON_HT) / 2; smallgap = 4; #endif downid = -1; // no layer button down as yet currbuttwd = MAX_TOGGLE_WD; } // ----------------------------------------------------------------------------- void LayerBar::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); int wd, ht; GetClientSize(&wd, &ht); if (wd < 1 || ht < 1 || !showlayer) return; #ifdef __WXMSW__ // needed on Windows dc.Clear(); #endif wxRect r = wxRect(0, 0, wd, ht); #ifdef __WXMAC__ wxBrush brush(wxColor(202,202,202)); FillRect(dc, r, brush); #endif if (!showedit) { // draw gray border line at bottom edge #if defined(__WXMSW__) dc.SetPen(*wxGREY_PEN); #elif defined(__WXMAC__) wxPen linepen(wxColor(140,140,140)); dc.SetPen(linepen); #else dc.SetPen(*wxLIGHT_GREY_PEN); #endif dc.DrawLine(0, r.GetBottom(), r.width, r.GetBottom()); dc.SetPen(wxNullPen); } } // ----------------------------------------------------------------------------- void LayerBar::OnSize(wxSizeEvent& event) { ResizeLayerButtons(); event.Skip(); } // ----------------------------------------------------------------------------- void LayerBar::ResizeLayerButtons() { // might need to expand/shrink width of layer button(s) if (layerbarptr) { int wd, ht; GetClientSize(&wd, &ht); wxRect r1 = togglebutt[0]->GetRect(); int x = r1.GetLeft(); int y = r1.GetTop(); const int rgap = 4; int viswidth = wd - x - rgap; int oldbuttwd = currbuttwd; if (numlayers*currbuttwd <= viswidth) { // all layer buttons are visible so try to expand widths while (currbuttwd < MAX_TOGGLE_WD && numlayers*(currbuttwd+1) <= viswidth) { currbuttwd++; } } else { // try to reduce widths until all layer buttons are visible while (currbuttwd > MIN_TOGGLE_WD && numlayers*currbuttwd > viswidth) { currbuttwd--; } } if (currbuttwd != oldbuttwd) { for (int i = 0; i < MAX_LAYERS; i++) { togglebutt[i]->SetSize(x, y, currbuttwd, TOGGLE_HT); x += currbuttwd; } } } } // ----------------------------------------------------------------------------- void LayerBar::OnMouseDown(wxMouseEvent& WXUNUSED(event)) { // this is NOT called if user clicks a layer bar button; // on Windows we need to reset keyboard focus to viewport window viewptr->SetFocus(); mainptr->showbanner = false; statusptr->ClearMessage(); } // ----------------------------------------------------------------------------- void LayerBar::OnButton(wxCommandEvent& event) { #ifdef __WXMAC__ // close any open tool tip window (fixes wxMac bug?) wxToolTip::RemoveToolTips(); #endif mainptr->showbanner = false; statusptr->ClearMessage(); int id = event.GetId(); #ifdef __WXMSW__ // disconnect focus handler and reset focus to viewptr; // we must do latter before button becomes disabled if (id < MAX_LAYERS) { togglebutt[id]->Disconnect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(LayerBar::OnKillFocus)); } else { bitmapbutt[id]->Disconnect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(LayerBar::OnKillFocus)); } viewptr->SetFocus(); #endif switch (id) { case ADD_LAYER: AddLayer(); break; case CLONE_LAYER: CloneLayer(); break; case DUPLICATE_LAYER: DuplicateLayer(); break; case DELETE_LAYER: DeleteLayer(); break; case STACK_LAYERS: ToggleStackLayers(); break; case TILE_LAYERS: ToggleTileLayers(); break; default: // id < MAX_LAYERS if (id == currindex) { // make sure toggle button stays in selected state togglebutt[id]->SetValue(true); } else { SetLayer(id); if (inscript) { // update window title, viewport and status bar inscript = false; mainptr->SetWindowTitle(wxEmptyString); mainptr->UpdatePatternAndStatus(); inscript = true; } } } // avoid weird bug on Mac where viewport can lose keyboard focus after // the user hits DELETE_LAYER button *and* the "All controls" option // is ticked in System Prefs > Keyboard & Mouse > Keyboard Shortcuts viewptr->SetFocus(); } // ----------------------------------------------------------------------------- void LayerBar::OnKillFocus(wxFocusEvent& event) { int id = event.GetId(); if (id < MAX_LAYERS) { togglebutt[id]->SetFocus(); // don't let button lose focus } else { bitmapbutt[id]->SetFocus(); // don't let button lose focus } } // ----------------------------------------------------------------------------- // global flag is not used at the moment (probably need later for dragging button) static bool buttdown = false; void LayerBar::OnButtonDown(wxMouseEvent& event) { // a layer bar button has been pressed buttdown = true; int id = event.GetId(); // connect a handler that keeps focus with the pressed button if (id < MAX_LAYERS) { togglebutt[id]->Connect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(LayerBar::OnKillFocus)); } else { bitmapbutt[id]->Connect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(LayerBar::OnKillFocus)); } event.Skip(); } // ----------------------------------------------------------------------------- void LayerBar::OnButtonUp(wxMouseEvent& event) { // a layer bar button has been released buttdown = false; wxPoint pt; int wd, ht; int id = event.GetId(); if (id < MAX_LAYERS) { pt = togglebutt[id]->ScreenToClient( wxGetMousePosition() ); togglebutt[id]->GetClientSize(&wd, &ht); // disconnect kill-focus handler togglebutt[id]->Disconnect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(LayerBar::OnKillFocus)); } else { pt = bitmapbutt[id]->ScreenToClient( wxGetMousePosition() ); bitmapbutt[id]->GetClientSize(&wd, &ht); // disconnect kill-focus handler bitmapbutt[id]->Disconnect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(LayerBar::OnKillFocus)); } viewptr->SetFocus(); wxRect r(0, 0, wd, ht); if ( r.Contains(pt) ) { // call OnButton wxCommandEvent buttevt(wxEVT_COMMAND_BUTTON_CLICKED, id); if (id < MAX_LAYERS) { buttevt.SetEventObject(togglebutt[id]); togglebutt[id]->GetEventHandler()->ProcessEvent(buttevt); } else { buttevt.SetEventObject(bitmapbutt[id]); bitmapbutt[id]->GetEventHandler()->ProcessEvent(buttevt); } } } // ----------------------------------------------------------------------------- // not used at the moment (probably need later for button dragging) void LayerBar::OnMouseMotion(wxMouseEvent& event) { if (buttdown) { //??? } event.Skip(); } // ----------------------------------------------------------------------------- void LayerBar::AddButton(int id, const wxString& tip) { if (id < MAX_LAYERS) { // create toggle button int y = (layerbarht - TOGGLE_HT) / 2; togglebutt[id] = new wxToggleButton(this, id, wxT("?"), wxPoint(xpos, y), wxSize(MIN_TOGGLE_WD, TOGGLE_HT)); if (togglebutt[id] == NULL) { Fatal(_("Failed to create layer bar bitmap button!")); } else { #if defined(__WXGTK__) || defined(__WXOSX_COCOA__) // use smaller font on Linux and OS X Cocoa togglebutt[id]->SetWindowVariant(wxWINDOW_VARIANT_SMALL); #endif // we need to create size using MIN_TOGGLE_WD above and resize now // using MAX_TOGGLE_WD, otherwise we can't shrink size later // (possibly only needed by wxMac) togglebutt[id]->SetSize(xpos, y, MAX_TOGGLE_WD, TOGGLE_HT); xpos += MAX_TOGGLE_WD; togglebutt[id]->SetToolTip(SWITCH_LAYER); #ifdef __WXMSW__ // fix problem with layer bar buttons when generating/inscript // due to focus being changed to viewptr togglebutt[id]->Connect(id, wxEVT_LEFT_DOWN, wxMouseEventHandler(LayerBar::OnButtonDown)); togglebutt[id]->Connect(id, wxEVT_LEFT_UP, wxMouseEventHandler(LayerBar::OnButtonUp)); /* don't need this handler at the moment togglebutt[id]->Connect(id, wxEVT_MOTION, wxMouseEventHandler(LayerBar::OnMouseMotion)); */ #endif } } else { // create bitmap button bitmapbutt[id] = new wxBitmapButton(this, id, normbutt[id], wxPoint(xpos,ypos), wxSize(BUTTON_WD, BUTTON_HT)); if (bitmapbutt[id] == NULL) { Fatal(_("Failed to create layer bar bitmap button!")); } else { xpos += BUTTON_WD + smallgap; bitmapbutt[id]->SetToolTip(tip); #ifdef __WXMSW__ // fix problem with layer bar buttons when generating/inscript // due to focus being changed to viewptr bitmapbutt[id]->Connect(id, wxEVT_LEFT_DOWN, wxMouseEventHandler(LayerBar::OnButtonDown)); bitmapbutt[id]->Connect(id, wxEVT_LEFT_UP, wxMouseEventHandler(LayerBar::OnButtonUp)); /* don't need this handler at the moment bitmapbutt[id]->Connect(id, wxEVT_MOTION, wxMouseEventHandler(LayerBar::OnMouseMotion)); */ #endif } } } // ----------------------------------------------------------------------------- void LayerBar::AddSeparator() { xpos += biggap - smallgap; } // ----------------------------------------------------------------------------- void LayerBar::EnableButton(int id, bool enable) { if (id < MAX_LAYERS) { // toggle button if (enable == togglebutt[id]->IsEnabled()) return; togglebutt[id]->Enable(enable); } else { // bitmap button if (enable == bitmapbutt[id]->IsEnabled()) return; #ifdef __WXMSW__ if (id == STACK_LAYERS && stacklayers) { bitmapbutt[id]->SetBitmapDisabled(disdownbutt[id]); } else if (id == TILE_LAYERS && tilelayers) { bitmapbutt[id]->SetBitmapDisabled(disdownbutt[id]); } else { bitmapbutt[id]->SetBitmapDisabled(disnormbutt[id]); } #endif bitmapbutt[id]->Enable(enable); } } // ----------------------------------------------------------------------------- void LayerBar::SelectButton(int id, bool select) { if (id < MAX_LAYERS) { // toggle button if (select) { if (downid >= LAYER_0) { // deselect old layer button togglebutt[downid]->SetValue(false); togglebutt[downid]->SetToolTip(SWITCH_LAYER); } downid = id; togglebutt[id]->SetToolTip(_("Current layer")); } togglebutt[id]->SetValue(select); } else { // bitmap button if (select) { bitmapbutt[id]->SetBitmapLabel(downbutt[id]); } else { bitmapbutt[id]->SetBitmapLabel(normbutt[id]); } if (showlayer) bitmapbutt[id]->Refresh(false); } } // ----------------------------------------------------------------------------- void CreateLayerBar(wxWindow* parent) { int wd, ht; parent->GetClientSize(&wd, &ht); layerbarptr = new LayerBar(parent, 0, 0, wd, layerbarht); if (layerbarptr == NULL) Fatal(_("Failed to create layer bar!")); // create bitmap buttons layerbarptr->AddButton(ADD_LAYER, _("Add new layer")); layerbarptr->AddButton(CLONE_LAYER, _("Clone current layer")); layerbarptr->AddButton(DUPLICATE_LAYER, _("Duplicate current layer")); layerbarptr->AddButton(DELETE_LAYER, _("Delete current layer")); layerbarptr->AddSeparator(); layerbarptr->AddButton(STACK_LAYERS, _("Stack layers")); layerbarptr->AddButton(TILE_LAYERS, _("Tile layers")); layerbarptr->AddSeparator(); // create a toggle button for each layer for (int i = 0; i < MAX_LAYERS; i++) { layerbarptr->AddButton(i, wxEmptyString); } // hide all toggle buttons except for layer 0 for (int i = 1; i < MAX_LAYERS; i++) togglebutt[i]->Show(false); // select STACK_LAYERS or TILE_LAYERS if necessary if (stacklayers) layerbarptr->SelectButton(STACK_LAYERS, true); if (tilelayers) layerbarptr->SelectButton(TILE_LAYERS, true); // select LAYER_0 button layerbarptr->SelectButton(LAYER_0, true); layerbarptr->Show(showlayer); } // ----------------------------------------------------------------------------- int LayerBarHeight() { return (showlayer ? layerbarht : 0); } // ----------------------------------------------------------------------------- void ResizeLayerBar(int wd) { if (layerbarptr) { layerbarptr->SetSize(wd, layerbarht); } } // ----------------------------------------------------------------------------- void UpdateLayerBar(bool active) { if (layerbarptr && showlayer) { if (viewptr->waitingforclick) active = false; layerbarptr->EnableButton(ADD_LAYER, active && !inscript && numlayers < MAX_LAYERS); layerbarptr->EnableButton(CLONE_LAYER, active && !inscript && numlayers < MAX_LAYERS); layerbarptr->EnableButton(DUPLICATE_LAYER, active && !inscript && numlayers < MAX_LAYERS); layerbarptr->EnableButton(DELETE_LAYER, active && !inscript && numlayers > 1); layerbarptr->EnableButton(STACK_LAYERS, active); layerbarptr->EnableButton(TILE_LAYERS, active); for (int i = 0; i < numlayers; i++) layerbarptr->EnableButton(i, active && CanSwitchLayer(i)); // no need to redraw entire bar here if it only contains buttons // layerbarptr->Refresh(false); } } // ----------------------------------------------------------------------------- void UpdateLayerButton(int index, const wxString& name) { // assume caller has replaced any "&" with "&&" togglebutt[index]->SetLabel(name); } // ----------------------------------------------------------------------------- void RedrawLayerBar() { layerbarptr->Refresh(false); } // ----------------------------------------------------------------------------- void ToggleLayerBar() { showlayer = !showlayer; wxRect r = bigview->GetRect(); if (showlayer) { // show layer bar at top of viewport window r.y += layerbarht; r.height -= layerbarht; ShiftEditBar(layerbarht); // move edit bar down } else { // hide layer bar r.y -= layerbarht; r.height += layerbarht; ShiftEditBar(-layerbarht); // move edit bar up } bigview->SetSize(r); layerbarptr->Show(showlayer); // needed on Windows mainptr->UpdateMenuItems(mainptr->IsActive()); } // ----------------------------------------------------------------------------- void CalculateTileRects(int bigwd, int bight) { // set tilerect in each layer wxRect r; bool portrait = (bigwd <= bight); int rows, cols; // try to avoid the aspect ratio of each tile becoming too large switch (numlayers) { case 4: rows = 2; cols = 2; break; case 9: rows = 3; cols = 3; break; case 3: case 5: case 7: rows = portrait ? numlayers / 2 + 1 : 2; cols = portrait ? 2 : numlayers / 2 + 1; break; case 6: case 8: case 10: rows = portrait ? numlayers / 2 : 2; cols = portrait ? 2 : numlayers / 2; break; default: // numlayers == 2 or > 10 rows = portrait ? numlayers : 1; cols = portrait ? 1 : numlayers; } int tilewd = bigwd / cols; int tileht = bight / rows; if ( float(tilewd) > float(tileht) * 2.5 ) { rows = 1; cols = numlayers; tileht = bight; tilewd = bigwd / numlayers; } else if ( float(tileht) > float(tilewd) * 2.5 ) { cols = 1; rows = numlayers; tilewd = bigwd; tileht = bight / numlayers; } for ( int i = 0; i < rows; i++ ) { for ( int j = 0; j < cols; j++ ) { r.x = j * tilewd; r.y = i * tileht; r.width = tilewd; r.height = tileht; if (i == rows - 1) { // may need to increase height of bottom-edge tile r.height += bight - (rows * tileht); } if (j == cols - 1) { // may need to increase width of right-edge tile r.width += bigwd - (cols * tilewd); } int index = i * cols + j; if (index == numlayers) { // numlayers == 3,5,7 layer[index - 1]->tilerect.width += r.width; } else { layer[index]->tilerect = r; } } } if (tileborder > 0) { // make tilerects smaller to allow for equal-width tile borders for ( int i = 0; i < rows; i++ ) { for ( int j = 0; j < cols; j++ ) { int index = i * cols + j; if (index == numlayers) { // numlayers == 3,5,7 layer[index - 1]->tilerect.width -= tileborder; } else { layer[index]->tilerect.x += tileborder; layer[index]->tilerect.y += tileborder; layer[index]->tilerect.width -= tileborder; layer[index]->tilerect.height -= tileborder; if (j == cols - 1) layer[index]->tilerect.width -= tileborder; if (i == rows - 1) layer[index]->tilerect.height -= tileborder; } } } } } // ----------------------------------------------------------------------------- void ResizeTiles(int bigwd, int bight) { // set tilerect for each layer so they tile bigview's client area CalculateTileRects(bigwd, bight); // set size of each tile window for ( int i = 0; i < numlayers; i++ ) layer[i]->tilewin->SetSize( layer[i]->tilerect ); // set viewport size for each tile; this is currently the same as the // tilerect size because tile windows are created with wxNO_BORDER for ( int i = 0; i < numlayers; i++ ) { int wd, ht; layer[i]->tilewin->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; layer[i]->view->resize(wd, ht); } } // ----------------------------------------------------------------------------- void ResizeLayers(int wd, int ht) { // this is called whenever the size of the bigview window changes; // wd and ht are the dimensions of bigview's client area if (tilelayers && numlayers > 1) { ResizeTiles(wd, ht); } else { // resize viewport in each layer to bigview's client area for (int i = 0; i < numlayers; i++) layer[i]->view->resize(wd, ht); } } // ----------------------------------------------------------------------------- void CreateTiles() { // create tile windows for ( int i = 0; i < numlayers; i++ ) { layer[i]->tilewin = new PatternView(bigview, // correct size will be set below by ResizeTiles 0, 0, 0, 0, // we draw our own tile borders wxNO_BORDER | // needed for wxGTK wxFULL_REPAINT_ON_RESIZE | wxWANTS_CHARS); if (layer[i]->tilewin == NULL) Fatal(_("Failed to create tile window!")); // set tileindex >= 0; this must always match the layer index, so we'll need to // destroy and recreate all tiles whenever a tile is added, deleted or moved layer[i]->tilewin->tileindex = i; #if wxUSE_DRAG_AND_DROP // let user drop file onto any tile (but file will be loaded into current tile) layer[i]->tilewin->SetDropTarget(mainptr->NewDropTarget()); #endif } // init tilerects, tile window sizes and their viewport sizes int wd, ht; bigview->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; ResizeTiles(wd, ht); // change viewptr to tile window for current layer viewptr = currlayer->tilewin; if (mainptr->IsActive()) viewptr->SetFocus(); } // ----------------------------------------------------------------------------- void DestroyTiles() { // reset viewptr to main viewport window viewptr = bigview; if (mainptr->IsActive()) viewptr->SetFocus(); // destroy all tile windows for ( int i = 0; i < numlayers; i++ ) delete layer[i]->tilewin; // resize viewport in each layer to bigview's client area int wd, ht; bigview->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; for ( int i = 0; i < numlayers; i++ ) layer[i]->view->resize(wd, ht); } // ----------------------------------------------------------------------------- void SyncClones() { if (numclones == 0) return; if (currlayer->cloneid > 0) { // make sure clone algo and most other settings are synchronized for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { // universe might have been re-created, or algorithm changed cloneptr->algo = currlayer->algo; cloneptr->algtype = currlayer->algtype; cloneptr->rule = currlayer->rule; // no need to sync undo/redo history // cloneptr->undoredo = currlayer->undoredo; // along with view, don't sync these settings // cloneptr->autofit = currlayer->autofit; // cloneptr->hyperspeed = currlayer->hyperspeed; // cloneptr->showhashinfo = currlayer->showhashinfo; // cloneptr->drawingstate = currlayer->drawingstate; // cloneptr->curs = currlayer->curs; // cloneptr->originx = currlayer->originx; // cloneptr->originy = currlayer->originy; // cloneptr->currname = currlayer->currname; // sync various flags cloneptr->dirty = currlayer->dirty; cloneptr->savedirty = currlayer->savedirty; cloneptr->stayclean = currlayer->stayclean; // sync step size cloneptr->currbase = currlayer->currbase; cloneptr->currexpo = currlayer->currexpo; // sync selection info cloneptr->currsel = currlayer->currsel; cloneptr->savesel = currlayer->savesel; // sync the stuff needed to reset pattern cloneptr->startalgo = currlayer->startalgo; cloneptr->savestart = currlayer->savestart; cloneptr->startdirty = currlayer->startdirty; cloneptr->startrule = currlayer->startrule; cloneptr->startfile = currlayer->startfile; cloneptr->startgen = currlayer->startgen; cloneptr->currfile = currlayer->currfile; cloneptr->startsel = currlayer->startsel; // clone can have different starting name, pos, scale, step // cloneptr->startname = currlayer->startname; // cloneptr->startx = currlayer->startx; // cloneptr->starty = currlayer->starty; // cloneptr->startmag = currlayer->startmag; // cloneptr->startbase = currlayer->startbase; // cloneptr->startexpo = currlayer->startexpo; // sync timeline settings cloneptr->currframe = currlayer->currframe; cloneptr->autoplay = currlayer->autoplay; cloneptr->tlspeed = currlayer->tlspeed; cloneptr->lastframe = currlayer->lastframe; } } } } // ----------------------------------------------------------------------------- void SaveLayerSettings() { // set oldalgo and oldrule for use in CurrentLayerChanged oldalgo = currlayer->algtype; oldrule = wxString(currlayer->algo->getrule(), wxConvLocal); // we're about to change layer so remember current rule // in case we switch back to this layer currlayer->rule = oldrule; // synchronize clone info (do AFTER setting currlayer->rule) SyncClones(); if (syncviews) { // save scale and location for use in CurrentLayerChanged oldmag = currlayer->view->getmag(); oldx = currlayer->view->x; oldy = currlayer->view->y; } if (synccursors) { // save cursor mode for use in CurrentLayerChanged oldcurs = currlayer->curs; } } // ----------------------------------------------------------------------------- bool RestoreRule(const wxString& rule) { const char* err = currlayer->algo->setrule( rule.mb_str(wxConvLocal) ); if (err) { // this can happen if the given rule's table/tree file was deleted // or it was edited and some sort of error introduced, so best to // use algo's default rule (which should never fail) currlayer->algo->setrule( currlayer->algo->DefaultRule() ); wxString msg = _("The rule \"") + rule; msg += _("\" is no longer valid!\nUsing the default rule instead."); Warning(msg); return false; } return true; } // ----------------------------------------------------------------------------- void CurrentLayerChanged() { // currlayer has changed since SaveLayerSettings was called; // update rule if the new currlayer uses a different algorithm or rule if ( currlayer->algtype != oldalgo || !currlayer->rule.IsSameAs(oldrule,false) ) { RestoreRule(currlayer->rule); } if (syncviews) currlayer->view->setpositionmag(oldx, oldy, oldmag); if (synccursors) currlayer->curs = oldcurs; // select current layer button (also deselects old button) layerbarptr->SelectButton(currindex, true); if (tilelayers && numlayers > 1) { // switch to new tile viewptr = currlayer->tilewin; if (mainptr->IsActive()) viewptr->SetFocus(); } if (allowundo) { // update Undo/Redo items so they show the correct action currlayer->undoredo->UpdateUndoRedoItems(); } else { // undo/redo is disabled so clear history; // this also removes action from Undo/Redo items currlayer->undoredo->ClearUndoRedo(); } mainptr->SetStepExponent(currlayer->currexpo); // SetStepExponent calls SetGenIncrement mainptr->SetWindowTitle(currlayer->currname); mainptr->UpdateUserInterface(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); bigview->UpdateScrollBars(); } // ----------------------------------------------------------------------------- void UpdateLayerNames() { // update names in all layer items at end of Layer menu for (int i = 0; i < numlayers; i++) mainptr->UpdateLayerItem(i); } // ----------------------------------------------------------------------------- static wxBitmap** CopyIcons(wxBitmap** srcicons, int maxstate) { wxBitmap** iconptr = (wxBitmap**) malloc(256 * sizeof(wxBitmap*)); if (iconptr) { for (int i = 0; i < 256; i++) iconptr[i] = NULL; for (int i = 0; i <= maxstate; i++) { if (srcicons && srcicons[i]) { wxRect rect(0, 0, srcicons[i]->GetWidth(), srcicons[i]->GetHeight()); iconptr[i] = new wxBitmap(srcicons[i]->GetSubBitmap(rect)); } } } return iconptr; } // ----------------------------------------------------------------------------- static void CopyBuiltinIcons(wxBitmap** i7x7, wxBitmap** i15x15, wxBitmap** i31x31) { int maxstate = currlayer->algo->NumCellStates() - 1; if (currlayer->icons7x7) FreeIconBitmaps(currlayer->icons7x7); if (currlayer->icons15x15) FreeIconBitmaps(currlayer->icons15x15); if (currlayer->icons31x31) FreeIconBitmaps(currlayer->icons31x31); currlayer->icons7x7 = CopyIcons(i7x7, maxstate); currlayer->icons15x15 = CopyIcons(i15x15, maxstate); currlayer->icons31x31 = CopyIcons(i31x31, maxstate); } // ----------------------------------------------------------------------------- void AddLayer() { if (numlayers >= MAX_LAYERS) return; // we need to test mainptr here because AddLayer is called from main window's ctor if (mainptr && mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_ADD_LAYER); return; } if (numlayers == 0) { // creating the very first layer currindex = 0; } else { if (tilelayers && numlayers > 1) DestroyTiles(); SaveLayerSettings(); // insert new layer after currindex currindex++; if (currindex < numlayers) { // shift right one or more layers for (int i = numlayers; i > currindex; i--) layer[i] = layer[i-1]; } } Layer* oldlayer = NULL; if (cloning || duplicating) oldlayer = currlayer; currlayer = new Layer(); if (currlayer == NULL) Fatal(_("Failed to create new layer!")); layer[currindex] = currlayer; if (cloning || duplicating) { // copy old layer's colors to new layer currlayer->fromrgb = oldlayer->fromrgb; currlayer->torgb = oldlayer->torgb; for (int n = 0; n < currlayer->algo->NumCellStates(); n++) { currlayer->cellr[n] = oldlayer->cellr[n]; currlayer->cellg[n] = oldlayer->cellg[n]; currlayer->cellb[n] = oldlayer->cellb[n]; } currlayer->deadbrush->SetColour( oldlayer->deadbrush->GetColour() ); currlayer->gridpen->SetColour( oldlayer->gridpen->GetColour() ); currlayer->boldpen->SetColour( oldlayer->boldpen->GetColour() ); if (cloning) { // use same icon pointers currlayer->icons7x7 = oldlayer->icons7x7; currlayer->icons15x15 = oldlayer->icons15x15; currlayer->icons31x31 = oldlayer->icons31x31; } else { // duplicate icons from old layer int maxstate = currlayer->algo->NumCellStates() - 1; currlayer->icons7x7 = CopyIcons(oldlayer->icons7x7, maxstate); currlayer->icons15x15 = CopyIcons(oldlayer->icons15x15, maxstate); currlayer->icons31x31 = CopyIcons(oldlayer->icons31x31, maxstate); } } else { // set new layer's colors+icons to default colors+icons for current algo+rule UpdateLayerColors(); } numlayers++; if (numlayers > 1) { // add toggle button at end of layer bar layerbarptr->ResizeLayerButtons(); togglebutt[numlayers-1]->Show(true); // add another item at end of Layer menu mainptr->AppendLayerItem(); UpdateLayerNames(); if (tilelayers && numlayers > 1) CreateTiles(); CurrentLayerChanged(); } } // ----------------------------------------------------------------------------- void CloneLayer() { if (numlayers >= MAX_LAYERS) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_CLONE); return; } cloning = true; AddLayer(); cloning = false; } // ----------------------------------------------------------------------------- void DuplicateLayer() { if (numlayers >= MAX_LAYERS) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_DUPLICATE); return; } duplicating = true; AddLayer(); duplicating = false; } // ----------------------------------------------------------------------------- void DeleteLayer() { if (numlayers <= 1) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_DEL_LAYER); return; } // note that we don't need to ask to delete a clone if (!inscript && currlayer->dirty && currlayer->cloneid == 0 && askondelete && !mainptr->SaveCurrentLayer()) return; // numlayers > 1 if (tilelayers) DestroyTiles(); SaveLayerSettings(); delete currlayer; numlayers--; if (currindex < numlayers) { // shift left one or more layers for (int i = currindex; i < numlayers; i++) layer[i] = layer[i+1]; } if (currindex > 0) currindex--; currlayer = layer[currindex]; // remove toggle button at end of layer bar togglebutt[numlayers]->Show(false); layerbarptr->ResizeLayerButtons(); // remove item from end of Layer menu mainptr->RemoveLayerItem(); UpdateLayerNames(); if (tilelayers && numlayers > 1) CreateTiles(); CurrentLayerChanged(); } // ----------------------------------------------------------------------------- void DeleteOtherLayers() { if (inscript || numlayers <= 1) return; if (askondelete) { // keep track of which unique clones have been seen; // we add 1 below to allow for cloneseen[0] (always false) const int maxseen = MAX_LAYERS/2 + 1; bool cloneseen[maxseen]; for (int i = 0; i < maxseen; i++) cloneseen[i] = false; // for each dirty layer, except current layer and all of its clones, // ask user if they want to save changes int cid = layer[currindex]->cloneid; if (cid > 0) cloneseen[cid] = true; int oldindex = currindex; for (int i = 0; i < numlayers; i++) { // only ask once for each unique clone (cloneid == 0 for non-clone) cid = layer[i]->cloneid; if (i != oldindex && !cloneseen[cid]) { if (cid > 0) cloneseen[cid] = true; if (layer[i]->dirty) { // temporarily turn off generating flag for SetLayer bool oldgen = mainptr->generating; mainptr->generating = false; SetLayer(i); if (!mainptr->SaveCurrentLayer()) { // user hit Cancel so restore current layer and generating flag SetLayer(oldindex); mainptr->generating = oldgen; mainptr->UpdateUserInterface(mainptr->IsActive()); return; } SetLayer(oldindex); mainptr->generating = oldgen; } } } } // numlayers > 1 if (tilelayers) DestroyTiles(); SyncClones(); // delete all layers except current layer; // we need to do this carefully because ~Layer() requires numlayers // and the layer array to be correct when deleting a cloned layer int i = numlayers; while (numlayers > 1) { i--; if (i != currindex) { delete layer[i]; // ~Layer() is called numlayers--; // may need to shift the current layer left one place if (i < numlayers) layer[i] = layer[i+1]; // remove toggle button at end of layer bar togglebutt[numlayers]->Show(false); // remove item from end of Layer menu mainptr->RemoveLayerItem(); } } layerbarptr->ResizeLayerButtons(); currindex = 0; // currlayer doesn't change // update the only layer item mainptr->UpdateLayerItem(0); // update window title (may need to remove "=" prefix) mainptr->SetWindowTitle(wxEmptyString); // select LAYER_0 button (also deselects old button) layerbarptr->SelectButton(LAYER_0, true); mainptr->UpdateMenuItems(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void SetLayer(int index) { if (currindex == index) return; if (index < 0 || index >= numlayers) return; if (inscript) { // always allow a script to switch layers } else if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_LAYER0 + index); return; } SaveLayerSettings(); currindex = index; currlayer = layer[currindex]; CurrentLayerChanged(); } // ----------------------------------------------------------------------------- bool CanSwitchLayer(int WXUNUSED(index)) { if (inscript) { // user can only switch layers if script has set the appropriate option return canswitch; } else { // user can switch to any layer return true; } } // ----------------------------------------------------------------------------- void SwitchToClickedTile(int index) { if (inscript && !CanSwitchLayer(index)) { // statusptr->ErrorMessage does nothing if inscript is true Warning(_("You cannot switch to another layer while this script is running.")); return; } // switch current layer to clicked tile SetLayer(index); if (inscript) { // update window title, viewport and status bar inscript = false; mainptr->SetWindowTitle(wxEmptyString); mainptr->UpdatePatternAndStatus(); inscript = true; } } // ----------------------------------------------------------------------------- void MoveLayer(int fromindex, int toindex) { if (fromindex == toindex) return; if (fromindex < 0 || fromindex >= numlayers) return; if (toindex < 0 || toindex >= numlayers) return; SaveLayerSettings(); if (fromindex > toindex) { Layer* savelayer = layer[fromindex]; for (int i = fromindex; i > toindex; i--) layer[i] = layer[i - 1]; layer[toindex] = savelayer; } else { // fromindex < toindex Layer* savelayer = layer[fromindex]; for (int i = fromindex; i < toindex; i++) layer[i] = layer[i + 1]; layer[toindex] = savelayer; } currindex = toindex; currlayer = layer[currindex]; UpdateLayerNames(); if (tilelayers && numlayers > 1) { DestroyTiles(); CreateTiles(); } CurrentLayerChanged(); } // ----------------------------------------------------------------------------- // remove this eventually if user can drag layer buttons??? void MoveLayerDialog() { if (inscript || numlayers <= 1) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_MOVE_LAYER); return; } wxString msg = _("Move the current layer to a new position:"); if (currindex > 0) { msg += _("\n(enter 0 to make it the first layer)"); } int newindex; if ( GetInteger(_("Move Layer"), msg, currindex, 0, numlayers - 1, &newindex) ) { MoveLayer(currindex, newindex); } } // ----------------------------------------------------------------------------- void NameLayerDialog() { if (inscript) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_NAME_LAYER); return; } wxString oldname = currlayer->currname; wxString newname; if ( GetString(_("Name Layer"), _("Enter a new name for the current layer:"), oldname, newname) && !newname.IsEmpty() && oldname != newname ) { // inscript is false so no need to call SavePendingChanges // if (allowundo) SavePendingChanges(); // show new name in main window's title bar; // also sets currlayer->currname and updates menu item mainptr->SetWindowTitle(newname); if (allowundo) { // note that currfile and savestart/dirty flags don't change here currlayer->undoredo->RememberNameChange(oldname, currlayer->currfile, currlayer->savestart, currlayer->dirty); } } } // ----------------------------------------------------------------------------- void MarkLayerDirty() { // need to save starting pattern currlayer->savestart = true; // if script has reset dirty flag then don't change it; this makes sense // for scripts that call new() and then construct a pattern if (currlayer->stayclean) return; if (!currlayer->dirty) { currlayer->dirty = true; // pass in currname so UpdateLayerItem(currindex) gets called mainptr->SetWindowTitle(currlayer->currname); if (currlayer->cloneid > 0) { // synchronize other clones for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { // set dirty flag and display asterisk in layer item cloneptr->dirty = true; mainptr->UpdateLayerItem(i); } } } } } // ----------------------------------------------------------------------------- void MarkLayerClean(const wxString& title) { currlayer->dirty = false; // if script is resetting dirty flag -- eg. via new() -- then don't allow // dirty flag to be set true for the remainder of the script; this is // nicer for scripts that construct a pattern (ie. running such a script // is equivalent to loading a pattern file) if (inscript) currlayer->stayclean = true; if (title.IsEmpty()) { // pass in currname so UpdateLayerItem(currindex) gets called mainptr->SetWindowTitle(currlayer->currname); } else { // set currlayer->currname to title and call UpdateLayerItem(currindex) mainptr->SetWindowTitle(title); } if (currlayer->cloneid > 0) { // synchronize other clones for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { // reset dirty flag cloneptr->dirty = false; if (inscript) cloneptr->stayclean = true; // always allow clones to have different names // cloneptr->currname = currlayer->currname; // remove asterisk from layer item mainptr->UpdateLayerItem(i); } } } } // ----------------------------------------------------------------------------- void ToggleSyncViews() { syncviews = !syncviews; mainptr->UpdateUserInterface(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void ToggleSyncCursors() { synccursors = !synccursors; mainptr->UpdateUserInterface(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void ToggleStackLayers() { stacklayers = !stacklayers; if (stacklayers && tilelayers) { tilelayers = false; layerbarptr->SelectButton(TILE_LAYERS, false); if (numlayers > 1) DestroyTiles(); } layerbarptr->SelectButton(STACK_LAYERS, stacklayers); mainptr->UpdateUserInterface(mainptr->IsActive()); if (inscript) { // always update viewport and status bar inscript = false; mainptr->UpdatePatternAndStatus(); inscript = true; } else { mainptr->UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- void ToggleTileLayers() { tilelayers = !tilelayers; if (tilelayers && stacklayers) { stacklayers = false; layerbarptr->SelectButton(STACK_LAYERS, false); } layerbarptr->SelectButton(TILE_LAYERS, tilelayers); if (tilelayers) { if (numlayers > 1) CreateTiles(); } else { if (numlayers > 1) DestroyTiles(); } mainptr->UpdateUserInterface(mainptr->IsActive()); if (inscript) { // always update viewport and status bar inscript = false; mainptr->UpdatePatternAndStatus(); inscript = true; } else { mainptr->UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- void CreateColorGradient() { int maxstate = currlayer->algo->NumCellStates() - 1; unsigned char r1 = currlayer->fromrgb.Red(); unsigned char g1 = currlayer->fromrgb.Green(); unsigned char b1 = currlayer->fromrgb.Blue(); unsigned char r2 = currlayer->torgb.Red(); unsigned char g2 = currlayer->torgb.Green(); unsigned char b2 = currlayer->torgb.Blue(); // set cell colors for states 1..maxstate using a color gradient // starting with r1,g1,b1 and ending with r2,g2,b2 currlayer->cellr[1] = r1; currlayer->cellg[1] = g1; currlayer->cellb[1] = b1; if (maxstate > 2) { int N = maxstate - 1; double rfrac = (double)(r2 - r1) / (double)N; double gfrac = (double)(g2 - g1) / (double)N; double bfrac = (double)(b2 - b1) / (double)N; for (int n = 1; n < N; n++) { currlayer->cellr[n+1] = (int)(r1 + n * rfrac + 0.5); currlayer->cellg[n+1] = (int)(g1 + n * gfrac + 0.5); currlayer->cellb[n+1] = (int)(b1 + n * bfrac + 0.5); } } if (maxstate > 1) { currlayer->cellr[maxstate] = r2; currlayer->cellg[maxstate] = g2; currlayer->cellb[maxstate] = b2; } } // ----------------------------------------------------------------------------- void UpdateBrushAndPens(Layer* layerptr) { // update deadbrush, gridpen, boldpen in given layer int r = layerptr->cellr[0]; int g = layerptr->cellg[0]; int b = layerptr->cellb[0]; layerptr->deadbrush->SetColour(r, g, b); // no need to use this standard grayscale conversion??? // gray = (int) (0.299*r + 0.587*g + 0.114*b); int gray = (int) ((r + g + b) / 3.0); if (gray > 127) { // use darker grid layerptr->gridpen->SetColour(r > 32 ? r - 32 : 0, g > 32 ? g - 32 : 0, b > 32 ? b - 32 : 0); layerptr->boldpen->SetColour(r > 64 ? r - 64 : 0, g > 64 ? g - 64 : 0, b > 64 ? b - 64 : 0); } else { // use lighter grid layerptr->gridpen->SetColour(r + 32 < 256 ? r + 32 : 255, g + 32 < 256 ? g + 32 : 255, b + 32 < 256 ? b + 32 : 255); layerptr->boldpen->SetColour(r + 64 < 256 ? r + 64 : 255, g + 64 < 256 ? g + 64 : 255, b + 64 < 256 ? b + 64 : 255); } } // ----------------------------------------------------------------------------- void UpdateCloneColors() { // first update deadbrush, gridpen, boldpen UpdateBrushAndPens(currlayer); if (currlayer->cloneid > 0) { int maxstate = currlayer->algo->NumCellStates() - 1; for (int i = 0; i < numlayers; i++) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->fromrgb = currlayer->fromrgb; cloneptr->torgb = currlayer->torgb; for (int n = 0; n <= maxstate; n++) { cloneptr->cellr[n] = currlayer->cellr[n]; cloneptr->cellg[n] = currlayer->cellg[n]; cloneptr->cellb[n] = currlayer->cellb[n]; } // use same icon pointers cloneptr->icons7x7 = currlayer->icons7x7; cloneptr->icons15x15 = currlayer->icons15x15; cloneptr->icons31x31 = currlayer->icons31x31; // use same colors in deadbrush, gridpen and boldpen cloneptr->deadbrush->SetColour( currlayer->deadbrush->GetColour() ); cloneptr->gridpen->SetColour( currlayer->gridpen->GetColour() ); cloneptr->boldpen->SetColour( currlayer->boldpen->GetColour() ); } } } } // ----------------------------------------------------------------------------- static FILE* FindRuleFile(const wxString& rulename) { const wxString extn = wxT(".rule"); wxString path; // first look for rulename.rule in userrules path = userrules + rulename; path += extn; FILE* f = fopen(path.mb_str(wxConvLocal), "r"); if (f) return f; // now look for rulename.rule in rulesdir path = rulesdir + rulename; path += extn; return fopen(path.mb_str(wxConvLocal), "r"); } // ----------------------------------------------------------------------------- static void CheckRuleHeader(char* linebuf, const wxString& rulename) { // check that 1st line of rulename.rule file contains "@RULE rulename" // where rulename must match the file name exactly (to avoid problems on // case-sensitive file systems) if (strncmp(linebuf, "@RULE ", 6) != 0) { wxString msg = _("The first line in "); msg += rulename; msg += _(".rule does not start with @RULE."); Warning(msg); } else if (strcmp(linebuf+6, (const char*)rulename.mb_str(wxConvLocal)) != 0) { wxString msg = _("The rule name on the first line in "); msg += rulename; msg += _(".rule does not match the specified rule: "); msg += rulename; Warning(msg); } } // ----------------------------------------------------------------------------- static void ParseColors(linereader& reader, char* linebuf, int MAXLINELEN, int* linenum, bool* eof) { // parse @COLORS section in currently open .rule file int state, r, g, b, r1, g1, b1, r2, g2, b2; int maxstate = currlayer->algo->NumCellStates() - 1; while (reader.fgets(linebuf, MAXLINELEN) != 0) { *linenum = *linenum + 1; if (linebuf[0] == '#' || linebuf[0] == 0) { // skip comment or empty line } else if (sscanf(linebuf, "%d%d%d%d%d%d", &r1, &g1, &b1, &r2, &g2, &b2) == 6) { // assume line is like this: // 255 0 0 0 0 255 use a gradient from red to blue currlayer->fromrgb.Set(r1, g1, b1); currlayer->torgb.Set(r2, g2, b2); CreateColorGradient(); } else if (sscanf(linebuf, "%d%d%d%d", &state, &r, &g, &b) == 4) { // assume line is like this: // 1 0 128 255 state 1 is light blue if (state >= 0 && state <= maxstate) { currlayer->cellr[state] = r; currlayer->cellg[state] = g; currlayer->cellb[state] = b; } } else if (linebuf[0] == '@') { // found next section, so stop parsing *eof = false; return; } // ignore unexpected syntax (better for upward compatibility) } *eof = true; } // ----------------------------------------------------------------------------- static void DeleteXPMData(char** xpmdata, int numstrings) { if (xpmdata) { for (int i = 0; i < numstrings; i++) if (xpmdata[i]) free(xpmdata[i]); free(xpmdata); } } // ----------------------------------------------------------------------------- static void CreateIcons(const char** xpmdata, int size) { int maxstates = currlayer->algo->NumCellStates(); // we only need to call FreeIconBitmaps if .rule file has duplicate XPM data // (unlikely but best to play it safe) if (size == 7) { if (currlayer->icons7x7) FreeIconBitmaps(currlayer->icons7x7); currlayer->icons7x7 = CreateIconBitmaps(xpmdata, maxstates); } else if (size == 15) { if (currlayer->icons15x15) FreeIconBitmaps(currlayer->icons15x15); currlayer->icons15x15 = CreateIconBitmaps(xpmdata, maxstates); } else if (size == 31) { if (currlayer->icons31x31) FreeIconBitmaps(currlayer->icons31x31); currlayer->icons31x31 = CreateIconBitmaps(xpmdata, maxstates); } } // ----------------------------------------------------------------------------- static void ParseIcons(const wxString& rulename, linereader& reader, char* linebuf, int MAXLINELEN, int* linenum, bool* eof) { // parse @ICONS section in currently open .rule file char** xpmdata = NULL; int xpmstarted = 0, xpmstrings = 0, maxstrings = 0; int wd = 0, ht = 0, numcolors = 0, chars_per_pixel = 0; std::map<std::string,int> colormap; while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) { *eof = true; break; } *linenum = *linenum + 1; if (linebuf[0] == '#' || linebuf[0] == '/' || linebuf[0] == 0) { // skip comment or empty line } else if (linebuf[0] == '"') { if (xpmstarted) { // we have a "..." string containing XPM data if (xpmstrings == 0) { if (sscanf(linebuf, "\"%d%d%d%d\"", &wd, &ht, &numcolors, &chars_per_pixel) == 4 && wd > 0 && ht > 0 && numcolors > 0 && chars_per_pixel > 0 && ht % wd == 0) { if (wd != 7 && wd != 15 && wd != 31) { // this version of Golly doesn't support the supplied icon size // so silently ignore the rest of this XPM data xpmstarted = 0; continue; } maxstrings = 1 + numcolors + ht; // create and initialize xpmdata xpmdata = (char**) malloc(maxstrings * sizeof(char*)); if (xpmdata) { for (int i = 0; i < maxstrings; i++) xpmdata[i] = NULL; } else { Warning(_("Failed to allocate memory for XPM icon data!")); *eof = true; return; } } else { wxString msg; msg.Printf(_("The XPM header string on line %d in "), *linenum); msg += rulename; msg += _(".rule is incorrect"); if (wd > 0 && ht > 0 && ht % wd != 0) msg += _(" (height must be a multiple of width)."); else if (chars_per_pixel < 1 || chars_per_pixel > 2) msg += _(" (chars_per_pixel must be 1 or 2)."); else msg += _(" (4 positive integers are required)."); Warning(msg); *eof = true; return; } } // copy data inside "..." to next string in xpmdata int len = strlen(linebuf); while (linebuf[len] != '"') len--; len--; if (xpmstrings > 0 && xpmstrings <= numcolors) { // build colormap so we can validate chars in pixel data std::string pixel; char ch1, ch2; if (chars_per_pixel == 1) { sscanf(linebuf+1, "%c ", &ch1); pixel += ch1; } else { sscanf(linebuf+1, "%c%c ", &ch1, &ch2); pixel += ch1; pixel += ch2; } colormap[pixel] = xpmstrings; } else if (xpmstrings > numcolors) { // check length of string containing pixel data if (len != wd * chars_per_pixel) { DeleteXPMData(xpmdata, maxstrings); wxString msg; msg.Printf(_("The XPM data string on line %d in "), *linenum); msg += rulename; msg += _(".rule has the wrong length."); Warning(msg); *eof = true; return; } // now check that chars in pixel data are valid (ie. in colormap) for (int i = 1; i <= len; i += chars_per_pixel) { std::string pixel; pixel += linebuf[i]; if (chars_per_pixel > 1) pixel += linebuf[i+1]; if (colormap.find(pixel) == colormap.end()) { DeleteXPMData(xpmdata, maxstrings); wxString msg; msg.Printf(_("The XPM data string on line %d in "), *linenum); msg += rulename; msg += _(".rule has an unknown pixel: "); msg += wxString(pixel.c_str(), wxConvLocal); Warning(msg); *eof = true; return; } } } char* str = (char*) malloc(len+1); if (str) { strncpy(str, linebuf+1, len); str[len] = 0; xpmdata[xpmstrings] = str; } else { DeleteXPMData(xpmdata, maxstrings); Warning(_("Failed to allocate memory for XPM string!")); *eof = true; return; } xpmstrings++; if (xpmstrings == maxstrings) { // we've got all the data for this icon size CreateIcons((const char**)xpmdata, wd); DeleteXPMData(xpmdata, maxstrings); xpmdata = NULL; xpmstarted = 0; colormap.clear(); } } } else if (strcmp(linebuf, "XPM") == 0) { // start parsing XPM data on following lines if (xpmstarted) break; // handle error below xpmstarted = *linenum; xpmstrings = 0; } else if (strcmp(linebuf, "circles") == 0) { // use circular icons CopyBuiltinIcons(circles7x7, circles15x15, circles31x31); } else if (strcmp(linebuf, "diamonds") == 0) { // use diamond-shaped icons CopyBuiltinIcons(diamonds7x7, diamonds15x15, diamonds31x31); } else if (strcmp(linebuf, "hexagons") == 0) { // use hexagonal icons CopyBuiltinIcons(hexagons7x7, hexagons15x15, hexagons31x31); } else if (strcmp(linebuf, "triangles") == 0) { // use triangular icons if (currlayer->algo->NumCellStates() != 4) { wxString msg; msg.Printf(_("The triangular icons specified on line %d in "), *linenum); msg += rulename; msg += _(".rule can only be used with a 4-state rule."); Warning(msg); // don't return } else { CopyBuiltinIcons(triangles7x7, triangles15x15, triangles31x31); } } else if (linebuf[0] == '@') { // found next section, so stop parsing *eof = false; break; } // ignore unexpected syntax (better for upward compatibility) } if (xpmstarted) { // XPM data was incomplete DeleteXPMData(xpmdata, maxstrings); wxString msg; msg.Printf(_("The XPM icon data starting on line %d in "), xpmstarted); msg += rulename; msg += _(".rule does not have enough strings."); Warning(msg); *eof = true; return; } // create scaled bitmaps if size(s) not supplied if (!currlayer->icons7x7) { if (currlayer->icons15x15) { // scale down 15x15 bitmaps currlayer->icons7x7 = ScaleIconBitmaps(currlayer->icons15x15, 7); } else if (currlayer->icons31x31) { // scale down 31x31 bitmaps currlayer->icons7x7 = ScaleIconBitmaps(currlayer->icons31x31, 7); } } if (!currlayer->icons15x15) { if (currlayer->icons31x31) { // scale down 31x31 bitmaps currlayer->icons15x15 = ScaleIconBitmaps(currlayer->icons31x31, 15); } else if (currlayer->icons7x7) { // scale up 7x7 bitmaps currlayer->icons15x15 = ScaleIconBitmaps(currlayer->icons7x7, 15); } } if (!currlayer->icons31x31) { if (currlayer->icons15x15) { // scale up 15x15 bitmaps currlayer->icons31x31 = ScaleIconBitmaps(currlayer->icons15x15, 31); } else if (currlayer->icons7x7) { // scale up 7x7 bitmaps currlayer->icons31x31 = ScaleIconBitmaps(currlayer->icons7x7, 31); } } } // ----------------------------------------------------------------------------- static void LoadRuleInfo(FILE* rulefile, const wxString& rulename, bool* loadedcolors, bool* loadedicons) { // load any color and/or icon info from the currently open .rule file const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; int linenum = 0; bool eof = false; bool skipget = false; // the linereader class handles all line endings (CR, CR+LF, LF) linereader reader(rulefile); while (true) { if (skipget) { // ParseColors/ParseIcons has stopped at next section // (ie. linebuf contains @...) so skip fgets call skipget = false; } else { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; linenum++; if (linenum == 1) CheckRuleHeader(linebuf, rulename); } // look for @COLORS or @ICONS section if (strcmp(linebuf, "@COLORS") == 0 && !*loadedcolors) { *loadedcolors = true; ParseColors(reader, linebuf, MAXLINELEN, &linenum, &eof); if (eof) break; // otherwise linebuf contains @... so skip next fgets call skipget = true; } else if (strcmp(linebuf, "@ICONS") == 0 && !*loadedicons) { *loadedicons = true; ParseIcons(rulename, reader, linebuf, MAXLINELEN, &linenum, &eof); if (eof) break; // otherwise linebuf contains @... so skip next fgets call skipget = true; } } reader.close(); // closes rulefile } // ----------------------------------------------------------------------------- static FILE* FindColorFile(const wxString& rule, const wxString& dir) { const wxString extn = wxT(".colors"); wxString path; // first look for rule.colors in given directory path = dir + rule; path += extn; FILE* f = fopen(path.mb_str(wxConvLocal), "r"); if (f) return f; // if rule has the form foo-* then look for foo.colors in dir; // this allows related rules to share a single .colors file wxString prefix = rule.BeforeLast('-'); if (!prefix.IsEmpty()) { path = dir + prefix; path += extn; f = fopen(path.mb_str(wxConvLocal), "r"); if (f) return f; } return NULL; } // ----------------------------------------------------------------------------- static bool LoadRuleColors(const wxString& rule, int maxstate) { // if rule.colors file exists in userrules or rulesdir then // change colors according to info in file FILE* f = FindColorFile(rule, userrules); if (!f) f = FindColorFile(rule, rulesdir); if (f) { // the linereader class handles all line endings (CR, CR+LF, LF) linereader reader(f); // not needed here, but useful if we ever return early due to error // reader.setcloseonfree(); const int MAXLINELEN = 512; char buf[MAXLINELEN + 1]; while (reader.fgets(buf, MAXLINELEN) != 0) { if (buf[0] == '#' || buf[0] == 0) { // skip comment or empty line } else { // look for "color" or "gradient" keyword at start of line char* keyword = buf; char* value; while (*keyword == ' ') keyword++; value = keyword; while (*value >= 'a' && *value <= 'z') value++; while (*value == ' ' || *value == '=') value++; if (strncmp(keyword, "color", 5) == 0) { int state, r, g, b; if (sscanf(value, "%d%d%d%d", &state, &r, &g, &b) == 4) { if (state >= 0 && state <= maxstate) { currlayer->cellr[state] = r; currlayer->cellg[state] = g; currlayer->cellb[state] = b; } }; } else if (strncmp(keyword, "gradient", 8) == 0) { int r1, g1, b1, r2, g2, b2; if (sscanf(value, "%d%d%d%d%d%d", &r1, &g1, &b1, &r2, &g2, &b2) == 6) { currlayer->fromrgb.Set(r1, g1, b1); currlayer->torgb.Set(r2, g2, b2); CreateColorGradient(); }; } } } reader.close(); return true; } return false; } // ----------------------------------------------------------------------------- static void DeleteIcons(Layer* layer) { // delete given layer's existing icons if (layer->icons7x7) { for (int i = 0; i < 256; i++) delete layer->icons7x7[i]; free(layer->icons7x7); layer->icons7x7 = NULL; } if (layer->icons15x15) { for (int i = 0; i < 256; i++) delete layer->icons15x15[i]; free(layer->icons15x15); layer->icons15x15 = NULL; } if (layer->icons31x31) { for (int i = 0; i < 256; i++) delete layer->icons31x31[i]; free(layer->icons31x31); layer->icons31x31 = NULL; } } // ----------------------------------------------------------------------------- static bool FindIconFile(const wxString& rule, const wxString& dir, wxString& path) { const wxString extn = wxT(".icons"); // first look for rule.icons in given directory path = dir + rule; path += extn; if (wxFileName::FileExists(path)) return true; // if rule has the form foo-* then look for foo.icons in dir; // this allows related rules to share a single .icons file wxString prefix = rule.BeforeLast('-'); if (!prefix.IsEmpty()) { path = dir + prefix; path += extn; if (wxFileName::FileExists(path)) return true; } return false; } // ----------------------------------------------------------------------------- static bool LoadRuleIcons(const wxString& rule, int maxstate) { // if rule.icons file exists in userrules or rulesdir then // load icons for current layer wxString path; return (FindIconFile(rule, userrules, path) || FindIconFile(rule, rulesdir, path)) && LoadIconFile(path, maxstate, &currlayer->icons7x7, &currlayer->icons15x15, &currlayer->icons31x31); } // ----------------------------------------------------------------------------- static void UseDefaultIcons(int maxstate) { // icons weren't specified so use default icons if (currlayer->algo->getgridtype() == lifealgo::HEX_GRID) { // use hexagonal icons currlayer->icons7x7 = CopyIcons(hexagons7x7, maxstate); currlayer->icons15x15 = CopyIcons(hexagons15x15, maxstate); currlayer->icons31x31 = CopyIcons(hexagons31x31, maxstate); } else if (currlayer->algo->getgridtype() == lifealgo::VN_GRID) { // use diamond-shaped icons for 4-neighbor von Neumann neighborhood currlayer->icons7x7 = CopyIcons(diamonds7x7, maxstate); currlayer->icons15x15 = CopyIcons(diamonds15x15, maxstate); currlayer->icons31x31 = CopyIcons(diamonds31x31, maxstate); } else { // otherwise use default icons from current algo AlgoData* ad = algoinfo[currlayer->algtype]; currlayer->icons7x7 = CopyIcons(ad->icons7x7, maxstate); currlayer->icons15x15 = CopyIcons(ad->icons15x15, maxstate); currlayer->icons31x31 = CopyIcons(ad->icons31x31, maxstate); } } // ----------------------------------------------------------------------------- static bool MultiColorBitmaps(wxBitmap** iconmaps, int maxstate) { // return true if any icon contains at least one color that isn't a shade of gray for (int n = 1; n <= maxstate; n++) { wxBitmap* icon = iconmaps[n]; if (icon) { int wd = icon->GetWidth(); int ht = icon->GetHeight(); wxAlphaPixelData icondata(*icon); if (icondata) { wxAlphaPixelData::Iterator iconpxl(icondata); for (int i = 0; i < ht; i++) { wxAlphaPixelData::Iterator iconrow = iconpxl; for (int j = 0; j < wd; j++) { unsigned char r = iconpxl.Red(); unsigned char g = iconpxl.Green(); unsigned char b = iconpxl.Blue(); if (r != g || g != b) return true; iconpxl++; } // move to next row iconpxl = iconrow; iconpxl.OffsetY(icondata, 1); } } } } return false; // all icons are grayscale } // ----------------------------------------------------------------------------- static void SetAverageColor(int state, wxBitmap* icon) { // set non-icon color to average color of non-black pixels in given icon if (icon) { int wd = icon->GetWidth(); int ht = icon->GetHeight(); wxAlphaPixelData icondata(*icon); if (icondata) { wxAlphaPixelData::Iterator iconpxl(icondata); int nbcount = 0; // # of non-black pixels int totalr = 0; int totalg = 0; int totalb = 0; for (int i = 0; i < ht; i++) { wxAlphaPixelData::Iterator iconrow = iconpxl; for (int j = 0; j < wd; j++) { if (iconpxl.Red() || iconpxl.Green() || iconpxl.Blue()) { // non-black pixel totalr += iconpxl.Red(); totalg += iconpxl.Green(); totalb += iconpxl.Blue(); nbcount++; } iconpxl++; } // move to next row of icon bitmap iconpxl = iconrow; iconpxl.OffsetY(icondata, 1); } if (nbcount>0) { currlayer->cellr[state] = int(totalr / nbcount); currlayer->cellg[state] = int(totalg / nbcount); currlayer->cellb[state] = int(totalb / nbcount); } else { // avoid div0 currlayer->cellr[state] = 0; currlayer->cellg[state] = 0; currlayer->cellb[state] = 0; } } } } // ----------------------------------------------------------------------------- void UpdateCurrentColors() { // set current layer's colors and icons according to current algo and rule AlgoData* ad = algoinfo[currlayer->algtype]; int maxstate = currlayer->algo->NumCellStates() - 1; // copy default colors from current algo currlayer->fromrgb = ad->fromrgb; currlayer->torgb = ad->torgb; if (ad->gradient) { CreateColorGradient(); // state 0 is not part of the gradient currlayer->cellr[0] = ad->algor[0]; currlayer->cellg[0] = ad->algog[0]; currlayer->cellb[0] = ad->algob[0]; } else { for (int n = 0; n <= maxstate; n++) { currlayer->cellr[n] = ad->algor[n]; currlayer->cellg[n] = ad->algog[n]; currlayer->cellb[n] = ad->algob[n]; } } wxString rulename = wxString(currlayer->algo->getrule(), wxConvLocal); // replace any '\' and '/' chars with underscores; // ie. given 12/34/6 we look for 12_34_6.rule rulename.Replace(wxT("\\"), wxT("_")); rulename.Replace(wxT("/"), wxT("_")); // strip off any suffix like ":T100,200" used to specify a bounded grid if (rulename.Find(':') >= 0) rulename = rulename.BeforeFirst(':'); // deallocate current layer's old icons DeleteIcons(currlayer); // this flag will change if any icon uses a non-grayscale color currlayer->multicoloricons = false; bool loadedcolors = false; bool loadedicons = false; // look for rulename.rule first FILE* rulefile = FindRuleFile(rulename); if (rulefile) { LoadRuleInfo(rulefile, rulename, &loadedcolors, &loadedicons); if (!loadedcolors || !loadedicons) { // if rulename has the form foo-* then look for foo-shared.rule // and load its colors and/or icons wxString prefix = rulename.BeforeLast('-'); if (!prefix.IsEmpty() && !rulename.EndsWith(wxT("-shared"))) { rulename = prefix + wxT("-shared"); rulefile = FindRuleFile(rulename); if (rulefile) LoadRuleInfo(rulefile, rulename, &loadedcolors, &loadedicons); } } if (!loadedicons) UseDefaultIcons(maxstate); // use the smallest icons to check if they are multi-color if (currlayer->icons7x7 && MultiColorBitmaps(currlayer->icons7x7, maxstate)) currlayer->multicoloricons = true; // if the icons are multi-color then we don't call SetAverageColor as we do below // (better if the .rule file sets the appropriate non-icon colors) } else { // no rulename.rule so look for deprecated rulename.colors and/or rulename.icons loadedcolors = LoadRuleColors(rulename, maxstate); loadedicons = LoadRuleIcons(rulename, maxstate); if (!loadedicons) UseDefaultIcons(maxstate); // if rulename.colors wasn't supplied and icons are multi-color then we set // non-icon colors to the average of the non-black pixels in each icon // (note that we use the 7x7 icons because they are faster to scan) wxBitmap** iconmaps = currlayer->icons7x7; if (!loadedcolors && iconmaps && currlayer->multicoloricons) { for (int n = 1; n <= maxstate; n++) { SetAverageColor(n, iconmaps[n]); } // if extra 15x15 icon was supplied then use it to set state 0 color iconmaps = currlayer->icons15x15; if (iconmaps && iconmaps[0]) { wxAlphaPixelData icondata(*iconmaps[0]); if (icondata) { wxAlphaPixelData::Iterator iconpxl(icondata); // iconpxl is the top left pixel currlayer->cellr[0] = iconpxl.Red(); currlayer->cellg[0] = iconpxl.Green(); currlayer->cellb[0] = iconpxl.Blue(); } } } } if (swapcolors) { // invert cell colors in current layer for (int n = 0; n <= maxstate; n++) { currlayer->cellr[n] = 255 - currlayer->cellr[n]; currlayer->cellg[n] = 255 - currlayer->cellg[n]; currlayer->cellb[n] = 255 - currlayer->cellb[n]; } } } // ----------------------------------------------------------------------------- void UpdateLayerColors() { UpdateCurrentColors(); // if current layer has clones then update their colors UpdateCloneColors(); } // ----------------------------------------------------------------------------- void InvertCellColors() { // invert cell colors in all layers for (int i = 0; i < numlayers; i++) { Layer* layerptr = layer[i]; // do NOT use layerptr->algo->... here -- it might not be correct // for a non-current layer (but we can use layerptr->algtype) for (int n = 0; n < algoinfo[layerptr->algtype]->maxstates; n++) { layerptr->cellr[n] = 255 - layerptr->cellr[n]; layerptr->cellg[n] = 255 - layerptr->cellg[n]; layerptr->cellb[n] = 255 - layerptr->cellb[n]; } UpdateBrushAndPens(layerptr); } } // ----------------------------------------------------------------------------- Layer* GetLayer(int index) { if (index < 0 || index >= numlayers) { Warning(_("Bad index in GetLayer!")); return NULL; } else { return layer[index]; } } // ----------------------------------------------------------------------------- int GetUniqueCloneID() { // find first available index (> 0) to use as cloneid for (int i = 1; i < MAX_LAYERS; i++) { if (cloneavail[i]) { cloneavail[i] = false; return i; } } // bug if we get here Warning(_("Bug in GetUniqueCloneID!")); return 1; } // ----------------------------------------------------------------------------- Layer::Layer() { if (!cloning) { // use a unique temporary file for saving starting patterns tempstart = wxFileName::CreateTempFileName(tempdir + wxT("golly_start_")); } dirty = false; // user has not modified pattern savedirty = false; // in case script created layer stayclean = inscript; // if true then keep the dirty flag false // for the duration of the script savestart = false; // no need to save starting pattern startfile.Clear(); // no starting pattern startgen = 0; // initial starting generation currname = _("untitled"); // initial window title currfile.Clear(); // no pattern file has been loaded originx = 0; // no X origin offset originy = 0; // no Y origin offset icons7x7 = NULL; // no 7x7 icons icons15x15 = NULL; // no 15x15 icons icons31x31 = NULL; // no 31x31 icons currframe = 0; // first frame in timeline autoplay = 0; // not playing tlspeed = 0; // default speed for autoplay lastframe = 0; // no frame displayed deadbrush = new wxBrush(*wxBLACK); gridpen = new wxPen(*wxBLACK); boldpen = new wxPen(*wxBLACK); if (deadbrush == NULL) Fatal(_("Failed to create deadbrush!")); if (gridpen == NULL) Fatal(_("Failed to create gridpen!")); if (boldpen == NULL) Fatal(_("Failed to create boldpen!")); // create viewport; the initial size is not important because it will soon change view = new viewport(100,100); if (view == NULL) Fatal(_("Failed to create viewport!")); if (numlayers == 0) { // creating very first layer (can't be a clone) cloneid = 0; // initialize cloneavail array (cloneavail[0] is never used) cloneavail[0] = false; for (int i = 1; i < MAX_LAYERS; i++) cloneavail[i] = true; // set some options using initial values stored in prefs file algtype = initalgo; hyperspeed = inithyperspeed; showhashinfo = initshowhashinfo; autofit = initautofit; // initial base step and exponent currbase = algoinfo[algtype]->defbase; currexpo = 0; // create empty universe algo = CreateNewUniverse(algtype); // set rule using initrule stored in prefs file const char* err = algo->setrule(initrule); if (err) { // user might have edited rule in prefs file, or deleted table/tree file algo->setrule( algo->DefaultRule() ); } // don't need to remember rule here (SaveLayerSettings will do it) rule = wxEmptyString; // initialize undo/redo history undoredo = new UndoRedo(); if (undoredo == NULL) Fatal(_("Failed to create new undo/redo object!")); // set cursor in case newcurs/opencurs are set to "No Change" curs = curs_pencil; drawingstate = 1; } else { // adding a new layer after currlayer (see AddLayer) // inherit current universe type and other settings algtype = currlayer->algtype; hyperspeed = currlayer->hyperspeed; showhashinfo = currlayer->showhashinfo; autofit = currlayer->autofit; // initial base step and exponent currbase = algoinfo[algtype]->defbase; currexpo = 0; if (cloning) { if (currlayer->cloneid == 0) { // first time this universe is being cloned so need a unique cloneid cloneid = GetUniqueCloneID(); currlayer->cloneid = cloneid; // current layer also becomes a clone numclones += 2; } else { // we're cloning an existing clone cloneid = currlayer->cloneid; numclones++; } // clones share the same universe and undo/redo history algo = currlayer->algo; undoredo = currlayer->undoredo; // clones also share the same timeline currframe = currlayer->currframe; autoplay = currlayer->autoplay; tlspeed = currlayer->tlspeed; lastframe = currlayer->lastframe; // clones use same name for starting file tempstart = currlayer->tempstart; } else { // this layer isn't a clone cloneid = 0; // create empty universe algo = CreateNewUniverse(algtype); // use current rule const char* err = algo->setrule(currlayer->algo->getrule()); if (err) { // table/tree file might have been deleted algo->setrule( algo->DefaultRule() ); } // initialize undo/redo history undoredo = new UndoRedo(); if (undoredo == NULL) Fatal(_("Failed to create new undo/redo object!")); } // inherit current rule rule = wxString(currlayer->algo->getrule(), wxConvLocal); // inherit current viewport's size, scale and location view->resize( currlayer->view->getwidth(), currlayer->view->getheight() ); view->setpositionmag( currlayer->view->x, currlayer->view->y, currlayer->view->getmag() ); // inherit current cursor and drawing state curs = currlayer->curs; drawingstate = currlayer->drawingstate; if (cloning || duplicating) { // duplicate all the other current settings currname = currlayer->currname; dirty = currlayer->dirty; savedirty = currlayer->savedirty; stayclean = currlayer->stayclean; currbase = currlayer->currbase; currexpo = currlayer->currexpo; autofit = currlayer->autofit; hyperspeed = currlayer->hyperspeed; showhashinfo = currlayer->showhashinfo; originx = currlayer->originx; originy = currlayer->originy; // duplicate selection info currsel = currlayer->currsel; savesel = currlayer->savesel; // duplicate the stuff needed to reset pattern savestart = currlayer->savestart; startalgo = currlayer->startalgo; startdirty = currlayer->startdirty; startname = currlayer->startname; startrule = currlayer->startrule; startx = currlayer->startx; starty = currlayer->starty; startbase = currlayer->startbase; startexpo = currlayer->startexpo; startmag = currlayer->startmag; startfile = currlayer->startfile; startgen = currlayer->startgen; currfile = currlayer->currfile; startsel = currlayer->startsel; } if (duplicating) { // first set same gen count algo->setGeneration( currlayer->algo->getGeneration() ); // duplicate pattern if ( !currlayer->algo->isEmpty() ) { bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { Warning(_("Pattern is too big to duplicate.")); } else { viewptr->CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, algo, false, _("Duplicating layer")); } } // tempstart file must remain unique in duplicate layer if ( wxFileExists(currlayer->tempstart) ) { if ( !wxCopyFile(currlayer->tempstart, tempstart, true) ) { Warning(_("Could not copy tempstart file!")); } } if (currlayer->startfile == currlayer->tempstart) { startfile = tempstart; } if (currlayer->currfile == currlayer->tempstart) { // starting pattern came from clipboard or lexicon pattern currfile = tempstart; } if (allowundo) { // duplicate current undo/redo history in new layer undoredo->DuplicateHistory(currlayer, this); } } } } // ----------------------------------------------------------------------------- Layer::~Layer() { // delete stuff allocated in ctor delete view; delete deadbrush; delete gridpen; delete boldpen; if (cloneid > 0) { // this layer is a clone, so count how many layers have the same cloneid int clonecount = 0; for (int i = 0; i < numlayers; i++) { if (layer[i]->cloneid == cloneid) clonecount++; // tell undo/redo which clone is being deleted if (this == layer[i]) undoredo->DeletingClone(i); } if (clonecount > 2) { // only delete this clone numclones--; } else { // first make this cloneid available for the next clone cloneavail[cloneid] = true; // reset the other cloneid to 0 (should only be one such clone) for (int i = 0; i < numlayers; i++) { // careful -- layer[i] might be this layer if (this != layer[i] && layer[i]->cloneid == cloneid) layer[i]->cloneid = 0; } numclones -= 2; } } else { // this layer is not a clone, so delete universe and undo/redo history delete algo; delete undoredo; // delete tempstart file if it exists if (wxFileExists(tempstart)) wxRemoveFile(tempstart); // deallocate any icons DeleteIcons(this); } } // ----------------------------------------------------------------------------- // define a window for displaying cell colors/icons: const int CELLSIZE = 16; // wd and ht of each cell const int NUMCOLS = 32; // number of columns const int NUMROWS = 8; // number of rows class CellPanel : public wxPanel { public: CellPanel(wxWindow* parent, wxWindowID id) : wxPanel(parent, id, wxPoint(0,0), wxSize(NUMCOLS*CELLSIZE+1,NUMROWS*CELLSIZE+1)) { } wxStaticText* statebox; // for showing state of cell under cursor wxStaticText* rgbbox; // for showing color of cell under cursor private: void OnEraseBackground(wxEraseEvent& event); void OnPaint(wxPaintEvent& event); void OnMouseDown(wxMouseEvent& event); void OnMouseMotion(wxMouseEvent& event); void OnMouseExit(wxMouseEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(CellPanel, wxPanel) EVT_ERASE_BACKGROUND (CellPanel::OnEraseBackground) EVT_PAINT (CellPanel::OnPaint) EVT_LEFT_DOWN (CellPanel::OnMouseDown) EVT_LEFT_DCLICK (CellPanel::OnMouseDown) EVT_MOTION (CellPanel::OnMouseMotion) EVT_ENTER_WINDOW (CellPanel::OnMouseMotion) EVT_LEAVE_WINDOW (CellPanel::OnMouseExit) END_EVENT_TABLE() // ----------------------------------------------------------------------------- void CellPanel::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) { // do nothing } // ----------------------------------------------------------------------------- void CellPanel::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); dc.SetPen(*wxBLACK_PEN); #ifdef __WXMSW__ // we have to use theme background color on Windows wxBrush bgbrush(GetBackgroundColour()); #else wxBrush bgbrush(*wxTRANSPARENT_BRUSH); #endif // draw cell boxes wxBitmap** iconmaps = currlayer->icons15x15; wxRect r = wxRect(0, 0, CELLSIZE+1, CELLSIZE+1); int col = 0; for (int state = 0; state < 256; state++) { if (state < currlayer->algo->NumCellStates()) { if (showicons && iconmaps && iconmaps[state]) { dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); DrawOneIcon(dc, r.x + 1, r.y + 1, iconmaps[state], currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0], currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state], currlayer->multicoloricons); } else { wxColor color(currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state]); dc.SetBrush(wxBrush(color)); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } } else { // state >= currlayer->algo->NumCellStates() dc.SetBrush(bgbrush); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } col++; if (col < NUMCOLS) { r.x += CELLSIZE; } else { r.x = 0; r.y += CELLSIZE; col = 0; } } dc.SetPen(wxNullPen); } // ----------------------------------------------------------------------------- void CellPanel::OnMouseDown(wxMouseEvent& event) { int col = event.GetX() / CELLSIZE; int row = event.GetY() / CELLSIZE; int state = row * NUMCOLS + col; if (state >= 0 && state < currlayer->algo->NumCellStates()) { // let user change color of this cell state wxColour rgb(currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state]); wxColourData data; data.SetChooseFull(true); // for Windows data.SetColour(rgb); wxColourDialog dialog(this, &data); if ( dialog.ShowModal() == wxID_OK ) { wxColourData retData = dialog.GetColourData(); wxColour c = retData.GetColour(); if (rgb != c) { // change color currlayer->cellr[state] = c.Red(); currlayer->cellg[state] = c.Green(); currlayer->cellb[state] = c.Blue(); Refresh(false); } } } event.Skip(); } // ----------------------------------------------------------------------------- void CellPanel::OnMouseMotion(wxMouseEvent& event) { int col = event.GetX() / CELLSIZE; int row = event.GetY() / CELLSIZE; int state = row * NUMCOLS + col; if (state < 0 || state > 255) { statebox->SetLabel(_(" ")); rgbbox->SetLabel(_(" ")); } else { statebox->SetLabel(wxString::Format(_("%d"),state)); if (state < currlayer->algo->NumCellStates()) { rgbbox->SetLabel(wxString::Format(_("%d,%d,%d"), currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state])); } else { rgbbox->SetLabel(_(" ")); } } } // ----------------------------------------------------------------------------- void CellPanel::OnMouseExit(wxMouseEvent& WXUNUSED(event)) { statebox->SetLabel(_(" ")); rgbbox->SetLabel(_(" ")); } // ----------------------------------------------------------------------------- // define a modal dialog for changing colors class ColorDialog : public wxDialog { public: ColorDialog(wxWindow* parent); virtual bool TransferDataFromWindow(); // called when user hits OK enum { // control ids CELL_PANEL = wxID_HIGHEST + 1, ICON_CHECK, STATE_BOX, RGB_BOX, GRADIENT_BUTT, FROM_BUTT, TO_BUTT, DEFAULT_BUTT }; void CreateControls(); // initialize all the controls void AddColorButton(wxWindow* parent, wxBoxSizer* hbox, int id, wxColor* rgb); void ChangeButtonColor(int id, wxColor* rgb); void UpdateButtonColor(int id, wxColor* rgb); CellPanel* cellpanel; // for displaying cell colors/icons wxCheckBox* iconcheck; // show icons? private: // event handlers void OnCheckBoxClicked(wxCommandEvent& event); void OnButton(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(ColorDialog, wxDialog) EVT_CHECKBOX (wxID_ANY, ColorDialog::OnCheckBoxClicked) EVT_BUTTON (wxID_ANY, ColorDialog::OnButton) END_EVENT_TABLE() // ----------------------------------------------------------------------------- // these consts are used to get nicely spaced controls on each platform: const int HGAP = 12; // space left and right of vertically stacked boxes // following ensures OK/Cancel buttons are better aligned #ifdef __WXMAC__ const int STDHGAP = 0; #elif defined(__WXMSW__) const int STDHGAP = 9; #else const int STDHGAP = 10; #endif const int BITMAP_WD = 60; // width of bitmap in color buttons const int BITMAP_HT = 20; // height of bitmap in color buttons // ----------------------------------------------------------------------------- ColorDialog::ColorDialog(wxWindow* parent) { Create(parent, wxID_ANY, _("Set Layer Colors"), wxDefaultPosition, wxDefaultSize); CreateControls(); Centre(); } // ----------------------------------------------------------------------------- void ColorDialog::CreateControls() { wxString note = _("NOTE: Changes made here are temporary and only affect the current layer and "); note += _("its clones. The colors will be reset to their default values if you open "); note += _("a pattern file or create a new pattern, or if you change the current algorithm "); note += _("or rule. If you want to change the default colors, use Preferences > Color."); wxStaticText* notebox = new wxStaticText(this, wxID_STATIC, note); notebox->Wrap(NUMCOLS * CELLSIZE + 1); // create bitmap buttons wxBoxSizer* frombox = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* tobox = new wxBoxSizer(wxHORIZONTAL); AddColorButton(this, frombox, FROM_BUTT, &currlayer->fromrgb); AddColorButton(this, tobox, TO_BUTT, &currlayer->torgb); wxButton* defbutt = new wxButton(this, DEFAULT_BUTT, _("Default Colors")); wxButton* gradbutt = new wxButton(this, GRADIENT_BUTT, _("Create Gradient")); wxBoxSizer* gradbox = new wxBoxSizer(wxHORIZONTAL); gradbox->Add(gradbutt, 0, wxALIGN_CENTER_VERTICAL, 0); gradbox->Add(new wxStaticText(this, wxID_STATIC, _(" from ")), 0, wxALIGN_CENTER_VERTICAL, 0); gradbox->Add(frombox, 0, wxALIGN_CENTER_VERTICAL, 0); gradbox->Add(new wxStaticText(this, wxID_STATIC, _(" to ")), 0, wxALIGN_CENTER_VERTICAL, 0); gradbox->Add(tobox, 0, wxALIGN_CENTER_VERTICAL, 0); // create child window for displaying cell colors/icons cellpanel = new CellPanel(this, CELL_PANEL); iconcheck = new wxCheckBox(this, ICON_CHECK, _("Show icons")); iconcheck->SetValue(showicons); wxStaticText* statebox = new wxStaticText(this, STATE_BOX, _("999")); cellpanel->statebox = statebox; wxBoxSizer* hbox1 = new wxBoxSizer(wxHORIZONTAL); hbox1->Add(statebox, 0, 0, 0); hbox1->SetMinSize( hbox1->GetMinSize() ); wxStaticText* rgbbox = new wxStaticText(this, RGB_BOX, _("999,999,999")); cellpanel->rgbbox = rgbbox; wxBoxSizer* hbox2 = new wxBoxSizer(wxHORIZONTAL); hbox2->Add(rgbbox, 0, 0, 0); hbox2->SetMinSize( hbox2->GetMinSize() ); statebox->SetLabel(_(" ")); rgbbox->SetLabel(_(" ")); wxBoxSizer* botbox = new wxBoxSizer(wxHORIZONTAL); botbox->Add(new wxStaticText(this, wxID_STATIC, _("State: ")), 0, wxALIGN_CENTER_VERTICAL, 0); botbox->Add(hbox1, 0, wxALIGN_CENTER_VERTICAL, 0); botbox->Add(20, 0, 0); botbox->Add(new wxStaticText(this, wxID_STATIC, _("RGB: ")), 0, wxALIGN_CENTER_VERTICAL, 0); botbox->Add(hbox2, 0, wxALIGN_CENTER_VERTICAL, 0); botbox->AddStretchSpacer(); botbox->Add(iconcheck, 0, wxALIGN_CENTER_VERTICAL, 0); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); vbox->Add(gradbox, 0, wxALIGN_CENTER, 0); vbox->AddSpacer(10); vbox->Add(cellpanel, 0, wxLEFT | wxRIGHT, 0); vbox->AddSpacer(5); vbox->Add(botbox, 1, wxGROW | wxLEFT | wxRIGHT, 0); wxSizer* stdbutts = CreateButtonSizer(wxOK | wxCANCEL); wxBoxSizer* stdhbox = new wxBoxSizer( wxHORIZONTAL ); stdhbox->Add(defbutt, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, HGAP); stdhbox->Add(stdbutts, 1, wxGROW | wxALIGN_CENTER_VERTICAL | wxRIGHT, STDHGAP); wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); topSizer->AddSpacer(10); topSizer->Add(notebox, 0, wxLEFT | wxRIGHT, HGAP); topSizer->AddSpacer(20); topSizer->Add(vbox, 0, wxGROW | wxLEFT | wxRIGHT, HGAP); topSizer->AddSpacer(10); topSizer->Add(stdhbox, 1, wxGROW | wxTOP | wxBOTTOM, 10); SetSizer(topSizer); topSizer->SetSizeHints(this); // calls Fit } // ----------------------------------------------------------------------------- void ColorDialog::OnCheckBoxClicked(wxCommandEvent& event) { if ( event.GetId() == ICON_CHECK ) { showicons = iconcheck->GetValue() == 1; cellpanel->Refresh(false); } } // ----------------------------------------------------------------------------- void ColorDialog::AddColorButton(wxWindow* parent, wxBoxSizer* hbox, int id, wxColor* rgb) { wxBitmap bitmap(BITMAP_WD, BITMAP_HT); wxMemoryDC dc; dc.SelectObject(bitmap); wxRect rect(0, 0, BITMAP_WD, BITMAP_HT); wxBrush brush(*rgb); FillRect(dc, rect, brush); dc.SelectObject(wxNullBitmap); wxBitmapButton* bb = new wxBitmapButton(parent, id, bitmap, wxPoint(0,0), #if defined(__WXOSX_COCOA__) wxSize(BITMAP_WD + 12, BITMAP_HT + 12)); #else wxDefaultSize); #endif if (bb) hbox->Add(bb, 0, wxALIGN_CENTER_VERTICAL, 0); } // ----------------------------------------------------------------------------- void ColorDialog::UpdateButtonColor(int id, wxColor* rgb) { wxBitmapButton* bb = (wxBitmapButton*) FindWindow(id); if (bb) { wxBitmap bitmap(BITMAP_WD, BITMAP_HT); wxMemoryDC dc; dc.SelectObject(bitmap); wxRect rect(0, 0, BITMAP_WD, BITMAP_HT); wxBrush brush(*rgb); FillRect(dc, rect, brush); dc.SelectObject(wxNullBitmap); bb->SetBitmapLabel(bitmap); bb->Refresh(); } } // ----------------------------------------------------------------------------- void ColorDialog::ChangeButtonColor(int id, wxColor* rgb) { wxColourData data; data.SetChooseFull(true); // for Windows data.SetColour(*rgb); wxColourDialog dialog(this, &data); if ( dialog.ShowModal() == wxID_OK ) { wxColourData retData = dialog.GetColourData(); wxColour c = retData.GetColour(); if (*rgb != c) { // change given color rgb->Set(c.Red(), c.Green(), c.Blue()); // also change color of bitmap in corresponding button UpdateButtonColor(id, rgb); cellpanel->Refresh(false); } } } // ----------------------------------------------------------------------------- void ColorDialog::OnButton(wxCommandEvent& event) { int id = event.GetId(); if ( id == FROM_BUTT ) { ChangeButtonColor(id, &currlayer->fromrgb); } else if ( id == TO_BUTT ) { ChangeButtonColor(id, &currlayer->torgb); } else if ( id == GRADIENT_BUTT ) { // use currlayer->fromrgb and currlayer->torgb CreateColorGradient(); cellpanel->Refresh(false); } else if ( id == DEFAULT_BUTT ) { // restore current layer's default colors, but don't call UpdateLayerColors // here because we don't want to change any clone layers at this stage // (in case user cancels dialog) UpdateCurrentColors(); UpdateButtonColor(FROM_BUTT, &currlayer->fromrgb); UpdateButtonColor(TO_BUTT, &currlayer->torgb); cellpanel->Refresh(false); } else { // process other buttons like Cancel and OK event.Skip(); } } // ----------------------------------------------------------------------------- bool ColorDialog::TransferDataFromWindow() { // if current layer has clones then update their colors UpdateCloneColors(); return true; } // ----------------------------------------------------------------------------- // class for saving and restoring layer colors class SaveData { public: SaveData() { fromrgb = currlayer->fromrgb; torgb = currlayer->torgb; for (int i = 0; i < currlayer->algo->NumCellStates(); i++) { cellr[i] = currlayer->cellr[i]; cellg[i] = currlayer->cellg[i]; cellb[i] = currlayer->cellb[i]; } deadbrushrgb = currlayer->deadbrush->GetColour(); gridpenrgb = currlayer->gridpen->GetColour(); boldpenrgb = currlayer->boldpen->GetColour(); saveshowicons = showicons; } void RestoreData() { currlayer->fromrgb = fromrgb; currlayer->torgb = torgb; for (int i = 0; i < currlayer->algo->NumCellStates(); i++) { currlayer->cellr[i] = cellr[i]; currlayer->cellg[i] = cellg[i]; currlayer->cellb[i] = cellb[i]; } currlayer->deadbrush->SetColour(deadbrushrgb); currlayer->gridpen->SetColour(gridpenrgb); currlayer->boldpen->SetColour(boldpenrgb); showicons = saveshowicons; } // this must match color info in Layer class wxColor fromrgb; wxColor torgb; unsigned char cellr[256]; unsigned char cellg[256]; unsigned char cellb[256]; wxColor deadbrushrgb; wxColor gridpenrgb; wxColor boldpenrgb; // we also save/restore showicons option bool saveshowicons; }; // ----------------------------------------------------------------------------- void SetLayerColors() { if (inscript || viewptr->waitingforclick) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_SET_COLORS); return; } bool wastoggled = swapcolors; if (swapcolors) viewptr->ToggleCellColors(); // save current color info so we can restore it if user cancels changes SaveData* save_info = new SaveData(); ColorDialog dialog( wxGetApp().GetTopWindow() ); if ( dialog.ShowModal() != wxID_OK ) { // user hit Cancel so restore color info saved above save_info->RestoreData(); } delete save_info; if (wastoggled) viewptr->ToggleCellColors(); mainptr->UpdateEverything(); } �golly-2.5-src/gui-wx/wxmain.cpp���������������������������������������������������������������������0000644�0001751�0000144�00000332714�12156145314�013454� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #if wxUSE_TOOLTIPS #include "wx/tooltip.h" // for wxToolTip #endif #include "wx/dnd.h" // for wxFileDropTarget #include "wx/filename.h" // for wxFileName #include "wx/dir.h" // for wxDir #include "wx/clipbrd.h" // for wxTheClipboard #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "wxgolly.h" // for wxGetApp, statusptr, viewptr, bigview #include "wxutils.h" // for Warning, Fatal, etc #include "wxprefs.h" // for gollydir, datadir, SavePrefs, etc #include "wxinfo.h" // for ShowInfo, GetInfoFrame #include "wxhelp.h" // for ShowHelp, GetHelpFrame #include "wxstatus.h" // for statusptr->... #include "wxview.h" // for viewptr->... #include "wxrender.h" // for InitDrawingData, DestroyDrawingData, etc #include "wxedit.h" // for CreateEditBar, EditBarHeight, etc #include "wxscript.h" // for inscript #include "wxalgos.h" // for algo_type, algomenu, algomenupop #include "wxlayer.h" // for AddLayer, MAX_LAYERS, currlayer #include "wxundo.h" // for currlayer->undoredo->... #include "wxtimeline.h" // for CreateTimelineBar, TimelineExists, etc #include "wxmain.h" #ifdef __WXMAC__ #include <Carbon/Carbon.h> // for GetCurrentProcess, etc #endif #ifdef USING_VISUAL_LEAK_DETECTOR #include <vld.h> #endif // ----------------------------------------------------------------------------- // one-shot timer to fix problems in wxMac and wxGTK -- see OnOneTimer; // must be static global because it's used in DnDFile::OnDropFiles static wxTimer* onetimer; #ifdef __WXMSW__ static bool call_unselect = false; // OnIdle needs to call Unselect? static wxString editpath = wxEmptyString; // OnIdle calls EditFile if this isn't empty static bool ignore_selection = false; // ignore spurious selection? #endif static bool call_close = false; // OnIdle needs to call Close? static bool edit_file = false; // edit the clicked file? // ----------------------------------------------------------------------------- // ids for bitmap buttons in tool bar enum { START_TOOL = 0, STOP_TOOL, RESET_TOOL, ALGO_TOOL, AUTOFIT_TOOL, HYPER_TOOL, NEW_TOOL, OPEN_TOOL, SAVE_TOOL, PATTERNS_TOOL, SCRIPTS_TOOL, INFO_TOOL, HELP_TOOL, NUM_BUTTONS // must be last }; #ifdef __WXMSW__ // bitmaps are loaded via .rc file #else // bitmaps for tool bar buttons #include "bitmaps/play.xpm" #include "bitmaps/stop.xpm" #include "bitmaps/reset.xpm" #include "bitmaps/algo.xpm" #include "bitmaps/autofit.xpm" #include "bitmaps/hyper.xpm" #include "bitmaps/new.xpm" #include "bitmaps/open.xpm" #include "bitmaps/save.xpm" #include "bitmaps/patterns.xpm" #include "bitmaps/scripts.xpm" #include "bitmaps/info.xpm" #include "bitmaps/help.xpm" // bitmaps for down state of toggle buttons #include "bitmaps/autofit_down.xpm" #include "bitmaps/hyper_down.xpm" #include "bitmaps/patterns_down.xpm" #include "bitmaps/scripts_down.xpm" #endif // ----------------------------------------------------------------------------- // Define our own vertical tool bar to avoid bugs and limitations in wxToolBar: // derive from wxPanel so we get current theme's background color on Windows class ToolBar : public wxPanel { public: ToolBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht); ~ToolBar() {} // add a bitmap button to tool bar void AddButton(int id, const wxString& tip); // add a vertical gap between buttons void AddSeparator(); // enable/disable button void EnableButton(int id, bool enable); // set state of start/stop button void SetStartStopButton(); // set state of a toggle button void SelectButton(int id, bool select); // detect press and release of a bitmap button void OnButtonDown(wxMouseEvent& event); void OnButtonUp(wxMouseEvent& event); void OnKillFocus(wxFocusEvent& event); private: // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() // event handlers void OnPaint(wxPaintEvent& event); void OnMouseDown(wxMouseEvent& event); void OnButton(wxCommandEvent& event); // bitmaps for normal or down state wxBitmap normtool[NUM_BUTTONS]; wxBitmap downtool[NUM_BUTTONS]; #ifdef __WXMSW__ // on Windows we need bitmaps for disabled buttons wxBitmap disnormtool[NUM_BUTTONS]; wxBitmap disdowntool[NUM_BUTTONS]; #endif // remember state of toggle buttons to avoid unnecessary drawing; // 0 = not yet initialized, 1 = selected, -1 = not selected int buttstate[NUM_BUTTONS]; // positioning data used by AddButton and AddSeparator int ypos, xpos, smallgap, biggap; }; BEGIN_EVENT_TABLE(ToolBar, wxPanel) EVT_PAINT ( ToolBar::OnPaint) EVT_LEFT_DOWN ( ToolBar::OnMouseDown) EVT_BUTTON (wxID_ANY, ToolBar::OnButton) END_EVENT_TABLE() ToolBar* toolbarptr = NULL; // global pointer to tool bar const int toolbarwd = 32; // width of (vertical) tool bar // tool bar buttons (must be global to use Connect/Disconnect on Windows) wxBitmapButton* tbbutt[NUM_BUTTONS]; // width and height of bitmap buttons #if defined(__WXOSX_COCOA__) || defined(__WXGTK__) const int BUTTON_WD = 28; const int BUTTON_HT = 28; #else const int BUTTON_WD = 24; const int BUTTON_HT = 24; #endif // ----------------------------------------------------------------------------- ToolBar::ToolBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht) : wxPanel(parent, wxID_ANY, wxPoint(xorg,yorg), wxSize(wd,ht), wxNO_FULL_REPAINT_ON_RESIZE) { #ifdef __WXGTK__ // avoid erasing background on GTK+ SetBackgroundStyle(wxBG_STYLE_CUSTOM); #endif // init bitmaps for normal state normtool[START_TOOL] = wxBITMAP(play); normtool[STOP_TOOL] = wxBITMAP(stop); normtool[RESET_TOOL] = wxBITMAP(reset); normtool[ALGO_TOOL] = wxBITMAP(algo); normtool[AUTOFIT_TOOL] = wxBITMAP(autofit); normtool[HYPER_TOOL] = wxBITMAP(hyper); normtool[NEW_TOOL] = wxBITMAP(new); normtool[OPEN_TOOL] = wxBITMAP(open); normtool[SAVE_TOOL] = wxBITMAP(save); normtool[PATTERNS_TOOL] = wxBITMAP(patterns); normtool[SCRIPTS_TOOL] = wxBITMAP(scripts); normtool[INFO_TOOL] = wxBITMAP(info); normtool[HELP_TOOL] = wxBITMAP(help); // toggle buttons also have a down state downtool[AUTOFIT_TOOL] = wxBITMAP(autofit_down); downtool[HYPER_TOOL] = wxBITMAP(hyper_down); downtool[PATTERNS_TOOL] = wxBITMAP(patterns_down); downtool[SCRIPTS_TOOL] = wxBITMAP(scripts_down); #ifdef __WXMSW__ for (int i = 0; i < NUM_BUTTONS; i++) { CreatePaleBitmap(normtool[i], disnormtool[i]); } CreatePaleBitmap(downtool[AUTOFIT_TOOL], disdowntool[AUTOFIT_TOOL]); CreatePaleBitmap(downtool[HYPER_TOOL], disdowntool[HYPER_TOOL]); CreatePaleBitmap(downtool[PATTERNS_TOOL], disdowntool[PATTERNS_TOOL]); CreatePaleBitmap(downtool[SCRIPTS_TOOL], disdowntool[SCRIPTS_TOOL]); #endif for (int i = 0; i < NUM_BUTTONS; i++) { buttstate[i] = 0; } // init position variables used by AddButton and AddSeparator #ifdef __WXGTK__ // buttons are a different size in wxGTK xpos = 2; ypos = 2; smallgap = 6; #else xpos = (32 - BUTTON_WD) / 2; ypos = (32 - BUTTON_HT) / 2; smallgap = 4; #endif biggap = 16; } // ----------------------------------------------------------------------------- void ToolBar::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); int wd, ht; GetClientSize(&wd, &ht); if (wd < 1 || ht < 1 || !showtool) return; wxRect r = wxRect(0, 0, wd, ht); #ifdef __WXMSW__ dc.Clear(); // draw gray line at top edge dc.SetPen(*wxGREY_PEN); dc.DrawLine(0, 0, r.width, 0); dc.SetPen(wxNullPen); #else // draw gray line at right edge #ifdef __WXMAC__ wxBrush brush(wxColor(202,202,202)); FillRect(dc, r, brush); wxPen linepen(wxColor(140,140,140)); dc.SetPen(linepen); #else dc.SetPen(*wxLIGHT_GREY_PEN); #endif dc.DrawLine(r.GetRight(), 0, r.GetRight(), r.height); dc.SetPen(wxNullPen); #endif } // ----------------------------------------------------------------------------- void ToolBar::OnMouseDown(wxMouseEvent& WXUNUSED(event)) { // this is NOT called if user clicks a tool bar button; // on Windows we need to reset keyboard focus to viewport window viewptr->SetFocus(); } // ----------------------------------------------------------------------------- void ToolBar::OnButton(wxCommandEvent& event) { int id = event.GetId(); int cmdid; switch (id) { case START_TOOL: cmdid = ID_START; break; case RESET_TOOL: cmdid = ID_RESET; break; case ALGO_TOOL: return; // handled in OnButtonDown case AUTOFIT_TOOL: cmdid = ID_AUTO; break; case HYPER_TOOL: cmdid = ID_HYPER; break; case NEW_TOOL: cmdid = wxID_NEW; break; case OPEN_TOOL: cmdid = wxID_OPEN; break; case SAVE_TOOL: cmdid = wxID_SAVE; break; case PATTERNS_TOOL: cmdid = ID_SHOW_PATTERNS; break; case SCRIPTS_TOOL: cmdid = ID_SHOW_SCRIPTS; break; case INFO_TOOL: cmdid = ID_INFO; break; case HELP_TOOL: cmdid = ID_HELP_BUTT; break; default: Warning(_("Unexpected button id!")); return; } // call MainFrame::OnMenu after OnButton finishes; // this avoids start/stop button problem in GTK app wxCommandEvent cmdevt(wxEVT_COMMAND_MENU_SELECTED, cmdid); wxPostEvent(mainptr->GetEventHandler(), cmdevt); // avoid weird bug on Mac where all buttons can be disabled after hitting // RESET_TOOL button *and* the "All controls" option is ticked in // System Prefs > Keyboard & Mouse > Keyboard Shortcuts // (might also fix similar problem on Windows) viewptr->SetFocus(); } // ----------------------------------------------------------------------------- void ToolBar::OnKillFocus(wxFocusEvent& event) { int id = event.GetId(); tbbutt[id]->SetFocus(); // don't let button lose focus } // ----------------------------------------------------------------------------- void ToolBar::OnButtonDown(wxMouseEvent& event) { // a tool bar button has been pressed int id = event.GetId(); #ifdef __WXMSW__ // connect a handler that keeps focus with the pressed button if (id != ALGO_TOOL) tbbutt[id]->Connect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(ToolBar::OnKillFocus)); #endif #ifdef __WXMAC__ // close any open tool tip window (probably wxMac bug) wxToolTip::RemoveToolTips(); #endif // we want pop-up menu to appear as soon as ALGO_TOOL button is pressed //!!! doesn't work 100% correctly on Windows if (id == ALGO_TOOL) { // we use algomenupop here rather than algomenu to avoid assert messages in wx 2.9+ #ifdef __WXMSW__ tbbutt[id]->PopupMenu(algomenupop, 0, 25); // fix prob on Win (almost -- button-up doesn't always close menu) viewptr->SetFocus(); return; #else tbbutt[id]->PopupMenu(algomenupop, 0, 30); #endif #ifdef __WXOSX_COCOA__ viewptr->SetFocus(); // don't call event.Skip() otherwise algo button will remain selected return; #endif } event.Skip(); } // ----------------------------------------------------------------------------- void ToolBar::OnButtonUp(wxMouseEvent& event) { // a tool bar button has been released (only called in wxMSW) int id = event.GetId(); wxPoint pt = tbbutt[id]->ScreenToClient( wxGetMousePosition() ); int wd, ht; tbbutt[id]->GetClientSize(&wd, &ht); wxRect r(0, 0, wd, ht); // diconnect kill-focus handler if (id != ALGO_TOOL) tbbutt[id]->Disconnect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(ToolBar::OnKillFocus)); viewptr->SetFocus(); if ( r.Contains(pt) ) { // call OnButton wxCommandEvent buttevt(wxEVT_COMMAND_BUTTON_CLICKED, id); buttevt.SetEventObject(tbbutt[id]); tbbutt[id]->GetEventHandler()->ProcessEvent(buttevt); } } // ----------------------------------------------------------------------------- void ToolBar::AddButton(int id, const wxString& tip) { tbbutt[id] = new wxBitmapButton(this, id, normtool[id], wxPoint(xpos,ypos), wxSize(BUTTON_WD, BUTTON_HT)); if (tbbutt[id] == NULL) { Fatal(_("Failed to create tool bar button!")); } else { ypos += BUTTON_HT + smallgap; tbbutt[id]->SetToolTip(tip); #ifdef __WXMSW__ // fix problem with tool bar buttons when generating/inscript // due to focus being changed to viewptr tbbutt[id]->Connect(id, wxEVT_LEFT_DOWN, wxMouseEventHandler(ToolBar::OnButtonDown)); tbbutt[id]->Connect(id, wxEVT_LEFT_UP, wxMouseEventHandler(ToolBar::OnButtonUp)); #else // allow pop-up menu to appear as soon as ALGO_TOOL button is pressed tbbutt[id]->Connect(id, wxEVT_LEFT_DOWN, wxMouseEventHandler(ToolBar::OnButtonDown)); #endif } } // ----------------------------------------------------------------------------- void ToolBar::AddSeparator() { ypos += biggap - smallgap; } // ----------------------------------------------------------------------------- void ToolBar::EnableButton(int id, bool enable) { if (enable == tbbutt[id]->IsEnabled()) return; #ifdef __WXMSW__ if (id == START_TOOL && (inscript || mainptr->generating)) { tbbutt[id]->SetBitmapDisabled(disnormtool[STOP_TOOL]); } else if (id == AUTOFIT_TOOL && currlayer->autofit) { tbbutt[id]->SetBitmapDisabled(disdowntool[id]); } else if (id == HYPER_TOOL && currlayer->hyperspeed) { tbbutt[id]->SetBitmapDisabled(disdowntool[id]); } else if (id == PATTERNS_TOOL && showpatterns) { tbbutt[id]->SetBitmapDisabled(disdowntool[id]); } else if (id == SCRIPTS_TOOL && showscripts) { tbbutt[id]->SetBitmapDisabled(disdowntool[id]); } else { tbbutt[id]->SetBitmapDisabled(disnormtool[id]); } #endif tbbutt[id]->Enable(enable); } // ----------------------------------------------------------------------------- void ToolBar::SetStartStopButton() { if (inscript || mainptr->generating) { // show stop bitmap if (buttstate[START_TOOL] == 1) return; buttstate[START_TOOL] = 1; tbbutt[START_TOOL]->SetBitmapLabel(normtool[STOP_TOOL]); if (inscript) tbbutt[START_TOOL]->SetToolTip(_("Stop script")); else tbbutt[START_TOOL]->SetToolTip(_("Stop generating")); } else { // show start bitmap if (buttstate[START_TOOL] == -1) return; buttstate[START_TOOL] = -1; tbbutt[START_TOOL]->SetBitmapLabel(normtool[START_TOOL]); tbbutt[START_TOOL]->SetToolTip(_("Start generating")); } tbbutt[START_TOOL]->Refresh(false); } // ----------------------------------------------------------------------------- void ToolBar::SelectButton(int id, bool select) { if (select) { if (buttstate[id] == 1) return; buttstate[id] = 1; tbbutt[id]->SetBitmapLabel(downtool[id]); } else { if (buttstate[id] == -1) return; buttstate[id] = -1; tbbutt[id]->SetBitmapLabel(normtool[id]); } tbbutt[id]->Refresh(false); } // ----------------------------------------------------------------------------- void MainFrame::CreateToolbar() { int wd, ht; GetClientSize(&wd, &ht); toolbarptr = new ToolBar(this, 0, 0, toolbarwd, ht); if (toolbarptr == NULL) Fatal(_("Failed to create tool bar!")); // add buttons to tool bar toolbarptr->AddButton(START_TOOL, _("Start generating")); toolbarptr->AddButton(RESET_TOOL, _("Reset")); toolbarptr->AddSeparator(); toolbarptr->AddButton(ALGO_TOOL, _("Set algorithm")); toolbarptr->AddButton(AUTOFIT_TOOL, _("Auto fit")); toolbarptr->AddButton(HYPER_TOOL, _("Hyperspeed")); toolbarptr->AddSeparator(); toolbarptr->AddButton(NEW_TOOL, _("New pattern")); toolbarptr->AddButton(OPEN_TOOL, _("Open pattern")); toolbarptr->AddButton(SAVE_TOOL, _("Save pattern")); toolbarptr->AddSeparator(); toolbarptr->AddButton(PATTERNS_TOOL, _("Show/hide patterns")); toolbarptr->AddButton(SCRIPTS_TOOL, _("Show/hide scripts")); toolbarptr->AddSeparator(); toolbarptr->AddButton(INFO_TOOL, _("Show pattern information")); toolbarptr->AddButton(HELP_TOOL, _("Show help window")); toolbarptr->Show(showtool); } // ----------------------------------------------------------------------------- void MainFrame::UpdateToolBar(bool active) { // update tool bar buttons according to the current state if (toolbarptr && showtool) { if (viewptr->waitingforclick) active = false; bool timeline = TimelineExists(); // set state of start/stop button toolbarptr->SetStartStopButton(); // set state of toggle buttons toolbarptr->SelectButton(AUTOFIT_TOOL, currlayer->autofit); toolbarptr->SelectButton(HYPER_TOOL, currlayer->hyperspeed); toolbarptr->SelectButton(PATTERNS_TOOL, showpatterns); toolbarptr->SelectButton(SCRIPTS_TOOL, showscripts); toolbarptr->EnableButton(START_TOOL, active && !timeline); toolbarptr->EnableButton(RESET_TOOL, active && !timeline && !inscript && (generating || currlayer->algo->getGeneration() > currlayer->startgen)); toolbarptr->EnableButton(ALGO_TOOL, active && !timeline && !inscript); toolbarptr->EnableButton(AUTOFIT_TOOL, active); toolbarptr->EnableButton(HYPER_TOOL, active && !timeline); toolbarptr->EnableButton(NEW_TOOL, active && !inscript); toolbarptr->EnableButton(OPEN_TOOL, active && !inscript); toolbarptr->EnableButton(SAVE_TOOL, active && !inscript); toolbarptr->EnableButton(PATTERNS_TOOL, active); toolbarptr->EnableButton(SCRIPTS_TOOL, active); toolbarptr->EnableButton(INFO_TOOL, active && !currlayer->currfile.IsEmpty()); toolbarptr->EnableButton(HELP_TOOL, active); } } // ----------------------------------------------------------------------------- bool MainFrame::ClipboardHasText() { bool hastext = false; #ifdef __WXGTK__ // avoid re-entrancy bug in wxGTK 2.9.x if (wxTheClipboard->IsOpened()) return false; #endif if (wxTheClipboard->Open()) { hastext = wxTheClipboard->IsSupported(wxDF_TEXT); if (!hastext) { // we'll try to convert bitmap data to text pattern hastext = wxTheClipboard->IsSupported(wxDF_BITMAP); } wxTheClipboard->Close(); } return hastext; } // ----------------------------------------------------------------------------- void MainFrame::EnableAllMenus(bool enable) { #if defined(__WXMAC__) && !defined(__WXOSX_COCOA__) // enable/disable all menus, including Help menu and items in app menu if (enable) EndAppModalStateForWindow( (OpaqueWindowPtr*)this->MacGetWindowRef() ); else BeginAppModalStateForWindow( (OpaqueWindowPtr*)this->MacGetWindowRef() ); #else wxMenuBar* mbar = GetMenuBar(); if (mbar) { int count = (int)(mbar->GetMenuCount()); int i; for (i = 0; i < count; i++) { mbar->EnableTop(i, enable); } #ifdef __WXOSX_COCOA__ // enable/disable items in app menu mbar->Enable(wxID_ABOUT, enable); mbar->Enable(wxID_PREFERENCES, enable); mbar->Enable(wxID_EXIT, enable); #endif } #endif } // ----------------------------------------------------------------------------- void MainFrame::UpdateMenuItems(bool active) { // update menu bar items according to the given state wxMenuBar* mbar = GetMenuBar(); if (mbar) { bool textinclip = ClipboardHasText(); bool selexists = viewptr->SelectionExists(); bool timeline = TimelineExists(); if (viewptr->waitingforclick) active = false; mbar->Enable(wxID_NEW, active && !inscript); mbar->Enable(wxID_OPEN, active && !inscript); mbar->Enable(ID_OPEN_CLIP, active && !inscript && textinclip); mbar->Enable(ID_OPEN_RECENT, active && !inscript && numpatterns > 0); mbar->Enable(ID_SHOW_PATTERNS, active); mbar->Enable(ID_PATTERN_DIR, active); mbar->Enable(wxID_SAVE, active && !inscript); mbar->Enable(ID_SAVE_XRLE, active); mbar->Enable(ID_RUN_SCRIPT, active && !timeline && !inscript); mbar->Enable(ID_RUN_CLIP, active && !timeline && !inscript && textinclip); mbar->Enable(ID_RUN_RECENT, active && !timeline && !inscript && numscripts > 0); mbar->Enable(ID_SHOW_SCRIPTS, active); mbar->Enable(ID_SCRIPT_DIR, active); // safer not to allow prefs dialog while script is running??? // mbar->Enable(wxID_PREFERENCES, !inscript); bool can_undo = active && !timeline && currlayer->undoredo->CanUndo(); bool can_redo = active && !timeline && currlayer->undoredo->CanRedo(); #if defined(__WXMAC__) && !defined(__WXOSX_COCOA__) // need this stupidity to avoid wxMac bug after modal dialog closes (eg. Set Rule) // and force items to appear correctly enabled/disabled mbar->Enable(ID_UNDO, !can_undo); mbar->Enable(ID_REDO, !can_redo); #endif mbar->Enable(ID_UNDO, can_undo); mbar->Enable(ID_REDO, can_redo); mbar->Enable(ID_NO_UNDO, active && !inscript); mbar->Enable(ID_CUT, active && !timeline && !inscript && selexists); mbar->Enable(ID_COPY, active && !inscript && selexists); mbar->Enable(ID_CLEAR, active && !timeline && !inscript && selexists); mbar->Enable(ID_OUTSIDE, active && !timeline && !inscript && selexists); mbar->Enable(ID_PASTE, active && !timeline && !inscript && textinclip); mbar->Enable(ID_PASTE_SEL, active && !timeline && !inscript && textinclip && selexists); mbar->Enable(ID_PLOCATION, active); mbar->Enable(ID_PMODE, active); mbar->Enable(ID_SELECTALL, active && !inscript); mbar->Enable(ID_REMOVE, active && !inscript && selexists); mbar->Enable(ID_SHRINK, active && !inscript && selexists); mbar->Enable(ID_RANDOM, active && !timeline && !inscript && selexists); mbar->Enable(ID_FLIPTB, active && !timeline && !inscript && selexists); mbar->Enable(ID_FLIPLR, active && !timeline && !inscript && selexists); mbar->Enable(ID_ROTATEC, active && !timeline && !inscript && selexists); mbar->Enable(ID_ROTATEA, active && !timeline && !inscript && selexists); mbar->Enable(ID_CMODE, active); if (inscript) { // don't use DO_STARTSTOP key to abort a running script #ifdef __WXMAC__ // on Mac we need to clear the accelerator first because "\tEscape" doesn't really // change the accelerator (it just looks like it does!) -- this is because escape // (key code 27) is used by SetItemCmd to indicate the item has a submenu; // see UMASetMenuItemShortcut in wx/src/mac/carbon/uma.cpp mbar->SetLabel(ID_START, _("x")); #endif mbar->SetLabel(ID_START, _("Stop Script\tEscape")); } else if (generating) { mbar->SetLabel(ID_START, _("Stop Generating") + GetAccelerator(DO_STARTSTOP)); } else if (timeline && !currlayer->algo->isrecording()) { if (TimelineIsPlaying()) mbar->SetLabel(ID_START, _("Stop Playing Timeline") + GetAccelerator(DO_STARTSTOP)); else mbar->SetLabel(ID_START, _("Start Playing Timeline") + GetAccelerator(DO_STARTSTOP)); } else { mbar->SetLabel(ID_START, _("Start Generating") + GetAccelerator(DO_STARTSTOP)); } if (currlayer->algo->isrecording()) { mbar->SetLabel(ID_RECORD, _("Stop Recording") + GetAccelerator(DO_RECORD)); } else { mbar->SetLabel(ID_RECORD, _("Start Recording") + GetAccelerator(DO_RECORD)); } mbar->Enable(ID_START, active && !currlayer->algo->isrecording()); #ifdef __WXMAC__ // for some unknown reason we need to disable these menu items when generating // otherwise auto-repeating space/tab key doesn't work all the time mbar->Enable(ID_NEXT, active && !timeline && !inscript && !generating); mbar->Enable(ID_STEP, active && !timeline && !inscript && !generating); #else mbar->Enable(ID_NEXT, active && !timeline && !inscript); mbar->Enable(ID_STEP, active && !timeline && !inscript); #endif mbar->Enable(ID_RESET, active && !timeline && !inscript && (generating || currlayer->algo->getGeneration() > currlayer->startgen)); mbar->Enable(ID_SETGEN, active && !timeline && !inscript); mbar->Enable(ID_FASTER, active); mbar->Enable(ID_SLOWER, active /* && currlayer->currexpo > minexpo */); // don't do this test because Win users won't hear beep mbar->Enable(ID_SETBASE, active && !timeline && !inscript); mbar->Enable(ID_AUTO, active); mbar->Enable(ID_HYPER, active && !timeline); mbar->Enable(ID_HINFO, active); mbar->Enable(ID_RECORD, active && !inscript && currlayer->algo->hyperCapable()); mbar->Enable(ID_DELTIME, active && !inscript && timeline && !currlayer->algo->isrecording()); mbar->Enable(ID_CONVERT, active && !timeline && !inscript); mbar->Enable(ID_SETALGO, active && !timeline && !inscript); mbar->Enable(ID_SETRULE, active && !timeline && !inscript); mbar->Enable(ID_FULL, active); mbar->Enable(ID_FIT, active); mbar->Enable(ID_FIT_SEL, active && selexists); mbar->Enable(ID_MIDDLE, active); mbar->Enable(ID_RESTORE00, active && (currlayer->originx != bigint::zero || currlayer->originy != bigint::zero)); mbar->Enable(wxID_ZOOM_IN, active /* && viewptr->GetMag() < MAX_MAG */); // don't do this test because Win users won't hear beep mbar->Enable(wxID_ZOOM_OUT, active); mbar->Enable(ID_SET_SCALE, active); mbar->Enable(ID_TOOL_BAR, active); mbar->Enable(ID_LAYER_BAR, active); mbar->Enable(ID_EDIT_BAR, active); mbar->Enable(ID_ALL_STATES, active); mbar->Enable(ID_STATUS_BAR, active); mbar->Enable(ID_EXACT, active); mbar->Enable(ID_GRID, active); mbar->Enable(ID_ICONS, active); mbar->Enable(ID_INVERT, active); #if defined(__WXMAC__) || defined(__WXGTK__) // windows on Mac OS X and GTK+ 2.0 are automatically buffered mbar->Enable(ID_BUFF, false); mbar->Check(ID_BUFF, true); #else mbar->Enable(ID_BUFF, active); mbar->Check(ID_BUFF, buffered); #endif mbar->Enable(ID_TIMELINE, active); mbar->Enable(ID_INFO, !currlayer->currfile.IsEmpty()); mbar->Enable(ID_ADD_LAYER, active && !inscript && numlayers < MAX_LAYERS); mbar->Enable(ID_CLONE, active && !inscript && numlayers < MAX_LAYERS); mbar->Enable(ID_DUPLICATE, active && !inscript && numlayers < MAX_LAYERS); mbar->Enable(ID_DEL_LAYER, active && !inscript && numlayers > 1); mbar->Enable(ID_DEL_OTHERS, active && !inscript && numlayers > 1); mbar->Enable(ID_MOVE_LAYER, active && !inscript && numlayers > 1); mbar->Enable(ID_NAME_LAYER, active && !inscript); mbar->Enable(ID_SET_COLORS, active && !inscript); mbar->Enable(ID_SYNC_VIEW, active); mbar->Enable(ID_SYNC_CURS, active); mbar->Enable(ID_STACK, active); mbar->Enable(ID_TILE, active); for (int i = 0; i < numlayers; i++) mbar->Enable(ID_LAYER0 + i, active && CanSwitchLayer(i)); // tick/untick menu items created using AppendCheckItem mbar->Check(ID_SAVE_XRLE, savexrle); mbar->Check(ID_SHOW_PATTERNS, showpatterns); mbar->Check(ID_SHOW_SCRIPTS, showscripts); mbar->Check(ID_NO_UNDO, !allowundo); mbar->Check(ID_AUTO, currlayer->autofit); mbar->Check(ID_HYPER, currlayer->hyperspeed); mbar->Check(ID_HINFO, currlayer->showhashinfo); mbar->Check(ID_TOOL_BAR, showtool); mbar->Check(ID_LAYER_BAR, showlayer); mbar->Check(ID_EDIT_BAR, showedit); mbar->Check(ID_ALL_STATES, showallstates); mbar->Check(ID_STATUS_BAR, showstatus); mbar->Check(ID_EXACT, showexact); mbar->Check(ID_GRID, showgridlines); mbar->Check(ID_ICONS, showicons); mbar->Check(ID_INVERT, swapcolors); mbar->Check(ID_TIMELINE, showtimeline); mbar->Check(ID_PL_TL, plocation == TopLeft); mbar->Check(ID_PL_TR, plocation == TopRight); mbar->Check(ID_PL_BR, plocation == BottomRight); mbar->Check(ID_PL_BL, plocation == BottomLeft); mbar->Check(ID_PL_MID, plocation == Middle); mbar->Check(ID_PM_AND, pmode == And); mbar->Check(ID_PM_COPY, pmode == Copy); mbar->Check(ID_PM_OR, pmode == Or); mbar->Check(ID_PM_XOR, pmode == Xor); mbar->Check(ID_DRAW, currlayer->curs == curs_pencil); mbar->Check(ID_PICK, currlayer->curs == curs_pick); mbar->Check(ID_SELECT, currlayer->curs == curs_cross); mbar->Check(ID_MOVE, currlayer->curs == curs_hand); mbar->Check(ID_ZOOMIN, currlayer->curs == curs_zoomin); mbar->Check(ID_ZOOMOUT, currlayer->curs == curs_zoomout); mbar->Check(ID_SCALE_1, viewptr->GetMag() == 0); mbar->Check(ID_SCALE_2, viewptr->GetMag() == 1); mbar->Check(ID_SCALE_4, viewptr->GetMag() == 2); mbar->Check(ID_SCALE_8, viewptr->GetMag() == 3); mbar->Check(ID_SCALE_16, viewptr->GetMag() == 4); mbar->Check(ID_SCALE_32, viewptr->GetMag() == 5); mbar->Check(ID_SYNC_VIEW, syncviews); mbar->Check(ID_SYNC_CURS, synccursors); mbar->Check(ID_STACK, stacklayers); mbar->Check(ID_TILE, tilelayers); for (int i = 0; i < NumAlgos(); i++) { mbar->Check(ID_ALGO0 + i, currlayer->algtype == i); // keep algomenupop in sync with algomenu algomenupop->Check(ID_ALGO0 + i, currlayer->algtype == i); } for (int i = 0; i < numlayers; i++) { mbar->Check(ID_LAYER0 + i, currindex == i); } } } // ----------------------------------------------------------------------------- void MainFrame::UpdateUserInterface(bool active) { UpdateToolBar(active); UpdateLayerBar(active); UpdateEditBar(active); UpdateTimelineBar(active); UpdateMenuItems(active); viewptr->CheckCursor(active); statusptr->CheckMouseLocation(active); #ifdef __WXMSW__ // ensure viewport window has keyboard focus if main window is active if (active) viewptr->SetFocus(); #endif } // ----------------------------------------------------------------------------- // update everything in main window, and menu bar and cursor void MainFrame::UpdateEverything() { if (IsIconized()) { // main window has been minimized, so only update menu bar items UpdateMenuItems(false); return; } // update all tool bars, menus and cursor UpdateUserInterface(IsActive()); if (inscript) { // make sure scroll bars are accurate while running script bigview->UpdateScrollBars(); return; } int wd, ht; GetClientSize(&wd, &ht); // includes status bar and viewport if (wd > 0 && ht > statusptr->statusht) { bigview->Refresh(false); bigview->UpdateScrollBars(); } if (wd > 0 && ht > 0 && showstatus) { statusptr->Refresh(false); } } // ----------------------------------------------------------------------------- // only update viewport and status bar void MainFrame::UpdatePatternAndStatus() { if (inscript || currlayer->undoredo->doingscriptchanges) return; if (!IsIconized()) { bigview->Refresh(false); if (showstatus) { statusptr->CheckMouseLocation(IsActive()); statusptr->Refresh(false); } } } // ----------------------------------------------------------------------------- // only update status bar void MainFrame::UpdateStatus() { if (inscript || currlayer->undoredo->doingscriptchanges) return; if (!IsIconized()) { if (showstatus) { statusptr->CheckMouseLocation(IsActive()); statusptr->Refresh(false); } } } // ----------------------------------------------------------------------------- void MainFrame::SimplifyTree(wxString& indir, wxTreeCtrl* treectrl, wxTreeItemId root) { // delete old tree (except root) treectrl->DeleteChildren(root); // remove any terminating separator wxString dir = indir; if (dir.Last() == wxFILE_SEP_PATH) dir.Truncate(dir.Length()-1); // append dir as only child wxDirItemData* diritem = new wxDirItemData(dir, dir, true); wxTreeItemId id; id = treectrl->AppendItem(root, dir.AfterLast(wxFILE_SEP_PATH), 0, 0, diritem); if ( diritem->HasFiles() || diritem->HasSubDirs() ) { treectrl->SetItemHasChildren(id); treectrl->Expand(id); // nicer to expand Perl & Python subdirs inside Scripts if ( dir == gollydir + _("Scripts") ) { wxTreeItemId child; wxTreeItemIdValue cookie; child = treectrl->GetFirstChild(id, cookie); while ( child.IsOk() ) { wxString name = treectrl->GetItemText(child); if ( name == _("Perl") || name == _("Python") ) { treectrl->Expand(child); } child = treectrl->GetNextChild(id, cookie); } } #ifndef __WXMSW__ // causes crash on Windows treectrl->ScrollTo(root); #endif } } // ----------------------------------------------------------------------------- void MainFrame::DeselectTree(wxTreeCtrl* treectrl, wxTreeItemId root) { // recursively traverse tree and reset each file item background to white wxTreeItemIdValue cookie; wxTreeItemId id = treectrl->GetFirstChild(root, cookie); while ( id.IsOk() ) { if ( treectrl->ItemHasChildren(id) ) { DeselectTree(treectrl, id); } else { wxColor currcolor = treectrl->GetItemBackgroundColour(id); if ( currcolor != *wxWHITE ) { treectrl->SetItemBackgroundColour(id, *wxWHITE); } } id = treectrl->GetNextChild(root, cookie); } } // ----------------------------------------------------------------------------- // Define a window for right pane of split window: class RightWindow : public wxWindow { public: RightWindow(wxWindow* parent) : wxWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNO_BORDER | // need this to avoid layer/edit/timeline bar buttons flashing on Windows wxNO_FULL_REPAINT_ON_RESIZE) { // avoid erasing background on GTK+ SetBackgroundStyle(wxBG_STYLE_CUSTOM); } ~RightWindow() {} // event handlers void OnSize(wxSizeEvent& event); void OnEraseBackground(wxEraseEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(RightWindow, wxWindow) EVT_ERASE_BACKGROUND (RightWindow::OnEraseBackground) EVT_SIZE (RightWindow::OnSize) END_EVENT_TABLE() // ----------------------------------------------------------------------------- void RightWindow::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) { // do nothing because layer/edit/timeline bars and viewport cover all of right pane } // ----------------------------------------------------------------------------- void RightWindow::OnSize(wxSizeEvent& event) { int wd, ht; GetClientSize(&wd, &ht); if (wd > 0 && ht > 0 && bigview) { // resize layer/edit/timeline bars and main viewport window ResizeLayerBar(wd); ResizeEditBar(wd); int y = 0; if (showlayer) { y += LayerBarHeight(); ht -= LayerBarHeight(); } if (showedit) { y += EditBarHeight(); ht -= EditBarHeight(); } if (showtimeline) { ht -= TimelineBarHeight(); } // timeline bar goes underneath viewport ResizeTimelineBar(y + ht, wd); bigview->SetSize(0, y, wd, ht); } event.Skip(); } // ----------------------------------------------------------------------------- RightWindow* rightpane; wxWindow* MainFrame::RightPane() { return rightpane; } // ----------------------------------------------------------------------------- void MainFrame::ResizeSplitWindow(int wd, int ht) { int x = showtool ? toolbarwd : 0; int y = statusptr->statusht; int w = showtool ? wd - toolbarwd : wd; int h = ht > statusptr->statusht ? ht - statusptr->statusht : 0; splitwin->SetSize(x, y, w, h); // RightWindow::OnSize has now been called; // wxSplitterWindow automatically resizes left and right panes } // ----------------------------------------------------------------------------- void MainFrame::ResizeStatusBar(int wd, int ht) { wxUnusedVar(ht); // assume showstatus is true statusptr->statusht = showexact ? STATUS_EXHT : STATUS_HT; statusptr->SetSize(showtool ? toolbarwd : 0, 0, showtool ? wd - toolbarwd : wd, statusptr->statusht); } // ----------------------------------------------------------------------------- void MainFrame::ToggleStatusBar() { int wd, ht; GetClientSize(&wd, &ht); showstatus = !showstatus; if (showstatus) { ResizeStatusBar(wd, ht); } else { statusptr->statusht = 0; statusptr->SetSize(0, 0, 0, 0); } ResizeSplitWindow(wd, ht); UpdateEverything(); } // ----------------------------------------------------------------------------- void MainFrame::ToggleExactNumbers() { int wd, ht; GetClientSize(&wd, &ht); showexact = !showexact; if (showstatus) { ResizeStatusBar(wd, ht); ResizeSplitWindow(wd, ht); UpdateEverything(); } else if (showexact) { // show the status bar using new size ToggleStatusBar(); } else { UpdateMenuItems(IsActive()); } } // ----------------------------------------------------------------------------- void MainFrame::ToggleToolBar() { showtool = !showtool; int wd, ht; GetClientSize(&wd, &ht); if (showstatus) { ResizeStatusBar(wd, ht); } if (showtool) { // resize tool bar in case window was made larger while tool bar hidden toolbarptr->SetSize(0, 0, toolbarwd, ht); } ResizeSplitWindow(wd, ht); toolbarptr->Show(showtool); } // ----------------------------------------------------------------------------- void MainFrame::ToggleFullScreen() { static bool restorestatusbar; // restore status bar at end of full screen mode? static bool restorelayerbar; // restore layer bar? static bool restoreeditbar; // restore edit bar? static bool restoretimelinebar; // restore timeline bar? static bool restoretoolbar; // restore tool bar? static bool restorepattdir; // restore pattern directory? static bool restorescrdir; // restore script directory? if (!fullscreen) { // save current location and size for use in SavePrefs wxRect r = GetRect(); mainx = r.x; mainy = r.y; mainwd = r.width; mainht = r.height; } fullscreen = !fullscreen; ShowFullScreen(fullscreen, wxFULLSCREEN_NOMENUBAR | wxFULLSCREEN_NOBORDER | wxFULLSCREEN_NOCAPTION); if (fullscreen) { // hide scroll bars bigview->SetScrollbar(wxHORIZONTAL, 0, 0, 0, true); bigview->SetScrollbar(wxVERTICAL, 0, 0, 0, true); // hide status bar if necessary restorestatusbar = showstatus; if (restorestatusbar) { showstatus = false; statusptr->statusht = 0; statusptr->SetSize(0, 0, 0, 0); } // hide layer bar if necessary restorelayerbar = showlayer; if (restorelayerbar) { ToggleLayerBar(); } // hide edit bar if necessary restoreeditbar = showedit; if (restoreeditbar) { ToggleEditBar(); } // hide timeline bar if necessary restoretimelinebar = showtimeline; if (restoretimelinebar) { ToggleTimelineBar(); } // hide tool bar if necessary restoretoolbar = showtool; if (restoretoolbar) { ToggleToolBar(); } // hide pattern/script directory if necessary restorepattdir = showpatterns; restorescrdir = showscripts; if (restorepattdir) { dirwinwd = splitwin->GetSashPosition(); splitwin->Unsplit(patternctrl); showpatterns = false; } else if (restorescrdir) { dirwinwd = splitwin->GetSashPosition(); splitwin->Unsplit(scriptctrl); showscripts = false; } } else { // first show tool bar if necessary if (restoretoolbar && !showtool) { ToggleToolBar(); if (showstatus) { // reduce width of status bar below restorestatusbar = true; } } // show status bar if necessary; // note that even if it's visible we may have to resize width if (restorestatusbar) { showstatus = true; int wd, ht; GetClientSize(&wd, &ht); ResizeStatusBar(wd, ht); } // show layer bar if necessary if (restorelayerbar && !showlayer) ToggleLayerBar(); // show edit bar if necessary if (restoreeditbar && !showedit) ToggleEditBar(); // show timeline bar if necessary if (restoretimelinebar && !showtimeline) ToggleTimelineBar(); // restore pattern/script directory if necessary if ( restorepattdir && !splitwin->IsSplit() ) { splitwin->SplitVertically(patternctrl, RightPane(), dirwinwd); showpatterns = true; } else if ( restorescrdir && !splitwin->IsSplit() ) { splitwin->SplitVertically(scriptctrl, RightPane(), dirwinwd); showscripts = true; } } if (!fullscreen) { // restore scroll bars BEFORE setting viewport size bigview->UpdateScrollBars(); } // adjust size of viewport (and pattern/script directory if visible) int wd, ht; GetClientSize(&wd, &ht); ResizeSplitWindow(wd, ht); UpdateEverything(); } // ----------------------------------------------------------------------------- void MainFrame::ToggleAllowUndo() { if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; cmdevent.SetId(ID_NO_UNDO); return; } allowundo = !allowundo; if (allowundo) { if (currlayer->algo->getGeneration() > currlayer->startgen) { // undo list is empty but user can Reset, so add a generating change // to undo list so user can Undo or Reset (and then Redo if they wish) currlayer->undoredo->AddGenChange(); } } else { currlayer->undoredo->ClearUndoRedo(); // don't clear undo/redo history for other layers here; only do it // if allowundo is false when user switches to another layer } } // ----------------------------------------------------------------------------- void MainFrame::ShowPatternInfo() { if (viewptr->waitingforclick || currlayer->currfile.IsEmpty()) return; ShowInfo(currlayer->currfile); } // ----------------------------------------------------------------------------- // event table and handlers for main window: BEGIN_EVENT_TABLE(MainFrame, wxFrame) EVT_MENU (wxID_ANY, MainFrame::OnMenu) EVT_SET_FOCUS ( MainFrame::OnSetFocus) EVT_ACTIVATE ( MainFrame::OnActivate) EVT_IDLE ( MainFrame::OnIdle) EVT_SIZE ( MainFrame::OnSize) #if defined(__WXMAC__) || defined(__WXMSW__) EVT_TREE_ITEM_EXPANDED (wxID_TREECTRL, MainFrame::OnDirTreeExpand) EVT_TREE_ITEM_COLLAPSING (wxID_TREECTRL, MainFrame::OnDirTreeCollapse) // wxMac bug??? EVT_TREE_ITEM_COLLAPSED doesn't get called #endif EVT_TREE_SEL_CHANGED (wxID_TREECTRL, MainFrame::OnDirTreeSelection) EVT_SPLITTER_DCLICK (wxID_ANY, MainFrame::OnSashDblClick) EVT_TIMER (wxID_ANY, MainFrame::OnOneTimer) #if defined(__WXMAC__) || defined(__WXGTK__) //!!! these handlers avoid the viewport window being erased on Mac and Linux /* but unfortunately the split-window sash won't be drawn correctly EVT_ERASE_BACKGROUND ( MainFrame::OnErase) EVT_PAINT ( MainFrame::OnPaint) */ #endif EVT_CLOSE ( MainFrame::OnClose) END_EVENT_TABLE() // ----------------------------------------------------------------------------- void MainFrame::OnMenu(wxCommandEvent& event) { showbanner = false; if (keepmessage) { // don't clear message created by script while generating a pattern keepmessage = false; } else { statusptr->ClearMessage(); } int id = event.GetId(); switch (id) { // File menu case wxID_NEW: NewPattern(); break; case wxID_OPEN: OpenPattern(); break; case ID_OPEN_CLIP: OpenClipboard(); break; case ID_SHOW_PATTERNS: ToggleShowPatterns(); break; case ID_PATTERN_DIR: ChangePatternDir(); break; case wxID_SAVE: SavePattern(); break; case ID_SAVE_XRLE: savexrle = !savexrle; break; case ID_RUN_SCRIPT: OpenScript(); break; case ID_RUN_CLIP: RunClipboard(); break; case ID_SHOW_SCRIPTS: ToggleShowScripts(); break; case ID_SCRIPT_DIR: ChangeScriptDir(); break; case wxID_PREFERENCES: ShowPrefsDialog(); break; case wxID_EXIT: QuitApp(); break; // Edit menu case ID_UNDO: currlayer->undoredo->UndoChange(); break; case ID_REDO: currlayer->undoredo->RedoChange(); break; case ID_NO_UNDO: ToggleAllowUndo(); break; case ID_CUT: viewptr->CutSelection(); break; case ID_COPY: viewptr->CopySelection(); break; case ID_CLEAR: viewptr->ClearSelection(); break; case ID_OUTSIDE: viewptr->ClearOutsideSelection(); break; case ID_PASTE: viewptr->PasteClipboard(false); break; case ID_PASTE_SEL: viewptr->PasteClipboard(true); break; case ID_PL_TL: SetPasteLocation("TopLeft"); break; case ID_PL_TR: SetPasteLocation("TopRight"); break; case ID_PL_BR: SetPasteLocation("BottomRight"); break; case ID_PL_BL: SetPasteLocation("BottomLeft"); break; case ID_PL_MID: SetPasteLocation("Middle"); break; case ID_PM_AND: SetPasteMode("And"); break; case ID_PM_COPY: SetPasteMode("Copy"); break; case ID_PM_OR: SetPasteMode("Or"); break; case ID_PM_XOR: SetPasteMode("Xor"); break; case ID_SELECTALL: viewptr->SelectAll(); break; case ID_REMOVE: viewptr->RemoveSelection(); break; case ID_SHRINK: viewptr->ShrinkSelection(false); break; case ID_SHRINKFIT: viewptr->ShrinkSelection(true); break; case ID_RANDOM: viewptr->RandomFill(); break; case ID_FLIPTB: viewptr->FlipSelection(true); break; case ID_FLIPLR: viewptr->FlipSelection(false); break; case ID_ROTATEC: viewptr->RotateSelection(true); break; case ID_ROTATEA: viewptr->RotateSelection(false); break; case ID_DRAW: viewptr->SetCursorMode(curs_pencil); break; case ID_PICK: viewptr->SetCursorMode(curs_pick); break; case ID_SELECT: viewptr->SetCursorMode(curs_cross); break; case ID_MOVE: viewptr->SetCursorMode(curs_hand); break; case ID_ZOOMIN: viewptr->SetCursorMode(curs_zoomin); break; case ID_ZOOMOUT: viewptr->SetCursorMode(curs_zoomout); break; // Control menu case ID_START: if (inscript || generating) { Stop(); } else if (TimelineExists()) { PlayTimeline(1); } else { GeneratePattern(); } break; case ID_NEXT: NextGeneration(false); break; case ID_STEP: NextGeneration(true); break; case ID_RESET: ResetPattern(); break; case ID_SETGEN: SetGeneration(); break; case ID_FASTER: GoFaster(); break; case ID_SLOWER: GoSlower(); break; case ID_SETBASE: SetBaseStep(); break; case ID_AUTO: ToggleAutoFit(); break; case ID_HYPER: ToggleHyperspeed(); break; case ID_HINFO: ToggleHashInfo(); break; case ID_RECORD: StartStopRecording(); break; case ID_DELTIME: DeleteTimeline(); break; case ID_CONVERT: ConvertOldRules(); break; case ID_SETRULE: ShowRuleDialog(); break; // View menu case ID_FULL: ToggleFullScreen(); break; case ID_FIT: viewptr->FitPattern(); break; case ID_FIT_SEL: viewptr->FitSelection(); break; case ID_MIDDLE: viewptr->ViewOrigin(); break; case ID_RESTORE00: viewptr->RestoreOrigin(); break; case wxID_ZOOM_IN: viewptr->ZoomIn(); break; case wxID_ZOOM_OUT: viewptr->ZoomOut(); break; case ID_SCALE_1: viewptr->SetPixelsPerCell(1); break; case ID_SCALE_2: viewptr->SetPixelsPerCell(2); break; case ID_SCALE_4: viewptr->SetPixelsPerCell(4); break; case ID_SCALE_8: viewptr->SetPixelsPerCell(8); break; case ID_SCALE_16: viewptr->SetPixelsPerCell(16); break; case ID_SCALE_32: viewptr->SetPixelsPerCell(32); break; case ID_TOOL_BAR: ToggleToolBar(); break; case ID_LAYER_BAR: ToggleLayerBar(); break; case ID_EDIT_BAR: ToggleEditBar(); break; case ID_ALL_STATES: ToggleAllStates(); break; case ID_STATUS_BAR: ToggleStatusBar(); break; case ID_EXACT: ToggleExactNumbers(); break; case ID_GRID: viewptr->ToggleGridLines(); break; case ID_ICONS: viewptr->ToggleCellIcons(); break; case ID_INVERT: viewptr->ToggleCellColors(); break; case ID_BUFF: viewptr->ToggleBuffering(); break; case ID_TIMELINE: ToggleTimelineBar(); break; case ID_INFO: ShowPatternInfo(); break; // Layer menu case ID_ADD_LAYER: AddLayer(); break; case ID_CLONE: CloneLayer(); break; case ID_DUPLICATE: DuplicateLayer(); break; case ID_DEL_LAYER: DeleteLayer(); break; case ID_DEL_OTHERS: DeleteOtherLayers(); break; case ID_MOVE_LAYER: MoveLayerDialog(); break; case ID_NAME_LAYER: NameLayerDialog(); break; case ID_SET_COLORS: SetLayerColors(); break; case ID_SYNC_VIEW: ToggleSyncViews(); break; case ID_SYNC_CURS: ToggleSyncCursors(); break; case ID_STACK: ToggleStackLayers(); break; case ID_TILE: ToggleTileLayers(); break; // Help menu case ID_HELP_INDEX: ShowHelp(_("Help/index.html")); break; case ID_HELP_INTRO: ShowHelp(_("Help/intro.html")); break; case ID_HELP_TIPS: ShowHelp(_("Help/tips.html")); break; case ID_HELP_ALGOS: ShowHelp(_("Help/algos.html")); break; case ID_HELP_LEXICON: ShowHelp(_("Help/Lexicon/lex.htm")); break; case ID_HELP_ARCHIVES: ShowHelp(_("Help/archives.html")); break; case ID_HELP_PERL: ShowHelp(_("Help/perl.html")); break; case ID_HELP_PYTHON: ShowHelp(_("Help/python.html")); break; case ID_HELP_KEYBOARD: ShowHelp(SHOW_KEYBOARD_SHORTCUTS); break; case ID_HELP_MOUSE: ShowHelp(_("Help/mouse.html")); break; case ID_HELP_FILE: ShowHelp(_("Help/file.html")); break; case ID_HELP_EDIT: ShowHelp(_("Help/edit.html")); break; case ID_HELP_CONTROL: ShowHelp(_("Help/control.html")); break; case ID_HELP_VIEW: ShowHelp(_("Help/view.html")); break; case ID_HELP_LAYER: ShowHelp(_("Help/layer.html")); break; case ID_HELP_HELP: ShowHelp(_("Help/help.html")); break; case ID_HELP_REFS: ShowHelp(_("Help/refs.html")); break; case ID_HELP_FORMATS: ShowHelp(_("Help/formats.html")); break; case ID_HELP_BOUNDED: ShowHelp(_("Help/bounded.html")); break; case ID_HELP_PROBLEMS: ShowHelp(_("Help/problems.html")); break; case ID_HELP_CHANGES: ShowHelp(_("Help/changes.html")); break; case ID_HELP_CREDITS: ShowHelp(_("Help/credits.html")); break; case ID_HELP_BUTT: ShowHelp(wxEmptyString); break; case wxID_ABOUT: ShowAboutBox(); break; // Open/Run Recent submenus case ID_CLEAR_MISSING_PATTERNS: ClearMissingPatterns(); break; case ID_CLEAR_ALL_PATTERNS: ClearAllPatterns(); break; case ID_CLEAR_MISSING_SCRIPTS: ClearMissingScripts(); break; case ID_CLEAR_ALL_SCRIPTS: ClearAllScripts(); break; default: if ( id > ID_OPEN_RECENT && id <= ID_OPEN_RECENT + numpatterns ) { OpenRecentPattern(id); } else if ( id > ID_RUN_RECENT && id <= ID_RUN_RECENT + numscripts ) { OpenRecentScript(id); } else if ( id >= ID_ALGO0 && id <= ID_ALGOMAX ) { int newtype = id - ID_ALGO0; ChangeAlgorithm(newtype); } else if ( id >= ID_LAYER0 && id <= ID_LAYERMAX ) { SetLayer(id - ID_LAYER0); } else { // wxOSX app needs this to handle app menu items like "Hide Golly" event.Skip(); } } UpdateUserInterface(IsActive()); if (inscript) { // update viewport, status bar, scroll bars, window title inscript = false; UpdatePatternAndStatus(); bigview->UpdateScrollBars(); SetWindowTitle(wxEmptyString); inscript = true; } } // ----------------------------------------------------------------------------- void MainFrame::OnSetFocus(wxFocusEvent& WXUNUSED(event)) { // this is never called in Mac app, presumably because it doesn't // make any sense for a wxFrame to get the keyboard focus #ifdef __WXMSW__ // fix wxMSW problem: don't let main window get focus after being minimized if (viewptr) viewptr->SetFocus(); #endif } // ----------------------------------------------------------------------------- void MainFrame::OnActivate(wxActivateEvent& event) { // note that IsActive() doesn't always match event.GetActive() if (viewptr->waitingforclick && !event.GetActive()) { // cancel paste if main window is no longer in front viewptr->AbortPaste(); } #if defined(__WXMAC__) && !defined(__WXOSX_COCOA__) // to avoid disabled menu items after a modal dialog closes // don't call UpdateMenuItems on deactivation if (event.GetActive()) { UpdateUserInterface(true); // need to set focus to avoid next IsActive() call returning false // (presumably due to a wxMac bug) viewptr->SetFocus(); } else { wxSetCursor(*wxSTANDARD_CURSOR); } #else UpdateUserInterface(event.GetActive()); #endif #if defined(__WXGTK__) && !wxCHECK_VERSION(2,9,0) /* wxGTK 2.8 requires this hack to re-enable menu items after a modal dialog closes. With wxGTK 2.9 it causes deadlocks due to concurrent calls to UpdateMenuItems() (which calls ClipboardHasText() which is non-reentrant). Maybe caused by timer events not being dispatched from the GUI thread? */ if (event.GetActive()) onetimer->Start(20, wxTIMER_ONE_SHOT); // OnOneTimer will be called after delay of 0.02 secs #endif event.Skip(); } // ----------------------------------------------------------------------------- void MainFrame::OnSize(wxSizeEvent& event) { #ifdef __WXMSW__ // save current location and size for use in SavePrefs if app // is closed when window is minimized wxRect r = GetRect(); mainx = r.x; mainy = r.y; mainwd = r.width; mainht = r.height; #endif int wd, ht; GetClientSize(&wd, &ht); if (wd > 0 && ht > 0) { // toolbarptr/statusptr/viewptr might be NULL if OnSize is called from MainFrame ctor if (toolbarptr && showtool) { // adjust size of tool bar toolbarptr->SetSize(0, 0, toolbarwd, ht); } if (statusptr && showstatus) { // adjust size of status bar ResizeStatusBar(wd, ht); } if (viewptr && statusptr && ht > statusptr->statusht) { // adjust size of viewport (and pattern/script directory if visible) ResizeSplitWindow(wd, ht); } } #ifdef __WXGTK__ // need to do default processing for menu bar and tool bar event.Skip(); #else wxUnusedVar(event); #endif } // ----------------------------------------------------------------------------- // avoid recursive call of OpenFile in OnIdle; // this can happen if user clicks a script which then opens some sort of dialog // (idle events are sent to the main window while the dialog is open) static bool inidle = false; void MainFrame::OnIdle(wxIdleEvent& event) { if (inidle) return; #ifdef __WXMSW__ if ( call_unselect ) { // deselect file/folder so user can click the same item if (showpatterns) patternctrl->GetTreeCtrl()->Unselect(); if (showscripts) scriptctrl->GetTreeCtrl()->Unselect(); call_unselect = false; // calling SetFocus once doesn't stuff up layer bar buttons if ( IsActive() && viewptr ) viewptr->SetFocus(); } if (!editpath.IsEmpty()) { EditFile(editpath); editpath.Clear(); } #else // ensure viewport window has keyboard focus if main window is active; // note that we can't do this on Windows because it stuffs up clicks // in layer bar buttons if ( IsActive() && viewptr ) viewptr->SetFocus(); #endif // process any pending script/pattern files if ( pendingfiles.GetCount() > 0 ) { inidle = true; for ( size_t n = 0; n < pendingfiles.GetCount(); n++ ) { OpenFile(pendingfiles[n]); } inidle = false; pendingfiles.Clear(); } if (call_close) { call_close = false; Close(false); // false allows OnClose handler to veto close } if (TimelineExists() && AutoPlay()) { // in autoplay mode so we need another idle event // (this works much better than calling wxWakeUpIdle) event.RequestMore(); } event.Skip(); } // ----------------------------------------------------------------------------- void MainFrame::OnDirTreeExpand(wxTreeEvent& WXUNUSED(event)) { #ifdef __WXMAC__ if ((generating || inscript) && (showpatterns || showscripts)) { // send idle event so directory tree gets updated #if wxCHECK_VERSION(2,9,2) // SendIdleEvents is no longer a member of wxApp -- need to fix???!!! #else wxIdleEvent idleevent; wxGetApp().SendIdleEvents(this, idleevent); #endif } #endif #ifdef __WXMSW__ // avoid bug -- expanding/collapsing a folder can cause top visible item // to become selected and thus OnDirTreeSelection gets called ignore_selection = true; #endif } // ----------------------------------------------------------------------------- void MainFrame::OnDirTreeCollapse(wxTreeEvent& WXUNUSED(event)) { #ifdef __WXMAC__ if ((generating || inscript) && (showpatterns || showscripts)) { // send idle event so directory tree gets updated #if wxCHECK_VERSION(2,9,2) // SendIdleEvents is no lnger a member of wxApp -- need to fix???!!! #else wxIdleEvent idleevent; wxGetApp().SendIdleEvents(this, idleevent); #endif } #endif #ifdef __WXMSW__ // avoid bug -- expanding/collapsing a folder can cause top visible item // to become selected and thus OnDirTreeSelection gets called ignore_selection = true; #endif } // ----------------------------------------------------------------------------- #if defined(__WXMAC__) && wxCHECK_VERSION(2,9,0) // wxMOD_CONTROL has been changed to mean Command key down (sheesh!) #define wxMOD_CONTROL wxMOD_RAW_CONTROL #define ControlDown RawControlDown #endif void MainFrame::OnTreeClick(wxMouseEvent& event) { // set global flag for testing in OnDirTreeSelection edit_file = event.ControlDown() || event.RightDown(); #ifdef __WXMSW__ // this handler gets called even if user clicks outside an item, // and in some cases can result in the top visible item becoming // selected, so we need to avoid that ignore_selection = false; wxGenericDirCtrl* dirctrl = NULL; // for some reason we need to use mainptr to access next 2 members // (it's something to do with using Connect) if (showpatterns) dirctrl = mainptr->patternctrl; if (showscripts) dirctrl = mainptr->scriptctrl; if (dirctrl) { wxTreeCtrl* treectrl = dirctrl->GetTreeCtrl(); if (treectrl) { wxPoint pt = event.GetPosition(); int flags; wxTreeItemId id = treectrl->HitTest(pt, flags); if (id.IsOk() && (flags & wxTREE_HITTEST_ONITEMLABEL || flags & wxTREE_HITTEST_ONITEMICON)) { // fix problem with right-click if (event.RightDown()) { treectrl->SelectItem(id, true); // OnDirTreeSelection gets called a few times for some reason } // fix problem with double-click if (event.LeftDClick()) ignore_selection = true; } else { ignore_selection = true; } } } #endif event.Skip(); } // ----------------------------------------------------------------------------- void MainFrame::EditFile(const wxString& filepath) { // prompt user if text editor hasn't been set yet if (texteditor.IsEmpty()) { ChooseTextEditor(this, texteditor); if (texteditor.IsEmpty()) return; } // execute a command to open given file in user's preferred text editor wxString cmd = wxString::Format(wxT("\"%s\" \"%s\""), texteditor.c_str(), filepath.c_str()); long result = wxExecute(cmd, wxEXEC_ASYNC); #if defined(__WXMSW__) // on Windows, wxExecute returns 0 if cmd fails if (result == 0) #elif defined(__WXMAC__) // on Mac, wxExecute returns -1 if cmd succeeds (bug, or wx docs are wrong) if (result != -1) #elif defined(__WXGTK__) // on Linux, wxExecute always returns a +ve number (pid?) if cmd fails OR succeeds (sheesh!) // but if it fails an error message appears in shell window if (result <= 0) #endif { wxString msg = _("Failed to open file in your preferred text editor.\n"); msg += _("Try choosing a different editor in Preferences > File."); Warning(msg); } } // ----------------------------------------------------------------------------- void MainFrame::OnDirTreeSelection(wxTreeEvent& event) { // note that viewptr will be NULL if called from MainFrame::MainFrame if ( viewptr ) { wxTreeItemId id = event.GetItem(); if ( !id.IsOk() ) return; wxGenericDirCtrl* dirctrl = NULL; if (showpatterns) dirctrl = patternctrl; if (showscripts) dirctrl = scriptctrl; if (dirctrl == NULL) return; wxString filepath = dirctrl->GetFilePath(); // deselect file/folder so this handler will be called if user clicks same item wxTreeCtrl* treectrl = dirctrl->GetTreeCtrl(); #ifdef __WXMSW__ // calling UnselectAll() or Unselect() here causes a crash if (ignore_selection) { // ignore spurious selection ignore_selection = false; call_unselect = true; return; } #else treectrl->UnselectAll(); #endif if ( filepath.IsEmpty() ) { // user clicked on a folder name } else if (edit_file) { // open file in text editor #ifdef __WXMSW__ // call EditFile in later OnIdle to avoid right-click problem editpath = filepath; #else EditFile(filepath); #endif } else { // user clicked on a file name if ( inscript ) { // use Warning because statusptr->ErrorMessage does nothing if inscript if ( IsScriptFile(filepath) ) Warning(_("Cannot run script while another script is running.")); else Warning(_("Cannot open file while a script is running.")); } else { // reset background of previously selected file by traversing entire tree; // we can't just remember previously selected id because ids don't persist // after a folder has been collapsed and expanded DeselectTree(treectrl, treectrl->GetRootItem()); // indicate the selected file treectrl->SetItemBackgroundColour(id, *wxLIGHT_GREY); #ifdef __WXMAC__ if ( !wxFileName::FileExists(filepath) ) { // avoid wxMac bug in wxGenericDirCtrl::GetFilePath; ie. file name // can contain "/" rather than ":" (but directory path is okay) wxFileName fullpath(filepath); wxString dir = fullpath.GetPath(); wxString name = fullpath.GetFullName(); wxString newpath = dir + wxT(":") + name; if ( wxFileName::FileExists(newpath) ) filepath = newpath; } #endif if (generating) { // terminate generating loop and set command_pending flag Stop(); command_pending = true; if ( IsScriptFile(filepath) ) { AddRecentScript(filepath); cmdevent.SetId(ID_RUN_RECENT + 1); } else { AddRecentPattern(filepath); cmdevent.SetId(ID_OPEN_RECENT + 1); } } else { // load pattern or run script // OpenFile(filepath); // call OpenFile in later OnIdle -- this prevents the main window // moving in front of the help window if a script calls help(...) pendingfiles.Add(filepath); } } } #ifdef __WXMSW__ // calling Unselect() here causes a crash so do later in OnIdle call_unselect = true; #endif // changing focus here doesn't work in Mac or Win apps // (presumably because they set focus to treectrl after this call) viewptr->SetFocus(); } } // ----------------------------------------------------------------------------- void MainFrame::OnSashDblClick(wxSplitterEvent& WXUNUSED(event)) { // splitwin's sash was double-clicked if (showpatterns) ToggleShowPatterns(); if (showscripts) ToggleShowScripts(); UpdateMenuItems(IsActive()); UpdateToolBar(IsActive()); } // ----------------------------------------------------------------------------- void MainFrame::OnOneTimer(wxTimerEvent& WXUNUSED(event)) { // fix drag and drop problem on Mac -- see DnDFile::OnDropFiles #ifdef __WXMAC__ // remove colored frame if (bigview) bigview->Refresh(false); #endif // fix menu item problem on Linux after modal dialog has closed #ifdef __WXGTK__ UpdateMenuItems(true); #endif } // ----------------------------------------------------------------------------- bool MainFrame::SaveCurrentLayer() { if (currlayer->algo->isEmpty()) return true; // no need to save empty universe wxString query; if (numlayers > 1) { // make it clear which layer we're asking about query.Printf(_("Save the changes to layer %d: \"%s\"?"), currindex, currlayer->currname.c_str()); } else { query.Printf(_("Save the changes to \"%s\"?"), currlayer->currname.c_str()); } int answer = SaveChanges(query, _("If you don't save, your changes will be lost.")); switch (answer) { case 2: return SavePattern(); // true only if pattern was saved case 1: return true; // don't save changes default: return false; // answer == 0 (ie. user selected Cancel) } } // ----------------------------------------------------------------------------- void MainFrame::OnErase(wxEraseEvent& WXUNUSED(event)) { // do nothing } // ----------------------------------------------------------------------------- void MainFrame::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); // paint nothing (on Mac this avoids drawing the gray horizontal stripes) } // ----------------------------------------------------------------------------- void MainFrame::OnClose(wxCloseEvent& event) { if (event.CanVeto()) { // we can cancel the close event if necessary if (viewptr->waitingforclick) { event.Veto(); return; } if (inscript || generating) { Stop(); /* using wxPostEvent doesn't work if we've been called from Yield: wxCommandEvent quitevt(wxEVT_COMMAND_MENU_SELECTED, wxID_EXIT); wxPostEvent(this->GetEventHandler(), quitevt); */ // set flag so OnClose gets called again in next OnIdle call_close = true; event.Veto(); return; } if (askonquit) { // keep track of which unique clones have been seen; // we add 1 below to allow for cloneseen[0] (always false) const int maxseen = MAX_LAYERS/2 + 1; bool cloneseen[maxseen]; for (int i = 0; i < maxseen; i++) cloneseen[i] = false; // for each dirty layer, ask user if they want to save changes int oldindex = currindex; for (int i = 0; i < numlayers; i++) { // only ask once for each unique clone (cloneid == 0 for non-clone) int cid = GetLayer(i)->cloneid; if (!cloneseen[cid]) { if (cid > 0) cloneseen[cid] = true; if (GetLayer(i)->dirty) { if (i != currindex) SetLayer(i); if (!SaveCurrentLayer()) { // user cancelled "save changes" dialog so restore layer SetLayer(oldindex); UpdateUserInterface(IsActive()); event.Veto(); return; } } } } } } if (GetHelpFrame()) GetHelpFrame()->Close(true); if (GetInfoFrame()) GetInfoFrame()->Close(true); if (splitwin->IsSplit()) dirwinwd = splitwin->GetSashPosition(); // if script is running or pattern is generating then CanVeto was false // (probably due to user logging out or shutting down system) // and we need to call exit below bool callexit = inscript || generating; // abort any running script and tidy up; also restores current directory // to location of Golly app so prefs file will be saved in correct place FinishScripting(); // save main window location and other user preferences SavePrefs(); // delete any temporary files if (wxFileExists(perlfile)) wxRemoveFile(perlfile); if (wxFileExists(pythonfile)) wxRemoveFile(pythonfile); for (int i = 0; i < numlayers; i++) { Layer* layer = GetLayer(i); if (wxFileExists(layer->tempstart)) wxRemoveFile(layer->tempstart); // clear all undo/redo history for this layer layer->undoredo->ClearUndoRedo(); } if (wxFileName::DirExists(tempdir)) { // delete all files in tempdir (we assume it has no subdirs) wxDir* dir = new wxDir(tempdir); wxArrayString files; wxString filename; bool more = dir->GetFirst(&filename); while (more) { files.Add(tempdir + filename); more = dir->GetNext(&filename); } // delete wxDir object now otherwise Rmdir below will fail on Windows delete dir; for (size_t n = 0; n < files.GetCount(); n++) { wxRemoveFile(files[n]); } // delete the (hopefully) empty tempdir if (!wxFileName::Rmdir(tempdir)) { Warning(_("Could not delete temporary directory:\n") + tempdir); } } // allow clipboard data to persist after app exits // (needed on Windows, not needed on Mac, doesn't work on Linux -- sheesh!) if (wxTheClipboard->Open()) { wxTheClipboard->Flush(); wxTheClipboard->Close(); } // avoid possible error message or seg fault if (callexit) exit(0); Destroy(); #ifdef __WXGTK__ // avoid seg fault on Linux (only happens if ctrl-Q is used to quit) exit(0); #endif // deallocate things (usually no need) to help find any real memory leaks if (debuglevel == 666) { wxGetApp().Yield(); // (because Destroy() doesn't act immediately) if (numlayers > 1) DeleteOtherLayers(); delete currlayer; delete stopwatch; DeleteAlgorithms(); FreeCursors(); FreeDefaultColors(); } } // ----------------------------------------------------------------------------- void MainFrame::QuitApp() { Close(false); // false allows OnClose handler to veto close } // ----------------------------------------------------------------------------- #if wxUSE_DRAG_AND_DROP // derive a simple class for handling dropped files class DnDFile : public wxFileDropTarget { public: DnDFile() {} virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames); }; bool DnDFile::OnDropFiles(wxCoord, wxCoord, const wxArrayString& filenames) { // bring app to front #ifdef __WXMAC__ ProcessSerialNumber process; if ( GetCurrentProcess(&process) == noErr ) SetFrontProcess(&process); #endif #ifdef __WXMSW__ SetForegroundWindow( (HWND)mainptr->GetHandle() ); #endif mainptr->Raise(); size_t numfiles = filenames.GetCount(); for ( size_t n = 0; n < numfiles; n++ ) { mainptr->OpenFile(filenames[n]); } #ifdef __WXMAC__ // need to call Refresh a bit later to remove colored frame on Mac onetimer->Start(10, wxTIMER_ONE_SHOT); // OnOneTimer will be called once after a delay of 0.01 secs #endif return true; } wxDropTarget* MainFrame::NewDropTarget() { return new DnDFile(); } #endif // wxUSE_DRAG_AND_DROP // ----------------------------------------------------------------------------- void MainFrame::SetRandomFillPercentage() { // update Random Fill menu item to show randomfill value wxMenuBar* mbar = GetMenuBar(); if (mbar) { wxString randlabel; randlabel.Printf(_("Random Fill (%d%c)"), randomfill, '%'); randlabel += GetAccelerator(DO_RANDFILL); mbar->SetLabel(ID_RANDOM, randlabel); } } // ----------------------------------------------------------------------------- void MainFrame::UpdateLayerItem(int index) { // update name in given layer's menu item Layer* layer = GetLayer(index); wxMenuBar* mbar = GetMenuBar(); if (mbar) { wxString label = wxEmptyString; // we no longer show index in front of name // label.Printf(_("%d: "), index); // display asterisk if pattern has been modified if (layer->dirty) label += wxT("*"); int cid = layer->cloneid; while (cid > 0) { // display one or more "=" chars to indicate this is a cloned layer label += wxT("="); cid--; } label += layer->currname; // duplicate any ampersands so they appear label.Replace(wxT("&"), wxT("&&")); mbar->SetLabel(ID_LAYER0 + index, label); // also update name in corresponding layer button UpdateLayerButton(index, label); } } // ----------------------------------------------------------------------------- void MainFrame::AppendLayerItem() { wxMenuBar* mbar = GetMenuBar(); if (mbar) { wxMenu* layermenu = mbar->GetMenu( mbar->FindMenu(_("Layer")) ); if (layermenu) { // no point setting the item name here because UpdateLayerItem // will be called very soon layermenu->AppendCheckItem(ID_LAYER0 + numlayers - 1, _("foo")); } else { Warning(_("Could not find Layer menu!")); } } } // ----------------------------------------------------------------------------- void MainFrame::RemoveLayerItem() { wxMenuBar* mbar = GetMenuBar(); if (mbar) { wxMenu* layermenu = mbar->GetMenu( mbar->FindMenu(_("Layer")) ); if (layermenu) { layermenu->Delete(ID_LAYER0 + numlayers); } else { Warning(_("Could not find Layer menu!")); } } } // ----------------------------------------------------------------------------- void MainFrame::CreateMenus() { wxMenu* fileMenu = new wxMenu(); wxMenu* editMenu = new wxMenu(); wxMenu* controlMenu = new wxMenu(); wxMenu* viewMenu = new wxMenu(); wxMenu* layerMenu = new wxMenu(); wxMenu* helpMenu = new wxMenu(); // create submenus wxMenu* plocSubMenu = new wxMenu(); wxMenu* pmodeSubMenu = new wxMenu(); wxMenu* cmodeSubMenu = new wxMenu(); wxMenu* scaleSubMenu = new wxMenu(); plocSubMenu->AppendCheckItem(ID_PL_TL, _("Top Left")); plocSubMenu->AppendCheckItem(ID_PL_TR, _("Top Right")); plocSubMenu->AppendCheckItem(ID_PL_BR, _("Bottom Right")); plocSubMenu->AppendCheckItem(ID_PL_BL, _("Bottom Left")); plocSubMenu->AppendCheckItem(ID_PL_MID, _("Middle")); pmodeSubMenu->AppendCheckItem(ID_PM_AND, _("And")); pmodeSubMenu->AppendCheckItem(ID_PM_COPY, _("Copy")); pmodeSubMenu->AppendCheckItem(ID_PM_OR, _("Or")); pmodeSubMenu->AppendCheckItem(ID_PM_XOR, _("Xor")); cmodeSubMenu->AppendCheckItem(ID_DRAW, _("Draw") + GetAccelerator(DO_CURSDRAW)); cmodeSubMenu->AppendCheckItem(ID_PICK, _("Pick") + GetAccelerator(DO_CURSPICK)); cmodeSubMenu->AppendCheckItem(ID_SELECT, _("Select") + GetAccelerator(DO_CURSSEL)); cmodeSubMenu->AppendCheckItem(ID_MOVE, _("Move") + GetAccelerator(DO_CURSMOVE)); cmodeSubMenu->AppendCheckItem(ID_ZOOMIN, _("Zoom In") + GetAccelerator(DO_CURSIN)); cmodeSubMenu->AppendCheckItem(ID_ZOOMOUT, _("Zoom Out") + GetAccelerator(DO_CURSOUT)); scaleSubMenu->AppendCheckItem(ID_SCALE_1, _("1:1") + GetAccelerator(DO_SCALE1)); scaleSubMenu->AppendCheckItem(ID_SCALE_2, _("1:2") + GetAccelerator(DO_SCALE2)); scaleSubMenu->AppendCheckItem(ID_SCALE_4, _("1:4") + GetAccelerator(DO_SCALE4)); scaleSubMenu->AppendCheckItem(ID_SCALE_8, _("1:8") + GetAccelerator(DO_SCALE8)); scaleSubMenu->AppendCheckItem(ID_SCALE_16, _("1:16") + GetAccelerator(DO_SCALE16)); scaleSubMenu->AppendCheckItem(ID_SCALE_32, _("1:32") + GetAccelerator(DO_SCALE32)); fileMenu->Append(wxID_NEW, _("New Pattern") + GetAccelerator(DO_NEWPATT)); fileMenu->AppendSeparator(); fileMenu->Append(wxID_OPEN, _("Open Pattern...") + GetAccelerator(DO_OPENPATT)); fileMenu->Append(ID_OPEN_CLIP, _("Open Clipboard") + GetAccelerator(DO_OPENCLIP)); fileMenu->Append(ID_OPEN_RECENT, _("Open Recent"), patternSubMenu); fileMenu->AppendSeparator(); fileMenu->AppendCheckItem(ID_SHOW_PATTERNS, _("Show Patterns") + GetAccelerator(DO_PATTERNS)); fileMenu->Append(ID_PATTERN_DIR, _("Set Pattern Folder...") + GetAccelerator(DO_PATTDIR)); fileMenu->AppendSeparator(); fileMenu->Append(wxID_SAVE, _("Save Pattern...") + GetAccelerator(DO_SAVE)); fileMenu->AppendCheckItem(ID_SAVE_XRLE, _("Save Extended RLE") + GetAccelerator(DO_SAVEXRLE)); fileMenu->AppendSeparator(); fileMenu->Append(ID_RUN_SCRIPT, _("Run Script...") + GetAccelerator(DO_RUNSCRIPT)); fileMenu->Append(ID_RUN_CLIP, _("Run Clipboard") + GetAccelerator(DO_RUNCLIP)); fileMenu->Append(ID_RUN_RECENT, _("Run Recent"), scriptSubMenu); fileMenu->AppendSeparator(); fileMenu->AppendCheckItem(ID_SHOW_SCRIPTS, _("Show Scripts") + GetAccelerator(DO_SCRIPTS)); fileMenu->Append(ID_SCRIPT_DIR, _("Set Script Folder...") + GetAccelerator(DO_SCRIPTDIR)); #if !defined(__WXOSX_COCOA__) fileMenu->AppendSeparator(); #endif // on the Mac the wxID_PREFERENCES item is moved to the app menu fileMenu->Append(wxID_PREFERENCES, _("Preferences...") + GetAccelerator(DO_PREFS)); #if !defined(__WXOSX_COCOA__) fileMenu->AppendSeparator(); #endif // on the Mac the wxID_EXIT item is moved to the app menu and the app name is appended to "Quit " fileMenu->Append(wxID_EXIT, _("Quit") + GetAccelerator(DO_QUIT)); editMenu->Append(ID_UNDO, _("Undo") + GetAccelerator(DO_UNDO)); editMenu->Append(ID_REDO, _("Redo") + GetAccelerator(DO_REDO)); editMenu->AppendCheckItem(ID_NO_UNDO, _("Disable Undo/Redo") + GetAccelerator(DO_DISABLE)); editMenu->AppendSeparator(); editMenu->Append(ID_CUT, _("Cut") + GetAccelerator(DO_CUT)); editMenu->Append(ID_COPY, _("Copy") + GetAccelerator(DO_COPY)); editMenu->Append(ID_CLEAR, _("Clear") + GetAccelerator(DO_CLEAR)); editMenu->Append(ID_OUTSIDE, _("Clear Outside") + GetAccelerator(DO_CLEAROUT)); editMenu->AppendSeparator(); editMenu->Append(ID_PASTE, _("Paste") + GetAccelerator(DO_PASTE)); editMenu->Append(ID_PMODE, _("Paste Mode"), pmodeSubMenu); editMenu->Append(ID_PLOCATION, _("Paste Location"), plocSubMenu); editMenu->Append(ID_PASTE_SEL, _("Paste to Selection") + GetAccelerator(DO_PASTESEL)); editMenu->AppendSeparator(); editMenu->Append(ID_SELECTALL, _("Select All") + GetAccelerator(DO_SELALL)); editMenu->Append(ID_REMOVE, _("Remove Selection") + GetAccelerator(DO_REMOVESEL)); editMenu->Append(ID_SHRINK, _("Shrink Selection") + GetAccelerator(DO_SHRINK)); // full label will be set later by SetRandomFillPercentage editMenu->Append(ID_RANDOM, _("Random Fill") + GetAccelerator(DO_RANDFILL)); editMenu->Append(ID_FLIPTB, _("Flip Top-Bottom") + GetAccelerator(DO_FLIPTB)); editMenu->Append(ID_FLIPLR, _("Flip Left-Right") + GetAccelerator(DO_FLIPLR)); editMenu->Append(ID_ROTATEC, _("Rotate Clockwise") + GetAccelerator(DO_ROTATECW)); editMenu->Append(ID_ROTATEA, _("Rotate Anticlockwise") + GetAccelerator(DO_ROTATEACW)); editMenu->AppendSeparator(); editMenu->Append(ID_CMODE, _("Cursor Mode"), cmodeSubMenu); controlMenu->Append(ID_START, _("Start Generating") + GetAccelerator(DO_STARTSTOP)); controlMenu->Append(ID_NEXT, _("Next Generation") + GetAccelerator(DO_NEXTGEN)); controlMenu->Append(ID_STEP, _("Next Step") + GetAccelerator(DO_NEXTSTEP)); controlMenu->AppendSeparator(); controlMenu->Append(ID_RESET, _("Reset") + GetAccelerator(DO_RESET)); controlMenu->Append(ID_SETGEN, _("Set Generation...") + GetAccelerator(DO_SETGEN)); controlMenu->AppendSeparator(); controlMenu->Append(ID_FASTER, _("Faster") + GetAccelerator(DO_FASTER)); controlMenu->Append(ID_SLOWER, _("Slower") + GetAccelerator(DO_SLOWER)); controlMenu->Append(ID_SETBASE, _("Set Base Step...") + GetAccelerator(DO_SETBASE)); controlMenu->AppendSeparator(); controlMenu->AppendCheckItem(ID_AUTO, _("Auto Fit") + GetAccelerator(DO_AUTOFIT)); controlMenu->AppendCheckItem(ID_HYPER, _("Hyperspeed") + GetAccelerator(DO_HYPER)); controlMenu->AppendCheckItem(ID_HINFO, _("Show Hash Info") + GetAccelerator(DO_HASHINFO)); controlMenu->AppendSeparator(); controlMenu->Append(ID_RECORD, _("Start Recording") + GetAccelerator(DO_RECORD)); controlMenu->Append(ID_DELTIME, _("Delete Timeline") + GetAccelerator(DO_DELTIME)); controlMenu->AppendSeparator(); controlMenu->Append(ID_CONVERT, _("Convert Old Rules")); // rarely used, so no accelerator controlMenu->AppendSeparator(); controlMenu->Append(ID_SETALGO, _("Set Algorithm"), algomenu); controlMenu->Append(ID_SETRULE, _("Set Rule...") + GetAccelerator(DO_SETRULE)); viewMenu->Append(ID_FULL, _("Full Screen") + GetAccelerator(DO_FULLSCREEN)); viewMenu->AppendSeparator(); viewMenu->Append(ID_FIT, _("Fit Pattern") + GetAccelerator(DO_FIT)); viewMenu->Append(ID_FIT_SEL, _("Fit Selection") + GetAccelerator(DO_FITSEL)); viewMenu->Append(ID_MIDDLE, _("Middle") + GetAccelerator(DO_MIDDLE)); viewMenu->Append(ID_RESTORE00, _("Restore Origin") + GetAccelerator(DO_RESTORE00)); viewMenu->AppendSeparator(); viewMenu->Append(wxID_ZOOM_IN, _("Zoom In") + GetAccelerator(DO_ZOOMIN)); viewMenu->Append(wxID_ZOOM_OUT, _("Zoom Out") + GetAccelerator(DO_ZOOMOUT)); viewMenu->Append(ID_SET_SCALE, _("Set Scale"), scaleSubMenu); viewMenu->AppendSeparator(); viewMenu->AppendCheckItem(ID_TOOL_BAR, _("Show Tool Bar") + GetAccelerator(DO_SHOWTOOL)); viewMenu->AppendCheckItem(ID_LAYER_BAR, _("Show Layer Bar") + GetAccelerator(DO_SHOWLAYER)); viewMenu->AppendCheckItem(ID_EDIT_BAR, _("Show Edit Bar") + GetAccelerator(DO_SHOWEDIT)); viewMenu->AppendCheckItem(ID_ALL_STATES, _("Show All States") + GetAccelerator(DO_SHOWSTATES)); viewMenu->AppendCheckItem(ID_STATUS_BAR, _("Show Status Bar") + GetAccelerator(DO_SHOWSTATUS)); viewMenu->AppendCheckItem(ID_EXACT, _("Show Exact Numbers") + GetAccelerator(DO_SHOWEXACT)); viewMenu->AppendCheckItem(ID_GRID, _("Show Grid Lines") + GetAccelerator(DO_SHOWGRID)); viewMenu->AppendCheckItem(ID_ICONS, _("Show Cell Icons") + GetAccelerator(DO_SHOWICONS)); viewMenu->AppendCheckItem(ID_INVERT, _("Invert Colors") + GetAccelerator(DO_INVERT)); viewMenu->AppendCheckItem(ID_BUFF, _("Buffered") + GetAccelerator(DO_BUFFERED)); viewMenu->AppendCheckItem(ID_TIMELINE, _("Show Timeline") + GetAccelerator(DO_SHOWTIME)); viewMenu->AppendSeparator(); viewMenu->Append(ID_INFO, _("Pattern Info") + GetAccelerator(DO_INFO)); layerMenu->Append(ID_ADD_LAYER, _("Add Layer") + GetAccelerator(DO_ADD)); layerMenu->Append(ID_CLONE, _("Clone Layer") + GetAccelerator(DO_CLONE)); layerMenu->Append(ID_DUPLICATE, _("Duplicate Layer") + GetAccelerator(DO_DUPLICATE)); layerMenu->AppendSeparator(); layerMenu->Append(ID_DEL_LAYER, _("Delete Layer") + GetAccelerator(DO_DELETE)); layerMenu->Append(ID_DEL_OTHERS, _("Delete Other Layers") + GetAccelerator(DO_DELOTHERS)); layerMenu->AppendSeparator(); layerMenu->Append(ID_MOVE_LAYER, _("Move Layer...") + GetAccelerator(DO_MOVELAYER)); layerMenu->Append(ID_NAME_LAYER, _("Name Layer...") + GetAccelerator(DO_NAMELAYER)); layerMenu->Append(ID_SET_COLORS, _("Set Layer Colors...") + GetAccelerator(DO_SETCOLORS)); layerMenu->AppendSeparator(); layerMenu->AppendCheckItem(ID_SYNC_VIEW, _("Synchronize Views") + GetAccelerator(DO_SYNCVIEWS)); layerMenu->AppendCheckItem(ID_SYNC_CURS, _("Synchronize Cursors") + GetAccelerator(DO_SYNCCURS)); layerMenu->AppendSeparator(); layerMenu->AppendCheckItem(ID_STACK, _("Stack Layers") + GetAccelerator(DO_STACK)); layerMenu->AppendCheckItem(ID_TILE, _("Tile Layers") + GetAccelerator(DO_TILE)); layerMenu->AppendSeparator(); layerMenu->AppendCheckItem(ID_LAYER0, _("0")); // UpdateLayerItem will soon change the above item name helpMenu->Append(ID_HELP_INDEX, _("Contents")); helpMenu->Append(ID_HELP_INTRO, _("Introduction")); helpMenu->Append(ID_HELP_TIPS, _("Hints and Tips")); helpMenu->Append(ID_HELP_ALGOS, _("Algorithms")); helpMenu->Append(ID_HELP_LEXICON, _("Life Lexicon")); helpMenu->Append(ID_HELP_ARCHIVES, _("Online Archives")); helpMenu->AppendSeparator(); helpMenu->Append(ID_HELP_PERL, _("Perl Scripting")); helpMenu->Append(ID_HELP_PYTHON, _("Python Scripting")); helpMenu->AppendSeparator(); helpMenu->Append(ID_HELP_KEYBOARD, _("Keyboard Shortcuts")); helpMenu->Append(ID_HELP_MOUSE, _("Mouse Shortcuts")); helpMenu->AppendSeparator(); helpMenu->Append(ID_HELP_FILE, _("File Menu")); helpMenu->Append(ID_HELP_EDIT, _("Edit Menu")); helpMenu->Append(ID_HELP_CONTROL, _("Control Menu")); helpMenu->Append(ID_HELP_VIEW, _("View Menu")); helpMenu->Append(ID_HELP_LAYER, _("Layer Menu")); helpMenu->Append(ID_HELP_HELP, _("Help Menu")); helpMenu->AppendSeparator(); helpMenu->Append(ID_HELP_REFS, _("References")); helpMenu->Append(ID_HELP_FORMATS, _("File Formats")); helpMenu->Append(ID_HELP_BOUNDED, _("Bounded Grids")); helpMenu->Append(ID_HELP_PROBLEMS, _("Known Problems")); helpMenu->Append(ID_HELP_CHANGES, _("Changes")); helpMenu->Append(ID_HELP_CREDITS, _("Credits")); #ifndef __WXMAC__ helpMenu->AppendSeparator(); #endif // on the Mac the wxID_ABOUT item gets moved to the app menu helpMenu->Append(wxID_ABOUT, _("About Golly") + GetAccelerator(DO_ABOUT)); // create the menu bar and append menus; // avoid using "&" in menu names because it prevents using keyboard shortcuts // like Alt+L on Linux wxMenuBar* menuBar = new wxMenuBar(); if (menuBar == NULL) Fatal(_("Failed to create menu bar!")); menuBar->Append(fileMenu, _("File")); menuBar->Append(editMenu, _("Edit")); menuBar->Append(controlMenu, _("Control")); menuBar->Append(viewMenu, _("View")); menuBar->Append(layerMenu, _("Layer")); #ifdef __WXMAC__ // wxMac bug: need the "&" otherwise we get an extra Help menu menuBar->Append(helpMenu, _("&Help")); #else menuBar->Append(helpMenu, _("Help")); #endif #ifdef __WXMAC__ // prevent Window menu being added automatically by wxMac 2.6.1+ menuBar->SetAutoWindowMenu(false); #endif // attach menu bar to the frame SetMenuBar(menuBar); } // ----------------------------------------------------------------------------- void MainFrame::UpdateMenuAccelerators() { // keyboard shortcuts have changed, so update all menu item accelerators wxMenuBar* mbar = GetMenuBar(); if (mbar) { // wxMac bug: these app menu items aren't updated (but user isn't likely // to change them so don't bother trying to fix the bug) SetAccelerator(mbar, wxID_ABOUT, DO_ABOUT); SetAccelerator(mbar, wxID_PREFERENCES, DO_PREFS); SetAccelerator(mbar, wxID_EXIT, DO_QUIT); SetAccelerator(mbar, ID_DRAW, DO_CURSDRAW); SetAccelerator(mbar, ID_PICK, DO_CURSPICK); SetAccelerator(mbar, ID_SELECT, DO_CURSSEL); SetAccelerator(mbar, ID_MOVE, DO_CURSMOVE); SetAccelerator(mbar, ID_ZOOMIN, DO_CURSIN); SetAccelerator(mbar, ID_ZOOMOUT, DO_CURSOUT); SetAccelerator(mbar, ID_SCALE_1, DO_SCALE1); SetAccelerator(mbar, ID_SCALE_2, DO_SCALE2); SetAccelerator(mbar, ID_SCALE_4, DO_SCALE4); SetAccelerator(mbar, ID_SCALE_8, DO_SCALE8); SetAccelerator(mbar, ID_SCALE_16, DO_SCALE16); SetAccelerator(mbar, ID_SCALE_32, DO_SCALE32); SetAccelerator(mbar, wxID_NEW, DO_NEWPATT); SetAccelerator(mbar, wxID_OPEN, DO_OPENPATT); SetAccelerator(mbar, ID_OPEN_CLIP, DO_OPENCLIP); SetAccelerator(mbar, ID_SHOW_PATTERNS, DO_PATTERNS); SetAccelerator(mbar, ID_PATTERN_DIR, DO_PATTDIR); SetAccelerator(mbar, wxID_SAVE, DO_SAVE); SetAccelerator(mbar, ID_SAVE_XRLE, DO_SAVEXRLE); SetAccelerator(mbar, ID_RUN_SCRIPT, DO_RUNSCRIPT); SetAccelerator(mbar, ID_RUN_CLIP, DO_RUNCLIP); SetAccelerator(mbar, ID_SHOW_SCRIPTS, DO_SCRIPTS); SetAccelerator(mbar, ID_SCRIPT_DIR, DO_SCRIPTDIR); SetAccelerator(mbar, ID_UNDO, DO_UNDO); SetAccelerator(mbar, ID_REDO, DO_REDO); SetAccelerator(mbar, ID_NO_UNDO, DO_DISABLE); SetAccelerator(mbar, ID_CUT, DO_CUT); SetAccelerator(mbar, ID_COPY, DO_COPY); SetAccelerator(mbar, ID_CLEAR, DO_CLEAR); SetAccelerator(mbar, ID_OUTSIDE, DO_CLEAROUT); SetAccelerator(mbar, ID_PASTE, DO_PASTE); SetAccelerator(mbar, ID_PASTE_SEL, DO_PASTESEL); SetAccelerator(mbar, ID_SELECTALL, DO_SELALL); SetAccelerator(mbar, ID_REMOVE, DO_REMOVESEL); SetAccelerator(mbar, ID_SHRINK, DO_SHRINK); SetAccelerator(mbar, ID_RANDOM, DO_RANDFILL); SetAccelerator(mbar, ID_FLIPTB, DO_FLIPTB); SetAccelerator(mbar, ID_FLIPLR, DO_FLIPLR); SetAccelerator(mbar, ID_ROTATEC, DO_ROTATECW); SetAccelerator(mbar, ID_ROTATEA, DO_ROTATEACW); SetAccelerator(mbar, ID_START, DO_STARTSTOP); SetAccelerator(mbar, ID_NEXT, DO_NEXTGEN); SetAccelerator(mbar, ID_STEP, DO_NEXTSTEP); SetAccelerator(mbar, ID_RESET, DO_RESET); SetAccelerator(mbar, ID_SETGEN, DO_SETGEN); SetAccelerator(mbar, ID_FASTER, DO_FASTER); SetAccelerator(mbar, ID_SLOWER, DO_SLOWER); SetAccelerator(mbar, ID_SETBASE, DO_SETBASE); SetAccelerator(mbar, ID_AUTO, DO_AUTOFIT); SetAccelerator(mbar, ID_HYPER, DO_HYPER); SetAccelerator(mbar, ID_HINFO, DO_HASHINFO); SetAccelerator(mbar, ID_RECORD, DO_RECORD); SetAccelerator(mbar, ID_DELTIME, DO_DELTIME); SetAccelerator(mbar, ID_SETRULE, DO_SETRULE); SetAccelerator(mbar, ID_FULL, DO_FULLSCREEN); SetAccelerator(mbar, ID_FIT, DO_FIT); SetAccelerator(mbar, ID_FIT_SEL, DO_FITSEL); SetAccelerator(mbar, ID_MIDDLE, DO_MIDDLE); SetAccelerator(mbar, ID_RESTORE00, DO_RESTORE00); SetAccelerator(mbar, wxID_ZOOM_IN, DO_ZOOMIN); SetAccelerator(mbar, wxID_ZOOM_OUT, DO_ZOOMOUT); SetAccelerator(mbar, ID_TOOL_BAR, DO_SHOWTOOL); SetAccelerator(mbar, ID_LAYER_BAR, DO_SHOWLAYER); SetAccelerator(mbar, ID_EDIT_BAR, DO_SHOWEDIT); SetAccelerator(mbar, ID_ALL_STATES, DO_SHOWSTATES); SetAccelerator(mbar, ID_STATUS_BAR, DO_SHOWSTATUS); SetAccelerator(mbar, ID_EXACT, DO_SHOWEXACT); SetAccelerator(mbar, ID_GRID, DO_SHOWGRID); SetAccelerator(mbar, ID_ICONS, DO_SHOWICONS); SetAccelerator(mbar, ID_INVERT, DO_INVERT); SetAccelerator(mbar, ID_BUFF, DO_BUFFERED); SetAccelerator(mbar, ID_TIMELINE, DO_SHOWTIME); SetAccelerator(mbar, ID_INFO, DO_INFO); SetAccelerator(mbar, ID_ADD_LAYER, DO_ADD); SetAccelerator(mbar, ID_CLONE, DO_CLONE); SetAccelerator(mbar, ID_DUPLICATE, DO_DUPLICATE); SetAccelerator(mbar, ID_DEL_LAYER, DO_DELETE); SetAccelerator(mbar, ID_DEL_OTHERS, DO_DELOTHERS); SetAccelerator(mbar, ID_MOVE_LAYER, DO_MOVELAYER); SetAccelerator(mbar, ID_NAME_LAYER, DO_NAMELAYER); SetAccelerator(mbar, ID_SET_COLORS, DO_SETCOLORS); SetAccelerator(mbar, ID_SYNC_VIEW, DO_SYNCVIEWS); SetAccelerator(mbar, ID_SYNC_CURS, DO_SYNCCURS); SetAccelerator(mbar, ID_STACK, DO_STACK); SetAccelerator(mbar, ID_TILE, DO_TILE); } } // ----------------------------------------------------------------------------- void MainFrame::CreateDirControls() { patternctrl = new wxGenericDirCtrl(splitwin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, #ifdef __WXMSW__ // speed up a bit wxDIRCTRL_DIR_ONLY | wxNO_BORDER, #else wxNO_BORDER, #endif wxEmptyString // see all file types ); if (patternctrl == NULL) Fatal(_("Failed to create pattern directory control!")); scriptctrl = new wxGenericDirCtrl(splitwin, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, #ifdef __WXMSW__ // speed up a bit wxDIRCTRL_DIR_ONLY | wxNO_BORDER, #else wxNO_BORDER, #endif #if wxCHECK_VERSION(2,9,0) // avoid seeing the wxChoice control (ugly and buggy) wxEmptyString #else _T("Perl/Python scripts|*.pl;*.py") #endif ); if (scriptctrl == NULL) Fatal(_("Failed to create script directory control!")); // AKT: above check for 2.9 should make the following unnecessary!!!??? // With wxGTK 2.9, setting the filter in the wxGenericDirCtrl constructor // causes a crash, but setting it afterwards seems to work fine. // scriptctrl->SetFilter(_T("Perl/Python scripts|*.pl;*.py")); #ifdef __WXMSW__ // now remove wxDIRCTRL_DIR_ONLY so we see files patternctrl->SetWindowStyle(wxNO_BORDER); scriptctrl->SetWindowStyle(wxNO_BORDER); #endif #if defined(__WXGTK__) // make sure background is white when using KDE's GTK theme #if wxCHECK_VERSION(2,9,0) patternctrl->GetTreeCtrl()->SetBackgroundStyle(wxBG_STYLE_ERASE); scriptctrl->GetTreeCtrl()->SetBackgroundStyle(wxBG_STYLE_ERASE); #else patternctrl->GetTreeCtrl()->SetBackgroundStyle(wxBG_STYLE_COLOUR); scriptctrl->GetTreeCtrl()->SetBackgroundStyle(wxBG_STYLE_COLOUR); #endif patternctrl->GetTreeCtrl()->SetBackgroundColour(*wxWHITE); scriptctrl->GetTreeCtrl()->SetBackgroundColour(*wxWHITE); // reduce indent a bit patternctrl->GetTreeCtrl()->SetIndent(8); scriptctrl->GetTreeCtrl()->SetIndent(8); #elif defined(__WXMAC__) // reduce indent a bit more patternctrl->GetTreeCtrl()->SetIndent(6); scriptctrl->GetTreeCtrl()->SetIndent(6); #else // reduce indent a lot on Windows patternctrl->GetTreeCtrl()->SetIndent(4); scriptctrl->GetTreeCtrl()->SetIndent(4); #endif #ifdef __WXMAC__ // reduce font size (to get this to reduce line height we had to // make a few changes to wxMac/src/generic/treectlg.cpp) wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); font.SetPointSize(12); patternctrl->GetTreeCtrl()->SetFont(font); scriptctrl->GetTreeCtrl()->SetFont(font); #endif if ( wxFileName::DirExists(patterndir) ) { // only show patterndir and its contents SimplifyTree(patterndir, patternctrl->GetTreeCtrl(), patternctrl->GetRootId()); } if ( wxFileName::DirExists(scriptdir) ) { // only show scriptdir and its contents SimplifyTree(scriptdir, scriptctrl->GetTreeCtrl(), scriptctrl->GetRootId()); } // install event handler to detect control/right-click on a file patternctrl->GetTreeCtrl()->Connect(wxID_ANY, wxEVT_LEFT_DOWN, wxMouseEventHandler(MainFrame::OnTreeClick)); patternctrl->GetTreeCtrl()->Connect(wxID_ANY, wxEVT_RIGHT_DOWN, wxMouseEventHandler(MainFrame::OnTreeClick)); scriptctrl->GetTreeCtrl()->Connect(wxID_ANY, wxEVT_LEFT_DOWN, wxMouseEventHandler(MainFrame::OnTreeClick)); scriptctrl->GetTreeCtrl()->Connect(wxID_ANY, wxEVT_RIGHT_DOWN, wxMouseEventHandler(MainFrame::OnTreeClick)); #ifdef __WXMSW__ // fix double-click problem patternctrl->GetTreeCtrl()->Connect(wxID_ANY, wxEVT_LEFT_DCLICK, wxMouseEventHandler(MainFrame::OnTreeClick)); scriptctrl->GetTreeCtrl()->Connect(wxID_ANY, wxEVT_LEFT_DCLICK, wxMouseEventHandler(MainFrame::OnTreeClick)); #endif } // ----------------------------------------------------------------------------- // create the main window MainFrame::MainFrame() : wxFrame(NULL, wxID_ANY, wxEmptyString, wxPoint(mainx,mainy), wxSize(mainwd,mainht)) { wxGetApp().SetFrameIcon(this); // initialize paths to some temporary files (in datadir so no need to be hidden); // they must be absolute paths in case they are used from a script command when the // current directory has been changed to the location of the script file clipfile = datadir + wxT("golly_clipboard"); perlfile = datadir + wxT("golly_clip.pl"); pythonfile = datadir + wxT("golly_clip.py"); // create one-shot timer (see OnOneTimer) onetimer = new wxTimer(this, wxID_ANY); CreateMenus(); CreateToolbar(); // if tool bar is visible then adjust position of other child windows int toolwd = showtool ? toolbarwd : 0; int wd, ht; GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; // wxStatusBar can only appear at bottom of frame so we use our own // status bar class which creates a child window at top of frame // but to the right of the tool bar int statht = showexact ? STATUS_EXHT : STATUS_HT; if (!showstatus) statht = 0; statusptr = new StatusBar(this, toolwd, 0, wd - toolwd, statht); if (statusptr == NULL) Fatal(_("Failed to create status bar!")); // create a split window with pattern/script directory in left pane // and layer/edit/timeline bars and pattern viewport in right pane splitwin = new wxSplitterWindow(this, wxID_ANY, wxPoint(toolwd, statht), wxSize(wd - toolwd, ht - statht), #ifdef __WXMSW__ wxSP_BORDER | #endif wxSP_3DSASH | wxSP_NO_XP_THEME | wxSP_LIVE_UPDATE); if (splitwin == NULL) Fatal(_("Failed to create split window!")); // create patternctrl and scriptctrl in left pane CreateDirControls(); // create a window for right pane which contains layer/edit/timeline bars // and pattern viewport rightpane = new RightWindow(splitwin); if (rightpane == NULL) Fatal(_("Failed to create right pane!")); // create layer bar and initial layer CreateLayerBar(rightpane); AddLayer(); // create edit bar CreateEditBar(rightpane); // create timeline bar CreateTimelineBar(rightpane); // enable/disable tool tips after creating bars with buttons #if wxUSE_TOOLTIPS wxToolTip::Enable(showtips); wxToolTip::SetDelay(1500); // 1.5 secs #endif CreateTranslucentControls(); // must be done BEFORE creating viewport // create viewport at minimum size to avoid scroll bars being clipped on Mac int y = 0; if (showlayer) y += LayerBarHeight(); if (showedit) y += EditBarHeight(); viewptr = new PatternView(rightpane, 0, y, 40, 40, wxNO_BORDER | wxWANTS_CHARS | // receive all keyboard events wxFULL_REPAINT_ON_RESIZE | wxVSCROLL | wxHSCROLL); if (viewptr == NULL) Fatal(_("Failed to create viewport window!")); // this is the main viewport window (tile windows have a tileindex >= 0) viewptr->tileindex = -1; bigview = viewptr; #if wxUSE_DRAG_AND_DROP // let users drop files onto viewport viewptr->SetDropTarget(new DnDFile()); #endif // these seemingly redundant steps are needed to avoid problems on Windows splitwin->SplitVertically(patternctrl, rightpane, dirwinwd); splitwin->SetSashPosition(dirwinwd); splitwin->SetMinimumPaneSize(MIN_DIRWD); splitwin->Unsplit(patternctrl); splitwin->UpdateSize(); splitwin->SplitVertically(scriptctrl, rightpane, dirwinwd); splitwin->SetSashPosition(dirwinwd); splitwin->SetMinimumPaneSize(MIN_DIRWD); splitwin->Unsplit(scriptctrl); splitwin->UpdateSize(); if (showpatterns) splitwin->SplitVertically(patternctrl, rightpane, dirwinwd); if (showscripts) splitwin->SplitVertically(scriptctrl, rightpane, dirwinwd); InitDrawingData(); // do this after viewptr has been set pendingfiles.Clear(); // no pending script/pattern files command_pending = false; // no pending command draw_pending = false; // no pending draw keepmessage = false; // clear status message generating = false; // not generating pattern fullscreen = false; // not in full screen mode showbanner = true; // avoid first file clearing banner message } // ----------------------------------------------------------------------------- MainFrame::~MainFrame() { delete onetimer; DestroyDrawingData(); } ����������������������������������������������������golly-2.5-src/gui-wx/wxperl.cpp���������������������������������������������������������������������0000644�0001751�0000144�00000306023�12156145314�013464� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /* Golly uses an embedded Perl interpreter to execute scripts. Perl is Copyright (C) 1993-2007, by Larry Wall and others. It is free software; you can redistribute it and/or modify it under the terms of either: a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" (http://dev.perl.org/licenses/artistic.html). */ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/filename.h" // for wxFileName #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "readpattern.h" #include "writepattern.h" #include "wxgolly.h" // for wxGetApp, mainptr, viewptr, statusptr #include "wxmain.h" // for mainptr->... #include "wxselect.h" // for Selection #include "wxview.h" // for viewptr->... #include "wxstatus.h" // for statusptr->... #include "wxutils.h" // for Warning, Note, GetString, etc #include "wxprefs.h" // for perllib, gollydir, etc #include "wxinfo.h" // for ShowInfo #include "wxhelp.h" // for ShowHelp #include "wxundo.h" // for currlayer->undoredo->... #include "wxalgos.h" // for *_ALGO, CreateNewUniverse, etc #include "wxlayer.h" // for AddLayer, currlayer, currindex, etc #include "wxscript.h" // for inscript, abortmsg, GSF_*, etc #include "wxperl.h" // ============================================================================= // Perl scripting support is implemented by embedding a Perl interpreter. // See "perldoc perlembed" for details. #ifndef __WXMAC__ #include "wx/dynlib.h" // for wxDynamicLibrary #endif // avoid warning about _ being redefined #undef _ #ifdef __WXMSW__ // on Windows, wxWidgets defines uid_t/gid_t which breaks Perl's typedefs: #undef uid_t #undef gid_t // can't do "#undef mode_t" for a typedef so use this hack: typedef unsigned short MODE1; // from C:\Perl\lib\CORE\win32.h typedef int MODE2; // from C:\wxWidgets\include\wx\filefn.h #define mode_t MODE1 #endif #include <EXTERN.h> #include <perl.h> #include <XSUB.h> #ifdef __WXMSW__ #undef mode_t #define mode_t MODE2 #endif // restore wxWidgets definition for _ (from include/wx/intl.h) #undef _ #define _(s) wxGetTranslation(_T(s)) /* * Quoting Jan Dubois of Active State: * ActivePerl build 822 still identifies itself as 5.8.8 but already * contains many of the changes from the upcoming Perl 5.8.9 release. * * The changes include addition of two symbols (Perl_sv_2iv_flags, * Perl_newXS_flags) not present in earlier releases. * * Jan Dubois suggested the following guarding scheme: */ #if (ACTIVEPERL_VERSION >= 822) #define PERL589_OR_LATER #endif #if (PERL_REVISION == 5) && (PERL_VERSION == 8) && (PERL_SUBVERSION >= 9) #define PERL589_OR_LATER #endif #if (PERL_REVISION == 5) && (PERL_VERSION >= 9) #define PERL589_OR_LATER #endif // check if we're building with Perl 5.10 or later #if (ACTIVEPERL_VERSION >= 1000) #define PERL510_OR_LATER #endif #if (PERL_REVISION == 5) && (PERL_VERSION >= 10) #define PERL510_OR_LATER #endif // check if we're building with Perl 5.10.1 or later #if (PERL_REVISION == 5) && (PERL_VERSION == 10) && (PERL_SUBVERSION >= 1) #define PERL5101_OR_LATER #endif #if (PERL_REVISION == 5) && (PERL_VERSION >= 11) #define PERL5101_OR_LATER #endif // check if we're building with Perl 5.14 or later #if (PERL_REVISION == 5) && (PERL_VERSION >= 14) #define PERL514_OR_LATER #endif // Check if PL_thr_key is a real variable or instead a macro which calls // Perl_Gthr_key_ptr(NULL), which was the default before Perl 5.14: #ifdef PL_thr_key #define PERL_THR_KEY_FUNC 1 #endif static PerlInterpreter* my_perl = NULL; EXTERN_C void boot_DynaLoader(pTHX_ CV* cv); // ============================================================================= // On Windows and Linux we try to load the Perl library at runtime so Golly // will start up even if Perl isn't installed. // On Linux we can only load libperl dynamically if using Perl 5.10 or later. // In older Perl versions boot_DynaLoader is in DynaLoader.a and so libperl // has to be statically linked. #if defined(__WXMSW__) || (defined(__WXGTK__) && defined(PERL510_OR_LATER)) // load Perl lib at runtime #define USE_PERL_DYNAMIC #endif #ifdef USE_PERL_DYNAMIC // declare G_* wrappers for the functions we want to use from Perl lib extern "C" { #ifdef USE_ITHREADS #ifdef PERL_THR_KEY_FUNC perl_key*(*G_Perl_Gthr_key_ptr)(register PerlInterpreter*); #else perl_key *G_PL_thr_key; #endif #endif SV**(*G_Perl_av_fetch)(pTHX_ AV*, I32, I32); I32(*G_Perl_av_len)(pTHX_ AV*); void(*G_Perl_av_push)(pTHX_ AV*, SV*); void(*G_Perl_croak)(pTHX_ const char*, ...); void*(*G_Perl_get_context)(void); AV*(*G_Perl_newAV)(pTHX); SV*(*G_Perl_newRV)(pTHX_ SV*); SV*(*G_Perl_newSViv)(pTHX_ IV); SV*(*G_Perl_newSVpv)(pTHX_ const char*, STRLEN); CV*(*G_Perl_newXS)(pTHX_ char*, XSUBADDR_t, char*); SV**(*G_Perl_stack_grow)(pTHX_ SV**, SV**, int); IV(*G_Perl_sv_2iv)(pTHX_ SV*); SV*(*G_Perl_sv_2mortal)(pTHX_ SV*); char*(*G_Perl_sv_2pv_flags)(pTHX_ SV*, STRLEN*, I32); PerlInterpreter*(*G_perl_alloc)(void); void(*G_perl_construct)(PerlInterpreter*); int(*G_perl_destruct)(PerlInterpreter*); void(*G_perl_free)(PerlInterpreter*); int(*G_perl_parse)(PerlInterpreter*, XSINIT_t, int, char**, char**); int(*G_perl_run)(PerlInterpreter*); SV*(*G_Perl_eval_pv)(pTHX_ const char*, I32); #ifdef PERL589_OR_LATER IV(*G_Perl_sv_2iv_flags)(pTHX_ SV* sv, I32 flags); #endif #ifdef PERL510_OR_LATER void(*G_Perl_sys_init3)(int*, char***, char***); void(*G_Perl_sys_term)(void); #endif #ifdef PERL5101_OR_LATER SV*(*G_Perl_newSV_type)(pTHX_ svtype type); #endif void(*G_boot_DynaLoader)(pTHX_ CV*); #ifdef MULTIPLICITY #ifdef PERL510_OR_LATER SV***(*G_Perl_Istack_sp_ptr)(register PerlInterpreter*); SV***(*G_Perl_Istack_base_ptr)(register PerlInterpreter*); SV***(*G_Perl_Istack_max_ptr)(register PerlInterpreter*); I32**(*G_Perl_Imarkstack_ptr_ptr)(register PerlInterpreter*); #else SV***(*G_Perl_Tstack_sp_ptr)(register PerlInterpreter*); SV***(*G_Perl_Tstack_base_ptr)(register PerlInterpreter*); SV***(*G_Perl_Tstack_max_ptr)(register PerlInterpreter*); I32**(*G_Perl_Tmarkstack_ptr_ptr)(register PerlInterpreter*); #endif U8*(*G_Perl_Iexit_flags_ptr)(register PerlInterpreter*); signed char *(*G_Perl_Iperl_destruct_level_ptr)(register PerlInterpreter*); #else SV ***G_PL_stack_sp; SV ***G_PL_stack_base; SV ***G_PL_stack_max; I32 **G_PL_markstack_ptr; U8 *G_PL_exit_flags; signed char *G_PL_perl_destruct_level; #endif } // redefine Perl functions to their equivalent G_* wrappers #ifdef USE_ITHREADS #ifdef PERL_THR_KEY_FUNC #define Perl_Gthr_key_ptr G_Perl_Gthr_key_ptr #else #define PL_thr_key (*G_PL_thr_key) #endif #endif #define Perl_av_fetch G_Perl_av_fetch #define Perl_av_len G_Perl_av_len #define Perl_av_push G_Perl_av_push #define Perl_croak G_Perl_croak #define Perl_get_context G_Perl_get_context #define Perl_newAV G_Perl_newAV #define Perl_newRV G_Perl_newRV #define Perl_newSViv G_Perl_newSViv #define Perl_newSVpv G_Perl_newSVpv #define Perl_newXS G_Perl_newXS #define Perl_stack_grow G_Perl_stack_grow #define Perl_sv_2iv G_Perl_sv_2iv #define Perl_sv_2mortal G_Perl_sv_2mortal #define Perl_sv_2pv_flags G_Perl_sv_2pv_flags #define perl_alloc G_perl_alloc #define perl_construct G_perl_construct #define perl_destruct G_perl_destruct #define perl_free G_perl_free #define perl_parse G_perl_parse #define perl_run G_perl_run #define Perl_eval_pv G_Perl_eval_pv #ifdef PERL589_OR_LATER #define Perl_sv_2iv_flags G_Perl_sv_2iv_flags #endif #ifdef PERL510_OR_LATER #define Perl_sys_init3 G_Perl_sys_init3 #define Perl_sys_term G_Perl_sys_term #endif #ifdef MULTIPLICITY #ifdef PERL510_OR_LATER #define Perl_Imarkstack_ptr_ptr G_Perl_Imarkstack_ptr_ptr #define Perl_Istack_base_ptr G_Perl_Istack_base_ptr #define Perl_Istack_max_ptr G_Perl_Istack_max_ptr #define Perl_Istack_sp_ptr G_Perl_Istack_sp_ptr #else #define Perl_Tmarkstack_ptr_ptr G_Perl_Tmarkstack_ptr_ptr #define Perl_Tstack_base_ptr G_Perl_Tstack_base_ptr #define Perl_Tstack_max_ptr G_Perl_Tstack_max_ptr #define Perl_Tstack_sp_ptr G_Perl_Tstack_sp_ptr #endif #define Perl_Iexit_flags_ptr G_Perl_Iexit_flags_ptr #define Perl_Iperl_destruct_level_ptr G_Perl_Iperl_destruct_level_ptr #else /* no MULTIPLICITY */ #define PL_stack_sp (*G_PL_stack_sp) #define PL_stack_base (*G_PL_stack_base) #define PL_stack_max (*G_PL_stack_max) #define PL_markstack_ptr (*G_PL_markstack_ptr) #define PL_exit_flags (*G_PL_exit_flags) #define PL_perl_destruct_level (*G_PL_perl_destruct_level) #endif #ifdef PERL5101_OR_LATER #define Perl_newSV_type G_Perl_newSV_type #endif #define boot_DynaLoader G_boot_DynaLoader #ifdef __WXMSW__ #define PERL_PROC FARPROC #else #define PERL_PROC void * #endif #define PERL_FUNC(func) { _T(#func), (PERL_PROC*)&G_ ## func }, // store function names and their addresses in Perl lib static struct PerlFunc { const wxChar* name; // function name PERL_PROC* ptr; // function pointer } perlFuncs[] = { #ifdef USE_ITHREADS #ifdef PERL_THR_KEY_FUNC PERL_FUNC(Perl_Gthr_key_ptr) #else PERL_FUNC(PL_thr_key) #endif #endif PERL_FUNC(Perl_av_fetch) PERL_FUNC(Perl_av_len) PERL_FUNC(Perl_av_push) PERL_FUNC(Perl_croak) PERL_FUNC(Perl_get_context) PERL_FUNC(Perl_newAV) PERL_FUNC(Perl_newRV) PERL_FUNC(Perl_newSViv) PERL_FUNC(Perl_newSVpv) PERL_FUNC(Perl_newXS) PERL_FUNC(Perl_stack_grow) PERL_FUNC(Perl_sv_2iv) PERL_FUNC(Perl_sv_2mortal) PERL_FUNC(Perl_sv_2pv_flags) PERL_FUNC(perl_alloc) PERL_FUNC(perl_construct) PERL_FUNC(perl_destruct) PERL_FUNC(perl_free) PERL_FUNC(perl_parse) PERL_FUNC(perl_run) PERL_FUNC(Perl_eval_pv) #ifdef PERL589_OR_LATER PERL_FUNC(Perl_sv_2iv_flags) #endif #ifdef PERL510_OR_LATER PERL_FUNC(Perl_sys_init3) PERL_FUNC(Perl_sys_term) #endif #ifdef MULTIPLICITY #ifndef PERL514_OR_LATER // before Perl 5.14: PERL_FUNC(Perl_Iexit_flags_ptr) PERL_FUNC(Perl_Iperl_destruct_level_ptr) #ifdef PERL510_OR_LATER // Perl 5.10/5.12 only: PERL_FUNC(Perl_Imarkstack_ptr_ptr) PERL_FUNC(Perl_Istack_base_ptr) PERL_FUNC(Perl_Istack_max_ptr) PERL_FUNC(Perl_Istack_sp_ptr) #else // before Perl 5.10: PERL_FUNC(Perl_Tmarkstack_ptr_ptr) PERL_FUNC(Perl_Tstack_base_ptr) PERL_FUNC(Perl_Tstack_max_ptr) PERL_FUNC(Perl_Tstack_sp_ptr) #endif #endif #else /* no MULTIPLICITY */ /* N.B. these are actually variables, not functions, but the distinction does not matter for symbol resolution: */ PERL_FUNC(PL_stack_sp) PERL_FUNC(PL_stack_base) PERL_FUNC(PL_stack_max) PERL_FUNC(PL_markstack_ptr) PERL_FUNC(PL_exit_flags) PERL_FUNC(PL_perl_destruct_level) #endif #ifdef PERL5101_OR_LATER PERL_FUNC(Perl_newSV_type) #endif PERL_FUNC(boot_DynaLoader) { _T(""), NULL } }; // handle for Perl library static wxDllType perldll = NULL; static void FreePerlLib() { if ( perldll ) { wxDynamicLibrary::Unload(perldll); perldll = NULL; } } static bool LoadPerlLib() { // load the Perl library wxDynamicLibrary dynlib; // don't log errors in here wxLogNull noLog; // wxDL_GLOBAL corresponds to RTLD_GLOBAL on Linux (ignored on Windows) while ( !dynlib.Load(perllib, wxDL_NOW | wxDL_VERBATIM | wxDL_GLOBAL) ) { // prompt user for a different Perl library; // on Windows perllib should be something like "perl510.dll" // and on Linux it should be something like "libperl.so.5.10" Beep(); wxString str = _("If Perl isn't installed then you'll have to Cancel,"); str += _("\notherwise change the version numbers to match the"); str += _("\nversion installed on your system and try again."); #ifdef __WXMSW__ str += _("\n\nIf that fails, search your system for a perl*.dll"); str += _("\nfile and enter the full path to that file."); #endif wxTextEntryDialog dialog( wxGetActiveWindow(), str, _("Could not load the Perl library"), perllib, wxOK | wxCANCEL ); if (dialog.ShowModal() == wxID_OK) { perllib = dialog.GetValue(); } else { return false; } } if ( dynlib.IsLoaded() ) { // load all functions named in perlFuncs void* funcptr; PerlFunc* pf = perlFuncs; while ( pf->name[0] ) { funcptr = dynlib.GetSymbol(pf->name); if ( !funcptr ) { wxString err = _("The Perl library does not have this symbol:\n"); err += pf->name; err += _("\nYou need to install Perl "); #ifdef PERL510_OR_LATER err += _("5.10 or later."); #else err += _("5.8.x."); #endif Warning(err); return false; } *(pf++->ptr) = (PERL_PROC)funcptr; } perldll = dynlib.Detach(); } if ( perldll == NULL ) { // should never happen Warning(_("Oh dear, the Perl library is not loaded!")); } return perldll != NULL; } #endif // USE_PERL_DYNAMIC // ============================================================================= // some useful macros #define RETURN_IF_ABORTED if (PerlScriptAborted()) Perl_croak(aTHX_ NULL) #define PERL_ERROR(msg) { Perl_croak(aTHX_ "%s", msg); } #define CheckRGB(r,g,b,cmd) \ if (r < 0 || r > 255 || g < 0 || g > 255 || g < 0 || g > 255) { \ char msg[128]; \ sprintf(msg, "Bad rgb value in %s (%d,%d,%d).", cmd, r, g, b); \ PERL_ERROR(msg); \ } #ifdef __WXMSW__ #define IGNORE_UNUSED_PARAMS wxUnusedVar(cv); wxUnusedVar(my_perl); #else #define IGNORE_UNUSED_PARAMS #endif #ifdef __WXMAC__ // use decomposed UTF8 so fopen will work #define FILENAME wxString(filename,wxConvLocal).fn_str() #else #define FILENAME filename #endif // ----------------------------------------------------------------------------- void AbortPerlScript() { scripterr = wxString(abortmsg,wxConvLocal); // can't call Perl_croak here (done via RETURN_IF_ABORTED) } // ----------------------------------------------------------------------------- bool PerlScriptAborted() { if (allowcheck) wxGetApp().Poller()->checkevents(); // if user hit escape key then PassKeyToScript has called AbortPerlScript return !scripterr.IsEmpty(); } // ----------------------------------------------------------------------------- static void AddPadding(AV* array) { // assume array is multi-state and add an extra int if necessary so the array // has an odd number of ints (this is how we distinguish multi-state arrays // from one-state arrays -- the latter always have an even number of ints) int len = av_len(array) + 1; if (len == 0) return; // always return () rather than (0) if ((len & 1) == 0) { av_push(array, newSViv(0)); } } // ----------------------------------------------------------------------------- static const char* ExtractCellArray(AV* outarray, lifealgo* universe, bool shift = false) { // extract cell array from given universe if ( !universe->isEmpty() ) { bigint top, left, bottom, right; universe->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { return "Universe is too big to extract all cells!"; } bool multistate = universe->NumCellStates() > 2; int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int cx, cy; int v = 0; int cntr = 0; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = universe->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (shift) { // shift cells so that top left cell of bounding box is at 0,0 av_push(outarray, newSViv(cx - ileft)); av_push(outarray, newSViv(cy - itop)); } else { av_push(outarray, newSViv(cx)); av_push(outarray, newSViv(cy)); } if (multistate) av_push(outarray, newSViv(v)); } else { cx = iright; // done this row } cntr++; if ((cntr % 4096) == 0 && PerlScriptAborted()) return NULL; } } if (multistate) AddPadding(outarray); } return NULL; } // ============================================================================= // The following pl_* routines can be called from Perl scripts. XS(pl_open) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items < 1 || items > 2) PERL_ERROR("Usage: g_open($filename,$remember=0)."); STRLEN n_a; char* filename = SvPV(ST(0), n_a); int remember = 0; if (items > 1) remember = SvIV(ST(1)); const char* err = GSF_open(filename, remember); if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_save) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items < 2 || items > 3) PERL_ERROR("Usage: g_save($filename,$format,$remember=0)."); STRLEN n_a; char* filename = SvPV(ST(0), n_a); char* format = SvPV(ST(1), n_a); int remember = 0; if (items > 2) remember = SvIV(ST(2)); const char* err = GSF_save(filename, format, remember); if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_opendialog) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 5) PERL_ERROR("Usage: g_opendialog($title, $filetypes," "$initialdir, $initialfname, $mustexist=1)."); const char* title = "Choose a file"; const char* filetypes = "All files (*)|*"; const char* initialdir = ""; const char* initialfname = ""; int mustexist = 1; STRLEN n_a; if (items > 0) title = SvPV(ST(0), n_a); if (items > 1) filetypes = SvPV(ST(1), n_a); if (items > 2) initialdir = SvPV(ST(2), n_a); if (items > 3) initialfname = SvPV(ST(3), n_a); if (items > 4) mustexist = SvIV(ST(4)); wxString wxs_title(title, wxConvLocal); wxString wxs_filetypes(filetypes, wxConvLocal); wxString wxs_initialdir(initialdir, wxConvLocal); wxString wxs_initialfname(initialfname, wxConvLocal); wxString wxs_result = wxEmptyString; if (wxs_initialdir.IsEmpty()) wxs_initialdir = wxFileName::GetCwd(); if (wxs_filetypes == wxT("dir")) { // let user choose a directory wxDirDialog dirdlg(NULL, wxs_title, wxs_initialdir, wxDD_NEW_DIR_BUTTON); if (dirdlg.ShowModal() == wxID_OK) { wxs_result = dirdlg.GetPath(); if (wxs_result.Last() != wxFILE_SEP_PATH) wxs_result += wxFILE_SEP_PATH; } } else { // let user choose a file wxFileDialog opendlg(NULL, wxs_title, wxs_initialdir, wxs_initialfname, wxs_filetypes, wxFD_OPEN | (mustexist == 0 ? 0 : wxFD_FILE_MUST_EXIST) ); #ifdef __WXGTK__ // wxs_initialdir is ignored above (bug in wxGTK 2.8.0???) opendlg.SetDirectory(wxs_initialdir); #endif if (opendlg.ShowModal() == wxID_OK) wxs_result = opendlg.GetPath(); } XSRETURN_PV((const char*)wxs_result.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- XS(pl_savedialog) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 5) PERL_ERROR("Usage: g_savedialog($title, $filetypes," " $initialdir, $initialfname, $suppressprompt=0)."); const char* title = "Choose a save location and filename"; const char* filetypes = "All files (*)|*"; const char* initialdir = ""; const char* initialfname = ""; STRLEN n_a; if (items > 0) title = SvPV(ST(0), n_a); if (items > 1) filetypes = SvPV(ST(1), n_a); if (items > 2) initialdir = SvPV(ST(2), n_a); if (items > 3) initialfname = SvPV(ST(3), n_a); int suppressprompt = 0; if (items > 4) suppressprompt = SvIV(ST(4)); wxString wxs_title(title, wxConvLocal); wxString wxs_filetypes(filetypes, wxConvLocal); wxString wxs_initialdir(initialdir, wxConvLocal); wxString wxs_initialfname(initialfname, wxConvLocal); if (wxs_initialdir.IsEmpty()) wxs_initialdir = wxFileName::GetCwd(); // suppress Overwrite? popup if user just wants to retrieve the string wxFileDialog savedlg( NULL, wxs_title, wxs_initialdir, wxs_initialfname, wxs_filetypes, wxFD_SAVE | (suppressprompt == 0 ? wxFD_OVERWRITE_PROMPT : 0) ); #ifdef __WXGTK__ savedlg.SetDirectory(wxs_initialdir); #endif wxString wxs_savefname = wxEmptyString; if ( savedlg.ShowModal() == wxID_OK ) wxs_savefname = savedlg.GetPath(); XSRETURN_PV((const char*)wxs_savefname.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- XS(pl_load) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: $cells = g_load($filename)."); STRLEN n_a; char* filename = SvPV(ST(0), n_a); // create temporary universe of same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype, allowcheck); // readpattern will call setrule // read pattern into temporary universe const char* err = readpattern(FILENAME, *tempalgo); if (err) { // try all other algos until readpattern succeeds for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { delete tempalgo; tempalgo = CreateNewUniverse(i, allowcheck); err = readpattern(FILENAME, *tempalgo); if (!err) break; } } } if (err) { delete tempalgo; PERL_ERROR(err); } // convert pattern into a cell array, shifting cell coords so that the // bounding box's top left cell is at 0,0 AV* outarray = (AV*)sv_2mortal( (SV*)newAV() ); err = ExtractCellArray(outarray, tempalgo, true); delete tempalgo; if (err) PERL_ERROR(err); SP -= items; ST(0) = newRV( (SV*)outarray ); sv_2mortal(ST(0)); XSRETURN(1); } // ----------------------------------------------------------------------------- XS(pl_store) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 2) PERL_ERROR("Usage: g_store($cells,$filename)."); SV* cells = ST(0); if ( (!SvROK(cells)) || (SvTYPE(SvRV(cells)) != SVt_PVAV) ) { PERL_ERROR("g_store error: 1st parameter is not a valid array reference."); } AV* inarray = (AV*)SvRV(cells); STRLEN n_a; char* filename = SvPV(ST(1), n_a); // create temporary universe of same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype, allowcheck); const char* err = tempalgo->setrule(currlayer->algo->getrule()); if (err) tempalgo->setrule(tempalgo->DefaultRule()); // copy cell array into temporary universe bool multistate = ((av_len(inarray) + 1) & 1) == 1; int ints_per_cell = multistate ? 3 : 2; int num_cells = (av_len(inarray) + 1) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; int x = SvIV( *av_fetch(inarray, item, 0) ); int y = SvIV( *av_fetch(inarray, item + 1, 0) ); // check if x,y is outside bounded grid const char* err = GSF_checkpos(tempalgo, x, y); if (err) { delete tempalgo; PERL_ERROR(err); } if (multistate) { int state = SvIV( *av_fetch(inarray, item + 2, 0) ); if (tempalgo->setcell(x, y, state) < 0) { tempalgo->endofpattern(); delete tempalgo; PERL_ERROR("g_store error: state value is out of range."); } } else { tempalgo->setcell(x, y, 1); } if ((n % 4096) == 0 && PerlScriptAborted()) { tempalgo->endofpattern(); delete tempalgo; Perl_croak(aTHX_ NULL); } } tempalgo->endofpattern(); // write pattern to given file in RLE/XRLE format bigint top, left, bottom, right; tempalgo->findedges(&top, &left, &bottom, &right); pattern_format format = savexrle ? XRLE_format : RLE_format; // if grid is bounded then force XRLE_format so that position info is recorded if (tempalgo->gridwd > 0 || tempalgo->gridht > 0) format = XRLE_format; err = writepattern(FILENAME, *tempalgo, format, no_compression, top.toint(), left.toint(), bottom.toint(), right.toint()); delete tempalgo; if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- // deprecated (use pl_getdir) XS(pl_appdir) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $dir = g_appdir()."); XSRETURN_PV((const char*)gollydir.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- // deprecated (use pl_getdir) XS(pl_datadir) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $dir = g_datadir()."); XSRETURN_PV((const char*)datadir.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- XS(pl_setdir) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 2) PERL_ERROR("Usage: g_setdir($dirname,$newdir)."); STRLEN n_a; char* dirname = SvPV(ST(0), n_a); char* newdir = SvPV(ST(1), n_a); const char* err = GSF_setdir(dirname, newdir); if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getdir) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: $dir = g_getdir($dirname)."); STRLEN n_a; char* dirname = SvPV(ST(0), n_a); const char* dirstring = GSF_getdir(dirname); if (dirstring == NULL) PERL_ERROR("g_getdir error: unknown directory name."); XSRETURN_PV(dirstring); } // ----------------------------------------------------------------------------- XS(pl_new) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_new($title)."); STRLEN n_a; char* title = SvPV(ST(0), n_a); mainptr->NewPattern(wxString(title,wxConvLocal)); DoAutoUpdate(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_cut) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: g_cut()."); if (viewptr->SelectionExists()) { viewptr->CutSelection(); DoAutoUpdate(); } else { PERL_ERROR("g_cut error: no selection."); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_copy) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: g_copy()."); if (viewptr->SelectionExists()) { viewptr->CopySelection(); DoAutoUpdate(); } else { PERL_ERROR("g_copy error: no selection."); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_clear) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_clear($where)."); int where = SvIV(ST(0)); if (viewptr->SelectionExists()) { if (where == 0) viewptr->ClearSelection(); else viewptr->ClearOutsideSelection(); DoAutoUpdate(); } else { PERL_ERROR("g_clear error: no selection."); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_paste) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 3) PERL_ERROR("Usage: g_paste($x,$y,$mode)."); int x = SvIV(ST(0)); int y = SvIV(ST(1)); STRLEN n_a; char* mode = SvPV(ST(2), n_a); const char* err = GSF_paste(x, y, mode); if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_shrink) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: g_shrink()."); if (viewptr->SelectionExists()) { viewptr->ShrinkSelection(false); // false == don't fit in viewport DoAutoUpdate(); } else { PERL_ERROR("g_shrink error: no selection."); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_randfill) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_randfill($percentage)."); int perc = SvIV(ST(0)); if (perc < 1 || perc > 100) { PERL_ERROR("g_randfill error: percentage must be from 1 to 100."); } if (viewptr->SelectionExists()) { int oldperc = randomfill; randomfill = perc; viewptr->RandomFill(); randomfill = oldperc; DoAutoUpdate(); } else { PERL_ERROR("g_randfill error: no selection."); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_flip) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_flip($direction)."); int direction = SvIV(ST(0)); if (viewptr->SelectionExists()) { viewptr->FlipSelection(direction != 0); // 1 = top-bottom DoAutoUpdate(); } else { PERL_ERROR("g_flip error: no selection."); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_rotate) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_rotate($direction)."); int direction = SvIV(ST(0)); if (viewptr->SelectionExists()) { viewptr->RotateSelection(direction == 0); // 0 = clockwise DoAutoUpdate(); } else { PERL_ERROR("g_rotate error: no selection."); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_parse) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items < 1 || items > 7) PERL_ERROR("Usage: $outcells = g_parse($string,$x=0,$y=0,$axx=1,$axy=0,$ayx=0,$ayy=1)."); STRLEN n_a; char* s = SvPV(ST(0), n_a); // default values for optional params int x0 = 0; int y0 = 0; int axx = 1; int axy = 0; int ayx = 0; int ayy = 1; if (items > 1) x0 = SvIV(ST(1)); if (items > 2) y0 = SvIV(ST(2)); if (items > 3) axx = SvIV(ST(3)); if (items > 4) axy = SvIV(ST(4)); if (items > 5) ayx = SvIV(ST(5)); if (items > 6) ayy = SvIV(ST(6)); AV* outarray = (AV*)sv_2mortal( (SV*)newAV() ); int x = 0, y = 0; if (strchr(s, '*')) { // parsing 'visual' format int c = *s++; while (c) { switch (c) { case '\n': if (x) { x = 0; y++; } break; case '.': x++; break; case '*': av_push(outarray, newSViv(x0 + x * axx + y * axy)); av_push(outarray, newSViv(y0 + x * ayx + y * ayy)); x++; break; } c = *s++; } } else { // parsing RLE format; first check if multi-state data is present bool multistate = false; char* p = s; while (*p) { char c = *p++; if ((c == '.') || ('p' <= c && c <= 'y') || ('A' <= c && c <= 'X')) { multistate = true; break; } } int prefix = 0; bool done = false; int c = *s++; while (c && !done) { if (isdigit(c)) prefix = 10 * prefix + (c - '0'); else { prefix += (prefix == 0); switch (c) { case '!': done = true; break; case '$': x = 0; y += prefix; break; case 'b': x += prefix; break; case '.': x += prefix; break; case 'o': for (int k = 0; k < prefix; k++, x++) { av_push(outarray, newSViv(x0 + x * axx + y * axy)); av_push(outarray, newSViv(y0 + x * ayx + y * ayy)); if (multistate) av_push(outarray, newSViv(1)); } break; default: if (('p' <= c && c <= 'y') || ('A' <= c && c <= 'X')) { // multistate must be true int state; if (c < 'p') { state = c - 'A' + 1; } else { state = 24 * (c - 'p' + 1); c = *s++; if ('A' <= c && c <= 'X') { state = state + c - 'A' + 1; } else { // PERL_ERROR("g_parse error: illegal multi-char state."); // be more forgiving and treat 'p'..'y' like 'o' state = 1; s--; } } for (int k = 0; k < prefix; k++, x++) { av_push(outarray, newSViv(x0 + x * axx + y * axy)); av_push(outarray, newSViv(y0 + x * ayx + y * ayy)); av_push(outarray, newSViv(state)); } } } prefix = 0; } c = *s++; } if (multistate) AddPadding(outarray); } SP -= items; ST(0) = newRV( (SV*)outarray ); sv_2mortal(ST(0)); XSRETURN(1); } // ----------------------------------------------------------------------------- XS(pl_transform) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items < 3 || items > 7) PERL_ERROR("Usage: $outcells = g_transform($cells,$x,$y,$axx=1,$axy=0,$ayx=0,$ayy=1)."); SV* cells = ST(0); if ( (!SvROK(cells)) || (SvTYPE(SvRV(cells)) != SVt_PVAV) ) { PERL_ERROR("g_transform error: 1st parameter is not a valid array reference."); } AV* inarray = (AV*)SvRV(cells); int x0 = SvIV(ST(1)); int y0 = SvIV(ST(2)); // default values for optional params int axx = 1; int axy = 0; int ayx = 0; int ayy = 1; if (items > 3) axx = SvIV(ST(3)); if (items > 4) axy = SvIV(ST(4)); if (items > 5) ayx = SvIV(ST(5)); if (items > 6) ayy = SvIV(ST(6)); AV* outarray = (AV*)sv_2mortal( (SV*)newAV() ); bool multistate = ((av_len(inarray) + 1) & 1) == 1; int ints_per_cell = multistate ? 3 : 2; int num_cells = (av_len(inarray) + 1) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; int x = SvIV( *av_fetch(inarray, item, 0) ); int y = SvIV( *av_fetch(inarray, item + 1, 0) ); av_push(outarray, newSViv(x0 + x * axx + y * axy)); av_push(outarray, newSViv(y0 + x * ayx + y * ayy)); if (multistate) { int state = SvIV( *av_fetch(inarray, item + 2, 0) ); av_push(outarray, newSViv(state)); } if ((n % 4096) == 0 && PerlScriptAborted()) break; } if (multistate) AddPadding(outarray); SP -= items; ST(0) = newRV( (SV*)outarray ); sv_2mortal(ST(0)); XSRETURN(1); } // ----------------------------------------------------------------------------- XS(pl_evolve) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 2) PERL_ERROR("Usage: $outcells = g_evolve($cells,$numgens)."); SV* cells = ST(0); if ( (!SvROK(cells)) || (SvTYPE(SvRV(cells)) != SVt_PVAV) ) { PERL_ERROR("g_evolve error: 1st parameter is not a valid array reference."); } AV* inarray = (AV*)SvRV(cells); int ngens = SvIV(ST(1)); // create a temporary universe of same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype, allowcheck); const char* err = tempalgo->setrule(currlayer->algo->getrule()); if (err) tempalgo->setrule(tempalgo->DefaultRule()); // copy cell array into temporary universe bool multistate = ((av_len(inarray) + 1) & 1) == 1; int ints_per_cell = multistate ? 3 : 2; int num_cells = (av_len(inarray) + 1) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; int x = SvIV( *av_fetch(inarray, item, 0) ); int y = SvIV( *av_fetch(inarray, item + 1, 0) ); // check if x,y is outside bounded grid const char* err = GSF_checkpos(tempalgo, x, y); if (err) { delete tempalgo; PERL_ERROR(err); } if (multistate) { int state = SvIV( *av_fetch(inarray, item + 2, 0) ); if (tempalgo->setcell(x, y, state) < 0) { tempalgo->endofpattern(); delete tempalgo; PERL_ERROR("g_evolve error: state value is out of range."); } } else { tempalgo->setcell(x, y, 1); } if ((n % 4096) == 0 && PerlScriptAborted()) { tempalgo->endofpattern(); delete tempalgo; Perl_croak(aTHX_ NULL); } } tempalgo->endofpattern(); // advance pattern by ngens mainptr->generating = true; if (tempalgo->gridwd > 0 || tempalgo->gridht > 0) { // a bounded grid must use an increment of 1 so we can call // CreateBorderCells and DeleteBorderCells around each step() tempalgo->setIncrement(1); while (ngens > 0) { if (PerlScriptAborted()) { mainptr->generating = false; delete tempalgo; Perl_croak(aTHX_ NULL); } if (!mainptr->CreateBorderCells(tempalgo)) break; tempalgo->step(); if (!mainptr->DeleteBorderCells(tempalgo)) break; ngens--; } } else { tempalgo->setIncrement(ngens); tempalgo->step(); } mainptr->generating = false; // convert new pattern into a new cell array AV* outarray = (AV*)sv_2mortal( (SV*)newAV() ); err = ExtractCellArray(outarray, tempalgo); delete tempalgo; if (err) PERL_ERROR(err); SP -= items; ST(0) = newRV( (SV*)outarray ); sv_2mortal(ST(0)); XSRETURN(1); } // ----------------------------------------------------------------------------- static const char* BAD_STATE = "g_putcells error: state value is out of range."; XS(pl_putcells) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items < 1 || items > 8) PERL_ERROR("Usage: g_putcells($cells,$x=0,$y=0,$axx=1,$axy=0,$ayx=0,$ayy=1,$mode='or')."); SV* cells = ST(0); if ( (!SvROK(cells)) || (SvTYPE(SvRV(cells)) != SVt_PVAV) ) { PERL_ERROR("g_putcells error: 1st parameter is not a valid array reference."); } AV* inarray = (AV*)SvRV(cells); // default values for optional params int x0 = 0; int y0 = 0; int axx = 1; int axy = 0; int ayx = 0; int ayy = 1; // default for mode is 'or'; 'xor' mode is also supported; // for a one-state array 'copy' mode currently has the same effect as 'or' mode // because there is no bounding box to set dead cells, but a multi-state array can // have dead cells so in that case 'copy' mode is not the same as 'or' mode const char* mode = "or"; STRLEN n_a; if (items > 1) x0 = SvIV(ST(1)); if (items > 2) y0 = SvIV(ST(2)); if (items > 3) axx = SvIV(ST(3)); if (items > 4) axy = SvIV(ST(4)); if (items > 5) ayx = SvIV(ST(5)); if (items > 6) ayy = SvIV(ST(6)); if (items > 7) mode = SvPV(ST(7), n_a); wxString modestr = wxString(mode, wxConvLocal); if ( !( modestr.IsSameAs(wxT("or"), false) || modestr.IsSameAs(wxT("xor"), false) || modestr.IsSameAs(wxT("copy"), false) || modestr.IsSameAs(wxT("and"), false) || modestr.IsSameAs(wxT("not"), false)) ) { PERL_ERROR("g_putcells error: unknown mode."); } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; // use ChangeCell below and combine all changes due to consecutive setcell/putcells // if (savecells) SavePendingChanges(); // note that av_len returns max index or -1 if array is empty bool multistate = ((av_len(inarray) + 1) & 1) == 1; int ints_per_cell = multistate ? 3 : 2; int num_cells = (av_len(inarray) + 1) / ints_per_cell; const char* err = NULL; bool pattchanged = false; lifealgo* curralgo = currlayer->algo; if (modestr.IsSameAs(wxT("copy"), false)) { // TODO: find bounds of cell array and call ClearRect here (to be added to wxedit.cpp) } if (modestr.IsSameAs(wxT("and"), false)) { if (!curralgo->isEmpty()) { int newstate = 1; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; int x = SvIV( *av_fetch(inarray, item, 0) ); int y = SvIV( *av_fetch(inarray, item + 1, 0) ); int newx = x0 + x * axx + y * axy; int newy = y0 + x * ayx + y * ayy; // check if newx,newy is outside bounded grid err = GSF_checkpos(curralgo, newx, newy); if (err) break; int oldstate = curralgo->getcell(newx, newy); if (multistate) { // multi-state lists can contain dead cells so newstate might be 0 newstate = SvIV( *av_fetch(inarray, item + 2, 0) ); } if (newstate != oldstate && oldstate > 0) { curralgo->setcell(newx, newy, 0); if (savecells) ChangeCell(newx, newy, oldstate, 0); pattchanged = true; } if ((n % 4096) == 0 && PerlScriptAborted()) break; } } } else if (modestr.IsSameAs(wxT("xor"), false)) { // loop code is duplicated here to allow 'or' case to execute faster int numstates = curralgo->NumCellStates(); for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; int x = SvIV( *av_fetch(inarray, item, 0) ); int y = SvIV( *av_fetch(inarray, item + 1, 0) ); int newx = x0 + x * axx + y * axy; int newy = y0 + x * ayx + y * ayy; // check if newx,newy is outside bounded grid err = GSF_checkpos(curralgo, newx, newy); if (err) break; int oldstate = curralgo->getcell(newx, newy); int newstate; if (multistate) { // multi-state arrays can contain dead cells so newstate might be 0 newstate = SvIV( *av_fetch(inarray, item + 2, 0) ); if (newstate == oldstate) { if (oldstate != 0) newstate = 0; } else { newstate = newstate ^ oldstate; // if xor overflows then don't change current state if (newstate >= numstates) newstate = oldstate; } if (newstate != oldstate) { // paste (possibly transformed) cell into current universe if (curralgo->setcell(newx, newy, newstate) < 0) { err = BAD_STATE; break; } if (savecells) ChangeCell(newx, newy, oldstate, newstate); pattchanged = true; } } else { // one-state arrays only contain live cells newstate = 1 - oldstate; // paste (possibly transformed) cell into current universe if (curralgo->setcell(newx, newy, newstate) < 0) { err = BAD_STATE; break; } if (savecells) ChangeCell(newx, newy, oldstate, newstate); pattchanged = true; } if ((n % 4096) == 0 && PerlScriptAborted()) break; } } else { bool negate = modestr.IsSameAs(wxT("not"), false); bool ormode = modestr.IsSameAs(wxT("or"), false); int newstate = negate ? 0 : 1; int maxstate = curralgo->NumCellStates() - 1; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; int x = SvIV( *av_fetch(inarray, item, 0) ); int y = SvIV( *av_fetch(inarray, item + 1, 0) ); int newx = x0 + x * axx + y * axy; int newy = y0 + x * ayx + y * ayy; // check if newx,newy is outside bounded grid err = GSF_checkpos(curralgo, newx, newy); if (err) break; int oldstate = curralgo->getcell(newx, newy); if (multistate) { // multi-state arrays can contain dead cells so newstate might be 0 newstate = SvIV( *av_fetch(inarray, item + 2, 0) ); if (negate) newstate = maxstate - newstate; if (ormode && newstate == 0) newstate = oldstate; } if (newstate != oldstate) { // paste (possibly transformed) cell into current universe if (curralgo->setcell(newx, newy, newstate) < 0) { err = BAD_STATE; break; } if (savecells) ChangeCell(newx, newy, oldstate, newstate); pattchanged = true; } if ((n % 4096) == 0 && PerlScriptAborted()) break; } } if (pattchanged) { curralgo->endofpattern(); MarkLayerDirty(); DoAutoUpdate(); } if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getcells) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0 && items != 4) PERL_ERROR("Usage: $cells = g_getcells(@rect)."); // convert pattern in given rect into a cell array (ie. array of live cell coords) AV* outarray = (AV*)sv_2mortal( (SV*)newAV() ); if (items == 0) { // return empty cell array } else { // items == 4 int x = SvIV(ST(0)); int y = SvIV(ST(1)); int wd = SvIV(ST(2)); int ht = SvIV(ST(3)); const char* err = GSF_checkrect(x, y, wd, ht); if (err) PERL_ERROR(err); int right = x + wd - 1; int bottom = y + ht - 1; int cx, cy; int v = 0; int cntr = 0; lifealgo* curralgo = currlayer->algo; bool multistate = curralgo->NumCellStates() > 2; for ( cy=y; cy<=bottom; cy++ ) { for ( cx=x; cx<=right; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row so add coords to outarray cx += skip; if (cx <= right) { av_push(outarray, newSViv(cx)); av_push(outarray, newSViv(cy)); if (multistate) av_push(outarray, newSViv(v)); } } else { cx = right; // done this row } cntr++; if ((cntr % 4096) == 0) RETURN_IF_ABORTED; } } if (multistate) AddPadding(outarray); } SP -= items; ST(0) = newRV( (SV*)outarray ); sv_2mortal(ST(0)); XSRETURN(1); } // ----------------------------------------------------------------------------- XS(pl_join) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 2) PERL_ERROR("Usage: $outcells = g_join($cells1,$cells2)."); SV* cells1 = ST(0); SV* cells2 = ST(1); if ( (!SvROK(cells1)) || (SvTYPE(SvRV(cells1)) != SVt_PVAV) ) { PERL_ERROR("g_join error: 1st parameter is not a valid array reference."); } if ( (!SvROK(cells2)) || (SvTYPE(SvRV(cells2)) != SVt_PVAV) ) { PERL_ERROR("g_join error: 2nd parameter is not a valid array reference."); } AV* inarray1 = (AV*)SvRV(cells1); AV* inarray2 = (AV*)SvRV(cells2); bool multi1 = ((av_len(inarray1) + 1) & 1) == 1; bool multi2 = ((av_len(inarray2) + 1) & 1) == 1; bool multiout = multi1 || multi2; int ints_per_cell, num_cells; int x, y, state; AV* outarray = (AV*)sv_2mortal( (SV*)newAV() ); // append 1st array ints_per_cell = multi1 ? 3 : 2; num_cells = (av_len(inarray1) + 1) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; x = SvIV( *av_fetch(inarray1, item, 0) ); y = SvIV( *av_fetch(inarray1, item + 1, 0) ); if (multi1) { state = SvIV( *av_fetch(inarray1, item + 2, 0) ); } else { state = 1; } av_push(outarray, newSViv(x)); av_push(outarray, newSViv(y)); if (multiout) av_push(outarray, newSViv(state)); if ((n % 4096) == 0 && PerlScriptAborted()) { Perl_croak(aTHX_ NULL); } } // append 2nd array ints_per_cell = multi2 ? 3 : 2; num_cells = (av_len(inarray2) + 1) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; x = SvIV( *av_fetch(inarray2, item, 0) ); y = SvIV( *av_fetch(inarray2, item + 1, 0) ); if (multi2) { state = SvIV( *av_fetch(inarray2, item + 2, 0) ); } else { state = 1; } av_push(outarray, newSViv(x)); av_push(outarray, newSViv(y)); if (multiout) av_push(outarray, newSViv(state)); if ((n % 4096) == 0 && PerlScriptAborted()) { Perl_croak(aTHX_ NULL); } } if (multiout) AddPadding(outarray); SP -= items; ST(0) = newRV( (SV*)outarray ); sv_2mortal(ST(0)); XSRETURN(1); } // ----------------------------------------------------------------------------- XS(pl_hash) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 4) PERL_ERROR("Usage: $int = g_hash(@rect)."); int x = SvIV(ST(0)); int y = SvIV(ST(1)); int wd = SvIV(ST(2)); int ht = SvIV(ST(3)); const char* err = GSF_checkrect(x, y, wd, ht); if (err) PERL_ERROR(err); int hash = GSF_hash(x, y, wd, ht); XSRETURN_IV(hash); } // ----------------------------------------------------------------------------- XS(pl_getclip) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $cells = g_getclip()."); if (!mainptr->ClipboardHasText()) { PERL_ERROR("g_getclip error: no pattern in clipboard."); } // convert pattern in clipboard into a cell array, but where the first 2 items // are the pattern's width and height (not necessarily the minimal bounding box // because the pattern might have empty borders, or it might even be empty) AV* outarray = (AV*)sv_2mortal( (SV*)newAV() ); // create a temporary universe for storing clipboard pattern; // GetClipboardPattern assumes it is same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype, allowcheck); const char* err = tempalgo->setrule(currlayer->algo->getrule()); if (err) tempalgo->setrule(tempalgo->DefaultRule()); // read clipboard pattern into temporary universe and set edges // (not a minimal bounding box if pattern is empty or has empty borders) bigint top, left, bottom, right; if ( viewptr->GetClipboardPattern(&tempalgo, &top, &left, &bottom, &right) ) { if ( viewptr->OutsideLimits(top, left, bottom, right) ) { delete tempalgo; PERL_ERROR("g_getclip error: pattern is too big."); } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; av_push(outarray, newSViv(wd)); av_push(outarray, newSViv(ht)); // extract cells from tempalgo bool multistate = tempalgo->NumCellStates() > 2; int cx, cy; int cntr = 0; int v = 0; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = tempalgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; // shift cells so that top left cell of bounding box is at 0,0 av_push(outarray, newSViv(cx - ileft)); av_push(outarray, newSViv(cy - itop)); if (multistate) av_push(outarray, newSViv(v)); } else { cx = iright; // done this row } cntr++; if ((cntr % 4096) == 0 && PerlScriptAborted()) { delete tempalgo; Perl_croak(aTHX_ NULL); } } } // if no live cells then return (wd,ht) rather than (wd,ht,0) if (multistate && (av_len(outarray) + 1) > 2) { AddPadding(outarray); } delete tempalgo; } else { // assume error message has been displayed delete tempalgo; Perl_croak(aTHX_ NULL); } SP -= items; ST(0) = newRV( (SV*)outarray ); sv_2mortal(ST(0)); XSRETURN(1); } // ----------------------------------------------------------------------------- XS(pl_select) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0 && items != 4) PERL_ERROR("Usage: g_select(@rect)."); if (items == 0) { // remove any existing selection GSF_select(0, 0, 0, 0); } else { // items == 4 int x = SvIV(ST(0)); int y = SvIV(ST(1)); int wd = SvIV(ST(2)); int ht = SvIV(ST(3)); const char* err = GSF_checkrect(x, y, wd, ht); if (err) PERL_ERROR(err); // set selection rect GSF_select(x, y, wd, ht); } DoAutoUpdate(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getrect) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: @rect = g_getrect()."); if (!currlayer->algo->isEmpty()) { bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { PERL_ERROR("g_getrect error: pattern is too big."); } int x = left.toint(); int y = top.toint(); int wd = right.toint() - x + 1; int ht = bottom.toint() - y + 1; // items == 0 so no need to reset stack pointer // SP -= items; XPUSHs(sv_2mortal(newSViv(x))); XPUSHs(sv_2mortal(newSViv(y))); XPUSHs(sv_2mortal(newSViv(wd))); XPUSHs(sv_2mortal(newSViv(ht))); XSRETURN(4); } else { XSRETURN(0); } } // ----------------------------------------------------------------------------- XS(pl_getselrect) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: @rect = g_getselrect()."); if (viewptr->SelectionExists()) { if (currlayer->currsel.TooBig()) { PERL_ERROR("g_getselrect error: selection is too big."); } int x, y, wd, ht; currlayer->currsel.GetRect(&x, &y, &wd, &ht); // items == 0 so no need to reset stack pointer // SP -= items; XPUSHs(sv_2mortal(newSViv(x))); XPUSHs(sv_2mortal(newSViv(y))); XPUSHs(sv_2mortal(newSViv(wd))); XPUSHs(sv_2mortal(newSViv(ht))); XSRETURN(4); } else { XSRETURN(0); } } // ----------------------------------------------------------------------------- XS(pl_setcell) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 3) PERL_ERROR("Usage: g_setcell($x,$y,$state)."); int x = SvIV(ST(0)); int y = SvIV(ST(1)); int state = SvIV(ST(2)); const char* err = GSF_setcell(x, y, state); if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getcell) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 2) PERL_ERROR("Usage: $state = g_getcell($x,$y)."); int x = SvIV(ST(0)); int y = SvIV(ST(1)); // check if x,y is outside bounded grid const char* err = GSF_checkpos(currlayer->algo, x, y); if (err) PERL_ERROR(err); int state = currlayer->algo->getcell(x, y); XSRETURN_IV(state); } // ----------------------------------------------------------------------------- XS(pl_setcursor) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: $oldcurs = g_setcursor($newcurs)."); STRLEN n_a; const char* newcursor = SvPV(ST(0), n_a); const char* oldcursor = CursorToString(currlayer->curs); wxCursor* cursptr = StringToCursor(newcursor); if (cursptr) { viewptr->SetCursorMode(cursptr); // see the cursor change, including button in edit bar mainptr->UpdateUserInterface(mainptr->IsActive()); } else { PERL_ERROR("g_setcursor error: unknown cursor string."); } // return old cursor (simplifies saving and restoring cursor) XSRETURN_PV(oldcursor); } // ----------------------------------------------------------------------------- XS(pl_getcursor) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $string = g_getcursor()."); XSRETURN_PV(CursorToString(currlayer->curs)); } // ----------------------------------------------------------------------------- XS(pl_empty) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $bool = g_empty()."); XSRETURN_IV(currlayer->algo->isEmpty() ? 1 : 0); } // ----------------------------------------------------------------------------- XS(pl_run) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_run($numgens)."); int ngens = SvIV(ST(0)); if (ngens > 0 && !currlayer->algo->isEmpty()) { if (ngens > 1) { bigint saveinc = currlayer->algo->getIncrement(); currlayer->algo->setIncrement(ngens); mainptr->NextGeneration(true); // step by ngens currlayer->algo->setIncrement(saveinc); } else { mainptr->NextGeneration(false); // step 1 gen } DoAutoUpdate(); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_step) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: g_step()."); if (!currlayer->algo->isEmpty()) { mainptr->NextGeneration(true); // step by current increment DoAutoUpdate(); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_setstep) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_setstep($int)."); mainptr->SetStepExponent(SvIV(ST(0))); DoAutoUpdate(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getstep) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_getstep()."); XSRETURN_IV(currlayer->currexpo); } // ----------------------------------------------------------------------------- XS(pl_setbase) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_setbase($int)."); int base = SvIV(ST(0)); if (base < 2) base = 2; if (base > MAX_BASESTEP) base = MAX_BASESTEP; currlayer->currbase = base; mainptr->SetGenIncrement(); DoAutoUpdate(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getbase) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_getbase()."); XSRETURN_IV(currlayer->currbase); } // ----------------------------------------------------------------------------- XS(pl_advance) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 2) PERL_ERROR("Usage: g_advance($where,$numgens)."); int where = SvIV(ST(0)); int ngens = SvIV(ST(1)); if (ngens > 0) { if (viewptr->SelectionExists()) { while (ngens > 0) { ngens--; if (where == 0) currlayer->currsel.Advance(); else currlayer->currsel.AdvanceOutside(); } DoAutoUpdate(); } else { PERL_ERROR("g_advance error: no selection."); } } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_reset) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: g_reset()."); if (currlayer->algo->getGeneration() != currlayer->startgen) { mainptr->ResetPattern(); DoAutoUpdate(); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_setgen) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_setgen($string)."); STRLEN n_a; char* genstring = SvPV(ST(0), n_a); const char* err = GSF_setgen(genstring); if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getgen) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 1) PERL_ERROR("Usage: $string = g_getgen($sepchar='')."); char sepchar = '\0'; if (items > 0) { STRLEN n_a; char* s = SvPV(ST(0), n_a); sepchar = s[0]; } XSRETURN_PV(currlayer->algo->getGeneration().tostring(sepchar)); } // ----------------------------------------------------------------------------- XS(pl_getpop) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 1) PERL_ERROR("Usage: $string = g_getpop($sepchar='')."); char sepchar = '\0'; if (items > 0) { STRLEN n_a; char* s = SvPV(ST(0), n_a); sepchar = s[0]; } XSRETURN_PV(currlayer->algo->getPopulation().tostring(sepchar)); } // ----------------------------------------------------------------------------- XS(pl_setalgo) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_setalgo($string)."); STRLEN n_a; char* algostring = SvPV(ST(0), n_a); const char* err = GSF_setalgo(algostring); if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getalgo) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 1) PERL_ERROR("Usage: $algo = g_getalgo($index=current)."); int index = currlayer->algtype; if (items > 0) index = SvIV(ST(0)); if (index < 0 || index >= NumAlgos()) { char msg[64]; sprintf(msg, "Bad g_getalgo index (%d).", index); PERL_ERROR(msg); } XSRETURN_PV(GetAlgoName(index)); } // ----------------------------------------------------------------------------- XS(pl_setrule) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_setrule($string)."); STRLEN n_a; char* rulestring = SvPV(ST(0), n_a); const char* err = GSF_setrule(rulestring); if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getrule) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $string = g_getrule()."); XSRETURN_PV(currlayer->algo->getrule()); } // ----------------------------------------------------------------------------- XS(pl_getwidth) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_getwidth()."); XSRETURN_IV(currlayer->algo->gridwd); } // ----------------------------------------------------------------------------- XS(pl_getheight) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_getheight()."); XSRETURN_IV(currlayer->algo->gridht); } // ----------------------------------------------------------------------------- XS(pl_numstates) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_numstates()."); XSRETURN_IV(currlayer->algo->NumCellStates()); } // ----------------------------------------------------------------------------- XS(pl_numalgos) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_numalgos()."); XSRETURN_IV(NumAlgos()); } // ----------------------------------------------------------------------------- XS(pl_setpos) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 2) PERL_ERROR("Usage: g_setpos($xstring,$ystring)."); STRLEN n_a; char* x = SvPV(ST(0), n_a); char* y = SvPV(ST(1), n_a); const char* err = GSF_setpos(x, y); if (err) PERL_ERROR(err); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getpos) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 1) PERL_ERROR("Usage: @xy = g_getpos($sepchar='')."); char sepchar = '\0'; if (items > 0) { STRLEN n_a; char* s = SvPV(ST(0), n_a); sepchar = s[0]; } bigint bigx, bigy; viewptr->GetPos(bigx, bigy); // return position as x,y strings SP -= items; XPUSHs(sv_2mortal(newSVpv( bigx.tostring(sepchar), 0 ))); XPUSHs(sv_2mortal(newSVpv( bigy.tostring(sepchar), 0 ))); XSRETURN(2); } // ----------------------------------------------------------------------------- XS(pl_setmag) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_setmag($int)."); int mag = SvIV(ST(0)); viewptr->SetMag(mag); DoAutoUpdate(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getmag) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_getmag()."); XSRETURN_IV(viewptr->GetMag()); } // ----------------------------------------------------------------------------- XS(pl_fit) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: g_fit()."); viewptr->FitPattern(); DoAutoUpdate(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_fitsel) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: g_fitsel()."); if (viewptr->SelectionExists()) { viewptr->FitSelection(); DoAutoUpdate(); } else { PERL_ERROR("g_fitsel error: no selection."); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_visrect) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 4) PERL_ERROR("Usage: $bool = g_visrect(@rect)."); int x = SvIV(ST(0)); int y = SvIV(ST(1)); int wd = SvIV(ST(2)); int ht = SvIV(ST(3)); const char* err = GSF_checkrect(x, y, wd, ht); if (err) PERL_ERROR(err); bigint left = x; bigint top = y; bigint right = x + wd - 1; bigint bottom = y + ht - 1; int visible = viewptr->CellVisible(left, top) && viewptr->CellVisible(right, bottom); XSRETURN_IV(visible); } // ----------------------------------------------------------------------------- XS(pl_update) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: g_update()."); GSF_update(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_autoupdate) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_autoupdate($bool)."); autoupdate = (SvIV(ST(0)) != 0); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_addlayer) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $newindex = g_addlayer()."); if (numlayers >= MAX_LAYERS) { PERL_ERROR("g_addlayer error: no more layers can be added."); } else { AddLayer(); DoAutoUpdate(); } // return index of new layer XSRETURN_IV(currindex); } // ----------------------------------------------------------------------------- XS(pl_clone) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $newindex = g_clone()."); if (numlayers >= MAX_LAYERS) { PERL_ERROR("g_clone error: no more layers can be added."); } else { CloneLayer(); DoAutoUpdate(); } // return index of new layer XSRETURN_IV(currindex); } // ----------------------------------------------------------------------------- XS(pl_duplicate) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $newindex = g_duplicate()."); if (numlayers >= MAX_LAYERS) { PERL_ERROR("g_duplicate error: no more layers can be added."); } else { DuplicateLayer(); DoAutoUpdate(); } // return index of new layer XSRETURN_IV(currindex); } // ----------------------------------------------------------------------------- XS(pl_dellayer) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: g_dellayer()."); if (numlayers <= 1) { PERL_ERROR("g_dellayer error: there is only one layer."); } else { DeleteLayer(); DoAutoUpdate(); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_movelayer) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 2) PERL_ERROR("Usage: g_movelayer($from,$to)."); int fromindex = SvIV(ST(0)); int toindex = SvIV(ST(1)); if (fromindex < 0 || fromindex >= numlayers) { char msg[64]; sprintf(msg, "Bad g_movelayer fromindex (%d).", fromindex); PERL_ERROR(msg); } if (toindex < 0 || toindex >= numlayers) { char msg[64]; sprintf(msg, "Bad g_movelayer toindex (%d).", toindex); PERL_ERROR(msg); } MoveLayer(fromindex, toindex); DoAutoUpdate(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_setlayer) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_setlayer($index)."); int index = SvIV(ST(0)); if (index < 0 || index >= numlayers) { char msg[64]; sprintf(msg, "Bad g_setlayer index (%d).", index); PERL_ERROR(msg); } SetLayer(index); DoAutoUpdate(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getlayer) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_getlayer()."); XSRETURN_IV(currindex); } // ----------------------------------------------------------------------------- XS(pl_numlayers) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_numlayers()."); XSRETURN_IV(numlayers); } // ----------------------------------------------------------------------------- XS(pl_maxlayers) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $int = g_maxlayers()."); XSRETURN_IV(MAX_LAYERS); } // ----------------------------------------------------------------------------- XS(pl_setname) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items < 1 || items > 2) PERL_ERROR("Usage: g_setname($name,$index=current)."); STRLEN n_a; char* name = SvPV(ST(0), n_a); int index = currindex; if (items > 1) index = SvIV(ST(1)); if (index < 0 || index >= numlayers) { char msg[64]; sprintf(msg, "Bad g_setname index (%d).", index); PERL_ERROR(msg); } GSF_setname(name, index); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getname) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 1) PERL_ERROR("Usage: $name = g_getname($index=current)."); int index = currindex; if (items > 0) index = SvIV(ST(0)); if (index < 0 || index >= numlayers) { char msg[64]; sprintf(msg, "Bad g_getname index (%d).", index); PERL_ERROR(msg); } XSRETURN_PV((const char*)GetLayer(index)->currname.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- XS(pl_setcolors) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_setcolors($colors)."); SV* colors = ST(0); if ( (!SvROK(colors)) || (SvTYPE(SvRV(colors)) != SVt_PVAV) ) { PERL_ERROR("g_setcolors error: 1st parameter is not a valid array reference."); } AV* inarray = (AV*)SvRV(colors); int len = av_len(inarray) + 1; if (len == 0) { // restore default colors in current layer and its clones UpdateLayerColors(); } else if (len == 6) { // create gradient from r1,g1,b1 to r2,g2,b2 int r1 = SvIV( *av_fetch(inarray, 0, 0) ); int g1 = SvIV( *av_fetch(inarray, 1, 0) ); int b1 = SvIV( *av_fetch(inarray, 2, 0) ); int r2 = SvIV( *av_fetch(inarray, 3, 0) ); int g2 = SvIV( *av_fetch(inarray, 4, 0) ); int b2 = SvIV( *av_fetch(inarray, 5, 0) ); CheckRGB(r1, g1, b1, "g_setcolors"); CheckRGB(r2, g2, b2, "g_setcolors"); currlayer->fromrgb.Set(r1, g1, b1); currlayer->torgb.Set(r2, g2, b2); CreateColorGradient(); UpdateCloneColors(); } else if (len % 4 == 0) { int i = 0; while (i < len) { int s = SvIV( *av_fetch(inarray, i, 0) ); i++; int r = SvIV( *av_fetch(inarray, i, 0) ); i++; int g = SvIV( *av_fetch(inarray, i, 0) ); i++; int b = SvIV( *av_fetch(inarray, i, 0) ); i++; CheckRGB(r, g, b, "g_setcolors"); if (s == -1) { // set all LIVE states to r,g,b (best not to alter state 0) for (s = 1; s < currlayer->algo->NumCellStates(); s++) { currlayer->cellr[s] = r; currlayer->cellg[s] = g; currlayer->cellb[s] = b; } } else { if (s < 0 || s >= currlayer->algo->NumCellStates()) { char msg[64]; sprintf(msg, "Bad state in g_setcolors (%d).", s); PERL_ERROR(msg); } else { currlayer->cellr[s] = r; currlayer->cellg[s] = g; currlayer->cellb[s] = b; } } } UpdateCloneColors(); } else { PERL_ERROR("g_setcolors error: array length is not a multiple of 4."); } DoAutoUpdate(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getcolors) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 1) PERL_ERROR("Usage: $colors = g_getcolors($state=-1)."); int state = -1; if (items > 0) state = SvIV(ST(0)); AV* outarray = (AV*)sv_2mortal( (SV*)newAV() ); if (state == -1) { // return colors for ALL states, including state 0 for (state = 0; state < currlayer->algo->NumCellStates(); state++) { av_push(outarray, newSViv(state)); av_push(outarray, newSViv(currlayer->cellr[state])); av_push(outarray, newSViv(currlayer->cellg[state])); av_push(outarray, newSViv(currlayer->cellb[state])); } } else if (state >= 0 && state < currlayer->algo->NumCellStates()) { av_push(outarray, newSViv(state)); av_push(outarray, newSViv(currlayer->cellr[state])); av_push(outarray, newSViv(currlayer->cellg[state])); av_push(outarray, newSViv(currlayer->cellb[state])); } else { char msg[64]; sprintf(msg, "Bad g_getcolors state (%d).", state); PERL_ERROR(msg); } SP -= items; ST(0) = newRV( (SV*)outarray ); sv_2mortal(ST(0)); XSRETURN(1); } // ----------------------------------------------------------------------------- XS(pl_setoption) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 2) PERL_ERROR("Usage: $oldval = g_setoption($name,$newval)."); STRLEN n_a; char* optname = SvPV(ST(0), n_a); int newval = SvIV(ST(1)); int oldval; if (!GSF_setoption(optname, newval, &oldval)) { PERL_ERROR("g_setoption error: unknown option."); } // return old value (simplifies saving and restoring settings) XSRETURN_IV(oldval); } // ----------------------------------------------------------------------------- XS(pl_getoption) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: $int = g_getoption($name)."); STRLEN n_a; char* optname = SvPV(ST(0), n_a); int optval; if (!GSF_getoption(optname, &optval)) { PERL_ERROR("g_getoption error: unknown option."); } XSRETURN_IV(optval); } // ----------------------------------------------------------------------------- XS(pl_setcolor) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 4) PERL_ERROR("Usage: @oldrgb = g_setcolor($name,$r,$g,$b)."); STRLEN n_a; char* colname = SvPV(ST(0), n_a); wxColor newcol(SvIV(ST(1)), SvIV(ST(2)), SvIV(ST(3))); wxColor oldcol; if (!GSF_setcolor(colname, newcol, oldcol)) { PERL_ERROR("g_setcolor error: unknown color."); } // return old r,g,b values (simplifies saving and restoring colors) SP -= items; XPUSHs(sv_2mortal(newSViv(oldcol.Red()))); XPUSHs(sv_2mortal(newSViv(oldcol.Green()))); XPUSHs(sv_2mortal(newSViv(oldcol.Blue()))); XSRETURN(3); } // ----------------------------------------------------------------------------- XS(pl_getcolor) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: @rgb = g_getcolor($name)."); STRLEN n_a; char* colname = SvPV(ST(0), n_a); wxColor color; if (!GSF_getcolor(colname, color)) { PERL_ERROR("g_getcolor error: unknown color."); } // return r,g,b values SP -= items; XPUSHs(sv_2mortal(newSViv(color.Red()))); XPUSHs(sv_2mortal(newSViv(color.Green()))); XPUSHs(sv_2mortal(newSViv(color.Blue()))); XSRETURN(3); } // ----------------------------------------------------------------------------- XS(pl_setclipstr) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_setclipstr($string)."); STRLEN n_a; char* clipstr = SvPV(ST(0), n_a); wxString wxs_clip(clipstr, wxConvLocal); mainptr->CopyTextToClipboard(wxs_clip); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getclipstr) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 0) PERL_ERROR("Usage: $string = g_getclipstr()."); wxTextDataObject data; if ( !mainptr->GetTextFromClipboard(&data) ) PERL_ERROR("Could not get data from clipboard!"); wxString wxs_clipstr = data.GetText(); XSRETURN_PV((const char*)wxs_clipstr.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- XS(pl_getstring) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items < 1 || items > 3) PERL_ERROR("Usage: $string = g_getstring($prompt,$default='',$title='')."); STRLEN n_a; const char* prompt = SvPV(ST(0), n_a); const char* initial = ""; const char* title = ""; if (items > 1) initial = SvPV(ST(1),n_a); if (items > 2) title = SvPV(ST(2),n_a); wxString result; if ( !GetString(wxString(title,wxConvLocal), wxString(prompt,wxConvLocal), wxString(initial,wxConvLocal), result) ) { // user hit Cancel button AbortPerlScript(); Perl_croak(aTHX_ NULL); } XSRETURN_PV((const char*)result.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- XS(pl_getxy) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $string = g_getxy()."); statusptr->CheckMouseLocation(mainptr->IsActive()); // sets mousepos if (viewptr->showcontrols) mousepos = wxEmptyString; XSRETURN_PV((const char*)mousepos.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- XS(pl_getevent) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 1) PERL_ERROR("Usage: $string = g_getevent($get=1)."); int get = 1; if (items > 0) get = SvIV(ST(0)); wxString event; GSF_getevent(event, get); XSRETURN_PV((const char*)event.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- XS(pl_doevent) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_doevent($string)."); STRLEN n_a; char* event = SvPV(ST(0), n_a); if (event[0]) { const char* err = GSF_doevent(wxString(event,wxConvLocal)); if (err) PERL_ERROR(err); } XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_getkey) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 0) PERL_ERROR("Usage: $char = g_getkey()."); char s[2]; // room for char + NULL GSF_getkey(s); XSRETURN_PV(s); } // ----------------------------------------------------------------------------- XS(pl_dokey) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_dokey($char)."); STRLEN n_a; char* ascii = SvPV(ST(0), n_a); GSF_dokey(ascii); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_show) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_show($string)."); STRLEN n_a; char* s = SvPV(ST(0), n_a); inscript = false; statusptr->DisplayMessage(wxString(s,wxConvLocal)); inscript = true; // make sure status bar is visible if (!showstatus) mainptr->ToggleStatusBar(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_error) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_error($string)."); STRLEN n_a; char* s = SvPV(ST(0), n_a); inscript = false; statusptr->ErrorMessage(wxString(s,wxConvLocal)); inscript = true; // make sure status bar is visible if (!showstatus) mainptr->ToggleStatusBar(); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_warn) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_warn($string)."); STRLEN n_a; char* s = SvPV(ST(0), n_a); Warning(wxString(s,wxConvLocal)); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_note) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_note($string)."); STRLEN n_a; char* s = SvPV(ST(0), n_a); Note(wxString(s,wxConvLocal)); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_help) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_help($string)."); STRLEN n_a; char* htmlfile = SvPV(ST(0), n_a); ShowHelp(wxString(htmlfile,wxConvLocal)); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_check) { IGNORE_UNUSED_PARAMS; // don't call checkevents() here otherwise we can't safely write code like // if (g_getlayer() == target) { // g_check(0); // ... do stuff to target layer ... // g_check(1); // } // RETURN_IF_ABORTED; dXSARGS; if (items != 1) PERL_ERROR("Usage: g_check($bool)."); allowcheck = (SvIV(ST(0)) != 0); XSRETURN(0); } // ----------------------------------------------------------------------------- XS(pl_exit) { IGNORE_UNUSED_PARAMS; RETURN_IF_ABORTED; dXSARGS; if (items > 1) PERL_ERROR("Usage: g_exit($string='')."); STRLEN n_a; char* err = (items == 1) ? SvPV(ST(0),n_a) : NULL; GSF_exit(err); AbortPerlScript(); Perl_croak(aTHX_ NULL); } // ----------------------------------------------------------------------------- XS(pl_fatal) { IGNORE_UNUSED_PARAMS; // don't call RETURN_IF_ABORTED; dXSARGS; // don't call PERL_ERROR in here if (items != 1) Warning(_("Bug: usage is g_fatal($string)")); STRLEN n_a; char* err = SvPV(ST(0),n_a); if (scripterr == wxString(abortmsg,wxConvLocal)) { // this can happen in Perl 5.14 so don't change scripterr // otherwise a message box will appear } else { // store message in global string (shown after script finishes) scripterr = wxString(err, wxConvLocal); } XSRETURN(0); } // ----------------------------------------------------------------------------- // xs_init is passed into perl_parse and initializes statically linked extensions EXTERN_C void xs_init(pTHX) { #ifdef __WXMSW__ wxUnusedVar(my_perl); #endif const char* file = __FILE__; dXSUB_SYS; // DynaLoader allows dynamic loading of other Perl extensions newXS((char*)"DynaLoader::boot_DynaLoader", boot_DynaLoader, (char*)file); // filing newXS((char*)"g_open", pl_open, (char*)file); newXS((char*)"g_save", pl_save, (char*)file); newXS((char*)"g_opendialog", pl_opendialog, (char*)file); newXS((char*)"g_savedialog", pl_savedialog, (char*)file); newXS((char*)"g_load", pl_load, (char*)file); newXS((char*)"g_store", pl_store, (char*)file); newXS((char*)"g_setdir", pl_setdir, (char*)file); newXS((char*)"g_getdir", pl_getdir, (char*)file); // next two are deprecated (use g_getdir) newXS((char*)"g_appdir", pl_appdir, (char*)file); newXS((char*)"g_datadir", pl_datadir, (char*)file); // editing newXS((char*)"g_new", pl_new, (char*)file); newXS((char*)"g_cut", pl_cut, (char*)file); newXS((char*)"g_copy", pl_copy, (char*)file); newXS((char*)"g_clear", pl_clear, (char*)file); newXS((char*)"g_paste", pl_paste, (char*)file); newXS((char*)"g_shrink", pl_shrink, (char*)file); newXS((char*)"g_randfill", pl_randfill, (char*)file); newXS((char*)"g_flip", pl_flip, (char*)file); newXS((char*)"g_rotate", pl_rotate, (char*)file); newXS((char*)"g_parse", pl_parse, (char*)file); newXS((char*)"g_transform", pl_transform, (char*)file); newXS((char*)"g_evolve", pl_evolve, (char*)file); newXS((char*)"g_putcells", pl_putcells, (char*)file); newXS((char*)"g_getcells", pl_getcells, (char*)file); newXS((char*)"g_join", pl_join, (char*)file); newXS((char*)"g_hash", pl_hash, (char*)file); newXS((char*)"g_getclip", pl_getclip, (char*)file); newXS((char*)"g_select", pl_select, (char*)file); newXS((char*)"g_getrect", pl_getrect, (char*)file); newXS((char*)"g_getselrect", pl_getselrect, (char*)file); newXS((char*)"g_setcell", pl_setcell, (char*)file); newXS((char*)"g_getcell", pl_getcell, (char*)file); newXS((char*)"g_setcursor", pl_setcursor, (char*)file); newXS((char*)"g_getcursor", pl_getcursor, (char*)file); // control newXS((char*)"g_empty", pl_empty, (char*)file); newXS((char*)"g_run", pl_run, (char*)file); newXS((char*)"g_step", pl_step, (char*)file); newXS((char*)"g_setstep", pl_setstep, (char*)file); newXS((char*)"g_getstep", pl_getstep, (char*)file); newXS((char*)"g_setbase", pl_setbase, (char*)file); newXS((char*)"g_getbase", pl_getbase, (char*)file); newXS((char*)"g_advance", pl_advance, (char*)file); newXS((char*)"g_reset", pl_reset, (char*)file); newXS((char*)"g_setgen", pl_setgen, (char*)file); newXS((char*)"g_getgen", pl_getgen, (char*)file); newXS((char*)"g_getpop", pl_getpop, (char*)file); newXS((char*)"g_numstates", pl_numstates, (char*)file); newXS((char*)"g_numalgos", pl_numalgos, (char*)file); newXS((char*)"g_setalgo", pl_setalgo, (char*)file); newXS((char*)"g_getalgo", pl_getalgo, (char*)file); newXS((char*)"g_setrule", pl_setrule, (char*)file); newXS((char*)"g_getrule", pl_getrule, (char*)file); newXS((char*)"g_getwidth", pl_getwidth, (char*)file); newXS((char*)"g_getheight", pl_getheight, (char*)file); // viewing newXS((char*)"g_setpos", pl_setpos, (char*)file); newXS((char*)"g_getpos", pl_getpos, (char*)file); newXS((char*)"g_setmag", pl_setmag, (char*)file); newXS((char*)"g_getmag", pl_getmag, (char*)file); newXS((char*)"g_fit", pl_fit, (char*)file); newXS((char*)"g_fitsel", pl_fitsel, (char*)file); newXS((char*)"g_visrect", pl_visrect, (char*)file); newXS((char*)"g_update", pl_update, (char*)file); newXS((char*)"g_autoupdate", pl_autoupdate, (char*)file); // layers newXS((char*)"g_addlayer", pl_addlayer, (char*)file); newXS((char*)"g_clone", pl_clone, (char*)file); newXS((char*)"g_duplicate", pl_duplicate, (char*)file); newXS((char*)"g_dellayer", pl_dellayer, (char*)file); newXS((char*)"g_movelayer", pl_movelayer, (char*)file); newXS((char*)"g_setlayer", pl_setlayer, (char*)file); newXS((char*)"g_getlayer", pl_getlayer, (char*)file); newXS((char*)"g_numlayers", pl_numlayers, (char*)file); newXS((char*)"g_maxlayers", pl_maxlayers, (char*)file); newXS((char*)"g_setname", pl_setname, (char*)file); newXS((char*)"g_getname", pl_getname, (char*)file); newXS((char*)"g_setcolors", pl_setcolors, (char*)file); newXS((char*)"g_getcolors", pl_getcolors, (char*)file); // miscellaneous newXS((char*)"g_setoption", pl_setoption, (char*)file); newXS((char*)"g_getoption", pl_getoption, (char*)file); newXS((char*)"g_setcolor", pl_setcolor, (char*)file); newXS((char*)"g_getcolor", pl_getcolor, (char*)file); newXS((char*)"g_setclipstr", pl_setclipstr, (char*)file); newXS((char*)"g_getclipstr", pl_getclipstr, (char*)file); newXS((char*)"g_getstring", pl_getstring, (char*)file); newXS((char*)"g_getxy", pl_getxy, (char*)file); newXS((char*)"g_getevent", pl_getevent, (char*)file); newXS((char*)"g_doevent", pl_doevent, (char*)file); // next two are deprecated (use g_getevent and g_doevent) newXS((char*)"g_getkey", pl_getkey, (char*)file); newXS((char*)"g_dokey", pl_dokey, (char*)file); newXS((char*)"g_show", pl_show, (char*)file); newXS((char*)"g_error", pl_error, (char*)file); newXS((char*)"g_warn", pl_warn, (char*)file); newXS((char*)"g_note", pl_note, (char*)file); newXS((char*)"g_help", pl_help, (char*)file); newXS((char*)"g_check", pl_check, (char*)file); newXS((char*)"g_exit", pl_exit, (char*)file); // internal use only (don't document) newXS((char*)"g_fatal", pl_fatal, (char*)file); } // ============================================================================= #ifdef PERL510_OR_LATER static bool inited = false; #endif void RunPerlScript(const wxString &filepath) { // allow re-entrancy bool already_in_perl = (my_perl != NULL); if (!already_in_perl) { #ifdef USE_PERL_DYNAMIC if (perldll == NULL) { // try to load Perl library if ( !LoadPerlLib() ) return; } #endif // create a dummy environment for initializing the embedded interpreter static int argc = 3; static char arg1[] = "-e", arg2[] = "0"; static char *args[] = { NULL, arg1, arg2, NULL }, **argv = &args[0]; #ifdef PERL510_OR_LATER static char *ens[] = { NULL }, **env = &ens[0]; if (!inited) { PERL_SYS_INIT3(&argc, &argv, &env); inited = true; } #endif my_perl = perl_alloc(); if (!my_perl) { Warning(_("Could not create Perl interpreter!")); return; } PL_perl_destruct_level = 1; perl_construct(my_perl); // set PERL_EXIT_DESTRUCT_END flag so that perl_destruct will execute // any END blocks in given script (this flag requires Perl 5.7.2+) PL_exit_flags |= PERL_EXIT_DESTRUCT_END; perl_parse(my_perl, xs_init, argc, argv, NULL); perl_run(my_perl); } // convert any \ to \\ and then convert any ' to \' wxString fpath = filepath; fpath.Replace(wxT("\\"), wxT("\\\\")); fpath.Replace(wxT("'"), wxT("\\'")); // construct a command to run the given script file and capture errors wxString command = wxT("do '") + fpath + wxT("'; g_fatal($@) if $@;"); perl_eval_pv(command.mb_str(wxConvLocal), TRUE); if (!already_in_perl) { // any END blocks will now be executed by perl_destruct, so we temporarily // clear scripterr so that RETURN_IF_ABORTED won't call Perl_croak; // this allows g_* commands in END blocks to work after user hits escape // or if g_exit has been called wxString savestring = scripterr; scripterr = wxEmptyString; PL_perl_destruct_level = 1; perl_destruct(my_perl); scripterr = savestring; perl_free(my_perl); my_perl = NULL; } } // ----------------------------------------------------------------------------- void FinishPerlScripting() { #ifdef PERL510_OR_LATER if (inited) { PERL_SYS_TERM(); } #endif #ifdef USE_PERL_DYNAMIC // probably don't really need to do this FreePerlLib(); #endif } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������golly-2.5-src/gui-wx/wxprefs.cpp��������������������������������������������������������������������0000644�0001751�0000144�00000570042�12156145314�013645� �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #if wxUSE_TOOLTIPS #include "wx/tooltip.h" // for wxToolTip #endif #include "wx/stdpaths.h" // for wxStandardPaths #include "wx/filename.h" // for wxFileName #include "wx/propdlg.h" // for wxPropertySheetDialog #include "wx/colordlg.h" // for wxColourDialog #include "wx/bookctrl.h" // for wxBookCtrlBase #include "wx/notebook.h" // for wxNotebookEvent #include "wx/spinctrl.h" // for wxSpinCtrl #include "wx/image.h" // for wxImage #include "lifealgo.h" #include "viewport.h" // for MAX_MAG #include "util.h" // for linereader #include "wxgolly.h" // for wxGetApp, mainptr, viewptr #include "wxmain.h" // for ID_*, mainptr->... #include "wxview.h" // for viewptr->... #include "wxutils.h" // for Warning, Fatal, Beep, FillRect #include "wxhelp.h" // for GetHelpFrame #include "wxinfo.h" // for GetInfoFrame #include "wxalgos.h" // for InitAlgorithms, NumAlgos, algoinfo, etc #include "wxrender.h" // for DrawOneIcon #include "wxlayer.h" // for currlayer, UpdateLayerColors #include "wxscript.h" // for inscript #include "wxprefs.h" #ifdef __WXMSW__ // cursor bitmaps are loaded via .rc file #else #include "bitmaps/pick_curs.xpm" #include "bitmaps/hand_curs.xpm" #include "bitmaps/zoomin_curs.xpm" #include "bitmaps/zoomout_curs.xpm" #endif // ----------------------------------------------------------------------------- // Golly's preferences file is a simple text file. It's initially created in // a user-specific data directory (datadir) but we look in the application // directory (gollydir) first because this makes uninstalling simple and allows // multiple copies/versions of the app to have separate preferences. const wxString PREFS_NAME = wxT("GollyPrefs"); wxString prefspath; // full path to prefs file // location of supplied pattern collection (relative to app) const wxString PATT_DIR = wxT("Patterns"); // location of supplied scripts (relative to app) const wxString SCRIPT_DIR = wxT("Scripts"); const int PREFS_VERSION = 4; // increment if necessary due to changes in syntax/semantics int currversion = PREFS_VERSION; // might be changed by prefs_version const int PREF_LINE_SIZE = 5000; // must be quite long for storing file paths // initialize exported preferences: wxString gollydir; // path of directory containing app wxString datadir; // path of directory for user-specific data wxString tempdir; // path of directory for temporary data wxString rulesdir; // path of directory for app's rule data wxString userrules; // path of directory for user's rule data wxString downloaddir; // path of directory for downloaded data int debuglevel = 0; // for displaying debug info if > 0 int mainx = 30; // main window's initial location int mainy = 40; int mainwd = 800; // main window's initial size int mainht = 600; bool maximize = false; // maximize main window? int helpx = 60; // help window's initial location int helpy = 60; int helpwd = 700; // help window's initial size int helpht = 500; #ifdef __WXMAC__ int helpfontsize = 12; // font size in help window #else int helpfontsize = 10; // font size in help window #endif int infox = 90; // info window's initial location int infoy = 90; int infowd = 700; // info window's initial size int infoht = 500; int rulex = 200; // rule dialog's initial location int ruley = 200; int ruleexwd = 500; // rule dialog's initial extra size int ruleexht = 200; bool showalgohelp = false; // show algorithm help in rule dialog? char initrule[256] = "B3/S23"; // initial rule bool initautofit = false; // initial autofit setting bool inithyperspeed = false; // initial hyperspeed setting bool initshowhashinfo = false; // initial showhashinfo setting bool savexrle = true; // save RLE file using XRLE format? bool showtips = true; // show button tips? bool showtool = true; // show tool bar? bool showlayer = false; // show layer bar? bool showedit = true; // show edit bar? bool showallstates = false; // show all cell states in edit bar? bool showstatus = true; // show status bar? bool showexact = false; // show exact numbers in status bar? bool showtimeline = false; // show timeline bar? bool showgridlines = true; // display grid lines? bool showicons = false; // display icons for cell states? bool swapcolors = false; // swap colors used for cell states? bool buffered = true; // use wxWdgets buffering to avoid flicker? bool scrollpencil = true; // scroll if pencil cursor is dragged outside view? bool scrollcross = true; // scroll if cross cursor is dragged outside view? bool scrollhand = true; // scroll if hand cursor is dragged outside view? bool allowundo = true; // allow undo/redo? bool allowbeep = true; // okay to play beep sound? bool restoreview = true; // should reset/undo restore view? int controlspos = 1; // position of translucent controls (1 is top left corner) int canchangerule = 0; // if > 0 then paste can change rule int randomfill = 50; // random fill percentage (1..100) int opacity = 80; // percentage opacity of live cells in overlays (1..100) int tileborder = 3; // thickness of tiled window borders int mingridmag = 2; // minimum mag to draw grid lines int boldspacing = 10; // spacing of bold grid lines bool showboldlines = true; // show bold grid lines? bool mathcoords = false; // show Y values increasing upwards? bool syncviews = false; // synchronize viewports? bool synccursors = true; // synchronize cursors? bool stacklayers = false; // stack all layers? bool tilelayers = false; // tile all layers? bool askonnew = true; // ask to save changes before creating new pattern? bool askonload = true; // ask to save changes before loading pattern file? bool askondelete = true; // ask to save changes before deleting layer? bool askonquit = true; // ask to save changes before quitting app? int newmag = MAX_MAG; // mag setting for new pattern bool newremovesel = true; // new pattern removes selection? bool openremovesel = true; // opening pattern removes selection? wxCursor* newcurs = NULL; // cursor after creating new pattern (if not NULL) wxCursor* opencurs = NULL; // cursor after opening pattern (if not NULL) int mousewheelmode = 2; // 0:Ignore, 1:forward=ZoomOut, 2:forward=ZoomIn int thumbrange = 10; // thumb box scrolling range in terms of view wd/ht int mindelay = 250; // minimum millisec delay int maxdelay = 2000; // maximum millisec delay wxString opensavedir; // directory for Open and Save dialogs wxString rundir; // directory for Run Script dialog wxString icondir; // directory used by Load Icon File button wxString choosedir; // directory used by Choose File button wxString patterndir; // directory used by Show Patterns wxString scriptdir; // directory used by Show Scripts wxString texteditor; // path of user's preferred text editor wxString perllib; // name of Perl library (loaded at runtime) wxString pythonlib; // name of Python library (loaded at runtime) int dirwinwd = 180; // width of directory window bool showpatterns = true; // show pattern directory? bool showscripts = false; // show script directory? wxMenu* patternSubMenu = NULL; // submenu of recent pattern files wxMenu* scriptSubMenu = NULL; // submenu of recent script files int numpatterns = 0; // current number of recent pattern files int numscripts = 0; // current number of recent script files int maxpatterns = 20; // maximum number of recent pattern files (1..MAX_RECENT) int maxscripts = 20; // maximum number of recent script files (1..MAX_RECENT) wxArrayString namedrules; // initialized in GetPrefs wxColor* borderrgb; // color for border around bounded grid wxColor* selectrgb; // color for selected cells wxColor* pastergb; // color for pasted pattern wxBrush* borderbrush; // brush for filling grid border wxPen* pastepen; // for drawing paste rect // these settings must be global -- they are changed by GetPrefs *before* the // view window is created paste_location plocation = TopLeft; paste_mode pmode = Or; // these must be global -- they are created before the view window is created wxCursor* curs_pencil; // for drawing cells wxCursor* curs_pick; // for picking cell states wxCursor* curs_cross; // for selecting cells wxCursor* curs_hand; // for moving view by dragging wxCursor* curs_zoomin; // for zooming in to a clicked cell wxCursor* curs_zoomout; // for zooming out from a clicked cell // local (ie. non-exported) globals: int mingridindex; // mingridmag - 2 int newcursindex; int opencursindex; #if defined(__WXMAC__) && wxCHECK_VERSION(2,9,0) // wxMOD_CONTROL has been changed to mean Command key down (sheesh!) #define wxMOD_CONTROL wxMOD_RAW_CONTROL #define ControlDown RawControlDown #endif // set of modifier keys (note that MSVC didn't like MK_*) const int mk_CMD = 1; // command key on Mac, control key on Win/Linux const int mk_ALT = 2; // option key on Mac const int mk_SHIFT = 4; #ifdef __WXMAC__ const int mk_CTRL = 8; // control key is separate modifier on Mac const int MAX_MODS = 16; #else const int MAX_MODS = 8; #endif // WXK_* key codes like WXK_F1 have values > 300, so to minimize the // size of the keyaction table (see below) we use our own internal // key codes for function keys and other special keys const int IK_NULL = 0; // probably best never to use this const int IK_HOME = 1; const int IK_END = 2; const int IK_PAGEUP = 3; const int IK_PAGEDOWN = 4; const int IK_HELP = 5; const int IK_INSERT = 6; const int IK_DELETE = 8; // treat delete like backspace (consistent with GSF_dokey) const int IK_TAB = 9; const int IK_RETURN = 13; const int IK_LEFT = 28; const int IK_RIGHT = 29; const int IK_UP = 30; const int IK_DOWN = 31; const int IK_F1 = 'A'; // we use shift+a for the real A, etc const int IK_F24 = 'X'; const int MAX_KEYCODES = 128; // names of the non-displayable keys we currently support; // note that these names can be used in menu item accelerator strings // so they must match legal wx names (listed in wxMenu::Append docs) const char NK_HOME[] = "Home"; const char NK_END[] = "End"; const char NK_PGUP[] = "PgUp"; const char NK_PGDN[] = "PgDn"; const char NK_HELP[] = "Help"; const char NK_INSERT[] = "Insert"; const char NK_DELETE[] = "Delete"; const char NK_TAB[] = "Tab"; #ifdef __WXMSW__ const char NK_RETURN[] = "Enter"; #else const char NK_RETURN[] = "Return"; #endif const char NK_LEFT[] = "Left"; const char NK_RIGHT[] = "Right"; const char NK_UP[] = "Up"; const char NK_DOWN[] = "Down"; const char NK_SPACE[] = "Space"; const action_info nullaction = { DO_NOTHING, wxEmptyString }; // table for converting key combinations into actions action_info keyaction[MAX_KEYCODES][MAX_MODS] = {{ nullaction }}; // strings for setting menu item accelerators wxString accelerator[MAX_ACTIONS]; // ----------------------------------------------------------------------------- bool ConvertKeyAndModifiers(int wxkey, int wxmods, int* newkey, int* newmods) { // first convert given wx modifiers (set by wxKeyEvent::GetModifiers) // to a corresponding set of mk_* values int ourmods = 0; if (wxmods & wxMOD_CMD) ourmods |= mk_CMD; if (wxmods & wxMOD_ALT) ourmods |= mk_ALT; if (wxmods & wxMOD_SHIFT) ourmods |= mk_SHIFT; #ifdef __WXMAC__ if (wxmods & wxMOD_CONTROL) ourmods |= mk_CTRL; #endif // now convert given wx key code to corresponding IK_* code int ourkey; if (wxkey >= 'A' && wxkey <= 'Z') { // convert A..Z to shift+a..shift+z so we can use A..X // for our internal function keys (IK_F1 to IK_F24) ourkey = wxkey + 32; ourmods |= mk_SHIFT; } else if (wxkey >= WXK_F1 && wxkey <= WXK_F24) { // convert wx function key code to IK_F1..IK_F24 ourkey = IK_F1 + (wxkey - WXK_F1); } else if (wxkey >= WXK_NUMPAD0 && wxkey <= WXK_NUMPAD9) { // treat numpad digits like ordinary digits ourkey = '0' + (wxkey - WXK_NUMPAD0); } else { switch (wxkey) { case WXK_HOME: ourkey = IK_HOME; break; case WXK_END: ourkey = IK_END; break; case WXK_PAGEUP: ourkey = IK_PAGEUP; break; case WXK_PAGEDOWN: ourkey = IK_PAGEDOWN; break; case WXK_HELP: ourkey = IK_HELP; break; case WXK_INSERT: ourkey = IK_INSERT; break; case WXK_BACK: // treat backspace like delete case WXK_DELETE: ourkey = IK_DELETE; break; case WXK_TAB: ourkey = IK_TAB; break; case WXK_NUMPAD_ENTER: // treat enter like return case WXK_RETURN: ourkey = IK_RETURN; break; case WXK_LEFT: ourkey = IK_LEFT; break; case WXK_RIGHT: ourkey = IK_RIGHT; break; case WXK_UP: ourkey = IK_UP; break; case WXK_DOWN: ourkey = IK_DOWN; break; case WXK_ADD: ourkey = '+'; break; case WXK_SUBTRACT: ourkey = '-'; break; case WXK_DIVIDE: ourkey = '/'; break; case WXK_MULTIPLY: ourkey = '*'; break; default: ourkey = wxkey; } } if (ourkey < 0 || ourkey >= MAX_KEYCODES) return false; *newkey = ourkey; *newmods = ourmods; return true; } // ----------------------------------------------------------------------------- action_info FindAction(int wxkey, int wxmods) { // convert given wx key code and modifier set to our internal values // and return the corresponding action int ourkey, ourmods; if ( ConvertKeyAndModifiers(wxkey, wxmods, &ourkey, &ourmods) ) { return keyaction[ourkey][ourmods]; } else { return nullaction; } } // ----------------------------------------------------------------------------- void AddDefaultKeyActions() { // these default shortcuts are similar to the hard-wired shortcuts in v1.2 // include some examples of DO_OPENFILE keyaction[(int)'s'][mk_SHIFT].id = DO_OPENFILE; keyaction[(int)'s'][mk_SHIFT].file = wxT("Scripts/Python/shift.py"); keyaction[(int)'l'][mk_ALT].id = DO_OPENFILE; keyaction[(int)'l'][mk_ALT].file = wxT("Help/Lexicon/lex.htm"); // File menu keyaction[(int)'n'][mk_CMD].id = DO_NEWPATT; keyaction[(int)'o'][mk_CMD].id = DO_OPENPATT; keyaction[(int)'o'][mk_SHIFT+mk_CMD].id = DO_OPENCLIP; keyaction[(int)'s'][mk_CMD].id = DO_SAVE; keyaction[(int)'p'][0].id = DO_PATTERNS; keyaction[(int)'p'][mk_CMD].id = DO_PATTERNS; keyaction[(int)'p'][mk_SHIFT].id = DO_SCRIPTS; keyaction[(int)'p'][mk_SHIFT+mk_CMD].id = DO_SCRIPTS; #ifdef __WXMSW__ // Windows does not support ctrl+non-alphanumeric #else keyaction[(int)','][mk_CMD].id = DO_PREFS; #endif keyaction[(int)','][0].id = DO_PREFS; keyaction[(int)'q'][mk_CMD].id = DO_QUIT; // Edit menu keyaction[(int)'z'][0].id = DO_UNDO; keyaction[(int)'z'][mk_CMD].id = DO_UNDO; keyaction[(int)'z'][mk_SHIFT].id = DO_REDO; keyaction[(int)'z'][mk_SHIFT+mk_CMD].id = DO_REDO; keyaction[(int)'x'][mk_CMD].id = DO_CUT; keyaction[(int)'c'][mk_CMD].id = DO_COPY; keyaction[IK_DELETE][0].id = DO_CLEAR; keyaction[IK_DELETE][mk_SHIFT].id = DO_CLEAROUT; keyaction[(int)'v'][0].id = DO_PASTE; keyaction[(int)'v'][mk_CMD].id = DO_PASTE; keyaction[(int)'m'][mk_SHIFT].id = DO_PASTEMODE; keyaction[(int)'l'][mk_SHIFT].id = DO_PASTELOC; keyaction[(int)'a'][0].id = DO_SELALL; keyaction[(int)'a'][mk_CMD].id = DO_SELALL; keyaction[(int)'k'][0].id = DO_REMOVESEL; keyaction[(int)'k'][mk_CMD].id = DO_REMOVESEL; keyaction[(int)'s'][0].id = DO_SHRINKFIT; keyaction[(int)'5'][mk_CMD].id = DO_RANDFILL; keyaction[(int)'y'][0].id = DO_FLIPTB; keyaction[(int)'x'][0].id = DO_FLIPLR; keyaction[(int)'>'][0].id = DO_ROTATECW; keyaction[(int)'<'][0].id = DO_ROTATEACW; keyaction[IK_F1+1][0].id = DO_CURSDRAW; keyaction[IK_F1+2][0].id = DO_CURSPICK; keyaction[IK_F1+3][0].id = DO_CURSSEL; keyaction[IK_F1+4][0].id = DO_CURSMOVE; keyaction[IK_F1+5][0].id = DO_CURSIN; keyaction[IK_F1+6][0].id = DO_CURSOUT; keyaction[(int)'c'][0].id = DO_CURSCYCLE; // Control menu keyaction[IK_RETURN][0].id = DO_STARTSTOP; keyaction[(int)' '][0].id = DO_NEXTGEN; keyaction[IK_TAB][0].id = DO_NEXTSTEP; keyaction[(int)'r'][mk_CMD].id = DO_RESET; keyaction[(int)'+'][0].id = DO_FASTER; keyaction[(int)'+'][mk_SHIFT].id = DO_FASTER; keyaction[(int)'='][0].id = DO_FASTER; keyaction[(int)'_'][0].id = DO_SLOWER; keyaction[(int)'_'][mk_SHIFT].id = DO_SLOWER; keyaction[(int)'-'][0].id = DO_SLOWER; keyaction[(int)'t'][0].id = DO_AUTOFIT; keyaction[(int)'t'][mk_CMD].id = DO_AUTOFIT; keyaction[(int)'u'][mk_CMD].id = DO_HASHING; #ifdef __WXMAC__ keyaction[(int)' '][mk_CTRL].id = DO_ADVANCE; #else // on Windows/Linux mk_CMD is control key keyaction[(int)' '][mk_CMD].id = DO_ADVANCE; #endif keyaction[(int)' '][mk_SHIFT].id = DO_ADVANCEOUT; keyaction[(int)'t'][mk_SHIFT].id = DO_TIMING; // View menu keyaction[IK_LEFT][0].id = DO_LEFT; keyaction[IK_RIGHT][0].id = DO_RIGHT; keyaction[IK_UP][0].id = DO_UP; keyaction[IK_DOWN][0].id = DO_DOWN; keyaction[IK_F1+10][0].id = DO_FULLSCREEN; keyaction[(int)'f'][0].id = DO_FIT; keyaction[(int)'f'][mk_CMD].id = DO_FIT; keyaction[(int)'f'][mk_SHIFT].id = DO_FITSEL; keyaction[(int)'f'][mk_SHIFT+mk_CMD].id = DO_FITSEL; keyaction[(int)'m'][0].id = DO_MIDDLE; keyaction[(int)'m'][mk_CMD].id = DO_MIDDLE; keyaction[(int)'0'][0].id = DO_CHANGE00; keyaction[(int)'9'][0].id = DO_RESTORE00; keyaction[(int)'9'][mk_CMD].id = DO_RESTORE00; keyaction[(int)']'][0].id = DO_ZOOMIN; keyaction[(int)'['][0].id = DO_ZOOMOUT; #ifdef __WXMSW__ // Windows does not support ctrl+non-alphanumeric #else keyaction[(int)']'][mk_CMD].id = DO_ZOOMIN; keyaction[(int)'['][mk_CMD].id = DO_ZOOMOUT; #endif keyaction[(int)'1'][0].id = DO_SCALE1; keyaction[(int)'2'][0].id = DO_SCALE2; keyaction[(int)'4'][0].id = DO_SCALE4; keyaction[(int)'8'][0].id = DO_SCALE8; keyaction[(int)'6'][0].id = DO_SCALE16; keyaction[(int)'3'][0].id = DO_SCALE32; keyaction[(int)'\''][0].id = DO_SHOWTOOL; keyaction[(int)'\\'][0].id = DO_SHOWLAYER; keyaction[(int)'/'][0].id = DO_SHOWEDIT; keyaction[(int)'.'][0].id = DO_SHOWSTATES; keyaction[(int)';'][0].id = DO_SHOWSTATUS; #ifdef __WXMSW__ // Windows does not support ctrl+non-alphanumeric #else keyaction[(int)'\''][mk_CMD].id = DO_SHOWTOOL; keyaction[(int)'\\'][mk_CMD].id = DO_SHOWLAYER; keyaction[(int)'/'][mk_CMD].id = DO_SHOWEDIT; keyaction[(int)'.'][mk_CMD].id = DO_SHOWSTATES; keyaction[(int)';'][mk_CMD].id = DO_SHOWSTATUS; #endif keyaction[(int)'e'][0].id = DO_SHOWEXACT; keyaction[(int)'e'][mk_CMD].id = DO_SHOWEXACT; keyaction[(int)'l'][0].id = DO_SHOWGRID; keyaction[(int)'l'][mk_CMD].id = DO_SHOWGRID; keyaction[(int)'b'][0].id = DO_INVERT; keyaction[(int)'b'][mk_CMD].id = DO_INVERT; keyaction[(int)'i'][0].id = DO_INFO; keyaction[(int)'i'][mk_CMD].id = DO_INFO; // Layer menu // none // Help menu keyaction[(int)'h'][0].id = DO_HELP; keyaction[(int)'?'][0].id = DO_HELP; keyaction[IK_HELP][0].id = DO_HELP; #ifdef __WXMAC__ // cmd-? is the usual shortcut in Mac apps keyaction[(int)'?'][mk_CMD].id = DO_HELP; // we can only detect shift+cmd+/ so we have to assume '?' is above '/' -- yuk keyaction[(int)'/'][mk_SHIFT+mk_CMD].id = DO_HELP; #else // F1 is the usual shortcut in Win/Linux apps keyaction[IK_F1][0].id = DO_HELP; #endif } // ----------------------------------------------------------------------------- const char* GetActionName(action_id action) { switch (action) { case DO_NOTHING: return "NONE"; case DO_OPENFILE: return "Open:"; // File menu case DO_NEWPATT: return "New Pattern"; case DO_OPENPATT: return "Open Pattern..."; case DO_OPENCLIP: return "Open Clipboard"; case DO_PATTERNS: return "Show Patterns"; case DO_PATTDIR: return "Set Pattern Folder..."; case DO_SAVE: return "Save Pattern..."; case DO_SAVEXRLE: return "Save Extended RLE"; case DO_RUNSCRIPT: return "Run Script..."; case DO_RUNCLIP: return "Run Clipboard"; case DO_SCRIPTS: return "Show Scripts"; case DO_SCRIPTDIR: return "Set Script Folder..."; case DO_PREFS: return "Preferences..."; case DO_QUIT: return "Quit Golly"; // Edit menu case DO_UNDO: return "Undo"; case DO_REDO: return "Redo"; case DO_DISABLE: return "Disable Undo/Redo"; case DO_CUT: return "Cut Selection"; case DO_COPY: return "Copy Selection"; case DO_CLEAR: return "Clear Selection"; case DO_CLEAROUT: return "Clear Outside"; case DO_PASTE: return "Paste"; case DO_PASTEMODE: return "Cycle Paste Mode"; case DO_PASTELOC: return "Cycle Paste Location"; case DO_PASTESEL: return "Paste to Selection"; case DO_SELALL: return "Select All"; case DO_REMOVESEL: return "Remove Selection"; case DO_SHRINK: return "Shrink Selection"; case DO_SHRINKFIT: return "Shrink and Fit"; case DO_RANDFILL: return "Random Fill"; case DO_FLIPTB: return "Flip Top-Bottom"; case DO_FLIPLR: return "Flip Left-Right"; case DO_ROTATECW: return "Rotate Clockwise"; case DO_ROTATEACW: return "Rotate Anticlockwise"; case DO_CURSDRAW: return "Cursor Mode: Draw"; case DO_CURSPICK: return "Cursor Mode: Pick"; case DO_CURSSEL: return "Cursor Mode: Select"; case DO_CURSMOVE: return "Cursor Mode: Move"; case DO_CURSIN: return "Cursor Mode: Zoom In"; case DO_CURSOUT: return "Cursor Mode: Zoom Out"; case DO_CURSCYCLE: return "Cycle Cursor Mode"; // Control menu case DO_STARTSTOP: return "Start/Stop Generating"; case DO_NEXTGEN: return "Next Generation"; case DO_NEXTSTEP: return "Next Step"; case DO_NEXTHIGHER: return "Next Higher State"; case DO_NEXTLOWER: return "Next Lower State"; case DO_RESET: return "Reset"; case DO_SETGEN: return "Set Generation..."; case DO_FASTER: return "Faster"; case DO_SLOWER: return "Slower"; case DO_SETBASE: return "Set Base Step..."; case DO_AUTOFIT: return "Auto Fit"; case DO_HASHING: return "Use Hashing"; case DO_HYPER: return "Hyperspeed"; case DO_HASHINFO: return "Show Hash Info"; case DO_RECORD: return "Start/Stop Recording"; case DO_DELTIME: return "Delete Timeline"; case DO_PLAYBACK: return "Play Timeline Backwards"; case DO_SETRULE: return "Set Rule..."; case DO_ADVANCE: return "Advance Selection"; case DO_ADVANCEOUT: return "Advance Outside"; case DO_TIMING: return "Show Timing"; // View menu case DO_LEFT: return "Scroll Left"; case DO_RIGHT: return "Scroll Right"; case DO_UP: return "Scroll Up"; case DO_DOWN: return "Scroll Down"; case DO_NE: return "Scroll NE"; case DO_NW: return "Scroll NW"; case DO_SE: return "Scroll SE"; case DO_SW: return "Scroll SW"; case DO_FULLSCREEN: return "Full Screen"; case DO_FIT: return "Fit Pattern"; case DO_FITSEL: return "Fit Selection"; case DO_MIDDLE: return "Middle"; case DO_CHANGE00: return "Change Origin"; case DO_RESTORE00: return "Restore Origin"; case DO_ZOOMIN: return "Zoom In"; case DO_ZOOMOUT: return "Zoom Out"; case DO_SCALE1: return "Set Scale 1:1"; case DO_SCALE2: return "Set Scale 1:2"; case DO_SCALE4: return "Set Scale 1:4"; case DO_SCALE8: return "Set Scale 1:8"; case DO_SCALE16: return "Set Scale 1:16"; case DO_SCALE32: return "Set Scale 1:32"; case DO_SHOWTOOL: return "Show Tool Bar"; case DO_SHOWLAYER: return "Show Layer Bar"; case DO_SHOWEDIT: return "Show Edit Bar"; case DO_SHOWSTATES: return "Show All States"; case DO_SHOWSTATUS: return "Show Status Bar"; case DO_SHOWEXACT: return "Show Exact Numbers"; case DO_SETCOLORS: return "Set Layer Colors..."; case DO_SHOWICONS: return "Show Cell Icons"; case DO_INVERT: return "Invert Colors"; case DO_SHOWGRID: return "Show Grid Lines"; case DO_BUFFERED: return "Buffered"; case DO_SHOWTIME: return "Show Timeline"; case DO_INFO: return "Pattern Info"; // Layer menu case DO_ADD: return "Add Layer"; case DO_CLONE: return "Clone Layer"; case DO_DUPLICATE: return "Duplicate Layer"; case DO_DELETE: return "Delete Layer"; case DO_DELOTHERS: return "Delete Other Layers"; case DO_MOVELAYER: return "Move Layer..."; case DO_NAMELAYER: return "Name Layer..."; case DO_SYNCVIEWS: return "Synchronize Views"; case DO_SYNCCURS: return "Synchronize Cursors"; case DO_STACK: return "Stack Layers"; case DO_TILE: return "Tile Layers"; // Help menu case DO_HELP: return "Show Help"; case DO_ABOUT: return "About Golly"; default: Warning(_("Bug detected in GetActionName!")); } return "BUG"; } // ----------------------------------------------------------------------------- // for case-insensitive string comparison #ifdef __WXMSW__ #define ISTRCMP stricmp #else #define ISTRCMP strcasecmp #endif void GetKeyAction(char* value) { // parse strings like "z undo" or "space+ctrl advance selection"; // note that some errors detected here can be Fatal because the user // has to quit Golly anyway to edit the prefs file char* start = value; char* p = start; int modset = 0; int key = -1; // extract key, skipping first char in case it's '+' if (*p > 0) p++; while (1) { if (*p == 0) { Fatal(wxString::Format(_("Bad key_action value: %s"), wxString(value,wxConvLocal).c_str())); } if (*p == ' ' || *p == '+') { // we found end of key char oldp = *p; *p = 0; int len = (int)strlen(start); if (len == 1) { key = start[0]; if (key < ' ' || key > '~') { // this can happen if the user's language setting is not English, // so change key and continue rather than call Fatal Warning(wxString::Format(_("Non-displayable key in key_action: %s"), wxString(start,wxConvLocal).c_str())); key = '!'; } if (key >= 'A' && key <= 'Z') { // convert A..Z to shift+a..shift+z so we can use A..X // for our internal function keys (IK_F1 to IK_F24) key += 32; modset |= mk_SHIFT; } } else if (len > 1) { if ((start[0] == 'f' || start[0] == 'F') && start[1] >= '1' && start[1] <= '9') { // we have a function key char* p = &start[1]; int num; sscanf(p, "%d", &num); if (num >= 1 && num <= 24) key = IK_F1 + num - 1; } else { if (ISTRCMP(start, NK_HOME) == 0) key = IK_HOME; else if (ISTRCMP(start, NK_END) == 0) key = IK_END; else if (ISTRCMP(start, NK_PGUP) == 0) key = IK_PAGEUP; else if (ISTRCMP(start, NK_PGDN) == 0) key = IK_PAGEDOWN; else if (ISTRCMP(start, NK_HELP) == 0) key = IK_HELP; else if (ISTRCMP(start, NK_INSERT) == 0) key = IK_INSERT; else if (ISTRCMP(start, NK_DELETE) == 0) key = IK_DELETE; else if (ISTRCMP(start, NK_TAB) == 0) key = IK_TAB; else if (ISTRCMP(start, NK_RETURN) == 0) key = IK_RETURN; else if (ISTRCMP(start, NK_LEFT) == 0) key = IK_LEFT; else if (ISTRCMP(start, NK_RIGHT) == 0) key = IK_RIGHT; else if (ISTRCMP(start, NK_UP) == 0) key = IK_UP; else if (ISTRCMP(start, NK_DOWN) == 0) key = IK_DOWN; else if (ISTRCMP(start, NK_SPACE) == 0) key = ' '; } if (key < 0) Fatal(wxString::Format(_("Unknown key in key_action: %s"), wxString(start,wxConvLocal).c_str())); } *p = oldp; // restore ' ' or '+' start = p; start++; break; } p++; } // *p is ' ' or '+' so extract zero or more modifiers while (*p != ' ') { p++; if (*p == 0) { Fatal(wxString::Format(_("No action in key_action value: %s"), wxString(value,wxConvLocal).c_str())); } if (*p == ' ' || *p == '+') { // we found end of modifier char oldp = *p; *p = 0; #ifdef __WXMAC__ if (ISTRCMP(start, "cmd") == 0) modset |= mk_CMD; else if (ISTRCMP(start, "opt") == 0) modset |= mk_ALT; else if (ISTRCMP(start, "ctrl") == 0) modset |= mk_CTRL; #else if (ISTRCMP(start, "ctrl") == 0) modset |= mk_CMD; else if (ISTRCMP(start, "alt") == 0) modset |= mk_ALT; #endif else if (ISTRCMP(start, "shift") == 0) modset |= mk_SHIFT; else Fatal(wxString::Format(_("Unknown modifier in key_action: %s"), wxString(start,wxConvLocal).c_str())); *p = oldp; // restore ' ' or '+' start = p; start++; } } // *p is ' ' so skip and check the action string p++; action_info action = nullaction; // first look for "Open:" followed by file path if (strncmp(p, "Open:", 5) == 0) { action.id = DO_OPENFILE; action.file = wxString(&p[5], wxConvLocal); } else { // assume DO_NOTHING is 0 and start with action 1 for (int i = 1; i < MAX_ACTIONS; i++) { if (strcmp(p, GetActionName((action_id) i)) == 0) { action.id = (action_id) i; break; } } } // test for some deprecated actions if (action.id == DO_NOTHING) { if (strcmp(p, "Swap Cell Colors") == 0) action.id = DO_INVERT; } keyaction[key][modset] = action; } // ----------------------------------------------------------------------------- wxString GetKeyCombo(int key, int modset) { // build a key combo string for display in prefs dialog and help window wxString result = wxEmptyString; #ifdef __WXMAC__ if (mk_ALT & modset) result += wxT("Option-"); if (mk_SHIFT & modset) result += wxT("Shift-"); if (mk_CTRL & modset) result += wxT("Control-"); if (mk_CMD & modset) result += wxT("Command-"); #else if (mk_ALT & modset) result += wxT("Alt+"); if (mk_SHIFT & modset) result += wxT("Shift+"); if (mk_CMD & modset) result += wxT("Control+"); #endif if (key >= IK_F1 && key <= IK_F24) { // function key result += wxString::Format(wxT("F%d"), key - IK_F1 + 1); } else if (key >= 'a' && key <= 'z') { // display A..Z rather than a..z result += wxChar(key - 32); } else if (key > ' ' && key <= '~') { // displayable char, but excluding space (that's handled below) result += wxChar(key); } else { // non-displayable char switch (key) { // these strings can be more descriptive than the NK_* strings case IK_HOME: result += _("Home"); break; case IK_END: result += _("End"); break; case IK_PAGEUP: result += _("PageUp"); break; case IK_PAGEDOWN: result += _("PageDown"); break; case IK_HELP: result += _("Help"); break; case IK_INSERT: result += _("Insert"); break; case IK_DELETE: result += _("Delete"); break; case IK_TAB: result += _("Tab"); break; #ifdef __WXMSW__ case IK_RETURN: result += _("Enter"); break; #else case IK_RETURN: result += _("Return"); break; #endif case IK_LEFT: result += _("Left"); break; case IK_RIGHT: result += _("Right"); break; case IK_UP: result += _("Up"); break; case IK_DOWN: result += _("Down"); break; case ' ': result += _("Space"); break; default: result = wxEmptyString; } } return result; } // ----------------------------------------------------------------------------- wxString GetShortcutTable() { // return HTML data to display current keyboard shortcuts in help window wxString result; result += _("<html><title>Golly Help: Keyboard Shortcuts"); result += _(""); result += _("

Keyboard shortcuts"); result += _("

Use Preferences > Keyboard"); result += _(" to change the following keyboard shortcuts:"); result += _("

"); result += _(""); result += _(""); bool assigned[MAX_ACTIONS] = {false}; for (int key = 0; key < MAX_KEYCODES; key++) { for (int modset = 0; modset < MAX_MODS; modset++) { action_info action = keyaction[key][modset]; if ( action.id != DO_NOTHING ) { assigned[action.id] = true; wxString keystring = GetKeyCombo(key, modset); if (key == '<') { keystring.Replace(_("<"), _("<")); } result += _(""); } } } result += _("
Key CombinationAction
"); result += keystring; result += _("  "); result += wxString(GetActionName(action.id), wxConvLocal); if (action.id == DO_OPENFILE) { result += _(" "); result += action.file; } result += _("
"); // also list unassigned actions result += _("

The following actions currently have no keyboard shortcuts:

"); for (int i = 1; i < MAX_ACTIONS; i++) { if (!assigned[i]) { wxString name = wxString(GetActionName((action_id) i),wxConvLocal); result += wxString::Format(_("

%s
"), name.c_str()); } } result += _(""); return result; } // ----------------------------------------------------------------------------- wxString GetModifiers(int modset) { wxString modkeys = wxEmptyString; #ifdef __WXMAC__ if (mk_ALT & modset) modkeys += wxT("+opt"); if (mk_SHIFT & modset) modkeys += wxT("+shift"); if (mk_CTRL & modset) modkeys += wxT("+ctrl"); if (mk_CMD & modset) modkeys += wxT("+cmd"); #else if (mk_ALT & modset) modkeys += wxT("+alt"); if (mk_SHIFT & modset) modkeys += wxT("+shift"); if (mk_CMD & modset) modkeys += wxT("+ctrl"); #endif return modkeys; } // ----------------------------------------------------------------------------- wxString GetKeyName(int key) { wxString result; if (key >= IK_F1 && key <= IK_F24) { // function key result.Printf(wxT("F%d"), key - IK_F1 + 1); } else if (key > ' ' && key <= '~') { // displayable char, but excluding space (that's handled below) result = wxChar(key); } else { // non-displayable char switch (key) { case IK_HOME: result = wxString(NK_HOME, wxConvLocal); break; case IK_END: result = wxString(NK_END, wxConvLocal); break; case IK_PAGEUP: result = wxString(NK_PGUP, wxConvLocal); break; case IK_PAGEDOWN: result = wxString(NK_PGDN, wxConvLocal); break; case IK_HELP: result = wxString(NK_HELP, wxConvLocal); break; case IK_INSERT: result = wxString(NK_INSERT, wxConvLocal); break; case IK_DELETE: result = wxString(NK_DELETE, wxConvLocal); break; case IK_TAB: result = wxString(NK_TAB, wxConvLocal); break; case IK_RETURN: result = wxString(NK_RETURN, wxConvLocal); break; case IK_LEFT: result = wxString(NK_LEFT, wxConvLocal); break; case IK_RIGHT: result = wxString(NK_RIGHT, wxConvLocal); break; case IK_UP: result = wxString(NK_UP, wxConvLocal); break; case IK_DOWN: result = wxString(NK_DOWN, wxConvLocal); break; case ' ': result = wxString(NK_SPACE, wxConvLocal); break; default: result = wxEmptyString; } } return result; } // ----------------------------------------------------------------------------- void SaveKeyActions(FILE* f) { bool assigned[MAX_ACTIONS] = {false}; fputs("\n", f); for (int key = 0; key < MAX_KEYCODES; key++) { for (int modset = 0; modset < MAX_MODS; modset++) { action_info action = keyaction[key][modset]; if ( action.id != DO_NOTHING ) { assigned[action.id] = true; fprintf(f, "key_action=%s%s %s%s\n", (const char*) GetKeyName(key).mb_str(wxConvLocal), (const char*) GetModifiers(modset).mb_str(wxConvLocal), GetActionName(action.id), (const char*) action.file.mb_str(wxConvLocal)); } } } // list all unassigned actions in comment lines fputs("# unassigned actions:\n", f); for (int i = 1; i < MAX_ACTIONS; i++) { if ( !assigned[i] ) { fprintf(f, "# key_action=key+mods %s", GetActionName((action_id) i)); if ( i == DO_OPENFILE ) fputs("file", f); fputs("\n", f); } } fputs("\n", f); } // ----------------------------------------------------------------------------- void CreateAccelerator(action_id action, int modset, int key) { accelerator[action] = wxT("\t"); #ifdef __WXMAC__ if (modset & mk_CTRL) accelerator[action] += wxT("RawCtrl+"); #endif if (modset & mk_CMD) accelerator[action] += wxT("Ctrl+"); if (modset & mk_ALT) accelerator[action] += wxT("Alt+"); if (modset & mk_SHIFT) accelerator[action] += wxT("Shift+"); if (key >= 'a' && key <= 'z') { // convert a..z to A..Z accelerator[action] += wxChar(key - 32); #ifdef __WXMAC__ } else if (key == IK_DELETE) { // must use "Back" to get correct symbol (<+ rather than +>) accelerator[action] += wxT("Back"); #endif } else { accelerator[action] += GetKeyName(key); } } // ----------------------------------------------------------------------------- void UpdateAcceleratorStrings() { for (int i = 0; i < MAX_ACTIONS; i++) accelerator[i] = wxEmptyString; // go thru keyaction table looking for key combos that are valid menu item // accelerators and construct suitable strings like "\tCtrl+Alt+Shift+K" // or "\tF12" or "\tReturn" etc for (int key = 0; key < MAX_KEYCODES; key++) { for (int modset = 0; modset < MAX_MODS; modset++) { action_info info = keyaction[key][modset]; action_id action = info.id; if (action != DO_NOTHING && accelerator[action].IsEmpty()) { // check if key can be used as an accelerator if ((key >= ' ' && key <= '~') || (key >= IK_F1 && key <= IK_F24) || (key >= IK_LEFT && key <= IK_DOWN) || key == IK_HOME || key == IK_END || key == IK_PAGEUP || key == IK_PAGEDOWN || key == IK_DELETE || key == IK_TAB || key == IK_RETURN ) { CreateAccelerator(action, modset, key); } } } } // go thru keyaction table again looking only for key combos containing Ctrl; // we do this so that the Paste menu item will have the standard Ctrl+V // shortcut rather than a plain V if both those shortcuts are assigned for (int key = 0; key < MAX_KEYCODES; key++) { for (int modset = 0; modset < MAX_MODS; modset++) { action_info info = keyaction[key][modset]; action_id action = info.id; if (action != DO_NOTHING && (modset & mk_CMD)) { CreateAccelerator(action, modset, key); } } } } // ----------------------------------------------------------------------------- wxString GetAccelerator(action_id action) { return accelerator[action]; } // ----------------------------------------------------------------------------- // some method names have changed in wx 2.9 #if wxCHECK_VERSION(2,9,0) #define GetLabelFromText GetLabelText #endif void RemoveAccelerator(wxMenuBar* mbar, int item, action_id action) { if (!accelerator[action].IsEmpty()) { // remove accelerator from given menu item mbar->SetLabel(item, wxMenuItem::GetLabelFromText(mbar->GetLabel(item))); } } // ----------------------------------------------------------------------------- void SetAccelerator(wxMenuBar* mbar, int item, action_id action) { wxString accel = accelerator[action]; if (inscript) { // RunScript has called mainptr->UpdateMenuAccelerators() // so remove accelerator from menu item to allow keyboard shortcuts // to be passed to script if (accel.IsEmpty()) return; if (action == DO_STARTSTOP) { // don't remove Escape from "Stop Script" menu item return; } else { accel = wxEmptyString; } } else if (viewptr->waitingforclick) { // PatternView::PasteTemporaryToCurrent has called mainptr->UpdateMenuAccelerators() // so remove accelerator to allow keyboard shortcuts while waiting for paste click if (accel.IsEmpty()) return; accel = wxEmptyString; } // we need to remove old accelerator string from GetLabel text mbar->SetLabel(item, wxMenuItem::GetLabelFromText(mbar->GetLabel(item)) + accel); } // ----------------------------------------------------------------------------- void CreateCursors() { curs_pencil = new wxCursor(wxCURSOR_PENCIL); if (curs_pencil == NULL) Fatal(_("Failed to create pencil cursor!")); wxBitmap bitmap_pick = wxBITMAP(pick_curs); wxImage image_pick = bitmap_pick.ConvertToImage(); image_pick.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, 0); image_pick.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, 15); curs_pick = new wxCursor(image_pick); if (curs_pick == NULL) Fatal(_("Failed to create pick cursor!")); #ifdef __WXMSW__ // don't use wxCURSOR_CROSS because it disappears on black background wxBitmap bitmap_cross = wxBITMAP(cross_curs); wxImage image_cross = bitmap_cross.ConvertToImage(); image_cross.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, 8); image_cross.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, 8); curs_cross = new wxCursor(image_cross); #else curs_cross = new wxCursor(wxCURSOR_CROSS); #endif if (curs_cross == NULL) Fatal(_("Failed to create cross cursor!")); wxBitmap bitmap_hand = wxBITMAP(hand_curs); wxImage image_hand = bitmap_hand.ConvertToImage(); image_hand.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, 8); image_hand.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, 8); curs_hand = new wxCursor(image_hand); if (curs_hand == NULL) Fatal(_("Failed to create hand cursor!")); wxBitmap bitmap_zoomin = wxBITMAP(zoomin_curs); wxImage image_zoomin = bitmap_zoomin.ConvertToImage(); image_zoomin.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, 6); image_zoomin.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, 6); curs_zoomin = new wxCursor(image_zoomin); if (curs_zoomin == NULL) Fatal(_("Failed to create zoomin cursor!")); wxBitmap bitmap_zoomout = wxBITMAP(zoomout_curs); wxImage image_zoomout = bitmap_zoomout.ConvertToImage(); image_zoomout.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, 6); image_zoomout.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, 6); curs_zoomout = new wxCursor(image_zoomout); if (curs_zoomout == NULL) Fatal(_("Failed to create zoomout cursor!")); // default cursors for new pattern or after opening pattern newcurs = curs_pencil; opencurs = curs_zoomin; } // ----------------------------------------------------------------------------- void FreeCursors() { delete curs_pencil; delete curs_pick; delete curs_cross; delete curs_hand; delete curs_zoomin; delete curs_zoomout; } // ----------------------------------------------------------------------------- const char* CursorToString(wxCursor* curs) { if (curs == curs_pencil) return "Draw"; if (curs == curs_pick) return "Pick"; if (curs == curs_cross) return "Select"; if (curs == curs_hand) return "Move"; if (curs == curs_zoomin) return "Zoom In"; if (curs == curs_zoomout) return "Zoom Out"; return "No Change"; // curs is NULL } // ----------------------------------------------------------------------------- wxCursor* StringToCursor(const char* s) { if (strcmp(s, "Draw") == 0) return curs_pencil; if (strcmp(s, "Pick") == 0) return curs_pick; if (strcmp(s, "Select") == 0) return curs_cross; if (strcmp(s, "Move") == 0) return curs_hand; if (strcmp(s, "Zoom In") == 0) return curs_zoomin; if (strcmp(s, "Zoom Out") == 0) return curs_zoomout; return NULL; // "No Change" } // ----------------------------------------------------------------------------- int CursorToIndex(wxCursor* curs) { if (curs == curs_pencil) return 0; if (curs == curs_pick) return 1; if (curs == curs_cross) return 2; if (curs == curs_hand) return 3; if (curs == curs_zoomin) return 4; if (curs == curs_zoomout) return 5; return 6; // curs is NULL } // ----------------------------------------------------------------------------- wxCursor* IndexToCursor(int i) { if (i == 0) return curs_pencil; if (i == 1) return curs_pick; if (i == 2) return curs_cross; if (i == 3) return curs_hand; if (i == 4) return curs_zoomin; if (i == 5) return curs_zoomout; return NULL; // "No Change" } // ----------------------------------------------------------------------------- // following routines cannot be PatternView methods -- they are called by // GetPrefs() before the view window is created const char* GetPasteLocation() { switch (plocation) { case TopLeft: return "TopLeft"; case TopRight: return "TopRight"; case BottomRight: return "BottomRight"; case BottomLeft: return "BottomLeft"; case Middle: return "Middle"; default: return "unknown"; } } // ----------------------------------------------------------------------------- void SetPasteLocation(const char* s) { if (strcmp(s, "TopLeft") == 0) { plocation = TopLeft; } else if (strcmp(s, "TopRight") == 0) { plocation = TopRight; } else if (strcmp(s, "BottomRight") == 0) { plocation = BottomRight; } else if (strcmp(s, "BottomLeft") == 0) { plocation = BottomLeft; } else { plocation = Middle; } } // ----------------------------------------------------------------------------- const char* GetPasteMode() { switch (pmode) { case And: return "And"; case Copy: return "Copy"; case Or: return "Or"; case Xor: return "Xor"; default: return "unknown"; } } // ----------------------------------------------------------------------------- void SetPasteMode(const char* s) { if (strcmp(s, "And") == 0) { pmode = And; } else if (strcmp(s, "Copy") == 0) { pmode = Copy; } else if (strcmp(s, "Or") == 0) { pmode = Or; } else { pmode = Xor; } } // ----------------------------------------------------------------------------- void SetBrushesAndPens() { for (int i = 0; i < NumAlgos(); i++) { algoinfo[i]->statusbrush->SetColour(algoinfo[i]->statusrgb); } borderbrush->SetColour(*borderrgb); pastepen->SetColour(*pastergb); } // ----------------------------------------------------------------------------- void CreateDefaultColors() { borderrgb = new wxColor(128, 128, 128); // 50% gray selectrgb = new wxColor( 75, 175, 0); // dark green (will be 50% transparent) pastergb = new wxColor(255, 0, 0); // red borderbrush = new wxBrush(*wxBLACK); pastepen = new wxPen(*wxBLACK); // set their default colors (in case prefs file doesn't exist) SetBrushesAndPens(); } // ----------------------------------------------------------------------------- void FreeDefaultColors() { delete borderrgb; delete selectrgb; delete pastergb; delete borderbrush; delete pastepen; } // ----------------------------------------------------------------------------- void GetColor(const char* value, wxColor* rgb) { unsigned int r, g, b; sscanf(value, "%u,%u,%u", &r, &g, &b); rgb->Set(r, g, b); } // ----------------------------------------------------------------------------- void SaveColor(FILE* f, const char* name, const wxColor* rgb) { fprintf(f, "%s=%d,%d,%d\n", name, rgb->Red(), rgb->Green(), rgb->Blue()); } // ----------------------------------------------------------------------------- void GetRelPath(const char* value, wxString& path, const wxString& defdir = wxEmptyString, bool isdir = true) { path = wxString(value, wxConvLocal); wxFileName fname(path); if (currversion < 4 && fname.IsAbsolute() && defdir.length() > 0) { // if old version's absolute path ends with defdir then update // path so new version will see correct dir wxString suffix = wxFILE_SEP_PATH + defdir; if (path.EndsWith(suffix)) { path = gollydir + defdir; // nicer if directory path ends with separator if (isdir && path.Last() != wxFILE_SEP_PATH) path += wxFILE_SEP_PATH; return; } } // if path isn't absolute then prepend Golly directory if (!fname.IsAbsolute()) path = gollydir + path; if (defdir.length() > 0) { // if path doesn't exist then reset to default directory if (!wxFileName::DirExists(path)) path = gollydir + defdir; } // nicer if directory path ends with separator if (isdir && path.Last() != wxFILE_SEP_PATH) path += wxFILE_SEP_PATH; } // ----------------------------------------------------------------------------- void SaveRelPath(FILE* f, const char* name, wxString path) { // if given path is inside Golly directory then save as a relative path if (path.StartsWith(gollydir)) { // remove gollydir from start of path path.erase(0, gollydir.length()); } fprintf(f, "%s=%s\n", name, (const char*)path.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- #define STRINGIFY(arg) STR2(arg) #define STR2(arg) #arg const char* GOLLY_VERSION = STRINGIFY(VERSION); void SavePrefs() { if (mainptr == NULL || currlayer == NULL) { // should never happen but play safe return; } FILE* f = fopen((const char*)prefspath.mb_str(wxConvLocal), "w"); if (f == NULL) { Warning(_("Could not save preferences file!")); return; } fprintf(f, "# NOTE: If you edit this file then do so when Golly isn't running\n"); fprintf(f, "# otherwise all your changes will be clobbered when Golly quits.\n\n"); fprintf(f, "prefs_version=%d\n", PREFS_VERSION); fprintf(f, "golly_version=%s\n", GOLLY_VERSION); wxString wxversion = wxVERSION_STRING; fprintf(f, "wx_version=%s\n", (const char*)wxversion.mb_str(wxConvLocal)); #if defined(__WXMAC__) fprintf(f, "platform=Mac\n"); #elif defined(__WXMSW__) fprintf(f, "platform=Windows\n"); #elif defined(__WXGTK__) fprintf(f, "platform=Linux\n"); #else fprintf(f, "platform=unknown\n"); #endif fprintf(f, "debug_level=%d\n", debuglevel); SaveKeyActions(f); // save main window's location and size #ifdef __WXMSW__ if (mainptr->fullscreen || mainptr->IsIconized()) { // use mainx, mainy, mainwd, mainht set by mainptr->ToggleFullScreen() // or by mainptr->OnSize } #else if (mainptr->fullscreen) { // use mainx, mainy, mainwd, mainht set by mainptr->ToggleFullScreen() } #endif else { wxRect r = mainptr->GetRect(); mainx = r.x; mainy = r.y; mainwd = r.width; mainht = r.height; } fprintf(f, "main_window=%d,%d,%d,%d\n", mainx, mainy, mainwd, mainht); fprintf(f, "maximize=%d\n", mainptr->IsMaximized() ? 1 : 0); #ifdef __WXMSW__ if (GetHelpFrame() && !GetHelpFrame()->IsIconized()) #else if (GetHelpFrame()) #endif { wxRect r = GetHelpFrame()->GetRect(); helpx = r.x; helpy = r.y; helpwd = r.width; helpht = r.height; } fprintf(f, "help_window=%d,%d,%d,%d\n", helpx, helpy, helpwd, helpht); fprintf(f, "help_font_size=%d (%d..%d)\n", helpfontsize, minfontsize, maxfontsize); #ifdef __WXMSW__ if (GetInfoFrame() && !GetInfoFrame()->IsIconized()) #else if (GetInfoFrame()) #endif { wxRect r = GetInfoFrame()->GetRect(); infox = r.x; infoy = r.y; infowd = r.width; infoht = r.height; } fprintf(f, "info_window=%d,%d,%d,%d\n", infox, infoy, infowd, infoht); fprintf(f, "rule_dialog=%d,%d,%d,%d\n", rulex, ruley, ruleexwd, ruleexht); fprintf(f, "show_algo_help=%d\n", showalgohelp ? 1 : 0); fprintf(f, "allow_undo=%d\n", allowundo ? 1 : 0); fprintf(f, "allow_beep=%d\n", allowbeep ? 1 : 0); fprintf(f, "restore_view=%d\n", restoreview ? 1 : 0); fprintf(f, "paste_location=%s\n", GetPasteLocation()); fprintf(f, "paste_mode=%s\n", GetPasteMode()); fprintf(f, "scroll_pencil=%d\n", scrollpencil ? 1 : 0); fprintf(f, "scroll_cross=%d\n", scrollcross ? 1 : 0); fprintf(f, "scroll_hand=%d\n", scrollhand ? 1 : 0); fprintf(f, "controls_pos=%d (0..4)\n", controlspos); fprintf(f, "can_change_rule=%d (0..2)\n", canchangerule); fprintf(f, "random_fill=%d (1..100)\n", randomfill); fprintf(f, "min_delay=%d (0..%d millisecs)\n", mindelay, MAX_DELAY); fprintf(f, "max_delay=%d (0..%d millisecs)\n", maxdelay, MAX_DELAY); fprintf(f, "auto_fit=%d\n", currlayer->autofit ? 1 : 0); fprintf(f, "hyperspeed=%d\n", currlayer->hyperspeed ? 1 : 0); fprintf(f, "hash_info=%d\n", currlayer->showhashinfo ? 1 : 0); fputs("\n", f); fprintf(f, "init_algo=%s\n", GetAlgoName(currlayer->algtype)); for (int i = 0; i < NumAlgos(); i++) { fputs("\n", f); fprintf(f, "algorithm=%s\n", GetAlgoName(i)); fprintf(f, "max_mem=%d\n", algoinfo[i]->algomem); fprintf(f, "base_step=%d\n", algoinfo[i]->defbase); SaveColor(f, "status_rgb", &algoinfo[i]->statusrgb); SaveColor(f, "from_rgb", &algoinfo[i]->fromrgb); SaveColor(f, "to_rgb", &algoinfo[i]->torgb); fprintf(f, "use_gradient=%d\n", algoinfo[i]->gradient ? 1 : 0); fputs("colors=", f); for (int state = 0; state < algoinfo[i]->maxstates; state++) { // only write out state,r,g,b tuple if color is different to default if (algoinfo[i]->algor[state] != algoinfo[i]->defr[state] || algoinfo[i]->algog[state] != algoinfo[i]->defg[state] || algoinfo[i]->algob[state] != algoinfo[i]->defb[state] ) { fprintf(f, "%d,%d,%d,%d,", state, algoinfo[i]->algor[state], algoinfo[i]->algog[state], algoinfo[i]->algob[state]); } } fputs("\n", f); } fputs("\n", f); fprintf(f, "rule=%s\n", currlayer->algo->getrule()); if (namedrules.GetCount() > 1) { size_t i; for (i=1; i 0) { fputs("\n", f); int i; for (i = 0; i < numpatterns; i++) { wxMenuItem* item = patternSubMenu->FindItemByPosition(i); if (item) { #if wxCHECK_VERSION(2,9,0) wxString path = item->GetItemLabel(); #else wxString path = item->GetText(); #endif #ifdef __WXGTK__ // remove duplicate underscores path.Replace(wxT("__"), wxT("_")); #endif // remove duplicate ampersands path.Replace(wxT("&&"), wxT("&")); fprintf(f, "recent_pattern=%s\n", (const char*)path.mb_str(wxConvLocal)); } } } if (numscripts > 0) { fputs("\n", f); int i; for (i = 0; i < numscripts; i++) { wxMenuItem* item = scriptSubMenu->FindItemByPosition(i); if (item) { #if wxCHECK_VERSION(2,9,0) wxString path = item->GetItemLabel(); #else wxString path = item->GetText(); #endif #ifdef __WXGTK__ // remove duplicate underscores path.Replace(wxT("__"), wxT("_")); #endif // remove duplicate ampersands path.Replace(wxT("&&"), wxT("&")); fprintf(f, "recent_script=%s\n", (const char*)path.mb_str(wxConvLocal)); } } } fclose(f); } // ----------------------------------------------------------------------------- void AddDefaultRules() { namedrules.Add(wxT("LifeHistory|LifeHistory")); namedrules.Add(wxT("3-4 Life|B34/S34")); namedrules.Add(wxT("HighLife|B36/S23")); namedrules.Add(wxT("AntiLife|B0123478/S01234678")); namedrules.Add(wxT("Life without Death|B3/S012345678")); namedrules.Add(wxT("Plow World|B378/S012345678")); namedrules.Add(wxT("Day and Night|B3678/S34678")); namedrules.Add(wxT("Diamoeba|B35678/S5678")); namedrules.Add(wxT("LongLife|B345/S5")); namedrules.Add(wxT("Seeds|B2")); namedrules.Add(wxT("Persian Rug|B234")); namedrules.Add(wxT("Replicator|B1357/S1357")); namedrules.Add(wxT("Fredkin|B1357/S02468")); namedrules.Add(wxT("Morley|B368/S245")); namedrules.Add(wxT("Wolfram 22|W22")); namedrules.Add(wxT("Wolfram 30|W30")); namedrules.Add(wxT("Wolfram 110|W110")); namedrules.Add(wxT("WireWorld|WireWorld")); namedrules.Add(wxT("JvN29|JvN29")); namedrules.Add(wxT("Nobili32|Nobili32")); namedrules.Add(wxT("Hutton32|Hutton32")); } // ----------------------------------------------------------------------------- bool GetKeywordAndValue(linereader& lr, char* line, char** keyword, char** value) { // the linereader class handles all line endings (CR, CR+LF, LF) // and terminates line buffer with \0 while ( lr.fgets(line, PREF_LINE_SIZE) != 0 ) { if ( line[0] == '#' || line[0] == 0 ) { // skip comment line or empty line } else { // line should have format keyword=value *keyword = line; *value = line; while ( **value != '=' && **value != 0 ) *value += 1; **value = 0; // terminate keyword *value += 1; return true; } } return false; } // ----------------------------------------------------------------------------- void CheckVisibility(int* x, int* y, int* wd, int* ht) { wxRect maxrect = wxGetClientDisplayRect(); // reset x,y if title bar isn't clearly visible if ( *y + 10 < maxrect.y || *y + 10 > maxrect.GetBottom() || *x + 10 > maxrect.GetRight() || *x + *wd - 10 < maxrect.x ) { *x = wxDefaultCoord; *y = wxDefaultCoord; } // reduce wd,ht if too big for screen if (*wd > maxrect.width) *wd = maxrect.width; if (*ht > maxrect.height) *ht = maxrect.height; } // ----------------------------------------------------------------------------- char* ReplaceDeprecatedAlgo(char* algoname) { if (strcmp(algoname, "RuleTable") == 0 || strcmp(algoname, "RuleTree") == 0) { // RuleTable and RuleTree algos have been replaced by RuleLoader return (char*)"RuleLoader"; } else { return algoname; } } // ----------------------------------------------------------------------------- void InitPaths() { #ifdef __WXGTK__ // on Linux we want datadir to be "~/.golly" rather than "~/.Golly" wxGetApp().SetAppName(_("golly")); #endif // init datadir and create the directory if it doesn't exist; // the directory will probably be: // Win: C:\Documents and Settings\username\Application Data\Golly // Mac: ~/Library/Application Support/Golly // Unix: ~/.golly datadir = wxStandardPaths::Get().GetUserDataDir(); if ( !wxFileName::DirExists(datadir) ) { if ( !wxFileName::Mkdir(datadir, 0777, wxPATH_MKDIR_FULL) ) { Warning(_("Could not create a user-specific data directory!\nWill try to use the application directory instead.")); datadir = gollydir; } } if (datadir.Last() != wxFILE_SEP_PATH) datadir += wxFILE_SEP_PATH; // init tempdir to a temporary directory unique to this process tempdir = wxFileName::CreateTempFileName(wxT("golly_")); // on Linux the file is in /tmp; // on my Mac the file is in /private/var/tmp/folders.502/TemporaryItems; // on WinXP the file is in C:\Documents and Settings\Andy\Local Settings\Temp // (or shorter equivalent C:\DOCUME~1\Andy\LOCALS~1\Temp) but the file name // is gol*.tmp (ie. only 1st 3 chars of the prefix are used, and .tmp is added) wxRemoveFile(tempdir); if ( !wxFileName::Mkdir(tempdir, 0777, wxPATH_MKDIR_FULL) ) { Warning(_("Could not create temporary directory:\n") + tempdir); // use standard directory for temp files tempdir = wxStandardPaths::Get().GetTempDir(); if ( !wxFileName::DirExists(tempdir) ) { // should never happen, but play safe Fatal(_("Sorry, temporary directory does not exist:\n") + tempdir); } } if (tempdir.Last() != wxFILE_SEP_PATH) tempdir += wxFILE_SEP_PATH; #ifdef __WXGTK__ // "Golly" is nicer for warning dialogs etc wxGetApp().SetAppName(_("Golly")); #endif // init prefspath -- look in gollydir first, then in datadir prefspath = gollydir + PREFS_NAME; if ( !wxFileExists(prefspath) ) { prefspath = datadir + PREFS_NAME; } } // ----------------------------------------------------------------------------- void CreateMissingFolders() { // create userrules and downloaddir if they don't exist if ( !wxFileName::DirExists(userrules) ) { if ( !wxFileName::Mkdir(userrules, 0777, wxPATH_MKDIR_FULL) ) { Warning(_("Could not create your rules directory:\n") + userrules); } } if ( !wxFileName::DirExists(downloaddir) ) { if ( !wxFileName::Mkdir(downloaddir, 0777, wxPATH_MKDIR_FULL) ) { Warning(_("Could not create your download directory:\n") + downloaddir); } } } // ----------------------------------------------------------------------------- void GetPrefs() { int algoindex = -1; // unknown algorithm bool sawkeyaction = false; // saw at least one key_action entry? MAX_MAG = 5; // maximum cell size = 32x32 InitPaths(); // init datadir, tempdir and prefspath InitAlgorithms(); // init algoinfo data rulesdir = gollydir + wxT("Rules"); rulesdir += wxFILE_SEP_PATH; userrules = datadir + wxT("Rules"); userrules += wxFILE_SEP_PATH; downloaddir = datadir + wxT("Downloads"); downloaddir += wxFILE_SEP_PATH; opensavedir = gollydir + PATT_DIR; rundir = gollydir + SCRIPT_DIR; icondir = gollydir; choosedir = gollydir; patterndir = gollydir + PATT_DIR; scriptdir = gollydir + SCRIPT_DIR; // init the text editor to something reasonable #ifdef __WXMSW__ texteditor = wxT("Notepad"); #elif defined(__WXMAC__) texteditor = wxT("/Applications/TextEdit.app"); #else // assume Linux // don't attempt to guess which editor might be available; // set the string empty so the user is asked to choose their // preferred editor the first time texteditor is used texteditor = wxEmptyString; #endif // init names of Perl and Python libraries #ifdef __WXMSW__ perllib = wxT("perl510.dll"); pythonlib = wxT("python27.dll"); #elif defined(__WXMAC__) // not used (Perl & Python are loaded at link time) perllib = wxEmptyString; pythonlib = wxEmptyString; #else // assume Linux perllib = wxT(STRINGIFY(PERL_SHLIB)); pythonlib = wxT(STRINGIFY(PYTHON_SHLIB)); #endif // create curs_* and initialize newcurs and opencurs CreateCursors(); CreateDefaultColors(); // initialize Open Recent submenu patternSubMenu = new wxMenu(); patternSubMenu->AppendSeparator(); patternSubMenu->Append(ID_CLEAR_MISSING_PATTERNS, _("Clear Missing Files")); patternSubMenu->Append(ID_CLEAR_ALL_PATTERNS, _("Clear All Files")); // initialize Run Recent submenu scriptSubMenu = new wxMenu(); scriptSubMenu->AppendSeparator(); scriptSubMenu->Append(ID_CLEAR_MISSING_SCRIPTS, _("Clear Missing Files")); scriptSubMenu->Append(ID_CLEAR_ALL_SCRIPTS, _("Clear All Files")); namedrules.Add(wxT("Life|B3/S23")); // must be 1st entry if ( !wxFileExists(prefspath) ) { AddDefaultRules(); AddDefaultKeyActions(); UpdateAcceleratorStrings(); CreateMissingFolders(); return; } FILE* f = fopen((const char*)prefspath.mb_str(wxConvLocal), "r"); if (f == NULL) { Warning(_("Could not read preferences file!")); return; } linereader reader(f); char line[PREF_LINE_SIZE]; char* keyword; char* value; while ( GetKeywordAndValue(reader, line, &keyword, &value) ) { if (strcmp(keyword, "prefs_version") == 0) { sscanf(value, "%d", &currversion); } else if (strcmp(keyword, "debug_level") == 0) { sscanf(value, "%d", &debuglevel); } else if (strcmp(keyword, "key_action") == 0) { GetKeyAction(value); sawkeyaction = true; } else if (strcmp(keyword, "main_window") == 0) { sscanf(value, "%d,%d,%d,%d", &mainx, &mainy, &mainwd, &mainht); // avoid very small window if (mainwd < minmainwd) mainwd = minmainwd; if (mainht < minmainht) mainht = minmainht; CheckVisibility(&mainx, &mainy, &mainwd, &mainht); } else if (strcmp(keyword, "maximize") == 0) { maximize = value[0] == '1'; } else if (strcmp(keyword, "help_window") == 0) { sscanf(value, "%d,%d,%d,%d", &helpx, &helpy, &helpwd, &helpht); if (helpwd < minhelpwd) helpwd = minhelpwd; if (helpht < minhelpht) helpht = minhelpht; CheckVisibility(&helpx, &helpy, &helpwd, &helpht); } else if (strcmp(keyword, "help_font_size") == 0) { sscanf(value, "%d", &helpfontsize); if (helpfontsize < minfontsize) helpfontsize = minfontsize; if (helpfontsize > maxfontsize) helpfontsize = maxfontsize; } else if (strcmp(keyword, "info_window") == 0) { sscanf(value, "%d,%d,%d,%d", &infox, &infoy, &infowd, &infoht); if (infowd < mininfowd) infowd = mininfowd; if (infoht < mininfoht) infoht = mininfoht; CheckVisibility(&infox, &infoy, &infowd, &infoht); } else if (strcmp(keyword, "rule_dialog") == 0) { sscanf(value, "%d,%d,%d,%d", &rulex, &ruley, &ruleexwd, &ruleexht); if (ruleexwd < 100) ruleexwd = 100; if (ruleexht < 0) ruleexht = 0; CheckVisibility(&rulex, &ruley, &ruleexwd, &ruleexht); } else if (strcmp(keyword, "show_algo_help") == 0) { showalgohelp = value[0] == '1'; } else if (strcmp(keyword, "allow_undo") == 0) { allowundo = value[0] == '1'; } else if (strcmp(keyword, "allow_beep") == 0) { allowbeep = value[0] == '1'; } else if (strcmp(keyword, "restore_view") == 0) { restoreview = value[0] == '1'; } else if (strcmp(keyword, "paste_location") == 0) { SetPasteLocation(value); } else if (strcmp(keyword, "paste_mode") == 0) { SetPasteMode(value); } else if (strcmp(keyword, "scroll_pencil") == 0) { scrollpencil = value[0] == '1'; } else if (strcmp(keyword, "scroll_cross") == 0) { scrollcross = value[0] == '1'; } else if (strcmp(keyword, "scroll_hand") == 0) { scrollhand = value[0] == '1'; } else if (strcmp(keyword, "controls_pos") == 0) { sscanf(value, "%d", &controlspos); if (controlspos < 0) controlspos = 0; if (controlspos > 4) controlspos = 4; } else if (strcmp(keyword, "can_change_rule") == 0) { sscanf(value, "%d", &canchangerule); if (canchangerule < 0) canchangerule = 0; if (canchangerule > 2) canchangerule = 2; } else if (strcmp(keyword, "random_fill") == 0) { sscanf(value, "%d", &randomfill); if (randomfill < 1) randomfill = 1; if (randomfill > 100) randomfill = 100; } else if (strcmp(keyword, "q_base_step") == 0) { // deprecated int base; sscanf(value, "%d", &base); if (base < 2) base = 2; if (base > MAX_BASESTEP) base = MAX_BASESTEP; algoinfo[QLIFE_ALGO]->defbase = base; } else if (strcmp(keyword, "h_base_step") == 0) { // deprecated int base; sscanf(value, "%d", &base); if (base < 2) base = 2; if (base > MAX_BASESTEP) base = MAX_BASESTEP; algoinfo[HLIFE_ALGO]->defbase = base; } else if (strcmp(keyword, "algorithm") == 0) { if (strcmp(value, "RuleTable") == 0) { // use deprecated RuleTable settings for RuleLoader // (deprecated RuleTree settings will simply be ignored) value = (char*)"RuleLoader"; } algoindex = -1; for (int i = 0; i < NumAlgos(); i++) { if (strcmp(value, GetAlgoName(i)) == 0) { algoindex = i; break; } } } else if (strcmp(keyword, "max_mem") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) { int maxmem; sscanf(value, "%d", &maxmem); if (maxmem < MIN_MEM_MB) maxmem = MIN_MEM_MB; if (maxmem > MAX_MEM_MB) maxmem = MAX_MEM_MB; algoinfo[algoindex]->algomem = maxmem; } } else if (strcmp(keyword, "base_step") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) { int base; sscanf(value, "%d", &base); if (base < 2) base = 2; if (base > MAX_BASESTEP) base = MAX_BASESTEP; algoinfo[algoindex]->defbase = base; } } else if (strcmp(keyword, "status_rgb") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) GetColor(value, &algoinfo[algoindex]->statusrgb); } else if (strcmp(keyword, "from_rgb") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) GetColor(value, &algoinfo[algoindex]->fromrgb); } else if (strcmp(keyword, "to_rgb") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) GetColor(value, &algoinfo[algoindex]->torgb); } else if (strcmp(keyword, "use_gradient") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) algoinfo[algoindex]->gradient = value[0] == '1'; } else if (strcmp(keyword, "colors") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) { int state, r, g, b; while (sscanf(value, "%d,%d,%d,%d,", &state, &r, &g, &b) == 4) { if (state >= 0 && state < algoinfo[algoindex]->maxstates) { algoinfo[algoindex]->algor[state] = r; algoinfo[algoindex]->algog[state] = g; algoinfo[algoindex]->algob[state] = b; } while (*value != ',') value++; value++; while (*value != ',') value++; value++; while (*value != ',') value++; value++; while (*value != ',') value++; value++; } } } else if (strcmp(keyword, "min_delay") == 0) { sscanf(value, "%d", &mindelay); if (mindelay < 0) mindelay = 0; if (mindelay > MAX_DELAY) mindelay = MAX_DELAY; } else if (strcmp(keyword, "max_delay") == 0) { sscanf(value, "%d", &maxdelay); if (maxdelay < 0) maxdelay = 0; if (maxdelay > MAX_DELAY) maxdelay = MAX_DELAY; } else if (strcmp(keyword, "auto_fit") == 0) { initautofit = value[0] == '1'; } else if (strcmp(keyword, "hashing") == 0) { // deprecated initalgo = value[0] == '1' ? HLIFE_ALGO : QLIFE_ALGO; } else if (strcmp(keyword, "init_algo") == 0) { value = ReplaceDeprecatedAlgo(value); int i = staticAlgoInfo::nameToIndex(value); if (i >= 0 && i < NumAlgos()) initalgo = i; } else if (strcmp(keyword, "hyperspeed") == 0) { inithyperspeed = value[0] == '1'; } else if (strcmp(keyword, "hash_info") == 0) { initshowhashinfo = value[0] == '1'; } else if (strcmp(keyword, "max_hash_mem") == 0) { // deprecated int maxmem; sscanf(value, "%d", &maxmem); if (maxmem < MIN_MEM_MB) maxmem = MIN_MEM_MB; if (maxmem > MAX_MEM_MB) maxmem = MAX_MEM_MB; // change all except QLIFE_ALGO for (int i = 0; i < NumAlgos(); i++) if (i != QLIFE_ALGO) algoinfo[i]->algomem = maxmem; } else if (strcmp(keyword, "rule") == 0) { strncpy(initrule, value, sizeof(initrule)); } else if (strcmp(keyword, "named_rule") == 0) { // value must have format "name|rule" with name and rule non-empty wxString str(value,wxConvLocal); int barcount = str.Freq('|'); if (barcount == 0) { Fatal(_("Missing \"|\" separator in named_rule entry: ") + str); } else if (barcount > 1) { Fatal(_("Too many \"|\" separators in named_rule entry: ") + str); } else { wxString name = str.BeforeFirst('|'); wxString rule = str.AfterFirst('|'); if (name.IsEmpty()) { Fatal(_("Empty name in named_rule entry: ") + str); } else if (rule.IsEmpty()) { Fatal(_("Empty rule in named_rule entry: ") + str); } else { namedrules.Add(str); } } } else if (strcmp(keyword, "show_tips") == 0) { showtips = value[0] == '1'; } else if (strcmp(keyword, "show_tool") == 0) { showtool = value[0] == '1'; } else if (strcmp(keyword, "show_layer") == 0) { showlayer = value[0] == '1'; } else if (strcmp(keyword, "show_edit") == 0) { showedit = value[0] == '1'; } else if (strcmp(keyword, "show_states") == 0) { showallstates = value[0] == '1'; } else if (strcmp(keyword, "show_status") == 0) { showstatus = value[0] == '1'; } else if (strcmp(keyword, "show_exact") == 0) { showexact = value[0] == '1'; } else if (strcmp(keyword, "show_timeline") == 0) { showtimeline = value[0] == '1'; } else if (strcmp(keyword, "grid_lines") == 0) { showgridlines = value[0] == '1'; } else if (strcmp(keyword, "min_grid_mag") == 0) { sscanf(value, "%d", &mingridmag); if (mingridmag < 2) mingridmag = 2; if (mingridmag > MAX_MAG) mingridmag = MAX_MAG; } else if (strcmp(keyword, "bold_spacing") == 0) { sscanf(value, "%d", &boldspacing); if (boldspacing < 2) boldspacing = 2; if (boldspacing > MAX_SPACING) boldspacing = MAX_SPACING; } else if (strcmp(keyword, "show_bold_lines") == 0) { showboldlines = value[0] == '1'; } else if (strcmp(keyword, "math_coords") == 0) { mathcoords = value[0] == '1'; } else if (strcmp(keyword, "sync_views") == 0) { syncviews = value[0] == '1'; } else if (strcmp(keyword, "sync_cursors") == 0) { synccursors = value[0] == '1'; } else if (strcmp(keyword, "stack_layers") == 0) { stacklayers = value[0] == '1'; } else if (strcmp(keyword, "tile_layers") == 0) { tilelayers = value[0] == '1'; } else if (strcmp(keyword, "tile_border") == 0) { sscanf(value, "%d", &tileborder); if (tileborder < 1) tileborder = 1; if (tileborder > 10) tileborder = 10; } else if (strcmp(keyword, "ask_on_new") == 0) { askonnew = value[0] == '1'; } else if (strcmp(keyword, "ask_on_load") == 0) { askonload = value[0] == '1'; } else if (strcmp(keyword, "ask_on_delete") == 0) { askondelete = value[0] == '1'; } else if (strcmp(keyword, "ask_on_quit") == 0) { askonquit = value[0] == '1'; } else if (strcmp(keyword, "show_icons") == 0) { showicons = value[0] == '1'; } else if (strcmp(keyword, "swap_colors") == 0) { swapcolors = value[0] == '1'; } else if (strcmp(keyword, "opacity") == 0) { sscanf(value, "%d", &opacity); if (opacity < 1) opacity = 1; if (opacity > 100) opacity = 100; } else if (strcmp(keyword, "border_rgb") == 0) { GetColor(value, borderrgb); } else if (strcmp(keyword, "select_rgb") == 0) { GetColor(value, selectrgb); } else if (strcmp(keyword, "paste_rgb") == 0) { GetColor(value, pastergb); } else if (strcmp(keyword, "dead_rgb") == 0) { // use deprecated value to set color of state 0 in all algos // (only done once because dead_rgb is no longer saved in prefs file) wxColor color; GetColor(value, &color); for (int i = 0; i < NumAlgos(); i++) { algoinfo[i]->algor[0] = color.Red(); algoinfo[i]->algog[0] = color.Green(); algoinfo[i]->algob[0] = color.Blue(); } } else if (strcmp(keyword, "qlife_rgb") == 0) { // deprecated GetColor(value, &algoinfo[QLIFE_ALGO]->statusrgb); } else if (strcmp(keyword, "hlife_rgb") == 0) { // deprecated GetColor(value, &algoinfo[HLIFE_ALGO]->statusrgb); } else if (strcmp(keyword, "buffered") == 0) { buffered = value[0] == '1'; } else if (strcmp(keyword, "mouse_wheel_mode") == 0) { sscanf(value, "%d", &mousewheelmode); if (mousewheelmode < 0) mousewheelmode = 0; if (mousewheelmode > 2) mousewheelmode = 2; } else if (strcmp(keyword, "thumb_range") == 0) { sscanf(value, "%d", &thumbrange); if (thumbrange < 2) thumbrange = 2; if (thumbrange > MAX_THUMBRANGE) thumbrange = MAX_THUMBRANGE; } else if (strcmp(keyword, "new_mag") == 0) { sscanf(value, "%d", &newmag); if (newmag < 0) newmag = 0; if (newmag > MAX_MAG) newmag = MAX_MAG; } else if (strcmp(keyword, "new_remove_sel") == 0) { newremovesel = value[0] == '1'; } else if (strcmp(keyword, "new_cursor") == 0) { newcurs = StringToCursor(value); } else if (strcmp(keyword, "open_remove_sel") == 0) { openremovesel = value[0] == '1'; } else if (strcmp(keyword, "open_cursor") == 0) { opencurs = StringToCursor(value); } else if (strcmp(keyword, "save_xrle") == 0) { savexrle = value[0] == '1'; } else if (strcmp(keyword, "open_save_dir") == 0) { GetRelPath(value, opensavedir, PATT_DIR); } else if (strcmp(keyword, "run_dir") == 0) { GetRelPath(value, rundir, SCRIPT_DIR); } else if (strcmp(keyword, "icon_dir") == 0) { GetRelPath(value, icondir); } else if (strcmp(keyword, "choose_dir") == 0) { GetRelPath(value, choosedir); } else if (strcmp(keyword, "pattern_dir") == 0) { GetRelPath(value, patterndir, PATT_DIR); } else if (strcmp(keyword, "script_dir") == 0) { GetRelPath(value, scriptdir, SCRIPT_DIR); } else if (strcmp(keyword, "user_rules") == 0) { GetRelPath(value, userrules); } else if (strcmp(keyword, "download_dir") == 0) { GetRelPath(value, downloaddir); } else if (strcmp(keyword, "text_editor") == 0) { texteditor = wxString(value,wxConvLocal); } else if (strcmp(keyword, "perl_lib") == 0) { perllib = wxString(value,wxConvLocal); } else if (strcmp(keyword, "python_lib") == 0) { pythonlib = wxString(value,wxConvLocal); } else if (strcmp(keyword, "dir_width") == 0) { sscanf(value, "%d", &dirwinwd); if (dirwinwd < MIN_DIRWD) dirwinwd = MIN_DIRWD; } else if (strcmp(keyword, "show_patterns") == 0) { showpatterns = value[0] == '1'; } else if (strcmp(keyword, "show_scripts") == 0) { showscripts = value[0] == '1'; } else if (strcmp(keyword, "max_patterns") == 0) { sscanf(value, "%d", &maxpatterns); if (maxpatterns < 1) maxpatterns = 1; if (maxpatterns > MAX_RECENT) maxpatterns = MAX_RECENT; } else if (strcmp(keyword, "max_scripts") == 0) { sscanf(value, "%d", &maxscripts); if (maxscripts < 1) maxscripts = 1; if (maxscripts > MAX_RECENT) maxscripts = MAX_RECENT; } else if (strcmp(keyword, "recent_pattern") == 0) { // append path to Open Recent submenu if (numpatterns < maxpatterns && value[0]) { numpatterns++; wxString path(value, wxConvLocal); if (currversion < 2 && path.StartsWith(gollydir)) { // remove gollydir from start of path path.erase(0, gollydir.length()); } // duplicate ampersands so they appear in menu path.Replace(wxT("&"), wxT("&&")); patternSubMenu->Insert(numpatterns - 1, ID_OPEN_RECENT + numpatterns, path); } } else if (strcmp(keyword, "recent_script") == 0) { // append path to Run Recent submenu if (numscripts < maxscripts && value[0]) { numscripts++; wxString path(value, wxConvLocal); if (currversion < 2 && path.StartsWith(gollydir)) { // remove gollydir from start of path path.erase(0, gollydir.length()); } // duplicate ampersands so they appear in menu path.Replace(wxT("&"), wxT("&&")); scriptSubMenu->Insert(numscripts - 1, ID_RUN_RECENT + numscripts, path); } } } reader.close(); // colors for brushes and pens may have changed SetBrushesAndPens(); // showpatterns and showscripts must not both be true if (showpatterns && showscripts) showscripts = false; // stacklayers and tilelayers must not both be true if (stacklayers && tilelayers) tilelayers = false; // if no named_rule entries then add default names if (namedrules.GetCount() == 1) AddDefaultRules(); // if no key_action entries then use default shortcuts if (!sawkeyaction) AddDefaultKeyActions(); // initialize accelerator array UpdateAcceleratorStrings(); // create some important directories if they don't exist CreateMissingFolders(); } // ----------------------------------------------------------------------------- // global data used in CellBoxes and PrefsDialog methods: static int coloralgo; // currently selected algorithm in Color pane static int gradstates; // current number of gradient states const int CELLSIZE = 16; // wd and ht of each cell in CellBoxes const int NUMCOLS = 32; // number of columns in CellBoxes const int NUMROWS = 8; // number of rows in CellBoxes // ----------------------------------------------------------------------------- // define a window for displaying cell colors/icons: class CellBoxes : public wxPanel { public: CellBoxes(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size) : wxPanel(parent, id, pos, size) { } wxStaticText* statebox; // for showing state of cell under cursor wxStaticText* rgbbox; // for showing color of cell under cursor private: void GetGradientColor(int state, unsigned char* r, unsigned char* g, unsigned char* b); void OnEraseBackground(wxEraseEvent& event); void OnPaint(wxPaintEvent& event); void OnMouseDown(wxMouseEvent& event); void OnMouseMotion(wxMouseEvent& event); void OnMouseExit(wxMouseEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(CellBoxes, wxPanel) EVT_ERASE_BACKGROUND (CellBoxes::OnEraseBackground) EVT_PAINT (CellBoxes::OnPaint) EVT_LEFT_DOWN (CellBoxes::OnMouseDown) EVT_LEFT_DCLICK (CellBoxes::OnMouseDown) EVT_MOTION (CellBoxes::OnMouseMotion) EVT_ENTER_WINDOW (CellBoxes::OnMouseMotion) EVT_LEAVE_WINDOW (CellBoxes::OnMouseExit) END_EVENT_TABLE() // ----------------------------------------------------------------------------- void CellBoxes::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) { // do nothing } // ----------------------------------------------------------------------------- void CellBoxes::GetGradientColor(int state, unsigned char* r, unsigned char* g, unsigned char* b) { // calculate gradient color for given state (> 0 and < gradstates) AlgoData* ad = algoinfo[coloralgo]; if (state == 1) { *r = ad->fromrgb.Red(); *g = ad->fromrgb.Green(); *b = ad->fromrgb.Blue(); } else if (state == gradstates - 1) { *r = ad->torgb.Red(); *g = ad->torgb.Green(); *b = ad->torgb.Blue(); } else { unsigned char r1 = ad->fromrgb.Red(); unsigned char g1 = ad->fromrgb.Green(); unsigned char b1 = ad->fromrgb.Blue(); unsigned char r2 = ad->torgb.Red(); unsigned char g2 = ad->torgb.Green(); unsigned char b2 = ad->torgb.Blue(); int N = gradstates - 2; double rfrac = (double)(r2 - r1) / (double)N; double gfrac = (double)(g2 - g1) / (double)N; double bfrac = (double)(b2 - b1) / (double)N; *r = (int)(r1 + (state-1) * rfrac + 0.5); *g = (int)(g1 + (state-1) * gfrac + 0.5); *b = (int)(b1 + (state-1) * bfrac + 0.5); } } // ----------------------------------------------------------------------------- void CellBoxes::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); dc.SetPen(*wxBLACK_PEN); #ifdef __WXMSW__ // we have to use theme background color on Windows wxBrush bgbrush(GetBackgroundColour()); #else wxBrush bgbrush(*wxTRANSPARENT_BRUSH); #endif // draw cell boxes wxRect r = wxRect(0, 0, CELLSIZE+1, CELLSIZE+1); int col = 0; for (int state = 0; state < 256; state++) { if (state < algoinfo[coloralgo]->maxstates) { if (state == 0) { wxColor color(algoinfo[coloralgo]->algor[0], algoinfo[coloralgo]->algog[0], algoinfo[coloralgo]->algob[0]); dc.SetBrush(wxBrush(color)); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } else if (showicons) { wxBitmap** iconmaps = algoinfo[coloralgo]->icons15x15; if (iconmaps && iconmaps[state]) { dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); if (algoinfo[coloralgo]->gradient) { if (state > 0 && state < gradstates) { unsigned char red, green, blue; GetGradientColor(state, &red, &green, &blue); DrawOneIcon(dc, r.x + 1, r.y + 1, iconmaps[state], algoinfo[coloralgo]->algor[0], algoinfo[coloralgo]->algog[0], algoinfo[coloralgo]->algob[0], red, green, blue, false); // default icons are grayscale } else { dc.SetBrush(bgbrush); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } } else { DrawOneIcon(dc, r.x + 1, r.y + 1, iconmaps[state], algoinfo[coloralgo]->algor[0], algoinfo[coloralgo]->algog[0], algoinfo[coloralgo]->algob[0], algoinfo[coloralgo]->algor[state], algoinfo[coloralgo]->algog[state], algoinfo[coloralgo]->algob[state], false); // default icons are grayscale } } else { dc.SetBrush(bgbrush); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } } else if (algoinfo[coloralgo]->gradient) { if (state > 0 && state < gradstates) { unsigned char red, green, blue; GetGradientColor(state, &red, &green, &blue); wxColor color(red, green, blue); dc.SetBrush(wxBrush(color)); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } else { dc.SetBrush(bgbrush); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } } else { wxColor color(algoinfo[coloralgo]->algor[state], algoinfo[coloralgo]->algog[state], algoinfo[coloralgo]->algob[state]); dc.SetBrush(wxBrush(color)); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } } else { // state >= maxstates dc.SetBrush(bgbrush); dc.DrawRectangle(r); dc.SetBrush(wxNullBrush); } col++; if (col < NUMCOLS) { r.x += CELLSIZE; } else { r.x = 0; r.y += CELLSIZE; col = 0; } } dc.SetPen(wxNullPen); } // ----------------------------------------------------------------------------- void CellBoxes::OnMouseDown(wxMouseEvent& event) { int col = event.GetX() / CELLSIZE; int row = event.GetY() / CELLSIZE; int state = row * NUMCOLS + col; if (state >= 0 && state < algoinfo[coloralgo]->maxstates) { if (algoinfo[coloralgo]->gradient && state > 0) { Beep(); } else { // let user change color of this cell state wxColour rgb(algoinfo[coloralgo]->algor[state], algoinfo[coloralgo]->algog[state], algoinfo[coloralgo]->algob[state]); wxColourData data; data.SetChooseFull(true); // for Windows data.SetColour(rgb); wxColourDialog dialog(this, &data); if ( dialog.ShowModal() == wxID_OK ) { wxColourData retData = dialog.GetColourData(); wxColour c = retData.GetColour(); if (rgb != c) { // change color algoinfo[coloralgo]->algor[state] = c.Red(); algoinfo[coloralgo]->algog[state] = c.Green(); algoinfo[coloralgo]->algob[state] = c.Blue(); Refresh(false); } } } } event.Skip(); } // ----------------------------------------------------------------------------- void CellBoxes::OnMouseMotion(wxMouseEvent& event) { int col = event.GetX() / CELLSIZE; int row = event.GetY() / CELLSIZE; int state = row * NUMCOLS + col; if (state < 0 || state > 255) { statebox->SetLabel(_(" ")); rgbbox->SetLabel(_(" ")); } else { statebox->SetLabel(wxString::Format(_("%d"),state)); if (state < algoinfo[coloralgo]->maxstates) { unsigned char r, g, b; if (algoinfo[coloralgo]->gradient && state > 0) { GetGradientColor(state, &r, &g, &b); } else { r = algoinfo[coloralgo]->algor[state]; g = algoinfo[coloralgo]->algog[state]; b = algoinfo[coloralgo]->algob[state]; } rgbbox->SetLabel(wxString::Format(_("%d,%d,%d"),r,g,b)); } else { rgbbox->SetLabel(_(" ")); } } } // ----------------------------------------------------------------------------- void CellBoxes::OnMouseExit(wxMouseEvent& WXUNUSED(event)) { statebox->SetLabel(_(" ")); rgbbox->SetLabel(_(" ")); } // ----------------------------------------------------------------------------- #if defined(__WXMAC__) && wxCHECK_VERSION(2,7,2) // fix wxMac 2.7.2+ bug in wxTextCtrl::SetSelection #define ALL_TEXT 0,999 #else #define ALL_TEXT -1,-1 #endif #if defined(__WXMAC__) && wxCHECK_VERSION(2,8,0) && !wxCHECK_VERSION(2,9,0) // fix wxALIGN_CENTER_VERTICAL bug in wxMac 2.8.x; // eg. when a wxStaticText box is next to a wxChoice box #define FIX_ALIGN_BUG wxBOTTOM,4 #else #define FIX_ALIGN_BUG wxALL,0 #endif #ifdef __WXMSW__ // Vista needs more RAM for itself const wxString HASH_MEM_NOTE = _("MB (best if ~70% of RAM)"); #else const wxString HASH_MEM_NOTE = _("MB (best if ~80% of RAM)"); #endif const wxString HASH_STEP_NOTE = _("(best if power of 2)"); const wxString NONHASH_MEM_NOTE = _("MB (0 means no limit)"); const wxString NONHASH_STEP_NOTE = _(" "); const int BITMAP_WD = 60; // width of bitmap in color buttons const int BITMAP_HT = 20; // height of bitmap in color buttons const int PAGESIZE = 10; // scroll amount when paging static size_t currpage = 0; // current page in PrefsDialog // these are global so we can remember current key combination static int currkey = ' '; static int currmods = mk_ALT + mk_SHIFT + mk_CMD; // ----------------------------------------------------------------------------- enum { // these *_PAGE values must correspond to currpage values FILE_PAGE = 0, EDIT_PAGE, CONTROL_PAGE, VIEW_PAGE, LAYER_PAGE, COLOR_PAGE, KEYBOARD_PAGE }; enum { // File prefs PREF_NEW_REM_SEL = wxID_HIGHEST + 1, // avoid problems with FindWindowById PREF_NEW_CURSOR, PREF_NEW_SCALE, PREF_OPEN_REM_SEL, PREF_OPEN_CURSOR, PREF_MAX_PATTERNS, PREF_MAX_SCRIPTS, PREF_EDITOR_BUTT, PREF_EDITOR_BOX, PREF_DOWNLOAD_BUTT, PREF_DOWNLOAD_BOX, // Edit prefs PREF_RANDOM_FILL, PREF_PASTE_0, PREF_PASTE_1, PREF_PASTE_2, PREF_SCROLL_PENCIL, PREF_SCROLL_CROSS, PREF_SCROLL_HAND, PREF_BEEP, // Control prefs PREF_ALGO_MENU1, PREF_MAX_MEM, PREF_MEM_NOTE, PREF_BASE_STEP, PREF_STEP_NOTE, PREF_MIN_DELAY, PREF_MAX_DELAY, PREF_RULES_BUTT, PREF_RULES_BOX, // View prefs PREF_SHOW_TIPS, PREF_RESTORE, PREF_Y_UP, PREF_SHOW_BOLD, PREF_BOLD_SPACING, PREF_MIN_GRID_SCALE, PREF_MOUSE_WHEEL, PREF_THUMB_RANGE, PREF_NO_CONTROLS, PREF_TL_CONTROLS, PREF_TR_CONTROLS, PREF_BR_CONTROLS, PREF_BL_CONTROLS, // Layer prefs PREF_OPACITY, PREF_TILE_BORDER, PREF_ASK_NEW, PREF_ASK_LOAD, PREF_ASK_DELETE, PREF_ASK_QUIT, // Color prefs PREF_ALGO_MENU2, PREF_GRADIENT_CHECK, PREF_ICON_CHECK, PREF_CELL_PANEL, PREF_SCROLL_BAR, PREF_STATE_BOX, PREF_RGB_BOX, PREF_STATUS_BUTT, PREF_FROM_BUTT, PREF_TO_BUTT, PREF_SELECT_BUTT, PREF_PASTE_BUTT, PREF_BORDER_BUTT, // Keyboard prefs PREF_KEYCOMBO, PREF_ACTION, PREF_CHOOSE, PREF_FILE_BOX }; // define a multi-page dialog for changing various preferences class PrefsDialog : public wxPropertySheetDialog { public: PrefsDialog(wxWindow* parent, const wxString& page); ~PrefsDialog() { delete onetimer; } wxPanel* CreateFilePrefs(wxWindow* parent); wxPanel* CreateEditPrefs(wxWindow* parent); wxPanel* CreateControlPrefs(wxWindow* parent); wxPanel* CreateViewPrefs(wxWindow* parent); wxPanel* CreateLayerPrefs(wxWindow* parent); wxPanel* CreateColorPrefs(wxWindow* parent); wxPanel* CreateKeyboardPrefs(wxWindow* parent); virtual bool TransferDataFromWindow(); // called when user hits OK #ifdef __WXMAC__ void OnSpinCtrlChar(wxKeyEvent& event); #endif static void UpdateChosenFile(); private: bool GetCheckVal(long id); int GetChoiceVal(long id); int GetSpinVal(long id); int GetRadioVal(long firstid, int numbuttons); bool BadSpinVal(int id, int minval, int maxval, const wxString& prefix); bool ValidatePage(); wxBitmapButton* AddColorButton(wxWindow* parent, wxBoxSizer* hbox, int id, wxColor* rgb, const wxString& text); void ChangeButtonColor(int id, wxColor& rgb); void UpdateButtonColor(int id, wxColor& rgb); void UpdateScrollBar(); void OnCheckBoxClicked(wxCommandEvent& event); void OnColorButton(wxCommandEvent& event); void OnPageChanging(wxNotebookEvent& event); void OnPageChanged(wxNotebookEvent& event); void OnChoice(wxCommandEvent& event); void OnButton(wxCommandEvent& event); void OnScroll(wxScrollEvent& event); void OnOneTimer(wxTimerEvent& event); bool ignore_page_event; // used to prevent currpage being changed int algopos1; // selected algorithm in PREF_ALGO_MENU1 int new_algomem[MAX_ALGOS]; // new max mem values for each algorithm int new_defbase[MAX_ALGOS]; // new default base step values for each algorithm CellBoxes* cellboxes; // for displaying cell colors/icons wxCheckBox* gradcheck; // use gradient? wxCheckBox* iconcheck; // show icons? wxBitmapButton* frombutt; // button to set gradient's start color wxBitmapButton* tobutt; // button to set gradient's end color wxScrollBar* scrollbar; // for changing number of gradient states wxString neweditor; // new text editor wxString newdownloaddir; // new directory for downloaded files wxString newuserrules; // new directory for user's rules wxTimer* onetimer; // one shot timer (see OnOneTimer) DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(PrefsDialog, wxPropertySheetDialog) EVT_CHECKBOX (wxID_ANY, PrefsDialog::OnCheckBoxClicked) EVT_BUTTON (wxID_ANY, PrefsDialog::OnColorButton) EVT_NOTEBOOK_PAGE_CHANGING (wxID_ANY, PrefsDialog::OnPageChanging) EVT_NOTEBOOK_PAGE_CHANGED (wxID_ANY, PrefsDialog::OnPageChanged) EVT_CHOICE (wxID_ANY, PrefsDialog::OnChoice) EVT_BUTTON (wxID_ANY, PrefsDialog::OnButton) EVT_COMMAND_SCROLL (PREF_SCROLL_BAR, PrefsDialog::OnScroll) EVT_TIMER (wxID_ANY, PrefsDialog::OnOneTimer) END_EVENT_TABLE() // ----------------------------------------------------------------------------- // define a text control for showing current key combination class KeyComboCtrl : public wxTextCtrl { public: KeyComboCtrl(wxWindow* parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, int style = 0) : wxTextCtrl(parent, id, value, pos, size, style) {} ~KeyComboCtrl() {} // handlers to intercept keyboard events void OnKeyDown(wxKeyEvent& event); void OnChar(wxKeyEvent& event); private: int realkey; // key code set by OnKeyDown wxString debugkey; // display debug info for OnKeyDown and OnChar DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(KeyComboCtrl, wxTextCtrl) EVT_KEY_DOWN (KeyComboCtrl::OnKeyDown) EVT_CHAR (KeyComboCtrl::OnChar) END_EVENT_TABLE() // ----------------------------------------------------------------------------- void KeyComboCtrl::OnKeyDown(wxKeyEvent& event) { realkey = event.GetKeyCode(); int mods = event.GetModifiers(); if (debuglevel == 1) { // set debugkey now but don't show it until OnChar debugkey = wxString::Format(_("OnKeyDown: key=%d (%c) mods=%d"), realkey, realkey < 128 ? wxChar(realkey) : wxChar('?'), mods); } if (realkey == WXK_ESCAPE) { // escape key is reserved for other uses Beep(); return; } #ifdef __WXOSX__ // pass arrow key or function key or delete key directly to OnChar if ( (realkey >= WXK_LEFT && realkey <= WXK_DOWN) || (realkey >= WXK_F1 && realkey <= WXK_F24) || realkey == WXK_BACK ) { OnChar(event); return; } #endif // WARNING: logic must match that in PatternView::OnKeyDown if (mods == wxMOD_NONE || realkey > 127) { // tell OnChar handler to ignore realkey realkey = 0; } #ifdef __WXOSX__ // pass ctrl/cmd-key combos directly to OnChar if (realkey > 0 && ((mods & wxMOD_CONTROL) || (mods & wxMOD_CMD))) { OnChar(event); return; } #endif #ifdef __WXMAC__ // prevent ctrl-[ cancelling dialog (it translates to escape) if (realkey == '[' && (mods & wxMOD_CONTROL)) { OnChar(event); return; } // avoid translating option-E/I/N/U/` if (mods == wxMOD_ALT && (realkey == 'E' || realkey == 'I' || realkey == 'N' || realkey == 'U' || realkey == '`')) { OnChar(event); return; } #endif #ifdef __WXMSW__ // on Windows, OnChar is NOT called for some ctrl-key combos like // ctrl-0..9 or ctrl-alt-key, so we call OnChar ourselves if (realkey > 0 && (mods & wxMOD_CONTROL)) { OnChar(event); return; } #endif /* this didn't work!!! -- OnKeyDown is not getting called #ifdef __WXGTK__ // on Linux we need to avoid alt-C/O selecting Cancel/OK button if ((realkey == 'C' || realkey == 'O') && mods == wxMOD_ALT) { OnChar(event); return; } #endif */ event.Skip(); } // ----------------------------------------------------------------------------- #ifdef __WXOSX__ static bool inonchar = false; #endif void KeyComboCtrl::OnChar(wxKeyEvent& event) { #ifdef __WXOSX__ // avoid infinite recursion in wxOSX due to ChangeValue call below if (inonchar) { event.Skip(); return; } inonchar = true; #endif int key = event.GetKeyCode(); int mods = event.GetModifiers(); if (debuglevel == 1) { debugkey += wxString::Format(_("\nOnChar: key=%d (%c) mods=%d"), key, key < 128 ? wxChar(key) : wxChar('?'), mods); Warning(debugkey); } // WARNING: logic must match that in PatternView::OnChar if (realkey > 0 && mods != wxMOD_NONE) { #ifdef __WXGTK__ // sigh... wxGTK returns inconsistent results for shift-comma combos // so we assume that '<' is produced by pressing shift-comma // (which might only be true for US keyboards) if (key == '<' && (mods & wxMOD_SHIFT)) realkey = ','; #endif #ifdef __WXMSW__ // sigh... wxMSW returns inconsistent results for some shift-key combos // so again we assume we're using a US keyboard if (key == '~' && (mods & wxMOD_SHIFT)) realkey = '`'; if (key == '+' && (mods & wxMOD_SHIFT)) realkey = '='; #endif if (mods == wxMOD_SHIFT && key != realkey) { // use translated key code but remove shift key; // eg. we want shift-'/' to be seen as '?' mods = wxMOD_NONE; } else { // use key code seen by OnKeyDown key = realkey; if (key >= 'A' && key <= 'Z') key += 32; // convert A..Z to a..z } } // convert wx key and mods to our internal key code and modifiers // and, if they are valid, display the key combo and update the action if ( ConvertKeyAndModifiers(key, mods, &currkey, &currmods) ) { wxChoice* actionmenu = (wxChoice*) FindWindowById(PREF_ACTION); if (actionmenu) { wxString keystring = GetKeyCombo(currkey, currmods); if (!keystring.IsEmpty()) { ChangeValue(keystring); } else { currkey = 0; currmods = 0; ChangeValue(_("UNKNOWN KEY")); } actionmenu->SetSelection(keyaction[currkey][currmods].id); PrefsDialog::UpdateChosenFile(); SetFocus(); SetSelection(ALL_TEXT); } else { Warning(_("Failed to find wxChoice control!")); } } else { // unsupported key combo Beep(); } // do NOT pass event on to next handler // event.Skip(); #ifdef __WXOSX__ inonchar = false; #endif } // ----------------------------------------------------------------------------- #ifdef __WXMAC__ // override key event handler for wxSpinCtrl to allow key checking // and to get tab key navigation to work correctly class MySpinCtrl : public wxSpinCtrl { public: MySpinCtrl(wxWindow* parent, wxWindowID id, const wxString& str, const wxPoint& pos, const wxSize& size) : wxSpinCtrl(parent, id, str, pos, size) { // create a dynamic event handler for the underlying wxTextCtrl wxTextCtrl* textctrl = GetText(); if (textctrl) { textctrl->Connect(wxID_ANY, wxEVT_CHAR, wxKeyEventHandler(PrefsDialog::OnSpinCtrlChar)); } } }; void PrefsDialog::OnSpinCtrlChar(wxKeyEvent& event) { int key = event.GetKeyCode(); if (event.CmdDown()) { // allow handling of cmd-x/v/etc event.Skip(); } else if ( key == WXK_TAB ) { // note that FindFocus() returns pointer to wxTextCtrl window in wxSpinCtrl if ( currpage == FILE_PAGE ) { wxSpinCtrl* s1 = (wxSpinCtrl*) FindWindowById(PREF_MAX_PATTERNS); wxSpinCtrl* s2 = (wxSpinCtrl*) FindWindowById(PREF_MAX_SCRIPTS); wxTextCtrl* t1 = s1->GetText(); wxTextCtrl* t2 = s2->GetText(); wxWindow* focus = FindFocus(); if ( focus == t1 ) { s2->SetFocus(); s2->SetSelection(ALL_TEXT); } if ( focus == t2 ) { s1->SetFocus(); s1->SetSelection(ALL_TEXT); } } else if ( currpage == EDIT_PAGE ) { // only one spin ctrl on this page wxSpinCtrl* s1 = (wxSpinCtrl*) FindWindowById(PREF_RANDOM_FILL); if ( s1 ) { s1->SetFocus(); s1->SetSelection(ALL_TEXT); } } else if ( currpage == CONTROL_PAGE ) { wxSpinCtrl* s1 = (wxSpinCtrl*) FindWindowById(PREF_MAX_MEM); wxSpinCtrl* s2 = (wxSpinCtrl*) FindWindowById(PREF_BASE_STEP); wxSpinCtrl* s3 = (wxSpinCtrl*) FindWindowById(PREF_MIN_DELAY); wxSpinCtrl* s4 = (wxSpinCtrl*) FindWindowById(PREF_MAX_DELAY); wxTextCtrl* t1 = s1->GetText(); wxTextCtrl* t2 = s2->GetText(); wxTextCtrl* t3 = s3->GetText(); wxTextCtrl* t4 = s4->GetText(); wxWindow* focus = FindFocus(); if ( focus == t1 ) { s2->SetFocus(); s2->SetSelection(ALL_TEXT); } if ( focus == t2 ) { s3->SetFocus(); s3->SetSelection(ALL_TEXT); } if ( focus == t3 ) { s4->SetFocus(); s4->SetSelection(ALL_TEXT); } if ( focus == t4 ) { s1->SetFocus(); s1->SetSelection(ALL_TEXT); } } else if ( currpage == VIEW_PAGE ) { wxSpinCtrl* s1 = (wxSpinCtrl*) FindWindowById(PREF_BOLD_SPACING); wxSpinCtrl* s2 = (wxSpinCtrl*) FindWindowById(PREF_THUMB_RANGE); wxTextCtrl* t1 = s1->GetText(); wxTextCtrl* t2 = s2->GetText(); wxWindow* focus = FindFocus(); wxCheckBox* checkbox = (wxCheckBox*) FindWindowById(PREF_SHOW_BOLD); if (checkbox) { if (checkbox->GetValue()) { if ( focus == t1 ) { s2->SetFocus(); s2->SetSelection(ALL_TEXT); } if ( focus == t2 ) { s1->SetFocus(); s1->SetSelection(ALL_TEXT); } } else { if ( s2 ) { s2->SetFocus(); s2->SetSelection(ALL_TEXT); } } } else { Beep(); } } else if ( currpage == LAYER_PAGE ) { wxSpinCtrl* s1 = (wxSpinCtrl*) FindWindowById(PREF_OPACITY); wxSpinCtrl* s2 = (wxSpinCtrl*) FindWindowById(PREF_TILE_BORDER); wxTextCtrl* t1 = s1->GetText(); wxTextCtrl* t2 = s2->GetText(); wxWindow* focus = FindFocus(); if ( focus == t1 ) { s2->SetFocus(); s2->SetSelection(ALL_TEXT); } if ( focus == t2 ) { s1->SetFocus(); s1->SetSelection(ALL_TEXT); } } else if ( currpage == COLOR_PAGE ) { // no spin ctrls on this page } else if ( currpage == KEYBOARD_PAGE ) { // no spin ctrls on this page } } else if ( key >= ' ' && key <= '~' ) { if ( key >= '0' && key <= '9' ) { // allow digits event.Skip(); } else { // disallow any other displayable ascii char Beep(); } } else { event.Skip(); } } #else #define MySpinCtrl wxSpinCtrl #endif // !__WXMAC__ // ----------------------------------------------------------------------------- PrefsDialog::PrefsDialog(wxWindow* parent, const wxString& page) { // not using validators so no need for this: // SetExtraStyle(wxWS_EX_VALIDATE_RECURSIVELY); Create(parent, wxID_ANY, _("Preferences")); CreateButtons(wxOK | wxCANCEL); wxBookCtrlBase* notebook = GetBookCtrl(); wxPanel* filePrefs = CreateFilePrefs(notebook); wxPanel* editPrefs = CreateEditPrefs(notebook); wxPanel* ctrlPrefs = CreateControlPrefs(notebook); wxPanel* viewPrefs = CreateViewPrefs(notebook); wxPanel* layerPrefs = CreateLayerPrefs(notebook); wxPanel* colorPrefs = CreateColorPrefs(notebook); wxPanel* keyboardPrefs = CreateKeyboardPrefs(notebook); // AddPage and SetSelection cause OnPageChanging and OnPageChanged to be called // so we use a flag to prevent currpage being changed (and unnecessary validation) ignore_page_event = true; notebook->AddPage(filePrefs, _("File")); notebook->AddPage(editPrefs, _("Edit")); notebook->AddPage(ctrlPrefs, _("Control")); notebook->AddPage(viewPrefs, _("View")); notebook->AddPage(layerPrefs, _("Layer")); notebook->AddPage(colorPrefs, _("Color")); notebook->AddPage(keyboardPrefs, _("Keyboard")); if (!page.IsEmpty()) { if (page == wxT("file")) currpage = FILE_PAGE; else if (page == wxT("edit")) currpage = EDIT_PAGE; else if (page == wxT("control")) currpage = CONTROL_PAGE; else if (page == wxT("view")) currpage = VIEW_PAGE; else if (page == wxT("layer")) currpage = LAYER_PAGE; else if (page == wxT("color")) currpage = COLOR_PAGE; else if (page == wxT("keyboard")) currpage = KEYBOARD_PAGE; } // show the desired page notebook->SetSelection(currpage); ignore_page_event = false; LayoutDialog(); // ensure top text box has focus and text is selected by creating // a one-shot timer which will call OnOneTimer after short delay onetimer = new wxTimer(this, wxID_ANY); if (onetimer) onetimer->Start(10, wxTIMER_ONE_SHOT); } // ----------------------------------------------------------------------------- void PrefsDialog::OnOneTimer(wxTimerEvent& WXUNUSED(event)) { MySpinCtrl* s1 = NULL; if (currpage == FILE_PAGE) { s1 = (MySpinCtrl*) FindWindowById(PREF_MAX_PATTERNS); } else if (currpage == EDIT_PAGE) { s1 = (MySpinCtrl*) FindWindowById(PREF_RANDOM_FILL); } else if (currpage == CONTROL_PAGE) { s1 = (MySpinCtrl*) FindWindowById(PREF_MAX_MEM); } else if (currpage == VIEW_PAGE) { s1 = (MySpinCtrl*) FindWindowById(showgridlines ? PREF_BOLD_SPACING : PREF_THUMB_RANGE); } else if (currpage == LAYER_PAGE) { s1 = (MySpinCtrl*) FindWindowById(PREF_OPACITY); } else if (currpage == COLOR_PAGE) { // no spin ctrls on this page return; } else if (currpage == KEYBOARD_PAGE) { KeyComboCtrl* k = (KeyComboCtrl*) FindWindowById(PREF_KEYCOMBO); if (k) { k->SetFocus(); k->SetSelection(ALL_TEXT); } return; } if (s1) { s1->SetFocus(); s1->SetSelection(ALL_TEXT); } } // ----------------------------------------------------------------------------- // these consts are used to get nicely spaced controls on each platform: #ifdef __WXMAC__ #define GROUPGAP (12) // vertical gap between a group of controls #define SBTOPGAP (2) // vertical gap before first item in wxStaticBoxSizer #define SBBOTGAP (2) // vertical gap after last item in wxStaticBoxSizer #define SVGAP (4) // vertical gap above wxSpinCtrl box #define S2VGAP (0) // vertical gap between 2 wxSpinCtrl boxes #define CH2VGAP (6) // vertical gap between 2 check/radio boxes #define CVGAP (9) // vertical gap above wxChoice box #define LRGAP (5) // space left and right of vertically stacked boxes #define SPINGAP (3) // horizontal gap around each wxSpinCtrl box #define CHOICEGAP (6) // horizontal gap to left of wxChoice box #elif defined(__WXMSW__) #define GROUPGAP (10) #define SBTOPGAP (7) #define SBBOTGAP (7) #define SVGAP (7) #define S2VGAP (5) #define CH2VGAP (8) #define CVGAP (7) #define LRGAP (5) #define SPINGAP (6) #define CHOICEGAP (6) #else // assume Linux #define GROUPGAP (10) #define SBTOPGAP (12) #define SBBOTGAP (7) #define SVGAP (7) #define S2VGAP (5) #define CH2VGAP (8) #define CVGAP (7) #define LRGAP (5) #define SPINGAP (6) #define CHOICEGAP (6) #endif // ----------------------------------------------------------------------------- wxPanel* PrefsDialog::CreateFilePrefs(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); wxArrayString newcursorChoices; newcursorChoices.Add(wxT("Draw")); newcursorChoices.Add(wxT("Pick")); newcursorChoices.Add(wxT("Select")); newcursorChoices.Add(wxT("Move")); newcursorChoices.Add(wxT("Zoom In")); newcursorChoices.Add(wxT("Zoom Out")); newcursorChoices.Add(wxT("No Change")); wxArrayString opencursorChoices = newcursorChoices; wxArrayString newscaleChoices; newscaleChoices.Add(wxT("1:1")); newscaleChoices.Add(wxT("1:2")); newscaleChoices.Add(wxT("1:4")); newscaleChoices.Add(wxT("1:8")); newscaleChoices.Add(wxT("1:16")); newscaleChoices.Add(wxT("1:32")); // on new pattern wxStaticBox* sbox1 = new wxStaticBox(panel, wxID_ANY, _("On creating a new pattern:")); wxBoxSizer* ssizer1 = new wxStaticBoxSizer(sbox1, wxVERTICAL); wxCheckBox* check1 = new wxCheckBox(panel, PREF_NEW_REM_SEL, _("Remove selection")); wxBoxSizer* check1box = new wxBoxSizer(wxHORIZONTAL); check1box->Add(check1, 0, FIX_ALIGN_BUG); wxBoxSizer* setcurs1 = new wxBoxSizer(wxHORIZONTAL); setcurs1->Add(new wxStaticText(panel, wxID_STATIC, _("Set cursor:")), 0, FIX_ALIGN_BUG); wxBoxSizer* setscalebox = new wxBoxSizer(wxHORIZONTAL); setscalebox->Add(new wxStaticText(panel, wxID_STATIC, _("Set scale:")), 0, FIX_ALIGN_BUG); wxChoice* choice3 = new wxChoice(panel, PREF_NEW_CURSOR, wxDefaultPosition, wxDefaultSize, newcursorChoices); wxChoice* choice1 = new wxChoice(panel, PREF_NEW_SCALE, wxDefaultPosition, wxDefaultSize, newscaleChoices); wxBoxSizer* hbox1 = new wxBoxSizer(wxHORIZONTAL); hbox1->Add(check1box, 0, wxALIGN_CENTER_VERTICAL, 0); hbox1->AddStretchSpacer(20); hbox1->Add(setcurs1, 0, wxALIGN_CENTER_VERTICAL, 0); hbox1->Add(choice3, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, CHOICEGAP); hbox1->AddStretchSpacer(20); wxBoxSizer* hbox2 = new wxBoxSizer(wxHORIZONTAL); hbox2->Add(setscalebox, 0, wxALIGN_CENTER_VERTICAL, 0); hbox2->Add(choice1, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, CHOICEGAP); ssizer1->AddSpacer(SBTOPGAP); ssizer1->Add(hbox1, 1, wxGROW | wxLEFT | wxRIGHT, LRGAP); ssizer1->AddSpacer(CVGAP); ssizer1->Add(hbox2, 0, wxLEFT | wxRIGHT, LRGAP); ssizer1->AddSpacer(SBBOTGAP); // on opening pattern wxStaticBox* sbox2 = new wxStaticBox(panel, wxID_ANY, _("On opening a pattern file or the clipboard:")); wxBoxSizer* ssizer2 = new wxStaticBoxSizer(sbox2, wxVERTICAL); wxCheckBox* check2 = new wxCheckBox(panel, PREF_OPEN_REM_SEL, _("Remove selection")); wxBoxSizer* check2box = new wxBoxSizer(wxHORIZONTAL); check2box->Add(check2, 0, FIX_ALIGN_BUG); wxChoice* choice4 = new wxChoice(panel, PREF_OPEN_CURSOR, wxDefaultPosition, wxDefaultSize, opencursorChoices); wxBoxSizer* setcurs2 = new wxBoxSizer(wxHORIZONTAL); setcurs2->Add(new wxStaticText(panel, wxID_STATIC, _("Set cursor:")), 0, FIX_ALIGN_BUG); wxBoxSizer* hbox4 = new wxBoxSizer(wxHORIZONTAL); hbox4->Add(check2box, 0, wxALIGN_CENTER_VERTICAL, 0); hbox4->AddStretchSpacer(20); hbox4->Add(setcurs2, 0, wxALIGN_CENTER_VERTICAL, 0); hbox4->Add(choice4, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, CHOICEGAP); hbox4->AddStretchSpacer(20); ssizer2->AddSpacer(SBTOPGAP); ssizer2->Add(hbox4, 1, wxGROW | wxLEFT | wxRIGHT, LRGAP); ssizer2->AddSpacer(SBBOTGAP); // max_patterns and max_scripts wxBoxSizer* maxbox = new wxBoxSizer(wxHORIZONTAL); maxbox->Add(new wxStaticText(panel, wxID_STATIC, _("Maximum number of recent patterns:")), 0, wxALL, 0); wxBoxSizer* minbox = new wxBoxSizer(wxHORIZONTAL); minbox->Add(new wxStaticText(panel, wxID_STATIC, _("Maximum number of recent scripts:")), 0, wxALL, 0); // align spin controls by setting minbox same width as maxbox minbox->SetMinSize( maxbox->GetMinSize() ); wxSpinCtrl* spin1 = new MySpinCtrl(panel, PREF_MAX_PATTERNS, wxEmptyString, wxDefaultPosition, wxSize(70, wxDefaultCoord)); wxSpinCtrl* spin2 = new MySpinCtrl(panel, PREF_MAX_SCRIPTS, wxEmptyString, wxDefaultPosition, wxSize(70, wxDefaultCoord)); wxBoxSizer* hpbox = new wxBoxSizer(wxHORIZONTAL); hpbox->Add(maxbox, 0, wxALIGN_CENTER_VERTICAL, 0); hpbox->Add(spin1, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); wxBoxSizer* hsbox = new wxBoxSizer(wxHORIZONTAL); hsbox->Add(minbox, 0, wxALIGN_CENTER_VERTICAL, 0); hsbox->Add(spin2, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); wxButton* editorbutt = new wxButton(panel, PREF_EDITOR_BUTT, _("Text Editor...")); wxStaticText* editorbox = new wxStaticText(panel, PREF_EDITOR_BOX, texteditor); neweditor = texteditor; wxButton* downloadbutt = new wxButton(panel, PREF_DOWNLOAD_BUTT, _("Downloads...")); wxStaticText* downloadbox = new wxStaticText(panel, PREF_DOWNLOAD_BOX, downloaddir); newdownloaddir = downloaddir; wxBoxSizer* hebox = new wxBoxSizer(wxHORIZONTAL); hebox->Add(editorbutt, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0); hebox->Add(editorbox, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, LRGAP); wxBoxSizer* hdbox = new wxBoxSizer(wxHORIZONTAL); hdbox->Add(downloadbutt, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0); hdbox->Add(downloadbox, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, LRGAP); vbox->Add(ssizer1, 0, wxGROW | wxALL, 2); vbox->AddSpacer(10); vbox->Add(ssizer2, 0, wxGROW | wxALL, 2); vbox->AddSpacer(10); vbox->Add(hpbox, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(S2VGAP); vbox->Add(hsbox, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(10); vbox->Add(hebox, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(10); vbox->Add(hdbox, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(5); // init control values check1->SetValue(newremovesel); check2->SetValue(openremovesel); choice1->SetSelection(newmag); newcursindex = CursorToIndex(newcurs); opencursindex = CursorToIndex(opencurs); choice3->SetSelection(newcursindex); choice4->SetSelection(opencursindex); spin1->SetRange(1, MAX_RECENT); spin1->SetValue(maxpatterns); spin2->SetRange(1, MAX_RECENT); spin2->SetValue(maxscripts); spin1->SetFocus(); spin1->SetSelection(ALL_TEXT); topSizer->Add(vbox, 1, wxGROW | wxALIGN_CENTER | wxALL, 5); panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } // ----------------------------------------------------------------------------- wxPanel* PrefsDialog::CreateEditPrefs(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); // random_fill wxBoxSizer* hbox1 = new wxBoxSizer(wxHORIZONTAL); hbox1->Add(new wxStaticText(panel, wxID_STATIC, _("Random fill percentage:")), 0, wxALIGN_CENTER_VERTICAL, 0); wxSpinCtrl* spin1 = new MySpinCtrl(panel, PREF_RANDOM_FILL, wxEmptyString, wxDefaultPosition, wxSize(70, wxDefaultCoord)); hbox1->Add(spin1, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); // can_change_rule wxStaticBox* sbox1 = new wxStaticBox(panel, wxID_ANY, _("When pasting a clipboard pattern:")); wxBoxSizer* ssizer1 = new wxStaticBoxSizer(sbox1, wxVERTICAL); wxRadioButton* radio0 = new wxRadioButton(panel, PREF_PASTE_0, _("Never change rule"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); wxRadioButton* radio1 = new wxRadioButton(panel, PREF_PASTE_1, _("Only change rule if one is specified and the universe is empty")); wxRadioButton* radio2 = new wxRadioButton(panel, PREF_PASTE_2, _("Always change rule if one is specified")); ssizer1->AddSpacer(SBTOPGAP); ssizer1->Add(radio0, 0, wxLEFT | wxRIGHT, LRGAP); ssizer1->AddSpacer(CH2VGAP); ssizer1->Add(radio1, 0, wxLEFT | wxRIGHT, LRGAP); ssizer1->AddSpacer(CH2VGAP); ssizer1->Add(radio2, 0, wxLEFT | wxRIGHT, LRGAP); ssizer1->AddSpacer(SBBOTGAP); // scroll_pencil, scroll_cross, scroll_hand wxStaticBox* sbox2 = new wxStaticBox(panel, wxID_ANY, _("If the cursor is dragged outside the viewport:")); wxBoxSizer* ssizer2 = new wxStaticBoxSizer(sbox2, wxVERTICAL); wxCheckBox* check1 = new wxCheckBox(panel, PREF_SCROLL_PENCIL, _("Scroll when drawing cells (using the pencil cursor)")); wxCheckBox* check2 = new wxCheckBox(panel, PREF_SCROLL_CROSS, _("Scroll when selecting cells (using the cross cursor)")); wxCheckBox* check3 = new wxCheckBox(panel, PREF_SCROLL_HAND, _("Scroll when moving view (using the hand cursor)")); ssizer2->AddSpacer(SBTOPGAP); ssizer2->Add(check1, 0, wxLEFT | wxRIGHT, LRGAP); ssizer2->AddSpacer(CH2VGAP); ssizer2->Add(check2, 0, wxLEFT | wxRIGHT, LRGAP); ssizer2->AddSpacer(CH2VGAP); ssizer2->Add(check3, 0, wxLEFT | wxRIGHT, LRGAP); ssizer2->AddSpacer(SBBOTGAP); // allow_beep wxCheckBox* check4 = new wxCheckBox(panel, PREF_BEEP, _("Allow beep sound")); vbox->AddSpacer(SVGAP); vbox->Add(hbox1, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(GROUPGAP); vbox->Add(ssizer1, 0, wxGROW | wxALL, 2); vbox->AddSpacer(GROUPGAP); vbox->Add(ssizer2, 0, wxGROW | wxALL, 2); vbox->AddSpacer(GROUPGAP); vbox->Add(check4, 0, wxLEFT | wxRIGHT, LRGAP); // init control values spin1->SetRange(1, 100); spin1->SetValue(randomfill); spin1->SetFocus(); spin1->SetSelection(ALL_TEXT); radio0->SetValue(canchangerule == 0); radio1->SetValue(canchangerule == 1); radio2->SetValue(canchangerule == 2); check1->SetValue(scrollpencil); check2->SetValue(scrollcross); check3->SetValue(scrollhand); check4->SetValue(allowbeep); topSizer->Add(vbox, 1, wxGROW | wxALIGN_CENTER | wxALL, 5); panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } // ----------------------------------------------------------------------------- wxPanel* PrefsDialog::CreateControlPrefs(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); // create a choice menu to select algo wxArrayString algoChoices; for (int i = 0; i < NumAlgos(); i++) { algoChoices.Add( wxString(GetAlgoName(i), wxConvLocal) ); } wxChoice* algomenu = new wxChoice(panel, PREF_ALGO_MENU1, wxDefaultPosition, wxDefaultSize, algoChoices); algopos1 = currlayer->algtype; wxBoxSizer* longbox = new wxBoxSizer(wxHORIZONTAL); longbox->Add(new wxStaticText(panel, wxID_STATIC, _("Settings for this algorithm:")), 0, FIX_ALIGN_BUG); wxBoxSizer* menubox = new wxBoxSizer(wxHORIZONTAL); menubox->Add(longbox, 0, wxALIGN_CENTER_VERTICAL, 0); menubox->Add(algomenu, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, CHOICEGAP); // maximum memory and base step wxBoxSizer* membox = new wxBoxSizer(wxHORIZONTAL); membox->Add(new wxStaticText(panel, wxID_STATIC, _("Maximum memory:")), 0, wxALL, 0); wxBoxSizer* basebox = new wxBoxSizer(wxHORIZONTAL); basebox->Add(new wxStaticText(panel, wxID_STATIC, _("Default base step:")), 0, wxALL, 0); // align spin controls membox->SetMinSize( longbox->GetMinSize() ); basebox->SetMinSize( longbox->GetMinSize() ); wxBoxSizer* hbox1 = new wxBoxSizer(wxHORIZONTAL); hbox1->Add(membox, 0, wxALIGN_CENTER_VERTICAL, 0); wxSpinCtrl* spin1 = new MySpinCtrl(panel, PREF_MAX_MEM, wxEmptyString, wxDefaultPosition, wxSize(80, wxDefaultCoord)); hbox1->Add(spin1, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); wxString memnote = algoinfo[algopos1]->canhash ? HASH_MEM_NOTE : NONHASH_MEM_NOTE; hbox1->Add(new wxStaticText(panel, PREF_MEM_NOTE, memnote), 0, wxALIGN_CENTER_VERTICAL, 0); wxBoxSizer* hbox2 = new wxBoxSizer(wxHORIZONTAL); hbox2->Add(basebox, 0, wxALIGN_CENTER_VERTICAL, 0); wxSpinCtrl* spin2 = new MySpinCtrl(panel, PREF_BASE_STEP, wxEmptyString, wxDefaultPosition, wxSize(80, wxDefaultCoord)); hbox2->Add(spin2, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); wxString stepnote = algoinfo[algopos1]->canhash ? HASH_STEP_NOTE : NONHASH_STEP_NOTE; hbox2->Add(new wxStaticText(panel, PREF_STEP_NOTE, stepnote), 0, wxALIGN_CENTER_VERTICAL, 0); // min_delay and max_delay wxBoxSizer* minbox = new wxBoxSizer(wxHORIZONTAL); minbox->Add(new wxStaticText(panel, wxID_STATIC, _("Minimum delay:")), 0, wxALL, 0); wxBoxSizer* maxbox = new wxBoxSizer(wxHORIZONTAL); maxbox->Add(new wxStaticText(panel, wxID_STATIC, _("Maximum delay:")), 0, wxALL, 0); // align spin controls minbox->SetMinSize( maxbox->GetMinSize() ); wxBoxSizer* hbox3 = new wxBoxSizer(wxHORIZONTAL); hbox3->Add(minbox, 0, wxALIGN_CENTER_VERTICAL, 0); wxSpinCtrl* spin3 = new MySpinCtrl(panel, PREF_MIN_DELAY, wxEmptyString, wxDefaultPosition, wxSize(80, wxDefaultCoord)); hbox3->Add(spin3, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); hbox3->Add(new wxStaticText(panel, wxID_STATIC, _("millisecs")), 0, wxALIGN_CENTER_VERTICAL, 0); wxBoxSizer* hbox4 = new wxBoxSizer(wxHORIZONTAL); hbox4->Add(maxbox, 0, wxALIGN_CENTER_VERTICAL, 0); wxSpinCtrl* spin4 = new MySpinCtrl(panel, PREF_MAX_DELAY, wxEmptyString, wxDefaultPosition, wxSize(80, wxDefaultCoord)); hbox4->Add(spin4, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); hbox4->Add(new wxStaticText(panel, wxID_STATIC, _("millisecs")), 0, wxALIGN_CENTER_VERTICAL, 0); // user_rules wxButton* rulesbutt = new wxButton(panel, PREF_RULES_BUTT, _("Your Rules...")); wxStaticText* rulesbox = new wxStaticText(panel, PREF_RULES_BOX, userrules); newuserrules = userrules; wxBoxSizer* hrbox = new wxBoxSizer(wxHORIZONTAL); hrbox->Add(rulesbutt, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, 0); hrbox->Add(rulesbox, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, LRGAP); wxString note = _("Golly looks for .rule files in the above folder before looking in the Rules folder."); wxBoxSizer* notebox = new wxBoxSizer(wxHORIZONTAL); notebox->Add(new wxStaticText(panel, wxID_STATIC, note)); // position things vbox->AddSpacer(5); vbox->Add(menubox, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(SVGAP); vbox->Add(hbox1, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(S2VGAP); vbox->Add(hbox2, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(5); vbox->AddSpacer(GROUPGAP); vbox->Add(hbox3, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(S2VGAP); vbox->Add(hbox4, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(15); vbox->AddSpacer(GROUPGAP); vbox->Add(hrbox, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(15); vbox->Add(notebox, 0, wxLEFT, LRGAP); // init control values; // to avoid a wxGTK bug we use SetRange and SetValue rather than specifying // the min,max,init values in the wxSpinCtrl constructor spin1->SetRange(MIN_MEM_MB, MAX_MEM_MB); spin1->SetValue(algoinfo[algopos1]->algomem); spin2->SetRange(2, MAX_BASESTEP); spin2->SetValue(algoinfo[algopos1]->defbase); spin3->SetRange(0, MAX_DELAY); spin3->SetValue(mindelay); spin4->SetRange(0, MAX_DELAY); spin4->SetValue(maxdelay); spin1->SetFocus(); spin1->SetSelection(ALL_TEXT); algomenu->SetSelection(algopos1); for (int i = 0; i < NumAlgos(); i++) { new_algomem[i] = algoinfo[i]->algomem; new_defbase[i] = algoinfo[i]->defbase; } topSizer->Add(vbox, 1, wxGROW | wxALIGN_CENTER | wxALL, 5); panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } // ----------------------------------------------------------------------------- wxPanel* PrefsDialog::CreateViewPrefs(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); // show_tips #if wxUSE_TOOLTIPS wxCheckBox* check3 = new wxCheckBox(panel, PREF_SHOW_TIPS, _("Show button tips")); #endif // restore_view wxCheckBox* check4 = new wxCheckBox(panel, PREF_RESTORE, _("Reset/Undo will restore view")); // math_coords wxCheckBox* check1 = new wxCheckBox(panel, PREF_Y_UP, _("Y coordinates increase upwards")); // show_bold_lines and bold_spacing wxBoxSizer* hbox2 = new wxBoxSizer(wxHORIZONTAL); wxCheckBox* check2 = new wxCheckBox(panel, PREF_SHOW_BOLD, _("Show bold grid lines every")); wxSpinCtrl* spin2 = new MySpinCtrl(panel, PREF_BOLD_SPACING, wxEmptyString, wxDefaultPosition, wxSize(70, wxDefaultCoord)); hbox2->Add(check2, 0, wxALIGN_CENTER_VERTICAL, 0); hbox2->Add(spin2, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); hbox2->Add(new wxStaticText(panel, wxID_STATIC, _("cells")), 0, wxALIGN_CENTER_VERTICAL, 0); // min_grid_mag (2..MAX_MAG) wxBoxSizer* hbox3 = new wxBoxSizer(wxHORIZONTAL); wxArrayString mingridChoices; mingridChoices.Add(wxT("1:4")); mingridChoices.Add(wxT("1:8")); mingridChoices.Add(wxT("1:16")); mingridChoices.Add(wxT("1:32")); wxChoice* choice3 = new wxChoice(panel, PREF_MIN_GRID_SCALE, wxDefaultPosition, wxDefaultSize, mingridChoices); wxBoxSizer* longbox = new wxBoxSizer(wxHORIZONTAL); longbox->Add(new wxStaticText(panel, wxID_STATIC, _("Minimum scale for grid:")), 0, FIX_ALIGN_BUG); wxBoxSizer* shortbox = new wxBoxSizer(wxHORIZONTAL); shortbox->Add(new wxStaticText(panel, wxID_STATIC, _("Mouse wheel action:")), 0, FIX_ALIGN_BUG); // align controls by setting shortbox same width as longbox shortbox->SetMinSize( longbox->GetMinSize() ); hbox3->Add(longbox, 0, wxALIGN_CENTER_VERTICAL, 0); hbox3->Add(choice3, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, CHOICEGAP); // mouse_wheel_mode wxBoxSizer* hbox4 = new wxBoxSizer(wxHORIZONTAL); wxArrayString mousewheelChoices; mousewheelChoices.Add(wxT("Disabled")); mousewheelChoices.Add(wxT("Forward zooms out")); mousewheelChoices.Add(wxT("Forward zooms in")); wxChoice* choice4 = new wxChoice(panel, PREF_MOUSE_WHEEL, wxDefaultPosition, wxDefaultSize, mousewheelChoices); hbox4->Add(shortbox, 0, wxALIGN_CENTER_VERTICAL, 0); hbox4->Add(choice4, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, CHOICEGAP); // thumb_range wxBoxSizer* thumblabel = new wxBoxSizer(wxHORIZONTAL); thumblabel->Add(new wxStaticText(panel, wxID_STATIC, _("Thumb scroll range:")), 0, wxALIGN_CENTER_VERTICAL, 0); thumblabel->SetMinSize( longbox->GetMinSize() ); wxBoxSizer* hbox5 = new wxBoxSizer(wxHORIZONTAL); hbox5->Add(thumblabel, 0, wxALIGN_CENTER_VERTICAL, 0); wxSpinCtrl* spin5 = new MySpinCtrl(panel, PREF_THUMB_RANGE, wxEmptyString, wxDefaultPosition, wxSize(70, wxDefaultCoord)); hbox5->Add(spin5, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); hbox5->Add(new wxStaticText(panel, wxID_STATIC, _("times view size")), 0, wxALIGN_CENTER_VERTICAL, 0); // controls_pos wxStaticBox* sbox1 = new wxStaticBox(panel, wxID_ANY, _("Position of translucent buttons:")); wxBoxSizer* ssizer1 = new wxStaticBoxSizer(sbox1, wxVERTICAL); wxRadioButton* radio0 = new wxRadioButton(panel, PREF_NO_CONTROLS, _("Disabled"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP); wxRadioButton* radio1 = new wxRadioButton(panel, PREF_TL_CONTROLS, _("Top left corner")); wxRadioButton* radio2 = new wxRadioButton(panel, PREF_TR_CONTROLS, _("Top right corner")); wxRadioButton* radio3 = new wxRadioButton(panel, PREF_BR_CONTROLS, _("Bottom right corner")); wxRadioButton* radio4 = new wxRadioButton(panel, PREF_BL_CONTROLS, _("Bottom left corner")); wxBoxSizer* b1 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* b4 = new wxBoxSizer(wxHORIZONTAL); b1->Add(radio1, 0, wxALL, 0); b4->Add(radio4, 0, wxALL, 0); wxSize wd1 = b1->GetMinSize(); wxSize wd4 = b4->GetMinSize(); if (wd1.GetWidth() > wd4.GetWidth()) b4->SetMinSize(wd1); else b1->SetMinSize(wd4); wxBoxSizer* toprow = new wxBoxSizer(wxHORIZONTAL); toprow->Add(b1, 0, wxLEFT | wxRIGHT, LRGAP); // don't use AddSpacer(20) because that will also add 20 *vertical* units! toprow->AddSpacer(10); toprow->AddSpacer(10); toprow->Add(radio2, 0, wxLEFT | wxRIGHT, LRGAP); toprow->AddStretchSpacer(20); toprow->Add(radio0, 0, wxLEFT | wxRIGHT, 0); toprow->AddStretchSpacer(10); wxBoxSizer* botrow = new wxBoxSizer(wxHORIZONTAL); botrow->Add(b4, 0, wxLEFT | wxRIGHT, LRGAP); // don't use AddSpacer(20) because that will also add 20 *vertical* units! botrow->AddSpacer(10); botrow->AddSpacer(10); botrow->Add(radio3, 0, wxLEFT | wxRIGHT, LRGAP); botrow->AddStretchSpacer(10); ssizer1->AddSpacer(SBTOPGAP); ssizer1->Add(toprow, 1, wxGROW | wxLEFT | wxRIGHT, LRGAP); ssizer1->AddSpacer(CH2VGAP); ssizer1->Add(botrow, 1, wxGROW | wxLEFT | wxRIGHT, LRGAP); ssizer1->AddSpacer(SBBOTGAP); // position things vbox->AddSpacer(5); #if wxUSE_TOOLTIPS vbox->Add(check3, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(CH2VGAP + 3); #endif vbox->Add(check4, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(CH2VGAP + 3); vbox->Add(check1, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(SVGAP); vbox->Add(hbox2, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(SVGAP); #ifdef __WXMAC__ vbox->AddSpacer(10); #endif vbox->Add(hbox3, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(CVGAP); vbox->Add(hbox4, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(SVGAP); vbox->Add(hbox5, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(GROUPGAP); vbox->Add(ssizer1, 0, wxGROW | wxALL, 2); // init control values #if wxUSE_TOOLTIPS check3->SetValue(showtips); #endif check4->SetValue(restoreview); check1->SetValue(mathcoords); check2->SetValue(showboldlines); spin5->SetRange(2, MAX_THUMBRANGE); spin5->SetValue(thumbrange); spin2->SetRange(2, MAX_SPACING); spin2->SetValue(boldspacing); spin2->Enable(showboldlines); if (showboldlines) { spin2->SetFocus(); spin2->SetSelection(ALL_TEXT); } else { spin5->SetFocus(); spin5->SetSelection(ALL_TEXT); } mingridindex = mingridmag - 2; choice3->SetSelection(mingridindex); choice4->SetSelection(mousewheelmode); radio0->SetValue(controlspos == 0); radio1->SetValue(controlspos == 1); radio2->SetValue(controlspos == 2); radio3->SetValue(controlspos == 3); radio4->SetValue(controlspos == 4); topSizer->Add(vbox, 1, wxGROW | wxALIGN_CENTER | wxALL, 5); panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } // ----------------------------------------------------------------------------- wxPanel* PrefsDialog::CreateLayerPrefs(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); // opacity wxBoxSizer* opacitybox = new wxBoxSizer(wxHORIZONTAL); opacitybox->Add(new wxStaticText(panel, wxID_STATIC, _("Opacity percentage when drawing stacked layers:")), 0, wxALIGN_CENTER_VERTICAL, 0); wxSpinCtrl* spin1 = new MySpinCtrl(panel, PREF_OPACITY, wxEmptyString, wxDefaultPosition, wxSize(70, wxDefaultCoord)); opacitybox->Add(spin1, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); // tile_border wxBoxSizer* borderbox = new wxBoxSizer(wxHORIZONTAL); borderbox->Add(new wxStaticText(panel, wxID_STATIC, _("Border thickness for tiled layers:")), 0, wxALIGN_CENTER_VERTICAL, 0); wxSpinCtrl* spin2 = new MySpinCtrl(panel, PREF_TILE_BORDER, wxEmptyString, wxDefaultPosition, wxSize(70, wxDefaultCoord)); borderbox->Add(spin2, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, SPINGAP); // ask_on_new, ask_on_load, ask_on_delete, ask_on_quit wxStaticBox* sbox1 = new wxStaticBox(panel, wxID_ANY, _("Ask to save changes to layer before:")); wxBoxSizer* ssizer1 = new wxStaticBoxSizer(sbox1, wxVERTICAL); wxCheckBox* check1 = new wxCheckBox(panel, PREF_ASK_NEW, _("Creating a new pattern")); wxCheckBox* check2 = new wxCheckBox(panel, PREF_ASK_LOAD, _("Opening a pattern file")); wxCheckBox* check3 = new wxCheckBox(panel, PREF_ASK_DELETE, _("Deleting layer")); wxCheckBox* check4 = new wxCheckBox(panel, PREF_ASK_QUIT, _("Quitting application")); wxBoxSizer* b1 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* b2 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* b3 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* b4 = new wxBoxSizer(wxHORIZONTAL); b1->Add(check1, 0, wxALL, 0); b2->Add(check2, 0, wxALL, 0); b3->Add(check3, 0, wxALL, 0); b4->Add(check4, 0, wxALL, 0); wxSize wd1 = b1->GetMinSize(); wxSize wd2 = b2->GetMinSize(); wxSize wd3 = b3->GetMinSize(); wxSize wd4 = b4->GetMinSize(); if (wd1.GetWidth() > wd2.GetWidth()) b2->SetMinSize(wd1); else b1->SetMinSize(wd2); if (wd3.GetWidth() > wd4.GetWidth()) b4->SetMinSize(wd3); else b3->SetMinSize(wd4); wxBoxSizer* hbox1 = new wxBoxSizer(wxHORIZONTAL); hbox1->Add(b1, 0, wxLEFT | wxRIGHT, LRGAP); hbox1->AddStretchSpacer(20); hbox1->Add(b3, 0, wxLEFT | wxRIGHT, LRGAP); hbox1->AddStretchSpacer(20); wxBoxSizer* hbox2 = new wxBoxSizer(wxHORIZONTAL); hbox2->Add(b2, 0, wxLEFT | wxRIGHT, LRGAP); hbox2->AddStretchSpacer(20); hbox2->Add(b4, 0, wxLEFT | wxRIGHT, LRGAP); hbox2->AddStretchSpacer(20); ssizer1->AddSpacer(SBTOPGAP); ssizer1->Add(hbox1, 1, wxGROW | wxLEFT | wxRIGHT, LRGAP); ssizer1->AddSpacer(CH2VGAP); ssizer1->Add(hbox2, 1, wxGROW | wxLEFT | wxRIGHT, LRGAP); ssizer1->AddSpacer(SBBOTGAP); // position things vbox->AddSpacer(SVGAP); vbox->Add(opacitybox, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(S2VGAP); vbox->Add(borderbox, 0, wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(GROUPGAP); vbox->Add(ssizer1, 0, wxGROW | wxALL, 2); // init control values spin1->SetRange(1, 100); spin1->SetValue(opacity); spin2->SetRange(1, 10); spin2->SetValue(tileborder); spin1->SetFocus(); spin1->SetSelection(ALL_TEXT); check1->SetValue(askonnew); check2->SetValue(askonload); check3->SetValue(askondelete); check4->SetValue(askonquit); topSizer->Add(vbox, 1, wxGROW | wxALIGN_CENTER | wxALL, 5); panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } // ----------------------------------------------------------------------------- wxBitmapButton* PrefsDialog::AddColorButton(wxWindow* parent, wxBoxSizer* hbox, int id, wxColor* rgb, const wxString& text) { wxBitmap bitmap(BITMAP_WD, BITMAP_HT); wxMemoryDC dc; dc.SelectObject(bitmap); wxRect rect(0, 0, BITMAP_WD, BITMAP_HT); wxBrush brush(*rgb); FillRect(dc, rect, brush); dc.SelectObject(wxNullBitmap); wxBitmapButton* bb = new wxBitmapButton(parent, id, bitmap, wxPoint(0,0), #if defined(__WXOSX_COCOA__) wxSize(BITMAP_WD + 12, BITMAP_HT + 12)); #else wxDefaultSize); #endif if (bb) { hbox->Add(new wxStaticText(parent, wxID_STATIC, text), 0, wxALIGN_CENTER_VERTICAL, 0); hbox->Add(bb, 0, wxALIGN_CENTER_VERTICAL, 0); } return bb; } // ----------------------------------------------------------------------------- wxPanel* PrefsDialog::CreateColorPrefs(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); // create a choice menu to select algo wxArrayString algoChoices; for (int i = 0; i < NumAlgos(); i++) { algoChoices.Add( wxString(GetAlgoName(i), wxConvLocal) ); } wxChoice* algomenu = new wxChoice(panel, PREF_ALGO_MENU2, wxDefaultPosition, wxDefaultSize, algoChoices); coloralgo = currlayer->algtype; algomenu->SetSelection(coloralgo); // create bitmap buttons wxBoxSizer* statusbox = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* frombox = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* tobox = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* colorbox = new wxBoxSizer(wxHORIZONTAL); AddColorButton(panel, statusbox, PREF_STATUS_BUTT, &algoinfo[coloralgo]->statusrgb, _("Status bar: ")); frombutt = AddColorButton(panel, frombox, PREF_FROM_BUTT, &algoinfo[coloralgo]->fromrgb, _("")); tobutt = AddColorButton(panel, tobox, PREF_TO_BUTT, &algoinfo[coloralgo]->torgb, _(" to ")); AddColorButton(panel, colorbox, PREF_SELECT_BUTT, selectrgb, _("Selection: ")); // don't use AddSpacer(20) because that will also add 20 *vertical* units! colorbox->AddSpacer(10); colorbox->AddSpacer(10); AddColorButton(panel, colorbox, PREF_PASTE_BUTT, pastergb, _("Paste: ")); // don't use AddSpacer(20) because that will also add 20 *vertical* units! colorbox->AddSpacer(10); colorbox->AddSpacer(10); AddColorButton(panel, colorbox, PREF_BORDER_BUTT, borderrgb, _("Grid border: ")); wxBoxSizer* algobox = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* algolabel = new wxBoxSizer(wxHORIZONTAL); algolabel->Add(new wxStaticText(panel, wxID_STATIC, _("Default colors for:")), 0, FIX_ALIGN_BUG); algobox->Add(algolabel, 0, wxALIGN_CENTER_VERTICAL, 0); algobox->Add(algomenu, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 6); algobox->AddStretchSpacer(); algobox->Add(statusbox, 0, wxALIGN_CENTER_VERTICAL | FIX_ALIGN_BUG); algobox->AddStretchSpacer(); gradcheck = new wxCheckBox(panel, PREF_GRADIENT_CHECK, _("Use gradient from ")); gradcheck->SetValue(algoinfo[coloralgo]->gradient); wxBoxSizer* gradbox = new wxBoxSizer(wxHORIZONTAL); gradbox->Add(gradcheck, 0, wxALIGN_CENTER_VERTICAL, 0); gradbox->Add(frombox, 0, wxALIGN_CENTER_VERTICAL, 0); gradbox->Add(tobox, 0, wxALIGN_CENTER_VERTICAL, 0); gradbox->AddSpacer(10); // create scroll bar filling right part of gradbox wxSize minsize = gradbox->GetMinSize(); int scrollbarwd = NUMCOLS*CELLSIZE+1 - minsize.GetWidth(); #ifdef __WXMAC__ int scrollbarht = 15; // must be this height on Mac #else int scrollbarht = 16; #endif scrollbar = new wxScrollBar(panel, PREF_SCROLL_BAR, wxDefaultPosition, wxSize(scrollbarwd, scrollbarht), wxSB_HORIZONTAL); if (scrollbar == NULL) Fatal(_("Failed to create scroll bar!")); gradbox->Add(scrollbar, 0, wxALIGN_CENTER_VERTICAL, 0); gradstates = algoinfo[coloralgo]->maxstates; UpdateScrollBar(); scrollbar->Enable(algoinfo[coloralgo]->gradient); frombutt->Enable(algoinfo[coloralgo]->gradient); tobutt->Enable(algoinfo[coloralgo]->gradient); // create child window for displaying cell colors/icons cellboxes = new CellBoxes(panel, PREF_CELL_PANEL, wxPoint(0,0), wxSize(NUMCOLS*CELLSIZE+1,NUMROWS*CELLSIZE+1)); iconcheck = new wxCheckBox(panel, PREF_ICON_CHECK, _("Show icons")); iconcheck->SetValue(showicons); wxStaticText* statebox = new wxStaticText(panel, PREF_STATE_BOX, _("999")); cellboxes->statebox = statebox; wxBoxSizer* hbox1 = new wxBoxSizer(wxHORIZONTAL); hbox1->Add(statebox, 0, 0, 0); hbox1->SetMinSize( hbox1->GetMinSize() ); wxStaticText* rgbbox = new wxStaticText(panel, PREF_RGB_BOX, _("999,999,999")); cellboxes->rgbbox = rgbbox; wxBoxSizer* hbox2 = new wxBoxSizer(wxHORIZONTAL); hbox2->Add(rgbbox, 0, 0, 0); hbox2->SetMinSize( hbox2->GetMinSize() ); statebox->SetLabel(_(" ")); rgbbox->SetLabel(_(" ")); wxBoxSizer* botbox = new wxBoxSizer(wxHORIZONTAL); botbox->Add(new wxStaticText(panel, wxID_STATIC, _("State: ")), 0, wxALIGN_CENTER_VERTICAL, 0); botbox->Add(hbox1, 0, wxALIGN_CENTER_VERTICAL, 0); botbox->Add(20, 0, 0); botbox->Add(new wxStaticText(panel, wxID_STATIC, _("RGB: ")), 0, wxALIGN_CENTER_VERTICAL, 0); botbox->Add(hbox2, 0, wxALIGN_CENTER_VERTICAL, 0); botbox->AddStretchSpacer(); botbox->Add(iconcheck, 0, wxALIGN_CENTER_VERTICAL, 0); //!!! avoid wxMac bug -- can't click on bitmap buttons inside wxStaticBoxSizer //!!! wxStaticBox* sbox1 = new wxStaticBox(panel, wxID_ANY, _("Cell colors:")); //!!! wxBoxSizer* ssizer1 = new wxStaticBoxSizer(sbox1, wxVERTICAL); wxBoxSizer* ssizer1 = new wxBoxSizer(wxVERTICAL); ssizer1->AddSpacer(10); ssizer1->Add(gradbox, 0, wxLEFT | wxRIGHT, 0); ssizer1->AddSpacer(8); ssizer1->Add(cellboxes, 0, wxLEFT | wxRIGHT, 0); ssizer1->AddSpacer(8); ssizer1->Add(botbox, 1, wxGROW | wxLEFT | wxRIGHT, 0); ssizer1->AddSpacer(SBBOTGAP); wxStaticText* sbox2 = new wxStaticText(panel, wxID_STATIC, _("Global colors used by all algorithms:")); wxBoxSizer* ssizer2 = new wxBoxSizer(wxVERTICAL); ssizer2->Add(sbox2, 0, 0, 0); ssizer2->AddSpacer(10); ssizer2->Add(colorbox, 1, wxGROW | wxLEFT | wxRIGHT, 0); vbox->AddSpacer(5); vbox->Add(algobox, 1, wxGROW | wxLEFT | wxRIGHT, LRGAP); vbox->Add(ssizer1, 0, wxGROW | wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(15); vbox->Add(ssizer2, 0, wxGROW | wxLEFT | wxRIGHT, LRGAP); vbox->AddSpacer(2); topSizer->Add(vbox, 1, wxGROW | wxALIGN_CENTER | wxALL, 5); panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } // ----------------------------------------------------------------------------- wxPanel* PrefsDialog::CreateKeyboardPrefs(wxWindow* parent) { wxPanel* panel = new wxPanel(parent, wxID_ANY); wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); // make sure this is the first control added so it gets focus on a page change KeyComboCtrl* keycombo = new KeyComboCtrl(panel, PREF_KEYCOMBO, wxEmptyString, wxDefaultPosition, wxSize(230, wxDefaultCoord), wxTE_CENTER | wxTE_PROCESS_TAB | wxTE_PROCESS_ENTER // so enter key won't select OK on Windows #ifdef __WXOSX__ // avoid wxTE_RICH2 otherwise we see scroll bar ); #else | wxTE_RICH2 ); // better for Windows #endif wxArrayString actionChoices; for (int i = 0; i < MAX_ACTIONS; i++) { actionChoices.Add( wxString(GetActionName((action_id) i), wxConvLocal) ); } actionChoices[DO_OPENFILE] = _("Open Chosen File"); wxChoice* actionmenu = new wxChoice(panel, PREF_ACTION, wxDefaultPosition, wxDefaultSize, actionChoices); wxBoxSizer* hbox0 = new wxBoxSizer(wxHORIZONTAL); hbox0->Add(new wxStaticText(panel, wxID_STATIC, _("Type a key combination, then select the desired action:"))); wxBoxSizer* keybox = new wxBoxSizer(wxVERTICAL); keybox->Add(new wxStaticText(panel, wxID_STATIC, _("Key Combination")), 0, wxALIGN_CENTER, 0); keybox->AddSpacer(5); keybox->Add(keycombo, 0, wxALIGN_CENTER, 0); wxBoxSizer* actbox = new wxBoxSizer(wxVERTICAL); #if defined(__WXMAC__) && wxCHECK_VERSION(2,8,0) && !wxCHECK_VERSION(2,9,0) actbox->AddSpacer(2); #endif actbox->Add(new wxStaticText(panel, wxID_STATIC, _("Action")), 0, wxALIGN_CENTER, 0); actbox->AddSpacer(5); actbox->Add(actionmenu, 0, wxALIGN_CENTER, 0); wxBoxSizer* hbox1 = new wxBoxSizer(wxHORIZONTAL); hbox1->Add(keybox, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, LRGAP); hbox1->AddSpacer(15); hbox1->Add(actbox, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, LRGAP); wxButton* choose = new wxButton(panel, PREF_CHOOSE, _("Choose File...")); wxStaticText* filebox = new wxStaticText(panel, PREF_FILE_BOX, wxEmptyString); wxBoxSizer* hbox2 = new wxBoxSizer(wxHORIZONTAL); hbox2->Add(choose, 0, wxLEFT | wxRIGHT | wxALIGN_CENTER_VERTICAL, LRGAP); hbox2->Add(filebox, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, LRGAP); wxBoxSizer* midbox = new wxBoxSizer(wxVERTICAL); midbox->Add(hbox1, 0, wxLEFT | wxRIGHT, LRGAP); midbox->AddSpacer(15); midbox->Add(hbox2, 0, wxLEFT, LRGAP); wxString notes = _("Note:"); notes += _("\n- Different key combinations can be assigned to the same action."); notes += _("\n- The Escape key is reserved for hard-wired actions."); wxBoxSizer* hbox3 = new wxBoxSizer(wxHORIZONTAL); hbox3->Add(new wxStaticText(panel, wxID_STATIC, notes)); vbox->AddSpacer(5); vbox->Add(hbox0, 0, wxLEFT, LRGAP); vbox->AddSpacer(15); vbox->Add(midbox, 0, wxALIGN_CENTER, 0); vbox->AddSpacer(30); vbox->Add(hbox3, 0, wxLEFT, LRGAP); // initialize controls keycombo->ChangeValue( GetKeyCombo(currkey, currmods) ); actionmenu->SetSelection( keyaction[currkey][currmods].id ); UpdateChosenFile(); keycombo->SetFocus(); keycombo->SetSelection(ALL_TEXT); topSizer->Add(vbox, 1, wxGROW | wxALIGN_CENTER | wxALL, 5); panel->SetSizer(topSizer); topSizer->Fit(panel); return panel; } // ----------------------------------------------------------------------------- void PrefsDialog::UpdateChosenFile() { wxStaticText* filebox = (wxStaticText*) FindWindowById(PREF_FILE_BOX); if (filebox) { action_id action = keyaction[currkey][currmods].id; if (action == DO_OPENFILE) { // display current file name filebox->SetLabel(keyaction[currkey][currmods].file); } else { // clear file name; don't set keyaction[currkey][currmods].file empty // here because user might change their mind (TransferDataFromWindow // will eventually set the file empty) filebox->SetLabel(wxEmptyString); } } } // ----------------------------------------------------------------------------- void PrefsDialog::OnChoice(wxCommandEvent& event) { int id = event.GetId(); if ( id == PREF_ACTION ) { int i = event.GetSelection(); if (i >= 0 && i < MAX_ACTIONS) { action_id action = (action_id) i; keyaction[currkey][currmods].id = action; if ( action == DO_OPENFILE && keyaction[currkey][currmods].file.IsEmpty() ) { // call OnButton (which will call UpdateChosenFile) wxCommandEvent buttevt(wxEVT_COMMAND_BUTTON_CLICKED, PREF_CHOOSE); OnButton(buttevt); } else { UpdateChosenFile(); } } } else if ( id == PREF_ALGO_MENU1 ) { int i = event.GetSelection(); if (i >= 0 && i < NumAlgos() && i != algopos1) { // first update values for previous selection new_algomem[algopos1] = GetSpinVal(PREF_MAX_MEM); new_defbase[algopos1] = GetSpinVal(PREF_BASE_STEP); algopos1 = i; // show values for new selection wxSpinCtrl* s1 = (wxSpinCtrl*) FindWindowById(PREF_MAX_MEM); wxSpinCtrl* s2 = (wxSpinCtrl*) FindWindowById(PREF_BASE_STEP); if (s1 && s2) { s1->SetValue(new_algomem[algopos1]); s2->SetValue(new_defbase[algopos1]); wxWindow* focus = FindFocus(); #ifdef __WXMAC__ // FindFocus returns pointer to text ctrl wxTextCtrl* t1 = s1->GetText(); wxTextCtrl* t2 = s2->GetText(); if (focus == t1) { s1->SetFocus(); s1->SetSelection(ALL_TEXT); } if (focus == t2) { s2->SetFocus(); s2->SetSelection(ALL_TEXT); } #else // probably pointless -- pop-up menu has focus on Win & Linux??? if (focus == s1) { s1->SetFocus(); s1->SetSelection(ALL_TEXT); } if (focus == s2) { s2->SetFocus(); s2->SetSelection(ALL_TEXT); } #endif } // change comments depending on whether or not algo uses hashing wxStaticText* membox = (wxStaticText*) FindWindowById(PREF_MEM_NOTE); wxStaticText* stepbox = (wxStaticText*) FindWindowById(PREF_STEP_NOTE); if (membox && stepbox) { if (algoinfo[algopos1]->canhash) { membox->SetLabel(HASH_MEM_NOTE); stepbox->SetLabel(HASH_STEP_NOTE); } else { membox->SetLabel(NONHASH_MEM_NOTE); stepbox->SetLabel(NONHASH_STEP_NOTE); } } } } else if ( id == PREF_ALGO_MENU2 ) { int i = event.GetSelection(); if (i >= 0 && i < NumAlgos() && i != coloralgo) { coloralgo = i; AlgoData* ad = algoinfo[coloralgo]; // update colors in some bitmap buttons UpdateButtonColor(PREF_STATUS_BUTT, ad->statusrgb); UpdateButtonColor(PREF_FROM_BUTT, ad->fromrgb); UpdateButtonColor(PREF_TO_BUTT, ad->torgb); gradstates = ad->maxstates; UpdateScrollBar(); gradcheck->SetValue(ad->gradient); scrollbar->Enable(ad->gradient); frombutt->Enable(ad->gradient); tobutt->Enable(ad->gradient); cellboxes->Refresh(false); } } } // ----------------------------------------------------------------------------- void ChooseTextEditor(wxWindow* parent, wxString& result) { #ifdef __WXMSW__ wxString filetypes = _("Applications (*.exe)|*.exe"); #elif defined(__WXMAC__) wxString filetypes = _("Applications (*.app)|*.app"); #else // assume Linux wxString filetypes = _("All files (*)|*"); #endif wxFileDialog opendlg(parent, _("Choose a text editor"), wxEmptyString, wxEmptyString, filetypes, wxFD_OPEN | wxFD_FILE_MUST_EXIST); #ifdef __WXMSW__ opendlg.SetDirectory(_("C:\\Program Files")); #elif defined(__WXMAC__) opendlg.SetDirectory(_("/Applications")); #else // assume Linux opendlg.SetDirectory(_("/usr/bin")); #endif if ( opendlg.ShowModal() == wxID_OK ) { result = opendlg.GetPath(); } else { result = wxEmptyString; } } // ----------------------------------------------------------------------------- void PrefsDialog::OnButton(wxCommandEvent& event) { int id = event.GetId(); if ( id == PREF_CHOOSE ) { // ask user to choose an appropriate file wxString filetypes = _("All files (*)|*"); filetypes += _("|Pattern (*.rle;*.mc;*.lif)|*.rle;*.mc;*.lif"); filetypes += _("|Script (*.pl;*.py)|*.pl;*.py"); filetypes += _("|HTML (*.html;*.htm)|*.html;*.htm"); wxFileDialog opendlg(this, _("Choose a pattern, script or HTML file"), choosedir, wxEmptyString, filetypes, wxFD_OPEN | wxFD_FILE_MUST_EXIST); #ifdef __WXGTK__ // choosedir is ignored above (bug in wxGTK 2.8.0???) opendlg.SetDirectory(choosedir); #endif if ( opendlg.ShowModal() == wxID_OK ) { wxFileName fullpath( opendlg.GetPath() ); choosedir = fullpath.GetPath(); wxString path = opendlg.GetPath(); if (path.StartsWith(gollydir)) { // remove gollydir from start of path path.erase(0, gollydir.length()); } keyaction[currkey][currmods].file = path; keyaction[currkey][currmods].id = DO_OPENFILE; wxChoice* actionmenu = (wxChoice*) FindWindowById(PREF_ACTION); if (actionmenu) { actionmenu->SetSelection(DO_OPENFILE); } } UpdateChosenFile(); } else if ( id == PREF_EDITOR_BUTT ) { // ask user to choose a text editor wxString result; ChooseTextEditor(this, result); if ( !result.IsEmpty() ) { neweditor = result; wxStaticText* editorbox = (wxStaticText*) FindWindowById(PREF_EDITOR_BOX); if (editorbox) { editorbox->SetLabel(neweditor); } } } else if ( id == PREF_DOWNLOAD_BUTT ) { // ask user to choose folder for downloaded files wxDirDialog dirdlg(this, _("Choose a folder for downloaded files"), newdownloaddir, wxDD_NEW_DIR_BUTTON); if ( dirdlg.ShowModal() == wxID_OK ) { wxString newdir = dirdlg.GetPath(); if (newdir.Last() != wxFILE_SEP_PATH) newdir += wxFILE_SEP_PATH; if (newdownloaddir != newdir) { newdownloaddir = newdir; wxStaticText* dirbox = (wxStaticText*) FindWindowById(PREF_DOWNLOAD_BOX); if (dirbox) { dirbox->SetLabel(newdownloaddir); } } } } else if ( id == PREF_RULES_BUTT ) { // ask user to choose folder for their rules wxDirDialog dirdlg(this, _("Choose a folder for your rules"), newuserrules, wxDD_NEW_DIR_BUTTON); if ( dirdlg.ShowModal() == wxID_OK ) { wxString newdir = dirdlg.GetPath(); if (newdir.Last() != wxFILE_SEP_PATH) newdir += wxFILE_SEP_PATH; if (newuserrules != newdir) { newuserrules = newdir; wxStaticText* dirbox = (wxStaticText*) FindWindowById(PREF_RULES_BOX); if (dirbox) { dirbox->SetLabel(newuserrules); } } } } event.Skip(); // need this so other buttons work correctly } // ----------------------------------------------------------------------------- void PrefsDialog::OnCheckBoxClicked(wxCommandEvent& event) { int id = event.GetId(); if ( id == PREF_SHOW_BOLD ) { // enable/disable PREF_BOLD_SPACING spin control wxCheckBox* checkbox = (wxCheckBox*) FindWindow(PREF_SHOW_BOLD); wxSpinCtrl* spinctrl = (wxSpinCtrl*) FindWindow(PREF_BOLD_SPACING); if (checkbox && spinctrl) { bool ticked = checkbox->GetValue(); spinctrl->Enable(ticked); if (ticked) spinctrl->SetFocus(); } } else if ( id == PREF_GRADIENT_CHECK ) { AlgoData* ad = algoinfo[coloralgo]; ad->gradient = gradcheck->GetValue() == 1; scrollbar->Enable(ad->gradient); frombutt->Enable(ad->gradient); tobutt->Enable(ad->gradient); cellboxes->Refresh(false); } else if ( id == PREF_ICON_CHECK ) { showicons = iconcheck->GetValue() == 1; cellboxes->Refresh(false); } } // ----------------------------------------------------------------------------- void PrefsDialog::UpdateButtonColor(int id, wxColor& rgb) { wxBitmapButton* bb = (wxBitmapButton*) FindWindow(id); if (bb) { wxBitmap bitmap(BITMAP_WD, BITMAP_HT); wxMemoryDC dc; dc.SelectObject(bitmap); wxRect rect(0, 0, BITMAP_WD, BITMAP_HT); wxBrush brush(rgb); FillRect(dc, rect, brush); dc.SelectObject(wxNullBitmap); bb->SetBitmapLabel(bitmap); bb->Refresh(); } } // ----------------------------------------------------------------------------- void PrefsDialog::ChangeButtonColor(int id, wxColor& rgb) { wxColourData data; data.SetChooseFull(true); // for Windows data.SetColour(rgb); wxColourDialog dialog(this, &data); if ( dialog.ShowModal() == wxID_OK ) { wxColourData retData = dialog.GetColourData(); wxColour c = retData.GetColour(); if (rgb != c) { // change given color rgb.Set(c.Red(), c.Green(), c.Blue()); // also change color of bitmap in corresponding button UpdateButtonColor(id, rgb); if (id == PREF_FROM_BUTT || id == PREF_TO_BUTT) { cellboxes->Refresh(false); } } } } // ----------------------------------------------------------------------------- void PrefsDialog::OnColorButton(wxCommandEvent& event) { int id = event.GetId(); if ( id == PREF_STATUS_BUTT ) { ChangeButtonColor(id, algoinfo[coloralgo]->statusrgb); } else if ( id == PREF_FROM_BUTT ) { ChangeButtonColor(id, algoinfo[coloralgo]->fromrgb); } else if ( id == PREF_TO_BUTT ) { ChangeButtonColor(id, algoinfo[coloralgo]->torgb); } else if ( id == PREF_SELECT_BUTT ) { ChangeButtonColor(id, *selectrgb); } else if ( id == PREF_PASTE_BUTT ) { ChangeButtonColor(id, *pastergb); } else if ( id == PREF_BORDER_BUTT ) { ChangeButtonColor(id, *borderrgb); } else { // process other buttons like Cancel and OK event.Skip(); } } // ----------------------------------------------------------------------------- void PrefsDialog::UpdateScrollBar() { AlgoData* ad = algoinfo[coloralgo]; scrollbar->SetScrollbar(gradstates - ad->minstates, 1, ad->maxstates - ad->minstates + 1, // range PAGESIZE, true); } // ----------------------------------------------------------------------------- void PrefsDialog::OnScroll(wxScrollEvent& event) { WXTYPE type = event.GetEventType(); if (type == wxEVT_SCROLL_LINEUP) { gradstates--; if (gradstates < algoinfo[coloralgo]->minstates) gradstates = algoinfo[coloralgo]->minstates; cellboxes->Refresh(false); } else if (type == wxEVT_SCROLL_LINEDOWN) { gradstates++; if (gradstates > algoinfo[coloralgo]->maxstates) gradstates = algoinfo[coloralgo]->maxstates; cellboxes->Refresh(false); } else if (type == wxEVT_SCROLL_PAGEUP) { gradstates -= PAGESIZE; if (gradstates < algoinfo[coloralgo]->minstates) gradstates = algoinfo[coloralgo]->minstates; cellboxes->Refresh(false); } else if (type == wxEVT_SCROLL_PAGEDOWN) { gradstates += PAGESIZE; if (gradstates > algoinfo[coloralgo]->maxstates) gradstates = algoinfo[coloralgo]->maxstates; cellboxes->Refresh(false); } else if (type == wxEVT_SCROLL_THUMBTRACK) { gradstates = algoinfo[coloralgo]->minstates + event.GetPosition(); if (gradstates < algoinfo[coloralgo]->minstates) gradstates = algoinfo[coloralgo]->minstates; if (gradstates > algoinfo[coloralgo]->maxstates) gradstates = algoinfo[coloralgo]->maxstates; cellboxes->Refresh(false); } else if (type == wxEVT_SCROLL_THUMBRELEASE) { UpdateScrollBar(); } } // ----------------------------------------------------------------------------- bool PrefsDialog::GetCheckVal(long id) { wxCheckBox* checkbox = (wxCheckBox*) FindWindow(id); if (checkbox) { return checkbox->GetValue(); } else { Warning(_("Bug in GetCheckVal!")); return false; } } // ----------------------------------------------------------------------------- int PrefsDialog::GetChoiceVal(long id) { wxChoice* choice = (wxChoice*) FindWindow(id); if (choice) { return choice->GetSelection(); } else { Warning(_("Bug in GetChoiceVal!")); return 0; } } // ----------------------------------------------------------------------------- int PrefsDialog::GetRadioVal(long firstid, int numbuttons) { for (int i = 0; i < numbuttons; i++) { wxRadioButton* radio = (wxRadioButton*) FindWindow(firstid + i); if (radio->GetValue()) return i; } Warning(_("Bug in GetRadioVal!")); return 0; } // ----------------------------------------------------------------------------- int PrefsDialog::GetSpinVal(long id) { wxSpinCtrl* spinctrl = (wxSpinCtrl*) FindWindow(id); if (spinctrl) { return spinctrl->GetValue(); } else { Warning(_("Bug in GetSpinVal!")); return 0; } } // ----------------------------------------------------------------------------- bool PrefsDialog::BadSpinVal(int id, int minval, int maxval, const wxString& prefix) { wxSpinCtrl* spinctrl = (wxSpinCtrl*) FindWindow(id); // spinctrl->GetValue() always returns a value within range even if // the text ctrl doesn't contain a valid number -- yuk! int i = spinctrl->GetValue(); if (i < minval || i > maxval) { wxString msg; msg.Printf(_("%s must be from %d to %d."), prefix.c_str(), minval, maxval); Warning(msg); spinctrl->SetFocus(); spinctrl->SetSelection(ALL_TEXT); return true; } else { return false; } } // ----------------------------------------------------------------------------- bool PrefsDialog::ValidatePage() { // validate all spin control values on current page if (currpage == FILE_PAGE) { if ( BadSpinVal(PREF_MAX_PATTERNS, 1, MAX_RECENT, _("Maximum number of recent patterns")) ) return false; if ( BadSpinVal(PREF_MAX_SCRIPTS, 1, MAX_RECENT, _("Maximum number of recent scripts")) ) return false; } else if (currpage == EDIT_PAGE) { if ( BadSpinVal(PREF_RANDOM_FILL, 1, 100, _("Random fill percentage")) ) return false; } else if (currpage == CONTROL_PAGE) { if ( BadSpinVal(PREF_MAX_MEM, MIN_MEM_MB, MAX_MEM_MB, _("Maximum memory")) ) return false; if ( BadSpinVal(PREF_BASE_STEP, 2, MAX_BASESTEP, _("Default base step")) ) return false; if ( BadSpinVal(PREF_MIN_DELAY, 0, MAX_DELAY, _("Minimum delay")) ) return false; if ( BadSpinVal(PREF_MAX_DELAY, 0, MAX_DELAY, _("Maximum delay")) ) return false; } else if (currpage == VIEW_PAGE) { if ( BadSpinVal(PREF_BOLD_SPACING, 2, MAX_SPACING, _("Spacing of bold grid lines")) ) return false; if ( BadSpinVal(PREF_THUMB_RANGE, 2, MAX_THUMBRANGE, _("Thumb scrolling range")) ) return false; } else if (currpage == LAYER_PAGE) { if ( BadSpinVal(PREF_OPACITY, 1, 100, _("Percentage opacity")) ) return false; if ( BadSpinVal(PREF_TILE_BORDER, 1, 10, _("Tile border thickness")) ) return false; } else if (currpage == COLOR_PAGE) { // no spin ctrls on this page } else if (currpage == KEYBOARD_PAGE) { // no spin ctrls on this page } else { Warning(_("Bug in ValidatePage!")); return false; } return true; } // ----------------------------------------------------------------------------- void PrefsDialog::OnPageChanging(wxNotebookEvent& event) { if (ignore_page_event) return; // validate current page and veto change if invalid if (!ValidatePage()) event.Veto(); } // ----------------------------------------------------------------------------- void PrefsDialog::OnPageChanged(wxNotebookEvent& event) { if (ignore_page_event) return; currpage = event.GetSelection(); #ifdef __WXMSW__ // ensure key combo box has focus if (currpage == KEYBOARD_PAGE) { KeyComboCtrl* keycombo = (KeyComboCtrl*) FindWindowById(PREF_KEYCOMBO); if (keycombo) { keycombo->SetFocus(); keycombo->SetSelection(ALL_TEXT); } } #endif } // ----------------------------------------------------------------------------- bool PrefsDialog::TransferDataFromWindow() { if (!ValidatePage()) return false; // set global prefs to current control values // FILE_PAGE newremovesel = GetCheckVal(PREF_NEW_REM_SEL); newcursindex = GetChoiceVal(PREF_NEW_CURSOR); newmag = GetChoiceVal(PREF_NEW_SCALE); openremovesel = GetCheckVal(PREF_OPEN_REM_SEL); opencursindex = GetChoiceVal(PREF_OPEN_CURSOR); maxpatterns = GetSpinVal(PREF_MAX_PATTERNS); maxscripts = GetSpinVal(PREF_MAX_SCRIPTS); texteditor = neweditor; downloaddir = newdownloaddir; // EDIT_PAGE randomfill = GetSpinVal(PREF_RANDOM_FILL); canchangerule = GetRadioVal(PREF_PASTE_0, 3); scrollpencil = GetCheckVal(PREF_SCROLL_PENCIL); scrollcross = GetCheckVal(PREF_SCROLL_CROSS); scrollhand = GetCheckVal(PREF_SCROLL_HAND); allowbeep = GetCheckVal(PREF_BEEP); // CONTROL_PAGE new_algomem[algopos1] = GetSpinVal(PREF_MAX_MEM); new_defbase[algopos1] = GetSpinVal(PREF_BASE_STEP); for (int i = 0; i < NumAlgos(); i++) { algoinfo[i]->algomem = new_algomem[i]; algoinfo[i]->defbase = new_defbase[i]; } mindelay = GetSpinVal(PREF_MIN_DELAY); maxdelay = GetSpinVal(PREF_MAX_DELAY); userrules = newuserrules; // VIEW_PAGE #if wxUSE_TOOLTIPS showtips = GetCheckVal(PREF_SHOW_TIPS); wxToolTip::Enable(showtips); #endif restoreview = GetCheckVal(PREF_RESTORE); mathcoords = GetCheckVal(PREF_Y_UP); showboldlines = GetCheckVal(PREF_SHOW_BOLD); boldspacing = GetSpinVal(PREF_BOLD_SPACING); mingridindex = GetChoiceVal(PREF_MIN_GRID_SCALE); mousewheelmode = GetChoiceVal(PREF_MOUSE_WHEEL); thumbrange = GetSpinVal(PREF_THUMB_RANGE); controlspos = GetRadioVal(PREF_NO_CONTROLS, 5); // LAYER_PAGE opacity = GetSpinVal(PREF_OPACITY); tileborder = GetSpinVal(PREF_TILE_BORDER); askonnew = GetCheckVal(PREF_ASK_NEW); askonload = GetCheckVal(PREF_ASK_LOAD); askondelete = GetCheckVal(PREF_ASK_DELETE); askonquit = GetCheckVal(PREF_ASK_QUIT); // COLOR_PAGE // no need to validate anything // KEYBOARD_PAGE // go thru keyaction table and make sure the file field is empty // if the action isn't DO_OPENFILE for (int key = 0; key < MAX_KEYCODES; key++) for (int modset = 0; modset < MAX_MODS; modset++) if ( keyaction[key][modset].id != DO_OPENFILE && !keyaction[key][modset].file.IsEmpty() ) keyaction[key][modset].file = wxEmptyString; // update globals corresponding to some wxChoice menu selections mingridmag = mingridindex + 2; newcurs = IndexToCursor(newcursindex); opencurs = IndexToCursor(opencursindex); return true; } // ----------------------------------------------------------------------------- // class for saving and restoring AlgoData color info in ChangePrefs() class SaveColorInfo { public: SaveColorInfo(int algo) { AlgoData* ad = algoinfo[algo]; statusrgb = ad->statusrgb; gradient = ad->gradient; fromrgb = ad->fromrgb; torgb = ad->torgb; for (int i = 0; i < ad->maxstates; i++) { algor[i] = ad->algor[i]; algog[i] = ad->algog[i]; algob[i] = ad->algob[i]; } } void RestoreColorInfo(int algo) { AlgoData* ad = algoinfo[algo]; ad->statusrgb = statusrgb; ad->gradient = gradient; ad->fromrgb = fromrgb; ad->torgb = torgb; for (int i = 0; i < ad->maxstates; i++) { ad->algor[i] = algor[i]; ad->algog[i] = algog[i]; ad->algob[i] = algob[i]; } } bool ColorInfoChanged(int algo) { AlgoData* ad = algoinfo[algo]; // ignore ad->statusrgb if (ad->gradient != gradient) return true; if (gradient && ad->fromrgb != fromrgb) return true; if (gradient && ad->torgb != torgb) return true; for (int i = 0; i < ad->maxstates; i++) { if (ad->algor[i] != algor[i]) return true; if (ad->algog[i] != algog[i]) return true; if (ad->algob[i] != algob[i]) return true; } // get here if there was no change return false; } // this must match color info in AlgoData wxColor statusrgb; bool gradient; wxColor fromrgb; wxColor torgb; unsigned char algor[256]; unsigned char algog[256]; unsigned char algob[256]; }; // ----------------------------------------------------------------------------- bool ChangePrefs(const wxString& page) { // save current keyboard shortcuts so we can restore them or detect a change action_info savekeyaction[MAX_KEYCODES][MAX_MODS]; for (int key = 0; key < MAX_KEYCODES; key++) for (int modset = 0; modset < MAX_MODS; modset++) savekeyaction[key][modset] = keyaction[key][modset]; bool wasswapped = swapcolors; if (swapcolors) { swapcolors = false; InvertCellColors(); mainptr->UpdateEverything(); } // save current color info so we can restore it if user cancels changes wxColor save_selectrgb = *selectrgb; wxColor save_pastergb = *pastergb; wxColor save_borderrgb = *borderrgb; SaveColorInfo* save_info[MAX_ALGOS]; for (int i = 0; i < NumAlgos(); i++) { save_info[i] = new SaveColorInfo(i); } // save showicons option in case user cancels dialog bool saveshowicons = showicons; // save the default base step for the current layer's algo so we can detect a change int old_defbase = algoinfo[currlayer->algtype]->defbase; PrefsDialog dialog(mainptr, page); bool result; if (dialog.ShowModal() == wxID_OK) { // TransferDataFromWindow has validated and updated all global prefs; // if a keyboard shortcut changed then update menu item accelerators for (int key = 0; key < MAX_KEYCODES; key++) for (int modset = 0; modset < MAX_MODS; modset++) if (savekeyaction[key][modset].id != keyaction[key][modset].id) { // first update accelerator array UpdateAcceleratorStrings(); mainptr->UpdateMenuAccelerators(); goto done; } done: // if the default base step for the current layer's algo changed // then reset the current base step (this should result in less confusion) if (old_defbase != algoinfo[currlayer->algtype]->defbase) { currlayer->currbase = algoinfo[currlayer->algtype]->defbase; mainptr->SetGenIncrement(); } // if the default colors/icons for the current layer's algo changed // then reset the current layer's colors (and any clones) if (save_info[currlayer->algtype]->ColorInfoChanged(currlayer->algtype)) { UpdateLayerColors(); } result = true; } else { // user hit Cancel, so restore keyaction array in case it was changed for (int key = 0; key < MAX_KEYCODES; key++) for (int modset = 0; modset < MAX_MODS; modset++) keyaction[key][modset] = savekeyaction[key][modset]; // restore color info saved above *selectrgb = save_selectrgb; *pastergb = save_pastergb; *borderrgb = save_borderrgb; for (int i = 0; i < NumAlgos(); i++) { save_info[i]->RestoreColorInfo(i); } // restore showicons option showicons = saveshowicons; result = false; } // update colors for global brushes and pens SetBrushesAndPens(); for (int i = 0; i < NumAlgos(); i++) { delete save_info[i]; } if (wasswapped) { swapcolors = true; InvertCellColors(); // let caller do this // mainptr->UpdateEverything(); } return result; } golly-2.5-src/gui-wx/wxpython.cpp0000644000175100001440000031464312156145314014052 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /* Golly uses an embedded Python interpreter to execute scripts. Here is the official Python copyright notice: Copyright (c) 2001-2005 Python Software Foundation. All Rights Reserved. Copyright (c) 2000 BeOpen.com. All Rights Reserved. Copyright (c) 1995-2001 Corporation for National Research Initiatives. All Rights Reserved. Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam. All Rights Reserved. */ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/filename.h" // for wxFileName #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "readpattern.h" #include "writepattern.h" #include "wxgolly.h" // for wxGetApp, mainptr, viewptr, statusptr #include "wxmain.h" // for mainptr->... #include "wxselect.h" // for Selection #include "wxview.h" // for viewptr->... #include "wxstatus.h" // for statusptr->... #include "wxutils.h" // for Warning, Note, GetString, etc #include "wxprefs.h" // for pythonlib, gollydir, etc #include "wxinfo.h" // for ShowInfo #include "wxhelp.h" // for ShowHelp #include "wxundo.h" // for currlayer->undoredo->... #include "wxalgos.h" // for *_ALGO, CreateNewUniverse, etc #include "wxlayer.h" // for AddLayer, currlayer, currindex, etc #include "wxscript.h" // for inscript, abortmsg, GSF_*, etc #include "wxpython.h" // ============================================================================= // On Windows and Linux we need to load the Python library at runtime // so Golly will start up even if Python isn't installed. // Based on code from Mahogany (mahogany.sourceforge.net) and Vim (www.vim.org). #ifdef __WXMAC__ // avoid warnings (only if using CMake, for some unknown reason) #undef SIZEOF_LONG #undef SIZEOF_SIZE_T #undef SIZEOF_VOID_P #else // load Python lib at runtime #define USE_PYTHON_DYNAMIC #ifdef __UNIX__ // avoid warning on Linux #undef _POSIX_C_SOURCE #undef _XOPEN_SOURCE #endif #ifdef __WXMSW__ // avoid warning on Windows #undef HAVE_SSIZE_T #endif // prevent Python.h from adding Python library to link settings #define USE_DL_EXPORT #endif // workaround for hard-linking to missing python_d.lib #ifdef _DEBUG #undef _DEBUG #include #define _DEBUG #else #include #endif #ifdef USE_PYTHON_DYNAMIC #ifndef __WXMAC__ // avoid warning on Windows/Linux #undef PyRun_SimpleString #endif #include "wx/dynlib.h" // for wxDynamicLibrary // declare G_* wrappers for the functions we want to use from Python lib extern "C" { // startup/shutdown void(*G_Py_Initialize)(void) = NULL; #if defined(__LP64__) || defined(__amd64__) || defined(_WIN64) PyObject*(*G_Py_InitModule4_64)(char*, struct PyMethodDef*, char*, PyObject*, int) = NULL; #else PyObject*(*G_Py_InitModule4)(char*, struct PyMethodDef*, char*, PyObject*, int) = NULL; #endif void(*G_Py_Finalize)(void) = NULL; // errors PyObject*(*G_PyErr_Occurred)(void) = NULL; void(*G_PyErr_SetString)(PyObject*, const char*) = NULL; // ints long(*G_PyInt_AsLong)(PyObject*) = NULL; PyObject*(*G_PyInt_FromLong)(long) = NULL; PyTypeObject* G_PyInt_Type = NULL; // lists PyObject*(*G_PyList_New)(int size) = NULL; int(*G_PyList_Append)(PyObject*, PyObject*) = NULL; PyObject*(*G_PyList_GetItem)(PyObject*, int) = NULL; int(*G_PyList_SetItem)(PyObject*, int, PyObject*) = NULL; int(*G_PyList_Size)(PyObject*) = NULL; PyTypeObject* G_PyList_Type = NULL; // tuples PyObject*(*G_PyTuple_New)(int) = NULL; int(*G_PyTuple_SetItem)(PyObject*, int, PyObject*) = NULL; PyObject*(*G_PyTuple_GetItem)(PyObject*, int) = NULL; // misc int(*G_PyArg_Parse)(PyObject*, char*, ...) = NULL; int(*G_PyArg_ParseTuple)(PyObject*, char*, ...) = NULL; PyObject*(*G_PyImport_ImportModule)(const char*) = NULL; PyObject*(*G_PyDict_GetItemString)(PyObject*, const char*) = NULL; PyObject*(*G_PyModule_GetDict)(PyObject*) = NULL; PyObject*(*G_Py_BuildValue)(char*, ...) = NULL; PyObject*(*G_Py_FindMethod)(PyMethodDef[], PyObject*, char*) = NULL; int(*G_PyRun_SimpleString)(const char*) = NULL; PyObject* G__Py_NoneStruct = NULL; // used by Py_None } // redefine the Py* functions to their equivalent G_* wrappers #define Py_Initialize G_Py_Initialize #if defined(__LP64__) || defined(__amd64__) || defined(_WIN64) #define Py_InitModule4_64 G_Py_InitModule4_64 #else #define Py_InitModule4 G_Py_InitModule4 #endif #define Py_Finalize G_Py_Finalize #define PyErr_Occurred G_PyErr_Occurred #define PyErr_SetString G_PyErr_SetString #define PyInt_AsLong G_PyInt_AsLong #define PyInt_FromLong G_PyInt_FromLong #define PyInt_Type (*G_PyInt_Type) #define PyList_New G_PyList_New #define PyList_Append G_PyList_Append #define PyList_GetItem G_PyList_GetItem #define PyList_SetItem G_PyList_SetItem #define PyList_Size G_PyList_Size #define PyList_Type (*G_PyList_Type) #define PyTuple_New G_PyTuple_New #define PyTuple_SetItem G_PyTuple_SetItem #define PyTuple_GetItem G_PyTuple_GetItem #define Py_BuildValue G_Py_BuildValue #define PyArg_Parse G_PyArg_Parse #define PyArg_ParseTuple G_PyArg_ParseTuple #define PyDict_GetItemString G_PyDict_GetItemString #define PyImport_ImportModule G_PyImport_ImportModule #define PyModule_GetDict G_PyModule_GetDict #define PyRun_SimpleString G_PyRun_SimpleString #define _Py_NoneStruct (*G__Py_NoneStruct) #ifdef __WXMSW__ #define PYTHON_PROC FARPROC #else #define PYTHON_PROC void * #endif #define PYTHON_FUNC(func) { _T(#func), (PYTHON_PROC*)&G_ ## func }, // store function names and their addresses in Python lib static struct PythonFunc { const wxChar* name; // function name PYTHON_PROC* ptr; // function pointer } pythonFuncs[] = { PYTHON_FUNC(Py_Initialize) #if defined(__LP64__) || defined(__amd64__) || defined(_WIN64) PYTHON_FUNC(Py_InitModule4_64) #else PYTHON_FUNC(Py_InitModule4) #endif PYTHON_FUNC(Py_Finalize) PYTHON_FUNC(PyErr_Occurred) PYTHON_FUNC(PyErr_SetString) PYTHON_FUNC(PyInt_AsLong) PYTHON_FUNC(PyInt_FromLong) PYTHON_FUNC(PyInt_Type) PYTHON_FUNC(PyList_New) PYTHON_FUNC(PyList_Append) PYTHON_FUNC(PyList_GetItem) PYTHON_FUNC(PyList_SetItem) PYTHON_FUNC(PyList_Size) PYTHON_FUNC(PyList_Type) PYTHON_FUNC(PyTuple_New) PYTHON_FUNC(PyTuple_SetItem) PYTHON_FUNC(PyTuple_GetItem) PYTHON_FUNC(Py_BuildValue) PYTHON_FUNC(PyArg_Parse) PYTHON_FUNC(PyArg_ParseTuple) PYTHON_FUNC(PyDict_GetItemString) PYTHON_FUNC(PyImport_ImportModule) PYTHON_FUNC(PyModule_GetDict) PYTHON_FUNC(PyRun_SimpleString) PYTHON_FUNC(_Py_NoneStruct) { _T(""), NULL } }; // imported exception objects -- we can't import the symbols from the // lib as this can cause errors (importing data symbols is not reliable) static PyObject* imp_PyExc_RuntimeError = NULL; static PyObject* imp_PyExc_KeyboardInterrupt = NULL; #define PyExc_RuntimeError imp_PyExc_RuntimeError #define PyExc_KeyboardInterrupt imp_PyExc_KeyboardInterrupt static void GetPythonExceptions() { PyObject* exmod = PyImport_ImportModule("exceptions"); PyObject* exdict = PyModule_GetDict(exmod); PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError"); PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt"); Py_XINCREF(PyExc_RuntimeError); Py_XINCREF(PyExc_KeyboardInterrupt); Py_XDECREF(exmod); } // handle for Python lib static wxDllType pythondll = NULL; static void FreePythonLib() { if ( pythondll ) { wxDynamicLibrary::Unload(pythondll); pythondll = NULL; } } static bool LoadPythonLib() { // load the Python library wxDynamicLibrary dynlib; // don't log errors in here wxLogNull noLog; // wxDL_GLOBAL corresponds to RTLD_GLOBAL on Linux (ignored on Windows) and // is needed to avoid an ImportError when importing some modules (eg. time) while ( !dynlib.Load(pythonlib, wxDL_NOW | wxDL_VERBATIM | wxDL_GLOBAL) ) { // prompt user for a different Python library; // on Windows pythonlib should be something like "python27.dll" // and on Linux it should be something like "libpython2.7.so" Beep(); wxString str = _("If Python isn't installed then you'll have to Cancel,"); str += _("\notherwise change the version numbers to match the"); str += _("\nversion installed on your system and try again."); #ifdef __WXMSW__ str += _("\n\nIf that fails, search your system for a python*.dll"); str += _("\nfile and enter the full path to that file."); #endif wxTextEntryDialog dialog( wxGetActiveWindow(), str, _("Could not load the Python library"), pythonlib, wxOK | wxCANCEL ); if (dialog.ShowModal() == wxID_OK) { pythonlib = dialog.GetValue(); } else { return false; } } if ( dynlib.IsLoaded() ) { // load all functions named in pythonFuncs void* funcptr; PythonFunc* pf = pythonFuncs; while ( pf->name[0] ) { funcptr = dynlib.GetSymbol(pf->name); if ( !funcptr ) { wxString err = _("The Python library does not have this symbol:\n"); err += pf->name; Warning(err); return false; } *(pf++->ptr) = (PYTHON_PROC)funcptr; } pythondll = dynlib.Detach(); } if ( pythondll == NULL ) { // should never happen Warning(_("Oh dear, the Python library is not loaded!")); } return pythondll != NULL; } #endif // USE_PYTHON_DYNAMIC // ============================================================================= // some useful macros #define RETURN_NONE Py_INCREF(Py_None); return Py_None #define PYTHON_ERROR(msg) { PyErr_SetString(PyExc_RuntimeError, msg); return NULL; } #define CheckRGB(r,g,b,cmd) \ if (r < 0 || r > 255 || g < 0 || g > 255 || g < 0 || g > 255) { \ char msg[128]; \ sprintf(msg, "Bad rgb value in %s: %d,%d,%d", cmd, r, g, b); \ PYTHON_ERROR(msg); \ } #ifdef __WXMAC__ // use decomposed UTF8 so fopen will work #define FILENAME wxString(filename,wxConvLocal).fn_str() #else #define FILENAME filename #endif // ----------------------------------------------------------------------------- void AbortPythonScript() { // raise an exception with a special message PyErr_SetString(PyExc_KeyboardInterrupt, abortmsg); } // ----------------------------------------------------------------------------- bool PythonScriptAborted() { if (allowcheck) wxGetApp().Poller()->checkevents(); // if user hit escape key then AbortPythonScript has raised an exception // and PyErr_Occurred will be true; if so, caller must return NULL // otherwise Python can abort app with this message: // Fatal Python error: unexpected exception during garbage collection return PyErr_Occurred() != NULL; } // ----------------------------------------------------------------------------- static void AddTwoInts(PyObject* list, long x, long y) { // append two ints to the given list -- these ints can be: // the x,y coords of a live cell in a one-state cell list, // or the x,y location of a rect, or the wd,ht of a rect PyObject* xo = PyInt_FromLong(x); PyObject* yo = PyInt_FromLong(y); PyList_Append(list, xo); PyList_Append(list, yo); // must decrement references to avoid Python memory leak Py_DECREF(xo); Py_DECREF(yo); } // ----------------------------------------------------------------------------- static void AddState(PyObject* list, long s) { // append cell state (possibly dead) to a multi-state cell list PyObject* so = PyInt_FromLong(s); PyList_Append(list, so); Py_DECREF(so); } // ----------------------------------------------------------------------------- static void AddPadding(PyObject* list) { // assume list is multi-state and add an extra int if necessary so the list // has an odd number of ints (this is how we distinguish multi-state lists // from one-state lists -- the latter always have an even number of ints) int len = PyList_Size(list); if (len == 0) return; // always return [] rather than [0] if ((len & 1) == 0) { PyObject* padding = PyInt_FromLong(0L); PyList_Append(list, padding); Py_DECREF(padding); } } // ----------------------------------------------------------------------------- static void AddCellColor(PyObject* list, long s, long r, long g, long b) { // append state,r,g,b values to given list PyObject* so = PyInt_FromLong(s); PyObject* ro = PyInt_FromLong(r); PyObject* go = PyInt_FromLong(g); PyObject* bo = PyInt_FromLong(b); PyList_Append(list, so); PyList_Append(list, ro); PyList_Append(list, go); PyList_Append(list, bo); // must decrement references to avoid Python memory leak Py_DECREF(so); Py_DECREF(ro); Py_DECREF(go); Py_DECREF(bo); } // ----------------------------------------------------------------------------- static bool ExtractCellList(PyObject* list, lifealgo* universe, bool shift = false) { // extract cell list from given universe if ( !universe->isEmpty() ) { bigint top, left, bottom, right; universe->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { PyErr_SetString(PyExc_RuntimeError, "Universe is too big to extract all cells!"); return false; } bool multistate = universe->NumCellStates() > 2; int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int cx, cy; int v = 0; int cntr = 0; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = universe->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (shift) { // shift cells so that top left cell of bounding box is at 0,0 AddTwoInts(list, cx - ileft, cy - itop); } else { AddTwoInts(list, cx, cy); } if (multistate) AddState(list, v); } else { cx = iright; // done this row } cntr++; if ((cntr % 4096) == 0 && PythonScriptAborted()) return false; } } if (multistate) AddPadding(list); } return true; } // ============================================================================= // The following py_* routines can be called from Python scripts; some are // based on code in PLife's lifeint.cc (see http://plife.sourceforge.net/). static PyObject* py_open(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* filename; int remember = 0; if (!PyArg_ParseTuple(args, (char*)"s|i", &filename, &remember)) return NULL; const char* err = GSF_open(filename, remember); if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_save(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* filename; char* format; int remember = 0; if (!PyArg_ParseTuple(args, (char*)"ss|i", &filename, &format, &remember)) return NULL; const char* err = GSF_save(filename, format, remember); if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_opendialog(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); const char* title = "Choose a file"; const char* filetypes = "All files (*)|*"; const char* initialdir = ""; const char* initialfname = ""; int mustexist = 1; if (!PyArg_ParseTuple(args, (char*)"|ssssi", &title, &filetypes, &initialdir, &initialfname, &mustexist)) return NULL; wxString wxs_title(title, wxConvLocal); wxString wxs_filetypes(filetypes, wxConvLocal); wxString wxs_initialdir(initialdir, wxConvLocal); wxString wxs_initialfname(initialfname, wxConvLocal); wxString wxs_result = wxEmptyString; if (wxs_initialdir.IsEmpty()) wxs_initialdir = wxFileName::GetCwd(); if (wxs_filetypes == wxT("dir")) { // let user choose a directory wxDirDialog dirdlg(NULL, wxs_title, wxs_initialdir, wxDD_NEW_DIR_BUTTON); if (dirdlg.ShowModal() == wxID_OK) { wxs_result = dirdlg.GetPath(); if (wxs_result.Last() != wxFILE_SEP_PATH) wxs_result += wxFILE_SEP_PATH; } } else { // let user choose a file wxFileDialog opendlg(NULL, wxs_title, wxs_initialdir, wxs_initialfname, wxs_filetypes, wxFD_OPEN | (mustexist == 0 ? 0 : wxFD_FILE_MUST_EXIST) ); #ifdef __WXGTK__ // wxs_initialdir is ignored above (bug in wxGTK 2.8.0???) opendlg.SetDirectory(wxs_initialdir); #endif if (opendlg.ShowModal() == wxID_OK) wxs_result = opendlg.GetPath(); } return Py_BuildValue((char*)"s", (const char*)wxs_result.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- static PyObject* py_savedialog(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); const char* title = "Choose a save location and filename"; const char* filetypes = "All files (*)|*"; const char* initialdir = ""; const char* initialfname = ""; int suppressprompt = 0; if (!PyArg_ParseTuple(args, (char*)"|ssssi", &title, &filetypes, &initialdir, &initialfname, &suppressprompt)) return NULL; wxString wxs_title(title, wxConvLocal); wxString wxs_filetypes(filetypes, wxConvLocal); wxString wxs_initialdir(initialdir, wxConvLocal); wxString wxs_initialfname(initialfname, wxConvLocal); if (wxs_initialdir.IsEmpty()) wxs_initialdir = wxFileName::GetCwd(); wxFileDialog savedlg( NULL, wxs_title, wxs_initialdir, wxs_initialfname, wxs_filetypes, wxFD_SAVE | (suppressprompt == 0 ? wxFD_OVERWRITE_PROMPT : 0) ); #ifdef __WXGTK__ savedlg.SetDirectory(wxs_initialdir); #endif wxString wxs_savefname = wxEmptyString; if ( savedlg.ShowModal() == wxID_OK ) wxs_savefname = savedlg.GetPath(); return Py_BuildValue((char*)"s", (const char*)wxs_savefname.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- static PyObject* py_load(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* filename; if (!PyArg_ParseTuple(args, (char*)"s", &filename)) return NULL; // create temporary universe of same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype, allowcheck); // readpattern will call setrule // read pattern into temporary universe const char* err = readpattern(FILENAME, *tempalgo); if (err) { // try all other algos until readpattern succeeds for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { delete tempalgo; tempalgo = CreateNewUniverse(i, allowcheck); err = readpattern(FILENAME, *tempalgo); if (!err) break; } } } if (err) { delete tempalgo; PYTHON_ERROR(err); } // convert pattern into a cell list, shifting cell coords so that the // bounding box's top left cell is at 0,0 PyObject* outlist = PyList_New(0); bool done = ExtractCellList(outlist, tempalgo, true); delete tempalgo; if (!done) { Py_DECREF(outlist); return NULL; } return outlist; } // ----------------------------------------------------------------------------- static PyObject* py_store(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); PyObject* inlist; char* filename; if (!PyArg_ParseTuple(args, (char*)"O!s|s", &PyList_Type, &inlist, &filename)) return NULL; // create temporary universe of same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype, allowcheck); const char* err = tempalgo->setrule(currlayer->algo->getrule()); if (err) tempalgo->setrule(tempalgo->DefaultRule()); // copy cell list into temporary universe bool multistate = (PyList_Size(inlist) & 1) == 1; int ints_per_cell = multistate ? 3 : 2; int num_cells = PyList_Size(inlist) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; long x = PyInt_AsLong( PyList_GetItem(inlist, item) ); long y = PyInt_AsLong( PyList_GetItem(inlist, item + 1) ); // check if x,y is outside bounded grid const char* err = GSF_checkpos(tempalgo, x, y); if (err) { delete tempalgo; PYTHON_ERROR(err); } if (multistate) { long state = PyInt_AsLong( PyList_GetItem(inlist, item + 2) ); if (tempalgo->setcell(x, y, state) < 0) { tempalgo->endofpattern(); delete tempalgo; PYTHON_ERROR("store error: state value is out of range."); } } else { tempalgo->setcell(x, y, 1); } if ((n % 4096) == 0 && PythonScriptAborted()) { tempalgo->endofpattern(); delete tempalgo; return NULL; } } tempalgo->endofpattern(); // write pattern to given file in RLE/XRLE format bigint top, left, bottom, right; tempalgo->findedges(&top, &left, &bottom, &right); pattern_format format = savexrle ? XRLE_format : RLE_format; // if grid is bounded then force XRLE_format so that position info is recorded if (tempalgo->gridwd > 0 || tempalgo->gridht > 0) format = XRLE_format; err = writepattern(FILENAME, *tempalgo, format, no_compression, top.toint(), left.toint(), bottom.toint(), right.toint()); delete tempalgo; if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- // deprecated (use py_getdir) static PyObject* py_appdir(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"s", (const char*)gollydir.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- // deprecated (use py_getdir) static PyObject* py_datadir(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"s", (const char*)datadir.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- static PyObject* py_setdir(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* dirname; char* newdir; if (!PyArg_ParseTuple(args, (char*)"ss", &dirname, &newdir)) return NULL; const char* err = GSF_setdir(dirname, newdir); if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getdir(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* dirname; if (!PyArg_ParseTuple(args, (char*)"s", &dirname)) return NULL; const char* dirstring = GSF_getdir(dirname); if (dirstring == NULL) PYTHON_ERROR("getdir error: unknown directory name."); return Py_BuildValue((char*)"s", dirstring); } // ----------------------------------------------------------------------------- static PyObject* py_new(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* title; if (!PyArg_ParseTuple(args, (char*)"s", &title)) return NULL; mainptr->NewPattern(wxString(title,wxConvLocal)); DoAutoUpdate(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_cut(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (viewptr->SelectionExists()) { viewptr->CutSelection(); DoAutoUpdate(); } else { PYTHON_ERROR("cut error: no selection."); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_copy(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (viewptr->SelectionExists()) { viewptr->CopySelection(); DoAutoUpdate(); } else { PYTHON_ERROR("copy error: no selection."); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_clear(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int where; if (!PyArg_ParseTuple(args, (char*)"i", &where)) return NULL; if (viewptr->SelectionExists()) { if (where == 0) viewptr->ClearSelection(); else viewptr->ClearOutsideSelection(); DoAutoUpdate(); } else { PYTHON_ERROR("clear error: no selection."); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_paste(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int x, y; char* mode; if (!PyArg_ParseTuple(args, (char*)"iis", &x, &y, &mode)) return NULL; const char* err = GSF_paste(x, y, mode); if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_shrink(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (viewptr->SelectionExists()) { viewptr->ShrinkSelection(false); // false == don't fit in viewport DoAutoUpdate(); } else { PYTHON_ERROR("shrink error: no selection."); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_randfill(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int perc; if (!PyArg_ParseTuple(args, (char*)"i", &perc)) return NULL; if (perc < 1 || perc > 100) { PYTHON_ERROR("randfill error: percentage must be from 1 to 100."); } if (viewptr->SelectionExists()) { int oldperc = randomfill; randomfill = perc; viewptr->RandomFill(); randomfill = oldperc; DoAutoUpdate(); } else { PYTHON_ERROR("randfill error: no selection."); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_flip(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int direction; if (!PyArg_ParseTuple(args, (char*)"i", &direction)) return NULL; if (viewptr->SelectionExists()) { viewptr->FlipSelection(direction != 0); // 1 = top-bottom DoAutoUpdate(); } else { PYTHON_ERROR("flip error: no selection."); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_rotate(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int direction; if (!PyArg_ParseTuple(args, (char*)"i", &direction)) return NULL; if (viewptr->SelectionExists()) { viewptr->RotateSelection(direction == 0); // 0 = clockwise DoAutoUpdate(); } else { PYTHON_ERROR("rotate error: no selection."); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_parse(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* s; // defaults for optional params long x0 = 0; long y0 = 0; long axx = 1; long axy = 0; long ayx = 0; long ayy = 1; if (!PyArg_ParseTuple(args, (char*)"s|llllll", &s, &x0, &y0, &axx, &axy, &ayx, &ayy)) return NULL; PyObject* outlist = PyList_New(0); long x = 0, y = 0; if (strchr(s, '*')) { // parsing 'visual' format int c = *s++; while (c) { switch (c) { case '\n': if (x) { x = 0; y++; } break; case '.': x++; break; case '*': AddTwoInts(outlist, x0 + x * axx + y * axy, y0 + x * ayx + y * ayy); x++; break; } c = *s++; } } else { // parsing RLE format; first check if multi-state data is present bool multistate = false; char* p = s; while (*p) { char c = *p++; if ((c == '.') || ('p' <= c && c <= 'y') || ('A' <= c && c <= 'X')) { multistate = true; break; } } int prefix = 0; bool done = false; int c = *s++; while (c && !done) { if (isdigit(c)) prefix = 10 * prefix + (c - '0'); else { prefix += (prefix == 0); switch (c) { case '!': done = true; break; case '$': x = 0; y += prefix; break; case 'b': x += prefix; break; case '.': x += prefix; break; case 'o': for (int k = 0; k < prefix; k++, x++) { AddTwoInts(outlist, x0 + x * axx + y * axy, y0 + x * ayx + y * ayy); if (multistate) AddState(outlist, 1); } break; default: if (('p' <= c && c <= 'y') || ('A' <= c && c <= 'X')) { // multistate must be true int state; if (c < 'p') { state = c - 'A' + 1; } else { state = 24 * (c - 'p' + 1); c = *s++; if ('A' <= c && c <= 'X') { state = state + c - 'A' + 1; } else { // Py_DECREF(outlist); // PYTHON_ERROR("parse error: illegal multi-char state."); // be more forgiving and treat 'p'..'y' like 'o' state = 1; s--; } } for (int k = 0; k < prefix; k++, x++) { AddTwoInts(outlist, x0 + x * axx + y * axy, y0 + x * ayx + y * ayy); AddState(outlist, state); } } } prefix = 0; } c = *s++; } if (multistate) AddPadding(outlist); } return outlist; } // ----------------------------------------------------------------------------- static PyObject* py_transform(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); PyObject* inlist; long x0, y0; // defaults for optional params long axx = 1; long axy = 0; long ayx = 0; long ayy = 1; if (!PyArg_ParseTuple(args, (char*)"O!ll|llll", &PyList_Type, &inlist, &x0, &y0, &axx, &axy, &ayx, &ayy)) return NULL; PyObject* outlist = PyList_New(0); bool multistate = (PyList_Size(inlist) & 1) == 1; int ints_per_cell = multistate ? 3 : 2; int num_cells = PyList_Size(inlist) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; long x = PyInt_AsLong( PyList_GetItem(inlist, item) ); long y = PyInt_AsLong( PyList_GetItem(inlist, item + 1) ); AddTwoInts(outlist, x0 + x * axx + y * axy, y0 + x * ayx + y * ayy); if (multistate) { long state = PyInt_AsLong( PyList_GetItem(inlist, item + 2) ); AddState(outlist, state); } if ((n % 4096) == 0 && PythonScriptAborted()) { Py_DECREF(outlist); return NULL; } } if (multistate) AddPadding(outlist); return outlist; } // ----------------------------------------------------------------------------- static PyObject* py_evolve(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int ngens = 0; PyObject* inlist; if (!PyArg_ParseTuple(args, (char*)"O!i", &PyList_Type, &inlist, &ngens)) return NULL; // create a temporary universe of same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype, allowcheck); const char* err = tempalgo->setrule(currlayer->algo->getrule()); if (err) tempalgo->setrule(tempalgo->DefaultRule()); // copy cell list into temporary universe bool multistate = (PyList_Size(inlist) & 1) == 1; int ints_per_cell = multistate ? 3 : 2; int num_cells = PyList_Size(inlist) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; long x = PyInt_AsLong( PyList_GetItem(inlist, item) ); long y = PyInt_AsLong( PyList_GetItem(inlist, item + 1) ); // check if x,y is outside bounded grid const char* err = GSF_checkpos(tempalgo, x, y); if (err) { delete tempalgo; PYTHON_ERROR(err); } if (multistate) { long state = PyInt_AsLong( PyList_GetItem(inlist, item + 2) ); if (tempalgo->setcell(x, y, state) < 0) { tempalgo->endofpattern(); delete tempalgo; PYTHON_ERROR("evolve error: state value is out of range."); } } else { tempalgo->setcell(x, y, 1); } if ((n % 4096) == 0 && PythonScriptAborted()) { tempalgo->endofpattern(); delete tempalgo; return NULL; } } tempalgo->endofpattern(); // advance pattern by ngens mainptr->generating = true; if (tempalgo->gridwd > 0 || tempalgo->gridht > 0) { // a bounded grid must use an increment of 1 so we can call // CreateBorderCells and DeleteBorderCells around each step() tempalgo->setIncrement(1); while (ngens > 0) { if (PythonScriptAborted()) { mainptr->generating = false; delete tempalgo; return NULL; } if (!mainptr->CreateBorderCells(tempalgo)) break; tempalgo->step(); if (!mainptr->DeleteBorderCells(tempalgo)) break; ngens--; } } else { tempalgo->setIncrement(ngens); tempalgo->step(); } mainptr->generating = false; // convert new pattern into a new cell list PyObject* outlist = PyList_New(0); bool done = ExtractCellList(outlist, tempalgo); delete tempalgo; if (!done) { Py_DECREF(outlist); return NULL; } return outlist; } // ----------------------------------------------------------------------------- static const char* BAD_STATE = "putcells error: state value is out of range."; static PyObject* py_putcells(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); PyObject* list; // defaults for optional params long x0 = 0; long y0 = 0; long axx = 1; long axy = 0; long ayx = 0; long ayy = 1; // default for mode is 'or'; 'xor' mode is also supported; // for a one-state list 'copy' mode currently has the same effect as 'or' mode // because there is no bounding box to set dead cells, but a multi-state list can // have dead cells so in that case 'copy' mode is not the same as 'or' mode const char* mode = "or"; if (!PyArg_ParseTuple(args, (char*)"O!|lllllls", &PyList_Type, &list, &x0, &y0, &axx, &axy, &ayx, &ayy, &mode)) return NULL; wxString modestr = wxString(mode, wxConvLocal); if ( !( modestr.IsSameAs(wxT("or"), false) || modestr.IsSameAs(wxT("xor"), false) || modestr.IsSameAs(wxT("copy"), false) || modestr.IsSameAs(wxT("and"), false) || modestr.IsSameAs(wxT("not"), false)) ) { PYTHON_ERROR("putcells error: unknown mode."); } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; // use ChangeCell below and combine all changes due to consecutive setcell/putcells // if (savecells) SavePendingChanges(); bool multistate = (PyList_Size(list) & 1) == 1; int ints_per_cell = multistate ? 3 : 2; int num_cells = PyList_Size(list) / ints_per_cell; bool abort = false; const char* err = NULL; bool pattchanged = false; lifealgo* curralgo = currlayer->algo; if (modestr.IsSameAs(wxT("copy"), false)) { // TODO: find bounds of cell list and call ClearRect here (to be added to wxedit.cpp) } if (modestr.IsSameAs(wxT("and"), false)) { if (!curralgo->isEmpty()) { int newstate = 1; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; long x = PyInt_AsLong( PyList_GetItem(list, item) ); long y = PyInt_AsLong( PyList_GetItem(list, item + 1) ); int newx = x0 + x * axx + y * axy; int newy = y0 + x * ayx + y * ayy; // check if newx,newy is outside bounded grid err = GSF_checkpos(curralgo, newx, newy); if (err) break; int oldstate = curralgo->getcell(newx, newy); if (multistate) { // multi-state lists can contain dead cells so newstate might be 0 newstate = PyInt_AsLong( PyList_GetItem(list, item + 2) ); } if (newstate != oldstate && oldstate > 0) { curralgo->setcell(newx, newy, 0); if (savecells) ChangeCell(newx, newy, oldstate, 0); pattchanged = true; } if ((n % 4096) == 0 && PythonScriptAborted()) { abort = true; break; } } } } else if (modestr.IsSameAs(wxT("xor"), false)) { // loop code is duplicated here to allow 'or' case to execute faster int numstates = curralgo->NumCellStates(); for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; long x = PyInt_AsLong( PyList_GetItem(list, item) ); long y = PyInt_AsLong( PyList_GetItem(list, item + 1) ); int newx = x0 + x * axx + y * axy; int newy = y0 + x * ayx + y * ayy; // check if newx,newy is outside bounded grid err = GSF_checkpos(curralgo, newx, newy); if (err) break; int oldstate = curralgo->getcell(newx, newy); int newstate; if (multistate) { // multi-state lists can contain dead cells so newstate might be 0 newstate = PyInt_AsLong( PyList_GetItem(list, item + 2) ); if (newstate == oldstate) { if (oldstate != 0) newstate = 0; } else { newstate = newstate ^ oldstate; // if xor overflows then don't change current state if (newstate >= numstates) newstate = oldstate; } if (newstate != oldstate) { // paste (possibly transformed) cell into current universe if (curralgo->setcell(newx, newy, newstate) < 0) { PyErr_SetString(PyExc_RuntimeError, BAD_STATE); abort = true; break; } if (savecells) ChangeCell(newx, newy, oldstate, newstate); pattchanged = true; } } else { // one-state lists only contain live cells newstate = 1 - oldstate; // paste (possibly transformed) cell into current universe if (curralgo->setcell(newx, newy, newstate) < 0) { PyErr_SetString(PyExc_RuntimeError, BAD_STATE); abort = true; break; } if (savecells) ChangeCell(newx, newy, oldstate, newstate); pattchanged = true; } if ((n % 4096) == 0 && PythonScriptAborted()) { abort = true; break; } } } else { bool notmode = modestr.IsSameAs(wxT("not"), false); bool ormode = modestr.IsSameAs(wxT("or"), false); int newstate = notmode ? 0 : 1; int maxstate = curralgo->NumCellStates() - 1; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; long x = PyInt_AsLong( PyList_GetItem(list, item) ); long y = PyInt_AsLong( PyList_GetItem(list, item + 1) ); int newx = x0 + x * axx + y * axy; int newy = y0 + x * ayx + y * ayy; // check if newx,newy is outside bounded grid err = GSF_checkpos(curralgo, newx, newy); if (err) break; int oldstate = curralgo->getcell(newx, newy); if (multistate) { // multi-state lists can contain dead cells so newstate might be 0 newstate = PyInt_AsLong( PyList_GetItem(list, item + 2) ); if (notmode) newstate = maxstate - newstate; if (ormode && newstate == 0) newstate = oldstate; } if (newstate != oldstate) { // paste (possibly transformed) cell into current universe if (curralgo->setcell(newx, newy, newstate) < 0) { PyErr_SetString(PyExc_RuntimeError, BAD_STATE); abort = true; break; } if (savecells) ChangeCell(newx, newy, oldstate, newstate); pattchanged = true; } if ((n % 4096) == 0 && PythonScriptAborted()) { abort = true; break; } } } if (pattchanged) { curralgo->endofpattern(); MarkLayerDirty(); DoAutoUpdate(); } if (err) PYTHON_ERROR(err); if (abort) return NULL; RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getcells(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); PyObject* rect_list; if (!PyArg_ParseTuple(args, (char*)"O!", &PyList_Type, &rect_list)) return NULL; // convert pattern in given rect into a cell list PyObject* outlist = PyList_New(0); int numitems = PyList_Size(rect_list); if (numitems == 0) { // return empty cell list } else if (numitems == 4) { int ileft = PyInt_AsLong( PyList_GetItem(rect_list, 0) ); int itop = PyInt_AsLong( PyList_GetItem(rect_list, 1) ); int wd = PyInt_AsLong( PyList_GetItem(rect_list, 2) ); int ht = PyInt_AsLong( PyList_GetItem(rect_list, 3) ); const char* err = GSF_checkrect(ileft, itop, wd, ht); if (err) { Py_DECREF(outlist); PYTHON_ERROR(err); } int iright = ileft + wd - 1; int ibottom = itop + ht - 1; int cx, cy; int v = 0; int cntr = 0; lifealgo* curralgo = currlayer->algo; bool multistate = curralgo->NumCellStates() > 2; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (cx <= iright) { AddTwoInts(outlist, cx, cy); if (multistate) AddState(outlist, v); } } else { cx = iright; // done this row } cntr++; if ((cntr % 4096) == 0 && PythonScriptAborted()) { Py_DECREF(outlist); return NULL; } } } if (multistate) AddPadding(outlist); } else { Py_DECREF(outlist); PYTHON_ERROR("getcells error: arg must be [] or [x,y,wd,ht]."); } return outlist; } // ----------------------------------------------------------------------------- static PyObject* py_join(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); PyObject* inlist1; PyObject* inlist2; if (!PyArg_ParseTuple(args, (char*)"O!O!", &PyList_Type, &inlist1, &PyList_Type, &inlist2)) return NULL; bool multi1 = (PyList_Size(inlist1) & 1) == 1; bool multi2 = (PyList_Size(inlist2) & 1) == 1; bool multiout = multi1 || multi2; int ints_per_cell, num_cells; long x, y, state; PyObject* outlist = PyList_New(0); // append 1st list ints_per_cell = multi1 ? 3 : 2; num_cells = PyList_Size(inlist1) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; x = PyInt_AsLong( PyList_GetItem(inlist1, item) ); y = PyInt_AsLong( PyList_GetItem(inlist1, item + 1) ); if (multi1) { state = PyInt_AsLong( PyList_GetItem(inlist1, item + 2) ); } else { state = 1; } AddTwoInts(outlist, x, y); if (multiout) AddState(outlist, state); if ((n % 4096) == 0 && PythonScriptAborted()) { Py_DECREF(outlist); return NULL; } } // append 2nd list ints_per_cell = multi2 ? 3 : 2; num_cells = PyList_Size(inlist2) / ints_per_cell; for (int n = 0; n < num_cells; n++) { int item = ints_per_cell * n; x = PyInt_AsLong( PyList_GetItem(inlist2, item) ); y = PyInt_AsLong( PyList_GetItem(inlist2, item + 1) ); if (multi2) { state = PyInt_AsLong( PyList_GetItem(inlist2, item + 2) ); } else { state = 1; } AddTwoInts(outlist, x, y); if (multiout) AddState(outlist, state); if ((n % 4096) == 0 && PythonScriptAborted()) { Py_DECREF(outlist); return NULL; } } if (multiout) AddPadding(outlist); return outlist; } // ----------------------------------------------------------------------------- static PyObject* py_hash(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); PyObject* rect_list; if (!PyArg_ParseTuple(args, (char*)"O!", &PyList_Type, &rect_list)) return NULL; int numitems = PyList_Size(rect_list); if (numitems != 4) { PYTHON_ERROR("hash error: arg must be [x,y,wd,ht]."); } int x = PyInt_AsLong( PyList_GetItem(rect_list, 0) ); int y = PyInt_AsLong( PyList_GetItem(rect_list, 1) ); int wd = PyInt_AsLong( PyList_GetItem(rect_list, 2) ); int ht = PyInt_AsLong( PyList_GetItem(rect_list, 3) ); const char* err = GSF_checkrect(x, y, wd, ht); if (err) PYTHON_ERROR(err); int hash = GSF_hash(x, y, wd, ht); return Py_BuildValue((char*)"i", hash); } // ----------------------------------------------------------------------------- static PyObject* py_getclip(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (!mainptr->ClipboardHasText()) { PYTHON_ERROR("getclip error: no pattern in clipboard."); } // convert pattern in clipboard into a cell list, but where the first 2 items // are the pattern's width and height (not necessarily the minimal bounding box // because the pattern might have empty borders, or it might even be empty) PyObject* outlist = PyList_New(0); // create a temporary universe for storing clipboard pattern; // GetClipboardPattern assumes it is same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype, allowcheck); const char* err = tempalgo->setrule(currlayer->algo->getrule()); if (err) tempalgo->setrule(tempalgo->DefaultRule()); // read clipboard pattern into temporary universe and set edges // (not a minimal bounding box if pattern is empty or has empty borders) bigint top, left, bottom, right; if ( viewptr->GetClipboardPattern(&tempalgo, &top, &left, &bottom, &right) ) { if ( viewptr->OutsideLimits(top, left, bottom, right) ) { delete tempalgo; Py_DECREF(outlist); PYTHON_ERROR("getclip error: pattern is too big."); } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; AddTwoInts(outlist, wd, ht); // extract cells from tempalgo bool multistate = tempalgo->NumCellStates() > 2; int cx, cy; int cntr = 0; int v = 0; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = tempalgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; // shift cells so that top left cell of bounding box is at 0,0 AddTwoInts(outlist, cx - ileft, cy - itop); if (multistate) AddState(outlist, v); } else { cx = iright; // done this row } cntr++; if ((cntr % 4096) == 0 && PythonScriptAborted()) { delete tempalgo; Py_DECREF(outlist); return NULL; } } } // if no live cells then return [wd,ht] rather than [wd,ht,0] if (multistate && PyList_Size(outlist) > 2) { AddPadding(outlist); } delete tempalgo; } else { // assume error message has been displayed delete tempalgo; Py_DECREF(outlist); return NULL; } return outlist; } // ----------------------------------------------------------------------------- static PyObject* py_select(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); PyObject* rect_list; if (!PyArg_ParseTuple(args, (char*)"O!", &PyList_Type, &rect_list)) return NULL; int numitems = PyList_Size(rect_list); if (numitems == 0) { // remove any existing selection GSF_select(0, 0, 0, 0); } else if (numitems == 4) { int x = PyInt_AsLong( PyList_GetItem(rect_list, 0) ); int y = PyInt_AsLong( PyList_GetItem(rect_list, 1) ); int wd = PyInt_AsLong( PyList_GetItem(rect_list, 2) ); int ht = PyInt_AsLong( PyList_GetItem(rect_list, 3) ); const char* err = GSF_checkrect(x, y, wd, ht); if (err) PYTHON_ERROR(err); // set selection rect GSF_select(x, y, wd, ht); } else { PYTHON_ERROR("select error: arg must be [] or [x,y,wd,ht]."); } DoAutoUpdate(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getrect(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; PyObject* outlist = PyList_New(0); if (!currlayer->algo->isEmpty()) { bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { Py_DECREF(outlist); PYTHON_ERROR("getrect error: pattern is too big."); } long x = left.toint(); long y = top.toint(); long wd = right.toint() - x + 1; long ht = bottom.toint() - y + 1; AddTwoInts(outlist, x, y); AddTwoInts(outlist, wd, ht); } return outlist; } // ----------------------------------------------------------------------------- static PyObject* py_getselrect(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; PyObject* outlist = PyList_New(0); if (viewptr->SelectionExists()) { if (currlayer->currsel.TooBig()) { Py_DECREF(outlist); PYTHON_ERROR("getselrect error: selection is too big."); } int x, y, wd, ht; currlayer->currsel.GetRect(&x, &y, &wd, &ht); AddTwoInts(outlist, x, y); AddTwoInts(outlist, wd, ht); } return outlist; } // ----------------------------------------------------------------------------- static PyObject* py_setcell(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int x, y, state; if (!PyArg_ParseTuple(args, (char*)"iii", &x, &y, &state)) return NULL; const char* err = GSF_setcell(x, y, state); if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getcell(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int x, y; if (!PyArg_ParseTuple(args, (char*)"ii", &x, &y)) return NULL; // check if x,y is outside bounded grid const char* err = GSF_checkpos(currlayer->algo, x, y); if (err) PYTHON_ERROR(err); return Py_BuildValue((char*)"i", currlayer->algo->getcell(x, y)); } // ----------------------------------------------------------------------------- static PyObject* py_setcursor(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); const char* newcursor; if (!PyArg_ParseTuple(args, (char*)"s", &newcursor)) return NULL; const char* oldcursor = CursorToString(currlayer->curs); wxCursor* cursptr = StringToCursor(newcursor); if (cursptr) { viewptr->SetCursorMode(cursptr); // see the cursor change, including button in edit bar mainptr->UpdateUserInterface(mainptr->IsActive()); } else { PYTHON_ERROR("setcursor error: unknown cursor string."); } // return old cursor (simplifies saving and restoring cursor) return Py_BuildValue((char*)"s", oldcursor); } // ----------------------------------------------------------------------------- static PyObject* py_getcursor(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"s", CursorToString(currlayer->curs)); } // ----------------------------------------------------------------------------- static PyObject* py_empty(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", currlayer->algo->isEmpty() ? 1 : 0); } // ----------------------------------------------------------------------------- static PyObject* py_run(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int ngens; if (!PyArg_ParseTuple(args, (char*)"i", &ngens)) return NULL; if (ngens > 0 && !currlayer->algo->isEmpty()) { if (ngens > 1) { bigint saveinc = currlayer->algo->getIncrement(); currlayer->algo->setIncrement(ngens); mainptr->NextGeneration(true); // step by ngens currlayer->algo->setIncrement(saveinc); } else { mainptr->NextGeneration(false); // step 1 gen } DoAutoUpdate(); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_step(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (!currlayer->algo->isEmpty()) { mainptr->NextGeneration(true); // step by current increment DoAutoUpdate(); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_setstep(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int exp; if (!PyArg_ParseTuple(args, (char*)"i", &exp)) return NULL; mainptr->SetStepExponent(exp); DoAutoUpdate(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getstep(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", currlayer->currexpo); } // ----------------------------------------------------------------------------- static PyObject* py_setbase(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int base; if (!PyArg_ParseTuple(args, (char*)"i", &base)) return NULL; if (base < 2) base = 2; if (base > MAX_BASESTEP) base = MAX_BASESTEP; currlayer->currbase = base; mainptr->SetGenIncrement(); DoAutoUpdate(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getbase(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", currlayer->currbase); } // ----------------------------------------------------------------------------- static PyObject* py_advance(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int where, ngens; if (!PyArg_ParseTuple(args, (char*)"ii", &where, &ngens)) return NULL; if (ngens > 0) { if (viewptr->SelectionExists()) { while (ngens > 0) { ngens--; if (where == 0) currlayer->currsel.Advance(); else currlayer->currsel.AdvanceOutside(); } DoAutoUpdate(); } else { PYTHON_ERROR("advance error: no selection."); } } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_reset(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (currlayer->algo->getGeneration() != currlayer->startgen) { mainptr->ResetPattern(); DoAutoUpdate(); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_setgen(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* genstring = NULL; if (!PyArg_ParseTuple(args, (char*)"s", &genstring)) return NULL; const char* err = GSF_setgen(genstring); if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getgen(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char sepchar = '\0'; if (!PyArg_ParseTuple(args, (char*)"|c", &sepchar)) return NULL; return Py_BuildValue((char*)"s", currlayer->algo->getGeneration().tostring(sepchar)); } // ----------------------------------------------------------------------------- static PyObject* py_getpop(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char sepchar = '\0'; if (!PyArg_ParseTuple(args, (char*)"|c", &sepchar)) return NULL; return Py_BuildValue((char*)"s", currlayer->algo->getPopulation().tostring(sepchar)); } // ----------------------------------------------------------------------------- static PyObject* py_setalgo(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* algostring = NULL; if (!PyArg_ParseTuple(args, (char*)"s", &algostring)) return NULL; const char* err = GSF_setalgo(algostring); if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getalgo(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int index = currlayer->algtype; if (!PyArg_ParseTuple(args, (char*)"|i", &index)) return NULL; if (index < 0 || index >= NumAlgos()) { char msg[64]; sprintf(msg, "Bad getalgo index: %d", index); PYTHON_ERROR(msg); } return Py_BuildValue((char*)"s", GetAlgoName(index)); } // ----------------------------------------------------------------------------- static PyObject* py_setrule(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* rulestring = NULL; if (!PyArg_ParseTuple(args, (char*)"s", &rulestring)) return NULL; const char* err = GSF_setrule(rulestring); if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getrule(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"s", currlayer->algo->getrule()); } // ----------------------------------------------------------------------------- static PyObject* py_getwidth(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", currlayer->algo->gridwd); } // ----------------------------------------------------------------------------- static PyObject* py_getheight(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", currlayer->algo->gridht); } // ----------------------------------------------------------------------------- static PyObject* py_numstates(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", currlayer->algo->NumCellStates()); } // ----------------------------------------------------------------------------- static PyObject* py_numalgos(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", NumAlgos()); } // ----------------------------------------------------------------------------- static PyObject* py_setpos(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* x; char* y; if (!PyArg_ParseTuple(args, (char*)"ss", &x, &y)) return NULL; const char* err = GSF_setpos(x, y); if (err) PYTHON_ERROR(err); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getpos(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char sepchar = '\0'; if (!PyArg_ParseTuple(args, (char*)"|c", &sepchar)) return NULL; bigint bigx, bigy; viewptr->GetPos(bigx, bigy); // return position as x,y tuple PyObject* xytuple = PyTuple_New(2); PyTuple_SetItem(xytuple, 0, Py_BuildValue((char*)"s",bigx.tostring(sepchar))); PyTuple_SetItem(xytuple, 1, Py_BuildValue((char*)"s",bigy.tostring(sepchar))); return xytuple; } // ----------------------------------------------------------------------------- static PyObject* py_setmag(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int mag; if (!PyArg_ParseTuple(args, (char*)"i", &mag)) return NULL; viewptr->SetMag(mag); DoAutoUpdate(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getmag(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", viewptr->GetMag()); } // ----------------------------------------------------------------------------- static PyObject* py_fit(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; viewptr->FitPattern(); DoAutoUpdate(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_fitsel(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (viewptr->SelectionExists()) { viewptr->FitSelection(); DoAutoUpdate(); } else { PYTHON_ERROR("fitsel error: no selection."); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_visrect(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); PyObject* rect_list; if (!PyArg_ParseTuple(args, (char*)"O!", &PyList_Type, &rect_list)) return NULL; int numitems = PyList_Size(rect_list); if (numitems != 4) { PYTHON_ERROR("visrect error: arg must be [x,y,wd,ht]."); } int x = PyInt_AsLong( PyList_GetItem(rect_list, 0) ); int y = PyInt_AsLong( PyList_GetItem(rect_list, 1) ); int wd = PyInt_AsLong( PyList_GetItem(rect_list, 2) ); int ht = PyInt_AsLong( PyList_GetItem(rect_list, 3) ); const char* err = GSF_checkrect(x, y, wd, ht); if (err) PYTHON_ERROR(err); bigint left = x; bigint top = y; bigint right = x + wd - 1; bigint bottom = y + ht - 1; int visible = viewptr->CellVisible(left, top) && viewptr->CellVisible(right, bottom); return Py_BuildValue((char*)"i", visible); } // ----------------------------------------------------------------------------- static PyObject* py_update(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; GSF_update(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_autoupdate(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int flag; if (!PyArg_ParseTuple(args, (char*)"i", &flag)) return NULL; autoupdate = (flag != 0); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_addlayer(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (numlayers >= MAX_LAYERS) { PYTHON_ERROR("addlayer error: no more layers can be added."); } else { AddLayer(); DoAutoUpdate(); } // return index of new layer return Py_BuildValue((char*)"i", currindex); } // ----------------------------------------------------------------------------- static PyObject* py_clone(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (numlayers >= MAX_LAYERS) { PYTHON_ERROR("clone error: no more layers can be added."); } else { CloneLayer(); DoAutoUpdate(); } // return index of new layer return Py_BuildValue((char*)"i", currindex); } // ----------------------------------------------------------------------------- static PyObject* py_duplicate(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (numlayers >= MAX_LAYERS) { PYTHON_ERROR("duplicate error: no more layers can be added."); } else { DuplicateLayer(); DoAutoUpdate(); } // return index of new layer return Py_BuildValue((char*)"i", currindex); } // ----------------------------------------------------------------------------- static PyObject* py_dellayer(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; if (numlayers <= 1) { PYTHON_ERROR("dellayer error: there is only one layer."); } else { DeleteLayer(); DoAutoUpdate(); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_movelayer(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int fromindex, toindex; if (!PyArg_ParseTuple(args, (char*)"ii", &fromindex, &toindex)) return NULL; if (fromindex < 0 || fromindex >= numlayers) { char msg[64]; sprintf(msg, "Bad movelayer fromindex: %d", fromindex); PYTHON_ERROR(msg); } if (toindex < 0 || toindex >= numlayers) { char msg[64]; sprintf(msg, "Bad movelayer toindex: %d", toindex); PYTHON_ERROR(msg); } MoveLayer(fromindex, toindex); DoAutoUpdate(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_setlayer(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int index; if (!PyArg_ParseTuple(args, (char*)"i", &index)) return NULL; if (index < 0 || index >= numlayers) { char msg[64]; sprintf(msg, "Bad setlayer index: %d", index); PYTHON_ERROR(msg); } SetLayer(index); DoAutoUpdate(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getlayer(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", currindex); } // ----------------------------------------------------------------------------- static PyObject* py_numlayers(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", numlayers); } // ----------------------------------------------------------------------------- static PyObject* py_maxlayers(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; return Py_BuildValue((char*)"i", MAX_LAYERS); } // ----------------------------------------------------------------------------- static PyObject* py_setname(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* name; int index = currindex; if (!PyArg_ParseTuple(args, (char*)"s|i", &name, &index)) return NULL; if (index < 0 || index >= numlayers) { char msg[64]; sprintf(msg, "Bad setname index: %d", index); PYTHON_ERROR(msg); } GSF_setname(name, index); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getname(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int index = currindex; if (!PyArg_ParseTuple(args, (char*)"|i", &index)) return NULL; if (index < 0 || index >= numlayers) { char msg[64]; sprintf(msg, "Bad getname index: %d", index); PYTHON_ERROR(msg); } return Py_BuildValue((char*)"s", (const char*)GetLayer(index)->currname.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- static PyObject* py_setcolors(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); PyObject* color_list; if (!PyArg_ParseTuple(args, (char*)"O!", &PyList_Type, &color_list)) return NULL; int len = PyList_Size(color_list); if (len == 0) { // restore default colors in current layer and its clones UpdateLayerColors(); } else if (len == 6) { // create gradient from r1,g1,b1 to r2,g2,b2 int r1 = PyInt_AsLong( PyList_GetItem(color_list, 0) ); int g1 = PyInt_AsLong( PyList_GetItem(color_list, 1) ); int b1 = PyInt_AsLong( PyList_GetItem(color_list, 2) ); int r2 = PyInt_AsLong( PyList_GetItem(color_list, 3) ); int g2 = PyInt_AsLong( PyList_GetItem(color_list, 4) ); int b2 = PyInt_AsLong( PyList_GetItem(color_list, 5) ); CheckRGB(r1, g1, b1, "setcolors"); CheckRGB(r2, g2, b2, "setcolors"); currlayer->fromrgb.Set(r1, g1, b1); currlayer->torgb.Set(r2, g2, b2); CreateColorGradient(); UpdateCloneColors(); } else if (len % 4 == 0) { int i = 0; while (i < len) { int s = PyInt_AsLong( PyList_GetItem(color_list, i) ); i++; int r = PyInt_AsLong( PyList_GetItem(color_list, i) ); i++; int g = PyInt_AsLong( PyList_GetItem(color_list, i) ); i++; int b = PyInt_AsLong( PyList_GetItem(color_list, i) ); i++; CheckRGB(r, g, b, "setcolors"); if (s == -1) { // set all LIVE states to r,g,b (best not to alter state 0) for (s = 1; s < currlayer->algo->NumCellStates(); s++) { currlayer->cellr[s] = r; currlayer->cellg[s] = g; currlayer->cellb[s] = b; } } else { if (s < 0 || s >= currlayer->algo->NumCellStates()) { char msg[64]; sprintf(msg, "Bad state in setcolors: %d", s); PYTHON_ERROR(msg); } else { currlayer->cellr[s] = r; currlayer->cellg[s] = g; currlayer->cellb[s] = b; } } } UpdateCloneColors(); } else { PYTHON_ERROR("setcolors error: list length is not a multiple of 4."); } DoAutoUpdate(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getcolors(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int state = -1; if (!PyArg_ParseTuple(args, (char*)"|i", &state)) return NULL; PyObject* outlist = PyList_New(0); if (state == -1) { // return colors for ALL states, including state 0 for (state = 0; state < currlayer->algo->NumCellStates(); state++) { AddCellColor(outlist, state, currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state]); } } else if (state >= 0 && state < currlayer->algo->NumCellStates()) { AddCellColor(outlist, state, currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state]); } else { char msg[64]; sprintf(msg, "Bad getcolors state: %d", state); PYTHON_ERROR(msg); } return outlist; } // ----------------------------------------------------------------------------- static PyObject* py_setoption(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* optname; int oldval, newval; if (!PyArg_ParseTuple(args, (char*)"si", &optname, &newval)) return NULL; if (!GSF_setoption(optname, newval, &oldval)) { PYTHON_ERROR("setoption error: unknown option."); } // return old value (simplifies saving and restoring settings) return Py_BuildValue((char*)"i", oldval); } // ----------------------------------------------------------------------------- static PyObject* py_getoption(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* optname; int optval; if (!PyArg_ParseTuple(args, (char*)"s", &optname)) return NULL; if (!GSF_getoption(optname, &optval)) { PYTHON_ERROR("getoption error: unknown option."); } return Py_BuildValue((char*)"i", optval); } // ----------------------------------------------------------------------------- static PyObject* py_setcolor(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* colname; int r, g, b; if (!PyArg_ParseTuple(args, (char*)"siii", &colname, &r, &g, &b)) return NULL; wxColor newcol(r, g, b); wxColor oldcol; if (!GSF_setcolor(colname, newcol, oldcol)) { PYTHON_ERROR("setcolor error: unknown color."); } // return old r,g,b values (simplifies saving and restoring colors) PyObject* rgbtuple = PyTuple_New(3); PyTuple_SetItem(rgbtuple, 0, Py_BuildValue((char*)"i",oldcol.Red())); PyTuple_SetItem(rgbtuple, 1, Py_BuildValue((char*)"i",oldcol.Green())); PyTuple_SetItem(rgbtuple, 2, Py_BuildValue((char*)"i",oldcol.Blue())); return rgbtuple; } // ----------------------------------------------------------------------------- static PyObject* py_getcolor(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* colname; wxColor color; if (!PyArg_ParseTuple(args, (char*)"s", &colname)) return NULL; if (!GSF_getcolor(colname, color)) { PYTHON_ERROR("getcolor error: unknown color."); } // return r,g,b tuple PyObject* rgbtuple = PyTuple_New(3); PyTuple_SetItem(rgbtuple, 0, Py_BuildValue((char*)"i",color.Red())); PyTuple_SetItem(rgbtuple, 1, Py_BuildValue((char*)"i",color.Green())); PyTuple_SetItem(rgbtuple, 2, Py_BuildValue((char*)"i",color.Blue())); return rgbtuple; } // ----------------------------------------------------------------------------- static PyObject* py_setclipstr(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* clipstr; if (!PyArg_ParseTuple(args, (char*)"s", &clipstr)) return NULL; wxString wxs_clip(clipstr, wxConvLocal); mainptr->CopyTextToClipboard(wxs_clip); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getclipstr(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; wxTextDataObject data; if ( !mainptr->GetTextFromClipboard(&data) ) return NULL; wxString wxs_clipstr = data.GetText(); return Py_BuildValue((char*)"s", (const char*)wxs_clipstr.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- static PyObject* py_getstring(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* prompt; const char* initial = ""; const char* title = ""; if (!PyArg_ParseTuple(args, (char*)"s|ss", &prompt, &initial, &title)) return NULL; wxString result; if ( !GetString(wxString(title,wxConvLocal), wxString(prompt,wxConvLocal), wxString(initial,wxConvLocal), result) ) { // user hit Cancel button AbortPythonScript(); return NULL; } return Py_BuildValue((char*)"s", (const char*)result.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- static PyObject* py_getxy(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; statusptr->CheckMouseLocation(mainptr->IsActive()); // sets mousepos if (viewptr->showcontrols) mousepos = wxEmptyString; return Py_BuildValue((char*)"s", (const char*)mousepos.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- static PyObject* py_getevent(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); int get = 1; if (!PyArg_ParseTuple(args, (char*)"|i", &get)) return NULL; wxString event; GSF_getevent(event, get); return Py_BuildValue((char*)"s", (const char*)event.mb_str(wxConvLocal)); } // ----------------------------------------------------------------------------- static PyObject* py_doevent(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* event; if (!PyArg_ParseTuple(args, (char*)"s", &event)) return NULL; if (event[0]) { const char* err = GSF_doevent(wxString(event,wxConvLocal)); if (err) PYTHON_ERROR(err); } RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_getkey(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); if (!PyArg_ParseTuple(args, (char*)"")) return NULL; char s[2]; // room for char + NULL GSF_getkey(s); return Py_BuildValue((char*)"s", s); } // ----------------------------------------------------------------------------- static PyObject* py_dokey(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* ascii; if (!PyArg_ParseTuple(args, (char*)"s", &ascii)) return NULL; GSF_dokey(ascii); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_show(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* s = NULL; if (!PyArg_ParseTuple(args, (char*)"s", &s)) return NULL; inscript = false; statusptr->DisplayMessage(wxString(s,wxConvLocal)); inscript = true; // make sure status bar is visible if (!showstatus) mainptr->ToggleStatusBar(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_error(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* s = NULL; if (!PyArg_ParseTuple(args, (char*)"s", &s)) return NULL; inscript = false; statusptr->ErrorMessage(wxString(s,wxConvLocal)); inscript = true; // make sure status bar is visible if (!showstatus) mainptr->ToggleStatusBar(); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_warn(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* s = NULL; if (!PyArg_ParseTuple(args, (char*)"s", &s)) return NULL; Warning(wxString(s,wxConvLocal)); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_note(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* s = NULL; if (!PyArg_ParseTuple(args, (char*)"s", &s)) return NULL; Note(wxString(s,wxConvLocal)); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_help(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* htmlfile = NULL; if (!PyArg_ParseTuple(args, (char*)"s", &htmlfile)) return NULL; ShowHelp(wxString(htmlfile,wxConvLocal)); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_check(PyObject* self, PyObject* args) { // if (PythonScriptAborted()) return NULL; // don't call checkevents() here otherwise we can't safely write code like // if g.getlayer() == target: // g.check(0) // ... do stuff to target layer ... // g.check(1) wxUnusedVar(self); int flag; if (!PyArg_ParseTuple(args, (char*)"i", &flag)) return NULL; allowcheck = (flag != 0); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyObject* py_exit(PyObject* self, PyObject* args) { if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* err = NULL; if (!PyArg_ParseTuple(args, (char*)"|s", &err)) return NULL; GSF_exit(err); AbortPythonScript(); // exception raised so must return NULL return NULL; } // ----------------------------------------------------------------------------- static PyObject* py_stderr(PyObject* self, PyObject* args) { // probably safer not to call checkevents here // if (PythonScriptAborted()) return NULL; wxUnusedVar(self); char* s = NULL; if (!PyArg_ParseTuple(args, (char*)"s", &s)) return NULL; // accumulate stderr messages in global string (shown after script finishes) scripterr = wxString(s, wxConvLocal); RETURN_NONE; } // ----------------------------------------------------------------------------- static PyMethodDef py_methods[] = { // filing { "open", py_open, METH_VARARGS, "open given pattern file" }, { "save", py_save, METH_VARARGS, "save pattern in given file using given format" }, { "opendialog", py_opendialog, METH_VARARGS, "return input path and filename chosen by user" }, { "savedialog", py_savedialog, METH_VARARGS, "return output path and filename chosen by user" }, { "load", py_load, METH_VARARGS, "read pattern file and return cell list" }, { "store", py_store, METH_VARARGS, "write cell list to a file (in RLE format)" }, { "setdir", py_setdir, METH_VARARGS, "set location of specified directory" }, { "getdir", py_getdir, METH_VARARGS, "return location of specified directory" }, // next two are deprecated (use getdir) { "appdir", py_appdir, METH_VARARGS, "return location of Golly app" }, { "datadir", py_datadir, METH_VARARGS, "return location of user-specific data" }, // editing { "new", py_new, METH_VARARGS, "create new universe and set window title" }, { "cut", py_cut, METH_VARARGS, "cut selection to clipboard" }, { "copy", py_copy, METH_VARARGS, "copy selection to clipboard" }, { "clear", py_clear, METH_VARARGS, "clear inside/outside selection" }, { "paste", py_paste, METH_VARARGS, "paste clipboard pattern at x,y using given mode" }, { "shrink", py_shrink, METH_VARARGS, "shrink selection" }, { "randfill", py_randfill, METH_VARARGS, "randomly fill selection to given percentage" }, { "flip", py_flip, METH_VARARGS, "flip selection top-bottom or left-right" }, { "rotate", py_rotate, METH_VARARGS, "rotate selection 90 deg clockwise or anticlockwise" }, { "parse", py_parse, METH_VARARGS, "parse RLE or Life 1.05 string and return cell list" }, { "transform", py_transform, METH_VARARGS, "apply an affine transformation to cell list" }, { "evolve", py_evolve, METH_VARARGS, "generate pattern contained in given cell list" }, { "putcells", py_putcells, METH_VARARGS, "paste given cell list into current universe" }, { "getcells", py_getcells, METH_VARARGS, "return cell list in given rectangle" }, { "join", py_join, METH_VARARGS, "return concatenation of given cell lists" }, { "hash", py_hash, METH_VARARGS, "return hash value for pattern in given rectangle" }, { "getclip", py_getclip, METH_VARARGS, "return pattern in clipboard (as cell list)" }, { "select", py_select, METH_VARARGS, "select [x, y, wd, ht] rectangle or remove if []" }, { "getrect", py_getrect, METH_VARARGS, "return pattern rectangle as [] or [x, y, wd, ht]" }, { "getselrect", py_getselrect, METH_VARARGS, "return selection rectangle as [] or [x, y, wd, ht]" }, { "setcell", py_setcell, METH_VARARGS, "set given cell to given state" }, { "getcell", py_getcell, METH_VARARGS, "get state of given cell" }, { "setcursor", py_setcursor, METH_VARARGS, "set cursor (returns old cursor)" }, { "getcursor", py_getcursor, METH_VARARGS, "return current cursor" }, // control { "empty", py_empty, METH_VARARGS, "return true if universe is empty" }, { "run", py_run, METH_VARARGS, "run current pattern for given number of gens" }, { "step", py_step, METH_VARARGS, "run current pattern for current step" }, { "setstep", py_setstep, METH_VARARGS, "set step exponent" }, { "getstep", py_getstep, METH_VARARGS, "return current step exponent" }, { "setbase", py_setbase, METH_VARARGS, "set base step" }, { "getbase", py_getbase, METH_VARARGS, "return current base step" }, { "advance", py_advance, METH_VARARGS, "advance inside/outside selection by given gens" }, { "reset", py_reset, METH_VARARGS, "restore starting pattern" }, { "setgen", py_setgen, METH_VARARGS, "set current generation to given string" }, { "getgen", py_getgen, METH_VARARGS, "return current generation as string" }, { "getpop", py_getpop, METH_VARARGS, "return current population as string" }, { "numstates", py_numstates, METH_VARARGS, "return number of cell states in current universe" }, { "numalgos", py_numalgos, METH_VARARGS, "return number of algorithms" }, { "setalgo", py_setalgo, METH_VARARGS, "set current algorithm using given string" }, { "getalgo", py_getalgo, METH_VARARGS, "return name of given or current algorithm" }, { "setrule", py_setrule, METH_VARARGS, "set current rule using given string" }, { "getrule", py_getrule, METH_VARARGS, "return current rule" }, { "getwidth", py_getwidth, METH_VARARGS, "return width of universe (0 if unbounded)" }, { "getheight", py_getheight, METH_VARARGS, "return height of universe (0 if unbounded)" }, // viewing { "setpos", py_setpos, METH_VARARGS, "move given cell to middle of viewport" }, { "getpos", py_getpos, METH_VARARGS, "return x,y position of cell in middle of viewport" }, { "setmag", py_setmag, METH_VARARGS, "set magnification (0=1:1, 1=1:2, -1=2:1, etc)" }, { "getmag", py_getmag, METH_VARARGS, "return current magnification" }, { "fit", py_fit, METH_VARARGS, "fit entire pattern in viewport" }, { "fitsel", py_fitsel, METH_VARARGS, "fit selection in viewport" }, { "visrect", py_visrect, METH_VARARGS, "return true if given rect is completely visible" }, { "update", py_update, METH_VARARGS, "update display (viewport and status bar)" }, { "autoupdate", py_autoupdate, METH_VARARGS, "update display after each change to universe?" }, // layers { "addlayer", py_addlayer, METH_VARARGS, "add a new layer" }, { "clone", py_clone, METH_VARARGS, "add a cloned layer (shares universe)" }, { "duplicate", py_duplicate, METH_VARARGS, "add a duplicate layer (copies universe)" }, { "dellayer", py_dellayer, METH_VARARGS, "delete current layer" }, { "movelayer", py_movelayer, METH_VARARGS, "move given layer to new index" }, { "setlayer", py_setlayer, METH_VARARGS, "switch to given layer" }, { "getlayer", py_getlayer, METH_VARARGS, "return index of current layer" }, { "numlayers", py_numlayers, METH_VARARGS, "return current number of layers" }, { "maxlayers", py_maxlayers, METH_VARARGS, "return maximum number of layers" }, { "setname", py_setname, METH_VARARGS, "set name of given layer" }, { "getname", py_getname, METH_VARARGS, "get name of given layer" }, { "setcolors", py_setcolors, METH_VARARGS, "set color(s) used in current layer" }, { "getcolors", py_getcolors, METH_VARARGS, "get color(s) used in current layer" }, // miscellaneous { "setoption", py_setoption, METH_VARARGS, "set given option to new value (returns old value)" }, { "getoption", py_getoption, METH_VARARGS, "return current value of given option" }, { "setcolor", py_setcolor, METH_VARARGS, "set given color to new r,g,b (returns old r,g,b)" }, { "getcolor", py_getcolor, METH_VARARGS, "return r,g,b values of given color" }, { "setclipstr", py_setclipstr, METH_VARARGS, "set the clipboard contents to a given string value" }, { "getclipstr", py_getclipstr, METH_VARARGS, "retrieve the contents of the clipboard as a string" }, { "getstring", py_getstring, METH_VARARGS, "display dialog box to get string from user" }, { "getxy", py_getxy, METH_VARARGS, "return current grid location of mouse" }, { "getevent", py_getevent, METH_VARARGS, "return keyboard/mouse event or empty string if none" }, { "doevent", py_doevent, METH_VARARGS, "pass given keyboard/mouse event to Golly to handle" }, // next two are deprecated (use getevent and doevent) { "getkey", py_getkey, METH_VARARGS, "return key hit by user or empty string if none" }, { "dokey", py_dokey, METH_VARARGS, "pass given key to Golly's standard key handler" }, { "show", py_show, METH_VARARGS, "show given string in status bar" }, { "error", py_error, METH_VARARGS, "beep and show given string in status bar" }, { "warn", py_warn, METH_VARARGS, "show given string in warning dialog" }, { "note", py_note, METH_VARARGS, "show given string in note dialog" }, { "help", py_help, METH_VARARGS, "show given HTML file in help window" }, { "check", py_check, METH_VARARGS, "allow event checking?" }, { "exit", py_exit, METH_VARARGS, "exit script with optional error message" }, // for internal use (don't document) { "stderr", py_stderr, METH_VARARGS, "save Python error message" }, { NULL, NULL, 0, NULL } }; // ============================================================================= bool pyinited = false; // InitPython has been successfully called? bool InitPython() { if (!pyinited) { #ifdef USE_PYTHON_DYNAMIC // try to load Python library if ( !LoadPythonLib() ) return false; #endif // only initialize the Python interpreter once, mainly because multiple // Py_Initialize/Py_Finalize calls cause leaks of about 12K each time! Py_Initialize(); #ifdef USE_PYTHON_DYNAMIC GetPythonExceptions(); #endif // allow Python to call the above py_* routines Py_InitModule((char*)"golly", py_methods); // catch Python messages sent to stderr and pass them to py_stderr if ( PyRun_SimpleString( "import golly\n" "import sys\n" "class StderrCatcher:\n" " def __init__(self):\n" " self.data = ''\n" " def write(self, stuff):\n" " self.data += stuff\n" " golly.stderr(self.data)\n" "sys.stderr = StderrCatcher()\n" // also create dummy sys.argv so scripts can import Tkinter "sys.argv = ['golly-app']\n" // works, but Golly's menus get permanently changed on Mac ) < 0 ) Warning(_("StderrCatcher code failed!")); // build absolute path to Scripts/Python folder and add to Python's // import search list so scripts can import glife from anywhere wxString scriptsdir = gollydir + _("Scripts"); scriptsdir += wxFILE_SEP_PATH; scriptsdir += _("Python"); // convert any \ to \\ and then convert any ' to \' scriptsdir.Replace(wxT("\\"), wxT("\\\\")); scriptsdir.Replace(wxT("'"), wxT("\\'")); wxString command = wxT("import sys ; sys.path.append('") + scriptsdir + wxT("')"); // also insert script's current directory at start of sys.path // since that's what most Python interpreter's do (thanks to Joel Snyder) command += wxT(" ; sys.path.insert(0,'')"); if ( PyRun_SimpleString(command.mb_str(wxConvLocal)) < 0 ) Warning(_("Failed to append Scripts path!")); pyinited = true; } else { // Py_Initialize has already been successfully called; // Py_Finalize is not used to close stderr so reset it here if ( PyRun_SimpleString("sys.stderr.data = ''\n") < 0 ) Warning(_("PyRun_SimpleString failed!")); } return true; } // ----------------------------------------------------------------------------- void RunPythonScript(const wxString& filepath) { if (!InitPython()) return; // we must convert any backslashes to "\\" to avoid "\a" being treated as // escape char, then we must escape any apostrophes wxString fpath = filepath; fpath.Replace(wxT("\\"), wxT("\\\\")); fpath.Replace(wxT("'"), wxT("\\'")); // execute the given script; note that we pass an empty dictionary // for the global namespace so that this script cannot change the // globals of a caller script (which is possible now that RunScript // is re-entrant) wxString command = wxT("execfile('") + fpath + wxT("',{})"); PyRun_SimpleString(command.mb_str(wxConvLocal)); // note that PyRun_SimpleString returns -1 if an exception occurred; // the error message (in scripterr) is checked at the end of RunScript } // ----------------------------------------------------------------------------- void FinishPythonScripting() { // Py_Finalize can cause an obvious delay, so best not to call it // if (pyinited) Py_Finalize(); // probably don't really need this either #ifdef USE_PYTHON_DYNAMIC FreePythonLib(); #endif } golly-2.5-src/gui-wx/wxrender.cpp0000644000175100001440000020176312156145314014006 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /* -------------------- Some notes on Golly's display code --------------------- The rectangular area used to display patterns is called the viewport. It's represented by a window of class PatternView defined in wxview.h. The global viewptr points to a PatternView window which is created in MainFrame::MainFrame() in wxmain.cpp. Nearly all drawing in the viewport is done in this module. The only other place is in wxview.cpp where PatternView::DrawOneCell() is used to draw cells with the pencil cursor. This is done for performance reasons -- using Refresh + Update to do the drawing is too slow. The main rendering routine is DrawView() -- see the end of this module. DrawView() is called from PatternView::OnPaint(), the update event handler for the viewport window. Update events are created automatically by the wxWidgets event dispatcher, or they can be created manually by calling Refresh() and Update(). DrawView() does the following tasks: - Calls currlayer->algo->draw() to draw the current pattern. It passes in renderer, an instance of wx_render (derived from liferender) which has these methods: - killrect() draws a rectangular area of dead cells. - pixblit() draws a pixmap containing at least one live cell. - getcolors() provides access to the current layer's color arrays. Note that currlayer->algo->draw() does all the hard work of figuring out which parts of the viewport are dead and building all the pixmaps for the live parts. The pixmaps contain suitably shrunken images when the scale is < 1:1 (ie. mag < 0). Each lifealgo needs to implement its own draw() method; for example, hlifealgo::draw() in hlifedraw.cpp. - Calls DrawGridLines() to overlay grid lines if they are visible. - Calls DrawGridBorder() to draw border around a bounded universe. - Calls DrawSelection() to overlay a translucent selection rectangle if a selection exists and any part of it is visible. - Calls DrawStackedLayers() to overlay multiple layers using the current layer's scale and location. - If the user is doing a paste, CheckPasteImage() creates a temporary viewport (tempview) and draws the paste pattern (stored in pastealgo) into a masked pixmap which is then used by DrawPasteImage(). - Calls DrawControls() if the translucent controls need to be drawn. Other points of interest: - The decision to use buffered drawing is made in PatternView::OnPaint(). It's never used on Mac OS X or GTK+ 2.0 because windows on those systems are automatically buffered. To avoid flicker on Windows, buffering is always used if any of these conditions are true: - the user is doing a paste; - the grid lines are visible; - the selection is visible; - the translucent controls are visible; - multiple layers are being displayed. - Change the "#if 0" to "#if 1" in wx_render::killrect() to see randomly colored rects. This gives an insight into how lifealgo::draw() works. - The viewport window is actually the right-hand pane of a wxSplitWindow. The left-hand pane is a directory control (wxGenericDirCtrl) that displays the user's preferred pattern or script folder. This is all handled in wxmain.cpp. ----------------------------------------------------------------------------- */ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/rawbmp.h" // for wxAlphaPixelData #include "bigint.h" #include "lifealgo.h" #include "viewport.h" #include "wxgolly.h" // for viewptr, bigview, statusptr #include "wxutils.h" // for Warning, Fatal, FillRect #include "wxprefs.h" // for showgridlines, mingridmag, swapcolors, etc #include "wxstatus.h" // for statusptr->... #include "wxview.h" // for viewptr->... #include "wxlayer.h" // currlayer, GetLayer, etc #include "wxrender.h" // ----------------------------------------------------------------------------- // globals used in wx_render routines wxDC* currdc; // current device context for viewport int currwd, currht; // current width and height of viewport wxBitmap* pixmap = NULL; // 32-bit deep bitmap used in pixblit calls int pixmapwd = -1; // width of pixmap int pixmapht = -1; // height of pixmap wxBitmap** iconmaps; // array of icon bitmaps // for drawing translucent selection (initialized in InitDrawingData) int selwd; // width of selection bitmap int selht; // height of selection bitmap wxBitmap* selbitmap = NULL; // selection bitmap (if NULL then inversion is used) wxBitmap* graybitmap = NULL; // for inactive selections when drawing multiple layers // for drawing paste pattern (initialized in CreatePasteImage) wxBitmap* pastebitmap; // paste bitmap int pimagewd; // width of paste image int pimageht; // height of paste image int prectwd; // must match viewptr->pasterect.width int prectht; // must match viewptr->pasterect.height int pastemag; // must match current viewport's scale int cvwd, cvht; // must match current viewport's width and height paste_location pasteloc; // must match plocation bool pasteicons; // must match showicons bool pastecolors; // must match swapcolors lifealgo* pastealgo; // universe containing paste pattern wxRect pastebbox; // bounding box in cell coords (not necessarily minimal) // for drawing multiple layers int layerwd = -1; // width of layer bitmap int layerht = -1; // height of layer bitmap wxBitmap* layerbitmap = NULL; // layer bitmap // for drawing translucent controls wxBitmap* ctrlsbitmap = NULL; // controls bitmap wxBitmap* darkctrls = NULL; // for showing clicked control int controlswd; // width of ctrlsbitmap int controlsht; // height of ctrlsbitmap // include controls_xpm (XPM data for controls bitmap) #include "bitmaps/controls.xpm" // these constants must match image dimensions in bitmaps/controls.xpm const int buttborder = 6; // size of outer border const int buttsize = 22; // size of each button const int buttsperrow = 3; // # of buttons in each row const int numbutts = 15; // # of buttons const int rowgap = 4; // vertical gap after first 2 rows // currently clicked control control_id currcontrol = NO_CONTROL; // ----------------------------------------------------------------------------- void CreateTranslucentControls() { wxImage image(controls_xpm); controlswd = image.GetWidth(); controlsht = image.GetHeight(); // use depth 32 so bitmap has an alpha channel ctrlsbitmap = new wxBitmap(controlswd, controlsht, 32); if (ctrlsbitmap == NULL) { Warning(_("Not enough memory for controls bitmap!")); } else { // set ctrlsbitmap pixels and their alpha values based on pixels in image wxAlphaPixelData data(*ctrlsbitmap, wxPoint(0,0), wxSize(controlswd,controlsht)); if (data) { int alpha = 192; // 75% opaque #if !wxCHECK_VERSION(2,9,0) data.UseAlpha(); #endif wxAlphaPixelData::Iterator p(data); for ( int y = 0; y < controlsht; y++ ) { wxAlphaPixelData::Iterator rowstart = p; for ( int x = 0; x < controlswd; x++ ) { int r = image.GetRed(x,y); int g = image.GetGreen(x,y); int b = image.GetBlue(x,y); if (r == 0 && g == 0 && b == 0) { // make black pixel fully transparent p.Red() = 0; p.Green() = 0; p.Blue() = 0; p.Alpha() = 0; } else { // make all non-black pixels translucent #if defined(__WXMSW__) || (defined(__WXMAC__) && wxCHECK_VERSION(2,8,8)) // premultiply the RGB values p.Red() = r * alpha / 255; p.Green() = g * alpha / 255; p.Blue() = b * alpha / 255; #else p.Red() = r; p.Green() = g; p.Blue() = b; #endif p.Alpha() = alpha; } p++; } p = rowstart; p.OffsetY(data, 1); } } } // create bitmap for showing clicked control darkctrls = new wxBitmap(controlswd, controlsht, 32); if (darkctrls == NULL) { Warning(_("Not enough memory for dark controls bitmap!")); } else { // set darkctrls pixels and their alpha values based on pixels in image wxAlphaPixelData data(*darkctrls, wxPoint(0,0), wxSize(controlswd,controlsht)); if (data) { int alpha = 128; // 50% opaque int gray = 20; // very dark gray #if !wxCHECK_VERSION(2,9,0) data.UseAlpha(); #endif wxAlphaPixelData::Iterator p(data); for ( int y = 0; y < controlsht; y++ ) { wxAlphaPixelData::Iterator rowstart = p; for ( int x = 0; x < controlswd; x++ ) { int r = image.GetRed(x,y); int g = image.GetGreen(x,y); int b = image.GetBlue(x,y); if (r == 0 && g == 0 && b == 0) { // make black pixel fully transparent p.Red() = 0; p.Green() = 0; p.Blue() = 0; p.Alpha() = 0; } else { // make all non-black pixels translucent gray #if defined(__WXMSW__) || (defined(__WXMAC__) && wxCHECK_VERSION(2,8,8)) // premultiply the RGB values p.Red() = gray * alpha / 255; p.Green() = gray * alpha / 255; p.Blue() = gray * alpha / 255; #else p.Red() = gray; p.Green() = gray; p.Blue() = gray; #endif p.Alpha() = alpha; } p++; } p = rowstart; p.OffsetY(data, 1); } } } } // ----------------------------------------------------------------------------- control_id WhichControl(int x, int y) { // determine which button is at x,y in controls bitmap int col, row; x -= buttborder; y -= buttborder; if (x < 0 || y < 0) return NO_CONTROL; // allow for vertical gap after first 2 rows if (y < (buttsize + rowgap)) { if (y > buttsize) return NO_CONTROL; // in 1st gap row = 1; } else if (y < 2*(buttsize + rowgap)) { if (y > 2*buttsize + rowgap) return NO_CONTROL; // in 2nd gap row = 2; } else { row = 3 + (y - 2*(buttsize + rowgap)) / buttsize; } col = 1 + x / buttsize; if (col < 1 || col > buttsperrow) return NO_CONTROL; if (row < 1 || row > numbutts/buttsperrow) return NO_CONTROL; int control = (row - 1) * buttsperrow + col; return (control_id) control; } // ----------------------------------------------------------------------------- void DrawControls(wxDC& dc, wxRect& rect) { if (ctrlsbitmap) { #ifdef __WXGTK__ // wxGTK Blit doesn't support alpha channel dc.DrawBitmap(*ctrlsbitmap, rect.x, rect.y, true); #else // Blit is about 10% faster than DrawBitmap (on Mac at least) wxMemoryDC memdc; memdc.SelectObject(*ctrlsbitmap); dc.Blit(rect.x, rect.y, rect.width, rect.height, &memdc, 0, 0, wxCOPY, true); memdc.SelectObject(wxNullBitmap); #endif if (currcontrol > NO_CONTROL && darkctrls) { // show clicked control int i = (int)currcontrol - 1; int x = buttborder + (i % buttsperrow) * buttsize; int y = buttborder + (i / buttsperrow) * buttsize; // allow for vertical gap after first 2 rows if (i < buttsperrow) { // y is correct } else if (i < 2*buttsperrow) { y += rowgap; } else { y += 2*rowgap; } #ifdef __WXGTK__ // wxGTK Blit doesn't support alpha channel wxRect r(x, y, buttsize, buttsize); dc.DrawBitmap(darkctrls->GetSubBitmap(r), rect.x + x, rect.y + y, true); #else wxMemoryDC memdc; memdc.SelectObject(*darkctrls); dc.Blit(rect.x + x, rect.y + y, buttsize, buttsize, &memdc, x, y, wxCOPY, true); memdc.SelectObject(wxNullBitmap); #endif } } } // ----------------------------------------------------------------------------- void SetSelectionPixels(wxBitmap* bitmap, const wxColor* color) { // set color and alpha of pixels in given bitmap wxAlphaPixelData data(*bitmap, wxPoint(0,0), wxSize(selwd,selht)); if (data) { int alpha = 128; // 50% opaque #if defined(__WXMSW__) || (defined(__WXMAC__) && wxCHECK_VERSION(2,8,8)) // premultiply the RGB values int r = color->Red() * alpha / 255; int g = color->Green() * alpha / 255; int b = color->Blue() * alpha / 255; #else int r = color->Red(); int g = color->Green(); int b = color->Blue(); #endif #if !wxCHECK_VERSION(2,9,0) data.UseAlpha(); #endif wxAlphaPixelData::Iterator p(data); for ( int y = 0; y < selht; y++ ) { wxAlphaPixelData::Iterator rowstart = p; for ( int x = 0; x < selwd; x++ ) { p.Red() = r; p.Green() = g; p.Blue() = b; p.Alpha() = alpha; p++; } p = rowstart; p.OffsetY(data, 1); } } } // ----------------------------------------------------------------------------- void InitDrawingData() { // create translucent selection bitmap viewptr->GetClientSize(&selwd, &selht); // selwd or selht might be < 1 on Windows if (selwd < 1) selwd = 1; if (selht < 1) selht = 1; // use depth 32 so bitmap has an alpha channel selbitmap = new wxBitmap(selwd, selht, 32); if (selbitmap == NULL) { Warning(_("Not enough memory for selection bitmap!")); } else { SetSelectionPixels(selbitmap, selectrgb); } // create translucent gray bitmap for inactive selections graybitmap = new wxBitmap(selwd, selht, 32); if (graybitmap == NULL) { Warning(_("Not enough memory for gray bitmap!")); } else { SetSelectionPixels(graybitmap, wxLIGHT_GREY); } } // ----------------------------------------------------------------------------- void DestroyDrawingData() { delete layerbitmap; delete selbitmap; delete graybitmap; delete ctrlsbitmap; delete darkctrls; delete pixmap; } // ----------------------------------------------------------------------------- // called from wx_render::pixblit to draw a bitmap at 1:1 scale void DrawPixmap(unsigned char* byteptr, int x, int y, int w, int h, int stride) { wxAlphaPixelData pxldata(*pixmap); if (pxldata) { #if defined(__WXGTK__) && !wxCHECK_VERSION(2,9,0) pxldata.UseAlpha(); #endif wxAlphaPixelData::Iterator p(pxldata); for ( int row = 0; row < h; row++ ) { wxAlphaPixelData::Iterator rowstart = p; for ( int col = 0; col < w; col++ ) { p.Red() = byteptr[(row*stride + col)*3 + 0]; p.Green() = byteptr[(row*stride + col)*3 + 1]; p.Blue() = byteptr[(row*stride + col)*3 + 2]; #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif p++; } p = rowstart; p.OffsetY(pxldata, 1); } } currdc->DrawBitmap(*pixmap, x, y); } // ----------------------------------------------------------------------------- // called from wx_render::pixblit to magnify given pixmap by pmscale (2, 4, ... 2^MAX_MAG) void DrawStretchedPixmap(unsigned char* byteptr, int x, int y, int w, int h, int pmscale, int stride) { int cellsize = pmscale > 2 ? pmscale - 1 : pmscale; bool drawgap = (pmscale > 2 && pmscale < (1 << mingridmag)) || #ifdef __WXMAC__ // wxMac seems to draw lines with semi-transparent pixels at the // top/left ends, so we have to draw gaps even if showing grid lines // otherwise we see annoying dots at the top/left edge of the viewport (pmscale >= (1 << mingridmag)); #else (pmscale >= (1 << mingridmag) && !showgridlines); #endif unsigned char deadr = currlayer->cellr[0]; unsigned char deadg = currlayer->cellg[0]; unsigned char deadb = currlayer->cellb[0]; // might be faster to draw rectangles above certain scales??? wxAlphaPixelData pxldata(*pixmap); if (pxldata) { #if defined(__WXGTK__) && !wxCHECK_VERSION(2,9,0) pxldata.UseAlpha(); #endif wxAlphaPixelData::Iterator p(pxldata); for ( int row = 0; row < h; row++ ) { wxAlphaPixelData::Iterator rowstart = p; for ( int col = 0; col < w; col++ ) { unsigned char state = byteptr[row*stride + col]; unsigned char r = currlayer->cellr[state]; unsigned char g = currlayer->cellg[state]; unsigned char b = currlayer->cellb[state]; // expand byte into cellsize*cellsize pixels wxAlphaPixelData::Iterator topleft = p; for (int i = 0; i < cellsize; i++) { wxAlphaPixelData::Iterator colstart = p; for (int j = 0; j < cellsize; j++) { p.Red() = r; p.Green() = g; p.Blue() = b; #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif p++; } if (drawgap) { // draw dead pixels at right edge of cell p.Red() = deadr; p.Green() = deadg; p.Blue() = deadb; #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif } p = colstart; p.OffsetY(pxldata, 1); } if (drawgap) { // draw dead pixels at bottom edge of cell for (int j = 0; j <= cellsize; j++) { p.Red() = deadr; p.Green() = deadg; p.Blue() = deadb; #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif p++; } } p = topleft; p.OffsetX(pxldata, pmscale); } p = rowstart; p.OffsetY(pxldata, pmscale); } } currdc->DrawBitmap(*pixmap, x, y); } // ----------------------------------------------------------------------------- void DrawIcons(unsigned char* byteptr, int x, int y, int w, int h, int pmscale, int stride) { // called from wx_render::pixblit to draw icons for each live cell; // assume pmscale > 2 (should be 8 or 16 or 32) int cellsize = pmscale - 1; bool drawgap = (pmscale < (1 << mingridmag)) || #ifdef __WXMAC__ // wxMac seems to draw lines with semi-transparent pixels at the // top/left ends, so we have to draw gaps even if showing grid lines // otherwise we see annoying dots at the top/left edge of the viewport (pmscale >= (1 << mingridmag)); #else (pmscale >= (1 << mingridmag) && !showgridlines); #endif unsigned char deadr = currlayer->cellr[0]; unsigned char deadg = currlayer->cellg[0]; unsigned char deadb = currlayer->cellb[0]; bool multicolor = currlayer->multicoloricons; wxAlphaPixelData pxldata(*pixmap); if (pxldata) { #if defined(__WXGTK__) && !wxCHECK_VERSION(2,9,0) pxldata.UseAlpha(); #endif wxAlphaPixelData::Iterator p(pxldata); for ( int row = 0; row < h; row++ ) { wxAlphaPixelData::Iterator rowstart = p; for ( int col = 0; col < w; col++ ) { unsigned char state = byteptr[row*stride + col]; unsigned char liver = currlayer->cellr[state]; unsigned char liveg = currlayer->cellg[state]; unsigned char liveb = currlayer->cellb[state]; wxAlphaPixelData::Iterator topleft = p; if (state && iconmaps[state]) { wxAlphaPixelData icondata(*iconmaps[state]); if (icondata) { wxAlphaPixelData::Iterator iconpxl(icondata); for (int i = 0; i < cellsize; i++) { wxAlphaPixelData::Iterator colstart = p; wxAlphaPixelData::Iterator iconrow = iconpxl; for (int j = 0; j < cellsize; j++) { if (iconpxl.Red() || iconpxl.Green() || iconpxl.Blue()) { if (multicolor) { // use non-black pixel in multi-colored icon if (swapcolors) { p.Red() = 255 - iconpxl.Red(); p.Green() = 255 - iconpxl.Green(); p.Blue() = 255 - iconpxl.Blue(); } else { p.Red() = iconpxl.Red(); p.Green() = iconpxl.Green(); p.Blue() = iconpxl.Blue(); } } else { // grayscale icon if (iconpxl.Red() == 255) { // replace white pixel with live cell color p.Red() = liver; p.Green() = liveg; p.Blue() = liveb; } else { // replace gray pixel with appropriate shade between // live and dead cell colors float frac = (float)(iconpxl.Red()) / 255.0; p.Red() = (int)(deadr + frac * (liver - deadr) + 0.5); p.Green() = (int)(deadg + frac * (liveg - deadg) + 0.5); p.Blue() = (int)(deadb + frac * (liveb - deadb) + 0.5); } } } else { // replace black pixel with dead cell color p.Red() = deadr; p.Green() = deadg; p.Blue() = deadb; } #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif p++; iconpxl++; } if (drawgap) { // draw dead pixels at right edge of cell p.Red() = deadr; p.Green() = deadg; p.Blue() = deadb; #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif } p = colstart; p.OffsetY(pxldata, 1); // move to next row of icon bitmap iconpxl = iconrow; iconpxl.OffsetY(icondata, 1); } if (drawgap) { // draw dead pixels at bottom edge of cell for (int j = 0; j <= cellsize; j++) { p.Red() = deadr; p.Green() = deadg; p.Blue() = deadb; #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif p++; } } } } else { // draw dead cell for (int i = 0; i < cellsize; i++) { wxAlphaPixelData::Iterator colstart = p; for (int j = 0; j < cellsize; j++) { p.Red() = deadr; p.Green() = deadg; p.Blue() = deadb; #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif p++; } if (drawgap) { // draw dead pixels at right edge of cell p.Red() = deadr; p.Green() = deadg; p.Blue() = deadb; #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif } p = colstart; p.OffsetY(pxldata, 1); } if (drawgap) { // draw dead pixels at bottom edge of cell for (int j = 0; j <= cellsize; j++) { p.Red() = deadr; p.Green() = deadg; p.Blue() = deadb; #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif p++; } } } p = topleft; p.OffsetX(pxldata, pmscale); } p = rowstart; p.OffsetY(pxldata, pmscale); } } currdc->DrawBitmap(*pixmap, x, y); } // ----------------------------------------------------------------------------- void DrawOneIcon(wxDC& dc, int x, int y, wxBitmap* icon, unsigned char deadr, unsigned char deadg, unsigned char deadb, unsigned char liver, unsigned char liveg, unsigned char liveb, bool multicolor) { // draw a single icon (either multi-color or grayscale) int wd = icon->GetWidth(); int ht = icon->GetHeight(); wxBitmap pixmap(wd, ht, 32); wxAlphaPixelData pxldata(pixmap); if (pxldata) { #if defined(__WXGTK__) && !wxCHECK_VERSION(2,9,0) pxldata.UseAlpha(); #endif wxAlphaPixelData::Iterator p(pxldata); wxAlphaPixelData icondata(*icon); if (icondata) { wxAlphaPixelData::Iterator iconpxl(icondata); for (int i = 0; i < ht; i++) { wxAlphaPixelData::Iterator pixmaprow = p; wxAlphaPixelData::Iterator iconrow = iconpxl; for (int j = 0; j < wd; j++) { if (iconpxl.Red() || iconpxl.Green() || iconpxl.Blue()) { if (multicolor) { // use non-black pixel in multi-colored icon if (swapcolors) { p.Red() = 255 - iconpxl.Red(); p.Green() = 255 - iconpxl.Green(); p.Blue() = 255 - iconpxl.Blue(); } else { p.Red() = iconpxl.Red(); p.Green() = iconpxl.Green(); p.Blue() = iconpxl.Blue(); } } else { // grayscale icon if (iconpxl.Red() == 255) { // replace white pixel with live cell color p.Red() = liver; p.Green() = liveg; p.Blue() = liveb; } else { // replace gray pixel with appropriate shade between // live and dead cell colors float frac = (float)(iconpxl.Red()) / 255.0; p.Red() = (int)(deadr + frac * (liver - deadr) + 0.5); p.Green() = (int)(deadg + frac * (liveg - deadg) + 0.5); p.Blue() = (int)(deadb + frac * (liveb - deadb) + 0.5); } } } else { // replace black pixel with dead cell color p.Red() = deadr; p.Green() = deadg; p.Blue() = deadb; } #if defined(__WXGTK__) || wxCHECK_VERSION(2,9,0) p.Alpha() = 255; #endif p++; iconpxl++; } // move to next row of pixmap p = pixmaprow; p.OffsetY(pxldata, 1); // move to next row of icon bitmap iconpxl = iconrow; iconpxl.OffsetY(icondata, 1); } } } dc.DrawBitmap(pixmap, x, y); } // ----------------------------------------------------------------------------- class wx_render : public liferender { public: wx_render() {} virtual ~wx_render() {} virtual void killrect(int x, int y, int w, int h); virtual void pixblit(int x, int y, int w, int h, char* pm, int pmscale); virtual void getcolors(unsigned char** r, unsigned char** g, unsigned char** b); }; wx_render renderer; // create instance // ----------------------------------------------------------------------------- void wx_render::killrect(int x, int y, int w, int h) { // is Tom's hashdraw code doing unnecessary work??? if (x >= currwd || y >= currht) return; if (x + w <= 0 || y + h <= 0) return; if (w <= 0 || h <= 0) return; // clip given rect so it's within viewport int clipx = x < 0 ? 0 : x; int clipy = y < 0 ? 0 : y; int clipr = x + w; int clipb = y + h; if (clipr > currwd) clipr = currwd; if (clipb > currht) clipb = currht; int clipwd = clipr - clipx; int clipht = clipb - clipy; wxRect rect(clipx, clipy, clipwd, clipht); #if 0 // use a different pale color each time to see any probs wxBrush randbrush(wxColor((rand()&127)+128, (rand()&127)+128, (rand()&127)+128)); FillRect(*currdc, rect, randbrush); #else FillRect(*currdc, rect, *currlayer->deadbrush); #endif } // ----------------------------------------------------------------------------- void wx_render::pixblit(int x, int y, int w, int h, char* pmdata, int pmscale) { // is Tom's hashdraw code doing unnecessary work??? if (x >= currwd || y >= currht) return; if (x + w <= 0 || y + h <= 0) return; // stride is the horizontal pixel width of the image data int stride = (pmscale == 1) ? w : w/pmscale; // clip pixmap to be drawn against viewport: if (pmscale == 1) { // pmdata contains 3 bytes per pixel if (x < 0) { pmdata -= 3*x; w += x; x = 0; } if (y < 0) { pmdata -= 3*y*stride; h += y; y = 0; } if (w > currwd) w = currwd; if (h > currht) h = currht; } else { // pmdata contains 1 byte per `pmscale' pixels, so we must be careful // and adjust x, y, w and h by multiples of `pmscale' only. if (x < 0) { int dx = -x/pmscale*pmscale; pmdata += dx/pmscale; w -= dx; x += dx; } if (y < 0) { int dy = -y/pmscale*pmscale; pmdata += dy/pmscale*stride; h -= dy; y += dy; } if (x + w >= currwd + pmscale) w = (currwd - x + pmscale - 1)/pmscale*pmscale; if (y + h >= currht + pmscale) h = (currht - y + pmscale - 1)/pmscale*pmscale; } // faster to create new pixmap only when size changes if (pixmapwd != w || pixmapht != h) { delete pixmap; pixmap = new wxBitmap(w, h, 32); pixmapwd = w; pixmapht = h; } if (pmscale == 1) { // draw rgb pixel data DrawPixmap((unsigned char*) pmdata, x, y, w, h, stride); } else if (showicons && pmscale > 4 && iconmaps) { // draw icons only at scales 1:8 or 1:16 or 1:32 DrawIcons((unsigned char*) pmdata, x, y, w/pmscale, h/pmscale, pmscale, stride); } else { // stretch pixmap by pmscale, assuming pmdata contains (w/pmscale)*(h/pmscale) bytes // where each byte contains a cell state DrawStretchedPixmap((unsigned char*) pmdata, x, y, w/pmscale, h/pmscale, pmscale, stride); } } // ----------------------------------------------------------------------------- void wx_render::getcolors(unsigned char** r, unsigned char** g, unsigned char** b) { *r = currlayer->cellr; *g = currlayer->cellg; *b = currlayer->cellb; } // ----------------------------------------------------------------------------- void CheckSelectionSize(int viewwd, int viewht) { if (viewwd != selwd || viewht != selht) { // resize selbitmap and graybitmap selwd = viewwd; selht = viewht; delete selbitmap; delete graybitmap; // use depth 32 so bitmaps have an alpha channel selbitmap = new wxBitmap(selwd, selht, 32); graybitmap = new wxBitmap(selwd, selht, 32); if (selbitmap) SetSelectionPixels(selbitmap, selectrgb); if (graybitmap) SetSelectionPixels(graybitmap, wxLIGHT_GREY); } } // ----------------------------------------------------------------------------- void SetSelectionColor() { // selectrgb has changed if (selbitmap) SetSelectionPixels(selbitmap, selectrgb); } // ----------------------------------------------------------------------------- void DrawSelection(wxDC& dc, wxRect& rect) { if (selbitmap) { #ifdef __WXGTK__ // wxGTK Blit doesn't support alpha channel if (selectrgb->Red() == 255 && selectrgb->Green() == 255 && selectrgb->Blue() == 255) { // use inversion for speed dc.Blit(rect.x, rect.y, rect.width, rect.height, &dc, rect.x, rect.y, wxINVERT); } else { dc.DrawBitmap(selbitmap->GetSubBitmap(rect), rect.x, rect.y, true); } #else // Blit seems to be about 10% faster (on Mac at least) wxMemoryDC memdc; memdc.SelectObject(*selbitmap); dc.Blit(rect.x, rect.y, rect.width, rect.height, &memdc, 0, 0, wxCOPY, true); memdc.SelectObject(wxNullBitmap); #endif } else { // no alpha channel so just invert rect dc.Blit(rect.x, rect.y, rect.width, rect.height, &dc, rect.x, rect.y, wxINVERT); } } // ----------------------------------------------------------------------------- void DrawInactiveSelection(wxDC& dc, wxRect& rect) { if (graybitmap) { #ifdef __WXGTK__ // wxGTK Blit doesn't support alpha channel if (selectrgb->Red() == 255 && selectrgb->Green() == 255 && selectrgb->Blue() == 255) { // use inversion for speed dc.Blit(rect.x, rect.y, rect.width, rect.height, &dc, rect.x, rect.y, wxINVERT); } else { dc.DrawBitmap(graybitmap->GetSubBitmap(rect), rect.x, rect.y, true); } #else // Blit seems to be about 10% faster (on Mac at least) wxMemoryDC memdc; memdc.SelectObject(*graybitmap); dc.Blit(rect.x, rect.y, rect.width, rect.height, &memdc, 0, 0, wxCOPY, true); memdc.SelectObject(wxNullBitmap); #endif } else { // no alpha channel so just invert rect dc.Blit(rect.x, rect.y, rect.width, rect.height, &dc, rect.x, rect.y, wxINVERT); } } // ----------------------------------------------------------------------------- void CreatePasteImage(lifealgo* palgo, wxRect& bbox) { pastealgo = palgo; // save for use in CheckPasteImage pastebbox = bbox; // ditto pastebitmap = NULL; prectwd = -1; // force CheckPasteImage to update paste image prectht = -1; pimagewd = -1; // force CheckPasteImage to rescale paste image pimageht = -1; pastemag = currlayer->view->getmag(); pasteicons = showicons; pastecolors = swapcolors; } // ----------------------------------------------------------------------------- void DestroyPasteImage() { if (pastebitmap) { delete pastebitmap; pastebitmap = NULL; } } // ----------------------------------------------------------------------------- void MaskDeadPixels(wxBitmap* bitmap, int wd, int ht, int livealpha) { // access pixels in given bitmap and make all dead pixels 100% transparent // and use given alpha value for all live pixels wxAlphaPixelData data(*bitmap, wxPoint(0,0), wxSize(wd,ht)); if (data) { int deadr = currlayer->cellr[0]; int deadg = currlayer->cellg[0]; int deadb = currlayer->cellb[0]; #if !wxCHECK_VERSION(2,9,0) data.UseAlpha(); #endif wxAlphaPixelData::Iterator p(data); for ( int y = 0; y < ht; y++ ) { wxAlphaPixelData::Iterator rowstart = p; for ( int x = 0; x < wd; x++ ) { // get pixel color int r = p.Red(); int g = p.Green(); int b = p.Blue(); // set alpha value depending on whether pixel is live or dead if (r == deadr && g == deadg && b == deadb) { // make dead pixel 100% transparent p.Red() = 0; p.Green() = 0; p.Blue() = 0; p.Alpha() = 0; } else { // live pixel #if defined(__WXMSW__) || (defined(__WXMAC__) && wxCHECK_VERSION(2,8,8)) // premultiply the RGB values p.Red() = r * livealpha / 255; p.Green() = g * livealpha / 255; p.Blue() = b * livealpha / 255; #else // no change needed // p.Red() = r; // p.Green() = g; // p.Blue() = b; #endif p.Alpha() = livealpha; } p++; } p = rowstart; p.OffsetY(data, 1); } } } // ----------------------------------------------------------------------------- int PixelsToCells(int pixels) { // convert given # of screen pixels to corresponding # of cells if (pastemag >= 0) { int cellsize = 1 << pastemag; return (pixels + cellsize - 1) / cellsize; } else { // pastemag < 0; no need to worry about overflow return pixels << -pastemag; } } // ----------------------------------------------------------------------------- void CheckPasteImage() { // paste image needs to be updated if any of these changed: // pasterect size, viewport size, plocation, showicons, swapcolors if ( prectwd != viewptr->pasterect.width || prectht != viewptr->pasterect.height || cvwd != currlayer->view->getwidth() || cvht != currlayer->view->getheight() || pasteloc != plocation || pasteicons != showicons || pastecolors != swapcolors ) { prectwd = viewptr->pasterect.width; prectht = viewptr->pasterect.height; pastemag = currlayer->view->getmag(); cvwd = currlayer->view->getwidth(); cvht = currlayer->view->getheight(); pasteloc = plocation; pasteicons = showicons; pastecolors = swapcolors; // calculate size of paste image; we could just set it to pasterect size // but that would be slow and wasteful for large pasterects, so we use // the following code (the only tricky bit is when plocation = Middle) int pastewd = prectwd; int pasteht = prectht; if (pastewd <= 2 || pasteht <= 2) { // no need to draw paste image because border lines will cover it delete pastebitmap; pastebitmap = NULL; if (pimagewd != 1 || pimageht != 1) { pimagewd = 1; pimageht = 1; } return; } wxRect cellbox = pastebbox; if (pastewd > currlayer->view->getwidth() || pasteht > currlayer->view->getheight()) { if (plocation == Middle) { // temporary viewport may need to be TWICE size of current viewport if (pastewd > 2 * currlayer->view->getwidth()) pastewd = 2 * currlayer->view->getwidth(); if (pasteht > 2 * currlayer->view->getheight()) pasteht = 2 * currlayer->view->getheight(); if (pastemag > 0) { // make sure pastewd/ht don't have partial cells int cellsize = 1 << pastemag; if ((pastewd + 1) % cellsize > 0) pastewd += cellsize - ((pastewd + 1) % cellsize); if ((pasteht + 1) % cellsize != 0) pasteht += cellsize - ((pasteht + 1) % cellsize); } if (prectwd > pastewd) { // make sure prectwd - pastewd is an even number of *cells* // to simplify shifting in DrawPasteImage if (pastemag > 0) { int cellsize = 1 << pastemag; int celldiff = (prectwd - pastewd) / cellsize; if (celldiff & 1) pastewd += cellsize; } else { if ((prectwd - pastewd) & 1) pastewd++; } } if (prectht > pasteht) { // make sure prectht - pasteht is an even number of *cells* // to simplify shifting in DrawPasteImage if (pastemag > 0) { int cellsize = 1 << pastemag; int celldiff = (prectht - pasteht) / cellsize; if (celldiff & 1) pasteht += cellsize; } else { if ((prectht - pasteht) & 1) pasteht++; } } } else { // plocation is at a corner of pasterect so temporary viewport // may need to be size of current viewport if (pastewd > currlayer->view->getwidth()) pastewd = currlayer->view->getwidth(); if (pasteht > currlayer->view->getheight()) pasteht = currlayer->view->getheight(); if (pastemag > 0) { // make sure pastewd/ht don't have partial cells int cellsize = 1 << pastemag; int gap = 1; // gap between cells if (pastemag == 1) gap = 0; // no gap at scale 1:2 if ((pastewd + gap) % cellsize > 0) pastewd += cellsize - ((pastewd + gap) % cellsize); if ((pasteht + gap) % cellsize != 0) pasteht += cellsize - ((pasteht + gap) % cellsize); } cellbox.width = PixelsToCells(pastewd); cellbox.height = PixelsToCells(pasteht); if (plocation == TopLeft) { // show top left corner of pasterect cellbox.x = pastebbox.x; cellbox.y = pastebbox.y; } else if (plocation == TopRight) { // show top right corner of pasterect cellbox.x = pastebbox.x + pastebbox.width - cellbox.width; cellbox.y = pastebbox.y; } else if (plocation == BottomRight) { // show bottom right corner of pasterect cellbox.x = pastebbox.x + pastebbox.width - cellbox.width; cellbox.y = pastebbox.y + pastebbox.height - cellbox.height; } else { // plocation == BottomLeft // show bottom left corner of pasterect cellbox.x = pastebbox.x; cellbox.y = pastebbox.y + pastebbox.height - cellbox.height; } } } // delete old bitmap even if size hasn't changed delete pastebitmap; pimagewd = pastewd; pimageht = pasteht; // create a bitmap with depth 32 so it has an alpha channel pastebitmap = new wxBitmap(pimagewd, pimageht, 32); if (pastebitmap) { // create temporary viewport and draw pattern into pastebitmap // for later use in DrawPasteImage viewport tempview(pimagewd, pimageht); int midx, midy; if (pastemag > 0) { midx = cellbox.x + cellbox.width / 2; midy = cellbox.y + cellbox.height / 2; } else { midx = cellbox.x + (cellbox.width - 1) / 2; midy = cellbox.y + (cellbox.height - 1) / 2; } tempview.setpositionmag(midx, midy, pastemag); // temporarily turn off grid lines bool saveshow = showgridlines; showgridlines = false; wxMemoryDC pattdc; pattdc.SelectObject(*pastebitmap); currdc = &pattdc; currwd = tempview.getwidth(); currht = tempview.getheight(); pastealgo->draw(tempview, renderer); pattdc.SelectObject(wxNullBitmap); showgridlines = saveshow; // make dead pixels 100% transparent and live pixels 100% opaque MaskDeadPixels(pastebitmap, pimagewd, pimageht, 255); } } } // ----------------------------------------------------------------------------- void DrawPasteImage(wxDC& dc) { if (pastebitmap) { // draw paste image wxRect r = viewptr->pasterect; if (r.width > pimagewd || r.height > pimageht) { // paste image is smaller than pasterect (which can't fit in viewport) // so shift image depending on plocation switch (plocation) { case TopLeft: // no need to do any shifting break; case TopRight: // shift image to top right corner of pasterect r.x += r.width - pimagewd; break; case BottomRight: // shift image to bottom right corner of pasterect r.x += r.width - pimagewd; r.y += r.height - pimageht; break; case BottomLeft: // shift image to bottom left corner of pasterect r.y += r.height - pimageht; break; case Middle: // shift image to middle of pasterect; note that CheckPasteImage // has ensured (r.width - pimagewd) and (r.height - pimageht) // are an even number of *cells* if pastemag > 0 r.x += (r.width - pimagewd) / 2; r.y += (r.height - pimageht) / 2; break; } } #ifdef __WXGTK__ // wxGTK Blit doesn't support alpha channel dc.DrawBitmap(*pastebitmap, r.x, r.y, true); #else wxMemoryDC memdc; memdc.SelectObject(*pastebitmap); dc.Blit(r.x, r.y, pimagewd, pimageht, &memdc, 0, 0, wxCOPY, true); memdc.SelectObject(wxNullBitmap); #endif } // now overlay border rectangle dc.SetPen(*pastepen); dc.SetBrush(*wxTRANSPARENT_BRUSH); // if large rect then we need to avoid overflow because DrawRectangle // has problems on Mac if given a size that exceeds 32K wxRect r = viewptr->pasterect; if (r.x < 0) { int diff = -1 - r.x; r.x = -1; r.width -= diff; } if (r.y < 0) { int diff = -1 - r.y; r.y = -1; r.height -= diff; } if (r.width > currlayer->view->getwidth()) r.width = currlayer->view->getwidth() + 2; if (r.height > currlayer->view->getheight()) r.height = currlayer->view->getheight() + 2; dc.DrawRectangle(r); if (r.y > 0) { dc.SetFont(*statusptr->GetStatusFont()); //dc.SetBackgroundMode(wxSOLID); //dc.SetTextBackground(*wxWHITE); dc.SetBackgroundMode(wxTRANSPARENT); // better in case pastergb is white dc.SetTextForeground(*pastergb); wxString pmodestr = wxString(GetPasteMode(),wxConvLocal); int pmodex = r.x + 2; int pmodey = r.y - 4; dc.DrawText(pmodestr, pmodex, pmodey - statusptr->GetTextAscent()); } dc.SetBrush(wxNullBrush); dc.SetPen(wxNullPen); } // ----------------------------------------------------------------------------- void DrawGridLines(wxDC& dc) { int cellsize = 1 << currlayer->view->getmag(); int h, v, i, topbold, leftbold; if (showboldlines) { // ensure that origin cell stays next to bold lines; // ie. bold lines scroll when pattern is scrolled pair lefttop = currlayer->view->at(0, 0); leftbold = lefttop.first.mod_smallint(boldspacing); topbold = lefttop.second.mod_smallint(boldspacing); if (currlayer->originx != bigint::zero) { leftbold -= currlayer->originx.mod_smallint(boldspacing); } if (currlayer->originy != bigint::zero) { topbold -= currlayer->originy.mod_smallint(boldspacing); } if (mathcoords) topbold--; // show origin cell above bold line } else { // avoid gcc warning topbold = leftbold = 0; } // draw all plain lines first dc.SetPen(*currlayer->gridpen); i = showboldlines ? topbold : 1; v = -1; while (true) { v += cellsize; if (v >= currht) break; if (showboldlines) i++; if (i % boldspacing != 0 && v >= 0 && v < currht) dc.DrawLine(0, v, currwd, v); } i = showboldlines ? leftbold : 1; h = -1; while (true) { h += cellsize; if (h >= currwd) break; if (showboldlines) i++; if (i % boldspacing != 0 && h >= 0 && h < currwd) dc.DrawLine(h, 0, h, currht); } if (showboldlines) { // overlay bold lines dc.SetPen(*currlayer->boldpen); i = topbold; v = -1; while (true) { v += cellsize; if (v >= currht) break; i++; if (i % boldspacing == 0 && v >= 0 && v < currht) dc.DrawLine(0, v, currwd, v); } i = leftbold; h = -1; while (true) { h += cellsize; if (h >= currwd) break; i++; if (i % boldspacing == 0 && h >= 0 && h < currwd) dc.DrawLine(h, 0, h, currht); } } dc.SetPen(wxNullPen); } // ----------------------------------------------------------------------------- void DrawGridBorder(wxDC& dc) { // universe is bounded so draw any visible border regions pair ltpxl = currlayer->view->screenPosOf(currlayer->algo->gridleft, currlayer->algo->gridtop, currlayer->algo); pair rbpxl = currlayer->view->screenPosOf(currlayer->algo->gridright, currlayer->algo->gridbottom, currlayer->algo); int left = ltpxl.first; int top = ltpxl.second; int right = rbpxl.first; int bottom = rbpxl.second; if (currlayer->algo->gridwd == 0) { left = 0; right = currwd-1; } if (currlayer->algo->gridht == 0) { top = 0; bottom = currht-1; } // note that right and/or bottom might be INT_MAX so avoid adding to cause overflow if (currlayer->view->getmag() > 0) { // move to bottom right pixel of cell at gridright,gridbottom if (right < currwd) right += (1 << currlayer->view->getmag()) - 1; if (bottom < currht) bottom += (1 << currlayer->view->getmag()) - 1; if (currlayer->view->getmag() == 1) { // there are no gaps at scale 1:2 if (right < currwd) right++; if (bottom < currht) bottom++; } } else { if (right < currwd) right++; if (bottom < currht) bottom++; } if (left < 0 && right >= currwd && top < 0 && bottom >= currht) { // border isn't visible (ie. grid fills viewport) return; } if (left >= currwd || right < 0 || top >= currht || bottom < 0) { // no part of grid is visible so fill viewport with border wxRect r(0, 0, currwd, currht); FillRect(dc, r, *borderbrush); return; } // avoid drawing overlapping rects below int rtop = 0; int rheight = currht; if (currlayer->algo->gridht > 0) { if (top > 0) { // top border is visible wxRect r(0, 0, currwd, top); FillRect(dc, r, *borderbrush); // reduce size of rect below rtop = top; rheight -= top; } if (bottom < currht) { // bottom border is visible wxRect r(0, bottom, currwd, currht - bottom); FillRect(dc, r, *borderbrush); // reduce size of rect below rheight -= currht - bottom; } } if (currlayer->algo->gridwd > 0) { if (left > 0) { // left border is visible wxRect r(0, rtop, left, rheight); FillRect(dc, r, *borderbrush); } if (right < currwd) { // right border is visible wxRect r(right, rtop, currwd - right, rheight); FillRect(dc, r, *borderbrush); } } } // ----------------------------------------------------------------------------- void DrawOneLayer(wxDC& dc) { wxMemoryDC layerdc; layerdc.SelectObject(*layerbitmap); // only show icons at scales 1:8 or 1:16 or 1:32 if (showicons && currlayer->view->getmag() > 2) { if (currlayer->view->getmag() == 3) { iconmaps = currlayer->icons7x7; } else if (currlayer->view->getmag() == 4) { iconmaps = currlayer->icons15x15; } else { iconmaps = currlayer->icons31x31; } } currdc = &layerdc; currlayer->algo->draw(*currlayer->view, renderer); layerdc.SelectObject(wxNullBitmap); // make dead pixels 100% transparent; live pixels use opacity setting MaskDeadPixels(layerbitmap, layerwd, layerht, int(2.55 * opacity)); // draw result dc.DrawBitmap(*layerbitmap, 0, 0, true); } // ----------------------------------------------------------------------------- void DrawStackedLayers(wxDC& dc) { // check if layerbitmap needs to be created or resized if ( layerwd != currlayer->view->getwidth() || layerht != currlayer->view->getheight() ) { layerwd = currlayer->view->getwidth(); layerht = currlayer->view->getheight(); delete layerbitmap; // create a bitmap with depth 32 so it has an alpha channel layerbitmap = new wxBitmap(layerwd, layerht, 32); if (!layerbitmap) { Fatal(_("Not enough memory for layer bitmap!")); return; } } // temporarily turn off grid lines bool saveshow = showgridlines; showgridlines = false; // draw patterns in layers 1..numlayers-1 for ( int i = 1; i < numlayers; i++ ) { Layer* savelayer = currlayer; currlayer = GetLayer(i); // use real current layer's viewport viewport* saveview = currlayer->view; currlayer->view = savelayer->view; // avoid drawing a cloned layer more than once??? draw first or last clone??? if ( !currlayer->algo->isEmpty() ) { DrawOneLayer(dc); } // draw this layer's selection if necessary wxRect r; if ( currlayer->currsel.Visible(&r) ) { CheckSelectionSize(layerwd, layerht); if (i == currindex) DrawSelection(dc, r); else DrawInactiveSelection(dc, r); } // restore viewport and currlayer currlayer->view = saveview; currlayer = savelayer; } showgridlines = saveshow; } // ----------------------------------------------------------------------------- void DrawTileFrame(wxDC& dc, wxRect& trect, wxBrush& brush, int wd) { trect.Inflate(wd); wxRect r = trect; r.height = wd; FillRect(dc, r, brush); // top edge r.y += trect.height - wd; FillRect(dc, r, brush); // bottom edge r = trect; r.width = wd; FillRect(dc, r, brush); // left edge r.x += trect.width - wd; FillRect(dc, r, brush); // right edge } // ----------------------------------------------------------------------------- void DrawTileBorders(wxDC& dc) { if (tileborder <= 0) return; // no borders // draw tile borders in bigview window int wd, ht; bigview->GetClientSize(&wd, &ht); if (wd < 1 || ht < 1) return; // most people will choose either a very light or very dark color for dead cells, // so draw mid gray border around non-current tiles wxBrush brush; brush.SetColour(144, 144, 144); wxRect trect; for ( int i = 0; i < numlayers; i++ ) { if (i != currindex) { trect = GetLayer(i)->tilerect; DrawTileFrame(dc, trect, brush, tileborder); } } // draw green border around current tile trect = GetLayer(currindex)->tilerect; brush.SetColour(0, 255, 0); DrawTileFrame(dc, trect, brush, tileborder); } // ----------------------------------------------------------------------------- void DrawView(wxDC& dc, int tileindex) { wxRect r; Layer* savelayer = NULL; viewport* saveview0 = NULL; int colorindex; // if grid is bounded then ensure viewport's central cell is not outside grid edges if ( currlayer->algo->gridwd > 0) { if ( currlayer->view->x < currlayer->algo->gridleft ) currlayer->view->setpositionmag(currlayer->algo->gridleft, currlayer->view->y, currlayer->view->getmag()); else if ( currlayer->view->x > currlayer->algo->gridright ) currlayer->view->setpositionmag(currlayer->algo->gridright, currlayer->view->y, currlayer->view->getmag()); } if ( currlayer->algo->gridht > 0) { if ( currlayer->view->y < currlayer->algo->gridtop ) currlayer->view->setpositionmag(currlayer->view->x, currlayer->algo->gridtop, currlayer->view->getmag()); else if ( currlayer->view->y > currlayer->algo->gridbottom ) currlayer->view->setpositionmag(currlayer->view->x, currlayer->algo->gridbottom, currlayer->view->getmag()); } if ( viewptr->nopattupdate ) { // don't draw incomplete pattern, just fill background currwd = currlayer->view->getwidth(); currht = currlayer->view->getheight(); r = wxRect(0, 0, currwd, currht); FillRect(dc, r, *currlayer->deadbrush); // might as well draw grid lines and border if ( viewptr->GridVisible() ) DrawGridLines(dc); // uses currwd and currht if ( currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0 ) DrawGridBorder(dc); // uses currwd and currht return; } if ( numlayers > 1 && tilelayers ) { if ( tileindex < 0 ) { DrawTileBorders(dc); return; } // tileindex >= 0 so temporarily change some globals to draw this tile if ( syncviews && tileindex != currindex ) { // make sure this layer uses same location and scale as current layer GetLayer(tileindex)->view->setpositionmag(currlayer->view->x, currlayer->view->y, currlayer->view->getmag()); } savelayer = currlayer; currlayer = GetLayer(tileindex); viewptr = currlayer->tilewin; colorindex = tileindex; } else if ( numlayers > 1 && stacklayers ) { // draw all layers starting with layer 0 but using current layer's viewport savelayer = currlayer; if ( currindex != 0 ) { // change currlayer to layer 0 currlayer = GetLayer(0); saveview0 = currlayer->view; currlayer->view = savelayer->view; } colorindex = 0; } else { // just draw the current layer colorindex = currindex; } // only show icons at scales 1:8 or 1:16 or 1:32 if (showicons && currlayer->view->getmag() > 2) { if (currlayer->view->getmag() == 3) { iconmaps = currlayer->icons7x7; } else if (currlayer->view->getmag() == 4) { iconmaps = currlayer->icons15x15; } else { iconmaps = currlayer->icons31x31; } } // draw pattern using a sequence of pixblit and killrect calls currdc = &dc; currwd = currlayer->view->getwidth(); currht = currlayer->view->getheight(); currlayer->algo->draw(*currlayer->view, renderer); if ( viewptr->GridVisible() ) { DrawGridLines(dc); // uses currwd and currht } // if universe is bounded then draw border regions (if visible) if ( currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0 ) { DrawGridBorder(dc); // uses currwd and currht } if ( currlayer->currsel.Visible(&r) ) { CheckSelectionSize(currwd, currht); if (colorindex == currindex) DrawSelection(dc, r); else DrawInactiveSelection(dc, r); } if ( numlayers > 1 && stacklayers ) { // must restore currlayer before we call DrawStackedLayers currlayer = savelayer; if ( saveview0 ) { // restore layer 0's viewport GetLayer(0)->view = saveview0; } // draw layers 1, 2, ... numlayers-1 DrawStackedLayers(dc); } if ( viewptr->waitingforclick && viewptr->pasterect.width > 0 ) { // this test is not really necessary, but it avoids unnecessary // drawing of the paste image when user changes scale if ( pastemag != currlayer->view->getmag() && prectwd == viewptr->pasterect.width && prectwd > 1 && prectht == viewptr->pasterect.height && prectht > 1 ) { // don't draw old paste image, a new one is coming very soon } else { CheckPasteImage(); DrawPasteImage(dc); } } if (viewptr->showcontrols) DrawControls(dc, viewptr->controlsrect); if ( numlayers > 1 && tilelayers ) { // restore globals changed above currlayer = savelayer; viewptr = currlayer->tilewin; } } golly-2.5-src/gui-wx/wxrule.cpp0000644000175100001440000011021212156145314013462 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/wxhtml.h" // for wxHtmlWindow #include "lifealgo.h" #include "wxgolly.h" // for wxGetApp, mainptr #include "wxmain.h" // for mainptr->... #include "wxprefs.h" // for namedrules, gollydir, showalgohelp, etc #include "wxutils.h" // for Warning, Fatal, Beep #include "wxlayer.h" // for currlayer #include "wxalgos.h" // for NumAlgos, CreateNewUniverse, etc #include "wxrule.h" // ----------------------------------------------------------------------------- bool ValidRule(wxString& rule) { // return true if given rule is valid in at least one algorithm // and convert rule to canonical form for (int i = 0; i < NumAlgos(); i++) { lifealgo* tempalgo = CreateNewUniverse(i); const char* err = tempalgo->setrule( rule.mb_str(wxConvLocal) ); if (!err) { // convert rule to canonical form rule = wxString(tempalgo->getrule(),wxConvLocal); delete tempalgo; return true; } delete tempalgo; } return false; } // ----------------------------------------------------------------------------- wxString GetRuleName(const wxString& rulestring) { // search namedrules array for matching rule wxString rulename; // check for a suffix like ":T100,200" wxString ruleprefix = rulestring; wxString rulesuffix = wxEmptyString; if ( ruleprefix.Find(':') >= 0 ) { ruleprefix = ruleprefix.BeforeFirst(':'); rulesuffix = wxT(":") + rulestring.AfterFirst(':'); } // first look for given rulestring in namedrules; if user has created a name like // "Life on torus" for "B3/S23:T100,200" then this will find that name for (size_t i = 0; i < namedrules.GetCount(); i++) { wxString thisrule = namedrules[i].AfterFirst('|'); // rule is after '|' if ( rulestring.IsSameAs(thisrule,false) ) { rulename = namedrules[i].BeforeFirst('|'); // name is before '|' if ( rulesuffix.Length() > 0 ) { // still append suffix so user sees "Life on torus:T100,200" rulename += rulesuffix; } return rulename; } } if ( rulesuffix.Length() > 0 ) { // look for ruleprefix in namedrules; if there is no explicit name for // "B3/S23:T100,200" then this will find "Life" and user will see "Life:T100,200" for (size_t i = 0; i < namedrules.GetCount(); i++) { wxString thisrule = namedrules[i].AfterFirst('|'); // rule is after '|' if ( ruleprefix.IsSameAs(thisrule,false) ) { rulename = namedrules[i].BeforeFirst('|'); // name is before '|' rulename += rulesuffix; return rulename; } } } // given rulestring has not been named rulename = rulestring; return rulename; } // ----------------------------------------------------------------------------- // globals used in AlgoHelp and RuleDialog classes: static wxTextCtrl* ruletext; // text box for user to type in rule static wxStaticText* statusline; // status line at bottom of dialog // ----------------------------------------------------------------------------- // define a html window for displaying algo help: class AlgoHelp : public wxHtmlWindow { public: AlgoHelp(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style) : wxHtmlWindow(parent, id, pos, size, style) { editlink = false; linkrect = wxRect(0,0,0,0); } virtual void OnLinkClicked(const wxHtmlLinkInfo& link); virtual void OnCellMouseHover(wxHtmlCell* cell, wxCoord x, wxCoord y); void ClearStatus(); void DisplayFile(const wxString& filepath); void SetFontSizes(int size); bool editlink; // open clicked file in editor? private: void OnKeyUp(wxKeyEvent& event); void OnSize(wxSizeEvent& event); void OnMouseMotion(wxMouseEvent& event); void OnMouseLeave(wxMouseEvent& event); void OnMouseDown(wxMouseEvent& event); wxRect linkrect; // rect for cell containing link DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(AlgoHelp, wxHtmlWindow) #ifdef __WXGTK__ // don't call OnKeyUp in wxGTK because for some reason it prevents // copied help text being pasted into the rule box #else EVT_KEY_UP (AlgoHelp::OnKeyUp) #endif #ifdef __WXMAC__ // on the Mac OnKeyUp is also called on a key-down event because the // key-up handler gets a key code of 400 if cmd-C is pressed quickly EVT_KEY_DOWN (AlgoHelp::OnKeyUp) #endif EVT_MOTION (AlgoHelp::OnMouseMotion) EVT_ENTER_WINDOW (AlgoHelp::OnMouseMotion) EVT_LEAVE_WINDOW (AlgoHelp::OnMouseLeave) EVT_LEFT_DOWN (AlgoHelp::OnMouseDown) EVT_RIGHT_DOWN (AlgoHelp::OnMouseDown) EVT_SIZE (AlgoHelp::OnSize) END_EVENT_TABLE() // ----------------------------------------------------------------------------- void AlgoHelp::OnLinkClicked(const wxHtmlLinkInfo& link) { wxString url = link.GetHref(); if ( url.StartsWith(wxT("http:")) || url.StartsWith(wxT("mailto:")) ) { // pass http/mailto URL to user's preferred browser/emailer if ( !wxLaunchDefaultBrowser(url) ) Warning(_("Could not open URL in browser!")); } else if ( url.StartsWith(wxT("rule:")) ) { // copy clicked rule into rule box ruletext->SetValue( url.AfterFirst(':') ); ruletext->SetFocus(); ruletext->SetSelection(-1,-1); } else if ( url.StartsWith(wxT("open:")) ) { // open clicked pattern/script wxString clickedfile = url.AfterFirst(':'); #ifdef __WXMSW__ clickedfile.Replace(wxT("/"), wxT("\\")); #endif wxFileName fname(clickedfile); if (!fname.IsAbsolute()) clickedfile = gollydir + clickedfile; if (editlink) { mainptr->EditFile(clickedfile); } else { mainptr->pendingfiles.Add(clickedfile); // next OnIdle will call OpenFile // send OK event to close dialog wxCommandEvent okevent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_OK); wxWindow* buttwin = GetParent()->FindWindow(wxID_OK); if (buttwin) { okevent.SetEventObject(buttwin); buttwin->GetEventHandler()->ProcessEvent(okevent); } } } else { // assume it's a link to a local target or another help file DisplayFile(url); } } // ----------------------------------------------------------------------------- void AlgoHelp::OnCellMouseHover(wxHtmlCell* cell, wxCoord x, wxCoord y) { if (cell) { wxHtmlLinkInfo* link = cell->GetLink(x,y); if (link) { wxString href = link->GetHref(); href.Replace(wxT("&"), wxT("&&")); statusline->SetLabel(href); wxPoint pt = ScreenToClient( wxGetMousePosition() ); linkrect = wxRect(pt.x-x, pt.y-y, cell->GetWidth(), cell->GetHeight()); } else { ClearStatus(); } } } // ----------------------------------------------------------------------------- void AlgoHelp::OnMouseMotion(wxMouseEvent& event) { if (!linkrect.IsEmpty()) { int x = event.GetX(); int y = event.GetY(); if (!linkrect.Contains(x,y)) ClearStatus(); } event.Skip(); } // ----------------------------------------------------------------------------- void AlgoHelp::OnMouseLeave(wxMouseEvent& event) { ClearStatus(); event.Skip(); } // ----------------------------------------------------------------------------- void AlgoHelp::ClearStatus() { statusline->SetLabel(wxEmptyString); linkrect = wxRect(0,0,0,0); } // ----------------------------------------------------------------------------- #if defined(__WXMAC__) && wxCHECK_VERSION(2,9,0) // wxMOD_CONTROL has been changed to mean Command key down (sheesh!) #define wxMOD_CONTROL wxMOD_RAW_CONTROL #define ControlDown RawControlDown #endif void AlgoHelp::OnMouseDown(wxMouseEvent& event) { // set flag so ctrl/right-clicked file can be opened in editor // (this is consistent with how we handle clicks in pattern/script pane) editlink = event.ControlDown() || event.RightDown(); event.Skip(); } // ----------------------------------------------------------------------------- void AlgoHelp::DisplayFile(const wxString& filepath) { if ( filepath.IsEmpty() ) { wxString newrule = ruletext->GetValue(); wxString contents = wxT("") wxT("

The given rule is not valid in any algorithm."); if (newrule.Contains(wxT(":"))) { // assume user is trying to specify a bounded grid contents += wxT("

The syntax for a bounded grid is described "); contents += wxT("here."); } contents += wxT(""); SetPage(contents); } else if ( filepath.StartsWith(gollydir) && !wxFileName::FileExists(filepath) ) { wxString contents = wxT("") wxT("

There is no help available for this algorithm.") wxT(""); SetPage(contents); } else { LoadPage(filepath); } } // ----------------------------------------------------------------------------- // we have to use a key-up handler otherwise wxHtmlWindow's key-up handler // gets called which detects cmd/ctrl-C and clobbers our clipboard fix void AlgoHelp::OnKeyUp(wxKeyEvent& event) { int key = event.GetKeyCode(); if (event.CmdDown()) { // let cmd-A select all text if (key == 'A') { SelectAll(); event.Skip(false); return; } #ifdef __WXMAC__ // let cmd-W close dialog if (key == 'W') { GetParent()->Close(true); event.Skip(false); return; } #endif } if ( event.CmdDown() || event.AltDown() ) { if ( key == 'C' ) { // copy any selected text to the clipboard wxString text = SelectionToText(); if ( text.Length() > 0 ) { // remove any leading/trailing white space while (text.GetChar(0) <= wxChar(' ')) { text = text.Mid(1); } while (text.GetChar(text.Length()-1) <= wxChar(' ')) { text.Truncate(text.Length()-1); } mainptr->CopyTextToClipboard(text); // don't call wxHtmlWindow's default key-up handler event.Skip(false); return; } } } event.Skip(); } // ----------------------------------------------------------------------------- void AlgoHelp::OnSize(wxSizeEvent& event) { // avoid scroll position being reset to top when wxHtmlWindow is resized int x, y; GetViewStart(&x, &y); // save current position wxHtmlWindow::OnSize(event); wxString currpage = GetOpenedPage(); if ( !currpage.IsEmpty() ) { DisplayFile(currpage); // reload page Scroll(x, y); // scroll to old position } // prevent wxHtmlWindow::OnSize being called again event.Skip(false); } // ----------------------------------------------------------------------------- void AlgoHelp::SetFontSizes(int size) { // set font sizes for to int f_sizes[7]; f_sizes[0] = int(size * 0.6); f_sizes[1] = int(size * 0.8); f_sizes[2] = size; f_sizes[3] = int(size * 1.2); f_sizes[4] = int(size * 1.4); f_sizes[5] = int(size * 1.6); f_sizes[6] = int(size * 1.8); #ifdef __WXOSX_COCOA__ SetFonts(wxT("Lucida Grande"), wxT("Monaco"), f_sizes); #else SetFonts(wxEmptyString, wxEmptyString, f_sizes); #endif } // ----------------------------------------------------------------------------- const wxString UNKNOWN = _("UNKNOWN"); // unknown algorithm const wxString UNNAMED = _("UNNAMED"); // unnamed rule const int HGAP = 12; const int BIGVGAP = 12; #if defined(__WXMAC__) && wxCHECK_VERSION(2,8,0) && !wxCHECK_VERSION(2,9,0) // fix wxALIGN_CENTER_VERTICAL bug in wxMac 2.8.x; // only happens when a wxStaticText/wxButton box is next to a wxChoice box #define FIX_ALIGN_BUG wxBOTTOM,4 #else #define FIX_ALIGN_BUG wxALL,0 #endif // ----------------------------------------------------------------------------- // define a modal dialog for changing the current rule class RuleDialog : public wxDialog { public: RuleDialog(wxWindow* parent); ~RuleDialog() { delete ruletext; delete statusline; } virtual bool TransferDataFromWindow(); // called when user hits OK private: enum { // control ids RULE_ALGO = wxID_HIGHEST + 1, RULE_NAME, RULE_TEXT, RULE_ADD_BUTT, RULE_ADD_TEXT, RULE_DEL_BUTT }; void CreateControls(); // initialize all the controls void UpdateAlgo(); // update algochoice depending on rule void UpdateName(); // update namechoice depending on rule void UpdateHelp(); // update algo help AlgoHelp* htmlwin; // html window for displaying algo help wxTextCtrl* addtext; // text box for user to type in name of rule wxChoice* algochoice; // lists the known algorithms but can have one // more item appended (UNKNOWN) wxChoice* namechoice; // kept in sync with namedrules but can have one // more item appended (UNNAMED) int algoindex; // current algochoice selection int startalgo; // look for a valid rule starting with this algo int nameindex; // current namechoice selection bool ignore_text_change; // prevent OnRuleTextChanged doing anything? bool expanded; // help button has expanded dialog? wxRect minrect; // window rect for unexpanded dialog // event handlers void OnRuleTextChanged(wxCommandEvent& event); void OnChooseAlgo(wxCommandEvent& event); void OnChooseName(wxCommandEvent& event); void OnHelpButton(wxCommandEvent& event); void OnAddName(wxCommandEvent& event); void OnDeleteName(wxCommandEvent& event); void OnUpdateAdd(wxUpdateUIEvent& event); void OnUpdateDelete(wxUpdateUIEvent& event); void OnSize(wxSizeEvent& event); void OnMove(wxMoveEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(RuleDialog, wxDialog) EVT_CHOICE (RULE_ALGO, RuleDialog::OnChooseAlgo) EVT_CHOICE (RULE_NAME, RuleDialog::OnChooseName) EVT_TEXT (RULE_TEXT, RuleDialog::OnRuleTextChanged) EVT_BUTTON (wxID_HELP, RuleDialog::OnHelpButton) EVT_BUTTON (RULE_ADD_BUTT, RuleDialog::OnAddName) EVT_BUTTON (RULE_DEL_BUTT, RuleDialog::OnDeleteName) EVT_UPDATE_UI (RULE_ADD_BUTT, RuleDialog::OnUpdateAdd) EVT_UPDATE_UI (RULE_DEL_BUTT, RuleDialog::OnUpdateDelete) EVT_SIZE ( RuleDialog::OnSize) EVT_MOVE ( RuleDialog::OnMove) END_EVENT_TABLE() // ----------------------------------------------------------------------------- RuleDialog::RuleDialog(wxWindow* parent) { Create(parent, wxID_ANY, _("Set Rule"), wxPoint(rulex,ruley), wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER); expanded = false; // tested in RuleDialog::OnSize htmlwin = new AlgoHelp(this, wxID_ANY, // specify small size to avoid clipping scroll bar on resize wxDefaultPosition, wxSize(30,30), wxHW_DEFAULT_STYLE | wxSUNKEN_BORDER); if (!htmlwin) Fatal(_("Could not create algo help window!")); htmlwin->SetBorders(4); htmlwin->SetFontSizes(helpfontsize); htmlwin->Show(false); ignore_text_change = true; CreateControls(); ignore_text_change = false; // dialog location is set to rulex,ruley // Centre(); minrect = GetRect(); // don't allow resizing when dialog isn't expanded SetMaxSize( wxSize(minrect.width,minrect.height) ); // select all of rule text ruletext->SetFocus(); ruletext->SetSelection(-1,-1); if (showalgohelp) { // send help button event to expand dialog wxCommandEvent buttevent(wxEVT_COMMAND_BUTTON_CLICKED, wxID_HELP); wxWindow* buttwin = FindWindow(wxID_HELP); if (buttwin) { buttevent.SetEventObject(buttwin); buttwin->GetEventHandler()->ProcessEvent(buttevent); } } } // ----------------------------------------------------------------------------- void RuleDialog::CreateControls() { wxStaticText* textlabel = new wxStaticText(this, wxID_STATIC, _("Enter a new rule:")); wxStaticText* namelabel = new wxStaticText(this, wxID_STATIC, _("Or select a named rule:")); wxButton* helpbutt = new wxButton(this, wxID_HELP, wxEmptyString); wxButton* delbutt = new wxButton(this, RULE_DEL_BUTT, _("Delete")); wxButton* addbutt = new wxButton(this, RULE_ADD_BUTT, _("Add")); // create a choice menu to select algo wxArrayString algoarray; for (int i = 0; i < NumAlgos(); i++) { algoarray.Add( wxString(GetAlgoName(i),wxConvLocal) ); } algochoice = new wxChoice(this, RULE_ALGO, wxDefaultPosition, wxDefaultSize, algoarray); algoindex = currlayer->algtype; startalgo = currlayer->algtype; algochoice->SetSelection(algoindex); wxBoxSizer* hbox0 = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer* algolabel = new wxBoxSizer(wxHORIZONTAL); algolabel->Add(new wxStaticText(this, wxID_STATIC, _("Algorithm:")), 0, FIX_ALIGN_BUG); hbox0->Add(algolabel, 0, wxALIGN_CENTER_VERTICAL, 0); hbox0->Add(algochoice, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 6); hbox0->AddSpacer(HGAP); wxBoxSizer* helpbox = new wxBoxSizer(wxHORIZONTAL); helpbox->Add(helpbutt, 0, FIX_ALIGN_BUG); hbox0->Add(helpbox, 0, wxALIGN_CENTER_VERTICAL, 0); int minwidth = 250; int algowd = hbox0->GetMinSize().GetWidth(); if (algowd > minwidth) minwidth = algowd; // create status line for showing link info statusline = new wxStaticText(this, wxID_STATIC, wxEmptyString); #ifdef __WXMAC__ statusline->SetWindowVariant(wxWINDOW_VARIANT_SMALL); #endif // create text box for entering new rule ruletext = new wxTextCtrl(this, RULE_TEXT, wxString(currlayer->algo->getrule(),wxConvLocal), wxDefaultPosition, wxSize(minwidth,wxDefaultCoord)); // create a choice menu to select named rule wxArrayString namearray; for (size_t i=0; iAdd(namechoice, 0, wxALIGN_CENTER_VERTICAL, 0); hbox1->AddSpacer(HGAP); wxBoxSizer* delbox = new wxBoxSizer(wxHORIZONTAL); delbox->Add(delbutt, 0, FIX_ALIGN_BUG); hbox1->Add(delbox, 0, wxALIGN_CENTER_VERTICAL, 0); wxBoxSizer* hbox2 = new wxBoxSizer(wxHORIZONTAL); hbox2->Add(addtext, 0, wxALIGN_CENTER_VERTICAL, 0); hbox2->AddSpacer(HGAP); hbox2->Add(addbutt, 0, wxALIGN_CENTER_VERTICAL, 0); wxSizer* stdbutts = CreateButtonSizer(wxOK | wxCANCEL); wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL); // can we avoid these fudges??? #ifdef __WXMAC__ minwidth += 24; #elif defined(__WXMSW__) minwidth += 16; #else minwidth += 12; #endif vbox->Add(minwidth, 0, 0); vbox->Add(stdbutts, 1, wxALIGN_RIGHT, 0); wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); topSizer->AddSpacer(BIGVGAP); topSizer->Add(hbox0, 0, wxLEFT | wxRIGHT, HGAP); topSizer->AddSpacer(BIGVGAP); topSizer->Add(textlabel, 0, wxLEFT | wxRIGHT, HGAP); topSizer->AddSpacer(10); topSizer->Add(ruletext, 0, wxLEFT | wxRIGHT, HGAP); topSizer->AddSpacer(BIGVGAP); topSizer->Add(namelabel, 0, wxLEFT | wxRIGHT, HGAP); topSizer->AddSpacer(6); topSizer->Add(hbox1, 0, wxLEFT | wxRIGHT, HGAP); topSizer->AddSpacer(BIGVGAP); topSizer->Add(hbox2, 0, wxLEFT | wxRIGHT, HGAP); topSizer->AddSpacer(BIGVGAP); topSizer->Add(vbox, 0, wxTOP | wxBOTTOM, 10); SetSizer(topSizer); topSizer->SetSizeHints(this); // calls Fit } // ----------------------------------------------------------------------------- void RuleDialog::UpdateAlgo() { // may need to change selected algo depending on current rule text lifealgo* tempalgo; const char* err; wxString newrule = ruletext->GetValue(); if (newrule.IsEmpty()) newrule = wxT("B3/S23"); // first try new rule in starting algo (NOT necessarily the currently selected algo); // this ensures that typing in a rule achieves the same result as pasting a rule tempalgo = CreateNewUniverse(startalgo); err = tempalgo->setrule( newrule.mb_str(wxConvLocal) ); delete tempalgo; if (!err) { if (startalgo != algoindex) { if (algoindex >= NumAlgos()) { // remove UNKNOWN item from end of algochoice algochoice->Delete( algochoice->GetCount() - 1 ); } algoindex = startalgo; algochoice->SetSelection(algoindex); UpdateHelp(); } return; } // now try new rule in all the other algos int newindex; for (newindex = 0; newindex < NumAlgos(); newindex++) { if (newindex != startalgo) { tempalgo = CreateNewUniverse(newindex); err = tempalgo->setrule( newrule.mb_str(wxConvLocal) ); delete tempalgo; if (!err) { if (newindex != algoindex) { if (algoindex >= NumAlgos()) { // remove UNKNOWN item from end of algochoice algochoice->Delete( algochoice->GetCount() - 1 ); } algoindex = newindex; algochoice->SetSelection(algoindex); UpdateHelp(); } return; } } } // get here if new rule is not valid in any algo if (algoindex < NumAlgos()) { // append UNKNOWN item and select it algochoice->Append(UNKNOWN); algoindex = NumAlgos(); algochoice->SetSelection(algoindex); UpdateHelp(); } } // ----------------------------------------------------------------------------- void RuleDialog::UpdateHelp() { if (expanded) { if (algoindex < NumAlgos()) { // display Help/Algorithms/algoname.html wxString filepath = gollydir + wxT("Help"); filepath += wxFILE_SEP_PATH; filepath += wxT("Algorithms"); filepath += wxFILE_SEP_PATH; filepath += wxString(GetAlgoName(algoindex),wxConvLocal); filepath += wxT(".html"); htmlwin->DisplayFile(filepath); } else { // UNKNOWN algo htmlwin->DisplayFile(wxEmptyString); } } } // ----------------------------------------------------------------------------- void RuleDialog::UpdateName() { // may need to change named rule depending on current rule text int newindex; wxString newrule = ruletext->GetValue(); if ( newrule.IsEmpty() ) { // empty string is a quick way to restore normal Life newindex = 0; } else { // search namedrules array for matching rule newindex = -1; for (size_t i=0; i= 0) { // matching rule found so remove UNNAMED item if it exists // use (int) twice to avoid warnings on wx 2.6.x/2.7 if ( (int) namechoice->GetCount() > (int) namedrules.GetCount() ) { namechoice->Delete( namechoice->GetCount() - 1 ); } } else { // no match found so use index of UNNAMED item, // appending it if it doesn't exist; // use (int) twice to avoid warnings on wx 2.6.x/2.7 if ( (int) namechoice->GetCount() == (int) namedrules.GetCount() ) { namechoice->Append(UNNAMED); } newindex = namechoice->GetCount() - 1; } if (nameindex != newindex) { nameindex = newindex; namechoice->SetSelection(nameindex); } } // ----------------------------------------------------------------------------- void RuleDialog::OnRuleTextChanged(wxCommandEvent& WXUNUSED(event)) { if (ignore_text_change) return; UpdateName(); UpdateAlgo(); // check for spaces wxString newrule = ruletext->GetValue(); if (newrule.Contains(wxT(" "))) { Warning(_("Spaces are not allowed in rule strings.")); newrule.Replace(wxT(" "), wxEmptyString); ruletext->SetValue(newrule); ruletext->SetFocus(); } } // ----------------------------------------------------------------------------- void RuleDialog::OnChooseAlgo(wxCommandEvent& event) { int i = event.GetSelection(); if (i >= 0 && i < NumAlgos() && i != algoindex) { int oldindex = algoindex; algoindex = i; startalgo = i; // user has explicitly changed the preferred algo // check if the current rule is valid in newly selected algo wxString thisrule = ruletext->GetValue(); if (thisrule.IsEmpty()) thisrule = wxT("B3/S23"); lifealgo* tempalgo = CreateNewUniverse(algoindex); const char* err = tempalgo->setrule( thisrule.mb_str(wxConvLocal) ); if (err) { // rule is not valid so change rule text to selected algo's default rule wxString defrule = wxString(tempalgo->DefaultRule(), wxConvLocal); if (oldindex < NumAlgos() && thisrule.Find(':') >= 0) { // preserve valid topology so we can do things like switch from // "LifeHistory:T30,20" in RuleLoader to "B3/S23:T30,20" in QuickLife if (defrule.Find(':') >= 0) { // default rule shouldn't have a suffix but play safe and remove it defrule = defrule.BeforeFirst(':'); } defrule += wxT(":"); defrule += thisrule.AfterFirst(':'); } ignore_text_change = true; ruletext->SetValue(defrule); ruletext->SetFocus(); ruletext->SetSelection(-1,-1); ignore_text_change = false; if (oldindex >= NumAlgos()) { // remove UNKNOWN item from end of algochoice algochoice->Delete( algochoice->GetCount() - 1 ); } UpdateName(); } else { // rule is valid if (oldindex >= NumAlgos()) { Warning(_("Bug detected in OnChooseAlgo!")); } } delete tempalgo; UpdateHelp(); } } // ----------------------------------------------------------------------------- void RuleDialog::OnChooseName(wxCommandEvent& event) { int i = event.GetSelection(); if (i == nameindex) return; // update rule text based on chosen name nameindex = i; if ( nameindex == (int) namedrules.GetCount() ) { Warning(_("Bug detected in OnChooseName!")); UpdateAlgo(); return; } // remove UNNAMED item if it exists; // use (int) twice to avoid warnings in wx 2.6.x/2.7 if ( (int) namechoice->GetCount() > (int) namedrules.GetCount() ) { namechoice->Delete( namechoice->GetCount() - 1 ); } wxString rule = namedrules[nameindex].AfterFirst('|'); ignore_text_change = true; ruletext->SetValue(rule); ruletext->SetFocus(); ruletext->SetSelection(-1,-1); ignore_text_change = false; UpdateAlgo(); } // ----------------------------------------------------------------------------- void RuleDialog::OnAddName(wxCommandEvent& WXUNUSED(event)) { if ( nameindex < (int) namedrules.GetCount() ) { // OnUpdateAdd should prevent this but play safe Beep(); return; } // validate new rule and convert to canonical form wxString newrule = ruletext->GetValue(); if (!ValidRule(newrule)) { Warning(_("The new rule is not valid in any algorithm.")); ruletext->SetFocus(); ruletext->SetSelection(-1,-1); return; } // validate new name wxString newname = addtext->GetValue(); if ( newname.IsEmpty() ) { Warning(_("Type in a name for the new rule.")); addtext->SetFocus(); return; } else if ( newname.Find('|') >= 0 ) { Warning(_("Sorry, but rule names must not contain \"|\".")); addtext->SetFocus(); addtext->SetSelection(-1,-1); return; } else if ( newname == UNNAMED ) { Warning(_("You can't use that name smarty pants.")); addtext->SetFocus(); addtext->SetSelection(-1,-1); return; } else if ( namechoice->FindString(newname) != wxNOT_FOUND ) { Warning(_("That name is already used for another rule.")); addtext->SetFocus(); addtext->SetSelection(-1,-1); return; } // replace UNNAMED with new name namechoice->Delete( namechoice->GetCount() - 1 ); namechoice->Append( newname ); // append new name and rule to namedrules newname += '|'; newname += newrule; namedrules.Add(newname); // force a change to newly appended item nameindex = -1; UpdateName(); } // ----------------------------------------------------------------------------- void RuleDialog::OnDeleteName(wxCommandEvent& WXUNUSED(event)) { if ( nameindex <= 0 || nameindex >= (int) namedrules.GetCount() ) { // OnUpdateDelete should prevent this but play safe Beep(); return; } // remove current name namechoice->Delete(nameindex); namedrules.RemoveAt((size_t) nameindex); // force a change to UNNAMED item nameindex = -1; UpdateName(); } // ----------------------------------------------------------------------------- void RuleDialog::OnUpdateAdd(wxUpdateUIEvent& event) { // Add button is only enabled if UNNAMED item is selected event.Enable( nameindex == (int) namedrules.GetCount() ); } // ----------------------------------------------------------------------------- void RuleDialog::OnUpdateDelete(wxUpdateUIEvent& event) { // Delete button is only enabled if a non-Life named rule is selected event.Enable( nameindex > 0 && nameindex < (int) namedrules.GetCount() ); } // ----------------------------------------------------------------------------- void RuleDialog::OnHelpButton(wxCommandEvent& WXUNUSED(event)) { wxRect r = GetRect(); expanded = !expanded; showalgohelp = expanded; if (expanded) { int wd, ht; GetClientSize(&wd, &ht); wxRect htmlrect(minrect.width, 10, ruleexwd - 10, ht + ruleexht - 30); htmlwin->SetSize(htmlrect); r.width = minrect.width + ruleexwd; r.height = minrect.height + ruleexht; // call SetMinSize below (AFTER SetSize call) SetMaxSize( wxSize(-1,-1) ); } else { wxWindow* focus = FindFocus(); if (focus != ruletext && focus != addtext) { ruletext->SetFocus(); } r.width = minrect.width; r.height = minrect.height; SetMinSize( wxSize(minrect.width,minrect.height) ); SetMaxSize( wxSize(minrect.width,minrect.height) ); } UpdateHelp(); htmlwin->Show(expanded); SetSize(r); if (expanded) { SetMinSize( wxSize(minrect.width+100,minrect.height) ); } } // ----------------------------------------------------------------------------- void RuleDialog::OnSize(wxSizeEvent& event) { if (expanded) { // resize html window int wd, ht; GetClientSize(&wd, &ht); wxRect r = GetRect(); ruleexwd = r.width - minrect.width; ruleexht = r.height - minrect.height; wxRect htmlrect(minrect.width, 10, wd - minrect.width - 10, ht - 30); htmlwin->SetSize(htmlrect); // position status line under bottom left corner statusline->Move(htmlrect.GetLeft(), htmlrect.GetBottom() + 4); } event.Skip(); } // ----------------------------------------------------------------------------- void RuleDialog::OnMove(wxMoveEvent& event) { // save current location for later use in SavePrefs /* sigh... wxMac doesn't return correct position wxPoint pt = event.GetPosition(); rulex = pt.x; ruley = pt.y; */ wxRect r = GetRect(); rulex = r.x; ruley = r.y; event.Skip(); } // ----------------------------------------------------------------------------- bool RuleDialog::TransferDataFromWindow() { // get and validate new rule wxString newrule = ruletext->GetValue(); if (newrule.IsEmpty()) newrule = wxT("B3/S23"); if (algoindex >= NumAlgos()) { Warning(_("The new rule is not valid in any algorithm.")); ruletext->SetFocus(); ruletext->SetSelection(-1,-1); return false; } if (algoindex == currlayer->algtype) { // check if new rule is still valid in current algorithm const char* err = currlayer->algo->setrule( newrule.mb_str(wxConvLocal) ); if (err) { // this can happen if the rule's table/tree file was deleted, // or was edited and some sort of error introduced Warning(_("This rule is no longer valid!")); ruletext->SetFocus(); ruletext->SetSelection(-1,-1); return false; } else { return true; } } else { // change the current algorithm and switch to the new rule // (if the new rule is invalid then the algo's default rule will be used) mainptr->ChangeAlgorithm(algoindex, newrule); return true; } } // ----------------------------------------------------------------------------- bool ChangeRule() { wxArrayString oldnames = namedrules; wxString oldrule = wxString(currlayer->algo->getrule(),wxConvLocal); RuleDialog dialog( wxGetApp().GetTopWindow() ); if ( dialog.ShowModal() == wxID_OK ) { // TransferDataFromWindow has changed the current rule, // and possibly the current algorithm as well return true; } else { // user hit Cancel so restore name array and rule namedrules.Clear(); namedrules = oldnames; return !RestoreRule(oldrule); // note that we return true if RestoreRule failed and had to // switch to the current algorithm's default rule } } golly-2.5-src/gui-wx/wxscript.cpp0000644000175100001440000016576012156145314014041 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include // for INT_MAX #include "wx/filename.h" // for wxFileName #include "wxgolly.h" // for wxGetApp, mainptr, viewptr, statusptr #include "wxmain.h" // for mainptr->... #include "wxselect.h" // for Selection #include "wxedit.h" // for ToggleEditBar, ToggleAllStates, UpdateEditBar #include "wxview.h" // for viewptr->... #include "wxrender.h" // for SetSelectionColor #include "wxstatus.h" // for statusptr->... #include "wxutils.h" // for Warning, Beep, IsScriptFile #include "wxprefs.h" // for gollydir, allowundo, etc #include "wxundo.h" // for undoredo->... #include "wxalgos.h" // for *_ALGO, algoinfo #include "wxlayer.h" // for currlayer, SyncClones #include "wxtimeline.h" // for TimelineExists #include "wxperl.h" // for RunPerlScript, AbortPerlScript #include "wxpython.h" // for RunPythonScript, AbortPythonScript #include "wxscript.h" // ============================================================================= // exported globals: bool inscript = false; // a script is running? bool passkeys; // pass keyboard events to script? bool passclicks; // pass mouse events to script? bool canswitch; // can user switch layers while script is running? bool stop_after_script; // stop generating pattern after running script? bool autoupdate; // update display after each change to current universe? bool allowcheck; // allow event checking? wxString scripterr; // Perl/Python error message wxString mousepos; // current mouse position // local globals: static bool plscript = false; // a Perl script is running? static bool pyscript = false; // a Python script is running? static bool showtitle; // need to update window title? static bool updateedit; // need to update edit bar? static bool exitcalled; // GSF_exit was called? static wxString scriptchars; // non-escape chars saved by PassKeyToScript static wxString scriptloc; // location of script file static wxArrayString eventqueue; // FIFO queue for keyboard/mouse events // ----------------------------------------------------------------------------- void DoAutoUpdate() { if (autoupdate) { inscript = false; mainptr->UpdatePatternAndStatus(); if (showtitle) { mainptr->SetWindowTitle(wxEmptyString); showtitle = false; } inscript = true; } } // ----------------------------------------------------------------------------- void ShowTitleLater() { // called from SetWindowTitle when inscript is true; // show title at next update (or at end of script) showtitle = true; } // ----------------------------------------------------------------------------- void ChangeWindowTitle(const wxString& name) { if (autoupdate) { // update title bar right now inscript = false; mainptr->SetWindowTitle(name); inscript = true; showtitle = false; // update has been done } else { // show it later but must still update currlayer->currname and menu item mainptr->SetWindowTitle(name); // showtitle is now true } } // ============================================================================= // The following Golly Script Functions are used to reduce code duplication. // They are called by corresponding pl_* and py_* functions in wxperl.cpp // and wxpython.cpp respectively. const char* GSF_open(char* filename, int remember) { // convert non-absolute filename to absolute path relative to scriptloc wxString fname = wxString(filename,wxConvLocal); wxFileName fullname(fname); if (!fullname.IsAbsolute()) fullname = scriptloc + fname; // return error message here if file doesn't exist wxString fullpath = fullname.GetFullPath(); if (!wxFileName::FileExists(fullpath)) { return "Given file does not exist."; } // only add file to Open Recent submenu if remember flag is non-zero mainptr->OpenFile(fullpath, remember != 0); DoAutoUpdate(); return NULL; } // ----------------------------------------------------------------------------- const char* GSF_save(char* filename, char* format, int remember) { // convert non-absolute filename to absolute path relative to scriptloc wxString fname = wxString(filename,wxConvLocal); wxFileName fullname(fname); if (!fullname.IsAbsolute()) fullname = scriptloc + fname; // only add file to Open Recent submenu if remember flag is non-zero return mainptr->SaveFile(fullname.GetFullPath(), wxString(format,wxConvLocal), remember != 0); } // ----------------------------------------------------------------------------- const char* GSF_setdir(char* dirname, char* newdir) { wxString dirpath = wxString(newdir,wxConvLocal); if (dirpath.Last() != wxFILE_SEP_PATH) dirpath += wxFILE_SEP_PATH; if (!wxFileName::DirExists(dirpath)) { return "New directory does not exist."; } if (strcmp(dirname, "app") == 0) { return "Application directory cannot be changed."; } else if (strcmp(dirname, "data") == 0) { return "Data directory cannot be changed."; } else if (strcmp(dirname, "temp") == 0) { return "Temporary directory cannot be changed."; } else if (strcmp(dirname, "rules") == 0) { userrules = dirpath; } else if (strcmp(dirname, "patterns") == 0) { // change patterndir and update panel if currently shown mainptr->SetPatternDir(dirpath); } else if (strcmp(dirname, "scripts") == 0) { // change scriptdir and update panel if currently shown mainptr->SetScriptDir(dirpath); } else if (strcmp(dirname, "download") == 0) { downloaddir = dirpath; } else { return "Unknown directory name."; } return NULL; // success } // ----------------------------------------------------------------------------- const char* GSF_getdir(char* dirname) { wxString dirpath; if (strcmp(dirname, "app") == 0) dirpath = gollydir; else if (strcmp(dirname, "data") == 0) dirpath = datadir; else if (strcmp(dirname, "temp") == 0) dirpath = tempdir; else if (strcmp(dirname, "rules") == 0) dirpath = userrules; else if (strcmp(dirname, "patterns") == 0) dirpath = patterndir; else if (strcmp(dirname, "scripts") == 0) dirpath = scriptdir; else if (strcmp(dirname, "download") == 0) dirpath = downloaddir; else { return NULL; // unknown directory name } // make sure directory path ends with separator if (dirpath.Last() != wxFILE_SEP_PATH) dirpath += wxFILE_SEP_PATH; // need to be careful converting Unicode wxString to char* static wxCharBuffer dirbuff; dirbuff = dirpath.mb_str(wxConvLocal); return (const char*) dirbuff; } // ----------------------------------------------------------------------------- const char* GSF_setalgo(char* algostring) { // find index for given algo name char* algoname = ReplaceDeprecatedAlgo(algostring); algo_type algoindex = -1; for (int i = 0; i < NumAlgos(); i++) { if (strcmp(algoname, GetAlgoName(i)) == 0) { algoindex = i; break; } } if (algoindex < 0) return "Unknown algorithm."; if (algoindex != currlayer->algtype) { mainptr->ChangeAlgorithm(algoindex); if (algoindex != currlayer->algtype) { return "Algorithm could not be changed (pattern is too big to convert)."; } else { // rule might have changed ChangeWindowTitle(wxEmptyString); // pattern might have changed or colors might have changed DoAutoUpdate(); } } return NULL; } // ----------------------------------------------------------------------------- const char* GSF_setrule(char* rulestring) { wxString oldrule = wxString(currlayer->algo->getrule(),wxConvLocal); int oldmaxstate = currlayer->algo->NumCellStates() - 1; // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange viewptr->SaveCurrentSelection(); // inscript should be true but play safe if (allowundo && !currlayer->stayclean && inscript) { // note that we must save pending gen changes BEFORE changing rule // otherwise temporary files will store incorrect rule info SavePendingChanges(); } const char* err; if (rulestring == NULL || rulestring[0] == 0) { // set normal Life err = currlayer->algo->setrule("B3/S23"); } else { err = currlayer->algo->setrule(rulestring); } if (err) { // try to find another algorithm that supports the new rule for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { lifealgo* tempalgo = CreateNewUniverse(i); err = tempalgo->setrule(rulestring); delete tempalgo; if (!err) { // change the current algorithm and switch to the new rule mainptr->ChangeAlgorithm(i, wxString(rulestring,wxConvLocal)); if (i != currlayer->algtype) { RestoreRule(oldrule); return "Algorithm could not be changed (pattern is too big to convert)."; } else { ChangeWindowTitle(wxEmptyString); DoAutoUpdate(); return NULL; } } } } RestoreRule(oldrule); return "Given rule is not valid in any algorithm."; } // check if the rule string changed, or the number of states changed // (the latter might happen if user edited a table/tree file) wxString newrule = wxString(currlayer->algo->getrule(),wxConvLocal); int newmaxstate = currlayer->algo->NumCellStates() - 1; if (oldrule != newrule || oldmaxstate != newmaxstate) { // show new rule in main window's title but don't change name ChangeWindowTitle(wxEmptyString); // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { mainptr->ClearOutsideGrid(); } // rule change might have changed the number of cell states; // if there are fewer states then pattern might change if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { mainptr->ReduceCellStates(newmaxstate); } if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberRuleChange(oldrule); } } // switch to default colors and icons for new rule (we need to do this even if // oldrule == newrule in case there's a new/changed .colors or .icons file) UpdateLayerColors(); // pattern or colors or icons might have changed DoAutoUpdate(); return NULL; } // ----------------------------------------------------------------------------- const char* GSF_setgen(char* genstring) { const char* err = mainptr->ChangeGenCount(genstring); if (!err) DoAutoUpdate(); return err; } // ----------------------------------------------------------------------------- const char* GSF_setpos(char* x, char* y) { // disallow alphabetic chars in x,y int i; int xlen = (int)strlen(x); for (i = 0; i < xlen; i++) if ( (x[i] >= 'a' && x[i] <= 'z') || (x[i] >= 'A' && x[i] <= 'Z') ) return "Illegal character in x value."; int ylen = (int)strlen(y); for (i = 0; i < ylen; i++) if ( (y[i] >= 'a' && y[i] <= 'z') || (y[i] >= 'A' && y[i] <= 'Z') ) return "Illegal character in y value."; bigint bigx(x); bigint bigy(y); // check if x,y is outside bounded grid if ( (currlayer->algo->gridwd > 0 && (bigx < currlayer->algo->gridleft || bigx > currlayer->algo->gridright)) || (currlayer->algo->gridht > 0 && (bigy < currlayer->algo->gridtop || bigy > currlayer->algo->gridbottom)) ) { return "Given position is outside grid boundary."; } viewptr->SetPosMag(bigx, bigy, viewptr->GetMag()); DoAutoUpdate(); return NULL; } // ----------------------------------------------------------------------------- void GSF_setname(char* name, int index) { if (name == NULL || name[0] == 0) return; // inscript should be true but play safe if (allowundo && !currlayer->stayclean && inscript) SavePendingChanges(); if (index == currindex) { // save old name for RememberNameChange wxString oldname = currlayer->currname; // show new name in main window's title; // also sets currlayer->currname and updates menu item ChangeWindowTitle(wxString(name,wxConvLocal)); if (allowundo && !currlayer->stayclean) { // note that currfile and savestart/dirty flags don't change currlayer->undoredo->RememberNameChange(oldname, currlayer->currfile, currlayer->savestart, currlayer->dirty); } } else { // temporarily change currlayer (used in RememberNameChange) Layer* savelayer = currlayer; currlayer = GetLayer(index); wxString oldname = currlayer->currname; currlayer->currname = wxString(name,wxConvLocal); if (allowundo && !currlayer->stayclean) { // note that currfile and savestart/dirty flags don't change currlayer->undoredo->RememberNameChange(oldname, currlayer->currfile, currlayer->savestart, currlayer->dirty); } // restore currlayer currlayer = savelayer; // show name in given layer's menu item mainptr->UpdateLayerItem(index); } } // ----------------------------------------------------------------------------- const char* GSF_setcell(int x, int y, int newstate) { // check if x,y is outside bounded grid if ( (currlayer->algo->gridwd > 0 && (x < currlayer->algo->gridleft.toint() || x > currlayer->algo->gridright.toint())) || (currlayer->algo->gridht > 0 && (y < currlayer->algo->gridtop.toint() || y > currlayer->algo->gridbottom.toint())) ) { return "Given cell is outside grid boundary."; } int oldstate = currlayer->algo->getcell(x, y); if (newstate != oldstate) { if (currlayer->algo->setcell(x, y, newstate) < 0) { return "State value is out of range."; } currlayer->algo->endofpattern(); if (allowundo && !currlayer->stayclean) { ChangeCell(x, y, oldstate, newstate); } MarkLayerDirty(); DoAutoUpdate(); } return NULL; } // ----------------------------------------------------------------------------- const char* GSF_paste(int x, int y, char* mode) { // check if x,y is outside bounded grid if ( (currlayer->algo->gridwd > 0 && (x < currlayer->algo->gridleft.toint() || x > currlayer->algo->gridright.toint())) || (currlayer->algo->gridht > 0 && (y < currlayer->algo->gridtop.toint() || y > currlayer->algo->gridbottom.toint())) ) { return "Given cell is outside grid boundary."; } if (!mainptr->ClipboardHasText()) return "No pattern in clipboard."; // temporarily change selection and paste mode Selection oldsel = currlayer->currsel; const char* oldmode = GetPasteMode(); wxString modestr = wxString(mode, wxConvLocal); if (modestr.IsSameAs(wxT("and"), false)) SetPasteMode("And"); else if (modestr.IsSameAs(wxT("copy"), false)) SetPasteMode("Copy"); else if (modestr.IsSameAs(wxT("or"), false)) SetPasteMode("Or"); else if (modestr.IsSameAs(wxT("xor"), false)) SetPasteMode("Xor"); else return "Unknown mode."; // create huge selection rect so no possibility of error message currlayer->currsel.SetRect(x, y, INT_MAX, INT_MAX); viewptr->PasteClipboard(true); // true = paste to selection // restore selection and paste mode currlayer->currsel = oldsel; SetPasteMode(oldmode); DoAutoUpdate(); return NULL; } // ----------------------------------------------------------------------------- const char* GSF_checkpos(lifealgo* algo, int x, int y) { // check that x,y is within bounded grid if ( (algo->gridwd > 0 && (x < algo->gridleft.toint() || x > algo->gridright.toint())) || (algo->gridht > 0 && (y < algo->gridtop.toint() || y > algo->gridbottom.toint())) ) { return "Cell is outside grid boundary."; } return NULL; } // ----------------------------------------------------------------------------- const char* GSF_checkrect(int x, int y, int wd, int ht) { if (wd <= 0) return "Rectangle width must be > 0."; if (ht <= 0) return "Rectangle height must be > 0."; // check that rect is completely within bounded grid if ( (currlayer->algo->gridwd > 0 && (x < currlayer->algo->gridleft.toint() || x > currlayer->algo->gridright.toint() || x+wd-1 < currlayer->algo->gridleft.toint() || x+wd-1 > currlayer->algo->gridright.toint())) || (currlayer->algo->gridht > 0 && (y < currlayer->algo->gridtop.toint() || y > currlayer->algo->gridbottom.toint() || y+ht-1 < currlayer->algo->gridtop.toint() || y+ht-1 > currlayer->algo->gridbottom.toint())) ) { return "Rectangle is outside grid boundary."; } return NULL; } // ----------------------------------------------------------------------------- int GSF_hash(int x, int y, int wd, int ht) { // calculate a hash value for pattern in given rect int hash = 31415962; int right = x + wd - 1; int bottom = y + ht - 1; int cx, cy; int v = 0; lifealgo* curralgo = currlayer->algo; bool multistate = curralgo->NumCellStates() > 2; for ( cy=y; cy<=bottom; cy++ ) { int yshift = cy - y; for ( cx=x; cx<=right; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row (v is >= 1 if multistate) cx += skip; if (cx <= right) { // need to use a good hash function for patterns like AlienCounter.rle hash = (hash * 1000003) ^ yshift; hash = (hash * 1000003) ^ (cx - x); if (multistate) hash = (hash * 1000003) ^ v; } } else { cx = right; // done this row } } } return hash; } // ----------------------------------------------------------------------------- void GSF_select(int x, int y, int wd, int ht) { if (wd < 1 || ht < 1) { // remove any existing selection viewptr->SaveCurrentSelection(); currlayer->currsel.Deselect(); viewptr->RememberNewSelection(_("Deselection")); } else { // set selection edges viewptr->SaveCurrentSelection(); currlayer->currsel.SetRect(x, y, wd, ht); viewptr->RememberNewSelection(_("Selection")); } } // ----------------------------------------------------------------------------- bool GSF_setoption(char* optname, int newval, int* oldval) { if (strcmp(optname, "autofit") == 0) { *oldval = currlayer->autofit ? 1 : 0; if (*oldval != newval) { mainptr->ToggleAutoFit(); // autofit option only applies to a generating pattern // DoAutoUpdate(); } } else if (strcmp(optname, "boldspacing") == 0) { *oldval = boldspacing; if (newval < 2) newval = 2; if (newval > MAX_SPACING) newval = MAX_SPACING; if (*oldval != newval) { boldspacing = newval; DoAutoUpdate(); } } else if (strcmp(optname, "drawingstate") == 0) { *oldval = currlayer->drawingstate; if (newval < 0) newval = 0; if (newval >= currlayer->algo->NumCellStates()) newval = currlayer->algo->NumCellStates() - 1; if (*oldval != newval) { currlayer->drawingstate = newval; if (autoupdate) { UpdateEditBar(mainptr->IsActive()); updateedit = false; } else { // update edit bar in next GSF_update call updateedit = true; } } } else if (strcmp(optname, "fullscreen") == 0) { *oldval = mainptr->fullscreen ? 1 : 0; if (*oldval != newval) { mainptr->ToggleFullScreen(); // above always does an update (due to resizing viewport window) // DoAutoUpdate(); } } else if (strcmp(optname, "hyperspeed") == 0) { *oldval = currlayer->hyperspeed ? 1 : 0; if (*oldval != newval) mainptr->ToggleHyperspeed(); } else if (strcmp(optname, "mindelay") == 0) { *oldval = mindelay; if (newval < 0) newval = 0; if (newval > MAX_DELAY) newval = MAX_DELAY; if (*oldval != newval) { mindelay = newval; mainptr->UpdateStepExponent(); DoAutoUpdate(); } } else if (strcmp(optname, "maxdelay") == 0) { *oldval = maxdelay; if (newval < 0) newval = 0; if (newval > MAX_DELAY) newval = MAX_DELAY; if (*oldval != newval) { maxdelay = newval; mainptr->UpdateStepExponent(); DoAutoUpdate(); } } else if (strcmp(optname, "opacity") == 0) { *oldval = opacity; if (newval < 1) newval = 1; if (newval > 100) newval = 100; if (*oldval != newval) { opacity = newval; DoAutoUpdate(); } } else if (strcmp(optname, "restoreview") == 0) { *oldval = restoreview ? 1 : 0; if (*oldval != newval) { restoreview = !restoreview; // no need for DoAutoUpdate(); } } else if (strcmp(optname, "savexrle") == 0) { *oldval = savexrle ? 1 : 0; if (*oldval != newval) { savexrle = !savexrle; // no need for DoAutoUpdate(); } } else if (strcmp(optname, "showallstates") == 0) { *oldval = showallstates ? 1 : 0; if (*oldval != newval) { ToggleAllStates(); // above always does an update (due to resizing viewport window) // DoAutoUpdate(); } } else if (strcmp(optname, "showboldlines") == 0) { *oldval = showboldlines ? 1 : 0; if (*oldval != newval) { showboldlines = !showboldlines; DoAutoUpdate(); } } else if (strcmp(optname, "showeditbar") == 0) { *oldval = showedit ? 1 : 0; if (*oldval != newval) { ToggleEditBar(); // above always does an update (due to resizing viewport window) // DoAutoUpdate(); } } else if (strcmp(optname, "showexact") == 0) { *oldval = showexact ? 1 : 0; if (*oldval != newval) { mainptr->ToggleExactNumbers(); // above always does an update (due to resizing viewport window) // DoAutoUpdate(); } } else if (strcmp(optname, "showgrid") == 0) { *oldval = showgridlines ? 1 : 0; if (*oldval != newval) { showgridlines = !showgridlines; DoAutoUpdate(); } } else if (strcmp(optname, "showhashinfo") == 0) { *oldval = currlayer->showhashinfo ? 1 : 0; if (*oldval != newval) mainptr->ToggleHashInfo(); } else if (strcmp(optname, "showicons") == 0) { *oldval = showicons ? 1 : 0; if (*oldval != newval) { viewptr->ToggleCellIcons(); DoAutoUpdate(); } } else if (strcmp(optname, "showlayerbar") == 0) { *oldval = showlayer ? 1 : 0; if (*oldval != newval) { ToggleLayerBar(); // above always does an update (due to resizing viewport window) // DoAutoUpdate(); } } else if (strcmp(optname, "showpatterns") == 0) { *oldval = showpatterns ? 1 : 0; if (*oldval != newval) { mainptr->ToggleShowPatterns(); // above always does an update (due to resizing viewport window) // DoAutoUpdate(); } } else if (strcmp(optname, "showscripts") == 0) { *oldval = showscripts ? 1 : 0; if (*oldval != newval) { mainptr->ToggleShowScripts(); // above always does an update (due to resizing viewport window) // DoAutoUpdate(); } } else if (strcmp(optname, "showtoolbar") == 0) { *oldval = showtool ? 1 : 0; if (*oldval != newval) { mainptr->ToggleToolBar(); // above always does an update (due to resizing viewport window) // DoAutoUpdate(); } } else if (strcmp(optname, "showstatusbar") == 0) { *oldval = showstatus ? 1 : 0; if (*oldval != newval) { mainptr->ToggleStatusBar(); // above always does an update (due to resizing viewport window) // DoAutoUpdate(); } } else if (strcmp(optname, "swapcolors") == 0) { *oldval = swapcolors ? 1 : 0; if (*oldval != newval) { viewptr->ToggleCellColors(); DoAutoUpdate(); } } else if (strcmp(optname, "synccursors") == 0) { *oldval = synccursors ? 1 : 0; if (*oldval != newval) { ToggleSyncCursors(); DoAutoUpdate(); } } else if (strcmp(optname, "syncviews") == 0) { *oldval = syncviews ? 1 : 0; if (*oldval != newval) { ToggleSyncViews(); DoAutoUpdate(); } } else if (strcmp(optname, "switchlayers") == 0) { *oldval = canswitch ? 1 : 0; if (*oldval != newval) { canswitch = !canswitch; // no need for DoAutoUpdate(); } } else if (strcmp(optname, "stacklayers") == 0) { *oldval = stacklayers ? 1 : 0; if (*oldval != newval) { ToggleStackLayers(); // above always does an update // DoAutoUpdate(); } } else if (strcmp(optname, "tilelayers") == 0) { *oldval = tilelayers ? 1 : 0; if (*oldval != newval) { ToggleTileLayers(); // above always does an update // DoAutoUpdate(); } // this option is deprecated (use setalgo command) } else if (strcmp(optname, "hashing") == 0) { *oldval = (currlayer->algtype == HLIFE_ALGO) ? 1 : 0; if (*oldval != newval) { mainptr->ChangeAlgorithm(newval ? HLIFE_ALGO : QLIFE_ALGO); DoAutoUpdate(); } } else { // unknown option return false; } if (*oldval != newval) { mainptr->UpdateMenuItems(mainptr->IsActive()); } return true; } // ----------------------------------------------------------------------------- bool GSF_getoption(char* optname, int* optval) { if (strcmp(optname, "autofit") == 0) *optval = currlayer->autofit ? 1 : 0; else if (strcmp(optname, "boldspacing") == 0) *optval = boldspacing; else if (strcmp(optname, "drawingstate") == 0) *optval = currlayer->drawingstate; else if (strcmp(optname, "fullscreen") == 0) *optval = mainptr->fullscreen ? 1 : 0; else if (strcmp(optname, "hyperspeed") == 0) *optval = currlayer->hyperspeed ? 1 : 0; else if (strcmp(optname, "mindelay") == 0) *optval = mindelay; else if (strcmp(optname, "maxdelay") == 0) *optval = maxdelay; else if (strcmp(optname, "opacity") == 0) *optval = opacity; else if (strcmp(optname, "restoreview") == 0) *optval = restoreview ? 1 : 0; else if (strcmp(optname, "savexrle") == 0) *optval = savexrle ? 1 : 0; else if (strcmp(optname, "showallstates") == 0) *optval = showallstates ? 1 : 0; else if (strcmp(optname, "showboldlines") == 0) *optval = showboldlines ? 1 : 0; else if (strcmp(optname, "showeditbar") == 0) *optval = showedit ? 1 : 0; else if (strcmp(optname, "showexact") == 0) *optval = showexact ? 1 : 0; else if (strcmp(optname, "showgrid") == 0) *optval = showgridlines ? 1 : 0; else if (strcmp(optname, "showhashinfo") == 0) *optval = currlayer->showhashinfo ? 1 : 0; else if (strcmp(optname, "showicons") == 0) *optval = showicons ? 1 : 0; else if (strcmp(optname, "showlayerbar") == 0) *optval = showlayer ? 1 : 0; else if (strcmp(optname, "showpatterns") == 0) *optval = showpatterns ? 1 : 0; else if (strcmp(optname, "showscripts") == 0) *optval = showscripts ? 1 : 0; else if (strcmp(optname, "showstatusbar") == 0) *optval = showstatus ? 1 : 0; else if (strcmp(optname, "showtoolbar") == 0) *optval = showtool ? 1 : 0; else if (strcmp(optname, "stacklayers") == 0) *optval = stacklayers ? 1 : 0; else if (strcmp(optname, "swapcolors") == 0) *optval = swapcolors ? 1 : 0; else if (strcmp(optname, "switchlayers") == 0) *optval = canswitch ? 1 : 0; else if (strcmp(optname, "synccursors") == 0) *optval = synccursors ? 1 : 0; else if (strcmp(optname, "syncviews") == 0) *optval = syncviews ? 1 : 0; else if (strcmp(optname, "tilelayers") == 0) *optval = tilelayers ? 1 : 0; // this option is deprecated (use getalgo command) else if (strcmp(optname, "hashing") == 0) *optval = (currlayer->algtype == HLIFE_ALGO) ? 1 : 0; else { // unknown option return false; } return true; } // ----------------------------------------------------------------------------- bool GSF_setcolor(char* colname, wxColor& newcol, wxColor& oldcol) { if (strncmp(colname, "livecells", 9) == 0) { // livecells0..livecells9 are deprecated; get and set color of state 1 oldcol.Set(currlayer->cellr[1], currlayer->cellg[1], currlayer->cellb[1]); if (oldcol != newcol) { currlayer->cellr[1] = newcol.Red(); currlayer->cellg[1] = newcol.Green(); currlayer->cellb[1] = newcol.Blue(); UpdateCloneColors(); DoAutoUpdate(); } } else if (strcmp(colname, "deadcells") == 0) { // deprecated; can now use setcolors([0,r,g,b]) oldcol.Set(currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0]); if (oldcol != newcol) { currlayer->cellr[0] = newcol.Red(); currlayer->cellg[0] = newcol.Green(); currlayer->cellb[0] = newcol.Blue(); UpdateCloneColors(); DoAutoUpdate(); } } else if (strcmp(colname, "border") == 0) { oldcol = *borderrgb; if (oldcol != newcol) { *borderrgb = newcol; SetBrushesAndPens(); DoAutoUpdate(); } } else if (strcmp(colname, "paste") == 0) { oldcol = *pastergb; if (oldcol != newcol) { *pastergb = newcol; SetBrushesAndPens(); DoAutoUpdate(); } } else if (strcmp(colname, "select") == 0) { oldcol = *selectrgb; if (oldcol != newcol) { *selectrgb = newcol; SetBrushesAndPens(); SetSelectionColor(); // see wxrender.cpp DoAutoUpdate(); } } else if (strcmp(colname, "hashing") == 0) { // deprecated oldcol = algoinfo[HLIFE_ALGO]->statusrgb; if (oldcol != newcol) { algoinfo[HLIFE_ALGO]->statusrgb = newcol; SetBrushesAndPens(); DoAutoUpdate(); } } else if (strcmp(colname, "nothashing") == 0) { // deprecated oldcol = algoinfo[QLIFE_ALGO]->statusrgb; if (oldcol != newcol) { algoinfo[QLIFE_ALGO]->statusrgb = newcol; SetBrushesAndPens(); DoAutoUpdate(); } } else { // look for algo name char* algoname = ReplaceDeprecatedAlgo(colname); for (int i = 0; i < NumAlgos(); i++) { if (strcmp(algoname, GetAlgoName(i)) == 0) { oldcol = algoinfo[i]->statusrgb; if (oldcol != newcol) { algoinfo[i]->statusrgb = newcol; SetBrushesAndPens(); DoAutoUpdate(); } return true; } } // unknown color name return false; } return true; } // ----------------------------------------------------------------------------- bool GSF_getcolor(char* colname, wxColor& color) { if (strncmp(colname, "livecells", 9) == 0) { // livecells0..livecells9 are deprecated; return color of state 1 color.Set(currlayer->cellr[1], currlayer->cellg[1], currlayer->cellb[1]); } else if (strcmp(colname, "deadcells") == 0) { // deprecated; can now use getcolors(0) color.Set(currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0]); } else if (strcmp(colname, "border") == 0) color = *borderrgb; else if (strcmp(colname, "paste") == 0) color = *pastergb; else if (strcmp(colname, "select") == 0) color = *selectrgb; // next two are deprecated else if (strcmp(colname, "hashing") == 0) color = algoinfo[HLIFE_ALGO]->statusrgb; else if (strcmp(colname, "nothashing") == 0) color = algoinfo[QLIFE_ALGO]->statusrgb; else { // look for algo name char* algoname = ReplaceDeprecatedAlgo(colname); for (int i = 0; i < NumAlgos(); i++) { if (strcmp(algoname, GetAlgoName(i)) == 0) { color = algoinfo[i]->statusrgb; return true; } } // unknown color name return false; } return true; } // ----------------------------------------------------------------------------- void GSF_getevent(wxString& event, int get) { if (get) { passkeys = true; // future keyboard events will call PassKeyToScript passclicks = true; // future mouse events will call PassClickToScript } else { // tell Golly to handle future keyboard and mouse events passkeys = false; passclicks = false; // clear any pending events so event is set to empty string below eventqueue.Clear(); } if (eventqueue.IsEmpty()) { event = wxEmptyString; } else { // get event at start of queue, then remove it event = eventqueue[0]; eventqueue.RemoveAt(0); } } // ----------------------------------------------------------------------------- #if defined(__WXMAC__) && wxCHECK_VERSION(2,9,0) // wxMOD_CONTROL has been changed to mean Command key down (sheesh!) #define wxMOD_CONTROL wxMOD_RAW_CONTROL #define ControlDown RawControlDown #endif static void AppendModifiers(int modifiers, wxString& event) { // reverse of GetModifiers if (modifiers == wxMOD_NONE) { event += wxT("none"); } else { if (modifiers & wxMOD_ALT) event += wxT("alt"); #ifdef __WXMAC__ if (modifiers & wxMOD_CMD) event += wxT("cmd"); if (modifiers & wxMOD_CONTROL) event += wxT("ctrl"); #else if (modifiers & wxMOD_CMD) event += wxT("ctrl"); if (modifiers & wxMOD_META) event += wxT("meta"); #endif if (modifiers & wxMOD_SHIFT) event += wxT("shift"); } } // ----------------------------------------------------------------------------- static int GetModifiers(const wxString& modstring) { // reverse of AppendModifiers int modifiers = wxMOD_NONE; if (modstring != wxT("none")) { if (modstring.Contains(wxT("alt"))) modifiers |= wxMOD_ALT; if (modstring.Contains(wxT("cmd"))) modifiers |= wxMOD_CMD; if (modstring.Contains(wxT("ctrl"))) modifiers |= wxMOD_CONTROL; if (modstring.Contains(wxT("meta"))) modifiers |= wxMOD_META; if (modstring.Contains(wxT("shift"))) modifiers |= wxMOD_SHIFT; } return modifiers; } // ----------------------------------------------------------------------------- const char* GSF_doevent(const wxString& event) { if (event.length() > 0) { if (event.StartsWith(wxT("key ")) && event.length() > 7) { // parse event string like "key x altshift" int key = event[4]; if (event[4] == 'f' && event[5] >= '1' && event[5] <= '9') { // parse function key (f1 to f24) if (event[6] == ' ') { // f1 to f9 key = WXK_F1 + (event[5] - '1'); } else if (event[6] >= '0' && event[6] <= '9') { // f10 to f24 key = WXK_F1 + 10 * (event[5] - '0') + (event[6] - '0') - 1; if (key > WXK_F24) return "Bad function key (must be f1 to f24)."; } else { return "Bad function key (must be f1 to f24)."; } } else if (event[5] != ' ') { // parse special char name like space, tab, etc // must match reverse conversion in PassKeyToScript if (event.Contains(wxT("space"))) key = ' '; else if (event.Contains(wxT("home"))) key = WXK_HOME; else if (event.Contains(wxT("end"))) key = WXK_END; else if (event.Contains(wxT("pageup"))) key = WXK_PAGEUP; else if (event.Contains(wxT("pagedown"))) key = WXK_PAGEDOWN; else if (event.Contains(wxT("help"))) key = WXK_HELP; else if (event.Contains(wxT("insert"))) key = WXK_INSERT; else if (event.Contains(wxT("delete"))) key = WXK_DELETE; else if (event.Contains(wxT("tab"))) key = WXK_TAB; else if (event.Contains(wxT("enter"))) key = WXK_RETURN; else if (event.Contains(wxT("return"))) key = WXK_RETURN; else if (event.Contains(wxT("left"))) key = WXK_LEFT; else if (event.Contains(wxT("right"))) key = WXK_RIGHT; else if (event.Contains(wxT("up"))) key = WXK_UP; else if (event.Contains(wxT("down"))) key = WXK_DOWN; else return "Unknown key."; } viewptr->ProcessKey(key, GetModifiers(event.AfterLast(' '))); if (showtitle) { // update window title inscript = false; mainptr->SetWindowTitle(wxEmptyString); inscript = true; showtitle = false; } } else if (event.StartsWith(wxT("click "))) { // parse event string like "click 10 20 left altshift" wxString xstr = event.AfterFirst(' '); wxString ystr = xstr.AfterFirst(' '); xstr = xstr.BeforeFirst(' '); ystr = ystr.BeforeFirst(' '); if (!xstr.IsNumber()) return "Bad x value."; if (!ystr.IsNumber()) return "Bad y value."; bigint x(xstr.mb_str(wxConvLocal)); bigint y(ystr.mb_str(wxConvLocal)); int button; if (event.Contains(wxT(" left "))) button = wxMOUSE_BTN_LEFT; else if (event.Contains(wxT(" middle "))) button = wxMOUSE_BTN_MIDDLE; else if (event.Contains(wxT(" right "))) button = wxMOUSE_BTN_RIGHT; else return "Unknown button."; if (viewptr->CellVisible(x, y) && viewptr->CellInGrid(x, y)) { // convert x,y cell position to pixel position in viewport pair xy = currlayer->view->screenPosOf(x, y, currlayer->algo); int mods = GetModifiers(event.AfterLast(' ')); viewptr->ProcessClick(xy.first, xy.second, button, mods); if (showtitle) { // update window title inscript = false; mainptr->SetWindowTitle(wxEmptyString); inscript = true; showtitle = false; } } else { // ignore click if x,y is outside viewport or grid return NULL; } } else { return "Unknown event."; } } return NULL; } // ----------------------------------------------------------------------------- // the following is deprecated (use GSF_getevent) void GSF_getkey(char* s) { passkeys = true; // future keyboard events will call PassKeyToScript if (scriptchars.length() == 0) { // return empty string s[0] = '\0'; } else { // return first char in scriptchars and then remove it s[0] = scriptchars.GetChar(0); s[1] = '\0'; scriptchars = scriptchars.AfterFirst(s[0]); } } // ----------------------------------------------------------------------------- // the following is deprecated (use GSF_doevent) void GSF_dokey(char* ascii) { if (*ascii) { // convert ascii char to corresponding wx key code; // note that PassKeyToScript does the reverse conversion int key; switch (*ascii) { case 127: // treat delete like backspace case 8: key = WXK_BACK; break; case 9: key = WXK_TAB; break; case 10: // treat linefeed like return case 13: key = WXK_RETURN; break; case 28: key = WXK_LEFT; break; case 29: key = WXK_RIGHT; break; case 30: key = WXK_UP; break; case 31: key = WXK_DOWN; break; default: key = *ascii; } // we can't handle modifiers here viewptr->ProcessKey(key, wxMOD_NONE); if (showtitle) { // update window title inscript = false; mainptr->SetWindowTitle(wxEmptyString); inscript = true; showtitle = false; } } } // ----------------------------------------------------------------------------- void GSF_update() { // update viewport, status bar, and possibly other bars inscript = false; mainptr->UpdatePatternAndStatus(); if (showtitle) { mainptr->SetWindowTitle(wxEmptyString); showtitle = false; } if (updateedit) { UpdateEditBar(mainptr->IsActive()); updateedit = false; } inscript = true; } // ----------------------------------------------------------------------------- void GSF_exit(char* errmsg) { if (errmsg && errmsg[0] != 0) { // display given error message inscript = false; statusptr->ErrorMessage(wxString(errmsg,wxConvLocal)); inscript = true; // make sure status bar is visible if (!showstatus) mainptr->ToggleStatusBar(); } exitcalled = true; // prevent CheckScriptError changing message } // ============================================================================= void CheckScriptError(const wxString& ext) { if (scripterr.IsEmpty()) return; // no error if (scripterr.Find(wxString(abortmsg,wxConvLocal)) >= 0) { // error was caused by AbortPerlScript/AbortPythonScript // so don't display scripterr } else { wxString errtype; if (ext.IsSameAs(wxT("pl"), false)) { errtype = _("Perl error:"); scripterr.Replace(wxT(". at "), wxT("\nat ")); } else { errtype = _("Python error:"); scripterr.Replace(wxT(" File \"\", line 1, in ?\n"), wxT("")); } Beep(); #ifdef __WXMAC__ wxSetCursor(*wxSTANDARD_CURSOR); #endif wxMessageBox(scripterr, errtype, wxOK | wxICON_EXCLAMATION, wxGetActiveWindow()); } // don't change status message if GSF_exit was used to stop script if (!exitcalled) statusptr->DisplayMessage(_("Script aborted.")); } // ----------------------------------------------------------------------------- void ChangeCell(int x, int y, int oldstate, int newstate) { // first check if there are any pending gen changes that need to be remembered if (currlayer->undoredo->savegenchanges) { currlayer->undoredo->savegenchanges = false; currlayer->undoredo->RememberGenFinish(); } // setcell/putcells command is changing state of cell at x,y currlayer->undoredo->SaveCellChange(x, y, oldstate, newstate); if (!currlayer->undoredo->savecellchanges) { currlayer->undoredo->savecellchanges = true; // save layer's dirty state for next RememberCellChanges call currlayer->savedirty = currlayer->dirty; } } // ----------------------------------------------------------------------------- void SavePendingChanges(bool checkgenchanges) { // this should only be called if inscript && allowundo && !currlayer->stayclean if ( !(inscript && allowundo && !currlayer->stayclean) ) Warning(_("Bug detected in SavePendingChanges!")); if (currlayer->undoredo->savecellchanges) { currlayer->undoredo->savecellchanges = false; // remember accumulated cell changes currlayer->undoredo->RememberCellChanges(_("bug1"), currlayer->savedirty); // action string should never be seen } if (checkgenchanges && currlayer->undoredo->savegenchanges) { currlayer->undoredo->savegenchanges = false; // remember accumulated gen changes currlayer->undoredo->RememberGenFinish(); } } // ----------------------------------------------------------------------------- void RunScript(const wxString& filename) { if (TimelineExists()) { statusptr->ErrorMessage(_("You can't run a script if there is a timeline.")); return; } // use these flags to allow re-entrancy bool already_inscript = inscript; bool in_plscript = plscript; bool in_pyscript = pyscript; wxString savecwd; if (!wxFileName::FileExists(filename)) { Warning(_("The script file does not exist:\n") + filename); return; } if (already_inscript) { // save current directory so we can restore it below savecwd = scriptloc; } else { mainptr->showbanner = false; statusptr->ClearMessage(); scripterr.Clear(); scriptchars.Clear(); eventqueue.Clear(); canswitch = false; stop_after_script = false; autoupdate = false; exitcalled = false; allowcheck = true; showtitle = false; updateedit = false; passkeys = false; passclicks = false; wxGetApp().PollerReset(); } // temporarily change current directory to location of script wxFileName fullname(filename); fullname.Normalize(); scriptloc = fullname.GetPath(); if ( scriptloc.Last() != wxFILE_SEP_PATH ) scriptloc += wxFILE_SEP_PATH; wxSetWorkingDirectory(scriptloc); wxString fpath = fullname.GetFullPath(); #ifdef __WXMAC__ // use decomposed UTF8 so interpreter can open names with non-ASCII chars fpath = wxString(fpath.fn_str(),wxConvLocal); #endif if (!already_inscript) { if (allowundo) { // save each layer's dirty state for use by next RememberCellChanges call for ( int i = 0; i < numlayers; i++ ) { Layer* layer = GetLayer(i); layer->savedirty = layer->dirty; // at start of script there are no pending cell/gen changes layer->undoredo->savecellchanges = false; layer->undoredo->savegenchanges = false; // add a special node to indicate that the script is about to start so // that all changes made by the script can be undone/redone in one go; // note that the UndoRedo ctor calls RememberScriptStart if the script // creates a new non-cloned layer, and we let RememberScriptStart handle // multiple calls if this layer is a clone layer->undoredo->RememberScriptStart(); } } inscript = true; mainptr->UpdateUserInterface(mainptr->IsActive()); // temporarily remove accelerators from all menu items // so keyboard shortcuts can be passed to script mainptr->UpdateMenuAccelerators(); } wxString ext = filename.AfterLast('.'); if (ext.IsSameAs(wxT("pl"), false)) { plscript = true; RunPerlScript(fpath); } else if (ext.IsSameAs(wxT("py"), false)) { pyscript = true; RunPythonScript(fpath); } else { // should never happen plscript = false; pyscript = false; Warning(_("Unexpected extension in script file:\n") + filename); } if (already_inscript) { // restore current directory saved above scriptloc = savecwd; wxSetWorkingDirectory(scriptloc); // display any Perl/Python error message CheckScriptError(ext); if (!scripterr.IsEmpty()) { if (in_pyscript) { // abort the calling Python script AbortPythonScript(); } else if (in_plscript) { // abort the calling Perl script AbortPerlScript(); } } plscript = in_plscript; pyscript = in_pyscript; } else { // already_inscript is false // tidy up the undo/redo history for each layer; note that some calls // use currlayer (eg. RememberGenFinish) so we temporarily set currlayer // to each layer -- this is a bit yukky but should be safe as long as we // synchronize clone info, especially currlayer->algo ptrs because they // can change if the script called new() SyncClones(); Layer* savelayer = currlayer; for ( int i = 0; i < numlayers; i++ ) { currlayer = GetLayer(i); if (allowundo) { if (currlayer->undoredo->savecellchanges) { currlayer->undoredo->savecellchanges = false; // remember pending cell change(s) if (currlayer->stayclean) currlayer->undoredo->ForgetCellChanges(); else currlayer->undoredo->RememberCellChanges(_("bug2"), currlayer->savedirty); // action string should never be seen } if (currlayer->undoredo->savegenchanges) { currlayer->undoredo->savegenchanges = false; // remember pending gen change(s); no need to test stayclean flag // (if it's true then NextGeneration called RememberGenStart) currlayer->undoredo->RememberGenFinish(); } // add special node to indicate that the script has finished; // we let RememberScriptFinish handle multiple calls if this // layer is a clone currlayer->undoredo->RememberScriptFinish(); } // reset the stayclean flag in case it was set by MarkLayerClean currlayer->stayclean = false; } currlayer = savelayer; // must reset inscript AFTER RememberGenFinish inscript = false; // restore current directory to location of Golly app wxSetWorkingDirectory(gollydir); plscript = false; pyscript = false; // update Undo/Redo items based on current layer's history if (allowundo) currlayer->undoredo->UpdateUndoRedoItems(); // display any Perl/Python error message CheckScriptError(ext); // update title, menu bar, cursor, viewport, status bar, tool bar, etc if (showtitle) mainptr->SetWindowTitle(wxEmptyString); mainptr->UpdateEverything(); // restore accelerators that were cleared above mainptr->UpdateMenuAccelerators(); } } // ----------------------------------------------------------------------------- void PassClickToScript(const bigint& x, const bigint& y, int button, int modifiers) { // build a string like "click 10 20 left altshift" and add to event queue // for possible consumption by GSF_getevent wxString clickinfo = wxT("click "); clickinfo += wxString(x.tostring('\0'),wxConvLocal); clickinfo += wxT(" "); clickinfo += wxString(y.tostring('\0'),wxConvLocal); if (button == wxMOUSE_BTN_LEFT) clickinfo += wxT(" left "); if (button == wxMOUSE_BTN_MIDDLE) clickinfo += wxT(" middle "); if (button == wxMOUSE_BTN_RIGHT) clickinfo += wxT(" right "); AppendModifiers(modifiers, clickinfo); eventqueue.Add(clickinfo); } // ----------------------------------------------------------------------------- void PassKeyToScript(int key, int modifiers) { if (key == WXK_ESCAPE) { if (mainptr->generating) { // interrupt a run() or step() command wxGetApp().PollerInterrupt(); } if (plscript) AbortPerlScript(); if (pyscript) AbortPythonScript(); } else { // build a string like "key x altshift" and add to event queue // for possible consumption by GSF_getevent wxString keyinfo = wxT("key "); if (key > ' ' && key <= '~') { // displayable ASCII keyinfo += wxChar(key); } else if (key >= WXK_F1 && key <= WXK_F24) { // function key keyinfo += wxString::Format(wxT("f%d"), key - WXK_F1 + 1); } else { // convert some special key codes to names like space, tab, delete, etc // (must match reverse conversion in GSF_doevent) switch (key) { case ' ': keyinfo += wxT("space"); break; case WXK_HOME: keyinfo += wxT("home"); break; case WXK_END: keyinfo += wxT("end"); break; case WXK_PAGEUP: keyinfo += wxT("pageup"); break; case WXK_PAGEDOWN: keyinfo += wxT("pagedown"); break; case WXK_HELP: keyinfo += wxT("help"); break; case WXK_INSERT: keyinfo += wxT("insert"); break; case WXK_BACK: // treat backspace like delete case WXK_DELETE: keyinfo += wxT("delete"); break; case WXK_TAB: keyinfo += wxT("tab"); break; case WXK_NUMPAD_ENTER: // treat enter like return case WXK_RETURN: keyinfo += wxT("return"); break; case WXK_LEFT: keyinfo += wxT("left"); break; case WXK_RIGHT: keyinfo += wxT("right"); break; case WXK_UP: keyinfo += wxT("up"); break; case WXK_DOWN: keyinfo += wxT("down"); break; case WXK_ADD: keyinfo += wxT("+"); break; case WXK_SUBTRACT: keyinfo += wxT("-"); break; case WXK_DIVIDE: keyinfo += wxT("/"); break; case WXK_MULTIPLY: keyinfo += wxT("*"); break; default: return; // ignore all other key codes } } keyinfo += wxT(" "); AppendModifiers(modifiers, keyinfo); eventqueue.Add(keyinfo); // NOTE: following code is for deprecated getkey() command // convert wx key code to corresponding ascii char (if possible) // so that scripts can be platform-independent; // note that GSF_dokey does the reverse conversion char ascii; if (key >= ' ' && key <= '~') { if (modifiers == wxMOD_SHIFT && key >= 'a' && key <= 'z') { // let script see A..Z ascii = key - 32; } else { ascii = key; } } else { switch (key) { case WXK_DELETE: // treat delete like backspace case WXK_BACK: ascii = 8; break; case WXK_TAB: ascii = 9; break; case WXK_NUMPAD_ENTER: // treat enter like return case WXK_RETURN: ascii = 13; break; case WXK_LEFT: ascii = 28; break; case WXK_RIGHT: ascii = 29; break; case WXK_UP: ascii = 30; break; case WXK_DOWN: ascii = 31; break; case WXK_ADD: ascii = '+'; break; case WXK_SUBTRACT: ascii = '-'; break; case WXK_DIVIDE: ascii = '/'; break; case WXK_MULTIPLY: ascii = '*'; break; default: return; // ignore all other key codes } } // save ascii char for possible consumption by GSF_getkey scriptchars += ascii; } } // ----------------------------------------------------------------------------- void FinishScripting() { // called when main window is closing (ie. app is quitting) if (inscript) { if (mainptr->generating) { // interrupt a run() or step() command wxGetApp().PollerInterrupt(); } if (plscript) AbortPerlScript(); if (pyscript) AbortPythonScript(); wxSetWorkingDirectory(gollydir); inscript = false; } FinishPerlScripting(); FinishPythonScripting(); } golly-2.5-src/gui-wx/wxselect.cpp0000644000175100001440000022313312156145314014001 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "bigint.h" #include "lifealgo.h" #include "viewport.h" #include "wxgolly.h" // for wxGetApp, mainptr, viewptr, statusptr, insideYield #include "wxutils.h" // for Warning #include "wxprefs.h" // for randomfill, etc #include "wxmain.h" // for mainptr->... #include "wxstatus.h" // for statusptr->... #include "wxscript.h" // for inscript #include "wxview.h" // for viewptr->... #include "wxundo.h" // for currlayer->undoredo->... #include "wxalgos.h" // for *_ALGO, CreateNewUniverse #include "wxlayer.h" // for currlayer, MarkLayerDirty, etc #include "wxselect.h" // This module implements operations on selections. // ----------------------------------------------------------------------------- Selection::Selection() { exists = false; } // ----------------------------------------------------------------------------- Selection::Selection(int t, int l, int b, int r) { // create rectangular selection if given edges are valid exists = (t <= b && l <= r); if (exists) { seltop = t; selleft = l; selbottom = b; selright = r; } } // ----------------------------------------------------------------------------- Selection::~Selection() { // no need to do anything at the moment } // ----------------------------------------------------------------------------- bool Selection::operator==(const Selection& s) const { if (!exists && !s.exists) { // neither selection exists return true; } else if (exists && s.exists) { // check if edges match return (seltop == s.seltop && selleft == s.selleft && selbottom == s.selbottom && selright == s.selright); } else { // one selection exists but not the other return false; } } // ----------------------------------------------------------------------------- bool Selection::operator!=(const Selection& s) const { return !(*this == s); } // ----------------------------------------------------------------------------- bool Selection::Exists() { return exists; } // ----------------------------------------------------------------------------- void Selection::Deselect() { exists = false; } // ----------------------------------------------------------------------------- bool Selection::TooBig() { return viewptr->OutsideLimits(seltop, selleft, selbottom, selright); } // ----------------------------------------------------------------------------- void Selection::DisplaySize() { bigint wd = selright; wd -= selleft; wd += bigint::one; bigint ht = selbottom; ht -= seltop; ht += bigint::one; wxString msg = _("Selection wd x ht = "); msg += statusptr->Stringify(wd); msg += _(" x "); msg += statusptr->Stringify(ht); statusptr->SetMessage(msg); } // ----------------------------------------------------------------------------- void Selection::SetRect(int x, int y, int wd, int ht) { exists = (wd > 0 && ht > 0); if (exists) { seltop = y; selleft = x; // avoid int overflow ht--; wd--; selbottom = y; selbottom += ht; selright = x; selright += wd; } } // ----------------------------------------------------------------------------- void Selection::GetRect(int* x, int* y, int* wd, int* ht) { *x = selleft.toint(); *y = seltop.toint(); *wd = selright.toint() - *x + 1; *ht = selbottom.toint() - *y + 1; } // ----------------------------------------------------------------------------- void Selection::SetEdges(bigint& t, bigint& l, bigint& b, bigint& r) { exists = true; seltop = t; selleft = l; selbottom = b; selright = r; CheckGridEdges(); } // ----------------------------------------------------------------------------- void Selection::CheckGridEdges() { if (exists) { // change selection edges if necessary to ensure they are inside a bounded grid if (currlayer->algo->gridwd > 0) { if (selleft > currlayer->algo->gridright || selright < currlayer->algo->gridleft) { exists = false; // selection is outside grid return; } if (selleft < currlayer->algo->gridleft) selleft = currlayer->algo->gridleft; if (selright > currlayer->algo->gridright) selright = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (seltop > currlayer->algo->gridbottom || selbottom < currlayer->algo->gridtop) { exists = false; // selection is outside grid return; } if (seltop < currlayer->algo->gridtop) seltop = currlayer->algo->gridtop; if (selbottom > currlayer->algo->gridbottom) selbottom = currlayer->algo->gridbottom; } } } // ----------------------------------------------------------------------------- bool Selection::Contains(bigint& t, bigint& l, bigint& b, bigint& r) { return ( seltop <= t && selleft <= l && selbottom >= b && selright >= r ); } // ----------------------------------------------------------------------------- bool Selection::Outside(bigint& t, bigint& l, bigint& b, bigint& r) { return ( seltop > b || selleft > r || selbottom < t || selright < l ); } // ----------------------------------------------------------------------------- bool Selection::ContainsCell(int x, int y) { return ( x >= selleft.toint() && x <= selright.toint() && y >= seltop.toint() && y <= selbottom.toint() ); } // ----------------------------------------------------------------------------- bool Selection::SaveDifferences(lifealgo* oldalgo, lifealgo* newalgo, int itop, int ileft, int ibottom, int iright) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; // compare patterns in given algos and call SaveCellChange for each different cell BeginProgress(_("Saving cell changes")); for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int oldstate = oldalgo->getcell(cx, cy); int newstate = newalgo->getcell(cx, cy); if ( oldstate != newstate ) { // assume this is only called if allowundo && !currlayer->stayclean currlayer->undoredo->SaveCellChange(cx, cy, oldstate, newstate); } cntr++; if ((cntr % 4096) == 0) { abort = AbortProgress((double)cntr / maxcount, wxEmptyString); if (abort) break; } } if (abort) break; } EndProgress(); return !abort; } // ----------------------------------------------------------------------------- void Selection::Advance() { if (mainptr->generating || viewptr->drawingcells || viewptr->waitingforclick) return; if (!exists) { statusptr->ErrorMessage(no_selection); return; } if (currlayer->algo->isEmpty()) { statusptr->ErrorMessage(empty_selection); return; } bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); // check if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { statusptr->ErrorMessage(empty_selection); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; if (savecells && inscript) SavePendingChanges(); bool boundedgrid = (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0); // check if selection encloses entire pattern; // can't do this if qlife because it uses gen parity to decide which bits to draw; // also avoid this if undo/redo is enabled (too messy to remember cell changes) if ( currlayer->algtype != QLIFE_ALGO && !savecells && Contains(top, left, bottom, right) ) { mainptr->generating = true; wxGetApp().PollerReset(); // step by one gen without changing gen count bigint savegen = currlayer->algo->getGeneration(); bigint saveinc = currlayer->algo->getIncrement(); currlayer->algo->setIncrement(1); if (boundedgrid) mainptr->CreateBorderCells(currlayer->algo); currlayer->algo->step(); if (boundedgrid) mainptr->DeleteBorderCells(currlayer->algo); currlayer->algo->setIncrement(saveinc); currlayer->algo->setGeneration(savegen); mainptr->generating = false; // clear 1-cell thick strips just outside selection ClearOutside(); MarkLayerDirty(); mainptr->UpdateEverything(); return; } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // check that intersection is within setcell/getcell limits if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(selection_too_big); return; } // create a temporary universe of same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype); if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); // copy live cells in selection to temporary universe if ( !viewptr->CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, tempalgo, false, _("Saving selection")) ) { delete tempalgo; return; } if ( tempalgo->isEmpty() ) { statusptr->ErrorMessage(empty_selection); delete tempalgo; return; } // advance temporary universe by one gen mainptr->generating = true; wxGetApp().PollerReset(); tempalgo->setIncrement(1); if (boundedgrid) mainptr->CreateBorderCells(tempalgo); tempalgo->step(); if (boundedgrid) mainptr->DeleteBorderCells(tempalgo); mainptr->generating = false; if ( !tempalgo->isEmpty() ) { // temporary pattern might have expanded bigint temptop, templeft, tempbottom, tempright; tempalgo->findedges(&temptop, &templeft, &tempbottom, &tempright); if (temptop < top) top = temptop; if (templeft < left) left = templeft; if (tempbottom > bottom) bottom = tempbottom; if (tempright > right) right = tempright; // but ignore live cells created outside selection edges if (top < seltop) top = seltop; if (left < selleft) left = selleft; if (bottom > selbottom) bottom = selbottom; if (right > selright) right = selright; } if (savecells) { // compare selection rect in currlayer->algo and tempalgo and call SaveCellChange // for each cell that has a different state if ( SaveDifferences(currlayer->algo, tempalgo, top.toint(), left.toint(), bottom.toint(), right.toint()) ) { if ( !currlayer->undoredo->RememberCellChanges(_("Advance Selection"), currlayer->dirty) ) { // pattern inside selection didn't change delete tempalgo; return; } } else { currlayer->undoredo->ForgetCellChanges(); delete tempalgo; return; } } // copy all cells in new selection from tempalgo to currlayer->algo viewptr->CopyAllRect(top.toint(), left.toint(), bottom.toint(), right.toint(), tempalgo, currlayer->algo, _("Copying advanced selection")); delete tempalgo; MarkLayerDirty(); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void Selection::AdvanceOutside() { if (mainptr->generating || viewptr->drawingcells || viewptr->waitingforclick) return; if (!exists) { statusptr->ErrorMessage(no_selection); return; } if (currlayer->algo->isEmpty()) { statusptr->ErrorMessage(empty_outside); return; } bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); // check if selection encloses entire pattern if (Contains(top, left, bottom, right)) { statusptr->ErrorMessage(empty_outside); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; if (savecells && inscript) SavePendingChanges(); bool boundedgrid = (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0); // check if selection is completely outside pattern edges; // can't do this if qlife because it uses gen parity to decide which bits to draw; // also avoid this if undo/redo is enabled (too messy to remember cell changes) if ( currlayer->algtype != QLIFE_ALGO && !savecells && Outside(top, left, bottom, right) ) { mainptr->generating = true; wxGetApp().PollerReset(); // step by one gen without changing gen count bigint savegen = currlayer->algo->getGeneration(); bigint saveinc = currlayer->algo->getIncrement(); currlayer->algo->setIncrement(1); if (boundedgrid) mainptr->CreateBorderCells(currlayer->algo); currlayer->algo->step(); if (boundedgrid) mainptr->DeleteBorderCells(currlayer->algo); currlayer->algo->setIncrement(saveinc); currlayer->algo->setGeneration(savegen); mainptr->generating = false; // clear selection in case pattern expanded into it Clear(); MarkLayerDirty(); mainptr->UpdateEverything(); return; } // check that pattern is within setcell/getcell limits if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Pattern is outside +/- 10^9 boundary.")); return; } lifealgo* oldalgo = NULL; if (savecells) { // copy current pattern to oldalgo, using same type and gen count // so we can switch to oldalgo if user decides to abort below oldalgo = CreateNewUniverse(currlayer->algtype); if (oldalgo->setrule(currlayer->algo->getrule())) oldalgo->setrule(oldalgo->DefaultRule()); oldalgo->setGeneration( currlayer->algo->getGeneration() ); if ( !viewptr->CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, oldalgo, false, _("Saving pattern")) ) { delete oldalgo; return; } } // create a new universe of same type lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); newalgo->setGeneration( currlayer->algo->getGeneration() ); // copy (and kill) live cells in selection to new universe int iseltop = seltop.toint(); int iselleft = selleft.toint(); int iselbottom = selbottom.toint(); int iselright = selright.toint(); if ( !viewptr->CopyRect(iseltop, iselleft, iselbottom, iselright, currlayer->algo, newalgo, true, _("Saving and erasing selection")) ) { // aborted, so best to restore selection if ( !newalgo->isEmpty() ) { newalgo->findedges(&top, &left, &bottom, &right); viewptr->CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), newalgo, currlayer->algo, false, _("Restoring selection")); } delete newalgo; if (savecells) delete oldalgo; mainptr->UpdateEverything(); return; } // advance current universe by 1 generation mainptr->generating = true; wxGetApp().PollerReset(); currlayer->algo->setIncrement(1); if (boundedgrid) mainptr->CreateBorderCells(currlayer->algo); currlayer->algo->step(); if (boundedgrid) mainptr->DeleteBorderCells(currlayer->algo); mainptr->generating = false; if ( !currlayer->algo->isEmpty() ) { // find new edges and copy current pattern to new universe, // except for any cells that were created in selection // (newalgo contains the original selection) bigint t, l, b, r; currlayer->algo->findedges(&t, &l, &b, &r); int itop = t.toint(); int ileft = l.toint(); int ibottom = b.toint(); int iright = r.toint(); int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; int v = 0; bool abort = false; BeginProgress(_("Copying advanced pattern")); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; // only copy cell if outside selection if ( cx < iselleft || cx > iselright || cy < iseltop || cy > iselbottom ) { newalgo->setcell(cx, cy, v); } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, wxEmptyString); if (abort) break; } } if (abort) break; } newalgo->endofpattern(); EndProgress(); if (abort && savecells) { // revert back to pattern saved in oldalgo delete newalgo; delete currlayer->algo; currlayer->algo = oldalgo; mainptr->SetGenIncrement(); mainptr->UpdateEverything(); return; } } // switch to new universe (best to do this even if aborted) delete currlayer->algo; currlayer->algo = newalgo; mainptr->SetGenIncrement(); if (savecells) { // compare patterns in oldalgo and currlayer->algo and call SaveCellChange // for each cell that has a different state; note that we need to compare // the union of the original pattern's rect and the new pattern's rect int otop = top.toint(); int oleft = left.toint(); int obottom = bottom.toint(); int oright = right.toint(); if (!currlayer->algo->isEmpty()) { currlayer->algo->findedges(&top, &left, &bottom, &right); int ntop = top.toint(); int nleft = left.toint(); int nbottom = bottom.toint(); int nright = right.toint(); if (ntop < otop) otop = ntop; if (nleft < oleft) oleft = nleft; if (nbottom > obottom) obottom = nbottom; if (nright > oright) oright = nright; } if ( SaveDifferences(oldalgo, currlayer->algo, otop, oleft, obottom, oright) ) { delete oldalgo; if ( !currlayer->undoredo->RememberCellChanges(_("Advance Outside"), currlayer->dirty) ) { // pattern outside selection didn't change mainptr->UpdateEverything(); return; } } else { // revert back to pattern saved in oldalgo currlayer->undoredo->ForgetCellChanges(); delete currlayer->algo; currlayer->algo = oldalgo; mainptr->SetGenIncrement(); mainptr->UpdateEverything(); return; } } MarkLayerDirty(); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void Selection::Modify(const bigint& xclick, const bigint& yclick, bigint& anchorx, bigint& anchory, bool* forceh, bool* forcev) { // note that we include "=" in following tests to get sensible // results when modifying small selections (ht or wd <= 3) if ( yclick <= seltop && xclick <= selleft ) { // click is in or outside top left corner seltop = yclick; selleft = xclick; anchory = selbottom; anchorx = selright; } else if ( yclick <= seltop && xclick >= selright ) { // click is in or outside top right corner seltop = yclick; selright = xclick; anchory = selbottom; anchorx = selleft; } else if ( yclick >= selbottom && xclick >= selright ) { // click is in or outside bottom right corner selbottom = yclick; selright = xclick; anchory = seltop; anchorx = selleft; } else if ( yclick >= selbottom && xclick <= selleft ) { // click is in or outside bottom left corner selbottom = yclick; selleft = xclick; anchory = seltop; anchorx = selright; } else if (yclick <= seltop) { // click is in or above top edge *forcev = true; seltop = yclick; anchory = selbottom; } else if (yclick >= selbottom) { // click is in or below bottom edge *forcev = true; selbottom = yclick; anchory = seltop; } else if (xclick <= selleft) { // click is in or left of left edge *forceh = true; selleft = xclick; anchorx = selright; } else if (xclick >= selright) { // click is in or right of right edge *forceh = true; selright = xclick; anchorx = selleft; } else { // click is somewhere inside selection double wd = selright.todouble() - selleft.todouble() + 1.0; double ht = selbottom.todouble() - seltop.todouble() + 1.0; double onethirdx = selleft.todouble() + wd / 3.0; double twothirdx = selleft.todouble() + wd * 2.0 / 3.0; double onethirdy = seltop.todouble() + ht / 3.0; double twothirdy = seltop.todouble() + ht * 2.0 / 3.0; double midy = seltop.todouble() + ht / 2.0; double x = xclick.todouble(); double y = yclick.todouble(); if ( y < onethirdy && x < onethirdx ) { // click is near top left corner seltop = yclick; selleft = xclick; anchory = selbottom; anchorx = selright; } else if ( y < onethirdy && x > twothirdx ) { // click is near top right corner seltop = yclick; selright = xclick; anchory = selbottom; anchorx = selleft; } else if ( y > twothirdy && x > twothirdx ) { // click is near bottom right corner selbottom = yclick; selright = xclick; anchory = seltop; anchorx = selleft; } else if ( y > twothirdy && x < onethirdx ) { // click is near bottom left corner selbottom = yclick; selleft = xclick; anchory = seltop; anchorx = selright; } else if ( x < onethirdx ) { // click is near middle of left edge *forceh = true; selleft = xclick; anchorx = selright; } else if ( x > twothirdx ) { // click is near middle of right edge *forceh = true; selright = xclick; anchorx = selleft; } else if ( y < midy ) { // click is below middle section of top edge *forcev = true; seltop = yclick; anchory = selbottom; } else { // click is above middle section of bottom edge *forcev = true; selbottom = yclick; anchory = seltop; } } } // ----------------------------------------------------------------------------- void Selection::SetLeftRight(const bigint& x, const bigint& anchorx) { if (x <= anchorx) { selleft = x; selright = anchorx; } else { selleft = anchorx; selright = x; } exists = true; } // ----------------------------------------------------------------------------- void Selection::SetTopBottom(const bigint& y, const bigint& anchory) { if (y <= anchory) { seltop = y; selbottom = anchory; } else { seltop = anchory; selbottom = y; } exists = true; } // ----------------------------------------------------------------------------- void Selection::Fit() { bigint newx = selright; newx -= selleft; newx += bigint::one; newx.div2(); newx += selleft; bigint newy = selbottom; newy -= seltop; newy += bigint::one; newy.div2(); newy += seltop; int mag = MAX_MAG; while (true) { currlayer->view->setpositionmag(newx, newy, mag); if ( currlayer->view->contains(selleft, seltop) && currlayer->view->contains(selright, selbottom) ) break; mag--; } } // ----------------------------------------------------------------------------- void Selection::Shrink(bool fit) { if (!exists) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(fit ? ID_SHRINKFIT : ID_SHRINK); return; } // check if there is no pattern if (currlayer->algo->isEmpty()) { statusptr->ErrorMessage(empty_selection); if (fit) viewptr->FitSelection(); return; } // check if selection encloses entire pattern bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if (Contains(top, left, bottom, right)) { // shrink edges viewptr->SaveCurrentSelection(); seltop = top; selleft = left; selbottom = bottom; selright = right; viewptr->RememberNewSelection(_("Shrink Selection")); viewptr->DisplaySelectionSize(); if (fit) viewptr->FitSelection(); // calls UpdateEverything else mainptr->UpdatePatternAndStatus(); return; } // check if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { statusptr->ErrorMessage(empty_selection); if (fit) viewptr->FitSelection(); return; } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // check that selection is small enough to save if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(selection_too_big); if (fit) viewptr->FitSelection(); return; } if ( insideYield ) { // we've been called from checkevents() so we don't attempt to shrink a very // large selection because the progress dialog can't be cancelled, presumably // because normal event handling isn't available inside Yield() double wd = right.todouble() - left.todouble() + 1.0; double ht = bottom.todouble() - top.todouble() + 1.0; if ( wd * ht > 1.0e12 ) { statusptr->ErrorMessage(_("Selection is too big to shrink.")); if (fit) viewptr->FitSelection(); return; } } // the easy way to shrink selection is to create a new temporary universe, // copy selection into new universe and then call findedges; // if only 2 cell states then use qlife because its findedges call is faster lifealgo* tempalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure temporary universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); // copy live cells in selection to temporary universe if ( viewptr->CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, tempalgo, false, _("Copying selection")) ) { if ( tempalgo->isEmpty() ) { statusptr->ErrorMessage(empty_selection); } else { viewptr->SaveCurrentSelection(); tempalgo->findedges(&seltop, &selleft, &selbottom, &selright); viewptr->RememberNewSelection(_("Shrink Selection")); viewptr->DisplaySelectionSize(); if (!fit) mainptr->UpdatePatternAndStatus(); } } delete tempalgo; if (fit) viewptr->FitSelection(); } // ----------------------------------------------------------------------------- bool Selection::Visible(wxRect* visrect) { if (!exists) return false; pair lt = currlayer->view->screenPosOf(selleft, seltop, currlayer->algo); pair rb = currlayer->view->screenPosOf(selright, selbottom, currlayer->algo); if (lt.first > currlayer->view->getxmax() || rb.first < 0 || lt.second > currlayer->view->getymax() || rb.second < 0) { // no part of selection is visible return false; } // all or some of selection is visible in viewport; // only set visible rectangle if requested if (visrect) { // first we must clip coords to viewport if (lt.first < 0) lt.first = 0; if (lt.second < 0) lt.second = 0; if (rb.first > currlayer->view->getxmax()) rb.first = currlayer->view->getxmax(); if (rb.second > currlayer->view->getymax()) rb.second = currlayer->view->getymax(); if (currlayer->view->getmag() > 0) { // move rb to pixel at bottom right corner of cell rb.first += (1 << currlayer->view->getmag()) - 1; rb.second += (1 << currlayer->view->getmag()) - 1; if (currlayer->view->getmag() > 1) { // avoid covering gaps at scale 1:4 and above rb.first--; rb.second--; } // clip to viewport again if (rb.first > currlayer->view->getxmax()) rb.first = currlayer->view->getxmax(); if (rb.second > currlayer->view->getymax()) rb.second = currlayer->view->getymax(); } visrect->SetX(lt.first); visrect->SetY(lt.second); visrect->SetWidth(rb.first - lt.first + 1); visrect->SetHeight(rb.second - lt.second + 1); } return true; } // ----------------------------------------------------------------------------- void Selection::EmptyUniverse() { // save current step, scale, position and gen count int savebase = currlayer->currbase; int saveexpo = currlayer->currexpo; int savemag = currlayer->view->getmag(); bigint savex = currlayer->view->x; bigint savey = currlayer->view->y; bigint savegen = currlayer->algo->getGeneration(); // kill all live cells by replacing the current universe with a // new, empty universe which also uses the same rule mainptr->CreateUniverse(); // restore step, scale, position and gen count currlayer->currbase = savebase; mainptr->SetStepExponent(saveexpo); // SetStepExponent calls SetGenIncrement currlayer->view->setpositionmag(savex, savey, savemag); currlayer->algo->setGeneration(savegen); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void Selection::Clear() { if (!exists) return; // no need to do anything if there is no pattern if (currlayer->algo->isEmpty()) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_CLEAR); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; if (savecells && inscript) SavePendingChanges(); bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( !savecells && Contains(top, left, bottom, right) ) { // selection encloses entire pattern so just create empty universe EmptyUniverse(); MarkLayerDirty(); return; } // no need to do anything if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { return; } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // can only use setcell in limited domain if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(selection_too_big); return; } // clear all live cells in selection int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; int v = 0; bool abort = false; bool selchanged = false; BeginProgress(_("Clearing selection")); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; curralgo->setcell(cx, cy, 0); selchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, wxEmptyString); if (abort) break; } } if (abort) break; } if (selchanged) curralgo->endofpattern(); EndProgress(); if (selchanged) { if (savecells) currlayer->undoredo->RememberCellChanges(_("Clear"), currlayer->dirty); MarkLayerDirty(); mainptr->UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- bool Selection::SaveOutside(bigint& t, bigint& l, bigint& b, bigint& r) { if ( viewptr->OutsideLimits(t, l, b, r) ) { statusptr->ErrorMessage(pattern_too_big); return false; } int itop = t.toint(); int ileft = l.toint(); int ibottom = b.toint(); int iright = r.toint(); // save ALL cells if selection is completely outside pattern edges bool saveall = Outside(t, l, b, r); // integer selection edges must not be outside pattern edges int stop = itop; int sleft = ileft; int sbottom = ibottom; int sright = iright; if (!saveall) { if (seltop > t) stop = seltop.toint(); if (selleft > l) sleft = selleft.toint(); if (selbottom < b) sbottom = selbottom.toint(); if (selright < r) sright = selright.toint(); } int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; int v = 0; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; BeginProgress(_("Saving outside selection")); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; if (saveall || cx < sleft || cx > sright || cy < stop || cy > sbottom) { // cell is outside selection edges currlayer->undoredo->SaveCellChange(cx, cy, v, 0); } } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, wxEmptyString); if (abort) break; } } if (abort) break; } EndProgress(); if (abort) currlayer->undoredo->ForgetCellChanges(); return !abort; } // ----------------------------------------------------------------------------- void Selection::ClearOutside() { if (!exists) return; // no need to do anything if there is no pattern if (currlayer->algo->isEmpty()) return; // no need to do anything if selection encloses entire pattern bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if (Contains(top, left, bottom, right)) { return; } if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_OUTSIDE); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; if (savecells && inscript) SavePendingChanges(); if (savecells) { // save live cells outside selection if ( !SaveOutside(top, left, bottom, right) ) { return; } } else { // create empty universe if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { EmptyUniverse(); MarkLayerDirty(); return; } } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // check that selection is small enough to save if ( viewptr->OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(selection_too_big); return; } // create a new universe of same type lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); // set same gen count newalgo->setGeneration( currlayer->algo->getGeneration() ); // copy live cells in selection to new universe if ( viewptr->CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, newalgo, false, _("Saving selection")) ) { // delete old universe and point currlayer->algo at new universe delete currlayer->algo; currlayer->algo = newalgo; mainptr->SetGenIncrement(); if (savecells) currlayer->undoredo->RememberCellChanges(_("Clear Outside"), currlayer->dirty); MarkLayerDirty(); mainptr->UpdatePatternAndStatus(); } else { // CopyRect was aborted, so don't change current universe delete newalgo; if (savecells) currlayer->undoredo->ForgetCellChanges(); } } // ----------------------------------------------------------------------------- void Selection::AddEOL(char* &chptr) { #ifdef __WXMSW__ // use DOS line ending (CR+LF) on Windows *chptr = '\r'; chptr += 1; *chptr = '\n'; chptr += 1; #else // use LF on Linux or Mac *chptr = '\n'; chptr += 1; #endif } // ----------------------------------------------------------------------------- const int WRLE_NONE = -3; const int WRLE_EOP = -2; const int WRLE_NEWLINE = -1; void Selection::AddRun(int state, // in: state of cell to write int multistate, // true if #cell states > 2 unsigned int &run, // in and out unsigned int &linelen, // ditto char* &chptr) // ditto { // output of RLE pattern data is channelled thru here to make it easier to // ensure all lines have <= maxrleline characters const unsigned int maxrleline = 70; unsigned int i, numlen; char numstr[32]; if ( run > 1 ) { sprintf(numstr, "%u", run); numlen = (unsigned int)strlen(numstr); } else { numlen = 0; // no run count shown if 1 } // keep linelen <= maxrleline if ( linelen + numlen + 1 + multistate > maxrleline ) { AddEOL(chptr); linelen = 0; } i = 0; while (i < numlen) { *chptr = numstr[i]; chptr += 1; i++; } if (multistate) { if (state <= 0) *chptr = ".$!"[-state]; else { if (state > 24) { int hi = (state - 25) / 24; *chptr = hi + 'p'; chptr += 1; linelen += 1; state -= (hi + 1) * 24; } *chptr = 'A' + state - 1; } } else *chptr = "!$bo"[state+2]; chptr += 1; linelen += numlen + 1; run = 0; // reset run count } // ----------------------------------------------------------------------------- void Selection::CopyToClipboard(bool cut) { // can only use getcell/setcell in limited domain if (TooBig()) { statusptr->ErrorMessage(selection_too_big); return; } int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); unsigned int wd = iright - ileft + 1; unsigned int ht = ibottom - itop + 1; // convert cells in selection to RLE data in textptr char* textptr; char* etextptr; int cursize = 4096; textptr = (char*)malloc(cursize); if (textptr == NULL) { statusptr->ErrorMessage(_("Not enough memory for clipboard data!")); return; } etextptr = textptr + cursize; // add RLE header line sprintf(textptr, "x = %u, y = %u, rule = %s", wd, ht, currlayer->algo->getrule()); char* chptr = textptr; chptr += strlen(textptr); AddEOL(chptr); // save start of data in case livecount is zero int datastart = chptr - textptr; // add RLE pattern data unsigned int livecount = 0; unsigned int linelen = 0; unsigned int brun = 0; unsigned int orun = 0; unsigned int dollrun = 0; int laststate; int cx, cy; int v = 0; // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; if (savecells && inscript) SavePendingChanges(); double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; if (cut) BeginProgress(_("Cutting selection")); else BeginProgress(_("Copying selection")); lifealgo* curralgo = currlayer->algo; int multistate = curralgo->NumCellStates() > 2; for ( cy=itop; cy<=ibottom; cy++ ) { laststate = WRLE_NONE; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip > 0) { // have exactly "skip" empty cells here if (laststate == 0) { brun += skip; } else { if (orun > 0) { // output current run of live cells AddRun(laststate, multistate, orun, linelen, chptr); } laststate = 0; brun = skip; } } if (skip >= 0) { // found next live cell cx += skip; livecount++; if (cut) { curralgo->setcell(cx, cy, 0); if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); } if (laststate == v) { orun++; } else { if (dollrun > 0) // output current run of $ chars AddRun(WRLE_NEWLINE, multistate, dollrun, linelen, chptr); if (brun > 0) // output current run of dead cells AddRun(0, multistate, brun, linelen, chptr); if (orun > 0) // output current run of other live cells AddRun(laststate, multistate, orun, linelen, chptr); laststate = v; orun = 1; } } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, wxEmptyString); if (abort) break; } if (chptr + 60 >= etextptr) { // nearly out of space; try to increase allocation char* ntxtptr = (char*) realloc(textptr, 2*cursize); if (ntxtptr == 0) { statusptr->ErrorMessage(_("No more memory for clipboard data!")); // don't return here -- best to set abort flag and break so that // partially cut/copied portion gets saved to clipboard abort = true; break; } chptr = ntxtptr + (chptr - textptr); cursize *= 2; etextptr = ntxtptr + cursize; textptr = ntxtptr; } } if (abort) break; // end of current row if (laststate == 0) // forget dead cells at end of row brun = 0; else if (laststate >= 0) // output current run of live cells AddRun(laststate, multistate, orun, linelen, chptr); dollrun++; } if (livecount == 0) { // no live cells in selection so simplify RLE data to "!" chptr = textptr + datastart; *chptr = '!'; chptr++; } else { // terminate RLE data dollrun = 1; AddRun(WRLE_EOP, multistate, dollrun, linelen, chptr); if (cut) currlayer->algo->endofpattern(); } AddEOL(chptr); *chptr = 0; EndProgress(); if (cut && livecount > 0) { if (savecells) currlayer->undoredo->RememberCellChanges(_("Cut"), currlayer->dirty); // update currlayer->dirty AFTER RememberCellChanges MarkLayerDirty(); mainptr->UpdatePatternAndStatus(); } wxString text = wxString(textptr,wxConvLocal); mainptr->CopyTextToClipboard(text); free(textptr); } // ----------------------------------------------------------------------------- bool Selection::CanPaste(const bigint& wd, const bigint& ht, bigint& top, bigint& left) { bigint selht = selbottom; selht -= seltop; selht += 1; bigint selwd = selright; selwd -= selleft; selwd += 1; if ( ht > selht || wd > selwd ) return false; // set paste rectangle's top left cell coord top = seltop; left = selleft; return true; } // ----------------------------------------------------------------------------- void Selection::RandomFill() { if (!exists) return; // can only use getcell/setcell in limited domain if (TooBig()) { statusptr->ErrorMessage(selection_too_big); return; } if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_RANDOM); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; if (savecells && inscript) SavePendingChanges(); // no need to kill cells if selection is empty bool killcells = !currlayer->algo->isEmpty(); if ( killcells ) { // find pattern edges and compare with selection edges bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if (Contains(top, left, bottom, right)) { // selection encloses entire pattern so create empty universe if (savecells) { // don't kill pattern otherwise we can't use SaveCellChange below } else { EmptyUniverse(); killcells = false; } } else if (Outside(top, left, bottom, right)) { // selection is completely outside pattern edges killcells = false; } } int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; BeginProgress(_("Randomly filling selection")); int cx, cy; lifealgo* curralgo = currlayer->algo; int livestates = curralgo->NumCellStates() - 1; // don't count dead state for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { // randomfill is from 1..100 if (savecells) { // remember cell change only if state changes int oldstate = curralgo->getcell(cx, cy); if ((rand() % 100) < randomfill) { int newstate = livestates < 2 ? 1 : 1 + (rand() % livestates); if (oldstate != newstate) { curralgo->setcell(cx, cy, newstate); currlayer->undoredo->SaveCellChange(cx, cy, oldstate, newstate); } } else if (killcells && oldstate > 0) { curralgo->setcell(cx, cy, 0); currlayer->undoredo->SaveCellChange(cx, cy, oldstate, 0); } } else { if ((rand() % 100) < randomfill) { if (livestates < 2) { curralgo->setcell(cx, cy, 1); } else { curralgo->setcell(cx, cy, 1 + (rand() % livestates)); } } else if (killcells) { curralgo->setcell(cx, cy, 0); } } cntr++; if ((cntr % 4096) == 0) { abort = AbortProgress((double)cntr / maxcount, wxEmptyString); if (abort) break; } } if (abort) break; } currlayer->algo->endofpattern(); EndProgress(); if (savecells) currlayer->undoredo->RememberCellChanges(_("Random Fill"), currlayer->dirty); // update currlayer->dirty AFTER RememberCellChanges MarkLayerDirty(); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- bool Selection::FlipRect(bool topbottom, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int itop, int ileft, int ibottom, int iright) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; int v = 0; int cx, cy, newx, newy, newxinc, newyinc; if (topbottom) { BeginProgress(_("Flipping top-bottom")); newy = ibottom; newyinc = -1; newxinc = 1; } else { BeginProgress(_("Flipping left-right")); newy = itop; newyinc = 1; newxinc = -1; } for ( cy=itop; cy<=ibottom; cy++ ) { newx = topbottom ? ileft : iright; for ( cx=ileft; cx<=iright; cx++ ) { int skip = srcalgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; if (erasesrc) srcalgo->setcell(cx, cy, 0); newx += newxinc * skip; destalgo->setcell(newx, newy, v); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, wxEmptyString); if (abort) break; } newx += newxinc; } if (abort) break; newy += newyinc; } if (erasesrc) srcalgo->endofpattern(); destalgo->endofpattern(); EndProgress(); return !abort; } // ----------------------------------------------------------------------------- bool Selection::Flip(bool topbottom, bool inundoredo) { if (!exists) return false; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(topbottom ? ID_FLIPTB : ID_FLIPLR); return true; } if (topbottom) { if (seltop == selbottom) return true; } else { if (selleft == selright) return true; } if (currlayer->algo->isEmpty()) return true; bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); bigint stop = seltop; bigint sleft = selleft; bigint sbottom = selbottom; bigint sright = selright; bool simpleflip; if (Contains(top, left, bottom, right)) { // selection encloses entire pattern so we may only need to flip a smaller rectangle if (topbottom) { bigint tdiff = top; tdiff -= stop; bigint bdiff = sbottom; bdiff -= bottom; bigint mindiff = tdiff; if (bdiff < mindiff) mindiff = bdiff; stop += mindiff; sbottom -= mindiff; sleft = left; sright = right; } else { bigint ldiff = left; ldiff -= sleft; bigint rdiff = sright; rdiff -= right; bigint mindiff = ldiff; if (rdiff < mindiff) mindiff = rdiff; sleft += mindiff; sright -= mindiff; stop = top; sbottom = bottom; } simpleflip = true; } else { // selection encloses part of pattern so we can clip some selection edges // if they are outside the pattern edges if (topbottom) { if (sleft < left) sleft = left; if (sright > right) sright = right; } else { if (stop < top) stop = top; if (sbottom > bottom) sbottom = bottom; } simpleflip = false; } // can only use getcell/setcell in limited domain if ( viewptr->OutsideLimits(stop, sbottom, sleft, sright) ) { statusptr->ErrorMessage(selection_too_big); return false; } int itop = stop.toint(); int ileft = sleft.toint(); int ibottom = sbottom.toint(); int iright = sright.toint(); if (simpleflip) { // selection encloses all of pattern so we can flip into new universe // (must be same type) without killing live cells in selection lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); newalgo->setGeneration( currlayer->algo->getGeneration() ); if ( FlipRect(topbottom, currlayer->algo, newalgo, false, itop, ileft, ibottom, iright) ) { // switch to newalgo delete currlayer->algo; currlayer->algo = newalgo; mainptr->SetGenIncrement(); } else { // user aborted flip delete newalgo; return false; } } else { // flip into temporary universe and kill all live cells in selection; // if only 2 cell states then use qlife because its setcell/getcell calls are faster lifealgo* tempalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure temporary universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); if ( FlipRect(topbottom, currlayer->algo, tempalgo, true, itop, ileft, ibottom, iright) ) { // find pattern edges in temporary universe (could be much smaller) // and copy temporary pattern into current universe tempalgo->findedges(&top, &left, &bottom, &right); viewptr->CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), tempalgo, currlayer->algo, false, _("Adding flipped selection")); delete tempalgo; } else { // user aborted flip so flip tempalgo pattern back into current universe FlipRect(topbottom, tempalgo, currlayer->algo, false, itop, ileft, ibottom, iright); delete tempalgo; return false; } } // flips are always reversible so no need to use SaveCellChange and RememberCellChanges if (allowundo && !currlayer->stayclean && !inundoredo) { if (inscript) SavePendingChanges(); currlayer->undoredo->RememberFlip(topbottom, currlayer->dirty); } // update currlayer->dirty AFTER RememberFlip if (!inundoredo) MarkLayerDirty(); mainptr->UpdatePatternAndStatus(); return true; } // ----------------------------------------------------------------------------- const wxString rotate_clockwise = _("Rotating selection +90 degrees"); const wxString rotate_anticlockwise = _("Rotating selection -90 degrees"); bool Selection::RotateRect(bool clockwise, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int itop, int ileft, int ibottom, int iright, int ntop, int nleft, int nbottom, int nright) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; int cx, cy, newx, newy, newxinc, newyinc, v=0; if (clockwise) { BeginProgress(rotate_clockwise); newx = nright; newyinc = 1; newxinc = -1; } else { BeginProgress(rotate_anticlockwise); newx = nleft; newyinc = -1; newxinc = 1; } for ( cy=itop; cy<=ibottom; cy++ ) { newy = clockwise ? ntop : nbottom; for ( cx=ileft; cx<=iright; cx++ ) { int skip = srcalgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; if (erasesrc) srcalgo->setcell(cx, cy, 0); newy += newyinc * skip; destalgo->setcell(newx, newy, v); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, wxEmptyString); if (abort) break; } newy += newyinc; } if (abort) break; newx += newxinc; } if (erasesrc) srcalgo->endofpattern(); destalgo->endofpattern(); EndProgress(); return !abort; } // ----------------------------------------------------------------------------- bool Selection::RotatePattern(bool clockwise, bigint& newtop, bigint& newbottom, bigint& newleft, bigint& newright, bool inundoredo) { // create new universe of same type as current universe lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); // set same gen count newalgo->setGeneration( currlayer->algo->getGeneration() ); // copy all live cells to new universe, rotating the coords by +/- 90 degrees int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; int cx, cy, newx, newy, newxinc, newyinc, firstnewy, v=0; if (clockwise) { BeginProgress(rotate_clockwise); firstnewy = newtop.toint(); newx = newright.toint(); newyinc = 1; newxinc = -1; } else { BeginProgress(rotate_anticlockwise); firstnewy = newbottom.toint(); newx = newleft.toint(); newyinc = -1; newxinc = 1; } lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { newy = firstnewy; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; newy += newyinc * skip; newalgo->setcell(newx, newy, v); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, wxEmptyString); if (abort) break; } newy += newyinc; } if (abort) break; newx += newxinc; } newalgo->endofpattern(); EndProgress(); if (abort) { delete newalgo; } else { // rotate the selection edges seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; // switch to new universe and display results delete currlayer->algo; currlayer->algo = newalgo; mainptr->SetGenIncrement(); viewptr->DisplaySelectionSize(); // rotating entire pattern is easily reversible so no need to use // SaveCellChange and RememberCellChanges in this case if (allowundo && !currlayer->stayclean && !inundoredo) { if (inscript) SavePendingChanges(); currlayer->undoredo->RememberRotation(clockwise, currlayer->dirty); } // update currlayer->dirty AFTER RememberRotation if (!inundoredo) MarkLayerDirty(); mainptr->UpdatePatternAndStatus(); } return !abort; } // ----------------------------------------------------------------------------- bool Selection::Rotate(bool clockwise, bool inundoredo) { if (!exists) return false; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(clockwise ? ID_ROTATEC : ID_ROTATEA); return true; } // determine rotated selection edges bigint halfht = selbottom; halfht -= seltop; halfht.div2(); bigint halfwd = selright; halfwd -= selleft; halfwd.div2(); bigint midy = seltop; midy += halfht; bigint midx = selleft; midx += halfwd; bigint newtop = midy; newtop += selleft; newtop -= midx; bigint newbottom = midy; newbottom += selright; newbottom -= midx; bigint newleft = midx; newleft += seltop; newleft -= midy; bigint newright = midx; newright += selbottom; newright -= midy; if (!inundoredo) { // check if rotated selection edges are outside bounded grid if ( (currlayer->algo->gridwd > 0 && (newleft < currlayer->algo->gridleft || newright > currlayer->algo->gridright)) || (currlayer->algo->gridht > 0 && (newtop < currlayer->algo->gridtop || newbottom > currlayer->algo->gridbottom)) ) { statusptr->ErrorMessage(_("New selection would be outside grid boundary.")); return false; } } // if there is no pattern then just rotate the selection edges if (currlayer->algo->isEmpty()) { viewptr->SaveCurrentSelection(); seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; viewptr->RememberNewSelection(_("Rotation")); viewptr->DisplaySelectionSize(); mainptr->UpdatePatternAndStatus(); return true; } // if the current selection and the rotated selection are both outside the // pattern edges (ie. both are empty) then just rotate the selection edges bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( (seltop > bottom || selbottom < top || selleft > right || selright < left) && (newtop > bottom || newbottom < top || newleft > right || newright < left) ) { viewptr->SaveCurrentSelection(); seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; viewptr->RememberNewSelection(_("Rotation")); viewptr->DisplaySelectionSize(); mainptr->UpdatePatternAndStatus(); return true; } // can only use nextcell/getcell/setcell in limited domain if (TooBig()) { statusptr->ErrorMessage(selection_too_big); return false; } // make sure rotated selection edges are also within limits if ( viewptr->OutsideLimits(newtop, newbottom, newleft, newright) ) { statusptr->ErrorMessage(_("New selection would be outside +/- 10^9 boundary.")); return false; } // use faster method if selection encloses entire pattern if (Contains(top, left, bottom, right)) { return RotatePattern(clockwise, newtop, newbottom, newleft, newright, inundoredo); } int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); int ntop = newtop.toint(); int nleft = newleft.toint(); int nbottom = newbottom.toint(); int nright = newright.toint(); // save cell changes if undo/redo is enabled and script isn't constructing a pattern // and we're not undoing/redoing an earlier rotation bool savecells = allowundo && !currlayer->stayclean && !inundoredo; if (savecells && inscript) SavePendingChanges(); lifealgo* oldalgo = NULL; int otop = itop; int oleft = ileft; int obottom = ibottom; int oright = iright; if (savecells) { // copy current pattern to oldalgo using union of old and new selection rects if (otop > ntop) otop = ntop; if (oleft > nleft) oleft = nleft; if (obottom < nbottom) obottom = nbottom; if (oright < nright) oright = nright; oldalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (oldalgo->setrule(currlayer->algo->getrule())) oldalgo->setrule(oldalgo->DefaultRule()); if ( !viewptr->CopyRect(otop, oleft, obottom, oright, currlayer->algo, oldalgo, false, _("Saving part of pattern")) ) { delete oldalgo; return false; } } // create temporary universe; doesn't need to match current universe so // if only 2 cell states then use qlife because its setcell/getcell calls are faster lifealgo* tempalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure temporary universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); // copy (and kill) live cells in selection to temporary universe, // rotating the new coords by +/- 90 degrees if ( !RotateRect(clockwise, currlayer->algo, tempalgo, true, itop, ileft, ibottom, iright, ntop, nleft, nbottom, nright) ) { // user aborted rotation if (savecells) { // use oldalgo to restore erased selection viewptr->CopyRect(itop, ileft, ibottom, iright, oldalgo, currlayer->algo, false, _("Restoring selection")); delete oldalgo; } else { // restore erased selection by rotating tempalgo in opposite direction // back into the current universe RotateRect(!clockwise, tempalgo, currlayer->algo, false, ntop, nleft, nbottom, nright, itop, ileft, ibottom, iright); } delete tempalgo; mainptr->UpdatePatternAndStatus(); return false; } // copy rotated selection from temporary universe to current universe; // check if new selection rect is outside modified pattern edges currlayer->algo->findedges(&top, &left, &bottom, &right); if ( newtop > bottom || newbottom < top || newleft > right || newright < left ) { // safe to use fast nextcell calls viewptr->CopyRect(ntop, nleft, nbottom, nright, tempalgo, currlayer->algo, false, _("Adding rotated selection")); } else { // have to use slow getcell calls viewptr->CopyAllRect(ntop, nleft, nbottom, nright, tempalgo, currlayer->algo, _("Pasting rotated selection")); } // don't need temporary universe any more delete tempalgo; // rotate the selection edges seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; if (savecells) { // compare patterns in oldalgo and currlayer->algo and call SaveCellChange // for each cell that has a different state if ( SaveDifferences(oldalgo, currlayer->algo, otop, oleft, obottom, oright) ) { Selection oldsel(itop, ileft, ibottom, iright); Selection newsel(ntop, nleft, nbottom, nright); currlayer->undoredo->RememberRotation(clockwise, oldsel, newsel, currlayer->dirty); } else { currlayer->undoredo->ForgetCellChanges(); Warning(_("You can't undo this change!")); } delete oldalgo; } // display results viewptr->DisplaySelectionSize(); if (!inundoredo) MarkLayerDirty(); mainptr->UpdatePatternAndStatus(); return true; } golly-2.5-src/gui-wx/wxstatus.cpp0000644000175100001440000005175512156145314014056 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/dcbuffer.h" // for wxBufferedPaintDC #include "bigint.h" #include "lifealgo.h" #include "wxgolly.h" // for wxGetApp, etc #include "wxutils.h" // for Fatal, Beep, FillRect #include "wxprefs.h" // for mindelay, maxdelay, etc #include "wxview.h" // for viewptr->... #include "wxmain.h" // for mainptr->... #include "wxscript.h" // for inscript #include "wxalgos.h" // for algoinfo #include "wxlayer.h" // for currlayer #include "wxtimeline.h" // for TimelineExists #include "wxstatus.h" // ----------------------------------------------------------------------------- // the following is a bit messy but gives good results on all platforms const int LINEHT = 14; // distance between each baseline const int DESCHT = 4; // descender height const int STATUS_HT = 2*LINEHT+DESCHT; // normal status bar height const int STATUS_EXHT = 7*LINEHT+DESCHT; // height when showing exact numbers const int BASELINE1 = LINEHT-2; // baseline of 1st line const int BOTGAP = 6; // to get baseline of message line // these baseline values are used when showexact is true const int GENLINE = 1*LINEHT-2; const int POPLINE = 2*LINEHT-2; const int SCALELINE = 3*LINEHT-2; const int STEPLINE = 4*LINEHT-2; const int XLINE = 5*LINEHT-2; const int YLINE = 6*LINEHT-2; // these horizontal offets are used when showexact is true int h_x_ex, h_y_ex; #ifdef __WXMAC__ // gray line at bottom of status bar (matches line at bottom of OS X title bar) wxPen linepen(wxColor(140,140,140)); #endif // ----------------------------------------------------------------------------- void StatusBar::ClearMessage() { if (inscript) return; // let script control messages if (viewptr->waitingforclick) return; // don't clobber message if (statusmsg.IsEmpty()) return; // no need to clear message statusmsg.Clear(); if (statusht > 0) { int wd, ht; GetClientSize(&wd, &ht); if (wd > 0 && ht > 0) { // update bottom line wxRect r = wxRect(wxPoint(0,statusht-BOTGAP+DESCHT-LINEHT), wxPoint(wd-1,ht-1) ); Refresh(false, &r); // nicer not to call Update() here otherwise users can see different // colored bands in status bar when changing algos } } } // ----------------------------------------------------------------------------- void StatusBar::DisplayMessage(const wxString& s) { if (inscript) return; // let script control messages statusmsg = s; if (statusht > 0) { int wd, ht; GetClientSize(&wd, &ht); if (wd > 0 && ht > 0) { // update bottom line wxRect r = wxRect( wxPoint(0,statusht-BOTGAP+DESCHT-LINEHT), wxPoint(wd-1,ht-1) ); Refresh(false, &r); // show message immediately Update(); } } } // ----------------------------------------------------------------------------- void StatusBar::ErrorMessage(const wxString& s) { if (inscript) return; // let script control messages Beep(); DisplayMessage(s); } // ----------------------------------------------------------------------------- void StatusBar::SetMessage(const wxString& s) { if (inscript) return; // let script control messages // set message string without displaying it statusmsg = s; } // ----------------------------------------------------------------------------- void StatusBar::UpdateXYLocation() { int wd, ht; GetClientSize(&wd, &ht); if (wd > h_xy && ht > 0) { wxRect r; if (showexact) r = wxRect( wxPoint(0, XLINE+DESCHT-LINEHT), wxPoint(wd-1, YLINE+DESCHT) ); else r = wxRect( wxPoint(h_xy, 0), wxPoint(wd-1, BASELINE1+DESCHT) ); Refresh(false, &r); // no need to Update() immediately } } // ----------------------------------------------------------------------------- void StatusBar::CheckMouseLocation(bool active) { if (statusht == 0 && !inscript) return; if ( !active ) { // main window is not in front so clear XY location showxy = false; if (statusht > 0) UpdateXYLocation(); if (inscript) mousepos = wxEmptyString; return; } // may need to update XY location in status bar bigint xpos, ypos; if ( viewptr->GetCellPos(xpos, ypos) ) { if ( xpos != currx || ypos != curry ) { // show new XY location currx = xpos; curry = ypos; showxy = true; if (statusht > 0) UpdateXYLocation(); } else if (!showxy) { showxy = true; if (statusht > 0) UpdateXYLocation(); } if (inscript) { mousepos = wxString(xpos.tostring('\0'), wxConvLocal); mousepos += wxT(" "); mousepos += wxString(ypos.tostring('\0'), wxConvLocal); } } else { // outside viewport so clear XY location showxy = false; if (statusht > 0) UpdateXYLocation(); if (inscript) mousepos = wxEmptyString; } } // ----------------------------------------------------------------------------- void StatusBar::SetStatusFont(wxDC& dc) { dc.SetFont(*statusfont); dc.SetTextForeground(*wxBLACK); dc.SetBrush(*wxBLACK_BRUSH); dc.SetBackgroundMode(wxTRANSPARENT); } // ----------------------------------------------------------------------------- void StatusBar::DisplayText(wxDC& dc, const wxString& s, wxCoord x, wxCoord y) { // DrawText's y parameter is top of text box but we pass in baseline // so adjust by textascent which depends on platform and OS version -- yuk! dc.DrawText(s, x, y - textascent); } // ----------------------------------------------------------------------------- wxString StatusBar::Stringify(const bigint& b) { static char buf[32]; char* p = buf; double d = b.toscinot(); if ( fabs(d) < 10.0 ) { // show exact value with commas inserted for readability d = b.todouble(); if ( d < 0 ) { d = - d; *p++ = '-'; } sprintf(p, "%.f", d); int len = (int)strlen(p); int commas = ((len + 2) / 3) - 1; int dest = len + commas; int src = len; p[dest] = 0; while (commas > 0) { p[--dest] = p[--src]; p[--dest] = p[--src]; p[--dest] = p[--src]; p[--dest] = ','; commas--; } if ( p[-1] == '-' ) p--; } else { // use e notation for abs value > 10^9 (agrees with min & max_coord) const char * sign = ""; if (d < 0) { sign = "-"; d = 0.0 - d; } double exp = floor(d); d = (d - exp) * 10.0; exp = exp - 1.0; // UI has been set up to accomodate "9.999999e+999" // which is the same width as "9.9999999e+99", etc. if (exp < 100.0) { // two-digit exponent sprintf(p, "%s%9.7fe+%.0f", sign, d, exp); // 9.9999999e+99 } else if (exp < 1000.0) { sprintf(p, "%s%8.6fe+%.0f", sign, d, exp); // 9.999999e+999 } else if (exp < 10000.0) { sprintf(p, "%s%7.5fe+%.0f", sign, d, exp); // 9.99999e+9999 } else if (exp < 100000.0) { sprintf(p, "%s%6.4fe+%.0f", sign, d, exp); // 9.9999e+99999 } else { // for 6-digit exponent or larger we'll just always show a "d.ddd" // mantissa. 7-digit exponent appears unattainable at the present // time (late 2011) sprintf(p, "%s%5.3fe+%.0f", sign, d, exp); } } return wxString(p, wxConvLocal); } // ----------------------------------------------------------------------------- int StatusBar::GetCurrentDelay() { int gendelay = mindelay * (1 << (-currlayer->currexpo - 1)); if (gendelay > maxdelay) gendelay = maxdelay; return gendelay; } // ----------------------------------------------------------------------------- void StatusBar::DrawStatusBar(wxDC& dc, wxRect& updaterect) { int wd, ht; GetClientSize(&wd, &ht); if (wd < 1 || ht < 1) return; wxRect r = wxRect(0, 0, wd, ht); FillRect(dc, r, *(algoinfo[currlayer->algtype]->statusbrush)); #if defined(__WXMSW__) // draw gray lines at top and left edges dc.SetPen(*wxGREY_PEN); dc.DrawLine(0, 0, r.width, 0); dc.DrawLine(0, 0, 0, r.height); // don't draw right edge on XP // dc.DrawLine(r.GetRight(), 0, r.GetRight(), r.height); #elif defined(__WXMAC__) // draw gray line at bottom edge dc.SetPen(linepen); dc.DrawLine(0, r.GetBottom(), r.width, r.GetBottom()); #else // draw gray line at bottom edge dc.SetPen(*wxLIGHT_GREY_PEN); dc.DrawLine(0, r.GetBottom(), r.width, r.GetBottom()); #endif dc.SetPen(wxNullPen); // must be here rather than in StatusBar::OnPaint; it looks like // some call resets the font SetStatusFont(dc); wxString strbuf; if (updaterect.y >= statusht-BOTGAP+DESCHT-LINEHT) { // only show possible message in bottom line -- see below } else if (showexact) { // might only need to display X and Y lines if (updaterect.y < XLINE+DESCHT-LINEHT) { strbuf = _("Generation = "); if (viewptr->nopattupdate) { strbuf += _("0"); } else { strbuf += wxString(currlayer->algo->getGeneration().tostring(), wxConvLocal); } DisplayText(dc, strbuf, h_gen, GENLINE); strbuf = _("Population = "); if (viewptr->nopattupdate) { strbuf += _("0"); } else { bigint popcount = currlayer->algo->getPopulation(); if (popcount.sign() < 0) { // getPopulation returns -1 if it can't be calculated strbuf += _("?"); } else { strbuf += wxString(popcount.tostring(), wxConvLocal); } } DisplayText(dc, strbuf, h_gen, POPLINE); // no need to show scale as an exact number if (viewptr->GetMag() < 0) { strbuf.Printf(_("Scale = 2^%d:1"), -viewptr->GetMag()); } else { strbuf.Printf(_("Scale = 1:%d"), 1 << viewptr->GetMag()); } DisplayText(dc, strbuf, h_gen, SCALELINE); if (currlayer->currexpo < 0) { // show delay in secs strbuf.Printf(_("Delay = %gs"), (double)GetCurrentDelay() / 1000.0); } else { // no real need to show step as an exact number strbuf.Printf(_("Step = %d^%d"), currlayer->currbase, currlayer->currexpo); } DisplayText(dc, strbuf, h_gen, STEPLINE); } DisplayText(dc, _("X ="), h_gen, XLINE); DisplayText(dc, _("Y ="), h_gen, YLINE); if (showxy) { bigint xo, yo; bigint xpos = currx; xpos -= currlayer->originx; bigint ypos = curry; ypos -= currlayer->originy; if (mathcoords) { // Y values increase upwards bigint temp = 0; temp -= ypos; ypos = temp; } DisplayText(dc, wxString(xpos.tostring(), wxConvLocal), h_x_ex, XLINE); DisplayText(dc, wxString(ypos.tostring(), wxConvLocal), h_y_ex, YLINE); } } else { // showexact is false so show info in top line if (updaterect.x < h_xy) { // show all info strbuf = _("Generation="); if (viewptr->nopattupdate) { strbuf += _("0"); } else { strbuf += Stringify(currlayer->algo->getGeneration()); } DisplayText(dc, strbuf, h_gen, BASELINE1); strbuf = _("Population="); if (viewptr->nopattupdate) { strbuf += _("0"); } else { bigint popcount = currlayer->algo->getPopulation(); if (popcount.sign() < 0) { // getPopulation returns -1 if it can't be calculated strbuf += _("?"); } else { strbuf += Stringify(popcount); } } DisplayText(dc, strbuf, h_pop, BASELINE1); if (viewptr->GetMag() < 0) { strbuf.Printf(_("Scale=2^%d:1"), -viewptr->GetMag()); } else { strbuf.Printf(_("Scale=1:%d"), 1 << viewptr->GetMag()); } DisplayText(dc, strbuf, h_scale, BASELINE1); if (currlayer->currexpo < 0) { // show delay in secs strbuf.Printf(_("Delay=%gs"), (double)GetCurrentDelay() / 1000.0); } else { strbuf.Printf(_("Step=%d^%d"), currlayer->currbase, currlayer->currexpo); } DisplayText(dc, strbuf, h_step, BASELINE1); } strbuf = _("XY="); if (showxy) { bigint xo, yo; bigint xpos = currx; xpos -= currlayer->originx; bigint ypos = curry; ypos -= currlayer->originy; if (mathcoords) { // Y values increase upwards bigint temp = 0; temp -= ypos; ypos = temp; } strbuf += Stringify(xpos); strbuf += wxT(" "); strbuf += Stringify(ypos); } DisplayText(dc, strbuf, h_xy, BASELINE1); } if (!statusmsg.IsEmpty()) { // display status message on bottom line DisplayText(dc, statusmsg, h_gen, statusht - BOTGAP); } } // ----------------------------------------------------------------------------- // event table and handlers: BEGIN_EVENT_TABLE(StatusBar, wxWindow) EVT_PAINT (StatusBar::OnPaint) EVT_LEFT_DOWN (StatusBar::OnMouseDown) EVT_LEFT_DCLICK (StatusBar::OnMouseDown) EVT_ERASE_BACKGROUND (StatusBar::OnEraseBackground) END_EVENT_TABLE() // ----------------------------------------------------------------------------- void StatusBar::OnPaint(wxPaintEvent& WXUNUSED(event)) { #if defined(__WXMAC__) || defined(__WXGTK__) // windows on Mac OS X and GTK+ 2.0 are automatically buffered wxPaintDC dc(this); #else // use wxWidgets buffering to avoid flicker int wd, ht; GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; if (wd != statbitmapwd || ht != statbitmapht) { // need to create a new bitmap for status bar delete statbitmap; statbitmap = new wxBitmap(wd, ht); statbitmapwd = wd; statbitmapht = ht; } if (statbitmap == NULL) Fatal(_("Not enough memory to render status bar!")); wxBufferedPaintDC dc(this, *statbitmap); #endif wxRect updaterect = GetUpdateRegion().GetBox(); DrawStatusBar(dc, updaterect); } // ----------------------------------------------------------------------------- bool StatusBar::ClickInGenBox(int x, int y) { if (showexact) return x >= 0 && y > (GENLINE+DESCHT-LINEHT) && y <= (GENLINE+DESCHT); else return x >= h_gen && x <= h_pop - 20 && y <= (BASELINE1+DESCHT); } // ----------------------------------------------------------------------------- bool StatusBar::ClickInScaleBox(int x, int y) { if (showexact) return x >= 0 && y > (SCALELINE+DESCHT-LINEHT) && y <= (SCALELINE+DESCHT); else return x >= h_scale && x <= h_step - 20 && y <= (BASELINE1+DESCHT); } // ----------------------------------------------------------------------------- bool StatusBar::ClickInStepBox(int x, int y) { if (showexact) return x >= 0 && y > (STEPLINE+DESCHT-LINEHT) && y <= (STEPLINE+DESCHT); else return x >= h_step && x <= h_xy - 20 && y <= (BASELINE1+DESCHT); } // ----------------------------------------------------------------------------- void StatusBar::OnMouseDown(wxMouseEvent& event) { if (inscript) return; // let script control scale and step ClearMessage(); if ( ClickInGenBox(event.GetX(), event.GetY()) && !mainptr->generating ) { if (TimelineExists()) { ErrorMessage(_("You can't change the generation count if there is a timeline.")); } else { mainptr->SetGeneration(); } } else if ( ClickInScaleBox(event.GetX(), event.GetY()) ) { if (viewptr->GetMag() != 0) { // reset scale to 1:1 viewptr->SetMag(0); } } else if ( ClickInStepBox(event.GetX(), event.GetY()) ) { if (TimelineExists()) { ErrorMessage(_("You can't change the step size if there is a timeline.")); } else if (currlayer->currbase != algoinfo[currlayer->algtype]->defbase || currlayer->currexpo != 0) { // reset base step to default value and step exponent to 0 currlayer->currbase = algoinfo[currlayer->algtype]->defbase; mainptr->SetStepExponent(0); // update status bar Refresh(false); Update(); } } } // ----------------------------------------------------------------------------- void StatusBar::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) { // do nothing because we'll be painting the entire status bar } // ----------------------------------------------------------------------------- // create the status bar window StatusBar::StatusBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht) : wxWindow(parent, wxID_ANY, wxPoint(xorg,yorg), wxSize(wd,ht), wxNO_BORDER | wxFULL_REPAINT_ON_RESIZE) { // avoid erasing background on GTK+ SetBackgroundStyle(wxBG_STYLE_CUSTOM); // create font for text in status bar and set textascent for use in DisplayText #ifdef __WXMSW__ // use smaller, narrower font on Windows statusfont = wxFont::New(8, wxDEFAULT, wxNORMAL, wxNORMAL); int major, minor; wxGetOsVersion(&major, &minor); if ( major > 5 || (major == 5 && minor >= 1) ) { // 5.1+ means XP or later (Vista or later if major >= 6) textascent = 11; } else { textascent = 10; } #elif defined(__WXGTK__) // use smaller font on GTK statusfont = wxFont::New(8, wxMODERN, wxNORMAL, wxNORMAL); textascent = 11; #elif defined(__WXOSX_COCOA__) // we need to specify facename to get Monaco instead of Courier statusfont = wxFont::New(10, wxMODERN, wxNORMAL, wxNORMAL, false, wxT("Monaco")); textascent = 10; #else // __WXMAC__ statusfont = wxFont::New(10, wxMODERN, wxNORMAL, wxNORMAL); textascent = 10; #endif if (statusfont == NULL) Fatal(_("Failed to create status bar font!")); // determine horizontal offsets for info in status bar wxClientDC dc(this); int textwd, textht; int mingap = 10; SetStatusFont(dc); h_gen = 6; // when showexact is false: dc.GetTextExtent(_("Generation=9.999999e+999"), &textwd, &textht); h_pop = h_gen + textwd + mingap; dc.GetTextExtent(_("Population=9.999999e+999"), &textwd, &textht); h_scale = h_pop + textwd + mingap; dc.GetTextExtent(_("Scale=2^9999:1"), &textwd, &textht); h_step = h_scale + textwd + mingap; dc.GetTextExtent(_("Step=1000000000^9"), &textwd, &textht); h_xy = h_step + textwd + mingap; // when showexact is true: dc.GetTextExtent(_("X = "), &textwd, &textht); h_x_ex = h_gen + textwd; dc.GetTextExtent(_("Y = "), &textwd, &textht); h_y_ex = h_gen + textwd; statusht = ht; showxy = false; statbitmap = NULL; statbitmapwd = -1; statbitmapht = -1; statusmsg.Clear(); } // ----------------------------------------------------------------------------- StatusBar::~StatusBar() { delete statusfont; delete statbitmap; } golly-2.5-src/gui-wx/wxtimeline.cpp0000644000175100001440000010426212156145314014331 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #if wxUSE_TOOLTIPS #include "wx/tooltip.h" // for wxToolTip #endif #include "wx/dcbuffer.h" // for wxBufferedPaintDC #include "bigint.h" #include "lifealgo.h" #include "wxgolly.h" // for viewptr, statusptr, mainptr #include "wxmain.h" // for mainptr->... #include "wxutils.h" // for Warning, etc #include "wxprefs.h" // for showtimeline, etc #include "wxstatus.h" // for statusptr->... #include "wxscript.h" // for inscript #include "wxview.h" // for viewptr->... #include "wxlayer.h" // for currlayer #include "wxtimeline.h" #ifdef __WXMSW__ // bitmaps are loaded via .rc file #else // bitmaps for timeline bar buttons #include "bitmaps/record.xpm" #include "bitmaps/stop.xpm" #include "bitmaps/backwards.xpm" #include "bitmaps/forwards.xpm" #include "bitmaps/stopplay.xpm" #include "bitmaps/deltime.xpm" #endif // ----------------------------------------------------------------------------- // Define timeline bar window: enum { // ids for bitmap buttons in timeline bar RECORD_BUTT = 0, STOPREC_BUTT, BACKWARDS_BUTT, FORWARDS_BUTT, STOPPLAY_BUTT, DELETE_BUTT, NUM_BUTTONS, // must be after all buttons ID_SLIDER, // for slider ID_SCROLL // for scroll bar }; // derive from wxPanel so we get current theme's background color on Windows class TimelineBar : public wxPanel { public: TimelineBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht); ~TimelineBar(); void AddButton(int id, const wxString& tip); void AddSeparator(); void EnableButton(int id, bool enable); void UpdateButtons(); void UpdateSlider(); void UpdateScrollBar(); void DisplayCurrentFrame(); // detect press and release of a bitmap button void OnButtonDown(wxMouseEvent& event); void OnButtonUp(wxMouseEvent& event); void OnKillFocus(wxFocusEvent& event); wxSlider* slider; // slider for controlling autoplay speed wxScrollBar* framebar; // scroll bar for displaying timeline frames // positioning data used by AddButton and AddSeparator int ypos, xpos, smallgap, biggap; private: // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() // event handlers void OnPaint(wxPaintEvent& event); void OnMouseDown(wxMouseEvent& event); void OnButton(wxCommandEvent& event); void OnSlider(wxScrollEvent& event); void OnScroll(wxScrollEvent& event); void SetTimelineFont(wxDC& dc); void DisplayText(wxDC& dc, const wxString& s, wxCoord x, wxCoord y); void DrawTimelineBar(wxDC& dc, int wd, int ht); // bitmaps for normal buttons wxBitmap normbutt[NUM_BUTTONS]; #ifdef __WXMSW__ // on Windows we need bitmaps for disabled buttons wxBitmap disnormbutt[NUM_BUTTONS]; #endif // remember state of buttons to avoid unnecessary updates int buttstate[NUM_BUTTONS]; wxBitmap* timelinebitmap; // timeline bar bitmap int timelinebitmapwd; // width of timeline bar bitmap int timelinebitmapht; // height of timeline bar bitmap int digitwd; // width of digit in timeline bar font int digitht; // height of digit in timeline bar font int textascent; // vertical adjustment used in DrawText calls wxFont* timelinefont; // timeline bar font }; BEGIN_EVENT_TABLE(TimelineBar, wxPanel) EVT_PAINT ( TimelineBar::OnPaint) EVT_LEFT_DOWN ( TimelineBar::OnMouseDown) EVT_BUTTON (wxID_ANY, TimelineBar::OnButton) EVT_COMMAND_SCROLL (ID_SLIDER, TimelineBar::OnSlider) EVT_COMMAND_SCROLL (ID_SCROLL, TimelineBar::OnScroll) END_EVENT_TABLE() // ----------------------------------------------------------------------------- static TimelineBar* tbarptr = NULL; // global pointer to timeline bar static int mindelpos; // minimum x position of DELETE_BUTT const int TBARHT = 32; // height of timeline bar const int SCROLLHT = 17; // height of scroll bar const int PAGESIZE = 10; // scroll amount when paging const int MINSPEED = -10; // minimum autoplay speed const int MAXSPEED = 10; // maximum autoplay speed // width and height of bitmap buttons #if defined(__WXOSX_COCOA__) || defined(__WXGTK__) const int BUTTON_WD = 28; const int BUTTON_HT = 28; #else const int BUTTON_WD = 24; const int BUTTON_HT = 24; #endif // timeline bar buttons (must be global to use Connect/Disconnect on Windows) static wxBitmapButton* tlbutt[NUM_BUTTONS]; // ----------------------------------------------------------------------------- TimelineBar::TimelineBar(wxWindow* parent, wxCoord xorg, wxCoord yorg, int wd, int ht) : wxPanel(parent, wxID_ANY, wxPoint(xorg,yorg), wxSize(wd,ht), wxNO_FULL_REPAINT_ON_RESIZE) { #ifdef __WXGTK__ // avoid erasing background on GTK+ SetBackgroundStyle(wxBG_STYLE_CUSTOM); #endif // init bitmaps for normal state normbutt[RECORD_BUTT] = wxBITMAP(record); normbutt[STOPREC_BUTT] = wxBITMAP(stop); normbutt[BACKWARDS_BUTT] = wxBITMAP(backwards); normbutt[FORWARDS_BUTT] = wxBITMAP(forwards); normbutt[STOPPLAY_BUTT] = wxBITMAP(stopplay); normbutt[DELETE_BUTT] = wxBITMAP(deltime); #ifdef __WXMSW__ for (int i = 0; i < NUM_BUTTONS; i++) { CreatePaleBitmap(normbutt[i], disnormbutt[i]); } #endif for (int i = 0; i < NUM_BUTTONS; i++) { buttstate[i] = 0; } // init position variables used by AddButton and AddSeparator #ifdef __WXGTK__ // buttons are a different size in wxGTK xpos = 2; ypos = 2; smallgap = 6; #else xpos = 4; ypos = (32 - BUTTON_HT) / 2; smallgap = 4; #endif biggap = 16; // add buttons AddButton(RECORD_BUTT, _("Start recording")); AddSeparator(); AddButton(BACKWARDS_BUTT, _("Play backwards")); AddButton(FORWARDS_BUTT, _("Play forwards")); // create font for text in timeline bar and set textascent for use in DisplayText #ifdef __WXMSW__ // use smaller, narrower font on Windows timelinefont = wxFont::New(8, wxDEFAULT, wxNORMAL, wxNORMAL); int major, minor; wxGetOsVersion(&major, &minor); if ( major > 5 || (major == 5 && minor >= 1) ) { // 5.1+ means XP or later (Vista if major >= 6) textascent = 11; } else { textascent = 10; } #elif defined(__WXGTK__) // use smaller font on GTK timelinefont = wxFont::New(8, wxMODERN, wxNORMAL, wxNORMAL); textascent = 11; #elif defined(__WXOSX_COCOA__) // we need to specify facename to get Monaco instead of Courier timelinefont = wxFont::New(10, wxMODERN, wxNORMAL, wxNORMAL, false, wxT("Monaco")); textascent = 10; #elif defined(__WXMAC__) timelinefont = wxFont::New(10, wxMODERN, wxNORMAL, wxNORMAL); textascent = 10; #else timelinefont = wxFont::New(10, wxMODERN, wxNORMAL, wxNORMAL); textascent = 10; #endif if (timelinefont == NULL) Fatal(_("Failed to create timeline bar font!")); wxClientDC dc(this); SetTimelineFont(dc); dc.GetTextExtent(_("9"), &digitwd, &digitht); digitht -= 4; timelinebitmap = NULL; timelinebitmapwd = -1; timelinebitmapht = -1; // add slider int x, y; int sliderwd = 80; #ifdef __WXMAC__ int sliderht = 15; #else int sliderht = 24; // for Windows and wxGTK #endif x = xpos + 20 - smallgap; y = (TBARHT - (sliderht + 1)) / 2; slider = new wxSlider(this, ID_SLIDER, 0, MINSPEED, MAXSPEED, wxPoint(x, y), wxSize(sliderwd, sliderht), wxSL_HORIZONTAL); if (slider == NULL) Fatal(_("Failed to create timeline slider!")); #ifdef __WXMAC__ slider->SetWindowVariant(wxWINDOW_VARIANT_SMALL); slider->Move(x, y+1); #endif xpos = x + sliderwd; // add scroll bar int scrollbarwd = 60; // minimum width (ResizeTimelineBar will alter it) #ifdef __WXMAC__ int scrollbarht = 15; // must be this height on Mac #else int scrollbarht = SCROLLHT; #endif x = xpos + 20; y = (TBARHT - (scrollbarht + 1)) / 2; framebar = new wxScrollBar(this, ID_SCROLL, wxPoint(x, y), wxSize(scrollbarwd, scrollbarht), wxSB_HORIZONTAL); if (framebar == NULL) Fatal(_("Failed to create timeline scroll bar!")); xpos = x + scrollbarwd + 4; mindelpos = xpos; AddButton(DELETE_BUTT, _("Delete timeline")); // ResizeTimelineBar will move this button to right end of scroll bar } // ----------------------------------------------------------------------------- TimelineBar::~TimelineBar() { delete timelinefont; delete timelinebitmap; delete slider; delete framebar; } // ----------------------------------------------------------------------------- void TimelineBar::SetTimelineFont(wxDC& dc) { dc.SetFont(*timelinefont); dc.SetTextForeground(*wxBLACK); dc.SetBrush(*wxBLACK_BRUSH); dc.SetBackgroundMode(wxTRANSPARENT); } // ----------------------------------------------------------------------------- void TimelineBar::DisplayText(wxDC& dc, const wxString& s, wxCoord x, wxCoord y) { // DrawText's y parameter is top of text box but we pass in baseline // so adjust by textascent which depends on platform and OS version -- yuk! dc.DrawText(s, x, y - textascent); } // ----------------------------------------------------------------------------- void TimelineBar::DrawTimelineBar(wxDC& dc, int wd, int ht) { wxRect r = wxRect(0, 0, wd, ht); #ifdef __WXMAC__ wxBrush brush(wxColor(202,202,202)); FillRect(dc, r, brush); #endif #ifdef __WXMSW__ // use theme background color on Windows wxBrush brush(GetBackgroundColour()); FillRect(dc, r, brush); #endif // draw gray border line at top edge #if defined(__WXMSW__) dc.SetPen(*wxGREY_PEN); #elif defined(__WXMAC__) wxPen linepen(wxColor(140,140,140)); dc.SetPen(linepen); #else dc.SetPen(*wxLIGHT_GREY_PEN); #endif dc.DrawLine(0, 0, r.width, 0); dc.SetPen(wxNullPen); if (currlayer->algo->hyperCapable()) { bool canplay = TimelineExists() && !currlayer->algo->isrecording(); tlbutt[RECORD_BUTT]->Show(true); tlbutt[BACKWARDS_BUTT]->Show(canplay); tlbutt[FORWARDS_BUTT]->Show(canplay); tlbutt[DELETE_BUTT]->Show(canplay); slider->Show(canplay); framebar->Show(canplay); if (currlayer->algo->isrecording()) { // show number of frames recorded so far SetTimelineFont(dc); dc.SetPen(*wxBLACK_PEN); int x = smallgap + BUTTON_WD + 10; int y = TBARHT - 8; wxString str; str.Printf(_("Frames recorded: %d"), currlayer->algo->getframecount()); DisplayText(dc, str, x, y - (SCROLLHT - digitht)/2); dc.SetPen(wxNullPen); } } else { tlbutt[RECORD_BUTT]->Show(false); tlbutt[BACKWARDS_BUTT]->Show(false); tlbutt[FORWARDS_BUTT]->Show(false); tlbutt[DELETE_BUTT]->Show(false); slider->Show(false); framebar->Show(false); SetTimelineFont(dc); dc.SetPen(*wxBLACK_PEN); int x = 6; int y = TBARHT - 8; DisplayText(dc, _("The current algorithm does not support timelines."), x, y - (SCROLLHT - digitht)/2); dc.SetPen(wxNullPen); } } // ----------------------------------------------------------------------------- void TimelineBar::OnPaint(wxPaintEvent& WXUNUSED(event)) { int wd, ht; GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; #if defined(__WXMAC__) || defined(__WXGTK__) // windows on Mac OS X and GTK+ 2.0 are automatically buffered wxPaintDC dc(this); #else // use wxWidgets buffering to avoid flicker if (wd != timelinebitmapwd || ht != timelinebitmapht) { // need to create a new bitmap for timeline bar delete timelinebitmap; timelinebitmap = new wxBitmap(wd, ht); timelinebitmapwd = wd; timelinebitmapht = ht; } if (timelinebitmap == NULL) Fatal(_("Not enough memory to render timeline bar!")); wxBufferedPaintDC dc(this, *timelinebitmap); #endif if (showtimeline) DrawTimelineBar(dc, wd, ht); } // ----------------------------------------------------------------------------- void TimelineBar::OnMouseDown(wxMouseEvent& WXUNUSED(event)) { // on Win/Linux we need to reset keyboard focus to viewport window viewptr->SetFocus(); mainptr->showbanner = false; statusptr->ClearMessage(); } // ----------------------------------------------------------------------------- void TimelineBar::OnButton(wxCommandEvent& event) { #ifdef __WXMAC__ // close any open tool tip window (fixes wxMac bug?) wxToolTip::RemoveToolTips(); #endif mainptr->showbanner = false; statusptr->ClearMessage(); int id = event.GetId(); int cmdid; switch (id) { case RECORD_BUTT: cmdid = ID_RECORD; break; case BACKWARDS_BUTT: PlayTimeline(-1); return; case FORWARDS_BUTT: PlayTimeline(1); return; case DELETE_BUTT: cmdid = ID_DELTIME; break; default: Warning(_("Unexpected button id!")); return; } // call MainFrame::OnMenu after OnButton finishes wxCommandEvent cmdevt(wxEVT_COMMAND_MENU_SELECTED, cmdid); wxPostEvent(mainptr->GetEventHandler(), cmdevt); // avoid possible problems viewptr->SetFocus(); } // ----------------------------------------------------------------------------- void TimelineBar::OnSlider(wxScrollEvent& event) { WXTYPE type = event.GetEventType(); if (type == wxEVT_SCROLL_LINEUP) { currlayer->tlspeed--; if (currlayer->tlspeed < MINSPEED) currlayer->tlspeed = MINSPEED; } else if (type == wxEVT_SCROLL_LINEDOWN) { currlayer->tlspeed++; if (currlayer->tlspeed > MAXSPEED) currlayer->tlspeed = MAXSPEED; } else if (type == wxEVT_SCROLL_PAGEUP) { currlayer->tlspeed -= PAGESIZE; if (currlayer->tlspeed < MINSPEED) currlayer->tlspeed = MINSPEED; } else if (type == wxEVT_SCROLL_PAGEDOWN) { currlayer->tlspeed += PAGESIZE; if (currlayer->tlspeed > MAXSPEED) currlayer->tlspeed = MAXSPEED; } else if (type == wxEVT_SCROLL_THUMBTRACK) { currlayer->tlspeed = event.GetPosition(); if (currlayer->tlspeed < MINSPEED) currlayer->tlspeed = MINSPEED; if (currlayer->tlspeed > MAXSPEED) currlayer->tlspeed = MAXSPEED; } else if (type == wxEVT_SCROLL_THUMBRELEASE) { UpdateSlider(); } #ifndef __WXMAC__ viewptr->SetFocus(); // need on Win/Linux #endif } // ----------------------------------------------------------------------------- void TimelineBar::DisplayCurrentFrame() { currlayer->algo->gotoframe(currlayer->currframe); // FitInView(0) would be less jerky but has the disadvantage that // scale won't change if a pattern shrinks when going backwards if (currlayer->autofit) viewptr->FitInView(1); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void TimelineBar::OnScroll(wxScrollEvent& event) { WXTYPE type = event.GetEventType(); // best to stop autoplay if scroll bar is used if (currlayer->autoplay != 0) { currlayer->autoplay = 0; mainptr->UpdateUserInterface(true); } if (type == wxEVT_SCROLL_LINEUP) { currlayer->currframe--; if (currlayer->currframe < 0) currlayer->currframe = 0; DisplayCurrentFrame(); } else if (type == wxEVT_SCROLL_LINEDOWN) { currlayer->currframe++; if (currlayer->currframe >= currlayer->algo->getframecount()) currlayer->currframe = currlayer->algo->getframecount() - 1; DisplayCurrentFrame(); } else if (type == wxEVT_SCROLL_PAGEUP) { currlayer->currframe -= PAGESIZE; if (currlayer->currframe < 0) currlayer->currframe = 0; DisplayCurrentFrame(); } else if (type == wxEVT_SCROLL_PAGEDOWN) { currlayer->currframe += PAGESIZE; if (currlayer->currframe >= currlayer->algo->getframecount()) currlayer->currframe = currlayer->algo->getframecount() - 1; DisplayCurrentFrame(); } else if (type == wxEVT_SCROLL_THUMBTRACK) { currlayer->currframe = event.GetPosition(); if (currlayer->currframe < 0) currlayer->currframe = 0; if (currlayer->currframe >= currlayer->algo->getframecount()) currlayer->currframe = currlayer->algo->getframecount() - 1; DisplayCurrentFrame(); } else if (type == wxEVT_SCROLL_THUMBRELEASE) { UpdateScrollBar(); } #ifndef __WXMAC__ viewptr->SetFocus(); // need on Win/Linux #endif } // ----------------------------------------------------------------------------- void TimelineBar::OnKillFocus(wxFocusEvent& event) { int id = event.GetId(); tlbutt[id]->SetFocus(); // don't let button lose focus } // ----------------------------------------------------------------------------- void TimelineBar::OnButtonDown(wxMouseEvent& event) { // timeline bar button has been pressed int id = event.GetId(); // connect a handler that keeps focus with the pressed button tlbutt[id]->Connect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(TimelineBar::OnKillFocus)); event.Skip(); } // ----------------------------------------------------------------------------- void TimelineBar::OnButtonUp(wxMouseEvent& event) { // timeline bar button has been released int id = event.GetId(); wxPoint pt = tlbutt[id]->ScreenToClient( wxGetMousePosition() ); int wd, ht; tlbutt[id]->GetClientSize(&wd, &ht); wxRect r(0, 0, wd, ht); // diconnect kill-focus handler tlbutt[id]->Disconnect(id, wxEVT_KILL_FOCUS, wxFocusEventHandler(TimelineBar::OnKillFocus)); viewptr->SetFocus(); if (r.Contains(pt)) { // call OnButton wxCommandEvent buttevt(wxEVT_COMMAND_BUTTON_CLICKED, id); buttevt.SetEventObject(tlbutt[id]); tlbutt[id]->GetEventHandler()->ProcessEvent(buttevt); } } // ----------------------------------------------------------------------------- void TimelineBar::AddButton(int id, const wxString& tip) { tlbutt[id] = new wxBitmapButton(this, id, normbutt[id], wxPoint(xpos,ypos), wxSize(BUTTON_WD, BUTTON_HT)); if (tlbutt[id] == NULL) { Fatal(_("Failed to create timeline bar button!")); } else { xpos += BUTTON_WD + smallgap; tlbutt[id]->SetToolTip(tip); #ifdef __WXMSW__ // fix problem with timeline bar buttons when generating/inscript // due to focus being changed to viewptr tlbutt[id]->Connect(id, wxEVT_LEFT_DOWN, wxMouseEventHandler(TimelineBar::OnButtonDown)); tlbutt[id]->Connect(id, wxEVT_LEFT_UP, wxMouseEventHandler(TimelineBar::OnButtonUp)); #endif } } // ----------------------------------------------------------------------------- void TimelineBar::AddSeparator() { xpos += biggap - smallgap; } // ----------------------------------------------------------------------------- void TimelineBar::EnableButton(int id, bool enable) { if (enable == tlbutt[id]->IsEnabled()) return; #ifdef __WXMSW__ tlbutt[id]->SetBitmapDisabled(disnormbutt[id]); #endif tlbutt[id]->Enable(enable); } // ----------------------------------------------------------------------------- void TimelineBar::UpdateButtons() { if (currlayer->algo->isrecording()) { if (buttstate[RECORD_BUTT] != -1) { buttstate[RECORD_BUTT] = -1; tlbutt[RECORD_BUTT]->SetBitmapLabel(normbutt[STOPREC_BUTT]); tlbutt[RECORD_BUTT]->SetToolTip(_("Stop recording")); if (showtimeline) tlbutt[RECORD_BUTT]->Refresh(false); } } else { if (buttstate[RECORD_BUTT] != 1) { buttstate[RECORD_BUTT] = 1; tlbutt[RECORD_BUTT]->SetBitmapLabel(normbutt[RECORD_BUTT]); tlbutt[RECORD_BUTT]->SetToolTip(_("Start recording")); if (showtimeline) tlbutt[RECORD_BUTT]->Refresh(false); } } // these buttons are only shown if there is a timeline and we're not recording // (see DrawTimelineBar) if (TimelineExists() && !currlayer->algo->isrecording()) { if (currlayer->autoplay == 0) { if (buttstate[BACKWARDS_BUTT] != 1) { buttstate[BACKWARDS_BUTT] = 1; tlbutt[BACKWARDS_BUTT]->SetBitmapLabel(normbutt[BACKWARDS_BUTT]); tlbutt[BACKWARDS_BUTT]->SetToolTip(_("Play backwards")); if (showtimeline) tlbutt[BACKWARDS_BUTT]->Refresh(false); } if (buttstate[FORWARDS_BUTT] != 1) { buttstate[FORWARDS_BUTT] = 1; tlbutt[FORWARDS_BUTT]->SetBitmapLabel(normbutt[FORWARDS_BUTT]); tlbutt[FORWARDS_BUTT]->SetToolTip(_("Play forwards")); if (showtimeline) tlbutt[FORWARDS_BUTT]->Refresh(false); } } else if (currlayer->autoplay > 0) { if (buttstate[BACKWARDS_BUTT] != 1) { buttstate[BACKWARDS_BUTT] = 1; tlbutt[BACKWARDS_BUTT]->SetBitmapLabel(normbutt[BACKWARDS_BUTT]); tlbutt[BACKWARDS_BUTT]->SetToolTip(_("Play backwards")); if (showtimeline) tlbutt[BACKWARDS_BUTT]->Refresh(false); } if (buttstate[FORWARDS_BUTT] != -1) { buttstate[FORWARDS_BUTT] = -1; tlbutt[FORWARDS_BUTT]->SetBitmapLabel(normbutt[STOPPLAY_BUTT]); tlbutt[FORWARDS_BUTT]->SetToolTip(_("Stop playing")); if (showtimeline) tlbutt[FORWARDS_BUTT]->Refresh(false); } } else { // currlayer->autoplay < 0 if (buttstate[BACKWARDS_BUTT] != -1) { buttstate[BACKWARDS_BUTT] = -1; tlbutt[BACKWARDS_BUTT]->SetBitmapLabel(normbutt[STOPPLAY_BUTT]); tlbutt[BACKWARDS_BUTT]->SetToolTip(_("Stop playing")); if (showtimeline) tlbutt[BACKWARDS_BUTT]->Refresh(false); } if (buttstate[FORWARDS_BUTT] != 1) { buttstate[FORWARDS_BUTT] = 1; tlbutt[FORWARDS_BUTT]->SetBitmapLabel(normbutt[FORWARDS_BUTT]); tlbutt[FORWARDS_BUTT]->SetToolTip(_("Play forwards")); if (showtimeline) tlbutt[FORWARDS_BUTT]->Refresh(false); } } } } // ----------------------------------------------------------------------------- void TimelineBar::UpdateSlider() { slider->SetValue(currlayer->tlspeed); } // ----------------------------------------------------------------------------- void TimelineBar::UpdateScrollBar() { framebar->SetScrollbar(currlayer->currframe, 1, currlayer->algo->getframecount(), PAGESIZE, true); } // ----------------------------------------------------------------------------- void CreateTimelineBar(wxWindow* parent) { // create timeline bar underneath given window int wd, ht; parent->GetClientSize(&wd, &ht); tbarptr = new TimelineBar(parent, 0, ht - TBARHT, wd, TBARHT); if (tbarptr == NULL) Fatal(_("Failed to create timeline bar!")); tbarptr->Show(showtimeline); } // ----------------------------------------------------------------------------- int TimelineBarHeight() { return (showtimeline ? TBARHT : 0); } // ----------------------------------------------------------------------------- void UpdateTimelineBar(bool active) { if (tbarptr && showtimeline && !mainptr->IsIconized()) { if (inscript) active = false; // may need to change bitmaps in some buttons tbarptr->UpdateButtons(); tbarptr->EnableButton(RECORD_BUTT, active && currlayer->algo->hyperCapable()); // note that slider, scroll bar and some buttons are only shown if there is // a timeline and we're not recording (see DrawTimelineBar) if (TimelineExists() && !currlayer->algo->isrecording()) { tbarptr->EnableButton(BACKWARDS_BUTT, active); tbarptr->EnableButton(FORWARDS_BUTT, active); tbarptr->EnableButton(DELETE_BUTT, active); tbarptr->UpdateSlider(); tbarptr->UpdateScrollBar(); } if (currlayer->algo->isrecording()) { // don't refresh RECORD_BUTT (otherwise button flickers on Windows) int wd, ht; tbarptr->GetClientSize(&wd, &ht); wxRect r(BUTTON_WD + tbarptr->smallgap * 2, 0, wd, ht); tbarptr->RefreshRect(r, false); } else { tbarptr->Refresh(false); } } } // ----------------------------------------------------------------------------- void ResizeTimelineBar(int y, int wd) { if (tbarptr) { tbarptr->SetSize(0, y, wd, TBARHT); // change width of scroll bar to nearly fill timeline bar wxRect r = tbarptr->framebar->GetRect(); r.width = wd - r.x - 20 - BUTTON_WD - 20; tbarptr->framebar->SetSize(r); // move DELETE_BUTT to right edge of timeline bar r = tlbutt[DELETE_BUTT]->GetRect(); r.x = wd - 20 - BUTTON_WD; if (r.x < mindelpos && TimelineExists()) r.x = mindelpos; tlbutt[DELETE_BUTT]->SetSize(r); } } // ----------------------------------------------------------------------------- void ToggleTimelineBar() { showtimeline = !showtimeline; wxRect r = bigview->GetRect(); if (showtimeline) { // show timeline bar underneath viewport window r.height -= TBARHT; ResizeTimelineBar(r.y + r.height, r.width); } else { // hide timeline bar r.height += TBARHT; } bigview->SetSize(r); tbarptr->Show(showtimeline); // needed on Windows mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void StartStopRecording() { if (!inscript && currlayer->algo->hyperCapable()) { if (currlayer->algo->isrecording()) { // terminate GeneratePattern mainptr->Stop(); } else { if (currlayer->algo->isEmpty()) { statusptr->ErrorMessage(_("There is no pattern to record.")); return; } if (!showtimeline) ToggleTimelineBar(); if (currlayer->algo->getframecount() == MAX_FRAME_COUNT) { wxString msg; msg.Printf(_("The timeline can't be extended any further (max frames = %d)."), MAX_FRAME_COUNT); statusptr->ErrorMessage(msg); return; } // record a new timeline, or extend the existing one if (currlayer->algo->startrecording(currlayer->currbase, currlayer->currexpo) > 0) { if (currlayer->algo->getGeneration() == currlayer->startgen) { // ensure the SaveStartingPattern call in DeleteTimeline will // create a new temporary .mc file (with only one frame) currlayer->savestart = true; } // temporarily disable allowundo so that GeneratePattern won't // try to save any temporary files bool saveundo = allowundo; allowundo = false; mainptr->GeneratePattern(); allowundo = saveundo; // GeneratePattern has called currlayer->algo->stoprecording() } else { // can this ever happen???!!! Warning(_("Could not start recording!")); } } } } // ----------------------------------------------------------------------------- void DeleteTimeline() { if (!inscript && TimelineExists() && !currlayer->algo->isrecording()) { if (currlayer->currframe > 0) { // tell writeNativeFormat to only save the current frame // so that the temporary .mc files created by SaveStartingPattern and // RememberGenStart/Finish won't store the entire timeline currlayer->algo->savetimelinewithframe(0); // do stuff so user can select Reset/Undo to go back to 1st frame currlayer->algo->gotoframe(0); if (currlayer->autofit) viewptr->FitInView(1); if (currlayer->algo->getGeneration() == currlayer->startgen) { mainptr->SaveStartingPattern(); } if (allowundo) currlayer->undoredo->RememberGenStart(); // return to the current frame currlayer->algo->gotoframe(currlayer->currframe); if (currlayer->autofit) viewptr->FitInView(1); if (allowundo) currlayer->undoredo->RememberGenFinish(); // restore flag that tells writeNativeFormat to save entire timeline currlayer->algo->savetimelinewithframe(1); } currlayer->algo->destroytimeline(); mainptr->UpdateUserInterface(true); } } // ----------------------------------------------------------------------------- void InitTimelineFrame() { // the user has just loaded a .mc file with a timeline, // so prepare to display the first frame currlayer->algo->gotoframe(0); currlayer->currframe = 0; currlayer->autoplay = 0; currlayer->tlspeed = 0; // first frame is starting gen (needed for DeleteTimeline) currlayer->startgen = currlayer->algo->getGeneration(); // ensure SaveStartingPattern call in DeleteTimeline will create // a new temporary .mc file with one frame currlayer->savestart = true; } // ----------------------------------------------------------------------------- bool TimelineExists() { // on Linux MainFrame::OnIdle is called before currlayer is set return currlayer && currlayer->algo->getframecount() > 0; } // ----------------------------------------------------------------------------- bool AutoPlay() { // assume currlayer->algo->getframecount() > 0 if (currlayer->autoplay == 0) return false; if (currlayer->algo->isrecording()) return false; int frameinc = 1; long delay = 0; if (currlayer->tlspeed > 0) { // skip 2^tlspeed frames frameinc = 1 << currlayer->tlspeed; } if (currlayer->tlspeed < 0) { // set delay between each frame delay = 100 * (-currlayer->tlspeed); if (stopwatch->Time() - currlayer->lastframe < delay) { return true; // request another idle event } } #ifdef __WXMSW__ // need to slow things down on Windows! wxMilliSleep(20); #endif if (currlayer->autoplay > 0) { // play timeline forwards currlayer->currframe += frameinc; if (currlayer->currframe >= currlayer->algo->getframecount() - 1) { currlayer->currframe = currlayer->algo->getframecount() - 1; currlayer->autoplay = -1; // reverse direction when we hit last frame tbarptr->UpdateButtons(); } } else { // currlayer->autoplay < 0 so play timeline backwards currlayer->currframe -= frameinc; if (currlayer->currframe <= 0) { currlayer->currframe = 0; currlayer->autoplay = 1; // reverse direction when we hit first frame tbarptr->UpdateButtons(); } } tbarptr->DisplayCurrentFrame(); tbarptr->UpdateScrollBar(); currlayer->lastframe = stopwatch->Time(); return true; // request another idle event } // ----------------------------------------------------------------------------- void PlayTimeline(int direction) { if (currlayer->algo->isrecording()) return; if (direction > 0 && currlayer->autoplay > 0) { currlayer->autoplay = 0; } else if (direction < 0 && currlayer->autoplay < 0) { currlayer->autoplay = 0; } else { currlayer->autoplay = direction; } mainptr->UpdateUserInterface(true); } // ----------------------------------------------------------------------------- void PlayTimelineFaster() { if (currlayer->algo->isrecording()) return; if (currlayer->tlspeed < MAXSPEED) { currlayer->tlspeed++; if (showtimeline) tbarptr->UpdateSlider(); } } // ----------------------------------------------------------------------------- void PlayTimelineSlower() { if (currlayer->algo->isrecording()) return; if (currlayer->tlspeed > MINSPEED) { currlayer->tlspeed--; if (showtimeline) tbarptr->UpdateSlider(); } } // ----------------------------------------------------------------------------- void ResetTimelineSpeed() { if (currlayer->algo->isrecording()) return; currlayer->tlspeed = 0; if (showtimeline) tbarptr->UpdateSlider(); } // ----------------------------------------------------------------------------- bool TimelineIsPlaying() { return currlayer->autoplay != 0; } golly-2.5-src/gui-wx/wxundo.cpp0000644000175100001440000017057312156145314013500 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/filename.h" // for wxFileName #include "bigint.h" #include "lifealgo.h" #include "writepattern.h" // for MC_format, XRLE_format #include "wxgolly.h" // for mainptr, viewptr #include "wxmain.h" // for mainptr->... #include "wxselect.h" // for Selection #include "wxview.h" // for viewptr->... #include "wxutils.h" // for Warning, Fatal #include "wxscript.h" // for inscript #include "wxalgos.h" // for algo_type #include "wxlayer.h" // for currlayer, numclones, MarkLayerDirty, etc #include "wxprefs.h" // for allowundo, GetAccelerator, etc #include "wxundo.h" // ----------------------------------------------------------------------------- const wxString lack_of_memory = _("Due to lack of memory, some changes can't be undone!"); const wxString to_gen = _("to Gen "); const wxString temp_prefix = wxT("golly_undo_"); // ----------------------------------------------------------------------------- // encapsulate change info stored in undo/redo lists typedef enum { cellstates, // one or more cell states were changed fliptb, // selection was flipped top-bottom fliplr, // selection was flipped left-right rotatecw, // selection was rotated clockwise rotateacw, // selection was rotated anticlockwise rotatepattcw, // pattern was rotated clockwise rotatepattacw, // pattern was rotated anticlockwise namechange, // layer name was changed // WARNING: code in UndoChange/RedoChange assumes only changes < selchange // can alter the layer's dirty state; ie. the olddirty/newdirty flags are // not used for all the following changes selchange, // selection was changed genchange, // pattern was generated setgen, // generation count was changed rulechange, // rule was changed algochange, // algorithm was changed scriptstart, // later changes were made by script scriptfinish // earlier changes were made by script } change_type; class ChangeNode: public wxObject { public: ChangeNode(change_type id); ~ChangeNode(); bool DoChange(bool undo); // do the undo/redo; if it returns false (eg. user has aborted a lengthy // rotate/flip operation) then cancel the undo/redo void ChangeCells(bool undo); // change cell states using cellinfo change_type changeid; // specifies the type of change wxString suffix; // action string for Undo/Redo item bool olddirty; // layer's dirty state before change bool newdirty; // layer's dirty state after change // cellstates info cell_change* cellinfo; // dynamic array of cell changes unsigned int cellcount; // number of cell changes in array // rotatecw/rotateacw/selchange info Selection oldsel, newsel; // old and new selections // genchange info wxString oldfile, newfile; // old and new pattern files bigint oldgen, newgen; // old and new generation counts bigint oldx, oldy, newx, newy; // old and new positions int oldmag, newmag; // old and new scales int oldbase, newbase; // old and new base steps int oldexpo, newexpo; // old and new step exponents bool scriptgen; // gen change was done by script? // also uses oldsel, newsel // setgen info bigint oldstartgen, newstartgen; // old and new startgen values bool oldsave, newsave; // old and new savestart states wxString oldtempstart, newtempstart; // old and new tempstart paths wxString oldstartfile, newstartfile; // old and new startfile paths wxString oldcurrfile, newcurrfile; // old and new currfile paths wxString oldclone[MAX_LAYERS]; // old starting names for cloned layers wxString newclone[MAX_LAYERS]; // new starting names for cloned layers // also uses oldgen, newgen // and oldrule, newrule // and oldx, oldy, newx, newy, oldmag, newmag // and oldbase, newbase // and oldexpo, newexpo // and oldsel, newsel // and oldalgo, newalgo // namechange info wxString oldname, newname; // old and new layer names Layer* whichlayer; // which layer was changed // also uses oldsave, newsave // and oldcurrfile, newcurrfile // rulechange info wxString oldrule, newrule; // old and new rules // also uses oldsel, newsel // algochange info algo_type oldalgo, newalgo; // old and new algorithm types // also uses oldrule, newrule // and oldsel, newsel }; // ----------------------------------------------------------------------------- ChangeNode::ChangeNode(change_type id) { changeid = id; cellinfo = NULL; cellcount = 0; oldfile = wxEmptyString; newfile = wxEmptyString; oldtempstart = wxEmptyString; newtempstart = wxEmptyString; } // ----------------------------------------------------------------------------- ChangeNode::~ChangeNode() { if (cellinfo) free(cellinfo); if (!oldfile.IsEmpty() && wxFileExists(oldfile)) { wxRemoveFile(oldfile); //printf("removed oldfile: %s\n", (const char*)oldfile.mb_str(wxConvLocal)); } if (!newfile.IsEmpty() && wxFileExists(newfile)) { wxRemoveFile(newfile); //printf("removed newfile: %s\n", (const char*)newfile.mb_str(wxConvLocal)); } // only delete oldtempstart/newtempstart if they're not being used to // store the current layer's starting pattern if ( !oldtempstart.IsEmpty() && wxFileExists(oldtempstart) && oldtempstart != currlayer->startfile && oldtempstart != currlayer->currfile ) { wxRemoveFile(oldtempstart); } if ( !newtempstart.IsEmpty() && wxFileExists(newtempstart) && newtempstart != currlayer->startfile && newtempstart != currlayer->currfile ) { wxRemoveFile(newtempstart); } } // ----------------------------------------------------------------------------- void ChangeNode::ChangeCells(bool undo) { // change state of cell(s) stored in cellinfo array if (undo) { // we must undo the cell changes in reverse order in case // a script has changed the same cell more than once unsigned int i = cellcount; while (i > 0) { i--; currlayer->algo->setcell(cellinfo[i].x, cellinfo[i].y, cellinfo[i].oldstate); } } else { unsigned int i = 0; while (i < cellcount) { currlayer->algo->setcell(cellinfo[i].x, cellinfo[i].y, cellinfo[i].newstate); i++; } } if (cellcount > 0) currlayer->algo->endofpattern(); } // ----------------------------------------------------------------------------- bool ChangeNode::DoChange(bool undo) { switch (changeid) { case cellstates: if (cellcount > 0) { ChangeCells(undo); mainptr->UpdatePatternAndStatus(); } break; case fliptb: case fliplr: // pass in true so FlipSelection won't save changes or call MarkLayerDirty if (!viewptr->FlipSelection(changeid == fliptb, true)) return false; break; case rotatepattcw: case rotatepattacw: // pass in true so RotateSelection won't save changes or call MarkLayerDirty if (!viewptr->RotateSelection(changeid == rotatepattcw ? !undo : undo, true)) return false; break; case rotatecw: case rotateacw: if (cellcount > 0) { ChangeCells(undo); } // rotate selection edges if (undo) { currlayer->currsel = oldsel; } else { currlayer->currsel = newsel; } viewptr->DisplaySelectionSize(); mainptr->UpdatePatternAndStatus(); break; case selchange: if (undo) { currlayer->currsel = oldsel; } else { currlayer->currsel = newsel; } if (viewptr->SelectionExists()) viewptr->DisplaySelectionSize(); mainptr->UpdatePatternAndStatus(); break; case genchange: if (undo) { currlayer->currsel = oldsel; mainptr->RestorePattern(oldgen, oldfile, oldx, oldy, oldmag, oldbase, oldexpo); } else { currlayer->currsel = newsel; mainptr->RestorePattern(newgen, newfile, newx, newy, newmag, newbase, newexpo); } break; case setgen: if (undo) { mainptr->ChangeGenCount(oldgen.tostring(), true); currlayer->startgen = oldstartgen; currlayer->savestart = oldsave; currlayer->tempstart = oldtempstart; currlayer->startfile = oldstartfile; currlayer->currfile = oldcurrfile; if (oldtempstart != newtempstart) { currlayer->startdirty = olddirty; currlayer->startalgo = oldalgo; currlayer->startrule = oldrule; currlayer->startx = oldx; currlayer->starty = oldy; currlayer->startmag = oldmag; currlayer->startbase = oldbase; currlayer->startexpo = oldexpo; currlayer->startsel = oldsel; currlayer->startname = oldname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->startname = oldclone[i]; } } } } } else { mainptr->ChangeGenCount(newgen.tostring(), true); currlayer->startgen = newstartgen; currlayer->savestart = newsave; currlayer->tempstart = newtempstart; currlayer->startfile = newstartfile; currlayer->currfile = newcurrfile; if (oldtempstart != newtempstart) { currlayer->startdirty = newdirty; currlayer->startalgo = newalgo; currlayer->startrule = newrule; currlayer->startx = newx; currlayer->starty = newy; currlayer->startmag = newmag; currlayer->startbase = newbase; currlayer->startexpo = newexpo; currlayer->startsel = newsel; currlayer->startname = newname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->startname = newclone[i]; } } } } } // Reset item may become enabled/disabled mainptr->UpdateMenuItems(mainptr->IsActive()); break; case namechange: if (whichlayer == NULL) { // the layer has been deleted so ignore name change } else { // note that if whichlayer != currlayer then we're changing the // name of a non-active cloned layer if (undo) { whichlayer->currname = oldname; currlayer->currfile = oldcurrfile; currlayer->savestart = oldsave; } else { whichlayer->currname = newname; currlayer->currfile = newcurrfile; currlayer->savestart = newsave; } if (whichlayer == currlayer) { if (olddirty == newdirty) mainptr->SetWindowTitle(currlayer->currname); // if olddirty != newdirty then UndoChange/RedoChange will call // MarkLayerClean/MarkLayerDirty (they call SetWindowTitle) } else { // whichlayer is non-active clone so only update Layer menu items for (int i = 0; i < numlayers; i++) mainptr->UpdateLayerItem(i); } } break; case rulechange: if (undo) { RestoreRule(oldrule); currlayer->currsel = oldsel; } else { RestoreRule(newrule); currlayer->currsel = newsel; } // show new rule in window title (file name doesn't change) mainptr->SetWindowTitle(wxEmptyString); if (cellcount > 0) { ChangeCells(undo); } // switch to default colors for new rule UpdateLayerColors(); mainptr->UpdateEverything(); break; case algochange: // pass in true so ChangeAlgorithm won't call RememberAlgoChange if (undo) { mainptr->ChangeAlgorithm(oldalgo, oldrule, true); currlayer->currsel = oldsel; } else { mainptr->ChangeAlgorithm(newalgo, newrule, true); currlayer->currsel = newsel; } // show new rule in window title (file name doesn't change) mainptr->SetWindowTitle(wxEmptyString); if (cellcount > 0) { ChangeCells(undo); } // ChangeAlgorithm has called UpdateLayerColors() mainptr->UpdateEverything(); break; case scriptstart: case scriptfinish: // should never happen Warning(_("Bug detected in DoChange!")); break; } return true; } // ----------------------------------------------------------------------------- UndoRedo::UndoRedo() { numchanges = 0; // for 1st SaveCellChange maxchanges = 0; // ditto badalloc = false; // true if malloc/realloc fails cellarray = NULL; // play safe savecellchanges = false; // no script cell changes are pending savegenchanges = false; // no script gen changes are pending doingscriptchanges = false; // not undoing/redoing script changes prevfile = wxEmptyString; // play safe for ClearUndoRedo startcount = 0; // unfinished RememberGenStart calls fixsetgen = false; // no setgen nodes need fixing // need to remember if script has created a new layer (not a clone) if (inscript) RememberScriptStart(); } // ----------------------------------------------------------------------------- UndoRedo::~UndoRedo() { ClearUndoRedo(); } // ----------------------------------------------------------------------------- void UndoRedo::SaveCellChange(int x, int y, int oldstate, int newstate) { if (numchanges == maxchanges) { if (numchanges == 0) { // initially allocate room for 1 cell change maxchanges = 1; cellarray = (cell_change*) malloc(maxchanges * sizeof(cell_change)); if (cellarray == NULL) { badalloc = true; return; } // ~ChangeNode or ForgetCellChanges will free cellarray } else { // double size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, maxchanges * 2 * sizeof(cell_change)); if (newptr == NULL) { badalloc = true; return; } cellarray = newptr; maxchanges *= 2; } } cellarray[numchanges].x = x; cellarray[numchanges].y = y; cellarray[numchanges].oldstate = oldstate; cellarray[numchanges].newstate = newstate; numchanges++; } // ----------------------------------------------------------------------------- void UndoRedo::ForgetCellChanges() { if (numchanges > 0) { if (cellarray) { free(cellarray); } else { Warning(_("Bug detected in ForgetCellChanges!")); } numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto badalloc = false; } } // ----------------------------------------------------------------------------- bool UndoRedo::RememberCellChanges(const wxString& action, bool olddirty) { if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; // in the unlikely event that newptr is NULL, cellarray should // still point to valid data } // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add cellstates node to head of undo list ChangeNode* change = new ChangeNode(cellstates); if (change == NULL) Fatal(_("Failed to create cellstates node!")); change->suffix = action; change->cellinfo = cellarray; change->cellcount = numchanges; change->olddirty = olddirty; change->newdirty = true; undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } return true; // at least one cell changed state } return false; // no cells changed state (SaveCellChange wasn't called) } // ----------------------------------------------------------------------------- void UndoRedo::RememberFlip(bool topbot, bool olddirty) { // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add fliptb/fliplr node to head of undo list ChangeNode* change = new ChangeNode(topbot ? fliptb : fliplr); if (change == NULL) Fatal(_("Failed to create flip node!")); change->suffix = _("Flip"); change->olddirty = olddirty; change->newdirty = true; undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- void UndoRedo::RememberRotation(bool clockwise, bool olddirty) { // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add rotatepattcw/rotatepattacw node to head of undo list ChangeNode* change = new ChangeNode(clockwise ? rotatepattcw : rotatepattacw); if (change == NULL) Fatal(_("Failed to create simple rotation node!")); change->suffix = _("Rotation"); change->olddirty = olddirty; change->newdirty = true; undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- void UndoRedo::RememberRotation(bool clockwise, Selection& oldsel, Selection& newsel, bool olddirty) { // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add rotatecw/rotateacw node to head of undo list ChangeNode* change = new ChangeNode(clockwise ? rotatecw : rotateacw); if (change == NULL) Fatal(_("Failed to create rotation node!")); change->suffix = _("Rotation"); change->oldsel = oldsel; change->newsel = newsel; change->olddirty = olddirty; change->newdirty = true; // if numchanges == 0 we still need to rotate selection edges if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; } change->cellinfo = cellarray; change->cellcount = numchanges; numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } } undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- void UndoRedo::RememberSelection(const wxString& action) { if (currlayer->savesel == currlayer->currsel) { // selection has not changed return; } if (mainptr->generating) { // don't record selection changes while a pattern is generating; // RememberGenStart and RememberGenFinish will remember the overall change return; } // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add selchange node to head of undo list ChangeNode* change = new ChangeNode(selchange); if (change == NULL) Fatal(_("Failed to create selchange node!")); if (currlayer->currsel.Exists()) { change->suffix = action; } else { change->suffix = _("Deselection"); } change->oldsel = currlayer->savesel; change->newsel = currlayer->currsel; undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- void UndoRedo::SaveCurrentPattern(const wxString& tempfile) { const char* err = NULL; //!!! need lifealgo::CanWriteFormat(MC_format) method??? if ( currlayer->algo->hyperCapable() ) { // save hlife pattern in a macrocell file err = mainptr->WritePattern(tempfile, MC_format, no_compression, 0, 0, 0, 0); } else { // can only save RLE file if edges are within getcell/setcell limits bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( viewptr->OutsideLimits(top, left, bottom, right) ) { err = "Pattern is too big to save."; } else { // use XRLE format so the pattern's top left location and the current // generation count are stored in the file err = mainptr->WritePattern(tempfile, XRLE_format, no_compression, top.toint(), left.toint(), bottom.toint(), right.toint()); } } if (err) Warning(wxString(err,wxConvLocal)); } // ----------------------------------------------------------------------------- void UndoRedo::RememberGenStart() { startcount++; if (startcount > 1) { // return immediately and ignore next RememberGenFinish call; // this can happen in Linux app if user holds down space bar return; } if (inscript) { if (savegenchanges) return; // ignore consecutive run/step command savegenchanges = true; // we're about to do first run/step command of a (possibly long) // sequence, so save starting info } // save current generation, selection, position, scale, speed, etc prevgen = currlayer->algo->getGeneration(); prevsel = currlayer->currsel; viewptr->GetPos(prevx, prevy); prevmag = viewptr->GetMag(); prevbase = currlayer->currbase; prevexpo = currlayer->currexpo; if (!inscript) { // make sure Undo and Redo items show correct actions while generating UpdateUndoItem(to_gen + wxString(prevgen.tostring(), wxConvLocal)); UpdateRedoItem(wxEmptyString); } if (prevgen == currlayer->startgen) { // we can just reset to starting pattern prevfile = wxEmptyString; if (fixsetgen) { // SaveStartingPattern has just been called so search undolist for setgen // node that changed tempstart and update the starting info in that node; // yuk -- is there a simpler solution??? wxList::compatibility_iterator node = undolist.GetFirst(); while (node) { ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == setgen && change->oldtempstart != change->newtempstart) { change->newdirty = currlayer->startdirty; change->newalgo = currlayer->startalgo; change->newrule = currlayer->startrule; change->newx = currlayer->startx; change->newy = currlayer->starty; change->newmag = currlayer->startmag; change->newbase = currlayer->startbase; change->newexpo = currlayer->startexpo; change->newsel = currlayer->startsel; change->newname = currlayer->startname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { change->newclone[i] = cloneptr->startname; } } } // do NOT reset fixsetgen to false here; the gen change might // be removed when clearing the redo list and so we may need // to update this setgen node again after a new gen change break; } node = node->GetNext(); } } } else { // save starting pattern in a unique temporary file prevfile = wxFileName::CreateTempFileName(tempdir + temp_prefix); // if head of undo list is a genchange node then we can copy that // change node's newfile to prevfile; this makes consecutive generating // runs faster (setting prevfile to newfile would be even faster but it's // difficult to avoid the file being deleted if the redo list is cleared) if (!undolist.IsEmpty()) { wxList::compatibility_iterator node = undolist.GetFirst(); ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == genchange) { if (wxCopyFile(change->newfile, prevfile, true)) { return; } else { Warning(_("Failed to copy temporary file!")); // continue and call SaveCurrentPattern } } } SaveCurrentPattern(prevfile); } } // ----------------------------------------------------------------------------- void UndoRedo::RememberGenFinish() { startcount--; if (startcount > 0) return; if (startcount < 0) { // this can happen if a script has pending gen changes that need // to be remembered (ie. savegenchanges is now false) so reset // startcount for the next RememberGenStart call startcount = 0; } if (inscript && savegenchanges) return; // ignore consecutive run/step command // generation count might not have changed (can happen in Linux app) if (prevgen == currlayer->algo->getGeneration()) { // delete prevfile created by RememberGenStart if (!prevfile.IsEmpty() && wxFileExists(prevfile)) { wxRemoveFile(prevfile); } prevfile = wxEmptyString; return; } wxString fpath; if (currlayer->algo->getGeneration() == currlayer->startgen) { // this can happen if script called reset() so just use starting pattern fpath = wxEmptyString; } else { // save finishing pattern in a unique temporary file fpath = wxFileName::CreateTempFileName(tempdir + temp_prefix); SaveCurrentPattern(fpath); } // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add genchange node to head of undo list ChangeNode* change = new ChangeNode(genchange); if (change == NULL) Fatal(_("Failed to create genchange node!")); change->suffix = to_gen + wxString(prevgen.tostring(), wxConvLocal); change->scriptgen = inscript; change->oldgen = prevgen; change->newgen = currlayer->algo->getGeneration(); change->oldfile = prevfile; change->newfile = fpath; change->oldx = prevx; change->oldy = prevy; viewptr->GetPos(change->newx, change->newy); change->oldmag = prevmag; change->newmag = viewptr->GetMag(); change->oldbase = prevbase; change->newbase = currlayer->currbase; change->oldexpo = prevexpo; change->newexpo = currlayer->currexpo; change->oldsel = prevsel; change->newsel = currlayer->currsel; // prevfile has been saved in change->oldfile (~ChangeNode will delete it) prevfile = wxEmptyString; undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- void UndoRedo::AddGenChange() { // add a genchange node to empty undo list if (!undolist.IsEmpty()) Warning(_("AddGenChange bug: undo list NOT empty!")); // use starting pattern info for previous state prevgen = currlayer->startgen; prevsel = currlayer->startsel; prevx = currlayer->startx; prevy = currlayer->starty; prevmag = currlayer->startmag; prevbase = currlayer->startbase; prevexpo = currlayer->startexpo; prevfile = wxEmptyString; // play safe and pretend RememberGenStart was called startcount = 1; // avoid RememberGenFinish returning early if inscript is true savegenchanges = false; RememberGenFinish(); if (undolist.IsEmpty()) Warning(_("AddGenChange bug: undo list is empty!")); } // ----------------------------------------------------------------------------- void UndoRedo::SyncUndoHistory() { // synchronize undo history due to a ResetPattern call; // wind back the undo list to just past the genchange node that // matches the current layer's starting gen count wxList::compatibility_iterator node; ChangeNode* change; while (!undolist.IsEmpty()) { node = undolist.GetFirst(); change = (ChangeNode*) node->GetData(); // remove node from head of undo list and append it to redo list undolist.Erase(node); redolist.Insert(change); if (change->changeid == genchange && change->oldgen == currlayer->startgen) { if (change->scriptgen) { // gen change was done by a script so keep winding back the undo list // to just past the scriptstart node, or until the list is empty while (!undolist.IsEmpty()) { node = undolist.GetFirst(); change = (ChangeNode*) node->GetData(); undolist.Erase(node); redolist.Insert(change); if (change->changeid == scriptstart) break; } } // update Undo/Redo items so they show the correct suffix UpdateUndoRedoItems(); return; } } // should never get here Warning(_("Bug detected in SyncUndoHistory!")); } // ----------------------------------------------------------------------------- void UndoRedo::RememberSetGen(bigint& oldgen, bigint& newgen, bigint& oldstartgen, bool oldsave) { wxString oldtempstart = currlayer->tempstart; wxString oldstartfile = currlayer->startfile; wxString oldcurrfile = currlayer->currfile; if (oldgen > oldstartgen && newgen <= oldstartgen) { // if pattern is generated then tempstart will be clobbered by // SaveStartingPattern, so change tempstart to a new temporary file currlayer->tempstart = wxFileName::CreateTempFileName(tempdir + wxT("golly_setgen_")); // also need to update startfile and currfile (currlayer->savestart is true) currlayer->startfile = currlayer->tempstart; currlayer->currfile = wxEmptyString; } // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add setgen node to head of undo list ChangeNode* change = new ChangeNode(setgen); if (change == NULL) Fatal(_("Failed to create setgen node!")); change->suffix = _("Set Generation"); change->oldgen = oldgen; change->newgen = newgen; change->oldstartgen = oldstartgen; change->newstartgen = currlayer->startgen; change->oldsave = oldsave; change->newsave = currlayer->savestart; change->oldtempstart = oldtempstart; change->newtempstart = currlayer->tempstart; change->oldstartfile = oldstartfile; change->newstartfile = currlayer->startfile; change->oldcurrfile = oldcurrfile; change->newcurrfile = currlayer->currfile; if (change->oldtempstart != change->newtempstart) { // save extra starting info set by previous SaveStartingPattern so that // Undoing this setgen change will restore the correct info for a Reset change->olddirty = currlayer->startdirty; change->oldalgo = currlayer->startalgo; change->oldrule = currlayer->startrule; change->oldx = currlayer->startx; change->oldy = currlayer->starty; change->oldmag = currlayer->startmag; change->oldbase = currlayer->startbase; change->oldexpo = currlayer->startexpo; change->oldsel = currlayer->startsel; change->oldname = currlayer->startname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { change->oldclone[i] = cloneptr->startname; } } } // following settings will be updated by next RememberGenStart call so that // Redoing this setgen change will restore the correct info for a Reset fixsetgen = true; change->newdirty = currlayer->startdirty; change->newalgo = currlayer->startalgo; change->newrule = currlayer->startrule; change->newx = currlayer->startx; change->newy = currlayer->starty; change->newmag = currlayer->startmag; change->newbase = currlayer->startbase; change->newexpo = currlayer->startexpo; change->newsel = currlayer->startsel; change->newname = currlayer->startname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { change->newclone[i] = cloneptr->startname; } } } } undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- void UndoRedo::RememberNameChange(const wxString& oldname, const wxString& oldcurrfile, bool oldsave, bool olddirty) { if (oldname == currlayer->currname && oldcurrfile == currlayer->currfile && oldsave == currlayer->savestart && olddirty == currlayer->dirty) return; // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add namechange node to head of undo list ChangeNode* change = new ChangeNode(namechange); if (change == NULL) Fatal(_("Failed to create namechange node!")); change->suffix = _("Name Change"); change->oldname = oldname; change->newname = currlayer->currname; change->oldcurrfile = oldcurrfile; change->newcurrfile = currlayer->currfile; change->oldsave = oldsave; change->newsave = currlayer->savestart; change->olddirty = olddirty; change->newdirty = currlayer->dirty; // cloned layers share the same undo/redo history but each clone can have // a different name, so we need to remember which layer was changed change->whichlayer = currlayer; undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- void UndoRedo::DeletingClone(int index) { // the given cloned layer is about to be deleted, so we need to go thru the // undo/redo lists and, for each namechange node, set a matching whichlayer // ptr to NULL so DoChange can ignore later changes involving this layer; // very ugly, but I don't see any better solution if we're going to allow // cloned layers to have different names Layer* cloneptr = GetLayer(index); wxList::compatibility_iterator node; node = undolist.GetFirst(); while (node) { ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == namechange && change->whichlayer == cloneptr) change->whichlayer = NULL; node = node->GetNext(); } node = redolist.GetFirst(); while (node) { ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == namechange && change->whichlayer == cloneptr) change->whichlayer = NULL; node = node->GetNext(); } } // ----------------------------------------------------------------------------- void UndoRedo::RememberRuleChange(const wxString& oldrule) { wxString newrule = wxString(currlayer->algo->getrule(), wxConvLocal); if (oldrule == newrule) return; // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add rulechange node to head of undo list ChangeNode* change = new ChangeNode(rulechange); if (change == NULL) Fatal(_("Failed to create rulechange node!")); change->suffix = _("Rule Change"); change->oldrule = oldrule; change->newrule = newrule; // selection might have changed if grid became smaller change->oldsel = currlayer->savesel; change->newsel = currlayer->currsel; // SaveCellChange may have been called if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; } change->cellinfo = cellarray; change->cellcount = numchanges; numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } } undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- void UndoRedo::RememberAlgoChange(algo_type oldalgo, const wxString& oldrule) { // clear the redo history WX_CLEAR_LIST(wxList, redolist); UpdateRedoItem(wxEmptyString); // add algochange node to head of undo list ChangeNode* change = new ChangeNode(algochange); if (change == NULL) Fatal(_("Failed to create algochange node!")); change->suffix = _("Algorithm Change"); change->oldalgo = oldalgo; change->newalgo = currlayer->algtype; change->oldrule = oldrule; change->newrule = wxString(currlayer->algo->getrule(), wxConvLocal); // selection might have changed if grid became smaller change->oldsel = currlayer->savesel; change->newsel = currlayer->currsel; // SaveCellChange may have been called if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; } change->cellinfo = cellarray; change->cellcount = numchanges; numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } } undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- void UndoRedo::RememberScriptStart() { if (!undolist.IsEmpty()) { wxList::compatibility_iterator node = undolist.GetFirst(); ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == scriptstart) { // ignore consecutive RememberScriptStart calls made by RunScript // due to cloned layers if (numclones == 0) Warning(_("Unexpected RememberScriptStart call!")); return; } } // add scriptstart node to head of undo list ChangeNode* change = new ChangeNode(scriptstart); if (change == NULL) Fatal(_("Failed to create scriptstart node!")); change->suffix = _("Script Changes"); undolist.Insert(change); // update Undo action and clear Redo action UpdateUndoItem(change->suffix); UpdateRedoItem(wxEmptyString); } // ----------------------------------------------------------------------------- void UndoRedo::RememberScriptFinish() { if (undolist.IsEmpty()) { // this can happen if RunScript calls RememberScriptFinish multiple times // due to cloned layers AND the script made no changes if (numclones == 0) { // there should be at least a scriptstart node (see ClearUndoRedo) Warning(_("Bug detected in RememberScriptFinish!")); } return; } // if head of undo list is a scriptstart node then simply remove it // and return (ie. the script didn't make any changes) wxList::compatibility_iterator node = undolist.GetFirst(); ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == scriptstart) { undolist.Erase(node); delete change; return; } else if (change->changeid == scriptfinish) { // ignore consecutive RememberScriptFinish calls made by RunScript // due to cloned layers if (numclones == 0) Warning(_("Unexpected RememberScriptFinish call!")); return; } // add scriptfinish node to head of undo list change = new ChangeNode(scriptfinish); if (change == NULL) Fatal(_("Failed to create scriptfinish node!")); change->suffix = _("Script Changes"); undolist.Insert(change); // update Undo item in Edit menu UpdateUndoItem(change->suffix); } // ----------------------------------------------------------------------------- bool UndoRedo::CanUndo() { // we need to allow undo if generating even though undo list might be empty // (selecting Undo will stop generating and add genchange node to undo list) if (allowundo && mainptr->generating) return true; return !undolist.IsEmpty() && !inscript && !viewptr->waitingforclick && !viewptr->drawingcells && !viewptr->selectingcells; } // ----------------------------------------------------------------------------- bool UndoRedo::CanRedo() { return !redolist.IsEmpty() && !inscript && !mainptr->generating && !viewptr->waitingforclick && !viewptr->drawingcells && !viewptr->selectingcells; } // ----------------------------------------------------------------------------- void UndoRedo::UndoChange() { if (!CanUndo()) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_UNDO); return; } // get change info from head of undo list and do the change wxList::compatibility_iterator node = undolist.GetFirst(); ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == scriptfinish) { // undo all changes between scriptfinish and scriptstart nodes; // first remove scriptfinish node from undo list and add it to redo list undolist.Erase(node); redolist.Insert(change); while (change->changeid != scriptstart) { // call UndoChange recursively; temporarily set doingscriptchanges so // 1) UndoChange won't return if DoChange is aborted // 2) user won't see any intermediate pattern/status updates // 3) Undo/Redo items won't be updated doingscriptchanges = true; UndoChange(); doingscriptchanges = false; node = undolist.GetFirst(); if (node == NULL) Fatal(_("Bug in UndoChange!")); change = (ChangeNode*) node->GetData(); } mainptr->UpdatePatternAndStatus(); // continue below so that scriptstart node is removed from undo list // and added to redo list } else { // user might abort the undo (eg. a lengthy rotate/flip) if (!change->DoChange(true) && !doingscriptchanges) return; } // remove node from head of undo list (doesn't delete node's data) undolist.Erase(node); if (change->changeid < selchange && change->olddirty != change->newdirty) { // change dirty flag, update window title and Layer menu items if (change->olddirty) { currlayer->dirty = false; // make sure it changes MarkLayerDirty(); } else { MarkLayerClean(currlayer->currname); } } // add change to head of redo list redolist.Insert(change); // update Undo/Redo items in Edit menu UpdateUndoRedoItems(); } // ----------------------------------------------------------------------------- void UndoRedo::RedoChange() { if (!CanRedo()) return; /* can't redo while generating -- redo list will be empty if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_REDO); return; } */ // get change info from head of redo list and do the change wxList::compatibility_iterator node = redolist.GetFirst(); ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == scriptstart) { // redo all changes between scriptstart and scriptfinish nodes; // first remove scriptstart node from redo list and add it to undo list redolist.Erase(node); undolist.Insert(change); while (change->changeid != scriptfinish) { // call RedoChange recursively; temporarily set doingscriptchanges so // 1) RedoChange won't return if DoChange is aborted // 2) user won't see any intermediate pattern/status updates // 3) Undo/Redo items won't be updated doingscriptchanges = true; RedoChange(); doingscriptchanges = false; node = redolist.GetFirst(); if (node == NULL) Fatal(_("Bug in RedoChange!")); change = (ChangeNode*) node->GetData(); } mainptr->UpdatePatternAndStatus(); // continue below so that scriptfinish node is removed from redo list // and added to undo list } else { // user might abort the redo (eg. a lengthy rotate/flip) if (!change->DoChange(false) && !doingscriptchanges) return; } // remove node from head of redo list (doesn't delete node's data) redolist.Erase(node); if (change->changeid < selchange && change->olddirty != change->newdirty) { // change dirty flag, update window title and Layer menu items if (change->newdirty) { currlayer->dirty = false; // make sure it changes MarkLayerDirty(); } else { MarkLayerClean(currlayer->currname); } } // add change to head of undo list undolist.Insert(change); // update Undo/Redo items in Edit menu UpdateUndoRedoItems(); } // ----------------------------------------------------------------------------- void UndoRedo::UpdateUndoRedoItems() { if (inscript) return; // update Undo/Redo items at end of script if (doingscriptchanges) return; if (undolist.IsEmpty()) { UpdateUndoItem(wxEmptyString); } else { wxList::compatibility_iterator node = undolist.GetFirst(); ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == genchange) { change->suffix = to_gen + wxString(change->oldgen.tostring(), wxConvLocal); } UpdateUndoItem(change->suffix); } if (redolist.IsEmpty()) { UpdateRedoItem(wxEmptyString); } else { wxList::compatibility_iterator node = redolist.GetFirst(); ChangeNode* change = (ChangeNode*) node->GetData(); if (change->changeid == genchange) { change->suffix = to_gen + wxString(change->newgen.tostring(), wxConvLocal); } UpdateRedoItem(change->suffix); } } // ----------------------------------------------------------------------------- void UndoRedo::UpdateUndoItem(const wxString& action) { if (inscript) return; // update Undo/Redo items at end of script wxMenuBar* mbar = mainptr->GetMenuBar(); if (mbar) { wxString label = _("Undo "); label += action; label += GetAccelerator(DO_UNDO); mbar->SetLabel(ID_UNDO, label); } } // ----------------------------------------------------------------------------- void UndoRedo::UpdateRedoItem(const wxString& action) { if (inscript) return; // update Undo/Redo items at end of script wxMenuBar* mbar = mainptr->GetMenuBar(); if (mbar) { wxString label = _("Redo "); label += action; label += GetAccelerator(DO_REDO); mbar->SetLabel(ID_REDO, label); } } // ----------------------------------------------------------------------------- void UndoRedo::ClearUndoRedo() { // free cellarray in case there were SaveCellChange calls not followed // by ForgetCellChanges or RememberCellChanges ForgetCellChanges(); if (startcount > 0) { // RememberGenStart was not followed by RememberGenFinish if (!prevfile.IsEmpty() && wxFileExists(prevfile)) { wxRemoveFile(prevfile); } prevfile = wxEmptyString; startcount = 0; } // clear the undo/redo lists (and delete each node's data) WX_CLEAR_LIST(wxList, undolist); WX_CLEAR_LIST(wxList, redolist); fixsetgen = false; if (inscript) { // script has called a command like new() so add a scriptstart node // to the undo list to match the final scriptfinish node RememberScriptStart(); // reset flags to indicate no pending cell/gen changes savecellchanges = false; savegenchanges = false; } else { UpdateUndoItem(wxEmptyString); UpdateRedoItem(wxEmptyString); } } // ----------------------------------------------------------------------------- bool CopyTempFiles(ChangeNode* srcnode, ChangeNode* destnode, const wxString& tempstart1) { // if srcnode has any existing temporary files then create new // temporary file names in the destnode and copy each file bool allcopied = true; if ( !srcnode->oldfile.IsEmpty() && wxFileExists(srcnode->oldfile) ) { destnode->oldfile = wxFileName::CreateTempFileName(tempdir + wxT("golly_dupe1_")); if ( !wxCopyFile(srcnode->oldfile, destnode->oldfile, true) ) allcopied = false; } if ( !srcnode->newfile.IsEmpty() && wxFileExists(srcnode->newfile) ) { destnode->newfile = wxFileName::CreateTempFileName(tempdir + wxT("golly_dupe2_")); if ( !wxCopyFile(srcnode->newfile, destnode->newfile, true) ) allcopied = false; } if ( !srcnode->oldtempstart.IsEmpty() && wxFileExists(srcnode->oldtempstart) ) { if (srcnode->oldtempstart == currlayer->tempstart) { // the file has already been copied to tempstart1 by Layer::Layer() destnode->oldtempstart = tempstart1; } else { destnode->oldtempstart = wxFileName::CreateTempFileName(tempdir + wxT("golly_dupe3_")); if ( !wxCopyFile(srcnode->oldtempstart, destnode->oldtempstart, true) ) allcopied = false; } if (srcnode->oldstartfile == srcnode->oldtempstart) destnode->oldstartfile = destnode->oldtempstart; if (srcnode->oldcurrfile == srcnode->oldtempstart) destnode->oldcurrfile = destnode->oldtempstart; } if ( !srcnode->newtempstart.IsEmpty() && wxFileExists(srcnode->newtempstart) ) { if (srcnode->newtempstart == currlayer->tempstart) { // the file has already been copied to tempstart1 by Layer::Layer() destnode->newtempstart = tempstart1; } else { destnode->newtempstart = wxFileName::CreateTempFileName(tempdir + wxT("golly_dupe4_")); if ( !wxCopyFile(srcnode->newtempstart, destnode->newtempstart, true) ) allcopied = false; } if (srcnode->newstartfile == srcnode->newtempstart) destnode->newstartfile = destnode->newtempstart; if (srcnode->newcurrfile == srcnode->newtempstart) destnode->newcurrfile = destnode->newtempstart; } return allcopied; } // ----------------------------------------------------------------------------- void UndoRedo::DuplicateHistory(Layer* oldlayer, Layer* newlayer) { UndoRedo* history = oldlayer->undoredo; // clear the undo/redo lists; note that UndoRedo::UndoRedo has added // a scriptstart node to undolist if inscript is true, but we don't // want that here because the old layer's history will already have one WX_CLEAR_LIST(wxList, undolist); WX_CLEAR_LIST(wxList, redolist); // safer to do our own shallow copy (avoids setting undolist/redolist) savecellchanges = history->savecellchanges; savegenchanges = history->savegenchanges; doingscriptchanges = history->doingscriptchanges; numchanges = history->numchanges; maxchanges = history->maxchanges; badalloc = history->badalloc; prevfile = history->prevfile; prevgen = history->prevgen; prevx = history->prevx; prevy = history->prevy; prevmag = history->prevmag; prevbase = history->prevbase; prevexpo = history->prevexpo; prevsel = history->prevsel; startcount = history->startcount; fixsetgen = history->fixsetgen; // copy existing temporary file to new name if ( !prevfile.IsEmpty() && wxFileExists(prevfile) ) { prevfile = wxFileName::CreateTempFileName(tempdir + temp_prefix); if ( !wxCopyFile(history->prevfile, prevfile, true) ) { Warning(_("Could not copy prevfile!")); return; } } // do a deep copy of dynamically allocated data cellarray = NULL; if (numchanges > 0 && history->cellarray) { cellarray = (cell_change*) malloc(maxchanges * sizeof(cell_change)); if (cellarray == NULL) { Warning(_("Could not allocate cellarray!")); return; } // copy history->cellarray data to this cellarray memcpy(cellarray, history->cellarray, numchanges * sizeof(cell_change)); } wxList::compatibility_iterator node; // build a new undolist using history->undolist node = history->undolist.GetFirst(); while (node) { ChangeNode* change = (ChangeNode*) node->GetData(); ChangeNode* newchange = new ChangeNode(change->changeid); if (newchange == NULL) { Warning(_("Failed to copy undolist!")); WX_CLEAR_LIST(wxList, undolist); return; } // shallow copy the change node *newchange = *change; // deep copy any dynamically allocated data if (change->cellinfo) { int bytes = change->cellcount * sizeof(cell_change); newchange->cellinfo = (cell_change*) malloc(bytes); if (newchange->cellinfo == NULL) { Warning(_("Could not copy undolist!")); WX_CLEAR_LIST(wxList, undolist); return; } memcpy(newchange->cellinfo, change->cellinfo, bytes); } // copy any existing temporary files to new names if (!CopyTempFiles(change, newchange, newlayer->tempstart)) { Warning(_("Failed to copy temporary file in undolist!")); WX_CLEAR_LIST(wxList, undolist); return; } // if node is a name change then update whichlayer to point to new layer if (newchange->changeid == namechange) { newchange->whichlayer = newlayer; } undolist.Append(newchange); node = node->GetNext(); } // build a new redolist using history->redolist node = history->redolist.GetFirst(); while (node) { ChangeNode* change = (ChangeNode*) node->GetData(); ChangeNode* newchange = new ChangeNode(change->changeid); if (newchange == NULL) { Warning(_("Failed to copy redolist!")); WX_CLEAR_LIST(wxList, redolist); return; } // shallow copy the change node *newchange = *change; // deep copy any dynamically allocated data if (change->cellinfo) { int bytes = change->cellcount * sizeof(cell_change); newchange->cellinfo = (cell_change*) malloc(bytes); if (newchange->cellinfo == NULL) { Warning(_("Could not copy redolist!")); WX_CLEAR_LIST(wxList, redolist); return; } memcpy(newchange->cellinfo, change->cellinfo, bytes); } // copy any existing temporary files to new names if (!CopyTempFiles(change, newchange, newlayer->tempstart)) { Warning(_("Failed to copy temporary file in redolist!")); WX_CLEAR_LIST(wxList, redolist); return; } // if node is a name change then update whichlayer to point to new layer if (newchange->changeid == namechange) { newchange->whichlayer = newlayer; } redolist.Append(newchange); node = node->GetNext(); } } golly-2.5-src/gui-wx/wxutils.cpp0000644000175100001440000005507712156145314013674 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #include "wx/spinctrl.h" // for wxSpinCtrl #include "wx/progdlg.h" // for wxProgressDialog #include "wx/image.h" // for wxImage #include "wxgolly.h" // for wxGetApp, viewptr, mainptr #include "wxview.h" // for viewptr->... #include "wxmain.h" // for mainptr->... #include "wxscript.h" // for inscript, PassKeyToScript #include "wxprefs.h" // for allowbeep #include "wxutils.h" #if defined(__WXMAC__) && !defined(__WXOSX_COCOA__) #include #include "wx/mac/corefoundation/cfstring.h" // for wxMacCFStringHolder #endif // ----------------------------------------------------------------------------- // need platform-specific gap after OK/Cancel buttons #ifdef __WXMAC__ const int STDHGAP = 0; #elif defined(__WXMSW__) const int STDHGAP = 6; #else const int STDHGAP = 10; #endif // ----------------------------------------------------------------------------- void Note(const wxString& msg) { wxString title = wxGetApp().GetAppName() + _(" note:"); #ifdef __WXMAC__ wxSetCursor(*wxSTANDARD_CURSOR); #endif wxMessageBox(msg, title, wxOK | wxICON_INFORMATION, wxGetActiveWindow()); } // ----------------------------------------------------------------------------- void Warning(const wxString& msg) { Beep(); wxString title = wxGetApp().GetAppName() + _(" warning:"); #ifdef __WXMAC__ wxSetCursor(*wxSTANDARD_CURSOR); #endif wxMessageBox(msg, title, wxOK | wxICON_EXCLAMATION, wxGetActiveWindow()); } // ----------------------------------------------------------------------------- void Fatal(const wxString& msg) { Beep(); wxString title = wxGetApp().GetAppName() + _(" error:"); #ifdef __WXMAC__ wxSetCursor(*wxSTANDARD_CURSOR); #endif wxMessageBox(msg, title, wxOK | wxICON_ERROR, wxGetActiveWindow()); exit(1); // safer than calling wxExit() } // ----------------------------------------------------------------------------- void Beep() { if (allowbeep) wxBell(); } // ============================================================================= // define a modal dialog for getting a string class StringDialog : public wxDialog { public: StringDialog(wxWindow* parent, const wxString& title, const wxString& prompt, const wxString& instring); virtual bool TransferDataFromWindow(); // called when user hits OK wxString GetValue() { return result; } private: wxTextCtrl* textbox; // text box for entering the string wxString result; // the resulting string }; // ----------------------------------------------------------------------------- StringDialog::StringDialog(wxWindow* parent, const wxString& title, const wxString& prompt, const wxString& instring) { Create(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize); // create the controls wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); SetSizer(topSizer); textbox = new wxTextCtrl(this, wxID_ANY, instring); wxStaticText* promptlabel = new wxStaticText(this, wxID_STATIC, prompt); wxSizer* stdbutts = CreateButtonSizer(wxOK | wxCANCEL); // position the controls wxBoxSizer* stdhbox = new wxBoxSizer(wxHORIZONTAL); stdhbox->Add(stdbutts, 1, wxGROW | wxALIGN_CENTER_VERTICAL | wxRIGHT, STDHGAP); wxSize minsize = stdhbox->GetMinSize(); if (minsize.GetWidth() < 250) { minsize.SetWidth(250); stdhbox->SetMinSize(minsize); } topSizer->AddSpacer(12); topSizer->Add(promptlabel, 0, wxLEFT | wxRIGHT, 10); topSizer->AddSpacer(10); topSizer->Add(textbox, 0, wxGROW | wxLEFT | wxRIGHT, 10); topSizer->AddSpacer(12); topSizer->Add(stdhbox, 1, wxGROW | wxTOP | wxBOTTOM, 10); GetSizer()->Fit(this); GetSizer()->SetSizeHints(this); Centre(); // select initial string (must do this last on Windows) textbox->SetFocus(); textbox->SetSelection(-1,-1); } // ----------------------------------------------------------------------------- bool StringDialog::TransferDataFromWindow() { result = textbox->GetValue(); return true; } // ----------------------------------------------------------------------------- bool GetString(const wxString& title, const wxString& prompt, const wxString& instring, wxString& outstring) { StringDialog dialog(wxGetApp().GetTopWindow(), title, prompt, instring); if ( dialog.ShowModal() == wxID_OK ) { outstring = dialog.GetValue(); return true; } else { // user hit Cancel button return false; } } // ============================================================================= // define a modal dialog for getting an integer class IntegerDialog : public wxDialog { public: IntegerDialog(wxWindow* parent, const wxString& title, const wxString& prompt, int inval, int minval, int maxval); virtual bool TransferDataFromWindow(); // called when user hits OK #ifdef __WXMAC__ void OnSpinCtrlChar(wxKeyEvent& event); #endif int GetValue() { return result; } private: enum { ID_SPIN_CTRL = wxID_HIGHEST + 1 }; wxSpinCtrl* spinctrl; // for entering the integer int minint; // minimum value int maxint; // maximum value int result; // the resulting integer }; // ----------------------------------------------------------------------------- #ifdef __WXMAC__ // override key event handler for wxSpinCtrl to allow key checking class MySpinCtrl : public wxSpinCtrl { public: MySpinCtrl(wxWindow* parent, wxWindowID id) : wxSpinCtrl(parent, id) { // create a dynamic event handler for the underlying wxTextCtrl wxTextCtrl* textctrl = GetText(); if (textctrl) { textctrl->Connect(wxID_ANY, wxEVT_CHAR, wxKeyEventHandler(IntegerDialog::OnSpinCtrlChar)); } } }; void IntegerDialog::OnSpinCtrlChar(wxKeyEvent& event) { int key = event.GetKeyCode(); if (event.CmdDown()) { // allow handling of cmd-x/v/etc event.Skip(); } else if ( key == WXK_TAB ) { wxSpinCtrl* sc = (wxSpinCtrl*) FindWindowById(ID_SPIN_CTRL); if ( sc ) { sc->SetFocus(); sc->SetSelection(-1,-1); } } else if ( key >= ' ' && key <= '~' ) { if ( (key >= '0' && key <= '9') || key == '+' || key == '-' ) { // allow digits and + or - event.Skip(); } else { // disallow any other displayable ascii char Beep(); } } else { event.Skip(); } } #else #define MySpinCtrl wxSpinCtrl #endif // __WXMAC__ // ----------------------------------------------------------------------------- IntegerDialog::IntegerDialog(wxWindow* parent, const wxString& title, const wxString& prompt, int inval, int minval, int maxval) { Create(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize); minint = minval; maxint = maxval; // create the controls wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL); SetSizer(topSizer); spinctrl = new MySpinCtrl(this, ID_SPIN_CTRL); spinctrl->SetRange(minval, maxval); spinctrl->SetValue(inval); wxStaticText* promptlabel = new wxStaticText(this, wxID_STATIC, prompt); wxSizer* stdbutts = CreateButtonSizer(wxOK | wxCANCEL); // position the controls wxBoxSizer* stdhbox = new wxBoxSizer(wxHORIZONTAL); stdhbox->Add(stdbutts, 1, wxGROW | wxALIGN_CENTER_VERTICAL | wxRIGHT, STDHGAP); wxSize minsize = stdhbox->GetMinSize(); if (minsize.GetWidth() < 250) { minsize.SetWidth(250); stdhbox->SetMinSize(minsize); } topSizer->AddSpacer(12); topSizer->Add(promptlabel, 0, wxLEFT | wxRIGHT, 10); topSizer->AddSpacer(10); topSizer->Add(spinctrl, 0, wxGROW | wxLEFT | wxRIGHT, 10); topSizer->AddSpacer(12); topSizer->Add(stdhbox, 1, wxGROW | wxTOP | wxBOTTOM, 10); GetSizer()->Fit(this); GetSizer()->SetSizeHints(this); Centre(); // select initial value (must do this last on Windows) spinctrl->SetFocus(); spinctrl->SetSelection(-1,-1); } // ----------------------------------------------------------------------------- bool IntegerDialog::TransferDataFromWindow() { // spinctrl->GetValue() always returns a value within range even if // the text ctrl doesn't contain a valid number -- yuk! result = spinctrl->GetValue(); if (result < minint || result > maxint) { wxString msg; msg.Printf(_("Value must be from %d to %d."), minint, maxint); Warning(msg); spinctrl->SetFocus(); spinctrl->SetSelection(-1,-1); return false; } else { return true; } } // ----------------------------------------------------------------------------- bool GetInteger(const wxString& title, const wxString& prompt, int inval, int minval, int maxval, int* outval) { IntegerDialog dialog(wxGetApp().GetTopWindow(), title, prompt, inval, minval, maxval); if ( dialog.ShowModal() == wxID_OK ) { *outval = dialog.GetValue(); return true; } else { // user hit Cancel button return false; } } // ============================================================================= #if defined(__WXMAC__) && !defined(__WXOSX_COCOA__) // this filter is used to detect cmd-D in SaveChanges dialog Boolean SaveChangesFilter(DialogRef dlg, EventRecord* event, DialogItemIndex* item) { if (event->what == keyDown && (event->modifiers & cmdKey) && toupper(event->message & charCodeMask) == 'D') { // temporarily highlight the Don't Save button ControlRef ctrl; Rect box; GetDialogItemAsControl(dlg, kAlertStdAlertOtherButton, &ctrl); HiliteControl(ctrl, kControlButtonPart); GetControlBounds(ctrl, &box); InvalWindowRect(GetDialogWindow(dlg), &box); HIWindowFlush(GetDialogWindow(dlg)); Delay(6, NULL); HiliteControl(ctrl, 0); *item = kAlertStdAlertOtherButton; return true; } return StdFilterProc(dlg, event, item); } #endif // ----------------------------------------------------------------------------- int SaveChanges(const wxString& query, const wxString& msg) { #if defined(__WXOSX_COCOA__) // use a standard looking modal dialog on wxOSX; // sadly, positioning over center of parent window is not supported by NSAlert wxMessageDialog dialog(wxGetActiveWindow(), msg, query, wxCENTER | wxNO_DEFAULT | wxYES_NO | wxCANCEL | wxICON_INFORMATION); dialog.SetYesNoCancelLabels("Cancel", "Save", "Don't Save"); switch ( dialog.ShowModal() ) { case wxID_YES: return 0; // Cancel case wxID_NO: return 2; // Save case wxID_CANCEL: return 1; // Don't Save default: return 0; // should never happen } #elif defined(__WXMAC__) // use a standard looking modal dialog on wxMac short result; AlertStdCFStringAlertParamRec param; wxMacCFStringHolder cfSave(_("Save"), wxFONTENCODING_DEFAULT); wxMacCFStringHolder cfDontSave(_("Don't Save"), wxFONTENCODING_DEFAULT); wxMacCFStringHolder cfTitle(query, wxFONTENCODING_DEFAULT); wxMacCFStringHolder cfText(msg, wxFONTENCODING_DEFAULT); param.version = kStdCFStringAlertVersionOne; param.position = kWindowAlertPositionParentWindow; param.movable = true; param.flags = 0; param.defaultText = cfSave; param.cancelText = (CFStringRef) kAlertDefaultCancelText; param.otherText = cfDontSave; param.helpButton = false; param.defaultButton = kAlertStdAlertOKButton; param.cancelButton = kAlertStdAlertCancelButton; ModalFilterUPP filterProc = NewModalFilterUPP(SaveChangesFilter); DialogRef alertRef; CreateStandardAlert(kAlertNoteAlert, cfTitle, cfText, ¶m, &alertRef); RunStandardAlert(alertRef, filterProc, &result); DisposeModalFilterUPP(filterProc); switch (result) { case 1: return 2; // Save case 2: return 0; // Cancel case 3: return 1; // Don't Save default: return 0; } #else // Windows/Linux int answer = wxMessageBox(msg, query, wxICON_QUESTION | wxYES_NO | wxCANCEL, wxGetActiveWindow()); switch (answer) { case wxYES: return 2; case wxNO: return 1; default: return 0; // answer == wxCANCEL } #endif } // ============================================================================= // globals for showing progress wxProgressDialog* progdlg = NULL; // progress dialog const int maxprogrange = 1000000000; // maximum range (best if very large) wxStopWatch* progwatch = NULL; // stopwatch for progress dialog long prognext; // when to update progress dialog wxString progtitle; // title for progress dialog // ----------------------------------------------------------------------------- #ifdef __WXMAC__ // define a key event handler to allow escape key to cancel progress dialog class ProgressHandler : public wxEvtHandler { public: void OnKeyDown(wxKeyEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(ProgressHandler, wxEvtHandler) EVT_KEY_DOWN (ProgressHandler::OnKeyDown) END_EVENT_TABLE() void ProgressHandler::OnKeyDown(wxKeyEvent& event) { int key = event.GetKeyCode(); if (key == WXK_ESCAPE || key == '.') { wxCommandEvent cancel(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); wxWindow* buttwin = progdlg->FindWindow(wxID_CANCEL); if (buttwin) { cancel.SetEventObject(buttwin); buttwin->GetEventHandler()->ProcessEvent(cancel); } } else { event.Skip(); } } #endif // ----------------------------------------------------------------------------- void BeginProgress(const wxString& dlgtitle) { if (progdlg) { // better do this in case of nested call delete progdlg; progdlg = NULL; } if (progwatch) { delete progwatch; } progwatch = new wxStopWatch(); progtitle = dlgtitle; // avoid cursor flickering if this is called during a script if (!inscript) { // let user know they'll have to wait #ifdef __WXMAC__ wxSetCursor(*wxHOURGLASS_CURSOR); #endif if (mainptr->IsActive()) viewptr->SetCursor(*wxHOURGLASS_CURSOR); } } // ----------------------------------------------------------------------------- bool AbortProgress(double fraction_done, const wxString& newmsg) { long msecs = progwatch->Time(); if (progdlg) { if (msecs < prognext) return false; prognext = msecs + 100; // call Update/Pulse about 10 times per sec bool cancel; if (fraction_done < 0.0) { // show indeterminate progress gauge cancel = !progdlg->Pulse(newmsg); } else { cancel = !progdlg->Update(int((double)maxprogrange * fraction_done), newmsg); } if (cancel) { // user hit Cancel button if (inscript) PassKeyToScript(WXK_ESCAPE); // abort script return true; } else { return false; } } else { // note that fraction_done is not always an accurate estimator for how long // the task will take, especially when we use nextcell for cut/copy if ( (msecs > 1000 && fraction_done < 0.3) || msecs > 2500 ) { // task is probably going to take a while so create progress dialog progdlg = new wxProgressDialog(progtitle, wxEmptyString, maxprogrange, wxGetActiveWindow(), wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT | wxPD_SMOOTH | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME); #if defined(__WXMAC__) if (progdlg) { #if !defined(__WXOSX_COCOA__) // avoid user selecting Quit or bringing another window to front BeginAppModalStateForWindow( (OpaqueWindowPtr*)progdlg->MacGetWindowRef() ); #endif // install key event handler progdlg->PushEventHandler(new ProgressHandler()); } #endif } prognext = msecs + 10; // short delay until 1st Update/Pulse return false; // don't abort } } // ----------------------------------------------------------------------------- void EndProgress() { if (progdlg) { #if defined(__WXMAC__) #if !defined(__WXOSX_COCOA__) EndAppModalStateForWindow( (OpaqueWindowPtr*)progdlg->MacGetWindowRef() ); #endif // remove and delete ProgressHandler progdlg->PopEventHandler(true); #endif delete progdlg; progdlg = NULL; } if (progwatch) { delete progwatch; progwatch = NULL; } if (!inscript) { // BeginProgress changed cursor so reset it viewptr->CheckCursor(mainptr->IsActive()); } } // ============================================================================= void FillRect(wxDC& dc, wxRect& rect, wxBrush& brush) { // set pen transparent so brush fills rect dc.SetPen(*wxTRANSPARENT_PEN); dc.SetBrush(brush); dc.DrawRectangle(rect); dc.SetBrush(wxNullBrush); // restore brush dc.SetPen(wxNullPen); // restore pen } // ----------------------------------------------------------------------------- void CreatePaleBitmap(const wxBitmap& inmap, wxBitmap& outmap) { wxImage oldimg = inmap.ConvertToImage(); wxImage newimg; newimg.Create(oldimg.GetWidth(), oldimg.GetHeight(), false); unsigned char* dest = newimg.GetData(); unsigned char* src = oldimg.GetData(); bool hasMask = oldimg.HasMask(); unsigned char maskRed = oldimg.GetMaskRed(); unsigned char maskGreen = oldimg.GetMaskGreen(); unsigned char maskBlue = oldimg.GetMaskBlue(); if (hasMask) newimg.SetMaskColour(maskRed, maskGreen, maskBlue); const long size = oldimg.GetWidth() * oldimg.GetHeight(); for ( long i = 0; i < size; i++, src += 3, dest += 3 ) { if ( hasMask && src[0] == maskRed && src[1] == maskGreen && src[2] == maskBlue ) { // don't modify the mask memcpy(dest, src, 3); } else { // make pixel a pale shade of gray int gray = (int) ((src[0] + src[1] + src[2]) / 3.0); gray = (int) (170.0 + (gray / 4.0)); dest[0] = dest[1] = dest[2] = gray; } } // copy the alpha channel, if any if (oldimg.HasAlpha()) { const size_t alphaSize = oldimg.GetWidth() * oldimg.GetHeight(); unsigned char* alpha = (unsigned char*) malloc(alphaSize); if (alpha) { memcpy(alpha, oldimg.GetAlpha(), alphaSize); newimg.InitAlpha(); newimg.SetAlpha(alpha); } } outmap = wxBitmap(newimg); } // ----------------------------------------------------------------------------- bool IsScriptFile(const wxString& filename) { wxString ext = filename.AfterLast('.'); // if filename has no extension then ext == filename if (ext == filename) return false; // currently we support Perl or Python scripts return ( ext.IsSameAs(wxT("pl"),false) || ext.IsSameAs(wxT("py"),false) ); } // ----------------------------------------------------------------------------- bool IsHTMLFile(const wxString& filename) { wxString ext = filename.AfterLast('.'); // if filename has no extension then ext == filename if (ext == filename) return false; return ( ext.IsSameAs(wxT("htm"),false) || ext.IsSameAs(wxT("html"),false) ); } // ----------------------------------------------------------------------------- bool IsTextFile(const wxString& filename) { if (!IsHTMLFile(filename)) { // if non-html file name contains "readme" then assume it's a text file wxString name = filename.AfterLast(wxFILE_SEP_PATH).MakeLower(); if (name.Contains(wxT("readme"))) return true; } wxString ext = filename.AfterLast('.'); // if filename has no extension then ext == filename if (ext == filename) return false; return ( ext.IsSameAs(wxT("txt"),false) || ext.IsSameAs(wxT("doc"),false) ); } // ----------------------------------------------------------------------------- bool IsZipFile(const wxString& filename) { wxString ext = filename.AfterLast('.'); // if filename has no extension then ext == filename if (ext == filename) return false; return ( ext.IsSameAs(wxT("zip"),false) || ext.IsSameAs(wxT("gar"),false) ); } // ----------------------------------------------------------------------------- bool IsRuleFile(const wxString& filename) { wxString ext = filename.AfterLast('.'); // if filename has no extension then ext == filename if (ext == filename) return false; return ( ext.IsSameAs(wxT("rule"),false) || ext.IsSameAs(wxT("table"),false) || ext.IsSameAs(wxT("tree"),false) || ext.IsSameAs(wxT("colors"),false) || ext.IsSameAs(wxT("icons"),false) ); } golly-2.5-src/gui-wx/wxview.cpp0000644000175100001440000034032512156145314013477 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "wx/wxprec.h" // for compilers that support precompilation #ifndef WX_PRECOMP #include "wx/wx.h" // for all others include the necessary headers #endif #if wxUSE_TOOLTIPS #include "wx/tooltip.h" // for wxToolTip #endif #include "wx/file.h" // for wxFile #include "wx/dcbuffer.h" // for wxBufferedPaintDC #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "viewport.h" #include "wxgolly.h" // for mainptr, statusptr #include "wxutils.h" // for Warning, Fatal, Beep #include "wxprefs.h" // for showgridlines, canchangerule, etc #include "wxhelp.h" // for ShowHelp, LoadRule #include "wxmain.h" // for mainptr->... #include "wxstatus.h" // for statusptr->... #include "wxrender.h" // for CreatePasteImage, DrawView, DrawSelection, etc #include "wxscript.h" // for inscript, PassKeyToScript, PassClickToScript #include "wxselect.h" // for Selection #include "wxedit.h" // for UpdateEditBar, ToggleEditBar, etc #include "wxundo.h" // for currlayer->undoredo->... #include "wxalgos.h" // for algo_type, *_ALGO, CreateNewUniverse, etc #include "wxlayer.h" // for currlayer, ResizeLayers, etc #include "wxtimeline.h" // for StartStopRecording, DeleteTimeline, etc #include "wxview.h" #if defined(__WXMAC__) && !defined(__WXOSX_COCOA__) #include // for Button #endif // This module implements a viewport window for editing and viewing patterns. // ----------------------------------------------------------------------------- const int DRAG_RATE = 20; // call OnDragTimer 50 times per sec static bool stopdrawing = false; // terminate a draw done while generating? static bool slowdraw = false; // do slow cell drawing via UpdateView? static wxString oldrule; // rule before readclipboard is called static wxString newrule; // rule after readclipboard is called static int newalgotype; // new algo type created by readclipboard static lifealgo* pastealgo; // temporary universe with pattern to be pasted static wxRect pastebox; // bounding box for paste pattern // remember which translucent button was clicked, and when static control_id clickedcontrol = NO_CONTROL; static long clicktime; // panning buttons are treated differently #define PANNING_CONTROL (clickedcontrol >= NW_CONTROL && \ clickedcontrol <= SE_CONTROL && \ clickedcontrol != MIDDLE_CONTROL) // ----------------------------------------------------------------------------- // event table and handlers: BEGIN_EVENT_TABLE(PatternView, wxWindow) EVT_PAINT ( PatternView::OnPaint) EVT_SIZE ( PatternView::OnSize) EVT_KEY_DOWN ( PatternView::OnKeyDown) EVT_KEY_UP ( PatternView::OnKeyUp) EVT_CHAR ( PatternView::OnChar) EVT_LEFT_DOWN ( PatternView::OnMouseDown) EVT_LEFT_DCLICK ( PatternView::OnMouseDown) EVT_RIGHT_DOWN ( PatternView::OnMouseDown) EVT_RIGHT_DCLICK ( PatternView::OnMouseDown) EVT_MIDDLE_DOWN ( PatternView::OnMouseDown) EVT_MIDDLE_DCLICK ( PatternView::OnMouseDown) EVT_LEFT_UP ( PatternView::OnMouseUp) EVT_RIGHT_UP ( PatternView::OnMouseUp) EVT_MIDDLE_UP ( PatternView::OnMouseUp) #if wxCHECK_VERSION(2, 8, 0) EVT_MOUSE_CAPTURE_LOST ( PatternView::OnMouseCaptureLost) #endif EVT_MOTION ( PatternView::OnMouseMotion) EVT_ENTER_WINDOW ( PatternView::OnMouseEnter) EVT_LEAVE_WINDOW ( PatternView::OnMouseExit) EVT_MOUSEWHEEL ( PatternView::OnMouseWheel) EVT_TIMER (wxID_ANY, PatternView::OnDragTimer) EVT_SCROLLWIN ( PatternView::OnScroll) EVT_ERASE_BACKGROUND ( PatternView::OnEraseBackground) END_EVENT_TABLE() // ----------------------------------------------------------------------------- static void UpdateView() { // update main viewport window, including all tile windows if they exist // (tile windows are children of bigview) bigview->Refresh(false); bigview->Update(); } // ----------------------------------------------------------------------------- static void RefreshView() { // refresh main viewport window, including all tile windows if they exist // (tile windows are children of bigview) bigview->Refresh(false); } // ----------------------------------------------------------------------------- // most editing operations are limited to absolute coordinates <= 10^9 because // getcell and setcell only take int parameters (the limits must be smaller // than INT_MIN and INT_MAX to avoid boundary conditions) static bigint min_coord = -1000000000; static bigint max_coord = +1000000000; bool PatternView::OutsideLimits(bigint& t, bigint& l, bigint& b, bigint& r) { return ( t < min_coord || l < min_coord || b > max_coord || r > max_coord ); } // ----------------------------------------------------------------------------- bool PatternView::SelectionExists() { return currlayer->currsel.Exists(); } // ----------------------------------------------------------------------------- bool PatternView::CopyRect(int itop, int ileft, int ibottom, int iright, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, const wxString& progmsg) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; int v = 0; bool abort = false; // copy (and erase if requested) live cells from given rect // in source universe to same rect in destination universe BeginProgress(progmsg); for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = srcalgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; destalgo->setcell(cx, cy, v); if (erasesrc) srcalgo->setcell(cx, cy, 0); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, wxEmptyString); if (abort) break; } } if (abort) break; } if (erasesrc) srcalgo->endofpattern(); destalgo->endofpattern(); EndProgress(); return !abort; } // ----------------------------------------------------------------------------- void PatternView::CopyAllRect(int itop, int ileft, int ibottom, int iright, lifealgo* srcalgo, lifealgo* destalgo, const wxString& progmsg) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; // copy all cells from given rect in srcalgo to same rect in destalgo BeginProgress(progmsg); for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { destalgo->setcell(cx, cy, srcalgo->getcell(cx, cy)); cntr++; if ((cntr % 4096) == 0) { abort = AbortProgress((double)cntr / maxcount, wxEmptyString); if (abort) break; } } if (abort) break; } destalgo->endofpattern(); EndProgress(); } // ----------------------------------------------------------------------------- void PatternView::ClearSelection() { currlayer->currsel.Clear(); } // ----------------------------------------------------------------------------- void PatternView::ClearOutsideSelection() { currlayer->currsel.ClearOutside(); } // ----------------------------------------------------------------------------- void PatternView::CutSelection() { if (!SelectionExists()) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_CUT); return; } currlayer->currsel.CopyToClipboard(true); } // ----------------------------------------------------------------------------- void PatternView::CopySelection() { if (!SelectionExists()) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(ID_COPY); return; } currlayer->currsel.CopyToClipboard(false); } // ----------------------------------------------------------------------------- bool PatternView::CellInGrid(const bigint& x, const bigint& y) { // return true if cell at x,y is within bounded grid if (currlayer->algo->gridwd > 0 && (x < currlayer->algo->gridleft || x > currlayer->algo->gridright)) return false; if (currlayer->algo->gridht > 0 && (y < currlayer->algo->gridtop || y > currlayer->algo->gridbottom)) return false; return true; } // ----------------------------------------------------------------------------- bool PatternView::PointInGrid(int x, int y) { // is given viewport location also in grid? if (currlayer->algo->gridwd == 0 && currlayer->algo->gridht == 0) { // unbounded grid return true; } pair cellpos = currlayer->view->at(x, y); return CellInGrid(cellpos.first, cellpos.second); } // ----------------------------------------------------------------------------- void PatternView::SetPasteRect(wxRect& rect, bigint& wd, bigint& ht) { int x, y, pastewd, pasteht; int mag = currlayer->view->getmag(); // find cell coord of current paste cursor position pair pcell = currlayer->view->at(pastex, pastey); // determine bottom right cell bigint right = pcell.first; right += wd; right -= 1; bigint bottom = pcell.second; bottom += ht; bottom -= 1; // best to use same method as in Selection::Visible pair lt = currlayer->view->screenPosOf(pcell.first, pcell.second, currlayer->algo); pair rb = currlayer->view->screenPosOf(right, bottom, currlayer->algo); if (mag > 0) { // move rb to pixel at bottom right corner of cell rb.first += (1 << mag) - 1; rb.second += (1 << mag) - 1; if (mag > 1) { // avoid covering gaps at scale 1:4 and above rb.first--; rb.second--; } } x = lt.first; y = lt.second; pastewd = rb.first - lt.first + 1; pasteht = rb.second - lt.second + 1; // this should never happen but play safe if (pastewd <= 0) pastewd = 1; if (pasteht <= 0) pasteht = 1; rect = wxRect(x, y, pastewd, pasteht); int xoffset, yoffset; int cellsize = 1 << mag; // only used if mag > 0 int gap = 1; // ditto if (mag == 1) gap = 0; // but no gap between cells at scale 1:2 switch (plocation) { case TopLeft: break; case TopRight: xoffset = mag > 0 ? -(pastewd - cellsize + gap) : -pastewd + 1; rect.Offset(xoffset, 0); break; case BottomRight: xoffset = mag > 0 ? -(pastewd - cellsize + gap) : -pastewd + 1; yoffset = mag > 0 ? -(pasteht - cellsize + gap) : -pasteht + 1; rect.Offset(xoffset, yoffset); break; case BottomLeft: yoffset = mag > 0 ? -(pasteht - cellsize + gap) : -pasteht + 1; rect.Offset(0, yoffset); break; case Middle: xoffset = mag > 0 ? -(pastewd / cellsize / 2) * cellsize : -pastewd / 2; yoffset = mag > 0 ? -(pasteht / cellsize / 2) * cellsize : -pasteht / 2; rect.Offset(xoffset, yoffset); break; } } // ----------------------------------------------------------------------------- void PatternView::PasteTemporaryToCurrent(bool toselection, bigint top, bigint left, bigint bottom, bigint right) { // make sure given edges are within getcell/setcell limits if ( OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Clipboard pattern is too big.")); return; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); bigint wd = iright - ileft + 1; bigint ht = ibottom - itop + 1; if ( toselection ) { if ( !currlayer->currsel.CanPaste(wd, ht, top, left) ) { statusptr->ErrorMessage(_("Clipboard pattern is bigger than selection.")); return; } // top and left have been set to the selection's top left corner } else { // ask user where to paste the clipboard pattern statusptr->DisplayMessage(_("Click where you want to paste...")); // temporarily change cursor to cross wxCursor* savecurs = currlayer->curs; currlayer->curs = curs_cross; CheckCursor(true); // create image for drawing pattern to be pasted; note that pastebox // is not necessarily the minimal bounding box because clipboard pattern // might have blank borders (in fact it could be empty) pastebox = wxRect(ileft, itop, wd.toint(), ht.toint()); CreatePasteImage(pastealgo, pastebox); waitingforclick = true; mainptr->UpdateMenuAccelerators(); // remove all accelerators so keyboard shortcuts can be used mainptr->EnableAllMenus(false); // disable all menu items mainptr->UpdateToolBar(false); // disable all tool bar buttons UpdateLayerBar(false); // disable all layer bar buttons UpdateEditBar(false); // disable all edit bar buttons CaptureMouse(); // get mouse down event even if outside view pasterect = wxRect(-1,-1,0,0); while (waitingforclick) { wxPoint pt = ScreenToClient( wxGetMousePosition() ); pastex = pt.x; pastey = pt.y; if (PointInView(pt.x, pt.y)) { // determine new paste rectangle wxRect newrect; if (wd.toint() != pastebox.width || ht.toint() != pastebox.height) { // RotatePastePattern was called itop = pastebox.y; ileft = pastebox.x; ibottom = itop + pastebox.height - 1; iright = ileft + pastebox.width - 1; wd = pastebox.width; ht = pastebox.height; } SetPasteRect(newrect, wd, ht); if (newrect != pasterect) { // draw new pasterect pasterect = newrect; Refresh(false); // don't update immediately } } else { // mouse outside viewport so erase old pasterect if necessary if ( pasterect.width > 0 ) { pasterect = wxRect(-1,-1,0,0); Refresh(false); // don't update immediately } } wxMilliSleep(10); // don't hog CPU wxGetApp().Yield(true); // make sure viewport retains focus so we can use keyboard shortcuts SetFocus(); // waitingforclick becomes false if OnMouseDown is called #if defined(__WXMAC__) && !defined(__WXOSX_COCOA__) // need to check for click here because OnMouseDown does not // get called if click is in menu bar or in another window; // is this a CaptureMouse bug in wxMac??? if ( waitingforclick && Button() ) { pt = ScreenToClient( wxGetMousePosition() ); pastex = pt.x; pastey = pt.y; waitingforclick = false; FlushEvents(mDownMask + mUpMask, 0); // avoid wx seeing click } #endif } if ( HasCapture() ) ReleaseMouse(); mainptr->EnableAllMenus(true); mainptr->UpdateMenuAccelerators(); // restore accelerators DestroyPasteImage(); // restore cursor currlayer->curs = savecurs; CheckCursor(mainptr->IsActive()); if ( pasterect.width > 0 ) { // erase old pasterect Refresh(false); // no need to update immediately // Update(); } if ( !PointInView(pastex, pastey) || // allow paste if any corner of pasterect is within grid !( PointInGrid(pastex, pastey) || PointInGrid(pastex+pasterect.width-1, pastey) || PointInGrid(pastex, pastey+pasterect.height-1) || PointInGrid(pastex+pasterect.width-1, pastey+pasterect.height-1) ) ) { statusptr->DisplayMessage(_("Paste aborted.")); return; } // set paste rectangle's top left cell coord pair clickpos = currlayer->view->at(pastex, pastey); top = clickpos.second; left = clickpos.first; bigint halfht = ht; bigint halfwd = wd; halfht.div2(); halfwd.div2(); if (currlayer->view->getmag() > 1) { if (ht.even()) halfht -= 1; if (wd.even()) halfwd -= 1; } switch (plocation) { case TopLeft: /* no change*/ break; case TopRight: left -= wd; left += 1; break; case BottomRight: left -= wd; left += 1; top -= ht; top += 1; break; case BottomLeft: top -= ht; top += 1; break; case Middle: left -= halfwd; top -= halfht; break; } } // check that paste rectangle is within edit limits bottom = top; bottom += ht; bottom -= 1; right = left; right += wd; right -= 1; if ( OutsideLimits(top, left, bottom, right) ) { statusptr->ErrorMessage(_("Pasting is not allowed outside +/- 10^9 boundary.")); return; } // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange SaveCurrentSelection(); // pasting clipboard pattern can cause a rule change int oldmaxstate = currlayer->algo->NumCellStates() - 1; if (canchangerule > 0 && oldrule != newrule) { const char* err = currlayer->algo->setrule( newrule.mb_str(wxConvLocal) ); // setrule can fail if readclipboard loaded clipboard pattern into // a different type of algo (newalgotype) if (err) { // allow rule change to cause algo change mainptr->ChangeAlgorithm(newalgotype, newrule); } else { // show new rule in title bar mainptr->SetWindowTitle(wxEmptyString); // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { mainptr->ClearOutsideGrid(); } // rule change might have changed the number of cell states; // if there are fewer states then pattern might change int newmaxstate = currlayer->algo->NumCellStates() - 1; if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { mainptr->ReduceCellStates(newmaxstate); } // switch to default colors for new rule UpdateLayerColors(); if (allowundo && !currlayer->stayclean) currlayer->undoredo->RememberRuleChange(oldrule); } } // set pastex,pastey to top left cell of paste rectangle pastex = left.toint(); pastey = top.toint(); // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; if (savecells && inscript) SavePendingChanges(); // don't paste cells outside bounded grid int gtop = currlayer->algo->gridtop.toint(); int gleft = currlayer->algo->gridleft.toint(); int gbottom = currlayer->algo->gridbottom.toint(); int gright = currlayer->algo->gridright.toint(); if (currlayer->algo->gridwd == 0) { // grid has infinite width gleft = INT_MIN; gright = INT_MAX; } if (currlayer->algo->gridht == 0) { // grid has infinite height gtop = INT_MIN; gbottom = INT_MAX; } // copy pattern from temporary universe to current universe int tx, ty, cx, cy; double maxcount = wd.todouble() * ht.todouble(); int cntr = 0; bool abort = false; bool pattchanged = false; bool reduced = false; lifealgo* curralgo = currlayer->algo; int maxstate = curralgo->NumCellStates() - 1; BeginProgress(_("Pasting pattern")); // we can speed up pasting sparse patterns by using nextcell in these cases: // - if using Or mode // - if current universe is empty // - if paste rect is outside current pattern edges bool usenextcell; if ( pmode == Or || curralgo->isEmpty() ) { usenextcell = true; } else { bigint ctop, cleft, cbottom, cright; curralgo->findedges(&ctop, &cleft, &cbottom, &cright); usenextcell = top > cbottom || bottom < ctop || left > cright || right < cleft; } if ( usenextcell && pmode == And ) { // current universe is empty or paste rect is outside current pattern edges // so don't change any cells } else if ( usenextcell ) { int newstate = 0; cy = pastey; for ( ty=itop; ty<=ibottom; ty++ ) { cx = pastex; for ( tx=ileft; tx<=iright; tx++ ) { int skip = pastealgo->nextcell(tx, ty, newstate); if (skip + tx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell so paste it into current universe tx += skip; cx += skip; if (cx >= gleft && cx <= gright && cy >= gtop && cy <= gbottom) { int currstate = curralgo->getcell(cx, cy); if (currstate != newstate) { if (newstate > maxstate) { newstate = maxstate; reduced = true; } curralgo->setcell(cx, cy, newstate); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, newstate); } } cx++; } else { tx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((ty - itop) * (double)(iright - ileft + 1) + (tx - ileft)) / maxcount; abort = AbortProgress(prog, wxEmptyString); if (abort) break; } } if (abort) break; cy++; } } else { // have to use slower getcell/setcell calls int tempstate, currstate; int numstates = curralgo->NumCellStates(); cy = pastey; for ( ty=itop; ty<=ibottom; ty++ ) { cx = pastex; for ( tx=ileft; tx<=iright; tx++ ) { tempstate = pastealgo->getcell(tx, ty); currstate = curralgo->getcell(cx, cy); if (cx >= gleft && cx <= gright && cy >= gtop && cy <= gbottom) { switch (pmode) { case And: if (tempstate != currstate && currstate > 0) { curralgo->setcell(cx, cy, 0); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, 0); } break; case Copy: if (tempstate != currstate) { if (tempstate > maxstate) { tempstate = maxstate; reduced = true; } curralgo->setcell(cx, cy, tempstate); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, tempstate); } break; case Or: // Or mode is done using above nextcell loop; // we only include this case to avoid compiler warning break; case Xor: if (tempstate == currstate) { if (currstate != 0) { curralgo->setcell(cx, cy, 0); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, 0); } } else { // tempstate != currstate int newstate = tempstate ^ currstate; // if xor overflows then don't change current state if (newstate >= numstates) newstate = currstate; if (currstate != newstate) { curralgo->setcell(cx, cy, newstate); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, newstate); } } break; } } cx++; cntr++; if ( (cntr % 4096) == 0 ) { abort = AbortProgress((double)cntr / maxcount, wxEmptyString); if (abort) break; } } if (abort) break; cy++; } } if (pattchanged) curralgo->endofpattern(); EndProgress(); // tidy up and display result statusptr->ClearMessage(); if (pattchanged) { if (savecells) currlayer->undoredo->RememberCellChanges(_("Paste"), currlayer->dirty); MarkLayerDirty(); // calls SetWindowTitle mainptr->UpdatePatternAndStatus(); } if (reduced) statusptr->ErrorMessage(_("Some cell states were reduced.")); } // ----------------------------------------------------------------------------- bool PatternView::GetClipboardPattern(lifealgo** tempalgo, bigint* t, bigint* l, bigint* b, bigint* r) { wxTextDataObject data; if ( !mainptr->GetTextFromClipboard(&data) ) return false; // copy clipboard data to temporary file so we can handle all formats // supported by readclipboard wxFile tmpfile(mainptr->clipfile, wxFile::write); if ( !tmpfile.IsOpened() ) { Warning(_("Could not create temporary file for clipboard data!")); return false; } if ( !tmpfile.Write(data.GetText()) ) { Warning(_("Could not write clipboard data to temporary file! Maybe disk is full?")); tmpfile.Close(); return false; } tmpfile.Close(); // remember current rule oldrule = wxString(currlayer->algo->getrule(), wxConvLocal); const char* err = readclipboard(mainptr->clipfile.mb_str(wxConvLocal), **tempalgo, t, l, b, r); if (err) { // cycle thru all other algos until readclipboard succeeds for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { delete *tempalgo; *tempalgo = CreateNewUniverse(i); err = readclipboard(mainptr->clipfile.mb_str(wxConvLocal), **tempalgo, t, l, b, r); if (!err) { newalgotype = i; // remember new algo for later use in PasteTemporaryToCurrent break; } } } } if (canchangerule > 0) { // set newrule for later use in PasteTemporaryToCurrent if (canchangerule == 1 && !currlayer->algo->isEmpty()) { // don't change rule if universe isn't empty newrule = oldrule; } else { // remember rule set by readclipboard newrule = wxString((*tempalgo)->getrule(), wxConvLocal); } } // restore rule now in case error occurred RestoreRule(oldrule); wxRemoveFile(mainptr->clipfile); if (err) { // error probably due to bad rule string in clipboard data Warning(_("Could not load clipboard pattern\n(probably due to unknown rule).")); return false; } return true; } // ----------------------------------------------------------------------------- void PatternView::PasteClipboard(bool toselection) { if (waitingforclick || !mainptr->ClipboardHasText()) return; if (toselection && !SelectionExists()) return; if (mainptr->generating) { // terminate generating loop and set command_pending flag mainptr->Stop(); mainptr->command_pending = true; mainptr->cmdevent.SetId(toselection ? ID_PASTE_SEL : ID_PASTE); return; } // if clipboard text starts with "@RULE rulename" then install rulename.rule // and switch to that rule if (mainptr->ClipboardContainsRule()) return; // create a temporary universe for storing the clipboard pattern; // GetClipboardPattern assumes it is same type as current universe pastealgo = CreateNewUniverse(currlayer->algtype); // no need to call setrule here -- readclipboard will do it // read clipboard pattern into temporary universe bigint top, left, bottom, right; if ( GetClipboardPattern(&pastealgo, &top, &left, &bottom, &right) ) { // pastealgo might have been deleted and re-created as a different type of universe PasteTemporaryToCurrent(toselection, top, left, bottom, right); } delete pastealgo; } // ----------------------------------------------------------------------------- void PatternView::AbortPaste() { pastex = -1; pastey = -1; waitingforclick = false; } // ----------------------------------------------------------------------------- void PatternView::CyclePasteLocation() { if (plocation == TopLeft) { plocation = TopRight; if (!waitingforclick) statusptr->DisplayMessage(_("Paste location is Top Right.")); } else if (plocation == TopRight) { plocation = BottomRight; if (!waitingforclick) statusptr->DisplayMessage(_("Paste location is Bottom Right.")); } else if (plocation == BottomRight) { plocation = BottomLeft; if (!waitingforclick) statusptr->DisplayMessage(_("Paste location is Bottom Left.")); } else if (plocation == BottomLeft) { plocation = Middle; if (!waitingforclick) statusptr->DisplayMessage(_("Paste location is Middle.")); } else { plocation = TopLeft; if (!waitingforclick) statusptr->DisplayMessage(_("Paste location is Top Left.")); } if (waitingforclick) { // force redraw of paste rectangle if mouse is inside viewport pasterect = wxRect(-1,-1,0,0); } } // ----------------------------------------------------------------------------- void PatternView::CyclePasteMode() { if (pmode == And) { pmode = Copy; if (!waitingforclick) statusptr->DisplayMessage(_("Paste mode is Copy.")); } else if (pmode == Copy) { pmode = Or; if (!waitingforclick) statusptr->DisplayMessage(_("Paste mode is Or.")); } else if (pmode == Or) { pmode = Xor; if (!waitingforclick) statusptr->DisplayMessage(_("Paste mode is Xor.")); } else { pmode = And; if (!waitingforclick) statusptr->DisplayMessage(_("Paste mode is And.")); } if (waitingforclick) { // force redraw of paste rectangle if mouse is inside viewport pasterect = wxRect(-1,-1,0,0); } } // ----------------------------------------------------------------------------- void PatternView::DisplaySelectionSize() { if (waitingforclick || inscript || currlayer->undoredo->doingscriptchanges) return; currlayer->currsel.DisplaySize(); } // ----------------------------------------------------------------------------- void PatternView::SaveCurrentSelection() { if (allowundo && !currlayer->stayclean) { currlayer->savesel = currlayer->currsel; } } // ----------------------------------------------------------------------------- void PatternView::RememberNewSelection(const wxString& action) { if (TimelineExists()) { // we allow selections while a timeline exists but we can't // remember them in the undo/redo history return; } if (allowundo && !currlayer->stayclean) { if (inscript) SavePendingChanges(); currlayer->undoredo->RememberSelection(action); } } // ----------------------------------------------------------------------------- void PatternView::SelectAll() { SaveCurrentSelection(); if (SelectionExists()) { currlayer->currsel.Deselect(); mainptr->UpdatePatternAndStatus(); } if (currlayer->algo->isEmpty()) { statusptr->ErrorMessage(empty_pattern); RememberNewSelection(_("Deselection")); return; } bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); currlayer->currsel.SetEdges(top, left, bottom, right); RememberNewSelection(_("Select All")); DisplaySelectionSize(); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void PatternView::RemoveSelection() { if (SelectionExists()) { SaveCurrentSelection(); currlayer->currsel.Deselect(); RememberNewSelection(_("Deselection")); mainptr->UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- void PatternView::ShrinkSelection(bool fit) { currlayer->currsel.Shrink(fit); } // ----------------------------------------------------------------------------- void PatternView::RandomFill() { currlayer->currsel.RandomFill(); } // ----------------------------------------------------------------------------- bool PatternView::FlipPastePattern(bool topbottom) { bool result; Selection pastesel(pastebox.GetTop(), pastebox.GetLeft(), pastebox.GetBottom(), pastebox.GetRight()); // flip the pattern in pastealgo lifealgo* savealgo = currlayer->algo; currlayer->algo = pastealgo; // pass in true for inundoredo parameter so flip won't be remembered // and layer won't be marked as dirty; also set inscript temporarily // so that viewport won't be updated inscript = true; result = pastesel.Flip(topbottom, true); // currlayer->algo might point to a *different* universe pastealgo = currlayer->algo; currlayer->algo = savealgo; inscript = false; if (result) { CreatePasteImage(pastealgo, pastebox); UpdateView(); } return result; } // ----------------------------------------------------------------------------- bool PatternView::RotatePastePattern(bool clockwise) { bool result; Selection pastesel(pastebox.GetTop(), pastebox.GetLeft(), pastebox.GetBottom(), pastebox.GetRight()); // rotate the pattern in pastealgo lifealgo* savealgo = currlayer->algo; currlayer->algo = pastealgo; // pass in true for inundoredo parameter so rotate won't be remembered // and layer won't be marked as dirty; also set inscript temporarily // so that viewport won't be updated inscript = true; result = pastesel.Rotate(clockwise, true); // currlayer->algo might point to a *different* universe pastealgo = currlayer->algo; currlayer->algo = savealgo; inscript = false; if (result) { // get rotated selection and update pastebox int x, y, wd, ht; pastesel.GetRect(&x, &y, &wd, &ht); pastebox = wxRect(x, y, wd, ht); CreatePasteImage(pastealgo, pastebox); UpdateView(); } return result; } // ----------------------------------------------------------------------------- bool PatternView::FlipSelection(bool topbottom, bool inundoredo) { if (waitingforclick) { // more useful to flip the pattern about to be pasted return FlipPastePattern(topbottom); } else { return currlayer->currsel.Flip(topbottom, inundoredo); } } // ----------------------------------------------------------------------------- bool PatternView::RotateSelection(bool clockwise, bool inundoredo) { if (waitingforclick) { // more useful to rotate the pattern about to be pasted return RotatePastePattern(clockwise); } else { return currlayer->currsel.Rotate(clockwise, inundoredo); } } // ----------------------------------------------------------------------------- void PatternView::SetCursorMode(wxCursor* cursor) { currlayer->curs = cursor; } // ----------------------------------------------------------------------------- void PatternView::CycleCursorMode() { if (drawingcells || selectingcells || movingview || waitingforclick) return; if (currlayer->curs == curs_pencil) currlayer->curs = curs_pick; else if (currlayer->curs == curs_pick) currlayer->curs = curs_cross; else if (currlayer->curs == curs_cross) currlayer->curs = curs_hand; else if (currlayer->curs == curs_hand) currlayer->curs = curs_zoomin; else if (currlayer->curs == curs_zoomin) currlayer->curs = curs_zoomout; else currlayer->curs = curs_pencil; } // ----------------------------------------------------------------------------- void PatternView::ZoomOut() { TestAutoFit(); currlayer->view->unzoom(); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::ZoomIn() { TestAutoFit(); if (currlayer->view->getmag() < MAX_MAG) { currlayer->view->zoom(); mainptr->UpdateEverything(); } else { Beep(); } } // ----------------------------------------------------------------------------- void PatternView::SetPixelsPerCell(int pxlspercell) { int mag = 0; while (pxlspercell > 1) { mag++; pxlspercell >>= 1; } if (mag == currlayer->view->getmag()) return; TestAutoFit(); currlayer->view->setmag(mag); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::FitPattern() { currlayer->algo->fit(*currlayer->view, 1); // best not to call TestAutoFit mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::FitSelection() { if (!SelectionExists()) return; currlayer->currsel.Fit(); TestAutoFit(); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::ViewOrigin() { // put 0,0 cell in middle of view if ( currlayer->originx == bigint::zero && currlayer->originy == bigint::zero ) { currlayer->view->center(); } else { // put cell saved by ChangeOrigin in middle currlayer->view->setpositionmag(currlayer->originx, currlayer->originy, currlayer->view->getmag()); } TestAutoFit(); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::ChangeOrigin() { if (waitingforclick) return; // change cell under cursor to 0,0 wxPoint pt = ScreenToClient( wxGetMousePosition() ); if ( pt.x < 0 || pt.x > currlayer->view->getxmax() || pt.y < 0 || pt.y > currlayer->view->getymax() ) { statusptr->ErrorMessage(_("Origin not changed.")); } else { pair cellpos = currlayer->view->at(pt.x, pt.y); currlayer->originx = cellpos.first; currlayer->originy = cellpos.second; statusptr->DisplayMessage(_("Origin changed.")); if ( GridVisible() ) mainptr->UpdatePatternAndStatus(); else statusptr->UpdateXYLocation(); } } // ----------------------------------------------------------------------------- void PatternView::RestoreOrigin() { if (waitingforclick) return; if (currlayer->originx != bigint::zero || currlayer->originy != bigint::zero) { currlayer->originx = 0; currlayer->originy = 0; statusptr->DisplayMessage(origin_restored); if ( GridVisible() ) mainptr->UpdatePatternAndStatus(); else statusptr->UpdateXYLocation(); } } // ----------------------------------------------------------------------------- bool PatternView::GridVisible() { return ( showgridlines && currlayer->view->getmag() >= mingridmag ); } // ----------------------------------------------------------------------------- void PatternView::ToggleGridLines() { showgridlines = !showgridlines; if ( (currlayer->view->getmag() >= mingridmag) || // also update everything if drawing all layers (numlayers > 1 && (stacklayers || tilelayers)) ) mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::ToggleCellIcons() { showicons = !showicons; mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::ToggleCellColors() { swapcolors = !swapcolors; InvertCellColors(); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::ToggleBuffering() { buffered = !buffered; mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- bool PatternView::GetCellPos(bigint& xpos, bigint& ypos) { wxPoint pt = ScreenToClient( wxGetMousePosition() ); if (PointInView(pt.x, pt.y)) { // get mouse location in cell coords pair cellpos = currlayer->view->at(pt.x, pt.y); xpos = cellpos.first; ypos = cellpos.second; // check if xpos,ypos is outside bounded grid if (!CellInGrid(xpos, ypos)) return false; return true; } else { // mouse not in viewport return false; } } // ----------------------------------------------------------------------------- bool PatternView::PointInView(int x, int y) { return ( x >= 0 && x <= currlayer->view->getxmax() && y >= 0 && y <= currlayer->view->getymax() ); } // ----------------------------------------------------------------------------- #ifdef __WXGTK__ // nicer to redraw entire viewport on Linux // otherwise we see partial drawing in some cases #define RefreshControls() Refresh(false) #else #define RefreshControls() RefreshRect(controlsrect,false) #endif void PatternView::CheckCursor(bool active) { if (active) { // make sure cursor is up to date wxPoint pt = ScreenToClient( wxGetMousePosition() ); if (PointInView(pt.x, pt.y)) { if (numlayers > 1 && tilelayers && tileindex != currindex) { // show arrow cursor if over tile border (ie. bigview) or non-current tile #ifdef __WXMAC__ // wxMac bug??? need this to fix probs after toggling status/tool bar wxSetCursor(*wxSTANDARD_CURSOR); #endif SetCursor(*wxSTANDARD_CURSOR); if (showcontrols) { showcontrols = false; RefreshControls(); } } else if ( (controlsrect.Contains(pt) || clickedcontrol > NO_CONTROL) && !(drawingcells || selectingcells || movingview || waitingforclick) ) { // cursor is over translucent controls, or user clicked in a control // and hasn't released mouse button yet #ifdef __WXMAC__ wxSetCursor(*wxSTANDARD_CURSOR); #endif SetCursor(*wxSTANDARD_CURSOR); if (!showcontrols) { showcontrols = true; RefreshControls(); } } else { // show current cursor mode #ifdef __WXMAC__ wxSetCursor(*currlayer->curs); #endif SetCursor(*currlayer->curs); if (showcontrols) { showcontrols = false; RefreshControls(); } } } else { // cursor is not in viewport #ifdef __WXMAC__ wxSetCursor(*wxSTANDARD_CURSOR); #endif SetCursor(*wxSTANDARD_CURSOR); if (showcontrols) { showcontrols = false; RefreshControls(); } } } else { // main window is not active so don't change cursor } } // ----------------------------------------------------------------------------- int PatternView::GetMag() { return currlayer->view->getmag(); } // ----------------------------------------------------------------------------- void PatternView::SetMag(int mag) { TestAutoFit(); if (mag > MAX_MAG) mag = MAX_MAG; currlayer->view->setmag(mag); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::SetPosMag(const bigint& x, const bigint& y, int mag) { currlayer->view->setpositionmag(x, y, mag); } // ----------------------------------------------------------------------------- void PatternView::GetPos(bigint& x, bigint& y) { x = currlayer->view->x; y = currlayer->view->y; } // ----------------------------------------------------------------------------- void PatternView::FitInView(int force) { currlayer->algo->fit(*currlayer->view, force); } // ----------------------------------------------------------------------------- bool PatternView::CellVisible(const bigint& x, const bigint& y) { return currlayer->view->contains(x, y) != 0; } // ----------------------------------------------------------------------------- // scrolling functions: void PatternView::PanUp(int amount) { TestAutoFit(); currlayer->view->move(0, -amount); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::PanDown(int amount) { TestAutoFit(); currlayer->view->move(0, amount); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::PanLeft(int amount) { TestAutoFit(); currlayer->view->move(-amount, 0); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::PanRight(int amount) { TestAutoFit(); currlayer->view->move(amount, 0); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::PanNE() { TestAutoFit(); int xamount = SmallScroll(currlayer->view->getwidth()); int yamount = SmallScroll(currlayer->view->getheight()); int amount = (xamount < yamount) ? xamount : yamount; currlayer->view->move(amount, -amount); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::PanNW() { TestAutoFit(); int xamount = SmallScroll(currlayer->view->getwidth()); int yamount = SmallScroll(currlayer->view->getheight()); int amount = (xamount < yamount) ? xamount : yamount; currlayer->view->move(-amount, -amount); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::PanSE() { TestAutoFit(); int xamount = SmallScroll(currlayer->view->getwidth()); int yamount = SmallScroll(currlayer->view->getheight()); int amount = (xamount < yamount) ? xamount : yamount; currlayer->view->move(amount, amount); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- void PatternView::PanSW() { TestAutoFit(); int xamount = SmallScroll(currlayer->view->getwidth()); int yamount = SmallScroll(currlayer->view->getheight()); int amount = (xamount < yamount) ? xamount : yamount; currlayer->view->move(-amount, amount); mainptr->UpdateEverything(); } // ----------------------------------------------------------------------------- int PatternView::SmallScroll(int xysize) { int amount; int mag = currlayer->view->getmag(); if (mag > 0) { // scroll an integral number of cells (1 cell = 2^mag pixels) if (mag < 3) { amount = ((xysize >> mag) / 20) << mag; if (amount == 0) amount = 1 << mag; return amount; } else { // grid lines are visible so scroll by only 1 cell return 1 << mag; } } else { // scroll by approx 5% of current wd/ht amount = xysize / 20; if (amount == 0) amount = 1; return amount; } } // ----------------------------------------------------------------------------- int PatternView::BigScroll(int xysize) { int amount; int mag = currlayer->view->getmag(); if (mag > 0) { // scroll an integral number of cells (1 cell = 2^mag pixels) amount = ((xysize >> mag) * 9 / 10) << mag; if (amount == 0) amount = 1 << mag; return amount; } else { // scroll by approx 90% of current wd/ht amount = xysize * 9 / 10; if (amount == 0) amount = 1; return amount; } } // ----------------------------------------------------------------------------- void PatternView::UpdateScrollBars() { if (mainptr->fullscreen) return; int viewwd, viewht; int mag = currlayer->view->getmag(); if (mag > 0) { // scroll by cells, so determine number of cells visible in viewport viewwd = currlayer->view->getwidth() >> mag; viewht = currlayer->view->getheight() >> mag; } else { // scroll by pixels, so get pixel dimensions of viewport viewwd = currlayer->view->getwidth(); viewht = currlayer->view->getheight(); } if (viewwd < 1) viewwd = 1; if (viewht < 1) viewht = 1; if (currlayer->algo->gridwd > 0) { // restrict scrolling to left/right edges of grid if its width is finite int range = currlayer->algo->gridwd; // avoid scroll bar disappearing if (range < 3) range = 3; hthumb = currlayer->view->x.toint() + range / 2; bigview->SetScrollbar(wxHORIZONTAL, hthumb, 1, range, true); } else { // keep thumb box in middle of scroll bar if grid width is infinite hthumb = (thumbrange - 1) * viewwd / 2; bigview->SetScrollbar(wxHORIZONTAL, hthumb, viewwd, thumbrange * viewwd, true); } if (currlayer->algo->gridht > 0) { // restrict scrolling to top/bottom edges of grid if its height is finite int range = currlayer->algo->gridht; // avoid scroll bar disappearing if (range < 3) range = 3; vthumb = currlayer->view->y.toint() + range / 2; bigview->SetScrollbar(wxVERTICAL, vthumb, 1, range, true); } else { // keep thumb box in middle of scroll bar if grid height is infinite vthumb = (thumbrange - 1) * viewht / 2; bigview->SetScrollbar(wxVERTICAL, vthumb, viewht, thumbrange * viewht, true); } } // ----------------------------------------------------------------------------- void PatternView::ProcessKey(int key, int modifiers) { mainptr->showbanner = false; // WARNING: ProcessKey can be called while running a script, or reading // a large pattern file, or waiting for a paste click etc, so we must avoid // doing any actions that could cause havoc at such times. bool busy = nopattupdate || waitingforclick || dragtimer->IsRunning(); bool timeline = TimelineExists(); action_info action = FindAction(key, modifiers); switch (action.id) { case DO_NOTHING: // any unassigned key turns off full screen mode if (mainptr->fullscreen) mainptr->ToggleFullScreen(); break; case DO_OPENFILE: if (IsHTMLFile(action.file)) { // show HTML file in help window if (!busy) ShowHelp(action.file); } else { // load pattern or run script if (!inscript && !busy) mainptr->OpenFile(action.file, true); } break; // File menu actions case DO_NEWPATT: if (!inscript && !busy) mainptr->NewPattern(); break; case DO_OPENPATT: if (!inscript && !busy) mainptr->OpenPattern(); break; case DO_OPENCLIP: if (!inscript && !busy) mainptr->OpenClipboard(); break; case DO_SAVE: if (!inscript && !busy) mainptr->SavePattern(); break; case DO_SAVEXRLE: if (!inscript) savexrle = !savexrle; break; case DO_RUNSCRIPT: if (!inscript && !timeline && !busy) mainptr->OpenScript(); break; case DO_RUNCLIP: if (!inscript && !timeline && !busy) mainptr->RunClipboard(); break; case DO_PREFS: if (!busy) mainptr->ShowPrefsDialog(); break; case DO_PATTDIR: if (!busy) mainptr->ChangePatternDir(); break; case DO_SCRIPTDIR: if (!busy) mainptr->ChangeScriptDir(); break; case DO_PATTERNS: mainptr->ToggleShowPatterns(); break; case DO_SCRIPTS: mainptr->ToggleShowScripts(); break; case DO_QUIT: mainptr->QuitApp(); break; // Edit menu actions case DO_UNDO: if (!inscript && !timeline && !busy) currlayer->undoredo->UndoChange(); break; case DO_REDO: if (!inscript && !timeline && !busy) currlayer->undoredo->RedoChange(); break; case DO_DISABLE: if (!inscript) mainptr->ToggleAllowUndo(); break; case DO_CUT: if (!inscript && !timeline) CutSelection(); break; case DO_COPY: if (!inscript) CopySelection(); break; case DO_CLEAR: if (!inscript && !timeline) ClearSelection(); break; case DO_CLEAROUT: if (!inscript && !timeline) ClearOutsideSelection(); break; case DO_PASTE: if (!inscript && !timeline && !busy) { // PasteClipboard(false) has a Yield loop so we do the following to avoid // calling ProcessKey re-entrantly as it causes problems on Mac OS X // and possibly the other platforms wxCommandEvent evt(wxEVT_COMMAND_MENU_SELECTED, ID_PASTE); wxPostEvent(mainptr->GetEventHandler(), evt); return; } break; // case DO_PASTE: if (!inscript && !timeline && !busy) PasteClipboard(false); break; case DO_PASTESEL: if (!inscript && !timeline && !busy) PasteClipboard(true); break; case DO_SELALL: if (!inscript) SelectAll(); break; case DO_REMOVESEL: if (!inscript) RemoveSelection(); break; case DO_SHRINK: if (!inscript) ShrinkSelection(false); break; case DO_SHRINKFIT: if (!inscript) ShrinkSelection(true); break; case DO_RANDFILL: if (!inscript && !timeline) RandomFill(); break; case DO_FLIPTB: if (!inscript && !timeline) FlipSelection(true); break; case DO_FLIPLR: if (!inscript && !timeline) FlipSelection(false); break; case DO_ROTATECW: if (!inscript && !timeline) RotateSelection(true); break; case DO_ROTATEACW: if (!inscript && !timeline) RotateSelection(false); break; case DO_ADVANCE: if (!inscript && !timeline) currlayer->currsel.Advance(); break; case DO_ADVANCEOUT: if (!inscript && !timeline) currlayer->currsel.AdvanceOutside(); break; case DO_CURSDRAW: SetCursorMode(curs_pencil); break; case DO_CURSPICK: SetCursorMode(curs_pick); break; case DO_CURSSEL: SetCursorMode(curs_cross); break; case DO_CURSMOVE: SetCursorMode(curs_hand); break; case DO_CURSIN: SetCursorMode(curs_zoomin); break; case DO_CURSOUT: SetCursorMode(curs_zoomout); break; case DO_CURSCYCLE: CycleCursorMode(); break; case DO_PASTEMODE: CyclePasteMode(); break; case DO_PASTELOC: CyclePasteLocation(); break; case DO_NEXTHIGHER: CycleDrawingState(true); break; case DO_NEXTLOWER: CycleDrawingState(false); break; // Control menu actions case DO_STARTSTOP: if (!inscript) { if (timeline) { if (currlayer->algo->isrecording()) { StartStopRecording(); // stop recording } else { PlayTimeline(1); // play forwards or stop if already playing } } else if (mainptr->generating) { mainptr->Stop(); } else { mainptr->GeneratePattern(); } } break; case DO_NEXTGEN: if (!inscript && !timeline) mainptr->NextGeneration(false); break; case DO_NEXTSTEP: if (!inscript && !timeline) mainptr->NextGeneration(true); break; case DO_RESET: if (!inscript && !timeline && !busy) mainptr->ResetPattern(); break; case DO_SETGEN: if (!inscript && !timeline && !busy) mainptr->SetGeneration(); break; case DO_SETBASE: if (!inscript && !timeline && !busy) mainptr->SetBaseStep(); break; case DO_FASTER: mainptr->GoFaster(); break; case DO_SLOWER: mainptr->GoSlower(); break; case DO_AUTOFIT: mainptr->ToggleAutoFit(); break; case DO_HYPER: if (!timeline) mainptr->ToggleHyperspeed(); break; case DO_HASHINFO: mainptr->ToggleHashInfo(); break; case DO_RECORD: StartStopRecording(); break; case DO_DELTIME: DeleteTimeline(); break; case DO_PLAYBACK: if (!inscript && timeline) PlayTimeline(-1); break; case DO_SETRULE: if (!inscript && !timeline && !busy) mainptr->ShowRuleDialog(); break; case DO_TIMING: if (!inscript && !timeline) mainptr->DisplayTimingInfo(); break; case DO_HASHING: if (!inscript && !timeline && !busy) { if (currlayer->algtype != HLIFE_ALGO) mainptr->ChangeAlgorithm(HLIFE_ALGO); else mainptr->ChangeAlgorithm(QLIFE_ALGO); } break; // View menu actions case DO_LEFT: PanLeft( SmallScroll(currlayer->view->getwidth()) ); break; case DO_RIGHT: PanRight( SmallScroll(currlayer->view->getwidth()) ); break; case DO_UP: PanUp( SmallScroll(currlayer->view->getheight()) ); break; case DO_DOWN: PanDown( SmallScroll(currlayer->view->getheight()) ); break; case DO_NE: PanNE(); break; case DO_NW: PanNW(); break; case DO_SE: PanSE(); break; case DO_SW: PanSW(); break; case DO_FULLSCREEN: mainptr->ToggleFullScreen(); break; case DO_FIT: FitPattern(); break; case DO_FITSEL: FitSelection(); break; case DO_MIDDLE: ViewOrigin(); break; case DO_CHANGE00: ChangeOrigin(); break; case DO_RESTORE00: RestoreOrigin(); break; case DO_ZOOMIN: ZoomIn(); break; case DO_ZOOMOUT: ZoomOut(); break; case DO_SCALE1: SetPixelsPerCell(1); break; case DO_SCALE2: SetPixelsPerCell(2); break; case DO_SCALE4: SetPixelsPerCell(4); break; case DO_SCALE8: SetPixelsPerCell(8); break; case DO_SCALE16: SetPixelsPerCell(16); break; case DO_SCALE32: SetPixelsPerCell(32); break; case DO_SHOWTOOL: mainptr->ToggleToolBar(); break; case DO_SHOWLAYER: ToggleLayerBar(); break; case DO_SHOWEDIT: ToggleEditBar(); break; case DO_SHOWSTATES: ToggleAllStates(); break; case DO_SHOWSTATUS: mainptr->ToggleStatusBar(); break; case DO_SHOWEXACT: mainptr->ToggleExactNumbers(); break; case DO_SHOWICONS: ToggleCellIcons(); break; case DO_INVERT: ToggleCellColors(); break; case DO_SHOWGRID: ToggleGridLines(); break; case DO_BUFFERED: ToggleBuffering(); break; case DO_SHOWTIME: ToggleTimelineBar(); break; case DO_INFO: if (!busy) mainptr->ShowPatternInfo(); break; // Layer menu actions case DO_ADD: if (!inscript) AddLayer(); break; case DO_CLONE: if (!inscript) CloneLayer(); break; case DO_DUPLICATE: if (!inscript) DuplicateLayer(); break; case DO_DELETE: if (!inscript) DeleteLayer(); break; case DO_DELOTHERS: if (!inscript) DeleteOtherLayers(); break; case DO_MOVELAYER: if (!inscript && !busy) MoveLayerDialog(); break; case DO_NAMELAYER: if (!inscript && !busy) NameLayerDialog(); break; case DO_SETCOLORS: if (!inscript && !busy) SetLayerColors(); break; case DO_SYNCVIEWS: if (!inscript) ToggleSyncViews(); break; case DO_SYNCCURS: if (!inscript) ToggleSyncCursors(); break; case DO_STACK: if (!inscript) ToggleStackLayers(); break; case DO_TILE: if (!inscript) ToggleTileLayers(); break; // Help menu actions case DO_HELP: if (!busy) { // if help window is open then bring it to the front, // otherwise open it and display most recent help file ShowHelp(wxEmptyString); } break; case DO_ABOUT: if (!inscript && !busy) ShowAboutBox(); break; default: Warning(_("Bug detected in ProcessKey!")); } // note that we avoid updating viewport if inscript and action.id is DO_OPENFILE // otherwise problem can occur when rapidly repeating a keyboard shortcut that // runs a script if (inscript && action.id != DO_NOTHING && action.id != DO_OPENFILE) { // update viewport, status bar, scroll bars inscript = false; mainptr->UpdatePatternAndStatus(); bigview->UpdateScrollBars(); inscript = true; } mainptr->UpdateUserInterface(mainptr->IsActive()); } // ----------------------------------------------------------------------------- void PatternView::ShowDrawing() { currlayer->algo->endofpattern(); // update status bar if (showstatus) statusptr->Refresh(false); if (slowdraw) { // we have to draw by updating entire view slowdraw = false; UpdateView(); } MarkLayerDirty(); } // ----------------------------------------------------------------------------- void PatternView::DrawOneCell(wxDC& dc, int cx, int cy, int oldstate, int newstate) { // remember this cell change for later undo/redo if (allowundo) currlayer->undoredo->SaveCellChange(cx, cy, oldstate, newstate); if (numlayers > 1 && (stacklayers || (numclones > 0 && tilelayers))) { // drawing must be done via UpdateView in ShowDrawing slowdraw = true; return; } int cellsize = 1 << currlayer->view->getmag(); // convert given cell coords to view coords pair lefttop = currlayer->view->at(0, 0); wxCoord x = (cx - lefttop.first.toint()) * cellsize; wxCoord y = (cy - lefttop.second.toint()) * cellsize; if (cellsize > 2) cellsize--; // allow for gap between cells wxBitmap** iconmaps = NULL; if (currlayer->view->getmag() == 3) { iconmaps = currlayer->icons7x7; } else if (currlayer->view->getmag() == 4) { iconmaps = currlayer->icons15x15; } else if (currlayer->view->getmag() == 5) { iconmaps = currlayer->icons31x31; } if (showicons && drawstate > 0 && currlayer->view->getmag() > 2 && iconmaps && iconmaps[drawstate]) { DrawOneIcon(dc, x, y, iconmaps[drawstate], currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0], currlayer->cellr[drawstate], currlayer->cellg[drawstate], currlayer->cellb[drawstate], currlayer->multicoloricons); } else { dc.DrawRectangle(x, y, cellsize, cellsize); } // overlay selection image if cell is within selection if (SelectionExists() && currlayer->currsel.ContainsCell(cx, cy)) { wxRect r = wxRect(x, y, cellsize, cellsize); DrawSelection(dc, r); } } // ----------------------------------------------------------------------------- void PatternView::StartDrawingCells(int x, int y) { pair cellpos = currlayer->view->at(x, y); // check that cellpos is within getcell/setcell limits if ( OutsideLimits(cellpos.second, cellpos.first, cellpos.second, cellpos.first) ) { statusptr->ErrorMessage(_("Drawing is not allowed outside +/- 10^9 boundary.")); return; } // ShowDrawing will call MarkLayerDirty so we need to save dirty state now // for later use by RememberCellChanges if (allowundo) currlayer->savedirty = currlayer->dirty; cellx = cellpos.first.toint(); celly = cellpos.second.toint(); int currstate = currlayer->algo->getcell(cellx, celly); // reset drawing state in case it's no longer valid (due to algo/rule change) if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) { currlayer->drawingstate = 1; } if (currstate == currlayer->drawingstate) { drawstate = 0; } else { drawstate = currlayer->drawingstate; } if (currstate != drawstate) { currlayer->algo->setcell(cellx, celly, drawstate); wxClientDC dc(this); dc.SetPen(*wxTRANSPARENT_PEN); cellbrush->SetColour(currlayer->cellr[drawstate], currlayer->cellg[drawstate], currlayer->cellb[drawstate]); dc.SetBrush(*cellbrush); DrawOneCell(dc, cellx, celly, currstate, drawstate); dc.SetBrush(wxNullBrush); dc.SetPen(wxNullPen); ShowDrawing(); } drawingcells = true; CaptureMouse(); // get mouse up event even if outside view dragtimer->Start(DRAG_RATE); // see OnDragTimer if (stopdrawing) { // mouse up event has already been seen so terminate drawing immediately stopdrawing = false; StopDraggingMouse(); } } // ----------------------------------------------------------------------------- void PatternView::DrawCells(int x, int y) { // make sure x,y is within viewport if (x < 0) x = 0; if (y < 0) y = 0; if (x > currlayer->view->getxmax()) x = currlayer->view->getxmax(); if (y > currlayer->view->getymax()) y = currlayer->view->getymax(); // make sure x,y is within bounded grid pair cellpos = currlayer->view->at(x, y); if (currlayer->algo->gridwd > 0) { if (cellpos.first < currlayer->algo->gridleft) cellpos.first = currlayer->algo->gridleft; if (cellpos.first > currlayer->algo->gridright) cellpos.first = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (cellpos.second < currlayer->algo->gridtop) cellpos.second = currlayer->algo->gridtop; if (cellpos.second > currlayer->algo->gridbottom) cellpos.second = currlayer->algo->gridbottom; } if ( currlayer->view->getmag() < 0 || OutsideLimits(cellpos.second, cellpos.first, cellpos.second, cellpos.first) ) { return; } int newx = cellpos.first.toint(); int newy = cellpos.second.toint(); if ( newx != cellx || newy != celly ) { int currstate; wxClientDC dc(this); dc.SetPen(*wxTRANSPARENT_PEN); cellbrush->SetColour(currlayer->cellr[drawstate], currlayer->cellg[drawstate], currlayer->cellb[drawstate]); dc.SetBrush(*cellbrush); int numchanged = 0; // draw a line of cells using Bresenham's algorithm; // this code comes from Guillermo Garcia's Life demo supplied with wx int d, ii, jj, di, ai, si, dj, aj, sj; di = newx - cellx; ai = abs(di) << 1; si = (di < 0)? -1 : 1; dj = newy - celly; aj = abs(dj) << 1; sj = (dj < 0)? -1 : 1; ii = cellx; jj = celly; lifealgo* curralgo = currlayer->algo; if (ai > aj) { d = aj - (ai >> 1); while (ii != newx) { currstate = curralgo->getcell(ii, jj); if (currstate != drawstate) { curralgo->setcell(ii, jj, drawstate); DrawOneCell(dc, ii, jj, currstate, drawstate); numchanged++; } if (d >= 0) { jj += sj; d -= ai; } ii += si; d += aj; } } else { d = ai - (aj >> 1); while (jj != newy) { currstate = curralgo->getcell(ii, jj); if (currstate != drawstate) { curralgo->setcell(ii, jj, drawstate); DrawOneCell(dc, ii, jj, currstate, drawstate); numchanged++; } if (d >= 0) { ii += si; d -= aj; } jj += sj; d += ai; } } cellx = newx; celly = newy; currstate = curralgo->getcell(cellx, celly); if (currstate != drawstate) { curralgo->setcell(cellx, celly, drawstate); DrawOneCell(dc, cellx, celly, currstate, drawstate); numchanged++; } dc.SetBrush(wxNullBrush); // restore brush dc.SetPen(wxNullPen); // restore pen if (numchanged > 0) ShowDrawing(); } } // ----------------------------------------------------------------------------- void PatternView::PickCell(int x, int y) { pair cellpos = currlayer->view->at(x, y); if ( currlayer->view->getmag() < 0 || OutsideLimits(cellpos.second, cellpos.first, cellpos.second, cellpos.first) ) { return; } int cellx = cellpos.first.toint(); int celly = cellpos.second.toint(); currlayer->drawingstate = currlayer->algo->getcell(cellx, celly); UpdateEditBar(true); } // ----------------------------------------------------------------------------- void PatternView::StartSelectingCells(int x, int y, bool shiftdown) { // make sure anchor cell is within bounded grid (x,y can be outside grid) pair cellpos = currlayer->view->at(x, y); if (currlayer->algo->gridwd > 0) { if (cellpos.first < currlayer->algo->gridleft) cellpos.first = currlayer->algo->gridleft; if (cellpos.first > currlayer->algo->gridright) cellpos.first = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (cellpos.second < currlayer->algo->gridtop) cellpos.second = currlayer->algo->gridtop; if (cellpos.second > currlayer->algo->gridbottom) cellpos.second = currlayer->algo->gridbottom; } anchorx = cellpos.first; anchory = cellpos.second; // save original selection so it can be restored if user hits escape; // also used by RememberNewSelection currlayer->savesel = currlayer->currsel; // reset previous selection prevsel.Deselect(); // for avoiding 1x1 selection if mouse doesn't move much initselx = x; initsely = y; // allow changing size in any direction forceh = false; forcev = false; if (SelectionExists()) { if (shiftdown) { // modify current selection currlayer->currsel.Modify(cellpos.first, cellpos.second, anchorx, anchory, &forceh, &forcev); DisplaySelectionSize(); } else { // remove current selection currlayer->currsel.Deselect(); } // allow mouse interaction if script is running bool saveinscript = inscript; inscript = false; mainptr->UpdatePatternAndStatus(); inscript = saveinscript; } selectingcells = true; CaptureMouse(); // get mouse up event even if outside view dragtimer->Start(DRAG_RATE); // see OnDragTimer } // ----------------------------------------------------------------------------- void PatternView::SelectCells(int x, int y) { // only select cells within view if (x < 0) x = 0; if (y < 0) y = 0; if (x > currlayer->view->getxmax()) x = currlayer->view->getxmax(); if (y > currlayer->view->getymax()) y = currlayer->view->getymax(); if ( abs(initselx - x) < 2 && abs(initsely - y) < 2 && !SelectionExists() ) { // avoid 1x1 selection if mouse hasn't moved much return; } // make sure x,y is within bounded grid pair cellpos = currlayer->view->at(x, y); if (currlayer->algo->gridwd > 0) { if (cellpos.first < currlayer->algo->gridleft) cellpos.first = currlayer->algo->gridleft; if (cellpos.first > currlayer->algo->gridright) cellpos.first = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (cellpos.second < currlayer->algo->gridtop) cellpos.second = currlayer->algo->gridtop; if (cellpos.second > currlayer->algo->gridbottom) cellpos.second = currlayer->algo->gridbottom; } if (!forcev) currlayer->currsel.SetLeftRight(cellpos.first, anchorx); if (!forceh) currlayer->currsel.SetTopBottom(cellpos.second, anchory); if (currlayer->currsel != prevsel) { // selection has changed DisplaySelectionSize(); prevsel = currlayer->currsel; // allow mouse interaction if script is running bool saveinscript = inscript; inscript = false; mainptr->UpdatePatternAndStatus(); inscript = saveinscript; } } // ----------------------------------------------------------------------------- void PatternView::StartMovingView(int x, int y) { pair cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; movingview = true; CaptureMouse(); // get mouse up event even if outside view dragtimer->Start(DRAG_RATE); // see OnDragTimer } // ----------------------------------------------------------------------------- void PatternView::MoveView(int x, int y) { pair cellpos = currlayer->view->at(x, y); bigint newx = cellpos.first; bigint newy = cellpos.second; bigint xdelta = bigcellx; bigint ydelta = bigcelly; xdelta -= newx; ydelta -= newy; int xamount, yamount; int mag = currlayer->view->getmag(); if (mag >= 0) { // move an integral number of cells xamount = xdelta.toint() << mag; yamount = ydelta.toint() << mag; } else { // convert cell deltas to screen pixels xdelta >>= -mag; ydelta >>= -mag; xamount = xdelta.toint(); yamount = ydelta.toint(); } if ( xamount != 0 || yamount != 0 ) { currlayer->view->move(xamount, yamount); // allow mouse interaction if script is running bool saveinscript = inscript; inscript = false; mainptr->UpdatePatternAndStatus(); inscript = saveinscript; cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; } // need to update scroll bars if grid is bounded if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { UpdateScrollBars(); } } // ----------------------------------------------------------------------------- void PatternView::StopDraggingMouse() { if ( HasCapture() ) ReleaseMouse(); if ( dragtimer->IsRunning() ) dragtimer->Stop(); if (selectingcells) { if (allowundo) RememberNewSelection(_("Selection")); selectingcells = false; // tested by CanUndo mainptr->UpdateMenuItems(true); // enable various Edit menu items if (allowundo) UpdateEditBar(true); // update Undo/Redo buttons } if (drawingcells && allowundo) { // MarkLayerDirty (in ShowDrawing) has set dirty flag, so we need to // pass in the flag state saved before drawing started currlayer->undoredo->RememberCellChanges(_("Drawing"), currlayer->savedirty); drawingcells = false; // tested by CanUndo mainptr->UpdateMenuItems(true); // enable Undo item UpdateEditBar(true); // update Undo/Redo buttons } if (clickedcontrol > NO_CONTROL) { if (currcontrol == clickedcontrol && !PANNING_CONTROL) { // only do non-panning function when button is released ProcessClickedControl(); } clickedcontrol = NO_CONTROL; currcontrol = NO_CONTROL; RefreshRect(controlsrect, false); Update(); } drawingcells = false; selectingcells = false; movingview = false; CheckCursor(true); } // ----------------------------------------------------------------------------- void PatternView::RestoreSelection() { currlayer->currsel = currlayer->savesel; StopDraggingMouse(); // allow mouse interaction if script is running bool saveinscript = inscript; inscript = false; mainptr->UpdatePatternAndStatus(); inscript = saveinscript; statusptr->DisplayMessage(_("New selection aborted.")); } // ----------------------------------------------------------------------------- void PatternView::TestAutoFit() { if (currlayer->autofit && mainptr->generating) { // assume user no longer wants us to do autofitting currlayer->autofit = false; } } // ----------------------------------------------------------------------------- void PatternView::ZoomInPos(int x, int y) { // zoom in so that clicked cell stays under cursor TestAutoFit(); if (currlayer->view->getmag() < MAX_MAG) { currlayer->view->zoom(x, y); // allow mouse interaction if script is running bool saveinscript = inscript; inscript = false; mainptr->UpdatePatternAndStatus(); bigview->UpdateScrollBars(); inscript = saveinscript; } else { Beep(); // can't zoom in any further } } // ----------------------------------------------------------------------------- void PatternView::ZoomOutPos(int x, int y) { // zoom out so that clicked cell stays under cursor TestAutoFit(); currlayer->view->unzoom(x, y); // allow mouse interaction if script is running bool saveinscript = inscript; inscript = false; mainptr->UpdatePatternAndStatus(); bigview->UpdateScrollBars(); inscript = saveinscript; } // ----------------------------------------------------------------------------- void PatternView::SetViewSize(int wd, int ht) { // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; if (tileindex < 0) { // use main viewport window's size to reset viewport in each layer ResizeLayers(wd, ht); } // only autofit when generating if (currlayer->autofit && mainptr && mainptr->generating) currlayer->algo->fit(*currlayer->view, 0); // update position of translucent controls switch (controlspos) { case 1: // top left corner controlsrect = wxRect(0, 0, controlswd, controlsht); break; case 2: // top right corner controlsrect = wxRect(wd - controlswd, 0, controlswd, controlsht); break; case 3: // bottom right corner controlsrect = wxRect(wd - controlswd, ht - controlsht, controlswd, controlsht); break; case 4: // bottom left corner controlsrect = wxRect(0, ht - controlsht, controlswd, controlsht); break; default: // controlspos should be 0 (controls are disabled) controlsrect = wxRect(0, 0, 0, 0); } } // ----------------------------------------------------------------------------- void PatternView::OnPaint(wxPaintEvent& WXUNUSED(event)) { int wd, ht; GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; if ( numclones > 0 && numlayers > 1 && (stacklayers || tilelayers) ) SyncClones(); if ( numlayers > 1 && tilelayers ) { if ( tileindex >= 0 && ( wd != GetLayer(tileindex)->view->getwidth() || ht != GetLayer(tileindex)->view->getheight() ) ) { // might happen on Win/GTK??? GetLayer(tileindex)->view->resize(wd, ht); } } else if ( wd != currlayer->view->getwidth() || ht != currlayer->view->getheight() ) { // need to change viewport size; // can happen on Windows when resizing/maximizing main window SetViewSize(wd, ht); } #if defined(__WXMAC__) || defined(__WXGTK__) // windows on Mac OS X and GTK+ 2.0 are automatically buffered wxPaintDC dc(this); DrawView(dc, tileindex); #else if ( buffered || waitingforclick || GridVisible() || currlayer->currsel.Visible(NULL) || showcontrols || (numlayers > 1 && (stacklayers || tilelayers)) ) { // use wxWidgets buffering to avoid flicker if (wd != viewbitmapwd || ht != viewbitmapht) { // need to create a new bitmap for current viewport delete viewbitmap; viewbitmap = new wxBitmap(wd, ht); if (viewbitmap == NULL) Fatal(_("Not enough memory to do buffering!")); viewbitmapwd = wd; viewbitmapht = ht; } wxBufferedPaintDC dc(this, *viewbitmap); DrawView(dc, tileindex); } else { wxPaintDC dc(this); DrawView(dc, tileindex); } #endif } // ----------------------------------------------------------------------------- void PatternView::OnSize(wxSizeEvent& event) { int wd, ht; GetClientSize(&wd, &ht); // resize this viewport SetViewSize(wd, ht); event.Skip(); } // ----------------------------------------------------------------------------- #if defined(__WXMAC__) && wxCHECK_VERSION(2,9,0) // wxMOD_CONTROL has been changed to mean Command key down (sheesh!) #define wxMOD_CONTROL wxMOD_RAW_CONTROL #define ControlDown RawControlDown #endif void PatternView::OnKeyDown(wxKeyEvent& event) { #ifdef __WXMAC__ // close any open tool tip window (fixes wxMac bug?) wxToolTip::RemoveToolTips(); #endif statusptr->ClearMessage(); realkey = event.GetKeyCode(); int mods = event.GetModifiers(); // wxGTK 2.8.12 does not set modifier flag if shift key pressed by itself // so best to play safe and test wxMOD_SHIFT or wxMOD_NONE if (realkey == WXK_SHIFT && (mods == wxMOD_SHIFT || mods == wxMOD_NONE)) { // pressing unmodified shift key temporarily toggles the draw/pick cursors or // the zoom in/out cursors; note that Windows sends multiple key-down events // while shift key is pressed so we must be careful to toggle only once if (currlayer->curs == curs_pencil && oldcursor == NULL) { oldcursor = curs_pencil; SetCursorMode(curs_pick); mainptr->UpdateUserInterface(mainptr->IsActive()); } else if (currlayer->curs == curs_pick && oldcursor == NULL) { oldcursor = curs_pick; SetCursorMode(curs_pencil); mainptr->UpdateUserInterface(mainptr->IsActive()); } else if (currlayer->curs == curs_zoomin && oldcursor == NULL) { oldcursor = curs_zoomin; SetCursorMode(curs_zoomout); mainptr->UpdateUserInterface(mainptr->IsActive()); } else if (currlayer->curs == curs_zoomout && oldcursor == NULL) { oldcursor = curs_zoomout; SetCursorMode(curs_zoomin); mainptr->UpdateUserInterface(mainptr->IsActive()); } } else if (oldcursor) { // for any other key combo we restore the cursor immediately rather than // wait for the shift key to be released; this avoids problems with OnKeyUp // not being called if the shift key is used in a keyboard shortcut that // adds a new layer or opens another window SetCursorMode(oldcursor); oldcursor = NULL; mainptr->UpdateUserInterface(mainptr->IsActive()); } if (debuglevel == 1) { // set debugkey now but don't show it until OnChar debugkey = wxString::Format(_("OnKeyDown: key=%d (%c) mods=%d"), realkey, realkey < 128 ? wxChar(realkey) : wxChar('?'), mods); } // WARNING: logic must match that in KeyComboCtrl::OnKeyDown in wxprefs.cpp if (mods == wxMOD_NONE || realkey == WXK_ESCAPE || realkey > 127) { // tell OnChar handler to ignore realkey realkey = 0; } #ifdef __WXOSX__ // pass ctrl/cmd-key combos directly to OnChar if (realkey > 0 && ((mods & wxMOD_CONTROL) || (mods & wxMOD_CMD))) { OnChar(event); return; } #endif #ifdef __WXMAC__ // allow option-E/I/N/U/` (OnChar is not called for those key combos // although the prefs dialog KeyComboCtrl::OnChar *is* called) if (mods == wxMOD_ALT && (realkey == 'E' || realkey == 'I' || realkey == 'N' || realkey == 'U' || realkey == '`')) { OnChar(event); return; } #endif #ifdef __WXMSW__ // on Windows, OnChar is NOT called for some ctrl-key combos like // ctrl-0..9 or ctrl-alt-key, so we call OnChar ourselves if (realkey > 0 && (mods & wxMOD_CONTROL)) { OnChar(event); return; } #endif #ifdef __WXGTK__ if (realkey == ' ' && mods == wxMOD_SHIFT) { // fix wxGTK bug (curiously, the bug isn't seen in the prefs dialog); // OnChar won't see the shift modifier, so set realkey to a special // value to tell OnChar that shift-space was pressed realkey = -666; } #endif event.Skip(); } // ----------------------------------------------------------------------------- void PatternView::OnKeyUp(wxKeyEvent& event) { int key = event.GetKeyCode(); if (key == WXK_SHIFT) { // releasing shift key sets cursor back to original state if (oldcursor) { SetCursorMode(oldcursor); oldcursor = NULL; mainptr->UpdateUserInterface(mainptr->IsActive()); } } // no need to call event.Skip() here } // ----------------------------------------------------------------------------- void PatternView::OnChar(wxKeyEvent& event) { // get translated keyboard event int key = event.GetKeyCode(); int mods = event.GetModifiers(); if (debuglevel == 1) { debugkey += wxString::Format(_("\nOnChar: key=%d (%c) mods=%d"), key, key < 128 ? wxChar(key) : wxChar('?'), mods); Warning(debugkey); } // WARNING: logic must match that in KeyComboCtrl::OnChar in wxprefs.cpp if (realkey > 0 && mods != wxMOD_NONE) { #ifdef __WXGTK__ // sigh... wxGTK returns inconsistent results for shift-comma combos // so we assume that '<' is produced by pressing shift-comma // (which might only be true for US keyboards) if (key == '<' && (mods & wxMOD_SHIFT)) realkey = ','; #endif #ifdef __WXMSW__ // sigh... wxMSW returns inconsistent results for some shift-key combos // so again we assume we're using a US keyboard if (key == '~' && (mods & wxMOD_SHIFT)) realkey = '`'; if (key == '+' && (mods & wxMOD_SHIFT)) realkey = '='; #endif if (mods == wxMOD_SHIFT && key != realkey) { // use translated key code but remove shift key; // eg. we want shift-'/' to be seen as '?' mods = wxMOD_NONE; } else { // use key code seen by OnKeyDown key = realkey; if (key >= 'A' && key <= 'Z') key += 32; // convert A..Z to a..z } } #ifdef __WXGTK__ if (realkey == -666) { // OnKeyDown saw that shift-space was pressed but for some reason // OnChar doesn't see the modifier (ie. mods is wxMOD_NONE) key = ' '; mods = wxMOD_SHIFT; } #endif // do this check first because we allow user to make a selection while // generating a pattern or running a script if ( selectingcells && key == WXK_ESCAPE ) { RestoreSelection(); return; } if ( inscript && (passkeys || key == WXK_ESCAPE) ) { // let script decide what to do with the key PassKeyToScript(key, mods); return; } // test waitingforclick before mainptr->generating so user can cancel // a paste operation while generating if ( waitingforclick && key == WXK_ESCAPE ) { AbortPaste(); return; } if ( TimelineExists() && key == WXK_ESCAPE ) { if (currlayer->algo->isrecording()) { StartStopRecording(); // stop recording } else { PlayTimeline(0); // stop autoplay } return; } if ( mainptr->generating && key == WXK_ESCAPE ) { mainptr->Stop(); return; } ProcessKey(key, mods); } // ----------------------------------------------------------------------------- void PatternView::ProcessClickedControl() { switch (clickedcontrol) { case STEP1_CONTROL: if (TimelineExists()) { // reset autoplay speed to 0 (no delay, no frame skipping) ResetTimelineSpeed(); } else if (currlayer->currexpo != 0) { mainptr->SetStepExponent(0); statusptr->Refresh(false); } break; case SLOWER_CONTROL: mainptr->GoSlower(); break; case FASTER_CONTROL: mainptr->GoFaster(); break; case FIT_CONTROL: FitPattern(); break; case ZOOMIN_CONTROL: ZoomIn(); break; case ZOOMOUT_CONTROL: ZoomOut(); break; case NW_CONTROL: PanNW(); break; case UP_CONTROL: PanUp( SmallScroll(currlayer->view->getheight()) ); break; case NE_CONTROL: PanNE(); break; case LEFT_CONTROL: PanLeft( SmallScroll(currlayer->view->getwidth()) ); break; case MIDDLE_CONTROL: ViewOrigin(); break; case RIGHT_CONTROL: PanRight( SmallScroll(currlayer->view->getwidth()) ); break; case SW_CONTROL: PanSW(); break; case DOWN_CONTROL: PanDown( SmallScroll(currlayer->view->getheight()) ); break; case SE_CONTROL: PanSE(); break; default: // should never happen Warning(_("Bug detected in ProcessClickedControl!")); } // need to update viewport and status bar if script is running if (inscript) { inscript = false; mainptr->UpdatePatternAndStatus(); inscript = true; } } // ----------------------------------------------------------------------------- void PatternView::ProcessClick(int x, int y, int button, int modifiers) { // user has clicked x,y pixel in viewport if (button == wxMOUSE_BTN_LEFT) { if (currlayer->curs == curs_pencil) { if (!PointInGrid(x, y)) { // best not to clobber any status bar message displayed by script Warning(_("Drawing is not allowed outside grid.")); return; } if (inscript) { // best not to clobber any status bar message displayed by script Warning(_("Drawing is not allowed while a script is running.")); return; } if (TimelineExists()) { statusptr->ErrorMessage(_("Drawing is not allowed if there is a timeline.")); return; } if (currlayer->view->getmag() < 0) { statusptr->ErrorMessage(_("Drawing is not allowed at scales greater than 1 cell per pixel.")); return; } if (mainptr->generating) { // we allow drawing while generating mainptr->Stop(); mainptr->draw_pending = true; mainptr->mouseevent.m_x = x; mainptr->mouseevent.m_y = y; return; } StartDrawingCells(x, y); } else if (currlayer->curs == curs_pick) { if (!PointInGrid(x, y)) { // best not to clobber any status bar message displayed by script Warning(_("Picking is not allowed outside grid.")); return; } if (inscript) { // best not to clobber any status bar message displayed by script Warning(_("Picking is not allowed while a script is running.")); return; } if (currlayer->view->getmag() < 0) { statusptr->ErrorMessage(_("Picking is not allowed at scales greater than 1 cell per pixel.")); return; } PickCell(x, y); } else if (currlayer->curs == curs_cross) { TestAutoFit(); StartSelectingCells(x, y, (modifiers & wxMOD_SHIFT) != 0); } else if (currlayer->curs == curs_hand) { TestAutoFit(); StartMovingView(x, y); } else if (currlayer->curs == curs_zoomin) { ZoomInPos(x, y); } else if (currlayer->curs == curs_zoomout) { ZoomOutPos(x, y); } } else if (button == wxMOUSE_BTN_RIGHT) { // reverse the usual zoom direction if (currlayer->curs == curs_zoomin) { ZoomOutPos(x, y); } else if (currlayer->curs == curs_zoomout) { ZoomInPos(x, y); } } else if (button == wxMOUSE_BTN_MIDDLE) { // do nothing -- Golly currently doesn't use the middle button } mainptr->UpdateUserInterface(mainptr->IsActive()); } // ----------------------------------------------------------------------------- static int GetMouseModifiers(wxMouseEvent& event) { int modbits = wxMOD_NONE; if (event.AltDown()) modbits |= wxMOD_ALT; if (event.CmdDown()) modbits |= wxMOD_CMD; if (event.ControlDown()) modbits |= wxMOD_CONTROL; if (event.MetaDown()) modbits |= wxMOD_META; if (event.ShiftDown()) modbits |= wxMOD_SHIFT; return modbits; } // ----------------------------------------------------------------------------- void PatternView::OnMouseDown(wxMouseEvent& event) { int x = event.GetX(); int y = event.GetY(); int button = event.GetButton(); int modifiers = GetMouseModifiers(event); if (waitingforclick && button == wxMOUSE_BTN_LEFT) { // save paste location pastex = x; pastey = y; waitingforclick = false; return; } statusptr->ClearMessage(); mainptr->showbanner = false; if (numlayers > 1 && tilelayers && tileindex < 0) { // ignore click in tile border return; } if (tileindex >= 0 && tileindex != currindex) { // switch current layer to clicked tile SwitchToClickedTile(tileindex); return; } if (showcontrols) { currcontrol = WhichControl(x - controlsrect.x, y - controlsrect.y); if (currcontrol > NO_CONTROL) { clickedcontrol = currcontrol; // remember which control was clicked clicktime = stopwatch->Time(); // remember when clicked (in millisecs) CaptureMouse(); // get mouse up event even if outside view dragtimer->Start(DRAG_RATE); // see OnDragTimer RefreshRect(controlsrect, false); // redraw clicked button #ifdef __WXGTK__ // nicer to see change immediately on Linux Update(); #endif if (PANNING_CONTROL) { // scroll immediately ProcessClickedControl(); } } return; } if (inscript && passclicks && PointInGrid(x, y)) { // let script decide what to do with click in grid pair cellpos = currlayer->view->at(x, y); PassClickToScript(cellpos.first, cellpos.second, button, modifiers); return; } ProcessClick(x, y, button, modifiers); } // ----------------------------------------------------------------------------- void PatternView::OnMouseUp(wxMouseEvent& WXUNUSED(event)) { if (drawingcells || selectingcells || movingview || clickedcontrol > NO_CONTROL) { StopDraggingMouse(); } else if (mainptr->draw_pending) { // this can happen if user does a quick click while pattern is generating, // so set a special flag to force drawing to terminate stopdrawing = true; } } // ----------------------------------------------------------------------------- #if wxCHECK_VERSION(2, 8, 0) // mouse capture can be lost on Windows before mouse-up event void PatternView::OnMouseCaptureLost(wxMouseCaptureLostEvent& WXUNUSED(event)) { if (drawingcells || selectingcells || movingview || clickedcontrol > NO_CONTROL) { StopDraggingMouse(); } } #endif // ----------------------------------------------------------------------------- void PatternView::OnMouseMotion(wxMouseEvent& event) { statusptr->CheckMouseLocation(mainptr->IsActive()); // check if translucent controls need to be shown/hidden if (mainptr->IsActive()) { wxPoint pt( event.GetX(), event.GetY() ); bool show = (controlsrect.Contains(pt) || clickedcontrol > NO_CONTROL) && !(drawingcells || selectingcells || movingview || waitingforclick) && !(numlayers > 1 && tilelayers && tileindex != currindex); if (showcontrols != show) { // let CheckCursor set showcontrols and call RefreshRect CheckCursor(true); } } // we do the following test to ensure ReleaseMouse() gets called // (in case OnMouseUp doesn't get called when it should) if (drawingcells || selectingcells || movingview || clickedcontrol > NO_CONTROL) { // check if no mouse buttons are being pressed if (!event.Dragging()) StopDraggingMouse(); } } // ----------------------------------------------------------------------------- void PatternView::OnMouseEnter(wxMouseEvent& WXUNUSED(event)) { // Win bug??? we don't get this event if CaptureMouse has been called CheckCursor(mainptr->IsActive()); // no need to call CheckMouseLocation here (OnMouseMotion will be called) } // ----------------------------------------------------------------------------- void PatternView::OnMouseExit(wxMouseEvent& WXUNUSED(event)) { // Win bug??? we don't get this event if CaptureMouse has been called CheckCursor(mainptr->IsActive()); statusptr->CheckMouseLocation(mainptr->IsActive()); } // ----------------------------------------------------------------------------- void PatternView::OnMouseWheel(wxMouseEvent& event) { // wheelpos should be persistent, because in theory we should keep track of // the remainder if the amount scrolled was not an even number of deltas. static int wheelpos = 0; int delta, x, y; if (mousewheelmode == 0) { // ignore wheel, according to user preference event.Skip(); return; } // delta is the amount that represents one "step" of rotation. Normally 120. delta = event.GetWheelDelta(); x = event.GetX(); y = event.GetY(); if (mousewheelmode == 2) wheelpos -= event.GetWheelRotation(); else wheelpos += event.GetWheelRotation(); while (wheelpos >= delta) { wheelpos -= delta; TestAutoFit(); currlayer->view->unzoom(x, y); } while (wheelpos <= -delta) { wheelpos += delta; TestAutoFit(); if (currlayer->view->getmag() < MAX_MAG) { currlayer->view->zoom(x, y); } else { Beep(); wheelpos = 0; break; // best not to beep lots of times } } // allow mouse interaction if script is running bool saveinscript = inscript; inscript = false; mainptr->UpdatePatternAndStatus(); bigview->UpdateScrollBars(); inscript = saveinscript; // do following after restoring inscript so we don't change stop button if inscript mainptr->UpdateUserInterface(mainptr->IsActive()); } // ----------------------------------------------------------------------------- void PatternView::OnDragTimer(wxTimerEvent& WXUNUSED(event)) { // called periodically while drawing/selecting/moving // or if user has clicked a translucent control and button is still down wxPoint pt = ScreenToClient( wxGetMousePosition() ); int x = pt.x; int y = pt.y; if (clickedcontrol > NO_CONTROL) { control_id oldcontrol = currcontrol; currcontrol = WhichControl(x - controlsrect.x, y - controlsrect.y); if (currcontrol == clickedcontrol) { if (PANNING_CONTROL && stopwatch->Time() - clicktime > 300) { // panning can be repeated while button is pressed, but only after // a short pause (0.3 secs) from the time the button was clicked // (this matches the way scroll buttons work on Mac/Windows) ProcessClickedControl(); } } else { currcontrol = NO_CONTROL; } if (currcontrol != oldcontrol) RefreshRect(controlsrect, false); return; } // don't test "!PointInView(x, y)" here -- we want to allow scrolling // in full screen mode when mouse is at outer edge of view if ( x <= 0 || x >= currlayer->view->getxmax() || y <= 0 || y >= currlayer->view->getymax() ) { // user can disable scrolling if ( drawingcells && !scrollpencil ) { DrawCells(x, y); return; } if ( selectingcells && !scrollcross ) { SelectCells(x, y); return; } if ( movingview && !scrollhand ) { // make sure x,y is within viewport if (x < 0) x = 0; if (y < 0) y = 0; if (x > currlayer->view->getxmax()) x = currlayer->view->getxmax(); if (y > currlayer->view->getymax()) y = currlayer->view->getymax(); MoveView(x, y); return; } // scroll view int xamount = 0; int yamount = 0; if (x <= 0) xamount = -SmallScroll( currlayer->view->getwidth() ); if (y <= 0) yamount = -SmallScroll( currlayer->view->getheight() ); if (x >= currlayer->view->getxmax()) xamount = SmallScroll( currlayer->view->getwidth() ); if (y >= currlayer->view->getymax()) yamount = SmallScroll( currlayer->view->getheight() ); if ( drawingcells ) { currlayer->view->move(xamount, yamount); mainptr->UpdatePatternAndStatus(); } else if ( selectingcells ) { currlayer->view->move(xamount, yamount); // no need to call UpdatePatternAndStatus() here because // it will be called soon in SelectCells, except in this case: if (forceh || forcev || currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { // selection might not change so must update pattern RefreshView(); // need to update now if script is running if (inscript) { inscript = false; mainptr->UpdatePatternAndStatus(); inscript = true; } } } else if ( movingview ) { // scroll in opposite direction, and if both amounts are non-zero then // set both to same (larger) absolute value so user can scroll at 45 degrees if ( xamount != 0 && yamount != 0 ) { if ( abs(xamount) > abs(yamount) ) { yamount = yamount < 0 ? -abs(xamount) : abs(xamount); } else { xamount = xamount < 0 ? -abs(yamount) : abs(yamount); } } currlayer->view->move(-xamount, -yamount); // allow mouse interaction if script is running bool saveinscript = inscript; inscript = false; mainptr->UpdatePatternAndStatus(); inscript = saveinscript; // adjust x,y and bigcellx,bigcelly for MoveView call below x += xamount; y += yamount; pair cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; } // need to update scroll bars if grid is bounded if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { UpdateScrollBars(); } } if ( drawingcells ) { DrawCells(x, y); } else if ( selectingcells ) { SelectCells(x, y); } else if ( movingview ) { MoveView(x, y); } } // ----------------------------------------------------------------------------- void PatternView::OnScroll(wxScrollWinEvent& event) { WXTYPE type = event.GetEventType(); int orient = event.GetOrientation(); if (type == wxEVT_SCROLLWIN_LINEUP) { if (orient == wxHORIZONTAL) PanLeft( SmallScroll(currlayer->view->getwidth()) ); else PanUp( SmallScroll(currlayer->view->getheight()) ); } else if (type == wxEVT_SCROLLWIN_LINEDOWN) { if (orient == wxHORIZONTAL) PanRight( SmallScroll(currlayer->view->getwidth()) ); else PanDown( SmallScroll(currlayer->view->getheight()) ); } else if (type == wxEVT_SCROLLWIN_PAGEUP) { if (orient == wxHORIZONTAL) PanLeft( BigScroll(currlayer->view->getwidth()) ); else PanUp( BigScroll(currlayer->view->getheight()) ); } else if (type == wxEVT_SCROLLWIN_PAGEDOWN) { if (orient == wxHORIZONTAL) PanRight( BigScroll(currlayer->view->getwidth()) ); else PanDown( BigScroll(currlayer->view->getheight()) ); } else if (type == wxEVT_SCROLLWIN_THUMBTRACK) { int newpos = event.GetPosition(); int amount = newpos - (orient == wxHORIZONTAL ? hthumb : vthumb); if (amount != 0) { TestAutoFit(); if (currlayer->view->getmag() > 0) { // amount is in cells so convert to pixels amount = amount << currlayer->view->getmag(); } if (orient == wxHORIZONTAL) { hthumb = newpos; currlayer->view->move(amount, 0); // don't call UpdateEverything here because it calls UpdateScrollBars RefreshView(); // don't Update() immediately -- more responsive } else { vthumb = newpos; currlayer->view->move(0, amount); // don't call UpdateEverything here because it calls UpdateScrollBars RefreshView(); // don't Update() immediately -- more responsive } } } else if (type == wxEVT_SCROLLWIN_THUMBRELEASE) { // now we can call UpdateScrollBars mainptr->UpdateEverything(); } // need an update if script is running if (inscript && type != wxEVT_SCROLLWIN_THUMBTRACK) { inscript = false; mainptr->UpdatePatternAndStatus(); bigview->UpdateScrollBars(); inscript = true; } } // ----------------------------------------------------------------------------- void PatternView::OnEraseBackground(wxEraseEvent& WXUNUSED(event)) { // do nothing because we'll be painting the entire viewport // why does this get called even though we always call Refresh(false)??? // and why does bg still get erased (on Mac and GTK, but not Windows)??? // note that eraseBack parameter in wxWindowMac::Refresh in window.cpp is never used! } // ----------------------------------------------------------------------------- // create the viewport window PatternView::PatternView(wxWindow* parent, wxCoord x, wxCoord y, int wd, int ht, long style) : wxWindow(parent, wxID_ANY, wxPoint(x,y), wxSize(wd,ht), style) { dragtimer = new wxTimer(this, wxID_ANY); if (dragtimer == NULL) Fatal(_("Failed to create drag timer!")); cellbrush = new wxBrush(*wxBLACK_BRUSH); if (cellbrush == NULL) Fatal(_("Failed to create cell brush!")); // avoid erasing background on GTK+ -- doesn't work!!! SetBackgroundStyle(wxBG_STYLE_CUSTOM); // force viewbitmap to be created in first OnPaint call viewbitmap = NULL; viewbitmapwd = -1; viewbitmapht = -1; drawingcells = false; // not drawing cells selectingcells = false; // not selecting cells movingview = false; // not moving view waitingforclick = false; // not waiting for user to click nopattupdate = false; // enable pattern updates showcontrols = false; // not showing translucent controls oldcursor = NULL; // for toggling cursor via shift key } // ----------------------------------------------------------------------------- // destroy the viewport window PatternView::~PatternView() { delete dragtimer; delete viewbitmap; delete cellbrush; } golly-2.5-src/gui-wx/makefile-gtk0000644000175100001440000002354212156145314013724 00000000000000# Makefile for GTK version of Golly using wxWidgets. # It assumes you've built and installed wxWidgets with commands like these: # # cd # mkdir buildgtk # cd buildgtk # ../configure --with-gtk --disable-shared --enable-unicode # (depending on your g++ version you might also need --disable-precomp-headers) # make # su # make install # ldconfig APP_VERSION = 2.5 # these directory paths are relative to the location of this makefile: EXEDIR = .. DOCSDIR = ../docs BASEDIR = ../gollybase CMDDIR = ../cmdline # for building binary and source distributions: RELEASENAME = $(EXEDIR)/golly-$(APP_VERSION) SHAREDFILES = $(EXEDIR)/Help $(EXEDIR)/Patterns $(EXEDIR)/Scripts $(EXEDIR)/Rules EXEFILES = $(EXEDIR)/golly $(EXEDIR)/bgolly DOCFILES = $(DOCSDIR)/ReadMe.html $(DOCSDIR)/License.html SRCFILES = $(DOCSDIR) $(BASEDIR) $(CMDDIR) GUIFILES = CMakeLists.txt makefile-gtk makefile-mac makefile-win local-win-template.mk \ golly.rc Info.plist.in wx*.h wx*.cpp configure bitmaps icons CXXC = g++ CXXFLAGS := -DVERSION=$(APP_VERSION) -DGOLLYDIR="$(GOLLYDIR)" \ -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -I$(BASEDIR) \ -O5 -Wall -Wno-non-virtual-dtor -fno-strict-aliasing $(CXXFLAGS) LDFLAGS := -Wl,--as-needed $(LDFLAGS) # for Perl script support PERL_INCLUDE = `perl -MExtUtils::Embed -e ccopts` # note that we must link in the Perl library if the Perl version is older # than 5.10 (this is necessary because boot_DynaLoader is in DynaLoader.a); # if using 5.10 or later we can dynamically load the Perl library because # it contains the boot_DynaLoader code PERL_LINK = `perl -MExtUtils::Embed -e '$$]<5.010 && ldopts'` PERL_SHLIB = libperl.so.5.10 # TODO: figure out how to do this dynamically PERL_PREFS = -DPERL_SHLIB="$(PERL_SHLIB)" # for Python script support PYTHON_INCLUDE = -I`python -c "import distutils.sysconfig; print distutils.sysconfig.get_python_inc()"` # we don't want to link against a specific library: PYTHON_LINK = -lpython2.3 # following generates "-Xlinker -export-dynamic" but doesn't seem to be needed # PYTHON_LINK = `python -c "import distutils.sysconfig; print distutils.sysconfig.get_config_var('LINKFORSHARED')"` PYTHON_LINK = # the following determines the filename for the python dynamic library (e.g. libpython2.5.so) PYTHON_SHLIB = `python -c "import distutils.sysconfig; print distutils.sysconfig.get_config_var('LDLIBRARY')"` PYTHON_PREFS = -DPYTHON_SHLIB="$(PYTHON_SHLIB)" # default settings for zlib support, so clear these to build without zlib ZLIB_CXXFLAGS = -DZLIB ZLIB_LDFLAGS = -lz # for wxGTK support (required for GUI) WX_CXXFLAGS = `wx-config --cxxflags` WX_LDFLAGS = `wx-config --libs` OBJDIR = ObjGTK BASEH = $(BASEDIR)/bigint.h $(BASEDIR)/ghashbase.h $(BASEDIR)/hlifealgo.h $(BASEDIR)/jvnalgo.h \ $(BASEDIR)/lifealgo.h $(BASEDIR)/lifepoll.h $(BASEDIR)/liferender.h $(BASEDIR)/liferules.h \ $(BASEDIR)/platform.h $(BASEDIR)/qlifealgo.h $(BASEDIR)/readpattern.h $(BASEDIR)/util.h $(BASEDIR)/viewport.h \ $(BASEDIR)/writepattern.h $(BASEDIR)/ruletreealgo.h $(BASEDIR)/generationsalgo.h $(BASEDIR)/ruletable_algo.h \ $(BASEDIR)/ruleloaderalgo.h BASEOBJ = $(OBJDIR)/bigint.o $(OBJDIR)/lifealgo.o $(OBJDIR)/hlifealgo.o \ $(OBJDIR)/hlifedraw.o $(OBJDIR)/qlifealgo.o $(OBJDIR)/qlifedraw.o \ $(OBJDIR)/jvnalgo.o $(OBJDIR)/ruletreealgo.o $(OBJDIR)/ruletable_algo.o $(OBJDIR)/ruleloaderalgo.o \ $(OBJDIR)/ghashbase.o $(OBJDIR)/ghashdraw.o $(OBJDIR)/readpattern.o \ $(OBJDIR)/writepattern.o $(OBJDIR)/liferules.o $(OBJDIR)/util.o \ $(OBJDIR)/liferender.o $(OBJDIR)/viewport.o $(OBJDIR)/lifepoll.o \ $(OBJDIR)/generationsalgo.o WXH = wxalgos.h wxedit.h wxgolly.h wxhelp.h wxinfo.h wxlayer.h wxmain.h \ wxperl.h wxprefs.h wxpython.h wxrender.h wxrule.h wxscript.h wxselect.h wxstatus.h \ wxtimeline.h wxundo.h wxutils.h wxview.h WXOBJ = $(OBJDIR)/wxutils.o $(OBJDIR)/wxprefs.o $(OBJDIR)/wxalgos.o $(OBJDIR)/wxrule.o \ $(OBJDIR)/wxinfo.o $(OBJDIR)/wxhelp.o $(OBJDIR)/wxstatus.o $(OBJDIR)/wxview.o \ $(OBJDIR)/wxrender.o $(OBJDIR)/wxscript.o $(OBJDIR)/wxperl.o $(OBJDIR)/wxpython.o \ $(OBJDIR)/wxfile.o $(OBJDIR)/wxedit.o $(OBJDIR)/wxcontrol.o $(OBJDIR)/wxtimeline.o \ $(OBJDIR)/wxundo.o $(OBJDIR)/wxselect.o $(OBJDIR)/wxlayer.o $(OBJDIR)/wxmain.o $(OBJDIR)/wxgolly.o all: $(OBJDIR) golly bgolly $(BASEOBJ): $(BASEH) $(WXOBJ): $(BASEH) $(WXH) icons/appicon.xpm bitmaps/*.xpm $(OBJDIR): mkdir -p $(OBJDIR) clean: rm -f $(OBJDIR)/*.o rm -f $(EXEDIR)/golly $(EXEDIR)/bgolly $(EXEDIR)/RuleTableToTree golly: $(OBJDIR) $(BASEOBJ) $(WXOBJ) $(CXXC) $(CXXFLAGS) -o $(EXEDIR)/golly $(BASEOBJ) $(WXOBJ) $(LDFLAGS) $(ZLIB_LDFLAGS) $(WX_LDFLAGS) $(PYTHON_LINK) $(PERL_LINK) bgolly: $(OBJDIR) $(BASEOBJ) $(OBJDIR)/bgolly.o $(CXXC) $(CXXFLAGS) -o $(EXEDIR)/bgolly $(BASEOBJ) $(OBJDIR)/bgolly.o $(LDFLAGS) $(ZLIB_LDFLAGS) RuleTableToTree: $(OBJDIR) $(BASEOBJ) $(OBJDIR)/RuleTableToTree.o $(CXXC) $(CXXFLAGS) -o $(EXEDIR)/RuleTableToTree $(BASEOBJ) $(OBJDIR)/RuleTableToTree.o $(LDFLAGS) $(ZLIB_LDFLAGS) $(OBJDIR)/bgolly.o: $(CMDDIR)/bgolly.cpp $(CXXC) $(CXXFLAGS) $(ZLIB_CXXFLAGS) -c -o $@ $(CMDDIR)/bgolly.cpp $(OBJDIR)/RuleTableToTree.o: $(CMDDIR)/RuleTableToTree.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(CMDDIR)/RuleTableToTree.cpp $(OBJDIR)/bigint.o: $(BASEDIR)/bigint.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/bigint.cpp $(OBJDIR)/lifealgo.o: $(BASEDIR)/lifealgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/lifealgo.cpp $(OBJDIR)/hlifealgo.o: $(BASEDIR)/hlifealgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/hlifealgo.cpp $(OBJDIR)/hlifedraw.o: $(BASEDIR)/hlifedraw.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/hlifedraw.cpp $(OBJDIR)/qlifealgo.o: $(BASEDIR)/qlifealgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/qlifealgo.cpp $(OBJDIR)/qlifedraw.o: $(BASEDIR)/qlifedraw.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/qlifedraw.cpp $(OBJDIR)/jvnalgo.o: $(BASEDIR)/jvnalgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/jvnalgo.cpp $(OBJDIR)/ruleloaderalgo.o: $(BASEDIR)/ruleloaderalgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ruleloaderalgo.cpp $(OBJDIR)/ruletable_algo.o: $(BASEDIR)/ruletable_algo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ruletable_algo.cpp $(OBJDIR)/ruletreealgo.o: $(BASEDIR)/ruletreealgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ruletreealgo.cpp $(OBJDIR)/generationsalgo.o: $(BASEDIR)/generationsalgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/generationsalgo.cpp $(OBJDIR)/ghashbase.o: $(BASEDIR)/ghashbase.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ghashbase.cpp $(OBJDIR)/ghashdraw.o: $(BASEDIR)/ghashdraw.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ghashdraw.cpp $(OBJDIR)/liferules.o: $(BASEDIR)/liferules.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/liferules.cpp $(OBJDIR)/liferender.o: $(BASEDIR)/liferender.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/liferender.cpp $(OBJDIR)/readpattern.o: $(BASEDIR)/readpattern.cpp $(CXXC) $(CXXFLAGS) $(ZLIB_CXXFLAGS) -c -o $@ $(BASEDIR)/readpattern.cpp $(OBJDIR)/writepattern.o: $(BASEDIR)/writepattern.cpp $(CXXC) $(CXXFLAGS) $(ZLIB_CXXFLAGS) -c -o $@ $(BASEDIR)/writepattern.cpp $(OBJDIR)/util.o: $(BASEDIR)/util.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/util.cpp $(OBJDIR)/viewport.o: $(BASEDIR)/viewport.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/viewport.cpp $(OBJDIR)/lifepoll.o: $(BASEDIR)/lifepoll.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/lifepoll.cpp $(OBJDIR)/wxutils.o: wxutils.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxutils.cpp $(OBJDIR)/wxprefs.o: wxprefs.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) $(PERL_PREFS) $(PYTHON_PREFS) -c -o $@ wxprefs.cpp $(OBJDIR)/wxalgos.o: wxalgos.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxalgos.cpp $(OBJDIR)/wxrule.o: wxrule.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxrule.cpp $(OBJDIR)/wxinfo.o: wxinfo.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxinfo.cpp $(OBJDIR)/wxhelp.o: wxhelp.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxhelp.cpp $(OBJDIR)/wxstatus.o: wxstatus.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxstatus.cpp $(OBJDIR)/wxview.o: wxview.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxview.cpp $(OBJDIR)/wxrender.o: wxrender.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxrender.cpp $(OBJDIR)/wxperl.o: wxperl.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) $(PERL_INCLUDE) -c -o $@ wxperl.cpp $(OBJDIR)/wxpython.o: wxpython.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) $(PYTHON_INCLUDE) -c -o $@ wxpython.cpp $(OBJDIR)/wxscript.o: wxscript.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxscript.cpp $(OBJDIR)/wxfile.o: wxfile.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxfile.cpp $(OBJDIR)/wxedit.o: wxedit.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxedit.cpp $(OBJDIR)/wxselect.o: wxselect.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxselect.cpp $(OBJDIR)/wxcontrol.o: wxcontrol.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxcontrol.cpp $(OBJDIR)/wxtimeline.o: wxtimeline.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxtimeline.cpp $(OBJDIR)/wxundo.o: wxundo.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxundo.cpp $(OBJDIR)/wxlayer.o: wxlayer.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxlayer.cpp $(OBJDIR)/wxmain.o: wxmain.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxmain.cpp $(OBJDIR)/wxgolly.o: wxgolly.cpp $(CXXC) $(CXXFLAGS) $(WX_CXXFLAGS) -c -o $@ wxgolly.cpp srcdist: -rm -rf $(RELEASENAME)-src mkdir $(RELEASENAME)-src mkdir $(RELEASENAME)-src/gui-wx cp -rp $(SRCFILES) $(SHAREDFILES) $(RELEASENAME)-src cp -rp $(GUIFILES) $(RELEASENAME)-src/gui-wx find $(RELEASENAME)-src -name '.[^.]*' -delete find $(RELEASENAME)-src/Scripts/Python -name '*.pyc' -delete tar -cf - ./$(RELEASENAME)-src | gzip > $(RELEASENAME)-src.tar.gz bindist: all -rm -rf $(RELEASENAME)-gtk mkdir $(RELEASENAME)-gtk install -s $(EXEFILES) $(RELEASENAME)-gtk cp -rp $(DOCFILES) $(SHAREDFILES) $(RELEASENAME)-gtk find $(RELEASENAME)-gtk -name '.[^.]*' -delete find $(RELEASENAME)-gtk/Scripts/Python -name '*.pyc' -delete tar -cf - ./$(RELEASENAME)-gtk | gzip > $(RELEASENAME)-gtk.tar.gz golly-2.5-src/gui-wx/makefile-mac0000644000175100001440000002633512156145314013702 00000000000000# Makefile for building a 64-bit Cocoa version of Golly using wxWidgets 2.9.x on Mac OS 10.6+. # It assumes you've built the wxWidgets libraries with commands like these: # # cd /HD/wxWidgets/wxWidgets-2.9.4 # mkdir build-osx # cd build-osx # ../configure --enable-unicode --disable-shared --with-osx_cocoa # make # In the lines below, change WX_DIR to where you installed wxWidgets, # change WXLIB_DIR to where you built the wx libraries, and change # WX_RELEASE to match your wxWidgets version (first two digits). WX_RELEASE = 2.9 WX_DIR = /HD/wxWidgets/wxWidgets-trunk WXLIB_DIR = $(WX_DIR)/build-osx WXINC_DIR = $(WXLIB_DIR)/lib/wx/include/osx_cocoa-unicode-static-$(WX_RELEASE) WXUNICODEFLAG = u APP_NAME = Golly APP_VERSION = 2.5 # these directory paths are relative to the location of this makefile: EXEDIR = .. DOCSDIR = ../docs BASEDIR = ../gollybase CMDDIR = ../cmdline # for building binary and source distributions: RELEASENAME = $(EXEDIR)/golly-$(APP_VERSION) SHAREDFILES = $(EXEDIR)/Help $(EXEDIR)/Patterns $(EXEDIR)/Scripts $(EXEDIR)/Rules BINFILES = $(EXEDIR)/$(APP_NAME).app $(EXEDIR)/bgolly \ $(DOCSDIR)/ReadMe.html $(DOCSDIR)/License.html SRCFILES = $(DOCSDIR) $(BASEDIR) $(CMDDIR) GUIFILES = CMakeLists.txt makefile-gtk makefile-mac makefile-win local-win-template.mk \ golly.rc Info.plist.in wx*.h wx*.cpp configure bitmaps icons # for Perl script support: # PERL_INCLUDE = `/usr/bin/perl -MExtUtils::Embed -e ccopts` # PERL_LINK = `/usr/bin/perl -MExtUtils::Embed -e ldopts` # above commands generate unwanted stuff (-arch i386 and -arch ppc) PERL_INCLUDE = -arch x86_64 -g -pipe -fno-common -DPERL_DARWIN -fno-strict-aliasing -I/usr/local/include -I/System/Library/Perl/5.10.0/darwin-thread-multi-2level/CORE PERL_LINK = -arch x86_64 -L/usr/local/lib -L/System/Library/Perl/5.10.0/darwin-thread-multi-2level/CORE -lperl -ldl -lm -lutil -lc # for Python script support: PYTHON_INCLUDE = -I`/usr/bin/python -c "import distutils.sysconfig; print distutils.sysconfig.get_python_inc()"` PYTHON_LINK = `/usr/bin/python -c "import distutils.sysconfig; print distutils.sysconfig.get_config_var('LINKFORSHARED')"` # Variables: LIBDIRNAME = $(WXLIB_DIR)/lib TOOLKIT = OSX_COCOA TOOLKIT_LOWERCASE = osx_cocoa TOOLKIT_VERSION = CXXC = g++ -mmacosx-version-min=10.6 CPPFLAGS = -DWX_PRECOMP -DNO_GCC_PRAGMA -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES \ -I${WXINC_DIR} -I${WX_DIR}/include \ -I$(BASEDIR) CXXFLAGS = -arch x86_64 \ -D__WX$(TOOLKIT)__ -DVERSION=$(APP_VERSION) $(CPPFLAGS) \ -DZLIB -O5 -Wall -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor \ -fno-strict-aliasing -fno-common LDFLAGS = -arch x86_64 \ -Wl,-dead_strip -Wl,-S \ -framework IOKit -framework Carbon -framework Cocoa -framework System # for bgolly: CXXBASE = -arch x86_64 \ -DVERSION=$(APP_VERSION) -DZLIB -O5 -Wall -Wno-ctor-dtor-privacy -Wno-non-virtual-dtor \ -fno-strict-aliasing -fno-common -I$(BASEDIR) LDBASE = -arch x86_64 -lz EXTRALIBS = -lz -lpthread -liconv EXTRALIBS_GUI = -framework WebKit -framework OpenGL -framework AudioToolbox OBJDIR = ObjOSX BASEH = $(BASEDIR)/bigint.h $(BASEDIR)/ghashbase.h $(BASEDIR)/hlifealgo.h $(BASEDIR)/jvnalgo.h \ $(BASEDIR)/lifealgo.h $(BASEDIR)/lifepoll.h $(BASEDIR)/liferender.h $(BASEDIR)/liferules.h \ $(BASEDIR)/platform.h $(BASEDIR)/qlifealgo.h $(BASEDIR)/readpattern.h $(BASEDIR)/util.h $(BASEDIR)/viewport.h \ $(BASEDIR)/writepattern.h $(BASEDIR)/ruletreealgo.h $(BASEDIR)/generationsalgo.h $(BASEDIR)/ruletable_algo.h \ $(BASEDIR)/ruleloaderalgo.h BASEOBJ = $(OBJDIR)/bigint.o $(OBJDIR)/lifealgo.o $(OBJDIR)/hlifealgo.o \ $(OBJDIR)/hlifedraw.o $(OBJDIR)/qlifealgo.o $(OBJDIR)/qlifedraw.o \ $(OBJDIR)/jvnalgo.o $(OBJDIR)/ruletreealgo.o $(OBJDIR)/ruletable_algo.o $(OBJDIR)/ruleloaderalgo.o \ $(OBJDIR)/ghashbase.o $(OBJDIR)/ghashdraw.o $(OBJDIR)/readpattern.o \ $(OBJDIR)/writepattern.o $(OBJDIR)/liferules.o $(OBJDIR)/util.o \ $(OBJDIR)/liferender.o $(OBJDIR)/viewport.o $(OBJDIR)/lifepoll.o \ $(OBJDIR)/generationsalgo.o WXH = wxalgos.h wxedit.h wxgolly.h wxhelp.h wxinfo.h wxlayer.h wxmain.h \ wxperl.h wxprefs.h wxpython.h wxrender.h wxrule.h wxscript.h wxselect.h wxstatus.h \ wxtimeline.h wxundo.h wxutils.h wxview.h WXOBJ = $(OBJDIR)/wxutils.o $(OBJDIR)/wxprefs.o $(OBJDIR)/wxalgos.o $(OBJDIR)/wxrule.o \ $(OBJDIR)/wxinfo.o $(OBJDIR)/wxhelp.o $(OBJDIR)/wxstatus.o $(OBJDIR)/wxview.o \ $(OBJDIR)/wxrender.o $(OBJDIR)/wxscript.o $(OBJDIR)/wxperl.o $(OBJDIR)/wxpython.o \ $(OBJDIR)/wxfile.o $(OBJDIR)/wxedit.o $(OBJDIR)/wxcontrol.o $(OBJDIR)/wxtimeline.o \ $(OBJDIR)/wxundo.o $(OBJDIR)/wxselect.o $(OBJDIR)/wxlayer.o $(OBJDIR)/wxmain.o $(OBJDIR)/wxgolly.o PORTNAME = $(TOOLKIT_LOWERCASE)$(TOOLKIT_VERSION) ###WXBASEPORT = _carbon ###WXDEBUGFLAG = d __WXLIB_HTML_p = -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)_html-$(WX_RELEASE) __WXLIB_ADV_p = -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)_adv-$(WX_RELEASE) __WXLIB_CORE_p = -lwx_$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG)_core-$(WX_RELEASE) __WXLIB_BASE_p = -lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)-$(WX_RELEASE) __WXLIB_NET_p = -lwx_base$(WXBASEPORT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)_net-$(WX_RELEASE) __LIB_TIFF_p = -lwxtiff$(WXDEBUGFLAG)-$(WX_RELEASE) __LIB_PNG_p = -lwxpng$(WXDEBUGFLAG)-$(WX_RELEASE) __LIB_JPEG_p = -lwxjpeg$(WXDEBUGFLAG)-$(WX_RELEASE) # Targets: all: $(OBJDIR) app.bin app_bundle bgolly $(BASEOBJ): $(BASEH) $(WXOBJ): $(BASEH) $(WXH) icons/appicon.xpm bitmaps/*.xpm $(OBJDIR): mkdir -p $(OBJDIR) clean: rm -f $(OBJDIR)/*.o $(EXEDIR)/bgolly $(EXEDIR)/RuleTableToTree rm -rf $(EXEDIR)/$(APP_NAME).app bgolly: $(BASEOBJ) $(OBJDIR)/bgolly.o $(CXXC) $(CXXBASE) -o $(EXEDIR)/bgolly $(BASEOBJ) $(OBJDIR)/bgolly.o $(LDBASE) RuleTableToTree: $(BASEOBJ) $(OBJDIR)/RuleTableToTree.o $(CXXC) $(CXXBASE) -o $(EXEDIR)/RuleTableToTree $(BASEOBJ) $(OBJDIR)/RuleTableToTree.o $(LDBASE) $(OBJDIR)/bgolly.o: $(CMDDIR)/bgolly.cpp $(CXXC) $(CXXBASE) -c -o $@ $(CMDDIR)/bgolly.cpp $(OBJDIR)/RuleTableToTree.o: $(CMDDIR)/RuleTableToTree.cpp $(CXXC) $(CXXBASE) -c -o $@ $(CMDDIR)/RuleTableToTree.cpp app.bin: $(BASEOBJ) $(WXOBJ) $(CXXC) -o $@ $(BASEOBJ) $(WXOBJ) $(LDFLAGS) -L$(LIBDIRNAME) $(__WXLIB_HTML_p) $(__WXLIB_ADV_p) \ $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_NET_p) $(__LIB_TIFF_p) $(__LIB_PNG_p) $(__LIB_JPEG_p) \ $(EXTRALIBS) $(EXTRALIBS_GUI) $(PERL_LINK) $(PYTHON_LINK) $(EXEDIR)/$(APP_NAME).app/Contents/PkgInfo: app.bin Info.plist.in \ icons/app.icns icons/file-mc.icns icons/file-rle.icns mkdir -p $(EXEDIR)/$(APP_NAME).app/Contents mkdir -p $(EXEDIR)/$(APP_NAME).app/Contents/MacOS mkdir -p $(EXEDIR)/$(APP_NAME).app/Contents/Resources sed -e "s/VERSION/$(APP_VERSION)/" \ Info.plist.in >$(EXEDIR)/$(APP_NAME).app/Contents/Info.plist echo -n "APPLGoLy" >$(EXEDIR)/$(APP_NAME).app/Contents/PkgInfo mv -f app.bin $(EXEDIR)/$(APP_NAME).app/Contents/MacOS/$(APP_NAME) cp -f icons/*.icns $(EXEDIR)/$(APP_NAME).app/Contents/Resources app_bundle: $(EXEDIR)/$(APP_NAME).app/Contents/PkgInfo $(OBJDIR)/bigint.o: $(BASEDIR)/bigint.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/bigint.cpp $(OBJDIR)/lifealgo.o: $(BASEDIR)/lifealgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/lifealgo.cpp $(OBJDIR)/hlifealgo.o: $(BASEDIR)/hlifealgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/hlifealgo.cpp $(OBJDIR)/hlifedraw.o: $(BASEDIR)/hlifedraw.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/hlifedraw.cpp $(OBJDIR)/qlifealgo.o: $(BASEDIR)/qlifealgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/qlifealgo.cpp $(OBJDIR)/qlifedraw.o: $(BASEDIR)/qlifedraw.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/qlifedraw.cpp $(OBJDIR)/jvnalgo.o: $(BASEDIR)/jvnalgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/jvnalgo.cpp $(OBJDIR)/ruleloaderalgo.o: $(BASEDIR)/ruleloaderalgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ruleloaderalgo.cpp $(OBJDIR)/ruletable_algo.o: $(BASEDIR)/ruletable_algo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ruletable_algo.cpp $(OBJDIR)/ruletreealgo.o: $(BASEDIR)/ruletreealgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ruletreealgo.cpp $(OBJDIR)/generationsalgo.o: $(BASEDIR)/generationsalgo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/generationsalgo.cpp $(OBJDIR)/ghashbase.o: $(BASEDIR)/ghashbase.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ghashbase.cpp $(OBJDIR)/ghashdraw.o: $(BASEDIR)/ghashdraw.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/ghashdraw.cpp $(OBJDIR)/liferules.o: $(BASEDIR)/liferules.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/liferules.cpp $(OBJDIR)/liferender.o: $(BASEDIR)/liferender.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/liferender.cpp $(OBJDIR)/readpattern.o: $(BASEDIR)/readpattern.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/readpattern.cpp $(OBJDIR)/writepattern.o: $(BASEDIR)/writepattern.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/writepattern.cpp $(OBJDIR)/util.o: $(BASEDIR)/util.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/util.cpp $(OBJDIR)/viewport.o: $(BASEDIR)/viewport.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/viewport.cpp $(OBJDIR)/lifepoll.o: $(BASEDIR)/lifepoll.cpp $(CXXC) $(CXXFLAGS) -c -o $@ $(BASEDIR)/lifepoll.cpp $(OBJDIR)/wxutils.o: wxutils.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxutils.cpp $(OBJDIR)/wxprefs.o: wxprefs.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxprefs.cpp $(OBJDIR)/wxalgos.o: wxalgos.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxalgos.cpp $(OBJDIR)/wxrule.o: wxrule.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxrule.cpp $(OBJDIR)/wxinfo.o: wxinfo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxinfo.cpp $(OBJDIR)/wxhelp.o: wxhelp.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxhelp.cpp $(OBJDIR)/wxstatus.o: wxstatus.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxstatus.cpp $(OBJDIR)/wxview.o: wxview.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxview.cpp $(OBJDIR)/wxrender.o: wxrender.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxrender.cpp $(OBJDIR)/wxperl.o: wxperl.cpp $(CXXC) $(CXXFLAGS) $(PERL_INCLUDE) -c -o $@ wxperl.cpp $(OBJDIR)/wxpython.o: wxpython.cpp $(CXXC) $(CXXFLAGS) $(PYTHON_INCLUDE) -c -o $@ wxpython.cpp $(OBJDIR)/wxscript.o: wxscript.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxscript.cpp $(OBJDIR)/wxfile.o: wxfile.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxfile.cpp $(OBJDIR)/wxedit.o: wxedit.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxedit.cpp $(OBJDIR)/wxselect.o: wxselect.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxselect.cpp $(OBJDIR)/wxcontrol.o: wxcontrol.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxcontrol.cpp $(OBJDIR)/wxtimeline.o: wxtimeline.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxtimeline.cpp $(OBJDIR)/wxundo.o: wxundo.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxundo.cpp $(OBJDIR)/wxlayer.o: wxlayer.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxlayer.cpp $(OBJDIR)/wxmain.o: wxmain.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxmain.cpp $(OBJDIR)/wxgolly.o: wxgolly.cpp $(CXXC) $(CXXFLAGS) -c -o $@ wxgolly.cpp srcdist: -rm -rf $(RELEASENAME)-src mkdir $(RELEASENAME)-src mkdir $(RELEASENAME)-src/gui-wx cp -rp $(SRCFILES) $(SHAREDFILES) $(RELEASENAME)-src cp -rp $(GUIFILES) $(RELEASENAME)-src/gui-wx find $(RELEASENAME)-src -name '.[^.]*' -delete find $(RELEASENAME)-src/Scripts/Python -name '*.pyc' -delete tar -cf - ./$(RELEASENAME)-src | gzip > $(RELEASENAME)-src.tar.gz bindist: all -rm -rf $(RELEASENAME)-mac mkdir $(RELEASENAME)-mac cp -rp $(BINFILES) $(SHAREDFILES) $(RELEASENAME)-mac find $(RELEASENAME)-mac -name '.[^.]*' -delete find $(RELEASENAME)-mac/Scripts/Python -name '*.pyc' -delete echo Now create zip archive of $(RELEASENAME)-mac golly-2.5-src/gui-wx/makefile-win0000755000175100001440000004367212156145314013745 00000000000000# Makefile for Windows version of Golly using wxWidgets. # # Use local-win-template.mk to create local-win.mk with paths to your installed libraries. # # Compile wxWidgets and Golly as below: # # On 32-bit Windows: (from a Visual Studio command prompt) # # Build wxWidgets: # cd \wxWidgets\build\msw # nmake -f makefile.vc BUILD=release RUNTIME_LIBS=static UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0 # Build Golly: # cd \golly\src # nmake -f makefile-win BUILD=release RUNTIME_LIBS=static UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0 # # On 64-bit Windows: (from a Visual Studio 64-bit command prompt) # # Build wxWidgets: # cd \wxWidgets\build\msw # nmake -f makefile.vc BUILD=release RUNTIME_LIBS=static UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0 TARGET_CPU=AMD64 # Build Golly: # cd \golly\src # nmake -f makefile-win BUILD=release RUNTIME_LIBS=static UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0 TARGET_CPU=AMD64 # # If you only build one wxWidgets configuration (e.g. 32-bit release) then you can edit # \wxWidgets\build\msw\config.vc with those options. Then you can build wxWidgets and Golly # simply with: # # Build wxWidgets: # cd \wxWidgets\build\msw # nmake -f makefile.vc # Build Golly: # cd \golly\src # nmake -f makefile-win # All system-dependent changes belong in local-win.mk !include local-win.mk ### Golly-related variables: ### APP_VERSION = 2.5 # these directory paths are relative to the location of this makefile: EXEDIR = .. DOCSDIR = ..\docs BASEDIR = ..\gollybase CMDDIR = ..\cmdline # for building binary and source distributions: RELEASENAME = $(EXEDIR)\golly-$(APP_VERSION) GUIFILES = CMakeLists.txt makefile-gtk makefile-mac makefile-win local-win-template.mk \ golly.rc Info.plist.in wx*.h wx*.cpp GUIDIRS = configure bitmaps icons BINFILES = $(EXEDIR)\Golly.exe $(EXEDIR)\bgolly.exe \ $(DOCSDIR)\ReadMe.html $(DOCSDIR)\License.html !if "$(TARGET_CPU)" == "AMD64" LIBDIRNAME = $(WX_DIR)\lib\vc_amd64_$(LIBTYPE_SUFFIX)$(CFG) WX_CPU_DEF = WX_CPU_AMD64 !else LIBDIRNAME = $(WX_DIR)\lib\vc_$(LIBTYPE_SUFFIX)$(CFG) WX_CPU_DEF = WX_CPU_X86 !endif SETUPHDIR = $(LIBDIRNAME)\$(PORTNAME)$(WXUNIVNAME)$(WXUNICODEFLAG)$(WXDEBUGFLAG) ### note that /wd4100 turns off annoying warnings about "unreferenced formal parameter" ### in wx 2.9 when debugging assertions are disabled CXXFLAGS = /M$(__RUNTIME_LIBS_8)$(__DEBUGRUNTIME_3) /DWIN32 \ $(__DEBUGINFO_0) /Fdgolly.pdb $(____DEBUGRUNTIME_2_p) \ $(__OPTIMIZEFLAG_4) $(__NO_VC_CRTDBG_p) /D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__NDEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) /I$(WX_DIR)\include /I$(SETUPHDIR) \ /W4 /wd4100 /I. $(__DLLFLAG_p) /D_WINDOWS /I$(WX_DIR)\samples /DNOPCH $(__RTTIFLAG_9) \ $(__EXCEPTIONSFLAG_10) $(CPPFLAGS) \ /D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_WARNINGS \ /EHsc /DVERSION=$(APP_VERSION) /DZLIB /I$(WX_DIR)\src\zlib /I$(BASEDIR) OBJDIR = ObjWin BASEH = $(BASEDIR)/bigint.h $(BASEDIR)/ghashbase.h $(BASEDIR)/hlifealgo.h $(BASEDIR)/jvnalgo.h \ $(BASEDIR)/lifealgo.h $(BASEDIR)/lifepoll.h $(BASEDIR)/liferender.h $(BASEDIR)/liferules.h \ $(BASEDIR)/platform.h $(BASEDIR)/qlifealgo.h $(BASEDIR)/readpattern.h $(BASEDIR)/util.h $(BASEDIR)/viewport.h \ $(BASEDIR)/writepattern.h $(BASEDIR)/ruletreealgo.h $(BASEDIR)/generationsalgo.h $(BASEDIR)/ruletable_algo.h \ $(BASEDIR)/ruleloaderalgo.h BASEOBJ = $(OBJDIR)/bigint.obj $(OBJDIR)/lifealgo.obj $(OBJDIR)/hlifealgo.obj \ $(OBJDIR)/hlifedraw.obj $(OBJDIR)/qlifealgo.obj $(OBJDIR)/qlifedraw.obj \ $(OBJDIR)/jvnalgo.obj $(OBJDIR)/ruletreealgo.obj \ $(OBJDIR)/ruletable_algo.obj $(OBJDIR)/ghashbase.obj $(OBJDIR)/ruleloaderalgo.obj \ $(OBJDIR)/ghashdraw.obj $(OBJDIR)/readpattern.obj \ $(OBJDIR)/writepattern.obj $(OBJDIR)/liferules.obj $(OBJDIR)/util.obj \ $(OBJDIR)/liferender.obj $(OBJDIR)/viewport.obj $(OBJDIR)/lifepoll.obj \ $(OBJDIR)/generationsalgo.obj WXH = wxalgos.h wxedit.h wxgolly.h wxhelp.h wxinfo.h wxlayer.h wxmain.h \ wxperl.h wxprefs.h wxpython.h wxrender.h wxrule.h wxscript.h wxselect.h wxstatus.h \ wxtimeline.h wxundo.h wxutils.h wxview.h WXOBJ = $(OBJDIR)/wxutils.obj $(OBJDIR)/wxprefs.obj $(OBJDIR)/wxalgos.obj \ $(OBJDIR)/wxrule.obj $(OBJDIR)/wxinfo.obj $(OBJDIR)/wxhelp.obj \ $(OBJDIR)/wxstatus.obj $(OBJDIR)/wxview.obj $(OBJDIR)/wxrender.obj \ $(OBJDIR)/wxscript.obj $(OBJDIR)/wxperl.obj $(OBJDIR)/wxpython.obj \ $(OBJDIR)/wxfile.obj $(OBJDIR)/wxedit.obj $(OBJDIR)/wxcontrol.obj \ $(OBJDIR)/wxtimeline.obj $(OBJDIR)/wxundo.obj $(OBJDIR)/wxlayer.obj \ $(OBJDIR)/wxmain.obj $(OBJDIR)/wxselect.obj $(OBJDIR)/wxgolly.obj ### Conditionally set variables: ### PORTNAME = msw !if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default" WXDEBUGFLAG = d !endif !if "$(DEBUG_FLAG)" == "1" WXDEBUGFLAG = d !endif !if "$(UNICODE)" == "1" WXUNICODEFLAG = u !endif !if "$(WXUNIV)" == "1" WXUNIVNAME = univ !endif !if "$(SHARED)" == "1" WXDLLFLAG = dll !endif !if "$(SHARED)" == "0" LIBTYPE_SUFFIX = lib !endif !if "$(SHARED)" == "1" LIBTYPE_SUFFIX = dll !endif !if "$(BUILD)" == "debug" && "$(DEBUG_INFO)" == "default" __DEBUGINFO_0 = /Zi !endif !if "$(BUILD)" == "release" && "$(DEBUG_INFO)" == "default" __DEBUGINFO_0 = !endif !if "$(DEBUG_INFO)" == "0" __DEBUGINFO_0 = !endif !if "$(DEBUG_INFO)" == "1" __DEBUGINFO_0 = /Zi !endif !if "$(BUILD)" == "debug" && "$(DEBUG_INFO)" == "default" __DEBUGINFO_1 = /DEBUG !endif !if "$(BUILD)" == "release" && "$(DEBUG_INFO)" == "default" __DEBUGINFO_1 = !endif !if "$(DEBUG_INFO)" == "0" __DEBUGINFO_1 = !endif !if "$(DEBUG_INFO)" == "1" __DEBUGINFO_1 = /DEBUG !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default" ____DEBUGRUNTIME_2_p = /D_DEBUG !endif !if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default" ____DEBUGRUNTIME_2_p = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "0" ____DEBUGRUNTIME_2_p = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "1" ____DEBUGRUNTIME_2_p = /D_DEBUG !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default" ____DEBUGRUNTIME_2_p_1 = /d _DEBUG !endif !if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default" ____DEBUGRUNTIME_2_p_1 = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "0" ____DEBUGRUNTIME_2_p_1 = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "1" ____DEBUGRUNTIME_2_p_1 = /d _DEBUG !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "default" __DEBUGRUNTIME_3 = d !endif !if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default" __DEBUGRUNTIME_3 = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "0" __DEBUGRUNTIME_3 = !endif !if "$(DEBUG_RUNTIME_LIBS)" == "1" __DEBUGRUNTIME_3 = d !endif !if "$(BUILD)" == "debug" __OPTIMIZEFLAG_4 = /Od !endif !if "$(BUILD)" == "release" __OPTIMIZEFLAG_4 = /O2 !endif !if "$(USE_THREADS)" == "0" __THREADSFLAG_7 = L !endif !if "$(USE_THREADS)" == "1" __THREADSFLAG_7 = T !endif !if "$(RUNTIME_LIBS)" == "dynamic" __RUNTIME_LIBS_8 = D !endif !if "$(RUNTIME_LIBS)" == "static" __RUNTIME_LIBS_8 = $(__THREADSFLAG_7) !endif !if "$(USE_RTTI)" == "0" __RTTIFLAG_9 = !endif !if "$(USE_RTTI)" == "1" __RTTIFLAG_9 = /GR !endif !if "$(USE_EXCEPTIONS)" == "0" __EXCEPTIONSFLAG_10 = !endif !if "$(USE_EXCEPTIONS)" == "1" __EXCEPTIONSFLAG_10 = /EHsc !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "0" __NO_VC_CRTDBG_p = /D__NO_VC_CRTDBG__ !endif !if "$(BUILD)" == "release" && "$(DEBUG_FLAG)" == "1" __NO_VC_CRTDBG_p = /D__NO_VC_CRTDBG__ !endif !if "$(BUILD)" == "debug" && "$(DEBUG_RUNTIME_LIBS)" == "0" __NO_VC_CRTDBG_p_1 = /d __NO_VC_CRTDBG__ !endif !if "$(BUILD)" == "release" && "$(DEBUG_FLAG)" == "1" __NO_VC_CRTDBG_p_1 = /d __NO_VC_CRTDBG__ !endif !if "$(WXUNIV)" == "1" __WXUNIV_DEFINE_p = /D__WXUNIVERSAL__ !endif !if "$(WXUNIV)" == "1" __WXUNIV_DEFINE_p_1 = /d __WXUNIVERSAL__ !endif !if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default" __DEBUG_DEFINE_p = /D__WXDEBUG__ !endif !if "$(DEBUG_FLAG)" == "1" __DEBUG_DEFINE_p = /D__WXDEBUG__ !endif !if "$(BUILD)" == "debug" && "$(DEBUG_FLAG)" == "default" __DEBUG_DEFINE_p_1 = /d __WXDEBUG__ !endif !if "$(DEBUG_FLAG)" == "1" __DEBUG_DEFINE_p_1 = /d __WXDEBUG__ !endif ### following is needed for wxMSW 2.9.x !if "$(DEBUG_FLAG)" == "0" __DEBUG_DEFINE_p = /DwxDEBUG_LEVEL=0 !endif !if "$(DEBUG_FLAG)" == "0" __DEBUG_DEFINE_p_1 = /d wxDEBUG_LEVEL=0 !endif !if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default" __NDEBUG_DEFINE_p = /DNDEBUG !endif !if "$(DEBUG_RUNTIME_LIBS)" == "0" __NDEBUG_DEFINE_p = /DNDEBUG !endif !if "$(BUILD)" == "release" && "$(DEBUG_RUNTIME_LIBS)" == "default" __NDEBUG_DEFINE_p_1 = /d NDEBUG !endif !if "$(DEBUG_RUNTIME_LIBS)" == "0" __NDEBUG_DEFINE_p_1 = /d NDEBUG !endif !if "$(USE_EXCEPTIONS)" == "0" __EXCEPTIONS_DEFINE_p = /DwxNO_EXCEPTIONS !endif !if "$(USE_EXCEPTIONS)" == "0" __EXCEPTIONS_DEFINE_p_1 = /d wxNO_EXCEPTIONS !endif !if "$(USE_RTTI)" == "0" __RTTI_DEFINE_p = /DwxNO_RTTI !endif !if "$(USE_RTTI)" == "0" __RTTI_DEFINE_p_1 = /d wxNO_RTTI !endif !if "$(USE_THREADS)" == "0" __THREAD_DEFINE_p = /DwxNO_THREADS !endif !if "$(USE_THREADS)" == "0" __THREAD_DEFINE_p_1 = /d wxNO_THREADS !endif !if "$(UNICODE)" == "1" __UNICODE_DEFINE_p = /D_UNICODE !endif !if "$(UNICODE)" == "1" __UNICODE_DEFINE_p_1 = /d _UNICODE !endif !if "$(SHARED)" == "1" __DLLFLAG_p = /DWXUSINGDLL !endif !if "$(SHARED)" == "1" __DLLFLAG_p_1 = /d WXUSINGDLL !endif !if "$(MONOLITHIC)" == "0" __WXLIB_HTML_p = \ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_html.lib !endif !if "$(MONOLITHIC)" == "0" __WXLIB_ADV_p = \ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_adv.lib !endif !if "$(MONOLITHIC)" == "0" __WXLIB_CORE_p = \ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_core.lib !endif !if "$(MONOLITHIC)" == "0" __WXLIB_BASE_p = \ wxbase$(WX_RELEASE)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib !endif !if "$(MONOLITHIC)" == "0" __WXLIB_NET_p = \ wxbase$(WX_RELEASE)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_net.lib !endif !if "$(MONOLITHIC)" == "1" __WXLIB_MONO_p = \ wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR).lib !endif !if "$(MSLU)" == "1" __UNICOWS_LIB_p = unicows.lib !endif __LIB_TIFF_p = wxtiff$(WXDEBUGFLAG).lib __LIB_JPEG_p = wxjpeg$(WXDEBUGFLAG).lib __LIB_PNG_p = wxpng$(WXDEBUGFLAG).lib ### Targets: ### all: $(OBJDIR) $(EXEDIR)\Golly.exe $(EXEDIR)\bgolly.exe $(BASEOBJ): $(BASEH) $(WXOBJ): $(BASEH) $(WXH) icons/*.ico bitmaps/*.xpm $(OBJDIR): mkdir $(OBJDIR) clean: -if exist $(OBJDIR)\*.obj del $(OBJDIR)\*.obj -if exist *.res del *.res -if exist $(EXEDIR)\Golly.exe del $(EXEDIR)\Golly.exe -if exist $(EXEDIR)\bgolly.exe del $(EXEDIR)\bgolly.exe -if exist $(EXEDIR)\RuleTableToTree.exe del $(EXEDIR)\RuleTableToTree.exe -if exist golly.pdb del golly.pdb $(EXEDIR)\Golly.exe: $(BASEOBJ) $(WXOBJ) golly.res link /LARGEADDRESSAWARE /NOLOGO /OUT:$(EXEDIR)\Golly.exe $(LDFLAGS) $(__DEBUGINFO_1) /pdb:"golly.pdb" \ /LIBPATH:$(LIBDIRNAME) /SUBSYSTEM:WINDOWS $(BASEOBJ) $(WXOBJ) golly.res \ $(__WXLIB_HTML_p) $(__WXLIB_ADV_p) $(__WXLIB_CORE_p) $(__WXLIB_BASE_p) $(__WXLIB_NET_p) \ $(__WXLIB_MONO_p) $(__LIB_TIFF_p) $(__LIB_JPEG_p) $(__LIB_PNG_p) wxzlib$(WXDEBUGFLAG).lib \ wxregex$(WXUNICODEFLAG)$(WXDEBUGFLAG).lib wxexpat$(WXDEBUGFLAG).lib \ $(__UNICOWS_LIB_p) kernel32.lib user32.lib gdi32.lib comdlg32.lib \ winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib \ rpcrt4.lib advapi32.lib wsock32.lib wininet.lib golly.res: golly.rc rc /fo$@ /d $(WX_CPU_DEF) /d WIN32 $(____DEBUGRUNTIME_2_p_1) $(__NO_VC_CRTDBG_p_1) /d __WXMSW__ $(__WXUNIV_DEFINE_p_1) \ $(__DEBUG_DEFINE_p_1) $(__NDEBUG_DEFINE_p_1) $(__EXCEPTIONS_DEFINE_p_1) $(__RTTI_DEFINE_p_1) $(__THREAD_DEFINE_p_1) \ $(__UNICODE_DEFINE_p_1) /i $(WX_DIR)\include /i $(SETUPHDIR) /i . $(__DLLFLAG_p_1) /d _WINDOWS \ /i $(WX_DIR)\samples /d NOPCH golly.rc $(EXEDIR)\bgolly.exe: $(BASEOBJ) $(OBJDIR)/bgolly.obj link /LARGEADDRESSAWARE /NOLOGO /OUT:$(EXEDIR)\bgolly.exe $(LDFLAGS) /LIBPATH:$(LIBDIRNAME) \ $(OBJDIR)/bgolly.obj $(BASEOBJ) wxzlib$(WXDEBUGFLAG).lib $(EXEDIR)\RuleTableToTree.exe: $(BASEOBJ) $(OBJDIR)/RuleTableToTree.obj link /LARGEADDRESSAWARE /NOLOGO /OUT:$(EXEDIR)\RuleTableToTree.exe $(LDFLAGS) /LIBPATH:$(LIBDIRNAME) \ $(OBJDIR)/RuleTableToTree.obj $(BASEOBJ) wxzlib$(WXDEBUGFLAG).lib $(OBJDIR)/bgolly.obj: $(CMDDIR)/bgolly.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(CMDDIR)/bgolly.cpp $(OBJDIR)/RuleTableToTree.obj: $(CMDDIR)/RuleTableToTree.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(CMDDIR)/RuleTableToTree.cpp $(OBJDIR)/bigint.obj: $(BASEDIR)/bigint.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/bigint.cpp $(OBJDIR)/lifealgo.obj: $(BASEDIR)/lifealgo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/lifealgo.cpp $(OBJDIR)/hlifealgo.obj: $(BASEDIR)/hlifealgo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/hlifealgo.cpp $(OBJDIR)/hlifedraw.obj: $(BASEDIR)/hlifedraw.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/hlifedraw.cpp $(OBJDIR)/qlifealgo.obj: $(BASEDIR)/qlifealgo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/qlifealgo.cpp $(OBJDIR)/qlifedraw.obj: $(BASEDIR)/qlifedraw.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/qlifedraw.cpp $(OBJDIR)/jvnalgo.obj: $(BASEDIR)/jvnalgo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/jvnalgo.cpp $(OBJDIR)/ruleloaderalgo.obj: $(BASEDIR)/ruleloaderalgo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/ruleloaderalgo.cpp $(OBJDIR)/ruletable_algo.obj: $(BASEDIR)/ruletable_algo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/ruletable_algo.cpp $(OBJDIR)/ruletreealgo.obj: $(BASEDIR)/ruletreealgo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/ruletreealgo.cpp $(OBJDIR)/generationsalgo.obj: $(BASEDIR)/generationsalgo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/generationsalgo.cpp $(OBJDIR)/ghashbase.obj: $(BASEDIR)/ghashbase.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/ghashbase.cpp $(OBJDIR)/ghashdraw.obj: $(BASEDIR)/ghashdraw.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/ghashdraw.cpp $(OBJDIR)/liferules.obj: $(BASEDIR)/liferules.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/liferules.cpp $(OBJDIR)/liferender.obj: $(BASEDIR)/liferender.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/liferender.cpp $(OBJDIR)/readpattern.obj: $(BASEDIR)/readpattern.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/readpattern.cpp $(OBJDIR)/writepattern.obj: $(BASEDIR)/writepattern.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/writepattern.cpp $(OBJDIR)/util.obj: $(BASEDIR)/util.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/util.cpp $(OBJDIR)/viewport.obj: $(BASEDIR)/viewport.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/viewport.cpp $(OBJDIR)/lifepoll.obj: $(BASEDIR)/lifepoll.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(BASEDIR)/lifepoll.cpp $(OBJDIR)/wxutils.obj: wxutils.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxutils.cpp $(OBJDIR)/wxprefs.obj: wxprefs.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxprefs.cpp $(OBJDIR)/wxalgos.obj: wxalgos.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxalgos.cpp $(OBJDIR)/wxrule.obj: wxrule.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxrule.cpp $(OBJDIR)/wxinfo.obj: wxinfo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxinfo.cpp $(OBJDIR)/wxhelp.obj: wxhelp.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxhelp.cpp $(OBJDIR)/wxstatus.obj: wxstatus.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxstatus.cpp $(OBJDIR)/wxview.obj: wxview.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxview.cpp $(OBJDIR)/wxrender.obj: wxrender.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxrender.cpp $(OBJDIR)/wxperl.obj: wxperl.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(PERL_INCLUDE) wxperl.cpp $(OBJDIR)/wxpython.obj: wxpython.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) $(PYTHON_INCLUDE) wxpython.cpp $(OBJDIR)/wxscript.obj: wxscript.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxscript.cpp $(OBJDIR)/wxfile.obj: wxfile.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxfile.cpp $(OBJDIR)/wxedit.obj: wxedit.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxedit.cpp $(OBJDIR)/wxselect.obj: wxselect.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxselect.cpp $(OBJDIR)/wxcontrol.obj: wxcontrol.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxcontrol.cpp $(OBJDIR)/wxtimeline.obj: wxtimeline.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxtimeline.cpp $(OBJDIR)/wxundo.obj: wxundo.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxundo.cpp $(OBJDIR)/wxlayer.obj: wxlayer.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxlayer.cpp $(OBJDIR)/wxmain.obj: wxmain.cpp $(CXX) /c /nologo /Fo$@ $(CXXFLAGS) wxmain.cpp $(OBJDIR)/wxgolly.obj: wxgolly.cpp $(CXX) /c /TP /nologo /Fo$@ $(CXXFLAGS) wxgolly.cpp srcdist: -rmdir /s /q $(RELEASENAME)-src mkdir $(RELEASENAME)-src mkdir $(RELEASENAME)-src\Help mkdir $(RELEASENAME)-src\Patterns mkdir $(RELEASENAME)-src\Rules mkdir $(RELEASENAME)-src\Scripts mkdir $(RELEASENAME)-src\docs mkdir $(RELEASENAME)-src\gollybase mkdir $(RELEASENAME)-src\cmdline xcopy /S /I $(EXEDIR)\Help $(RELEASENAME)-src\Help xcopy /S /I $(EXEDIR)\Patterns $(RELEASENAME)-src\Patterns xcopy /S /I $(EXEDIR)\Rules $(RELEASENAME)-src\Rules xcopy /S /I $(EXEDIR)\Scripts $(RELEASENAME)-src\Scripts xcopy /S /I $(EXEDIR)\docs $(RELEASENAME)-src\docs xcopy /S /I $(EXEDIR)\gollybase $(RELEASENAME)-src\gollybase xcopy /S /I $(EXEDIR)\cmdline $(RELEASENAME)-src\cmdline mkdir $(RELEASENAME)-src\gui-wx mkdir $(RELEASENAME)-src\gui-wx\configure mkdir $(RELEASENAME)-src\gui-wx\bitmaps mkdir $(RELEASENAME)-src\gui-wx\icons for %%F IN ($(GUIFILES)) do xcopy %F $(RELEASENAME)-src\gui-wx for %%F IN ($(GUIDIRS)) do xcopy /S /I %F $(RELEASENAME)-src\gui-wx\%F echo Now zip $(RELEASENAME)-src into $(RELEASENAME)-src.zip bindist: all -rmdir /s /q $(RELEASENAME)-win mkdir $(RELEASENAME)-win mkdir $(RELEASENAME)-win\Help mkdir $(RELEASENAME)-win\Patterns mkdir $(RELEASENAME)-win\Rules mkdir $(RELEASENAME)-win\Scripts xcopy /S /I $(EXEDIR)\Help $(RELEASENAME)-win\Help xcopy /S /I $(EXEDIR)\Patterns $(RELEASENAME)-win\Patterns xcopy /S /I $(EXEDIR)\Rules $(RELEASENAME)-win\Rules xcopy /S /I $(EXEDIR)\Scripts $(RELEASENAME)-win\Scripts for %%F IN ($(BINFILES)) do xcopy %F $(RELEASENAME)-win echo Now zip $(RELEASENAME)-win into $(RELEASENAME)-win.zip golly-2.5-src/gui-wx/CMakeLists.txt0000644000175100001440000001626412156145314014204 00000000000000cmake_minimum_required(VERSION 2.6) project( golly ) set( APP_VERSION 2.5 ) if(APPLE OR WIN32) # app names are usually capitalized on Mac OS X and Windows set( APP_NAME Golly ) else() # Linux binaries are usually all lowercase set( APP_NAME golly ) endif() # low-level code used in all executables set(BASE_SOURCES ../gollybase/bigint.h ../gollybase/bigint.cpp ../gollybase/generationsalgo.h ../gollybase/generationsalgo.cpp ../gollybase/ghashbase.h ../gollybase/ghashbase.cpp ../gollybase/ghashdraw.cpp ../gollybase/hlifealgo.h ../gollybase/hlifealgo.cpp ../gollybase/hlifedraw.cpp ../gollybase/jvnalgo.h ../gollybase/jvnalgo.cpp ../gollybase/lifealgo.h ../gollybase/lifealgo.cpp ../gollybase/lifepoll.h ../gollybase/lifepoll.cpp ../gollybase/liferender.h ../gollybase/liferender.cpp ../gollybase/liferules.h ../gollybase/liferules.cpp ../gollybase/platform.h ../gollybase/qlifealgo.h ../gollybase/qlifealgo.cpp ../gollybase/qlifedraw.cpp ../gollybase/readpattern.h ../gollybase/readpattern.cpp ../gollybase/ruleloaderalgo.h ../gollybase/ruleloaderalgo.cpp ../gollybase/ruletable_algo.h ../gollybase/ruletable_algo.cpp ../gollybase/ruletreealgo.h ../gollybase/ruletreealgo.cpp ../gollybase/util.h ../gollybase/util.cpp ../gollybase/viewport.h ../gollybase/viewport.cpp ../gollybase/writepattern.h ../gollybase/writepattern.cpp ) include_directories( ../gollybase ) # high-level GUI code used in desktop Golly set(GUI_SOURCES wxalgos.h wxalgos.cpp wxcontrol.cpp wxedit.h wxedit.cpp wxfile.cpp wxgolly.h wxgolly.cpp wxhelp.h wxhelp.cpp wxinfo.h wxinfo.cpp wxlayer.h wxlayer.cpp wxmain.h wxmain.cpp wxperl.h wxperl.cpp wxprefs.h wxprefs.cpp wxpython.h wxpython.cpp wxrender.h wxrender.cpp wxrule.h wxrule.cpp wxscript.h wxscript.cpp wxselect.h wxselect.cpp wxstatus.h wxstatus.cpp wxtimeline.h wxtimeline.cpp wxundo.h wxundo.cpp wxutils.h wxutils.cpp wxview.h wxview.cpp ) set(RESOURCES golly.rc Info.plist.in icons/appicon.ico icons/appicon16.ico icons/appicon32.ico icons/appicon48.ico icons/appicon.xpm icons/app.icns icons/file-mc.icns icons/file-rle.icns ) if(APPLE) # on Mac OS X it's better to use locally installed wxWidgets headers and libs # (the pre-installed stuff tends to be out of date; eg. 10.6 has wxMac 2.8.8 and it's a 32-bit debug build) set( wxWidgets_CONFIG_EXECUTABLE /usr/local/bin/wx-config ) set( wxWidgets_wxrc_EXECUTABLE /usr/local/bin/wxrc ) # not used, but no harm leaving it in # to avoid statically linking the Perl library into the app we do these 2 steps: # 1. override PERL_INCLUDE_PATH to simplified output from "/usr/bin/perl -MExtUtils::Embed -e ccopts" # 2. override PERL_LIBRARY to simplified output from "/usr/bin/perl -MExtUtils::Embed -e ldopts" set( PERL_INCLUDE_PATH /System/Library/Perl/5.10.0/darwin-thread-multi-2level/CORE ) set( PERL_LIBRARY "-L/usr/local/lib -L/System/Library/Perl/5.10.0/darwin-thread-multi-2level/CORE -lperl -ldl -lm -lutil -lc" ) elseif(UNIX) # remove -rdynamic from link options on Linux to reduce golly size by about 1.2MB set( CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "" ) endif() find_package( wxWidgets REQUIRED html net adv core base ) if(WIN32) # use zlib library included in wxWidgets set( ZLIB_INCLUDE_DIR ${wxWidgets_ROOT_DIR}/src/zlib ) set( ZLIB_LIBRARY ${wxWidgets_LIB_DIR}/wxzlib.lib ) # PERL_LIBARY is not used in our Windows build but cmake needs a setting set( PERL_LIBRARY lib_not_used ) endif() find_package( ZLIB REQUIRED ) find_package( PerlLibs REQUIRED ) find_package( PythonLibs REQUIRED ) include_directories( ${ZLIB_INCLUDE_DIR} ${PERL_INCLUDE_PATH} ${PYTHON_INCLUDE_PATH} ) include( ${wxWidgets_USE_FILE} ) # pass extra settings to the compiler add_definitions(-DZLIB -DVERSION=${APP_VERSION}) if(APPLE) # support Mac OS 10.6 or later add_definitions(-mmacosx-version-min=10.6) endif() if(APPLE OR UNIX) # use same settings as in makefiles add_definitions(-D_LARGE_FILES -O5) endif() # workaround for wx2.9.3 wxAssert link errors, see http://trac.wxwidgets.org/ticket/12626 SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DwxDEBUG_LEVEL=0") # avoid security warnings if(MSVC) add_definitions(/D_CRT_SECURE_NO_WARNINGS /D_CRT_NONSTDC_NO_WARNINGS) endif() # set this to true if using Visual Leak Detector to find memory leaks set(USING_VISUAL_LEAK_DETECTOR FALSE) if(USING_VISUAL_LEAK_DETECTOR) set(VLD_INCLUDE_DIR "C:\Program Files\Visual Leak Detector\include") set(VLD_LIBRARIES "C:\Program Files\Visual Leak Detector\lib\Win32\vld.lib") add_definitions(/DUSING_VISUAL_LEAK_DETECTOR) endif() # put the executables in parent directory set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/..) # create base library used by all 3 executables add_library( gollybase STATIC ${BASE_SOURCES} ) add_executable( ${APP_NAME} WIN32 MACOSX_BUNDLE # build a properly bundled Mac app ${GUI_SOURCES} ${RESOURCES} ) add_executable( bgolly ../cmdline/bgolly.cpp ) target_link_libraries( ${APP_NAME} gollybase ${wxWidgets_LIBRARIES} ${ZLIB_LIBRARIES} ) target_link_libraries( bgolly gollybase ${ZLIB_LIBRARIES} ) if(APPLE) # create Info.plist (using Info.plist.in) and PkgInfo files inside .app bundle add_custom_target( app_bundle COMMAND sed -e "s/VERSION/${APP_VERSION}/" ${CMAKE_SOURCE_DIR}/Info.plist.in >${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Golly.app/Contents/Info.plist COMMAND echo -n "APPLGoLy" >${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Golly.app/Contents/PkgInfo ) add_dependencies( ${APP_NAME} app_bundle ) # copy *.icns files into Resources directory inside .app bundle set_source_files_properties( ${CMAKE_SOURCE_DIR}/icons/app.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) set_source_files_properties( ${CMAKE_SOURCE_DIR}/icons/file-mc.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) set_source_files_properties( ${CMAKE_SOURCE_DIR}/icons/file-rle.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources ) # strip out debug info (reduces app size by 1.6MB) target_link_libraries( ${APP_NAME} -Wl,-dead_strip -Wl,-S ) # only the Mac app needs to be linked against the Perl and Python libs # (on Windows and Linux those libs are dynamically loaded the first time a script is run) target_link_libraries( ${APP_NAME} ${PERL_LIBRARY} ${PYTHON_LIBRARIES} ) endif() # hack to get around the "Debug" and "Release" folders Visual Studio adds on Windows # http://stackoverflow.com/questions/543203/cmake-runtime-output-directory-on-windows if(MSVC_IDE) set_target_properties( ${APP_NAME} bgolly PROPERTIES PREFIX "../" ) endif() if(USING_VISUAL_LEAK_DETECTOR) include_directories( ${VLD_INCLUDE_DIR} ) target_link_libraries( ${APP_NAME} ${VLD_LIBRARIES} ) target_link_libraries( bgolly ${VLD_LIBRARIES} ) endif() golly-2.5-src/gui-wx/Info.plist.in0000644000175100001440000000404012156145314014006 00000000000000 CFBundleInfoDictionaryVersion 6.0 CFBundleIdentifier net.sourceforge.golly CFBundleDevelopmentRegion English CFBundleExecutable Golly CFBundleName Golly CFBundlePackageType APPL CFBundleSignature GoLy CFBundleIconFile app.icns CFBundleVersion VERSION CFBundleShortVersionString VERSION CFBundleGetInfoString Golly version VERSION, Copyright 2013 The Golly Gang LSRequiresCarbon CFBundleDocumentTypes CFBundleTypeName Golly Run Length Encoded File CFBundleTypeIconFile file-rle.icns CFBundleTypeExtensions rle CFBundleTypeOSTypes GoLR CFBundleTypeRole Editor LSIsAppleDefaultForType CFBundleTypeName Golly Macrocell File CFBundleTypeIconFile file-mc.icns CFBundleTypeExtensions mc CFBundleTypeOSTypes GoLM CFBundleTypeRole Editor LSIsAppleDefaultForType CFBundleTypeName Pattern File CFBundleTypeOSTypes **** CFBundleTypeRole Viewer golly-2.5-src/gui-wx/local-win-template.mk0000644000175100001440000000132312156145314015461 00000000000000# makefile-win includes local-win.mk, so create a copy of this file # and call it local-win.mk, then make any desired changes. # Change the next 2 lines to specify where you installed wxWidgets: !include WX_DIR = C:\wxWidgets-2.8.12-64 # Change the next line to match your wxWidgets version (first two digits): WX_RELEASE = 28 # Change the next line depending on where you installed Python: PYTHON_INCLUDE = -I"C:\Python27-64\include" # Simplified output from "perl -MExtUtils::Embed -e ccopts": PERL_INCLUDE = \ -DHAVE_DES_FCRYPT -DNO_HASH_SEED -DUSE_SITECUSTOMIZE -DPERL_IMPLICIT_CONTEXT \ -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX -I"C:\Perl514-64\lib\CORE" golly-2.5-src/gui-wx/golly.rc0000755000175100001440000000501712156145314013115 00000000000000// first icon file is used by Windows Explorer: aaaaaaaa ICON "icons/appicon.ico" // these icons are for the frame: appicon0 ICON "icons/appicon32.ico" appicon1 ICON "icons/appicon16.ico" #include "wx/msw/wx.rc" // tool bar buttons play BITMAP "bitmaps/play.bmp" stop BITMAP "bitmaps/stop.bmp" reset BITMAP "bitmaps/reset.bmp" algo BITMAP "bitmaps/algo.bmp" autofit BITMAP "bitmaps/autofit.bmp" hyper BITMAP "bitmaps/hyper.bmp" new BITMAP "bitmaps/new.bmp" open BITMAP "bitmaps/open.bmp" save BITMAP "bitmaps/save.bmp" patterns BITMAP "bitmaps/patterns.bmp" scripts BITMAP "bitmaps/scripts.bmp" info BITMAP "bitmaps/info.bmp" help BITMAP "bitmaps/help.bmp" autofit_down BITMAP "bitmaps/autofit_down.bmp" hyper_down BITMAP "bitmaps/hyper_down.bmp" patterns_down BITMAP "bitmaps/patterns_down.bmp" scripts_down BITMAP "bitmaps/scripts_down.bmp" // edit bar buttons undo BITMAP "bitmaps/undo.bmp" redo BITMAP "bitmaps/redo.bmp" draw BITMAP "bitmaps/draw.bmp" pick BITMAP "bitmaps/pick.bmp" select BITMAP "bitmaps/select.bmp" move BITMAP "bitmaps/move.bmp" zoomin BITMAP "bitmaps/zoomin.bmp" zoomout BITMAP "bitmaps/zoomout.bmp" allstates BITMAP "bitmaps/allstates.bmp" draw_down BITMAP "bitmaps/draw_down.bmp" pick_down BITMAP "bitmaps/pick_down.bmp" select_down BITMAP "bitmaps/select_down.bmp" move_down BITMAP "bitmaps/move_down.bmp" zoomin_down BITMAP "bitmaps/zoomin_down.bmp" zoomout_down BITMAP "bitmaps/zoomout_down.bmp" allstates_down BITMAP "bitmaps/allstates_down.bmp" // layer bar buttons add BITMAP "bitmaps/add.bmp" clone BITMAP "bitmaps/clone.bmp" duplicate BITMAP "bitmaps/duplicate.bmp" delete BITMAP "bitmaps/delete.bmp" stack BITMAP "bitmaps/stack.bmp" tile BITMAP "bitmaps/tile.bmp" stack_down BITMAP "bitmaps/stack_down.bmp" tile_down BITMAP "bitmaps/tile_down.bmp" // timeline bar buttons record BITMAP "bitmaps/record.bmp" backwards BITMAP "bitmaps/backwards.bmp" forwards BITMAP "bitmaps/forwards.bmp" stopplay BITMAP "bitmaps/stopplay.bmp" deltime BITMAP "bitmaps/deltime.bmp" // cursors pick_curs BITMAP "bitmaps/pick_curs.bmp" hand_curs BITMAP "bitmaps/hand_curs.bmp" cross_curs BITMAP "bitmaps/cross_curs.bmp" zoomin_curs BITMAP "bitmaps/zoomin_curs.bmp" zoomout_curs BITMAP "bitmaps/zoomout_curs.bmp" golly-2.5-src/gui-wx/icons/0000755000175100001440000000000012156145314012626 500000000000000golly-2.5-src/gui-wx/icons/app.icns0000644000175100001440000012673712156145314014224 00000000000000icns­ßics#His32[Žÿ† ÿÿ€ ÿÿ† ÿÿ€ ÿÿ† ÿÿ€ Šÿ€ Šÿ€ ÿÿ€ …ÿ€ ÿÿ€ …ÿ€ ÿÿ€ …ÿ€ ÿÿ€ …ÿ€ ÿÿ€ Šÿ€ Šÿ€ ÿÿ† ÿÿ€ ÿÿ† ÿÿ€ ÿÿ† ŽÿŽÿ†2ÿÿ€2ÿÿ†2ÿÿ€2ÿÿ†2ÿÿ€2Šÿ€2Šÿ€2ÿÿ€2…ÿ€2ÿÿ€2…ÿ€2ÿÿ€2…ÿ€2ÿÿ€2…ÿ€2ÿÿ€2Šÿ€2Šÿ€2ÿÿ†2ÿÿ€2ÿÿ†2ÿÿ€2ÿÿ†2ŽÿŽ#†ÿ##€ÿ##†ÿ##€ÿ##†ÿ##€ÿŠ#€ÿŠ#€ÿ##€ÿ…#€ÿ##€ÿ…#€ÿ##€ÿ…#€ÿ##€ÿ…#€ÿ##€ÿŠ#€ÿŠ#€ÿ##†ÿ##€ÿ##†ÿ##€ÿ##†ÿŽ#s8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿICN#?ÿÿüÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþ?ÿÿü?ÿÿüÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþÿÿþ?ÿÿüil32‡Ÿ™ÿ€›ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ›ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ›ÿ”ÿ ÿ ÿÿ”ÿ ÿ ÿÿ›ÿÿÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿÿ›ÿÿÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿÿ›ÿÿÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿÿ›ÿÿÿ ÿ ”ÿÿÿ ÿ ”ÿ›ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ›ÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿÿÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿ ÿÿ›ÿ€™ÿŸŸ™ÿ€›ÿÿÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿÿÿÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿÿ›ÿÿÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿÿÿÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿÿ›ÿ”ÿ22ÿ22ÿÿ”ÿ22ÿ22ÿÿ›ÿÿÿ22ÿ22ÿ22ÿ22ÿÿÿÿ22ÿ22ÿ22ÿ22ÿÿ›ÿÿÿ22ÿ22ÿ22ÿ22ÿÿÿÿ22ÿ22ÿ22ÿ22ÿÿ›ÿÿÿ22ÿ22ÿ22ÿ22ÿÿÿÿ22ÿ22ÿ22ÿ22ÿÿ›ÿÿÿ22ÿ22”ÿÿÿ22ÿ22”ÿ›ÿÿÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿÿÿÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿÿ›ÿÿÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿÿÿÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿ22ÿÿ›ÿ€™ÿŸŸ™#€›###ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ####ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ##›###ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ####ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ##›#”#ÿÿ#ÿÿ##”#ÿÿ#ÿÿ##›###ÿÿ#ÿÿ#ÿÿ#ÿÿ####ÿÿ#ÿÿ#ÿÿ#ÿÿ##›###ÿÿ#ÿÿ#ÿÿ#ÿÿ####ÿÿ#ÿÿ#ÿÿ#ÿÿ##›###ÿÿ#ÿÿ#ÿÿ#ÿÿ####ÿÿ#ÿÿ#ÿÿ#ÿÿ##›###ÿÿ#ÿÿ”###ÿÿ#ÿÿ”#›###ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ####ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ##›###ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ####ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ#ÿÿ##›#€™#Ÿl8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿich#Hÿÿÿÿð?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþ?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿðÿÿÿÿð?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþÿÿÿÿþ?ÿÿÿÿü?ÿÿÿÿüÿÿÿÿðih32ú®ÿÿ£ùÿÿ€úü¥ÿüúüÿ¥ýÿü€ùÿ€ýþÿÿýþÿÿýþÿÿýýÿÿþýÿÿþýÿÿþ‚ý€ÿý€ÿ€ý!ÿùùÿýýþøÔáÿúÖßþýÚÙýþÝØûÿãÔøÿåÓõÿ€ýÿïÐíÿñÒêÿýýÿùùÿýþöŠ@;³=9­¨H2šªE4޾S0}½Q5lòþýÿãi7RÇm9HÓÿýÿùùÿýÿÕ4C;3B>EA.<;(%S9) C38Åÿýÿ¢-> S)E ÿýÿùùÿýÿâ3[>[THSA‘ÿýÿùùÿýÿÐ!@:NôÿŽýÿš^ÿýÿùùÿýþúˆ ;Á¢(1²ÿþŽýÿæ_ZÖwKÖÿýÿùùÿýýÿÀVnçÈZgÜÿýþúLô§O„ôþýÿùùÿýÿâLG_MCgûÿŽýÿ·>@x:FšÿýÿùùÿýÿÖ#9)IõÿŽýÿ¡S}ÿýÿùùÿýþ÷1¯ˆ)§ÿþŽýÿáWLÄ\AÎÿýÿùùÿýýÿÉXrðÕ[gãÿýþÿ£N•ü²K‰øþýÿùùÿýÿáUFleDoûÿŽýÿºG<‰LB ÿýÿùùÿýÿË"$87#JóÿŽýÿ”U!#|ÿýÿùùÿýþóe ¢„–ÿþŽýÿÕ95ºQ'ÁÿýÿùùÿýýÿÎ]}ôØeuèÿýÿâ½ßÿëÁÙÿýýÿùùÿýÿê_B |b> }þþý€ÿý€ÿ€ýÿùùÿýÿÓ%)2((Eôÿšýÿùùÿýÿð_j Œÿþýý…ÿþ€ÿþ€ÿý€ÿþ€ÿ/þýýÿùùÿýýÿÐStùÕUlêÿýýÿò®¦êú¹Ÿâý¼žÜÿÊ›ÒÿÏœÊÿÔÀýÿùùÿýÿíjF,‰oB+Šÿþýý…:(fšC&U”?/H©J.<¢S4- M7)·ÿýÿùùÿýÿÒ*3 3+3 Eóÿýö?-J+;), T%(J+/K5xÿýÿùùÿýÿíN ‚[þÿýýy[L‹;£ //š/°ÿýÿùùÿýýÿÐaö×btéÿýýÿêtaÙ÷†]Éü‹WÀÿ W®ÿ¬W£ÿ¶T•ûþýÿùùÿýÿïxC(™‰@(”ÿþýþ¢F,t¦P)`¯P2V³Z2E°c87´h:4ÀÿýÿùùÿýÿË*9 7:7 IóÿýøP1 D3I/.M-)>1/T)8|ÿýÿùùÿýÿå:rZpüÿýýzKy=…,‹%". ¢ÿýÿùùÿýýÿÏ|“ñ݇Œåÿýýÿë•€×ò–zÌù¦zÂúªv·û´u®ûÄ|¡öþýÿùùÿ€ý…ÿý…ÿþ€ÿþ€ÿþ€ÿþ€ÿþýýÿù€üÿ¥ýÿüúü¥ÿüú€ÿÿ£ùÿÿ®®ÿÿ£ùÿÿ€úü¥ÿüúüÿ¥ýÿü€ùÿ€ýþÿÿýýÿÿýþÿÿþýÿÿþýÿÿþýÿÿþ‚ý€ÿýþÿÿ€ý!ÿùùÿýýþúßèÿûáçþýäâþþæâüÿêÞùÿìÞ÷þ€ýÿòÜðÿõÝïÿýýÿùùÿýþùªvh¿®uj½À}d«Àzi¥Ï…e”Ì‚lŒóþýÿé“nvЕqsÛÿýÿùùÿýÿßjuBahuJ^suLTlp[K{qYIpjj:Ìÿýÿ¹en8v`u;”ÿýÿùùÿýÿéY/#oc,"ls1!\t0%Q†5$G7)5ÕÿýÿÅ?+'ˆF,% ÿýÿùùÿýýÿÂasæÈUfÞÛleÑàfUÈì~\¶ï{M¬ÿþýþûŸWó¥K„óþýÿùùÿýþú¹ƒuÊăvÄË‹pµÓŒt¯×”q Ü—u™óÿýÿî¥yƒÜ­{‚Þÿýÿùù`ÿýÿÜit8dxtEdrvBR}rTPzsPCpb=Ðÿýÿµhg1lr9›ÿýÿùùÿýÿàO*ig.bg.Tx1#Ix1@:(.Òÿýÿ¹<($…I1 ™ÿýÿùùÿ€ý\±YnÛÃkkÍÌc`ÆÙvd¶ÞrV®ç…b›ùýýÿõF‡í¤Wzèÿýÿùùÿýýþÿôùÿÿøùÿÿ÷÷ÿÿû÷ÿÿùôÿÿýöÿþýýÿô§s‘å¬wìÿýÿùùÿ€ýþÿÿýýÿÿýýÿÿýýÿÿþýÿÿþýÿÿþ€ýÿÀnu?‚h|Bžÿýÿùùÿ›ýÿ¼?4$zD8#”ÿýÿùùÿýýþÿùýÿÿúüÿýÿò‡GvàŒ;käÿýÿùùÿ€ýÊ‹ÞÔŽ‰×ÿýþù³z™ï¼z•îÿýÿùùÿýÿâux=rƒxGzùÿŽýÿ¿rm8ŽvvA¥ÿýÿùùÿýÿÚN?%\d@%föÿŽýÿ±B8$xLA$“ÿýÿùùÿýþú—6LÈ®GHµÿþŽýÿër0iÛ‰A[ØÿýÿùùÿýýÿÐ~‹êÖ…Šâÿýþû´u¥ó½|Ÿöþýÿùùÿýÿè}L}}{RƒúÿŽýÿÊvvG’p{J¬ÿýÿùùÿýÿßSG*YYG*`õÿŽýÿ¶EB&qGH%ÿýÿùùÿýþù?F´™4<®ÿþŽýÿæm9ZÈs/QÒÿýÿùùÿýýÿ×ñÞ†æÿýþÿ»x¨üÃsŸùþýÿùùÿýÿè„}G„‘|PˆûþŽýÿË|qEŸyL±ÿýÿùùÿýÿ×RQ,WeR/eõÿŽýÿ¬MH(rTR*ÿýÿùùÿýþõ|%4­•3/ÿþŽýÿÝUIÃl-<ÄÿýÿùùÿýýÿØ}“õàˆ‘ëÿýÿåÁáÿìËÝÿýýÿùùÿýÿïzS“xW–ýþý€ÿý€ÿ€ýÿùùÿýÿÜYY3W[Y5_ôÿšýÿùùÿýþôw23˜‚+,–þþýýÿþ€ÿþ€ÿþ€ÿý€ÿþ€ÿ/þýýÿùùÿýýÿ×yŽøÝt„ëÿýýþõļïû˸çýϸäÿ×µÛÿܵÖþà·Ò€ýÿùùÿýÿñ•~]ž–|`¡þþýý¤s`…´|_u«vhn½hcµ†mZ±qZÄÿýÿùùÿýÿÜ^c8X_e"!9yŒU7mnZ2 !$ "!!\¨…*O™Œ6! %|©j%hŸw' !$ "!7ÖÿÖs¾ÿï Ž!_ðý¼oåÿÚZ!$ "!=ÒÚ¯yÂçÂx# Ž!gãÑ¡zßݲ\!$ "! +qtfCi›x:!;tbD‚žg1 !$ "!" PŠs)J”„4! +*)!,:.€!$ "!6Êÿät³ÿñy !€ ! €!$ "!?ÛëÆÆõÔr! š!,$ "! /€rBr‹rG" !!  !!!€!$ "!!M—u%C|t0!! 0im4(fn;%`qA"YsHUtM!MrX#!!$ "!4¿ûÛmªüêu !"Žùô‘†õù™xîú­qéþ³lÜþÁcÓÿÖR!$ "!?ÞðÊŠÉûÝv! !%®üä‘¥øàŸŸ÷즌ö殕ëé¼…ìôÊT!$ "!1‹¬}H~œK"!!"kž„Vh©™U]œŠaX¢£`V™¦kI’“t:!$ "!" G…f$>kc. !! 1gi5+u};$alB$f„K`†Q!NnW#!!$ "!/¶øÌ\ ûäi€!„óð‚yïì„kæøždàôŸ\Ô÷­VÈþÊH!$ "!?áïÁ‚ÎùÙ†# !%´ûÝ ¬úÙ”¡øä²–øá£Žîå±ïðÊe!$ "!2—šX‹¸ŽL# !$zµ™Yr¦Šfl°¥ea¦Žq]¡’wY£²|>!$ "€!6=:&5[I' €! -VQ**?:0&OW1%>:6$>:5$A[?"!!$ "€!€!!" !   ! !€!€!$€#¥!$ %£$% ƒ"£ "±h8mk `^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`h¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼h¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^`ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ`¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼h¼ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼h`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`it32ACÿÿÿþïÿ‰óÿ‡óÿ†õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…Šÿ§h?§‚ÿ§W(O§‚ÿ§h?§‚ÿ§W(O§‚ÿ§h?§‚ÿ§W(O§ÿ§h?§‚ÿ§W(O§Šÿ…‰ÿ§h€ÿh€h€ÿ§h€ÿh€h€ÿ§h€ÿh€h‹ÿ§h€ÿh€h‰ÿ…ˆÿ@§WhFhÿ§OhO§ÿ§WhFhÿ§OhO§ÿ§WhFhÿ§OhO§‰ÿ§WhFhÿ§OhO§ˆÿ…ˆÿ@OFz‹h(ÿFz‹z((ÿOFz‹h(ÿFz‹z((ÿOFz‹h(ÿFz‹z((‰ÿOFz‹h(ÿFz‹z((ˆÿ…ˆÿ@(7hhFÿ((hhF(ÿ(7hhFÿ((hhF(ÿ(7hhFÿ((hhF(‰ÿ(7hhFÿ((hhF(ˆÿ…ˆÿ(7€ÿ(7ÿ(7€ÿ(7ÿ(7€ ÿ(7‰ÿ(7€ ÿ(7ˆÿ…ˆÿ?ƒÿƒÿ?ƒÿƒÿ?ƒÿƒ‰ÿ?ƒÿƒˆÿ…ˆÿ§hÿh€hÿ§hÿh€hÿ§hÿh€h‰ÿ§hÿh€hˆÿ…‰ÿh€ÿ?€(€ÿh€ÿ?€(€ÿh€ÿ?€(‹ÿh€ÿ?€(‰ÿ…Šÿ§h‚ÿhh‚ÿ§h‚ÿhh‚ÿ§h‚ÿhhÿ§h‚ÿhhŠÿ…õÿ…Šÿ§F((7§‚ÿ§h?§‚ÿ§F((7§‚ÿ§h?§‚ÿ§F((7§‚ÿ§h?§ÿ§F((7§‚ÿ§h?§Šÿ…‰ÿ§(?€ÿ§h€ÿ§(?€ÿ§h€ÿ§(?€ÿ§h‹ÿ§(?€ÿ§h‰ÿ…ˆÿ@§(hhFhÿ§WhFhÿ§(hhFhÿ§WhFhÿ§(hhFhÿ§WhFh‰ÿ§(hhFhÿ§WhFhˆÿ…ˆÿ@(h‹zFÿOFz‹h(ÿ(h‹zFÿOFz‹h(ÿ(h‹zFÿOFz‹h(‰ÿ(h‹zFÿOFz‹h(ˆÿ…ˆÿ@FhW7(ÿ(7hhFÿFhW7(ÿ(7hhFÿFhW7(ÿ(7hhF‰ÿFhW7(ÿ(7hhFˆÿ…ˆÿ((!ÿ(7€ÿ((!ÿ(7€ÿ((!ÿ(7€‰ÿ((!ÿ(7€ˆÿ…ˆÿ ÿ?ƒÿÿ?ƒÿÿ?ƒ‰ÿ ÿ?ƒˆÿ…ˆÿ@§?ÿ§hÿ§?ÿ§hÿ§?ÿ§h‰ÿ§?ÿ§hˆÿ…‰ÿ?€(€ÿh€ÿ?€(€ÿh€ÿ?€(€ÿh‹ÿ?€(€ÿh‰ÿ…Šÿ§h‚ÿ§h‚ÿ§h‚ÿ§h‚ÿ§h‚ÿ§hÿ§h‚ÿ§hŠÿ…õÿ…×ÿ§h?§‚ÿ§W(O§Šÿ…Öÿ§h€ÿh€h‰ÿ…Õÿ§WhFhÿ§OhO§ˆÿ…ÕÿOFz‹h(ÿFz‹z((ˆÿ…Õÿ(7hhFÿ((hhF(ˆÿ…Õÿ(7€ ÿ(7ˆÿ…Õÿ?ƒÿƒˆÿ…Õÿ§hÿh€hˆÿ…Öÿh€ÿ?€(‰ÿ…×ÿ§h‚ÿhhŠÿ…õÿ…Šÿ§F((7§‚ÿ§h?§¹ÿ§F((7§‚ÿ§h?§Šÿ…‰ÿ§(?€ÿ§h·ÿ§(?€ÿ§h‰ÿ…ˆÿ§(hhFhÿ§WhFhµÿ§(hhFhÿ§WhFhˆÿ…ˆÿ(h‹zFÿOFz‹h(µÿ(h‹zFÿOFz‹h(ˆÿ…ˆÿFhW7(ÿ(7hhFµÿFhW7(ÿ(7hhFˆÿ…ˆÿ((!ÿ(7€µÿ((!ÿ(7€ˆÿ…ˆÿ ÿ?ƒµÿ ÿ?ƒˆÿ…ˆÿ§?ÿ§hµÿ§?ÿ§hˆÿ…‰ÿ?€(€ÿh·ÿ?€(€ÿh‰ÿ…Šÿ§h‚ÿ§h¹ÿ§h‚ÿ§hŠÿ…õÿ…Šÿ§h?§‚ÿ§W(O§¹ÿ§h?§‚ÿ§W(O§Šÿ…‰ÿ§h€ÿh€h·ÿ§h€ÿh€h‰ÿ…ˆÿ§WhFhÿ§OhO§µÿ§WhFhÿ§OhO§ˆÿ…ˆÿOFz‹h(ÿFz‹z((µÿOFz‹h(ÿFz‹z((ˆÿ…ˆÿ(7hhFÿ((hhF(µÿ(7hhFÿ((hhF(ˆÿ…ˆÿ(7€ ÿ(7µÿ(7€ ÿ(7ˆÿ…ˆÿ?ƒÿƒµÿ?ƒÿƒˆÿ…ˆÿ§hÿh€hµÿ§hÿh€hˆÿ…‰ÿh€ÿ?€(·ÿh€ÿ?€(‰ÿ…Šÿ§h‚ÿhh¹ÿ§h‚ÿhhŠÿ…õÿ…Šÿ§F((7§‚ÿ§h?§¹ÿ§F((7§‚ÿ§h?§Šÿ…‰ÿ§(?€ÿ§h·ÿ§(?€ÿ§h‰ÿ…ˆÿ§(hhFhÿ§WhFhµÿ§(hhFhÿ§WhFhˆÿ…ˆÿ(h‹zFÿOFz‹h(µÿ(h‹zFÿOFz‹h(ˆÿ…ˆÿFhW7(ÿ(7hhFµÿFhW7(ÿ(7hhFˆÿ…ˆÿ((!ÿ(7€µÿ((!ÿ(7€ˆÿ…ˆÿ ÿ?ƒµÿ ÿ?ƒˆÿ…ˆÿ§?ÿ§hµÿ§?ÿ§hˆÿ…‰ÿ?€(€ÿh·ÿ?€(€ÿh‰ÿ…Šÿ§h‚ÿ§h¹ÿ§h‚ÿ§hŠÿ…õÿ…Šÿ§h?§‚ÿ§W(O§×ÿ…‰ÿ§h€ÿh€hÖÿ…ˆÿ§WhFhÿ§OhO§Õÿ…ˆÿOFz‹h(ÿFz‹z((Õÿ…ˆÿ(7hhFÿ((hhF(Õÿ…ˆÿ(7€ ÿ(7Õÿ…ˆÿ?ƒÿƒÕÿ…ˆÿ§hÿh€hÕÿ…‰ÿh€ÿ?€(Öÿ…Šÿ§h‚ÿhh×ÿ…õÿ…Šÿ§h?§‚ÿ§W(O§ÿ§W(O§‚ÿ§h?§‚ÿ§W(O§‚ÿ§h?§‚ÿ§h?§‚ÿ§W(O§Šÿ…‰ÿ§h€ÿh€h‹ÿh€h€ÿ§h€ÿh€h€ÿ§h€ÿ§h€ÿh€h‰ÿ…ˆÿ§WhFhÿ§OhO§‰ÿ@§OhO§ÿ§WhFhÿ§OhO§ÿ§WhFhÿ§WhFhÿ§OhO§ˆÿ…ˆÿOFz‹h(ÿFz‹z((‰ÿ@Fz‹z((ÿOFz‹h(ÿFz‹z((ÿOFz‹h(ÿOFz‹h(ÿFz‹z((ˆÿ…ˆÿ(7hhFÿ((hhF(‰ÿ@((hhF(ÿ(7hhFÿ((hhF(ÿ(7hhFÿ(7hhFÿ((hhF(ˆÿ…ˆÿ(7€ ÿ(7‰ÿ(7ÿ(7€ÿ(7ÿ(7€ÿ(7€ ÿ(7ˆÿ…ˆÿ?ƒÿƒ‰ÿƒÿ?ƒÿƒÿ?ƒÿ?ƒÿƒˆÿ…ˆÿ§hÿh€h‰ÿh€hÿ§hÿh€hÿ§hÿ§hÿh€hˆÿ…‰ÿh€ÿ?€(‹ÿ?€(€ÿh€ÿ?€(€ÿh€ÿh€ÿ?€(‰ÿ…Šÿ§h‚ÿhhÿhh‚ÿ§h‚ÿhh‚ÿ§h‚ÿ§h‚ÿhhŠÿ…õÿ…Šÿ§F((7§‚ÿ§h?§ÿ§h?§‚ÿ§F((7§‚ÿ§h?§‚ÿ§F((7§‚ÿ§F((7§‚ÿ§h?§Šÿ…‰ÿ§(?€ÿ§h‹ÿ§h€ÿ§(?€ÿ§h€ÿ§(?€ÿ§(?€ÿ§h‰ÿ…ˆÿ§(hhFhÿ§WhFh‰ÿ@§WhFhÿ§(hhFhÿ§WhFhÿ§(hhFhÿ§(hhFhÿ§WhFhˆÿ…ˆÿ(h‹zFÿOFz‹h(‰ÿ@OFz‹h(ÿ(h‹zFÿOFz‹h(ÿ(h‹zFÿ(h‹zFÿOFz‹h(ˆÿ…ˆÿFhW7(ÿ(7hhF‰ÿ@(7hhFÿFhW7(ÿ(7hhFÿFhW7(ÿFhW7(ÿ(7hhFˆÿ…ˆÿ((!ÿ(7€‰ÿ(7€ÿ((!ÿ(7€ÿ((!ÿ((!ÿ(7€ˆÿ…ˆÿ ÿ?ƒ‰ÿ?ƒÿÿ?ƒÿÿÿ?ƒˆÿ…ˆÿ§?ÿ§h‰ÿ@§hÿ§?ÿ§hÿ§?ÿ§?ÿ§hˆÿ…‰ÿ?€(€ÿh‹ÿh€ÿ?€(€ÿh€ÿ?€(€ÿ?€(€ÿh‰ÿ…Šÿ§h‚ÿ§hÿ§h‚ÿ§h‚ÿ§h‚ÿ§h‚ÿ§h‚ÿ§hŠÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ†óÿ‡óÿ‰ïÿÿÿÿþÿÿÿþïÿ‰óÿ‡óÿ†õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…Šÿ»‹O?h°‚ÿ»‹?Oz»‚ÿ»‹O?h°‚ÿ»‹?Oz»‚ÿ»‹O?h°‚ÿ»‹?Oz»ÿ»‹O?h°‚ÿ»‹?Oz»Šÿ…‰ÿ°F€WF7q€ÿ‹?€W?7q€ÿ°F€WF7q€ÿ‹?€W?7q€ÿ°F€WF7q€ÿ‹?€W?7q‹ÿ°F€WF7q€ÿ‹?€W?7q‰ÿ…ˆÿ@»?h‹žzW7(qÿ°7WzžzW77°ÿ»?h‹žzW7(qÿ°7WzžzW77°ÿ»?h‹žzW7(qÿ°7WzžzW77°‰ÿ»?h‹žzW7(qÿ°7WzžzW77°ˆÿ…ˆÿ@zWz§°‹O77Fÿ?Wz§°žW?7FÿzWz§°‹O77Fÿ?Wz§°žW?7FÿzWz§°‹O77Fÿ?Wz§°žW?7F‰ÿzWz§°‹O77Fÿ?Wz§°žW?7Fˆÿ…ˆÿ@Ohh‹žhF7F7ÿ7hW‹žzW7(ÿOhh‹žhF7F7ÿ7hW‹žzW7(ÿOhh‹žhF7F7ÿ7hW‹žzW7(‰ÿOhh‹žhF7F7ÿ7hW‹žzW7(ˆÿ…ˆÿ@?FFWW?7(7(ÿ?FFWWF77(ÿ?FFWW?7(7(ÿ?FFWWF77(ÿ?FFWW?7(7(ÿ?FFWWF77(‰ÿ?FFWW?7(7(ÿ?FFWWF77(ˆÿ…ˆÿ_‚7(!!ÿ0‚7((!ÿ_‚7(!!ÿ0‚7((!ÿ_‚7(!!ÿ0‚7((!‰ÿ_‚7(!!ÿ0‚7((!ˆÿ…ˆÿ»!(hÿq0?(qÿ»!(hÿq0?(qÿ»!(hÿq0?(q‰ÿ»!(hÿq0?(qˆÿ…‰ÿq!70!€ÿW‚0€ÿq!70!€ÿW‚0€ÿq!70!€ÿW‚0‹ÿq!70!€ÿW‚0‰ÿ…Šÿ§07((h‚ÿq!!q‚ÿ§07((h‚ÿq!!q‚ÿ§07((h‚ÿq!!qÿ§07((h‚ÿq!!qŠÿ…õÿ…Šÿ»‚OO_°‚ÿ»‹O?h°‚ÿ»‚OO_°‚ÿ»‹O?h°‚ÿ»‚OO_°‚ÿ»‹O?h°ÿ»‚OO_°‚ÿ»‹O?h°Šÿ…‰ÿ»?hhW?(W€ÿ°F€WF7q€ÿ»?hhW?(W€ÿ°F€WF7q€ÿ»?hhW?(W€ÿ°F€WF7q‹ÿ»?hhW?(W€ÿ°F€WF7q‰ÿ…ˆÿ@»Fh‹žzF70qÿ»?h‹žzW7(qÿ»Fh‹žzF70qÿ»?h‹žzW7(qÿ»Fh‹žzF70qÿ»?h‹žzW7(q‰ÿ»Fh‹žzF70qÿ»?h‹žzW7(qˆÿ…ˆÿ@OW‹°§zF(7!ÿzWz§°‹O77FÿOW‹°§zF(7!ÿzWz§°‹O77FÿOW‹°§zF(7!ÿzWz§°‹O77F‰ÿOW‹°§zF(7!ÿzWz§°‹O77Fˆÿ…ˆÿ@?Fzž‹W7(W(ÿOhh‹žhF7F7ÿ?Fzž‹W7(W(ÿOhh‹žhF7F7ÿ?Fzž‹W7(W(ÿOhh‹žhF7F7‰ÿ?Fzž‹W7(W(ÿOhh‹žhF7F7ˆÿ…ˆÿ@7?WWF70(7!ÿ?FFWW?7(7(ÿ7?WWF70(7!ÿ?FFWW?7(7(ÿ7?WWF70(7!ÿ?FFWW?7(7(‰ÿ7?WWF70(7!ÿ?FFWW?7(7(ˆÿ…ˆÿ‚7((ÿ_‚7(!!ÿ‚7((ÿ_‚7(!!ÿ‚7((ÿ_‚7(!!‰ÿ‚7((ÿ_‚7(!!ˆÿ…ˆÿ§(!?!Wÿ»!(hÿ§(!?!Wÿ»!(hÿ§(!?!Wÿ»!(h‰ÿ§(!?!Wÿ»!(hˆÿ…‰ÿW€0€ÿq!70!€ÿW€0€ÿq!70!€ÿW€0€ÿq!70!‹ÿW€0€ÿq!70!‰ÿ…Šÿ§h‚ÿ§07((h‚ÿ§h‚ÿ§07((h‚ÿ§h‚ÿ§07((hÿ§h‚ÿ§07((hŠÿ…õÿ…×ÿ»‹O?h°‚ÿ»‹?Oz»Šÿ…Öÿ°F€WF7q€ÿ‹?€W?7q‰ÿ…Õÿ»?h‹žzW7(qÿ°7WzžzW77°ˆÿ…ÕÿzWz§°‹O77Fÿ?Wz§°žW?7Fˆÿ…ÕÿOhh‹žhF7F7ÿ7hW‹žzW7(ˆÿ…Õÿ?FFWW?7(7(ÿ?FFWWF77(ˆÿ…Õÿ_‚7(!!ÿ0‚7((!ˆÿ…Õÿ»!(hÿq0?(qˆÿ…Öÿq!70!€ÿW‚0‰ÿ…×ÿ§07((h‚ÿq!!qŠÿ…õÿ…Šÿ»‚OO_°‚ÿ»‹O?h°¹ÿ»‚OO_°‚ÿ»‹O?h°Šÿ…‰ÿ»?hhW?(W€ÿ°F€WF7q·ÿ»?hhW?(W€ÿ°F€WF7q‰ÿ…ˆÿ»Fh‹žzF70qÿ»?h‹žzW7(qµÿ»Fh‹žzF70qÿ»?h‹žzW7(qˆÿ…ˆÿOW‹°§zF(7!ÿzWz§°‹O77FµÿOW‹°§zF(7!ÿzWz§°‹O77Fˆÿ…ˆÿ?Fzž‹W7(W(ÿOhh‹žhF7F7µÿ?Fzž‹W7(W(ÿOhh‹žhF7F7ˆÿ…ˆÿ7?WWF70(7!ÿ?FFWW?7(7(µÿ7?WWF70(7!ÿ?FFWW?7(7(ˆÿ…ˆÿ‚7((ÿ_‚7(!!µÿ‚7((ÿ_‚7(!!ˆÿ…ˆÿ§(!?!Wÿ»!(hµÿ§(!?!Wÿ»!(hˆÿ…‰ÿW€0€ÿq!70!·ÿW€0€ÿq!70!‰ÿ…Šÿ§h‚ÿ§07((h¹ÿ§h‚ÿ§07((hŠÿ…õÿ…Šÿ»‹O?h°‚ÿ»‹?Oz»¹ÿ»‹O?h°‚ÿ»‹?Oz»Šÿ…‰ÿ°F€WF7q€ÿ‹?€W?7q·ÿ°F€WF7q€ÿ‹?€W?7q‰ÿ…ˆÿ»?h‹žzW7(qÿ°7WzžzW77°µÿ»?h‹žzW7(qÿ°7WzžzW77°ˆÿ…ˆÿzWz§°‹O77Fÿ?Wz§°žW?7FµÿzWz§°‹O77Fÿ?Wz§°žW?7Fˆÿ…ˆÿOhh‹žhF7F7ÿ7hW‹žzW7(µÿOhh‹žhF7F7ÿ7hW‹žzW7(ˆÿ…ˆÿ?FFWW?7(7(ÿ?FFWWF77(µÿ?FFWW?7(7(ÿ?FFWWF77(ˆÿ…ˆÿ_‚7(!!ÿ0‚7((!µÿ_‚7(!!ÿ0‚7((!ˆÿ…ˆÿ»!(hÿq0?(qµÿ»!(hÿq0?(qˆÿ…‰ÿq!70!€ÿW‚0·ÿq!70!€ÿW‚0‰ÿ…Šÿ§07((h‚ÿq!!q¹ÿ§07((h‚ÿq!!qŠÿ…õÿ…Šÿ»‚OO_°‚ÿ»‹O?h°¹ÿ»‚OO_°‚ÿ»‹O?h°Šÿ…‰ÿ»?hhW?(W€ÿ°F€WF7q·ÿ»?hhW?(W€ÿ°F€WF7q‰ÿ…ˆÿ»Fh‹žzF70qÿ»?h‹žzW7(qµÿ»Fh‹žzF70qÿ»?h‹žzW7(qˆÿ…ˆÿOW‹°§zF(7!ÿzWz§°‹O77FµÿOW‹°§zF(7!ÿzWz§°‹O77Fˆÿ…ˆÿ?Fzž‹W7(W(ÿOhh‹žhF7F7µÿ?Fzž‹W7(W(ÿOhh‹žhF7F7ˆÿ…ˆÿ7?WWF70(7!ÿ?FFWW?7(7(µÿ7?WWF70(7!ÿ?FFWW?7(7(ˆÿ…ˆÿ‚7((ÿ_‚7(!!µÿ‚7((ÿ_‚7(!!ˆÿ…ˆÿ§(!?!Wÿ»!(hµÿ§(!?!Wÿ»!(hˆÿ…‰ÿW€0€ÿq!70!·ÿW€0€ÿq!70!‰ÿ…Šÿ§h‚ÿ§07((h¹ÿ§h‚ÿ§07((hŠÿ…õÿ…Šÿ»‹O?h°‚ÿ»‹?Oz»×ÿ…‰ÿ°F€WF7q€ÿ‹?€W?7qÖÿ…ˆÿ»?h‹žzW7(qÿ°7WzžzW77°Õÿ…ˆÿzWz§°‹O77Fÿ?Wz§°žW?7FÕÿ…ˆÿOhh‹žhF7F7ÿ7hW‹žzW7(Õÿ…ˆÿ?FFWW?7(7(ÿ?FFWWF77(Õÿ…ˆÿ_‚7(!!ÿ0‚7((!Õÿ…ˆÿ»!(hÿq0?(qÕÿ…‰ÿq!70!€ÿW‚0Öÿ…Šÿ§07((h‚ÿq!!q×ÿ…õÿ…Šÿ»‹O?h°‚ÿ»‹?Oz»ÿ»‹?Oz»‚ÿ»‹O?h°‚ÿ»‹?Oz»‚ÿ»‹O?h°‚ÿ»‹O?h°‚ÿ»‹?Oz»Šÿ…‰ÿ°F€WF7q€ÿ‹?€W?7q‹ÿ‹?€W?7q€ÿ°F€WF7q€ÿ‹?€W?7q€ÿ°F€WF7q€ÿ°F€WF7q€ÿ‹?€W?7q‰ÿ…ˆÿ»?h‹žzW7(qÿ°7WzžzW77°‰ÿ@°7WzžzW77°ÿ»?h‹žzW7(qÿ°7WzžzW77°ÿ»?h‹žzW7(qÿ»?h‹žzW7(qÿ°7WzžzW77°ˆÿ…ˆÿzWz§°‹O77Fÿ?Wz§°žW?7F‰ÿ@?Wz§°žW?7FÿzWz§°‹O77Fÿ?Wz§°žW?7FÿzWz§°‹O77FÿzWz§°‹O77Fÿ?Wz§°žW?7Fˆÿ…ˆÿOhh‹žhF7F7ÿ7hW‹žzW7(‰ÿ@7hW‹žzW7(ÿOhh‹žhF7F7ÿ7hW‹žzW7(ÿOhh‹žhF7F7ÿOhh‹žhF7F7ÿ7hW‹žzW7(ˆÿ…ˆÿ?FFWW?7(7(ÿ?FFWWF77(‰ÿ@?FFWWF77(ÿ?FFWW?7(7(ÿ?FFWWF77(ÿ?FFWW?7(7(ÿ?FFWW?7(7(ÿ?FFWWF77(ˆÿ…ˆÿ_‚7(!!ÿ0‚7((!‰ÿ0‚7((!ÿ_‚7(!!ÿ0‚7((!ÿ_‚7(!!ÿ_‚7(!!ÿ0‚7((!ˆÿ…ˆÿ»!(hÿq0?(q‰ÿq0?(qÿ»!(hÿq0?(qÿ»!(hÿ»!(hÿq0?(qˆÿ…‰ÿq!70!€ÿW‚0‹ÿW‚0€ÿq!70!€ÿW‚0€ÿq!70!€ÿq!70!€ÿW‚0‰ÿ…Šÿ§07((h‚ÿq!!qÿq!!q‚ÿ§07((h‚ÿq!!q‚ÿ§07((h‚ÿ§07((h‚ÿq!!qŠÿ…õÿ…Šÿ»‚OO_°‚ÿ»‹O?h°ÿ»‹O?h°‚ÿ»‚OO_°‚ÿ»‹O?h°‚ÿ»‚OO_°‚ÿ»‚OO_°‚ÿ»‹O?h°Šÿ…‰ÿ»?hhW?(W€ÿ°F€WF7q‹ÿ°F€WF7q€ÿ»?hhW?(W€ÿ°F€WF7q€ÿ»?hhW?(W€ÿ»?hhW?(W€ÿ°F€WF7q‰ÿ…ˆÿ»Fh‹žzF70qÿ»?h‹žzW7(q‰ÿ@»?h‹žzW7(qÿ»Fh‹žzF70qÿ»?h‹žzW7(qÿ»Fh‹žzF70qÿ»Fh‹žzF70qÿ»?h‹žzW7(qˆÿ…ˆÿOW‹°§zF(7!ÿzWz§°‹O77F‰ÿ@zWz§°‹O77FÿOW‹°§zF(7!ÿzWz§°‹O77FÿOW‹°§zF(7!ÿOW‹°§zF(7!ÿzWz§°‹O77Fˆÿ…ˆÿ?Fzž‹W7(W(ÿOhh‹žhF7F7‰ÿ@Ohh‹žhF7F7ÿ?Fzž‹W7(W(ÿOhh‹žhF7F7ÿ?Fzž‹W7(W(ÿ?Fzž‹W7(W(ÿOhh‹žhF7F7ˆÿ…ˆÿ7?WWF70(7!ÿ?FFWW?7(7(‰ÿ@?FFWW?7(7(ÿ7?WWF70(7!ÿ?FFWW?7(7(ÿ7?WWF70(7!ÿ7?WWF70(7!ÿ?FFWW?7(7(ˆÿ…ˆÿ‚7((ÿ_‚7(!!‰ÿ_‚7(!!ÿ‚7((ÿ_‚7(!!ÿ‚7((ÿ‚7((ÿ_‚7(!!ˆÿ…ˆÿ§(!?!Wÿ»!(h‰ÿ»!(hÿ§(!?!Wÿ»!(hÿ§(!?!Wÿ§(!?!Wÿ»!(hˆÿ…‰ÿW€0€ÿq!70!‹ÿq!70!€ÿW€0€ÿq!70!€ÿW€0€ÿW€0€ÿq!70!‰ÿ…Šÿ§h‚ÿ§07((hÿ§07((h‚ÿ§h‚ÿ§07((h‚ÿ§h‚ÿ§h‚ÿ§07((hŠÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ…õÿ†óÿ‡óÿ‰ïÿÿÿÿþÿÿÿþï#‰ó#‡ó#†õ#…õ#…õ#…õ#…õ#…õ#…õ#…õ#…Š#âÿë×ëÄ‚#âÿ××ÿâ‚#âÿë×ëÄ‚#âÿ××ÿâ‚#âÿë×ëÄ‚#âÿ××ÿâ#âÿë×ëÄ‚#âÿ××ÿâŠ#…‰#Äëÿ×§€#ÿ×€ÿâ×§€#Äëÿ×§€#ÿ×€ÿâ×§€#Äëÿ×§€#ÿ×€ÿâ×§‹#Äëÿ×§€#ÿ×€ÿâ×§‰#…ˆ#ââ‚ÿâ§§#Äׂÿâ×Ä#ââ‚ÿâ§§#Äׂÿâ×Ä#ââ‚ÿâ§§#Äׂÿâ×ĉ#ââ‚ÿâ§§#Äׂÿâ×Ĉ#…ˆ#ƒÿë×ו#׃ÿâÄ•#ƒÿë×ו#׃ÿâÄ•#ƒÿë×ו#׃ÿâÄ•‰#ƒÿë×ו#׃ÿâÄ•ˆ#…ˆ#ׂÿëÄ×Í#׃ÿ×Äz#ׂÿëÄ×Í#׃ÿ×Äz#ׂÿëÄ×Í#׃ÿ×Äz‰#ׂÿëÄ×Í#׃ÿ×Äzˆ#…ˆ#@Äëëÿë×ħĞ#×ÿëÿëë×Äžh#Äëëÿë×ħĞ#×ÿëÿëë×Äžh#Äëëÿë×ħĞ#×ÿëÿëë×Äžh‰#Äëëÿë×ħĞ#×ÿëÿëë×Äžhˆ#…ˆ#»€×Äħ‹‹_#‹××Ä×ħž‹O#»€×Äħ‹‹_#‹××Ä×ħž‹O#»€×Äħ‹‹_#‹××Ä×ħž‹O‰#»€×Äħ‹‹_#‹××Ä×ħž‹Oˆ#…ˆ#@âzž§§ž‹h?‚#§ž×§§žžzW§#âzž§§ž‹h?‚#§ž×§§žžzW§#âzž§§ž‹h?‚#§ž×§§žžzW§‰#âzž§§ž‹h?‚#§ž×§§žžzW§ˆ#…‰#§h‹Ä°hWO€#‹h€zWF_€#§h‹Ä°hWO€#‹h€zWF_€#§h‹Ä°hWO€#‹h€zWF_‹#§h‹Ä°hWO€#‹h€zWF_‰#…Š#°z»žz‚‚#§€?O§‚#°z»žz‚‚#§€?O§‚#°z»žz‚‚#§€?O§#°z»žz‚‚#§€?O§Š#…õ#…Š#âÿ××ëÄ‚#âÿë×ëÄ‚#âÿ××ëÄ‚#âÿë×ëÄ‚#âÿ××ëÄ‚#âÿë×ëÄ#âÿ××ëÄ‚#âÿë×ëÄŠ#…‰#ââ€ÿâÄ•€#Äëÿ×§€#ââ€ÿâÄ•€#Äëÿ×§€#ââ€ÿâÄ•€#Äëÿ×§‹#ââ€ÿâÄ•€#Äëÿ×§‰#…ˆ#â‚ÿëמ§#ââ‚ÿâ§§#â‚ÿëמ§#ââ‚ÿâ§§#â‚ÿëמ§#ââ‚ÿâ§§‰#â‚ÿëמ§#ââ‚ÿâ§§ˆ#…ˆ#ׂÿ×ÄÄ_#ƒÿë×ו#ׂÿ×ÄÄ_#ƒÿë×ו#ׂÿ×ÄÄ_#ƒÿë×ו‰#ׂÿ×ÄÄ_#ƒÿë×וˆ#…ˆ#×õ€ÿë×§ëž#ׂÿëÄ×Í#×õ€ÿë×§ëž#ׂÿëÄ×Í#×õ€ÿë×§ëž#ׂÿëÄ×͉#×õ€ÿë×§ëž#ׂÿëÄ×͈#…ˆ#@×âÿëâͰžÄ‹#Äëëÿë×ħĞ#×âÿëâͰžÄ‹#Äëëÿë×ħĞ#×âÿëâͰžÄ‹#Äëëÿë×ħЉ#×âÿëâͰžÄ‹#Äëëÿë×ħЈ#…ˆ# °××Äħžh‹?#»€×Äħ‹‹_#°××Äħžh‹?#»€×Äħ‹‹_#°××Äħžh‹?#»€×Äħ‹‹_‰# °××Äħžh‹?#»€×Äħ‹‹_ˆ#…ˆ#@°ž§§ž‹hÄz‹#âzž§§ž‹h?‚#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚‰#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚ˆ#…‰#•hzhWWzW€#§h‹Ä°hWO€#•hzhWWzW€#§h‹Ä°hWO€#•hzhWWzW€#§h‹Ä°hWO‹#•hzhWWzW€#§h‹Ä°hWO‰#…Š#°W??W‚‚#°z»žz‚‚#°W??W‚‚#°z»žz‚‚#°W??W‚‚#°z»žz‚#°W??W‚‚#°z»žz‚Š#…õ#…×#âÿë×ëÄ‚#âÿ××ÿâŠ#…Ö#Äëÿ×§€#ÿ×€ÿâ×§‰#…Õ#ââ‚ÿâ§§#Äׂÿâ×Ĉ#…Õ#ƒÿë×ו#׃ÿâÄ•ˆ#…Õ#ׂÿëÄ×Í#׃ÿ×Äzˆ#…Õ#Äëëÿë×ħĞ#×ÿëÿëë×Äžhˆ#…Õ#»€×Äħ‹‹_#‹××Ä×ħž‹Oˆ#…Õ#âzž§§ž‹h?‚#§ž×§§žžzW§ˆ#…Ö#§h‹Ä°hWO€#‹h€zWF_‰#…×#°z»žz‚‚#§€?O§Š#…õ#…Š#âÿ××ëÄ‚#âÿë×ëĹ#âÿ××ëÄ‚#âÿë×ëÄŠ#…‰#ââ€ÿâÄ•€#Äëÿ×§·#ââ€ÿâÄ•€#Äëÿ×§‰#…ˆ#â‚ÿëמ§#ââ‚ÿâ§§µ#â‚ÿëמ§#ââ‚ÿâ§§ˆ#…ˆ#ׂÿ×ÄÄ_#ƒÿë×וµ#ׂÿ×ÄÄ_#ƒÿë×וˆ#…ˆ#×õ€ÿë×§ëž#ׂÿëÄ×͵#×õ€ÿë×§ëž#ׂÿëÄ×͈#…ˆ#×âÿëâͰžÄ‹#Äëëÿë×ħе#×âÿëâͰžÄ‹#Äëëÿë×ħЈ#…ˆ# °××Äħžh‹?#»€×Äħ‹‹_µ# °××Äħžh‹?#»€×Äħ‹‹_ˆ#…ˆ#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚µ#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚ˆ#…‰#•hzhWWzW€#§h‹Ä°hWO·#•hzhWWzW€#§h‹Ä°hWO‰#…Š#°W??W‚‚#°z»žz‚¹#°W??W‚‚#°z»žz‚Š#…õ#…Š#âÿë×ëÄ‚#âÿ××ÿâ¹#âÿë×ëÄ‚#âÿ××ÿâŠ#…‰#Äëÿ×§€#ÿ×€ÿâ×§·#Äëÿ×§€#ÿ×€ÿâ×§‰#…ˆ#ââ‚ÿâ§§#Äׂÿâ×ĵ#ââ‚ÿâ§§#Äׂÿâ×Ĉ#…ˆ#ƒÿë×ו#׃ÿâÄ•µ#ƒÿë×ו#׃ÿâÄ•ˆ#…ˆ#ׂÿëÄ×Í#׃ÿ×Äzµ#ׂÿëÄ×Í#׃ÿ×Äzˆ#…ˆ#Äëëÿë×ħĞ#×ÿëÿëë×Äžhµ#Äëëÿë×ħĞ#×ÿëÿëë×Äžhˆ#…ˆ#»€×Äħ‹‹_#‹××Ä×ħž‹Oµ#»€×Äħ‹‹_#‹××Ä×ħž‹Oˆ#…ˆ#âzž§§ž‹h?‚#§ž×§§žžzW§µ#âzž§§ž‹h?‚#§ž×§§žžzW§ˆ#…‰#§h‹Ä°hWO€#‹h€zWF_·#§h‹Ä°hWO€#‹h€zWF_‰#…Š#°z»žz‚‚#§€?O§¹#°z»žz‚‚#§€?O§Š#…õ#…Š#âÿ××ëÄ‚#âÿë×ëĹ#âÿ××ëÄ‚#âÿë×ëÄŠ#…‰#ââ€ÿâÄ•€#Äëÿ×§·#ââ€ÿâÄ•€#Äëÿ×§‰#…ˆ#â‚ÿëמ§#ââ‚ÿâ§§µ#â‚ÿëמ§#ââ‚ÿâ§§ˆ#…ˆ#ׂÿ×ÄÄ_#ƒÿë×וµ#ׂÿ×ÄÄ_#ƒÿë×וˆ#…ˆ#×õ€ÿë×§ëž#ׂÿëÄ×͵#×õ€ÿë×§ëž#ׂÿëÄ×͈#…ˆ#×âÿëâͰžÄ‹#Äëëÿë×ħе#×âÿëâͰžÄ‹#Äëëÿë×ħЈ#…ˆ# °××Äħžh‹?#»€×Äħ‹‹_µ# °××Äħžh‹?#»€×Äħ‹‹_ˆ#…ˆ#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚µ#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚ˆ#…‰#•hzhWWzW€#§h‹Ä°hWO·#•hzhWWzW€#§h‹Ä°hWO‰#…Š#°W??W‚‚#°z»žz‚¹#°W??W‚‚#°z»žz‚Š#…õ#…Š#âÿë×ëÄ‚#âÿ××ÿâ×#…‰#Äëÿ×§€#ÿ×€ÿâ×§Ö#…ˆ#ââ‚ÿâ§§#Äׂÿâ×ÄÕ#…ˆ#ƒÿë×ו#׃ÿâÄ•Õ#…ˆ#ׂÿëÄ×Í#׃ÿ×ÄzÕ#…ˆ#Äëëÿë×ħĞ#×ÿëÿëë×ÄžhÕ#…ˆ#»€×Äħ‹‹_#‹××Ä×ħž‹OÕ#…ˆ#âzž§§ž‹h?‚#§ž×§§žžzW§Õ#…‰#§h‹Ä°hWO€#‹h€zWF_Ö#…Š#°z»žz‚‚#§€?O§×#…õ#…Š#âÿë×ëÄ‚#âÿ××ÿâ#âÿ××ÿâ‚#âÿë×ëÄ‚#âÿ××ÿâ‚#âÿë×ëÄ‚#âÿë×ëÄ‚#âÿ××ÿâŠ#…‰#Äëÿ×§€#ÿ×€ÿâ×§‹#ÿ×€ÿâ×§€#Äëÿ×§€#ÿ×€ÿâ×§€#Äëÿ×§€#Äëÿ×§€#ÿ×€ÿâ×§‰#…ˆ#ââ‚ÿâ§§#Äׂÿâ×ĉ#Äׂÿâ×Ä#ââ‚ÿâ§§#Äׂÿâ×Ä#ââ‚ÿâ§§#ââ‚ÿâ§§#Äׂÿâ×Ĉ#…ˆ#ƒÿë×ו#׃ÿâÄ•‰#׃ÿâÄ•#ƒÿë×ו#׃ÿâÄ•#ƒÿë×ו#ƒÿë×ו#׃ÿâÄ•ˆ#…ˆ#ׂÿëÄ×Í#׃ÿ×Äz‰#׃ÿ×Äz#ׂÿëÄ×Í#׃ÿ×Äz#ׂÿëÄ×Í#ׂÿëÄ×Í#׃ÿ×Äzˆ#…ˆ#Äëëÿë×ħĞ#×ÿëÿëë×Äžh‰#@×ÿëÿëë×Äžh#Äëëÿë×ħĞ#×ÿëÿëë×Äžh#Äëëÿë×ħĞ#Äëëÿë×ħĞ#×ÿëÿëë×Äžhˆ#…ˆ#»€×Äħ‹‹_#‹××Ä×ħž‹O‰# ‹××Ä×ħž‹O#»€×Äħ‹‹_#‹××Ä×ħž‹O#»€×Äħ‹‹_#»€×Äħ‹‹_#‹××Ä×ħž‹Oˆ#…ˆ#âzž§§ž‹h?‚#§ž×§§žžzW§‰#@§ž×§§žžzW§#âzž§§ž‹h?‚#§ž×§§žžzW§#âzž§§ž‹h?‚#âzž§§ž‹h?‚#§ž×§§žžzW§ˆ#…‰#§h‹Ä°hWO€#‹h€zWF_‹#‹h€zWF_€#§h‹Ä°hWO€#‹h€zWF_€#§h‹Ä°hWO€#§h‹Ä°hWO€#‹h€zWF_‰#…Š#°z»žz‚‚#§€?O§#§€?O§‚#°z»žz‚‚#§€?O§‚#°z»žz‚‚#°z»žz‚‚#§€?O§Š#…õ#…Š#âÿ××ëÄ‚#âÿë×ëÄ#âÿë×ëÄ‚#âÿ××ëÄ‚#âÿë×ëÄ‚#âÿ××ëÄ‚#âÿ××ëÄ‚#âÿë×ëÄŠ#…‰#ââ€ÿâÄ•€#Äëÿ×§‹#Äëÿ×§€#ââ€ÿâÄ•€#Äëÿ×§€#ââ€ÿâÄ•€#ââ€ÿâÄ•€#Äëÿ×§‰#…ˆ#â‚ÿëמ§#ââ‚ÿâ§§‰#ââ‚ÿâ§§#â‚ÿëמ§#ââ‚ÿâ§§#â‚ÿëמ§#â‚ÿëמ§#ââ‚ÿâ§§ˆ#…ˆ#ׂÿ×ÄÄ_#ƒÿë×ו‰#ƒÿë×ו#ׂÿ×ÄÄ_#ƒÿë×ו#ׂÿ×ÄÄ_#ׂÿ×ÄÄ_#ƒÿë×וˆ#…ˆ#×õ€ÿë×§ëž#ׂÿëÄ×͉#ׂÿëÄ×Í#×õ€ÿë×§ëž#ׂÿëÄ×Í#×õ€ÿë×§ëž#×õ€ÿë×§ëž#ׂÿëÄ×͈#…ˆ#×âÿëâͰžÄ‹#Äëëÿë×ħЉ#@Äëëÿë×ħĞ#×âÿëâͰžÄ‹#Äëëÿë×ħĞ#×âÿëâͰžÄ‹#×âÿëâͰžÄ‹#Äëëÿë×ħЈ#…ˆ# °××Äħžh‹?#»€×Äħ‹‹_‰#»€×Äħ‹‹_#°××Äħžh‹?#»€×Äħ‹‹_#°××Äħžh‹?#°××Äħžh‹?#»€×Äħ‹‹_ˆ#…ˆ#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚‰#@âzž§§ž‹h?‚#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚#°ž§§ž‹hÄz‹#°ž§§ž‹hÄz‹#âzž§§ž‹h?‚ˆ#…‰#•hzhWWzW€#§h‹Ä°hWO‹#§h‹Ä°hWO€#•hzhWWzW€#§h‹Ä°hWO€#•hzhWWzW€#•hzhWWzW€#§h‹Ä°hWO‰#…Š#°W??W‚‚#°z»žz‚#°z»žz‚‚#°W??W‚‚#°z»žz‚‚#°W??W‚‚#°W??W‚‚#°z»žz‚Š#…õ#…õ#…õ#…õ#…õ#…õ#…õ#…õ#†ó#‡ó#‰ï#ÿÿÿþt8mk@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgolly-2.5-src/gui-wx/icons/appicon.ico0000755000175100001440000000525612156145314014706 00000000000000(6 è^00hF( Àÿÿÿ{{{{{{{{{½½½{{{ÿÿÿÿÿÿÿÿÿîîîîîîîîé™î™™™™žé™î™™™™žé™î™™™™žé™îîîîîîé™îîîîîîé™îîîé™îîîé™îîîé™îîîîîîîîîîîîî陙™™î™žé™™™™î™žé™™™™î™žîîîîîîîî¬ç8ì`|œÐÿþ°( @€ÿÿÿ{{{{{{{{{½½½{{{ÿÿÿÿÿÿÿÿÿîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîéž™îî™éž™éž™éžîîéž™îî™éž™éž™éžîîîîîîîîîîîîîîîîîîéž™îî™éž™éž™éžîîéž™îî™éž™éž™éžîîîîîîîîîîîîîîîîîîéž™îîîîîîîîîîîîîéž™îîîîîîîîîîîîîîîîîîîîîîîîîîîîîéž™îîîîîîîî™éžîîéž™îîîîîîîî™éžîîîîîîîîîîîîîîîîîîéž™îîîîîîîî™éžîîéž™îîîîîîîî™éžîîîîîîîîîîîîîîîîîîéž™îîîîîîîî™éžîîéž™îîîîîîîî™éžîîîîîîîîîîîîîîîîîîîîîîîîîîîîî™éžîîîîîîîîîîîîî™éžîîîîîîîîîîîîîîîîîî鞙鞙鞙îî™éžîî鞙鞙鞙îî™éžîîîîîîîîîîîîîîîîîî鞙鞙鞙îî™éžîî鞙鞙鞙îî™éžîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî(0`ÿÿÿ{{{{{{{{{½½½{{{ÿÿÿÿÿÿÿÿÿîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî陞îî陞™™é™ž™™é™ž™™î陞îî陞™™é™ž™™é™ž™™î陞îî陞™™é™ž™™é™ž™™î陞îî陞™™é™ž™™é™ž™™îîîîîîîîîîîîîîîîîîîîîîîîî陞îî陞™™é™ž™™é™ž™™î陞îî陞™™é™ž™™é™ž™™î陞îî陞™™é™ž™™é™ž™™î陞îî陞™™é™ž™™é™ž™™îîîîîîîîîîîîîîîîîîîîîîîîî陞îîîîîîîîîîîîîîîîîî陞îîîîîîîîîîîîîîîîîî陞îîîîîîîîîîîîîîîîîî陞îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî陞îîîîîîîîîîîî陞™™î陞îîîîîîîîîîîî陞™™î陞îîîîîîîîîîîî陞™™î陞îîîîîîîîîîîî陞™™îîîîîîîîîîîîîîîîîîîîîîîîî陞îîîîîîîîîîîî陞™™î陞îîîîîîîîîîîî陞™™î陞îîîîîîîîîîîî陞™™î陞îîîîîîîîîîîî陞™™îîîîîîîîîîîîîîîîîîîîîîîîî陞îîîîîîîîîîîî陞™™î陞îîîîîîîîîîîî陞™™î陞îîîîîîîîîîîî陞™™î陞îîîîîîîîîîîî陞™™îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîî陞™™îîîîîîîîîîîîîîîîîîî陞™™îîîîîîîîîîîîîîîîîîî陞™™îîîîîîîîîîîîîîîîîîî陞™™îîîîîîîîîîîîîîîîîîîîîîîîî陞™™é™ž™™é™žîî陞™™î陞™™é™ž™™é™žîî陞™™î陞™™é™ž™™é™žîî陞™™î陞™™é™ž™™é™žîî陞™™îîîîîîîîîîîîîîîîîîîîîîîîî陞™™é™ž™™é™žîî陞™™î陞™™é™ž™™é™žîî陞™™î陞™™é™ž™™é™žîî陞™™î陞™™é™ž™™é™žîî陞™™îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîtîîîîîîîîîîî™îî™îî™îî™îîîîîîîî™îî™îî™îî™îîîîîîîîîîîîîîîîîîîîîîîîîîîîîîîgolly-2.5-src/gui-wx/icons/appicon.xpm0000644000175100001440000000253012156145314014725 00000000000000/* XPM */ static const char *appicon_xpm[] = { /* width height ncolors chars_per_pixel */ "32 32 2 1", /* colors */ "A c #FFFFFFFF0000", "B c #00000000FFFF", /* pixels */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBABBABBABBABBABBAAAABBABBAAA", "AAABBABBABBABBABBABBAAAABBABBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBABBABBABBABBABBAAAABBABBAAA", "AAABBABBABBABBABBABBAAAABBABBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAABBABBAAA", "AAAAAAAAAAAAAAAAAAAAAAAABBABBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBABBAAAAAAAAAAAAAAAABBABBAAA", "AAABBABBAAAAAAAAAAAAAAAABBABBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBABBAAAAAAAAAAAAAAAABBABBAAA", "AAABBABBAAAAAAAAAAAAAAAABBABBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBABBAAAAAAAAAAAAAAAABBABBAAA", "AAABBABBAAAAAAAAAAAAAAAABBABBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBABBAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBABBAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBABBAAAABBABBABBABBABBABBAAA", "AAABBABBAAAABBABBABBABBABBABBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAABBABBAAAABBABBABBABBABBABBAAA", "AAABBABBAAAABBABBABBABBABBABBAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", }; golly-2.5-src/gui-wx/icons/appicon16.ico0000644000175100001440000000053612156145314015046 00000000000000(( Àÿÿÿ¿¿¿¿¿¿¿¿¿ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿ»»»»»»»»¼Ì»ÌÌÌÌ˼̻ÌÌÌÌ˼̻ÌÌÌÌ˼̻»»»»»¼Ì»»»»»»¼Ì»»»»Ì˼̻»»»Ì˼̻»»»Ì˼̻»»»ÌË»»»»»»ÌË»»»»»»Ì˼ÌÌÌÌ»Ì˼ÌÌÌÌ»Ì˼ÌÌÌÌ»ÌË»»»»»»»»golly-2.5-src/gui-wx/icons/appicon32.ico0000644000175100001440000000177612156145314015053 00000000000000 h( @ÿÿÿ¿¿¿¿¿¿¿¿¿ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿ»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»¼ËÌ»»Ì¼Ë̼Ë̼˻»¼ËÌ»»Ì¼Ë̼Ë̼˻»»»»»»»»»»»»»»»»»¼ËÌ»»Ì¼Ë̼Ë̼˻»¼ËÌ»»Ì¼Ë̼Ë̼˻»»»»»»»»»»»»»»»»»¼ËÌ»»»»»»»»»»»»»¼ËÌ»»»»»»»»»»»»»»»»»»»»»»»»»»»»»¼ËÌ»»»»»»»»Ì¼Ë»»¼ËÌ»»»»»»»»Ì¼Ë»»»»»»»»»»»»»»»»»»¼ËÌ»»»»»»»»Ì¼Ë»»¼ËÌ»»»»»»»»Ì¼Ë»»»»»»»»»»»»»»»»»»¼ËÌ»»»»»»»»Ì¼Ë»»¼ËÌ»»»»»»»»Ì¼Ë»»»»»»»»»»»»»»»»»»»»»»»»»»»»»Ì¼Ë»»»»»»»»»»»»»Ì¼Ë»»»»»»»»»»»»»»»»»»¼Ë̼Ë̼ËÌ»»Ì¼Ë»»¼Ë̼Ë̼ËÌ»»Ì¼Ë»»»»»»»»»»»»»»»»»»¼Ë̼Ë̼ËÌ»»Ì¼Ë»»¼Ë̼Ë̼ËÌ»»Ì¼Ë»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»golly-2.5-src/gui-wx/icons/appicon48.ico0000644000175100001440000000413612156145314015053 0000000000000000((0`Àÿÿÿ¿¿¿¿¿¿¿¿¿ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿ»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»Ì̼ÌË»»¼ÌËÌ̼ÌËÌ̼ÌËÌÌ»»Ì̼ÌË»»¼ÌËÌ̼ÌËÌ̼ÌËÌÌ»»Ì̼ÌË»»¼ÌËÌ̼ÌËÌ̼ÌËÌÌ»»Ì̼ÌË»»¼ÌËÌ̼ÌËÌ̼ÌËÌÌ»»»»»»»»»»»»»»»»»»»»»»»»»»Ì̼ÌË»»¼ÌËÌ̼ÌËÌ̼ÌËÌÌ»»Ì̼ÌË»»¼ÌËÌ̼ÌËÌ̼ÌËÌÌ»»Ì̼ÌË»»¼ÌËÌ̼ÌËÌ̼ÌËÌÌ»»Ì̼ÌË»»¼ÌËÌ̼ÌËÌ̼ÌËÌÌ»»»»»»»»»»»»»»»»»»»»»»»»»»Ì̼ÌË»»»»»»»»»»»»»»»»»»»Ì̼ÌË»»»»»»»»»»»»»»»»»»»Ì̼ÌË»»»»»»»»»»»»»»»»»»»Ì̼ÌË»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»»»»»»»»»»»»»»»»»»»»»»»»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»»»»»»»»»»»»»»»»»»»»»»»»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»Ì̼ÌË»»»»»»»»»»»»¼ÌËÌÌ»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»¼ÌËÌÌ»»»»»»»»»»»»»»»»»»»¼ÌËÌÌ»»»»»»»»»»»»»»»»»»»¼ÌËÌÌ»»»»»»»»»»»»»»»»»»»¼ÌËÌÌ»»»»»»»»»»»»»»»»»»»»»»»»»»Ì̼ÌËÌ̼ÌËÌ̼ÌË»»¼ÌËÌÌ»»Ì̼ÌËÌ̼ÌËÌ̼ÌË»»¼ÌËÌÌ»»Ì̼ÌËÌ̼ÌËÌ̼ÌË»»¼ÌËÌÌ»»Ì̼ÌËÌ̼ÌËÌ̼ÌË»»¼ÌËÌÌ»»»»»»»»»»»»»»»»»»»»»»»»»»Ì̼ÌËÌ̼ÌËÌ̼ÌË»»¼ÌËÌÌ»»Ì̼ÌËÌ̼ÌËÌ̼ÌË»»¼ÌËÌÌ»»Ì̼ÌËÌ̼ÌËÌ̼ÌË»»¼ÌËÌÌ»»Ì̼ÌËÌ̼ÌËÌ̼ÌË»»¼ÌËÌÌ»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»golly-2.5-src/gui-wx/icons/file-mc.icns0000644000175100001440000011434212156145314014745 00000000000000icns˜âics#Hðøüüþþþþþþþþþþþþðøüüþþþþþþþþþþþþis32€\tplf\6†òòîèáÓ»4…‚íðºz[„ƒðåz­Eƒô‚÷åzzn‚÷…ÿÎi‚ûÿ ÿ ÿð‡‚ûƒÿ ÿò”‚ûÿ ÿ ÿû›‚ûÿ ÿ ÿû¢‚ûÿ ƒÿþª‚ÿÿ ÿ ÿÿ¬‚‡ÿ­‚‡ÿ¯‚øïï€îííìô¥‚ &! #%€€\tplf\6†òòîèáÓ»4…‚íðºz[„ƒðåz­Eƒô‚÷åzzn‚÷…ÿÎi‚ûÿ2ÿ2ÿð‡‚ûƒÿ2ÿó”‚ûÿ2ÿ2ÿû›‚ûÿ2ÿ2ÿû¢‚ûÿ2ƒÿþª‚ÿÿ2ÿ2ÿÿ¬‚‡ÿ­‚‡ÿ¯‚øïï€îííìô¥‚ &! #%€€\tplf\6†òòîèáÓ»4…‚íðº{[„ƒðå{­Eƒô‚÷å{{n‚÷…#Îi‚û#ÿ#ÿ#ð‡‚ûƒ#ÿ#÷”‚û#ÿ#ÿ#û›‚û#ÿ#ÿ#û¢‚û#ÿƒ#þª‚ÿ#ÿ#ÿ#ÿ¬‚ÿ…#ÿ­‚‡ÿ¯‚øïï€îííìô¥‚ &! #%€s8mk<°¿¿¿¿¿©CQÿÿÿÿÿÿÿ©0Wÿÿÿÿÿÿÿÿ¯0Wÿÿÿÿÿÿÿÿø¯/WÿÿÿÿÿÿÿÿÿøžWÿÿÿÿÿÿÿÿÿÿÒ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ UÿÿÿÿÿÿÿÿÿÿÑ 1Š—————————{ICN#ÿüÿþÿÿ€ÿÿÀÿÿàÿÿàÿÿðÿÿðÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿüÿþÿÿ€ÿÿÀÿÿàÿÿàÿÿðÿÿðÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøil32a€ÿŠÿÖ ÓÏÍËÇÃÀ¸©¨ªª‰ÿãåâãâàßÝÛØÖÕÐóÈÁ€‡ÿ忀ä ãáàÞÛÙØÕδàÇÇ€†ÿåçå äâàÞÜÚØÓ½ÿÝÆÀ€…ÿçç‚åäãáßÞÛÕÃÿÿàÇÂ…ÿèéçææåãâáÞÙÆ€ÿÝÿ„ÿéêè€çæäãáÜËÿàÇ«„ÿêëƒéèèäãáÜÓ½¤——¼Ãµƒÿìí€ë…ê ÜÓÃþ¾²­ªƒÿîïíììŠÿ×ÕÌÁƒÿðñ€îÿ„ ÿÿ ÿßÝ×Ѓÿñò€ðÿ„ ÿÿ ÿìƒÿóôòññ‡ÿ ÿìƒÿõö€ô‡ÿ ÿ€îòƒÿ ÷øõøøÿ „ÿ ÿ€ðòƒÿøù€÷ÿ „ÿ ÿòƒÿ ùú÷÷øÿ „ÿ ÿñ€òƒÿùú€øÿ ‡ÿòñòîƒÿúû€ùÿ ‡ÿóóôðƒÿûü€ùÿ ÿÿ„ ÿôôõóƒÿûü€úÿ ÿÿ„ ÿõõöõƒÿûüûúúŠÿõõ÷õƒÿûýûú€ùø÷÷öøöƒÿüþûû€ÿWWûWWÿÒWW÷ÿ÷÷ø÷ƒÿüþýü€ÿWÒWÒWÿWúÿÒÿøøùøƒÿýÿýý€ÿWýWýWÿWûû÷ÿùùúùƒÿþÿþþ€ÿWýÒýWÿWüÿÒÿúúûùƒÿþÿþþ€ÿW€ý WÿÒWW÷ÿúúüùƒÿ“ÿƒÿ—ƒÿ—€ÿ€ÿŠÿÖ ÓÏÍËÇÃÀ¸©¨ªª‰ÿãåããâàßÝÛØÖÕÐóÈÁ€‡ÿ忀ä ãáàÞÛÙØÕδàÇÇ€†ÿåçå äâàÞÜÚØÓ½ÿÝÆÀ€…ÿçç‚åäãáßÞÛÕÃÿÿàÇÂ…ÿèéçææåãâáÞÙÆ€ÿÝÿ„ÿéê‚èççæäãàÜËÿàÇ«„ÿêëéèéèèäãàÜÒ½¤——¼Ãµƒÿìí€ë…ê ÜÒÃþ¾²­ªƒÿîïíììŠÿ×ÕÌÁƒÿðñ€îÿ„2 ÿÿ22ÿßÝ×Ѓÿñò€ðÿ„2ÿÿ22ÿìƒÿóôòññ‡ÿ22ÿìƒÿõö€ô‡ÿ22ÿ€îóƒÿ ÷øõøøÿ22„ÿ22ÿ€ðóƒÿøù€÷ÿ22„ÿ22ÿóƒÿ ùú÷÷øÿ22„ÿ22ÿñ€óƒÿùú€øÿ22‡ÿòñòîƒÿúû€ùÿ22‡ÿóóôðƒÿûü€ùÿ22ÿÿ„2ÿôôõóƒÿûü€úÿ22ÿÿ„2ÿõõöõƒÿûüûúúŠÿöõ÷õƒÿûýûú€ù€ø€÷öøöƒÿüþûû€ÿWWûWWÿÒWW÷ÿ÷÷ø÷ƒÿüÿýü€ÿWÒWÒWÿWúÿÒÿø÷ù÷ƒÿþÿýý€ÿWýWýWÿWûû÷ÿùùûùƒÿþÿþþ€ÿWýÒýWÿWüÿÒÿúúûùƒÿþÿþþ€ÿW€ý WÿÒWW÷ÿûúüùƒÿ“ÿƒÿ—ƒÿ—€ÿ€ÿŠÿÖ ÓÏÍËÇÃÀ¸©¨ªª‰ÿäåâãâàßÝÛØÖÕÐóÈÁ€‡ÿ忀ä ãáàÞÛÙØÕδàÇÇ€†ÿåçå äâàÞÜÚØÓ½ÿÝÆÀ€…ÿçç‚åäãáßÞÛÕÃÿÿàÇÂ…ÿèéçææåãâáÞÙÆ€ÿÝÿ„ÿéê‚èççæäãàÜËÿàÇ«„ÿëëéèéèèäãàÜÒ½¤——¼Ãµƒÿìí€ë…ê ÜÒÃþ¾²­ªƒÿîïíììŠ#×ÕÌÁƒÿðñ€î#„ÿ ##ÿÿ#ßÝ×Ѓÿñò€ð#„ÿ##ÿÿ#ìƒÿóôòññ‡#ÿÿ#ìƒÿõ÷€ô‡#ÿÿ#€îóƒÿ ÷øõøø#ÿÿ„#ÿÿ#€ðóƒÿøù€÷#ÿÿ„#ÿÿ#óƒÿ ùú÷÷ø#ÿÿ„#ÿÿ#ñ€óƒÿùú€ø#ÿÿ‡#òñòîƒÿúû€ù#ÿÿ‡#óóôðƒÿûü€ù#ÿÿ##„ÿ#ôôõóƒÿûü€ú#ÿÿ##„ÿ#õõöõƒÿûüûúúŠ#õõ÷õƒÿûýûú€ù€ø€÷öøöƒÿüþûû€ÿWWûWWÿÒWW÷ÿ÷÷ø÷ƒÿüÿüü€ÿWÒWÒWÿWúÿÒÿøøù÷ƒÿýÿýý€ÿWýWýWÿWûû÷ÿùùûùƒÿþÿþþ€ÿWýÒýWÿWüÿÒÿúúûùƒÿþÿþþ€ÿW€ý WÿÒWW÷ÿúúüùƒÿ“ÿƒÿ—ƒÿ—€ÿl8mk  8ÿÿÿÿÿÿÿÿÿÿÿÿÿô½ Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[JÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4JÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKn—²°°°°°°°°°°°°°°°°°°²—n1@KJJJJJJJJJJJJJJJJJJK@1it32GùÿÿŒà†ß‚ÞÝ€Ü ÛÚÚÙÙØØ×ÖÖ€ÕÔÓÓÒÑÑÐÏÎÌÊÇÄ¿½¹¶®´¥UÄàá…àßàßàß‚ÞÝÝÜÜÛÚÚ€ÙØ×ÖÖÕÕÔÔÓÓÒÑÐÐÏÌÉÈÄÁ¿½¸´³°®£3Áˆáàáá€à€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÐÎËÈÅ¿¼¸µ²¬®¹cfÀââ…áâá€à€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÐÎËÈÆÂ¿¼¸´°««¶Ud¿âáâ€áâáàà€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÏÎÉÈÅÁ¾»¶±®©­±pU¾„âáá‚âáàà߀ÞÝÜÜÛ€ÚÙØØ×ÖÖ€ÕÔÓÓÒÑÏÌÊÈÅÀ½¹´¯ª¦¸¢¤H½Œâáàà߀ÞÝÜÜÛ€ÚÙØØ×ÖÖ€ÕÔÓÓÒÑÏÌÉÇÿ¼·±«¦§»ª´U¼âáà‚߀ÞÝÜÜÛ€ÚÙØ××ÖÖ€ÕÔÓÓÒÑÏÌÉÆÁ½¹²¬¦¢²´¼³H»Žãâáà߀ÞÝÜÜÛÚÙØØ××ÖÕÕÔÓÓÒÐÏÌÉÆÀº¶®¨¡ž°ÄʳUºãâáà߀ÞÝÜÜÛ€ÚÙÙØØ××ÖÕÕÔÓÓÑÐÎÊÇľ·±©¢›˜¸ÓʳU¹ãâá€àßßÞÞÝÝÜÜÛ€ÚÙÙØØ××ÖÕÕÔÓÓÑÐÍÉÅÀº²ª¢›”–ÝÓʳH¸‘ãâá€àßÞÞÝÝÜÛÛÚÙÙØØ×ÖÖ€ÕÔÓÑÐÍȼ´«£š“ØÝÓʳH·’ãâá€àßÞ€Ý ÜÛÛÚÙÙØØ×ÖÖ€ÕÓÓÑÎËž¶®¥›“‹ÉåÝÓʱH¶“äãâ€áààßßÞ€ÝÜÛÛ€ÚÙØØ××ÖÖÔÓÓÏÌÇÀ¹°¥”‹¾íåÝÓʱZµ”äãâ€áààßßÞ€ÝÜÛÛ€ÚÙØØ××ÖÔÔÓÑÎÈú±¨”гôíåÝÓʱZ´•äãâ€áà߀Þ!ÝÜÜÛÚÚÙØØ××ÕÔÔÑÏÌÅ¿µª ”‰§úôíåÝÓʱZ³–äãâ€áà߀Þ!ÝÜÜÛÚÚÙØØ××ÕÓÒÏÍÇÀ¶­¡–‹›ÿúôíåÝÓʱZ²—åäã€âá€à߀ÞÝÜÜÛ€ÚÙÙØÖÕÓÑÎȹ¯£—‹–ÿÿúôíåÝÓʱZ±˜åäã€âá€à߀ÞÝÜÜÛ€ÚÙÙ×ÕÕÒÏÉ»°¥˜Œ€ÿúôíåÝÓʱZ°˜åäãã€âá€à߀ÞÝÜÜÛ€Ú ÙØ×ÕÓÏÉû³¦šŽŽÿúôíåÝÓʱZ¯™åäãã€âáà€ßÞÝÝÜÛÛÚØØÖÓÐËﳍœ†‚ÿúôíåÝÓʱH®ææ…åæåäãã€âáà€ßÞÝÝÜÛÛÙØØÔÑÌÆ½µªž…ƒÿúôíåÝÓʱH­€ç„æçæåää€ãâ€áà€ßÞÝÝÜÛÚÙØÕÓÎÈÀµ«ž“†„ÿúôíåÝÓʱH¬ƒç€æ‚çŽæåää€ãâ€áà€ßÞÝÝÜÚÚØÕÓÎÈÀ·« “ˆ…ÿúôíåÝÓʱH«…çæ…çææç‰æåää€ãâ€á€àßßÞÞÜÛÚ×ÔÐʸ­¡•‰†ÿúôíåÝÓʲUª•ç†æåää€ãâ€á€à"ßÞÞÝÜÚÙÕÐʸ®¢—‹€von‚€€Š¢®ÀÑäÝÓʲU©’èççè‡çæåå€äã€â%áààßÞÝÝÛÙÖÐËĺ°¤™Ž„zrmheddehhlot•¶ÈʳH¨–è‡çæåå€äã€âáààßÝÝÜÚ×ÒÍż²¦œ’‡xrnk€j lnqsuzŽ©¬¯U§éšèƒçæåå€äã€âáààßÞÝÜØÔÏÈ¿¶« —…yvtr€s tvx{~…‰™™U¦ƒéšè€ç€æåå€ä)ããââáààßÝÜÚÖÐʹ°¦œ”‡ƒ€~}||}~~€‚„†‰Œš v3¥…éèé”è€ç‰æâ€àÜÛ×ÒÌŽ´«£›•ŒŠˆ‰‰€ˆ ‰‰ŠŒ‘”–Ÿªb¥Šêéèèéƒèƒåæââ€à âß×ÒÏÂÁº±ª¤ž›—•–€•”•–€—š›œ¬{n¤êŠéëéƒèëèè‚倿€âà€ß ×ÒÏ˾¹²­©¥¢‚¡£€¡ Ÿ ¡¡£³¤‘ê‡éèèååèé‚èåèèçç‚æââàà€ßØÏÏ˾¶¼·³°¯­­¬®®­®®«¬ª©©¨¦¦§¥¸y¤€ë‘êƒéëéƒèé„èçç€æååæâàáàßÞØÏÏ˺º¼»º¹¹¸¸¹ ·µµ³±°®­¬¬¯¦¤ƒë€êëë‹ê€é„ëƒèé‚èç€æ ååäââáßÞÛØÏÐË€ÂÃÂÃÂÁÁ¿½¼º·¶µ²±±­¤…ìëììŒëê‡ë€êéèèêéè ççææåäããáÞÞÛØÏ‚ËÊË€Ê ÉÈÇÅÂÁÀ½¼¹¶µ®¤‹ì‘ëêƒèêéè€ç ææääâáßÞÜÚØƒÐÑÐÏÐÏÐÏÏÍÌÊÇÄÄÁ¿¼¹¸¤ìŽë‚êîèƒêéè€ç ææääâáàßÞÜÛØØƒÖÕÔÕÔÔÓÒÐÍËÈÆÃÀ½º¤ííŽìƒë¥ÿáØØÖØØÙØÙØ××ÖÖÕÓÒÏÌÊÇľ¤îˆí€ì€íìëëÿ¥ýÿáÛÜÛÛÚÙÙØ×ÖÖÕÓÑÍËÈŤ„îííîîí€ì€íëëÿ€ýþÿÿýþÿÿýþÿÿýýÿÿþýÿÿþýÿÿþ‚ý€ÿý€ÿ€ýÿáÜÝÝÜÛÚÙÙØ××ÕÔÑÎÌÈŤŠîíí€ì‚íÿýýþøÔáÿúÖßþýÚÙýþÝØûÿãÔøÿåÓõÿ€ý ÿïÐíÿñÒêÿýýÿá„Ý ÜÛÛÚÚÙØØÕÕÑÎÍɤŒîíìì‚í,ÿýþöŠ@;³=9­¨H2šªE4޾S0}½Q5lòþýÿãi7RÇm9HÓÿýÿãƒßÞÞÝÜÜÛÚÚÙÙÖÔÒÎͤðïðð„ïðïìƒí-ÿýÿÕ4C;3B>EA.<;(%S9) C38Åÿýÿ¢-> S)E ÿýÿåäƒÞ ßÞÞÝÜÛÚÚÙÙÖÔÒϤð€ï€ð‚ï€ð‚í+ÿýÿâ3[>[THSA‘ÿýÿíììƒêéèèç€æåäããâá¤õò ÿýÿÐ!@:NôÿŽýÿš^ÿýÿîíìïƒê éèèçææåääãã⤔õ ÿýþúˆ ;Á¢(1²ÿþŽýÿæ_ZÖwKÖÿýÿïîíïïƒê éèèçææåääã⤆ö…õö‚õ ÿýýÿÀVnçÈZgÜÿýþúLô§O„ôþýÿððï„êééèççæååã¤÷‰ö‡õ ÿýÿâLG_MCgûÿŽý ÿ·>@x:Fšÿýÿ€ð‚ï€êëê€éèççæå夂÷ˆö„õ ÿýÿÖ#9)IõÿŽýÿ¡S}ÿýÿñðñ€ðïíïìêëëê€éèççæå¤„÷öö÷÷…öõ ÿýþ÷1¯ˆ)§ÿþŽý ÿáWLÄ\AÎÿýÿ€ñ ððòòîîíììëëê€éèççæ¤Œ÷„ö õÿýýÿÉXrðÕ[gãÿý þÿ£N•ü²K‰øþýÿ€ñðòòðï€îììëëê€éèçç¤ö÷ö ÿýÿáUFleDoûÿŽýÿºG<‰LB ÿýÿòòñðò€ðï€îíìëëê€éè礒÷ööÿýÿË"$87#JóÿŽý ÿ”U!#|ÿýÿ‚òðï€îíìëëê€éè¤÷øø÷ööÿýþóe ¢„–ÿþŽý ÿÕ95ºQ'Áÿýÿ‚òñðï€îíììëê€é¤öƒø÷÷øŠ÷ ÿýýÿÎ]}ôØeuèÿý ÿâ½ßÿëÁÙÿýýÿƒòñ€ðïï€îí€ìêéé¤öˆøˆ÷ ÿýÿê_B |b> }þþý€ÿý€ÿ€ýÿ„òññððïï€îí€ìëê¤õ‹ø…÷ ÿýÿÓ%)2((Eôÿšýÿ…òññððïï€îí€ìë¤öŠø†÷ÿýÿð_j Œÿþýý…ÿþ€ÿþ€ÿý€ÿþ€ÿþýýÿòòóƒò€ñðïï€îí€ì¤õ‹ø…÷'ÿýýÿÐStùÕUlêÿýýÿò®¦êú¹Ÿâý¼žÜÿÊ›ÒÿÏœÊÿÔÀýÿòõõ„òñïï€îíìì¤ôùˆøùƒ÷+ÿýÿíjF,‰oB+Šÿþýý…:(fšC&U”?/H©J.<¢S4- M7)·ÿýÿ€õòòó‚òñðï€îíì¤ôƒùøøùùƒøù-÷÷ÿýÿÒ*3 3+3 Eóÿýö?-J+;), T%(J+/K5xÿýÿ„òóòñðð€îí¤ó‰ù‚ø‚ù+ÿýÿíN ‚[þÿýýy[L‹;£ //š/°ÿýÿ‚ò‚ó€òñððïîî¤òŒù€øù/ÿýýÿÐaö×btéÿýýÿêtaÙ÷†]Éü‹WÀÿ W®ÿ¬W£ÿ¶T•ûþýÿõõòô…óòòñððïî¤ñ“ù+ÿýÿïxC(™‰@(”ÿþýþ¢F,t¦P)`¯P2V³Z2E°c87´h:4Àÿýÿ€õ€ô…óòñððï¤ñú’ù+ÿýÿË*9 7:7 IóÿýøP1 D3I/.M-)>1/T)8|ÿýÿ…ô„óòñðð¤ðúù,ÿýÿå:rZpüÿýýzKy=…,‹%". ¢ÿýÿõ…ô…óò€ñð¤ïƒúùùúú‰ù+ÿýýÿÏ|“ñ݇Œåÿýýÿë•€×ò–zÌù¦zÂúªv·û´u®ûÄ|¡öþýÿ‚öƒô„óòòññ¤ï‰ú‡ùÿ€ý…ÿý…ÿþ€ÿþ€ÿþ€ÿþ€ÿþýýÿöõ…ôƒóòòñ¤î‹ú„ùöùÿ¥ýÿõöƒõ…ô‚óòò¤îŽú„ù¥ÿõõö…õ„ô‚óò¤î‘úˆùöö‚ù‚ø„ù€öù‚öùöõ€ö…õ…ôó¤íû’ú„ùöö„ùööù€öø‰ö†ùö†õƒô€ó¤íû“úù‚öùùö‡ùƒö†õ„ôó¤íƒûúúûú„ùƒöùƒö…ù†÷€ùƒö†õƒô¤í‰ûú†ù†ö‚ø…ù÷ööùùƒö…õ‚ô¤íŒûŽúŠù‰ø÷…ù…ö…õ€ô¤íûŽúŠù‰ø†÷‡ö…õó¤í’ûú‹ùˆø‡÷…ö„õô¤í”ûŽúˆùŠø†÷†ö‚õó¤íüü”ûŽú‰ùˆø‡÷…öõó¤í‚ü€ûüûú‰ùˆø†÷†öõõò¤íˆüûŽú‡ù‰ø†÷†öò¤îŠüûúûŒúˆùˆø…÷…öñ¤îü‘û‹úˆùˆø‡÷‚öð¤îüûŒú‡ùˆø†÷öð¤î…üýüý€üýüýüý‚ü‚ûÿüûü…û‚úû öÝÔÔßòúúùú‚ùøùƒø÷øøƒ÷ö÷î¤ï“ýüƒûÿûƒ€WÛüº€WúûüüãŽ\‚Woûúúÿÿú‡ù†ø÷÷î¤ï•ý‚ûÿûƒ€W¯üŽ€WúûüÕ_WWƒ¤©“xWûúúÿÿƒú‡ù†øí¤ï•ý‚ûÿûƒ€WxüWúûñgWZÍ‚üéûúúÿÿ…ú‡ù„øí¤ïþþ“ý‚ûÿûƒWmWWæüüÅWbWWúü°WWž…üúúÿÿ‡ú†ùƒøì¤ï‚þý‚ûÿûƒW¤WW»ýü™W™WWúü{WWä…üúúÿÿˆú‡ùøë¤ïˆþŠý‚ûÿûƒW°xWŽýýbx¯WWúü_Wb†üúúÿÿûû‡ú‡ù€øë¤ð‹þ‡ý‚ûÿûƒW°°WWòÆW°°WWúüWWm†üúúÿÿû‡ú†ùøøë¤ðþ…ý‚ûÿûƒW°çWWƤWç°WWúü_Wbýý„üúúÿÿƒû‡ú†ùë¤ðþ„ýûÿûƒW°ýmW™mmý°WWúü{WWâ€ýƒüúÿÿ…û†ú…ùê¤ð“þ€ýûÿûƒW°ý¤WbW¤ý°WWúü°WWœ‚ýüúÿÿ†û†ú„ùê¤ð•þýûÿûƒW°ýÜ€W Üý°WWúúòjWWµ‚ýÈîüúÿÿˆû†ú‚ùë¤ð–þû!ÿûƒW°ýýmWmýý°WWúúýÖ_WWsŸª—pWçúúÿÿüˆû†úùë¤ð–þûÿû„W°ýýÜÑÜýý°WWúúýýäŽ\Wb’õúúÿÿüüˆû‡úùùë¤ð•þ‚ûÿûþþ‰ýúýøß××ê€ý…üˆû†úùë¤ðŸþý‹üˆû†úë¤ð¡þýŠü‰û„úë¤ðÿ£þýŠüˆûƒúë¤ðÿ¢þýŠü‡û‚úì¤ð„ÿþÿŸþŽýŠü‡ûúìÿÿÿÿÿÿÿÿÿÿŒ‚à…ß‚ÞÝ€Ü ÛÚÚÙÙØØ×ÖÖ€ÕÔÓÓÒÑÑÐÏÎÌÊÇÄ¿½¹¶®´¥Uăàßàßàßààß‚ÞÝÜÝÝÜ€ÚØÙÙ××ÖÖÕÕ€ÔÓÒÑÐÐÎÌÊÈÄÁ¿½¹µ³±®£3Áˆáàáà€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÐÎËÈÅ¿¼¸µ²¬®¹cfÀââ„áââ‚áàà€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÐÎËÈÆÂ¿¼¸´°««¶Ud¿€âáâáâáàà€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÏÎÉÈÅÁ¾»¶±®©­±pU¾„âáá‚âáàà߀ÞÝÜÜÛ€ÚÙØØ×ÖÖ€ÕÔÓÓÒÑÏÌÊÈÅÀ½¹´¯ª¦¸¢¤H½Œâáàà߀ÞÝÜÜÛ€ÚÙØØ×ÖÖ€ÕÔÓÓÒÑÏÌÉÇÿ¼·±«¦§»ª´U¼âáà‚߀ÞÝÜÜÛ€ÚÙØ××ÖÖ€ÕÔÓÓÒÑÏÌÉÆÁ½¹²¬¦¢²´¼³H»Žãâáà߀ÞÝÜÜÛÚÙØØ××ÖÕÕÔÓÓÒÐÏÌÉÆÀº¶®¨¡ž°ÄʳUºãâáà߀ÞÝÜÜÛ€ÚÙÙØØ××ÖÕÕÔÓÓÑÐÎÊÇľ·±©¢›˜¸ÓʳU¹ãâá€àßßÞÞÝÝÜÜÛ€ÚÙÙØØ××ÖÕÕÔÓÓÑÐÍÉÅÀº²ª¢›”–ÝÓʳH¸‘ãâá€àßÞÞÝÝÜÛÛÚÙÙØØ×ÖÖ€ÕÔÓÑÐÍȼ´«£š“ØÝÓʳH·’ãâá€àßÞ€Ý ÜÛÛÚÙÙØØ×ÖÖ€ÕÓÓÑÎËž¶®¥›“‹ÉåÝÓʱH¶“äãâ€áààßßÞ€ÝÜÛÛ€ÚÙØØ××ÖÖÔÓÓÏÌÇÀ¹°¥”‹¾íåÝÓʱZµ”äãâ€áààßßÞ€ÝÜÛÛ€ÚÙØØ××ÖÔÔÓÑÎÈú±¨”гôíåÝÓʱZ´•äãâ€áà߀Þ!ÝÜÜÛÚÚÙØØ××ÕÔÔÑÏÌÅ¿µª ”‰§úôíåÝÓʱZ³–äãâ€áà߀Þ!ÝÜÜÛÚÚÙØØ××ÕÓÒÏÍÇÀ¶­¡–‹›ÿúôíåÝÓʱZ²—åäã€âá€à߀ÞÝÜÜÛ€ÚÙÙØÖÕÓÑÎȹ¯£—‹–ÿÿúôíåÝÓʱZ±˜åäã€âá€à߀ÞÝÜÜÛ€ÚÙÙ×ÕÕÒÏÉ»°¥˜Œ€ÿúôíåÝÓʱZ°˜åäãã€âá€à߀ÞÝÜÜÛ€Ú ÙØ×ÕÓÏÉû³¦šŽŽÿúôíåÝÓʱZ¯™åäãã€âáà€ßÞÝÝÜÛÛÚØØÖÓÐËﳍœ†‚ÿúôíåÝÓʱH®ææ…åæåäãã€âáà€ßÞÝÝÜÛÛÙØØÔÑÌÆ½µªž…ƒÿúôíåÝÓʱH­ç†æçæåää€ãâ€áà€ßÞÝÝÜÛÚÙØÕÓÎÈÀµ«ž“†„ÿúôíåÝÓʱH¬ƒç€æçæåää€ãâ€áà€ßÞÝÝÜÚÚØÕÓÎÈÀ·« “ˆ…ÿúôíåÝÓʱH«…çæ‚çæçç€æçˆæåää€ãâ€á€àßßÞÞÜÛÚ×ÔÐʸ­¡•‰†ÿúôíåÝÓʲUª“çæç†æåää€ãâ€á€à"ßÞÞÝÜÚÙÕÐʸ®¢—‹€von‚€€Š¢®ÀÑäÝÓʲU©”èˆçæåå€äã€â%áààßÞÝÝÛÙÖÐËĺ°¤™Ž„zrmheddehhlot•¶ÈʳH¨—èçè„çæåå€äã€âáààßÝÝÜÚ×ÒÍż²¦œ’‡xrnk€j lnqsuzŽ©¬¯U§éšèƒçæåå€äã€âáààßÞÝÜØÔÏÈ¿¶« —…yvtr€s tvx{~…‰™™U¦ƒé—èçèç€æåå€ä)ããââáààßÝÜÚÖÐʹ°¦œ”‡ƒ€~}||}~~€‚„†‰Œš v3¥…éèé”èçèç‰æâ€àÜÛ×ÒÌŽ´«£›•ŒŠˆ‰‰€ˆ ‰‰ŠŒ‘”–Ÿªb¥Œêéèèéƒèƒåæââ€à âß×ÒÏÂÁº±ª¤ž›—•–€•”•–€—š›œ¬{n¤êŠéëéƒèëèè‚倿€âà€ß ×ÒÏË¿¹²­©¦¢‚¡£€¡ Ÿ ¡¡£³¤‘ê‡éèèååèé‚èåèèçç‚æââàà€ßØÏÏË¿·¼·³°¯­­¬®®­®®«¬ª©©¨¦¦§¥¸y¤€ë‘êƒéëéƒèé„èçç€æååæâàáàßÞØÏÏ˺º¼»º¹¹¸¸¹ ·µµ³±°®­¬¬¯¦¤ƒë€êëë‹ê€é„ëƒèé‚èç€æ ååäââáßÞÛØÏÐË€ÂÃÂÃÂÁÁ¿½¼º·¶µ²±±­¤…ìëììŒëê‡ë€êéèèêéè ççææåäããáßÞÛØÏ‚ËÊË€Ê ÉÈÇÅÂÁÀ½¼¹¶µ®¤‹ì‘ëêƒèê€éèè€ç ææääâáßÞÜÚØƒÐÑÐÏÐÏ ÍÌÊÇÄÄÁ¿¼¹¸¤Žìë‚êîèƒêéè€ç ææääâáàÞÞÜÛØØƒÖÕÔÕÔÔÓÒÐÍËÈÆÃÀ½º¤ííŽìƒë¥ÿáØØÖØØÙØÙØ××ÖÖÕÓÒÏÌÊÇľ¤îˆí€ìíëëÿ¥ýÿáÛÜÛÛÚÙÙØ×ÖÖÕÓÑÍËÈŤ„îííîîí€ì€íëëÿ€ýþÿÿýýÿÿýþÿÿþýÿÿþýÿÿþýÿÿþ‚ý€ÿýþÿÿ€ýÿáÜÝÝÜÛÚÙÙØ××ÕÔÑÎÌÈŤŠîíí€ì‚íÿýýþúßèÿûáçþýäâþþæâüÿêÞùÿìÞ÷þ€ý ÿòÜðÿõÝïÿýýÿá„Ý ÜÛÛÚÚÙØØÕÕÑÎÍɤŒîíìì‚í,ÿýþùªvh¿®uj½À}d«Àzi¥Ï…e”Ì‚lŒóþýÿé“nvЕqsÛÿýÿãƒßÞÞÝ€ÜÚÚÙÙÖÔÒÎͤðïðð„ïðïìƒí-ÿýÿßjuBahuJ^suLTlp[K{qYIpjj:Ìÿýÿ¹en8v`u;”ÿýÿåäƒÞ ßÞÞÝÜÛÚÚÙÙÖÔÒϤð€ï€ð‚ï€ð‚í+ÿýÿéY/#oc,"ls1!\t0%Q†5$G7)5ÕÿýÿÅ?+'ˆF,% ÿýÿ„åáàßßÞÝÜÛÛÚÙÙÖÔÒ¤ƒðïï‚ð€ïðð‚î+ÿýýÿÂasæÈUfÞÛleÑàfUÈì~\¶ï{M¬ÿþýþûŸWó¥K„óþýÿ€åãááàßÞÞÝÜÜÛÚÙÙÖÔ¤‹ðïïòíòð€î-ÿýþú¹ƒuÊăvÄË‹pµÓŒt¯×”q Ü—u™óÿýÿî¥yƒÜ­{‚Þÿýÿæå€ãæããááàßßÞÝÝÜÛÚÙÙÖ¤ðò,ÿýÿÜit8dxtEdrvBR}rTPzsPCpb=Ðÿýÿµhg1lr9›ÿýÿç„ã âááàßßÞÝÜÜÛÚÚÙ¤òò€ñõòðñððò€ðCòòÿýÿàO*ig.bg.Tx1#Ix1@:(.Òÿýÿ¹<($…I1 ™ÿýÿèèææããææäãââáàßßÞÝÝÛÛÚ¤‚òõò…ðòò€ðÿ€ý,±YnÛÃkkÍÌc`ÆÙvd¶ÞrV®ç…b›ùýýÿõF‡í¤Wzèÿýÿèææçã€æ ääãâááààßÞÝÜÜÛ¤„ò€õòòðòððƒò.ðÿýýþÿôùÿÿøùÿÿ÷÷ÿÿû÷ÿÿùôÿÿýöÿþýýÿô§s‘å¬wìÿýÿéè€æã€æ ääãââáààßÞÝÝܤ†òõƒòðð‚òÿ€ýþÿÿýýÿÿýýÿÿýýÿÿþýÿÿþýÿÿþ€ýÿÀnu?‚h|Bžÿýÿëéè€ê€æ€ä ãââááàßßÝݤ…ôòòôõˆòÿ›ý ÿ¼?4$zD8#”ÿýÿ…êæ åääãâááàßÞ¤‡ôòòõòõõò ÿýýþÿùýÿÿúüÿý ÿò‡GvàŒ;käÿýÿ†ê èçææåääãâááàߤõõôõƒôòõò€õöÿ€ýÊ‹ÞÔŽ‰×ÿýþù³z™ï¼z•îÿýÿìêêì‚ê èèçææååäãââáअõôöòôô€õ€òõ ÿýÿâux=rƒxGzùÿŽýÿ¿rm8ŽvvA¥ÿýÿíììƒêéèèç€æåäãââá¤õò ÿýÿÚN?%\d@%föÿŽýÿ±B8$xLA$“ÿýÿîíìïƒê éèèçææåääããᤔõ ÿýþú—6LÈ®GHµÿþŽýÿër0iÛ‰A[Øÿýÿïîíïïƒê éèèçææåääã㤆ö…õö‚õ ÿýýÿÐ~‹êÖ…Šâÿýþû´u¥ó½|Ÿöþýÿððï„êééèççæååã¤÷‰ö‡õ ÿýÿè}L}}{RƒúÿŽý ÿÊvvG’p{J¬ÿýÿ€ð‚ï€êëê€éèççæå夂÷ˆö„õ ÿýÿßSG*YYG*`õÿŽýÿ¶EB&qGH%ÿýÿñðñ€ðïîïìêëëê€éèççæå¤„÷öö÷÷…öõ ÿýþù?F´™4<®ÿþŽý ÿæm9ZÈs/QÒÿýÿ€ñ ððòòîîíììëëê€éèççæ¤Œ÷„ö õÿýýÿ×ñÞ†æÿý þÿ»x¨üÃsŸùþýÿ€ñðòòðï€îììëëê€éèçç¤ö÷ö ÿýÿè„}G„‘|PˆûþŽýÿË|qEŸyL±ÿýÿòòñðò€ðï€îíìëëê€éè礒÷ööÿýÿ×RQ,WeR/eõÿŽý ÿ¬MH(rTR*ÿýÿ‚òðï€îíìëëê€éè¤÷øø÷ööÿýþõ|%4­•3/ÿþŽý ÿÝUIÃl-<Äÿýÿ‚òñðï€îíììëê€é¤öƒø÷÷øŠ÷ ÿýýÿØ}“õàˆ‘ëÿý ÿåÁáÿìËÝÿýýÿƒòñ€ðïï€îí€ìêéé¤öˆøˆ÷ ÿýÿïzS“xW–ýþý€ÿý€ÿ€ýÿ„òññððïï€îíììëëê¤ö‹ø…÷ ÿýÿÜYY3W[Y5_ôÿšýÿ…òññððïï€îí€ìë¤öŠø†÷ÿýþôw23˜‚+,–þþýýÿþ€ÿþ€ÿþ€ÿý€ÿþ€ÿþýýÿòòóƒòñïï€îí€ì¤õ‹ø…÷'ÿýýÿ×yŽøÝt„ëÿýýþõļïû˸çýϸäÿ×µÛÿܵÖþà·Ò€ýÿòõõ„òñïï€îíìì¤ô€ù‰øùƒ÷+ÿýÿñ•~]ž–|`¡þþýý¤s`…´|_u«vhn½hcµ†mZ±qZÄÿýÿ€õòòó‚òñðï€îíì¤ô‚ù€øùùƒøù-÷÷ÿýÿÜ^c8X_e"! 9yŒU7mnZ2 !$€ñ ððòòîîíììëëê€éèççæ¤Œ÷„ö õ"!!\¨…*O™Œ6! %|©j%hŸw' !$€ñðòòðï€îììëëê€éèçç¤ö÷ö "!7ÖÿÖs¾ÿï Ž!_ðý¼oåÿÚZ!$òòñðò€ðï€îíìëëê€éè礒÷öö"!=ÒÚ¯yÂçÂx# Ž! gãÑ¡zßݲ\!$‚òðï€îíìëëê€éè¤÷øø÷ öö"! +qtfCi›x:! ;tbD‚žg1 !$‚òñðï€îíììëê€é¤öƒø÷÷øŠ÷ "!" PŠs)J”„4! +*)!,:.€!$ƒòñ€ðïï€îí€ìêéé¤öˆøˆ÷ "!6Êÿät³ÿñy !€ ! €!$„òññððïï€îí€ìëê¤õŒø„÷ "!?ÛëÆÆõÔr! š!$…òññððïï€îí€ìë¤öŠø†÷'"! /€rBr‹rG" !!  !!!€!$òòóƒò€ñðïï€îí€ì¤õ‹ø…÷."!!M—u%C|t0!! 0im4(fn;%`qA"YsHUtM!MrX#!!$òõõ„òñðï€îíìì¤ôùˆøùƒ÷+"!4¿ûÛmªüêu !"Žùô‘†õù™xîú­qéþ³lÜþÁcÓÿÖR!$€õòòó‚òñðï€îíì¤ô‚ù€øùùƒøù-÷÷"!?ÞðÊŠÉûÝv! !%®üä‘¥øàŸŸ÷즌ö殕ëé¼…ìôÊT!$„òóòñðð€îí¤ó‰ù‚ø‚ù+"!1‹¬}H~œK"!!"kž„Vh©™U]œŠaX¢£`V™¦kI’“t:!$‚ò‚ó€òñððïîî¤òŒù€øù/"!" G…f$>kc. !! 1gi5+u};$alB$f„K`†Q!NnW#!!$õõòô…óòòñððïî¤ñ“ù "!/¶øÌ\ ûäi€!„óð‚yïì„kæøždàôŸ\Ô÷­VÈþÊH!$€õ€ô…óòñððï¤ñú’ù+"!?áïÁ‚ÎùÙ†# !%´ûÝ ¬úÙ”¡øä²–øá£Žîå±ïðÊe!$…ô„óòñðð¤ð€úù,"!2—šX‹¸ŽL# !$zµ™Yr¦Šfl°¥ea¦Žq]¡’wY£²|>!$õ…ô…óò€ñð¤ïƒúùùúú‰ù"€!6=:&5[I' €!-VQ**?:0&OW1%>:6$>:5$A[?"!!$‚öƒô„óòòññ¤ï‰ú‡ù"€!€!!" !   ! !€!€!$öõ„ô„óòòñ¤î‹ú„ùöù#¥!$õöƒõ…ô‚óòò¤îúƒù%£$%õõö…õ„ô‚óò¤î‘úˆùöö‚ù‚ø„ù€öù‚öùöõ€ö…õ…ôó¤íû’ú„ùöö„ùööù€öø‰ö†ù€ö†õ„ô€ó¤íû’ú‚ù‚öùùö‡ùƒö†õ„ôó¤íƒûúúûú„ùƒöùƒö…ù†÷€ùƒö†õƒô¤í‰ûú†ù†ö‚ø…ù÷ööùùƒö…õ‚ô¤íŒûŽúŠù‰ø÷…ù…ö…õ€ô¤íûŽúŠùˆø‡÷‡ö„õôó¤í’ûŽúŠù‡øˆ÷…ö„õô¤í”ûŽúˆù‰ø‡÷†ö‚õó¤í€ü“ûŽú‰ùˆø‡÷…öõó¤í‚ü”ûú‰ùˆø†÷†öõõò¤íˆüûúˆù‰ø†÷†öò¤îŠüûŽúˆù‡ø‡÷„öñ¤îüûúû‹úˆùˆø‡÷‚öð¤îüûú‡ùˆø†÷öð¤îƒüý„üý…üƒûÿüûüûü€ûú€û üûöÝÔÔßòûûùúùùøùù‚øùùø÷ø÷÷ø÷ööî¤ï“ýüƒûÿûƒ€WÛüº€WúûüüãŽ\‚Woûúúÿÿú‡ù†ø÷÷î¤ï•ý‚ûÿûƒ€W¯üŽ€WúûüÕ_WWƒ¤©“xWûúúÿÿƒú‡ù†øí¤ï•ý‚ûÿûƒ€WxüWúûñgWZÍ‚üéûúúÿÿ…ú†ù…øí¤ïþþ“ý‚ûÿûƒWmWWæüüÅWbWWúü°WWž…üúúÿÿ‡ú†ùƒøì¤ï‚þý‚ûÿûƒW¤WW»üü™W™WWúü{WWä…üúúÿÿ‡úˆùøë¤ïˆþŠý‚ûÿûƒW°xWŽýýbx¯WWúü_Wb†üúúÿÿûû‡ú‡ù€øë¤ð‹þ‡ý‚ûÿûƒW°°WWòÆW°°WWúüWWm†üúúÿÿû‡ú†ùøøë¤ðþ…ý‚ûÿûƒW°çWWƤWç°WWúü_Wbýý„üúúÿÿƒû‡ú†ùë¤ðþƒýûÿûƒW°ýmW™mmý°WWúü{WWâ€ýƒüúÿÿ…û†ú…ùê¤ð“þ€ýûÿûƒW°ý¤WbW¤ý°WWúü°WWœ‚ýüúÿÿ†û†ú„ùê¤ð•þýûÿûƒW°ýÜ€W Üý°WWúúòjWWµ‚ýÈîüúÿÿˆû†ú‚ùë¤ð–þû ÿûƒW°ýýmWmýý°WWúúýÖ_WWsŸª—pWçúúÿÿ‰û†úùë¤ð–þûÿû„W°ýýÜÑÜýý°WWúúýýäŽ\Wb’õúúÿÿü‰û‡úùùë¤ð•þ‚ûÿûþþ‰ýúýøß××ê€ý…üˆû†úùë¤ðŸþý‹üˆû†úë¤ð¡þý‹üˆû„úë¤ðÿ£þýŠüˆûƒúë¤ðÿ¢þýŠü‡û‚úì¤ð„ÿþÿŸþŽýŠü‡ûúìÿÿÿÿÿÿÿÿt8mk@    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúé°N   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÅI#  ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø~A  %6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûƒV  *>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó˜B .EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÓC 1IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáòB 3KÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúòC 3LÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòB 3LÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóB 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóB 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóB 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòìB 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÈB 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó£( 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê„3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²v 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷l% 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨< 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚO3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøW# 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ]( 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^, 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^/3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^13Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[23MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿY33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿX33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿV33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿS33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿQ33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿN33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33LÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL33LÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL33KÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK31IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI1.EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿE. *>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>*  %6I[itz~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~zti[I6%  ,;IU]befffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb]UI;,   ,6>EIKLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLKIE>6,  %*.133333333333333333333333333333333333333333333333333333333333333333333333333333331.*%    golly-2.5-src/gui-wx/icons/file-rle.icns0000644000175100001440000011400012156145314015117 00000000000000icns˜ICN#ÿÀÿøÿüÿÿÿÿ€ÿÿÀÿÿÀÿÿàÿÿàÿÿðÿÿðÿÿðÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿüÿþÿÿ€ÿÿÀÿÿàÿÿàÿÿðÿÿðÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøÿÿøil32j€ÿŒàŠÿÖÓÏÍËÇÃÀ¸©€ªàà‰ÿãåâãâàßÝÛØÖÕÐÃ³ÈÆ€à‡ÿ忀äãáàÞÛÙØÕδàÇÊàà†ÿåçåäâàÞÜÚØÓ½ÿÝÆÃàà…ÿçç‚åäãáßÞÛÕÃÿÿàÇÅà…ÿèéçææåãâáÞÙÆ€ÿÝÃÂàà„ÿéêè€çæäãáÜËÿàǵà„ÿêëƒéèèäãáÜÓ½¤——¼Ã·ààƒÿìí€ë…ê ÜÓÃþ¾²­ªàƒÿîïíììŠÿ×ÕÌÁàƒÿðñ€îÿ„ ÿÿ ÿßÝ×Ðàƒÿñò€ðÿ„ ÿÿ ÿìƒÿóôòññ‡ÿ ÿìƒÿõö€ô‡ÿ ÿ€îòƒÿ ÷øõøøÿ „ÿ ÿ€ðòƒÿøù€÷ÿ „ÿ ÿòƒÿ ùú÷÷øÿ „ÿ ÿñ€òƒÿùú€øÿ ‡ÿòñòîƒÿúû€ùÿ ‡ÿóóôðƒÿûü€ùÿ ÿÿ„ ÿôôõóƒÿûü€úÿ ÿÿ„ ÿõõöõƒÿûüûúúŠÿõõ÷õƒÿûýûú€ùø÷÷öøöƒÿüþûWWÒÿW€ù WWÒÿ÷÷ø÷ƒÿüþýüüûWüWÿWúúùWøøÿøøùøƒÿýÿ€ýûWWãÿWûûùWWãÿùùúùƒÿþÿþþýûWýWÿWüüùWûûÿúúûùƒÿþÿ€þûWýWÿ€Wù€Wÿúúüùƒÿ“ÿƒÿ—ƒÿ—€ÿ€ÿŒàŠÿÖÓÏÍËÇÃÀ¸©€ªàà‰ÿãåããâàßÝÛØÖÕÐÃ³ÈÆ€à‡ÿ忀äãáàÞÛÙØÕδàÇÊàà†ÿåçåäâàÞÜÚØÓ½ÿÝÆÃàà…ÿçç‚åäãáßÞÛÕÃÿÿàÇÅà…ÿèéçææåãâáÞÙÆ€ÿÝÃÂàà„ÿéê‚èççæäãàÜËÿàǵà„ÿêëéèéèèäãàÜÒ½¤——¼Ã·ààƒÿìí€ë…ê ÜÒÃþ¾²­ªàƒÿîïíììŠÿ×ÕÌÁàƒÿðñ€îÿ„2 ÿÿ22ÿßÝ×Ðàƒÿñò€ðÿ„2ÿÿ22ÿìƒÿóôòññ‡ÿ22ÿìƒÿõö€ô‡ÿ22ÿ€îóƒÿ ÷øõøøÿ22„ÿ22ÿ€ðóƒÿøù€÷ÿ22„ÿ22ÿóƒÿ ùú÷÷øÿ22„ÿ22ÿñ€óƒÿùú€øÿ22‡ÿòñòîƒÿúû€ùÿ22‡ÿóóôðƒÿûü€ùÿ22ÿÿ„2ÿôôõóƒÿûü€úÿ22ÿÿ„2ÿõõöõƒÿûüûúúŠÿöõ÷õƒÿûýûú€ù€ø€÷öøöƒÿüþûWWÒÿW€ù WWÒÿ÷÷ø÷ƒÿüÿýüüûWüWÿWúúùWùøÿø÷ù÷ƒÿþÿ€ýûWWãÿWûûùWWãÿùùûùƒÿþÿþþýûWýWÿWüüùWûûÿúúûùƒÿþÿ€þûWýWÿ€Wù€Wÿûúüùƒÿ“ÿƒÿ—ƒÿ—€ÿ€ÿŒàŠÿÖÓÏÍËÇÃÀ¸©€ªàà‰ÿäåâãâàßÝÛØÖÕÐÃ³ÈÆ€à‡ÿ忀äãáàÞÛÙØÕδàÇÊàà†ÿåçåäâàÞÜÚØÓ½ÿÝÆÃàà…ÿçç‚åäãáßÞÛÕÃÿÿàÇÅà…ÿèéçææåãâáÞÙÆ€ÿÝÃÂàà„ÿéê‚èççæäãàÜËÿàǵà„ÿëëéèéèèäãàÜÒ½¤——¼Ã·ààƒÿìí€ë…ê ÜÒÃþ¾²­ªàƒÿîïíììŠ#×ÕÌÁàƒÿðñ€î#„ÿ ##ÿÿ#ßÝ×Ðàƒÿñò€ð#„ÿ##ÿÿ#ìƒÿóôòññ‡#ÿÿ#ìƒÿõ÷€ô‡#ÿÿ#€îóƒÿ ÷øõøø#ÿÿ„#ÿÿ#€ðóƒÿøù€÷#ÿÿ„#ÿÿ#óƒÿ ùú÷÷ø#ÿÿ„#ÿÿ#ñ€óƒÿùú€ø#ÿÿ‡#òñòîƒÿúû€ù#ÿÿ‡#óóôðƒÿûü€ù#ÿÿ##„ÿ#ôôõóƒÿûü€ú#ÿÿ##„ÿ#õõöõƒÿûüûúúŠ#õõ÷õƒÿûýûú€ù€ø€÷öøöƒÿüþûWWÒÿW€ù WWÒÿ÷÷ø÷ƒÿüÿ€üûWüWÿWúúùWùøÿøøù÷ƒÿýÿ€ýûWWãÿWûûùWWãÿùùûùƒÿþÿþþýûWýWÿWüüùWûûÿúúûùƒÿþÿ€þûWýWÿ€Wù€Wÿúúüùƒÿ“ÿƒÿ—ƒÿ—€ÿl8mk  8ÿÿÿÿÿÿÿÿÿÿÿÿÿô½ Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[JÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ·Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¬Jÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ4JÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿSJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿJKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿKn—²°°°°°°°°°°°°°°°°°°²—n1@KJJJJJJJJJJJJJJJJJJK@1ics#Hðøüüþþþþþþþþþþþþðøüüþþþþþþþþþþþþis32€^uqmh]7†òòîèáÓ»6…‚íðºz]„ƒðåz®Gƒô‚÷åzzo‚÷…ÿÎj‚ûÿ ÿ ÿðˆ‚ûƒÿ ÿò•‚ûÿ ÿ ÿûœ‚ûÿ ÿ ÿû¤‚ûÿ ƒÿþª‚ÿÿ ÿ ÿÿ­‚‡ÿ®‚‡ÿ±‚øïï€îííìô§‚ ( #! %&€€^uqmh]7†òòîèáÓ»6…‚íðºz]„ƒðåz®Gƒô‚÷åzzo‚÷…ÿÎj‚ûÿ2ÿ2ÿðˆ‚ûƒÿ2ÿó•‚ûÿ2ÿ2ÿûœ‚ûÿ2ÿ2ÿû¤‚ûÿ2ƒÿþª‚ÿÿ2ÿ2ÿÿ­‚‡ÿ®‚‡ÿ±‚øïï€îííìô§‚ ( #! %&€€^uqmh]7†òòîèáÓ»6…‚íðº{]„ƒðå{®Gƒô‚÷å{{o‚÷…#Îj‚û#ÿ#ÿ#ðˆ‚ûƒ#ÿ#÷•‚û#ÿ#ÿ#ûœ‚û#ÿ#ÿ#û¤‚û#ÿƒ#þª‚ÿ#ÿ#ÿ#ÿ­‚ÿ…#ÿ®‚‡ÿ±‚øïï€îííìô§‚ ( #! %&€s8mk<°¿¿¿¿¿©CQÿÿÿÿÿÿÿ©0Wÿÿÿÿÿÿÿÿ¯0Wÿÿÿÿÿÿÿÿø¯/WÿÿÿÿÿÿÿÿÿøžWÿÿÿÿÿÿÿÿÿÿÒ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ WÿÿÿÿÿÿÿÿÿÿÕ UÿÿÿÿÿÿÿÿÿÿÑ 1Š—————————{it32GÿÿŒà†ß‚ÞÝ€Ü ÛÚÚÙÙØØ×ÖÖ€ÕÔÓÓÒÑÑÐÏÎÌÊÇÄ¿½¹¶°¶¨UÄàá…àßàßàß‚ÞÝÝÜÜÛÚÚ€ÙØ×ÖÖÕÕÔÔÓÓÒÑÐÐÏÌÉÈÄÁ¿½¸´³°°¥"3Áˆáàáá€à€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÐÎËÈÅ¿¼¸µ²¬®»gfÀââ…áâá€à€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÐÎËÈÆÂ¿¼¸´°««¸Yj¿âáâ€áâáàà€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÏÎÉÈÅÁ¾»¶±®©­³sU¾„âáá‚âáàà߀ÞÝÜÜÛ€ÚÙØØ×ÖÖ€ÕÔÓÓÒÑÏÌÊÈÅÀ½¹´¯ª¦¸¥¦O½Œâáàà߀ÞÝÜÜÛ€ÚÙØØ×ÖÖ€ÕÔÓÓÒÑÏÌÉÇÿ¼·±«¦§»ª¶U¼âáà‚߀ÞÝÜÜÛ€ÚÙØ××ÖÖ€ÕÔÓÓÒÑÏÌÉÆÁ½¹²¬¦¢²´¾µO»Žãâáà߀ÞÝÜÜÛÚÙØØ××ÖÕÕÔÓÓÒÐÏÌÉÆÀº¶®¨¡ž°ÄʵUºãâáà߀ÞÝÜÜÛ€ÚÙÙØØ××ÖÕÕÔÓÓÑÐÎÊÇľ·±©¢›˜¸ÓʵU¹ãâá€àßßÞÞÝÝÜÜÛ€ÚÙÙØØ××ÖÕÕÔÓÓÑÐÍÉÅÀº²ª¢›”–ÝÓʵO¸‘ãâá€àßÞÞÝÝÜÛÛÚÙÙØØ×ÖÖ€ÕÔÓÑÐÍȼ´«£š“ØÝÓʵO·’ãâá€àßÞ€Ý ÜÛÛÚÙÙØØ×ÖÖ€ÕÓÓÑÎËž¶®¥›“‹ÉåÝÓʳO¶“äãâ€áààßßÞ€ÝÜÛÛ€ÚÙØØ××ÖÖÔÓÓÏÌÇÀ¹°¥”‹¾íåÝÓʳZµ”äãâ€áààßßÞ€ÝÜÛÛ€ÚÙØØ××ÖÔÔÓÑÎÈú±¨”гôíåÝÓʳZ´•äãâ€áà߀Þ!ÝÜÜÛÚÚÙØØ××ÕÔÔÑÏÌÅ¿µª ”‰§úôíåÝÓʳZ³–äãâ€áà߀Þ!ÝÜÜÛÚÚÙØØ××ÕÓÒÏÍÇÀ¶­¡–‹›ÿúôíåÝÓʳZ²—åäã€âá€à߀ÞÝÜÜÛ€ÚÙÙØÖÕÓÑÎȹ¯£—‹–ÿÿúôíåÝÓʳZ±˜åäã€âá€à߀ÞÝÜÜÛ€ÚÙÙ×ÕÕÒÏÉ»°¥˜Œ€ÿúôíåÝÓʳZ°˜åäãã€âá€à߀ÞÝÜÜÛ€Ú ÙØ×ÕÓÏÉû³¦šŽŽÿúôíåÝÓʳZ¯™åäãã€âáà€ßÞÝÝÜÛÛÚØØÖÓÐËﳍœ†‚ÿúôíåÝÓʳO®ææ…åæåäãã€âáà€ßÞÝÝÜÛÛÙØØÔÑÌÆ½µªž…ƒÿúôíåÝÓʳO­€ç„æçæåää€ãâ€áà€ßÞÝÝÜÛÚÙØÕÓÎÈÀµ«ž“†„ÿúôíåÝÓʳO¬ƒç€æ‚çŽæåää€ãâ€áà€ßÞÝÝÜÚÚØÕÓÎÈÀ·« “ˆ…ÿúôíåÝÓʳO«…çæ…çææç‰æåää€ãâ€á€àßßÞÞÜÛÚ×ÔÐʸ­¡•‰†ÿúôíåÝÓÊ´Uª•ç†æåää€ãâ€á€à"ßÞÞÝÜÚÙÕÐʸ®¢—‹€von‚€€Š¢®ÀÑäÝÓÊ´U©’èççè‡çæåå€äã€â%áààßÞÝÝÛÙÖÐËĺ°¤™Ž„zrmheddehhlot•¶ÈʵO¨–è‡çæåå€äã€âáààßÝÝÜÚ×ÒÍż²¦œ’‡xrnk€j lnqsuzŽ©®±U§éšèƒçæåå€äã€âáààßÞÝÜØÔÏÈ¿¶« —…yvtr€s tvx{~…‰ššU¦ƒéšè€ç€æåå€ä)ããââáààßÝÜÚÖÐʹ°¦œ”‡ƒ€~}||}~~€‚„†‰Œš¢z3¥…éèé”è€ç‰æâ€àÜÛ×ÒÌŽ´«£›•ŒŠˆ‰‰€ˆ ‰‰ŠŒ‘”–Ÿªf¥Šêéèèéƒèƒåæââ€à âß×ÒÏÂÁº±ª¤ž›—•–€•”•–€—š›œ¬~r¤êŠéëéƒèëèè‚倿€âà€ß ×ÒÏ˾¹²­©¥¢‚¡£€¡ Ÿ ¡¡£µ#¤‘ê‡éèèååèé‚èåèèçç‚æââàà€ßØÏÏ˾¶¼·³°¯­­¬®®­®®«¬ª©©¨¦¦§¥¸|¤€ë‘êƒéëéƒèé„èçç€æååæâàáàßÞØÏÏ˺º¼»º¹¹¸¸¹ ·µµ³±°®­¬¬¯¨¤ƒë€êëë‹ê€é„ëƒèé‚èç€æ ååäââáßÞÛØÏÐË€ÂÃÂÃÂÁÁ¿½¼º·¶µ²±±¯¤…ìëììŒëê‡ë€êéèèêéè ççææåäããáÞÞÛØÏ‚ËÊË€Ê ÉÈÇÅÂÁÀ½¼¹¶µ°¤‹ì‘ëêƒèêéè€ç ææääâáßÞÜÚØƒÐÑÐÏÐÏÐÏÏÍÌÊÇÄÄÁ¿¼¹¸¤ìŽë‚êîèƒêéè€ç ææääâáàßÞÜÛØØƒÖÕÔÕÔÔÓÒÐÍËÈÆÃÀ½º¤ííŽìƒë¥ÿáØØÖØØÙØÙØ××ÖÖÕÓÒÏÌÊÇľ¤îˆí€ì€íìëëÿ¥ýÿáÛÜÛÛÚÙÙØ×ÖÖÕÓÑÍËÈŤ„îííîîí€ì€íëëÿ€ýþÿÿýþÿÿýþÿÿýýÿÿþýÿÿþýÿÿþ‚ý€ÿý€ÿ€ýÿáÜÝÝÜÛÚÙÙØ××ÕÔÑÎÌÈŤŠîíí€ì‚íÿýýþøÔáÿúÖßþýÚÙýþÝØûÿãÔøÿåÓõÿ€ý ÿïÐíÿñÒêÿýýÿá„Ý ÜÛÛÚÚÙØØÕÕÑÎÍɤŒîíìì‚í,ÿýþöŠ@;³=9­¨H2šªE4޾S0}½Q5lòþýÿãi7RÇm9HÓÿýÿãƒßÞÞÝÜÜÛÚÚÙÙÖÔÒÎͤðïðð„ïðïìƒí-ÿýÿÕ4C;3B>EA.<;(%S9) C38Åÿýÿ¢-> S)E ÿýÿåäƒÞ ßÞÞÝÜÛÚÚÙÙÖÔÒϤð€ï€ð‚ï€ð‚í+ÿýÿâ3[>[THSA‘ÿýÿíììƒêéèèç€æåäããâá¤õò ÿýÿÐ!@:NôÿŽýÿš^ÿýÿîíìïƒê éèèçææåääãã⤔õ ÿýþúˆ ;Á¢(1²ÿþŽýÿæ_ZÖwKÖÿýÿïîíïïƒê éèèçææåääã⤆ö…õö‚õ ÿýýÿÀVnçÈZgÜÿýþúLô§O„ôþýÿððï„êééèççæååã¤÷‰ö‡õ ÿýÿâLG_MCgûÿŽý ÿ·>@x:Fšÿýÿ€ð‚ï€êëê€éèççæå夂÷ˆö„õ ÿýÿÖ#9)IõÿŽýÿ¡S}ÿýÿñðñ€ðïíïìêëëê€éèççæå¤„÷öö÷÷…öõ ÿýþ÷1¯ˆ)§ÿþŽý ÿáWLÄ\AÎÿýÿ€ñ ððòòîîíììëëê€éèççæ¤Œ÷„ö õÿýýÿÉXrðÕ[gãÿý þÿ£N•ü²K‰øþýÿ€ñðòòðï€îììëëê€éèçç¤ö÷ö ÿýÿáUFleDoûÿŽýÿºG<‰LB ÿýÿòòñðò€ðï€îíìëëê€éè礒÷ööÿýÿË"$87#JóÿŽý ÿ”U!#|ÿýÿ‚òðï€îíìëëê€éè¤÷øø÷ööÿýþóe ¢„–ÿþŽý ÿÕ95ºQ'Áÿýÿ‚òñðï€îíììëê€é¤öƒø÷÷øŠ÷ ÿýýÿÎ]}ôØeuèÿý ÿâ½ßÿëÁÙÿýýÿƒòñ€ðïï€îí€ìêéé¤öˆøˆ÷ ÿýÿê_B |b> }þþý€ÿý€ÿ€ýÿ„òññððïï€îí€ìëê¤õ‹ø…÷ ÿýÿÓ%)2((Eôÿšýÿ…òññððïï€îí€ìë¤öŠø†÷ÿýÿð_j Œÿþýý…ÿþ€ÿþ€ÿý€ÿþ€ÿþýýÿòòóƒò€ñðïï€îí€ì¤õ‹ø…÷'ÿýýÿÐStùÕUlêÿýýÿò®¦êú¹Ÿâý¼žÜÿÊ›ÒÿÏœÊÿÔÀýÿòõõ„òñïï€îíìì¤ôùˆøùƒ÷+ÿýÿíjF,‰oB+Šÿþýý…:(fšC&U”?/H©J.<¢S4- M7)·ÿýÿ€õòòó‚òñðï€îíì¤ôƒùøøùùƒøù-÷÷ÿýÿÒ*3 3+3 Eóÿýö?-J+;), T%(J+/K5xÿýÿ„òóòñðð€îí¤ó‰ù‚ø‚ù+ÿýÿíN ‚[þÿýýy[L‹;£ //š/°ÿýÿ‚ò‚ó€òñððïîî¤òŒù€øù/ÿýýÿÐaö×btéÿýýÿêtaÙ÷†]Éü‹WÀÿ W®ÿ¬W£ÿ¶T•ûþýÿõõòô…óòòñððïî¤ñ“ù+ÿýÿïxC(™‰@(”ÿþýþ¢F,t¦P)`¯P2V³Z2E°c87´h:4Àÿýÿ€õ€ô…óòñððï¤ñú’ù+ÿýÿË*9 7:7 IóÿýøP1 D3I/.M-)>1/T)8|ÿýÿ…ô„óòñðð¤ðúù,ÿýÿå:rZpüÿýýzKy=…,‹%". ¢ÿýÿõ…ô…óò€ñð¤ïƒúùùúú‰ù+ÿýýÿÏ|“ñ݇Œåÿýýÿë•€×ò–zÌù¦zÂúªv·û´u®ûÄ|¡öþýÿ‚öƒô„óòòññ¤ï‰ú‡ùÿ€ý…ÿý…ÿþ€ÿþ€ÿþ€ÿþ€ÿþýýÿöõ…ôƒóòòñ¤î‹ú„ùöùÿ¥ýÿõöƒõ…ô‚óòò¤îŽú„ù¥ÿõõö…õ„ô‚óò¤î‘úˆùöö‚ù‚ø„ù€öù‚öùöõ€ö…õ…ôó¤íû’ú„ùöö„ùööù€öø‰ö†ùö†õƒô€ó¤íû“úù‚öùùö‡ùƒö†õ„ôó¤íƒûúúûú„ùƒöùƒö…ù†÷€ùƒö†õƒô¤í‰ûú†ù†ö‚ø…ù÷ööùùƒö…õ‚ô¤íŒûŽúŠù‰ø÷…ù…ö…õ€ô¤íûŽúŠù‰ø†÷‡ö…õó¤í’ûú‹ùˆø‡÷…ö„õô¤í”ûŽúˆùŠø†÷†ö‚õó¤íüü”ûŽú‰ùˆø‡÷…öõó¤í‚ü€ûüûú‰ùˆø†÷†öõõò¤íˆüûŽú‡ù‰ø†÷†öò¤îŠüûúûŒúˆùˆø…÷…öñ¤îü‘û‹úˆùˆø‡÷‚öð¤îüûŒú‡ùˆø†÷öð¤î…üýüý€üýüýüý‚ü‚ûüûü…û†úû‚úùú‚ùøùƒø÷øøƒ÷ö÷î¤ï“ýü„ûƒWxÅüüûWWƒ„û…WÕÿÿú‡ù†ø÷÷î¤ï•ýƒûWWbƒx€WÐüûWWƒ„ûWWb‚ƒÝÿÿƒú‡ù†øí¤ï•ýƒû WWƒüüÐWWŽüüWWƒ„ûWWƒƒûÿÿ…ú‡ù„øí¤ïþþ“ýƒûWWƒýýüWWƒüüWWƒüƒûWW„ü‚ûÿÿ‡ú†ùƒøì¤ï‚þýƒû WWƒýýÜWW¤üüWWƒ€üûWW„€ü€ûÿÿˆú‡ùøë¤ïˆþŠýƒû WWƒýÜxWbçýüWWƒ‚üûûWWm©éûÿÿûû‡ú‡ù€øë¤ð‹þ‡ýƒûƒWmÜýýüWWƒ„ü„WÖüÿÿû‡ú†ùøøë¤ðþ…ýƒûWWbƒWWŽ€ýüWWƒ„üWWyÖñüÿÿƒû‡ú†ùë¤ðþ„ý‚û WWƒýŽWWÆýýüWWƒ„üWW„ƒüÿÿ…û†ú…ùê¤ð“þ€ý‚û WWƒýòbWbòýýWWƒ„üWW„ƒüÿÿ†û†ú„ùê¤ð•þý‚û WWƒýý°WWŽýýWWƒ„üWW„ƒüÿÿˆû†ú‚ùë¤ð–þ‚ûWWƒ€ýxWWÆýWWb‚ƒºüWWb‚„°ÿÿüˆû†úùë¤ð–þ‚û WW„þýýÜWWbý…W¯ü…W“ÿÿüüˆû‡úùùë¤ð•þƒûþþýŒüˆû†úùë¤ðŸþý‹üˆû†úë¤ð¡þýŠü‰û„úë¤ðÿ£þýŠüˆûƒúë¤ðÿ¢þýŠü‡û‚úì¤ð„ÿþÿŸþŽýŠü‡ûúìÿÿÿÿÿÿÿÿÿÿŒ‚à…ß‚ÞÝ€Ü ÛÚÚÙÙØØ×ÖÖ€ÕÔÓÓÒÑÑÐÏÎÌÊÇÄ¿½¹¶°¶¨Uăàßàßàßààß‚ÞÝÜÝÝÜ€ÚØÙÙ××ÖÖÕÕ€ÔÓÒÑÐÐÎÌÊÈÄÁ¿½¹µ³±°¥"3Áˆáàáà€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÐÎËÈÅ¿¼¸µ²¬®»gfÀââ„áââ‚áàà€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÐÎËÈÆÂ¿¼¸´°««¸Yj¿€âáâáâáàà€ßÞ€ÝÜÛÛÚÙØØ×ÖÖÕÔÔÓÒÒÑÑÏÎÉÈÅÁ¾»¶±®©­³sU¾„âáá‚âáàà߀ÞÝÜÜÛ€ÚÙØØ×ÖÖ€ÕÔÓÓÒÑÏÌÊÈÅÀ½¹´¯ª¦¸¥¦O½Œâáàà߀ÞÝÜÜÛ€ÚÙØØ×ÖÖ€ÕÔÓÓÒÑÏÌÉÇÿ¼·±«¦§»ª¶U¼âáà‚߀ÞÝÜÜÛ€ÚÙØ××ÖÖ€ÕÔÓÓÒÑÏÌÉÆÁ½¹²¬¦¢²´¾µO»Žãâáà߀ÞÝÜÜÛÚÙØØ××ÖÕÕÔÓÓÒÐÏÌÉÆÀº¶®¨¡ž°ÄʵUºãâáà߀ÞÝÜÜÛ€ÚÙÙØØ××ÖÕÕÔÓÓÑÐÎÊÇľ·±©¢›˜¸ÓʵU¹ãâá€àßßÞÞÝÝÜÜÛ€ÚÙÙØØ××ÖÕÕÔÓÓÑÐÍÉÅÀº²ª¢›”–ÝÓʵO¸‘ãâá€àßÞÞÝÝÜÛÛÚÙÙØØ×ÖÖ€ÕÔÓÑÐÍȼ´«£š“ØÝÓʵO·’ãâá€àßÞ€Ý ÜÛÛÚÙÙØØ×ÖÖ€ÕÓÓÑÎËž¶®¥›“‹ÉåÝÓʳO¶“äãâ€áààßßÞ€ÝÜÛÛ€ÚÙØØ××ÖÖÔÓÓÏÌÇÀ¹°¥”‹¾íåÝÓʳZµ”äãâ€áààßßÞ€ÝÜÛÛ€ÚÙØØ××ÖÔÔÓÑÎÈú±¨”гôíåÝÓʳZ´•äãâ€áà߀Þ!ÝÜÜÛÚÚÙØØ××ÕÔÔÑÏÌÅ¿µª ”‰§úôíåÝÓʳZ³–äãâ€áà߀Þ!ÝÜÜÛÚÚÙØØ××ÕÓÒÏÍÇÀ¶­¡–‹›ÿúôíåÝÓʳZ²—åäã€âá€à߀ÞÝÜÜÛ€ÚÙÙØÖÕÓÑÎȹ¯£—‹–ÿÿúôíåÝÓʳZ±˜åäã€âá€à߀ÞÝÜÜÛ€ÚÙÙ×ÕÕÒÏÉ»°¥˜Œ€ÿúôíåÝÓʳZ°˜åäãã€âá€à߀ÞÝÜÜÛ€Ú ÙØ×ÕÓÏÉû³¦šŽŽÿúôíåÝÓʳZ¯™åäãã€âáà€ßÞÝÝÜÛÛÚØØÖÓÐËﳍœ†‚ÿúôíåÝÓʳO®ææ…åæåäãã€âáà€ßÞÝÝÜÛÛÙØØÔÑÌÆ½µªž…ƒÿúôíåÝÓʳO­ç†æçæåää€ãâ€áà€ßÞÝÝÜÛÚÙØÕÓÎÈÀµ«ž“†„ÿúôíåÝÓʳO¬ƒç€æçæåää€ãâ€áà€ßÞÝÝÜÚÚØÕÓÎÈÀ·« “ˆ…ÿúôíåÝÓʳO«…çæ‚çæçç€æçˆæåää€ãâ€á€àßßÞÞÜÛÚ×ÔÐʸ­¡•‰†ÿúôíåÝÓÊ´Uª“çæç†æåää€ãâ€á€à"ßÞÞÝÜÚÙÕÐʸ®¢—‹€von‚€€Š¢®ÀÑäÝÓÊ´U©”èˆçæåå€äã€â%áààßÞÝÝÛÙÖÐËĺ°¤™Ž„zrmheddehhlot•¶ÈʵO¨—èçè„çæåå€äã€âáààßÝÝÜÚ×ÒÍż²¦œ’‡xrnk€j lnqsuzŽ©®±U§éšèƒçæåå€äã€âáààßÞÝÜØÔÏÈ¿¶« —…yvtr€s tvx{~…‰ššU¦ƒé—èçèç€æåå€ä)ããââáààßÝÜÚÖÐʹ°¦œ”‡ƒ€~}||}~~€‚„†‰Œš¢z3¥…éèé”èçèç‰æâ€àÜÛ×ÒÌŽ´«£›•ŒŠˆ‰‰€ˆ ‰‰ŠŒ‘”–Ÿªf¥Œêéèèéƒèƒåæââ€à âß×ÒÏÂÁº±ª¤ž›—•–€•”•–€—š›œ¬~r¤êŠéëéƒèëèè‚倿€âà€ß ×ÒÏË¿¹²­©¦¢‚¡£€¡ Ÿ ¡¡£µ#¤‘ê‡éèèååèé‚èåèèçç‚æââàà€ßØÏÏË¿·¼·³°¯­­¬®®­®®«¬ª©©¨¦¦§¥¸|¤€ë‘êƒéëéƒèé„èçç€æååæâàáàßÞØÏÏ˺º¼»º¹¹¸¸¹ ·µµ³±°®­¬¬¯¨¤ƒë€êëë‹ê€é„ëƒèé‚èç€æ ååäââáßÞÛØÏÐË€ÂÃÂÃÂÁÁ¿½¼º·¶µ²±±¯¤…ìëììŒëê‡ë€êéèèêéè ççææåäããáßÞÛØÏ‚ËÊË€Ê ÉÈÇÅÂÁÀ½¼¹¶µ°¤‹ì‘ëêƒèê€éèè€ç ææääâáßÞÜÚØƒÐÑÐÏÐÏ ÍÌÊÇÄÄÁ¿¼¹¸¤Žìë‚êîèƒêéè€ç ææääâáàÞÞÜÛØØƒÖÕÔÕÔÔÓÒÐÍËÈÆÃÀ½º¤ííŽìƒë¥ÿáØØÖØØÙØÙØ××ÖÖÕÓÒÏÌÊÇľ¤îˆí€ìíëëÿ¥ýÿáÛÜÛÛÚÙÙØ×ÖÖÕÓÑÍËÈŤ„îííîîí€ì€íëëÿ€ýþÿÿýýÿÿýþÿÿþýÿÿþýÿÿþýÿÿþ‚ý€ÿýþÿÿ€ýÿáÜÝÝÜÛÚÙÙØ××ÕÔÑÎÌÈŤŠîíí€ì‚íÿýýþúßèÿûáçþýäâþþæâüÿêÞùÿìÞ÷þ€ý ÿòÜðÿõÝïÿýýÿá„Ý ÜÛÛÚÚÙØØÕÕÑÎÍɤŒîíìì‚í,ÿýþùªvh¿®uj½À}d«Àzi¥Ï…e”Ì‚lŒóþýÿé“nvЕqsÛÿýÿãƒßÞÞÝ€ÜÚÚÙÙÖÔÒÎͤðïðð„ïðïìƒí-ÿýÿßjuBahuJ^suLTlp[K{qYIpjj:Ìÿýÿ¹en8v`u;”ÿýÿåäƒÞ ßÞÞÝÜÛÚÚÙÙÖÔÒϤð€ï€ð‚ï€ð‚í+ÿýÿéY/#oc,"ls1!\t0%Q†5$G7)5ÕÿýÿÅ?+'ˆF,% ÿýÿ„åáàßßÞÝÜÛÛÚÙÙÖÔÒ¤ƒðïï‚ð€ïðð‚î+ÿýýÿÂasæÈUfÞÛleÑàfUÈì~\¶ï{M¬ÿþýþûŸWó¥K„óþýÿ€åãááàßÞÞÝÜÜÛÚÙÙÖÔ¤‹ðïïòíòð€î-ÿýþú¹ƒuÊăvÄË‹pµÓŒt¯×”q Ü—u™óÿýÿî¥yƒÜ­{‚Þÿýÿæå€ãæããááàßßÞÝÝÜÛÚÙÙÖ¤ðò,ÿýÿÜit8dxtEdrvBR}rTPzsPCpb=Ðÿýÿµhg1lr9›ÿýÿç„ã âááàßßÞÝÜÜÛÚÚÙ¤òò€ñõòðñððò€ðCòòÿýÿàO*ig.bg.Tx1#Ix1@:(.Òÿýÿ¹<($…I1 ™ÿýÿèèææããææäãââáàßßÞÝÝÛÛÚ¤‚òõò…ðòò€ðÿ€ý,±YnÛÃkkÍÌc`ÆÙvd¶ÞrV®ç…b›ùýýÿõF‡í¤Wzèÿýÿèææçã€æ ääãâááààßÞÝÜÜÛ¤„ò€õòòðòððƒò.ðÿýýþÿôùÿÿøùÿÿ÷÷ÿÿû÷ÿÿùôÿÿýöÿþýýÿô§s‘å¬wìÿýÿéè€æã€æ ääãââáààßÞÝÝܤ†òõƒòðð‚òÿ€ýþÿÿýýÿÿýýÿÿýýÿÿþýÿÿþýÿÿþ€ýÿÀnu?‚h|Bžÿýÿëéè€ê€æ€ä ãââááàßßÝݤ…ôòòôõˆòÿ›ý ÿ¼?4$zD8#”ÿýÿ…êæ åääãâááàßÞ¤‡ôòòõòõõò ÿýýþÿùýÿÿúüÿý ÿò‡GvàŒ;käÿýÿ†ê èçææåääãâááàߤõõôõƒôòõò€õöÿ€ýÊ‹ÞÔŽ‰×ÿýþù³z™ï¼z•îÿýÿìêêì‚ê èèçææååäãââáअõôöòôô€õ€òõ ÿýÿâux=rƒxGzùÿŽýÿ¿rm8ŽvvA¥ÿýÿíììƒêéèèç€æåäãââá¤õò ÿýÿÚN?%\d@%föÿŽýÿ±B8$xLA$“ÿýÿîíìïƒê éèèçææåääããᤔõ ÿýþú—6LÈ®GHµÿþŽýÿër0iÛ‰A[Øÿýÿïîíïïƒê éèèçææåääã㤆ö…õö‚õ ÿýýÿÐ~‹êÖ…Šâÿýþû´u¥ó½|Ÿöþýÿððï„êééèççæååã¤÷‰ö‡õ ÿýÿè}L}}{RƒúÿŽý ÿÊvvG’p{J¬ÿýÿ€ð‚ï€êëê€éèççæå夂÷ˆö„õ ÿýÿßSG*YYG*`õÿŽýÿ¶EB&qGH%ÿýÿñðñ€ðïîïìêëëê€éèççæå¤„÷öö÷÷…öõ ÿýþù?F´™4<®ÿþŽý ÿæm9ZÈs/QÒÿýÿ€ñ ððòòîîíììëëê€éèççæ¤Œ÷„ö õÿýýÿ×ñÞ†æÿý þÿ»x¨üÃsŸùþýÿ€ñðòòðï€îììëëê€éèçç¤ö÷ö ÿýÿè„}G„‘|PˆûþŽýÿË|qEŸyL±ÿýÿòòñðò€ðï€îíìëëê€éè礒÷ööÿýÿ×RQ,WeR/eõÿŽý ÿ¬MH(rTR*ÿýÿ‚òðï€îíìëëê€éè¤÷øø÷ööÿýþõ|%4­•3/ÿþŽý ÿÝUIÃl-<Äÿýÿ‚òñðï€îíììëê€é¤öƒø÷÷øŠ÷ ÿýýÿØ}“õàˆ‘ëÿý ÿåÁáÿìËÝÿýýÿƒòñ€ðïï€îí€ìêéé¤öˆøˆ÷ ÿýÿïzS“xW–ýþý€ÿý€ÿ€ýÿ„òññððïï€îíììëëê¤ö‹ø…÷ ÿýÿÜYY3W[Y5_ôÿšýÿ…òññððïï€îí€ìë¤öŠø†÷ÿýþôw23˜‚+,–þþýýÿþ€ÿþ€ÿþ€ÿý€ÿþ€ÿþýýÿòòóƒòñïï€îí€ì¤õ‹ø…÷'ÿýýÿ×yŽøÝt„ëÿýýþõļïû˸çýϸäÿ×µÛÿܵÖþà·Ò€ýÿòõõ„òñïï€îíìì¤ô€ù‰øùƒ÷+ÿýÿñ•~]ž–|`¡þþýý¤s`…´|_u«vhn½hcµ†mZ±qZÄÿýÿ€õòòó‚òñðï€îíì¤ô‚ù€øùùƒøù-÷÷ÿýÿÜ^c8X_e"! 9yŒU7mnZ2 !$€ñ ððòòîîíììëëê€éèççæ¤Œ÷„ö õ"!!\¨…*O™Œ6! %|©j%hŸw' !$€ñðòòðï€îììëëê€éèçç¤ö÷ö "!7ÖÿÖs¾ÿï Ž!_ðý¼oåÿÚZ!$òòñðò€ðï€îíìëëê€éè礒÷öö"!=ÒÚ¯yÂçÂx# Ž! gãÑ¡zßݲ\!$‚òðï€îíìëëê€éè¤÷øø÷ öö"! +qtfCi›x:! ;tbD‚žg1 !$‚òñðï€îíììëê€é¤öƒø÷÷øŠ÷ "!" PŠs)J”„4! +*)!,:.€!$ƒòñ€ðïï€îí€ìêéé¤öˆøˆ÷ "!6Êÿät³ÿñy !€ ! €!$„òññððïï€îí€ìëê¤õŒø„÷ "!?ÛëÆÆõÔr! š!$…òññððïï€îí€ìë¤öŠø†÷'"! /€rBr‹rG" !!  !!!€!$òòóƒò€ñðïï€îí€ì¤õ‹ø…÷."!!M—u%C|t0!! 0im4(fn;%`qA"YsHUtM!MrX#!!$òõõ„òñðï€îíìì¤ôùˆøùƒ÷+"!4¿ûÛmªüêu !"Žùô‘†õù™xîú­qéþ³lÜþÁcÓÿÖR!$€õòòó‚òñðï€îíì¤ô‚ù€øùùƒøù-÷÷"!?ÞðÊŠÉûÝv! !%®üä‘¥øàŸŸ÷즌ö殕ëé¼…ìôÊT!$„òóòñðð€îí¤ó‰ù‚ø‚ù+"!1‹¬}H~œK"!!"kž„Vh©™U]œŠaX¢£`V™¦kI’“t:!$‚ò‚ó€òñððïîî¤òŒù€øù/"!" G…f$>kc. !! 1gi5+u};$alB$f„K`†Q!NnW#!!$õõòô…óòòñððïî¤ñ“ù "!/¶øÌ\ ûäi€!„óð‚yïì„kæøždàôŸ\Ô÷­VÈþÊH!$€õ€ô…óòñððï¤ñú’ù+"!?áïÁ‚ÎùÙ†# !%´ûÝ ¬úÙ”¡øä²–øá£Žîå±ïðÊe!$…ô„óòñðð¤ð€úù,"!2—šX‹¸ŽL# !$zµ™Yr¦Šfl°¥ea¦Žq]¡’wY£²|>!$õ…ô…óò€ñð¤ïƒúùùúú‰ù"€!6=:&5[I' €!-VQ**?:0&OW1%>:6$>:5$A[?"!!$‚öƒô„óòòññ¤ï‰ú‡ù"€!€!!" !   ! !€!€!$öõ„ô„óòòñ¤î‹ú„ùöù#¥!$õöƒõ…ô‚óòò¤îúƒù%£$%õõö…õ„ô‚óò¤î‘úˆùöö‚ù‚ø„ù€öù‚öùöõ€ö…õ…ôó¤íû’ú„ùöö„ùööù€öø‰ö†ù€ö†õ„ô€ó¤íû’ú‚ù‚öùùö‡ùƒö†õ„ôó¤íƒûúúûú„ùƒöùƒö…ù†÷€ùƒö†õƒô¤í‰ûú†ù†ö‚ø…ù÷ööùùƒö…õ‚ô¤íŒûŽúŠù‰ø÷…ù…ö…õ€ô¤íûŽúŠùˆø‡÷‡ö„õôó¤í’ûŽúŠù‡øˆ÷…ö„õô¤í”ûŽúˆù‰ø‡÷†ö‚õó¤í€ü“ûŽú‰ùˆø‡÷…öõó¤í‚ü”ûú‰ùˆø†÷†öõõò¤íˆüûúˆù‰ø†÷†öò¤îŠüûŽúˆù‡ø‡÷„öñ¤îüûúû‹úˆùˆø‡÷‚öð¤îüûú‡ùˆø†÷öð¤îƒüý„üý…üƒûüûüûü€ûúûû†ú„ùúùùøùù‚øùùø÷ø÷÷ø÷ööî¤ï“ýü„ûƒWxÅüüûWWƒ„û…WÕÿÿú‡ù†ø÷÷î¤ï•ýƒûWWbƒx€WÐüûWWƒ„ûWWb‚ƒÝÿÿƒú‡ù†øí¤ï•ýƒû WWƒüüÐWWŽüüWWƒ„ûWWƒƒûÿÿ…ú†ù…øí¤ïþþ“ýƒûWWƒýýüWWƒüüWWƒüƒûWW„ü‚ûÿÿ‡ú†ùƒøì¤ï‚þýƒû WWƒýýÜWW¤üüWWƒ€üûWW„€ü€ûÿÿ‡úˆùøë¤ïˆþŠýƒû WWƒýÜxWbçýüWWƒ‚üûûWWm©éûÿÿûû‡ú‡ù€øë¤ð‹þ‡ýƒûƒWmÜýýüWWƒ„ü„WÖüÿÿû‡ú†ùøøë¤ðþ…ýƒûWWbƒWWŽ€ýüWWƒ„üWWyÖñüÿÿƒû‡ú†ùë¤ðþƒý‚û WWƒýŽWWÆýýüWWƒ„üWW„ƒüÿÿ…û†ú…ùê¤ð“þ€ý‚û WWƒýòbWbòýýWWƒ„üWW„ƒüÿÿ†û†ú„ùê¤ð•þý‚û WWƒýý°WWŽýýWWƒ„üWW„ƒüÿÿˆû†ú‚ùë¤ð–þ‚ûWWƒ€ýxWWÆýWWb‚ƒºüWWb‚„°ÿÿ‰û†úùë¤ð–þ‚û WW„þýýÜWWbý…W¯ü…W“ÿÿü‰û‡úùùë¤ð•þƒûþþýŒüˆû†úùë¤ðŸþý‹üˆû†úë¤ð¡þý‹üˆû„úë¤ðÿ£þýŠüˆûƒúë¤ðÿ¢þýŠü‡û‚úì¤ð„ÿþÿŸþŽýŠü‡ûúìÿÿÿÿÿÿÿÿt8mk@    ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúé°N   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÅI#  ,ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿø~A  %6ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûƒV  *>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó˜B .EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãÓC 1IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿáòB 3KÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúòC 3LÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòB 3LÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóB 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôD 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóB 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóB 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóC 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòìB 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿëÈB 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿó£( 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿê„3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ²v 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷l% 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¨< 3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚO3MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿøW# 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþ]( 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^, 3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^/3Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^13Mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ[23MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿY33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿX33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿV33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿS33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿR33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿQ33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿP33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿN33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33MÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM33LÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL33LÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿL33KÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿK31IÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿI1.EÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿE. *>ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>*  %6I[itz~€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€~zti[I6%  ,;IU]befffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeb]UI;,   ,6>EIKLLMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLKIE>6,  %*.133333333333333333333333333333333333333333333333333333333333333333333333333333331.*%    golly-2.5-src/gui-wx/bitmaps/0000755000175100001440000000000012156145314013152 500000000000000golly-2.5-src/gui-wx/bitmaps/add.bmp0000644000175100001440000000246612156145314014332 00000000000000BM66(  ÿÿÿ€€€€€€€€€ÀÀÀÀÜÀðʦ¨\.»f3¿i5Én7Êp:ÍwCÎ{HЂRÑ„UÒ†XÕŽc×’i×”kÙ˜q[é¬ß©‰ä¶šèÀ¨ì̸ðÕÄôßÒöæÜøêâúðêüõðýøõýù÷þüúÿþýðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿgolly-2.5-src/gui-wx/bitmaps/add.xpm0000644000175100001440000000077312156145314014357 00000000000000/* XPM */ static const char *add_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c None", "B c #000000008080", /* pixels */ "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAABBAAAAAAA", "AAAAAAABBAAAAAAA", "AAAAAAABBAAAAAAA", "AAAAAAABBAAAAAAA", "AAABBBBBBBBBBAAA", "AAABBBBBBBBBBAAA", "AAAAAAABBAAAAAAA", "AAAAAAABBAAAAAAA", "AAAAAAABBAAAAAAA", "AAAAAAABBAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", }; golly-2.5-src/gui-wx/bitmaps/algo.bmp0000644000175100001440000000036612156145314014521 00000000000000BMöv(€  ÿÿÿ€×”kä¶šèÀ¨ÀÀÀðÕÄôßÒöæÜøêâUUUUUUUUUUU‰ˆUUUˆˆUUUˆˆUUUˆˆUUUˆˆˆUQUˆˆˆUˆˆQˆ†UUUˆƒUUU1ˆˆ5UUUQ8ˆ1UUUUS†UUUUUQUUUUUUUUUUUUUgolly-2.5-src/gui-wx/bitmaps/algo.xpm0000644000175100001440000000112012156145314014534 00000000000000/* XPM */ static const char *algo_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 6 1", /* colors */ "A c #000000008080", "B c #9A9AB6B6E4E4", "C c None", "D c #C4C4D5D5F0F0", "E c #DCDCE6E6F6F6", "F c #E2E2EAEAF8F8", /* pixels */ "CCCCCCCCCCCCCCCC", "CCCAAACCCCCCCCCC", "CBADEDABCCCCCCCC", "CABEEEBACCCCCCCC", "BAEEEEEABCCCCCCC", "ABEEAEEBACCCCCCC", "ADEEAEEDACCCCCCC", "AEEEAEEEACCAAAAA", "AEEEEEEEACCCAAAC", "AEEEEEEEACCCCACC", "AEEEAEEEACCCCCCC", "AEEEAEEEACCCCCCC", "AEEEAEEEACCCCCCC", "AEEFAEEEACCCCCCC", "AAAAAAAAACCCCCCC", "CCCCCCCCCCCCCCCC"}; golly-2.5-src/gui-wx/bitmaps/allstates.bmp0000644000175100001440000000036612156145314015573 00000000000000BMöv(€  ÿÿÿ€ß©‰¤  ÀÀÀøêâýù÷DDDDDDDDDDDDDDDDDDDDDDDDAAADAADADAADAADDDDDDDDDDDDDDDDAAA3QA"A3QA"AADDDDDDDDDDDDDDDDDDDDDDDDgolly-2.5-src/gui-wx/bitmaps/allstates.xpm0000644000175100001440000000107712156145314015621 00000000000000/* XPM */ static const char *allstates_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 5 1", /* colors */ "A c #000000008080", "B c #8989A9A9DFDF", "C c #A0A0A0A0A4A4", "D c None", "E c #E2E2EAEAF8F8", /* pixels */ "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "DAAAADAAAADAAAAD", "DACCADAEEADABBAD", "DACCADAEEADABBAD", "DAAAADAAAADAAAAD", "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "DAAAADAAAADAAAAD", "DADDADADDADADDAD", "DADDADADDADADDAD", "DAAAADAAAADAAAAD", "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD"}; golly-2.5-src/gui-wx/bitmaps/allstates_down.bmp0000644000175100001440000000036612156145314016622 00000000000000BMöv(€  ÿÿÿ@ŸiId``¦–ŒDDDDDDDDDDDDDDDDDDDDDDDDAAADAADADAADAADDDDDDDDDDDDDDDDAAA3AA"A3AA"AADDDDDDDDDDDDDDDDDDDDDDDDgolly-2.5-src/gui-wx/bitmaps/allstates_down.xpm0000644000175100001440000000106712156145314016647 00000000000000/* XPM */ static const char *allstates_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 4 1", /* colors */ "A c #000000004040", "B c #494969699F9F", "C c #606060606464", "D c #8C8C9696A6A6", /* pixels */ "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "DAAAADAAAADAAAAD", "DACCADADDADABBAD", "DACCADADDADABBAD", "DAAAADAAAADAAAAD", "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "DAAAADAAAADAAAAD", "DADDADADDADADDAD", "DADDADADDADADDAD", "DAAAADAAAADAAAAD", "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD"}; golly-2.5-src/gui-wx/bitmaps/autofit.bmp0000644000175100001440000000036612156145314015252 00000000000000BMöv(€  ÿÿÿ€ß©‰ä¶šèÀ¨ì̸ÀÀÀðÕÄôßÒöæÜøêâ™™™™™™‘™™‘™™‘‘™™‘‘‘‘™‘™™™‘™™™™™™‘™™™™™™‘™‘™™™‘‘‘‘™™‘™™‘‘™™‘™™™™™™‘golly-2.5-src/gui-wx/bitmaps/autofit.xpm0000644000175100001440000000100412156145314015266 00000000000000/* XPM */ static const char *autofit_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000008080", "B c #DCDCE6E6F6F6", /* pixels */ "AAAAAAAAAAAAAAAA", "ABBBBBBBBBBBBBBA", "ABAAAABBBBAAAABA", "ABAAABBBBBBAAABA", "ABAAAABBBBAAAABA", "ABABAAABBAAABABA", "ABBBBABBBBABBBBA", "ABBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBA", "ABBBBABBBBABBBBA", "ABABAAABBAAABABA", "ABAAAABBBBAAAABA", "ABAAABBBBBBAAABA", "ABAAAABBBBAAAABA", "ABBBBBBBBBBBBBBA", "AAAAAAAAAAAAAAAA"}; golly-2.5-src/gui-wx/bitmaps/autofit_down.bmp0000644000175100001440000000036612156145314016301 00000000000000BMöv(€  ÿÿÿ@ŸiId``¦–ŒDDDDDDADDADDAADDAAAADADDDADDDDDDADDDDDDADADDDAAAADDADDAADDADDDDDDAgolly-2.5-src/gui-wx/bitmaps/autofit_down.xpm0000644000175100001440000000101112156145314016313 00000000000000/* XPM */ static const char *autofit_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000004040", "B c #8C8C9696A6A6", /* pixels */ "AAAAAAAAAAAAAAAA", "ABBBBBBBBBBBBBBA", "ABAAAABBBBAAAABA", "ABAAABBBBBBAAABA", "ABAAAABBBBAAAABA", "ABABAAABBAAABABA", "ABBBBABBBBABBBBA", "ABBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBA", "ABBBBABBBBABBBBA", "ABABAAABBAAABABA", "ABAAAABBBBAAAABA", "ABAAABBBBBBAAABA", "ABAAAABBBBAAAABA", "ABBBBBBBBBBBBBBA", "AAAAAAAAAAAAAAAA"}; golly-2.5-src/gui-wx/bitmaps/backwards.bmp0000644000175100001440000000036612156145314015540 00000000000000BMöv(€  ÿÿÿ€f8£Y-¼g4Ñ„U幟羥ÀÀÀñÙËöæÜˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ„ˆˆˆˆˆ„ˆˆˆˆ„ˆˆˆ„ˆˆˆˆˆˆˆˆˆ„ˆˆˆˆ„ˆˆˆˆˆ„ˆˆˆˆˆˆ„ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆgolly-2.5-src/gui-wx/bitmaps/backwards.xpm0000644000175100001440000000102312156145314015555 00000000000000/* XPM */ static const char *backwards_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ "A c #000000008080", "B c #34346767BCBC", "C c None", /* pixels */ "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", "CCCCCCCCCBAACCCC", "CCCCCCCBAAAACCCC", "CCCCCBAAAAAACCCC", "CCCBAAAAAAAACCCC", "CCAAAAAAAAAACCCC", "CCAAAAAAAAAACCCC", "CCCBAAAAAAAACCCC", "CCCCCBAAAAAACCCC", "CCCCCCCBAAAACCCC", "CCCCCCCCCBAACCCC", "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC", "CCCCCCCCCCCCCCCC"}; golly-2.5-src/gui-wx/bitmaps/clone.bmp0000644000175100001440000000246612156145314014702 00000000000000BM66(  ÿÿÿ€€€€€€€€€ÀÀÀÀÜÀðʦ¨\.»f3¿i5Én7Êp:ÍwCÎ{HЂRÑ„UÒ†XÕŽc×’i×”kÙ˜q[é¬ß©‰ä¶šèÀ¨ì̸ðÕÄôßÒöæÜøêâúðêüõðýøõýù÷þüúÿþýðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿgolly-2.5-src/gui-wx/bitmaps/clone.xpm0000644000175100001440000000077512156145314014731 00000000000000/* XPM */ static const char *clone_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c None", "B c #000000008080", /* pixels */ "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAABBBBBBBBBBAAA", "AAABBBBBBBBBBAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAABBBBBBBBBBAAA", "AAABBBBBBBBBBAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", }; golly-2.5-src/gui-wx/bitmaps/controls.xpm0000644000175100001440000002517412156145314015474 00000000000000/* XPM */ static const char* controls_xpm[] = { /* width height ncolors chars_per_pixel */ "78 130 4 1", /* colors */ "A c #00000000C8C8", "B c #8989A9A9DFDF", "C c #C4C4D5D5F0F0", "D c #000000000000", /* pixels */ "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDAAAAAAAAAAAAAADDDDDDDDAAAAAAAAAAAAAADDDDDDDDDD", "DDDDDDDDDABBBBBBBBBBBBBBADDDDDDABBBBBBBBBBBBBBADDDDDDABBBBBBBBBBBBBBADDDDDDDDD", "DDDDDDDDABBCCCCCCCCCCCCBBADDDDABBCCCCCCCCCCCCBBADDDDABBCCCCCCCCCCCCBBADDDDDDDD", "DDDDDDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCCAACCCCCCBADDDDABCCCCCCCAAACCCCBADDDDABCCCCAAACCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCAAACCCCCCBADDDDABCCCCCCAAABCCCCBADDDDABCCCCBAAACCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCAAACCCCCCBADDDDABCCCCCAAABCCCCCBADDDDABCCCCCBAAACCCCCBADDDDDDDD", "DDDDDDDDABCCCCCCAACCCCCCBADDDDABCCCCAAABCCCCCCBADDDDABCCCCCCBAAACCCCBADDDDDDDD", "DDDDDDDDABCCCCCCAACCCCCCBADDDDABCCCCAAABCCCCCCBADDDDABCCCCCCBAAACCCCBADDDDDDDD", "DDDDDDDDABCCCCCCAACCCCCCBADDDDABCCCCCAAABCCCCCBADDDDABCCCCCBAAACCCCCBADDDDDDDD", "DDDDDDDDABCCCCCAAAACCCCCBADDDDABCCCCCCAAABCCCCBADDDDABCCCCBAAACCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCAAAACCCCCBADDDDABCCCCCCCAAACCCCBADDDDABCCCCAAACCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABBCCCCCCCCCCCCBBADDDDABBCCCCCCCCCCCCBBADDDDABBCCCCCCCCCCCCBBADDDDDDDD", "DDDDDDDDDABBBBBBBBBBBBBBADDDDDDABBBBBBBBBBBBBBADDDDDDABBBBBBBBBBBBBBADDDDDDDDD", "DDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDAAAAAAAAAAAAAADDDDDDDDAAAAAAAAAAAAAADDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDAAAAAAAAAAAAAADDDDDDDDAAAAAAAAAAAAAADDDDDDDDDD", "DDDDDDDDDABBBBBBBBBBBBBBADDDDDDABBBBBBBBBBBBBBADDDDDDABBBBBBBBBBBBBBADDDDDDDDD", "DDDDDDDDABBCCCCCCCCCCCCBBADDDDABBCCCCCCCCCCCCBBADDDDABBCCCCCCCCCCCCBBADDDDDDDD", "DDDDDDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCAAAAAACCCCBADDDDABCCCCCCAACCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCAAAAAACCCCBADDDDABCCCCCCAACCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCAACCCCCCCCBADDDDABCCCCCCAACCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCAAAAACCCCCBADDDDABCCCAAAAAAAACCCBADDDDABCCCAAAAAAAACCCBADDDDDDDD", "DDDDDDDDABCCCCAAAAACCCCCBADDDDABCCCAAAAAAAACCCBADDDDABCCCAAAAAAAACCCBADDDDDDDD", "DDDDDDDDABCCCCAACCCCCCCCBADDDDABCCCCCCAACCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCAACCCCCCCCBADDDDABCCCCCCAACCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCAACCCCCCCCBADDDDABCCCCCCAACCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDABCCCCCCCCCCCCCCBADDDDDDDD", "DDDDDDDDABBCCCCCCCCCCCCBBADDDDABBCCCCCCCCCCCCBBADDDDABBCCCCCCCCCCCCBBADDDDDDDD", "DDDDDDDDDABBBBBBBBBBBBBBADDDDDDABBBBBBBBBBBBBBADDDDDDABBBBBBBBBBBBBBADDDDDDDDD", "DDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDAAAAAAAAAAAAAADDDDDDDDAAAAAAAAAAAAAADDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDAADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDDDDDDABBADDDDDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDDD", "DDDDDDDDDDABBBBBBBBBBBADDDDDDDDDDDDDABBBBADDDDDDDDDDDDDABBBBBBBBBBBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCBADDDDDDDDDDDDDABBCCBBADDDDDDDDDDDDDABCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCBADDDDDDDDDDDDDABBCCCCBBADDDDDDDDDDDDDABCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCBBADDDDDDDDDDDABBCCCCCCBBADDDDDDDDDDDABBCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCBBADDDDDDDDDABBCCCCCCCCBBADDDDDDDDDABBCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCCBBADDDDDDDABBCCCCCCCCCCBBADDDDDDDABBCCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCCCBBADDDDDAAAABCCCCCCCCBAAAADDDDDABBCCCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCCBBADDDDDDDDDABCCCCCCCCBADDDDDDDDDABBCCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCBBCCCCCBBADDDDDDDDDDABCCCCCCCCBADDDDDDDDDDABBCCCCCBBCBADDDDDDDDDD", "DDDDDDDDDDABBABBCCCBBADDDDDDDDDDDABCCCCCCCCBADDDDDDDDDDDABBCCCBBABBADDDDDDDDDD", "DDDDDDDDDDABADABBCBBADDDDDDDDDDDDABCCCCCCCCBADDDDDDDDDDDDABBCBBADABADDDDDDDDDD", "DDDDDDDDDDAADDDABBBADDDDDDDDDDDDDABBBBBBBBBBADDDDDDDDDDDDDABBBADDDAADDDDDDDDDD", "DDDDDDDDDDADDDDDABADDDDDDDDDDDDDDAAAAAAAAAAAADDDDDDDDDDDDDDABADDDDDADDDDDDDDDD", "DDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDDDDDDDADDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDAADDDDDDDDDDDDDABBBBBBBBBBBBBBADDDDDDDDDDDDDAADDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDABADDDDDDDDDDDDABBCCCCCCCCCCCCBBADDDDDDDDDDDDABADDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDABBAAAAAAADDDDDDABCCCCCCCCCCCCCCBADDDDDDAAAAAAABBADDDDDDDDDDDDDD", "DDDDDDDDDDDDDABBCBBBBBBADDDDDDABCCCCCCCCCCCCCCBADDDDDDABBBBBBCBBADDDDDDDDDDDDD", "DDDDDDDDDDDDABBCCCCCCCBADDDDDDABCCCAACCCCAACCCBADDDDDDABCCCCCCCBBADDDDDDDDDDDD", "DDDDDDDDDDDABBCCCCCCCCBADDDDDDABCCCAAACCAAACCCBADDDDDDABCCCCCCCCBBADDDDDDDDDDD", "DDDDDDDDDDABBCCCCCCCCCBADDDDDDABCCCAAAAAAAACCCBADDDDDDABCCCCCCCCCBBADDDDDDDDDD", "DDDDDDDDDABBCCCCCCCCCCBADDDDDDABCCCAAAAAAAACCCBADDDDDDABCCCCCCCCCCBBADDDDDDDDD", "DDDDDDDDDABBCCCCCCCCCCBADDDDDDABCCCAACAACAACCCBADDDDDDABCCCCCCCCCCBBADDDDDDDDD", "DDDDDDDDDDABBCCCCCCCCCBADDDDDDABCCCAACCCCAACCCBADDDDDDABCCCCCCCCCBBADDDDDDDDDD", "DDDDDDDDDDDABBCCCCCCCCBADDDDDDABCCCAACCCCAACCCBADDDDDDABCCCCCCCCBBADDDDDDDDDDD", "DDDDDDDDDDDDABBCCCCCCCBADDDDDDABCCCAACCCCAACCCBADDDDDDABCCCCCCCBBADDDDDDDDDDDD", "DDDDDDDDDDDDDABBCBBBBBBADDDDDDABCCCCCCCCCCCCCCBADDDDDDABBBBBBCBBADDDDDDDDDDDDD", "DDDDDDDDDDDDDDABBAAAAAAADDDDDDABCCCCCCCCCCCCCCBADDDDDDAAAAAAABBADDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDABADDDDDDDDDDDDABBCCCCCCCCCCCCBBADDDDDDDDDDDDABADDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDAADDDDDDDDDDDDDABBBBBBBBBBBBBBADDDDDDDDDDDDDAADDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDDDDDDDADDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDADDDDDDDDDDDDDDDDD", "DDDDDDDDDDADDDDDABADDDDDDDDDDDDDDAAAAAAAAAAAADDDDDDDDDDDDDDABADDDDDADDDDDDDDDD", "DDDDDDDDDDAADDDABBBADDDDDDDDDDDDDABBBBBBBBBBADDDDDDDDDDDDDABBBADDDAADDDDDDDDDD", "DDDDDDDDDDABADABBCBBADDDDDDDDDDDDABCCCCCCCCBADDDDDDDDDDDDABBCBBADABADDDDDDDDDD", "DDDDDDDDDDABBABBCCCBBADDDDDDDDDDDABCCCCCCCCBADDDDDDDDDDDABBCCCBBABBADDDDDDDDDD", "DDDDDDDDDDABCBBCCCCCBBADDDDDDDDDDABCCCCCCCCBADDDDDDDDDDABBCCCCCBBCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCCBBADDDDDDDDDABCCCCCCCCBADDDDDDDDDABBCCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCCCBBADDDDDAAAABCCCCCCCCBAAAADDDDDABBCCCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCCBBADDDDDDDABBCCCCCCCCCCBBADDDDDDDABBCCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCBBADDDDDDDDDABBCCCCCCCCBBADDDDDDDDDABBCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCBBADDDDDDDDDDDABBCCCCCCBBADDDDDDDDDDDABBCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCBADDDDDDDDDDDDDABBCCCCBBADDDDDDDDDDDDDABCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABCCCCCCCCBADDDDDDDDDDDDDABBCCBBADDDDDDDDDDDDDABCCCCCCCCBADDDDDDDDDD", "DDDDDDDDDDABBBBBBBBBBBADDDDDDDDDDDDDABBBBADDDDDDDDDDDDDABBBBBBBBBBBADDDDDDDDDD", "DDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDDDDDDABBADDDDDDDDDDDDDAAAAAAAAAAAAAADDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDAADDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"}; golly-2.5-src/gui-wx/bitmaps/cross_curs.bmp0000644000175100001440000000036612156145314015764 00000000000000BMöv(€ÄÄÿÿÿ€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwÿÿÿÿÿÿwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwgolly-2.5-src/gui-wx/bitmaps/delete.bmp0000644000175100001440000000246612156145314015044 00000000000000BM66(  ÿÿÿ€€€€€€€€€ÀÀÀÀÜÀðʦ¨\.»f3¿i5Én7Êp:ÍwCÎ{HЂRÑ„UÒ†XÕŽc×’i×”kÙ˜q[é¬ß©‰ä¶šèÀ¨ì̸ðÕÄôßÒöæÜøêâúðêüõðýøõýù÷þüúÿþýðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿgolly-2.5-src/gui-wx/bitmaps/delete.xpm0000644000175100001440000000077612156145314015074 00000000000000/* XPM */ static const char *delete_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c None", "B c #000000008080", /* pixels */ "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAABBBBBBBBBBAAA", "AAABBBBBBBBBBAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAA", }; golly-2.5-src/gui-wx/bitmaps/deltime.bmp0000644000175100001440000000246612156145314015225 00000000000000BM66(  ÿÿÿ cff$!i q r r t vyƒ/…0…†88†‡1&‡ ‰ ‹ŒŽŽ%("‘!$‘3*’'(–'0—,˜,$™ (™&!œ454,žSGŸMG /+¢A7¢¤+#¦0'¦$¸ÀÀÀ É45Ë9-Í ÎÐ><ÑÔ&× Ø Ú@:ÛGFÜ!à9-ã3@èêê/=ê!íO_îQ_îTWïð}~ð ñ(2ñZbòrsóõ.>õWUõfrö+9÷:;÷2@÷b\÷95øLIùTZùW\ùBJûFSû(1ýLPýFSýT_ý€vþ)"ÿ*%ÿ4'ÿ+(ÿ.+ÿ1/ÿ50ÿB5ÿ-7ÿ37ÿ.8ÿCFÿIGÿÿÿÿÿÿ–ÿÿÿÿÿ•ÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿþÿÿþÿþÿÿÿÿÿÿÿþÿþÿÿþÿÿÿþÿÿÿþÿÿþÿþÿÿÿÿÿÿÿþÿþÿÿþÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿÿþÿÿþþÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿþÔÿÿÔÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿgolly-2.5-src/gui-wx/bitmaps/move.bmp0000644000175100001440000000036612156145314014545 00000000000000BMöv(€  ÿÿÿ€×”kä¶šèÀ¨ÀÀÀðÕÄôßÒöæÜøêâUUUUUUUUUUQ84!UUUUQˆ‡AUUUU8hqUUUQ8ˆƒ„UUQv˜ˆ8!UUˆˆ‡ƒ‘UQ˜(ˆˆˆUQ‡‡wˆˆUGHr†UU‘bUQHA!UUQ1‘UUUU!UUUUUQUUUUUUUUUUUgolly-2.5-src/gui-wx/bitmaps/move.xpm0000644000175100001440000000120012156145314014557 00000000000000/* XPM */ static const char *move_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 8 1", /* colors */ "A c #000000008080", "B c #52528282D0D0", "C c #71719898D9D9", "D c #A8A8C0C0E8E8", "E c None", "F c #D2D2DFDFF4F4", "G c #DCDCE6E6F6F6", "H c #E2E2EAEAF8F8", /* pixels */ "EEEEEEEEEEEEEEEE", "EEEEEEEAAEEEEEEE", "EEEEAEAGBAABEEEE", "EEEAGAAGDAHAEEEE", "EEEADGAGDAGABAEE", "EEEEAGAGGAHAGBAE", "EEABAGDFDGFCGFAE", "EAGGAFGFFFGGFGAE", "EAHGCFGGGGGGGAEE", "EEAGGGGGGFFDHAEE", "EEEAFFGGGGDFBAEE", "EEEADFGGFDFDAEEE", "EEEEAFDFFFFAEEEE", "EEEEEAFGFFDAEEEE", "EEEEEADFDDCAEEEE", "EEEEEEEEEEEEEEEE", }; golly-2.5-src/gui-wx/bitmaps/move_down.bmp0000644000175100001440000000036612156145314015574 00000000000000BMöv(€  ÿÿÿ@B™X1¨€h¦–ŒUUUUUUUUUUQED1UUUUQUUAUUUUEUQUUUQEUTTUUQUUUE!UUUUUTQUQU5UUUQUQUUUUUUEESUUUQQRUQEAQ!UUQQAQUUUU!UUUUUQUUUUUUUUUUUgolly-2.5-src/gui-wx/bitmaps/move_down.xpm0000644000175100001440000000111412156145314015612 00000000000000/* XPM */ static const char *move_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 5 1", /* colors */ "A c #000000004040", "B c #121242429090", "C c #313158589999", "D c #68688080A8A8", "E c #8C8C9696A6A6", /* pixels */ "EEEEEEEEEEEEEEEE", "EEEEEEEAAEEEEEEE", "EEEEAEAEBAABEEEE", "EEEAEAAEDAEAEEEE", "EEEADEAEDAEABAEE", "EEEEAEAEEAEAEBAE", "EEABAEDEDEECEEAE", "EAEEAEEEEEEEEEAE", "EAEECEEEEEEEEAEE", "EEAEEEEEEEEDEAEE", "EEEAEEEEEEDEBAEE", "EEEADEEEEDEDAEEE", "EEEEAEDEEEEAEEEE", "EEEEEAEEEEDAEEEE", "EEEEEADEDDCAEEEE", "EEEEEEEEEEEEEEEE", }; golly-2.5-src/gui-wx/bitmaps/new.bmp0000644000175100001440000000036612156145314014370 00000000000000BMöv(€  ÿÿÿ€×”kß©‰ä¶šèÀ¨ì̸ÀÀÀðÕÄôßÒöæÜøêâwwwwwwwwwwwªªªª¡wwªªªª±wwªªªª¡wwªªªº‘wwªª«©wwªªº˜awwª«©†Qwwªª˜eAwwª™†T1ww™ˆaww˜†QªAwwˆeA¤ww†T1!wwwwwgolly-2.5-src/gui-wx/bitmaps/new.xpm0000644000175100001440000000130212156145314014405 00000000000000/* XPM */ static const char *new_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 11 1", /* colors */ "A c #000000008080", "B c #6B6B9494D7D7", "C c #8989A9A9DFDF", "D c #9A9AB6B6E4E4", "E c #A8A8C0C0E8E8", "F c #B8B8CCCCECEC", "G c None", "H c #C4C4D5D5F0F0", "I c #D2D2DFDFF4F4", "J c #DCDCE6E6F6F6", "K c #E2E2EAEAF8F8", /* pixels */ "GGAAAAAAAAAGGGGG", "GGAHHFEDCABAGGGG", "GGAIHHFEDAJDAGGG", "GGAIIHHFEAJJDAGG", "GGAIIIHHFAAAAAGG", "GGAJJJIIHFEDCAGG", "GGAJJJJJIHFEDAGG", "GGAJJJJKJIHFEAGG", "GGAJJJJJKJIHFAGG", "GGAJJJJJJKJIHAGG", "GGAJJJJJJJKJIAGG", "GGAJJJJJJJJJJAGG", "GGAJJJJJJJJJKAGG", "GGAJJJJJJJJJJAGG", "GGAAAAAAAAAAAAGG", "GGGGGGGGGGGGGGGG", }; golly-2.5-src/gui-wx/bitmaps/open.bmp0000644000175100001440000000244612156145314014541 00000000000000BM&6(ð  ÿÿÿ€yB!“Q)¿i5Êp:Ñ„UÓ‰]ÕŽcØ–nÛwß§…â¯Sêšå¹Ÿæ¼¢fЩèÁªéÄ­ŒÕ²ëȳîоÀÀÀðÖÆ                  golly-2.5-src/gui-wx/bitmaps/open.xpm0000644000175100001440000000166612156145314014572 00000000000000/* XPM */ static const char *open_xpm[] = { /* width height ncolors chars_per_pixel */ "16 15 23 1", /* colors */ "A c #000000008080", "B c #212142427979", "C c #292951519393", "D c #35356969BFBF", "E c #3A3A7070CACA", "F c #55558484D1D1", "G c #5D5D8989D3D3", "H c #63638E8ED5D5", "I c #6E6E9696D8D8", "J c #77779D9DDBDB", "K c #8585A7A7DFDF", "L c #9090AFAFE2E2", "M c #9A9AEAEA5353", "N c #9F9FB9B9E5E5", "O c #A2A2BCBCE6E6", "P c #A9A9D0D06666", "Q c #AAAAC1C1E8E8", "R c #ADADC4C4E9E9", "S c #B2B2D5D58C8C", "T c #B3B3C8C8EBEB", "U c #BEBED0D0EEEE", "V c None", "W c #C6C6D6D6F0F0", /* pixels */ "VVVVVVVVVVVVVVVV", "VVVVVCCCCVVVVVVV", "AAAAVVCMMCVVVVVV", "AIIIAVVCMMCVVVVV", "AIIIDAAACMMBAAVV", "AIIIIIIICSMBOAVV", "AIAAAACCCPMBBBAA", "AIANQTCMMMMMMBWA", "AGALNQTCMMMMBTOA", "AAHKLNQQCMMBTWAG", "AAIJKLNQQCBTWWAN", "ADGIJKLNQQTWWRAV", "AEFGIJKLNQTUWAGV", "AAAAAAAAAAAAAAVV", "VVVVVVVVVVVVVVVV", }; golly-2.5-src/gui-wx/bitmaps/patterns.bmp0000644000175100001440000000036612156145314015437 00000000000000BMöv(€  ÿÿÿ€ß©‰ä¶šèÀ¨ì̸ÀÀÀðÕÄôßÒöæÜøêâ™™™™™™‘™™™™™™‘™™‘™™‘™™‘™™‘™™™™™™¡™‘™™‘™‘™™™™™™™™q™™‘˜Q™™‘‡Aˆˆˆˆˆt1‡uWwWS!uAfffffafffffgolly-2.5-src/gui-wx/bitmaps/patterns.xpm0000644000175100001440000000125512156145314015463 00000000000000/* XPM */ static const char *patterns_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 10 1", /* colors */ "A c #000000008080", "B c #8989A9A9DFDF", "C c #9A9AB6B6E4E4", "D c #A8A8C0C0E8E8", "E c #B8B8CCCCECEC", "F c None", "G c #C4C4D5D5F0F0", "H c #D2D2DFDFF4F4", "I c #DCDCE6E6F6F6", "J c #E2E2EAEAF8F8", /* pixels */ "FAAAAFFFFFFFFFFF", "AGGEDAFFFFFFFFFF", "AAAAAAAAAAAAAAAF", "AHHGGEEGGGEGECBA", "AHHHHHHHHHHHGDCA", "AIIIIIIAAHAAHGDA", "AIIIIIIAAIAAIHEA", "AIIIIIIIIIIIIIGA", "AIIIAAIAAIIIIIHA", "AIIIAAIAAIIIIIIA", "AIIIIIIIIIIIIIJA", "AIIIIIIAAIIIIIIA", "AIIIIIIAAIIIIIIA", "AIIIIIIIIIIIIIIA", "AIIIIIIIIIIIIIIA", "AAAAAAAAAAAAAAAA"}; golly-2.5-src/gui-wx/bitmaps/patterns_down.bmp0000644000175100001440000000036612156145314016466 00000000000000BMöv(€  ÿÿÿ0Y9”fJ˜pXœ|hppp …t¤‚¦–Œ¨š’ÀÀÀ™™™™™™‘™™™™™™‘™™‘™™‘™™‘™™‘™™™™™™¡™‘™™‘™‘™™™™™™™™q™™‘˜Q™™‘‡Aˆˆˆˆˆt1‡uWwWS!uA»»»»»a»»»»»golly-2.5-src/gui-wx/bitmaps/patterns_down.xpm0000644000175100001440000000131012156145314016502 00000000000000/* XPM */ static const char *patterns_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 11 1", /* colors */ "A c #000000003030", "B c #393959598F8F", "C c #4A4A66669494", "D c #585870709898", "E c #68687C7C9C9C", "F c #707070707070", "G c #74748585A0A0", "H c #82828F8FA4A4", "I c #8C8C9696A6A6", "J c #92929A9AA8A8", "K c None", /* pixels */ "FAAAAKKKKKKKKKKK", "AGGEDAKKKKKKKKKK", "AAAAAAAAAAAAAAAK", "AHHGGEEGGGEGECBA", "AHHHHHHHHHHHGDCA", "AIIIIIIAAIAAHGDA", "AIIIIIIAAIAAIHEA", "AIIIIIIIIIIIIIGA", "AIIIAAIAAIIIIIHA", "AIIIAAIAAIIIIIIA", "AIIIIIIIIIIIIIJA", "AIIIIIIAAIIIIIIA", "AIIIIIIAAIIIIIIA", "AIIIIIIIIIIIIIIA", "AIIIIIIIIIIIIIIA", "AAAAAAAAAAAAAAAA"}; golly-2.5-src/gui-wx/bitmaps/pick.bmp0000644000175100001440000000036612156145314014525 00000000000000BMöv(€  ÿÿÿ€ß©‰¤  ÀÀÀøêâýù÷DDDDDD!DDDDDD"DDDDDA"!DDDDDD"DDDDDA"QDDDDDDUDDDDDAUQDDDDDDUDDDDAUQDDDDDDDDDDADDDDDDDDDDDDDDAQDDDDDDgolly-2.5-src/gui-wx/bitmaps/pick.xpm0000644000175100001440000000104412156145314014545 00000000000000/* XPM */ static const char *pick_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 4 1", /* colors */ "A c #000000008080", "B c #8989A9A9DFDF", "C c None", "D c #E2E2EAEAF8F8", /* pixels */ "CCCCCCCCCCCCAAAC", "CCCCCCCCCCCADAAA", "CCCCCCCCCCAAAAAA", "CCCCCCCCAAAAAAAA", "CCCCCCCCCAAAAAAC", "CCCCCCCCADAAAACC", "CCCCCCCADDDAACCC", "CCCCCCADDDACACCC", "CCCCCADDDACCCCCC", "CCCCADDDACCCCCCC", "CCCABBDACCCCCCCC", "CCABBBACCCCCCCCC", "CABBBACCCCCCCCCC", "ABBBACCCCCCCCCCC", "ABBACCCCCCCCCCCC", "AAACCCCCCCCCCCCC"}; golly-2.5-src/gui-wx/bitmaps/pick_curs.bmp0000644000175100001440000000036612156145314015561 00000000000000BMöv(€ÄÄÿÿÿ€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿÿ÷wwwwwwþïwwwwwwþî÷wwwwwîïwwwwwwþî÷wwwwwîwwwwwwð÷wwwwwwwwwwwð÷÷wwww÷wwwwwðÿÿwwwwwÿÿ÷wwwwÿÿÿÿwwwwwÿÿÿwwwwwÿwwwwwwÿ÷golly-2.5-src/gui-wx/bitmaps/pick_curs.xpm0000644000175100001440000000105112156145314015577 00000000000000/* XPM */ static const char *pick_curs_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 4 1", /* colors */ "A c #FFFFFFFFFFFF", "B c None", "C c #0000FFFFFFFF", "D c #000000000000", /* pixels */ "BBBBBBBBBBBBDDDB", "BBBBBBBBBBBDADDD", "BBBBBBBBBBDDDDDD", "BBBBBBBBDDDDDDDD", "BBBBBBBBBDDDDDDB", "BBBBBBBBDADDDDBB", "BBBBBBBDAAADDBBB", "BBBBBBDAAADBDBBB", "BBBBBDAAADBBBBBB", "BBBBDAAADBBBBBBB", "BBBDCCADBBBBBBBB", "BBDCCCDBBBBBBBBB", "BDCCCDBBBBBBBBBB", "DCCCDBBBBBBBBBBB", "DCCDBBBBBBBBBBBB", "DDDBBBBBBBBBBBBB"}; golly-2.5-src/gui-wx/bitmaps/pick_down.bmp0000644000175100001440000000036612156145314015554 00000000000000BMöv(€  ÿÿÿ@ŸiId``¦–ŒDDDDDD!DDDDDD"DDDDDA"!DDDDDD"DDDDDA"ADDDDDDDDDDDDADADDDDDDDDDDDADADDDDDDDDDDADDDDDDDDDDDDDDAADDDDDDgolly-2.5-src/gui-wx/bitmaps/pick_down.xpm0000644000175100001440000000103412156145314015573 00000000000000/* XPM */ static const char *pick_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ "A c #000000004040", "B c #494969699F9F", "C c #8C8C9696A6A6", /* pixels */ "CCCCCCCCCCCCAAAC", "CCCCCCCCCCCACAAA", "CCCCCCCCCCAAAAAA", "CCCCCCCCAAAAAAAA", "CCCCCCCCCAAAAAAC", "CCCCCCCCACAAAACC", "CCCCCCCACCCAACCC", "CCCCCCACCCACACCC", "CCCCCACCCACCCCCC", "CCCCACCCACCCCCCC", "CCCABBCACCCCCCCC", "CCABBBACCCCCCCCC", "CABBBACCCCCCCCCC", "ABBBACCCCCCCCCCC", "ABBACCCCCCCCCCCC", "AAACCCCCCCCCCCCC"}; golly-2.5-src/gui-wx/bitmaps/play.bmp0000644000175100001440000000246612156145314014547 00000000000000BM66(  ÿÿÿJ”œRZ”œµZs{„ŒŒ”!Rcks„”œ!J!!R!)R!!Z!{!„!Œ!!Œ!)R)1B11R11„19c99k9{µs{½sÀÀÀ''''''''''''''''''''''''''''''''''&#'''''''''''''#$$'''''''''''#''''''''' $'''''''#'''''" '''' '''' %''''' %'''''''&'''''''''%'''''''''''%!&'''''''''''''''''''''''''''''''''''''''''''golly-2.5-src/gui-wx/bitmaps/play.xpm0000644000175100001440000000312212156145314014563 00000000000000/* XPM */ static const char *play_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 39 2", /* colors */ "AA c #00004A4A0000", "BA c #000094940000", "CA c #00009C9C0000", "DA c #080852520808", "EA c #08085A5A0808", "FA c #080894940000", "GA c #08089C9C0000", "HA c #0808B5B50000", "IA c #10105A5A1010", "JA c #101073731010", "KA c #10107B7B0808", "LA c #101084840808", "MA c #10108C8C0808", "NA c #10108C8C1010", "OA c #101094941010", "PA c #181852522121", "AB c #181863631818", "BB c #18186B6B1818", "CB c #181873731818", "DB c #181884841010", "EB c #181894941010", "FB c #18189C9C1818", "GB c #21214A4A2121", "HB c #212152522121", "IB c #212152522929", "JB c #21215A5A2121", "KB c #21217B7B1818", "LB c #212184841818", "MB c #21218C8C1818", "NB c #21218C8C2121", "OB c #292952522929", "PB c #313142423131", "AC c #313152523131", "BC c #313184843131", "CC c #393963633939", "DC c #39396B6B3939", "EC c #7373B5B57B7B", "FC c #7373BDBD7B7B", "GC c None", /* pixels */ "GCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGC", "GCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGC", "GCGCECACFCGCGCGCGCGCGCGCGCGCGCGC", "GCGCOBHAHBHBECGCGCGCGCGCGCGCGCGC", "GCGCOBHAHAHAABJBFCGCGCGCGCGCGCGC", "GCGCOBHAKBNBHAHAABIAECGCGCGCGCGC", "GCGCHBHALBEBMALAHAHADAGBECGCGCGC", "GCGCHBHALBGAGAFBMAKAHAHAAALBGCGC", "GCGCHBHALBCABAFAOAEBBCDBCBPBGCGC", "GCGCIBHAMBBABANABACBAAAACCGCGCGC", "GCGCPAHALBBANAJAAAAADCGCGCGCGCGC", "GCGCAAHABBEAAAAACCGCGCGCGCGCGCGC", "GCGCCCDCAAAADCGCGCGCGCGCGCGCGCGC", "GCGCFCAACCGCGCGCGCGCGCGCGCGCGCGC", "GCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGC", "GCGCGCGCGCGCGCGCGCGCGCGCGCGCGCGC", }; golly-2.5-src/gui-wx/bitmaps/record.bmp0000644000175100001440000000246612156145314015060 00000000000000BM66(  ÿÿÿJ”œRZ”œµZs{„ŒŒ”!Rcks„”œ!J!!R!)R!!Z!{!„!Œ!!Œ!)R)1B11R11„19c99k9{µs{½sÀÀÀ'''''''''''''''''''''''''''''''''''''& &''''''''&  &''''''  '''''&  &''''  ''''  ''''  ''''  ''''&  &'''''  ''''''&  &''''''''& &'''''''''''''''''''''''''''''''''''''golly-2.5-src/gui-wx/bitmaps/record.xpm0000644000175100001440000000104612156145314015077 00000000000000/* XPM */ static const char *record_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 4 1", /* colors */ "A c #0808B5B50000", "B c #101073731010", "C c #7373BDBD7B7B", "D c None", /* pixels */ "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD", "DDDDDCBBBBCDDDDD", "DDDCBBAAAABBCDDD", "DDDBAAAAAAAABDDD", "DDCBAAAAAAAABCDD", "DDBAAAAAAAAAABDD", "DDBAAAAAAAAAABDD", "DDBAAAAAAAAAABDD", "DDBAAAAAAAAAABDD", "DDCBAAAAAAAABCDD", "DDDBAAAAAAAABDDD", "DDDCBBAAAABBCDDD", "DDDDDCBBBBCDDDDD", "DDDDDDDDDDDDDDDD", "DDDDDDDDDDDDDDDD"}; golly-2.5-src/gui-wx/bitmaps/redo.bmp0000644000175100001440000000036612156145314014530 00000000000000BMöv(€  ÿÿÿ€f8£Y-¼g4Ñ„U幟羥ÀÀÀñÙËöæÜˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆgolly-2.5-src/gui-wx/bitmaps/redo.xpm0000644000175100001440000000077012156145314014555 00000000000000/* XPM */ static const char *redo_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000008080", "B c None", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBABBBBBBB", "BBBBBBBBAABBBBBB", "BBBBBBBBAAABBBBB", "BBAAAAAAAAAABBBB", "BBAAAAAAAAAAABBB", "BBAAAAAAAAAAAABB", "BBAAAAAAAAAAAABB", "BBAAAAAAAAAAABBB", "BBAAAAAAAAAABBBB", "BBBBBBBBAAABBBBB", "BBBBBBBBAABBBBBB", "BBBBBBBBABBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB"}; golly-2.5-src/gui-wx/bitmaps/reset.bmp0000644000175100001440000000246612156145314014724 00000000000000BM66(  ÿÿÿ€ÀÀÀgolly-2.5-src/gui-wx/bitmaps/reset.xpm0000644000175100001440000000077212156145314014750 00000000000000/* XPM */ static const char *reset_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000008080", "B c None", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBABBBBBBABB", "BBBBBAABBBBBAABB", "BBBBAAABBBBAAABB", "BBBAAAABBBAAAABB", "BBAAAAABBAAAAABB", "BBAAAAABBAAAAABB", "BBBAAAABBBAAAABB", "BBBBAAABBBBAAABB", "BBBBBAABBBBBAABB", "BBBBBBABBBBBBABB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB"}; golly-2.5-src/gui-wx/bitmaps/save.bmp0000644000175100001440000000036612156145314014535 00000000000000BMöv(€  ÿÿÿ€f8£Y-¼g4Ñ„U幟羥ÀÀÀñÙËöæÜˆˆˆˆˆˆˆˆˆˆUyª¡UU#9¡UU#9¡UUwi¡UUAUUUUUUUTEQªªªªQ¤DDJQªªªªQ¤DDJAªªªªˆˆˆˆˆˆˆˆgolly-2.5-src/gui-wx/bitmaps/save.xpm0000644000175100001440000000125512156145314014561 00000000000000/* XPM */ static const char *save_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 10 1", /* colors */ "A c #000000008080", "B c #1C1C38386666", "C c #2D2D5959A3A3", "D c #34346767BCBC", "E c #55558484D1D1", "F c #9F9FB9B9E5E5", "G c #A5A5BEBEE7E7", "H c None", "I c #CBCBD9D9F1F1", "J c #DCDCE6E6F6F6", /* pixels */ "HHHHHHHHHHHHHHHH", "HAAAAAAAAAAAAAAH", "HADAJJJJJJJJADAH", "HAEAJDDDDDDJAEAH", "HAEAJJJJJJJJAEAH", "HAEAJDDDDDDJAEAH", "HAEAJJJJJJJJAEAH", "HAEDAAAAAAAADEAH", "HAEEEEEEEEEEEEAH", "HAEEDAAAAAADEEAH", "HAEEAGGGFIJAEEAH", "HAEEAGBCCIJAEEAH", "HAEEAGBCCIJAEEAH", "HAEEAGGIJJJAEEAH", "HHAAAAAAAAAAAAHH", "HHHHHHHHHHHHHHHH", }; golly-2.5-src/gui-wx/bitmaps/scripts.bmp0000644000175100001440000000036612156145314015266 00000000000000BMöv(€  ÿÿÿ€ß©‰ä¶šèÀ¨ì̸ÀÀÀðÕÄôßÒöæÜøêâ™™™™™™‘™‘™™‘™™™™™™‘™™‘™‘™™™™™™¡™™‘‘™™™™™™™¡™q™™™™™˜Q‘™™‡Aˆˆˆˆˆt1‡uWwWS!uAfffffafffffgolly-2.5-src/gui-wx/bitmaps/scripts.xpm0000644000175100001440000000125412156145314015311 00000000000000/* XPM */ static const char *scripts_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 10 1", /* colors */ "A c #000000008080", "B c #8989A9A9DFDF", "C c #9A9AB6B6E4E4", "D c #A8A8C0C0E8E8", "E c #B8B8CCCCECEC", "F c None", "G c #C4C4D5D5F0F0", "H c #D2D2DFDFF4F4", "I c #DCDCE6E6F6F6", "J c #E2E2EAEAF8F8", /* pixels */ "FAAAAFFFFFFFFFFF", "AGGEDAFFFFFFFFFF", "AAAAAAAAAAAAAAAF", "AHHGGEEGGGEGECBA", "AHHHHHHHHHHHGDCA", "AIIAAAAAIIIIHGDA", "AIIIIIIIIIIIIHEA", "AIIIJAAAAAAIIIGA", "AIIIIIIIIIIIIIHA", "AIIIIIIAAAAAAIIA", "AIIIIIIIIIIIIIJA", "AIIIIIIAAAAAIIIA", "AIIIIIIIIIIIIIIA", "AIIIIAAAAIIIIIIA", "AIIIIIIIIIIIIIIA", "AAAAAAAAAAAAAAAA"}; golly-2.5-src/gui-wx/bitmaps/scripts_down.bmp0000644000175100001440000000036612156145314016315 00000000000000BMöv(€  ÿÿÿ0Y9”fJ˜pXœ|hppp …t¤‚¦–Œ¨š’ÀÀÀ™™™™™™‘™‘™™‘™™™™™™‘™™‘™‘™™™™™™¡™™‘‘™™™™™™™‘™q™™™™™˜Q‘™™‡Aˆˆˆˆˆt1‡uWwWS!uA»»»»»a»»»»»golly-2.5-src/gui-wx/bitmaps/scripts_down.xpm0000644000175100001440000000130712156145314016337 00000000000000/* XPM */ static const char *scripts_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 11 1", /* colors */ "A c #000000003030", "B c #393959598F8F", "C c #4A4A66669494", "D c #585870709898", "E c #68687C7C9C9C", "F c #707070707070", "G c #74748585A0A0", "H c #82828F8FA4A4", "I c #8C8C9696A6A6", "J c #92929A9AA8A8", "K c None", /* pixels */ "FAAAAKKKKKKKKKKK", "AGGEDAKKKKKKKKKK", "AAAAAAAAAAAAAAAK", "AHHGGEEGGGEGECBA", "AHHHHHHHHHHHGDCA", "AIIAAAAAIIIIHGDA", "AIIIIIIIIIIIIHEA", "AIIIIAAAAAAIIIGA", "AIIIIIIIIIIIIIHA", "AIIIIIIAAAAAAIIA", "AIIIIIIIIIIIIIJA", "AIIIIIIAAAAAIIIA", "AIIIIIIIIIIIIIIA", "AIIIIAAAAIIIIIIA", "AIIIIIIIIIIIIIIA", "AAAAAAAAAAAAAAAA"}; golly-2.5-src/gui-wx/bitmaps/select.bmp0000644000175100001440000000036612156145314015056 00000000000000BMöv(€  ÿÿÿ€ÀÀÀöæÜ""""""""""""""""!11#3333332!333333!333333#3333332!333333!333333#3333332!333333!333333#3333332!11""""""""""""""""golly-2.5-src/gui-wx/bitmaps/select.xpm0000644000175100001440000000102412156145314015074 00000000000000/* XPM */ static const char *select_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ "A c #000000008080", "B c None", "C c #DCDCE6E6F6F6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BAACAACAACAACAAB", "BCCCCCCCCCCCCCCB", "BACCCCCCCCCCCCAB", "BACCCCCCCCCCCCAB", "BCCCCCCCCCCCCCCB", "BACCCCCCCCCCCCAB", "BACCCCCCCCCCCCAB", "BCCCCCCCCCCCCCCB", "BACCCCCCCCCCCCAB", "BACCCCCCCCCCCCAB", "BCCCCCCCCCCCCCCB", "BAACAACAACAACAAB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/gui-wx/bitmaps/select_down.bmp0000644000175100001440000000246612156145314016110 00000000000000BM66(  ÿÿÿ0¦–Œgolly-2.5-src/gui-wx/bitmaps/select_down.xpm0000644000175100001440000000101412156145314016122 00000000000000/* XPM */ static const char *select_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000003030", "B c #8C8C9696A6A6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BAABAABAABAABAAB", "BBBBBBBBBBBBBBBB", "BABBBBBBBBBBBBAB", "BABBBBBBBBBBBBAB", "BBBBBBBBBBBBBBBB", "BABBBBBBBBBBBBAB", "BABBBBBBBBBBBBAB", "BBBBBBBBBBBBBBBB", "BABBBBBBBBBBBBAB", "BABBBBBBBBBBBBAB", "BBBBBBBBBBBBBBBB", "BAABAABAABAABAAB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/gui-wx/bitmaps/stack.bmp0000644000175100001440000000246612156145314014707 00000000000000BM66(  ÿÿÿ€€€€€€€€€ÀÀÀÀÜÀðʦ¨\.»f3¿i5Én7Êp:ÍwCÎ{HЂRÑ„UÒ†XÕŽc×’i×”kÙ˜q[é¬ß©‰ä¶šèÀ¨ì̸ðÕÄôßÒöæÜøêâúðêüõðýøõýù÷þüúÿþýðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿgolly-2.5-src/gui-wx/bitmaps/stack.xpm0000644000175100001440000000102312156145314014721 00000000000000/* XPM */ static const char *stack_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ "A c #000000008080", "B c None", "C c #DCDCE6E6F6F6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBAAAAAAAABBBBB", "BBBACCCCCCABBBBB", "BBBACAAAAAAAABBB", "BBBACACCCCACABBB", "BBBACACCCCACABBB", "BBBACACCCCACABBB", "BBBACACCCCACABBB", "BBBAAAAAAAACABBB", "BBBBBACCCCCCABBB", "BBBBBAAAAAAAABBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/gui-wx/bitmaps/stack_down.bmp0000644000175100001440000000246612156145314015736 00000000000000BM66(  ÿÿÿ0¦–Œgolly-2.5-src/gui-wx/bitmaps/stack_down.xpm0000644000175100001440000000101312156145314015747 00000000000000/* XPM */ static const char *stack_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000003030", "B c #8C8C9696A6A6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBAAAAAAAABBBBB", "BBBABBBBBBABBBBB", "BBBABAAAAAAAABBB", "BBBABABBBBABABBB", "BBBABABBBBABABBB", "BBBABABBBBABABBB", "BBBABABBBBABABBB", "BBBAAAAAAAABABBB", "BBBBBABBBBBBABBB", "BBBBBAAAAAAAABBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/gui-wx/bitmaps/stop.bmp0000644000175100001440000000246612156145314014567 00000000000000BM66(  ÿÿÿ cff$!i q r r t vyƒ/…0…†88†‡1&‡ ‰ ‹ŒŽŽ%("‘!$‘3*’'(–'0—,˜,$™ (™&!œ454,žSGŸMG /+¢A7¢¤+#¦0'¦$¸ÀÀÀ É45Ë9-Í ÎÐ><ÑÔ&× Ø Ú@:ÛGFÜ!à9-ã3@èêê/=ê!íO_îQ_îTWïð}~ð ñ(2ñZbòrsóõ.>õWUõfrö+9÷:;÷2@÷b\÷95øLIùTZùW\ùBJûFSû(1ýLPýFSýT_ý€vþ)"ÿ*%ÿ4'ÿ+(ÿ.+ÿ1/ÿ50ÿB5ÿ-7ÿ37ÿ.8ÿCFÿIGÿBHD<<;8*++++(Qa[\_^^]b6 ++++ F:EecVV`P7++++%KT=NILLdM-++++%KT=NILLdM-++++qYTjihhfg-++++"onWmUXXlk1++++&ZOJS@??RAG++++xpruwvvtsC++++# !++++++++++++++++++++++++++++++++++golly-2.5-src/gui-wx/bitmaps/stop.xpm0000644000175100001440000000663212156145314014614 00000000000000/* XPM */ static const char *stop_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 120 2", /* colors */ "AA c #63630B0B0909", "BA c #666605050000", "CA c #666617171313", "DA c #696921212424", "EA c #71710A0A0B0B", "FA c #727203030C0C", "GA c #72720F0F0909", "HA c #74740A0A0A0A", "IA c #767610100C0C", "JA c #797919191D1D", "KA c #838310101717", "LA c #85852F2F1818", "MA c #858530301B1B", "NA c #868600000000", "OA c #868638383838", "PA c #878703030000", "AB c #878726263131", "BB c #898902020909", "CB c #8B8B02020C0C", "DB c #8C8C00000202", "EB c #8E8E00000202", "FB c #8E8E00000404", "GB c #8F8F1D1D2525", "HB c #919122222828", "IB c #919124242121", "JB c #92922A2A3333", "KB c #969628282727", "LB c #979730302727", "MB c #98982C2C1F1F", "NB c #999924242C2C", "OB c #999928282020", "PB c #9C9C21212626", "AC c #9D9D35353434", "BC c #9E9E2C2C3434", "CC c #9F9F47475353", "DC c #A0A047474D4D", "EC c #A2A22B2B2F2F", "FC c #A2A237374141", "GC c #A4A412121F1F", "HC c #A6A623232B2B", "IC c #A6A627273030", "JC c #B8B81B1B2424", "KC c None", "LC c #C9C910102020", "MC c #CBCB35353434", "NC c #CDCD2D2D3939", "OC c #CECE0A0A1414", "PC c #D0D007071717", "AD c #D1D13C3C3E3E", "BD c #D4D40F0F1818", "CD c #D7D717172626", "DD c #D8D80B0B1A1A", "ED c #DADA0C0C1919", "FD c #DBDB3A3A4040", "GD c #DCDC46464747", "HD c #E0E011112121", "ID c #E3E32D2D3939", "JD c #E8E840403333", "KD c #EAEA06061717", "LD c #EAEA07071212", "MD c #EAEA3D3D2F2F", "ND c #EDED13132121", "OD c #EEEE5F5F4F4F", "PD c #EEEE5F5F5151", "AE c #EFEF57575454", "BE c #F0F005051414", "CE c #F0F07E7E7D7D", "DE c #F1F10B0B1515", "EE c #F1F132322828", "FE c #F2F262625A5A", "GE c #F3F373737272", "HE c #F5F507071616", "IE c #F5F53E3E2E2E", "JE c #F5F555555757", "KE c #F6F672726666", "LE c #F7F739392B2B", "ME c #F7F73B3B3A3A", "NE c #F7F740403232", "OE c #F7F75C5C6262", "PE c #F8F835353939", "AF c #F9F949494C4C", "BF c #F9F95A5A5454", "CF c #F9F95C5C5757", "DF c #FBFB4A4A4242", "EF c #FBFB53534646", "FF c #FDFD31312828", "GF c #FDFD50504C4C", "HF c #FDFD53534646", "IF c #FDFD5F5F5454", "JF c #FEFE76768080", "KF c #FFFF22222929", "LF c #FFFF25252A2A", "MF c #FFFF27273434", "NF c #FFFF28282B2B", "OF c #FFFF2B2B2E2E", "PF c #FFFF2F2F3131", "AG c #FFFF30303535", "BG c #FFFF35354242", "CG c #FFFF37372D2D", "DG c #FFFF37373333", "EG c #FFFF38382E2E", "FG c #FFFF46464343", "GG c #FFFF47474949", "HG c #FFFF48483C3C", "IG c #FFFF4A4A3D3D", "JG c #FFFF4B4B4141", "KG c #FFFF4C4C4F4F", "LG c #FFFF4F4F4C4C", "MG c #FFFF53534C4C", "NG c #FFFF61615E5E", "OG c #FFFF81818484", "PG c #FFFF82828A8A", "AH c #FFFF83837E7E", "BH c #FFFF83838484", "CH c #FFFF85858080", "DH c #FFFF8A8A7E7E", "EH c #FFFF8C8C8585", "FH c #FFFF8F8F7C7C", "GH c #FFFF8F8F7D7D", "HH c #FFFF92929D9D", /* pixels */ "KCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKC", "KCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKC", "KCKCCCJBHBKBLBMALALAMBOBACOAKCKC", "KCKCABHHPGBHEHGHFHFHDHCHCECAKCKC", "KCKCFCJFOEJECFPDODODBFAEGEAAKCKC", "KCKCBCOGNGGFMGEFHFHFLGKGADHAKCKC", "KCKCNBAHIFDFJGIGHGHGFGGGMCIBKCKC", "KCKCECKEDFMDNEIELELEDGMEMCGAKCKC", "KCKCECKEDFMDNEIELELEDGMEMCGAKCKC", "KCKCPBFEJDEEEGCGFFFFPFPEGDBAKCKC", "KCKCHCAFAGKFLFOFNFNFMFBGFDIAKCKC", "KCKCICIDNDBEHEDELDLDKDHDJCEAKCKC", "KCKCGBNCCDDDEDBDOCOCPCLCGCJAKCKC", "KCKCDCKABBDBEBPANANAFBCBFADAKCKC", "KCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKC", "KCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKC", }; golly-2.5-src/gui-wx/bitmaps/stopplay.bmp0000644000175100001440000000246612156145314015455 00000000000000BM66(  ÿÿÿ€€€€€€€€€ÀÀÀÀÜÀðʦ¨\.»f3¿i5Én7Êp:ÍwCÎ{HЂRÑ„UÒ†XÕŽc×’i×”kÙ˜q[é¬ß©‰ä¶šèÀ¨ì̸ðÕÄôßÒöæÜøêâúðêüõðýøõýù÷þüúÿþýðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿgolly-2.5-src/gui-wx/bitmaps/stopplay.xpm0000644000175100001440000000077412156145314015503 00000000000000/* XPM */ static const char *stopplay_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000008080", "B c None", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBAAAAAAAAAABBB", "BBBAAAAAAAAAABBB", "BBBAAAAAAAAAABBB", "BBBAAAAAAAAAABBB", "BBBAAAAAAAAAABBB", "BBBAAAAAAAAAABBB", "BBBAAAAAAAAAABBB", "BBBAAAAAAAAAABBB", "BBBAAAAAAAAAABBB", "BBBAAAAAAAAAABBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB"}; golly-2.5-src/gui-wx/bitmaps/tile.bmp0000644000175100001440000000246612156145314014537 00000000000000BM66(  ÿÿÿ€€€€€€€€€ÀÀÀÀÜÀðʦ¨\.»f3¿i5Én7Êp:ÍwCÎ{HЂRÑ„UÒ†XÕŽc×’i×”kÙ˜q[é¬ß©‰ä¶šèÀ¨ì̸ðÕÄôßÒöæÜøêâúðêüõðýøõýù÷þüúÿþýðûÿ¤  €€€ÿÿÿÿÿÿÿÿÿgolly-2.5-src/gui-wx/bitmaps/tile.xpm0000644000175100001440000000102212156145314014550 00000000000000/* XPM */ static const char *tile_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ "A c #000000008080", "B c None", "C c #DCDCE6E6F6F6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBAAAAAAAAAABBB", "BBBACCACCACCABBB", "BBBACCACCACCABBB", "BBBAAAAAAAAAABBB", "BBBACCACCACCABBB", "BBBACCACCACCABBB", "BBBAAAAAAAAAABBB", "BBBACCACCACCABBB", "BBBACCACCACCABBB", "BBBAAAAAAAAAABBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/gui-wx/bitmaps/tile_down.bmp0000644000175100001440000000246612156145314015566 00000000000000BM66(  ÿÿÿ0¦–Œgolly-2.5-src/gui-wx/bitmaps/tile_down.xpm0000644000175100001440000000101212156145314015576 00000000000000/* XPM */ static const char *tile_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000003030", "B c #8C8C9696A6A6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBAAAAAAAAAABBB", "BBBABBABBABBABBB", "BBBABBABBABBABBB", "BBBAAAAAAAAAABBB", "BBBABBABBABBABBB", "BBBABBABBABBABBB", "BBBAAAAAAAAAABBB", "BBBABBABBABBABBB", "BBBABBABBABBABBB", "BBBAAAAAAAAAABBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/gui-wx/bitmaps/undo.bmp0000644000175100001440000000036612156145314014544 00000000000000BMöv(€  ÿÿÿ€f8£Y-¼g4Ñ„U幟羥ÀÀÀñÙËöæÜˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆgolly-2.5-src/gui-wx/bitmaps/undo.xpm0000644000175100001440000000077012156145314014571 00000000000000/* XPM */ static const char *undo_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000008080", "B c None", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBABBBBBBBB", "BBBBBBAABBBBBBBB", "BBBBBAAABBBBBBBB", "BBBBAAAAAAAAAABB", "BBBAAAAAAAAAAABB", "BBAAAAAAAAAAAABB", "BBAAAAAAAAAAAABB", "BBBAAAAAAAAAAABB", "BBBBAAAAAAAAAABB", "BBBBBAAABBBBBBBB", "BBBBBBAABBBBBBBB", "BBBBBBBABBBBBBBB", "BBBBBBBBBBBBBBBB", "BBBBBBBBBBBBBBBB"}; golly-2.5-src/gui-wx/bitmaps/zoomin.bmp0000644000175100001440000000036612156145314015112 00000000000000BMöv(€  ÿÿÿ€ÀÀÀöæÜ""""""""""""""""""""!3""!3"!311""3331""331""!3333"!33"!33"!3333""331"""3331"""!31""""!"""""""""""golly-2.5-src/gui-wx/bitmaps/zoomin.xpm0000644000175100001440000000102412156145314015130 00000000000000/* XPM */ static const char *zoomin_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ "A c #000000008080", "B c None", "C c #DCDCE6E6F6F6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBAAAABBBBBBB", "BBBAACCCCAABBBBB", "BBACCCCCCCCABBBB", "BBACCCAACCCABBBB", "BACCCCAACCCCABBB", "BACCAAAAAACCABBB", "BACCAAAAAACCABBB", "BACCCCAACCCCABBB", "BBACCCAACCCABBBB", "BBACCCCCCCCAABBB", "BBBAACCCCAAACABB", "BBBBBAAAABACCCAB", "BBBBBBBBBBBACCAB", "BBBBBBBBBBBBAABB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/gui-wx/bitmaps/zoomin_curs.bmp0000644000175100001440000000036612156145314016146 00000000000000BMöv(€ÄÄÿÿÿ€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿwwwwww÷wwwwwwðwwwwwwwwwwð÷wwÿÿwwÿÿð÷wÿwwð÷wwððwwðÿÿðwwðÿÿðwwððwwð÷ww÷wwwÿÿwwwwwÿÿwwwwgolly-2.5-src/gui-wx/bitmaps/zoomin_curs.xpm0000644000175100001440000000103112156145314016162 00000000000000/* XPM */ static const char *zoomin_curs_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ "A c #FFFFFFFFFFFF", "B c None", "C c #000000000000", /* pixels */ "BBBBCCCCBBBBBBBB", "BBCCAAAACCBBBBBB", "BCAAAAAAAACBBBBB", "BCAAACCAAACBBBBB", "CAAAACCAAAACBBBB", "CAACCCCCCAACBBBB", "CAACCCCCCAACBBBB", "CAAAACCAAAACBBBB", "BCAAACCAAACBBBBB", "BCAAAAAAAACCBBBB", "BBCCAAAACCCACBBB", "BBBBCCCCBCAAACBB", "BBBBBBBBBBCAAACB", "BBBBBBBBBBBCAAAC", "BBBBBBBBBBBBCAAC", "BBBBBBBBBBBBBCCB", }; golly-2.5-src/gui-wx/bitmaps/zoomin_down.bmp0000644000175100001440000000246612156145314016144 00000000000000BM66(  ÿÿÿ0¦–Œgolly-2.5-src/gui-wx/bitmaps/zoomin_down.xpm0000644000175100001440000000101412156145314016156 00000000000000/* XPM */ static const char *zoomin_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000003030", "B c #8C8C9696A6A6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBAAAABBBBBBB", "BBBAABBBBAABBBBB", "BBABBBBBBBBABBBB", "BBABBBAABBBABBBB", "BABBBBAABBBBABBB", "BABBAAAAAABBABBB", "BABBAAAAAABBABBB", "BABBBBAABBBBABBB", "BBABBBAABBBABBBB", "BBABBBBBBBBAABBB", "BBBAABBBBAAABABB", "BBBBBAAAABABBBAB", "BBBBBBBBBBBABBAB", "BBBBBBBBBBBBAABB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/gui-wx/bitmaps/zoomout.bmp0000644000175100001440000000036612156145314015313 00000000000000BMöv(€  ÿÿÿ€ÀÀÀöæÜ""""""""""""""""""""!3""!3"!311""3331""3331""!33333"!33"!33"!33333""3331"""3331"""!31""""!"""""""""""golly-2.5-src/gui-wx/bitmaps/zoomout.xpm0000644000175100001440000000102512156145314015332 00000000000000/* XPM */ static const char *zoomout_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ "A c #000000008080", "B c None", "C c #DCDCE6E6F6F6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBAAAABBBBBBB", "BBBAACCCCAABBBBB", "BBACCCCCCCCABBBB", "BBACCCCCCCCABBBB", "BACCCCCCCCCCABBB", "BACCAAAAAACCABBB", "BACCAAAAAACCABBB", "BACCCCCCCCCCABBB", "BBACCCCCCCCABBBB", "BBACCCCCCCCAABBB", "BBBAACCCCAAACABB", "BBBBBAAAABACCCAB", "BBBBBBBBBBBACCAB", "BBBBBBBBBBBBAABB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/gui-wx/bitmaps/zoomout_curs.bmp0000644000175100001440000000036612156145314016347 00000000000000BMöv(€ÄÄÿÿÿ€€€€€€€€€ÀÀÀ€€€ÿÿÿÿÿÿÿÿÿwwwwww÷wwwwwwðwwwwwwwwwwð÷wwÿÿwwÿÿð÷wÿww÷wwðwwðÿÿðwwðÿÿðwwðww÷ww÷wwwÿÿwwwwwÿÿwwwwgolly-2.5-src/gui-wx/bitmaps/zoomout_curs.xpm0000644000175100001440000000103212156145314016364 00000000000000/* XPM */ static const char *zoomout_curs_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 3 1", /* colors */ "A c #FFFFFFFFFFFF", "B c None", "C c #000000000000", /* pixels */ "BBBBCCCCBBBBBBBB", "BBCCAAAACCBBBBBB", "BCAAAAAAAACBBBBB", "BCAAAAAAAACBBBBB", "CAAAAAAAAAACBBBB", "CAACCCCCCAACBBBB", "CAACCCCCCAACBBBB", "CAAAAAAAAAACBBBB", "BCAAAAAAAACBBBBB", "BCAAAAAAAACCBBBB", "BBCCAAAACCCACBBB", "BBBBCCCCBCAAACBB", "BBBBBBBBBBCAAACB", "BBBBBBBBBBBCAAAC", "BBBBBBBBBBBBCAAC", "BBBBBBBBBBBBBCCB", }; golly-2.5-src/gui-wx/bitmaps/zoomout_down.bmp0000644000175100001440000000246612156145314016345 00000000000000BM66(  ÿÿÿ0¦–Œgolly-2.5-src/gui-wx/bitmaps/zoomout_down.xpm0000644000175100001440000000101512156145314016360 00000000000000/* XPM */ static const char *zoomout_down_xpm[] = { /* width height ncolors chars_per_pixel */ "16 16 2 1", /* colors */ "A c #000000003030", "B c #8C8C9696A6A6", /* pixels */ "BBBBBBBBBBBBBBBB", "BBBBBAAAABBBBBBB", "BBBAABBBBAABBBBB", "BBABBBBBBBBABBBB", "BBABBBBBBBBABBBB", "BABBBBBBBBBBABBB", "BABBAAAAAABBABBB", "BABBAAAAAABBABBB", "BABBBBBBBBBBABBB", "BBABBBBBBBBABBBB", "BBABBBBBBBBAABBB", "BBBAABBBBAAABABB", "BBBBBAAAABABBBAB", "BBBBBBBBBBBABBAB", "BBBBBBBBBBBBAABB", "BBBBBBBBBBBBBBBB", }; golly-2.5-src/cmdline/0000755000175100001440000000000012156146016011706 500000000000000golly-2.5-src/cmdline/RuleTableToTree.cpp0000644000175100001440000001347012156145314015341 00000000000000#ifdef _MSC_VER #pragma warning(disable:4702) // disable "unreachable code" warnings from MSVC #endif #include #ifdef _MSC_VER #pragma warning(default:4702) // enable "unreachable code" warnings #endif #include #include #include #include #include #include "util.h" #include "ruletable_algo.h" using namespace std ; const int MAXPARAMS = 9 ; const int MAXSTATES = 256 ; struct ndd { int level, index ; vector vals ; bool operator<(const ndd &n) const { if (level != n.level) return level < n.level ; return vals < n.vals ; } bool operator==(const ndd &n) const { return level == n.level && vals == n.vals ; } } ; set world ; int nodeseq ; int shrinksize = 100 ; vector seq ; int n_states, neighborhood_size ; int curndd = 0 ; typedef unsigned char state ; static int getnode(ndd &n) { n.index = nodeseq ; set::iterator it = world.find(n) ; if (it != world.end()) return it->index ; seq.push_back(n) ; world.insert(n) ; return nodeseq++ ; } void initndd() { curndd = -1 ; for (int i=0; i cache ; int remap5[5] = {0, 3, 2, 4, 1} ; int remap9[9] = {0, 5, 3, 7, 1, 4, 6, 2, 8} ; int *remap ; int addndd(const vector > &inputs, const state output, int nddr, int at) { if (at == 0) return nddr < 0 ? output : nddr ; map::iterator it = cache.find(nddr) ; if (it != cache.end()) return it->second ; ndd n = seq[nddr] ; const vector &inset = inputs[remap[at-1]] ; for (unsigned int i=0; i > &inputs, const state output) { if (neighborhood_size == 5) remap = remap5 ; else remap = remap9 ; cache.clear() ; curndd = addndd(inputs, output, curndd, neighborhood_size) ; if (nodeseq > shrinksize) shrink() ; } int setdefaults(int nddr, int off, int at) { if (at == 0) return nddr < 0 ? off : nddr ; map::iterator it = cache.find(nddr) ; if (it != cache.end()) return it->second ; ndd n = seq[nddr] ; for (int i=0; i &oseq, int nddr, int lev) { if (lev == 0) return nddr ; map::iterator it = cache.find(nddr) ; if (it != cache.end()) return it->second ; ndd n = oseq[nddr] ; for (int i=0; i oseq = seq ; seq.clear() ; cache.clear() ; nodeseq = 0 ; curndd = recreate(oseq, curndd, neighborhood_size) ; cerr << "Shrunk from " << oseq.size() << " to " << seq.size() << endl ; shrinksize = (int)(seq.size() * 2) ; } void write_ndd() { shrink() ; printf("num_states=%d\n", n_states) ; printf("num_neighbors=%d\n", neighborhood_size-1) ; printf("num_nodes=%d\n", (int)seq.size()) ; for (unsigned int i=0; in_compressed_rules;iRule++) { for (unsigned int bitno=0; bitno > in ; int ok = 1 ; for (int i=0; i nv ; for (unsigned int j=0; jRules/rule.tree" << endl ; exit(0) ; } lifeerrors::seterrorhandler(&mylifeerrors) ; my_ruletable_algo *rta = new my_ruletable_algo() ; string err = rta->loadrule(argv[1]) ; if (err.size() > 0) { cerr << "Error: " << err << endl ; exit(0) ; } rta->buildndd() ; write_ndd() ; delete rta ; } golly-2.5-src/cmdline/bgolly.cpp0000644000175100001440000004676412156145314013643 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "qlifealgo.h" #include "hlifealgo.h" #include "generationsalgo.h" #include "jvnalgo.h" #include "ruleloaderalgo.h" #include "readpattern.h" #include "util.h" #include "viewport.h" #include "liferender.h" #include "writepattern.h" #include #include #include #include #include #ifdef TIMING #include #endif using namespace std ; viewport viewport(1000, 1000) ; /* * This is a "renderer" that is just stubs, for performance testing. */ class nullrender : public liferender { public: nullrender() {} virtual ~nullrender() {} virtual void killrect(int, int, int, int) {} virtual void pixblit(int, int, int, int, char*, int) {} virtual void getcolors(unsigned char** r, unsigned char** g, unsigned char** b) { static unsigned char dummy[256]; *r = *g = *b = dummy; } } ; nullrender renderer ; /* * This is a "lifeerrors" that we can use to test some edge * conditions. In this case the only real thing we use * it for is to check rendering during a progress dialog. */ class nullerrors : public lifeerrors { public: nullerrors() {} virtual void fatal(const char *) {} virtual void warning(const char *) {} virtual void status(const char *) {} virtual void beginprogress(const char *s) { abortprogress(0, s) ; } virtual bool abortprogress(double, const char *) ; virtual void endprogress() { abortprogress(1, "") ; } virtual const char* getuserrules() { return "" ; } virtual const char* getrulesdir() { return "Rules/" ; } } ; nullerrors nullerror ; #ifdef TIMING double start ; double timestamp() { struct timeval tv ; gettimeofday(&tv, 0) ; double now = tv.tv_sec + 0.000001 * tv.tv_usec ; double r = now - start ; start = now ; return r ; } #endif /* * This is a "lifeerrors" that we can use to test some edge * conditions. In this case the only real thing we use * it for is to check rendering during a progress dialog. */ class verbosestatus : public lifeerrors { public: verbosestatus() {} virtual void fatal(const char *) {} virtual void warning(const char *) {} virtual void status(const char *s) { #ifdef TIMING cout << timestamp() << " " << s << endl ; #endif } virtual void beginprogress(const char *) {} virtual bool abortprogress(double, const char *) { return 0 ; } virtual void endprogress() {} virtual const char* getuserrules() { return "" ; } virtual const char* getrulesdir() { return "Rules/" ; } } ; verbosestatus verbosestatus_instance ; char *filename ; lifealgo *imp = 0 ; struct options { const char *shortopt ; const char *longopt ; const char *desc ; char opttype ; void *data ; } ; bigint maxgen = -1, inc = 0 ; int maxmem = 256 ; int hyper, render, autofit, quiet, popcount, progress ; int hashlife ; char *algoName = 0 ; int verbose ; int timeline ; int stepthresh, stepfactor ; char *liferule = 0 ; char *outfilename = 0 ; char *renderscale = (char *)"1" ; char *testscript = 0 ; int outputgzip, outputismc ; int numberoffset ; // where to insert file name numbers options options[] = { { "-m", "--generation", "How far to run", 'I', &maxgen }, { "-i", "--stepsize", "Step size", 'I', &inc }, { "-M", "--maxmemory", "Max memory to use in megabytes", 'i', &maxmem }, { "-2", "--exponential", "Use exponentially increasing steps", 'b', &hyper }, { "-q", "--quiet", "Don't show population; twice, don't show anything", 'b', &quiet }, { "-r", "--rule", "Life rule to use", 's', &liferule }, { "-h", "--hashlife", "Use Hashlife algorithm", 'b', &hashlife }, { "-a", "--algorithm", "Select algorithm by name", 's', &algoName }, { "-o", "--output", "Output file (*.rle, *.mc, *.rle.gz, *.mc.gz)", 's', &outfilename }, { "-v", "--verbose", "Verbose", 'b', &verbose }, { "-t", "--timeline", "Use timeline", 'b', &timeline }, { "", "--render", "Render (benchmarking)", 'b', &render }, { "", "--progress", "Render during progress dialog (debugging)", 'b', &progress }, { "", "--popcount", "Popcount (benchmarking)", 'b', &popcount }, { "", "--scale", "Rendering scale", 's', &renderscale }, //{ "", "--stepthreshold", "Stepsize >= gencount/this (default 1)", // 'i', &stepthresh }, //{ "", "--stepfactor", "How much to scale step by (default 2)", // 'i', &stepfactor }, { "", "--autofit", "Autofit before each render", 'b', &autofit }, { "", "--exec", "Run testing script", 's', &testscript }, { 0, 0, 0, 0, 0 } } ; int endswith(const char *s, const char *suff) { int off = (int)(strlen(s) - strlen(suff)) ; if (off <= 0) return 0 ; s += off ; while (*s) if (tolower(*s++) != tolower(*suff++)) return 0 ; numberoffset = off ; return 1 ; } void usage(const char *s) { fprintf(stderr, "Usage: bgolly [options] patternfile\n") ; for (int i=0; options[i].shortopt; i++) fprintf(stderr, "%3s %-15s %s\n", options[i].shortopt, options[i].longopt, options[i].desc) ; if (s) lifefatal(s) ; exit(0) ; } #define STRINGIFY(ARG) STR2(ARG) #define STR2(ARG) #ARG #define MAXRLE 1000000000 void writepat(int fc) { char *thisfilename = outfilename ; char tmpfilename[256] ; if (fc >= 0) { strcpy(tmpfilename, outfilename) ; char *p = tmpfilename + numberoffset ; *p++ = '-' ; sprintf(p, "%d", fc) ; p += strlen(p) ; strcpy(p, outfilename + numberoffset) ; thisfilename = tmpfilename ; } cerr << "(->" << thisfilename << flush ; bigint t, l, b, r ; imp->findedges(&t, &l, &b, &r) ; if (!outputismc && (t < -MAXRLE || l < -MAXRLE || b > MAXRLE || r > MAXRLE)) lifefatal("Pattern too large to write in RLE format") ; const char *err = writepattern(thisfilename, *imp, outputismc ? MC_format : RLE_format, outputgzip ? gzip_compression : no_compression, t.toint(), l.toint(), b.toint(), r.toint()) ; if (err != 0) lifewarning(err) ; cerr << ")" << flush ; } const int MAXCMDLENGTH = 2048 ; struct cmdbase { cmdbase(const char *cmdarg, const char *argsarg) { verb = cmdarg ; args = argsarg ; next = list ; list = this ; } const char *verb ; const char *args ; int iargs[4] ; char *sarg ; bigint barg ; virtual void doit() {} // for convenience, we put the generic loop here that takes a // 4x bounding box and runs getnext on all y values until // they are done. Input is assumed to be a bounding box in the // form minx miny maxx maxy void runnextloop() { int minx = iargs[0] ; int miny = iargs[1] ; int maxx = iargs[2] ; int maxy = iargs[3] ; int v ; for (int y=miny; y<=maxy; y++) { for (int x=minx; x<=maxx; x++) { int dx = imp->nextcell(x, y, v) ; if (dx < 0) break ; if (x > 0 && (x + dx) < 0) break ; x += dx ; if (x > maxx) break ; nextloopinner(x, y) ; } } } virtual void nextloopinner(int, int) {} int parseargs(const char *cmdargs) { int iargn = 0 ; char sbuf[MAXCMDLENGTH+2] ; for (const char *rargs = args; *rargs; rargs++) { while (*cmdargs && *cmdargs <= ' ') cmdargs++ ; if (*cmdargs == 0) { lifewarning("Missing needed argument") ; return 0 ; } switch (*rargs) { case 'i': if (sscanf(cmdargs, "%d", iargs+iargn) != 1) { lifewarning("Missing needed integer argument") ; return 0 ; } iargn++ ; break ; case 'b': { int i = 0 ; for (i=0; cmdargs[i] > ' '; i++) sbuf[i] = cmdargs[i] ; sbuf[i] = 0 ; barg = bigint(sbuf) ; } break ; case 's': if (sscanf(cmdargs, "%s", sbuf) != 1) { lifewarning("Missing needed string argument") ; return 0 ; } sarg = strdup(sbuf) ; break ; default: lifefatal("Internal error in parseargs") ; } while (*cmdargs && *cmdargs > ' ') cmdargs++ ; } return 1 ; } static void docmd(const char *cmdline) { for (cmdbase *cmd=list; cmd; cmd = cmd->next) if (strncmp(cmdline, cmd->verb, strlen(cmd->verb)) == 0 && cmdline[strlen(cmd->verb)] <= ' ') { if (cmd->parseargs(cmdline+strlen(cmd->verb))) { cmd->doit() ; } return ; } lifewarning("Didn't understand command") ; } cmdbase *next ; virtual ~cmdbase() {} static cmdbase *list ; } ; cmdbase *cmdbase::list = 0 ; struct loadcmd : public cmdbase { loadcmd() : cmdbase("load", "s") {} virtual void doit() { const char *err = readpattern(sarg, *imp) ; if (err != 0) lifewarning(err) ; } } load_inst ; struct stepcmd : public cmdbase { stepcmd() : cmdbase("step", "b") {} virtual void doit() { imp->setIncrement(barg) ; imp->step() ; cout << imp->getGeneration().tostring() << ": " ; cout << imp->getPopulation().tostring() << endl ; } } step_inst ; struct showcmd : public cmdbase { showcmd() : cmdbase("show", "") {} virtual void doit() { cout << imp->getGeneration().tostring() << ": " ; cout << imp->getPopulation().tostring() << endl ; } } show_inst ; struct quitcmd : public cmdbase { quitcmd() : cmdbase("quit", "") {} virtual void doit() { cout << "Buh-bye!" << endl ; exit(10) ; } } quit_inst ; struct setcmd : public cmdbase { setcmd() : cmdbase("set", "ii") {} virtual void doit() { imp->setcell(iargs[0], iargs[1], 1) ; } } set_inst ; struct unsetcmd : public cmdbase { unsetcmd() : cmdbase("unset", "ii") {} virtual void doit() { imp->setcell(iargs[0], iargs[1], 0) ; } } unset_inst ; struct helpcmd : public cmdbase { helpcmd() : cmdbase("help", "") {} virtual void doit() { for (cmdbase *cmd=list; cmd; cmd = cmd->next) cout << cmd->verb << " " << cmd->args << endl ; } } help_inst ; struct getcmd : public cmdbase { getcmd() : cmdbase("get", "ii") {} virtual void doit() { cout << "At " << iargs[0] << "," << iargs[1] << " -> " << imp->getcell(iargs[0], iargs[1]) << endl ; } } get_inst ; struct getnextcmd : public cmdbase { getnextcmd() : cmdbase("getnext", "ii") {} virtual void doit() { int v ; cout << "At " << iargs[0] << "," << iargs[1] << " next is " << imp->nextcell(iargs[0], iargs[1], v) << endl ; } } getnext_inst ; vector > cutbuf ; struct copycmd : public cmdbase { copycmd() : cmdbase("copy", "iiii") {} virtual void nextloopinner(int x, int y) { cutbuf.push_back(make_pair(x-iargs[0], y-iargs[1])) ; } virtual void doit() { cutbuf.clear() ; runnextloop() ; cout << cutbuf.size() << " pixels copied." << endl ; } } copy_inst ; struct cutcmd : public cmdbase { cutcmd() : cmdbase("cut", "iiii") {} virtual void nextloopinner(int x, int y) { cutbuf.push_back(make_pair(x-iargs[0], y-iargs[1])) ; imp->setcell(x, y, 0) ; } virtual void doit() { cutbuf.clear() ; runnextloop() ; cout << cutbuf.size() << " pixels cut." << endl ; } } cut_inst ; // this paste only sets cells, never clears cells struct pastecmd : public cmdbase { pastecmd() : cmdbase("paste", "ii") {} virtual void doit() { for (unsigned int i=0; isetcell(cutbuf[i].first, cutbuf[i].second, 1) ; cout << cutbuf.size() << " pixels pasted." << endl ; } } paste_inst ; struct showcutcmd : public cmdbase { showcutcmd() : cmdbase("showcut", "") {} virtual void doit() { for (unsigned int i=0; icreator)() ; if (imp == 0) lifefatal("Could not create universe") ; imp->setMaxMemory(maxmem) ; return imp ; } struct newcmd : public cmdbase { newcmd() : cmdbase("new", "") {} virtual void doit() { if (imp != 0) delete imp ; imp = createUniverse() ; } } new_inst ; struct sethashingcmd : public cmdbase { sethashingcmd() : cmdbase("sethashing", "i") {} virtual void doit() { hashlife = iargs[0] ; } } sethashing_inst ; struct setmaxmemcmd : public cmdbase { setmaxmemcmd() : cmdbase("setmaxmem", "i") {} virtual void doit() { maxmem = iargs[0] ; } } setmaxmem_inst ; struct setalgocmd : public cmdbase { setalgocmd() : cmdbase("setalgo", "s") {} virtual void doit() { algoName = sarg ; } } setalgocmd_inst ; struct edgescmd : public cmdbase { edgescmd() : cmdbase("edges", "") {} virtual void doit() { bigint t, l, b, r ; imp->findedges(&t, &l, &b, &r) ; cout << "Bounding box " << l.tostring() ; cout << " " << t.tostring() ; cout << " .. " << r.tostring() ; cout << " " << b.tostring() << endl ; } } edges_inst ; bool nullerrors::abortprogress(double, const char *) { imp->draw(viewport, renderer) ; return 0 ; } void runtestscript(const char *testscript) { FILE *cmdfile = 0 ; if (strcmp(testscript, "-") != 0) cmdfile = fopen(testscript, "r") ; else cmdfile = stdin ; char cmdline[MAXCMDLENGTH + 10] ; if (cmdfile == 0) lifefatal("Cannot open testscript") ; for (;;) { cerr << flush ; if (cmdfile == stdin) cout << "bgolly> " << flush ; else cout << flush ; if (fgets(cmdline, MAXCMDLENGTH, cmdfile) == 0) break ; cmdbase::docmd(cmdline) ; } exit(0) ; } int main(int argc, char *argv[]) { cout << "This is bgolly " STRINGIFY(VERSION) " Copyright 2013 The Golly Gang." << endl << flush ; qlifealgo::doInitializeAlgoInfo(staticAlgoInfo::tick()) ; hlifealgo::doInitializeAlgoInfo(staticAlgoInfo::tick()) ; generationsalgo::doInitializeAlgoInfo(staticAlgoInfo::tick()) ; jvnalgo::doInitializeAlgoInfo(staticAlgoInfo::tick()) ; ruleloaderalgo::doInitializeAlgoInfo(staticAlgoInfo::tick()) ; while (argc > 1 && argv[1][0] == '-') { argc-- ; argv++ ; char *opt = argv[0] ; int hit = 0 ; for (int i=0; options[i].shortopt; i++) { if (strcmp(opt, options[i].shortopt) == 0 || strcmp(opt, options[i].longopt) == 0) { switch (options[i].opttype) { case 'i': if (argc < 2) lifefatal("Bad option argument") ; *(int *)options[i].data = atol(argv[1]) ; argc-- ; argv++ ; break ; case 'I': if (argc < 2) lifefatal("Bad option argument") ; *(bigint *)options[i].data = bigint(argv[1]) ; argc-- ; argv++ ; break ; case 'b': (*(int *)options[i].data) += 1 ; break ; case 's': if (argc < 2) lifefatal("Bad option argument") ; *(char **)options[i].data = argv[1] ; argc-- ; argv++ ; break ; } hit++ ; break ; } } if (!hit) usage("Bad option given") ; } if (argc < 2 && !testscript) usage("No pattern argument given") ; if (argc > 2) usage("Extra stuff after pattern argument") ; if (outfilename) { if (endswith(outfilename, ".rle")) { } else if (endswith(outfilename, ".mc")) { outputismc = 1 ; #ifdef ZLIB } else if (endswith(outfilename, ".rle.gz")) { outputgzip = 1 ; } else if (endswith(outfilename, ".mc.gz")) { outputismc = 1 ; outputgzip = 1 ; #endif } else { lifefatal("Output filename must end with .rle or .mc.") ; } if (strlen(outfilename) > 200) lifefatal("Output filename too long") ; } if (timeline && hyper) lifefatal("Cannot use both timeline and hyperthreading") ; imp = createUniverse() ; if (progress) lifeerrors::seterrorhandler(&nullerror) ; else if (verbose) { lifeerrors::seterrorhandler(&verbosestatus_instance) ; hlifealgo::setVerbose(1) ; } imp->setMaxMemory(maxmem) ; #ifdef TIMING timestamp() ; #endif if (testscript) { if (argc > 1) { filename = argv[1] ; const char *err = readpattern(argv[1], *imp) ; if (err) lifefatal(err) ; } runtestscript(testscript) ; } filename = argv[1] ; const char *err = readpattern(argv[1], *imp) ; if (err) lifefatal(err) ; if (liferule) imp->setrule(liferule) ; if (inc != 0) imp->setIncrement(inc) ; if (timeline) { int lowbit = inc.lowbitset() ; bigint t = 1 ; for (int i=0; istartrecording(2, lowbit) ; } int fc = 0 ; for (;;) { if (quiet < 2) { cout << imp->getGeneration().tostring() ; if (!quiet) cout << ": " << imp->getPopulation().tostring() << endl ; else cout << endl ; } if (popcount) imp->getPopulation() ; if (autofit) imp->fit(viewport, 1) ; if (render) imp->draw(viewport, renderer) ; if (maxgen >= 0 && imp->getGeneration() >= maxgen) break ; if (!hyper && maxgen > 0 && inc == 0) { bigint diff = maxgen ; diff -= imp->getGeneration() ; int bs = diff.lowbitset() ; diff = 1 ; diff <<= bs ; imp->setIncrement(diff) ; } imp->step() ; if (maxgen < 0 && outfilename != 0) writepat(fc++) ; if (timeline && imp->getframecount() + 2 > MAX_FRAME_COUNT) imp->pruneframes() ; if (hyper) imp->setIncrement(imp->getGeneration()) ; } if (maxgen >= 0 && outfilename != 0) writepat(-1) ; exit(0) ; } golly-2.5-src/gollybase/0000755000175100001440000000000012156146015012253 500000000000000golly-2.5-src/gollybase/bigint.h0000644000175100001440000001537512156145314013634 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /** * Class bigint manages signed bigints using a very Lisp-ish approach. * Integers from -0x40000000 through 0x3fffffff are represented * by a direct instance of this four-byte class, with the lowest * bit set. Integers outside that range use a pointer to an * integer array; the first element is how many elements of * that array are used. The array itself is always a power of * two in size, the smallest power of two greater than * the number of used elements. * * The value of the bigint, when represented as a vector, is * always sum 1<=i<=v.p[0] 2^(31*(i-1))*v.p[i] * * You can use this as a value class, in which case it may do a * lot of allocation/deallocation during copy and assignment, or * (preferably, for efficiency) you can use it as a mutating * class, with +=, -=, and the like operators that will not * allocate/free unnecessarily. * * We'll add mempool support soon. * * If we are using an int array, each holds 31 bits of the number. * All elements except the last are in the range 0..2^31-1; the * last is always either 0 or -1. * (This is an invariant; note that we have only canonical forms.) * If it is a positive number, the last element is 0; if it is * a negative number, the last element is -1. You can consider * the last element as * the sign except that the other components are in two's * complement form. * * We use a binary form (the radix is 2^31) because that makes * bit extraction faster, at the expense of decimal conversion. * But decimal conversion is not *that* onerous, so this is * okay. * * This code is *very* carefully written so that things like * the comparisons can be done simply; specifically, we always * have a single canonical representation of each number. * * We never use an array size smaller than 4. * * Nonnegative numbers are represented as follows: * * 0..2^30-1 Directly, shifted left one with the low bit set * 2^30..2^31-1 siz=2, low 31 bits then 0; array size is 4 * 2^31..2^62-1 size=3, two 31-bit words then 0; array size is 4 * 2^62..2^93-1 size=4, three 31-bit words then 0; array size is 8 * ... * 2^155..2^186-1 size=7, six 31-bit words than 0; array size is 8 * 2^186..2^217-1 size=8, seven 31-bit words then 0; array size is 16 * * Negative numbers are analogous: * * -1..-2^30 Directly, shifted left one with the low bit set * -2^30-1..-2^31 siz=2, low 31 bits then -1; array size is 4 * -2^31-1..-2^62 size=3, two 31-bit words then -1; array size is 4 * -2^62-1..-2^93 size=4, three 31-bit words then -1; array size is 8 * ... * -2^155-1..-2^186 size=7, six 31-bit words than -1; array size is 8 * -2^186-1..-2^217 size=8, seven 31-bit words then -1; array size is 16 * * The only upper bound on the size of these numbers is memory. * * We only provide a limited number of arithmetic operations for the * moment. (Addition, subtraction, comparison, bit extraction, * radix conversion, parsing, copying, assignment, to float, to double, * to int, to long long, minbits). */ #ifndef BIGINT_H #define BIGINT_H #ifdef _MSC_VER #if _MSC_VER < 1300 // 12xx = VC6; 13xx = VC7 #define G_INT64 __int64 #define G_MAKEINT64(x) x ## i64 #define G_INT64_FMT "I64d" #endif #endif #ifndef G_INT64 #define G_INT64 long long #define G_MAKEINT64(x) x ## LL #define G_INT64_FMT "lld" #endif class bigint { public: bigint() ; bigint(int i) ; bigint(G_INT64 i) ; bigint(const char *s) ; bigint(const bigint &a) ; ~bigint() ; bigint& operator=(const bigint &a) ; bigint& operator+=(const bigint &a) ; bigint& operator-=(const bigint &a) ; bigint& operator>>=(int i) ; bigint& operator<<=(int i) ; void mulpow2(int p) ; int operator==(const bigint &b) const ; int operator!=(const bigint &b) const ; int operator<=(const bigint &b) const ; int operator>=(const bigint &b) const ; int operator<(const bigint &b) const ; int operator>(const bigint &b) const ; int even() const ; int odd() const ; int low31() const ; // return the low 31 bits quickly int lowbitset() const ; // return the index of the lowest set bit const char *tostring(char sep=sepchar) const ; int sign() const ; // note: a should be a small positive int, say 1..10,000 void mul_smallint(int a) ; // note: a should be a small positive int, say 1..10,000 void div_smallint(int a) ; // note: a should be a small positive int, say 1..10,000 int mod_smallint(int a) ; // note: a should be a small positive int, say 1..10,000 void div2() ; // note: a may only be a *31* bit int, not just 0 or 1 // note: may only be called on arrayed bigints void add_smallint(int a) ; double todouble() const ; double toscinot() const ; int toint() const ; // static values predefined static const bigint zero, one, two, three ; // how many bits required to represent this (approximately)? int bitsreq() const ; // fill in one bit per char, up to n. void tochararr(char *ar, int siz) const ; private: // note: may only be called on arrayed bigints int size() const ; // do we need to shrink it to keep it canonical? void shrink(int pos) ; void grow(int osz, int nsz) ; // note: carry may be any legal 31-bit int // note: may only be called on arrayed bigints void ripple(int carry, int pos) ; void ripple(const bigint &a, int carry) ; void ripplesub(const bigint &a, int carry) ; // make sure it's in vector form; may leave it not canonical! void vectorize(int i) ; void fromint(int i) ; void ensurework(int sz) const ; union { int i ; int *p ; } v ; static char *printbuf ; static int *work ; static int printbuflen ; static int workarrlen ; static char sepchar ; static int sepcount ; } ; #endif golly-2.5-src/gollybase/generationsalgo.h0000644000175100001440000000320112156145314015522 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef GENERALGO_H #define GENERALGO_H #include "ghashbase.h" /** * Our Generations algo class. */ class generationsalgo : public ghashbase { public: generationsalgo() ; virtual ~generationsalgo() ; virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) ; virtual const char* setrule(const char* s) ; virtual const char* getrule() ; virtual const char* DefaultRule() ; virtual int NumCellStates() ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; private: int bornbits ; int staybits ; // canonical version of valid rule passed into setrule char canonrule[MAXRULESIZE] ; }; #endif golly-2.5-src/gollybase/ghashbase.h0000644000175100001440000002010112156145314014264 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef GHASHBASE_H #define GHASHBASE_H #include "lifealgo.h" #include "liferules.h" /* * This class forms the basis of all hashlife-type algorithms except * the highly-optimized hlifealgo (which is most appropriate for * simple two-state automata). This more generalized class is used * for multi-state algorithms. */ /** * The size of a state. Unsigned char works for now. */ typedef unsigned char state ; /** * Nodes, like the standard hlifealgo nodes. */ struct ghnode { ghnode *next ; /* hash link */ ghnode *nw, *ne, *sw, *se ; /* constant; nw != 0 means nonjleaf */ ghnode *res ; /* cache */ } ; /* * Leaves, like the standard hlifealgo leaves. */ struct ghleaf { ghnode *next ; /* hash link */ ghnode *isghnode ; /* must always be zero for leaves */ state nw, ne, sw, se ; /* constant */ unsigned short leafpop ; /* how many set bits */ } ; /* * If it is a struct ghnode, this returns a non-zero value, otherwise it * returns a zero value. */ #define is_ghnode(n) (((ghnode *)(n))->nw) /** * Our ghashbase class. Note that this is an abstract class; you need * to expand specific methods to specialize it for a particular multi-state * automata. */ class ghashbase : public lifealgo { public: ghashbase() ; virtual ~ghashbase() ; // This is the method that computes the next generation, slowly. // This should be overridden by a deriving class. virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) = 0 ; // note that for ghashbase, clearall() releases no memory; it retains // the full cache information but just sets the current pattern to // the empty pattern. virtual void clearall() ; virtual int setcell(int x, int y, int newstate) ; virtual int getcell(int x, int y) ; virtual int nextcell(int x, int y, int &v) ; virtual void endofpattern() ; virtual void setIncrement(bigint inc) ; virtual void setIncrement(int inc) { setIncrement(bigint(inc)) ; } virtual void setGeneration(bigint gen) { generation = gen ; } virtual const bigint &getPopulation() ; virtual int isEmpty() ; virtual int hyperCapable() { return 1 ; } virtual void setMaxMemory(int m) ; virtual int getMaxMemory() { return (int)(maxmem >> 20) ; } virtual const char *setrule(const char *) ; virtual const char *getrule() { return "" ; } virtual void step() ; virtual void* getcurrentstate() { return root ; } virtual void setcurrentstate(void *n) ; /* * The contract of draw() is that it render every pixel in the * viewport precisely once. This allows us to eliminate all * flashing. Later we'll make this be damage-specific. */ virtual void draw(viewport &view, liferender &renderer) ; virtual void fit(viewport &view, int force) ; virtual void lowerRightPixel(bigint &x, bigint &y, int mag) ; virtual void findedges(bigint *t, bigint *l, bigint *b, bigint *r) ; virtual const char *readmacrocell(char *line) ; virtual const char *writeNativeFormat(std::ostream &os, char *comments) ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; private: /* * Some globals representing our universe. The root is the * real root of the universe, and the depth is the depth of the * tree where 2 means that root is a ghleaf, and 3 means that the * children of root are leaves, and so on. The center of the * root is always coordinate position (0,0), so at startup the * x and y coordinates range from -4..3; in general, * -(2**depth)..(2**depth)-1. The zeroghnodea is an * array of canonical `empty-space' ghnodes at various depths. * The ngens is an input parameter which is the second power of * the number of generations to run. */ ghnode *root ; int depth ; ghnode **zeroghnodea ; int nzeros ; /* * Finally, our gc routine. We keep a `stack' of all the `roots' * we want to preserve. Nodes not reachable from here, we allow to * be freed. Same with leaves. */ ghnode **stack ; int stacksize ; g_uintptr_t hashpop, hashlimit, hashprime ; ghnode **hashtab ; int halvesdone ; int gsp ; g_uintptr_t alloced, maxmem ; ghnode *freeghnodes ; int okaytogc ; g_uintptr_t totalthings ; ghnode *ghnodeblocks ; bigint population ; bigint setincrement ; bigint pow2step ; // greatest power of two in increment int nonpow2 ; // increment / pow2step int ngens ; // log2(pow2step) int popValid, needPop, inGC ; /* * When rendering we store the relevant bits here rather than * passing them deep into recursive subroutines. */ liferender *renderer ; viewport *view ; int uviewh, uvieww, viewh, vieww, mag, pmag ; int llbits, llsize ; char *llxb, *llyb ; int hashed ; int cacheinvalid ; g_uintptr_t cellcounter ; // used when writing g_uintptr_t writecells ; // how many to write int gccount ; // how many gcs total this pattern int gcstep ; // how many gcs this step static char statusline[] ; // void resize() ; ghnode *find_ghnode(ghnode *nw, ghnode *ne, ghnode *sw, ghnode *se) ; void unhash_ghnode(ghnode *n) ; void rehash_ghnode(ghnode *n) ; ghleaf *find_ghleaf(state nw, state ne, state sw, state se) ; ghnode *getres(ghnode *n, int depth) ; ghnode *dorecurs(ghnode *n, ghnode *ne, ghnode *t, ghnode *e, int depth) ; ghnode *dorecurs_half(ghnode *n, ghnode *ne, ghnode *t, ghnode *e, int depth) ; ghleaf *dorecurs_ghleaf(ghleaf *n, ghleaf *ne, ghleaf *t, ghleaf *e) ; ghnode *newghnode() ; ghleaf *newghleaf() ; ghnode *newclearedghnode() ; ghleaf *newclearedghleaf() ; void pushroot_1() ; int ghnode_depth(ghnode *n) ; ghnode *zeroghnode(int depth) ; ghnode *pushroot(ghnode *n) ; ghnode *setbit(ghnode *n, int x, int y, int newstate, int depth) ; int getbit(ghnode *n, int x, int y, int depth) ; int nextbit(ghnode *n, int x, int y, int depth, int &v) ; ghnode *hashpattern(ghnode *root, int depth) ; ghnode *popzeros(ghnode *n) ; const bigint &calcpop(ghnode *root, int depth) ; void aftercalcpop2(ghnode *root, int depth, int cleanbigints) ; void calcPopulation(ghnode *root) ; ghnode *save(ghnode *n) ; void pop(int n) ; void clearstack() ; void clearcache() ; void gc_mark(ghnode *root, int invalidate) ; void do_gc(int invalidate) ; void clearcache(ghnode *n, int depth, int clearto) ; void new_ngens(int newval) ; int log2(unsigned int n) ; ghnode *runpattern() ; void clearrect(int x, int y, int w, int h) ; void renderbm(int x, int y) ; void fill_ll(int d) ; void drawghnode(ghnode *n, int llx, int lly, int depth, ghnode *z) ; void ensure_hashed() ; g_uintptr_t writecell(std::ostream &os, ghnode *root, int depth) ; g_uintptr_t writecell_2p1(ghnode *root, int depth) ; g_uintptr_t writecell_2p2(std::ostream &os, ghnode *root, int depth) ; void drawpixel(int x, int y); void draw4x4_1(state sw, state se, state nw, state ne, int llx, int lly) ; void draw4x4_1(ghnode *n, ghnode *z, int llx, int lly) ; // AKT: set all pixels to background color void killpixels(); } ; #endif golly-2.5-src/gollybase/hlifealgo.h0000644000175100001440000003204112156145314014277 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef HLIFEALGO_H #define HLIFEALGO_H #include "lifealgo.h" #include "liferules.h" /* * Into instances of this node structure is where almost all of the * memory allocated by this program goes. Thus, it is imperative we * keep it as small as possible so we can explore patterns as large * and as deep as possible. * * But first, how does this program even work? Well, there are * two major tricks that are used. * * The first trick is to represent the 2D space `symbolically' * (in the sense that a binary decision diagram is a symbolic * representation of a boolean predicate). This can be thought * of as a sort of compression. We break up space into a grid of * squares, each containing 8x8 cells. And we `canonicalize' * each square; that is, all the squares with no cells set are * represented by a single actual instance of an empty square; * all squares with only the upper-left-most cell set are * represented by yet another instance, and so on. A single pointer * to the single instance of each square takes less space than * representing the actual cell bits themselves. * * Where do we store these pointers? At first, one might envision * a large two-dimensional array of pointers, each one pointing * to one of the square instances. But instead, we group the * squares (we'll call them 8-squares) into larger squares 16 * cells on a side; these are 16-squares. Each 16-square contains * four 8-squares, so each 16-square is represented by four * pointers, each to an 8-square. And we canonicalize these as * well, so for a particular set of values for a 16 by 16 array * of cells, we'll only have a single 16-square. * * And so on up; we canonicalize 32-squares out of 16-squares, and * on up to some limit. Now the limit need not be very large; * having just 20 levels of nodes gives us a universe that is * 4 * 2**20 or about 4M cells on a side. Having 100 levels of * nodes (easily within the limits of this program) gives us a * universe that is 4 * 2**100 or about 5E30 cells on a side. * I've run universes that expand well beyond 1E50 on a side with * this program. * * [A nice thing about this representation is that there are no * coordinate values anywhere, which means that there are no * limits to the coordinate values or complex multidimensional * arithmetic needed.] * * [Note that this structure so far is very similar to the octtrees * used in 3D simulation and rendering programs. It's different, * however, in that we canonicalize the nodes, and also, of course, * in that it is 2D rather than 3D.] * * I mentioned there were two tricks, and that's only the first. * The second trick is to cache the `results' of the LIFE calculation, * but in a way that looks ahead farther in time as you go higher * in the tree, much like the tree nodes themselves scan larger * distances in space. This trick is just a little subtle, but it * is where the bulk of the power of the program comes from. * * Consider once again the 8-squares. We want to cache the result * of executing LIFE on that area. We could cache the result of * looking ahead just one generation; that would yield a 6x6 square. * (Note that we cannot calculate an 8-square, because we are * using the single instance of the 8-square to represent all the * different places that 8x8 arrangement occurs, and those different * places might be surrounded by different border cells. But we * can say for sure that the central 6-square will evolve in a * unique way in the next generation.) * * We could also calculate the 4-square that is two generations * hence, and the 3-square that is three generations hence, and * the 2-square that is four generations hence. We choose the * 4-square that is two generations hence; why will be clear in * a moment. * * Now let's consider the 16-square. We would like to look farther * ahead for this square (if we always only looked two generations * ahead, our runtime would be at *least* linear in the number of * generations, and we want to beat that.) So let's look 4 generations * ahead, and cache the resulting 8-square. So we do. * * Where do we cache the results? Well, we cache the results in the * same node structure we are using to store the pointers to the * smaller squares themselves. And since we're hashing them all * together, we want a next pointer for the hash chain. Put all of * this together, and you get the following structure for the 16-squares * and larger: */ struct node { node *next ; /* hash link */ node *nw, *ne, *sw, *se ; /* constant; nw != 0 means nonleaf */ node *res ; /* cache */ } ; /* * For the 8-squares, we do not have `children', we have actual data * values. We still break up the 8-square into 4-squares, but the * 4-squares only have 16 cells in them, so we represent them directly * by an unsigned short (in this case, the direct value itself takes * less memory than the pointer we might replace it with). * * One minor trick about the following structure. We did lie above * somewhat; sometimes the struct node * points to an actual struct * node, and sometimes it points to a struct leaf. So we need a way * to tell if the thing we are pointing at is a node or a leaf. We * could add another bit to the node structure, but this would grow * it, and we want it to stay as small as possible. Now, notice * that, in all valid struct nodes, all four pointers (nw, ne, sw, * and se) must contain a live non-zero value. We simply ensure * that the struct leaf contains a zero where the first (nw) pointer * field would be in a struct node. * * Each short represents a 4-square in normal, left-to-right then top-down * order from the most significant bit. So bit 0x8000 is the upper * left (or northwest) bit, and bit 0x1000 is the upper right bit, and * so on. */ struct leaf { node *next ; /* hash link */ node *isnode ; /* must always be zero for leaves */ unsigned short nw, ne, sw, se ; /* constant */ unsigned short res1, res2 ; /* constant */ unsigned short leafpop ; /* how many set bits */ } ; /* * If it is a struct node, this returns a non-zero value, otherwise it * returns a zero value. */ #define is_node(n) (((node *)(n))->nw) /** * Our hlifealgo class. */ class hlifealgo : public lifealgo { public: hlifealgo() ; virtual ~hlifealgo() ; // note that for hlifealgo, clearall() releases no memory; it retains // the full cache information but just sets the current pattern to // the empty pattern. virtual void clearall() ; // not implemented virtual int setcell(int x, int y, int newstate) ; virtual int getcell(int x, int y) ; virtual int nextcell(int x, int y, int &state) ; virtual void endofpattern() ; virtual void setIncrement(bigint inc) ; virtual void setIncrement(int inc) { setIncrement(bigint(inc)) ; } virtual void setGeneration(bigint gen) { generation = gen ; } virtual const bigint &getPopulation() ; virtual int isEmpty() ; virtual int hyperCapable() { return 1 ; } virtual void setMaxMemory(int m) ; virtual int getMaxMemory() { return (int)(maxmem >> 20) ; } virtual const char *setrule(const char *s) ; virtual const char *getrule() { return hliferules.getrule() ; } virtual void step() ; virtual void* getcurrentstate() { return root ; } virtual void setcurrentstate(void *n) ; /* * The contract of draw() is that it render every pixel in the * viewport precisely once. This allows us to eliminate all * flashing. Later we'll make this be damage-specific. */ virtual void draw(viewport &view, liferender &renderer) ; virtual void fit(viewport &view, int force) ; virtual void lowerRightPixel(bigint &x, bigint &y, int mag) ; virtual void findedges(bigint *t, bigint *l, bigint *b, bigint *r) ; virtual const char *readmacrocell(char *line) ; virtual const char *writeNativeFormat(std::ostream &os, char *comments) ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; private: /* * Some globals representing our universe. The root is the * real root of the universe, and the depth is the depth of the * tree where 2 means that root is a leaf, and 3 means that the * children of root are leaves, and so on. The center of the * root is always coordinate position (0,0), so at startup the * x and y coordinates range from -4..3; in general, * -(2**depth)..(2**depth)-1. The zeronodea is an * array of canonical `empty-space' nodes at various depths. * The ngens is an input parameter which is the second power of * the number of generations to run. */ node *root ; int depth ; node **zeronodea ; int nzeros ; /* * Finally, our gc routine. We keep a `stack' of all the `roots' * we want to preserve. Nodes not reachable from here, we allow to * be freed. Same with leaves. */ node **stack ; int stacksize ; g_uintptr_t hashpop, hashlimit, hashprime ; node **hashtab ; int halvesdone ; int gsp ; g_uintptr_t alloced, maxmem ; node *freenodes ; int okaytogc ; g_uintptr_t totalthings ; node *nodeblocks ; char *ruletable ; bigint population ; bigint setincrement ; bigint pow2step ; // greatest power of two in increment int nonpow2 ; // increment / pow2step int ngens ; // log2(pow2step) int popValid, needPop, inGC ; /* * When rendering we store the relevant bits here rather than * passing them deep into recursive subroutines. */ liferender *renderer ; viewport *view ; int uviewh, uvieww, viewh, vieww, mag, pmag ; int llbits, llsize ; char *llxb, *llyb ; int hashed ; int cacheinvalid ; g_uintptr_t cellcounter ; // used when writing g_uintptr_t writecells ; // how many to write int gccount ; // how many gcs total this pattern int gcstep ; // how many gcs this step static char statusline[] ; // void leafres(leaf *n) ; void resize() ; node *find_node(node *nw, node *ne, node *sw, node *se) ; void unhash_node(node *n) ; void rehash_node(node *n) ; leaf *find_leaf(unsigned short nw, unsigned short ne, unsigned short sw, unsigned short se) ; node *getres(node *n, int depth) ; node *dorecurs(node *n, node *ne, node *t, node *e, int depth) ; node *dorecurs_half(node *n, node *ne, node *t, node *e, int depth) ; leaf *dorecurs_leaf(leaf *n, leaf *ne, leaf *t, leaf *e) ; leaf *dorecurs_leaf_half(leaf *n, leaf *ne, leaf *t, leaf *e) ; leaf *dorecurs_leaf_quarter(leaf *n, leaf *ne, leaf *t, leaf *e) ; node *newnode() ; leaf *newleaf() ; node *newclearednode() ; leaf *newclearedleaf() ; void pushroot_1() ; int node_depth(node *n) ; node *zeronode(int depth) ; node *pushroot(node *n) ; node *setbit(node *n, int x, int y, int newstate, int depth) ; int getbit(node *n, int x, int y, int depth) ; int nextbit(node *n, int x, int y, int depth) ; node *hashpattern(node *root, int depth) ; node *popzeros(node *n) ; const bigint &calcpop(node *root, int depth) ; void aftercalcpop2(node *root, int depth, int cleanbigints) ; void calcPopulation(node *root) ; node *save(node *n) ; void pop(int n) ; void clearstack() ; void clearcache() ; void gc_mark(node *root, int invalidate) ; void do_gc(int invalidate) ; void clearcache(node *n, int depth, int clearto) ; void new_ngens(int newval) ; int log2(unsigned int n) ; node *runpattern() ; void clearrect(int x, int y, int w, int h) ; void renderbm(int x, int y) ; void fill_ll(int d) ; void drawnode(node *n, int llx, int lly, int depth, node *z) ; void ensure_hashed() ; g_uintptr_t writecell(std::ostream &os, node *root, int depth) ; g_uintptr_t writecell_2p1(node *root, int depth) ; g_uintptr_t writecell_2p2(std::ostream &os, node *root, int depth) ; void unpack8x8(unsigned short nw, unsigned short ne, unsigned short sw, unsigned short se, unsigned int *top, unsigned int *bot) ; liferules hliferules ; } ; #endif golly-2.5-src/gollybase/jvnalgo.h0000644000175100001440000000302312156145314014003 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef JVNALGO_H #define JVNALGO_H #include "ghashbase.h" /** * Our JvN algo class. */ class jvnalgo : public ghashbase { public: jvnalgo() ; virtual ~jvnalgo() ; virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) ; virtual const char* setrule(const char* s) ; virtual const char* getrule() ; virtual const char* DefaultRule() ; virtual int NumCellStates() ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; private: enum { JvN29, Nobili32, Hutton32 } current_rule ; }; #endif golly-2.5-src/gollybase/lifealgo.h0000644000175100001440000002030312156145314014125 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /** * This is the pure abstract class any life calculation algorithm * must support. As long as a life algorithm implements this * interface, it can be invoked by our driver code. */ #ifndef LIFEALGO_H #define LIFEALGO_H #include "bigint.h" #include "viewport.h" #include "liferender.h" #include "lifepoll.h" #include "readpattern.h" #include "platform.h" #include // moving the include vector *before* platform.h breaks compilation #ifdef _MSC_VER #pragma warning(disable:4702) // disable "unreachable code" warnings from MSVC #endif #include #ifdef _MSC_VER #pragma warning(default:4702) // enable "unreachable code" warnings #endif using std::vector; #include // this must not be increased beyond 32767, because we use a bigint // multiply that only supports multiplicands up to that size. const int MAX_FRAME_COUNT = 32000 ; /** * Timeline support is pretty generic. */ class timeline_t { public: timeline_t() : recording(0), framecount(0), savetimeline(1), start(0), inc(0), next(0), end(0), frames() {} int recording, framecount, base, expo, savetimeline ; bigint start, inc, next, end ; vector frames ; } ; class lifealgo { public: lifealgo() : generation(0), increment(0), timeline(), grid_type(SQUARE_GRID) { poller = &default_poller ; gridwd = gridht = 0 ; // default is an unbounded universe } virtual ~lifealgo() ; virtual void clearall() = 0 ; // returns <0 if error virtual int setcell(int x, int y, int newstate) = 0 ; virtual int getcell(int x, int y) = 0 ; virtual int nextcell(int x, int y, int &v) = 0 ; // call after setcell/clearcell calls virtual void endofpattern() = 0 ; virtual void setIncrement(bigint inc) = 0 ; virtual void setIncrement(int inc) = 0 ; virtual void setGeneration(bigint gen) = 0 ; const bigint &getIncrement() { return increment ; } const bigint &getGeneration() { return generation ; } virtual const bigint &getPopulation() = 0 ; virtual int isEmpty() = 0 ; // can we do the gen count doubling? only hashlife virtual int hyperCapable() = 0 ; virtual void setMaxMemory(int m) = 0 ; // never alloc more than this virtual int getMaxMemory() = 0 ; virtual const char *setrule(const char *) = 0 ; // new rules; returns err msg virtual const char *getrule() = 0 ; // get current rule set virtual void step() = 0 ; // do inc gens virtual void draw(viewport &view, liferender &renderer) = 0 ; virtual void fit(viewport &view, int force) = 0 ; virtual void findedges(bigint *t, bigint *l, bigint *b, bigint *r) = 0 ; virtual void lowerRightPixel(bigint &x, bigint &y, int mag) = 0 ; virtual const char *writeNativeFormat(std::ostream &os, char *comments) = 0 ; void setpoll(lifepoll *pollerarg) { poller = pollerarg ; } virtual const char *readmacrocell(char *) { return "Cannot read macrocell format." ; } // Verbosity crosses algorithms. We need to embed this sort of option // into some global shared thing or something rather than use static. static void setVerbose(int v) { verbose = v ; } static int getVerbose() { return verbose ; } virtual const char* DefaultRule() { return "B3/S23"; } // return number of cell states in this universe (2..256) virtual int NumCellStates() { return 2; } // timeline support virtual void* getcurrentstate() = 0 ; virtual void setcurrentstate(void *) = 0 ; int startrecording(int base, int expo) ; pair stoprecording() ; pair getbaseexpo() { return make_pair(timeline.base, timeline.expo) ; } void extendtimeline() ; void pruneframes() ; const bigint &gettimelinestart() { return timeline.start ; } const bigint &gettimelineend() { return timeline.end ; } const bigint &gettimelineinc() { return timeline.inc ; } const int getframecount() { return timeline.framecount ; } const int isrecording() { return timeline.recording ; } int gotoframe(int i) ; void destroytimeline() ; void savetimelinewithframe(int yesno) { timeline.savetimeline = yesno ; } // support for a bounded universe with various topologies: // plane, cylinder, torus, Klein bottle, cross-surface, sphere unsigned int gridwd, gridht ; // bounded universe if either is > 0 bigint gridleft, gridright ; // undefined if gridwd is 0 bigint gridtop, gridbottom ; // undefined if gridht is 0 bool boundedplane ; // topology is a bounded plane? bool sphere ; // topology is a sphere? bool htwist, vtwist ; // Klein bottle if either is true, // or cross-surface if both are true int hshift, vshift ; // torus with horizontal or vertical shift const char* setgridsize(const char* suffix) ; // use in setrule() to parse a suffix like ":T100,200" and set // the above parameters const char* canonicalsuffix() ; // use in setrule() to return the canonical version of suffix; // eg. ":t0020" would be converted to ":T20,0" enum TGridType { SQUARE_GRID, TRI_GRID, HEX_GRID, VN_GRID } ; TGridType getgridtype() const { return grid_type ; } protected: lifepoll *poller ; static int verbose ; int maxCellStates ; // keep up to date; setcell depends on it bigint generation ; bigint increment ; timeline_t timeline ; TGridType grid_type ; } ; /** * If you need any static information from a lifealgo, this class can be * called (or overridden) to set up all that data. Right now the * functions do nothing; override if you need that info. These are * called one by one by a static method in the algorithm itself, * if that information is available. The ones marked optional need * not be called. */ class staticAlgoInfo { public: staticAlgoInfo() ; virtual ~staticAlgoInfo() { } ; // mandatory void setAlgorithmName(const char *s) { algoName = s ; } void setAlgorithmCreator(lifealgo *(*f)()) { creator = f ; } // optional; override if you want to retain this data virtual void setDefaultBaseStep(int) {} virtual void setDefaultMaxMem(int) {} // minimum and maximum number of cell states supported by this algorithm; // both must be within 2..256 int minstates; int maxstates; // default color scheme bool defgradient; // use color gradient? unsigned char defr1, defg1, defb1; // color at start of gradient unsigned char defr2, defg2, defb2; // color at end of gradient // if defgradient is false then use these colors for each cell state unsigned char defr[256], defg[256], defb[256]; // default icon data (in XPM format) const char **defxpm7x7; // 7x7 icons const char **defxpm15x15; // 15x15 icons const char **defxpm31x31; // 31x31 icons // basic data const char *algoName ; lifealgo *(*creator)() ; int id ; // my index staticAlgoInfo *next ; // support: give me sequential algorithm IDs static int getNumAlgos() { return nextAlgoId ; } static int nextAlgoId ; static staticAlgoInfo &tick() ; static staticAlgoInfo *head ; static staticAlgoInfo *byName(const char *s) ; static int nameToIndex(const char *s) ; } ; #endif golly-2.5-src/gollybase/lifepoll.h0000755000175100001440000000777412156145314014175 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /** * This interface is called every so often by lifealgo routines to * make sure events are processed and the screen is redrawn in a * timely manner. The default class does nothing (no actual * callbacks); the user of this class should override checkevents() * to do the right thing. */ #ifndef LIFEPOLL_H #define LIFEPOLL_H /** * How frequently to invoke the heavyweight event checker, as a * count of inner-loop polls. */ const int POLLINTERVAL = 1000 ; class lifepoll { public: lifepoll() ; /** * This is what should be overridden; it should check events, * and return 0 if all is okay or 1 if the existing calculation * should be interrupted. */ virtual int checkevents() ; /** * Was an interrupt requested? */ int isInterrupted() { return interrupted ; } /** * Before a calculation begins, call this to reset the * interrupted flag. */ void resetInterrupted() { interrupted = 0 ; } /** * Call this to stop the current calculation. */ void setInterrupted() { interrupted = 1 ; } /** * This is the routine called by the life algorithms at various * points. It calls checkevents() and stashes the result. * * This routine may happen to go in the inner loop where it * could be called a million times a second or more. Checking * for events might be a moderately heavyweight operation that * could take microseconds, significantly slowing down the * calculation. To solve this, we use a countdown variable * and only actually check when the countdown gets low * enough (and we put it inline). We assume a derating of * 1000 is sufficient to alleviate the slowdown without * significantly impacting event response time. Even so, the * poll positions should be carefully selected to be *not* * millions of times a second. */ inline int poll() { return (countdown-- > 0) ? interrupted : inner_poll() ; } int inner_poll() ; /** * Sometimes we do a lengthy operation that we *don't* poll * during. After such operations, this function resets the * poll countdown back to zero so we get very quick response. */ void reset_countdown() { countdown = 0 ; } /** * Some routines should not be called during a poll() such as ones * that would modify the state of the algorithm process. Some * can be safely called but should be deferred. This routine lets * us know if we are called from the callback or not. */ int isCalculating() { return calculating ; } void bailIfCalculating() ; /** * Sometimes getPopulation is called when hashlife is in a state * where we just can't calculate it at that point in time. So * hashlife remembers that the population was requested, and * when the GC is finished, calcs the pop and executes this * callback to update the status window. */ virtual void updatePop() ; private: int interrupted ; int calculating ; int countdown ; } ; extern lifepoll default_poller ; #endif golly-2.5-src/gollybase/liferender.h0000644000175100001440000000522512156145314014470 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /** * Encapsulate a class capable of rendering a life universe. * Note that we only use fill rectangle calls and blitbit calls * (no setpixel). Coordinates are in the same coordinate * system as the viewport min/max values. * * Also note that the render is responsible for deciding how * to scale bits up as necessary, whether using the graphics * hardware or the CPU. Blits will only be called with * reasonable bitmaps (32x32 or larger, probably) so the * overhead should not be horrible. Also, the bitmap must * have zeros for all pixels to the left and right of those * requested to be rendered (just for simplicity). * * If clipping is needed, it's the responsibility of these * routines, *not* the caller (although the caller should make * every effort to not call these routines with out of bound * values). */ #ifndef LIFERENDER_H #define LIFERENDER_H class liferender { public: liferender() {} virtual ~liferender() ; // killrect is used to draw background (ie. dead cells) virtual void killrect(int x, int y, int w, int h) = 0 ; // pixblit is used to draw a pixel map by passing data in two formats: // If pmscale == 1 then pm data contains 3*w*h bytes where each // byte triplet contains the rgb values for the corresponding pixel. // If pmscale > 1 then pm data contains (w/pmscale)*(h/pmscale) bytes // where each byte is a cell state (0..255). This allows the rendering // code to display either icons or colors. virtual void pixblit(int x, int y, int w, int h, char* pm, int pmscale) = 0 ; // drawing code needs access to current layer's colors virtual void getcolors(unsigned char** r, unsigned char** g, unsigned char** b) = 0; } ; #endif golly-2.5-src/gollybase/liferules.h0000644000175100001440000000577112156145314014351 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /** * This class implements the rules supported by QuickLife and HashLife. * A rule lookup table is used for computing a new 2x2 grid from * a provided 4x4 grid (two tables are used to emulate B0-not-Smax rules). * The input is a 16-bit integer, with the most significant bit the * upper left corner, bits going horizontally and then down. The output * is a 6-bit integer, with the top two bits indicating the top row of * the 2x2 output grid and the least significant two bits indicating the * bottom row. The middle two bits are always zero. */ #ifndef LIFERULES_H #define LIFERULES_H #include "lifealgo.h" const int MAXRULESIZE = 200 ; class liferules { public: liferules() ; ~liferules() ; // string returned by setrule is any error const char *setrule(const char *s, lifealgo *algo) ; const char *getrule() ; // AKT: we need 2 tables to support B0-not-Smax rule emulation // where max is 8, 6 or 4 depending on the neighborhood char rule0[65536]; // rule table for even gens if rule has B0 but not Smax, // or for all gens if rule has no B0, or it has B0 *and* Smax char rule1[65536]; // rule table for odd gens if rule has B0 but not Smax bool alternate_rules; // set by setrule; true if rule has B0 but not Smax // AKT: support for various neighborhoods enum neighborhood_masks { MOORE = 0x777, // all 8 neighbors HEXAGONAL = 0x673, // ignore NE and SW neighbors VON_NEUMANN = 0x272 // 4 orthogonal neighbors } ; bool isRegularLife() ; // is this B3/S23? bool isHexagonal() const { return neighbormask == HEXAGONAL ; } bool isVonNeumann() const { return neighbormask == VON_NEUMANN ; } bool isWolfram() const { return wolfram >= 0 ; } private: void initruletable(char *rptr, int rulebits, int nmask, int wolfram) ; // canonical version of valid rule passed into setrule char canonrule[MAXRULESIZE] ; neighborhood_masks neighbormask ; int rulebits ; int wolfram ; // >= 0 if Wn rule (n is even and <= 254) } ; #endif golly-2.5-src/gollybase/platform.h0000644000175100001440000000443612156145314014200 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /** * This file holds things that are platform-dependent such as * dependencies on 64-bitness, help for when the platform does not * have inttypes.h, and things like that. * * We need to convert pointers to integers and back for two * reasons. First, hlife structures use the address of a node * as its label, and we need to hash these labels. Secondly, * we use bit tricks for garbage collection and need to set and * clear low-order bits in a pointer. Normally the typedef * below is all we need, but if your platform doesn't have * uintptr_t you can change that here. We also need this type * for anything that might hold the *count* of nodes, since * this might be larger than an int. If inttypes does not * exist, and you're compiling for a 64-bit platform, you may * need to make some changes here. */ #include #if defined(_WIN64) #define PRIuPTR "I64u" typedef uintptr_t g_uintptr_t ; #define G_MAX SIZE_MAX #define GOLLY64BIT (1) #elif defined(__LP64__) || defined(__amd64__) #define __STDC_FORMAT_MACROS #define __STDC_LIMIT_MACROS #include #include typedef uintptr_t g_uintptr_t ; #define G_MAX SIZE_MAX #define GOLLY64BIT (1) #else #define PRIuPTR "u" typedef unsigned int g_uintptr_t ; #define G_MAX UINT_MAX #undef GOLLY64BIT #endif golly-2.5-src/gollybase/qlifealgo.h0000644000175100001440000003153312156145314014315 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /** * This is the fast "conventional" life algorithm code. */ #ifndef QLIFEALGO_H #define QLIFEALGO_H #include "lifealgo.h" #include "liferules.h" #include /* * The smallest unit of the universe is the `slice', which is a * 4 (horizontal) by 8 (vertical) chunk of the world. Each slice * is stored in a 32-bit word. The most significant bit of the * word is the upper left bit; the remaining bits go across * horizontally then down vertically. * * We always recompute in units of a slice. This is smaller than the * 8x8 in some programs, and in this particular case adds to the * efficiency. * * This arrangment of bits was selected to minimize the bit * twiddling needed for lookup; in general, we use a lookup table * that takes a 4x4 current-generation and figures out the values * of the inner 2x2 cells. * * A `brick' is composed of eight slices for the even generation and * eight slices for the odd generation. This is a total of 16 * 32-bit words. The slices are concatenated horizontally so each * brick contains two generations of a 32x8 section of the universe. * * No other data is stored directly into the bricks; various flags are * stored in the next level up. We try and minimize the size of the * data for a given universe so that we can minimize the number of * data cache misses and TLB misses. For almost all universes, the * bulk of the allocated data is in these 64-byte bricks. * * We use a stagger-step type algorithm to minimize the number of * neighbors that need to be examined (thanks, Alan!) for each slice. * Thus, a brick that holds (0,0)-(31,7) for the even generation would * hold (1,1)-(32,8) in the odd generations. */ struct brick { /* 64 bytes */ unsigned int d[16] ; } ; /* * A tile contains the flags for four bricks, and pointers to the bricks * themselves. These pointers are never null; if the portion of the * universe is completely empty, they point to a unique allocated * `emptybrick'. This means that we do not need to check if the pointers * are null; we can simply always dereference and get valid data. Thus, * each tile corresponds to a 32x32 section of the universe. * * The c flags indicate that, in the previous computation, * the data was found to change in some slice or * subslice. The least significant bit in each c01 flag corresponds * to the last (8th) slice for phase 0->1, and to the first slice for * phase 1->0. * * There are ten valid bits in c flags 1-4, one for each slice, * one most significant one that indicates that the rightmost (leftmost) * two columns of the first (eighth) slice changed in phase 0->1 (1->0) * (and thus, the next brick to the left (right) needs to be recomputed). * The tenth bit is just the ninth bit from the previous generation. * * For c flags 0 and 5, we only have the first nine bits as above. * * We need six flags; four for the slices themselves, and one indicating * that the top two rows of a particular slice has changed, and thus * the next brick up needs to be recomputed, and one indicating that the * bottom two rows of a particular slice has changed. * * In all cases, tiles only contain data about what has happened completely * within their borders; indicating that the next slice over needs to be * recomputed is handled by always inspecting the neighboring slices * *before* a recomputation. * * The flags int is divided into two 12-bit fields, each holding a population * count, and one eight-bit field, holding dirty flags. * * Note that tiles only point `down' to bricks, never to each other or to * higher-level supertiles. * * Tiles are numbered as level `0' of the universe tree. * * The tiles are 32 bytes each; they can hold up to four bricks, so the * memory consumption of the tiles tends to be small. */ struct tile { /* 32 bytes */ struct brick *b[4] ; short c[6] ; long flags ; } ; /* * Supertiles hold pointers to eight subtiles, which can either be * tiles or supertiles themselves. Supertiles are numbered as levels `1' on * up of the universe tree. * * Odd levels stack their subtiles horizontally; even levels stack their * subtiles vertically. Thus, each supertile at level 1 corresponds to * a 256x32 section of the universe. Each supertile at level 2 corresponds * to a 256x256 section of the universe. And so on. * * Levels are never skipped (that is, each pointer in a supertile at * level `n' points to a valid supertile or tile at level `n-1'). * * The c flag indicates that changes have happened in the subtiles. * The least significant eight bits indicate that changes have occurred * anywhere in the subtile; the least significant bit (bit 0) is associated * with the first subtile for phase 0->1 and the eighth subtile for phase * 1->0, and bit 7 is associated with other. Bit number 8 indicates that * some bits on the right (left) edge of the eighth (first) subtile have * changed for phase 0->1 (1->0). Bits numbered 9 through 16 indicate that * bits on the bottom (top) of the corresponding subtile have changed, and * bit number 17 indicates that a bit in the lower right (upper left) corner * of the eighth (first) subtile has changed. * * Bit 18 through 27 correspond to the previous generation's bits 8 through * 17. Bits 28 through 31 are the dirty bits; we currently use three of * them. * * The above description corresponds to odd levels. For even levels, * since tiles are stacked vertically instead of horizontally, change * `lower' to `right' and `right' to `lower'. * * The dirty flags again are used to indicate that this tile needed to * be recomputed since the last time the dirty bit was cleared. * * The two pop values hold a population count, if the appropriate dirty * bit is clear. These counts will never hold values greater than * 500M, so that a sum of the eight in unsigned arithmetic is guaranteed * to never overflow. * * This completes the universe data structures. Note that there is no * limit (other than the size of a pointer and memory constraints) on * the size of the universe. For instance, using these data structures * we can easily build a universe with elements separated by 2^200 * pixels. * * The supertiles are 44 bytes each; they correspond to at least a * 256x32 chunk of the universe, so the total memory consumption due to * supertiles tends to be small. */ struct supertile { /* 44 bytes */ struct supertile *d[8] ; int flags ; int pop[2] ; } ; /* * This is a common header for chunks of memory linked together. */ struct linkedmem { struct linkedmem *next ; } ; /* * This structure contains all of our variables that pertain to a * particular universe. (Thus, we support multiple universes.) * * The minx, miny, maxx, and maxy values describe the borders of * the universe dictated by the level of the root supertile. If * ever during computation these bounds are found to be too tight, * another supertile is added on top of the root, expanding these * bounds. * * These bounds currently limit the size of the universe to 2^32 in * each direction; however, they are only used during the set call * (when initially setting up the universe). Changing them to * doubles or 64-bit ints will relax this limitation. For now we * leave them as is. * * The rootlev variable contains the supertile level of the root node. * * The tilelist, supertilelist, and bricklist are freelists for the * appropriate type of structure. * * The memused is a linked list of all memory blocks allocated; this * enables us to free the universe and all of its memory without actually * walking the entire life tree. * * The emptybrick pointer points to the unique brick that is guaranteed * to always be empty. The emptytile pointer is similar. * * Finally, root is the top of the current life tree. Nullroot is the * topmost empty supertile allocated, and nullroots[] holds the empty * supertiles at each level. Setting this to 40 limits the number of * levels to 40, which is sufficient for a 2^65x2^62 universe. */ class qlifealgo : public lifealgo { public: qlifealgo() ; virtual ~qlifealgo() ; virtual void clearall() ; virtual int setcell(int x, int y, int newstate) ; virtual int getcell(int x, int y) ; virtual int nextcell(int x, int y, int &v) ; // call after setcell/clearcell calls virtual void endofpattern() { // AKT: unnecessary (and prevents shrinking selection while generating) // poller->bailIfCalculating() ; popValid = 0 ; } virtual void setIncrement(bigint inc) { increment = inc ; } virtual void setIncrement(int inc) { increment = inc ; } virtual void setGeneration(bigint gen) { generation = gen ; } virtual const bigint &getPopulation() ; virtual int isEmpty() ; // can we do the gen count doubling? only hashlife virtual int hyperCapable() { return 0 ; } virtual void setMaxMemory(int m) ; virtual int getMaxMemory() { return (int)(maxmemory >> 20) ; } virtual const char *setrule(const char *s) ; virtual const char *getrule() { return qliferules.getrule() ; } virtual void step() ; virtual void* getcurrentstate() { return 0 ; } virtual void setcurrentstate(void *) {} virtual void draw(viewport &view, liferender &renderer) ; virtual void fit(viewport &view, int force) ; virtual void lowerRightPixel(bigint &x, bigint &y, int mag) ; virtual void findedges(bigint *t, bigint *l, bigint *b, bigint *r) ; virtual const char *writeNativeFormat(std::ostream &, char *) { return "No native format for qlifealgo yet." ; } static void doInitializeAlgoInfo(staticAlgoInfo &) ; private: linkedmem *filllist(int size) ; brick *newbrick() ; tile *newtile() ; supertile *newsupertile(int lev) ; void uproot() ; int doquad01(supertile *zis, supertile *edge, supertile *par, supertile *cor, int lev) ; int doquad10(supertile *zis, supertile *edge, supertile *par, supertile *cor, int lev) ; int p01(tile *p, tile *pr, tile *pd, tile *prd) ; int p10(tile *plu, tile *pu, tile *pl, tile *p) ; G_INT64 find_set_bits(supertile *p, int lev, int gm1) ; int isEmpty(supertile *p, int lev, int gm1) ; supertile *mdelete(supertile *p, int lev) ; G_INT64 popcount() ; int uproot_needed() ; void dogen() ; void renderbm(int x, int y) ; void renderbm(int x, int y, int xsize, int ysize) ; void BlitCells(supertile *p, int xoff, int yoff, int wd, int ht, int lev) ; void ShrinkCells(supertile *p, int xoff, int yoff, int wd, int ht, int lev) ; void clearrect(int minx, int miny, int w, int h) ; int nextcell(int x, int y, supertile *n, int lev) ; void drawshpixel(int x, int y) ; void fill_ll(int d) ; int lowsub(vector &src, vector &dst, int lev) ; int highsub(vector &src, vector &dst, int lev) ; void allsub(vector &src, vector &dst, int lev) ; int gethbitsfromleaves(vector v) ; int getvbitsfromleaves(vector v) ; int markglobalchange(supertile *, int) ; void markglobalchange() ; // call if the rule changes /* data elements */ int min, max, rootlev ; int minlow32 ; bigint bmin, bmax ; bigint population ; int popValid ; linkedmem *tilelist, *supertilelist, *bricklist ; linkedmem *memused ; brick *emptybrick ; tile *emptytile ; supertile *root, *nullroot, *nullroots[40] ; int cleandowncounter ; g_uintptr_t maxmemory, usedmemory ; char *ruletable ; // when drawing, these are used liferender *renderer ; viewport *view ; int uviewh, uvieww, viewh, vieww, mag, pmag, kadd ; int oddgen ; int bmleft, bmtop, bmlev, shbmsize, logshbmsize ; int quickb, deltaforward ; int llbits, llsize ; char *llxb, *llyb ; liferules qliferules ; } ; #endif golly-2.5-src/gollybase/readpattern.h0000644000175100001440000000341112156145314014655 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef READPATTERN_H #define READPATTERN_H #include "bigint.h" class lifealgo ; /* * Read pattern file into given life algorithm implementation. */ const char *readpattern(const char *filename, lifealgo &imp) ; /* * Get next line from current pattern file. */ char *getline(char *line, int maxlinelen) ; /* * Similar to readpattern but we return the pattern edges * (not necessarily the minimal bounding box; eg. if an * RLE pattern is empty or has empty borders). */ const char *readclipboard(const char *filename, lifealgo &imp, bigint *t, bigint *l, bigint *b, bigint *r) ; /* * Extract comments from pattern file and store in given buffer. * It is the caller's job to free commptr when done (if not NULL). */ const char *readcomments(const char *filename, char **commptr) ; #endif golly-2.5-src/gollybase/ruleloaderalgo.h0000644000175100001440000000363712156145314015357 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef RULELOADERALGO_H #define RULELOADERALGO_H #include "ghashbase.h" #include "ruletable_algo.h" #include "ruletreealgo.h" /** * This algorithm loads rule data from external files. */ class ruleloaderalgo : public ghashbase { public: ruleloaderalgo(); virtual ~ruleloaderalgo(); virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se); virtual const char* setrule(const char* s); virtual const char* getrule(); virtual const char* DefaultRule(); virtual int NumCellStates(); static void doInitializeAlgoInfo(staticAlgoInfo &); protected: ruletable_algo* LocalRuleTable; // local instance of RuleTable algo ruletreealgo* LocalRuleTree; // local instance of RuleTree algo enum RuleTypes {TABLE, TREE} rule_type; void SetAlgoVariables(RuleTypes ruletype); const char* LoadTableOrTree(FILE* rulefile, const char* rule); }; #endif golly-2.5-src/gollybase/ruletable_algo.h0000644000175100001440000000540712156145314015334 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef RULETABLE_ALGO_H #define RULETABLE_ALGO_H #include "ghashbase.h" #include #include #include /** * An algo that takes a rule table. */ class ruletable_algo : public ghashbase { public: ruletable_algo() ; virtual ~ruletable_algo() ; virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) ; virtual const char* setrule(const char* s) ; virtual const char* getrule() ; virtual const char* DefaultRule() ; virtual int NumCellStates() ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; // these two methods are needed for RuleLoader algo bool IsDefaultRule(const char* rulename); const char* LoadTable(FILE* rulefile, int lineno, char endchar, const char* s); protected: std::string LoadRuleTable(std::string filename); void PackTransitions(const std::string& symmetries, int n_inputs, const std::vector< std::pair< std::vector< std::vector >, state> > & transition_table); void PackTransition(const std::vector< std::vector > & inputs, state output); protected: std::string current_rule; unsigned int n_states; enum TNeighborhood { vonNeumann, Moore, hexagonal, oneDimensional } neighborhood; static const int N_SUPPORTED_NEIGHBORHOODS = 4; static const std::string neighborhood_value_keywords[N_SUPPORTED_NEIGHBORHOODS]; // we use a lookup table to match inputs to outputs: typedef unsigned long long int TBits; // we can use unsigned int if we hit portability issues (not much slower) std::vector< std::vector< std::vector > > lut; // TBits lut[neighbourhood_size][n_states][n_compressed_rules]; unsigned int n_compressed_rules; std::vector output; // state output[n_rules]; }; #endif golly-2.5-src/gollybase/ruletreealgo.h0000644000175100001440000000347012156145314015043 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef RULETREEALGO_H #define RULETREEALGO_H #include "ghashbase.h" /** * An algorithm that uses an n-dary decision diagram. */ class ruletreealgo : public ghashbase { public: ruletreealgo() ; virtual ~ruletreealgo() ; virtual state slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) ; virtual const char* setrule(const char* s) ; virtual const char* getrule() ; virtual const char* DefaultRule() ; virtual int NumCellStates() ; static void doInitializeAlgoInfo(staticAlgoInfo &) ; // these two methods are needed for RuleLoader algo bool IsDefaultRule(const char* rulename); const char* LoadTree(FILE* rulefile, int lineno, char endchar, const char* s); private: int *a, base ; state *b ; int num_neighbors, num_states, num_nodes ; char rule[MAXRULESIZE] ; }; #endif golly-2.5-src/gollybase/util.h0000644000175100001440000000441412156145314013325 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /** * Basic utility classes for things like fatal errors. */ #ifndef UTIL_H #define UTIL_H #include // for FILE * void lifefatal(const char *s) ; void lifewarning(const char *s) ; void lifestatus(const char *s) ; void lifebeginprogress(const char *dlgtitle) ; bool lifeabortprogress(double fracdone, const char *newmsg) ; void lifeendprogress() ; const char *lifegetuserrules() ; const char *lifegetrulesdir() ; bool isaborted() ; FILE *getdebugfile() ; /** * Sick of line ending woes. This class takes care of this for us. */ class linereader { public: linereader(FILE *f) ; char *fgets(char *buf, int maxlen) ; void setfile(FILE *f) ; void setcloseonfree() ; int close() ; ~linereader() ; private: int lastchar ; int closeonfree ; FILE *fp ; } ; /** * To substitute your own routines, use the following class. */ class lifeerrors { public: virtual void fatal(const char *s) = 0 ; virtual void warning(const char *s) = 0 ; virtual void status(const char *s) = 0 ; virtual void beginprogress(const char *dlgtitle) = 0 ; virtual bool abortprogress(double fracdone, const char *newmsg) = 0 ; virtual void endprogress() = 0 ; virtual const char *getuserrules() = 0 ; virtual const char *getrulesdir() = 0 ; static void seterrorhandler(lifeerrors *obj) ; bool aborted ; } ; #endif golly-2.5-src/gollybase/viewport.h0000644000175100001440000000570212156145314014230 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef VIEWPORT_H #define VIEWPORT_H #include "bigint.h" #include using std::pair; using std::make_pair; class lifealgo ; /** * This class holds information on where in space the user's window is. * It provides the functions to zoom, unzoom, move, etc. * * The reason we need a whole class is because doing this in a universe * that may be billions of billions of cells on a side, but we still * want single cell precision, is a bit tricky. * * This class is not finished yet; I still need to be more precise about * cases where mag>0 and precisely what will be displayed in this case * and precisely how the coordinate transformations will occur. */ class viewport { public: viewport(int width, int height) { init() ; resize(width, height) ; } void zoom() ; void zoom(int x, int y) ; void unzoom() ; void unzoom(int x, int y) ; void center() ; pair at(int x, int y) ; pair atf(int x, int y) ; pair screenPosOf(bigint x, bigint y, lifealgo *algo) ; void resize(int newwidth, int newheight) ; void move(int dx, int dy) ; // dx and dy are given in pixels int getmag() const { return mag ; } void setmag(int magarg) { mag = magarg ; reposition() ; } void setpositionmag(const bigint &xarg, const bigint &yarg, int magarg) ; int getwidth() const { return width ; } int getheight() const { return height ; } int getxmax() const { return width-1 ; } int getymax() const { return height-1 ; } int contains(const bigint &x, const bigint &y) ; bigint x, y ; // cell at center of viewport private: void init() ; void reposition() ; // recalculate *0* and *m* values int width, height ; int mag ; // plus is zoom in; neg is zoom out bigint x0, y0 ; double x0f, y0f ; double xymf ; // always = 2**-mag } ; extern int MAX_MAG; // maximum cell size is 2^MAX_MAG (default is 2^4, but mobile devices // will probably want a bigger cell size) #endif golly-2.5-src/gollybase/writepattern.h0000644000175100001440000000317312156145314015101 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef WRITEPATTERN_H #define WRITEPATTERN_H class lifealgo; typedef enum { RLE_format, // run length encoded XRLE_format, // extended RLE MC_format // macrocell (native hashlife format) } pattern_format; typedef enum { no_compression, // write uncompressed data gzip_compression // write gzip compressed data } output_compression; /* * Save current pattern to a file. */ const char *writepattern(const char *filename, lifealgo &imp, pattern_format format, output_compression compression, int top, int left, int bottom, int right); #endif golly-2.5-src/gollybase/bigint.cpp0000644000175100001440000004354012156145314014162 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "bigint.h" #include #include #include #include #include #include "util.h" #undef SLOWCHECK using namespace std ; /** * Static data. */ static const int MAX_SIMPLE = 0x3fffffff ; static const int MIN_SIMPLE = -0x40000000 ; char *bigint::printbuf ; int *bigint::work ; int bigint::printbuflen ; int bigint::workarrlen ; char bigint::sepchar = ',' ; int bigint::sepcount = 3 ; /** * Routines. */ bigint::bigint() { v.i = 1 ; } bigint::bigint(int i) { fromint(i) ; } bigint::bigint(G_INT64 i) { if (i <= INT_MAX && i >= INT_MIN) fromint((int)i) ; else { v.i = 0 ; vectorize(0) ; v.p[0] = 3 ; v.p[1] = (int)(i & 0x7fffffff) ; v.p[2] = (int)((i >> 31) & 0x7fffffff) ; v.p[3] = 0 ; ripple((int)(i >> 62), 3) ; } } // we can parse ####, 2^###, -##### // AKT: we ignore all non-digits (except for leading '-') // so we can parse strings like "1,234" or "+1.234"; // it is up to caller to impose smarter restrictions bigint::bigint(const char *s) { if (*s == '2' && s[1] == '^') { long x = atol(s+2) ; if (x < 31) fromint(1 << x) ; else { int sz = 2 + (x + 1) / 31 ; int asz = sz ; while (asz & (asz - 1)) asz &= asz - 1 ; asz *= 2 ; v.p = new int[asz] ; v.p[0] = sz ; for (int i=1; i<=sz; i++) v.p[i] = 0 ; v.p[sz-1] = 1 << (x % 31) ; } } else { int neg = 0 ; if (*s == '-') { neg = 1 ; s++ ; } fromint(0) ; while (*s) { // AKT: was *s != sepchar if (*s >= '0' && *s <= '9') { mul_smallint(10) ; if (neg) add_smallint('0'-*s) ; else add_smallint(*s-'0') ; } s++ ; } } } static int *copyarr(int *p) { int sz = *p ; while (sz & (sz - 1)) sz &= sz - 1 ; sz *= 2 ; int *r = new int[sz] ; memcpy(r, p, sizeof(int) * (p[0] + 1)) ; #ifdef SLOWCHECK for (int i=p[0]+1; i printbuflen) { if (printbuf) delete [] printbuf ; printbuf = new char[2 * lenreq] ; printbuflen = 2 * lenreq ; } int sz = 1 ; if (0 == (v.i & 1)) sz = size() ; ensurework(sz) ; int neg = sign() < 0 ; if (v.i & 1) { if (neg) work[0] = -(v.i >> 1) ; else work[0] = v.i >> 1 ; } else { if (neg) { int carry = 1 ; for (int i=0; i+1> 31) & 1 ; } work[sz-1] = carry + ~v.p[sz] ; } else { for (int i=0; i=0; i--) { G_INT64 c = carry * G_MAKEINT64(0x80000000) + work[i] ; carry = (int)(c % bigradix) ; work[i] = (int)(c / bigradix) ; allbits |= work[i] ; } for (i=0; i<9; i++) { // put the nine digits in *p++ = (char)(carry % 10 + '0') ; carry /= 10 ; } if (allbits == 0) break ; } while (p > printbuf + 1 && *(p-1) == '0') p-- ; char *r = p ; if (neg) *r++ = '-' ; for (int i=(int)(p-printbuf-1); i>=0; i--) { *r++ = printbuf[i] ; if (i && sep && (i % sepcount == 0)) *r++ = sep ; } *r++ = 0 ; return p ; } void bigint::grow(int osz, int nsz) { int bdiffs = osz ^ nsz ; if (bdiffs > osz) { while (bdiffs & (bdiffs - 1)) bdiffs &= bdiffs - 1 ; int *nv = new int[2*bdiffs] ; for (int i=0; i<=osz; i++) nv[i] = v.p[i] ; #ifdef SLOWCHECK for (int i=osz+1; i<2*bdiffs; i++) nv[i] = 0xdeadbeef ; #endif delete [] v.p ; v.p = nv ; } int av = v.p[osz] ; while (osz < nsz) { v.p[osz] = av & 0x7fffffff ; osz++ ; } v.p[nsz] = av ; v.p[0] = nsz ; } bigint& bigint::operator+=(const bigint &a) { if (a.v.i & 1) add_smallint(a.v.i >> 1) ; else { if (v.i & 1) vectorize(v.i >> 1) ; ripple(a, 0) ; } return *this ; } bigint& bigint::operator-=(const bigint &a) { if (a.v.i & 1) add_smallint(-(a.v.i >> 1)) ; else { if (v.i & 1) vectorize(v.i >> 1) ; ripplesub(a, 1) ; } return *this ; } int bigint::sign() const { int si = v.i ; if (0 == (si & 1)) si = v.p[size()] ; if (si > 0) return 1 ; if (si < 0) return -1 ; return 0 ; } int bigint::size() const { return v.p[0] ; } void bigint::add_smallint(int a) { if (v.i & 1) fromint((v.i >> 1) + a) ; else ripple(a, 1) ; } // do we need to shrink it to keep it canonical? void bigint::shrink(int pos) { while (pos > 1 && ((v.p[pos] - v.p[pos-1]) & 0x7fffffff) == 0) { pos-- ; v.p[pos] = v.p[pos+1] ; v.p[0] = pos ; } if (pos == 1) { int c = v.p[1] ; delete [] v.p ; v.i = 1 | (c << 1) ; } else if (pos == 2 && ((v.p[2] ^ v.p[1]) & 0x40000000) == 0) { int c = v.p[1] + (v.p[2] << 31) ; delete [] v.p ; v.i = 1 | (c << 1) ; } } void grow(int osz, int nsz) ; // note: carry may be any legal 31-bit int, *or* positive 2^30 // note: may only be called on arrayed bigints void bigint::ripple(int carry, int pos) { int c ; int sz = size() ; while (pos < sz) { c = v.p[pos] + (carry & 0x7fffffff) ; carry = ((c >> 31) & 1) + (carry >> 31) ; v.p[pos++] = c & 0x7fffffff; } c = v.p[pos] + carry ; if (c == 0 || c == -1) { // see if we can make it smaller v.p[pos] = c ; shrink(pos) ; } else { // need to extend if (0 == (sz & (sz + 1))) { // grow array (oops) grow(sz, sz+1) ; } else v.p[0] = sz + 1 ; v.p[pos] = c & 0x7fffffff ; v.p[pos+1] = -((c >> 31) & 1) ; } } void bigint::ripple(const bigint &a, int carry) { int asz = a.size() ; int tsz = size() ; int pos = 1 ; if (tsz < asz) { // gotta resize grow(tsz, asz) ; tsz = asz ; } while (pos < asz) { int c = v.p[pos] + a.v.p[pos] + carry ; carry = (c >> 31) & 1 ; v.p[pos++] = c & 0x7fffffff; } ripple(carry + a.v.p[pos], pos) ; } void bigint::ripplesub(const bigint &a, int carry) { int asz = a.size() ; int tsz = size() ; int pos = 1 ; if (tsz < asz) { // gotta resize grow(tsz, asz) ; tsz = asz ; } while (pos < asz) { int c = v.p[pos] + (0x7fffffff ^ a.v.p[pos]) + carry ; carry = (c >> 31) & 1 ; v.p[pos++] = c & 0x7fffffff; } ripple(carry + ~a.v.p[pos], pos) ; } // make sure it's in vector form; may leave it not canonical! void bigint::vectorize(int i) { v.p = new int[4] ; v.p[0] = 2 ; v.p[1] = i & 0x7fffffff ; if (i < 0) v.p[2] = -1 ; else v.p[2] = 0 ; #ifdef SLOWCHECK v.p[3] = 0xdeadbeef ; #endif } void bigint::fromint(int i) { if (i <= MAX_SIMPLE && i >= MIN_SIMPLE) v.i = (i << 1) | 1 ; else vectorize(i) ; } void bigint::ensurework(int sz) const { sz += 3 ; if (sz > workarrlen) { if (work) delete [] work ; work = new int[sz * 2] ; workarrlen = sz * 2 ; } } void bigint::mul_smallint(int a) { int c ; if (a == 0) { *this = 0 ; return ; } if (v.i & 1) { if ((v.i >> 1) <= MAX_SIMPLE / a) { c = (v.i >> 1) * a ; fromint((v.i >> 1) * a) ; return ; } vectorize(v.i >> 1) ; } int sz = size() ; int carry = 0 ; int pos = 1 ; while (pos < sz) { int clo = (v.p[pos] & 0xffff) * a + carry ; int chi = (v.p[pos] >> 16) * a + (clo >> 16) ; carry = chi >> 15 ; v.p[pos++] = (clo & 0xffff) + ((chi & 0x7fff) << 16) ; } c = v.p[pos] * a + carry ; if (c == 0 || c == -1) { // see if we can make it smaller v.p[pos] = c ; shrink(pos) ; } else { // need to extend if (0 == (sz & (sz + 1))) { // grow array (oops) grow(sz, sz+1) ; } else v.p[0] = sz + 1 ; v.p[pos] = c & 0x7fffffff ; v.p[pos+1] = -((c >> 31) & 1) ; } } void bigint::div_smallint(int a) { if (v.i & 1) { int r = (v.i >> 1) / a ; fromint(r) ; return ; } if (v.p[v.p[0]] < 0) lifefatal("we don't support divsmallint when negative yet") ; int carry = 0 ; int pos = v.p[0] ; while (pos > 0) { G_INT64 t = ((G_INT64)carry << G_MAKEINT64(31)) + v.p[pos] ; carry = (int)(t % a) ; v.p[pos] = (int)(t / a) ; pos-- ; } shrink(v.p[0]) ; } int bigint::mod_smallint(int a) { if (v.i & 1) return (((v.i >> 1) % a) + a) % a ; int pos = v.p[0] ; int mm = (1 << 31) % a ; int r = 0 ; while (pos > 0) { r = (mm * r + v.p[pos]) % a ; pos-- ; } return (r + a) % a ; } void bigint::div2() { if (v.i & 1) { v.i = ((v.i >> 1) | 1) ; return ; } int sz = v.p[0] ; int carry = -v.p[sz] ; for (int i=sz-1; i>0; i--) { int c = (v.p[i] >> 1) + (carry << 30) ; carry = v.p[i] & 1 ; v.p[i] = c ; } shrink(v.p[0]) ; } bigint& bigint::operator>>=(int i) { if (v.i & 1) { if (i > 31) v.i = ((v.i >> 31) | 1) ; else v.i = ((v.i >> i) | 1) ; return *this ; } int bigsh = i / 31 ; if (bigsh) { if (bigsh >= v.p[0]) { v.p[1] = v.p[v.p[0]] ; v.p[0] = 1 ; } else { for (int j=1; j+bigsh<=v.p[0]; j++) v.p[j] = v.p[j+bigsh] ; v.p[0] -= bigsh ; } i -= bigsh * 31 ; } int carry = v.p[v.p[0]] ; if (i) { for (int j=v.p[0]-1; j>0; j--) { int c = ((v.p[j] >> i) | (carry << (31-i))) & 0x7fffffff ; carry = v.p[j] ; v.p[j] = c ; } } shrink(v.p[0]) ; return *this ; } bigint& bigint::operator<<=(int i) { if (v.i & 1) { if (v.i == 1) return *this ; if (i < 30 && (v.i >> 31) == (v.i >> (31 - i))) { v.i = ((v.i & ~1) << i) | 1 ; return *this ; } vectorize(v.i >> 1) ; } int bigsh = i / 31 ; int nsize = v.p[0] + bigsh + 1 ; // how big we need it to be, worst case grow(v.p[0], nsize) ; if (bigsh) { int j ; for (j=v.p[0]-1; j>bigsh; j--) v.p[j] = v.p[j-bigsh] ; for (j=bigsh; j>0; j--) v.p[j] = 0 ; i -= bigsh * 31 ; } int carry = 0 ; if (i) { for (int j=1; j> (31-i))) & 0x7fffffff ; carry = v.p[j] ; v.p[j] = c ; } } shrink(v.p[0]) ; return *this ; } void bigint::mulpow2(int p) { if (p > 0) *this <<= p ; else if (p < 0) *this >>= -p ; } int bigint::even() const { if (v.i & 1) return 1-((v.i >> 1) & 1) ; else return 1-(v.p[1] & 1) ; } int bigint::odd() const { if (v.i & 1) return ((v.i >> 1) & 1) ; else return (v.p[1] & 1) ; } int bigint::low31() const { if (v.i & 1) return ((v.i >> 1) & 0x7fffffff) ; else return v.p[1] ; } int bigint::operator==(const bigint &b) const { if ((b.v.i - v.i) & 1) return 0 ; if (v.i & 1) return v.i == b.v.i ; if (b.v.p[0] != v.p[0]) return 0 ; return memcmp(v.p, b.v.p, sizeof(int) * (v.p[0] + 1)) == 0 ; } int bigint::operator!=(const bigint &b) const { return !(*this == b) ; } int bigint::operator<(const bigint &b) const { if (b.v.i & 1) if (v.i & 1) return v.i < b.v.i ; else return v.p[v.p[0]] < 0 ; else if (v.i & 1) return b.v.p[b.v.p[0]] >= 0 ; int d = v.p[v.p[0]] - b.v.p[b.v.p[0]] ; if (d < 0) return 1 ; if (d > 0) return 0 ; if (v.p[0] > b.v.p[0]) return v.p[v.p[0]] < 0 ; else if (v.p[0] < b.v.p[0]) return v.p[v.p[0]] >= 0 ; for (int i=v.p[0]; i>0; i--) if (v.p[i] < b.v.p[i]) return 1 ; else if (v.p[i] > b.v.p[i]) return 0 ; return 0 ; } int bigint::operator<=(const bigint &b) const { if (b.v.i & 1) if (v.i & 1) return v.i <= b.v.i ; else return v.p[v.p[0]] < 0 ; else if (v.i & 1) return b.v.p[b.v.p[0]] >= 0 ; int d = v.p[v.p[0]] - b.v.p[b.v.p[0]] ; if (d < 0) return 1 ; if (d > 0) return 0 ; if (v.p[0] > b.v.p[0]) return v.p[v.p[0]] < 0 ; else if (v.p[0] < b.v.p[0]) return v.p[v.p[0]] >= 0 ; for (int i=v.p[0]; i>0; i--) if (v.p[i] < b.v.p[i]) return 1 ; else if (v.p[i] > b.v.p[i]) return 0 ; return 1 ; } int bigint::operator>(const bigint &b) const { return !(*this <= b) ; } int bigint::operator>=(const bigint &b) const { return !(*this < b) ; } static double mybpow(int n) { double r = 1 ; double s = 65536.0 * 32768.0 ; while (n) { if (n & 1) r *= s ; s *= s ; n >>= 1 ; } return r ; } /** * Turn this bigint into a double. */ double bigint::todouble() const { if (v.i & 1) return (double)(v.i >> 1) ; double r = 0 ; double m = 1 ; int lim = 1 ; if (v.p[0] > 4) { lim = v.p[0] - 3 ; m = mybpow(lim-1) ; } for (int i=lim; i<=v.p[0]; i++) { r = r + m * v.p[i] ; m *= 65536 * 32768.0 ; } return r ; } /** * Turn this bigint into a double in a way that preserves huge exponents. * Here are some examples: * * To represent * the quantity We return the value * 27 1.27 * -6.02e23 -23.602 * 6.02e23 23.602 * 9.99e299 299.999 * 1.0e300 300.1 * 1.0e1000 1000.1 This would normally overflow * 6.7e12345 12345.67 */ double bigint::toscinot() const { double mant, exponent; double k_1_10 = 0.1; double k_1_10000 = 0.0001; double k_base = 65536.0 * 32768.0; exponent = 0; if (v.i & 1) { /* small integer */ mant = (double)(v.i >> 1) ; } else { /* big integer: a string of 31-bit chunks */ mant = 0 ; double m = 1 ; for (int i=1; i<=v.p[0]; i++) { mant = mant + m * v.p[i] ; m *= k_base ; while (m >= 100000.0) { m *= k_1_10000; mant *= k_1_10000; exponent += 4.0; } } } /* Add the last few powers of 10 back into the mantissa */ while(((mant < 0.5) && (mant > -0.5)) && (exponent > 0.0)) { mant *= 10.0; exponent -= 1.0; } /* Mantissa might be greater than 1 at this point */ while((mant >= 1.0) || (mant <= -1.0)) { mant *= k_1_10; exponent += 1.0; } if (mant >= 0) { // Normal case: 6.02e23 -> 23.602 return(exponent + mant); } // Negative case: -6.02e23 -> -23.602 // In this example mant will be -0.602 and exponent will be 23.0 return(mant - exponent); } /** * Return an int. */ int bigint::toint() const { if (v.i & 1) return (v.i >> 1) ; return (v.p[v.p[0]] << 31) | v.p[1] ; } /** * How many bits required to represent this, approximately? * Should overestimate but not by too much. */ int bigint::bitsreq() const { if (v.i & 1) return 31 ; return v.p[0] * 31 ; } /** * Find the lowest bit set. */ int bigint::lowbitset() const { int r = 0 ; if (v.i & 1) { if (v.i == 1) return -1 ; for (int i=1; i<32; i++) if ((v.i >> i) & 1) return i-1 ; } int o = 1 ; while (v.p[o] == 0) { o++ ; r += 31 ; } for (int i=0; i<32; i++) if ((v.p[o] >> i) & 1) return i + r ; return -1 ; } /** * Fill a character array with the bits. Top one is always * the sign bit. */ void bigint::tochararr(char *fillme, int n) const { int at = 0 ; while (n > 0) { int w = 0 ; if (v.i & 1) { if (at == 0) w = v.i >> 1 ; else w = v.i >> 31 ; } else { if (at < v.p[0]) w = v.p[at+1] ; else w = v.p[v.p[0]] ; } int lim = 31 ; if (n < 31) lim = n ; for (int i=0; i>= 1 ; } n -= 31 ; at++ ; } } /** * Manifests. */ const bigint bigint::zero(0) ; const bigint bigint::one(1) ; const bigint bigint::two(2) ; const bigint bigint::three(3) ; golly-2.5-src/gollybase/generationsalgo.cpp0000644000175100001440000001106712156145314016066 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "generationsalgo.h" #include using namespace std ; int generationsalgo::NumCellStates() { return maxCellStates ; } const char* generationsalgo::setrule(const char *s) { if ((int)strlen(s) + 10 > MAXRULESIZE) return "Rule too long for Generations" ; // a legal rule goes: // [0-8]+/[1-8]+/[1-9][0-9]* const char *p = s ; int tstaybits = 0, tbornbits = 0, tnumstates = 0 ; while ('0' <= *p && *p <= '8') { tstaybits |= 1<<(*p-'0') ; p++ ; } if (*p != '/') return "Missing expected slash in Generations rule" ; p++ ; while ('1' <= *p && *p <= '8') { tbornbits |= 1<<(*p-'0') ; p++ ; } if (*p != '/') return "Missing expected slash in Generations rule" ; p++ ; while ('0' <= *p && *p <= '9') { tnumstates = 10 * tnumstates + *p - '0' ; p++ ; if (tnumstates > 256) return "Number of states too high in Generations rule" ; } if (tnumstates < 2) return "Number of states too low in Generations rule" ; if (*p == ':') { // check for suffix like ":T200,100" to specify a bounded universe const char* err = setgridsize(p) ; if (err) return err ; } else { if (*p) return "Unexpected stuff at end of Generations rule" ; gridwd = 0 ; gridht = 0 ; } staybits = tstaybits ; bornbits = tbornbits ; maxCellStates = tnumstates ; // store rule in canonical format for getrule() int i, j = 0 ; char states[4] ; // room for "2".."256" and null for (i=0; i<=8; i++) { if (staybits & (1 << i)) canonrule[j++] = (char)('0' + i) ; } canonrule[j++] = '/' ; for (i=1; i<=8; i++) { if (bornbits & (1 << i)) canonrule[j++] = (char)('0' + i) ; } canonrule[j++] = '/' ; sprintf(states, "%d", tnumstates) ; i = 0 ; while (states[i]) { canonrule[j++] = states[i++] ; } if (gridwd > 0 || gridht > 0) { // setgridsize() was successfully called above const char* bounds = canonicalsuffix() ; i = 0 ; while (bounds[i]) { canonrule[j++] = bounds[i++] ; } } canonrule[j] = 0 ; ghashbase::setrule(canonrule) ; return 0 ; } const char* generationsalgo::getrule() { return canonrule ; } static const char *DEFAULTRULE = "12/34/3" ; const char* generationsalgo::DefaultRule() { return DEFAULTRULE ; } generationsalgo::generationsalgo() { // we may need this to be >2 here so it's recognized as multistate maxCellStates = 3 ; } generationsalgo::~generationsalgo() {} state generationsalgo::slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) { int nn = (nw==1)+(n==1)+(ne==1)+(w==1)+(e==1)+(sw==1)+(s==1)+(se==1) ; if (c==1 && (staybits & (1 << nn))) return 1 ; if (c==0 && (bornbits & (1 << nn))) return 1 ; if (c > 0 && c+1 < maxCellStates) return c + 1 ; return 0 ; } static lifealgo *creator() { return new generationsalgo() ; } void generationsalgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai) ; ai.setAlgorithmName("Generations") ; ai.setAlgorithmCreator(&creator) ; ai.minstates = 2 ; ai.maxstates = 256 ; // init default color scheme ai.defgradient = true; // use gradient ai.defr1 = 255; // start color = red ai.defg1 = 0; ai.defb1 = 0; ai.defr2 = 255; // end color = yellow ai.defg2 = 255; ai.defb2 = 0; // if not using gradient then set all states to white for (int i=0; i<256; i++) { ai.defr[i] = ai.defg[i] = ai.defb[i] = 255; } } golly-2.5-src/gollybase/ghashbase.cpp0000644000175100001440000014457712156145314014647 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /* * jvn 0.99 by Radical Eye Software. * * All good ideas here were originated by Gosper or Bell or others, I'm * sure, and all bad ones by yours truly. * * The main reason I wrote this program was to attempt to push out the * evaluation of metacatacryst as far as I could. So this program * really does very little other than compute life as far into the * future as possible, using as little memory as possible (and reusing * it if necessary). No UI, few options. */ #include "ghashbase.h" #include "util.h" #include #include using namespace std ; /* * Prime hash sizes tend to work best. */ static g_uintptr_t nextprime(g_uintptr_t i) { g_uintptr_t j ; i |= 1 ; for (;; i+=2) { for (j=3; j*j<=i; j+=2) if (i % j == 0) break ; if (j*j > i) return i ; } } /* * We do now support garbage collection, but there are some routines we * call frequently to help us. */ #define ghnode_hash(a,b,c,d) (65537*(g_uintptr_t)(d)+257*(g_uintptr_t)(c)+17*(g_uintptr_t)(b)+5*(g_uintptr_t)(a)) #define ghleaf_hash(a,b,c,d) (65537*(d)+257*(c)+17*(b)+5*(a)) /* * Resize the hash. */ void ghashbase::resize() { g_uintptr_t i, nhashprime = nextprime(2 * hashprime) ; ghnode *p, **nhashtab ; if (alloced > maxmem || nhashprime * sizeof(ghnode *) > (maxmem - alloced)) { hashlimit = G_MAX ; return ; } /* * Don't let the hash table buckets take more than 4% of the * memory. If we're starting to strain memory, let the buckets * fill up a bit more. */ if (nhashprime > (maxmem/(25*sizeof(int *)))) { nhashprime = nextprime(maxmem/(25*sizeof(int *))) ; if (nhashprime == hashprime) { hashlimit = G_MAX ; return ; } } if (verbose) { strcpy(statusline, "Resizing hash...") ; lifestatus(statusline) ; } nhashtab = (ghnode **)calloc(nhashprime, sizeof(ghnode *)) ; if (nhashtab == 0) { lifewarning("Out of memory; running in a somewhat slower mode; " "try reducing the hash memory limit after restarting.") ; hashlimit = G_MAX ; return ; } alloced += sizeof(ghnode *) * (nhashprime - hashprime) ; for (i=0; inext ; g_uintptr_t h ; if (is_ghnode(p)) { h = ghnode_hash(p->nw, p->ne, p->sw, p->se) ; } else { ghleaf *l = (ghleaf *)p ; h = ghleaf_hash(l->nw, l->ne, l->sw, l->se) ; } h %= nhashprime ; p->next = nhashtab[h] ; nhashtab[h] = p ; p = np ; } } free(hashtab) ; hashtab = nhashtab ; hashprime = nhashprime ; hashlimit = hashprime ; if (verbose) { strcpy(statusline+strlen(statusline), " done.") ; lifestatus(statusline) ; } } /* * These next two routines are (nearly) our only hash table access * routines; we simply look up the passed in information. If we * find it in the hash table, we return it; otherwise, we build a * new ghnode and store it in the hash table, and return that. */ ghnode *ghashbase::find_ghnode(ghnode *nw, ghnode *ne, ghnode *sw, ghnode *se) { ghnode *p ; g_uintptr_t h = ghnode_hash(nw,ne,sw,se) ; ghnode *pred = 0 ; h = h % hashprime ; for (p=hashtab[h]; p; p = p->next) { /* make sure to compare nw *first* */ if (nw == p->nw && ne == p->ne && sw == p->sw && se == p->se) { if (pred) { /* move this one to the front */ pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = p ; } return save(p) ; } pred = p ; } p = newghnode() ; p->nw = nw ; p->ne = ne ; p->sw = sw ; p->se = se ; p->res = 0 ; p->next = hashtab[h] ; hashtab[h] = p ; hashpop++ ; if (hashpop > hashlimit) resize() ; return save(p) ; } void ghashbase::unhash_ghnode(ghnode *n) { ghnode *p ; g_uintptr_t h = ghnode_hash(n->nw,n->ne,n->sw,n->se) ; ghnode *pred = 0 ; h = h % hashprime ; for (p=hashtab[h]; p; p = p->next) { if (p == n) { if (pred) pred->next = p->next ; else hashtab[h] = p->next ; return ; } pred = p ; } lifefatal("Didn't find ghnode to unhash") ; } void ghashbase::rehash_ghnode(ghnode *n) { g_uintptr_t h = ghnode_hash(n->nw,n->ne,n->sw,n->se) ; h = h % hashprime ; n->next = hashtab[h] ; hashtab[h] = n ; } ghleaf *ghashbase::find_ghleaf(state nw, state ne, state sw, state se) { ghleaf *p ; ghleaf *pred = 0 ; g_uintptr_t h = ghleaf_hash(nw, ne, sw, se) ; h = h % hashprime ; for (p=(ghleaf *)hashtab[h]; p; p = (ghleaf *)p->next) { if (nw == p->nw && ne == p->ne && sw == p->sw && se == p->se && !is_ghnode(p)) { if (pred) { pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = (ghnode *)p ; } return (ghleaf *)save((ghnode *)p) ; } pred = p ; } p = newghleaf() ; p->nw = nw ; p->ne = ne ; p->sw = sw ; p->se = se ; p->leafpop = (nw != 0) + (ne != 0) + (sw != 0) + (se != 0) ; p->isghnode = 0 ; p->next = hashtab[h] ; hashtab[h] = (ghnode *)p ; hashpop++ ; if (hashpop > hashlimit) resize() ; return (ghleaf *)save((ghnode *)p) ; } /* * The following routine does the same, but first it checks to see if * the cached result is any good. If it is, it directly returns that. * Otherwise, it figures out whether to call the ghleaf routine or the * non-ghleaf routine by whether two ghnodes down is a ghleaf ghnode or not. * (We'll understand why this is a bit later.) All the sp stuff is * stack pointer and garbage collection stuff. */ ghnode *ghashbase::getres(ghnode *n, int depth) { if (n->res) return n->res ; ghnode *res = 0 ; /** * This routine be the only place we assign to res. We use * the fact that the poll routine is *sticky* to allow us to * manage unwinding the stack without munging our data * structures. Note that there may be many find_ghnodes * and getres called before we finally actually exit from * here, because the stack is deep and we don't want to * put checks throughout the code. Instead we need two * calls here, one to prevent us going deeper, and another * to prevent us from destroying the cache field. */ if (poller->poll()) return zeroghnode(depth-1) ; int sp = gsp ; depth-- ; if (ngens >= depth) { if (is_ghnode(n->nw)) { res = dorecurs(n->nw, n->ne, n->sw, n->se, depth) ; } else { res = (ghnode *)dorecurs_ghleaf((ghleaf *)n->nw, (ghleaf *)n->ne, (ghleaf *)n->sw, (ghleaf *)n->se) ; } } else { if (halvesdone < 1000) halvesdone++ ; if (is_ghnode(n->nw)) { res = dorecurs_half(n->nw, n->ne, n->sw, n->se, depth) ; } else { lifefatal("! can't happen") ; } } pop(sp) ; if (poller->isInterrupted()) // don't assign this to the cache field! res = zeroghnode(depth) ; else n->res = res ; return res ; } /* * So let's say the cached way failed. How do we do it the slow way? * Recursively, of course. For an n-square (composed of the four * n/2-squares passed in, compute the n/2-square that is n/4 * generations ahead. * * This routine works exactly the same as the ghleafres() routine, only * instead of working on an 8-square, we're working on an n-square, * returning an n/2-square, and we build that n/2-square by first building * 9 n/4-squares, use those to calculate 4 more n/4-squares, and * then put these together into a new n/2-square. Simple, eh? */ ghnode *ghashbase::dorecurs(ghnode *n, ghnode *ne, ghnode *t, ghnode *e, int depth) { int sp = gsp ; ghnode *t00 = getres(n, depth), *t01 = getres(find_ghnode(n->ne, ne->nw, n->se, ne->sw), depth), *t02 = getres(ne, depth), *t12 = getres(find_ghnode(ne->sw, ne->se, e->nw, e->ne), depth), *t11 = getres(find_ghnode(n->se, ne->sw, t->ne, e->nw), depth), *t10 = getres(find_ghnode(n->sw, n->se, t->nw, t->ne), depth), *t20 = getres(t, depth), *t21 = getres(find_ghnode(t->ne, e->nw, t->se, e->sw), depth), *t22 = getres(e, depth), *t44 = getres(find_ghnode(t11, t12, t21, t22), depth), *t43 = getres(find_ghnode(t10, t11, t20, t21), depth), *t33 = getres(find_ghnode(t00, t01, t10, t11), depth), *t34 = getres(find_ghnode(t01, t02, t11, t12), depth) ; n = find_ghnode(t33, t34, t43, t44) ; pop(sp) ; return save(n) ; } /* * Same as above, but we only do one step instead of 2. */ ghnode *ghashbase::dorecurs_half(ghnode *n, ghnode *ne, ghnode *t, ghnode *e, int depth) { int sp = gsp ; if (depth > 1) { ghnode *t00 = find_ghnode(n->nw->se, n->ne->sw, n->sw->ne, n->se->nw), *t01 = find_ghnode(n->ne->se, ne->nw->sw, n->se->ne, ne->sw->nw), *t02 = find_ghnode(ne->nw->se, ne->ne->sw, ne->sw->ne, ne->se->nw), *t10 = find_ghnode(n->sw->se, n->se->sw, t->nw->ne, t->ne->nw), *t11 = find_ghnode(n->se->se, ne->sw->sw, t->ne->ne, e->nw->nw), *t12 = find_ghnode(ne->sw->se, ne->se->sw, e->nw->ne, e->ne->nw), *t20 = find_ghnode(t->nw->se, t->ne->sw, t->sw->ne, t->se->nw), *t21 = find_ghnode(t->ne->se, e->nw->sw, t->se->ne, e->sw->nw), *t22 = find_ghnode(e->nw->se, e->ne->sw, e->sw->ne, e->se->nw) ; n = find_ghnode(getres(find_ghnode(t00, t01, t10, t11), depth), getres(find_ghnode(t01, t02, t11, t12), depth), getres(find_ghnode(t10, t11, t20, t21), depth), getres(find_ghnode(t11, t12, t21, t22), depth)) ; } else { ghnode *t00 = getres(n, depth), *t01 = getres(find_ghnode(n->ne, ne->nw, n->se, ne->sw), depth), *t10 = getres(find_ghnode(n->sw, n->se, t->nw, t->ne), depth), *t11 = getres(find_ghnode(n->se, ne->sw, t->ne, e->nw), depth), *t02 = getres(ne, depth), *t12 = getres(find_ghnode(ne->sw, ne->se, e->nw, e->ne), depth), *t20 = getres(t, depth), *t21 = getres(find_ghnode(t->ne, e->nw, t->se, e->sw), depth), *t22 = getres(e, depth) ; n = find_ghnode((ghnode *)find_ghleaf(((ghleaf *)t00)->se, ((ghleaf *)t01)->sw, ((ghleaf *)t10)->ne, ((ghleaf *)t11)->nw), (ghnode *)find_ghleaf(((ghleaf *)t01)->se, ((ghleaf *)t02)->sw, ((ghleaf *)t11)->ne, ((ghleaf *)t12)->nw), (ghnode *)find_ghleaf(((ghleaf *)t10)->se, ((ghleaf *)t11)->sw, ((ghleaf *)t20)->ne, ((ghleaf *)t21)->nw), (ghnode *)find_ghleaf(((ghleaf *)t11)->se, ((ghleaf *)t12)->sw, ((ghleaf *)t21)->ne, ((ghleaf *)t22)->nw)) ; } pop(sp) ; return save(n) ; } /* * If the ghnode is a 16-ghnode, then the constituents are leaves, so we * need a very similar but still somewhat different subroutine. Since * we do not (yet) garbage collect leaves, we don't need all that * save/pop mumbo-jumbo. */ ghleaf *ghashbase::dorecurs_ghleaf(ghleaf *nw, ghleaf *ne, ghleaf *sw, ghleaf *se) { return find_ghleaf( slowcalc(nw->nw, nw->ne, ne->nw, nw->sw, nw->se, ne->sw, sw->nw, sw->ne, se->nw), slowcalc(nw->ne, ne->nw, ne->ne, nw->se, ne->sw, ne->se, sw->ne, se->nw, se->ne), slowcalc(nw->sw, nw->se, ne->sw, sw->nw, sw->ne, se->nw, sw->sw, sw->se, se->sw), slowcalc(nw->se, ne->sw, ne->se, sw->ne, se->nw, se->ne, sw->se, se->sw, se->se)) ; } /* * We keep free ghnodes in a linked list for allocation, and we allocate * them 1000 at a time. */ ghnode *ghashbase::newghnode() { ghnode *r ; if (freeghnodes == 0) { int i ; freeghnodes = (ghnode *)calloc(1001, sizeof(ghnode)) ; if (freeghnodes == 0) lifefatal("Out of memory; try reducing the hash memory limit.") ; alloced += 1001 * sizeof(ghnode) ; freeghnodes->next = ghnodeblocks ; ghnodeblocks = freeghnodes++ ; for (i=0; i<999; i++) { freeghnodes[1].next = freeghnodes ; freeghnodes++ ; } totalthings += 1000 ; } if (freeghnodes->next == 0 && alloced + 1000 * sizeof(ghnode) > maxmem && okaytogc) { do_gc(0) ; } r = freeghnodes ; freeghnodes = freeghnodes->next ; return r ; } /* * Leaves are the same. */ ghleaf *ghashbase::newghleaf() { return (ghleaf *)newghnode() ; } /* * Sometimes we want the new ghnode or ghleaf to be automatically cleared * for us. */ ghnode *ghashbase::newclearedghnode() { return (ghnode *)memset(newghnode(), 0, sizeof(ghnode)) ; } ghleaf *ghashbase::newclearedghleaf() { return (ghleaf *)memset(newghleaf(), 0, sizeof(ghleaf)) ; } ghashbase::ghashbase() { hashprime = nextprime(1000) ; hashlimit = hashprime ; hashpop = 0 ; hashtab = (ghnode **)calloc(hashprime, sizeof(ghnode *)) ; if (hashtab == 0) lifefatal("Out of memory (1).") ; alloced += hashprime * sizeof(ghnode *) ; ngens = 0 ; stacksize = 0 ; halvesdone = 0 ; nzeros = 0 ; stack = 0 ; gsp = 0 ; alloced = 0 ; maxmem = 256 * 1024 * 1024 ; freeghnodes = 0 ; okaytogc = 0 ; totalthings = 0 ; ghnodeblocks = 0 ; zeroghnodea = 0 ; /* * We initialize our universe to be a 16-square. We are in drawing * mode at this point. */ root = (ghnode *)newclearedghnode() ; population = 0 ; generation = 0 ; increment = 1 ; setincrement = 1 ; nonpow2 = 1 ; pow2step = 1 ; llsize = 0 ; depth = 1 ; hashed = 0 ; popValid = 0 ; needPop = 0 ; inGC = 0 ; cacheinvalid = 0 ; gccount = 0 ; gcstep = 0 ; } /** * Destructor frees memory. */ ghashbase::~ghashbase() { free(hashtab) ; while (ghnodeblocks) { ghnode *r = ghnodeblocks ; ghnodeblocks = ghnodeblocks->next ; free(r) ; } if (zeroghnodea) free(zeroghnodea) ; if (stack) free(stack) ; if (llsize) { delete [] llxb ; delete [] llyb ; } } /** * Set increment. */ void ghashbase::setIncrement(bigint inc) { increment = inc ; } /** * Do a step. */ void ghashbase::step() { poller->bailIfCalculating() ; // we use while here because the increment may be changed while we are // doing the hashtable sweep; if that happens, we may need to sweep // again. int cleareddownto = 1000000000 ; while (increment != setincrement) { bigint pendingincrement = increment ; int newpow2 = 0 ; bigint t = pendingincrement ; while (t > 0 && t.even()) { newpow2++ ; t.div2() ; } nonpow2 = t.low31() ; if (t != nonpow2) lifefatal("bad increment") ; int downto = newpow2 ; if (ngens < newpow2) downto = ngens ; if (newpow2 != ngens && cleareddownto > downto) { new_ngens(newpow2) ; cleareddownto = downto ; } else { ngens = newpow2 ; } setincrement = pendingincrement ; pow2step = 1 ; while (newpow2--) pow2step += pow2step ; } gcstep = 0 ; for (int i=0; iisInterrupted()) // we *were* interrupted break ; popValid = 0 ; root = newroot ; } depth = ghnode_depth(root) ; extendtimeline() ; } void ghashbase::setcurrentstate(void *n) { if (root != (ghnode *)n) { root = (ghnode *)n ; depth = ghnode_depth(root) ; popValid = 0 ; } } /* * Set the max memory */ void ghashbase::setMaxMemory(int newmemlimit) { if (newmemlimit < 10) newmemlimit = 10 ; #ifndef GOLLY64BIT else if (newmemlimit > 4000) newmemlimit = 4000 ; #endif g_uintptr_t newlimit = ((g_uintptr_t)newmemlimit) << 20 ; if (alloced > newlimit) { lifewarning("Sorry, more memory currently used than allowed.") ; return ; } maxmem = newlimit ; hashlimit = hashprime ; } /** * Clear everything. */ void ghashbase::clearall() { lifefatal("clearall not implemented yet") ; } /* * This routine expands our universe by a factor of two, maintaining * centering. We use four new ghnodes, and *reuse* the root so this cannot * be called after we've started hashing. */ void ghashbase::pushroot_1() { ghnode *t ; t = newclearedghnode() ; t->se = root->nw ; root->nw = t ; t = newclearedghnode() ; t->sw = root->ne ; root->ne = t ; t = newclearedghnode() ; t->ne = root->sw ; root->sw = t ; t = newclearedghnode() ; t->nw = root->se ; root->se = t ; depth++ ; } /* * Return the depth of this ghnode (2 is 8x8). */ int ghashbase::ghnode_depth(ghnode *n) { int depth = 0 ; while (is_ghnode(n)) { depth++ ; n = n->nw ; } return depth ; } /* * This routine returns the canonical clear space ghnode at a particular * depth. */ ghnode *ghashbase::zeroghnode(int depth) { while (depth >= nzeros) { int nnzeros = 2 * nzeros + 10 ; zeroghnodea = (ghnode **)realloc(zeroghnodea, nnzeros * sizeof(ghnode *)) ; if (zeroghnodea == 0) lifefatal("Out of memory (2).") ; alloced += (nnzeros - nzeros) * sizeof(ghnode *) ; while (nzeros < nnzeros) zeroghnodea[nzeros++] = 0 ; } if (zeroghnodea[depth] == 0) { if (depth == 0) { zeroghnodea[depth] = (ghnode *)find_ghleaf(0, 0, 0, 0) ; } else { ghnode *z = zeroghnode(depth-1) ; zeroghnodea[depth] = find_ghnode(z, z, z, z) ; } } return zeroghnodea[depth] ; } /* * Same, but with hashed ghnodes. */ ghnode *ghashbase::pushroot(ghnode *n) { int depth = ghnode_depth(n) ; ghnode *z = zeroghnode(depth-1) ; return find_ghnode(find_ghnode(z, z, z, n->nw), find_ghnode(z, z, n->ne, z), find_ghnode(z, n->sw, z, z), find_ghnode(n->se, z, z, z)) ; } /* * Here is our recursive routine to set a bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. We allocate new ghnodes and * leaves on our way down. * * Note that at this point our universe lives outside the hash table * and has not been canonicalized, and that many of the pointers in * the ghnodes can be null. We'll patch this up in due course. */ ghnode *ghashbase::setbit(ghnode *n, int x, int y, int newstate, int depth) { if (depth == 0) { ghleaf *l = (ghleaf *)n ; if (hashed) { state nw = l->nw ; state sw = l->sw ; state ne = l->ne ; state se = l->se ; if (x < 0) if (y < 0) sw = (state)newstate ; else nw = (state)newstate ; else if (y < 0) se = (state)newstate ; else ne = (state)newstate ; return save((ghnode *)find_ghleaf(nw, ne, sw, se)) ; } if (x < 0) if (y < 0) l->sw = (state)newstate ; else l->nw = (state)newstate ; else if (y < 0) l->se = (state)newstate ; else l->ne = (state)newstate ; return (ghnode *)l ; } else { unsigned int w = 0, wh = 0 ; if (depth >= 31) { if (depth == this->depth) wh = 0x80000000 ; } else { w = 1 << depth ; wh = 1 << (depth - 1) ; } if (depth > 31) w = 0 ; depth-- ; ghnode **nptr ; if (x < 0) { if (y < 0) nptr = &(n->sw) ; else nptr = &(n->nw) ; } else { if (y < 0) nptr = &(n->se) ; else nptr = &(n->ne) ; } if (*nptr == 0) { if (depth == 0) *nptr = (ghnode *)newclearedghleaf() ; else *nptr = newclearedghnode() ; } ghnode *s = setbit(*nptr, (x & (w - 1)) - wh, (y & (w - 1)) - wh, newstate, depth) ; if (hashed) { ghnode *nw = n->nw ; ghnode *sw = n->sw ; ghnode *ne = n->ne ; ghnode *se = n->se ; if (x < 0) { if (y < 0) sw = s ; else nw = s ; } else { if (y < 0) se = s ; else ne = s ; } n = save(find_ghnode(nw, ne, sw, se)) ; } else { *nptr = s ; } return n ; } } /* * Here is our recursive routine to get a bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. */ int ghashbase::getbit(ghnode *n, int x, int y, int depth) { if (depth == 0) { ghleaf *l = (ghleaf *)n ; if (x < 0) if (y < 0) return l->sw ; else return l->nw ; else if (y < 0) return l->se ; else return l->ne ; } else { unsigned int w = 0, wh = 0 ; if (depth >= 31) { if (depth == this->depth) wh = 0x80000000 ; } else { w = 1 << depth ; wh = 1 << (depth - 1) ; } ghnode *nptr ; depth-- ; if (x < 0) { if (y < 0) nptr = n->sw ; else nptr = n->nw ; } else { if (y < 0) nptr = n->se ; else nptr = n->ne ; } if (nptr == 0 || nptr == zeroghnode(depth)) return 0 ; return getbit(nptr, (x & (w - 1)) - wh, (y & (w - 1)) - wh, depth) ; } } /* * Here is our recursive routine to get the next bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. */ int ghashbase::nextbit(ghnode *n, int x, int y, int depth, int &v) { if (n == 0 || n == zeroghnode(depth)) return -1 ; if (depth == 0) { ghleaf *l = (ghleaf *)n ; if (y < 0) { if (x < 0 && l->sw) { v = l->sw ; return 0 ; } if (l->se) { v = l->se ; return -x ; } } else { if (x < 0 && l->nw) { v = l->nw ; return 0 ; } if (l->ne) { v = l->ne ; return -x ; } } return -1 ; // none found } else { unsigned int w = 1 << depth ; unsigned int wh = w >> 1 ; ghnode *lft, *rght ; depth-- ; if (y < 0) { lft = n->sw ; rght = n->se ; } else { lft = n->nw ; rght = n->ne ; } int r = 0 ; if (x < 0) { int t = nextbit(lft, (x & (w-1)) - wh, (y & (w - 1)) - wh, depth, v) ; if (t >= 0) return t ; r = -x ; x = 0 ; } int t = nextbit(rght, (x & (w-1)) - wh, (y & (w - 1)) - wh, depth, v) ; if (t >= 0) return r + t ; return -1 ; } } /* * Our nonrecurse top-level bit setting routine simply expands the * universe as necessary to encompass the passed-in coordinates, and * then invokes the recursive setbit. Right now it works hashed or * unhashed (but it's faster when unhashed). We also turn on the inGC * flag to inhibit popcount. */ int ghashbase::setcell(int x, int y, int newstate) { if (newstate < 0 || newstate >= maxCellStates) return -1 ; if (hashed) { clearstack() ; save(root) ; okaytogc = 1 ; } inGC = 1 ; y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } while (sx > 0 || sx < -1 || sy > 0 || sy < -1) { if (hashed) { root = save(pushroot(root)) ; depth++ ; } else { pushroot_1() ; } sx >>= 1 ; sy >>= 1 ; } root = setbit(root, x, y, newstate, depth) ; if (hashed) { okaytogc = 0 ; } return 0 ; } /* * Our nonrecurse top-level bit getting routine. */ int ghashbase::getcell(int x, int y) { y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } if (sx > 0 || sx < -1 || sy > 0 || sy < -1) return 0 ; return getbit(root, x, y, depth) ; } /* * A recursive bit getting routine, but this one returns the * number of pixels to the right to the next set cell in the * current universe, or -1 if none set to the right, or if * the next set pixel is out of range. */ int ghashbase::nextcell(int x, int y, int &v) { y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } while (sx > 0 || sx < -1 || sy > 0 || sy < -1) { if (hashed) { root = save(pushroot(root)) ; depth++ ; } else { pushroot_1() ; } sx >>= 1 ; sy >>= 1 ; } if (depth > 30) { struct ghnode tghnode = *root ; int mdepth = depth ; while (mdepth > 30) { tghnode.nw = tghnode.nw->se ; tghnode.ne = tghnode.ne->sw ; tghnode.sw = tghnode.sw->ne ; tghnode.se = tghnode.se->nw ; mdepth-- ; } return nextbit(&tghnode, x, y, mdepth, v) ; } return nextbit(root, x, y, depth, v) ; } /* * Canonicalize a universe by filling in the null pointers and then * invoking find_ghnode on each ghnode. Drops the original universe on * the floor [big deal, it's probably small anyway]. */ ghnode *ghashbase::hashpattern(ghnode *root, int depth) { ghnode *r ; if (root == 0) { r = zeroghnode(depth) ; } else if (depth == 0) { ghleaf *n = (ghleaf *)root ; r = (ghnode *)find_ghleaf(n->nw, n->ne, n->sw, n->se) ; n->next = freeghnodes ; freeghnodes = root ; } else { depth-- ; r = find_ghnode(hashpattern(root->nw, depth), hashpattern(root->ne, depth), hashpattern(root->sw, depth), hashpattern(root->se, depth)) ; root->next = freeghnodes ; freeghnodes = root ; } return r ; } void ghashbase::endofpattern() { poller->bailIfCalculating() ; if (!hashed) { root = hashpattern(root, depth) ; hashed = 1 ; } popValid = 0 ; needPop = 0 ; inGC = 0 ; } void ghashbase::ensure_hashed() { if (!hashed) endofpattern() ; } /* * Pop off any levels we don't need. */ ghnode *ghashbase::popzeros(ghnode *n) { int depth = ghnode_depth(n) ; while (depth > 1) { ghnode *z = zeroghnode(depth-2) ; if (n->nw->nw == z && n->nw->ne == z && n->nw->sw == z && n->ne->nw == z && n->ne->ne == z && n->ne->se == z && n->sw->nw == z && n->sw->sw == z && n->sw->se == z && n->se->ne == z && n->se->sw == z && n->se->se == z) { depth-- ; n = find_ghnode(n->nw->se, n->ne->sw, n->sw->ne, n->se->nw) ; } else { break ; } } return n ; } /* * A lot of the routines from here on down traverse the universe, hanging * information off the ghnodes. The way they generally do so is by using * (or abusing) the cache (res) field, and the least significant bit of * the hash next field (as a visited bit). */ #define marked(n) (1 & (g_uintptr_t)(n)->next) #define mark(n) ((n)->next = (ghnode *)(1 | (g_uintptr_t)(n)->next)) #define clearmark(n) ((n)->next = (ghnode *)(~1 & (g_uintptr_t)(n)->next)) #define clearmarkbit(p) ((ghnode *)(~1 & (g_uintptr_t)(p))) /* * Sometimes we want to use *res* instead of next to mark. You cannot * do this to leaves, though. */ #define marked2(n) (1 & (g_uintptr_t)(n)->res) #define mark2(n) ((n)->res = (ghnode *)(1 | (g_uintptr_t)(n)->res)) #define clearmark2(n) ((n)->res = (ghnode *)(~1 & (g_uintptr_t)(n)->res)) static void sum4(bigint &dest, const bigint &a, const bigint &b, const bigint &c, const bigint &d) { dest = a ; dest += b ; dest += c ; dest += d ; } /* * This recursive routine calculates the population by hanging the * population on marked ghnodes. */ const bigint &ghashbase::calcpop(ghnode *root, int depth) { if (root == zeroghnode(depth)) return bigint::zero ; if (depth == 0) { root->nw = 0 ; bigint &r = *(bigint *)&(root->nw) ; ghleaf *n = (ghleaf *)root ; r = n->leafpop ; return r ; } else if (marked2(root)) { return *(bigint*)&(root->next) ; } else { depth-- ; unhash_ghnode(root) ; /** * We use the memory in root->next as a value bigint. But we want to * make sure the copy constructor doesn't "clean up" something that * doesn't exist. So we clear it to zero here. */ root->next = (ghnode *)0 ; // I wish I could come up with a cleaner way sum4(*(bigint *)&(root->next), calcpop(root->nw, depth), calcpop(root->ne, depth), calcpop(root->sw, depth), calcpop(root->se, depth)) ; mark2(root) ; return *(bigint *)&(root->next) ; } } /* * Call this after doing something that unhashes ghnodes in order to * use the next field as a temp pointer. */ void ghashbase::aftercalcpop2(ghnode *root, int depth, int cleanbigints) { if (root == zeroghnode(depth)) return ; if (depth == 0) { root->nw = 0 ; // all these bigints are guaranteed to be small return ; } if (marked2(root)) { clearmark2(root) ; depth-- ; aftercalcpop2(root->nw, depth, cleanbigints) ; aftercalcpop2(root->ne, depth, cleanbigints) ; aftercalcpop2(root->sw, depth, cleanbigints) ; aftercalcpop2(root->se, depth, cleanbigints) ; if (cleanbigints) *(bigint *)&(root->next) = bigint::zero ; // clean up; yuck! rehash_ghnode(root) ; } } /* * This top level routine calculates the population of a universe. */ void ghashbase::calcPopulation(ghnode *root) { int depth ; ensure_hashed() ; depth = ghnode_depth(root) ; population = calcpop(root, depth) ; aftercalcpop2(root, depth, 1) ; } /* * Is the universe empty? */ int ghashbase::isEmpty() { ensure_hashed() ; return root == zeroghnode(depth) ; } /* * This routine marks a ghnode as needed to be saved. */ ghnode *ghashbase::save(ghnode *n) { if (gsp >= stacksize) { int nstacksize = stacksize * 2 + 100 ; alloced += sizeof(ghnode *)*(nstacksize-stacksize) ; stack = (ghnode **)realloc(stack, nstacksize * sizeof(ghnode *)) ; if (stack == 0) lifefatal("Out of memory (3).") ; stacksize = nstacksize ; } stack[gsp++] = n ; return n ; } /* * This routine pops the stack back to a previous depth. */ void ghashbase::pop(int n) { gsp = n ; } /* * This routine clears the stack altogether. */ void ghashbase::clearstack() { gsp = 0 ; } /* * Do a gc. Walk down from all ghnodes reachable on the stack, saveing * them by setting the odd bit on the next link. Then, walk the hash, * eliminating the res from everything that's not saveed, and moving * the ghnodes from the hash to the freelist as appropriate. Finally, * walk the hash again, clearing the low order bits in the next pointers. */ void ghashbase::gc_mark(ghnode *root, int invalidate) { if (!marked(root)) { mark(root) ; if (is_ghnode(root)) { gc_mark(root->nw, invalidate) ; gc_mark(root->ne, invalidate) ; gc_mark(root->sw, invalidate) ; gc_mark(root->se, invalidate) ; if (root->res) { if (invalidate) root->res = 0 ; else gc_mark(root->res, invalidate) ; } } } } /** * If the invalidate flag is set, we want to kill *all* cache entries * and recalculate all leaves. */ void ghashbase::do_gc(int invalidate) { int i ; g_uintptr_t freed_ghnodes=0 ; ghnode *p, *pp ; inGC = 1 ; gccount++ ; gcstep++ ; if (verbose) { if (gcstep > 1) sprintf(statusline, "GC #%d(%d) ", gccount, gcstep) ; else sprintf(statusline, "GC #%d ", gccount) ; lifestatus(statusline) ; } for (i=nzeros-1; i>=0; i--) if (zeroghnodea[i] != 0) break ; if (i >= 0) gc_mark(zeroghnodea[i], 0) ; // never invalidate zeroghnode for (i=0; ipoll() ; gc_mark((ghnode *)stack[i], invalidate) ; } for (i=0; inext) { poller->poll() ; for (pp=p+1, i=1; i<1001; i++, pp++) { if (marked(pp)) { g_uintptr_t h = 0 ; if (pp->nw) { /* yes, it's a ghnode */ h = ghnode_hash(pp->nw, pp->ne, pp->sw, pp->se) % hashprime ; } else { ghleaf *lp = (ghleaf *)pp ; h = ghleaf_hash(lp->nw, lp->ne, lp->sw, lp->se) % hashprime ; } pp->next = hashtab[h] ; hashtab[h] = pp ; hashpop++ ; } else { pp->next = freeghnodes ; freeghnodes = pp ; freed_ghnodes++ ; } } } inGC = 0 ; if (verbose) { int perc = (int)(freed_ghnodes / (totalthings / 100)) ; sprintf(statusline+strlen(statusline), " freed %d percent.", perc) ; lifestatus(statusline) ; } if (needPop) { calcPopulation(root) ; popValid = 1 ; needPop = 0 ; poller->updatePop() ; } } /* * Clear the cache bits down to the appropriate level, marking the * ghnodes we've handled. */ void ghashbase::clearcache(ghnode *n, int depth, int clearto) { if (!marked(n)) { mark(n) ; if (depth > 1) { depth-- ; poller->poll() ; clearcache(n->nw, depth, clearto) ; clearcache(n->ne, depth, clearto) ; clearcache(n->sw, depth, clearto) ; clearcache(n->se, depth, clearto) ; if (n->res) clearcache(n->res, depth, clearto) ; } if (depth >= clearto) n->res = 0 ; } } /* * Clear the entire cache of everything, and recalculate all leaves. * This can be very expensive. */ void ghashbase::clearcache() { cacheinvalid = 1 ; } /* * Change the ngens value. Requires us to walk the hash, clearing * the cache fields of any ghnodes that do not have the appropriate * values. */ void ghashbase::new_ngens(int newval) { g_uintptr_t i ; ghnode *p, *pp ; int clearto = ngens ; if (newval > ngens && halvesdone == 0) { ngens = newval ; return ; } if (verbose) { strcpy(statusline, "Changing increment...") ; lifestatus(statusline) ; } if (newval < clearto) clearto = newval ; clearto++ ; /* clear this depth and above */ if (clearto < 1) clearto = 1 ; ngens = newval ; inGC = 1 ; for (i=0; inext)) if (is_ghnode(p) && !marked(p)) clearcache(p, ghnode_depth(p), clearto) ; for (p=ghnodeblocks; p; p=p->next) { poller->poll() ; for (pp=p+1, i=1; i<1001; i++, pp++) clearmark(pp) ; } halvesdone = 0 ; inGC = 0 ; if (needPop) { calcPopulation(root) ; popValid = 1 ; needPop = 0 ; poller->updatePop() ; } if (verbose) { strcpy(statusline+strlen(statusline), " done.") ; lifestatus(statusline) ; } } /* * Return log2. */ int ghashbase::log2(unsigned int n) { int r = 0 ; while ((n & 1) == 0) { n >>= 1 ; r++ ; } if (n != 1) { lifefatal("Expected power of two!") ; } return r ; } static bigint negone = -1 ; const bigint &ghashbase::getPopulation() { // note: if called during gc, then we cannot call calcPopulation // since that will mess up the gc. if (!popValid) { if (inGC) { needPop = 1 ; return negone ; } else { calcPopulation(root) ; popValid = 1 ; needPop = 0 ; } } return population ; } /* * Finally, we get to run the pattern. We first ensure that all * clearspace ghnodes and the input pattern is never garbage * collected; we turn on garbage collection, and then we invoke our * magic top-level routine passing in clearspace borders that are * guaranteed large enough. */ ghnode *ghashbase::runpattern() { ghnode *n = root ; save(root) ; // do this in case we interrupt generation ensure_hashed() ; okaytogc = 1 ; if (cacheinvalid) { do_gc(1) ; // invalidate the entire cache and recalc leaves cacheinvalid = 0 ; } int depth = ghnode_depth(n) ; ghnode *n2 ; n = pushroot(n) ; depth++ ; n = pushroot(n) ; depth++ ; while (ngens + 2 > depth) { n = pushroot(n) ; depth++ ; } save(zeroghnode(nzeros-1)) ; save(n) ; n2 = getres(n, depth) ; okaytogc = 0 ; clearstack() ; if (halvesdone == 1) { n->res = 0 ; halvesdone = 0 ; } if (poller->isInterrupted()) return 0 ; // indicate it was interrupted n = popzeros(n2) ; generation += pow2step ; return n ; } const char *ghashbase::readmacrocell(char *line) { int n=0 ; g_uintptr_t i=1, nw=0, ne=0, sw=0, se=0, indlen=0 ; int r, d ; ghnode **ind = 0 ; root = 0 ; while (getline(line, 10000)) { if (i >= indlen) { g_uintptr_t nlen = i + indlen + 10 ; ind = (ghnode **)realloc(ind, sizeof(ghnode*) * nlen) ; if (ind == 0) lifefatal("Out of memory (4).") ; while (indlen < nlen) ind[indlen++] = 0 ; } if (line[0] == '#') { switch (line[1]) { char *p, *pp ; // AKT: need to check for explicit rule const char *err ; case 'R': p = line + 2 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp > ' ') pp++ ; *pp = 0 ; err = setrule(p); if (err) return err; break ; case 'G': p = line + 2 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp >= '0' && *pp <= '9') pp++ ; *pp = 0 ; generation = bigint(p) ; break ; // either: // #FRAMES count base inc // or // #FRAME index node case 'F': if (strncmp(line, "#FRAMES ", 8) == 0) { p = line + 8 ; while (*p && *p <= ' ') p++ ; int cnt = atol(p) ; if (cnt < 0 || cnt > MAX_FRAME_COUNT) return "Bad FRAMES line" ; destroytimeline() ; while ('0' <= *p && *p <= '9') p++ ; while (*p && *p <= ' ') p++ ; pp = p ; while ((*pp >= '0' && *pp <= '9') || *pp == ',') pp++ ; if (*pp == 0) return "Bad FRAMES line" ; *pp = 0 ; timeline.start = bigint(p) ; timeline.end = timeline.start ; timeline.next = timeline.end ; p = pp + 1 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp > ' ') pp++ ; *pp = 0 ; if (strchr(p, '^')) { int tbase=0, texpo=0 ; if (sscanf(p, "%d^%d", &tbase, &texpo) != 2 || tbase < 2 || texpo < 0) return "Bad FRAMES line" ; timeline.base = tbase ; timeline.expo = texpo ; timeline.inc = 1 ; while (texpo--) timeline.inc.mul_smallint(tbase) ; } else { timeline.inc = bigint(p) ; // if it's a power of two, we're good int texpo = timeline.inc.lowbitset() ; int tbase = 2 ; bigint test = 1 ; for (int i=0; i MAX_FRAME_COUNT || frameind < 0 || nodeind > i || timeline.framecount != frameind) return "Bad FRAME line" ; timeline.frames.push_back(ind[nodeind]) ; timeline.framecount++ ; timeline.end = timeline.next ; timeline.next += timeline.inc ; } break ; } } else { n = sscanf(line, "%d %" PRIuPTR " %" PRIuPTR " %" PRIuPTR " %" PRIuPTR " %d", &d, &nw, &ne, &sw, &se, &r) ; if (n < 0) // blank line; permit continue ; if (n == 0) { // conversion error in first argument; we allow only if the only // content on the line is whitespace. char *ws = line ; while (*ws && *ws <= ' ') ws++ ; if (*ws > 0) return "Parse error in macrocell format." ; continue ; } if (n < 5) // best not to use lifefatal here because user won't see any // error message when reading clipboard data starting with "[..." return "Parse error in readmacrocell." ; if (d < 1) return "Oops; bad depth in readmacrocell." ; if (d == 1) { if (nw >= (g_uintptr_t)maxCellStates || ne >= (g_uintptr_t)maxCellStates || sw >= (g_uintptr_t)maxCellStates || se >= (g_uintptr_t)maxCellStates) return "Cell state values too high for this algorithm." ; root = ind[i++] = (ghnode *)find_ghleaf((state)nw, (state)ne, (state)sw, (state)se) ; depth = d - 1 ; } else { ind[0] = zeroghnode(d-2) ; /* allow zeros to work right */ if (nw >= i || ind[nw] == 0 || ne >= i || ind[ne] == 0 || sw >= i || ind[sw] == 0 || se >= i || ind[se] == 0) { return "Node out of range in readmacrocell." ; } clearstack() ; root = ind[i++] = find_ghnode(ind[nw], ind[ne], ind[sw], ind[se]) ; depth = d - 1 ; } } } if (ind) free(ind) ; if (root == 0) { // allow empty macrocell pattern; note that endofpattern() // will be called soon so don't set hashed here // return "Invalid macrocell file: no ghnodes." ; return 0 ; } hashed = 1 ; return 0 ; } const char *ghashbase::setrule(const char *) { poller->bailIfCalculating() ; clearcache() ; return 0 ; } /** * Write out the native macrocell format. This is the one we use when * we're not interactive and displaying a progress dialog. */ g_uintptr_t ghashbase::writecell(std::ostream &os, ghnode *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeroghnode(depth)) return 0 ; if (depth == 0) { if (root->nw != 0) return (g_uintptr_t)(root->nw) ; } else { if (marked2(root)) return (g_uintptr_t)(root->next) ; unhash_ghnode(root) ; mark2(root) ; } thiscell = ++cellcounter ; if (depth == 0) { ghleaf *n = (ghleaf *)root ; root->nw = (ghnode *)thiscell ; os << 1 << ' ' << int(n->nw) << ' ' << int(n->ne) << ' ' << int(n->sw) << ' ' << int(n->se) << '\n' ; } else { g_uintptr_t nw = writecell(os, root->nw, depth-1) ; g_uintptr_t ne = writecell(os, root->ne, depth-1) ; g_uintptr_t sw = writecell(os, root->sw, depth-1) ; g_uintptr_t se = writecell(os, root->se, depth-1) ; root->next = (ghnode *)thiscell ; os << depth+1 << ' ' << nw << ' ' << ne << ' ' << sw << ' ' << se << '\n' ; } return thiscell ; } /** * This new two-pass method works by doing a prepass that numbers the * ghnodes and counts the number of ghnodes that should be sent, so we can * display an accurate progress dialog. */ g_uintptr_t ghashbase::writecell_2p1(ghnode *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeroghnode(depth)) return 0 ; if (depth == 0) { if (root->nw != 0) return (g_uintptr_t)(root->nw) ; } else { if (marked2(root)) return (g_uintptr_t)(root->next) ; unhash_ghnode(root) ; mark2(root) ; } if (depth == 0) { thiscell = ++cellcounter ; // note: we *must* not abort this prescan if ((cellcounter & 4095) == 0) lifeabortprogress(0, "Scanning tree") ; root->nw = (ghnode *)thiscell ; } else { writecell_2p1(root->nw, depth-1) ; writecell_2p1(root->ne, depth-1) ; writecell_2p1(root->sw, depth-1) ; writecell_2p1(root->se, depth-1) ; thiscell = ++cellcounter ; // note: we *must* not abort this prescan if ((cellcounter & 4095) == 0) lifeabortprogress(0, "Scanning tree") ; root->next = (ghnode *)thiscell ; } return thiscell ; } /** * This one writes the cells, but assuming they've already been * numbered, and displaying a progress dialog. */ static char progressmsg[80] ; g_uintptr_t ghashbase::writecell_2p2(std::ostream &os, ghnode *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeroghnode(depth)) return 0 ; if (depth == 0) { if (cellcounter + 1 != (g_uintptr_t)(root->nw)) return (g_uintptr_t)(root->nw) ; thiscell = ++cellcounter ; if ((cellcounter & 4095) == 0) { std::streampos siz = os.tellp() ; sprintf(progressmsg, "File size: %.2f MB", double(siz) / 1048576.0) ; lifeabortprogress(thiscell/(double)writecells, progressmsg) ; } ghleaf *n = (ghleaf *)root ; root->nw = (ghnode *)thiscell ; os << 1 << ' ' << int(n->nw) << ' ' << int(n->ne) << ' ' << int(n->sw) << ' ' << int(n->se) << '\n'; } else { if (cellcounter + 1 > (g_uintptr_t)(root->next) || isaborted()) return (g_uintptr_t)(root->next) ; g_uintptr_t nw = writecell_2p2(os, root->nw, depth-1) ; g_uintptr_t ne = writecell_2p2(os, root->ne, depth-1) ; g_uintptr_t sw = writecell_2p2(os, root->sw, depth-1) ; g_uintptr_t se = writecell_2p2(os, root->se, depth-1) ; if (!isaborted() && cellcounter + 1 != (g_uintptr_t)(root->next)) { // this should never happen lifefatal("Internal in writecell_2p2") ; return (g_uintptr_t)(root->next) ; } thiscell = ++cellcounter ; if ((cellcounter & 4095) == 0) { std::streampos siz = os.tellp() ; sprintf(progressmsg, "File size: %.2f MB", double(siz) / 1048576.0) ; lifeabortprogress(thiscell/(double)writecells, progressmsg) ; } root->next = (ghnode *)thiscell ; os << depth+1 << ' ' << nw << ' ' << ne << ' ' << sw << ' ' << se << '\n' ; } return thiscell ; } #define STRINGIFY(arg) STR2(arg) #define STR2(arg) #arg const char *ghashbase::writeNativeFormat(std::ostream &os, char *comments) { int depth = ghnode_depth(root) ; os << "[M2] (golly " STRINGIFY(VERSION) ")\n" ; // AKT: always write out explicit rule os << "#R " << getrule() << '\n' ; if (generation > bigint::zero) { // write non-zero gen count os << "#G " << generation.tostring('\0') << '\n' ; } if (comments && comments[0]) { // write given comment line(s) os << comments; } inGC = 1 ; /* this is the old way: cellcounter = 0 ; writecell(os, root, depth) ; */ /* this is the new two-pass way */ cellcounter = 0 ; vector depths(timeline.framecount) ; int framestosave = timeline.framecount ; if (timeline.savetimeline == 0) framestosave = 0 ; if (framestosave) { for (int i=0; inext << '\n' ; } } writecell_2p2(os, root, depth) ; /* end new two-pass way */ if (framestosave) { for (int i=0; i #include #include #include using namespace std ; // 64x64 is slightly faster on Mac (< 1%) and Win (1 to 2%) // and much faster on Linux/GTK (5 to 40%) const int logpmsize = 6 ; // 6=64x64 7=128x128 8=256x256 const int pmsize = (1< 1) { // store state info int i = (pmsize-1+lly) * pmsize - llx; if (sw) pixbuf[i] = sw; if (se) pixbuf[i+1] = se; i -= pmsize; if (nw) pixbuf[i] = nw; if (ne) pixbuf[i+1] = ne; } else { // store rgb info int i = (pmsize-1+lly) * rowoff - (llx*bpp); if (sw) { pixbuf[i] = cellred[sw] ; pixbuf[i+1] = cellgreen[sw] ; pixbuf[i+2] = cellblue[sw] ; } i += bpp ; if (se) { pixbuf[i] = cellred[se] ; pixbuf[i+1] = cellgreen[se] ; pixbuf[i+2] = cellblue[se] ; } i -= rowoff ; if (ne) { pixbuf[i] = cellred[ne] ; pixbuf[i+1] = cellgreen[ne] ; pixbuf[i+2] = cellblue[ne] ; } i -= bpp ; if (nw) { pixbuf[i] = cellred[nw] ; pixbuf[i+1] = cellgreen[nw] ; pixbuf[i+2] = cellblue[nw] ; } } } void ghashbase::draw4x4_1(ghnode *n, ghnode *z, int llx, int lly) { // AKT: draw all live cells using state 1 color -- nicer to use an average color??? // pmag == 1, so store rgb info int i = (pmsize-1+lly) * rowoff - (llx*bpp); if (n->sw != z) { pixbuf[i] = cellred[1]; pixbuf[i+1] = cellgreen[1]; pixbuf[i+2] = cellblue[1]; } i += bpp; if (n->se != z) { pixbuf[i] = cellred[1]; pixbuf[i+1] = cellgreen[1]; pixbuf[i+2] = cellblue[1]; } i -= rowoff; if (n->ne != z) { pixbuf[i] = cellred[1] ; pixbuf[i+1] = cellgreen[1] ; pixbuf[i+2] = cellblue[1] ; } i -= bpp; if (n->nw != z) { pixbuf[i] = cellred[1] ; pixbuf[i+1] = cellgreen[1] ; pixbuf[i+2] = cellblue[1] ; } } // AKT: kill all cells in pixbuf void ghashbase::killpixels() { if (pmag > 1) { // pixblit assumes pixbuf contains pmsize*pmsize bytes where each byte // is a cell state, so it's easy to kill all cells memset(pixbuf, 0, pmsize*pmsize); } else { // pixblit assumes pixbuf contains 3 bytes (r,g,b) for each pixel if (cellred[0] == cellgreen[0] && cellgreen[0] == cellblue[0]) { // use fast method memset(pixbuf, cellred[0], sizeof(ipixbuf)); } else { // use slow method (or kill the 1st row and memcpy into the other rows???) for (int i = 0; i < ibufsize; i += bpp) { pixbuf[i] = cellred[0]; pixbuf[i+1] = cellgreen[0]; pixbuf[i+2] = cellblue[0]; } } } } void ghashbase::clearrect(int minx, int miny, int w, int h) { // minx,miny is lower left corner if (w <= 0 || h <= 0) return ; if (pmag > 1) { minx *= pmag ; miny *= pmag ; w *= pmag ; h *= pmag ; } miny = uviewh - miny - h ; renderer->killrect(minx, miny, w, h) ; } void ghashbase::renderbm(int x, int y) { // x,y is lower left corner int rx = x ; int ry = y ; int rw = pmsize ; int rh = pmsize ; if (pmag > 1) { rx *= pmag ; ry *= pmag ; rw *= pmag ; rh *= pmag ; } ry = uviewh - ry - rh ; renderer->pixblit(rx, ry, rw, rh, (char *)pixbuf, pmag); killpixels(); } /* * Here, llx and lly are coordinates in screen pixels describing * where the lower left pixel of the screen is. Draw one ghnode. * This is our main recursive routine. */ void ghashbase::drawghnode(ghnode *n, int llx, int lly, int depth, ghnode *z) { int sw = 1 << (depth - mag + 1) ; if (sw >= pmsize && (llx + vieww <= 0 || lly + viewh <= 0 || llx >= sw || lly >= sw)) return ; if (n == z) { if (sw >= pmsize) clearrect(-llx, -lly, sw, sw) ; } else if (depth > 0 && sw > 2) { z = z->nw ; sw >>= 1 ; depth-- ; if (sw == (pmsize >> 1)) { drawghnode(n->sw, 0, 0, depth, z) ; drawghnode(n->se, -(pmsize/2), 0, depth, z) ; drawghnode(n->nw, 0, -(pmsize/2), depth, z) ; drawghnode(n->ne, -(pmsize/2), -(pmsize/2), depth, z) ; renderbm(-llx, -lly) ; } else { drawghnode(n->sw, llx, lly, depth, z) ; drawghnode(n->se, llx-sw, lly, depth, z) ; drawghnode(n->nw, llx, lly-sw, depth, z) ; drawghnode(n->ne, llx-sw, lly-sw, depth, z) ; } } else if (depth > 0 && sw == 2) { draw4x4_1(n, z->nw, llx, lly) ; } else if (sw == 1) { drawpixel(-llx, -lly) ; } else { struct ghleaf *l = (struct ghleaf *)n ; sw >>= 1 ; if (sw == 1) { draw4x4_1(l->sw, l->se, l->nw, l->ne, llx, lly) ; } else { lifefatal("Can't happen") ; } } } /* * Fill in the llxb and llyb bits from the viewport information. * Allocate if necessary. This arithmetic should be done carefully. */ void ghashbase::fill_ll(int d) { pair coor = view->at(0, view->getymax()) ; coor.second.mul_smallint(-1) ; bigint s = 1 ; s <<= d ; coor.first += s ; coor.second += s ; int bitsreq = coor.first.bitsreq() ; int bitsreq2 = coor.second.bitsreq() ; if (bitsreq2 > bitsreq) bitsreq = bitsreq2 ; if (bitsreq <= d) bitsreq = d + 1 ; // need to access llxyb[d] if (bitsreq > llsize) { if (llsize) { delete [] llxb ; delete [] llyb ; } llxb = new char[bitsreq] ; llyb = new char[bitsreq] ; llsize = bitsreq ; } llbits = bitsreq ; coor.first.tochararr(llxb, llbits) ; coor.second.tochararr(llyb, llbits) ; } /* * This is the top-level draw routine that takes the root ghnode. * It maintains four ghnodes onto which the screen fits and uses the * high bits of llx/lly to project those four ghnodes as far down * the tree as possible, so we know we can get away with just * 32-bit arithmetic in the above recursive routine. This way * we don't need any high-precision addition or subtraction to * display an image. */ void ghashbase::draw(viewport &viewarg, liferender &rendererarg) { /* AKT: call killpixels below memset(pixbuf, 0, sizeof(ipixbuf)) ; */ ensure_hashed() ; renderer = &rendererarg ; // AKT: set cellred/green/blue ptrs renderer->getcolors(&cellred, &cellgreen, &cellblue); view = &viewarg ; uvieww = view->getwidth() ; uviewh = view->getheight() ; if (view->getmag() > 0) { pmag = 1 << (view->getmag()) ; mag = 0 ; viewh = ((uviewh - 1) >> view->getmag()) + 1 ; vieww = ((uvieww - 1) >> view->getmag()) + 1 ; uviewh += (-uviewh) & (pmag - 1) ; } else { mag = (-view->getmag()) ; pmag = 1 ; viewh = uviewh ; vieww = uvieww ; } // AKT: must call killpixels after setting pmag killpixels(); int d = depth ; fill_ll(d) ; int maxd = vieww ; int i ; ghnode *z = zeroghnode(d) ; ghnode *sw = root, *nw = z, *ne = z, *se = z ; if (viewh > maxd) maxd = viewh ; int llx=-llxb[llbits-1], lly=-llyb[llbits-1] ; /* Skip down to top of tree. */ for (i=llbits-1; i>d && i>=mag; i--) { /* go down to d, but not further than mag */ llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { clearrect(0, 0, vieww, viewh) ; goto bail ; } } /* Find the lowest four we need to examine */ while (d > 0 && d - mag >= 0 && (d - mag > 28 || (1 << (d - mag)) > 2 * maxd)) { llx = (llx << 1) + llxb[d] ; lly = (lly << 1) + llyb[d] ; if (llx >= 1) { if (lly >= 1) { ne = ne->sw ; nw = nw->se ; se = se->nw ; sw = sw->ne ; lly-- ; } else { ne = se->nw ; nw = sw->ne ; se = se->sw ; sw = sw->se ; } llx-- ; } else { if (lly >= 1) { ne = nw->se ; nw = nw->sw ; se = sw->ne ; sw = sw->nw ; lly-- ; } else { ne = sw->ne ; nw = sw->nw ; se = sw->se ; sw = sw->sw ; } } if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { clearrect(0, 0, vieww, viewh) ; goto bail ; } d-- ; } /* At this point we know we can use 32-bit arithmetic. */ for (i=d; i>=mag; i--) { llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; } /* clear the border *around* the universe if necessary */ if (d + 1 <= mag) { ghnode *z = zeroghnode(d) ; if (llx > 0 || lly > 0 || llx + vieww <= 0 || lly + viewh <= 0 || (sw == z && se == z && nw == z && ne == z)) { clearrect(0, 0, vieww, viewh) ; } else { clearrect(0, 1-lly, vieww, viewh-1+lly) ; clearrect(0, 0, vieww, -lly) ; clearrect(0, -lly, -llx, 1) ; clearrect(1-llx, -lly, vieww-1+llx, 1) ; drawpixel(0, 0) ; renderbm(-llx, -lly) ; } } else { z = zeroghnode(d) ; maxd = 1 << (d - mag + 2) ; clearrect(0, maxd-lly, vieww, viewh-maxd+lly) ; clearrect(0, 0, vieww, -lly) ; clearrect(0, -lly, -llx, maxd) ; clearrect(maxd-llx, -lly, vieww-maxd+llx, maxd) ; if (maxd <= pmsize) { maxd >>= 1 ; drawghnode(sw, 0, 0, d, z) ; drawghnode(se, -maxd, 0, d, z) ; drawghnode(nw, 0, -maxd, d, z) ; drawghnode(ne, -maxd, -maxd, d, z) ; renderbm(-llx, -lly) ; } else { maxd >>= 1 ; drawghnode(sw, llx, lly, d, z) ; drawghnode(se, llx-maxd, lly, d, z) ; drawghnode(nw, llx, lly-maxd, d, z) ; drawghnode(ne, llx-maxd, lly-maxd, d, z) ; } } bail: renderer = 0 ; view = 0 ; } static int getbitsfromleaves(const vector &v) { unsigned short nw=0, ne=0, sw=0, se=0 ; int i; for (i=0; i<(int)v.size(); i++) { ghleaf *p = (ghleaf *)v[i] ; nw |= p->nw ; ne |= p->ne ; sw |= p->sw ; se |= p->se ; } int r = 0 ; // horizontal bits are least significant ones unsigned short w = nw | sw ; unsigned short e = ne | se ; // vertical bits are next 8 unsigned short n = nw | ne ; unsigned short s = sw | se ; if (w) r |= 512 ; if (e) r |= 256 ; if (n) r |= 2 ; if (s) r |= 1 ; return r ; } /** * Copy the vector, but sort it and uniquify it so we don't have a ton * of duplicate ghnodes. */ static void sortunique(vector &dest, vector &src) { swap(src, dest) ; // note: this is superfast sort(dest.begin(), dest.end()) ; vector::iterator new_end = unique(dest.begin(), dest.end()) ; dest.erase(new_end, dest.end()) ; src.clear() ; } using namespace std ; void ghashbase::findedges(bigint *ptop, bigint *pleft, bigint *pbottom, bigint *pright) { // following code is from fit() but all goal/size stuff // has been removed so it finds the exact pattern edges ensure_hashed() ; bigint xmin = -1 ; bigint xmax = 1 ; bigint ymin = -1 ; bigint ymax = 1 ; int currdepth = depth ; int i; if (root == zeroghnode(currdepth)) { // return impossible edges to indicate empty pattern; // not really a problem because caller should check first *ptop = 1 ; *pleft = 1 ; *pbottom = 0 ; *pright = 0 ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; while (currdepth >= -2) { currdepth-- ; if (currdepth == -1) { // we have ghleaf ghnodes; turn them into bitmasks topbm = getbitsfromleaves(top) & 0xff ; bottombm = getbitsfromleaves(bottom) & 0xff ; leftbm = getbitsfromleaves(left) >> 8 ; rightbm = getbitsfromleaves(right) >> 8 ; } if (currdepth == -1) { int sz = 1 << (currdepth + 2) ; int maskhi = (1 << sz) - (1 << (sz >> 1)) ; int masklo = (1 << (sz >> 1)) - 1 ; ymax += ymax ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-2) ; } else { topbm >>= (sz >> 1) ; } ymin += ymin ; if ((bottombm & masklo) == 0) { ymin.add_smallint(2) ; bottombm >>= (sz >> 1) ; } xmax += xmax ; if ((rightbm & masklo) == 0) { xmax.add_smallint(-2) ; rightbm >>= (sz >> 1) ; } xmin += xmin ; if ((leftbm & maskhi) == 0) { xmin.add_smallint(2) ; } else { leftbm >>= (sz >> 1) ; } } else if (currdepth >= 0) { ghnode *z = 0 ; if (hashed) z = zeroghnode(currdepth) ; vector newv ; int outer = 0 ; for (i=0; i<(int)top.size(); i++) { ghnode *t = top[i] ; if (!outer && (t->nw != z || t->ne != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } else { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } } sortunique(top, newv) ; ymax += ymax ; if (!outer) { ymax.add_smallint(-2) ; } outer = 0 ; for (i=0; i<(int)bottom.size(); i++) { ghnode *t = bottom[i] ; if (!outer && (t->sw != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } } sortunique(bottom, newv) ; ymin += ymin ; if (!outer) { ymin.add_smallint(2) ; } outer = 0 ; for (i=0; i<(int)right.size(); i++) { ghnode *t = right[i] ; if (!outer && (t->ne != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } } sortunique(right, newv) ; xmax += xmax ; if (!outer) { xmax.add_smallint(-2) ; } outer = 0 ; for (i=0; i<(int)left.size(); i++) { ghnode *t = left[i] ; if (!outer && (t->nw != z || t->sw != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } else { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } } sortunique(left, newv) ; xmin += xmin ; if (!outer) { xmin.add_smallint(2) ; } } } xmin >>= 1 ; xmax >>= 1 ; ymin >>= 1 ; ymax >>= 1 ; xmin <<= (currdepth + 3) ; ymin <<= (currdepth + 3) ; xmax <<= (currdepth + 3) ; ymax <<= (currdepth + 3) ; xmax -= 1 ; ymax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; // set pattern edges *ptop = ymax ; // due to y flip *pbottom = ymin ; // due to y flip *pleft = xmin ; *pright = xmax ; } void ghashbase::fit(viewport &view, int force) { ensure_hashed() ; bigint xmin = -1 ; bigint xmax = 1 ; bigint ymin = -1 ; bigint ymax = 1 ; int xgoal = view.getwidth() - 2 ; int ygoal = view.getheight() - 2 ; if (xgoal < 8) xgoal = 8 ; if (ygoal < 8) ygoal = 8 ; int xsize = 2 ; int ysize = 2 ; int currdepth = depth ; int i; if (root == zeroghnode(currdepth)) { view.center() ; view.setmag(MAX_MAG) ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; while (currdepth >= 0) { currdepth-- ; if (currdepth == -1) { // we have ghleaf ghnodes; turn them into bitmasks topbm = getbitsfromleaves(top) & 0xff ; bottombm = getbitsfromleaves(bottom) & 0xff ; leftbm = getbitsfromleaves(left) >> 8 ; rightbm = getbitsfromleaves(right) >> 8 ; } if (currdepth == -1) { int sz = 1 << (currdepth + 2) ; int maskhi = (1 << sz) - (1 << (sz >> 1)) ; int masklo = (1 << (sz >> 1)) - 1 ; ymax += ymax ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-2) ; ysize-- ; } else { topbm >>= (sz >> 1) ; } ymin += ymin ; if ((bottombm & masklo) == 0) { ymin.add_smallint(2) ; ysize-- ; bottombm >>= (sz >> 1) ; } xmax += xmax ; if ((rightbm & masklo) == 0) { xmax.add_smallint(-2) ; xsize-- ; rightbm >>= (sz >> 1) ; } xmin += xmin ; if ((leftbm & maskhi) == 0) { xmin.add_smallint(2) ; xsize-- ; } else { leftbm >>= (sz >> 1) ; } xsize <<= 1 ; ysize <<= 1 ; } else if (currdepth >= 0) { ghnode *z = 0 ; if (hashed) z = zeroghnode(currdepth) ; vector newv ; int outer = 0 ; for (i=0; i<(int)top.size(); i++) { ghnode *t = top[i] ; if (!outer && (t->nw != z || t->ne != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } else { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } } top = newv ; newv.clear() ; ymax += ymax ; if (!outer) { ymax.add_smallint(-2) ; ysize-- ; } outer = 0 ; for (i=0; i<(int)bottom.size(); i++) { ghnode *t = bottom[i] ; if (!outer && (t->sw != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } } bottom = newv ; newv.clear() ; ymin += ymin ; if (!outer) { ymin.add_smallint(2) ; ysize-- ; } ysize *= 2 ; outer = 0 ; for (i=0; i<(int)right.size(); i++) { ghnode *t = right[i] ; if (!outer && (t->ne != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } } right = newv ; newv.clear() ; xmax += xmax ; if (!outer) { xmax.add_smallint(-2) ; xsize-- ; } outer = 0 ; for (i=0; i<(int)left.size(); i++) { ghnode *t = left[i] ; if (!outer && (t->nw != z || t->sw != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } else { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } } left = newv ; newv.clear() ; xmin += xmin ; if (!outer) { xmin.add_smallint(2) ; xsize-- ; } xsize *= 2 ; } if (xsize > xgoal || ysize > ygoal) break ; } if (currdepth < 0){ xmin >>= -currdepth ; ymin >>= -currdepth ; xmax >>= -currdepth ; ymax >>= -currdepth ; } else { xmin <<= currdepth ; ymin <<= currdepth ; xmax <<= currdepth ; ymax <<= currdepth ; } xmax -= 1 ; ymax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; if (!force) { // if all four of the above dimensions are in the viewport, don't change if (view.contains(xmin, ymin) && view.contains(xmax, ymax)) return ; } xmin += xmax ; xmin >>= 1 ; ymin += ymax ; ymin >>= 1 ; int mag = - currdepth - 1 ; while (xsize <= xgoal && ysize <= ygoal && mag < MAX_MAG) { mag++ ; xsize *= 2 ; ysize *= 2 ; } view.setpositionmag(xmin, ymin, mag) ; } void ghashbase::lowerRightPixel(bigint &x, bigint &y, int mag) { if (mag >= 0) return ; x >>= -mag ; x <<= -mag ; y -= 1 ; y >>= -mag ; y <<= -mag ; y += 1 ; } golly-2.5-src/gollybase/hlifealgo.cpp0000644000175100001440000016371512156145314014647 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /* * hlife 0.99 by Radical Eye Software. * * All good ideas here were originated by Gosper or Bell or others, I'm * sure, and all bad ones by yours truly. * * The main reason I wrote this program was to attempt to push out the * evaluation of metacatacryst as far as I could. So this program * really does very little other than compute life as far into the * future as possible, using as little memory as possible (and reusing * it if necessary). No UI, few options. */ #include "hlifealgo.h" #include "util.h" #include #include #include using namespace std ; /* * Prime hash sizes tend to work best. */ static g_uintptr_t nextprime(g_uintptr_t i) { g_uintptr_t j ; i |= 1 ; for (;; i+=2) { for (j=3; j*j<=i; j+=2) if (i % j == 0) break ; if (j*j > i) return i ; } } /* * Note that all the places we represent 4-squares by short, we use * unsigned shorts; this is so we can directly index into these arrays. */ static unsigned char shortpop[65536] ; /* * The cached result of an 8-square is a new 4-square representing * two generations into the future. This subroutine calculates that * future, assuming ruletable is calculated (see below). The code * that it uses is similar to code you'll see again, so we explain * what's going on in some detail. * * Each time we build a leaf node, we compute the result, because it * is reasonably quick. * * The first generation result of an 8-square is a 6-square, which * we represent as nine 2-squares. The nine 2-squares are called * t00 through t22, and are arranged in a matrix: * * t00 t01 t02 * t10 t11 t12 * t20 t21 t22 * * To compute each of these, we need to extract the relevant bits * from the four 4-square values n->nw, n->ne, n->sw, and n->ne. * We can use these values to directly index into the ruletable * array. * * Then, given the nine values, we can compute a resulting 4-square * by computing four 2-square results, and combining these into a * single 4-square. * * It's a bit intricate, but it's not really overwhelming. */ #define combine9(t00,t01,t02,t10,t11,t12,t20,t21,t22) \ ((t00) << 15) | ((t01) << 13) | (((t02) << 11) & 0x1000) | \ (((t10) << 7) & 0x880) | ((t11) << 5) | (((t12) << 3) & 0x110) | \ (((t20) >> 1) & 0x8) | ((t21) >> 3) | ((t22) >> 5) void hlifealgo::leafres(leaf *n) { unsigned short t00 = ruletable[n->nw], t01 = ruletable[((n->nw << 2) & 0xcccc) | ((n->ne >> 2) & 0x3333)], t02 = ruletable[n->ne], t10 = ruletable[((n->nw << 8) & 0xff00) | ((n->sw >> 8) & 0x00ff)], t11 = ruletable[((n->nw << 10) & 0xcc00) | ((n->ne << 6) & 0x3300) | ((n->sw >> 6) & 0x00cc) | ((n->se >> 10) & 0x0033)], t12 = ruletable[((n->ne << 8) & 0xff00) | ((n->se >> 8) & 0x00ff)], t20 = ruletable[n->sw], t21 = ruletable[((n->sw << 2) & 0xcccc) | ((n->se >> 2) & 0x3333)], t22 = ruletable[n->se] ; n->res1 = combine9(t00,t01,t02,t10,t11,t12,t20,t21,t22) ; n->res2 = (ruletable[(t00 << 10) | (t01 << 8) | (t10 << 2) | t11] << 10) | (ruletable[(t01 << 10) | (t02 << 8) | (t11 << 2) | t12] << 8) | (ruletable[(t10 << 10) | (t11 << 8) | (t20 << 2) | t21] << 2) | ruletable[(t11 << 10) | (t12 << 8) | (t21 << 2) | t22] ; n->leafpop = shortpop[n->nw] + shortpop[n->ne] + shortpop[n->sw] + shortpop[n->se] ; } /* * We do now support garbage collection, but there are some routines we * call frequently to help us. */ #define node_hash(a,b,c,d) (65537*(g_uintptr_t)(d)+257*(g_uintptr_t)(c)+17*(g_uintptr_t)(b)+5*(g_uintptr_t)(a)) #define leaf_hash(a,b,c,d) (65537*(d)+257*(c)+17*(b)+5*(a)) /* * Resize the hash. */ void hlifealgo::resize() { g_uintptr_t i, nhashprime = nextprime(2 * hashprime) ; node *p, **nhashtab ; if (alloced > maxmem || nhashprime * sizeof(node *) > (maxmem - alloced)) { hashlimit = G_MAX ; return ; } /* * Don't let the hash table buckets take more than 4% of the * memory. If we're starting to strain memory, let the buckets * fill up a bit more. */ if (nhashprime > (maxmem/(25*sizeof(int *)))) { nhashprime = nextprime(maxmem/(25*sizeof(int *))) ; if (nhashprime == hashprime) { hashlimit = G_MAX ; return ; } } if (verbose) { strcpy(statusline, "Resizing hash...") ; lifestatus(statusline) ; } nhashtab = (node **)calloc(nhashprime, sizeof(node *)) ; if (nhashtab == 0) { lifewarning("Out of memory; running in a somewhat slower mode; " "try reducing the hash memory limit after restarting.") ; hashlimit = G_MAX ; return ; } alloced += sizeof(node *) * (nhashprime - hashprime) ; for (i=0; inext ; g_uintptr_t h ; if (is_node(p)) { h = node_hash(p->nw, p->ne, p->sw, p->se) ; } else { leaf *l = (leaf *)p ; h = leaf_hash(l->nw, l->ne, l->sw, l->se) ; } h %= nhashprime ; p->next = nhashtab[h] ; nhashtab[h] = p ; p = np ; } } free(hashtab) ; hashtab = nhashtab ; hashprime = nhashprime ; hashlimit = hashprime ; if (verbose) { strcpy(statusline+strlen(statusline), " done.") ; lifestatus(statusline) ; } } /* * These next two routines are (nearly) our only hash table access * routines; we simply look up the passed in information. If we * find it in the hash table, we return it; otherwise, we build a * new node and store it in the hash table, and return that. */ node *hlifealgo::find_node(node *nw, node *ne, node *sw, node *se) { node *p ; g_uintptr_t h = node_hash(nw,ne,sw,se) ; node *pred = 0 ; h = h % hashprime ; for (p=hashtab[h]; p; p = p->next) { /* make sure to compare nw *first* */ if (nw == p->nw && ne == p->ne && sw == p->sw && se == p->se) { if (pred) { /* move this one to the front */ pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = p ; } return save(p) ; } pred = p ; } p = newnode() ; p->nw = nw ; p->ne = ne ; p->sw = sw ; p->se = se ; p->res = 0 ; p->next = hashtab[h] ; hashtab[h] = p ; hashpop++ ; if (hashpop > hashlimit) resize() ; return save(p) ; } void hlifealgo::unhash_node(node *n) { node *p ; g_uintptr_t h = node_hash(n->nw,n->ne,n->sw,n->se) ; node *pred = 0 ; h = h % hashprime ; for (p=hashtab[h]; p; p = p->next) { if (p == n) { if (pred) pred->next = p->next ; else hashtab[h] = p->next ; return ; } pred = p ; } lifefatal("Didn't find node to unhash") ; } void hlifealgo::rehash_node(node *n) { g_uintptr_t h = node_hash(n->nw,n->ne,n->sw,n->se) ; h = h % hashprime ; n->next = hashtab[h] ; hashtab[h] = n ; } leaf *hlifealgo::find_leaf(unsigned short nw, unsigned short ne, unsigned short sw, unsigned short se) { leaf *p ; leaf *pred = 0 ; g_uintptr_t h = leaf_hash(nw, ne, sw, se) ; h = h % hashprime ; for (p=(leaf *)hashtab[h]; p; p = (leaf *)p->next) { if (nw == p->nw && ne == p->ne && sw == p->sw && se == p->se && !is_node(p)) { if (pred) { pred->next = p->next ; p->next = hashtab[h] ; hashtab[h] = (node *)p ; } return (leaf *)save((node *)p) ; } pred = p ; } p = newleaf() ; p->nw = nw ; p->ne = ne ; p->sw = sw ; p->se = se ; leafres(p) ; p->isnode = 0 ; p->next = hashtab[h] ; hashtab[h] = (node *)p ; hashpop++ ; if (hashpop > hashlimit) resize() ; return (leaf *)save((node *)p) ; } /* * The following routine does the same, but first it checks to see if * the cached result is any good. If it is, it directly returns that. * Otherwise, it figures out whether to call the leaf routine or the * non-leaf routine by whether two nodes down is a leaf node or not. * (We'll understand why this is a bit later.) All the sp stuff is * stack pointer and garbage collection stuff. */ node *hlifealgo::getres(node *n, int depth) { if (n->res) return n->res ; node *res = 0 ; /** * This routine be the only place we assign to res. We use * the fact that the poll routine is *sticky* to allow us to * manage unwinding the stack without munging our data * structures. Note that there may be many find_nodes * and getres called before we finally actually exit from * here, because the stack is deep and we don't want to * put checks throughout the code. Instead we need two * calls here, one to prevent us going deeper, and another * to prevent us from destroying the cache field. */ if (poller->poll()) return zeronode(depth-1) ; int sp = gsp ; depth-- ; if (ngens >= depth) { if (is_node(n->nw)) { res = dorecurs(n->nw, n->ne, n->sw, n->se, depth) ; } else { res = (node *)dorecurs_leaf((leaf *)n->nw, (leaf *)n->ne, (leaf *)n->sw, (leaf *)n->se) ; } } else { if (halvesdone < 1000) halvesdone++ ; if (is_node(n->nw)) { res = dorecurs_half(n->nw, n->ne, n->sw, n->se, depth) ; } else if (ngens == 0) { res = (node *)dorecurs_leaf_quarter((leaf *)n->nw, (leaf *)n->ne, (leaf *)n->sw, (leaf *)n->se) ; } else { res = (node *)dorecurs_leaf_half((leaf *)n->nw, (leaf *)n->ne, (leaf *)n->sw, (leaf *)n->se) ; } } pop(sp) ; if (poller->isInterrupted()) // don't assign this to the cache field! res = zeronode(depth) ; else n->res = res ; return res ; } /* * So let's say the cached way failed. How do we do it the slow way? * Recursively, of course. For an n-square (composed of the four * n/2-squares passed in, compute the n/2-square that is n/4 * generations ahead. * * This routine works exactly the same as the leafres() routine, only * instead of working on an 8-square, we're working on an n-square, * returning an n/2-square, and we build that n/2-square by first building * 9 n/4-squares, use those to calculate 4 more n/4-squares, and * then put these together into a new n/2-square. Simple, eh? */ node *hlifealgo::dorecurs(node *n, node *ne, node *t, node *e, int depth) { int sp = gsp ; node *t00 = getres(n, depth), *t01 = getres(find_node(n->ne, ne->nw, n->se, ne->sw), depth), *t02 = getres(ne, depth), *t12 = getres(find_node(ne->sw, ne->se, e->nw, e->ne), depth), *t11 = getres(find_node(n->se, ne->sw, t->ne, e->nw), depth), *t10 = getres(find_node(n->sw, n->se, t->nw, t->ne), depth), *t20 = getres(t, depth), *t21 = getres(find_node(t->ne, e->nw, t->se, e->sw), depth), *t22 = getres(e, depth), *t44 = getres(find_node(t11, t12, t21, t22), depth), *t43 = getres(find_node(t10, t11, t20, t21), depth), *t33 = getres(find_node(t00, t01, t10, t11), depth), *t34 = getres(find_node(t01, t02, t11, t12), depth) ; n = find_node(t33, t34, t43, t44) ; pop(sp) ; return save(n) ; } /* * Same as above, but we only do one step instead of 2. */ node *hlifealgo::dorecurs_half(node *n, node *ne, node *t, node *e, int depth) { int sp = gsp ; node *t00 = getres(n, depth), *t01 = getres(find_node(n->ne, ne->nw, n->se, ne->sw), depth), *t10 = getres(find_node(n->sw, n->se, t->nw, t->ne), depth), *t11 = getres(find_node(n->se, ne->sw, t->ne, e->nw), depth), *t02 = getres(ne, depth), *t12 = getres(find_node(ne->sw, ne->se, e->nw, e->ne), depth), *t20 = getres(t, depth), *t21 = getres(find_node(t->ne, e->nw, t->se, e->sw), depth), *t22 = getres(e, depth) ; if (depth > 3) { n = find_node(find_node(t00->se, t01->sw, t10->ne, t11->nw), find_node(t01->se, t02->sw, t11->ne, t12->nw), find_node(t10->se, t11->sw, t20->ne, t21->nw), find_node(t11->se, t12->sw, t21->ne, t22->nw)) ; } else { n = find_node((node *)find_leaf(((leaf *)t00)->se, ((leaf *)t01)->sw, ((leaf *)t10)->ne, ((leaf *)t11)->nw), (node *)find_leaf(((leaf *)t01)->se, ((leaf *)t02)->sw, ((leaf *)t11)->ne, ((leaf *)t12)->nw), (node *)find_leaf(((leaf *)t10)->se, ((leaf *)t11)->sw, ((leaf *)t20)->ne, ((leaf *)t21)->nw), (node *)find_leaf(((leaf *)t11)->se, ((leaf *)t12)->sw, ((leaf *)t21)->ne, ((leaf *)t22)->nw)) ; } pop(sp) ; return save(n) ; } /* * If the node is a 16-node, then the constituents are leaves, so we * need a very similar but still somewhat different subroutine. Since * we do not (yet) garbage collect leaves, we don't need all that * save/pop mumbo-jumbo. */ leaf *hlifealgo::dorecurs_leaf(leaf *n, leaf *ne, leaf *t, leaf *e) { unsigned short t00 = n->res2, t01 = find_leaf(n->ne, ne->nw, n->se, ne->sw)->res2, t02 = ne->res2, t10 = find_leaf(n->sw, n->se, t->nw, t->ne)->res2, t11 = find_leaf(n->se, ne->sw, t->ne, e->nw)->res2, t12 = find_leaf(ne->sw, ne->se, e->nw, e->ne)->res2, t20 = t->res2, t21 = find_leaf(t->ne, e->nw, t->se, e->sw)->res2, t22 = e->res2 ; return find_leaf(find_leaf(t00, t01, t10, t11)->res2, find_leaf(t01, t02, t11, t12)->res2, find_leaf(t10, t11, t20, t21)->res2, find_leaf(t11, t12, t21, t22)->res2) ; } /* * Same as above but we only do two generations. */ #define combine4(t00,t01,t10,t11) (unsigned short)\ ((((t00)<<10)&0xcc00)|(((t01)<<6)&0x3300)|(((t10)>>6)&0xcc)|(((t11)>>10)&0x33)) leaf *hlifealgo::dorecurs_leaf_half(leaf *n, leaf *ne, leaf *t, leaf *e) { unsigned short t00 = n->res2, t01 = find_leaf(n->ne, ne->nw, n->se, ne->sw)->res2, t02 = ne->res2, t10 = find_leaf(n->sw, n->se, t->nw, t->ne)->res2, t11 = find_leaf(n->se, ne->sw, t->ne, e->nw)->res2, t12 = find_leaf(ne->sw, ne->se, e->nw, e->ne)->res2, t20 = t->res2, t21 = find_leaf(t->ne, e->nw, t->se, e->sw)->res2, t22 = e->res2 ; return find_leaf(combine4(t00, t01, t10, t11), combine4(t01, t02, t11, t12), combine4(t10, t11, t20, t21), combine4(t11, t12, t21, t22)) ; } /* * Same as above but we only do one generation. */ leaf *hlifealgo::dorecurs_leaf_quarter(leaf *n, leaf *ne, leaf *t, leaf *e) { unsigned short t00 = n->res1, t01 = find_leaf(n->ne, ne->nw, n->se, ne->sw)->res1, t02 = ne->res1, t10 = find_leaf(n->sw, n->se, t->nw, t->ne)->res1, t11 = find_leaf(n->se, ne->sw, t->ne, e->nw)->res1, t12 = find_leaf(ne->sw, ne->se, e->nw, e->ne)->res1, t20 = t->res1, t21 = find_leaf(t->ne, e->nw, t->se, e->sw)->res1, t22 = e->res1 ; return find_leaf(combine4(t00, t01, t10, t11), combine4(t01, t02, t11, t12), combine4(t10, t11, t20, t21), combine4(t11, t12, t21, t22)) ; } /* * We keep free nodes in a linked list for allocation, and we allocate * them 1000 at a time. */ node *hlifealgo::newnode() { node *r ; if (freenodes == 0) { int i ; freenodes = (node *)calloc(1001, sizeof(node)) ; if (freenodes == 0) lifefatal("Out of memory; try reducing the hash memory limit.") ; alloced += 1001 * sizeof(node) ; freenodes->next = nodeblocks ; nodeblocks = freenodes++ ; for (i=0; i<999; i++) { freenodes[1].next = freenodes ; freenodes++ ; } totalthings += 1000 ; } if (freenodes->next == 0 && alloced + 1000 * sizeof(node) > maxmem && okaytogc) { do_gc(0) ; } r = freenodes ; freenodes = freenodes->next ; return r ; } /* * Leaves are the same. */ leaf *hlifealgo::newleaf() { return (leaf *)newnode() ; } /* * Sometimes we want the new node or leaf to be automatically cleared * for us. */ node *hlifealgo::newclearednode() { return (node *)memset(newnode(), 0, sizeof(node)) ; } leaf *hlifealgo::newclearedleaf() { return (leaf *)memset(newleaf(), 0, sizeof(leaf)) ; } hlifealgo::hlifealgo() { int i ; /* * The population of one-bits in an integer is one more than the * population of one-bits in the integer with one fewer bit set, * and we can turn off a bit by anding an integer with the next * lower integer. */ if (shortpop[1] == 0) for (i=1; i<65536; i++) shortpop[i] = shortpop[i & (i - 1)] + 1 ; hashprime = nextprime(1000) ; hashlimit = hashprime ; hashpop = 0 ; hashtab = (node **)calloc(hashprime, sizeof(node *)) ; if (hashtab == 0) lifefatal("Out of memory (1).") ; alloced += hashprime * sizeof(node *) ; ngens = 0 ; stacksize = 0 ; halvesdone = 0 ; nzeros = 0 ; stack = 0 ; gsp = 0 ; alloced = 0 ; maxmem = 256 * 1024 * 1024 ; freenodes = 0 ; okaytogc = 0 ; totalthings = 0 ; nodeblocks = 0 ; zeronodea = 0 ; ruletable = hliferules.rule0 ; /* * We initialize our universe to be a 16-square. We are in drawing * mode at this point. */ root = (node *)newclearednode() ; population = 0 ; generation = 0 ; increment = 1 ; setincrement = 1 ; nonpow2 = 1 ; pow2step = 1 ; llsize = 0 ; depth = 3 ; hashed = 0 ; popValid = 0 ; needPop = 0 ; inGC = 0 ; cacheinvalid = 0 ; gccount = 0 ; gcstep = 0 ; } /** * Destructor frees memory. */ hlifealgo::~hlifealgo() { free(hashtab) ; while (nodeblocks) { node *r = nodeblocks ; nodeblocks = nodeblocks->next ; free(r) ; } if (zeronodea) free(zeronodea) ; if (stack) free(stack) ; if (llsize) { delete [] llxb ; delete [] llyb ; } } /** * Set increment. */ void hlifealgo::setIncrement(bigint inc) { increment = inc ; } /** * Do a step. */ void hlifealgo::step() { poller->bailIfCalculating() ; // we use while here because the increment may be changed while we are // doing the hashtable sweep; if that happens, we may need to sweep // again. int cleareddownto = 1000000000 ; while (increment != setincrement) { bigint pendingincrement = increment ; int newpow2 = 0 ; bigint t = pendingincrement ; while (t > 0 && t.even()) { newpow2++ ; t.div2() ; } nonpow2 = t.low31() ; if (t != nonpow2) lifefatal("bad increment") ; int downto = newpow2 ; if (ngens < newpow2) downto = ngens ; if (newpow2 != ngens && cleareddownto > downto) { new_ngens(newpow2) ; cleareddownto = downto ; } else { ngens = newpow2 ; } setincrement = pendingincrement ; pow2step = 1 ; while (newpow2--) pow2step += pow2step ; } gcstep = 0 ; for (int i=0; iisInterrupted()) // we *were* interrupted break ; popValid = 0 ; root = newroot ; } depth = node_depth(root) ; extendtimeline() ; } void hlifealgo::setcurrentstate(void *n) { if (root != (node *)n) { root = (node *)n ; depth = node_depth(root) ; popValid = 0 ; } } /* * Set the max memory */ void hlifealgo::setMaxMemory(int newmemlimit) { if (newmemlimit < 10) newmemlimit = 10 ; #ifndef GOLLY64BIT else if (newmemlimit > 4000) newmemlimit = 4000 ; #endif g_uintptr_t newlimit = ((g_uintptr_t)newmemlimit) << 20 ; if (alloced > newlimit) { lifewarning("Sorry, more memory currently used than allowed.") ; return ; } maxmem = newlimit ; hashlimit = hashprime ; } /** * Clear everything. */ void hlifealgo::clearall() { lifefatal("clearall not implemented yet") ; } /* * This routine expands our universe by a factor of two, maintaining * centering. We use four new nodes, and *reuse* the root so this cannot * be called after we've started hashing. */ void hlifealgo::pushroot_1() { node *t ; t = newclearednode() ; t->se = root->nw ; root->nw = t ; t = newclearednode() ; t->sw = root->ne ; root->ne = t ; t = newclearednode() ; t->ne = root->sw ; root->sw = t ; t = newclearednode() ; t->nw = root->se ; root->se = t ; depth++ ; } /* * Return the depth of this node (2 is 8x8). */ int hlifealgo::node_depth(node *n) { int depth = 2 ; while (is_node(n)) { depth++ ; n = n->nw ; } return depth ; } /* * This routine returns the canonical clear space node at a particular * depth. */ node *hlifealgo::zeronode(int depth) { while (depth >= nzeros) { int nnzeros = 2 * nzeros + 10 ; zeronodea = (node **)realloc(zeronodea, nnzeros * sizeof(node *)) ; if (zeronodea == 0) lifefatal("Out of memory (2).") ; alloced += (nnzeros - nzeros) * sizeof(node *) ; while (nzeros < nnzeros) zeronodea[nzeros++] = 0 ; } if (zeronodea[depth] == 0) { if (depth == 2) { zeronodea[depth] = (node *)find_leaf(0, 0, 0, 0) ; } else { node *z = zeronode(depth-1) ; zeronodea[depth] = find_node(z, z, z, z) ; } } return zeronodea[depth] ; } /* * Same, but with hashed nodes. */ node *hlifealgo::pushroot(node *n) { int depth = node_depth(n) ; node *z = zeronode(depth-1) ; return find_node(find_node(z, z, z, n->nw), find_node(z, z, n->ne, z), find_node(z, n->sw, z, z), find_node(n->se, z, z, z)) ; } /* * Here is our recursive routine to set a bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. We allocate new nodes and * leaves on our way down. * * Note that at this point our universe lives outside the hash table * and has not been canonicalized, and that many of the pointers in * the nodes can be null. We'll patch this up in due course. */ node *hlifealgo::setbit(node *n, int x, int y, int newstate, int depth) { if (depth == 2) { leaf *l = (leaf *)n ; if (hashed) { unsigned short nw = l->nw ; unsigned short sw = l->sw ; unsigned short ne = l->ne ; unsigned short se = l->se ; if (newstate) { if (x < 0) if (y < 0) sw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else nw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else if (y < 0) se |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else ne |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; } else { if (x < 0) if (y < 0) sw &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else nw &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else if (y < 0) se &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else ne &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; } return save((node *)find_leaf(nw, ne, sw, se)) ; } if (newstate) { if (x < 0) if (y < 0) l->sw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else l->nw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else if (y < 0) l->se |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else l->ne |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; } else { if (x < 0) if (y < 0) l->sw &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else l->nw &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else if (y < 0) l->se &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; else l->ne &= ~(1 << (3 - (x & 3) + 4 * (y & 3))) ; } return (node *)l ; } else { unsigned int w = 0, wh = 0 ; if (depth >= 31) { if (depth == this->depth) wh = 0x80000000 ; } else { w = 1 << depth ; wh = 1 << (depth - 1) ; } depth-- ; node **nptr ; if (x < 0) { if (y < 0) nptr = &(n->sw) ; else nptr = &(n->nw) ; } else { if (y < 0) nptr = &(n->se) ; else nptr = &(n->ne) ; } if (*nptr == 0) { if (depth == 2) *nptr = (node *)newclearedleaf() ; else *nptr = newclearednode() ; } node *s = setbit(*nptr, (x & (w - 1)) - wh, (y & (w - 1)) - wh, newstate, depth) ; if (hashed) { node *nw = n->nw ; node *sw = n->sw ; node *ne = n->ne ; node *se = n->se ; if (x < 0) { if (y < 0) sw = s ; else nw = s ; } else { if (y < 0) se = s ; else ne = s ; } n = save(find_node(nw, ne, sw, se)) ; } else { *nptr = s ; } return n ; } } /* * Here is our recursive routine to get a bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. */ int hlifealgo::getbit(node *n, int x, int y, int depth) { if (depth == 2) { leaf *l = (leaf *)n ; int test = 0 ; if (x < 0) if (y < 0) test = (l->sw & (1 << (3 - (x & 3) + 4 * (y & 3)))) ; else test = (l->nw & (1 << (3 - (x & 3) + 4 * (y & 3)))) ; else if (y < 0) test = (l->se & (1 << (3 - (x & 3) + 4 * (y & 3)))) ; else test = (l->ne & (1 << (3 - (x & 3) + 4 * (y & 3)))) ; if (test) return 1 ; return 0 ; } else { unsigned int w = 0, wh = 0 ; if (depth >= 31) { if (depth == this->depth) wh = 0x80000000 ; } else { w = 1 << depth ; wh = 1 << (depth - 1) ; } depth-- ; node *nptr ; if (x < 0) { if (y < 0) nptr = n->sw ; else nptr = n->nw ; } else { if (y < 0) nptr = n->se ; else nptr = n->ne ; } if (nptr == 0 || nptr == zeronode(depth)) return 0 ; return getbit(nptr, (x & (w - 1)) - wh, (y & (w - 1)) - wh, depth) ; } } /* * Here is our recursive routine to get the next bit in our universe. We * pass in a depth, and walk the space. Again, a lot of bit twiddling, * but really not all that complicated. */ int hlifealgo::nextbit(node *n, int x, int y, int depth) { if (n == 0 || n == zeronode(depth)) return -1 ; if (depth == 2) { leaf *l = (leaf *)n ; int test = 0 ; if (y < 0) test = (((l->sw >> (4 * (y & 3))) & 15) << 4) | ((l->se >> (4 * (y & 3))) & 15) ; else test = (((l->nw >> (4 * (y & 3))) & 15) << 4) | ((l->ne >> (4 * (y & 3))) & 15) ; test &= (1 << (4 - x)) - 1 ; if (test) { int r = 0 ; int b = 1 << (3 - x) ; while ((test & b) == 0) { r++ ; b >>= 1 ; } return r ; } return -1 ; // none found } else { unsigned int w = 0, wh = 0 ; w = 1 << depth ; wh = 1 << (depth - 1) ; node *lft, *rght ; depth-- ; if (y < 0) { lft = n->sw ; rght = n->se ; } else { lft = n->nw ; rght = n->ne ; } int r = 0 ; if (x < 0) { int t = nextbit(lft, (x & (w-1)) - wh, (y & (w - 1)) - wh, depth) ; if (t >= 0) return t ; r = -x ; x = 0 ; } int t = nextbit(rght, (x & (w-1)) - wh, (y & (w - 1)) - wh, depth) ; if (t >= 0) return r + t ; return -1 ; } } /* * Our nonrecurse top-level bit setting routine simply expands the * universe as necessary to encompass the passed-in coordinates, and * then invokes the recursive setbit. Right now it works hashed or * unhashed (but it's faster when unhashed). We also turn on the inGC * flag to inhibit popcount. */ int hlifealgo::setcell(int x, int y, int newstate) { if (newstate & ~1) return -1 ; if (hashed) { clearstack() ; save(root) ; okaytogc = 1 ; } inGC = 1 ; y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } while (sx > 0 || sx < -1 || sy > 0 || sy < -1) { if (hashed) { root = save(pushroot(root)) ; depth++ ; } else { pushroot_1() ; } sx >>= 1 ; sy >>= 1 ; } root = setbit(root, x, y, newstate, depth) ; if (hashed) { okaytogc = 0 ; } return 0 ; } /* * Our nonrecurse top-level bit getting routine. */ int hlifealgo::getcell(int x, int y) { y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } if (sx > 0 || sx < -1 || sy > 0 || sy < -1) return 0 ; return getbit(root, x, y, depth) ; } /* * A recursive bit getting routine, but this one returns the * number of pixels to the right to the next set cell in the * current universe, or -1 if none set to the right, or if * the next set pixel is out of range. */ int hlifealgo::nextcell(int x, int y, int &v) { v = 1 ; y = - y ; int sx = x ; int sy = y ; if (depth <= 31) { sx >>= depth ; sy >>= depth ; } else { sx >>= 31 ; sy >>= 31 ; } while (sx > 0 || sx < -1 || sy > 0 || sy < -1) { if (hashed) { root = save(pushroot(root)) ; depth++ ; } else { pushroot_1() ; } sx >>= 1 ; sy >>= 1 ; } if (depth > 30) { struct node tnode = *root ; int mdepth = depth ; while (mdepth > 30) { tnode.nw = tnode.nw->se ; tnode.ne = tnode.ne->sw ; tnode.sw = tnode.sw->ne ; tnode.se = tnode.se->nw ; mdepth-- ; } return nextbit(&tnode, x, y, mdepth) ; } return nextbit(root, x, y, depth) ; } /* * Canonicalize a universe by filling in the null pointers and then * invoking find_node on each node. Drops the original universe on * the floor [big deal, it's probably small anyway]. */ node *hlifealgo::hashpattern(node *root, int depth) { node *r ; if (root == 0) { r = zeronode(depth) ; } else if (depth == 2) { leaf *n = (leaf *)root ; r = (node *)find_leaf(n->nw, n->ne, n->sw, n->se) ; n->next = freenodes ; freenodes = root ; } else { depth-- ; r = find_node(hashpattern(root->nw, depth), hashpattern(root->ne, depth), hashpattern(root->sw, depth), hashpattern(root->se, depth)) ; root->next = freenodes ; freenodes = root ; } return r ; } void hlifealgo::endofpattern() { poller->bailIfCalculating() ; if (!hashed) { root = hashpattern(root, depth) ; hashed = 1 ; } popValid = 0 ; needPop = 0 ; inGC = 0 ; } void hlifealgo::ensure_hashed() { if (!hashed) endofpattern() ; } /* * Pop off any levels we don't need. */ node *hlifealgo::popzeros(node *n) { int depth = node_depth(n) ; while (depth > 3) { node *z = zeronode(depth-2) ; if (n->nw->nw == z && n->nw->ne == z && n->nw->sw == z && n->ne->nw == z && n->ne->ne == z && n->ne->se == z && n->sw->nw == z && n->sw->sw == z && n->sw->se == z && n->se->ne == z && n->se->sw == z && n->se->se == z) { depth-- ; n = find_node(n->nw->se, n->ne->sw, n->sw->ne, n->se->nw) ; } else { break ; } } return n ; } /* * A lot of the routines from here on down traverse the universe, hanging * information off the nodes. The way they generally do so is by using * (or abusing) the cache (res) field, and the least significant bit of * the hash next field (as a visited bit). */ #define marked(n) (1 & (g_uintptr_t)(n)->next) #define mark(n) ((n)->next = (node *)(1 | (g_uintptr_t)(n)->next)) #define clearmark(n) ((n)->next = (node *)(~1 & (g_uintptr_t)(n)->next)) #define clearmarkbit(p) ((node *)(~1 & (g_uintptr_t)(p))) /* * Sometimes we want to use *res* instead of next to mark. You cannot * do this to leaves, though. */ #define marked2(n) (1 & (g_uintptr_t)(n)->res) #define mark2(n) ((n)->res = (node *)(1 | (g_uintptr_t)(n)->res)) #define clearmark2(n) ((n)->res = (node *)(~1 & (g_uintptr_t)(n)->res)) static void sum4(bigint &dest, const bigint &a, const bigint &b, const bigint &c, const bigint &d) { dest = a ; dest += b ; dest += c ; dest += d ; } /* * This recursive routine calculates the population by hanging the * population on marked nodes. */ const bigint &hlifealgo::calcpop(node *root, int depth) { if (root == zeronode(depth)) return bigint::zero ; if (depth == 2) { root->nw = 0 ; bigint &r = *(bigint *)&(root->nw) ; leaf *n = (leaf *)root ; r = n->leafpop ; return r ; } else if (marked2(root)) { return *(bigint*)&(root->next) ; } else { depth-- ; unhash_node(root) ; /** * We use the memory in root->next as a value bigint. But we want to * make sure the copy constructor doesn't "clean up" something that * doesn't exist. So we clear it to zero here. */ root->next = (node *)0 ; // I wish I could come up with a cleaner way sum4(*(bigint *)&(root->next), calcpop(root->nw, depth), calcpop(root->ne, depth), calcpop(root->sw, depth), calcpop(root->se, depth)) ; mark2(root) ; return *(bigint *)&(root->next) ; } } /* * Call this after doing something that unhashes nodes in order to * use the next field as a temp pointer. */ void hlifealgo::aftercalcpop2(node *root, int depth, int cleanbigints) { if (root == zeronode(depth)) return ; if (depth == 2) { root->nw = 0 ; // all these bigints are guaranteed to be small return ; } if (marked2(root)) { clearmark2(root) ; depth-- ; aftercalcpop2(root->nw, depth, cleanbigints) ; aftercalcpop2(root->ne, depth, cleanbigints) ; aftercalcpop2(root->sw, depth, cleanbigints) ; aftercalcpop2(root->se, depth, cleanbigints) ; if (cleanbigints) *(bigint *)&(root->next) = bigint::zero ; // clean up; yuck! rehash_node(root) ; } } /* * This top level routine calculates the population of a universe. */ void hlifealgo::calcPopulation(node *root) { int depth ; ensure_hashed() ; depth = node_depth(root) ; population = calcpop(root, depth) ; aftercalcpop2(root, depth, 1) ; } /* * Is the universe empty? */ int hlifealgo::isEmpty() { ensure_hashed() ; return root == zeronode(depth) ; } /* * This routine marks a node as needed to be saved. */ node *hlifealgo::save(node *n) { if (gsp >= stacksize) { int nstacksize = stacksize * 2 + 100 ; alloced += sizeof(node *)*(nstacksize-stacksize) ; stack = (node **)realloc(stack, nstacksize * sizeof(node *)) ; if (stack == 0) lifefatal("Out of memory (3).") ; stacksize = nstacksize ; } stack[gsp++] = n ; return n ; } /* * This routine pops the stack back to a previous depth. */ void hlifealgo::pop(int n) { gsp = n ; } /* * This routine clears the stack altogether. */ void hlifealgo::clearstack() { gsp = 0 ; } /* * Do a gc. Walk down from all nodes reachable on the stack, saveing * them by setting the odd bit on the next link. Then, walk the hash, * eliminating the res from everything that's not saveed, and moving * the nodes from the hash to the freelist as appropriate. Finally, * walk the hash again, clearing the low order bits in the next pointers. */ void hlifealgo::gc_mark(node *root, int invalidate) { if (!marked(root)) { mark(root) ; if (is_node(root)) { gc_mark(root->nw, invalidate) ; gc_mark(root->ne, invalidate) ; gc_mark(root->sw, invalidate) ; gc_mark(root->se, invalidate) ; if (root->res) { if (invalidate) root->res = 0 ; else gc_mark(root->res, invalidate) ; } } } } /** * If the invalidate flag is set, we want to kill *all* cache entries * and recalculate all leaves. */ void hlifealgo::do_gc(int invalidate) { int i ; g_uintptr_t freed_nodes=0 ; node *p, *pp ; inGC = 1 ; gccount++ ; gcstep++ ; if (verbose) { if (gcstep > 1) sprintf(statusline, "GC #%d(%d) ", gccount, gcstep) ; else sprintf(statusline, "GC #%d ", gccount) ; lifestatus(statusline) ; } for (i=nzeros-1; i>=0; i--) if (zeronodea[i] != 0) break ; if (i >= 0) gc_mark(zeronodea[i], 0) ; // never invalidate zeronode for (i=0; ipoll() ; gc_mark(stack[i], invalidate) ; } for (i=0; inext) { poller->poll() ; for (pp=p+1, i=1; i<1001; i++, pp++) { if (marked(pp)) { g_uintptr_t h = 0 ; if (pp->nw) { /* yes, it's a node */ h = node_hash(pp->nw, pp->ne, pp->sw, pp->se) % hashprime ; } else { leaf *lp = (leaf *)pp ; if (invalidate) leafres(lp) ; h = leaf_hash(lp->nw, lp->ne, lp->sw, lp->se) % hashprime ; } pp->next = hashtab[h] ; hashtab[h] = pp ; hashpop++ ; } else { pp->next = freenodes ; freenodes = pp ; freed_nodes++ ; } } } inGC = 0 ; if (verbose) { int perc = (int)(freed_nodes / (totalthings / 100)) ; sprintf(statusline+strlen(statusline), " freed %d percent (%d).", perc, (int)freed_nodes) ; lifestatus(statusline) ; } if (needPop) { calcPopulation(root) ; popValid = 1 ; needPop = 0 ; poller->updatePop() ; } } /* * Clear the cache bits down to the appropriate level, marking the * nodes we've handled. */ void hlifealgo::clearcache(node *n, int depth, int clearto) { if (!marked(n)) { mark(n) ; if (depth > 3) { depth-- ; poller->poll() ; clearcache(n->nw, depth, clearto) ; clearcache(n->ne, depth, clearto) ; clearcache(n->sw, depth, clearto) ; clearcache(n->se, depth, clearto) ; if (n->res) clearcache(n->res, depth, clearto) ; } if (depth >= clearto) n->res = 0 ; } } /* * Clear the entire cache of everything, and recalculate all leaves. * This can be very expensive. */ void hlifealgo::clearcache() { cacheinvalid = 1 ; } /* * Change the ngens value. Requires us to walk the hash, clearing * the cache fields of any nodes that do not have the appropriate * values. */ void hlifealgo::new_ngens(int newval) { g_uintptr_t i ; node *p, *pp ; int clearto = ngens ; if (newval > ngens && halvesdone == 0) { ngens = newval ; return ; } if (verbose) { strcpy(statusline, "Changing increment...") ; lifestatus(statusline) ; } if (newval < clearto) clearto = newval ; clearto++ ; /* clear this depth and above */ if (clearto < 3) clearto = 3 ; ngens = newval ; inGC = 1 ; for (i=0; inext)) if (is_node(p) && !marked(p)) clearcache(p, node_depth(p), clearto) ; for (p=nodeblocks; p; p=p->next) { poller->poll() ; for (pp=p+1, i=1; i<1001; i++, pp++) clearmark(pp) ; } halvesdone = 0 ; inGC = 0 ; if (needPop) { calcPopulation(root) ; popValid = 1 ; needPop = 0 ; poller->updatePop() ; } if (verbose) { strcpy(statusline+strlen(statusline), " done.") ; lifestatus(statusline) ; } } /* * Return log2. */ int hlifealgo::log2(unsigned int n) { int r = 0 ; while ((n & 1) == 0) { n >>= 1 ; r++ ; } if (n != 1) { lifefatal("Expected power of two!") ; } return r ; } static bigint negone = -1 ; const bigint &hlifealgo::getPopulation() { // note: if called during gc, then we cannot call calcPopulation // since that will mess up the gc. if (!popValid) { if (inGC) { needPop = 1 ; return negone ; } else { calcPopulation(root) ; popValid = 1 ; needPop = 0 ; } } return population ; } /* * Finally, we get to run the pattern. We first ensure that all * clearspace nodes and the input pattern is never garbage * collected; we turn on garbage collection, and then we invoke our * magic top-level routine passing in clearspace borders that are * guaranteed large enough. */ node *hlifealgo::runpattern() { node *n = root ; save(root) ; // do this in case we interrupt generation ensure_hashed() ; okaytogc = 1 ; if (cacheinvalid) { do_gc(1) ; // invalidate the entire cache and recalc leaves cacheinvalid = 0 ; } int depth = node_depth(n) ; node *n2 ; n = pushroot(n) ; depth++ ; n = pushroot(n) ; depth++ ; while (ngens + 2 > depth) { n = pushroot(n) ; depth++ ; } save(zeronode(nzeros-1)) ; save(n) ; n2 = getres(n, depth) ; okaytogc = 0 ; clearstack() ; if (halvesdone == 1) { n->res = 0 ; halvesdone = 0 ; } if (poller->isInterrupted()) return 0 ; // indicate it was interrupted n = popzeros(n2) ; generation += pow2step ; return n ; } const char *hlifealgo::readmacrocell(char *line) { int n=0 ; g_uintptr_t i=1, nw=0, ne=0, sw=0, se=0, indlen=0 ; int r, d ; node **ind = 0 ; root = 0 ; while (getline(line, 10000)) { if (i >= indlen) { g_uintptr_t nlen = i + indlen + 10 ; ind = (node **)realloc(ind, sizeof(node*) * nlen) ; if (ind == 0) lifefatal("Out of memory (4).") ; while (indlen < nlen) ind[indlen++] = 0 ; } if (line[0] == '.' || line[0] == '*' || line[0] == '$') { int x=0, y=7 ; unsigned short lnw=0, lne=0, lsw=0, lse=0 ; char *p = 0 ; for (p=line; *p > ' '; p++) { switch(*p) { case '*': if (x > 7 || y < 0) return "Illegal coordinates in readmacrocell." ; if (x < 4) if (y < 4) lsw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else lnw |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else if (y < 4) lse |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; else lne |= 1 << (3 - (x & 3) + 4 * (y & 3)) ; /* note: fall through here */ case '.': x++ ; break ; case '$': x = 0 ; y-- ; break ; default: return "Illegal character in readmacrocell." ; } } clearstack() ; ind[i++] = (node *)find_leaf(lnw, lne, lsw, lse) ; } else if (line[0] == '#') { switch (line[1]) { char *p, *pp ; const char *err ; case 'R': p = line + 2 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp > ' ') pp++ ; *pp = 0 ; // AKT: need to check for B0-not-Smax rule err = hliferules.setrule(p, this); if (err) return err; if (hliferules.alternate_rules) return "B0-not-Smax rules are not allowed in HashLife."; break ; case 'G': p = line + 2 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp >= '0' && *pp <= '9') pp++ ; *pp = 0 ; generation = bigint(p) ; break ; // either: // #FRAMES count base inc // or // #FRAME index node case 'F': if (strncmp(line, "#FRAMES ", 8) == 0) { p = line + 8 ; while (*p && *p <= ' ') p++ ; int cnt = atol(p) ; if (cnt < 0 || cnt > MAX_FRAME_COUNT) return "Bad FRAMES line" ; destroytimeline() ; while ('0' <= *p && *p <= '9') p++ ; while (*p && *p <= ' ') p++ ; pp = p ; while ((*pp >= '0' && *pp <= '9') || *pp == ',') pp++ ; if (*pp == 0) return "Bad FRAMES line" ; *pp = 0 ; timeline.start = bigint(p) ; timeline.end = timeline.start ; timeline.next = timeline.start ; p = pp + 1 ; while (*p && *p <= ' ') p++ ; pp = p ; while (*pp > ' ') pp++ ; *pp = 0 ; if (strchr(p, '^')) { int tbase=0, texpo=0 ; if (sscanf(p, "%d^%d", &tbase, &texpo) != 2 || tbase < 2 || texpo < 0) return "Bad FRAMES line" ; timeline.base = tbase ; timeline.expo = texpo ; timeline.inc = 1 ; while (texpo--) timeline.inc.mul_smallint(tbase) ; } else { timeline.inc = bigint(p) ; // if it's a power of two, we're good int texpo = timeline.inc.lowbitset() ; int tbase = 2 ; bigint test = 1 ; for (int i=0; i MAX_FRAME_COUNT || frameind < 0 || nodeind > i || timeline.framecount != frameind) return "Bad FRAME line" ; timeline.frames.push_back(ind[nodeind]) ; timeline.framecount++ ; timeline.end = timeline.next ; timeline.next += timeline.inc ; } break ; } } else { n = sscanf(line, "%d %" PRIuPTR " %" PRIuPTR " %" PRIuPTR " %" PRIuPTR " %d", &d, &nw, &ne, &sw, &se, &r) ; if (n < 0) // blank line; permit continue ; if (n == 0) { // conversion error in first argument; we allow only if the only // content on the line is whitespace. char *ws = line ; while (*ws && *ws <= ' ') ws++ ; if (*ws > 0) return "Parse error in macrocell format." ; continue ; } if (n < 5) // AKT: best not to use lifefatal here because user won't see any // error message when reading clipboard data starting with "[..." return "Parse error in readmacrocell." ; if (d < 4) return "Oops; bad depth in readmacrocell." ; ind[0] = zeronode(d-2) ; /* allow zeros to work right */ if (nw >= i || ind[nw] == 0 || ne >= i || ind[ne] == 0 || sw >= i || ind[sw] == 0 || se >= i || ind[se] == 0) { return "Node out of range in readmacrocell." ; } clearstack() ; root = ind[i++] = find_node(ind[nw], ind[ne], ind[sw], ind[se]) ; depth = d - 1 ; } } if (ind) free(ind) ; if (root == 0) { // AKT: allow empty macrocell pattern; note that endofpattern() // will be called soon so don't set hashed here // return "Invalid macrocell file: no nodes." ; return 0 ; } hashed = 1 ; return 0 ; } const char *hlifealgo::setrule(const char *s) { poller->bailIfCalculating() ; const char* err = hliferules.setrule(s, this); if (err) return err; clearcache() ; if (hliferules.alternate_rules) return "B0-not-Smax rules are not allowed in HashLife."; if (hliferules.isHexagonal()) grid_type = HEX_GRID; else if (hliferules.isVonNeumann()) grid_type = VN_GRID; else grid_type = SQUARE_GRID; return 0 ; } void hlifealgo::unpack8x8(unsigned short nw, unsigned short ne, unsigned short sw, unsigned short se, unsigned int *top, unsigned int *bot) { *top = ((nw & 0xf000) << 16) | (((ne & 0xf000) | (nw & 0xf00)) << 12) | (((ne & 0xf00) | (nw & 0xf0)) << 8) | (((ne & 0xf0) | (nw & 0xf)) << 4) | (ne & 0xf) ; *bot = ((sw & 0xf000) << 16) | (((se & 0xf000) | (sw & 0xf00)) << 12) | (((se & 0xf00) | (sw & 0xf0)) << 8) | (((se & 0xf0) | (sw & 0xf)) << 4) | (se & 0xf) ; } /** * Write out the native macrocell format. This is the one we use when * we're not interactive and displaying a progress dialog. */ g_uintptr_t hlifealgo::writecell(std::ostream &os, node *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeronode(depth)) return 0 ; if (depth == 2) { if (root->nw != 0) return (g_uintptr_t)(root->nw) ; } else { if (marked2(root)) return (g_uintptr_t)(root->next) ; unhash_node(root) ; mark2(root) ; } if (depth == 2) { int i, j ; unsigned int top, bot ; leaf *n = (leaf *)root ; thiscell = ++cellcounter ; root->nw = (node *)thiscell ; unpack8x8(n->nw, n->ne, n->sw, n->se, &top, &bot) ; for (j=7; (top | bot) && j>=0; j--) { int bits = (top >> 24) ; top = (top << 8) | (bot >> 24) ; bot = (bot << 8) ; for (i=0; bits && i<8; i++, bits = (bits << 1) & 255) if (bits & 128) os << '*' ; else os << '.' ; os << '$' ; } os << '\n' ; } else { g_uintptr_t nw = writecell(os, root->nw, depth-1) ; g_uintptr_t ne = writecell(os, root->ne, depth-1) ; g_uintptr_t sw = writecell(os, root->sw, depth-1) ; g_uintptr_t se = writecell(os, root->se, depth-1) ; thiscell = ++cellcounter ; root->next = (node *)thiscell ; os << depth+1 << ' ' << nw << ' ' << ne << ' ' << sw << ' ' << se << '\n'; } return thiscell ; } /** * This new two-pass method works by doing a prepass that numbers the * nodes and counts the number of nodes that should be sent, so we can * display an accurate progress dialog. */ g_uintptr_t hlifealgo::writecell_2p1(node *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeronode(depth)) return 0 ; if (depth == 2) { if (root->nw != 0) return (g_uintptr_t)(root->nw) ; } else { if (marked2(root)) return (g_uintptr_t)(root->next) ; unhash_node(root) ; mark2(root) ; } if (depth == 2) { thiscell = ++cellcounter ; // note: we *must* not abort this prescan if ((cellcounter & 4095) == 0) lifeabortprogress(0, "Scanning tree") ; root->nw = (node *)thiscell ; } else { writecell_2p1(root->nw, depth-1) ; writecell_2p1(root->ne, depth-1) ; writecell_2p1(root->sw, depth-1) ; writecell_2p1(root->se, depth-1) ; thiscell = ++cellcounter ; // note: we *must* not abort this prescan if ((cellcounter & 4095) == 0) lifeabortprogress(0, "Scanning tree") ; root->next = (node *)thiscell ; } return thiscell ; } /** * This one writes the cells, but assuming they've already been * numbered, and displaying a progress dialog. */ static char progressmsg[80] ; g_uintptr_t hlifealgo::writecell_2p2(std::ostream &os, node *root, int depth) { g_uintptr_t thiscell = 0 ; if (root == zeronode(depth)) return 0 ; if (depth == 2) { if (cellcounter + 1 != (g_uintptr_t)(root->nw)) return (g_uintptr_t)(root->nw) ; thiscell = ++cellcounter ; if ((cellcounter & 4095) == 0) { std::streampos siz = os.tellp(); sprintf(progressmsg, "File size: %.2f MB", double(siz) / 1048576.0) ; lifeabortprogress(thiscell/(double)writecells, progressmsg) ; } int i, j ; unsigned int top, bot ; leaf *n = (leaf *)root ; root->nw = (node *)thiscell ; unpack8x8(n->nw, n->ne, n->sw, n->se, &top, &bot) ; for (j=7; (top | bot) && j>=0; j--) { int bits = (top >> 24) ; top = (top << 8) | (bot >> 24) ; bot = (bot << 8) ; for (i=0; bits && i<8; i++, bits = (bits << 1) & 255) if (bits & 128) os << '*' ; else os << '.' ; os << '$' ; } os << '\n' ; } else { if (cellcounter + 1 > (g_uintptr_t)(root->next) || isaborted()) return (g_uintptr_t)(root->next) ; g_uintptr_t nw = writecell_2p2(os, root->nw, depth-1) ; g_uintptr_t ne = writecell_2p2(os, root->ne, depth-1) ; g_uintptr_t sw = writecell_2p2(os, root->sw, depth-1) ; g_uintptr_t se = writecell_2p2(os, root->se, depth-1) ; if (!isaborted() && cellcounter + 1 != (g_uintptr_t)(root->next)) { // this should never happen lifefatal("Internal in writecell_2p2") ; return (g_uintptr_t)(root->next) ; } thiscell = ++cellcounter ; if ((cellcounter & 4095) == 0) { std::streampos siz = os.tellp(); sprintf(progressmsg, "File size: %.2f MB", double(siz) / 1048576.0) ; lifeabortprogress(thiscell/(double)writecells, progressmsg) ; } root->next = (node *)thiscell ; os << depth+1 << ' ' << nw << ' ' << ne << ' ' << sw << ' ' << se << '\n'; } return thiscell ; } #define STRINGIFY(arg) STR2(arg) #define STR2(arg) #arg const char *hlifealgo::writeNativeFormat(std::ostream &os, char *comments) { int depth = node_depth(root) ; os << "[M2] (golly " STRINGIFY(VERSION) ")\n" ; // AKT: always write out explicit rule os << "#R " << hliferules.getrule() << '\n' ; if (generation > bigint::zero) { // write non-zero gen count os << "#G " << generation.tostring('\0') << '\n' ; } if (comments && comments[0]) { // write given comment line(s) os << comments; } inGC = 1 ; /* this is the old way: cellcounter = 0 ; writecell(f, root, depth) ; */ /* this is the new two-pass way */ cellcounter = 0 ; vector depths(timeline.framecount) ; int framestosave = timeline.framecount ; if (timeline.savetimeline == 0) framestosave = 0 ; if (framestosave) { for (int i=0; inext << '\n' ; } } writecell_2p2(os, root, depth) ; /* end new two-pass way */ if (framestosave) { for (int i=0; i #include #include #include using namespace std ; const int logbmsize = 7 ; // 6=64x64 7=128x128 8=256x256 const int bmsize = (1<> 3)] |= (128 >> (x & 7)) ; } /* * Draw a 4x4 area yielding 1x1, 2x2, or 4x4 pixels. */ void draw4x4_1(unsigned short sw, unsigned short se, unsigned short nw, unsigned short ne, int llx, int lly) { unsigned char *p = bigbuf + ((bmsize-1+lly) << (logbmsize-3)) + ((-llx) >> 3) ; int bit = 128 >> ((-llx) & 0x7) ; if (sw) *p |= bit ; if (se) *p |= (bit >> 1) ; p -= byteoff ; if (nw) *p |= bit ; if (ne) *p |= (bit >> 1) ; } void draw4x4_1(node *n, node *z, int llx, int lly) { unsigned char *p = bigbuf + ((bmsize-1+lly) << (logbmsize-3)) + ((-llx) >> 3) ; int bit = 128 >> ((-llx) & 0x7) ; if (n->sw != z) *p |= bit ; if (n->se != z) *p |= (bit >> 1) ; p -= byteoff ; if (n->nw != z) *p |= bit ; if (n->ne != z) *p |= (bit >> 1) ; } static unsigned char compress4x4[256] ; static bool inited = false; void draw4x4_2(unsigned short bits1, unsigned short bits2, int llx, int lly) { unsigned char *p = bigbuf + ((bmsize-1+lly) << (logbmsize-3)) + ((-llx) >> 3) ; int mask = (((-llx) & 0x4) ? 0x0f : 0xf0) ; int db = ((bits1 | (bits1 << 4)) & 0xf0f0) + ((bits2 | (bits2 >> 4)) & 0x0f0f) ; p[0] |= mask & compress4x4[db & 255] ; p[-byteoff] |= mask & compress4x4[db >> 8] ; } void draw4x4_4(unsigned short bits1, unsigned short bits2, int llx, int lly) { unsigned char *p = bigbuf + ((bmsize-1+lly) << (logbmsize-3)) + ((-llx) >> 3) ; p[0] = (unsigned char)(((bits1 << 4) & 0xf0) + (bits2 & 0xf)) ; p[-byteoff] = (unsigned char)((bits1 & 0xf0) + ((bits2 >> 4) & 0xf)) ; p[-2*byteoff] = (unsigned char)(((bits1 >> 4) & 0xf0) + ((bits2 >> 8) & 0xf)) ; p[-3*byteoff] = (unsigned char)(((bits1 >> 8) & 0xf0) + ((bits2 >> 12) & 0xf)) ; } void hlifealgo::clearrect(int minx, int miny, int w, int h) { // minx,miny is lower left corner if (w <= 0 || h <= 0) return ; if (pmag > 1) { minx *= pmag ; miny *= pmag ; w *= pmag ; h *= pmag ; } miny = uviewh - miny - h ; renderer->killrect(minx, miny, w, h) ; } void hlifealgo::renderbm(int x, int y) { // x,y is lower left corner int rx = x ; int ry = y ; int rw = bmsize ; int rh = bmsize ; if (pmag > 1) { rx *= pmag ; ry *= pmag ; rw *= pmag ; rh *= pmag ; } ry = uviewh - ry - rh ; // AKT: eventually we'll draw directly into pixbuf rather than bigbuf!!! if (pmag > 1) { // convert each bigbuf byte into 8 bytes of state data int j = 0; for (int i = 0; i < ibufsize * 4; i++) { int byte = bigbuf[i]; for (int bit = 128; bit > 0; bit >>= 1) { pixbuf[j++] = (byte & bit) ? 1 : 0; } } } else { // convert each bigbuf byte into 24 bytes of pixel data (8 * rgb) int j = 0; for (int i = 0; i < ibufsize * 4; i++) { int byte = bigbuf[i]; for (int bit = 128; bit > 0; bit >>= 1) { if (byte & bit) { pixbuf[j++] = liver; pixbuf[j++] = liveg; pixbuf[j++] = liveb; } else { pixbuf[j++] = deadr; pixbuf[j++] = deadg; pixbuf[j++] = deadb; } } } } renderer->pixblit(rx, ry, rw, rh, (char *)pixbuf, pmag); memset(bigbuf, 0, sizeof(ibigbuf)) ; } /* * Here, llx and lly are coordinates in screen pixels describing * where the lower left pixel of the screen is. Draw one node. * This is our main recursive routine. */ void hlifealgo::drawnode(node *n, int llx, int lly, int depth, node *z) { int sw = 1 << (depth - mag + 1) ; if (sw >= bmsize && (llx + vieww <= 0 || lly + viewh <= 0 || llx >= sw || lly >= sw)) return ; if (n == z) { if (sw >= bmsize) clearrect(-llx, -lly, sw, sw) ; } else if (depth > 2 && sw > 2) { z = z->nw ; sw >>= 1 ; depth-- ; if (sw == (bmsize >> 1)) { drawnode(n->sw, 0, 0, depth, z) ; drawnode(n->se, -(bmsize/2), 0, depth, z) ; drawnode(n->nw, 0, -(bmsize/2), depth, z) ; drawnode(n->ne, -(bmsize/2), -(bmsize/2), depth, z) ; renderbm(-llx, -lly) ; } else { drawnode(n->sw, llx, lly, depth, z) ; drawnode(n->se, llx-sw, lly, depth, z) ; drawnode(n->nw, llx, lly-sw, depth, z) ; drawnode(n->ne, llx-sw, lly-sw, depth, z) ; } } else if (depth > 2 && sw == 2) { draw4x4_1(n, z->nw, llx, lly) ; } else if (sw == 1) { drawpixel(-llx, -lly) ; } else { struct leaf *l = (struct leaf *)n ; sw >>= 1 ; if (sw == 1) { draw4x4_1(l->sw, l->se, l->nw, l->ne, llx, lly) ; } else if (sw == 2) { draw4x4_2(l->sw, l->se, llx, lly) ; draw4x4_2(l->nw, l->ne, llx, lly-sw) ; } else { draw4x4_4(l->sw, l->se, llx, lly) ; draw4x4_4(l->nw, l->ne, llx, lly-sw) ; } } } /* * Fill in the llxb and llyb bits from the viewport information. * Allocate if necessary. This arithmetic should be done carefully. */ void hlifealgo::fill_ll(int d) { pair coor = view->at(0, view->getymax()) ; coor.second.mul_smallint(-1) ; bigint s = 1 ; s <<= d ; coor.first += s ; coor.second += s ; int bitsreq = coor.first.bitsreq() ; int bitsreq2 = coor.second.bitsreq() ; if (bitsreq2 > bitsreq) bitsreq = bitsreq2 ; if (bitsreq <= d) bitsreq = d + 1 ; // need to access llxyb[d] if (bitsreq > llsize) { if (llsize) { delete [] llxb ; delete [] llyb ; } llxb = new char[bitsreq] ; llyb = new char[bitsreq] ; llsize = bitsreq ; } llbits = bitsreq ; coor.first.tochararr(llxb, llbits) ; coor.second.tochararr(llyb, llbits) ; } static void init_compress4x4() { int i; for (i=0; i<8; i++) compress4x4[((size_t)1)<> 1)) ; for (i=0; i<256; i++) if (i & (i-1)) compress4x4[i] = compress4x4[i & (i-1)] | compress4x4[i & -i] ; } /* * This is the top-level draw routine that takes the root node. * It maintains four nodes onto which the screen fits and uses the * high bits of llx/lly to project those four nodes as far down * the tree as possible, so we know we can get away with just * 32-bit arithmetic in the above recursive routine. This way * we don't need any high-precision addition or subtraction to * display an image. */ void hlifealgo::draw(viewport &viewarg, liferender &rendererarg) { if (!inited) { init_compress4x4() ; inited = true; } memset(bigbuf, 0, sizeof(ibigbuf)) ; ensure_hashed() ; renderer = &rendererarg ; // AKT: get cell colors unsigned char *r, *g, *b; renderer->getcolors(&r, &g, &b); deadr = r[0]; deadg = g[0]; deadb = b[0]; liver = r[1]; liveg = g[1]; liveb = b[1]; view = &viewarg ; uvieww = view->getwidth() ; uviewh = view->getheight() ; if (view->getmag() > 0) { pmag = 1 << (view->getmag()) ; mag = 0 ; viewh = ((uviewh - 1) >> view->getmag()) + 1 ; vieww = ((uvieww - 1) >> view->getmag()) + 1 ; uviewh += (-uviewh) & (pmag - 1) ; } else { mag = (-view->getmag()) ; pmag = 1 ; viewh = uviewh ; vieww = uvieww ; } int d = depth ; fill_ll(d) ; int maxd = vieww ; int i ; node *z = zeronode(d) ; node *sw = root, *nw = z, *ne = z, *se = z ; if (viewh > maxd) maxd = viewh ; int llx=-llxb[llbits-1], lly=-llyb[llbits-1] ; /* Skip down to top of tree. */ for (i=llbits-1; i>d && i>=mag; i--) { /* go down to d, but not further than mag */ llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { clearrect(0, 0, vieww, viewh) ; goto bail ; } } /* Find the lowest four we need to examine */ while (d > 2 && d - mag >= 0 && (d - mag > 28 || (1 << (d - mag)) > 2 * maxd)) { llx = (llx << 1) + llxb[d] ; lly = (lly << 1) + llyb[d] ; if (llx >= 1) { if (lly >= 1) { ne = ne->sw ; nw = nw->se ; se = se->nw ; sw = sw->ne ; lly-- ; } else { ne = se->nw ; nw = sw->ne ; se = se->sw ; sw = sw->se ; } llx-- ; } else { if (lly >= 1) { ne = nw->se ; nw = nw->sw ; se = sw->ne ; sw = sw->nw ; lly-- ; } else { ne = sw->ne ; nw = sw->nw ; se = sw->se ; sw = sw->sw ; } } if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { clearrect(0, 0, vieww, viewh) ; goto bail ; } d-- ; } /* At this point we know we can use 32-bit arithmetic. */ for (i=d; i>=mag; i--) { llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; } /* clear the border *around* the universe if necessary */ if (d + 1 <= mag) { node *z = zeronode(d) ; if (llx > 0 || lly > 0 || llx + vieww <= 0 || lly + viewh <= 0 || (sw == z && se == z && nw == z && ne == z)) { clearrect(0, 0, vieww, viewh) ; } else { clearrect(0, 1-lly, vieww, viewh-1+lly) ; clearrect(0, 0, vieww, -lly) ; clearrect(0, -lly, -llx, 1) ; clearrect(1-llx, -lly, vieww-1+llx, 1) ; drawpixel(0, 0) ; renderbm(-llx, -lly) ; } } else { z = zeronode(d) ; maxd = 1 << (d - mag + 2) ; clearrect(0, maxd-lly, vieww, viewh-maxd+lly) ; clearrect(0, 0, vieww, -lly) ; clearrect(0, -lly, -llx, maxd) ; clearrect(maxd-llx, -lly, vieww-maxd+llx, maxd) ; if (maxd <= bmsize) { maxd >>= 1 ; drawnode(sw, 0, 0, d, z) ; drawnode(se, -maxd, 0, d, z) ; drawnode(nw, 0, -maxd, d, z) ; drawnode(ne, -maxd, -maxd, d, z) ; renderbm(-llx, -lly) ; } else { maxd >>= 1 ; drawnode(sw, llx, lly, d, z) ; drawnode(se, llx-maxd, lly, d, z) ; drawnode(nw, llx, lly-maxd, d, z) ; drawnode(ne, llx-maxd, lly-maxd, d, z) ; } } bail: renderer = 0 ; view = 0 ; } int getbitsfromleaves(const vector &v) { unsigned short nw=0, ne=0, sw=0, se=0 ; int i; for (i=0; i<(int)v.size(); i++) { leaf *p = (leaf *)v[i] ; nw |= p->nw ; ne |= p->ne ; sw |= p->sw ; se |= p->se ; } int r = 0 ; // horizontal bits are least significant ones unsigned short w = nw | sw ; unsigned short e = ne | se ; // vertical bits are next 8 unsigned short n = nw | ne ; unsigned short s = sw | se ; for (i=0; i<4; i++) { if (w & (0x1111 << i)) r |= 0x1000 << i ; if (e & (0x1111 << i)) r |= 0x100 << i ; if (n & (0xf << (4 * i))) r |= 0x10 << i ; if (s & (0xf << (4 * i))) r |= 0x1 << i ; } return r ; } /** * Copy the vector, but sort it and uniquify it so we don't have a ton * of duplicate nodes. */ void sortunique(vector &dest, vector &src) { swap(src, dest) ; // note: this is superfast sort(dest.begin(), dest.end()) ; vector::iterator new_end = unique(dest.begin(), dest.end()) ; dest.erase(new_end, dest.end()) ; src.clear() ; } void hlifealgo::findedges(bigint *ptop, bigint *pleft, bigint *pbottom, bigint *pright) { // AKT: following code is from fit() but all goal/size stuff // has been removed so it finds the exact pattern edges ensure_hashed() ; bigint xmin = -1 ; bigint xmax = 1 ; bigint ymin = -1 ; bigint ymax = 1 ; int currdepth = depth ; int i; if (root == zeronode(currdepth)) { // AKT: return impossible edges to indicate empty pattern; // not really a problem because caller should check first *ptop = 1 ; *pleft = 1 ; *pbottom = 0 ; *pright = 0 ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; while (currdepth >= 0) { currdepth-- ; if (currdepth == 1) { // we have leaf nodes; turn them into bitmasks topbm = getbitsfromleaves(top) & 0xff ; bottombm = getbitsfromleaves(bottom) & 0xff ; leftbm = getbitsfromleaves(left) >> 8 ; rightbm = getbitsfromleaves(right) >> 8 ; } if (currdepth <= 1) { int sz = 1 << (currdepth + 2) ; int maskhi = (1 << sz) - (1 << (sz >> 1)) ; int masklo = (1 << (sz >> 1)) - 1 ; ymax += ymax ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-2) ; } else { topbm >>= (sz >> 1) ; } ymin += ymin ; if ((bottombm & masklo) == 0) { ymin.add_smallint(2) ; bottombm >>= (sz >> 1) ; } xmax += xmax ; if ((rightbm & masklo) == 0) { xmax.add_smallint(-2) ; rightbm >>= (sz >> 1) ; } xmin += xmin ; if ((leftbm & maskhi) == 0) { xmin.add_smallint(2) ; } else { leftbm >>= (sz >> 1) ; } } else { node *z = 0 ; if (hashed) z = zeronode(currdepth) ; vector newv ; int outer = 0 ; for (i=0; i<(int)top.size(); i++) { node *t = top[i] ; if (!outer && (t->nw != z || t->ne != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } else { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } } sortunique(top, newv) ; ymax += ymax ; if (!outer) { ymax.add_smallint(-2) ; } outer = 0 ; for (i=0; i<(int)bottom.size(); i++) { node *t = bottom[i] ; if (!outer && (t->sw != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } } sortunique(bottom, newv) ; ymin += ymin ; if (!outer) { ymin.add_smallint(2) ; } outer = 0 ; for (i=0; i<(int)right.size(); i++) { node *t = right[i] ; if (!outer && (t->ne != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } } sortunique(right, newv) ; xmax += xmax ; if (!outer) { xmax.add_smallint(-2) ; } outer = 0 ; for (i=0; i<(int)left.size(); i++) { node *t = left[i] ; if (!outer && (t->nw != z || t->sw != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } else { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } } sortunique(left, newv) ; xmin += xmin ; if (!outer) { xmin.add_smallint(2) ; } } } xmin >>= 1 ; xmax >>= 1 ; ymin >>= 1 ; ymax >>= 1 ; xmin <<= (currdepth + 1) ; ymin <<= (currdepth + 1) ; xmax <<= (currdepth + 1) ; ymax <<= (currdepth + 1) ; xmax -= 1 ; ymax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; // set pattern edges *ptop = ymax ; // due to y flip *pbottom = ymin ; // due to y flip *pleft = xmin ; *pright = xmax ; } void hlifealgo::fit(viewport &view, int force) { ensure_hashed() ; bigint xmin = -1 ; bigint xmax = 1 ; bigint ymin = -1 ; bigint ymax = 1 ; int xgoal = view.getwidth() - 2 ; int ygoal = view.getheight() - 2 ; if (xgoal < 8) xgoal = 8 ; if (ygoal < 8) ygoal = 8 ; int xsize = 2 ; int ysize = 2 ; int currdepth = depth ; int i; if (root == zeronode(currdepth)) { view.center() ; view.setmag(MAX_MAG) ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; while (currdepth >= 0) { currdepth-- ; if (currdepth == 1) { // we have leaf nodes; turn them into bitmasks topbm = getbitsfromleaves(top) & 0xff ; bottombm = getbitsfromleaves(bottom) & 0xff ; leftbm = getbitsfromleaves(left) >> 8 ; rightbm = getbitsfromleaves(right) >> 8 ; } if (currdepth <= 1) { int sz = 1 << (currdepth + 2) ; int maskhi = (1 << sz) - (1 << (sz >> 1)) ; int masklo = (1 << (sz >> 1)) - 1 ; ymax += ymax ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-2) ; ysize-- ; } else { topbm >>= (sz >> 1) ; } ymin += ymin ; if ((bottombm & masklo) == 0) { ymin.add_smallint(2) ; ysize-- ; bottombm >>= (sz >> 1) ; } xmax += xmax ; if ((rightbm & masklo) == 0) { xmax.add_smallint(-2) ; xsize-- ; rightbm >>= (sz >> 1) ; } xmin += xmin ; if ((leftbm & maskhi) == 0) { xmin.add_smallint(2) ; xsize-- ; } else { leftbm >>= (sz >> 1) ; } xsize <<= 1 ; ysize <<= 1 ; } else { node *z = 0 ; if (hashed) z = zeronode(currdepth) ; vector newv ; int outer = 0 ; for (i=0; i<(int)top.size(); i++) { node *t = top[i] ; if (!outer && (t->nw != z || t->ne != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } else { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } } top = newv ; newv.clear() ; ymax += ymax ; if (!outer) { ymax.add_smallint(-2) ; ysize-- ; } outer = 0 ; for (i=0; i<(int)bottom.size(); i++) { node *t = bottom[i] ; if (!outer && (t->sw != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->sw != z) newv.push_back(t->sw) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->ne != z) newv.push_back(t->ne) ; } } bottom = newv ; newv.clear() ; ymin += ymin ; if (!outer) { ymin.add_smallint(2) ; ysize-- ; } ysize *= 2 ; outer = 0 ; for (i=0; i<(int)right.size(); i++) { node *t = right[i] ; if (!outer && (t->ne != z || t->se != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } else { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } } right = newv ; newv.clear() ; xmax += xmax ; if (!outer) { xmax.add_smallint(-2) ; xsize-- ; } outer = 0 ; for (i=0; i<(int)left.size(); i++) { node *t = left[i] ; if (!outer && (t->nw != z || t->sw != z)) { newv.clear() ; outer = 1 ; } if (outer) { if (t->nw != z) newv.push_back(t->nw) ; if (t->sw != z) newv.push_back(t->sw) ; } else { if (t->ne != z) newv.push_back(t->ne) ; if (t->se != z) newv.push_back(t->se) ; } } left = newv ; newv.clear() ; xmin += xmin ; if (!outer) { xmin.add_smallint(2) ; xsize-- ; } xsize *= 2 ; } if (xsize > xgoal || ysize > ygoal) break ; } xmin >>= 1 ; xmax >>= 1 ; ymin >>= 1 ; ymax >>= 1 ; xmin <<= (currdepth + 1) ; ymin <<= (currdepth + 1) ; xmax <<= (currdepth + 1) ; ymax <<= (currdepth + 1) ; xmax -= 1 ; ymax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; if (!force) { // if all four of the above dimensions are in the viewport, don't change if (view.contains(xmin, ymin) && view.contains(xmax, ymax)) return ; } xmin += xmax ; xmin >>= 1 ; ymin += ymax ; ymin >>= 1 ; int mag = - currdepth - 1 ; while (xsize <= xgoal && ysize <= ygoal && mag < MAX_MAG) { mag++ ; xsize *= 2 ; ysize *= 2 ; } view.setpositionmag(xmin, ymin, mag) ; } void hlifealgo::lowerRightPixel(bigint &x, bigint &y, int mag) { if (mag >= 0) return ; x >>= -mag ; x <<= -mag ; y -= 1 ; y >>= -mag ; y <<= -mag ; y += 1 ; } golly-2.5-src/gollybase/jvnalgo.cpp0000644000175100001440000021172012156145314014343 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "jvnalgo.h" // for case-insensitive string comparison #include #ifndef WIN32 #define stricmp strcasecmp #endif #include using namespace std ; // this algorithm supports three rules: const char* RULE_STRINGS[] = { "JvN29", "Nobili32", "Hutton32" }; const int N_STATES[] = { 29, 32, 32 }; int jvnalgo::NumCellStates() { return N_STATES[current_rule]; } const char* jvnalgo::setrule(const char *s) { const char* colonptr = strchr(s,':'); string rule_name(s); if(colonptr) rule_name.assign(s,colonptr); // check the requested string against the named rules, and deprecated versions if (stricmp(rule_name.c_str(), RULE_STRINGS[JvN29]) == 0 || stricmp(rule_name.c_str(), "JvN-29") == 0) current_rule = JvN29; else if (stricmp(rule_name.c_str(), RULE_STRINGS[Nobili32]) == 0 || stricmp(rule_name.c_str(), "JvN-32") == 0) current_rule = Nobili32; else if (stricmp(rule_name.c_str(), RULE_STRINGS[Hutton32]) == 0 || stricmp(rule_name.c_str(), "modJvN-32") == 0) current_rule = Hutton32; else { return "This algorithm only supports these rules: JvN29, Nobili32, Hutton32."; } // check for rule suffix like ":T200,100" to specify a bounded universe if (colonptr) { const char* err = setgridsize(colonptr); if (err) return err; } else { // universe is unbounded gridwd = 0; gridht = 0; } maxCellStates = N_STATES[current_rule]; ghashbase::setrule(RULE_STRINGS[current_rule]); return NULL; } const char* jvnalgo::getrule() { // return canonical rule string static char canonrule[MAXRULESIZE]; sprintf(canonrule, "%s", RULE_STRINGS[current_rule]); if (gridwd > 0 || gridht > 0) { // setgridsize() was successfully called above, so append suffix int len = (int)strlen(canonrule); const char* bounds = canonicalsuffix(); int i = 0; while (bounds[i]) canonrule[len++] = bounds[i++]; canonrule[len] = 0; } return canonrule; } const char* jvnalgo::DefaultRule() { return RULE_STRINGS[JvN29]; } const int NORTH = 1 ; const int SOUTH = 3 ; const int EAST = 0 ; const int WEST = 2 ; const int FLIPDIR = 2 ; const int DIRMASK = 3 ; const int CONF = 0x10 ; const int OTRANS = 0x20 ; const int STRANS = 0x40 ; const int TEXC = 0x80 ; const int CDEXC = 0x80 ; const int CROSSEXC = 6 ; const int CEXC = 1 ; const int BIT_ONEXC = 1 ; const int BIT_OEXC_EW = 2 ; const int BIT_OEXC_NS = 4 ; const int BIT_OEXC = BIT_OEXC_NS | BIT_OEXC_EW ; const int BIT_SEXC = 8 ; const int BIT_CEXC = 16 ; const int BIT_NS_IN = 32 ; const int BIT_EW_IN = 64 ; const int BIT_NS_OUT = 128 ; const int BIT_EW_OUT = 256 ; const int BIT_CROSS = (BIT_NS_IN | BIT_EW_IN | BIT_NS_OUT | BIT_EW_OUT) ; const int BIT_ANY_OUT = (BIT_NS_OUT | BIT_EW_OUT) ; const int BIT_OEXC_OTHER = 512 ; const int BIT_SEXC_OTHER = 1024 ; static state compress[256] ; /** * These are the legal *internal* states. */ static state uncompress[] = { 0, /* dead */ 1, 2, 3, 4, 5, 6, 7, 8, /* construction states */ 32, 33, 34, 35, /* ordinary */ 160, 161, 162, 163, /* ordinary active */ 64, 65, 66, 67, /* special */ 192, 193, 194, 195, /* special active */ 16, 144, /* confluent states */ 17, 145, /* more confluent states */ 146, 148, 150 /* crossing confluent states */ } ; /** * The behavior of the confluent states under the extended * rules was verified empirically by the wjvn executable, * because I could not interpret the paper sufficiently to * cover some cases I thought were ambiguous, or where the * simulator seemed to contradict the transition rules in the * paper. -tgr */ static int bits(state mcode, state code, state dir) { if ((code & (TEXC | OTRANS | STRANS | CONF | CEXC)) == 0) return 0 ; if (code & CONF) { if ((mcode & (OTRANS | STRANS)) && ((mcode & DIRMASK) ^ FLIPDIR) == dir) return 0 ; if ((code & 2) && !(dir & 1)) return BIT_CEXC ; if ((code & 4) && (dir & 1)) return BIT_CEXC ; if (code & 1) return BIT_CEXC ; return 0 ; } if ((code & (OTRANS | STRANS)) == 0) return 0 ; int r = 0 ; if ((code & DIRMASK) == dir) { if (code & OTRANS) { if (dir & 1) { r |= BIT_NS_IN ; if (code & TEXC) r |= BIT_OEXC_NS ; else r |= BIT_ONEXC ; } else { r |= BIT_EW_IN ; if (code & TEXC) r |= BIT_OEXC_EW ; else r |= BIT_ONEXC ; } } else if ((code & (STRANS | TEXC)) == (STRANS | TEXC)) r |= BIT_SEXC ; if ((mcode & (OTRANS | STRANS)) && (dir ^ (mcode & DIRMASK)) == 2) { // don't permit these bits to propogate; head to head } else { if (r & BIT_OEXC) r |= BIT_OEXC_OTHER ; if (r & BIT_SEXC) r |= BIT_SEXC_OTHER ; } } else { if (dir & 1) r |= BIT_NS_OUT ; else r |= BIT_EW_OUT ; } return r ; } static state cres[] = {0x22, 0x23, 0x40, 0x41, 0x42, 0x43, 0x10, 0x20, 0x21} ; jvnalgo::jvnalgo() { for (int i=0; i<256; i++) compress[i] = 255 ; for (unsigned int i=0; i 8) c = cres[c-9] ; } else if (c & CONF) { if (mbits & BIT_SEXC) c = 0 ; else if (current_rule == Nobili32 && (mbits & BIT_CROSS) == BIT_CROSS) { if (mbits & BIT_OEXC) c = (state)((mbits & BIT_OEXC) + CONF + 0x80) ; else c = CONF ; } else { if (c & CROSSEXC) {// was a cross, is no more c = (c & ~(CROSSEXC | CDEXC)) ; } if ((mbits & BIT_OEXC) && !(mbits & BIT_ONEXC)) c = ((c & CDEXC) >> 7) + (CDEXC | CONF) ; else if ((mbits & BIT_ANY_OUT) || current_rule == JvN29) c = ((c & CDEXC) >> 7) + CONF ; else /* no change */ ; } } else { if (((c & OTRANS) && (mbits & BIT_SEXC)) || ((c & STRANS) && (mbits & BIT_OEXC))) c = 0 ; else if (mbits & (BIT_SEXC_OTHER | BIT_OEXC_OTHER | BIT_CEXC)) c |= 128 ; else c &= 127 ; } return compress[c] ; } else // Hutton32 return slowcalc_Hutton32(c,n,s,e,w); } // XPM data for the 31 7x7 icons used in JvN algo static const char* jvn7x7[] = { // width height ncolors chars_per_pixel "7 217 4 1", // colors ". c #000000", // black will be transparent "D c #404040", "E c #E0E0E0", "W c #FFFFFF", // white // pixels ".DEWED.", "DWWWWWD", "EWWWWWE", "WWWWWWW", "EWWWWWE", "DWWWWWD", ".DEWED.", "..WWW..", ".WWWWW.", "WWWWWWW", ".......", "WWW.WWW", ".WW.WW.", "..W.W..", "..W.W..", ".WW.WW.", "WWW.WWW", ".......", "WWWWWWW", ".WWWWW.", "..WWW..", "..W.W..", ".WW.WW.", "WWW.WWW", ".......", "WWW.WWW", "WWW.WWW", "WWW.WWW", "..W.WWW", ".WW.WWW", "WWW.WWW", ".......", "WWW.WWW", "WWW.WW.", "WWW.W..", "WWW.W..", "WWW.WW.", "WWW.WWW", ".......", "WWW.WWW", ".WW.WWW", "..W.WWW", "WWW.WWW", "WWW.WWW", "WWW.WWW", ".......", "WWW.WWW", ".WW.WW.", "..W.W..", "..W.W..", ".WW.WW.", "WWW.WWW", ".......", "WWW.WWW", ".WW.WW.", "..W.W..", ".......", "....W..", "....WW.", "WWWWWWW", "....WW.", "....W..", ".......", "...W...", "..WWW..", ".WWWWW.", "...W...", "...W...", "...W...", "...W...", ".......", "..W....", ".WW....", "WWWWWWW", ".WW....", "..W....", ".......", "...W...", "...W...", "...W...", "...W...", ".WWWWW.", "..WWW..", "...W...", ".......", "....W..", "....WW.", "WWWWWWW", "....WW.", "....W..", ".......", "...W...", "..WWW..", ".WWWWW.", "...W...", "...W...", "...W...", "...W...", ".......", "..W....", ".WW....", "WWWWWWW", ".WW....", "..W....", ".......", "...W...", "...W...", "...W...", "...W...", ".WWWWW.", "..WWW..", "...W...", ".......", "....W..", "....WW.", "WWWWWWW", "....WW.", "....W..", ".......", "...W...", "..WWW..", ".WWWWW.", "...W...", "...W...", "...W...", "...W...", ".......", "..W....", ".WW....", "WWWWWWW", ".WW....", "..W....", ".......", "...W...", "...W...", "...W...", "...W...", ".WWWWW.", "..WWW..", "...W...", ".......", "....W..", "....WW.", "WWWWWWW", "....WW.", "....W..", ".......", "...W...", "..WWW..", ".WWWWW.", "...W...", "...W...", "...W...", "...W...", ".......", "..W....", ".WW....", "WWWWWWW", ".WW....", "..W....", ".......", "...W...", "...W...", "...W...", "...W...", ".WWWWW.", "..WWW..", "...W...", "...W...", "..WWW..", ".WW.WW.", "WW...WW", ".WW.WW.", "..WWW..", "...W...", "...W...", "..WWW..", ".WW.WW.", "WW...WW", ".WW.WW.", "..WWW..", "...W...", "...W...", "..WWW..", ".WWWWW.", "WWW.WWW", ".WWWWW.", "..WWW..", "...W...", "...W...", "..WWW..", ".WWWWW.", "WWWWWWW", ".WWWWW.", "..WWW..", "...W...", "...W...", "..W.W..", ".WW.WW.", "WWW.WWW", ".WW.WW.", "..W.W..", "...W...", "...W...", "..WWW..", ".WWWWW.", "W.....W", ".WWWWW.", "..WWW..", "...W...", "...W...", "..WWW..", ".W.W.W.", "WWW.WWW", ".W.W.W.", "..WWW..", "...W..."}; // XPM data for the 31 15x15 icons used in JvN algo static const char* jvn15x15[] = { // width height ncolors chars_per_pixel "15 465 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............", "....DBWWWBD....", "...BWWWWWWWB...", "..BWWWWWWWWWB..", ".DWWWWWWWWWWWD.", ".BWWWWWWWWWWWB.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".BWWWWWWWWWWWB.", ".DWWWWWWWWWWWD.", "..BWWWWWWWWWB..", "...BWWWWWWWB...", "....DBWWWBD....", "...............", "...............", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "...............", ".WWWWWW.WWWWWW.", "..WWWWW.WWWWW..", "...WWWW.WWWW...", "....WWW.WWW....", ".....WW.WW.....", "......W.W......", "...............", "...............", "......W.W......", ".....WW.WW.....", "....WWW.WWW....", "...WWWW.WWWW...", "..WWWWW.WWWWW..", ".WWWWWW.WWWWWW.", "...............", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", "...............", "...............", "......W.W......", ".....WW.WW.....", "....WWW.WWW....", "...WWWW.WWWW...", "..WWWWW.WWWWW..", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", "...............", "...............", "......W.WWWWWW.", ".....WW.WWWWWW.", "....WWW.WWWWWW.", "...WWWW.WWWWWW.", "..WWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWW..", ".WWWWWW.WWWW...", ".WWWWWW.WWW....", ".WWWWWW.WW.....", ".WWWWWW.W......", "...............", "...............", ".WWWWWW.W......", ".WWWWWW.WW.....", ".WWWWWW.WWW....", ".WWWWWW.WWWW...", ".WWWWWW.WWWWW..", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", "..WWWWW.WWWWWW.", "...WWWW.WWWWWW.", "....WWW.WWWWWW.", ".....WW.WWWWWW.", "......W.WWWWWW.", "...............", "...............", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", "..WWWWW.WWWWW..", "...WWWW.WWWW...", "....WWW.WWW....", ".....WW.WW.....", "......W.W......", "...............", "...............", "......W.W......", ".....WW.WW.....", "....WWW.WWW....", "...WWWW.WWWW...", "..WWWWW.WWWWW..", ".WWWWWW.WWWWWW.", "...............", ".WWWWWW.WWWWWW.", "..WWWWW.WWWWW..", "...WWWW.WWWW...", "....WWW.WWW....", ".....WW.WW.....", "......W.W......", "...............", "...............", ".......W.......", ".......WW......", ".......WWW.....", ".......WWWW....", ".......WWWWW...", ".WWWWWWWWWWWW..", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWW..", ".......WWWWW...", ".......WWWW....", ".......WWW.....", ".......WW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "...............", "...............", ".......W.......", "......WW.......", ".....WWW.......", "....WWWW.......", "...WWWWW.......", "..WWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWWW.", "...WWWWW.......", "....WWWW.......", ".....WWW.......", "......WW.......", ".......W.......", "...............", "...............", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", ".......WW......", ".......WWW.....", ".......WWWW....", ".......WWWWW...", ".WWWWWWWWWWWW..", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWW..", ".......WWWWW...", ".......WWWW....", ".......WWW.....", ".......WW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "...............", "...............", ".......W.......", "......WW.......", ".....WWW.......", "....WWWW.......", "...WWWWW.......", "..WWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWWW.", "...WWWWW.......", "....WWWW.......", ".....WWW.......", "......WW.......", ".......W.......", "...............", "...............", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", ".......WW......", ".......WWW.....", ".......WWWW....", ".......WWWWW...", ".WWWWWWWWWWWW..", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWW..", ".......WWWWW...", ".......WWWW....", ".......WWW.....", ".......WW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "...............", "...............", ".......W.......", "......WW.......", ".....WWW.......", "....WWWW.......", "...WWWWW.......", "..WWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWWW.", "...WWWWW.......", "....WWWW.......", ".....WWW.......", "......WW.......", ".......W.......", "...............", "...............", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", ".......WW......", ".......WWW.....", ".......WWWW....", ".......WWWWW...", ".WWWWWWWWWWWW..", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWW..", ".......WWWWW...", ".......WWWW....", ".......WWW.....", ".......WW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "...............", "...............", ".......W.......", "......WW.......", ".....WWW.......", "....WWWW.......", "...WWWWW.......", "..WWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWWW.", "...WWWWW.......", "....WWWW.......", ".....WWW.......", "......WW.......", ".......W.......", "...............", "...............", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", "......WWW......", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWW.WWWW...", "..WWWW...WWWW..", ".WWWW.....WWWW.", "..WWWW...WWWW..", "...WWWW.WWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWW.WWWW...", "..WWWW...WWWW..", ".WWWW.....WWWW.", "..WWWW...WWWW..", "...WWWW.WWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWW...WWWW..", ".WWWWW...WWWWW.", "..WWWW...WWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....W...W.....", "....WW...WW....", "...WWW...WWW...", "..WWWW...WWWW..", ".WWWWW...WWWWW.", "..WWWW...WWWW..", "...WWW...WWW...", "....WW...WW....", ".....W...W.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..W.........W..", ".WW.........WW.", "..W.........W..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "...............", "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....W.WWW.W....", "...W...W...W...", "..WWW.....WWW..", ".WWWWW...WWWWW.", "..WWW.....WWW..", "...W...W...W...", "....W.WWW.W....", ".....WWWWW.....", "......WWW......", ".......W.......", "..............."}; // XPM data for the 31 31x31 icons used in JvN algo static const char* jvn31x31[] = { // width height ncolors chars_per_pixel "31 961 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............................", "...............................", "..........DCBWWWWWBCD..........", ".........CWWWWWWWWWWWC.........", ".......DWWWWWWWWWWWWWWWD.......", "......BWWWWWWWWWWWWWWWWWB......", ".....BWWWWWWWWWWWWWWWWWWWB.....", "....DWWWWWWWWWWWWWWWWWWWWWD....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "....WWWWWWWWWWWWWWWWWWWWWWW....", "....DWWWWWWWWWWWWWWWWWWWWWD....", ".....BWWWWWWWWWWWWWWWWWWWB.....", "......BWWWWWWWWWWWWWWWWWB......", ".......DWWWWWWWWWWWWWWWD.......", ".........CWWWWWWWWWWWC.........", "..........DCBWWWWWBCD..........", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "....WWWWWWWWWWW.WWWWWWWWWWW....", ".....WWWWWWWWWW.WWWWWWWWWW.....", "......WWWWWWWWW.WWWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWW.WWWWWWW........", ".........WWWWWW.WWWWWW.........", "..........WWWWW.WWWWW..........", "...........WWWW.WWWW...........", "............WWW.WWW............", ".............WW.WW.............", "..............W.W..............", "...............................", "...............................", "...............................", "...............................", "..............W.W..............", ".............WW.WW.............", "............WWW.WWW............", "...........WWWW.WWWW...........", "..........WWWWW.WWWWW..........", ".........WWWWWW.WWWWWW.........", "........WWWWWWW.WWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWWW.WWWWWWWWW......", ".....WWWWWWWWWW.WWWWWWWWWW.....", "....WWWWWWWWWWW.WWWWWWWWWWW....", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "..............W.W..............", ".............WW.WW.............", "............WWW.WWW............", "...........WWWW.WWWW...........", "..........WWWWW.WWWWW..........", ".........WWWWWW.WWWWWW.........", "........WWWWWWW.WWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWWW.WWWWWWWWW......", ".....WWWWWWWWWW.WWWWWWWWWW.....", "....WWWWWWWWWWW.WWWWWWWWWWW....", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "...............................", "...............................", "...............................", "..............W.WWWWWWWWWWWWW..", ".............WW.WWWWWWWWWWWWW..", "............WWW.WWWWWWWWWWWWW..", "...........WWWW.WWWWWWWWWWWWW..", "..........WWWWW.WWWWWWWWWWWWW..", ".........WWWWWW.WWWWWWWWWWWWW..", "........WWWWWWW.WWWWWWWWWWWWW..", ".......WWWWWWWW.WWWWWWWWWWWWW..", "......WWWWWWWWW.WWWWWWWWWWWWW..", ".....WWWWWWWWWW.WWWWWWWWWWWWW..", "....WWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWW....", "..WWWWWWWWWWWWW.WWWWWWWWWW.....", "..WWWWWWWWWWWWW.WWWWWWWWW......", "..WWWWWWWWWWWWW.WWWWWWWW.......", "..WWWWWWWWWWWWW.WWWWWWW........", "..WWWWWWWWWWWWW.WWWWWW.........", "..WWWWWWWWWWWWW.WWWWW..........", "..WWWWWWWWWWWWW.WWWW...........", "..WWWWWWWWWWWWW.WWW............", "..WWWWWWWWWWWWW.WW.............", "..WWWWWWWWWWWWW.W..............", "...............................", "...............................", "...............................", "...............................", "..WWWWWWWWWWWWW.W..............", "..WWWWWWWWWWWWW.WW.............", "..WWWWWWWWWWWWW.WWW............", "..WWWWWWWWWWWWW.WWWW...........", "..WWWWWWWWWWWWW.WWWWW..........", "..WWWWWWWWWWWWW.WWWWWW.........", "..WWWWWWWWWWWWW.WWWWWWW........", "..WWWWWWWWWWWWW.WWWWWWWW.......", "..WWWWWWWWWWWWW.WWWWWWWWW......", "..WWWWWWWWWWWWW.WWWWWWWWWW.....", "..WWWWWWWWWWWWW.WWWWWWWWWWW....", "..WWWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWWW..", "....WWWWWWWWWWW.WWWWWWWWWWWWW..", ".....WWWWWWWWWW.WWWWWWWWWWWWW..", "......WWWWWWWWW.WWWWWWWWWWWWW..", ".......WWWWWWWW.WWWWWWWWWWWWW..", "........WWWWWWW.WWWWWWWWWWWWW..", ".........WWWWWW.WWWWWWWWWWWWW..", "..........WWWWW.WWWWWWWWWWWWW..", "...........WWWW.WWWWWWWWWWWWW..", "............WWW.WWWWWWWWWWWWW..", ".............WW.WWWWWWWWWWWWW..", "..............W.WWWWWWWWWWWWW..", "...............................", "...............................", "...............................", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "....WWWWWWWWWWW.WWWWWWWWWWW....", ".....WWWWWWWWWW.WWWWWWWWWW.....", "......WWWWWWWWW.WWWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWW.WWWWWWW........", ".........WWWWWW.WWWWWW.........", "..........WWWWW.WWWWW..........", "...........WWWW.WWWW...........", "............WWW.WWW............", ".............WW.WW.............", "..............W.W..............", "...............................", "...............................", "...............................", "...............................", "..............W.W..............", ".............WW.WW.............", "............WWW.WWW............", "...........WWWW.WWWW...........", "..........WWWWW.WWWWW..........", ".........WWWWWW.WWWWWW.........", "........WWWWWWW.WWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWWW.WWWWWWWWW......", ".....WWWWWWWWWW.WWWWWWWWWW.....", "....WWWWWWWWWWW.WWWWWWWWWWW....", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...............................", "..WWWWWWWWWWWWW.WWWWWWWWWWWWW..", "...WWWWWWWWWWWW.WWWWWWWWWWWW...", "....WWWWWWWWWWW.WWWWWWWWWWW....", ".....WWWWWWWWWW.WWWWWWWWWW.....", "......WWWWWWWWW.WWWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWW.WWWWWWW........", ".........WWWWWW.WWWWWW.........", "..........WWWWW.WWWWW..........", "...........WWWW.WWWW...........", "............WWW.WWW............", ".............WW.WW.............", "..............W.W..............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "...............WW..............", "...............WWW.............", "...............WWWW............", "...............WWWWW...........", "...............WWWWWW..........", "...............WWWWWWW.........", "...............WWWWWWWW........", "...............WWWWWWWWW.......", "...............WWWWWWWWWW......", "...............WWWWWWWWWWW.....", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "...............WWWWWWWWWWW.....", "...............WWWWWWWWWW......", "...............WWWWWWWWW.......", "...............WWWWWWWW........", "...............WWWWWWW.........", "...............WWWWWW..........", "...............WWWWW...........", "...............WWWW............", "...............WWW.............", "...............WW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WW...............", ".............WWW...............", "............WWWW...............", "...........WWWWW...............", "..........WWWWWW...............", ".........WWWWWWW...............", "........WWWWWWWW...............", ".......WWWWWWWWW...............", "......WWWWWWWWWW...............", ".....WWWWWWWWWWW...............", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", ".....WWWWWWWWWWW...............", "......WWWWWWWWWW...............", ".......WWWWWWWWW...............", "........WWWWWWWW...............", ".........WWWWWWW...............", "..........WWWWWW...............", "...........WWWWW...............", "............WWWW...............", ".............WWW...............", "..............WW...............", "...............W...............", "...............................", "...............................", "...............................", "...............................", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "...............WW..............", "...............WWW.............", "...............WWWW............", "...............WWWWW...........", "...............WWWWWW..........", "...............WWWWWWW.........", "...............WWWWWWWW........", "...............WWWWWWWWW.......", "...............WWWWWWWWWW......", "...............WWWWWWWWWWW.....", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "...............WWWWWWWWWWW.....", "...............WWWWWWWWWW......", "...............WWWWWWWWW.......", "...............WWWWWWWW........", "...............WWWWWWW.........", "...............WWWWWW..........", "...............WWWWW...........", "...............WWWW............", "...............WWW.............", "...............WW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WW...............", ".............WWW...............", "............WWWW...............", "...........WWWWW...............", "..........WWWWWW...............", ".........WWWWWWW...............", "........WWWWWWWW...............", ".......WWWWWWWWW...............", "......WWWWWWWWWW...............", ".....WWWWWWWWWWW...............", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", ".....WWWWWWWWWWW...............", "......WWWWWWWWWW...............", ".......WWWWWWWWW...............", "........WWWWWWWW...............", ".........WWWWWWW...............", "..........WWWWWW...............", "...........WWWWW...............", "............WWWW...............", ".............WWW...............", "..............WW...............", "...............W...............", "...............................", "...............................", "...............................", "...............................", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "...............WW..............", "...............WWW.............", "...............WWWW............", "...............WWWWW...........", "...............WWWWWW..........", "...............WWWWWWW.........", "...............WWWWWWWW........", "...............WWWWWWWWW.......", "...............WWWWWWWWWW......", "...............WWWWWWWWWWW.....", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "...............WWWWWWWWWWW.....", "...............WWWWWWWWWW......", "...............WWWWWWWWW.......", "...............WWWWWWWW........", "...............WWWWWWW.........", "...............WWWWWW..........", "...............WWWWW...........", "...............WWWW............", "...............WWW.............", "...............WW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WW...............", ".............WWW...............", "............WWWW...............", "...........WWWWW...............", "..........WWWWWW...............", ".........WWWWWWW...............", "........WWWWWWWW...............", ".......WWWWWWWWW...............", "......WWWWWWWWWW...............", ".....WWWWWWWWWWW...............", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", ".....WWWWWWWWWWW...............", "......WWWWWWWWWW...............", ".......WWWWWWWWW...............", "........WWWWWWWW...............", ".........WWWWWWW...............", "..........WWWWWW...............", "...........WWWWW...............", "............WWWW...............", ".............WWW...............", "..............WW...............", "...............W...............", "...............................", "...............................", "...............................", "...............................", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "...............WW..............", "...............WWW.............", "...............WWWW............", "...............WWWWW...........", "...............WWWWWW..........", "...............WWWWWWW.........", "...............WWWWWWWW........", "...............WWWWWWWWW.......", "...............WWWWWWWWWW......", "...............WWWWWWWWWWW.....", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWW....", "...............WWWWWWWWWWW.....", "...............WWWWWWWWWW......", "...............WWWWWWWWW.......", "...............WWWWWWWW........", "...............WWWWWWW.........", "...............WWWWWW..........", "...............WWWWW...........", "...............WWWW............", "...............WWW.............", "...............WW..............", "...............W...............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "...............................", "...............................", "...............................", "...............................", "...............W...............", "..............WW...............", ".............WWW...............", "............WWWW...............", "...........WWWWW...............", "..........WWWWWW...............", ".........WWWWWWW...............", "........WWWWWWWW...............", ".......WWWWWWWWW...............", "......WWWWWWWWWW...............", ".....WWWWWWWWWWW...............", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWWW..", "....WWWWWWWWWWWWWWWWWWWWWWWWW..", ".....WWWWWWWWWWW...............", "......WWWWWWWWWW...............", ".......WWWWWWWWW...............", "........WWWWWWWW...............", ".........WWWWWWW...............", "..........WWWWWW...............", "...........WWWWW...............", "............WWWW...............", ".............WWW...............", "..............WW...............", "...............W...............", "...............................", "...............................", "...............................", "...............................", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", ".............WWWWW.............", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWW...WWWWWWWW......", ".....WWWWWWWW.....WWWWWWWW.....", "....WWWWWWWW.......WWWWWWWW....", "...WWWWWWWW.........WWWWWWWW...", "..WWWWWWWW...........WWWWWWWW..", ".WWWWWWWW.............WWWWWWWW.", "..WWWWWWWW...........WWWWWWWW..", "...WWWWWWWW.........WWWWWWWW...", "....WWWWWWWW.......WWWWWWWW....", ".....WWWWWWWW.....WWWWWWWW.....", "......WWWWWWWW...WWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWW.WWWWWWWW.......", "......WWWWWWWW...WWWWWWWW......", ".....WWWWWWWW.....WWWWWWWW.....", "....WWWWWWWW.......WWWWWWWW....", "...WWWWWWWW.........WWWWWWWW...", "..WWWWWWWW...........WWWWWWWW..", ".WWWWWWWW.............WWWWWWWW.", "..WWWWWWWW...........WWWWWWWW..", "...WWWWWWWW.........WWWWWWWW...", "....WWWWWWWW.......WWWWWWWW....", ".....WWWWWWWW.....WWWWWWWW.....", "......WWWWWWWW...WWWWWWWW......", ".......WWWWWWWW.WWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWW.......WWWWWWWW....", "...WWWWWWWWW.......WWWWWWWWW...", "..WWWWWWWWWW.......WWWWWWWWWW..", ".WWWWWWWWWWW.......WWWWWWWWWWW.", "..WWWWWWWWWW.......WWWWWWWWWW..", "...WWWWWWWWW.......WWWWWWWWW...", "....WWWWWWWW.......WWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", ".WWWWWWWWWWWWWWWWWWWWWWWWWWWWW.", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWW.......WWWW........", ".......WWWWW.......WWWWW.......", "......WWWWWW.......WWWWWW......", ".....WWWWWWW.......WWWWWWW.....", "....WWWWWWWW.......WWWWWWWW....", "...WWWWWWWWW.......WWWWWWWWW...", "..WWWWWWWWWW.......WWWWWWWWWW..", ".WWWWWWWWWWW.......WWWWWWWWWWW.", "..WWWWWWWWWW.......WWWWWWWWWW..", "...WWWWWWWWW.......WWWWWWWWW...", "....WWWWWWWW.......WWWWWWWW....", ".....WWWWWWW.......WWWWWWW.....", "......WWWWWW.......WWWWWW......", ".......WWWWW.......WWWWW.......", "........WWWW.......WWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWW...............WWWW....", "...WWWWW...............WWWWW...", "..WWWWWW...............WWWWWW..", ".WWWWWWW...............WWWWWWW.", "..WWWWWW...............WWWWWW..", "...WWWWW...............WWWWW...", "....WWWW...............WWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWW.WWWWWWW.WWW........", ".......WWW...WWWWW...WWW.......", "......WWW.....WWW.....WWW......", ".....WWW.......W.......WWW.....", "....WWWWW.............WWWWW....", "...WWWWWWW...........WWWWWWW...", "..WWWWWWWWW.........WWWWWWWWW..", ".WWWWWWWWWWW.......WWWWWWWWWWW.", "..WWWWWWWWW.........WWWWWWWWW..", "...WWWWWWW...........WWWWWWW...", "....WWWWW.............WWWWW....", ".....WWW.......W.......WWW.....", "......WWW.....WWW.....WWW......", ".......WWW...WWWWW...WWW.......", "........WWW.WWWWWWW.WWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "..............................."}; // colors for each cell state (we try to match colors used in icons) static unsigned char jvncolors[] = { 48, 48, 48, // 0 dark gray 255, 0, 0, // 1 red 255, 125, 0, // 2 orange (to match red and yellow) 255, 150, 25, // 3 lighter 255, 175, 50, // 4 lighter 255, 200, 75, // 5 lighter 255, 225, 100, // 6 lighter 255, 250, 125, // 7 lighter 251, 255, 0, // 8 yellow 89, 89, 255, // 9 blue 106, 106, 255, // 10 lighter 122, 122, 255, // 11 lighter 139, 139, 255, // 12 lighter 27, 176, 27, // 13 green 36, 200, 36, // 14 lighter 73, 255, 73, // 15 lighter 106, 255, 106, // 16 lighter 235, 36, 36, // 17 red 255, 56, 56, // 18 lighter 255, 73, 73, // 19 lighter 255, 89, 89, // 20 lighter 185, 56, 255, // 21 purple 191, 73, 255, // 22 lighter 197, 89, 255, // 23 lighter 203, 106, 255, // 24 lighter 0, 255, 128, // 25 light green 255, 128, 64, // 26 light orange 255, 255, 128, // 27 light yellow 33, 215, 215, // 28 cyan 27, 176, 176, // 29 darker 24, 156, 156, // 30 darker 21, 137, 137 // 31 darker }; static lifealgo *creator() { return new jvnalgo() ; } void jvnalgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai) ; ai.setAlgorithmName("JvN") ; ai.setAlgorithmCreator(&creator) ; ai.minstates = 29 ; ai.maxstates = 32 ; // init default color scheme ai.defgradient = false; ai.defr1 = ai.defg1 = ai.defb1 = 255; // start color = white ai.defr2 = ai.defg2 = ai.defb2 = 128; // end color = gray int numcolors = sizeof(jvncolors) / (sizeof(jvncolors[0])*3); unsigned char* rgbptr = jvncolors; for (int i = 0; i < numcolors; i++) { ai.defr[i] = *rgbptr++; ai.defg[i] = *rgbptr++; ai.defb[i] = *rgbptr++; } // init default icon data ai.defxpm7x7 = jvn7x7; ai.defxpm15x15 = jvn15x15; ai.defxpm31x31 = jvn31x31; } // ------------------- beginning of Hutton32 section ----------------------- /*** Motivation: In the original von Neumann transition rules, lines of transmission states can extend themselves by writing out binary signal trains, e.g. 10000 for extend with a right-directed ordinary transmission state (OTS). But for construction, a dual-stranded construction arm (c-arm) is needed, simply because the arm must be retracted after each write. I noticed that there was room to add the needed write-and-retract operation by modifying the transition rules slightly. This allows the machine to be greatly reduced in size and speed of replication. Another modification was made when it was noticed that the construction could be made rotationally invariant simply by basing the orientation of the written cell on the orientation of the one writing it. Instead of "write an up arrow" we have "turn left". This allows us to spawn offspring in different directions and to fill up the space with more and more copies in a manner inspired by Langton's Loops. A single OTS line can now act as a c-arm in any direction. Below are the signal trains: 100000 : move forward (write an OTS arrow in the same direction) 100010 : turn left 10100 : turn right 100001 : write a forward-directed OTS and retract 100011 : write a left-directed OTS and retract 10011 : write a reverse-directed OTS and retract 10101 : write a right-directed OTS and retract 101101 : write a forward-directed special transmission state (STS) and retract 110001 : write a left-directed STS and retract 110101 : write a reverse-directed STS and retract 111001 : write a right-directed STS and retract 1111 : write a confluent state and retract 101111 : retract Achieving these features without adding new states required making some slight changes elsewhere, though hopefully these don't affect the computation- or construction-universality of the CA. The most important effects are listed here: 1) OTS's cannot destroy STS's. This functionality was used in von Neumann's construction and read-write arms but isn't needed for the logic organs, as far as I know. The opposite operation is still enabled. 2) STS lines can only construct one cell type: an OTS in the forward direction. Some logic organs will need to be redesigned. Under this modified JvN rule, a self-replicator can be much smaller, consisting only of a tape contained within a repeater-emitter loop. One early example consisted of 5521 cells in total, and replicates in 44,201 timesteps, compared with 8 billion timesteps for the smallest known JvN-32 replicator. This became possible because the construction process runs at the same speed as a moving signal, allowing the tape to be simply stored in a repeater-emitter loop. The machine simply creates a loop of the right size (by counting tape circuits) before allowing the tape contents to fill up their new home. The rotational invariance allows the machine to make multiple copies oriented in different directions. The population growth starts off as exponential but soons slows down as the long tapes obstruct the new copies. Some context for these modifications to von Neumann's rule table: Codd simplified vN's CA to a rotationally-invariant 8 states. Langton modified this to make a self-replicating repeater-emitter, his 'loops'. Other loops were made by Sayama, Perrier, Tempesti, Byl, Chou-Reggia, and others. So there are other CA derived from vN's that support faster replication than that achieveable here, and some of them retain the computation- and construction-universality that von Neumann was considering. Our modifications are mostly a historical exploration of the possibility space around vN's CA, to explore the questions of why he made the design decisions he did. In particular, why didn't von Neumann design for a tape loop stored within a repeater-emitter? It would have made his machine much simpler from the beginning. Why didn't he consider write-and-retraction instead of designing a complicated c-arm procedure? Of course this is far from criticism of vN - his untimely death interrupted his work in this area. Some explanation of the details of the modifications is given below: The transition rules are as in Nobili32 (or JvN29), except the following: 1) The end of an OTS wire, when writing a new cell, adopts one of two states: excited OTS and excited STS, standing for bits 1 and 0 respectively. After writing the cell reverts to being an OTS. 2) A sensitized cell that is about to revert to an arrow bases its direction upon that of the excited arrow that is pointing to it. 3) A TS 'c', with a sensitized state 's' on its output that will become an OTS next (based on the state of 'c'), reverts to the ground state if any of 'c's input is 1, else it quiesces. 4) A TS 'c', with a sensitized state 's' on its output that will become a confluent state next (based on the state of 'c'), reverts to the first sensitized state S is any of 'c's input is one, else it reverts to the ground state. 5) A TS 'c', with an STS on its output, reverts to the ground state if any of 'c's input is 1. Tim Hutton , 2008 ***/ bool is_OTS(state c) { return c>=9 && c<=16; } bool is_STS(state c) { return c>=17 && c<=24; } bool is_TS(state c) { return is_OTS(c) || is_STS(c); } bool is_sensitized(state c) { return c>=1 && c<=8; } bool is_east(state c) { return c==9 || c==13 || c==17 || c==21; } bool is_north(state c) { return c==10 || c==14 || c==18 || c==22; } bool is_west(state c) { return c==11 || c==15 || c==19 || c==23; } bool is_south(state c) { return c==12 || c==16 || c==20 || c==24; } bool is_excited(state c) { return (c>=13 && c<=16) || (c>=21 && c<=24); } state dir(state c) { // return 0,1,2,3 encoding the direction of 'c': right,up,left,down return (c-9)%4; } state output(state c,state n,state s,state e,state w) // what is the state of the cell we are pointing to? { if(is_east(c)) return e; else if(is_north(c)) return n; else if(is_west(c)) return w; else if(is_south(c)) return s; else return 0; // error } state input(state n,state s,state e,state w) // what is the state of the excited cell pointing at us? { if(is_east(w) && is_excited(w)) return w; else if(is_north(s) && is_excited(s)) return s; else if(is_west(e) && is_excited(e)) return e; else if(is_south(n) && is_excited(n)) return n; else return 0; // error } bool output_will_become_OTS(state c,state n,state s,state e,state w) { return output(c,n,s,e,w)==8 || (output(c,n,s,e,w)==4 && is_excited(c)) || (output(c,n,s,e,w)==5 && !is_excited(c)); } bool output_will_become_confluent(state c,state n,state s,state e,state w) { return output(c,n,s,e,w)==7 && is_excited(c); } bool output_will_become_sensitized(state c,state n,state s,state e,state w) { int out=output(c,n,s,e,w); return ((out==0 && is_excited(c)) || out==1 || out==2 || out==3 || (out==4 && !is_OTS(c))); } bool excited_arrow_to_us(state n,state s,state e,state w) { return n==16 || n==24 || s==14 || s==22 || e==15 || e==23 || w==13 || w==21; } bool excited_OTS_to_us(state c,state n,state s,state e,state w) { // is there an excited OTS state that will hit us next? return ((n==16 || n==27 || n==28 || n==30 || n==31) && !(c==14 || c==10)) || ((s==14 || s==27 || s==28 || s==30 || s==31) && !(c==16 || c==12)) || ((e==15 || e==27 || e==28 || e==29 || e==31) && !(c==13 || c==9)) || ((w==13 || w==27 || w==28 || w==29 || w==31) && !(c==15 || c==11)); } bool excited_OTS_arrow_to_us(state c,state n,state s,state e,state w) { // is there an excited OTS arrow pointing at us? return (n==16 && !(c==14 || c==10)) || (s==14 && !(c==16 || c==12)) || (e==15 && !(c==13 || c==9)) || (w==13 && !(c==15 || c==11)); } bool OTS_arrow_to_us(state n,state s,state e,state w) { // is there an OTS arrow pointing at us? return (is_OTS(n) && is_south(n)) || (is_OTS(s) && is_north(s)) || (is_OTS(e) && is_west(e)) || (is_OTS(w) && is_east(w)); } bool excited_STS_to_us(state c,state n,state s,state e,state w) { // is there an excited STS state that will hit us next? return ((n==24 || n==27 || n==28 || n==30 || n==31) && !(c==22 || c==18)) || ((s==22 || s==27 || s==28 || s==30 || s==31) && !(c==24 || c==20)) || ((e==23 || e==27 || e==28 || e==29 || e==31) && !(c==21 || c==17)) || ((w==21 || w==27 || w==28 || w==29 || w==31) && !(c==23 || c==19)); } bool excited_STS_arrow_to_us(state c,state n,state s,state e,state w) { // is there an excited STS arrow pointing at us? return (n==24 && !(c==22 || c==18)) || (s==22 && !(c==24 || c==20)) || (e==23 && !(c==21 || c==17)) || (w==21 && !(c==23 || c==19)); } bool all_inputs_on(state n,state s,state e,state w) { return (!(n==12 || s==10 || e==11 || w==9)) && (n==16 || s==14 || e==15 || w==13); } bool is_crossing(state n,state s,state e,state w) { int n_inputs=0; if(is_south(n)) n_inputs++; if(is_east(w)) n_inputs++; if(is_west(e)) n_inputs++; if(is_north(s)) n_inputs++; int n_outputs=0; if(is_TS(n) && !is_south(n)) n_outputs++; if(is_TS(w) && !is_east(w)) n_outputs++; if(is_TS(e) && !is_west(e)) n_outputs++; if(is_TS(s) && !is_north(s)) n_outputs++; return n_inputs==2 && n_outputs==2; } state quiesce(state c) { if(((c>=13 && c<=16) || (c>=21 && c<=24))) return c-4; else if(c>=26 && c<=31) return 25; else return c; } // the update function itself state slowcalc_Hutton32(state c,state n,state s,state e,state w) { if(is_OTS(c)) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(excited_OTS_to_us(c,n,s,e,w)) { if(output_will_become_OTS(c,n,s,e,w) || (is_STS(output(c,n,s,e,w)) && !is_excited(output(c,n,s,e,w)))) return 0; // we become the ground state (retraction) else if(output_will_become_confluent(c,n,s,e,w)) return 1; // we become sensitized by the next input (after retraction) else return quiesce(c)+4; // we become excited (usual OTS transmission) } else if(output_will_become_confluent(c,n,s,e,w)) return 0; // we become the ground state (retraction) else if(is_excited(c) && output_will_become_sensitized(c,n,s,e,w)) return quiesce(c)+12; // we become excited STS (special for end-of-wire: // means quiescent OTS, used to mark which cell is the sensitized cell's input) else return quiesce(c); } else if(is_STS(c)) { if(is_excited(c) && is_sensitized(output(c,n,s,e,w)) && OTS_arrow_to_us(n,s,e,w)) { // this cell is the special mark at the end of an OTS wire, so it behaves differently // if output is about to finalize, we revert to ground or quiescent OTS, depending on next signal // if output will remain sensitized, we change to excited OTS if next signal is 1 if(output_will_become_sensitized(c,n,s,e,w)) { if(excited_OTS_arrow_to_us(c,n,s,e,w)) return c-8; else return c; } else { if(excited_OTS_arrow_to_us(c,n,s,e,w)) return 0; // write-and-retract else return quiesce(c)-8; // revert to quiescent OTS } } else if(is_excited(c) && output(c,n,s,e,w)==0) if(excited_STS_arrow_to_us(c,n,s,e,w)) return c; // we remain excited else return quiesce(c); // we quiesce else if(excited_OTS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited OTS else if(excited_STS_to_us(c,n,s,e,w)) return quiesce(c)+4; // we become excited (usual STS transmission) else return quiesce(c); // we quiesce (usual STS transmission) } else if(c==0) { if(excited_OTS_arrow_to_us(c,n,s,e,w)) // (excludes e.g. excited confluent states) return 1; // we become sensitized else if(excited_STS_arrow_to_us(c,n,s,e,w)) return quiesce(input(n,s,e,w))-8; // directly become 'forward' OTS else return c; } else if(c==1) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 2; // 10 else return 3; // 11 } else if(c==2) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 4; // 100 else return 5; // 101 } else if(c==3) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 6; // 110 else return 7; // 111 } else if(c==4) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 8; // 1000 else return ( (quiesce(input(n,s,e,w))-9+2) % 4 )+9; // 1001: reverse } else if(c==5) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return ( (quiesce(input(n,s,e,w))-9+3) % 4 )+9; // 1010: turn right else return quiesce(input(n,s,e,w))+8; // 1011: STS forward } else if(c==6) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return ( (quiesce(input(n,s,e,w))-9+1) % 4 )+17; // 1100: STS turn left else return ( (quiesce(input(n,s,e,w))-9+2) % 4 )+17; // 1101: STS reverse } else if(c==7) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return ( (quiesce(input(n,s,e,w))-9+3) % 4 )+17; // 1110: STS turn left else return 25; // 1111 } else if(c==8) { if(!excited_OTS_arrow_to_us(c,n,s,e,w)) return 9+dir(input(n,s,e,w)); // 10000: move forward else return 9+dir(input(n,s,e,w)+1); // 10001: turn left } else if(c==25) // quiescent confluent state { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(is_crossing(n,s,e,w)) // for JvN-32 crossings { if((n==16||s==14)&&(e==15||w==13)) return 31; // double crossing else if(n==16||s==14) return 30; // vertical crossing else if(e==15||w==13) return 29; // horizontal crossing else return 25; // nothing happening } else if(all_inputs_on(n,s,e,w)) return 26; else return 25; } else if(c==26) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(all_inputs_on(n,s,e,w)) return 28; else return 27; } else if(c==27) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(all_inputs_on(n,s,e,w)) return 26; else return 25; } else if(c==28) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if(all_inputs_on(n,s,e,w)) return 28; else return 27; } else if(c==29 || c==30 || c==31) { if(excited_STS_arrow_to_us(c,n,s,e,w)) return 0; // we get destroyed by the incoming excited STS else if((n==16||s==14)&&(e==15||w==13)) return 31; // double crossing else if(n==16||s==14) return 30; // vertical crossing else if(e==15||w==13) return 29; // horizontal crossing else return 25; // revert to quiescent confluent state } else return c; // error - should be no more states } // ------------------ end of Hutton32 section ------------------------- golly-2.5-src/gollybase/lifealgo.cpp0000644000175100001440000002635312156145314014473 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "lifealgo.h" #include "string.h" using namespace std ; lifealgo::~lifealgo() { poller = 0 ; maxCellStates = 2 ; } int lifealgo::verbose ; /* * Right now, the base/expo should match the current increment. * We do not check this. */ int lifealgo::startrecording(int basearg, int expoarg) { if (timeline.framecount) { // already have a timeline; skip to its end gotoframe(timeline.framecount-1) ; } else { // use the current frame and increment to start a new timeline void *now = getcurrentstate() ; if (now == 0) return 0 ; timeline.base = basearg ; timeline.expo = expoarg ; timeline.frames.push_back(now) ; timeline.framecount = 1 ; timeline.end = timeline.start = generation ; timeline.inc = increment ; } timeline.next = timeline.end ; timeline.next += timeline.inc ; timeline.recording = 1 ; return timeline.framecount ; } pair lifealgo::stoprecording() { timeline.recording = 0 ; timeline.next = 0 ; return make_pair(timeline.base, timeline.expo) ; } void lifealgo::extendtimeline() { if (timeline.recording && generation == timeline.next) { void *now = getcurrentstate() ; if (now && timeline.framecount < MAX_FRAME_COUNT) { timeline.frames.push_back(now) ; timeline.framecount++ ; timeline.end = timeline.next ; timeline.next += timeline.inc ; } } } /* * Note that this *also* changes inc, so don't call unless this is * what you want to do. It does not update or change the base or * expo if the base != 2, so they can get out of sync. * * Currently this is only used by bgolly, and it will only work * properly if the increment argument is a power of two. */ void lifealgo::pruneframes() { if (timeline.framecount > 1) { for (int i=2; i> 1] = timeline.frames[i] ; timeline.framecount = (timeline.framecount + 1) >> 1 ; timeline.frames.resize(timeline.framecount) ; timeline.inc += timeline.inc ; timeline.end = timeline.inc ; timeline.end.mul_smallint(timeline.framecount-1) ; timeline.end += timeline.start ; timeline.next = timeline.end ; timeline.next += timeline.inc ; if (timeline.base == 2) timeline.expo++ ; } } int lifealgo::gotoframe(int i) { if (i < 0 || i >= timeline.framecount) return 0 ; setcurrentstate(timeline.frames[i]) ; // AKT: avoid mul_smallint(i) crashing with divide-by-zero if i is 0 if (i > 0) { generation = timeline.inc ; generation.mul_smallint(i) ; } else { generation = 0; } generation += timeline.start ; return timeline.framecount ; } void lifealgo::destroytimeline() { timeline.frames.clear() ; timeline.recording = 0 ; timeline.framecount = 0 ; timeline.end = 0 ; timeline.start = 0 ; timeline.inc = 0 ; timeline.next = 0 ; } // AKT: the next 2 routines provide support for a bounded universe const char* lifealgo::setgridsize(const char* suffix) { // parse a rule suffix like ":T100,200" and set the various grid parameters; // note that we allow any legal partial suffix -- this lets people type a // suffix into the Set Rule dialog without the algorithm changing to UNKNOWN const char *p = suffix; char topology = 0; gridwd = gridht = 0; hshift = vshift = 0; htwist = vtwist = false; boundedplane = false; sphere = false; p++; if (*p == 0) return 0; // treat ":" like ":T0,0" if (*p == 't' || *p == 'T') { // torus or infinite tube topology = 'T'; } else if (*p == 'p' || *p == 'P') { boundedplane = true; topology = 'P'; } else if (*p == 's' || *p == 'S') { sphere = true; topology = 'S'; } else if (*p == 'k' || *p == 'K') { // Klein bottle (either htwist or vtwist should become true) topology = 'K'; } else if (*p == 'c' || *p == 'C') { // cross-surface htwist = vtwist = true; topology = 'C'; } else { return "Unknown grid topology."; } p++; if (*p == 0) return 0; // treat ":" like ":T0,0" while ('0' <= *p && *p <= '9') { if (gridwd >= 200000000) { gridwd = 2000000000; // keep width within editable limits } else { gridwd = 10 * gridwd + *p - '0'; } p++; } if (*p == '*') { if (topology != 'K') return "Only specify a twist for a Klein bottle."; htwist = true; p++; } if (*p == '+' || *p == '-') { if (topology == 'P') return "Plane can't have a shift."; if (topology == 'S') return "Sphere can't have a shift."; if (topology == 'C') return "Cross-surface can't have a shift."; if (topology == 'K' && !htwist) return "Shift must be on twisted edges."; if (gridwd == 0) return "Can't shift infinite width."; int sign = *p == '+' ? 1 : -1; p++; while ('0' <= *p && *p <= '9') { hshift = 10 * hshift + *p - '0'; p++; } if (hshift >= (int)gridwd) hshift = hshift % (int)gridwd; hshift *= sign; } if (*p == ',' && topology != 'S') { p++; } else if (*p) { return "Unexpected stuff after grid width."; } // gridwd has been set if ((topology == 'K' || topology == 'C' || topology == 'S') && gridwd == 0) { return "Given topology can't have an infinite width."; } if (*p == 0) { // grid height is not specified so set it to grid width; // ie. treat ":T100" like ":T100,100"; // this also allows us to have ":S100" rather than ":S100,100" gridht = gridwd; } else { while ('0' <= *p && *p <= '9') { if (gridht >= 200000000) { gridht = 2000000000; // keep height within editable limits } else { gridht = 10 * gridht + *p - '0'; } p++; } if (*p == '*') { if (topology != 'K') return "Only specify a twist for a Klein bottle."; if (htwist) return "Klein bottle can't have both horizontal and vertical twists."; vtwist = true; p++; } if (*p == '+' || *p == '-') { if (topology == 'P') return "Plane can't have a shift."; if (topology == 'C') return "Cross-surface can't have a shift."; if (topology == 'K' && !vtwist) return "Shift must be on twisted edges."; if (hshift != 0) return "Can't have both horizontal and vertical shifts."; if (gridht == 0) return "Can't shift infinite height."; int sign = *p == '+' ? 1 : -1; p++; while ('0' <= *p && *p <= '9') { vshift = 10 * vshift + *p - '0'; p++; } if (vshift >= (int)gridht) vshift = vshift % (int)gridht; vshift *= sign; } if (*p) return "Unexpected stuff after grid height."; } // gridht has been set if ((topology == 'K' || topology == 'C') && gridht == 0) { return "Klein bottle or cross-surface can't have an infinite height."; } if (topology == 'K' && !(htwist || vtwist)) { // treat ":K10,20" like ":K10,20*" vtwist = true; } if ((hshift != 0 || vshift != 0) && (gridwd == 0 || gridht == 0)) { return "Shifting is not allowed if either grid dimension is unbounded."; } // now ok to set grid edges if (gridwd > 0) { gridleft = -int(gridwd) / 2; gridright = int(gridwd) - 1; gridright += gridleft; } else { // play safe and set these to something gridleft = bigint::zero; gridright = bigint::zero; } if (gridht > 0) { gridtop = -int(gridht) / 2; gridbottom = int(gridht) - 1; gridbottom += gridtop; } else { // play safe and set these to something gridtop = bigint::zero; gridbottom = bigint::zero; } return 0; } const char* lifealgo::canonicalsuffix() { if (gridwd > 0 || gridht > 0) { static char bounds[64]; if (boundedplane) { sprintf(bounds, ":P%u,%u", gridwd, gridht); } else if (sphere) { // sphere requires a square grid (gridwd == gridht) sprintf(bounds, ":S%u", gridwd); } else if (htwist && vtwist) { // cross-surface if both horizontal and vertical edges are twisted sprintf(bounds, ":C%u,%u", gridwd, gridht); } else if (htwist) { // Klein bottle if only horizontal edges are twisted if (hshift != 0 && (gridwd & 1) == 0) { // twist and shift is only possible if gridwd is even and hshift is 1 sprintf(bounds, ":K%u*+1,%u", gridwd, gridht); } else { sprintf(bounds, ":K%u*,%u", gridwd, gridht); } } else if (vtwist) { // Klein bottle if only vertical edges are twisted if (vshift != 0 && (gridht & 1) == 0) { // twist and shift is only possible if gridht is even and vshift is 1 sprintf(bounds, ":K%u,%u*+1", gridwd, gridht); } else { sprintf(bounds, ":K%u,%u*", gridwd, gridht); } } else if (hshift < 0) { // torus with -ve horizontal shift sprintf(bounds, ":T%u%d,%u", gridwd, hshift, gridht); } else if (hshift > 0) { // torus with +ve horizontal shift sprintf(bounds, ":T%u+%d,%u", gridwd, hshift, gridht); } else if (vshift < 0) { // torus with -ve vertical shift sprintf(bounds, ":T%u,%u%d", gridwd, gridht, vshift); } else if (vshift > 0) { // torus with +ve vertical shift sprintf(bounds, ":T%u,%u+%d", gridwd, gridht, vshift); } else { // unshifted torus, or an infinite tube sprintf(bounds, ":T%u,%u", gridwd, gridht); } return bounds; } else { // unbounded universe return 0; } } int staticAlgoInfo::nextAlgoId = 0 ; staticAlgoInfo *staticAlgoInfo::head = 0 ; staticAlgoInfo::staticAlgoInfo() { id = nextAlgoId++ ; next = head ; head = this ; // init default icon data defxpm7x7 = NULL; defxpm15x15 = NULL; defxpm31x31 = NULL; } staticAlgoInfo *staticAlgoInfo::byName(const char *s) { for (staticAlgoInfo *i=head; i; i=i->next) if (strcmp(i->algoName, s) == 0) return i ; return 0 ; } int staticAlgoInfo::nameToIndex(const char *s) { staticAlgoInfo *r = byName(s) ; if (r == 0) return -1 ; return r->id ; } staticAlgoInfo &staticAlgoInfo::tick() { return *(new staticAlgoInfo()) ; } golly-2.5-src/gollybase/lifepoll.cpp0000755000175100001440000000326412156145314014516 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "lifepoll.h" #include "util.h" lifepoll::lifepoll() { interrupted = 0 ; calculating = 0 ; countdown = POLLINTERVAL ; } int lifepoll::checkevents() { return 0 ; } int lifepoll::inner_poll() { // AKT: bailIfCalculating() ; if (isCalculating()) { // AKT: better to simply ignore user event??? // lifefatal("recursive poll called.") ; return interrupted ; } countdown = POLLINTERVAL ; calculating++ ; if (!interrupted) interrupted = checkevents() ; calculating-- ; return interrupted ; } void lifepoll::bailIfCalculating() { if (isCalculating()) // AKT: lifefatal("recursive poll called.") ; lifefatal("Illegal operation while calculating.") ; } void lifepoll::updatePop() {} lifepoll default_poller ; golly-2.5-src/gollybase/liferender.cpp0000644000175100001440000000176412156145314015027 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "liferender.h" liferender::~liferender() {} golly-2.5-src/gollybase/liferules.cpp0000644000175100001440000001737212156145314014704 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "liferules.h" #include "util.h" #include #include #include liferules::liferules() { canonrule[0] = 0 ; } liferules::~liferules() { } // returns a count of the number of bits set in given int static int bitcount(int v) { int r = 0 ; while (v) { r++ ; v &= v - 1 ; } return r ; } // initialize current rule table (rptr points to rule0 or rule1) void liferules::initruletable(char *rptr, int rulebits, int nmask, int wolfram) { int i ; if (wolfram >= 0) { for (i=0; i<0x1000; i = ((i | 0x888) + 1) & 0x1777) rptr[i] = (char)(1 & ((i >> 5) | (wolfram >> (i >> 8)))) ; } else { for (i=0; i<=0x777; i = (((i | 0x888) + 1) & 0x1777)) if (rulebits & (1 << (((i & 0x20) >> 1) + bitcount(i & nmask)))) rptr[i] = 1 ; else rptr[i] = 0 ; } for (i=0xfff; i>=0; i--) rptr[i] = rptr[i & 0x777] + (rptr[(i >> 1) & 0x777] << 1) ; for (i=0xffff; i>=0; i--) rptr[i] = rptr[i & 0xfff] + (rptr[(i >> 4) & 0xfff] << 4) ; } const char *liferules::setrule(const char *rulestring, lifealgo *algo) { int slashcount = 0 ; int colonpos = 0 ; int addend = 17 ; int i ; // AKT: don't allow empty string if (rulestring[0] == 0) { return "Rule cannot be empty string." ; } wolfram = -1 ; rulebits = 0 ; neighbormask = MOORE ; // we might need to emulate B0 rule by using two different rules for odd/even gens alternate_rules = false; if (rulestring[0] == 'w' || rulestring[0] == 'W') { // parse Wolfram 1D rule wolfram = 0; i = 1; while (rulestring[i] >= '0' && rulestring[i] <= '9') { wolfram = 10 * wolfram + rulestring[i] - '0' ; i++ ; } if ( wolfram < 0 || wolfram > 254 || wolfram & 1 ) { return "Wolfram rule must be an even number from 0 to 254." ; } if (rulestring[i] == ':') { colonpos = i ; } else if (rulestring[i]) { return "Bad character in Wolfram rule." ; } } else { for (i=0; rulestring[i]; i++) { if (rulestring[i] == 'h' || rulestring[i] == 'H') { neighbormask = HEXAGONAL ; } else if (rulestring[i] == 'v' || rulestring[i] == 'V') { neighbormask = VON_NEUMANN ; } else if (rulestring[i] == 'b' || rulestring[i] == 'B' || rulestring[i] == '/') { if (rulestring[i]== '/' && slashcount++ > 0) return "Only one slash permitted in life rule." ; addend = 0 ; } else if (rulestring[i] == 's' || rulestring[i] == 'S') { addend = 17 ; } else if (rulestring[i] >= '0' && rulestring[i] <= '8') { rulebits |= 1 << (addend + rulestring[i] - '0') ; } else if (rulestring[i] == ':' && i > 0) { colonpos = i ; break ; } else { return "Bad character in rule string." ; } } } // AKT: check for rule suffix like ":T200,100" to specify a bounded universe if (colonpos > 0) { const char* err = algo->setgridsize(rulestring + colonpos); if (err) return err; } else { // universe is unbounded algo->gridwd = 0; algo->gridht = 0; } // maximum # of neighbors is the # of 1 bits in neighbormask, minus the central cell int maxneighbors = bitcount(neighbormask) - 1; // check if rule contains B0 if (rulebits & 1) { /* Use David Eppstein's idea to change the current rule depending on gen parity. If original rule has B0 but not S8: For even generations, whenever the original rule has a Bx or Sx, omit that bit from the modified rule, and whenever the original rule is missing a Bx or Sx, add that bit to the modified rule. eg. B03/S23 => B1245678/S0145678. For odd generations, use Bx if and only if the original rule has S(8-x) and use Sx if and only if the original rule has B(8-x). eg. B03/S23 => B56/S58. If original rule has B0 and S8: Such rules don't strobe, so we just want to invert all the cells. The trick is to do both changes: invert the bits, and swap Bx for S(8-x). eg. B03/S238 => B123478/S0123467 (for ALL gens). */ if (rulebits & (1 << (17+maxneighbors))) { // B0-and-Smax rule // change rule for all gens; eg. B03/S238 => B123478/S0123467 int newrulebits = 0; for (i=0; i<=maxneighbors; i++) { if ( (rulebits & (1 << i )) == 0 ) newrulebits |= 1 << (17+maxneighbors-i); if ( (rulebits & (1 << (17+i))) == 0 ) newrulebits |= 1 << (maxneighbors-i); } initruletable(rule0, newrulebits, neighbormask, wolfram); } else { // B0-not-Smax rule alternate_rules = true; // change rule for even gens; eg. B03/S23 => B1245678/S0145678 int newrulebits = 0; for (i=0; i<=maxneighbors; i++) { if ( (rulebits & (1 << i )) == 0 ) newrulebits |= 1 << i; if ( (rulebits & (1 << (17+i))) == 0 ) newrulebits |= 1 << (17+i); } initruletable(rule0, newrulebits, neighbormask, wolfram); // change rule for odd gens; eg. B03/S23 => B56/S58 newrulebits = 0; for (i=0; i<=maxneighbors; i++) { if ( rulebits & (1 << (17+maxneighbors-i)) ) newrulebits |= 1 << i; if ( rulebits & (1 << ( maxneighbors-i)) ) newrulebits |= 1 << (17+i); } initruletable(rule1, newrulebits, neighbormask, wolfram); } } else { // not doing B0 emulation so use rule0 for all gens initruletable(rule0, rulebits, neighbormask, wolfram); } // AKT: store valid rule in canonical format for getrule() int p = 0 ; if (wolfram >= 0) { sprintf(canonrule, "W%d", wolfram) ; while (canonrule[p]) p++ ; } else { canonrule[p++] = 'B' ; for (i=0; i<=maxneighbors; i++) { if (rulebits & (1 << i)) canonrule[p++] = '0' + (char)i ; } canonrule[p++] = '/' ; canonrule[p++] = 'S' ; for (i=0; i<=maxneighbors; i++) { if (rulebits & (1 << (17+i))) canonrule[p++] = '0' + (char)i ; } if (neighbormask == HEXAGONAL) canonrule[p++] = 'H' ; if (neighbormask == VON_NEUMANN) canonrule[p++] = 'V' ; } if (algo->gridwd > 0 || algo->gridht > 0) { // algo->setgridsize() was successfully called above, so append suffix const char* bounds = algo->canonicalsuffix() ; int i = 0 ; while (bounds[i]) canonrule[p++] = bounds[i++] ; } canonrule[p] = 0 ; return 0 ; } const char* liferules::getrule() { return canonrule ; } // B3/S23 -> (1 << 3) + (1 << (17 + 2)) + (1 << (17 + 3)) = 0x180008 bool liferules::isRegularLife() { return (neighbormask == MOORE && rulebits == 0x180008 && wolfram < 0) ; } golly-2.5-src/gollybase/qlifealgo.cpp0000644000175100001440000011627512156145314014657 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /* * Inspired by Alan Hensel's Life applet and also by xlife. Tries to * improve the cache, TLB, and branching behavior for modern CPUs. */ #include "qlifealgo.h" #include "liferules.h" #include "util.h" #include #include #include #include using namespace std ; /* * The ai array is used to figure out the index number of the bit set in * the set [1, 2, 4, 8, 16, 32, 64, 128]. Also, for the value 0, it * returns the result 4, to eliminate a conditional in some obscure piece * of code. */ static unsigned char ai[129] ; /* * This define is the size of memory to ask for at one time. 8K is a good * size; we drop 16 bits because malloc overhead is probably near this. * * Values much smaller than this will be impacted by malloc overhead (both * speed and space); values much larger than this will occupy excessive * memory for small universes. */ #define MEMCHUNK (8192-16) /* * When we need a bunch more structures of a particular size, we call this. * This code allocates the memory, adds it to our universe memory allocated * list, tries to maximize the cache alignment of the structures, and then * links all the substructures together into a linked list which is then * returned. */ /* * This preprocessor directive is used to work around a bug in * register allocation when using function inlining (-O3 or * better) and gcc 3.4.2, which is very common having shipped with * Fedora Core 3. */ #ifdef __GNUC__ __attribute__((noinline)) #endif linkedmem *qlifealgo::filllist(int size) { usedmemory += MEMCHUNK ; if (maxmemory != 0 && usedmemory > maxmemory) lifefatal("exceeded user-specified memory limit") ; linkedmem *p, *safep, *r = (linkedmem *)calloc(MEMCHUNK, 1) ; int i = size & - size ; if (r == 0) lifefatal("No memory.") ; r->next = memused ; memused = r ; safep = p = (linkedmem *)((((g_uintptr_t)(r+1))+i-1)&-i) ; while (((g_uintptr_t)p) + 2 * size <= MEMCHUNK+(g_uintptr_t)r) { p->next = (linkedmem *)(size + (g_uintptr_t)p) ; p = (linkedmem *)(size + (g_uintptr_t)p) ; } return safep ; } #ifdef STATS static int bricks, tiles, supertiles, rcc, dq, ds, rccs, dqs, dss ; #define STAT(a) a #else #define STAT(a) #endif /* * If we need a new empty brick, we call this. This structure is guaranteed * to be all zeros. */ brick *qlifealgo::newbrick() { brick *r ; if (bricklist == 0) bricklist = filllist(sizeof(brick)) ; r = (brick *)(bricklist) ; bricklist = bricklist->next ; memset(r, 0, sizeof(brick)) ; STAT(bricks++) ; return r ; } /* * If we need a new tile, we call this. The structure is also initialized * appropriately, with all the pointers pointing to the empty brick. */ tile *qlifealgo::newtile() { tile *r ; if (tilelist == 0) tilelist = filllist(sizeof(tile)) ; r = (tile *)(tilelist) ; tilelist = tilelist->next ; r->b[0] = r->b[1] = r->b[2] = r->b[3] = emptybrick ; r->flags = -1 ; STAT(tiles++) ; return r ; } /* * Finally, a new supertile is provided by this routine. It initializes * all the subtiles to point to the next level down's empty tile. */ supertile *qlifealgo::newsupertile(int lev) { supertile *r ; if (supertilelist == 0) supertilelist = filllist(sizeof(supertile)) ; r = (supertile *)supertilelist ; supertilelist = supertilelist->next ; r->d[0] = r->d[1] = r->d[2] = r->d[3] = r->d[4] = r->d[5] = r->d[6] = r->d[7] = nullroots[lev-1] ; STAT(supertiles++) ; return r ; } /* * This short little subroutine plays a very important role. It takes bits * set up according to the c01 or c10 fields of supertiles, and translates * these bits into the impact on the next level up. Essentially, it swaps * the parallel bits (bits 9 through 16), any of them set, with the edge * bit (bit 8), in a way that requires no conditional branches. On a * slower older processor without large branch penalties, it might be * faster to use a conditional variation that executes fewer instructions, * but actually this code is not totally performance critical. */ static int upchanging(int x) { int a = (x & 0x1feff) + 0x1feff ; return ((a >> 8) & 1) | ((a >> 16) & 2) | ((x << 1) & 0x200) | ((x >> 7) & 0x400) ; } /* * If it is determined that the universe is not large enough, this * subroutine adds another level to it, expanding it by a factor of 8 * in one dimension, depending on whether the level is even or odd. * * It also allocates a new emptytile at the appropriate level. * * The old root is always placed at position 4. This allows expansion * in both positive and negative directions. * * The sequence of sizes is as follows: * * 0 31 * -128 127 * -1,152 895 * -9,344 7,039 * -74,880 56,191 * -599,168 449,407 * -4,793,472 3,595,135 * -38,347,904 28,760,959 * -306,783,360 230,087,551 * INT_MIN 1,840,700,287 * INT_MIN INT_MAX * * Remember these are only relevant for set() calls and have nothing * to do with rendering or generation. */ void qlifealgo::uproot() { if (min < -100000000) min = INT_MIN ; else min = 8 * min - 128 ; if (max > 500000000) max = INT_MAX ; else max = 8 * max - 121 ; bmin <<= 3 ; bmin -= 128 ; bmax <<= 3 ; bmax -= 121 ; minlow32 = 8 * minlow32 - 4 ; if (rootlev >= 38) lifefatal("internal: push too deep for qlifealgo") ; for (int i=0; i<2; i++) { supertile *oroot = root ; rootlev++ ; root = newsupertile(rootlev) ; if (rootlev > 1) root->flags = 0xf0000000 | (upchanging(oroot->flags) << (3 + (generation.odd()))) ; root->d[4] = oroot ; if (oroot != nullroot) { nullroots[rootlev] = nullroot = newsupertile(rootlev) ; } else { nullroots[rootlev] = nullroot = root ; } } // Need to clear this because we don't have valid population values // in the new root. popValid = 0 ; } /* * This subroutine allocates a new empty universe. The universe starts * out as a 256x256 universe. */ qlifealgo::qlifealgo() { int test = (INT_MAX != 0x7fffffff) ; if (test) lifefatal("bad platform for this program") ; memused = 0 ; maxmemory = 0 ; clearall() ; } /* * Clear everything. This one also frees memory. */ static int bc[256] ; // popcount void qlifealgo::clearall() { poller->bailIfCalculating() ; while (memused) { linkedmem *nu = memused->next ; free(memused) ; memused = nu ; } generation = 0 ; increment = 1 ; tilelist = 0 ; supertilelist = 0 ; bricklist = 0 ; rootlev = 0 ; cleandowncounter = 63 ; usedmemory = 0 ; deltaforward = 0 ; ai[0] = 4 ; ai[1] = 0 ; ai[2] = 1 ; ai[4] = 2 ; ai[8] = 3 ; ai[16] = 4 ; ai[32] = 5 ; ai[64] = 6 ; ai[128] = 7 ; minlow32 = min = 0 ; max = 31 ; bmin = 0 ; bmax = 31 ; emptybrick = newbrick() ; nullroots[0] = nullroot = root = (supertile *)(emptytile = newtile()) ; uproot() ; popValid = 0 ; llxb = 0 ; llyb = 0 ; llbits = 0 ; llsize = 0 ; if (bc[255] == 0) for (int i=1; i<256; i++) bc[i] = bc[i & (i-1)] + 1 ; } /* * This subroutine frees a universe. */ qlifealgo::~qlifealgo() { while (memused) { linkedmem *nu = memused->next ; free(memused) ; memused = nu ; } } /* * Set the max memory */ void qlifealgo::setMaxMemory(int newmemlimit) { // AKT: allow setting maxmemory to 0 if (newmemlimit == 0) { maxmemory = 0 ; return; } if (newmemlimit < 10) newmemlimit = 10 ; #ifndef GOLLY64BIT else if (newmemlimit > 4000) newmemlimit = 4000 ; #endif g_uintptr_t newlimit = ((g_uintptr_t)newmemlimit) << 20 ; if (usedmemory > newlimit) { lifewarning("Sorry, more memory currently used than allowed.") ; return ; } maxmemory = newlimit ; } /* * Finally, our first generation subroutine! This one handles supertiles * for even to odd generation (0->1). What is passed in is the universe * itself, the tile (this) to focus on, its three neighbor tiles (the * one `parallel' to it [by the way the subtiles are stacked], the one * past it, and the corner one. * * The way we walk down the tree in this subroutine is one of the major * keys to cache and TLB performance. We walk the universe in a * spatially local way, always doing an entire 32x32 tile before * moving on, always doing a 256x32 supertile before moving on, always * doing a 256x256 supertile, etc. That is, if we need to access a * particular brick four times in recomputing four bricks, chances are * good that those four times will occur closely in time since we do * spatially adjacent bricks near each other. * * Another trick is to do the universe from bottom to top in phase 0->1 * and from top to bottom in phase 1->0; this also helps cut down on * those cache misses. */ int qlifealgo::doquad01(supertile *zis, supertile *edge, supertile *par, supertile *cor, int lev) { /* * First we figure out which subtiles we need to recalculate. There will * always be at least one if we got into this subroutine (except for the * case of a static universe and at the root level). To do this, we * use the edge bits from the parallel supertile, and one bit each from * the other two neighbor tiles, blending them into a single 8-bit * recalculate int. * * Note that the parallel and corner have already been recomputed so * their changing bits are shifted up 10 positions in c. */ poller->poll() ; int changing = (zis->flags | (par->flags >> 19) | (((edge->flags >> 18) | (cor->flags >> 27)) & 1)) & 0xff ; int x, b, nchanging = (zis->flags & 0x3ff00) << 10 ; supertile *p, *pf, *pu, *pfu ; STAT(ds++) ; /* * Only if the first subtile needs to be recomputed do we actually need to * `visit' the edge and corner neighbors. We always keep track of the * subtiles one level down. */ if (changing & 1) { x = 7 ; b = 1 ; pf = edge->d[0] ; pfu = cor->d[0] ; } else { /* * Otherwise, we compute which tile we need to examine first with the help * of the ai array. */ b = (changing & - changing) ; x = 7 - ai[b] ; pf = zis->d[x + 1] ; pfu = par->d[x + 1] ; } for (;;) { p = zis->d[x] ; pu = par->d[x] ; /* * Do we need to recompute this subtile? */ if (changing & b) { /* * If so, is it the canonical empty supertile for this level? If so, * allocate a new empty supertile and set the void bits appropriately. */ if (zis->d[x] == nullroots[lev-1]) p = zis->d[x] = (lev == 1 ? (supertile *)newtile() : newsupertile(lev-1)) ; /* * If it's level 1, call the tile handler, else call the next level down of * the supertile handler. The return value is the changing indicators that * should be propogated up. */ nchanging |= ((lev == 1) ? p01((tile *)p, (tile *)pf, (tile *)pu, (tile *)pfu) : doquad01(p, pu, pf, pfu, lev-1)) << x ; changing -= b ; } else if (changing == 0) break ; b <<= 1 ; x-- ; pfu = pu ; pf = p ; } zis->flags = nchanging | 0xf0000000 ; return upchanging(nchanging) ; } /* * This is for odd to even generations, and the documentation is pretty * much the same as for the previous subroutine. */ int qlifealgo::doquad10(supertile *zis, supertile *edge, supertile *par, supertile *cor, int lev) { poller->poll() ; int changing = (zis->flags | (par->flags >> 19) | (((edge->flags >> 18) | (cor->flags >> 27)) & 1)) & 0xff ; int x, b, nchanging = (zis->flags & 0x3ff00) << 10 ; supertile *p, *pf, *pu, *pfu ; STAT(ds++) ; if (changing & 1) { x = 0 ; b = 1 ; pf = edge->d[7] ; pfu = cor->d[7] ; } else { b = (changing & - changing) ; x = ai[b] ; pf = zis->d[x - 1] ; pfu = par->d[x - 1] ; } for (;;) { p = zis->d[x] ; pu = par->d[x] ; if (changing & b) { if (zis->d[x] == nullroots[lev-1]) p = zis->d[x] = (lev == 1 ? (supertile *)newtile() : newsupertile(lev-1)) ; nchanging |= ((lev == 1) ? p10((tile *)pfu, (tile *)pu, (tile *)pf, (tile *)p) : doquad10(p, pu, pf, pfu, lev-1)) << (7-x) ; changing -= b ; } else if (changing == 0) break ; b <<= 1 ; x++ ; pfu = pu ; pf = p ; } zis->flags = nchanging | 0xf0000000 ; return upchanging(nchanging) ; } /* * This is our monster subroutine that, with its mirror below, accounts for * about 90% of the runtime. It handles recomputation for a 32x32 tile. * Passed in are the neighbor tiles: pr (to the right), pd (down), and * prd (down and to the right). */ int qlifealgo::p01(tile *p, tile *pr, tile *pd, tile *prd) { brick *db = pd->b[0], *rdb = prd->b[0] ; /* * Do we need to recompute the fourth brick? This happens here because its * the only place we need to pull in changing from the down and corner * neighbor. */ int i, recomp = (p->c[4] | pd->c[0] | (pr->c[4] >> 9) | (prd->c[0] >> 8)) & 0xff ; STAT(dq++) ; p->c[5] = 0 ; p->flags |= 0xfff00000 ; /* * For each brick . . . */ for (i=3; i>=0; i--) { brick *b = p->b[i], *rb = pr->b[i] ; /* * Do we need to recompute? */ if (recomp) { unsigned int traildata, trailunderdata ; int j, cdelta = 0, maska, maskb, maskprev = 0 ; /* * If so, set the dirty bit. Also, if this brick is the canonical empty * brick, get a new one. */ p->flags |= 1 << i ; if (b == emptybrick) p->b[i] = b = newbrick() ; /* * If we need to recompute the end slice, now is a good time to get the * right neighbor's data. */ if (recomp & 1) { j = 7 ; traildata = rb->d[0] ; trailunderdata = rdb->d[0] ; } else { /* * Otherwise we use the ai[] array to figure out where to begin in this * brick. */ j = ai[recomp & - recomp] ; recomp >>= j ; j = 7 - j ; traildata = b->d[j+1] ; trailunderdata = db->d[j+1] ; } trailunderdata = (traildata << 8) + (trailunderdata >> 24) ; for (;;) { /* * At all times here, we have traildata (the data from the slice to the * right) and trailunderdata (24 bits of traildata and eight bits from * the slice under and to the right). * * Do we need to recompute this slice? */ if (recomp & 1) { /* * Our main recompute chunk recomputes a single slice. */ unsigned int zisdata = b->d[j] ; unsigned int underdata = (zisdata << 8) + (db->d[j] >> 24) ; unsigned int otherdata = ((zisdata << 2) & 0xcccccccc) + ((traildata >> 2) & 0x33333333) ; unsigned int otherunderdata = ((underdata << 2) & 0xcccccccc) + ((trailunderdata >> 2) & 0x33333333) ; int newv = (ruletable[zisdata >> 16] << 26) + (ruletable[underdata >> 16] << 18) + (ruletable[zisdata & 0xffff] << 10) + (ruletable[underdata & 0xffff] << 2) + (ruletable[otherdata >> 16] << 24) + (ruletable[otherunderdata >> 16] << 16) + (ruletable[otherdata & 0xffff] << 8) + ruletable[otherunderdata & 0xffff] ; /* * Has anything changed? * Keep track of what has changed in the entire cell, the rightmost * two columns, the lowest two rows, and the lowest rightmost 2x2 cell, into * the maskprev int. Do all of this without conditionals. */ int delta = (b->d[j + 8] ^ newv) | deltaforward ; STAT(rcc++) ; b->d[j + 8] = newv ; maska = cdelta | (delta & 0x33333333) ; maskb = maska | -maska ; maskprev = (maskprev << 1) | ((maskb >> 9) & 0x400000) | (maskb & 0x80) ; cdelta = delta ; traildata = zisdata ; trailunderdata = underdata ; } else { /* * No need to recompute? Well, maintain our necessary invariants and bail * if we're done. */ maskb = cdelta | -cdelta ; maskprev = (maskprev << 1) | ((maskb >> 9) & 0x400000) | (maskb & 0x80) ; if (recomp == 0) break ; ; cdelta = 0 ; traildata = b->d[j] ; trailunderdata = (traildata << 8) + (db->d[j] >> 24) ; } recomp >>= 1 ; j-- ; } /* * Finally done with that brick! Update our changing for the next * call to p10, and or-in any changes to the lower two rows that we saw * into the next brick down's changing variable. */ p->c[i+2] |= (maskprev >> (6 - j)) & 0x1ff ; p->c[i+1] = (short)(((p->c[i+1] & 0x100) << 1) | (maskprev >> (21 - j))) ; } else p->c[i+1] = 0 ; /* * Calculate recomp for the next row down. */ recomp = (p->c[i] | (pr->c[i] >> 9)) & 0xff ; db = b ; rdb = rb ; } /* * Propogate the changing information for this tile to the supertile on * the next level up. */ recomp = p->c[5] ; i = recomp | p->c[0] | p->c[1] | p->c[2] | p->c[3] | p->c[4] ; if (recomp) return 0x201 | ((recomp & 0x100) << 2) | ((i & 0x100) >> 7) ; else return i ? ((i & 0x100) >> 7) | 1 : 0 ; } /* * This subroutine is the mirror of the one above, used for odd to even * generations. */ int qlifealgo::p10(tile *plu, tile *pu, tile *pl, tile *p) { brick *ub = pu->b[3], *lub = plu->b[3] ; int i, recomp = (p->c[1] | pu->c[5] | (pl->c[1] >> 9) | (plu->c[5] >> 8)) & 0xff ; STAT(dq++) ; p->c[0] = 0 ; p->flags |= 0x000fff00 ; for (i=0; i<=3; i++) { brick *b = p->b[i], *lb = pl->b[i] ; if (recomp) { int maska, maskprev = 0, j, cdelta = 0 ; unsigned int traildata, trailoverdata ; p->flags |= 1 << i ; if (b == emptybrick) p->b[i] = b = newbrick() ; if (recomp & 1) { j = 0 ; traildata = lb->d[15] ; trailoverdata = lub->d[15] ; } else { j = ai[recomp & - recomp] ; traildata = b->d[j+7] ; trailoverdata = ub->d[j+7] ; recomp >>= j ; } trailoverdata = (traildata >> 8) + (trailoverdata << 24) ; for (;;) { if (recomp & 1) { unsigned int zisdata = b->d[j + 8] ; unsigned int overdata = (zisdata >> 8) + (ub->d[j + 8] << 24) ; unsigned int otherdata = ((zisdata >> 2) & 0x33333333) + ((traildata << 2) & 0xcccccccc) ; unsigned int otheroverdata = ((overdata >> 2) & 0x33333333) + ((trailoverdata << 2) & 0xcccccccc) ; int newv = (ruletable[otheroverdata >> 16] << 26) + (ruletable[otherdata >> 16] << 18) + (ruletable[otheroverdata & 0xffff] << 10) + (ruletable[otherdata & 0xffff] << 2) + (ruletable[overdata >> 16] << 24) + (ruletable[zisdata >> 16] << 16) + (ruletable[overdata & 0xffff] << 8) + ruletable[zisdata & 0xffff] ; int delta = (b->d[j] ^ newv) | deltaforward ; STAT(rcc++) ; maska = cdelta | (delta & 0xcccccccc) ; maskprev = (maskprev << 1) | (((maska | - maska) >> 9) & 0x400000) | ((((maska >> 24) | 0x100) - 1) & 0x100) ; b->d[j] = newv ; cdelta = delta ; traildata = zisdata ; trailoverdata = overdata ; } else { maskprev = (maskprev << 1) | (((cdelta | - cdelta) >> 9) & 0x400000) | ((((cdelta >> 24) | 0x100) - 1) & 0x100) ; if (recomp == 0) break ; cdelta = 0 ; traildata = b->d[j + 8] ; trailoverdata = (traildata >> 8) + (ub->d[j + 8] << 24) ; } recomp >>= 1 ; j++ ; } p->c[i+1] = (short)(((p->c[i+1] & 0x100) << 1) | (maskprev >> (14 + j))) ; p->c[i] |= (maskprev >> j) & 0x1ff ; } else p->c[i+1] = 0 ; recomp = (p->c[i+2] | (pl->c[i+2] >> 9)) & 0xff ; ub = b ; lub = lb ; } recomp = p->c[0] ; i = recomp | p->c[1] | p->c[2] | p->c[3] | p->c[4] | p->c[5] ; if (recomp) return 0x201 | ((recomp & 0x100) << 2) | ((i & 0x100) >> 7) ; else return i ? ((i & 0x100) >> 7) | 1 : 0 ; } /** * Mark a node and its subnodes as changed. We really * only mark those nodes that have any cells set at all. */ int qlifealgo::markglobalchange(supertile *p, int lev) { int i ; if (lev == 0) { tile *pp = (tile *)p ; if (pp != emptytile) { int s = 0 ; for (int i=0; i<4; i++) for (int j=0; j<16; j++) s |= pp->b[i]->d[j] ; if (s) { pp->c[0] = pp->c[5] = 0x1ff ; pp->c[1] = pp->c[2] = pp->c[3] = pp->c[4] = 0x3ff ; return 0x603 ; } } return 0 ; } else { if (p != nullroots[lev]) { int nchanging = 0 ; if (generation.odd()) for (i=0; i<8; i++) nchanging |= (markglobalchange(p->d[i], lev-1)) << i ; else for (i=0; i<8; i++) nchanging |= (markglobalchange(p->d[i], lev-1)) << (7 - i) ; p->flags |= nchanging | 0xf0000000 ; return upchanging(nchanging) ; } return 0 ; } } void qlifealgo::markglobalchange() { markglobalchange(root, rootlev) ; deltaforward = 0xffffffff ; } /* * This subroutine sets a bit at a particular location. * * We walk down the tree to the particular bit, setting changing flags as * we go. */ int qlifealgo::setcell(int x, int y, int newstate) { if (newstate & ~1) return -1 ; y = - y ; supertile *b ; tile *p ; int lev ; int odd = generation.odd() ; if (odd) { x-- ; y-- ; } while (x < min || x > max || y < min || y > max) uproot() ; int xdel = (x >> 5) - minlow32 ; int ydel = (y >> 5) - minlow32 ; int xc = x - (minlow32 << 5) ; int yc = y - (minlow32 << 5) ; if (root == nullroot) root = newsupertile(rootlev) ; b = root ; lev = rootlev ; while (lev > 0) { int i, d = 1 ; if (lev & 1) { int s = (lev >> 1) + lev - 1 ; i = (xdel >> s) & 7 ; s = (1 << (s + 5)) - 2 ; if ((xc & s) == ((odd) ? s : 0)) d += 2 ; if ((yc & s) == ((odd) ? s : 0)) d += d << 9 ; } else { int s = (lev >> 1) + lev - 3 ; i = (ydel >> s) & 7 ; s = (1 << (s + 5)) - 2 ; if ((yc & s) == ((odd) ? s : 0)) d += 2 ; s |= s << 3 ; if ((xc & s) == ((odd) ? s : 0)) d += d << 9 ; } if (odd) b->flags |= (d << i) | 0xf0000000 ; else b->flags |= (d << (7 - i)) | 0xf0000000 ; if (b->d[i] == nullroots[lev-1]) b->d[i] = (lev==1 ? (supertile *)newtile() : newsupertile(lev-1)) ; lev -= 1 ; b = b->d[i] ; } x &= 31 ; y &= 31 ; p = (tile *)b ; if (p->b[(y >> 3) & 0x3] == emptybrick) p->b[(y >> 3) & 0x3] = newbrick() ; if (odd) { int mor = ((x & 2) ? 3 : 1) << ((x >> 2) & 0x7) ; p->c[((y >> 3) & 0x3) + 1] |= mor ; p->flags = -1 ; if ((y & 6) == 6) p->c[((y >> 3) & 0x3) + 2] |= mor ; if (newstate) p->b[(y >> 3) & 0x3]->d[8 + ((x >> 2) & 0x7)] |= (1 << (31 - (y & 7) * 4 - (x & 3))) ; else p->b[(y >> 3) & 0x3]->d[8 + ((x >> 2) & 0x7)] &= ~(1 << (31 - (y & 7) * 4 - (x & 3))) ; } else { int mor = ((x & 2) ? 1 : 3) << (7 - ((x >> 2) & 0x7)) ; p->c[((y >> 3) & 0x3) + 1] |= mor ; p->flags = -1 ; if ((y & 6) == 0) p->c[((y >> 3) & 0x3)] |= mor ; if (newstate) p->b[(y >> 3) & 0x3]->d[(x >> 2) & 0x7] |= (1 << (31 - (y & 7) * 4 - (x & 3))) ; else p->b[(y >> 3) & 0x3]->d[(x >> 2) & 0x7] &= ~(1 << (31 - (y & 7) * 4 - (x & 3))) ; } deltaforward = 0xffffffff ; return 0 ; } /* * This subroutine gets a bit at a particular location. */ int qlifealgo::getcell(int x, int y) { y = - y ; supertile *b ; tile *p ; int lev ; int odd = generation.odd() ; if (odd) { x-- ; y-- ; } while (x < min || x > max || y < min || y > max) uproot() ; if (x < min || x > max || y < min || y > max) return 0 ; int xdel = (x >> 5) - minlow32 ; int ydel = (y >> 5) - minlow32 ; if (root == nullroot) return 0 ; b = root ; lev = rootlev ; while (lev > 0) { int i ; if (lev & 1) { int s = (lev >> 1) + lev - 1 ; i = (xdel >> s) & 7 ; } else { int s = (lev >> 1) + lev - 3 ; i = (ydel >> s) & 7 ; } if (b->d[i] == nullroots[lev-1]) return 0 ; lev -= 1 ; b = b->d[i] ; } x &= 31 ; y &= 31 ; p = (tile *)b ; if (p->b[(y >> 3) & 0x3] == emptybrick) return 0 ; if (odd) { if (p->b[(y >> 3) & 0x3]->d[8 + ((x >> 2) & 0x7)] & (1 << (31 - (y & 7) * 4 - (x & 3)))) return 1 ; else return 0 ; } else { if (p->b[(y >> 3) & 0x3]->d[(x >> 2) & 0x7] & (1 << (31 - (y & 7) * 4 - (x & 3)))) return 1 ; else return 0 ; } } /** * Similar but returns the distance to the next set cell horizontally. */ int qlifealgo::nextcell(int x, int y, int &v) { v = 1 ; y = - y ; int odd = generation.odd() ; if (odd) { x-- ; y-- ; } while (x < min || x > max || y < min || y > max) uproot() ; if (x > max || x < min || y < min || y > max) return -1 ; return nextcell(x, y, root, rootlev) ; } int qlifealgo::nextcell(int x, int y, supertile *n, int lev) { if (lev > 0) { if (n == nullroots[lev]) return -1 ; int xdel = (x >> 5) - minlow32 ; int ydel = (y >> 5) - minlow32 ; int i ; if (lev & 1) { int s = (lev >> 1) + lev - 1 ; i = (xdel >> s) & 7 ; int r = 0 ; int off = (x & 31) + ((xdel & ((1 << s) - 1)) << 5) ; while (i < 8) { int t = nextcell(x, y, n->d[i], lev-1) ; if (t < 0) { r += (32 << s) - off ; x += (32 << s) - off ; off = 0 ; } else { return r + t ; } i++ ; } return -1 ; } else { int s = (lev >> 1) + lev - 3 ; i = (ydel >> s) & 7 ; return nextcell(x, y, n->d[i], lev-1) ; } } x &= 31 ; y &= 31 ; tile *p = (tile *)n ; brick *br = (brick *)(p->b[(y>>3) & 3]) ; if (br == emptybrick) return -1 ; int i = ((x >> 2) & 7) ; int add = (generation.odd() ? 8 : 0) ; int sh = (7 - (y & 7)) * 4 ; int r = 0 ; x &= 3 ; int m = 15 >> x ; while (i < 8) { int t = (br->d[i+add] >> sh) & m ; if (t) { if (t & 8) return r - x ; if (t & 4) return r + 1 - x ; if (t & 2) return r + 2 - x ; return r + 3 - x ; } r += (4 - x) ; x = 0 ; m = 15 ; i++ ; } return -1 ; } /* * This subroutine calculates the population count of the universe. It * uses dirty bits number 1 and 2 of supertiles. */ G_INT64 qlifealgo::find_set_bits(supertile *p, int lev, int gm1) { G_INT64 pop = 0 ; int i, j, k, b ; if (lev == 0) { tile *pp = (tile *)p ; b = 8 + gm1 * 12 ; pop = (pp->flags >> b) & 0xfff ; if (pop > 0x800) { pop = 0 ; for (i=0; i<4; i++) { if (pp->b[i] != emptybrick) { for (j=0; j<8; j++) { k = pp->b[i]->d[j+gm1*8] ; if (k) pop += bc[k & 255] + bc[(k >> 8) & 255] + bc[(k >> 16) & 255] + bc[(k >> 24) & 255] ; } } } pp->flags = (long)((pp->flags & ~(0xfff << b)) | (pop << b)) ; } } else { if (p->flags & (0x20000000 << gm1)) { for (i=0; i<8; i++) if (p->d[i] != nullroots[lev-1]) pop += find_set_bits(p->d[i], lev-1, gm1) ; if (pop < 500000000) { p->pop[gm1] = (long)pop ; p->flags &= ~(0x20000000 << gm1) ; } else { p->pop[gm1] = 0xfffffff ; // placeholder; *some* bits are set } } else { pop = p->pop[gm1] ; } } return pop ; } /** * A variation that tries to quickly answer: *any* bits set? */ int qlifealgo::isEmpty(supertile *p, int lev, int gm1) { int i, j, k, b ; if (lev == 0) { tile *pp = (tile *)p ; b = 8 + gm1 * 12 ; int pop = (pp->flags >> b) & 0xfff ; if (pop > 0x800) { pop = 0 ; for (i=0; i<4; i++) { if (pp->b[i] != emptybrick) { for (j=0; j<8; j++) { k = pp->b[i]->d[j+gm1*8] ; if (k) return 0 ; } } } } return pop ? 0 : 1 ; } else { if (p->flags & (0x20000000 << gm1)) { for (i=0; i<8; i++) if (p->d[i] != nullroots[lev-1]) if (!isEmpty(p->d[i], lev-1, gm1)) return 0 ; return 1 ; } else { return p->pop[gm1] ? 0 : 1 ; } } } /* * Another critical subroutine, this one cleans up the empty bricks, * tiles, and supertiles as the generations go by. This speeds things * up by not using too much memory (minimizing cache misses and TLB * misses). We only try to delete bricks, tiles, and supertiles from * regions of the universe that have been active since we last attempted * to delete tiles. We delete all possible tiles, even those near active * regions; if necessary, * * We use dirty bit number 0 of supertiles, and dirty bits 0..3 of * tiles. */ supertile *qlifealgo::mdelete(supertile *p, int lev) { int i ; if (lev == 0) { tile *pp = (tile *)p ; if (pp->flags & 0xf) { int seen = 0 ; for (i=0; i<4; i++) { brick *b = pp->b[i] ; if (b != emptybrick) { if ((pp->flags & (1 << i))) { if (b->d[0] | b->d[1] | b->d[2] | b->d[3] | b->d[4] | b->d[5] | b->d[6] | b->d[7] | b->d[8] | b->d[9] | b->d[10] | b->d[11] | b->d[12] | b->d[13] | b->d[14] | b->d[15]) { seen++ ; } else { STAT(bricks--) ; ((linkedmem *)b)->next = bricklist ; bricklist = (linkedmem *)b ; pp->b[i] = emptybrick ; } } else seen++ ; } } if (seen || ((pp->c[1] | pp->c[2] | pp->c[3] | pp->c[4]) & 0xff) || ((generation.odd()) ? pp->c[5] : pp->c[0])) pp->flags &= 0xfffffff0 ; else { STAT(tiles--) ; memset(pp, 0, sizeof(tile)) ; ((linkedmem *)pp)->next = tilelist ; tilelist = (linkedmem *)pp ; return nullroots[lev] ; } } } else { if (p->flags & 0x10000000) { int keep = 0 ; for (i=0; i<8; i++) if (p->d[i] != nullroots[lev-1]) if ((p->d[i] = mdelete(p->d[i], lev-1)) != nullroots[lev-1]) keep++ ; if (keep || p == root || (p->flags & 0x3ffff)) p->flags &= 0xefffffff ; else { STAT(supertiles--) ; memset(p, 0, sizeof(supertile)) ; ((linkedmem *)p)->next = supertilelist ; supertilelist = (linkedmem *)p ; return nullroots[lev] ; } } } return p ; } G_INT64 qlifealgo::popcount() { return find_set_bits(root, rootlev, generation.odd()) ; } const bigint &qlifealgo::getPopulation() { if (!popValid) { population = bigint(popcount()) ; popValid = 1 ; poller->reset_countdown() ; } return population ; } int qlifealgo::isEmpty() { return isEmpty(root, rootlev, generation.odd()) ; } /* * Here we look at the root node and see if activity is getting * uncomfortably close to the current edges. If so, we add another * level onto the top. */ int qlifealgo::uproot_needed() { int i ; if (root->d[0] != nullroots[rootlev-1] || root->d[7] != nullroots[rootlev-1]) return 1 ; for (i=1; i<7; i++) if (root->d[i]->d[0] != nullroots[rootlev-2] || root->d[i]->d[7] != nullroots[rootlev-2]) return 1 ; return 0 ; } /* * The new generation code is simple. We uproot if needed. Then, we call * the appropriate top-level slice code depending on the generation number. * Finally, if we are generations 64, 128, 192, and so on, we clean up * the tree. * * Note that this 64 was carefully chosen to balance extraneous bricks left * behind by gliders against the computational cost of deletion. */ void qlifealgo::dogen() { poller->reset_countdown() ; #ifdef STATS ds = 0 ; dq = 0 ; rcc = 0 ; #endif // AKT: if grid is bounded then we should never need to call uproot() here // because setrule() has already expanded the universe to enclose the grid if (gridwd == 0 || gridht == 0) { while (uproot_needed()) uproot() ; } if (generation.odd()) doquad10(root, nullroot, nullroot, nullroot, rootlev) ; else doquad01(root, nullroot, nullroot, nullroot, rootlev) ; deltaforward = 0 ; generation += bigint::one ; popValid = 0 ; if (--cleandowncounter == 0) { cleandowncounter = 63 ; mdelete(root, rootlev) ; } #ifdef STATS dss += ds ; dqs += dq ; rccs += rcc ; #endif } /** * Step. Do increment generations. */ void qlifealgo::step() { poller->bailIfCalculating() ; bigint t = increment ; while (t != 0) { if (qliferules.alternate_rules) { // emulate B0-not-Smax rule by changing rule table depending on gen parity if (generation.odd()) ruletable = qliferules.rule1 ; else ruletable = qliferules.rule0 ; } else { ruletable = qliferules.rule0 ; } dogen() ; if (poller->isInterrupted()) break ; t -= 1 ; if (t > increment) // might change; make it happen now t = increment ; } } // Flip bits in given rule table. // This is a tad tricky because we want to turn both the input // and the output of this table upside down. static void fliprule(char *rptr) { for (int i=0; i<65536; i++) { int j = ((i & 0xf) << 12) + ((i & 0xf0) << 4) + ((i & 0xf00) >> 4) + ((i & 0xf000) >> 12) ; if (i <= j) { char fi = rptr[i] ; char fj = rptr[j] ; fi = ((fi & 0x30) >> 4) + ((fi & 0x3) << 4) ; fj = ((fj & 0x30) >> 4) + ((fj & 0x3) << 4) ; rptr[i] = fj ; rptr[j] = fi ; } } } /** * If we change the rule we need to mark everything dirty. */ const char *qlifealgo::setrule(const char *s) { const char* err = qliferules.setrule(s, this); if (err) return err; markglobalchange() ; // AKT: qlifealgo has an opposite interpretation of the orientation of // a rule table assumed by qliferules.setrule. For vertically symmetrical // rules such as the Moore or von Neumann neighborhoods this doesn't matter, // but for hexagonal rules and Wolfram rules we need to flip the rule table(s) // upside down. if ( qliferules.isHexagonal() || qliferules.isWolfram() ) { if (qliferules.alternate_rules) { // hex rule has B0 but not S6 so we'll be using rule1 for odd gens fliprule(qliferules.rule1); } fliprule(qliferules.rule0); } // ruletable is set in step(), but play safe ruletable = qliferules.rule0 ; if (qliferules.isHexagonal()) grid_type = HEX_GRID; else if (qliferules.isVonNeumann()) grid_type = VN_GRID; else grid_type = SQUARE_GRID; // AKT: if the grid is bounded then call uproot() if necessary so that // dogen() never needs to call it if (gridwd > 0 && gridht > 0) { // use the top left and bottom right corners of the grid, but expanded by 2 // to allow for growth in the borders when the grid edges are joined int xmin = -int(gridwd/2) - 2; int ymin = -int(gridht/2) - 2; int xmax = xmin + gridwd + 3; int ymax = ymin + gridht + 3; // duplicate the expansion code in setcell() ymin = -ymin; ymax = -ymax; if (generation.odd()) { xmin--; ymin--; xmax--; ymax--; } // min is -ve, max is +ve, xmin is -ve, xmax is +ve, ymin is +ve, ymax is -ve while (xmin < min || xmax > max || ymin > max || ymax < min) uproot(); } return 0; } static lifealgo *creator() { return new qlifealgo() ; } void qlifealgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ai.setAlgorithmName("QuickLife") ; ai.setAlgorithmCreator(&creator) ; ai.setDefaultBaseStep(10) ; ai.setDefaultMaxMem(0) ; ai.minstates = 2 ; ai.maxstates = 2 ; // init default color scheme ai.defgradient = false; ai.defr1 = ai.defg1 = ai.defb1 = 255; // start color = white ai.defr2 = ai.defg2 = ai.defb2 = 255; // end color = white ai.defr[0] = ai.defg[0] = ai.defb[0] = 48; // 0 state = dark gray ai.defr[1] = ai.defg[1] = ai.defb[1] = 255; // 1 state = white } golly-2.5-src/gollybase/qlifedraw.cpp0000644000175100001440000010127712156145314014666 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "qlifealgo.h" #include #include #include "util.h" const int logbmsize = 8 ; // *must* be 8 in this code const int bmsize = (1< 1) { rx *= pmag ; ry *= pmag ; rw *= pmag ; rh *= pmag ; } ry = uviewh - ry - rh ; // AKT: eventually we'll draw directly into pixbuf rather than bigbuf!!! if (pmag > 1) { // convert each bigbuf byte into 8 bytes of state data int j = 0; for (int i = 0; i < ibufsize * 4; i++) { int byte = bigbuf[i]; for (int bit = 128; bit > 0; bit >>= 1) { pixbuf[j++] = (byte & bit) ? 1 : 0; } } } else { // convert each bigbuf byte into 24 bytes of pixel data (8 * rgb) int j = 0; for (int i = 0; i < ibufsize * 4; i++) { int byte = bigbuf[i]; for (int bit = 128; bit > 0; bit >>= 1) { if (byte & bit) { pixbuf[j++] = liver; pixbuf[j++] = liveg; pixbuf[j++] = liveb; } else { pixbuf[j++] = deadr; pixbuf[j++] = deadg; pixbuf[j++] = deadb; } } } } renderer->pixblit(rx, ry, rw, rh, (char *)pixbuf, pmag); memset(bigbuf, 0, sizeof(ibigbuf)) ; } void qlifealgo::clearrect(int minx, int miny, int w, int h) { // minx,miny is lower left corner if (w <= 0 || h <= 0) return ; if (pmag > 1) { minx *= pmag ; miny *= pmag ; w *= pmag ; h *= pmag ; } miny = uviewh - miny - h ; renderer->killrect(minx, miny, w, h) ; } static int minlevel; /* * We cheat for now; we assume we can use 32-bit ints. We can below * a certain level; we'll deal with higher levels later. */ void qlifealgo::BlitCells(supertile *p, int xoff, int yoff, int wd, int ht, int lev) { int i, xinc=0, yinc=0, ypos, x, yy; int liveseen = 0 ; if (xoff >= vieww || xoff + wd < 0 || yoff >= viewh || yoff + ht < 0) // no part of this supertile is visible return; if (p == nullroots[lev]) { clearrect(xoff, yoff, wd, ht) ; return; } // do recursion until we get to level 2 (256x256 supertile) if (lev > 2) { if (lev & 1) { // odd level -- 8 subtiles are stacked horizontally xinc = wd = ht; } else { // even level -- 8 subtiles are stacked vertically yinc = ht = (ht >> 3); } for (i=0; i<8; i++) { BlitCells(p->d[i], xoff, yoff, wd, ht, lev-1); xoff += xinc; yoff += yinc; } return; } // walk a (probably) non-empty 256x256 supertile, finding all the 1 bits and // setting corresponding bits in the bitmap (bigbuf) liveseen = 0 ; ypos = yoff; // examine the 8 vertically stacked subtiles in this 256x256 supertile (at level 2) for (yy=0; yy<8; yy++) { if (p->d[yy] != nullroots[1] && ypos < viewh && ypos + 32 >= 0) { supertile *psub = p->d[yy]; x = xoff; // examine the 8 tiles in this 256x32 supertile (at level 1) for (i=0; i<8; i++) { if (psub->d[i] != nullroots[0] && x < vieww && x + 32 >= 0) { tile *t = (tile *)psub->d[i]; int j, k, y = ypos; // examine the 4 bricks in this 32x32 tile (at level 0) for (j=0; j<4; j++) { if (t->b[j] != emptybrick && y < viewh && y + 8 >= 0) { brick *b = t->b[j]; // examine the 8 slices (2 at a time) in the appropriate half-brick for (k=0; k<8; k+=2) { unsigned int v1 = b->d[k+kadd]; unsigned int v2 = b->d[k+kadd+1]; if (v1|v2) { // do an 8x8 set of bits (2 adjacent slices) int xd = (i<<2)+(k>>1); int yd = (7 - yy) << 10; // 1024 bytes in 256x32 supertile unsigned char *p = bigbuf + yd + xd + ((3 - j) << 8); unsigned int v3 = (((v1 & 0x0f0f0f0f) << 4) | (v2 & 0x0f0f0f0f)); v2 = ((v1 & 0xf0f0f0f0) | ((v2 >> 4) & 0x0f0f0f0f)); *p = (unsigned char)v3; p[32] = (unsigned char)v2; p[64] = (unsigned char)(v3 >> 8); p[96] = (unsigned char)(v2 >> 8); p[128] = (unsigned char)(v3 >> 16); p[160] = (unsigned char)(v2 >> 16); p[192] = (unsigned char)(v3 >> 24); p[224] = (unsigned char)(v2 >> 24); liveseen |= (1 << yy) ; } } } y += 8; // down to next brick } } x += 32; // across to next tile } } ypos += 32; // down to next subtile } if (liveseen == 0) { clearrect(xoff, yoff, wd, ht) ; return; // no live cells seen } // performance: if we want, liveseen now contains eight bits // corresponding to whether those respective 256x32 rectangles // contain set pixels or not. We should trim the bitmap // to only render those portions that need to be rendered // (using this information). -tom // // draw the non-empty bitmap, scaling up if pmag > 1 renderbm(xoff, yoff) ; } // This pattern drawing routine is used when mag > 0. // We go down to a level where what we're going to draw maps to one // of 256x256, 128x128, or 64x64. // // We no longer rely on popcount having been called; instead we invoke // the popcount child if needed. void qlifealgo::ShrinkCells(supertile *p, int xoff, int yoff, int wd, int ht, int lev) { int i ; if (lev >= bmlev) { if (xoff >= vieww || xoff + wd < 0 || yoff >= viewh || yoff + ht < 0) // no part of this supertile/tile is visible return ; if (p == nullroots[lev]) { clearrect(xoff, yoff, wd, ht) ; return ; } if (lev == bmlev) { bmleft = xoff ; bmtop = yoff ; } } else { if (p == nullroots[lev]) return ; } int bminc = -1 << (logshbmsize-3) ; unsigned char *bm = bigbuf + (((shbmsize-1)-yoff+bmtop) << (logshbmsize-3)) + ((xoff-bmleft) >> 3) ; int bit = 128 >> ((xoff-bmleft) & 7) ; // do recursion until we get to minimum level (which depends on mag) if (lev > minlevel) { int xinc = 0, yinc = 0 ; if (lev & 1) { // odd level -- 8 subtiles are stacked horizontally xinc = wd ; wd = ht ; } else { // even level -- 8 subtiles are stacked vertically yinc = ht ; ht = (ht >> 3); } int xxinc = 0 ; int yyinc = 0 ; if (yinc <= 8 && xinc == 0) { // This is a case where we need to traverse multiple nodes for a // single pixel. This can be really slow, especially if we have // to examine 4x4=16 nodes just for a single pixel! To help // mitigate that, we special-case this and do the entire square, // tracking which pixels are set and not traversing when we // would set a pixel again. xinc = yinc ; int sh = 0 ; if (xinc == 8) sh = 0 ; else if (xinc == 4) sh = 1 ; else if (xinc == 2) sh = 2 ; for (i=0; i<8; i++) { if (p->d[i] != nullroots[lev-1]) { supertile *pp = p->d[i] ; int bbit = bit ; for (int j=0; j<8; j++) { if (pp->d[j] != nullroots[lev-2]) { if (0 == (*bm & bbit)) { supertile *ppp = pp->d[j] ; if (lev > 2) { if ( ppp->pop[oddgen] != 0 ) *bm |= bbit ; } else { tile *t = (tile *)ppp ; if (t->flags & quickb) *bm |= bbit ; } } } if ((j ^ (j + 1)) >> sh) bbit >>= 1 ; } } if ((i ^ (i + 1)) >> sh) bm += bminc ; } return ; } else { for (i=0; i<8; i++) { ShrinkCells(p->d[i], xoff + (xxinc >> 3), yoff + (yyinc >> 3), wd, ht, lev-1); xxinc += xinc ; yyinc += yinc ; } if (lev == bmlev) renderbm(bmleft, bmtop, shbmsize, shbmsize) ; } } else if (mag > 4) { if (lev > 0) { // mag >= 8 if ( p->pop[oddgen] != 0 ) *bm |= bit ; } else { // mag = 5..7 tile *t = (tile *)p; if (t->flags & quickb) *bm |= bit ; } } else { switch (mag) { case 4: { // shrink 32x32 tile to 2x2 pixels tile *t = (tile *)p; if ((t->b[0] != emptybrick || t->b[1] != emptybrick) ) { brick *bt = t->b[0]; brick *bb = t->b[1]; // examine the top left 16x16 cells if ( bt->d[kadd+0] | bt->d[kadd+1] | bt->d[kadd+2] | bt->d[kadd+3] | bb->d[kadd+0] | bb->d[kadd+1] | bb->d[kadd+2] | bb->d[kadd+3] ) // shrink 16x16 cells to 1 pixel *bm |= bit ; // examine the top right 16x16 cells if ( bt->d[kadd+4] | bt->d[kadd+5] | bt->d[kadd+6] | bt->d[kadd+7] | bb->d[kadd+4] | bb->d[kadd+5] | bb->d[kadd+6] | bb->d[kadd+7] ) // shrink 16x16 cells to 1 pixel *bm |= bit >> 1 ; } bm += bminc ; if (t->b[2] != emptybrick || t->b[3] != emptybrick) { brick *bt = t->b[2]; brick *bb = t->b[3]; // examine the bottom left 16x16 cells if ( bt->d[kadd+0] | bt->d[kadd+1] | bt->d[kadd+2] | bt->d[kadd+3] | bb->d[kadd+0] | bb->d[kadd+1] | bb->d[kadd+2] | bb->d[kadd+3] ) // shrink 16x16 cells to 1 pixel *bm |= bit ; // examine the bottom right 16x16 cells if ( bt->d[kadd+4] | bt->d[kadd+5] | bt->d[kadd+6] | bt->d[kadd+7] | bb->d[kadd+4] | bb->d[kadd+5] | bb->d[kadd+6] | bb->d[kadd+7] ) // shrink 16x16 cells to 1 pixel *bm |= bit >> 1 ; } } break; case 3: { // mag = 3 so shrink 32x32 tile to 4x4 pixels tile *t = (tile *)p; int j ; // examine the 4 bricks in this 32x32 tile for (j=0; j<4; j++) { if (t->b[j] != emptybrick) { brick *b = t->b[j]; int k ; // examine the 8 slices (2 at a time) in the appropriate half-brick int bbit = bit; for (k=0; k<8; k += 2) { if ( (b->d[k+kadd] | b->d[k+kadd+1]) ) *bm |= bbit ; bbit >>= 1 ; } } bm += bminc ; } } break; case 2: { // mag = 2 so shrink 32x32 tile to 8x8 pixels tile *t = (tile *)p; int j ; // examine the 4 bricks in this 32x32 tile for (j=0; j<4; j++) { if (t->b[j] != emptybrick) { brick *b = t->b[j]; int k ; bit = 128 ; // examine the 8 slices in the appropriate half-brick for (k=0; k<8; k++) { unsigned int s = b->d[k+kadd]; // s represents a 4x8 slice so examine top and bottom halves if (s) { if (s & 0xFFFF0000) *bm |= bit ; if (s & 0x0000FFFF) bm[bminc] |= bit ; } bit >>= 1 ; } } bm += 2 * bminc ; } } break; case 1: { // mag = 1 so shrink 32x32 tile to 16x16 pixels tile *t = (tile *)p; int j ; // examine the 4 bricks in this 32x32 tile unsigned char *bmm = bm ; for (j=0; j<4; j++) { if (t->b[j] != emptybrick) { brick *b = t->b[j]; int k ; bit = 128 ; // examine the 8 slices in the appropriate half-brick for (k=0; k<8; k++) { unsigned int s = b->d[k+kadd]; if (s) { // s is a non-empty 4x8 slice so shrink each 2x2 section to 1 pixel if (s & 0xCC000000) *bmm |= bit ; if (s & 0x00CC0000) bmm[bminc] |= bit ; if (s & 0x0000CC00) bmm[bminc+bminc] |= bit ; if (s & 0x000000CC) bmm[bminc+bminc+bminc] |= bit ; bit >>= 1 ; if (s & 0x33000000) *bmm |= bit ; if (s & 0x00330000) bmm[bminc] |= bit ; if (s & 0x00003300) bmm[bminc+bminc] |= bit ; if (s & 0x00000033) bmm[bminc+bminc+bminc] |= bit ; bit >>= 1 ; } else { bit >>= 2 ; } if (bit < 1) { bmm++ ; bit = 128 ; } } bmm -= 2 ; } bmm += 4 * bminc ; } } break; } } } /* * Fill in the llxb and llyb bits from the viewport information. * Allocate if necessary. This arithmetic should be done carefully. */ void qlifealgo::fill_ll(int d) { pair coor = view->at(0, view->getymax()) ; coor.second.mul_smallint(-1) ; coor.first -= bmin ; coor.second -= bmin ; int bitsreq = coor.first.bitsreq() ; int bitsreq2 = coor.second.bitsreq() ; if (bitsreq2 > bitsreq) bitsreq = bitsreq2 ; if (bitsreq <= d) bitsreq = d + 1 ; // need to access llxyb[d] if (bitsreq > llsize) { if (llsize) { delete [] llxb ; delete [] llyb ; } llxb = new char[bitsreq] ; llyb = new char[bitsreq] ; llsize = bitsreq ; } llbits = bitsreq ; coor.first.tochararr(llxb, llbits) ; coor.second.tochararr(llyb, llbits) ; } void qlifealgo::draw(viewport &viewarg, liferender &renderarg) { memset(bigbuf, 0, sizeof(ibigbuf)) ; renderer = &renderarg ; // AKT: get cell colors unsigned char *r, *g, *b; renderer->getcolors(&r, &g, &b); deadr = r[0]; deadg = g[0]; deadb = b[0]; liver = r[1]; liveg = g[1]; liveb = b[1]; view = &viewarg ; uvieww = view->getwidth() ; uviewh = view->getheight() ; oddgen = getGeneration().odd() ; kadd = oddgen ? 8 : 0 ; int xoff, yoff ; if (view->getmag() > 0) { pmag = 1 << (view->getmag()) ; mag = 0 ; viewh = ((uviewh - 1) >> view->getmag()) + 1 ; vieww = ((uvieww - 1) >> view->getmag()) + 1 ; uviewh += (-uviewh) & (pmag-1) ; } else { mag = (-view->getmag()) ; // cheat for now since unzoom is broken pmag = 1 ; viewh = uviewh ; vieww = uvieww ; } if (root == nullroots[rootlev]) { clearrect(0, 0, view->getwidth(), view->getheight()) ; renderer = 0 ; view = 0 ; return ; } int d = 5 + (rootlev + 1) / 2 * 3 ; fill_ll(d) ; int maxd = vieww ; supertile *sw = root, *nw = nullroots[rootlev], *ne = nullroots[rootlev], *se = nullroots[rootlev] ; if (viewh > maxd) maxd = viewh ; int llx=-llxb[llbits-1], lly=-llyb[llbits-1] ; /* Skip down to top of tree. */ int i; for (i=llbits-1; i>=d && i>=mag; i--) { /* go down to d, but not further than mag */ llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { clearrect(0, 0, vieww, viewh) ; renderer = 0 ; view = 0 ; return ; } } /* Find the lowest four we need to examine */ int curlev = rootlev ; while (d > 8 && d - mag > 2 && (d - mag > 28 || (1 << (d - mag)) > 32 * maxd)) { // d is 5 + 3 * i for some positive i llx = (llx << 3) + (llxb[d-1] << 2) + (llxb[d-2] << 1) + llxb[d-3] ; lly = (lly << 3) + (llyb[d-1] << 2) + (llyb[d-2] << 1) + llyb[d-3] ; int xp = llx ; if (xp < 0) xp = 0 ; else if (xp > 7) xp = 7 ; int yp = lly ; if (yp < 0) yp = 0 ; else if (yp > 7) yp = 7 ; if (xp == 7) { if (yp == 7) { ne = ne->d[0]->d[0] ; se = se->d[7]->d[0] ; nw = nw->d[0]->d[7] ; sw = sw->d[7]->d[7] ; } else { ne = se->d[yp+1]->d[0] ; se = se->d[yp]->d[0] ; nw = sw->d[yp+1]->d[7] ; sw = sw->d[yp]->d[7] ; } } else { if (yp == 7) { ne = nw->d[0]->d[xp+1] ; se = sw->d[7]->d[xp+1] ; nw = nw->d[0]->d[xp] ; sw = sw->d[7]->d[xp] ; } else { ne = sw->d[yp+1]->d[xp+1] ; se = sw->d[yp]->d[xp+1] ; nw = sw->d[yp+1]->d[xp] ; sw = sw->d[yp]->d[xp] ; } } llx -= xp ; lly -= yp ; if (llx > 2*maxd || lly > 2*maxd || llx < -2*maxd || lly < -2*maxd) { clearrect(0, 0, vieww, viewh) ; renderer = 0 ; view = 0 ; return ; } d -= 3 ; curlev -= 2 ; } find_set_bits(nw, curlev, oddgen) ; find_set_bits(ne, curlev, oddgen) ; find_set_bits(sw, curlev, oddgen) ; find_set_bits(se, curlev, oddgen) ; // getPopulation() ; /* At this point we know we can use 32-bit arithmetic. */ for (i=d-1; i>=mag; i--) { llx = (llx << 1) + llxb[i] ; lly = (lly << 1) + llyb[i] ; } /* now, we have four nodes to draw. the ll point in screen coordinates is given by llx/lly. the ur point in screen coordinates is given by that plus 2 << (d-mag). */ xoff = -llx ; yoff = -lly ; if (mag == 0) { xoff += oddgen ; yoff += oddgen ; } int wd = 2 ; if (d >= mag) wd = 2 << (d-mag) ; int yoffuht = yoff + wd ; int xoffuwd = xoff + wd ; if (yoff >= viewh || xoff >= vieww || yoffuht < 0 || xoffuwd < 0) { clearrect(0, 0, view->getwidth(), view->getheight()) ; renderer = 0 ; view = 0 ; return ; } if (yoff > 0) clearrect(0, 0, vieww, yoff) ; if (xoff > 0) clearrect(0, yoff, xoff, wd) ; if (yoffuht < viewh) clearrect(0, yoffuht, vieww, viewh-yoffuht) ; if (xoffuwd < vieww) clearrect(xoffuwd, yoff, vieww-xoffuwd, wd) ; int levsize = wd / 2 ; // do recursive drawing quickb = 0xfff << (8 + oddgen * 12) ; if (mag > 0) { bmlev = (1 + mag / 3) * 2 ; logshbmsize = 8 - (mag % 3) ; shbmsize = 1 << logshbmsize ; if (mag < 5) { // recurse down to 32x32 tiles minlevel = 0; } else { // if mag = 5..7 minlevel = 0 (32x32 tiles) // if mag = 8..10 minlevel = 2 (256x256 supertiles) // if mag = 11..13 minlevel = 4 (2048x2048 supertiles) etc... minlevel = ((mag - 5) / 3) * 2; } bmleft = xoff ; bmtop = yoff ; ShrinkCells(sw, xoff, yoff, levsize, levsize, curlev); ShrinkCells(se, xoff+levsize, yoff, levsize, levsize, curlev); ShrinkCells(nw, xoff, yoff+levsize, levsize, levsize, curlev); ShrinkCells(ne, xoff+levsize, yoff+levsize, levsize, levsize, curlev); if (bmlev > curlev) renderbm(bmleft, bmtop, shbmsize, shbmsize) ; } else { // recurse down to 256x256 supertiles and use bitmap blitting BlitCells(sw, xoff, yoff, levsize, levsize, curlev); BlitCells(se, xoff+levsize, yoff, levsize, levsize, curlev); BlitCells(nw, xoff, yoff+levsize, levsize, levsize, curlev); BlitCells(ne, xoff+levsize, yoff+levsize, levsize, levsize, curlev); } renderer = 0 ; view = 0 ; } /** * Find the subsupertiles with the smallest indices. */ int qlifealgo::lowsub(vector &src, vector &dst, int lev) { int lowlev = 7 ; dst.clear() ; supertile *z = nullroots[lev-1] ; if (lev > 1) { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=0; jd[j] != z && (p->d[j]->pop[oddgen])) { lowlev = j ; dst.clear() ; } if (p->d[lowlev] != z && (p->d[lowlev]->pop[oddgen])) dst.push_back(p->d[lowlev]) ; } } else { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=0; jd[j] != z && (((tile *)(p->d[j]))->flags & quickb)) { lowlev = j ; dst.clear() ; } if (p->d[lowlev] != z && (((tile *)(p->d[lowlev]))->flags & quickb)) dst.push_back(p->d[lowlev]) ; } } return lowlev ; } /** * Find the subsupertiles with the highest indices. */ int qlifealgo::highsub(vector &src, vector &dst, int lev) { int highlev = 0 ; dst.clear() ; supertile *z = nullroots[lev-1] ; if (lev > 1) { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=7; j>highlev; j--) if (p->d[j] != z && (p->d[j]->pop[oddgen])) { highlev = j ; dst.clear() ; } if (p->d[highlev] != z && (p->d[highlev]->pop[oddgen])) dst.push_back(p->d[highlev]) ; } } else { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=7; j>highlev; j--) if (p->d[j] != z && (((tile *)(p->d[j]))->flags & quickb)) { highlev = j ; dst.clear() ; } if (p->d[highlev] != z && (((tile *)(p->d[highlev]))->flags & quickb)) dst.push_back(p->d[highlev]) ; } } return highlev ; } /** * Find all nonzero sub-supertiles. */ void qlifealgo::allsub(vector &src, vector &dst, int lev) { dst.clear() ; supertile *z = nullroots[lev-1] ; if (lev > 1) { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=0; j<8; j++) if (p->d[j] != z && (p->d[j]->pop[oddgen])) dst.push_back(p->d[j]) ; } } else { for (int i=0; i<(int)src.size(); i++) { supertile *p = src[i] ; for (int j=0; j<8; j++) if (p->d[j] != z && (((tile *)(p->d[j]))->flags & quickb)) dst.push_back(p->d[j]) ; } } } int qlifealgo::gethbitsfromleaves(vector v) { int h[8] ; int i; for (i=0; i<8; i++) h[i] = 0 ; for (i=0; i<(int)v.size(); i++) { tile *p = (tile *)v[i] ; for (int j=0; j<4; j++) if (p->b[j] != emptybrick) for (int k=0; k<8; k++) h[k] |= p->b[j]->d[k+kadd] ; } int r = 0 ; for (i=0; i<8; i++) { int v = h[i] ; v |= (v >> 16) ; v |= (v >> 8) ; v |= (v >> 4) ; r = (r << 4) | (v & 15) ; } return r ; } int qlifealgo::getvbitsfromleaves(vector vec) { int v[4] ; int i; for (i=0; i<4; i++) v[i] = 0 ; for (i=0; i<(int)vec.size(); i++) { tile *p = (tile *)vec[i] ; for (int j=0; j<4; j++) if (p->b[j] != emptybrick) for (int k=0; k<8; k++) v[j] |= p->b[j]->d[k+kadd] ; } int r = 0 ; for (i=3; i>=0; i--) { int vv = v[i] ; for (int j=0; j<8; j++) { r += r ; if (vv & (0xf << (4 * j))) r++ ; } } return r ; } void qlifealgo::findedges(bigint *ptop, bigint *pleft, bigint *pbottom, bigint *pright) { // AKT: following code is from fit() but all goal/size stuff // has been removed so it finds the exact pattern edges bigint xmin = 0 ; bigint xmax = 1 ; bigint ymin = 0 ; bigint ymax = 1 ; getPopulation() ; // make sure pop values are valid oddgen = getGeneration().odd() ; kadd = oddgen ? 8 : 0 ; quickb = 0xfff << (8 + oddgen * 12) ; int currdepth = rootlev ; if (root == nullroots[currdepth] || root->pop[oddgen] == 0) { // AKT: return impossible edges to indicate empty pattern; // not really a problem because caller should check first *ptop = 1 ; *pleft = 1 ; *pbottom = 0 ; *pright = 0 ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; int bitval = (currdepth + 1) / 2 * 3 + 5 ; while (bitval > 0) { if (bitval == 5) { // we have leaf nodes; turn them into bitmasks topbm = getvbitsfromleaves(top) ; bottombm = getvbitsfromleaves(bottom) ; leftbm = gethbitsfromleaves(left) ; rightbm = gethbitsfromleaves(right) ; } if (bitval <= 5) { int sz = 1 << bitval ; int masklo = (1 << (sz >> 1)) - 1 ; int maskhi = ~masklo ; ymax += ymax ; xmax += xmax ; ymin += ymin ; xmin += xmin ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-1) ; } else { topbm = (topbm >> (sz >> 1)) & masklo ; } if ((bottombm & masklo) == 0) { ymin.add_smallint(1) ; bottombm = (bottombm >> (sz >> 1)) & masklo ; } if ((rightbm & masklo) == 0) { xmax.add_smallint(-1) ; rightbm = (rightbm >> (sz >> 1)) & masklo ; } if ((leftbm & maskhi) == 0) { xmin.add_smallint(1) ; } else { leftbm = (leftbm >> (sz >> 1)) & masklo ; } bitval-- ; } else { vector newv ; int outer = highsub(top, newv, currdepth) ; allsub(newv, top, currdepth-1) ; ymax <<= 3 ; ymax -= (7 - outer) ; outer = lowsub(bottom, newv, currdepth) ; allsub(newv, bottom, currdepth-1) ; ymin <<= 3 ; ymin += outer ; allsub(left, newv, currdepth) ; outer = lowsub(newv, left, currdepth-1) ; xmin <<= 3 ; xmin += outer ; allsub(right, newv, currdepth) ; outer = highsub(newv, right, currdepth-1) ; xmax <<= 3 ; xmax -= (7-outer) ; currdepth -= 2 ; bitval -= 3 ; } } if (bitval > 0) { xmin <<= bitval ; ymin <<= bitval ; xmax <<= bitval ; ymax <<= bitval ; } if (oddgen) { xmin += 1 ; ymin += 1 ; xmax += 1 ; ymax += 1 ; } xmin += bmin ; ymin += bmin ; xmax += bmin ; ymax += bmin ; ymax -= 1 ; xmax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; // set pattern edges *ptop = ymax ; // due to y flip *pbottom = ymin ; // due to y flip *pleft = xmin ; *pright = xmax ; } void qlifealgo::fit(viewport &view, int force) { bigint xmin = 0 ; bigint xmax = 1 ; bigint ymin = 0 ; bigint ymax = 1 ; getPopulation() ; // make sure pop values are valid oddgen = getGeneration().odd() ; kadd = oddgen ? 8 : 0 ; quickb = 0xfff << (8 + oddgen * 12) ; int xgoal = view.getwidth() - 2 ; int ygoal = view.getheight() - 2 ; if (xgoal < 8) xgoal = 8 ; if (ygoal < 8) ygoal = 8 ; int xsize = 1 ; int ysize = 1 ; int currdepth = rootlev ; if (root == nullroots[currdepth] || root->pop[oddgen] == 0) { view.center() ; view.setmag(MAX_MAG) ; return ; } vector top, left, bottom, right ; top.push_back(root) ; left.push_back(root) ; bottom.push_back(root) ; right.push_back(root) ; int topbm = 0, bottombm = 0, rightbm = 0, leftbm = 0 ; int bitval = (currdepth + 1) / 2 * 3 + 5 ; while (bitval > 0) { if (bitval == 5) { // we have leaf nodes; turn them into bitmasks topbm = getvbitsfromleaves(top) ; bottombm = getvbitsfromleaves(bottom) ; leftbm = gethbitsfromleaves(left) ; rightbm = gethbitsfromleaves(right) ; } if (bitval <= 5) { int sz = 1 << bitval ; int masklo = (1 << (sz >> 1)) - 1 ; int maskhi = ~masklo ; ymax += ymax ; xmax += xmax ; ymin += ymin ; xmin += xmin ; xsize <<= 1 ; ysize <<= 1 ; if ((topbm & maskhi) == 0) { ymax.add_smallint(-1) ; ysize-- ; } else { topbm = (topbm >> (sz >> 1)) & masklo ; } if ((bottombm & masklo) == 0) { ymin.add_smallint(1) ; ysize-- ; bottombm = (bottombm >> (sz >> 1)) & masklo ; } if ((rightbm & masklo) == 0) { xmax.add_smallint(-1) ; xsize-- ; rightbm = (rightbm >> (sz >> 1)) & masklo ; } if ((leftbm & maskhi) == 0) { xmin.add_smallint(1) ; xsize-- ; } else { leftbm = (leftbm >> (sz >> 1)) & masklo ; } bitval-- ; } else { vector newv ; ysize <<= 3 ; int outer = highsub(top, newv, currdepth) ; allsub(newv, top, currdepth-1) ; ymax <<= 3 ; ymax -= (7 - outer) ; ysize -= (7 - outer) ; outer = lowsub(bottom, newv, currdepth) ; allsub(newv, bottom, currdepth-1) ; ymin <<= 3 ; ymin += outer ; ysize -= outer ; xsize <<= 3 ; allsub(left, newv, currdepth) ; outer = lowsub(newv, left, currdepth-1) ; xmin <<= 3 ; xmin += outer ; xsize -= outer ; allsub(right, newv, currdepth) ; outer = highsub(newv, right, currdepth-1) ; xmax <<= 3 ; xmax -= (7-outer) ; xsize -= (7-outer) ; currdepth -= 2 ; bitval -= 3 ; } if (xsize > xgoal || ysize > ygoal) break ; } if (bitval > 0) { xmin <<= bitval ; ymin <<= bitval ; xmax <<= bitval ; ymax <<= bitval ; } if (oddgen) { xmin += 1 ; ymin += 1 ; xmax += 1 ; ymax += 1 ; } xmin += bmin ; ymin += bmin ; xmax += bmin ; ymax += bmin ; ymax -= 1 ; xmax -= 1 ; ymin.mul_smallint(-1) ; ymax.mul_smallint(-1) ; if (!force) { // if all four of the above dimensions are in the viewport, don't change if (view.contains(xmin, ymin) && view.contains(xmax, ymax)) return ; } xmin += xmax ; xmin >>= 1 ; ymin += ymax ; ymin >>= 1 ; int mag = - bitval ; while (2 * xsize <= xgoal && 2 * ysize <= ygoal && mag < MAX_MAG) { mag++ ; xsize *= 2 ; ysize *= 2 ; } while (xsize > xgoal || ysize > ygoal) { mag-- ; xsize /= 2 ; ysize /= 2 ; } view.setpositionmag(xmin, ymin, mag) ; } /** * This is not fixed for qlife yet. FIXME */ void qlifealgo::lowerRightPixel(bigint &x, bigint &y, int mag) { if (mag >= 0) return ; x += bmin ; x >>= -mag ; x <<= -mag ; x -= bmin ; y -= 1 ; y += bmin ; y >>= -mag ; y <<= -mag ; y -= bmin ; y += 1 ; } golly-2.5-src/gollybase/readpattern.cpp0000644000175100001440000007274612156145314015231 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "readpattern.h" #include "lifealgo.h" #include "liferules.h" // for MAXRULESIZE #include "util.h" // for lifewarning and *progress calls #include #ifdef ZLIB #include #endif #include #include #define LINESIZE 20000 #define CR 13 #define LF 10 bool getedges = false; // find pattern edges? bigint top, left, bottom, right; // the pattern edges #ifdef __APPLE__ #define BUFFSIZE 4096 // 4K is best for Mac OS X #else #define BUFFSIZE 8192 // 8K is best for Windows and other platforms??? #endif #ifdef ZLIB gzFile zinstream ; #else FILE *pattfile ; #endif char filebuff[BUFFSIZE]; int buffpos, bytesread, prevchar; long filesize; // length of file in bytes // use buffered getchar instead of slow fgetc // don't override the "getchar" name which is likely to be a macro int mgetchar() { if (buffpos == BUFFSIZE) { double filepos; #ifdef ZLIB bytesread = gzread(zinstream, filebuff, BUFFSIZE); #if ZLIB_VERNUM >= 0x1240 // gzoffset is only available in zlib 1.2.4 or later filepos = gzoffset(zinstream); #else // use an approximation of file position if file is compressed filepos = gztell(zinstream); if (filepos > 0 && gzdirect(zinstream) == 0) filepos /= 4; #endif #else bytesread = fread(filebuff, 1, BUFFSIZE, pattfile); filepos = ftell(pattfile); #endif buffpos = 0; lifeabortprogress(filepos / filesize, ""); } if (buffpos >= bytesread) return EOF; return filebuff[buffpos++]; } // use getline instead of fgets so we can handle DOS/Mac/Unix line endings char *getline(char *line, int maxlinelen) { int i = 0; while (i < maxlinelen) { int ch = mgetchar(); if (isaborted()) return NULL; switch (ch) { case CR: prevchar = CR; line[i] = 0; return line; case LF: if (prevchar != CR) { prevchar = LF; line[i] = 0; return line; } // if CR+LF (DOS) then ignore the LF break; case EOF: if (i == 0) return NULL; line[i] = 0; return line; default: prevchar = ch; line[i++] = (char) ch; break; } } line[i] = 0; // silently truncate long line return line; } const char *SETCELLERROR = "Impossible; set cell error for state 1" ; // Read a text pattern like "...ooo$$$ooo" where '.', ',' and chars <= ' ' // represent dead cells, '$' represents 10 dead cells, and all other chars // represent live cells. const char *readtextpattern(lifealgo &imp, char *line) { int x=0, y=0; char *p; do { for (p = line; *p; p++) { if (*p == '.' || *p == ',' || *p <= ' ') { x++; } else if (*p == '$') { x += 10; } else { if (imp.setcell(x, y, 1) < 0) { return SETCELLERROR ; } x++; } } y++ ; if (getedges && right.toint() < x - 1) right = x - 1; x = 0; } while (getline(line, LINESIZE)); if (getedges) bottom = y - 1; return 0 ; } /* * Parse "#CXRLE key=value key=value ..." line and extract values. */ void ParseXRLELine(char *line, int *xoff, int *yoff, bool *sawpos, bigint &gen) { char *key = line; while (key) { // set key to start of next key word while (*key && *key != ' ') key++; while (*key == ' ') key++; if (*key == 0) return; // set value to pos of char after next '=' char *value = key; while (*value && *value != '=') value++; if (*value == 0) return; value++; if (strncmp(key, "Pos", 3) == 0) { // extract Pos=int,int sscanf(value, "%d,%d", xoff, yoff); *sawpos = true; } else if (strncmp(key, "Gen", 3) == 0) { // extract Gen=bigint char *p = value; while (*p >= '0' && *p <= '9') p++; char savech = *p; *p = 0; gen = bigint(value); *p = savech; value = p; } key = value; } } /* * Read an RLE pattern into given life algorithm implementation. */ const char *readrle(lifealgo &imp, char *line) { int n=0, x=0, y=0 ; char *p ; char *ruleptr; const char *errmsg; int wd=0, ht=0, xoff=0, yoff=0; bigint gen = bigint::zero; bool sawpos = false; // xoff and yoff set in ParseXRLELine? bool sawrule = false; // saw explicit rule? // parse any #CXRLE line(s) at start while (strncmp(line, "#CXRLE", 6) == 0) { ParseXRLELine(line, &xoff, &yoff, &sawpos, gen); imp.setGeneration(gen); if (getline(line, LINESIZE) == NULL) return 0; } do { if (line[0] == '#') { if (line[1] == 'r') { ruleptr = line; ruleptr += 2; while (*ruleptr && *ruleptr <= ' ') ruleptr++; p = ruleptr; while (*p > ' ') p++; *p = 0; errmsg = imp.setrule(ruleptr); if (errmsg) return errmsg; sawrule = true; } // there's a slight ambiguity here for extended RLE when a line // starts with 'x'; we only treat it as a dimension line if the // next char is whitespace or '=', since 'x' will only otherwise // occur as a two-char token followed by an upper case alphabetic. } else if (line[0] == 'x' && (line[1] <= ' ' || line[1] == '=')) { // extract wd and ht p = line; while (*p && *p != '=') p++; p++; sscanf(p, "%d", &wd); while (*p && *p != '=') p++; p++; sscanf(p, "%d", &ht); while (*p && *p != 'r') p++; if (strncmp(p, "rule", 4) == 0) { p += 4; while (*p && (*p <= ' ' || *p == '=')) p++; ruleptr = p; while (*p > ' ') p++; // remove any comma at end of rule if (p[-1] == ',') p--; *p = 0; errmsg = imp.setrule(ruleptr); if (errmsg) return errmsg; sawrule = true; } if (!sawrule) { // if no rule given then try Conway's Life; if it fails then // return error so Golly will look for matching algo errmsg = imp.setrule("B3/S23"); if (errmsg) return errmsg; } // imp.setrule() has set imp.gridwd and imp.gridht if (!sawpos && (imp.gridwd > 0 || imp.gridht > 0)) { // position pattern at top left corner of bounded grid xoff = -int(imp.gridwd / 2); yoff = -int(imp.gridht / 2); } if (getedges) { top = yoff; left = xoff; bottom = yoff + ht - 1; right = xoff + wd - 1; } } else { n = 0 ; for (p=line; *p; p++) { char c = *p ; if ('0' <= c && c <= '9') { n = n * 10 + c - '0' ; } else { if (n == 0) n = 1 ; if (c == 'b' || c == '.') { x += n ; } else if (c == '$') { x = 0 ; y += n ; } else if (c == '!') { return 0; } else if (('o' <= c && c <= 'y') || ('A' <= c && c <= 'X')) { int state = -1 ; if (c == 'o') state = 1 ; else if (c < 'o') { state = c - 'A' + 1 ; } else { state = 24 * (c - 'p' + 1) ; p++ ; c = *p ; if ('A' <= c && c <= 'X') { state = state + c - 'A' + 1 ; } else { // return "Illegal multi-char state" ; // be more forgiving so we can read non-standard rle files like // those at http://home.interserv.com/~mniemiec/lifepage.htm state = 1 ; p-- ; } } while (n-- > 0) { if (imp.setcell(xoff + x++, yoff + y, state) < 0) return "Cell state out of range for this algorithm" ; } } n = 0 ; } } } } while (getline(line, LINESIZE)); return 0; } /* * This ugly bit of code will go undocumented. It reads Alan Hensel's * PC Life format, either 1.05 or 1.06. */ const char *readpclife(lifealgo &imp, char *line) { int x=0, y=0 ; int leftx = x ; char *p ; char *ruleptr; const char *errmsg; bool sawrule = false; // saw explicit rule? do { if (line[0] == '#') { if (line[1] == 'P') { if (!sawrule) { // if no rule given then try Conway's Life; if it fails then // return error so Golly will look for matching algo errmsg = imp.setrule("B3/S23"); if (errmsg) return errmsg; sawrule = true; // in case there are many #P lines } sscanf(line + 2, " %d %d", &x, &y) ; leftx = x ; } else if (line[1] == 'N') { errmsg = imp.setrule("B3/S23"); if (errmsg) return errmsg; sawrule = true; } else if (line[1] == 'R') { ruleptr = line; ruleptr += 2; while (*ruleptr && *ruleptr <= ' ') ruleptr++; p = ruleptr; while (*p > ' ') p++; *p = 0; errmsg = imp.setrule(ruleptr); if (errmsg) return errmsg; sawrule = true; } } else if (line[0] == '-' || ('0' <= line[0] && line[0] <= '9')) { sscanf(line, "%d %d", &x, &y) ; if (imp.setcell(x, y, 1) < 0) return SETCELLERROR ; } else if (line[0] == '.' || line[0] == '*') { for (p = line; *p; p++) { if (*p == '*') { if (imp.setcell(x, y, 1) < 0) return SETCELLERROR ; } x++ ; } x = leftx ; y++ ; } } while (getline(line, LINESIZE)); return 0; } /* * This routine reads David Bell's dblife format. */ const char *readdblife(lifealgo &imp, char *line) { int n=0, x=0, y=0; char *p; while (getline(line, LINESIZE)) { if (line[0] != '!') { // parse line like "23.O15.3O15.3O15.O4.4O" n = x = 0; for (p=line; *p; p++) { if ('0' <= *p && *p <= '9') { n = n * 10 + *p - '0'; } else { if (n == 0) n = 1; if (*p == '.') { x += n; } else if (*p == 'O') { while (n-- > 0) if (imp.setcell(x++, y, 1) < 0) return SETCELLERROR ; } else { // ignore dblife commands like "5k10h@" } n = 0; } } y++; } } return 0; } // // Read Mirek Wojtowicz's MCell format. // See http://psoup.math.wisc.edu/mcell/ca_files_formats.html for details. // const char *readmcell(lifealgo &imp, char *line) { int x = 0, y = 0; int wd = 0, ht = 0; // bounded if > 0 int wrapped = 0; // plane if 0, torus if 1 char *p; const char *errmsg; bool sawrule = false; // saw explicit rule? bool extendedHL = false; // special-case rule translation for extended HistoricalLife rules while (getline(line, LINESIZE)) { if (line[0] == '#') { if (line[1] == 'L' && line[2] == ' ') { if (!sawrule) { // if no rule given then try Conway's Life; if it fails then // return error so Golly will look for matching algo errmsg = imp.setrule("B3/S23"); if (errmsg) return errmsg; sawrule = true; } int n = 0; for (p=line+3; *p; p++) { char c = *p; if ('0' <= c && c <= '9') { n = n * 10 + c - '0'; } else if (c > ' ') { if (n == 0) n = 1; if (c == '.') { x += n; } else if (c == '$') { x = -(wd/2); y += n; } else { int state = 0; if ('a' <= c && c <= 'j') { state = 24 * (c - 'a' + 1); p++; c = *p; } if ('A' <= c && c <= 'X') { state = state + c - 'A' + 1; if (extendedHL) { // adjust marked states for LifeHistory if (state == 8) state = 4; else if (state == 3) state = 5; else if (state == 5) state = 3; } } else { return "Illegal multi-char state"; } while (n-- > 0) { if (imp.setcell(x++, y, state) < 0) return "Cell state out of range"; } } n = 0; } } // look for bounded universe } else if (strncmp(line, "#BOARD ", 7) == 0) { sscanf(line + 7, "%dx%d", &wd, &ht); // write pattern in top left corner initially // (pattern will be shifted to middle of grid below) x = -(wd/2); y = -(ht/2); // look for topology } else if (strncmp(line, "#WRAP ", 6) == 0) { sscanf(line + 6, "%d", &wrapped); // we allow lines like "#GOLLY WireWorld" } else if (!sawrule && (strncmp(line, "#GOLLY", 6) == 0 || strncmp(line, "#RULE", 5) == 0) ) { if (strncmp(line, "#RULE 1,0,1,0,0,0,1,0,0,0,0,0,0,2,2,1,1,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2", 69) == 0) { // standard HistoricalLife rule -- all states transfer directly to LifeHistory if (strncmp(line, "#RULE 1,0,1,0,0,0,1,0,0,0,0,0,0,2,2,1,1,2,2,2,2,2,0,2,2,2,1,2,2,2,2,2,", 70) == 0) { // special case: Brice Due's extended HistoricalLife rules have // non-contiguous states (State 8 but no State 4, 6, or 7) // that need translating to work in LifeHistory) extendedHL = true; } errmsg = imp.setrule("LifeHistory"); if (errmsg) return errmsg; sawrule = true; } else if (strncmp(line, "#RULE 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1", 40) == 0) { errmsg = imp.setrule("B3/S23"); if (errmsg) errmsg = imp.setrule("Life"); if (errmsg) return errmsg; sawrule = true; } else { char *ruleptr = line; // skip "#GOLLY" or "#RULE" ruleptr += line[1] == 'G' ? 6 : 5; while (*ruleptr && *ruleptr <= ' ') ruleptr++; p = ruleptr; while (*p > ' ') p++; *p = 0; errmsg = imp.setrule(ruleptr); if (errmsg) return errmsg; sawrule = true; } } } } if (wd > 0 || ht > 0) { // grid is bounded, so append suitable suffix to rule char rule[MAXRULESIZE]; if (wrapped) sprintf(rule, "%s:T%d,%d", imp.getrule(), wd, ht); else sprintf(rule, "%s:P%d,%d", imp.getrule(), wd, ht); errmsg = imp.setrule(rule); if (errmsg) { // should never happen lifewarning("Bug in readmcell code!"); return errmsg; } // shift pattern to middle of bounded grid imp.endofpattern(); if (!imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right); // pattern is currently in top left corner so shift down and right // (note that we add 1 to wd and ht to get same position as MCell) int shiftx = (wd + 1 - (right.toint() - left.toint() + 1)) / 2; int shifty = (ht + 1 - (bottom.toint() - top.toint() + 1)) / 2; if (shiftx > 0 || shifty > 0) { for (y = bottom.toint(); y >= top.toint(); y--) { for (x = right.toint(); x >= left.toint(); x--) { int state = imp.getcell(x, y); if (state > 0) { imp.setcell(x, y, 0); imp.setcell(x+shiftx, y+shifty, state); } } } } } } return 0; } long getfilesize(const char *filename) { long flen = 0; FILE *f = fopen(filename, "r"); if (f != 0) { fseek(f, 0L, SEEK_END); flen = ftell(f); fclose(f); } return flen; } // This function guesses whether `line' is the start of a headerless Life RLE // pattern. It is used to distinguish headerless RLE from plain text patterns. static bool isplainrle(const char *line) { // Find end of line, or terminating '!' character, whichever comes first: const char *end = line; while (*end && *end != '!') ++end; // Verify that '!' (if present) is the final printable character: if (*end == '!') { for (const char *p = end + 1; *p; ++p) { if ((unsigned)*p > ' ') { return false; } } } // Ensure line consists of valid tokens: bool prev_digit = false, have_digit = false; for (const char *p = line; p != end; ++p) { if ((unsigned)*p <= ' ') { if (prev_digit) return false; // space inside token! } else if (*p >= '0' && *p <= '9') { prev_digit = have_digit = true; } else if (*p == 'b' || *p == 'o' || *p == '$') { prev_digit = false; } else { return false; // unsupported printable character encountered! } } if (prev_digit) return false; // end of line inside token! // Everything seems parseable; assume this is RLE if either we saw some // digits, or the pattern ends with a '!', both of which are unlikely to // occur in plain text patterns: return have_digit || *end == '!'; } const char *loadpattern(lifealgo &imp) { char line[LINESIZE + 1] ; const char *errmsg = 0; if (getedges) { // called from readclipboard so don't reset rule; // ie. only change rule if an explicit rule is supplied } else { // reset rule to Conway's Life (default if explicit rule isn't supplied) const char *err = imp.setrule("B3/S23") ; if (err) { // try "Life" in case given algo is RuleLoader and a // Life.table/tree file exists (nicer for loading lexicon patterns) err = imp.setrule("Life"); if (err) { // if given algo doesn't support B3/S23 or Life then the only sensible // choice left is to use the algo's default rule err = imp.setrule( imp.DefaultRule() ) ; } } } if (getedges) lifebeginprogress("Reading from clipboard"); else lifebeginprogress("Reading pattern file"); // skip any blank lines at start to avoid problem when copying pattern // from Internet Explorer while (getline(line, LINESIZE) && line[0] == 0) ; // test for 'i' to cater for #LLAB comment in LifeLab file if (line[0] == '#' && line[1] == 'L' && line[2] == 'i') { errmsg = readpclife(imp, line) ; imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } else if (line[0] == '#' && line[1] == 'P' && line[2] == ' ') { // WinLifeSearch creates clipboard patterns similar to // Life 1.05 format but without the header line errmsg = readpclife(imp, line) ; imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } else if (line[0] == '#' && line[1] == 'M' && line[2] == 'C' && line[3] == 'e' && line[4] == 'l' && line[5] == 'l' ) { errmsg = readmcell(imp, line) ; imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } else if (line[0] == '#' || line[0] == 'x') { errmsg = readrle(imp, line) ; imp.endofpattern() ; if (getedges && !imp.isEmpty()) { // readrle has set top,left,bottom,right based on the info given in // the header line and possibly a "#CXRLE Pos=..." line, but in case // that info is incorrect we find the true pattern edges and expand // top/left/bottom/right if necessary to avoid truncating the pattern bigint t, l, b, r ; imp.findedges(&t, &l, &b, &r) ; if (t < top) top = t ; if (l < left) left = l ; if (b > bottom) bottom = b ; if (r > right) right = r ; } } else if (line[0] == '!') { errmsg = readdblife(imp, line) ; imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } else if (line[0] == '[') { errmsg = imp.readmacrocell(line) ; imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } else if (isplainrle(line)) { errmsg = readrle(imp, line) ; imp.endofpattern() ; if (getedges && !imp.isEmpty()) { imp.findedges(&top, &left, &bottom, &right) ; } } else { // read a text pattern like "...ooo$$$ooo" errmsg = readtextpattern(imp, line) ; imp.endofpattern() ; // if getedges is true then readtextpattern has set top,left,bottom,right } lifeendprogress(); return errmsg ; } const char *build_err_str(const char *filename) { static char file_err_str[2048]; sprintf(file_err_str, "Can't open pattern file:\n%s", filename); return file_err_str; } const char *readpattern(const char *filename, lifealgo &imp) { filesize = getfilesize(filename); #ifdef ZLIB zinstream = gzopen(filename, "rb") ; // rb needed on Windows if (zinstream == 0) return build_err_str(filename) ; #else pattfile = fopen(filename, "r") ; if (pattfile == 0) return build_err_str(filename) ; #endif buffpos = BUFFSIZE; // for 1st getchar call prevchar = 0; // for 1st getline call const char *errmsg = loadpattern(imp) ; #ifdef ZLIB gzclose(zinstream) ; #else fclose(pattfile) ; #endif return errmsg ; } const char *readclipboard(const char *filename, lifealgo &imp, bigint *t, bigint *l, bigint *b, bigint *r) { filesize = getfilesize(filename); #ifdef ZLIB zinstream = gzopen(filename, "rb") ; // rb needed on Windows if (zinstream == 0) return "Can't open clipboard file!" ; #else pattfile = fopen(filename, "r") ; if (pattfile == 0) return "Can't open clipboard file!" ; #endif buffpos = BUFFSIZE; // for 1st getchar call prevchar = 0; // for 1st getline call top = 0; left = 0; bottom = 0; right = 0; getedges = true; const char *errmsg = loadpattern(imp); getedges = false; *t = top; *l = left; *b = bottom; *r = right; // make sure we return a valid rect if (bottom < top) *b = top; if (right < left) *r = left; #ifdef ZLIB gzclose(zinstream) ; #else fclose(pattfile) ; #endif return errmsg ; } const char *readcomments(const char *filename, char **commptr) { // allocate a 128K buffer for storing comment data (big enough // for the comments in Dean Hickerson's stamp collection) const int maxcommlen = 128 * 1024; *commptr = (char *)malloc(maxcommlen); if (*commptr == NULL) { return "Not enough memory for comments!"; } char *cptr = *commptr; filesize = getfilesize(filename); #ifdef ZLIB zinstream = gzopen(filename, "rb") ; // rb needed on Windows if (zinstream == 0) return build_err_str(filename) ; #else pattfile = fopen(filename, "r") ; if (pattfile == 0) return build_err_str(filename) ; #endif char line[LINESIZE + 1] ; buffpos = BUFFSIZE; // for 1st getchar call prevchar = 0; // for 1st getline call int commlen = 0; // loading comments is likely to be quite fast so no real need to // display the progress dialog, but getchar calls lifeabortprogress // so safer just to assume the progress dialog might appear lifebeginprogress("Loading comments"); // skip any blank lines at start to avoid problem when copying pattern // from Internet Explorer while (getline(line, LINESIZE) && line[0] == 0) ; // test for 'i' to cater for #LLAB comment in LifeLab file if (line[0] == '#' && line[1] == 'L' && line[2] == 'i') { // extract comment lines from Life 1.05/1.06 file int linecount = 0; while (linecount < 10000) { linecount++; if (line[0] == '#' && !(line[1] == 'P' && line[2] == ' ') && !(line[1] == 'N' && line[2] == 0)) { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; } if (getline(line, LINESIZE) == NULL) break; } } else if (line[0] == '#' && line[1] == 'M' && line[2] == 'C' && line[3] == 'e' && line[4] == 'l' && line[5] == 'l' ) { // extract "#D ..." lines from MCell file while (getline(line, LINESIZE)) { if (line[0] != '#') break; if (line[1] == 'L' && line[2] == ' ') break; if (line[1] == 'D' && (line[2] == ' ' || line[2] == 0)) { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; } } } else if (line[0] == '#' || line[0] == 'x') { // extract comment lines from RLE file while (line[0] == '#') { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; if (getline(line, LINESIZE) == NULL) break; } // also look for any lines after "!" but only if file is < 1MB // (ZLIB doesn't seem to provide a fast way to go to eof) if (filesize < 1024*1024) { bool foundexcl = false; while (getline(line, LINESIZE)) { if (strrchr(line, '!')) { foundexcl = true; break; } } if (foundexcl) { while (getline(line, LINESIZE)) { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; } } } } else if (line[0] == '!') { // extract "!..." lines from dblife file while (line[0] == '!') { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; if (getline(line, LINESIZE) == NULL) break; } } else if (line[0] == '[') { // extract "#C..." lines from macrocell file while (getline(line, LINESIZE)) { if (line[0] != '#') break; if (line[1] == 'C') { int linelen = (int)strlen(line); if (commlen + linelen + 1 > maxcommlen) break; strncpy(cptr + commlen, line, linelen); commlen += linelen; cptr[commlen] = '\n'; // getline strips off eol char(s) commlen++; } } } else { // no comments in text pattern file??? } lifeendprogress(); if (commlen == maxcommlen) commlen--; cptr[commlen] = 0; #ifdef ZLIB gzclose(zinstream) ; #else fclose(pattfile) ; #endif return 0 ; } golly-2.5-src/gollybase/ruleloaderalgo.cpp0000644000175100001440000002037212156145314015705 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "ruleloaderalgo.h" #include "util.h" // for lifegetuserrules, lifegetrulesdir, lifefatal #include // for strcmp, strchr #include // for std::string const char* noTABLEorTREE = "No @TABLE or @TREE section found in .rule file."; int ruleloaderalgo::NumCellStates() { if (rule_type == TABLE) return LocalRuleTable->NumCellStates(); else // rule_type == TREE return LocalRuleTree->NumCellStates(); } static FILE* OpenRuleFile(std::string& rulename, const char* dir, std::string& path) { // look for rulename.rule in given dir and set path path = dir; int istart = (int)path.size(); path += rulename + ".rule"; // change "dangerous" characters to underscores for (unsigned int i=istart; iNumCellStates(); grid_type = LocalRuleTable->getgridtype(); gridwd = LocalRuleTable->gridwd; gridht = LocalRuleTable->gridht; gridleft = LocalRuleTable->gridleft; gridright = LocalRuleTable->gridright; gridtop = LocalRuleTable->gridtop; gridbottom = LocalRuleTable->gridbottom; boundedplane = LocalRuleTable->boundedplane; sphere = LocalRuleTable->sphere; htwist = LocalRuleTable->htwist; vtwist = LocalRuleTable->vtwist; hshift = LocalRuleTable->hshift; vshift = LocalRuleTable->vshift; } else { // rule_type == TREE maxCellStates = LocalRuleTree->NumCellStates(); grid_type = LocalRuleTree->getgridtype(); gridwd = LocalRuleTree->gridwd; gridht = LocalRuleTree->gridht; gridleft = LocalRuleTree->gridleft; gridright = LocalRuleTree->gridright; gridtop = LocalRuleTree->gridtop; gridbottom = LocalRuleTree->gridbottom; boundedplane = LocalRuleTree->boundedplane; sphere = LocalRuleTree->sphere; htwist = LocalRuleTree->htwist; vtwist = LocalRuleTree->vtwist; hshift = LocalRuleTree->hshift; vshift = LocalRuleTree->vshift; } // need to clear cache ghashbase::setrule("not used"); } const char* ruleloaderalgo::LoadTableOrTree(FILE* rulefile, const char* rule) { const char *err; const int MAX_LINE_LEN = 4096; char line_buffer[MAX_LINE_LEN+1]; int lineno = 0; linereader lr(rulefile); // find line starting with @TABLE or @TREE while (lr.fgets(line_buffer,MAX_LINE_LEN) != 0) { lineno++; if (strcmp(line_buffer, "@TABLE") == 0) { err = LocalRuleTable->LoadTable(rulefile, lineno, '@', rule); // err is the result of setrule(rule) if (err == NULL) { SetAlgoVariables(TABLE); } // LoadTable has closed rulefile so don't do lr.close() return err; } if (strcmp(line_buffer, "@TREE") == 0) { err = LocalRuleTree->LoadTree(rulefile, lineno, '@', rule); // err is the result of setrule(rule) if (err == NULL) { SetAlgoVariables(TREE); } // LoadTree has closed rulefile so don't do lr.close() return err; } } lr.close(); return noTABLEorTREE; } const char* ruleloaderalgo::setrule(const char* s) { const char *err; const char *colonptr = strchr(s,':'); std::string rulename(s); if (colonptr) rulename.assign(s,colonptr); // first check if rulename is the default rule for RuleTable or RuleTree // in which case there is no need to look for a .rule/table/tree file if (LocalRuleTable->IsDefaultRule(rulename.c_str())) { LocalRuleTable->setrule(s); SetAlgoVariables(TABLE); return NULL; } if (LocalRuleTree->IsDefaultRule(rulename.c_str())) { LocalRuleTree->setrule(s); SetAlgoVariables(TREE); return NULL; } // look for .rule file in user's rules dir then in Golly's rules dir std::string fullpath; bool inuser = true; FILE* rulefile = OpenRuleFile(rulename, lifegetuserrules(), fullpath); if (!rulefile) { inuser = false; rulefile = OpenRuleFile(rulename, lifegetrulesdir(), fullpath); } if (rulefile) { err = LoadTableOrTree(rulefile, s); if (inuser && err && (strcmp(err, noTABLEorTREE) == 0)) { // if .rule file was found in user's rules dir but had no // @TABLE or @TREE section then we look in Golly's rules dir // (this lets user override the colors/icons in a supplied .rule // file without having to copy the entire file) rulefile = OpenRuleFile(rulename, lifegetrulesdir(), fullpath); if (rulefile) err = LoadTableOrTree(rulefile, s); } return err; } // no .rule file so try to load .table file err = LocalRuleTable->setrule(s); if (err == NULL) { SetAlgoVariables(TABLE); return NULL; } // no .table file so try to load .tree file err = LocalRuleTree->setrule(s); if (err == NULL) { SetAlgoVariables(TREE); return NULL; } return err; } const char* ruleloaderalgo::getrule() { if (rule_type == TABLE) return LocalRuleTable->getrule(); else // rule_type == TREE return LocalRuleTree->getrule(); } const char* ruleloaderalgo::DefaultRule() { // use RuleTree's default rule (B3/S23) return LocalRuleTree->DefaultRule(); } ruleloaderalgo::ruleloaderalgo() { LocalRuleTable = new ruletable_algo(); LocalRuleTree = new ruletreealgo(); if (LocalRuleTable == NULL) lifefatal("RuleLoader failed to create local RuleTable!"); if (LocalRuleTree == NULL) lifefatal("RuleLoader failed to create local RuleTree!"); // initialize rule_type LocalRuleTree->setrule( LocalRuleTree->DefaultRule() ); SetAlgoVariables(TREE); } ruleloaderalgo::~ruleloaderalgo() { delete LocalRuleTable; delete LocalRuleTree; } state ruleloaderalgo::slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) { if (rule_type == TABLE) return LocalRuleTable->slowcalc(nw, n, ne, w, c, e, sw, s, se); else // rule_type == TREE return LocalRuleTree->slowcalc(nw, n, ne, w, c, e, sw, s, se); } static lifealgo* creator() { return new ruleloaderalgo(); } void ruleloaderalgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai); ai.setAlgorithmName("RuleLoader"); ai.setAlgorithmCreator(&creator); ai.minstates = 2; ai.maxstates = 256; // init default color scheme ai.defgradient = true; // use gradient ai.defr1 = 255; // start color = red ai.defg1 = 0; ai.defb1 = 0; ai.defr2 = 255; // end color = yellow ai.defg2 = 255; ai.defb2 = 0; // if not using gradient then set all states to white for (int i=0; i<256; i++) { ai.defr[i] = ai.defg[i] = ai.defb[i] = 255; } } golly-2.5-src/gollybase/ruletable_algo.cpp0000644000175100001440000010044012156145314015660 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "ruletable_algo.h" #include "util.h" // for lifegetuserrules, lifegetrulesdir, lifewarning // for case-insensitive string comparison #include #ifndef WIN32 #define stricmp strcasecmp #define strnicmp strncasecmp #endif #include #include #include using namespace std; const string ruletable_algo::neighborhood_value_keywords[N_SUPPORTED_NEIGHBORHOODS] = {"vonNeumann","Moore","hexagonal","oneDimensional"}; // (keep in sync with TNeighborhood) bool ruletable_algo::IsDefaultRule(const char* rulename) { return (strcmp(rulename, DefaultRule()) == 0); } static FILE* static_rulefile = NULL; static int static_lineno = 0; static char static_endchar = 0; const char* ruletable_algo::LoadTable(FILE* rulefile, int lineno, char endchar, const char* s) { // set static vars so LoadRuleTable() will load table data from .rule file static_rulefile = rulefile; static_lineno = lineno; static_endchar = endchar; const char* err = setrule(s); // calls LoadRuleTable // reset static vars static_rulefile = NULL; static_lineno = 0; static_endchar = 0; return err; } int ruletable_algo::NumCellStates() { return this->n_states; } bool starts_with(const string& line,const string& keyword) { return strnicmp(line.c_str(),keyword.c_str(),keyword.length())==0; } const char* ruletable_algo::setrule(const char* s) { const char *colonptr = strchr(s, ':'); string rule_name(s); if (colonptr) rule_name.assign(s,colonptr); static string ret; // NOTE: don't initialize this statically! ret = LoadRuleTable(rule_name.c_str()); if(!ret.empty()) { // if the file exists and we've got an error then it must be a file format issue if(!starts_with(ret,"Failed to open file: ")) lifewarning(ret.c_str()); return ret.c_str(); } // check for rule suffix like ":T200,100" to specify a bounded universe if (colonptr) { const char* err = setgridsize(colonptr); if (err) return err; } else { // universe is unbounded gridwd = 0; gridht = 0; } // set canonical rule string returned by getrule() this->current_rule = rule_name.c_str(); if (gridwd > 0 || gridht > 0) { // setgridsize() was successfully called above, so append suffix string bounds = canonicalsuffix(); this->current_rule += bounds; } maxCellStates = this->n_states; ghashbase::setrule(rule_name.c_str()); return NULL; } vector tokenize(const string& str,const string& delimiters) { vector tokens; // skip delimiters at beginning. string::size_type lastPos = str.find_first_not_of(delimiters, 0); // find first "non-delimiter". string::size_type pos = str.find_first_of(delimiters, lastPos); while (string::npos != pos || string::npos != lastPos) { // found a token, add it to the vector. tokens.push_back(str.substr(lastPos, pos - lastPos)); // skip delimiters. Note the "not_of" lastPos = str.find_first_not_of(delimiters, pos); // find next "non-delimiter" pos = str.find_first_of(delimiters, lastPos); } return tokens; } string trim_right(const string & s, const string & t = " \t\r\n") { string d (s); string::size_type i (d.find_last_not_of (t)); if (i == string::npos) return ""; else return d.erase (d.find_last_not_of (t) + 1); } string trim_left(const string & s, const string & t = " \t\r\n") { string d (s); return d.erase (0, s.find_first_not_of (t)); } string trim(const string & s, const string & t = " \t\r\n") { string d (s); return trim_left (trim_right (d, t), t); } const char *defaultRuleData[] = { "n_states:8", "neighborhood:vonNeumann", "symmetries:rotate4", "000000", "000012", "000020", "000030", "000050", "000063", "000071", "000112", "000122", "000132", "000212", "000220", "000230", "000262", "000272", "000320", "000525", "000622", "000722", "001022", "001120", "002020", "002030", "002050", "002125", "002220", "002322", "005222", "012321", "012421", "012525", "012621", "012721", "012751", "014221", "014321", "014421", "014721", "016251", "017221", "017255", "017521", "017621", "017721", "025271", "100011", "100061", "100077", "100111", "100121", "100211", "100244", "100277", "100511", "101011", "101111", "101244", "101277", "102026", "102121", "102211", "102244", "102263", "102277", "102327", "102424", "102626", "102644", "102677", "102710", "102727", "105427", "111121", "111221", "111244", "111251", "111261", "111277", "111522", "112121", "112221", "112244", "112251", "112277", "112321", "112424", "112621", "112727", "113221", "122244", "122277", "122434", "122547", "123244", "123277", "124255", "124267", "125275", "200012", "200022", "200042", "200071", "200122", "200152", "200212", "200222", "200232", "200242", "200250", "200262", "200272", "200326", "200423", "200517", "200522", "200575", "200722", "201022", "201122", "201222", "201422", "201722", "202022", "202032", "202052", "202073", "202122", "202152", "202212", "202222", "202272", "202321", "202422", "202452", "202520", "202552", "202622", "202722", "203122", "203216", "203226", "203422", "204222", "205122", "205212", "205222", "205521", "205725", "206222", "206722", "207122", "207222", "207422", "207722", "211222", "211261", "212222", "212242", "212262", "212272", "214222", "215222", "216222", "217222", "222272", "222442", "222462", "222762", "222772", "300013", "300022", "300041", "300076", "300123", "300421", "300622", "301021", "301220", "302511", "401120", "401220", "401250", "402120", "402221", "402326", "402520", "403221", "500022", "500215", "500225", "500232", "500272", "500520", "502022", "502122", "502152", "502220", "502244", "502722", "512122", "512220", "512422", "512722", "600011", "600021", "602120", "612125", "612131", "612225", "700077", "701120", "701220", "701250", "702120", "702221", "702251", "702321", "702525", "702720", 0 }; static FILE *OpenTableFile(string &rule, const char *dir, string &path) { // look for rule.table in given dir and set path path = dir; int istart = (int)path.size(); path += rule + ".table"; // change "dangerous" characters to underscores for (unsigned int i=istart; i > available_symmetries; { const string vonNeumann_available_symmetries[5] = {"none","rotate4","rotate4reflect","reflect_horizontal","permute"}; available_symmetries["vonNeumann"].assign(vonNeumann_available_symmetries,vonNeumann_available_symmetries+5); const string Moore_available_symmetries[7] = {"none","rotate4","rotate8","rotate4reflect","rotate8reflect","reflect_horizontal","permute"}; available_symmetries["Moore"].assign(Moore_available_symmetries,Moore_available_symmetries+7); const string hexagonal_available_symmetries[6] = {"none","rotate2","rotate3","rotate6","rotate6reflect","permute"}; available_symmetries["hexagonal"].assign(hexagonal_available_symmetries,hexagonal_available_symmetries+6); const string oneDimensional_available_symmetries[3] = {"none","reflect","permute"}; available_symmetries["oneDimensional"].assign(oneDimensional_available_symmetries,oneDimensional_available_symmetries+3); } string line; const int MAX_LINE_LEN=1000; char line_buffer[MAX_LINE_LEN]; FILE *in = 0; linereader line_reader(0); int lineno = 0; string full_filename; bool isDefaultRule = IsDefaultRule(rule.c_str()); if (isDefaultRule) { // no need to read table data from a file } else if (static_rulefile) { // read table data from currently open .rule file line_reader.setfile(static_rulefile); line_reader.setcloseonfree(); lineno = static_lineno; full_filename = rule + ".rule"; } else { // look for rule.table in user's rules dir then in Golly's rules dir in = OpenTableFile(rule, lifegetuserrules(), full_filename); if (!in) in = OpenTableFile(rule, lifegetrulesdir(), full_filename); if (!in) return "Failed to open file: "+full_filename; line_reader.setfile(in); line_reader.setcloseonfree(); // make sure it goes away if we return with an error } string symmetries = "rotate4"; // default TNeighborhood neighborhood = vonNeumann; // default unsigned int n_states = 8; // default map< string, vector > variables; vector< pair< vector< vector >, state > > transition_table; unsigned int n_inputs=0; // these line must have been read before the rest of the file bool n_states_parsed=false,neighborhood_parsed=false,symmetries_parsed=false; for (;;) { if (isDefaultRule) { if (defaultRuleData[lineno] == 0) break; line = defaultRuleData[lineno]; } else { if (!line_reader.fgets(line_buffer,MAX_LINE_LEN)) break; if (static_rulefile && line_buffer[0] == static_endchar) break; line = line_buffer; } lineno++; // snip off any trailing comment if(line.find('#')!=string::npos) line.assign(line.begin(),line.begin()+line.find('#')); // trim any leading/trailing whitespace line = trim(line); // try each of the allowed forms for this line: if(line.empty()) continue; // line was blank or just had a comment else if(starts_with(line,n_states_keyword)) { // parse the rest of the line if(sscanf(line.c_str()+n_states_keyword.length(),"%d",&n_states)!=1) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } if(n_states<2 || n_states>256) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": n_states out of range (min 2, max 256)"; return oss.str(); } n_states_parsed = true; } else if(starts_with(line,neighborhood_keyword)) { // parse the rest of the line string remaining(line.begin()+neighborhood_keyword.length(),line.end()); remaining = trim(remaining); // (allow for space between : and value) const string* found = find(this->neighborhood_value_keywords, this->neighborhood_value_keywords+N_SUPPORTED_NEIGHBORHOODS,remaining); if(found == this->neighborhood_value_keywords+N_SUPPORTED_NEIGHBORHOODS) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": unsupported neighborhood"; return oss.str(); } neighborhood = (TNeighborhood)(found - this->neighborhood_value_keywords); switch(neighborhood) { default: case vonNeumann: n_inputs=5; grid_type=VN_GRID; break; case Moore: n_inputs=9; grid_type=SQUARE_GRID; break; case hexagonal: n_inputs=7; grid_type=HEX_GRID; break; case oneDimensional: n_inputs=3; grid_type=SQUARE_GRID; break; } neighborhood_parsed = true; } else if(starts_with(line,symmetries_keyword)) { if(!neighborhood_parsed) { ostringstream oss; oss << "Error reading " << full_filename << ": neighborhood must be declared before symmetries"; return oss.str(); } string remaining(line.begin()+symmetries_keyword.length(),line.end()); remaining = trim(remaining); // (allow for space between : and value) string neighborhood_as_string = this->neighborhood_value_keywords[neighborhood]; vector::const_iterator found = find( available_symmetries[neighborhood_as_string].begin(), available_symmetries[neighborhood_as_string].end(), remaining ); if(found == available_symmetries[neighborhood_as_string].end()) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": unsupported symmetries"; return oss.str(); } symmetries = remaining; symmetries_parsed = true; } else if(starts_with(line,variable_keyword)) { if(!n_states_parsed || !neighborhood_parsed || !symmetries_parsed) { ostringstream oss; oss << "Error reading " << full_filename << ": one or more of n_states, neighborhood or symmetries missing\nbefore first variable"; return oss.str(); } // parse the rest of the line for the variable vector tokens = tokenize(line,"= {,}"); string variable_name = tokens[1]; vector states; if(tokens.size()<3) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } for(unsigned int i=2;i=n_states) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - state value out of range"; return oss.str(); } states.push_back((state)s); } } variables[variable_name] = states; } else { // must be a transitions line if(!n_states_parsed || !neighborhood_parsed || !symmetries_parsed) { ostringstream oss; oss << "Error reading " << full_filename << ": one or more of n_states, neighborhood or symmetries missing\nbefore first transition"; return oss.str(); } if(n_states<=10 && variables.empty() && line.find(',')==string::npos) { // if there are only single-digit states and no variables then can use comma-free form: // e.g. 012345 for 0,1,2,3,4 -> 5 vector< vector > inputs; state output; if(line.length() < n_inputs+1) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - too few entries"; return oss.str(); } for(unsigned int i=0;i'9') { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } inputs.push_back(vector(1,c-'0')); } unsigned char c = line[n_inputs]; if(c<'0' || c>'9') { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } output = c-'0'; transition_table.push_back(make_pair(inputs,output)); } else // transition line with commas { vector tokens = tokenize(line,", #\t"); if(tokens.size() < n_inputs+1) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - too few entries"; return oss.str(); } // first pass: which variables appear more than once? these are "bound" (must take the same value each time they appear in this transition) vector bound_variables; for(map< string, vector >::const_iterator var_it=variables.begin();var_it!=variables.end();var_it++) if(count(tokens.begin(),tokens.begin()+n_inputs+1,var_it->first)>1) bound_variables.push_back(var_it->first); unsigned int n_bound_variables = (unsigned int)bound_variables.size(); // second pass: iterate through the possible states for the bound variables, adding a transition for each combination vector< vector > inputs(n_inputs); state output; map bound_variable_indices; // each is an index into vector of 'variables' map for(unsigned int i=0;i(1,variables[tokens[i]][bound_variable_indices[tokens[i]]]); // this input is a bound variable else if(variables.find(tokens[i])!=variables.end()) inputs[i] = variables[tokens[i]]; // this input is an unbound variable else { unsigned int s=0; if(sscanf(tokens[i].c_str(),"%u",&s)!=1) // this input is a state { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line; return oss.str(); } if(s>=n_states) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - state out of range"; return oss.str(); } inputs[i] = vector(1,(state)s); } } // collect the output if(!bound_variables.empty() && find(bound_variables.begin(),bound_variables.end(),tokens[n_inputs])!=bound_variables.end()) output = variables[tokens[n_inputs]][bound_variable_indices[tokens[n_inputs]]]; else { unsigned int s; if(variables.find(tokens[n_inputs])!=variables.end() && variables[tokens[n_inputs]].size()==1) { // single-state variables are permitted as the output s = variables[tokens[n_inputs]][0]; } else if(sscanf(tokens[n_inputs].c_str(),"%u",&s)!=1) // if not a bound variable, output must be a state { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - output must be state, single-state variable or bound variable"; return oss.str(); } if(s>=n_states) { ostringstream oss; oss << "Error reading " << full_filename << " on line " << lineno << ": " << line << " - state out of range"; return oss.str(); } output = (state)s; } transition_table.push_back(make_pair(inputs,output)); // move on to the next value of bound variables { unsigned int iChanging=0; for(;iChanging=n_bound_variables) break; } } } } } // (finished reading lines from the file) if(!n_states_parsed || !neighborhood_parsed || !symmetries_parsed) { ostringstream oss; oss << "Error reading " << full_filename << ": one or more of n_states, neighborhood or symmetries missing"; return oss.str(); } this->neighborhood = neighborhood; this->n_states = n_states; PackTransitions(symmetries,n_inputs,transition_table); return string(""); // success } // convert transition table to bitmask lookup void ruletable_algo::PackTransitions(const string& symmetries, int n_inputs, const vector< pair< vector< vector >, state > >& transition_table) { // cumbersome initialization of a remap array for the different symmetries map< string, vector< vector > > symmetry_remap[N_SUPPORTED_NEIGHBORHOODS]; { int vn_rotate4[4][6] = {{0,1,2,3,4,5},{0,2,3,4,1,5},{0,3,4,1,2,5},{0,4,1,2,3,5}}; for(int i=0;i<4;i++) symmetry_remap[vonNeumann]["rotate4"].push_back(vector(vn_rotate4[i],vn_rotate4[i]+6)); int vn_rotate4reflect[8][6] = {{0,1,2,3,4,5},{0,2,3,4,1,5},{0,3,4,1,2,5},{0,4,1,2,3,5}, {0,4,3,2,1,5},{0,3,2,1,4,5},{0,2,1,4,3,5},{0,1,4,3,2,5}}; for(int i=0;i<8;i++) symmetry_remap[vonNeumann]["rotate4reflect"].push_back(vector(vn_rotate4reflect[i],vn_rotate4reflect[i]+6)); int vn_reflect_horizontal[2][6] = {{0,1,2,3,4,5},{0,1,4,3,2,5}}; for(int i=0;i<2;i++) symmetry_remap[vonNeumann]["reflect_horizontal"].push_back(vector(vn_reflect_horizontal[i],vn_reflect_horizontal[i]+6)); int moore_rotate4[4][10] = {{0,1,2,3,4,5,6,7,8,9},{0,3,4,5,6,7,8,1,2,9},{0,5,6,7,8,1,2,3,4,9},{0,7,8,1,2,3,4,5,6,9}}; for(int i=0;i<4;i++) symmetry_remap[Moore]["rotate4"].push_back(vector(moore_rotate4[i],moore_rotate4[i]+10)); int moore_rotate8[8][10] = {{0,1,2,3,4,5,6,7,8,9},{0,2,3,4,5,6,7,8,1,9},{0,3,4,5,6,7,8,1,2,9},{0,4,5,6,7,8,1,2,3,9}, {0,5,6,7,8,1,2,3,4,9},{0,6,7,8,1,2,3,4,5,9},{0,7,8,1,2,3,4,5,6,9},{0,8,1,2,3,4,5,6,7,9}}; for(int i=0;i<8;i++) symmetry_remap[Moore]["rotate8"].push_back(vector(moore_rotate8[i],moore_rotate8[i]+10)); int moore_rotate4reflect[8][10] = {{0,1,2,3,4,5,6,7,8,9},{0,3,4,5,6,7,8,1,2,9},{0,5,6,7,8,1,2,3,4,9},{0,7,8,1,2,3,4,5,6,9}, {0,1,8,7,6,5,4,3,2,9},{0,7,6,5,4,3,2,1,8,9},{0,5,4,3,2,1,8,7,6,9},{0,3,2,1,8,7,6,5,4,9}}; for(int i=0;i<8;i++) symmetry_remap[Moore]["rotate4reflect"].push_back(vector(moore_rotate4reflect[i],moore_rotate4reflect[i]+10)); int moore_rotate8reflect[16][10] = {{0,1,2,3,4,5,6,7,8,9},{0,2,3,4,5,6,7,8,1,9},{0,3,4,5,6,7,8,1,2,9},{0,4,5,6,7,8,1,2,3,9}, {0,5,6,7,8,1,2,3,4,9},{0,6,7,8,1,2,3,4,5,9},{0,7,8,1,2,3,4,5,6,9},{0,8,1,2,3,4,5,6,7,9}, {0,8,7,6,5,4,3,2,1,9},{0,7,6,5,4,3,2,1,8,9},{0,6,5,4,3,2,1,8,7,9},{0,5,4,3,2,1,8,7,6,9}, {0,4,3,2,1,8,7,6,5,9},{0,3,2,1,8,7,6,5,4,9},{0,2,1,8,7,6,5,4,3,9},{0,1,8,7,6,5,4,3,2,9}}; for(int i=0;i<16;i++) symmetry_remap[Moore]["rotate8reflect"].push_back(vector(moore_rotate8reflect[i],moore_rotate8reflect[i]+10)); int moore_reflect_horizontal[2][10] = {{0,1,2,3,4,5,6,7,8,9},{0,1,8,7,6,5,4,3,2,9}}; for(int i=0;i<2;i++) symmetry_remap[Moore]["reflect_horizontal"].push_back(vector(moore_reflect_horizontal[i],moore_reflect_horizontal[i]+10)); int oneDimensional_reflect[2][4] = {{0,1,2,3},{0,2,1,3}}; for(int i=0;i<2;i++) symmetry_remap[oneDimensional]["reflect"].push_back(vector(oneDimensional_reflect[i],oneDimensional_reflect[i]+4)); int hex_rotate2[2][8] = {{0,1,2,3,4,5,6,7},{0,4,5,6,1,2,3,7}}; for(int i=0;i<2;i++) symmetry_remap[hexagonal]["rotate2"].push_back(vector(hex_rotate2[i],hex_rotate2[i]+8)); int hex_rotate3[3][8] = {{0,1,2,3,4,5,6,7},{0,3,4,5,6,1,2,7},{0,5,6,1,2,3,4,7}}; for(int i=0;i<3;i++) symmetry_remap[hexagonal]["rotate3"].push_back(vector(hex_rotate3[i],hex_rotate3[i]+8)); int hex_rotate6[6][8] = {{0,1,2,3,4,5,6,7},{0,2,3,4,5,6,1,7},{0,3,4,5,6,1,2,7}, {0,4,5,6,1,2,3,7},{0,5,6,1,2,3,4,7},{0,6,1,2,3,4,5,7}}; for(int i=0;i<6;i++) symmetry_remap[hexagonal]["rotate6"].push_back(vector(hex_rotate6[i],hex_rotate6[i]+8)); int hex_rotate6reflect[12][8] = {{0,1,2,3,4,5,6,7},{0,2,3,4,5,6,1,7},{0,3,4,5,6,1,2,7}, {0,4,5,6,1,2,3,7},{0,5,6,1,2,3,4,7},{0,6,1,2,3,4,5,7}, {0,6,5,4,3,2,1,7},{0,5,4,3,2,1,6,7},{0,4,3,2,1,6,5,7}, {0,3,2,1,6,5,4,7},{0,2,1,6,5,4,3,7},{0,1,6,5,4,3,2,7}}; for(int i=0;i<12;i++) symmetry_remap[hexagonal]["rotate6reflect"].push_back(vector(hex_rotate6reflect[i],hex_rotate6reflect[i]+8)); } // initialize the packed transition table this->lut.assign(n_inputs,vector< vector >(this->n_states)); this->output.clear(); this->n_compressed_rules = 0; // each transition rule looks like: e.g. 1,[2,3,5],4,[0,1],3 -> 0 vector< vector > permuted_inputs(n_inputs); for(vector< pair< vector< vector >, state> >::const_iterator rule_it = transition_table.begin(); rule_it!=transition_table.end(); rule_it++) { const vector< vector > & inputs = rule_it->first; state output = rule_it->second; if(symmetries=="none") { PackTransition(inputs,output); } else if(symmetries=="permute") { // work through the permutations of all but the centre cell permuted_inputs = inputs; sort(permuted_inputs.begin()+1,permuted_inputs.end()); // (must sort before permuting) do { PackTransition(permuted_inputs,output); } while(next_permutation(permuted_inputs.begin()+1,permuted_inputs.end())); // (skips duplicates) } else { const vector< vector > & remap = symmetry_remap[this->neighborhood][symmetries]; for(int iSymm=0;iSymm<(int)remap.size();iSymm++) { for(int i=0;i > & inputs, state output) { int n_inputs = (int)inputs.size(); const unsigned int n_bits = (unsigned int)(sizeof(TBits)*8); this->output.push_back(output); int iRule = (int)(this->output.size()-1); int iBit = iRule % n_bits; unsigned int iRuleC = (iRule-iBit)/n_bits; // the compressed index of the rule // add a new compressed rule if required if(iRuleC >= this->n_compressed_rules) { for(int iInput=0;iInputlut[iInput][iState].push_back(0); this->n_compressed_rules++; } TBits mask = (TBits)1 << iBit; // (cast needed to ensure this is a 64-bit shift, not a 32-bit shift) for(int iNbor=0;iNbor & possibles = inputs[iNbor]; for(vector::const_iterator poss_it=possibles.begin();poss_it!=possibles.end();poss_it++) { // add the bits this->lut[iNbor][*poss_it][iRuleC] |= mask; } } } const char* ruletable_algo::getrule() { return this->current_rule.c_str(); } const char* ruletable_algo::DefaultRule() { return "Langtons-Loops"; } ruletable_algo::ruletable_algo() : n_states(8), neighborhood(vonNeumann), n_compressed_rules(0) { maxCellStates = n_states; } ruletable_algo::~ruletable_algo() { } // --- the update function --- state ruletable_algo::slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) { TBits is_match = 0; // AKT: explicitly initialized to avoid gcc warning for(unsigned int iRuleC=0;iRuleCn_compressed_rules;iRuleC++) { // is there a match for any of the (e.g.) 64 rules within iRuleC? // (we don't have to worry about symmetries here since they were expanded out in PackTransitions) switch(this->neighborhood) { case vonNeumann: // c,n,e,s,w is_match = this->lut[0][c][iRuleC] & this->lut[1][n][iRuleC] & this->lut[2][e][iRuleC] & this->lut[3][s][iRuleC] & this->lut[4][w][iRuleC]; break; case Moore: // c,n,ne,e,se,s,sw,w,nw is_match = this->lut[0][c][iRuleC] & this->lut[1][n][iRuleC] & this->lut[2][ne][iRuleC] & this->lut[3][e][iRuleC] & this->lut[4][se][iRuleC] & this->lut[5][s][iRuleC] & this->lut[6][sw][iRuleC] & this->lut[7][w][iRuleC] & this->lut[8][nw][iRuleC]; break; case hexagonal: // c,n,e,se,s,w,nw is_match = this->lut[0][c][iRuleC] & this->lut[1][n][iRuleC] & this->lut[2][e][iRuleC] & this->lut[3][se][iRuleC] & this->lut[4][s][iRuleC] & this->lut[5][w][iRuleC] & this->lut[6][nw][iRuleC]; break; case oneDimensional: // c,w,e is_match = this->lut[0][c][iRuleC] & this->lut[1][w][iRuleC] & this->lut[2][e][iRuleC]; break; } // if any of them matched, return the output of the first if(is_match) { // find the least significant bit of is_match unsigned int iBit=0; TBits mask=1; while(!(is_match&mask)) { ++iBit; mask <<= 1; } return this->output[ iRuleC*sizeof(TBits)*8 + iBit ]; // find the uncompressed rule index } } return c; // default: no change } static lifealgo *creator() { return new ruletable_algo(); } void ruletable_algo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai); ai.setAlgorithmName("RuleTable"); ai.setAlgorithmCreator(&creator); ai.minstates = 2; ai.maxstates = 256; // init default color scheme ai.defgradient = true; // use gradient ai.defr1 = 255; // start color = red ai.defg1 = 0; ai.defb1 = 0; ai.defr2 = 255; // end color = yellow ai.defg2 = 255; ai.defb2 = 0; // if not using gradient then set all states to white for (int i=0; i<256; i++) { ai.defr[i] = ai.defg[i] = ai.defb[i] = 255; } } golly-2.5-src/gollybase/ruletreealgo.cpp0000644000175100001440000002213612156145314015376 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "ruletreealgo.h" #include "util.h" // for lifegetuserrules, lifegetrulesdir, lifewarning #include // for case-insensitive string comparison #include #ifndef WIN32 #define stricmp strcasecmp #endif #include #include #include using namespace std ; bool ruletreealgo::IsDefaultRule(const char* rulename) { // nicer to check for different versions of default rule return (stricmp(rulename, "B3/S23") == 0 || stricmp(rulename, "B3S23") == 0 || strcmp(rulename, "23/3") == 0); } static FILE* static_rulefile = NULL; static int static_lineno = 0; static char static_endchar = 0; const char* ruletreealgo::LoadTree(FILE* rulefile, int lineno, char endchar, const char* s) { // set static vars so setrule() will load tree data from .rule file static_rulefile = rulefile; static_lineno = lineno; static_endchar = endchar; const char* err = setrule(s); // reset static vars static_rulefile = NULL; static_lineno = 0; static_endchar = 0; return err; } int ruletreealgo::NumCellStates() { return num_states ; } const int MAXFILELEN = 4096 ; /* provide the ability to load the default rule without requiring a file */ static const char *defaultRuleData[] = { "num_states=2", "num_neighbors=8", "num_nodes=32", "1 0 0", "2 0 0", "1 0 1", "2 0 2", "3 1 3", "1 1 1", "2 2 5", "3 3 6", "4 4 7", "2 5 0", "3 6 9", "4 7 10", "5 8 11", "3 9 1", "4 10 13", "5 11 14", "6 12 15", "3 1 1", "4 13 17", "5 14 18", "6 15 19", "7 16 20", "4 17 17", "5 18 22", "6 19 23", "7 20 24", "8 21 25", "5 22 22", "6 23 27", "7 24 28", "8 25 29", "9 26 30", 0 } ; static FILE *OpenTreeFile(const char *rule, const char *dir, char *path) { // look for rule.tree in given dir and set path if (strlen(dir) + strlen(rule) + 15 > (unsigned int)MAXFILELEN) { lifewarning("Path too long") ; return NULL ; } sprintf(path, "%s%s.tree", dir, rule) ; // change "dangerous" characters to underscores for (char *p=path + strlen(dir); *p; p++) if (*p == '/' || *p == '\\') *p = '_' ; return fopen(path, "r") ; } const char* ruletreealgo::setrule(const char* s) { const char *colonptr = strchr(s, ':'); string rule_name(s); if (colonptr) rule_name.assign(s,colonptr); char strbuf[MAXFILELEN+1] ; FILE *f = 0 ; linereader lr(0) ; int lineno = 0 ; bool isDefaultRule = IsDefaultRule(rule_name.c_str()) ; if (isDefaultRule) { // no need to read tree data from a file } else if (static_rulefile) { // read tree data from currently open .rule file lr.setfile(static_rulefile); lr.setcloseonfree(); lineno = static_lineno; } else { if (strlen(rule_name.c_str()) >= (unsigned int)MAXRULESIZE) { return "Rule length too long" ; } // look for rule.tree in user's rules dir then in Golly's rules dir f = OpenTreeFile(rule_name.c_str(), lifegetuserrules(), strbuf); if (f == 0) f = OpenTreeFile(rule_name.c_str(), lifegetrulesdir(), strbuf); if (f == 0) { return "File not found" ; } lr.setfile(f) ; lr.setcloseonfree() ; } // check for rule suffix like ":T200,100" to specify a bounded universe if (colonptr) { const char* err = setgridsize(colonptr); if (err) return err; } else { // universe is unbounded gridwd = 0; gridht = 0; } int mnum_states=-1, mnum_neighbors=-1, mnum_nodes=-1 ; vector dat ; vector datb ; vector noff ; int lev = 1000 ; for (;;) { if (isDefaultRule) { if (defaultRuleData[lineno] == 0) break ; strcpy(strbuf, defaultRuleData[lineno]) ; } else { if (lr.fgets(strbuf, MAXFILELEN) == 0) break ; if (static_rulefile && strbuf[0] == static_endchar) break; } lineno++ ; if (strbuf[0] != '#' && strbuf[0] != 0 && sscanf(strbuf, " num_states = %d", &mnum_states) != 1 && sscanf(strbuf, " num_neighbors = %d", &mnum_neighbors) != 1 && sscanf(strbuf, " num_nodes = %d", &mnum_nodes) != 1) { if (mnum_states < 2 || mnum_states > 256 || (mnum_neighbors != 4 && mnum_neighbors != 8) || mnum_nodes < mnum_neighbors || mnum_nodes > 100000000) { return "Bad basic values" ; } if (strbuf[0] < '1' || strbuf[0] > '0' + 1 + mnum_neighbors) { return "Bad line in tree data 1" ; } lev = strbuf[0] - '0' ; int vcnt = 0 ; char *p = strbuf + 1 ; if (lev == 1) noff.push_back((int)(datb.size())) ; else noff.push_back((int)(dat.size())) ; while (*p) { while (*p && *p <= ' ') p++ ; int v = 0 ; while (*p > ' ') { if (*p < '0' || *p > '9') { return "Bad line in tree data 2" ; } v = v * 10 + *p++ - '0' ; } if (lev == 1) { if (v < 0 || v >= mnum_states) { return "Bad state value in tree data" ; } datb.push_back((state)v) ; } else { if (v < 0 || ((unsigned int)v) >= noff.size()) { return "Bad node value in tree data" ; } dat.push_back(noff[v]) ; } vcnt++ ; } if (vcnt != mnum_states) { return "Bad number of values on tree data line" ; } } } if (dat.size() + datb.size() != (unsigned int)(mnum_nodes * mnum_states)) return "Bad count of values in tree data" ; if (lev != mnum_neighbors + 1) return "Bad last node (wrong level)" ; int *na = (int*)calloc(sizeof(int), dat.size()) ; state *nb = (state*)calloc(sizeof(state), datb.size()) ; if (na == 0 || nb == 0) return "Out of memory in tree allocation" ; if (a) free(a) ; if (b) free(b) ; num_nodes = mnum_nodes ; num_states = mnum_states ; num_neighbors = mnum_neighbors ; for (unsigned int i=0; i 0 || gridht > 0) { // setgridsize() was successfully called above, so append suffix int len = (int)strlen(rule) ; const char* bounds = canonicalsuffix() ; int i = 0 ; while (bounds[i]) rule[len++] = bounds[i++] ; rule[len] = 0 ; } return 0 ; } const char* ruletreealgo::getrule() { return rule ; } const char* ruletreealgo::DefaultRule() { return "B3/S23" ; } ruletreealgo::ruletreealgo() : ghashbase(), a(0), base(0), b(0), num_neighbors(0), num_states(0), num_nodes(0) { rule[0] = 0 ; } ruletreealgo::~ruletreealgo() { if (a != 0) { free(a) ; a = 0 ; } if (b != 0) { free(b) ; b = 0 ; } } state ruletreealgo::slowcalc(state nw, state n, state ne, state w, state c, state e, state sw, state s, state se) { if (num_neighbors == 4) return b[a[a[a[a[base+n]+w]+e]+s]+c] ; else return b[a[a[a[a[a[a[a[a[base+nw]+ne]+sw]+se]+n]+w]+e]+s]+c] ; } static lifealgo *creator() { return new ruletreealgo() ; } void ruletreealgo::doInitializeAlgoInfo(staticAlgoInfo &ai) { ghashbase::doInitializeAlgoInfo(ai) ; ai.setAlgorithmName("RuleTree") ; ai.setAlgorithmCreator(&creator) ; ai.minstates = 2 ; ai.maxstates = 256 ; // init default color scheme ai.defgradient = true; // use gradient ai.defr1 = 255; // start color = red ai.defg1 = 0; ai.defb1 = 0; ai.defr2 = 255; // end color = yellow ai.defg2 = 255; ai.defb2 = 0; // if not using gradient then set all states to white for (int i=0; i<256; i++) ai.defr[i] = ai.defg[i] = ai.defb[i] = 255; } golly-2.5-src/gollybase/util.cpp0000644000175100001440000000766512156145314013673 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "util.h" #include #include /** * For now error just uses stderr. */ class baselifeerrors : public lifeerrors { public: virtual void fatal(const char *s) { fprintf(stderr, "%s\n", s) ; exit(10) ; } virtual void warning(const char *s) { fprintf(stderr, "%s\n", s) ; } virtual void status(const char *s) { fprintf(stderr, "%s\n", s) ; } virtual void beginprogress(const char *) { aborted = false ; } virtual bool abortprogress(double, const char *) { return false ; } virtual void endprogress() { // do nothing } virtual const char *getuserrules() { return "" ; } virtual const char *getrulesdir() { return "" ; } } ; baselifeerrors baselifeerrors ; lifeerrors *errorhandler = &baselifeerrors ; void lifeerrors::seterrorhandler(lifeerrors *o) { if (o == 0) errorhandler = &baselifeerrors ; else errorhandler = o ; } void lifefatal(const char *s) { errorhandler->fatal(s) ; } void lifewarning(const char *s) { errorhandler->warning(s) ; } void lifestatus(const char *s) { errorhandler->status(s) ; } void lifebeginprogress(const char *dlgtitle) { errorhandler->beginprogress(dlgtitle) ; } bool lifeabortprogress(double fracdone, const char *newmsg) { return errorhandler->aborted |= errorhandler->abortprogress(fracdone, newmsg) ; } bool isaborted() { return errorhandler->aborted ; } void lifeendprogress() { errorhandler->endprogress() ; } const char *lifegetuserrules() { return errorhandler->getuserrules() ; } const char *lifegetrulesdir() { return errorhandler->getrulesdir() ; } static FILE *f ; FILE *getdebugfile() { if (f == 0) f = fopen("trace.txt", "w") ; return f ; } /** * Manage reading lines from a FILE* without worrying about * line terminates. Note that the fgets() routine does not * insert any line termination characters at all. */ linereader::linereader(FILE *f) { setfile(f) ; } void linereader::setfile(FILE *f) { fp = f ; lastchar = 0 ; closeonfree = 0 ; // AKT: avoid crash on Linux } void linereader::setcloseonfree() { closeonfree = 1 ; } int linereader::close() { if (fp) { int r = fclose(fp) ; fp = 0 ; return r ; } return 0 ; } linereader::~linereader() { if (closeonfree) close() ; } const int LF = 10 ; const int CR = 13 ; char *linereader::fgets(char *buf, int maxlen) { int i = 0 ; for (;;) { if (i+1 >= maxlen) { buf[i] = 0 ; return buf ; } int c = getc(fp) ; switch (c) { case EOF: if (i == 0) return 0 ; buf[i] = 0 ; return buf ; case LF: if (lastchar != CR) { lastchar = LF ; buf[i] = 0 ; return buf ; } break ; case CR: lastchar = CR ; buf[i] = 0 ; return buf ; default: lastchar = c ; buf[i++] = (char)c ; break ; } } } golly-2.5-src/gollybase/viewport.cpp0000644000175100001440000001371312156145314014564 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "viewport.h" #include "lifealgo.h" #include #include #include int MAX_MAG = 4 ; // default maximum cell size is 2^4 using namespace std ; void viewport::init() { x = 0 ; y = 0 ; height = width = 8 ; mag = 0 ; x0 = 0 ; y0 = 0 ; x0f = 0 ; y0f = 0 ; xymf = 0 ; } void viewport::zoom() { if (mag >= MAX_MAG) return ; mag++ ; reposition() ; } void viewport::zoom(int xx, int yy) { if (mag >= MAX_MAG) return ; pair oldpos = at(xx, yy); // save cell pos for use below int x2c = xx * 2 - getxmax() ; bigint o = x2c ; o.mulpow2(-mag-2) ; x += o ; int y2c = yy * 2 - getymax() ; o = y2c ; o.mulpow2(-mag-2) ; y += o ; mag++ ; reposition() ; // adjust cell position if necessary to avoid any drift if (mag >= 0) { pair newpos = at(xx, yy); bigint xdrift = newpos.first; bigint ydrift = newpos.second; xdrift -= oldpos.first; ydrift -= oldpos.second; // drifts will be -1, 0 or 1 if (xdrift != 0) move(-xdrift.toint() << mag, 0); if (ydrift != 0) move(0, -ydrift.toint() << mag); } } void viewport::unzoom() { mag-- ; reposition() ; } void viewport::unzoom(int xx, int yy) { pair oldpos = at(xx, yy); // save cell pos for use below mag-- ; int x2c = xx * 2 - getxmax() ; bigint o = x2c ; o.mulpow2(-mag-2) ; x -= o ; int y2c = yy * 2 - getymax() ; o = y2c ; o.mulpow2(-mag-2) ; y -= o ; reposition() ; // adjust cell position if necessary to avoid any drift pair newpos = at(xx, yy); bigint xdrift = newpos.first; bigint ydrift = newpos.second; xdrift -= oldpos.first; ydrift -= oldpos.second; // drifts will be -1, 0 or 1 if (xdrift != 0) move(-xdrift.toint() << mag, 0); if (ydrift != 0) move(0, -ydrift.toint() << mag); } pair viewport::at(int x, int y) { bigint rx = x ; bigint ry = y ; rx.mulpow2(-mag) ; ry.mulpow2(-mag) ; rx += x0 ; ry += y0 ; return pair(rx, ry) ; } pair viewport::atf(int x, int y) { return pair(x0f + x * xymf, y0f + y * xymf) ; } /** * Returns the screen position of a particular pixel. Note that this * is a tiny bit more complicated than you might expect, because it * has to take into account exactly how a life algorithm compresses * multiple pixels into a single pixel (which depends not only on the * lifealgo, but in the case of qlifealgo, *also* depends on the * generation count). In the case of mag < 0, it always returns * the upper left pixel; it's up to the caller to adjust when * mag<0. */ pair viewport::screenPosOf(bigint x, bigint y, lifealgo *algo) { if (mag < 0) { bigint xx0 = x0 ; bigint yy0 = y0 ; algo->lowerRightPixel(xx0, yy0, mag) ; y -= yy0 ; x -= xx0 ; } else { x -= x0 ; y -= y0 ; } x.mulpow2(mag) ; y.mulpow2(mag) ; int xx = 0 ; int yy = 0 ; /* AKT: don't do this clipping as it makes it harder to calculate an accurate paste rectangle if (x < 0) xx = -1 ; else if (x > getxmax()) xx = getxmax() + 1 ; else xx = x.toint() ; if (y < 0) yy = -1 ; else if (y > getymax()) yy = getymax() + 1 ; else yy = y.toint() ; */ // AKT: better to do this in bigint::toint() and make these static consts??? bigint bigmaxint(INT_MAX) ; bigint bigminint(INT_MIN) ; if (x > bigmaxint) xx = INT_MAX ; else if (x < bigminint) xx = INT_MIN ; else xx = x.toint() ; if (y > bigmaxint) yy = INT_MAX ; else if (y < bigminint) yy = INT_MIN ; else yy = y.toint() ; return pair(xx,yy) ; } void viewport::move(int dx, int dy) { // dx and dy are in pixels if (mag > 0) { dx /= (1 << mag) ; dy /= (1 << mag) ; } bigint addx = dx ; bigint addy = dy ; if (mag < 0) { addx <<= -mag ; addy <<= -mag ; } x += addx ; y += addy ; reposition() ; } void viewport::resize(int newwidth, int newheight) { width = newwidth ; height = newheight ; reposition() ; } void viewport::center() { x = 0 ; y = 0 ; reposition() ; } void viewport::reposition() { xymf = pow(2.0, -mag) ; x0 = - getxmax() ; y0 = - getymax() ; x0.mulpow2(-mag) ; y0.mulpow2(-mag) ; x0 += 1 ; y0 += 1 ; x0 >>= 1 ; y0 >>= 1 ; x0 += x ; y0 += y ; y0f = y0.todouble() ; x0f = x0.todouble() ; } void viewport::setpositionmag(const bigint &xarg, const bigint &yarg, int magarg) { x = xarg ; y = yarg ; mag = magarg ; reposition() ; } int viewport::contains(const bigint &xarg, const bigint &yarg) { bigint t = x ; t -= xarg ; t.mulpow2(mag+1) ; if (t <= -getxmax() || t >= getxmax()) { return 0 ; } t = y ; t -= yarg ; t.mulpow2(mag+1) ; if (t <= -getymax() || t >= getymax()) { return 0 ; } return 1 ; } golly-2.5-src/gollybase/writepattern.cpp0000644000175100001440000002657312156145314015445 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "writepattern.h" #include "lifealgo.h" #include "util.h" // for *progress calls #include #include #include #include #ifdef ZLIB #include #include #endif #ifdef __APPLE__ #define BUFFSIZE 4096 // 4K is best for Mac OS X #else #define BUFFSIZE 8192 // 8K is best for Windows and other platforms??? #endif // globals for writing RLE files static char outbuff[BUFFSIZE]; static size_t outpos; // current write position in outbuff static bool badwrite; // fwrite failed? // using buffered putchar instead of fputc is about 20% faster on Mac OS X static void putchar(char ch, std::ostream &os) { if (badwrite) return; if (outpos == BUFFSIZE) { if (!os.write(outbuff, outpos)) badwrite = true; outpos = 0; } outbuff[outpos] = ch; outpos++; } const int WRLE_NONE = -3 ; const int WRLE_EOP = -2 ; const int WRLE_NEWLINE = -1 ; // output of RLE pattern data is channelled thru here to make it easier to // ensure all lines have <= 70 characters void AddRun(std::ostream &f, int state, // in: state of cell to write int multistate, // true if #cell states > 2 unsigned int &run, // in and out unsigned int &linelen) // ditto { unsigned int i, numlen; char numstr[32]; if ( run > 1 ) { sprintf(numstr, "%u", run); numlen = (int)strlen(numstr); } else { numlen = 0; // no run count shown if 1 } if ( linelen + numlen + 1 + multistate > 70 ) { putchar('\n', f); linelen = 0; } i = 0; while (i < numlen) { putchar(numstr[i], f); i++; } if (multistate) { if (state <= 0) putchar(".$!"[-state], f) ; else { if (state > 24) { int hi = (state - 25) / 24 ; putchar((char)(hi + 'p'), f) ; linelen++ ; state -= (hi + 1) * 24 ; } putchar((char)('A' + state - 1), f) ; } } else putchar("!$bo"[state+2], f) ; linelen += numlen + 1; run = 0; // reset run count } // write current pattern to file using extended RLE format const char *writerle(std::ostream &os, char *comments, lifealgo &imp, int top, int left, int bottom, int right, bool xrle) { badwrite = false; if (xrle) { // write out #CXRLE line; note that the XRLE indicator is prefixed // with #C so apps like Life32 and MCell will ignore the line os << "#CXRLE Pos=" << left << ',' << top; if (imp.getGeneration() > bigint::zero) os << " Gen=" << imp.getGeneration().tostring('\0'); os << '\n'; } char *endcomms = NULL; if (comments && comments[0]) { // write given comment line(s) -- can't just do fputs(comments,f) // because comments might include arbitrary text after the "!" char *p = comments; while (*p == '#') { while (*p != '\n') p++; p++; } if (p != comments) { char savech = *p; *p = '\0'; os << comments; *p = savech; } // any comment lines not starting with # will be written after "!" if (*p != '\0') endcomms = p; } if ( imp.isEmpty() || top > bottom || left > right ) { // empty pattern os << "x = 0, y = 0, rule = " << imp.getrule() << "\n!\n"; } else { // do header line unsigned int wd = right - left + 1; unsigned int ht = bottom - top + 1; sprintf(outbuff, "x = %u, y = %u, rule = %s\n", wd, ht, imp.getrule()); outpos = strlen(outbuff); // do RLE data unsigned int linelen = 0; unsigned int brun = 0; unsigned int orun = 0; unsigned int dollrun = 0; int laststate = WRLE_NONE ; int multistate = imp.NumCellStates() > 2 ; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = imp.getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; int v = 0 ; for ( cy=top; cy<=bottom; cy++ ) { // set lastchar to anything except 'o' or 'b' laststate = WRLE_NONE ; currcount++; for ( cx=left; cx<=right; cx++ ) { int skip = imp.nextcell(cx, cy, v); if (skip + cx > right) skip = -1; // pretend we found no more live cells if (skip > 0) { // have exactly "skip" dead cells here if (laststate == 0) { brun += skip; } else { if (orun > 0) { // output current run of live cells AddRun(os, laststate, multistate, orun, linelen); } laststate = 0 ; brun = skip; } } if (skip >= 0) { // found next live cell in this row cx += skip; if (laststate == v) { orun++; } else { if (dollrun > 0) // output current run of $ chars AddRun(os, WRLE_NEWLINE, multistate, dollrun, linelen); if (brun > 0) // output current run of dead cells AddRun(os, 0, multistate, brun, linelen); if (orun > 0) AddRun(os, laststate, multistate, orun, linelen) ; laststate = v ; orun = 1; } currcount++; } else { cx = right + 1; // done this row } if (currcount > 1024) { char msg[128]; accumcount += currcount; currcount = 0; sprintf(msg, "File size: %.2f MB", os.tellp() / 1048576.0); if (lifeabortprogress(accumcount / maxcount, msg)) break; } } // end of current row if (isaborted()) break; if (laststate == 0) // forget dead cells at end of row brun = 0; else if (laststate >= 0) // output current run of live cells AddRun(os, laststate, multistate, orun, linelen); dollrun++; } // terminate RLE data dollrun = 1; AddRun(os, WRLE_EOP, multistate, dollrun, linelen); putchar('\n', os); // flush outbuff if (outpos > 0 && !badwrite && !os.write(outbuff, outpos)) badwrite = true; } if (endcomms) os << endcomms; if (badwrite) return "Failed to write output buffer!"; else return 0; } const char *writemacrocell(std::ostream &os, char *comments, lifealgo &imp) { if (imp.hyperCapable()) return imp.writeNativeFormat(os, comments); else return "Not yet implemented."; } #ifdef ZLIB class gzbuf : public std::streambuf { public: gzbuf() : file(NULL) { } gzbuf(const char *path) : file(NULL) { open(path); } ~gzbuf() { close(); } gzbuf *open(const char *path) { if (file) return NULL; file = gzopen(path, "wb"); return file ? this : NULL; } gzbuf *close() { if (!file) return NULL; int res = gzclose(file); file = NULL; return res == Z_OK ? this : NULL; } bool is_open() const { return file!=NULL; } int overflow(int c=EOF) { if (c == EOF) return c ; return gzputc(file, c) ; } std::streamsize xsputn(const char_type *s, std::streamsize n) { return gzwrite(file, s, (unsigned int)n); } int sync() { return gzflush(file, Z_SYNC_FLUSH) == Z_OK ? 0 : -1; } pos_type seekoff(off_type off, std::ios_base::seekdir way, std::ios_base::openmode which) { if (file && off == 0 && way == std::ios_base::cur && which == std::ios_base::out) { #if ZLIB_VERNUM >= 0x1240 // gzoffset is only available in zlib 1.2.4 or later return pos_type(gzoffset(file)); #else // return an approximation of file size (only used in progress dialog) z_off_t offset = gztell(file); if (offset > 0) offset /= 4; return pos_type(offset); #endif } return pos_type(off_type(-1)); } private: gzFile file; }; #endif const char *writepattern(const char *filename, lifealgo &imp, pattern_format format, output_compression compression, int top, int left, int bottom, int right) { // extract any comments if file exists so we can copy them to new file char *commptr = NULL; if (std::ifstream(filename)) { const char *err = readcomments(filename, &commptr); if (err) { if (commptr) free(commptr); return err; } } // skip past any old #CXRLE lines at start of existing XRLE file char *comments = commptr; if (comments) { while (strncmp(comments, "#CXRLE", 6) == 0) { while (*comments != '\n') comments++; comments++; } } // open output stream std::streambuf *streambuf = NULL; std::filebuf filebuf; #ifdef ZLIB gzbuf gzbuf; #endif switch (compression) { default: /* no output compression */ streambuf = filebuf.open(filename, std::ios_base::out); break; case gzip_compression: #ifdef ZLIB streambuf = gzbuf.open(filename); break; #else free(commptr); return "GZIP compression not supported"; #endif } if (!streambuf) { free(commptr); return "Can't create pattern file!"; } std::ostream os(streambuf); lifebeginprogress("Writing pattern file"); const char *errmsg = NULL; switch (format) { case RLE_format: errmsg = writerle(os, comments, imp, top, left, bottom, right, false); break; case XRLE_format: errmsg = writerle(os, comments, imp, top, left, bottom, right, true); break; case MC_format: // macrocell format ignores given edges errmsg = writemacrocell(os, comments, imp); break; default: errmsg = "Unsupported pattern format!"; } if (errmsg == NULL && !os.flush()) errmsg = "Error occurred writing file; maybe disk is full?"; lifeendprogress(); if (commptr) free(commptr); if (isaborted()) return "File contains truncated pattern."; else return errmsg; } golly-2.5-src/gui-ios/0000755000175100001440000000000012156146014011645 500000000000000golly-2.5-src/gui-ios/Golly/0000755000175100001440000000000012156146016012735 500000000000000golly-2.5-src/gui-ios/Golly/en.lproj/0000755000175100001440000000000012156146016014464 500000000000000golly-2.5-src/gui-ios/Golly/en.lproj/InfoPlist.strings0000644000175100001440000000005512156145314017726 00000000000000/* Localized versions of Info.plist keys */ golly-2.5-src/gui-ios/Golly/MiniZip/0000755000175100001440000000000012156146016014314 500000000000000golly-2.5-src/gui-ios/Golly/MiniZip/crypt.h0000644000175100001440000001105712156145314015552 00000000000000/* crypt.h -- base code for crypt/uncrypt ZIPfile Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant This code is a modified version of crypting code in Infozip distribution The encryption/decryption parts of this source code (as opposed to the non-echoing password parts) were originally written in Europe. The whole source package can be freely distributed, including from the USA. (Prior to January 2000, re-export from the US was a violation of US law.) This encryption code is a direct transcription of the algorithm from Roger Schlafly, described by Phil Katz in the file appnote.txt. This file (appnote.txt) is distributed with the PKZIP program (even in the version without encryption capabilities). If you don't need crypting in your application, just define symbols NOCRYPT and NOUNCRYPT. This code support the "Traditional PKWARE Encryption". The new AES encryption added on Zip format by Winzip (see the page http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong Encryption is not supported. */ #define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) /*********************************************************************** * Return the next byte in the pseudo-random sequence */ static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) { unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an * unpredictable manner on 16-bit systems; not a problem * with any known compiler so far, though */ temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); } /*********************************************************************** * Update the encryption keys with the next byte of plain text */ static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) { (*(pkeys+0)) = CRC32((*(pkeys+0)), c); (*(pkeys+1)) += (*(pkeys+0)) & 0xff; (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; { register int keyshift = (int)((*(pkeys+1)) >> 24); (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); } return c; } /*********************************************************************** * Initialize the encryption keys and the random header according to * the given password. */ static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) { *(pkeys+0) = 305419896L; *(pkeys+1) = 591751049L; *(pkeys+2) = 878082192L; while (*passwd != '\0') { update_keys(pkeys,pcrc_32_tab,(int)*passwd); passwd++; } } #define zdecode(pkeys,pcrc_32_tab,c) \ (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) #define zencode(pkeys,pcrc_32_tab,c,t) \ (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) #ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED #define RAND_HEAD_LEN 12 /* "last resort" source for second part of crypt seed pattern */ # ifndef ZCR_SEED2 # define ZCR_SEED2 3141592654UL /* use PI as default pattern */ # endif static int crypthead( const char *passwd, /* password string */ unsigned char *buf, /* where to write header */ int bufSize, unsigned long* pkeys, const unsigned long* pcrc_32_tab, unsigned long crcForCrypting) { int n; /* index in random header */ int t; /* temporary */ int c; /* random byte */ unsigned char header[RAND_HEAD_LEN-2]; /* random header */ static unsigned calls = 0; /* ensure different random header each time */ if (bufSize> 7) & 0xff; header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); } /* Encrypt random header (last two bytes is high word of crc) */ init_keys(passwd, pkeys, pcrc_32_tab); for (n = 0; n < RAND_HEAD_LEN-2; n++) { buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); } buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); return n; } #endif golly-2.5-src/gui-ios/Golly/MiniZip/ioapi.c0000644000175100001440000000665512156145314015515 00000000000000/* ioapi.c -- IO base function header for compress/uncompress .zip files using zlib + zip or unzip API Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant */ #include #include #include #include "zlib.h" #include "ioapi.h" /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif voidpf ZCALLBACK fopen_file_func OF(( voidpf opaque, const char* filename, int mode)); uLong ZCALLBACK fread_file_func OF(( voidpf opaque, voidpf stream, void* buf, uLong size)); uLong ZCALLBACK fwrite_file_func OF(( voidpf opaque, voidpf stream, const void* buf, uLong size)); long ZCALLBACK ftell_file_func OF(( voidpf opaque, voidpf stream)); long ZCALLBACK fseek_file_func OF(( voidpf opaque, voidpf stream, uLong offset, int origin)); int ZCALLBACK fclose_file_func OF(( voidpf opaque, voidpf stream)); int ZCALLBACK ferror_file_func OF(( voidpf opaque, voidpf stream)); voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode) { FILE* file = NULL; const char* mode_fopen = NULL; if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) mode_fopen = "rb"; else if (mode & ZLIB_FILEFUNC_MODE_EXISTING) mode_fopen = "r+b"; else if (mode & ZLIB_FILEFUNC_MODE_CREATE) mode_fopen = "wb"; if ((filename!=NULL) && (mode_fopen != NULL)) file = fopen(filename, mode_fopen); return file; } uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size) { uLong ret; ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); return ret; } uLong ZCALLBACK fwrite_file_func ( voidpf opaque, voidpf stream, const void* buf, uLong size) { uLong ret; ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); return ret; } long ZCALLBACK ftell_file_func ( voidpf opaque, voidpf stream) { long ret; ret = ftell((FILE *)stream); return ret; } long ZCALLBACK fseek_file_func ( voidpf opaque, voidpf stream, uLong offset, int origin) { int fseek_origin=0; long ret; switch (origin) { case ZLIB_FILEFUNC_SEEK_CUR : fseek_origin = SEEK_CUR; break; case ZLIB_FILEFUNC_SEEK_END : fseek_origin = SEEK_END; break; case ZLIB_FILEFUNC_SEEK_SET : fseek_origin = SEEK_SET; break; default: return -1; } ret = 0; fseek((FILE *)stream, offset, fseek_origin); return ret; } int ZCALLBACK fclose_file_func ( voidpf opaque, voidpf stream) { int ret; ret = fclose((FILE *)stream); return ret; } int ZCALLBACK ferror_file_func ( voidpf opaque, voidpf stream) { int ret; ret = ferror((FILE *)stream); return ret; } void fill_fopen_filefunc ( zlib_filefunc_def* pzlib_filefunc_def) { pzlib_filefunc_def->zopen_file = fopen_file_func; pzlib_filefunc_def->zread_file = fread_file_func; pzlib_filefunc_def->zwrite_file = fwrite_file_func; pzlib_filefunc_def->ztell_file = ftell_file_func; pzlib_filefunc_def->zseek_file = fseek_file_func; pzlib_filefunc_def->zclose_file = fclose_file_func; pzlib_filefunc_def->zerror_file = ferror_file_func; pzlib_filefunc_def->opaque = NULL; } golly-2.5-src/gui-ios/Golly/MiniZip/ioapi.h0000644000175100001440000000474712156145314015522 00000000000000/* ioapi.h -- IO base function header for compress/uncompress .zip files using zlib + zip or unzip API Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant */ #ifndef _ZLIBIOAPI_H #define _ZLIBIOAPI_H #define ZLIB_FILEFUNC_SEEK_CUR (1) #define ZLIB_FILEFUNC_SEEK_END (2) #define ZLIB_FILEFUNC_SEEK_SET (0) #define ZLIB_FILEFUNC_MODE_READ (1) #define ZLIB_FILEFUNC_MODE_WRITE (2) #define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) #define ZLIB_FILEFUNC_MODE_EXISTING (4) #define ZLIB_FILEFUNC_MODE_CREATE (8) #ifndef ZCALLBACK #if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) #define ZCALLBACK CALLBACK #else #define ZCALLBACK #endif #endif #ifdef __cplusplus extern "C" { #endif typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); typedef struct zlib_filefunc_def_s { open_file_func zopen_file; read_file_func zread_file; write_file_func zwrite_file; tell_file_func ztell_file; seek_file_func zseek_file; close_file_func zclose_file; testerror_file_func zerror_file; voidpf opaque; } zlib_filefunc_def; void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); #define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) #define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) #define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) #define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) #define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) #define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) #ifdef __cplusplus } #endif #endif golly-2.5-src/gui-ios/Golly/MiniZip/mztools.c0000644000175100001440000001747312156145314016123 00000000000000/* Additional tools for Minizip Code: Xavier Roche '2004 License: Same as ZLIB (www.gzip.org) */ /* Code */ #include #include #include #include "zlib.h" #include "unzip.h" #define READ_8(adr) ((unsigned char)*(adr)) #define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) #define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) #define WRITE_8(buff, n) do { \ *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ } while(0) #define WRITE_16(buff, n) do { \ WRITE_8((unsigned char*)(buff), n); \ WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ } while(0) #define WRITE_32(buff, n) do { \ WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ } while(0) extern int ZEXPORT unzRepair( const char* file, const char* fileOut, const char* fileOutTmp, uLong* nRecovered, uLong* bytesRecovered) { int err = Z_OK; FILE* fpZip = fopen(file, "rb"); FILE* fpOut = fopen(fileOut, "wb"); FILE* fpOutCD = fopen(fileOutTmp, "wb"); if (fpZip != NULL && fpOut != NULL) { int entries = 0; uLong totalBytes = 0; char header[30]; char filename[256]; char extra[1024]; int offset = 0; int offsetCD = 0; while ( fread(header, 1, 30, fpZip) == 30 ) { int currentOffset = offset; /* File entry */ if (READ_32(header) == 0x04034b50) { unsigned int version = READ_16(header + 4); unsigned int gpflag = READ_16(header + 6); unsigned int method = READ_16(header + 8); unsigned int filetime = READ_16(header + 10); unsigned int filedate = READ_16(header + 12); unsigned int crc = READ_32(header + 14); /* crc */ unsigned int cpsize = READ_32(header + 18); /* compressed size */ unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */ unsigned int fnsize = READ_16(header + 26); /* file name length */ unsigned int extsize = READ_16(header + 28); /* extra field length */ filename[0] = extra[0] = '\0'; /* Header */ if (fwrite(header, 1, 30, fpOut) == 30) { offset += 30; } else { err = Z_ERRNO; break; } /* Filename */ if (fnsize > 0) { if (fread(filename, 1, fnsize, fpZip) == fnsize) { if (fwrite(filename, 1, fnsize, fpOut) == fnsize) { offset += fnsize; } else { err = Z_ERRNO; break; } } else { err = Z_ERRNO; break; } } else { err = Z_STREAM_ERROR; break; } /* Extra field */ if (extsize > 0) { if (fread(extra, 1, extsize, fpZip) == extsize) { if (fwrite(extra, 1, extsize, fpOut) == extsize) { offset += extsize; } else { err = Z_ERRNO; break; } } else { err = Z_ERRNO; break; } } /* Data */ { int dataSize = cpsize; if (dataSize == 0) { dataSize = uncpsize; } if (dataSize > 0) { char* data = (char*) malloc(dataSize); if (data != NULL) { if ((int)fread(data, 1, dataSize, fpZip) == dataSize) { if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) { offset += dataSize; totalBytes += dataSize; } else { err = Z_ERRNO; } } else { err = Z_ERRNO; } free(data); if (err != Z_OK) { break; } } else { err = Z_MEM_ERROR; break; } } } /* Central directory entry */ { char header[46]; const char* comment = ""; // AKT added const int comsize = (int) strlen(comment); WRITE_32(header, 0x02014b50); WRITE_16(header + 4, version); WRITE_16(header + 6, version); WRITE_16(header + 8, gpflag); WRITE_16(header + 10, method); WRITE_16(header + 12, filetime); WRITE_16(header + 14, filedate); WRITE_32(header + 16, crc); WRITE_32(header + 20, cpsize); WRITE_32(header + 24, uncpsize); WRITE_16(header + 28, fnsize); WRITE_16(header + 30, extsize); WRITE_16(header + 32, comsize); WRITE_16(header + 34, 0); /* disk # */ WRITE_16(header + 36, 0); /* int attrb */ WRITE_32(header + 38, 0); /* ext attrb */ WRITE_32(header + 42, currentOffset); /* Header */ if (fwrite(header, 1, 46, fpOutCD) == 46) { offsetCD += 46; /* Filename */ if (fnsize > 0) { if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) { offsetCD += fnsize; } else { err = Z_ERRNO; break; } } else { err = Z_STREAM_ERROR; break; } /* Extra field */ if (extsize > 0) { if (fwrite(extra, 1, extsize, fpOutCD) == extsize) { offsetCD += extsize; } else { err = Z_ERRNO; break; } } /* Comment field */ if (comsize > 0) { if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) { offsetCD += comsize; } else { err = Z_ERRNO; break; } } } else { err = Z_ERRNO; break; } } /* Success */ entries++; } else { break; } } /* Final central directory */ { int entriesZip = entries; char header[22]; // AKT added const const char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools"; int comsize = (int) strlen(comment); if (entriesZip > 0xffff) { entriesZip = 0xffff; } WRITE_32(header, 0x06054b50); WRITE_16(header + 4, 0); /* disk # */ WRITE_16(header + 6, 0); /* disk # */ WRITE_16(header + 8, entriesZip); /* hack */ WRITE_16(header + 10, entriesZip); /* hack */ WRITE_32(header + 12, offsetCD); /* size of CD */ WRITE_32(header + 16, offset); /* offset to CD */ WRITE_16(header + 20, comsize); /* comment */ /* Header */ if (fwrite(header, 1, 22, fpOutCD) == 22) { /* Comment field */ if (comsize > 0) { if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) { err = Z_ERRNO; } } } else { err = Z_ERRNO; } } /* Final merge (file + central directory) */ fclose(fpOutCD); if (err == Z_OK) { fpOutCD = fopen(fileOutTmp, "rb"); if (fpOutCD != NULL) { int nRead; char buffer[8192]; while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) { if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) { err = Z_ERRNO; break; } } fclose(fpOutCD); } } /* Close */ fclose(fpZip); fclose(fpOut); /* Wipe temporary file */ (void)remove(fileOutTmp); /* Number of recovered entries */ if (err == Z_OK) { if (nRecovered != NULL) { *nRecovered = entries; } if (bytesRecovered != NULL) { *bytesRecovered = totalBytes; } } } else { err = Z_STREAM_ERROR; } return err; } golly-2.5-src/gui-ios/Golly/MiniZip/mztools.h0000644000175100001440000000125112156145314016113 00000000000000/* Additional tools for Minizip Code: Xavier Roche '2004 License: Same as ZLIB (www.gzip.org) */ #ifndef _zip_tools_H #define _zip_tools_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "zlib.h" #endif #include "unzip.h" /* Repair a ZIP file (missing central directory) file: file to recover fileOut: output file after recovery fileOutTmp: temporary file name used for recovery */ extern int ZEXPORT unzRepair(const char* file, const char* fileOut, const char* fileOutTmp, uLong* nRecovered, uLong* bytesRecovered); #endif golly-2.5-src/gui-ios/Golly/MiniZip/unzip.c0000644000175100001440000013553612156145314015562 00000000000000/* unzip.c -- IO for uncompress .zip files using zlib Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant Read unzip.h for more info */ /* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of compatibility with older software. The following is from the original crypt.c. Code woven in by Terry Thorsen 1/2003. */ /* Copyright (c) 1990-2000 Info-ZIP. All rights reserved. See the accompanying file LICENSE, version 2000-Apr-09 or later (the contents of which are also included in zip.h) for terms of use. If, for some reason, all these files are missing, the Info-ZIP license also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html */ /* crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] The encryption/decryption parts of this source code (as opposed to the non-echoing password parts) were originally written in Europe. The whole source package can be freely distributed, including from the USA. (Prior to January 2000, re-export from the US was a violation of US law.) */ /* This encryption code is a direct transcription of the algorithm from Roger Schlafly, described by Phil Katz in the file appnote.txt. This file (appnote.txt) is distributed with the PKZIP program (even in the version without encryption capabilities). */ #include #include #include #include "zlib.h" #include "unzip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #ifndef CASESENSITIVITYDEFAULT_NO # if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) # define CASESENSITIVITYDEFAULT_NO # endif #endif #ifndef UNZ_BUFSIZE #define UNZ_BUFSIZE (16384) #endif #ifndef UNZ_MAXFILENAMEINZIP #define UNZ_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) const char unz_copyright[] = " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; /* unz_file_info_interntal contain internal info about a file in zipfile*/ typedef struct unz_file_info_internal_s { uLong offset_curfile;/* relative offset of local header 4 bytes */ } unz_file_info_internal; /* file_in_zip_read_info_s contain internal information about a file in zipfile, when reading and decompress it */ typedef struct { char *read_buffer; /* internal buffer for compressed data */ z_stream stream; /* zLib stream structure for inflate */ uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ uLong stream_initialised; /* flag set if stream structure is initialised*/ uLong offset_local_extrafield;/* offset of the local extra field */ uInt size_local_extrafield;/* size of the local extra field */ uLong pos_local_extrafield; /* position in the local extra field in read*/ uLong crc32; /* crc32 of all data uncompressed */ uLong crc32_wait; /* crc32 we must obtain after decompress all */ uLong rest_read_compressed; /* number of byte to be decompressed */ uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ uLong compression_method; /* compression method (0==store) */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ int raw; } file_in_zip_read_info_s; /* unz_s contain internal information about the zipfile */ typedef struct { zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ unz_global_info gi; /* public global information */ uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ uLong num_file; /* number of the current file in the zipfile*/ uLong pos_in_central_dir; /* pos of the current file in the central dir*/ uLong current_file_ok; /* flag about the usability of the current file*/ uLong central_pos; /* position of the beginning of the central dir*/ uLong size_central_dir; /* size of the central directory */ uLong offset_central_dir; /* offset of start of central directory with respect to the starting disk number */ unz_file_info cur_file_info; /* public info about the current file in zip*/ unz_file_info_internal cur_file_info_internal; /* private info about it*/ file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current file if we are decompressing it */ int encrypted; # ifndef NOUNCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const unsigned long* pcrc_32_tab; # endif } unz_s; #ifndef NOUNCRYPT #include "crypt.h" #endif /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. IN assertion: the stream s has been sucessfully opened for reading. */ local int unzlocal_getByte OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi)); local int unzlocal_getByte( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi) { unsigned char c; int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); if (err==1) { *pi = (int)c; return UNZ_OK; } else { if (ZERROR(*pzlib_filefunc_def,filestream)) return UNZ_ERRNO; else return UNZ_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int unzlocal_getShort OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unzlocal_getShort ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i; int err; err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } local int unzlocal_getLong OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int unzlocal_getLong ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i; int err; err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<16; if (err==UNZ_OK) err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<24; if (err==UNZ_OK) *pX = x; else *pX = 0; return err; } /* My own strcmpi / strcasecmp */ local int strcmpcasenosensitive_internal ( const char* fileName1, const char* fileName2) { for (;;) { char c1=*(fileName1++); char c2=*(fileName2++); if ((c1>='a') && (c1<='z')) c1 -= 0x20; if ((c2>='a') && (c2<='z')) c2 -= 0x20; if (c1=='\0') return ((c2=='\0') ? 0 : -1); if (c2=='\0') return 1; if (c1c2) return 1; } } #ifdef CASESENSITIVITYDEFAULT_NO #define CASESENSITIVITYDEFAULTVALUE 2 #else #define CASESENSITIVITYDEFAULTVALUE 1 #endif #ifndef STRCMPCASENOSENTIVEFUNCTION #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal #endif /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern int ZEXPORT unzStringFileNameCompare ( const char* fileName1, const char* fileName2, int iCaseSensitivity) { if (iCaseSensitivity==0) iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; if (iCaseSensitivity==1) return strcmp(fileName1,fileName2); return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); } #ifndef BUFREADCOMMENT #define BUFREADCOMMENT (0x400) #endif /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local uLong unzlocal_SearchCentralDir OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream)); local uLong unzlocal_SearchCentralDir( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; uLong uSizeFile; uLong uBackRead; uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uPosFound=0; if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) return 0; uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) break; if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } /* Open a Zip file. path contain the full pathname (by example, on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer "zlib/zlib114.zip". If the zipfile cannot be opened (file doesn't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen2 ( const char *path, zlib_filefunc_def* pzlib_filefunc_def) { unz_s us; unz_s *s; uLong central_pos,uL; uLong number_disk; /* number of the current dist, used for spaning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spaning ZIP, unsupported, always 0*/ uLong number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ int err=UNZ_OK; if (unz_copyright[0]!=' ') return NULL; if (pzlib_filefunc_def==NULL) fill_fopen_filefunc(&us.z_filefunc); else us.z_filefunc = *pzlib_filefunc_def; us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, path, ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_EXISTING); if (us.filestream==NULL) return NULL; central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); if (central_pos==0) err=UNZ_ERRNO; if (ZSEEK(us.z_filefunc, us.filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* the signature, already checked */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) err=UNZ_ERRNO; /* number of this disk */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) err=UNZ_ERRNO; /* number of the disk with the start of the central directory */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir on this disk */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) err=UNZ_ERRNO; /* total number of entries in the central dir */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) err=UNZ_ERRNO; if ((number_entry_CD!=us.gi.number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=UNZ_BADZIPFILE; /* size of the central directory */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) err=UNZ_ERRNO; /* zipfile comment length */ if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) err=UNZ_ERRNO; if ((central_pospfile_in_zip_read!=NULL) unzCloseCurrentFile(file); ZCLOSE(s->z_filefunc, s->filestream); TRYFREE(s); return UNZ_OK; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo ( unzFile file, unz_global_info *pglobal_info) { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; *pglobal_info=s->gi; return UNZ_OK; } /* Translate date/time from Dos format to tm_unz (readable more easilty) */ local void unzlocal_DosDateToTmuDate ( uLong ulDosDate, tm_unz* ptm) { uLong uDate; uDate = (uLong)(ulDosDate>>16); ptm->tm_mday = (uInt)(uDate&0x1f) ; ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; } /* Get Info about the current file in the zipfile, with internal only info */ local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); local int unzlocal_GetCurrentFileInfoInternal ( unzFile file, unz_file_info *pfile_info, unz_file_info_internal *pfile_info_internal, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize) { unz_s* s; unz_file_info file_info; unz_file_info_internal file_info_internal; int err=UNZ_OK; uLong uMagic; long lSeek=0; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (ZSEEK(s->z_filefunc, s->filestream, s->pos_in_central_dir+s->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) err=UNZ_ERRNO; /* we check the magic */ if (err==UNZ_OK) if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x02014b50) err=UNZ_BADZIPFILE; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) err=UNZ_ERRNO; unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) err=UNZ_ERRNO; lSeek+=file_info.size_filename; if ((err==UNZ_OK) && (szFileName!=NULL)) { uLong uSizeRead ; if (file_info.size_filename0) && (fileNameBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek -= uSizeRead; } if ((err==UNZ_OK) && (extraField!=NULL)) { uLong uSizeRead ; if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek += file_info.size_file_extra - uSizeRead; } else lSeek+=file_info.size_file_extra; if ((err==UNZ_OK) && (szComment!=NULL)) { uLong uSizeRead ; if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) lSeek=0; else err=UNZ_ERRNO; if ((file_info.size_file_comment>0) && (commentBufferSize>0)) if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) err=UNZ_ERRNO; lSeek+=file_info.size_file_comment - uSizeRead; } else lSeek+=file_info.size_file_comment; if ((err==UNZ_OK) && (pfile_info!=NULL)) *pfile_info=file_info; if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) *pfile_info_internal=file_info_internal; return err; } /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetCurrentFileInfo ( unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize) { return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, szFileName,fileNameBufferSize, extraField,extraFieldBufferSize, szComment,commentBufferSize); } /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToFirstFile (unzFile file) { int err=UNZ_OK; unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir=s->offset_central_dir; s->num_file=0; err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzGoToNextFile (unzFile file) { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ if (s->num_file+1==s->gi.number_entry) return UNZ_END_OF_LIST_OF_FILE; s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; s->num_file++; err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzipStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ extern int ZEXPORT unzLocateFile ( unzFile file, const char *szFileName, int iCaseSensitivity) { unz_s* s; int err; /* We remember the 'current' position in the file so that we can jump * back there if we fail. */ unz_file_info cur_file_infoSaved; unz_file_info_internal cur_file_info_internalSaved; uLong num_fileSaved; uLong pos_in_central_dirSaved; if (file==NULL) return UNZ_PARAMERROR; if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; /* Save the current state */ num_fileSaved = s->num_file; pos_in_central_dirSaved = s->pos_in_central_dir; cur_file_infoSaved = s->cur_file_info; cur_file_info_internalSaved = s->cur_file_info_internal; err = unzGoToFirstFile(file); while (err == UNZ_OK) { char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; err = unzGetCurrentFileInfo(file,NULL, szCurrentFileName,sizeof(szCurrentFileName)-1, NULL,0,NULL,0); if (err == UNZ_OK) { if (unzStringFileNameCompare(szCurrentFileName, szFileName,iCaseSensitivity)==0) return UNZ_OK; err = unzGoToNextFile(file); } } /* We failed, so restore the state of the 'current file' to where we * were. */ s->num_file = num_fileSaved ; s->pos_in_central_dir = pos_in_central_dirSaved ; s->cur_file_info = cur_file_infoSaved; s->cur_file_info_internal = cur_file_info_internalSaved; return err; } /* /////////////////////////////////////////// // Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) // I need random access // // Further optimization could be realized by adding an ability // to cache the directory in memory. The goal being a single // comprehensive file read to put the file I need in a memory. */ /* typedef struct unz_file_pos_s { uLong pos_in_zip_directory; // offset in file uLong num_of_file; // # of file } unz_file_pos; */ extern int ZEXPORT unzGetFilePos( unzFile file, unz_file_pos* file_pos) { unz_s* s; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_END_OF_LIST_OF_FILE; file_pos->pos_in_zip_directory = s->pos_in_central_dir; file_pos->num_of_file = s->num_file; return UNZ_OK; } extern int ZEXPORT unzGoToFilePos( unzFile file, unz_file_pos* file_pos) { unz_s* s; int err; if (file==NULL || file_pos==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; /* jump to the right spot */ s->pos_in_central_dir = file_pos->pos_in_zip_directory; s->num_file = file_pos->num_of_file; /* set the current file */ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); /* return results */ s->current_file_ok = (err == UNZ_OK); return err; } /* // Unzip Helper Functions - should be here? /////////////////////////////////////////// */ /* Read the local header of the current zipfile Check the coherency of the local header and info in the end of central directory about this file store in *piSizeVar the size of extra info in local header (filename and size of extra field data) */ local int unzlocal_CheckCurrentFileCoherencyHeader ( unz_s* s, uInt* piSizeVar, uLong *poffset_local_extrafield, uInt *psize_local_extrafield) { uLong uMagic,uData,uFlags; uLong size_filename; uLong size_extra_field; int err=UNZ_OK; *piSizeVar = 0; *poffset_local_extrafield = 0; *psize_local_extrafield = 0; if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (err==UNZ_OK) if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) err=UNZ_ERRNO; else if (uMagic!=0x04034b50) err=UNZ_BADZIPFILE; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; /* else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) err=UNZ_BADZIPFILE; */ if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) err=UNZ_ERRNO; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) err=UNZ_BADZIPFILE; if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ err=UNZ_ERRNO; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ err=UNZ_ERRNO; else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0)) err=UNZ_BADZIPFILE; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) err=UNZ_ERRNO; else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) err=UNZ_BADZIPFILE; *piSizeVar += (uInt)size_filename; if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) err=UNZ_ERRNO; *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + size_filename; *psize_local_extrafield = (uInt)size_extra_field; *piSizeVar += (uInt)size_extra_field; return err; } /* Open for reading data the current file in the zipfile. If there is no error and the file is opened, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile3 ( unzFile file, int* method, int* level, int raw, const char* password) { int err=UNZ_OK; uInt iSizeVar; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uLong offset_local_extrafield; /* offset of the local extra field */ uInt size_local_extrafield; /* size of the local extra field */ # ifndef NOUNCRYPT char source[12]; # else if (password != NULL) return UNZ_PARAMERROR; # endif if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return UNZ_PARAMERROR; if (s->pfile_in_zip_read != NULL) unzCloseCurrentFile(file); if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) return UNZ_BADZIPFILE; pfile_in_zip_read_info = (file_in_zip_read_info_s*) ALLOC(sizeof(file_in_zip_read_info_s)); if (pfile_in_zip_read_info==NULL) return UNZ_INTERNALERROR; pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; pfile_in_zip_read_info->pos_local_extrafield=0; pfile_in_zip_read_info->raw=raw; if (pfile_in_zip_read_info->read_buffer==NULL) { TRYFREE(pfile_in_zip_read_info); return UNZ_INTERNALERROR; } pfile_in_zip_read_info->stream_initialised=0; if (method!=NULL) *method = (int)s->cur_file_info.compression_method; if (level!=NULL) { *level = 6; switch (s->cur_file_info.flag & 0x06) { case 6 : *level = 1; break; case 4 : *level = 2; break; case 2 : *level = 9; break; } } if ((s->cur_file_info.compression_method!=0) && (s->cur_file_info.compression_method!=Z_DEFLATED)) err=UNZ_BADZIPFILE; pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; pfile_in_zip_read_info->crc32=0; pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method; pfile_in_zip_read_info->filestream=s->filestream; pfile_in_zip_read_info->z_filefunc=s->z_filefunc; pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; pfile_in_zip_read_info->stream.total_out = 0; if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw)) { pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; pfile_in_zip_read_info->stream.zfree = (free_func)0; pfile_in_zip_read_info->stream.opaque = (voidpf)0; pfile_in_zip_read_info->stream.next_in = NULL; // AKT was (voidpf)0; pfile_in_zip_read_info->stream.avail_in = 0; err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); if (err == Z_OK) pfile_in_zip_read_info->stream_initialised=1; else { TRYFREE(pfile_in_zip_read_info); return err; } /* windowBits is passed < 0 to tell that there is no zlib header. * Note that in this case inflate *requires* an extra "dummy" byte * after the compressed stream in order to complete decompression and * return Z_STREAM_END. * In unzip, i don't wait absolutely Z_STREAM_END because I known the * size of both compressed and uncompressed data */ } pfile_in_zip_read_info->rest_read_compressed = s->cur_file_info.compressed_size ; pfile_in_zip_read_info->rest_read_uncompressed = s->cur_file_info.uncompressed_size ; pfile_in_zip_read_info->pos_in_zipfile = s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + iSizeVar; pfile_in_zip_read_info->stream.avail_in = (uInt)0; s->pfile_in_zip_read = pfile_in_zip_read_info; # ifndef NOUNCRYPT if (password != NULL) { int i; s->pcrc_32_tab = get_crc_table(); init_keys(password,s->keys,s->pcrc_32_tab); if (ZSEEK(s->z_filefunc, s->filestream, s->pfile_in_zip_read->pos_in_zipfile + s->pfile_in_zip_read->byte_before_the_zipfile, SEEK_SET)!=0) return UNZ_INTERNALERROR; if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) return UNZ_INTERNALERROR; for (i = 0; i<12; i++) zdecode(s->keys,s->pcrc_32_tab,source[i]); s->pfile_in_zip_read->pos_in_zipfile+=12; s->encrypted=1; } # endif return UNZ_OK; } extern int ZEXPORT unzOpenCurrentFile (unzFile file) { return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); } extern int ZEXPORT unzOpenCurrentFilePassword ( unzFile file, const char* password) { return unzOpenCurrentFile3(file, NULL, NULL, 0, password); } extern int ZEXPORT unzOpenCurrentFile2 ( unzFile file, int* method, int* level, int raw) { return unzOpenCurrentFile3(file, method, level, raw, NULL); } /* Read bytes from the current file. buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern int ZEXPORT unzReadCurrentFile ( unzFile file, voidp buf, unsigned len) { int err=UNZ_OK; uInt iRead = 0; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->read_buffer == NULL) return UNZ_END_OF_LIST_OF_FILE; if (len==0) return 0; pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; pfile_in_zip_read_info->stream.avail_out = (uInt)len; if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && (!(pfile_in_zip_read_info->raw))) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_uncompressed; if ((len>pfile_in_zip_read_info->rest_read_compressed+ pfile_in_zip_read_info->stream.avail_in) && (pfile_in_zip_read_info->raw)) pfile_in_zip_read_info->stream.avail_out = (uInt)pfile_in_zip_read_info->rest_read_compressed+ pfile_in_zip_read_info->stream.avail_in; while (pfile_in_zip_read_info->stream.avail_out>0) { if ((pfile_in_zip_read_info->stream.avail_in==0) && (pfile_in_zip_read_info->rest_read_compressed>0)) { uInt uReadThis = UNZ_BUFSIZE; if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; if (uReadThis == 0) return UNZ_EOF; if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->pos_in_zipfile + pfile_in_zip_read_info->byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->read_buffer, uReadThis)!=uReadThis) return UNZ_ERRNO; # ifndef NOUNCRYPT if(s->encrypted) { uInt i; for(i=0;iread_buffer[i] = zdecode(s->keys,s->pcrc_32_tab, pfile_in_zip_read_info->read_buffer[i]); } # endif pfile_in_zip_read_info->pos_in_zipfile += uReadThis; pfile_in_zip_read_info->rest_read_compressed-=uReadThis; pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->read_buffer; pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; } if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) { uInt uDoCopy,i ; if ((pfile_in_zip_read_info->stream.avail_in == 0) && (pfile_in_zip_read_info->rest_read_compressed == 0)) return (iRead==0) ? UNZ_EOF : iRead; if (pfile_in_zip_read_info->stream.avail_out < pfile_in_zip_read_info->stream.avail_in) uDoCopy = pfile_in_zip_read_info->stream.avail_out ; else uDoCopy = pfile_in_zip_read_info->stream.avail_in ; for (i=0;istream.next_out+i) = *(pfile_in_zip_read_info->stream.next_in+i); pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, pfile_in_zip_read_info->stream.next_out, uDoCopy); pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; pfile_in_zip_read_info->stream.avail_in -= uDoCopy; pfile_in_zip_read_info->stream.avail_out -= uDoCopy; pfile_in_zip_read_info->stream.next_out += uDoCopy; pfile_in_zip_read_info->stream.next_in += uDoCopy; pfile_in_zip_read_info->stream.total_out += uDoCopy; iRead += uDoCopy; } else { uLong uTotalOutBefore,uTotalOutAfter; const Bytef *bufBefore; uLong uOutThis; int flush=Z_SYNC_FLUSH; uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; bufBefore = pfile_in_zip_read_info->stream.next_out; /* if ((pfile_in_zip_read_info->rest_read_uncompressed == pfile_in_zip_read_info->stream.avail_out) && (pfile_in_zip_read_info->rest_read_compressed == 0)) flush = Z_FINISH; */ err=inflate(&pfile_in_zip_read_info->stream,flush); if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) err = Z_DATA_ERROR; uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; uOutThis = uTotalOutAfter-uTotalOutBefore; pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis)); pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis; iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); if (err==Z_STREAM_END) return (iRead==0) ? UNZ_EOF : iRead; if (err!=Z_OK) break; } } if (err==Z_OK) return iRead; return err; } /* Give the current position in uncompressed data */ extern z_off_t ZEXPORT unztell (unzFile file) { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; return (z_off_t)pfile_in_zip_read_info->stream.total_out; } /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzeof (unzFile file) { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if (pfile_in_zip_read_info->rest_read_uncompressed == 0) return 1; else return 0; } /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field that can be read if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ extern int ZEXPORT unzGetLocalExtrafield ( unzFile file, voidp buf, unsigned len) { unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; uInt read_now; uLong size_to_read; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; size_to_read = (pfile_in_zip_read_info->size_local_extrafield - pfile_in_zip_read_info->pos_local_extrafield); if (buf==NULL) return (int)size_to_read; if (len>size_to_read) read_now = (uInt)size_to_read; else read_now = (uInt)len ; if (read_now==0) return 0; if (ZSEEK(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, pfile_in_zip_read_info->offset_local_extrafield + pfile_in_zip_read_info->pos_local_extrafield, ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (ZREAD(pfile_in_zip_read_info->z_filefunc, pfile_in_zip_read_info->filestream, buf,read_now)!=read_now) return UNZ_ERRNO; return (int)read_now; } /* Close the file in zip opened with unzipOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzCloseCurrentFile (unzFile file) { int err=UNZ_OK; unz_s* s; file_in_zip_read_info_s* pfile_in_zip_read_info; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; pfile_in_zip_read_info=s->pfile_in_zip_read; if (pfile_in_zip_read_info==NULL) return UNZ_PARAMERROR; if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && (!pfile_in_zip_read_info->raw)) { if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) err=UNZ_CRCERROR; } TRYFREE(pfile_in_zip_read_info->read_buffer); pfile_in_zip_read_info->read_buffer = NULL; if (pfile_in_zip_read_info->stream_initialised) inflateEnd(&pfile_in_zip_read_info->stream); pfile_in_zip_read_info->stream_initialised = 0; TRYFREE(pfile_in_zip_read_info); s->pfile_in_zip_read=NULL; return err; } /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ extern int ZEXPORT unzGetGlobalComment ( unzFile file, char *szComment, uLong uSizeBuf) { //AKT int err=UNZ_OK; unz_s* s; uLong uReadThis ; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; uReadThis = uSizeBuf; if (uReadThis>s->gi.size_comment) uReadThis = s->gi.size_comment; if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) return UNZ_ERRNO; if (uReadThis>0) { *szComment='\0'; if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) return UNZ_ERRNO; } if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) *(szComment+s->gi.size_comment)='\0'; return (int)uReadThis; } /* Additions by RX '2004 */ extern uLong ZEXPORT unzGetOffset (unzFile file) { unz_s* s; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; if (!s->current_file_ok) return 0; if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) if (s->num_file==s->gi.number_entry) return 0; return s->pos_in_central_dir; } extern int ZEXPORT unzSetOffset ( unzFile file, uLong pos) { unz_s* s; int err; if (file==NULL) return UNZ_PARAMERROR; s=(unz_s*)file; s->pos_in_central_dir = pos; s->num_file = s->gi.number_entry; /* hack */ err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, &s->cur_file_info_internal, NULL,0,NULL,0,NULL,0); s->current_file_ok = (err == UNZ_OK); return err; } golly-2.5-src/gui-ios/Golly/MiniZip/unzip.h0000644000175100001440000003125012156145314015553 00000000000000/* unzip.h -- IO for uncompress .zip files using zlib Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Multi volume ZipFile (span) are not supported. Encryption compatible with pkzip 2.04g only supported Old compressions used by old PKZip 1.x are not supported I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* for more info about .ZIP format, see http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip http://www.info-zip.org/pub/infozip/doc/ PkWare has also a specification at : ftp://ftp.pkware.com/probdesc.zip */ #ifndef _unz_H #define _unz_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "zlib.h" #endif #ifndef _ZLIBIOAPI_H #include "ioapi.h" #endif #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagunzFile__ { int unused; } unzFile__; typedef unzFile__ *unzFile; #else typedef voidp unzFile; #endif #define UNZ_OK (0) #define UNZ_END_OF_LIST_OF_FILE (-100) #define UNZ_ERRNO (Z_ERRNO) #define UNZ_EOF (0) #define UNZ_PARAMERROR (-102) #define UNZ_BADZIPFILE (-103) #define UNZ_INTERNALERROR (-104) #define UNZ_CRCERROR (-105) /* tm_unz contain date/time info */ typedef struct tm_unz_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_unz; /* unz_global_info structure contain global data about the ZIPfile These data comes from the end of central dir */ typedef struct unz_global_info_s { uLong number_entry; /* total number of entries in the central dir on this disk */ uLong size_comment; /* size of the global comment of the zipfile */ } unz_global_info; /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_info_s { uLong version; /* version made by 2 bytes */ uLong version_needed; /* version needed to extract 2 bytes */ uLong flag; /* general purpose bit flag 2 bytes */ uLong compression_method; /* compression method 2 bytes */ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ uLong crc; /* crc-32 4 bytes */ uLong compressed_size; /* compressed size 4 bytes */ uLong uncompressed_size; /* uncompressed size 4 bytes */ uLong size_filename; /* filename length 2 bytes */ uLong size_file_extra; /* extra field length 2 bytes */ uLong size_file_comment; /* file comment length 2 bytes */ uLong disk_num_start; /* disk number start 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ tm_unz tmu_date; } unz_file_info; extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, const char* fileName2, int iCaseSensitivity)); /* Compare two filename (fileName1,fileName2). If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi or strcasecmp) If iCaseSenisivity = 0, case sensitivity is defaut of your operating system (like 1 on Unix, 2 on Windows) */ extern unzFile ZEXPORT unzOpen OF((const char *path)); /* Open a Zip file. path contain the full pathname (by example, on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". If the zipfile cannot be opened (file don't exist or in not valid), the return value is NULL. Else, the return value is a unzFile Handle, usable with other function of this unzip package. */ extern unzFile ZEXPORT unzOpen2 OF((const char *path, zlib_filefunc_def* pzlib_filefunc_def)); /* Open a Zip file, like unzOpen, but provide a set of file low level API for read/write the zip file (see ioapi.h) */ extern int ZEXPORT unzClose OF((unzFile file)); /* Close a ZipFile opened with unzipOpen. If there is files inside the .Zip opened with unzOpenCurrentFile (see later), these files MUST be closed with unzipCloseCurrentFile before call unzipClose. return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, unz_global_info *pglobal_info)); /* Write info about the ZipFile in the *pglobal_info structure. No preparation of the structure is needed return UNZ_OK if there is no problem. */ extern int ZEXPORT unzGetGlobalComment OF((unzFile file, char *szComment, uLong uSizeBuf)); /* Get the global comment string of the ZipFile, in the szComment buffer. uSizeBuf is the size of the szComment buffer. return the number of byte copied or an error code <0 */ /***************************************************************************/ /* Unzip package allow you browse the directory of the zipfile */ extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); /* Set the current file of the zipfile to the first file. return UNZ_OK if there is no problem */ extern int ZEXPORT unzGoToNextFile OF((unzFile file)); /* Set the current file of the zipfile to the next file. return UNZ_OK if there is no problem return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. */ extern int ZEXPORT unzLocateFile OF((unzFile file, const char *szFileName, int iCaseSensitivity)); /* Try locate the file szFileName in the zipfile. For the iCaseSensitivity signification, see unzStringFileNameCompare return value : UNZ_OK if the file is found. It becomes the current file. UNZ_END_OF_LIST_OF_FILE if the file is not found */ /* ****************************************** */ /* Ryan supplied functions */ /* unz_file_info contain information about a file in the zipfile */ typedef struct unz_file_pos_s { uLong pos_in_zip_directory; /* offset in zip file directory */ uLong num_of_file; /* # of file */ } unz_file_pos; extern int ZEXPORT unzGetFilePos( unzFile file, unz_file_pos* file_pos); extern int ZEXPORT unzGoToFilePos( unzFile file, unz_file_pos* file_pos); /* ****************************************** */ extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, unz_file_info *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)); /* Get Info about the current file if pfile_info!=NULL, the *pfile_info structure will contain somes info about the current file if szFileName!=NULL, the filemane string will be copied in szFileName (fileNameBufferSize is the size of the buffer) if extraField!=NULL, the extra field information will be copied in extraField (extraFieldBufferSize is the size of the buffer). This is the Central-header version of the extra field if szComment!=NULL, the comment string of the file will be copied in szComment (commentBufferSize is the size of the buffer) */ /***************************************************************************/ /* for reading the content of the current zipfile, you can open it, read data from it, and close it (you can close it before reading all the file) */ extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); /* Open for reading data the current file in the zipfile. If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, const char* password)); /* Open for reading data the current file in the zipfile. password is a crypting password If there is no error, the return value is UNZ_OK. */ extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, int* method, int* level, int raw)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, int* method, int* level, int raw, const char* password)); /* Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) if raw==1 *method will receive method of compression, *level will receive level of compression note : you can set level parameter as NULL (if you did not want known level, but you CANNOT set method parameter as NULL */ extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); /* Close the file in zip opened with unzOpenCurrentFile Return UNZ_CRCERROR if all the file was read but the CRC is not good */ extern int ZEXPORT unzReadCurrentFile OF((unzFile file, voidp buf, unsigned len)); /* Read bytes from the current file (opened by unzOpenCurrentFile) buf contain buffer where data must be copied len the size of buf. return the number of byte copied if somes bytes are copied return 0 if the end of file was reached return <0 with error code if there is an error (UNZ_ERRNO for IO error, or zLib error for uncompress error) */ extern z_off_t ZEXPORT unztell OF((unzFile file)); /* Give the current position in uncompressed data */ extern int ZEXPORT unzeof OF((unzFile file)); /* return 1 if the end of file was reached, 0 elsewhere */ extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, voidp buf, unsigned len)); /* Read extra field from the current file (opened by unzOpenCurrentFile) This is the local-header version of the extra field (sometimes, there is more info in the local-header version than in the central-header) if buf==NULL, it return the size of the local extra field if buf!=NULL, len is the size of the buffer, the extra header is copied in buf. the return value is the number of bytes copied in buf, or (if <0) the error code */ /***************************************************************************/ /* Get the current file offset */ extern uLong ZEXPORT unzGetOffset (unzFile file); /* Set the current file offset */ extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); #ifdef __cplusplus } #endif #endif /* _unz_H */ golly-2.5-src/gui-ios/Golly/MiniZip/zip.c0000644000175100001440000010647712156145314015221 00000000000000/* zip.c -- IO on .zip files using zlib Version 1.01e, February 12th, 2005 27 Dec 2004 Rolf Kalbermatter Modification to zipOpen2 to support globalComment retrieval. Copyright (C) 1998-2005 Gilles Vollant Read zip.h for more info */ #include #include #include #include #include "zlib.h" #include "zip.h" #ifdef STDC # include # include # include #endif #ifdef NO_ERRNO_H extern int errno; #else # include #endif #ifndef local # define local static #endif /* compile with -Dlocal if your debugger can't find static symbols */ #ifndef VERSIONMADEBY # define VERSIONMADEBY (0x0) /* platform depedent */ #endif #ifndef Z_BUFSIZE #define Z_BUFSIZE (16384) #endif #ifndef Z_MAXFILENAMEINZIP #define Z_MAXFILENAMEINZIP (256) #endif #ifndef ALLOC # define ALLOC(size) (malloc(size)) #endif #ifndef TRYFREE # define TRYFREE(p) {if (p) free(p);} #endif /* #define SIZECENTRALDIRITEM (0x2e) #define SIZEZIPLOCALHEADER (0x1e) */ /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ #ifndef SEEK_CUR #define SEEK_CUR 1 #endif #ifndef SEEK_END #define SEEK_END 2 #endif #ifndef SEEK_SET #define SEEK_SET 0 #endif #ifndef DEF_MEM_LEVEL #if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 #else # define DEF_MEM_LEVEL MAX_MEM_LEVEL #endif #endif const char zip_copyright[] = " zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; #define SIZEDATA_INDATABLOCK (4096-(4*4)) #define LOCALHEADERMAGIC (0x04034b50) #define CENTRALHEADERMAGIC (0x02014b50) #define ENDHEADERMAGIC (0x06054b50) #define FLAG_LOCALHEADER_OFFSET (0x06) #define CRC_LOCALHEADER_OFFSET (0x0e) #define SIZECENTRALHEADER (0x2e) /* 46 */ typedef struct linkedlist_datablock_internal_s { struct linkedlist_datablock_internal_s* next_datablock; uLong avail_in_this_block; uLong filled_in_this_block; uLong unused; /* for future use and alignement */ unsigned char data[SIZEDATA_INDATABLOCK]; } linkedlist_datablock_internal; typedef struct linkedlist_data_s { linkedlist_datablock_internal* first_block; linkedlist_datablock_internal* last_block; } linkedlist_data; typedef struct { z_stream stream; /* zLib stream structure for inflate */ int stream_initialised; /* 1 is stream is initialised */ uInt pos_in_buffered_data; /* last written byte in buffered_data */ uLong pos_local_header; /* offset of the local header of the file currenty writing */ char* central_header; /* central header data for the current file */ uLong size_centralheader; /* size of the central header for cur file */ uLong flag; /* flag of the file currently writing */ int method; /* compression method of file currenty wr.*/ int raw; /* 1 for directly writing raw data */ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/ uLong dosDate; uLong crc32; int encrypt; #ifndef NOCRYPT unsigned long keys[3]; /* keys defining the pseudo-random sequence */ const unsigned long* pcrc_32_tab; int crypt_header_size; #endif } curfile_info; typedef struct { zlib_filefunc_def z_filefunc; voidpf filestream; /* io structore of the zipfile */ linkedlist_data central_dir;/* datablock with central dir in construction*/ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/ curfile_info ci; /* info on the file curretly writing */ uLong begin_pos; /* position of the beginning of the zipfile */ uLong add_position_when_writting_offset; uLong number_entry; #ifndef NO_ADDFILEINEXISTINGZIP char *globalcomment; #endif } zip_internal; #ifndef NOCRYPT #define INCLUDECRYPTINGCODE_IFCRYPTALLOWED #include "crypt.h" #endif local linkedlist_datablock_internal* allocate_new_datablock() { linkedlist_datablock_internal* ldi; ldi = (linkedlist_datablock_internal*) ALLOC(sizeof(linkedlist_datablock_internal)); if (ldi!=NULL) { ldi->next_datablock = NULL ; ldi->filled_in_this_block = 0 ; ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ; } return ldi; } local void free_datablock(linkedlist_datablock_internal* ldi) { while (ldi!=NULL) { linkedlist_datablock_internal* ldinext = ldi->next_datablock; TRYFREE(ldi); ldi = ldinext; } } local void init_linkedlist(linkedlist_data* ll) { ll->first_block = ll->last_block = NULL; } local void free_linkedlist(linkedlist_data* ll) { free_datablock(ll->first_block); ll->first_block = ll->last_block = NULL; } local int add_data_in_datablock( linkedlist_data* ll, const void* buf, uLong len) { linkedlist_datablock_internal* ldi; const unsigned char* from_copy; if (ll==NULL) return ZIP_INTERNALERROR; if (ll->last_block == NULL) { ll->first_block = ll->last_block = allocate_new_datablock(); if (ll->first_block == NULL) return ZIP_INTERNALERROR; } ldi = ll->last_block; from_copy = (unsigned char*)buf; while (len>0) { uInt copy_this; uInt i; unsigned char* to_copy; if (ldi->avail_in_this_block==0) { ldi->next_datablock = allocate_new_datablock(); if (ldi->next_datablock == NULL) return ZIP_INTERNALERROR; ldi = ldi->next_datablock ; ll->last_block = ldi; } if (ldi->avail_in_this_block < len) copy_this = (uInt)ldi->avail_in_this_block; else copy_this = (uInt)len; to_copy = &(ldi->data[ldi->filled_in_this_block]); for (i=0;ifilled_in_this_block += copy_this; ldi->avail_in_this_block -= copy_this; from_copy += copy_this ; len -= copy_this; } return ZIP_OK; } /****************************************************************************/ #ifndef NO_ADDFILEINEXISTINGZIP /* =========================================================================== Inputs a long in LSB order to the given file nbByte == 1, 2 or 4 (byte, short or long) */ local int ziplocal_putValue OF((const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte)); local int ziplocal_putValue ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong x, int nbByte) { unsigned char buf[4]; int n; for (n = 0; n < nbByte; n++) { buf[n] = (unsigned char)(x & 0xff); x >>= 8; } if (x != 0) { /* data overflow - hack for ZIP64 (X Roche) */ for (n = 0; n < nbByte; n++) { buf[n] = 0xff; } } if (ZWRITE(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte) return ZIP_ERRNO; else return ZIP_OK; } local void ziplocal_putValue_inmemory OF((void* dest, uLong x, int nbByte)); local void ziplocal_putValue_inmemory ( void* dest, uLong x, int nbByte) { unsigned char* buf=(unsigned char*)dest; int n; for (n = 0; n < nbByte; n++) { buf[n] = (unsigned char)(x & 0xff); x >>= 8; } if (x != 0) { /* data overflow - hack for ZIP64 */ for (n = 0; n < nbByte; n++) { buf[n] = 0xff; } } } /****************************************************************************/ local uLong ziplocal_TmzDateToDosDate( const tm_zip* ptm, uLong dosDate) { uLong year = (uLong)ptm->tm_year; if (year>1980) year-=1980; else if (year>80) year-=80; return (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) | ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour)); } /****************************************************************************/ local int ziplocal_getByte OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi)); local int ziplocal_getByte( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, int *pi) { unsigned char c; int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); if (err==1) { *pi = (int)c; return ZIP_OK; } else { if (ZERROR(*pzlib_filefunc_def,filestream)) return ZIP_ERRNO; else return ZIP_EOF; } } /* =========================================================================== Reads a long in LSB order from the given gz_stream. Sets */ local int ziplocal_getShort OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int ziplocal_getShort ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i; int err; err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==ZIP_OK) err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==ZIP_OK) *pX = x; else *pX = 0; return err; } local int ziplocal_getLong OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX)); local int ziplocal_getLong ( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream, uLong *pX) { uLong x ; int i; int err; err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x = (uLong)i; if (err==ZIP_OK) err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<8; if (err==ZIP_OK) err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<16; if (err==ZIP_OK) err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i); x += ((uLong)i)<<24; if (err==ZIP_OK) *pX = x; else *pX = 0; return err; } #ifndef BUFREADCOMMENT #define BUFREADCOMMENT (0x400) #endif /* Locate the Central directory of a zipfile (at the end, just before the global comment) */ local uLong ziplocal_SearchCentralDir OF(( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream)); local uLong ziplocal_SearchCentralDir( const zlib_filefunc_def* pzlib_filefunc_def, voidpf filestream) { unsigned char* buf; uLong uSizeFile; uLong uBackRead; uLong uMaxBack=0xffff; /* maximum size of global comment */ uLong uPosFound=0; if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) return 0; uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); if (uMaxBack>uSizeFile) uMaxBack = uSizeFile; buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); if (buf==NULL) return 0; uBackRead = 4; while (uBackReaduMaxBack) uBackRead = uMaxBack; else uBackRead+=BUFREADCOMMENT; uReadPos = uSizeFile-uBackRead ; uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) break; if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) break; for (i=(int)uReadSize-3; (i--)>0;) if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) { uPosFound = uReadPos+i; break; } if (uPosFound!=0) break; } TRYFREE(buf); return uPosFound; } #endif /* !NO_ADDFILEINEXISTINGZIP*/ /************************************************************/ extern zipFile ZEXPORT zipOpen2 ( const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc_def) { zip_internal ziinit; zip_internal* zi; int err=ZIP_OK; if (pzlib_filefunc_def==NULL) fill_fopen_filefunc(&ziinit.z_filefunc); else ziinit.z_filefunc = *pzlib_filefunc_def; ziinit.filestream = (*(ziinit.z_filefunc.zopen_file)) (ziinit.z_filefunc.opaque, pathname, (append == APPEND_STATUS_CREATE) ? (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) : (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING)); if (ziinit.filestream == NULL) return NULL; ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream); ziinit.in_opened_file_inzip = 0; ziinit.ci.stream_initialised = 0; ziinit.number_entry = 0; ziinit.add_position_when_writting_offset = 0; init_linkedlist(&(ziinit.central_dir)); zi = (zip_internal*)ALLOC(sizeof(zip_internal)); if (zi==NULL) { ZCLOSE(ziinit.z_filefunc,ziinit.filestream); return NULL; } /* now we add file in a zipfile */ # ifndef NO_ADDFILEINEXISTINGZIP ziinit.globalcomment = NULL; if (append == APPEND_STATUS_ADDINZIP) { uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ uLong size_central_dir; /* size of the central directory */ uLong offset_central_dir; /* offset of start of central directory */ uLong central_pos,uL; uLong number_disk; /* number of the current dist, used for spaning ZIP, unsupported, always 0*/ uLong number_disk_with_CD; /* number the the disk with central dir, used for spaning ZIP, unsupported, always 0*/ uLong number_entry; uLong number_entry_CD; /* total number of entries in the central dir (same than number_entry on nospan) */ uLong size_comment; central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream); if (central_pos==0) err=ZIP_ERRNO; if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) err=ZIP_ERRNO; /* the signature, already checked */ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK) err=ZIP_ERRNO; /* number of this disk */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK) err=ZIP_ERRNO; /* number of the disk with the start of the central directory */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK) err=ZIP_ERRNO; /* total number of entries in the central dir on this disk */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK) err=ZIP_ERRNO; /* total number of entries in the central dir */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK) err=ZIP_ERRNO; if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0)) err=ZIP_BADZIPFILE; /* size of the central directory */ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK) err=ZIP_ERRNO; /* offset of start of central directory with respect to the starting disk number */ if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK) err=ZIP_ERRNO; /* zipfile global comment length */ if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK) err=ZIP_ERRNO; if ((central_pos0) { // AKT added (char*) ziinit.globalcomment = (char*) ALLOC(size_comment+1); if (ziinit.globalcomment) { size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment); ziinit.globalcomment[size_comment]=0; } } byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir); ziinit.add_position_when_writting_offset = byte_before_the_zipfile; { uLong size_central_dir_to_read = size_central_dir; size_t buf_size = SIZEDATA_INDATABLOCK; void* buf_read = (void*)ALLOC(buf_size); if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0) err=ZIP_ERRNO; while ((size_central_dir_to_read>0) && (err==ZIP_OK)) { uLong read_this = SIZEDATA_INDATABLOCK; if (read_this > size_central_dir_to_read) read_this = size_central_dir_to_read; if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this) err=ZIP_ERRNO; if (err==ZIP_OK) err = add_data_in_datablock(&ziinit.central_dir,buf_read, (uLong)read_this); size_central_dir_to_read-=read_this; } TRYFREE(buf_read); } ziinit.begin_pos = byte_before_the_zipfile; ziinit.number_entry = number_entry_CD; if (ZSEEK(ziinit.z_filefunc, ziinit.filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) err=ZIP_ERRNO; } if (globalcomment) { *globalcomment = ziinit.globalcomment; } # endif /* !NO_ADDFILEINEXISTINGZIP*/ if (err != ZIP_OK) { # ifndef NO_ADDFILEINEXISTINGZIP TRYFREE(ziinit.globalcomment); # endif /* !NO_ADDFILEINEXISTINGZIP*/ TRYFREE(zi); return NULL; } else { *zi = ziinit; return (zipFile)zi; } } extern zipFile ZEXPORT zipOpen ( const char *pathname, int append) { return zipOpen2(pathname,append,NULL,NULL); } extern int ZEXPORT zipOpenNewFileInZip3 ( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, int strategy, const char* password, uLong crcForCrypting) { zip_internal* zi; uInt size_filename; uInt size_comment; uInt i; int err = ZIP_OK; # ifdef NOCRYPT if (password != NULL) return ZIP_PARAMERROR; # endif if (file == NULL) return ZIP_PARAMERROR; if ((method!=0) && (method!=Z_DEFLATED)) return ZIP_PARAMERROR; zi = (zip_internal*)file; if (zi->in_opened_file_inzip == 1) { err = zipCloseFileInZip (file); if (err != ZIP_OK) return err; } if (filename==NULL) filename="-"; if (comment==NULL) size_comment = 0; else size_comment = (uInt)strlen(comment); size_filename = (uInt)strlen(filename); if (zipfi == NULL) zi->ci.dosDate = 0; else { if (zipfi->dosDate != 0) zi->ci.dosDate = zipfi->dosDate; else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate); } zi->ci.flag = 0; if ((level==8) || (level==9)) zi->ci.flag |= 2; if (level==2) zi->ci.flag |= 4; if (level==1) zi->ci.flag |= 6; if (password != NULL) zi->ci.flag |= 1; zi->ci.crc32 = 0; zi->ci.method = method; zi->ci.encrypt = 0; zi->ci.stream_initialised = 0; zi->ci.pos_in_buffered_data = 0; zi->ci.raw = raw; zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ; zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment; zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader); ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4); /* version info */ ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2); ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2); ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2); ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2); ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4); ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/ ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/ ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/ ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2); ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2); ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2); ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/ if (zipfi==NULL) ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2); else ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2); if (zipfi==NULL) ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4); else ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4); ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4); for (i=0;ici.central_header+SIZECENTRALHEADER+i) = *(filename+i); for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+i) = *(((const char*)extrafield_global)+i); for (i=0;ici.central_header+SIZECENTRALHEADER+size_filename+ size_extrafield_global+i) = *(comment+i); if (zi->ci.central_header == NULL) return ZIP_INTERNALERROR; /* write the local header */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */ if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */ if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */ if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */ if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2); if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2); if ((err==ZIP_OK) && (size_filename>0)) if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename) err = ZIP_ERRNO; if ((err==ZIP_OK) && (size_extrafield_local>0)) if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local) !=size_extrafield_local) err = ZIP_ERRNO; zi->ci.stream.avail_in = (uInt)0; zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; zi->ci.stream.next_out = zi->ci.buffered_data; zi->ci.stream.total_in = 0; zi->ci.stream.total_out = 0; if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) { zi->ci.stream.zalloc = (alloc_func)0; zi->ci.stream.zfree = (free_func)0; zi->ci.stream.opaque = (voidpf)0; if (windowBits>0) windowBits = -windowBits; err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy); if (err==Z_OK) zi->ci.stream_initialised = 1; } # ifndef NOCRYPT zi->ci.crypt_header_size = 0; if ((err==Z_OK) && (password != NULL)) { unsigned char bufHead[RAND_HEAD_LEN]; unsigned int sizeHead; zi->ci.encrypt = 1; zi->ci.pcrc_32_tab = get_crc_table(); /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/ sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting); zi->ci.crypt_header_size = sizeHead; if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead) err = ZIP_ERRNO; } # endif if (err==Z_OK) zi->in_opened_file_inzip = 1; return err; } extern int ZEXPORT zipOpenNewFileInZip2( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw) { return zipOpenNewFileInZip3 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global, comment, method, level, raw, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0); } extern int ZEXPORT zipOpenNewFileInZip ( zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level) { return zipOpenNewFileInZip2 (file, filename, zipfi, extrafield_local, size_extrafield_local, extrafield_global, size_extrafield_global, comment, method, level, 0); } local int zipFlushWriteBuffer(zip_internal* zi) { int err=ZIP_OK; if (zi->ci.encrypt != 0) { #ifndef NOCRYPT uInt i; int t; for (i=0;ici.pos_in_buffered_data;i++) zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t); #endif } if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) !=zi->ci.pos_in_buffered_data) err = ZIP_ERRNO; zi->ci.pos_in_buffered_data = 0; return err; } extern int ZEXPORT zipWriteInFileInZip ( zipFile file, const void* buf, unsigned len) { zip_internal* zi; int err=ZIP_OK; if (file == NULL) return ZIP_PARAMERROR; zi = (zip_internal*)file; if (zi->in_opened_file_inzip == 0) return ZIP_PARAMERROR; zi->ci.stream.next_in = (Bytef*)buf; // AKT was (void*)buf; zi->ci.stream.avail_in = len; zi->ci.crc32 = crc32(zi->ci.crc32, (Bytef*)buf, len); // AKT added (Bytef*) while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0)) { if (zi->ci.stream.avail_out == 0) { if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) err = ZIP_ERRNO; zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; zi->ci.stream.next_out = zi->ci.buffered_data; } if(err != ZIP_OK) break; if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) { uLong uTotalOutBefore = zi->ci.stream.total_out; err=deflate(&zi->ci.stream, Z_NO_FLUSH); zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; } else { uInt copy_this,i; if (zi->ci.stream.avail_in < zi->ci.stream.avail_out) copy_this = zi->ci.stream.avail_in; else copy_this = zi->ci.stream.avail_out; for (i=0;ici.stream.next_out)+i) = *(((const char*)zi->ci.stream.next_in)+i); { zi->ci.stream.avail_in -= copy_this; zi->ci.stream.avail_out-= copy_this; zi->ci.stream.next_in+= copy_this; zi->ci.stream.next_out+= copy_this; zi->ci.stream.total_in+= copy_this; zi->ci.stream.total_out+= copy_this; zi->ci.pos_in_buffered_data += copy_this; } } } return err; } extern int ZEXPORT zipCloseFileInZipRaw ( zipFile file, uLong uncompressed_size, uLong crc32) { zip_internal* zi; uLong compressed_size; int err=ZIP_OK; if (file == NULL) return ZIP_PARAMERROR; zi = (zip_internal*)file; if (zi->in_opened_file_inzip == 0) return ZIP_PARAMERROR; zi->ci.stream.avail_in = 0; if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) while (err==ZIP_OK) { uLong uTotalOutBefore; if (zi->ci.stream.avail_out == 0) { if (zipFlushWriteBuffer(zi) == ZIP_ERRNO) err = ZIP_ERRNO; zi->ci.stream.avail_out = (uInt)Z_BUFSIZE; zi->ci.stream.next_out = zi->ci.buffered_data; } uTotalOutBefore = zi->ci.stream.total_out; err=deflate(&zi->ci.stream, Z_FINISH); zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ; } if (err==Z_STREAM_END) err=ZIP_OK; /* this is normal */ if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK)) if (zipFlushWriteBuffer(zi)==ZIP_ERRNO) err = ZIP_ERRNO; if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw)) { err=deflateEnd(&zi->ci.stream); zi->ci.stream_initialised = 0; } if (!zi->ci.raw) { crc32 = (uLong)zi->ci.crc32; uncompressed_size = (uLong)zi->ci.stream.total_in; } compressed_size = (uLong)zi->ci.stream.total_out; # ifndef NOCRYPT compressed_size += zi->ci.crypt_header_size; # endif ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/ ziplocal_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/ if (zi->ci.stream.data_type == Z_ASCII) ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2); ziplocal_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/ if (err==ZIP_OK) err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header, (uLong)zi->ci.size_centralheader); free(zi->ci.central_header); if (err==ZIP_OK) { long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); if (ZSEEK(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0) err = ZIP_ERRNO; if (err==ZIP_OK) err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */ if (err==ZIP_OK) /* compressed size, unknown */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4); if (err==ZIP_OK) /* uncompressed size, unknown */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4); if (ZSEEK(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0) err = ZIP_ERRNO; } zi->number_entry ++; zi->in_opened_file_inzip = 0; return err; } extern int ZEXPORT zipCloseFileInZip (zipFile file) { return zipCloseFileInZipRaw (file,0,0); } extern int ZEXPORT zipClose ( zipFile file, const char* global_comment) { zip_internal* zi; int err = 0; uLong size_centraldir = 0; uLong centraldir_pos_inzip; uInt size_global_comment; if (file == NULL) return ZIP_PARAMERROR; zi = (zip_internal*)file; if (zi->in_opened_file_inzip == 1) { err = zipCloseFileInZip (file); } #ifndef NO_ADDFILEINEXISTINGZIP if (global_comment==NULL) global_comment = zi->globalcomment; #endif if (global_comment==NULL) size_global_comment = 0; else size_global_comment = (uInt)strlen(global_comment); centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream); if (err==ZIP_OK) { linkedlist_datablock_internal* ldi = zi->central_dir.first_block ; while (ldi!=NULL) { if ((err==ZIP_OK) && (ldi->filled_in_this_block>0)) if (ZWRITE(zi->z_filefunc,zi->filestream, ldi->data,ldi->filled_in_this_block) !=ldi->filled_in_this_block ) err = ZIP_ERRNO; size_centraldir += ldi->filled_in_this_block; ldi = ldi->next_datablock; } } free_datablock(zi->central_dir.first_block); if (err==ZIP_OK) /* Magic End */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4); if (err==ZIP_OK) /* number of this disk */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); if (err==ZIP_OK) /* number of the disk with the start of the central directory */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2); if (err==ZIP_OK) /* total number of entries in the central dir on this disk */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); if (err==ZIP_OK) /* total number of entries in the central dir */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2); if (err==ZIP_OK) /* size of the central directory */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4); if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4); if (err==ZIP_OK) /* zipfile comment length */ err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2); if ((err==ZIP_OK) && (size_global_comment>0)) if (ZWRITE(zi->z_filefunc,zi->filestream, global_comment,size_global_comment) != size_global_comment) err = ZIP_ERRNO; if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0) if (err == ZIP_OK) err = ZIP_ERRNO; #ifndef NO_ADDFILEINEXISTINGZIP TRYFREE(zi->globalcomment); #endif TRYFREE(zi); return err; } golly-2.5-src/gui-ios/Golly/MiniZip/zip.h0000644000175100001440000002121712156145314015212 00000000000000/* zip.h -- IO for compress .zip files using zlib Version 1.01e, February 12th, 2005 Copyright (C) 1998-2005 Gilles Vollant This unzip package allow creates .ZIP file, compatible with PKZip 2.04g WinZip, InfoZip tools and compatible. Multi volume ZipFile (span) are not supported. Encryption compatible with pkzip 2.04g only supported Old compressions used by old PKZip 1.x are not supported For uncompress .zip file, look at unzip.h I WAIT FEEDBACK at mail info@winimage.com Visit also http://www.winimage.com/zLibDll/unzip.html for evolution Condition of use and distribution are the same than zlib : This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. */ /* for more info about .ZIP format, see http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip http://www.info-zip.org/pub/infozip/doc/ PkWare has also a specification at : ftp://ftp.pkware.com/probdesc.zip */ #ifndef _zip_H #define _zip_H #ifdef __cplusplus extern "C" { #endif #ifndef _ZLIB_H #include "zlib.h" #endif #ifndef _ZLIBIOAPI_H #include "ioapi.h" #endif #if defined(STRICTZIP) || defined(STRICTZIPUNZIP) /* like the STRICT of WIN32, we define a pointer that cannot be converted from (void*) without cast */ typedef struct TagzipFile__ { int unused; } zipFile__; typedef zipFile__ *zipFile; #else typedef voidp zipFile; #endif #define ZIP_OK (0) #define ZIP_EOF (0) #define ZIP_ERRNO (Z_ERRNO) #define ZIP_PARAMERROR (-102) #define ZIP_BADZIPFILE (-103) #define ZIP_INTERNALERROR (-104) #ifndef DEF_MEM_LEVEL # if MAX_MEM_LEVEL >= 8 # define DEF_MEM_LEVEL 8 # else # define DEF_MEM_LEVEL MAX_MEM_LEVEL # endif #endif /* default memLevel */ /* tm_zip contain date/time info */ typedef struct tm_zip_s { uInt tm_sec; /* seconds after the minute - [0,59] */ uInt tm_min; /* minutes after the hour - [0,59] */ uInt tm_hour; /* hours since midnight - [0,23] */ uInt tm_mday; /* day of the month - [1,31] */ uInt tm_mon; /* months since January - [0,11] */ uInt tm_year; /* years - [1980..2044] */ } tm_zip; typedef struct { tm_zip tmz_date; /* date in understandable format */ uLong dosDate; /* if dos_date == 0, tmu_date is used */ /* uLong flag; */ /* general purpose bit flag 2 bytes */ uLong internal_fa; /* internal file attributes 2 bytes */ uLong external_fa; /* external file attributes 4 bytes */ } zip_fileinfo; typedef const char* zipcharpc; #define APPEND_STATUS_CREATE (0) #define APPEND_STATUS_CREATEAFTER (1) #define APPEND_STATUS_ADDINZIP (2) extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append)); /* Create a zipfile. pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on an Unix computer "zlib/zlib113.zip". if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip will be created at the end of the file. (useful if the file contain a self extractor code) if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will add files in existing zip (be sure you don't add file that doesn't exist) If the zipfile cannot be opened, the return value is NULL. Else, the return value is a zipFile Handle, usable with other function of this zip package. */ /* Note : there is no delete function into a zipfile. If you want delete file into a zipfile, you must open a zipfile, and create another Of couse, you can use RAW reading and writing to copy the file you did not want delte */ extern zipFile ZEXPORT zipOpen2 OF((const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc_def)); extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level)); /* Open a file in the ZIP for writing. filename : the filename in zip (if NULL, '-' without quote will be used *zipfi contain supplemental information if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local contains the extrafield data the the local header if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global contains the extrafield data the the local header if comment != NULL, comment contain the comment string method contain the compression method (0 for store, Z_DEFLATED for deflate) level contain the level of compression (can be Z_DEFAULT_COMPRESSION) */ extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw)); /* Same than zipOpenNewFileInZip, except if raw=1, we write raw file */ extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file, const char* filename, const zip_fileinfo* zipfi, const void* extrafield_local, uInt size_extrafield_local, const void* extrafield_global, uInt size_extrafield_global, const char* comment, int method, int level, int raw, int windowBits, int memLevel, int strategy, const char* password, uLong crcForCtypting)); /* Same than zipOpenNewFileInZip2, except windowBits,memLevel,,strategy : see parameter strategy in deflateInit2 password : crypting password (NULL for no crypting) crcForCtypting : crc of file to compress (needed for crypting) */ extern int ZEXPORT zipWriteInFileInZip OF((zipFile file, const void* buf, unsigned len)); /* Write data in the zipfile */ extern int ZEXPORT zipCloseFileInZip OF((zipFile file)); /* Close the current file in the zipfile */ extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file, uLong uncompressed_size, uLong crc32)); /* Close the current file in the zipfile, for fiel opened with parameter raw=1 in zipOpenNewFileInZip2 uncompressed_size and crc32 are value for the uncompressed size */ extern int ZEXPORT zipClose OF((zipFile file, const char* global_comment)); /* Close the zipfile */ #ifdef __cplusplus } #endif #endif /* _zip_H */ golly-2.5-src/gui-ios/Golly/Objective-Zip/0000755000175100001440000000000012156146016015407 500000000000000golly-2.5-src/gui-ios/Golly/Objective-Zip/FileInZipInfo.h0000644000175100001440000000470012156145314020146 00000000000000// // FileInZipInfo.h // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 27/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import #import "ZipFile.h" @interface FileInZipInfo : NSObject { @private NSUInteger _length; ZipCompressionLevel _level; BOOL _crypted; NSUInteger _size; NSDate *_date; NSUInteger _crc32; NSString *_name; } - (id) initWithName:(NSString *)name length:(NSUInteger)length level:(ZipCompressionLevel)level crypted:(BOOL)crypted size:(NSUInteger)size date:(NSDate *)date crc32:(NSUInteger)crc32; @property (nonatomic, readonly) NSString *name; @property (nonatomic, readonly) NSUInteger length; @property (nonatomic, readonly) ZipCompressionLevel level; @property (nonatomic, readonly) BOOL crypted; @property (nonatomic, readonly) NSUInteger size; @property (nonatomic, readonly) NSDate *date; @property (nonatomic, readonly) NSUInteger crc32; @end golly-2.5-src/gui-ios/Golly/Objective-Zip/FileInZipInfo.m0000644000175100001440000000455212156145314020160 00000000000000// // FileInZipInfo.m // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 27/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import "FileInZipInfo.h" @implementation FileInZipInfo - (id) initWithName:(NSString *)name length:(NSUInteger)length level:(ZipCompressionLevel)level crypted:(BOOL)crypted size:(NSUInteger)size date:(NSDate *)date crc32:(NSUInteger)crc32 { if (self= [super init]) { _name= [name retain]; _length= length; _level= level; _crypted= crypted; _size= size; _date= [date retain]; _crc32= crc32; } return self; } - (void) dealloc { [_date release]; [_name release]; [super dealloc]; } @synthesize name= _name; @synthesize length= _length; @synthesize level= _level; @synthesize crypted= _crypted; @synthesize size= _size; @synthesize date= _date; @synthesize crc32= _crc32; @end golly-2.5-src/gui-ios/Golly/Objective-Zip/ZipException.h0000644000175100001440000000367412156145314020133 00000000000000// // ZipException.h // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 25/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import @interface ZipException : NSException { @private NSInteger _error; } - (id) initWithReason:(NSString *)reason; - (id) initWithError:(NSInteger)error reason:(NSString *)reason; @property (nonatomic, readonly) NSInteger error; @end golly-2.5-src/gui-ios/Golly/Objective-Zip/ZipException.m0000644000175100001440000000413012156145314020124 00000000000000// // ZipException.m // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 25/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import "ZipException.h" @implementation ZipException - (id) initWithReason:(NSString *)reason { if (self= [super initWithName:@"ZipException" reason:reason userInfo:nil]) { _error= 0; } return self; } - (id) initWithError:(NSInteger)error reason:(NSString *)reason { if (self= [super initWithName:@"ZipException" reason:reason userInfo:nil]) { _error= error; } return self; } @synthesize error= _error; @end golly-2.5-src/gui-ios/Golly/Objective-Zip/ZipFile.h0000644000175100001440000000610312156145314017042 00000000000000// // ZipFile.h // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 25/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import #include "zip.h" #include "unzip.h" typedef enum { ZipFileModeUnzip, ZipFileModeCreate, ZipFileModeAppend } ZipFileMode; typedef enum { ZipCompressionLevelDefault= -1, ZipCompressionLevelNone= 0, ZipCompressionLevelFastest= 1, ZipCompressionLevelBest= 9 } ZipCompressionLevel; @class ZipReadStream; @class ZipWriteStream; @class FileInZipInfo; @interface ZipFile : NSObject { NSString *_fileName; ZipFileMode _mode; @private zipFile _zipFile; unzFile _unzFile; } - (id) initWithFileName:(NSString *)fileName mode:(ZipFileMode)mode; - (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip compressionLevel:(ZipCompressionLevel)compressionLevel; - (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(ZipCompressionLevel)compressionLevel; - (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(ZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(NSUInteger)crc32; - (NSUInteger) numFilesInZip; - (NSArray *) listFileInZipInfos; - (void) goToFirstFileInZip; - (BOOL) goToNextFileInZip; - (BOOL) locateFileInZip:(NSString *)fileNameInZip; - (FileInZipInfo *) getCurrentFileInZipInfo; - (ZipReadStream *) readCurrentFileInZip; - (ZipReadStream *) readCurrentFileInZipWithPassword:(NSString *)password; - (void) close; @end golly-2.5-src/gui-ios/Golly/Objective-Zip/ZipFile.m0000644000175100001440000003704312156145314017056 00000000000000// // ZipFile.m // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 25/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import "ZipFile.h" #import "ZipException.h" #import "ZipReadStream.h" #import "ZipWriteStream.h" #import "FIleInZipInfo.h" #define FILE_IN_ZIP_MAX_NAME_LENGTH (256) @implementation ZipFile - (id) initWithFileName:(NSString *)fileName mode:(ZipFileMode)mode { if (self= [super init]) { _fileName= [fileName retain]; _mode= mode; switch (mode) { case ZipFileModeUnzip: _unzFile= unzOpen([_fileName cStringUsingEncoding:NSUTF8StringEncoding]); if (_unzFile == NULL) { NSString *reason= [NSString stringWithFormat:@"Can't open '%@'", _fileName]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } break; case ZipFileModeCreate: _zipFile= zipOpen([_fileName cStringUsingEncoding:NSUTF8StringEncoding], APPEND_STATUS_CREATE); if (_zipFile == NULL) { NSString *reason= [NSString stringWithFormat:@"Can't open '%@'", _fileName]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } break; case ZipFileModeAppend: _zipFile= zipOpen([_fileName cStringUsingEncoding:NSUTF8StringEncoding], APPEND_STATUS_ADDINZIP); if (_zipFile == NULL) { NSString *reason= [NSString stringWithFormat:@"Can't open '%@'", _fileName]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } break; default: { NSString *reason= [NSString stringWithFormat:@"Unknown mode %d", _mode]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } } } return self; } - (void) dealloc { [_fileName release]; [super dealloc]; } - (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip compressionLevel:(ZipCompressionLevel)compressionLevel { if (_mode == ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted with Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } NSDate *now= [NSDate date]; NSCalendar *calendar= [NSCalendar currentCalendar]; NSDateComponents *date= [calendar components:(NSSecondCalendarUnit | NSMinuteCalendarUnit | NSHourCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:now]; zip_fileinfo zi; zi.tmz_date.tm_sec= [date second]; zi.tmz_date.tm_min= [date minute]; zi.tmz_date.tm_hour= [date hour]; zi.tmz_date.tm_mday= [date day]; zi.tmz_date.tm_mon= [date month] -1; zi.tmz_date.tm_year= [date year]; zi.internal_fa= 0; zi.external_fa= 0; zi.dosDate= 0; int err= zipOpenNewFileInZip3( _zipFile, [fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding], &zi, NULL, 0, NULL, 0, NULL, (compressionLevel != ZipCompressionLevelNone) ? Z_DEFLATED : 0, compressionLevel, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0); if (err != ZIP_OK) { NSString *reason= [NSString stringWithFormat:@"Error in opening '%@' in zipfile", fileNameInZip]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } return [[[ZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip] autorelease]; } - (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(ZipCompressionLevel)compressionLevel { if (_mode == ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted with Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } NSCalendar *calendar= [NSCalendar currentCalendar]; NSDateComponents *date= [calendar components:(NSSecondCalendarUnit | NSMinuteCalendarUnit | NSHourCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:fileDate]; zip_fileinfo zi; zi.tmz_date.tm_sec= [date second]; zi.tmz_date.tm_min= [date minute]; zi.tmz_date.tm_hour= [date hour]; zi.tmz_date.tm_mday= [date day]; zi.tmz_date.tm_mon= [date month] -1; zi.tmz_date.tm_year= [date year]; zi.internal_fa= 0; zi.external_fa= 0; zi.dosDate= 0; int err= zipOpenNewFileInZip3( _zipFile, [fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding], &zi, NULL, 0, NULL, 0, NULL, (compressionLevel != ZipCompressionLevelNone) ? Z_DEFLATED : 0, compressionLevel, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, NULL, 0); if (err != ZIP_OK) { NSString *reason= [NSString stringWithFormat:@"Error in opening '%@' in zipfile", fileNameInZip]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } return [[[ZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip] autorelease]; } - (ZipWriteStream *) writeFileInZipWithName:(NSString *)fileNameInZip fileDate:(NSDate *)fileDate compressionLevel:(ZipCompressionLevel)compressionLevel password:(NSString *)password crc32:(NSUInteger)crc32 { if (_mode == ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted with Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } NSCalendar *calendar= [NSCalendar currentCalendar]; NSDateComponents *date= [calendar components:(NSSecondCalendarUnit | NSMinuteCalendarUnit | NSHourCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:fileDate]; zip_fileinfo zi; zi.tmz_date.tm_sec= [date second]; zi.tmz_date.tm_min= [date minute]; zi.tmz_date.tm_hour= [date hour]; zi.tmz_date.tm_mday= [date day]; zi.tmz_date.tm_mon= [date month] -1; zi.tmz_date.tm_year= [date year]; zi.internal_fa= 0; zi.external_fa= 0; zi.dosDate= 0; int err= zipOpenNewFileInZip3( _zipFile, [fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding], &zi, NULL, 0, NULL, 0, NULL, (compressionLevel != ZipCompressionLevelNone) ? Z_DEFLATED : 0, compressionLevel, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, [password cStringUsingEncoding:NSUTF8StringEncoding], crc32); if (err != ZIP_OK) { NSString *reason= [NSString stringWithFormat:@"Error in opening '%@' in zipfile", fileNameInZip]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } return [[[ZipWriteStream alloc] initWithZipFileStruct:_zipFile fileNameInZip:fileNameInZip] autorelease]; } - (NSUInteger) numFilesInZip { if (_mode != ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } unz_global_info gi; int err= unzGetGlobalInfo(_unzFile, &gi); if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in getting global info in '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } return gi.number_entry; } - (NSArray *) listFileInZipInfos { int num= [self numFilesInZip]; if (num < 1) return [[[NSArray alloc] init] autorelease]; NSMutableArray *files= [[[NSMutableArray alloc] initWithCapacity:num] autorelease]; [self goToFirstFileInZip]; for (int i= 0; i < num; i++) { FileInZipInfo *info= [self getCurrentFileInZipInfo]; [files addObject:info]; if ((i +1) < num) [self goToNextFileInZip]; } return files; } - (void) goToFirstFileInZip { if (_mode != ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } int err= unzGoToFirstFile(_unzFile); if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in going to first file in zip in '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } } - (BOOL) goToNextFileInZip { if (_mode != ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } int err= unzGoToNextFile(_unzFile); if (err == UNZ_END_OF_LIST_OF_FILE) return NO; if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in going to next file in zip in '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } return YES; } - (BOOL) locateFileInZip:(NSString *)fileNameInZip { if (_mode != ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } int err= unzLocateFile(_unzFile, [fileNameInZip cStringUsingEncoding:NSUTF8StringEncoding], 1); if (err == UNZ_END_OF_LIST_OF_FILE) return NO; if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in going to next file in zip in '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } return YES; } - (FileInZipInfo *) getCurrentFileInZipInfo { if (_mode != ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } char filename_inzip[FILE_IN_ZIP_MAX_NAME_LENGTH]; unz_file_info file_info; int err= unzGetCurrentFileInfo(_unzFile, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0); if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in getting current file info in '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } NSString *name= [NSString stringWithCString:filename_inzip encoding:NSUTF8StringEncoding]; ZipCompressionLevel level= ZipCompressionLevelNone; if (file_info.compression_method != 0) { switch ((file_info.flag & 0x6) / 2) { case 0: level= ZipCompressionLevelDefault; break; case 1: level= ZipCompressionLevelBest; break; default: level= ZipCompressionLevelFastest; break; } } BOOL crypted= ((file_info.flag & 1) != 0); NSDateComponents *components= [[[NSDateComponents alloc] init] autorelease]; [components setDay:file_info.tmu_date.tm_mday]; [components setMonth:file_info.tmu_date.tm_mon +1]; [components setYear:file_info.tmu_date.tm_year]; [components setHour:file_info.tmu_date.tm_hour]; [components setMinute:file_info.tmu_date.tm_min]; [components setSecond:file_info.tmu_date.tm_sec]; NSCalendar *calendar= [NSCalendar currentCalendar]; NSDate *date= [calendar dateFromComponents:components]; FileInZipInfo *info= [[FileInZipInfo alloc] initWithName:name length:file_info.uncompressed_size level:level crypted:crypted size:file_info.compressed_size date:date crc32:file_info.crc]; return [info autorelease]; } - (ZipReadStream *) readCurrentFileInZip { if (_mode != ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } char filename_inzip[FILE_IN_ZIP_MAX_NAME_LENGTH]; unz_file_info file_info; int err= unzGetCurrentFileInfo(_unzFile, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0); if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in getting current file info in '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } NSString *fileNameInZip= [NSString stringWithCString:filename_inzip encoding:NSUTF8StringEncoding]; err= unzOpenCurrentFilePassword(_unzFile, NULL); if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in opening current file in '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } return [[[ZipReadStream alloc] initWithUnzFileStruct:_unzFile fileNameInZip:fileNameInZip] autorelease]; } - (ZipReadStream *) readCurrentFileInZipWithPassword:(NSString *)password { if (_mode != ZipFileModeUnzip) { NSString *reason= [NSString stringWithFormat:@"Operation not permitted without Unzip mode"]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } char filename_inzip[FILE_IN_ZIP_MAX_NAME_LENGTH]; unz_file_info file_info; int err= unzGetCurrentFileInfo(_unzFile, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0); if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in getting current file info in '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } NSString *fileNameInZip= [NSString stringWithCString:filename_inzip encoding:NSUTF8StringEncoding]; err= unzOpenCurrentFilePassword(_unzFile, [password cStringUsingEncoding:NSUTF8StringEncoding]); if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in opening current file in '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } return [[[ZipReadStream alloc] initWithUnzFileStruct:_unzFile fileNameInZip:fileNameInZip] autorelease]; } - (void) close { switch (_mode) { case ZipFileModeUnzip: { int err= unzClose(_unzFile); if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in closing '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } break; } case ZipFileModeCreate: { int err= zipClose(_zipFile, NULL); if (err != ZIP_OK) { NSString *reason= [NSString stringWithFormat:@"Error in closing '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } break; } case ZipFileModeAppend: { int err= zipClose(_zipFile, NULL); if (err != ZIP_OK) { NSString *reason= [NSString stringWithFormat:@"Error in closing '%@'", _fileName]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } break; } default: { NSString *reason= [NSString stringWithFormat:@"Unknown mode %d", _mode]; @throw [[[ZipException alloc] initWithReason:reason] autorelease]; } } } @end golly-2.5-src/gui-ios/Golly/Objective-Zip/ZipReadStream.h0000644000175100001440000000377112156145314020222 00000000000000// // ZipReadStream.h // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 28/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import #include "unzip.h" @interface ZipReadStream : NSObject { NSString *_fileNameInZip; @private unzFile _unzFile; } - (id) initWithUnzFileStruct:(unzFile)unzFile fileNameInZip:(NSString *)fileNameInZip; - (NSUInteger) readDataWithBuffer:(NSMutableData *)buffer; - (void) finishedReading; @end golly-2.5-src/gui-ios/Golly/Objective-Zip/ZipReadStream.m0000644000175100001440000000513312156145314020221 00000000000000// // ZipReadStream.m // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 28/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import "ZipReadStream.h" #import "ZipException.h" #include "unzip.h" @implementation ZipReadStream - (id) initWithUnzFileStruct:(unzFile)unzFile fileNameInZip:(NSString *)fileNameInZip { if (self= [super init]) { _unzFile= unzFile; _fileNameInZip= fileNameInZip; } return self; } - (NSUInteger) readDataWithBuffer:(NSMutableData *)buffer { int err= unzReadCurrentFile(_unzFile, [buffer mutableBytes], [buffer length]); if (err < 0) { NSString *reason= [NSString stringWithFormat:@"Error in reading '%@' in the zipfile", _fileNameInZip]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } return err; } - (void) finishedReading { int err= unzCloseCurrentFile(_unzFile); if (err != UNZ_OK) { NSString *reason= [NSString stringWithFormat:@"Error in closing '%@' in the zipfile", _fileNameInZip]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } } @end golly-2.5-src/gui-ios/Golly/Objective-Zip/ZipWriteStream.h0000644000175100001440000000374012156145314020435 00000000000000// // ZipWriteStream.h // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 25/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import #include "zip.h" @interface ZipWriteStream : NSObject { NSString *_fileNameInZip; @private zipFile _zipFile; } - (id) initWithZipFileStruct:(zipFile)zipFile fileNameInZip:(NSString *)fileNameInZip; - (void) writeData:(NSData *)data; - (void) finishedWriting; @end golly-2.5-src/gui-ios/Golly/Objective-Zip/ZipWriteStream.m0000644000175100001440000000505112156145314020437 00000000000000// // ZipWriteStream.m // Objective-Zip v. 0.7.2 // // Created by Gianluca Bertani on 25/12/09. // Copyright 2009-10 Flying Dolphin Studio. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of Gianluca Bertani nor the names of its contributors // may be used to endorse or promote products derived from this software // without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. // #import "ZipWriteStream.h" #import "ZipException.h" #include "zip.h" @implementation ZipWriteStream - (id) initWithZipFileStruct:(zipFile)zipFile fileNameInZip:(NSString *)fileNameInZip { if (self= [super init]) { _zipFile= zipFile; _fileNameInZip= fileNameInZip; } return self; } - (void) writeData:(NSData *)data { int err= zipWriteInFileInZip(_zipFile, [data bytes], [data length]); if (err < 0) { NSString *reason= [NSString stringWithFormat:@"Error in writing '%@' in the zipfile", _fileNameInZip]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } } - (void) finishedWriting { int err= zipCloseFileInZip(_zipFile); if (err != ZIP_OK) { NSString *reason= [NSString stringWithFormat:@"Error in closing '%@' in the zipfile", _fileNameInZip]; @throw [[[ZipException alloc] initWithError:err reason:reason] autorelease]; } } @end golly-2.5-src/gui-ios/Golly/algos.h0000644000175100001440000001200712156145314014133 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _ALGOS_H_ #define _ALGOS_H_ #include "lifealgo.h" #include "utils.h" // for gColor // Golly supports multiple algorithms. The first algorithm // registered must *always* be qlifealgo. The second must // *always* be hlifealgo. The order of the rest does not matter. enum { QLIFE_ALGO, // QuickLife HLIFE_ALGO // HashLife }; const int MAX_ALGOS = 50; // maximum number of algorithms typedef int algo_type; // 0..MAX_ALGOS-1 // A class for all the static info we need about a particular algorithm: class AlgoData : public staticAlgoInfo { public: AlgoData(); virtual void setDefaultBaseStep(int v) { defbase = v; } // all hashing algos use maxhashmem and QuickLife uses 0 (unlimited) // virtual void setDefaultMaxMem(int v) { } static AlgoData& tick(); // static allocator // additional data bool canhash; // algo uses hashing? int defbase; // default base step gColor statusrgb; // status bar color CGImageRef* icons7x7; // icon bitmaps for scale 1:8 CGImageRef* icons15x15; // icon bitmaps for scale 1:16 CGImageRef* icons31x31; // icon bitmaps for scale 1:32 // default color scheme bool gradient; // use color gradient? gColor fromrgb; // color at start of gradient gColor torgb; // color at end of gradient // if gradient is false then use these colors for each cell state unsigned char algor[256]; unsigned char algog[256]; unsigned char algob[256]; }; extern AlgoData* algoinfo[MAX_ALGOS]; // static info for each algorithm extern algo_type initalgo; // initial algorithm // the following bitmaps are grayscale icons that can be used with any rules // with any number of states extern CGImageRef* circles7x7; // circular icons for scale 1:8 extern CGImageRef* circles15x15; // circular icons for scale 1:16 extern CGImageRef* circles31x31; // circular icons for scale 1:32 extern CGImageRef* diamonds7x7; // diamond icons for scale 1:8 extern CGImageRef* diamonds15x15; // diamond icons for scale 1:16 extern CGImageRef* diamonds31x31; // diamond icons for scale 1:32 extern CGImageRef* hexagons7x7; // hexagonal icons for scale 1:8 extern CGImageRef* hexagons15x15; // hexagonal icons for scale 1:16 extern CGImageRef* hexagons31x31; // hexagonal icons for scale 1:32 // NOTE: the triangular icons are only suitable for a 4-state rule that // is emulating a triangular neighborhood with 2 triangles per cell extern CGImageRef* triangles7x7; // triangular icons for scale 1:8 extern CGImageRef* triangles15x15; // triangular icons for scale 1:16 extern CGImageRef* triangles31x31; // triangular icons for scale 1:32 void InitAlgorithms(); // Initialize above data. Must be called before reading the prefs file. lifealgo* CreateNewUniverse(algo_type algotype, bool allowcheck = true); // Create a new universe of given type. If allowcheck is true then // event checking is allowed. const char* GetAlgoName(algo_type algotype); // Return name of given algorithm. This name appears in various places // and is also stored in the prefs file. int NumAlgos(); // Return current number of algorithms. CGImageRef ConvertOldMonochromeIcons(CGImageRef oldimage); // If given image uses <= 2 colors then return new black-and-white image // for compatibility with monochrome .icons files in Golly 2.4 and older. bool MultiColorImage(CGImageRef image); // Return true if image contains at least one color that isn't a shade of gray. bool LoadIconFile(const std::string& path, int maxstate, CGImageRef** out7x7, CGImageRef** out15x15, CGImageRef** out31x31); // Return true if we can successfully load icon bitmaps from given file. CGImageRef* CreateIconBitmaps(const char** xpmdata, int maxstates); // Create icon bitmaps using the given XPM data. CGImageRef* ScaleIconBitmaps(CGImageRef* srcicons, int size); // Return icon bitmaps scaled to given size. #endif golly-2.5-src/gui-ios/Golly/algos.m0000644000175100001440000011001112156145314014132 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "jvnalgo.h" #include "generationsalgo.h" #include "ruleloaderalgo.h" #include "utils.h" // for Fatal, Warning, SetColor, Poller #include "prefs.h" // for maxhashmem #include "layer.h" // for currlayer #include "algos.h" #include // for std::map // ----------------------------------------------------------------------------- // exported data: algo_type initalgo = QLIFE_ALGO; // initial algorithm AlgoData* algoinfo[MAX_ALGOS]; // static info for each algorithm CGImageRef* circles7x7; // circular icons for scale 1:8 CGImageRef* circles15x15; // circular icons for scale 1:16 CGImageRef* circles31x31; // circular icons for scale 1:32 CGImageRef* diamonds7x7; // diamond-shaped icons for scale 1:8 CGImageRef* diamonds15x15; // diamond-shaped icons for scale 1:16 CGImageRef* diamonds31x31; // diamond-shaped icons for scale 1:32 CGImageRef* hexagons7x7; // hexagonal icons for scale 1:8 CGImageRef* hexagons15x15; // hexagonal icons for scale 1:16 CGImageRef* hexagons31x31; // hexagonal icons for scale 1:32 CGImageRef* triangles7x7; // triangular icons for scale 1:8 CGImageRef* triangles15x15; // triangular icons for scale 1:16 CGImageRef* triangles31x31; // triangular icons for scale 1:32 // ----------------------------------------------------------------------------- // These default cell colors were generated by continuously finding the // color furthest in rgb space from the closest of the already selected // colors, black, and white. static unsigned char default_colors[] = { 48,48,48, // better if state 0 is dark gray (was 255,127,0) 0,255,127,127,0,255,148,148,148,128,255,0,255,0,128, 0,128,255,1,159,0,159,0,1,255,254,96,0,1,159,96,255,254, 254,96,255,126,125,21,21,126,125,125,21,126,255,116,116,116,255,116, 116,116,255,228,227,0,28,255,27,255,27,28,0,228,227,227,0,228, 27,28,255,59,59,59,234,195,176,175,196,255,171,194,68,194,68,171, 68,171,194,72,184,71,184,71,72,71,72,184,169,255,188,252,179,63, 63,252,179,179,63,252,80,9,0,0,80,9,9,0,80,255,175,250, 199,134,213,115,100,95,188,163,0,0,188,163,163,0,188,203,73,0, 0,203,73,73,0,203,94,189,0,189,0,94,0,94,189,187,243,119, 55,125,32,125,32,55,32,55,125,255,102,185,102,185,255,120,209,168, 208,166,119,135,96,192,182,255,41,83,153,130,247,88,55,89,247,55, 88,55,247,87,75,0,0,87,75,75,0,87,200,135,59,51,213,127, 255,255,162,255,37,182,37,182,255,228,57,117,142,163,210,57,117,228, 193,255,246,188,107,123,123,194,107,145,59,5,5,145,59,59,5,145, 119,39,198,40,197,23,197,23,40,23,40,197,178,199,158,255,201,121, 134,223,223,39,253,84,149,203,15,203,15,149,15,149,203,152,144,90, 143,75,139,71,97,132,224,65,219,65,219,224,255,255,40,218,223,69, 74,241,0,241,0,74,0,74,241,122,171,51,220,211,227,61,127,87, 90,124,176,36,39,13,165,142,255,255,38,255,38,255,255,83,50,107, 224,142,165,255,181,9,9,255,181,181,9,255,140,238,70,255,74,5, 74,5,255,138,84,51,31,172,101,177,115,17,221,0,0,0,221,0, 0,0,221,220,255,200,0,41,50,255,150,205,178,45,116,113,255,189, 47,0,44,40,119,171,205,107,255,177,115,172,133,73,236,109,0,168, 168,46,207,188,181,203,212,188,35,90,97,52,39,209,184,41,164,152, 227,46,70,46,70,227,211,156,255,98,146,222,136,56,95,102,54,152, 86,142,0,142,0,86,0,86,142,86,223,96,246,135,46,4,208,120, 212,233,158,177,92,214,104,147,88,149,240,147,227,93,148,72,255,133, 209,27,194,147,255,255,44,93,0,160,36,158,182,233,0,96,94,217, 218,103,88,163,154,38,118,114,139,94,0,43,113,164,174,168,188,114, 0,23,119,42,86,93,255,226,202,80,191,155,255,158,136,0,247,62, 234,146,88,0,183,229,110,212,36,0,143,161,105,191,210,133,164,0, 41,30,89,164,0,132,30,89,42,178,222,217,121,22,11,221,107,22, 69,151,255,45,158,3,158,3,45,3,45,158,86,42,29,9,122,22, 213,209,110,53,221,57,159,101,91,93,140,45,247,213,37,185,34,0, 0,185,34,34,0,185,236,0,172,210,180,78,231,107,221,162,49,43, 43,162,49,49,43,162,36,248,213,114,0,214,213,36,248,149,34,243, 185,158,167,144,122,224,34,245,149,255,31,98,31,98,255,152,200,193, 255,80,95,128,123,63,102,62,72,255,62,148,151,226,108,159,99,255, 226,255,126,98,223,136,80,95,255,225,153,15,73,41,211,212,71,41, 83,217,187,180,235,79,0,166,127,251,135,243,229,41,0,41,0,229, 82,255,216,141,174,249,249,215,255,167,31,79,31,79,167,213,102,185, 255,215,83,4,2,40,224,171,220,41,0,4,6,50,90,221,15,113, 15,113,221,33,0,115,108,23,90,182,215,36 }; // ----------------------------------------------------------------------------- // Note that all the default icons are grayscale bitmaps. // These icons are used for lots of different rules with different numbers // of states, and at rendering time we will replace the white pixels in each // icon with the cell's state color to avoid "color shock" when switching // between icon and non-icon view. Gray pixels are used to do anti-aliasing. // XPM data for default 7x7 icon static const char* default7x7[] = { // width height ncolors chars_per_pixel "7 7 4 1", // colors ". c #000000", // black will be transparent "D c #404040", "E c #E0E0E0", "W c #FFFFFF", // white // pixels ".DEWED.", "DWWWWWD", "EWWWWWE", "WWWWWWW", "EWWWWWE", "DWWWWWD", ".DEWED." }; // XPM data for default 15x15 icon static const char* default15x15[] = { // width height ncolors chars_per_pixel "15 15 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............", "....DBWWWBD....", "...BWWWWWWWB...", "..BWWWWWWWWWB..", ".DWWWWWWWWWWWD.", ".BWWWWWWWWWWWB.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".WWWWWWWWWWWWW.", ".BWWWWWWWWWWWB.", ".DWWWWWWWWWWWD.", "..BWWWWWWWWWB..", "...BWWWWWWWB...", "....DBWWWBD....", "..............." }; // XPM data for default 31x31 icon static const char* default31x31[] = { // width height ncolors chars_per_pixel "31 31 5 1", // colors ". c #000000", // black will be transparent "D c #404040", "C c #808080", "B c #C0C0C0", "W c #FFFFFF", // white // pixels "...............................", "...............................", "..........DCBWWWWWBCD..........", ".........CWWWWWWWWWWWC.........", ".......DWWWWWWWWWWWWWWWD.......", "......BWWWWWWWWWWWWWWWWWB......", ".....BWWWWWWWWWWWWWWWWWWWB.....", "....DWWWWWWWWWWWWWWWWWWWWWD....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "..BWWWWWWWWWWWWWWWWWWWWWWWWWB..", "..CWWWWWWWWWWWWWWWWWWWWWWWWWC..", "..DWWWWWWWWWWWWWWWWWWWWWWWWWD..", "...CWWWWWWWWWWWWWWWWWWWWWWWC...", "....WWWWWWWWWWWWWWWWWWWWWWW....", "....DWWWWWWWWWWWWWWWWWWWWWD....", ".....BWWWWWWWWWWWWWWWWWWWB.....", "......BWWWWWWWWWWWWWWWWWB......", ".......DWWWWWWWWWWWWWWWD.......", ".........CWWWWWWWWWWWC.........", "..........DCBWWWWWBCD..........", "...............................", "..............................." }; // XPM data for the 7x7 icon used for hexagonal CA static const char* hex7x7[] = { // width height ncolors chars_per_pixel "7 7 3 1", // colors ". c #000000", // black will be transparent "C c #808080", "W c #FFFFFF", // white // pixels ".WWC...", "WWWWW..", "WWWWWW.", "CWWWWWC", ".WWWWWW", "..WWWWW", "...CWW."}; // XPM data for the 15x15 icon used for hexagonal CA static const char* hex15x15[] = { // width height ncolors chars_per_pixel "15 15 3 1", // colors ". c #000000", // black will be transparent "C c #808080", "W c #FFFFFF", // white // pixels "...WWC.........", "..WWWWWC.......", ".WWWWWWWWC.....", "WWWWWWWWWWW....", "WWWWWWWWWWWW...", "CWWWWWWWWWWWC..", ".WWWWWWWWWWWW..", ".CWWWWWWWWWWWC.", "..WWWWWWWWWWWW.", "..CWWWWWWWWWWWC", "...WWWWWWWWWWWW", "....WWWWWWWWWWW", ".....CWWWWWWWW.", ".......CWWWWW..", ".........CWW..."}; // XPM data for 31x31 icon used for hexagonal CA static const char* hex31x31[] = { // width height ncolors chars_per_pixel "31 31 3 1", // colors ". c #000000", // black will be transparent "C c #808080", "W c #FFFFFF", // white // pixels ".....WWC.......................", "....WWWWWC.....................", "...WWWWWWWWC...................", "..WWWWWWWWWWWC.................", ".WWWWWWWWWWWWWWC...............", "WWWWWWWWWWWWWWWWWC.............", "WWWWWWWWWWWWWWWWWWWC...........", "CWWWWWWWWWWWWWWWWWWWWC.........", ".WWWWWWWWWWWWWWWWWWWWWW........", ".CWWWWWWWWWWWWWWWWWWWWWC.......", "..WWWWWWWWWWWWWWWWWWWWWW.......", "..CWWWWWWWWWWWWWWWWWWWWWC......", "...WWWWWWWWWWWWWWWWWWWWWW......", "...CWWWWWWWWWWWWWWWWWWWWWC.....", "....WWWWWWWWWWWWWWWWWWWWWW.....", "....CWWWWWWWWWWWWWWWWWWWWWC....", ".....WWWWWWWWWWWWWWWWWWWWWW....", ".....CWWWWWWWWWWWWWWWWWWWWWC...", "......WWWWWWWWWWWWWWWWWWWWWW...", "......CWWWWWWWWWWWWWWWWWWWWWC..", ".......WWWWWWWWWWWWWWWWWWWWWW..", ".......CWWWWWWWWWWWWWWWWWWWWWC.", "........WWWWWWWWWWWWWWWWWWWWWW.", ".........CWWWWWWWWWWWWWWWWWWWWC", "...........CWWWWWWWWWWWWWWWWWWW", ".............CWWWWWWWWWWWWWWWWW", "...............CWWWWWWWWWWWWWW.", ".................CWWWWWWWWWWW..", "...................CWWWWWWWW...", ".....................CWWWWW....", ".......................CWW....." }; // XPM data for the 7x7 icon used for von Neumann CA static const char* vn7x7[] = { // width height ncolors chars_per_pixel "7 7 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels "...W...", "..WWW..", ".WWWWW.", "WWWWWWW", ".WWWWW.", "..WWW..", "...W..." }; // XPM data for the 15x15 icon used for von Neumann CA static const char* vn15x15[] = { // width height ncolors chars_per_pixel "15 15 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels "...............", ".......W.......", "......WWW......", ".....WWWWW.....", "....WWWWWWW....", "...WWWWWWWWW...", "..WWWWWWWWWWW..", ".WWWWWWWWWWWWW.", "..WWWWWWWWWWW..", "...WWWWWWWWW...", "....WWWWWWW....", ".....WWWWW.....", "......WWW......", ".......W.......", "..............." }; // XPM data for 31x31 icon used for von Neumann CA static const char* vn31x31[] = { // width height ncolors chars_per_pixel "31 31 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels "...............................", "...............................", "...............W...............", "..............WWW..............", ".............WWWWW.............", "............WWWWWWW............", "...........WWWWWWWWW...........", "..........WWWWWWWWWWW..........", ".........WWWWWWWWWWWWW.........", "........WWWWWWWWWWWWWWW........", ".......WWWWWWWWWWWWWWWWW.......", "......WWWWWWWWWWWWWWWWWWW......", ".....WWWWWWWWWWWWWWWWWWWWW.....", "....WWWWWWWWWWWWWWWWWWWWWWW....", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "..WWWWWWWWWWWWWWWWWWWWWWWWWWW..", "...WWWWWWWWWWWWWWWWWWWWWWWWW...", "....WWWWWWWWWWWWWWWWWWWWWWW....", ".....WWWWWWWWWWWWWWWWWWWWW.....", "......WWWWWWWWWWWWWWWWWWW......", ".......WWWWWWWWWWWWWWWWW.......", "........WWWWWWWWWWWWWWW........", ".........WWWWWWWWWWWWW.........", "..........WWWWWWWWWWW..........", "...........WWWWWWWWW...........", "............WWWWWWW............", ".............WWWWW.............", "..............WWW..............", "...............W...............", "...............................", "..............................." }; // XPM data for the 7x7 icons used by 4-state rules emulating a triangular neighborhood static const char* tri7x7[] = { // width height ncolors chars_per_pixel "7 21 2 1", // colors ". c #000000", // black will be transparent "W c #FFFFFF", // white // pixels for state 1 ".......", "W......", "WW.....", "WWW....", "WWWW...", "WWWWW..", "WWWWWW.", // pixels for state 2 ".WWWWWW", "..WWWWW", "...WWWW", "....WWW", ".....WW", "......W", ".......", // pixels for state 3 ".WWWWWW", "W.WWWWW", "WW.WWWW", "WWW.WWW", "WWWW.WW", "WWWWW.W", "WWWWWW." }; // XPM data for the 15x15 icons used by 4-state rules emulating a triangular neighborhood static const char* tri15x15[] = { // width height ncolors chars_per_pixel "15 45 2 1", // colors ". c #000000", "W c #FFFFFF", // pixels for state 1 "...............", "W..............", "WW.............", "WWW............", "WWWW...........", "WWWWW..........", "WWWWWW.........", "WWWWWWW........", "WWWWWWWW.......", "WWWWWWWWW......", "WWWWWWWWWW.....", "WWWWWWWWWWW....", "WWWWWWWWWWWW...", "WWWWWWWWWWWWW..", "WWWWWWWWWWWWWW.", // pixels for state 2 ".WWWWWWWWWWWWWW", "..WWWWWWWWWWWWW", "...WWWWWWWWWWWW", "....WWWWWWWWWWW", ".....WWWWWWWWWW", "......WWWWWWWWW", ".......WWWWWWWW", "........WWWWWWW", ".........WWWWWW", "..........WWWWW", "...........WWWW", "............WWW", ".............WW", "..............W", "...............", // pixels for state 3 ".WWWWWWWWWWWWWW", "W.WWWWWWWWWWWWW", "WW.WWWWWWWWWWWW", "WWW.WWWWWWWWWWW", "WWWW.WWWWWWWWWW", "WWWWW.WWWWWWWWW", "WWWWWW.WWWWWWWW", "WWWWWWW.WWWWWWW", "WWWWWWWW.WWWWWW", "WWWWWWWWW.WWWWW", "WWWWWWWWWW.WWWW", "WWWWWWWWWWW.WWW", "WWWWWWWWWWWW.WW", "WWWWWWWWWWWWW.W", "WWWWWWWWWWWWWW." }; // XPM data for the 31x31 icons used by 4-state rules emulating a triangular neighborhood static const char* tri31x31[] = { // width height ncolors chars_per_pixel "31 93 2 1", // colors ". c #000000", "W c #FFFFFF", // pixels for state 1 "...............................", "W..............................", "WW.............................", "WWW............................", "WWWW...........................", "WWWWW..........................", "WWWWWW.........................", "WWWWWWW........................", "WWWWWWWW.......................", "WWWWWWWWW......................", "WWWWWWWWWW.....................", "WWWWWWWWWWW....................", "WWWWWWWWWWWW...................", "WWWWWWWWWWWWW..................", "WWWWWWWWWWWWWW.................", "WWWWWWWWWWWWWWW................", "WWWWWWWWWWWWWWWW...............", "WWWWWWWWWWWWWWWWW..............", "WWWWWWWWWWWWWWWWWW.............", "WWWWWWWWWWWWWWWWWWW............", "WWWWWWWWWWWWWWWWWWWW...........", "WWWWWWWWWWWWWWWWWWWWW..........", "WWWWWWWWWWWWWWWWWWWWWW.........", "WWWWWWWWWWWWWWWWWWWWWWW........", "WWWWWWWWWWWWWWWWWWWWWWWW.......", "WWWWWWWWWWWWWWWWWWWWWWWWW......", "WWWWWWWWWWWWWWWWWWWWWWWWWW.....", "WWWWWWWWWWWWWWWWWWWWWWWWWWW....", "WWWWWWWWWWWWWWWWWWWWWWWWWWWW...", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW..", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW.", // pixels for state 2 ".WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "..WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "...WWWWWWWWWWWWWWWWWWWWWWWWWWWW", "....WWWWWWWWWWWWWWWWWWWWWWWWWWW", ".....WWWWWWWWWWWWWWWWWWWWWWWWWW", "......WWWWWWWWWWWWWWWWWWWWWWWWW", ".......WWWWWWWWWWWWWWWWWWWWWWWW", "........WWWWWWWWWWWWWWWWWWWWWWW", ".........WWWWWWWWWWWWWWWWWWWWWW", "..........WWWWWWWWWWWWWWWWWWWWW", "...........WWWWWWWWWWWWWWWWWWWW", "............WWWWWWWWWWWWWWWWWWW", ".............WWWWWWWWWWWWWWWWWW", "..............WWWWWWWWWWWWWWWWW", "...............WWWWWWWWWWWWWWWW", "................WWWWWWWWWWWWWWW", ".................WWWWWWWWWWWWWW", "..................WWWWWWWWWWWWW", "...................WWWWWWWWWWWW", "....................WWWWWWWWWWW", ".....................WWWWWWWWWW", "......................WWWWWWWWW", ".......................WWWWWWWW", "........................WWWWWWW", ".........................WWWWWW", "..........................WWWWW", "...........................WWWW", "............................WWW", ".............................WW", "..............................W", "...............................", // pixels for state 3 ".WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "W.WWWWWWWWWWWWWWWWWWWWWWWWWWWWW", "WW.WWWWWWWWWWWWWWWWWWWWWWWWWWWW", "WWW.WWWWWWWWWWWWWWWWWWWWWWWWWWW", "WWWW.WWWWWWWWWWWWWWWWWWWWWWWWWW", "WWWWW.WWWWWWWWWWWWWWWWWWWWWWWWW", "WWWWWW.WWWWWWWWWWWWWWWWWWWWWWWW", "WWWWWWW.WWWWWWWWWWWWWWWWWWWWWWW", "WWWWWWWW.WWWWWWWWWWWWWWWWWWWWWW", "WWWWWWWWW.WWWWWWWWWWWWWWWWWWWWW", "WWWWWWWWWW.WWWWWWWWWWWWWWWWWWWW", "WWWWWWWWWWW.WWWWWWWWWWWWWWWWWWW", "WWWWWWWWWWWW.WWWWWWWWWWWWWWWWWW", "WWWWWWWWWWWWW.WWWWWWWWWWWWWWWWW", "WWWWWWWWWWWWWW.WWWWWWWWWWWWWWWW", "WWWWWWWWWWWWWWW.WWWWWWWWWWWWWWW", "WWWWWWWWWWWWWWWW.WWWWWWWWWWWWWW", "WWWWWWWWWWWWWWWWW.WWWWWWWWWWWWW", "WWWWWWWWWWWWWWWWWW.WWWWWWWWWWWW", "WWWWWWWWWWWWWWWWWWW.WWWWWWWWWWW", "WWWWWWWWWWWWWWWWWWWW.WWWWWWWWWW", "WWWWWWWWWWWWWWWWWWWWW.WWWWWWWWW", "WWWWWWWWWWWWWWWWWWWWWW.WWWWWWWW", "WWWWWWWWWWWWWWWWWWWWWWW.WWWWWWW", "WWWWWWWWWWWWWWWWWWWWWWWW.WWWWWW", "WWWWWWWWWWWWWWWWWWWWWWWWW.WWWWW", "WWWWWWWWWWWWWWWWWWWWWWWWWW.WWWW", "WWWWWWWWWWWWWWWWWWWWWWWWWWW.WWW", "WWWWWWWWWWWWWWWWWWWWWWWWWWWW.WW", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWW.W", "WWWWWWWWWWWWWWWWWWWWWWWWWWWWWW." }; // ----------------------------------------------------------------------------- CGImageRef* CreateIconBitmaps(const char** xpmdata, int maxstates) { if (xpmdata == NULL) return NULL; int wd, ht, numcolors, charsperpixel; sscanf(xpmdata[0], "%d %d %d %d", &wd, &ht, &numcolors, &charsperpixel); if (charsperpixel < 1 || charsperpixel > 2) { Warning("Error in XPM header data: chars_per_pixel must be 1 or 2"); return NULL; }; std::map colormap; std::map::iterator iterator; for (int i = 0; i < numcolors; i++) { std::string pixel; char ch1, ch2; int skip; if (charsperpixel == 1) { sscanf(xpmdata[i+1], "%c ", &ch1); pixel += ch1; skip = 2; } else { sscanf(xpmdata[i+1], "%c%c ", &ch1, &ch2); pixel += ch1; pixel += ch2; skip = 3; } if (strlen(xpmdata[i+1]) == skip+9) { int rgb; sscanf(xpmdata[i+1]+skip, "c #%6x", &rgb); colormap[pixel] = rgb; } else { int r, g, b; sscanf(xpmdata[i+1]+skip, "c #%4x%4x%4x", &r, &g, &b); // only use top 8 bits of r,g,b colormap[pixel] = ((r>>8) << 16) | ((g>>8) << 8) | (b>>8); } } // allocate and clear memory for all icon bitmaps in BGRA format // (using calloc means black pixels will be transparent) unsigned char* bgra = (unsigned char*) calloc(wd * ht * 4, 1); if (bgra == NULL) return NULL; int pos = 0; for (int i = 0; i < ht; i++) { const char* rowstring = xpmdata[i+1+numcolors]; for (int j = 0; j < wd * charsperpixel; j = j + charsperpixel) { std::string pixel; pixel += rowstring[j]; if (charsperpixel == 2) pixel += rowstring[j+1]; // find the RGB color for this pixel iterator = colormap.find(pixel); int rgb = (iterator == colormap.end()) ? 0 : iterator->second; if (rgb == 0) { // pixel is black and alpha is 0 pos += 4; } else { bgra[pos] = (rgb & 0x0000FF); pos++; // blue bgra[pos] = (rgb & 0x00FF00) >> 8; pos++; // green bgra[pos] = (rgb & 0xFF0000) >> 16; pos++; // red bgra[pos] = 255; pos++; // alpha } } } int numicons = ht / wd; if (numicons > 255) numicons = 255; // play safe CGImageRef* iconptr = (CGImageRef*) malloc(256 * sizeof(CGImageRef)); if (iconptr) { // only need to test < maxstates here, but play safe for (int i = 0; i < 256; i++) iconptr[i] = NULL; // convert each icon bitmap to a CGImage unsigned char* nexticon = bgra; CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); for (int i = 0; i < numicons; i++) { CGContextRef context = CGBitmapContextCreate(nexticon, wd, wd, 8, wd * 4, colorspace, // following gives us the optimal BGRA format: kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); // add 1 to skip iconptr[0] (ie. dead state) iconptr[i+1] = CGBitmapContextCreateImage(context); CGContextRelease(context); nexticon += wd * wd * 4; } if (numicons < maxstates-1 && iconptr[numicons]) { // duplicate last icon nexticon -= wd * wd * 4; for (int i = numicons; i < maxstates-1; i++) { CGContextRef context = CGBitmapContextCreate(nexticon, wd, wd, 8, wd * 4, colorspace, // following gives us the optimal BGRA format: kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); iconptr[i+1] = CGBitmapContextCreateImage(context); CGContextRelease(context); } } CGColorSpaceRelease(colorspace); } if (bgra) free(bgra); return iconptr; } // ----------------------------------------------------------------------------- CGImageRef* ScaleIconBitmaps(CGImageRef* srcicons, int size) { if (srcicons == NULL) return NULL; CGImageRef* iconptr = (CGImageRef*) malloc(256 * sizeof(CGImageRef)); if (iconptr) { for (int i = 0; i < 256; i++) { if (srcicons[i] == NULL) { iconptr[i] = NULL; } else { CGImageRef srcimage = srcicons[i]; size_t bytesPerRow = CGImageGetBitsPerPixel(srcimage) / CGImageGetBitsPerComponent(srcimage) * size; CGContextRef context = CGBitmapContextCreate(NULL, size, size, CGImageGetBitsPerComponent(srcimage), bytesPerRow, CGImageGetColorSpace(srcimage), CGImageGetBitmapInfo(srcimage)); CGContextSetInterpolationQuality(context, kCGInterpolationHigh); CGContextDrawImage(context, CGRectMake(0, 0, size, size), srcimage); iconptr[i] = CGBitmapContextCreateImage(context); CGContextRelease(context); } } } return iconptr; } // ----------------------------------------------------------------------------- static void CreateDefaultIcons(AlgoData* ad) { if (ad->defxpm7x7 || ad->defxpm15x15 || ad->defxpm31x31) { // create icons using given algo's default XPM data ad->icons7x7 = CreateIconBitmaps(ad->defxpm7x7, ad->maxstates); ad->icons15x15 = CreateIconBitmaps(ad->defxpm15x15, ad->maxstates); ad->icons31x31 = CreateIconBitmaps(ad->defxpm31x31, ad->maxstates); // create scaled bitmaps if size(s) not supplied if (!ad->icons7x7) { if (ad->icons15x15) // scale down 15x15 bitmaps ad->icons7x7 = ScaleIconBitmaps(ad->icons15x15, 7); else // scale down 31x31 bitmaps ad->icons7x7 = ScaleIconBitmaps(ad->icons31x31, 7); } if (!ad->icons15x15) { if (ad->icons31x31) // scale down 31x31 bitmaps ad->icons15x15 = ScaleIconBitmaps(ad->icons31x31, 15); else // scale up 7x7 bitmaps ad->icons15x15 = ScaleIconBitmaps(ad->icons7x7, 15); } if (!ad->icons31x31) { if (ad->icons15x15) // scale up 15x15 bitmaps ad->icons31x31 = ScaleIconBitmaps(ad->icons15x15, 31); else // scale up 7x7 bitmaps ad->icons31x31 = ScaleIconBitmaps(ad->icons7x7, 31); } } else { // algo didn't supply any icons so use static XPM data defined above ad->icons7x7 = CreateIconBitmaps(default7x7, ad->maxstates); ad->icons15x15 = CreateIconBitmaps(default15x15, ad->maxstates); ad->icons31x31 = CreateIconBitmaps(default31x31, ad->maxstates); } } // ----------------------------------------------------------------------------- AlgoData::AlgoData() { defbase = 0; icons7x7 = NULL; icons15x15 = NULL; icons31x31 = NULL; } // ----------------------------------------------------------------------------- AlgoData& AlgoData::tick() { AlgoData* r = new AlgoData(); algoinfo[r->id] = r; return *r; } // ----------------------------------------------------------------------------- void InitAlgorithms() { // qlife must be 1st and hlife must be 2nd qlifealgo::doInitializeAlgoInfo(AlgoData::tick()); hlifealgo::doInitializeAlgoInfo(AlgoData::tick()); // nicer if the rest are in alphabetical order generationsalgo::doInitializeAlgoInfo(AlgoData::tick()); jvnalgo::doInitializeAlgoInfo(AlgoData::tick()); ruleloaderalgo::doInitializeAlgoInfo(AlgoData::tick()); // init algoinfo array for (int i = 0; i < NumAlgos(); i++) { AlgoData* ad = algoinfo[i]; if (ad->algoName == 0 || ad->creator == 0) Fatal("Algorithm did not set name and/or creator"); // does algo use hashing? ad->canhash = ad->defbase == 8; // safer method needed??? // set status bar background by cycling thru a few pale colors switch (i % 9) { case 0: SetColor(ad->statusrgb, 255, 255, 206); break; // pale yellow case 1: SetColor(ad->statusrgb, 226, 250, 248); break; // pale blue case 2: SetColor(ad->statusrgb, 255, 233, 233); break; // pale pink case 3: SetColor(ad->statusrgb, 225, 255, 225); break; // pale green case 4: SetColor(ad->statusrgb, 243, 225, 255); break; // pale purple case 5: SetColor(ad->statusrgb, 255, 220, 180); break; // pale orange case 6: SetColor(ad->statusrgb, 200, 255, 255); break; // pale aqua case 7: SetColor(ad->statusrgb, 200, 200, 200); break; // pale gray case 8: SetColor(ad->statusrgb, 255, 255, 255); break; // white } // initialize default color scheme if (ad->defr[0] == ad->defr[1] && ad->defg[0] == ad->defg[1] && ad->defb[0] == ad->defb[1]) { // colors are nonsensical, probably unset, so use above defaults unsigned char* rgbptr = default_colors; for (int c = 0; c < ad->maxstates; c++) { ad->defr[c] = *rgbptr++; ad->defg[c] = *rgbptr++; ad->defb[c] = *rgbptr++; } } ad->gradient = ad->defgradient; SetColor(ad->fromrgb, ad->defr1, ad->defg1, ad->defb1); SetColor(ad->torgb, ad->defr2, ad->defg2, ad->defb2); for (int c = 0; c < ad->maxstates; c++) { ad->algor[c] = ad->defr[c]; ad->algog[c] = ad->defg[c]; ad->algob[c] = ad->defb[c]; } CreateDefaultIcons(ad); } circles7x7 = CreateIconBitmaps(default7x7,256); circles15x15 = CreateIconBitmaps(default15x15,256); circles31x31 = CreateIconBitmaps(default31x31,256); diamonds7x7 = CreateIconBitmaps(vn7x7,256); diamonds15x15 = CreateIconBitmaps(vn15x15,256); diamonds31x31 = CreateIconBitmaps(vn31x31,256); hexagons7x7 = CreateIconBitmaps(hex7x7,256); hexagons15x15 = CreateIconBitmaps(hex15x15,256); hexagons31x31 = CreateIconBitmaps(hex31x31,256); // these icons can only be used with 4-state rules triangles7x7 = CreateIconBitmaps(tri7x7,4); triangles15x15 = CreateIconBitmaps(tri15x15,4); triangles31x31 = CreateIconBitmaps(tri31x31,4); } // ----------------------------------------------------------------------------- lifealgo* CreateNewUniverse(algo_type algotype, bool allowcheck) { lifealgo* newalgo = algoinfo[algotype]->creator(); if (newalgo == NULL) Fatal("Failed to create new universe!"); if (algoinfo[algotype]->canhash) { newalgo->setMaxMemory(maxhashmem); } // non-hashing algos (QuickLife) use their default memory setting if (allowcheck) newalgo->setpoll(Poller()); return newalgo; } // ----------------------------------------------------------------------------- const char* GetAlgoName(algo_type algotype) { return algoinfo[algotype]->algoName; } // ----------------------------------------------------------------------------- int NumAlgos() { return staticAlgoInfo::getNumAlgos(); } // ----------------------------------------------------------------------------- CGImageRef ConvertOldMonochromeIcons(CGImageRef oldimage) { // if oldimage uses <= 2 colors and is non-grayscale then return new black-and-white image // for compatibility with monochrome .icons files in Golly 2.4 and older int wd = CGImageGetWidth(oldimage); int ht = CGImageGetHeight(oldimage); int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * wd; int bitsPerComponent = 8; // allocate memory to store oldimage's RGBA bitmap data unsigned char* pxldata = (unsigned char*) calloc(wd * ht * 4, 1); if (pxldata == NULL) return oldimage; CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(pxldata, wd, ht, bitsPerComponent, bytesPerRow, colorspace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextDrawImage(ctx, CGRectMake(0, 0, wd, ht), oldimage); CGContextRelease(ctx); CGColorSpaceRelease(colorspace); // pxldata now contains the oldimage bitmap in RGBA format so see if it uses <= 2 colors std::list colors; int numcolors = 0; bool grayscale = true; int byte = 0; for (int i = 0; i < wd*ht; i++) { unsigned char r = pxldata[byte]; unsigned char g = pxldata[byte+1]; unsigned char b = pxldata[byte+2]; int color = (r << 16) + (g << 8) + b; if (std::find(colors.begin(),colors.end(),color) == colors.end()) { // first time we've seen this color colors.push_back(color); if (r != g || g != b) grayscale = false; numcolors++; if (numcolors > 2) { free(pxldata); return oldimage; // more than 2 colors (multi-color icons) } } byte += 4; } // numcolors <= 2; if colors are shades of gray then no need to convert if (grayscale) { free(pxldata); return oldimage; } // change non-black pixels to white byte = 0; for (int i = 0; i < wd*ht; i++) { if (pxldata[byte] || pxldata[byte+1] || pxldata[byte+2]) { pxldata[byte] = 255; pxldata[byte+1] = 255; pxldata[byte+2] = 255; } byte += 4; } // create new image using modified pixel data colorspace = CGColorSpaceCreateDeviceRGB(); ctx = CGBitmapContextCreate(pxldata, wd, ht, bitsPerComponent, bytesPerRow, colorspace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGImageRef newimage = CGBitmapContextCreateImage(ctx); CGContextRelease(ctx); CGColorSpaceRelease(colorspace); free(pxldata); return newimage; } // ----------------------------------------------------------------------------- bool MultiColorImage(CGImageRef image) { // return true if image contains at least one color that isn't a shade of gray int wd = CGImageGetWidth(image); int ht = CGImageGetHeight(image); int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * wd; int bitsPerComponent = 8; // allocate memory to store image's RGBA bitmap data unsigned char* pxldata = (unsigned char*) calloc(wd * ht * 4, 1); if (pxldata == NULL) return false; CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(pxldata, wd, ht, bitsPerComponent, bytesPerRow, colorspace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextDrawImage(ctx, CGRectMake(0, 0, wd, ht), image); CGContextRelease(ctx); CGColorSpaceRelease(colorspace); // pxldata now contains the image bitmap in RGBA format int byte = 0; for (int i = 0; i < wd*ht; i++) { unsigned char r = pxldata[byte]; unsigned char g = pxldata[byte+1]; unsigned char b = pxldata[byte+2]; if (r != g || g != b) { free(pxldata); return true; // multi-color } byte += 4; } free(pxldata); return false; // grayscale } // ----------------------------------------------------------------------------- bool LoadIconFile(const std::string& path, int maxstate, CGImageRef** out7x7, CGImageRef** out15x15, CGImageRef** out31x31) { CGImageRef allicons = [UIImage imageWithContentsOfFile: [NSString stringWithCString:path.c_str() encoding:NSUTF8StringEncoding]].CGImage; if (allicons == NULL) { std::string msg = "Could not load icon bitmaps from file:\n"; msg += path; NSLog(@"%s", msg.c_str()); Warning(msg.c_str()); return false; } allicons = ConvertOldMonochromeIcons(allicons); // check dimensions of .icons format int wd = CGImageGetWidth(allicons); int ht = CGImageGetHeight(allicons); if (ht != 15 && ht != 22) { Warning("Wrong bitmap height in .icons file (must be 15 or 22)."); return false; } if (wd % 15 != 0) { Warning("Wrong bitmap width in .icons file (must be multiple of 15)."); return false; } currlayer->multicoloricons = MultiColorImage(allicons); // first extract 15x15 icons int numicons = wd / 15; if (numicons > 255) numicons = 255; // play safe CGImageRef* iconptr = (CGImageRef*) malloc(256 * sizeof(CGImageRef)); if (iconptr) { for (int i = 0; i < 256; i++) iconptr[i] = NULL; for (int i = 0; i < numicons; i++) { // add 1 to skip iconptr[0] (ie. dead state) iconptr[i+1] = CGImageCreateWithImageInRect(allicons, CGRectMake(i*15, 0, 15, 15)); } if (numicons < maxstate && iconptr[numicons]) { // duplicate last icon for (int i = numicons; i < maxstate; i++) { iconptr[i+1] = CGImageCreateWithImageInRect(allicons, CGRectMake((numicons-1)*15, 0, 15, 15)); } } // if there is an extra icon at the right end of the multi-color icons then // store it in iconptr[0] -- it will be used later in UpdateCurrentColors() // to set the color of state 0 if (currlayer->multicoloricons && (wd / 15) > maxstate) { iconptr[0] = CGImageCreateWithImageInRect(allicons, CGRectMake(maxstate*15, 0, 15, 15)); } } *out15x15 = iconptr; if (ht == 22) { // extract 7x7 icons (at bottom left corner of each 15x15 icon) iconptr = (CGImageRef*) malloc(256 * sizeof(CGImageRef)); if (iconptr) { for (int i = 0; i < 256; i++) iconptr[i] = NULL; for (int i = 0; i < numicons; i++) { // add 1 to skip iconptr[0] (ie. dead state) iconptr[i+1] = CGImageCreateWithImageInRect(allicons, CGRectMake(i*15, 15, 7, 7)); } if (numicons < maxstate && iconptr[numicons]) { // duplicate last icon for (int i = numicons; i < maxstate; i++) { iconptr[i+1] = CGImageCreateWithImageInRect(allicons, CGRectMake((numicons-1)*15, 15, 7, 7)); } } } *out7x7 = iconptr; } else { // create 7x7 icons by scaling down 15x15 icons *out7x7 = ScaleIconBitmaps(*out15x15, 7); } // create 31x31 icons by scaling up 15x15 icons *out31x31 = ScaleIconBitmaps(*out15x15, 31); return true; } golly-2.5-src/gui-ios/Golly/beep.aiff0000644000175100001440000003105612156145314014424 00000000000000FORM2&AIFFCOMM ~@ ¬DSSND2RR»»MMààààûû22ßß M M Ä Ä = =¶¶**••ìì..WW``GG——üü..,,õõ‡‡ÞÞþþãã‘‘  NN__ A A ö ö„„ïï;;nnýýú ú ÷¨÷¨ô¯ô¯ñºñºîÏîÏë÷ë÷é4é4æŽæŽääá³á³ßˆßˆÝÝÛÍÛÍÚHÚHÙÙ×ÿ×ÿ×A×AÖÆÖÆÖ’Ö’Ö¨Ö¨×××­×­Ø˜Ø˜ÙÆÙÆÛ8Û8ܿܿÞÊÞÊàèàèã9ã9å°å°èPèPëëíèíèðÒðÒóÄóÄö¿ö¿ùµùµü£ü£ÿ~ÿ~@@ææff » » ã ã Ó Óˆˆÿÿ77''ÑÑ77PP!!©©ììèè§§þþ & & $ $  ÂÂmm  ÿ¤ÿ¤ý:ý:úÜúÜøŠøŠöOöOô/ô/ò4ò4ðaðaî½î½íKíKììëëê[ê[éàéàé«é«é½é½êêê¶ê¶ëŸëŸìÉìÉî;î;ïïïïñáñáôôöuöuù ù ûÓûÓþÀþÀÐÐûû?? ææ@@““ÙÙ    ""$ß$ß'|'|)ã)ã,,../¬/¬112+2+2ù2ù3t3t3ž3ž3t3t2ù2ù2)2)1 1 /—/—-Ù-Ù+Ì+Ì)w)w&Ý&Ý$$ ï %%~~³³ÌÌ Ë Ë¸¸þ€þ€úgúgöXöXò[ò[îxîxê²ê²ççãšãšàSàSÝCÝCÚhÚh×Í×ÍÕtÕtÓ]Ó]ыыÐÐÎÂÎÂÍËÍËÍÍ̢̢̼̼ÌÐÌÐÍCÍCÍüÍüÎôÎôÐ'Ð'єєÓ7Ó7Õ Õ × × Ù3Ù3ÛzÛzÝßÝßà^à^âîâîå‰å‰è.è.êÖêÖí{í{ððòªòªõ,õ,÷š÷šùðùðü*ü*þEþE@@ËËYYÀÀ   Û Û ƒ ƒ s s ¼ ¼ ì ì     ñ ñ Ô Ô ª ª | | L L   ì ì È È ­ ­ ¤ ¤ ¨ ¨ Á Á ñ ñ : : œ œ   ± ±jj<<**55XX““ååLLÂÂDDÐÐbbôô‚‚! ! "†"†#ë#ë%=%=&s&s'ˆ'ˆ(v(v)8)8)Ê)Ê*****S*S*A*A)î)î)X)X(('c'c%ü%ü$M$M"R"R  ‡‡´´œœCCªª Ö ÖËË$$û•û•öåöåòòí?í?è]è]ãsãsÞÞٻٻÔýÔýÐ]Ð]ËãËãǘǘÅÅ¿±¿±¼"¼"¸â¸âµ÷µ÷³g³g±5±5¯l¯l®®­­¬£¬£¬œ¬œ­ ­ ­ñ­ñ¯Q¯Q±,±,³z³z¶<¶<¹p¹p½½Á!Á!ÅÅÊ^Ê^ττÔùÔùÚ¸Ú¸àµàµæéæéíKíKóÏóÏúpúpÍÍvv””!í!í((..3¶3¶99>#>#BÏBÏGGJ÷J÷NdNdQVQVSÑSÑUÈUÈW?W?X1X1XœXœXƒXƒWãWãVÁVÁUURúRúP_P_MMMMIÎIÎEåEåAžAž<ý<ý8 8 2Ð2Ð-Y-Y'¬'¬!Ô!ÔÝÝÐкº ¡ ¡––ýœýœ÷Å÷Åòòì”ì”çNçNâPâPݞݞÙ;Ù;Õ6Õ6ÑŽÑŽÎNÎNËwËwÉÉÇÇŌŌÄvÄvÃÖÃÖææÃêÃêĜĜŶŶÇ:Ç:É É ËbËbÍüÍüÐåÐåÔÔ××Û8Û8ßßããç9ç9ëoëoï¯ï¯óôóôø1ø1ü^ü^pp``&& ¼ ¼11ŒŒÅŧ§//]]--¡¡´´kkÄÄÂÂkk½½ÂÂ||ññ''&& ö ö$$üòüòùJùJõ¥õ¥òòîîëëçËçËä°ä°áÈáÈßßܯܯÚÚØ¸Ø¸×8×8ÖÖÕDÕDÔÖÔÖÔÈÔÈÕÕÕÔÕÔÖíÖíØjØjÚDÚDÜÜßßáþáþå9å9èÂèÂììððôãôãùXùXýõýõ´´ˆˆ l lSS99ÍÍ$m$m(å(å-*-*15154þ4þ88;±;±>†>†AACCDÐDÐFFFõFõGbGbGZGZFåFåEúEúD D B×B×@Ÿ@Ÿ=ÿ=ÿ:ú:ú7”7”3Ô3Ô/¹/¹+S+S&¦&¦!¸!¸’’;;¾¾ ! !ppµµúùúùõ?õ?ï˜ï˜ê ê äœäœßXßXÚJÚJÕtÕtÐâÐâ̕̕ȚȚÄóÄóÁ¦Á¦¾¸¾¸¼-¼-ºº¸I¸I¶ô¶ô¶ ¶ µ‹µ‹µtµtµÇµÇ¶‚¶‚·¤·¤¹$¹$»»½=½=¿Ë¿ËªªÅÑÅÑÉ:É:ÌàÌàннÔÈÔÈØýØýÝOÝOá¼á¼æ9æ9êÂêÂïIïIóÏóÏøJøJü²ü²00 ; ;  ÓÓSSœœ««}}  "a"a$m$m&8&8'Á'Á))***È*È+H+H+Ž+Ž+˜+˜+l+l++*u*u)¸)¸(Î(Î'Á'Á&‘&‘%F%F#ã#ã"m"m æ æTT½½  ……îî\\××``÷÷ŸŸ\\**      : : s s Á Á " "””¦¦BBéé””DDöö¦¦PPöö’’""¤¤vvÀÀôôÿÿþþüÒüÒû‰û‰ú'ú'ø¬ø¬÷÷õsõsó¸ó¸ñêñêð ð îîì)ì)ê+ê+è+è+æ,æ,ä2ä2â>â>àWàWÞÞܽܽÛÛÙÙØ$Ø$ÖâÖâÕÈÕÈÔÝÔÝÔÔÓ—Ó—ÓFÓFÓ-Ó-ÓOÓOÓ¯Ó¯ÔMÔMÕ)Õ)ÖHÖH×¢×¢Ù;Ù;ÛÛÝ(Ý(ßxßxââä¾ä¾ç¬ç¬êÇêÇîîñzñzõõøªøªüiüi22áá ¸ ¸ˆˆGGòò‚‚íí!6!6$Q$Q'8'8)è)è,^,^.“.“0„0„2-2-334ž4ž5b5b5Ô5Ô5ù5ù5É5É5I5I4{4{3^3^1ô1ô0C0C.I.I,,)“)“&á&á#ø#ø â ⢢==¼¼%%|| Ì ÌggÅÅý5ý5ùºùºö^ö^ó$ó$ððí9í9êŽêŽèèåëåëãõãõâCâCàØàØß³ß³ÞØÞØÞFÞFÝüÝüÝüÝüÞCÞCÞÎÞÎߟߟà±à±ââã‡ã‡åCåCç4ç4éIéIë‡ë‡íæíæð_ð_òêòêõõøøú¼ú¼ýSýSÿÜÿÜVV²²ññ   ø ø ¶ ¶AA––±±ŠŠ!!zzŒŒ\\åå,,..ññ u u ½ ½ Ï Ï««YYàà@@ý‚ý‚ú¬ú¬÷Å÷ÅôÓôÓñÛñÛîéîéììé+é+ænænãÒãÒáZáZßßÜúÜúÛÛككØ(Ø(××ÖXÖXÕèÕèÕËÕËÖÖÖ’Ö’×}×}ؽؽÚXÚXÜJÜJÞ‘Þ‘á*á*ääçIçIêÇêÇî†î†òƒòƒöµöµûûÿœÿœFF   Ø Ø±±‰‰WW!!%³%³*/*/.~.~2™2™6w6w::=]=]@V@VBøBøE:E:GGHHI™I™J2J2J[J[JJITITH"H"F|F|DeDeAáAá>ñ>ñ;š;š7Û7Û3Ä3Ä/R/R**%ƒ%ƒ 8 8°°÷÷  üâüâöÁöÁð¨ð¨êžêžä³ä³ÞîÞîÙSÙSÓòÓòÎÎÎÎÉõÉõÅhÅhÁ4Á4½_½_¹ë¹ë¶â¶â´C´C²²°`°`¯¯®Q®Q­þ­þ®%®%®Á®Á¯Õ¯Õ±Z±Z³S³Sµµµµ¸€¸€»«»«¿6¿6ÃÃÇCÇC˺˺ÐpÐpÕ]Õ]ÚzÚz߼߼ååê’ê’ððõšõšûû……àà  &&  ´´"""M"M&/&/)Å)Å--/õ/õ2‰2‰4À4À6Ÿ6Ÿ8899999ú9ú:[:[:b:b::9f9f8i8i775†5†3©3©1‰1‰/./., , )ß)ß&ø&ø#í#í È ÈBBðð  QQ Ý ÝÂÂÆÆççþ0þ0û£û£ùCùC÷÷õõóOóOñ»ñ»ðaðaï?ï?îXîXí¦í¦í-í-ìéìéìØìØìøìøíIíIíÄíÄîhîhï/ï/ððññò:ò:ólólô¬ô¬õúõú÷J÷Jøœøœùìùìû1û1ülülý™ý™þ°þ°ÿ²ÿ²——``  ’’öö44NN@@  °°00‹‹ÅÅÿÜÿÜþÕþÕý°ý°üuüuû#û#ù¾ù¾øJøJöÊöÊõCõCóºóºò1ò1ð­ð­ï2ï2íÆíÆìiìië$ë$é÷é÷èéèéç÷ç÷ç,ç,æ‡æ‡æ æ å³å³åŽåŽå™å™åÎåÎæ5æ5æÌæÌç”ç”è‰è‰é­é­êþêþì{ì{î î ïïïïñÝñÝóïóïööøgøgúÅúÅý5ý5ÿ´ÿ´;;ÆÆQQ Ø Ø V VÆÆ''qq¢¢³³¥¥rrÝÝ ù ù!è!è"¡"¡#(#(#x#x#˜#˜#ƒ#ƒ#:#:"¿"¿""!8!8 / /ýý    ~~¼¼ââððèèÕÕ¶¶ ‘ ‘ c c;;ýýííÿðÿðþþü3ü3úwúwøØøØ÷V÷Võöõöô¸ô¸óœóœò£ò£ñÍñÍññð‘ð‘ð(ð(ïâïâï¿ï¿ï¹ï¹ïÔïÔð ð ð_ð_ðÈðÈñFñFñÖñÖòtòtóóóÔóÔôŒôŒõHõHöööºöº÷j÷jøøø§ø§ù0ù0ù¨ù¨ú ú úZúZú“ú“ú®ú®úµúµúžúžújújú ú ùºùºù:ù:ø£ø£÷õ÷õ÷/÷/öXöXõoõoôzôzóxóxòoòoñ_ñ_ðOðOï?ï?î8î8í9í9ìIìIëgëgêžêžéíéíéWéWèâèâèŽèŽèbèbè^è^è‡è‡èÛèÛébébêêêþêþììíiíiîèîèðšðšò}ò}ôôöÏöÏù:ù:ûÌûÌþ…þ…^^TTdd † † º º÷÷77ww°°ÝÝ ö ö#ö#ö&Ø&Ø)•)•,),).Š.Š0¹0¹2®2®4f4f5Ù5Ù777è7è8}8}8Á8Á8´8´8R8R776’6’54543~3~1y1y/"/",~,~)Ž)Ž&U&U"Ú"Ú  ..±±66 š šààûEûEölölñ˜ñ˜ìÐìÐèèãƒãƒß ß Ú¿Ú¿Ö¢Ö¢Ò¿Ò¿ÏÏË·Ë·È È ÅÕÅÕÃ_Ã_ÁAÁA¿¿¾¾½½¼v¼v¼6¼6¼]¼]¼æ¼æ½Ñ½Ñ¿!¿!ÀËÀËÂÓÂÓÅ1Å1ÇçÇçÊêÊêÎ9Î9ÑÍÑÍՠՠ٫٫ÝèÝèâNâNæÙæÙë€ë€ð:ð:ôÿôÿùÇùÇþŒþŒDDëë v vÞÞ.. ¤ ¤$$'')ã)ã,^,^.‰.‰0^0^1Þ1Þ333Ô3Ô4M4M4i4i42423¤3¤2Ä2Ä1”1”00.R.R,I,I**'~'~$È$È!ä!䨨««bb¡¡11 à Ã[[¼¼ý“ý“úˆúˆ÷£÷£ôèôèò]ò]ððíäíäììêYêYèðèðçËçËæéæéæGæGåëåëåÐåÐåùåùæ^æ^çççäçäèþèþêKêKëÉëÉírírïDïDñ8ñ8óJóJõuõu÷®÷®ù÷ù÷üIüIþ™þ™ââ$$VVqq q q S S  ¦¦JJQQ!!¼¼AA,,ÚÚPP‡‡ˆˆSSèè L L ‹ ‹oo//ÐÐ[[ýÒýÒû9û9ø˜ø˜õóõóóQóQð´ð´î&î&ë­ë­éIéIççäâäââçâçááßxßxÞÞÜØÜØÛáÛáÛ$Û$Ú¦Ú¦ÚlÚlÚoÚoÚ´Ú´Û=Û=ÜÜÝÝÞcÞcßîßîáµáµã³ã³åëåëèTèTêëêëí­í­ð”ð”óœóœö¿ö¿ùúùúýEýE™™÷÷TT « « ö ö11WW``GG  ¦¦""$H$H&M&M(()¨)¨*ú*ú,,,à,à-r-r-¾-¾-É-É-“-“--,e,e+q+q*?*?(Õ(Õ'5'5%c%c#]#]!-!-ØØ]]  @@aaxx † †’’ŸŸ²²ÿÔÿÔýýú@ú@÷˜÷˜õõò˜ò˜ðJðJîîììê7ê7è„è„æùæùåœåœälälãjãjâ•â•áîáîáqáqá#á#àúàúàüàüá#á#ásásáãáãâsâsãããçãçäÉäÉå¾å¾æÇæÇçàçàééê4ê4ëiëiì¢ì¢íßíßïïðOðOññò«ò«óÌóÌôåôåõïõïöîöî÷Þ÷Þø¿ø¿ù•ù•úXúXûûûµûµüPüPüÜüÜý\ý\ýÒýÒþ<þ<þ þ þûþûÿPÿPÿ¤ÿ¤ÿôÿô@@åå@@žžvvîîtt¦¦TT  ÖÖ¯¯”” † † „ „ £ £ Á Áãã  88gg‘‘¹¹ÚÚòòþþüüéé„„++¶¶&&rr¢¢‚‚==ÍÍ22nn‚‚gg''»»''llŠŠ†† a a  ½½FF¹¹þpþpûºûºøþøþöAöAó†ó†ðÔðÔî-î-ë”ë”ééæ©æ©ä\ä\â0â0à(à(ÞHÞHܕܕÛÛÙ¿Ù¿Ø¢Ø¢×¸×¸× × Ö–Ö–Ö[Ö[Ö]Ö]Ö™Ö™×××Ê×ÊØºØºÙãÙãÛFÛFÜÝÜÝÞ¥Þ¥à à âÅâÅååç‹ç‹ê$ê$ìÖìÖï¤ï¤òƒòƒõsõsønønûlûlþkþk``PP11 ý ý ± ±FF¾¾33..ùù’’÷÷$$ÔÔ X X ¡ ¡ ¯ ¯ ‚ ‚ ! !††¹¹¶¶„„&&žžðð00'' Ú Ú ¡ ¡ ] ]ÛÛ  rrþWþWüPüPú`ú`øøöÜöÜõOõOóêóêò«ò«ññðºðºððï„ï„ï4ï4ïïï)ï)ïmïmïáïáð„ð„ñTñTòMòMóoóoôµôµöö÷¥÷¥ùEùEúüúüüÅüÅþžþž{{``FF&&ùù Á Á v v  ‘‘óó33HH77÷÷‡‡çç  ÊÊWW®®Ðм¼wwÿÿ Z Z ˆ ˆ kk++ÉÉNNýÂýÂû!û!øxøxõÆõÆóóðjðjíÉíÉë7ë7è·è·æUæUääáìáìßñßñÞ#Þ#܈܈ÛÛÙíÙíØøØøØAØA×È×È×’×’×××í×íØØÙXÙXÚsÚsÛÍÛÍÝlÝlßGßGá^á^ã®ã®æ2æ2èéèéëÏëÏîÝîÝò ò õ_õ_øÊøÊüJüJÿÕÿÕmm š š&&§§``ŽŽ™™!z!z$,$,&¨&¨(ï(ï*ø*ø,Å,Å.P.P/•/•0™0™1N1N1À1À1ç1ç1Ä1Ä1Y1Y0¤0¤/©/©.i.i,ã,ã+#+#)!)!&è&è$x$x!Ø!Ø  ûûÂÂqq  ˜ ˜  %%ý³ý³úPúPöüöüóÃóÃð¤ð¤í¨í¨êÐêÐè"è"åžåžãNãNá.á.ßGßGݕݕÜÜÚáÚáÙßÙßÙÙؒؒØDØDØ2Ø2Ø[Ø[ؽؽÙSÙSÚÚÛÛÜHÜHݡݡß!ß!àÇàÇâŒâŒärärænænè‚è‚ê§ê§ìØìØïïñRñRó“ó“õÏõÏøøú1ú1üPüPþ`þ`UU55««;;ªª ú ú ( ( 4 4   å 円  hh¨¨ÊÊÌ̳³33ÓÓ__ Ú Ú F F ¦ ¦ ü ü K K – – á á + +xxËË$$††òòmmôô‹‹00ææ®®‡‡rrmmyy––ÂÂýýDD––öö[[ÆÆ99­­!!––rrÚÚ 6 6 † † Ë Ë   & & ; ; ; ; ( (   Æ Æ q q  ŠŠòòHHˆˆ°°ÆÆË˽½  uuÿ@ÿ@þþü·ü·ûjûjúúøÇøÇ÷u÷uö*ö*ôæôæó¬ó¬òzòzñZñZðFðFïFïFî[î[í†í†ìÉìÉì'ì'ë ë ë4ë4êæêæê·ê·ê¦ê¦ê´ê´êâêâë-ë-ë™ë™ì ì ìÈìÈí‰í‰îfîfï[ï[ðjðjññòÆòÆôôõfõföÌöÌø<ø<ù±ù±û0û0ü®ü®þ,þ,ÿ§ÿ§  ððII’’ÉÉëë û û ô ô Ö Ö œ œ L L Ý ÝVV±±ïïáážžCC Ñ Ñ L L ´ ´ V V ‘ ‘ Á Áíí22TTxx››ÇÇýý;;……ÞÞEEÿÀÿÀÿKÿKþéþéþ›þ›þbþbþ<þ<þ0þ0þ5þ5þRþRþ€þ€þÇþÇÿÿÿ…ÿ…ÿþÿþ„„µµ]]  ÀÀvv))ÛÛ‹‹//ËËYYØØ F F ¢ ¢ ê ê   1 1 + +   Ö Ö   zzËËÿÿöö½½nn þ’þ’ý ý ûpûpùÎùÎø!ø!önönô¸ô¸óóñTñTï©ï©î î ìyìyêûêûé’é’è@è@ç ç åðåðäùäùä%ä%ãwãwâñâñâ•â•âgâgâcâcâŽâŽâéâéãsãsä,ä,ååæ+æ+çnçnèàèàêyêyì=ì=î&î&ð6ð6òdòdô±ô±÷÷ù˜ù˜ü*ü*þÎþÎyy--ää š š H HîppÀÀòòýýää ¢ ¢"2"2#“#“$¿$¿%º%º&}&}'''Z'Z'u'u'S'S&ú&ú&e&e%š%š$˜$˜#]#]!ñ!ñ R R‚‚‰‰gg··,,ŠŠ Ó Ó 66[[{{ÿ›ÿ›üÂüÂùñùñ÷3÷3ôƒôƒñíñíïrïrííêÝêÝèÉèÉæÞæÞååãŒãŒâ*â*àüàüßþßþß7ß7Þ£Þ£ÞEÞEÞÞÞ(Þ(ÞhÞhÞÜÞÜß~ß~àSàSáSáSâ€â€ãÓãÓåLåLæéæéè¤è¤êyêyìiìiîiîið{ð{òšòšôÁôÁöìöìùùû>û>ý^ý^ÿtÿtyynnOO Q Q Á Á  <<AA!!ÞÞqqÞÞ%%EE<<ÇÇUUÇÇOOmm u u l l M M $ $ïï²²pp--ëë®®wwKKÿ,ÿ,þþýýü3ü3û^û^ú ú ùúùúùpùpøÿøÿø¨ø¨øqøqøUøUøUøUøqøqøªøªøÿøÿùlùlùñùñúúû@û@üüüÜüÜýÂýÂþµþµÿ´ÿ´µµÂÂÐÐßßëëððññææÏÏ ¨ ¨ q q & & Æ Æ Q Q Á Á   V V v v | | c c - - Ý Ý q q æ æ A A ª ªºº´´››mm00ææ00þÌþÌýbýbûõûõúŠúŠù%ù%÷Ã÷Ãölölõõóßóßò±ò±ñ”ñ”ðŠðŠï™ï™î¿î¿íûíûíTíTìÉìÉìYìYì ì ëÖëÖëÀëÀëÉëÉëôëôì9ì9ìŸìŸííí¹í¹îoîoï?ï?ð&ð&ñ$ñ$ò4ò4óXóXôôõÏõÏ÷÷øuøuùÕùÕû:û:ü¢ü¢þ þ ÿpÿpÒÒ00„„ÏÏ  ==aa o o o o Z Z / / ñ ñ œ œ11¯¯ff¡¡ÅÅÓÓÌ̯¯??ì숈 ˜ ˜   z z Ü Ü 4 4 ‹ ‹ Û Û * *vvÁÁ``²²  iiÍÍ99««''««;;ÐÐnnÿÇÿÇÿ‚ÿ‚ÿBÿBÿ ÿ þÙþÙþ®þ®þ‡þ‡þeþeþGþGþ+þ+þþý÷ý÷ýÜýÜýÃýÃý©ý©ý‰ý‰ýeýeý@ý@ýýüåüåü®ü®üpüpü,ü,ûãûãû‘û‘û:û:úÜúÜúwúwú ú ùžùžù(ù(ø¯ø¯ø3ø3÷µ÷µ÷5÷5ö¶ö¶ö8ö8õºõºõAõAôÏôÏô_ô_óúóúóœóœóFóFòÿòÿòÄòÄò˜ò˜òzòzòjòjòmòmòòò¨ò¨òãòãó1ó1ó”ó”ôôô•ô•õ3õ3õæõæö®ö®÷†÷†øuøuùpùpú€ú€ûšûšüÇüÇýüýüÿ@ÿ@‰‰ÛÛ00‹‹ääAA–– æ æ / / m m ¡ ¡ÆÆØØÜÜÌÌ¡¡cc  ——  bb——²²®®ŠŠGGééiiÌÌ<<LLAA æ æ œ œ : : Ë ËMMÄÄ22™™ýý\\þÂþÂý)ý)û•û•úúøŽøŽ÷÷õ¼õ¼ôoôoó4ó4òòññððï9ï9îîíàíàíbíbìÿìÿì¿ì¿ì›ì›ì—ì—ì²ì²ìëìëíBíBí¶í¶îFîFîïîïï¯ï¯ðŠðŠñzñzò{ò{ó“ó“ôµôµõåõå÷÷øeøeù¬ù¬úùúùüGüGý’ý’þÙþÙPP~~  °°°°  {{AAïï † †   j j ¶ ¶ ê ê     ê ê ¸ ¸ q q   ¡ ¡  ÒÒTT„„©©ÉÉääûû++ÿKÿKþnþnýšýšüÎüÎüüû^û^úºúºú*ú*ùªùªù@ù@øèøèø¥ø¥øxøxøcøcøcøcøzøzø¨ø¨øìøìùEùEùµùµú5ú5úÌúÌûuûuü.ü.üõüõýÉýÉþ©þ©ÿ’ÿ’„„{{vvrrmmffYYFF++   Ï Ï ‹ ‹ 6 6 Ï Ï T T Æ Æ   a a Š Š œ œ • • s s 6 6 á á s s ì ì K K – – È ÈèèòòëëÖÖ¯¯}}>>ùùÿ°ÿ°þ`þ`ýýûÀûÀúpúpù'ù'÷å÷åö¯ö¯õõôdôdóVóVò[ò[ñsñsðŸðŸïßïßï9ï9î­î­î9î9íàíàí¤í¤í‚í‚í{í{í’í’íÄíÄîîîyîyîÿîÿï™ï™ðOðOñññúñúòïòïóøóøõõö:ö:÷o÷oø¯ø¯ù÷ù÷ûJûJüžüžýõýõÿLÿL¤¤õõFF‹‹ÈÈøø 1 1 4 4 & &   Ñ Ñ † †&&±±!!||ÁÁììÿÿææ¸¸uu¯¯11 ¡ ¡   V V œ œ Ö Ö   / /QQkk‚‚˜˜­­ÄÄÛÛùùDDÿtÿtþ«þ«ýìýìý:ý:ü’ü’ûõûõûeûeúáúáúlúlúúù¨ù¨ù^ù^ùùøèøèøÃøÃøªøªøšøšø˜ø˜øŸøŸø¯ø¯øÌøÌøîøîùùùJùJùùù¾ù¾úúúCúCú‡ú‡úÎúÎûûû\û\û£û£ûéûéü*ü*üjüjü¥ü¥üÞüÞýýý@ý@ýlýlý’ý’ý²ý²ýÐýÐýçýçýûýûþ þ þþþþþþþþþþþþþþþ þ þþýüýüýùýùýóýóýòýòýóýóýõýõýüýüþþþþþ+þ+þEþEþeþeþ‹þ‹þ³þ³þãþãÿÿÿUÿUÿ•ÿ•ÿÜÿÜ%%uuËË$$€€ÞÞ@@  ggÉÉ++‹‹ææ??’’àà))mm¦¦ÛÛ&&AAOOTTOOAA&&ÖÖYY  ¸¸[[öö‡‡——––  €€òòeeÿÙÿÙÿKÿKþ¾þ¾þ5þ5ý°ý°ý2ý2üµüµü@ü@ûÐûÐûiûiû û ú±ú±úeúeú!ú!ùçùçù¸ù¸ù•ù•ùzùzùlùlùhùhùpùpù€ù€ùšùšùÀùÀùîùîú%ú%úeúeú¬ú¬úúúúûPûPûªûªüüüjüjüÐüÐý:ý:ý¢ý¢þ þ þuþuþÜþÜÿBÿBÿ¥ÿ¥``µµPP’’ÎÎ00VVpp„„’’€€kkPP++ÔÔžžee++ëë©©ee""ÿàÿàÿœÿœÿ[ÿ[ÿÿþàþàþ©þ©þuþuþGþGþ þ ýþýþýâýâýÐýÐýÂýÂý¾ý¾ýÂýÂýÎýÎýâýâþþþ#þ#þPþPþ…þ…þÀþÀÿÿÿLÿLÿœÿœÿðÿðII¥¥  mmÒÒ77  iiËË''€€ÖÖ  ii¨¨àà22OO``ffbbPP88àत]]  °°KKßßggëëddÛÛKKµµÿ…ÿ…þëþëþPþPý³ý³ýýüƒüƒûðûðûaûaúÚúÚúXúXùÞùÞùlùlùùø¥ø¥øOøOøø÷È÷È÷•÷•÷q÷q÷X÷X÷N÷N÷N÷N÷Z÷Z÷u÷u÷Ÿ÷Ÿ÷Ó÷Óøøø^ø^øµøµùùùùù÷ù÷úuúuúúúúû‡û‡üüü°ü°ýJýJýéýéþ‰þ‰ÿ)ÿ)ÿËÿËeežž55ÇÇTTÙÙWWÐÐ==  ûûOO””ÐÐ&&AAOOQQII88ôôÄĉ‰FFýý««TTôô))»»MMÞÞkk÷÷……¤¤77ÿÌÿÌÿgÿgÿÿþ¥þ¥þNþNýûýûý®ý®ýgýgý)ý)üòüòüÀüÀü—ü—üuüuüYüYüEüEü:ü:ü5ü5ü5ü5ü@ü@üNüNübübüzüzüšüšü¾ü¾üçüçýýý@ý@ýrýrý¥ý¥ýÛýÛþþþKþKþ‚þ‚þ¹þ¹þðþðÿ%ÿ%ÿ[ÿ[ÿŒÿŒÿ¼ÿ¼ÿëÿë;;\\~~››´´ÉÉ××ååððôôõõôôîîççÛÛÍÍ»»©©••€€eePP77 ÿìÿìÿÕÿÕÿ¾ÿ¾ÿ©ÿ©ÿ”ÿ”ÿ€ÿ€ÿlÿlÿ\ÿ\ÿPÿPÿDÿDÿ<ÿ<ÿ5ÿ5ÿ2ÿ2ÿ2ÿ2ÿ3ÿ3ÿ7ÿ7ÿ@ÿ@ÿGÿGÿRÿRÿ`ÿ`ÿpÿpÿ‚ÿ‚ÿ”ÿ”ÿ©ÿ©ÿÀÿÀÿÕÿÕÿîÿî 99PPkk‚‚››²²ÉÉÞÞòò""0099BBIIKKNNNNMMEE@@77--""ôôààÎ뻥¥{{eeRR<<))ÿìÿìÿÛÿÛÿËÿËÿ¹ÿ¹ÿ©ÿ©ÿ›ÿ›ÿÿÿ‚ÿ‚ÿyÿyÿpÿpÿiÿiÿbÿbÿ`ÿ`ÿ[ÿ[ÿYÿYÿWÿWÿYÿYÿ[ÿ[ÿ\ÿ\ÿ`ÿ`ÿeÿeÿiÿiÿpÿpÿuÿuÿ~ÿ~ÿ…ÿ…ÿŽÿŽÿ•ÿ•ÿžÿžÿ¥ÿ¥ÿ°ÿ°ÿ·ÿ·ÿ¾ÿ¾ÿÇÿÇÿÎÿÎÿÕÿÕÿÛÿÛÿâÿâÿçÿçÿìÿìgolly-2.5-src/gui-ios/Golly/control.h0000644000175100001440000000416612156145314014515 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _CONTROL_H_ #define _CONTROL_H_ #include "bigint.h" // for bigint #include "algos.h" // for algo_type // Data and routines for generating patterns: extern bool generating; // currently generating pattern? extern int minexpo; // step exponent at maximum delay (must be <= 0) bool StartGenerating(); void StopGenerating(); void NextGeneration(bool useinc); void ResetPattern(bool resetundo = true); void RestorePattern(bigint& gen, const char* filename, bigint& x, bigint& y, int mag, int base, int expo); void SetMinimumStepExponent(); void SetStepExponent(int newexpo); void SetGenIncrement(); bool CreateBorderCells(lifealgo* curralgo); bool DeleteBorderCells(lifealgo* curralgo); void ClearRect(lifealgo* curralgo, int top, int left, int bottom, int right); const char* ChangeGenCount(const char* genstring, bool inundoredo = false); void ClearOutsideGrid(); void ReduceCellStates(int newmaxstate); void ChangeRule(const std::string& rulestring); void ChangeAlgorithm(algo_type newalgotype, const char* newrule = "", bool inundoredo = false); std::string CreateRuleFiles(std::list& deprecated, std::list& keeprules); #endif golly-2.5-src/gui-ios/Golly/control.m0000644000175100001440000023455712156145314014533 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "writepattern.h" #include "util.h" // for linereader #include "utils.h" // for Warning, TimeInSeconds, Poller, event_checker, etc #include "prefs.h" // for allowundo, etc #include "status.h" // for ErrorMessage, etc #include "file.h" // for WritePattern, LoadPattern, etc #include "algos.h" // for *_ALGO, algo_type, CreateNewUniverse, etc #include "layer.h" // for currlayer, RestoreRule, etc #include "view.h" // for UpdatePatternAndStatus, draw_pending, etc #include "undo.h" // for UndoRedo #include "control.h" #include // for std::runtime_error and std::exception #include // for std::ostringstream #import "PatternViewController.h" // for UpdateStatus, BeginProgress, etc // ----------------------------------------------------------------------------- bool generating = false; // currently generating pattern? int minexpo = 0; // step exponent at maximum delay (must be <= 0) double begintime, endtime; // for timing info double begingen, endgen; // ditto const char* empty_pattern = "All cells are dead."; // ----------------------------------------------------------------------------- // macros for checking if a certain string exists in a list of strings #define FOUND(l,s) (std::find(l.begin(),l.end(),s) != l.end()) #define NOT_FOUND(l,s) (std::find(l.begin(),l.end(),s) == l.end()) // ----------------------------------------------------------------------------- bool SaveStartingPattern() { if ( currlayer->algo->getGeneration() > currlayer->startgen ) { // don't do anything if current gen count > starting gen return true; } // save current rule, dirty flag, scale, location, etc currlayer->startname = currlayer->currname; currlayer->startrule = currlayer->algo->getrule(); currlayer->startdirty = currlayer->dirty; currlayer->startmag = currlayer->view->getmag(); currlayer->startx = currlayer->view->x; currlayer->starty = currlayer->view->y; currlayer->startbase = currlayer->currbase; currlayer->startexpo = currlayer->currexpo; currlayer->startalgo = currlayer->algtype; // if this layer is a clone then save some settings in other clones if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->startname = cloneptr->currname; cloneptr->startx = cloneptr->view->x; cloneptr->starty = cloneptr->view->y; cloneptr->startmag = cloneptr->view->getmag(); cloneptr->startbase = cloneptr->currbase; cloneptr->startexpo = cloneptr->currexpo; } } } // save current selection currlayer->startsel = currlayer->currsel; if ( !currlayer->savestart ) { // no need to save pattern; ResetPattern will load currfile currlayer->startfile.clear(); return true; } // save starting pattern in tempstart file if ( currlayer->algo->hyperCapable() ) { // much faster to save pattern in a macrocell file const char* err = WritePattern(currlayer->tempstart.c_str(), MC_format, no_compression, 0, 0, 0, 0); if (err) { ErrorMessage(err); // don't allow user to continue generating return false; } } else { // can only save as RLE if edges are within getcell/setcell limits bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Starting pattern is outside +/- 10^9 boundary."); // don't allow user to continue generating return false; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); // use XRLE format so the pattern's top left location and the current // generation count are stored in the file const char* err = WritePattern(currlayer->tempstart.c_str(), XRLE_format, no_compression, itop, ileft, ibottom, iright); if (err) { ErrorMessage(err); // don't allow user to continue generating return false; } } currlayer->startfile = currlayer->tempstart; // ResetPattern will load tempstart return true; } // ----------------------------------------------------------------------------- void SetGenIncrement() { if (currlayer->currexpo > 0) { bigint inc = 1; // set increment to currbase^currexpo int i = currlayer->currexpo; while (i > 0) { inc.mul_smallint(currlayer->currbase); i--; } currlayer->algo->setIncrement(inc); } else { currlayer->algo->setIncrement(1); } } // ----------------------------------------------------------------------------- void SetStepExponent(int newexpo) { currlayer->currexpo = newexpo; if (currlayer->currexpo < minexpo) currlayer->currexpo = minexpo; SetGenIncrement(); } // ----------------------------------------------------------------------------- void SetMinimumStepExponent() { // set minexpo depending on mindelay and maxdelay minexpo = 0; if (mindelay > 0) { int d = mindelay; minexpo--; while (d < maxdelay) { d *= 2; minexpo--; } } } // ----------------------------------------------------------------------------- void ResetPattern(bool resetundo) { if (currlayer->algo->getGeneration() == currlayer->startgen) return; if (currlayer->algo->getGeneration() < currlayer->startgen) { // if this happens then startgen logic is wrong Warning("Current gen < starting gen!"); return; } if (currlayer->startfile.length() == 0 && currlayer->currfile.length() == 0) { // if this happens then savestart logic is wrong Warning("Starting pattern cannot be restored!"); return; } // save current algo and rule algo_type oldalgo = currlayer->algtype; std::string oldrule = currlayer->algo->getrule(); // restore pattern and settings saved by SaveStartingPattern; // first restore algorithm currlayer->algtype = currlayer->startalgo; // restore starting pattern if ( currlayer->startfile.length() == 0 ) { // restore pattern from currfile LoadPattern(currlayer->currfile.c_str(), ""); } else { // restore pattern from startfile LoadPattern(currlayer->startfile.c_str(), ""); } if (currlayer->algo->getGeneration() != currlayer->startgen) { // LoadPattern failed to reset the gen count to startgen // (probably because the user deleted the starting pattern) // so best to clear the pattern and reset the gen count CreateUniverse(); currlayer->algo->setGeneration(currlayer->startgen); } // ensure savestart flag is correct currlayer->savestart = currlayer->startfile.length() != 0; // restore settings saved by SaveStartingPattern RestoreRule(currlayer->startrule.c_str()); currlayer->currname = currlayer->startname; currlayer->dirty = currlayer->startdirty; if (restoreview) { currlayer->view->setpositionmag(currlayer->startx, currlayer->starty, currlayer->startmag); } // restore step size and set increment currlayer->currbase = currlayer->startbase; currlayer->currexpo = currlayer->startexpo; SetGenIncrement(); // if this layer is a clone then restore some settings in other clones if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->currname = cloneptr->startname; if (restoreview) { cloneptr->view->setpositionmag(cloneptr->startx, cloneptr->starty, cloneptr->startmag); } cloneptr->currbase = cloneptr->startbase; cloneptr->currexpo = cloneptr->startexpo; // also synchronize dirty flags and update items in Layer menu cloneptr->dirty = currlayer->dirty; //!!! UpdateLayerItem(i); } } } // restore selection currlayer->currsel = currlayer->startsel; // switch to default colors if algo/rule changed std::string newrule = currlayer->algo->getrule(); if (oldalgo != currlayer->algtype || oldrule != newrule) { UpdateLayerColors(); } // update window title in case currname, rule or dirty flag changed //!!! SetWindowTitle(currlayer->currname); if (allowundo) { if (resetundo) { // wind back the undo history to the starting pattern currlayer->undoredo->SyncUndoHistory(); } } } // ----------------------------------------------------------------------------- void RestorePattern(bigint& gen, const char* filename, bigint& x, bigint& y, int mag, int base, int expo) { // called to undo/redo a generating change if (gen == currlayer->startgen) { // restore starting pattern (false means don't call SyncUndoHistory) ResetPattern(false); } else { // restore pattern in given filename LoadPattern(filename, ""); if (currlayer->algo->getGeneration() != gen) { // filename could not be loaded for some reason, // so best to clear the pattern and set the expected gen count CreateUniverse(); currlayer->algo->setGeneration(gen); } // restore step size and set increment currlayer->currbase = base; currlayer->currexpo = expo; SetGenIncrement(); // restore position and scale, if allowed if (restoreview) currlayer->view->setpositionmag(x, y, mag); UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- const char* ChangeGenCount(const char* genstring, bool inundoredo) { // disallow alphabetic chars in genstring for (unsigned int i = 0; i < strlen(genstring); i++) if ( (genstring[i] >= 'a' && genstring[i] <= 'z') || (genstring[i] >= 'A' && genstring[i] <= 'Z') ) return "Alphabetic character is not allowed in generation string."; bigint oldgen = currlayer->algo->getGeneration(); bigint newgen(genstring); if (genstring[0] == '+' || genstring[0] == '-') { // leading +/- sign so make newgen relative to oldgen bigint relgen = newgen; newgen = oldgen; newgen += relgen; if (newgen < bigint::zero) newgen = bigint::zero; } // set stop_after_script BEFORE testing newgen == oldgen so scripts // can call setgen("+0") to prevent further generating //!!! if (inscript) stop_after_script = true; if (newgen == oldgen) return NULL; if (!inundoredo && allowundo && !currlayer->stayclean && inscript) { // script called setgen() //!!! SavePendingChanges(); } // need IsParityShifted() method??? if (currlayer->algtype == QLIFE_ALGO && newgen.odd() != oldgen.odd()) { // qlife stores pattern in different bits depending on gen parity, // so we need to create a new qlife universe, set its gen, copy the // current pattern to the new universe, then switch to that universe bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { return "Pattern is too big to copy."; } // create a new universe of same type and same rule lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); const char* err = newalgo->setrule(currlayer->algo->getrule()); if (err) { delete newalgo; return "Current rule is no longer valid!"; } newalgo->setGeneration(newgen); // copy pattern if ( !CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, newalgo, false, "Copying pattern") ) { delete newalgo; return "Failed to copy pattern."; } // switch to new universe delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); } else { currlayer->algo->setGeneration(newgen); } if (!inundoredo) { // save some settings for RememberSetGen below bigint oldstartgen = currlayer->startgen; bool oldsave = currlayer->savestart; // may need to change startgen and savestart if (oldgen == currlayer->startgen || newgen <= currlayer->startgen) { currlayer->startgen = newgen; currlayer->savestart = true; } if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberSetGen(oldgen, newgen, oldstartgen, oldsave); } } UpdateStatus(); return NULL; } // ----------------------------------------------------------------------------- static void JoinTwistedEdges(lifealgo* curralgo) { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (curralgo->htwist && curralgo->vtwist) { // cross-surface // eg. :C4,3 // a l k j i d // l A B C D i // h E F G H e // d I J K L a // i d c b a l for (int x = gl; x <= gr; x++) { int twistedx = gr - x + gl; int state = curralgo->getcell(twistedx, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(twistedx, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { int twistedy = gb - y + gt; int state = curralgo->getcell(gl, twistedy); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, twistedy); if (state > 0) curralgo->setcell(bl, y, state); } // copy grid's corner cells to SAME corners in border // (these cells are topologically different to non-corner cells) curralgo->setcell(bl, bt, curralgo->getcell(gl, gt)); curralgo->setcell(br, bt, curralgo->getcell(gr, gt)); curralgo->setcell(br, bb, curralgo->getcell(gr, gb)); curralgo->setcell(bl, bb, curralgo->getcell(gl, gb)); } else if (curralgo->htwist) { // Klein bottle with top and bottom edges twisted 180 degrees // eg. :K4*,3 // i l k j i l // d A B C D a // h E F G H e // l I J K L i // a d c b a d for (int x = gl; x <= gr; x++) { int twistedx = gr - x + gl; int state = curralgo->getcell(twistedx, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(twistedx, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with no twist int state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(bl, y, state); } // do corner cells curralgo->setcell(bl, bt, curralgo->getcell(gl, gb)); curralgo->setcell(br, bt, curralgo->getcell(gr, gb)); curralgo->setcell(bl, bb, curralgo->getcell(gl, gt)); curralgo->setcell(br, bb, curralgo->getcell(gr, gt)); } else { // curralgo->vtwist // Klein bottle with left and right edges twisted 180 degrees // eg. :K4,3* // d i j k l a // l A B C D i // h E F G H e // d I J K L a // l a b c d i for (int x = gl; x <= gr; x++) { // join top and bottom edges with no twist int state = curralgo->getcell(x, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(x, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { int twistedy = gb - y + gt; int state = curralgo->getcell(gl, twistedy); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, twistedy); if (state > 0) curralgo->setcell(bl, y, state); } // do corner cells curralgo->setcell(bl, bt, curralgo->getcell(gr, gt)); curralgo->setcell(br, bt, curralgo->getcell(gl, gt)); curralgo->setcell(bl, bb, curralgo->getcell(gr, gb)); curralgo->setcell(br, bb, curralgo->getcell(gl, gb)); } } // ----------------------------------------------------------------------------- static void JoinTwistedAndShiftedEdges(lifealgo* curralgo) { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (curralgo->hshift != 0) { // Klein bottle with shift by 1 on twisted horizontal edge (with even number of cells) // eg. :K4*+1,3 // j i l k j i // d A B C D a // h E F G H e // l I J K L i // b a d c b a int state, twistedx, shiftedx; for (int x = gl; x <= gr; x++) { // join top and bottom edges with a twist and then shift by 1 twistedx = gr - x + gl; shiftedx = twistedx - 1; if (shiftedx < gl) shiftedx = gr; state = curralgo->getcell(shiftedx, gb); if (state > 0) curralgo->setcell(x, bt, state); state = curralgo->getcell(shiftedx, gt); if (state > 0) curralgo->setcell(x, bb, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with no twist or shift state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(bl, y, state); } // do corner cells shiftedx = gl - 1; if (shiftedx < gl) shiftedx = gr; curralgo->setcell(bl, bt, curralgo->getcell(shiftedx, gb)); curralgo->setcell(bl, bb, curralgo->getcell(shiftedx, gt)); shiftedx = gr - 1; if (shiftedx < gl) shiftedx = gr; curralgo->setcell(br, bt, curralgo->getcell(shiftedx, gb)); curralgo->setcell(br, bb, curralgo->getcell(shiftedx, gt)); } else { // curralgo->vshift != 0 // Klein bottle with shift by 1 on twisted vertical edge (with even number of cells) // eg. :K3,4*+1 // f j k l d // c A B C a // l D E F j // i G H I g // f J K L d // c a b c a int state, twistedy, shiftedy; for (int x = gl; x <= gr; x++) { // join top and bottom edges with no twist or shift state = curralgo->getcell(x, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(x, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with a twist and then shift by 1 twistedy = gb - y + gt; shiftedy = twistedy - 1; if (shiftedy < gt) shiftedy = gb; state = curralgo->getcell(gr, shiftedy); if (state > 0) curralgo->setcell(bl, y, state); state = curralgo->getcell(gl, shiftedy); if (state > 0) curralgo->setcell(br, y, state); } // do corner cells shiftedy = gt - 1; if (shiftedy < gt) shiftedy = gb; curralgo->setcell(bl, bt, curralgo->getcell(gr, shiftedy)); curralgo->setcell(br, bt, curralgo->getcell(gl, shiftedy)); shiftedy = gb - 1; if (shiftedy < gt) shiftedy = gb; curralgo->setcell(bl, bb, curralgo->getcell(gr, shiftedy)); curralgo->setcell(br, bb, curralgo->getcell(gl, shiftedy)); } } // ----------------------------------------------------------------------------- static void JoinShiftedEdges(lifealgo* curralgo, int gwd, int ght, // grid wd and ht int hshift, int vshift) // horizontal and vertical shifts { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (hshift != 0) { // torus with horizontal shift // eg. :T4+1,3 // k l i j k l // d A B C D a // h E F G H e // l I J K L i // a b c d a b int state, shiftedx; for (int x = gl; x <= gr; x++) { // join top and bottom edges with a horizontal shift shiftedx = x - hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; state = curralgo->getcell(shiftedx, gb); if (state > 0) curralgo->setcell(x, bt, state); shiftedx = x + hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; state = curralgo->getcell(shiftedx, gt); if (state > 0) curralgo->setcell(x, bb, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with no shift state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(br, y, state); state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(bl, y, state); } // do corner cells shiftedx = gr - hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; curralgo->setcell(bl, bt, curralgo->getcell(shiftedx, gb)); shiftedx = gl - hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; curralgo->setcell(br, bt, curralgo->getcell(shiftedx, gb)); shiftedx = gr + hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; curralgo->setcell(bl, bb, curralgo->getcell(shiftedx, gt)); shiftedx = gl + hshift; if (shiftedx < gl) shiftedx += gwd; else if (shiftedx > gr) shiftedx -= gwd; curralgo->setcell(br, bb, curralgo->getcell(shiftedx, gt)); } else { // vshift != 0 // torus with vertical shift // eg. :T4,3+1 // h i j k l a // l A B C D e // d E F G H i // h I J K L a // l a b c d e int state, shiftedy; for (int x = gl; x <= gr; x++) { // join top and bottom edges with no shift state = curralgo->getcell(x, gt); if (state > 0) curralgo->setcell(x, bb, state); state = curralgo->getcell(x, gb); if (state > 0) curralgo->setcell(x, bt, state); } for (int y = gt; y <= gb; y++) { // join left and right edges with a vertical shift shiftedy = y - vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; state = curralgo->getcell(gr, shiftedy); if (state > 0) curralgo->setcell(bl, y, state); shiftedy = y + vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; state = curralgo->getcell(gl, shiftedy); if (state > 0) curralgo->setcell(br, y, state); } // do corner cells shiftedy = gb - vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; curralgo->setcell(bl, bt, curralgo->getcell(gr, shiftedy)); shiftedy = gb + vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; curralgo->setcell(br, bt, curralgo->getcell(gl, shiftedy)); shiftedy = gt - vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; curralgo->setcell(bl, bb, curralgo->getcell(gr, shiftedy)); shiftedy = gt + vshift; if (shiftedy < gt) shiftedy += ght; else if (shiftedy > gb) shiftedy -= ght; curralgo->setcell(br, bb, curralgo->getcell(gl, shiftedy)); } } // ----------------------------------------------------------------------------- static void JoinAdjacentEdges(lifealgo* curralgo, int pt, int pl, int pb, int pr) // pattern edges { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; // sphere // eg. :S3 // a a d g c // a A B C g // b D E F h // c G H I i // g c f i i // copy live cells in top edge to left border for (int x = pl; x <= pr; x++) { int state; int skip = curralgo->nextcell(x, gt, state); if (skip < 0) break; x += skip; if (state > 0) curralgo->setcell(bl, gt + (x - gl), state); } // copy live cells in left edge to top border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(gl + (y - gt), bt, state); } // copy live cells in bottom edge to right border for (int x = pl; x <= pr; x++) { int state; int skip = curralgo->nextcell(x, gb, state); if (skip < 0) break; x += skip; if (state > 0) curralgo->setcell(br, gt + (x - gl), state); } // copy live cells in right edge to bottom border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(gl + (y - gt), bb, state); } // copy grid's corner cells to SAME corners in border curralgo->setcell(bl, bt, curralgo->getcell(gl, gt)); curralgo->setcell(br, bt, curralgo->getcell(gr, gt)); curralgo->setcell(br, bb, curralgo->getcell(gr, gb)); curralgo->setcell(bl, bb, curralgo->getcell(gl, gb)); } // ----------------------------------------------------------------------------- static void JoinEdges(lifealgo* curralgo, int gwd, int ght, // grid wd and ht int pt, int pl, int pb, int pr) // pattern edges { // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); // border edges are 1 cell outside grid edges int bl = gl - 1; int bt = gt - 1; int br = gr + 1; int bb = gb + 1; if (ght > 0) { // copy live cells in top edge to bottom border for (int x = pl; x <= pr; x++) { int state; int skip = curralgo->nextcell(x, gt, state); if (skip < 0) break; x += skip; if (state > 0) curralgo->setcell(x, bb, state); } // copy live cells in bottom edge to top border for (int x = pl; x <= pr; x++) { int state; int skip = curralgo->nextcell(x, gb, state); if (skip < 0) break; x += skip; if (state > 0) curralgo->setcell(x, bt, state); } } if (gwd > 0) { // copy live cells in left edge to right border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = curralgo->getcell(gl, y); if (state > 0) curralgo->setcell(br, y, state); } // copy live cells in right edge to left border for (int y = pt; y <= pb; y++) { // no point using nextcell() here -- edge is only 1 cell wide int state = curralgo->getcell(gr, y); if (state > 0) curralgo->setcell(bl, y, state); } } if (gwd > 0 && ght > 0) { // copy grid's corner cells to opposite corners in border curralgo->setcell(bl, bt, curralgo->getcell(gr, gb)); curralgo->setcell(br, bt, curralgo->getcell(gl, gb)); curralgo->setcell(br, bb, curralgo->getcell(gl, gt)); curralgo->setcell(bl, bb, curralgo->getcell(gr, gt)); } } // ----------------------------------------------------------------------------- bool CreateBorderCells(lifealgo* curralgo) { // no need to do anything if there is no pattern or if the grid is a bounded plane if (curralgo->isEmpty() || curralgo->boundedplane) return true; int gwd = curralgo->gridwd; int ght = curralgo->gridht; bigint top, left, bottom, right; curralgo->findedges(&top, &left, &bottom, &right); // no need to do anything if pattern is completely inside grid edges if ( (gwd == 0 || (curralgo->gridleft < left && curralgo->gridright > right)) && (ght == 0 || (curralgo->gridtop < top && curralgo->gridbottom > bottom)) ) { return true; } // if grid has infinite width or height then pattern might be too big to use setcell/getcell if ( (gwd == 0 || ght == 0) && OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern is too big!"); // return false so caller can exit step() loop return false; } if (curralgo->sphere) { // to get a sphere we join top edge with left edge, and right edge with bottom edge; // note that grid must be square (gwd == ght) int pl = left.toint(); int pt = top.toint(); int pr = right.toint(); int pb = bottom.toint(); JoinAdjacentEdges(curralgo, pt, pl, pb, pr); } else if (curralgo->htwist || curralgo->vtwist) { // Klein bottle or cross-surface if ( (curralgo->htwist && curralgo->hshift != 0 && (gwd & 1) == 0) || (curralgo->vtwist && curralgo->vshift != 0 && (ght & 1) == 0) ) { // Klein bottle with shift is only possible if the shift is on the // twisted edge and that edge has an even number of cells JoinTwistedAndShiftedEdges(curralgo); } else { JoinTwistedEdges(curralgo); } } else if (curralgo->hshift != 0 || curralgo->vshift != 0) { // torus with horizontal or vertical shift JoinShiftedEdges(curralgo, gwd, ght, curralgo->hshift, curralgo->vshift); } else { // unshifted torus or infinite tube int pl = left.toint(); int pt = top.toint(); int pr = right.toint(); int pb = bottom.toint(); JoinEdges(curralgo, gwd, ght, pt, pl, pb, pr); } curralgo->endofpattern(); return true; } // ----------------------------------------------------------------------------- void ClearRect(lifealgo* curralgo, int top, int left, int bottom, int right) { int cx, cy, v; for ( cy = top; cy <= bottom; cy++ ) { for ( cx = left; cx <= right; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > right) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell so delete it cx += skip; curralgo->setcell(cx, cy, 0); } else { cx = right + 1; // done this row } } } } // ----------------------------------------------------------------------------- bool DeleteBorderCells(lifealgo* curralgo) { // no need to do anything if there is no pattern if (curralgo->isEmpty()) return true; int gwd = curralgo->gridwd; int ght = curralgo->gridht; // need to find pattern edges because pattern may have expanded beyond grid // (typically by 2 cells, but could be more if rule allows births in empty space) bigint top, left, bottom, right; curralgo->findedges(&top, &left, &bottom, &right); // no need to do anything if grid encloses entire pattern if ( (gwd == 0 || (curralgo->gridleft <= left && curralgo->gridright >= right)) && (ght == 0 || (curralgo->gridtop <= top && curralgo->gridbottom >= bottom)) ) { return true; } if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern is too big!"); // return false so caller can exit step() loop return false; } // set pattern edges int pl = left.toint(); int pt = top.toint(); int pr = right.toint(); int pb = bottom.toint(); // set grid edges int gl = curralgo->gridleft.toint(); int gt = curralgo->gridtop.toint(); int gr = curralgo->gridright.toint(); int gb = curralgo->gridbottom.toint(); if (ght > 0 && pt < gt) { // delete live cells above grid ClearRect(curralgo, pt, pl, gt-1, pr); pt = gt; // reduce size of rect below } if (ght > 0 && pb > gb) { // delete live cells below grid ClearRect(curralgo, gb+1, pl, pb, pr); pb = gb; // reduce size of rect below } if (gwd > 0 && pl < gl) { // delete live cells left of grid ClearRect(curralgo, pt, pl, pb, gl-1); } if (gwd > 0 && pr > gr) { // delete live cells right of grid ClearRect(curralgo, pt, gr+1, pb, pr); } curralgo->endofpattern(); return true; } // ----------------------------------------------------------------------------- void DisplayTimingInfo() { endtime = TimeInSeconds(); if (endtime <= begintime) endtime = begintime + 0.000001; endgen = currlayer->algo->getGeneration().todouble(); double secs = endtime - begintime; double gens = endgen - begingen; char s[128]; sprintf(s, "%g gens in %g secs (%g gens/sec).", gens, secs, gens/secs); DisplayMessage(s); } // ----------------------------------------------------------------------------- bool StartGenerating() { if (generating) Warning("Bug detected in StartGenerating!"); lifealgo* curralgo = currlayer->algo; if (curralgo->isEmpty()) { ErrorMessage(empty_pattern); return false; } if (!SaveStartingPattern()) { return false; } if (allowundo) currlayer->undoredo->RememberGenStart(); // only show hashing info while generating lifealgo::setVerbose(currlayer->showhashinfo); // for DisplayTimingInfo begintime = TimeInSeconds(); begingen = curralgo->getGeneration().todouble(); generating = true; PollerReset(); // caller will start a repeating timer return true; } // ----------------------------------------------------------------------------- void StopGenerating() { if (!generating) Warning("Bug detected in StopGenerating!"); generating = false; PollerInterrupt(); if (showtiming) DisplayTimingInfo(); lifealgo::setVerbose(0); if (event_checker > 0) { // we're currently in the event poller somewhere inside step(), so we must let // step() complete and only call RememberGenFinish at the end of NextGeneration } else { if (allowundo) currlayer->undoredo->RememberGenFinish(); } // caller will stop the timer } // ----------------------------------------------------------------------------- void NextGeneration(bool useinc) { lifealgo* curralgo = currlayer->algo; bool boundedgrid = (curralgo->gridwd > 0 || curralgo->gridht > 0); if (generating) { // we were called via timer so StartGenerating has already checked // if the pattern is empty, etc (note that useinc is also true) } else { // we were called via Next/Step button if (curralgo->isEmpty()) { ErrorMessage(empty_pattern); return; } if (!SaveStartingPattern()) { return; } if (allowundo) currlayer->undoredo->RememberGenStart(); // only show hashing info while generating lifealgo::setVerbose(currlayer->showhashinfo); if (useinc && curralgo->getIncrement() > bigint::one) { // for DisplayTimingInfo begintime = TimeInSeconds(); begingen = curralgo->getGeneration().todouble(); } PollerReset(); } if (useinc) { // step by current increment if (boundedgrid) { // temporarily set the increment to 1 so we can call CreateBorderCells() // and DeleteBorderCells() around each step() int savebase = currlayer->currbase; int saveexpo = currlayer->currexpo; bigint inc = curralgo->getIncrement(); curralgo->setIncrement(1); while (inc > 0) { if (Poller()->checkevents()) break; if (savebase != currlayer->currbase || saveexpo != currlayer->currexpo) { // user changed step base/exponent, so reset increment to 1 inc = curralgo->getIncrement(); curralgo->setIncrement(1); } if (!CreateBorderCells(curralgo)) break; curralgo->step(); if (!DeleteBorderCells(curralgo)) break; inc -= 1; } // safe way to restore correct increment in case user altered base/expo in above loop SetGenIncrement(); } else { curralgo->step(); } } else { // step by 1 gen bigint saveinc = curralgo->getIncrement(); curralgo->setIncrement(1); if (boundedgrid) CreateBorderCells(curralgo); curralgo->step(); if (boundedgrid) DeleteBorderCells(curralgo); curralgo->setIncrement(saveinc); } if (!generating) { if (showtiming && useinc && curralgo->getIncrement() > bigint::one) DisplayTimingInfo(); lifealgo::setVerbose(0); if (allowundo) currlayer->undoredo->RememberGenFinish(); } // autofit is only used when doing many gens if (currlayer->autofit && (generating || useinc)) { //!!! FitInView(0); } if (draw_pending) { draw_pending = false; TouchBegan(pendingx, pendingy); } } // ----------------------------------------------------------------------------- void ClearOutsideGrid() { // check current pattern and clear any live cells outside bounded grid bool patternchanged = false; bool savechanges = allowundo && !currlayer->stayclean; // might also need to truncate selection currlayer->currsel.CheckGridEdges(); if (currlayer->algo->isEmpty()) return; // check if current pattern is too big to use nextcell/setcell bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern too big to check (outside +/- 10^9 boundary)."); return; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); // no need to do anything if pattern is entirely within grid int gtop = currlayer->algo->gridtop.toint(); int gleft = currlayer->algo->gridleft.toint(); int gbottom = currlayer->algo->gridbottom.toint(); int gright = currlayer->algo->gridright.toint(); if (currlayer->algo->gridwd == 0) { // grid has infinite width gleft = INT_MIN; gright = INT_MAX; } if (currlayer->algo->gridht == 0) { // grid has infinite height gtop = INT_MIN; gbottom = INT_MAX; } if (itop >= gtop && ileft >= gleft && ibottom <= gbottom && iright <= gright) { return; } int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; bool abort = false; int v = 0; BeginProgress("Checking cells outside grid"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (cx < gleft || cx > gright || cy < gtop || cy > gbottom) { // clear cell outside grid if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); curralgo->setcell(cx, cy, 0); patternchanged = true; } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, ""); if (abort) break; } } if (abort) break; } curralgo->endofpattern(); EndProgress(); if (patternchanged) { ErrorMessage("Pattern was truncated (live cells were outside grid)."); } } // ----------------------------------------------------------------------------- void ReduceCellStates(int newmaxstate) { // check current pattern and reduce any cell states > newmaxstate bool patternchanged = false; bool savechanges = allowundo && !currlayer->stayclean; // check if current pattern is too big to use nextcell/setcell bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern too big to check (outside +/- 10^9 boundary)."); return; } int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; bool abort = false; int v = 0; BeginProgress("Checking cell states"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (v > newmaxstate) { // reduce cell's current state to largest state if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, newmaxstate); curralgo->setcell(cx, cy, newmaxstate); patternchanged = true; } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, ""); if (abort) break; } } if (abort) break; } curralgo->endofpattern(); EndProgress(); if (patternchanged) { ErrorMessage("Pattern has changed (new rule has fewer states)."); } } // ----------------------------------------------------------------------------- void ChangeRule(const std::string& rulestring) { // load recently installed .rule/table/tree/colors/icons file std::string oldrule = currlayer->algo->getrule(); int oldmaxstate = currlayer->algo->NumCellStates() - 1; // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange SaveCurrentSelection(); const char* err = currlayer->algo->setrule( rulestring.c_str() ); if (err) { // try to find another algorithm that supports the given rule for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { lifealgo* tempalgo = CreateNewUniverse(i); err = tempalgo->setrule( rulestring.c_str() ); delete tempalgo; if (!err) { // change the current algorithm and switch to the new rule ChangeAlgorithm(i, rulestring.c_str()); if (i != currlayer->algtype) { RestoreRule(oldrule.c_str()); Warning("Algorithm could not be changed (pattern is too big to convert)."); return; } else { UpdateEverything(); return; } } } } // should only get here if .rule/table/tree file contains some sort of error RestoreRule(oldrule.c_str()); Warning("New rule is not valid in any algorithm!"); return; } std::string newrule = currlayer->algo->getrule(); if (oldrule != newrule) { UpdateStatus(); // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } } // new table/tree might have changed the number of cell states; // if there are fewer states then pattern might change int newmaxstate = currlayer->algo->NumCellStates() - 1; if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } // set colors/icons for new rule UpdateLayerColors(); // pattern might have changed or colors/icons might have changed UpdateEverything(); if (oldrule != newrule) { if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberRuleChange(oldrule.c_str()); } } } // ----------------------------------------------------------------------------- void ChangeAlgorithm(algo_type newalgotype, const char* newrule, bool inundoredo) { if (newalgotype == currlayer->algtype) return; // check if current pattern is too big to use nextcell/setcell bigint top, left, bottom, right; if ( !currlayer->algo->isEmpty() ) { currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern cannot be converted (outside +/- 10^9 boundary)."); return; } } // save changes if undo/redo is enabled and script isn't constructing a pattern // and we're not undoing/redoing an earlier algo change bool savechanges = allowundo && !currlayer->stayclean && !inundoredo; if (savechanges && inscript) { // note that we must save pending gen changes BEFORE changing algo type // otherwise temporary files won't be the correct type (mc or rle) //!!! SavePendingChanges(); } // selection might change if grid becomes smaller, // so save current selection for RememberAlgoChange if (savechanges) SaveCurrentSelection(); bool rulechanged = false; std::string oldrule = currlayer->algo->getrule(); // change algorithm type, reset step size, and update status bar algo_type oldalgo = currlayer->algtype; currlayer->algtype = newalgotype; currlayer->currbase = algoinfo[newalgotype]->defbase; currlayer->currexpo = 0; UpdateStatus(); // create a new universe of the requested flavor lifealgo* newalgo = CreateNewUniverse(newalgotype); if (inundoredo) { // switch to given newrule const char* err = newalgo->setrule(newrule); if (err) newalgo->setrule(newalgo->DefaultRule()); } else { const char* err; if (newrule[0] == 0) { // try to use same rule err = newalgo->setrule(currlayer->algo->getrule()); } else { // switch to newrule err = newalgo->setrule(newrule); rulechanged = true; } if (err) { std::string defrule = newalgo->DefaultRule(); size_t oldpos = oldrule.find(':'); if (newrule[0] == 0 && oldpos != std::string::npos) { // switch to new algo's default rule, but preserve the topology in oldrule // so we can do things like switch from "LifeHistory:T30,20" in RuleLoader // to "B3/S23:T30,20" in QuickLife size_t defpos = defrule.find(':'); if (defpos != std::string::npos) { // default rule shouldn't have a suffix but play safe and remove it defrule = defrule.substr(0, defpos); } defrule += ":"; defrule += oldrule.substr(oldpos+1); } err = newalgo->setrule(defrule.c_str()); // shouldn't ever fail but play safe if (err) newalgo->setrule( newalgo->DefaultRule() ); rulechanged = true; } } // set same gen count newalgo->setGeneration( currlayer->algo->getGeneration() ); bool patternchanged = false; if ( !currlayer->algo->isEmpty() ) { // copy pattern in current universe to new universe int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; bool abort = false; int v = 0; BeginProgress("Converting pattern"); // set newalgo's grid edges so we can save cells that are outside grid int gtop = newalgo->gridtop.toint(); int gleft = newalgo->gridleft.toint(); int gbottom = newalgo->gridbottom.toint(); int gright = newalgo->gridright.toint(); if (newalgo->gridwd == 0) { // grid has infinite width gleft = INT_MIN; gright = INT_MAX; } if (newalgo->gridht == 0) { // grid has infinite height gtop = INT_MIN; gbottom = INT_MAX; } // need to check for state change if new algo has fewer states than old algo int newmaxstate = newalgo->NumCellStates() - 1; lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; if (cx < gleft || cx > gright || cy < gtop || cy > gbottom) { // cx,cy is outside grid if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); // no need to clear cell from curralgo (that universe will soon be deleted) patternchanged = true; } else { if (v > newmaxstate) { // reduce v to largest state in new algo if (savechanges) currlayer->undoredo->SaveCellChange(cx, cy, v, newmaxstate); v = newmaxstate; patternchanged = true; } newalgo->setcell(cx, cy, v); } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, ""); if (abort) break; } } if (abort) break; } newalgo->endofpattern(); EndProgress(); } // delete old universe and point current universe to new universe delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); // if new grid is bounded then we might need to truncate the selection if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { currlayer->currsel.CheckGridEdges(); } // switch to default colors for new algo+rule UpdateLayerColors(); if (!inundoredo) { if (rulechanged) { // if pattern exists and is at starting gen then set savestart true // so that SaveStartingPattern will save pattern to suitable file // (and thus ResetPattern will work correctly) if ( currlayer->algo->getGeneration() == currlayer->startgen && !currlayer->algo->isEmpty() ) { currlayer->savestart = true; } if (newrule[0] == 0) { if (patternchanged) { ErrorMessage("Rule has changed and pattern has changed."); } else { // don't beep DisplayMessage("Rule has changed."); } } else { if (patternchanged) { ErrorMessage("Algorithm has changed and pattern has changed."); } else { // don't beep DisplayMessage("Algorithm has changed."); } } } else if (patternchanged) { ErrorMessage("Pattern has changed."); } } if (savechanges) { currlayer->undoredo->RememberAlgoChange(oldalgo, oldrule.c_str()); } if (!inundoredo && !inscript) { // do this AFTER RememberAlgoChange so Undo button becomes enabled UpdateEverything(); } } // ----------------------------------------------------------------------------- static std::string CreateTABLE(const std::string& tablepath) { std::string contents = "\n@TABLE\n\n"; // append contents of .table file FILE* f = fopen(tablepath.c_str(), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; contents += linebuf; contents += "\n"; } reader.close(); } else { std::ostringstream oss; oss << "Could not read .table file:\n" << tablepath.c_str(); throw std::runtime_error(oss.str().c_str()); } return contents; } // ----------------------------------------------------------------------------- static std::string CreateEmptyTABLE(const std::string& folder, const std::string& prefix, std::list& allfiles) { // create a valid table that does nothing std::string contents = "\nThis file contains colors and/or icons shared by "; contents += prefix; contents += "-* rules.\n"; contents += "\n@TABLE\n\n"; // search allfiles for 1st prefix-*.table/tree file and extract numstates and neighborhood std::string numstates, neighborhood; std::list::iterator it; for (it=allfiles.begin(); it!=allfiles.end(); ++it) { std::string filename = *it; if (EndsWith(filename,".table") || EndsWith(filename,".tree")) { size_t hyphenpos = filename.rfind('-'); if (hyphenpos != std::string::npos && prefix == filename.substr(0,hyphenpos)) { std::string filepath = folder + filename; FILE* f = fopen(filepath.c_str(), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; if (strncmp(linebuf, "n_states:", 9) == 0) { numstates = linebuf; numstates += "\n"; } else if (strncmp(linebuf, "num_states=", 11) == 0) { // convert to table syntax numstates = "n_states:" + std::string(linebuf+11); numstates += "\n"; } else if (strncmp(linebuf, "neighborhood:", 13) == 0) { neighborhood = linebuf; numstates += "\n"; break; } else if (strncmp(linebuf, "num_neighbors=", 14) == 0) { // convert to table syntax neighborhood = "neighborhood:"; if (linebuf[14] == '4') neighborhood += "vonNeumann\n"; else neighborhood += "Moore\n"; break; } } reader.close(); } else { std::ostringstream oss; oss << "Could not read .table/tree file:\n" << filepath.c_str(); throw std::runtime_error(oss.str().c_str()); } } } } if (numstates.length() == 0) { numstates = "n_states:256\n"; std::string msg = "Could not find " + prefix; msg += "-*.table/tree to set n_states in "; msg += prefix; msg += "-shared.rule."; Warning(msg.c_str()); } contents += numstates; contents += neighborhood; contents += "symmetries:none\n"; // anything valid would do contents += "# do nothing\n"; // no transitions return contents; } // ----------------------------------------------------------------------------- static std::string CreateTREE(const std::string& treepath) { std::string contents = "\n@TREE\n\n"; // append contents of .tree file FILE* f = fopen(treepath.c_str(), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; contents += linebuf; contents += "\n"; } reader.close(); } else { std::ostringstream oss; oss << "Could not read .tree file:\n" << treepath.c_str(); throw std::runtime_error(oss.str().c_str()); } return contents; } // ----------------------------------------------------------------------------- static std::string CreateCOLORS(const std::string& colorspath) { std::string contents = "\n@COLORS\n\n"; FILE* f = fopen(colorspath.c_str(), "r"); if (f) { const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; linereader reader(f); while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; int skip = 0; if (strncmp(linebuf, "color", 5) == 0 || strncmp(linebuf, "gradient", 8) == 0) { // strip off everything before 1st digit while (linebuf[skip] && (linebuf[skip] < '0' || linebuf[skip] > '9')) { skip++; } } contents += linebuf + skip; contents += "\n"; } reader.close(); } else { std::ostringstream oss; oss << "Could not read .colors file:\n" << colorspath.c_str(); throw std::runtime_error(oss.str().c_str()); } return contents; } // ----------------------------------------------------------------------------- static unsigned char* GetRGBAPixels(CGImageRef image) { int wd = CGImageGetWidth(image); int ht = CGImageGetHeight(image); int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * wd; int bitsPerComponent = 8; // allocate memory to store image's RGBA bitmap data unsigned char* pxldata = (unsigned char*) calloc(wd * ht * 4, 1); if (pxldata == NULL) return NULL; CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(pxldata, wd, ht, bitsPerComponent, bytesPerRow, colorspace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextDrawImage(ctx, CGRectMake(0, 0, wd, ht), image); CGContextRelease(ctx); CGColorSpaceRelease(colorspace); // pxldata now contains the image bitmap in RGBA pixel format return pxldata; } // ----------------------------------------------------------------------------- static bool OneColor(CGImageRef image, unsigned char* R, unsigned char* G, unsigned char* B) { unsigned char* pxldata = GetRGBAPixels(image); if (pxldata == NULL) return false; // pxldata contains the image bitmap in RGBA pixel format int color = (pxldata[0] << 16) + (pxldata[1] << 8) + pxldata[2]; int byte = 0; int wd = CGImageGetWidth(image); int ht = CGImageGetHeight(image); for (int i = 0; i < wd*ht; i++) { if (color != (pxldata[byte] << 16) + (pxldata[byte+1] << 8) + pxldata[byte+2]) { // there is more than one color free(pxldata); return false; } byte += 4; } // return the single color *R = pxldata[0]; *G = pxldata[1]; *B = pxldata[2]; free(pxldata); return true; } // ----------------------------------------------------------------------------- static std::string CreateStateColors(CGImageRef image, int numicons) { std::string contents = "\n@COLORS\n\n"; // if the last icon has only 1 color then assume it is the extra 15x15 icon // supplied to set the color of state 0 char s[128]; if (numicons > 1) { CGImageRef icon = CGImageCreateWithImageInRect(image,CGRectMake((numicons-1)*15, 0, 15, 15)); unsigned char R, G, B; if (OneColor(icon, &R, &G, &B)) { sprintf(s, "0 %d %d %d\n", R, G, B); contents += s; numicons--; } } // set non-icon colors for each live state to the average of the non-black pixels // in each 15x15 icon (note we've skipped the extra icon detected above) for (int i = 0; i < numicons; i++) { CGImageRef icon = CGImageCreateWithImageInRect(image,CGRectMake(i*15, 0, 15, 15)); int nbcount = 0; // non-black pixels int totalR = 0; int totalG = 0; int totalB = 0; unsigned char* idata = GetRGBAPixels(icon); if (idata) { for (int y = 0; y < 15; y++) { for (int x = 0; x < 15; x++) { int pos = (y * 15 + x) * 4; unsigned char R = idata[pos]; unsigned char G = idata[pos+1]; unsigned char B = idata[pos+2]; if (R > 0 || G > 0 || B > 0) { // non-black pixel nbcount++; totalR += R; totalG += G; totalB += B; } } } free(idata); } if (nbcount > 0) { sprintf(s, "%d %d %d %d\n", i+1, totalR/nbcount, totalG/nbcount, totalB/nbcount); contents += s; } else { // unlikely, but avoid div by zero sprintf(s, "%d 0 0 0\n", i+1); contents += s; } } return contents; } // ----------------------------------------------------------------------------- static std::string hex2(int i) { // convert given number from 0..255 into 2 hex digits std::string result = "xx"; const char* hexdigit = "0123456789ABCDEF"; result[0] = hexdigit[i / 16]; result[1] = hexdigit[i % 16]; return result; } // ----------------------------------------------------------------------------- static std::list GetColors(CGImageRef image) { // return the list of colors used in the given image std::list result; unsigned char* pxldata = GetRGBAPixels(image); if (pxldata) { // pxldata contains the image bitmap in RGBA pixel format int byte = 0; int wd = CGImageGetWidth(image); int ht = CGImageGetHeight(image); for (int i = 0; i < wd*ht; i++) { int color = (pxldata[byte] << 16) + (pxldata[byte+1] << 8) + pxldata[byte+2]; if (std::find(result.begin(),result.end(),color) == result.end()) { // first time we've seen this color result.push_back(color); } byte += 4; } free(pxldata); } return result; } // ----------------------------------------------------------------------------- static std::string CreateXPM(const std::string& iconspath, CGImageRef image, int size, int numicons) { // create XPM data for given set of icons std::string contents = "\nXPM\n"; char s[128]; int charsperpixel = 1; const char* cindex = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; std::list colors = GetColors(image); int numcolors = colors.size(); if (numcolors > 256) { std::ostringstream oss; oss << "Image in " << iconspath.c_str() << " has more than 256 colors."; throw std::runtime_error(oss.str().c_str()); } if (numcolors > 26) charsperpixel = 2; // AABA..PA, ABBB..PB, ... , APBP..PP contents += "/* width height num_colors chars_per_pixel */\n"; sprintf(s, "\"%d %d %d %d\"\n", size, size*numicons, numcolors, charsperpixel); contents += s; contents += "/* colors */\n"; int n = 0; for (std::list::iterator it = colors.begin(); it != colors.end(); ++it) { int RGB = *it; unsigned char R = (RGB & 0xFF0000) >> 16; unsigned char G = (RGB & 0x00FF00) >> 8; unsigned char B = (RGB & 0x0000FF); if (R == 0 && G == 0 && B == 0) { // nicer to show . or .. for black pixels contents += "\"."; if (charsperpixel == 2) contents += "."; contents += " c #000000\"\n"; } else { std::string hexcolor = "#"; hexcolor += hex2(R); hexcolor += hex2(G); hexcolor += hex2(B); contents += "\""; if (charsperpixel == 1) { contents += cindex[n]; } else { contents += cindex[n % 16]; contents += cindex[n / 16]; } contents += " c "; contents += hexcolor; contents += "\"\n"; } n++; } for (int i = 0; i < numicons; i++) { sprintf(s, "/* icon for state %d */\n", i+1); contents += s; CGImageRef icon = CGImageCreateWithImageInRect(image,CGRectMake(i*15, 0, size, size)); unsigned char* idata = GetRGBAPixels(icon); if (idata) { for (int y = 0; y < size; y++) { contents += "\""; for (int x = 0; x < size; x++) { long pos = (y * size + x) * 4; unsigned char R = idata[pos]; unsigned char G = idata[pos+1]; unsigned char B = idata[pos+2]; if (R == 0 && G == 0 && B == 0) { // nicer to show . or .. for black pixels contents += "."; if (charsperpixel == 2) contents += "."; } else { n = 0; int thisRGB = (R << 16) + (G << 8) + B; for (std::list::iterator it = colors.begin(); it != colors.end(); ++it) { if (thisRGB == *it) break; n++; } if (charsperpixel == 1) { contents += cindex[n]; } else { contents += cindex[n % 16]; contents += cindex[n / 16]; } } } contents += "\"\n"; } free(idata); } } return contents; } // ----------------------------------------------------------------------------- static std::string CreateICONS(const std::string& iconspath, bool nocolors) { std::string contents = "\n@ICONS\n"; CGImageRef image = [UIImage imageWithContentsOfFile: [NSString stringWithCString:iconspath.c_str() encoding:NSUTF8StringEncoding]].CGImage; if (image == NULL) { std::ostringstream oss; oss << "Could not load image from .icons file:\n" << iconspath.c_str(); throw std::runtime_error(oss.str().c_str()); } else { // might need to convert 2-color .icons image to black-and-white image = ConvertOldMonochromeIcons(image); int wd = CGImageGetWidth(image); int ht = CGImageGetHeight(image); if (ht != 15 && ht != 22) { std::ostringstream oss; oss << "Image in " << iconspath.c_str() << " has incorrect height (should be 15 or 22)."; throw std::runtime_error(oss.str().c_str()); } if (wd % 15 > 0) { std::ostringstream oss; oss << "Image in " << iconspath.c_str() << " has incorrect width (should be multiple of 15)."; throw std::runtime_error(oss.str().c_str()); } int numicons = wd / 15; if (nocolors && MultiColorImage(image)) { // there was no .colors file and .icons file is multi-color, // so prepend a @COLORS section that sets non-icon colors contents = CreateStateColors(CGImageCreateWithImageInRect(image,CGRectMake(0,0,wd,15)), numicons) + contents; } if (ht == 15) { contents += CreateXPM(iconspath, image, 15, numicons); } else { contents += CreateXPM(iconspath, CGImageCreateWithImageInRect(image,CGRectMake(0,0,wd,15)), 15, numicons); contents += CreateXPM(iconspath, CGImageCreateWithImageInRect(image,CGRectMake(0,15,wd,7)), 7, numicons); } } return contents; } // ----------------------------------------------------------------------------- static void CreateOneRule(const std::string& rulefile, const std::string& folder, std::list& allfiles, std::string& htmlinfo) { std::string tabledata, treedata, colordata, icondata; std::string rulename = rulefile.substr(0,rulefile.rfind('.')); if (EndsWith(rulename,"-shared")) { // create a .rule file with colors and/or icons shared by other .rule files std::string prefix = rulename.substr(0,rulename.rfind('-')); tabledata = CreateEmptyTABLE(folder, prefix, allfiles); std::string sharedcolors = prefix + ".colors"; if (FOUND(allfiles,sharedcolors)) colordata = CreateCOLORS(folder + sharedcolors); std::string sharedicons = prefix + ".icons"; if (FOUND(allfiles,sharedicons)) icondata = CreateICONS(folder + sharedicons, colordata.length() == 0); } else { std::string tablefile = rulename + ".table"; std::string treefile = rulename + ".tree"; std::string colorsfile = rulename + ".colors"; std::string iconsfile = rulename + ".icons"; if (FOUND(allfiles,tablefile)) tabledata = CreateTABLE(folder + tablefile); if (FOUND(allfiles,treefile)) treedata = CreateTREE(folder + treefile); if (FOUND(allfiles,colorsfile)) colordata = CreateCOLORS(folder + colorsfile); if (FOUND(allfiles,iconsfile)) icondata = CreateICONS(folder + iconsfile, colordata.length() == 0); } std::string contents = "@RULE " + rulename + "\n"; contents += tabledata; contents += treedata; contents += colordata; contents += icondata; // write contents to .rule file std::string rulepath = folder + rulefile; FILE* outfile = fopen(rulepath.c_str(), "w"); if (outfile) { if (fputs(contents.c_str(), outfile) == EOF) { fclose(outfile); std::ostringstream oss; oss << "Could not write data to rule file:\n" << rulepath.c_str(); throw std::runtime_error(oss.str().c_str()); } fclose(outfile); } else { std::ostringstream oss; oss << "Could not create rule file:\n" << rulepath.c_str(); throw std::runtime_error(oss.str().c_str()); } // append created file to htmlinfo htmlinfo += ""; htmlinfo += rulefile; htmlinfo += "
\n"; } // ----------------------------------------------------------------------------- static bool SharedColorsIcons(const std::string& prefix, std::list& allfiles) { // return true if prefix.colors/icons is shared by at least one prefix-*.table/tree file std::list::iterator it; for (it=allfiles.begin(); it!=allfiles.end(); ++it) { std::string filename = *it; if (EndsWith(filename,".table") || EndsWith(filename,".tree")) { size_t hyphenpos = filename.rfind('-'); if (hyphenpos != std::string::npos && prefix == filename.substr(0,hyphenpos)) { return true; } } } // prefix-*.table/tree does not exist in allfiles return false; } // ----------------------------------------------------------------------------- std::string CreateRuleFiles(std::list& deprecated, std::list& keeprules) { // use the given list of deprecated .table/tree/colors/icons files // to create new .rule files, except for those .rule files in keeprules std::string htmlinfo; bool aborted = false; try { // create a list of candidate .rule files to be created std::string rulefile, filename, rulename; std::list candidates; std::list::iterator it; for (it=deprecated.begin(); it!=deprecated.end(); ++it) { filename = *it; rulename = filename.substr(0,filename.rfind('.')); if (EndsWith(filename,".colors") || EndsWith(filename,".icons")) { if (SharedColorsIcons(rulename, deprecated)) { // colors and/or icons will be shared by one or more rulename-*.rule files rulefile = rulename + "-shared.rule"; } else { rulefile = rulename + ".rule"; } } else { // .table/tree file rulefile = rulename + ".rule"; } // add .rule file to candidates if it hasn't been added yet // and if it isn't in the keeprules list if (NOT_FOUND(candidates,rulefile) && NOT_FOUND(keeprules,rulefile)) { candidates.push_back(rulefile); } } // create the new .rule files (we overwrite any existing .rule files // that aren't in keeprules) for (it=candidates.begin(); it!=candidates.end(); ++it) { CreateOneRule(*it, userrules, deprecated, htmlinfo); } } catch(const std::exception& e) { // display message set by throw std::runtime_error(...) Warning(e.what()); aborted = true; // nice to also show error message in help window htmlinfo += "\n

*** CONVERSION ABORTED DUE TO ERROR ***\n

"; htmlinfo += std::string(e.what()); } if (!aborted) { // delete all the deprecated files std::list::iterator it; for (it=deprecated.begin(); it!=deprecated.end(); ++it) { RemoveFile(userrules + *it); } } return htmlinfo; } golly-2.5-src/gui-ios/Golly/Default-Landscape~ipad.png0000644000175100001440000012274412156145314017705 00000000000000‰PNG  IHDRìò)R!tEXtSoftwareGraphicConverter (Intel)w‡ú¥~IDATxœìùS[×ÇÕö§þý©Óßš_;¤igú[;$vbgâŽí$Mbj³Û`ÇÄ@‚ñ³¯’ˆ}Ç VKBB`ÈŒ͎ˆÝ~‰¦‚¤'¡íIʹóùé¼÷îýžwï;ç\/˜Ãù±=z´³³Ó`0ü—5jÔ¨Q£F5j~ÔPä£Ô?räÇÔ“66_AAáÇ|ž°Wý¿õÖÛ¬K!‚ ‚ ÂÝ6¶Þ|ó-΃-¬K!‚ ‚  øçÌ?[`]AAAÅ?ǰ±EAAÄÏÚAAÄϦ ÀèØD}CS±¸¬PPäB>Ñ!ºEçŽ)žžÑ÷¨Ôµµubq©@ à{Yƒ$ƒ<ˆ„TÇ|”É‘Ñ1'O}päcžáè»Çñ‰1.F÷K©J¥êZbbXXX`PPðùó (8ØKxÿý¬k°©ÐÛæ³‰9Å̲I ‚8€k³Ã;ÇÞsUä÷ª8ÆrY×༠>ôÀK(ž/\ø¦XÝ(•êqYsK›T®Tôh\‚R¥Å':D·èC*šÌÎÍKZ[+**”JåÔÔÔìììâââ‚—5H‚0ȃHH…`È>”›¹¹ù'O}xùj½Ô̬\®gÈÎãá#b\Œ ~&U(,Š‹»\"ËdòÞ¾þGƒ¿x Å%bˆ²†Çd0h€Bo{h˜GÌ&æ3‹ùuSC„¸<;ääó]ù½*ŽYƒ9)x85XĦ`”+µ0ÊšýF|í0»r?È¢ÕÕÕz½ÞžòzcwýÅ^ýO„áHUU³¿!aQ±7%.‘š/Èá±+•Ï<{¾èÍÔÔ5°®Á×b–™—Aàù²c‰,—'Êãÿ¬"¿O‡\ÿv9¡8¼È`cµ³^Îqà†9e•5R…Ú*]¿\©ÙoyØ­’tHe?½¬S¦ÄVAÞ£eè Y`¢¤¤dmm¡ªFÑŸ=ÿwÉo^oà¼Þð‹ã¯ÕNs§¾8û¡ì sþ-ÿóþBTÿ„ñ|Ï?^½zµßþYßûïúDþ—ø¾ºžÖâÔêö’ÅžAÆÐkR×××᳿!9\‘5Ò²¸çΟ ºžÃ3Z£bƒC#n1çÚ7Sî¤Ù¼ Jœ‘ ¾¼q/,*6úÒ•ˆèØð踛wÓ%À~lJåñøOçŸ[chdltl‚áPU]Ë|ë"m*dÌ2ó2 Â<{¾ÄœÒsø!¸›–ƒ2%éúm\€4áîÈï=ÑõP!×;ÕÊû™ÑÏM=ÖÏÎÍ{^ßt¼ó5XŽuþ~÷åÎÿ»’¿Ýö;ï~iü:ef w˜ýýô\ÈW™ÖÈ.ûé’ÊSî¤Ã2õxÜËÈ¿xåZ@Ð…³Áa—>K„寽Œà Qá1—qŸtÇñI7"b®`¢Õõ]¼’À0€g¤¦çp1#ú's Íí’éÎÎîööÎýÌ‚’ï`ozæ6Ãq·Ss`‰‹ÿ"(4òÚ—·C#q*1å.³N{¤æåÌèg€˜‚0+iï¬kl>qú“§?Skö6È@æ·¸â’r‹vk"qêø¿>HL¾éüÐè­PX¯3sò«ÐÈwÃ#¸=0$œ[Xdâñ´ÞN ÍÜ^ߨìŒ#˜eæe@„˜{Μ2ò ‘Åž/,öhúLdäòkêóxEWSÔZÒGHÄÅ»éy ýœq(òÛ]àÜùðЈäæó'#óë¼Z“Bû©ªm¸~ë.rM@P¨ùY›¹ƒ9k˜Gçâ"qaQÉçIÉøúUZNɺ•E%¥Ã£ãN>L`N(6¹±ZÛÙÙ™{:'m¯¶é4hüYö…¢²|¾«=5› ;Š”:¨ÜRn§â¬¢Gã­ûÙ¡‘—C£cã'&§ 0¶wíý&u.Od±vràMùÿÿì]iLëzFU[Umu+µU«öOU©RoÕJýsÕªºÕ­zÛ«[éÞÛsîIr’œ@N $ÂûÀ€16‹Ù÷}ÇÛ`c³Ù°ÙÙ!ÉɾŸì}f&õua<&†¡c=Bï¼ó}ßû|3ß¼ËÌØ¸­m|·Õõ #¨µCÝ*dùY·ºCÒ¤ W;´«·CÚ­ìí§”=}ƒ CÁ-˜ dÛH¾ÿYü»^Þ¥4+O-QFÀþûHâÑìœî'›º#ÿiçŸ`Wâ¸þþ{çC³©hY*°iZ— )sö/ }¥ú[(ë <í æùž9{!=+ßà"1ȳçÏA >) âg…<„p-<®]$¹{…éíÆæVl•ÕbÝôé"b“ó‹Jç,V©\¥Å=Röô1Àd'T›Z%0TßÐì{9(42¾µC‡XXZcO !…—‘)X^^}ôèñ°~äjp8:vˆ;-óVANþÒòÊââ'w#M°CªÂ‚ÂÅåµMIˆ¤³¬²veíæêúM‰¬KW 7šú‡ Ä€ÒJ´™žOLI?åéíáy>™“93g›ð Í/*ÃÞüârÈÚaÈAa‘.ŸVÖåw%í£ão˜§f¡))¯F3±¬ûR@ˆÁhÚÊ(¯¨¡Õ;" V§½Îçä—Ð-,­„Ñ6‘ôòÕk°+“+hÇ £¦+Áa¾W‚a([X䨙#†ÌS3è›´¾qÛèkê›/úžñöMJÕè©Æ`ûíÙ 78Ã#cƒúQ0DwÄûNEź„9zúøzû^’Ǹ—•#Ì-( NpÄg™y°`Áb°º~›9:ðs‰×tMæ „ ñ7¸¹ùeðü Íím"ÙÇÄ{¿Ó3s\A!Ã8ž.y~§ÞµO7|½¢º!<*ÞÇ/ ¾©­©UtáÒÕË×tƒz2.X“Ó2‘ÿÁ¹qù9ˆ P"½††WPBÞ´w9к\Gl±K­ „›MHIïQëœ2¤õ±´ˆ¿ÁA~J™¨MÙ*’æ‹'§gÆæ¨a Œp#mmãÖÚÆmËÂJލødi  5C–tvûúyù\jÉp Ë«ê)Ñ><&çQÞÝ»ý ²ý€ât‘SÙÚÂâþ&§ñ“8|¤=H؈<°¢+ŠÈs„%œÌyòJ$ÖhWXN›;¹p¥¸­¬ÝÞŠÒÊ:‰¼×TêÁÎn¸³§¥CŽt›ÿ‹‘TÙÒÑÙ¥ÒÚ”¨†‚!Z60È×,ù}äßGT?ÎÄîöÒ~ØQ ¹%‚5À“W~,ýÈê[ ê h¼´?¶äc æùº{ú¤ps!‹ô›}ºÁ{÷FF#ãS±¼P`WK›ˆ\m+K+kê[ 4MNCæçïßG«‡ünšÛßÝ‘võ0Àd'TóŠ«Þ¾}ûæÍãèxIY¥à5_ÿèí $§ñPÉ€›yræõë×óօؤ ¬~4@½‹ü=Q@¿NLáîjn^uaeFŒ¦¯Ž»9áW^U?:6A>Í\ÕõëጠK*Ñ&2ޏr=*ðZ8„¸$xxù\¾‚½ÔêÚ¦ÁáQù…eZÝ0òòs.Ãù=ù-’o4Ëäçbïq¯ãîž0º• PRRA«wD²¨¤†¼}ýœh§À¨»—OpX„£'OëGLhœœf¼‚RŒvóæw(ÏÐLWHKƒ!…qó4º_¸ÿKqh€|™êR@0V ªDP´ŸÄtP*䕟ððŠOJ…éÈØD´ŒŒIÔhsÉg¾ðÑ×®G“•Xzᘟ<í…ÍЈGp–™— ,öË«·˜£7»¾}um­´¼Š—/WB)ëR6µInßþ2rhOÈ0އKžß©wU¨Ôp5GNœ†ç‡k…Ou5„A¡‘è(, îñ'&§Ç&$C€…ÒÇ×é5„<ò !ý¨Ëá€Öå:bk2Ï`(¤èqI©°rÒãìôÌ<3í>¾zShÌÓë·7n~× ÛÆâװaŒŠDZƒ9jØ095‡PŸd „<~^@Èubiv¡®À®þAÃÔ´'3 Ž?zÒʬl!­Ò2¿„²EK J o?è1»ùí‘í§‹Ü–­½~ýFXTžÊÍÆ¦º¯ K«»•j9e±‰i/_¾B"„Ìí%ù|]Ð}pØ@dJwîRÅ0 (»=ÂRÚÜÉ…+Åmqyc+ŠËª;¤JGèîÑIå½Èþ%=•Ù¿¬[m¯ìRj†‚!Z60ø(6šþUú‡¶×xþEò{HÓgŽÙ·qT„ŽCŸ0vr¨ákÈÐØöRÀÊÿì åßÿ&û#l~Ýû+O-;)˜çûÍés‰#dˆjD¥Öâ8CHædZ‘Û'¤òQ)Þ¼uËãŒÏi¯óX1këhÏÍ.zþüõ?Ôêš:¨A—Œc V(€ÉN¨ I­Ý÷ä×Ô}ºë1Éö¨Õç~ÆGA–¶\~>V?„ÊÚ4+ˆ‹¤±¥c‡Tsr„s–ÅM€›ètz¿D½wOdzä Ø,(.Gø!³ÿhê@ÿ P´›LLI‡ž˜œƒ‹¹x905#«±E„–=½Z./‡ðVz¸ôLdŒ–‘•C9¦¥¥5ÝÊÈ/,¡Õ;"¹´¼ŸÄY\Z¥5šJ æ¥ÕKËkÒyÙö¯ZÁa”!Ä*lòs hi00¤€h´idÄmÿpum#¢ˆÞ0†øO–-í¢”JL7íÀ°L®ÄŲ.ê yëò·g/ PY–¸­ó~èß}ä„{WwÏÚÚMGp–™— ,ö KëÌÑ!'Ü{4ý9ä{AÒN Œ©S.y~§ÞU®è%“æb8OÊ{+TšÕõ[Þ/Ã;¡H"oln‡ƒê ïÊ#"@éíëï{%B.™³"ét9к\Gl+ªê°ÙÜ*Z]»Ù.’Å&¤èôÌ m>þ–ò±]ä”72}ž,lLz5º¶éäÔ¬ÓØÁ5l0‘÷ìñõ©3R¹»¹…ØÔ wˆd`Ólli'a>­’š Î;ò âõ¤üâÙí‘í§‹Ü–­!Zwˆ;KÊk™¶çc æùžp÷ŠKá9BZá7•½}×ÖoZæ­Qpø› ½yómbnp›Z‰gh•D B¼‚?2Ê`…˜ì„êÕ°¯ Áñ¹Er¥úÎÝ{ ‘ž•kO`tܼ‰vMcV?„ÈðrˆK¨[¥Þ!UAvîô¬u+àþàâ ÆñÊšz8Gx Y—ª·o€¸_T&ëê!}GÕ˜›EܹéViê›Ú Ô4´  («ª»ÂËÎ;îî93»›´É‘µvH©´{hØHËBn^¡£]´$¡G_Öhj:Âäôô¨uyÙùÖÅ••Õ {,­¬SVÔdÙ“•“ïC€º 1¤7R7O™'g“ÓOxxêñSgŽž<–SÓÿÀPŠç·g/Ö5¶B Âd £Ë—ÇþÏ\pѾÛ×?Ðb]bà€³Ì¼ X°`±˜_XeŽ)Ü8ö9‹UXRM!_ ±^,ëFƒ!ýÈ»÷ï©“®z~fï*ëVwL*jÐþ²v@®ÞÝÓ›ð¨šþÀkpkpnÄ»+ÉéPz_ô÷õ‚÷¡‹ËáÀ‘Ë¥e‹”—¸×£Ñ –—WÖg- M3›|ìÑ“sóK›B03·@Ù=‰x×ÜFcn~†l› ±ƒ9jØ0:>‰PϬ߼ |ÀíŸ9ç‹]¨+°«¯(S ¤@I=[æ „´Ê2@Û#!9m›AdûÅé"·ekÝ É<)W¨ÆL-R"#-,ïì&RùÌœB¤78¼\²KÞ{ò)õýv±ŒjeuíÉ“'d]J蹂ÚÜÉ…+ÅÍb]ÝŠü¢Šæv¹#ȺÔíân"™ ²=ZE]âÎ{TÞË0 Ѱ¹¸ûý­¡; óýA›fîÑøOd?Øôêm Z)·ý(Ð?‰©Mñê‡/Únzèñ«T‘1qÕ~œ-˜çûõ7g¢3!%ƒð› •rieÃ{2Ñ¿ÿ6Ÿ¿xä.>9#15 VXd<”~¡Ô³T‹ÑñÉQ éP"ÿ6„EÝ`0€ÉN¨VÕ6£ê¸‘ʽèr%$*ƒG<ÿêRªí ¹Ò2³“ÓÁaÑWÃâ“yÔ3²Ä” ÿàˆì¼B2$(vH5K;9=¿ µ m~!ðÈÓ³ p¬ÔMhx±u?aa™†¼±“Bµ‹Œ¥îëè Ä“«×"üƒB•½º¯Nx„\ŠMB›”4"íVöôÁ£Q@F›žIxüÁáÑ­làg iõŽHbœ;ÅÖh YH:•hP×Ð ¹¸´ª´².,2μG¦W3@ ËÂ0ù´$<&<)LÍ|„¥•µˆˆFGNžFË‘Qó˜y e/[øÍés¨ Ɖæv¢hj¡J©‹—¯Úæ2:>%|w@ðuÎ2ó2`Á‚Å`n~…9:$¥árlÜl¯äå·BEÒ.ÈDðî]PX,³ç?î’çwê]¥r¢(.¯F›lò4r\È~ÁpD÷ðÔhÇMST~ %•^Ûºôé†]´.×ÛÚ†bi7ÚÈê’òšAýà :ÛÓ«Û½ÁD™ö! G<bsÔ°Á86ijÍSsž>¨L³Y9Ôñ¯#ÓúvQ'PÜ3y´J,!‚ÜBÛq¶D¶Pœ.r[¶VרþìÙóyë‚D¦hnC™-,¥Rù ~~»¤ â5Ôi{5:Nf `eúÒÕëÞ¾>|üä Æ”v*ˆ”‰'¤Í\¸RÜfæ–¶"· ¬¡EêÔÛÿ”Ü&îÆæÈTÐ4¶HÛ% ›R$U2 C´l`.L÷ÈoåþÎÚ³JóæÝ›#ª’¿ TÃ\øü ÊŸwýå õ?Rø™üÏ¡ñü9m€Oªù4—ÿk'ó|žü6">Ín¤VP2R›3sóØ|ðà!äÉé9Ȃ܂”´Ì‡ÇÌaqíb¢Üìîé{ýæÍòÊêÅ+¡h‰šaÎ2|=†Á&;¡š]P~÷ÞýªšzNFÖêñByM³=ò‹ÂmDt¼yb ´ãS³°ú¡DÒÇÍÊY[߀œSX±Cª™¼l¸’MPöh‰ïÑž» È-ª­oññ»B¾…"WôhÉç¿¥æÉ¹ó~WŽŸ:ƒ2›HUý®C À“¢MW0fžùê¸;äòªzŒI=ˆML˺¯†„ŸöòјЌxˆ9hØÊÁ.O@«wD»àQé©Ô:Z£Éi™P‡EUÖ4ž#ÙªÈ7”0 {…F~0Ô«#½§ðcR ¿q=*Þ^IÝžéRô¶ù=åÐQÏgóKQ”žðð2ÍMmbêæ ”Ô÷p<šÚOñމOF/w/Ÿ+Aa s¼læeÀ‚‹=Àôì"stHH%~ídtÜl¯äf¡¶C"‡¬7޽{÷>*61<ŽÃ0Î1—<¿Sï*–) •U¡ ŸL@{4ýáÿሠxúø¡ñ ~”ÃåA~{Jï‹—/úÚºôö ºh]®#¶zdM­â󗮞ôð5M33Üêc¥ÊM¡Ð | éã€CŒŸ{Ñ?¨O§w;˜£† z#ñQÕ‡›ñù¦>vñ><ßè7MÄ¿„’d  Z%*¯ó~¨ÒyÙ'Ü=k[·D¶Pœ.r[¶–!(¤Ò¿Â2⻿øyÅR9•ÊçqÈ×á,óV$<ÖâÃ=j-º/.¯>}úLXX"WÏ P@)‘¯«¤fæÒæN.\)nS3‹[‘WZ×$q‘TÕÔÖiÛlíè†èªjÅÐÔ7K[E”í%ÃP0DKÀ†ÒÒR†|úõÛWîš!ÿþ‘è·Î÷ÿ4aìܱž¿§~ôáË{ À7©[þú;=6¥j£…z pïûÛ´@ÞLÔÖB⣠L‡y¾_}íq=&ÕR2ˆÿo ÐS›Y¹%ð’?¡v›§^½"^÷¿uûNzVAv~ùÛ·ïVÖ6°·¯_½\¡¬õêÕôì<ƒ!LvB¨o-,®PÿÆamý¦X¦¤ôö”½Ú‡¿'ÿ¹A]S4XýØ4MLS?—ÙÊv¨fff›f7abÒIeð—B*ªê&§¬ ¥–ÌPKÑF£¢Ü pî‚¿¶_Oõåd^µº®²ùð†§§„¥§Ï^ø‚|‹±¹UD4&=¾¶ß°•ƒ iiY´zG$±+5=ëØ7ß^ ¡5šÌ! €è¸dĆ_û&/¿CÍY––W6ìa]X¥ )U¤ç ?–!…þA²ˆŒ·WjuzŠÕÙ —CÂc?®0OÌEÇß8vê 6±·¢ª-‘÷ûú‘1©õ@|;±yñràÀ  Ü= ßÍ@ÀYf^,X°ØLN/0G‡ÄTâÕM1H ,#¦>È5 í?y÷þ}TBÃ8G\òüN½«HJ…¥UhÃÏ. ïžôS®Ž¼Ö‘ÄWN£RNxœ…J"½¾hëÒ£t9к\GlMæ9~N>¤ÚÅNnõ±“ó›B€‘)ÓDàígc—Ä!îÊ÷ 9ÌQýÁdÿÆÒ÷ˆØDÈ »x‚|êøƒLyUûowOï òË<¾Ð‘RÖ©¤~¢¸‘ʘ°l3ˆl? 8]ä¿ÉÖbSŸ=ñöÝ»˜$®¤“¸ñ/,ªêí#^uæ ŠÐÕ •"5Â_”mP–T6|ÿýK*[^]öì9”*5ñ~D¿€6wráJq3OÎoJÌê†vGhwÕ·ˆí5Mí2êþªú6JSÓØÑÒ!‡¦U$g †h ØP]]ýäɆ”ú΋ð‘“Ô ú Ï?ž°o³µ¨¶f’·ÿÿâí»ßü—±ožQ¿)T»À§-¨Ÿý‰ì÷¿ÿÎ…Át˜çûëc§®EÝpQ‰éÉ9N›…ŤD&¤1·“]¡˜‘Èá3¾"øzl µ©Rÿê""ž›œ‰élÇ„Sªé\¾qlj+&¦,ëòôÌü¸iz~aeŠx95nžYZ^Ÿš±R²uqU?b2Žš!`“ê83·ˆ6è!™>ìšž±B3l·XW¨3³ h0:>MËBJj†£]´$Ù¹Åyë2¢­Qx=ø>óäìÄÔÜ ùF#ƒuüArzvÁ†f‡îsóK›Æ«Ñ± ëŠe~™òwBÃã8»H•“ÆÓL8‚0N24Ðvù¨ö‰IiÌ œ’Üd4)…K>h6¢—ác˜¸ÌÐ1+zÚ̇Èร#à,3/,XìŒã3{Èvèù?Ê»î¤Ëdžf—Kkä¬Åл[Spºþ‘“ßž=yú¬ ñs|§Îx÷éô´J»Ã>ù±§ÕÌeÏù'½RÜ £Ó[‘‘•_ZÝâHëkÅ[õ5MⲚV{ 6k›% CÁ-4š>]ÿ~§î»óÁD0æùþ÷W'¯'€É¾P-®¨ïRiB"“v‘j 'sPo:ȈKHÙÝ›ZÅÙyEºÁ±Ëp׳̼ X°`±Ð§ö&ÏÿY»Ü½œÂÁ4¤«¬iLã J*j Fóðˆ™V¹[™Êž-òOz¥¸ LnEOX\Ùä%Uw},`ˆ–€ ã¦ÉÚº:ûÿ¼û™~0LdÜ4Å<ß_þúd@XüA˜ª)©™CãÑ1‰ûÎásgˆ³Ì¼ X°`±Ú«èp<ÿgír÷˜Êž-òOz¥¸ ›·‚“‘[TÖPTÖø©C´lŸ°H¥2£Ñ¸ß üN?˜‚D"5MX˜çû‹/_¹{åZܾã—_?4T“’Óµ£QñûÎásgˆ³Ì¼ X°`±7Ø›èp<ÿgír÷œ”ƒ“¹|¥¸iƶ"5#GXR›_Z÷I©é9´ìa™_¬¬¬\YYÙïÞõÏÆÆFiiéœeÁéd¿<úÍ¥ hÿØý8üê«o Õ¸„T•zH£9°‹ˆÝwŸ5Cœ_œe§× ,ö{‡çÿ|]îážÂvÊIvr¥¸õölOPÈVäÕ~R„YÙE´ì1¨7ÏÌÌ#ÞïLÞ•J_]]ÒO8왳Ïù…\ŽÙ_x_ºæåíwh¨&&qÚD •Z`q-,jß9|Ö q~q–^_,X°ØìAt8žÿóu¹‡{ Û ($ÚÉ•âF;ùv‰2•›—_•SXý‰€ÁaB$QmçdŒŽÏ¬¯o”””ŒŸÑ÷@„ËËË-–ydÿÛ™iM}Û×§Î] ˆ@Ѷ_€up¨mh?4TÛ:äüœ¢Îî>eïÐÁDеˆ}çðù2Ä™ÅùÅYÞ÷°Á‚ Õ§‡Æó¦.÷pOa›å ¤@;¼RܺTƒ[¡è.«jJÉÈËÌ)ÍÊ«äWî"0 †Åà0¡è¢%°ýCã7o55·VW×ètº[·n1ÿ€}ü€è$¨‚ðÚÚ†atj›ÓìÑ’Ӳ޹{Ÿó»v! Â/(z/‹° ëà Òè U4((®ä–4·uIäšNE¿\9@8  ßwN´ƒàlâœâÌâü:],X°Ø|ºè°+žÿ ù1G.wß9ì| ŸÑïüÈ€²¿)Ю\)n²î~Z(z†[;º³rKR¹yÉé9»‚”Œ\üÅ€ƒÃ„#ë´èÕŽ¬­ßž³X¥²®ªªšòòŠâââ¢P±êêZU횦Zk¬mè¸vÊóJ·=‚;ña·¦¡ÕvqwfV—ŸŸ•Sœ#,²óJ¾q÷„Óqˆ¼RvÝ´ýà Àð 4œGœMœSœÙm.,Xì v=:÷ð¶yþÚyþåÇ\ [B爛 Øv¼Ø5>‹îB@ÙŸh÷®7‘LãR¹¶[5¨ìFõ°‹À€ƒ3˜f€Z;25³pçîƒGŸ¾øþå÷/_(€ˆH‚ªksD%ªé7›† { X„]Xg©îõtôæ}çð92ta°`Áboð)\î!óüL3=.÷pOá0­®íÌÅ­]¢fÁ‚ ,X°`Á‚ÅÿüÿÿìÙÁ ÂÁkÛ—-¤‰€’ àC!%ØR,d¦‰eçñ:€ˆÙž_ bnûˆ˜õþ"™Ëu"æ<@„€!B„" D@ˆ€!B„üÿÿìÛÁK*kÇñ?͵‹Ù´—º:¸Ò8´ÝŒ‹°6¶¨®‹ŠG»F Ɖ¤$„„8$Ä+""ÑqæÔí8çžîÜð+ŸÅ4ã¼>‰‹ç7ó X!`…€BVX!`…€B›žïðÿâøO>Øäx¿‹Žÿ$àS!€MŽ÷»˜áøO>Øäx¿‹Žÿ$àS!€Mã¾sP.çvO³©úSÍ™ÆwpQ.¦òÅLwΡóüáfú0ÕüÁO¬ÕÏ“q5 DŠ>*fûËYÊîžæŽÛƒ·Ûpl÷ÿË.ýµuYq&tDkåΜC’~È]²ú=½³Ÿkö%…ë=;E¾S0þ+°iÒg¾mðNÕ¡`ཱ^Pï¥áxb»ùg®µ×NƒfÏïSµÒåÁQÂoþ­¦†Ké¹ê¼Ý&€C`Ór }›R|k.—[’ÖBj¬üøm´³ÿRÖý¡ˆ&úòf1 z•dZŸ¥év"~%±ý÷IL–Fg¹C‰ä÷qûÞ+¤U¯dì÷7JÕ颉°Or»ôSvÛ¯ïßWƒQm³ÙûÅÊÃÇñu½Ny=œ9Ñ” ß¬gÊð1%‰î?y0Þy•ôû¼õÁkäP½¯w<ûÅ» ’Ñü¡ +'ÞV+íG_Eüä+>lZ" v-ã2Æà®[ÕŒm˜1{h9¦wíŒuÄFNë  ÑÙ#žÒÓ¤€7§$3/“ÕŒzgå^6d9dÖ3¥U »æ]¹ïw¾õ{âù‡³¸e%[XjyÕ­oú6»Æ?(ʈ/ðÑ`Ó u¾1Ú/­k­ç»îõæ¸éï^kÓôÍžqÉ\ÖºS«)‡Ù—çJ&â÷âÍ“€qÄ}t[é?¤ÄƒÑâùø”øIvø\9š:e^Û=gåÆëÊéêE÷ñ8*–õL¹Ù3‚ŠÏÜß¿O)Á@T Ž(‘X£w×ÌŠu<§·•—A%Ÿ7ô̳hhüUŒ¾–áí¶±íÿõø×`ÓR#@µzq; |ѧ€\.K×»8x®Œ&¸¬¹Ç=÷•迃»bÚ¾ýxÖ¸/´:µÉ3Æ)õ¿¼“6}nÛ½`eY3{̤a f²&î t«Súõ^¼AФÌSÌ‘!ãþÃÂgÎÄm­Ë‹Æ¡^¹¤¦§û'€M°Éö«Õ™–ô{îõ™YÙ5'ãç³e—--ûÛl ¶Í¡}`¦6Ôf§kŠˣ·Ö•}bjh\¶%´/EÇïÎÿ0œ:ûó›Üd.h¶Â§ƒÉÒâJÄ”‰m­ë™dÿzök$ÀGø ÿÿìÝÏKÛ`Çñ?mg¹ôÖÍI¨ìT/2ñà¼èA¶]âÁy1‡N†ìPa™…¢` Ò¡¨ˆ`¡”RŠŒ"¥”âÌó$é“þpfVCÞð:”¤ùÏáûI¾OB€ˆ†ÀêÞVó¨Q÷´;»¢ÍÆ+ˆo¬àNyû\¶¥ n%íØ™©§¯£FL·-®z7Î €-/œªåûÎÁ¦z>ªæ7o¹xZ/‹k?ØÌNõ€·Ÿ¬ìá¹ÎËü3í>s&Ý+Ky’­øO*¥\áWîTNtî8'Å\¡ø]~: UÍíÃÒ~—ÿ‹)`xr­[š—œã¢ó'=³nͧ½Åoe5ìmb¤L…×ZãÇÇá2ýVRœžžõ¶JÖÛ$´ê‘¿Õmcø̡л¸ü:¬7ÒSÊ¿Ån›9ÿjRs¯ëÉEãÏä¾wôÉ?|ÿéA¯´.rIøÓ'–عž¦¬}H@¬ ¢~È¿„çheéVsÁ*óý;ST´ ;î[q.óóA鼺"ªêÌgåž½ßÐ/ nù’ñÂPå©íßÎý¸M2kêÞ”ûî£÷ܾ±L/®|Èʃo’®÷–Õ´0gm캓}§åíüÛsKCæ’Õ=' Ið6¡k?Wl_•ƒ`gÜ%³_òƒ›»MSòäÃEû€X!@DOlLï”jÕb£Y^Õýã4šN;ê'ºîœÊÍÁƒÖd¾í%:j®ìÍ­5{k£æfƒ³ŸK)q3>7v“‡‹çàNAñ‡²\[«¸ê‘*r"±ØxÎ…h+ˆhBÅ÷kàÏIp?Ý´$Ííì¿ôq…ÒvfBGÔ>$ V‘îª}¢ÎNò˳ýž~å ¾/lÑ3ddWjÏ|¦¡}H@¬ "ýUû¿u;gí»r÷åô*h+ˆH{½‹Ú‡Ä "Ò^ïb€ö!±B€ˆ´×» }H@¬€! B„$H  A@‚€ù ÿÿì×I 1A“Œéqì‚ÂZ­ºFE`ž- D@ˆ€!B„" D@ˆ€!ãifffff™ýþB„k€ÜÒk}'7ç¼ü#œðÿÿì÷SÙ–ÇùËvkÞ}ïͼçŽc‚ &EF€@ Bä ,$‘PB„DÎÆÛãì‰ö~E¿¥fhd0¶\ÕÔ§¨ÓçÞ¾ç«ãîÛç@3C5ß%T@Aq:È€EO$’öôttv}}8Ün|Gth€’à?Ò7”}jÍ¡‰NoLNI»~õþþÃáoÿøß± –ÅâÁ+ù:;Û©7±/ž¨Sð÷þyºÜR|¿ Êô_úëÇ_ªÐé ÷“S/_ ÿï¿ýýoØp¹þí¡ÀüçÅÅLJ8.\üæNTŸ¾¹‚;qqIII ¦ ’Ë2 7O@ Æ <dr•nÜl4[¾>¦‰i|Gth€è9NjèÈ>f ŠÐ¤™Éº~-;¯°®fÇ¡…ÍÁw,ˆe±8Ö FÉWÛÙN·‰G¢NAk[ç)rKñ]óôÙ‹ónΨ°‰ÙzéJxfN^u]ƒÉjfµ¦Vv(ûÐîp‡Ã9÷Õ ‘Ñ×? "É:çæÁ×Ì 6»Ãh4õ dees:»Ž»27îEßÀ Ü8iµáó¸óžo¢C” ò<Þ%òÛ,Dd–f ŠÐD§7FFÇ66³y‘T)‘k¾ XËbñ[Q·Çfr%_gû¬Mì\õYHGµŸ›[ŠïotzÃÍÈèz³/ˆ¤£â€ ÔÔ7½{÷>Ä1šÌß\É ß¿ÿ|s%‡¼zõzÿñÌŒµ¬¬lbÒðâ ÃÍsP¢Õg.ûœ;€Î Tš²ƒÔLAAšÜON«®cðDrшêœÀâUu)©éäJ¾ÕÎä&öu~¹¥øÞùééÏçÝœE[RrJE }/æ‹e!HUmãÛ·ïBœqƒé›køNþüó £ÑD£•¼>Ãp…ÇOZl³vWè0i™åñEÕ†¬ì`4SPP„& ÷R:{‡xbù¹ÒÙ;˜p7™\ÉßÙ&¦f¿à&öuuN¹¥øÞyòÓóón΢->1‰Ãíâ‹CZýõë7!ÎØ˜þ›kø~nmm××7¼>Ã?y~¾@25mŸ¶:C誀jCVv0š)((B“{Éz…|鹂D®ä‹ïlSÓ6½aÒ2ãø"›Ø×IÔ9å–â{gÿñ³ónN¯íɳ»I)]}C}C‚Ф˜VýâåëG­Ñ~s ߯Ÿž>ïèà¼>Ãpó…/™œ¶ON;B ;TT²OÖLAAšÜOÍìöŠÎ„@ r%_|g³9Ü«S«Ÿ0MΞ}û:‰:§ÜR|ï<ÚzÞ ÀYäÝKNåö¢M ‹Ëþùeˆ£Pª¿¹†ïWáóç/º»{^œa{~:Ê0_‚C¨UÕ†²ì5SPP„&÷’Ó¹½¼¯‘+ùâ;ÛŒmXfœIo´œqûj‰:ÜR|ïìî=9ïà,ò“’;ºúB–œ‚Ò§OŸ‡82¹â›kø®vuu¼8ÃvöžepX8nž5 * ÚP–}¢f ŠÐ$1)µ½kà+€@äJ‚ÙÙd í'¨Æ ‡£cã8T¨õr•X¬‚É»ZgTϲ‰}µDGn)¾w¶wŸwpyq‰I¬Ž®%3»àñ“§!ŽH2òÍ5|× ;;»^œa¸yŽÒ?$ЧŽC©5äÕÒ‡ž‚ÂÒ²Šj’SéêÊ{X,ȃ™ü PPm²5z3dò°¸ A® &t ½±¨´â<4SPP„&w“[;zO$)53:6!+¯øÐ“WHƒ§¾¹­ŽÁ‚ñ°¤’|"WB¾³¼#ôÿ0NZýûžÎ$Sj½Î8iœ˜1MYÍ–ÙOfjõæQµ~Ì0yºMŒžZg>4^ï’eÚzèq/zlv'É)‡huÆEW©fò'@U@µAÊV™ ×ÇÖöð-­è ¦Æ¦Ö`B[ffçæÎC3Ehr;î^‹KNm#km}µ‚Áhf´vNݸ žŽ®nï ͘|"WB¾³ Üÿ+z£N™R';øÇ'£GÑê'äJÝé61òDµ´wÿµ¢ò--s¸=u ö‰¹=„Ãíå DÁÏÿ¬ÜR‡B©ŠŠ¾ø_´òÊåÕMøç]ÞÞ¾A½ÁLrî0OÈã‹NzD¦LHH4š-ÁL^ßÜ;ïàÔd}k/:6¾¡™M“ÍùkÐgÏžwu÷fdçŸxâÙIJÉÚÙÝž•Õ\'øñRă¬¼aþI‹v7àYÓä¿®\â‹?+Ö!ƒÃ|ò <¡4)5~¸‘’ž£Òè›Édq0Íæ˜>º\©ÁtF…`εHä­¼šNx°,áA~N—™ ikç¼>Ãpó¥«wUþqŒªõ¯oÊ2sèYp/ÎÚ0:¸}åUµ]}Ce50zxÄ„vga ­¢š.Uá\…z NžH†9¹EÅe•œî~’ˆPPm²šq„ž›w9æÝÎùEßòEæ‰)bw —V°Ú¹Ä|騺†ÎxXLkjiÇʼn„ŸÓ »¼ªN –ŸQ3Eh›Hon'§ªŽA<¶_¿~SRI'œZ½§·½«†J«'_È•ïl³üÕƒÒ_®#üÁ0f˜8Ý&Fž¨ÆÖN$áé³gæ)ëŒÍùüç(qÊk0”[H‹ML޾s7)-«¬Úï©e°3r‹nÇ'Áÿ û!J;·O::v¹fÑ㘜>ô¸ܨïa¨µz ­olá*Y][ŸµÙû‡ÅCTÞÛ;{Ë«x `‚T®iïìsÎÍc&®•Í8¹Ýý$ATT¤l©\‹(cºñ¼‚’ü‡¥ Œ×â Ñ x—Ö|Ëk¨ìûùp*”šå•Uü#­Aä¢já„H,²¹µ Ùkë›v»³ƒK&ûDÍ¡ÉµÈØŠ:& E´ºÍ-£ìNÿOú Fsym3üØqÈhíDcT¥%_È•œ°³ ÑO€ÃCшJ¥5ÎU≑' U8’€móft<žX"‰ ‡‘qð›ýÇ?Y¬ö_ýu{g“ûy£†ùŒž˜/–?>ø(žÙE´Ú­íß~ûmÞí}ñòåo¿ýN«ª?cn)â˜ó\»v åoÒý䦿V™\íñ­Ã?k_(-+‡?99e˜'²9\¨Ñ 42˜÷î%Á/–޶wp¯âëÚ58—V¶<ȸ|ùrI -;'Ð`z=£¤”ö ‡Ñ««ë0S¥Ö#!λ8u¡-âFdiœêú&„C½tèAù½©Uoð¿Oøîýû_~ý•ÑÚ¾»÷èÝ»÷Ó³ö½G௩oš˜š†ªzX ‚b¬¸¢v}}cÿñ‰qAÔí»«k[Á³èYFÁšž]@6¼QÓÙÕo4[`°Ú¹pæ–ÂÎ/*CC2¢Ô›` ˜FU}Ð0ô®ol”Ãé&µÙçÿyùÚ¿®\ÏÊ+êêr8vv÷×Ö·Í3?\Œˆ‰»‡ä\¿y/%“[£ 8ÊH1š”–ž£„V‚ûÎÝdØ M¬¥åõÓ)ü·N‡ ëÔ54_¿ÆiÆêÀac3ßuzÿ täíøÒò|œˆÑ n´|ÿoNœN«¬ýñÒU8*'‡ÙÂx}†ù–7ÂîèhŽC<¢q/zMæ©CϼË=3k‡¡Të0¤Ñ™akÆŒ°…åˆL±èñ(ôp:ÐË,zÅ#*‘d†Î0 ç¨Êàñ.éÇM$ATT¤lш½>ôÛh<––Wm6G ›+”ªÑ½LYf2² 2² `ONM÷ 펹«‡öÀᜇ=n0A*ñY  D²³h¦  M"nÄ”V1H(©¨Ã×41•œžÿhÿñ›·o³ hðc„¿¾¹½é ÆÅ#„|"WrÒÎæG¥5ÃC¡DExê{lYù˜X¦ýëd Ôšº…3m¼ä‰ª¨e" ¨Ú?ùéå«W°ÿüóÏ–öÞ–ö<Øî&§'§e=ùé)ªyLvλQuuõÀ‰Gc3› '.8 £¥†X*¿v+¶¬¢ÆŸÛQÕsKqJ•.íA:Ê_âo¢¢¢‡ð«5ã8D{Êbïé4§&-6Zy%ümíxÆbrt´?ózÜ9¹ùv‡ÛîtÇÄܾr%|Îå‹‹¿üé×ïÒºªºg)TcÁèÄYçÝœ:‡ÐvåêÍ"Z595 gµzP|ôÿ¡]7n€*ŸV]_RQ+KKh‘ѱ:½ÿ׌ÜžaŒ¶®É<±÷hÿõ›79üñö¥ã‚Qq¨kƒgÁíEIŠ6êÎÝ«·b`£ò¶Ì؈—|Xm\¢ÌÍ-,ÙÞy4¿°XXZ1ÈjÇ þßä>Äwܹ›;Ÿ”ÕÆ!]^ÙÊ•ÐC¼O⸸¬þºúfNNYQ×аѥ0[ÛaLMÛŽ>ÈÌ»~}ee-D]#³ª¶am}«¤¼knnížZ!ÕæD:£%%=§™ÕÁHnÝŽïê€ùINÏùñR„Uùö·×ïìéžwyPô—UÔâôÑq™¹ña*'ÝÜÜðú [ô®¥…ÝÅ+ׇR˜8죘µ9`ãŽu/z¿_6Š‚Û#’*mvçÄä41Y*SÂ)”(´:´žþ!œC9NÇ4’ ªª R6_¬@D«Í1a±MN;\nùB)†ˆÆàð&¶wö¤£ZŒŠ¥£Ä¹“ô0Р=úý9j­á,š)((B“+×¢Š*êI Þÿ1Íx /-¯Ànd²áW¨Ç`×1Ø ëȨš|"WrÒÎæU>8<Ë48”)ôB©ú¸Ér%FU'®|â&Fž¨²ÿŸI¼}ûnmckyu]£31X\øS2òõÓ»wïQf½ÿËï¿ÿ'§g3‰òkÁ½˜_DƒsÚjûðñ#Œ¾!á'%†3æ–‚›cQ,-¯¨B)Œ"Ýî\T¨tЈÑ9×R­òÆÍ›¨’QñÃÏbs½k‘‘þx|ÉÅ#_ãF yÐÊÊL“+´Á(t{ÖεÀڧδ] ¿^PRINYáf¬6â0#§peeõÍÛ·°Çôþ ®±vfn«­cÿ±ÿ†zç¿MÚ8Ý´ªú??|‘+66·$2…¿mhnÅ÷žÞ‰qÁÕ[·=¾Õà!þ’5üFtFvAvA1zuçÜ‚oy]7n†¿…݉ÒÎÿƒm& “½Kk¨›WÖ6ÕÚñÃ?~XRþY³¥|ÂÊê&*·Yû\OÿÐí„$DQ¨uy…e‡A DÒѦ`ž²¼“w—X“xyFQY%€3*–ƒù×64ÓÖÔ7!Ü>8‘Ÿë‘±1ñ÷1ÌÔä°¾‰…Ì܂›1qD50,Äh@åä¡MÌ€×gØÂâêQš[;‡£$àŸ|zÆ–“_RÛÐZTR¹àö˜&¦áÇ {X ‡-•©`óE£3³N÷´Ê††¦vž@|à”ë S0ZX&»»¼ªaÞµ0k›# UÕ-[Žˆã3q(ÑàP7n‚Àhšèàp{yE¥UôÆV<5=Þ%¡hš¡w¦Íî—çpºœs.Ze}3««Ó@o´œE3Ehr)âVAiíqdä–nïì~R1LùÅÕ£J-ìêúVz†T¦$Y ¹’7d0¢ÐƒÃC©|L<¢%™,‘ ƒ|ù‰+Ÿ¸‰‘'ª¸¢þ£ÿ ~ß'~¤å£ÿ×#Úì6Ûß~ÿÎä9 Ii(ô‰W€Îy8ý À‡iY…=Ãþ†J®,¯aä–ßKÎÈ/®ªƒQ[×g+«vMmý¬}DØðÀO40ˆÉyù§­s`jÚi™Æ#t©°¨$==ócUTVã,™\ŒT—{å¼€S§ÚþuùjNa9ÅåÕ7i™Žº“x3æNJzæüáöx1¤Ñé?úýU»¼Æß'¸ÜeÕôήج.ükë¯÷?ÿ¬¢3ž>{期Çé…´ªãtÈnÏJð8^d·±µ»±¹»²º…ú~­þ `qóž^¾VQ]§ÕîâtõªtJÞVV~Vn! ŠŸ´±©•dt`Xœ˜œ~P¯¡)Ôþ7všYÐcLo‚f—Û×ÄlƒÓ41p4;¿8üz4±ì OÔ;À‡QˆÀÿÖþéLMÛý @}3O ½|=ònJz{gOG§¿@~â“R/\¹1çò`fß NŒú?ÝÐÿª¢#«ÎùEx*'ÝÀ`¼>Ãæ–Âhá ðd$Øn¯oY?nÂ=N`iyÕ<9 ¿lUõâ o¶dD ›'”cËÀþ>Äââp-xàÈð|Z]Û4š&kéM"ñV0¬@TT´ì„Ö›=¨ûÇæÞA >4·´AŒÝ1gµÍaÔ1·›ÙÚ.ËðaÑÃÀižšõ-­ð…’ºú&“yrumC,ÓžE3Ehr!üfnqõq•ùŸÙn¯¡…Cðúõ›wïÞ¥fÊ UÒ™µþ×ßÅ# ’u‘+9qCØQÁá¡@¬"™,øGû%ݼW>q#OÔCšÿE©Eï¿Þ8‰++×Úþw„~OÏ+s¹½oÞ¾-,)OJÍ€át¹1Ójw~øð1¿°´´šñË/¿î?~’[P"¼{÷¾Ÿ'9cn)b0MGDD„‡‡–p»úPâ_¾|96öŽsÞGÔôéY*Ù†ÝÒÚŽG\|lfKNGùÓù)ƒ¨¨hœÛÕ3Àéì…3!ñ.IKK‰¹ý h ˆèåþ@*S#gwpê4BÛÃ3óKÈ),­B¸]ž@¤Tk^¾|… ¾oH€!µV»£¸¼vc‹ÿïé…bIL\âæÖl“ ¿Jãçðå«W°Q´à\ßÒò‰A n_ðÌ:üÉš™÷‰_}ð’Osk촌܈›ÑÃBiiE-œBÉè¨j FïÏ4aùábÄÝäô9—7ø uõ ’Ñ1½kÞˆ‰c0ÛQ.Ç&ÞG,\âé“N É•°ØÝ;IçæŽtt ¶*¦ßíP=VÇŒ¤‚MvêÀ÷>Ì-ªtF„Lbâ’ NbaI oºýÒ1OÖ`úäþä}x~q5 /ê›Ý·÷žš]bˆÀDÌ&> 2@}_ßó”*ÈÌüÒ=DÕº‹s¢ JÝ ×Îî±~QcÛ?ÿõlúÛßÿ±årÿ_ ºñ‹®ýƒ÷ÿq?>¾ÿkcK'Œì…‘pô´¤¦S2…šº>ÓÌùÅÂs‹œ„txâöÏ÷vÒÓ3§gUÐÿVg¥úóŸ.ªÞRí„„ÐýËÝ‚Âg0¦ªºŽÚKk°)fçq3Ô€z|üøqoÿ°_:BmR­¸ã[R)¢ž:7Ü_5ü÷￯éŒÐP(g óy['´íÎMhÃ¥ö'÷æ|NJ›¸nr²gM÷¿À±~X ºÏÛ¡=©œû>égêWP]o±n*&çŽnÔÓí’ŠjhwIÙOZUUϰbJåYyOà*"Ãê¢KÒoµ¹ìöí–?ÝÃ'.á†L>ƒšÜ €…E íVÞò “O™ß}õV»ÒáqjØšÖâŸ!…jÙ½¨ªm2[6`½—øƒýe{÷ÑG"sf‹ÓóÝž˜ø¤Þ™&§É¼‘wôÛ‰þA9‡Öœ™ÚÚ&Úó“·¦·ySÛÐúkï°O$£Ò‘É®>9›ÁÊîþã#a_ˆïUl"€­íiµO>œ‘™â˜h{ìcyà>!“èØþÓò 1›°©lÒQ%pªŠEŒÍ.>‹˜ß‰Ê+(/¯nòî/®¨Žu–‰!“ˆè2> 0³ ›ÊÖ;4î± %Š‹Ü"箸鿻“šõˆX¾¸ª^]'œ‚ÂÒ;„µa¥ –öüä-¾Ñ{S!llmïkmï' °¢µ%YÛ§3‚ dr)*>_”Î/暈¨xf“ÐV6ŸE,h‰â"·È9€ë@nºo"¢ïeæË×—¢ß¨ „“ÿôYÈÂÚ°¬¢šöüäÍ/®yS.l¿ìinë%ð)4ÐÚ«ÍÆA2‰ºv=5» -·ˆS`ŠË1×™MBXÙØ±à$Š£Ü"箸]޾v'-çnŸL¾úKÔÒ²Žpæ…Ü!| çW‹K´''oz^ãMu]K­¸£©UBu⎚úVZ[bµÙ8#B&?þœ’|?÷AN!§ÜJåßL¾ÇlÂÊÆ¦ˆ'Qå9p½Ä-áFòO·SSÒsÉäËo#C¾~ó ÿáÓ;„¯áÈølI©€öää)gÕÞÈF§Ë«ÄõÍ] -Ý$&à3<:CkK¦6KgAȤ»W—|7#?5»€# 8L!é“3›„ª²±,bAHw¹EÎ\/qëê‘ÆÄ'%ßϺ“–K _~}yîõ*ádóóCÊUƒ¸M&Ÿ¤=9yJ•7¯¦—Û:Ê„âê†vQSg]ó¯¡f0°¢µ%MûT΂ÉÔœºLP›x+ù>?%#ÿ~vÁ!,‡)`"f“àW¶S1NÅun‘s× €@Üà ,­EÇ'ýt;5ù^æí9Dñç¯"”³+„“•ó8ä> ṉÅÔ’ldº±ù—–—]'•AÞØ«EZ&g–‡†•¢Æ—UâRAcð)6Á_˜À|NR%GÛ?gAÈdöõª¤Ožš™—p#%.!ùlHtÿ…€¶»OS°1 Zeó¯ˆq’¨ÓŸtË“[ ëÜ"áN,ÇõŽ^²»iÙñ‰7câ¯~Ÿ@ƒþøÅŸàñDžw|NÓYóñOÖ¸žx“¥d Å-À™ øG½¸]Tß*ªkU2”Až||á$ÆŽÞu¦çÔ3óšP³Sï@ ž¤iûጠ™(”ª…%í²Æ¨~k:C „…àìM‚YÙü(b%*8¹E®’óêG–5ë!w;C6e'™EAAä‚ÀM#‚ ‚ rAàõ )AA¹ ð$ý AAA.¼Îž1AAA.¼žW‚ ‚ ‚\xàò…ñÏqüŒŒ Nã‡{~0>Æ'9>¾~1>ÆßøøúÅø>þ ÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/ìó•®½èß?AÒ1û•ºÙ¯–_øKþàó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËû|¥kïú÷OtÌ~¥nö«¥Çþ’ øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×Á Ã@A‡¨ü£±b˜}ˆ†êŠûÌÂùð÷ >¿ëÛ/Ÿßõí—Ì€¿çñù]ß~ùü®o¿üc>ü=ˆÏïúöËçw}ûåóàï9@|~×·_>¿ëÛ/ÿ˜Ïâó»¾ýòù]ß~ùÇ|ø{Ÿßõí—ÏïúöË?æÀßs€øü®o¿|~×·_þ1þžÄçw}ûåó»¾ýòùð÷ >¿ëÛ/Ÿßõí—Ì€¿çñù]ß~ùü®o¿üc>ü=ˆÏïúöËçw}ûåóàï9@|~×·_>¿ëÛ/ÿ˜Ïâó»¾ýòù]ß~ùÇ|ø{Ÿßõí—ÏïúöË?æÀßs€øü®o¿|~×·_þ1þžÄçw}ûåó»¾ýòùð÷ >¿ëÛ/Ÿßõí—Ì€¿çñù]ß~ùü®o¿üc¿GZ{Ð×O4f¿R7ûÕ¥÷ðÿÿìÙÁ 0 ±ý·Îäu’À?ÒúàïñÁçw}ýåó»¾þòŸqð÷ >¿ëë/Ÿßõõ—ÿŒ€¿Çñù]_ùü®¯¿ügü=ˆÏïúúËçw}ýå?ãàï1@|~××_>¿ëë/ÿâó»¾þòù]_ùÏ8ø{ Ÿßõõ—ÏïúúËÆÀßc€øü®¯¿|~××_þ3þÄçw}ýåó»¾þòŸqð÷ >¿ëë/Ÿßõõ—ÿŒ€¿Çñù]_ùü®¯¿ügü=ˆÏïúúËçw}ýå?ãàï1@|~××_>¿ëë/ÿâó»¾þòù]_ùÏ8ø{ Ÿßõõ—ÏïúúËÆÀßc€øü®¯¿|~××_þ3þÄçw}ýåó»¾þòŸqð÷ >¿ëë/Ÿßõõ—ÿŒ€¿Çñù]_ùü®¯¿ügÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcŸ¯tí=@ÿþ ’ŽÙ¯ÔÍ~µôøÀ_òŸßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þØç+]{cö+u³_-=¾ð—üÁçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]üùJ×ÞôïŸ é˜ýJÝìWK/ü%ÿ@ðù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËû|¥kïú÷OtÌ~¥nö«¥Çþ’ øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÙ± „@AB"4ò·>‡«õÕ”7+xðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü±ç“$I’ô½þð—>_ øü¬o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?öÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÚÁ Ã@A‡¤Pœ4V ;ÓP@áÏ,œ‘ÿžÄçw}ûåó»¾ýòÇ>_éÚ{€þý$³_©›ýjéñ É?|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/ìÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þØç+]{cö+u³_-=¾ð—üÁçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?öùJ×ÞôïŸ é˜ýJÝìWK/ü%ÿ@ðù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûå}¾Òµ÷ýû'H:f¿R7ûÕÒã É?|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ>_éÚ{€þý$³_©›ýjéñ€¿ä>¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü±ÏWºö ÿIÇìWêf¿Zz|à/ù‚ÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×Á ±ý·îöuÈOA€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËÆàï1@|~××_>¿ëë/ÿ€¿Çñù]_ùü®¯¿ügþÄçw}ýåó»¾þòŸqø{ Ÿßõõ—ÏïúúËæÿÿìÙA Ã@Á@2”ðGcØyD-U(å3+]ìÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/ìó•®½èß?AÒ1û•ºÙ¯–_øKþàó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåyðï9@|~×·_>¿ëÛ/Ì€Ïâó»¾ýòù]ß~ùcü{Ÿßõí—ÏïúöËóàßs€øü®o¿|~×·_þ˜ÿžÄçw}ûåó»¾ýòÇ<ø÷ >¿ëÛ/Ÿßõí—?æÀ¿çñù]ß~ùü®o¿ü1þ=ˆÏïúöËçw}ûåýÿÿì×OKTaÇñycÑÊMLjA¡Ô&‚Z”¸!Êu‹¨`ú‹:ý–BÔ¢µÉ}E/¢1í t–4Á½uŸ9ÝÏ/®¾ÏáÁsæ õ@üüyýú—Ÿ?¯_ÿò׌€¿z ~þ¼~ýËϟׯùkÆÀ_=?^¿þåçÏë׿ü5cைŸ?¯_ÿòóçõë_þš±ðWÄϟׯùùóúõ/ÍXø«ÇâçÏë׿üüyýú—¿f,üÕcñóçõë_~þ¼~ýË_3þê1€øùóúõ/?^¿þå¯ õ@üüyýú—Ÿ?¯_ÿò×L禈ˆˆ4’‘ HçàÛw-Á´ Ð",@‹èŒŽ´ Ð",üe¾Ž¢|=F¿6æÎø§·ln ®-,ÎÍŸëNÏ6Ìôìé8ãê( Ê(þ  Μ“3§rÍœOŸ¿ll¼zþâåêúÓ†Yë?‹3®Ž¢ŒâOñGÞo /_½Ñ={娉‹Mr¼{)θ7nŠ¿Ðr þÄLà÷sçw{Cïþ£¹ùóË×Wnß?Wæá“õ8ãê( ʈ Š/Rþ)eg΃Çk‰f·Á0¾¿_¿y»¹½3ØÙk˜Ãý8ãê( ʈbŠ?ÈîôúSg/,õn½[º·Û$˽ý8ãÞ¸=jˆJŠ¿ÐZÊþÄLà÷óÿÿì÷S[Y–Çù[ö‡­­šªýa§¦¦«¦k·g¦k{zÇmWÝÁœMÆ`Œ & $$P!ƒMFY ‘±A ( $Adl¢{Ä›aÝæ!iðv?.õ)×¹çÝ«{8%Î÷\=IÆ?À¡áö]_›[^%ˆëE2ůŒX®„ak¸uç~K[áÏñ AxÍÁø jΈn¼¬¼º¥­KÝ7¨íé%Ø€0ÊÊ«FÇô„§Esçå› ´¶ÔRsFÕµfñ×$³v þ…}awˆá‹ñªÖ—„縀x‰ÄxUÿ쳸´z’аG³J HÂÈ 1†?Æ @œPÍñœšZ‘RÕÖ«Ò Œ„¡PµÖ %„§—;!ÉÁ$EÚ‹™ôÊEb‚ÓžââUã%Zæ³°¸r’À‡üÒŠ*¡ÌKà—–‡á†Š@ ΨæxNUµ°ëU_¯fÈKèzÕ[U- <-¸\ó§Æðô)evo š7~ÍBxNˆ ˆ·IŒ7h™Ï¼}ù$!a%åµeÕb/‚pCE çTs<§ºFô²[Ó­î÷ ‰ð´àr5ËŸŠ/™ó ˆ‡ðœ o“oÐ2Ÿ¹ù¥“„†G–”Õ–– ¼B @œPÍñœêZIW·¦«[ë5h $ÂÓ‚ËÕ`^t¡-š?ãÚ Âs‚@\@¼Mb¼AË|ffNö¸¨´Ê«€pCE çTs<§²ZÔÞÕëU@H„§—+¼®Í{€xÏ qñB‰!\Ë|¦gì' zÎ+.ó* $ÜPÄ9ÕÏ)¯¬méèþDÙÒùž!ž\.ùqCs§ÜÄ03MžÌ|O Âs‚@\@~e‰áòŸ³òø„«˜k-ó™²ÍŸÄ/(ŒSPêFNÁ]ßÀûþ!LN!æ ~èváÙ€pCE ç·5''ÿœc|„E<ÉbóN›ÿ4! ¦e±óÏ_ÍyQQ£j{é I}L\"‡WtÚ¡´!1™”˜BªS´xø˜¸@H„§—Ïîq|ß~)°ä›Ð«Á¼/‚žßHV»žÿž@<„縀¸–&‡Ï?ø@tp'>xöS™{~Aï¨ ™÷(òiЃGÑOCÂc“H¿PWüþZæ3i= ´õ¬¼"×äóŸîìì$¥R0Ϥź²ºêváÙ€pCE ç·5'—÷ìð­ŸíííѱñÄ”ôÓæ«ZÚaZAqÙù«9%Ï«UžÐ lÓ7·ž:÷þ¡iÛlSk—‡‰ „DxZpùôvÞ=ÚäiÜHNç*Ç'—‡õ³QTÉŠÁÅ’÷â!<'ÄĵÄ䔜øÉå•àNž·Ûm¶™ÓT&•œ©íØÝuÀ¥¥¥e¡Xš”Fý…ã÷Ô2³eæ$·}ƒèlžkŽõ¸¹µDe‚Çš"€….¶ Âs‚@\@\K #§JÁàÐpäÓ$Œ¤4· ÔäEy L`çñÁ®¬=€iÇ*óöCííí™'-÷üCEű8ü>í HÚþ˜ø´g%/l¶@"­‹zšÎþÁ!™¼¡F †ª‹+U'Ûipööi›¤²úyûB×ËîræÙ´ÌÇ`š:É·}É´×d嫽óÕÒò Dó4)}Â< ¸T+”À¥ ³uÒ: FyUíó ‘,ÆÂî¤fd Ä2çÝ“gån÷ $ÜPÄ9ÀmÍ*†üƒ?¤Ò0´X§áRGW7ØY9<°M­`³¹EÊf0˜>‰’upp°¼¼242æp8Œ¦‰„Ô̺æðŠž‹åMž ‘+t£c°{5ZÈžujÆ`š׃¨´uöhúa‚vP'’)äu  pzã¤ÑdÑLb©¼FTïáFáiÁå£ë9W“Œ§À˜ÜÛ?tìtôM¤ç«®ñ?¹_åôÓG6»-îZØÚq˜¬Kà0¬ìí\é¾ÝûfsW«_¾ü¤×hYÜÞÝWõ¯Í¯ìììîßJlu±ñžââZbh¬|ø“Ÿšžæ—bÐ~I98EÒz˜À9zÏK]cØssóSÓ60ŽUæí‡š¶Í‚Ójª®%$¥Ýö J"ÑÁŸ_ø »É`™²ÑÓ«çêêÚÆæ¦ón¶e Wª°vÚ4a… X; «—à˜±þúÍÔÑ^p9›–ùŒ,'ùîÆ½” ¦k2™\ØXÕÚQ+®ƒ”A7M˜—WV’ÓKË˳ss?Þò½qÇ~½iÛL• Õ±[Ý—Wðlqiy{{›WGœÕµu·a@H¸¡"ˆs€ÛšCÎÌ9üùÏÚúzt\*\jï|ÃLl¬"3r ëUÎS›‡y¢c¸å«èšÃæð+jäžP-ŒÖ54Ý£Ött¾Âü”>- Šf˜PY#ËU£cz‰´žÎäÒܺ% …R¥‡AH„§—ÿ’ýi¤þ4ø¦Aý\@’ô£»òZÃ2ðT)®›ÊŒ‘+´~ö¨[£›6_=ºšñ“üíëŸÄ§»{KnÇK56ÌÎ)„ʸ¾þ»40¤Ã¾un~šÍÅæ¼Ùp~eP|*rôy¾™Ùy·»!ᆊ@ ÎnkN\Šó0n˜8ölln iôT ˾°W_¿~ƒ•K:‹§jí:ºà,>M-«kë‡GÿoIyµøC¯9Y,^i…ØÄrÕ´mlã„E7fÄücú “y µf&”UKÁJ•0Ç:5蓉ÂÃ]‰ð´àòo_°þðp܉¥³ãæÞ¾óÅ)u;[`çw$³}ÅŠ6ißíÑo€ñUòø?18öw‰6`Ëq§Í[Øûd=kÿùÈÕ^ÄCxNˆ ˆk‰IIgÀŸðè¸ñ¿ºo`ÿàpoÿ ˜ Pu€saqyvΨ 81•9&‹] 0hÓ¡óƒj¯»ÕÚdr6¶öù`¬1N§å‚sýõ‹Õv¼öXª¶ÿ!UX;½óóvzeeÍ:=ƒ-Fk¼Ï e>jî$_~õýO±iïIl •”É~ÿÇÁ€pCE ç€÷¯9I䬨xòiW#ãÒ2²8ONðÕ:#¯øEí/DE­ øgWAH„§—½Äú}è¸[þiøk¬ñmÏGaãWLž¬.Ç›>2x2â!<'ÄäÌ­ll2õŸ]GJ§çžô§QYdZŽË…8RõžíôiZæÓÝ;|’+×¾ˆIõ* $ÜPÄ9ÕÏÉÌâðKk¼ ‰ð´àò/ÿÃþm°Þ{€xÏ qñB‰!\ËþÿÿìØ[KTaÆñ÷{D'-: Ñ½D0Ë¢’2Ãj$S+˲"è<•“™:nÉT4uR1+-mÍ2óÐ9ºêüYZu3Û˜+ßåÞÿ‡sû>³Ø¼kö˜ñWŸmÚºóØéKªH%ת<€;'yáŠÚ†–.U¤’õ±¸š¿ÆY^ðUéc}&€)\1Öw™ÿhÖŧ.ª"•\«ðîœä]+wn7uª"•¬ÅÕÜ€“žÿMéc}&€)\1Öw™yù>Ñú̬#¥ç”^ÐcCf–kUÀ“¼«áH]c{]c‡RÉúX\ÍÔ,=ðuéoJÌ8ÖgøÂc}—™á‘7‰2·í**9{øÄy%¤ÌÆ­»\«ðîœä] W;õÑÚ†»JH™PYµõ±¸Z°.²hÿçÅyß5&©«#Ögø¶£a—™øðd¢=ûòƒ…'?§D^QéÞ`kUÀ“¼òÊ[7¦šº6%*¦UuÖÇâjEveJÎÛ…Á¤æ¼[¹§ÊúLÒ¶b4ì2šHÔz·{Gvð`ñyu°NjH™¶ö®UxwNòº{âW®;Uµ-Õ·Z­“Ræ~Ï õ±¸ºÝ›³¹;%÷sêþŸvI‡9›ï5D¬Ïð!U+FÉ.3c£‰žN„Ênnß,,Í/>SXrÖ 9Z H )#•\«ðîœäõÇÇš;Ca§¼º±¢¦¹²öŽr´RF*YËTÏUI¨cÖ¦žyÙæç~IÙ÷czý”O9WN—%¡vµàmJVŒª]fzûG\ =%/ EGOfçæË Ä4ËÊÉ“O9Z H )3UOÞ`÷ÎÙ±;øïÎiUç<뺫ˆÔ_½î\.‹L³P¸F>åh) 5¤Œõüÿ¹ª®/hY²½K~…O«Ì>ù”såté ü¡¼ÍòŠÑ÷ûÙa¢ýÌPÖÿH€ÇB!„B|”U„B!„ßÄ,#„B!„ø&&¢5iii@`í߬ñJäKÉW“/h{Æ„Bˆïò ÿÿìÝíoS×pÿ0?ĹŽ‡<8@pqlbãÈx¬ÆCD@Há‘€ÅC&d‡®Ó) ŠJet­6i›4iR;µ¢+}³½[yÑnÚ$6¦ioF*…Ò·ûrreìÄ77ç†ûýÈ:º>¹ç|9¿“X`YKDF…Yv¡®/± ""¢¥dYCDFÕÕÕµýµ† ÊΘŒ¢©©Éï÷7ªü*ôÈÔò–i>fKDÜ—ìú|)ÈΘ õh}}½¢(N§Óáp¸Ýn¯×‹Ö©åAn(ô}>"u¹\ŽŸïí"è\=\‚ eÝCmm-2É$‰Œç‡‰rçHçr¥åv»OžŸoB5>>.Zí t?ÊYÙc7xåÊ•K—.y<ìÄoHÐér¹òC§ìÁ"ŠD"³´%744„og»ÝŽ'rFÂápøÌ™3Åk5 re™‡e¾ßS‘t¢ רþQüþÏÞÿ|ú¦ß{0ý»¿ƒm ÷dg\>Ô¬7Tccc¢ÕJ÷רP±‰À˜–àðð0jÓêêjô úïíí-H¬ÄGª°E½1KDwúôi| •ýOU"Itž8q"?a8{ölUU•É×$‘yXj‰È¨ô.Ác±X$iooÿíß¾yçÓ'wî?yûþ“_ýõ)zЯêúô¸ºqùP°^Ÿ…ÊÉf³}o!p>ê]Ù“ Ó×¼páBee¥Ýn?zôèõe³Y“õRÈ߰׋477£âÇW‘!Þf2,ZqIcc#zr¹\ÁùŒšÈ$,5DdT›7oŽé ÷ß´iÓÆùÕÓ¾zúþ—Ï_ï}ù=è×ûéb²3.Ÿ×뽪¬¨¨¸ºp¸ƒìIÈ„é_»v 9ˆ1öõõ§tøða“õRÈçØ±cZ’§Ó‰­©¢(,Xrè/ާ1j"“°T‘QE£ÑÍzÂýÅ`ݺu ê¿"‚Çè ‡Ã‘H$ú"= ;ãò¡„ú‰ª§§§££ã-ÞŠV;xk~¸ƒìIÈ„Z3™LΗ˜ö¶­­ û+“gUÂI§ÓÅIîÞ½{ÅŠ‡C|DŒh±7(^çÎcÎD&a©""£*.Áî @0 k×®]³f ZcpûáÌÔ3Sgn=œÿË \=ƒ{Êθ|Š¢¼©ÂNæÀo.î {’a±e2™Ò)á,HT±ˆËãñȲiK±´D"q2Âܲe ×$‘™YnºúøOl }<¸¡ìŒËçr¹FFF0…={öŒ,ÄÅ‹Ñbú²g`tÑh´ ºžž‡Ãát:± =:ÁR‹J´sòûýØÞc—UbM¢Å­dφˆ–‚¥‚ˆŒj 6ŹØì»ÿõ~ñúôù =â—‹þ8Ù—¥R"‘°ÙlÇž•N§E« ÏârÙ30:D´cÇŽ‚$ûúúV© Qœ:ujΕ¦E·råÊóçÏ—X“L&™*‘IXœDdTÁ`°}Q_F|þGü£@>Ÿ¯ºº-Ž›››[[[õìŒËçp8víÚÕÒÒòÃ…Û¹s§øI6•†”öîÝ[^*•ÂÊ´Z­ÌP˜3¥Øo¿tYb=3R"“ø?ÿÿìÝYLSYp0¬#ÚÐ…Ö–E"J+PÀJªqi@Pö5T[0PDäA¢bÔ4F™Í<˜‰ÑgãH4™HŒê³1d21:ð6ó·gètZP––ÛNÿ¿ÜÜœ{znýúy¿Ï²DÄQ°B9þÝ’}^ð„ùùùO?á¨|ú©êÙו}õ³Oâ¨qÙÙÙ5Ócq @cˆx¤ÎñÂÅÅÅ¡ú·Z­=ó‡œK~ÈP«Õ6›Í+N§3++K.—+•JüEH£ôðöDZ:´€Ýè†V_ê×ADK$"Žˆ‚Šu“ÿàÙPw¢f­ýœûóDŽ[µcŸõz=Îù·&Äqff¦× Ö Âðo<"$©s¼p(=Ñ566vwwwuuu»ˆA—‹ç¼§¦¦&Q¶Ò%%%uttøf²°°põêÕ …‚ùDÇŒ{£Ñˆ8϶'1YWWÇ4…" ZëÖ­K÷<[ZZZrrrÝ‹/¦_~/põ/¾h4œ P«Õ âÛ€ÄOýÃÙýA^3X‰õü€‚„Åb±ÛíJ¥ÕLLŒÝEê ‚ zäÄápØç ¨¨Hêx‰ˆˆÈC€¾`íÚµ¨éů¿TÕ}é;ƒÖã.ÜË€$UVVÖÐÐPRR‚sKKKqq±ÔA­V[UUÕòMX€>_êH‰ˆˆè¿шŸî¯ÓéP"è\Äå7fÄo`@A=ÀŽ;šššš››1À¥Ô)´îf³¹¢¢¢Ù.1ùõ§€Q DÁæ’:⿓΀ˆˆˆˆÈS €Åðo0élˆˆˆˆˆ<¢æ*lˆˆˆˆˆþÅ€ˆˆˆˆ(Œ° """" #lˆˆˆˆˆÂÈ"½^_>Í`0ø«j÷£Ðm”J¥ÉdÊÍÍ]³fÔ±„ •Je4e2Ù¼nQ«Õ éÿ$::Z«Õâ,.5\.÷]¦P(âãã—64"""š³E6{öìùkÚÔÔÔõë×}×X,–±±±ÒÒRŒïÞ½;00°˜?q¾B´0›ÍÃÃÃ?¹\¹r–Ô…€¾¾>¤kdddhhhË–-¾ bcc{{{1niikÚÚÚzzz–6ÒP…72ì~O]¾|¹ªªÊw™Ãáèîî^ÚЈˆˆhÎüÒ\ºt UÔóçÏ'''³³³½ÖX­V¬A¡€ñ›7onܸ±˜?q¾B±Éd/^<}ú´B¡Ðh4ƒƒƒ§NZ¶l™Ôq5­V‹Ú4''gåÊ•ýýýHšû¡ÈÈH1HHHÀš””Œ?^]]Z­Æ½žOå^?ãåŒ3a"}öÀ3'lˆˆˆ‚š_ü{ñÞ½{E¡<øðáZ³Ù<::ŠùwïÞ¡O˜ššš˜˜8xðàÎ;ïÝ»‡ñãÇ-Kff&\»víýû÷F£ñíÛ·wîÜÁÌ«W¯êëëí@PfŠËÒÒR\êtºææf»ÝÞÓÓsìØ±ââb<”””´oß¾óçÏwuuÅÆÆbf`` ±±ñäÉ“G Å×¾`6lY¿~=:%ÔôÈ^ù9|ø02‰äìÚµëêÕ«˜ÏËË«©©±Ùlx ħgΜ)))ÁL||Ä]Û¶m{ùòå£G0ƒ5¨þûûû3220~òäÉîÝ»ÇÇDZ2ܫՊ2kÕªUâRüßv~~>ªØÁÁAÔ¬•••ÃÃÃ111Hl\\\__ß°+Q{ádJú:–Tdd$2€´ *Å@|Ñ”W~RRRl6Ԭ蔖/_îþ ýû÷#½Ø~H/Ú™L†‡PÔb¦½½7* ô®GŽAcPVV†>Mê½ÔD?º`€w÷ÆÏž=«R©ä ûV4+V¬À‚ÞÞ^$ùçgDáæoÿÿì»K#QF£É* ¢ÆH ±’MÀ q#¨ˆˆ 66‚ˆˆµ–¾°ˆš( H¢‘øHga'ZøØØØ‹`a'Xh+({˜‹Ãlœ]XŒq~‹›ë8Þùñ;Ìd”Aøº|ˆœžžRëãñ8…žIŠ2@w¿»»;99y} P(zzzº¹¹á%¥ÿââB @,S»e¼¸¸ÈàèèˆÏ:MÚÛÛiN,¾à%@%e†êÏLkk+}7•J---% ¿K€ÎÎNjÆ!Ðé5M#™––z.—óz½ùXÞdfÀÙÈfh>088èz¹&ƒD"‘ÕÕUº/ç*½ÖÖ#¶%?tÔrËf³ä‰,%“Iâ5 ¾Êöööò³p»Ýv ‚ z Áíííææf8¾¿¿7`ll,  ÀÁÁƒ³³³ããcL`aaú¥`nnNí1ó§ -–ê9;;Ë≈jµ¶¶FÁ¥žnllTWW÷õõííí±5krr’^ÕÑÑÑÖÖæÒ ºœ'ýýýTÌææf4€Ö¾½½MP*Ç£òQÐÍŠTGGG] €ºŠb3l (à„Ç»ü~ÿüü¼²G°z@ww÷úú:±744Çc÷*Š’ÊÊJ‰NAAA¾?¿ÿÿd¤ZxÊ÷ÞIEND®B`‚golly-2.5-src/gui-ios/Golly/Default-Portrait~ipad.png0000644000175100001440000013100212156145314017602 00000000000000‰PNG  IHDRì}eL !tEXtSoftwareGraphicConverter (Intel)w‡ú±œIDATxœì}lÛšž²›ÙMI°‚ A€d³A,‚}Ù`ó²d³/¯Üw«ïµ¯-_[¶Õ{±Š%«[½R…j¤¨Þ)‰E¬¢DªKVïÕײ-[–}-Ù¾ù†ãåò‰Ã!%Ú’¬ÇÁùÌΜó9ÿÎwfF²““áøä“O¤RéîîîŽÃq8Çá8‡ãpçî€ÈÔùõ¯íd:6961ý Q-*ohlž›_´q6™›¯­­Õëõ=ÚÛÛ;88xóæÍiÿQ%êÄ@$AU§ÓUTT¬¬®ÙØM¥Rsý†kn~q]c{k‡°½³û$Ñ.Z¿ærKmmðQíï×'&&ö÷ë¶¶<{¶ûâÅË—/8#P(U§ÎÁ*óvÓŒ&Æ#k_ý©‹žˆŽ÷âùgm-¹Ü©s°¿ Ñ qÄ€:Ý%€|±‘âôlwÏí<™\=4zd|ê•Kåª.Ÿ’À!,¯¬²Ùì©©©/^œ¶¼9ÚÂ333 ?3;gKOýƒÓ2­­\Ñi­§fæÝ>7T“’’±³yòdgoïÅÙD\yê>^†YŒ/FÙ–;|èè87žÿ‘ºÜùî‚u–;#Åéé³çæhiíèÓ L|Pôé[ZÛ) ˜b}}“ÃáLOOïïž9Îqpp099Y[[»¶¾aµ³^¾ìªúƶÎÓ»ªÎËÇÿÜPÍÉÉYYYÝÝ}~f!‘ÈNÃGÍã‹Q¶_'†ˆŽóáù¯Ëï.ØPgd °'Rœvžîš£µ×?0¢û @hˆ’€)„B‘V«…Œ8]cÏéÖ××'‰¬vÖÇ?¸²®¥¶©ãt`rn¨–•±n?¶zóO]ÝâSçðQ3Äøb”O†'çÃóipÆ]î|wÁ–€:#K€=‘âôdg×míü~ýH¿~ôc Q0baq¹¡¡aooï´5Œ½º€Ž ;ôýõ ­¬m©ªk=]€˜œªUïv†ez78IœLtœÏÿ¨]î|wÁj@%àØ‘âôpû‰9ššÛU½zK‰{Ä2Õ!£R£ƒQ¡î75âTbVÒhˆ’€---«««¶È‹çÏ^¾>ÓŸH£#ÍÍÍôýõò ,åÔž€É{¡ZXÂa–Už.U6›óàûí³ŒÖvî©søØb”éÝà$q¼@.bU³«§<ÿ£v¹óÝ«eÏj?‡·ŸúræôýÃÇæ¨oj•«û,A«RjúM-=*­H"Wüv1©B©¤ìÕÑT…†( QSSóôéSUÑS8õ7¢?ú3®ÓŸqÿÞçÒ?n[.#³âGn]QüÄW•nZƒ—öç0zöþìíÛ·¦ö;ƒ—M¯º¦ü‹¨AgÙf²v^=¢¬È›Œ°DõÙ³gè}ݼü™eU–[PvÃÕ󖻃É"-~¡Þ4—˜#:>%)=×j10±‡*œét;Â?(Ô/(,%ƒq$¶Ã*U‹½¹õ½%LNÏÎÌÎÓ84·´Ñ8u’Vž:0Êônp’ “}ÃÍë2r™˜¦ãaò¡=ÿìxב\îl²=RlÇÊêÆâÒêúÆÖÉ“·P¶¬V@èãÌOZÒ³ ‘†·çä—þv\°áQq‡ªò 'ÛŠŒ¹‡Ë³óKÞ×á´õà‘9jë[¤Š^KÐô BñO%r K&Sja7Å=jA· êGÝ7@S¢$`›Í¦ÿ{?I£éã ô?;ÿ€L7. ë†ú/ÉÓCøïÜß7^>üHm´n+LkþVþß(/o].Ùþa‹2 ¸h‰*:Âb±èû q“WTn %ìjÔóêÕ«¸Ä4Ò²´¼òdg‡æs46·²8ÕV‹‰=TÓs ËØËËÄÓ;(ËÙ¹ù¬œ¼œ‚RÛ Ø«TKJYkë[æhléð ¼ýéW—>»ðm@H„¨[£¶o–RVå%u M–²(I¸‡ÒÂã‹HKUmSoß5M¦—³ªmÿ¡ªæævwŸ#!í!¾‡)ãÔ¾¯5Âicó¡9À¯[¦²È‰\M¦»¤JžP,éQèÔèp £P,‡òF…ºŸ¦*4DIÀ(õóòõ‹Ÿp²C°Fܸý7¯úƒÓ_tÿäÎ>z¤¢‡¾ƒñ¢üOÉÓ¡G*sý$ޏ™  ‚ÉÈ©!@¹Õù¹ôaùLúÞìÿmUÊ_uÿ[3ÆÈÓÅÝ)Âè}¯»zeå—ZBaiYL®LJgÀ²¸´ „Df^IHDô wŸ[¾·ïÄÂ’œ™çáèŽtT\ ÒQqÉþÁÐa:ý`HD MC˜ØC•Á,Ȭ®mpb‘D¾¿ðêÕ~v~é!1‰éÐæ.®Ø „¥å0a ‹Šw÷ˆNHuó@VlR=O[¨—®¬®æL£~A¡"±´'¸ðíµ ß~‡Íe_?!€°™_òáP]Ó@i·DYŸ}961Åþ¦Q[yE_PzÏ,9*C÷§¦q¹›—_Yy¥KË«6rà D¸¼ƒ'°§#ez78IÐGG^q9¢øû‡Û½ýƒFä±[ÛyŬÊÈØ¤>¼üC2ÅïÝómñ®cÀÕÓÏÛ?‰¢6)€ìôÌC.g?[#CÛÑÜÆ½—šX»áîmžk5vè£ÆìQƒ§o §ª¶¼²æn\"N³r ¥Pi*kê¦fæì¼™Ç€Õ€²eµÚßßߨÜJÏ%æö¡áQòoÙ”WÕ—°«àíØ&ÃŽIS=V®¤´äª{ûaLÍ.ô¸}ÃÍ;(4j~aq÷ùsÅ2â!E«Šrí8F¤8­m|oŽŠêz¡Xa rU_·*G!è–wtvCôÀô¨ú`áwõtð»%=Ò(SjiªBC”Œ @Pÿƒ÷Ÿ¼Ú&-+Ïg£Óï bPì¦ú¯]ó׬„Wüü?ÂË!Ô²Tl´´.—Í™¾,ûBúŸ`¬[`Ðð4@ôý½vÃ==§È0E¢’½/@ .1 â×Êžì q;"¶Û¹ýèÑæÖìqZZ^ ¿Qª{ïÄ$•²gfçù"©n`5ì<}*‘)iÀĪM­h¨¾¡ÙÓ'(42®µC€ ±„]cJ >9;#‹±¼¼úôé³~Ý@@p.ìà 10ò‹––W—RÓ³ï¥1ì¤Ê,.Y\^;n'±è–WÖ®¬m®®ov º…źÁQMŸžxÄ®D™É鹄äôË×o9_wKJÍšš™÷ -*-GnQiUo?ÒAa‘©™¹Dµ‚.lQ{¸±ûÓ°`kˆb9]&W[eHéc”ˆ»— }¥…•Øhlåòó™e“ÓVc‡>jŒ€¾A ñ÷ÒÖ6¶Ö6Ì-.CrEÅÝ3DP“HØÀÐÒÂnOß Wïv®÷SUgɈòÑñ˜¸0Ž¢îÛƒèHeËjµ°¸„ŸIi¹‰©¹˜ö±`ë`E-<Š˜ç™¬Ô¬ÂÔŒìä±rUV×!W¥éÃåQñƒÃ?K{Prw÷9Œ(PX¡\;Ž)N+kÌÁ®¬ëõX‚T®v+xBYK‡r§‹^._ÒÒ!ì’ªŒF(!šªÐ%#èôÊO;ÿúãKéŸ0§¢õÛ=”ßA[@Š-.ìÐ@»ûOÊÿÇHË·:ht,.ªŸšVrTDßß+×]“3 ,!Ç0o*ÕÚGŸè†"ãRà^@Èjiã¼meie ‰ºÆG'&‘ÎÍg>~ŒR;¹Å u,¾Èï’Ñ4€‰=T ˪޼yóúõëÁ¡Vy¥oàmOߨM $¥eCÉÛØÄÔÁÁÁÜüBLb¼ ÷±ù‘Ø@$$gÚIµ °x~aåG¿øæÊ—Ã"c9UõCÃㆧ٫j“Q «e"c‰­XHxTàí$bSQÀÙÅÕ' ¹äίº¶IÛ?„DQI¹JÝ]rÓÝ“ïW—¾ƒø@1ìäû³Ë7W®£Qs&‹UAi·D²”U‰†nyúbq¢ls ½ââ…ÄW—®êFQ8>)Í…ÅlÔ¶¹ù=ä)Š1 K(iÐ0$126‰Ëݽ±…­#u¨×ð2{nx ÔVP”™@w •ŠJ9]âSÐtdLJFF'(TÚÃ3ÌÑ·Ãï”h®Â=¿tÕ§¡w¢-qÀ(Ó»ÁI‚>:2óJàÛ«kklN‰Ì\&³¬FA—¤©­óÁƒï‘††HÍf¾wÏ·ê]b©·úË‹Wáùp-$0R!D`7ƒ ™ÅÄ3ž„¤ô˜ø$$àE0ºzúB^ QhxÖ§:v8Pºœ%¶£cS¨ %61­\r¾195GÏÐÜÇેBŸ„ŽGtÀu¡0ŒLP-®ê×[ú¨1âþä,j€>Ëb0³s ýCÂ!€xü.dAW!K£Õ£Sô4ânÜW—œaÌÉcRgç– û Ú’!oyÁŽÞÙDG (W«ƒƒ×ÌRNJfNåJ ~–°«»%r$ò‹Ë£Ò^½ÚÇB€•ë•áù.ÁåÚ~â!胇ÛäfÆ.± i“M¹v#Rœ—7ÌQV^ÝÁ—XB·LÍõ@ýt eHÿ¤j¨A·ÜÔØ%QÑT…†( A/€pˆ7šþÿŸ_cýEç?‚L™Þ6-cI…é¿=~ø&Ò¡ú¯‘†Å˜K  ¿ýѧ’ÿüoÁ?Ãé×=ÿuåù¬=ˆ¾¿ß^½™Ê°„ ¡Æ¤rî3I©Yó ‹Ð6ñ)¹PÊ›[[Î×\¯º¸ÁcÖÖ7P>3¯ôÅ‹—ä߬kê +.ÑÓ´BLì¡ €$é»?>’+ÕáÑI¦HoŽˆŠ½rÍUlö™¹Eð~$*k[P@$&‚¤±¥ÃNªùùÌ™ÙÅCÀ4ÑÑ)tqó&ß»c¦Æb ;Ö`œ—q°üÔÏ]ò8vW(34<‘œŽYx|bSŒ‡O`JFNc %e=ªÌì|b¶êÕaúHÏb Ú2ròɉiii š3ŠJX”vK$—–×0EÆ%¦..­R6šb@ æìŠj¤Ùœšôì<ÓO ÿà0²!¬U8Í-(¦¤AÃV£C5cQiú«k±ŠèôÃX?0S£dK{'!%RÀMÕÛ/IÐGž ‹|67¿üÝ w,Tó Ë€óuW7/\…¹ûË‹Wººekk›–8`”éÝà$AiÙÌC3ƒL¡É7¼ã Å(ЯDÚþ ¥ô|«Þ%÷DCœ‡ô^±Tô-Œ p;EÍí ÃSDŒãž~AHÖl,ºÇJ—³Ä¶¢ª§Í­ÜÕµÍv® &>YÝ«£ghîc]†.f²i7ƒ22éQ¨Û:ø÷§­Æ}Ô16>u¨é¯/_ã‹ÄÈb”àTÝÛßÁ vÑÍÆ–vÃ=,¢4’}Á(à¶c^%^Ï•ÙDG (W+ÌV9ùç°…¥Httv+‚„xÃ¥PõFÆ¥b<53c^çGƒBZØ%E:;¿”rí8F¤8Í/®™Ûß6^—%€%W æ %H˜B$Q»å‡ŒB±œ¦*bŸMEÀ«ˆ¸5û;¢õºÄ·/eÿ™”A+›/–(ÐóƒgäGÓÚï»qÚ½Þ€4,{»dRý_á¿üDüï%þwäÇFPB‹»“¦õUÑ÷÷â—ØälKHË!æMIéµõÍÙ¹y€@©¹‡zýú5ÊDßËlj%ži¡XhT"Y ñ ÎÀM+$ÀĪaÑÎ.îÁwâ J+DùÃíG ‘žS`J`hdìíšÆ6x?‘ñ©(O„P·Tn'UF^Áäô¼9°ÜbZ׎TÖÔcrÄL!è’ö({‰Ç9¥å‚.™aî(% gæ;×n©¢¾© ‰š†È òª:oÿì¼Bl¦¦"cMd­|RvôõRr QPXb)‹’$ì@˜ë‘ l4%=‰‰ÉÉÕHgçÍ/®¬¬n˜bielEn}9ùEÇ`è ›àÀÐ;}ºA#c÷Ç&¦±W¾èìªß\¾öÕ¥«(‰Í®o`(Éó»u­0‚°a ãá’Ï.üV_p“Qs·§oàìü Œ2½œ$è£#93Ž=3;ÏdU“HÏ-f0‰¹Ž'èF>ñ‰¨ýAjÉóé½KÐ-%sE Àÿ‘Võꆫ_¹~‹ð(…&ðö +—xw“”ã-_Oß $ò ß]rìp°är”l±äZ_¡& ,,/¯¬OÏ.Ð0¤ô±™¹¥C¡LÍ,íºyßšiÌÌ-¢!ã)MìÐGã÷QôÜúæáJ×nz" º YJM_ƒùîQÐô<ùl5›Á¤46&(SÄ'¥ÙDG (W+…Z;:6!K‡GÇ[:øÄŠ\ÂvR&+¿Ó;©Ù†K 4<%"¿jç ȪˆÿM|w A—öLF1åÚqŒHqš_5GQiEs»È]òv^7\iS´r»xB™©…/ê¡© Q0‚^mÿ°Õ÷P<öXk´Ì<ù+Á?=ôêŠRqW8Æ_ ûsÞßÇOò”·úîCãC¯Àží?!VÆx€i=G@ôýýúÛkw2,!9ƒ˜7±Cš]Ùð£Aè<~ü§/^¾Äâ—”‘’…&,2F/ÿPòYúÛ·oïÆ%EŧÃýÑׯ‹ºGÓ&öP­ªm†êº—’éáâ•‘M<ÿì’ÈM ôö9Ó²ò’ÒÁawýÃâ’²Ég¤ ɾÁwò ‰7<ØNª9Œ‚‰É¹C¨mhóòÁŒ<9½€‰•|YL&× Á,)W6vÑñÉdù°Èr_«ÓO†nßñ •ô¨¿¸è쓈2Éi„ìÈ”Æÿð³mz1ãkû‡Ì9‘›Ç¤´["‰,Lî$7ÊF“ ¨S(Aº†V¤ËØUìʺ°ÈXSdd¿»3=Š^R$•!‰~ÃÓ²ˆèxð$qêÝBÈ®¬ÅjÕèËKWQr`hlxì>dfvÛ2¨"ýàxs;!€šZ¸()éá`òŸŽÃˆ¹Û?8œ†€Q¦wƒ“}t$¦ÓÅðȘ©ûZb^âw!M   °˜áùV½‹/"P§eò O °Æ#íåŒ@‚àçë ¶Ir}…‘”ÆK”êþc‡¥ËYb[ÛЂß2"±œÅ©Ñê†éšû˜¬G}(4~”lÚÕ €,ñ¤‰ú¨1bhxÂtª»?ã|Ýht|:'¿˜¼ÿuYÓ΢ùÈ9‹QHi„ !Á((1vgc) l\­êÛ÷ö^ÌÍ/t ÄÍm<ó˜lRÊdäµwv!ù >t*Ò= ujVá[ˆ'™Ü; ü¦‡ÿ“g»»¨“/KF6“rí8F¤8MÍ,™£ ¸¼¡…o ä×?dº×ÓwHailá·wŠF._BS¢$`½}Ükø*ù¬í-–×o_)ýÃï…ÕÐ ÏÞŸÁøó®}Qþ§$~&úW°xiN)€p¤ŒyÃâ­ýö úþbW|'.Í@2“§S3s8}òdiìõ‘f'§eíì< ‹mçr»[¦ÆJ… î}GÒÕËþ±Üß ¥Zg5vè£Æý ñ³ Ôajf^`èO _ê +ûÝó- Ê¿Œææ I20‚¥7 ÏÅÍ J(=;ïâ•ëµ­6Ñ‘ÊÆÕ*ƒQB.%åÄ·ÏHä–ñE¤”)L5¼ÆnþüñÅ´L®Âå‹Ë«ÏŸï1KX"1ñ¬ÆNñº&%«€rí8F¤8ÝŸZ4G^!»®©Ó¸|iS›ÐxÚÚÑ ÐÁ—Ö6ò`©oæ·rßÛ;%4U¡!JF°Ùl=qðfÿŠâ'Ð?áþž›æ¯ã‡o^ýò×àw^=¢@_n’|teF£t£…| ô臔¨p*Ê\HI¡;ôýýâkçðèKHÎ þ¾‘ªWGžæ°Þ¾ýñÙ³]2kdìþþ>ñ¹ÏÖƒ‡é9ÅyEœ7oÞ®¬m W©ÑÁ.+Ö ŒìïïONÏÑ4€‰=TúfîÂâ ùgœÖÖ7y i7% éQí<}ö£áÕ5uÀïÇéèø$ùÇQ°ÀÓ·b Õ¬¬¼‘ÑéCŸ˜ÅŒI*oÿŠªº‰ûób‰Ê°B³QF¡ê#§঻¯J£#¯MÍ fÕêºf¤½ ¿‚ÙéÉÉf1ûê ÷O oñ›[¹DaÃŒ¯ÒèÍ9‘––Ci·DY)é9¾ýîvD4e£I©„º›„µáó ß±PÕÌìÒòʆ)æVɆ$RÃ$žË<*C­AEÆ™UjÉꆻOHD41Ë{ÇÆgîÆÝ»pùN‘[QU’Ð=ØšÖ¤衸ÄTdâÔÃ'°W;ˆW®s7 £Lï' úèHH!ÞYŠA³Ü°`(‘®ihúŒxŸñÞ=ߪwqù„*aW¡Ln^±A=kHWÇ@ Qƒœ%,>ù¢ó Øa$ä…O ñ™\{ìp t9KlGÇfró‹È ED´ó„VšûØøÄÜ¡ÐP3Ù4!€ny™Ä&¦Oe”}Vc‡>jŒÐéGMßXA¾Ü‰IÐŒ"+›QDÞáTÕ]¹vëÊõ[†«²s™–Œ¡„ü à^Jæøø¬At¤€²}µÚ{ñ“ytbf§xðÃ,­êQŸ:d2J‘ 5L®Xð²FVeÃ?¼"—³åÕõ½½0JåÄûŒÜbʵã‘òÿÿÿìùS[×Çß_ÐßûÏôhÚ:™¤ŒÛ&µ™IÆY<^(61‚Ø7 A@ì’XÄŽØA¬ZÄ"Ђ1%MÛ´v;v2mÓ¯$—jÐÓ“ôï==Íg˜Çå¾{¾çžstãÚòF‚[Ó;¡±éž±ðýðDèwzºz†B#Ú¾‘‘)Œ ŽNq,C¬NÐh4¯^½âh)¾}}tךúhP¼/7ÃçD6@_UðÛ??ý÷þÿW_ÿ럡÷”éüµ¬ Pèmð?›øÉ_ßü‰GGà·¿ï~™}ï+ÞÜ+,/®PÆœ–s_ñåÃ2î9P’©y……¥µþ÷^ÜÉW„>[ü©«Ü¥ùÅUp'1¥–WÖÚ6¶#ÙÜöx|ÏvÜ^‡sÇx/†ƒ—ûé³Ûn_èÚ·ÿ¯¨lv.ðièF÷Þ>æàv\ãF\o8ß~iÇíÈÙâðøBÜ»~L°;vX5„P”TDû«H°»·ïõ=éÀjÏzxîsmínn﹃?Ñç° "wvý<x‡Û÷¼OO­ UöMŸÿÀã}Ü¥À&`tbWýûÏ·‚îàvÌÜÝóc‡q½ëy {î?m,fÂYneî4’3rç”ùÜÙ…Wÿ^#sNÒ\ j¸©…Hí?=Ä8Q ¾àEø-üÊ!ZÊE«…ÀO]ÝÞU“IâÚÚ‹©5Ç8ðýÏñ·¥xÂÛdæ®îª +œÁ¨‘Ðú;Á킉'ÆÕþAƒÅ¨ý@à;¦ÚžÖAÜ…MÀVØ[ðO!ñQB•”$Q ¨~ ¨>5x· DQYÏqש³ƒG¥0vçn$ÕuMº¡hôLëúFO öô0>ÒÙ=Ü74Ù?<ű ± 8A¯×Çì-^þðÝÎßlYF?s²X8w¸ýýÕû™·r‹¤”ˆ"u1ø>ù»¥I”ZZV½nÝŒ†ض8&XíÛ€cë- Í/,*ãžSä)£EŠÊàl¸Ë’ˆÞ £«b—ͽE–è7FQæN!¦Ï˜ù e×YnI´¸SŽÕ4Fpf'¤GŽ%Ë,¯X3~w%ã·W>¿x;jæ‡Y‹Ë묃aÛ¾•hXÉYPÒ9­xW c±ïDRQÓØªˆÚmßXä¸V?Ö¦ Á§º~ÇR0Ä*à£qqyeEìÖ%98w¸ýýå{7î<”P"ŠTuGÏôœñö—EI”ª(­Z[wJ™‚‡Šä.¨{¤j^^۬¤ƒ(s§SÈ2Èü”N9!]0Yœ¦õNm_Ye]K‡Îbs™­.ÖÁdYŒYPÒ9­xW c¶nERVÝ îÔG£¥+ê—†Xœàpn麻Oý›ÒT|À8âpnsûûλ×sH(‘TEIÕªÉ!eò!Õ"ÊÜi $ÂT‡ 2?¥SNÞ.Ä,(é¼+…Y5»")­¨onëmnë;o`ˆUÀ ŽMÏøø„Íf»9ë. ãÎM·¿?¿pñ‹ìü/² Dç e#µ¨¸|iÕ.erï=]Cª+D”¹Ó@H„©d~J§œ¼]ˆYPÒ9xW ³´ºII…²¡EרÚ}®ÀDI¹’U@8ï~ggçÁÁØ= ÿÇÑÑQkkëžÇÓÙ ï_úôfÞç·óÅ~ñÞ%ÙH-xX2·`2.[%KNn¾èRZ!â‹(Ǭ/Á :ä‘ù©›ròv!ž‚’Èp–Jaæ­‘T×5Õ6t¨šuçJ]CGÍ£fVᬭ»Üî]µZ6BìN†Ï­Ä?~hZߌéì‡W>¹zíög·î‹K֧ٿϺ&©…E¥C£³s ë’%;çžèRZ!â‹(Ǭ/Á :ä‘ù©›ròv!ž‚’Èp–JaX6<.©T=jìR6iÎ ,£†¹x‚aw¸_¼ü_0«Í–B¿©ÜÞÞîñxÑýÄã©¶gè×™W?¹ž‹¦U,`t½Ã²‘:42U«lžœY|7¶sã•+ùøE>Ý_qªxq²Ÿ8‰wG_øÍb4ìwû¼nŸ÷4Ÿn6ÉRæø<›z½MÆFz3»ïþNYMòÏÁUu;ÔØ©ôVœ²È§Ì%í©¿3(9LË?–Ýæà3“ü`Â`0 7ó&HS2ਸ਼¥R'`¯kT…Dd79lÍZKã\R›Çá•®’§§úo|¼Ñ$m×½÷¯ ÀØ @o6  —»¸Ï±c2™-–?XéÜLã>—Óã ‰.içƒÉî‹&佤AîÈëôE/Ï‚VËä*³'ý5Ë—A.á·[”ãi¯ôX[œ@ ²ë°˜Mò%Ç/Ó÷ÇüR ´ßüaäñS*ì’çiuí¦ÏB>É©ÎgÁ¸·ˆú‰&g¯£6嘽9š&—ß>]²Åò¹¨š9=’ó +ÞÖ(}—&Eøì'èÍ4~<Öl¹[£û~-¤¼¶‰= µ!¬A¹Zzií“5’’åËgl¥çùÞ]M¿ÍGS~Ñ#2Í)u> ºù]Óª•›aïf8Ï?ša|™Üúj\øÍòKÇ~_ùÅ4Âù2èÍÔ-îMŽ[\¡îë}ÿv=ýÛÐbIÔ¿+K&ÖPa4ßIæíµšöšg-Ò>s+ģwÕác\ êß•Ps¨Ç‡qŸäø¥ Ÿ7ØÜ·3bÛù]õmT½ˆˆÅ!¹ùÖmÍ>ŠÉÇ2¾;T^;ÿüDü+ @o6Úk4ó‡a¯û›¼ f2iîúëÈv­D@%dž5ǵèéXD‹—äpÎùO_ƒÞº?ÈŒ“ež$ÝMvœäªæQ' @A5:R{ÛÊW& åÃg#šñ.@(›¿\˜rÕî} ;Å¢ñïp0 GºŸ(¼ OO¾Ü¸XÜÿH\ïv·‚Ý^”ºŸÖ]1Ó˜[å¦Qâ¢%Ø3NèÈÒ^F«g:• ‰œçƒû4Äx— ”Í‚ÂÇ¿ Y“}º0’«ï}~èû ífuAw4Þ%è#ec:µ,T÷ µQ›®éQ¾àüð(sfÎÊfïžcZÆ»}  ļ–»¯º£ËÎÿÒõß0Þ%è#ecü}ã]€>P6Æß÷È1Þ%è#ecü}ã]€>°X‡¬CÖ!뀀u@À: `°X‡¬CÖ!뀀u@À: `°ÎÿÿìùWY›ÇýËfÎü<ÓowÏ›EM:‰k\¢ÁFã.î+n "(®€à‚Ê"»+²¸ î5.Ù÷tzºóÎW™Ã鉤$Ž·Îçpn=uë>ßzî¥ê[˜ÓM @ „ 1@@ .Ä@¸pd’ld#ÙÈF6²]°-àå«·@ Š€W¯ß@ \(ˆ"pá ˆ@ Â…ƒü @ b€Á¿¹ìåíÜ/@ðÄ‚C p ¨ Ђ}I,îkåw45óηŸÈ Pâþ%£ìSköwTj-!10èÚýã—ÂO?ÿŠO ˆa1¸¯Íþ©'ú‡ê,kKðY6å_^Ø~”R©µwi÷®ýçOÿø ‹Kñ§Ÿ}û÷ÿˆŠŽöq.]º|îNTÎ]‰ƒÛQQñññ™Y:ý(Ų xñòK´ºQÜߤ2•Æ 3Lœ=úÑI|";4@ ô|KªïÈ>f§¶Žt=5=«¼ ͦB=‹ƒO ˆa18Æõ©Ù?ÝD{£PgV[‚/ãm䡼šº†+A¦—”W1꘵ÌFPÓÀòRÓ2Íë·°XgÎ mí¾ ’Z¡ufœeÅ(0™-:¾½£#%%•ÓÌûÖÊtm€l KBnÌhÂõج³öóÙ¡J::öÅeꯙÈþ.ÍþŽJ­ ‹¬®eu zÅ}ýRÅbX ~+4B£3øÚì×D{µPÞ®-ÁÇñe¤Rko†„U2êÚ;…"q¿¸oPÒ?ÐðJ+k>~üäãèô†s×p¢ÂOŸ~ç®ÄÉÛ·ïö÷¦¦Œùùù£c.gÀó¯#êéUªtÓ–9óŒÍ€…JÛ#éw©Ö7e»©Ùß¹KK,)gÄRq¿ÌK`ðâòê„{I¾9ûnNôÊ{µ%ø8Þ6@žh‹§%–Vt %BÉ€R\VýáÃGG£ÕŸ»?UøêÕkNO§¸\œÏž¿:Ž@(›0M›ç|‡±‰iPìR­ÏÊvG³¿—ÐÌïH¤^¥™ßs‡vƳ?:>ý'úl å¥Ú|o O´EÇÆs¸ü.¡Ä7¡W¼{÷ÞÇQŸ»ÿU¸µµ]YYårq<}y¡¨w|Ò¯‚HtƳ?>iRkÇ&¦,?d¢Ï¦P^ª-ÁÇñ¶òDÛø^[W[—È7É¡—¼~óÎÇ‘+”ç®Á>{þ²©‰ãrqì¼8ް§lÒ<6iñ%ÌPåR­Ë>Y³¿s÷ÞƒÖŽ~§Ø« ñì›,¶ £U©ÕM{>ÑgS(/Õ–àãxÛy¢-ŽvËï„òM2s ^½zãã ËÏ]ƒÿ*|ùòuK ßåâ ØÝ{vœna/nú¾T¹Të˲OÔìïÄÑ’¸|Á€Dg<ûS¦Y01eU¨ôjÝ„‡}f…òFm >Ž· 'ÚbãiM¼6ŸåaFÞóç/}œéйkðk…<^‹ËŰ³ûô8Ý=ä¯U.Õú²ì5û;±ñ÷ؼŽ3‰<Ÿý!åWÈF´Î£#šQìÉÕR™ L-ƦÌr•N>¢ód¢Ï¬PÞ¨-ÁÇñ¶òD[Tl<³‰ç³r¾|ù²´¼Âá¶–3X'ÖÖ ‡ËˆÄî÷ÿ®Ú^L††•¡¡aÎÿ½ heí1â³s‹ü¶NµÖ@qn· G Ÿ:uÿÀpLL¬Î0áfo OÊ]UË¢¦ŽÅùûúñâ%¯…ŸœúèÄ='>!eçɾû¬­?þùRƒ_¯ßOIïõ">6aD„ÕÄuy–V?öÏÀߺ„’ïÊ夳[HÝAÐÓ/~¹œôP¦P«g“ƒn&ˬû٥à Ü^©‚ÝÜf™EO¬•ÍÇ;r[Ú)’¨r©ÖMÙ}R%²Œ¨4é¹2óªõöÅ%èÄ¡.AœÐâò:7œM{§Á¡aÅÊêÚúæö:D.Ø¡AˆÄ ·ž@öúÆc³ÙÚÄ¥’}¢fçzHdayÙôòÍÇ[x³šé•,(«EK»Œ†fx 4eJêqÈ£Ù?B¡Î]ø`™RçžÈ \ëÉDS .EÀÒºoµ¸w» •ŽqôËÐþÁ³ £ùóçÏÛ;Oй­SptT;;oG£C J¤G/͸¯eÓ˶¶wþøãYÛâë7oþøãèÅ•Ööb™±_¿~Ïþø»´šÚ†©wlħÍóyùˆÓh ݱÉ2åʘ¡jF]\\<â’¾Av÷¶ë×\^ݺ?ùêÕ«¹¹ôÔ‡éè{„q**¹yô¯pf/))GO™\í¦Zo O*|#$¯¸‚š’ÊäÂóÂÁ㑊šµöðoå?}úýógFûÉîÞÇŸ&§Í»{{ˆ—VÖའ¸Šn‘ <Œr Ë666÷÷NÌ B#o¹}qì¤Ô ÇníÑ_”šyí:ÃL6Áô¬<´eçáÑÛ?¬ÒèÑ€™€«82LüÍm÷“r8-GMæÙÿ¾zýŸ¿¥¤góø]ëüΓýõmÃèÔ/—ƒÃ£âPœKA7ã’ѹþH0|¼Ë£QŽÆÄ'&¥>B#—^Ãqû íªæòÊÆé:0[æ0NyUí¥ 0ŽSF v«kYøT©õ£Ô!Ñy¥¸œàaó6Ø/áá/g¢^œN/*ûõÊ5]*§¦®žårq,­<>«©Uܯø’~…maQowFfçlSÓf4†å*‹2ÚŠÚ=½ÃýC ö¥þ!5‚x¹…EI¿LÜ;ˆ†J;†à L‹7WµFO‘@•KµnÊ÷Ë‘qq ~kÆ /Ç&“¥žÅíé“ýáõ:9%¯ÎhO¶vô˜-3SF³Cì‘Å:‹¶F«‡Tǵ@<‰<ÑìïßÏ+fP[XŽ»’~tœ–ôhoÿàý‡©tıT¯¬e×=ãñ5£‰<›ýCdJ=pîöôʃi핎H”ï †•ú#·äÑâ¤.TaYŠ×rðôÙ›·oÑþ믿êÙüzv+¾üwhI´Ä”§ÏžÃÍ ³uÖöåË¿AÜ>jY\ñÄYh0ê›ÐôI¯ßŠÌ/,=¬í ÌÃÚ^L†eªÄûIð7ÚÙ%B\®Ð`íñ s+¿S«›0Ñ Šod7#ŽÎaa‡UUkG|˜öÈl±™­¶ððˆÀÀ ™¹Å¨¨è«Ç¶ÅåMGêâ’2œ5$qSª· 'e ¼v3›^BMair§MÎnÈÿ:|Ab«4Z4àrè%•¹…e"I_.½0$,R¥>ü ¹‰ÛÚÑ-B£±‰«7Œîîí¿ÿ>éaÆŸþ‰{ΉyÁÐ(<×ÝǶ°„G2á¡·ï\»Ž6œÇÄ”ÉñG.f#×ñ˜OËÌÝÞÙ›_ÈÊ+ìô(G´‡¿¥eâßJ¼óWRf#‡âèÊêfŸtzÿžæ '¿ñòÊZìŽáJ+hÃ¥Õ5°ÑŸ4¹´¤‡P¾W²½Ëå[Û»çæazò Ëpú°¨i™¸X—Ê©S×Ö6¸\œÿ ÿÿìÙSY–Æõ'ÕË<ôKGLGtOO—«lì2ÆxÅ66ØÆl^0 v$6’;fÚ!±ˆMl´¡ ±™Å¸ªgºªjÚÝ].Ûó%9AÔ€HÉ–©à*~á8yîÍs>Ý{3ó¤”Â÷òËÃÔÔ½«õGÓ½gÙ‹R€ÞlïV£Z4[aãˆu¹= åï@ÁáQõêÍÛôŒ‰îÜÛ¯‡S©ÑŒ¢<òtJUpJZìŽn ITùT l¹Z‡Œ fëôœyÆdu¸¼Ø”+{ÑDFûLí¼zÝ;0‚VÜÌÑûNÏÌ¡‚2åQ’òC<ú L£9Üùöòœbô÷_“S8U­¬®Á®×Á¯2À.¯®«Ü»`÷ 1ÇA¢àfŸUØßT÷c³_7†"ø¨ÎZ=ZýFö;ÑÌUPJ=&õ÷¿¿ÙØÜ^]9•3§®Š}.NŽÓ½~‘¤Yª`Snš7?ËÌ+«”ääñœ.qÚ?ŽXØ= -ìÞþAØrÕÀü¢ ÅM!¯²RØ S¨÷œÚ±‰Y5µMâºÖ"~å’ùh¶3'…*Ÿj–­EÆñ‰)zSÝ7ŒÍÑq#l@“ÆéÆ–®–vYN>¿¢J‚+¢gyE©êƒf(Ç‘i¶Pò¬6‡Íî(ä Dµ/šZQMΣ9܉¼t-+¿ì(Ò3òw^í8¥N§3sKô#°K’ a TÆ q7û}º1°¿Ù«5¨ûF:k´†¥®[®õÙïD3Tn±àõ÷€ÃòúxläiV!ä/oß™”úìÞƒ:ôW`(Êᤠ ”'Üæ¶ª Ôê‹J«Ÿs‹î'¥gæò‚ÛSnOïÞ½'–Ôï{’“SéÚe@g€QV^ §¤¶vi™`ÑâÄ 6<ðÓ ºóóÌlÓ‚Ìšls&œBV¸9yii°Ÿ«˜W‚½úµCª uÌH^ˆŠyÆ-`&·¨¹fæL7î$\»“”šþ믿º<Ëhû@}´Y»¨”ª“NWAIEó‹6ص-ðo¼Üô,/ÿúî¿¢úo?ü`[ZÂîÜB¾ß¼Õ¿Ë³8¶%7®¸©OŸonïnní®­oãú ÿÈØ^TÛd[òœº\\"€sÁâhzÑ908ª£öz’ù$ƒ ÊJZ%”0´võ¨’ÒöŠ€ TBýº!ê+Q-4À0Œ­v nû…âz8Óó>[ŸfæFÇÞ¤ÃvËTí]rܽ(…4³& U D2EoTìõÄGi ÍmÍT„ñ¹û ù›o¯ØôìèVÀ‰VêÝI•ÔÇøU ><>•3§®¬û\œœ%çêaªkšºdý Xl®eïêØ¸Ç<*¡•Õõ©™EøûPU¸»e}°5}zØ2¥§ œ»¥2%‡Ãé³GÑkÏúÆÖ¤q¦¬B¨R÷!‚q/PåSmÀ²ûzl|j߃ºg|rª½[ƒ·¢šzˆ±Xí f;Z­v'l±¤A¥îÇ›E çÔì¢weM®Ô” „Æ©™õMuÿH0šÃo¢¯fä–ENu^sy¼•5M4?ÿü?oÞ¼I~ÂÕê†ÑÄ«—UQ¿¨ût q7ûXu`S¡dè¬ÐP­ÝšæV™ßÈ~'šy ² ©/ ÝïÿØä üOpËÃ+{ÿáÃÛ·oÓž8\˸9ææÝ”Ãæp¡ç‚ņž™Üüü’êþó_ßÿõ¿2²ò”ê¾7oþÑ)Ó9¶§ £éÒ¥KÑÑÑ\n^Ë‹”8QQQ·oß±-yéš&-ýÉàð„¸¦v¤§¾ø»÷`ãV»£üÁîrE/ £7nbßm]MÍípÞKHD””´¸¸[@aDg/*¦ ÜC¨6ÔP0#q1úqf3Ùù|äzõjW¦P釆üñ§÷ï?tHh¢Ì-*…]UCýV@©ÖÄÅ'lmoî×Á?8L}ŸþãO?ÁÆIûzWVý&¥Ù[üÞÀ1[Ô“¼Ÿðí}É%’4ÂNIϸtõf²7¿¸ N¥f``У½Kfœž;wñRbRšÝ±xÒrA5C«al 1¯ÄÅW‹P.ÜNxˆ\XÍæÅØä,NLÝòÞ}Ï¢uéõé´rt‚º´—UÕUŠ©?282É Q0³OC?¯³¿I/ZfšÚdôzr¢™*+Ÿ*€Ö_nð—W7üøÓÏhúï¿ý°¶Ný-%¾@"ªkÝyõú=õú°ûúûjI zvöhèž™ye-í2,fúf¶:2røAŽíéD®ì¿}'~ÿ{«‡ áŸ7»hÆóì ã*¶Sªp8W±×’cåñÞ³SÝ=*:ŽOåÌTT}.N΂Å}˜ŠªÚJ¿´K5rµ®µKHg©RÛÖ}°'öE\‡‰U>Õ~¬ì£ßŽZªÐÙ‡{vöôøÆýjw".ƤgHüìË5zðQ«È.~'ú“êqVaa©ð°?§H8³ Ê÷mìõÛÍ`ÆöÔbZtÆf4ÔßJ˜û­5ÐäôâÔ¬•ÞDa4·à8°ïÌœm¸°gpÄ8l˜ÂŽ¡Ðê(m_GD&?ÉúŒp KÒ2r>W4\D-6÷G±¹µ»º¾uÀiw,Ãï^^‡½ä\A‡Y“ÙåY]^y¹çñ¢Õå^ƒ;jØN÷jà‹yeÌ =Ëkö%ÏÚÆ¶Û³Fû=ËëØD³º¾Mgôxבݶ´ì³Õj÷¬­o[mN³ei}cwûtð—;ŒB:8R/{7`ol¾‚ Ra,9¼°WÖ6îŒÛÊÚKz¬hV×¶ŒØaåÌ”–Wù\œ™‡)HšÛlª|ªe³l¿šÃ³ßĤfHüìËT: ªm z—à'úØ*cK`9¡.€‚Ñv&âbRúsÖòUDä‚Ù ,V÷¢ÅõYBå”ÒmøÊh¶ºö:Üj¶º;™ßK€ ý¿‹ õJ€™ß×oá—|.NÎŒié0ürqC«Œm@•Oµl–íWs¸óõùèä§yÇ?ûÝ í§üDÛ@…bl ,'ÔP0Ú¾<{áAê3Öò—³‘s K,''¯øÄ5„µÂb~…ÏÅÉ1ÎXS\*ªk–² ¨ò©–ͲýjwÎDD'=É=(øÙï”õ}ÁOô± T(Æ–ÀrB]£í/_ŸOL~ÊZþ|æÂ¬ÉÎr²²óO\CX+,æUø\œœ‰)ËaŠøÕµ]µÝ¬ª|ªe³l¿šÃ/ÏE=Lç>LÏ 5gÎE±yöýNô± T(Æ–ÀrB]£í?ÎDÜ{ô˜µüéˈ©Y+ËÉÈÌ=q a­° ¨ÔçâäŒN,¦_%ªï7t²è)àUùTËZÙhwÎ}s)1%ëA7¤ ÅWç/±vö™èã¨-儺 FÛWßÜyz7)üñ?ÏMN›YΓ î‰k_…£¦œ<žÏÅÉ;L©@R!jÖ¶³¨¹¬²Ö§ZÖÊDs¸såF|\BÚýÔìr+1ýzÜ=ÖÎ~ }<¢±%°œP@Áh‹¹wõvbüÃ4vò‡?Ÿ=ñúÕ/éO2O\Cø*T÷äåó|.NŽ~dö0 ÍPa‰¨RÜZ%icP=JͰOµì” æp§­Sw7)#1%+D 8R´w©Ø9ûNô1 TèÆ–ÀrB]£­µC~>*6.!ù΃4ò‡?}e7±œ”ôŒ×¦ õÃÆ*QƒB¥ó¹89ýzãa†¦Z¤|QiUc¹°E ~qR ;4@ ô@•Oµl“ýQšÃAÃl¯ââå[q éñI )YŸDXG $bÛìÔD‡t B=¶–ê(mX]ùÅåQ±Wo'ÆÝ{tû~*«ø÷?žÑ̰œäÔg'®Á¯BL48q%ûh'ê¡jq“¤¾õ¨S§w`Â'ºái™R_^]_T"ÊçU?|!þEvh€è9J*{dšæpgdÜÔÞ¥J|ô8æZ|dLÜçá2õ/"l[— )X5ûŸ6Ñ!¨ã[›¹âWòöV¾â¨Ë×ÏG]¾ðm, ÿƒçß~÷{\#¤¦ù·?7ÿ/þÑ2.]¾ ÈT(’´€Ï.àÓ¨5–WÖ– ÄJžáÇQõEïÞeÈ0;<:wR ;}uaÐÉ6ÙŸ 9ÜÑêc“‹Ós¶Ùù¥Ï",‚³sö?a¢C4PÇ3¶Öê(x…ìYùáÈôœýÄ5„Â@Nq¹z„@ áTÁ‘*†@ Nœ.™ž@ áTÁiïÖ@ œ*8-½@ § ò @ „Sç‹P¾Î;ÒøIII!jý$>‰šã“ã—Ä'ñÃ7~¸¿x‘ˆéî ”Ä'ñÙŸ¿$>‰¾ñÃýøý‚@̯p_ $>‰Ïæøäø%ñIüðîÇï¤b~…û%ñI|6Ç'Ç/‰Oâ‡oüp?~¿ ó+Ü(‰Oâ³9>9~I|?|ã‡ûñ‹×ÿÿÿìØÁ @Á–쿺» |»0)`^ ˆ -õ‚òù—}ûåó»~}¿ã´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷çÿÿìØÑ BQ DAKJ)ö_VAÌÁÙ† oÂ{<Ëy€_?AD>ŒýŠtSßïø´çÛïçóÿÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷ûÎ ÿÿìØ± Ä ±ŒäѲõ™ÀµO ÀÊ@[êÊç_öõ—ÏïúõþŽОúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿_žWDDDäŸ2>@{ê Ï¿ìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýýòÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯï÷É ÿÿìØÁ @Á–쿺» |»0)`^ ˆ -õ‚òù—}ûåó»~}¿ã´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷çÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ @Á–쿺» |»0)`^ ˆ -õ‚òù—}ûåó»~}¿ã´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷çÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØ± Ä ±ŒäѲõ™ÀµO ÀÊ@[êÊç_öõ—ÏïúõþŽОúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿_žWDDDäŸ2>@{ê Ï¿ìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýýòÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ @Á–쿺» |»0)`^ ˆ -õ‚òù—}ûåó»~}¿ã´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷çÿÿìØÑ BQ DAKJ)ö_VAÌÁÙ† oÂ{<Ëy€_?AD>ŒýŠtSßïø´çÛïçóÿÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷; =õ‚òù—}ûåó»~}¿ãÚS/(ŸÙ·_>¿ë×÷ûÎ ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯï÷É ÿÿìØÁ @Á–쿺» |»0)`^ ˆ -õ‚òù—}ûåó»~}¿ã´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷çÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿìØ± Ä ±ŒäѲõ™ÀµO ÀÊ@[êÊç_öõ—ÏïúõþŽОúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿cí©(ŸÙ×_>¿ë×û;Оúòù—}ýåó»~½¿_žWDDDäŸ2>@{ê Ï¿ìë/ŸßõëýhOý@ùü˾þòù]¿Þß1€öԔϿìë/ŸßõëýýòÿÿìØÁ @Á–쿺» |»0)`^ ˆ -õ‚òù—}ûåó»~}¿ã´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷çÿÿìØÁ‰Q DÁ I¡lþÑx"ÐÁ`¬‡«(¦Äwm©”Ï¿ìÛ/Ÿßõëû/@{êåó/ûöËçwýú~Ÿüý—óü€o‚ˆ¼û馾ßñ´çÓßÏçÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯïw@{êåó/ûöËçwýú~Ç´§^P>ÿ²o¿|~ׯï÷É ÿÿì›ùS[W–Çù‹æ‡®êª®®ž©Lwº2=qœÎ8؉Ûí³ïc6³ $±6;ÚÅ"!öÄ*b“Ä.V;±Íjú+¿*Êc=„Ê&<9¾·>¥:ï¾ût¿>uôÕyOæ×m€È ƒ 2È ƒ 2\p¸E‘AdAd|bÃmkûg@ „O Ò@øä @ „OÒ@øäpÛÜzN ðIA @ Ÿ¤"ðÉá¨Ò6µ_¾òã…‹?g.þýÿðŠ­!2OáÁšÿêëo>®š7LŠÅ²â’Ò|Ñãs¦ °¯Ø ƒñTœŠ¦©ÃÃ?òÂwÞÿù¿·Î“ÿúò^±/v‡Æó@`-Îû·Íg´ð³r._¹z?"š0ÿœäŠðŠ­!2 à$ÂYÁlÍg >¢šoií@ÿ¡PÖk›Û[ۻϙ¶Ž¼bk€ ˆagd* ^±5@Æõ›wš[Û¯ÂoÆkžâ£¨yýødiYUskgßÀÈà~hÄÀØ £´¬Ò0ad<-´¨›:.þ+:„Ý_2—R¹’Z½~þ`_ì _]‹Ò¶t1ž#¸ˆÅ¹Tÿà¶¾±m@0‹Í«+ÅòzÆŒ670è­TáL 5ï<Õ5R¶µpT7¬gÈPk[j$rÆÓBËMßG>‰ê„§KÉëÌ > wüãÏ \Êâ\ÄKÝÖÖ·ìñò •”WJ”.‚¨¤ÌË'€V*p&šwžÊ*Ig÷@¿nÔEèì3žZ¾õH}gŒ+µºáy“ßÞe1ž#¸šÅ¹‚—º­Z7íñ ).«)­’¹I´R „3Ô¼óTUK»zt=}C.Ä@ãi¡å’—à¡h>ªxÅ€èa<'Fp5‹s/u[YݰÇ?(´¸´¦¤Lì"@ $ÑJ%ÎRóÎSU#ïìÑuö º :Hb<-´\òÉ /X -¹‹ÐÃxNŒàjç ^ê¶´¼foÀ½Â’J—’h¥g©y穨’¶uö»ÄxZhùÚ3/D¸è:@ã9!0‚ Zã^ê¶°dµÇÛ/(ïq©KI´R „3Ô¼ó”UÔ4·÷œ!šæŽ|Hb<-´\¸+ôÏž?oî”oÆ™•ô0ž#œ³Å EO2sDŒ»¨c/u›_\µç®w€ ¿Ä1ܬü[î^w<|y‚jÆ?(ÔÓ'ðÔ ßH¢•J œ §Ö|Vn þwO¿€ûéü¼“ÖGD'`Y:?÷·WóOË«µ­]Î –×=ˆŒäž´@¢¨y”—X«nvò=i$ÆÓBË·…ž\³~Œj»àUü½Á%Ÿ¼¯¼Ÿ\{Ôçxý=Œç„ÀŽ-Ž'ݺëý0=ÚÅ^~Á¾÷Nr96/'84ÂË7è~D4^Æ&þJ]Á‡{©›É²lښ̜BÇ䊞íîîÆÆ³¨“Ù²µ½}ê…ï$ÑJ%΄Sk>;¯èè­±³³c˜˜Œ‰K>i½¶¹ Ëò—þöj¾øIeƒ¶Ýê5-Ʀ– q]X\nlétò=i$ÆÓBËç7rn³M'q-a,Y¨™4m¼>:zýúh̸–*¿ÉšrpÉ=Œç„ÀŽ-.'¿äµÝÈÎ+¦]¼jµ...ärñIiƒCÃ{{û8µ±±)‘)bR¥Æà½ÔmμdÏ wo?Ï1ÇßM-m‰©<ÌÌ™Ìh€°3sï…GÝòð½ãé÷ÓƒÌDÄ$zøÆ%§#öòñ ø Á£d&£âRNÝ @­TáL8µæ¹ªÝj]kïêëèî7NÏâpn΄Sa¡’Yéوã'±ùš¦V,È)(Ádt|*nAnº{û…±2μ+×üã’ò:M‹3Ô6hÑ&Â%§rx™Ù¹Y‚˜¸D7K,¯—Š¥r,(¯¬‘©ÔÊúÆt^vdLÈÈ(ëµNî ‰ñ´ÐòÙµìk)³'áËDßc´<ãJV…*ëÎÞá«ÝƒÛ,N}Úô—[¢ÿþ—ð¼*¿¼šhüëâ¿ùÔP~é/ÃáÕ¤©âô_x–vM€Ã<ìu°ô0ž#8¶¸La¡ÍßÖÖ»zuÇà›n‰¯j~^bZ&b|•#^]µ.,.!xÛåŽ1™-{{{šæv©ªaqy ª$ êÔýÈ8w/r?ŠrB4ˆÑ'P]½UÚ·À7(48ô!æo{øúßObg¾Ÿ—ºÍÌ-Øsý–GjFŽc2slß/^¾DŸÏÂÌìœykkÁOá1R¹r}ccyeµ²ZŒC‰¼vjz&SŸÀâéõÝàpRŸ/ÈÇd•Xqê^’h¥g©5ÏÉÌCÁëÇ ‰©™ *ŽõìÙóýýœ’)êPÉü<ÄUb9bž @ÝØŒõÙ¹%¥§qxfó<Ö÷ö †„;Sð®\ó¢¢§Êú&§¨k4&›Z7¨µÕ5Òª)>þ emnA±ZÛ:4<н}:U};#K&WŒêîÑ$9»K}$1žZþôcÖ•„™“H)3ÛŠ¤´ã/wJ/5r*-ªÞmÿ,ó·QÃIÂÆiËæêÆKu§ñN”ô:kvlÚªl1|ÿhòrütEíð蔓ߕ·õÏn>Û™\ñ‹ãBÛèa<'Fplqܬ|”âÈèXhD,El[˜_ 7{ZVüâŠj)â4@ ‹Ž]îí·:88˜3™Ñš‡Ef Dƒ#RE=æD%?]\\rEmXD,&‡FF•ªúj± ŸzZ«´o'0Ù?0XßШPÖ­Z×:»zâ’ÒÞÏKݦfæí¹zÃ=‰å˜Œ7ùjëèÞØÜ‚šˆØäÙ9 œª‘ÈqjvÎb², («¬yR.F –*“Ù™Ôs£ø” ±Li{zVTvê^’h¥g©5OÕá6ÈÓ'0•Íšٲ€Sí=ˆÓ³ò«[ó…… š&<(‘•Ž›„ÍÍ­QýÄþþþôÌlt|ÚG]óy…OdªFg«Ôㆠäq¿nÙ³Ì/M͘&&0µÖŽ^ÝÐ ŽŒK•jUm=Ö8mšž1§fd Uµ´ÎÉ ‰ñ´Ðò‡+Y—b§O“k:8<Ú?xÝ>0›œ«ýÚ[ôÙJÛ<Ç`³ÐåYçÚ«ÝýË&‡§¶__zÐóuxÿ//÷›ï÷O›×wö›†žY·vw÷¯Ç´8Ø@ã9!0‚c‹cgæ¢äæDK(Ø\¨¸ “REÞüæSÛЈxeeu~aÁ±Ë½ýV ‹Ë˜´Xæq·›pÃÝ;6‘ƒùÜ‚"ê!“y~Ao¿“ÛÛÏ^¼|i{šnž§µJûvW­¯o Ízþó/óoöBö~^ê69e¶ç‡k·ãRxŽIã ±±¶¥½FV‡ 1…33;·¹µõ(™»±¹¹¼²òÏëî×nÞÅ?oaq)!•OgOß@N~ÑúÆæÎÎ?§-Þö³ç§nDI´R „3áÔšOJË:úÿãÙóçá‘ñ8…Û¦q…ˆ)GàfÔ5hm]?š sõº»æÍ ››óQ×<î Årµ3Hä úñ‰M3bÜ&Ž£YA¬îíÓ!Ðh[°ÁÓ ‚¾þAêÂ~Ýð˜~¼´BêäFÄxZhùýwü‹‘S`U,¯níSuøúHÑlø"¤Ç‹;Ç-¾àYøÏã%ëóݽ¬äK—°&”×íÃêB)YöãèÖôýñ2Ï;¶qtÜñvÐÃxNŒàØâXé‚wü­©µ3¯ð©íÉ…¬ ø9¶ßÈTuÄËh€æ»ÜÛoÅÏ-¢šj˜Ì–ÈGɘǭº–Ô ›OöëFtCcÐ!`²¼Z~lžo[eZ†À¾Àʵõ/^²2lFŠfhÕºö~^ê6>1gÏå«7c’ÒÃʰ嫱¹ 1:>ܺ[”Â}'øça͸aÒj]«–ÈqÏ75=[Q-Y[[ï:u# H¢•J œ §Ö||*ÅŒO~¦EÝÔ6g²à°FªÀ©ÖÛR2' 1î(G 6O88<úÎ'âi¥ä£®ùláã*I3ÔHkõã¸$â¾~]gw/5`@7„½ )Õ¤òZj\Yo;TªÜ’O -¿û–ÿ·Æ“øÌ§ù÷W þìßq7Ã$TYç­¯PIŸûÔIµúŸ_î½xµ¿»wˆÅ—fpøD9&¬<8xý}üt\‘ñÒÒè¶l ‡ñœÁ±Å%±ù¨ãÔŒ à E*W˜[hûS§j‰ÍåÒù¶GDŠZ5bØ e~áØîàrÇïó0.õŸ7=<ü9UR•qzîÍs# N¡SA@- ‹ D@õ4Ô¤½U–VIiÛ‰µõõ9“™ºÊl™ßÚÞ~?/uŸ±ç»®GÆ¥9&)Í–/¶±¨¸‚R¶¹¹…ׯ^Y,ó±‰iqÉ¿ Ð°ˆXL*j5Go~A@›Z:FÇô8DßwêFD+•@8N­ùؤô#Ûoäzêú/A£c㈛[;£Î=|ï56µ¼y”ƒ[%¸¯êêé·œÌÄT^HX¤PXlbúG]ó|¨¼Zå UbÕ˜ÞP[߈¸·O×ÞÑMÍw )ƒêÕMXPQ­’©´† £\QÇá 9\am½‡…ÆÉ ‰ñ´Ðòßð?5žD´hfĸâ«øÃ-ÕŸ<[RÔ(•ǵó9â ÙËÁ=ºñ%4@Ôú>ÃæäÜ:fzô8üIh²­—_‰ºÚø¥gÑÅÐ.Ûèa<'Fplqñ,Û ÞÐðèÛ“Â[TVQíx?1…ƒX®ªÇüòò  Ç.w|IbzfV"SÞòð¸÷ð®OЫW¯VV¬8¥7LþòË ˜¤_ȃT/· “è]¦¦g¨ki­’¶X[[Ÿ™£®²ýùùÖöûyé¿ÿÿìœýSSWÇï?Qu\[·°µJíÎÎì»3îtgw+µjÁ:¢£T×mqkÕ.¶XÐexL €$yUT0 Á" yÕ(ˆ(B°R@»VÝ}’;˰››jàšïw>“9÷äÏ7ÏÕÒÚ&þ€þûƒqêTñœÇ#柌…É”±–ï“öÝ»?í.“%I«8…is>ô¹ê0vMÎŒç#¢Uûâm=*Q%·yÂÊyeBÊñSgfˆÜ3¥ÄO]E–˜‡E’%k5¿ó?ׄ˜¦Îü~o‡wx§#k ¯°Îw÷9“ü0 ` —8º”‡DÆýÔUA¡Q åëyyœ&:>ÉîB‰Rù’í„­Z*\¾zÓï ¾û‚e\A–$­àóŽsX•|,«€+Èó°Hâ¶ZûÛ=~ ?Ìc˜Àa‰c^K…úË7¬ñZ¿ùË‘\A–$­àóŽŸ”~"+Èó°Hòú*íovøü0 `‡%Žy-jê›­Yûáæ½û#¸‚,IZÀ) ç':N›z,—+Èó°H²ØSûöN#?æ1Là°Ä1¯¥Bum“5kÖmò ÷<Èk×m’´ €S@Î;NTLbJ†.%#‡Èó°Hòª§ÆãSƒÇ§FNxÕSË<&€ –8æµT¨ªÖ[³nÖ=¡ÿø*œÈÌë·HZÀ) çG“ MËNJ?Å dF¦H`I~µ:ñÍOÚ—î0ñ9q/‘yLx+q<ÔR¡¼ªÑšmïôÛýÕçûÂ8aÇžÀ¿ùí’´ €S@Î;Nœ*Y©=¦IÉâ•öØau ó°HòޝÊmëÕ7ü:yÀ}ëµ?mS3 `o%އZ*”U6XsòTÁF_¿ÏöSëIJAf²t…’Vp ÈyÇ)(*—ÇjÕI'’O2‡l™3EÌÃ"Iêɲ׼ ܶ·»ÒÅòðšw~Zöyæ1LàªÄqRK…’²kÎ_h)”>íðÛ¸soðî€P&ÐÖd€l²$i§€œwœsåu陹²m\BF¼&S•tœ ´5 d†,1‹­¼ åü«藾ͯoïpû¸sö¡}iwòð¥LÇmR™†“ÇU-ŠÏUKRùíejšö|ä»}'5P³Ì¦­;è‘¶&'u…dÆ–OœÛœßø‘ßÊùo*êòΔÅ'¦EÅj)gYŒ†ik2@6È ó€ØÏ«´ìŠ5»N,õÉ[èU4«x—Ðã›>y«wHͪà<©ÀLøÄñ×?…g/Ú¢´¬æâ¥«u×®Ü`mMȆ“8ä¼ã[Ú ò UL ­ÅÖ‡y(8Ï«9”T`¦a^â¸J{!ÿëJ—BÈ-(p)]^€K!d唸Bfv1€K;@p9‚ ‚ —Ó_ ‚ ‚\L¯!‚ ‚\LÂÛd[Ë—/_±b…§§çûÿÕªŸ‹èEÑK£È:ÆA Ë!ȶ¨E`ݨ̬Ä‚ r5 oAm­\¹ò½Ÿµè²Ž1Ä‹<<<–-[¶Ô¢eÑ kSs[SC:Uˆ-ăÐAöĺ?™ ±Ž1Ä…èz¼dÉ’E‹ÍŸ?Þ¼y .\¼x1Íà:ýb¢¸Q£ãææF!]°`Á+SD‡4éîîN' ¼Cýÿÿì[LÙÇÝ—¼%¡6ææ× wL ¶„\6MH°bB.‰€´ÙnÕ$ É*+m–í®¶R»R¥Jmµ«l›îJ»Ò>ì¦Òn«VJ›ªêC Q ÉkÿÌ#ãa 8S¾ŸFGg>Ÿ™ùæÏgŸÿŒaPå„<û·¼5&b‚œœ‡Ã188xçι¹¹±±±ÖÖVx ÌÓìv±A מ={ÒÒÒ`%«««{zz&''!é»+`A»ÝŽpHâ !‚ˆ2d€ˆPÔÕÕñö'Ê‚ä­ñ«Âæ› hF —Ëuûöíw˜5›Í™™™¤çaÕ¨×뫪ª&&&Þ‘pïÞ=Ö °Ùlƒ*–à‚Júí,AˆÔÖÖÖý_ƒä­ñ«’••¥Õj5`AÞym ˜_WNçÌÌÌݦ§§s…oÇ8&¹U€’(˜•ãããÕjõ­[·fffn –›°)Ÿ`:Æ´´4æ _<¥ÝnŸ˜˜ÅD>‰k¦[è%}>ߌ€´&âKAcM&“øS ˆ( Ê"y˜Q쿪ªÊét~ò¿úòé/¿X^~ÿè"ˆ+}t–oÃ'==}Z`jjеb'tÓ9ïÜcxõêÕË—/ x v‡ Á¤¤$¿ß¨‚¼“u ‘Ãá˜^A,¹ÁÁA¼µZ-œ7t†Âeee½½½ÒZµZ­T™D4QÉÝ''À\ˆr0÷ƒÄßüýÅûZøùƒ…÷,üúoÏ=Ò ðÖ8|0gߘœœd­Ø OÀŒÅ¾Ú¶ˆ anNMMEîÇív)â+E ôzýøøøÍ˜tÝÝÝx Îæ§LI;::}}}F£q›×$MT!ÒÄåráªÑf³}ô×ço:÷þü[÷çñ—%DÇ«Š½Z0@¼5LØ7VÀÌ¡Ñh¾¿0ó=ï“à N_ðâÅ‹:N«Õž={öÆjÆÆÆ¶¹Pë}ð†½!¡°°Ž¯BC¬ŽŽŽ¢hÙ&ÙÙÙˆLLL'©‰¨¡J#y*++]J‚ý————””|øÝÒß-½ÿíòòÞ·Kˆ ®ôÑY¼5“ÉtM``` 99ùÚæÁxŸOpúׯ_‡¬…Œ^¯WªÒ©S§¶¹Pë}ÚÛÛE%EaÍõz}SSSPÉ!.•ÃHj"j¨R B§ÓY©$Ø?3@{„¿"A‹>"eee¸¦t®F‰xk>˜B~"ÐÜÜ\QQñ¦VY+vÞ”{à}<Á\ëóùäWKKKá/·¹V¡8ÃÃÃR%>¼{÷î„„ö*`2¢…7’d?éLD •‘ ä‘ZÈ‚ýÃY­V³ÙœŸŸŸ——‡} ;g¿Yœ}¸xûáâÔ׋˜à•Hûä­qøàÂú 8¹'N¼±y°Þ'ÁÛèèhh•0‰Yr Þ)Ç"b)†Æãñ@@ †˜555T“_T‚‡ÙåÀþa€ìv;.²÷îÝ[\\ŒÖb±`¾¹ùÍâùþÓ|÷ßu“ÿjþÝ1##žvÈ[ãðÑétããã~¿ÓIggçxH®\¹ÂZ±ƒ ±Þ'ÁŸêêê‘‘‘ÐêT F£bÌ@±®Bhˆ÷urr²Z­v¹\kÖ$ZªI"j¨ô!óŠ‚C”••av± X­Vf†Z>YȾú(ëGöüøÑë¿ÇG§è"{tÞ‡OJJÊØØXCCt[‹ÑÑQÖŠÀøñãÇÙtNdgg766 0}zzz8€’T c0yc 'Ý‚@)Õ˜”––­V‹YÇãñÈÕ$ZìŠ÷ÙÛU AÈÏQ¦0öÕ`.ÇÄSTTôúÇ 9?{œsíqîµÇ?øxÁl6ÃE<ì·Æá“””422‚S8räÈÈf¸téZœ>ï3ˆuœNgtÍÍÍ ‰‰‰°A¼³‹!PЬ¨X»&999¸¼Ë Q“h±+ÞgClTÉ!O Ô‘0tüþÓ¶|º¼ ÂnEüp¼5L¸˜Öh4çÎZaxx˜µbgh-°!6ç}±$ª¯¯RÒëõÆ €"¢««kÍJ¥‹‹‹»páBˆš>ŸT%¢†*‘ äÁ›-¢X׃}ÿÅþ(,===55-ú………‹E‰|xk> ‡*..þáæ9xð »“A„*;v,H½žžT¦Z­& kª®7Ö-KÔ3IJD UAÈ;²®eÙØaIIIÃgϰœøìYãçË œÍÉÏŸ±¥IXòóó›Vúl‚1R"Þ‡V«…ûÙ¿ÿ…ÍÍy§¿eÐétn·;HÀ®®®¼¼¼¸¸¸øøxü xçȼ=!KÕ(‚KÞçAl#TZ‚f¥4r`o˜w1g7}±´÷Ý',sOš¿\*((@[2÷„-èçææE0Ÿ°‘͇¥Ä[ãðÁÔ _ØÚÚÚ×××ÛÛÛ'À:½ñ@ÚÚÚØ´Ml””¿ß/UÒf³íÚµK£ÑžPÀëõ®Y{è˜Íf @+W“¶´´ŒD4QD233#øŸç2…ÿ”ššÚòÕóÒç­Ârê«çz½­5 ‚kî ˆÉdbÿE(‚ù°”xküJTVVvwwwuu±Vìt ÈűïÄ·˜›}>_’ ¶¶–wj±Þ¡rµ'Ž‘«I€w=Çä ‚ Vq„HX™Ö¯_Ø?zÊô“““×Z““'OúýþÎÎNÖ†@–ÿ ±y²³³E%­V+Œ{QQV+**x§+ÔÔÔ° ªIH§ZpÍš,--å;ADJ £ÑØöç—KRRÒºlEHŠOBGGkÅŽt ﬷0‹…iø½Ðw»Ý¼óŠ!\.×fk›ðΚ b5 ÝÒét‰‰‰ì×ÐØ_½¢1-(‚‘Ow€ˆ¡²²ÒãñÄÇÇÃýìܹÓ#À;©Ø†šx½^ϰÛí¼ó%‚ Ðï„gç³GQ±‡êŠ«Ò{4>¶Â¶d€îìØ±ãèÑ£§OŸ®¯¯GÛÞÞîp8x'sÆÆÆÆö`®sxgJ±J öt“É„H“[ aO"DÄð@uuummmgΜA«¼3ŠQpéR^^ÞÐÐp&¬"¸ü‚ ˆ˜E Ñ!¾Ø&O&‹ AAR”0@¯Bd“É"D±]ùÿÿìkHÓkǽì8'fs33ËÀ.¦›³LZ5¤b´„4ºßoP”]@mQ¡ÍfIš³ò²Ñ‚‚ÈR¯£¨ˆ|Ñ›®Dù.°·eœó9{pìL‹cšsg¿!Ïÿñù»çÿõ¿ý>Ïÿ?›ü~ÆïpŽ1… ‚ Áˆ ‚ ‚qˆ ‚ ‚qˆ ‚ ‚q S€òòòJû1›Í#e-#Hø PJJJaaaAAÁøñãC=—°!---???>>~H»ÈgTýG´Zmff&_ÕfFF†^¯8Ìh4þóAÜ‚ c™a ÐÊ•+ÿꧯ¯ïòåËÇØl¶®®.‡ÃA»££Ãår ç‡J˜ ÕjmooÿÓGKK ¢ê…N§“¸.^¼ØÖÖV\\}Jÿû÷ïñ¤¾¾¾ÞÞÞƒ._¾¼³³“öÇm6[NN.]ºÔÝÝŸŸÿîÝ»›7oÒóüùó 6Dš‘e¦¨¨Hm:6§L™²eË–]»vUTTTWW«gHOOß¹sgccã¡C‡ =.—kÓ¦MµµµÇŽ Çcÿe,‹×ë1cFtt4NC>(cP>•••$I8%%%­­­ôÏ™3gíÚµê³Ni¨«A§NZ¶l=©©©œÕ ëÖ­c/½^?uêTJûÙ³gù·&•ååå%øPWZZНŸ8qÂl6Gõ V«%4ž¿|-//çõôAºsçµçÕ«WH¨­­ ×Ak>~üxíÚ5^"CåfuŽÙܸqcöìÙ÷îÝc¯%K–<{öìÁƒô0ûaí>sæLÚ=*++{ñâ##M€ìv;e&11QmªksçÎ¥Š755Q³W­ZÕÞÞ>nܸýû÷ì„ œNçÌHj»$ß éqŒ*x pR•i¨›†Aùdee‘'5Sܸq£F£ñßÛ³gñrú/z¤ÓéøEž½{÷²£ÑhÄÝ>Œ­X±O õA6J€áÙ=þü3gΤ¥¥‘ ¹qÞ*Šg@UU’¿\al1"tÿþ}´†uBC'…Â]z{{;;;ÞËÉÉùöíÛ‡ØDz^¾|©¨ººZýXÚG¥qûöm¾iTTTDå`òA›%™Ô‡žÂÂB4¨¾¾¾¦¦æäÉ“O”O€,X@cëÖ­ª'BÀiP’)((À{ZZZ’““ƒòôX ‘0 ÎF†¡MøÃáˆê¿&‡Y,·ÛM›s•ºÒ#J€fÍšõ‡uˆÜÎ;GžÈâéÓ§‰7P€ðuv,..æwê#Aègoùéééinn6™LŸ>}ò «ílŸ]¿~ÆãÇ;::0¡#GŽP~”±¶V?6ýÙ‘*@TqJ/Kg&OD”–ºº: <åÙãñèõúÅ‹{½^†Qf¶oßN]a>oÞ¼(ŸY­Ö¨È ¥K—RbÍf3„µ´¶¶TP>J€²}fIªëׯú·©«h~¢‡aÓ§O§¡ˆïLMMu:Ê–"ŠìÁÞ´hÑ¢††bŸ6mÉ#FD¼III+ï4alÁkÖpôbPºuëÖçÏŸ»»»_¿~ÝÕÕ•››ûöíÛïß¿S®^½úõëWVÏø2D'Xˆÿ>âCñ¯ÀÌëëëÕ]†ÚÚÚŒŒ :©¸,²q Ü%%%jª¬¬TG±¤Ñh6oÞÜØØHn·[ý…WP>Ôfd311‘³I²Ùl? ôôô}ûö!£åååô †… òäÏo'ÿ4/{0ÒjµäC˜d‚šGõ¿H OdÄÔårEà3AÆ4)))ÃÑ‹ë°nì1™Lª‘ãÃ?ìwþôb}üäGåûàQVV†ôÐøÑC þ|J€,Ëþ[&A„ÑE¼4Ìs;pPák?ƒ¢(Ô³ˆ °Çsá¯×k·ÛC=0Ã/@¡žˆ ‚æ°ÈÖét¡žEÄa45M¨g–$%%It‚ ‚ ‚0zü ÿÿä\×â¤G‹AIEND®B`‚golly-2.5-src/gui-ios/Golly/file.h0000644000175100001440000000377712156145314013763 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _FILE_H_ #define _FILE_H_ #include // for std::string #include "writepattern.h" // for pattern_format, output_compression // Routines for opening, saving, unzipping, downloading files: void NewPattern(const char* title = "untitled"); void SetPatternTitle(const char* filename); void CreateUniverse(); bool LoadPattern(const char* path, const char* newtitle); void OpenFile(const char* path, bool remember = true); bool CopyTextToClipboard(const char* text); bool GetTextFromClipboard(std::string& text); bool SavePattern(const std::string& path, pattern_format format, output_compression compression); const char* WritePattern(const char* path, pattern_format format, output_compression compression, int top, int left, int bottom, int right); void UnzipFile(const std::string& zippath, const std::string& entry); void GetURL(const std::string& url, const std::string& pageurl); bool DownloadFile(const std::string& url, const std::string& filepath); void LoadLexiconPattern(const std::string& lexpattern); std::string GetBaseName(const char* path); #endif golly-2.5-src/gui-ios/Golly/file.m0000644000175100001440000011421712156145314013760 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ // for opening zip files and extracting files within them // (much thanks to the http://code.google.com/p/objective-zip/ project) #import "Objective-Zip/ZipFile.h" #import "Objective-Zip/ZipException.h" #import "Objective-Zip/FileInZipInfo.h" #import "Objective-Zip/ZipReadStream.h" #import "GollyAppDelegate.h" // for SwitchToPatternTab #import "HelpViewController.h" // for ShowHelp #import "InfoViewController.h" // for ShowTextFile #include // for std::string #include // for std::list #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "readpattern.h" // for readpattern #include "writepattern.h" // for writepattern, pattern_format #include "utils.h" // for Warning #include "prefs.h" // for SavePrefs, allowundo, userrules, etc #include "status.h" // for SetMessage #include "algos.h" // for CreateNewUniverse, algo_type, algoinfo, etc #include "layer.h" // for currlayer, etc #include "control.h" // for SetGenIncrement, ChangeAlgorithm #include "view.h" // for origin_restored, nopattupdate #include "undo.h" // for UndoRedo #include "file.h" // ----------------------------------------------------------------------------- std::string GetBaseName(const char* path) { // extract basename from given path std::string basename = path; size_t lastsep = basename.rfind('/'); if (lastsep != std::string::npos) { basename = basename.substr(lastsep+1); } return basename; } // ----------------------------------------------------------------------------- void SetPatternTitle(const char* filename) { if ( filename[0] != 0 ) { // remember current file name currlayer->currname = filename; // show currname in current layer's menu item //!!! UpdateLayerItem(currindex); } /*!!!??? move this logic into StatusView's drawRect std::string prefix = ""; // display asterisk if pattern has been modified if (currlayer->dirty) prefix += "*"; int cid = currlayer->cloneid; while (cid > 0) { // display one or more "=" chars to indicate this is a cloned layer prefix += "="; cid--; } std::string rule = GetRuleName(currlayer->algo->getrule()); std::string wtitle; wtitle.Printf("%s%s [%s]", prefix.c_str(), currlayer->currname.c_str(), rule.c_str()); */ } // ----------------------------------------------------------------------------- void CreateUniverse() { // save current rule std::string oldrule = currlayer->algo->getrule(); // delete old universe and create new one of same type delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); // ensure new universe uses same rule (and thus same # of cell states) RestoreRule(oldrule.c_str()); // increment has been reset to 1 but that's probably not always desirable // so set increment using current step size SetGenIncrement(); } // ----------------------------------------------------------------------------- void NewPattern(const char* title) { if (generating) Warning("Bug detected in NewPattern!"); //!!! if (askonnew && currlayer->dirty && !SaveCurrentLayer()) return; currlayer->savestart = false; currlayer->currfile.clear(); currlayer->startgen = 0; // reset step size before CreateUniverse calls SetGenIncrement currlayer->currbase = algoinfo[currlayer->algtype]->defbase; currlayer->currexpo = 0; // create new, empty universe of same type and using same rule CreateUniverse(); // clear all undo/redo history currlayer->undoredo->ClearUndoRedo(); // possibly clear selection currlayer->currsel.Deselect(); // initially in drawing mode currlayer->touchmode = drawmode; // reset location and scale currlayer->view->setpositionmag(bigint::zero, bigint::zero, newmag); // best to restore true origin if (currlayer->originx != bigint::zero || currlayer->originy != bigint::zero) { currlayer->originx = 0; currlayer->originy = 0; SetMessage(origin_restored); } // restore default colors for current algo/rule UpdateLayerColors(); MarkLayerClean(title); // calls SetPatternTitle } // ----------------------------------------------------------------------------- bool LoadPattern(const char* path, const char* newtitle) { if ( !FileExists(path) ) { std::string msg = "The file does not exist:\n"; msg += path; Warning(msg.c_str()); return false; } // newtitle is only empty if called from ResetPattern/RestorePattern if (newtitle[0] != 0) { //!!! if (askonload && currlayer->dirty && !SaveCurrentLayer()) return false; currlayer->savestart = false; currlayer->currfile = path; // reset step size currlayer->currbase = algoinfo[currlayer->algtype]->defbase; currlayer->currexpo = 0; // clear all undo/redo history currlayer->undoredo->ClearUndoRedo(); } // disable pattern update so we see gen=0 and pop=0; // in particular, it avoids getPopulation being called which would slow down macrocell loading nopattupdate = true; // save current algo and rule algo_type oldalgo = currlayer->algtype; std::string oldrule = currlayer->algo->getrule(); // delete old universe and create new one of same type delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); const char* err = readpattern(path, *currlayer->algo); if (err) { // cycle thru all other algos until readpattern succeeds for (int i = 0; i < NumAlgos(); i++) { if (i != oldalgo) { currlayer->algtype = i; delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); // readpattern will call setrule err = readpattern(path, *currlayer->algo); if (!err) break; } } if (err) { // no algo could read pattern so restore original algo and rule currlayer->algtype = oldalgo; delete currlayer->algo; currlayer->algo = CreateNewUniverse(currlayer->algtype); RestoreRule(oldrule.c_str()); // Warning(err); // current error and original error are not necessarily meaningful // so report a more generic error Warning("File could not be loaded by any algorithm\n(probably due to an unknown rule)."); } } // enable pattern update nopattupdate = false; if (newtitle[0] != 0) { MarkLayerClean(newtitle); // calls SetPatternTitle // restore default base step for current algo // (currlayer->currexpo was set to 0 above) currlayer->currbase = algoinfo[currlayer->algtype]->defbase; SetGenIncrement(); // restore default colors for current algo/rule UpdateLayerColors(); currlayer->currsel.Deselect(); // initially in moving mode currlayer->touchmode = movemode; currlayer->algo->fit(*currlayer->view, 1); currlayer->startgen = currlayer->algo->getGeneration(); // might be > 0 UpdateEverything(); } return err == NULL; } // ----------------------------------------------------------------------------- void AddRecentPattern(const char* inpath) { std::string path = inpath; if (path.find(gollydir) == 0) { // remove gollydir from start of path path.erase(0, gollydir.length()); } // check if path is already in recentpatterns if (!recentpatterns.empty()) { std::list::iterator next = recentpatterns.begin(); while (next != recentpatterns.end()) { std::string nextpath = *next; if (path == nextpath) { if (next == recentpatterns.begin()) { // path is in recentpatterns and at top, so we're done return; } // remove this path from recentpatterns (we'll add it below) recentpatterns.erase(next); numpatterns--; break; } next++; } } // put given path at start of recentpatterns recentpatterns.push_front(path); if (numpatterns < maxpatterns) { numpatterns++; } else { // remove the path at end of recentpatterns recentpatterns.pop_back(); } } // ----------------------------------------------------------------------------- bool CopyTextToClipboard(const char* text) { UIPasteboard *pboard = [UIPasteboard generalPasteboard]; pboard.string = [NSString stringWithCString:text encoding:NSUTF8StringEncoding]; return true; } // ----------------------------------------------------------------------------- bool GetTextFromClipboard(std::string& text) { UIPasteboard *pboard = [UIPasteboard generalPasteboard]; NSString *str = pboard.string; if (str == nil) { ErrorMessage("No text in pasteboard."); return false; } else { text = [str cStringUsingEncoding:NSUTF8StringEncoding]; return true; } } // ----------------------------------------------------------------------------- void LoadRule(const std::string& rulestring) { // load recently installed .rule file std::string oldrule = currlayer->algo->getrule(); int oldmaxstate = currlayer->algo->NumCellStates() - 1; // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange SaveCurrentSelection(); const char* err = currlayer->algo->setrule(rulestring.c_str()); if (err) { // try to find another algorithm that supports the given rule for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { lifealgo* tempalgo = CreateNewUniverse(i); err = tempalgo->setrule(rulestring.c_str()); delete tempalgo; if (!err) { // change the current algorithm and switch to the new rule ChangeAlgorithm(i, rulestring.c_str()); if (i != currlayer->algtype) { RestoreRule(oldrule.c_str()); Warning("Algorithm could not be changed (pattern is too big to convert)."); } return; } } } // should only get here if rule/table/tree file contains some sort of error RestoreRule(oldrule.c_str()); std::string msg = "Rule is not valid in any algorithm: " + rulestring; Warning(msg.c_str()); return; } std::string newrule = currlayer->algo->getrule(); if (oldrule != newrule) { // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } } // new rule might have changed the number of cell states; // if there are fewer states then pattern might change int newmaxstate = currlayer->algo->NumCellStates() - 1; if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } // set colors for new rule (loads any .rule/colors/icons file) UpdateLayerColors(); if (oldrule != newrule) { if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberRuleChange(oldrule.c_str()); } } } // ----------------------------------------------------------------------------- bool ExtractZipEntry(const std::string& zippath, const std::string& entryname, const std::string& outfile) { bool found = false; bool ok = false; @try { NSString *nspath = [NSString stringWithCString:zippath.c_str() encoding:NSUTF8StringEncoding]; ZipFile *zfile= [[ZipFile alloc] initWithFileName:nspath mode:ZipFileModeUnzip]; [zfile goToFirstFileInZip]; do { FileInZipInfo *info = [zfile getCurrentFileInZipInfo]; std::string thisname = [info.name cStringUsingEncoding:NSUTF8StringEncoding]; if (thisname == entryname) { // we've found the desired entry so copy entry data to given outfile ZipReadStream *zipstream = [zfile readCurrentFileInZip]; NSMutableData *zipdata = [[NSMutableData alloc] initWithLength:info.length]; int bytesRead = [zipstream readDataWithBuffer:zipdata]; [zipstream finishedReading]; if (info.length == 0) { Warning("Zip entry is empty!"); } else if (bytesRead == info.length) { // write zipdata to outfile FILE* f = fopen(outfile.c_str(), "wb"); if (f) { if (fwrite([zipdata mutableBytes], 1, bytesRead, f) != bytesRead) { Warning("Could not write data for zip entry!"); } else { ok = true; } fclose(f); } else { Warning("Could not create file for zip entry!"); } } else { Warning("Failed to read all bytes of zip entry!"); } zipdata = nil; found = true; break; } } while ([zfile goToNextFileInZip]); [zfile close]; zfile = nil; } @catch (ZipException *ze) { NSString *msg = [NSString stringWithFormat:@"Zip file error: %d - %@", ze.error, [ze reason]]; Warning([msg cStringUsingEncoding:NSUTF8StringEncoding]); } @catch (id e) { NSString *msg = [NSString stringWithFormat:@"Exception caught: %@ - %@", [[e class] description], [e description]]; Warning([msg cStringUsingEncoding:NSUTF8StringEncoding]); } if (found && ok) return true; if (!found) { std::string msg = "Could not find zip file entry:\n" + entryname; Warning(msg.c_str()); } else { // file is probably incomplete so best to delete it if (FileExists(outfile)) RemoveFile(outfile); } return false; } // ----------------------------------------------------------------------------- void UnzipFile(const std::string& zippath, const std::string& entry) { std::string filename = GetBaseName(entry.c_str()); std::string tempfile = tempdir + filename; if ( IsRuleFile(filename) ) { // rule-related file should have already been extracted and installed // into userrules, so check that file exists and load rule std::string rulefile = userrules + filename; if (FileExists(rulefile)) { // load corresponding rule SwitchToPatternTab(); LoadRule(filename.substr(0, filename.rfind('.'))); } else { std::string msg = "Rule-related file was not installed:\n" + rulefile; Warning(msg.c_str()); } } else if ( ExtractZipEntry(zippath, entry, tempfile) ) { if ( IsHTMLFile(filename) ) { // display html file ShowHelp(tempfile.c_str()); } else if ( IsTextFile(filename) ) { // display text file ShowTextFile(tempfile.c_str()); } else if ( IsScriptFile(filename) ) { // run script depending on safety check; note that because the script is // included in a zip file we don't remember it in the Run Recent submenu //!!! CheckBeforeRunning(tempfile, false, zippath); Warning("This version of Golly cannot run scripts."); } else { // open pattern but don't remember in recentpatterns OpenFile(tempfile.c_str(), false); } } } // ----------------------------------------------------------------------------- static bool RuleInstalled(ZipFile* zipfile, FileInZipInfo* info, const std::string& outfile) { bool ok = true; ZipReadStream *zipstream = [zipfile readCurrentFileInZip]; NSMutableData *zipdata = [[NSMutableData alloc] initWithLength:info.length]; int bytesRead = [zipstream readDataWithBuffer:zipdata]; [zipstream finishedReading]; if (info.length == 0) { Warning("Zip entry is empty!"); ok = false; } else if (bytesRead == info.length) { // write zipdata to outfile FILE* f = fopen(outfile.c_str(), "wb"); if (f) { if (fwrite([zipdata mutableBytes], 1, bytesRead, f) != bytesRead) { Warning("Could not write data for zip entry!"); ok = false; } fclose(f); } else { Warning("Could not create file for zip entry!"); ok = false; } } else { Warning("Failed to read all bytes of zip entry!"); ok = false; } zipdata = nil; return ok; } // ----------------------------------------------------------------------------- void OpenZipFile(const char* zippath) { // Process given zip file in the following manner: // - If it contains any .rule files then extract and install those files // into userrules (the user's rules directory). // - Build a temporary html file with clickable links to each file entry // and show it in the Help tab. const std::string indent = "    "; bool dirseen = false; bool diffdirs = (userrules != rulesdir); std::string firstdir = ""; std::string lastpattern = ""; std::string lastscript = ""; int patternseps = 0; // # of separators in lastpattern int scriptseps = 0; // # of separators in lastscript int patternfiles = 0; int scriptfiles = 0; int textfiles = 0; // includes html files int rulefiles = 0; int deprecated = 0; // # of .table/tree/colors/icons files std::list deplist; // list of installed deprecated files std::list rulelist; // list of installed .rule files // strip off patternsdir or gollydir std::string relpath = zippath; size_t pos = relpath.find(patternsdir); if (pos == 0) { relpath.erase(0, patternsdir.length()); } else { pos = relpath.find(gollydir); if (pos == 0) relpath.erase(0, gollydir.length()); } std::string contents = "

\nContents of "; contents += relpath; contents += ":

\n"; @try { NSString *nspath = [NSString stringWithCString:zippath encoding:NSUTF8StringEncoding]; ZipFile *zfile= [[ZipFile alloc] initWithFileName:nspath mode:ZipFileModeUnzip]; [zfile goToFirstFileInZip]; do { FileInZipInfo *info = [zfile getCurrentFileInZipInfo]; // NSLog(@"- %@ %@ %d len=%d (%d)", info.name, info.date, info.size, info.length, info.level); // examine each entry in zip file and build contents string; // also install any .rule files std::string name = [info.name cStringUsingEncoding:NSUTF8StringEncoding]; if (name.find("__MACOSX") == 0 || name.rfind(".DS_Store") != std::string::npos) { // ignore meta-data stuff in zip file created on Mac } else { // indent depending on # of separators in name unsigned int sepcount = 0; unsigned int i = 0; unsigned int len = name.length(); while (i < len) { if (name[i] == '/') sepcount++; i++; } // check if 1st directory has multiple separators (eg. in jslife.zip) if (name[len-1] == '/' && !dirseen && sepcount > 1) { firstdir = name.substr(0, name.find('/')); contents += firstdir; contents += "
\n"; } for (i = 1; i < sepcount; i++) contents += indent; if (name[len-1] == '/') { // remove terminating separator from directory name name = name.substr(0, name.rfind('/')); name = GetBaseName(name.c_str()); if (dirseen && name == firstdir) { // ignore dir already output earlier (eg. in jslife.zip) } else { contents += name; contents += "
\n"; } dirseen = true; } else { // entry is for some sort of file std::string filename = GetBaseName(name.c_str()); if (dirseen) contents += indent; if ( IsRuleFile(filename) && filename.rfind(".rule") == std::string::npos ) { // this is a deprecated .table/tree/colors/icons file contents += filename; contents += indent; contents += "[deprecated]"; deprecated++; // install it into userrules so it can be used below to create a .rule file std::string outfile = userrules + filename; if (RuleInstalled(zfile, info, outfile)) { deplist.push_back(filename); } else { contents += indent; contents += "INSTALL FAILED!"; } } else { // user can extract file via special "unzip:" link contents += ""; contents += filename; contents += ""; if ( IsRuleFile(filename) ) { // extract and install .rule file into userrules std::string outfile = userrules + filename; if (RuleInstalled(zfile, info, outfile)) { // file successfully installed rulelist.push_back(filename); contents += indent; contents += "[installed]"; if (diffdirs) { // check if this file overrides similarly named file in rulesdir std::string clashfile = rulesdir + filename; if (FileExists(clashfile)) { contents += indent; contents += "(overrides file in Rules folder)"; } } } else { // file could not be installed contents += indent; contents += "[NOT installed]"; // file is probably incomplete so best to delete it if (FileExists(outfile)) RemoveFile(outfile); } rulefiles++; } else if ( IsHTMLFile(filename) || IsTextFile(filename) ) { textfiles++; } else if ( IsScriptFile(filename) ) { scriptfiles++; lastscript = name; scriptseps = sepcount; } else { patternfiles++; lastpattern = name; patternseps = sepcount; } } contents += "
\n"; } } } while ([zfile goToNextFileInZip]); [zfile close]; zfile = nil; } @catch (ZipException *ze) { NSString *msg = [NSString stringWithFormat:@"Zip file error: %d - %@", ze.error, [ze reason]]; Warning([msg cStringUsingEncoding:NSUTF8StringEncoding]); } @catch (id e) { NSString *msg = [NSString stringWithFormat:@"Exception caught: %@ - %@", [[e class] description], [e description]]; Warning([msg cStringUsingEncoding:NSUTF8StringEncoding]); } if (rulefiles > 0) { relpath = userrules; pos = relpath.find(gollydir); if (pos == 0) relpath.erase(0, gollydir.length()); contents += "

Files marked as \"[installed]\" have been stored in "; contents += relpath; contents += "."; } if (deprecated > 0) { std::string newrules = CreateRuleFiles(deplist, rulelist); if (newrules.length() > 0) { contents += "

Files marked as \"[deprecated]\" have been used to create new .rule files:
\n"; contents += newrules; } } contents += "\n
"; // NOTE: The desktop version of Golly will load a pattern if it's in a "simple" zip file // but for the iPad version it's probably less confusing if the zip file's contents are // *always* displayed in the Help tab. We might change this if script support is added. // write contents to a unique temporary html file std::string htmlfile = CreateTempFileName("zip_contents"); htmlfile += ".html"; FILE* f = fopen(htmlfile.c_str(), "w"); if (f) { if (fputs(contents.c_str(), f) == EOF) { fclose(f); Warning("Could not write HTML data to temporary file!"); return; } } else { Warning("Could not create temporary HTML file!"); return; } fclose(f); // display temporary html file in Help tab ShowHelp(htmlfile.c_str()); } // ----------------------------------------------------------------------------- /*!!! void OpenClipboard() { // load and view pattern data stored in clipboard wxTextDataObject data; if (GetTextFromClipboard(&data)) { // copy clipboard data to tempstart so we can handle all formats // supported by readpattern wxFile outfile(currlayer->tempstart, wxFile::write); if ( outfile.IsOpened() ) { outfile.Write( data.GetText() ); outfile.Close(); LoadPattern(currlayer->tempstart, "clipboard"); // do NOT delete tempstart -- it can be reloaded by ResetPattern // or used by ShowPatternInfo } else { statusptr->ErrorMessage("Could not create tempstart file!"); } } } !!!*/ // ----------------------------------------------------------------------------- void OpenFile(const char* path, bool remember) { // convert path to a full path if necessary std::string fullpath = path; if (path[0] != '/') { if (fullpath.find("Patterns/") == 0) { // Patterns directory is inside app bundle so prepend gollydir/Golly.app/ fullpath = gollydir + "Golly.app/" + fullpath; } else { fullpath = gollydir + fullpath; } } if (IsHTMLFile(path)) { // show HTML file in Help tab ShowHelp(fullpath.c_str()); return; } if (IsTextFile(path)) { // show text file using InfoViewController ShowTextFile(fullpath.c_str()); return; } if (IsScriptFile(path)) { // execute script /*!!! if (remember) AddRecentScript(path); RunScript(path); */ Warning("This version of Golly cannot run scripts."); return; } if (IsZipFile(path)) { // process zip file if (remember) AddRecentPattern(path); // treat zip file like a pattern file OpenZipFile(fullpath.c_str()); // must use full path return; } if (IsRuleFile(path)) { // switch to rule (.rule file must be in rulesdir or userrules) SwitchToPatternTab(); std::string basename = GetBaseName(path); LoadRule(basename.substr(0, basename.rfind('.'))); return; } // anything else is a pattern file if (remember) AddRecentPattern(path); std::string basename = GetBaseName(path); // best to switch to Pattern tab first in case progress view appears SwitchToPatternTab(); LoadPattern(fullpath.c_str(), basename.c_str()); } // ----------------------------------------------------------------------------- const char* WritePattern(const char* path, pattern_format format, output_compression compression, int top, int left, int bottom, int right) { // if the format is RLE_format and the grid is bounded then force XRLE_format so that // position info is recorded (this position will be used when the file is read) if (format == RLE_format && (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0)) format = XRLE_format; const char* err = writepattern(path, *currlayer->algo, format, compression, top, left, bottom, right); return err; } // ----------------------------------------------------------------------------- void SaveSucceeded(const std::string& path) { // save old info for RememberNameChange std::string oldname = currlayer->currname; std::string oldfile = currlayer->currfile; bool oldsave = currlayer->savestart; bool olddirty = currlayer->dirty; //!!! if (allowundo && !currlayer->stayclean) SavePendingChanges(); if ( currlayer->algo->getGeneration() == currlayer->startgen ) { // no need to save starting pattern (ResetPattern can load currfile) currlayer->currfile = path; currlayer->savestart = false; } // set dirty flag false and update currlayer->currname std::string basename = GetBaseName(path.c_str()); MarkLayerClean(basename.c_str()); if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberNameChange(oldname.c_str(), oldfile.c_str(), oldsave, olddirty); } } // ----------------------------------------------------------------------------- bool SavePattern(const std::string& path, pattern_format format, output_compression compression) { bigint top, left, bottom, right; int itop, ileft, ibottom, iright; currlayer->algo->findedges(&top, &left, &bottom, &right); if (currlayer->algo->hyperCapable()) { // algorithm uses hashlife if ( OutsideLimits(top, left, bottom, right) ) { // too big so only allow saving as MC file if (format != MC_format) { Warning("Pattern is outside +/- 10^9 boundary and can't be saved in RLE format."); return false; } itop = ileft = ibottom = iright = 0; } else { // allow saving as MC or RLE file itop = top.toint(); ileft = left.toint(); ibottom = bottom.toint(); iright = right.toint(); } } else { // allow saving file only if pattern is small enough if ( OutsideLimits(top, left, bottom, right) ) { Warning("Pattern is outside +/- 10^9 boundary and can't be saved."); return false; } itop = top.toint(); ileft = left.toint(); ibottom = bottom.toint(); iright = right.toint(); } const char* err = WritePattern(path.c_str(), format, compression, itop, ileft, ibottom, iright); if (err) { Warning(err); return false; } else { std::string msg = "Pattern saved as "; msg += GetBaseName(path.c_str()); DisplayMessage(msg.c_str()); AddRecentPattern(path.c_str()); SaveSucceeded(path); return true; } } // ----------------------------------------------------------------------------- bool DownloadFile(const std::string& url, const std::string& filepath) { NSURL *nsurl = [NSURL URLWithString:[NSString stringWithCString:url.c_str() encoding:NSUTF8StringEncoding]]; if (nsurl == nil) { std::string msg = "Bad URL: " + url; Warning(msg.c_str()); return false; } NSData *urlData = [NSData dataWithContentsOfURL:nsurl]; if (urlData) { [urlData writeToFile:[NSString stringWithCString:filepath.c_str() encoding:NSUTF8StringEncoding] atomically:YES]; return true; } else { Warning("Failed to download file!"); return false; } } // ----------------------------------------------------------------------------- void GetURL(const std::string& url, const std::string& pageurl) { const char* HTML_PREFIX = "GET-"; // prepended to html filename std::string fullurl; if (url.find("http:") == 0) { fullurl = url; } else { // relative get, so prepend full prefix extracted from pageurl std::string urlprefix = GetBaseName(pageurl.c_str()); // replace HTML_PREFIX with "http://" and convert spaces to '/' // (ie. reverse what we do below when building filepath) urlprefix.erase(0, strlen(HTML_PREFIX)); urlprefix = "http://" + urlprefix; std::replace(urlprefix.begin(), urlprefix.end(), ' ', '/'); urlprefix = urlprefix.substr(0, urlprefix.rfind('/')+1); fullurl = urlprefix + url; } std::string filename = GetBaseName(fullurl.c_str()); // remove ugly stuff at start of file names downloaded from ConwayLife.com if (filename.find("download.php?f=") == 0 || filename.find("pattern.asp?p=") == 0 || filename.find("script.asp?s=") == 0) { filename = filename.substr( filename.find('=')+1 ); } // create full path for downloaded file based on given url; // first remove initial "http://" std::string filepath = fullurl.substr( fullurl.find('/')+1 ); while (filepath[0] == '/') filepath.erase(0,1); if (IsHTMLFile(filename)) { // create special name for html file so above code can extract it and set urlprefix std::replace(filepath.begin(), filepath.end(), '/', ' '); filepath = HTML_PREFIX + filepath; } else { // no need for url info in file name filepath = filename; } if (IsRuleFile(filename)) { // create file in user's rules directory filepath = userrules + filename; } else if (IsHTMLFile(filename)) { // nicer to store html files in temporary directory filepath = tempdir + filepath; } else { // all other files are stored in user's download directory filepath = downloaddir + filepath; } // download the file and store it in filepath if (!DownloadFile(fullurl, filepath)) return; if (IsHTMLFile(filename)) { // display html file in Help tab ShowHelp(filepath.c_str()); } else if (IsRuleFile(filename)) { // load corresponding rule SwitchToPatternTab(); LoadRule(filename.substr(0, filename.rfind('.'))); } else if (IsTextFile(filename)) { // open text file in modal view ShowTextFile(filepath.c_str()); } else if (IsScriptFile(filename)) { // run script depending on safety check; if it is allowed to run // then we remember script in the Run Recent submenu //!!! CheckBeforeRunning(filepath, true, wxEmptyString); Warning("This version of Golly cannot run scripts."); } else { // assume it's a pattern/zip file, so open it OpenFile(filepath.c_str()); } } // ----------------------------------------------------------------------------- void LoadLexiconPattern(const std::string& lexpattern) { // copy lexpattern data to tempstart file FILE* f = fopen(currlayer->tempstart.c_str(), "w"); if (f) { if (fputs(lexpattern.c_str(), f) == EOF) { fclose(f); Warning("Could not write lexicon pattern to tempstart file!"); return; } } else { Warning("Could not create tempstart file!"); return; } fclose(f); // avoid any pattern conversion (possibly causing ChangeAlgorithm to beep with a message) NewPattern(); // all Life Lexicon patterns assume we're using Conway's Life so try // switching to B3/S23 or Life; if that fails then switch to QuickLife const char* err = currlayer->algo->setrule("B3/S23"); if (err) { // try "Life" in case current algo is RuleLoader and Life.rule/table/tree exists err = currlayer->algo->setrule("Life"); } if (err) { ChangeAlgorithm(QLIFE_ALGO, "B3/S23"); } // load lexicon pattern SwitchToPatternTab(); LoadPattern(currlayer->tempstart.c_str(), "lexicon"); } golly-2.5-src/gui-ios/Golly/GollyAppDelegate.h0000644000175100001440000000261512156145314016214 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import @interface GollyAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @end // export these routines so we can switch tabs programmatically void SwitchToPatternTab(); void SwitchToOpenTab(); void SwitchToSettingsTab(); void SwitchToHelpTab(); // return tab bar's current view controller UIViewController* CurrentViewController(); // enable/disable tab bar void EnableTabBar(bool enable); golly-2.5-src/gui-ios/Golly/GollyAppDelegate.m0000644000175100001440000001102012156145314016207 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import "prefs.h" // for SavePrefs #import "PatternViewController.h" #import "OpenViewController.h" #import "SettingsViewController.h" #import "HelpViewController.h" #import "GollyAppDelegate.h" @implementation GollyAppDelegate @synthesize window = _window; // ----------------------------------------------------------------------------- static UITabBarController *tabBarController = nil; // for SwitchToPatternTab, etc - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // set variable seed for later rand() calls srand((unsigned int)time(0)); self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; UIViewController *vc0 = [[PatternViewController alloc] initWithNibName:nil bundle:nil]; UIViewController *vc1 = [[OpenViewController alloc] initWithNibName:nil bundle:nil]; UIViewController *vc2 = [[SettingsViewController alloc] initWithNibName:nil bundle:nil]; UIViewController *vc3 = [[HelpViewController alloc] initWithNibName:nil bundle:nil]; tabBarController = [[UITabBarController alloc] init]; tabBarController.viewControllers = [NSArray arrayWithObjects:vc0, vc1, vc2, vc3, nil]; self.window.rootViewController = tabBarController; [self.window makeKeyAndVisible]; return YES; } // ----------------------------------------------------------------------------- - (void)applicationWillResignActive:(UIApplication *)application { // this is called for certain types of temporary interruptions (such as an incoming phone call or SMS message) // or when the user quits the application and it begins the transition to the background state PauseGenTimer(); } // ----------------------------------------------------------------------------- - (void)applicationDidEnterBackground:(UIApplication *)application { // called when user hits home button PauseGenTimer(); SavePrefs(); } // ----------------------------------------------------------------------------- - (void)applicationWillEnterForeground:(UIApplication *)application { // undo any changes made in applicationDidEnterBackground RestartGenTimer(); } // ----------------------------------------------------------------------------- - (void)applicationDidBecomeActive:(UIApplication *)application { // restart any tasks that were paused in applicationWillResignActive RestartGenTimer(); } // ----------------------------------------------------------------------------- - (void)applicationWillTerminate:(UIApplication *)application { // application is about to terminate // (never called in iOS 5, so use applicationDidEnterBackground) } @end // ============================================================================= void SwitchToPatternTab() { tabBarController.selectedIndex = 0; } // ----------------------------------------------------------------------------- void SwitchToOpenTab() { tabBarController.selectedIndex = 1; } // ----------------------------------------------------------------------------- void SwitchToSettingsTab() { tabBarController.selectedIndex = 2; } // ----------------------------------------------------------------------------- void SwitchToHelpTab() { tabBarController.selectedIndex = 3; } // ----------------------------------------------------------------------------- UIViewController* CurrentViewController() { return tabBarController.selectedViewController; } // ----------------------------------------------------------------------------- void EnableTabBar(bool enable) { tabBarController.tabBar.userInteractionEnabled = enable; } golly-2.5-src/gui-ios/Golly/Golly-Info.plist0000644000175100001440000000305212156145314015711 00000000000000 CFBundleDevelopmentRegion en CFBundleDisplayName ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIconFiles Icon.png CFBundleIcons CFBundlePrimaryIcon CFBundleIconFiles Icon.png UIPrerenderedIcon CFBundleIdentifier com.trevorrow.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.1 CFBundleSignature ???? CFBundleVersion 1.1 LSRequiresIPhoneOS UIFileSharingEnabled UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight golly-2.5-src/gui-ios/Golly/Golly-Prefix.pch0000644000175100001440000000047112156145314015674 00000000000000// // Prefix header for all source files of the 'Golly' target in the 'Golly' project // #import #ifndef __IPHONE_4_0 #warning "This project uses features only available in iOS SDK 4.0 and later." #endif #ifdef __OBJC__ #import #import #endif golly-2.5-src/gui-ios/Golly/help@2x.png0000644000175100001440000000207512156145314014671 00000000000000‰PNG  IHDR<<:üÙrIDAThíšÏã6Æ¿Ç L߯¬:˜ |²ÆÀªƒu*Xuwoq:P:p:Ðu í@© ÞÛx“9„Ιdi½ûw©G~"ùøøDRJáš`—îÀ÷æ&ø­süÖ¹:Á? i¼(Š÷J©ˆˆ"¥T 8QµPQºßïÓù|þe¨>Qßû°âRjID1€IG35€@†áß=u @‚…ï¬Ä½üFÂ9_N§Ó¯};[pY–÷»Ýn‰ÿÄÅ–ˆV³Ùìs %8˲ÆXàñÜŽ¸@Déh4Zœ3Úk‡´A÷uÚ•ZJ¹èêØ:mKyžTJ¥øþb `Œ¥Y–=tyÙ{„õȦ]ë™­”2òi¯βìAOã clS–å½ÏK^‡vP]¦qED €j4UM§S–åýËËË£”rAD œPš»Ý.ð‹kGœ§´â7øo=5ųÙì3ðMØ~¿ßš¦bžç‰h ÷»Ãð/—ŠN‚uPQ;6~ âœG‡ÑÌóüw"Z•½­ÞßS¸my[Îyà²]¹®á•c½õ±XСæ1c,ÕóÓéô+ç<°uho¢ƒ+VÁºC±‹±J©UókѪ¥ê†©m¬›]º80«`¥”Ó—;æéééÏæ3Ö-Õs‰c³“ççg›-»à–©Ø™[šÑ1ùœ–c±µŽ©PG3ÞÛЩ©ED.ë±3J©È6­‚cÖ)ÒÆn·{µîtGb_[§œš¡íÈTn g¯1pºèR‚«C4¦ ìW/\D°ÉCpƒ#¥¦rÛ®ûêÈ1J© úë‚Q0ÕC4:ŸÏ¿!>`±¶|›QðÀɺ¡œSe*4 –R’°+Šâ=rRœóÔTnMñ!þÁeòÏ]¨Â0üÙTÁ%ôÖ9x. ׋ ["ŠÂ0¤0 ©‘Ô;Ûöx<¶.A«`ë&}ôHJR¶ÀÿiŸU¶¬/™µl£nKÉöä·œs§™è$Xòêœ Lìú Õù´†á'Xö8 A[ºæîî.:Ã&l\ÿ:žÇC)e ·Äø)6Ç¢…”R«3ìÕœóØç…ÛïR³Ùì³R*ö}¯g:‰®ðÊÃíR‹/Wum阫¹˜Öäj®¶q—Kt®î¾ôMð[ç&ø­su‚ÿ`øþ>6EIEND®B`‚golly-2.5-src/gui-ios/Golly/help.png0000644000175100001440000000102412156145314014310 00000000000000‰PNG  IHDR;0®¢ÛIDATH‰å—ÑMÃ0†ÿ«úÐ @ê“­<„ (P&€ Èt2BÙ HÉå©RÙ L@yìC{<àVk»ŠÄIQ¤øþûî|'Ë!Á!¬sê!ÁG±ŽÌ| ` г–g "Ê•RÏ1ñh_ pä€ùlFDÃ} ·š™Œ[@ '"EUU!'oÅ:ltY®µ¾q-8+þ&( ™ùÞµ°S±ééØéLTÈìþ•eyÖét2|ŸK—ÚWÅ#Oöc¥ÔÅr¹œ3ó›y. I’­õ€Ü£Íì ° ÔóˆïÖs'v’Ýn÷Î%‘´,Ë3/ž­­õëV u+IöûýwŸžˆ†!pꮇd2™‘7Á¸Û÷ÚŒ™e±XÌ·üCX×õm@·2"Úô¸®ë[ñ æŽEŸÕË•RÏÌ|JD¹ˆ¤mÄ_®xµZªªº0m ug±Â$I^ÌVŸDJ¦!p 6ƒ …ˆ4bÛ`çQé =HÆ?÷‚µÖOˆÛîÖš8p¶ˆ sâ¹ÁƜǞ#ÁÍ;Â2ûÃØËCQÌ4oÞû ®ÛÈߺ€ä_%ŠÈÈxÙÛ ¶ø½ëíOÙÿû…ùïÞÖaæÿ6IEND®B`‚golly-2.5-src/gui-ios/Golly/HelpViewController.h0000644000175100001440000000260512156145314016620 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import // This is the view controller for the Help tab. @interface HelpViewController : UIViewController { IBOutlet UIWebView *htmlView; IBOutlet UIBarButtonItem *backButton; IBOutlet UIBarButtonItem *nextButton; IBOutlet UIBarButtonItem *contentsButton; } - (IBAction)doBack:(id)sender; - (IBAction)doNext:(id)sender; - (IBAction)doContents:(id)sender; @end // display given HTML file void ShowHelp(const char* filepath); golly-2.5-src/gui-ios/Golly/HelpViewController.m0000644000175100001440000002523712156145314016633 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "utils.h" // for Beep, Warning, FixURLPath #include "prefs.h" // for gollydir, downloaddir #include "file.h" // for OpenFile, UnzipFile, GetURL, DownloadFile, LoadLexiconPattern #include "control.h" // for ChangeRule #import "GollyAppDelegate.h" // for SwitchToPatternTab, SwitchToHelpTab #import "InfoViewController.h" // for ShowTextFile #import "HelpViewController.h" @implementation HelpViewController // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Help"; self.tabBarItem.image = [UIImage imageNamed:@"help.png"]; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (void)showContentsPage { NSBundle *bundle=[NSBundle mainBundle]; NSString *filePath = [bundle pathForResource:@"index" ofType:@"html" inDirectory:@"Help"]; if (filePath) { NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; NSURLRequest *request = [NSURLRequest requestWithURL:fileUrl]; [htmlView loadRequest:request]; } else { [htmlView loadHTMLString:@"

Failed to find index.html!
" baseURL:nil]; } } // ----------------------------------------------------------------------------- static UIWebView *globalHtmlView = nil; // for ShowHelp - (void)viewDidLoad { [super viewDidLoad]; globalHtmlView = htmlView; htmlView.delegate = self; // following line will enable zooming content using pinch gestures // htmlView.scalesPageToFit = YES; // along with a line like this in each .html file's header: // // BUT it's simpler to adjust font size using some JavaScript in webViewDidFinishLoad backButton.enabled = NO; nextButton.enabled = NO; [self showContentsPage]; } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release delegate and outlets htmlView.delegate = nil; htmlView = nil; backButton = nil; nextButton = nil; contentsButton = nil; } // ----------------------------------------------------------------------------- - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } // ----------------------------------------------------------------------------- - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [htmlView stopLoading]; // in case the web view is still loading its content } // ----------------------------------------------------------------------------- - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (IBAction)doBack:(id)sender { [htmlView goBack]; } // ----------------------------------------------------------------------------- - (IBAction)doNext:(id)sender { [htmlView goForward]; } // ----------------------------------------------------------------------------- - (IBAction)doContents:(id)sender { [self showContentsPage]; } // ----------------------------------------------------------------------------- // UIWebViewDelegate methods: - (void)webViewDidStartLoad:(UIWebView *)webView { [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } // ----------------------------------------------------------------------------- static std::string pageurl; - (void)webViewDidFinishLoad:(UIWebView *)webView { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; backButton.enabled = htmlView.canGoBack; nextButton.enabled = htmlView.canGoForward; // increase font size NSString *jsString = @"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '110%'"; [htmlView stringByEvaluatingJavaScriptFromString:jsString]; // need URL of this page for relative "get:" links NSString *str = [htmlView stringByEvaluatingJavaScriptFromString:@"window.location.href"]; // note that htmlView.request.mainDocumentURL.absoluteString returns the // same URL string, but with "%20" instead of spaces (GetURL wants spaces) pageurl = [str cStringUsingEncoding:NSUTF8StringEncoding]; } // ----------------------------------------------------------------------------- - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // we can safely ignore -999 errors (eg. when ShowHelp is called before user switches to Help tab) if (error.code == NSURLErrorCancelled) return; Warning([error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]); } // ----------------------------------------------------------------------------- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (navigationType == UIWebViewNavigationTypeLinkClicked) { NSURL *url = [request URL]; NSString *link = [url absoluteString]; // NSLog(@"url = %@", link); // look for special prefixes used by Golly (and return NO if found) if ([link hasPrefix:@"open:"]) { // open specified file std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); OpenFile(path.c_str()); // OpenFile will switch to the appropriate tab return NO; } if ([link hasPrefix:@"rule:"]) { // switch to specified rule std::string newrule = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; SwitchToPatternTab(); ChangeRule(newrule); return NO; } if ([link hasPrefix:@"lexpatt:"]) { // user tapped on pattern in Life Lexicon std::string pattern = [[link substringFromIndex:8] cStringUsingEncoding:NSUTF8StringEncoding]; std::replace(pattern.begin(), pattern.end(), '$', '\n'); LoadLexiconPattern(pattern); return NO; } if ([link hasPrefix:@"edit:"]) { std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; // convert path to a full path if necessary std::string fullpath = path; if (path[0] != '/') { if (fullpath.find("Patterns/") == 0 || fullpath.find("Rules/") == 0) { // Patterns and Rules directories are inside app bundle so prepend gollydir/Golly.app/ fullpath = gollydir + "Golly.app/" + fullpath; } else { fullpath = gollydir + fullpath; } } ShowTextFile(fullpath.c_str()); return NO; } if ([link hasPrefix:@"get:"]) { std::string geturl = [[link substringFromIndex:4] cStringUsingEncoding:NSUTF8StringEncoding]; // download file specifed in link (possibly relative to a previous full url) GetURL(geturl, pageurl); return NO; } if ([link hasPrefix:@"unzip:"]) { std::string zippath = [[link substringFromIndex:6] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(zippath); std::string entry = zippath.substr(zippath.rfind(':') + 1); zippath = zippath.substr(0, zippath.rfind(':')); UnzipFile(zippath, entry); return NO; } // no special prefix, so look for file with .zip/rle/lif/mc extension std::string path = [link cStringUsingEncoding:NSUTF8StringEncoding]; path = path.substr(path.rfind('/')+1); size_t dotpos = path.rfind('.'); std::string ext = ""; if (dotpos != std::string::npos) ext = path.substr(dotpos+1); if ( (IsZipFile(path) || strcasecmp(ext.c_str(),"rle") == 0 || strcasecmp(ext.c_str(),"life") == 0 || strcasecmp(ext.c_str(),"mc") == 0) // also check for '?' to avoid opening links like ".../detail?name=foo.zip" && path.find('?') == std::string::npos) { // download file to downloaddir and open it path = downloaddir + path; std::string url = [link cStringUsingEncoding:NSUTF8StringEncoding]; if (DownloadFile(url, path)) { OpenFile(path.c_str()); } return NO; } } return YES; } @end // ============================================================================= void ShowHelp(const char* filepath) { SwitchToHelpTab(); NSURL *fileUrl = [NSURL fileURLWithPath:[NSString stringWithCString:filepath encoding:NSUTF8StringEncoding]]; NSURLRequest *request = [NSURLRequest requestWithURL:fileUrl]; [globalHtmlView loadRequest:request]; } golly-2.5-src/gui-ios/Golly/HelpViewController.xib0000644000175100001440000003226312156145314017156 00000000000000 1280 10K549 1938 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUIWebView IBUIBarButtonItem IBUIToolbar IBUIView IBProxyObject com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 274 311 {768, 960} IBIPadFramework 2 266 {{0, 960}, {768, 44}} NO NO IBIPadFramework IBIPadFramework 5 < IBIPadFramework 1 > IBIPadFramework 1 Contents IBIPadFramework 1 {{0, 20}, {768, 1004}} 2 IBIPadFramework view 7 htmlView 30 backButton 31 contentsButton 32 nextButton 33 doBack: 34 doNext: 35 doContents: 36 0 -1 File's Owner -2 2 22 23 24 25 26 28 HelpViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 37 HelpViewController UIViewController id id id doBack: id doContents: id doNext: id UIBarButtonItem UIBarButtonItem UIWebView UIBarButtonItem backButton UIBarButtonItem contentsButton UIBarButtonItem htmlView UIWebView nextButton UIBarButtonItem IBProjectSource ./Classes/HelpViewController.h 0 IBIPadFramework YES 3 933 golly-2.5-src/gui-ios/Golly/Icon@2x.png0000644000175100001440000000515712156145314014635 00000000000000‰PNG  IHDRh$uï!tEXtSoftwareGraphicConverter (Intel)w‡ú IDATxœìœ L•çÇßçý8`™V\¢©íœ›·‚I×ÖÕ) Û‘‚("§Z#2ÛÂbmí0µ“‹ 6¨Ðµ\]]§€\¹‰Ê‚XÁ㥴-W¼T{ ÙwÎQ£VÈgx’÷}oòË žü}<ÿ"øËCú~˜/Â|Éc!  Y˜`ÈÂC&²0Á… †,L0da‚! ŒÇ.¬û²Wå!¿š*ß«W^`ì§Ûž'O,ª(óíh[,z FÐ7laU‡WÅGl¬ÎÊ>“¾·íí·Ž„Gµ_òÐØ­žïǽ˜¾#ùóܼöíÛšW,ÿäã” õï#\ FÐ7D(,éÃàù•ÅÅ=u _Õ×÷Ô7\ih¸’™õõì™…û²ô÷ÆŒ½<æ%nxïLm:y¥ÞLuõ7¯·¼ìÕÛã!P FÐ7D(¬¢,`„¢5kZSRΤ¤´§¤tXØ‘|ú•WNMœ¸÷t«Ÿ:öã­®®[ž}¶6)éÂýc)Éíññg§N© ðß J FÐ7Ä)ÌÝ=ÂiÌ_Ÿª°Ð†°ÐÏÌ4††6¾Vç6§RýRЪ·Ô±´=£Fç<5¾(,´É<Ópwò³ ¦1¿,52µ±n‰Aß¡0ãE_ÍGŠ’æä”áæzÐÝ­ÜÝ­ÌLù¬ÙiвÛqĶï®û,ó[G•4e³s‘yìî¤{Å„‰yŠ’ª({־ʠöÂÐ7D(¬¼d1…Ý@²r‡ËrzbŸÓè•Ñ£rìtÙ@r2)ý÷éVç©›²€äPš5ÒQËã¤Nf°WgÔÉ}2æÏ‹à?P{aè"v°Ô—’\BJU€((1=š>µwNŒ:–•¹\Z€‡î|¤…Ò’œÌUBj}CœÂj*ìtGí äüϱµÍ-+]ÙgþQÖÞWÀ@¨á“ôäsÏGs¡Aß§0•IÁÃìÔ·R·™¯ tÓ_ÚÙ–lŠyóÞØ—Æ…³f~ P+æ1 Ý ==}z|ǽ@Aß§0•c~ÞÞÑvº ZlH«­Mñ¬Y›‹ ƒS–üGbÈo³S¡M 9©~Ç7öÓ Âz¯..P#èâf¡·Ççh£C­ÿ%cÀÀ“çÏ.­¯Yzª5àö o¡µƒ¾á  SßGÙúwßÙž¾>)|Ý{eÅþóº¾ðŽßòÚúw¶ý-L z䯥ùÔú†ƒ-ÌxÑËû¥„-qgO·k8÷Áp½¥µwíÚæ•Ëcz¯>ð Óÿì ôô((.í9{îšáܳ†ë{3Œž›öÐfüj}ÃÁv£×ëOܺúµ¶¼üμ‚‹yù]yùù]¹ù]K|[–ùEÜû„ÿ t™V¾cçEó˜Q³LÆÆž™T\Z¼T”@í oˆPXtä«ãŸªXý—æÍ±'ccZcc[,›cZü—{rüÿî2ý“´ó‚דã?qq©Š‹m‹9i³LÆ´DF¶Oøuù”II7{¨ô  S¿íŽ·ÕÞ!gÆ ôú#z}¥^_e¦zÙË•“§Ú;dÏx>JŒÜ<Ü!{¤c†ß’*óØÉ}µÇÂÃö™ÃíÓví\Á öÂÐ7D(¬©~©B?’ªÓí<©À噢éÎ…&üj?¥i©ŠòQ÷åųgFì’>zt¶ó4uàÎä´©Eö2ÔÉË×ñ¨½0ô  +-ò¡$È~J uº|[]ž­n¿N) æ'ò(ìnn\>uò& …æÉB…ÚÚªc* ì·< 4ßuvÿÚ Cß¡°cM‹šKHå}!pˆÀa˧”T)t×yC€»[4ê&Mc‡Ló¦±J Õ>>ïò¨½0ô  ûñ¶çر)š€4ÒDÈQbúà˜ùQå(£O?ðÃ-¯è¨€ó3–±&Õ'VÇņð¨½0ô  SÙóº =Aà í¡Ðêè¨7Աˋ~á˜N¡À™ŸQhstÜÑyÁ_ˆ@ oˆSØíž/ÎH Êy€.JT.érÀ¨À9—í×îþÒl÷§«tJ5Q:)1RÓŒeò£Î¦$!ñ¯¢j}C„ÂT¾ºä=oîVJ[zþÐKé7 múÝsqíü°™‘èôD@'ÐoÕIªB¿p‘šðÁꟾ_ P vÐ7D(ÌBi±HðF×Ùÿœùû$½>*=uåÍkx_ôt{%nZä³íÅ’çÏÛñ÷PCÇ2A5‚¾!Na’àNÕ–ôª¶¤?xTµ%ýÁ©ª-éUmÉð¨jK€GU[2PaªÚ’àTÕ–ô§ª¶¤?øUµ%ýÁ¯ª-é®UmÉX¹ªmMX¿ªmMX¿ªmM UÛjª6óW‘!¡j3•ª6óW‘!¡j3•ª6óW‘¡¢j[ CEÕ¶&†ŠªmM !UÛjàWÕfu³š¸SµYݬæUmV7«ù‡GU›ÕÍjþáTÕfu³šxTµÞ¬æUm†7«ù‡GU›áÍjþáQÕfx³š8UµYݬæNUmV7«ù‡_U›ÕÍjþáWÕfu³š¸VµÞ¬æ©j ƒTµEBªÚ"!Um‘ª¶`HU[0¤ª-RÕ ©j †TµCªÚâ!Umñª¶xHU[òh¤ª-RÕ ©j †TµCªÚ‚!UmÁª¶`HU[0¤ª-RÕ ©j †TµCªÚ‚!†ª.Bó8ØÂªÚè"4ÿƒ-Œ¡ª.BóˆP+U]„æ?¡0†ª6ºÍ Ba Umtšÿ@„ªÚè"4ÿ…1TµÑEhþ c¨j£‹Ðü"ÖÇNÕF¡ùÄ)Œ¡ª.BóˆPXSU]„æ?¡0 ¬Tmtšÿ@œÂúØ©Úè7«ùla¬Tmô›Õü"ÆJÕF¿YÍ Ba¬Tmô›ÕüâÆJÕF¿YÍ Ba Umô›Õü"ÆPÕF¿YÍ Ba Umô›Õü"ÆPÕF¿YÍ Ba}ìTmô›ÕüâÆJÕF¿YÍ Na}ìTmô›ÕüâÖÇNÕF¿YÍ NaªÚè7«ùD(LÂY˜`ÈÂC&²0Áø?ÿÿìÑ € ÿ¯Û!>ð0Ìa˜Ã0‡aÆ ÿÿeªŒæüIEND®B`‚golly-2.5-src/gui-ios/Golly/Icon.png0000644000175100001440000000461312156145314014257 00000000000000‰PNG  IHDRHHÚ$!tEXtSoftwareGraphicConverter (Intel)w‡ú %IDATxœìZ PSW¾çTpA°V`wÛúDâ³NÇj}  *â|E*…º±¬ ‚…¡<!HxÈ;ÈVQ@ /åᣃ/DkgOr)ºæÚ{1˜„]g¾¹sóqÎÇÿÍÍùïÉ7ùõùÚÿI ¯àƒ±ÆþOõß¡ßë5ýo’Ö%¢?0yzBko3{þ”ö:ùèg“îú» â‚´àïko³>–œÉmKKk=ßÓ-V¬(µ Í˽ÐWÏ c¾d'xDG× ò;OG^ÊHu†Ìà#Ú‰Ðïrøí!Á¼×l• 4È 319åéQÇ ¼Ê ¬g0êl6ýÎ40Hc^“WéôK¡ÇÝ/lùê«bŒa^ùâ‹ÂºëC÷o´®Ææ:T?Ÿš4pß„¤ ®1’‚ÄÆzºè4AG‡;ŸšC5È™öQ¦ªê¹Èˆ(Ê™ñ’óøêji ÜwyOPM77’sçðUTR|öï›9ƒ¥ñ‡tê<þ|*ïÏÊFÑ”ïO9‘Ä5FRðá3c½Ý¦ðRbxE Ê=悈™a^©ÔX†òÛGìêéqpÖÌ80§"vG„»ÝézõîV˺£G<“ÙÛŸ>|k°ü>ðü)-ãÄôl¼fõû“%‘s( â–1DÜò1¦€ˆ[>ÆqËǘb"n9@1·¼¼É7â–+DÜò1¦€ˆ[>ÆqËǘ"nùSLÄ-ŒeÄ- Ãä‚\Fn‹›x»C­TÀ1& ¿ZëÌ9{V.·ËÞ®ðú«±­ã½|d"  l44~\oY*!Ëçð­­˜ /}tÆÚšéÒ²¿Ÿ;@xª*bRmÞÏš‰³=S*¼i ®Ké¹P` @õ Ú5«O)¼ôуÀ iö¶a´c¤¦FyE™­ÂKµ±_ñd¸ÕJOure°8r³ g7­lûˆ›d"+XW³å|| 'U{6±áêÆQ “%â&™Hã ¶5¯35ÍdžA¬]Íëé2S–ˆ›d"+èëã©­¶rE>$—//ÐÐH 9æª,7ÉDWÐé‡%“(€¤`·‹Ÿ²DÜ$i\Aø­à§‘a¹œ”è¤,7ùDZZ·Õ.²ÝjÃɃÆJq“O¤qËŠ·øûyäÙPŠˆ[ÆSܲ '6&‡C×c~,œØ˜Œ·,§¸e9þÞ#nYNqËr,ü½Gܲœâ–åX8©5&ŸC×c~,œØ†wÍú{Þ|¾½Ýæ~óÛ, ؾa~9dü‚ðÝÕÝañì±é» ïø`l¼áƒ±ñ†ÿÿÿ*³h©PާIEND®B`‚golly-2.5-src/gui-ios/Golly/InfoViewController.h0000644000175100001440000000310512156145314016617 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import // This view controller is used to display comments in the currently loaded pattern. // It can also be used (via ShowTextFile) to display the contents of a text file // and edit that text if the file is located somewhere inside Documents/*. @interface InfoViewController : UIViewController { IBOutlet UITextView *fileView; IBOutlet UIBarButtonItem *saveButton; } - (IBAction)doCancel:(id)sender; - (IBAction)doSave:(id)sender; - (void)saveSucceded:(const char*)savedpath; @end // Display the given text file. void ShowTextFile(const char* filepath, UIViewController* currentView=nil); golly-2.5-src/gui-ios/Golly/InfoViewController.m0000644000175100001440000001756212156145314016640 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "readpattern.h" // for readcomments #include "layer.h" // for currlayer, etc #include "prefs.h" // for gollydir #import "GollyAppDelegate.h" // for CurrentViewController #import "SaveViewController.h" // for SaveTextFile #import "InfoViewController.h" @implementation InfoViewController // ----------------------------------------------------------------------------- static std::string textfile = ""; // set in ShowTextFile static bool textchanged = false; // true if user changed text // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Info"; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; // pinch gestures will change text size UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleText:)]; pinchGesture.delegate = self; [fileView addGestureRecognizer:pinchGesture]; } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release all outlets fileView = nil; saveButton = nil; } // ----------------------------------------------------------------------------- - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; textchanged = false; if (textfile.find(gollydir + "Documents/") == 0) { // allow user to edit this file fileView.editable = YES; // show Save button saveButton.style = UIBarButtonItemStyleBordered; saveButton.enabled = YES; saveButton.title = @"Save"; } else { // textfile is empty (ie. not in ShowTextFile) or file is read-only fileView.editable = NO; // hide Save button saveButton.style = UIBarButtonItemStylePlain; saveButton.enabled = NO; saveButton.title = nil; } // best to use a fixed-width font // fileView.font = [UIFont fontWithName:@"CourierNewPSMT" size:14]; // bold is a bit nicer fileView.font = [UIFont fontWithName:@"CourierNewPS-BoldMT" size:14]; if (!textfile.empty()) { // display contents of textfile NSError *err = nil; NSString *filePath = [NSString stringWithCString:textfile.c_str() encoding:NSUTF8StringEncoding]; NSString *fileContents = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&err]; if (fileContents == nil) { fileView.text = [NSString stringWithFormat:@"Error reading text file:\n%@", err]; fileView.textColor = [UIColor redColor]; } else { fileView.text = fileContents; } } else if (currlayer->currfile.empty()) { // should never happen fileView.text = @"There is no current pattern file!"; fileView.textColor = [UIColor redColor]; } else { // display comments in current pattern file char *commptr = NULL; // readcomments will allocate commptr const char *err = readcomments(currlayer->currfile.c_str(), &commptr); if (err) { fileView.text = [NSString stringWithCString:err encoding:NSUTF8StringEncoding]; fileView.textColor = [UIColor redColor]; } else if (commptr[0] == 0) { fileView.text = @"No comments found."; } else { fileView.text = [NSString stringWithCString:commptr encoding:NSUTF8StringEncoding]; } if (commptr) free(commptr); } } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; textfile.clear(); // viewWillAppear will display comments in currlayer->currfile } // ----------------------------------------------------------------------------- - (IBAction)doCancel:(id)sender { if (textchanged && YesNo("Do you want to save your changes?")) { [self doSave:sender]; return; } [self dismissModalViewControllerAnimated:YES]; } // ----------------------------------------------------------------------------- static std::string contents; - (IBAction)doSave:(id)sender { contents = [fileView.text cStringUsingEncoding:NSUTF8StringEncoding]; SaveTextFile(textfile.c_str(), contents.c_str(), self); } // ----------------------------------------------------------------------------- - (void)saveSucceded:(const char*)savedpath { textfile = savedpath; textchanged = false; } // ----------------------------------------------------------------------------- // UITextViewDelegate method: - (void)textViewDidChange:(UITextView *)textView { textchanged = true; } // ----------------------------------------------------------------------------- - (void)scaleText:(UIPinchGestureRecognizer *)pinchGesture { // very slow for large files; better to use A- and A+ buttons to dec/inc font size??? UIGestureRecognizerState state = pinchGesture.state; if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged) { CGFloat ptsize = fileView.font.pointSize * pinchGesture.scale; if (ptsize < 5.0) ptsize = 5.0; if (ptsize > 50.0) ptsize = 50.0; fileView.font = [UIFont fontWithName:fileView.font.fontName size:ptsize]; } else if (state == UIGestureRecognizerStateEnded) { // do nothing } } @end // ============================================================================= void ShowTextFile(const char* filepath, UIViewController* currentView) { // check if path ends with .gz or .zip if (EndsWith(filepath,".gz") || EndsWith(filepath,".zip")) { Warning("Editing a compressed file is not supported."); return; } textfile = filepath; // viewWillAppear will display this file InfoViewController *modalInfoController = [[InfoViewController alloc] initWithNibName:nil bundle:nil]; [modalInfoController setModalPresentationStyle:UIModalPresentationFullScreen]; if (currentView == nil) currentView = CurrentViewController(); [currentView presentModalViewController:modalInfoController animated:YES]; modalInfoController = nil; // only reset textfile in viewWillDisappear } golly-2.5-src/gui-ios/Golly/InfoViewController.xib0000644000175100001440000003222012156145314017152 00000000000000 1280 10K549 1938 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUIBarButtonItem IBUIToolbar IBUITextView IBUIView IBProxyObject com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 292 274 {768, 960} 1 MSAxIDEAA YES YES IBIPadFramework NO 4 blah blah 2 IBCocoaTouchFramework 1 14 Helvetica 14 16 266 {{0, 960}, {768, 44}} NO NO IBIPadFramework IBIPadFramework 5 Cancel IBIPadFramework 1 IBIPadFramework 5 Save IBIPadFramework 1 1 MC4xODI0NzczNzYyIDAuNDc4NzY5MDk4NCAxAA {{0, 20}, {768, 1004}} 3 MQA 2 NO 2 IBIPadFramework view 3 fileView 9 saveButton 14 doCancel: 6 delegate 8 doSave: 13 0 -1 File's Owner -2 2 4 5 7 10 11 12 InfoViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 15 InfoViewController UIViewController id id doCancel: id doSave: id UITextView UIBarButtonItem fileView UITextView saveButton UIBarButtonItem IBProjectSource ./Classes/InfoViewController.h 0 IBIPadFramework YES 3 933 golly-2.5-src/gui-ios/Golly/iTunesArtwork0000644000175100001440000011014412156145314015422 00000000000000‰PNG  IHDR{C­!tEXtSoftwareGraphicConverter (Intel)w‡úþIDATxœìÕ1 0 À°¢<;¦ÁèK/óî hÖ XaQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQeQÿÿìyT”UÇwyf@dRÔÊ MSRSËÑ´c¾iêÛª˜šŠhn¹à–)äV.˜¦wÙaXfY†mAÀdSÙåUs9eõ÷Î…‚§Þ£Î\Ç{Îç̹Ï<÷¹ó9ßûÇ÷\VQ@ðŒ" @ žQžÊ¨®t {ø€ÛNïwnÿÀçдõjá#|„QÂ[>¼ù< OM”Oپ壡Î-Íf´6™%‘™NðlŒgaä&Q7Bf¶k»jÆŒÕ~>ó„ð>O5¼åÛÏãâ)(€Ã>3 X.“¦›Ñ¯:Øì~Ý)hÌÛÁ«Vh6mËÞ¶+wë÷yë¾ÉŸ4YíìÑ¥óa‹ÖÛåt•å’Ó¿(=?MøáótÁ[>¼ù<^¸.€Èˆ;/&xeÛ¯½6wö™ÀëÅE ׯ7\»þû•›woýÖpë׆úk ×o5TU7$%^_çyzäˆØîÝ}dt‰‰löô© j*çá#|ø‡·|xóypZUn®“ÜØ!ËÖrë73\§ä…DݸP÷ßÚ›·.ÖÖUÕܨ¿|§¾öN]ͯu5?ÕÕ²Ë[µÕ7ëjn_½r'«àΪµEcÞMsêÕJò´³ý<$h¾ð>‡[xˇ7Ÿ'5¾Cg3³õ}z%]üåòœlÍÝ’Ò†¢âŸ‹Ëo”0Ê~.-ý­´ô·KÙeÊËbw÷¨ž0.mÔˆâ¶mŽÊ¥%³f®>ÂGøpoùðæóDᮊy¦æS­¬6–7bdƲe%šô†üÜßssÎ=u5çÔåœSÿÉɽ–“s3'÷Gíà~rs¯ž)¸š}òZnþÝzïÝ‚ÃN÷ï%—-û¯„ðyÆ}xƒ·|xóyÒðU¡!îdm±{„ËEçœO?K‹N¸­N¹¬¾‘š~59µZV¥N«U§^Q§\S§Ö«S/?@Jj}Jb}JJ}rÚ­ÄÔ»ë7Ô uNîœíÔC%§‹^qúÿzXøcòá ÞòáÍGpT9YZ™M´¶ôvyãÒ€WŠ\œ“÷¬Š­ˆRU©¢«£T¢c.*£/(£/)UµJåe¥ªJ©ªlFõ±¨+JeuL\¥BU¥PþòÉ'ç×sÞè_Ü÷¥4‰z¼3j‚ð>Ï oð–o>ú—(/™Ò¡ã2kËoûöÉèçtv`ÿ¬)S |ý® * *kBy@Ð¥€Àª€Àê€ÀŠ€ÀKͨ ô¯ ¬ . 9ë\³uÛõ~}’ú÷*èTÞùùIš;ÁßOFøcòá ÞòáÍGoðR¯^%Ik»v‰wì–åä”Ó«wΝ*öï¿|ðÀŽ{‹µì;¯”ìÝ[¦eOÙƒæì)ß»·tß¾sûöåò)ß¾ãÇ¡C2œz:õ>÷rÏL‡¶ ¤ŒZ*|„ϳãüåÛÞà¢ü|çÊ¥¹öí|»g::žîÒ-ݱGà†M—½·”íØV²Ý»ØûAм½ u5£Ð{ûéíÞç¿ÛZ²s[áwÛ‹6o­õNViã{dté”dmáݵËâ+—ÚÃÂGø“oð–o>ú„‹pp˜gaº­S·¨öÏ'8t8ùb§Ì—zF®\qÁkMÁF¯ü¯=O{yž¹G—g¾—×)/¯\/¯¼–8å¹NóµgÞú5…ëל]çyÆÓóÒ¨Ñé/vnß%¬c§„βì"ät¡÷–÷…ðy|xƒ·|xóÑ'†/€ïwºb¼°mXÛö1ϵ?áÐ.¡½ÃqÇ.sÜË–{œYµ2ÇciîÒ¥yM8u6ÎoFÁÒ¥gÙ­%Ë3—,Ó,ò8õÅÒŠa.šöí¢ÚµKlëÐÎ}D¼…Ù;Û%ÂGø½oð–o>zÆðàè¸ÀÄt£ý1{•­]Œ]›ãövJ{Û£XàîvÒÝ=ÙÝ=}–{FKhf¹g>Ȭ¬Yn¹l0sNòÌ9IŸ¹¥»Í.ëÖ%¼M¸]›8¶¾­ÊÎîX;û0Šçûš)|„qûðoùðæ£g \q±+$ÙTsó]­Í#[Y†™™‡›·Ž°0µ±::䄉ŸdNœ˜8yrj˸¦µDú$×ÌI“Ó'}š4qJÒÇ®ÞÏ·±ñ±¶ c+›Y„˜Y·6W˜· 0•­òæá#|ŒØ‡7xˇ7ýcàXÿõ™´ØÌì0‘Be¦A2“`yˆ©<ÈÌÔ÷9û#£GkÞ{/uìØ¤±cÿ1l2{$y̸Ä1ãØkf¿q¦&%ÉßÄ$ÈÄÔWÖÊWÆR€\Ú,—»VUÌ>ÂÇX}xƒ·|xóÑ?.€>=WË¥u ò@Gù"8Ê ÈЮÎ]#†¿¥ñVâðañÃ]âß~âŸàâ’0r¤zèÐø¡.Ƀ«M[íÃø F~ü>dûŠƒ0ìK‹öü0Cøcõá ÞòáÍGÿ²êkçId†œìðE8¡#ˆ ÀŸÁò"ø•õ야Á[>¼ùC€*b¹™ÌƒÀJCAȧq$“‡J2¿Î/„÷êíôòqöÚ»gL¢[¤çKÊÞ½âºu‹mmæOÈQL E(˜€‚•0àC€ü£4@’6õè¹Nø£ôá ÞòáÍÇ ²vípŰØD›Q¢¾H{þòC,}Æ8L ð£ô[ÿç;Dth¯x¡cø=/<ÖÃ::(ìÛɤC”°2gÅ F ³Å1;ÜùbëûºÕÆv‘ð>FéüåÛA0d|»ñßVPt”à(@¡Ât(îÞ@A¡rIaj¢°¶Š²¶Š°¶VX[‡Y[‡þ…Uˆ•Uˆ¥e°¥E¨ÄÚ‡ŽÿZЉàmÕöÇ$’ÊþN¢óά>ÂÇø|xƒ·|xó1†,€o6L`@AÇ@[…€RÂJ”ˆB"! ’h vð'4”½Rm¦¡))R±Gî_„]¤`éÁäF ‚wJtAîɵÂGøŸoð–o>Á °q¼v €@ÀqÑ-‚!iï²þT¬"$ŠB" Ž!(¶Šãfƒã,eŒX¸ÚTMÖ9F ¡H–>`%Æ E´[¢ ³4_ ác|>¼Á[>¼ùƒ~ hÓ8‚Á°çW„æÊI Ž` @À‰f°7“ÔI Û§&ĶÛ§øæë H º=ÃV£8#FÞóÏÙ |„ñùðoùðæc YêdO‰~ŽÑa9I%(Pòƒh£Oi6ÇŽkF< ¤æë PHeMŽÛ9¶Ù2rŒMí;.¸Zï.|„ñùðoùðæc ü›À’4ÝDv„bPBé!õ~öþŸ¤5_£t ݤ!8É6ÀD °øå¾K„ð1VÞà-Þ|ô `À -2i7%숔‰¡ - Ñ^ji|§i²iÌa“!›EÙŒlÝã‚AC!“@Ö®ŸËÞ15Qiᇮ;…ð1VÞà-Þ|ô `óæñ€æS)£Ài@’³ãU@>‚ÓÚ4Q*»<Ù9¡…Él)m÷¢4@@§0I£t¿‰É”Ý»× ác¬>¼Á[>¼ùè@YÉTy+wBb”Çr” Ú/Ƽ·¬*3u™æ>"r°¶ä³tŸ’‡‰ãÍÓNf¯>ÂÇX}xƒ·|xóÑ?†ÿ‡0}û¯ÆØ[Âì t´œÖÆ(_GÁãAÓ˜-…leJcZùöÛ-ü–ð>ÆäüåÛž1|,’Ik$Nà<†r efUÉò*8§Ý•GåÖ®_‚ âtŒöXXÌÝ·÷á#|ŒÛ‡7xˇ7=cø`ô æ¦y¬!1\Ó‹Ÿ’¸à"Ò¦Vü@…)E ‘Ka-uvþòrMËÿ’Møcòá ÞòáÍGŸpQѪerùT€ýgÈðE × tHv"«DPŽ ì1€ÎS|šÒãolc7u×®‡þ á#|ŒÉ‡7xˇ7}ÂE0ÜfM£Ò*Sy4Eì T‹Ñ g®Àp ÃÅG]`­NeJ:mÜúºéÂGø<#>¼Á[>¼ùè ^  ®Ö½{/O‰~/¡,Šjª©¤2 •WÔH¥Žª{TÞ£¢ ì²Zw÷þ§ð%™ì, @kz¿²8Jõ7?~+|„1ùðoùðæ£7þÿÿì{TTÕÇ{ïsæÌˆ¼)ˆ¥&fT^¬ì¦hÖ²nšy{*¥¥"*¢%¦™¯J…4+5ˆ¼axÌð–ÇðVyˆ/Ää ¢\õæ]y¹{Æ[‘кÝRf3îµ>ë¬=gÎìù¬ïïï: ¬¥¬ä5+«y’¸M†5©Áä­_j¢waµê0Ôh E€VmZ4"h@P‡´wjµº=sÁD+U#T#º¦='ƒD‰|bßìM[¾å>Üçnóa Öòaͧo`¨(¥E¯š™-ñ7 ©@k€v©Ø@i7jB¨^Gö­ºó­ÝhÔè f ֽж±LÞÛØp{~ãŠûpCòa ÖòaÍçNÀtܤò»¹îîK¬¬‹‚FÛRHj™˜(àT¥‹(S NpFß|.áåfÄ?`Uiéíÿ®%îÃ} ɇ5Xˇ5ŸÛK?(€Ÿ :à±tÉ:ÇѬmÖÂD<1YŽÉ{ô(*–4™7ÌÁsâs¾^^;r³½Û/¸qîÃ}ú/¬åÚÏm¡?@wJKü4YÞ)Iž ªÅɉšLï’âuíqîÃ} ÖòaÍçÓ_ €Ãáp8^‡s—Ò/  ¾Ö-*ÊãÀ^·þoìx5pÿ;Ùš¸÷á> kù°æógè7P]1'`Ëë'l25š?P¾P$ ¼„àE/ÄÈMÜY0xÐêùó? \Ê}¸÷é×°–k>·‹~P8;¯”‰óŒ„µC,¾zÒ)|Ús«WlÞvtÛÎâ­_–®ÿôøì·4&ÄŽ~Àd`€$¬¶0õš?ェïÞá>܇ûô/Xˇ5ŸÛ Ó»jøðhe¹ý‰¿D{,:ÖQQÞÕÑÑÕÞñïÖË7:¯wuþÐÕÒÞÕÑÙUWß•™Ñ±Þ÷ijSRx P&xÉe‹æÍ]ÖP»˜ûpîÃ>¬åÚπѨ«qsíFo²,M·>ý×|×9¥‘ñ—Î5ý«ñrç÷Mu —Zšliü±©á‡¦†+Môagcý妆km­?)ûqõºòi/æ:9Æ}­-—D†{rîÃ}˜…µ|Xó¹s°XG¼Ü‡û0kù°æsGa®”Ê¥ ã¹ffŸOžT:åÙü>¨,Èë:^üïââ«Å%mE%ÍE%ŠŠÛ‹Š._Ô.~MqqÛɲ¶£ÇÚ‹ßØ»ïÊK/–M™tbì˜xI¶lúß^å>Üç.÷a ÖòaÍçNÃVDEºüº¹ÉWS\¾w™Pôö»¹ é×4Ùײ4—ròÚ²rê5¹ušÜFMN«&»]“Ó¢Éi¾…윖쌖ìì–¬ÜÎŒœ66Mœ1yÂQ§QjIxÿ§ÿ¯‡¹÷1$Ö`-Ö|ú†  èÈÌF³ÌMý]ž:ïüH¹Ë„¬]ûZâSjâÕuê„úxõ¹„¤ïU çT çUêF•ªY¥®S©k{PŸߪRÕ'¥Ö*ÕuJÕ?ß|³`“EO­xôÁ\Qðy~êLîÃ}îBÖ`-Ö|úV  ºrÎûÌM?{ôáüÇœN{dÎܲ àöCáå¡ág»Q~>4¬.4¬>4¬&4ì|jÃBZÂÂjÂ"΄Fž Žhغ­ã±‡3ÇŽ>;ΩzøÐXQôð\ö¿&Ã}¸!ù°kù°æÓg°ROŽ_-Šëî‘æ0òˆ“SÑè1±«×Ö|ûmó¾½ßïÞ]¡eÏwºEåîÝgµì:ûßEOvUïÞ]µgÏé={Žï¬Ø~qâÓùN£Ï89ýc¡í }D˜­Š÷æ>Üçîña ÖòaͧÏ`¢‚ƒ<$ÑÃfpÃ…'FŒÌs¶qs³ÿ–³Û·UøWøßJ¹¿ÿå=8ãp"Àÿ»/¶VîØvæ‹€òÏ·6M}þȨQ¹ÃÒFå–inâÿˆ­Í¿ÙÃ܇û’k°–k>} `k»ÔD±mØÈx»¡é¶CŽÝ7¬ðAǸWóû¸l“ßñO|Oøùžü‰2?ßã~~%~~Å~~¥½Q⻾àßÒ ŸÙðñ©õ¾'}}ÏO}!ï¾ûìFDÛK>쨭u¬$,÷ßò ÷á>wƒk°–k>}‰þ àË®/·²Œd—tÝaÛÁév¶É#b»Ÿ]ésrõ‡E>ÞÅÞÞ¥Ý(ù º>Þƒ2oïSô)¯•…^¼ïSòžwÍ$—»Áñƒg ²MlKß"ÍÄh—µ¥÷á>ïìåÚO£ÿppX&Wl²¶I´°Q[Z'Y[%ÛX«l,½ñZ™»Û1w÷,w÷¼…îù½Q°Ð½ðVYèVL g-Xœù®[žÛ¢³#GÄXYÄX[¥Òý-­ÕÖÖ‰ƒm¢ì¸÷á>†íìåÚO£çHMY%Êæïh7À4ÚÈ8Æx`¬‰q”…Ù¡§ŸJŸõfá¬Yo½•Ó;®¹½‘7Ûµpö[y³ßΜ5'ó ×ü™¯·°47¦;™D™D 4VUÈÖ=ý×[ÿc'÷á>†äìåÚOߣçØðÉ4™¸ÂÈè£dŠp™=ãwC/¦/Éš6#cÚ z,|Ì9U!ß'Š!ry¸\$$£ 1T?—$׺šE܇ûªk°–k>}ž àaÇ$q=B{)ÐA@AQ ´søý±“Ÿ)˜òLÆäIi“]Òž™|ø÷àâ’þ쳚‰Ó&ºd=>^£°ã}cFx=ô]Ža»$¾¿ëëù܇ûªk°–k>}>  ¥q©HæKd'@¡Dt!šÁq¿ãè¬ÇÇ¥?1.íqçTç±Éãþ’Ò¤^yâñ´q·ÇÏ}llޱIÀnLB0ŽÀNßð^ÀÁ‰!tà3ãå@îÃ} Ò‡5Xˇ5½ ÏPÇ®4’ùØ%‘€"xsa€B —IQ¢,xø½1£G%8=”Lc“º‘Ð+ŽªÆŒN92e Q!‡0 #BB”´„ï‚p´ „ŠâæQŽë¹÷1HÖ`-Ö|ô‚> `çvW +äÚŒ"‘„´÷_Áˆ¦Gk!QÁ‚ðµ¥EÈÐ!±Cì”÷ÚÇü„òޡѽ`mo«´± —‰ûBËœ{@8@4xL7Çôæ.Ý?˜[-,ßç>ÜÇ }Xƒµ|XóÑ ú,€Ï6ýÀ*"8P‚hÊŸˆ¹ @$AQ’¨TÈ•æfñæf±ææJsóhsó¨_0‹43‹4505‰i»â‚bð/[Qâ$"ÐV=àLâèMÁ_ˆÂÒ“e¸÷1<Ö`-Ö|ô‚> àÓ3é &(´õø›P‰X%âD¢I¤(„‹B˜vñ3B= ÚL£¤š¾äכЇɀ”4}À‘˜$b¤$x‡(,+>¶ŽûpÃóa ÖòaÍG/èµ6½¬„HHFÐ+R‘öYÚŸj‚Õ„ÄKHÁI¥ÜDÀ©ÓE2M#®ö…ênû$HA(ަX…q:Fñ}% ˬá>ÜÇð|Xƒµ|XóÑ zýhó ‚|tÈÈ@4 mз@cÍÄÚ n‰^“t3PÝ:õ&¦ HÓ­S°n+Ð^Ùmú,RŽD¯É¡sÒ ÀóçpîcH>¬ÁZ>¬ùè}À®¯]òH Žà€t€Ã= '³4™ ›S7RzƒÎ)­ç>Ò‰nÆ€’èn>Š‘#ÏÓ'7rîcx>¬ÁZ>¬ùè}€&ËW–`t@"9ÒʺmôÙ½@/Æi€S{(³ç>4rh“#D'G‡/#‰„l¶³_ÖÖâÎ}¸áù°kù°æ£ôü—À¢8O.;(`P>By¿Aίù­ó?“ÛsŒò(ÐÍ Á1:¹,`ÅCzqîc¨>¬ÁZ>¬ùô=ÿÿÿìÝ TMùðÿcï³;¥ÐkTÌBÄpi01cFb°Œ;Œ±†ñ©(1Ty1.ªaŠH¨<ÓChzŸ:•ÞÒû¡÷[4˜1kÜîÿãÞ†fÍÜQ§¿ã¿Ögõßûì³ÏwýÎZ}ÛuÖ9Ý\&ãö‹ø#&—HIJ!L”R٦̳=í'+ùír0H!£|IŠüá/B@Ê$ ‘ìüidXå2æ×Î3?Äò°<Êš‡6´Í‡¶<Š×ͰoßçÚsüU³’¹¼J ‚lÙ4a<dóVGRÿ@“SɺJ”˜Ž°„㎫¨,=rÄåay”5mh›my¯›  ¸ÐBPµÁÜ3È\L²?ÆÝzþªL’Ï4íAŠd%Ÿ,– „cÚ§¯¿ìVÊv–‡åQÖ<´¡m>´åQ¼îÿB˜Qc¶"äÁ#r¡”dric˜)—ÕY È ‘“ƒ\rfŽ ‡pó´i¼‹åay”)mh›my¬û ÀˆßΣ+ä#P‚@ñ³Dª’Ì«€;²WåUÝA²óBË¡ihØy{íeyXåÎCÚæC[ëþ FŒØánuqiHJ® ¢Ûg”@”M­ À\A øK:ššn©«îø+ÙX–G™òІ¶ùЖG‘¨(€°Ð ‚`Àq%ŠPª!Ì8 `rEVA Åæs(›ã®c´G[Çâðá?ü–‡åQ¦<´¡m>´åQ$* €°²^ÆñÎb!ŒƒäB©ÁRÀå® rî"Pöª`)iuN$å8Ì-›=Ç©¾v9ËÃò¼!yhCÛ|hË£0´@mÍá.<÷“9Xaà‹_ ¸ „Ê1|¦B®ò¹ŠçÊÛ!›Uò{ÿ(tW$Ê0Àí#Þ]ú'o¿eyXeÊCÚæC[…¡¥ˆ¬ôyÚÚËÞ]„b9\Žp©_ ”CH®Â*¨D  ƒjÔs ƒ&ê!¨ ‚J(»R«/Èž4@R¹°Âr“5yEKEàš€wöë¿hÏþã,Ëó¦å¡ mó¡-bPTDFêÜ^½lytT,Hy¾.å› š7¬…°J®Rv åûÛi°Àë$icŸƒq8†[úõ³Þ¶ëû{ÍV,Ëóæ¡ mó¡-ÐUDvÆGŒöªp"TÈ#2ÄåZ¼P#ÀÕWÈ :€äãnúÙ5²ýà>IW‹ùl„O¸öíþs]¿mj´dyXž76mh›myºu@”}5Él?·q @ŒS0ªƒè„äxàc€É=¸¨ ¢fˆZä·M7Ô P µ"\"` ‡Žbn¹±‰Ûþ¿ùw7–‡åQ¦<´¡m>´åéR4À3;¶íí!Øóh7D×D*éåAXáÇ>Aè)Oø‘t,?cð„¿ÈÖð¾ˆkEà _!ñ…hc/-Ëé³6]yÕé³<,2å¡ mó¡-O¡·ˆ‚;KæÏ[ʉ!Ú¡·XˆVU¹Ã£Jê0jûhÀ#<æ@‹6ˆPsÙçí‚ÐIMcÉ(“•[¶Ÿ¨©îœw\±<,2å¡ mó¡-OW ºž)Ì·°±±ÕÖ^Åsºcä'BEü5Ýäa$£eÐu x€}Z«ÙkÙøñ¶ž›22:ÿ³–X–G™òІ¶ùЖ§s½ð_~§ìVÛî6ÜMGw ÇÙBlðZ„¿&·¼xuåŒì'Nsqp8$‰sln°byX–çõEÛ|hËÓ)^§h/#Ý56ÆñF¸}XȪë×ìb£ÓÓv47¬dyX–GùÐ6Úòüm¯k0 Ã0¯ˆÃ0ÌŠÃ0T«ª°ºxÑîÔ «CóyÎõ=¹,.v+ËÓ)X0 C’‚¥žû¿œhº§§šek¯à-F+²FЊç¬0^¡×ÇÙÒrëYßÕo`žÎ €aŠœò]ab²QÄ/Wã¶õÕ<òqàÌiç7I¿qOq?œv໌]{3-Ž55 2xJ£‡§À9köt°\þuQþ²7!OçbÀ0 ®m8p=F›µµ¾ÿÞ%»•·/´äµµ´´5·ü»ñÁÓÖ'm­?·Õ7·µ´¶UVµEGµìrÉž:åÆ!¾"ÎAE´r¹ÅšêŠUÊš§+°`¦›U–[™/²â­VÏ>J4_šq!ø~ií/5ZËjj+«ï××ýZ_ókmõϵÕkkÈfkMÕƒÚêÇM¿&gýê¼#oæ§ãaÁª¼‹Ž–í…@{%ËÓuX0 ÓR’?ï;ÐIMÍmäð˜Y3 ¶lLM‘>-,jË+xTPr¿(~TTô¤¨è'¹ÇEd³’’‡äÞã'ªæÌ–LŸRÐGûŒÀ;X¯Ø¤4yº+†aºÍåË«Åê½zí›<)cÊÔÄ  ¥ m™iÿNK{”–Þ”š^—šÞšÖœšú 5ížlñ{iiM·³šRn5§e>=áóð³O³¦LÊ3"X­™õϹJ§«±`¦{\¼`ƒÑ—½5ŽL1+33M]ò•$,òqlÜã˜Øûñ M1ñU±’ÊXIMl|cl\sl|}l|Ý ââëã¢êãâêc$­QñOÝv×N4šlšb<4TàÖ½küÿýÞM[`À0L7HMž£ª¶°wO³ïš¼›gfş>øFyphehXUphiXxYHXiHØÝКºÐÊЊ—T] n © ¿Yq9´òrÈO HM?HýpLÁ¨w$<çôÉô9¯iÅ`À0Œ¢•.íÛoCïžÿ52q´qÎØ1ÉK-²üÎ6Ÿ Ìó,n§Ä?ð®@¥@•@¹ÀÝ—Tœ«(8Ÿë!çìùêî-£GF^<Ö¸dàÛAzñziË£x¬†Q·3Eüz5µS˜¿(ŠTΫÄB šØï-ÝÓ3fH?û,~Ö¬èY³¢þ2r0yHÌÌÙQ3g“Û¤Ñ&7Å*><NE%PEì'Rõ‘ï/ðûÁ¼²|%ÍyÃ0 2rØVßá Nð4€~œ!0ôððÀAA“?–Nù8jò¤ˆÉfOþá¯03‹œ:5vâĈ‰f1ãÆÇŠU½òAð,g!òØ›< ‡8(ðëŽ}oIsÅcÀ0Œ"Ô׬汥€à‘?„§!Y€sùùˆÑiŽ?9lx̸±‘ïgrÓdÌõ±ïÝh'¼Cï‹kòÃøñ’ÑcâÕ5üðBøBç$OÐ €Îrø &?|ÓìÏ}©ÍÓ-þÿÿìÝ{T”uðçy~¿wÔ¸¨uÚkÝÓV𑹶[í’uÌÓîV[î±Ë榦¢&¢å=ÍKë5¯ešnšš"ƒÀ(Ì^R@QÜA@”Ô²£±¿wX OgWxyÅçœÏ™óÎ;ïüüþó~ŸŸãœ‘cÌÎãš[ÆX&e8Ð׈«k À*D˜Å¡YBÚß¿¡ãÃ1þnR:ÄÕS§8:uÜòàƒ›[4_'ÄZ6!#× °«M7ÐJÀuH‘R†jÚ¬‡;L3mžFÁ€1f„ÅŸõ&é¡wb8Ê5¨Þ‚ªma=Q¤ND„HùE«–ëÚµÝØ¶ý~¿ WÙïoY¿H¿ûì÷´³h+¥P›wµ‘_) šÔâ´Z. Z?DÈy-[}`Ú<‚cÌŸÌü»€ñ× ŠŒ@ˆt³_µ¡@¸À«f÷ô°ûúDûúlôõµûúFúúFüÌ'ÜÇ'ÜÛ{½·W„¦vÓ´Aàúy)% !AßÚ­#E´^Чšv sº9ó4 Œ1#ÌžÑS®À± o‡oJ€C#‡EFi®‰pM†iÒ¦üDF¨G©wh„D‡D§z˵‹¨§›íªmÂIÄÚ-Òäðô=SÌ™§Qð`ŒaöÌ×ôÂ…P[6!ÄÔ‰` ꯪý²SSˆh!6 %(Nàæ’¶R›T«ª2ÕßଵN¬€ÍˆQªmDÛ£.ÑäˆÝ)Í™§Qð`Œá“Y¯ ã.ÜíÛQ¢^¬×Q5Oú5¥¬®‰«)P÷ñ–„ß([ÝǛɽèWÖZG½ŠN (@uM’êewáÿT¸fËÓ(x0ÆŒ°ì‹ÞˆAVaSE)(`À77P'\ñàîåZ6×EõòÖ×AØ&ܧV“”Jè$\àå|èÀ sæi<cFp%LÕäPÂUV‘$p  0ázzÕ&ÖA]L[¶Ü`+`üë ¸$©;¢jjUî;-"VˆYmü†——6gžFÁ€1fMëïaùZ’*Ĉ;n"éZ7;ÿ“ä!Ü!!ÅݹÉ{TázX¢F>Úy”™ócÌ ]?×¢-‘â„]ˆ)ˆ;u¢?ÕÕœ©Ý¤Éÿ½F] ©ª:oê~ûõR$ì°“ôõÓÕO»ÐF¼Þ{‘™ócÌ sæ¼,µ(ÂL d @‰€»ö!ì×Û“ÔÓ=uI»‰:.VKé{mLLÜK"YÊå}–,™næ<ÆãÀ3Èñc}­Í ¹–0Cõ `*è¾ï¹Z¸jk¼ËÝ¡é·!ôMýn÷Ÿ’AÂE4ç¾ûúíIlæ<ÆãÀ3Nç.-Ð(á(è‚Ú}ã>·Ìú‚)`?©Åá°ZYÊ8Ä{ô¨ã —fËc0Œ1ãØB?°h“5Ú à(AÁñšNR[cÕY‡ô¾U‡H_ÿÂaI;—yy}ùïÙæÏc0Œ1Cuê4qÆ]žjGLpÂ*O"‘tà$ê-™Uð°&²R¬Z$á耀‰%…uÿŒfËc$Œ1CÅ8ÇZ­}–KÚi¡“"‘ â(@BÂñz€G%í—r“ ™­ïî»xñMrÇlyŒÄ€1f´ÀAý¤6ÁÓ#ñ(Aá Afåœ"8y«ð„ÚÅKKŠ”_ ÙïÕžcJ‹ûßFy À1f´â¢ÁuœªÉÏ5Ü-±P`hÙ ™G”+°Fž[þUyWåÖ¢ž¸_½ö]tÊb9¸pr§ÇGF;áëöfËcŒ±F¹÷õÖ­û[µùrI‘Kâ´Únƒ51! Ÿ @@¡„R eÊ JŠ òQÿd&Ï} ÎœC8j‹9ˆ¹R¨cÕà',kÿò{àí™s—ߎyŒÁ€1Ö82Òzùø Õh©§5EÓrAíµ ¥T½b1b[¾þeîóeµ”Vž,QÈý.µû¶h…ˆ8ÑÏoФi_œ©¼Mó€c¬ÑìÏx«M›Ñ‚f{È­:¦‘*Íoݪϕ(‘§£ Óîz-ÿ™~A‘~Î 8¯öæžÚ~+G´{ ×„?-/p[çih<c)'ûÝçºÍÕÄ$ 6O‘*¨é ¢*Üó€.¸QŠ •#U UºËQ”UU’(¶ˆ«H–´TÈþþ]ƒ¦Ïý??g7[žÅ€1Öø¦LšÝÂ¬Ñ ¤X‹Ç^AG‹$]$¼DtáÁ·jO-à{—$ü ãY‹¬"8ç¡åY­IˆK‘Æù´ðâ+ãíŽ[m[³åi <c¦uè7_ï#-£‘¦!~éioæqH£|‚A•8k…*+\°ÂE •Xо^Kºw;Ù- íw“c¶]t%^LpMÚQžTàJÎw%¹’Ê\‰®¤RWRÉu“J·—&&–&$WmOº2}Fñ³ÛŸHõØi•<îÿ¿Ía³åa¬)1Ûýe¶<0ÑHÛݳYóøz/èöÌ©®é°ì«Òè͹ÑÎ|gLA´óDLÜIGÌ GÌ)‡³Èá(q8óμÄF—9q[òìÎ|»ã»·ÞJ x*í™.YIÖä˜?¿Øó6ÍÃXSb¶ûËlyŒa–s¬O[¿±¾ÞŸt~lçþŸì²»OßÌ5!kÃŽ„†¯%'4ìT¨-?ÔVjË µºAžm]©Í–k[84ü`ÈúÂyó+Ÿx,¾KÇãOúç´o·QÓ‚‚‡ÿò¿É˜-cM‰Ùî/³å1ÌÿÿìÝ pUðïûÞëîBBI”D"‚,«.à²ë‚¸Z®U"ºJ! ‚`§AH¸$r†;¹’’˜“+!á `Â}+µnÕVíë‰h$¡Ö˜yi_Õ¯¦zzzÞüë{õÕW=•C–ð箓4mZëV™mvw츯}‡„IS*W¯¾´vÍ™U«Ž›Â9N¬ZUaZYñãAm+O­Zu2<üHxøuN-\|£Ûs…Û—wìpäÉvÅ~¯e¼_rRpýÊ£(V"[É–Çi¤‘# m„oÓˆ€Ç‹¶jSÐvë¬9—ÂæW,^pbaØñ°; +w8ZKyØÂƒ ÃŽ-úìÄ’å‹÷ÙÅ—ÿ±»mÛü–™m [µÌöòkÝjìÕKwòåQ+‘­¿dËãLR ?¿‘ö-Û$ù7Ïò{do‹–ÅO´KüdâéЩe³CL9r趲С¡%¡¡ûCCKëR2£hzHéÌ©å3§žr($äË—_)hÑz»«Øf-³k¹ÇÏ'Áà£Ãæ¿Y_ò(Š•ÈÖ_²åq&׀ϗô'íÝ$öaÿ´‡üwú5Íò÷Kh•0,¨bÂøC“>Ù7>xppi %·‰ãµ”/›P<îã¢1ãK> ®|¾{‘Ó¤¦Mw=ì—ÕÔO|D¦‡ÛJŸ&ãêEE±ÙúK¶ÛÇ7µ±oJŸ4ït_Ÿdß&›úô. Ü”T0$¨°.EC‚Šï4d÷Àýâàƒa9 Ë~?° phE›VñÞã}¼3ÄúM|R||R›úÆrµaÝòçQ+‘­¿dËãd.;&júw÷¥ Ý4Šuswo˜àáÓØsÓsÉêûvqß¾»Þy'¯nýóëRЯq¿w ú½›Ý÷½ì>ý ßxó@ãÆ¼ÅŠ•Ý<¢Ý<¶5tso°Å®O{î¯wþÇNÙò(Š•ÈÖ_²åq>€™Ó_Õµ±nn뙣ۣtÛ6›m7¢Üìùn|å•¢×^ËëÙ3»gÏ]¿š¸X¼%çÕ^»^í%‹Ÿî”a·­Õ´Í6[”Í¡7ˆÐŶÅÐæFÿ³•CeΣ(V"[É–Çù\<þÐîSC›¸† €#6 7.}¬uBŠþþ®ÏgöèžùB¿F÷îY/¾˜Û­[f·î9]ºæÚ„­%Œ$ˆDZ ,\| §(‚ņ6fåòÁ2çQ+‘­¿dËã|®—/ŒÔØ`ƒ-ˆ@Ú‚¸ÅlD½mäÚºvísºtÎz¶sf—NžIïü§5¤ÕéÙ.™;íìÚ5ÿégòÜ="VÛL´ J|РHÎâ™Ø ßëõ ÒæQ+‘­¿dËã®) Üôñ Vr ´qCõlÜÂX”nÄhzäcÆ·o»½ã“éâ±C»´¶×©ÝÉÚg´i³£¡ÛfÆ6ÛÊx â6qb­ÜŒËùM›Ó¶Ý ió(Š•ÈÖ_²åq W€¥‹ûŒµ™5ŠFæýW$ŠêÃ6¢X‹ˆä|y“Æ››?’ðˆÜ£Íâo‹{´ylšÅ6ó‹óõŽÒµuœ‰a.û6€(€XI$'qs·P¬Éøg›Œ‘6¢X‰lý%[—påø×ì2˜Èq£$À„X‡¸Ûâ«D3Œ1´8»-ÎË3ÉË3ÁË+ÎË+ÖË+ægžÑžžÑmk䣉éJñ ãé祄D„TsÔm&–(nÊ-ÒøÈCe3åÌ£(V"[É–Ç%\9æÎzClÃH†©`ŽÇ»b¬Q²Î5§±hGi|«yð#¹YÓŽÉSÄ[~¹ˆxš'ªM,•0ŽÑ¸ï49ó(Š•ÈÖ_²åq —€Ù¯›[d¤#l¯Aš¯Šù™Â(…±$ÆKd”ÆpG5NŒÄAº¨2¡(®ùF€”ë¤2ؘ(ª”L”E˜Äp™ÆGï.š,gE±ÙúK¶<.áÒ¯€æôb8Þ±»v¡(Yè;ˆ²f“yAõ&‰kÒª ê8ΨF¸S@Ètï ÇR`^Ycñ*¦%ŠkòÄ>96`ÔO [E±ÙúK¶<.áʰryÄÛ* Ǩ `g-âd@.@68ö©†uû”Y{„,æØcÀ4±§=„)„a£Žš%gE±ÙúK¶<.áÊ›¢ñá„ë –Ç°00çNf鿨ƒ¸˜22jÉÌ®½B.ƒ<1ÉÅΉÍ.ÔY*csü›}xírœyÅJdë/Ùò¸„‹XÓÙôœD  î"ï—îvþ'ùµ!,àPäØƒ|„½blz"ÀØ'Ÿ'sE±ÙúK¶<ÎçâЩË|][Æ™¸E*F,B,4A‘ùÔT}¦feó¼F\ {D)kÙãxûŠ83($sýýâŒÝǴѽû/‘9¢X‰lý%[çsñ˜7ïuÀQ\K$,Ê–$n¯v@8hVóÄÓ½uÙwu\,–2g/æ–Ëç|µÍöÞ²e3eΣ(V"[É–Çù\<*N 01¾‰°TÔp˜_Æí½½bT;jºÿ!ì#sÈïv|J)±\¢y~~÷î™*sE±ÙúK¶<ÎçúóÔ3Ÿ…i$n”Žé0ˆiŒÊî„2I,åbeÎÓ?yé¥:~K¶<Šb%²õ—lyœÌõ`ë–1º6U£xÇNTT×HŒJQ¯ãGÌ]¹WGÈ\ÿB9§•#ÂWÍ•?¢X‰lý%['sý:t˜8ËÝ^*&$ÁiƒŸA:¬è(À4«vü>ÀrD(2´XÂà¿ýmò¥óuÿK6Ùò(Š•ÈÖ_²åq&)Àö” cÀjN…:Ñè<â1`eÀÄYÂ)„Šûq:Èy:£ÙÞ>–.½ëŸà-¢X‰lý%[g’bCrm’ÝØÎQÜ(] < ü0ðã@•_œ¹WxZLu®q¾–ñ½Þùâ z”GQ¬D¶þ’-ÓÈ2.^z¼}ˆÆ?×p7Çó Ïv´ àUD• «U9œ½­ê¶ÊÄÓsŽWù.úR×&NíðDZI)ÿçÇoeË£(V"[É–ÇidBYIooïA†¶@§\Î*‰]ãŒJDqVEp–àƒó.s¸ÊàÁe„ ç΢y§Vå8g¾F¸‚bäâ)ÄJÎıØÑÓ:¤lz³ýfÏ_]ó(Š•ÈÖ_²åq‰€Pºï-OÏá­°EšV b–jׄk ÊÏ9œ5áªãüÕ®^¼xI Ç»Ä4ֵÌ¥1œÜ¬Ù)3–߸XOó(Š•ÈÖ_²åq¹€p°ômÿ`FsmK¾µaÝÀ/r?UyÅ’dë/ÙòÜ‹ÿÿÿìÝ TÕUðß]þï=DvpÄR“L3*Gm™Ì:M3š9S3)6*`¹ jT¹5.˜¥{ˆì;ﲇóÿ»|Ͻçw¾ç¯C¦jíÝõ»™nÛ­Ì—WyIdÅo¼c/Œ<%êIȲQ#ý–.}/$håÿaAÞæ‹·*_ø†ÖÍ-~ü¸Ï-‡ïUR?[«õK—ü©îâ›ÿyANx›/ÞòÜ]\@Bü¦qãÖüŽ½Ý¾'~³bù¹¨ðk5Õ½×®õö\ûW×ooþ£÷æß{;{z¯ÝìmnéÍʼ¶Å¿òùÙ©>¤ ëUŠåK¯nmzK®yANx›/ÞòÜ œ@s£§ÇBOöegµû™_ä{,*‹J¼~©ýŸm7n^nkon½ÞÙñMgÛ7í­ooý²½½¼ÙÖr£½õëî®o +¾ñû zίs]'%“üìÞŽŠX%³<‚ '¼Íoyî  ¨ð•Ñã|ÍÍ·>29{îK5ïn,.Ò}[[×[]óUMÃõZ¦þ«ººÔÕýÍàë:ö²Ÿ††/Ùwm™?/÷ÅÙ5#íO*¥õ^Ë6É& È oóÅ[ž{Š»ˆ]if±ØÚzç¬gËf?Ÿ¿aC­.¯·¼ä_%%_•”v—v—^-.é).¾Q\ò…þâÇJJºÏUtí))ÿöè±/_þuÅìg+§NIT*VÏýÕ«2È#rÂÛ|ñ–ç^ã«¢£¼ þåÙî—ÝÝŠÿðÇܤŒ¯µg¾ÎÖ^ÏÉëÎÎiÑæ6ksÛ´9]Ú3=ÚœNmNÇmÎätžÉì$²u÷žk?’5urýt׆qcâ%iŪÕÿùïdxË#rÂÛ|ñ–Çhx)€'Ÿò“¤Ÿî2¡ÐÕµxò”x¿÷é8vôò¡C5z‡/.jª×;XÿÝÅ@ª;|øÂáÃåǃöîûbæ3ù®“«\§\xxRãÈc„.T'ú ­<‚ '¼ÍoyŒ†‹ ^¡”VŒìò`‹Kåø y.÷íèÜU¿oOíÞÀšÀÛUVTP¸·roàÅw×~²§êã½Õ;w·¿øË‰sǺ¤»LÌ?6ËÆ2ðñëº:îØÃ¼å9ám¾xËcL\€£ãJK³=c'$:Ép}öþ±MJxgÓ¥€ÍÛÊ?ô¯ ð?wKE€y@@i@@I@@Ù`Jý·è>ô/Ûº¹jëæó[üÏùû_yñ¥¼ûHrã<6cÜØ"G‡x%]¸ë·C% È oóÅ[c2}|ú‰ÆkìíbF:¥üÌé´ã¨ 'ÇS.ããßò®ßè{Îïb_ŸŸ²~Joa×åTøøœgßZ¿±`ýÝZßÒ?ù4>ë®s•8jTæHÇŒQŽìG¤[št°[?$ò‚œð6_¼å12Ó€‹Ëj•Ùv‡ɶ#4v)ö§F8¨GØüýkÞžg½½³½½ó¼¼ó£óò.¸W¡—g »XöVö²·²þè™ç¹¼~Âø8{Û8û4¶¾ƒÆÁ!yÔˆŠW_ÆAÞæ‹·~; : ò±~ýöŽ™*–Hk^óø„ç<‚ '¼ÍoyŒÏİsç+€VQ)£ À¹@²³Ç«B€r•úÝD9ìåÙÁßÁ 7³¥ôÝ‹ré•b’Ké•jÑ[yÎ#rÂÛ|ñ–ÇøL\õµ‹•ü =‰QÛ@E ÿø³·€UeaOK~"ÅX_ò…†ŸR†‰㎎ož-ÚÌsAÞæ‹·<Ægú_óØÔ÷0”0{Pºzçµ1*7¨¸[T¨Älq¨b+Sš‚Ð;/¼0È?Àâ- È oóÅ[#3}„‡­UH›%Gà"† õ}{˜U%Û¯€ úSù©.`ýúµª(ÎÃè ¥åŠÃ‡>â? È oóÅ[#3}0S¦lGh›…YkH —”ô2Â瀔®¸Œô»Vs *‰Ô!Ð)¥Œ|ÜÜÞíhüW²ñ–Gä„·ùâ-1qQIš Jåb€#ç+ðe ·"tHöDÖ„ Aý]€.R\Ié)‚·Û;,Þ¿ÿŽÿ Þò‚œð6_¼å1&. €ñôz“J~fÊ$ŠØƒRF—€žZ¸Ã —*t‰µ:Uè(=Fè›óæûv¶/ByANx›/Þò /ÐÞæýàd‰~*¡BŠZ j©¤z M7Ô§É ù–¦[ûa/[ ßýñ§ð…â< x@›§<º.Qóþù-oyANx›/Þò /ÀT”¾fo¿D)íQ`-%˜\eõ ÊF„ØSX†f -Z)tRè"СA‚VÍHÿ¤Öd¸`ïÜ@p±ÊE 5R®ى^R@²’|è|ÿÂí»Ž Å<‚ '¼ÍoyŒƒ£`ÊŠ_µ¶~[Â1Sê$©X—J=L7°íFíµ4ë¿B—áý®~ºõº ¨ƒÁ†O±6VHç I!è]gg¯÷·|öEçÍ#rÂÛ|ñ–Çø*¦²ìu''‚?RÑt®•0ÛÄ¿Üôà. ­@šôp૆íîþþ†6ýûpÀ—¬«Í¤JLŽZ3æþWý>îîZ:¤ó‚œð6_¼å¹×þ ÿÿìÝ TÔÕð»üÿ3Ⱦ¤¨•¨d˜RZ–ˆ¦󥙯UI-Q-%+…D-HÓRsAömXfØef`M‰­TE%”—–wgH#Áóz©Ìåï=çsæügæÏå{î=¿ó=ƒŠÔQWóþ$—m<þ”‘¸£fˆ~‚ÀÏ^èŠÎe€[ .BÔ Q›îñ"Äj¨ á&®c‡¾ÁÜBG'€mÿðçn´åa!¡m¾hËs_ÑX6|úy?±'6A”"’”bT a#‡®"x ¡\Cà?¤c1øƒkøM{ /‰¸v.Kø³b±Âo Zkf¹hÚL_©ìnwŸ¶< #$´Ímyîz €¨:9ïí7çs"oˆ6B¸ß@œc(9É£zš1jKbÐ.WÄà*ÚDð¼åñ)±ö÷í†ÐÇÈdÞSNK?^ ñܽùW´åa!¡m¾hËs?P]ª¿_àî¾ÜÊjÏy!¸£±\ħp(ƒ‡Y<ÌÑBiŠDð¶ŠÑ* ³÷Æ_ä[Vvï×myFHh›/ÚòÜ[} n 9ì±bù‡‘Ö6sÜrˆ=^…ðä‘7XÑÏdá{ω/ùyyíRåy·žw{Ðò0ŒÐ6_´å¹'úRtUVê¯ÈõNOõL–-KKñPäx—j6´ž_Êò0ŒðÐ6_´åùÇúj0 Ã0w‰Ã0̪O@ÃY·ØXÃÜv¾½+èàCïå)>ayFh›/ÚòÜ>SuU󃶽5Ñy³©Ñ¢~’%<^Ì¡å-Eh ‚n<ç†ñâý×-ZôIXðŠ0à móE[ž{¥ÀáàÅNNkEüB#îÓA{žsŒšñRô:_õ–Å;vk¶U¶ñóò¹ï*œ†Ú6é$æÖY˜z-ZøAÍ÷ï=yFHh›/ÚòÜ[T@b‚¯ÝjŒ>²²Üùì3qKOÄD¶UUv´µu´¶ý~áòökí¿v´´v´µwÔ7täd·mô;>uJúc‹8/‰héÂ+Ï]&Ô< #$´ÍmyîJ  þŒ›ë\7ò!ËÒtû„ \ç—Å$]ú¡é·ÆËí?66ÕŸ»ÔÒ|½¥ñzÓ¹_›ÎýÜÔHž¶76\n:wõâ…ëE××m¨œñŠÊÑ!É÷³¶\å)°< #$´Ímyî  ¸èµAv>FF£GæÎœ^õñÚ’bõꚎʪ+Uu—ª‰Ú+55×jj~ѹZCžvQW÷3y÷Û ³g©¦M©êo*æ½–,öL†Úæ‹¶<÷u •®00^`f¶uò¤²)S Ö¬©Vçw”k~×h®hJ/–”6—”ž/Ñ´–”\.Ñü¤½ø+æâ‰Š‹ÅÇZ5å7üùÕW*¦L:>fT’X´ræ¿Þ@†Úæ‹¶<÷]ãŽÑ[æ&{¦¸üèâ\2ï}UrÖUEÞÕ\Å%eþÅ\eƒBU¯P5*”y­ e‹BÙ|›³^ ¦6à móE[½ÐgÈÖ‰|0ØËq10¸óˆ0ã(‘8–…Ù=?rD²ãiäq”CjÉ=rx\6jdÆðáéýŒÂ1E8s±Fc %% Ð!Ã!Šã¸žß2Âa#µyFHh›/Úòè…> `÷NWVK´{¹¨ýüÉîƒh„â´p,a÷µ¥EøÃƒ ”>28þ&é#Çõ`pÜ`[©U”ˆ?ÄaRæ¤Ø£ˆ ƒ$DGäÃ]8€dý0Ìm·°üÚ< #$´ÍmyôBŸðÅæcàËÁPŒ’Œ… NGzS|'b0ŒóR‰ÔÜ,ÉÜ,ÁÜ\jngnû'³3³SÓhS“Xž´+ŠÇ0ý¹‘A Úª(áDò¡ £/ynʼnŠ:ó0ŒÐ6_´åÑ }Àç›f“À0 à­Ç;Â@Æ#™ˆKä±”Ç1<Ås‘Ú‹[¸XòÈi÷4–ƒ2ÊÉ—üuò4 @)Ù}€bNAPŠÑ.ž[©9¶Î< #$´ÍmyôB¯°ù5í€ 2Hƒ ¹Gd@í»¤?åÉ1NÂ8ãDŒR1LïÄ¡ ŒÈEÙeÉæj¿y—uR0H‡0‘ì>@2„²LÂpÏ­*RLg†Úæ‹¶Ôº3PApŒ€D”Àê'žò¢9à móE[žÞ§çp·MÄïá0ùˆT¡Â- Ö>Õê|¥ëΪþ¸‡Ü ŠÉVvS¬ûòÛ! æ@!H»¾†¼b ‘b~Õ›®»hÎÃ0BBÛ|Ñ–§÷é¹¶n} @OŽOD° À¹‘WE”Cp\»›P yz¬'%wÐÃÍd)m÷B€jKVqÜ·Éü={hÎÃ0BBÛ|Ñ–§÷é¹j«ˆ Ý1Š`Ù‹ö‡qÇn©ÊBÝžjî%H[òEºïR†°¡­¶¶ï+^Os†Úæ‹¶<½ï¿ÿÿìÝPT×ðSîÝËŠô5V4$jÐÄ$ˆFã‹Æøbb/QK°`[ŒÔ˜¨Ø‘^¤ˆJè jè*HSé JÔÄŒ>ÞY|¾%“"ÈaýÏüæÎÙv÷›»sîwïîÎnëÿ!L¿kq ;QºŠ.#ÖÆ8£QfsÁ(“¢,ÂVŽ²Ùš!ãU#G6ñ,Þò Lx›_¼åyÉZ¿¼½–ÊÄu" ¢è*A…<ÞFˆ°ªdÛ+¡+ŠWåE]!Šõça”-$‚÷««ÛºØÊ” oó‹·ecŸ–º¾öæ<È€òám~ñ–çk«àAÀ+ªM@i±•¿¿íÑCV{\&îqà~dV|ÜÈK›)€Âܮۿb±ECuN{k‘ÎÈJæbM°•(XQ:·cÇ9sÖxº/|óÀßÕ à¨û\só2q¶ª°¶“öwïšùŒéë¸2ùëwîMÝñmúÆ­S¦ÅYX÷è~T½½«$8jkØÍ™ýUþÕY¯Bøg¸.€“Á+»w_FÉ*]Ýï¼`;ï’Ÿw]nNC]]Cmݪï<ªÐPÿKCUmC]}CIiCLtÝF§¬ÃÏôîí.ìTdófÏ\\V<_YóÀ‹à´JЬ¦N±È¼nêŒt¿Û×*~-¿S½¼¢¤ìvUåêò‡e¿T”Ý­(gëËKïT”ݯ©~x!ó¡ãúœ1'š‡´ôtøù,R²<ðâx,€‹>íÔÝAUuS_“ر£sW¯H¹˜ü(/¿!'÷^náí<¦à^~þƒüüŸÝÏgŸRXx—ÝzðPéøq‰£†çvÐ=.‰vÖsW*MhÜ@`àB¹ÚLMÍmƦqnùò¼ä¤†ŒÔÿ¤¦ÞKM«II«LI»™’Z›’r'%õ–bð{©©5—2k.þX›šñèÐở|œ9|hÖÓI¶xì¿&(Ah.|€¿Ÿ %_h©7Üòº¥EÊô/ãîÇÅß»T›P—X—X—P_—P—PùŒø„ªøèªøøªØÄúè„G›6W ±ˆfqѬO˜$,}Ëìïwó–šGra|;ÕÉZ.–ïÝ0+ÇÒ"vÿáª3E!a%aá¥!a×Â#®‡†_ ¿VZVVüœÒS!Õ¡¡¥g‹ÃJCž4)ÙâÝ”÷äö{#Q>5¾æ€æÅKæÍèÔy¹–Æ7ýúžëovyà€ 3ffzxÖ÷Éñò)xJ¡—Ï /ï/ïR/ï"/ïÏ)ö>Qåí]äí›íåwÙÓ·lÇκþ}c˜ 4+ìÞ%Xm-þóÏ`yËÍŽ—xw°£(®ïÙ#Ò¨×3³Ó`ǵEV>týÀ\·«ƒ¼ öüoð¼ý…仹]qsË8â^èºûÖΙ™d›™^yÓø¼A‡ÃT˜bß¶ò@³ã¢<=l%ÑV¿£‡QïóFFY=z%õñÞüu¥Ëö‚Ý;ó\]r]ž•ãâ’Ý(ç9Ù.®Y®.WwíÈÛ³3{—kζ£>ºÐ§Ob7£H£>çzt‹ÑRwéÙcYuåwó–Z``°P]¾³[¯Ã.Q~ìÚíüÆ'W­¼æ¼.s‹sƧ,g§KOd:;e8;§9;§:;§7%Íicò§ôMë²7­»¼Ñé’“ÓQ£“ºö 7ìй[T÷n ô‚%a‰ËöÏÚJh ­_ßî™JÈ]€†¯þ`Ð1ÊÐà´Qàù6+.9®Jq°Oµ·OJÚlœñœL{ûËì&»çí–'/uHûʾh¨e²aÇŽ£;Du4`O©®º_OÇ®Mä€Òú`d´XE¾EOÿ”¶~˜Ž^„žîi}½P}ã?Ï´±úÑÆ&ÖÆ&ÉÚæ\S’­mÎ?Ëú‚µU*Ì;w~Ì—VIVó zõÒÕÒÓ=ËÖ¯£¦§wª£~€@¹™Ëh!­\gϬe3ÕÔö¶W;ÙN#@U-H­}°ºš¿¶æñÞ‹š<éüäÉÑÓ¦%4mjbS’¦L=?eZÒ”é1“gÄLœznügÚÚîZlͪê~ªê¾íÕÕÚyÉeë?xÿÙìä-´œV.€MÆÈÄeªªG©è/“ûÈT|U$?¹ä£*÷xMÿØèÑÉŸ|’0vlÌØ±Ñ»3{Hì˜qÑcƱåùþægå*‡Eñ„ŠŠŠÜCÖÎCÆ¢—$n“¤©%EóxÎ-§•  ¯ñI܈ñ!A FøÂg(vGxo÷žÁÃ>Lþaô°¡‘Ã,#?öÃ_ai5bDÜ!‘C,c Ž“·s#ä0ÁžybrQ7ö,ñ!h·$.Ýÿýžó@Ëiͨ*_(Ò9Ý‹&^Ãl€N0lÿHÉ1Aó@‹ú/ÿÿìÝ{TUUðßoï}î5ÔÔVùhù(5ÍÈ›©&´–¹¬©¦\cÑI E DËW¦©ÏQ²Ìw:æ€iŒr/à#… ‚¼UÞ¨¼ß¢¤–-Ùç’Š®¦àÊæú[ë³îÚçÜs6ßµÿøý6—˽ÍÙV,) .ÇC@ßß“ÆL±Wãߥ‰šÐ׉ÝòQè5t·@“@³¼åÆIäá>À@Ymíb<„a gk41-áØ"5óBˆM5kXöº^pÁŸÃ€}Á·ÄàêÏÊý²™33çAœïá|/g¡÷×ìgr°OVU†²˜ê7˜ëÍÂa?â^Ym™;Ä0ˆãZML™¯fB±©f} hùkg[ îa€Ã( ¢^Xo"ËhÓ/¨+ÊòšÐºj¨Ãð; á u¼ŸY§ýÊzóÈgÑ l/ ¼&RÖekÁõ¼^pUËC!6Õœ `ý—c=Œ<@JÎb|×€<`k]®gÿ­Èº|°á<‡¸µ¦†ÊÙ‹chfèëääyòøR5óBˆM5g°„{iÂáV#äxÐ~3½ÔFÜ‚¼˜v ƒ€a çA°pˆ”;wDY©eq6ðΗwé6­²l²šy!Ħšù?5ÍÕÁð/ÁdAŒF‚<ãèȵéoŒY£rB±fn+W¾è)´½ S€E ŒªWOŒ‡Çn%þ6nq±œJßkc` `"ãQBlrp»ví•óBˆí4sÈÉgl5™‹¯&É:ú‹ïÇ®\¹5>j­¡ „ÏôM}¬õ§$1naleçÎãÅ-T9!„ØNó!ÌÀA3櫱„ йûÆd«”¦‚Â!•ÉÉ!MÎ,D(âGÇßâ —ªå!„iþàÿA[¨±ÿpÈ`Ë §®&“[cY3NêU¸±N2}þ,„4ÁŽ0\ïää±qà õóBˆ4 X†¸ôÇ$¹#fpÊ(N#;< X:ÀiÔ«dfÀ4g#ĵoÎrq™_Ztë¯`T-!„Ø‚ Ø<Çh°I°h;­±"Ä à)À3òrršf–*Ä>Ζuì4î‹/nû‘;ªå!„[P¢Hn“Æ mž£1X`ƒb†§@œ‘ ,Á§ OÉ]¼0ı…‹ñ¯œ]VâÚ‚òBH“S¥”OîÓßKŸk+°ˆc!hÙ å€Èg,c|«‚kò¯É«GZŸ½ñ.vÆ`8¸pá€Çg™åíöªå!„&§JRßèØÑÕ¨ù˜Eð<ÆËåvŒyˆùù r(P& ‚C%ƒ2„b„"„Ô_™É·ä™óå(·Ø˜‹˜'¸Ë ~Ê!FþI·î£—­ÚÔóBHÓR¨HIñ£Úµsר:GcŒ¦åÜ;kUR%ÈòŠ%ˆ…Vú#TXÏWÔS XXX*1ë]r÷mÐNpÊq~·n“,þòl•[ ÍC!MH­ ¥&½Ý¥Ë,ÎV8ˆƒ–¥1Y4¿·ª< ¬xð|+Vn-¯•ÿ£_P¬Ÿ‡s.Ƚ¹£–ÊøW€Óì>jž÷§•ZtBi*Ê5)7ûÝç†®ÒøŽ<޳RdgeÁ½x ØE«óÀËPb•ȪU[+‘W«VÍx‰çy”`ë¸puì±dÕï|]µ<„Ò$Tlu-XÑÆè©±¥ÈB ‰œ¥# v‰áeÆ®"\fð½ÜSsø‘Ãe?écpÿ¼ >Þ±mê]˜G5ª­å¡<ö”§©´€°uÛÄÁƒ?4h®­Å‚®÷®}Êyç+ÿ™77f¹OœÏ «?OZ¼"yô?,..{zõÜêÔÆÏ(æÝÛvæ×÷³3Æß yT£ÚúPÊcOyš–Ò `ïž¹={Îà죎>ûÓ¾õ˜r|W@ufzmuumUõÏç¯Ö\®­ù±¶¬ª¶º¦¶ °6ìpõb¯Ô†íïÓg›AÌt0Lq7­(ÿ={Í£ÕÖ‡òP{Êc Š6€‚<·1£Ýä/YÚ®~öÏÑcÆ&í :wªä§âó5§‹K ŠÎ••^)+¾RRôcIÑ…’byXS\x¾¤èReŕؔ+ó¥¿òr”s¿ VšW§î»vzÚYÕ¨¶>”‡òØSÛQ±Äž޵çìÖ­—<Ö?üÕ—2çs5+»6=óbfî¹,)çbvöåìì¬.eËÃzrs/Èg7m.ùZÔˆa™÷wüڨ͜4q®ÝäQjëCy(=å±)å@`àTÇ{Ƶk·òùç’†½=gNVÌ‘Ú䄟.&$VÆ'–Æ'–Ç'TÅÇŸO8«n”Py<¥2îXUBòÕÍ[.üõå”aÏ¥d4L{õ/£ì jT[ÊCyì)­©ÕvïšÌÙ›íÖzz¨Kü;ïFºd‰¸n9y¤2<²ÐU`‰*¶DVX"ª,‘e–ÈÒ›DD–E.‹ˆ( ª9yuÉÒ’!.‡Ÿw‰sîk6Šwþm}Xµ<ªQm}(å±§vd«ÖoßÖwè3g?ž>Ô%|ý–² ýyAæspaùTpèiSð)Sð“¹Ød*5™ Læü C‚*L¦ÂÐùæ‚@Óo¿ãòTü3ƒ2>¥‰Ù/ŽÙBó¨Fµõ¡<”Çžòܪ4€Ü¬±]»ÍißöŸ‹~ÂùÄ“ƒbÇŽKÙ¾£êëéþ;sêÉõßyÆ? À? Ð? Ï?àLùÿ. È ø&Í׉ß­ö©~â±°AýsžtÎíùàMóðœöë“Q-jT[ÊCyì)Ï£Jxêéyš¶è¡^{?ëìßÀžy ò6m*ݲùô† ™ºÖAÖ† 9ºõ9¿ ZŸ»aCöÆ'7nLþj[®ßgg‡<íÜ?ÍyÀÉGûí|ÿ.F›‚fµ¬<ªQm}(å±§”‡òØSž;é¿ÿÿìypTEÇ¿_÷{o†äV@ÔÅ]u=.»¢R[Vè®,Bá  ‚œ*ç‚€"—ÈB!7 9Ée g¸åÆ™Á£d«\¶ßdÁ¡Ö’0ÓytÕ§^õ¼y¯çSßþã[=5‡ë àÓ…AD£ü|ãïo–~_³ÍM›ä4kšÑò‘¤¡!ÇÇÝ?á½cÃw…‡—Öb÷uÄxÏ-ì ? ž Wönñè±»ß /{¡Sq³&›4ɽ¿iN“¦â%²=Ý–ùû†5Ù-å£|¬äãd\_-[Ž´Ùgú¤ù¤úú§ûûeø§ø®íÙcoHðŽü-ƒC¶ÖEñà’›¼mpð.144Ðм·ƒ·9þè#‰~>‰þ~Yb~_ÿTÿ´&ñœB#V ’ßG6dËGù(+ù8@VæxMïçá±ÈÝ#¹Qãx7D÷$O8¯µÏÿ%§×›%½zåöéSX7AEu±¥wPIï>[z¿•׫o^Ï ­¯ÿcO„wãx1³›g¬›çwFëìúÔçÿzó?ôÊæ#²å£|”•|œ‹ `ú‡]umŒ›Ûj¦ÅéöݶÁfÄÚ7{ä}k^y¥øÕW »uËëÖ-÷W#.·äwížÛµ»8–<˜e·­Ô´h›-ÆfÔEêb ­3´9†tºlˆÌ>²![>ÊGùXÉÇù¸¸þØj’¡MC\Á$À5€‘k #µø}Rç‹_z1·ó Ù;e¿Øyó¯¡S§œ—_.èØ1»c§üví ì–­$Œ"ˆBZ l¹xN1ŸÚèeKÊì#²å£|”•|œ+ àÂÙh°E‘Hë× @´@äÅh ×Vµjß®mÎsm³Ûf>“ÑöÙÌZ¤×Ésí²Ûnnß¾èég =<#>#M´ F¼Ð  (ΙX Ûýµi}dC¶|”ò±’Kpe¤&sÓÇ2XÆy,ÐĈšX¸Ž±݈Óô¨%¶~|Ó“Odˆc›V鵨T'­þÒ¦uÖ£fº»E3¶–ØzÆã70H% ´ 0)žóuš6ëñVÓ¤õ‘ ÙòQ>ÊÇJ>.Á•°è“ ‚163£Xä‘hî¿¢P¤ˆâMX@çK|}¢| éf 5O¼NÂCÆ×AóøæMübtmg¢ÌE±oˆˆg°‘Ää$6wÑ€bþ(Æ?òñ-­lÈ–òQ>Vòq ®,€Íü;ƒñ×2Ú‡ï á:‰5Ä2Œ3´»-ÁÛk£·W’·w‚·w¼·wÜÏxÅzyÅ6n¼¡±gœ&Ú•&ÒÏS ’Ò̪Š&–,6eŒ>Öøˆý{§Ëé#²å£|”•|\‚+ `öŒ×Å0Œb˜f=Þ)¥è+ú3•Q*cKb,™Q:ÃÌ8e1ƒ ‘2¡×¼ µÖÊÇJ>.Á¥oÍêÎp¬crrQd}"Ö<2/¨Y$qMzM ŽqV „›ÙŽq&9¦óÊZóˆg1(P\S(Öɱ¡7@6Ù-å£|¬äã\YË–!7Øz£b€€Í· Næäcj‘Yb²o!‡9Ö0]ÌÆi;a*á|OÏЃûgÈé#²å£|”•|\‚+   ÿ}#\m°B†%€€ù7cFÿEˆ‹)(ë²ón¡€A¡hrD±rb±·ê,±YÍš¬¼"§lÈ–òQ>Vòq .þ&°¦ °ék8‰€¶"n¹ …¿ävçoPtë$„[8;Ö a‡X›ž 0执Âdö‘ ÙòQ>ÊÇJ>ÎÇÅØn®®-æLl‘J‹·š@±ùФæLíd‹þw¸¶‹(oa»ãö›!(æPÂ`+™óïg춦ê´PfÙ-å£|¬äã|\\sæ¼ʵd½@EÀòÄöjÀ„}fšX ·¡Ž‹ÅTf÷b`1ànbEœn³õ]¼xºÌ>²![>ÊGùXÉÇù¸¸Žíg4 a|-a©Èp;˜oÆí¸¾¢*K™îºCv’YòÛ¯RJ¬€hNÓ¦ýwlŸ"³lÈ–òQ>Vòq>®ÿC˜§ž™D4_#±Q: &@´1îq°·¾@ØË`‰ÉᘙótÄ÷ºt©ãX²ùȆlù(åc%'ãúX¿n´®MÑ(‘Áa‚Çk2U)ò:pÐ\•;å ™óE8Äi á2OÏáË?›-¿lÈ–òQ>Vòq2®/A›63gxØKECœ4ø)¤ýÀJ¾8…fjGê<¤±cņOÞ¡ÃÄóuÿ%›l>²![>ÊGùXÉÇ™HQ›Rß5Œ~ŸsÚªÓ)*Û LìÈÊN ¯ð0§}œg0šéçßoÑ¢Ûþ‡l>²![>ÊGùXÉÇ™HQ‚àÁý¹6Ánlâ(6Jg O?üPÁW§î<)ZëÅœ¯d¼÷×Ç^87 ùȆlù(åc%§!Kœ;òXë÷5þ©†Û8V0<Ú1ÐŽ/'*cXC¹ƒÓ×)¿NY-ÄÃ3Žgy}¥ë“§´ùÓ˜©ÿçã·²ùȆlù(åc%§!Köîîáç7ÀÐæéTÀY±‹¢~Á(C»°r‚ÓgTp¸ÀáƒJ‚ g*N£¹S+w Ä™ËQT.ž@,ãLŒÅŠžÔ!Í`6¸÷̹Ÿ7DÙ-å£|¬äã$*AéÎ7¼¼†i´ÔnkZˆ.Õª• âÆsˆgœ6pÉqþR-*«/žã.ÑÆºv€±t†›7Vòqr€`_é›Íš…3šmãÙ:ÕH„ø­ƒ+€_]V¬Ü„Î]tÄ]ù3ægÍóð ƒïDWÛµ}ÄVŽzðá7&|ðqå¥ ÚG6dËGù(+ùÜm¤+Á‰co¿Ði®Æ&sXogÛGúQ,Àw€?}ïà2° ( J¤*¤jDZÙ% +@ÕÄÎéì„ÁŠ8-e|À“çÏýï»Éæ#²å£|”•|î*2@ S'Ïv7B5š”¦Ûv3úñ,§¯ý„p•à[ѱ ~dp•ÿÍ1~£ó+—mZ¹a".Eçå;ðoÝÆ'¤Üiú²ùȆlù(åc%Ÿ»„¼ 8rð­ž=úr=iâr»‘×ÈvP£ÓçUëðW øÞ€8TëxQ§r2ÌßÛ[8ÖÍ󭧇Lœ²âlEý|âJ6Ù-å£|¬äs7ºj8z¸_HÈ0?¿¡#œÇ(Òn¤êZ§, s4Ì3¡ Në —Ì1h”Wÿöí‡Í_0¾´´þkI6Ù-å£|¬äS¿4€¸Aäêá#†MmÕzºÀD·! %6ŠØ;â¨ÙG¸{ø]ËÐŽ]Þ [XôExÕÅà{ÍG6dËGù(+ùÔ ©jSºûƒ‚üðÌôÐM)C3Ò†ä…ïÞ5µêâå#'²å£|”•|~3 µ …Bq‡¨P(Š{”Ygʃã↯^¼p~Ï… ÞˆXÕÿ‹‚IÊGZdËGù(+ùÜ ¦Né»`î?;v˜ÙØm »m°ÆqÆhÑ`Â`36¨Éýœ1âô‘ ÙòQ>ÊÇJ>õE(€ÕƒÇéÚ7>ùŸÅ~2¦k— ÆÏš·}Þ¢]}Z:möžÞ} :tHz¤ÅjO÷ŸàÓ8là€wŽî/øÈ†lù(åc%ŸúEêHNߢÅFïùù~òܳñÇì]_}äËkÕÕתªÿséòOW®^»òãµ Uת¯\;}æZ^nõ´÷÷½üRæcEè<̦ÐodEùP«úȆlù(åc%Ÿ»Áÿÿì{T•UÞÇ¿½÷sApÔR“1ÍÈ|Õ™šÍf9½“™35¥”vS*S_ÔtRÈK¬FKñ’"÷;@Anr9€\ä¦rÁë¨3ͪ™ÙçE‚kfÞòœí³öZŸõ¬ý<çyöù¬ïþã»öñÈ´ëç{ΙÏ7YŽý¶>ù«<Ϲ¥ñWζþ½åêµs-­ÍWÚÛ¾noùºµùo­Í×[[øéµ–¦«­Í7;;¾.(ûzõºÊg›ã>*¾âëìønDØ"ùˆ†hùHé£%Ÿ»‡ˆPXðü a>669㙪5+‹ ßT×ü³²êFUÝ•jNíšš¯jjþjâf ?íF]Ýuþêž½M³fæLŸVuŸÓ!UY¾à­Ušñ Ñò‘>ÒGK>wá :ú=kÛyöö›§N)ötފՆܞ(þGqñâ’΢’¶¢’ EŋЮ_2~HqqçɲÎÂã‹O|³wßõç~[6mJù¸1ñªnñŒÿ}A>¢!Z>ÒGúhÉçn#VDFxQò»Ó<ÎyL*zõõœÄ´›YÇnff]ÉÎíÌÌnÊÊiÌÊiÉÊîÈ:v1+»=+»í6Že·Ko?v¬=3çZzö76¶Nž”>uR¡ûH½Ê–>êþßõ°h>¢!Z>ÒGúhÉÇ TE³úØÌvèçïñÄùñVzLÊܵ¯=þH}¼¾QŸØ¯?›˜|.!ñlBâù}KBB[‚¾1AßЃ¦¤øŽ„„¦ä”†h}ctÂ__~Ù0é—EOŒ«ûPŽÂ|~3}Ö=ê#¢å#}¤–|̃(PW=wÐàýþ4ö‘¼ÇÜOMW0w^Y`ÐÅCa•!aµÝ¨ ;ÚÚZz¾ ¡Áí¡¡õ¡á!§‚›·n»üØ#ãF×Np¯6$VQ.ZüïÿMF4Ñ-é#}´äc6D)€_>¾ZQÖ=8<ÕmD»{Ñè1±«?¨ß³§mßÞs»wW 8cTïÞ]kdWí·ƒžìªÛ½»& àt@À‰ýê¶ziò“yî£+ÜÇœ~xT¾Ë}û(›“ï}oùˆ†hùHé£%³!D.T•…ºý<ßÍ­|øˆ\·‘¡?jóßRûé¶êíþUþ·Séï_a¢²þÛË·ûŸùdkõgÛ*>Ù^¹ykëôߌ™3Ô-ÕmdÞð¡vþ_ÖÑvÇÍG4DËGúH-ù˜! ÀÅå=;ëmCGÄ»Istü¡ùŠ{ÕY¿µe›üN|è[îç{òe~¾'üüJüüŠýüJ{£Äw½áCßÒ k+6¬=µÞ÷¤¯ïùéÏä>ð`¢ëð¨ÁCÓ† -tqŽUÙÿ-¿¿W|DC´|¤ôÑ’9±|üù3OB–89FÝçšü3×£.Ó\]» }Ç«v¥ÏÉÕïùx{{—v£ä||¢eÞÞ§øKËWæ/_aXêSòÞõS< ®ãL¿Ï%m  ‹T;›]ÎŽËï Ñ-é#}´äcf,_nn‹­¬79Hê?@ïèœììtx€sÂÇC/½Xæ5ÿ¸—W¦—WÞ0,ðÊ¿ æóÁ[ïd¾õNÆëósç¿];bxŒSÿg§>¿£³ÞÙ9ià€(FØÿ–ø>¢!Z>ÒGúhÉÇÌX¸RެRtólmwôµëÓ/ÊÆ6ƶo¬mdûCO>‘6ûåüÙ³Ó_y%»w|V§,³±ù’*‘:ë0U¸•a­†ÙXþlÀÁgž1<÷\öŒ3f¤ÿÇð›ù#™ÏÎLv&?æ?6>ÅÚjŸ¢[Y…YYêúêø@ Q•ͪêÙXÿ¶È>¢!Z>ÒGúhÉÇüX¸õGUY¸—©±€q(Ü1ìÁØ©O¦=•>uJêTÔ§¦ýOððH{úé¬É“S'{dN|<˺O!ûB²hFÂ|ª*Kw}þ¦È>¢!Z>ÒGúhÉÇüX²Ú[ÞSè›*݈$ñ òsx^”dÊþQ£3'NHûńԉãSÆ;<áŽt#¹W~11uÂø£?žóظl[»@€Ý„N Œ¿½@‚¡|1Àgæó„õ Ñò‘>ÒGK>Á’ ]i£ó¡°‹± t-@(`¥a:5RÑ »?fôÈD÷‡óã˜QÉÝHì•Q%Œ2bÄ‘¾6Á”"4”²HÄp Ѽ„ì FÅXˆ¢|4rÔza}DC´|¤ôÑ’E°dìøÔ“À2+cFÈѸÿ Bž>„e„F1ö¹cÿà!ƒb¹Fß?8æÑ÷‰ê…ÁQƒ]¢8…é”ýŒò2çÅE!žðÉ ßÜòùƒ(ÛÚßq©°>¢!Z>ÒGúhÉÇ"X²þ´éwV1ÂÞ>¢_¿ð~v‘ oWC1†|?'! ÁXõ@‚ ã›2J>QØ{'Ë6ˆé#¢å#}¤–|,‚% àã³øP ¢˜Æz¼#’ cq Vh„ÂÂj|‹äGfÌ4’aC=䇓ðÓÀÑ<} „&Œ¦ä3…-.>¾NLÑ-é#}´äc,Z›ž7.„PH8ŒØ+RÐø*ïO=%zJã)¥4Ž’dŠGº`$…>8ÌS&ÈÃ5> ï6O…#ˆq<} „¤Œ§¸SaK kÄô Ñò‘>ÒGK>Á¢}4“¢iÒÒ‘d ú6x¬ÄxC×"ñ{’»5Sº x”ƒj!¦©Àxg·yø«¨ÈïÉæëdZ€Eß-€h>¢!Z>ÒGúhÉÇ"X²v}P¥¡<8J iG{À/fdd€iºq¤7ø:¥öœ!šÖ0™ÏÆH!A=A;»E§OnÓG4DËGúH-ùXK@V¦¯ÂÞ%ø¥J³)æffÞŽ1úc½Ào&©@Rz ˜Ñs„, Ù¼ÉùÊñÅÎÓÑ$J?r¼¸³ÝKLÑ-é#}´äc,ü?å +ÝAFx@yˆ¹w û‡Üéúwäôœ„`.ƒi rŽó°ÒÅ,{xìr‘}DC´|¤ôÑ’ù±pŒŸ¸E§ìd”o‘ò ˆyFÀ`<5Òu¥{²9ßÞÃo†Be M߃| yÄ81¿bmM•%/z~&²hˆ–ô‘>Zò1?.€Í›Ÿ\Ä”8‚e@r€fáÛ«€åÆ41€Ÿï¢;ÐËÍ|*c÷b °„ÐÆöXYÍݹsƒÈ>¢!Z>ÒGúhÉÇüX¸j«ç©}¼(;D°”çXÆãŽßZ^•ù¦L‹$EÄXò¦w)%4‹Í..¯/\+²hˆ–ô‘>Zò1?–ÿA˜±ãþHˆ¿BøFé 9¼ñ„‰²Ÿ „2 å„O|fÆ’ßÿõ¯{ù–h>¢!Z>ÒGúhÉÇÌX¾BC–ꔵ ‰¡p†@Ú®Œ€ðªäyUœ6®Êå41Î_PÁH.Á]vv v,¾hˆ–ô‘>Zò13–/Θ1›7ÚZ—ò†$pVeçœZ ¤àS«ú À …Ö T%Š ÷¤IkÚš{ÿI6Ñ|DC´|¤ôÑ’9¢õ+TuÀFòtäœBšÏ-Êwd uµ?x†‘rÆS²ÉÉyÞŽwü¢ùˆ†hùHé£%s"Dpæ/x)«­ÕD†|£ÔBð,°SÀª€Ô8OàÜÏòVg:cû({mæ,ŸöÖ7î!Ñ-é#}´äc6D)€Ö¯ŸöUØŸ,`ØL± ”Pj5RO±‹·h¸E}7øi“éÕ>EÎët§c׎ytY¼þß|ýV4Ñ-é#}´äc6D)NYÉ‹NNo¨Ê6Éb´žÐ ¼~A­Gä»°š(43hgÐA¡“@;B B3B#wj ¦¿ráòÊÅ:ÄzFù˜¯èY$©ôÃÁÌÙ´eϽè#¢å#}¤–|̃@À)-zÁÞþ]…|a­¥x—*8ÀãÆVÄ&Æ#t˜®wt£ð"àÀ61=ÅÛX§œ¢4™âšÁƒ|°þóKçߣ>¢!Z>ÒGúhÉÇ ˆUœòÒ—]]½)ùØŠ¥êHµBxˆ1q ð Í@Œ6 Lqw~ñ†ãu¸Bá:ïjk¥œÐý€K†<ðÂj¿O:;Þ¼§}DC´|¤ôÑ’ÏÝF¸àÔÕ¼>Åc‹B?`jM )iCr ‘/ÀuÀ›@n˜¸ ´9¤ÉE$—MÇN¤@®¹Lh«ŽÖ©4‡‘/({Ã}ü [þŸŸ»‰æ#¢å#}¤–|î*"@ë>ø¸¯ºH!‘$é¬J(©Dlaä&Á¯ùá+áKáo¾bðwã¯èØ5W­”UÍFüÉJ{Ç7§ÏXðcÓÍG4DËGúH-ùÜ%Ä-NÕéW_zq.Óy#Y`­fô±:­Fm”\ÖÁ®©pC…› .ëð‚Ž4(´B5þ½½/}lì^;þí5k÷¶4ÿ4߸ÍG4DËGúH-ùÜ þÿÿìÜ1K•aÆaßç¼o"DH˜»‹C~·>G!„yô pÎ4¨Ð$TÐÒ¸¸WfA¨ášg ?‚àw( ¢ÙÎðžs_pñÌ7ÿå·=­À—?¯­uçæÖ›º_ªWr03ýñNsT—¯Mõ­©Nn”㺖êÝÔÔþtÙº?ûdy¹ûúÍóápô-µmOÛ´í>öØ3I{Fk ð×ÁûÍîÎÃ¥—æ_Ôu·êôJg«t¶¿ÍÌæÝ{« ‹½•G»ýþÛóïƒë«§i{Ú¦m÷±ÇžIÚ3〠/öÎN_>÷>}X?>Ú8;\üع¾zfO;µí>öØ3I{nm\À€PJB @(%¡ ”„€PJB @(%¡ ”„€PJB @(%¡ ”„€PJB @(%¡ ”„€PJBýÿÿìÕ € ÿ¯’à0%€)L `JSÿÿŸçìû—9°•IEND®B`‚golly-2.5-src/gui-ios/Golly/iTunesArtwork@2x0000644000175100001440000033150512156145314016002 00000000000000‰PNG  IHDRð¼Ô!tEXtSoftwareGraphicConverter (Intel)w‡ú²ßIDATxœì×1 ÀÀW‡= 0ô’еsö"æ{ðŒ€!B „1b Ä@ˆ€!B „1b Ä@ˆ€ ÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿìÜPÓ÷Çñwò ’Š[Û³S =×êt³wZí r,XW¢XÔ–ŠÚDT@Û:©m7çæâÄóWqwk«½¶g×Ù›µ]W»‚?b $‘„„üþE¡€øYâꟻú³IÍëîq¹äûý'ß罿¼ï› €(‚ Š`ˆ"X¢€(‚ Š`ˆ"X~¶»îtØ¿'úD&ôAôAˆL˜ôùÉÁpÕן_¾üðøŸ½D4hhTIlì‹D%­âÓj¢—‰‚§–- äQ QŸ¿˜Hø\á®ÊÎÙ¿g¯!ìW>è™Ð}ÐÂóƒ>?uXî¼êǦO«HŒŽõ">­ˆ”'Å×<°%Q\-âd'ãxåēŠ7ÅÄlð*ùüÊQ\6É‚·Ç”Ÿo‘®þ ì×…>è Ð}ÐÂóƒ>÷ ,wÌî½ÿš5kÑüàÜ ©blü1mQ­ˆ¶ŽÙöȘíSÛ9ëɺÔÔ}ié{Òæþå7Yû3refIŸûNjú‘Ù© S§ÕOþÅ”äýII»8ÚNTË£?Ä v•s´f´H:cú[oÖ6…ýJÑ}Ð'Ò úÀ݃ùAŸ{€; Lú× ÉeDÙÂØ—J|h=ÑÆûx;'Ž9œöägË ÒÒfÙª³µ¯ªŽ¿ë»x‘)5¬¹“i ¬ÃÒv9t伊ÕÕ»kß4®‘6/YÒ¸ ïÌ3OŸLžðN‚x׃£ë8ÚJTɧµD’„ûJ*ÖûU£ú O$@ô»óƒ>÷*,·¥fËßù‚…<*ƾ;*8£5B®ö‰”†ù™ÿ~¡@^±æÒ[[{ŽýíŠJΓÑo1 :lÌë ­Î—ôlW½oqÉÉÒ³ÅÅ­©OŸ7öÈhÑŸùT% W8*ÊÎþ}Ø› ú úDôÛùAŸ(àæìÙ÷ŸI“¤D‹cc*chk¢¸nÆôÏ òÛs²>ÿÕëÛtÿüŠlÌèbÚnG—Ãfpš cW±³Ë¬ërMƒN;³šFÌÝÃ&ý€QßoÔûOÑk6yÌ=.‹ÙÔct›º]ÁƒV³ßfcêfñ°F9ÛX£ÊÎù¤`ÑùÂ|Í3³¾~èþCBþÛB®šH2&ñ…‡èƒ>èƒ>èƒ>p 0?èU°Ü„Òµï¯PWE´1^´oRòÉœLÝRI÷s¹ŸnZÿí‡Ç´¦7°V kiëï4ôw<—.HïÑéýº®€îòÐåï}w] ¤«ïÿºhïè62»“µw°Ã‡{–ŸÌÊü´hQ[^NûìgE‚}D›Æ$¼SV°è(ú ú ú ÜÌúD,7jêÌ N´<.á5¢ê”GOd¤·ÍËèÈ›¯ÏÊüæw¯*¿k¼ÐÄZULÝÊ:;ƒ“:¤P:5—¼×ù4Ú>6 Ñ\¸þñ‡_µZŸ¾«WÝjV(ljõ°RÅŽ}Ð/“)RýI13½ýW“O9Eüb¯ˆ…ëÓRÿ„>èƒ>èƒ>è7óƒ>Q À Iz8”¸„èÅ8ñŽ'?‘ÿ[CúœsYóäy¹çW—µ|qŠ}ûõˆê"Ó¨YKóU¹Ü/¿èR5»*û÷”N…Ò­Pz HðÍÿ>ÞÀ«RéÔ¶¹[T¶¦&SÓ9¯¶5«YÃÑá•+Õs3Ÿ_Ð5^{V†zÊc>2v/…þ'«0ùÑ—Ð}Ð}Ð}àa~Ð':ýÿÿìyTSg‡?Tö„$¬BØ7"ˆ¨ÅêÑ:Õ¶3mpETTPAE—VÐQ«Z KÂ@ ‰Y!ì!ìÈâ†KíL§=íœ27©ŽcÇ¡Á3s¦â{ÎsÞóÝ˽Üï>¼¿?Þ“Àð°Jºô WèêMÑÜ­­“äá^þÞÒöeK[Þ_![´„³qS­X:ÖÒÐ?àçm€ñÈe¶ ä‡Í”zz‡5§žöñª_´ ««>íY¼¤ì“N9wìÿgþÍkjþ.‘üPU=Êåß—Õ[[ÿ¨šß/”+‘Œ%w…’ûBñC¡ø±ªŽ*ÕC,¾/¨©=”Õ<I ÄßÜ”þ$ŽñDc_\[þ^Õ<Ÿr¿…âE ¤ó¼¸ ½ù†Ú'5Q8ŽÐRfÞ0ø?àü€Ÿ·Ðý~€q€`:}@Å >¬ªÊ“jBÌʼ«äÚ`½7+«#+[NÏi¦çȯewf3\Ëúá@Ì'­Ô‹VçéÞEsî›;sxÎŒ.¯YÍS:–a„Bôp«#£sÀø?àüLb?ôø|© /‘‘YgBXP†F‚…ÙuWW¾‡›ÌÕ¥ÞÝ­qÖì:Ï9'çœÕâ” O¿¸ò€Nðõ×·¿úª'-­ó%Ò;þå°[Eï3¾ìSòÏCuPÞ2 »±;=­==]žžÑ”–Ñœ‘Ù‘™=r%íqBÒãåK%3]žÎ]³gôÒ<Úi3Z\y¶Ós4§Å ô‰.î“ìë ð~Àø?“Òý~ _êÀKÐh» @hŸ±I¦ƒ}µ½½ÈÚJHµ•º¹6ÐfÕΠ•Ù9¤‡íj¿rõûÔóCi÷®^îÿò‹¾K—.uüº¾ ë¿‡âòÅŽË—Z/_jƸrµ-=c %uøó”ïÖ®ípq*§yÈ]œäîn-n®N޵înRW§*²é H„>vu ?àü€ð3)ýÐ?àò¥>0¼àh_}¢§©£sÊÒºÐÍMêè\GµkptjÁ¶Ô.nEv_î¸üÅ_>;ÓñüÀùÏ»/ï=ŸÒ•šªHMýUýŠ×ç|;ÆùTö  çº.¤(.¦´]Hm=ŸÚvñbOò©ž” ßmÛ6àèÀöp¯ÁúžêÀ·wP®®2G‡›v6¥–féíÀæàðð<ð~Àø?“Ìýù‚|M^@&…èhîÔÒŒ5%§[Ûc=dK­±³kquU897[ÙTÚ98»^;phð\Ê詓ݧOÞ:›ØvîLçÙSgNË™vm/Ó®^•Ÿ9Ûˆqötö Ï’;1Î%wœKn?›ÜŠ]Øyú³';w 98ç;9s©\Kj‰Û¿ƒ“ÔfºÐv:ºE–ÆñiÛ,ÌBØì!ð~Àø?“Éýù‚|Mž±ÊÿBk tŽè뜥Ú3mJ¬l*Èæ<3s™m«½½œj/™nâÍÎÚןП” ˆ‹•%Å5žJlMŒ—'œh{òç4'$4%$4<§IÉ/'»6Ä'I%‰'°%ëHŽëLÆê±¶“ñ­ Ç[ŽwÆÇlëstaPíKmÊ,ìLª3×Ú†om)¶·•Y’8†º—´4öékoðöŠ?àü€ð3iüÐ?/È×D๕x£h-t‚B̶µgÛ8”ZQ«Ì,yd3…Rca!µ¶â[Yzy—FDôÆêIŒï:-9~¤.é¸ühlóÑØ–WÑüŒ#GÔ«©j£úÄ­“b`7ÆnŽ;ÜŠqìPKÜá–qmØSâ÷ÇÝÚëìV0ʶ¶+µ²g‘­ó,m+H”–VbWçV ¾…¥§™¨¶èh¾ÎŸÅ?àü€ðóûô@ÿ@¾ _þ¹ÿßwð{àÅÇZ¥©yt J±´(£X”-KÈ7ÈU3ž¹’j sÎt«BÏYå[Bz¢ööîß×ÛvøP]ÜѦƒÑ4KãËŒñ¿#> ö}bê£Öˆ©Åê¡ØæÝQ ‘íÑ1÷¶‡Ý³£æ™›XYr(æ7(æUÏ©Æ6¯Ü¿Y9Á(¡mY0/ü€ð~ÀÏ$ð@ÿ@¾ _¯ J¤Íªß9J0aZXaSoÉ¢Œd^I6«4£(1§T˜›[™å9Úç­_«Ø½«/joGddÃý²}ûköî•íÝ[¿wO£ZõMjÕÝ-{öÜRѲgo}D”$bŸPI”xOtÃöpYXDGäþÑ€€.kK&Å4ÏœRfFá’)2VÍ*Aùf6–SÑçSQ4Ñx'ø?àü€ŸIà€þ|A¾^–트ŽÐ‡Z:Ñ%aã/‰RI$q”"©ƒdZA2-'›rÈ$–9‰I&f|¸²nWXoÄÎÖm[Eáá¢íÛy;vˆÃvHÃvÔ¨WŸ&S«†Õ‡moR‚-vH·ínÛÅ{F¸$x‹$d[[øî»~~B²i6`±˜dZI"VIªWà``¯@"qìmª Ó¦¢ƒ††f‚ð~Àøy£ýÐ?/È×ëÀ2G§­SÖië16I'‹ ŒŠðÄb¼)Û˜PŠA0áLJ‰&ÅDB!‰popÅwî°í!›B6‰CCùÁÁ•![!!¢‰ ™5!›ë”`‹ѦPÞ¦ÐjŒà­¼àPÁÚ ù–­ƒÎN…ãLc|.¶UÕžËUû/6&²1„b SB…˜ƒPŒ®vÕv3ø?àü€Ÿ7Úýù‚|½oû–Ѥ©ý'-Ý0míx9‡ËÓÇáð…8ã|#6†‘a‘‘!oXˆ7b¯c¤“}nȦ^éæM²õëyëÖU ‚‚D`£x"H7l¬U$Ý$ÚÌßÌ]¿ ƒ¿>Xä¿V²ncÛjÿvŠù5< ƒ`\¤Ú3–äB|¾ž©¬F…Ø[àô˜Æ†YÅ™œ6僌¯šÁø?àü¼¡~èÈäëµyÛ€þ˜¬¥ˆÐv}½3ººi8ýBCŽ._Ç WW?C_¯§—ÓËÅdŒ¯™‘3>\Qÿчâuëdþ|ÿÕUkoNŒáDH”ŠÖÜ XÃó_ËU-$Ÿú×øÊßyG`„ÿÒÐ0ÓÐ ×ÈÛ0¶í|]\®..çúLì] q…ÚÓÒô´>ך5mÊê+Àø?àü¼¡~èÈäëµùÿÿìûs”ÕÇŸsÎ{Û Ù DbT.’!j rI@É@;SmÑéXu´íŒ3TÔŽÖZDZbÈmw³÷ì-ÙÜ6Ù$@3¶Smÿ…þÖÿ¢Ï9›„ÉnâèèÎ>3ŸyæÝ…¼{Îw¾ß¾söMò½”o|Æf½ð›’â+\tizÀ*2m³À#§-`³‚H(°|–ÙWZì,-éÞ¹#ÒÞ>÷ÔÓ7OÿäÆÉ“©ï“™ŽŽë ¼H:=uêtçÓ§Sgn>ujîdÇ7Û¶cqï²Y}¦é¶L¿Í Øl>›Ím+pš·ióá^0Æï)´]xÓ4^(.>Cú>¤éCúä¨>ù‡òEùúÖä{8¡óWm懥%}–åpê¦O7=júLÃX†Ï2<ï+\ç*)ê)]ßÙÖöuë¡éÓ§ÿuôØd{[ª½}òûoÞ6ÓÞ6‹³­=Õvb9~"uüÄ̉§æž<ñcmߔڻ-«K׺9ïçÌe>Óô˜¦Ó´út[¯ŽSmGðÜ…©]ÕµLãu€¶Ï.}Cú>¤éCúä¢>ù‡òEùúöùÁWðrî%¯½ä€WJK¾ÐD@·iÅ„æÖ§¦“k§`ý_| ìÓŠJ÷ÆÙcǾjiM=:ýÄ‘ä‘Ç#x/>1ù]ÑÔ4zäÈôñãן|r¶µuì`ÓÈÁ¦±æ–©“§þ³§>¹ac?—¾à¼ÝÐÏÁÅÁÉXã_‚èœr;¸…Cxt¼géç‹ Ï56f:#}HÒ‡ô!}~œú™!ÿP¾(_™Éë°·î‚/¼iÓ¿@ôêf”iàÌ¥2pàrqqoUõð†¹ÃGÿÙÚ2ÝÚœlišhno:8†Á—ßMÉ–æTkKª¥yª©yª±i²¹y¦ùÐ\ýþÙmÆ ¯áz:…pbÇE—s‰‹±>Æ®I÷/€ƒÏÐz>æpAð—w<ô6éCú>¤é“sú™!ÿP¾(_™Éë`ˆ3X5øHcWTµuq=à–¾G÷`‰„tÒpæÆŠÉy?‹ñÎÂ"gõŽdë¡7ìŸ>°Ù¿o|_ýRÿø(’¾^Ž‘5q°ao^_?±o_²¡a¦ñà†Æ¿høêÞÊ`‘üãvWTz¸æá‡.çàårÁ²«` 0ÌŒM=¢q7ÀßÞxÑîxÃüéCú>¤é“[ú™!ÿP¾(_™Éßàóþ—ÁO ô …æç:ë@'yÑ%òâ¶ , €TÖu·<`b׎ð®Úë»ë&÷ìÛûØøã{&pâõîGGêI.Oî:ÑýÀݶ[`àç€5×ÏT VîŸ@@×£šð0Yâ?xMèçÞýý,éCú>¤é“Cú™!ÿP¾(_YÉßðÎ…d‘ùR‘ù. è7ôã~€>啾; ³!ãá“OÉ€S7‚†îº§¤$P½=±³&þðÎDÝÃc»´v¯wízd×ÈòÔ¯‰Ú]Cµ»×b®Ru»gkj’›î‰!×)ËÝBó -¨¶€ 8„P+wï‘00Ü‚_ˆ°`~Cï3ô¿œgüµgϺIÒ‡ô!}HŸÒ‡È ù‡òEùÊJþ€3—‹Í×¹< ú3ú^A~ù]1Ñ¿bÀ/È`@ÓC¶‚˜n b!ÆZ^æ«Ü4°ms¸f{lgÍÈΚáUÃÕFªNc"$Ÿ—GKɧO®®³])³;++|[ˆlÝÞ|øþÊ^oy`p¹9¸espõoõÀ}8C›Ê}ÅÅ.Óè弋¯zÞÅ'[/ ,,O®CTƒhúL=þÒw+ C; ënݸ¬é¼±³ö-Ò‡ô!}HÒ'‡ô!2Cþ¡|Q¾²’¿`Û–W~ðÞ:­¿ØŠÉ3#- ,4Ð5õ£Ÿ}Á™6–4™aÄt=à‘È$ ª/Ï]ø¼Àìµ—ú+Ê#‘ŠòÁòòPå&¼¬Ü4xû VV+î ¬vVï½'|Oydƒ=`³ð³ºÎÜ6+Ý¿=éÖ»ÐÑqI1…<“îç‹À-„å³>¸Av‘s€ÊûÞ }HÒ‡ô!}rH"3äÊå++ù[6–='àUjÐ¥1¿Æ"œGd•TFa·ÝzèÖÄw”ó<÷Bþá ›ústeö¸Ã-³GŽp™#ì( •9Bjeþe§ÝásØ81K¥v/Îõëƒ:÷h< ó€`~lê—57¸ìÚD$ Í/Œ9e8N¯fÄUüšðhZ'ÀÎ[ÖYŸï&éCú>¤é“+ú™!ÿP¾(_YÉßP昀€.´”Æbœ ©¢´ÖH« â…€°Î£¦µŒ¨ÍŒÆŠ #ŠpQQh@f ýȺu¾y BÄå!¢i¸¬¹‘Öc0ŠP^÷*ëc\KÔ„ÏÏÄàmËzÞíºNú>¤éCúäŠ>DfÈ?”/ÊWVò·8ìgoÀgÃ1Š® ^DSJƒ¢M à ˜zÄІ2ô€¡ûÞ|™Ñ5oYUyÛ9.O“>äZa=Kà—‡_2Xî5}Dmpï¹4=Ý“¤éCú>¤O®èCd†üCù¢|e% €½ôKÒ`˜3ôG\Y$Æ×@œ©É•5•Sc؃¼múÄJ]q¯B“©wBwƒMwñ:}È¥H×ße°Òz8ŒqÀ½¨=îQ°ÜkÚ8À`JyÈà×>fð.àê•Ò‡ô!}HÒ'Wô!2Cþ¡|Q¾²’ÇÀþó…t ù{£FÐ7 }3¤b°TãL“Xøþ¾ç<ÆyD1ÈEh¼VmûnO ‹/Õ}$w¿“q=à ˆÉgb¸OÂS¤MŒâÿÁ¤¼à€_~~)Nú>¤éCúäŠ>DfÈ?”/ÊWVò·8ÏÞ4Í$ÀÌûxhÕ3Áaa0Τ½ÐyÃ*ECiC >,D\•àK>*ظ`É;¦Æ'5>sñuç1¬æ*#‹Ÿ«>"¾ÒzŒ ¹‹8caà˜ð8°„&fÔG41xßb.~%}HÒ‡ô!}rE"3äÊå++ù[ÊÊžpŽÃ*QMZ "’¶rb¡Ñfèæ)  ™ŽP:KjñÐêþHòމ÷Q¾ŸR¾Ÿ\|>0¶ø¹Kî¿ÜzdÆåg±¨üË8þì&@ `L~QïVž_6¤éCú>¤ÏS"3äÊå++ù[6lü™`/rx_~n>³Ó |¬œ4¾º‰nK!¦Ù|‡S` ÆÕL“XÂè’½5à~|bñýù,“9ºÐ³åiÝÊëIŠù Ç•ûãê>X¯çfdæð1ƒ·,ëì¥KÒ‡ô!}HÒ'Wô!2Cþ¡|Q¾²’¿ ªú%€çθuUÏŒ£}g9ÜTè˜äêfRÕÊ”òVúbò.’·s§õ3ÎEVµ&Ý?)æ3œ6¤"‡k˜±ô¯›SÉÁÍ^øÀo7l|Ùë½Aú>¤éCúäŠ>DfÈ?”/ÊWVþÿÿìÛo”E†ß™ù»,`QBôÎ$^(/4Ñ £Fð@ÄD‹XN‚D œ Ñ &`DE@ÀAART"â–v»ÛnôDéV¨(.Œÿ„3óí¶¥Ñ=Ô vÙ7y2Ùn»ÛÙ'ï{ñË7_[¾Àý3^WòE Za¯2úJŒIßm³!þ9Üœk4“þ†aAôêõ§a“qNk–ï~„™ÈÓs|æôï+´ 4ÛK`ß |¤”.ÀÊ[o[^[ÛL?ôC?ôC?¥â‡d‡ùa¿Ø¯œ”ï°tùA߯X¼§Dí·Ašˆ´¸R Qg.‡å³b¹¨Zõ«ÄiÈSù¢ؼ$ßýÔKijš³tBœæ`_&úI ¡‡cßýVa—ë×HgÙ]ÓÖœ<ÙA?ôC?ôC?¥â‡d‡ùa¿Ø¯œ”ïðñgÝÀÓ!°ÃUÇ"^LOÀ6%qKýÈàþçZ(:©Që<‰«YîU˜«xqqi; úùÐ4鿉¨ïص²òžû6ÒýÐýÐO ù!Ùa~Ø/ö+'å;˜Ç\wmØßcþ_ˆJ“û$Òq‰Ùä¹f'~5±L ó'–ÿ~„‰~ÂABš&˜X¤Çß6»6†Ý:×9 ÔK€g}âmú¡ú¡ú)-?$;ÌûÅ~åèÈ5ßÁ5dìøùÀŠHxëNøªE¢U‰B#…И•‚Þêÿ"ѤtÍšPæTŸ&!Ð*Ðn‡àƱ¡¨R€ ÀBzfáÒOè‡~è‡~è§´üì0?ìû•²~d§T¯úÞGé‰ðxØÜþÒdïIŠ ù.@ÃÕüwÌ«’6‘yRÈfД)@RÙHƒ~¾] æÝâãÇœQj?°Þâo^°ùSôC?ôC?ôSZ~Hv˜ö‹ýÊNY›jÆŒ[ê¨×ù8â{M0Œ:tæ`Ê‘©MŽÌåUCpâ_âž~íp‚7iÏ›Ö̯Î5,ýÁ`Æß ±ñãëgPWuÛUû¿HÒýÐýÐOiù!Ùa~Ø/ö+;e=h¤÷8ð2ð†ëqT½½M¤×œ“ö¦rY¡Ä27‘œµ1ê²k[æ¨\ðÝfûÁš“¶Éç=i–朹&s6®Ùî\S¯œÇýÆí…×xîìªþîûvú¡ú¡ú)9?$;ÌûÅ~e¡Ü€;§/3_ƒnèpB‰n)ú!’P CÈFˆ`ˆìÎ œèåà"Ìɹö"AOÌö²—9ý¦'xÈ&ÈVÈ]ÚåÇ„úØ TN¨˜óÒ‚môC?ôC?ôSŠ~óÃ~±_£¦Ü€UëÂyÚ o€øâWõçÍ€«; Co¯‚ÙÉLtôÏe Ð\Õ*¾4Gßì§h5ÑfU­Ž•òs˜¿þûÔ”) ¶n=J?ôC?ôC?¥è‡0?ìû5jÊ}ÐŒ­xÎToG"§í%0“r{‘«ÃFªuX¾ƒtg PünG1¬zWÒt`pc&ýéO”ò„2þVsg<°îð×1ú¡ú¡ú)Q?„ùa¿Ø¯ÑÁ`æ½÷½ Ì6†¼o€¨‚‚û2ôÂ|ÙeA’º†ž$xæZ¯ ]Ê<è²›ïM#:•JQ+åN`Ù¸±ó^¬|—~è‡~è‡~J×a~Ø/öktp˜¹u»žzgzÞãÉÓ¯G"\~±¤lzF&>¯AºŠfÕûïUè•è“fç™ý‹¶p¸QÉCöÜÂ)SªÞzëýÐýÐý”®Âü°_ì×èà`˜:ý `%ð¾+jÇ8MÊDç× ¥©Á°ȳ¶=v²LY‚A¹HÖ ú)½m™îpŸ‹EÜSÇÝÀꊊªY³j¾>šïõ/ú¡ú¡ú)N?„ùa¿Ø¯QÀÀ°zíOJ-šP±Ø%q\¡Óæ>(À%½"Ý賃òÅLúŠcí ¢T×6¡G‰fGö5R,š<ù•U¯í£ú¡ú¡ŸR÷C˜ö‹ýÒLšôŠï¯•Ø¢Sr“®IR2Ñ¿ TDþÖñâœ]PЫ<Ñ\Ò\H ôÇÚooyéUrÀzógZÂ~Lɯ€mÀŠ›&.š=gÛÁƒõôC?ôC?ôsø!ÌûÅ~ €4ì8︕R®¶Ü2©%ÒJ*¤\ü.ð[ع›0ÈnS¥ p&^¿Ylò.ÇzA =”÷;ê¢+SöÿbÔ…¼ãŽØ-°ÁQ•·O®Z±|ýÐýÐý\~óÃ~±_…Â`ˆ»ï~˜ë{=ÀIàŒ¯zÃê2̵¤?|ù§N˜|Íl u.[‚!x HVÇÑs¹ž†S®êˆ+yÂs(Yã8‹'N|~æÃköîýŽ~è‡~è‡~®?„ùa¿Ø¯‚à0Ä/zo¨xRª݃?z²-¤~W¸â;éxA¤ º-ƒøÓ` x°'öôßå¹g}ÿŒ£ {ñ+™7uÚKÕk?¤ú¡ú¡ŸëÉa~Ø/ö« þÿÿì{pTÕÇ¿çq»›I†—¶Sý§2Ói;¶:Ó™*ˆV¨¶Ò`L €J@)„g€R$¼l´¼¡äýH%V#PÀABؼ—lBÈÛžs’¥ B"“ä7ó™;»wÏ=»û™ïïßÜ{ýÌ::Þ×»Àã¬g涸^Qhጠ:‡ŸñY‡!Aœ÷ƒå1ø9N‡ §Ìj˜À¿<ÞO<ž­À<³Æ¿G»û»Ç÷xuõšmä‡üòC~š˜‚òCõEõÕp¨¸‘=2@eE5Á>ßÊ7ØkÚÊB ˜#±SÇ ³Â¶Ô/äâ„9I÷‰ãÙm9«I@_oT÷'žò§×ïvñ;ù!?ä‡üŸðôCP~ÈÕW¡àF–¬ÚÓJÕÀ@°9Ñ;ͽ¥ %Ê ¹J¼<ë(¬Ï ³!r!ò9Ëaç9Ž›ÍìC@øF°…À(OÄ€>˜Ô=qÊÛ‹Ö“òC~ÈùiÂ~Êù¡újÔÜœ§»Lëj‰dóàèe>k¯¨yìE.—eÂ9 øu%xòôŠ]5pä…(š"‰€Ä‰ ¡Œ#È`(b(‘Â_‹ë;ÕÈr† † ~ÍN3v² [ðÇ*µÕOb%@±`³\‰}¶¸|‘%ROŒkó|×øQ¯Ï^L~Èù!?ä§Éû!(?ä‡êë¶PpKºt<5ÖkÍÞ±‘¥ãžg–½€ð<¸ùp ÌepµáÿG7ÀCÀpÆ`5•pC1ÔžªÈŒTé¯b(3ãýŒ2Tß‚·@åÞP`ÞæH±±]b¡ÀDŸÓ¿mÛîžz)õµ¹;32Èù!?ä‡ü4?å‡üP}Õ5õѱãD³ æÀõ1‘G¢|~°Ü2ð3º F¾ðV@¯‘¯&`¨iÝ W—Dh«3 Cœ©K îÛ`-ôÌ&è×'©Ž~!ô·œâ¨`%ß)õ™¯±/·iÓ÷ÉÎCÆM™—žù1ù!?ä‡üŸæã‡ üª¯z à6üü±T W¤ûGŽùÀ É>”üy>v®I^‰ã^*BœJÕN°3`Å`…àù†\ƒß¯èaõs¶VªgãÅ=­Ê})GGeuýè{ôН“åq3…ܸJÿ(‹õnÙ²×ã†üæÖîaïK~Èù!?ä'<ý”òÓè1 [¨¸=¿|fC/`ˆdi¶X%±ÈøÜu‚ŽT),Î…¨4˜J`%¡àæ›Åòæš9ßD¹¤.¥·¦¢PS}”®ŠJŽóÕI”yD¾J¿ë¤ƒ/fªß öÛV­»vxrਠ³7¥ï"?ä‡üòÓ<ý”òCÜjD|üü–-“ß“¼ÖÊhO†Ä^ '¼¢˜é3S*ôç¿R¦å%úd™Ê®q~ ÕíìõŽö–`jCÏ /Öó°ÒPœ¨(u絎Ú|;ð60ßú¾gŸèÜgÜÔ´»¶“òC~ÈùiÎ~ˆú¡üŸæ 5 eLʦvm“€D`T„³„c-°#JóèÛQÁ*Áª4øBÃjS^©å† D¢È0ùV e†`ó‘Ïͼš2Æ‚%6+8îʹ ø30x©E\¿Û÷y®[òÔ™iä‡üòC~Èq[(?ä§B À°v]Á#?Õ—Ä9|¢ƒ¹6–E¾Rœd¼ˆñã%Œ••›bP•p©v ¦t 0“{=^gZRÎTßÌ*õk½GW‚SV3›ª1µGqÚÇy@°]û=G¾Œ^ðEwûñ£ƒžaLêk³wdì ?ä‡üòC~ˆ†@ù!?Í jî˜Ä„Å ^‰´§Ó–[¥åñe3~ܬ)PM*PjË«Àè‹Õ.êìšy{¾ú×—Êé“Y¨¹ í¢Äe† fOC9綨°­ æó/÷¸¯7Ûu÷ ¾XÂØ|`0ÐñônÕ.ñÑÇ’’GÌ~wÅFòC~Èù!?䇸S(?ä§ù@ À×aéb«¸~@|´£ZÏáÀ_À7Ønºí|dÉ}Rf ž äJvVâœ`—$ÿRŠÿHñ_U—.|!õö’Ä+W®Z¸¦^ÈšO+%«°y¹‚£\ Äæ§]ë°e¥3±x f²O‹ØžßÿA¿çâÇŸ²pݦÝ.‡üòC~ÈOØú!ê‡òC~š Ô|}¾¼è5Ȳ&¨V˜¡+jçÁ?ô:YÀa (æúQvU:îüª+¾´pÑÂyGo/;&÷®Yº6ôõsUª<¼Â•g½²ÄkùDž 5Û.`©YçžÂ­dÇ××Õýþzvè4,ihÚ»K·6ºòC~Èù Èq7P~ÈO“‡€»åWÏNóEö…ì–Ìe cSY’/Þ×â`Lä±÷¤¥Ÿ¡ý¹A?;ÃFÀÑ”8:(3”«­­÷¨ýy;-ñð)°ø‡Ä6‰Õ\¯sW“' Ù;"º[\«_ÿìñ½^œ<#ío›·ímtä‡üònân üŸ& 5ß ICÖÅ|;èìºýcb&>  Ìþ ü]`‹%v»ÖGgŸÏsÐb{,ì7´ðoÃ!µuŧ®ÜçÈÚ2]ðÍŒ­V ,Ìz¶$†¯÷7ß{ ¡C§Á=GÏœ³êýÍ™þßÉù!?ä'œ!?ÄÝ@ù!?Mj¾IÞHËxø'#TÝZD¥H>Ža Ç,ËzËç]æñ,gl± ´à«[-±F°5k[k¶k„Žû"èGîMªKh´nyõ£øz´n™ðÐC½ŸþÅW†ÏZºlK£ÿYòC~ÈOXA~Èqï üŸ&5÷„ÁɾsßÐoÅµä  ¿ 1c)–“ L^Ÿ¬Ð'Ëø4Ʀ…¶Smg*¬5xè §—Õ'*.¡}ûß=ÓeØÈó¾óþ¶™þïÈù!?á ù!?ĽƒòC~šÿÿÿìÝPÔuÇñ÷îw‘]@µc©AãÝYR6§iµÄ”`ZÎ)°€¡DËòSµ²ôÌÓÁXÇŸx3Úas5^¥eVvv©)Á*¸,첿Ã.,â§]眹n.µ«ûšy ³|÷Ÿïç9ïïïÙY,·ÖŽ]¹¹ÿ!qsÜ£•“cJÆF½B´˜/ȼjÉÉ#ÊF¤GMȘôÐË¿ªxaú{yÅõk«ìÝ÷ù‘#'ü~ôAŸ@ƒ>èƒ>à/˜ô¹­aøU5ü¾NþÙú ªªëË+ä……[¥ÒÍùù[¼/JJkÞªÚ»~ÃþmïÚÿÁñÏ*ü~·èhÐ}Ð} 0a~Ðçö‚ ˆ`"X‚€ ‚ ˆ`"X~=µòïþ,ݹ`áúä¹ï‰ç¼=}ZQÌ䜘)Ë㦿öL|ùóÏWV¬nØZ{Ìï÷‰> }Ð}Ðæ}n;Xn!¹ü̲e»'=ð ÑsD/ˆÆd‡†¾L”ÍQ.ß÷óx¯yßZF´Ô{‘GÙDé|~'ð¹´ wç&§l¯Ù¦ñû)Ð}ú ú€¿`~Ðçv‡àæ+_Ù0#®(:b©ïGïhy˜ `\DÅ„È5Ñáå"NÆ£\_Æ ŠB¸"NPÂð9Ç+ ž,L¸*$¤TÀ+áóKÆpeÿfôµý~.ôAŸ@€>èƒ>à/˜ô¹c`¸i¶nûföìR¢yÞ¹RÑ=ÃiˆªETRuÿøu?´iöãµbq]|BMü³ïÿqîöÄ”]IÉ{žÝ+NØ3G\?=N>푱1ÛÇÛÂÑ:¢jý%T°‘¨€£¼(‘tæŒwß©>å÷“¢ú O Aô[óƒ>w,7Á éß&Ǭ J†¾zoô›DÅD+Çò6M¿;þñ#KS›¤9çd¹§«×*pýø#kV²sL©a:Ÿ ]¾+g¬Vî¨~G›'=—™yò…'ž~òpÌ佑á[娒¨„OùD’ȱÙE…‡ü~jôAô èƒ>pë`~ÐçN…à†T¬ù„/XÈ£ÂÐ7BÇxg´BÈUÿ.¶~^Ò·/¥6å]|·Rß°ÿ’¢‘9ldˆ 0³™ÌÖÏ\ÃÌs™ \b}?1K/3XÙàb6;;{–Õïé[]Ö˜³üË,É׉ωR¶Q$¬â¨ôÊ·è–N¼O*ËÿÈïÐ}Ð}úÀÀü Ï ÀuÚ±³ãѸÕDéáa%tåãªð°šxñ×éi’´……M;w9ÏŸgZ-s»Y¿‡ÙLo¼l4]²9F-Ž!«k¸·´w¹¼o¹™Õ1j°^¶Ø˜FÏt:Öëò=-F#û꨻vk{šäXÆ’æE‹~˜5ëãqwm"ß3 ã‘ÔûLš˜'—Ÿ÷{ ôAôAŸÀ>p#0?è °\ùó7q¼4¢ïÓ®Ò)“>zâ‰Só_TH²‹ËÎíû»Cq‘Yܬo˜{‡T:‹ªÇ¤7º­öa›uÔd1/™MÃã°Åp#0?è$°\›šºO*%Ê ) ¡ÊèðÚ™3¾L]Ôž’|r៎¿Y¥úâ8Ó˜™ÖÎÚz¬ÝV³Æ¦ÓXµÝzmg·AÕmÓê†lfÒzFtêA­z@«vk5N½¶× sôv£Áá¥×:t=vïE“Ám6³Öft²“le…"9埩‹Ï¤-R>=û_÷ÞµKÈ_/äʉ$ã£_Ú±« }Ð}Ð}Юæ}‚ €k“ÿñÒDaeD+#DuSc§$©–Hz^œÿéªâïÿqp°MÉÔÖ¢dç/ tj:4Î]å¥vªÔnU·GÕ5Üõ?]åñéîÿŸº<íƒ=Zf±±ö¶{·>3ëðܤOÓ_XÒ>gæi‘ ŽhÕøÈ·CCV¤.Þ‡>èƒ>èƒ>è×óƒ>Á À/5}V'ZùQy샇.<—ر`žznÒwo­m>x@{ökQ°ÖÖÙéÔá¦f›òbïU.e[¿²Í£l¼Âsõßÿÿ·­Í¥îîkm145™[[Gš¬áÙ¬IüÔg’TmRBûcÓNþ6ö(‘÷Æ^Ç‹ÿŠ>èƒ>èƒ>è¿æ}‚ÐÏÿÿìyTSg‡?T!aß4Š R-VGëLm;ÓŽKÇ QAEET¥€¸´‚ŽZ­`1€$ KØ“²@ da ;²¨ˆb—éLÏt¦™›TDZӡÑ3s¦Å÷œç¼ç»—{¹ß}x¼‡C€@/¬ÈïÍØˆP¨éŒ4wö{¿½üºtÅrÙª·##Zj«4bÁߕ͚Ž6M‹ê;™ì+Yó#¥j\®|ðÅC¹b\®x,—¥[|¨GU(ªÛÇ[”£õõÃõÒÏÕ]U›æúgßnÝÚö«¥’ß½Ýÿëå]+–¶y9ߢ/ íçd­vr ?àü€ð~€Ÿúü¼šÀð°J»LÍßš>#dŠánc“T_ŸŠ7—·¯X®üÍ[Ò%Ë8›ÃDR¡©}'®ûF.û®Yö¡ðP4¬P>nÞÕq_ÇhCㆆÇ:°Å˜¾HG¥’»mª/ZT_ ÅÂ?I5ü:MA‘æƒuò߬”-_*-Pòö¯U´RŠu:BSÐj¼Õð~Àø?¯²`b ÀÏ« ‘ÏT"ŒÍ”¦¦G §žôoZ²¨««ß³tYùûë8\Mÿ;þí¿Ö×ÿM,þ¦¦vŒË•6}ÙÐô¨–ß_'Ö"©ß«Ö‰Ö‰ÆuuL{¨"Ѩ v¤AøPZÿH(~$}~[ò­@¢á 5Ÿ\Õ¬|³fa`EðbÑ’E’…þÜÅ|s㓆(š€‹Fh9³`ü€ð~ÀÏ+è€þ?ÀÀ0ÓM—!ôît£¸)è$Í[üZ@÷Vÿua€,0°jÕ»œ?^-®þ’U>RÃ}Ìã}ÁãÎå=â ÆÂ<ÁHUm÷ö Ža.ÿ. .o »@[±5ÿžžðy£·¹cÕ#•ƒÚú‡Õ¼ñJùšÊjMüá%ÁœeK…o,®k…ú5ÿ_®ößæí"XÄ"´ü€ð~ÀÏ+è€þ?ÀÀð±Ä¯ÂY†MÛc€’–½Þ¹xA¿ÿœn_Ù›ËÚƒ‚J7l®©®ÓT •󆫹clöPqÉ?Ž57«¸“U¬®åp*útôs*îpÊG8å÷8œûZ´ë!½©©/+¾WÂ,ã r*‹Ëû±Ô•VÁ*ý–]¦ÙÞÀư<¸Ãͼ@=ß[ˆ7»ŒÐS“8Üÿêwaàü€ð~~ž~èðùš~¿ùû¦®E(ÄÄ(y>­.8¨oIÐÝZOP@[ÐÁËJ?Ëù[~уÝÍd·Ýdª‹‹‡KËF˜]ùŒv»·”ÓÏ.éawck»ŸÅ¾Ãb ³XwYE÷µ•5¨=£'¬á’¢‡¬‚ÑÂBí#*kFÊ«ï–tÓ™ôü¡’rÍÙ³‚.ðãù+–-^8²x~op`+B‰Ó|`iõø?àü€ŸWÄý~ _? ?›+ÓHä}E˜›¥zº•Ð|$~³[ô¾ ö£‰æÍe?ñðzö×9ùwsougçÉ=Œ‚~FA¯ŽžçéÕ~‰y‡Áb0‡Œ»Úª]ßÑ›!fþ-Œa&³ŸY f¶bäªéŒ¾\æã›ùš˜˜~7*#Яy¾Oç\ϾÀ9ó}Ûüf‹¦¦ idüÁÂE±àü€ð~&½úü@¾ô€ŸoŽÛ6uê~3Ó4w—¢@ÿ¦y4¥góßæ…òÙ¾åK–Tœ<5ž™õ87ï~ÎÍÞlz=·“žÓýŒç{é9}tú€ŽA:}XW´'õ„>˜“}OËÁzoNNGN®Šž§ ç©nävæ2ÜÈùæ`ü­ÌŸÖèçÓEóè[0gxþì.ÿ¹ ²5Ë0Bá¦fkbãòÀø?àüLb?ôø|é Ï‘•Ýh…_ƒPˆA2Åæ¦—ß×[êåÙäãÝC=è¹® éê‹é­2ZÎg´^¼Ø“vª'ýÂב‘n®l_Ÿz¬ï©®|wÕUàå%us½íìXfg“‰ÐlŽŽ.?àü€ð3ÉüÐ?/È× À3HÄpÃF† Ö¤L笇œ¨õÎÎJ//µ»‡ÂÞ±ÚÙµÐÃëÆÁÃçÒÇNì>}²ílJë¹3gOuœ9=!gÚu´>O»~Uuæl3ÆÙӭ؃>JëÄ8—Öq.­ýlZ vArJçéïÜ5äêqË݃KuåÚQKÝ9Øþ]Ý%޳êœfñgQ NL3ˆ¤Ø„³ÙCàü€ð~&“úòùz!`xÂêµúÃL“£3LÎR]˜Ž®¥öŽ•$[ž­ÔÑ©ÅÅEEuÏrdÑæÝÚ·¿?9¹?5Y˜ MMl>•Ò’’¤Jþ°õÇP=E‘œ,ON–=E®åû“?]eI©âäqʇ2ìA©Ç;Ò;Ó°z¼õdRKò eò‰Î¤¤‘íQ}nž ªK™£k9Å™AqeR=¸Ž|;‘‹“ÔŽÈ1Ÿ~ÉÈ`ÿ ãMþ1àü€ð~&úòùzQ`x*Â`Î"Î}H&ä:¹°]Ëì©56v<’L®§P$ö|{û"ÿ€²˜˜Þ„Ã=)I]‡âÄ'Ž6¦žPKPKPþŠ'm>v´I‡TW›õ'áXSB¢»1ñˆ"ñH ÆñÃÊÄ#Ê[±§$è?<±­×ûp•íà\fïÂ"9Ø9UÉUvö"/G ßžÌ25L1@[M _æcqÁø?àüü<ýÐ?/È× ÿÜÿï;ø9ðúÒã­64<6¥ÛQÊÉ”R’])‰RE¢Ômx¶Zj)¶œYöE~s+¶†÷ìÛÛ{`KbBë‘ÉÇä‡âšTLHóóL|ñ¿£Š;¨zò}â›â5ŒoÀêáÅî}²˜Øö¸øûÛ£î;S lm íí8dÛ*²mÍSj±Ík÷oS·ÈFè B[-L?àü€ð3 üÐ?/È×K€qÌþ:-ûD{âdÛ£¥Q1±ÆÖ­ër°c’­ lÉå6d.‰, aÕ¦ú{´oaSéhW9}<Å,w‚ð~Àø™~èÈäë%€`Å®˜›½cd‡P*6þÉÕ"O.%+0ˆÖ•Dë ’5‡DdÙ™$BÖ;«wEõÆìl‰Ü&ŒŽnßÎÛ±CµCµ£^¿ú”(©^5ª)j»\ ¶Ø!‰ÜY¹‹÷„hqèVqxdkôî{ÁÁu$ë\,ÀDB ѺšH¨%+u¯ÀÁÀ^Hä¸8ÖZš_›Š!ôADD6ø?àü€Ÿ_´úòùz9`Xáæ¾Í`Êc“£–V™BñL‹b¡gͶėaà­8x«2‚U _DÄßÄͼ´ *jû@x˜,|K£l. ‹à…EÔb„nã…FÖo® WmÝ6èá^„·Ì¶Äåc[Õí¹B·ÿK/Á°Æ“ yÅO7Ž¢:m?àü€ðó‹ö@ÿ@¾ _/Ç«>\Ë’ÿÎhz”±q‘”gfV0Ã¬Ø Wdfyk¦üØÂœ3/ÂY0 –7± ÒÝ%?<¬wíZÉ–0鯼 jBB!!Â`³èElÚÜ %D²)D¸)”¿)”»1 ƒ¿1T¸v½xÃæÖ5kÛɶ7p8, ¼e±nÏX’‹fânÍÄ1µÕ¢{ 3S¦¥yB‰V‡¦My;ëºü€ð~ÀÏ/Ôýù‚|½4ÿÿÿìûs”ÕÇŸsÎ{ÝìnH6‰QAä&DA®¹‚$\*-u:VEmgꌵ£UÇ:¶VA Én²ûî%{K6÷+ Õ^lû'ô·þ}ÎÙ$I6ÄÑÑ}f>óÌ» y÷œï|¿?|çì›z8pð†yàT‘ë#Û¾ä.Š{¼Ë³<Ž]CŠ\ˆÛs»œž_‰QyËþÆ¿Øí©§¾>z|ôèƒ'ŽÍcWæÃµcǾ”¿vìÄØ±#GŸVàÅ—GŽþõèñÿÔÔŒ/hòzÛ¼§Øƒ ÆeÇl·c»ƒEp/^wÜÔ.¹Œ ñ[?Ѹ÷=Ò‡ô!}HÒ'Oõ!È?”/Ê×w¦Ð @ù¶õ,Àoнç¹hÒôˆåê2íˆé ÊiGl+Џ¬ˆËr,³µÄë/)n^½*ÑØx}ÿk‡vuß¾C‡F~Hƺ¢À‹‘ƒ‡‡ÄyàðÈ¡#×ö¼¾ïÐ7K—aqo²­VÓl·Ì°mElÛ±ívÛå7%í¦íà^0ÆoqÛç^5g¼Þ#¤éCú>¤OžêC(_”¯ïL¡€½:Ñ6ß/)nµ¬€xT7Ý ªé˜F± Ç2‚ouŠ=-% .64ü³~ûèáÃÿص{¨±a¤±qè‡oÞ0ÖØ0޳¡q¤aï²gïÈž½c{÷_|ï×»¾))m¶¬&]kæ¼³€i8¦4M¿iµêöe§ÚŽà¸ S» kïšÆË Ÿžý†ô!}HÒ‡ôÉG}òå‹òõÝò£¯àGäÔs¡Òâ^()þ\Mͦ•z˜X«š~Iü‚µ|ð °O**Û·TïÞýU]ýÈ®]£íܹc`Çö~/ðå®Ç†¾/jjzwîݳçÊã××÷m«éÙVÓW[7¼ïà¿×o¼cag>çü2º C€ƒŸ±Æ¿qpÊíà: pàmKÍã>U]ëŒô!}HÒ‡ôùiêCä†üCù¢|妠 À†µ§uxàU[ÿ pY7“L‹Ì€€`• ç¼ÞËËWtoÙz}Ç®¿Õ×Ö×ÖÕ ÔV÷×lëÉàËêÁºÚ‘úº‘ºÚášÚáêš¡ÚÚ±Úí×7n_zÊ径ë¸(„;.ºœKŒµ2vIº2CphøÃiÁŸ_õÀ¤éCú>¤OÞéCä†üCù¢|妠 €!Ž`ýÕàWÕ6Àõ(@»ô=ºK$dБ…³v¬˜œ·¡±¿èöøW¬¬ßþ¯­›G·l@6oêß´±Ùøh/’½ž‰žy±mëÞ|ãÆM›·n«Þvukõ—[¶~uWeÔ#ÿ¸Ýy€®¹pÐåB\.X–`Œ†¹ƒñ¨©'4Þð€7ž-õ½Žþô!}HÒ‡ôÉ/}ˆÜ(_”¯ÜnpBÿeð„K?í6?ÓY3:)„.‘7 cZ‚ ª°®·Ë&vÉ狯©º²níÐúu}étýN¼^÷pÏÚ‡2¬í…̼ÀÛâ=×>Ü»aýðæMW7n¸ZU5²|y¿e·ryrwݼ]Ãv+" °憙*ÁÊýˆèzRA&Küû/ ýÔ[¿'}HÒ‡ô!}òH"7äÊåkN ·¼yzÐc>ç1ÿ Ãm†a< Ъ¼Òú­ÈlÈx8ò)ðëFÔ°"ÀBGV,ˬ^™~pufíƒ}ë긪¯×¬êzhMÏÌTuÏ‹ª5]Uk2Va®FÖ®_¹rpÑI»C¹N™XÞ.´°Ð¢j Ø€c˜µr?ð Ã-„…ˆ 6ôVCÿà5Æ_zòd;éCú>¤é“Gú¹!ÿP¾(_sR¸àÈ¡s^óe.O‚þ„¾×EDX~WL´ÍË2èÐô˜íJéF'b, åeN墎¥‹ã+—¥V¯ìY½²{Õòî÷'X‘y`E×LIÝþ\vbù²äÊåÝ«VôÞw_¦|aܶðs›úžwpá õ•û£j…€¸q¡[àã4Œ€iÚ;Lüº~ÇŸIÒ‡ô!}HŸ<Ò‡È ù‡òEùš“Â-ÖýN‡çN|ªAH0 @ŒðæYVDIŸ1“ÏË£¥äÓ'Šìóe¥þÊ gɽ‰ûÇß¿§2‚×Kîíœiv.Y½ý‰·º÷nœ±EåŽ×0Ëœ_Æâ«žwqdëe‘ÉåÉrHjÌž‚©Ç_Zo€ah;t½]7Îiú»¯¬®zô!}HÒ‡ôÉ#}ˆÜ(_”¯9)ܰtÉ ¿x»HkóZ)yf¤E„…º¤~cÔÔ³/Ø#³Æ’&3Œ”®§‚™„Nõå¹3Ÿ¹ÌË¥%áŠòDEE¢¢¼³¼¸Av†s€Ê»_!}HÒ‡ô!}òH"7äÊåkN ·,,û…€9¼¯A“ÆÂKpžUR…Ý v è¡ßQÎ rè_²¬4éóÅË|q_Y¬ÌS3ê+ Ï8K}ޝ4‚³TR¹`ATçAGt,ŒMá²æFg\ƒ$ƒ ƒ®‰…1¿ ÇÒŒ´ @XAM»ðÀk–uÒq®‘>¤éCú>ù¢‘òå‹ò5'…[Ê|Є–ÒXг.uB”µÑ<iµN¼×yÒÔ“–‘´Í„Çò¸ЏÇ›$’·;Œ9¸bïÄå!’Y¸¬¹‰YÖ“bЋP^)ëcÓÕ„cÈÇç?`ð†e=ݸBú>¤éCúä‹>DnÈ?”/Êלn𕞼9]œu¤@z(9/@zM) Š65D 3`ê C‹ZÌÐ#†î(B“8¹ÑµPYUyÛ9.Î’=äše=Ó–‡_2Xî5½Gm°ï9=-ÍC¤éCú>¤O¾èCä†üCù¢|ÍIá€Ò’ŸO @LƒnÎÐie‘Ÿi¦&WÖTNMaFð¶Ù+ytÅC yL¦Þ‰Ý 6Ý©ëì!—"[gÀlëáÐÇ÷¢NôxPÁr¯iý]€)å1ƒ_øÁ[€ ç{HÒ‡ô!}HŸ|Ñ‡È ù‡òEùš“.¥OM YÈßÕƒ¾é›.ƒy g–Ìä÷ÏðÍ4ç)ΊN.bàµjÛ·"x™z©î#¹õœëéž @J>à ëL‘6 Ћÿ“fð€T~ùÙÙ4éCú>¤é“/ú¹!ÿP¾(_sR¸Àç{òæ i†`ÂÇ]·=3ýLÚ ×­RÔ•5´àÝB¤I ¾ä½‚õ 6ø­©ñ!àœzGݹ«¹ @ÏÔçªH϶ýBî"ÍX8f < ,£‰1µÁ% Þ:€3Ÿ&IÒ‡ô!}HŸ|Ñ‡È ù‡òEùš“Â-ee'œâð® @R“Vˆd­œ™l´sNtó0†a0˜P6Ójq×42êþÈà·&ÞGù~Xù~hêý‰ @ßÔçN»ÿLë‘è—ŸÅ’ò/_àdø#°k#}ò‹z7ðôŒ }HÒ‡ô!}~šú¹!ÿP¾(_sR¸àŽ…Ç{–Ã;ò;påcå¤þۛ趄Ã(›èÐ} ŒA¿šY2Óèö¯7æTÔL½?уe2{'{¶<­›}=ƒb"Ãiåþ´ºÖëëc2 øÁë–uòìÙéCú>¤é“/ú¹!ÿP¾(_sòÿÿìÙoTUÇ¿çœ{çδÐE¢o†`õA¼ð  5bQ#&RIJ#aßB°,Œ¨„Ý…  [Ê&°Li§3ít¡¥­€ Ÿü'<çÜ™ÒV™™Öf˜oòÉÉtÚ™žùäû}øåžÛæïPòô,à#`eQÁ!Wž¶÷ŒëøF$böNÌåÌÖËv¬¼b³å?ÿ‹Ë}éý”kíG˜ô‡U¢Ãç!ÎÚÊé=TÝf%êlsô‡Ý|,~lÄì#G¢ôC?ôC?ô“+~Hj˜ö‹ýJKþ/[«ät`¹Â^eþô•k$âžÛhC|9Ü´k8™þê^èG¸ïz±×dœ–žšeºa&òÄŸ|ý{£ uöØ)ÝJé,zr䂊Š:ú¡ú¡úÉ?$5ÌûÅ~¥%€¹ z^©ÀJà+%* Üji"RïJ]€D¥¹–Éjˆ¤£êÞª_%.A^ÈýÃæ%™îG J"â˜Õœ¥â’0û¢0Ñ1={î)…®W.yϽ°ìüùfú¡ú¡úÉ?$5ÌûÅ~¥%€oh¦½uÀvW( DôlSµTõî}×¢“¶±Îp¯š¥_…¹Šu•¶ Ÿõ@­þhöÜÛ VB–¾8v ýÐýÐýä’æ‡ýb¿Ò’¿€ùðxÓuW„¼=æÿÕ‰°4¹#—ˆ­A†kj¢}‰$9‘Ì÷#LôcbÒ4Á Ä"1þ6Úµ&äVºÎa ˜¼÷ÆÛ›é‡~è‡~è'·üÔ0?ìû•¦#|!EÓ€……¡=®s 8ç©z‰=& ˆ „š” è­þ/µ q׬1eNõib Mv® +uX Ì”ÁwgÎýŽ~è‡~è‡~rËI óÃ~±_©Éë`Âë;¤úÔ lw”žÏ„Ìí/µöN‘¸ðk ‰T÷åþ0¯ŠÛDfÈ@6ƒÚdâÊv@ôóMÍ0ï-*¸¢Ô~`³y|ÆÆ/.ÐýÐýÐOnù!©a~Ø/ö+5y=¬+¯.:×Qå®ó=pÌ ÔÂ\0jÖ™ƒ +ú§6Þ?—}†àØÄ=ñÚÞøoÒ”1 É_)ªWúý ÀŒ¿~"EE•޳XZ6ò™²ý?Åé‡~è‡~è'·üÔ0?ìû•š¼42ðð °ÞõŽ9ªÊÞ&ÒaÎÀI{S¹¬„Ð"É›H®ÚµÚµ1yTÎÿnýMKãÉä={¨“朹&y6®Îî\S¥œjÇ=éwCËî¤W_[~ú—&ú¡ú¡úÉ9?$5ÌûÅ~¥ ߀gGÏ3MƒnðpN‰6)º!âPÕ÷5þÙ\¸.ÐæÊþE.˜“sMY‚ž˜íe/súMOðµ ͺ´õÊ‹õ3°(V<ùã[é‡~è‡~è'ýæ‡ýb¿M¾KV‡35Z ±⬫ÚëfÀÕС·WÁìƒx²:ú×’hð¯je_jý£oöS4˜è‹³ª'–òG˜¿þûNIÉŒ-[ŽÓýÐýÐO.ú!ÌûÅ~ š|4CŠ?ð —› /ÙK`&åö"W³TC¯|ûhKÀ? ÖóÝælXõ®¤é@ÏÆZLúŸ(&ä9eü-¦Œ{eåá£ú¡ú¡úÉQ?„ùa¿Ø¯ÁÁ`üKc?¦k‚“@XAÁI:`¾l5?I­÷ðŸéÁæA¯- ­ÊÏ“,&!ˆNv’ßÌgvvß<ûîæ3ßï¿yßw_¾dáâ¬øݸø :°„a³Í?vE¶@@ À‘Å*^`Ç ® h =˜3öÔÿ©míwœR,gæà—çïußýÏ u6ù!?ä‡üŸ¦ä‡ üP¿¨_· uè?pÐÉñv}óò¼MÀs¯wõLìõêÊU›Éù!?ä‡ü41?å‡úEýj84\Ϩ²¢†`¿yŒ›ì1cePÄ‘ÇØ)ˆ£YQ[õ ¹8aÒ}äx;-g%0èç‹ëùèãCþüú^üN~Èù!?ä':ý”òCýj 4\Ï¢ûÚ¨ ›³ øÐü¶TD™@W‰—'`u 2""ÈY®ˆ8ÏqÜlf2Á×ÍFx1ïàåá£ænÚ¾ƒüòC~ÈO“ôCP~Èõ«ÐpƤíŒmù’ê€doZØ#»<À« À‚9:ú +V.düFYD°u Ö¡þLë5E†‚Èâ@„¯~ZãÙ'¤Ü ¼ ÌÒÀûïž”žÉ“ß^°–üòC~ÈOöCP~Èõ«!Ðpcžè: ¬»%RÍ£—ø­=¢æ¶¹\– ç ÐMðòô'º5päEÈ—šB‰D±DØPÆæ12äGÈ‹¨Åµje9CCX?g§;Y -x¾c•Úê+± H-°Y®Ä^]¾ÀiŒ'·j÷t÷įÏ\H~Èù!?ä§Éû!(?ä‡úuKh¸)]»Žžl7ÆgÍþfcWœŽ{ž¹ì=äƒçÁ ÂÍ7§Áå׆‰.7à‘0B¬¦ ו¡ö® ÍJ•þ*†2³>ÀØ)CõOðæ«ÜòÍˉÃ6¶H̘àw´oß³ããϧ½6{[f&ù!?ä‡üŸæà‡ üêWýÐP:M0Äü˜%°6!öpœ?à¹!Ë-/ÖC0‚ÂW}|5!CíLëQ¸º‘Gi ¡¸.¡º/õÐ{6A¿¶“êè@Ê)!Žv@òmRù#ðB»výë2dìä9»>$?ä‡üòÓ|ü”òCýªnÁÏNzǺä˜ ,“ì}Éšûcçšä•8îy " Tm+++r CP/ÐËêçL ¬TïiônUîK9*8*«û££Wäøœ,ÏÝ%äFÆUúGX¬OëÖ½éH¢ÌA•~×É_ LWßì·mÚvïøØ ãg®ÏØN~Èù!?ä§yú!(?䇸!44ˆÄĹ­[§¿&ú¬åñ^¦Ä '|¢ˆé#S*ôç¾R3¿ò}°LeW‡8XCõ8{m¢½iL7ôÔÛ‹ô~Xi¤g*Jäù¬#6ß¼ Œƒ%¶ýîSvé;vJúºí[Èù!?ä‡ü4g?DýP~ÈO󄀆2jôúíS€d`DŒ³ˆc5°5NõôÏQ…Á*Áª4ø\ÃjS^©å†0D¢Ð2ùV„ e†pó'µž›7òjÊ K”Ø,_â¸+÷{r3ð`ð|‹Výïùaßn=R§LO'?ä‡üòC~ˆ[Bù!?ÍnƒÕkòü©>%Îá̶±$F¨ðm•â$ã…Œ‡/a¬ ¬Ü”A5áb ìçMt˜É½^¯3­ÞRÎÔÜÌ*õs½E7Á¬)«Ù›ê˜Ú"ò…8m‹ãŽÜ/ØvÏ~בoÃgüñ=~üÐà§Ÿ•öÚÌ­™[Éù!?ä‡ü¢!P~ÈOsƒ€Û&9i¡@’ƒWbí©ÀTEÀ&igyþlÆ›ëcòÕ ”Úò púdµ ú »j^ž«>@Æõ©rú`jNh» q‰á¼ÙRÁPÎy…-*lë¼yË9‹—{nÈçËvÝ}‚o16 r¼>m:$?ôpJê°™ï,[G~Èù!?ä‡ü· å‡ü4hø:,^hÓª?ï¨Ñs(ðWð÷l7Ãv>°ä^)³Ïr%;#qV°‹’!Å¥øƒêÀ%óŸKýxQâ²Àe‰+W,\UOdÍ_+%«°y¹‚£\ Äæ§]ëee0± x ¼Èdß-ŸýÁ}ý»%Ž7yþšõ;]ù!?ä‡üŸ¨õCÔå‡ü4høú za)ЩeÜ`˯Fa`šnÔÆ÷ßçd‡€ ˆë[ÙUé¸ó+®øÂ çýxÉ1¹wpÕÒÝÐçÏITY¨òx…+Ïød‰Ï*ô‹<joÛÅæ:÷ÑÜJuüý|q=ïºûÙŽ_Ny)ýÅ›]ù!?ä‡üD 䇸(?ä§ÉCÀò«§þäí9,•ËÑŒMfH¾´eüÎV-$ÄqOZúÚŸô½3l„M‰ƒ°ƒ2C¹z´õµ=Ïa§%ŽŸ»Kl–XÉõuîjç©Bö‰‰ïѪͯöÈ ÞÏMš–þ ›÷4ºòC~Èù‰6Èq'P~ÈO†€o†”!k¾“tqÝ ãŸŒæþ)°Ñ;]ëÏÙë÷Xl·…}†>5T®øÄ•{ù[f¾±ÕÀr`ž…iRï-…!ÉçûÍ÷ïNêØùÅ^É#§ÏZñ¯ »ý'?ä‡üŸh†üwå‡ü4Ihø&y#=óŸ S5z´ˆ-ùX†É3,ë-¿o‰ç-el¡ ´à+[)±J°U«[mW ÷зܛ TWh¤yõ­øzµmtï½}žøÅW†ÎX¼dc£ÿ³ä‡üŸ¨‚üâÛƒòC~šÿÿÿìÝLÔuÇñ÷Ý÷Ž»„4 6[¥4[šš ¥%¤–KãGàL¤ãàù¡&‚? uº Æ9Å6-mÕ쇚YY–?2R´DÁŽûý9~ŠŸîZ¶Úr­6;ô^Ûc·Û÷{Üç¹ïŸ÷Ýwûb¸+äYÃB!Á ¡ “h©ë"æñV EkˆV­‹ûÏ2~9W~ûu½h= Wº>L”F”B¢TŸ€…C’Gž?{fNAþ¶êš=éñÕ¡ú Ï@†>èw®ô¹?`¸»vìlNOÿè¹i›#ž,ž;(pÑ<¾ ñ¶ä?Iô‘$‰ýã'„>²ðégsæÄoÌÈ©]Y²o÷ž#‡ŸðøZÐ}ôAôOÁõƒ>÷4 ÿ«ýNV)?++ßWRZ[X¤ÌÎÞ*“mÎÌÜâz“›W±ºdwYùÞmoÜûîñ#Gë=þmÑg AôAô ×úÜ[0x ^€ÁàE0x ^ÀW©üîuÙÎÙsÊ¢glŒœ¸fÌãŠðiáa "Æ,U8sfqÑòý[+yü{¢üÀ¿ Tž?¿&ôáED/½,ñI‰¥p”Îw?þv1‘ëÔ|¢T×A¥Åóù œ@ÊçâIŽÙ^±MíñU 7ÃðÏ —í¡òOu?Ô–ø ²‚ý‹¬ò+”pr¥ ørN r N%ä²øœœãeOî+Î ó¼\>?ׇ+àQ>‘ܵý}âѲ¥ï{|]èã…0ÜÑÖm_O˜Gô’k_+&ÅPÿ ~´VB¥* –<²ö‰G6Mxª22²*jjEÔ o??cû´˜êéÑ»¦¾°;rꮉ‘µc"”Þ12|{pðŽÖ•òè-‘`QGÙ¸±ëוžöøJÑÇ{`øKdïŒ_B--´Š(‡hÙ Þ¦°š¨§§Æž“¥]§Ÿ)]Y`_ÇO?±ó ìÂUÖ fMZ·KÍî#gëY¥Ò^ºN“!»˜xêåÙ'&O:>bw€ß–!•åò)“H0(E‘}Ðã«Fo€à/ŠV|ÂÌáѱèM‘kZ$æJYûÒôo^‹­Sd\Y_¬Û¿÷f}sØÙ^ÖÕÅL6fr0k'ëècÝ·X×Mví:3·3½…õÜ`=½Ìjc?þÈjw][^P—¶à‹$éWÓ¦Vëï»A".á(ï·»äS‡?(“g~èñèsÃð»;›žŒXNïç›K¿ÝŽâç[ùU|\4îDvö¹ÕŽ‹™FÜNÖÙÍlv¦3Ü2oZíýf{¯¥£¯½³¿½‡u¸N9™ÅÞ¯·Ü2[™ZÇ´ZÖÞáÞ  ìË£ÎÊ­qÒc ÉççÎýaüø‚ØDî=®œG2×67tx†RyÑã5Ðç~…ÀmÖ¬M/Ž(Mྛ%/,ôÃgž9=ë•ziR]NÁ…=ïÙë¯0³“]ëc†ö^•Ö¬j3ê N‹­Ïjé7êo˜ 7MÆ>³¡Ïlê5»ÆN£þšÁà°YºM¦.½¶C«q´½k·º¿Òʶ(;RNH“Ï$%ý9éØð¡»%›ùT  78ŠŽ.÷xô¹/aoWQõý¨Q2¢‘0WHÅA~•ãÆ~;·1&úÔœW¯*Q}~œ©MLcc—Û,-“ÚªU[4-:ÍÕ½ªÅªÑöZĮ́í×·ÝжöhZ»4­NÚ¡Ó´ëµ½ÎfÐÛ]t»¶Íæ:hÔ;M&öK38Ø©:¶¬¨>:æãØygãæ6Lžðí°ªÅü21WH$ zmGõ9ôà}î9À«¥e¾K¼8‰oÑ2IÕ¨ðC1ÓUÉÒ¶Wf}šŸsòƒ=—X«šýÜÀ.^꺪îjR;šÔ6•K«CÕêTµt«šûšwý¶n·–Î;jînlêiÓ0³•56±š]bÒ¡Ó?ŸwivLãÄqg$‚*¢ü€5"á’Øy{ÐgÀö¹ý ÿÿìÝyTSWð‹ "Z’@!ì›FDÔBePÛÚvF«ÕÚŽ"¢€ŠŠˆ.€¸´‚ŽZ­¨P„„%ìI !@ÈÂ’°#‹Š .­mOÛiæ%ÕéØéiiv ¿s>çwî}¼Ç½ïû×ý4½Ü½¶°Æhò>„¢(6¬~Í Ú–¼Þ½0@#£göÖU«åê¦Fu{;výZ*R¶<|æ±Rõ¹Rõ…Rõ¥ÖϦ¿\UªÇÝ]šoK¥MMßÈäê,Æ“°0é<ßÂ÷Þí ðkî"r¢”"„m,t¢áöùóŽC>Â|þ¢ À(eJZj0ñC„ÖMLvvb-ýû-¿WÅ %KÞ¬ n¨(U ùÿ–׫•MêÅwÉg’úûrŰT~ï)ÙT6,•=J?ÓÀßOGPe²!Uópƒ| ºº¯ZüPÕªV4©/_ùfãÆ¦¿-ýã­®×[.hrµ»A&œFšïÁ\nk³òùSåó× FfA«Ñä7'L\;FÛxÃ$÷âEÍ åo¼)ö`¯Y_S%RËeêêªï„•_I%ßÕK¾î ªúdò5âÛZwµjjî×Ô<Ѓ#%‹n7)5( „C|Áç¢Z5¯R«^µRúÆbIàé\Ñ[¯+¼©d³„‚Ç å8ÓÏŸ!Ÿ¿:h0ºd1äù!´ÜÈhŸþØc>^uþóZ°ºüÝöEËV²‹9êRÞw¼›_WW+~U^1Èá ˆë×ÔݯàuUŠú4„ý•Â;•Âʪ¡ÊªamÔLG¦ªj€_Ñ_#Wßïó«Þ}é¹õ'Ô‹•Ïñ)ö›_å?O4Ç‹3ß›7yü}Ž7G(‘Ýùüùèh0ºL0 @è QcЪ›p®wÛûË¿žã-ññ)]òû_òÊ3‹úË9¸ÜG\ÞC÷>?ÈÜãòûK+:97{´ú8¼ÛØÁ—ÃÄnÐTlÌ»3B<îÀMÎ`YqIqfZ9TÆ.á|QÆS—”©£cºýýØ ¯Í¯~s¡j®W—GOóoqÃðS"Z ùüùèh0Š˜à–›¬3·] xµeþì.¯émÎ’E;¾¬)/«T—ðïqûÊ8ƒ,Vo^~/—7Œ^™y-ÌÞ,ì€è§t´æúÍVÍrà&Ch»‘ácã—õYÈg4€£…ç¬ãôßCh­¡AÂ,j¥Ÿo§¿ïmoj»¯w“ïlþkW2¾Íʤ³Ú¬¦ë U^^_Aa?#»5‹ÞÌdu°»Xùí̼6lÌdu1Y·˜Ì>&ó63÷®¦2{4WFˆÙ—Ÿ;ÄÌÈÉÑ,QRÞ_Tv+'¿Æh¡eõæ©Oœ¸ï;'g¶'Ç×K0¯Ïß§þ¬?ŸF„â'Äèé­21] ùüÎùè h0*,ZœL$íD(xò¤$Ç|ª»ÈsZÃÞ*OjÕ̬‡.§?ÉȺy£-ýš”žÝNÏî¢gwhµ?¯Có#Æ-:£—Îè£Óokªf|kÄzY÷4è} F#[EÏiÄdå¨hôÎLƃëYꈈ.G Ýdz~–{Ë —NŸéݳ<š<§ Æ&"b0~Õœy‘Ïï–.º/*:k²ñ¦±cwM2Jv²Ïõñª›I•»»ÔO÷¨Ÿã-æQäï_|äèpÚ¥™×îf\ïH§5Ñ2[hm?xnÚAËè¤Ñºµzh´>míÖ\!ZOFú«=´ŽŒ eF¦‚vMF»¦¸šÙ’I¿w5ã«=ѽžÔB/j­§{+Õ¹söô¾YÓZ½fÈHf4쌎PѤ‘Q× Ÿß! tÜ¥ôZSÜ „Öêé%ͯ»ºò<ÜÄ®.uînõ3fÖzÎâ;9_[±²*åô£OÎߣÑî]¹rëòåö‹[ž“¦üŸi›VÇSŸvjüw:šGºµ°ÛÒ.6§¥)Ò.I/^’]JW¦göŸ¿8œ4¼8P8Ý•ïé¡ôpn9­ƒêÑL&wqäÚN½¦?.¡e&-˼®‚|^j>ºè8*uB+Úebšî`_ao/°¶ª¤ØŠÜ\%Ô5Ó¨Evi¡aÍç/|™zª÷ÒÅ»Îu}úIçÙ3ª³g•?®?h}qTçÎ(Ïm8wV†9¡1íRwJjßÇ)OV¯Vº8S=.N w7¹›k½“c»›ÈÕ©œhv^O/¡¥®náÏKÍG÷@]ÏÓCËŒ # ZZ纹‰k)vG'96°¥”º¸åÙ9|º;ºûÜ'Ÿ}t¼ëÌ©îS·=Õq*¥55U•šú£ú#ªßîT3æTª [èôÉÖÓ)ª3)§SN¥6ž9Óž|´=åô“nG–‡{5v®¥8ðìø¾««ØÑá¦M¡¥yB[Zž ù¼¤|t4ÐeDB¡þVýX3bšµ]>vF´¥TÛÙÉ]]UNÎ2+›2;‡g׫{bzN¦ =ÒvìHӉį“Ç[NU?ö³Ž7k5>¯ydUqüD=æÄ±Fl¡’[0'“•'“›O$7`7$$¶ûèÁÖ°^çNΊǒR`ãÄÆöïà$²™Zi;•7•œc wpœ^Ù<ˆÅê…|^F>: è¬åïFèýW ÷O4Yü¾Ìyü>ùáøFl•C»¢cºƒ7u8»åL¥°¬í ­ì™DëlKÛ©ÔÒªÊÕ¹Á†Ì³"1ôõÐFCýßòµ÷Ïè tÓ«  ´\_?n J±$‘ÈDË"¹”H.'™s-4*Èì©V¹ž3Š7µïÜѱ{WC|lã¾˜Úø8éÞ¨ú={d?«þy?óÿSDíQ<ý=ÑuQ{k÷D×`5&V¶m§$"²9*úîæÐ»v”l ‹+K6É¢”dQþL¶yÍþÍ‹qSÒÚƒÐÆys!Ÿ˜ƒº GØ ýÐ8œ)ƒlÅ%š—ÈE‹2¢y™9IÂTbažoežíhŸýájÕ¶°Î;”‘‘’=»Å»vWïØ!Þ±£nÇöúÕHGT·É·ooÒ’oßQ±S±«RcgÕö(Éæpqh„2r÷àÊ•­Ö– ’Y¶©ÈœÄ!’øD¬š—}Oóæ%6–%cÑÇcQÞd+äóóÑaÐ@…E\GèmÃ(„’,±s-© O`ãHxB1†`VB0+&𱉦AÄ_z{ImXhGÄÖ†M‚ðpÁæÍÜ-[ªB·ˆB·T¬>*Q ­ Ý,ÕÀ[D![+C¸O… ×m…4†o»ãçWI4ËÄè|>Á¬Œ€¯ÀJ´¯ÀÆ`¯@ °ím*L&_‹ö"´*88òy!ùè6h ƒ6éù`¼á~Ó4<>ï•)yÆø|c3– ®ƒ3eãL ñ¦ùx\.wÝø•ó¾³KC7w­—­¯ æ­[W´‘$ø5„¿FuІZ l$XÌ]\Y·‰».˜¿zMåÚ ÅÆM=ÎN¹8“tã,l«Ú=k÷Ÿo‚gap¸|Œ.„¿†Pô„ñ¡Û Ï ÉG·ýÿÿìÝÙs[Õðß9çn’µØ’‰c !‹ Y½%!!v6OÒ8{LJÚ™2C ÐR–¡ -…@HŒwI–®®d-Þ÷%q\èÚéô­/}ëÑsŽlÇ!v%ð"ÿf>ó›+}uÎïé{Μ+á!„B™¦¾ñ†ªWi¶óºþÞ‚¼ ÃÉr$Ù1GNÔéNpnWÒíJd»bÙn+7'”ãª/\f>ößÕÕ?=ûí©SÃ'OÔÔŒÕÔ\KÙñtLœ>óP3qºæÚéçFN?7tê,7rê¹kÕ'®Ÿ<óÏ#ÕÿZ˜ïËÎæ7ìÍIÊ1ó¤sfGÙ–¨îŸ…Ãn帿ñ¸ßTè¾Æ¦ï°?÷ÙŸŒ‡ „Beš§éÇÎeÙ?±ÙêY1§«ËpD §iËŠrYö6Îa:ìf¶³Õ›ã[”׸¿ò/öŸ<ùmõ±‘ê#ǦçèÕtŒ=z]86~ôøèÑãÃÕ'†$~qýpõŸªý£¤dÌ]çrµ¸œ¦ÛÉ̇µ9L›#8)Ëâsq9bºRo×>ÕØ/z¤rïØŸûìOÆÃB!„2MÞ‚ã6ã€_¸]—)«ST˰wè6K·EµY6#ÂÙ Ën˜†Þœãòå¸V¯ŠWVNì?0~è'×öí믪þ1VU]•øÅðÁCC ðzàÐpÕáñý'öUÝXº<’娳ͺ0ô°Í°l6Óf Øì>]è6“Ï…Çt6:l—^×µç]®ÃØŸûìOÆÃB!„2 À^•¾lÓ?Ìq7FÀ4¢ê¦ªe5u-ÌšihA…6;²üngcNvmEÅßÊ·:ô×]»++†++,ü棕c¼VTWìäöìÞ³wtïþ‰g÷~»»âFާÁ0êT¥ÒJüºfêzP×}ºÑ¬ÚšT^åtmå³Ð•+ªò¾®½ Pñù7°?÷ÓŸŒ‡ „Be”s/†<îóçsÜ_)¬ A7’Lñi–ÕGÀ?ÅÇH Àןù,¿ °¥xl÷îoÊʇwíyfçÀÎý;¶÷qü‚¿ÜõÌ।¤gçΑ={®>ûìXyyï¶’îm%½¥eCûþ}ýÆ´öÀW”6ñt ÐBÁOÁGH#¡_«^ÅtøZ5bP 𮡾átœ+.¾Ó)ìÏû3à!„BeÃÚ *<ðºMýŠD€&UOÅš#àúñËŒ{à’ËÕ´¢°sËÖ‰»þ\^6R^:PVÒ_ZÜW²­—WŽ¿ü¡””•—— —••”— ––Ž–nŸØ¸yl鲤ÝQÏÇP˘ÑVžb©à'¤™z‘n§.SS- S¸ÀèK«{ ûsÏý™p€B¡Œ¢±ÃçøH!—åÖµŸª€€Èµ<‚OÃ)”(‰´…GBkN_áªòíßmÝ<²es?·ySߦ½ÜƧ{¸ÔõlºÓ²më ¿ùÆý›6 lÝ:Z¼íÚÖâë[¶~ó`AÄ)~¼ö² ¸T RfòK!DÅ€Å&· ¸<æò°ÞJhDWã üàm€<Þבÿbî­?ó.B!”9Ìб«ú—*iàI1ÄS ¸¸%à¶Î¸A[ݪHH½×tuÝÚÁõëz7<Õ÷ôú~^ùõº'»×>ÑõÔÚž9t¥…ß–ßsí“=ÖmÞtmã†kEEÃ+Vô¶f*NæÔòt 4 ¨e0‹B˜ÈMn™n'.€¥ª …‰Ø¤ÿঞ{ç×cØŸ{èÏ< „BeŽ·/ 8õú{*\dТ©¡a€f™›¿pEöñ×OÁ‚OÕ"šaõ35èv[…Ë»V¯l|u×ÚÇ{×=Ñ÷dQ¿^³ªã‰5ݳ+êLKÑšŽ¢5]ñÜ<¼vÝØÊ•‹&œŽVÆÄ8E"§¦„™‘S0)DyÆ•#÷mˆŸB˜±#aMmÖÔOÞ ô•§ØŸ{èÏ< „BeŽÃU—\ú«Tœôø=ϵ*‹ ‹³à¬e΀ aqZ5j³'U­ ÀP›—k,j]º8¶ryrõÊîÕ+;W­è,\–x¬°ë±ÂŽÙ*—¼ûº|Y|ÅòÄÊ« {}´+oAÌfðÏ­c<×ÒVÊLmeºÈò€S F!t[À5ÆxÕ4¿n\bÊo ûyùŽ?`î¡?ó.B!”96¬û• /\ø\#<à†@óm˜#à†¥‘# ‹ŠïÃá‘Q<]z%Ëv9×ã+È7—<tqlññ‡ ,~½ä‘¶ÙjÛ’Å‘»¯üV<ÄktQžérùu­‰Ò&€ù<«)vµ‰55<1B ©S.òñÖæ›—ðPÞªªU»¤¨ï¼¶ºèMìÏ=ôgžÀB!„2ÇÒ%ç~ðn–Òâ2’âLˆb1ƒÄzùÓ϶†Èdp!RÓ’ªÚDÒm“‡ã/|i×›<9áü¼x~~…˜x–—O\¤TÜ‚‡^ÃþÜCæ \ „B(s,È=Ãàe *P§°Bâ”ÆÅV± ‚ä¦èmxF¼Yù;2Y)´2Ò˜øa,›ü¹Ù\O»×›Èõ$¼ÞX®7æÍæz£²F¼¹áY«Çkz=¯<+çxB¼fgGTT¨¥R‹‘0#ŽŠmìȬc# ÐE cr`Ä'.å5¤hí2à†T”Z€Þ0ŒÓ¦9ŽýI·?ó.B!”9r½“—AŒ IRÒ!O€¤bb@DÉ6~Á ¦Ò„®& -aÓãNGÒéˆK1§3:ź3‡#Ìee™“ìQ…¶ñáq )TlcÇçO’@ϸ2ˆd´å×?#àFfjâëq>"ð–aÔüW±?éögžÀB!„2‡×súÖ€ÛAI'@&7‰Ó"kòÐ)(¡KòŒ««qM‰iJTS-M5¥ÐóÎT%”"¶¢©¥8Ç =%uˆeŽñÌ ¸aq¸EdÜV –¢vË ¶ñ{Î ¸ ƒØŸtû3Oà!„B™Ã“sjFÀ*ÐI Ïí2&iÚ‰¬TFO™D“*Mpü¶©)âh IâŒ|'z;…¶M_§±H©ííYî\ã¡ÐKÏEžØ¡AÉÒ¦(}ÀS8j´àcïð€{år7ö'Ýþ̸@!„PæðxNNÜ&¾²›çB¹°CÆÜ4Èå”®©óåüÍvJ“”Æ¥6Ê¢“øµÜM¿£]ÜôKyáöwî8žÎ©€›ϼRS mÀS²2ÐÃÿ†'i6|"îÙ/¿hÇþ¤ÛŸy!„Ê^ï‰[.…ƒý0™S;îºvQèçôy²ì”)¹#Xíd¬]Jü%ía¤‘ïU…*´Ÿ×éwä{)é–·{úsåG´Ï5}LÌ¢Pžq£@Ût)lTN°[!q6OÜ‹Ÿ'°?éögžÀB!„2Gnîqç(¼/nBQr„TTíšÚ±þ¿•§Õ!Ž9©ˆœŠ¹3¶½;fè’÷ç¾Wù}d®’¹vpúýÉŒ ½ÓŸ;ãþ³GÜ>ñY$!~ÙŠWÂÿ…èq€a€^qÿfÀ­™5àbîÜŸyâÿÿìÝÛoT×ðoí}Μ,'M¬æ­Š¨Û‡¤j^S)QREU[%IÓRSj ‰!¤ŠRçRAÕ\J/QZ(ä„@@{Œ=žÇÆ7ŒM1IúÒ§þÝ{Ÿ9ƒí|ÆFªuæ“~ZÏxŽ÷¬§oo­3怈ˆˆ’ãö–ŸjiWè´3î•€›úàrªKŠçâU“&Ï }R9#?똘{ÎÕЙ9>óêµZ »îíÝÕç+çÜ6y£Ûiœë¯§GW2ú)—nO¹ëd=5ôÛ¤[ ¸»;ÓéŸïÝ{‚ý©µ?u‚"""JŽÖ¯m~ìhj8ì«Ýw˜xšS(¸&öÄ«=îØø¼ËŽáƒìé™oa´½a­Šµ±é6«+ý ä©ÍúÓþ¨–A—ŒÍ‡Ýüxîö–'ͳ?µö§Np@DDDÉqÿ¿Öê  CãÚ~µå9Á€B)ð‡]H퉂é¢5¥Ûþ9wìü:÷ä{QÕw=bOÜ+çôÑÌßÍk ÝˆË Á»Z›€»õ+wnîêdjíOà€ˆˆˆ’cÓæCAÐ&ؼ¥¥«ÁïW6ùÊܤ×޻ĩVn1}תy—tCËü²}KÜõúrž­vV^¤[ìà~6Ú–€‚FOàŸÐØçÊ{úîo¾pæÌ(ûSkê7DDD”üËðx:xØãëS9Á€Ky§oa0½n­•I¢Y[cÊΉыW±S:yyå2®Xæù0ÍGKI6ð?¼ ½ªíÞû^b–П:Á % ð}ßßž ØÿG+Yesm •8˜s17f½±ü|¹(°Æ—‹¿±Ñ¶à¡ lÒµÞR9Þvu ã÷úÞ x øñ÷~ðû³´þÔnˆˆˆ(QV5­¶4føÞ1àt ‡Ê@Q )Ôbà†jºÔr)5J¾­m§ö‚ ,q‡Ü«ÒY­ßvTúG6ý‰ýYZê7DDD”(ßùî^¥Ÿ R{<}8™±··Ý % cn•€Û?ßõ®}WÉ%ΘjY ŠQÀ-i—q•ežŒÂ^-ßÔp^ë÷€‘zòÖ/¯íwgÙŸ¥õ§p@DDD‰òrgÃêMžîô½?Ç‚TÑÝ$:j2%\ÅÂTZZ˜;çrþ÷yö ^d$¶rô§ãÒsÒm¸Øãí0àæššz=ï БYÝ~ç×Ûßû[‰ýYZê7DDD”4*õ0ð+à?8æé>wè”qWîKcT/Ä<ÈE7‰^p1qÜÕáh>|uÐýBX5\£8׬TvÌÝÞí;º•}Úë÷ü‚ôþtæ…”¿öÛu||j„ýYr"""Jš»îy Þ: ÃO¿œÖ2¡ä2¤Ý€„‡ÄcÀEÁ%ÁDx±ÀNƬ‚²k±Óí“Ô‹Pe¨Qˆ åC:ȉþ;ðÐvKó£¿\¿›ýYN"""Jšm/‡÷x*³ò.ä_O—ì¶É¸&Ôº)÷ \m/F·N­¬¼€[ GÛݧ(Ûh+c¶ê²—Ê*õWØo÷ÿakëú]»Ž³?ËéOâq@DDD ´ªùgAcðFcc·q±)Ö ±ŒºÈXž“_À;Üp½úêèJ¨fUÊfÜêÂÆlº­|¢‚¨ÓÚôo{àÁG>ȱ?ËìO²q@DDD ô­û~¬^J§>²“Àtd öÇqK¤8~MøLUøÌÿ»*ŒiŒkû`Ü-~ªBÆ´.ˆt)µxzõªŸ<Ñö{ögùýI6nˆˆˆ(v½YÖÀ”ênLM*̳À?œ—t'&ÚJ|¬_1Õ¬JcJaZÙ•Gë—áLf@«ÃnÀ}Ckkû«¯f–ߟd〈ˆˆ’é÷¼lÞö¥«Á+j ?‹Ì*sçd\uÁeÜððxÆ™ŠÎ’WB £íŒY¶ªdôi{ì-ù”> ìžonnä‘ÎŽÇoaê7DDD”LÏo?§õÆ[š÷ûNjŒ¹\ÜÏME%ã.¸Óî |6ʸÓ+£N‡Ñ6Œæ.éNjôôYà Щdãš5Ïl{î ûs³ú“`ÜQbµ´<Û^7)0í—|w¤­m´½\mnü·‰"ECÂTurøÜ\Ì.¯ŒzÙÝÒ:¥ÕU_Ìâ/†2AN«£Àn`Ë—nÛ¸öÑ݇õ±?7±?IÅ %Ö;{.y~›R[×ïhjL›ŒXÒ˜ññOÁï_p jÂ\mî%Øøø…sÕ%Ë++£^Q2kVëéY_͸ÿ{Õ›Nôd¿`§§Û¾º¦}Ëæ}ìÏÍíORýÿÿìÝkp”Õðÿ¹¼·Ý\ u:Õ/Î8¶ÓAg:S‘ª-TŒD ¨­‘„[€¶"T®V„Z¹SZÊý’P Ü$„Íî&ÙìfɹcÛsÎf1xûÒaóÌüæÝ7gÏnžOÿçÌÙ³ÔB!$•uìX<áØùÀ›À`»#Š=Q½W$èð^<æGôòv"àrpËŒÄ"wI¹JY ½Ú}܇v ¾Þ¶^(åàV­rºþdÄܹk¨>ÿ÷ú¤$j!„’Ê,*Îlу‹_*ã.fØdó]Q"(wd•Š`Ç!×nÈÜ’¦ÃìÈ?|l[g»˘ÙÜâùûÜwÿ3#_žEõ¹õIIÔB!$Å 2èìøò]ß<ÏYÍ̱÷>Qn¡JYŽã'!Š!Cƒ8 28Î4§Í·]z¾7©>©‡B!„¤¾ï?0DeA ßï_–æ{Ͳq9PÉdì4Ä1Èâ&pÕ'äâ¤Ù„óãí°œÀ` /£÷#]‡ÿáµÿõpªO³B !„BRßÂåû³ÚªŒ;lffÚVà}svd¹D\ œ«D+OÂ: ë8d DDˆ³2Ñdp^ê¸%Ì>ì_ 6å¥ ¹ÿ‡/Ž=gã¶íTŸ›ZŸC !„Bš…‚Âé-_PW²7,¬O“G\`(Ó—… Ju´U¬RXe!ð¯Êš5R~£Ð ¾9³ê1•Fyrp éËo¤”zöI)÷ïó€BðAß¾7·wΤ·ÞYMõ¹õI%ÔB!¤¹øi÷‰`=-‘Lû­½¢ág­Ê¸Œ ç,ÐI× êo”êøÛ€#˜–Z…DD¢J"fÄ9b† †pR0)ÐÈõ›jd C-CL?fg;•”v¬j[}$*Õ›•Iìs°ÁåïX¢ñœÖížì™=êµ ¨>·¬>)ƒB!„4#Ý»k™Qà³f¶±;CÇÙ 9Ö&„ÁƒpCpÃf›{¸1þ9p¹ ¸<pªŒkHº_»§ª0#Uº­gˆ›ñÆN‰#öÃ*×aó´TâˆÍóÆûÁíÛ÷îÔõÙÂWgmݹ“ês+듨 „BHóÒ¹óxó…×ß3Vg¥Éð<7b¹qð*½ÈðÕBŸ“1gV½Ôˆ¼É«Î¬@,©êF‘ŸÆÑ3› {}’D´-‡~—ÓBì ä[¥ÞÙR ð\»ví6|̤ÙE»ß§úÜúú¤j!„Òìüø¡B _ºû;Ž9ÀRÉÞ“ü8á^%˨ã^j“ÎÕê&XX%X9xÈ(3FHÐþÙÙ¬ZÏÆ+5=­ÊµÕµu‰|¬Ïà¥>§Øsw ¹q•nGY¬›6ýîòRÁÄ76n¿‰kÛTŸÔF !„Bš£Ÿ=ö:C?`¸dÓm±\b+°[à׉9R¥Ìà\Ra’.‹&ƒiȆcöÄkU£7ªþzQˆr-ñ*zë8Îs\To$÷DH¥[×)_LSŸ쉶wõìôèÐQãf¬+ÚFõ¹½õ¹£Q@!„f*;{N›6yÀ¯ >kY¦·Sb¯…“>QÉôÎjÏ)æšõiÕ›aT6Õ!5Ô ±\}}Åúk®É¾zõòJ=«NÜsuÕ‚>ë¨Í7oca`Ùw}ëñGº 3yúÚm›©>M¡>w.j!„Ò|Î_ס}.ŒJsr¬¶dÈcž>n2VV¯áS5V^§‰#¨0"&¿*1#nÄ’ÌŸÔxn^ÈâŒÅ$¢6 KœpåOnþŒžmÑzнßУWÞäiÓ©>Mª>w(j!„Ò¬­\~ £ÞòîðñfÙXœ&T¸Ü"Å)Æ+0e,Vc®Jº—°ë.˜¼«3.3¹V×™U½¤†A¥ä:ýXßÑI׌‰7̦2´º#ÂBœ±Å Gl›g¿ëȹÀHà)f¯<8ìɧF¾:cËÎ-TŸ¦VŸ;5„B!]sú.èëà7éö`ŠÀB`£´‹= ã'Ì÷_Ìŀj[^®@oF¿¨°kæéùÄ®·ÂëÍ*hذ~Qâ2Ãs§–¡†óZ[ÔÚÖó’ó¯ñ܈ÏWâºûß,dl0êxýÛvÈyð¡Ü¼3Þ^º–êÓ”ësg¡€B!D[´ жõ ;Ó ¼¼ ¾Æv‹lg—%÷IY,x P&ÙY‰s‚]’ü3)þ-ÅTƽ,pAàS©¯—$®\‘¸*pÕÂ5õ@6üµN²Z›×(5Q›Ÿq­Ã–UÄÄRàÀ+ÀóLhÑòéïÞ7¨Gö˜±“æ¯Z·ã¶‡ê“J¨ „BùÜÐç–[f ³¬qÀ`ªNºP7×þžÏ)¥@%×?U[¯ã,¿êŠÏ,\´pÞÑ×ˎɵ®Y:ûêýñõê=^ëʳ>õY~t¡fÛ,2çØäs+Ïñôeô¾ûž§;uy1÷…éo/ÚxÛ BõI=ÔB!„|ÑÏÿ½?} ä`°<.ó› ¼.ù’–™;Z·8˜•~,Í=eá”ÙúòIâ·±lD-ê æ nÔ¨«­ï¨ûA‡‘8|ìþ)±Ib×çØ¨Éó„쟖٫uÛ_üèá¡ýž™8uú_×oÚ{Ûë@õIIÔB!„|µÜ᫲Zõº¹îବq‚O €ÙÀ_€¿ l°Ä×Úå9ûüÞA‹í±°ß8hác㺺â#Wîsä¿lY$øzÆVË€y¦J=[.C_Ÿï—ß¹§o§.Ï÷ÉyeÚÌåÿX¿û¶ÿïTŸö_ÿÿìÝyL“gðßû¾-mAðÚÜ q™F3Ï º©³xÍLåœÈJ¡€ÊDðbjÄ j â¦NGt™:uNçæ1EE·9o±¥7©è@ñYëbâ_‹×V¥ß䓦yÛ?ú|Ó7¿çÛ·É‹ðoò>?ܽÇtû6—(¬©W¦ˆŸÅÑ<ž–ŠÅ_x¸¯—É6pÜ:û†Uà7 Üm¸­"Ú&pÛ>nÛÙrÜRwÑ?[䎟´·Úx½eTÇŽBäI)©K¿Z¿Ûé‹E>®à‰(wúû©šùªÄ¢¢©öM*ÇeŠ%sˆf¥?×Îñg>—ãr=Îw“Ì'q¦ýÍD±DÑ$‰qóšèÕ"ªS§ñÇ&§M_^¼z×Þ}G¾:äã:PžNaѵ¸¸ï XØ%«M@JïID£yÑØG¢3ÖM)õ óná×nâ;ï& [Ÿ\’™½qíº½{öqúZ Bx.›·]©þnAîÆìœ’ô uRÒ2…bIBBžýIJjþììµ r7,_±sÃׇöî+sú§E>€àBP\ € Ap!(.À… ü Ô?¬(>r|ð¢ Þs:wP´‰ ðŸØyj¿àô¡C³2fl^VpÀéŸù<9Ì/äóÊAø©Õ'Ç_í÷æ$¢ˆFÈÜ¢%’‰DÑÅñŽÛãM&²¿4ž(Æ~£h¢0žDá¼Ú¼Eœ À ³lù½z¥ ±磻jé¹ÐƒæÊ(GFÙÞâì7šÍíØnq¯nAA+ƒûçZñþàUBŠÊ×ô´6¨ÿšÞA%Õ:¶ Xåë›'Ð\¢Ž>“ˆ% ï-Stï:^Îq§¯ù€ëÀüB> À 0Eñe›€)Dr©dr+ŸYDÉDÓšp‹ý›­î¶'fÌEì9e܉œÌ²-kNŸfg/°sWØ…rvYëðÇ5Ç‘“e¬@mÍ™§‰Wœ;ö؈áGúöÙÐf­—G^ ﲈRxJ ÷j­JÚéôU#hÜ0¿Oc…ð\2f~Ë‹Fr4E*ùTâfÿŽfH…œ·Û– xxܘRUüÅùY›7Ü/+eUVv¯ŽÕÖ2c%3V1ËmVSÏî<`µ÷Ù­¿˜©šéÌìî=v·ŽY*Ù©S¬dÍ­i¥±öG†ÐoO[ÿO÷…2i¶@©ÿEÓú5…2a»Ó@>Ðø`~!ŸÆ à]î8ƒ(ÌÃ=…^®òpÏ:Zz$)éLQqÕùóL£a6»}‡UZY…þÞpßbm0YëÌ5õÕ·ªï²ûK6f¶6èÌLV^Á´ZV]ã8[ôzöÃ>[Á²K¡á"¢ÎŽõk;|›.&Ç9 äHa? üZÇ«Õçžò€Æó ù¸€g1lØb %Š9®v¥úûmïÙóø°ËÂ#K“ÓέÛd-»ÈL6v«žé«ë®jMWo*ô6se½ÅÜ`ÐÝ3êï õ&}½ÉXg2Ü1nt·ôúªJó£±V§­ÑjlzmÙȪ-Žê|ñËS×DD :ù[PŸ­[®ñ–-á)MDŸ&—ç:=ä¯:Ì/äã"PžNþÊ_Ú·WEHÄ)bÊòñ(èÞuÿ˜Q—BäÇF~thVöÕï±r#ÓT²?oš¯›åm¹Ys½Bsåºîêu‹F[g11ƒ¶AwóžöÆ]ÍZÍ ›¦¼ªBS­ÓVé**õ:«]…ƪ½Yi?hÐÙŒFöûe¦¯bÇJÙ´Œ2yÈ®1£O†ŽºÐ·×O­šKùR!(¼™Ï¸Ââ3Èç%Ï^N˜_ÈÇ¥ü ÿÿìÝ P“gð—*èZH„p_å©+‹µÕ¶»µZm·ÛK-¢€ˆÔâÑ ¸hµ`¥%AL8ÂDŽ!„#„SE®jë1Ú5û%ÕZ­µÙ޶éøÌüæ™÷ ß—?ß7Ï<Ã`ø?|¼å4Ò[md¼¡ÈiF¶ÌåŠwßî}EqT8÷,õ†\¦êíSIeªÖökÝ}׺ú&ºúÆ˜Þ Eïw åuEÏ­ž»nÞs]Mùý¯ê¹ÞÙu£@uyTÕÙ¥ÊÌZ÷sY@ñšUí+—wúz5MÎ@(Êdúž)úßZu òÑÙ|è&è_ϳm¹{odô¾ñôE“lKýÛ—v­|¥wY@]|¬ˆš;ÐÜ ’ŠUmRUw7v¥ÞŠFeßÞsU&ÿ^&¿.“ßи~oûÛU.¿Ú«¼Ò&½ ·µÝ‰Uy´k!!ÂE~%o¿5àß9×…çDª@;±à©†á‹„|t0º úäó ‚@+³oL}¡§¦8;1ÞüGŸÿ‹üe‚•+š‚6¶VW¨¸5ÿ·¨dmªVÉà;A˘X2._¾K4* EBáwjØâÇ­U$•··Š‡øßÊ;U’6Õ×§noØÐö÷¥¼¾¦|%°sÙÒ6W»³Dܤþœ¬Õ¶6A>:•Ýý òy6ÁðèÅÆÓWMýà9ý­S “=ÜË^l_(~uIóýëy*±HÕP‡[{S(¸Ó"¸QWw¹®~P$žhä_и¤1ÜØ8ÖØ8¡-F´Åæó.´I®´J®ÖqGkê¾ç5©8µªüsªuk…¯..¾àË{퉹˜h–ŠÐÆçÐj“Yk ]È€n‚þù<Ë`xœ<š!l¦46Þ©?逯wó’EX]ýV÷Ò€ÒUk™e,Uççü­††¸Ü›UÕ#,Î0¿ùjcóX5GYËTãÕr/Ör‡këGkëÇ5uD½ÕN}ýpMõPcÝ(¿a¬Ž;VSÿíyÞ힊]§úò„jùËU }Ëü×/YÄ[èÍZìÙ>eŸ> 5ŠP -òùó › A>Ï8ÇÈ8¡7Œ ¢ŸCûÈnÜ|ºÞY}k¡À×·båÌÿœ.¬¼J/ªbM°ÙWØœoYì1NÍHMÝevÍPEuë|¿Æ ‹s»1Xìì ꊭ9µÄaŸgT– •—õ«·µ£•ìñrÖõJŽª¼Rۻğ°´î¥Å +–É_ðnôö`é©ÿm^ˆéó-‡|þÄ|è&è_Ï3€_5Ód匙L×C{^ìX¼@é=·ËÃYðr@»Ÿ_ñ¿Þ¯ª¬U•׌•²+Y# Æ@aÑ›3Ž]ÜôÂz¡¼š=Ä,ëÑP2Ëú˜¥CÌÒ‹Læ%5õz@kCUåã%…‹ý%Ì~fya©»ëŠ+¯Ð‹o3JT¯oñõa`7@ ¿ÌÑší¿@îåVg2íBáÆ†›gÌxZ¿ ƒ|üAÿ‚| æé9Yÿm„>04Hô"×úûõ,ñ»àCîöóió[PóR@ñ©œòÎP]4FÛš¼°p°¸dˆ–ß™Gm§3ÅL%£¨›^Ø…­é %ÑG§Òéèç.©+½_ýˆ–èƒEçFéùÃêC”W •VöuQh”¼¢RÕ¡Cc~ x²ü¼E‹—ø-öRøûJJ02ˆÕÓ[7s֛ϜÝý òw`x¤——§à ‘mœ>-ÙűˆìÎóœÓºÐGñ‚Ü“\?c÷žÑ¯³¯åä]È=Û•}ZHÍï¦æ+©ù î)Ô_¢õQiTÚ •zA]Õë>­ Ðò.«Qi4%-_N-bò äjO.mâLž*,LéH¢úz¶x¹wÌséñÛëåÑæ9‡k0) ¡ ƒ)ë.Š€|þ°|è&è_ø ‹ŽÉ›>ã“I“¢¦§8ÙŸóõnžO»»´ÌõhYè#œãQºdIÙ¾ýãY''rO_Ê9£È¦´Qr;(9]÷=°UPrz(”^~ ePS{Õj‰ÒŸ“}Qí›þŠ"'G–“+¡œQNK¾ÉíÈ¥^þ&çæŽ˜Or‰7¹ÉÓ½“ìܳ`î ×œNïy"‚»‡Zo±%dÀÁù¬“3‹äÀ²$Û81±ówpâÙÌ®µÍ™M,0ÐÛ3Y/ˆh¾žÁ€|žF>tô/ÈúûC`¸kõÛGzço†»¦"ÙÓlŠ­lÊñls ¾m«½½„dÏmC'Ï?¥LLT&'ÊâøÉ -û“Z“öJ?“>ŠäQb¢01QpPíÇ» ö&s“¸IŸ °%ï–¥$t¤`u·tßÞÖÄ=âÄ={÷m îqt¡’ìKlJ‰vT¢ä̲¶áX[ÖÛÛò-qÌéFG ô¢¦Nù·wäóÄó › A>Ðß €{Aè­œñ|´úŒ`škkϰq(±"U™[²ñæuB‘ȳ¶âXYóö) SÄÅv'ííü4š»gWSòI|œ(>Nü(¢»vµÄïjÖàkj‹öââ›ãxì… ;E ;[1»cÅ ;ÅŸ%H±£ìÝ£Œ‰íÝø‰ÂÙ­`6‰amWbeOÇ[ç[Ú–ã–Võ®Î­6DŽn¬Ÿ¤‡6êÿžÅ…|üAÿ‚| ¿?âçþ§Ÿ.xqén„VëëÇ?‡R-‰¥b1Þ²O¬À«æl µj¢s¶Õ9ÏyeÖwGnSljMˆ“îŒmJˆ~ݲc‡è±Zôø'ÿ’$z‡äî÷‰iŽþ´iGL#VcãD[#aíÑ1—6_²#å[XXY2 ‹ª{ª±“WŸ¿y™ÉóÙí@hâ…IÏÌ€n‚þù@$ÔLpkþF$Þdh…M½å8b)΢o^iNP³ ”[˜Y™ç;Úç¿÷®|kHOä6YD„`Çv~Ôö†mÛøÛ¶5o oѪÞ'Ôªn‡‡·iˆÃ·5‡ErâjÕ"ëã›BùÁa²ˆí#k×vZ[Òfù„Rs O¨ÁcÕ¼òGêwa^ncY> }1 E›ÎÜù<Á|è&è_ô÷G‚`YHØ„^70ŒF(q„JSÓ„PlŠ+ÃàÌÊqfex3&G·ÀÑð¦'__Ù¬ÛÒôI]hhݦMìÍ›ëƒ7ó‚77hWï ækUƒ›ƒ7 Õ°Åf^Жڠö]¡Ü7p×IC·^ô÷¯Å›åb70δgV‰3­6Å•kÞƒ½ŽioS=szæ$ô)Bë6n̆|žH>tô/Èúû¯ùÿÿìûo”eÇÏó¼×™Î} µ*÷¡*–[[ Òrk`)wJ­ ht7Yu×õ׸ë*ŠP{Ÿ¶sïÜz¿·´Ô˺¸f³¿m²ñ·ý/ö¼ï´B[¦hœdNòÉÉ;“æç99ß|óÍ3o‡ÀÎ9ç?¡¨oÚu.WÌlÙ\qÛ¼¨ÝÙ8NG‡Ëw9Ãó^›¹zS~ï…óÿ­ªü¶ªrüìÙá3gúªž­ªK†ëÉðeÕ3ßhàEÕXå١ʳÈ™sCgÎŽ?}­¢êûgÏý›vÚ›ì6.U_s·¾þ¸ÝEœÎ82Ï[àò¼jP.,Yü õçgéA‘šQÈß§#Ý@mý I)“ åíù™“)˜aŠ™la“=d¶F«%fµDm–°ÍpÙ½˜ s–ùª*ÿS^>ñLå×'O8Ñ_Q1ZQ1–§Ç“aâÔé¯4*&NUŒ:3|êÌàÉJdøä™±òã×Oœþ×áò/ÈrÛl(¿ÓÓ׌J›m!³- Ukwa2ì–€?:¬¯‰|o}ÃwÔŸûìA‘šQÈßg ÝÀþ–•£ç3Œ µ¦Œ°ÙÒ©šBªÙgÈ!Æ6Äd ™Œ>›¹Õiw/̬ßWú÷ýûÆOœøºüèpùáþcGG’ãȵd?räºÆÑñ#ÇFŽ*?>¨ƒ×•Y~ôûÂÂQ«­Æbi²˜}V3.—2˜|“g’ŒîÅb +b­QþH~/òÃ¥{Þ¥þÜg‚ ˆÔ„ü‹úCþ>é2ç3¨g~gµ\áB(Tc»b(FV ƒDŒjÀ¨úT¥ÑnqÛ­u«VFJK'öí?ø›±½{ûÊʆ~IFÊÊ®éàÅЃƒöcÝp¨ìÐø¾{Ën,]ŽÁ½Æ 6*J‹ªø jÀ`ð -£[ÑhQ >Ü ÊXæõ&À—¹Êb9Dý¹ÏþA© ùõ‡ü}Ò=ì‘øóå=»µQU½nàAIñIŠG¯>Eö#ªìSeÈMÍVs½ÝV]RòâmÃ~»s×@iÉPiéÀ/Þ¼d¤´dkIéPÉžd÷ž¡Ý{Föì›xzÏ×»JnØuªZ#‰uœ7qÖ¬È>Eñ(Š[Q%Cƒ„UߎÀ[qŠxUßQäJ>ùôõç~úCA¤&ä_Ôò÷™àW_Á¯Èùs^‡õÀ»õsQ¨¨SÔ˜ …¹5êÕÍ y ·Àš¾øØÇYÙ-› FwíújkñÐÎÃOíèß±½oû¶^/ðåΧ~. »wìÞ½ûÚÓO÷l)ìÚRØS´upï®ËïŸ7¿‰ Ÿ|ÎyN?@‡fnÆêÿ„jÀªm·Ð* ^ªÞR¥W̦ó3‚QfîA‘š‘¿“¿ÏLZ€õk.JPð²Aú AR¢L L#€f5ë¸ pÙbiX‘Ó±ióÄößo..êßZØWTÐ[¸¥+‚/. ú· oÚZ4XX4XP8PT4R´m"ãèÒe1£©×P-n̸8å\£™±FÆjµéŸŸ,8Ô|Àá¢ÀŸ[ùÈëÔŸ9÷‡ ‚HMÈ¿ÈßÉßg&­€,Âø+Âû"»¢GÛf.Z´¹ÇéÁ ´&à¬#&çM8XŒW›ÌýÅÛ¾Û¼qxÓÆ>dã†Þ ù=Hþ“ÝHâúnt%Å–Íxóüü¾ ú7o)Ø2¶¹àú¦Í_=4k?nwE@==\ðá”sðrmÁZÖ€2@1·2T¤ˆÈ[þðÀY‡ó%ðÔŸ¹õ‡ ‚HMÈ¿ÈßÉßg&}€ÏûƒÃFé¢IùLbu8I^œíâ6´Þ"èQX’Z´&Vët†Wç][»f`ÝÚžõOô>¹®+^¯}¼kÍcO¬éž†Î¤ÀÛâ=×<Þ½~ÝàÆ cùëÇòò†V¬èU \;¹«ÆéÞ"bº ü0æú™‚õéŸ@@’¢¢àaZˆàA:ÿæF©?sèA‘š‘¿“¿ÏJú€7.ö›•sfåm . Ð$KÆýú¬4þDš64yø´§dÀ-ÉAY o$ÕÈYÞ¹*7þèªÎ5ö¬}¬÷ñ¼n¼^½²ý±Õ]w'¯#)òV·ç­î|4u5´fíhnnÿÂQ³©U´ujŠå-‚èÄ ¾LÀ!Ô€¾r7ðz Ö ·à„°Àü²Ô(K¼Âø ÇOµPæÐ‚ "5!ÿ"'Ÿ•ô ‡Ê.[”¹vôœ{I‚à×¾+&4M+ðkdÐ*J!ƒ1&Émˆ1€fº|Ù [—. ç.­ÊíZ•Û±rEGβè#9ä´ß­"±{¯Ë—EV,æ®èX™Ó½dIgæü°AÅÏ­pîy+|8úúôõ¢Â"„9xï€x«,7+êeAü~[¼ý¯ÔŸ9ô‡ ‚HMÈ¿ÈßÉßg%}Àúµ¯JðÀE€ODð à¹xÝ4ðëisÆ„ö¼<Ž”öôÉÕ Ã—Ãå[üpdÉ¢ð¢‡ÂeðzñÃmw«m‹ï½â­~kha¦ÏbiVäÎ0øêÏ»ø´ÔËSËÓVÈ!*B4q ¦?þÒø£жU’Z$ù²(½ðÒª¼×¨?sèA‘š‘¿“¿ÏJú€¥‹/< ðV†ØdQcÚ™‘T Zý?FÝ|ösdb°´!“å˜$Å<šÚô/Ï]øÌ¨48ìþ¬ÌHVV$+³-33”½¯Û²¶Ý^ƒÙYÁ¬÷Z³‚,/ÈŒÌs *~V ÂY‹AMäoO"õNet\R„CLG;Ó¦Ÿßn!¬=ëƒd—8×ýàKÔŸ9ô‡ ‚HMÈ¿ÈßÉßg%}À|×ižçðž5"ó‹,ÂyD‹’ú ° ÝÎÐßÑ'ÏáUà^YÐ~8àÿËw:£.GÔé »œa§+är†ôtºüw­§Ïé`E-Ù^¬6[Pâ‘$˜“:µ˜¼ëÚDt2hŸ\skàX½¢×à(V¼ ðŠªžòùÆ©?Éö‡ ‚HMÈ¿ÈßÉßg%}€Ë9)jp¤Dã¬]?!JŒQ€6jmx!@XâQEŠªrÔ D̦˜ÙÑ ›Í¡)3c2ù‘Œ ß$ÆÈÛpyˆÑ\‹¹‘iÖcÐÐgÝ«>  ùEÁ'kÏ¿ÏàuU­hi¾FýI¶?ADjBþEþNþ>+霎S·  ³€L†È$mq(µÅ1•…j@‘"²–Å,dɧãÂ73’èM EUÀtŽËCˆ'HrM³ž[à׿4 ´b¸¥.}ƒmxÏ[P_7@ýI¶?ADjBþEþNþ>+éö“· $Bg8q}Db< âL¯\M}Rc˜ƒ¼mâÄJ;ºâ^í˜L't'˜to^'¹tñ÷.˜n=z8à^ô=îÑ `¸Å^€v@•òÌk>`ð& àê•.êO²ý!‚ Rò/òwò÷YIãà81%€:Aû¿Q]87 ÍM».ƒ$Ðg‚ΩïŸá›qÎcœGtÚ¸š¯õ´}'ïDn¾Ôï£qç;3®§cJ1í™îÓ`m€*ºñoPi2¯øP@ågŸÆ©?Éö‡ ‚HMÈ¿ÈßÉßg%}€ÓyüvàÐ ôÁä·ßsíäЇ0èeÚxáäuè*jO ´À;!®ÕÀ—¼[`½ëÿIù€Èû°Þ|G¿sFs]]7?Wÿˆøtë WÐvg, 5Ö) #ú»D‘yãM\ú$JýI¶?ADjBþEþNþ>+ÿÿÿìkoE…ÏÌìzí¤R(B€à+H @€*w¨m)é…«(´¥ ¡€ZÄEU)¥Ü´Ð‹½F¤‰ÓıçÒ$mCR(ðøÌÌî:ŽIìu‚ÔE>Ò£WŽ¯Ç¯ÎÑ«£™Mj7,^ü„ÂZ‰-Ö‡#55¾”ÛÂD[±j5wióh:} ù6(ŠÅÇŠh³××t–T}«û.«ûtáùÀh/|nÑõgZ1À óYâ°ùϺ ým°ph7õ¦ °|F°?åûC!$žp~q¾s¾W¤vÀ%KW¢Y¢Åœ ºaul•t"ZÕj;©‘èA†n·hœ°Õ§­ˆ_Š^ª3Ø·wžr°qæ/aÎ6»u³¯§S>jÕÔ^GÇë~ Ç8!0À6ÍÉä“;vbªí!„xÂùÅùÎù^‘Ú MW®ž65Ôíuåa{ϸ–oF"ghÅtF«6Vž´Úò¤ÿEçtJ¥_¶ˆ´aÔŸV‡Û ŽYËé5ô$Ý%ú­sô—Ý ¼¼|É’5ûöeÙŸjûC!$žp~q¾s¾W¤vÀÍ·¼¡är`ƒÂçÊüé+{%òž;dEÜ ·bM‡êï)ò@ ééµ8W¤`³¨ë&‘9>¼‚þܬÂ@¿Ý;$ð™RÚ/]vùó­­ýìOµý!„O8¿8ß9ß+R»`Ýó{{§H^ø6ˆB`€žéÌnó®¼UdDªY úBä•õ€4èç‡F`®–m¨;©Ô7ÀkH¬¹èÒ•[>hgæÖB!ñ„ó‹óó½<5Þlé©[¸ÎQ-®ópÀKôÁlhÍÁŠ¥ªÍ—êrZÎÍœwK5ê_d82ƒáGGE©ß_Lüõ ihèrœÝÀ†ÔÂæË¯jþæû<û3·þB‰'œ_œïœïå©é ‘‰{g€·\ºím"ãæ œ´7•Ë.ý ÞDrÊÊhÌÖ¡ð¨œÿj¿ý¿Vd¨J¢\³@¿4ÇàÌÝ0áÙ¸~»rM·rz÷g/¹3™z5á.½íö ‡³?sî!„xÂùÅùÎù^†ZW_¿Î2Ýä·Àq%NKq"Õ3…ì…ðCä(pVàWÓ~Pö7¹`NÎ Ç˜í¶—9ý¦qEkÓ§Œtþ 9/ Š< OYøárÒ2fÍ8T_ú“zÙ2ðð„‰Å"›PG€À+Í÷Ýײÿ`Ôý/ö‡BÈÿÎ/ö‡ó}F ¯l<¡ÔêEÛO%Ž(ŒZÝûøKW(1À„ ÊçCLÄ£NøÒ÷­kpF‰~Gµ»)V_qÅsë_ÞÍþüWý!„O8¿ØÎ÷aX²ä9ÏÛ(ñ®VIÒÍ»6ò*#ýß?ëÿÖòâ¬cP#ÐUž…8ü¥ø]`Rà\<ê9{Ë˸’¸B/þ”À@ÊË(¹Ø¼pñâÕKضgO7ûóö‡BH<áüb8ßÿÍ?ÿÿìÝyŒUÕðïYîòÞ›ˆ¶š&¥4MŒm4iR•Vª-DˆŽP§lX R6q€¶n•¡¢ÔÈnIU(û2FTlafÞ:óæ½fAv´=ç¼yà ®À…ù%Ÿ¼¼¹sßÉ7¿_N~¹÷¾K@£Â™{¥5˜óÑÀôNv\UCÛJ,Ê}2Saà»tÕ{¡Ë«Ü(5•wЯ9SCù~)Y¼Ä<ã×þ·dsÆK1ø‡Ýòò›Mù|·ùBñ&Z¿(Zß/DÀ9Ý»Oîsì ÀËÀ`³#Š}"}.)ìðˆ.Õે`Ó\5@ÈH Á¥y•RÍåj.±Än†÷_m[ó/rè 7äöú嘹sWP>ßy>„B¼‰Ö/ʇÖ÷óÐpÎü…ÅÙmúpñ;@õÀ"†u6ÿÈ¥A˜#«Ty•@ì2š b Ô;Ì{j‚ÿ¯mítœÍR,eæä—/0ছûä,ÊçräC!Ä›hý¢|h}? -ä › ôtü\ÿ«>g93_‹ë1 UªÐ9‚Œ€(†Ü ¹âx,Ìä(÷ŒÃæn˜ÀG>ÿ>ßZà%sÿ€®7öÏðä²­£|.S>„B¼‰Ö/ʇÖ÷æh8ßOn¦jE ÁÀÒ ·ØaÆÊPÉfì0Ä>ÈbÏ6€ú¹8`NÒ}àø¶XÎ2ài`ˆ?«ÿ½Fýõ¹o{ó;åC!äZDëåCšÐp¾o|ܶ£êá`3³36ï›ï–ŠIÔĸªxyÖ^X%¥!ˆg!᜗9n)³w[ÁW‚ÍÆù2†Ýü³ÇÇŽŸ½vÓfÊç²æC!Ä›hý¢|H.bbÁ–Ìv£UH6ÇÂê ¹ÇåA†n(Ó¥¯Xe°Bð‹Õ""ÍÄZŠ´péšÖûT±ôÎÁ´ ÿÚ¡Ìgr;ð6ð*Pž÷ýn#úçN{åõå”ÏȇBˆ7ÑúEù.îW½§‚õµD¾ypô¢€µC4>ö"ÄepŽAÝ ¾°¾ãD·G#ŽpZTjq‰*‰¤QÑäˆ3T0DÓÂiÁfš6ª=kê’ú=+gìP P*xÔ±ªmõ/±P©v°YHâCk\þº% Ïmßùþ¾9ãž+œOù\±|!„x­_”ùœ€KèÝ{2pO»¬‰~kðÛ²t¹‡Ímïq †5—ÁE›ãçèà¦xºªŒ8kì„óš¡ù¡*ÌžªújÌþAÆ©¯àªº7¢æÇ2‰=6ÖK̘p†véÒ¿G¯G ž™µqëVÊçJæC!Ä›hý¢| —Ò³çsCÌ™ËÛfîÉ }nÜrkÀ«ôŒˆð×Aß#Ÿ7š×´…S-‘~Õ5 $ÓªZŠ·ü1ÙŒ>²)ô¦ƒ¤J?ýW ±W°O$ß(õ™¯‰vî<ä®»GMšöRѶ÷)Ÿ+Ÿ!„o¢õ‹òiåhø¿¸­˜éþ™c6°D²w%ßež2•—pÜã@]Ú Zm««‹GŒ4"z½Û¥iĪõÑx¥¦«ê¾š£Ž£>Õ?ú;zE™ß)ö¹Û„\øªþqÔ¡ÃÀÛï|bâÔ9k7_ÆÙ—ò!„r-¢õ‹òiÍhør¿¾çE†À(ÉfØâ ‰À6ƒ®“t¤ªÂZàhZ½a:%Ò…17Ë›kæ´ )åDKÕ_,ÓRŸÒ]QÏqŒã„úC5>QÕï:Eà‹Ôÿ v_ÇN}{Ü5|ÜS…«Š6Q>W7B!ÞDëåÓjÑð•ääÌîÐ!ø=ð´ßZšíÛ*±Ã¿¨dúÌ”*úc´™_yBŸ,Sµ«‹8Ò(5Î6M´_ئ7ôÔÇ+õqXuºŽ Ô T;û­½6_¼LF‚åtúÞ½wÜ=xÒô+7­§|¼!„o¢õ‹òihøªÆOXÕµË —á,àxØ%÷ùô×Q%ÁêÁ4|ª±æÀë5Qk$!âFÜÔ·’4jŒdšù•ÚŸ›ò”Æ’ ›E%ö»r§O®þŒiÓ>¯Û÷é—?ý…”§ò!„âM´~Q>­ _ÛoEoé®/‰sø³l,ʪø6Hqˆñ ÆãŒ'««5Í :ád#Öä¸éÝÌÔ½Þ_×´úH-Ss3«×ïõÝ fŸšÆ£©S[DTˆr[ìwäNÁ6ùì·9 <Èî÷Ó[GÞÿÀø‚g 7lÝ@ùx-B!ÞDëåÓÚÐðµå>8_àAÈ´ŸžX¬•v±/PÊø~sLT ©@µ-ϧ¡/V;¡ß°³æÇc©d\_*§Of¡ñ‚¶§Ž›-u µœ×Ù¢Î¶Ž›³x­Ïûý¥®û±àk€ŒÍ&Ãß Ž]so½mDþ˜Â×–¬¤|¼œ!„o¢õ‹òi=hø&ÎvlŸäd;jô|x|…íÙÎ{–üPÊbÁKdG$Ž vRòϤø\Šÿ1¨8%p\àS©_OJœ8-qFàŒ…³êlüm½du6¯U8j6/w­Ý–UÄÄàoÀŸ€Ç˜ܦÝC?º)¯OΤÉÓæ½µjËU‡ò!„r¢õ‹òi%høæ†?ºèÙ.k¤e=¥FaàyÝ PWþ®ß)ve@%ײkÐåÎϸâ3 ',sôë)ÇÔ½ƒ³–î }ýœDƒ…¯så¿Lø­Š€»PGÛ,4÷¹OàV¾âÏêãêqçã#FÏxmáÚ«åC!ä:@ëåsÝ£àÛúͽ d –ÏåƦ/J¾¸]ö–öm>i›¹/Ã=dégh4ô³3lÄ-á é Æ¨U¯¶Þ¢¶‡V.Qüؼ#±Nb×÷¹«ƒç 9(#»_ûŽ¿ýùíÃ><õùÿ\½nÇUÏò!„r=¡õ‹ò¹ŽýÿÿìÝyL“gðß{” ÛÜ€ É2QŒfžè<&ž3qrHQœÀJ¡€rˆ"ˆÊ”Ð:QÀMT<£‹Gœ: Æy¡‚ËŒsš9‘Ê â@ðY‹1ñOãp í7ùä iÒç›çÉ/ß¼M^€î¡Š:ìØWI4]& st\-ð©D+‰r‰ ˆtB"œ—I.Ê¥Wmå7$Üe ]ïrCB·º”¯2á¦L¼*Klijœãí%ʓз¢é¿©8R*sRNœ¢ö_˜™½ïØñKf_;òK…ù…|, @wÊúîÂÈQËǀȷ·}’ȯâh-O›$’ïm»åò"ŽÛeÜпOàö‹tPàŠtHàu] ¦í^H¦Gîm$zq„M•×ô(>ÿ÷ú+Ý݃§yGÅÄnúq÷ ³/ù€•ÀüB>à­PGuuÖôqÒHÄ¢0ã&æ¸$‰t Ñj¢xâÓŒL7ËøtŽKy]g#]G’$㇉BˆIdc¿È¾ŸrÈ…³fDÇ-Ïݱóةӗ̾:äÖ ó ùX€·k{ÞƒÐÐ#ŸMÊô–ìâÓËa1Ñ—¼8ÿ%å+æÛÈdv¾}ý-úø“è9¾ã “Röì:uòd‰Ùׂ|^ÀüB>= Àÿªxÿ¥­ÚãëÓ÷¤¤Æ'h£¢6«T™YÆ?bb³W§¬O/ÊÝr´hïùS§ËÌþm‘ÀëÀüB>= €A°"(VÀŠ X+‚ðÿÉÑ^üJ•7kÎzï©=Ç®:Xãæâæì14l¼WüŒÉ ‰Å›sΘý{"€×‡ù…|z€·H«½¶páNç}N4[n(•." (”7=o ‘ñ­…DAÆ9 $òåyAô㟾ýB½§mËÎ}höU €Wa~!Ÿž ûÅ/+î¡q´ 2=ôŽ‚b¤“]B_û޶ñrAÍQ¨È«Q#4‚)"yA-p‘Ä©²åI¬ÈÅð|ŒÇÑr"µñx¸¸BvÀìëB>`Í0¿Å@è6›s3&–hºqßËHÓßnƒ-¥É)UN)’”÷û¤¹Ê3"ÇÓs«×„l¯)[&NÝ6iÚŽÉÞù¦xNÈëY8ÔC;xÈönÛœœ²J#Jå詸(R p¹jäðukS/›}¥È¬æò±<(Ý`©ê·¥DÞ2é’wWE-ëÅe¸öÙé5âdм›ªruè•Ô¤²ý{šnÜ`·î°ò?Ù‡ì^…ÉïL¯\+c9ÚºÔµÂUåóçÿ:{VɧãN¸¹ØÛfõsÈ(™(†§"?û^š¨£f_5òˆù…|, À’°â'^œÃÑR™t¥ÔƸGdBêG §O¾°`^©&üîºäÇÅEe¥¬¾Ž=kcOž°ªZVUÏjZXS;k}Ξt°ÆXu«4°§ÏØÓ6VSË®_g…ù‰q¥!Á?ø›4þä@×B;Ź,E Ø®_Ñ xW¥Ž8löXÌ/äcÙPÞÐö¼{Ã<‰|m1Ôu»ÊV‘íåyÎ×§Ôϧ$*êfÞŽúÛ·Ù£G¬¹™µ´²Ú:öX÷\§ï¨©ë¬®k34µ7´t6`0¿5@x3gfœQˆhºÛëê|xôèË3¿(ó (Ž+ßµ¯®ì.«nfíL×Ðv¿¢úþßúǺfCm{¡S_ù¬J×Q¥o¯ÖµWWµUë[õú}e£NW_kh­ªzRYÑTñ¨YWÑf¨b 5¦ê|÷/–¥mò,ñS^ øÍsÜ™ýóä™<ʼnôµ@¾ÞÞéfÏù@O‡ù…|¬Ä¿ÿÿìÝ TSgÚðô³*UÂ*ÂŽFYDÔâÈ tt¾Î¸·™v¦êX[E6"‚ZP\Z?´.Xi@I–°“È’@ daIH $Av\ªö«3Þ¹IµVDZ̜ÚfŽÏ9¿óœ÷½$ÜËŸ{ÏsžÃ`ø÷¤g6H!´eªq„1Ú?kZ†/¹rÃ:Yèjî[¿g'$)ÊÙXï ¦Ť}ÃÊáÁÞMï°Z©Uw+ûʵæÿG†°ÍßûûhT÷Õª»jÕuï¸V}³_3Þ¯½Ñ?†ÓªÇ4}£øÁþ;ƒƒX‡»1ŽqùXT¬huhá†õÍ×I–.®µœyÞtRŠéä„6[ÌúÃÙóÈÇÀó`˜ A>¯þ ||m43ß‹PÔt³L’#34Xñîæ¾ÿ]SιJ½/•`ª^¬]‚µuÞíî½+ï—÷Ž*pªq…êŽByOÑómÏ#ß ô/ÈçUÀDyùí™löžùŒ}Å+ƒ:CVÊ×¾©Z\Ÿ/¤æª[±vÖÑŽuwãwê·ሤëæc·%Ò¯%Ò{é}½{·?^¥ÒÛ*å­Žö~`°£ãP„åÑîîÚ%XX²yƒ:8H¶ÀëJ¬@¿°ÓL×/;ù`> ô/ÈçÀ„Ì&¬3™öG„þl>-ÕÍ•±îw½AoðV…ð×®iÞ±½­ºãÔþ]ÔŠI:°6ñC>ÿ¿uT$ˆ†Ž„cá¸@pG_|·@ G¤cm¢ÁÆFM#ï¦T†‰;°//=ض­ã×+¹¿ÿ­òÍÙª•NWmæžBº¿“µÑÑá/AåÀ0Aÿ‚|^M0üz±Ì|ƳiïO2Þ3Õô°·WÙêÎU!¢ß¬á­f¾÷—¦.&b 9ußø[ù÷ëë‡ê4BÑx¯_o@o°©i´©i\_ OoÇíïßjß®çŒÔÖÍmÆØuXþ5ìí-‚ß„òCV –pû¦ØŸ\l3' ¡í“ÐF‹Ù› CÈ€a‚þù¼Ê`x‘<š¡ |¦47ßg<ùX€_ËŠe]xݸ¡{epéú-̲¬‚ý}ýÛÆÆ¿q8ßTU×°y-·›ZF«ÙÊ:®F‡£­ãܨã Ö5ŒÔ5Œéë°n;1 ƒµÕÚ¦ú^ãh=g´¶áæuîƒZ.ƪǾ8‡…®®ZP´¼aÅ2åþìS£Ý¯ÏÜP-_ùü‚ù0Lп ŸW /bfŒÐ[f&1“в'g©¿üß.ñçT¬}‹ùç +oÓKµU5ã,Ö-ûf k”];\[?ĪÕVT÷Ô\ïÓÓÔ°ûñ£†5Œ¿@Wñ5ûƱYƒ×k†+Ë´åe}ºmÝH%k¬¼æ^%+¯ÄââU+‚˜Á+ëµ¼qÍ*éR¿&?ï#Ý¿ÍÛõúk‘…B>¿`> ô/ÈçÀ¿4ËbíÌY6™n„¿Ñµ|±ÒoÜÛ¿:¸30°øïUUÖaåµ£¥,MeÍ0ƒ¡.,R³ØcøÍM/ì¢J«YZfYž’YÖË,Õ2Ko0™:ºµz´Uåc%…7Š}%Ì>fy_a©êŠ+oÑ‹0J°¶¶ø3ð $HâbÏ Z,õõ¬·˜~¡psÓfÎ|Y? ƒ|ü7‚þùžÏÇ7jŠñf„Þ75Iö%×ö¬ì÷'wúw.®ýUpñ¥œ¿å]¦2ä4FÇš´°PS\¢¥åËò¨t†¢˜©duÓ åøšÎPÒ½tº†Nï§_ÐUzŸîÈÑ5E×FèùƒºS”WiK+{ ŠäZ%O]TŠ81¸¤`±OM Ÿ0x™fE€v¹¯"( ¡$3“x#£·gÍ^ùüÌù0Lп ð€çZšjIˆBhûŒé‡Ý]ŠÈ^\ŸùmKüKý¥>ä†E Ž|™}7'¯?÷ª<û²€šßMÍWRózÝOSè>Dë¥ÒÔTš†Jí×UݺwÂÔ´¼!ª†FSÒò¥Ô‚v\^”BíÉ¥_ÉÔ.Dj€O«¯W×B÷ž€*_ïŸù“É)í0™úö’e‘ÏÏ–Ãý òßàY1qy3fþuòäèéæ©®Î×üZ‘E^î­ ¼[—ø æ{—®XQväèXÖÅñÜË9WÙ”Jn%GþÄS[%§‡BQéõQ(}UéN¥/'û†ÎW}9ENŽ$'WL¹,¤\•Û•Kú*ç›Ø8µ¹ÄÜìã%#»õ,^ ñ/ó[($Ì¡àÏ0B[ͧoŠŒ¹ ùü ù0Lп ð=žr1»y¶Å&„Þ72J¶±ºâáÁööäy¸·xy¶.\Ôìã[ëêvyÓ–†´S·¾8;D¡ ]ºÔûå—Ý.t=%Kòƒ­\OñÈùï·¡{‹J£<ëBgV–8ë¢àÂEáÅlIv®öì…±äÃc¡!œµ>Þo7Ù¢ù ²w'y¾ÈÝ…å8ï²ñ”8„Ö›M_Ÿ{E ù¼Ô|&è_ø!žB&ïAh Bѳfg“œ«ëííꈎ\O>yaÓ|r©)kç®Î³çî§g¨/^8wFyþ‹žÓ™ÒÓ§%ÏÖ'd?é™LÉ™ÓmgN qgϵg]T¥¥k>O»ûî»w×2²·ØÝUìå)òôhuuiòòäz¸VYÎ9kd‰Ð:ÏÝÏKÍ€a‚þù€‚à‰Ä$¶ZonijzÔÖþš§'×Å­™èÄwqá Gb…»g¡éüÞ8Õ™/î|v\™™¡Êø\~:C‘‘&KO—¦§?SŸ!ýÏetâ2Ò¥ø‰N”J“f¦µŸJoËHoÏÌìN=ÚvêîŽ*ÃÛ«¿ï‰$¶³k-‘TëáÁs!]wr(±µÊBè#|Þ½;òyIù0Lп èïÏ€à ˹[M?61N˜c™eïT„ßCŽÄF''‘‡‡ÔÕMhçPéD*póø*6¾ïdÚðÑ#òcG:N¤´Ÿ<Þuâ¨äø±:Þ©×þ´Î‰Uññ­¸ÇÚñ}–Ú…;™*9™Úy"µ ArJ×±ÏÆ?Þ¥&¹]uu«!’jl‰Å®LüúI®\‡yuŽóØól LŒN1Úacµ•ÁPC>/#† úäýý0<²qó)„ÞùÓýÓLOi¤b;‡rKk–•5ÏÁ±ÍÙYLtæÌs “]ŠV&'+'K“x‡“Z¦´¥'Úþ<âÇ„ÉÉ‚ädþcïþxå:ÌINá¤|ÊÇOtø€$5©+¯ÚjK>(J>ØuèöÃ=.îT¢s‰©ÔƉjC¢ÝjìØö¶ ÎŽ<Û¹Ìf§MŒ¢§Mý“¿_äó“çÀ0Aÿ‚| ¿ÿ3a´væk1&èSÂ빎ΠR‰±ÊÊ–eiUO 4ÚØpííØvv×üüK ñÝ)‡dŸÄpîo>|Pœ˜ LL=ð‘ý­‰û[ôxúÚ:q ‰- I\þƤ}¤}m¸ñ¢¤}¢O“Úñ³:¨Œ‹Wmÿ«Âͳ`‘aïTbçL·´Ï·u,ŸK¨°µkðpks°aÛèæÆ)Fh›©ñògq!ÿ A>Ðߟó}ÿůÀ¼±òB'¡4[›R‚M±¥m±¥M…¥MÁŠe­SmcÍœgwÍgaÙ¶­ÝQнÑmI íû⛓ŸÄ´ÆÆ _¨õi/~ñ?ÇÄŠ}ž¸–˜OšcãšðŸ Üŋ쌉øpç€1ßÚºÀΖI°® XW=V_¼îú­Ê,^ËF(¡mË–¤@>?a> ô/ÈúûsÁ c1÷ýïˆ$ZÌ¦ÙØáSoù\›Ò¹Ö•–V•VkB¹µU‘U¾‹sþß•îÙÕ!‰ŒäÇîåEïmŒˆàED´D„·N¨>!˜PÝ# ïÐ…G´„Eq¢ët¢Âcøîæí “DîÞ²EfoK#ÌÉ·&”Zj, µ–xµªüŽî«°*w°-ŸŒ>ŸŒb^Ÿõ1äóæÀ0Aÿ‚| ¿?×?ÿÿìÝùOUwðs¿w}ðÞÂC)ºƒUÚjµ¸‚¨Õ ¸q(¢ ÕN2Í´µíL§ËtšÎtºY¥ìx;o;Y¤µíØé4ó[“I™Ì1ç^ÀÚQÀ§6}É;É'ß\^Èå{OÎÉÉÉ— 4ìxî‚ `¤üàO8þÚçõÛìë¼N›½ÙS{í©=i©‘4{0ÝîM³5ì)úò¹êï/œûç™ÓcçÏUUEÏž¯>;Q}öó»[§U_¿«µú«êª*¼8;qæÜè™ç¢SÎ_+;u­âÌwçŸÿO^ÞhZj°ÝÖaOí·Ûmö^í"Án,Y0h6Öñð2ÀáÊÊfŠÏ‰!„øDý‹âCý}&4ìX–yšcÇdå5³¥Þf Lá[GJjÈlíBVKÄjé²Y:lÖ€ÝêJ1ÔlÈé«®úwEù×åã••Ãeeý§F**Æbq-ŸW<û¥ /*ÆÊ+£å•ƒ¨ìt´¬räèÉÑÒŠoOþ!+3`57›SܸUmÏ=Úþ;̶²Z;Pª5<ÏæxI'W/Zø,ÅçćBH|¢þEñ¡þ>“Dênˆr±¤«–å7ìiN½Þ—¬ëSz³ß` !“1l2†RŒ“×fvᙹÄ]Qþ}IÉijå×;6PZ:RZ:ƒ“㱘8qò UéĉұeÃ'Ê†Ž—£áãec%G¯;ùÝÁ’ÍKw¤¤`x¬æ°¶g¬ä€!ÅoHñª«)€O¡Oòš­°˜^Øî†Æo(>÷B!ñ‰úŇúû,}Ø»ïÏ’| *9é=®NŸ0#ŠÞ¯ܺd?JNjGú$¿>Ébh³šóÓö~µwÏø±c×K—8røjlÆbüСkªÃ㇎\=t$ZrtHƒ×”|^røÛÜÜSJ­ÑØl4¸MÜ0nÛ¯Ó»uzç”d/>‹Q…º$é}‰ÿ­À½Eñ¹ÏøB‰OÔ¿(>Ôßg‘è@šýˆN©øÉx™ñµ‚èU’:eWNrª«Î«S|(Iñ&)nEn2fSýŠåÁ‰={Ç÷ÿzl÷îþââèÏéjqñ¨/¢ûöíÛ?€ëÞýÑâã{öMì.¾±x)îµ:¥I–[Ù£S¼:[§kÕ%9dU«¬sã³`K¬A¯» ð‚,U(>÷B!ñ‰úŇúû,}(ÙYü¶ÙÔ¤(.0Ÿ(»EÙ©­nYò Er+’S`Múä“¡ÁœRSPð÷ü­Ãû÷½cç`aA´°pðç‚7/¸ZX0‚kAa´ hí*Šî*ºZ´g♢ë; n˜-õŠR+ õŒ53®E–ܲì”e‡¬4‰ºFWíqxÖ†O! WDáMY:PðáÇ7(>÷B!ñ‰úŇúûl ð‹ïàTuÚe1UT›MŸ |-@½¬„y1œ¸&mupÐ2ÍÁsÍŸ|Üé­6ìÜùÅ–üèŽÃOoؾ­ÛÖ>„øåާ”ÜÜžíÛ‡wí}晑üüÞM¹Ý›r{ó¶ íÞ÷59©öfŽÿàSÆ1ûš´0pp\Ç>¾pU¡Mâ]<Ô¼®ˆ/ôU›7Ïv Fñ™=>„Bâõ/êïÔßg—ÐÀÚUE¨xA'~Š Ð(Ê!NðÎP-<×¢ÕÀ€KFcã²Ì® '¶íø2Ëp~ÞÀ–Üþ¼Í}¹›zqEøåƒ’»y`K^4KtKÞPnÞÐæÜÁ¼¼«y['rÖ,^NÒ×á~jxÞ3.f9Sµp\ÇÕ©Ù?] Ü’èeÐð.ƒ‹<;³üÑW(>÷B!ñ‰úõwêï³Kè@âàø+À;wYm[˜èhUó³‡H˜,€¶IŒkÅ“±fL,ŽÕè ŽÌåù[¿Ù¸~xÃú~´~]ߺœ^”óT𼾓î˜lÚ8ˆ7ÏÉé_·n`ãÆ«›7mÜ|mÃÆ/ÊðÔnwY+€&8ïÆ,gàbê†Õ!X+,,æ6Žùd1(°V€¿¼ Pi±^ðøþKñ¹·øB‰OÔ¿¨¿SŸ]ân×L/êåOD®3É…Y¢^ü¤Ún)'h£°(¶ªL\ÕX™=ºzÕàšÕ½kŸì{jM?®x½ú‰îUGž\Õ3ƒHLð¶xÏUOô¬]3´~ÝXÎÚ±ììè²e}Š®‰©'w5˜ýÀZœny/8æz8mÖ²ª¼¢x'§ñoœãŪ×~?Bñ¹‡øB‰OÔ¿¨¿SŸSâ¯^0ȧ ò"|ÄC³$z9æhÒr¥éÿ @­ µ<Üê[2à%Ÿ¤xµð¢Ódòf.¬ÈêxlEdÕc½«ï{"»¯W.ï||e÷ewÅ${egöÊÈcÙXWÑU«G²²æÏ ôm<¯îS­XÖÊ ^ði€°k@Û¹XƒŠkÁÃóžóHb“$¾ð"ÇÎ=ÑJñ¹‡øB‰OÔ¿¨¿SŸSâŠ/åóL= ú æ½Èû€÷¨¿+Æ7ÏXàQÈ Mýº¤°(µã@ŒhšÍ1¿mñ‚@ÖÒðЬîY]Ë—ue. =šy4³óN+ ßýºtIpÙÒPÖ²®å™=‹EÒì‚?·–ǼgmŒwcêkÙïÓvˆ ÀÀu[¸p•¤Y¹Ä äøçó·ý•âsñ!„Ÿ¨Q§þ>§ÄÖ®~I„3>ÀÅsX.Z€ÕÏP85Ï8Þ¯¾/)¥¾}r%YwÙfqd¤»>\´ °àW_exñzá#íwZÛ.ðÝýŠ·zäa\ýóÓÜFc‹,52Öˆƒ¯ö¾‹[z9ïôöÔ2 š<Ó^iú±8,Ú6Ql¥K‚ø&À…Ù/S|î!>„Bâõ/êïÔß甸Àâ…Õ§^OšJX=3¼¼‚ T§ýŨ›ï¾à9™Xj’IRX;œ*µÚµ_žûà“$¹Ñbö¤§ÓÓƒéiíiiþŒùxÝž1¿ý§«/#Ý—þ÷n×tßCóóÒ‚©¯NÁŸU‹תS&çoçäÔ;=£ã–‚ ÂõLÍ~v³ðê»>ø€ÜGŒ©ñðŠÏ=ćBH|¢þEýúûœw°ÛNòp–ÁÛÔ œGà‚ŒÕQRKîGþÛ`ý¸â'Zæ9´ñÌ%ñê?ÎÐiÿŽÎfé°ZC6KÈj ج«Ío³úµÕgµyî¸Z¬n«Å‹+Ö’ÙâÂ5%Å'2§À¼"óòœ'uÄÔ1×wǽqâ ÂAçÔÆ8‡Z W— uhàx§ Ô¼𢢜p»Ç)>±Æ‡BH|¢þEýúûœw°Y§ €‡ZL) 3®S;!šL£€šjíxÁC@d!Y )RH' ú°AÔ ÿ4ïìôzJNvOIò ¬·‡xMbꘜa?az°´\wi©ÐrKøÞ-©¯Ï¿ÃÁ+ŠRÚÚ2Jñ‰5>„Bâõ/êïÔß甸€Õrâ§Ðɸ.€0L ‘151)ÕÅ4•ø0Ö€,%! ~IôJ¢[ãšæž(¸&©£*óâtŽÛCªÛ?™u?]ÓV߉an×XEÂ@~VšÄÞÓ  ü“;(>±Æ‡BH|¢þEýúûœþÿÿìëoUÆŸsÎÌ^ZhêøÑRý F¿j¢Q£F¼+‰b¹y‹("£…`ЈoAÅ ¤BéEzÙÒÝî¶K[Û‚µhˆþ-žsff»]ÛÝÙÖ„1û$¿¼ÙÎvgϼyž¼y2gÚÚ —]¶j¶´hR@/|w„®]½a䥕×i]Ôá ZÉN¥Ú-mý£<¥D}%Õ‘)GöêZ8bÏÜ­£¹5À/…ïµ_Ñ>ßzz”¹Šv!ŽCj´B¶Ct9*m/ðGœˆÉÃ|¼¯ý©¶?„B¢ çç;ç{Ej7\~ùS %vY´9Fj: j<)w‰¶bÕjî׿ÑôyòlP‹;Šè²ç×ô•T}«û~«ûTá¸ït¾·èüs­Ç Ç|—h3ÿùBW¡?¢ –NÝf£ÞŒVÏiö§|!„DÎ/ÎwÎ÷ŠÔn¸bÙ“J4K´˜=p¾2À¬Ž­’zÂU­¶Ó‰ágèn‹¶A­]Eœ*zw¦Ì`?Þ[8îç`ãÌSAÎ6wëæ_OŸò=ÜnÕßnÏ£ãõ06Nð ðžÀöDâéýûO°?Õö‡BH4áüâ|ç|¯H퀦«×ÏÛꎸ²Í>3®å›‘ÈÙZ1}ájŸ•§­¶¼©Ñ7›Ré—­B­Gõ§”ïá.ˆk9½†tÂWbØ:G_ìà]à•+–møñÇ,ûSm!„DÎ/ÎwÎ÷ŠÔn¸õ¶7•\ lUøL™?}¥#ã D>îŽZ÷­XSúÓE(!5»'ãŠlv=Â$r?ÇgÐß›U¶·ÀN|ª”6ÀËW-¡µu˜ý©¶?„B¢ çç;ç{Ej7lzá»x|À6àC%ZëÜ´49ãJm€ D¿¹¦2•˜©úS¢²;,ú—ÍG®G`@"ã˜jöÒ Ñ+ÌÆ¾,Œôó@N‡ã¸{Bá7Þ"Í×ÝðZW×8ûSm!„DÎ/ÎwÎ÷ŠÔnøü«³À£‰ø[À>Wý\ËèlU’µ ” wÞZ-Z©)+뤊lV¹ s/ë +­„AÏg€!}i1‘Š»? ì…Ú¹æ¦[v°? è!„hÂùÅùÎù^‘Ú æâqŸë¾žŒ4ÿ¯N¤¤Ñ}¾\2Ö!ky²³É‚O&üz„‘~ÎAN'˜@,üø;jë`Òíw€`#ðø½îfÖB!Ñ„ó‹óó½‚G.ú ."KV/Ö'ºÎQ 3®ÎHŒè˜(4"W ƒe©êT‹EbH!ïššSfWŸ&'0"0fCðà’DJ©ÃÀv`L<¶nÓìÏÂúC!$šp~q¾s¾—§¦ÀÝ÷ì—ê¥xlŸ£t"<™4¿ Ù'Eò³A|¤g3¿̧òV‘!©f1 WÖÒ  ŒÃœ-ÛPwZ©¯7Ûpé•kw½ßÍþ,¬?„B¢ çç;ç{yj:¼Õ’®[ºÉQ-®ó%p4‚¹a4®5+V”ª6_ªËY!87wÞ-Õ¨w’±ÐŒ_U¤~o0ñ×3@¦¡¡ßq[“K›—_Óüõ·yögaý!„M8¿8ß9ßËSÓ@#c÷Ïo»ñ£Ž°‰L™=pÒ>T.û!ô‹LðɯVF“¶Ž[å¼w‡í/xµ"£U朆¥Ùgž† öÆ Û•k”“vÜãñÄDòµ˜»òŽ;·¶µ±? î!„hÂùÅùÎù^†Z×Þ¸Î*ÝÄa S‰³Rü‘‡JÏ !¼9ü&ð»ÀY/({7¹`vÎE˜ím/³ûM'xÈ!ÈÈqmÚ3*žê{`°æ’Ƈž]ûû³˜þB‰&œ_ìç{j=lyãœGcÉíŸBt¸êð» ¸ÚZôö.˜}‘  ¥ÿ[`€ï®Vô 0äm}³W1b¤/&LU#N,%å70ý÷‘¦¦µ{öcÓB!Ñ„ó‹ýá|/C­͒Ƨâõ[Ýõõ½ö˜Q¹½É5n%5R¤oÏgxÔ ïŽG¡êUIãÂÂ&Œúý+Ê Ù©Ì†¿-À÷ݾ퇟2ìÏ"ûC!$šp~±?œïóÁp×Í·¼¬v$bÇ”‚ÁÓS0?N„§¤É¼#¼#»JL(L*óbÒ.~ÊGL(•¢UÊýÀæ¥KžX½æögñý!„M8¿ØÎ÷ù`¸kÏ^zW:ŒÉÞúØ9‰óÀàOËyë„s¥Š÷åU`22U¯JaJbZš•ë£Éä ’Gì¸uMMÍ;waßB!Ñ„ó‹ýá|ŸÃõ7¾ ¼ |äŠÖ:gHéüpAy@þj=à…Ëó–© kF¡zÒ?¯—-}O›X,²1u8¼ÚØØüÀ-? {ÿ‹ý!„ò„ó‹ýá|Ÿë¯÷(µþ’Æ}À''&¬î=ü­+|”`Úå ¦£Q§=é{ÖµN8§Ä°£ºC@‹ëW¬x~Ë+‡ØŸÿª?„B¢ çûÃù>'ÿÿÿìÝyp”åðïs¼×nH!ÃU§3¥tœql§ƒþU *­ÔÎ@5Âh¤B5ÊaÀZŽr‰:kË!(J9Æñ€‚Ü)Ç(‚Š#H€%ÙÍî&›lBäFÛçyv7$€x”ãÅüf>óÎîæÝ7;ßùýæ™ß¼ï»K@ZNÎHÇÇ1]U‰kí°ÌÈ+téB‚IU^Œíeü3ˆO¡¶|/X)P¦0d(a(õǶÔÜòR,xÈbêÃïbØé9Û_Ì ~Ð鱿Ÿ±dÉÊç2æC!ÄŸhý¢|h}¿ i³fï“ÖÎGÓ»æì ºª†v”X3”{2Saà»uÕû Ë«Ü™Ê;èíAÎÔP^*Å!‹—˜ßÅøkÿ[²y ¤ò“žùOÌ¥|.o>„Bü‰Ö/ʇÖ÷ ÑpN¯^“€{{"ð2°ØìˆbOD Ï%U8<ª‡K5øê!Ø4W 1RCpÈ'[)Õ\®¦áKìax_ð÷lk¡à…R>Þ©S^ß_™?%åsÙó!„âO´~Q>´¾Ÿ‡€s..nß¡?T,aXgó] ÄY­Ê ¬b·ÑÜQÓ!ÿ0Wì© þ3ÛÚå8›¥XÆÌÉ//8èæ[þ8vÜÊçJäC!ÄŸhý¢|h}? ­ä› ôqÝÀ«ž³‚™¯Å ˆ¸…jUèaÆ@CîÜq< VÁæ(÷Ãæn˜]ÀÇ^àCÏ[ ¼hîñÔãÆ¹ƒÆ½ùÖ:Êç åC!ÄŸhý¢|h}o‰€óýìÖaªVÔ .Ër‹€f¬ŒUŒ†ØYìÛPŸ‹æ$Ý‡Ž·ÅrÞž†²ÞÑwÔßžÿo~§|!„\hý¢|H3ηhù'7tQ=0lvû¬À滥âuq®*^€µV d"å,"|ƒó2Ç 1{7°|Ø`¼—5ì–_<9vÂܵ›6S>W4B!þDëåCšÑp“ ·´ë8Zõ€dó,¼—%÷º<ÌÑ À¢eºô« V2 ~±ZD´…xkÑV.]ÓzŸ*#žÙ9œqá?R;”yö)w﯅àù?ê9b`Þ´W^_Aù\…|!„ø­_”I¡àâ~ÓïY°–(0?½$hí韽ˆpY'œ#@Xw‚W¡ï8Ñí‘ÆQ‘“Z¥DB¢Z"iÔq$9 • ±ŒŠŒp Í/ª=ë’ú1+gìP <æXµ¶úH¬¨R;Ø,"ñ‘ƒ5.Ý…Œçuîv߀ÜñÏÏZHù\µ|!„ø­_”ù’€Kè×o pOÇìIkð/Û³u¹W˜ÛÞ@ ¼nnÌ\k‰Ÿ£€›à™`¨6,Ý ç5CËCUš=Uõ71Ô™ýÃŒ6R_ÁSuoÄÌÓ2‰½6ÖK,˜tïÞ}`ï¾>7gãÖ­”ÏÕ̇Bˆ?ÑúEù.¥OŸ©æ†˜?³VÜÐnov0ì¹ Ë­¯ÖC0¢"Ð}|JÂhYÓzNµDf«kHfT·–hý4Ù‚>²)ô惤J?ý_ ±O°O%ß(õ™¯Ivë6ô®»GMžöbÑö(Ÿ«Ÿ!„¢õ‹òiãhø¿¼½ÜÎý+Ç\`©dÛ$ßm~;b*¯Æq G€Zõ"X5XX¬ªûZŽŽÆTÿèïèe§Øs· ¹†qUýã-öpNÎà_ÝùÔ¤gç­Ý|g_ʇBÈõˆÖ/ʧ-£àëýöž2 FI6ÓË%6ÛºNÒ‘ª 룆éV“)ܨ¹YÞ\3§…M)×´VûÕj âZê]º+9ŽqœPÿH¢ÎQUý®Sþð‚úœ`÷vé: ÷]ÃÇ?=kuÑ&ÊçÚæC!ÄŸhý¢|Ú,¾‘Üܹ99ÀcÀ3kY{o«ÄN ¢Šé3Sªè]Ðf~å5úd™ª]]ÄÑ´Ô8Û<Ñ~e˜ÞÐGPo¯ÒÇaµ™8*Ð(Pë "`í³ùzà` 0,·ëwÇÝC&OŸ¹jÓzÊÇùBñ'Z¿(Ÿ¶‰€ojÂÄÕ=ºò€ñYÎ"Ž· Ùr¿§¿Ž* ÖÖ¤ásµÔÞ¨‰z# ‘€¨4¦¾•¤Qg$3ÌŸÔþܼ‘§Ô1–”¨±YL¢Ô•»<¹x <Ò¡s~Ï›†ô¿¿`ú 3)_åC!ÄŸhý¢|Ú ¾…·ß‰ÝÚK_çð©æØX’%Tñmâ㕌'¯a¬¬Þ4ƒê„“i¬ÙqÓº˜©{½¿®iõ–z¦æfÖ¨ëWt'˜}êÒGS=¦^1!ÊmQêÈ]‚mòìw9 <lÿÏoyß Ÿ›µaëÊÇoùBñ'Z¿(Ÿ¶†€o-ïÁ…:øS;{0C`°VÚÅ^0Äx©¹?&¦†T Ö–g€ÓÐ«ÐØYóôXê×—Êé“YH_ÐvBâÃqóJC=ç ¶h°­ãæ-Ç,^﹉@ 亟¾XÄØ\`20ÜñîÒ#ï¶ÛGŒ™õÚÒU”Ÿó!„âO´~Q>m ßÅâ…á.óÜöŽ=Ÿ^_i»E¶ó¾%?’²Xð‘ìˆÄQÁNJþ…_Jñ_Õ§Ž |.õö¤ÄiÓgÎX8«Èô_%k°y½ÂQ/Pcór×ÚcYEL,þüx‚É!:>ôÓ›óûçNž2mÁ;«·\óp(B!×)Z¿(Ÿ6‚€ïnø£o}:f´¬§Õ( ü]wÔ‹+ßpŠ=@PÅõOÙ5érçg\ñ……Ž9z{Ê1uïଥ{C_?'Ñd¡Éã ®<5«2(*\¨£m›ûÜ'r«À  d¼ñÇõ¾óÉ£g¾¶xí5„ò!„ò=@ëåó½÷?ÿÿìÝyLTWðïm³± ‚µ¶BÀ¤©(FS¶‚{E–ÄÊ&²(V ÃÀ" Š "uCYt¬¨`+*¸E„XµŒuDMµ±±.( *¸Ôõö=Œ‰šŠ0s’_^È2™{òn¾œ 䢼¯o¦äÚØÍ"1š¸8^L縢Õ"_æäpÔ¥[£ÝE[ÍI9Cûråì ÝV+šÔÔ¬¦»îÉW•rG¾ÿ·šûK¤KDõD'‰ŽˆT-R¯üŸ»üæq‚aëàÒÓoø¨ïÃ"³W®)¯¬>eöXÌ/äcÁP:‡>~£sÑD&ÚÑq‘Àg- *"*!Ú)ÐI8ª‘ŽkÕ§m´uwR¢³ê$:סA¾j„zxZ-Ö¨ÄÃ_Éq»‰¶K´RTÞMÏQˆN7Õ£OÈèq† i« vì¯z§Ù×…|Àša~!‹Ðiò‹~:4‰h¢üÜkÈØÃv™ ek)KK™Ræ'ݳ=û¬:¨ÐÛ{ÏÈŸqkG_?fÂÆ±¾›GŽ+ñ¹y˜wi/Sß~<Ü×;9å ”M”ÅÑjqQœ@1Zýà9K²Nš}¥È¬æò±<(`Žþ'W÷9D¾õì%͵ãV¸ußä3¨*lZ½>ò¼!êTVzCŶ¶º:vî;ÿ'»t]¹¡¸xU¹s¦šZ³–\ÑŸþ}Êäšá_pw-±·Ésq((ƒ(‘§X¢@{»Pcü>³¯ù€eÃüB>– ཤÎÿ…ý8š£Q/P«äg4U#d}îQ:qì±Ój1ädÜ,/{ÑPËîµ²çOÙ£GìÎ]vçkyÈÚž±Ç¯Ø£ìÁ?¬é>»ÕÌž¾¾xã½ Øõ묽=|Ìî¶²›¯o¿hi}ÙÔú´¹íÙý‡/ï?amòKí¬¹õå­æWM-ìÚMvã»ß¦ì–ÆFvø`{aþeÿÀCA!ç¦N==dÈ^§n+HÙŽôò6èÝ+Ædº`ö4XÌ/äc þÿÿìÝ PSçðôY—VM„²¨ÅÊCiµí«ŠZÛ¾nj­­Zë‚Q\Q±>ÜQ1 $ˆ BØIdIØB „@«JÕV[ﻡÚVk-íÔšŽgæ7g¾ï’pïü¹wΜÉL€àÏX°àÀpƒ„>¡û´kÓdëLŸÊo–­ànÜ*þé A>Ï þ˜„¤ "ñ3„–4üÒí7*Ñ‹T¸dQsð|Λo±""eù,¬M‹){1I{·¼[ÛÖ£jëVÊÕʹF&ïQª¾ëéÂ:U?hÚ覆•Š›JÅ€²­_­¼¦QõkÔ½š>œZÙ§jïÅvj´Z¬AŠuôc.¶y›`~pÖ’Å5!‹Ä3g”š=e<,Úxx(BË&Œ{÷Ä)ä£çùÐOп Ÿç ÀÇŸ_@!&¦[Ú<Ú$‰hÇ”½³¬ýÙ[6²/QnKĘ¢ ‰±úÆ›-m7¥mýÒ¶^NÑ/S Èä·d­wZïûö[:òo~Së­féív%ÖÕƒ5K±Ó§Õo¯`Ì Ì^º¸qap³¯W•Ɉ$„¶L³{¤áê%‹ÏA>z›ýý òyÞÀ0TîÞ_ 7yßtÌv„B ¶ô¹As¥ _UÌ ,ßΧ¤)k+1‘ka--øz‡Çï7]{à†XòXrK,¹=èÖƒíïW‰ä†B~½A¤áñ´ wù,zsÝ:Þ,ÿœeK”ÍS]8N„„ð [;ÊxãìY!=Ì€~‚þù<‡`’ñ拌F½‡Ð‡¦£bè‹þÓðrõ¼ îÂ5kV×`ìÒu˜¸«Þãr¸u½aOÐu¿‡Çïãñûy¼|ñãv•Ïï‘4öÕ ´••ªÊêk’fLØ€=wwÕª†Ïå¼õºüÕ æys\í/YN<‚tß“bgûä£WùÐOп Ÿç ¿ƒ–Ýl:fɨ†~1Ò8ÆÃ=o~Pã¼ Ák ªç2Þÿ¨ª‚ƒ øXeÅ=vÙ·<î½:îíòò®ò _Ð_U­Ô9H[UÕ[UÕ?_tUµ¶š£i^¯Þ(g÷”–éÁXeXÆeìíå¼×‚¹Asy3}9¯¿*ô!e[¾Ðêa(dÂø¥>ä@?Aÿ‚|žg0Sššn7~À×»vά&¼†,i™˜»x9#¯+`Ýc]½SYù=›ýmQqw K[]{£ª¶·˜%/ã¨tØê2vG[[VÑSVÑ7X»uÛ¡©¨Ð–««Ê{ª+{ËÙ½¥×®rî–r0f9vü$<¿ÈÏ7/`vÅœY?ï’Ù>¬1#÷¢õ/Ž]P5Cù<Ã|è'è_Ïs€'11 DèM£ÐahÉ=ÓGº"䎟××·`ᛌÿÔfޠ媋Jú™ÌëLÖµf/«´»´¼‹Yª.(n-¹Ú>HUÂÒàF ³®âkVDZ˜Ú«%Ý…yêü¼vݶ¬§Ù—_r«…åbaáŠ9ŒÀ¹å¯Ì®\0O2Ó»ÊÛ£Ä@÷oóÖ½øÂ&„‚!Ÿg˜ýý òyÎÁð›ÆMX8v܇F#6 =/7Íž!÷ž*õpæÎlô÷Ï~÷ý¢Â2,¿´7—©*,é¦Ó•YW”LV~sÓ²šhY’b¦š‘×:HÎÈkc䪹 F§Žn­2uQ~_NVÇz{£‘ßž•+ÇŸºìÂë´ì»ôìã•u¾>tü ;Ú0fH¼ÜÊ'Œ>†ÐFSãÏÆŽ}ZŸ…A>þ‰ A>€ÇóôÚ<ÂpBEy‘Êü[çøk|H-þ> þ3J_ Ì>—ú}úån ]J¥7\¤J²²TÙ9jjFs:¥‘F—e3äô+-´,)¾¦Ñå4z¦¢Ñ4´ËºJk×"šêÊåZ†63SwŠü"una[æ)™ÚDNW^ÉÅââzýý2gx–ø{óg©æøªg{É|EEš…¼=nü"Èço΀~‚þù€{0<ÖüàX3óÍ­3:ÆÅñ Éã9¥ÞÏG6ÓGâIª˜>¾kwÏÙ”›©éš´KÒ” ù‚ð|ZS¥ë|ê·Û”ž¤oR§{3ɹuÆT•×”fïi|ó—Èø3ŒÐJÓÑK7…^€|þ†|è'è_ø 9“R3~ÂR„>00ˆ²œtÑÕ•åáVíêRëîV7mz§W©“ó…¥Ë+â\?~¢‹Lî:w®íìÙ–Ó§›’,þÅV:Hvß©VŸ¶C¡{‹bþFiòéÆädaòÞé3ü3)â”4õ‰Ó}Q1}ÁAì©®¥žbçæéSd$FÒ‹#ÓnòÃa-6½8í¢òyªùÐOп ðK0<„Dú¡åm7>…èPìàPnc]F°ã¸¹rIÓª¦rí‰Ék×5ž8y;!QyætçÉcòSÇ[&IŽ?ZÖüבK;Zì(wâ¤(ùŒ">AõuüÍwÞ»8å‘<„.NBw7›k“c•»ÇÕ©È쥛Zäê¶òyªùÐOп ðK0ülg$Ë-65Þdl¼ßÊæ²›Çѹ†`Ïutà ;B‹[–=ñÔÖ0űã‡Ê“‰_K&Êã›$ ÔGHþ¼ÄF\b‚?Ñ‘ÃÍGâ%Iñ¢# õ‰ ¢¤¤–Øý-ñGn®Y£p$Ò=Ü+ñûž@d98•ˆ¥®®ÕŽÄ«ö¶9V“’ú Ÿƒ×¯Ï€|žR>ôô/Èúû#`ø™ÙĕƆŸF¼d–lc¿‡ì•ööWW‰“3ßڶО˜éìz~[xûáøîýû¤ö5ÄE‹lŠÛ/>xà‰6=¬qhUx0®w@„ŸèPlîp¬øplc\l=þ‚¨è¦‡ú?_§$:_rr.!K¬Ù¶N üú‰NÛÉev“Y“-3 v0Xc9i%®„|žF>ôô/Èúû#`¸/dÙ„VüËxÇ(ã8‚Õ–˜mm›ofÁœdQmkWïà $8°'ÛÒHÓ/mÞ"Š’ÇDI"#ªc"ëöG×GïFí=Žð~T/*ŠûOçǃ¿_¹{bØQÑìè½\üD1»Ä±‘M±xÝ%Ú·§>j· jwÓž=êO×¶:ºP9¶Ä\K{Š%‘Jp.±±eÙXU8ØU[MdŒ19jd°eÔÈÿúxo€|þò|è'è_ô÷_ƒàA Ǿj„öš¿˜fç@·%æXŠ&Y1Í&•››WZZrl¬YÖÖ—½}r6lE„·Dïiþ*”½{GMÌnáÎþÎÁãðïÛQ·sGí êÁZ7t;k#"98ü‘Ûù‘Ûëq»Â‘Û{#EøYöì–‡…+V"svËœL ÛØçX;ÐÌl2¬ìò'šXYW¸:×ÛZ²¬Íi¦†Ñh•±áŸùZ\ÈÀ?ô/ÈúûcþîÏü ôÁËsw!bh¸sŠ·²Ì5·Ì6³Ê6³,0³,2ŸÄ´Ð)¶´`L¶¾ì9-oÕÊ–Í_ʶn©Œm¯‰ÜÉû*´nÛ6þÕ=ìÉ/þ5aè6áýßVúUͶ°*¼†Gð¿ØÌݰ©14¬óÓµö„ ‹Lk+†¹E¹EÑÅøÅë®RÞ„RچЪY~ÑÏ_˜ýý òþþXÿÿÿìÝùSU÷ðs¿w}ðÞÂ{€$qŒ’D£qQ£pa´â.*¢à‚MLLÒ¦YšfÚ¦ÙŒöíí<Þc_²ˆ1“4m:I§“_:þ=÷¢Ñ4¢fòf83ŸùÎ…ßï™sæÌ™/hPYíûµwD~mµx'=‚So»}R«=¡Óß§JˆkOˆo|$Þ—4Ý·kÇßýç©“ß>ÿüõ3/\=ý•“'¯žûó£EßùË¡ƒÇŽ †,::t¤ÿÐÑðMÇ.ï=p9ÿÐ7ÇŽÿ;=½ß[‡l·5Úc;í¶n›½];B Â#Øí-Ó'w›¥<¼ °­  ŠâóPâC!$2Qÿ¢øP «“’rl§¬¼f¶”Ùl!ƒ)ckŒ‰ š­ÍÈji±Zšm–F›5`·ºb /è(*üWþ¾ëùû z÷îíÌ?ЗŸ?0—ÇãJþþÏUø?°¯ ¼¯ í=Þ[зcO^þ×~Ÿ’°š«Ì1nܪ¶ç6mÿf[Y­(Öг9^ÒÉES§ì§ø<”øB‰LÔ¿(>ÔßG2Ñ€Òò¢œ#éŠdù »Ã©×û¢õ!}L@oöLAd2†LÆ`Œ1còÚÌ.œ “§»ó÷}—›;´ßÕ]»Â;wvååõåå ŒÃžÁñÚ½ç3UÞÐî¼Ý{{wïíÙµõîÚ;»ãòÎ=ßlÉý[\BuL €Çji{ÆJbü†¯ºšx }”×l¬øÅô²ÀÖ•W|IñyÀøB‰LÔ¿(>ÔßG1Ñ€ /ÉÛ ££þ Ó•ê£c‹¢÷+·.Ú¢£ê‘>ʯrÇê¬æêxGùú¬kÖîÜy5w[oî–®íÛ.ÏÖþñܺõ²jÛàÖí—¶nçîèÑàÃå͹Wr·}–ÖgŠ)1«Œ·É€Æmûuz·Nï¼)Ú‹g1ê²P%½'ñ§¶%+û-ŠÏƇBHd¢þEñ¡þ>Љ>8ìÛuJÀ “ñ<ãKÑ«D5É:¯åTWW§øP”âRÜŠ\i6V›Me³f6de ­ß0¸éWëÖuæä„N—rrú5øÞ¸©gã¦.\7l çl\¿qh]Îi3pp/Ñ)•²\«ÈâÕéÜ:]­.ªZVÕÊ:7žËXbåzÝy€Ó²”o4n¦ø<`|!„D&ê_êè@¶Èëä·Í¦JEqTó‰²[”Úê–%R$·"9V©®1ÊÍ133¿ÈXÑ»iÓõÕkº³2ÃYYÝ?üðÌKY™}¸ff…3³»ÑÚìðÚìKÙ뇞˾º&ó†ÙR¦(%¢PÆXãjdÉ-ËNY®–•JQW!⪇gux Y¸ oÊÒ1€Ì>ºAñyøB‰LÔ¿(>ÔßGK€_|¿ Âƒ.‹© ÈlúDàKÊd%Ä‹ફÔÖjjn©æ¹*€OÞîý„ÄÚÅËúÖ¬ùlyFxõêÞgWu­ZÙ¹rEÂürõ³ÝKZZÛªU½k×ö?÷\_FFûÒ´Ö¥iíéË{ÖmüjÞ‚®X{Çð c˜ýU jTs\9Ç>þ"àªP'ñ..¼®ˆg úÂeËF»£øŒB!‘‰úõwêÐÀü9gEÈ8­?Á¨å 'xG(€ž«ÑjàÀ9£±")¹yñ’¡•«?ÏXÞ›‘Þµ<­3}YGÚÒv\~ù°¤-ëZžÎX^žÞ“–Þ³,­;=ýRúŠ¡‹ú¦MEéKq?y¾g\Ìr¦ªá¸JŽ+U³ÿV0pK¢—A9À» ÎòìÐÌÇ_¡øÜw|!„D&ê_Ôß©¿nB¿Ç_Þ¸óÚh[ÃD@­š÷˜=8DÂpÔ c\-Ž˜ŒUabqì¢ÞP<³+cÅ—Kõ.^Ô‰-ìX¸ -x¦ ?ßMë¸,]Ò¾`AçÂ…]K–\Z¶t`ɲˋ—|6)ÑgPÿ¹Ýy­Ê™àd¼³œ‹©V‡`­° °˜ë8æ“ÅÕüàU€‹µØãûÅçþâC!$2Qÿ¢þNý}twp»¾ç`K”xV/,re˜I.ÌõáGPwG8A…E±V½`âJ­ÖÀìÔþ¹sºçÍmŸÿtÇ3ó:qÅç¹OµÎy²åé9m#hüXüÌ9OµÍŸ×³háÀ‚ù©©á¤¤EWÉÔ›»‹˜ýÀjœny/8æz8mÖ²ÿfxE1(ðNNâß8‹…¯ýºâsñ!„™¨Q§þ>¦‰;¼z¶Ë 4Èoˆð!U’è嘠RË•Êÿ+µ6Ôòp«oÉ@µ(ù$Å ¬†&“7yFˬ”Æ'fµÌy¢}î“O¥¶áóì™MOÎn½»ÔæqIÝ”:»å‰T¬«ðœ¹}))]ñqAƒ¾ŽçÕ}ªËjyÁà >í8û±´W+Wq5Àá<<à9$VJâ{g8vdÇîZŠÏ}ćBHd¢þEýúû˜&î°9çœQ>ÆÔ› ?bÞ‹¼xú»b|Õˆõ‚ êѯ‹ ‰R=Ä8€:lîÄøºi“)3B³RZg¥4ÏLjNž|<¹åñ䦻­(tïëŒé I3‚)IÍ3“Û¦NmqØ:n yÏêïÆÔײߧí @€ë'àÀU’jdå/ü–ãg¬üÅç>âC!$2Qÿ¢þNý}Lw˜?÷%œø@Ïa¸@ªV6Bx4>àÔ<ãx¿ú¾<¦”úöÉ…hÝy›¥:1Á=屆©““ <šèÅç)Õßm­Ÿ2Ùwï+~Ôcàêw¸ÆYª`¬_í}·:õrÞ[ÛSwÈ (@pøL{ý¥òvpX´u¢X+JçñM€âY©/S|î#>„B"õ/êïÔßÇ4q€iSм-T•zg$xy¨Tû‹Q?¼û‚säpb©I&I!QlpªÔJ¨×~yîC€£ä ‹Ù“àhHHhHpÔ;þÄx|®OŒ¯ÿñêKLð%LòÞëšà›ˆs4ÄZ¼:V b\­Nž¿ÃSï­·ÔÀ ¤QoÁÔìg?! ¾ëƒä>dL-€ÄGŠ)>÷B!‘‰úõwêïcš¸€Ý¶‡‡Ã Þ Dà<×ÀXƒ:Jj‰ÂÝæÿ Ì¡Û+~GË<'ƒ:ž¹$^ýÇ:íßÑÙ,VkÐf Z­›5`µùmV¿¶ú¬6Ï]W‹ÕmµxqÅZ2[\¸ÆÄøDæ˜Wd^žóऎ˜:æúîº7‚´pÐtsc\µZ W— 5jàx§ \x àŒ¢ìv»)>ã!„ÈDý‹ú;õ÷1MÜÀf½Y<”`J \ˆqMÚ Ñp¨©V<D”Å "urƒA2è4ƒÁ‹wtz½EG»oŠò ¬·‡xcê˜Û0Â~B´a h¹îÒR  æŽð ¼[R_Ÿ‡ƒW%¯¶¦Ÿâ3ÞøB‰LÔ¿¨¿SÓĬ–Ý?.€&Æ5„àæ9 æ"&¥š ˜¦ÂÅIH‚_½’èÖ¸nqN\ÃÔQ•yq:Çí!‡ _r°Ÿ; À£^~©5P‡Ã½ ¶j¬Çϼ³Ê˺)>ã!„ÈDý‹ú;õ÷1MÜÀbÞuGøhfæG£–"!6œ¶2-5µL áŒðc‡o¬Ô«+æÒ¨×dÚwü?…“îÏ×\šáñ÷.0Ò~´3À³h7zÌ©ñâp/M€UÊü+x—ƒ×°.œo¥øŒ7>„B"õ/êïÔßÇô?ÿÿìëoWÆŸsÎÌ^ìÄ ½©Q?>¢_A**ˆ"ŠÚª@¹4’L“ªPQÒ´ªŠµJ[ nn„6‰œØY{_Öñ®wííÚNê& Šÿ…÷œ™Y¯7ñî¬ý!ƒö‘~zµ;öΞyõþ2ëž©ªÀq P\ÏÆ°Ÿª:EƤÅ`62@Õ8h‹_TX‚=[¹§ë²1'€zêŽ{÷~sŒýÙ\!„$Î/ÎwÎ÷ættx¹¿Øµ}¿gú}ïoÀ™tjö†Ñ’hN¬hTmµQ—ëBpåÖy·Q£ÁIc3}u\LúƒÀÆßÀ¥žž)Ïû3p »½ï¾ÏöøG•ýÙ\!„$Î/ÎwÎ÷ætttêàgÀ+~úŒg¦Ýc"«vœv•ë)(yQŠ"ùÐÉhÅÕ…h«\ðÓ9÷ AmÉB›Ä9g9m·ÁÙ§a¢½qsnå´ñŠž>9–É>ŸòÿÚ× çÙŸM÷‡BH2áüâ|ç|oB§€ÏÝ¿ÞN‰ƒ~æ$0jÔU­þ U…)®¡g ‚¹ |¤ð±ÂÕ (7¹`wÎ-&IÌî¶—Ýý& zzz JL{ŤKÊü 8 ìþÔŽoÿtÏìÏVúC!$™p~±?œïMèôðÜ gá=‘Ê‚zjÄ7×€mÀˆèÝ]0÷¢@¤ÿQd€ùà®Vò 0l}sW1o¥¯–m5ó^ª õßaÿúïw{{÷9r–ýÙJ!„$Î/ö‡ó½ „m;žLw^ëîžp·À¬ÊÝM®%'©ù:}¸ Ø VûéRª¬J[Ô¶lÕ^QEéQc7ü=|çÁ¯|ÿt‰ýÙb!„$Î/ö‡ó}#úò¿v/fRç‚„àë«°oW,*PÒÊÁ‘Á‘Û]5– VŒ}±â¿¢–©(5¨õðôöm?صûwìÏÖûC!$™p~±?œïÁðБ·%õ>H>žÒÝ©k7€O€ÿ8n8'\kT|(¯+‰©²þUƒUëÚ®å6Àíííí{õÕSìÏÖûC!$™p~±?œïÁ`ùÂý¯ÏðÕ`—7k¬tþñ‰¶6¨ó€þÐy —7«QÖLB ¤C–­C_·±X•Sæp øõŽ}>ÚúlÜû_ì!„ÿG8¿ØÎ÷[ò?ÿÿìÝ{pTÕðïïœs» ÏB†W;ý#ý£ÓÇv:è_µb¥•Ú¨FM©Xäa°"ò*FèT[iGãTEAÞ)à(+’K²ÉnÈc’€<k{ÎÙÝDm/“ßÌgîìnîÞì|ç÷›3¿¹÷îò`<1e‹”£{t_ ¼)ñ/[÷É(×[¤z C”ØAùhºJ‚±-I–~²um'´[ÉÍÀR @Ðèììñ_Êù\­|cŒ¯_œ¯ï—Å@JVÖxÏ›"0WW‰ïìqìÈ+Mé"Ý3º¼ˆ’øòCè­8*Ê5ÂB)¡,Û2{ËK±‡ô‡ßGØòÞ–b 0ÈÿF¯ÑÃ~9oåÊœÏU̇1ÆX0ñúÅùðú~)R,<¤œQB<Ì훵7Ã×5´G¢ÔA”PRÕ°±ß4€Ô p¦¼*¬ˆ­¼#Áؤ‡ò2%:¢Ôþ.Æ?}÷ME‹ Ó”õì¼üG 9Ÿ«›cŒ±`âõ‹óáõýR<\4pà àϼl¶{²8$+aÎ%Uy"f†K=øš!Ø6€Ð Pi%‡àH@¶Jé¹\OÃ¥Ž<@xGŠ·\g¹J=Ò«WîàŸNZ²ä ÎçªçÃc,˜xýâ|x}‹–¿\Ü­ûP! èXIØäŠ÷}‘ˆJT{ªN—¨r¿ÕÚ1Û‘à°Wìé þ#×ÙçyÛ•\MöäW(cÄM7ÿfò”EœÏµÈ‡1ÆX0ñúÅùðúÞíäY òÂÓýð‹!o-ٯŠËjuºÐ¢$CC€*< U¢qÌÞ ³x?Þ mž³÷øð­á9#¦¼òMœÏ5ʇ1ÆX0ñúÅùðúÞ}ÿ–1ºVôœ‘±:Ó/öÚ±²¨¨":YUØПPÈÃö$Ýn/´Ãñ^ž w~Çà zæÿ½ùóaŒ1v#âõ‹óa­xèhÅšzôÑ=0´°[æVà]ûÝRÕ ÕBW¼: çœR¨d%dLP¥ !Ê=?Bî~`'Ä:Ð2`j(sÌÍ?üÝäi…·mç|®i>Œ1Æ‚‰×/·µâà2fìèÒó1ÝŠ;x+SôE”Pi€bå¦ô5§N%T ârµˆXÕíÅÚ¹rM›}j¬êôÎÑ´Kÿ‘Þ¡<äVjð:ð"P‘÷íìqÃsç,}i-çsòaŒ1L¼~q>,‰€ËûÙ§@Ùo8ze†³W¦~ö¢R¨F颦BUæŽÓ)UiqeW¨U¨SHX ZÂqB<­*-ÚFë‹zÏ&B3!aSÑÑ$ "EÜs\ý‘¨¨Ñ;¸T©ðž‡ ¾xÉ‘$r{÷»wXÎÔg,ç|®[>Œ1Æ‚‰×/·}ÆÀ 2 ¸»g×agðW»ºšr¯²·½×qˆ*ø1øq{\¼-q‘ia@¤€PgÕRª:4CÛC·{êê?Ih´ûG‰ŽYɯà뺷âöi¹ÂA›–IÌÎðéßøíƒ.xzÑÖ;9Ÿë™cŒ±`âõ‹óa<\É A³í 1O %Ööèr°kF4ä×:~#D‚“áf˜{ä“j­¶5mFádK¤·¦¦DZ]{µíŸ&Ú0G¶…ÞzdéWÃü—cR’ô¡[•9ó5Câ·ýú=tç]fÎy®h×»œÏõχ1ÆX0ñúÅùtr<|ÝVŒìâÿQ X¥èm%öÛßÇ®´•Wïùg€æ´@ƒ~TªUCĬJ+jÅÌf·+;‘B æh¢Æ0‡Õuß Ð,Ð’ìó½²<ì‡ü]Rm ¡«ªCfeüñO&ÎxjñÆí×pöå|cŒÝˆxýâ|:3¾ØÏïþ a$0AÑ|W®QØ ì’8â{ Oé*lN¥µX¶¨>]¸1{³¼½fΈÚR®o¯áóÕCVÉw™®h8-pVÿ#…ÆŒéê÷½"ˆ¿ÏêÏ º§Oßa·ß9vê¬/ÚÆù|½ù0Æ &^¿8ŸN‹€/%'§0++ <vVw íTØëàpXÖ93¥‹þô%m`çWQoN–éÚ5EKI޳­íç6€í sýösjH7À)‰‰Uaç+6KYÀxPNßoþ⎻FÍœ;ݶ͜OòaŒ1L¼~q>_Ö´éëôäS3½¯[ºª’ù:ª¨tÒÀǵu¢ÅMV²ò¸Ukë[KXV"ÍþIï/ìER#QB¡Þ¥¸B™¯ö…Ô&ày`ðp÷ÞyÙß5ô¾ü¹ÏÎç|•cŒ±`âõ‹óé„xø ^}-~Ë@sIœ'f{Xäbe¦ÔÅ·EÉ£$Ž“¨%QOÔj²Í ;á\ µ:cûÁôÙº7û›šÖoi"=7S‹yl^1`÷iLM÷˜~EÆ¥¬pe™§öIÚr_÷Ô`2pF·û~pëø{ïŸVðô‚-;·p>Aˇ1ÆX0ñúÅùt6<|e¹,—xÀÃã]ÜyÀ<‰ÀFå‡2"$Êìý1q=¤ ®ºœ‡¹Xí¬y@ŸÚ§§“'È„¹TΜÌBê‚¶³ ŸÎØWš MB4»²ÙuÎØ·œvDSȯ ‡#¾ÿ€D…ÀL`¬z°Ï€Ü[o—?iÁßV­ã|‚œcŒ±`âõ‹óé×½HõÞP¿?ÇS—@]ZöžÄßÑñ7tÂ5=wU"ål‰¶:~ç^Ä QŸ¢3Äø%ŒÈ6YW×mmuz È\Ö/äãòPžÕ»S*ôž)ħcaù"†)'Zų Þ^‡}û´=/xH—uíoÔ½34ô‹¨º!ÒM‘n;ÜUŽuD¿*2ßót‘èÑ ¢C<µñÔĪ¿sWNnáød¯hßþQ#ÇÌIL-[±º±¥í¤Ós@>àJ°~!†Ð3LY{>ñD%)Ýh,áXÑ¢¢z¢]í¸Ã’pL+žÒkÛæ„@gÚ:ïС%îœÄŸù£þsŽma˜=D;ˆ6 ´‚WÏfb(^§{/0(~l„9vzáʪûZŽ;}îÈ\Ö/äã’PzRåê#ÃÞÌSn¢è>†"ž]ÈÐb–V ÂGzÝ6­¶a¶(4Çîä˜&žvsÌnžöpÌÇq7§^îvR·Ü[Fôä*T+¯º_ì‹ý⃃“'Dfåä®Úºm¿Ó'‹|ÀM`ýB>.à¹0[šýXûz[>“(]¹ˆ¦H•å[¦P?,c+¦âé±\#–“P¤ü3Q*Q‰‰à ƒoü AI“'eÏ˫ٴy_ÛãNŸò÷„õ ù¸€çkÃÆËiiŸŒ _òz±_@ާW Ñû,÷Tü?Äi´Ó$h/ŸØA3Þx;;*zYF¶½¨t{ý–¶ÖÖ£NŸ òxëòéÕPþWMÇ×Õ¶,©Ø^j³çÔfe­1™VffV*ääV•”Ö/©h¨YÛܰãpÛ§¿[äðo`ýB>½ €Ap#(nÀ ¸7‚ðÿ©®=6Ë´qrÔ’ÈñËBG,<Ðà—àŸ28}TXþ¤IÅ…kª:ý}"†ðÕÖžNJÚ<à•¢wˆ¦h5 ¢8ƒ(£4VÝo&‘òRQ¢2ÈPQ4ËÆr| Ë}àã›9a}UͧÏù¸€ž—?·qHˆÕ葨nzGÉ:ÞâíQàc˜oÔçk93Ci|¦q‘u£#êCG×µ©8hC`ÀzoïJŽÊˆl }(òK‰,exiMÆ”/¶púL‘@ï…Ðf›>ö ˜M)‰3_0.$Ê&šëÉ,÷ï»9lhkâÔs¦ÔNsÚI[QGÓö®övùüE¹ó;ùâùÒª —Õ‘ÓruíÛâ2Lqq_M™|tä[ûüê úJ_¯jŽŠ‰rXÊ$Š1x&X³š>käС<“‚ùŸ²|C³%q¨QžA $ÎöZ }â¸#Ó§žµf|S^üScÃ㎳òÝ;ò£‡rw·|ý¶|ý®|ëW¹ëù·¿äîÇòýßå÷äk7åäå[·å3gd{ÝýÂygS“?›s(|Tk ¿ÝC·T+•r”ëø–|âKýMæÌ½NOùô.ÿÿìÝyP“wð_Tõõ*‚7åQ‹•EiµíVE<Úíe­µUkÕZ׋ª€¨X<±Ú€’ &CäH ¹€„„@.BB@P¬X}÷ Õíêô Zqç™ùÌ3¿ß›¼óË|ÿzžÌ; Љ“òÉ~ÛZjo÷ê{ÅÞ.iö,ÖÒH^TdÙ† ü“§:ÄbL­Æº»±[=X»Óêè[0™ï·™ï»z;oÝ#uá/ucFó}ñA› kÖb ÖÙeé†õzìê•îäDYdTñ²•‚E‹ª/qYzÜuô)Þæ:¾ôIjªø™§ù ù Ø|úË7ðóÁ¶ïÚ ßÐV¢3cnh}ø\ùÂWUóÂÊwoP3Ô7*±Z!VW‹56âh/_`’4t>Ò%‘Þ’H{$Ò;}zm»J¥]*åͺZŸo¨«»'b™´ÛëÖñg…äE-Q‡…ʦxq=ˆWÂ?ØZ{›³g‚|`> ý2jü"kûwzßÎ>ÞÓƒ±èÍ¡/WÏ ç-\p}ÍjñÕ+§ô¾°“Ôabѯ›WÓ.™ù¶‡&¾ÀÌtðùÝøâÇm?ª@`’Ö›ÅBCe¥¦²ºS*ÃDuØ·gï}ôQÝßçrßz]ùj¸lÞÜ:o׋c"Ëï`Fº8ù ¨|~=Wf7|­ý{ƒ¬>jçç[0?¼~^¸ðµÕs˜ï~PUÁÅ„¬²â§ì{>ïA ïNyy[y…F 쨪Öõiíc¨ªj¯ªêèƒ/ŒýUm¨æêêD7Å¢®rŽ©´ü÷:Æ.ò.aË—ñ_‹à…ÏåÏ æ¾þª(ˆœë0&¡ÕƒPäèQK!ŸÀ@À¯É¤  E(ÒÎn‡ÕàƒÁ7æÌjÀkä’Æ¹aù‹—1 XØööµÞÊÊ8œï‹¯YlCõ®ªíWÙÊ2®Æ‚£-ãèË8†² SY…¹¯-Ûþ©¨0”^ÕV•›ª+ÛË9í¥׸÷J¹XI9vü$1¿xFpAèìŠ9³¸3Y³ƒØÃ‡î·Bë_±¡pZ–òy†ù @0ü[»0„Þ´µÞ:í'ûpfÉWDöÎâ_Yø&óß' 9E]ô|m1«£¤äf »“UÒÎ.5––·•”j¯\mb]ké£a±uxãË*1âo°T|ÍÖ÷»Äpe,*дX¶e¦¢s!«§ˆaÛ¶«æ„2Ãæ–¿2»rÁ<éÌÀª@?Áò·¸ë^|aBÏ3Ì`‚à½pÄÈ÷­‡l$ ½a/7Ìž® œ"÷óäÍ« É}ûÝâ¢2¬°´=¿DSÄ22êœËê¶o^é9 ôéÕ-³ ©’YÐÌÌ×2óõLf«…e­î7mq¡9/G™Ñ’Çla¶ää+ñ®:·è&=÷#ûpUMpopÃC%îN%¡Ó¥>壇Ch£Í§#F<­g] €ç ?Ï?`ó«(„Þ³±Ž —…†4Í Ñ‘C‚êB¦—¾–{6ý‡ÌKF*CNcÔ] Isr4¹yZZ–,“ZOg(r™JÆåFzŽ_ÓJ:£™N×Ðé:ú¥VK¥·X®ô]sù’‰žeÈζQX¬Í/jξ,§Ð(™êËùXBB{ÈŒìéþ¬@AØ,Íœ`íìEhp-BѶÖÛ „å#G-‚|þâ|,~Æüˆøqã7#´zø°8/÷Ëd_®ÿdñŒ ÅÌ ©?¹bÚTÆ×{Lßž»ž©Ë¸(?wžOÍj¤f)©YŠ>SX^¢5Sij*MC¥ê,Õ²nî75-³Í‚ª¡Ñ”´,)5»—™-¥P›2h2± ”îDj°M€oÃT¯¦à)ª¿:ÿÉëÁ±­±º|ƬMÏ_–À@À“¶nË>âãÁƒ· ³‹÷p»xcYèëU3ůfF²_þœ9û˜ÓÎtdœoM¿ 8G©£d4PÒå?yl« ¤7Q(ª>-Ц¯ª,û‰Ò’~Noñ]K:E‘ž.IÏQÎ (çEße4dPÛ¾Kÿþ«mjr^ ùº¿¯ŒìÙ4}Š&`²,pª`ü Þ£#´ÊnØÒM[ÏC>A> 9sîú¨ÑKz@ˆq˜pÁÛ›íçSííuÃ×§fê´ëþ¥žç—.«H#8sNr.C{â´9&ÎΙâ]êï'ñó”M›¬ ûÕ“' ½ÜK\&·² ¡Å¶Ãg\B>O5€€ÇÉŸ#´ ¡-#G#¹]us+wr,#ºp}¼yä©U“Éù®¤´µëêOœ¼“”¬>sºõä1å©ãM©)ÒÔTÉ“õ'²?ôXŠäXªøXªwâdmÚUb’æ›ÄÛ+WJ¼< È~"/‘¯ÐÇ»ÆÃ½ÊׇëíQO5€€ŸìŽfÐb;›M66&:]òñáº{^'ºòÜ=„øÂ…xÅË'Ç•têËmªcÇ»R¦$«’¿‘§&+’eIIÒ¤¤'ê¤\r=.9IŠtôˆìh¢4%±öh’89©6%¥1þ@câÑÛkÖ¨ÜI ?ßJ¼¯%’Øn¥DR©·wµ;éš«sÞÄ i}ŠÐâõë³ Ÿ§”Às€ŸŒ»ÊÆê3k«cÆ¥9¹^Æ{Db¥««ÐÛ[êá)pt.r%e{z÷Õö–#‰Æûå÷×%ÄÖ9Ôp@rèà¯:Tß§öqõý«¢C 5¸„ƒµøA‡ãpGâ%GâëâÅøbbîølšäyÑÓE$±&s=˜øç'yp'•¹LbOrȶ&ìBXã0aƒ¡†|žF>ÏŠŒ:ŠÐŠ¿Ùì²·I ºÑœI¹ŽÎ…ã^*™ðRµ³‹ØÍMDtãLr¦“§]ܼE£Œ‹‘F﬎‹®9+ŽÝ+ŠÙWûsDbbø11¼Gø?^üíÊÛlj‰åÄîãáÅ}-‰nˆÇë×µû÷Šcöcö4ìÝ«ýdm“»•è–çLÊwp¥:hDO–“3Ûib…›KõıÌá¶©Ö„-öCÿ¸òùÓóx^Àð(ÂÂ/lµFûÆ¿˜áâÆp&å9‹'L,7¡|üøJ®“#ÛÑñR`PÞ† ŠÛc÷Êþµ•³g×õ¸=¢Ý;»w Žà¡]5»wÝèSÝWkúoçî;£¹8üÆè‚èbÜ×Û…Ñ;„û¢kñSöîQnÛ®Zý±ÂÓ'{‘áäšçèFç”5Ñ¥pìø++¼=ÅÎlÇñt;«XúÈÆêüì=äðÿá?ÿÿìÝùsS×ðóî[ek—,ɲ »mNba·16›‚ÙWc°YÌŽÐ$MBÓNÛ4!Žwy‘ô$Ë’÷ /˜BÒ¤Ói:üÒtúOô¾g ùAã3ó™3×Ïó½ç§ï½sŸ„Eê‚wÞäù· |×âˆk´Ç7ÚãÚíqŽØ°SÑçl=*ðjJ뮜=üÃñcß¼sæÛ·N_{çí[§NÜ,,¼ýX7ôø?þ¥;' ï =çäõ§®ž¼Bëé3·½Qpä»'ÊËÿiü8ŸÓY7*¾Ùálw8;ïꢓWæÛj1Tìš;ë,öç9ö!„B(‚à@a±íTß}Ûb–ãF…í±m¶¸›³ÃÛëP8mÎØ†Q±¾„ ¾Íÿvpÿ?þþÈ‘…ǯ;~ùð᫇_?|èæÕ{n=Q=øõ¡CU}}èðõ‚£— Žõ*Žö:q#ïÀÕü‚ïÿïºu!^vÄøœŽ–XÇ»£ÇNklÇ e±mcâÛXøˆ…VÓ>ìÏsìB!„PÁ Àâýn€‚tàwñ4×::¬¶f‹£Ñjk¥l1m¶˜V{L³ÝVï´ÉvkÙŠe×öçÿP°ï›=»ûèËË ïÝÛŸ¿w ïå'«wå_}¢š=?ï–‚öìÙ×»gxÈKÛw]ÊÙóíƒÿNKëµÇÔЀn³6Øb:lÖ.«­M]B3E—`³5OÓeÒ—°p `}nn%öç¹ô!„B(²à`qBân†l¥ß˜Ì¥VkHg­ Ƙ ÉÒDYÌÍs“ÕÜ`µl·QW4{F{~Þ¿rvÜÈÙÑŸ›Û½}{Gήžœœ¾á¸4—sv^SÐANߎÜðŽÜ.jûîðöÜž[{·åÜÙµûǤĀÅTi2zèTÕ9·ªóo0Yƒ”ÅÒ@ÅXBk-ÀI˜?nìNìÏséB!„Pd递²[¼˜%hòEñ=›½V«õEkCZc@kòë AÊ ôA£>`4ÈV“Û¤/IœàÉÙñCvöÀÎW7ooÚÔ¹m[϶m}ðµ8¶l½¢Ø6°e[ß–íÝ[¶_ؼƒêÞ¼½/{ã¥M[¿]›ýÃé2iÀõZL!uÎ4©tF¿Î(+Õ «ÐFÉ&}5À;fÃ)Ž,/+¿ýyÆþ „BEœ‘¾X¹ê÷‚¸ /:êM‰6: Ó7KZ¿¤óh¢ýTtT¥òk£@¾ÉðÇ”ŠRˆåÀ¸€©P«‹ª»\,S ðÀÇÀ|쌯ž=¯gÉ’+óÓËw¿¾¨sÑÂŽ… Ú): ?.~½ëyIMm]´¨{éÒÞ7ÞèIOo››Ú27µ-mþ…嫾ž6£3ÆVɰŸ|AH9M·•ª¸¦Œ!_[´*Ë¡K¨X7 EïJ|¡N›7oÞãn¹`ß„B¡H4¢7ÓSNópLÃA"@9/N~DÀ­b™*5ã~ pN¯/OHlš=g`áâkéó»ÓÓ:ç§v¤ÍkOÛF+E|^RçuÎO §ÏÏO»šva^jWZÚÅ´3fõŒŸŠÒ–Ðù±¬‹%54ÅEÃT0L‰’nï\— ”üÀi–ì™ôâ[ØŸ§îB!„P$Ñ]ÏÁ‡s^=º®"¼ Zɵ4‚K¥ "L5¡1‘TÒàÈ"­Î•8©3}Áí9³ºgÏê fÍlŸ9£šñZ+58~˜–a™;§‹>|ÆŒŽ™3;ç̹8onßœy—fϹïÓ)_^{^ ¸e„«%¬‡¦Xn¢LX9äV.¹4¬×0Ä'òõ©ø À€\³¥ÀëûöçéúƒB!‰FîÀãþ‘µQüi­ø9Ï”Фè¦)P<pkî ¸µ uó|µr„)±XS’{§¦tM›Ú6ýÕöצuÐJÇS_iIy¹ùÕ”ÖGhúXúÌ”WZ§O»0kfߌé}ÉÉá„„vISA”›9E4Ý©æx™°2^2/£r«év(àÈ<äØZF9¤? °åó~óvöç)úƒB!¡FîàÌéN¸['¾Çç,T ¼Ì/@…š+þ/à*ÙW‰¿å-Xpñ‚Od U,_k0ȉ›''5¼4¹9奶©/·¿’ÜJÇS&5¾<¥åá’›†%yJcò”æ—’in§LíIJêŒuuÚ–Uæ©$rRÍr^–ó©KððÓŒ«ÎܤLÁTC—àeÙËx¾Bà?(dȾ[ª±?OÑ„B¡5r7k²ÎéÅD¹éñ'škyÖ¬W¹ ÎV>2à‚W¹5ï×D…x¡   ÈnõÄÇÖŒHššœÔ29©iRBSâ„à‹‰Í/&6>¬R¡'¯'Ô'L &%4MJl7®Ùn h$ú‹YškI a=4ÚªéÖ§ÎÜî_\­‚P%JçXî· {0}៱?OÑ„B¡5r7Ó§žäaÀi€O8p³ ¸nª€”>"àzU>`”ɰ~åóphdTÞ.ý2ZsÞjvÅ;=cG×óBà…x™ŽÇŽ®{X­;Æ÷ä•>jô(Zý±v^_% å„”Tªï³z”SmF¾;=e†‚o¹¨¯·VÜ ¸ å5<_Í ç8þ}€‚Éɧ°?OÑ„B¡5r7ãÇæìx7š«ÔK!åN'³ ˆ%ê'Bþün«› ŽJˆ„Ï7Ô*”¤[§^Žÿàó(±Ülò:íõNg½Ó^g·ûãcé¸.>¶îÁê‹wúœqò“V§/ÎpØëc̲F¢ÿ«˜"LµF<_¯<Õ¾{O§TO ¤Rn¹(é–üpéÊ»¼ţ„(7~Töç)úƒB!¡FîÀfÝÊÂ^g9(æ/ÇÔR¯«A¹Çÿ 4#Þ«ô7j²¬%P÷À*_Œ¥Q¿nÖjn°X‚VsÐb X-‹ÕoµøÕê³X½­f‹Çb–i¥YÙdvÓj4úxRË™'2ËxYÆGåÛ÷й1d ™Æ¡‰1.%àZݜР\/ÇÖr\À…’´ÅãéÇþ ·?!„Bjän¬–¡€ËB1Œ"L£zd0&(Q²ŽXð$(òAIjÄz6¤ÓÖ«:ÿ.ùñ´Z/íåçHÅBpQޱë1Ÿ­4ãªYÖ­F[p«î ¸>ŽõÊÇã|ÈÀ[’´­ºªû3Üþ „BE¨‘»°˜·<p Ó‚¡Câa%kÒЩPC6D3®È× \@àü/ ¼Gå¾Ëóx<ç¤E™cêéô( ^byÄ|î¸^år‹’qk€‘9¾E]`}æý·¬´ û3Üþ „BE¨ÿÿÿìÝïo[ÕðïyνþÑ´”ÚˉLo7 Ä&˜Ø4Mlcc”mm×ZÄ6 ‘•‚ª-TLí6&uÊ6¨ t-­œ&qâ4‰ÆNì¸NHÒ`Óþ™s®¯ã¸Mb'/Ö«û•>:º¾Ž¯Ï}^}ÏÑsø.vßùÓ¦€›ñ0*Ê俬‹€ÃÒ¬r£¸èé’è°/C†¹lБb[Sä‚cÛ`Ü™ÌÍ<hM,N°½}‹€»Þ|ãs/®cGÎ;— DDDDãÀîgÀû¾¶¿ 9fr!l.q1·nG9 ûËÍɬȰȠ3 :SgŽÝnú꫊ήKwëæ3Îg4 ¸Ãö™WùØR0)Ù›®˜¿1I:!g€?»€»ÿ­þ,ëÓi}ˆˆˆˆ"*¾ €»îÚ³6àšPX&QÏ©#m9Á¤¡0¡l|4ÉrÔ¥ä‘ °jÕ:ë Yæ¥\ÑjB«|ËèIÁ“I36θ+‹sw¬ñ½î+²ëÍGcBÛ»È*ub2n’…ÊyºènpÌSƒ 9Û¸;5ÄútZ"""¢ˆŠïàÑ8$8îîg£ä¬ ªæÂëMG“V§L86òADbnÓ¶÷H“œ»¾‘oÍu\®r¹¶Ð8_ϸo|oÓõo5p'ìw©!ûŸ­Ì¨ÌGL€.WqÛˆ¿p÷Þ2à²>ׇˆˆˆ(¢â»¸çÞŸhuPÐg{Üë·LÃåT—'ÚMš¼j¦U}|Ü11wÂ\“+Mﮎ°ë>>Ù8_ßç¶ÉûJ¸n»qÖŸO^×3zÖ¥Û¬»NÁ“9 h“n=àžT8šJý¬¿õé´>DDDDß@ÏýÏ?Žtï8çËûMOK‚²;0‰0ßÞ˜wÛÆW]v  7ɯÕm7Úš²é¶ ë=5â"µ™C1å/j5ç’±¹Ù·?¿½çÞç/\˜e}:­QDÅwðÈ£¯iÙ ôj¼«íO[N(̪IÞ…Ô|L7 aº-6eÜ…µcóÎ÷¦1ºÝù(»ã^ß§¯`¾wVc^aε¸ *¼£µ ¸¿ùò}/f2s¬O§õ!"""Ѝø.¿øQ2¹OáðW­2;ü¢ØxÍpKPS¶Ý¥Ñ*mfzu4ŸR“ñv™?¶iw> Ó‚’gGÛ+¯Ô¤²û³°Ñ¶ ”5òIPã-?Ù'Þ _ùê˹Ü"ëÓi}ˆˆˆˆ"*¾ €¼x*•<œòõ@W¢¤0ãRà¬3ÝL×;e’hÁÅÖ6šbô棲]:³fÅe\e™óeàP1·–P…¤? ð&ôȾ¯=ü*ë³…úET|öæñßÿ]:yÚþ?ZU›k«¨ÇÁ’‹¹mŽ›]«Öö•ÚŸ²Ñ¶ì¡,6éÚ oUßÞžwãLÚŸò½ó@pøñ·¿÷ë³µúEQ¬;»÷¿êJŸö½‹ÀhR_Ô€Š2T¹3êèRÛ%¨hT};–µíÚ7Ê 5…·É=³3UÐú,p8 ©8üOÖgkõ!"""Š¢X/¾õD¿è_'§<}NÛÇ[+îIЪ bn;ê·¸Öú×~ªêg›:™ *aÀ­j—qÅ2ça¯6Û½ãªÖg€Wx~÷—öÿÓ8ë³µúEQ¬ÇúŠ;vötŸï½\L&*î!ÑE“)áÂ(ZSiµ5w®Ùä.ßz?»5ƒYh[-üêvé¦tLv{;¸¥îî)Ïû;ЛÞuð¾žù°Êúl­>DDDDQë€!‰ï¿~ï'/zzÚ=ºb{ÜÅýhŒLA™ƒRøè'.&.»q>l…ÞsŒ›šïP;×l˜ÛænŸv {ßçÜÌií=ÿr2õv*ýrÂò›õeXŸ-ׇˆˆˆ(râ¾xð¡Cðö½~ê,0ªÕuQÿ†ªBWÉ T°I¼|ªð™Âõ`#Û¯Q´pðø‰7+À“@/p:!“]‰‚/€ÿÿq¾pI÷Fk¢­ÇdžåÛf4ó_ÑX|.væáüÕ|:=£åœkp?ÐÓsðõ×ϱ>Û¯Q´üÿÿìÝ{pTÕðïyÜ{w7‚Å ¯vúý«3Žv:è_µb¥•ZGª£*Ö‚<¨ò#t*ŽS†V´¡T¨-•‚ò¦€£<ª±BBH›ì†l² I°@_ôœ³» No:ß™ÏÜÙ½9÷îß_ßß™sOØX·Ü¶˜,ñÄú˜Þ§l4<žS#mÌí’qe™Ë¸™Éã*§"7—†c&ÚV™Ç–ÙŒ^i§½Å»¾Ú¬¦Œ¿ÿþ’ßÿáj×·°>DDDDÿ7ØXÓgmWjBß‚e@©ÄF…¿¹\› ¸uæˆlƽ(àVº‰ðš\Æ­ DZ2m3ÑÜ%ÝÃJì×j°(‘bÂ!Sž~j%ës­êCDDDÔƒ°È*,œ³$™ñxnJ[Ùh{ ¨-ÈK›ø(D¹A}s”åÕ@!pL J :Çj÷Jk…’µž0_&p0¼£ä:`1Pü…~F~ñš5{XŸkX"""¢ž‚ @ÖÒeG´7NÊiÀ¢…ó"&#P¨ò8Õp ò ¸ÊÜ#°ññ„Së’å±pIQcžV«OV¹ÿ{õ—ˆ¿Q‹s´÷•!ã‹\Êú\Ûúõl.:tð`àÏ~lvª"ªêa׊42a'e¹ÞÎ\in½“™ä® ÉQë:ØÙî*OxWÉ·}o•’%Z?Ù¯_ÑðoÏxùå?³>×¼>DDDD=€ Vý¶¢OÁRý0wÀV_¾Qµ q…Æ@7›øQuÈ9p.àÖ†‡[‘øÈ÷Ê‚`·Vk…[ÜÍsË­?œ9k9ës=êCDDDÔ#°èfüÄeÀ° 67{%lnÛû˜jôÐl‚¬D\È£PЇ¡+¡j ã q‰¡qܽíZ¼íF·/¹=|Æ þÒèQcf½ñÇ­¬ÏuªQø±¸Øm·O4Y˜›—·6?² 8è¦&‰!ŽCUBW„6àš'”ê¨[„³?ˆîñ‚7€gÇc½Gß=|êÏ_ø_7·a}ˆˆˆˆz46[½îƒ¾ýMƱ¬Oþà=·wd£F›B£4‰V…w^t-T=TBŠzRÖ‘ZáöBn‚x˜ÍŸxë×2sNé–»YŸëZ"""¢cp óJöôºišÉ¸Z¬ððv¾.ȸ@½ ¸"Ug£­áÕÁ«‡N@^*k"ÑEcw‰n®œYí˜&§178žóÉ2ê¢þQ­o¯%ã¿…c‘ h“2Ûs:—tEK.˜&Üf8nM¼wQµ¥»ÖËkj´2WÙÔÛ)qFâœù!¶¨J˜t vAþxÑ<'ăýŒ¼ëžI³ºô­];YŸÏ·>DDDD¡ÂઌUZXX LžykûD÷jôp4¦š„]ybBí™OÄ\7?-[ìb“MmHMde¦«ÏÏX_6àºìkï`.o²÷­¹€û±B§Bk€†˜wÄ—Û€•À3ÀˆQ¾ø½»ï7Ñ’M;·±>a¨Qx°¸Zsæ¾5xÐd ˜¬–Xlï­+£v»É4D'Äi ·DW§!;-ÕRP'”˯FÚisÒ9îOf¼tÊŒ6!Ò-¾HjTGtYTo~ Ìž(¸yü¯Ž{àáâE/.a}BU"""¢`ð¬ÿSòö¡vÉ{ XîcM¾2ár»V5Bž2%d‹mí.욤û,qÞY—wmÆ.×Úñ6³šKÚLJî´Ÿí›tݘ¶ìÝL†6gTR©¾ªt™;£þ›~˜ <’×çá¯Ý1å¡Gæ”<¿tûÞí¬OØêCDDDl>³¢GW)<à©^þb`±Âj`‹ö+¢yµBV»÷_“B¤V_ÿøìbôsöƒøûz&³FÚ¥ðv± ² ÖÏiüSà¬;Ó!Ð.e‡¯:|כּäŒ'Û£‘T,V‰| äf`µ¥À|`R}¬ÿà¢;îœ\DDDDŸ¯ÿÿÿìÝyLWðïÌ{³³»\‚`mZ1hÒÄ3šÚh+Ô£TÔhmÚŠZ (¨ Ë. ˆ¨TQ© X/°ˆ·6˜*ÄhK«± 1šT£Õ6mcSµô²¥3X“þm‘]ä›|ò²y»™ìûæmòûm&óØ<ŽŠ­ßt™ŒÐgÀz¨UëQ‹~\“§¥âºÆÕŽÍϱÉV5—î“`÷ŸÚ=vXdšÃ½jKEµÇa>DDDDÞ ÀÿõÆØB¿Èd(.Uf+Ê"`¥T+ƒjC:Ôú]ðµ^Òp©ùÖ—¯žeÁºé†ŽŸtüÜì–1ZÌcþº®\•¸œNŸJÔHìVÍçØw 9Ù7 :¤ó¸ÁCgÆ%,_µë`Í)çÀ|ˆˆˆˆÚ6-Ѻ?08eµ&æ 5x(Ê€=‡4QkÕŽÛôÓ>¶:M9©á«fuÎ5«7F«8k•§uyÌ" õ ¢ìv5,—æÕ bìö·ºuéœøÞÜkv8xÂãkg>DDDDm€–T´êó/ee.ÝÁ?[ªó,T±RÓ>ô±o³Ù*e«Q° u§PvKìÊ^‰}BÙ×<îf9[óHÝ¥ÀÃy®ù—¶yÔîÄg;Åôì9ydTjzÆÊŠm‡<¾XæCDDDÔ±x"œ®ª®]܃ܚL’"UQ²5} dA-0˜7è…ŠRøh\dÑAË6> $±Ðã,þSüCbzõŠ3:mvfɦÍjŸðøê˜QÛÅàÉÚ°ñJRÒÇC‡¯èÓ7'4,Ý/ x[•“‰ùIÛ»Vßè€à‰]ºOyñ•´qÑKg¤•gçm/ÛZS]}Ìãka>DDDDO6­j×îëJ..Üž—_ž5§45uµÃ±"%¥Èx‘ž±&7¯lqaeÉڪʵ5‡ë=þm™ÑÓ‡ Q;€ˆˆˆˆ¨a@DDDDÔŽ° """"jGص#lˆˆˆˆˆÚ6­§¸ôø4ÇÆ1ãGX>hAïî°Ðİ®“ûôN~5"kôèœ9sw­.>âñïÉ|¨-âþa>̇ù0ïÄ|¼€'¨´ôL|üæ.Ï'¯cm–X]ŸÄ $©æñ·Sã­x ΘT D«êD!'¨b|pHRÔÈõkJ®y|̇¼÷óa>̇ùx'æãýØ´¼¬Y»úõqúÆ™‡Úb²]º‚|çûÏ ôɲ §‚$©:…tkÂ-¤K.U8…â‚â´[35-C*骚n³dNãçÑó…yŽä=_ó!oÀýÃ|˜óa>Þ‰ù´!lZÌê’ÏÌFûÞ w'ß%>(°!߆¼-﹎=»/Ø¿8<|]Ä5‘k‡X?|ä¦×¢¶ ‰, ²ePxyï>¥=zmè¶>(¨H ÈWð.—.6Ç€~‹æŸôøJ™µ>îæÃ|˜óñŅ-bЦ;> ›DYõ©ÏÎÒ€Y~ʲ®7Gô¯Ž{ç¬#±Á™t*?»~÷öƺº¦s›.7]¼Öté;Ó…+æÌ™ú¦âÒ›ù ¿áh˜4é˱cŽ ~ùPXh™¿OQH@±@®"˜àïëN­òøª™µîæÃ|˜óñŅíúÿÿìÝyP“wÀñ"ÈáZmm=!n4Ê!¢W¥«»ÝU«ÝÞum­Z×{{y,**­€ Ö”1 "W I¸’B¹ÈÉ% xüö ­ÛµÓZÚ­U²ÏÌw~ó¾&Ìgž÷gÂ(,ÿS;þ‘=løË6hÈGØ3ºÃÁv·éÌKá×^]Îûð=I̧êôÔ»Bn7ã;·qOÖ™°®oâ®~Ü{÷ÜÅ·°¾k ¸ïî»&|ã>“Ò¹sïí7 VE³¼˜Kšzf¤S¬£Ã.[´yà¯è^›ðüºõd>qð_0?à>à>Ogà3Ôƒàgvü„tšÿN„V8;ý |\åì”0o.{E/:ªdãFþ‰“íµµX©ÄÝÝøf/6™±Z{_Ûv×h¾§7ß6tõwܼ×ч»ˆ/ucƒùžÆp_oÄ-j¬RáŽ.ËÓ¢Õâ«Wºã£¢ W®,]ZtiìèCÈò ¬·AëˆÇ`ò„÷’“kŸ¸ø@¿l0?à>à>à3}†J°üœ/>dk…ÐÛÃ-Ÿvmž:938¸bñŸ„Ñ«x›¶Õœ½`J°¾wöcmÇm™J/kmSk» ¦~£á^›æŽN{W×Ö¯×öëu·õm½mm7Û4Zm»ÉЫÓõhT]*e·VuÛ ÃFËê,QàÏ“»Vþµ$zuåªUusgNx.åǸahÛpô¾-Z±hÑþ'n>Ð/Ìø€ø€ø EŸ!,?­„¤22yB+GØýÝ}:Æ91R°|icä"îËá|²K–ÏÁ-:¬4aq«AnеU-¥\­l’kdr£RuÛ¨Çmª{šÖ;*EŸRÑ£Tt+[ÚÕʪ]£6i5f"µÒ¬j5/¶iºu:\/ÅÚvÌåá-;„‹"³–/»µT4gVñøÑ'†ís°ÝŽPô¸1¯?ÉŸ§Üzt0?à>à>à3}†\°ü„Þþà<²‰rtچЖ‘ŽIdWVd¸lutëŸçlÝT~‘Ö'aE ®áÚ†ž¦–iK»´Å$#R´ËÝ2y¯¬¹¿ù›n=¨×’üæÖÜÛ(íkUb½7Jñ©SêWV±†ç¬XÖ°$²1$°ÒqxB[ÇÚ3ÂnÍòegÁç©õÌø€ø€ø EŸ¡,ƒÍ/èC[Ç×F}ŒÐv’ sAXCÄé’— ÃK?ûH@KSÞ¨ÀuB\_‡›šˆIíç Œ"IǃºDâ›"q¯HÜ7PïƒÛ?Åâ.…¼³¾NÃçëêëï„8Þ³~=nèåèåÊð°ÆéÞ\OÒ„ˆ_ì}g‡MóæŸ§Ðzt0?à>à>à3}†h° ª±Ï/µwþ+Bo:9Çzy2—þ¹%ìŪ…¼%‹¯¯]S{õ ./¾'¬Æ¢z\[sŸÇëæU›„5f¾PÿM#_`æ ÚùünKÄÅ×·ƒ8£¸Á\+ÔUT¨*ª:ĸ¦Ÿ9{çÝwë¿€û—?Ê_Šh\¸ ÞÇíâÄçŽ"Ë¿“åêòøÐ£ƒùððŸ¡è3tƒàGbä4:ZìèüÆ0»G8ì÷÷Ë[Ѱ0Bø‡ÅUóÃY¯¿UYÆÅB®(»_^r‹Ï»_Íë+-Õ—–©ÂöÊ*Í@mé*+M••í†ÁV¥«âjêk:kkºJËÅ¥7¹×1§g\¯¬äÿ!’±€?'„ûÇ—j‚)9ŸGhÍ05nì ðy| Gó>à>à>CÑg¨ À£J§  #vJ'§íl…ݘ?WBœQË›„ç.[ÉÊcã+œûœkýwËËo^5°9ºª]•7LW9ò®ÊR¹º¤\[R®+)3–”™Nƒåvp••銯ª+KU¦ÒrSqYÇ5îb..*Å_žÀ‘‹ g‡ä…Í+›?—;;ˆ=/˜3jÄ;´á·£7 AÏPÏô`~À|À|ÀÇú|¬ X•£S8B/;Úo†P|ËçKWEõÏæ…„\Yò2ë_'tY]Œ\u!»½¨¨³ˆÓÁ.2qРťú¢bõ•«Íìk­©Ø ñ`°‹ Ä7XN⚣dœ"Ý5¶¡ OŸ×j¹-1™óÙ½œ_€w~¤˜Æ _Pú»y‹ŠçUù³m,ÿmÞúß>³¡Hðy‚>Ìø€ø€øXŸ À6fÜ’ÑcÞ´¾Éí Q2o–à>àc}>V,ßÓ¢ÈØñÏoAhͨ‘û½=²)~Ü€iµ³ƒes‚Å”²™3˜»÷ÏœëIMפ]”ž;ϧe4Ñ2ä´ Ù@M'³|‰ÞB£+it¦±œ–ë–A§¤§ë-ÑTtºœž!¦eÖ¥gŠ©´æ4zû…t¼q£ÜƒD ¨ô“Ìðn™®ô¯˜Vno»¡µö#^™=w3øüj>Ìø€ø€øXŸ5 ÀwÛ¾3}Ôè¿ÙÚnéëé~)$èÆLŠÐÏ»zºõì`þ4ÿÜùóó4§œnO;ß–zAvŽZOM“PS¥ßöЭŒšÚL¥*j¥RU§Âòâ £¶¦žÓZúª5•*KM¥¦ÕPÏ ¨çk¾J“¤Ñô_¥ÞÚ±S@¹D¹à×Hñjž5]8­1h†àùg©Ä3ŒÐ;N#WlÞ~|~æ|À|À|¬ÏÇÊ‚à¡NŸ»>vÜ „Þ°±‰™øÂŽ¿o•÷ ?ßê3¯{z_±²,þhç—ÇõTªþìÙ–3gšN’ë €‡¢P>Dh%B[ÇŒ=Gv¿êî^:er É•ëëą̃œFÉu#§¼¿¾áø‰¾„DåéSm'ŽÉO~Ùœœ$NN}÷ü¶Æ_.ñ±$ѱäÚcÉ¢ã'êRN+âT_Ä÷¬^-òöÌ£ø×x{Öøù }}ª==*ý|¹>ž…ãŸ=nc³¡¥>¾Àç±ú@0?à>à>àc}>Ö,ßöÙ.Ž Zæä°ÙÁáà¤)—|}¹^×In<O!qáJºâí›åF>¹m§âØ—ÝŸ–'%*¿&'ÊãÄ ß9¿“øç—Ø@”˜ &Þèè‘Æ£ñâ¤øº£ µ‰ uIIM±›âö¬]«ð 3ýý*ˆ¹'‘9îžÅ$r±O•ùš›ËåI/¤ ´ŽØƒ7lÈŸÇäÁüÀó>à>àc}>V,ß6þ¹wì>°·ûäÙñ)Sܲ‰r%U¸¹ }|Äž^‚É.näL/Ÿ¯v|Ôz$Þpð€ôÐú¸}uGKâŠzd‡ª{¸†Á5‡ãª‰âÕoôy¬„èH¬èHlC\l-ñ 1û$‡>oÿ`½’ìuÑÓ‹M"³'‘r\« €oŠŠ>ŠÐªß8|êìGr§»s&»äŸPô„*×Zw÷’{ùTeæÅ-[å11òý1â]ŸTíßU}p_í¾½51ÿ¬û¾j$ˆ‰áÇÄðÄ·ôõ‹?~òöî/ÙW¾ïŸ<âöïÅî’Äçîº{kcöcöHöîU¿÷~³‡7ä~Ù…œ;Ñ6‘L'y±§¸p¦L*sw­šôk”c²½ÍVç¯mŸ_Ü‚ùç |À|ÀÇú|¬µÿÿìùSTWÇÏ»oí¦÷nz£qW0JÆDFÀ­4Aãn\Š(‰Æd¦f&“̓";½@ÓÍ"«¬îû$S©8“Ê/“©ù'澇f™¨%j~˜îSõ©S ^ßû©óýáÔë×ÀLšAŸ+À1»¥rø¨À°Ñ±#Ú®ÍÑc·_Œ‰éÛëŸüjcNν‚üïŽýö`nß{‡¯|ðÞí#7Üz7ïsøú‘ÃW.+õú“SpäjAa?…þcá¡›…‡îPÞÍ¿Uxèֱ»ôU޾÷Ïùßgn¹?®vèˆÀ‘±£êlC|®á-V{«+¶÷…ø;Ãb:cíujþ8›%þi>ý ÏöúA?èý ŸÿG?á 2‰sÞxƒçøØsÎÓ`s5ØbZm1ívGÈ)ÓãlëeBóæŒïöí¹÷Îþ;…wå_);û6nîËØzwç®%%uÛ¢+i€­–zkt›ÕÒa±¶(Gh¢Ð#X­M£†uu§Y8°*3³ý<?öæ ý ôƒ~ÂÏOxƒÀü1q[²F”Mg,– V4Xê Ñ£¹‘b65™MS½Åì·š« ÚSÓ§´fg}Ÿ±éZƦÞÌÌÎÛ26wedô †¾Áp1ãí+2t‘ѳ)3´)³ƒ²qKhcf×êõÝ2noÞòC|œßl,5Üt«Êž›•ý×-ŠÙ\O‰6í–*€*1{Äð·ÑÏsñƒ`ÿ`¾ÐúA?è'üü„7‘>œ.¾Á‹ËU¶(µÚª4_”&¨1ø5Æ­>@Ñë‚z]À óô^‹±šNq£Ü›î¥§÷¿½éòÚµ¡5kÚ7lèÚ°¡g¬ï ýëÖ_’ÙпnCϺë6ž_»‰Ò¹vcOúê¾5ëï¾™þµÝYf0ÐxÌÆ ²gšd¿ÖP£5xåª÷ÓShÔ^£® Ð¤?È‘EÅgo¢Ÿgôƒ`ÿ`¾ÐúA?è'üü„=‘>,YúA\¥þ“JuZå×êš$M¤u«¢j(QêZŠF]£Q» ÚJ³±Ìa+^œzuÉâÞ5k.§¯êL³ý­UÇÊîÁлreŸÌªÞ•o]XùV(}õyºè[‘~1}ÕíÄÄ.½¡H§+ÕiÝz-Ý0ÝvJãViªîå¥gÑiü"wZ-|$°û8òfjÚûèçý Ø?˜/ôƒ~Ðú ??aO¤6ë[*)`·^w’°Eï•Ô ¢Ê+ª«äªòª$E-yÕ’[KŒº2£þ̸±u©©ý‹—ô.£gÑ¢¶eËB¿'–-ëV ‹ÐÒåç—.o§uÉòв½‹—ö/Zvcäh:¸©¤Q¬DJòªTn•ªB¥.e*D•›ž…ÆX ÅÕI€ý¢¡Ó­@?ÏèÁþÁ|¡ôƒ~ÐOøù {"}HãÉ6•xܨ/‘¤j€2 >^tób•RÝ¢à¡H‚[ª8R¢‰*×k‹†S))דçt._~mþ‚ŽÔ”PjjÇï½xÊ…Ô”.ZSRC)i”…i¡…iÒ÷¿žvyAÊ £éŒ$ñÜBJ S. nQ¬Å2Q*áUgyZ•ã°¤’žBä¾ä¹c¢° å“Ïn Ÿgñƒ`ÿ`¾ÐúA?è'üü„==dm©6é³²ú/8¶àŒ(YÞL0%J-c üe,S ðÀÇÀ|ìtULŸÕµ`Á¥ÙÉ¡ùó;_›×>onÛÜ9­º ?έãy‘˜Ø=B¥ÀV³p à]‰ÏÓj²fÍzÜ]0ôóx?æ ó…~ÐúA?áç'ˆè`ò„|2ö«ø/hœåÅÃy€r–)W2ð%À î옸Æé3úçο’<»39©}vb[Ò¬ÖÄ™-´RèÏ‹ÄYí³“BɳC³“Î'&Ÿ•Ø‘”t!iNÿ”i]#GÕšÓt?§X¶ŒÎ¸´Ë‰L9Ô0Ìi¹û€€[ཊþH Ÿ%[Ǿpý<µó…ùB?èý Ÿðó Dô °+èøËÁ‡sRmË ï¨ûžv"a •¦‚Ž˜„”ÒÆbÈ)¶,nl{òœ›3¦uNŸÖF™6µuê”Ê”W›)ë‡qnPÌœÑA/>eJÛÔ©í3f\˜5³gƬ¾é3.Ÿ|ZùËíN*(&\aÝ´Ë TyÃò¬€Æ€†¹’!>‘¯ãHÀ_ 2Mæïßèçéü ˜/ÌúA?èý„ŸŸH rwõ ¼©æó5âç7ᥦW&4?‚¦AA/K¯9áåæÉ“ÎO›Ú3erOBBh̘VIUBä;w§h÷©àètËzð c®‡Q†`¥ûïÀËóŽ­bä!þ8Àv–Ï:|¤ ý<…ó…ùB?èý Ÿðó!DîPß®·hÅ£<|ÊB©À{â(Qz¥ä gCއ[~JÊxÁ'H^ å,_¥×{ãF7‹¯q\Ó„[&¾ÔúrB3]ÛðÒøs'¡qP$ŒoHßôbÍUhÂÄ®øøv‡= ÕT²¬¼O9±¤‚å<,çSŽ@'àšeçe@Še˜r`è<,ëgÀ—üGy Ù¾z]úy ?æ ó…~ÐúA?áç'BˆÜ`Ų:q'‘ïý™ö=Ïú€õÈïcKðÈ7È ’ãkTê /ÔÒ˜ 6‹Ûå¨9Ì?:8.þܸøÆ±cãF^ˆkz!®áa•|ò:zTÝ˜Ñø1cãšGŒh²Yý*‰¾nKûžTÖM[_é~Ÿ²C?~Õ¿ €ˆŸVA(¥,÷ÃîJžûôó~Ìæ ý ôƒ~ÂÏO„¹Àä‰xØ ð Õ,CP B93€GÁŒÜg [#?/O[J~úäË(ÕI‹©ÌåtZ7b˜Øÿ——®‡­}X­>Ì÷ä•^jh,­5›[§+…³„œ¥ƒ¯ò¼‹[žzïƒíÉ;$à 0pLyü¥äç04´•<_Á '8þ@脃èç)ü ˜/ÌúA?èý„ŸŸ!r€‘ó6¼ŕꤠ|ψó²m ÓÊ'Fýôì #Kn2Aò|=@•Œœ„ZåÍsŸ|®ÏšŒ§­Îé¬sÚjm¶—ƒ®k]ŽÚ_WŸËésÆxŸ´:}1v¿ÝVmòª$úZEÂT¨¤ù»j`ê}0£Ó-Õ*ÈwÁäî'?€Á/?ëCÈ|JˆWlúy ?æ ó…~ÐúA?áç'BˆÜÀjYÏÂ6Ç9(âÇÔR'’J£0?Sóhý\éo”Ϋ"PÉ’j•¿8C¥|ÅTo6,¦€Ùì·˜ýfKÅ\£TŸÙâyh5™Ýf“—Vš%£©šVƒÁÇ“*ŽxyâeÔ)Ds}Ýšh¸¿1¦L¡µšê•x8¶ŠãN¼'IëÜî^ô3X?æ ó…~ÐúA?áç'BˆÜÀb¾ŠhKqL0 Ê¢6 ·Z-]°àçI@ä’P‰uZMP«©Sðkµ5ð>ÆC‰ŠrßG]ÑZº= ˆ<æÖ=b?Aši”^¯VZŸ üðq¬[ŸÿC’´¡¢¼ý Ö‚ùÂ|¡ôƒ~ÐOøù‰þ ÿÿìûoWÅϽwfw'V›´?¢þø$ø¤¢‚BˆGy4P’PB“ª€¨ÒE`EE /)¸m 4Qx4N¬ul¯½Žëx×^{cÛ¡)âÏáû½³³^;±½cÿkçHGW³cïìÎÑêèÞ±Ó[|n}†­† L$¨Å”jP±iÆ I²á@&¸™ ò™°/^÷êu}k…Ao$­ª¶OÚ¹LOäPˆ-rm2ŸæÜÐÅ/ÍÀ{RîƒpÔß`¿\³9W.—È')Šùb¾È‡|ȇ|ÚOJ”ÞpðÑ4 `ÄñGÁ[dÈ&PÁøÑzkz§IÉe£+]º²½^ºLæÏäï—4ÝÆq´ÈåÕß`³ùXŒYȽø={Í«OÊ}ŒÔÚ|ƾ \08'xçÒ(ù$åC1_ÌùùOûñI‰R\~?Àe§7jT|õͰAùÆ©ï?““k‡¬ðê·._—û¶}¿œ-Š/ýuT÷ŸÙr>#q†ô™{]eú!) ¦€[ò;’´Œ½üÞàø›=òIʇb¾˜/ò!ò!Ÿöã“¥·:td}Ä4%`u·<-&DãFí%Îñ)Ž íìˆs¯A•¼´·œwfrÃØR`'dlœñW“jî0Úø\ÿ…Íæã0îô. ÆÜ„• äa 0ÅÀ•ý Žf c¯6ð狃䓔Å|1_äC>äC>íÇ'%Joxì±gNZœ÷ ÔjRE‘•‹q£Ýv7OIxD“Q„¢4Õâá&ýõE“F¹Ž÷ý”÷}©q¾žŒ5>·éúš`\?Ë ê¾ÑÈ[$`Uà60¦õÖpô Ÿ­ùPÌóE>äC>äÓ~|R¢ô€ÇŸøž3',ºu\=`ÞÇÞIã­â¶Û"‹iSïÐc^ƒq?F*6éVÓOׯFüÛ'çë=X“y+îÙºZ·ù|&]=Ãïþ‚¿ŽÔëy ¬I¨à‚ÁÙ\žòIʇb¾˜/ò!ò!Ÿöã“¥·þÈO€gºöý+´ƒþ™q±oÅ¢êÄ1“­“¾VÞöÞŠJ÷ir½6Z˱¡–æcÔý%WÏpfØGNæPÎ…ËÎÌûäÈ;üøÅãO¼ÐÛ;K>IùPÌóE>äC>äÓ~|R¢ô€Ï<ý+g§Þqú§¯¤2ÎXÔ²á¢7ñdlÜmÇRìþrS6¨´~ojÆÛª³Vçc´‘×{||ùÜY‡Eƒy¿6`ð¶s€ŸøÉ—òùyòIʇb¾˜/ò!ò!Ÿöã“¥·œzéŸÙì1ƒ3ÀŸœÉï ËV-r'´€ Ì”.‡µ2ª*Ûizm”w™ رV%¿¬oiu>Ó•@GÝKgÌ„Ñ}³Pë×€ª”ãl8àðf˜í¶Á‹ÿÄ+Åâ2ù$åC1_ÌùùOûñI‰Ò[þzù.ðL.{¸ºþÎLE°wɬ×ôFãn:&•8µämÝ¢JM1Û~4ºŠ7`Öú •œ¯w€9¹µŒ)eÃ~ƒ?Â=ö©§^#Ÿð¡˜/æ‹|ȇ|ȧýø¤Dé-zóøJþ²#{Iÿ_)Yõ} u»T| Z·ÖìzUbC·®Jëó1jýj€ªÕ$h!6õú»èÇ™Žp* ®ÝÀIà;_þÚëä³3>óÅ|‘ùù´Ÿ4(Õ`×à§—Âà0’uw,¤&‘©&ÑÌ–Jt©ÝÊbΡêXuº«OT5X0Xò%xf®äÜUà,ð¼Í}ûùS#Ÿñ¡˜/æ‹|ȇ|ȧýø¤A©._üRu?Ëf.NáP‡>þ2矩™(­¨€òzm}WÍ;²E%™ æâԜπUÉù%ƒeèÕf»öÝvî ð*2/üÐñó¿#Ÿñ¡˜/æ‹|ȇ|ȧýø¤A©.çºËûœ \w¼ ÜÈfæ  FËâ9x³b£kk}¹®W`÷ú{›]d©e-Äݪ\“û£ @ëo€JW×Tü8ÝqàÄ“=qå5òÙŠùb¾È‡|ȇ|ÚO”ê ²™¯?~fonÚ?&rO÷ÀYÿP¹‚‘ƒJüÉ¿½Vý¸o•‹~:ï!·ÕbBµr͆æ­nƒÓ§aâ½qó~æ¢i”ƒðf6÷V®ã•LøõÏ}þô`a‰|v̇b¾˜/ò!ò!ŸöãÓöJ{øØ'O"8"u0Ì]Fœ¹kÍÿ`jpå5Ù˜¨D®ï|`p7*ÊÑ"tçÜÒ‘4f¿ì¥»ß¤ÁÃÎÁ.À.ÃHhï¸lŸ÷€óÀ±GùÆŽ_ ŸÝð¡èæ‹|ȇ|Èg/ˆßöðò«}žÉtœ…yf8tÿ>Ђ+ÓûU0P‹ Ö?ÀB´ªµ÷0m}ów± Ö7+:º… S²öïпþû­Ã‡¿ñFùì†Eÿ0_äC>äC>{Aü~O¤´ÑþGžÍvž^ïìœðK`êr¿Èµì-µÐäï(wãDÔ?]Þ £ÌÊj[Q÷×ï¨jìˆÓ /ß|ú³g®]¯Ï.ùPôóE>äC>äóÐG~¿' À>ýÔo€#Àk¹ÌM ä %ø¿±îA_®ªLä¤Õ5EgŠÎ<ìÑbÅaÕéÁªŸü½ºÌŠsUcòÖö/ØÿÝ£Çþ@>»çCÑ?ÌùùÏCùýžHÿÿÿìkpTåÆŸ÷röìÙ3¶ÓÔ/Î8Úé`?µ+­Ô:RE‡¡ÅÒ JVÐbNѱå"TÐΈ…‚¶TŠÊV¹”ÆB¹6Ù]rÙVÛ}ßwwC‚aä²9>3¿y'Ù¼{öÌožg2ÿ9{v9 _ø[3õŽÌürDn/ˆ”KTµ@£Ê5¡üüÄgãÕÉ¡¼YÍùW(THTJ{æ¹óƒàJ®qo€›pË-%ó篡ŸÏï‡0?ìýÐýÐO¬üÿ~p°ÜvÇ<`°Èëcz¯²Ñ9ž£VÚté€,s(w“e•#3(çÉš‰~•9m™íp¥‹ÅûµXL/**¹ÿþÒ7þ|©×¿è‡°_ìýÐý\ï•~®µŸÃÀ2}æ6¥&ö/Z,“بðo—ûLêÍŠlÎ+@¥”ks¨Ìµ2ýLu]ʕاÕV`%P*ÅÄ!C&?ùË•ôs¥üæ‡ý¢ú¡ú¹Þ+ÿ¿_²Oöý™ LJ¢Þ~Ï&©\ÙèêŠ Ò&^BòÔ‡0«<Q ÔŽ T TçÇZíny©P²ÎæäËþ{J®ž¦|iÀÄ‘?z~õêÝôsýæ‡ý¢ú¡ú ŸŸ°Â Ëâ%Gµ7^ÊiÀ‚Å ¢&Cûª<ÄN:—0ÈöÊà(l¼N8ê\òŽåÇzL 3”WkUëÉ*÷½F6j±\`¶Vã¿6¤dÊÏ—ÑÏ•õC˜ö‹~è‡~è'|~ €s :xÐÌ^6»|U¨ØkI¾L˜„ÙÁ×Á®Ò Á‘‚ëòdÕÚÌåf®òT¹ÀûJ¾ñV)YªõcŒþ½§V¬øý\q?„ùa¿è‡~è‡~Âç'”p8Ǫ?Vô+z@ª¦«¶DäÁ¨ªSˆ+¤|ÝbâQuØÑY€„+@]þàÞ±g&øC¯Ì÷wiµV¸‹_AÁ˜Ûnÿ錙Kéçjø!ÌûE?ôC?ô>?¡„@7J&-†ù±9ÑØ+¿A¸Å©”‡t‰¸5PÐåЕPµqˆF¸Ä‰¼á¸»¦ 8ÄöÁfà%wÿ˜›¿2zÔ˜™oþe ý\%?„ùa¿è‡~è‡~Âç'|p8Ÿ;îœd²b†à‚‚µ…ÑÀ7V¦€&‰F!ŽCUBWämÌJUã.ÒíóƒÝžÿ&ð,ðh¬ï軇OýÍ Ÿ÷æwú!ÌûE?ôC?ôóEó28œÏëëþÕÿ&ÓÇ!–ô+Ü|à>[*¥Ñ®’&ñºÞQxUÐuP P )TÞ e½­‘ÃÀÈ·!^f…“nÿÆ/fÌ^¶yÇ.ú¹ª~óC?ôC?ôC?áó28\€¹¥»ûÜ0Ít@‹åÞ-ÔG¢2.Ð` Põ6ú¯^tòBYD¢ ©î$ºÑs¦íž&G*·9žãÓ/d6Ô‘­÷o¯¥%_òÄè±Ï­|mý\?„ù¡ú¡ú¡Ÿðù .Ì÷Ġé©)î‹£WxTök/¤nWþ) n›4Ú;Nl=²H4æHjËIf´£]"-Ñ,pR ™£1G¼ š§Î¤íÏℵ€:%“¾×1§$Z&³!"4þécST¾æ©R!ÇÞ8è¡‘£f½°xý\3?„ù¡ú¡ú¡Ÿðù .ʈÏ÷ÝÐwnÌ[ ü!‚½}mÜÝmïÍ@²Ñ¢I÷6¸dWä9l¤+€Ì@ ÅÑ,²M8¯ ]uÒí4é?+ÐîöÇ…8îÈ|oÒäÞ‘t¿Ök‰`«Æ« ó üÇ}×ð ¥ —nß³‡~®¥ÂüÐýÐýÐOøü„=1lØÑ_K,þ¤Å{ZvßÝà’×êG?Îä8´™!Z š R Gƒ#îHØ v[ÏœÊ"ÚìÑd“ÅÖä¾MâŒDG¦?ö3zU}̯¢{•Þ$¤Iÿ,Oü¤¸xÜw¾ûäÜùË7ﺊ³/ýæ‡~è‡~è‡~¾h~z;>›Ü÷;qÀT-EÔ:íÀ^…cQ?ík“ÂÓÀG9:® ¢5Ü„»YÞ½gÎwQníNÛÅi…JY2ϲ­èøXâ¿æ…4Ú•0éú;!×/šó„xð¦#ïºçñY¿ZüÎÎôs}ýæ‡~è‡~è‡~Âç§WÃà’5jYqñ`"ðlÌ[Û/Ø£qÀCML5 {eÊ„þãOÕÀͯ²Õ^,3Ùµ!NdÉŒ³íE àºa`žÞd#ÚrøH¡C¡ÍGcÌ;‘[•À3ÀdˆQ¿üûïÿô‚EoïØJ?ùà‡ô óC?ôC?ôC?½ÑOï…À¥2{Î;7~ Ì*ô_—Xlë«+ûqTiˆˆ³üÇ"ºr²Ã¢N;ÒPÍP'Í.߆´£Ý‘ÎáþdöK÷D™¡]ˆ´FkD$5ª£º,Ð[€ßOŠn,rëøž²àÅEô“W~HÏ0?ôC?ôC?ôÓýôR8\ëÿš¼s¨}Kœ/çùXÁêBe·M«Z!O Ù,d«í§]Lþ—Etò‰ëƒí€p¹·ûm¦ÍSN 37‹û³}Ä6ÁíiÏÍtÌ<¢’Jˆ¨j_—)±#ˆ¼åëÀ à‘‚~ý›“zdvéÂÅÛöl£Ÿ|óCz†ù¡ú¡ú¡ŸÞè§7òÿÿìÝ{L•uÇñÏïò\ÎAœ-µ©[›·f˦+ÌK–æ4[MÔEÌ@B4R!Tм–7PñnMKeNËÊ93§é\µrV®•³ dy×êyNµõW[œçŒÏöÚ³ãAÎxÞû>|wÎÙÃà?—R£b!·•Y”)¬öjó´/ꌟ…¾ó³¤?˜úpî‡Õ®¸ÄÍÐ?/ýù™t?*ç¾™…¿>ÐvEãšÀåÐ3 õR6˜ªÁ4.‡~å’!ë}öy¿ÿŒmSr°NˆåÀl`ªåKk×~\ßþ`~ùšo±—ûпãü°û°û°O$ö‰,\nÇúš¯Ú%> ŒŠµœÕ3X¹Ó´˜Ö!CÕú´’g€¯µøIã%®jyK«ß´ú]À¹®)\VøU»Ç«×®kÜP¸aà¦ó@ÿõÓŸµh0e½C¢^á‚)¿´S†q@¨Àb`%ôÄÖñ©]ïyö‰Q³çÌ[õÆÛÇ}èâü°û°û°O$ö‰ \nßÔɵÀ ø˜i†1×Y……î•çÉJ¾ï·N§€³ÀwÒ½•ÝEwÜå [Ý2pÅÀ%Ë=^³Bsoá¦á^îçç4.¸è“ ¶þɯ/øo£Ô9ΫíÖ‡¾ç^( •îݱKêÀÁÓ9K׬ßö ìCˆóÃ>ìÃ>ìÃ>‘Ø'"pø¿QÕ*:"(u¡ó%ZÖÆÇLl}<®Õ'Ñö†{íÏCÜ{g˜8o¹.XøÞÂ!õÎÑtŸqž?g‰/5>NG€w4ê4¶J÷{î΋•N‹ŽMNl7òÁSÇO*Y¸tËîºÃÞ}¨)p~؇}؇}¼‰}"€ÆÈ~#.!x̶3ãâæ*Y ¼Tkm { uÐ6ù¬£Q¾ã†8bàXÈq‡œt޶:a룖þÀÔ”Ü-Ä`°ÒÀBí¾Z@ Åï²s—”ƒ³ÆŒ›µ¨bó®Ý‡Ã~îìCMóÃ>ìÃ>ìãM졸4¦ÅKßë}¾sÉ­c µœ-0Ob‰a¼åßàóÕ Qã ´’›•ت±]‰í;”Ø:nWî¸Wýå^ðç%4Ë]yÝ[ñ¹£mJ·niC‡dçæ-Y¿aOØO–}¨™q~؇}؇}¼‰}"€&‘ÜyW‡œ6ñ9†žd:C,D¡a½Ì Kî›e²TˆÒ¿óMk>ŒBç?“€TXã͘‰1‰)Ý»O>lúŒüÊU«wÕí;ö³c /Îû°û°7±O¤àд^_y6#ã̓õ¼gNÇN¹­bÓ§¤û·”kúž¶£“cÆtè2ñ¾¦L.›2½º°hãÚšº½{?û¹°y ç‡}؇}ØÇ›ØÇã¸4«-[¿Zµ{A鯢âê‚™UÙÙåÀ¢iÓ;ró*æ­]PZ[¹|gí¦ƒuûN†ý¯eŠ,œöaöaob¯á@DDDDÔ‚p """"jA¸µ \ˆˆˆˆˆZ.DDDDD-""""¢„ @óYVuhr`åð‘ †zfBÌóqQ>•%¡e–Ò9†ÊQ:h¨ TYJ!²üv¾aäi‘+e®©fäYÎåÑíîç™ÛÂ~^ìC^Àùaöaöñ&ö‰ \Myå»}úä9so#§môËQ(ñ¡Ø‡¢X£èÎ6%ݺ¼ÒçÞeII¯öë_Ñoðò®4tÕÃCÖô¼6©ÿš¾IÕ=zVuíþzçN+âã+”Å/Yúe ¨0%ÖèÝkþ¼â#a?Sö¡æÇùaöaöñ&ö‰DÿÿìÝyP“wÀñ"h­G­¶¶* 7h”C@-VÁjëVEgÕ²ò5_–ìÚÁ£$¶–•a.—×a¾ åÆªë¯Üàá¨îȾZU¾hëýÙù“ýè¶£NìxØ«Qæè{„¾éƒV#6ð•ׯ£½ð?5ø@Ï'˜ððŸ—3ðé½Áð?µíoé}úÎ1C+¬ú}ÛÏ’˜ÑmV滜íÎÌ ¼þÑ|öú¯jv¯HJ¸Çcã&¾{··cµ«›°îníÂpû=Ürkš±R‹;ïâÎ;X§Ç7oâ3q-Û·°—-Í^ƘþN¦Ýè3l­­vš£Ý‹î“7G¬Z³:õ… €ôì‚ùððy9ŸÞ,²'…ã<¶#´ ¿Í7¨ûãªþ6‘S§0„²ÃBó×­ãœ<ÕTQe2ÜÖ†ou`½+TT÷t†ûÃmkWó­û͸•øRÖî+µ4:,U`¹7·Ÿ• _»ÚQ–³p wîÜRoïKC@Æg`ZE<o¿ùULLÅ ×èéó>à>à>½Ñ§· ÀŸiÖ¬æf¡-ëkü´kãè·S}|Šg}À [ÌÞ°¥üì¯kÚpKV5ßÉ5¢†F…ªM«ïÒiï7*ïªU÷Ô]U—F}GÓØÑØx«QÙ¢R5éµju»RÞ*—µ©äw´jܬ3®Î5|8¦uáÇùaKJ/®œâ—óæëq¯ZꃶôE_›£ÁÁ{_¸ ø@O+˜ðððé>½(XþX‘Ñ…«ZØÏâ ôýàþQ^¤ìùskC‚Ys>d~·St…‰¥j,ÓcAƒV¬UKur©V&VÈêÄJ‘X'“ßÑip£ü¾²á®\Ò)“´Ë$m2i“BÖ¬”7)z•Ò@¤ä zâÅFe›Z«„XÕ„Yl¼i/8$mþ¼¡sù“'å tʪÏ+ó­… üщSðyÉ} 'ó>à>à>½Ñ§× ÀhÙêóÈ,ÔÚf B›XG;ØÒCEKÂ>˜•±yCÑEJ§€%R\ÉÇÕíuÒv¡´I(Õ‹ˆ$M"I›HÜ!ªïªÿ¹Û¿ÔaL|ë7«ï¨v6ȰF‡k…86V±h1}F`Æ‚yÕ³Cj}½J¬ûF#´yèÀûY¬˜?ï,ø¼´>ГƒùððŸÞèÓƒ §¹{¯7·þÔfà·mµC›P4]8{¦dF`Á;¸”DÙÍb\ÉÃU•¸®Ž˜Ô.Wǯiþ¥V¾à_ÐÁtv×ñËíïŸA«DÜRU©äpÔUUw¹<œ”ܾf gŠÿå°ù²À€Úñ.,'»«¿Ø×ý­6Lr|^BèÉÁü€ø€ø€Ooôé¥ÁУ†Œ˜kÙÿc„>³éîìD›ûWiÀ;¥3‚سgÝX¹¢âÚU\”wŸW†ùU¸¢ü›ÝÆ.ÓóÊ žæç¸:×Àá6q8mƈ‹ßöàäru‚jCO]\,/.mÔâò*|æìÝ/¾¨úËtÖ‡ï‹gÕΘ^åjqäëG‘ñßÉ µó9ø¼T>ГƒùððŸÞèÓ{ƒàw¢fÔÚ œeÝi‹õý¬öz¸gUÏâ½7«tZ ýÓÏK Y˜ÇÅÅ…ŠòosØÊØš‚B9—×TRªì®±;uI‰¾¤¤©;âBÛÓJÕ¥,eUyKEykA‘.¯àëfæã”KxÑBÎ{!ì éœÉ¾¬÷g–û2F‹@hE:tÈðy| 'ó>à>à>½Ñ§· À“JJæ!@ì”66ßZ˜ðõ¾9mJ q†Î¯›˜9o!=‹¯20¯wß+*ºsMË`ªKo¶–ÜÔ_cŠóYrcEŠü"U~‘:¿P—_hè>µÆÛžUX¨Î»¦()Еë Šôy…Í×YwóX8·?‰C‚sü|³¦N›ÂòófLõaì·Ï­}mÐZ„‚’Säàó} ˜ððð1=€'emˆÐkË­}Ð>’[ÑdáâÐ.?¶¯ïÕÙsèÿ<©NËn¥f*rM¹¹-¹ÌfF®ž™§Í+Ðäæ)®^«g\oèNÎ`*‰ƒ‘«%¾Áx×LUc檯3´ÙYŠ+Y ÆÛ|]v®á £#›‰¯dãí;$ÓèÓ ÞZ¾’§ÏÌ•g3´4š,-]–Ë4ÃMM«¡¦ ®å*èYõ݉éYRz¦‚ž©¢Ó¯e=N‘sÅp9M•Nk¸Lo _iHËO]Fv 5ã.í2^¶¼ÌׇF<A|ÇQ¹“^nCChƒÕªAƒžÕgaàÁüÀó>à>àóÿæcÁðëyzmêk†ÐR+ËÝ^¤üÿúiþJR¿O•ÿ¤¼w3Î&ÜKº¤¥Ð„É´ª É‚´4yÆeErJm¥šJeÐÅ´ô:jš¸¦ÒÄTš”J•S©Jê¥FãIm0¾ÒèòôK:jŠ:5ÕøWr™ÙÒÔt!9¹†œ$KÏćéýýR'y2ü½¹SäÓ|S½D¾•í´¶Üaf¶hð¹àóœ} ˜ððð1=“ €_)8$|øˆM­8`¯‹c:Éå9®ÂÏG4ÙGàI*œ8¶ëGÝ™øö„$eâEaüy%¥Ž’"¦¤ˆº«{4‘ñKÉRJ²Œ’,§P”ÆÓx-íq²ä$1Š<9Yœœ" ¤V%¥ È”úÄä¦ IxÝ:±£Å׳Ì˽f‚K½ïx‰—G•ç¸"Kó=­´ì·ÈoÊFðyn>Ìø€ø€ø˜ž) ÀãmÝž4pÐ—ææ›Ø„;½äë}s"‰çîR6Þ£Ìχ3Î#sÚ´¬}û q§›Ï7&\Å“«È‰5äáù‘êÉdIw d²¼û”_ìa䆄x•±s dQB?!±œ|žK>_~.±&‘¢9—p{Ûv™'é²7醧{-ɹ~Òx¹×¸Zï ÜÃÈÄ3ŒÐr› 6n=>ÏÁ‚ùððÓó1±`x¤Óñ7† ]€ÐR3³Ý#߸àêÊôp+uu¹éîV6aâ O¯<'çó Fm9~BC&kΞ•ž9S[óHqüÿºv'ú¹SõÆþsÛ“Œ?"éŽøAa\lu\\yÜiNìiîéx~|¢âD¬a÷^CHPÑx×u¼>&ZÃü|XíÓKp,š,¦âX —èÄÉʸӒˆHùOíK–ð]œ²Hå.Nåîn<7×2'Çw7–«SÎða'ÌÌ6"4×Õm-øà>àcz>&Ù¿ÿÿìùSgÇŸ~»{ºæža.ä2JMŒ7ˆÉšÐhi‚÷DA#j4 ˆ¢&[»›Íæ2FEnæ€án‘Ãà×&Ù­˜lmÕÖîÖþûv#›ÍÆdEÝvæ©úÔSïLAÏû~êùþðTÓ ÷y=ã#€õjñX¨øëèwdlkDd§Åî·ÙG#£îÄÄÜŽŽžÙøììúƒ‡¾+)ùîtÉ×E…£§‹nü²ôNiñí’SwÄí n–”Œ•”\Ÿ`LbüÍÿ^¯Ÿ.).=u~Ðé_½Wô‡÷h=q÷Ýâ;%'o•œüCqñ_²s¾›îŠŽi‹ŒmŸæ uG'ôM‰ìŸâЉu˜}å§ æP¨°ù…9¹èç‰ûA°0_èý ôx~&D0é:mžNYM5Q1M‘±mÑ=6‡ßb´Z¯„‡L‰èˆðÎy¡-7÷^aÁ7¥Å<’7|òØÕÓ'o/¼y¼ðÖƒ¸yŸc7Ž»&3*×Oáñk…E#ú‹EGo½C9Qp«èè­SEwé§ŸüîpÁŸ²vÞK˜Ñ05ºiÊ´¶ˆ˜FË#ªÓlírD =•p'2¼?ÂÚ—2°Cäåßâ¢äqÀþA?èý ôóÿè'PÁ@"ié €×yþ8áíÖðV‹£ÕÞe ï±Úüv‰Þp»oj„÷¹Y;2¿9xàÞ;‡îÞ=ZpµèøØ‘¼ùù7–?äçøÇÜÎË¿}ÿ:‡¯å¹šø Z oî;x=÷í/óÿ-;çoÓ¢=v{C„ÃgµwYí=ôÒÍKû·uµù;Í/E?OЂýƒùB?èý ŸÀóÀà a4¿)?#rÜhp‡GЩ·ÓÞn¶w[lÝ6«„ÝÚi·µDØ =‚Ù싉ìÕkγp`]VVúy"~ìÌúA?èýžŸÀ€eqñ;²Qé L¦fµ¶YgjÑ…5ém£Ág4´™ -&£×l¬Ó©Ï.˜Û•“ý§Ìí×3·eeõoÛÖ¹c 3sp2 O†+™o^• ‹ÌÁíYþíY½”m;ýÛ²6l¹¼5óöŽNˆ÷õz“nUÞs‡¼ÿ½©‰b4¶PÂŒÍVS-Àa¥õ&úy"~ìÌúA?èýžŸÀ&Ø€óec¼°J¡Ì„b³¥V¥ò„ªšU:¯J_¯Ö6Q´šf­¦I§ñê´n“¾ŽNñ1ÎÌí÷22FÞÜ>ºi“ãÆž­[¶nœ[†&ÃÈæ-_HlÙ¼upó¶þÍÛú6m§ôoÚ6˜±axã–»od|iµWêt4.£¾YÞ3M²W­«WëÜRÕzé)T!n½¦ È =‘åeo¢ŸÇôƒ`ÿ`¾ÐúA?è'ðü<Á>¼¶ò=…° ;4äWJåyU¨W­ñ‰ªzQíT†ÖSBC(ªzUˆS§®1ê+m–²i×^[1´qãhƺþŒ7zÖ¯»49Ö^ž Ck×K¬Z»þÒÚõþŒ }2t1¼&ãJƺÛIIZÝ9¦B£vjÕtÃtÛõJ•S©ª½O¨›žE£ò ÜùÅû ö GÞHK/A?éÁþÁ|¡ôƒ~ÐOàù x‚}°˜×+Å,€ýZÍžãx·Ò*(ÝBH­T•n¥è¡„ˆîÑ) åzM¥^{aÆôÆ´´‘¯ ­~}pùòîU«üÿK.­ZuY†.ü+W÷­\ÝCëk«ý«Ö ­X9²|ÕØ´X:¸ŸSŠå‚P- .¥èV*Jeµ2¤R¨”Nzc)S)Ï™Íôó˜~ìÌúA?èýžŸ€'Ø€tžìV ¥zm¹(ÖTñð‚“jåê.ЍpŠŠZŽ”«B«´ê2½îljꔥý«W__öroZª?-­÷½xꥴÔZSÓü©é½”WÓý¯¦_J_1òJúèË©czÃQ<Çs© L• p B­ T b9¯¼ÈÓ*‡%5ô÷Ï{R÷Ñúy?öæ ý ôƒ~ÏOÀÔ@öÎ:ƒ6 G¯ý”cÏ\Äf–÷S L¹\+¨š ’e*>ø˜ìŽê‹^~ù‹%)þeËúñRÏK/v¿¸´‹Bôå²_ô>)’’:^z©ÿÕW/¿òÊ@JJ碤öEIÉKú–¯¼õüÜž0sÃ~ð)!i÷T¨"PÉ0e ùس@«tz„[ÇÂY€"Ÿ¯Ve/^üswÁÐÏÏûA0_˜/ôƒ~Ðú øD£¹ß¶`áȋˮ¦,éOIîY’Ô¼¸+iQ'­úòI‘´¸gI²?e‰Ir_Rrßâ¤ÞääKÉKGæÎ˜Ó¢:O÷p–e+éŒK»œHT1L9Ü—º"œ ÞM  à— X²kúSGÑÏ#ûA0_˜/ôƒ~Ðú €~Á‚ùÂ|¡ôƒ~ÐOàù ‚w(,èQ ;ÕB1²P¡àÝ q”˽Rþ²!ÅÃ)=%•¼Â£Ý@ªX¾V«uÇÇúf$´<=Ã7ëéÎÙÏt=›ØA×3§·>3³ýÁ$¶MŠÄ™­‰3}O'Ò\ùgÍHHè±Y›Ôª–•ö)%–T³œ‹å<òè\O3 ï¼H™S =‚‹e½,ãRðå þ}€|†ìÙ°¹ý<‚ó…ùB?èý ŸÀó$ï°fÕ'a/‘îýšö=Ïz€uI+ÆVüdÀ%Ý ƒޝW†4óŠ:ÓÔbr:l5Ó"½ ±Í3Úg$´Mk‹iz*Þ÷T|ëƒ*¥ùáklLc\lSB\ÛôøŽèhŸÅìUŠôsϱ´ïI a´õåî÷È;¤ðrà%P÷£8xiU(ªñ–;ɰûR^ü úy?æ ó…~ÐúA?ç'HÞ`ÎìÃ<ì(øu,CPŠ* ~".0RŸ1l½ô¼$D €#"ý<‚ó…ùB?èý ŸÀó$ï`6maa7RÎqŒ‹c i”FI¹Q˜ï©ÿ´‡¾¯ô¹ój Ô°¤NÁJ_œ¡”¿ŽÎdh1›L†&£Ñk2z¦z“±^®£ÉõÀj0:7­4KzC­:‡'µqóÄÍ2.:©Sˆ4æz¸7šð1ÐzcL¥Bk§h‘àâØZŽ; P/Š›Î!ô3Y?æ ó…~ÐúA?ç'Hø'ÿÿìßoWÅϽw~¬ªMÒŠGÔ‡ÀHðʨ „!Ä‚h $¡„&¨€¨ÒPEÈŠ ¤¶)´‰i㬽¿¼þ¹Žwíµ7¶q¥ß{gg³vb{ÇyÀÚ9ÒÑÕxvwöÎGçÈ:ºwìô€#‡›0xG,å©‚V%·BÙ(`­6.¾Î‡~>ä{ÂÜ@a ?ç4105¶»úûGE}}#Mõf==.Óä#i[ss;̧ 0-p^vÖ—Ül À?<3ØÇç§ðj&sü½›Kä“”Å|1_äC>äC>ÝÇ'%Jo8|è¹­(i5 `=”O$X/Š)­AŦ)HB?x— ü±ÀqŽ5²»|o8’­ªzLÚ¹LOdPŒ-rí0ŸöŒÚÅ/›÷¥Ü{þ”»Áq¹f{®_«OR>óÅ|‘ùùtŸ”(½àÐã?h @ÖäV⢳HA'PQ¹Q;k:§¤‹ä²ÑŠ•]ºÒÃNv™ÌÉ>(iº­ãh‘Ë)ª¿ ÀNóјÑ{q+zú–Ó˜”{Ï›J”êl ß.)\¼}uŠ|’ò¡˜/æ‹|ȇ|ȧûø¤D).‡¾àš±7jJ|ë›’‹A¹Æ©ï?““E­ ZçœÆµÉ6%Ç®m?(£Ë¢Öî:VžÙu>“q ö™=b¥Æ!)ò€iy$-Ð×?¸œ|ãJ‘|’ò¡˜/æ‹|ȇ|ȧûø¤Dé-‡Û1M˜CÓÇ¥ŽÇ²ÆœHaVY{‰ó&]ŠJ‘¡ž4¦è”·’õ´Q³FÍo=]ñôœŒ­3îÊ3RÍ]¦Zßë¾¢¸Ó| f½‹¢RÐ’,tªì™ª»Á)Oå}£€?_ΓOR>óÅ|‘ùùtŸ”(½àÈ‘g Nk\tÈ{ÖjRE‘•Ëq£Ýs7/HxD óQ„¢´ÕâR›Êîú¢ùm£\Çù~Áù¾Ò:ßÌfZßÛvý‡ÍÇ`Ö~—ÊÛÿ|!£’HÀêÀm`ÆnÔ»€ã ùì·b¾˜/ò!ò!Ÿîã“¥·<ñä÷Œ:¥1d÷À5Pá|ìœ4ÛÙ(n»-ÒXTÍ=ã$1˜uc¤r›¦Û^½?¶Âà>>×:ßìÁ6™Óq϶«u;ÏgÞ43\tî/ºëH½^ª6 Í\R8ŸÉœ5xÛØ?}%•qI£úëÎÄó±q÷+±û«mئÊÖq¶­ï©VÌ:²¼Ùãã+È÷.¬+¬º%°œÂ[ÆH~ñѧ^ÌfWÉ')Šùb¾È‡|ȇ|ºOJ”ÞpæÅ›axBáð'£²½~U[‹Üñµ µ`—Ã:­j{iñþ(ŸRsÐ3JÞl?Òé|5jží^:¥æ”ÝØ· kýP—rú9ƒ7üpH{?ýä§^.—7É')Šùb¾È‡|ȇ|ºOJ”Þð×k÷€g2áà²oÆû‚š4`ç’e§ÅíÆÝqL*qjÅÙºCUÚb¶÷¨ì*Þ²‡eí2 ¬ä|¸¬È­ªúã „9}â3Ÿý5ùìƒÅ|1_äC>äC>ÝÇ'%Jo°7¯úþ¯z«öÿթж¾o i—š‹A‡ãîZÞªZlèÎUë|>ÊZ¿î¡®ml!VÍú»îÆ¥Á÷nCÀià»_ùúkä³?>óÅ|‘ùùtŸ4(Õ ð𳾞«¾7 L†æŽÆšÔD%Rõ$ZÚU‰.õ¨ÒX1høv¬»«OTWXSØp%x©?S1æpx^g¾óü™wÈg|(æ‹ù"ò!òé>>iPª À—¾|E›Ÿ‡ÁeÏH#,ôØÇ_VÜ“" Å 5Pݪ`?ÕpŽìPI&ƒ•8 ã2 ­äü†Â&ìÕ–{osxÁ ‡>ròâïgÈg|(æ‹ù"ò!òé>>iPª À…¡jïÀÏ ùÞ»Àh¬À.mŠçàÌŠí®ml÷å–\ˆÝ›ŸmWt‘޵u§2mî&[£Ô<ï/ÀÙžSO}üÔõ¿7Èg|(æ‹ù"ò!òé>>iPª €H_~ üÆG=³èùݧÝCåzJjñC$ÿt6ú—×ã­rÑ««î Ѹ§Öª“k¶´ªí68û4L¼7nÕÍ\´h¼ªçO„™73=/þ7¾ðųùâùì›Å|1_äC>äC>Ýǧë•öð‰OŸ†wLê Ÿ¹LuO«ÿB5`ª÷¥— ¢yø@áC…{QQ޹`wÎmIcvË^v÷›4xèè5èM( íÖ”y¸œxü±oþèä%òy>ýÃ|‘ùùñ÷{"¥½¼ôʼg‚žóPoA•|óoàC[p%bz· æqÄúÄX‹Vµ^V¢­oî.Ö¬õÕ];š5/¨hý7Ø¿þûí£GO¾þúù< Šþa¾È‡|ȇ|‚øû=‘Ò^Dý=ö^ëë›sK`Öån‘kÓYj­ÍßQîň6¨µ^Ý<£ÌJÛ ´&v׺¿yGu¥'Ýð÷ð­§?îÖH|‘Eÿ0_äC>äC>ÿ÷‘¿ßéÿÿìkpTåÆŸ÷röìn‹Ûéê—Î8:Ó±:c+Ö´RëH•ÂŒ 5–hEa ZÒ©:´Ü«hgÄ‚P[FŠÊEH+—”"!„„\›l–\6‚µýÚ÷}w7$Ã%›ã3ó›w²›³gÏüæyfç?gÏYß¹wð80/z(S0Cpu†*؇‘JRÅyRÏôz¦¿W‰Ã ÊþQá¾*8¬Ô^!6J¹˜6(wÂ…‹éçÚýæ‡ý¢ú¡úé÷•ŸïW€‚—~o¦Þ±€‚_ É9¡J‰ ¨uÔ¸&T^˜øt¼z¨ÈšÕ•B•Dµ´Gž9~q0ù§’ëÜà&ßqGÑÂ…ëèçÚýæ‡ý¢ú¡úÉ‚•ŸïWËwÏfK<±1ª÷)ꥭA¯ÈC®•n²¬q¤å,YSѯ1‡-Ó®¶c±ø8¤6«€YyyE?\ú—¿^éù/ú!ìûE?ôC?ý½ÒÏÍö`8XfÍþP©)Có–+%6+v¹O Ñ¬Hwà‚T»A¹>ÓêìX«SÑOU×5¡R‰ýZmV¥RL5jú3¿^M?×Ëa~Ø/ú¡ú¡Ÿþ^ùù~pH“Ÿ?Ý÷gK,2) {<›¤Je£_4äå$M¼„8*dÔ'0«< qh4Ô ÔÏŽõ¸»ä¥JÉO˜ƒ?$Pñ?Rrð2Pü•aSÆþäåµkwÓÏuôC˜ö‹~è‡~è'x~‚ €4K—Ó^¡”3EÃóËsÂ&Cj<ÄNFt.aGl”)À1Øxt4¸äÕeÇZ'…ÊkUïÉ÷»ÿ‡6k±J`®V…ßUTüË•ôs}ýæ‡ý¢ú¡ú žŸ Âà<÷ÜS<ê‡æ¯[€]¾ªŠ¨&ØsI;Œ›„ÙÁ×Á®Ò É‘‚²dÕÚÌåf®ñT¥ÀÇJ~òÖ(YªõSÆM,øÁ³¯½öwú¹î~óÃ~ÑýÐýÏO ápž5®’÷ˆT?LÖ l ɃaÕ SHøºÝÄ ¢ꈣ§qW€†ìÁ}cÏLð!ïïïÒj½p'¿"9î¼ëçÏÍ^N?7Âa~Ø/ú¡ú¡Ÿàù $úP4u0ÚÎ G_ø›„»-nT%<´› KÄ„¬…ª‚®„®†ª‡ŒA4 Ä$Nf 'ÜÕ0‡€ƒ‘èþHd+°Â]ã?áö¯7aö;ÛF?7Èa~Ø/ú¡ú¡Ÿàù .äîoO5Y1CpNÎúÜpPîÆÊÐ*Ñ,Ä ¨j説-€9B©jÝIºý~d·ç¿,žŒÁŒß½r­¿Óa~Ø/ú¡ú¡Ÿ/›Ÿ€ÁàBÞÚðï¡·™< ±lHî`¯»·TB£K!!Mâu-¼cðj  š âR4©¬AÊF?Ü BG€=ïA¼̉äN½ë[¿znîÊ­;wÑÏ õC˜ú¡ú¡ú žŸ€Áà"””îtËLÓ-Vyø W ˘@“-€ˆC5Úè¼FxMÐqÈ‹eñ^$úïÃå3m·iu$2Ç2|þÌ‘P­Ö€w×RÈ¢¯š6~â‹«ßÜD?7Áa~è‡~è‡~è'x~‚€‹óÃ1 !ÆzªØýpôÚ¯\¥ö¢Iê.åŸb¶ ‘f{ʼn­G‰æ -ÚrJ£M£]#éè’HJ´ œhÉМ!Ö‹ž'Í–gÎ $íßâ¤õ)€%[|¯3dIt­fƒhÒø—-aù¦§J…œxëˆÇÆŽ›óÊÒ5ôsÓüæ‡~è‡~è‡~‚ç'0p¸$cƼÑr‡¶g¾J~1bÄ“<8ãùW”íÛK?7ßa~è‡~è‡~è'x~€/àÞï–“…+±x[‹´<â~»É%¯Ãÿ8›á4Ðiž„h‡h…H@ÆMŽ˜#n7°›]žÓiD§Ý›lµØÝšÜwJœ•èNõÇÞ£W5FýªHxŸÒ[„4éŸã‰'òó'}ïûÏ”,\µu× œ}é‡0?ôC?ôC?ôóeó3ÐáðÅüè¡?Lfh±$¤6hìö)Ô…ý¤¯M ÏŸfèv¸&ˆŽLpãîby÷9KÌE¹£/—¦*aI½Ê¶¢[â3‰ÿ™7Ò芨¸IØ/ƒ\,6Ç ñèmÃÇÞ÷ÀÓs~³ôý²ôÓ¿~óC?ôC?ôC?Áó3 ápEŒ·2?¿˜,ˆzë‡Döh”{¨ªVaÏL™Ðö¹¸ùUvØ“e&»6Äñ4©q¶g¢½d\7ìÌË[í~Dg¦Ÿ*t+túhŽzÇBr;°x˜1nøW|ÿƒ…Ï/ZòÞÎíô“ ~Èåa~è‡~è‡~èg ú¸p¸RæÎ{ÿö‘Ó€‰Àœ\ÿ-‰À‡ƒuuÄÞŽ* Ñ q΂ÿXDoÎAv[ÔGª ꔣÍåÛtt9’Ü¿ÌöÒ½P¦è"©Ñ-ÇÃúPDoþ< LλµhÔ7 ùiñ¢ÅKè'«üËÃüÐýÐýÐÏ@ô3@ù?ÿÿìÝYlTUÇñßYî23]h¥ÁhŸ„ȃ+ѸDŨT`Y" ---Ä -kcÃ.ˆ,¥´,RHÑÒ¦S„$Bˆ! „ ©Â”²Ô{.ÅøDÂRf&óK>¹™ÞN'oÎyøgîär¸ U›N=÷¬¹$ΑÅ>µ±&Iy‹¯^«£BžòŒBœ…ˆø›ÁÛ —[‰ÿ4ûûÁìá¯{ó|³¦½?‰onçÍcsÆìÿ9g[_ÍÛcÞuJ©¶:âèï•Ø°7;z 0èJÍz²[Î;ý?šúÉüúõìk}èÖ¸~؇}؇}Ø'ûÄ#·m@¸L!ì  Ù.JVµÚ>òˆÿý˜SÞ üaëà*ÌÅj—ÌqÍÿñâȤ¹TÎ|˜…Ö Ú.i\höÏ4 D¤l²U“m5ûrÑ’‘€{&<æºû”Ü ¬b0 åwxx@·³sÇÍ_QùûÄrº5®öaöaö‰Ç>ñ…À(/û¥CÆp OªãžcÏ!«mw»íì²ô^­+y øU‹s*qYËëZý­Õ?Þ¸¢Ð¬ð—6ÇËW®j´(´X¸æ=Э¿=¯E“-#‰ˆB£-O¸Ö!ËÚ.T%0˜ŒzH»ôwþfŸI“§/ßôuCÔã°Ý%®öaöaö‰Ç>q„Àõ~Ð3=%Ç²Š¼Q˜ev¼“ÕJ~t‡€ãÀoÒÜÊî‚Yî²ÅU×-\²pÑ1Ç+Ž¿î\³ÌÞ0×Ïi\°p! ›\}.¨ƒÖé:éÂ{µm@¹ÿ=÷Biå:¡¡Á”w;eìÑ+?{̼åµQÂ>tqý°û°û°O<ö‰ îÖ¯—„’‡B„È•ºPˆÀ\-+ÒS2ÚíOKþ1É=j™{hÿì3÷ΰqÆ1üîà¬/âmsÆ;Ò'4~{€o4ê46Hó=wïÅs•œ”š•Ñ¡÷ ÝG 6mÖ¼õ5ußE½ûP[àúaöaö‰Mì×8ÜÙy›ÒÚ‡W\wdZZ‘’S€…ÀJàK…­–jp­]go(°ß{,ìóí·ðƒï wtÕWïuôN[oW²Fˆ*`-°ÌÂ,m^-[  ¾õXf¸G¯Ñ}Lœ½`Ý–šÝQïìCmë‡}؇}Ø'6±Oœâp/Í™·ãégÆyÛÈj—R¨å$és-kI(¸&¨¢Ì[ÐJ®SbƒÆF%6jT)Qå7*³ÜWÁÜr¯¸±…&š‘×ÜŠ¯ïC†;wüòKycç–¯Ùõ7Ë>tŸqý°û°ûÄ&ö‰;ÚÄèÜêG:Žy }Œ¥s€‘Þ"¢Ðr¦EÀÈióa™,¢äæq†íÌ€Uè= „3ÈN’’îÒå½×^Í?náò/¶ÔÕïŽú»cŠ.®öaöaŸØÄ>ñ‚@ÛZºìøˆ›»÷œýD×É-HN ¼-u¿›ÂÿÓÏôw“²RÛ÷í˜9ä©çó{g•~¿ª°¸reY]míΨ¿ö¡XÃõÃ>ìÃ>ì›Ø'Æq¸¯ÖoØýÙâš™%•ÅSVMøpq^ÞüììÙ99s¼c¯œYR±pQuÅÚ†ºúƒQÿoÙ‡â ×û°û°OlbŸXÀˆˆˆˆ(p """"J ˆˆˆˆˆ""""¢Â€ˆˆˆˆ(p """"J ˆˆˆˆˆ""""¢Â€ˆˆˆˆ(ü ÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFFFÿÿì× € ÿ¯’à FFFFFFFFFFFFFFFFFÿÿÆ”›³#ÇIEND®B`‚golly-2.5-src/gui-ios/Golly/layer.h0000644000175100001440000002456412156145314014155 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _LAYER_H_ #define _LAYER_H_ #include "bigint.h" // for bigint class #include "viewport.h" // for viewport class #include "utils.h" // for gColor, gRect #include "algos.h" // for algo_type #include "select.h" // for Selection class class UndoRedo; // export from script.h if we ever support scripting!!! extern bool inscript; enum TouchModes { drawmode, pickmode, selectmode, movemode }; // Golly can support multiple layers. Each layer is a separate universe // (unless cloned) with its own algorithm, rule, viewport, pattern title, // selection, undo/redo history, etc. class Layer { public: Layer(); ~Layer(); // if this is a cloned layer then cloneid is > 0 and all the other clones // have the same cloneid int cloneid; lifealgo* algo; // this layer's universe (shared by clones) algo_type algtype; // type of universe (index into algoinfo) bool hyperspeed; // use acceleration while generating? bool showhashinfo; // show hashing info? bool autofit; // auto fit pattern while generating? bool dirty; // user has modified pattern? bool savedirty; // state of dirty flag before drawing/script change bool stayclean; // script has reset dirty flag? int currbase; // current base step int currexpo; // current step exponent int drawingstate; // current drawing state TouchModes touchmode; // current touch mode (drawing, selecting, etc) UndoRedo* undoredo; // undo/redo history (shared by clones) // each layer (cloned or not) has its own viewport for displaying patterns; // note that we use a pointer to the viewport to allow temporary switching // in wxrender.cpp (eg. in DrawStackedLayers) viewport* view; // WARNING: this string is used to remember the current rule when // switching to another layer; to determine the current rule at any // time, use currlayer->algo->getrule() std::string rule; Selection currsel; // current selection Selection savesel; // for saving/restoring selection bigint originx; // X origin offset bigint originy; // Y origin offset std::string currfile; // full path of current pattern file std::string currname; // name used for Pattern=... // for saving and restoring starting pattern algo_type startalgo; // starting algorithm bool savestart; // need to save starting pattern? bool startdirty; // starting state of dirty flag std::string startfile; // file for saving starting pattern std::string startname; // starting currname std::string startrule; // starting rule bigint startgen; // starting generation (>= 0) bigint startx, starty; // starting location int startbase; // starting base step int startexpo; // starting step exponent int startmag; // starting scale Selection startsel; // starting selection // temporary file used to restore starting pattern or to show comments; // each non-cloned layer uses a different temporary file std::string tempstart; // used when tilelayers is true //!!! PatternView* tilewin; // tile window gRect tilerect; // tile window's size and position // color scheme for this layer gColor fromrgb; // start of gradient gColor torgb; // end of gradient unsigned char cellr[256]; // red components for states 0..255 unsigned char cellg[256]; // green components for states 0..255 unsigned char cellb[256]; // blue components for states 0..255 CGColorRef colorref[256]; // color refs for states 0..255 // icons for this layer CGImageRef* icons7x7; // icons for scale 1:8 CGImageRef* icons15x15; // icons for scale 1:16 CGImageRef* icons31x31; // icons for scale 1:32 unsigned char** iconpixels7x7; // pixel data for 7x7 icons unsigned char** iconpixels15x15; // pixel data for 15x15 icons unsigned char** iconpixels31x31; // pixel data for 31x31 icons bool multicoloricons; // are icons multi-colored? (grayscale if not) // used if the layer has a timeline (see wxtimeline.cpp) int currframe; // current frame in timeline int autoplay; // +ve = play forwards, -ve = play backwards, 0 = stop int tlspeed; // controls speed at which frames are played long lastframe; // time (in msecs) when last frame was displayed }; const int MAX_LAYERS = 10; // maximum number of layers extern int numlayers; // number of existing layers extern int numclones; // number of cloned layers extern int currindex; // index of current layer (0..numlayers-1) extern Layer* currlayer; // pointer to current layer Layer* GetLayer(int index); // Return a pointer to the layer specified by the given index. void AddLayer(); // Add a new layer (with an empty universe) and make it the current layer. // The first call creates the initial layer. Later calls insert the // new layer immediately after the old current layer. The new layer // inherits the same type of universe, the same rule, the same scale // and location, and the same touch mode. void CloneLayer(); // Like AddLayer but shares the same universe and undo/redo history // as the current layer. All the current layer's settings are duplicated // and most will be kept synchronized; ie. changing one clone changes all // the others, but each cloned layer has a separate viewport so the same // pattern can be viewed at different scales and locations. void SyncClones(); // If the current layer is a clone then this call ensures the universe // and settings in its other clones are correctly synchronized. void DuplicateLayer(); // Like AddLayer but makes a copy of the current layer's pattern. // Also duplicates all the current settings but, unlike a cloned layer, // the settings are not kept synchronized. void DeleteLayer(); // Delete the current layer. The current layer changes to the previous // index, unless layer 0 was deleted, in which case the current layer // is the new layer at index 0. void DeleteOtherLayers(); // Delete all layers except the current layer. void SetLayer(int index); // Set the current layer using the given index (0..numlayers-1). void MoveLayer(int fromindex, int toindex); // Move the layer at fromindex to toindex and make it the current layer. // This is called by MoveLayerDialog and the movelayer script command. void MoveLayerDialog(); // Bring up a dialog that allows the user to move the current layer // to a new index (which becomes the current layer). void NameLayerDialog(); // Bring up a dialog that allows the user to change the name of the // current layer. void MarkLayerDirty(); // Set dirty flag in current layer and any of its clones. // Also prefix pattern title and layer name(s) with an asterisk. void MarkLayerClean(const char* title); // Reset dirty flag in current layer and any of its clones. // Also set pattern title, removing asterisk from it and layer name(s). void ToggleSyncViews(); // Toggle the syncviews flag. When true, every layer uses the same // scale and location as the current layer. void ToggleSyncModes(); // Toggle the syncmodes flag. When true, every layer uses the same // touch mode as the current layer. void ToggleStackLayers(); // Toggle the stacklayers flag. When true, the rendering code displays // all layers using the same scale and location as the current layer. // Layer 0 is drawn first (100% opaque), then all the other layers // are drawn as overlays using an opacity set by the user. The colors // for the live cells in each layer can be set via the Prefs dialog. void ToggleTileLayers(); // Toggle the tilelayers flag. When true, the rendering code displays // all layers in tiled sub-windows. bool CanSwitchLayer(int index); // Return true if the user can switch to the given layer. void SwitchToClickedTile(int index); // If allowed, change current layer to clicked tile. void ResizeLayers(int wd, int ht); // Resize the viewport in all layers. bool RestoreRule(const char* rule); // Try to set the current layer's rule to a previously known rule. // If this succeeds return true, but if it fails then warn the user, // switch to the current algorithm's default rule, and return false. // The latter can happen if the given rule's table/tree file was // deleted or was edited and some sort of error introduced. //??? move following color stuff into colors.* void CreateColorGradient(); // Create a color gradient for the current layer using // currlayer->fromrgb and currlayer->torgb. void UpdateCloneColors(); // If current layer has clones then update their colors. void UpdateLayerColors(); // Update the cell colors and icons for the current layer (and its clones) // according to the current algo and rule. Must be called very soon // after any algo/rule change, and before the viewport is updated. void InvertCellColors(); // Invert the cell colors in all layers, including the dead cell color, // grid lines, and the colors in all icon bitmaps. void SetLayerColors(); // Open a dialog to change the current layer's colors. #endif golly-2.5-src/gui-ios/Golly/layer.m0000644000175100001440000022615012156145314014155 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "viewport.h" #include "util.h" // for linereader #include "utils.h" // for gRect, Warning, etc #include "prefs.h" // for initrule, swapcolors, userrules, rulesdir, etc #include "algos.h" // for algo_type, initalgo, algoinfo, CreateNewUniverse, etc #include "control.h" // for generating #include "select.h" // for Selection #include "file.h" // for SetPatternTitle #include "view.h" // for OutsideLimits, CopyRect #include "undo.h" // for UndoRedo #include "layer.h" #include // for std::map // ----------------------------------------------------------------------------- bool inscript = false; // move to script.m if we ever support scripting!!! int numlayers = 0; // number of existing layers int numclones = 0; // number of cloned layers int currindex = -1; // index of current layer Layer* currlayer = NULL; // pointer to current layer Layer* layer[MAX_LAYERS]; // array of layers bool cloneavail[MAX_LAYERS]; // for setting unique cloneid bool cloning = false; // adding a cloned layer? bool duplicating = false; // adding a duplicated layer? algo_type oldalgo; // algorithm in old layer std::string oldrule; // rule in old layer int oldmag; // scale in old layer bigint oldx; // X position in old layer bigint oldy; // Y position in old layer TouchModes oldmode; // touch mode in old layer // ----------------------------------------------------------------------------- void CalculateTileRects(int bigwd, int bight) { // set tilerect in each layer gRect r; bool portrait = (bigwd <= bight); int rows, cols; // try to avoid the aspect ratio of each tile becoming too large switch (numlayers) { case 4: rows = 2; cols = 2; break; case 9: rows = 3; cols = 3; break; case 3: case 5: case 7: rows = portrait ? numlayers / 2 + 1 : 2; cols = portrait ? 2 : numlayers / 2 + 1; break; case 6: case 8: case 10: rows = portrait ? numlayers / 2 : 2; cols = portrait ? 2 : numlayers / 2; break; default: // numlayers == 2 or > 10 rows = portrait ? numlayers : 1; cols = portrait ? 1 : numlayers; } int tilewd = bigwd / cols; int tileht = bight / rows; if ( float(tilewd) > float(tileht) * 2.5 ) { rows = 1; cols = numlayers; tileht = bight; tilewd = bigwd / numlayers; } else if ( float(tileht) > float(tilewd) * 2.5 ) { cols = 1; rows = numlayers; tilewd = bigwd; tileht = bight / numlayers; } for ( int i = 0; i < rows; i++ ) { for ( int j = 0; j < cols; j++ ) { r.x = j * tilewd; r.y = i * tileht; r.width = tilewd; r.height = tileht; if (i == rows - 1) { // may need to increase height of bottom-edge tile r.height += bight - (rows * tileht); } if (j == cols - 1) { // may need to increase width of right-edge tile r.width += bigwd - (cols * tilewd); } int index = i * cols + j; if (index == numlayers) { // numlayers == 3,5,7 layer[index - 1]->tilerect.width += r.width; } else { layer[index]->tilerect = r; } } } if (tileborder > 0) { // make tilerects smaller to allow for equal-width tile borders for ( int i = 0; i < rows; i++ ) { for ( int j = 0; j < cols; j++ ) { int index = i * cols + j; if (index == numlayers) { // numlayers == 3,5,7 layer[index - 1]->tilerect.width -= tileborder; } else { layer[index]->tilerect.x += tileborder; layer[index]->tilerect.y += tileborder; layer[index]->tilerect.width -= tileborder; layer[index]->tilerect.height -= tileborder; if (j == cols - 1) layer[index]->tilerect.width -= tileborder; if (i == rows - 1) layer[index]->tilerect.height -= tileborder; } } } } } // ----------------------------------------------------------------------------- void ResizeTiles(int bigwd, int bight) { // set tilerect for each layer so they tile bigview's client area CalculateTileRects(bigwd, bight); /*!!! // set size of each tile window for ( int i = 0; i < numlayers; i++ ) layer[i]->tilewin->SetSize( layer[i]->tilerect ); // set viewport size for each tile; this is currently the same as the // tilerect size because tile windows are created with wxNO_BORDER for ( int i = 0; i < numlayers; i++ ) { int wd, ht; layer[i]->tilewin->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; layer[i]->view->resize(wd, ht); } */ } // ----------------------------------------------------------------------------- void ResizeLayers(int wd, int ht) { // this is called whenever the size of the bigview window changes; // wd and ht are the dimensions of bigview's client area if (tilelayers && numlayers > 1) { ResizeTiles(wd, ht); } else { // resize viewport in each layer to bigview's client area for (int i = 0; i < numlayers; i++) layer[i]->view->resize(wd, ht); } } // ----------------------------------------------------------------------------- /*!!! void CreateTiles() { // create tile windows for ( int i = 0; i < numlayers; i++ ) { layer[i]->tilewin = new PatternView(bigview, // correct size will be set below by ResizeTiles 0, 0, 0, 0, // we draw our own tile borders wxNO_BORDER | // needed for wxGTK wxFULL_REPAINT_ON_RESIZE | wxWANTS_CHARS); if (layer[i]->tilewin == NULL) Fatal(_("Failed to create tile window!")); // set tileindex >= 0; this must always match the layer index, so we'll need to // destroy and recreate all tiles whenever a tile is added, deleted or moved layer[i]->tilewin->tileindex = i; #if wxUSE_DRAG_AND_DROP // let user drop file onto any tile (but file will be loaded into current tile) layer[i]->tilewin->SetDropTarget(mainptr->NewDropTarget()); #endif } // init tilerects, tile window sizes and their viewport sizes int wd, ht; bigview->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; ResizeTiles(wd, ht); // change viewptr to tile window for current layer viewptr = currlayer->tilewin; if (mainptr->IsActive()) viewptr->SetFocus(); } // ----------------------------------------------------------------------------- void DestroyTiles() { // reset viewptr to main viewport window viewptr = bigview; if (mainptr->IsActive()) viewptr->SetFocus(); // destroy all tile windows for ( int i = 0; i < numlayers; i++ ) delete layer[i]->tilewin; // resize viewport in each layer to bigview's client area int wd, ht; bigview->GetClientSize(&wd, &ht); // wd or ht might be < 1 on Windows if (wd < 1) wd = 1; if (ht < 1) ht = 1; for ( int i = 0; i < numlayers; i++ ) layer[i]->view->resize(wd, ht); } !!!*/ // ----------------------------------------------------------------------------- void SyncClones() { if (numclones == 0) return; if (currlayer->cloneid > 0) { // make sure clone algo and most other settings are synchronized for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { // universe might have been re-created, or algorithm changed cloneptr->algo = currlayer->algo; cloneptr->algtype = currlayer->algtype; cloneptr->rule = currlayer->rule; // no need to sync undo/redo history // cloneptr->undoredo = currlayer->undoredo; // along with view, don't sync these settings // cloneptr->autofit = currlayer->autofit; // cloneptr->hyperspeed = currlayer->hyperspeed; // cloneptr->showhashinfo = currlayer->showhashinfo; // cloneptr->drawingstate = currlayer->drawingstate; // cloneptr->touchmode = currlayer->touchmode; // cloneptr->originx = currlayer->originx; // cloneptr->originy = currlayer->originy; // cloneptr->currname = currlayer->currname; // sync various flags cloneptr->dirty = currlayer->dirty; cloneptr->savedirty = currlayer->savedirty; cloneptr->stayclean = currlayer->stayclean; // sync step size cloneptr->currbase = currlayer->currbase; cloneptr->currexpo = currlayer->currexpo; // sync selection info cloneptr->currsel = currlayer->currsel; cloneptr->savesel = currlayer->savesel; // sync the stuff needed to reset pattern cloneptr->startalgo = currlayer->startalgo; cloneptr->savestart = currlayer->savestart; cloneptr->startdirty = currlayer->startdirty; cloneptr->startrule = currlayer->startrule; cloneptr->startfile = currlayer->startfile; cloneptr->startgen = currlayer->startgen; cloneptr->currfile = currlayer->currfile; cloneptr->startsel = currlayer->startsel; // clone can have different starting name, pos, scale, step // cloneptr->startname = currlayer->startname; // cloneptr->startx = currlayer->startx; // cloneptr->starty = currlayer->starty; // cloneptr->startmag = currlayer->startmag; // cloneptr->startbase = currlayer->startbase; // cloneptr->startexpo = currlayer->startexpo; // sync timeline settings cloneptr->currframe = currlayer->currframe; cloneptr->autoplay = currlayer->autoplay; cloneptr->tlspeed = currlayer->tlspeed; cloneptr->lastframe = currlayer->lastframe; } } } } // ----------------------------------------------------------------------------- void SaveLayerSettings() { // set oldalgo and oldrule for use in CurrentLayerChanged oldalgo = currlayer->algtype; oldrule = currlayer->algo->getrule(); // we're about to change layer so remember current rule // in case we switch back to this layer currlayer->rule = oldrule; // synchronize clone info (do AFTER setting currlayer->rule) SyncClones(); if (syncviews) { // save scale and location for use in CurrentLayerChanged oldmag = currlayer->view->getmag(); oldx = currlayer->view->x; oldy = currlayer->view->y; } if (syncmodes) { // save touch mode for use in CurrentLayerChanged oldmode = currlayer->touchmode; } } // ----------------------------------------------------------------------------- bool RestoreRule(const char* rule) { const char* err = currlayer->algo->setrule(rule); if (err) { // this can happen if the given rule's table/tree file was deleted // or it was edited and some sort of error introduced, so best to // use algo's default rule (which should never fail) currlayer->algo->setrule( currlayer->algo->DefaultRule() ); std::string msg = "The rule \""; msg += rule; msg += "\" is no longer valid!\nUsing the default rule instead."; Warning(msg.c_str()); return false; } return true; } // ----------------------------------------------------------------------------- /*!!! void CurrentLayerChanged() { // currlayer has changed since SaveLayerSettings was called; // update rule if the new currlayer uses a different algorithm or rule if ( currlayer->algtype != oldalgo || !currlayer->rule.IsSameAs(oldrule,false) ) { RestoreRule(currlayer->rule); } if (syncviews) currlayer->view->setpositionmag(oldx, oldy, oldmag); if (syncmodes) currlayer->touchmode = oldmode; // select current layer button (also deselects old button) layerbarptr->SelectButton(currindex, true); if (tilelayers && numlayers > 1) { // switch to new tile viewptr = currlayer->tilewin; if (mainptr->IsActive()) viewptr->SetFocus(); } if (allowundo) { // update Undo/Redo items so they show the correct action currlayer->undoredo->UpdateUndoRedoItems(); } else { // undo/redo is disabled so clear history; // this also removes action from Undo/Redo items currlayer->undoredo->ClearUndoRedo(); } mainptr->SetStepExponent(currlayer->currexpo); // SetStepExponent calls SetGenIncrement mainptr->SetPatternTitle(currlayer->currname); mainptr->UpdateUserInterface(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); bigview->UpdateScrollBars(); } !!!*/ // ----------------------------------------------------------------------------- static CGImageRef* CopyIcons(CGImageRef* srcicons, int maxstate) { CGImageRef* iconptr = (CGImageRef*) malloc(256 * sizeof(CGImageRef)); if (iconptr) { for (int i = 0; i < 256; i++) iconptr[i] = NULL; for (int i = 0; i <= maxstate; i++) { if (srcicons && srcicons[i]) { iconptr[i] = CGImageCreateCopy(srcicons[i]); } } } return iconptr; } // ----------------------------------------------------------------------------- static unsigned char** GetIconPixels(CGImageRef* srcicons, int maxstate) { unsigned char** iconpixelsptr = (unsigned char**) malloc(256 * sizeof(unsigned char*)); if (iconpixelsptr) { for (int i = 0; i < 256; i++) iconpixelsptr[i] = NULL; for (int i = 0; i <= maxstate; i++) { if (srcicons && srcicons[i]) { int wd = CGImageGetWidth(srcicons[i]); int ht = CGImageGetHeight(srcicons[i]); int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * wd; int bitsPerComponent = 8; // allocate enough memory to store icon's RGBA pixel data iconpixelsptr[i] = (unsigned char*) calloc(wd * ht * 4, 1); if (iconpixelsptr[i]) { CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(iconpixelsptr[i], wd, ht, bitsPerComponent, bytesPerRow, colorspace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextDrawImage(ctx, CGRectMake(0, 0, wd, ht), srcicons[i]); CGContextRelease(ctx); CGColorSpaceRelease(colorspace); // iconpixelsptr[i] now points to the icon's pixels in RGBA format } } } } return iconpixelsptr; } // ----------------------------------------------------------------------------- static void UpdateColorReferences(Layer* layerptr, int numstates) { // release any old color refs for (int n = 0; n < 256; n++) { CGColorRelease(layerptr->colorref[n]); layerptr->colorref[n] = NULL; } CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGFloat components[4]; components[3] = 1.0; // alpha // create new color refs for (int n = 0; n < numstates; n++) { components[0] = layerptr->cellr[n] / 255.0; components[1] = layerptr->cellg[n] / 255.0; components[2] = layerptr->cellb[n] / 255.0; layerptr->colorref[n] = CGColorCreate(colorspace, components); } CGColorSpaceRelease(colorspace); } // ----------------------------------------------------------------------------- void AddLayer() { if (numlayers >= MAX_LAYERS) return; if (generating) Warning("Bug detected in AddLayer!"); if (numlayers == 0) { // creating the very first layer currindex = 0; } else { //!!! if (tilelayers && numlayers > 1) DestroyTiles(); SaveLayerSettings(); // insert new layer after currindex currindex++; if (currindex < numlayers) { // shift right one or more layers for (int i = numlayers; i > currindex; i--) layer[i] = layer[i-1]; } } Layer* oldlayer = NULL; if (cloning || duplicating) oldlayer = currlayer; currlayer = new Layer(); if (currlayer == NULL) Fatal("Failed to create new layer!"); layer[currindex] = currlayer; if (cloning || duplicating) { // copy old layer's colors to new layer currlayer->fromrgb = oldlayer->fromrgb; currlayer->torgb = oldlayer->torgb; for (int n = 0; n < currlayer->algo->NumCellStates(); n++) { currlayer->cellr[n] = oldlayer->cellr[n]; currlayer->cellg[n] = oldlayer->cellg[n]; currlayer->cellb[n] = oldlayer->cellb[n]; } UpdateColorReferences(currlayer, currlayer->algo->NumCellStates()); if (cloning) { // use same icon pointers currlayer->icons7x7 = oldlayer->icons7x7; currlayer->icons15x15 = oldlayer->icons15x15; currlayer->icons31x31 = oldlayer->icons31x31; // use same pixel data currlayer->iconpixels7x7 = oldlayer->iconpixels7x7; currlayer->iconpixels15x15 = oldlayer->iconpixels15x15; currlayer->iconpixels31x31 = oldlayer->iconpixels31x31; } else { // duplicate icons from old layer int maxstate = currlayer->algo->NumCellStates() - 1; currlayer->icons7x7 = CopyIcons(oldlayer->icons7x7, maxstate); currlayer->icons15x15 = CopyIcons(oldlayer->icons15x15, maxstate); currlayer->icons31x31 = CopyIcons(oldlayer->icons31x31, maxstate); // get icon pixel data currlayer->iconpixels7x7 = GetIconPixels(oldlayer->icons7x7, maxstate); currlayer->iconpixels15x15 = GetIconPixels(oldlayer->icons15x15, maxstate); currlayer->iconpixels31x31 = GetIconPixels(oldlayer->icons31x31, maxstate); } } else { // set new layer's colors+icons to default colors+icons for current algo+rule UpdateLayerColors(); } numlayers++; if (numlayers > 1) { //!!! if (tilelayers && numlayers > 1) CreateTiles(); //!!! CurrentLayerChanged(); } } // ----------------------------------------------------------------------------- void CloneLayer() { if (numlayers >= MAX_LAYERS) return; if (generating) Warning("Bug detected in CloneLayer!"); cloning = true; AddLayer(); cloning = false; } // ----------------------------------------------------------------------------- void DuplicateLayer() { if (numlayers >= MAX_LAYERS) return; if (generating) Warning("Bug detected in DuplicateLayer!"); duplicating = true; AddLayer(); duplicating = false; } // ----------------------------------------------------------------------------- /*!!! void DeleteLayer() { if (numlayers <= 1) return; if (generating) Warning("Bug detected in DeleteLayer!"); // note that we don't need to ask to delete a clone if (currlayer->dirty && currlayer->cloneid == 0 && askondelete && !SaveCurrentLayer()) return; // numlayers > 1 if (tilelayers) DestroyTiles(); SaveLayerSettings(); delete currlayer; numlayers--; if (currindex < numlayers) { // shift left one or more layers for (int i = currindex; i < numlayers; i++) layer[i] = layer[i+1]; } if (currindex > 0) currindex--; currlayer = layer[currindex]; // remove toggle button at end of layer bar togglebutt[numlayers]->Show(false); layerbarptr->ResizeLayerButtons(); // remove item from end of Layer menu mainptr->RemoveLayerItem(); if (tilelayers && numlayers > 1) CreateTiles(); CurrentLayerChanged(); } // ----------------------------------------------------------------------------- void SetLayer(int index) { if (currindex == index) return; if (index < 0 || index >= numlayers) return; SaveLayerSettings(); currindex = index; currlayer = layer[currindex]; CurrentLayerChanged(); } // ----------------------------------------------------------------------------- bool CanSwitchLayer(int WXUNUSED(index)) { if (inscript) { // user can only switch layers if script has set the appropriate option return canswitch; } else { // user can switch to any layer return true; } } // ----------------------------------------------------------------------------- void SwitchToClickedTile(int index) { if (inscript && !CanSwitchLayer(index)) { Warning("You cannot switch to another layer while this script is running."); return; } // switch current layer to clicked tile SetLayer(index); if (inscript) { // update window title, viewport and status bar inscript = false; mainptr->SetPatternTitle(wxEmptyString); mainptr->UpdatePatternAndStatus(); inscript = true; } } // ----------------------------------------------------------------------------- void MoveLayer(int fromindex, int toindex) { if (fromindex == toindex) return; if (fromindex < 0 || fromindex >= numlayers) return; if (toindex < 0 || toindex >= numlayers) return; SaveLayerSettings(); if (fromindex > toindex) { Layer* savelayer = layer[fromindex]; for (int i = fromindex; i > toindex; i--) layer[i] = layer[i - 1]; layer[toindex] = savelayer; } else { // fromindex < toindex Layer* savelayer = layer[fromindex]; for (int i = fromindex; i < toindex; i++) layer[i] = layer[i + 1]; layer[toindex] = savelayer; } currindex = toindex; currlayer = layer[currindex]; if (tilelayers && numlayers > 1) { DestroyTiles(); CreateTiles(); } CurrentLayerChanged(); } // ----------------------------------------------------------------------------- void MoveLayerDialog() { if (numlayers <= 1) return; wxString msg = _("Move the current layer to a new position:"); if (currindex > 0) { msg += _("\n(enter 0 to make it the first layer)"); } int newindex; if ( GetInteger(_("Move Layer"), msg, currindex, 0, numlayers - 1, &newindex) ) { MoveLayer(currindex, newindex); } } // ----------------------------------------------------------------------------- void NameLayerDialog() { wxString oldname = currlayer->currname; wxString newname; if ( GetString(_("Name Layer"), _("Enter a new name for the current layer:"), oldname, newname) && !newname.IsEmpty() && oldname != newname ) { // inscript is false so no need to call SavePendingChanges // if (allowundo) SavePendingChanges(); // show new name in main window's title bar; // also sets currlayer->currname and updates menu item mainptr->SetPatternTitle(newname); if (allowundo) { // note that currfile and savestart/dirty flags don't change here currlayer->undoredo->RememberNameChange(oldname, currlayer->currfile, currlayer->savestart, currlayer->dirty); } } } !!!*/ // ----------------------------------------------------------------------------- void DeleteOtherLayers() { if (inscript || numlayers <= 1) return; /*!!! if (askondelete) { // keep track of which unique clones have been seen; // we add 1 below to allow for cloneseen[0] (always false) const int maxseen = MAX_LAYERS/2 + 1; bool cloneseen[maxseen]; for (int i = 0; i < maxseen; i++) cloneseen[i] = false; // for each dirty layer, except current layer and all of its clones, // ask user if they want to save changes int cid = layer[currindex]->cloneid; if (cid > 0) cloneseen[cid] = true; int oldindex = currindex; for (int i = 0; i < numlayers; i++) { // only ask once for each unique clone (cloneid == 0 for non-clone) cid = layer[i]->cloneid; if (i != oldindex && !cloneseen[cid]) { if (cid > 0) cloneseen[cid] = true; if (layer[i]->dirty) { // temporarily turn off generating flag for SetLayer bool oldgen = mainptr->generating; mainptr->generating = false; SetLayer(i); if (!mainptr->SaveCurrentLayer()) { // user hit Cancel so restore current layer and generating flag SetLayer(oldindex); mainptr->generating = oldgen; mainptr->UpdateUserInterface(mainptr->IsActive()); return; } SetLayer(oldindex); mainptr->generating = oldgen; } } } } // numlayers > 1 if (tilelayers) DestroyTiles(); SyncClones(); // delete all layers except current layer; // we need to do this carefully because ~Layer() requires numlayers // and the layer array to be correct when deleting a cloned layer int i = numlayers; while (numlayers > 1) { i--; if (i != currindex) { delete layer[i]; // ~Layer() is called numlayers--; // may need to shift the current layer left one place if (i < numlayers) layer[i] = layer[i+1]; // remove toggle button at end of layer bar togglebutt[numlayers]->Show(false); // remove item from end of Layer menu mainptr->RemoveLayerItem(); } } layerbarptr->ResizeLayerButtons(); currindex = 0; // currlayer doesn't change // update the only layer item mainptr->UpdateLayerItem(0); // update window title (may need to remove "=" prefix) mainptr->SetPatternTitle(wxEmptyString); // select LAYER_0 button (also deselects old button) layerbarptr->SelectButton(LAYER_0, true); mainptr->UpdateMenuItems(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); */ } // ----------------------------------------------------------------------------- void MarkLayerDirty() { // need to save starting pattern currlayer->savestart = true; // if script has reset dirty flag then don't change it; this makes sense // for scripts that call new() and then construct a pattern if (currlayer->stayclean) return; if (!currlayer->dirty) { currlayer->dirty = true; // pass in currname so UpdateLayerItem(currindex) gets called SetPatternTitle(currlayer->currname.c_str()); if (currlayer->cloneid > 0) { // synchronize other clones for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { // set dirty flag and display asterisk in layer item cloneptr->dirty = true; //!!! UpdateLayerItem(i); } } } } } // ----------------------------------------------------------------------------- void MarkLayerClean(const char* title) { currlayer->dirty = false; // if script is resetting dirty flag -- eg. via new() -- then don't allow // dirty flag to be set true for the remainder of the script; this is // nicer for scripts that construct a pattern (ie. running such a script // is equivalent to loading a pattern file) if (inscript) currlayer->stayclean = true; if (title[0] == 0) { // pass in currname so UpdateLayerItem(currindex) gets called SetPatternTitle(currlayer->currname.c_str()); } else { // set currlayer->currname to title and call UpdateLayerItem(currindex) SetPatternTitle(title); } if (currlayer->cloneid > 0) { // synchronize other clones for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { // reset dirty flag cloneptr->dirty = false; if (inscript) cloneptr->stayclean = true; // always allow clones to have different names // cloneptr->currname = currlayer->currname; // remove asterisk from layer name //!!! UpdateLayerItem(i); } } } } // ----------------------------------------------------------------------------- /*!!! void ToggleSyncViews() { syncviews = !syncviews; mainptr->UpdateUserInterface(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void ToggleSyncModes() { syncmodes = !syncmodes; mainptr->UpdateUserInterface(mainptr->IsActive()); mainptr->UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void ToggleStackLayers() { stacklayers = !stacklayers; if (stacklayers && tilelayers) { tilelayers = false; layerbarptr->SelectButton(TILE_LAYERS, false); if (numlayers > 1) DestroyTiles(); } layerbarptr->SelectButton(STACK_LAYERS, stacklayers); mainptr->UpdateUserInterface(mainptr->IsActive()); if (inscript) { // always update viewport and status bar inscript = false; mainptr->UpdatePatternAndStatus(); inscript = true; } else { mainptr->UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- void ToggleTileLayers() { tilelayers = !tilelayers; if (tilelayers && stacklayers) { stacklayers = false; layerbarptr->SelectButton(STACK_LAYERS, false); } layerbarptr->SelectButton(TILE_LAYERS, tilelayers); if (tilelayers) { if (numlayers > 1) CreateTiles(); } else { if (numlayers > 1) DestroyTiles(); } mainptr->UpdateUserInterface(mainptr->IsActive()); if (inscript) { // always update viewport and status bar inscript = false; mainptr->UpdatePatternAndStatus(); inscript = true; } else { mainptr->UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- void UpdateCloneColors() { if (currlayer->cloneid > 0) { int maxstate = currlayer->algo->NumCellStates() - 1; for (int i = 0; i < numlayers; i++) { Layer* cloneptr = layer[i]; if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->fromrgb = currlayer->fromrgb; cloneptr->torgb = currlayer->torgb; for (int n = 0; n <= maxstate; n++) { cloneptr->cellr[n] = currlayer->cellr[n]; cloneptr->cellg[n] = currlayer->cellg[n]; cloneptr->cellb[n] = currlayer->cellb[n]; cloneptr->colorref[n] = currlayer->colorref[n]; } // use same icon pointers cloneptr->icons7x7 = currlayer->icons7x7; cloneptr->icons15x15 = currlayer->icons15x15; cloneptr->icons31x31 = currlayer->icons31x31; // use same pixel data cloneptr->iconpixels7x7 = currlayer->iconpixels7x7; cloneptr->iconpixels15x15 = currlayer->iconpixels15x15; cloneptr->iconpixels31x31 = currlayer->iconpixels31x31; } } } } !!!*/ // ----------------------------------------------------------------------------- static FILE* FindRuleFile(const std::string& rulename) { const std::string extn = ".rule"; std::string path; // first look for rulename.rule in userrules path = userrules + rulename; path += extn; FILE* f = fopen(path.c_str(), "r"); if (f) return f; // now look for rulename.rule in rulesdir path = rulesdir + rulename; path += extn; return fopen(path.c_str(), "r"); } // ----------------------------------------------------------------------------- static void CheckRuleHeader(char* linebuf, const std::string& rulename) { // check that 1st line of rulename.rule file contains "@RULE rulename" // where rulename must match the file name exactly (to avoid problems on // case-sensitive file systems) if (strncmp(linebuf, "@RULE ", 6) != 0) { std::string msg = "The first line in "; msg += rulename; msg += ".rule does not start with @RULE."; Warning(msg.c_str()); } else if (strcmp(linebuf+6, rulename.c_str()) != 0) { std::string msg = "The rule name on the first line in "; msg += rulename; msg += ".rule does not match the specified rule: "; msg += rulename; Warning(msg.c_str()); } } // ----------------------------------------------------------------------------- static void ParseColors(linereader& reader, char* linebuf, int MAXLINELEN, int* linenum, bool* eof) { // parse @COLORS section in currently open .rule file int state, r, g, b, r1, g1, b1, r2, g2, b2; int maxstate = currlayer->algo->NumCellStates() - 1; while (reader.fgets(linebuf, MAXLINELEN) != 0) { *linenum = *linenum + 1; if (linebuf[0] == '#' || linebuf[0] == 0) { // skip comment or empty line } else if (sscanf(linebuf, "%d%d%d%d%d%d", &r1, &g1, &b1, &r2, &g2, &b2) == 6) { // assume line is like this: // 255 0 0 0 0 255 use a gradient from red to blue SetColor(currlayer->fromrgb, r1, g1, b1); SetColor(currlayer->torgb, r2, g2, b2); CreateColorGradient(); } else if (sscanf(linebuf, "%d%d%d%d", &state, &r, &g, &b) == 4) { // assume line is like this: // 1 0 128 255 state 1 is light blue if (state >= 0 && state <= maxstate) { currlayer->cellr[state] = r; currlayer->cellg[state] = g; currlayer->cellb[state] = b; } } else if (linebuf[0] == '@') { // found next section, so stop parsing *eof = false; return; } // ignore unexpected syntax (better for upward compatibility) } *eof = true; } // ----------------------------------------------------------------------------- static void DeleteXPMData(char** xpmdata, int numstrings) { if (xpmdata) { for (int i = 0; i < numstrings; i++) if (xpmdata[i]) free(xpmdata[i]); free(xpmdata); } } // ----------------------------------------------------------------------------- static void FreeIconBitmaps(CGImageRef* icons) { if (icons) { for (int i = 0; i < 256; i++) CGImageRelease(icons[i]); free(icons); } } // ----------------------------------------------------------------------------- static void CopyBuiltinIcons(CGImageRef* i7x7, CGImageRef* i15x15, CGImageRef* i31x31) { int maxstate = currlayer->algo->NumCellStates() - 1; if (currlayer->icons7x7) FreeIconBitmaps(currlayer->icons7x7); if (currlayer->icons15x15) FreeIconBitmaps(currlayer->icons15x15); if (currlayer->icons31x31) FreeIconBitmaps(currlayer->icons31x31); currlayer->icons7x7 = CopyIcons(i7x7, maxstate); currlayer->icons15x15 = CopyIcons(i15x15, maxstate); currlayer->icons31x31 = CopyIcons(i31x31, maxstate); } // ----------------------------------------------------------------------------- static void CreateIcons(const char** xpmdata, int size) { int maxstates = currlayer->algo->NumCellStates(); // we only need to call FreeIconBitmaps if .rule file has duplicate XPM data // (unlikely but best to play it safe) if (size == 7) { if (currlayer->icons7x7) FreeIconBitmaps(currlayer->icons7x7); currlayer->icons7x7 = CreateIconBitmaps(xpmdata, maxstates); } else if (size == 15) { if (currlayer->icons15x15) FreeIconBitmaps(currlayer->icons15x15); currlayer->icons15x15 = CreateIconBitmaps(xpmdata, maxstates); } else if (size == 31) { if (currlayer->icons31x31) FreeIconBitmaps(currlayer->icons31x31); currlayer->icons31x31 = CreateIconBitmaps(xpmdata, maxstates); } } // ----------------------------------------------------------------------------- static void ParseIcons(const std::string& rulename, linereader& reader, char* linebuf, int MAXLINELEN, int* linenum, bool* eof) { // parse @ICONS section in currently open .rule file char** xpmdata = NULL; int xpmstarted = 0, xpmstrings = 0, maxstrings = 0; int wd = 0, ht = 0, numcolors = 0, chars_per_pixel = 0; std::map colormap; while (true) { if (reader.fgets(linebuf, MAXLINELEN) == 0) { *eof = true; break; } *linenum = *linenum + 1; if (linebuf[0] == '#' || linebuf[0] == '/' || linebuf[0] == 0) { // skip comment or empty line } else if (linebuf[0] == '"') { if (xpmstarted) { // we have a "..." string containing XPM data if (xpmstrings == 0) { if (sscanf(linebuf, "\"%d%d%d%d\"", &wd, &ht, &numcolors, &chars_per_pixel) == 4 && wd > 0 && ht > 0 && numcolors > 0 && ht % wd == 0 && chars_per_pixel > 0 && chars_per_pixel < 3) { if (wd != 7 && wd != 15 && wd != 31) { // this version of Golly doesn't support the supplied icon size // so silently ignore the rest of this XPM data xpmstarted = 0; continue; } maxstrings = 1 + numcolors + ht; // create and initialize xpmdata xpmdata = (char**) malloc(maxstrings * sizeof(char*)); if (xpmdata) { for (int i = 0; i < maxstrings; i++) xpmdata[i] = NULL; } else { Warning("Failed to allocate memory for XPM icon data!"); *eof = true; return; } } else { char s[128]; sprintf(s, "The XPM header string on line %d in ", *linenum); std::string msg(s); msg += rulename; msg += ".rule is incorrect"; if (wd > 0 && ht > 0 && ht % wd != 0) msg += " (height must be a multiple of width)."; else if (chars_per_pixel < 1 || chars_per_pixel > 2) msg += " (chars_per_pixel must be 1 or 2)."; else msg += " (4 positive integers are required)."; Warning(msg.c_str()); *eof = true; return; } } // copy data inside "..." to next string in xpmdata int len = strlen(linebuf); while (linebuf[len] != '"') len--; len--; if (xpmstrings > 0 && xpmstrings <= numcolors) { // build colormap so we can validate chars in pixel data std::string pixel; char ch1, ch2; if (chars_per_pixel == 1) { sscanf(linebuf+1, "%c ", &ch1); pixel += ch1; } else { sscanf(linebuf+1, "%c%c ", &ch1, &ch2); pixel += ch1; pixel += ch2; } colormap[pixel] = xpmstrings; } else if (xpmstrings > numcolors) { // check length of string containing pixel data if (len != wd * chars_per_pixel) { DeleteXPMData(xpmdata, maxstrings); char s[128]; sprintf(s, "The XPM data string on line %d in ", *linenum); std::string msg(s); msg += rulename; msg += ".rule has the wrong length."; Warning(msg.c_str()); *eof = true; return; } // now check that chars in pixel data are valid (ie. in colormap) for (int i = 1; i <= len; i += chars_per_pixel) { std::string pixel; pixel += linebuf[i]; if (chars_per_pixel > 1) pixel += linebuf[i+1]; if (colormap.find(pixel) == colormap.end()) { DeleteXPMData(xpmdata, maxstrings); char s[128]; sprintf(s, "The XPM data string on line %d in ", *linenum); std::string msg(s); msg += rulename; msg += ".rule has an unknown pixel: "; msg += pixel; Warning(msg.c_str()); *eof = true; return; } } } char* str = (char*) malloc(len+1); if (str) { strncpy(str, linebuf+1, len); str[len] = 0; xpmdata[xpmstrings] = str; } else { DeleteXPMData(xpmdata, maxstrings); Warning("Failed to allocate memory for XPM string!"); *eof = true; return; } xpmstrings++; if (xpmstrings == maxstrings) { // we've got all the data for this icon size CreateIcons((const char**)xpmdata, wd); DeleteXPMData(xpmdata, maxstrings); xpmdata = NULL; xpmstarted = 0; } } } else if (strcmp(linebuf, "XPM") == 0) { // start parsing XPM data on following lines if (xpmstarted) break; // handle error below xpmstarted = *linenum; xpmstrings = 0; } else if (strcmp(linebuf, "circles") == 0) { // use circular icons CopyBuiltinIcons(circles7x7, circles15x15, circles31x31); } else if (strcmp(linebuf, "diamonds") == 0) { // use diamond-shaped icons CopyBuiltinIcons(diamonds7x7, diamonds15x15, diamonds31x31); } else if (strcmp(linebuf, "hexagons") == 0) { // use hexagonal icons CopyBuiltinIcons(hexagons7x7, hexagons15x15, hexagons31x31); } else if (strcmp(linebuf, "triangles") == 0) { // use triangular icons if (currlayer->algo->NumCellStates() != 4) { char s[128]; sprintf(s, "The triangular icons specified on line %d in ", *linenum); std::string msg(s); msg += rulename; msg += ".rule can only be used with a 4-state rule."; Warning(msg.c_str()); // don't return } else { CopyBuiltinIcons(triangles7x7, triangles15x15, triangles31x31); } } else if (linebuf[0] == '@') { // found next section, so stop parsing *eof = false; break; } // ignore unexpected syntax (better for upward compatibility) } if (xpmstarted) { // XPM data was incomplete DeleteXPMData(xpmdata, maxstrings); char s[128]; sprintf(s, "The XPM icon data starting on line %d in ", xpmstarted); std::string msg(s); msg += rulename; msg += ".rule does not have enough strings."; Warning(msg.c_str()); *eof = true; return; } // create scaled bitmaps if size(s) not supplied if (!currlayer->icons7x7) { if (currlayer->icons15x15) { // scale down 15x15 bitmaps currlayer->icons7x7 = ScaleIconBitmaps(currlayer->icons15x15, 7); } else if (currlayer->icons31x31) { // scale down 31x31 bitmaps currlayer->icons7x7 = ScaleIconBitmaps(currlayer->icons31x31, 7); } } if (!currlayer->icons15x15) { if (currlayer->icons31x31) { // scale down 31x31 bitmaps currlayer->icons15x15 = ScaleIconBitmaps(currlayer->icons31x31, 15); } else if (currlayer->icons7x7) { // scale up 7x7 bitmaps currlayer->icons15x15 = ScaleIconBitmaps(currlayer->icons7x7, 15); } } if (!currlayer->icons31x31) { if (currlayer->icons15x15) { // scale up 15x15 bitmaps currlayer->icons31x31 = ScaleIconBitmaps(currlayer->icons15x15, 31); } else if (currlayer->icons7x7) { // scale up 7x7 bitmaps currlayer->icons31x31 = ScaleIconBitmaps(currlayer->icons7x7, 31); } } } // ----------------------------------------------------------------------------- static void LoadRuleInfo(FILE* rulefile, const std::string& rulename, bool* loadedcolors, bool* loadedicons) { // load any color/icon info from currently open .rule file const int MAXLINELEN = 4095; char linebuf[MAXLINELEN + 1]; int linenum = 0; bool eof = false; bool skipget = false; // the linereader class handles all line endings (CR, CR+LF, LF) linereader reader(rulefile); while (true) { if (skipget) { // ParseColors/ParseIcons has stopped at next section // (ie. linebuf contains @...) so skip fgets call skipget = false; } else { if (reader.fgets(linebuf, MAXLINELEN) == 0) break; linenum++; if (linenum == 1) CheckRuleHeader(linebuf, rulename); } // look for @COLORS or @ICONS section if (strcmp(linebuf, "@COLORS") == 0 && !*loadedcolors) { *loadedcolors = true; ParseColors(reader, linebuf, MAXLINELEN, &linenum, &eof); if (eof) break; // otherwise linebuf contains @... so skip next fgets call skipget = true; } else if (strcmp(linebuf, "@ICONS") == 0 && !*loadedicons) { *loadedicons = true; ParseIcons(rulename, reader, linebuf, MAXLINELEN, &linenum, &eof); if (eof) break; // otherwise linebuf contains @... so skip next fgets call skipget = true; } } reader.close(); // closes rulefile } // ----------------------------------------------------------------------------- static void DeleteIcons(Layer* layer) { // delete given layer's existing icons if (layer->icons7x7) { for (int i = 0; i < 256; i++) CGImageRelease(layer->icons7x7[i]); free(layer->icons7x7); layer->icons7x7 = NULL; } if (layer->icons15x15) { for (int i = 0; i < 256; i++) CGImageRelease(layer->icons15x15[i]); free(layer->icons15x15); layer->icons15x15 = NULL; } if (layer->icons31x31) { for (int i = 0; i < 256; i++) CGImageRelease(layer->icons31x31[i]); free(layer->icons31x31); layer->icons31x31 = NULL; } // also delete icon pixel data if (layer->iconpixels7x7) { for (int i = 0; i < 256; i++) if (layer->iconpixels7x7[i]) free(layer->iconpixels7x7[i]); free(layer->iconpixels7x7); layer->iconpixels7x7 = NULL; } if (layer->iconpixels15x15) { for (int i = 0; i < 256; i++) if (layer->iconpixels15x15[i]) free(layer->iconpixels15x15[i]); free(layer->iconpixels15x15); layer->iconpixels15x15 = NULL; } if (layer->iconpixels31x31) { for (int i = 0; i < 256; i++) if (layer->iconpixels31x31[i]) free(layer->iconpixels31x31[i]); free(layer->iconpixels31x31); layer->iconpixels31x31 = NULL; } } // ----------------------------------------------------------------------------- static bool FindIconFile(const std::string& rule, const std::string& dir, std::string& path) { // first look for rule.icons in given directory std::string extn = ".icons"; path = dir + rule; path += extn; if (FileExists(path)) return true; // if rule has the form foo-* then look for foo.icons in dir; // this allows related rules to share a single .icons file size_t hyphenpos = rule.rfind('-'); if (hyphenpos != std::string::npos) { path = dir + rule.substr(0, hyphenpos); path += extn; if (FileExists(path)) return true; } return false; } // ----------------------------------------------------------------------------- static bool LoadRuleIcons(const std::string& rule, int maxstate) { // if rule.icons file exists in userrules or rulesdir then load icons for current layer std::string path; return (FindIconFile(rule, userrules, path) || FindIconFile(rule, rulesdir, path)) && LoadIconFile(path, maxstate, &currlayer->icons7x7, &currlayer->icons15x15, &currlayer->icons31x31); } // ----------------------------------------------------------------------------- static void UseDefaultIcons(int maxstate) { // icons weren't specified so use default icons if (currlayer->algo->getgridtype() == lifealgo::HEX_GRID) { // use hexagonal icons currlayer->icons7x7 = CopyIcons(hexagons7x7, maxstate); currlayer->icons15x15 = CopyIcons(hexagons15x15, maxstate); currlayer->icons31x31 = CopyIcons(hexagons31x31, maxstate); } else if (currlayer->algo->getgridtype() == lifealgo::VN_GRID) { // use diamond-shaped icons for 4-neighbor von Neumann neighborhood currlayer->icons7x7 = CopyIcons(diamonds7x7, maxstate); currlayer->icons15x15 = CopyIcons(diamonds15x15, maxstate); currlayer->icons31x31 = CopyIcons(diamonds31x31, maxstate); } else { // otherwise use default icons from current algo AlgoData* ad = algoinfo[currlayer->algtype]; currlayer->icons7x7 = CopyIcons(ad->icons7x7, maxstate); currlayer->icons15x15 = CopyIcons(ad->icons15x15, maxstate); currlayer->icons31x31 = CopyIcons(ad->icons31x31, maxstate); } } // ----------------------------------------------------------------------------- static void SetAverageColor(int state, int numpixels, unsigned char* pxldata) { // set non-icon color to average color of non-black pixels in given pixel data // which contains the icon bitmap in RGBA pixel format int byte = 0; int nbcount = 0; // # of non-black pixels int totalr = 0; int totalg = 0; int totalb = 0; for (int i = 0; i < numpixels; i++) { unsigned char r = pxldata[byte]; unsigned char g = pxldata[byte+1]; unsigned char b = pxldata[byte+2]; if (r || g || b) { // non-black pixel totalr += r; totalg += g; totalb += b; nbcount++; } byte += 4; } if (nbcount > 0) { currlayer->cellr[state] = int(totalr / nbcount); currlayer->cellg[state] = int(totalg / nbcount); currlayer->cellb[state] = int(totalb / nbcount); } else { // avoid div0 currlayer->cellr[state] = 0; currlayer->cellg[state] = 0; currlayer->cellb[state] = 0; } } // ----------------------------------------------------------------------------- static FILE* FindColorFile(const std::string& rule, const std::string& dir) { const std::string extn = ".colors"; std::string path; // first look for rule.colors in given directory path = dir + rule; path += extn; FILE* f = fopen(path.c_str(), "r"); if (f) return f; // if rule has the form foo-* then look for foo.colors in dir; // this allows related rules to share a single .colors file size_t hyphenpos = rule.rfind('-'); if (hyphenpos != std::string::npos) { path = dir + rule.substr(0, hyphenpos); path += extn; f = fopen(path.c_str(), "r"); if (f) return f; } return NULL; } // ----------------------------------------------------------------------------- static bool LoadRuleColors(const std::string& rule, int maxstate) { // if rule.colors file exists in userrules or rulesdir then // change colors according to info in file FILE* f = FindColorFile(rule, userrules); if (!f) f = FindColorFile(rule, rulesdir); if (f) { // the linereader class handles all line endings (CR, CR+LF, LF) linereader reader(f); // not needed here, but useful if we ever return early due to error // reader.setcloseonfree(); const int MAXLINELEN = 512; char buf[MAXLINELEN + 1]; while (reader.fgets(buf, MAXLINELEN) != 0) { if (buf[0] == '#' || buf[0] == 0) { // skip comment or empty line } else { // look for "color" or "gradient" keyword at start of line char* keyword = buf; char* value; while (*keyword == ' ') keyword++; value = keyword; while (*value >= 'a' && *value <= 'z') value++; while (*value == ' ' || *value == '=') value++; if (strncmp(keyword, "color", 5) == 0) { int state, r, g, b; if (sscanf(value, "%d%d%d%d", &state, &r, &g, &b) == 4) { if (state >= 0 && state <= maxstate) { currlayer->cellr[state] = r; currlayer->cellg[state] = g; currlayer->cellb[state] = b; } }; } else if (strncmp(keyword, "gradient", 8) == 0) { int r1, g1, b1, r2, g2, b2; if (sscanf(value, "%d%d%d%d%d%d", &r1, &g1, &b1, &r2, &g2, &b2) == 6) { SetColor(currlayer->fromrgb, r1, g1, b1); SetColor(currlayer->torgb, r2, g2, b2); CreateColorGradient(); }; } } } reader.close(); return true; } return false; } // ----------------------------------------------------------------------------- void CreateColorGradient() { int maxstate = currlayer->algo->NumCellStates() - 1; unsigned char r1 = currlayer->fromrgb.r; unsigned char g1 = currlayer->fromrgb.g; unsigned char b1 = currlayer->fromrgb.b; unsigned char r2 = currlayer->torgb.r; unsigned char g2 = currlayer->torgb.g; unsigned char b2 = currlayer->torgb.b; // set cell colors for states 1..maxstate using a color gradient // starting with r1,g1,b1 and ending with r2,g2,b2 currlayer->cellr[1] = r1; currlayer->cellg[1] = g1; currlayer->cellb[1] = b1; if (maxstate > 2) { int N = maxstate - 1; double rfrac = (double)(r2 - r1) / (double)N; double gfrac = (double)(g2 - g1) / (double)N; double bfrac = (double)(b2 - b1) / (double)N; for (int n = 1; n < N; n++) { currlayer->cellr[n+1] = (int)(r1 + n * rfrac + 0.5); currlayer->cellg[n+1] = (int)(g1 + n * gfrac + 0.5); currlayer->cellb[n+1] = (int)(b1 + n * bfrac + 0.5); } } if (maxstate > 1) { currlayer->cellr[maxstate] = r2; currlayer->cellg[maxstate] = g2; currlayer->cellb[maxstate] = b2; } } // ----------------------------------------------------------------------------- void UpdateCurrentColors() { // set current layer's colors and icons according to current algo and rule AlgoData* ad = algoinfo[currlayer->algtype]; int maxstate = currlayer->algo->NumCellStates() - 1; // copy default colors from current algo currlayer->fromrgb = ad->fromrgb; currlayer->torgb = ad->torgb; if (ad->gradient) { CreateColorGradient(); // state 0 is not part of the gradient currlayer->cellr[0] = ad->algor[0]; currlayer->cellg[0] = ad->algog[0]; currlayer->cellb[0] = ad->algob[0]; } else { for (int n = 0; n <= maxstate; n++) { currlayer->cellr[n] = ad->algor[n]; currlayer->cellg[n] = ad->algog[n]; currlayer->cellb[n] = ad->algob[n]; } } std::string rulename = currlayer->algo->getrule(); // replace any '\' and '/' chars with underscores; // ie. given 12/34/6 we look for 12_34_6.{colors|icons} std::replace(rulename.begin(), rulename.end(), '\\', '_'); std::replace(rulename.begin(), rulename.end(), '/', '_'); // strip off any suffix like ":T100,200" used to specify a bounded grid size_t colonpos = rulename.find(':'); if (colonpos != std::string::npos) rulename = rulename.substr(0, colonpos); // deallocate current layer's old icons DeleteIcons(currlayer); // this flag will change if any icon uses a non-grayscale color currlayer->multicoloricons = false; bool loadedcolors = false; bool loadedicons = false; // look for rulename.rule first FILE* rulefile = FindRuleFile(rulename); if (rulefile) { LoadRuleInfo(rulefile, rulename, &loadedcolors, &loadedicons); if (!loadedcolors || !loadedicons) { // if rulename has the form foo-* then look for foo-shared.rule // and load its colors and/or icons size_t hyphenpos = rulename.rfind('-'); if (hyphenpos != std::string::npos && rulename.rfind("-shared") == std::string::npos) { rulename = rulename.substr(0, hyphenpos) + "-shared"; rulefile = FindRuleFile(rulename); if (rulefile) LoadRuleInfo(rulefile, rulename, &loadedcolors, &loadedicons); } } if (!loadedicons) UseDefaultIcons(maxstate); // get icon pixel data (used for rendering) currlayer->iconpixels7x7 = GetIconPixels(currlayer->icons7x7, maxstate); currlayer->iconpixels15x15 = GetIconPixels(currlayer->icons15x15, maxstate); currlayer->iconpixels31x31 = GetIconPixels(currlayer->icons31x31, maxstate); // use the smallest icons to check if they are multi-color if (currlayer->icons7x7) { for (int n = 1; n <= maxstate; n++) { if (MultiColorImage(currlayer->icons7x7[n])) { currlayer->multicoloricons = true; break; } } } // if the icons are multi-color then we don't call SetAverageColor as we do below // (better if the .rule file sets the appropriate non-icon colors) } else { // no rulename.rule so look for deprecated rulename.colors and/or rulename.icons loadedcolors = LoadRuleColors(rulename, maxstate); loadedicons = LoadRuleIcons(rulename, maxstate); if (!loadedicons) UseDefaultIcons(maxstate); // get icon pixel data (mainly used for rendering, but also useful below) currlayer->iconpixels7x7 = GetIconPixels(currlayer->icons7x7, maxstate); currlayer->iconpixels15x15 = GetIconPixels(currlayer->icons15x15, maxstate); currlayer->iconpixels31x31 = GetIconPixels(currlayer->icons31x31, maxstate); // if rulename.colors file wasn't loaded and icons are multi-color then we // set non-icon colors to the average of the non-black pixels in each icon // (note that we use the 7x7 icons because they are faster to scan) unsigned char** iconpixels = currlayer->iconpixels7x7; if (!loadedcolors && iconpixels && currlayer->multicoloricons) { for (int n = 1; n <= maxstate; n++) { if (iconpixels[n]) SetAverageColor(n, 7*7, iconpixels[n]); } // if a 15x15 icon is supplied in the 0th position then use // its top left pixel to set the state 0 color iconpixels = currlayer->iconpixels15x15; if (iconpixels && iconpixels[0]) { unsigned char* pxldata = iconpixels[0]; // pxldata contains the icon bitmap in RGBA format currlayer->cellr[0] = pxldata[0]; currlayer->cellg[0] = pxldata[1]; currlayer->cellb[0] = pxldata[2]; } } } if (swapcolors) { // invert cell colors in current layer for (int n = 0; n <= maxstate; n++) { currlayer->cellr[n] = 255 - currlayer->cellr[n]; currlayer->cellg[n] = 255 - currlayer->cellg[n]; currlayer->cellb[n] = 255 - currlayer->cellb[n]; } } UpdateColorReferences(currlayer, currlayer->algo->NumCellStates()); } // ----------------------------------------------------------------------------- void UpdateLayerColors() { UpdateCurrentColors(); // if current layer has clones then update their colors //!!! UpdateCloneColors(); } // ----------------------------------------------------------------------------- void InvertCellColors() { // invert cell colors in all layers for (int i = 0; i < numlayers; i++) { Layer* layerptr = layer[i]; // do NOT use layerptr->algo->... here -- it might not be correct // for a non-current layer (but we can use layerptr->algtype) for (int n = 0; n < algoinfo[layerptr->algtype]->maxstates; n++) { layerptr->cellr[n] = 255 - layerptr->cellr[n]; layerptr->cellg[n] = 255 - layerptr->cellg[n]; layerptr->cellb[n] = 255 - layerptr->cellb[n]; } UpdateColorReferences(layerptr, algoinfo[layerptr->algtype]->maxstates); } } // ----------------------------------------------------------------------------- Layer* GetLayer(int index) { if (index < 0 || index >= numlayers) { Warning("Bad index in GetLayer!"); return NULL; } else { return layer[index]; } } // ----------------------------------------------------------------------------- int GetUniqueCloneID() { // find first available index (> 0) to use as cloneid for (int i = 1; i < MAX_LAYERS; i++) { if (cloneavail[i]) { cloneavail[i] = false; return i; } } // bug if we get here Warning("Bug in GetUniqueCloneID!"); return 1; } // ----------------------------------------------------------------------------- Layer::Layer() { if (!cloning) { // use a unique temporary file for saving starting patterns tempstart = CreateTempFileName("golly_start_"); } dirty = false; // user has not modified pattern savedirty = false; // in case script created layer stayclean = inscript; // if true then keep the dirty flag false // for the duration of the script savestart = false; // no need to save starting pattern startgen = 0; // initial starting generation startfile.clear(); // no starting pattern currname = "untitled"; // initial window title currfile.clear(); // no pattern file has been loaded originx = 0; // no X origin offset originy = 0; // no Y origin offset icons7x7 = NULL; // no 7x7 icons icons15x15 = NULL; // no 15x15 icons icons31x31 = NULL; // no 31x31 icons iconpixels7x7 = NULL; // no pixel data for 7x7 icons iconpixels15x15 = NULL; // no pixel data for 15x15 icons iconpixels31x31 = NULL; // no pixel data for 31x31 icons // init color references for (int n = 0; n < 256; n++) { colorref[n] = NULL; } currframe = 0; // first frame in timeline autoplay = 0; // not playing tlspeed = 0; // default speed for autoplay lastframe = 0; // no frame displayed // create viewport; the initial size is not important because it will soon change view = new viewport(100,100); if (view == NULL) Fatal("Failed to create viewport!"); if (numlayers == 0) { // creating very first layer (can't be a clone) cloneid = 0; // initialize cloneavail array (cloneavail[0] is never used) cloneavail[0] = false; for (int i = 1; i < MAX_LAYERS; i++) cloneavail[i] = true; // set some options using initial values stored in prefs file algtype = initalgo; hyperspeed = inithyperspeed; showhashinfo = initshowhashinfo; autofit = initautofit; // initial base step and exponent currbase = algoinfo[algtype]->defbase; currexpo = 0; // create empty universe algo = CreateNewUniverse(algtype); // set rule using initrule stored in prefs file const char* err = algo->setrule(initrule); if (err) { // user might have edited rule in prefs file, or deleted table/tree file algo->setrule( algo->DefaultRule() ); } // don't need to remember rule here (SaveLayerSettings will do it) rule.clear(); // initialize undo/redo history undoredo = new UndoRedo(); if (undoredo == NULL) Fatal("Failed to create new undo/redo object!"); touchmode = drawmode; drawingstate = 1; } else { // adding a new layer after currlayer (see AddLayer) // inherit current universe type and other settings algtype = currlayer->algtype; hyperspeed = currlayer->hyperspeed; showhashinfo = currlayer->showhashinfo; autofit = currlayer->autofit; // initial base step and exponent currbase = algoinfo[algtype]->defbase; currexpo = 0; if (cloning) { if (currlayer->cloneid == 0) { // first time this universe is being cloned so need a unique cloneid cloneid = GetUniqueCloneID(); currlayer->cloneid = cloneid; // current layer also becomes a clone numclones += 2; } else { // we're cloning an existing clone cloneid = currlayer->cloneid; numclones++; } // clones share the same universe and undo/redo history algo = currlayer->algo; undoredo = currlayer->undoredo; // clones also share the same timeline currframe = currlayer->currframe; autoplay = currlayer->autoplay; tlspeed = currlayer->tlspeed; lastframe = currlayer->lastframe; // clones use same name for starting file tempstart = currlayer->tempstart; } else { // this layer isn't a clone cloneid = 0; // create empty universe algo = CreateNewUniverse(algtype); // use current rule const char* err = algo->setrule(currlayer->algo->getrule()); if (err) { // table/tree file might have been deleted algo->setrule( algo->DefaultRule() ); } // initialize undo/redo history undoredo = new UndoRedo(); if (undoredo == NULL) Fatal("Failed to create new undo/redo object!"); } // inherit current rule rule = currlayer->algo->getrule(); // inherit current viewport's size, scale and location view->resize( currlayer->view->getwidth(), currlayer->view->getheight() ); view->setpositionmag( currlayer->view->x, currlayer->view->y, currlayer->view->getmag() ); // inherit current touch mode and drawing state touchmode = currlayer->touchmode; drawingstate = currlayer->drawingstate; if (cloning || duplicating) { // duplicate all the other current settings currname = currlayer->currname; dirty = currlayer->dirty; savedirty = currlayer->savedirty; stayclean = currlayer->stayclean; currbase = currlayer->currbase; currexpo = currlayer->currexpo; autofit = currlayer->autofit; hyperspeed = currlayer->hyperspeed; showhashinfo = currlayer->showhashinfo; originx = currlayer->originx; originy = currlayer->originy; // duplicate selection info currsel = currlayer->currsel; savesel = currlayer->savesel; // duplicate the stuff needed to reset pattern savestart = currlayer->savestart; startalgo = currlayer->startalgo; startdirty = currlayer->startdirty; startname = currlayer->startname; startrule = currlayer->startrule; startx = currlayer->startx; starty = currlayer->starty; startbase = currlayer->startbase; startexpo = currlayer->startexpo; startmag = currlayer->startmag; startgen = currlayer->startgen; startfile = currlayer->startfile; currfile = currlayer->currfile; startsel = currlayer->startsel; } if (duplicating) { // first set same gen count algo->setGeneration( currlayer->algo->getGeneration() ); // duplicate pattern if ( !currlayer->algo->isEmpty() ) { bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { Warning("Pattern is too big to duplicate."); } else { CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, algo, false, "Duplicating layer"); } } // tempstart file must remain unique in duplicate layer if ( FileExists(currlayer->tempstart) ) { if ( !CopyFile(currlayer->tempstart, tempstart) ) { Warning("Could not copy tempstart file!"); } } if (currlayer->startfile == currlayer->tempstart) { startfile = tempstart; } if (currlayer->currfile == currlayer->tempstart) { // starting pattern came from clipboard or lexicon pattern currfile = tempstart; } if (allowundo) { // duplicate current undo/redo history in new layer undoredo->DuplicateHistory(currlayer, this); } } } } // ----------------------------------------------------------------------------- Layer::~Layer() { // delete stuff allocated in ctor delete view; if (cloneid > 0) { // this layer is a clone, so count how many layers have the same cloneid int clonecount = 0; for (int i = 0; i < numlayers; i++) { if (layer[i]->cloneid == cloneid) clonecount++; // tell undo/redo which clone is being deleted if (this == layer[i]) undoredo->DeletingClone(i); } if (clonecount > 2) { // only delete this clone numclones--; } else { // first make this cloneid available for the next clone cloneavail[cloneid] = true; // reset the other cloneid to 0 (should only be one such clone) for (int i = 0; i < numlayers; i++) { // careful -- layer[i] might be this layer if (this != layer[i] && layer[i]->cloneid == cloneid) layer[i]->cloneid = 0; } numclones -= 2; } } else { // this layer is not a clone, so delete universe and undo/redo history delete algo; delete undoredo; // delete tempstart file if it exists if (FileExists(tempstart)) RemoveFile(tempstart); // release color references for (int i = 0; i < 256; i++) CGColorRelease(colorref[i]); // delete any icons DeleteIcons(this); } } golly-2.5-src/gui-ios/Golly/main.m0000644000175100001440000000217512156145314013764 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import #import "GollyAppDelegate.h" int main(int argc, char *argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([GollyAppDelegate class])); } } golly-2.5-src/gui-ios/Golly/open@2x.png0000644000175100001440000000177312156145314014706 00000000000000‰PNG  IHDR<<:üÙrÂIDAThíšAOÛH†ß7M»•ˆƒ¶ÝUw#!`#zXäÊ17N@Ä/kNÜÐþÔpN¥ s€Kv¥¶"C¬¸Z(®ñÌ"¯ÚÝ”õd’š?’ocÏ<šùÞÇ!B<$hÜøÞ¤ÂI'N:©pÒI…“΃~¤rs¿ß×c%×uõ(ís¹\¿X,vt]ï«ô«‚’0c¬´¿¿¿ÓjµV¢´/—ËÇ[[[¯u]?VéW%a×uõV«µrppP‰zÏæææï*}ª’Öð]ü»fÛíöŠã8‘êÇÑÛív¤å…Q2ȼŸŸŸ¯|Y³Žãè¶m—.//#I …¾išÙÙÙ±„V˜ Ñ3Aùj6›•jµú€¸WµZ}Ól6+2i ¸—jTÊåòq.—“ês,¦ivvww_[–õ]÷×0´dîQxù|þýòòòÛùùù¶ÌÉK×uu×uÿ“úw¥·ª° G)í !>Ëž¼&Å]'ºq3ÇqÜ“““§„Ÿ_ý¦ø\e¾u¢‡p×¶í«z½þÀsÛ¶P|æD‹0cìc£Ñ0ü à©ú°&‡ê>|  À0à‰ê &ɨ3ð Ãè---ý¡iZ϶헌±9Ù1Žo¤q !® !·ÃŒ:ÀžeYîíímoo0Mó3§ðW»Æ°*ÂŒrÉ9÷(¥Y!D@ñ 3Î9ãœ{ÃŒº¤¿Jç  §§§¿0¿p—Â4M¿ðéü+²qoI€.çüÂ÷ý›a F]Ò÷5ot5Mëf2õ&„Ü !®ïk:‡ãZ[[{gƧa ¥„…Ÿ)¥=˲>Öjµ3ιW¯××FÜÂÿìµZílcc£S*•®†5”æœ{œsFy|Ó9ŸÏ¿_\\¼(•Jß|G–Ö4Í#„0Û¶õiKç)aß÷o8çŒ1:mé"%œÉd0 à9¦(C¤NZ¾ïgƒ ˜ðƒ—ý©IçÙÐzB)ýÀ yLQ:‡HÍpY!Dñ×nHät‘Mé,¥´ˆøkP(>Y–õ.J:‡È¾<<月¿v¦i^ïììt*•Êÿ¦sˆ”ðÌÌÌ_«««g„¸kÀà÷õõõN”t‘ú>,û'–I3ñâIàÁ}N…“N*œtRᤓ ''ü7çN PÅ:²IEND®B`‚golly-2.5-src/gui-ios/Golly/open.png0000644000175100001440000000036012156145314014323 00000000000000‰PNG  IHDR;0®¢·IDATH‰í–Q ƒ0ç•©_Åkô”½†ø£wÚþXHKâÓ&i]ø@vQ“D‹\šPOð!ÀWï3‹{I–nÖØRïqªéÖ¤Ììw!?OPF}X`êÁ̹Ðï¬÷@WŒ¤èŒóõ8Ï9k Ÿï5~k¾è8„ƒ.©¹ÿ˜TWÓì©®¦–U×Óì€î “¤çpG%͸D[ˆh††ŸÅ$¸vŽ÷³w‚ÿ–7Ö•/”…IEND®B`‚golly-2.5-src/gui-ios/Golly/OpenViewController.h0000644000175100001440000000270712156145314016634 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import // This is the view controller for the Open tab. @interface OpenViewController : UIViewController { IBOutlet UITableView *optionTable; IBOutlet UIWebView *htmlView; } @end // if any files exist in the Documents folder (created by iTunes file sharing) // then move them into Documents/Rules/ if their names end with // .rule/tree/table/colors/icons, otherwise assume they are patterns // and move them into Documents/Saved/ void MoveSharedFiles(); golly-2.5-src/gui-ios/Golly/OpenViewController.m0000644000175100001440000004442212156145314016641 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include // for std::string #include // for std::list #include // for std::set #include // for std::count #include "prefs.h" // for gollydir, recentpatterns, SavePrefs, etc #include "utils.h" // for Warning, RemoveFile, FixURLPath, MoveFile, etc #include "file.h" // for OpenFile #import "InfoViewController.h" // for ShowTextFile #import "OpenViewController.h" @implementation OpenViewController // ----------------------------------------------------------------------------- static NSString *options[] = // data for optionTable { @"Supplied", @"Recent", @"Saved", @"Downloaded" }; const int NUM_OPTIONS = sizeof(options) / sizeof(options[0]); static int curroption; // current index in optionTable static CGPoint curroffset[NUM_OPTIONS]; // current offset in scroll view for each option const char* HTML_HEADER = ""; const char* HTML_FOOTER = ""; const char* HTML_INDENT = "      "; static std::set opendirs; // set of open directories in Supplied patterns // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Open"; self.tabBarItem.image = [UIImage imageNamed:@"open.png"]; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- static void AppendHtmlData(std::string& htmldata, const std::string& dir, const std::string& prefix, const std::string& title, bool candelete) { NSFileManager *fm = [NSFileManager defaultManager]; NSString *pattdir = [NSString stringWithCString:dir.c_str() encoding:NSUTF8StringEncoding]; NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:pattdir]; NSString *path; int closedlevel = 0; htmldata = HTML_HEADER; htmldata += title; htmldata += "

"; while (path = [dirEnum nextObject]) { // path is relative; eg. "Life/Bounded-Grids/agar-p3.rle" std::string pstr = [path cStringUsingEncoding:NSUTF8StringEncoding]; // indent level is number of separators in path int indents = std::count(pstr.begin(), pstr.end(), '/'); if (indents <= closedlevel) { NSString *fullpath = [pattdir stringByAppendingPathComponent:path]; BOOL isDir; if ([fm fileExistsAtPath:fullpath isDirectory:&isDir] && isDir) { // path is to a directory std::string imgname; if (opendirs.find(pstr) == opendirs.end()) { closedlevel = indents; imgname = "triangle-right.png"; } else { closedlevel = indents+1; imgname = "triangle-down.png"; } for (int i = 0; i < indents; i++) htmldata += HTML_INDENT; htmldata += ""; size_t lastsep = pstr.rfind('/'); if (lastsep == std::string::npos) { htmldata += pstr; } else { htmldata += pstr.substr(lastsep+1); } htmldata += "
"; } else { // path is to a file for (int i = 0; i < indents; i++) htmldata += HTML_INDENT; if (candelete) { // allow user to delete file htmldata += "DELETE   "; // allow user to edit file htmldata += "EDIT   "; } else { // allow user to read file (a supplied pattern) htmldata += "READ   "; } htmldata += ""; size_t lastsep = pstr.rfind('/'); if (lastsep == std::string::npos) { htmldata += pstr; } else { htmldata += pstr.substr(lastsep+1); } htmldata += "
"; } } } htmldata += HTML_FOOTER; } // ----------------------------------------------------------------------------- - (void)showSuppliedPatterns { std::string htmldata; AppendHtmlData(htmldata, patternsdir, "Patterns/", "Supplied patterns:", false); [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] // the following base URL is needed for img links to work baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; } // ----------------------------------------------------------------------------- - (void)showSavedPatterns { std::string htmldata; AppendHtmlData(htmldata, datadir, "Documents/Saved/", "Saved patterns:", true); [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] baseURL:nil]; } // ----------------------------------------------------------------------------- - (void)showDownloadedPatterns { std::string htmldata; AppendHtmlData(htmldata, downloaddir, "Documents/Downloads/", "Downloaded patterns:", true); [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] baseURL:nil]; } // ----------------------------------------------------------------------------- - (void)showRecentPatterns { std::string htmldata = HTML_HEADER; if (recentpatterns.empty()) { htmldata += "There are no recent patterns."; } else { htmldata += "Recently opened patterns:

"; std::list::iterator next = recentpatterns.begin(); while (next != recentpatterns.end()) { std::string path = *next; if (path.find("Patterns/") == 0 || FileExists(gollydir + path)) { htmldata += ""; // nicer not to show Patterns/ or Documents/ size_t firstsep = path.find('/'); if (firstsep != std::string::npos) { path.erase(0, firstsep+1); } htmldata += path; htmldata += "
"; } next++; } } htmldata += HTML_FOOTER; [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] baseURL:nil]; } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; htmlView.delegate = self; // init all offsets to top left for (int i=0; i 0) { // recent/saved/downloaded patterns might have changed switch (curroption) { case 1: [self showRecentPatterns]; break; case 2: [self showSavedPatterns]; break; case 3: [self showDownloadedPatterns]; break; default: Warning("Bug detected in viewWillAppear!"); } } } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // no need for this as we're only displaying html data in strings // [htmlView stopLoading]; if (curroption > 0) { // save current location of recent/saved/downloaded view curroffset[curroption] = htmlView.scrollView.contentOffset; } } // ----------------------------------------------------------------------------- // UITableViewDelegate and UITableViewDataSource methods: - (NSInteger)numberOfSectionsInTableView:(UITableView *)TableView { return 1; } // ----------------------------------------------------------------------------- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)component { return NUM_OPTIONS; } // ----------------------------------------------------------------------------- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // check for a reusable cell first and use that if it exists UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; // if there is no reusable cell of this type, create a new one if (!cell) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; [[cell textLabel] setText:options[[indexPath row]]]; return cell; } // ----------------------------------------------------------------------------- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // save current location curroffset[curroption] = htmlView.scrollView.contentOffset; // display selected set of files curroption = [indexPath row]; switch (curroption) { case 0: [self showSuppliedPatterns]; break; case 1: [self showRecentPatterns]; break; case 2: [self showSavedPatterns]; break; case 3: [self showDownloadedPatterns]; break; default: Warning("Bug: unexpected row!"); } } // ----------------------------------------------------------------------------- // UIWebViewDelegate methods: - (void)webViewDidStartLoad:(UIWebView *)webView { // show the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } // ----------------------------------------------------------------------------- - (void)webViewDidFinishLoad:(UIWebView *)webView { // hide the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // restore old offset here htmlView.scrollView.contentOffset = curroffset[curroption]; } // ----------------------------------------------------------------------------- - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { // hide the activity indicator in the status bar and display error message [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // we can safely ignore -999 errors if (error.code == NSURLErrorCancelled) return; Warning([error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]); } // ----------------------------------------------------------------------------- - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (navigationType == UIWebViewNavigationTypeLinkClicked) { NSURL *url = [request URL]; NSString *link = [url absoluteString]; // link should have special prefix if ([link hasPrefix:@"open:"]) { // open specified file std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); OpenFile(path.c_str()); SavePrefs(); return NO; } if ([link hasPrefix:@"toggledir:"]) { // open/close directory std::string path = [[link substringFromIndex:10] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); if (opendirs.find(path) == opendirs.end()) { // add directory path to opendirs opendirs.insert(path); } else { // remove directory path from opendirs opendirs.erase(path); } if (curroption == 0) { // save current location and update supplied patterns curroffset[0] = htmlView.scrollView.contentOffset; [self showSuppliedPatterns]; } else { Warning("Bug: expected supplied patterns!"); } return NO; } if ([link hasPrefix:@"delete:"]) { std::string path = [[link substringFromIndex:7] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); std::string question = "Do you really want to delete " + path + "?"; if (YesNo(question.c_str())) { // delete specified file path = gollydir + path; RemoveFile(path); // save current location curroffset[curroption] = htmlView.scrollView.contentOffset; switch (curroption) { // can't delete supplied or recent patterns case 2: [self showSavedPatterns]; break; case 3: [self showDownloadedPatterns]; break; default: Warning("Bug: can't delete these files!"); } } return NO; } if ([link hasPrefix:@"edit:"]) { std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); // convert path to a full path if necessary std::string fullpath = path; if (path[0] != '/') { if (fullpath.find("Patterns/") == 0 || fullpath.find("Rules/") == 0) { // Patterns and Rules directories are inside app bundle so prepend gollydir/Golly.app/ fullpath = gollydir + "Golly.app/" + fullpath; } else { fullpath = gollydir + fullpath; } } ShowTextFile(fullpath.c_str()); return NO; } } return YES; } @end // ============================================================================= void MoveSharedFiles() { // check for files in the Documents folder (created by iTunes file sharing) // and move any .rule/tree/table/colors/icons files into Documents/Rules/, // otherwise assume they are pattern files and move them into Documents/Saved/ std::string docdir = gollydir + "Documents/"; NSFileManager *fm = [NSFileManager defaultManager]; NSString *dirpath = [NSString stringWithCString:docdir.c_str() encoding:NSUTF8StringEncoding]; NSArray* contents = [fm contentsOfDirectoryAtPath:dirpath error:nil]; for (NSString* item in contents) { NSString *fullpath = [dirpath stringByAppendingPathComponent:item]; BOOL isDir; if ([fm fileExistsAtPath:fullpath isDirectory:&isDir] && isDir) { // ignore path to subdirectory } else { // path is to a file std::string filename = [item cStringUsingEncoding:NSUTF8StringEncoding]; if (filename[0] == '.') { // ignore hidden file } else if (IsRuleFile(filename)) { // move .rule/tree/table/colors/icons file into Documents/Rules/ std::string oldpath = docdir + filename; std::string newpath = userrules + filename; MoveFile(oldpath, newpath); } else { // assume this is a pattern file amd move it into Documents/Saved/ std::string oldpath = docdir + filename; std::string newpath = datadir + filename; MoveFile(oldpath, newpath); } } } } golly-2.5-src/gui-ios/Golly/OpenViewController.xib0000644000175100001440000003014512156145314017164 00000000000000 1280 10K549 1938 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUIWebView IBUITableView IBUIView IBUILabel IBProxyObject com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 292 318 {{224, 0}, {544, 1004}} 1 MSAxIDEAA IBIPadFramework 1 YES 300 292 {{10, 20}, {194, 21}} NO YES 7 NO IBIPadFramework Which patterns? 1 MCAwIDAAA 1 10 1 1 17 Helvetica 17 16 316 {{10, 49}, {194, 176}} 3 MQA YES IBIPadFramework YES NO 1 0 YES 44 22 22 {{5, 379}, {214, 245}} 3 MC42NjY2NjY2NjY3AA IBIPadFramework {{0, 20}, {768, 1004}} NO 2 IBIPadFramework view 3 htmlView 9 optionTable 8 dataSource 10 delegate 11 0 -1 File's Owner -2 2 5 13 4 12 OpenViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 13 OpenViewController UIViewController UIWebView UITableView htmlView UIWebView optionTable UITableView IBProjectSource ./Classes/OpenViewController.h 0 IBIPadFramework YES 3 933 golly-2.5-src/gui-ios/Golly/pattern@2x.png0000644000175100001440000000031412156145314015410 00000000000000‰PNG  IHDR<<:üÙr“IDAThíØ1€0 ÅÐqÿ+‡‰™2$¿¹µÚ!¥º{%9þÞÀ× ¦3˜Î`:ƒé ¦‹ >§?PUÛ¯“î®É½¬xÂÓLg0ÁtqÁ•ö_z|–~kzöŽ»ÒÓLg0ÁtqÁÎÒOÞκÓëw×Þâ®´ÁtÓLg0]\pÜ,wÂÓLg0ÁtÓ]» o!üñIEND®B`‚golly-2.5-src/gui-ios/Golly/pattern.png0000644000175100001440000000022012156145314015032 00000000000000‰PNG  IHDR;0®¢WIDATH‰í”1 øÿ/ÇH‡ !ÍXhÚSŽL µÁ ¾™¥68ÞI¨sòV†ë¯–­®¢Úžwã<ðVW–ªõj~ÞóÀ6«óVÝàgÙ‹[ 3ü¨"MIEND®B`‚golly-2.5-src/gui-ios/Golly/PatternViewController.h0000644000175100001440000000624412156145314017350 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import #import "PatternView.h" #import "StatusView.h" #import "StateView.h" // This is the view controller for the Pattern tab. @interface PatternViewController : UIViewController { IBOutlet PatternView *pattView; IBOutlet StatusView *statView; IBOutlet UIButton *startStopButton; IBOutlet UIButton *restoreButton; IBOutlet UIBarButtonItem *resetButton; IBOutlet UIBarButtonItem *undoButton; IBOutlet UIBarButtonItem *redoButton; IBOutlet UIBarButtonItem *actionButton; IBOutlet UIBarButtonItem *infoButton; IBOutlet UISegmentedControl *stepControl; IBOutlet UISegmentedControl *scaleControl; IBOutlet UISegmentedControl *modeControl; IBOutlet UILabel *stateLabel; IBOutlet StateView *stateView; IBOutlet UIToolbar *topBar; IBOutlet UIToolbar *editBar; IBOutlet UIToolbar *bottomBar; IBOutlet UIView *progressView; IBOutlet UILabel *progressTitle; IBOutlet UILabel *progressMessage; IBOutlet UIProgressView *progressBar; IBOutlet UIButton *cancelButton; NSTimer *genTimer; } - (IBAction)doReset:(id)sender; - (IBAction)doStartStop:(id)sender; - (IBAction)doNext:(id)sender; - (IBAction)doStep:(id)sender; - (IBAction)doFit:(id)sender; - (IBAction)doChangeStep:(id)sender; - (IBAction)doChangeScale:(id)sender; - (IBAction)doChangeMode:(id)sender; - (IBAction)doUndo:(id)sender; - (IBAction)doRedo:(id)sender; - (IBAction)doMiddle:(id)sender; - (IBAction)doSelectAll:(id)sender; - (IBAction)doAction:(id)sender; - (IBAction)doPaste:(id)sender; - (IBAction)doRule:(id)sender; - (IBAction)doNew:(id)sender; - (IBAction)doInfo:(id)sender; - (IBAction)doSave:(id)sender; - (IBAction)doCancel:(id)sender; - (IBAction)toggleFullScreen:(id)sender; - (void)updateDrawingState; - (void)updateButtons; - (void)toggleStartStopButton; - (void)stopIfGenerating; - (void)startGenTimer; - (void)stopGenTimer; - (void)doGeneration:(NSTimer*)theTimer; @end // other modules need these routines: void UpdatePattern(); void UpdateStatus(); void UpdateEditBar(); void CloseStatePicker(); void PauseGenTimer(); void RestartGenTimer(); void PauseGenerating(); void ResumeGenerating(); void BeginProgress(const char* title); bool AbortProgress(double fraction_done, const char* message); void EndProgress(); golly-2.5-src/gui-ios/Golly/PatternViewController.m0000644000175100001440000006601712156145314017361 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "viewport.h" // for MAX_MAG #include "utils.h" // for Warning, event_checker #include "status.h" // for DisplayMessage #include "algos.h" // for InitAlgorithms, algoinfo #include "prefs.h" // for GetPrefs, SavePrefs #include "layer.h" // for AddLayer, currlayer #include "file.h" // for NewPattern #include "control.h" // for generating, StartGenerating, etc #include "view.h" // for nopattupdate, SmallScroll #include "undo.h" // for currlayer->undoredo->... #import "GollyAppDelegate.h" // for EnableTabBar #import "InfoViewController.h" #import "SaveViewController.h" #import "RuleViewController.h" #import "PatternViewController.h" @implementation PatternViewController // ----------------------------------------------------------------------------- // global stuff needed in UpdatePattern, UpdateStatus, etc static PatternViewController *globalController = nil; static PatternView *globalPatternView = nil; static StatusView *globalStatusView = nil; static StateView *globalStateView = nil; static UIView *globalProgress = nil; static UILabel *globalTitle = nil; static bool cancelProgress = false; // cancel progress dialog? static double progstart, prognext; // for progress timing static int progresscount = 0; // if > 0 then BeginProgress has been called static int pausecount = 0; // if > 0 then genTimer needs to be restarted // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Pattern"; self.tabBarItem.image = [UIImage imageNamed:@"pattern.png"]; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // free up as much memory as possible if (numlayers > 0) DeleteOtherLayers(); if (waitingforpaste) AbortPaste(); [self doNew:self]; // Warning hangs if called here, so use DisplayMessage for now!!! // (may need non-modal version via extra flag???) // Warning("Memory warning occurred, so empty universe created."); DisplayMessage("Memory warning occurred, so empty universe created."); } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; // now do additional setup after loading the view from the xib file // init global pointers globalController = self; globalPatternView = pattView; globalStatusView = statView; globalStateView = stateView; globalProgress = progressView; globalTitle = progressTitle; static bool firstload = true; if (firstload) { firstload = false; // only do the following once MAX_MAG = 5; // maximum cell size = 32x32 InitAlgorithms(); // must initialize algoinfo first GetPrefs(); // load user's preferences SetMinimumStepExponent(); // for slowest speed AddLayer(); // create initial layer (sets currlayer) NewPattern(); // create new, empty universe } // ensure pattView is composited underneath toolbar, otherwise // bottom toolbar can be obscured when device is rotated left/right // (no longer needed) // [[pattView layer] setZPosition:-1]; // we draw background areas of pattView and statView so set to transparent (presumably a tad faster) [pattView setBackgroundColor:nil]; [statView setBackgroundColor:nil]; progressView.hidden = YES; genTimer = nil; // init buttons [self toggleStartStopButton]; resetButton.enabled = NO; undoButton.enabled = NO; redoButton.enabled = NO; actionButton.enabled = NO; infoButton.enabled = NO; restoreButton.hidden = YES; // deselect step/scale controls (these have Momentary attribute set) [stepControl setSelectedSegmentIndex:-1]; [scaleControl setSelectedSegmentIndex:-1]; // init touch mode [modeControl setSelectedSegmentIndex:currlayer->touchmode]; [self updateDrawingState]; } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; SavePrefs(); // release all outlets pattView = nil; statView = nil; startStopButton = nil; restoreButton = nil; resetButton = nil; undoButton = nil; redoButton = nil; actionButton = nil; infoButton = nil; stepControl = nil; scaleControl = nil; modeControl = nil; stateLabel = nil; stateView = nil; topBar = nil; editBar = nil; bottomBar = nil; progressView = nil; progressTitle = nil; progressMessage = nil; progressBar = nil; cancelButton = nil; } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; SetMessage(""); // stop generating, but only if PauseGenTimer() hasn't been called if (pausecount == 0) [self stopIfGenerating]; } // ----------------------------------------------------------------------------- - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // not sure why, but we need to update pattView here rather than in viewWillAppear // if viewWillDisappear called stopIfGenerating and event_chacker was > 0 // (presumably something to do with the switch to OpenGL ES; ie. we now call // [pattView refreshPattern] rather than [pattView setNeedsDisplay]) UpdateEverything(); // calls [pattView refreshPattern] // restart genTimer if PauseGenTimer() was called earlier if (pausecount > 0) RestartGenTimer(); } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)updateDrawingState; { // reset drawing state if it's no longer valid (due to algo/rule change) if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) { currlayer->drawingstate = 1; } [stateLabel setText:[NSString stringWithFormat:@"State=%d", currlayer->drawingstate]]; [stateView setNeedsDisplay]; } // ----------------------------------------------------------------------------- - (void)updateButtons { resetButton.enabled = currlayer->algo->getGeneration() > currlayer->startgen; undoButton.enabled = currlayer->undoredo->CanUndo(); redoButton.enabled = currlayer->undoredo->CanRedo(); actionButton.enabled = SelectionExists(); infoButton.enabled = currlayer->currname != "untitled"; [modeControl setSelectedSegmentIndex:currlayer->touchmode]; } // ----------------------------------------------------------------------------- - (void)toggleStartStopButton { if (generating) { [startStopButton setTitle:@"STOP" forState:UIControlStateNormal]; [startStopButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; } else { [startStopButton setTitle:@"START" forState:UIControlStateNormal]; [startStopButton setTitleColor:[UIColor colorWithRed:0.2 green:0.7 blue:0.0 alpha:1.0] forState:UIControlStateNormal]; } } // ----------------------------------------------------------------------------- - (void)stopIfGenerating { if (generating) { [self stopGenTimer]; StopGenerating(); // generating now false [self toggleStartStopButton]; } } // ----------------------------------------------------------------------------- - (IBAction)doNew:(id)sender { // undo/redo history is about to be cleared so no point calling RememberGenFinish // if we're generating a (possibly large) pattern bool saveundo = allowundo; allowundo = false; [self stopIfGenerating]; allowundo = saveundo; if (event_checker > 0) { // try again after a short delay that gives time for NextGeneration() to terminate [self performSelector:@selector(doNew:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); NewPattern(); [modeControl setSelectedSegmentIndex:currlayer->touchmode]; [self updateDrawingState]; [self updateButtons]; [statView setNeedsDisplay]; [pattView refreshPattern]; } // ----------------------------------------------------------------------------- - (IBAction)doInfo:(id)sender { // if generating then just pause the timer so doGeneration won't be called; // best not to call PauseGenerating() because it calls StopGenerating() // which might result in a lengthy file save for undo/redo PauseGenTimer(); ClearMessage(); // display contents of current pattern file in a modal view InfoViewController *modalInfoController = [[InfoViewController alloc] initWithNibName:nil bundle:nil]; [modalInfoController setModalPresentationStyle:UIModalPresentationFullScreen]; [self presentModalViewController:modalInfoController animated:YES]; modalInfoController = nil; // RestartGenTimer() will be called in viewDidAppear } // ----------------------------------------------------------------------------- - (IBAction)doSave:(id)sender { [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doSave:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); // let user save current pattern in a file via a modal view SaveViewController *modalSaveController = [[SaveViewController alloc] initWithNibName:nil bundle:nil]; [modalSaveController setModalPresentationStyle:UIModalPresentationFormSheet]; [self presentModalViewController:modalSaveController animated:YES]; modalSaveController = nil; } // ----------------------------------------------------------------------------- - (IBAction)doUndo:(id)sender { [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doUndo:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); currlayer->undoredo->UndoChange(); UpdateEverything(); } // ----------------------------------------------------------------------------- - (IBAction)doRedo:(id)sender { [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doRedo:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); currlayer->undoredo->RedoChange(); UpdateEverything(); } // ----------------------------------------------------------------------------- - (IBAction)doReset:(id)sender { [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doReset:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); ResetPattern(); UpdateEverything(); } // ----------------------------------------------------------------------------- - (IBAction)doStartStop:(id)sender { ClearMessage(); if (generating) { [self stopGenTimer]; StopGenerating(); // generating is now false [self toggleStartStopButton]; // can't call [self updateButtons] here because if event_checker is > 0 // then StopGenerating hasn't called RememberGenFinish, and so CanUndo/CanRedo // might not return correct results bool canreset = currlayer->algo->getGeneration() > currlayer->startgen; resetButton.enabled = canreset; undoButton.enabled = allowundo && (canreset || currlayer->undoredo->CanUndo()); redoButton.enabled = NO; } else if (StartGenerating()) { // generating is now true [self toggleStartStopButton]; [self startGenTimer]; // don't call [self updateButtons] here because we want user to // be able to stop generating by tapping Reset/Undo buttons resetButton.enabled = YES; undoButton.enabled = allowundo; redoButton.enabled = NO; } pausecount = 0; // play safe } // ----------------------------------------------------------------------------- - (void)startGenTimer { float interval = 1.0f/60.0f; // increase interval if user wants a delay if (currlayer->currexpo < 0) { interval = GetCurrentDelay() / 1000.0f; } // create a repeating timer genTimer = [NSTimer scheduledTimerWithTimeInterval:interval target:self selector:@selector(doGeneration:) userInfo:nil repeats:YES]; } // ----------------------------------------------------------------------------- - (void)stopGenTimer { [genTimer invalidate]; genTimer = nil; } // ----------------------------------------------------------------------------- // called after genTimer fires - (void)doGeneration:(NSTimer*)timer { if (event_checker > 0 || progresscount > 0) return; // advance by current step size NextGeneration(true); [statView setNeedsDisplay]; [pattView refreshPattern]; } // ----------------------------------------------------------------------------- - (IBAction)doNext:(id)sender { [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doNext:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); NextGeneration(false); [statView setNeedsDisplay]; [pattView refreshPattern]; [self updateButtons]; } // ----------------------------------------------------------------------------- - (IBAction)doStep:(id)sender { [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doStep:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); NextGeneration(true); [statView setNeedsDisplay]; [pattView refreshPattern]; [self updateButtons]; } // ----------------------------------------------------------------------------- - (IBAction)doFit:(id)sender { ClearMessage(); currlayer->algo->fit(*currlayer->view, 1); [statView setNeedsDisplay]; [pattView refreshPattern]; } // ----------------------------------------------------------------------------- - (IBAction)doChangeStep:(id)sender { ClearMessage(); switch([sender selectedSegmentIndex]) { case 0: { // go slower by decrementing step exponent if (currlayer->currexpo > minexpo) { currlayer->currexpo--; SetGenIncrement(); if (generating && currlayer->currexpo < 0) { // increase timer interval [self stopGenTimer]; [self startGenTimer]; } } else { Beep(); } } break; case 1: { // reset step exponent to 0 currlayer->currexpo = 0; SetGenIncrement(); if (generating) { // reset timer interval to max speed [self stopGenTimer]; [self startGenTimer]; } } break; case 2: { // go faster by incrementing step exponent currlayer->currexpo++; SetGenIncrement(); if (generating && currlayer->currexpo <= 0) { // reduce timer interval [self stopGenTimer]; [self startGenTimer]; } } break; } // only need to update status info [statView setNeedsDisplay]; } // ----------------------------------------------------------------------------- - (IBAction)doChangeScale:(id)sender { ClearMessage(); switch([sender selectedSegmentIndex]) { case 0: { // zoom out currlayer->view->unzoom(); [statView setNeedsDisplay]; [pattView refreshPattern]; } break; case 1: { // set scale to 1:1 if (currlayer->view->getmag() != 0) { currlayer->view->setmag(0); [statView setNeedsDisplay]; [pattView refreshPattern]; } } break; case 2: { // zoom in if (currlayer->view->getmag() < MAX_MAG) { currlayer->view->zoom(); [statView setNeedsDisplay]; [pattView refreshPattern]; } else { Beep(); } } break; } } // ----------------------------------------------------------------------------- - (IBAction)doChangeMode:(id)sender { ClearMessage(); switch([sender selectedSegmentIndex]) { case 0: currlayer->touchmode = drawmode; break; case 1: currlayer->touchmode = pickmode; break; case 2: currlayer->touchmode = selectmode; break; case 3: currlayer->touchmode = movemode; break; } } // ----------------------------------------------------------------------------- - (IBAction)doMiddle:(id)sender { ClearMessage(); if (currlayer->originx == bigint::zero && currlayer->originy == bigint::zero) { currlayer->view->center(); } else { // put cell saved by ChangeOrigin (not yet implemented!!!) in middle currlayer->view->setpositionmag(currlayer->originx, currlayer->originy, currlayer->view->getmag()); } [statView setNeedsDisplay]; [pattView refreshPattern]; } // ----------------------------------------------------------------------------- - (IBAction)doSelectAll:(id)sender { ClearMessage(); SelectAll(); } // ----------------------------------------------------------------------------- - (IBAction)doAction:(id)sender { [pattView doSelectionAction]; } // ----------------------------------------------------------------------------- - (IBAction)doPaste:(id)sender { [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doPaste:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); if (waitingforpaste) { [pattView doPasteAction]; } else { PasteClipboard(); [pattView refreshPattern]; } } // ----------------------------------------------------------------------------- - (IBAction)doRule:(id)sender { [self stopIfGenerating]; if (event_checker > 0) { // try again after a short delay [self performSelector:@selector(doRule:) withObject:sender afterDelay:0.01]; return; } ClearMessage(); // let user change current algo/rule in a modal view RuleViewController *modalRuleController = [[RuleViewController alloc] initWithNibName:nil bundle:nil]; [modalRuleController setModalPresentationStyle:UIModalPresentationFullScreen]; [self presentModalViewController:modalRuleController animated:YES]; modalRuleController = nil; } // ----------------------------------------------------------------------------- - (IBAction)toggleFullScreen:(id)sender { if (fullscreen) { topBar.hidden = NO; editBar.hidden = NO; bottomBar.hidden = NO; statView.hidden = NO; // recalculate pattView's frame from scratch (in case device was rotated) CGFloat barht = topBar.bounds.size.height; CGFloat topht = barht * 2 + statView.bounds.size.height; CGFloat x = pattView.superview.frame.origin.x; CGFloat y = pattView.superview.frame.origin.y + topht; CGFloat wd = pattView.superview.frame.size.width; CGFloat ht = pattView.superview.frame.size.height - (topht + barht); pattView.frame = CGRectMake(x, y, wd, ht); [statView setNeedsDisplay]; } else { topBar.hidden = YES; editBar.hidden = YES; bottomBar.hidden = YES; statView.hidden = YES; pattView.frame = pattView.superview.frame; } fullscreen = !fullscreen; restoreButton.hidden = !fullscreen; [pattView refreshPattern]; UpdateEditBar(); } // ----------------------------------------------------------------------------- - (IBAction)doCancel:(id)sender { cancelProgress = true; } // ----------------------------------------------------------------------------- - (void)enableInteraction:(BOOL)enable { topBar.userInteractionEnabled = enable; editBar.userInteractionEnabled = enable; bottomBar.userInteractionEnabled = enable; pattView.userInteractionEnabled = enable; EnableTabBar(enable); } // ----------------------------------------------------------------------------- - (void)updateProgressBar:(float)fraction { progressBar.progress = fraction; // show estimate of time remaining double elapsecs = TimeInSeconds() - progstart; double remsecs = fraction > 0.0 ? (elapsecs / fraction) - elapsecs : 999.0; [progressMessage setText:[NSString stringWithFormat:@"Estimated time remaining (in secs): %d", int(remsecs+0.5)]]; // need following to see progress view and bar update event_checker++; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]; event_checker--; } @end // ============================================================================= // global routines used by external code: void UpdatePattern() { [globalPatternView refreshPattern]; } // ----------------------------------------------------------------------------- void UpdateStatus() { if (inscript || currlayer->undoredo->doingscriptchanges) return; if (!fullscreen) { [globalStatusView setNeedsDisplay]; } } // ----------------------------------------------------------------------------- void UpdateEditBar() { if (!fullscreen) { [globalController updateButtons]; [globalController updateDrawingState]; } } // ----------------------------------------------------------------------------- void CloseStatePicker() { [globalStateView dismissStatePopover]; } // ----------------------------------------------------------------------------- void PauseGenTimer() { if (generating) { // use pausecount to handle nested calls if (pausecount == 0) [globalController stopGenTimer]; pausecount++; } } // ----------------------------------------------------------------------------- void RestartGenTimer() { if (pausecount > 0) { pausecount--; if (pausecount == 0) [globalController startGenTimer]; } } // ----------------------------------------------------------------------------- static bool wasgenerating = false; // generating needs to be resumed? void PauseGenerating() { if (generating) { // stop generating without changing STOP button [globalController stopGenTimer]; StopGenerating(); // generating now false wasgenerating = true; } } // ----------------------------------------------------------------------------- void ResumeGenerating() { if (wasgenerating) { // generating should be false but play safe if (!generating) { if (StartGenerating()) { // generating now true [globalController startGenTimer]; } else { // this can happen if pattern is empty [globalController toggleStartStopButton]; [globalController updateButtons]; } } wasgenerating = false; } } // ----------------------------------------------------------------------------- void BeginProgress(const char* title) { if (progresscount == 0) { // disable interaction with all views but don't show progress view just yet [globalController enableInteraction:NO]; [globalTitle setText:[NSString stringWithCString:title encoding:NSUTF8StringEncoding]]; cancelProgress = false; progstart = TimeInSeconds(); } progresscount++; // handles nested calls } // ----------------------------------------------------------------------------- bool AbortProgress(double fraction_done, const char* message) { if (progresscount <= 0) Fatal("Bug detected in AbortProgress!"); double secs = TimeInSeconds() - progstart; if (!globalProgress.hidden) { if (secs < prognext) return false; prognext = secs + 0.1; // update progress bar about 10 times per sec if (fraction_done < 0.0) { // show indeterminate progress gauge??? } else { [globalController updateProgressBar:fraction_done]; } return cancelProgress; } else { // note that fraction_done is not always an accurate estimator for how long // the task will take, especially when we use nextcell for cut/copy if ( (secs > 1.0 && fraction_done < 0.3) || secs > 2.0 ) { // task is probably going to take a while so show progress view globalProgress.hidden = NO; [globalController updateProgressBar:fraction_done]; } prognext = secs + 0.01; // short delay until 1st progress update } return false; } // ----------------------------------------------------------------------------- void EndProgress() { if (progresscount <= 0) Fatal("Bug detected in EndProgress!"); progresscount--; if (progresscount == 0) { // hide the progress view and enable interaction with other views globalProgress.hidden = YES; [globalController enableInteraction:YES]; } } golly-2.5-src/gui-ios/Golly/PatternViewController.xib0000644000175100001440000021730512156145314017705 00000000000000 1280 10K549 1938 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUIView IBUIBarButtonItem IBProxyObject IBUIToolbar IBUILabel IBUIProgressView IBUISegmentedControl IBUIButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 274 295 292 {{53, 7}, {70, 30}} NO IBIPadFramework 0 0 1 START 3 MQA 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 3 MC41AA 2 15 Helvetica-Bold 15 16 292 {{247, 7}, {163, 30}} NO IBIPadFramework 2 3 0 Slower Step=1 Faster {0, 0} {0, 0} {0, 0} YES 292 {{501, 7}, {192, 30}} NO IBIPadFramework 2 3 0 Smaller Scale=1:1 Bigger {0, 0} {0, 0} {0, 0} YES {768, 44} NO NO IBIPadFramework IBIPadFramework 1 19 IBIPadFramework Next IBIPadFramework 1 Step IBIPadFramework 1 IBIPadFramework IBIPadFramework 5 Fit IBIPadFramework 1 IBIPadFramework Middle IBIPadFramework 1 295 {{0, 44}, {768, 63}} 3 MQA 2 NO 3 IBIPadFramework 311 265 {{677, 767}, {81, 30}} NO 0.69999998807907104 IBIPadFramework 0 0 1 Restore 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA {{0, 151}, {768, 807}} NO IBIPadFramework 295 292 292 {{0, 5}, {65, 21}} NO YES 7 NO IBIPadFramework State=255 3 MC4zMzMzMzMzMzMzAA 1 10 2 2 13 Helvetica-Bold 13 16 {{416, 6}, {66, 32}} 3 MCAwAA NO NO NO IBIPadFramework 296 {{492, 6}, {33, 33}} IBIPadFramework 292 {{545, 8}, {216, 30}} NO IBIPadFramework 2 4 0 Draw Pick Select Move {0, 0} {0, 0} {0, 0} {0, 0} {{0, 107}, {768, 44}} NO NO IBIPadFramework IBIPadFramework 1 21 IBIPadFramework 1 22 IBIPadFramework 5 All IBIPadFramework 1 IBIPadFramework 1 9 Paste IBIPadFramework 1 IBIPadFramework 5 IBIPadFramework IBIPadFramework IBIPadFramework 10 6 IBIPadFramework 266 {{0, 960}, {768, 44}} NO NO IBIPadFramework New IBIPadFramework 50 1 IBIPadFramework 5 Rule IBIPadFramework 50 1 IBIPadFramework 40 6 Info IBIPadFramework 50 1 IBIPadFramework 40 6 IBIPadFramework 1 3 IBIPadFramework 5 Full Screen IBIPadFramework 1 301 292 {{20, 20}, {344, 21}} NO YES 7 NO IBIPadFramework Title 1 MCAwIDAAA 1 10 1 1 17 Helvetica 17 16 292 {{20, 49}, {344, 21}} NO YES 7 NO IBIPadFramework Estimated time remaining 1 10 1 1 14 Helvetica 14 16 292 {{20, 94}, {344, 9}} NO IBIPadFramework 0.5 292 {{155, 140}, {74, 37}} NO IBIPadFramework 0 0 1 Cancel 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA {{192, 404}, {384, 197}} 3 MC42NjY2NjY2NjY3AA IBIPadFramework {{0, 20}, {768, 1004}} 3 MQA 2 IBIPadFramework view 12 pattView 13 statView 22 stepControl 51 scaleControl 52 startStopButton 55 modeControl 138 stateLabel 139 stateView 143 redoButton 156 undoButton 157 resetButton 160 restoreButton 192 topBar 200 editBar 201 bottomBar 202 actionButton 205 infoButton 213 cancelButton 222 progressBar 223 progressMessage 224 progressTitle 225 progressView 226 doStartStop: 7 45 doChangeStep: 13 49 doChangeScale: 13 54 doChangeMode: 13 141 doUndo: 152 doRedo: 154 doReset: 159 doNext: 163 doStep: 164 doFit: 166 doMiddle: 168 doSelectAll: 171 doPaste: 176 doNew: 182 doSave: 184 toggleFullScreen: 193 toggleFullScreen: 7 191 doAction: 204 doRule: 208 doInfo: 212 doCancel: 7 227 0 -1 File's Owner -2 2 5 10 17 16 19 21 41 40 42 43 106 114 112 120 119 127 129 132 131 133 150 151 158 161 162 165 167 169 175 178 179 181 187 188 189 203 206 207 209 210 211 214 217 218 219 221 220 PatternViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin PatternView com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin StateView com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin StatusView com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 227 PatternView UIView IBProjectSource ./Classes/PatternView.h PatternViewController UIViewController id id id id id id id id id id id id id id id id id id id id doAction: id doCancel: id doChangeMode: id doChangeScale: id doChangeStep: id doFit: id doInfo: id doMiddle: id doNew: id doNext: id doPaste: id doRedo: id doReset: id doRule: id doSave: id doSelectAll: id doStartStop: id doStep: id doUndo: id toggleFullScreen: id UIBarButtonItem UIToolbar UIButton UIToolbar UIBarButtonItem UISegmentedControl PatternView UIProgressView UILabel UILabel UIView UIBarButtonItem UIBarButtonItem UIButton UISegmentedControl UIButton StatusView UILabel StateView UISegmentedControl UIToolbar UIBarButtonItem actionButton UIBarButtonItem bottomBar UIToolbar cancelButton UIButton editBar UIToolbar infoButton UIBarButtonItem modeControl UISegmentedControl pattView PatternView progressBar UIProgressView progressMessage UILabel progressTitle UILabel progressView UIView redoButton UIBarButtonItem resetButton UIBarButtonItem restoreButton UIButton scaleControl UISegmentedControl startStopButton UIButton statView StatusView stateLabel UILabel stateView StateView stepControl UISegmentedControl topBar UIToolbar undoButton UIBarButtonItem IBProjectSource ./Classes/PatternViewController.h StateView UIView IBProjectSource ./Classes/StateView.h StatusView UIView IBProjectSource ./Classes/StatusView.h 0 IBIPadFramework YES 3 933 golly-2.5-src/gui-ios/Golly/PatternView.h0000644000175100001440000000222312156145314015275 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ // This is the view used to display a pattern (within the Pattern tab). @interface PatternView : UIView - (void)doPasteAction; - (void)doSelectionAction; - (void)refreshPattern; @end golly-2.5-src/gui-ios/Golly/PatternView.m0000644000175100001440000005076312156145314015316 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "bigint.h" #include "lifealgo.h" #include "viewport.h" #include "utils.h" // for event_checker #include "prefs.h" // for tilelayers, etc #include "status.h" // for ClearMessage #include "render.h" // for stacklayers, tilelayers #include "layer.h" // for currlayer, numlayers, etc #include "control.h" // for generating #include "render.h" // for DrawPattern #include "view.h" // for TouchBegan, TouchMoved, TouchEnded, etc #import #import #import #import #import #import "PatternViewController.h" // for PauseGenerating, ResumeGenerating #import "PatternView.h" @implementation PatternView // ----------------------------------------------------------------------------- // golbals for drawing with OpenGL ES static EAGLContext *context; static GLuint viewRenderbuffer = 0; static GLuint viewFramebuffer = 0; // ----------------------------------------------------------------------------- // override the default layer class (which is [CALayer class]) so that // this view will be backed by a layer using OpenGL ES rendering + (Class)layerClass { return [CAEAGLLayer class]; } // ----------------------------------------------------------------------------- - (id)initWithCoder:(NSCoder *)c { self = [super initWithCoder:c]; if (self) { // init the OpenGL ES stuff (based on Apple's GLPaint sample code): CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer; eaglLayer.opaque = YES; // note that we're using OpenGL ES version 1 context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; if (!context || ![EAGLContext setCurrentContext:context]) { self = nil; return self; } // set the view's scale factor self.contentScaleFactor = 1.0; // we only do 2D drawing glDisable(GL_DEPTH_TEST); glDisable(GL_DITHER); glDisable(GL_TEXTURE_2D); glEnableClientState(GL_VERTEX_ARRAY); glEnable(GL_BLEND); // this blending function seems similar to the one used in desktop Golly // (ie. selected patterns look much the same) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // add gesture recognizers to this view: [self setMultipleTouchEnabled:YES]; // pinch gestures will zoom in/out UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(zoomView:)]; pinchGesture.delegate = self; [self addGestureRecognizer:pinchGesture]; // one-finger pan gestures will be used to draw/pick/select/etc, depending on the current touch mode UIPanGestureRecognizer *pan1Gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(singleDrag:)]; pan1Gesture.minimumNumberOfTouches = 1; pan1Gesture.maximumNumberOfTouches = 1; pan1Gesture.delegate = self; [self addGestureRecognizer:pan1Gesture]; // two-finger pan gestures will move the view UIPanGestureRecognizer *pan2Gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveView:)]; pan2Gesture.minimumNumberOfTouches = 2; pan2Gesture.maximumNumberOfTouches = 2; pan2Gesture.delegate = self; [self addGestureRecognizer:pan2Gesture]; // single-taps will do various actions depending on the current touch mode UITapGestureRecognizer *tap1Gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; tap1Gesture.numberOfTapsRequired = 1; tap1Gesture.numberOfTouchesRequired = 1; tap1Gesture.delegate = self; [self addGestureRecognizer:tap1Gesture]; /* too many problems if we have gesture recognizers for single-taps and double-taps: // double-taps will do various actions depending on the location UITapGestureRecognizer *tap2Gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)]; tap2Gesture.numberOfTapsRequired = 2; tap2Gesture.numberOfTouchesRequired = 1; tap2Gesture.delegate = self; [self addGestureRecognizer:tap2Gesture]; // only do a single-tap if double-tap is not detected // (this works but the delay is way too long) // [tap1Gesture requireGestureRecognizerToFail:tap2Gesture]; */ } return self; } // ----------------------------------------------------------------------------- - (void)createFramebuffer { // generate IDs for a framebuffer object and a color renderbuffer glGenFramebuffersOES(1, &viewFramebuffer); glGenRenderbuffersOES(1, &viewRenderbuffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); // associate the storage for the current render buffer with our CAEAGLLayer // so we can draw into a buffer that will later be rendered to screen [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(id)self.layer]; glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer); if (glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) { NSLog(@"Error creating framebuffer object: %x", glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES)); Fatal("Failed to create frame buffer!"); } } // ----------------------------------------------------------------------------- - (void)destroyFramebuffer { // clean up any buffers we have allocated glDeleteFramebuffersOES(1, &viewFramebuffer); viewFramebuffer = 0; glDeleteRenderbuffersOES(1, &viewRenderbuffer); viewRenderbuffer = 0; } // ----------------------------------------------------------------------------- - (void)layoutSubviews { // this is called when view is resized (on start up or when device is rotated or when toggling full screen) // so we need to create the framebuffer to be the same size // NSLog(@"layoutSubviews: wd=%f ht=%f", self.bounds.size.width, self.bounds.size.height); [EAGLContext setCurrentContext:context]; // note that glLoadIdentity must be called after glMatrixMode but before glOrthof, // otherwise the display is blank glMatrixMode(GL_PROJECTION); glLoadIdentity(); CGRect frame = self.bounds; glOrthof(0, frame.size.width, frame.size.height, 0, -1, 1); // origin is top left and y increases down glViewport(0, 0, frame.size.width, frame.size.height); glMatrixMode(GL_MODELVIEW); if (viewFramebuffer != 0 || viewRenderbuffer != 0) { [self destroyFramebuffer]; } [self createFramebuffer]; [self refreshPattern]; } // ----------------------------------------------------------------------------- - (void)refreshPattern { // x and y are always 0 // float x = self.bounds.origin.x; // float y = self.bounds.origin.y; int wd = int(self.bounds.size.width); int ht = int(self.bounds.size.height); //!!! import from view.h if we ever support tiled layers int tileindex = -1; if ( numclones > 0 && numlayers > 1 && (stacklayers || tilelayers) ) { SyncClones(); } if ( numlayers > 1 && tilelayers ) { if ( tileindex >= 0 && ( wd != GetLayer(tileindex)->view->getwidth() || ht != GetLayer(tileindex)->view->getheight() ) ) { GetLayer(tileindex)->view->resize(wd, ht); } } else if ( wd != currlayer->view->getwidth() || ht != currlayer->view->getheight() ) { // set viewport size ResizeLayers(wd, ht); } [EAGLContext setCurrentContext:context]; DrawPattern(context, tileindex); // display the buffer glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); [context presentRenderbuffer:GL_RENDERBUFFER_OES]; } // ----------------------------------------------------------------------------- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIButton class]]){ // allow Restore button to work (when in fullscreen mode) return NO; } return YES; } // ----------------------------------------------------------------------------- - (void)zoomView:(UIPinchGestureRecognizer *)gestureRecognizer { static CGFloat oldscale = 1.0; static CGPoint zoompt; UIGestureRecognizerState state = [gestureRecognizer state]; if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged) { if (state == UIGestureRecognizerStateBegan) { // less confusing if we only get zoom point at start of pinch zoompt = [gestureRecognizer locationInView:self]; } CGFloat newscale = [gestureRecognizer scale]; if (newscale - oldscale < -0.1) { // fingers moved closer, so zoom out ZoomOutPos(zoompt.x, zoompt.y); oldscale = newscale; } else if (newscale - oldscale > 0.1) { // fingers moved apart, so zoom in ZoomInPos(zoompt.x, zoompt.y); oldscale = newscale; } } else if (state == UIGestureRecognizerStateEnded) { // reset scale [gestureRecognizer setScale:1.0]; oldscale = 1.0; } } // ----------------------------------------------------------------------------- static int startx, starty; - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if ([touches count] == 1) { // get the only touch and remember its location for use in singleDrag UITouch *t = [touches anyObject]; CGPoint currpt = [t locationInView:self]; startx = (int)currpt.x; starty = (int)currpt.y; } } // ----------------------------------------------------------------------------- - (void)singleDrag:(UIPanGestureRecognizer *)gestureRecognizer { static CGPoint prevpt, delta; UIGestureRecognizerState state = [gestureRecognizer state]; if (state == UIGestureRecognizerStateBegan) { prevpt = [gestureRecognizer locationInView:self]; ClearMessage(); // the current location is not where the initial touch occurred // so use the starting location saved in touchesBegan (otherwise // problems will occur when dragging a small paste image) TouchBegan(startx, starty); TouchMoved(prevpt.x, prevpt.y); } else if (state == UIGestureRecognizerStateChanged && [gestureRecognizer numberOfTouches] == 1) { CGPoint newpt = [gestureRecognizer locationInView:self]; TouchMoved(newpt.x, newpt.y); if (currlayer->touchmode == movemode) { delta.x = newpt.x - prevpt.x; delta.y = newpt.y - prevpt.y; prevpt = newpt; } } else if (state == UIGestureRecognizerStateEnded) { if (currlayer->touchmode == movemode) { // if velocity is high then move further in current direction CGPoint velocity = [gestureRecognizer velocityInView:self]; if (abs(velocity.x) > 1000.0 || abs(velocity.y) > 1000.0) { TouchMoved(prevpt.x + delta.x * abs(velocity.x/100.0), prevpt.y + delta.y * abs(velocity.y/100.0)); } } TouchEnded(); } else if (state == UIGestureRecognizerStateCancelled) { TouchEnded(); } } // ----------------------------------------------------------------------------- - (void)moveView:(UIPanGestureRecognizer *)gestureRecognizer { static TouchModes oldmode; static CGPoint prevpt, delta; UIGestureRecognizerState state = [gestureRecognizer state]; if (state == UIGestureRecognizerStateBegan) { prevpt = [gestureRecognizer locationInView:self]; ClearMessage(); oldmode = currlayer->touchmode; currlayer->touchmode = movemode; TouchBegan(prevpt.x, prevpt.y); } else if (state == UIGestureRecognizerStateChanged && [gestureRecognizer numberOfTouches] == 2) { CGPoint newpt = [gestureRecognizer locationInView:self]; TouchMoved(newpt.x, newpt.y); delta.x = newpt.x - prevpt.x; delta.y = newpt.y - prevpt.y; prevpt = newpt; } else if (state == UIGestureRecognizerStateEnded) { // if velocity is high then move further in current direction CGPoint velocity = [gestureRecognizer velocityInView:self]; if (abs(velocity.x) > 1000.0 || abs(velocity.y) > 1000.0) { TouchMoved(prevpt.x + delta.x * abs(velocity.x/100.0), prevpt.y + delta.y * abs(velocity.y/100.0)); } TouchEnded(); currlayer->touchmode = oldmode; } else if (state == UIGestureRecognizerStateCancelled) { TouchEnded(); currlayer->touchmode = oldmode; } } // ----------------------------------------------------------------------------- static UIActionSheet *selsheet; - (void)doSelectionAction { selsheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: @"Remove", @"Cut", @"Copy", @"Clear", @"Clear Outside", @"Shrink", [NSString stringWithFormat:@"Random Fill (%d%%)", randomfill], @"Flip Top-Bottom", @"Flip Left-Right", @"Rotate Clockwise", @"Rotate Anticlockwise", @"Advance", @"Advance Outside", nil]; [selsheet showInView:self]; } // ----------------------------------------------------------------------------- static UIActionSheet *pastesheet; - (void)doPasteAction { pastesheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: @"Abort", [NSString stringWithFormat:@"Paste (%@)", [NSString stringWithCString:GetPasteMode() encoding:NSUTF8StringEncoding]], @"Paste to Selection", @"Flip Top-Bottom", @"Flip Left-Right", @"Rotate Clockwise", @"Rotate Anticlockwise", nil]; [pastesheet showInView:self]; } // ----------------------------------------------------------------------------- static UIActionSheet *globalSheet; static int globalButton; - (void)doDelayedAction { if (globalSheet == selsheet) { if (generating && globalButton >= 1 && globalButton <= 12 && globalButton != 2 && globalButton != 5) { // temporarily stop generating for all actions except Remove, Copy and Shrink PauseGenerating(); if (event_checker > 0) { // try again after a short delay that gives time for NextGeneration() to terminate [self performSelector:@selector(doDelayedAction) withObject:nil afterDelay:0.01]; return; } } switch (globalButton) { case 0: RemoveSelection(); break; // WARNING: above test assumes Remove is index 0 case 1: CutSelection(); break; case 2: CopySelection(); break; // WARNING: above test assumes Copy is index 2 case 3: ClearSelection(); break; case 4: ClearOutsideSelection(); break; case 5: ShrinkSelection(false); break; // WARNING: above test assumes Shrink is index 5 case 6: RandomFill(); break; case 7: FlipSelection(true); break; case 8: FlipSelection(false); break; case 9: RotateSelection(true); break; case 10: RotateSelection(false); break; case 11: currlayer->currsel.Advance(); break; case 12: currlayer->currsel.AdvanceOutside(); break; // WARNING: above test assumes 12 is last index default: break; } ResumeGenerating(); } else if (globalSheet == pastesheet) { switch (globalButton) { case 0: AbortPaste(); break; case 1: DoPaste(false); break; case 2: DoPaste(true); break; case 3: FlipPastePattern(true); break; case 4: FlipPastePattern(false); break; case 5: RotatePastePattern(true); break; case 6: RotatePastePattern(false); break; default: break; } UpdateEverything(); } } // ----------------------------------------------------------------------------- // called when the user selects an option in a UIActionSheet - (void)actionSheet:(UIActionSheet *)sheet didDismissWithButtonIndex:(NSInteger)buttonIndex { // user interaction is disabled at this moment, which is a problem if Warning or BeginProgress // gets called (their OK/Cancel buttons won't work) so we have to call the appropriate // action code AFTER this callback has finished and user interaction restored globalSheet = sheet; globalButton = buttonIndex; [self performSelector:@selector(doDelayedAction) withObject:nil afterDelay:0.01]; } // ----------------------------------------------------------------------------- static double prevtime = 0.0; // used to detect a double tap - (void)singleTap:(UITapGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { CGPoint pt = [gestureRecognizer locationInView:self]; ClearMessage(); if (TimeInSeconds() - prevtime < 0.3) { // double tap if (waitingforpaste && PointInPasteImage(pt.x, pt.y)) { // display action sheet that lets user abort/paste/flip/rotate/etc [self doPasteAction]; } else if (currlayer->touchmode == selectmode && SelectionExists() && PointInSelection(pt.x, pt.y)) { // display action sheet that lets user remove/cut/copy/clear/etc [self doSelectionAction]; } else if (currlayer->touchmode == drawmode) { // do the drawing TouchBegan(pt.x, pt.y); TouchEnded(); } prevtime = 0.0; } else { // single tap TouchBegan(pt.x, pt.y); TouchEnded(); prevtime = TimeInSeconds(); } } } // ----------------------------------------------------------------------------- /* too many problems: - (void)doubleTap:(UITapGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { CGPoint pt = [gestureRecognizer locationInView:self]; ClearMessage(); if (waitingforpaste && PointInPasteImage(pt.x, pt.y)) { // display action sheet that lets user abort/paste/flip/rotate/etc [self doPasteAction]; } else if (SelectionExists() && PointInSelection(pt.x, pt.y)) { // display action sheet that lets user remove/cut/copy/clear/etc [self doSelectionAction]; } else if (currlayer->touchmode == drawmode) { // best to do the drawing, but there's a nasty problem: we only get // location of 1st tap, even if 2nd tap was in a different location TouchBegan(pt.x, pt.y); TouchEnded(); } } } */ // ----------------------------------------------------------------------------- @end golly-2.5-src/gui-ios/Golly/prefs.h0000644000175100001440000001430212156145314014145 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _PREFS_H_ #define _PREFS_H_ #include // for std::string #include // for std::list #include "utils.h" // for gColor // Routines for loading and saving user preferences: void GetPrefs(); // Read preferences from the GollyPrefs file. void SavePrefs(); // Write preferences to the GollyPrefs file. // Various constants: extern const char* GOLLY_VERSION; // app version const int minfontsize = 6; // minimum value of helpfontsize const int maxfontsize = 30; // maximum value of helpfontsize const int MAX_SPACING = 1000; // maximum value of boldspacing const int MAX_BASESTEP = 2000000000; // maximum base step const int MAX_DELAY = 5000; // maximum mindelay or maxdelay const int MAX_RECENT = 100; // maximum value of maxpatterns const int MIN_MEM_MB = 10; // minimum value of maxhashmem const int MAX_MEM_MB = 300; // maximum value of maxhashmem // Global paths: extern std::string gollydir; // path of directory containing app extern std::string datadir; // path of directory for user-specific data extern std::string tempdir; // path of directory for temporary data extern std::string helpdir; // path of directory for app's supplied help info extern std::string patternsdir; // path of directory for app's supplied patterns extern std::string rulesdir; // path of directory for app's supplied rule data extern std::string userrules; // path of directory for user's rule data extern std::string downloaddir; // path of directory for downloaded data extern std::string clipfile; // path of temporary file for storing clipboard data // Global preference data: extern int debuglevel; // for displaying debug info if > 0 extern int helpfontsize; // font size in help window extern char initrule[]; // initial rule extern bool initautofit; // initial autofit setting extern bool inithyperspeed; // initial hyperspeed setting extern bool initshowhashinfo; // initial showhashinfo setting extern bool savexrle; // save RLE file using XRLE format? extern bool showtool; // show tool bar? extern bool showlayer; // show layer bar? extern bool showedit; // show edit bar? extern bool showallstates; // show all cell states in edit bar? extern bool showstatus; // show status bar? extern bool showexact; // show exact numbers in status bar? extern bool showtimeline; // show timeline bar? extern bool showtiming; // show timing messages? extern bool showgridlines; // display grid lines? extern bool showicons; // display icons for cell states? extern bool swapcolors; // swap colors used for cell states? extern bool allowundo; // allow undo/redo? extern bool allowbeep; // okay to play beep sound? extern bool restoreview; // should reset/undo restore view? extern int canchangerule; // if > 0 then paste can change rule extern int randomfill; // random fill percentage extern int opacity; // percentage opacity of live cells in overlays extern int tileborder; // width of tiled window borders extern int mingridmag; // minimum mag to draw grid lines extern int boldspacing; // spacing of bold grid lines extern bool showboldlines; // show bold grid lines? extern bool mathcoords; // show Y values increasing upwards? extern bool syncviews; // synchronize viewports? extern bool syncmodes; // synchronize touch modes? extern bool stacklayers; // stack all layers? extern bool tilelayers; // tile all layers? extern bool askonnew; // ask to save changes before creating new pattern? extern bool askonload; // ask to save changes before loading pattern file? extern bool askondelete; // ask to save changes before deleting layer? extern bool askonquit; // ask to save changes before quitting app? extern int newmag; // mag setting for new pattern extern bool newremovesel; // new pattern removes selection? extern bool openremovesel; // opening pattern removes selection? extern int mindelay; // minimum millisec delay extern int maxdelay; // maximum millisec delay extern int maxhashmem; // maximum memory (in MB) for hashlife-based algos // Recent patterns: extern int numpatterns; // current number of recent pattern files extern int maxpatterns; // maximum number of recent pattern files extern std::list recentpatterns; // list of recent pattern files // Colors: extern gColor borderrgb; // color for border around bounded grid extern gColor selectrgb; // color for selected cells extern gColor pastergb; // color for pattern to be pasted // Paste info: typedef enum { And, Copy, Or, Xor // logical paste modes } paste_mode; extern paste_mode pmode; // current paste mode const char* GetPasteMode(); // get pmode void SetPasteMode(const char* s); // set pmode #endif golly-2.5-src/gui-ios/Golly/prefs.m0000644000175100001440000006633412156145314014166 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "lifealgo.h" #include "viewport.h" // for MAX_MAG #include "util.h" // for linereader, lifeerrors #include "utils.h" // for gColor, SetColor, Warning, Fatal, Beep #include "status.h" // for DisplayMessage #include "algos.h" // for NumAlgos, algoinfo, etc #include "layer.h" // for currlayer #include "prefs.h" #import "PatternViewController.h" // for BeginProgress, etc // ----------------------------------------------------------------------------- // Golly's preferences file is a simple text file. On iOS devices it's created // in Library/Preferences/ in the application directory (gollydir). const char* GOLLY_VERSION = "1.1"; std::string prefspath; // full path to prefs file const int PREFS_VERSION = 1; // increment if necessary due to changes in syntax/semantics int currversion = PREFS_VERSION; // might be changed by prefs_version const int PREF_LINE_SIZE = 5000; // must be quite long for storing file paths std::string gollydir; // path of directory containing app std::string datadir; // path of directory for user-specific data std::string tempdir; // path of directory for temporary data std::string helpdir; // path of directory for app's supplied help info std::string patternsdir; // path of directory for app's supplied patterns std::string rulesdir; // path of directory for app's supplied rule data std::string userrules; // path of directory for user's rule data std::string downloaddir; // path of directory for downloaded data std::string clipfile; // path of temporary file for storing clipboard data // initialize exported preferences: int debuglevel = 0; // for displaying debug info if > 0 int helpfontsize = 10; // font size in help window char initrule[256] = "B3/S23"; // initial rule bool initautofit = false; // initial autofit setting bool inithyperspeed = false; // initial hyperspeed setting bool initshowhashinfo = false; // initial showhashinfo setting bool savexrle = true; // save RLE file using XRLE format? bool showtool = true; // show tool bar? bool showlayer = false; // show layer bar? bool showedit = true; // show edit bar? bool showallstates = false; // show all cell states in edit bar? bool showstatus = true; // show status bar? bool showexact = false; // show exact numbers in status bar? bool showtimeline = false; // show timeline bar? bool showtiming = false; // show timing messages? bool showgridlines = true; // display grid lines? bool showicons = false; // display icons for cell states? bool swapcolors = false; // swap colors used for cell states? bool allowundo = true; // allow undo/redo? bool allowbeep = true; // okay to play beep sound? bool restoreview = true; // should reset/undo restore view? int canchangerule = 1; // if > 0 then paste can change rule (1 means change rule only if pattern is empty) int randomfill = 50; // random fill percentage (1..100) int opacity = 80; // percentage opacity of live cells in overlays (1..100) int tileborder = 3; // thickness of tiled window borders int mingridmag = 2; // minimum mag to draw grid lines int boldspacing = 10; // spacing of bold grid lines bool showboldlines = true; // show bold grid lines? bool mathcoords = false; // show Y values increasing upwards? bool syncviews = false; // synchronize viewports? bool syncmodes = true; // synchronize touch modes? bool stacklayers = false; // stack all layers? bool tilelayers = false; // tile all layers? bool askonnew = true; // ask to save changes before creating new pattern? bool askonload = true; // ask to save changes before loading pattern file? bool askondelete = true; // ask to save changes before deleting layer? bool askonquit = true; // ask to save changes before quitting app? int newmag = 5; // mag setting for new pattern bool newremovesel = true; // new pattern removes selection? bool openremovesel = true; // opening pattern removes selection? int mindelay = 250; // minimum millisec delay int maxdelay = 2000; // maximum millisec delay int maxhashmem = 100; // maximum memory (in MB) for hashlife-based algos int numpatterns = 0; // current number of recent pattern files int maxpatterns = 20; // maximum number of recent pattern files std::list recentpatterns; // list of recent pattern files gColor borderrgb; // color for border around bounded grid gColor selectrgb; // color for selected cells gColor pastergb; // color for pasted pattern paste_mode pmode = Or; // logical paste mode // ----------------------------------------------------------------------------- const char* GetPasteMode() { switch (pmode) { case And: return "AND"; case Copy: return "COPY"; case Or: return "OR"; case Xor: return "XOR"; default: return "unknown"; } } // ----------------------------------------------------------------------------- void SetPasteMode(const char* s) { if (strcmp(s, "AND") == 0) { pmode = And; } else if (strcmp(s, "COPY") == 0) { pmode = Copy; } else if (strcmp(s, "OR") == 0) { pmode = Or; } else { pmode = Xor; } } // ----------------------------------------------------------------------------- void CreateDefaultColors() { SetColor(borderrgb, 128, 128, 128); // 50% gray SetColor(selectrgb, 75, 175, 0); // dark green SetColor(pastergb, 255, 0, 0); // red } // ----------------------------------------------------------------------------- void GetColor(const char* value, gColor& rgb) { unsigned int r, g, b; sscanf(value, "%u,%u,%u", &r, &g, &b); SetColor(rgb, r, g, b); } // ----------------------------------------------------------------------------- void SaveColor(FILE* f, const char* name, const gColor rgb) { fprintf(f, "%s=%u,%u,%u\n", name, rgb.r, rgb.g, rgb.b); } // ----------------------------------------------------------------------------- void SavePrefs() { if (currlayer == NULL) { // should never happen but play safe Warning("Bug: currlayer is NULL!"); return; } FILE* f = fopen(prefspath.c_str(), "w"); if (f == NULL) { Warning("Could not save preferences file!"); return; } fprintf(f, "golly_version=%s\n", GOLLY_VERSION); fprintf(f, "prefs_version=%d\n", PREFS_VERSION); fprintf(f, "debug_level=%d\n", debuglevel); fprintf(f, "help_font_size=%d (%d..%d)\n", helpfontsize, minfontsize, maxfontsize); fprintf(f, "allow_undo=%d\n", allowundo ? 1 : 0); fprintf(f, "allow_beep=%d\n", allowbeep ? 1 : 0); fprintf(f, "restore_view=%d\n", restoreview ? 1 : 0); fprintf(f, "paste_mode=%s\n", GetPasteMode()); fprintf(f, "can_change_rule=%d (0..2)\n", canchangerule); fprintf(f, "random_fill=%d (1..100)\n", randomfill); fprintf(f, "min_delay=%d (0..%d millisecs)\n", mindelay, MAX_DELAY); fprintf(f, "max_delay=%d (0..%d millisecs)\n", maxdelay, MAX_DELAY); fprintf(f, "auto_fit=%d\n", currlayer->autofit ? 1 : 0); fprintf(f, "hyperspeed=%d\n", currlayer->hyperspeed ? 1 : 0); fprintf(f, "hash_info=%d\n", currlayer->showhashinfo ? 1 : 0); fprintf(f, "max_hash_mem=%d\n", maxhashmem); fputs("\n", f); fprintf(f, "init_algo=%s\n", GetAlgoName(currlayer->algtype)); for (int i = 0; i < NumAlgos(); i++) { fputs("\n", f); fprintf(f, "algorithm=%s\n", GetAlgoName(i)); fprintf(f, "base_step=%d\n", algoinfo[i]->defbase); SaveColor(f, "status_rgb", algoinfo[i]->statusrgb); SaveColor(f, "from_rgb", algoinfo[i]->fromrgb); SaveColor(f, "to_rgb", algoinfo[i]->torgb); fprintf(f, "use_gradient=%d\n", algoinfo[i]->gradient ? 1 : 0); fputs("colors=", f); for (int state = 0; state < algoinfo[i]->maxstates; state++) { // only write out state,r,g,b tuple if color is different to default if (algoinfo[i]->algor[state] != algoinfo[i]->defr[state] || algoinfo[i]->algog[state] != algoinfo[i]->defg[state] || algoinfo[i]->algob[state] != algoinfo[i]->defb[state] ) { fprintf(f, "%d,%d,%d,%d,", state, algoinfo[i]->algor[state], algoinfo[i]->algog[state], algoinfo[i]->algob[state]); } } fputs("\n", f); } fputs("\n", f); fprintf(f, "rule=%s\n", currlayer->algo->getrule()); fprintf(f, "show_tool=%d\n", showtool ? 1 : 0); fprintf(f, "show_layer=%d\n", showlayer ? 1 : 0); fprintf(f, "show_edit=%d\n", showedit ? 1 : 0); fprintf(f, "show_states=%d\n", showallstates ? 1 : 0); fprintf(f, "show_status=%d\n", showstatus ? 1 : 0); fprintf(f, "show_exact=%d\n", showexact ? 1 : 0); fprintf(f, "show_timeline=%d\n", showtimeline ? 1 : 0); fprintf(f, "show_timing=%d\n", showtiming ? 1 : 0); fprintf(f, "grid_lines=%d\n", showgridlines ? 1 : 0); fprintf(f, "min_grid_mag=%d (2..%d)\n", mingridmag, MAX_MAG); fprintf(f, "bold_spacing=%d (2..%d)\n", boldspacing, MAX_SPACING); fprintf(f, "show_bold_lines=%d\n", showboldlines ? 1 : 0); fprintf(f, "math_coords=%d\n", mathcoords ? 1 : 0); fputs("\n", f); fprintf(f, "sync_views=%d\n", syncviews ? 1 : 0); fprintf(f, "sync_modes=%d\n", syncmodes ? 1 : 0); fprintf(f, "stack_layers=%d\n", stacklayers ? 1 : 0); fprintf(f, "tile_layers=%d\n", tilelayers ? 1 : 0); fprintf(f, "tile_border=%d (1..10)\n", tileborder); fprintf(f, "ask_on_new=%d\n", askonnew ? 1 : 0); fprintf(f, "ask_on_load=%d\n", askonload ? 1 : 0); fprintf(f, "ask_on_delete=%d\n", askondelete ? 1 : 0); fprintf(f, "ask_on_quit=%d\n", askonquit ? 1 : 0); fputs("\n", f); fprintf(f, "show_icons=%d\n", showicons ? 1 : 0); fprintf(f, "swap_colors=%d\n", swapcolors ? 1 : 0); fprintf(f, "opacity=%d (1..100)\n", opacity); SaveColor(f, "border_rgb", borderrgb); SaveColor(f, "select_rgb", selectrgb); SaveColor(f, "paste_rgb", pastergb); fputs("\n", f); fprintf(f, "new_mag=%d (0..%d)\n", newmag, MAX_MAG); fprintf(f, "new_remove_sel=%d\n", newremovesel ? 1 : 0); fprintf(f, "open_remove_sel=%d\n", openremovesel ? 1 : 0); fprintf(f, "save_xrle=%d\n", savexrle ? 1 : 0); fprintf(f, "max_patterns=%d (1..%d)\n", maxpatterns, MAX_RECENT); if (!recentpatterns.empty()) { fputs("\n", f); std::list::iterator next = recentpatterns.begin(); while (next != recentpatterns.end()) { std::string path = *next; fprintf(f, "recent_pattern=%s\n", path.c_str()); next++; } } fclose(f); } // ----------------------------------------------------------------------------- bool GetKeywordAndValue(linereader& lr, char* line, char** keyword, char** value) { // the linereader class handles all line endings (CR, CR+LF, LF) // and terminates line buffer with \0 while ( lr.fgets(line, PREF_LINE_SIZE) != 0 ) { if ( line[0] == '#' || line[0] == 0 ) { // skip comment line or empty line } else { // line should have format keyword=value *keyword = line; *value = line; while ( **value != '=' && **value != 0 ) *value += 1; **value = 0; // terminate keyword *value += 1; return true; } } return false; } // ----------------------------------------------------------------------------- char* ReplaceDeprecatedAlgo(char* algoname) { if (strcmp(algoname, "RuleTable") == 0 || strcmp(algoname, "RuleTree") == 0) { // RuleTable and RuleTree algos have been replaced by RuleLoader return (char*)"RuleLoader"; } else { return algoname; } } // ----------------------------------------------------------------------------- void CreateDocSubdir(NSString *subdirname) { // create given subdirectory inside Documents NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [[paths objectAtIndex:0] stringByAppendingPathComponent:subdirname]; if ([[NSFileManager defaultManager] fileExistsAtPath:path]) { // do nothing if subdir already exists } else { NSError *error; if (![[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:&error]) { NSLog(@"Error creating %@ subdirectory: %@", subdirname, error); } } } // ----------------------------------------------------------------------------- void InitPaths() { // init path to location of app gollydir = [NSHomeDirectory() cStringUsingEncoding:NSUTF8StringEncoding]; gollydir += "/"; // init prefspath to gollydir/Library/Preferences/GollyPrefs prefspath = gollydir + "Library/Preferences/GollyPrefs"; // init datadir to gollydir/Documents/Saved/ datadir = gollydir + "Documents/Saved/"; CreateDocSubdir(@"Saved"); // init downloaddir to gollydir/Documents/Downloads/ downloaddir = gollydir + "Documents/Downloads/"; CreateDocSubdir(@"Downloads"); // init userrules to gollydir/Documents/Rules/ userrules = gollydir + "Documents/Rules/"; CreateDocSubdir(@"Rules"); // init path to supplied help helpdir = gollydir + "Golly.app/Help/"; // init path to supplied rules rulesdir = gollydir + "Golly.app/Rules/"; // init path to supplied patterns patternsdir = gollydir + "Golly.app/Patterns/"; // init tempdir to gollydir/tmp/ tempdir = gollydir + "tmp/"; clipfile = tempdir + "golly_clipboard"; /* DEBUG NSLog(@"gollydir = %s", gollydir.c_str()); NSLog(@"datadir = %s", datadir.c_str()); NSLog(@"tempdir = %s", tempdir.c_str()); NSLog(@"prefspath = %s", prefspath.c_str()); NSLog(@"downloaddir = %s", downloaddir.c_str()); NSLog(@"userrules = %s", userrules.c_str()); NSLog(@"rulesdir = %s", rulesdir.c_str()); NSLog(@"helpdir = %s", helpdir.c_str()); NSLog(@"patternsdir = %s", patternsdir.c_str()); NSLog(@"clipfile = %s", clipfile.c_str()); */ } // ----------------------------------------------------------------------------- // let gollybase code call Fatal, Warning, BeginProgress, etc class my_errors : public lifeerrors { public: virtual void fatal(const char* s) { Fatal(s); } virtual void warning(const char* s) { Warning(s); } virtual void status(const char* s) { DisplayMessage(s); } virtual void beginprogress(const char* s) { BeginProgress(s); // init flag for isaborted() calls aborted = false; } virtual bool abortprogress(double f, const char* s) { return AbortProgress(f, s); } virtual void endprogress() { EndProgress(); } virtual const char* getuserrules() { return (const char*) userrules.c_str(); } virtual const char* getrulesdir() { return (const char*) rulesdir.c_str(); } }; static my_errors myerrhandler; // create instance // ----------------------------------------------------------------------------- void GetPrefs() { int algoindex = -1; // unknown algorithm InitPaths(); // init gollydir, prefspath, etc // let gollybase code call Fatal, Warning, BeginProgress, etc lifeerrors::seterrorhandler(&myerrhandler); CreateDefaultColors(); FILE* f = fopen(prefspath.c_str(), "r"); if (f == NULL) { // should only happen 1st time app is run return; } linereader reader(f); char line[PREF_LINE_SIZE]; char* keyword; char* value; while ( GetKeywordAndValue(reader, line, &keyword, &value) ) { if (strcmp(keyword, "prefs_version") == 0) { sscanf(value, "%d", &currversion); } else if (strcmp(keyword, "debug_level") == 0) { sscanf(value, "%d", &debuglevel); } else if (strcmp(keyword, "help_font_size") == 0) { sscanf(value, "%d", &helpfontsize); if (helpfontsize < minfontsize) helpfontsize = minfontsize; if (helpfontsize > maxfontsize) helpfontsize = maxfontsize; } else if (strcmp(keyword, "allow_undo") == 0) { allowundo = value[0] == '1'; } else if (strcmp(keyword, "allow_beep") == 0) { allowbeep = value[0] == '1'; } else if (strcmp(keyword, "restore_view") == 0) { restoreview = value[0] == '1'; } else if (strcmp(keyword, "paste_mode") == 0) { SetPasteMode(value); } else if (strcmp(keyword, "can_change_rule") == 0) { sscanf(value, "%d", &canchangerule); if (canchangerule < 0) canchangerule = 0; if (canchangerule > 2) canchangerule = 2; } else if (strcmp(keyword, "random_fill") == 0) { sscanf(value, "%d", &randomfill); if (randomfill < 1) randomfill = 1; if (randomfill > 100) randomfill = 100; } else if (strcmp(keyword, "algorithm") == 0) { if (strcmp(value, "RuleTable") == 0) { // use deprecated RuleTable settings for RuleLoader // (deprecated RuleTree settings will simply be ignored) value = (char*)"RuleLoader"; } algoindex = -1; for (int i = 0; i < NumAlgos(); i++) { if (strcmp(value, GetAlgoName(i)) == 0) { algoindex = i; break; } } } else if (strcmp(keyword, "base_step") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) { int base; sscanf(value, "%d", &base); if (base < 2) base = 2; if (base > MAX_BASESTEP) base = MAX_BASESTEP; algoinfo[algoindex]->defbase = base; } } else if (strcmp(keyword, "status_rgb") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) GetColor(value, algoinfo[algoindex]->statusrgb); } else if (strcmp(keyword, "from_rgb") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) GetColor(value, algoinfo[algoindex]->fromrgb); } else if (strcmp(keyword, "to_rgb") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) GetColor(value, algoinfo[algoindex]->torgb); } else if (strcmp(keyword, "use_gradient") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) algoinfo[algoindex]->gradient = value[0] == '1'; } else if (strcmp(keyword, "colors") == 0) { if (algoindex >= 0 && algoindex < NumAlgos()) { int state, r, g, b; while (sscanf(value, "%d,%d,%d,%d,", &state, &r, &g, &b) == 4) { if (state >= 0 && state < algoinfo[algoindex]->maxstates) { algoinfo[algoindex]->algor[state] = r; algoinfo[algoindex]->algog[state] = g; algoinfo[algoindex]->algob[state] = b; } while (*value != ',') value++; value++; while (*value != ',') value++; value++; while (*value != ',') value++; value++; while (*value != ',') value++; value++; } } } else if (strcmp(keyword, "min_delay") == 0) { sscanf(value, "%d", &mindelay); if (mindelay < 0) mindelay = 0; if (mindelay > MAX_DELAY) mindelay = MAX_DELAY; } else if (strcmp(keyword, "max_delay") == 0) { sscanf(value, "%d", &maxdelay); if (maxdelay < 0) maxdelay = 0; if (maxdelay > MAX_DELAY) maxdelay = MAX_DELAY; } else if (strcmp(keyword, "auto_fit") == 0) { initautofit = value[0] == '1'; } else if (strcmp(keyword, "init_algo") == 0) { value = ReplaceDeprecatedAlgo(value); int i = staticAlgoInfo::nameToIndex(value); if (i >= 0 && i < NumAlgos()) initalgo = i; } else if (strcmp(keyword, "hyperspeed") == 0) { inithyperspeed = value[0] == '1'; } else if (strcmp(keyword, "hash_info") == 0) { initshowhashinfo = value[0] == '1'; } else if (strcmp(keyword, "max_hash_mem") == 0) { sscanf(value, "%d", &maxhashmem); if (maxhashmem < MIN_MEM_MB) maxhashmem = MIN_MEM_MB; if (maxhashmem > MAX_MEM_MB) maxhashmem = MAX_MEM_MB; } else if (strcmp(keyword, "rule") == 0) { strncpy(initrule, value, sizeof(initrule)); } else if (strcmp(keyword, "show_tool") == 0) { showtool = value[0] == '1'; } else if (strcmp(keyword, "show_layer") == 0) { showlayer = value[0] == '1'; } else if (strcmp(keyword, "show_edit") == 0) { showedit = value[0] == '1'; } else if (strcmp(keyword, "show_states") == 0) { showallstates = value[0] == '1'; } else if (strcmp(keyword, "show_status") == 0) { showstatus = value[0] == '1'; } else if (strcmp(keyword, "show_exact") == 0) { showexact = value[0] == '1'; } else if (strcmp(keyword, "show_timeline") == 0) { showtimeline = value[0] == '1'; } else if (strcmp(keyword, "show_timing") == 0) { showtiming = value[0] == '1'; } else if (strcmp(keyword, "grid_lines") == 0) { showgridlines = value[0] == '1'; } else if (strcmp(keyword, "min_grid_mag") == 0) { sscanf(value, "%d", &mingridmag); if (mingridmag < 2) mingridmag = 2; if (mingridmag > MAX_MAG) mingridmag = MAX_MAG; } else if (strcmp(keyword, "bold_spacing") == 0) { sscanf(value, "%d", &boldspacing); if (boldspacing < 2) boldspacing = 2; if (boldspacing > MAX_SPACING) boldspacing = MAX_SPACING; } else if (strcmp(keyword, "show_bold_lines") == 0) { showboldlines = value[0] == '1'; } else if (strcmp(keyword, "math_coords") == 0) { mathcoords = value[0] == '1'; } else if (strcmp(keyword, "sync_views") == 0) { syncviews = value[0] == '1'; } else if (strcmp(keyword, "sync_modes") == 0) { syncmodes = value[0] == '1'; } else if (strcmp(keyword, "stack_layers") == 0) { stacklayers = value[0] == '1'; } else if (strcmp(keyword, "tile_layers") == 0) { tilelayers = value[0] == '1'; } else if (strcmp(keyword, "tile_border") == 0) { sscanf(value, "%d", &tileborder); if (tileborder < 1) tileborder = 1; if (tileborder > 10) tileborder = 10; } else if (strcmp(keyword, "ask_on_new") == 0) { askonnew = value[0] == '1'; } else if (strcmp(keyword, "ask_on_load") == 0) { askonload = value[0] == '1'; } else if (strcmp(keyword, "ask_on_delete") == 0) { askondelete = value[0] == '1'; } else if (strcmp(keyword, "ask_on_quit") == 0) { askonquit = value[0] == '1'; } else if (strcmp(keyword, "show_icons") == 0) { showicons = value[0] == '1'; } else if (strcmp(keyword, "swap_colors") == 0) { swapcolors = value[0] == '1'; } else if (strcmp(keyword, "opacity") == 0) { sscanf(value, "%d", &opacity); if (opacity < 1) opacity = 1; if (opacity > 100) opacity = 100; } else if (strcmp(keyword, "border_rgb") == 0) { GetColor(value, borderrgb); } else if (strcmp(keyword, "select_rgb") == 0) { GetColor(value, selectrgb); } else if (strcmp(keyword, "paste_rgb") == 0) { GetColor(value, pastergb); } else if (strcmp(keyword, "new_mag") == 0) { sscanf(value, "%d", &newmag); if (newmag < 0) newmag = 0; if (newmag > MAX_MAG) newmag = MAX_MAG; } else if (strcmp(keyword, "new_remove_sel") == 0) { newremovesel = value[0] == '1'; } else if (strcmp(keyword, "open_remove_sel") == 0) { openremovesel = value[0] == '1'; } else if (strcmp(keyword, "save_xrle") == 0) { savexrle = value[0] == '1'; } else if (strcmp(keyword, "max_patterns") == 0) { sscanf(value, "%d", &maxpatterns); if (maxpatterns < 1) maxpatterns = 1; if (maxpatterns > MAX_RECENT) maxpatterns = MAX_RECENT; } else if (strcmp(keyword, "recent_pattern") == 0) { if (numpatterns < maxpatterns && value[0]) { // append path to recentpatterns if file exists std::string path = value; if (path.find("Patterns/") == 0 || FileExists(gollydir + path)) { recentpatterns.push_back(path); numpatterns++; } } } } reader.close(); // stacklayers and tilelayers must not both be true if (stacklayers && tilelayers) tilelayers = false; } golly-2.5-src/gui-ios/Golly/render.h0000644000175100001440000000312012156145314014301 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _RENDER_H_ #define _RENDER_H_ #include "utils.h" // for gRect class lifealgo; // Routines for rendering the pattern view: void DrawPattern(EAGLContext* context, int tileindex); // Draw the current pattern, grid lines, selection, etc. // The given tile index is only used when drawing tiled layers. void CreatePasteImage(lifealgo* pastealgo, gRect& bbox); // Create an image used to draw the given paste pattern. // The given bounding box is not necessarily the *minimal* bounding box because // the paste pattern might have blank borders (in fact it could be empty). void DestroyPasteImage(); // Destroy the image created above (call when user ends paste). #endif golly-2.5-src/gui-ios/Golly/render.m0000644000175100001440000011044212156145314014314 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ /* -------------------- Some notes on Golly's display code --------------------- The rectangular area used to display patterns is called the viewport. All drawing in the viewport is done in this module using OpenGL ES. The main rendering routine is DrawPattern() -- see the end of this module. DrawPattern() does the following tasks: - Calls currlayer->algo->draw() to draw the current pattern. It passes in renderer, an instance of ios_render (derived from liferender) which has these methods: - pixblit() draws a pixmap containing at least one live cell. - getcolors() provides access to the current layer's color arrays. Note that currlayer->algo->draw() does all the hard work of figuring out which parts of the viewport are dead and building all the pixmaps for the live parts. The pixmaps contain suitably shrunken images when the scale is < 1:1 (ie. mag < 0). - Calls DrawGridLines() to overlay grid lines if they are visible. - Calls DrawGridBorder() to draw border around a bounded universe. - Calls DrawSelection() to overlay a translucent selection rectangle if a selection exists and any part of it is visible. - If the user is doing a paste, DrawPasteImage() draws the paste pattern stored in pastealgo. ----------------------------------------------------------------------------- */ #include "bigint.h" #include "lifealgo.h" #include "viewport.h" #include "utils.h" // for Warning, Fatal, etc #include "status.h" // for DisplayMessage #include "prefs.h" // for showgridlines, mingridmag, swapcolors, etc #include "layer.h" // currlayer, GetLayer, etc #include "view.h" // nopattupdate, waitingforpaste, pasterect, pastex, pastey, etc #include "render.h" #import #import // ----------------------------------------------------------------------------- // local data used in ios_render routines: static int currwd, currht; // current width and height of viewport static unsigned char** iconpixels; // pointers to pixel data for each icon // for drawing paste pattern static lifealgo* pastealgo; // universe containing paste pattern static gRect pastebbox; // bounding box in cell coords (not necessarily minimal) /*!!! // for drawing multiple layers static int layerwd = -1; // width of layer bitmap static int layerht = -1; // height of layer bitmap static wxBitmap* layerbitmap = NULL; // layer bitmap */ // ----------------------------------------------------------------------------- void FillRect(int x, int y, int wd, int ht) { GLfloat rect[] = { x, y+ht, // left, bottom x+wd, y+ht, // right, bottom x+wd, y, // right, top x, y, // left, top }; glVertexPointer(2, GL_FLOAT, 0, rect); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); } // ----------------------------------------------------------------------------- void DrawPoints(unsigned char* rgbdata, int x, int y, int w, int h) { // called from ios_render::pixblit to draw pattern at 1:1 scale const int maxcoords = 1024; // must be multiple of 2 GLfloat points[maxcoords]; int numcoords = 0; glPointSize(1); unsigned char deadr = currlayer->cellr[0]; unsigned char deadg = currlayer->cellg[0]; unsigned char deadb = currlayer->cellb[0]; unsigned char prevr = deadr; unsigned char prevg = deadg; unsigned char prevb = deadb; glColor4ub(deadr, deadg, deadb, 255); unsigned char r, g, b; int i = 0; for (int row = 0; row < h; row++) { for (int col = 0; col < w; col++) { r = rgbdata[i++]; g = rgbdata[i++]; b = rgbdata[i++]; if (r != deadr || g != deadg || b != deadb) { // we've got a live pixel bool changecolor = (r != prevr || g != prevg || b != prevb); if (changecolor || numcoords == maxcoords) { if (numcoords > 0) { glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_POINTS, 0, numcoords/2); numcoords = 0; } if (changecolor) { prevr = r; prevg = g; prevb = b; glColor4ub(r, g, b, 255); } } points[numcoords++] = x + col + 0.5; points[numcoords++] = y + row + 0.5; } } } if (numcoords > 0) { glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_POINTS, 0, numcoords/2); } } // ----------------------------------------------------------------------------- void DrawIcons(unsigned char* statedata, int x, int y, int w, int h, int pmscale, int stride) { // called from ios_render::pixblit to draw icons for each live cell; // assume pmscale > 2 (should be 8 or 16 or 32) int cellsize = pmscale - 1; const int maxcoords = 1024; // must be multiple of 2 GLfloat points[maxcoords]; int numcoords = 0; bool multicolor = currlayer->multicoloricons; glPointSize(1); unsigned char deadr = currlayer->cellr[0]; unsigned char deadg = currlayer->cellg[0]; unsigned char deadb = currlayer->cellb[0]; unsigned char prevr = deadr; unsigned char prevg = deadg; unsigned char prevb = deadb; glColor4ub(deadr, deadg, deadb, 255); for (int row = 0; row < h; row++) { for (int col = 0; col < w; col++) { unsigned char state = statedata[row*stride + col]; if (state && iconpixels[state]) { // draw non-black pixels in this icon unsigned char liver = currlayer->cellr[state]; unsigned char liveg = currlayer->cellg[state]; unsigned char liveb = currlayer->cellb[state]; unsigned char* pxldata = iconpixels[state]; int byte = 0; for (int i = 0; i < cellsize; i++) { for (int j = 0; j < cellsize; j++) { unsigned char r = pxldata[byte++]; unsigned char g = pxldata[byte++]; unsigned char b = pxldata[byte++]; byte++; // skip alpha if (r || g || b) { if (multicolor) { // draw non-black pixel from multi-colored icon if (swapcolors) { r = 255 - r; g = 255 - g; b = 255 - b; } } else { // grayscale icon if (r == 255) { // replace white pixel with current cell color r = liver; g = liveg; b = liveb; } else { // replace gray pixel with appropriate shade between // live and dead cell colors float frac = (float)r / 255.0; r = (int)(deadr + frac * (liver - deadr) + 0.5); g = (int)(deadg + frac * (liveg - deadg) + 0.5); b = (int)(deadb + frac * (liveb - deadb) + 0.5); } } // draw r,g,b pixel bool changecolor = (r != prevr || g != prevg || b != prevb); if (changecolor || numcoords == maxcoords) { if (numcoords > 0) { glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_POINTS, 0, numcoords/2); numcoords = 0; } if (changecolor) { prevr = r; prevg = g; prevb = b; glColor4ub(r, g, b, 255); } } points[numcoords++] = x + col*pmscale + j + 0.5; points[numcoords++] = y + row*pmscale + i + 0.5; } } } } } } if (numcoords > 0) { glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_POINTS, 0, numcoords/2); } } // ----------------------------------------------------------------------------- void DrawMagnifiedCells(unsigned char* statedata, int x, int y, int w, int h, int pmscale, int stride) { // called from ios_render::pixblit to draw cells magnified by pmscale (2, 4, ... 2^MAX_MAG) int cellsize = pmscale > 2 ? pmscale - 1 : pmscale; int numstates = currlayer->algo->NumCellStates(); const int maxcoords = 1024; // must be multiple of 2 GLfloat points[maxcoords]; int numcoords = 0; glPointSize(cellsize); if (numstates == 2) { // all live cells are in state 1 so only need to set color once glColor4ub(currlayer->cellr[1], currlayer->cellg[1], currlayer->cellb[1], 255); for (int row = 0; row < h; row++) { for (int col = 0; col < w; col++) { unsigned char state = statedata[row*stride + col]; if (state > 0) { // fill cellsize*cellsize pixels // FillRect(x + col * pmscale, y + row * pmscale, cellsize, cellsize); // optimize by calling glDrawArrays less often if (numcoords == maxcoords) { glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_POINTS, 0, maxcoords/2); numcoords = 0; } // store mid point of cell points[numcoords++] = x + col*pmscale + cellsize/2.0; points[numcoords++] = y + row*pmscale + cellsize/2.0; } } } } else { // numstates > 2 so we need to change color when state changes unsigned char prevstate = 0; for (int row = 0; row < h; row++) { for (int col = 0; col < w; col++) { unsigned char state = statedata[row*stride + col]; if (state > 0) { if (state != prevstate || numcoords == maxcoords) { if (numcoords > 0) { glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_POINTS, 0, numcoords/2); numcoords = 0; } if (state != prevstate) { prevstate = state; // change color glColor4ub(currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state], 255); } } // fill cellsize*cellsize pixels // FillRect(x + col * pmscale, y + row * pmscale, cellsize, cellsize); points[numcoords++] = x + col*pmscale + cellsize/2.0; points[numcoords++] = y + row*pmscale + cellsize/2.0; } } } } if (numcoords > 0) { glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_POINTS, 0, numcoords/2); } } // ----------------------------------------------------------------------------- class ios_render : public liferender { public: ios_render() {} virtual ~ios_render() {} virtual void killrect(int x, int y, int w, int h); virtual void pixblit(int x, int y, int w, int h, char* pm, int pmscale); virtual void getcolors(unsigned char** r, unsigned char** g, unsigned char** b); }; ios_render renderer; // create instance // ----------------------------------------------------------------------------- void ios_render::killrect(int x, int y, int w, int h) { #if 0 // is Tom's hashdraw code doing unnecessary work??? if (x >= currwd || y >= currht) return; if (x + w <= 0 || y + h <= 0) return; if (w <= 0 || h <= 0) return; // clip given rect so it's within viewport int clipx = x < 0 ? 0 : x; int clipy = y < 0 ? 0 : y; int clipr = x + w; int clipb = y + h; if (clipr > currwd) clipr = currwd; if (clipb > currht) clipb = currht; int clipwd = clipr - clipx; int clipht = clipb - clipy; // use a different pale color each time to see any probs glColor4ub((rand()&127)+128, (rand()&127)+128, (rand()&127)+128, 255); FillRect(clipx, clipy, clipwd, clipht); #else // no need to do anything because background has already been filled by DrawPattern #endif } // ----------------------------------------------------------------------------- void ios_render::pixblit(int x, int y, int w, int h, char* pmdata, int pmscale) { // is Tom's hashdraw code doing unnecessary work??? if (x >= currwd || y >= currht) return; if (x + w <= 0 || y + h <= 0) return; // stride is the horizontal pixel width of the image data int stride = w/pmscale; // clip data outside viewport if (pmscale > 1) { // pmdata contains 1 byte per `pmscale' pixels, so we must be careful // and adjust x, y, w and h by multiples of `pmscale' only if (x < 0) { int dx = -x/pmscale*pmscale; pmdata += dx/pmscale; w -= dx; x += dx; } if (y < 0) { int dy = -y/pmscale*pmscale; pmdata += dy/pmscale*stride; h -= dy; y += dy; } if (x + w >= currwd + pmscale) w = (currwd - x + pmscale - 1)/pmscale*pmscale; if (y + h >= currht + pmscale) h = (currht - y + pmscale - 1)/pmscale*pmscale; } if (pmscale == 1) { // draw rgb pixel data at scale 1:1 DrawPoints((unsigned char*) pmdata, x, y, w, h); } else if (showicons && pmscale > 4 && iconpixels) { // draw icons at scales 1:8 or 1:16 or 1:32 DrawIcons((unsigned char*) pmdata, x, y, w/pmscale, h/pmscale, pmscale, stride); } else { // draw magnified cells, assuming pmdata contains (w/pmscale)*(h/pmscale) bytes // where each byte contains a cell state DrawMagnifiedCells((unsigned char*) pmdata, x, y, w/pmscale, h/pmscale, pmscale, stride); } } // ----------------------------------------------------------------------------- void ios_render::getcolors(unsigned char** r, unsigned char** g, unsigned char** b) { *r = currlayer->cellr; *g = currlayer->cellg; *b = currlayer->cellb; } // ----------------------------------------------------------------------------- void DrawGridBorder(int wd, int ht) { // universe is bounded so draw any visible border regions pair ltpxl = currlayer->view->screenPosOf(currlayer->algo->gridleft, currlayer->algo->gridtop, currlayer->algo); pair rbpxl = currlayer->view->screenPosOf(currlayer->algo->gridright, currlayer->algo->gridbottom, currlayer->algo); int left = ltpxl.first; int top = ltpxl.second; int right = rbpxl.first; int bottom = rbpxl.second; if (currlayer->algo->gridwd == 0) { left = 0; right = wd-1; } if (currlayer->algo->gridht == 0) { top = 0; bottom = ht-1; } // note that right and/or bottom might be INT_MAX so avoid adding to cause overflow if (currlayer->view->getmag() > 0) { // move to bottom right pixel of cell at gridright,gridbottom if (right < wd) right += (1 << currlayer->view->getmag()) - 1; if (bottom < ht) bottom += (1 << currlayer->view->getmag()) - 1; if (currlayer->view->getmag() == 1) { // there are no gaps at scale 1:2 if (right < wd) right++; if (bottom < ht) bottom++; } } else { if (right < wd) right++; if (bottom < ht) bottom++; } if (left < 0 && right >= wd && top < 0 && bottom >= ht) { // border isn't visible (ie. grid fills viewport) return; } glColor4ub(borderrgb.r, borderrgb.g, borderrgb.b, 255); if (left >= wd || right < 0 || top >= ht || bottom < 0) { // no part of grid is visible so fill viewport with border FillRect(0, 0, wd, ht); return; } // avoid drawing overlapping rects below int rtop = 0; int rheight = ht; if (currlayer->algo->gridht > 0) { if (top > 0) { // top border is visible FillRect(0, 0, wd, top); // reduce size of rect below rtop = top; rheight -= top; } if (bottom < ht) { // bottom border is visible FillRect(0, bottom, wd, ht - bottom); // reduce size of rect below rheight -= ht - bottom; } } if (currlayer->algo->gridwd > 0) { if (left > 0) { // left border is visible FillRect(0, rtop, left, rheight); } if (right < wd) { // right border is visible FillRect(right, rtop, wd - right, rheight); } } } // ----------------------------------------------------------------------------- void DrawSelection(gRect& rect, bool active) { // draw semi-transparent rectangle if (active) { glColor4ub(selectrgb.r, selectrgb.g, selectrgb.b, 128); } else { // use light gray to indicate an inactive selection glColor4f(0.7, 0.7, 0.7, 0.5); } FillRect(rect.x, rect.y, rect.width, rect.height); } // ----------------------------------------------------------------------------- void CreatePasteImage(lifealgo* palgo, gRect& bbox) { // set globals used in DrawPasteImage pastealgo = palgo; pastebbox = bbox; } // ----------------------------------------------------------------------------- void DestroyPasteImage() { // no need to do anything } // ----------------------------------------------------------------------------- int PixelsToCells(int pixels, int mag) { // convert given # of screen pixels to corresponding # of cells if (mag >= 0) { int cellsize = 1 << mag; return (pixels + cellsize - 1) / cellsize; } else { // mag < 0; no need to worry about overflow return pixels << -mag; } } // ----------------------------------------------------------------------------- void SetPasteRect(int wd, int ht) { int x, y, pastewd, pasteht; int mag = currlayer->view->getmag(); // find cell coord of current paste position pair pcell = currlayer->view->at(pastex, pastey); // determine bottom right cell bigint right = pcell.first; right += wd; right -= 1; bigint bottom = pcell.second; bottom += ht; bottom -= 1; // best to use same method as in Selection::Visible pair lt = currlayer->view->screenPosOf(pcell.first, pcell.second, currlayer->algo); pair rb = currlayer->view->screenPosOf(right, bottom, currlayer->algo); if (mag > 0) { // move rb to pixel at bottom right corner of cell rb.first += (1 << mag) - 1; rb.second += (1 << mag) - 1; if (mag > 1) { // avoid covering gaps at scale 1:4 and above rb.first--; rb.second--; } } x = lt.first; y = lt.second; pastewd = rb.first - lt.first + 1; pasteht = rb.second - lt.second + 1; // this should never happen but play safe if (pastewd <= 0) pastewd = 1; if (pasteht <= 0) pasteht = 1; // don't let pasterect get too far beyond left/top edge of viewport if (x + pastewd < 64) { if (pastewd >= 64) x = 64 - pastewd; else if (x < 0) x = 0; pastex = x; } if (y + pasteht < 64) { if (pasteht >= 64) y = 64 - pasteht; else if (y < 0) y = 0; pastey = y; } SetRect(pasterect, x, y, pastewd, pasteht); } // ----------------------------------------------------------------------------- void DrawPasteImage() { // calculate pasterect SetPasteRect(pastebbox.width, pastebbox.height); // NSLog(@"pasterect: x=%d y=%d wd=%d ht=%d", pasterect.x, pasterect.y, pasterect.width, pasterect.height); int pastemag = currlayer->view->getmag(); gRect cellbox = pastebbox; // calculate intersection of pasterect and current viewport for use // as a temporary viewport int itop = pasterect.y; int ileft = pasterect.x; int ibottom = itop + pasterect.height - 1; int iright = ileft + pasterect.width - 1; if (itop < 0) { itop = 0; cellbox.y += PixelsToCells(-pasterect.y, pastemag); } if (ileft < 0) { ileft = 0; cellbox.x += PixelsToCells(-pasterect.x, pastemag); } if (ibottom > currht - 1) ibottom = currht - 1; if (iright > currwd - 1) iright = currwd - 1; int pastewd = iright - ileft + 1; int pasteht = ibottom - itop + 1; cellbox.width = PixelsToCells(pastewd, pastemag); cellbox.height = PixelsToCells(pasteht, pastemag); // create temporary viewport viewport tempview(pastewd, pasteht); int midx, midy; if (pastemag > 0) { midx = cellbox.x + cellbox.width / 2; midy = cellbox.y + cellbox.height / 2; } else { midx = cellbox.x + (cellbox.width - 1) / 2; midy = cellbox.y + (cellbox.height - 1) / 2; } tempview.setpositionmag(midx, midy, pastemag); // temporarily turn off grid lines (for DrawIcons) bool saveshow = showgridlines; showgridlines = false; // temporarily change currwd and currht int savewd = currwd; int saveht = currht; currwd = tempview.getwidth(); currht = tempview.getheight(); glTranslatef(ileft, itop, 0); // draw paste pattern pastealgo->draw(tempview, renderer); glTranslatef(-ileft, -itop, 0); showgridlines = saveshow; currwd = savewd; currht = saveht; // overlay translucent rect to show paste area glColor4ub(pastergb.r, pastergb.g, pastergb.b, 64); FillRect(ileft, itop, pastewd, pasteht); } // ----------------------------------------------------------------------------- void DrawGridLines(int wd, int ht) { int cellsize = 1 << currlayer->view->getmag(); int h, v, i, topbold, leftbold; if (showboldlines) { // ensure that origin cell stays next to bold lines; // ie. bold lines scroll when pattern is scrolled pair lefttop = currlayer->view->at(0, 0); leftbold = lefttop.first.mod_smallint(boldspacing); topbold = lefttop.second.mod_smallint(boldspacing); if (currlayer->originx != bigint::zero) { leftbold -= currlayer->originx.mod_smallint(boldspacing); } if (currlayer->originy != bigint::zero) { topbold -= currlayer->originy.mod_smallint(boldspacing); } if (mathcoords) topbold--; // show origin cell above bold line } else { // avoid gcc warning topbold = leftbold = 0; } // set the stroke color depending on current bg color int r = currlayer->cellr[0]; int g = currlayer->cellg[0]; int b = currlayer->cellb[0]; int gray = (int) ((r + g + b) / 3.0); if (gray > 127) { // darker lines glColor4ub(r > 32 ? r - 32 : 0, g > 32 ? g - 32 : 0, b > 32 ? b - 32 : 0, 255); } else { // lighter lines glColor4ub(r + 32 < 256 ? r + 32 : 255, g + 32 < 256 ? g + 32 : 255, b + 32 < 256 ? b + 32 : 255, 255); } glLineWidth(1.0); // draw all plain lines first // note that we need to subtract 0.5 from each coordinate to avoid uneven spacing // and get same result on iOS Simulator (non Retina) and iPad with Retina i = showboldlines ? topbold : 1; v = 0; while (true) { v += cellsize; if (v >= ht) break; if (showboldlines) i++; if (i % boldspacing != 0 && v >= 0 && v < ht) { GLfloat points[] = {-0.5, v-0.5, wd-0.5, v-0.5}; glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_LINES, 0, 2); } } i = showboldlines ? leftbold : 1; h = 0; while (true) { h += cellsize; if (h >= wd) break; if (showboldlines) i++; if (i % boldspacing != 0 && h >= 0 && h < wd) { GLfloat points[] = {h-0.5, -0.5, h-0.5, ht-0.5}; glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_LINES, 0, 2); } } if (showboldlines) { // draw bold lines in slightly darker/lighter color if (gray > 127) { // darker lines glColor4ub(r > 64 ? r - 64 : 0, g > 64 ? g - 64 : 0, b > 64 ? b - 64 : 0, 255); } else { // lighter lines glColor4ub(r + 64 < 256 ? r + 64 : 255, g + 64 < 256 ? g + 64 : 255, b + 64 < 256 ? b + 64 : 255, 255); } i = topbold; v = 0; while (true) { v += cellsize; if (v >= ht) break; i++; if (i % boldspacing == 0 && v >= 0 && v < ht) { GLfloat points[] = {-0.5, v-0.5, wd-0.5, v-0.5}; glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_LINES, 0, 2); } } i = leftbold; h = 0; while (true) { h += cellsize; if (h >= wd) break; i++; if (i % boldspacing == 0 && h >= 0 && h < wd) { GLfloat points[] = {h-0.5, -0.5, h-0.5, ht-0.5}; glVertexPointer(2, GL_FLOAT, 0, points); glDrawArrays(GL_LINES, 0, 2); } } } } // ----------------------------------------------------------------------------- /*!!! void DrawOneLayer(EAGLContext* dc) { wxMemoryDC layerdc; layerdc.SelectObject(*layerbitmap); if (showicons && currlayer->view->getmag() > 2) { // only show icons at scales 1:8, 1:16 and 1:32 if (currlayer->view->getmag() == 3) { iconpixels = currlayer->iconpixels7x7; } else if (currlayer->view->getmag() == 4) { iconpixels = currlayer->iconpixels15x15; } else { iconpixels = currlayer->iconpixels31x31; } } currlayer->algo->draw(*currlayer->view, renderer); layerdc.SelectObject(wxNullBitmap); // make dead pixels 100% transparent; live pixels use opacity setting MaskDeadPixels(layerbitmap, layerwd, layerht, int(2.55 * opacity)); // draw result dc.DrawBitmap(*layerbitmap, 0, 0, true); } // ----------------------------------------------------------------------------- void DrawStackedLayers(EAGLContext* dc) { // check if layerbitmap needs to be created or resized if ( layerwd != currlayer->view->getwidth() || layerht != currlayer->view->getheight() ) { layerwd = currlayer->view->getwidth(); layerht = currlayer->view->getheight(); delete layerbitmap; // create a bitmap with depth 32 so it has an alpha channel layerbitmap = new wxBitmap(layerwd, layerht, 32); if (!layerbitmap) { Fatal(_("Not enough memory for layer bitmap!")); return; } } // temporarily turn off grid lines bool saveshow = showgridlines; showgridlines = false; // draw patterns in layers 1..numlayers-1 for ( int i = 1; i < numlayers; i++ ) { Layer* savelayer = currlayer; currlayer = GetLayer(i); // use real current layer's viewport viewport* saveview = currlayer->view; currlayer->view = savelayer->view; // avoid drawing a cloned layer more than once??? draw first or last clone??? if ( !currlayer->algo->isEmpty() ) { DrawOneLayer(dc); } // draw this layer's selection if necessary wxRect r; if ( currlayer->currsel.Visible(&r) ) { DrawSelection(dc, r, i == currindex); } // restore viewport and currlayer currlayer->view = saveview; currlayer = savelayer; } showgridlines = saveshow; } // ----------------------------------------------------------------------------- void DrawTileFrame(EAGLContext* dc, wxRect& trect, wxBrush& brush, int wd) { trect.Inflate(wd); wxRect r = trect; r.height = wd; FillRect(dc, r, brush); // top edge r.y += trect.height - wd; FillRect(dc, r, brush); // bottom edge r = trect; r.width = wd; FillRect(dc, r, brush); // left edge r.x += trect.width - wd; FillRect(dc, r, brush); // right edge } // ----------------------------------------------------------------------------- void DrawTileBorders(EAGLContext* dc) { if (tileborder <= 0) return; // no borders // draw tile borders in bigview window int wd, ht; bigview->GetClientSize(&wd, &ht); if (wd < 1 || ht < 1) return; wxBrush brush; // most people will choose either a very light or very dark color for dead cells, // so draw mid gray border around non-current tiles brush.SetColour(144, 144, 144); wxRect trect; for ( int i = 0; i < numlayers; i++ ) { if (i != currindex) { trect = GetLayer(i)->tilerect; DrawTileFrame(dc, trect, brush, tileborder); } } // draw green border around current tile trect = GetLayer(currindex)->tilerect; brush.SetColour(0, 255, 0); DrawTileFrame(dc, trect, brush, tileborder); } !!!*/ // ----------------------------------------------------------------------------- // we don't use context but might need it for drawing stacked/tiled layers!!!??? void DrawPattern(EAGLContext* context, int tileindex) { gRect r; int colorindex = currindex; /*!!! Layer* savelayer = NULL; viewport* saveview0 = NULL; */ // fill the background with state 0 color glClearColor(currlayer->cellr[0]/255.0, currlayer->cellg[0]/255.0, currlayer->cellb[0]/255.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); // if grid is bounded then ensure viewport's central cell is not outside grid edges if ( currlayer->algo->gridwd > 0) { if ( currlayer->view->x < currlayer->algo->gridleft ) currlayer->view->setpositionmag(currlayer->algo->gridleft, currlayer->view->y, currlayer->view->getmag()); else if ( currlayer->view->x > currlayer->algo->gridright ) currlayer->view->setpositionmag(currlayer->algo->gridright, currlayer->view->y, currlayer->view->getmag()); } if ( currlayer->algo->gridht > 0) { if ( currlayer->view->y < currlayer->algo->gridtop ) currlayer->view->setpositionmag(currlayer->view->x, currlayer->algo->gridtop, currlayer->view->getmag()); else if ( currlayer->view->y > currlayer->algo->gridbottom ) currlayer->view->setpositionmag(currlayer->view->x, currlayer->algo->gridbottom, currlayer->view->getmag()); } if (nopattupdate) { // don't draw incomplete pattern, just draw grid lines and border currwd = currlayer->view->getwidth(); currht = currlayer->view->getheight(); if ( showgridlines && currlayer->view->getmag() >= mingridmag ) { DrawGridLines(currwd, currht); } if ( currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0 ) { DrawGridBorder(currwd, currht); } return; } /*!!! if ( numlayers > 1 && tilelayers ) { if ( tileindex < 0 ) { DrawTileBorders(dc); return; } // tileindex >= 0 so temporarily change some globals to draw this tile if ( syncviews && tileindex != currindex ) { // make sure this layer uses same location and scale as current layer GetLayer(tileindex)->view->setpositionmag(currlayer->view->x, currlayer->view->y, currlayer->view->getmag()); } savelayer = currlayer; currlayer = GetLayer(tileindex); viewptr = currlayer->tilewin; colorindex = tileindex; } else if ( numlayers > 1 && stacklayers ) { // draw all layers starting with layer 0 but using current layer's viewport savelayer = currlayer; if ( currindex != 0 ) { // change currlayer to layer 0 currlayer = GetLayer(0); saveview0 = currlayer->view; currlayer->view = savelayer->view; } colorindex = 0; } */ if (showicons && currlayer->view->getmag() > 2) { // only show icons at scales 1:8, 1:16 and 1:32 if (currlayer->view->getmag() == 3) { iconpixels = currlayer->iconpixels7x7; } else if (currlayer->view->getmag() == 4) { iconpixels = currlayer->iconpixels15x15; } else { iconpixels = currlayer->iconpixels31x31; } } currwd = currlayer->view->getwidth(); currht = currlayer->view->getheight(); // draw pattern using a sequence of pixblit calls currlayer->algo->draw(*currlayer->view, renderer); if ( showgridlines && currlayer->view->getmag() >= mingridmag ) { DrawGridLines(currwd, currht); } // if universe is bounded then draw border regions (if visible) if ( currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0 ) { DrawGridBorder(currwd, currht); } if ( currlayer->currsel.Visible(&r) ) { DrawSelection(r, colorindex == currindex); } /*!!! if ( numlayers > 1 && stacklayers ) { // must restore currlayer before we call DrawStackedLayers currlayer = savelayer; if ( saveview0 ) { // restore layer 0's viewport GetLayer(0)->view = saveview0; } // draw layers 1, 2, ... numlayers-1 DrawStackedLayers(dc); } */ if (waitingforpaste) { DrawPasteImage(); } /*!!! if ( numlayers > 1 && tilelayers ) { // restore globals changed above currlayer = savelayer; viewptr = currlayer->tilewin; } */ } golly-2.5-src/gui-ios/Golly/RuleViewController.h0000644000175100001440000000316712156145314016643 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import // This view controller is used when the Pattern tab's Rule button is tapped. @interface RuleViewController : UIViewController { IBOutlet UIButton *algoButton; IBOutlet UITextField *ruleText; IBOutlet UILabel *unknownLabel; IBOutlet UIPickerView *rulePicker; IBOutlet UIWebView *htmlView; } - (IBAction)changeAlgorithm:(id)sender; - (IBAction)cancelRuleChange:(id)sender; - (IBAction)doRuleChange:(id)sender; @end std::string GetRuleName(const std::string& rule); golly-2.5-src/gui-ios/Golly/RuleViewController.m0000644000175100001440000006314612156145314016653 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "prefs.h" // for allowundo, SavePrefs #include "algos.h" // for algo_type, NumAlgos, etc #include "layer.h" // for currlayer, etc #include "undo.h" // for currlayer->undoredo #include "view.h" // for SaveCurrentSelection #include "control.h" // for ChangeAlgorithm, CreateRuleFiles #include "file.h" // for OpenFile #import "InfoViewController.h" // for ShowTextFile #import "OpenViewController.h" // for MoveSharedFiles #import "RuleViewController.h" @implementation RuleViewController // ----------------------------------------------------------------------------- const char* RULE_IF_EMPTY = "B3/S23"; // use Life if ruleText is empty static algo_type algoindex; // index of currently displayed algorithm static std::string oldrule; // original rule on entering Rule screen static int oldmaxstate; // maximum cell state in original rule static CGPoint curroffset[MAX_ALGOS]; // current offset in scroll view for each algoindex static NSString *namedRules[] = // data for rulePicker { // keep names in alphabetical order, and rules must be in canonical form for findNamedRule and GetRuleName @"3-4 Life", @"B34/S34", @"AntiLife", @"B0123478/S01234678", @"Banners", @"2367/3457/5", @"Bloomerang", @"234/34678/24", @"Brian's Brain", @"/2/3", @"Caterpillars", @"124567/378/4", @"Cooties", @"23/2/8", @"Day and Night", @"B3678/S34678", @"Diamoeba", @"B35678/S5678", @"Fireworks", @"2/13/21", @"Fredkin", @"B1357/S02468", @"Frogs", @"12/34/3", @"HighLife", @"B36/S23", @"Hutton32", @"Hutton32", @"JvN29", @"JvN29", @"Lava", @"12345/45678/8", @"Life", @"B3/S23", @"LifeHistory", @"LifeHistory", @"Life without Death", @"B3/S012345678", @"Lines", @"012345/458/3", @"LongLife", @"B345/S5", @"Morley", @"B368/S245", @"Nobili32", @"Nobili32", @"Persian Rug", @"B234/S", @"Plow World", @"B378/S012345678", @"Replicator", @"B1357/S1357", @"Seeds", @"B2/S", @"Star Wars", @"345/2/4", @"Sticks", @"3456/2/6", @"Transers", @"345/26/5", @"WireWorld", @"WireWorld", @"Wolfram 22", @"W22", @"Wolfram 30", @"W30", @"Wolfram 110", @"W110", @"Xtasy", @"1456/2356/16", @"UNNAMED", @"Bug if we see this!" // UNNAMED must be last }; const int NUM_ROWS = (sizeof(namedRules) / sizeof(namedRules[0])) / 2; const int UNNAMED_ROW = NUM_ROWS - 1; // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Rule"; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; htmlView.delegate = self; // init all offsets to top left for (int i=0; i deprecated, keeprules; while (path = [dirEnum nextObject]) { std::string filename = [path cStringUsingEncoding:NSUTF8StringEncoding]; if (IsRuleFile(filename)) { if (EndsWith(filename,".rule")) { // .rule file exists, so tell CreateRuleFiles not to change it keeprules.push_back(filename); } else { // this is a deprecated .table/tree/colors/icons file deprecated.push_back(filename); } } } if (deprecated.size() > 0) { // convert deprecated files into new .rule files (if not in keeprules) // and then delete all the deprecated files CreateRuleFiles(deprecated, keeprules); } } // ----------------------------------------------------------------------------- static void CreateRuleLinks(std::string& htmldata, const std::string& dir, const std::string& prefix, const std::string& title, bool candelete) { htmldata += "

"; htmldata += title; htmldata += "

"; NSFileManager *fm = [NSFileManager defaultManager]; NSString *rdir = [NSString stringWithCString:dir.c_str() encoding:NSUTF8StringEncoding]; NSDirectoryEnumerator *dirEnum = [fm enumeratorAtPath:rdir]; NSString *path; while (path = [dirEnum nextObject]) { std::string pstr = [path cStringUsingEncoding:NSUTF8StringEncoding]; size_t extn = pstr.rfind(".rule"); if (extn != std::string::npos) { // path is to a .rule file std::string rulename = pstr.substr(0,extn); if (candelete) { // allow user to delete .rule file htmldata += "DELETE   "; // allow user to edit .rule file htmldata += "EDIT   "; } else { // allow user to read supplied .rule file htmldata += "READ   "; } // use "open:" link rather than "rule:" link so dialog closes immediately htmldata += ""; htmldata += rulename; htmldata += "
"; } } } // ----------------------------------------------------------------------------- - (void)showAlgoHelp { NSString *algoname = [NSString stringWithCString:GetAlgoName(algoindex) encoding:NSUTF8StringEncoding]; if ([algoname isEqualToString:@"RuleLoader"]) { // first check for any .rule/tree/table/colors/icons files in Documents // (created by iTunes file sharing) and move them into Documents/Rules/ MoveSharedFiles(); // now convert any .tree/table/colors/icons files to .rule files ConvertOldRules(); // create html data with links to the user's .rule files and Golly's supplied .rule files std::string htmldata; htmldata += ""; htmldata += "

The RuleLoader algorithm allows CA rules to be specified in .rule files."; htmldata += " Given the rule string \"Foo\", RuleLoader will search for a file called Foo.rule"; htmldata += " in your rules folder (Documents/Rules/), then in the rules folder supplied with Golly."; htmldata += "

"; CreateRuleLinks(htmldata, userrules, "Documents/Rules/", "Your .rule files:", true); CreateRuleLinks(htmldata, rulesdir, "Rules/", "Supplied .rule files:", false); htmldata += "

TOP
"; [htmlView loadHTMLString:[NSString stringWithCString:htmldata.c_str() encoding:NSUTF8StringEncoding] baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]]; // the above base URL is needed for links like to work } else { NSBundle *bundle=[NSBundle mainBundle]; NSString *filePath = [bundle pathForResource:algoname ofType:@"html" inDirectory:@"Help/Algorithms"]; if (filePath) { NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; NSURLRequest *request = [NSURLRequest requestWithURL:fileUrl]; [htmlView loadRequest:request]; } else { [htmlView loadHTMLString:@"
Failed to find html file!
" baseURL:nil]; } } } // ----------------------------------------------------------------------------- - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // save current location curroffset[algoindex] = htmlView.scrollView.contentOffset; // show current algo and rule algoindex = currlayer->algtype; [algoButton setTitle:[NSString stringWithCString:GetAlgoName(algoindex) encoding:NSUTF8StringEncoding] forState:UIControlStateNormal]; [self showAlgoHelp]; oldrule = currlayer->algo->getrule(); oldmaxstate = currlayer->algo->NumCellStates() - 1; [ruleText setText:[NSString stringWithCString:currlayer->algo->getrule() encoding:NSUTF8StringEncoding]]; unknownLabel.hidden = YES; // show corresponding name for current rule (or UNNAMED if there isn't one) [rulePicker selectRow:[self findNamedRule:ruleText.text] inComponent:0 animated:NO]; // selection might change if grid becomes smaller, so save current selection // if RememberRuleChange/RememberAlgoChange is called later SaveCurrentSelection(); } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [htmlView stopLoading]; // in case the web view is still loading its content // save current location of htmlView curroffset[algoindex] = htmlView.scrollView.contentOffset; } // ----------------------------------------------------------------------------- - (IBAction)changeAlgorithm:(id)sender { UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil]; for (int i=0; i= 0 && globalButton < NumAlgos()) { // save current location curroffset[algoindex] = htmlView.scrollView.contentOffset; // save chosen algo for later use algoindex = globalButton; // display the chosen algo name [algoButton setTitle:[NSString stringWithCString:GetAlgoName(algoindex) encoding:NSUTF8StringEncoding] forState:UIControlStateNormal]; // display help for chosen algo [self showAlgoHelp]; // if current rule (in ruleText) is valid in the chosen algo then don't change rule, // otherwise switch to the algo's default rule std::string thisrule = [ruleText.text cStringUsingEncoding:NSUTF8StringEncoding]; if (thisrule.empty()) thisrule = RULE_IF_EMPTY; lifealgo* tempalgo = CreateNewUniverse(algoindex); const char* err = tempalgo->setrule(thisrule.c_str()); if (err) { // switch to tempalgo's default rule std::string defrule = tempalgo->DefaultRule(); size_t thispos = thisrule.find(':'); if (thispos != std::string::npos) { // preserve valid topology so we can do things like switch from // "LifeHistory:T30,20" in RuleLoader to "B3/S23:T30,20" in QuickLife size_t defpos = defrule.find(':'); if (defpos != std::string::npos) { // default rule shouldn't have a suffix but play safe and remove it defrule = defrule.substr(0, defpos); } defrule += ":"; defrule += thisrule.substr(thispos+1); } [ruleText setText:[NSString stringWithCString:defrule.c_str() encoding:NSUTF8StringEncoding]]; [rulePicker selectRow:[self findNamedRule:ruleText.text] inComponent:0 animated:NO]; unknownLabel.hidden = YES; } delete tempalgo; } } // ----------------------------------------------------------------------------- // called when the user selects an item from UIActionSheet created in changeAlgorithm - (void)actionSheet:(UIActionSheet *)sheet didDismissWithButtonIndex:(NSInteger)buttonIndex { // user interaction is disabled at this moment, which is a problem if Warning gets called // (the OK button won't work) so we have to call the appropriate action code AFTER this // callback has finished and user interaction restored globalButton = buttonIndex; [self performSelector:@selector(doDelayedAction) withObject:nil afterDelay:0.01]; } // ----------------------------------------------------------------------------- - (void)checkRule { // check displayed rule and show message if it's not valid in any algo, // or if the rule is valid then displayed algo might need to change std::string thisrule = [ruleText.text cStringUsingEncoding:NSUTF8StringEncoding]; if (thisrule.empty()) { thisrule = RULE_IF_EMPTY; [ruleText setText:[NSString stringWithCString:thisrule.c_str() encoding:NSUTF8StringEncoding]]; [rulePicker selectRow:[self findNamedRule:ruleText.text] inComponent:0 animated:NO]; } // 1st check if rule is valid in displayed algo lifealgo* tempalgo = CreateNewUniverse(algoindex); const char* err = tempalgo->setrule(thisrule.c_str()); if (err) { // check rule in other algos for (int newindex = 0; newindex < NumAlgos(); newindex++) { if (newindex != algoindex) { delete tempalgo; tempalgo = CreateNewUniverse(newindex); err = tempalgo->setrule(thisrule.c_str()); if (!err) { // save current location curroffset[algoindex] = htmlView.scrollView.contentOffset; algoindex = newindex; [algoButton setTitle:[NSString stringWithCString:GetAlgoName(algoindex) encoding:NSUTF8StringEncoding] forState:UIControlStateNormal]; [self showAlgoHelp]; break; } } } } unknownLabel.hidden = (err == nil); if (err) { // unknown rule must be unnamed [rulePicker selectRow:UNNAMED_ROW inComponent:0 animated:NO]; Beep(); } else { // need canonical rule for comparison in findNamedRule and GetRuleName NSString *canonrule = [NSString stringWithCString:tempalgo->getrule() encoding:NSUTF8StringEncoding]; [rulePicker selectRow:[self findNamedRule:canonrule] inComponent:0 animated:NO]; } delete tempalgo; } // ----------------------------------------------------------------------------- - (IBAction)cancelRuleChange:(id)sender { [self dismissModalViewControllerAnimated:YES]; } // ----------------------------------------------------------------------------- - (IBAction)doRuleChange:(id)sender { // clear first responder if necessary (ie. remove keyboard) [self.view endEditing:YES]; if (unknownLabel.hidden == NO) { Warning("Given rule is not valid in any algorithm."); // don't dismiss modal view return; } // dismiss modal view first in case ChangeAlgorithm calls BeginProgress [self dismissModalViewControllerAnimated:YES]; // get current rule in ruleText std::string newrule = [ruleText.text cStringUsingEncoding:NSUTF8StringEncoding]; if (newrule.empty()) newrule = RULE_IF_EMPTY; if (algoindex == currlayer->algtype) { // check if new rule is valid in current algorithm // (if not then revert to original rule saved in viewWillAppear) const char* err = currlayer->algo->setrule(newrule.c_str()); if (err) RestoreRule(oldrule.c_str()); // convert newrule to canonical form for comparison with oldrule, then // check if the rule string changed or if the number of states changed newrule = currlayer->algo->getrule(); int newmaxstate = currlayer->algo->NumCellStates() - 1; if (oldrule != newrule || oldmaxstate != newmaxstate) { // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } // rule change might have changed the number of cell states; // if there are fewer states then pattern might change if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } if (allowundo) { currlayer->undoredo->RememberRuleChange(oldrule.c_str()); } } UpdateLayerColors(); UpdateEverything(); } else { // change the current algorithm and switch to the new rule // (if the new rule is invalid then the algo's default rule will be used); // this also calls UpdateLayerColors, UpdateEverything and RememberAlgoChange ChangeAlgorithm(algoindex, newrule.c_str()); } SavePrefs(); } // ----------------------------------------------------------------------------- // UITextFieldDelegate methods: - (void)textFieldDidBeginEditing:(UITextField *)tf { // probably best to clear any message about unknown rule unknownLabel.hidden = YES; } - (void)textFieldDidEndEditing:(UITextField *)tf { // called when rule editing has ended (ie. keyboard disappears) [self checkRule]; } - (BOOL)textFieldShouldReturn:(UITextField *)tf { // called when user hits Done button, so remove keyboard // (note that textFieldDidEndEditing will then be called) [tf resignFirstResponder]; return YES; } - (BOOL)disablesAutomaticKeyboardDismissal { // this allows keyboard to be dismissed if modal view uses UIModalPresentationFormSheet return NO; } // ----------------------------------------------------------------------------- // UIPickerViewDelegate and UIPickerViewDataSource methods: - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return NUM_ROWS; } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component; { return namedRules[row * 2]; } - (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component { return 38.0; // nicer spacing } - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { if (row < UNNAMED_ROW) { [ruleText setText:namedRules[row * 2 + 1]]; [self checkRule]; } } // ----------------------------------------------------------------------------- // UIWebViewDelegate methods: - (void)webViewDidStartLoad:(UIWebView *)webView { // show the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; } - (void)webViewDidFinishLoad:(UIWebView *)webView { // hide the activity indicator in the status bar [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // restore old offset here htmlView.scrollView.contentOffset = curroffset[algoindex]; } - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { // hide the activity indicator in the status bar and display error message [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; // we can safely ignore -999 errors if (error.code == NSURLErrorCancelled) return; Warning([error.localizedDescription cStringUsingEncoding:NSUTF8StringEncoding]); } - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (navigationType == UIWebViewNavigationTypeLinkClicked) { NSURL *url = [request URL]; NSString *link = [url absoluteString]; // look for special prefixes used by Golly (and return NO if found) if ([link hasPrefix:@"open:"]) { // open specified file, but dismiss modal view first in case OpenFile calls BeginProgress [self dismissModalViewControllerAnimated:YES]; std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; OpenFile(path.c_str()); SavePrefs(); return NO; } if ([link hasPrefix:@"rule:"]) { // copy specified rule into ruleText [ruleText setText:[link substringFromIndex:5]]; [self checkRule]; return NO; } if ([link hasPrefix:@"delete:"]) { std::string path = [[link substringFromIndex:7] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); std::string question = "Do you really want to delete " + path + "?"; if (YesNo(question.c_str())) { // delete specified file path = gollydir + path; RemoveFile(path); // save current location curroffset[algoindex] = htmlView.scrollView.contentOffset; [self showAlgoHelp]; } return NO; } if ([link hasPrefix:@"edit:"]) { std::string path = [[link substringFromIndex:5] cStringUsingEncoding:NSUTF8StringEncoding]; FixURLPath(path); // convert path to a full path if necessary std::string fullpath = path; if (path[0] != '/') { if (fullpath.find("Patterns/") == 0 || fullpath.find("Rules/") == 0) { // Patterns and Rules directories are inside app bundle so prepend gollydir/Golly.app/ fullpath = gollydir + "Golly.app/" + fullpath; } else { fullpath = gollydir + fullpath; } } // we pass self to ShowTextFile so it doesn't use current tab's view controller ShowTextFile(fullpath.c_str(), self); return NO; } } return YES; } @end // ============================================================================= std::string GetRuleName(const std::string& rule) { std::string result = ""; NSString* nsrule = [NSString stringWithCString:rule.c_str() encoding:NSUTF8StringEncoding]; for (int row = 0; row < UNNAMED_ROW; row++) { if ([nsrule isEqualToString:namedRules[row * 2 + 1]]) { result = [namedRules[row * 2] cStringUsingEncoding:NSUTF8StringEncoding]; break; } } return result; } golly-2.5-src/gui-ios/Golly/RuleViewController.xib0000644000175100001440000006112712156145314017176 00000000000000 1280 10K549 1938 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUIView IBProxyObject IBUILabel IBUIToolbar IBUIBarButtonItem IBUITextField IBUIWebView IBUIPickerView IBUIButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 301 293 {{303, 389}, {163, 21}} NO YES 7 NO IBIPadFramework Choose an algorithm: 1 MCAwIDAAA 1 10 1 1 17 Helvetica 17 16 293 {{303, 418}, {163, 31}} NO IBIPadFramework 0 0 1 Generations 3 MQA 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 3 MC41AA 2 15 Helvetica-Bold 15 16 293 {{330, 20}, {108, 21}} NO YES 7 NO IBIPadFramework Type in a rule: 1 10 1 293 {{173, 49}, {422, 31}} NO YES IBIPadFramework 0 B012345678/S012345678 3 3 MAA 2 1 YES 17 9 IBCocoaTouchFramework 3 2 17 Helvetica-Bold 17 16 293 {{312, 88}, {145, 21}} NO YES 7 NO IBIPadFramework UNKNOWN RULE! 1 MSAwLjA1OTcwMDA0ODE4IDAuMTE4Njg4NzQ0OQA 1 10 1 293 {{306, 117}, {156, 21}} NO YES 7 NO IBIPadFramework Pick a named rule: 1 10 1 293 {{173, 146}, {422, 216}} IBIPadFramework YES 266 {{0, 980}, {768, 44}} NO NO IBIPadFramework Cancel IBIPadFramework 1 IBIPadFramework 5 IBIPadFramework 1 0 279 {{-2, 457}, {773, 523}} 1 MSAxIDEAA IBIPadFramework 2 {768, 1024} 3 MC42NjY2NjY2NjY3AA IBIPadFramework ruleText 15 unknownLabel 16 rulePicker 21 algoButton 14 view 28 htmlView 36 changeAlgorithm: 7 17 delegate 18 delegate 20 dataSource 19 cancelRuleChange: 33 doRuleChange: 34 0 -1 File's Owner -2 12 9 11 8 10 7 5 6 29 30 31 32 35 RuleViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 36 RuleViewController UIViewController id id id cancelRuleChange: id changeAlgorithm: id doRuleChange: id UIButton UIWebView UIPickerView UITextField UILabel algoButton UIButton htmlView UIWebView rulePicker UIPickerView ruleText UITextField unknownLabel UILabel IBProjectSource ./Classes/RuleViewController.h 0 IBIPadFramework YES 3 933 golly-2.5-src/gui-ios/Golly/SaveViewController.h0000644000175100001440000000324712156145314016631 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import #import "InfoViewController.h" // This view controller creates a modal dialog that appears // when the user taps the Pattern tab's Save button. // It is also used (via SaveTextFile) to save a text file // when the user is editing a pattern file or .rule file. @interface SaveViewController : UIViewController { IBOutlet UITextField *nameText; IBOutlet UITableView *typeTable; IBOutlet UILabel *topLabel; IBOutlet UILabel *botLabel; } - (IBAction)doCancel:(id)sender; - (IBAction)doSave:(id)sender; @end // Ask user to save given text file currently being edited. void SaveTextFile(const char* filepath, const char* contents, InfoViewController* currentView); golly-2.5-src/gui-ios/Golly/SaveViewController.m0000644000175100001440000003250512156145314016635 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "writepattern.h" // for pattern_format, output_compression #include "utils.h" // for FileExists #include "prefs.h" // for datadir #include "layer.h" // for currlayer, etc #include "file.h" // for SavePattern, GetBaseName #import "SaveViewController.h" @implementation SaveViewController // ----------------------------------------------------------------------------- static NSString *filetypes[] = // data for typeTable { // WARNING: code below assumes this ordering @"Run Length Encoded (*.rle)", @"Compressed RLE (*.rle.gz)", @"Macrocell (*.mc)", @"Compressed MC (*.mc.gz)" }; const int NUM_TYPES = sizeof(filetypes) / sizeof(filetypes[0]); static int currtype = 0; // current index in typeTable static bool inSaveTextFile = false; // SaveTextFile was called? static const char* initpath; // path of file being edited static const char* filedata; // text to be saved static InfoViewController* callingVC; // the view controller that called SaveTextFile // ----------------------------------------------------------------------------- - (void)checkFileType { std::string filename = [[nameText text] cStringUsingEncoding:NSUTF8StringEncoding]; if (!filename.empty()) { // might need to change currtype to match an explicit extension int oldtype = currtype; size_t len = filename.length(); if (len >= 4 && len - 4 == filename.rfind(".rle")) { currtype = 0; } else if (len >= 7 && len - 7 == filename.rfind(".rle.gz")) { currtype = 1; } else if (len >= 3 && len - 3 == filename.rfind(".mc")) { currtype = 2; } else if (len >= 6 && len - 6 == filename.rfind(".mc.gz")) { currtype = 3; } else { // extension is unknown or not supplied, so append appropriate extension size_t dotpos = filename.find('.'); if (currtype == 0) filename = filename.substr(0,dotpos) + ".rle"; if (currtype == 1) filename = filename.substr(0,dotpos) + ".rle.gz"; if (currtype == 2) filename = filename.substr(0,dotpos) + ".mc"; if (currtype == 3) filename = filename.substr(0,dotpos) + ".mc.gz"; [nameText setText:[NSString stringWithCString:filename.c_str() encoding:NSUTF8StringEncoding]]; } if (currtype != oldtype) { [typeTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:currtype inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone]; } } } // ----------------------------------------------------------------------------- - (void)checkFileName { std::string filename = [[nameText text] cStringUsingEncoding:NSUTF8StringEncoding]; if (!filename.empty()) { // might need to change filename to match currtype size_t dotpos = filename.find('.'); std::string ext = (dotpos == std::string::npos) ? "" : filename.substr(dotpos); if (currtype == 0 && ext != ".rle") filename = filename.substr(0,dotpos) + ".rle"; if (currtype == 1 && ext != ".rle.gz") filename = filename.substr(0,dotpos) + ".rle.gz"; if (currtype == 2 && ext != ".mc") filename = filename.substr(0,dotpos) + ".mc"; if (currtype == 3 && ext != ".mc.gz") filename = filename.substr(0,dotpos) + ".mc.gz"; [nameText setText:[NSString stringWithCString:filename.c_str() encoding:NSUTF8StringEncoding]]; } } // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Save"; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release all outlets nameText = nil; typeTable = nil; topLabel = nil; botLabel = nil; } // ----------------------------------------------------------------------------- - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; if (inSaveTextFile) { // user is saving a pattern (in Documents/Saved or Documents/Downloads) // or a .rule file (in Documents/Rules) std::string filename = GetBaseName(initpath); [nameText setText:[NSString stringWithCString:filename.c_str() encoding:NSUTF8StringEncoding]]; typeTable.hidden = YES; // change labels [topLabel setText:@"Save file as:"]; std::string filepath = initpath; if (filepath.find("Documents/Rules/") != std::string::npos) { [botLabel setText:@"File location: Documents/Rules/"]; } else if (filepath.find("Documents/Downloads/") != std::string::npos) { [botLabel setText:@"File location: Documents/Downloads/"]; } else { [botLabel setText:@"File location: Documents/Saved/"]; } } else { // user is saving current pattern via Pattern tab's Save button // [nameText setText:[NSString stringWithCString:currlayer->currname.c_str() encoding:NSUTF8StringEncoding]]; // probably nicer not to show current name [nameText setText:@""]; // init file type if (currlayer->algo->hyperCapable()) { // RLE is allowed but macrocell format is better if (currtype < 2) currtype = 2; } else { // algo doesn't support macrocell format if (currtype > 1) currtype = 0; } [typeTable selectRowAtIndexPath:[NSIndexPath indexPathForRow:currtype inSection:0] animated:NO scrollPosition:UITableViewScrollPositionNone]; [self checkFileName]; } // show keyboard immediately [nameText becomeFirstResponder]; } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; inSaveTextFile = false; } // ----------------------------------------------------------------------------- - (IBAction)doCancel:(id)sender { [self dismissModalViewControllerAnimated:YES]; } // ----------------------------------------------------------------------------- - (IBAction)doSave:(id)sender { // clear first responder if necessary (ie. remove keyboard) [self.view endEditing:YES]; std::string filename = [[nameText text] cStringUsingEncoding:NSUTF8StringEncoding]; if (filename.empty()) { // Warning("Please enter a file name."); // better to beep and show keyboard Beep(); [nameText becomeFirstResponder]; return; } const char* replace_query = "A file with that name already exists.\nDo you want to replace that file?"; if (inSaveTextFile) { // user is saving a text file (pattern or .rule file) std::string initname = GetBaseName(initpath); std::string dir = initpath; dir = dir.substr(0,dir.rfind('/')+1); // prevent Documents/Rules/* being saved as something other than a .rule file if (EndsWith(dir,"Documents/Rules/") && !EndsWith(filename,".rule")) { Warning("Files in Documents/Rules/ must have a .rule extension."); [nameText becomeFirstResponder]; return; } std::string fullpath = dir + filename; if (initname != filename && FileExists(fullpath)) { // ask user if it's ok to replace an existing file that's not the same as the given file if (!YesNo(replace_query)) return; } FILE* f = fopen(fullpath.c_str(), "w"); if (f) { if (fputs(filedata, f) == EOF) { fclose(f); Warning("Could not write to file!"); return; } } else { Warning("Could not create file!"); return; } fclose(f); [self dismissModalViewControllerAnimated:YES]; // tell caller that the save was a success [callingVC saveSucceded:fullpath.c_str()]; } else { // user is saving current pattern in Documents/Saved/ via Pattern tab's Save button std::string fullpath = datadir + filename; if (FileExists(fullpath)) { // ask user if it's ok to replace an existing file if (!YesNo(replace_query)) return; } // dismiss modal view first in case SavePattern calls BeginProgress [self dismissModalViewControllerAnimated:YES]; pattern_format format = currtype < 2 ? XRLE_format : MC_format; output_compression compression = currtype % 2 == 0 ? no_compression : gzip_compression; SavePattern(fullpath, format, compression); } } // ----------------------------------------------------------------------------- // UITextFieldDelegate methods: - (void)textFieldDidEndEditing:(UITextField *)tf { // called when rule editing has ended (ie. keyboard disappears) if (!inSaveTextFile) [self checkFileType]; } - (BOOL)textFieldShouldReturn:(UITextField *)tf { // called when user hits Done button, so remove keyboard // (note that textFieldDidEndEditing will then be called) [tf resignFirstResponder]; return YES; } - (BOOL)disablesAutomaticKeyboardDismissal { // this allows keyboard to be dismissed if modal view uses UIModalPresentationFormSheet return NO; } // ----------------------------------------------------------------------------- // UITableViewDelegate and UITableViewDataSource methods: - (NSInteger)numberOfSectionsInTableView:(UITableView *)TableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)component { if (!currlayer->algo->hyperCapable()) { // algo doesn't support macrocell format return 2; } else { return NUM_TYPES; } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // check for a reusable cell first and use that if it exists UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; // if there is no reusable cell of this type, create a new one if (!cell) cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; [[cell textLabel] setText:filetypes[[indexPath row]]]; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // change selected file type int newtype = [indexPath row]; if (newtype < 0 || newtype >= NUM_TYPES) { Warning("Bug: unexpected row!"); } else { currtype = newtype; [self checkFileName]; } } @end // ============================================================================= void SaveTextFile(const char* filepath, const char* contents, InfoViewController* currentView) { inSaveTextFile = true; initpath = filepath; filedata = contents; callingVC = currentView; SaveViewController *modalSaveController = [[SaveViewController alloc] initWithNibName:nil bundle:nil]; [modalSaveController setModalPresentationStyle:UIModalPresentationFormSheet]; [currentView presentModalViewController:modalSaveController animated:YES]; modalSaveController = nil; // cannot reset inSaveTextFile here (it must be done in viewWillDisappear) // because doSave: is called AFTER SaveTextFile finishes } golly-2.5-src/gui-ios/Golly/SaveViewController.xib0000644000175100001440000004763612156145314017176 00000000000000 1280 10K549 1938 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBProxyObject IBUIBarButtonItem IBUILabel IBUIToolbar IBUITextField IBUITableView IBUIView com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 292 292 292 {{179, 83}, {183, 21}} NO YES 7 NO IBIPadFramework Save current pattern as: 1 MCAwIDAAA 1 10 1 1 17 Helvetica 17 16 292 {{40, 112}, {460, 31}} NO YES IBIPadFramework 0 3 Enter a file name 3 MAA 2 1 YES 17 9 IBCocoaTouchFramework 1 2 18 Helvetica-Bold 18 16 292 {{106, 175}, {328, 21}} NO YES 7 NO IBIPadFramework File type: 1 10 1 292 {{106, 204}, {328, 160}} 3 MQA YES IBIPadFramework YES NO 1 0 YES 40 22 22 266 {540, 44} NO NO IBIPadFramework IBIPadFramework 1 1 IBIPadFramework 5 IBIPadFramework 1 3 {540, 556} 3 MC42NjY2NjY2NjY3AA IBIPadFramework {{0, 20}, {768, 1004}} NO 2 IBIPadFramework view 3 nameText 15 typeTable 16 topLabel 20 botLabel 21 doCancel: 13 doSave: 14 delegate 19 dataSource 17 delegate 18 0 -1 File's Owner -2 2 4 9 10 11 12 5 8 7 6 SaveViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 21 SaveViewController UIViewController id id doCancel: id doSave: id UILabel UITextField UILabel UITableView botLabel UILabel nameText UITextField topLabel UILabel typeTable UITableView IBProjectSource ./Classes/SaveViewController.h 0 IBIPadFramework YES 3 933 golly-2.5-src/gui-ios/Golly/select.h0000644000175100001440000001520612156145314014311 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _SELECT_H_ #define _SELECT_H_ #include "bigint.h" // for bigint #include "lifealgo.h" // for lifealgo #include "utils.h" // for gRect // Most editing functions operate on the current selection. // The Selection class encapsulates all selection-related operations. class Selection { public: Selection(); Selection(int t, int l, int b, int r); ~Selection(); bool operator==(const Selection& sel) const; bool operator!=(const Selection& sel) const; bool Exists(); // return true if the selection exists void Deselect(); // remove the selection bool TooBig(); // return true if any selection edge is outside the editable limits void DisplaySize(); // display the selection's size in the status bar void SetRect(int x, int y, int wd, int ht); // set the selection to the given rectangle void GetRect(int* x, int* y, int* wd, int* ht); // return the selection rectangle void SetEdges(bigint& t, bigint& l, bigint& b, bigint& r); // set the selection using the given rectangle edges void CheckGridEdges(); // change selection edges if necessary to ensure they are inside a bounded grid bool Contains(bigint& t, bigint& l, bigint& b, bigint& r); // return true if the selection encloses the given rectangle bool Outside(bigint& t, bigint& l, bigint& b, bigint& r); // return true if the selection is completely outside the given rectangle bool ContainsCell(int x, int y); // return true if the given cell is within the selection void Advance(); // advance the pattern inside the selection by one generation void AdvanceOutside(); // advance the pattern outside the selection by one generation void Modify(const int x, const int y, bigint& anchorx, bigint& anchory, bool* forceh, bool* forcev); // modify the existing selection based on where the user tapped (inside) void Move(const bigint& xcells, const bigint& ycells); // move the selection by the given number of cells void SetLeftRight(const bigint& x, const bigint& anchorx); // set the selection's left and right edges void SetTopBottom(const bigint& y, const bigint& anchory); // set the selection's top and bottom edges void Fit(); // fit the selection inside the current viewport void Shrink(bool fit); // shrink the selection so it just encloses all the live cells // and optionally fit the new selection inside the current viewport bool Visible(gRect* visrect); // return true if the selection is visible in the current viewport // and, if visrect is not NULL, set it to the visible rectangle void Clear(); // kill all cells inside the selection void ClearOutside(); // kill all cells outside the selection void CopyToClipboard(bool cut); // copy the selection to the clipboard (using RLE format) and // optionally clear the selection if cut is true bool CanPaste(const bigint& wd, const bigint& ht, bigint& top, bigint& left); // return true if the selection fits inside a rectangle of size ht x wd; // if so then top and left are set to the selection's top left corner void RandomFill(); // randomly fill the selection bool Flip(bool topbottom, bool inundoredo); // return true if selection was successfully flipped bool Rotate(bool clockwise, bool inundoredo); // return true if selection was successfully rotated private: bool SaveOutside(bigint& t, bigint& l, bigint& b, bigint& r); // remember live cells outside the selection void EmptyUniverse(); // kill all cells by creating a new, empty universe void AddRun(int state, int multistate, unsigned int &run, unsigned int &linelen, char* &chptr); void AddEOL(char* &chptr); // these routines are used by CopyToClipboard to create RLE data bool SaveDifferences(lifealgo* oldalgo, lifealgo* newalgo, int itop, int ileft, int ibottom, int iright); // compare same rectangle in the given universes and remember the differences // in cell states; return false only if user aborts lengthy comparison bool FlipRect(bool topbottom, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int top, int left, int bottom, int right); // called by Flip to flip given rectangle from source universe to // destination universe and optionally kill cells in the source rectangle; // return false only if user aborts lengthy flip bool RotateRect(bool clockwise, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int itop, int ileft, int ibottom, int iright, int ntop, int nleft, int nbottom, int nright); // called by Rotate to rotate given rectangle from source universe to // destination universe and optionally kill cells in the source rectangle; // return false only if user aborts lengthy rotation bool RotatePattern(bool clockwise, bigint& newtop, bigint& newbottom, bigint& newleft, bigint& newright, bool inundoredo); // called by Rotate when the selection encloses the entire pattern; // return false only if user aborts lengthy rotation bigint seltop, selleft, selbottom, selright; // currently we only support a single rectangular selection // which is represented by these edges; eventually we might // support arbitrarily complex selection shapes by maintaining // a list or dynamic array of non-overlapping rectangles bool exists; // does the selection exist? }; #endif golly-2.5-src/gui-ios/Golly/select.m0000644000175100001440000021005512156145314014315 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "bigint.h" #include "lifealgo.h" #include "viewport.h" #include "utils.h" // for Warning, PollerReset, etc #include "prefs.h" // for randomfill, etc #include "status.h" // for Stringify, etc #include "undo.h" // for currlayer->undoredo->... #include "algos.h" // for *_ALGO, CreateNewUniverse #include "layer.h" // for currlayer, MarkLayerDirty, etc #include "view.h" // for OutsideLimits, etc #include "control.h" // for generating, etc #include "file.h" // for CreateUniverse #include "select.h" #import "PatternViewController.h" // for BeginProgress, etc // ----------------------------------------------------------------------------- Selection::Selection() { exists = false; } // ----------------------------------------------------------------------------- Selection::Selection(int t, int l, int b, int r) { // create rectangular selection if given edges are valid exists = (t <= b && l <= r); if (exists) { seltop = t; selleft = l; selbottom = b; selright = r; } } // ----------------------------------------------------------------------------- Selection::~Selection() { // no need to do anything at the moment } // ----------------------------------------------------------------------------- bool Selection::operator==(const Selection& s) const { if (!exists && !s.exists) { // neither selection exists return true; } else if (exists && s.exists) { // check if edges match return (seltop == s.seltop && selleft == s.selleft && selbottom == s.selbottom && selright == s.selright); } else { // one selection exists but not the other return false; } } // ----------------------------------------------------------------------------- bool Selection::operator!=(const Selection& s) const { return !(*this == s); } // ----------------------------------------------------------------------------- bool Selection::Exists() { return exists; } // ----------------------------------------------------------------------------- void Selection::Deselect() { exists = false; } // ----------------------------------------------------------------------------- bool Selection::TooBig() { return OutsideLimits(seltop, selleft, selbottom, selright); } // ----------------------------------------------------------------------------- void Selection::DisplaySize() { bigint wd = selright; wd -= selleft; wd += bigint::one; bigint ht = selbottom; ht -= seltop; ht += bigint::one; std::string msg = "Selection width x height = "; msg += Stringify(wd); msg += " x "; msg += Stringify(ht); SetMessage(msg.c_str()); } // ----------------------------------------------------------------------------- void Selection::SetRect(int x, int y, int wd, int ht) { exists = (wd > 0 && ht > 0); if (exists) { seltop = y; selleft = x; // avoid int overflow ht--; wd--; selbottom = y; selbottom += ht; selright = x; selright += wd; } } // ----------------------------------------------------------------------------- void Selection::GetRect(int* x, int* y, int* wd, int* ht) { *x = selleft.toint(); *y = seltop.toint(); *wd = selright.toint() - *x + 1; *ht = selbottom.toint() - *y + 1; } // ----------------------------------------------------------------------------- void Selection::SetEdges(bigint& t, bigint& l, bigint& b, bigint& r) { exists = true; seltop = t; selleft = l; selbottom = b; selright = r; CheckGridEdges(); } // ----------------------------------------------------------------------------- void Selection::CheckGridEdges() { if (exists) { // change selection edges if necessary to ensure they are inside a bounded grid if (currlayer->algo->gridwd > 0) { if (selleft > currlayer->algo->gridright || selright < currlayer->algo->gridleft) { exists = false; // selection is outside grid return; } if (selleft < currlayer->algo->gridleft) selleft = currlayer->algo->gridleft; if (selright > currlayer->algo->gridright) selright = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (seltop > currlayer->algo->gridbottom || selbottom < currlayer->algo->gridtop) { exists = false; // selection is outside grid return; } if (seltop < currlayer->algo->gridtop) seltop = currlayer->algo->gridtop; if (selbottom > currlayer->algo->gridbottom) selbottom = currlayer->algo->gridbottom; } } } // ----------------------------------------------------------------------------- bool Selection::Contains(bigint& t, bigint& l, bigint& b, bigint& r) { return ( seltop <= t && selleft <= l && selbottom >= b && selright >= r ); } // ----------------------------------------------------------------------------- bool Selection::Outside(bigint& t, bigint& l, bigint& b, bigint& r) { return ( seltop > b || selleft > r || selbottom < t || selright < l ); } // ----------------------------------------------------------------------------- bool Selection::ContainsCell(int x, int y) { return ( x >= selleft.toint() && x <= selright.toint() && y >= seltop.toint() && y <= selbottom.toint() ); } // ----------------------------------------------------------------------------- bool Selection::SaveDifferences(lifealgo* oldalgo, lifealgo* newalgo, int itop, int ileft, int ibottom, int iright) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; // compare patterns in given algos and call SaveCellChange for each different cell BeginProgress("Saving cell changes"); for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int oldstate = oldalgo->getcell(cx, cy); int newstate = newalgo->getcell(cx, cy); if ( oldstate != newstate ) { // assume this is only called if allowundo currlayer->undoredo->SaveCellChange(cx, cy, oldstate, newstate); } cntr++; if ((cntr % 4096) == 0) { abort = AbortProgress((double)cntr / maxcount, ""); if (abort) break; } } if (abort) break; } EndProgress(); return !abort; } // ----------------------------------------------------------------------------- void Selection::Advance() { if (generating) return; if (!exists) { ErrorMessage(no_selection); return; } if (currlayer->algo->isEmpty()) { ErrorMessage(empty_selection); return; } bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); // check if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { ErrorMessage(empty_selection); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); bool boundedgrid = (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0); // check if selection encloses entire pattern; // can't do this if qlife because it uses gen parity to decide which bits to draw; // also avoid this if undo/redo is enabled (too messy to remember cell changes) if ( currlayer->algtype != QLIFE_ALGO && !savecells && Contains(top, left, bottom, right) ) { generating = true; PollerReset(); // step by one gen without changing gen count bigint savegen = currlayer->algo->getGeneration(); bigint saveinc = currlayer->algo->getIncrement(); currlayer->algo->setIncrement(1); if (boundedgrid) CreateBorderCells(currlayer->algo); currlayer->algo->step(); if (boundedgrid) DeleteBorderCells(currlayer->algo); currlayer->algo->setIncrement(saveinc); currlayer->algo->setGeneration(savegen); generating = false; // clear 1-cell thick strips just outside selection ClearOutside(); MarkLayerDirty(); UpdateEverything(); return; } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // check that intersection is within setcell/getcell limits if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage(selection_too_big); return; } // create a temporary universe of same type as current universe lifealgo* tempalgo = CreateNewUniverse(currlayer->algtype); if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); // copy live cells in selection to temporary universe if ( !CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, tempalgo, false, "Saving selection") ) { delete tempalgo; return; } if ( tempalgo->isEmpty() ) { ErrorMessage(empty_selection); delete tempalgo; return; } // advance temporary universe by one gen generating = true; PollerReset(); tempalgo->setIncrement(1); if (boundedgrid) CreateBorderCells(tempalgo); tempalgo->step(); if (boundedgrid) DeleteBorderCells(tempalgo); generating = false; if ( !tempalgo->isEmpty() ) { // temporary pattern might have expanded bigint temptop, templeft, tempbottom, tempright; tempalgo->findedges(&temptop, &templeft, &tempbottom, &tempright); if (temptop < top) top = temptop; if (templeft < left) left = templeft; if (tempbottom > bottom) bottom = tempbottom; if (tempright > right) right = tempright; // but ignore live cells created outside selection edges if (top < seltop) top = seltop; if (left < selleft) left = selleft; if (bottom > selbottom) bottom = selbottom; if (right > selright) right = selright; } if (savecells) { // compare selection rect in currlayer->algo and tempalgo and call SaveCellChange // for each cell that has a different state if ( SaveDifferences(currlayer->algo, tempalgo, top.toint(), left.toint(), bottom.toint(), right.toint()) ) { if ( !currlayer->undoredo->RememberCellChanges("Advance Selection", currlayer->dirty) ) { // pattern inside selection didn't change delete tempalgo; return; } } else { currlayer->undoredo->ForgetCellChanges(); delete tempalgo; return; } } // copy all cells in new selection from tempalgo to currlayer->algo CopyAllRect(top.toint(), left.toint(), bottom.toint(), right.toint(), tempalgo, currlayer->algo, "Copying advanced selection"); delete tempalgo; MarkLayerDirty(); UpdateEverything(); } // ----------------------------------------------------------------------------- void Selection::AdvanceOutside() { if (generating) return; if (!exists) { ErrorMessage(no_selection); return; } if (currlayer->algo->isEmpty()) { ErrorMessage(empty_outside); return; } bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); // check if selection encloses entire pattern if (Contains(top, left, bottom, right)) { ErrorMessage(empty_outside); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); bool boundedgrid = (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0); // check if selection is completely outside pattern edges; // can't do this if qlife because it uses gen parity to decide which bits to draw; // also avoid this if undo/redo is enabled (too messy to remember cell changes) if ( currlayer->algtype != QLIFE_ALGO && !savecells && Outside(top, left, bottom, right) ) { generating = true; PollerReset(); // step by one gen without changing gen count bigint savegen = currlayer->algo->getGeneration(); bigint saveinc = currlayer->algo->getIncrement(); currlayer->algo->setIncrement(1); if (boundedgrid) CreateBorderCells(currlayer->algo); currlayer->algo->step(); if (boundedgrid) DeleteBorderCells(currlayer->algo); currlayer->algo->setIncrement(saveinc); currlayer->algo->setGeneration(savegen); generating = false; // clear selection in case pattern expanded into it Clear(); MarkLayerDirty(); UpdateEverything(); return; } // check that pattern is within setcell/getcell limits if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pattern is outside +/- 10^9 boundary."); return; } lifealgo* oldalgo = NULL; if (savecells) { // copy current pattern to oldalgo, using same type and gen count // so we can switch to oldalgo if user decides to abort below oldalgo = CreateNewUniverse(currlayer->algtype); if (oldalgo->setrule(currlayer->algo->getrule())) oldalgo->setrule(oldalgo->DefaultRule()); oldalgo->setGeneration( currlayer->algo->getGeneration() ); if ( !CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, oldalgo, false, "Saving pattern") ) { delete oldalgo; return; } } // create a new universe of same type lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); newalgo->setGeneration( currlayer->algo->getGeneration() ); // copy (and kill) live cells in selection to new universe int iseltop = seltop.toint(); int iselleft = selleft.toint(); int iselbottom = selbottom.toint(); int iselright = selright.toint(); if ( !CopyRect(iseltop, iselleft, iselbottom, iselright, currlayer->algo, newalgo, true, "Saving and erasing selection") ) { // aborted, so best to restore selection if ( !newalgo->isEmpty() ) { newalgo->findedges(&top, &left, &bottom, &right); CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), newalgo, currlayer->algo, false, "Restoring selection"); } delete newalgo; if (savecells) delete oldalgo; UpdateEverything(); return; } // advance current universe by 1 generation generating = true; PollerReset(); currlayer->algo->setIncrement(1); if (boundedgrid) CreateBorderCells(currlayer->algo); currlayer->algo->step(); if (boundedgrid) DeleteBorderCells(currlayer->algo); generating = false; if ( !currlayer->algo->isEmpty() ) { // find new edges and copy current pattern to new universe, // except for any cells that were created in selection // (newalgo contains the original selection) bigint t, l, b, r; currlayer->algo->findedges(&t, &l, &b, &r); int itop = t.toint(); int ileft = l.toint(); int ibottom = b.toint(); int iright = r.toint(); int ht = ibottom - itop + 1; int cx, cy; // for showing accurate progress we need to add pattern height to pop count // in case this is a huge pattern with many blank rows double maxcount = currlayer->algo->getPopulation().todouble() + ht; double accumcount = 0; int currcount = 0; int v = 0; bool abort = false; BeginProgress("Copying advanced pattern"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { currcount++; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip >= 0) { // found next live cell in this row cx += skip; // only copy cell if outside selection if ( cx < iselleft || cx > iselright || cy < iseltop || cy > iselbottom ) { newalgo->setcell(cx, cy, v); } currcount++; } else { cx = iright; // done this row } if (currcount > 1024) { accumcount += currcount; currcount = 0; abort = AbortProgress(accumcount / maxcount, ""); if (abort) break; } } if (abort) break; } newalgo->endofpattern(); EndProgress(); if (abort && savecells) { // revert back to pattern saved in oldalgo delete newalgo; delete currlayer->algo; currlayer->algo = oldalgo; SetGenIncrement(); UpdateEverything(); return; } } // switch to new universe (best to do this even if aborted) delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); if (savecells) { // compare patterns in oldalgo and currlayer->algo and call SaveCellChange // for each cell that has a different state; note that we need to compare // the union of the original pattern's rect and the new pattern's rect int otop = top.toint(); int oleft = left.toint(); int obottom = bottom.toint(); int oright = right.toint(); if (!currlayer->algo->isEmpty()) { currlayer->algo->findedges(&top, &left, &bottom, &right); int ntop = top.toint(); int nleft = left.toint(); int nbottom = bottom.toint(); int nright = right.toint(); if (ntop < otop) otop = ntop; if (nleft < oleft) oleft = nleft; if (nbottom > obottom) obottom = nbottom; if (nright > oright) oright = nright; } if ( SaveDifferences(oldalgo, currlayer->algo, otop, oleft, obottom, oright) ) { delete oldalgo; if ( !currlayer->undoredo->RememberCellChanges("Advance Outside", currlayer->dirty) ) { // pattern outside selection didn't change UpdateEverything(); return; } } else { // revert back to pattern saved in oldalgo currlayer->undoredo->ForgetCellChanges(); delete currlayer->algo; currlayer->algo = oldalgo; SetGenIncrement(); UpdateEverything(); return; } } MarkLayerDirty(); UpdateEverything(); } // ----------------------------------------------------------------------------- void Selection::Modify(const int x, const int y, bigint& anchorx, bigint& anchory, bool* forceh, bool* forcev) { // assume tapped point is somewhere inside selection pair lt = currlayer->view->screenPosOf(selleft, seltop, currlayer->algo); pair rb = currlayer->view->screenPosOf(selright, selbottom, currlayer->algo); if (currlayer->view->getmag() > 0) { // move rb to pixel at bottom right corner of cell rb.first += (1 << currlayer->view->getmag()) - 1; rb.second += (1 << currlayer->view->getmag()) - 1; if (currlayer->view->getmag() > 1) { // allow for gap at scale 1:4 and above rb.first--; rb.second--; } } double wd = rb.first - lt.first + 1; double ht = rb.second - lt.second + 1; double onefifthx = lt.first + wd / 5.0; double fourfifthx = lt.first + wd * 4.0 / 5.0; double onefifthy = lt.second + ht / 5.0; double fourfifthy = lt.second + ht * 4.0 / 5.0; if ( y < onefifthy && x < onefifthx ) { // tap is near top left corner anchory = selbottom; anchorx = selright; } else if ( y < onefifthy && x > fourfifthx ) { // tap is near top right corner anchory = selbottom; anchorx = selleft; } else if ( y > fourfifthy && x > fourfifthx ) { // tap is near bottom right corner anchory = seltop; anchorx = selleft; } else if ( y > fourfifthy && x < onefifthx ) { // tap is near bottom left corner anchory = seltop; anchorx = selright; } else if ( x < onefifthx ) { // tap is near left edge *forceh = true; anchorx = selright; } else if ( x > fourfifthx ) { // tap is near right edge *forceh = true; anchorx = selleft; } else if ( y < onefifthy ) { // tap is near top edge *forcev = true; anchory = selbottom; } else if ( y > fourfifthy ) { // tap is near bottom edge *forcev = true; anchory = seltop; } else { // tap is in middle area, so move selection rather than resize *forceh = true; *forcev = true; } } // ----------------------------------------------------------------------------- void Selection::Move(const bigint& xcells, const bigint& ycells) { if (exists) { selleft += xcells; selright += xcells; seltop += ycells; selbottom += ycells; CheckGridEdges(); } } // ----------------------------------------------------------------------------- void Selection::SetLeftRight(const bigint& x, const bigint& anchorx) { if (x <= anchorx) { selleft = x; selright = anchorx; } else { selleft = anchorx; selright = x; } exists = true; } // ----------------------------------------------------------------------------- void Selection::SetTopBottom(const bigint& y, const bigint& anchory) { if (y <= anchory) { seltop = y; selbottom = anchory; } else { seltop = anchory; selbottom = y; } exists = true; } // ----------------------------------------------------------------------------- void Selection::Fit() { bigint newx = selright; newx -= selleft; newx += bigint::one; newx.div2(); newx += selleft; bigint newy = selbottom; newy -= seltop; newy += bigint::one; newy.div2(); newy += seltop; int mag = MAX_MAG; while (true) { currlayer->view->setpositionmag(newx, newy, mag); if ( currlayer->view->contains(selleft, seltop) && currlayer->view->contains(selright, selbottom) ) break; mag--; } } // ----------------------------------------------------------------------------- void Selection::Shrink(bool fit) { if (!exists) return; // check if there is no pattern if (currlayer->algo->isEmpty()) { ErrorMessage(empty_selection); if (fit) FitSelection(); return; } // check if selection encloses entire pattern bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if (Contains(top, left, bottom, right)) { // shrink edges SaveCurrentSelection(); seltop = top; selleft = left; selbottom = bottom; selright = right; RememberNewSelection("Shrink Selection"); DisplaySelectionSize(); if (fit) FitSelection(); // calls UpdateEverything else UpdatePatternAndStatus(); return; } // check if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { ErrorMessage(empty_selection); if (fit) FitSelection(); return; } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // check that selection is small enough to save if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage(selection_too_big); if (fit) FitSelection(); return; } // the easy way to shrink selection is to create a new temporary universe, // copy selection into new universe and then call findedges; // if only 2 cell states then use qlife because its findedges call is faster lifealgo* tempalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure temporary universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); // copy live cells in selection to temporary universe if ( CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, tempalgo, false, "Copying selection") ) { if ( tempalgo->isEmpty() ) { ErrorMessage(empty_selection); } else { SaveCurrentSelection(); tempalgo->findedges(&seltop, &selleft, &selbottom, &selright); RememberNewSelection("Shrink Selection"); DisplaySelectionSize(); if (!fit) UpdatePatternAndStatus(); } } delete tempalgo; if (fit) FitSelection(); } // ----------------------------------------------------------------------------- bool Selection::Visible(gRect* visrect) { if (!exists) return false; pair lt = currlayer->view->screenPosOf(selleft, seltop, currlayer->algo); pair rb = currlayer->view->screenPosOf(selright, selbottom, currlayer->algo); if (lt.first > currlayer->view->getxmax() || rb.first < 0 || lt.second > currlayer->view->getymax() || rb.second < 0) { // no part of selection is visible return false; } // all or some of selection is visible in viewport; // only set visible rectangle if requested if (visrect) { // first we must clip coords to viewport if (lt.first < 0) lt.first = 0; if (lt.second < 0) lt.second = 0; if (rb.first > currlayer->view->getxmax()) rb.first = currlayer->view->getxmax(); if (rb.second > currlayer->view->getymax()) rb.second = currlayer->view->getymax(); if (currlayer->view->getmag() > 0) { // move rb to pixel at bottom right corner of cell rb.first += (1 << currlayer->view->getmag()) - 1; rb.second += (1 << currlayer->view->getmag()) - 1; if (currlayer->view->getmag() > 1) { // avoid covering gaps at scale 1:4 and above rb.first--; rb.second--; } // clip to viewport again if (rb.first > currlayer->view->getxmax()) rb.first = currlayer->view->getxmax(); if (rb.second > currlayer->view->getymax()) rb.second = currlayer->view->getymax(); } visrect->x = lt.first; visrect->y = lt.second; visrect->width = rb.first - lt.first + 1; visrect->height = rb.second - lt.second + 1; } return true; } // ----------------------------------------------------------------------------- void Selection::EmptyUniverse() { // save current step, scale, position and gen count int savebase = currlayer->currbase; int saveexpo = currlayer->currexpo; int savemag = currlayer->view->getmag(); bigint savex = currlayer->view->x; bigint savey = currlayer->view->y; bigint savegen = currlayer->algo->getGeneration(); // kill all live cells by replacing the current universe with a // new, empty universe which also uses the same rule CreateUniverse(); // restore step, scale, position and gen count currlayer->currbase = savebase; SetStepExponent(saveexpo); // SetStepExponent calls SetGenIncrement currlayer->view->setpositionmag(savex, savey, savemag); currlayer->algo->setGeneration(savegen); UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- void Selection::Clear() { if (!exists) return; // no need to do anything if there is no pattern if (currlayer->algo->isEmpty()) return; // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( !savecells && Contains(top, left, bottom, right) ) { // selection encloses entire pattern so just create empty universe EmptyUniverse(); MarkLayerDirty(); return; } // no need to do anything if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { return; } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // can only use setcell in limited domain if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage(selection_too_big); return; } // clear all live cells in selection int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; int v = 0; bool abort = false; bool selchanged = false; BeginProgress("Clearing selection"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; curralgo->setcell(cx, cy, 0); selchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } } if (abort) break; } if (selchanged) curralgo->endofpattern(); EndProgress(); if (selchanged) { if (savecells) currlayer->undoredo->RememberCellChanges("Clear", currlayer->dirty); MarkLayerDirty(); UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- bool Selection::SaveOutside(bigint& t, bigint& l, bigint& b, bigint& r) { if ( OutsideLimits(t, l, b, r) ) { ErrorMessage(pattern_too_big); return false; } int itop = t.toint(); int ileft = l.toint(); int ibottom = b.toint(); int iright = r.toint(); // save ALL cells if selection is completely outside pattern edges bool saveall = Outside(t, l, b, r); // integer selection edges must not be outside pattern edges int stop = itop; int sleft = ileft; int sbottom = ibottom; int sright = iright; if (!saveall) { if (seltop > t) stop = seltop.toint(); if (selleft > l) sleft = selleft.toint(); if (selbottom < b) sbottom = selbottom.toint(); if (selright < r) sright = selright.toint(); } int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; int v = 0; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; BeginProgress("Saving outside selection"); lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; if (saveall || cx < sleft || cx > sright || cy < stop || cy > sbottom) { // cell is outside selection edges currlayer->undoredo->SaveCellChange(cx, cy, v, 0); } } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } } if (abort) break; } EndProgress(); if (abort) currlayer->undoredo->ForgetCellChanges(); return !abort; } // ----------------------------------------------------------------------------- void Selection::ClearOutside() { if (!exists) return; // no need to do anything if there is no pattern if (currlayer->algo->isEmpty()) return; // no need to do anything if selection encloses entire pattern bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if (Contains(top, left, bottom, right)) { return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); if (savecells) { // save live cells outside selection if ( !SaveOutside(top, left, bottom, right) ) { return; } } else { // create empty universe if selection is completely outside pattern edges if (Outside(top, left, bottom, right)) { EmptyUniverse(); MarkLayerDirty(); return; } } // find intersection of selection and pattern to minimize work if (seltop > top) top = seltop; if (selleft > left) left = selleft; if (selbottom < bottom) bottom = selbottom; if (selright < right) right = selright; // check that selection is small enough to save if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage(selection_too_big); return; } // create a new universe of same type lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); // set same gen count newalgo->setGeneration( currlayer->algo->getGeneration() ); // copy live cells in selection to new universe if ( CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), currlayer->algo, newalgo, false, "Saving selection") ) { // delete old universe and point currlayer->algo at new universe delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); if (savecells) currlayer->undoredo->RememberCellChanges("Clear Outside", currlayer->dirty); MarkLayerDirty(); UpdatePatternAndStatus(); } else { // CopyRect was aborted, so don't change current universe delete newalgo; if (savecells) currlayer->undoredo->ForgetCellChanges(); } } // ----------------------------------------------------------------------------- void Selection::AddEOL(char* &chptr) { // use LF on Mac *chptr = '\n'; chptr += 1; } // ----------------------------------------------------------------------------- const int WRLE_NONE = -3; const int WRLE_EOP = -2; const int WRLE_NEWLINE = -1; void Selection::AddRun(int state, // in: state of cell to write int multistate, // true if #cell states > 2 unsigned int &run, // in and out unsigned int &linelen, // ditto char* &chptr) // ditto { // output of RLE pattern data is channelled thru here to make it easier to // ensure all lines have <= maxrleline characters const unsigned int maxrleline = 70; unsigned int i, numlen; char numstr[32]; if ( run > 1 ) { sprintf(numstr, "%u", run); numlen = strlen(numstr); } else { numlen = 0; // no run count shown if 1 } // keep linelen <= maxrleline if ( linelen + numlen + 1 + multistate > maxrleline ) { AddEOL(chptr); linelen = 0; } i = 0; while (i < numlen) { *chptr = numstr[i]; chptr += 1; i++; } if (multistate) { if (state <= 0) *chptr = ".$!"[-state]; else { if (state > 24) { int hi = (state - 25) / 24; *chptr = hi + 'p'; chptr += 1; linelen += 1; state -= (hi + 1) * 24; } *chptr = 'A' + state - 1; } } else *chptr = "!$bo"[state+2]; chptr += 1; linelen += numlen + 1; run = 0; // reset run count } // ----------------------------------------------------------------------------- void Selection::CopyToClipboard(bool cut) { // can only use getcell/setcell in limited domain if (TooBig()) { ErrorMessage(selection_too_big); return; } int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); unsigned int wd = iright - ileft + 1; unsigned int ht = ibottom - itop + 1; // convert cells in selection to RLE data in textptr char* textptr; char* etextptr; int cursize = 4096; textptr = (char*)malloc(cursize); if (textptr == NULL) { ErrorMessage("Not enough memory for clipboard data!"); return; } etextptr = textptr + cursize; // add RLE header line sprintf(textptr, "x = %u, y = %u, rule = %s", wd, ht, currlayer->algo->getrule()); char* chptr = textptr; chptr += strlen(textptr); AddEOL(chptr); // save start of data in case livecount is zero int datastart = chptr - textptr; // add RLE pattern data unsigned int livecount = 0; unsigned int linelen = 0; unsigned int brun = 0; unsigned int orun = 0; unsigned int dollrun = 0; int laststate; int cx, cy; int v = 0; // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; if (cut) BeginProgress("Cutting selection"); else BeginProgress("Copying selection"); lifealgo* curralgo = currlayer->algo; int multistate = curralgo->NumCellStates() > 2; for ( cy=itop; cy<=ibottom; cy++ ) { laststate = WRLE_NONE; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip > 0) { // have exactly "skip" empty cells here if (laststate == 0) { brun += skip; } else { if (orun > 0) { // output current run of live cells AddRun(laststate, multistate, orun, linelen, chptr); } laststate = 0; brun = skip; } } if (skip >= 0) { // found next live cell cx += skip; livecount++; if (cut) { curralgo->setcell(cx, cy, 0); if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, v, 0); } if (laststate == v) { orun++; } else { if (dollrun > 0) // output current run of $ chars AddRun(WRLE_NEWLINE, multistate, dollrun, linelen, chptr); if (brun > 0) // output current run of dead cells AddRun(0, multistate, brun, linelen, chptr); if (orun > 0) // output current run of other live cells AddRun(laststate, multistate, orun, linelen, chptr); laststate = v; orun = 1; } } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } if (chptr + 60 >= etextptr) { // nearly out of space; try to increase allocation char* ntxtptr = (char*) realloc(textptr, 2*cursize); if (ntxtptr == 0) { ErrorMessage("No more memory for clipboard data!"); // don't return here -- best to set abort flag and break so that // partially cut/copied portion gets saved to clipboard abort = true; break; } chptr = ntxtptr + (chptr - textptr); cursize *= 2; etextptr = ntxtptr + cursize; textptr = ntxtptr; } } if (abort) break; // end of current row if (laststate == 0) // forget dead cells at end of row brun = 0; else if (laststate >= 0) // output current run of live cells AddRun(laststate, multistate, orun, linelen, chptr); dollrun++; } if (livecount == 0) { // no live cells in selection so simplify RLE data to "!" chptr = textptr + datastart; *chptr = '!'; chptr++; } else { // terminate RLE data dollrun = 1; AddRun(WRLE_EOP, multistate, dollrun, linelen, chptr); if (cut) currlayer->algo->endofpattern(); } AddEOL(chptr); *chptr = 0; EndProgress(); if (cut && livecount > 0) { if (savecells) currlayer->undoredo->RememberCellChanges("Cut", currlayer->dirty); // update currlayer->dirty AFTER RememberCellChanges MarkLayerDirty(); UpdatePatternAndStatus(); } CopyTextToClipboard(textptr); free(textptr); } // ----------------------------------------------------------------------------- bool Selection::CanPaste(const bigint& wd, const bigint& ht, bigint& top, bigint& left) { bigint selht = selbottom; selht -= seltop; selht += 1; bigint selwd = selright; selwd -= selleft; selwd += 1; if ( ht > selht || wd > selwd ) return false; // set paste rectangle's top left cell coord top = seltop; left = selleft; return true; } // ----------------------------------------------------------------------------- void Selection::RandomFill() { if (!exists) return; // can only use getcell/setcell in limited domain if (TooBig()) { ErrorMessage(selection_too_big); return; } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); // no need to kill cells if selection is empty bool killcells = !currlayer->algo->isEmpty(); if ( killcells ) { // find pattern edges and compare with selection edges bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if (Contains(top, left, bottom, right)) { // selection encloses entire pattern so create empty universe if (savecells) { // don't kill pattern otherwise we can't use SaveCellChange below } else { EmptyUniverse(); killcells = false; } } else if (Outside(top, left, bottom, right)) { // selection is completely outside pattern edges killcells = false; } } int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; BeginProgress("Randomly filling selection"); int cx, cy; lifealgo* curralgo = currlayer->algo; int livestates = curralgo->NumCellStates() - 1; // don't count dead state for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { // randomfill is from 1..100 if (savecells) { // remember cell change only if state changes int oldstate = curralgo->getcell(cx, cy); if ((rand() % 100) < randomfill) { int newstate = livestates < 2 ? 1 : 1 + (rand() % livestates); if (oldstate != newstate) { curralgo->setcell(cx, cy, newstate); currlayer->undoredo->SaveCellChange(cx, cy, oldstate, newstate); } } else if (killcells && oldstate > 0) { curralgo->setcell(cx, cy, 0); currlayer->undoredo->SaveCellChange(cx, cy, oldstate, 0); } } else { if ((rand() % 100) < randomfill) { if (livestates < 2) { curralgo->setcell(cx, cy, 1); } else { curralgo->setcell(cx, cy, 1 + (rand() % livestates)); } } else if (killcells) { curralgo->setcell(cx, cy, 0); } } cntr++; if ((cntr % 4096) == 0) { abort = AbortProgress((double)cntr / maxcount, ""); if (abort) break; } } if (abort) break; } currlayer->algo->endofpattern(); EndProgress(); if (savecells) currlayer->undoredo->RememberCellChanges("Random Fill", currlayer->dirty); // update currlayer->dirty AFTER RememberCellChanges MarkLayerDirty(); UpdatePatternAndStatus(); } // ----------------------------------------------------------------------------- bool Selection::FlipRect(bool topbottom, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int itop, int ileft, int ibottom, int iright) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; int v = 0; int cx, cy, newx, newy, newxinc, newyinc; if (topbottom) { BeginProgress("Flipping top-bottom"); newy = ibottom; newyinc = -1; newxinc = 1; } else { BeginProgress("Flipping left-right"); newy = itop; newyinc = 1; newxinc = -1; } for ( cy=itop; cy<=ibottom; cy++ ) { newx = topbottom ? ileft : iright; for ( cx=ileft; cx<=iright; cx++ ) { int skip = srcalgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; if (erasesrc) srcalgo->setcell(cx, cy, 0); newx += newxinc * skip; destalgo->setcell(newx, newy, v); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } newx += newxinc; } if (abort) break; newy += newyinc; } if (erasesrc) srcalgo->endofpattern(); destalgo->endofpattern(); EndProgress(); return !abort; } // ----------------------------------------------------------------------------- bool Selection::Flip(bool topbottom, bool inundoredo) { if (!exists) return false; if (topbottom) { if (seltop == selbottom) return true; } else { if (selleft == selright) return true; } if (currlayer->algo->isEmpty()) return true; bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); bigint stop = seltop; bigint sleft = selleft; bigint sbottom = selbottom; bigint sright = selright; bool simpleflip; if (Contains(top, left, bottom, right)) { // selection encloses entire pattern so we may only need to flip a smaller rectangle if (topbottom) { bigint tdiff = top; tdiff -= stop; bigint bdiff = sbottom; bdiff -= bottom; bigint mindiff = tdiff; if (bdiff < mindiff) mindiff = bdiff; stop += mindiff; sbottom -= mindiff; sleft = left; sright = right; } else { bigint ldiff = left; ldiff -= sleft; bigint rdiff = sright; rdiff -= right; bigint mindiff = ldiff; if (rdiff < mindiff) mindiff = rdiff; sleft += mindiff; sright -= mindiff; stop = top; sbottom = bottom; } simpleflip = true; } else { // selection encloses part of pattern so we can clip some selection edges // if they are outside the pattern edges if (topbottom) { if (sleft < left) sleft = left; if (sright > right) sright = right; } else { if (stop < top) stop = top; if (sbottom > bottom) sbottom = bottom; } simpleflip = false; } // can only use getcell/setcell in limited domain if ( OutsideLimits(stop, sbottom, sleft, sright) ) { ErrorMessage(selection_too_big); return false; } int itop = stop.toint(); int ileft = sleft.toint(); int ibottom = sbottom.toint(); int iright = sright.toint(); if (simpleflip) { // selection encloses all of pattern so we can flip into new universe // (must be same type) without killing live cells in selection lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); newalgo->setGeneration( currlayer->algo->getGeneration() ); if ( FlipRect(topbottom, currlayer->algo, newalgo, false, itop, ileft, ibottom, iright) ) { // switch to newalgo delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); } else { // user aborted flip delete newalgo; return false; } } else { // flip into temporary universe and kill all live cells in selection; // if only 2 cell states then use qlife because its setcell/getcell calls are faster lifealgo* tempalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure temporary universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); if ( FlipRect(topbottom, currlayer->algo, tempalgo, true, itop, ileft, ibottom, iright) ) { // find pattern edges in temporary universe (could be much smaller) // and copy temporary pattern into current universe tempalgo->findedges(&top, &left, &bottom, &right); CopyRect(top.toint(), left.toint(), bottom.toint(), right.toint(), tempalgo, currlayer->algo, false, "Adding flipped selection"); delete tempalgo; } else { // user aborted flip so flip tempalgo pattern back into current universe FlipRect(topbottom, tempalgo, currlayer->algo, false, itop, ileft, ibottom, iright); delete tempalgo; return false; } } // flips are always reversible so no need to use SaveCellChange and RememberCellChanges if (allowundo && !currlayer->stayclean && !inundoredo) { //!!! if (inscript) SavePendingChanges(); currlayer->undoredo->RememberFlip(topbottom, currlayer->dirty); } // update currlayer->dirty AFTER RememberFlip if (!inundoredo) MarkLayerDirty(); UpdatePatternAndStatus(); return true; } // ----------------------------------------------------------------------------- const char* rotate_clockwise = "Rotating selection +90 degrees"; const char* rotate_anticlockwise = "Rotating selection -90 degrees"; bool Selection::RotateRect(bool clockwise, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, int itop, int ileft, int ibottom, int iright, int ntop, int nleft, int nbottom, int nright) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; int cx, cy, newx, newy, newxinc, newyinc, v=0; if (clockwise) { BeginProgress(rotate_clockwise); newx = nright; newyinc = 1; newxinc = -1; } else { BeginProgress(rotate_anticlockwise); newx = nleft; newyinc = -1; newxinc = 1; } for ( cy=itop; cy<=ibottom; cy++ ) { newy = clockwise ? ntop : nbottom; for ( cx=ileft; cx<=iright; cx++ ) { int skip = srcalgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; if (erasesrc) srcalgo->setcell(cx, cy, 0); newy += newyinc * skip; destalgo->setcell(newx, newy, v); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } newy += newyinc; } if (abort) break; newx += newxinc; } if (erasesrc) srcalgo->endofpattern(); destalgo->endofpattern(); EndProgress(); return !abort; } // ----------------------------------------------------------------------------- bool Selection::RotatePattern(bool clockwise, bigint& newtop, bigint& newbottom, bigint& newleft, bigint& newright, bool inundoredo) { // create new universe of same type as current universe lifealgo* newalgo = CreateNewUniverse(currlayer->algtype); if (newalgo->setrule(currlayer->algo->getrule())) newalgo->setrule(newalgo->DefaultRule()); // set same gen count newalgo->setGeneration( currlayer->algo->getGeneration() ); // copy all live cells to new universe, rotating the coords by +/- 90 degrees int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; int cx, cy, newx, newy, newxinc, newyinc, firstnewy, v=0; if (clockwise) { BeginProgress(rotate_clockwise); firstnewy = newtop.toint(); newx = newright.toint(); newyinc = 1; newxinc = -1; } else { BeginProgress(rotate_anticlockwise); firstnewy = newbottom.toint(); newx = newleft.toint(); newyinc = -1; newxinc = 1; } lifealgo* curralgo = currlayer->algo; for ( cy=itop; cy<=ibottom; cy++ ) { newy = firstnewy; for ( cx=ileft; cx<=iright; cx++ ) { int skip = curralgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; newy += newyinc * skip; newalgo->setcell(newx, newy, v); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } newy += newyinc; } if (abort) break; newx += newxinc; } newalgo->endofpattern(); EndProgress(); if (abort) { delete newalgo; } else { // rotate the selection edges seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; // switch to new universe and display results delete currlayer->algo; currlayer->algo = newalgo; SetGenIncrement(); DisplaySelectionSize(); // rotating entire pattern is easily reversible so no need to use // SaveCellChange and RememberCellChanges in this case if (allowundo && !currlayer->stayclean && !inundoredo) { //!!! if (inscript) SavePendingChanges(); currlayer->undoredo->RememberRotation(clockwise, currlayer->dirty); } // update currlayer->dirty AFTER RememberRotation if (!inundoredo) MarkLayerDirty(); UpdatePatternAndStatus(); } return !abort; } // ----------------------------------------------------------------------------- bool Selection::Rotate(bool clockwise, bool inundoredo) { if (!exists) return false; // determine rotated selection edges bigint halfht = selbottom; halfht -= seltop; halfht.div2(); bigint halfwd = selright; halfwd -= selleft; halfwd.div2(); bigint midy = seltop; midy += halfht; bigint midx = selleft; midx += halfwd; bigint newtop = midy; newtop += selleft; newtop -= midx; bigint newbottom = midy; newbottom += selright; newbottom -= midx; bigint newleft = midx; newleft += seltop; newleft -= midy; bigint newright = midx; newright += selbottom; newright -= midy; if (!inundoredo) { // check if rotated selection edges are outside bounded grid if ( (currlayer->algo->gridwd > 0 && (newleft < currlayer->algo->gridleft || newright > currlayer->algo->gridright)) || (currlayer->algo->gridht > 0 && (newtop < currlayer->algo->gridtop || newbottom > currlayer->algo->gridbottom)) ) { ErrorMessage("New selection would be outside grid boundary."); return false; } } // if there is no pattern then just rotate the selection edges if (currlayer->algo->isEmpty()) { SaveCurrentSelection(); seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; RememberNewSelection("Rotation"); DisplaySelectionSize(); UpdatePatternAndStatus(); return true; } // if the current selection and the rotated selection are both outside the // pattern edges (ie. both are empty) then just rotate the selection edges bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( (seltop > bottom || selbottom < top || selleft > right || selright < left) && (newtop > bottom || newbottom < top || newleft > right || newright < left) ) { SaveCurrentSelection(); seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; RememberNewSelection("Rotation"); DisplaySelectionSize(); UpdatePatternAndStatus(); return true; } // can only use nextcell/getcell/setcell in limited domain if (TooBig()) { ErrorMessage(selection_too_big); return false; } // make sure rotated selection edges are also within limits if ( OutsideLimits(newtop, newbottom, newleft, newright) ) { ErrorMessage("New selection would be outside +/- 10^9 boundary."); return false; } // use faster method if selection encloses entire pattern if (Contains(top, left, bottom, right)) { return RotatePattern(clockwise, newtop, newbottom, newleft, newright, inundoredo); } int itop = seltop.toint(); int ileft = selleft.toint(); int ibottom = selbottom.toint(); int iright = selright.toint(); int ntop = newtop.toint(); int nleft = newleft.toint(); int nbottom = newbottom.toint(); int nright = newright.toint(); // save cell changes if undo/redo is enabled and script isn't constructing a pattern // and we're not undoing/redoing an earlier rotation bool savecells = allowundo && !currlayer->stayclean && !inundoredo; //!!! if (savecells && inscript) SavePendingChanges(); lifealgo* oldalgo = NULL; int otop = itop; int oleft = ileft; int obottom = ibottom; int oright = iright; if (savecells) { // copy current pattern to oldalgo using union of old and new selection rects if (otop > ntop) otop = ntop; if (oleft > nleft) oleft = nleft; if (obottom < nbottom) obottom = nbottom; if (oright < nright) oright = nright; oldalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (oldalgo->setrule(currlayer->algo->getrule())) oldalgo->setrule(oldalgo->DefaultRule()); if ( !CopyRect(otop, oleft, obottom, oright, currlayer->algo, oldalgo, false, "Saving part of pattern") ) { delete oldalgo; return false; } } // create temporary universe; doesn't need to match current universe so // if only 2 cell states then use qlife because its setcell/getcell calls are faster lifealgo* tempalgo = CreateNewUniverse(currlayer->algo->NumCellStates() > 2 ? currlayer->algtype : QLIFE_ALGO); // make sure temporary universe has same # of cell states if (currlayer->algo->NumCellStates() > 2) if (tempalgo->setrule(currlayer->algo->getrule())) tempalgo->setrule(tempalgo->DefaultRule()); // copy (and kill) live cells in selection to temporary universe, // rotating the new coords by +/- 90 degrees if ( !RotateRect(clockwise, currlayer->algo, tempalgo, true, itop, ileft, ibottom, iright, ntop, nleft, nbottom, nright) ) { // user aborted rotation if (savecells) { // use oldalgo to restore erased selection CopyRect(itop, ileft, ibottom, iright, oldalgo, currlayer->algo, false, "Restoring selection"); delete oldalgo; } else { // restore erased selection by rotating tempalgo in opposite direction // back into the current universe RotateRect(!clockwise, tempalgo, currlayer->algo, false, ntop, nleft, nbottom, nright, itop, ileft, ibottom, iright); } delete tempalgo; UpdatePatternAndStatus(); return false; } // copy rotated selection from temporary universe to current universe; // check if new selection rect is outside modified pattern edges currlayer->algo->findedges(&top, &left, &bottom, &right); if ( newtop > bottom || newbottom < top || newleft > right || newright < left ) { // safe to use fast nextcell calls CopyRect(ntop, nleft, nbottom, nright, tempalgo, currlayer->algo, false, "Adding rotated selection"); } else { // have to use slow getcell calls CopyAllRect(ntop, nleft, nbottom, nright, tempalgo, currlayer->algo, "Pasting rotated selection"); } // don't need temporary universe any more delete tempalgo; // rotate the selection edges seltop = newtop; selbottom = newbottom; selleft = newleft; selright = newright; if (savecells) { // compare patterns in oldalgo and currlayer->algo and call SaveCellChange // for each cell that has a different state if ( SaveDifferences(oldalgo, currlayer->algo, otop, oleft, obottom, oright) ) { Selection oldsel(itop, ileft, ibottom, iright); Selection newsel(ntop, nleft, nbottom, nright); currlayer->undoredo->RememberRotation(clockwise, oldsel, newsel, currlayer->dirty); } else { currlayer->undoredo->ForgetCellChanges(); Warning("You can't undo this change!"); } delete oldalgo; } // display results DisplaySelectionSize(); if (!inundoredo) MarkLayerDirty(); UpdatePatternAndStatus(); return true; } golly-2.5-src/gui-ios/Golly/settings@2x.png0000644000175100001440000000170712156145314015602 00000000000000‰PNG  IHDR<<:üÙrŽIDAThíšßq›@Æ¿ÅNoÖ¤O°gôb&¤‚ÐII*ˆ:°;°\AÔAäq<‘àœ”73–Ù<e%‚;8þó{ÓÜêö>í²·wˆ˜Ï «ëì›ÁOÁOg'ø•‰Iâ8þ `æ!€K"J™ù†™çƒÁ`6~™ðÕj²'Ir˜eÙ"ËX8Bœw-¼QJ‹OL‡&Y–¥‹Å⸉Ϧ4Šðš8Ž?2ó¹¢ù2Ïsßó¼ëÆŽk`D0DQtJDSEó!ÄIém¬JÇãKfͲ,SÍ£‹ðÍH¹®ûÓè*0¾ëDš™?™ö_E+‡ªh"òÛð_F¥`)å(ŠNu'Ç—¦fUû·qJK)¿8!¢iÑ}¤TðfÊéŠ.lÃÚ+k‰RÁÌìo~V­Y©÷ŠvѪ­)v©ë¿)µªô.Ѻ‘%"•>Ü(U‚wF`[´”ò¢FÏ4íSz.δ~ÉøTJ¹uÛ¶=ÕýNSª.fü ›°¦ïiï]D m*QQ[=ïLî3Ò•Uz0L v«Q‡ ˲y’$‡-Íÿ•‚G£Ñ¯<ÏC´·gždYv³¯«¥}Øó¼ë<Ï}´é¡eYs)åû–æÿƒrãáyÞµÂ0z´—&EO^õ!€YÛ‡”Z7I’ÞÞÞDàáˆw´1œH·ï£ã8~ËÌsES×u?h/LãW´,+Õ)f½ÜäTVܯ)Ùö%¥×höÜÛTöཉðÇq®4Þ3oV¥wïJ/âf«ÕêÍjµzƒ­çžˆ&es÷.¥7ÙU¹ó<íyÞúØyÌÌß7Ç]×¥]sö2ÂkT*÷ÝÝV‘ëu„`±X[–5ÇC? ¢ËûûûÏppppÆÌ=·eî½`@¯rÑÜqœw»Æ{Òk4+÷¤lðQÔþBÁÌ¡ã8We6F0MÅÿ YJD~ñ£”ò(ža“<ª›àEðSçEðSçÙ þ åß±$§ŠëXIEND®B`‚golly-2.5-src/gui-ios/Golly/settings.png0000644000175100001440000000105512156145314015224 00000000000000‰PNG  IHDR;0®¢ôIDATH‰å—Ï›P‡¿!–ÞqI›l‰“1”’Ö%8Ä[Av+ˆÓH„,xœˆ¼8ØGarÁö‚ÿ‘ùgß›ÇïÍDU¹…œ›Po œJÆq®øøE£&(€ˆD½€‹¢˜óÚ¹§´°Ö~è ‚àEUgWÀ]`™$ÉC'0Àd2ùŒTõ‰Có¬Ed&"áñÂDdQðbm™uJ’äAD5©¥1fzÉÒ `­ýL}Ë\cÂsðÖàÞt¾·EQ„e·«U§AÀ3Ö5)×qœè”ã;U eÙ]žçú¶ˆÌÆãñóq¼óèãyÞ®áæ@UŸêßËÌU9ÿU=ªê{ùL“$ùRMvÞꪪN÷}ÿM%þØú¾ÿvëuÊô}ÿX¤i:X­V÷eúÀ½·{§«ê4M¿ƒŸejñOÁžçíŒ1¡ˆ¬Ë©Ô‘¨\Ð_õú¯Ñÿ÷ óKšæáݯIEND®B`‚golly-2.5-src/gui-ios/Golly/SettingsViewController.h0000644000175100001440000000362112156145314017527 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import // This is the view controller for the Settings tab. @interface SettingsViewController : UIViewController { IBOutlet UIButton *modeButton; IBOutlet UITextField *percentageText; IBOutlet UITextField *memoryText; IBOutlet UISlider *percentageSlider; IBOutlet UISlider *memorySlider; IBOutlet UISwitch *gridSwitch; IBOutlet UISwitch *timingSwitch; IBOutlet UISwitch *beepSwitch; IBOutlet UISwitch *colorsSwitch; IBOutlet UISwitch *iconsSwitch; IBOutlet UISwitch *undoSwitch; IBOutlet UISwitch *hashingSwitch; } - (IBAction)changePasteMode:(id)sender; - (IBAction)changePercentage:(id)sender; - (IBAction)changeMemory:(id)sender; - (IBAction)toggleGrid:(id)sender; - (IBAction)toggleTiming:(id)sender; - (IBAction)toggleBeep:(id)sender; - (IBAction)toggleColors:(id)sender; - (IBAction)toggleIcons:(id)sender; - (IBAction)toggleUndo:(id)sender; - (IBAction)toggleHashing:(id)sender; @end golly-2.5-src/gui-ios/Golly/SettingsViewController.m0000644000175100001440000002304512156145314017536 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "utils.h" // for Beep #include "status.h" // for ClearMessage #include "prefs.h" // for SavePrefs, showgridlines, etc #include "layer.h" // for InvertCellColors #include "undo.h" // for currlayer->undoredo->... #include "control.h" // for generating #import "SettingsViewController.h" @implementation SettingsViewController // ----------------------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"Settings"; self.tabBarItem.image = [UIImage imageNamed:@"settings.png"]; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release outlets modeButton = nil; percentageText = nil; memoryText = nil; percentageSlider = nil; memorySlider = nil; gridSwitch = nil; timingSwitch = nil; beepSwitch = nil; colorsSwitch = nil; iconsSwitch = nil; undoSwitch = nil; hashingSwitch = nil; } // ----------------------------------------------------------------------------- static bool oldcolors; // detect if user changed swapcolors static bool oldundo; // detect if user changed allowundo static bool oldhashinfo; // detect if user changed currlayer->showhashinfo static int oldhashmem; // detect if user changed maxhashmem - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // make sure various controls agree with current settings: [modeButton setTitle:[NSString stringWithCString:GetPasteMode() encoding:NSUTF8StringEncoding] forState:UIControlStateNormal]; [percentageText setText:[NSString stringWithFormat:@"%d", randomfill]]; percentageSlider.minimumValue = 1; percentageSlider.maximumValue = 100; percentageSlider.value = randomfill; [memoryText setText:[NSString stringWithFormat:@"%d", maxhashmem]]; memorySlider.minimumValue = MIN_MEM_MB; memorySlider.maximumValue = MAX_MEM_MB; memorySlider.value = maxhashmem; [gridSwitch setOn:showgridlines animated:NO]; [timingSwitch setOn:showtiming animated:NO]; [beepSwitch setOn:allowbeep animated:NO]; [colorsSwitch setOn:swapcolors animated:NO]; [iconsSwitch setOn:showicons animated:NO]; [undoSwitch setOn:allowundo animated:NO]; [hashingSwitch setOn:currlayer->showhashinfo animated:NO]; oldcolors = swapcolors; oldundo = allowundo; oldhashmem = maxhashmem; oldhashinfo = currlayer->showhashinfo; } // ----------------------------------------------------------------------------- - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (swapcolors != oldcolors) InvertCellColors(); if (allowundo != oldundo) { if (allowundo) { if (currlayer->algo->getGeneration() > currlayer->startgen) { // undo list is empty but user can Reset, so add a generating change // to undo list so user can Undo or Reset (and then Redo if they wish) currlayer->undoredo->AddGenChange(); } } else { currlayer->undoredo->ClearUndoRedo(); } } if (currlayer->showhashinfo != oldhashinfo) { // we only show hashing info while generating if (generating) lifealgo::setVerbose(currlayer->showhashinfo); } // need to call setMaxMemory if maxhashmem changed if (maxhashmem != oldhashmem) { for (int i = 0; i < numlayers; i++) { Layer* layer = GetLayer(i); if (algoinfo[layer->algtype]->canhash) { layer->algo->setMaxMemory(maxhashmem); } // non-hashing algos (QuickLife) use their default memory setting } } // this is a good place to save the current settings SavePrefs(); } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (IBAction)changePasteMode:(id)sender { UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: @"AND", @"COPY", @"OR", @"XOR", nil]; [sheet showFromRect:modeButton.frame inView:modeButton.superview animated:NO]; } // ----------------------------------------------------------------------------- - (void)actionSheet:(UIActionSheet *)sheet didDismissWithButtonIndex:(NSInteger)buttonIndex { // called when the user selects an option from UIActionSheet created in changePasteMode switch (buttonIndex) { case 0: [modeButton setTitle:@"AND" forState:UIControlStateNormal]; pmode = And; break; case 1: [modeButton setTitle:@"COPY" forState:UIControlStateNormal]; pmode = Copy; break; case 2: [modeButton setTitle:@"OR" forState:UIControlStateNormal]; pmode = Or; break; case 3: [modeButton setTitle:@"XOR" forState:UIControlStateNormal]; pmode = Xor; break; default: break; } } // ----------------------------------------------------------------------------- - (IBAction)changePercentage:(id)sender { randomfill = (int)percentageSlider.value; [percentageText setText:[NSString stringWithFormat:@"%d", randomfill]]; } // ----------------------------------------------------------------------------- - (IBAction)changeMemory:(id)sender { maxhashmem = (int)memorySlider.value; [memoryText setText:[NSString stringWithFormat:@"%d", maxhashmem]]; } // ----------------------------------------------------------------------------- - (IBAction)toggleGrid:(id)sender { showgridlines = !showgridlines; } // ----------------------------------------------------------------------------- - (IBAction)toggleTiming:(id)sender { showtiming = !showtiming; } // ----------------------------------------------------------------------------- - (IBAction)toggleBeep:(id)sender { allowbeep = !allowbeep; } // ----------------------------------------------------------------------------- - (IBAction)toggleColors:(id)sender { swapcolors = !swapcolors; } // ----------------------------------------------------------------------------- - (IBAction)toggleIcons:(id)sender { showicons = !showicons; } // ----------------------------------------------------------------------------- - (IBAction)toggleUndo:(id)sender { allowundo = !allowundo; } // ----------------------------------------------------------------------------- - (IBAction)toggleHashing:(id)sender { currlayer->showhashinfo = !currlayer->showhashinfo; } // ----------------------------------------------------------------------------- // UITextFieldDelegate methods: - (void)textFieldDidEndEditing:(UITextField *)tf { // called when editing has ended (ie. keyboard disappears) if (tf == percentageText) { if (tf.text.length > 0) { randomfill = [tf.text integerValue]; if (randomfill < 1) randomfill = 1; if (randomfill > 100) randomfill = 100; } [percentageText setText:[NSString stringWithFormat:@"%d", randomfill]]; percentageSlider.value = randomfill; } else if (tf == memoryText) { if (tf.text.length > 0) { maxhashmem = [tf.text integerValue]; if (maxhashmem < MIN_MEM_MB) maxhashmem = MIN_MEM_MB; if (maxhashmem > MAX_MEM_MB) maxhashmem = MAX_MEM_MB; } [memoryText setText:[NSString stringWithFormat:@"%d", maxhashmem]]; memorySlider.value = maxhashmem; } } - (BOOL)textFieldShouldReturn:(UITextField *)tf { // called when user hits Done button, so remove keyboard // (note that textFieldDidEndEditing will then be called) [tf resignFirstResponder]; return YES; } // ----------------------------------------------------------------------------- @end golly-2.5-src/gui-ios/Golly/SettingsViewController.xib0000644000175100001440000013601712156145314020070 00000000000000 1280 10K549 1938 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUIView IBProxyObject IBUILabel IBUISwitch IBUITextField IBUISlider IBUIButton com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 292 301 301 {{249, 430}, {94, 27}} NO IBIPadFramework 0 0 301 {{250, 180}, {94, 27}} NO IBIPadFramework 0 0 301 {{250, 230}, {94, 27}} NO IBIPadFramework 0 0 301 {{250, 280}, {94, 27}} NO IBIPadFramework 0 0 301 {{250, 330}, {94, 27}} NO IBIPadFramework 0 0 301 {{139, 430}, {117, 24}} NO YES 7 NO IBIPadFramework Show grid lines 1 MCAwIDAAA 1 10 1 17 Helvetica 17 16 301 {{129, 230}, {128, 24}} NO YES 7 NO IBIPadFramework Play beep sound 1 10 301 {{128, 280}, {128, 24}} NO YES 7 NO IBIPadFramework Invert cell colors 1 10 2 301 {{128, 330}, {128, 24}} NO YES 7 NO IBIPadFramework Show icons 1 10 2 301 {{128, 380}, {128, 24}} NO YES 7 NO IBIPadFramework Can undo/redo 1 10 2 301 {{80, 180}, {177, 24}} NO YES 7 NO IBIPadFramework Show timing messages 1 10 301 {{66, 130}, {190, 24}} NO YES 7 NO IBIPadFramework Show hashing messages 1 10 2 301 {{33, 80}, {223, 24}} NO YES 7 NO IBIPadFramework Maximum hash memory (MB) 1 10 2 301 {{78, 30}, {182, 24}} NO YES 7 NO IBIPadFramework Random fill percentage 1 10 2 301 {{138, 480}, {117, 24}} NO YES 7 NO IBIPadFramework Paste mode 1 10 2 301 {{264, 480}, {78, 30}} NO IBIPadFramework 0 0 1 OR 3 MQA 1 MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA 3 MC41AA 2 15 Helvetica-Bold 15 16 301 {{355, 32}, {120, 23}} NO IBIPadFramework 0 0 100 1 100 301 {{355, 82}, {120, 23}} NO IBIPadFramework 0 0 300 10 300 301 {{250, 380}, {94, 27}} NO IBIPadFramework 0 0 301 {{250, 130}, {94, 27}} NO IBIPadFramework 0 0 301 {{264, 79}, {78, 31}} NO YES IBIPadFramework 0 300 3 3 MAA 2 1 YES 17 4 9 IBCocoaTouchFramework 3 1 14 Helvetica 14 16 301 {{265, 29}, {78, 31}} NO YES IBIPadFramework 0 100 3 3 MAA 1 YES 17 4 9 IBCocoaTouchFramework 3 {{131, 233}, {506, 538}} 3 MC42NjY2NjY2NjY3AA IBIPadFramework {{0, 20}, {768, 1004}} NO 2 IBIPadFramework view 3 gridSwitch 11 timingSwitch 12 beepSwitch 25 modeButton 26 percentageSlider 28 colorsSwitch 34 hashingSwitch 45 memorySlider 47 undoSwitch 48 percentageText 54 memoryText 55 iconsSwitch 62 toggleGrid: 13 10 toggleTiming: 13 9 changePasteMode: 7 35 changePercentage: 13 36 toggleBeep: 13 24 toggleColors: 13 33 toggleUndo: 13 50 toggleHashing: 13 51 changeMemory: 13 49 delegate 56 delegate 57 toggleIcons: 13 61 0 -1 File's Owner -2 2 14 4 5 6 7 15 17 18 20 21 23 31 32 37 38 39 40 42 43 52 53 58 59 SettingsViewController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 62 SettingsViewController UIViewController id id id id id id id id id id changeMemory: id changePasteMode: id changePercentage: id toggleBeep: id toggleColors: id toggleGrid: id toggleHashing: id toggleIcons: id toggleTiming: id toggleUndo: id UISwitch UISwitch UISwitch UISwitch UISwitch UISlider UITextField UIButton UISlider UITextField UISwitch UISwitch beepSwitch UISwitch colorsSwitch UISwitch gridSwitch UISwitch hashingSwitch UISwitch iconsSwitch UISwitch memorySlider UISlider memoryText UITextField modeButton UIButton percentageSlider UISlider percentageText UITextField timingSwitch UISwitch undoSwitch UISwitch IBProjectSource ./Classes/SettingsViewController.h 0 IBIPadFramework YES 3 933 golly-2.5-src/gui-ios/Golly/StatePickerController.h0000644000175100001440000000220612156145314017310 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import #import "StatePickerView.h" @interface StatePickerController : UIViewController { IBOutlet StatePickerView *spView; IBOutlet UISwitch *iconsSwitch; } - (IBAction)toggleIcons:(id)sender; @end golly-2.5-src/gui-ios/Golly/StatePickerController.m0000644000175100001440000000527612156145314017327 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "prefs.h" // for showicons #import "PatternViewController.h" // for UpdateEditBar, UpdatePattern #import "StatePickerController.h" // ----------------------------------------------------------------------------- @implementation StatePickerController - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.title = @"StatePicker"; } return self; } // ----------------------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // release any cached data, images, etc that aren't in use } // ----------------------------------------------------------------------------- - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // return YES for supported orientations return YES; } // ----------------------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; } // ----------------------------------------------------------------------------- - (void)viewDidUnload { [super viewDidUnload]; // release all outlets spView = nil; iconsSwitch = nil; } // ----------------------------------------------------------------------------- - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [iconsSwitch setOn:showicons animated:NO]; } // ----------------------------------------------------------------------------- - (IBAction)toggleIcons:(id)sender { showicons = !showicons; [spView setNeedsDisplay]; UpdateEditBar(); UpdatePattern(); } // ----------------------------------------------------------------------------- @end golly-2.5-src/gui-ios/Golly/StatePickerController.xib0000644000175100001440000002566412156145314017660 00000000000000 1280 10K549 1938 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin 933 IBUISwitch IBUIView IBUILabel IBProxyObject com.apple.InterfaceBuilder.IBCocoaTouchPlugin PluginDependencyRecalculationVersion IBFilesOwner IBIPadFramework IBFirstResponder IBIPadFramework 292 274 {{10, 10}, {748, 944}} 3 MC42NjY2NjY2NjY3AA IBIPadFramework 268 {{94, 966}, {94, 27}} NO IBIPadFramework 0 0 YES 268 {{10, 966}, {95, 24}} NO YES 7 NO IBIPadFramework Show icons 1 MCAwIDAAA 1 10 1 17 Helvetica 17 16 {{0, 20}, {768, 1004}} NO 2 IBIPadFramework view 5 spView 7 iconsSwitch 9 toggleIcons: 13 10 0 -1 File's Owner -2 2 6 8 11 StatePickerController com.apple.InterfaceBuilder.IBCocoaTouchPlugin UIResponder com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin StatePickerView com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 StatePickerController UIViewController toggleIcons: id toggleIcons: toggleIcons: id UISwitch StatePickerView iconsSwitch UISwitch spView StatePickerView IBProjectSource ./Classes/StatePickerController.h StatePickerView UIView IBProjectSource ./Classes/StatePickerView.h 0 IBIPadFramework YES 3 933 golly-2.5-src/gui-ios/Golly/StatePickerView.h0000644000175100001440000000175412156145314016106 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ @interface StatePickerView : UIView @end golly-2.5-src/gui-ios/Golly/StatePickerView.m0000644000175100001440000001220212156145314016101 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "prefs.h" // for showicons #include "layer.h" // for currlayer #import "PatternViewController.h" // for UpdateEditBar, CloseStatePicker #import "StateView.h" // for DrawOneIcon #import "StatePickerView.h" @implementation StatePickerView // ----------------------------------------------------------------------------- - (id)initWithCoder:(NSCoder *)c { self = [super initWithCoder:c]; if (self) { [self setMultipleTouchEnabled:YES]; // add gesture recognizer to this view UITapGestureRecognizer *tap1Gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; tap1Gesture.numberOfTapsRequired = 1; tap1Gesture.numberOfTouchesRequired = 1; tap1Gesture.delegate = self; [self addGestureRecognizer:tap1Gesture]; } return self; } // ----------------------------------------------------------------------------- - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); CGImageRef* iconmaps = currlayer->icons31x31; // use white lines [[UIColor whiteColor] setStroke]; CGContextSetLineWidth(context, 1.0); // font for drawing state numbers UIFont *numfont = [UIFont systemFontOfSize:10]; // draw boxes showing colors or icons of all states int x = 0, y = 0; int dx, dy; for (int i = 0; i < currlayer->algo->NumCellStates(); i++) { CGRect box = CGRectMake(x+1, y+1, 31, 31); if (showicons && iconmaps && iconmaps[i]) { // fill box with background color then draw icon CGContextSetFillColorWithColor(context, currlayer->colorref[0]); CGContextFillRect(context, box); DrawOneIcon(context, x+1, y+1, iconmaps[i], currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0], currlayer->cellr[i], currlayer->cellg[i], currlayer->cellb[i]); } else { // fill box with color of current drawing state CGContextSetFillColorWithColor(context, currlayer->colorref[i]); CGContextFillRect(context, box); } // anti-aliased text is much nicer CGContextSetShouldAntialias(context, true); // show state number in top left corner of box, as black text on white NSString *num = [NSString stringWithFormat:@"%d", i]; CGRect textrect; textrect.size = [num sizeWithFont:numfont]; textrect.origin.x = x+1; textrect.origin.y = y+1; textrect.size.height -= 3; [[UIColor whiteColor] setFill]; CGContextFillRect(context, textrect); textrect.origin.y -= 2; [[UIColor blackColor] setFill]; [num drawInRect:textrect withFont:numfont]; // avoid fuzzy lines CGContextSetShouldAntialias(context, false); // draw lines around box (why do we need to add 1 to y coords???) CGContextMoveToPoint(context, x, y+1); CGContextAddLineToPoint(context, x+32, y+1); CGContextAddLineToPoint(context, x+32, y+33); CGContextAddLineToPoint(context, x, y+33); CGContextAddLineToPoint(context, x, y+1); CGContextStrokePath(context); if (i == currlayer->drawingstate) { // remember location of current drawing state dx = x; dy = y; } // move to next box if ((i+1) % 16 == 0) { x = 0; y += 32; } else { x += 32; } } } // ----------------------------------------------------------------------------- - (void)singleTap:(UITapGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { CGPoint pt = [gestureRecognizer locationInView:self]; int col = pt.x / 32; int row = pt.y / 32; int newstate = row * 16 + col; if (newstate >= 0 && newstate < currlayer->algo->NumCellStates()) { currlayer->drawingstate = newstate; UpdateEditBar(); CloseStatePicker(); } } } // ----------------------------------------------------------------------------- @end golly-2.5-src/gui-ios/Golly/StateView.h0000644000175100001440000000255612156145314014751 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ @interface StateView : UIView { UIPopoverController *statePopover; } // close statePopover when user clicks on a drawing state - (void)dismissStatePopover; @end void DrawOneIcon(CGContextRef context, int x, int y, CGImageRef icon, unsigned char deadr, unsigned char deadg, unsigned char deadb, unsigned char liver, unsigned char liveg, unsigned char liveb); golly-2.5-src/gui-ios/Golly/StateView.m0000644000175100001440000002064312156145314014753 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "prefs.h" // for showicons #include "layer.h" // for currlayer #include "status.h" // for ClearMessage #import "PatternViewController.h" // for UpdateEditBar #import "StatePickerController.h" #import "StateView.h" @implementation StateView // ----------------------------------------------------------------------------- - (id)initWithCoder:(NSCoder *)c { self = [super initWithCoder:c]; if (self) { [self setMultipleTouchEnabled:YES]; // add gesture recognizer to this view UITapGestureRecognizer *tap1Gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; tap1Gesture.numberOfTapsRequired = 1; tap1Gesture.numberOfTouchesRequired = 1; tap1Gesture.delegate = self; [self addGestureRecognizer:tap1Gesture]; } return self; } // ----------------------------------------------------------------------------- void DrawOneIcon(CGContextRef context, int x, int y, CGImageRef icon, unsigned char deadr, unsigned char deadg, unsigned char deadb, unsigned char liver, unsigned char liveg, unsigned char liveb) { int wd = CGImageGetWidth(icon); int ht = CGImageGetHeight(icon); int bytesPerPixel = 4; int bytesPerRow = bytesPerPixel * wd; int bitsPerComponent = 8; // allocate memory to store icon's RGBA bitmap data unsigned char* pxldata = (unsigned char*) calloc(wd * ht * 4, 1); if (pxldata == NULL) return; CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate(pxldata, wd, ht, bitsPerComponent, bytesPerRow, colorspace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGContextDrawImage(ctx, CGRectMake(0, 0, wd, ht), icon); CGContextRelease(ctx); bool multicolor = currlayer->multicoloricons; // pxldata now contains the icon bitmap in RGBA pixel format, // so convert black pixels to given dead cell color and non-black pixels // to given live cell color (but not if icon is multi-colored) int byte = 0; for (int i = 0; i < wd*ht; i++) { unsigned char r = pxldata[byte]; unsigned char g = pxldata[byte+1]; unsigned char b = pxldata[byte+2]; if (r || g || b) { // non-black pixel if (multicolor) { // use non-black pixel in multi-colored icon if (swapcolors) { pxldata[byte] = 255 - pxldata[byte]; pxldata[byte+1] = 255 - pxldata[byte+1]; pxldata[byte+2] = 255 - pxldata[byte+2]; } } else { // grayscale icon if (r == 255) { // replace white pixel with live cell color pxldata[byte] = liver; pxldata[byte+1] = liveg; pxldata[byte+2] = liveb; } else { // replace gray pixel with appropriate shade between // live and dead cell colors float frac = (float)r / 255.0; pxldata[byte] = (int)(deadr + frac * (liver - deadr) + 0.5); pxldata[byte+1] = (int)(deadg + frac * (liveg - deadg) + 0.5); pxldata[byte+2] = (int)(deadb + frac * (liveb - deadb) + 0.5); } } } else { // replace black pixel with dead cell color pxldata[byte] = deadr; pxldata[byte+1] = deadg; pxldata[byte+2] = deadb; } pxldata[byte+3] = 255; // ensure alpha channel is opaque byte += 4; } // create new icon image using modified pixel data and display it upside down CGContextSaveGState(context); CGContextTranslateCTM(context, x, y); CGContextScaleCTM(context, 1, -1); ctx = CGBitmapContextCreate(pxldata, wd, ht, 8, wd * 4, colorspace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGImageRef newicon = CGBitmapContextCreateImage(ctx); CGContextRelease(ctx); CGColorSpaceRelease(colorspace); // draw the image (use 0,0 and -ve height because of above translation and scale by 1,-1) CGContextDrawImage(context, CGRectMake(0,0,wd,-ht), newicon); // clean up free(pxldata); CGImageRelease(newicon); CGContextRestoreGState(context); } // ----------------------------------------------------------------------------- - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); int state = currlayer->drawingstate; CGImageRef* iconmaps = currlayer->icons31x31; // leave a 1 pixel border (color is set in xib) CGRect box = CGRectMake(1, 1, self.bounds.size.width-2, self.bounds.size.height-2); if (showicons && iconmaps && iconmaps[state]) { // fill box with background color then draw icon CGContextSetFillColorWithColor(context, currlayer->colorref[0]); CGContextFillRect(context, box); DrawOneIcon(context, 1, 1, iconmaps[state], currlayer->cellr[0], currlayer->cellg[0], currlayer->cellb[0], currlayer->cellr[state], currlayer->cellg[state], currlayer->cellb[state]); } else { // fill box with color of current drawing state CGContextSetFillColorWithColor(context, currlayer->colorref[state]); CGContextFillRect(context, box); } } // ----------------------------------------------------------------------------- - (void)singleTap:(UITapGestureRecognizer *)gestureRecognizer { if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { ClearMessage(); int numstates = currlayer->algo->NumCellStates(); if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { // create a popover controller for picking the new drawing state StatePickerController *statePicker = [[StatePickerController alloc] initWithNibName:nil bundle:nil]; statePopover = [[UIPopoverController alloc] initWithContentViewController:statePicker]; statePopover.delegate = self; // set popover size depending on number of states int wd = numstates <= 16 ? numstates * 32 : 16 * 32; int ht = (numstates + 15) / 16 * 32; // add border of 10 pixels (must match border in xib), // and add 1 extra pixel because we draw boxes around each cell wd += 21; ht += 21; // allow for switch button and label if (wd < 196) wd = 196; ht += 40; statePopover.popoverContentSize = CGSizeMake(wd, ht); [statePopover presentPopoverFromRect:self.bounds inView:self permittedArrowDirections:UIPopoverArrowDirectionUp animated:NO]; statePicker = nil; } } } // ----------------------------------------------------------------------------- - (void)dismissStatePopover { [statePopover dismissPopoverAnimated:NO]; statePopover = nil; } // ----------------------------------------------------------------------------- - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController { statePopover = nil; } // ----------------------------------------------------------------------------- @end golly-2.5-src/gui-ios/Golly/status.h0000644000175100001440000000324112156145314014351 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _STATUS_H_ #define _STATUS_H_ #include "bigint.h" // Routines for the status bar area: void DrawStatusBar(CGContextRef context, int wd, int ht, CGRect dirtyrect); // update status bar info void ClearMessage(); // erase bottom line of status bar void DisplayMessage(const char* s); // display given message on bottom line of status bar void ErrorMessage(const char* s); // beep and display given message on bottom line of status bar void SetMessage(const char* s); // set message string without displaying it (until next update) void UpdateXYLocation(); // XY location needs to be updated int GetCurrentDelay(); // return current delay (in millisecs) char* Stringify(const bigint& b); // convert given number to string suitable for display #endif golly-2.5-src/gui-ios/Golly/status.m0000644000175100001440000002121012156145314014352 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "bigint.h" #include "lifealgo.h" #include "utils.h" // for Fatal, Beep #include "prefs.h" // for mindelay, maxdelay, etc #include "algos.h" // for algoinfo #include "layer.h" // for currlayer #include "view.h" // for nopattupdate #include "status.h" #import "PatternViewController.h" // for UpdateStatus #import "RuleViewController.h" // for GetRuleName // ----------------------------------------------------------------------------- std::string statusmsg; // for messages on bottom line /* show info on 2nd line in fixed positions!!!??? int h_gen; // horizontal position of "Generation" int h_pop; // horizontal position of "Population" int h_scale; // horizontal position of "Scale" int h_step; // horizontal position of "Step" int h_xy; // horizontal position of "XY" */ // ----------------------------------------------------------------------------- void DrawStatusBar(CGContextRef context, int wd, int ht, CGRect dirtyrect) { // bg color of status area depends on current algorithm [[UIColor colorWithRed:algoinfo[currlayer->algtype]->statusrgb.r / 255.0 green:algoinfo[currlayer->algtype]->statusrgb.g / 255.0 blue:algoinfo[currlayer->algtype]->statusrgb.b / 255.0 alpha:1.0] setFill]; CGContextFillRect(context, dirtyrect); // draw thin gray line along bottom /* only if edit toolbar is ever hidden!!! [[UIColor grayColor] setStroke]; CGContextSetLineWidth(context, 1.0); CGContextMoveToPoint(context, 0, ht); CGContextAddLineToPoint(context, wd, ht); CGContextStrokePath(context); */ // use black for drawing text [[UIColor blackColor] setFill]; // add code if showexact???!!! // add code to limit amount of drawing if dirtyrect's height is smaller than given ht???!!! // create strings for each line std::string strbuf; std::string rule = currlayer->algo->getrule(); strbuf = "Pattern="; if (currlayer->dirty) { // display asterisk to indicate pattern has been modified strbuf += "*"; } strbuf += currlayer->currname; strbuf += " Algorithm="; strbuf += GetAlgoName(currlayer->algtype); strbuf += " Rule="; strbuf += rule; // show rule name if one exists and is not same as rule // (best NOT to remove any suffix like ":T100,200" in case we allow // users to name "B3/S23:T100,200" as "Life on torus") std::string rulename = GetRuleName(rule); if (!rulename.empty() && rulename != rule) { strbuf += " ["; strbuf += rulename; strbuf += "]"; } NSString *line1 = [NSString stringWithCString:strbuf.c_str() encoding:NSUTF8StringEncoding]; char scalestr[32]; int mag = currlayer->view->getmag(); if (mag < 0) { sprintf(scalestr, "2^%d:1", -mag); } else { sprintf(scalestr, "1:%d", 1 << mag); } char stepstr[32]; if (currlayer->currexpo < 0) { // show delay in secs sprintf(stepstr, "Delay=%gs", (double)GetCurrentDelay() / 1000.0); } else { sprintf(stepstr, "Step=%d^%d", currlayer->currbase, currlayer->currexpo); } strbuf = "Generation="; if (nopattupdate) { strbuf += "0"; } else { strbuf += Stringify(currlayer->algo->getGeneration()); } strbuf += " Population="; if (nopattupdate) { strbuf += "0"; } else { bigint popcount = currlayer->algo->getPopulation(); if (popcount.sign() < 0) { // getPopulation returns -1 if it can't be calculated strbuf += "?"; } else { strbuf += Stringify(popcount); } } strbuf += " Scale="; strbuf += scalestr; strbuf += " "; strbuf += stepstr; // starts with Delay or Step strbuf += " XY="; strbuf += Stringify(currlayer->view->x); strbuf += " "; strbuf += Stringify(currlayer->view->y); //!!! fix above if we support origin shifting NSString *line2 = [NSString stringWithCString:strbuf.c_str() encoding:NSUTF8StringEncoding]; // get font to draw lines (do only once) static UIFont *font = nil; if (font == nil) font = [UIFont systemFontOfSize:13]; // set position of text in each line float lineht = ht / 3.0; CGRect rect1, rect2; rect1.size = [line1 sizeWithFont:font]; rect2.size = [line2 sizeWithFont:font]; rect1.origin.x = 5.0; rect2.origin.x = 5.0; rect1.origin.y = (lineht / 2.0) - (rect1.size.height / 2.0); rect2.origin.y = rect1.origin.y + lineht; // draw the top 2 lines [line1 drawInRect:rect1 withFont:font]; [line2 drawInRect:rect2 withFont:font]; static bool firstcall = true; if (firstcall) { firstcall = false; // set initial message statusmsg = "This is Golly version "; statusmsg += GOLLY_VERSION; statusmsg += " for iOS. Copyright 2013 The Golly Gang."; } if (statusmsg.length() > 0) { // display status message on bottom line NSString *line3 = [NSString stringWithCString:statusmsg.c_str() encoding:NSUTF8StringEncoding]; CGRect rect3; rect3.size = [line3 sizeWithFont:font]; rect3.origin.x = 5.0; rect3.origin.y = rect2.origin.y + lineht; [line3 drawInRect:rect3 withFont:font]; } } // ----------------------------------------------------------------------------- void ClearMessage() { if (statusmsg.length() == 0) return; // no need to clear message statusmsg.clear(); UpdateStatus(); } // ----------------------------------------------------------------------------- void DisplayMessage(const char* s) { statusmsg = s; UpdateStatus(); } // ----------------------------------------------------------------------------- void ErrorMessage(const char* s) { Beep(); DisplayMessage(s); } // ----------------------------------------------------------------------------- void SetMessage(const char* s) { // set message string without displaying it statusmsg = s; } // ----------------------------------------------------------------------------- void UpdateXYLocation() { /* no need???!!! int wd, ht; GetClientSize(&wd, &ht); if (wd > h_xy && ht > 0) { wxRect r; if (showexact) r = wxRect( wxPoint(0, XLINE+DESCHT-LINEHT), wxPoint(wd-1, YLINE+DESCHT) ); else r = wxRect( wxPoint(h_xy, 0), wxPoint(wd-1, BASELINE1+DESCHT) ); Refresh(false, &r); } */ } // ----------------------------------------------------------------------------- int GetCurrentDelay() { int gendelay = mindelay * (1 << (-currlayer->currexpo - 1)); if (gendelay > maxdelay) gendelay = maxdelay; return gendelay; } // ----------------------------------------------------------------------------- char* Stringify(const bigint& b) { static char buf[32]; char* p = buf; double d = b.todouble(); if ( fabs(d) > 1000000000.0 ) { // use e notation for abs value > 10^9 (agrees with min & max_coord) sprintf(p, "%g", d); } else { // show exact value with commas inserted for readability if ( d < 0 ) { d = - d; *p++ = '-'; } sprintf(p, "%.f", d); int len = strlen(p); int commas = ((len + 2) / 3) - 1; int dest = len + commas; int src = len; p[dest] = 0; while (commas > 0) { p[--dest] = p[--src]; p[--dest] = p[--src]; p[--dest] = p[--src]; p[--dest] = ','; commas--; } if ( p[-1] == '-' ) p--; } return p; } golly-2.5-src/gui-ios/Golly/StatusView.h0000644000175100001440000000200212156145314015136 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ // This is the view for displaying Golly's status info. @interface StatusView : UIView @end golly-2.5-src/gui-ios/Golly/StatusView.m0000644000175100001440000000247312156145314015157 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "status.h" // for DrawStatusBar #import "StatusView.h" @implementation StatusView // ----------------------------------------------------------------------------- - (void)drawRect:(CGRect)rect { DrawStatusBar(UIGraphicsGetCurrentContext(), self.bounds.size.width, self.bounds.size.height, rect); } // ----------------------------------------------------------------------------- @end golly-2.5-src/gui-ios/Golly/triangle-down.png0000644000175100001440000000032012156145314016130 00000000000000‰PNG  IHDRƒF(Â!tEXtSoftwareGraphicConverter (Intel)w‡újIDATxœ¬ÑK EQK·¼îª$&Uý<ôåä¢qÑZ%DDÛ<™P~5$*ÈaùF?9GÅ9¬~í9GC^Tš£!/*U èŒBr èŒB’Q`Ž É(Pq¡eáJÝnÿÿIyã•–9h‡IEND®B`‚golly-2.5-src/gui-ios/Golly/triangle-right.png0000644000175100001440000000027112156145314016303 00000000000000‰PNG  IHDRHûg!tEXtSoftwareGraphicConverter (Intel)w‡úSIDATxœbøO%À¡Nœ8AƒÀ€ãP ¢Ä8,‘gNƒH5Ž€AÄG”A@5ƒð›E_Q!Œ¨kTHGTHÙTÈkTËý”ÿÿŸ§+\]^KËIEND®B`‚golly-2.5-src/gui-ios/Golly/undo.h0000644000175100001440000001426112156145314013777 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _UNDO_H_ #define _UNDO_H_ #include "bigint.h" // for bigint class #include "select.h" // for Selection class #include "algos.h" // for algo_type #include // for std::string #include // for std::list class ChangeNode; class Layer; // Golly supports unlimited undo/redo: typedef struct { int x; // cell's x position int y; // cell's y position int oldstate; // old state int newstate; // new state } cell_change; // stores a single cell change class UndoRedo { public: UndoRedo(); ~UndoRedo(); void SaveCellChange(int x, int y, int oldstate, int newstate); // cell at x,y has changed state void ForgetCellChanges(); // ignore cell changes made by any previous SaveCellChange calls bool RememberCellChanges(const char* action, bool olddirty); // remember cell changes made by any previous SaveCellChange calls, // and the state of the layer's dirty flag BEFORE the change; // the given action string will be appended to the Undo/Redo items; // return true if one or more cells changed state, false otherwise void RememberFlip(bool topbot, bool olddirty); // remember flip's direction void RememberRotation(bool clockwise, bool olddirty); // remember simple rotation (selection includes entire pattern) void RememberRotation(bool clockwise, Selection& oldsel, Selection& newsel, bool olddirty); // remember rotation's direction and old and new selections; // this variant assumes SaveCellChange may have been called void RememberSelection(const char* action); // remember selection change (no-op if selection hasn't changed) void RememberGenStart(); // remember info before generating the current pattern void RememberGenFinish(); // remember generating change after pattern has finished generating void AddGenChange(); // in some situations the undo list is empty but ResetPattern can still // be called because the gen count is > startgen, so this routine adds // a generating change to the undo list so the user can Undo or Reset // (and then Redo if they wish) void SyncUndoHistory(); // called by ResetPattern to synchronize the undo history void RememberSetGen(bigint& oldgen, bigint& newgen, bigint& oldstartgen, bool oldsave); // remember change of generation count void RememberNameChange(const char* oldname, const char* oldcurrfile, bool oldsave, bool olddirty); // remember change to current layer's name void DeletingClone(int index); // the given cloned layer is about to be deleted, so we must ignore // any later name changes involving this layer void RememberRuleChange(const char* oldrule); // remember rule change void RememberAlgoChange(algo_type oldalgo, const char* oldrule); // remember algorithm change, including a possible rule change // and possible cell changes (SaveCellChange may have been called) void RememberScriptStart(); // remember that script is about to start; this allows us to undo/redo // any changes made by the script all at once void RememberScriptFinish(); // remember that script has ended void DuplicateHistory(Layer* oldlayer, Layer* newlayer); // duplicate old layer's undo/redo history in new layer bool savecellchanges; // script's cell changes need to be remembered? bool savegenchanges; // script's gen changes need to be remembered? bool doingscriptchanges; // are script's changes being undone/redone? bool CanUndo(); // can a change be undone? bool CanRedo(); // can an undone change be redone? void UndoChange(); // undo a change void RedoChange(); // redo an undone change void ClearUndoRedo(); // clear all undo/redo history private: std::list undolist; // list of undoable changes std::list redolist; // list of redoable changes cell_change* cellarray; // dynamic array of cell changes unsigned int numchanges; // number of cell changes unsigned int maxchanges; // number allocated bool badalloc; // malloc/realloc failed? std::string prevfile; // for saving pattern at start of gen change bigint prevgen; // generation count at start of gen change bigint prevx, prevy; // viewport position at start of gen change int prevmag; // scale at start of gen change int prevbase; // base step at start of gen change int prevexpo; // step exponent at start of gen change Selection prevsel; // selection at start of gen change int startcount; // unfinished RememberGenStart calls bool fixsetgen; // setgen node needs to be updated? void ClearUndoHistory(); // clear undolist void ClearRedoHistory(); // clear redolist void SaveCurrentPattern(const char* tempfile); // save current pattern to given temporary file }; #endif golly-2.5-src/gui-ios/Golly/undo.m0000644000175100001440000015145512156145314014013 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "bigint.h" #include "lifealgo.h" #include "writepattern.h" // for MC_format, XRLE_format #include "select.h" // for Selection #include "view.h" // for OutsideLimits, etc #include "utils.h" // for Warning, Fatal, etc #include "algos.h" // for algo_type #include "layer.h" // for currlayer, numclones, MarkLayerDirty, etc #include "prefs.h" // for allowundo, etc #include "control.h" // for RestorePattern #include "file.h" // for SetPatternTitle #include "undo.h" // ----------------------------------------------------------------------------- const char* lack_of_memory = "Due to lack of memory, some changes can't be undone!"; const char* temp_prefix = "golly_undo_"; // ----------------------------------------------------------------------------- // encapsulate change info stored in undo/redo lists typedef enum { cellstates, // one or more cell states were changed fliptb, // selection was flipped top-bottom fliplr, // selection was flipped left-right rotatecw, // selection was rotated clockwise rotateacw, // selection was rotated anticlockwise rotatepattcw, // pattern was rotated clockwise rotatepattacw, // pattern was rotated anticlockwise namechange, // layer name was changed // WARNING: code in UndoChange/RedoChange assumes only changes < selchange // can alter the layer's dirty state; ie. the olddirty/newdirty flags are // not used for all the following changes selchange, // selection was changed genchange, // pattern was generated setgen, // generation count was changed rulechange, // rule was changed algochange, // algorithm was changed scriptstart, // later changes were made by script scriptfinish // earlier changes were made by script } change_type; class ChangeNode { public: ChangeNode(change_type id); ~ChangeNode(); bool DoChange(bool undo); // do the undo/redo; if it returns false (eg. user has aborted a lengthy // rotate/flip operation) then cancel the undo/redo void ChangeCells(bool undo); // change cell states using cellinfo change_type changeid; // specifies the type of change bool olddirty; // layer's dirty state before change bool newdirty; // layer's dirty state after change // cellstates info cell_change* cellinfo; // dynamic array of cell changes unsigned int cellcount; // number of cell changes in array // rotatecw/rotateacw/selchange info Selection oldsel, newsel; // old and new selections // genchange info std::string oldfile, newfile; // old and new pattern files bigint oldgen, newgen; // old and new generation counts bigint oldx, oldy, newx, newy; // old and new positions int oldmag, newmag; // old and new scales int oldbase, newbase; // old and new base steps int oldexpo, newexpo; // old and new step exponents bool scriptgen; // gen change was done by script? // also uses oldsel, newsel // setgen info bigint oldstartgen, newstartgen; // old and new startgen values bool oldsave, newsave; // old and new savestart states std::string oldtempstart, newtempstart; // old and new tempstart paths std::string oldstartfile, newstartfile; // old and new startfile paths std::string oldcurrfile, newcurrfile; // old and new currfile paths std::string oldclone[MAX_LAYERS]; // old starting names for cloned layers std::string newclone[MAX_LAYERS]; // new starting names for cloned layers // also uses oldgen, newgen // and oldrule, newrule // and oldx, oldy, newx, newy, oldmag, newmag // and oldbase, newbase // and oldexpo, newexpo // and oldsel, newsel // and oldalgo, newalgo // namechange info std::string oldname, newname; // old and new layer names Layer* whichlayer; // which layer was changed // also uses oldsave, newsave // and oldcurrfile, newcurrfile // rulechange info std::string oldrule, newrule; // old and new rules // also uses oldsel, newsel // algochange info algo_type oldalgo, newalgo; // old and new algorithm types // also uses oldrule, newrule // and oldsel, newsel }; // ----------------------------------------------------------------------------- ChangeNode::ChangeNode(change_type id) { changeid = id; cellinfo = NULL; cellcount = 0; oldfile.clear(); newfile.clear(); oldtempstart.clear(); newtempstart.clear(); } // ----------------------------------------------------------------------------- ChangeNode::~ChangeNode() { if (cellinfo) free(cellinfo); if (!oldfile.empty() && FileExists(oldfile)) { RemoveFile(oldfile); } if (!newfile.empty() && FileExists(newfile)) { RemoveFile(newfile); } // only delete oldtempstart/newtempstart if they're not being used to // store the current layer's starting pattern if ( !oldtempstart.empty() && FileExists(oldtempstart) && oldtempstart != currlayer->startfile && oldtempstart != currlayer->currfile ) { RemoveFile(oldtempstart); } if ( !newtempstart.empty() && FileExists(newtempstart) && newtempstart != currlayer->startfile && newtempstart != currlayer->currfile ) { RemoveFile(newtempstart); } } // ----------------------------------------------------------------------------- void ChangeNode::ChangeCells(bool undo) { // change state of cell(s) stored in cellinfo array if (undo) { // we must undo the cell changes in reverse order in case // a script has changed the same cell more than once unsigned int i = cellcount; while (i > 0) { i--; currlayer->algo->setcell(cellinfo[i].x, cellinfo[i].y, cellinfo[i].oldstate); } } else { unsigned int i = 0; while (i < cellcount) { currlayer->algo->setcell(cellinfo[i].x, cellinfo[i].y, cellinfo[i].newstate); i++; } } if (cellcount > 0) currlayer->algo->endofpattern(); } // ----------------------------------------------------------------------------- bool ChangeNode::DoChange(bool undo) { switch (changeid) { case cellstates: if (cellcount > 0) ChangeCells(undo); break; case fliptb: case fliplr: // pass in true so FlipSelection won't save changes or call MarkLayerDirty if (!FlipSelection(changeid == fliptb, true)) return false; break; case rotatepattcw: case rotatepattacw: // pass in true so RotateSelection won't save changes or call MarkLayerDirty if (!RotateSelection(changeid == rotatepattcw ? !undo : undo, true)) return false; break; case rotatecw: case rotateacw: if (cellcount > 0) ChangeCells(undo); // rotate selection edges if (undo) { currlayer->currsel = oldsel; } else { currlayer->currsel = newsel; } DisplaySelectionSize(); break; case selchange: if (undo) { currlayer->currsel = oldsel; } else { currlayer->currsel = newsel; } if (SelectionExists()) DisplaySelectionSize(); break; case genchange: if (undo) { currlayer->currsel = oldsel; RestorePattern(oldgen, oldfile.c_str(), oldx, oldy, oldmag, oldbase, oldexpo); } else { currlayer->currsel = newsel; RestorePattern(newgen, newfile.c_str(), newx, newy, newmag, newbase, newexpo); } break; case setgen: if (undo) { ChangeGenCount(oldgen.tostring(), true); currlayer->startgen = oldstartgen; currlayer->savestart = oldsave; currlayer->tempstart = oldtempstart; currlayer->startfile = oldstartfile; currlayer->currfile = oldcurrfile; if (oldtempstart != newtempstart) { currlayer->startdirty = olddirty; currlayer->startalgo = oldalgo; currlayer->startrule = oldrule; currlayer->startx = oldx; currlayer->starty = oldy; currlayer->startmag = oldmag; currlayer->startbase = oldbase; currlayer->startexpo = oldexpo; currlayer->startsel = oldsel; currlayer->startname = oldname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->startname = oldclone[i]; } } } } } else { ChangeGenCount(newgen.tostring(), true); currlayer->startgen = newstartgen; currlayer->savestart = newsave; currlayer->tempstart = newtempstart; currlayer->startfile = newstartfile; currlayer->currfile = newcurrfile; if (oldtempstart != newtempstart) { currlayer->startdirty = newdirty; currlayer->startalgo = newalgo; currlayer->startrule = newrule; currlayer->startx = newx; currlayer->starty = newy; currlayer->startmag = newmag; currlayer->startbase = newbase; currlayer->startexpo = newexpo; currlayer->startsel = newsel; currlayer->startname = newname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { cloneptr->startname = newclone[i]; } } } } } break; case namechange: if (whichlayer == NULL) { // the layer has been deleted so ignore name change } else { // note that if whichlayer != currlayer then we're changing the // name of a non-active cloned layer if (undo) { whichlayer->currname = oldname; currlayer->currfile = oldcurrfile; currlayer->savestart = oldsave; } else { whichlayer->currname = newname; currlayer->currfile = newcurrfile; currlayer->savestart = newsave; } if (whichlayer == currlayer) { if (olddirty == newdirty) SetPatternTitle(currlayer->currname.c_str()); // if olddirty != newdirty then UndoChange/RedoChange will call // MarkLayerClean/MarkLayerDirty (they call SetPatternTitle) } else { // whichlayer is non-active clone so only update Layer menu items //!!! for (int i = 0; i < numlayers; i++) UpdateLayerItem(i); } } break; case rulechange: if (undo) { RestoreRule(oldrule.c_str()); currlayer->currsel = oldsel; } else { RestoreRule(newrule.c_str()); currlayer->currsel = newsel; } if (cellcount > 0) { ChangeCells(undo); } // switch to default colors for new rule UpdateLayerColors(); break; case algochange: // pass in true so ChangeAlgorithm won't call RememberAlgoChange if (undo) { ChangeAlgorithm(oldalgo, oldrule.c_str(), true); currlayer->currsel = oldsel; } else { ChangeAlgorithm(newalgo, newrule.c_str(), true); currlayer->currsel = newsel; } if (cellcount > 0) { ChangeCells(undo); } // ChangeAlgorithm has called UpdateLayerColors() break; case scriptstart: case scriptfinish: // should never happen Warning("Bug detected in DoChange!"); break; } return true; } // ----------------------------------------------------------------------------- UndoRedo::UndoRedo() { numchanges = 0; // for 1st SaveCellChange maxchanges = 0; // ditto badalloc = false; // true if malloc/realloc fails cellarray = NULL; // play safe savecellchanges = false; // no script cell changes are pending savegenchanges = false; // no script gen changes are pending doingscriptchanges = false; // not undoing/redoing script changes prevfile.clear(); // play safe for ClearUndoRedo startcount = 0; // unfinished RememberGenStart calls fixsetgen = false; // no setgen nodes need fixing // need to remember if script has created a new layer (not a clone) if (inscript) RememberScriptStart(); } // ----------------------------------------------------------------------------- UndoRedo::~UndoRedo() { ClearUndoRedo(); } // ----------------------------------------------------------------------------- void UndoRedo::ClearUndoHistory() { while (!undolist.empty()) { delete undolist.front(); undolist.pop_front(); } } // ----------------------------------------------------------------------------- void UndoRedo::ClearRedoHistory() { while (!redolist.empty()) { delete redolist.front(); redolist.pop_front(); } } // ----------------------------------------------------------------------------- void UndoRedo::SaveCellChange(int x, int y, int oldstate, int newstate) { if (numchanges == maxchanges) { if (numchanges == 0) { // initially allocate room for 1 cell change maxchanges = 1; cellarray = (cell_change*) malloc(maxchanges * sizeof(cell_change)); if (cellarray == NULL) { badalloc = true; return; } // ~ChangeNode or ForgetCellChanges will free cellarray } else { // double size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, maxchanges * 2 * sizeof(cell_change)); if (newptr == NULL) { badalloc = true; return; } cellarray = newptr; maxchanges *= 2; } } cellarray[numchanges].x = x; cellarray[numchanges].y = y; cellarray[numchanges].oldstate = oldstate; cellarray[numchanges].newstate = newstate; numchanges++; } // ----------------------------------------------------------------------------- void UndoRedo::ForgetCellChanges() { if (numchanges > 0) { if (cellarray) { free(cellarray); } else { Warning("Bug detected in ForgetCellChanges!"); } numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto badalloc = false; } } // ----------------------------------------------------------------------------- bool UndoRedo::RememberCellChanges(const char* action, bool olddirty) { if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; // in the unlikely event that newptr is NULL, cellarray should // still point to valid data } ClearRedoHistory(); // add cellstates node to head of undo list ChangeNode* change = new ChangeNode(cellstates); if (change == NULL) Fatal("Failed to create cellstates node!"); change->cellinfo = cellarray; change->cellcount = numchanges; change->olddirty = olddirty; change->newdirty = true; undolist.push_front(change); numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } return true; // at least one cell changed state } return false; // no cells changed state (SaveCellChange wasn't called) } // ----------------------------------------------------------------------------- void UndoRedo::RememberFlip(bool topbot, bool olddirty) { ClearRedoHistory(); // add fliptb/fliplr node to head of undo list ChangeNode* change = new ChangeNode(topbot ? fliptb : fliplr); if (change == NULL) Fatal("Failed to create flip node!"); change->olddirty = olddirty; change->newdirty = true; undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberRotation(bool clockwise, bool olddirty) { ClearRedoHistory(); // add rotatepattcw/rotatepattacw node to head of undo list ChangeNode* change = new ChangeNode(clockwise ? rotatepattcw : rotatepattacw); if (change == NULL) Fatal("Failed to create simple rotation node!"); change->olddirty = olddirty; change->newdirty = true; undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberRotation(bool clockwise, Selection& oldsel, Selection& newsel, bool olddirty) { ClearRedoHistory(); // add rotatecw/rotateacw node to head of undo list ChangeNode* change = new ChangeNode(clockwise ? rotatecw : rotateacw); if (change == NULL) Fatal("Failed to create rotation node!"); change->oldsel = oldsel; change->newsel = newsel; change->olddirty = olddirty; change->newdirty = true; // if numchanges == 0 we still need to rotate selection edges if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; } change->cellinfo = cellarray; change->cellcount = numchanges; numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } } undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberSelection(const char* action) { if (currlayer->savesel == currlayer->currsel) { // selection has not changed return; } if (generating) { // don't record selection changes while a pattern is generating; // RememberGenStart and RememberGenFinish will remember the overall change return; } ClearRedoHistory(); // add selchange node to head of undo list ChangeNode* change = new ChangeNode(selchange); if (change == NULL) Fatal("Failed to create selchange node!"); change->oldsel = currlayer->savesel; change->newsel = currlayer->currsel; undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::SaveCurrentPattern(const char* tempfile) { const char* err = NULL; //!!! need lifealgo::CanWriteFormat(MC_format) method??? if ( currlayer->algo->hyperCapable() ) { // save hlife pattern in a macrocell file err = WritePattern(tempfile, MC_format, no_compression, 0, 0, 0, 0); } else { // can only save RLE file if edges are within getcell/setcell limits bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); if ( OutsideLimits(top, left, bottom, right) ) { err = "Pattern is too big to save."; } else { // use XRLE format so the pattern's top left location and the current // generation count are stored in the file err = WritePattern(tempfile, XRLE_format, no_compression, top.toint(), left.toint(), bottom.toint(), right.toint()); } } if (err) Warning(err); } // ----------------------------------------------------------------------------- void UndoRedo::RememberGenStart() { startcount++; if (startcount > 1) { // return immediately and ignore next RememberGenFinish call; // this can happen in Linux app if user holds down space bar return; } if (inscript) { if (savegenchanges) return; // ignore consecutive run/step command savegenchanges = true; // we're about to do first run/step command of a (possibly long) // sequence, so save starting info } // save current generation, selection, position, scale, speed, etc prevgen = currlayer->algo->getGeneration(); prevsel = currlayer->currsel; prevx = currlayer->view->x; prevy = currlayer->view->y; prevmag = currlayer->view->getmag(); prevbase = currlayer->currbase; prevexpo = currlayer->currexpo; if (prevgen == currlayer->startgen) { // we can just reset to starting pattern prevfile.clear(); if (fixsetgen) { // SaveStartingPattern has just been called so search undolist for setgen // node that changed tempstart and update the starting info in that node; // yuk -- is there a simpler solution??? std::list::iterator node = undolist.begin(); while (node != undolist.end()) { ChangeNode* change = *node; if (change->changeid == setgen && change->oldtempstart != change->newtempstart) { change->newdirty = currlayer->startdirty; change->newalgo = currlayer->startalgo; change->newrule = currlayer->startrule; change->newx = currlayer->startx; change->newy = currlayer->starty; change->newmag = currlayer->startmag; change->newbase = currlayer->startbase; change->newexpo = currlayer->startexpo; change->newsel = currlayer->startsel; change->newname = currlayer->startname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { change->newclone[i] = cloneptr->startname; } } } // do NOT reset fixsetgen to false here; the gen change might // be removed when clearing the redo list and so we may need // to update this setgen node again after a new gen change break; } node++; } } } else { // save starting pattern in a unique temporary file prevfile = CreateTempFileName(temp_prefix); // if head of undo list is a genchange node then we can copy that // change node's newfile to prevfile; this makes consecutive generating // runs faster (setting prevfile to newfile would be even faster but it's // difficult to avoid the file being deleted if the redo list is cleared) if (!undolist.empty()) { std::list::iterator node = undolist.begin(); ChangeNode* change = *node; if (change->changeid == genchange) { if (CopyFile(change->newfile, prevfile)) { return; } else { Warning("Failed to copy temporary file!"); // continue and call SaveCurrentPattern } } } SaveCurrentPattern(prevfile.c_str()); } } // ----------------------------------------------------------------------------- void UndoRedo::RememberGenFinish() { startcount--; if (startcount > 0) return; if (startcount < 0) { // this can happen if a script has pending gen changes that need // to be remembered (ie. savegenchanges is now false) so reset // startcount for the next RememberGenStart call startcount = 0; } if (inscript && savegenchanges) return; // ignore consecutive run/step command // generation count might not have changed (can happen in Linux app and iOS Golly) if (prevgen == currlayer->algo->getGeneration()) { // delete prevfile created by RememberGenStart if (!prevfile.empty() && FileExists(prevfile)) { RemoveFile(prevfile); } prevfile.clear(); return; } std::string fpath; if (currlayer->algo->getGeneration() == currlayer->startgen) { // this can happen if script called reset() so just use starting pattern fpath.clear(); } else { // save finishing pattern in a unique temporary file fpath = CreateTempFileName(temp_prefix); SaveCurrentPattern(fpath.c_str()); } ClearRedoHistory(); // add genchange node to head of undo list ChangeNode* change = new ChangeNode(genchange); if (change == NULL) Fatal("Failed to create genchange node!"); change->scriptgen = inscript; change->oldgen = prevgen; change->newgen = currlayer->algo->getGeneration(); change->oldfile = prevfile; change->newfile = fpath; change->oldx = prevx; change->oldy = prevy; change->newx = currlayer->view->x; change->newy = currlayer->view->y; change->oldmag = prevmag; change->newmag = currlayer->view->getmag(); change->oldbase = prevbase; change->newbase = currlayer->currbase; change->oldexpo = prevexpo; change->newexpo = currlayer->currexpo; change->oldsel = prevsel; change->newsel = currlayer->currsel; // prevfile has been saved in change->oldfile (~ChangeNode will delete it) prevfile.clear(); undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::AddGenChange() { // add a genchange node to empty undo list if (!undolist.empty()) Warning("AddGenChange bug: undo list NOT empty!"); // use starting pattern info for previous state prevgen = currlayer->startgen; prevsel = currlayer->startsel; prevx = currlayer->startx; prevy = currlayer->starty; prevmag = currlayer->startmag; prevbase = currlayer->startbase; prevexpo = currlayer->startexpo; prevfile.clear(); // play safe and pretend RememberGenStart was called startcount = 1; // avoid RememberGenFinish returning early if inscript is true savegenchanges = false; RememberGenFinish(); if (undolist.empty()) Warning("AddGenChange bug: undo list is empty!"); } // ----------------------------------------------------------------------------- void UndoRedo::SyncUndoHistory() { // synchronize undo history due to a ResetPattern call; // wind back the undo list to just past the genchange node that // matches the current layer's starting gen count std::list::iterator node; ChangeNode* change; while (!undolist.empty()) { node = undolist.begin(); change = *node; // remove node from head of undo list and prepend it to redo list undolist.erase(node); redolist.push_front(change); if (change->changeid == genchange && change->oldgen == currlayer->startgen) { if (change->scriptgen) { // gen change was done by a script so keep winding back the undo list // to just past the scriptstart node, or until the list is empty while (!undolist.empty()) { node = undolist.begin(); change = *node; undolist.erase(node); redolist.push_front(change); if (change->changeid == scriptstart) break; } } return; } } // should never get here Warning("Bug detected in SyncUndoHistory!"); } // ----------------------------------------------------------------------------- void UndoRedo::RememberSetGen(bigint& oldgen, bigint& newgen, bigint& oldstartgen, bool oldsave) { std::string oldtempstart = currlayer->tempstart; std::string oldstartfile = currlayer->startfile; std::string oldcurrfile = currlayer->currfile; if (oldgen > oldstartgen && newgen <= oldstartgen) { // if pattern is generated then tempstart will be clobbered by // SaveStartingPattern, so change tempstart to a new temporary file currlayer->tempstart = CreateTempFileName("golly_setgen_"); // also need to update startfile and currfile (currlayer->savestart is true) currlayer->startfile = currlayer->tempstart; currlayer->currfile.clear(); } ClearRedoHistory(); // add setgen node to head of undo list ChangeNode* change = new ChangeNode(setgen); if (change == NULL) Fatal("Failed to create setgen node!"); change->oldgen = oldgen; change->newgen = newgen; change->oldstartgen = oldstartgen; change->newstartgen = currlayer->startgen; change->oldsave = oldsave; change->newsave = currlayer->savestart; change->oldtempstart = oldtempstart; change->newtempstart = currlayer->tempstart; change->oldstartfile = oldstartfile; change->newstartfile = currlayer->startfile; change->oldcurrfile = oldcurrfile; change->newcurrfile = currlayer->currfile; if (change->oldtempstart != change->newtempstart) { // save extra starting info set by previous SaveStartingPattern so that // Undoing this setgen change will restore the correct info for a Reset change->olddirty = currlayer->startdirty; change->oldalgo = currlayer->startalgo; change->oldrule = currlayer->startrule; change->oldx = currlayer->startx; change->oldy = currlayer->starty; change->oldmag = currlayer->startmag; change->oldbase = currlayer->startbase; change->oldexpo = currlayer->startexpo; change->oldsel = currlayer->startsel; change->oldname = currlayer->startname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { change->oldclone[i] = cloneptr->startname; } } } // following settings will be updated by next RememberGenStart call so that // Redoing this setgen change will restore the correct info for a Reset fixsetgen = true; change->newdirty = currlayer->startdirty; change->newalgo = currlayer->startalgo; change->newrule = currlayer->startrule; change->newx = currlayer->startx; change->newy = currlayer->starty; change->newmag = currlayer->startmag; change->newbase = currlayer->startbase; change->newexpo = currlayer->startexpo; change->newsel = currlayer->startsel; change->newname = currlayer->startname; if (currlayer->cloneid > 0) { for ( int i = 0; i < numlayers; i++ ) { Layer* cloneptr = GetLayer(i); if (cloneptr != currlayer && cloneptr->cloneid == currlayer->cloneid) { change->newclone[i] = cloneptr->startname; } } } } undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberNameChange(const char* oldname, const char* oldcurrfile, bool oldsave, bool olddirty) { if (oldname == currlayer->currname && oldcurrfile == currlayer->currfile && oldsave == currlayer->savestart && olddirty == currlayer->dirty) return; ClearRedoHistory(); // add namechange node to head of undo list ChangeNode* change = new ChangeNode(namechange); if (change == NULL) Fatal("Failed to create namechange node!"); change->oldname = oldname; change->newname = currlayer->currname; change->oldcurrfile = oldcurrfile; change->newcurrfile = currlayer->currfile; change->oldsave = oldsave; change->newsave = currlayer->savestart; change->olddirty = olddirty; change->newdirty = currlayer->dirty; // cloned layers share the same undo/redo history but each clone can have // a different name, so we need to remember which layer was changed change->whichlayer = currlayer; undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::DeletingClone(int index) { // the given cloned layer is about to be deleted, so we need to go thru the // undo/redo lists and, for each namechange node, set a matching whichlayer // ptr to NULL so DoChange can ignore later changes involving this layer; // very ugly, but I don't see any better solution if we're going to allow // cloned layers to have different names Layer* cloneptr = GetLayer(index); std::list::iterator node; node = undolist.begin(); while (node != undolist.end()) { ChangeNode* change = *node; if (change->changeid == namechange && change->whichlayer == cloneptr) change->whichlayer = NULL; node++; } node = redolist.begin(); while (node != redolist.end()) { ChangeNode* change = *node; if (change->changeid == namechange && change->whichlayer == cloneptr) change->whichlayer = NULL; node++; } } // ----------------------------------------------------------------------------- void UndoRedo::RememberRuleChange(const char* oldrule) { std::string newrule = currlayer->algo->getrule(); if (oldrule == newrule) return; ClearRedoHistory(); // add rulechange node to head of undo list ChangeNode* change = new ChangeNode(rulechange); if (change == NULL) Fatal("Failed to create rulechange node!"); change->oldrule = oldrule; change->newrule = newrule; // selection might have changed if grid became smaller change->oldsel = currlayer->savesel; change->newsel = currlayer->currsel; // SaveCellChange may have been called if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; } change->cellinfo = cellarray; change->cellcount = numchanges; numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } } undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberAlgoChange(algo_type oldalgo, const char* oldrule) { ClearRedoHistory(); // add algochange node to head of undo list ChangeNode* change = new ChangeNode(algochange); if (change == NULL) Fatal("Failed to create algochange node!"); change->oldalgo = oldalgo; change->newalgo = currlayer->algtype; change->oldrule = oldrule; change->newrule = currlayer->algo->getrule(); // selection might have changed if grid became smaller change->oldsel = currlayer->savesel; change->newsel = currlayer->currsel; // SaveCellChange may have been called if (numchanges > 0) { if (numchanges < maxchanges) { // reduce size of cellarray cell_change* newptr = (cell_change*) realloc(cellarray, numchanges * sizeof(cell_change)); if (newptr != NULL) cellarray = newptr; } change->cellinfo = cellarray; change->cellcount = numchanges; numchanges = 0; // reset for next SaveCellChange maxchanges = 0; // ditto if (badalloc) { Warning(lack_of_memory); badalloc = false; } } undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberScriptStart() { if (!undolist.empty()) { std::list::iterator node = undolist.begin(); ChangeNode* change = *node; if (change->changeid == scriptstart) { // ignore consecutive RememberScriptStart calls made by RunScript // due to cloned layers if (numclones == 0) Warning("Unexpected RememberScriptStart call!"); return; } } // add scriptstart node to head of undo list ChangeNode* change = new ChangeNode(scriptstart); if (change == NULL) Fatal("Failed to create scriptstart node!"); undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RememberScriptFinish() { if (undolist.empty()) { // this can happen if RunScript calls RememberScriptFinish multiple times // due to cloned layers AND the script made no changes if (numclones == 0) { // there should be at least a scriptstart node (see ClearUndoRedo) Warning("Bug detected in RememberScriptFinish!"); } return; } // if head of undo list is a scriptstart node then simply remove it // and return (ie. the script didn't make any changes) std::list::iterator node = undolist.begin(); ChangeNode* change = *node; if (change->changeid == scriptstart) { undolist.erase(node); delete change; return; } else if (change->changeid == scriptfinish) { // ignore consecutive RememberScriptFinish calls made by RunScript // due to cloned layers if (numclones == 0) Warning("Unexpected RememberScriptFinish call!"); return; } // add scriptfinish node to head of undo list change = new ChangeNode(scriptfinish); if (change == NULL) Fatal("Failed to create scriptfinish node!"); undolist.push_front(change); } // ----------------------------------------------------------------------------- bool UndoRedo::CanUndo() { // we need to allow undo if generating even though undo list might be empty // (selecting Undo will stop generating and add genchange node to undo list) if (allowundo && generating) return true; return !undolist.empty() && !inscript; } // ----------------------------------------------------------------------------- bool UndoRedo::CanRedo() { return !redolist.empty() && !inscript && !generating; } // ----------------------------------------------------------------------------- void UndoRedo::UndoChange() { if (!CanUndo()) return; // get change info from head of undo list and do the change std::list::iterator node = undolist.begin(); ChangeNode* change = *node; if (change->changeid == scriptfinish) { // undo all changes between scriptfinish and scriptstart nodes; // first remove scriptfinish node from undo list and add it to redo list undolist.erase(node); redolist.push_front(change); while (change->changeid != scriptstart) { // call UndoChange recursively; temporarily set doingscriptchanges so // UndoChange won't return if DoChange is aborted doingscriptchanges = true; UndoChange(); doingscriptchanges = false; node = undolist.begin(); if (node == undolist.end()) Fatal("Bug in UndoChange!"); change = *node; } // continue below so that scriptstart node is removed from undo list // and added to redo list } else { // user might abort the undo (eg. a lengthy rotate/flip) if (!change->DoChange(true) && !doingscriptchanges) return; } // remove node from head of undo list (doesn't delete node's data) undolist.erase(node); if (change->changeid < selchange && change->olddirty != change->newdirty) { // change dirty flag if (change->olddirty) { currlayer->dirty = false; // make sure it changes MarkLayerDirty(); } else { MarkLayerClean(currlayer->currname.c_str()); } } // add change to head of redo list redolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::RedoChange() { if (!CanRedo()) return; // get change info from head of redo list and do the change std::list::iterator node = redolist.begin(); ChangeNode* change = *node; if (change->changeid == scriptstart) { // redo all changes between scriptstart and scriptfinish nodes; // first remove scriptstart node from redo list and add it to undo list redolist.erase(node); undolist.push_front(change); while (change->changeid != scriptfinish) { // call RedoChange recursively; temporarily set doingscriptchanges so // RedoChange won't return if DoChange is aborted doingscriptchanges = true; RedoChange(); doingscriptchanges = false; node = redolist.begin(); if (node == redolist.end()) Fatal("Bug in RedoChange!"); change = *node; } // continue below so that scriptfinish node is removed from redo list // and added to undo list } else { // user might abort the redo (eg. a lengthy rotate/flip) if (!change->DoChange(false) && !doingscriptchanges) return; } // remove node from head of redo list (doesn't delete node's data) redolist.erase(node); if (change->changeid < selchange && change->olddirty != change->newdirty) { // change dirty flag if (change->newdirty) { currlayer->dirty = false; // make sure it changes MarkLayerDirty(); } else { MarkLayerClean(currlayer->currname.c_str()); } } // add change to head of undo list undolist.push_front(change); } // ----------------------------------------------------------------------------- void UndoRedo::ClearUndoRedo() { // free cellarray in case there were SaveCellChange calls not followed // by ForgetCellChanges or RememberCellChanges ForgetCellChanges(); if (startcount > 0) { // RememberGenStart was not followed by RememberGenFinish if (!prevfile.empty() && FileExists(prevfile)) { RemoveFile(prevfile); } prevfile.clear(); startcount = 0; } // clear the undo/redo lists (and delete each node's data) ClearUndoHistory(); ClearRedoHistory(); fixsetgen = false; if (inscript) { // script has called a command like new() so add a scriptstart node // to the undo list to match the final scriptfinish node RememberScriptStart(); // reset flags to indicate no pending cell/gen changes savecellchanges = false; savegenchanges = false; } } // ----------------------------------------------------------------------------- bool CopyTempFiles(ChangeNode* srcnode, ChangeNode* destnode, const char* tempstart1) { // if srcnode has any existing temporary files then create new // temporary file names in the destnode and copy each file bool allcopied = true; if ( !srcnode->oldfile.empty() && FileExists(srcnode->oldfile) ) { destnode->oldfile = CreateTempFileName("golly_dupe1_"); if ( !CopyFile(srcnode->oldfile, destnode->oldfile) ) allcopied = false; } if ( !srcnode->newfile.empty() && FileExists(srcnode->newfile) ) { destnode->newfile = CreateTempFileName("golly_dupe2_"); if ( !CopyFile(srcnode->newfile, destnode->newfile) ) allcopied = false; } if ( !srcnode->oldtempstart.empty() && FileExists(srcnode->oldtempstart) ) { if (srcnode->oldtempstart == currlayer->tempstart) { // the file has already been copied to tempstart1 by Layer::Layer() destnode->oldtempstart = tempstart1; } else { destnode->oldtempstart = CreateTempFileName("golly_dupe3_"); if ( !CopyFile(srcnode->oldtempstart, destnode->oldtempstart) ) allcopied = false; } if (srcnode->oldstartfile == srcnode->oldtempstart) destnode->oldstartfile = destnode->oldtempstart; if (srcnode->oldcurrfile == srcnode->oldtempstart) destnode->oldcurrfile = destnode->oldtempstart; } if ( !srcnode->newtempstart.empty() && FileExists(srcnode->newtempstart) ) { if (srcnode->newtempstart == currlayer->tempstart) { // the file has already been copied to tempstart1 by Layer::Layer() destnode->newtempstart = tempstart1; } else { destnode->newtempstart = CreateTempFileName("golly_dupe4_"); if ( !CopyFile(srcnode->newtempstart, destnode->newtempstart) ) allcopied = false; } if (srcnode->newstartfile == srcnode->newtempstart) destnode->newstartfile = destnode->newtempstart; if (srcnode->newcurrfile == srcnode->newtempstart) destnode->newcurrfile = destnode->newtempstart; } return allcopied; } // ----------------------------------------------------------------------------- void UndoRedo::DuplicateHistory(Layer* oldlayer, Layer* newlayer) { UndoRedo* history = oldlayer->undoredo; // clear the undo/redo lists; note that UndoRedo::UndoRedo has added // a scriptstart node to undolist if inscript is true, but we don't // want that here because the old layer's history will already have one ClearUndoHistory(); ClearRedoHistory(); // safer to do our own shallow copy (avoids setting undolist/redolist) savecellchanges = history->savecellchanges; savegenchanges = history->savegenchanges; doingscriptchanges = history->doingscriptchanges; numchanges = history->numchanges; maxchanges = history->maxchanges; badalloc = history->badalloc; prevfile = history->prevfile; prevgen = history->prevgen; prevx = history->prevx; prevy = history->prevy; prevmag = history->prevmag; prevbase = history->prevbase; prevexpo = history->prevexpo; prevsel = history->prevsel; startcount = history->startcount; fixsetgen = history->fixsetgen; // copy existing temporary file to new name if ( !prevfile.empty() && FileExists(prevfile) ) { prevfile = CreateTempFileName(temp_prefix); if ( !CopyFile(history->prevfile, prevfile) ) { Warning("Could not copy prevfile!"); return; } } // do a deep copy of dynamically allocated data cellarray = NULL; if (numchanges > 0 && history->cellarray) { cellarray = (cell_change*) malloc(maxchanges * sizeof(cell_change)); if (cellarray == NULL) { Warning("Could not allocate cellarray!"); return; } // copy history->cellarray data to this cellarray memcpy(cellarray, history->cellarray, numchanges * sizeof(cell_change)); } std::list::iterator node; // build a new undolist using history->undolist node = history->undolist.begin(); while (node != undolist.end()) { ChangeNode* change = *node; ChangeNode* newchange = new ChangeNode(change->changeid); if (newchange == NULL) { Warning("Failed to copy undolist!"); ClearUndoHistory(); return; } // shallow copy the change node *newchange = *change; // deep copy any dynamically allocated data if (change->cellinfo) { int bytes = change->cellcount * sizeof(cell_change); newchange->cellinfo = (cell_change*) malloc(bytes); if (newchange->cellinfo == NULL) { Warning("Could not copy undolist!"); ClearUndoHistory(); return; } memcpy(newchange->cellinfo, change->cellinfo, bytes); } // copy any existing temporary files to new names if (!CopyTempFiles(change, newchange, newlayer->tempstart.c_str())) { Warning("Failed to copy temporary file in undolist!"); ClearUndoHistory(); return; } // if node is a name change then update whichlayer to point to new layer if (newchange->changeid == namechange) { newchange->whichlayer = newlayer; } undolist.push_back(newchange); node++; } // build a new redolist using history->redolist node = history->redolist.begin(); while (node != redolist.end()) { ChangeNode* change = *node; ChangeNode* newchange = new ChangeNode(change->changeid); if (newchange == NULL) { Warning("Failed to copy redolist!"); ClearRedoHistory(); return; } // shallow copy the change node *newchange = *change; // deep copy any dynamically allocated data if (change->cellinfo) { int bytes = change->cellcount * sizeof(cell_change); newchange->cellinfo = (cell_change*) malloc(bytes); if (newchange->cellinfo == NULL) { Warning("Could not copy redolist!"); ClearRedoHistory(); return; } memcpy(newchange->cellinfo, change->cellinfo, bytes); } // copy any existing temporary files to new names if (!CopyTempFiles(change, newchange, newlayer->tempstart.c_str())) { Warning("Failed to copy temporary file in redolist!"); ClearRedoHistory(); return; } // if node is a name change then update whichlayer to point to new layer if (newchange->changeid == namechange) { newchange->whichlayer = newlayer; } redolist.push_back(newchange); node++; } } golly-2.5-src/gui-ios/Golly/utils.h0000644000175100001440000000747612156145314014204 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _UTILS_H_ #define _UTILS_H_ class lifepoll; #include // for std::string // Various types and utility routines: typedef struct { unsigned char r; unsigned char g; unsigned char b; } gColor; // a color in RGB space typedef struct { int x; int y; int width; int height; } gRect; // a rectangle void SetColor(gColor& color, unsigned char red, unsigned char green, unsigned char blue); // Set given gColor to given RGB values. void SetRect(gRect& rect, int x, int y, int width, int height); // Set given gRect to given location and size. void Warning(const char* msg); // Beep and display message in a modal dialog. bool YesNo(const char* msg); // Similar to Warning, but there are 2 buttons: Yes and No. // Returns true if Yes button is hit. void Fatal(const char* msg); // Beep, display message in a modal dialog, then exit app. void Beep(); // Play beep sound, depending on user setting. double TimeInSeconds(); // Get time of day, in seconds (accuracy in microsecs). std::string CreateTempFileName(const char* prefix); // Return path to a unique temporary file. bool FileExists(const std::string& filepath); // Does given file exist? void RemoveFile(const std::string& filepath); // Delete given file. bool CopyFile(const std::string& inpath, const std::string& outpath); // Return true if input file is successfully copied to output file. // If the output file existed it is replaced. bool MoveFile(const std::string& inpath, const std::string& outpath); // Return true if input file is successfully moved to output file. // If the output file existed it is replaced. void FixURLPath(std::string& path); // Replace "%..." with suitable chars for a file path (eg. %20 is changed to space). bool IsHTMLFile(const std::string& filename); // Return true if the given file's extension is .htm or .html // (ignoring case). bool IsTextFile(const std::string& filename); // Return true if the given file's extension is .txt or .doc, // or if it's not a HTML file and its name contains "readme" // (ignoring case). bool IsZipFile(const std::string& filename); // Return true if the given file's extension is .zip or .gar // (ignoring case). bool IsRuleFile(const std::string& filename); // Return true if the given file is a rule-related file with // an extension of .rule or .table or .tree or .colors or .icons // (ignoring case). bool IsScriptFile(const std::string& filename); // Return true if the given file is a Perl or Python script. // It simply checks if the file's extension is .pl or .py // (ignoring case). bool EndsWith(const std::string& str, const std::string& suffix); // Return true if given string ends with given suffix. lifepoll* Poller(); void PollerReset(); void PollerInterrupt(); extern int event_checker; // Poller is used by gollybase modules to process events. // If event_checker > 0 then we've been called from the event checking code. #endif golly-2.5-src/gui-ios/Golly/utils.m0000644000175100001440000003005112156145314014172 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #import #include // for gettimeofday #include "lifepoll.h" // for lifepoll #include "prefs.h" // for allowbeep, tempdir #include "utils.h" #import "PatternViewController.h" // for UpdateStatus // ----------------------------------------------------------------------------- int event_checker = 0; // if > 0 then we're checking for events in currentRunLoop // ----------------------------------------------------------------------------- void SetColor(gColor& color, unsigned char red, unsigned char green, unsigned char blue) { color.r = red; color.g = green; color.b = blue; } // ----------------------------------------------------------------------------- void SetRect(gRect& rect, int x, int y, int width, int height) { rect.x = x; rect.y = y; rect.width = width; rect.height = height; } // ----------------------------------------------------------------------------- // need the following to make YesNo/Warning/Fatal dialogs modal: @interface ModalAlertDelegate : NSObject { NSInteger returnButt; } @property () NSInteger returnButt; - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex; @end @implementation ModalAlertDelegate @synthesize returnButt; - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { returnButt = buttonIndex; } @end // ----------------------------------------------------------------------------- bool YesNo(const char* msg) { Beep(); ModalAlertDelegate *md = [[ModalAlertDelegate alloc] init]; md.returnButt = -1; UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"Warning" message:[NSString stringWithCString:msg encoding:NSUTF8StringEncoding] delegate:md cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; [a show]; // wait for user to hit button while (md.returnButt == -1) { event_checker++; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; event_checker--; } return md.returnButt != 0; } // ----------------------------------------------------------------------------- void Warning(const char* msg) { Beep(); ModalAlertDelegate *md = [[ModalAlertDelegate alloc] init]; md.returnButt = -1; UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"Warning" message:[NSString stringWithCString:msg encoding:NSUTF8StringEncoding] delegate:md cancelButtonTitle:@"OK" otherButtonTitles:nil]; [a show]; // wait for user to hit button while (md.returnButt == -1) { event_checker++; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; event_checker--; } } // ----------------------------------------------------------------------------- void Fatal(const char* msg) { Beep(); ModalAlertDelegate *md = [[ModalAlertDelegate alloc] init]; md.returnButt = -1; UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"Fatal Error" message:[NSString stringWithCString:msg encoding:NSUTF8StringEncoding] delegate:md cancelButtonTitle:@"Quit" otherButtonTitles:nil]; [a show]; // wait for user to hit button while (md.returnButt == -1) { event_checker++; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; event_checker--; } exit(1); } // ----------------------------------------------------------------------------- static SystemSoundID beepID = 0; void Beep() { if (allowbeep) { if (beepID == 0) { // get the path to the sound file NSString* path = [[NSBundle mainBundle] pathForResource:@"beep" ofType:@"aiff"]; if (path) { NSURL* url = [NSURL fileURLWithPath:path]; OSStatus err = AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &beepID); if (err == kAudioServicesNoError && beepID > 0) { // play the sound AudioServicesPlaySystemSound(beepID); } } } else { // assume we got the sound AudioServicesPlaySystemSound(beepID); } } } // ----------------------------------------------------------------------------- double TimeInSeconds() { struct timeval trec; gettimeofday(&trec, 0); return double(trec.tv_sec) + double(trec.tv_usec) / 1.0e6; } // ----------------------------------------------------------------------------- static int nextname = 0; std::string CreateTempFileName(const char* prefix) { /* std::string tmplate = tempdir; tmplate += prefix; tmplate += ".XXXXXX"; std::string path = mktemp((char*)tmplate.c_str()); */ // simpler to ignore prefix and create /tmp/0, /tmp/1, /tmp/2, etc char n[32]; sprintf(n, "%d", nextname++); std::string path = tempdir + n; return path; } // ----------------------------------------------------------------------------- bool FileExists(const std::string& filepath) { FILE* f = fopen(filepath.c_str(), "r"); if (f) { fclose(f); return true; } else { return false; } } // ----------------------------------------------------------------------------- void RemoveFile(const std::string& filepath) { if ([[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithCString:filepath.c_str() encoding:NSUTF8StringEncoding] error:NULL] == NO) { // should never happen Warning("RemoveFile failed!"); }; } // ----------------------------------------------------------------------------- bool CopyFile(const std::string& inpath, const std::string& outpath) { if (FileExists(outpath)) { RemoveFile(outpath); } return [[NSFileManager defaultManager] copyItemAtPath:[NSString stringWithCString:inpath.c_str() encoding:NSUTF8StringEncoding] toPath:[NSString stringWithCString:outpath.c_str() encoding:NSUTF8StringEncoding] error:NULL]; } // ----------------------------------------------------------------------------- bool MoveFile(const std::string& inpath, const std::string& outpath) { if (FileExists(outpath)) { RemoveFile(outpath); } return [[NSFileManager defaultManager] moveItemAtPath:[NSString stringWithCString:inpath.c_str() encoding:NSUTF8StringEncoding] toPath:[NSString stringWithCString:outpath.c_str() encoding:NSUTF8StringEncoding] error:NULL]; } // ----------------------------------------------------------------------------- void FixURLPath(std::string& path) { // replace "%..." with suitable chars for a file path (eg. %20 is changed to space) NSString* newpath = [[NSString stringWithCString:path.c_str() encoding:NSUTF8StringEncoding] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; if (newpath) path = [newpath cStringUsingEncoding:NSUTF8StringEncoding]; } // ----------------------------------------------------------------------------- bool IsHTMLFile(const std::string& filename) { size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"htm") == 0 || strcasecmp(ext.c_str(),"html") == 0 ); } // ----------------------------------------------------------------------------- bool IsTextFile(const std::string& filename) { if (!IsHTMLFile(filename)) { // if non-html file name contains "readme" then assume it's a text file std::string basename = filename; size_t lastsep = basename.rfind('/'); if (lastsep != std::string::npos) { basename = basename.substr(lastsep+1); } std::transform(basename.begin(), basename.end(), basename.begin(), std::tolower); if (basename.find("readme") != std::string::npos) return true; } size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"txt") == 0 || strcasecmp(ext.c_str(),"doc") == 0 ); } // ----------------------------------------------------------------------------- bool IsZipFile(const std::string& filename) { size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"zip") == 0 || strcasecmp(ext.c_str(),"gar") == 0 ); } // ----------------------------------------------------------------------------- bool IsRuleFile(const std::string& filename) { size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"rule") == 0 || strcasecmp(ext.c_str(),"table") == 0 || strcasecmp(ext.c_str(),"tree") == 0 || strcasecmp(ext.c_str(),"colors") == 0 || strcasecmp(ext.c_str(),"icons") == 0 ); } // ----------------------------------------------------------------------------- bool IsScriptFile(const std::string& filename) { size_t dotpos = filename.rfind('.'); if (dotpos == std::string::npos) return false; std::string ext = filename.substr(dotpos+1); return ( strcasecmp(ext.c_str(),"pl") == 0 || strcasecmp(ext.c_str(),"py") == 0 ); } // ----------------------------------------------------------------------------- bool EndsWith(const std::string& str, const std::string& suffix) { // return true if str ends with suffix size_t strlen = str.length(); size_t sufflen = suffix.length(); return (strlen >= sufflen) && (str.rfind(suffix) == strlen - sufflen); } // ----------------------------------------------------------------------------- // let gollybase modules process events class ios_poll : public lifepoll { public: virtual int checkevents(); virtual void updatePop(); }; int ios_poll::checkevents() { if (event_checker > 0) return isInterrupted(); event_checker++; [[NSRunLoop currentRunLoop] runUntilDate:[NSDate date]]; event_checker--; return isInterrupted(); } void ios_poll::updatePop() { UpdateStatus(); } ios_poll iospoller; // create instance lifepoll* Poller() { return &iospoller; } void PollerReset() { iospoller.resetInterrupted(); } void PollerInterrupt() { iospoller.setInterrupted(); } golly-2.5-src/gui-ios/Golly/view.h0000644000175100001440000000613612156145314014006 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #ifndef _VIEW_H_ #define _VIEW_H_ #include "bigint.h" // for bigint #include "lifealgo.h" // for lifealgo #include "utils.h" // for gRect // Data and routines for viewing and editing patterns: extern const char* empty_selection; extern const char* empty_outside; extern const char* no_selection; extern const char* selection_too_big; extern const char* pattern_too_big; extern const char* origin_restored; extern bool fullscreen; // in full screen mode? extern bool nopattupdate; // disable pattern updates? extern bool waitingforpaste; // waiting for user to decide what to do with paste image? extern gRect pasterect; // bounding box of paste image extern int pastex, pastey; // where user wants to paste clipboard pattern extern bool draw_pending; // delay drawing? extern int pendingx, pendingy; // start of delayed drawing void UpdateEverything(); void UpdatePatternAndStatus(); bool OutsideLimits(bigint& t, bigint& l, bigint& b, bigint& r); void TestAutoFit(); void FitInView(int force); void TouchBegan(int x, int y); void TouchMoved(int x, int y); void TouchEnded(); int SmallScroll(int xysize); bool CopyRect(int top, int left, int bottom, int right, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, const char* progmsg); void CopyAllRect(int top, int left, int bottom, int right, lifealgo* srcalgo, lifealgo* destalgo, const char* progmsg); bool SelectionExists(); void SelectAll(); void RemoveSelection(); void FitSelection(); void DisplaySelectionSize(); void SaveCurrentSelection(); void RememberNewSelection(const char* action); void CutSelection(); void CopySelection(); void ClearSelection(); void ClearOutsideSelection(); void ShrinkSelection(bool fit); void RandomFill(); bool FlipSelection(bool topbottom, bool inundoredo = false); bool RotateSelection(bool clockwise, bool inundoredo = false); void PasteClipboard(); bool FlipPastePattern(bool topbottom); bool RotatePastePattern(bool clockwise); void DoPaste(bool toselection); void AbortPaste(); void ZoomInPos(int x, int y); void ZoomOutPos(int x, int y); bool PointInPasteImage(int x, int y); bool PointInSelection(int x, int y); #endif golly-2.5-src/gui-ios/Golly/view.m0000644000175100001440000013664712156145314014026 00000000000000/*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2013 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include "bigint.h" #include "lifealgo.h" #include "qlifealgo.h" #include "hlifealgo.h" #include "viewport.h" #include "utils.h" // for Warning, Fatal, YesNo, Beep, etc #include "prefs.h" // for showgridlines, etc #include "status.h" // for DisplayMessage, etc #include "render.h" // for CreatePasteImage, DestroyPasteImage #include "undo.h" // for currlayer->undoredo->... #include "select.h" // for Selection #include "algos.h" // for algo_type, *_ALGO, CreateNewUniverse, etc #include "layer.h" // for currlayer, ResizeLayers, etc #include "control.h" // for generating, ChangeRule #include "file.h" // for GetTextFromClipboard #include "view.h" #import "PatternViewController.h" // for UpdatePattern, BeginProgress, etc // ----------------------------------------------------------------------------- // exported data: const char* empty_selection = "There are no live cells in the selection."; const char* empty_outside = "There are no live cells outside the selection."; const char* no_selection = "There is no selection."; const char* selection_too_big = "Selection is outside +/- 10^9 boundary."; const char* pattern_too_big = "Pattern is outside +/- 10^9 boundary."; const char* origin_restored = "Origin restored."; bool fullscreen = false; // in full screen mode? bool nopattupdate = false; // disable pattern updates? bool waitingforpaste = false; // waiting for user to decide what to do with paste image? gRect pasterect; // bounding box of paste image int pastex, pastey; // where user wants to paste clipboard pattern bool draw_pending = false; // delay drawing? int pendingx, pendingy; // start of delayed drawing // ----------------------------------------------------------------------------- // local data: static int cellx, celly; // current cell's 32-bit position static bigint bigcellx, bigcelly; // current cell's position static int initselx, initsely; // location of initial selection click static bool forceh; // resize selection horizontally? static bool forcev; // resize selection vertically? static bigint anchorx, anchory; // anchor cell of current selection static Selection prevsel; // previous selection static int drawstate; // new cell state (0..255) static lifealgo* pastealgo = NULL; // temporary universe with pattern to be pasted static gRect pastebox; // bounding box for paste pattern static std::string oldrule; // rule before readclipboard is called static std::string newrule; // rule after readclipboard is called static int newalgotype; // new algo type created by readclipboard static bool drawingcells = false; // drawing cells by dragging finger? static bool pickingcells = false; // picking cell states by dragging finger? static bool selectingcells = false; // selecting cells by dragging finger? static bool movingview = false; // moving view by dragging finger? static bool movingpaste = false; // moving paste image by dragging finger? // ----------------------------------------------------------------------------- void UpdatePatternAndStatus() { if (inscript || currlayer->undoredo->doingscriptchanges) return; UpdatePattern(); UpdateStatus(); } // ----------------------------------------------------------------------------- void UpdateEverything() { UpdatePattern(); UpdateStatus(); UpdateEditBar(); } // ----------------------------------------------------------------------------- // most editing operations are limited to absolute coordinates <= 10^9 because // getcell and setcell only take int parameters (the limits must be smaller // than INT_MIN and INT_MAX to avoid boundary conditions) static bigint min_coord = -1000000000; static bigint max_coord = +1000000000; bool OutsideLimits(bigint& t, bigint& l, bigint& b, bigint& r) { return ( t < min_coord || l < min_coord || b > max_coord || r > max_coord ); } // ----------------------------------------------------------------------------- void TestAutoFit() { if (currlayer->autofit && generating) { // assume user no longer wants us to do autofitting currlayer->autofit = false; } } // ----------------------------------------------------------------------------- void FitInView(int force) { currlayer->algo->fit(*currlayer->view, force); } // ----------------------------------------------------------------------------- bool PointInView(int x, int y) { return ( x >= 0 && x <= currlayer->view->getxmax() && y >= 0 && y <= currlayer->view->getymax() ); } // ----------------------------------------------------------------------------- bool PointInPasteImage(int x, int y) { return (x >= pasterect.x && x <= pasterect.x + pasterect.width-1 && y >= pasterect.y && y <= pasterect.y + pasterect.height-1); } // ----------------------------------------------------------------------------- bool PointInSelection(int x, int y) { pair cellpos = currlayer->view->at(x, y); int cx = cellpos.first.toint(); int cy = cellpos.second.toint(); return currlayer->currsel.ContainsCell(cx, cy); } // ----------------------------------------------------------------------------- bool CellInGrid(const bigint& x, const bigint& y) { // return true if cell at x,y is within bounded grid if (currlayer->algo->gridwd > 0 && (x < currlayer->algo->gridleft || x > currlayer->algo->gridright)) return false; if (currlayer->algo->gridht > 0 && (y < currlayer->algo->gridtop || y > currlayer->algo->gridbottom)) return false; return true; } // ----------------------------------------------------------------------------- bool PointInGrid(int x, int y) { // is given viewport location also in grid? if (currlayer->algo->gridwd == 0 && currlayer->algo->gridht == 0) { // unbounded grid return true; } pair cellpos = currlayer->view->at(x, y); return CellInGrid(cellpos.first, cellpos.second); } // ----------------------------------------------------------------------------- void RememberOneCellChange(int cx, int cy, int oldstate, int newstate) { if (allowundo) { // remember this cell change for later undo/redo currlayer->undoredo->SaveCellChange(cx, cy, oldstate, newstate); } } // ----------------------------------------------------------------------------- void DrawCells(int x, int y) { // make sure x,y is within viewport if (x < 0) x = 0; if (y < 0) y = 0; if (x > currlayer->view->getxmax()) x = currlayer->view->getxmax(); if (y > currlayer->view->getymax()) y = currlayer->view->getymax(); // make sure x,y is within bounded grid pair cellpos = currlayer->view->at(x, y); if (currlayer->algo->gridwd > 0) { if (cellpos.first < currlayer->algo->gridleft) cellpos.first = currlayer->algo->gridleft; if (cellpos.first > currlayer->algo->gridright) cellpos.first = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (cellpos.second < currlayer->algo->gridtop) cellpos.second = currlayer->algo->gridtop; if (cellpos.second > currlayer->algo->gridbottom) cellpos.second = currlayer->algo->gridbottom; } if ( currlayer->view->getmag() < 0 || OutsideLimits(cellpos.second, cellpos.first, cellpos.second, cellpos.first) ) { return; } int currstate; int numchanged = 0; int newx = cellpos.first.toint(); int newy = cellpos.second.toint(); if ( newx != cellx || newy != celly ) { // draw a line of cells using Bresenham's algorithm int d, ii, jj, di, ai, si, dj, aj, sj; di = newx - cellx; ai = abs(di) << 1; si = (di < 0)? -1 : 1; dj = newy - celly; aj = abs(dj) << 1; sj = (dj < 0)? -1 : 1; ii = cellx; jj = celly; lifealgo* curralgo = currlayer->algo; if (ai > aj) { d = aj - (ai >> 1); while (ii != newx) { currstate = curralgo->getcell(ii, jj); if (currstate != drawstate) { curralgo->setcell(ii, jj, drawstate); RememberOneCellChange(ii, jj, currstate, drawstate); numchanged++; } if (d >= 0) { jj += sj; d -= ai; } ii += si; d += aj; } } else { d = ai - (aj >> 1); while (jj != newy) { currstate = curralgo->getcell(ii, jj); if (currstate != drawstate) { curralgo->setcell(ii, jj, drawstate); RememberOneCellChange(ii, jj, currstate, drawstate); numchanged++; } if (d >= 0) { ii += si; d -= aj; } jj += sj; d += ai; } } cellx = newx; celly = newy; currstate = curralgo->getcell(cellx, celly); if (currstate != drawstate) { curralgo->setcell(cellx, celly, drawstate); RememberOneCellChange(cellx, celly, currstate, drawstate); numchanged++; } } if (numchanged > 0) { currlayer->algo->endofpattern(); MarkLayerDirty(); UpdatePattern(); UpdateStatus(); } } // ----------------------------------------------------------------------------- void StartDrawingCells(int x, int y) { if (generating) { // temporarily stop generating when drawing cells (necessary for undo/redo) PauseGenerating(); if (event_checker > 0) { // delay drawing until after step() finishes in NextGeneration() draw_pending = true; pendingx = x; pendingy = y; return; } // NOTE: ResumeGenerating() is called in TouchEnded() } if (!PointInGrid(x, y)) { ErrorMessage("Drawing is not allowed outside grid."); return; } if (currlayer->view->getmag() < 0) { ErrorMessage("Drawing is not allowed at scales greater than 1 cell per pixel."); return; } // check that x,y is within getcell/setcell limits pair cellpos = currlayer->view->at(x, y); if ( OutsideLimits(cellpos.second, cellpos.first, cellpos.second, cellpos.first) ) { ErrorMessage("Drawing is not allowed outside +/- 10^9 boundary."); return; } drawingcells = true; // save dirty state now for later use by RememberCellChanges if (allowundo) currlayer->savedirty = currlayer->dirty; cellx = cellpos.first.toint(); celly = cellpos.second.toint(); int currstate = currlayer->algo->getcell(cellx, celly); // reset drawing state in case it's no longer valid (due to algo/rule change) if (currlayer->drawingstate >= currlayer->algo->NumCellStates()) { currlayer->drawingstate = 1; } if (currstate == currlayer->drawingstate) { drawstate = 0; } else { drawstate = currlayer->drawingstate; } if (currstate != drawstate) { currlayer->algo->setcell(cellx, celly, drawstate); currlayer->algo->endofpattern(); // remember this cell change for later undo/redo RememberOneCellChange(cellx, celly, currstate, drawstate); MarkLayerDirty(); UpdatePattern(); UpdateStatus(); // update population count } } // ----------------------------------------------------------------------------- void PickCell(int x, int y) { if (!PointInGrid(x, y)) return; pair cellpos = currlayer->view->at(x, y); if ( currlayer->view->getmag() < 0 || OutsideLimits(cellpos.second, cellpos.first, cellpos.second, cellpos.first) ) { return; } int newx = cellpos.first.toint(); int newy = cellpos.second.toint(); if ( newx != cellx || newy != celly ) { cellx = newx; celly = newy; currlayer->drawingstate = currlayer->algo->getcell(cellx, celly); UpdateEditBar(); } } // ----------------------------------------------------------------------------- void StartPickingCells(int x, int y) { if (!PointInGrid(x, y)) { ErrorMessage("Picking is not allowed outside grid."); return; } if (currlayer->view->getmag() < 0) { ErrorMessage("Picking is not allowed at scales greater than 1 cell per pixel."); return; } cellx = INT_MAX; celly = INT_MAX; PickCell(x, y); pickingcells = true; } // ----------------------------------------------------------------------------- void SelectCells(int x, int y) { // only select cells within view if (x < 0) x = 0; if (y < 0) y = 0; if (x > currlayer->view->getxmax()) x = currlayer->view->getxmax(); if (y > currlayer->view->getymax()) y = currlayer->view->getymax(); if ( abs(initselx - x) < 2 && abs(initsely - y) < 2 && !SelectionExists() ) { // avoid 1x1 selection if finger hasn't moved much return; } // make sure x,y is within bounded grid pair cellpos = currlayer->view->at(x, y); if (currlayer->algo->gridwd > 0) { if (cellpos.first < currlayer->algo->gridleft) cellpos.first = currlayer->algo->gridleft; if (cellpos.first > currlayer->algo->gridright) cellpos.first = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (cellpos.second < currlayer->algo->gridtop) cellpos.second = currlayer->algo->gridtop; if (cellpos.second > currlayer->algo->gridbottom) cellpos.second = currlayer->algo->gridbottom; } if (forceh && forcev) { // move selection bigint xdelta = cellpos.first; bigint ydelta = cellpos.second; xdelta -= bigcellx; ydelta -= bigcelly; if ( xdelta != bigint::zero || ydelta != bigint::zero ) { currlayer->currsel.Move(xdelta, ydelta); bigcellx = cellpos.first; bigcelly = cellpos.second; } } else { // change selection size if (!forcev) currlayer->currsel.SetLeftRight(cellpos.first, anchorx); if (!forceh) currlayer->currsel.SetTopBottom(cellpos.second, anchory); } if (currlayer->currsel != prevsel) { // selection has changed DisplaySelectionSize(); prevsel = currlayer->currsel; UpdatePatternAndStatus(); } } // ----------------------------------------------------------------------------- void StartSelectingCells(int x, int y) { TestAutoFit(); // make sure anchor cell is within bounded grid (x,y can be outside grid) pair cellpos = currlayer->view->at(x, y); if (currlayer->algo->gridwd > 0) { if (cellpos.first < currlayer->algo->gridleft) cellpos.first = currlayer->algo->gridleft; if (cellpos.first > currlayer->algo->gridright) cellpos.first = currlayer->algo->gridright; } if (currlayer->algo->gridht > 0) { if (cellpos.second < currlayer->algo->gridtop) cellpos.second = currlayer->algo->gridtop; if (cellpos.second > currlayer->algo->gridbottom) cellpos.second = currlayer->algo->gridbottom; } anchorx = cellpos.first; anchory = cellpos.second; bigcellx = anchorx; bigcelly = anchory; // save original selection for RememberNewSelection currlayer->savesel = currlayer->currsel; // reset previous selection prevsel.Deselect(); // for avoiding 1x1 selection if finger doesn't move much initselx = x; initsely = y; // allow changing size in any direction forceh = false; forcev = false; if (SelectionExists()) { if (PointInSelection(x, y)) { // modify current selection currlayer->currsel.Modify(x, y, anchorx, anchory, &forceh, &forcev); DisplaySelectionSize(); } else { // remove current selection currlayer->currsel.Deselect(); } UpdatePatternAndStatus(); } selectingcells = true; } // ----------------------------------------------------------------------------- void MoveView(int x, int y) { pair cellpos = currlayer->view->at(x, y); bigint xdelta = bigcellx; bigint ydelta = bigcelly; xdelta -= cellpos.first; ydelta -= cellpos.second; int xamount, yamount; int mag = currlayer->view->getmag(); if (mag >= 0) { // move an integral number of cells xamount = xdelta.toint() << mag; yamount = ydelta.toint() << mag; } else { // convert cell deltas to screen pixels xdelta >>= -mag; ydelta >>= -mag; xamount = xdelta.toint(); yamount = ydelta.toint(); } if ( xamount != 0 || yamount != 0 ) { currlayer->view->move(xamount, yamount); cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; UpdatePattern(); UpdateStatus(); } } // ----------------------------------------------------------------------------- void StartMovingView(int x, int y) { TestAutoFit(); pair cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; movingview = true; } // ----------------------------------------------------------------------------- void MovePaste(int x, int y) { pair cellpos = currlayer->view->at(x, y); bigint xdelta = bigcellx; bigint ydelta = bigcelly; xdelta -= cellpos.first; ydelta -= cellpos.second; int xamount, yamount; int mag = currlayer->view->getmag(); if (mag >= 0) { // move an integral number of cells xamount = xdelta.toint() << mag; yamount = ydelta.toint() << mag; } else { // convert cell deltas to screen pixels xdelta >>= -mag; ydelta >>= -mag; xamount = xdelta.toint(); yamount = ydelta.toint(); } if ( xamount != 0 || yamount != 0 ) { // shift location of pasterect pastex -= xamount; pastey -= yamount; cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; UpdatePattern(); } } // ----------------------------------------------------------------------------- void StartMovingPaste(int x, int y) { pair cellpos = currlayer->view->at(x, y); bigcellx = cellpos.first; bigcelly = cellpos.second; movingpaste = true; } // ----------------------------------------------------------------------------- void TouchBegan(int x, int y) { if (waitingforpaste && PointInPasteImage(x, y)) { StartMovingPaste(x, y); } else if (currlayer->touchmode == drawmode) { StartDrawingCells(x, y); } else if (currlayer->touchmode == pickmode) { StartPickingCells(x, y); } else if (currlayer->touchmode == selectmode) { StartSelectingCells(x, y); } else if (currlayer->touchmode == movemode) { StartMovingView(x, y); } } // ----------------------------------------------------------------------------- void TouchMoved(int x, int y) { // make sure x,y is within viewport if (x < 0) x = 0; if (y < 0) y = 0; if (x > currlayer->view->getxmax()) x = currlayer->view->getxmax(); if (y > currlayer->view->getymax()) y = currlayer->view->getymax(); if ( drawingcells ) { DrawCells(x, y); } else if ( pickingcells ) { PickCell(x, y); } else if ( selectingcells ) { SelectCells(x, y); } else if ( movingview ) { MoveView(x, y); } else if ( movingpaste ) { MovePaste(x, y); } } // ----------------------------------------------------------------------------- void TouchEnded() { if (drawingcells && allowundo) { // MarkLayerDirty has set dirty flag, so we need to // pass in the flag state saved before drawing started currlayer->undoredo->RememberCellChanges("Drawing", currlayer->savedirty); UpdateEditBar(); // update various buttons } if (selectingcells) { if (allowundo) RememberNewSelection("Selection"); UpdateEditBar(); // update various buttons } drawingcells = false; pickingcells = false; selectingcells = false; movingview = false; movingpaste = false; ResumeGenerating(); } // ----------------------------------------------------------------------------- int SmallScroll(int xysize) { int amount; int mag = currlayer->view->getmag(); if (mag > 0) { // scroll an integral number of cells (1 cell = 2^mag pixels) if (mag < 3) { amount = ((xysize >> mag) / 20) << mag; if (amount == 0) amount = 1 << mag; return amount; } else { // grid lines are visible so scroll by only 1 cell return 1 << mag; } } else { // scroll by approx 5% of current wd/ht amount = xysize / 20; if (amount == 0) amount = 1; return amount; } } // ----------------------------------------------------------------------------- bool CopyRect(int itop, int ileft, int ibottom, int iright, lifealgo* srcalgo, lifealgo* destalgo, bool erasesrc, const char* progmsg) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; int v = 0; bool abort = false; // copy (and erase if requested) live cells from given rect // in source universe to same rect in destination universe BeginProgress(progmsg); for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { int skip = srcalgo->nextcell(cx, cy, v); if (skip + cx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell cx += skip; destalgo->setcell(cx, cy, v); if (erasesrc) srcalgo->setcell(cx, cy, 0); } else { cx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((cy - itop) * (double)(iright - ileft + 1) + (cx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } } if (abort) break; } if (erasesrc) srcalgo->endofpattern(); destalgo->endofpattern(); EndProgress(); return !abort; } // ----------------------------------------------------------------------------- void CopyAllRect(int itop, int ileft, int ibottom, int iright, lifealgo* srcalgo, lifealgo* destalgo, const char* progmsg) { int wd = iright - ileft + 1; int ht = ibottom - itop + 1; int cx, cy; double maxcount = (double)wd * (double)ht; int cntr = 0; bool abort = false; // copy all cells from given rect in srcalgo to same rect in destalgo BeginProgress(progmsg); for ( cy=itop; cy<=ibottom; cy++ ) { for ( cx=ileft; cx<=iright; cx++ ) { destalgo->setcell(cx, cy, srcalgo->getcell(cx, cy)); cntr++; if ((cntr % 4096) == 0) { abort = AbortProgress((double)cntr / maxcount, ""); if (abort) break; } } if (abort) break; } destalgo->endofpattern(); EndProgress(); } // ----------------------------------------------------------------------------- bool SelectionExists() { return currlayer->currsel.Exists(); } // ----------------------------------------------------------------------------- void SelectAll() { SaveCurrentSelection(); if (SelectionExists()) { currlayer->currsel.Deselect(); UpdatePatternAndStatus(); } if (currlayer->algo->isEmpty()) { ErrorMessage("All cells are dead."); RememberNewSelection("Deselection"); return; } bigint top, left, bottom, right; currlayer->algo->findedges(&top, &left, &bottom, &right); currlayer->currsel.SetEdges(top, left, bottom, right); RememberNewSelection("Select All"); DisplaySelectionSize(); UpdateEverything(); } // ----------------------------------------------------------------------------- void RemoveSelection() { if (SelectionExists()) { SaveCurrentSelection(); currlayer->currsel.Deselect(); RememberNewSelection("Deselection"); UpdateEverything(); } } // ----------------------------------------------------------------------------- void FitSelection() { if (!SelectionExists()) return; currlayer->currsel.Fit(); TestAutoFit(); UpdateEverything(); } // ----------------------------------------------------------------------------- void DisplaySelectionSize() { currlayer->currsel.DisplaySize(); } // ----------------------------------------------------------------------------- void SaveCurrentSelection() { if (allowundo && !currlayer->stayclean) { currlayer->savesel = currlayer->currsel; } } // ----------------------------------------------------------------------------- void RememberNewSelection(const char* action) { if (allowundo && !currlayer->stayclean) { currlayer->undoredo->RememberSelection(action); } } // ----------------------------------------------------------------------------- void ClearSelection() { currlayer->currsel.Clear(); } // ----------------------------------------------------------------------------- void ClearOutsideSelection() { currlayer->currsel.ClearOutside(); } // ----------------------------------------------------------------------------- void CutSelection() { currlayer->currsel.CopyToClipboard(true); } // ----------------------------------------------------------------------------- void CopySelection() { currlayer->currsel.CopyToClipboard(false); } // ----------------------------------------------------------------------------- void ShrinkSelection(bool fit) { currlayer->currsel.Shrink(fit); } // ----------------------------------------------------------------------------- void RandomFill() { currlayer->currsel.RandomFill(); } // ----------------------------------------------------------------------------- bool FlipSelection(bool topbottom, bool inundoredo) { return currlayer->currsel.Flip(topbottom, inundoredo); } // ----------------------------------------------------------------------------- bool RotateSelection(bool clockwise, bool inundoredo) { return currlayer->currsel.Rotate(clockwise, inundoredo); } // ----------------------------------------------------------------------------- bool GetClipboardPattern(bigint* t, bigint* l, bigint* b, bigint* r) { std::string data; if ( !GetTextFromClipboard(data) ) return false; // copy clipboard data to temporary file so we can handle all formats supported by readclipboard FILE* tmpfile = fopen(clipfile.c_str(), "w"); if (tmpfile) { if (fputs(data.c_str(), tmpfile) == EOF) { fclose(tmpfile); Warning("Could not write pasteboard text to temporary file!"); return false; } } else { Warning("Could not create temporary file for pasteboard data!"); return false; } fclose(tmpfile); // remember current rule oldrule = currlayer->algo->getrule(); //!!! avoid crash in hlifealgo::endpattern if pattern copied in an algo after hlife (eg. JvN) // is pasted into qlife (but only with bounded grid for some unknown reason); // discuss better solutions with Tom: // 1. in loadpattern() only call imp.endofpattern() if !errmsg // 2. in hlifealgo::setrule() call clearcache() 1st thing pastealgo->setrule(pastealgo->DefaultRule()); const char* err = readclipboard(clipfile.c_str(), *pastealgo, t, l, b, r); if (err) { // cycle thru all other algos until readclipboard succeeds for (int i = 0; i < NumAlgos(); i++) { if (i != currlayer->algtype) { delete pastealgo; pastealgo = CreateNewUniverse(i); //!!! avoid possible crash (see above) pastealgo->setrule(pastealgo->DefaultRule()); err = readclipboard(clipfile.c_str(), *pastealgo, t, l, b, r); if (!err) { newalgotype = i; // remember new algo for later use in PasteTemporaryToCurrent break; } } } } if (!err && canchangerule > 0) { // set newrule for later use in PasteTemporaryToCurrent if (canchangerule == 1 && !currlayer->algo->isEmpty()) { // don't change rule if universe isn't empty newrule = oldrule; } else { // remember rule set by readclipboard newrule = pastealgo->getrule(); } } RemoveFile(clipfile); if (err) { // error probably due to bad rule string in clipboard data Warning("Could not load pasteboard pattern\n(probably due to unknown rule)."); return false; } return true; } // ----------------------------------------------------------------------------- bool ClipboardContainsRule() { std::string data; if (!GetTextFromClipboard(data)) return false; if (strncmp(data.c_str(), "@RULE ", 6) != 0) return false; // extract rule name std::string rulename; int i = 6; while (data[i] > ' ') { rulename += data[i]; i++; } // check if Documents/Rules/rulename.rule already exists std::string rulepath = userrules + rulename; rulepath += ".rule"; if (FileExists(rulepath)) { std::string question = "Do you want to replace the existing " + rulename; question += ".rule with the version in the pasteboard?"; if (!YesNo(question.c_str())) { // don't overwrite existing .rule file return true; } } // create Documents/Rules/rulename.rule FILE* rulefile = fopen(rulepath.c_str(), "w"); if (rulefile) { if (fputs(data.c_str(), rulefile) == EOF) { fclose(rulefile); Warning("Could not write pasteboard text to .rule file!"); return true; } } else { Warning("Could not open .rule file for writing!"); return true; } fclose(rulefile); // now switch to the newly created rule ChangeRule(rulename); std::string msg = "Created Documents/Rules/" + rulename + ".rule"; DisplayMessage(msg.c_str()); return true; } // ----------------------------------------------------------------------------- void PasteClipboard() { // if clipboard text starts with "@RULE rulename" then install rulename.rule // and switch to that rule if (ClipboardContainsRule()) return; // create a temporary universe for storing the clipboard pattern if (pastealgo) Warning("Bug detected in PasteClipboard!"); pastealgo = CreateNewUniverse(currlayer->algtype); // read clipboard pattern into temporary universe bigint top, left, bottom, right; if ( GetClipboardPattern(&top, &left, &bottom, &right) ) { // make sure given edges are within getcell/setcell limits if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pasteboard pattern is too big."); } else { DisplayMessage("Drag paste image to desired location then double-tap image to paste/flip/rotate/etc..."); waitingforpaste = true; // set initial position of pasterect's top left corner to near top left corner // of viewport so all of paste image is likely to be visble and it isn't far // to move finger from Paste button pastex = 128; pastey = 64; // create image for drawing the pattern to be pasted; note that pastebox // is not necessarily the minimal bounding box because clipboard pattern // might have blank borders (in fact it could be empty) int itop = top.toint(); int ileft = left.toint(); int ibottom = bottom.toint(); int iright = right.toint(); int wd = iright - ileft + 1; int ht = ibottom - itop + 1; SetRect(pastebox, ileft, itop, wd, ht); CreatePasteImage(pastealgo, pastebox); } } // waitingforpaste will only be false if an error occurred if (!waitingforpaste) { delete pastealgo; pastealgo = NULL; } } // ----------------------------------------------------------------------------- void PasteTemporaryToCurrent(bigint top, bigint left, bigint wd, bigint ht) { // reset waitingforpaste now to avoid paste image being displayed prematurely waitingforpaste = false; bigint bottom = top; bottom += ht; bottom -= 1; bigint right = left; right += wd; right -= 1; // check that paste rectangle is within edit limits if ( OutsideLimits(top, left, bottom, right) ) { ErrorMessage("Pasting is not allowed outside +/- 10^9 boundary."); return; } // set edges of pattern in pastealgo int itop = pastebox.y; int ileft = pastebox.x; int ibottom = pastebox.y + pastebox.height - 1; int iright = pastebox.x + pastebox.width - 1; // set pastex,pastey to top left cell of paste rectangle pastex = left.toint(); pastey = top.toint(); // selection might change if grid becomes smaller, // so save current selection for RememberRuleChange/RememberAlgoChange SaveCurrentSelection(); // pasting clipboard pattern can cause a rule change int oldmaxstate = currlayer->algo->NumCellStates() - 1; if (canchangerule > 0 && oldrule != newrule) { const char* err = currlayer->algo->setrule( newrule.c_str() ); // setrule can fail if readclipboard loaded clipboard pattern into // a different type of algo (newalgotype) if (err) { // allow rule change to cause algo change ChangeAlgorithm(newalgotype, newrule.c_str()); } else { // if grid is bounded then remove any live cells outside grid edges if (currlayer->algo->gridwd > 0 || currlayer->algo->gridht > 0) { ClearOutsideGrid(); } // rule change might have changed the number of cell states; // if there are fewer states then pattern might change int newmaxstate = currlayer->algo->NumCellStates() - 1; if (newmaxstate < oldmaxstate && !currlayer->algo->isEmpty()) { ReduceCellStates(newmaxstate); } // switch to default colors for new rule UpdateLayerColors(); if (allowundo && !currlayer->stayclean) currlayer->undoredo->RememberRuleChange(oldrule.c_str()); } } // save cell changes if undo/redo is enabled and script isn't constructing a pattern bool savecells = allowundo && !currlayer->stayclean; //!!! if (savecells && inscript) SavePendingChanges(); // don't paste cells outside bounded grid int gtop = currlayer->algo->gridtop.toint(); int gleft = currlayer->algo->gridleft.toint(); int gbottom = currlayer->algo->gridbottom.toint(); int gright = currlayer->algo->gridright.toint(); if (currlayer->algo->gridwd == 0) { // grid has infinite width gleft = INT_MIN; gright = INT_MAX; } if (currlayer->algo->gridht == 0) { // grid has infinite height gtop = INT_MIN; gbottom = INT_MAX; } // copy pattern from temporary universe to current universe int tx, ty, cx, cy; double maxcount = wd.todouble() * ht.todouble(); int cntr = 0; bool abort = false; bool pattchanged = false; bool reduced = false; lifealgo* curralgo = currlayer->algo; int maxstate = curralgo->NumCellStates() - 1; BeginProgress("Pasting pattern"); // we can speed up pasting sparse patterns by using nextcell in these cases: // - if using Or mode // - if current universe is empty // - if paste rect is outside current pattern edges bool usenextcell; if ( pmode == Or || curralgo->isEmpty() ) { usenextcell = true; } else { bigint ctop, cleft, cbottom, cright; curralgo->findedges(&ctop, &cleft, &cbottom, &cright); usenextcell = top > cbottom || bottom < ctop || left > cright || right < cleft; } if ( usenextcell && pmode == And ) { // current universe is empty or paste rect is outside current pattern edges // so don't change any cells } else if ( usenextcell ) { int newstate = 0; cy = pastey; for ( ty=itop; ty<=ibottom; ty++ ) { cx = pastex; for ( tx=ileft; tx<=iright; tx++ ) { int skip = pastealgo->nextcell(tx, ty, newstate); if (skip + tx > iright) skip = -1; // pretend we found no more live cells if (skip >= 0) { // found next live cell so paste it into current universe tx += skip; cx += skip; if (cx >= gleft && cx <= gright && cy >= gtop && cy <= gbottom) { int currstate = curralgo->getcell(cx, cy); if (currstate != newstate) { if (newstate > maxstate) { newstate = maxstate; reduced = true; } curralgo->setcell(cx, cy, newstate); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, newstate); } } cx++; } else { tx = iright + 1; // done this row } cntr++; if ((cntr % 4096) == 0) { double prog = ((ty - itop) * (double)(iright - ileft + 1) + (tx - ileft)) / maxcount; abort = AbortProgress(prog, ""); if (abort) break; } } if (abort) break; cy++; } } else { // have to use slower getcell/setcell calls int tempstate, currstate; int numstates = curralgo->NumCellStates(); cy = pastey; for ( ty=itop; ty<=ibottom; ty++ ) { cx = pastex; for ( tx=ileft; tx<=iright; tx++ ) { tempstate = pastealgo->getcell(tx, ty); currstate = curralgo->getcell(cx, cy); if (cx >= gleft && cx <= gright && cy >= gtop && cy <= gbottom) { switch (pmode) { case And: if (tempstate != currstate && currstate > 0) { curralgo->setcell(cx, cy, 0); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, 0); } break; case Copy: if (tempstate != currstate) { if (tempstate > maxstate) { tempstate = maxstate; reduced = true; } curralgo->setcell(cx, cy, tempstate); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, tempstate); } break; case Or: // Or mode is done using above nextcell loop; // we only include this case to avoid compiler warning break; case Xor: if (tempstate == currstate) { if (currstate != 0) { curralgo->setcell(cx, cy, 0); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, 0); } } else { // tempstate != currstate int newstate = tempstate ^ currstate; // if xor overflows then don't change current state if (newstate >= numstates) newstate = currstate; if (currstate != newstate) { curralgo->setcell(cx, cy, newstate); pattchanged = true; if (savecells) currlayer->undoredo->SaveCellChange(cx, cy, currstate, newstate); } } break; } } cx++; cntr++; if ( (cntr % 4096) == 0 ) { abort = AbortProgress((double)cntr / maxcount, ""); if (abort) break; } } if (abort) break; cy++; } } if (pattchanged) curralgo->endofpattern(); EndProgress(); // tidy up and display result ClearMessage(); if (pattchanged) { if (savecells) currlayer->undoredo->RememberCellChanges("Paste", currlayer->dirty); MarkLayerDirty(); UpdatePatternAndStatus(); } if (reduced) ErrorMessage("Some cell states were reduced."); } // ----------------------------------------------------------------------------- void DoPaste(bool toselection) { bigint top, left; bigint wd = pastebox.width; bigint ht = pastebox.height; if (toselection) { // paste pattern into selection rectangle, if possible if (!SelectionExists()) { ErrorMessage("There is no selection."); return; } if (!currlayer->currsel.CanPaste(wd, ht, top, left)) { ErrorMessage("Pasteboard pattern is bigger than selection."); return; } // top and left have been set to the selection's top left corner PasteTemporaryToCurrent(top, left, wd, ht); } else { // paste pattern into pasterect, if possible if ( // allow paste if any corner of pasterect is within grid !( PointInGrid(pastex, pastey) || PointInGrid(pastex+pasterect.width-1, pastey) || PointInGrid(pastex, pastey+pasterect.height-1) || PointInGrid(pastex+pasterect.width-1, pastey+pasterect.height-1) ) ) { ErrorMessage("Paste must be at least partially within grid."); return; } // get paste rectangle's top left cell coord pair cellpos = currlayer->view->at(pastex, pastey); top = cellpos.second; left = cellpos.first; PasteTemporaryToCurrent(top, left, wd, ht); } AbortPaste(); } // ----------------------------------------------------------------------------- void AbortPaste() { waitingforpaste = false; pastex = -1; pastey = -1; if (pastealgo) { delete pastealgo; pastealgo = NULL; } DestroyPasteImage(); } // ----------------------------------------------------------------------------- bool FlipPastePattern(bool topbottom) { bool result; Selection pastesel(pastebox.y, pastebox.x, pastebox.y + pastebox.height - 1, pastebox.x + pastebox.width - 1); // flip the pattern in pastealgo lifealgo* savealgo = currlayer->algo; currlayer->algo = pastealgo; // pass in true for inundoredo parameter so flip won't be remembered // and layer won't be marked as dirty; also set inscript temporarily // so that viewport won't be updated inscript = true; result = pastesel.Flip(topbottom, true); // currlayer->algo might point to a *different* universe pastealgo = currlayer->algo; currlayer->algo = savealgo; inscript = false; if (result) { DestroyPasteImage(); CreatePasteImage(pastealgo, pastebox); } return result; } // ----------------------------------------------------------------------------- bool RotatePastePattern(bool clockwise) { bool result; Selection pastesel(pastebox.y, pastebox.x, pastebox.y + pastebox.height - 1, pastebox.x + pastebox.width - 1); // rotate the pattern in pastealgo lifealgo* savealgo = currlayer->algo; currlayer->algo = pastealgo; // pass in true for inundoredo parameter so rotate won't be remembered // and layer won't be marked as dirty; also set inscript temporarily // so that viewport won't be updated inscript = true; result = pastesel.Rotate(clockwise, true); // currlayer->algo might point to a *different* universe pastealgo = currlayer->algo; currlayer->algo = savealgo; inscript = false; if (result) { // get rotated selection and update pastebox int x, y, wd, ht; pastesel.GetRect(&x, &y, &wd, &ht); SetRect(pastebox, x, y, wd, ht); DestroyPasteImage(); CreatePasteImage(pastealgo, pastebox); } return result; } // ----------------------------------------------------------------------------- void ZoomInPos(int x, int y) { // zoom in to given point TestAutoFit(); if (currlayer->view->getmag() < MAX_MAG) { currlayer->view->zoom(x, y); UpdatePatternAndStatus(); } else { Beep(); // can't zoom in any further } } // ----------------------------------------------------------------------------- void ZoomOutPos(int x, int y) { // zoom out from given point TestAutoFit(); currlayer->view->unzoom(x, y); UpdatePatternAndStatus(); } golly-2.5-src/gui-ios/Golly.xcodeproj/0000755000175100001440000000000012156146016014731 500000000000000golly-2.5-src/gui-ios/Golly.xcodeproj/project.xcworkspace/0000755000175100001440000000000012156146016020727 500000000000000golly-2.5-src/gui-ios/Golly.xcodeproj/project.xcworkspace/contents.xcworkspacedata0000644000175100001440000000022612156145314025611 00000000000000 golly-2.5-src/gui-ios/Golly.xcodeproj/project.pbxproj0000644000175100001440000016743412156145314017744 00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXBuildFile section */ 0D029D291571D670005166AE /* control.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D029D281571D670005166AE /* control.m */; }; 0D02E13E1568A14800581DCC /* PatternView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D02E13D1568A14800581DCC /* PatternView.m */; }; 0D068EB715D93F4300A4EAB3 /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D068EB415D93F4300A4EAB3 /* Icon@2x.png */; }; 0D068EB815D93F4300A4EAB3 /* iTunesArtwork in Resources */ = {isa = PBXBuildFile; fileRef = 0D068EB515D93F4300A4EAB3 /* iTunesArtwork */; }; 0D068EB915D93F4300A4EAB3 /* iTunesArtwork@2x in Resources */ = {isa = PBXBuildFile; fileRef = 0D068EB615D93F4300A4EAB3 /* iTunesArtwork@2x */; }; 0D068EC115D9DD3A00A4EAB3 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D068EBF15D9DD3A00A4EAB3 /* Default-Portrait~ipad.png */; }; 0D068EC215D9DD3A00A4EAB3 /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D068EC015D9DD3A00A4EAB3 /* Default-Landscape~ipad.png */; }; 0D078728156881080051973C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D078727156881080051973C /* UIKit.framework */; }; 0D07872A156881080051973C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D078729156881080051973C /* Foundation.framework */; }; 0D07872C156881080051973C /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D07872B156881080051973C /* CoreGraphics.framework */; }; 0D078732156881080051973C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 0D078730156881080051973C /* InfoPlist.strings */; }; 0D078734156881080051973C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D078733156881080051973C /* main.m */; }; 0D078738156881080051973C /* GollyAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D078737156881080051973C /* GollyAppDelegate.m */; }; 0D07873B156881080051973C /* PatternViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D07873A156881080051973C /* PatternViewController.m */; }; 0D07873D156881080051973C /* pattern.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D07873C156881080051973C /* pattern.png */; }; 0D07873F156881080051973C /* pattern@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D07873E156881080051973C /* pattern@2x.png */; }; 0D078742156881080051973C /* HelpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D078741156881080051973C /* HelpViewController.m */; }; 0D105F0F159EABDF006350CA /* InfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D105F0D159EABDF006350CA /* InfoViewController.m */; }; 0D105F10159EABDF006350CA /* InfoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D105F0E159EABDF006350CA /* InfoViewController.xib */; }; 0D10CE96156A3CF2001DC67F /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D10CE95156A3CF2001DC67F /* Icon.png */; }; 0D1E9E6D17420EE2002C1270 /* triangle-right.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D1E9E6B17420EE2002C1270 /* triangle-right.png */; }; 0D1E9E6E17420EE2002C1270 /* triangle-down.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D1E9E6C17420EE2002C1270 /* triangle-down.png */; }; 0D2D9AAF156A00F3005B8D19 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D2D9AAE156A00F3005B8D19 /* libz.dylib */; }; 0D2D9AB5156A2413005B8D19 /* algos.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D2D9AB4156A2413005B8D19 /* algos.m */; }; 0D32774C156C9B0A00D3F800 /* prefs.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D32774A156C9B0A00D3F800 /* prefs.m */; }; 0D327750156CC8B300D3F800 /* layer.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D32774F156CC8B300D3F800 /* layer.m */; }; 0D41CD35157C225F0032B05A /* StateView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D41CD34157C225F0032B05A /* StateView.m */; }; 0D602F361572E25C00F51C02 /* status.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D602F351572E25C00F51C02 /* status.m */; }; 0D602F38157320D200F51C02 /* beep.aiff in Resources */ = {isa = PBXBuildFile; fileRef = 0D602F37157320D200F51C02 /* beep.aiff */; }; 0D602F3A1573210000F51C02 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D602F391573210000F51C02 /* AudioToolbox.framework */; }; 0D62F87115B8343B002E3EF8 /* StatePickerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D62F87015B8343A002E3EF8 /* StatePickerView.m */; }; 0D62F87615B8355B002E3EF8 /* StatePickerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D62F87415B8355B002E3EF8 /* StatePickerController.m */; }; 0D62F87715B8355B002E3EF8 /* StatePickerController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D62F87515B8355B002E3EF8 /* StatePickerController.xib */; }; 0D62FCF3159BCDCC005506CA /* SaveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D62FCF1159BCDCC005506CA /* SaveViewController.m */; }; 0D62FCF4159BCDCC005506CA /* SaveViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D62FCF2159BCDCC005506CA /* SaveViewController.xib */; }; 0D64693E1599D04A00433025 /* OpenViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D64693C1599D04A00433025 /* OpenViewController.m */; }; 0D64693F1599D04A00433025 /* OpenViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D64693D1599D04A00433025 /* OpenViewController.xib */; }; 0D6E5391159587D300E5AAD1 /* Help in Resources */ = {isa = PBXBuildFile; fileRef = 0D6E5390159587D300E5AAD1 /* Help */; }; 0D8F770215D097AD00EF43AF /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0D8F76FA15D097AD00EF43AF /* ioapi.c */; }; 0D8F770315D097AD00EF43AF /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = 0D8F76FC15D097AD00EF43AF /* mztools.c */; }; 0D8F770415D097AD00EF43AF /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 0D8F76FE15D097AD00EF43AF /* unzip.c */; }; 0D8F770515D097AD00EF43AF /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 0D8F770015D097AD00EF43AF /* zip.c */; }; 0D8F770715D097CD00EF43AF /* HelpViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D8F770615D097CD00EF43AF /* HelpViewController.xib */; }; 0D8F770915D097DA00EF43AF /* PatternViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D8F770815D097DA00EF43AF /* PatternViewController.xib */; }; 0D96C6411575C652006C8EBC /* settings.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D96C63F1575C651006C8EBC /* settings.png */; }; 0D96C6421575C652006C8EBC /* settings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D96C6401575C651006C8EBC /* settings@2x.png */; }; 0D96C6461575C824006C8EBC /* RuleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D96C6441575C824006C8EBC /* RuleViewController.m */; }; 0D96C6471575C824006C8EBC /* RuleViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D96C6451575C824006C8EBC /* RuleViewController.xib */; }; 0D96C64B1575CBF8006C8EBC /* SettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D96C6491575CBF8006C8EBC /* SettingsViewController.m */; }; 0D96C64C1575CBF8006C8EBC /* SettingsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0D96C64A1575CBF8006C8EBC /* SettingsViewController.xib */; }; 0D9AA82815D099D8003BEBD5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D9AA82715D099D8003BEBD5 /* QuartzCore.framework */; }; 0D9AA82B15D099F2003BEBD5 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D9AA82A15D099F2003BEBD5 /* OpenGLES.framework */; }; 0D9D15B915B67E340081C8AB /* help.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D9D15B715B67E340081C8AB /* help.png */; }; 0D9D15BA15B67E340081C8AB /* help@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0D9D15B815B67E340081C8AB /* help@2x.png */; }; 0D9D4DC1156DEF22005DD91D /* file.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D4DC0156DEF22005DD91D /* file.m */; }; 0D9D4DC4156E1F97005DD91D /* StatusView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D9D4DC3156E1F97005DD91D /* StatusView.m */; }; 0DA5B31D15F03332005EBBE8 /* Patterns in Resources */ = {isa = PBXBuildFile; fileRef = 0DA5B31C15F03332005EBBE8 /* Patterns */; }; 0DA5B31F15F0336C005EBBE8 /* Rules in Resources */ = {isa = PBXBuildFile; fileRef = 0DA5B31E15F0336C005EBBE8 /* Rules */; }; 0DA5B34715F03654005EBBE8 /* bigint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32315F03654005EBBE8 /* bigint.cpp */; }; 0DA5B34815F03654005EBBE8 /* generationsalgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32515F03654005EBBE8 /* generationsalgo.cpp */; }; 0DA5B34915F03654005EBBE8 /* ghashbase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32715F03654005EBBE8 /* ghashbase.cpp */; }; 0DA5B34A15F03654005EBBE8 /* ghashdraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32915F03654005EBBE8 /* ghashdraw.cpp */; }; 0DA5B34B15F03654005EBBE8 /* hlifealgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32A15F03654005EBBE8 /* hlifealgo.cpp */; }; 0DA5B34C15F03654005EBBE8 /* hlifedraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32C15F03654005EBBE8 /* hlifedraw.cpp */; }; 0DA5B34D15F03654005EBBE8 /* jvnalgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32D15F03654005EBBE8 /* jvnalgo.cpp */; }; 0DA5B34E15F03654005EBBE8 /* lifealgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B32F15F03654005EBBE8 /* lifealgo.cpp */; }; 0DA5B34F15F03654005EBBE8 /* lifepoll.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33115F03654005EBBE8 /* lifepoll.cpp */; }; 0DA5B35015F03654005EBBE8 /* liferender.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33315F03654005EBBE8 /* liferender.cpp */; }; 0DA5B35115F03654005EBBE8 /* liferules.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33515F03654005EBBE8 /* liferules.cpp */; }; 0DA5B35215F03654005EBBE8 /* qlifealgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33815F03654005EBBE8 /* qlifealgo.cpp */; }; 0DA5B35315F03654005EBBE8 /* qlifedraw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33A15F03654005EBBE8 /* qlifedraw.cpp */; }; 0DA5B35415F03654005EBBE8 /* readpattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33B15F03654005EBBE8 /* readpattern.cpp */; settings = {COMPILER_FLAGS = "-DZLIB"; }; }; 0DA5B35515F03654005EBBE8 /* ruletable_algo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33D15F03654005EBBE8 /* ruletable_algo.cpp */; }; 0DA5B35615F03654005EBBE8 /* ruletreealgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B33F15F03654005EBBE8 /* ruletreealgo.cpp */; }; 0DA5B35715F03654005EBBE8 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B34115F03654005EBBE8 /* util.cpp */; }; 0DA5B35815F03654005EBBE8 /* viewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B34315F03654005EBBE8 /* viewport.cpp */; }; 0DA5B35915F03654005EBBE8 /* writepattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DA5B34515F03654005EBBE8 /* writepattern.cpp */; settings = {COMPILER_FLAGS = "-DZLIB"; }; }; 0DC0A633156F36B60058B067 /* render.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DC0A632156F36B60058B067 /* render.m */; }; 0DC0F14D15A1511000BC058D /* FileInZipInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DC0F14415A1511000BC058D /* FileInZipInfo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 0DC0F14E15A1511000BC058D /* ZipException.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DC0F14615A1511000BC058D /* ZipException.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 0DC0F14F15A1511000BC058D /* ZipFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DC0F14815A1511000BC058D /* ZipFile.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 0DC0F15015A1511000BC058D /* ZipReadStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DC0F14A15A1511000BC058D /* ZipReadStream.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 0DC0F15115A1511000BC058D /* ZipWriteStream.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DC0F14C15A1511000BC058D /* ZipWriteStream.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 0DD5D56715A3083700CF2627 /* open.png in Resources */ = {isa = PBXBuildFile; fileRef = 0DD5D56515A3083700CF2627 /* open.png */; }; 0DD5D56815A3083700CF2627 /* open@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0DD5D56615A3083700CF2627 /* open@2x.png */; }; 0DD820DA1632A321008DF0FD /* ruleloaderalgo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0DD820D91632A321008DF0FD /* ruleloaderalgo.cpp */; }; 0DDC702E157EC50400B7F1C4 /* undo.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DDC702D157EC50300B7F1C4 /* undo.m */; }; 0DDC80FB156B005C004C5B29 /* utils.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DDC80F9156B005C004C5B29 /* utils.m */; }; 0DE7EB0F157D93BD005967ED /* select.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DE7EB0E157D93BD005967ED /* select.m */; }; 0DE7EB13157D9A51005967ED /* view.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DE7EB12157D9A51005967ED /* view.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 0D029D271571D66F005166AE /* control.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = control.h; sourceTree = ""; }; 0D029D281571D670005166AE /* control.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = control.m; sourceTree = ""; }; 0D02E13C1568A14800581DCC /* PatternView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PatternView.h; sourceTree = ""; }; 0D02E13D1568A14800581DCC /* PatternView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PatternView.m; sourceTree = ""; }; 0D068EB415D93F4300A4EAB3 /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Icon@2x.png"; sourceTree = ""; }; 0D068EB515D93F4300A4EAB3 /* iTunesArtwork */ = {isa = PBXFileReference; lastKnownFileType = file; path = iTunesArtwork; sourceTree = ""; }; 0D068EB615D93F4300A4EAB3 /* iTunesArtwork@2x */ = {isa = PBXFileReference; lastKnownFileType = file; path = "iTunesArtwork@2x"; sourceTree = ""; }; 0D068EBF15D9DD3A00A4EAB3 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Portrait~ipad.png"; sourceTree = ""; }; 0D068EC015D9DD3A00A4EAB3 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-Landscape~ipad.png"; sourceTree = ""; }; 0D078723156881080051973C /* Golly.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Golly.app; sourceTree = BUILT_PRODUCTS_DIR; }; 0D078727156881080051973C /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 0D078729156881080051973C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 0D07872B156881080051973C /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 0D07872F156881080051973C /* Golly-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Golly-Info.plist"; sourceTree = ""; }; 0D078731156881080051973C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 0D078733156881080051973C /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 0D078735156881080051973C /* Golly-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Golly-Prefix.pch"; sourceTree = ""; }; 0D078736156881080051973C /* GollyAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GollyAppDelegate.h; sourceTree = ""; }; 0D078737156881080051973C /* GollyAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GollyAppDelegate.m; sourceTree = ""; }; 0D078739156881080051973C /* PatternViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PatternViewController.h; sourceTree = ""; }; 0D07873A156881080051973C /* PatternViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PatternViewController.m; sourceTree = ""; }; 0D07873C156881080051973C /* pattern.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pattern.png; sourceTree = ""; }; 0D07873E156881080051973C /* pattern@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pattern@2x.png"; sourceTree = ""; }; 0D078740156881080051973C /* HelpViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HelpViewController.h; sourceTree = ""; }; 0D078741156881080051973C /* HelpViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HelpViewController.m; sourceTree = ""; }; 0D105F0C159EABDF006350CA /* InfoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InfoViewController.h; sourceTree = ""; }; 0D105F0D159EABDF006350CA /* InfoViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InfoViewController.m; sourceTree = ""; }; 0D105F0E159EABDF006350CA /* InfoViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = InfoViewController.xib; sourceTree = ""; }; 0D10CE95156A3CF2001DC67F /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = ""; }; 0D1E9E6B17420EE2002C1270 /* triangle-right.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "triangle-right.png"; sourceTree = ""; }; 0D1E9E6C17420EE2002C1270 /* triangle-down.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "triangle-down.png"; sourceTree = ""; }; 0D2D9AAE156A00F3005B8D19 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; 0D2D9AB3156A2413005B8D19 /* algos.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = algos.h; sourceTree = ""; }; 0D2D9AB4156A2413005B8D19 /* algos.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = algos.m; sourceTree = ""; }; 0D32774A156C9B0A00D3F800 /* prefs.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = prefs.m; sourceTree = ""; }; 0D32774B156C9B0A00D3F800 /* prefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prefs.h; sourceTree = ""; }; 0D32774E156CC8B300D3F800 /* layer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = layer.h; sourceTree = ""; }; 0D32774F156CC8B300D3F800 /* layer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = layer.m; sourceTree = ""; }; 0D41CD33157C225F0032B05A /* StateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StateView.h; sourceTree = ""; }; 0D41CD34157C225F0032B05A /* StateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StateView.m; sourceTree = ""; }; 0D602F341572E25C00F51C02 /* status.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = status.h; sourceTree = ""; }; 0D602F351572E25C00F51C02 /* status.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = status.m; sourceTree = ""; }; 0D602F37157320D200F51C02 /* beep.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = beep.aiff; sourceTree = ""; }; 0D602F391573210000F51C02 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 0D62F86F15B8343A002E3EF8 /* StatePickerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatePickerView.h; sourceTree = ""; }; 0D62F87015B8343A002E3EF8 /* StatePickerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StatePickerView.m; sourceTree = ""; }; 0D62F87315B8355B002E3EF8 /* StatePickerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatePickerController.h; sourceTree = ""; }; 0D62F87415B8355B002E3EF8 /* StatePickerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StatePickerController.m; sourceTree = ""; }; 0D62F87515B8355B002E3EF8 /* StatePickerController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = StatePickerController.xib; sourceTree = ""; }; 0D62FCF0159BCDCC005506CA /* SaveViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SaveViewController.h; sourceTree = ""; }; 0D62FCF1159BCDCC005506CA /* SaveViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SaveViewController.m; sourceTree = ""; }; 0D62FCF2159BCDCC005506CA /* SaveViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SaveViewController.xib; sourceTree = ""; }; 0D64693B1599D04A00433025 /* OpenViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenViewController.h; sourceTree = ""; }; 0D64693C1599D04A00433025 /* OpenViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenViewController.m; sourceTree = ""; }; 0D64693D1599D04A00433025 /* OpenViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = OpenViewController.xib; sourceTree = ""; }; 0D6E5390159587D300E5AAD1 /* Help */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Help; sourceTree = SOURCE_ROOT; }; 0D8F76F915D097AD00EF43AF /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypt.h; sourceTree = ""; }; 0D8F76FA15D097AD00EF43AF /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = ""; }; 0D8F76FB15D097AD00EF43AF /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = ""; }; 0D8F76FC15D097AD00EF43AF /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mztools.c; sourceTree = ""; }; 0D8F76FD15D097AD00EF43AF /* mztools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mztools.h; sourceTree = ""; }; 0D8F76FE15D097AD00EF43AF /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = ""; }; 0D8F76FF15D097AD00EF43AF /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = ""; }; 0D8F770015D097AD00EF43AF /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip.c; sourceTree = ""; }; 0D8F770115D097AD00EF43AF /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip.h; sourceTree = ""; }; 0D8F770615D097CD00EF43AF /* HelpViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = HelpViewController.xib; sourceTree = ""; }; 0D8F770815D097DA00EF43AF /* PatternViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PatternViewController.xib; sourceTree = ""; }; 0D96C63F1575C651006C8EBC /* settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = settings.png; sourceTree = ""; }; 0D96C6401575C651006C8EBC /* settings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "settings@2x.png"; sourceTree = ""; }; 0D96C6431575C823006C8EBC /* RuleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RuleViewController.h; sourceTree = ""; }; 0D96C6441575C824006C8EBC /* RuleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RuleViewController.m; sourceTree = ""; }; 0D96C6451575C824006C8EBC /* RuleViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RuleViewController.xib; sourceTree = ""; }; 0D96C6481575CBF8006C8EBC /* SettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsViewController.h; sourceTree = ""; }; 0D96C6491575CBF8006C8EBC /* SettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsViewController.m; sourceTree = ""; }; 0D96C64A1575CBF8006C8EBC /* SettingsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SettingsViewController.xib; sourceTree = ""; }; 0D9AA82715D099D8003BEBD5 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 0D9AA82A15D099F2003BEBD5 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; }; 0D9D15B715B67E340081C8AB /* help.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = help.png; sourceTree = ""; }; 0D9D15B815B67E340081C8AB /* help@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "help@2x.png"; sourceTree = ""; }; 0D9D4DBF156DEF22005DD91D /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file.h; sourceTree = ""; }; 0D9D4DC0156DEF22005DD91D /* file.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = file.m; sourceTree = ""; }; 0D9D4DC2156E1F97005DD91D /* StatusView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatusView.h; sourceTree = ""; }; 0D9D4DC3156E1F97005DD91D /* StatusView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StatusView.m; sourceTree = ""; }; 0DA5B31C15F03332005EBBE8 /* Patterns */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Patterns; path = ../../Patterns; sourceTree = ""; }; 0DA5B31E15F0336C005EBBE8 /* Rules */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Rules; path = ../../Rules; sourceTree = ""; }; 0DA5B32315F03654005EBBE8 /* bigint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bigint.cpp; sourceTree = ""; }; 0DA5B32415F03654005EBBE8 /* bigint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bigint.h; sourceTree = ""; }; 0DA5B32515F03654005EBBE8 /* generationsalgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = generationsalgo.cpp; sourceTree = ""; }; 0DA5B32615F03654005EBBE8 /* generationsalgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = generationsalgo.h; sourceTree = ""; }; 0DA5B32715F03654005EBBE8 /* ghashbase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ghashbase.cpp; sourceTree = ""; }; 0DA5B32815F03654005EBBE8 /* ghashbase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ghashbase.h; sourceTree = ""; }; 0DA5B32915F03654005EBBE8 /* ghashdraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ghashdraw.cpp; sourceTree = ""; }; 0DA5B32A15F03654005EBBE8 /* hlifealgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hlifealgo.cpp; sourceTree = ""; }; 0DA5B32B15F03654005EBBE8 /* hlifealgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hlifealgo.h; sourceTree = ""; }; 0DA5B32C15F03654005EBBE8 /* hlifedraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hlifedraw.cpp; sourceTree = ""; }; 0DA5B32D15F03654005EBBE8 /* jvnalgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = jvnalgo.cpp; sourceTree = ""; }; 0DA5B32E15F03654005EBBE8 /* jvnalgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = jvnalgo.h; sourceTree = ""; }; 0DA5B32F15F03654005EBBE8 /* lifealgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lifealgo.cpp; sourceTree = ""; }; 0DA5B33015F03654005EBBE8 /* lifealgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lifealgo.h; sourceTree = ""; }; 0DA5B33115F03654005EBBE8 /* lifepoll.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lifepoll.cpp; sourceTree = ""; }; 0DA5B33215F03654005EBBE8 /* lifepoll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lifepoll.h; sourceTree = ""; }; 0DA5B33315F03654005EBBE8 /* liferender.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = liferender.cpp; sourceTree = ""; }; 0DA5B33415F03654005EBBE8 /* liferender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liferender.h; sourceTree = ""; }; 0DA5B33515F03654005EBBE8 /* liferules.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = liferules.cpp; sourceTree = ""; }; 0DA5B33615F03654005EBBE8 /* liferules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = liferules.h; sourceTree = ""; }; 0DA5B33715F03654005EBBE8 /* platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform.h; sourceTree = ""; }; 0DA5B33815F03654005EBBE8 /* qlifealgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qlifealgo.cpp; sourceTree = ""; }; 0DA5B33915F03654005EBBE8 /* qlifealgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = qlifealgo.h; sourceTree = ""; }; 0DA5B33A15F03654005EBBE8 /* qlifedraw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = qlifedraw.cpp; sourceTree = ""; }; 0DA5B33B15F03654005EBBE8 /* readpattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = readpattern.cpp; sourceTree = ""; }; 0DA5B33C15F03654005EBBE8 /* readpattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = readpattern.h; sourceTree = ""; }; 0DA5B33D15F03654005EBBE8 /* ruletable_algo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ruletable_algo.cpp; sourceTree = ""; }; 0DA5B33E15F03654005EBBE8 /* ruletable_algo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ruletable_algo.h; sourceTree = ""; }; 0DA5B33F15F03654005EBBE8 /* ruletreealgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ruletreealgo.cpp; sourceTree = ""; }; 0DA5B34015F03654005EBBE8 /* ruletreealgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ruletreealgo.h; sourceTree = ""; }; 0DA5B34115F03654005EBBE8 /* util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = util.cpp; sourceTree = ""; }; 0DA5B34215F03654005EBBE8 /* util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = util.h; sourceTree = ""; }; 0DA5B34315F03654005EBBE8 /* viewport.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = viewport.cpp; sourceTree = ""; }; 0DA5B34415F03654005EBBE8 /* viewport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = viewport.h; sourceTree = ""; }; 0DA5B34515F03654005EBBE8 /* writepattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = writepattern.cpp; sourceTree = ""; }; 0DA5B34615F03654005EBBE8 /* writepattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = writepattern.h; sourceTree = ""; }; 0DC0A631156F36B60058B067 /* render.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = render.h; sourceTree = ""; }; 0DC0A632156F36B60058B067 /* render.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = render.m; sourceTree = ""; }; 0DC0F14315A1511000BC058D /* FileInZipInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileInZipInfo.h; sourceTree = ""; }; 0DC0F14415A1511000BC058D /* FileInZipInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FileInZipInfo.m; sourceTree = ""; }; 0DC0F14515A1511000BC058D /* ZipException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZipException.h; sourceTree = ""; }; 0DC0F14615A1511000BC058D /* ZipException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZipException.m; sourceTree = ""; }; 0DC0F14715A1511000BC058D /* ZipFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZipFile.h; sourceTree = ""; }; 0DC0F14815A1511000BC058D /* ZipFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZipFile.m; sourceTree = ""; }; 0DC0F14915A1511000BC058D /* ZipReadStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZipReadStream.h; sourceTree = ""; }; 0DC0F14A15A1511000BC058D /* ZipReadStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZipReadStream.m; sourceTree = ""; }; 0DC0F14B15A1511000BC058D /* ZipWriteStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZipWriteStream.h; sourceTree = ""; }; 0DC0F14C15A1511000BC058D /* ZipWriteStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ZipWriteStream.m; sourceTree = ""; }; 0DD5D56515A3083700CF2627 /* open.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = open.png; sourceTree = ""; }; 0DD5D56615A3083700CF2627 /* open@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "open@2x.png"; sourceTree = ""; }; 0DD820D71632A307008DF0FD /* ruleloaderalgo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ruleloaderalgo.h; sourceTree = ""; }; 0DD820D91632A321008DF0FD /* ruleloaderalgo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ruleloaderalgo.cpp; sourceTree = ""; }; 0DDC702C157EC50300B7F1C4 /* undo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = undo.h; sourceTree = ""; }; 0DDC702D157EC50300B7F1C4 /* undo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = undo.m; sourceTree = ""; }; 0DDC80F9156B005C004C5B29 /* utils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = utils.m; sourceTree = ""; }; 0DDC80FA156B005C004C5B29 /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utils.h; sourceTree = ""; }; 0DE7EB0D157D93BD005967ED /* select.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = select.h; sourceTree = ""; }; 0DE7EB0E157D93BD005967ED /* select.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = select.m; sourceTree = ""; }; 0DE7EB11157D9A51005967ED /* view.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = view.h; sourceTree = ""; }; 0DE7EB12157D9A51005967ED /* view.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = view.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 0D078720156881080051973C /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 0D9AA82B15D099F2003BEBD5 /* OpenGLES.framework in Frameworks */, 0D9AA82815D099D8003BEBD5 /* QuartzCore.framework in Frameworks */, 0D2D9AAF156A00F3005B8D19 /* libz.dylib in Frameworks */, 0D602F3A1573210000F51C02 /* AudioToolbox.framework in Frameworks */, 0D078728156881080051973C /* UIKit.framework in Frameworks */, 0D07872A156881080051973C /* Foundation.framework in Frameworks */, 0D07872C156881080051973C /* CoreGraphics.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 0D078718156881080051973C = { isa = PBXGroup; children = ( 0D07872D156881080051973C /* Golly */, 0D078726156881080051973C /* Frameworks */, 0D078724156881080051973C /* Products */, ); sourceTree = ""; }; 0D078724156881080051973C /* Products */ = { isa = PBXGroup; children = ( 0D078723156881080051973C /* Golly.app */, ); name = Products; sourceTree = ""; }; 0D078726156881080051973C /* Frameworks */ = { isa = PBXGroup; children = ( 0D2D9AAE156A00F3005B8D19 /* libz.dylib */, 0D9AA82715D099D8003BEBD5 /* QuartzCore.framework */, 0D9AA82A15D099F2003BEBD5 /* OpenGLES.framework */, 0D602F391573210000F51C02 /* AudioToolbox.framework */, 0D078727156881080051973C /* UIKit.framework */, 0D078729156881080051973C /* Foundation.framework */, 0D07872B156881080051973C /* CoreGraphics.framework */, ); name = Frameworks; sourceTree = ""; }; 0D07872D156881080051973C /* Golly */ = { isa = PBXGroup; children = ( 0DA5B32215F03654005EBBE8 /* gollybase */, 0D8F76F815D097AD00EF43AF /* MiniZip */, 0DC0F14215A1511000BC058D /* Objective-Zip */, 0D2D9AB3156A2413005B8D19 /* algos.h */, 0D2D9AB4156A2413005B8D19 /* algos.m */, 0D029D271571D66F005166AE /* control.h */, 0D029D281571D670005166AE /* control.m */, 0D9D4DBF156DEF22005DD91D /* file.h */, 0D9D4DC0156DEF22005DD91D /* file.m */, 0D32774E156CC8B300D3F800 /* layer.h */, 0D32774F156CC8B300D3F800 /* layer.m */, 0D32774B156C9B0A00D3F800 /* prefs.h */, 0D32774A156C9B0A00D3F800 /* prefs.m */, 0DC0A631156F36B60058B067 /* render.h */, 0DC0A632156F36B60058B067 /* render.m */, 0DE7EB0D157D93BD005967ED /* select.h */, 0DE7EB0E157D93BD005967ED /* select.m */, 0D602F341572E25C00F51C02 /* status.h */, 0D602F351572E25C00F51C02 /* status.m */, 0DDC702C157EC50300B7F1C4 /* undo.h */, 0DDC702D157EC50300B7F1C4 /* undo.m */, 0DDC80FA156B005C004C5B29 /* utils.h */, 0DDC80F9156B005C004C5B29 /* utils.m */, 0DE7EB11157D9A51005967ED /* view.h */, 0DE7EB12157D9A51005967ED /* view.m */, 0D078736156881080051973C /* GollyAppDelegate.h */, 0D078737156881080051973C /* GollyAppDelegate.m */, 0D078739156881080051973C /* PatternViewController.h */, 0D07873A156881080051973C /* PatternViewController.m */, 0D8F770815D097DA00EF43AF /* PatternViewController.xib */, 0D02E13C1568A14800581DCC /* PatternView.h */, 0D02E13D1568A14800581DCC /* PatternView.m */, 0D9D4DC2156E1F97005DD91D /* StatusView.h */, 0D9D4DC3156E1F97005DD91D /* StatusView.m */, 0D41CD33157C225F0032B05A /* StateView.h */, 0D41CD34157C225F0032B05A /* StateView.m */, 0D62F87315B8355B002E3EF8 /* StatePickerController.h */, 0D62F87415B8355B002E3EF8 /* StatePickerController.m */, 0D62F87515B8355B002E3EF8 /* StatePickerController.xib */, 0D62F86F15B8343A002E3EF8 /* StatePickerView.h */, 0D62F87015B8343A002E3EF8 /* StatePickerView.m */, 0D96C6431575C823006C8EBC /* RuleViewController.h */, 0D96C6441575C824006C8EBC /* RuleViewController.m */, 0D96C6451575C824006C8EBC /* RuleViewController.xib */, 0D105F0C159EABDF006350CA /* InfoViewController.h */, 0D105F0D159EABDF006350CA /* InfoViewController.m */, 0D105F0E159EABDF006350CA /* InfoViewController.xib */, 0D62FCF0159BCDCC005506CA /* SaveViewController.h */, 0D62FCF1159BCDCC005506CA /* SaveViewController.m */, 0D62FCF2159BCDCC005506CA /* SaveViewController.xib */, 0D64693B1599D04A00433025 /* OpenViewController.h */, 0D64693C1599D04A00433025 /* OpenViewController.m */, 0D64693D1599D04A00433025 /* OpenViewController.xib */, 0D96C6481575CBF8006C8EBC /* SettingsViewController.h */, 0D96C6491575CBF8006C8EBC /* SettingsViewController.m */, 0D96C64A1575CBF8006C8EBC /* SettingsViewController.xib */, 0D078740156881080051973C /* HelpViewController.h */, 0D078741156881080051973C /* HelpViewController.m */, 0D8F770615D097CD00EF43AF /* HelpViewController.xib */, 0D07872E156881080051973C /* Supporting Files */, ); path = Golly; sourceTree = ""; }; 0D07872E156881080051973C /* Supporting Files */ = { isa = PBXGroup; children = ( 0DA5B31E15F0336C005EBBE8 /* Rules */, 0DA5B31C15F03332005EBBE8 /* Patterns */, 0D6E5390159587D300E5AAD1 /* Help */, 0D10CE95156A3CF2001DC67F /* Icon.png */, 0D068EB415D93F4300A4EAB3 /* Icon@2x.png */, 0D068EB515D93F4300A4EAB3 /* iTunesArtwork */, 0D068EB615D93F4300A4EAB3 /* iTunesArtwork@2x */, 0D068EBF15D9DD3A00A4EAB3 /* Default-Portrait~ipad.png */, 0D068EC015D9DD3A00A4EAB3 /* Default-Landscape~ipad.png */, 0D07872F156881080051973C /* Golly-Info.plist */, 0D078730156881080051973C /* InfoPlist.strings */, 0D078733156881080051973C /* main.m */, 0D078735156881080051973C /* Golly-Prefix.pch */, 0D602F37157320D200F51C02 /* beep.aiff */, 0D9D15B715B67E340081C8AB /* help.png */, 0D9D15B815B67E340081C8AB /* help@2x.png */, 0D07873C156881080051973C /* pattern.png */, 0D07873E156881080051973C /* pattern@2x.png */, 0DD5D56515A3083700CF2627 /* open.png */, 0DD5D56615A3083700CF2627 /* open@2x.png */, 0D96C63F1575C651006C8EBC /* settings.png */, 0D96C6401575C651006C8EBC /* settings@2x.png */, 0D1E9E6B17420EE2002C1270 /* triangle-right.png */, 0D1E9E6C17420EE2002C1270 /* triangle-down.png */, ); name = "Supporting Files"; sourceTree = ""; }; 0D8F76F815D097AD00EF43AF /* MiniZip */ = { isa = PBXGroup; children = ( 0D8F76F915D097AD00EF43AF /* crypt.h */, 0D8F76FA15D097AD00EF43AF /* ioapi.c */, 0D8F76FB15D097AD00EF43AF /* ioapi.h */, 0D8F76FC15D097AD00EF43AF /* mztools.c */, 0D8F76FD15D097AD00EF43AF /* mztools.h */, 0D8F76FE15D097AD00EF43AF /* unzip.c */, 0D8F76FF15D097AD00EF43AF /* unzip.h */, 0D8F770015D097AD00EF43AF /* zip.c */, 0D8F770115D097AD00EF43AF /* zip.h */, ); path = MiniZip; sourceTree = ""; }; 0DA5B32215F03654005EBBE8 /* gollybase */ = { isa = PBXGroup; children = ( 0DA5B32315F03654005EBBE8 /* bigint.cpp */, 0DA5B32415F03654005EBBE8 /* bigint.h */, 0DA5B32515F03654005EBBE8 /* generationsalgo.cpp */, 0DA5B32615F03654005EBBE8 /* generationsalgo.h */, 0DA5B32715F03654005EBBE8 /* ghashbase.cpp */, 0DA5B32815F03654005EBBE8 /* ghashbase.h */, 0DA5B32915F03654005EBBE8 /* ghashdraw.cpp */, 0DA5B32A15F03654005EBBE8 /* hlifealgo.cpp */, 0DA5B32B15F03654005EBBE8 /* hlifealgo.h */, 0DA5B32C15F03654005EBBE8 /* hlifedraw.cpp */, 0DA5B32D15F03654005EBBE8 /* jvnalgo.cpp */, 0DA5B32E15F03654005EBBE8 /* jvnalgo.h */, 0DA5B32F15F03654005EBBE8 /* lifealgo.cpp */, 0DA5B33015F03654005EBBE8 /* lifealgo.h */, 0DA5B33115F03654005EBBE8 /* lifepoll.cpp */, 0DA5B33215F03654005EBBE8 /* lifepoll.h */, 0DA5B33315F03654005EBBE8 /* liferender.cpp */, 0DA5B33415F03654005EBBE8 /* liferender.h */, 0DA5B33515F03654005EBBE8 /* liferules.cpp */, 0DA5B33615F03654005EBBE8 /* liferules.h */, 0DA5B33715F03654005EBBE8 /* platform.h */, 0DA5B33815F03654005EBBE8 /* qlifealgo.cpp */, 0DA5B33915F03654005EBBE8 /* qlifealgo.h */, 0DA5B33A15F03654005EBBE8 /* qlifedraw.cpp */, 0DA5B33B15F03654005EBBE8 /* readpattern.cpp */, 0DA5B33C15F03654005EBBE8 /* readpattern.h */, 0DD820D91632A321008DF0FD /* ruleloaderalgo.cpp */, 0DD820D71632A307008DF0FD /* ruleloaderalgo.h */, 0DA5B33D15F03654005EBBE8 /* ruletable_algo.cpp */, 0DA5B33E15F03654005EBBE8 /* ruletable_algo.h */, 0DA5B33F15F03654005EBBE8 /* ruletreealgo.cpp */, 0DA5B34015F03654005EBBE8 /* ruletreealgo.h */, 0DA5B34115F03654005EBBE8 /* util.cpp */, 0DA5B34215F03654005EBBE8 /* util.h */, 0DA5B34315F03654005EBBE8 /* viewport.cpp */, 0DA5B34415F03654005EBBE8 /* viewport.h */, 0DA5B34515F03654005EBBE8 /* writepattern.cpp */, 0DA5B34615F03654005EBBE8 /* writepattern.h */, ); name = gollybase; path = ../../gollybase; sourceTree = ""; }; 0DC0F14215A1511000BC058D /* Objective-Zip */ = { isa = PBXGroup; children = ( 0DC0F14315A1511000BC058D /* FileInZipInfo.h */, 0DC0F14415A1511000BC058D /* FileInZipInfo.m */, 0DC0F14515A1511000BC058D /* ZipException.h */, 0DC0F14615A1511000BC058D /* ZipException.m */, 0DC0F14715A1511000BC058D /* ZipFile.h */, 0DC0F14815A1511000BC058D /* ZipFile.m */, 0DC0F14915A1511000BC058D /* ZipReadStream.h */, 0DC0F14A15A1511000BC058D /* ZipReadStream.m */, 0DC0F14B15A1511000BC058D /* ZipWriteStream.h */, 0DC0F14C15A1511000BC058D /* ZipWriteStream.m */, ); path = "Objective-Zip"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 0D078722156881080051973C /* Golly */ = { isa = PBXNativeTarget; buildConfigurationList = 0D07874F156881080051973C /* Build configuration list for PBXNativeTarget "Golly" */; buildPhases = ( 0D07871F156881080051973C /* Sources */, 0D078720156881080051973C /* Frameworks */, 0DC9D3EE15984E05008937DC /* ShellScript */, 0D078721156881080051973C /* Resources */, ); buildRules = ( ); dependencies = ( ); name = Golly; productName = Golly; productReference = 0D078723156881080051973C /* Golly.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 0D07871A156881080051973C /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0420; }; buildConfigurationList = 0D07871D156881080051973C /* Build configuration list for PBXProject "Golly" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( en, ); mainGroup = 0D078718156881080051973C; productRefGroup = 0D078724156881080051973C /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 0D078722156881080051973C /* Golly */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 0D078721156881080051973C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 0D078732156881080051973C /* InfoPlist.strings in Resources */, 0D07873D156881080051973C /* pattern.png in Resources */, 0D07873F156881080051973C /* pattern@2x.png in Resources */, 0D10CE96156A3CF2001DC67F /* Icon.png in Resources */, 0D602F38157320D200F51C02 /* beep.aiff in Resources */, 0D96C6411575C652006C8EBC /* settings.png in Resources */, 0D96C6421575C652006C8EBC /* settings@2x.png in Resources */, 0D96C6471575C824006C8EBC /* RuleViewController.xib in Resources */, 0D96C64C1575CBF8006C8EBC /* SettingsViewController.xib in Resources */, 0D6E5391159587D300E5AAD1 /* Help in Resources */, 0D64693F1599D04A00433025 /* OpenViewController.xib in Resources */, 0D62FCF4159BCDCC005506CA /* SaveViewController.xib in Resources */, 0D105F10159EABDF006350CA /* InfoViewController.xib in Resources */, 0DD5D56715A3083700CF2627 /* open.png in Resources */, 0DD5D56815A3083700CF2627 /* open@2x.png in Resources */, 0D9D15B915B67E340081C8AB /* help.png in Resources */, 0D9D15BA15B67E340081C8AB /* help@2x.png in Resources */, 0D62F87715B8355B002E3EF8 /* StatePickerController.xib in Resources */, 0D8F770715D097CD00EF43AF /* HelpViewController.xib in Resources */, 0D8F770915D097DA00EF43AF /* PatternViewController.xib in Resources */, 0D068EB715D93F4300A4EAB3 /* Icon@2x.png in Resources */, 0D068EB815D93F4300A4EAB3 /* iTunesArtwork in Resources */, 0D068EB915D93F4300A4EAB3 /* iTunesArtwork@2x in Resources */, 0D068EC115D9DD3A00A4EAB3 /* Default-Portrait~ipad.png in Resources */, 0D068EC215D9DD3A00A4EAB3 /* Default-Landscape~ipad.png in Resources */, 0DA5B31D15F03332005EBBE8 /* Patterns in Resources */, 0DA5B31F15F0336C005EBBE8 /* Rules in Resources */, 0D1E9E6D17420EE2002C1270 /* triangle-right.png in Resources */, 0D1E9E6E17420EE2002C1270 /* triangle-down.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 0DC9D3EE15984E05008937DC /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/tcsh; shellScript = "touch -cm ${SRCROOT}/Help\ntouch -cm ${SRCROOT}/Patterns\ntouch -cm ${SRCROOT}/Rules\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 0D07871F156881080051973C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 0D078734156881080051973C /* main.m in Sources */, 0D078738156881080051973C /* GollyAppDelegate.m in Sources */, 0D07873B156881080051973C /* PatternViewController.m in Sources */, 0D078742156881080051973C /* HelpViewController.m in Sources */, 0D02E13E1568A14800581DCC /* PatternView.m in Sources */, 0D2D9AB5156A2413005B8D19 /* algos.m in Sources */, 0DDC80FB156B005C004C5B29 /* utils.m in Sources */, 0D32774C156C9B0A00D3F800 /* prefs.m in Sources */, 0D327750156CC8B300D3F800 /* layer.m in Sources */, 0D9D4DC1156DEF22005DD91D /* file.m in Sources */, 0D9D4DC4156E1F97005DD91D /* StatusView.m in Sources */, 0DC0A633156F36B60058B067 /* render.m in Sources */, 0D029D291571D670005166AE /* control.m in Sources */, 0D602F361572E25C00F51C02 /* status.m in Sources */, 0D96C6461575C824006C8EBC /* RuleViewController.m in Sources */, 0D96C64B1575CBF8006C8EBC /* SettingsViewController.m in Sources */, 0D41CD35157C225F0032B05A /* StateView.m in Sources */, 0DE7EB0F157D93BD005967ED /* select.m in Sources */, 0DE7EB13157D9A51005967ED /* view.m in Sources */, 0DDC702E157EC50400B7F1C4 /* undo.m in Sources */, 0D64693E1599D04A00433025 /* OpenViewController.m in Sources */, 0D62FCF3159BCDCC005506CA /* SaveViewController.m in Sources */, 0D105F0F159EABDF006350CA /* InfoViewController.m in Sources */, 0DC0F14D15A1511000BC058D /* FileInZipInfo.m in Sources */, 0DC0F14E15A1511000BC058D /* ZipException.m in Sources */, 0DC0F14F15A1511000BC058D /* ZipFile.m in Sources */, 0DC0F15015A1511000BC058D /* ZipReadStream.m in Sources */, 0DC0F15115A1511000BC058D /* ZipWriteStream.m in Sources */, 0D62F87115B8343B002E3EF8 /* StatePickerView.m in Sources */, 0D62F87615B8355B002E3EF8 /* StatePickerController.m in Sources */, 0D8F770215D097AD00EF43AF /* ioapi.c in Sources */, 0D8F770315D097AD00EF43AF /* mztools.c in Sources */, 0D8F770415D097AD00EF43AF /* unzip.c in Sources */, 0D8F770515D097AD00EF43AF /* zip.c in Sources */, 0DA5B34715F03654005EBBE8 /* bigint.cpp in Sources */, 0DA5B34815F03654005EBBE8 /* generationsalgo.cpp in Sources */, 0DA5B34915F03654005EBBE8 /* ghashbase.cpp in Sources */, 0DA5B34A15F03654005EBBE8 /* ghashdraw.cpp in Sources */, 0DA5B34B15F03654005EBBE8 /* hlifealgo.cpp in Sources */, 0DA5B34C15F03654005EBBE8 /* hlifedraw.cpp in Sources */, 0DA5B34D15F03654005EBBE8 /* jvnalgo.cpp in Sources */, 0DA5B34E15F03654005EBBE8 /* lifealgo.cpp in Sources */, 0DA5B34F15F03654005EBBE8 /* lifepoll.cpp in Sources */, 0DA5B35015F03654005EBBE8 /* liferender.cpp in Sources */, 0DA5B35115F03654005EBBE8 /* liferules.cpp in Sources */, 0DA5B35215F03654005EBBE8 /* qlifealgo.cpp in Sources */, 0DA5B35315F03654005EBBE8 /* qlifedraw.cpp in Sources */, 0DA5B35415F03654005EBBE8 /* readpattern.cpp in Sources */, 0DA5B35515F03654005EBBE8 /* ruletable_algo.cpp in Sources */, 0DA5B35615F03654005EBBE8 /* ruletreealgo.cpp in Sources */, 0DA5B35715F03654005EBBE8 /* util.cpp in Sources */, 0DA5B35815F03654005EBBE8 /* viewport.cpp in Sources */, 0DA5B35915F03654005EBBE8 /* writepattern.cpp in Sources */, 0DD820DA1632A321008DF0FD /* ruleloaderalgo.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 0D078730156881080051973C /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( 0D078731156881080051973C /* en */, ); name = InfoPlist.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 0D07874D156881080051973C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 5.0; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; }; name = Debug; }; 0D07874E156881080051973C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 5.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; VALIDATE_PRODUCT = YES; }; name = Release; }; 0D078750156881080051973C /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { GCC_C_LANGUAGE_STANDARD = gnu99; GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Golly/Golly-Prefix.pch"; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; INFOPLIST_FILE = "Golly/Golly-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 5.0; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = 2; WRAPPER_EXTENSION = app; }; name = Debug; }; 0D078751156881080051973C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { GCC_C_LANGUAGE_STANDARD = gnu99; GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Golly/Golly-Prefix.pch"; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; INFOPLIST_FILE = "Golly/Golly-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 5.0; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = 2; VALIDATE_PRODUCT = NO; WRAPPER_EXTENSION = app; }; name = Release; }; 0DBF0CFD15DA801A004A5509 /* AppStore */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_ENABLE_OBJC_ARC = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 5.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = 2; VALIDATE_PRODUCT = YES; }; name = AppStore; }; 0DBF0CFE15DA801A004A5509 /* AppStore */ = { isa = XCBuildConfiguration; buildSettings = { GCC_C_LANGUAGE_STANDARD = gnu99; GCC_INPUT_FILETYPE = sourcecode.cpp.objcpp; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Golly/Golly-Prefix.pch"; GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; INFOPLIST_FILE = "Golly/Golly-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 5.0; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = 2; WRAPPER_EXTENSION = app; }; name = AppStore; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 0D07871D156881080051973C /* Build configuration list for PBXProject "Golly" */ = { isa = XCConfigurationList; buildConfigurations = ( 0D07874D156881080051973C /* Debug */, 0D07874E156881080051973C /* Release */, 0DBF0CFD15DA801A004A5509 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 0D07874F156881080051973C /* Build configuration list for PBXNativeTarget "Golly" */ = { isa = XCConfigurationList; buildConfigurations = ( 0D078750156881080051973C /* Debug */, 0D078751156881080051973C /* Release */, 0DBF0CFE15DA801A004A5509 /* AppStore */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 0D07871A156881080051973C /* Project object */; } golly-2.5-src/gui-ios/Help/0000755000175100001440000000000012156146016012537 500000000000000golly-2.5-src/gui-ios/Help/Algorithms/0000755000175100001440000000000012156146016014650 500000000000000golly-2.5-src/gui-ios/Help/Algorithms/Generations.html0000644000175100001440000000637212156145314017744 00000000000000 Golly Help: Generations

The Generations algorithm supports rules similar to Life but with an extra history component that allows cells to have up to 256 states. The rule notation is "0..8/1..8/n" where the 1st set of digits specify the live neighbor counts necessary for a cell to survive to the next generation. The 2nd set of digits specify the live neighbor counts necessary for a cell to be born in the next generation. The final number n specifies the maximum number of cell states (from 2 to 256).

Here are some example rules:

2367/3457/5 [Banners] - an exploding rule by Mirek Wojtowicz.
234/34678/24 [Bloomerang] - an expanding rule by John Elliott.
/2/3 [Brian's Brain] - a chaotic rule by Brian Silverman.
124567/378/4 [Caterpillars] - a chaotic rule by Mirek Wojtowicz.
23/2/8 [Cooties] - an exploding rule by Rudy Rucker.
2/13/21 [Fireworks] - an exploding rule by John Elliott.
12/34/3 [Frogs] - a chaotic rule by Scott Robert Ladd.
12345/45678/8 [Lava] - an expanding rule by Mirek Wojtowicz.
012345/458/3 [Lines] - a stable rule by Anders Starmark.
345/2/4 [Star Wars] - an exploding rule by Mirek Wojtowicz.
3456/2/6 [Sticks] - an exploding rule by Rudy Rucker.
345/26/5 [Transers] - an exploding rule by John Elliott.
1456/2356/16 [Xtasy] - an exploding rule by John Elliott.

Other rules in this family, along with more detailed descriptions, can be found at Mirek Wojtowicz's MCell website. See also the Patterns/Generations folder which contains a number of interesting patterns extracted from the MCell pattern collection. golly-2.5-src/gui-ios/Help/Algorithms/HashLife.html0000644000175100001440000000120512156145314017137 00000000000000 Golly Help: HashLife

HashLife uses Bill Gosper's hashlife algorithm to achieve remarkable speeds when generating patterns that have a lot of regularity in time and/or space.

HashLife supports the same set of rules as QuickLife, but with one exception: if a rule contains B0 it must also contain S8 (or S6 if the rule ends with H, or S4 if it ends with V).

Note that HashLife performs very poorly on highly chaotic patterns, so in those cases you are better off switching to QuickLife. golly-2.5-src/gui-ios/Help/Algorithms/JvN.html0000644000175100001440000000472612156145314016164 00000000000000 Golly Help: JvN

John von Neumann created the very first cellular automata in the 1940's, together with fellow mathematician Stanislaw Ulam. The JvN algorithm supports 3 rules:

JvN29
The original 29-state CA as created by von Neumann. To see how his rules work, load the simpler examples first: counter-demo.rle and cell-coders-demo.rle and read their pattern info (hit the 'i' button). For a more complex example, see read-arm-demo.rle which shows one component of von Neumann's original design, the tape reader. For a complete self-replicating machine within von Neumann's CA, open sphinx.mc.gz.

Nobili32
An extension of JvN29 created by Renato Nobili in 1994. This rule adds three new states to allow signal crossing, allowing self-replicating machines to be greatly reduced in size. The example pattern construction-arm-demo.rle shows some of the crossing cells in action under this rule. The pattern NP-replicator.rle.gz shows the 1994 design that was the first implementation of von Neumann's vision of a self-reproducing universal constructor in a CA.

Hutton32
Created by Tim Hutton in 2008, this rule uses the same states as Nobili32 but has a slightly modified rule table. Examples golly-constructor.rle and Hutton-replicator.rle show what it can do.

References:

http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor
http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata
http://www.pd.infn.it/~rnobili/wjvn/index.htm
http://www.pd.infn.it/~rnobili/au_cell/
http://www.sq3.org.uk/Evolution/JvN/

golly-2.5-src/gui-ios/Help/Algorithms/QuickLife.html0000644000175100001440000001254612156145314017342 00000000000000 Golly Help: QuickLife

QuickLife is a fast, conventional (non-hashing) algorithm for exploring Life and other 2D outer-totalistic rules. Such rules are defined using "B0...8/S0...8" notation, where the digits after B specify the counts of live neighbors necessary for a cell to be born in the next generation, and the digits after S specify the counts of live neighbors necessary for a cell to survive to the next generation. Here are some example rules:

B3/S23 [Life]
John Conway's rule is by far the best known and most explored CA.

B36/S23 [HighLife]
Very similar to Conway's Life but with an interesting replicator.

B3678/S34678 [Day & Night]
Dead cells in a sea of live cells behave the same as live cells in a sea of dead cells.

B35678/S5678 [Diamoeba]
Creates diamond-shaped blobs with unpredictable behavior.

B2 [Seeds]
Every living cell dies every generation, but most patterns still explode.

B234 [Persian Rug]
A single 2x2 block turns into a set of Persian rugs.

B345/S5 [LongLife]
Oscillators with extremely long periods can occur quite naturally.

 
Emulating B0 rules

Rules containing B0 are tricky to handle in an unbounded universe because every dead cell becomes alive in the next generation. If the rule doesn't contain S8 then the "background" cells alternate from all-alive to all-dead, creating a nasty strobing effect. To avoid these problems, Golly emulates rules with B0 in the following way:

A rule containing B0 and S8 is converted into an equivalent rule (without B0) by inverting the neighbor counts, then using S(8-x) for the B counts and B(8-x) for the S counts. For example, B0123478/S01234678 (AntiLife) is changed to B3/S23 (Life) via these steps: B0123478/S01234678 -> B56/S5 -> B3/S23.

A rule containing B0 but not S8 is converted into a pair of rules (both without B0): one is used for the even generations and the other for the odd generations. The rule for even generations uses inverted neighbor counts. The rule for odd generations uses S(8-x) for the B counts and B(8-x) for the S counts. For example, B03/S23 becomes B1245678/S0145678 (even) and B56/S58 (odd).

In both cases, the replacement rule(s) generate patterns that are equivalent to the requested rule. However, you need to be careful when editing an emulated pattern in a rule that contains B0 but not S8. If you do a cut or copy then you should only paste into a generation with the same parity.

 
Von Neumann neighborhood

The above rules use the Moore neighborhood, where each cell has 8 neighbors. In the von Neumann neighborhood each cell has only the 4 orthogonal neighbors. To specify this neighborhood just append "V" to the usual "B.../S..." notation and use neighbor counts ranging from 0 to 4 (counts above 4 are silently ignored). For example, try B13/S012V or B2/S013V.

Note that when viewing patterns at scales 1:8 or 1:16 or 1:32, Golly displays diamond-shaped icons for rules using the von Neumann neighborhood and circular dots for rules using the Moore neighborhood.

 
Hexagonal neighborhood

QuickLife can emulate a hexagonal neighborhood on a square grid by ignoring the NE and SW corners of the Moore neighborhood so that every cell has 6 neighbors:

   NW N NE         NW  N
   W  C  E   ->   W  C  E
   SW S SE         S  SE
To specify a hexagonal neighborhood just append "H" to the usual "B.../S..." notation and use neighbor counts ranging from 0 to 6 (counts above 6 are silently ignored). Here's an example:
x = 7, y = 6, rule = B245/S3H
obo$4bo$2bo$bo2bobo$3bo$5bo!
Editing hexagonal patterns in a square grid can be somewhat confusing, so to help make things a bit easier Golly displays slanted hexagons (in icon mode) at scales 1:8 or 1:16 or 1:32.

 
Wolfram's elementary rules

QuickLife supports Stephen Wolfram's elementary 1D rules. These rules are specified as "Wn" where n is an even number from 0 to 254. For example:

W22
A single live cell creates a beautiful fractal pattern.

W30
Highly chaotic and an excellent random number generator.

W110
Matthew Cook proved that this rule is capable of universal computation.

The binary representation of a particular number specifies the cell states resulting from each of the 8 possible combinations of a cell and its left and right neighbors, where 1 is a live cell and 0 is a dead cell. Here are the state transitions for W30:

   111  110  101  100  011  010  001  000
    |    |    |    |    |    |    |    | 
    0    0    0    1    1    1    1    0  = 30 (2^4 + 2^3 + 2^2 + 2^1)
Note that odd-numbered rules have the same problem as B0 rules, but Golly currently makes no attempt to emulate such rules. golly-2.5-src/gui-ios/Help/Algorithms/RuleLoader.html0000644000175100001440000003170212156145314017517 00000000000000 Golly Help: RuleLoader

The RuleLoader algorithm allows rules to be specified in external files. Given the rule string "Foo", RuleLoader will search for a file called Foo.rule. The format of a .rule file is described here. A number of examples can be found in the Rules folder:

B3/S23 or Life
Conway's Life. This is the default rule for the RuleLoader algorithm and is built in (there is no corresponding .rule file).

Banks-I, Banks-II, Banks-III, Banks-IV
In 1971, Edwin Roger Banks (a student of Ed Fredkin) made simpler versions of Codd's 1968 CA, using only two states in some cases. These four rules are found in his PhD thesis. To see the rules in action, open Banks-I-demo.rle and the other examples in Patterns/Banks/.

BBM-Margolus-emulated
Ed Fredkin's Billiard Ball Model, using the Margolus neighborhood to implement a simple reversible physics of bouncing balls. In this implementation we are emulating the system using a Moore-neighborhood CA with extra states. Open BBM.rle to see the rule in action.

BriansBrain
An alternative implementation of the Generations rule /2/3.

Byl-Loop
A six state 5-neighborhood CA that supports small self-replicating loops. To see the rule in action, open Byl-Loop.rle.

Caterpillars
An alternative implementation of the Generations rule 124567/378/4.

Chou-Reggia-1 and Chou-Reggia-2
Two 5-neighborhood CA that supports tiny self-replicating loops. To see the rules in action, open Chou-Reggia-Loop-1.rle and Chou-Reggia-Loop-2.rle.

Codd
In 1968, Edgar F. Codd (who would later invent the relational database) made a simpler version of von Neumann's 29-state CA, using just 8 states. To see the rule in action, open repeater-emitter-demo.rle and the other examples in Patterns/Codd/.

Codd2
A very minor extension of Codd's transition table, to allow for some sheathing cases that were found with large patterns. See sheathing-problems.rle for a demonstration of the problem cases.

CrittersMargolus_emulated
The Critters rule is reversible and has Life-like gliders. See CrittersCircle.rle.

Devore
In 1973, John Devore altered Codd's transition table to allow for simple diodes and triodes, enabling him to make a much smaller replicator than Codd's. See Devore-rep.rle and the other examples in Patterns/Devore/.

DLA-Margolus-emulated
Diffusion-limited aggregation (DLA) is where moving particles can become stuck, forming a distinctive fractal pattern seen in several different natural physical systems. See DLA.rle.

Ed-rep
A version of Fredkin's parity rule, for 7 states. See Ed-rep.rle for an image of Ed Fredkin that photocopies itself.

Evoloop and Evoloop-finite
An extension of the SDSR Loop, designed to allow evolution through collisions. To see the rule in action, open Evoloop-finite.rle.

HPP
The HPP lattice gas. A simple model of gas particles moving at right angles at a fixed speed turns out to give an accurate model of fluid dynamics on a larger scale. Though the later FHP gas improved on the HPP gas by using a hexagonal lattice for more realistic results, the HPP gas is where things began. Open HPP-demo.rle.

Langtons-Ant
Chris Langton's other famous CA. An ant walks around on a binary landscape, collecting and depositing pheremones. See Langtons-Ant.rle.

Langtons-Loops
The original loop. Chris Langton adapted Codd's 1968 CA to support a simple form of self-replication based on a circulating loop of instructions. To see the rule in action, open Langtons-Loops.rle.

LifeHistory
A 7-state extension of the HistoricalLife rule from MCell, allowing for on and off marked cells (states 3 and 4) as well as the history envelope (state 2). State 3 is useful for labels and other identifying marks, since an active pattern can touch or even cross it without being affected. State 5 is an alternate marked ON state most often used to mark a 'starting' location; once a cell changes to state 2, it can not return to this start state. State 6 cells kill any adjacent live cells; they are intended to be used as boundaries between subpatterns, e.g. in an active stamp collection where flying debris from one subpattern might adversely affect another subpattern. See Herschel-conduit-stamp-collection.rle for an example using all of LifeHistory's extra states.

LifeOnTheEdge
A CA proposed by Franklin T. Adams-Watters in which all the action occurs on the edges of a square grid. Each edge can be on or off and has six neighbors, three at each end. An edge is on in the next generation iff exactly two of the edges in its seven edge neighborhood (including the edge itself) are on. This implementation has 3 live states with suitable icons that allow any pattern of edges to be created. Open life-on-the-edge.rle.

LifeOnTheSlope
The same behavior as LifeOnTheEdge but patterns are rotated by 45 degrees. This implementation has only 2 live states (with icons \ and /), so it's a lot easier to enter patterns and they run faster. Open life-on-the-slope.rle.

Perrier
Perrier extended Langton's Loops to allow for universal computation. See Perrier-Loop.rle.

Sand-Margolus-emulated
MCell's Sand rule is a simple simulation of falling sand particles. See Sand.rle.

SDSR-Loop
An extension of Langton's Loops, designed to cause dead loops to disappear, allowing other loops to replicate further. To see the rule in action, open SDSR-Loop.rle.

StarWars
An alternative implementation of the Generations rule 345/2/4.

Tempesti
A programmable loop that can construct shapes inside itself after replication. To see the rule in action, open Tempesti-Loop.rle. This loop prints the letters 'LSL' inside each copy — the initials of Tempesti's university group.

TMGasMargolus_emulated
A different version of the HPP gas, implemented in the Margolus neighborhood, see TMGas.rle.

TripATronMargolus_emulated
The Trip-A-Tron rule in the Margolus neighborhood. See TripATron.rle.

WireWorld
A 4-state CA created by Brian Silverman. WireWorld models the flow of currents in wires and makes it relatively easy to build logic gates and other digital circuits. Open primes.mc and the other examples in Patterns/WireWorld/.

Worm-1040512, Worm-1042015, Worm-1042020, Worm-1252121, Worm-1525115
Examples of Paterson's Worms, a simulation created by Mike Paterson in which a worm travels around a triangular grid according to certain rules. There's also a rule called Worm-complement which can be used to show the uneaten edges within a solid region. Open worm-1040512.rle and the other examples in Patterns/Patersons-Worms/.

References:

Banks-I, Banks-II, Banks-III, Banks-IV (1971)
E. R. Banks. "Information Processing and Transmission in Cellular Automata" PhD Thesis, MIT, 1971.

Byl-Loop (1989)
J. Byl. "Self-Reproduction in small cellular automata." Physica D, Vol. 34, pages 295-299, 1989.

Chou-Reggia-1 and Chou-Reggia-2 (1993)
J. A. Reggia, S. L. Armentrout, H.-H. Chou, and Y. Peng. "Simple systems that exhibit self-directed replication." Science, Vol. 259, pages 1282-1287, February 1993.

Codd (1968)
E. F. Codd, "Cellular Automata" Academic Press, New York, 1968.

Devore (1973)
Devore, J. and Hightower, R. (1992) "The Devore variation of the Codd self-replicating computer" Third Workshop on Artificial Life, Santa Fe, New Mexico, Original work carried out in the 1970s though apparently never published. Reported by John R. Koza, "Artificial life: spontaneous emergence of self-replicating and evolutionary self-improving computer programs," in Christopher G. Langton, Artificial Life III, Proc. Volume XVII Santa Fe Institute Studies in the Sciences of Complexity, Addison-Wesley Publishing Company, New York, 1994, p. 260.

Evoloop (1999)
Hiroki Sayama "Toward the Realization of an Evolving Ecosystem on Cellular Automata", Proceedings of the Fourth International Symposium on Artificial Life and Robotics (AROB 4th '99), M. Sugisaka and H. Tanaka, eds., pp.254-257, Beppu, Oita, Japan, 1999.

HPP (1973)
J. Hardy, O. de Pazzis, and Y. Pomeau. J. Math. Phys. 14, 470, 1973.

Langtons-Ant (1986)
C. G. Langton. "Studying artificial life with cellular automata" Physica D 2(1-3):120-149, 1986.

Langtons-Loops (1984)
C. G. Langton. "Self-reproduction in cellular automata." Physica D, Vol. 10, pages 135-144, 1984.

Paterson's Worms (1973)
See these sites for a good description and the latest results:
http://www.maa.org/editorial/mathgames/mathgames_10_24_03.html
http://wso.williams.edu/~Ebchaffin/patersons_worms/
http://tomas.rokicki.com/worms.html

Perrier (1996)
J.-Y. Perrier, M. Sipper, and J. Zahnd. "Toward a viable, self-reproducing universal computer" Physica D 97: 335-352. 1996

SDSR-Loop (1998)
Hiroki Sayama. "Introduction of Structural Dissolution into Langton's Self-Reproducing Loop." Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, C. Adami, R. K. Belew, H. Kitano, and C. E. Taylor, eds., pp.114-122, Los Angeles, California, 1998, MIT Press.

Tempesti (1995)
G. Tempesti. "A New Self-Reproducing Cellular Automaton Capable of Construction and Computation". Advances in Artificial Life, Proc. 3rd European Conference on Artificial Life, Granada, Spain, June 4-6, 1995, Lecture Notes in Artificial Intelligence, 929, Springer Verlag, Berlin, 1995, pp. 555-563.

WireWorld (1987)
A. K. Dewdney, Computer Recreations. Scientific American 282:136-139, 1990. golly-2.5-src/gui-ios/Help/Lexicon/0000755000175100001440000000000012156146016014140 500000000000000golly-2.5-src/gui-ios/Help/Lexicon/fix-lex-files.py0000644000175100001440000000402012156145314017102 00000000000000# Fix lexicon .htm files included with iGolly. # # We replace this text: # #

"temp" — the directory Golly uses to store various temporary files. All these files are deleted when Golly quits.

"rules" — the user-specific rules directory set in Preferences > Control.

"patterns" — the directory displayed by File > Show Patterns.

"scripts" — the directory displayed by File > Show Scripts.

"download" — the directory Golly uses to store downloaded files.

In each case a full path is returned, terminated by the appropriate path separator for the current platform.
Example: g_open(g_getdir("app")."Patterns/Life/Breeders/breeder.lif");

g_setdir(dirname, dirpath)
Set the specified directory to the given path (which must be a full path to an existing directory). All the directory names listed above are allowed, except for "app", "data" and "temp".
Example: g_setdir("patterns", "/path/to/my-patterns/");

 
EDITING COMMANDS

g_new($title)
Create a new, empty universe and set the window title. If the given title is empty then the current title won't change.
Example: g_new("test-pattern");

g_cut()
Cut the current selection to the clipboard.

g_copy()
Copy the current selection to the clipboard.

g_clear($where)
Clear inside (where = 0) or outside (where = 1) the current selection.
Example: g_clear(1);

g_paste($x, $y, $mode)
Paste the clipboard pattern at x,y using the given mode ("and", "copy", "or", "xor").
Example: g_paste(0, 0, "or");

g_shrink()
Shrink the current selection to the smallest rectangle enclosing all of the selection's live cells.

g_randfill($percentage)
Randomly fill the current selection to a density specified by the given percentage (1 to 100).
Example: g_randfill(50);

g_flip($direction)
Flip the current selection left-right (direction = 0) or top-bottom (direction = 1).

g_rotate($direction)
Rotate the current selection 90 degrees clockwise (direction = 0) or anticlockwise (direction = 1).

g_evolve($cellarray, $numgens)
Advance the pattern in the given cell array reference by the specified number of generations and return a reference to the new cell array.
Example: $newpatt = g_evolve($currpatt, 100);

g_join($cellarray1, $cellarray2)
Join the given cell arrays and return a reference to the resulting cell array. If the given arrays are both one-state then the result is one-state. If at least one of the given arrays is multi-state then the result is multi-state, but with one exception: if both arrays have no cells then the result is an empty one-state array. See below for a description of one-state and multi-state cell arrays.
Example: $result = g_join($part1, $part2);

g_transform($cellarray, $x0, $y0, $axx=1, $axy=0, $ayx=0, $ayy=1)
Apply an affine transformation to the pattern in the given cell array reference and return a reference to the new cell array. For each x,y cell in the input array the corresponding xn,yn cell in the output array is calculated as xn = x0 + x*axx + y*axy, yn = y0 + x*ayx + y*ayy.
Example: $rot_blinker = g_transform($blinker, 0, 0, 0, -1, 1, 0);

g_parse($string, $x0=0, $y0=0, $axx=1, $axy=0, $ayx=0, $ayy=1)
Parse an RLE or Life 1.05 string and return a reference to an optionally transformed cell array.
Example: $blinker = g_parse("3o!");

g_putcells($cellarray, $x0=0, $y0=0, $axx=1, $axy=0, $ayx=0, $ayy=1, $mode="or")
Paste the pattern in the given cell array reference into the current universe using an optional affine transformation and optional mode ("and", "copy", "not", "or", "xor").
Example: g_putcells($cells, 6, -40, 1, 0, 0, 1, "xor");

g_getcells(@rectarray)
Return any live cells in the specified rectangle as a cell array reference. The given rectangle array can be empty (in which case the cell array is empty) or it must represent a valid rectangle of the form (x,y,width,height).
Example: $cells = g_getcells( g_getrect() );

g_getclip()
Parse the pattern data in the clipboard and return a cell array reference, but where the first two numbers are the pattern's width and height (not necessarily the minimal bounding box because the pattern might have empty borders, or it might even be empty). If the clipboard data is multi-state but all cell states happen to be zero then the returned cell array is (wd,ht) rather than (wd,ht,0).
Example: $cells = g_getclip();

g_hash(@rectarray)
Return an integer hash value for the pattern in the given rectangle. Two identical patterns will have the same hash value, regardless of their location in the universe. This command provides a fast way to detect pattern equality, but there is a tiny probability that two different patterns will have the same hash value, so you might need to use additional (slower) tests to check for true pattern equality.
Example: $h = g_hash( g_getrect() );

g_select(@rectarray)
Create a selection if the given array represents a valid rectangle of the form (x,y,width,height) or remove the current selection if the given array is empty.
Example: g_select(-10,-10,20,20);

g_getrect()
Return the current pattern's bounding box as an array. If there is no pattern then the array is empty, otherwise the array is of the form (x,y,width,height).
Example: @pattrect = g_getrect();

g_getselrect()
Return the current selection rectangle as an array. If there is no selection then the array is empty, otherwise the array is of the form (x,y,width,height).
Example: @selrect = g_getselrect();

g_setcell($x, $y, $state)
Set the given cell to the specified state (0 for a dead cell, 1 for a live cell).

g_getcell($x, $y)
Return the state of the given cell. The following example inverts the state of the cell at 0,0.
Example: g_setcell(0, 0, 1 - g_getcell(0, 0));

g_setcursor($string)
Set the current cursor according to the given string and return the old cursor string. The given string must match one of the names in the Cursor Mode menu.
Example: $oldcurs = g_setcursor("Draw");

g_getcursor()
Return the current cursor as a string (ie. the ticked name in the Cursor Mode menu).

 
CONTROL COMMANDS

g_run($numgens)
Run the current pattern for the specified number of generations. Intermediate generations are never displayed, and the final generation is only displayed if the current g_autoupdate setting is 1.
Example: g_run(100);

g_step()
Run the current pattern for the current step. Intermediate generations are never displayed, and the final generation is only displayed if the current g_autoupdate setting is 1.

g_setstep($exp)
Temporarily set the current step exponent to the given integer. A negative exponent sets the step size to 1 and also sets a delay between each step, but that delay is ignored by the g_run and g_step commands. Golly will reset the step exponent to 0 upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: g_setstep(0);

g_getstep()
Return the current step exponent.
Example: g_setstep( g_getstep() + 1 );

g_setbase($base)
Temporarily set the current base step to an integer from 2 to 10000. Golly will restore the default base step (set in Preferences > Control) upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: g_setbase(2);

g_getbase()
Return the current base step.

g_advance($where, $numgens)
Advance inside (where = 0) or outside (where = 1) the current selection by the specified number of generations. The generation count does not change.
Example: g_advance(0, 3);

g_reset()
Restore the starting pattern and generation count. Also reset the algorithm, rule, scale, location and step exponent to the values they had at the starting generation. The starting generation is usually zero, but it can be larger after loading an RLE/macrocell file that stores a non-zero generation count.

g_setgen($gen)
Set the generation count using the given string. Commas and other punctuation marks can be used to make a large number more readable. Include a leading +/- sign to specify a number relative to the current generation count.
Example: g_setgen("-1,000");

g_getgen($sepchar="")
Return the current generation count as a string. The optional parameter (default = "") specifies a separator character that can be used to make the resulting string more readable. For example, g_getgen(",") would return a string like "1,234,567" but g_getgen() would return "1234567". Use the latter call if you want to do arithmetic on the generation count.
Example: $gen = g_getgen();

g_getpop($sepchar="")
Return the current population as a string. The optional parameter (default = "") specifies a separator character that can be used to make the resulting string more readable. For example, g_getpop(",") would return a string like "1,234,567" but g_getpop() would return "1234567". Use the latter call if you want to do arithmetic on the population count.
Example: $pop = g_getpop();

g_empty()
Return 1 if the universe is empty or 0 if there is at least one live cell. This is much more efficient than testing getpop() == 0.
Example: g_exit("All cells are dead.") if g_empty();

g_numstates()
Return the number of cell states in the current universe. This will be a number from 2 to 256, depending on the current algorithm and rule.
Example: $maxstate = g_numstates() - 1;

g_numalgos()
Return the number of algorithms (ie. the number of items in the Set Algorithm menu).
Example: $maxalgo = g_numalgos() - 1;

g_setalgo($string)
Set the current algorithm according to the given string which must match one of the names in the Set Algorithm menu.
Example: g_setalgo("HashLife");

g_getalgo($index=current)
Return the algorithm name at the given index in the Set Algorithm menu, or the current algorithm's name if no index is supplied.
Example: $lastalgo = g_getalgo( g_numalgos() - 1 );

g_setrule($string)
Set the current rule according to the given string. If the current algorithm doesn't support the specified rule then Golly will automatically switch to the first algorithm that does support the rule. If no such algorithm can be found then you'll get an error message and the script will be aborted.
Example: g_setrule("b3/s23");

g_getrule()
Return the current rule as a string in canonical format.
Example: $oldrule = g_getrule();

g_getwidth()
Return the width of the current universe (0 if unbounded).
Example: $wd = g_getwidth();

g_getheight()
Return the height of the current universe (0 if unbounded).
Example: $ht = g_getheight();

 
VIEWING COMMANDS

g_setpos($x, $y)
Change the position of the viewport so the given cell is in the middle. The x,y coordinates are given as strings so the viewport can be moved to any location in the unbounded universe. Commas and other punctuation marks can be used to make large numbers more readable. Apart from a leading minus sign, most non-digits are simply ignored; only alphabetic characters will cause an error message. Note that positive y values increase downwards in Golly's coordinate system.
Example: g_setpos("1,000,000,000,000", "-123456");

g_getpos($sepchar="")
Return the x,y position of the viewport's middle cell in the form of a Perl array containing two strings. The optional parameter (default = "") specifies a separator character that can be used to make the resulting strings more readable. For example, g_getpos(",") might return two strings like "1,234" and "-5,678" but g_getpos() would return "1234" and "-5678". Use the latter call if you want to do arithmetic on the x,y values.
Example: my ($x, $y) = g_getpos();

g_setmag($mag)
Set the magnification, where 0 corresponds to the scale 1:1, 1 = 1:2, -1 = 2:1, etc. The maximum allowed magnification is 5 (= 1:32).
Example: g_setmag(0);

g_getmag()
Return the current magnification.
Example: g_setmag( g_getmag() - 1 );

g_fit()
Fit the entire pattern in the viewport.

g_fitsel()
Fit the current selection in the viewport. The script aborts with an error message if there is no selection.

g_visrect(@rectarray)
Return 1 if the given rectangle is completely visible in the viewport. The rectangle must be an array of the form (x,y,width,height).
Example: g_fitsel() if !g_visrect(@selrect);

g_autoupdate($bool)
When Golly runs a script this setting is initially 0. If the given parameter is 1 then Golly will automatically update the viewport and the status bar after each command that changes the universe or viewport in some way. Useful for debugging Perl scripts.
Example: g_autoupdate(1);

g_update()
Immediately update the viewport and the status bar, regardless of the current g_autoupdate setting. Note that Golly always does an update when a script finishes.

 
LAYER COMMANDS

g_addlayer()
Add a new, empty layer immediately after the current layer and return the new layer's index, an integer from 0 to g_numlayers() - 1. The new layer becomes the current layer and inherits most of the previous layer's settings, including its algorithm, rule, scale, location, cursor mode, etc. The step exponent is set to 0, there is no selection, no origin offset, and the layer's initial name is "untitled".
Example: $newindex = g_addlayer();

g_clone()
Like g_addlayer (see above) but the new layer shares the same universe as the current layer. The current layer's settings are duplicated and most will be kept synchronized so that a change to one clone automatically changes all the others. Each cloned layer does however have a separate viewport, so the same pattern can be viewed at different scales and locations (at the same time if layers are tiled).
Example: $cloneindex = g_clone();

g_duplicate()
Like g_addlayer (see above) but the new layer has a copy of the current layer's pattern. Also duplicates all the current settings but, unlike a cloned layer, the settings are not kept synchronized.
Example: $dupeindex = g_duplicate();

g_dellayer()
Delete the current layer. The current layer changes to the previous layer (unless layer 0 was deleted).

g_movelayer($fromindex, $toindex)
Move a specified layer to a new position in the layer sequence. The chosen layer becomes the current layer.
Example: g_movelayer(1, 0);

g_setlayer($index)
Set the current layer to the layer with the given index, an integer from 0 to g_numlayers() - 1.
Example: g_setlayer(0);

g_getlayer()
Return the index of the current layer, an integer from 0 to g_numlayers() - 1.
Example: $currindex = g_getlayer();

g_numlayers()
Return the number of existing layers, an integer from 1 to g_maxlayers().
Example: g_setoption("tilelayers",1) if g_numlayers() > 1;

g_maxlayers()
Return the maximum number of layers (10 in this implementation).

g_setname($string, $index=current)
Set the name of the given layer, or the current layer's name if no index is supplied.
Example: g_setname("temporary");

g_getname($index=current)
Return the given layer's name, or the current layer's name if no index is supplied.
Example: g_dellayer() if g_getname() eq "temporary";

g_setcolors($colorarray)
Set the color(s) of one or more states in the current layer and its clones (if any). If the given array contains a multiple of 4 integers then they are interpreted as state, red, green, blue values. A state value of -1 can be used to set all live states to the same color (state 0 is not changed). If the given array contains exactly 6 integers then they are interpreted as a color gradient from r1, g1, b1 to r2, g2, b2 for all the live states (state 0 is not changed). If the given array is empty then all states (including state 0) are reset to their default colors, depending on the current algorithm and rule. Note that the color changes made by this command are only temporary. Golly will restore the default colors if a new pattern is opened or created, or if the algorithm or rule changes, or if Preferences > Color is used to change any of the default colors for the current layer's algorithm.

# .O.....
# ...O...
# OO..OOO
# 
etc... # # with: # #

# .O.....
# ...O...
# OO..OOO
# 
# # We also increase font size used for links at top and bottom of each page. import re # ------------------------------------------------------------------------------ def fix_file(filename): print 'fixing ' + filename f = open(filename, 'r') contents = f.read() # use re.DOTALL to include newlines in match for pattdata in re.findall('\n(.*?)', contents, re.DOTALL): ### print pattdata newdata = pattdata.replace('\n','$') ### print newdata contents = contents.replace('\n'+pattdata+'', ''+pattdata+'', 1) # remove small font used for links at top and bottom of each page contents = contents.replace('', '', 2) contents = contents.replace('Z', 'Z', 2) f.close() f = open(filename, 'w') f.write(contents) f.close() # ------------------------------------------------------------------------------ fix_file("lex.htm") fix_file("lex_1.htm") fix_file("lex_a.htm") fix_file("lex_b.htm") fix_file("lex_c.htm") fix_file("lex_d.htm") fix_file("lex_e.htm") fix_file("lex_f.htm") fix_file("lex_g.htm") fix_file("lex_h.htm") fix_file("lex_i.htm") fix_file("lex_j.htm") fix_file("lex_k.htm") fix_file("lex_l.htm") fix_file("lex_m.htm") fix_file("lex_n.htm") fix_file("lex_o.htm") fix_file("lex_p.htm") fix_file("lex_q.htm") fix_file("lex_r.htm") fix_file("lex_s.htm") fix_file("lex_t.htm") fix_file("lex_u.htm") fix_file("lex_v.htm") fix_file("lex_w.htm") fix_file("lex_x.htm") fix_file("lex_y.htm") fix_file("lex_z.htm") golly-2.5-src/gui-ios/Help/Lexicon/lex_1.htm0000644000175100001440000001206512156145314015606 00000000000000 Life Lexicon (1)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:101 (p5) Found by Achim Flammenkamp in August 1994. The name was suggested by Bill Gosper, noting that the phase shown below displays the period in binary.

....OO......OO....
...O.O......O.O...
...O..........O...
OO.O..........O.OO
OO.O.O..OO..O.O.OO
...O.O.O..O.O.O...
...O.O.O..O.O.O...
OO.O.O..OO..O.O.OO
OO.O..........O.OO
...O..........O...
...O.O......O.O...
....OO......OO....

:1-2-3 (p3) Found by Dave Buckingham, August 1972. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are stillater and cuphook.

..OO......
O..O......
OO.O.OO...
.O.O..O...
.O....O.OO
..OOO.O.OO
.....O....
....O.....
....OO....

:1-2-3-4 (p4) See also Achim's p4.

.....O.....
....O.O....
...O.O.O...
...O...O...
OO.O.O.O.OO
O.O.....O.O
...OOOOO...
...........
.....O.....
....O.O....
.....O.....

:14-ner = fourteener

:2 eaters = two eaters

:4-8-12 diamond The following pure glider generator.

....OOOO....
............
..OOOOOOOO..
............
OOOOOOOOOOOO
............
..OOOOOOOO..
............
....OOOO....

:4 boats (p2)

...O....
..O.O...
.O.OO...
O.O..OO.
.OO..O.O
...OO.O.
...O.O..
....O...

:4F = Fast Forward Force Field


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_a.htm0000644000175100001440000003667312156145314015701 00000000000000 Life Lexicon (A)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Achim's p144 (p144) This was found (minus the blocks shown below) on a cylinder of width 22 by Achim Flammenkamp in July 1994. Dean Hickerson reduced it to a finite form using figure-8s the same day. The neater finite form shown here - replacing the figure-8s with blocks - was found by David Bell in August 1994. See factory for a use of this oscillator.

OO........................OO
OO........................OO
..................OO........
.................O..O.......
..................OO........
..............O.............
.............O.O............
............O...O...........
............O..O............
............................
............O..O............
...........O...O............
............O.O.............
.............O..............
........OO..................
.......O..O.................
........OO..................
OO........................OO
OO........................OO

:Achim's p16 (p16) Found by Achim Flammenkamp, July 1994.

.......OO....
.......O.O...
..O....O.OO..
.OO.....O....
O..O.........
OOO..........
.............
..........OOO
.........O..O
....O.....OO.
..OO.O....O..
...O.O.......
....OO.......

:Achim's p4 (p4) Dave Buckingham found this in a less compact form (using two halves of sombreros) in 1976. The form shown here was found by Achim Flammenkamp in 1988. The rotor is two copies of the rotor of 1-2-3-4, so the oscillator is sometimes called the "dual 1-2-3-4".

..OO...OO..
.O..O.O..O.
.O.OO.OO.O.
OO.......OO
..O.O.O.O..
OO.......OO
.O.OO.OO.O.
.O..O.O..O.
..OO...OO..

:Achim's p5 = pseudo-barberpole

:Achim's p8 (p8) Found by Achim Flammenkamp, July 1994.

.OO......
O........
.O...O...
.O...OO..
...O.O...
..OO...O.
...O...O.
........O
......OO.

:acorn (stabilizes at time 5206) A methuselah found by Charles Corderman.

.O.....
...O...
OO..OOO

:A for all (p6) Found by Dean Hickerson in March 1993.

....OO....
...O..O...
...OOOO...
.O.O..O.O.
O........O
O........O
.O.O..O.O.
...OOOO...
...O..O...
....OO....

:against-the-grain grey ship A grey ship in which the region of density 1/2 consists of lines of ON cells lying perpendicular to the direction in which the spaceship moves. See also with-the-grain grey ship.

:agar Any pattern covering the whole plane that is periodic in both space and time. The simplest (nonempty) agar is the stable one extended by the known spacefillers. For some more examples see chicken wire, houndstooth agar, onion rings, squaredance and Venetian blinds. Tiling the plane with the pattern O......O produces another interesting example: a p6 agar which has a phase of density 3/4, which is the highest yet obtained for any phase of an oscillating pattern.

:aircraft carrier (p1) This is the smallest still life that has more than one island.

OO..
O..O
..OO

:airforce (p7) Found by Dave Buckingham in 1972. The rotor consists of two copies of that used in the burloaferimeter.

.......O......
......O.O.....
.......O......
..............
.....OOOOO....
....O.....O.OO
...O.OO...O.OO
...O.O..O.O...
OO.O...OO.O...
OO.O.....O....
....OOOOO.....
..............
......O.......
.....O.O......
......O.......

:AK47 reaction The following reaction (found by Rich Schroeppel and Dave Buckingham) in which a honey farm predecessor, catalysed by an eater and a block, reappears at another location 47 generations later, having produced a glider and a traffic light. This is the basis of a very small (but pseudo) p94 glider gun found by Paul Callahan in July 1994, and was in 1990 the basis for the Dean Hickerson's construction of the first true p94 gun. (This latter gun was enormous, and has now been superseded by comparatively small Herschel loop guns.)

.....O....
....O.O...
...O...O..
...O...O..
...O...O..
....O.O...
.....O....
..........
..OO......
...O......
OOO.....OO
O.......OO

:Al Jolson = Jolson

:almosymmetric (p2) Found in 1971.

....O....
OO..O.O..
O.O......
.......OO
.O.......
O......O.
OO.O.O...
.....O...

:anteater A pattern that consumes ants.

:antlers = moose antlers

:ants (p5 wick) The standard form is shown below. It is also possible for any ant to be displaced by one or two cells relative to either or both of its neighbouring ants. Dean Hickerson found fenceposts for both ends of this wick in October 1992 and February 1993. See electric fence, and also wickstretcher.

OO...OO...OO...OO...OO...OO...OO...OO...OO..
..OO...OO...OO...OO...OO...OO...OO...OO...OO
..OO...OO...OO...OO...OO...OO...OO...OO...OO
OO...OO...OO...OO...OO...OO...OO...OO...OO..

:antstretcher Any wickstretcher that stretches ants.

:anvil The following induction coil.

.OOOO.
O....O
.OOO.O
...O.OO

:APPS (c/5 orthogonally, p30) An asymmetric PPS. The same as the SPPS, but with the two halves 15 generations out of phase with one another. Found by Alan Hensel in May 1998.

:ark A pair of mutually stabilizing switch engines. The archetype is Noah's ark. The diagram below shows an ark found by Nick Gotts that takes until generation 736692 to stabilize, and can therefore be considered as a methuselah.

...........................O....
............................O...
.............................O..
............................O...
...........................O....
.............................OOO
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
OO..............................
..O.............................
..O.............................
...OOOO.........................

:arm A long extension hanging off from the main body of a spaceship or puffer perpendicular to the direction of travel.

A lot of known spaceships have multiple arms. This is an artefact of the search methods used to find such spaceships, rather than an indication of what a "typical" spaceship might look like.

:ash The (stable or oscillating) debris left by a random reaction. Experiments show that for random soups with moderate initial densities (say 0.25 to 0.5) the resulting ash has a density of about 0.0287. (This is, of course, based on what happens in finite fields. In infinite fields the situation may conceivably be different in the long run because of the effect of certain initially very rare objects such as replicators.)

:aVerage (p5) Found by Dave Buckingham, 1973. The average number of live rotor cells is five (V), which is also the period.

...OO........
....OOO......
..O....O.....
.O.OOOO.O....
.O.O....O..O.
OO.OOO..O.O.O
.O.O....O..O.
.O.OOOO.O....
..O....O.....
....OOO......
...OO........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_b.htm0000644000175100001440000013057012156145314015671 00000000000000 Life Lexicon (B)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:B = B-heptomino

:B29 (c/4 diagonally, p4) The following spaceship, found by Hartmut Holzwart in September 2004.

.......OOO.......
.......O.........
OOO......O.......
O......O.O.......
.O....OO.OOOO....
...OOOO.OOOOO.OO.
....OO.......OO.O

:B-52 bomber The following p104 double-barrelled glider gun. It uses a B-heptomino and emits one glider every 52 generations. It was found by Noam Elkies in March 1996, except that Elkies used blockers instead of molds, the improvement being found by David Bell later the same month.

.OO....................................
.OO.................O..................
...................O.O............O.O..
....................O............O.....
OO.......OO.......................O..O.
OO.O.....OO.......................O.O.O
...O.......................O.......O..O
...O.......................OO.......OO.
O..O.................OO.....O..........
.OO..................O.................
.....................OOO...............
....................................OO.
....................................OO.
.OO....................................
O..O...................................
O.O.O................O.O....OO.....OO..
.O..O.................OO....OO.....OO.O
.....O............O...O...............O
..O.O............O.O..................O
..................O................O..O
....................................OO.

:babbling brook Any oscillator whose rotor consists of a string of cells each of which is adjacent to exactly two other rotor cells, except for the endpoints which are adjacent to only one other rotor cell. Compare muttering moat. Examples include the beacon, the great on-off, the light bulb and the spark coil. The following less trivial example (by Dean Hickerson, August 1997) is the only one known with more than four cells in its rotor. It is p4 and has a 6-cell rotor.

.......O........
.....OOO....OO..
....O...OO..O...
.O..O.OO..O.O...
O.O.O....OO..OO.
.OO..OO....O.O.O
...O.O..OO.O..O.
...O..OO...O....
..OO....OOO.....
........O.......

:backrake Another term for a backwards rake. A p8 example by Jason Summers is shown below. See total aperiodic for a p12 example.

.....OOO...........OOO.....
....O...O.........O...O....
...OO....O.......O....OO...
..O.O.OO.OO.....OO.OO.O.O..
.OO.O....O.OO.OO.O....O.OO.
O....O...O..O.O..O...O....O
............O.O............
OO.......OO.O.O.OO.......OO
............O.O............
......OOO.........OOO......
......O...O.........O......
......O.O....OOO...........
............O..O....OO.....
...............O...........
...........O...O...........
...........O...O...........
...............O...........
............O.O............

:backward glider A glider which moves at least partly in the opposite direction to the puffer(s) or spaceship(s) under consideration.

:baker (c p4 fuse) A fuse by Keith McClelland.

..............OO
.............O.O
............O...
...........O....
..........O.....
.........O......
........O.......
.......O........
......O.........
.....O..........
....O...........
...O............
OOO.............
.O..............

:baker's dozen (p12) A loaf hassled by two blocks and two caterers. The original form (using p4 and p6 oscillators to do the hassling) was found by Robert Wainwright in August 1989.

OO.........OO..........
OOOO.O.....OO..........
O.O..OOO...............
...........O...........
....OO....O.O..........
....O.....O..O....O....
...........OO....OO....
.......................
...............OOO..O.O
..........OO.....O.OOOO
..........OO.........OO

:bakery (p1) A common formation of two bi-loaves.

....OO....
...O..O...
...O.O....
.OO.O...O.
O..O...O.O
O.O...O..O
.O...O.OO.
....O.O...
...O..O...
....OO....

:barberpole Any p2 oscillator in the infinite sequence bipole, tripole, quadpole, pentapole, hexapole, heptapole ... (It wasn't my idea to suddenly change from Latin to Greek.) This sequence of oscillators was found by the MIT group in 1970. The term is also used (usually in the form "barber pole") to describe other extensible sections of oscillators or spaceships, especially those (usually of period 2) in which all generations look alike except for a translation and/or rotation/reflection.

:barberpole intersection = quad

:barber's pole = barberpole

:barge (p1)

.O..
O.O.
.O.O
..O.

:basic shuttle = queen bee shuttle

:beacon (p2) The third most common oscillator. Found by Conway, March 1970.

OO..
O...
...O
..OO

:beacon maker (c p8 fuse)

..............OO
.............O.O
............O...
...........O....
..........O.....
.........O......
........O.......
.......O........
......O.........
.....O..........
....O...........
...O............
OOO.............
..O.............
..O.............

:beehive (p1) The second most common still life.

.OO.
O..O
.OO.

:beehive and dock (p1)

...OO.
..O..O
...OO.
......
.OOOO.
O....O
OO..OO

:beehive on big table = beehive and dock

:beehive pusher = hivenudger

:beehive with tail (p1)

.OO...
O..O..
.OO.O.
....O.
....OO

:belly spark The spark of a MWSS or HWSS other than the tail spark.

:bent keys (p3) Found by Dean Hickerson, August 1989. See also odd keys and short keys.

.O........O.
O.O......O.O
.O.OO..OO.O.
....O..O....
....O..O....

:B-heptomino (stabilizes at time 148) This is a very common pattern. It often arises with the cell at top left shifted one space to the left, which does not affect the subsequent evolution. B-heptominoes acquired particular importance in 1996 due to Dave Buckingham's work on B tracks - see in particular My Experience with B-heptominos in Oscillators.

O.OO
OOO.
.O..

:B-heptomino shuttle = twin bees shuttle

:bi-block (p1) The smallest pseudo still life.

OO.OO
OO.OO

:bi-boat = boat-tie

:biclock The following pure glider generator consisting of two clocks.

..O....
OO.....
..OO...
.O...O.
...OO..
.....OO
....O..

:big beacon = figure-8

:big fish = HWSS

:big glider (c/4 diagonally, p4) This was found by Dean Hickerson in December 1989 and was the first known diagonal spaceship other than the glider.

...OOO............
...O..OOO.........
....O.O...........
OO.......O........
O.O....O..O.......
O........OO.......
.OO...............
.O..O.....O.OO....
.O.........OO.O...
...O.O......OO..O.
....OO.O....OO...O
........O.......O.
.......OOOO...O.O.
.......O.OO...OOOO
........O...OO.O..
.............OO...
.........O.OOO....
..........O..O....

:big S (p1)

....OO.
...O..O
...O.OO
OO.O...
O..O...
.OO....

:big table = dock

:billiard table configuration Any oscillator in which the rotor is enclosed within the stator. Examples include airforce, cauldron, clock II, Hertz oscillator, negentropy, pinwheel, pressure cooker and scrubber.

:bi-loaf This term has been used in at least three different senses. A bi-loaf can be half a bakery:

.O.....
O.O....
O..O...
.OO.O..
...O.O.
...O..O
....OO.
or it can be the following much less common still life:
..O....
.O.O...
O..O...
.OO.OO.
...O..O
...O.O.
....O..
or the following pure glider generator:
..O.
.O.O
O..O
.OO.
O..O
O.O.
.O..

:bipole (p2) The barberpole of length 2.

OO...
O.O..
.....
..O.O
...OO

:bi-pond (p1)

.OO....
O..O...
O..O...
.OO.OO.
...O..O
...O..O
....OO.

:bi-ship = ship-tie

:bit A live cell.

:biting off more than they can chew (p3) Found by Peter Raynham, July 1972.

O...........
OOO.........
...O........
..OO........
...OO.......
....OO......
...O..O.....
...O..OO....
....OO.OOO..
........O.O.
..........O.
..........OO

:Black&White = Immigration

:blasting cap The pi-heptomino (after the shape at generation 1). A term used at MIT and still occasionally encountered.

:blinker (p2) The smallest and most common oscillator. Found by Conway, March 1970.

OOO

:blinker puffer Any puffer whose output is blinkers. However, the term is particularly used for p8 c/2 puffers. The first such blinker puffer was found by Robert Wainwright in 1984, and was unexpectedly simple:

...O.....
.O...O...
O........
O....O...
OOOOO....
.........
.........
.........
.OO......
OO.OOO...
.OOOO....
..OO.....
.........
.....OO..
...O....O
..O......
..O.....O
..OOOOOO.
Since then many more blinker puffers have been found. The following one was found by David Bell in 1992 when he was trying to extend an x66:
.............OOO.
............OOOOO
...........OO.OOO
............OO...
.................
.................
.........O.O.....
..O.....O..O.....
.OOOOO...O.O.....
OO...OO.OO.......
.O.......O.......
..OO..O..O.......
..........O......
..OO..O..O.......
.O.......O.......
OO...OO.OO.......
.OOOOO...O.O.....
..O.....O..O.....
.........O.O.....
.................
.................
............OO...
...........OO.OOO
............OOOOO
.............OOO.
The importance of this larger blinker puffer (and others like it), is that the engine which produces the blinker output is only p4. The blinker row produced by the puffer can easily be ignited, and burns cleanly with a speed of 2c/3. When the burning catches up to the engine, it causes a phase change in the puffer. This fact allows p8 blinker puffers to be used to construct rakes of all periods which are large multiples of four.

:blinkers bit pole (p2) Found by Robert Wainwright, June 1977.

.....OO
OOO.O.O
.......
.O.O..O
O....O.
OO...O.

:blinker ship A growing spaceship in which the wick consists of a line of blinkers. An example by Paul Schick based on his Schick engine is shown below. Here the front part is p12 and moves at c/2, while the back part is p26 and moves at 6c/13. Every 156 generations 13 blinkers are created and 12 are destroyed, so the wick becomes one blinker longer.

..........OOOO.............
..........O...O............
..........O................
.OO........O..O............
OO.OO......................
.OOOO...O..................
..OO...O.OO........O....OOO
......O...O........O....O.O
..OO...O.OO........O....OOO
.OOOO...O..................
OO.OO......................
.OO........O..O............
..........O................
..........O...O............
..........OOOO.............

:block (p1) The most common still life.

OO
OO

:blockade (p1) A common formation of four blocks. The final form of lumps of muck.

OO.....................
OO.....................
.......................
.......................
.OO.................OO.
.OO.................OO.
.......................
.......................
.....................OO
.....................OO

:block and dock (p1)

...OO.
...OO.
......
.OOOO.
O....O
OO..OO

:block and glider (stabilizes at time 106)

OO..
O.O.
..OO

:blocker (p8) Found by Robert Wainwright. See also filter.

......O.O.
.....O....
OO..O....O
OO.O..O.OO
....OO....

:block on big table = block and dock

:block on table (p1)

..OO
..OO
....
OOOO
O..O

:block pusher A pattern emitting streams of gliders which can repeatedly push a block further away. This can be used as part of a sliding block memory.

The following pattern, in which three gliders push a block one cell diagonally, is an example of how a block pusher works.

...................O.O
...................OO.
....................O.
......................
......................
......................
...O..................
..O...................
..OOO.................
......................
......................
......................
......................
OO...O................
OO...O.O..............
.....OO...............

:blom (stabilizes at time 23314) The following methuselah, found by Dean Hickerson in July 2002.

O..........O
.OOOO......O
..OO.......O
..........O.
........O.O.

:blonk A block or a blinker. This term is mainly used in the context of sparse Life and was coined by Rich Schroeppel in September 1992.

:blonker (p6) The following oscillator, found by Nicolay Beluchenko in April 2004.

O..OO....O..
OO..O.OO.O..
....O.O.....
.....OO.....
.......O....
.......O...O
.........O.O
..........O.

:boat (p1) The only 5-cell still life.

OO.
O.O
.O.

:boat-bit A binary digit represented by the presence of a boat next to a snake (or other suitable object, such as an aircraft carrier). The bit can be toggled by a glider travelling along a certain path. A correctly timed glider on a crossing path can detect whether the transition was from 1 to 0 (in which case the crossing glider is deleted) or from 0 to 1 (in which case it passes unharmed). Three gliders therefore suffice for a non-destructive read. The mechanisms involved are shown in the diagram below. Here the bit is shown in state 0. It is about to be set to 1 and then switched back to 0 again. The first crossing glider will survive, but the second will be destroyed. (In January 1997 David Bell found a method of reading the bit while setting it to 0. A MWSS is fired at the boat-bit. If it is already 0 then the MWSS passes unharmed, but if it is 1 then the boat and the MWSS are destroyed and, with the help of an eater1, converted into a glider which travels back along exactly the same path that is used by the gliders that toggle the boat-bit.)

......O..................
.......O.................
.....OOO.................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
................O........
..............O.O........
..........OO...OO........
...........OO............
..........O..........O.OO
.....................OO.O
.........................
.........................
.........................
.........................
.........................
.O.......................
.OO......................
O.O......................

:boat maker (c p4 fuse)

................OO
...............O.O
..............O...
.............O....
............O.....
...........O......
..........O.......
.........O........
........O.........
.......O..........
......O...........
.....O............
OOOOO.............
....O.............
....O.............
....O.............
....O.............

:boat on boat = boat-tie

:boat-ship-tie = ship tie boat

:boatstretcher See tubstretcher.

:boat-tie (p1) A 10-cell still life consisting of two boats placed tip-to-tip. The name is a pun on "bow tie".

.O....
O.O...
.OO...
...OO.
...O.O
....O.

:boojum reflector (p1) Dave Greene's name for the following reflector which he found in April 2001, and which is currently the smallest known stable reflector.

....O.O......OO.............................
.....OO......OO.............................
.....O......................................
............................................
............................................
............................................
............................................
............................................
............................................
........................................O...
.......................................O.O..
.......................................O.O..
....................OO................OO.OO.
....................OO......................
......................................OO.OO.
..OO..................................OO.O..
.O.O.......................................O
.O........................................OO
OO..........................................
............................................
..................................OO........
..................................OO....OO..
...........OO...........................O.O.
..........O.O.............................O.
..........O...............................OO
.........OO.......................OO........
..................................OO........
............................................
............................................
.............................O..............
............................O.O.............
.............................O..............

:bookend The following induction coil. It is generation 1 of century.

..OO
O..O
OOO.

:bookends (p1)

OO...OO
O.O.O.O
..O.O..
.OO.OO.

:boss (p4) Found by Dave Buckingham, 1972.

.....O.....
....O.O....
....O.O....
...OO.OO...
..O.....O..
.O.O.O.O.O.
.O.O...O.O.
OO.O...O.OO
O..O.O.O..O
..O.....O..
...OO.OO...
....O.O....
....O.O....
.....O.....

:bottle (p8) Found by Achim Flammenkamp in August 1994. The name is a back-formation from ship in a bottle.

....OO......OO....
...O..O....O..O...
...O.O......O.O...
.OO..OOO..OOO..OO.
O......O..O......O
O.OO..........OO.O
.O.O..........O.O.
...OO........OO...
..................
..................
...OO........OO...
.O.O..........O.O.
O.OO..........OO.O
O......O..O......O
.OO..OOO..OOO..OO.
...O.O......O.O...
...O..O....O..O...
....OO......OO....

:bounding box The smallest rectangular array of cells that contains the whole of a given pattern. For oscillators and guns this usually is meant to include all phases of the pattern, but excludes, in the case of guns, the outgoing stream(s).

:bow tie = boat-tie

:brain (c/3 orthogonally, p3) Found by David Bell, May 1992.

.OOO.........OOO.
O.O.OO.....OO.O.O
O.O.O.......O.O.O
.O.OO.OO.OO.OO.O.
.....O.O.O.O.....
...O.O.O.O.O.O...
..OO.O.O.O.O.OO..
..OOO..O.O..OOO..
..OO..O...O..OO..
.O....OO.OO....O.
.O.............O.

:breeder Any pattern whose population grows at a quadratic rate, although it is usual to exclude spacefillers. It is easy to see that this is the fastest possible growth rate.

The term is also sometimes used to mean specifically the breeder created by Bill Gosper's group at MIT, which was the first known pattern exhibiting superlinear growth.

There are four basic types of breeder, known as MMM, MMS, MSM and SMM (where M=moving and S=stationary). Typically an MMM breeder is a rake puffer, an MMS breeder is a puffer producing puffers which produce stationary objects (still lifes and/or oscillators), an MSM breeder is a gun puffer and an SMM breeder is a rake gun. There are, however, less obvious variants of these types. The original breeder was of type MSM (a p64 puffer puffing p30 glider guns).

The known breeder with the smallest initial population is the metacatacryst.

:bridge A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects joined edge to edge, as in snake bridge snake.

:broken lines A pattern constructed by Dean Hickerson in May 2005 which produces complex broken lines of gliders and blocks.

:broth = soup

:BTC = billiard table configuration

:B track A track for B-heptominoes. The term is more-or-less synonymous with Herschel track, since a B-heptomino becomes a Herschel plus a block in twenty generations.

:buckaroo A queen bee shuttle stabilized at one end by an eater in such a way that it can turn a glider, as shown below. This was found by Dave Buckingham in the 1970s. The name is due to Bill Gosper.

..O.....................
O.O.....................
.OO.....................
...........O............
.........O.O............
........O.O.............
.......O..O...........OO
........O.O...........OO
...OO....O.O............
..O.O......O............
..O.....................
.OO.....................

:bullet heptomino Generation 1 of the T-tetromino.

.O.
OOO
OOO

:bun The following induction coil. By itself this is a common predecessor of the honey farm. See also cis-mirrored R-bee.

.OO.
O..O
.OOO

:bunnies (stabilizes at time 17332) This is a parent of rabbits and was found independently by Robert Wainwright and Andrew Trevorrow.

O.....O.
..O...O.
..O..O.O
.O.O....

:burloaf = loaf

:burloaferimeter (p7) Found by Dave Buckingham in 1972. See also airforce.

....OO....
.....O....
....O.....
...O.OOO..
...O.O..O.
OO.O...O.O
OO.O....O.
....OOOO..
..........
....OO....
....OO....

:bushing That part of the stator of an oscillator which is adjacent to the rotor. Compare casing.

:butterfly The following pattern, or the formation of two beehives that it evolves into after 33 generations. (Compare teardrop, where the beehives are five cells closer together.)

O...
OO..
O.O.
.OOO

:by flops (p2) Found by Robert Wainwright.

...O..
.O.O..
.....O
OOOOO.
.....O
.O.O..
...O..

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_bib.htm0000644000175100001440000001034312156145314016177 00000000000000 Life Lexicon (Bibliography)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

BIBLIOGRAPHY

David I. Bell, Spaceships in Conway's Life. Series of articles posted on comp.theory.cell-automata, Aug-Oct 1992. Now available from his web-site.

David I. Bell, Speed c/3 Technology in Conway's Life, 17 December 1999. Available from his web-site.

Elwyn R. Berlekamp, John H. Conway and Richard K. Guy, Winning Ways for your Mathematical Plays, II: Games in Particular. Academic Press, 1982.

David J Buckingham, Some Facts of Life. BYTE, December 1978.

Dave Buckingham, My Experience with B-heptominos in Oscillators. 12 October 1996. Available from Paul Callahan's web-site.

David J. Buckingham and Paul B. Callahan, Tight Bounds on Periodic Cell Configurations in Life. Experimental Mathematics 7:3 (1998) 221-241. Available at http://www.expmath.org/restricted/7/7.3/callahan.ps.

Noam D. Elkies, The still-Life density problem and its generalizations, pp228-253 of "Voronoi's Impact on Modern Science, Book I", P. Engel, H. Syta (eds), Institute of Mathematics, Kyiv, 1998 = Vol.21 of Proc. Inst. Math. Nat. Acad. Sci. Ukraine, math.CO/9905194.

Martin Gardner, Wheels, Life, and other Mathematical Amusements. W. H. Freeman and Company, 1983.

R. Wm. Gosper, Exploiting Regularities in Large Cellular Spaces. Physica 10D (1984) 75-80.

N. M. Gotts and P. B. Callahan, Emergent structures in sparse fields of Conway's 'Game of Life', in Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, MIT Press, 1998.

Mark D Niemiec, Life Algorithms. BYTE, January 1979.

William Poundstone, The Recursive Universe. William Morrow and Company Inc., 1985.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_c.htm0000644000175100001440000013510612156145314015672 00000000000000 Life Lexicon (C)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:c = speed of light

:CA = cellular automaton

:caber tosser Any pattern whose population is asymptotic to c.log(t) for some constant c, and which contains a glider (or other spaceship) bouncing between a slower receding spaceship and a fixed reflector which emits a spaceship (in addition to the reflected one) whenever the bouncing spaceship hits it.

As the receding spaceship gets further away the bouncing spaceship takes longer to complete each cycle, and so the extra spaceships emitted by the reflector are produced at increasingly large intervals. More precisely, if v is the speed of the bouncing spaceship and u the speed of the receding spaceship, then each interval is (v+u)/(v-u) times as long as the previous one. The population at time t is therefore n.log(t)/log((v+u)/(v-u)) + O(1), where n is the population of one of the extra spaceships (assumed constant).

The first caber tosser was built by Dean Hickerson in May 1991.

:Cambridge pulsar CP 48-56-72 = pulsar (The numbers refer to the populations of the three phases. The Life pulsar was indeed discovered at Cambridge, like the first real pulsar a few years earlier.)

:Canada goose (c/4 diagonally, p4) Found by Jason Summers, January 1999. It consists of a glider plus a tagalong.

OOO..........
O.........OO.
.O......OOO.O
...OO..OO....
....O........
........O....
....OO...O...
...O.O.OO....
...O.O..O.OO.
..O....OO....
..OO.........
..OO.........
At the time of its discovery the Canada goose was the smallest known diagonal spaceship other than the glider, but this record has since been beaten, first by the second spaceship shown under Orion, and more recently by quarter.

:candelabra (p3) By Charles Trawick. See also the note under cap.

....OO....OO....
.O..O......O..O.
O.O.O......O.O.O
.O..O.OOOO.O..O.
....O.O..O.O....
.....O....O.....

:candlefrobra (p3) Found by Robert Wainwright in November 1984.

.....O....
.O.OO.O.OO
O.O...O.OO
.O....O...
.....OO...
The following diagram shows that a pair of these can act in some ways like killer toads. See also snacker.
....O...........O....
OO.O.OO.O...O.OO.O.OO
OO.O...O.O.O.O...O.OO
...O....O...O....O...
...OO...........OO...
.....................
.....................
.........OOO.........
.........O..O........
.........O...........
.........O...O.......
.........O...O.......
.........O...........
..........O.O........

:canoe (p1)

...OO
....O
...O.
O.O..
OO...

:cap The following induction coil. It can also be easily be stabilized to form a p3 oscillator - see candelabra for a slight variation on this.

.OO.
O..O
OOOO

:carnival shuttle (p12) Found by Robert Wainwright in September 1984 (using MW emulators at the end, instead of the monograms shown here).

.................................O...O
OO...OO..........................OOOOO
.O.O.O...O..O......OO...O..O.......O..
.OO.OO..OO...OO....OO..OO...OO....O.O.
.O.O.O...O..O......OO...O..O.......O..
OO...OO..........................OOOOO
.................................O...O

:carrier = aircraft carrier

:casing That part of the stator of an oscillator which is not adjacent to the rotor. Compare bushing.

:catacryst A 58-cell quadratic growth pattern found by Nick Gotts in April 2000. This was formerly the smallest known pattern with superlinear growth, but has since been superseded by the related metacatacryst. The catacryst consists of three arks plus a glider-producing switch engine. It produces a block-laying switch engine every 47616 generations. Each block-laying switch engine has only a finite life, but the length of this life increases linearly with each new switch engine, so that the pattern overall grows quadratically, as an unusual type of MMS breeder.

:catalyst An object that participates in a reaction but emerges from it unharmed. The term is mostly applied to still lifes, but can also be used of oscillators, spaceships, etc. The still lifes and oscillators which form a conduit are examples of catalysts.

:caterer (p3) Found by Dean Hickerson, August 1989. Compare with jam. In terms of its minimum population of 12 this is the smallest p3 oscillator. See also double caterer and triple caterer.

..O.....
O...OOOO
O...O...
O.......
...O....
.OO.....
More generally, any oscillator which serves up a bit in the same manner may be referred to as a caterer.

:Caterpillar A spaceship that works by laying tracks at its front end. The only example constructed to date is a p270 17c/45 spaceship built by Gabriel Nivasch in December 2004, based on work by himself, Jason Summers and David Bell. This Caterpillar has a population of about 12 million in each generation and was put together by a computer program that Nivasch wrote. It is by far the largest and most complex Life object ever constructed.

The 17c/45 Caterpillar is based on the following reaction between a pi-heptomino and a blinker:

...............O
O.............OO
O............OO.
O.............OO
...............O
In this reaction, the pi moves forward 17 cells in the course of 45 generations, while the blinker moves back 6 cells and is rephased. This reaction has been known for many years, but it was only in September 2002 that David Bell suggested that it could be used to build a 17c/45 spaceship, based on a reaction he had found in which pis crawling along two rows of blinkers interact to emit a glider every 45 generations. Similar glider-emitting interactions were later found by Gabriel Nivasch and Jason Summers. The basic idea of the spaceship design is that streams of gliders created in this way can be used to construct fleets of standard spaceships which convey gliders to the front of the blinker tracks, where they can be used to build more blinkers.

A different Caterpillar may be possible based on the following reaction, in which the pattern at top left reappears after 31 generations displaced by (13,1), having produced a new NW-travelling glider. In this case the tracks would be waves of backward-moving gliders.

.OO.....................
...O....................
...O.OO.................
OOO....O................
.......O................
.....OOO................
........................
........................
........................
........................
........................
........................
.....................OOO
.....................O..
......................O.

:Catherine wheel = pinwheel

:cauldron (p8) Found in 1971 independently by Don Woods and Robert Wainwright. Compare with Hertz oscillator.

.....O.....
....O.O....
.....O.....
...........
...OOOOO...
O.O.....O.O
OO.O...O.OO
...O...O...
...O...O...
....OOO....
...........
....OO.O...
....O.OO...

:cavity = eater plug

:cell The fundamental unit of space in the Life universe. The term is often used to mean a live cell - the sense is usually clear from the context.

:cellular automaton A certain class of mathematical objects of which Life is an example. A cellular automaton consists of a number of things. First there is a positive integer n which is the dimension of the cellular automaton. Then there is a finite set of states S, with at least two members. A state for the whole cellular automaton is obtained by assigning an element of S to each point of the n-dimensional lattice Zn (where Z is the set of all integers). The points of Zn are usually called cells. The cellular automaton also has the concept of a neighbourhood. The neighbourhood N of the origin is some finite (nonempty) subset of Zn. The neighbourhood of any other cell is obtained in the obvious way by translating that of the origin. Finally there is a transition rule, which is a function from SN to S (that is to say, for each possible state of the neighbourhood the transition rule specifies some cell state). The state of the cellular automaton evolves in discrete time, with the state of each cell at time t+1 being determined by the state of its neighbourhood at time t, in accordance with the transition rule.

There are some variations on the above definition. It is common to require that there be a quiescent state, that is, a state such that if the whole universe is in that state at generation 0 then it will remain so in generation 1. (In Life the OFF state is quiescent, but the ON state is not.) Other variations allow spaces other than Zn, neighbourhoods that vary over space and/or time, probabilistic or other non-deterministic transition rules, etc.

It is common for the neighbourhood of a cell to be the 3x...x3 (hyper)cube centred on that cell. (This includes those cases where the neighbourhood might more naturally be thought of as a proper subset of this cube.) This is known as the Moore neighbourhood.

:centinal (p100) Found by Bill Gosper. This combines the mechanisms of the p46 and p54 shuttles (see twin bees shuttle and p54 shuttle).

OO................................................OO
.O................................................O.
.O.O.....................OO.....................O.O.
..OO........O............OO............OO.......OO..
...........OO..........................O.O..........
..........OO.............................O..........
...........OO..OO......................OOO..........
....................................................
....................................................
....................................................
...........OO..OO......................OOO..........
..........OO.............................O..........
...........OO..........................O.O..........
..OO........O............OO............OO.......OO..
.O.O.....................OO.....................O.O.
.O................................................O.
OO................................................OO

:century (stabilizes at time 103) This is a common pattern which evolves into three blocks and a blinker. In June 1996 Dave Buckingham built a neat p246 glider gun using a century as the engine. See also bookend and diuresis.

..OO
OOO.
.O..

:chemist (p5)

.......O.......
.......OOO.....
..........O....
.....OOO..O..OO
....O.O.O.O.O.O
....O...O.O.O..
.OO.O.....O.OO.
..O.O.O...O....
O.O.O.O.O.O....
OO..O..OOO.....
....O..........
.....OOO.......
.......O.......

:C-heptomino Name given by Conway to the following heptomino, a less common variant of the B-heptomino.

.OOO
OOO.
.O..

:Cheshire cat A block predecessor by C. R. Tompkins that unaccountably appeared both in Scientific American and in Winning Ways. See also grin.

.O..O.
.OOOO.
O....O
O.OO.O
O....O
.OOOO.

:chicken wire A type of stable agar of density 1/2. The simplest version is formed from the tile:

OO..
..OO
But the "wires" can have length greater than two and need not all be the same. For example:
OO...OOOO.....
..OOO....OOOOO

:cigar = mango

:cis-beacon on anvil (p2)

...OO.
....O.
.O....
.OO...
......
.OOOO.
O....O
.OOO.O
...O.OO

:cis-beacon on table (p2)

..OO
...O
O...
OO..
....
OOOO
O..O

:cis-boat with tail (p1)

.O...
O.O..
OO.O.
...O.
...OO

:cis fuse with two tails (p1) See also pulsar quadrant.

...O..
.OOO..
O...OO
.O..O.
..O.O.
...O..

:cis-mirrored R-bee (p1)

.OO.OO.
O.O.O.O
O.O.O.O
.O...O.

:cis snake = canoe

:clean Opposite of dirty. A reaction which produces a small number of different products which are desired or which are easily deleted is said to be clean. For example, a puffer which produces just one object per period is clean. Clean reactions are useful because they can be used as building blocks in larger constructions.

When a fuse is said to be clean, or to burn cleanly, this usually means that no debris at all is left behind.

:clock (p2) Found by Simon Norton, May 1970. This is the fifth or sixth most common oscillator, being about as frequent as the pentadecathlon, but much less frequent than the blinker, toad, beacon or pulsar. But it's surprisingly rare considering its small size.

..O.
O.O.
.O.O
.O..

:clock II (p4) Compare with pinwheel.

......OO....
......OO....
............
....OOOO....
OO.O....O...
OO.O..O.O...
...O..O.O.OO
...O.O..O.OO
....OOOO....
............
....OO......
....OO......

:cloud of smoke = smoke

:cloverleaf This name was given by Robert Wainwright to his p2 oscillator washing machine. But Achim Flammenkamp also gave this name to Achim's p4.

:cluster Any pattern in which each live cell is connected to every other live cell by a path that does not pass through two consecutive dead cells. This sense is due to Nick Gotts, but the term has also been used in other senses, often imprecise.

:CNWH Conweh, creator of the Life universe.

:Coe ship (c/2 orthogonally, p16) A puffer engine discovered by Tim Coe in October 1995.

....OOOOOO
..OO.....O
OO.O.....O
....O...O.
......O...
......OO..
.....OOOO.
.....OO.OO
.......OO.

:Coe's p8 (p8) Found by Tim Coe in August 1997.

OO..........
OO..OO......
.....OO.....
....O..O....
.......O..OO
.....O.O..OO

:colorized Life A cellular automaton which is the same as Life except for the use of a number of different ON states ("colours"). All ON states behave the same for the purpose of applying the Life rule, but additional rules are used to specify the colour of the resulting ON cells. Examples are Immigration and QuadLife.

:colour of a glider The colour of a glider is a property of the glider which remains constant while the glider is moving along a straight path, but which can be changed when the glider bounces off a reflector. It is an important consideration when building something using reflectors.

The colour of a glider can be defined as follows. First choose some cell to be the origin. This cell is then considered to be white, and all other cells to be black or white in a checkerboard pattern. (So the cell with coordinates (m,n) is white if m+n is even, and black otherwise.) Then the colour of a glider is the colour of its leading cell when it is in a phase which can be rotated to look like this:

OOO
..O
.O.

A reflector which does not change the colour of gliders obviously cannot be used to move a glider onto a path of different colour than it started on. But a 90-degree reflector which does change the colour of gliders is similarly limited, as the colour of the resulting glider will depend only on the direction of the glider, no matter how many reflectors are used. For maximum flexibility, therefore, both types of reflector are required.

:complementary blinker = fore and back

:compression = repeat time

:conduit Any arrangement of still lifes and/or oscillators which move an active object to another location, perhaps also transforming it into a different active object at the same time, but without leaving any permanent debris (except perhaps gliders, or other spaceships) and without any of the still lifes or oscillators being permanently damaged. Probably the most important conduit is the following remarkable one (Dave Buckingham, July 1996) in which a B-heptomino is transformed into a Herschel in 59 generations.

.........OO.O
O.OO......OOO
OO.O.......O.
.............
.........OO..
.........OO..

:confused eaters (p4) Found by Dave Buckingham before 1973.

O..........
OOO........
...O.......
..O........
..O..O.....
.....O.....
...O.O.....
...OO..OO..
.......O.O.
.........O.
.........OO

:converter A conduit in which the input object is not of the same type as the output object. This term tends to be preferred when either the input object or the output object is a spaceship.

The following diagram shows a p8 pi-heptomino-to-HWSS converter. This was originally found by Dave Buckingham in a larger form (using a figure-8 instead of the boat). The improvement shown here is by Bill Gosper (August 1996). Dieter Leithner has since found (much larger) oscillators of periods 44, 46 and 60 to replace the Kok's galaxy.

.O.O..O........
.OOO.O.OO......
O......O.....O.
.O.....OO...O.O
.............OO
OO.....O.......
.O......O......
OO.O.OOO.......
..O..O.O.......
............OOO
............O.O
............O.O

:convoy A collection of spaceships all moving in the same direction at the same speed.

:Corder- Prefix used for things involving switch engines, after Charles Corderman.

:Corder engine = switch engine

:Cordergun A gun firing Corderships. The first was built by Jason Summers in July 1999, using a glider synthesis by Stephen Silver.

:Cordership Any spaceship based on switch engines. These necessarily move at a speed of c/12 diagonally with a period of 96 (or a multiple thereof). The first was found by Dean Hickerson in April 1991. Corderships are the slowest spaceships so far constructed, although arbitrarily slow spaceships are known to exist (see universal constructor). Hickerson's original Cordership used 13 switch engines. He soon reduced this to 10, and in August 1993 to 7. In July 1998 he reduced it to 6. In January 2004, Paul Tooke found the 3-engine Cordership shown below.

................................OO.O...........................
...............................OOO.O......O.O..................
..............................O....O.O....O....................
...............................OO......O.O...O.................
................................O...O..O..OO...................
...................................O.OO...O....................
..................................O.O................OO........
..................................O.O................OO........
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
.............................................................OO
....................................................OO.......OO
.......................................O.........O.OOOO........
..................................O...OOOOO.....OO.O...OO......
.................................O.O.......OO....O..OO.OO......
.................................O.......O.OO.....OOOOOO.......
..................................O........OO......O...........
...................................O...OOOO....................
........................................OOO....................
........................O.O.........OO.........................
........................O.O.O......O.O.........................
.......................O..OO.O....OO...........................
........................OO...O.O.OO.O..........................
........................OO...OO.OOOOO..........................
............................O.OO...OO..........................
...........................O.O.................................
..OO.O.........................................................
.OOO.O......O.O................................................
O....O.O....O..................................................
.OO......O.O...O...............................................
..O...O..O..OO...........O.....................................
.....O.OO...O...........OOO....................................
....O.O.................O..O...................................
....O.O................O....O..................................
........................O......................................
...............................................................
........................O..O...................................
.........................O.O...................................
...............................................................
.....................O.........................................
....................OOO........................................
...................OO.OO.......................................
.........O........OO.O.....O...................................
....O...OOOOO....OO......OO....................................
...O.O.......OO..OO.......OO...................................
...O.......O.OO................................................
....O........OO................................................
.....O...OOOO..................................................
..........OOO..................................................
...............................................................
...............................................................
...............................................................
...........OO..................................................
...........OO..................................................

:cousins (p3) This contains two copies of the stillater rotor.

.....O.OO....
...OOO.O.O...
O.O......O...
OO.OO.OO.O.OO
...O.O....O.O
...O.O.OOO...
....OO.O.....

:cover The following induction coil. See scrubber for an example of its use.

....O
..OOO
.O...
.O...
OO...

:covered table = cap

:cow (c p8 fuse)

OO.......OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....
OO....O.OOO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO...OO
....OO.O.................................................O.O
....OO...OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
....OO.O..................................................O.
OO....O.OOO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.
OO.......OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....

:CP pulsar = pulsar

:crane (c/4 diagonally, p4) The following spaceship found by Nicolay Beluchenko in September 2005, a minor modification of a tubeater found earlier by Hartmut Holzwart. The wing is of the same form as in the swan and Canada goose.

.OO.................
OO..................
..O.................
....OO...O..........
....OO..O.O.........
.......OO.O.........
.......OO...........
.......OO...........
.................OO.
.........O....OO.O..
.........OOO..OO....
.........OOO..OO....
..........OO........
....................
............O.......
...........OO.......
...........O........
............O.......
....................
.............OO.....
..............O.OO..
..................O.
...............OO...
...............OO...
.................O..
..................OO

:cross (p3) Found by Robert Wainwright in October 1989.

..OOOO..
..O..O..
OOO..OOO
O......O
O......O
OOO..OOO
..O..O..
..OOOO..
In February 1993, Hartmut Holzwart noticed that this is merely the smallest of an infinite family of p3 oscillators. The next smallest member is shown below.
..OOOO.OOOO..
..O..O.O..O..
OOO..OOO..OOO
O...........O
O...........O
OOO.......OOO
..O.......O..
OOO.......OOO
O...........O
O...........O
OOO..OOO..OOO
..O..O.O..O..
..OOOO.OOOO..

:crowd (p3) Found by Dave Buckingham in January 1973.

...........O..
.........OOO..
.....OO.O.....
.....O...O....
.......OO.O...
...OOOO...O...
O.O.....O.O.OO
OO.O.O.....O.O
...O...OOOO...
...O.OO.......
....O...O.....
.....O.OO.....
..OOO.........
..O...........

:crown The p12 part of the following p12 oscillator, where it is hassled by caterer, a jam and a HW emulator. This oscillator was found by Noam Elkies in January 1995.

..........O...........
..........O......O....
...O....O...O...OO....
...OO....OOO..........
.........OOO..OOO..O.O
.O..OOO.........O.OOOO
O.O.O...............OO
O..O..................
.OO........OO.........
......OO.O....O.OO....
......O..........O....
.......OO......OO.....
....OOO..OOOOOO..OOO..
....O..O........O..O..
.....OO..........OO...

:crucible = cauldron

:crystal A regular growth that is sometimes formed when a stream of gliders, or other spaceships, is fired into some junk.

The most common example is initiated by the following collision of a glider with a block. With a glider stream of even period at least 82, this gives a crystal which forms a pair beehives for every 11 gliders which hit it.

.O......
..O...OO
OOO...OO

:cuphook (p3) Found by Rich Schroeppel, October 1970. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are 1-2-3 and stillater.

....OO...
OO.O.O...
OO.O.....
...O.....
...O..O..
....OO.O.
.......O.
.......OO
The above is the original form, but it can be made more compact:
....OO.
...O.O.
...O...
OO.O...
OO.O..O
...O.OO
...O...
..OO...

:curl = loop


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_d.htm0000644000175100001440000005217312156145314015675 00000000000000 Life Lexicon (D)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:dart (c/3 orthogonally, p3) Found by David Bell, May 1992.

.......O.......
......O.O......
.....O...O.....
......OOO......
...............
....OO...OO....
..O...O.O...O..
.OO...O.O...OO.
O.....O.O.....O
.O.OO.O.O.OO.O.

:dead spark coil (p1) Compare spark coil.

OO...OO
O.O.O.O
..O.O..
O.O.O.O
OO...OO

:de Bruijn diagram = de Bruijn graph

:de Bruijn graph As applied to Life, a de Bruijn graph is a graph showing which pieces can be linked to which other pieces to form a valid part of a Life pattern of a particular kind.

For example, if we are interested in still lifes, then we could consider 2x3 rectangular pieces and the de Bruijn graph would show which pairs of these can be overlapped to form 3x3 squares in which the centre cell remains unchanged in the next generation.

David Eppstein's search program gfind is based on de Bruijn graphs.

:Deep Cell A pattern by Jared James Prince, based on David Bell's unit Life cell, in which each unit cell simulates two Life cells, in such a way that a Life universe filled with Deep Cells simulates two independent Life universes running in parallel.

In fact, a Life universe filled with Deep Cells can simulate infinitely many Life universes, as follows. Let P1, P2, P3, ... be a sequence of Life patterns. Set the Deep Cells to run a simulation of P1 in parallel with a simulation of a universe filled with Deep Cells, with these simulated Deep Cells running a simulation of P2 in parallel with another simulation of a universe filled with Deep Cells, with these doubly simulated Deep Cells simulating P3 in parallel with yet another universe of Deep Cells, and so on.

Deep Cell is available from http://psychoticdeath.com/life.htm.

:density The density of a pattern is the limit of the proportion of live cells in a (2n+1)x(2n+1) square centred on a particular cell as n tends to infinity, when this limit exists. (Note that it does not make any difference what cell is chosen as the centre cell. Also note that if the pattern is finite then the density is zero.) There are other definitions of density, but this one will do here.

In 1994 Noam Elkies proved that the maximum density of a stable pattern is 1/2, which had been the conjectured value. See the paper listed in the bibliography. Marcus Moore provided a simpler proof in 1995, and in fact proves that a still life with an m x n bounding box has at most (mn+m+n)/2 cells.

But what is the maximum average density of an oscillating pattern? The answer is conjectured to be 1/2 again, but this remains unproved. The best upper bound so far obtained is 8/13 (Hartmut Holzwart, September 1992).

The maximum possible density for a phase of an oscillating pattern is also unknown. An example with a density of 3/4 is known (see agar), but densities arbitrarily close to 1 may perhaps be possible.

:D-heptomino = Herschel

:diamond = tub

:diamond ring (p3) Found by Dave Buckingham in 1972.

......O......
.....O.O.....
....O.O.O....
....O...O....
..OO..O..OO..
.O....O....O.
O.O.OO.OO.O.O
.O....O....O.
..OO..O..OO..
....O...O....
....O.O.O....
.....O.O.....
......O......

:diehard Any pattern that vanishes, but only after a long time. The following example vanishes in 130 generations, which is probably the limit for patterns of 7 or fewer cells. Note that there is no limit for higher numbers of cells - e.g., for 8 cells we could have a glider heading towards an arbitrarily distant blinker.

......O.
OO......
.O...OOO

:dinner table (p12) Found by Robert Wainwright in 1972.

.O...........
.OOO.......OO
....O......O.
...OO....O.O.
.........OO..
.............
.....OOO.....
.....OOO.....
..OO.........
.O.O....OO...
.O......O....
OO.......OOO.
...........O.

:dirty Opposite of clean. A reaction which produces a large amount of complicated junk which is difficult to control or use is said to be dirty. Many basic puffer engines are dirty and need to be tamed by accompanying spaceships in order to produce clean output.

:diuresis (p90) Found by David Eppstein in October 1998. His original stabilization used pentadecathlons. The stabilization with complicated still lifes shown here (in two slightly different forms) was found by Dean Hickerson the following day. The name is due to Bill Gosper (see kidney).

.....OO................OO....
......O................O.....
......O.O............O.O.....
.......OO............OO......
.............................
....OO..................OO...
....O.O..........OO....O.O...
.....O..........O.O.....O....
..O.............OO.........O.
..OOOOOO........O.....OOOOOO.
.......O..............O......
....OO..................OO...
....O....................O...
.....O..................O....
..OOO..O..............O..OOO.
..O..OOO........O.....OOO...O
...O............OO.......OOO.
....OO..........O.O.....O....
......O..........OO....O..OO.
....OO..................OO.O.
.O..O....................O...
O.O.O..OO............OO..O...
.O..O.O.O............O.O.OO..
....O.O................O..O..
.....OO................OO....

:dock The following induction coil.

.OOOO.
O....O
OO..OO

:domino The 2-cell polyomino. A number of objects, such as the HWSS and pentadecathlon, produce domino sparks.

:do-see-do The following reaction, found by David Bell in 1996, in which two gliders appear to circle around each other as they are reflected 90 degrees by a twin bees shuttle. Four copies of the reaction can be used to create a p92 glider loop which repeats the do-see-do reaction forever.

.....................................................O.O
.....................................................OO.
......................................................O.
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
................................................OO......
................................................O.......
..............................................O.O.......
..............................................OO........
..............................O.O.......................
..............................OO........................
...............................O........................
........................................................
.......................OOO..............................
OO........OOO........OO.O.OO............................
OO........O...O.....O.....OO............................
..........O....O.....OO.O.OO............................
...........O...O.......OOO..............................
........................................................
...........O...O........................................
..........O....O........................................
OO........O...O............OO...........................
OO........OOO..............OO...........................

:double-barrelled Of a gun, emitting two streams of spaceships (or rakes). See B-52 bomber for an example.

:double block reaction A certain reaction that can be used to stabilize the twin bees shuttle (qv). This was discovered by David Bell in October 1996.

The same reaction sometimes works in other situations, as shown in the following diagram where a pair of blocks eats an R-pentomino and a LWSS. (The LWSS version was known at least as early 1994, when Paul Callahan saw it form spontaneously as a result of firing a LWSS stream at some random junk.)

.OOOO.....OO....
O...O......OO.OO
....O......O..OO
O..O............
................
.............OO.
.............OO.

:double caterer (p3) Found by Dean Hickerson, October 1989. Compare caterer and triple caterer.

.....OO...O........
....O..O..OOO......
....OO.O.....O.....
......O.OOOO.O.....
..OOO.O.O...O.OO...
.O..O..O...O..O.O..
O.O..O...O.OO....O.
.O..........OO.OOO.
..OO.OO.OO...O.....
...O...O.....O.OOO.
...O...O......OO..O
.................OO

:double ewe (p3) Found by Robert Wainwright before September 1971.

......OO............
.......O............
......O.............
......OO............
.........OO.........
......OOO.O.........
O.OO.O..............
OO.O.O..............
.....O...O..........
....O...OO....OO....
....OO....OO...O....
..........O...O.....
..............O.O.OO
..............O.OO.O
.........O.OOO......
.........OO.........
............OO......
.............O......
............O.......
............OO......

:double wing = moose antlers

:dove The following induction coil.

.OO..
O..O.
.O..O
..OOO

:down boat with tail = cis-boat with tail

:dragon (c/6 orthogonally, p6) This spaceship, discovered by Paul Tooke in April 2000, was the first known c/6 spaceship. All other known orthogonal c/6 spaceships are flotillas involving at least two dragons.

.............O..OO......O..OOO
.....O...OOOO.OOOOOO....O..OOO
.OOOOO....O....O....OOO.......
O......OO.O......OO.OOO..O.OOO
.OOOOO.OOO........OOOO...O.OOO
.....O..O..............O......
........OO..........OO.OO.....
........OO..........OO.OO.....
.....O..O..............O......
.OOOOO.OOO........OOOO...O.OOO
O......OO.O......OO.OOO..O.OOO
.OOOOO....O....O....OOO.......
.....O...OOOO.OOOOOO....O..OOO
.............O..OO......O..OOO

:drain trap = paperclip

:drifter A perturbation moving within a stable pattern. Dean Hickerson has written a program to search for drifters, with the hope of finding one which could be moved around a track. Because drifters can be very small, they could be packed more tightly than Herschels, and so allow the creation of oscillators of periods not yet attained, and possibly prove that Life is omniperiodic. Hickerson has found a number of components towards this end, but it has proved difficult to change the direction of movement of a drifter, and so far no complete track has been found. However, Hickerson has had success using the same search program to find eaters with novel properties, such as that used in diuresis.

:dual 1-2-3-4 = Achim's p4


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_e.htm0000644000175100001440000006117712156145314015702 00000000000000 Life Lexicon (E)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:early universe Conway's somewhat confusing term for sparse Life.

:eater Any still life that has the ability to interact with certain patterns without suffering any permanent damage. (If it doesn't suffer even temporary damage then it may be referred to as a rock.) The eater1 is a very common eater, and the term "eater" is often used specifically for this object. Other eaters include eater2, eater3, eater4 and even the humble block. (In fact the block was the first known eater, being found capable of eating beehives from a queen bee.) Another useful eater is shown below, feasting on a glider.

...O.....
...O.O...
...OO....
.........
.......OO
...O...OO
..O.O....
.O.O.....
.O.......
OO.......

:eater1 (p1) Usually simply called an eater, and also called a fishhook. Its ability to eat various objects was discovered by Bill Gosper in 1971.

OO..
O.O.
..O.
..OO

:eater2 (p1) This eater was found by Dave Buckingham in the 1970s. Mostly it works like the ordinary eater (see eater1) but with two slight differences that make it useful despite its size: it takes longer to recover from each bite and it acts like an eater in two directions. The first property means that, among other things, it can eat a glider in a position that would destroy a fishhook. This novel glider-eating action is occasionally of use in itself, and combined with the symmetry means that an eater2 can eat gliders along four different paths.

...O.OO
.OOO.OO
O......
.OOO.OO
...O.O.
...O.O.
....O..
The following eater2 variant (Stephen Silver, May 1998) can be useful for obtaining smaller bounding boxes. A more compact variant with the same purpose can be seen under gliderless.
OO....
O.....
..O.OO
.OO.OO
......
.OO.OO
..O.O.
..O.O.
...O..

:eater3 (p1) This large symmetric eater, found by Dave Buckingham, has a very different eating action from the eater1 and eater2. The loaf can take bites out things, being flipped over in the process. The rest of the object merely flips it back again.

.........OO.
....OO..O..O
.O..O....O.O
O.O.O.....O.
.O..O.OO....
....O..O....
.....O....O.
......OOOOO.
............
........O...
.......O.O..
........O...

:eater4 (p1) Another eater by Dave Buckingham, which he found in 1971, but did not recognize as an eater until 1975 or 1976. It can't eat gliders, but it can be used for various other purposes. The four NE-most centre cells regrow in a few generations after being destroyed by taking a bite out of something.

...OO.........
...O..........
OO.O..........
O..OO.........
.OO....O......
...OOOOO......
...O....OO....
....OO..O.....
......O.O.....
......O.O.O..O
.......OO.OOOO
.........O....
.........O.O..
..........OO..

:eater/block frob (p4) Found by Dave Buckingham in 1976 or earlier.

.OO.......
..O.......
..O.O.....
...O.O....
.....OO.OO
........OO
..OO......
...O......
OOO.......
O.........

:eater-bound pond = biting off more than they can chew

:eater-bound Z-hexomino = pentoad

:eater eating eater = two eaters

:eater plug (p2) Found by Robert Wainwright, February 1973.

.......O
.....OOO
....O...
.....O..
..O..O..
.O.OO...
.O......
OO......

:eaters + = French kiss

:eaters plus = French kiss

:ecologist (c/2 orthogonally, p20) This consists of the classic puffer train with a LWSS added to suppress the debris. See also space rake.

OOOO.....OO........
O...O...OO.OO......
O........OOOO......
.O..O.....OO.......
...................
.....O.........OO..
...OOO........OOOOO
..O...O.....O....OO
..O....OOOOO.....OO
..OO.O.OOOO....OO..
....O...OO.OOO.....
.....O.O...........
...................
...................
OOOO...............
O...O..............
O..................
.O..O..............

:edge-repair spaceship A spaceship which has an edge that possesses no spark and yet is able to perturb things because of its ability to repair certain types of damage to itself. The most useful examples are the following two small p3 c/3 spaceships:

..................................O.....
........O.......................OOO.OOO.
.......OOOO....................OO......O
..O...O...OO.OO...........O...O..O...OO.
.OOOO.....O..OO..........OOOO...........
O...O.......O..O........O...O...........
.O.O..O..................O.O..O.........
.....O.......................O..........
These were found by David Bell in 1992, but the usefulness of the edge-repair property wasn't recognised until July 1997. The following diagram (showing an edge-repair spaceship deleting a Herschel) demonstrates the self-repairing action.
................O.......
O..............OOOO.....
O.O.......O...O...OO.OO.
OOO......OOOO.....O..OO.
..O.....O...O.......O..O
.........O.O..O.........
.............O..........
In October 2000, David Bell found that a T-tetromino component of a c/4 spaceship can also be self-repairing. Stephen Silver noticed that it could be used to delete beehives and, in November 2000, found the smallest known c/4 spaceship with this edge-repair component - in fact, two copies of the component:
.OO..........................
O..O.........................
.OO..........................
.............................
.......O.O...................
.......O.....................
.......O.O..O..O.............
..........O..................
...........O.OO.O............
............OOO.O............
...........O....O..O.OO......
........O...OO...O.OOOO......
........OO..O..O.OO....O....O
........O........OO....O..OOO
.............OO...OO...O..OO.
.OO..........................
O..O.........................
.OO..........................

:edge shooter A gun which fires its gliders (or whatever) right at the edge of the pattern, so that it can be used to fire them closely parallel to others. This is useful for constructing complex guns. Compare glider pusher, which can in fact be used for making edge shooters.

The following diagram shows a p46 edge shooter found by Paul Callahan in June 1994.

OO............OO..O....OO..OO.............
OO............O.OO......OO.OO.............
...............O......O.O.................
...............OOO....OO..................
..........................................
...............OOO....OO..................
...............O......O.O.................
OO............O.OO......OO................
OO............OO..O....OO.................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...............................OOO...OOO..
..............................O...O.O...O.
.............................O...OO.OO...O
.............................O.OO.....OO.O
...............................O.......O..
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...............................OO.....OO..
...............................OO.....OO..

:edge spark A spark at the side of a spaceship that can be used to perturb things as the spaceship passes by.

:edge sparker A spaceship that produces one or more edge sparks.

:egg = non-spark

:E-heptomino Name given by Conway to the following heptomino.

.OOO
OO..
.OO.

:elbow ladder Scot Ellison's name for the type of pattern he created in which one or more gliders shuttle back and forth (using the kickback reaction) deleting the output gliders from a pair of slide guns.

:electric fence (p5) A stabilization of ants. Dean Hickerson, February 1993.

..........O..................................................
.........O.O........................OO.......................
..O....OOO.O.....O...................O...O..O......O.....OO..
.O.O..O....OO...O.O..................O.OOO..OOO...O.O....O...
.O.O..O.OO.......O....................O...OO...O.O..O......O.
OO.OO.O.O.OOOOO.....O..................OO...O..O.O.OO.OO..OO.
.O.O..O...O..O..O.......OO...OO...OO....OO.OO..O.O..O.O.O....
.O..OO....OO......OOO.OO...OO...OO...OOO.....OOOO.OOO.O...OO.
..O..OOO..O..O.OOOO...OO...OO...OO...OOO.OO..O....O.O....O..O
...OO...O.O..O.....OO...OO...OO...OO......O............O...OO
.....OO.O.OO.O.OO..O......................O........OO.O......
.....O.OO.O..O.OO....O.................OO.O.O................
...........OO.......OO..................O..OO................
......................................O.O....................
......................................OO.....................

:elevener (p1)

OO....
O.O...
..O...
..OOO.
.....O
....OO

:Elkies' p5 (p5) Found by Noam Elkies in 1997.

.O.......
O..OOO...
..O......
...O.O..O
..OO.OOOO
....O....
....O.O..
.....OO..

:emu Dave Buckingham's term for a Herschel loop that does not emit gliders (and so is "flightless"). All known Herschel loops of periods 57, 58, 59 and 61 are emus. See also Quetzal.

:emulator Any one of three p4 oscillators that produce sparks similar to those produced by LWSS, MWSS and HWSS. See LW emulator, MW emulator and HW emulator. Larger emulators are also possible, but they require stabilizing objects to suppress their non-sparks and so are of little use. The emulators were discovered by Robert Wainwright in June 1980.

:engine The active portion of an object (usually a puffer or gun) which is considered to actually produce its output, and which generally permits no variation in how it works. The other parts of the object are just there to support the engine. For examples, see puffer train, Schick engine, blinker puffer, frothing puffer and line puffer.

:en retard (p3) Found by Dave Buckingham, August 1972.

.....O.....
....O.O....
OO.O.O.O.OO
.O.O...O.O.
O..O.O.O..O
.OO.....OO.
...OO.OO...
...O.O.O...
....O.O....
..O.O.O.O..
..OO...OO..

:Enterprise (c/4 diagonally, p4) Found by Dean Hickerson, March 1993.

.......OOO...........
.....O.OO............
....OOOO.............
...OO.....O..........
..OOO..O.O.O.........
.OO...O.O..O.........
.O.O.OOOOO...........
OO.O.O...O...........
O........OO..........
.OO..O...O.O.........
....OO..O.OO......O..
...........OO.....OOO
............O..OOO..O
............O..O..OO.
.............O.OO....
............OO.......
............OO.......
...........O.........
............O.O......
...........O..O......
.............O.......

:Eureka (p30) A pre-pulsar shuttle found by Dave Buckingham in August 1980. A variant is obtained by shifting the top half two spaces to either side.

.O..............O.
O.O....O.......O.O
.O...OO.OO......O.
.......O..........
..................
..................
..................
.......O..........
.O...OO.OO......O.
O.O....O.......O.O
.O..............O.

:evolutionary factor For an unstable pattern, the time to stabilization divided by the initial population. For example, the R-pentomino has an evolutionary factor of 220.6, while bunnies has an evolutionary factor of 1925.777... The term is no longer in use.

:exposure = underpopulation

:extensible A pattern is said to be extensible if arbitrarily large patterns of the same type can be made by repeating parts of the original pattern in a regular way.

:extra extra long = long^4

:extra long = long^3

:extremely impressive (p6) Found by Dave Buckingham, August 1976.

....OO......
...O.OOO....
...O....O...
OO.O...OO...
OO.O.....OO.
....OOOOO..O
..........OO
......O.....
.....O.O....
......O.....

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_f.htm0000644000175100001440000005512212156145314015674 00000000000000 Life Lexicon (F)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:factory Another word for gun, but not used in the case of glider guns. The term is also used for a pattern that repeatedly manufactures objects other than spaceships or rakes. In this case the new objects do not move out of the way, and therefore must be used up in some way before the next one is made. The following shows an example of a p144 gun which consists of a p144 block factory whose output is converted into gliders by a p72 oscillator. (This gun is David Bell's improvement of the one Bill Gosper found in July 1994. The p72 oscillator is by Robert Wainwright, 1990, and the block factory is Achim's p144 minus one of its stabilizing blocks.)

.......................OO........................OO
.......................OO........................OO
.........................................OO........
........................................O..O.......
.........................................OO........
...................................................
....................................OOO............
....................................O.O............
.........OO.........................OOO............
.........OO.........................OO.............
........O..O.......................OOO.............
........O..O.OO....................O.O.............
........O....OO....................OOO.............
..........OO.OO....................................
...............................OO..................
.....................OO.......O..O.................
.....................OO........OO..................
.................................................OO
.................................................OO
...................................................
....OO..................O..........................
OO....OOOO..........OO..OO.OOO.....................
OO..OO.OOO..........OO....OOOO.....................
....O...................OO.........................

:familiar fours Common patterns of four identical objects. The five commonest are traffic light (4 blinkers), honey farm (4 beehives), blockade (4 blocks), fleet (4 ships, although really 2 ship-ties) and bakery (4 loaves, although really 2 bi-loaves).

:fanout A mechanism that emits two or more objects of some type for each one that it receives. Typically the objects are gliders or Herschels; glider duplicators are a special case.

:Fast Forward Force Field The following reaction found by Dieter Leithner in May 1994. In the absence of the incoming LWSS the gliders would simply annihilate one another, but as shown they allow the LWSS to advance 11 spaces in the course of the next 6 generations. A neat illusion. See also star gate. (Leithner named the Fast Forward Force Field in honour of his favourite science fiction writer, the physicist Robert L. Forward.)

.......O......O..
........O......OO
..OO..OOO.....OO.
OO.OO............
OOOO.........O...
.OO.........OO...
............O.O..

:father = parent

:featherweight spaceship = glider

:fencepost Any pattern that stabilizes one end of a wick.

:Fermat prime calculator A pattern constructed by Jason Summers in January 2000 that exhibits infinite growth if and only if there are no Fermat primes greater than 65537. The question of whether or not it really does exhibit infinite growth is therefore equivalent to a well-known and long-standing unsolved mathematical problem. It will, however, still be growing at generation 102585827975. The pattern is based on Dean Hickerson's primer and caber tosser patterns and a p8 beehive puffer by Hartmut Holzwart.

:F-heptomino Name given by Conway to the following heptomino.

OO..
.O..
.O..
.OOO

:figure-8 (p8) Found by Simon Norton in 1970.

OOO...
OOO...
OOO...
...OOO
...OOO
...OOO

:filter Any oscillator used to delete some but not all of the spaceships in a stream. An example is the blocker, which can be positioned so as to delete every other glider in a stream of period 8n+4, and can also do the same for LWSS streams. Other examples are the MW emulator and T-nosed p4 (either of which can be used to delete every other LWSS in a stream of period 4n+2), the fountain (which does the same for MWSS streams) and a number of others, such as the p6 pipsquirter, the pentadecathlon and the p72 oscillator shown under factory. Another example, a p4 oscillator deleting every other HWSS in a stream of period 4n+2, is shown below. (The p4 oscillator here was found, with a slightly larger stator, by Dean Hickerson in November 1994.)

..........OOOO............
....OO...OOOOOO...........
OOOO.OO..OOOO.OO..........
OOOOOO.......OO...........
.OOOO.....................
..........................
................OO........
..............O....O......
..........................
.............O.O..O.O.....
...........OOOO.OO.OOOO...
........O.O....O..O....O.O
........OO.OO.O....O.OO.OO
...........O.O......O.O...
........OO.O.O......O.O.OO
........OO.O..........O.OO
...........O.O.OOOO.O.O...
...........O.O......O.O...
..........OO.O.OOOO.O.OO..
..........O..OOO..OOO..O..
............O..OOOO..O....
...........OO.O....O.OO...
...........O..O....O..O...
............O..O..O..O....
.............OO....OO.....

:fire-spitting (p3) Found by Nicolay Beluchenko, September 2003.

...O......
.OOO......
O.........
.O.OOO....
.O.....O..
..O..O....
..O.O..O.O
........OO

:fish A generic term for LWSS, MWSS and HWSS, or, more generally, for any spaceship.

:fishhook = eater1

:fleet (p1) A common formation of two ship-ties.

....OO....
....O.O...
.....OO...
.......OO.
OO.....O.O
O.O.....OO
.OO.......
...OO.....
...O.O....
....OO....

:flip-flop Any p2 oscillator. However, the term is also used in two more specific (and non-equivalent) senses: (a) any p2 oscillator whose two phases are mirror images of one another, and (b) any p2 oscillator in which all rotor cells die from underpopulation. In the latter sense it contrasts with on-off. The term has also been used even more specifically for the 12-cell flip-flop shown under phoenix.

:flip-flops Another name for the flip-flop shown under phoenix.

:flipper Any oscillator or spaceship that forms its mirror image halfway through its period.

:flotilla A spaceship composed of a number of smaller interacting spaceships. Often one or more of these is not a true spaceship and could not survive without the support of the others. The following example shows an OWSS escorted by two HWSS.

....OOOO.......
...OOOOOO......
..OO.OOOO......
...OO..........
...............
...........OO..
.O............O
O..............
O.............O
OOOOOOOOOOOOOO.
...............
...............
....OOOO.......
...OOOOOO......
..OO.OOOO......
...OO..........

:fly A certain c/3 tagalong found by David Bell, April 1992. Shown here attached to the back of a small spaceship (also by Bell).

..O...............................
.O.O..............................
.O.O......................O.O...O.
.O.......................OO.O.O..O
...........OOO........O.........O.
OO.........OO..O.OO...O..OOOO.....
.O.O.........OOOO..O.O..OO....OO..
.OO........O..O...OOO.....OOO.....
..O.......O....O..OO..OO..O..O....
...O..O...O....O..OOO.O.O....OO...
.......O.OO....O..OOOO.....O......
....OO...OO....O..OOOO.....O......
....O.O...O....O..OOO.O.O....OO...
...OO.....O....O..OO..OO..O..O....
....O.O....O..O...OOO.....OOO.....
.....O.......OOOO..O.O..OO....OO..
...........OO..O.OO...O..OOOO.....
...........OOO........O.........O.
.........................OO.O.O..O
..........................O.O...O.

:flying machine = Schick engine

:fore and back (p2) Compare snake pit. Found by Achim Flammenkamp, July 1994.

OO.OO..
OO.O.O.
......O
OOO.OOO
O......
.O.O.OO
..OO.OO

:forward glider A glider which moves at least partly in the same direction as the puffer(s) or spaceship(s) under consideration.

:fountain (p4) Found by Dean Hickerson in November 1994, and named by Bill Gosper. See also filter and superfountain.

.........O.........
...................
...OO.O.....O.OO...
...O.....O.....O...
....OO.OO.OO.OO....
...................
......OO...OO......
OO...............OO
O..O...O.O.O...O..O
.OOO.OOOOOOOOO.OOO.
....O....O....O....
...OO.........OO...
...O...........O...
.....O.......O.....
....OO.......OO....

:fourteener (p1)

....OO.
OO..O.O
O.....O
.OOOOO.
...O...

:fox (p2) This is the smallest asymmetric p2 oscillator. Found by Dave Buckingham, July 1977.

....O..
....O..
..O..O.
OO.....
....O.O
..O.O.O
......O

:French kiss (p3) Found by Robert Wainwright, July 1971.

O.........
OOO.......
...O......
..O..OO...
..O....O..
...OO..O..
......O...
.......OOO
.........O

:frog II (p3) Found by Dave Buckingham, October 1972.

..OO...OO..
..O.O.O.O..
....O.O....
...O.O.O...
...OO.OO...
.OO.....OO.
O..O.O.O..O
.O.O...O.O.
OO.O...O.OO
....OOO....
...........
...O.OO....
...OO.O....

:frothing puffer A frothing puffer (or a frothing spaceship) is a puffer (or spaceship) whose back end appears to be unstable and breaking apart, but which nonetheless survives. The exhaust festers and clings to the back of the puffer/spaceship before breaking off. The first known frothing puffers were c/2, and most were found by slightly modifying the back ends of p2 spaceships. A number of these have periods which are not a multiple of 4 (as with some line puffers). Paul Tooke has also found c/3 frothing puffers.

The following p78 c/2 frothing puffer was found by Paul Tooke in April 2001.

.......O.................O.......
......OOO...............OOO......
.....OO....OOO.....OOO....OO.....
...OO.O..OOO..O...O..OOO..O.OO...
....O.O..O.O...O.O...O.O..O.O....
.OO.O.O.O.O....O.O....O.O.O.O.OO.
.OO...O.O....O.....O....O.O...OO.
.OOO.O...O....O.O.O....O...O.OOO.
OO.........OO.O.O.O.OO.........OO
............O.......O............
.........OO.O.......O.OO.........
..........O...........O..........
.......OO.O...........O.OO.......
.......OO...............OO.......
.......O.O.O.OOO.OOO.O.O.O.......
......OO...O...O.O...O...OO......
......O..O...O.O.O.O...O..O......
.........OO....O.O....OO.........
.....OO....O...O.O...O....OO.....
.........O.OO.O...O.OO.O.........
..........O.O.O.O.O.O.O..........
............O..O.O..O............
...........O.O.....O.O...........

:frothing spaceship See frothing puffer.

:fumarole (p5) Found by Dean Hickerson in September 1989. In terms of its 7x8 bounding box this is the smallest p5 oscillator.

...OO...
.O....O.
.O....O.
.O....O.
..O..O..
O.O..O.O
OO....OO

:fuse A wick burning at one end. For examples, see baker, beacon maker, blinker ship, boat maker, cow, harvester, lightspeed wire, pi ship, reverse fuse, superstring and washerwoman. Useful fuses are usually clean.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_g.htm0000644000175100001440000007772412156145314015711 00000000000000 Life Lexicon (G)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Gabriel's p138 (p138) The following oscillator found by Gabriel Nivasch in October 2002.

.......OOO.....
......O..O.....
.......O...O...
..O.....OOO....
...O.....O.....
OO.OO..........
O..O.........O.
O.O.........O.O
.O.........O..O
..........OO.OO
.....O.....O...
....OOO.....O..
...O...O.......
.....O..O......
.....OOO.......

:galaxy = Kok's galaxy

:Game of Life = Life

:Game of Life News A blog reporting on new Life discoveries, started by Heinrich Koenig in December 2004. Dave Greene is also a frequent contributor to the blog, which can be found at http://gameoflife-news.blogspot.com.

:Garden of Eden A configuration of ON and OFF cells that can only occur in generation 0. (This term was first used in connection with cellular automata by John W. Tukey, many years before Life.) It was known from the start that there are Gardens of Eden in Life, because of a theorem by Edward Moore that guarantees their existence in a wide class of cellular automata. Explicit examples have since been constructed, the first by Roger Banks, et al. at MIT in 1971. This example was 9 x 33. In 1974 J. Hardouin-Duparc et al. at the University of Bordeaux 1 produced a 6 x 122 example. The following shows a 12 x 12 example found by Nicolay Beluchenko in February 2006, based on a 13 x 12 one found by Achim Flammenkamp in June 2004.

..O.OOO.....
OO.O.OOOOO.O
O.O.OO.O.O..
.OOOO.O.OOO.
O.O.OO.OOO.O
.OOO.OO.O.O.
..O...OOO..O
.O.OO.O.O.O.
OOO.OOOO.O.O
OO.OOOO...O.
.O.O.OO..O..
.OO.O..OO.O.

:generation The fundamental unit of time. The starting pattern is generation 0.

:germ (p3) Found by Dave Buckingham, September 1972.

....OO....
.....O....
...O......
..O.OOOO..
..O....O..
.OO.O.....
..O.O.OOOO
O.O.O....O
OO...OOO..
.......OO.

:gfind A program by David Eppstein which uses de Bruijn graphs to search for new spaceships. It was with gfind that Eppstein found the weekender, and Paul Tooke later used it to find the dragon. It is available at http://www.ics.uci.edu/~eppstein/ca/gfind.c (C source code only).

Compare lifesrc.

:GIG A glider injection gate. This is a device for injecting a glider into a glider stream. The injected glider is synthesized from one or more incoming spaceships assisted by the presence of the GIG. (This contrasts with some other glider injection reactions which do not require a GIG.) Gliders already in the glider stream pass through the GIG without interfering with it. A GIG usually consists of a small number of oscillators.

Glider injection gates are useful for building glider guns with pseudo-periods that are of the form nd, where n is a positive integer, and d is a proper divisor of some convenient base gun period (such as 30 or 46), with d > 13.

:glasses (p2) Compare scrubber and spark coil.

....O........O....
..OOO........OOO..
.O..............O.
.O..OOO....OOO..O.
OO.O...O..O...O.OO
...O...OOOO...O...
...O...O..O...O...
....OOO....OOO....
..................
....OO.O..O.OO....
....O.OO..OO.O....

:glider (c/4 diagonally, p4) The smallest, most common and first discovered spaceship. This was found by Richard Guy in 1970 while Conway's group was attempting to track the evolution of the R-pentomino. The name is due in part to the fact that it is glide symmetric. (It is often stated that Conway discovered the glider, but he himself has said it was Guy. See also the cryptic reference ("some guy") in Winning Ways.)

OOO
O..
.O.
The term "glider" is also occasionally (mis)used to mean "spaceship".

:glider-block cycle An infinite oscillator based on the following reaction (a variant of the rephaser). The oscillator consists of copies of this reaction displaced 2n spaces from one another (for some n>6) with blocks added between the copies in order to cause the reaction to occur again halfway through the period. The period of the resulting infinite oscillator is 8n-20. (Alternatively, in a cylindrical universe of width 2n the oscillator just consists of two gliders and two blocks.)

...OO...
...OO...
........
........
..O..O..
O.O..O.O
.OO..OO.

:glider construction = glider synthesis

:glider duplicator Any reaction in which one input glider is converted into two output gliders. This can be done either by oscillators or by spaceships. The most useful glider duplicators are those with low periods.

The following period 30 glider duplicator demonstrates a simple glider duplicating mechanism found by Dieter Leithner. The input glider stream comes in from the upper left, and the output glider streams leave at the upper and lower right. One of the output glider streams is inverted, so an inline inverter is required to complete the duplicator.

..........O.O.......................
...........OO.......................
...........O........................
....................................
....................................
....................................
........................OO....O.....
..................O.....OO....OO....
...................OO........O.O....
..................OO................
....................................
....................................
....................................
....................................
......................OO............
.......................OO...........
............O.........O.............
............O.O.....................
.............O.O.........OO.........
OO...........O..O.......OOO.........
OO...........O.O.....O.OO...........
............O.O......O..O...........
............O........O.OO...........
........................OOO.....OO..
.........................OO.....O.O.
..................................O.
..................................OO

Spaceship convoys which can duplicate gliders are very useful since they (along with glider turners) provide a means to clean up many dirty puffers by duplicating and turning output gliders so as to impact into the exhaust to clean it up.

Glider duplicators (and turners) are known for backward gliders using p2 c/2 spaceships, and for forward gliders using p3 c/3 spaceships. These are the most general duplicators for these speeds.

:glider gun A gun which fires gliders.

:glider injection gate = GIG

:gliderless A gun is said to be gliderless if it does not use gliders. The purist definition would insist that a glider does not appear anywhere, even incidentally. For a long time the only known way to construct LWSS, MWSS and HWSS guns involved gliders, and it was not until April 1996 that Dieter Leithner constructed the first gliderless gun (a p46 LWSS gun).

The following diagram shows the p44 MWSS gun that Dieter Leithner discovered (in a somewhat larger form) in April 1997. This is the smallest known gliderless gun, and also the smallest known MWSS gun. It is based on an important p44 oscillator discovered by Dave Buckingham in early 1992, shown here in an improved form found in January 2005 by Jason Summers using a new p4 sparker by Nicolay Beluchenko. Note that a glider shape appears in this gun for three consecutive generations, but always as part of a larger cluster, so even a purist would regard this gun as gliderless.

.......O..........................................
..OO...O.O....O...................................
..O..OO..O.O.OO.O..OOO..OO........................
....OO.......OO.O.O.OO..OO........................
...OOO.......O.......OOO.........O................
.......................O.......OOO................
.......................O......O........OOO........
..............................OO.......O..O.......
.........OO..............O.............O..........
.........OO.............O..............O...O......
.........................OO............O..........
........................O.O.............O.O.......
..................................................
.......................O.O.....OOO................
........................O.....O..O..............OO
OO............OOO.......O......OO...........OO.O.O
OO...........O...O..........................OO.O..
.............OO.OO..............................O.
.................................OO.........OO.OO.
..............................OO.............O.O..
.............................................O.O..
..............................................O...
.............OO.OO.............O.O................
OO...........O...O.............OO.................
OO............OOO.................................
...........................OO.....................
...........................O.O....................
.............................O....................
.............................OO...................
..................................................
.........OO.......................................
.........OO.......................................
..................................................
.......................O..........................
.......................O..........................
...OOO.......O.......OOO..........................
....OO.......OO.O.O.OO..OO........................
..O..OO..O.O.OO.O..OOO..OO........................
..OO...O.O....O...................................
.......O..........................................

:glider pusher An arrangement of a queen bee shuttle and a pentadecathlon that can push the path of a passing glider out by one half-diagonal space. This was found by Dieter Leithner in December 1993 and is shown below. It is useful for constructing complex guns where it may be necessary to produce a number of gliders travelling on close parallel paths. See also edge shooter.

.........OO..............
.........OO..............
.........................
..........O..............
.........O.O.............
.........O.O.............
..........O..............
.........................
.........................
.......OO.O.OO...........
.......O.....O...........
........O...O............
.O.......OOO.............
..O......................
OOO......................
.........................
.........................
.................O....O..
...............OO.OOOO.OO
.................O....O..

:gliders by the dozen (stabilizes at time 184) In early references this is usually shown in a larger form whose generation 1 is generation 8 of the form shown here.

OO..O
O...O
O..OO

:glider synthesis Construction of an object by means of glider collisions. It is generally assumed that the gliders should be arranged so that they could come from infinity - that is, gliders should not have had to pass through one another to achieve the initial arrangement.

Glider syntheses for all still lifes and known oscillators with at most 14 cells were found by Dave Buckingham.

Perhaps the most interesting glider syntheses are those of spaceships, because these can be used to create corresponding guns and rakes. Many of the c/2 spaceships that are based on standard spaceships have been synthesized, mostly by Mark Niemiec. In June 1998 Stephen Silver found syntheses for some of the Corderships (although it was not until July 1999 that Jason Summers used this to build a Cordership gun). In May 2000, Noam Elkies suggested that a 2c/5 spaceship found by Tim Coe in May 1996 might be a candidate for glider synthesis. Initial attempts to construct a synthesis for this spaceship got fairly close, but it was only in March 2003 that Summers and Elkies managed to find a way perform the crucial last step. Summers then used the new synthesis to build a c/2 forward rake for the 2c/5 spaceship; this was the first example in Life of a rake which fires spaceships that travel in the same direction as the rake but more slowly.

A 3-glider synthesis of a pentadecathlon is shown in the diagram below. This was found in April 1997 by Heinrich Koenig and came as a surprise, as it was widely assumed that anything using just three gliders would already be known.

......O...
......O.O.
......OO..
..........
OOO.......
..O.......
.O.....OO.
........OO
.......O..

:glider train A certain puffer that produces two rows of blocks and two backward glider waves. Ten of these were used to make the first breeder.

:glider turner An reaction in which a glider is turned by an oscillator or a spaceship. In the former case, the glider turner is usually called a reflector.

Glider turners are easily built using standard spaceships. The following diagram shows a convoy which turns a forward glider 90 degrees, with the new glider also moving forwards.

.........OO.........
........OO.OOOO.....
.O.......OOOOOO.....
O.........OOOO......
OOO.................
....................
....................
....................
....................
...O................
.O...O..............
O...................
O....O..............
OOOOO...............
....................
....................
.............OOOOOO.
.............O.....O
.............O......
..............O....O
................OO..
Small rearrangements of the back two spaceships can alternatively send the output glider into any of the other three directions.

See also glider duplicator and reflector.

:glide symmetric Undergoing simultaneous reflection and translation. A glide symmetric spaceship is sometimes called a flipper.

:gnome = fox

:GoE = Garden of Eden

:GoL = Game of Life

:Golly A cross-platform open source Life program by Andrew Trevorrow and Tomas Rokicki. Unlike most Life programs it includes the ability to run patterns using the hashlife algorithm. It is available from http://golly.sourceforge.net.

:Gosper glider gun The first known gun, and indeed the first known finite pattern with unbounded growth, found by Bill Gosper in November 1970. It remains by far the smallest known gun. Gosper has since found other guns, see new gun and the p144 gun shown under factory.

........................O...........
......................O.O...........
............OO......OO............OO
...........O...O....OO............OO
OO........O.....O...OO..............
OO........O...O.OO....O.O...........
..........O.....O.......O...........
...........O...O....................
............OO......................

:gourmet (p32) Found by Dave Buckingham in March 1978. Compare with pi portraitor and popover.

..........OO........
..........O.........
....OO.OO.O....OO...
..O..O.O.O.....O....
..OO....O........O..
................OO..
....................
................OO..
O.........OOO..O.O..
OOO.......O.O...O...
...O......O.O....OOO
..O.O..............O
..OO................
....................
..OO................
..O........O....OO..
....O.....O.O.O..O..
...OO....O.OO.OO....
.........O..........
........OO..........

:grammar A set of rules for connecting components together to make an object such as a spaceship, oscillator or still life.

:grandfather = grandparent

:grandparent A pattern is said to be a grandparent of the pattern it gives rise to after two generations. See also parent.

:Gray counter (p4) Found in 1971. If you look at this in the right way you will see that it cycles through the Gray codes from 0 to 3. Compare with R2D2.

......O......
.....O.O.....
....O.O.O....
.O..O...O..O.
O.O.O...O.O.O
.O..O...O..O.
....O.O.O....
.....O.O.....
......O......

:gray ship = grey ship

:great on-off (p2)

..OO....
.O..O...
.O.O....
OO.O..O.
....OO.O
.......O
....OOO.
....O...

:grey counter = Gray counter (This form is erroneous, as Gray is surname, not a colour.)

:grey ship A spaceship that contains a region with a density of 1/2, and which is extensible in such a way that the region of density 1/2 can be made larger than any given square region.

See also with-the-grain grey ship, against-the-grain grey ship and hybrid grey ship.

:grin The following common parent of the block. This name relates to the infamous Cheshire cat. See also pre-block.

O..O
.OO.

:grow-by-one object A pattern whose population increases by one cell every generation. The smallest known grow-by-one object is the following 44-cell pattern (David Bell's one-cell improvement of a pattern found by Nicolay Beluchenko, September 2005).

........OO.......
.......OO........
.........O.......
...........OO....
..........O......
.................
.........O..OO...
.OO.....OO....O..
OO.....O.....O...
..O....O.O...OO..
....O..O....OO.O.
....OO.......OO..
........O....O.OO
.......O.O..O.OO.
........O........

:growing/shrinking line ship A line ship in which the line repeatedly grows and shrinks, resulting in a high-period spaceship.

:growing spaceship An object that moves like a spaceship, except that its front part moves faster than its back part and a wick extends between the two. Put another way, a growing spaceship is a puffer whose output is burning cleanly at a slower rate than the puffer is producing it. Examples include blinker ships and pi ships.

:gull = elevener

:gun Any stationary pattern that emits spaceships (or rakes) forever. For examples see double-barrelled, edge shooter, factory, gliderless, Gosper glider gun, new gun and true.

:gunstar Any of a series of glider guns of period 144+72n (for all non-negative integers n) constructed by Dave Buckingham in 1990 based on his transparent block reaction and Robert Wainwright's p72 oscillator (shown under factory).


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_h.htm0000644000175100001440000012251212156145314015674 00000000000000 Life Lexicon (H)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:half bakery See bi-loaf.

:half fleet = ship-tie

:hammer To hammer a LWSS, MWSS or HWSS is to smash things into the rear end of it in order to transform it into a different type of spaceship. A hammer is the object used to do the hammering. In the following example by Dieter Leithner a LWSS is hammered by two more LWSS to make it into a MWSS.

O..O................
....O...OO..........
O...O..OOO.....OOOO.
.OOOO..OO.O....O...O
........OOO....O....
.........O......O..O

:hammerhead A certain front end for c/2 spaceships. The central part of the hammerhead pattern is supported between two MWSS. The picture below shows a small example of a spaceship with a hammerhead front end (the front 9 columns).

................O..
.OO...........O...O
OO.OOO.......O.....
.OOOOO.......O....O
..OOOOO.....O.OOOO.
......OOO.O.OO.....
......OOO....O.....
......OOO.OOO......
..........OO.......
..........OO.......
......OOO.OOO......
......OOO....O.....
......OOO.O.OO.....
..OOOOO.....O.OOOO.
.OOOOO.......O....O
OO.OOO.......O.....
.OO...........O...O
................O..

:handshake An old MIT name for lumps of muck, from the following form (2 generations on from the stairstep hexomino):

..OO.
.O.OO
OO.O.
.OO..

:harbor (p5) Found by Dave Buckingham in September 1978. The name is by Dean Hickerson.

.....OO...OO.....
.....O.O.O.O.....
......O...O......
.................
.....OO...OO.....
OO..O.O...O.O..OO
O.O.OO.....OO.O.O
.O.............O.
.................
.O.............O.
O.O.OO.....OO.O.O
OO..O.O...O.O..OO
.....OO...OO.....
.................
......O...O......
.....O.O.O.O.....
.....OO...OO.....

:harvester (c p4 fuse) Found by David Poyner, this was the first published example of a fuse. The name refers to the fact the it produces debris in the form of blocks which contain the same number of cells as the fuse has burnt up.

................OO
...............O.O
..............O...
.............O....
............O.....
...........O......
..........O.......
.........O........
........O.........
.......O..........
......O...........
.....O............
OOOOO.............
OOOO..............
O.OO..............

:hashlife A Life algorithm by Bill Gosper that is designed to take advantage of the considerable amount of repetitive behaviour in many large patterns of interest. This algorithm is described by Gosper in his paper listed in the bibliography at the end of this lexicon. Roughly speaking, the idea is to store subpatterns in a hash table so that the results of their evolution do not need to be recomputed if they arise again at some other place or time in the evolution of the full pattern. This does, however, mean that complex patterns can require substantial amounts of memory.

Hashlife provides a means of evolving repetitive patterns millions (or even billions or trillions) of generations further than normal Life algorithms can manage in a reasonable amount of time. It is not, however, suitable for showing a continuous display of the evolution of a pattern, because it works asynchronously - at any given moment it will usually have evolved different parts of the pattern through different numbers of generations.

:hassle See hassler.

:hassler An oscillator that works by hassling (repeatedly moving or changing) some object. For some examples, see Jolson, baker's dozen, toad-flipper, toad-sucker and traffic circle.

:hat (p1) Found in 1971. See also twinhat and sesquihat.

..O..
.O.O.
.O.O.
OO.OO

:heat For an oscillator or spaceship, the average number of cells which change state in each generation. For example, the heat of a glider is 4, because 2 cells are born and 2 die every generation.

For a period n oscillator with an r-cell rotor the heat is at least 2r/n and no more than r(1-(n mod 2)/n). For n=2 and n=3 these bounds are equal.

:heavyweight emulator = HW emulator

:heavyweight spaceship = HWSS

:heavyweight volcano = HW volcano

:hebdarole (p7) Found by Noam Elkies, November 1997. Compare fumarole. The smaller version shown below was found soon after by Alan Hensel using a component found by Dave Buckingham in June 1977. The top tens rows can be stabilized by their mirror image (giving an inductor) and this was the original form found by Elkies.

...........OO...........
....OO...O....O...OO....
.O..O..O.O....O.O..O..O.
O.O.O.OO.O....O.OO.O.O.O
.O..O..O.O.OO.O.O..O..O.
....OO....O..O....OO....
...........OO...........
.......O..O..O..O.......
......O.OO....OO.O......
.......O........O.......
........................
...OO..............OO...
...O..OOOO....OOOO..O...
....O.O.O.O..O.O.O.O....
...OO.O...OOOO...O.OO...
.......OO......OO.......
.........OO..OO.........
.........O..O.O.........
..........OO............

:hectic (p30) Found by Robert Wainwright in September 1984.

......................OO...............
......................OO...............
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.........O..........OO...OO............
.......O.O............OOO..............
......O.O............O...O.............
OO...O..O.............O.O..............
OO....O.O..............O...............
.......O.O......O.O....................
.........O......OO.....................
.................O...O.................
.....................OO......O.........
....................O.O......O.O.......
...............O..............O.O....OO
..............O.O.............O..O...OO
.............O...O............O.O......
..............OOO............O.O.......
............OO...OO..........O.........
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
...............OO......................
...............OO......................

:Heisenburp device A pattern which can detect the passage of a glider without affecting the glider's path or timing. The first such device was constructed by David Bell in December 1992. The term is due to Bill Gosper.

The following is an example of the kind of reaction used at the heart of a Heisenburp device. The glider at bottom right alters the reaction of the other two gliders without itself being affected in any way.

O.....O....
.OO...O.O..
OO....OO...
...........
...........
...........
.........OO
........O.O
..........O

:helix A convoy of standard spaceships used in a Caterpillar to move some piece of debris at the speed of the Caterpillar. The following diagram illustrates the idea.

...............................O.............
.................O............OOO............
................OOO....OOO....O.OO...........
.........OOO....O.OO...O..O....OOO..OOO......
.........O..O....OOO...O.......OO...O........
.........O.......OO....O...O.........O.......
.........O...O.........O...O.................
OOO......O...O.........O.....................
O..O.....O..............O.O..................
O.........O.O................................
O............................................
.O.O.........................................
.............................................
.............................................
..........O..................................
.........OOO.................................
.........O.OO................................
..........OOO................................
..........OO.................................
.............................................
.............................................
...............OOO...........................
...............O..O....O.....OOO.............
...............O......OOO....O..O....O.......
...............O.....OO.O....O......OOO......
....OOO.........O.O..OOO.....O.....OO.O......
....O..O.............OOO......O.O..OOO.......
....O................OOO...........OOO.......
....O.................OO...........OOO.......
.....O.O............................OO.......
...........................................O.
..........................................OOO
.........................................OO.O
.........................................OOO.
..........................................OO.
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.........................................O...
..............................OOO.......OOO..
................OOO.....O....O..O......OO.O..
..........O....O..O....OOO......O......OOO...
.........OOO......O....O.OO.....O......OOO...
.........O.OO.....O.....OOO..O.O........OO...
..........OOO..O.O......OOO..................
.O........OOO...........OOO..................
OOO.......OOO...........OO...................
O.OO......OO.................................
.OOO......................................O..
.OO......................................OOO.
........................................OO.O.
........................................OOO..
.........................................OO..
.........OOO.................................
........O..O.................................
...........O.................................
...........O.................................
........O.O..................................

:heptaplet Any 7-cell polyplet.

:heptapole (p2) The barberpole of length 7.

OO........
O.O.......
..........
..O.O.....
..........
....O.O...
..........
......O.O.
.........O
........OO

:heptomino Any 7-cell polyomino. There are 108 such objects. Those with names in common use are the B-heptomino, the Herschel and the pi-heptomino.

:Herschel (stabilizes at time 128) The following pattern which occurs at generation 20 of the B-heptomino.

O..
OOO
O.O
..O

:Herschel conduit A conduit that moves a Herschel from one place to another. See also Herschel loop.

Sixteen simple stable Herschel conduits are currently known, having been discovered from 1995 onwards by Dave Buckingham (DJB) and Paul Callahan (PBC). (Of course, the number depends on what is meant by "simple".) These are shown in the following table. In this table "steps" is the number of steps, "m" tells how the Herschel is moved (R = turned right, L = turned left, B = turned back, F = unturned, f = flipped), and "dx" and "dy" give the displacement of the centre cell of the Herschel (assumed to start in the orientation shown above).


------------------------------------
steps  m     dx   dy     discovery
------------------------------------
  64   R    -11    9   DJB, Sep 1995
  77   Ff   -25   -8   DJB, Aug 1996
 112   L    -12  -33   DJB, Jul 1996
 116   F    -32    1   PBC, Feb 1997
 117   F    -40   -6   DJB, Jul 1996
 119   Ff   -20   14   DJB, Sep 1996
 125   Bf     9  -17   PBC, Nov 1998
 153   Ff   -48   -4   PBC, Feb 1997
 156   L    -17  -41   DJB, Aug 1996
 158   Ff   -27   -5   DJB, Jul 1996
 166   F    -49    3   PBC, May 1997
 176   Ff   -45    0   PBC, Oct 1997
 190   R    -24   16   DJB, Jul 1996
 200   Lf   -17  -40   PBC, Jun 1997
 202   Rf    -7   32   DJB, May 1997
 222   Bf     6  -16   PBC, Oct 1998
------------------------------------

See also Herschel transceiver.

:Herschel loop A cyclic Herschel track. Although no loop of length less than 256 generations has been constructed it is possible to make oscillators of smaller periods by putting more than one Herschel in the track. In this way oscillators, and in most cases guns, of all periods from 54 onwards can now be constructed (although the p55 case is a bit strange, shooting itself with gliders in order to stabilize itself). See also emu and omniperiodic.

:Herschel receiver A pattern found by Paul Callahan in 1996, as part of the first stable glider reflector. Used as a receiver, it converts two parallel input gliders (with path separations of 2, 5, or 6) to an R-pentomino, which is then converted to a Herschel by one of two known mechanisms (the first of which was found by Dave Buckingham way back in 1972, and the second by Stephen Silver in October 1997). The version using Buckingham's R-to-Herschel converter is shown below.

...............................................O.O
......................................OO.......OO.
......................................OO........O.
...OO.............................................
...O..............................................
....O.............................................
...OO.............................................
............OO....................................
...........O.O....................................
............O..............................O......
......................................OO...O.O....
.....................................O..O..OO.....
OO....................................OO..........
OO.............................OO.................
...............................OO.................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
............................................OO....
............................................OO....
........................................OO........
........................................O.O.......
..........................................O.......
..........................................OO......
.............................OO...................
.............................OO...................
..................................................
..................................................
...........................OO.....................
...........................OO.....................

:Herschel track A track for Herschels. See also B track.

:Herschel transceiver An adjustable Herschel conduit made up of a Herschel transmitter and a Herschel receiver. The intermediate stage consists of two gliders on parallel tracks, so the transmitter and receiver can be separated by any required distance. The conduit may be stable, or may contain low-period oscillators.

:Herschel transmitter Any Herschel-to-glider converter that produces two gliders on parallel tracks which can be used as input to a Herschel receiver. If the gliders are far enough apart, a suitably oriented mirror image of the receiver will also work: the first glider triggers the receiver and the second glider deletes the extra beehive.

The following diagram shows a stable Herschel transmitter found by Paul Callahan in May 1997:

......OO...........
.....O.O...........
...OOO.............
..O...O......O.....
..OO.OO......OOO...
.............O.O...
...............O...
...................
...................
OO.O...............
O.OO...............
...................
...................
...................
...............OO..
...............O...
................OOO
..................O
Examples of small reversible p6 and p7 transmitters are also known.

:Hertz oscillator (p8) Compare negentropy, and also cauldron. Found by Conway's group in 1970.

...OO.O....
...O.OO....
...........
....OOO....
...O.O.O.OO
...O...O.OO
OO.O...O...
OO.O...O...
....OOO....
...........
....OO.O...
....O.OO...

:hexadecimal = beehive and dock

:hexaplet Any 6-cell polyplet.

:hexapole (p2) The barberpole of length 6.

OO.......
O.O......
.........
..O.O....
.........
....O.O..
.........
......O.O
.......OO

:hexomino Any 6-cell polyomino. There are 35 such objects. For some examples see century, stairstep hexomino, table, toad and Z-hexomino.

:H-heptomino Name given by Conway to the following heptomino. After one generation this is the same as the I-heptomino.

OO..
.O..
.OOO
..O.

:hive = beehive

:hivenudger (c/2 orthogonally, p4) A spaceship found by Hartmut Holzwart in July 1992. (The name is due to Bill Gosper.) It consists of a pre-beehive escorted by four LWSS. In fact any LWSS can be replaced by a MWSS or a HWSS, so that there are 45 different single-hive hivenudgers.

OOOO.....O..O
O...O...O....
O.......O...O
.O..O...OOOO.
.............
.....OO......
.....OO......
.....OO......
.............
.O..O...OOOO.
O.......O...O
O...O...O....
OOOO.....O..O
Wider versions can be made by stabilizing the front of the extended "pre-beehive", as in the line puffer shown below.
.........O.O..................
........O..O..................
.......OO.....................
......O...O...................
.....OOO.O....................
..OO..........................
.O...OOOOO.......OOOO.....O..O
O...O............O...O...O....
O.....OO.........O.......O...O
OOO...OOOO........O..O...OOOO.
.O.......O....................
.OO...................OO......
.O.O..................OO......
.OO..OO.O........O.O..OO......
..O.OOO.O...O.OOOO.O..OO......
.........OO.O.OO..O...OO...OOO
....OOOOOO.OO...OOOO..OO...OOO
.....O....OOO......O..OO...OOO
......OO.....OO..OO...OO......
.......O..O.....OOOO..OO......
........O.O.OO.....O..OO......
......................OO......
..............................
..................O..O...OOOO.
.................O.......O...O
.................O...O...O....
.................OOOO.....O..O

:honeycomb (p1)

..OO..
.O..O.
O.OO.O
.O..O.
..OO..

:honey farm (p1) A common formation of four beehives.

......O......
.....O.O.....
.....O.O.....
......O......
.............
.OO.......OO.
O..O.....O..O
.OO.......OO.
.............
......O......
.....O.O.....
.....O.O.....
......O......

:hook Another term for a bookend. It is also used for other hook-shaped things, such as occur in the eater1 and the hook with tail, for example.

:hook with tail (p1) For a long time this was the smallest still life without a well-established name. It is now a vital component of the smallest known HWSS gun, where it acts as a rock.

O.O..
OO.O.
...O.
...OO

:houndstooth agar The p2 agar that results from tiling the plane with the following pattern.

.OOO
.O..
..O.
OOO.

:house The following induction coil. It is generation 3 of the pi-heptomino. See spark coil and dead spark coil.

.OOO.
O...O
OO.OO

:hustler (p3) Found by Robert Wainwright, June 1971.

.....OO....
.....OO....
...........
...OOOO....
O.O....O...
OO.O...O...
...O...O.OO
...O....O.O
....OOOO...
...........
....OO.....
....OO.....

:hustler II (p4)

....O...........
....OOO.........
.......O........
......O..OO.....
O.OO.O.OO..O....
OO.O.O.....O....
.....O....O.....
....O.....O.O.OO
....O..OO.O.OO.O
.....OO..O......
........O.......
.........OOO....
...........O....

:HW emulator (p4) Found by Robert Wainwright in June 1980. See also emulator.

.......OO.......
..OO.O....O.OO..
..O..........O..
...OO......OO...
OOO..OOOOOO..OOO
O..O........O..O
.OO..........OO.

:HWSS (c/2 orthogonally, p4) A heavyweight spaceship, the fourth most common spaceship. Found by Conway in 1970. See also LWSS and MWSS.

...OO..
.O....O
O......
O.....O
OOOOOO.

:HWSS emulator = HW emulator

:HW volcano (p5) A p5 domino sparker, found by Dean Hickerson in February 1995. There are at least two known forms for this, one of which is shown below.

.........O..........................
........O.O.........................
......OOO.O.........................
.....O....OO.O......................
.....O.OO...OO......OO..............
....OO.O.OO.........O.O.............
.........O.OOOOO......O..O.OO.......
..O.OO.OO.O.....O....OO.O.OO.O......
.....OO.....OOOO........O....O......
O...O.O..O...O.O....OO.O.OOOO.OO....
O...O.O..OO.O.OO.OO....O.O....O.O...
.....OO...OOO.OO.O.OOO.O..OOO...O...
..O.OO.OO.OO.............O.O..O.O.OO
...........O......O.O.O.O..OO.O.O.O.
....OO.O.O.OO......OO.O.O.O...O.O.O.
.....O.OO.O..O.......O.OO..OOOO.OO..
.....O....O.O........O...OO.........
....OO....OO........OO...O..O.......
...........................OO.......

:hybrid grey ship A grey ship containing more than one type of region of density 1/2, usually a combination of a with-the-grain grey ship and an against-the-grain grey ship.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex.htm0000644000175100001440000001730612156145314015371 00000000000000 Life Lexicon (Introduction)
Life Lexicon

Release 25, 2006 February 28
Multipage HTML version


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

INTRODUCTION
This is a lexicon of terms relating to John Horton Conway's Game of Life. It is also available in a single-page HTML version and an ASCII version.

This lexicon was compiled by Stephen A. Silver - see below for additional credits. See my web-site for contact information.

The latest versions of this lexicon (both HTML and ASCII) should be available from the Life Lexicon Home Page.

CREDITS
The largest single source for the early versions of this lexicon was a glossary compiled by Alan Hensel "with indispensable help from John Conway, Dean Hickerson, David Bell, Bill Gosper, Bob Wainwright, Noam Elkies, Nathan Thompson, Harold McIntosh, and Dan Hoey".

Other sources include the works listed in the bibliography at the end of this lexicon, as well as pattern collections by Alan Hensel and David Bell (and especially Dean Hickerson's file stamp.l in the latter collection), and the web sites of Mark Niemiec, Paul Callahan, Achim Flammenkamp, Robert Wainwright and Heinrich Koenig. Recent releases also use a lot of information from Dean Hickerson's header to his 1995 stamp file.

Most of the information on recent results is from the discoverers themselves.

The following people all provided useful comments on earlier releases of this lexicon: David Bell, Nicolay Beluchenko, Johan Bontes, Scot Ellison, Nick Gotts, Dave Greene, Alan Hensel, Dean Hickerson, Dieter Leithner, Mark Niemiec, Gabriel Nivasch, Andrew Okrasinski, Peter Rott, Ken Takusagawa, Andrew Trevorrow and Malcolm Tyrrell.

The format, errors, use of British English and anything else you might want to complain about are by Stephen Silver.

COPYING
This lexicon is copyright © Stephen Silver, 1997-2005. It may be freely copied and/or modified as long as due credit is given. This includes not just credit to those who have contributed in some way to the present version (see above), but also credit to those who have made any modifications.
LEXICOGRAPHIC ORDER
I have adopted the following convention: all characters (including spaces) other than letters and digits are ignored for the purposes of ordering the entries in this lexicon. (Many terms are used by some people as a single word, with or without a hyphen, and by others as two words. My convention means that I do not have to list these in two separate places. Indeed, I list them only once, choosing whichever form seems most common or sensible.) Digits lexicographically precede letters.
FORMAT
The diagrams in this lexicon are in a very standard format. You should be able to simply copy a pattern, paste it into a new file and run it in your favourite Life program. If you use Johan Bontes' Life32, Mirek Wojtowicz' MCell or Andrew Trevorrow and Tomas Rokicki's Golly then you can just paste the pattern directly into the Life program. I have restricted myself to diagrams of size 64x64 or less.

Most definitions that have a diagram have also some data in brackets after the keyword. Oscillators are maked as pn (where n is a positive integer), meaning that the period is n (p1 indicates a still life). Wicks are marked in the same way but with the word "wick" added. For spaceships the speed (as a fraction of c, the speed of light), the direction and the period are given. Fuses are marked with speed and period and have the word "fuse" added. Wicks and fuses are infinite in extent and so have necessarily been truncated, with the ends stabilized wherever practical.

SCOPE
This lexicon covers only Conway's Life, and provides no information about other cellular automata. David Bell has written articles on two other interesting cellular automata: HighLife (which is similar to Life, but has a tiny replicator) and Day & Night (which is very different, but exhibits many of the same phenomena). These articles can be found on his web-site.
ERRORS AND OMISSIONS
If you find any errors (including typos) or serious omissions, then please let me know.
NAMES
When deciding whether to use full or abbreviated forms of forenames I have tried, wherever possible, to follow the usage of the person concerned.
QUOTE
Every other author may aspire to praise; the lexicographer can only hope to escape reproach.    Samuel Johnson, 1775
DEDICATION
This lexicon is dedicated to the memory of Dieter Leithner, who died on 26 February 1999.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_i.htm0000644000175100001440000003104512156145314015675 00000000000000 Life Lexicon (I)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:I-heptomino Name given by Conway to the following heptomino. After one generation this is the same as the H-heptomino.

OO..
.O..
.OO.
..OO

:IMG = intermitting glider gun

:Immigration A form of colorized Life in which there are two types of ON cell, a newly-born cell taking the type of the majority of its three parent cells and surviving cells remaining of the same type as in the previous generation.

:induction coil Any object used to stabilize an edge (or edges) without touching. The tubs used in the Gray counter are examples, as are the blocks and snakes used in the Hertz oscillator and the heptomino at the bottom of the mathematician.

:inductor Any oscillator with a row of dead cells down the middle and whose two halves are mirror images of one another, both halves being required for the oscillator to work. The classic examples are the pulsar and the tumbler. If still lifes are considered as p1 oscillators then there are numerous simple examples such as table on table, dead spark coil and cis-mirrored R-bee. Some spaceships, such as the brain, the snail and the spider use the same principle.

:infinite glider hotel A pattern by David Bell, named after Hilbert's "infinite hotel" scenario in which a hotel with an infinite number of rooms has room for more guests even if it is already full, simply by shuffling the old guests around.

In this pattern, two pairs of Corderships moving at c/12 are pulling apart such that there is an ever-lengthening glider track between them. Every 128 generations another glider is injected into the glider track, joining the gliders already circulating there. The number of gliders in the track therefore increases without limit.

The tricky part of this construction is that even though all the previously injected gliders are repeatedly flying through the injection point, that point is guaranteed to be empty when it is time for the next glider to be injected.

:infinite growth Growth of a finite pattern such that the population tends to infinity, or at least is unbounded. Sometimes the term is used for growth of something other than population (for example, length), but here we will only consider infinite population growth. The first known pattern with infinite growth in this sense was the Gosper glider gun.

An interesting question is: What is the minimum population of a pattern that exhibits infinite growth? In 1971 Charles Corderman found that a switch engine could be stabilized by a pre-block in a number of different ways, giving 11-cell patterns with infinite growth. This record stood for more than quarter of a century until Paul Callahan found, in November 1997, two 10-cell patterns with infinite growth. The following month he found the one shown below, which is much neater, being a single cluster. This produces a stabilized switch engine of the block-laying type.

......O.
....O.OO
....O.O.
....O...
..O.....
O.O.....
Nick Gotts and Paul Callahan have also shown that there is no infinite growth pattern with fewer than 10 cells, so that the question has now been answered.

Also of interest is the following pattern (again found by Callahan), which is the only 5x5 pattern with infinite growth. This too emits a block-laying switch engine.

OOO.O
O....
...OO
.OO.O
O.O.O

Following a conjecture of Nick Gotts, Stephen Silver produced, in May 1998, a pattern of width 1 which exhibits infinite growth. This pattern was very large (12470x1 in the first version, reduced to 5447x1 the following day). In October 1998 Paul Callahan did an exhaustive search, finding the smallest example, the 39x1 pattern shown below. This produces two block-laying switch engines, stability being achieved at generation 1483.

OOOOOOOO.OOOOO...OOO......OOOOOOO.OOOOO

Although the simplest infinite growth patterns grow at a rate that is (asymptotically) linear, many other types of growth rate are possible, quadratic growth (see breeder) being the fastest. Dean Hickerson has found many patterns with unusual growth rates, such as sawtooths and a caber tosser.

See also Fermat prime calculator.

:initials = monogram

:inline inverter The following reaction in which a p30 gun can be used to invert the presence or absence of gliders in a p30 stream, with the output glider stream being in the same direction as the input glider stream.

................O...................
.................O..................
...............OOO..................
....................................
.......................O.O..........
.....................O...O..........
.............O.......O..............
............OOOO....O....O........OO
...........OO.O.O....O............OO
OO........OOO.O..O...O...O..........
OO.........OO.O.O......O.O..........
............OOOO....................
.............O......................

:integral = integral sign

:integral sign (p1)

...OO
..O.O
..O..
O.O..
OO...

:intentionless = elevener

:interchange (p2) A common formation of six blinkers.

..OOO....OOO..
..............
O............O
O............O
O............O
..............
..OOO....OOO..

:intermitting glider gun Despite the name, an intermitting glider gun (IMG) is more often an oscillator than a gun. There are two basic types. A type 1 IMG consists of two guns firing at one another in such a way that each gun is temporarily disabled on being hit by a glider from the other gun. A type 2 IMG consists of a single gun firing at a 180-degree glider reflector in such a way that returning gliders temporarily disable the gun.

Both types of IMG can be used to make glider guns of periods that are multiples of the base period. This is done by firing another gun across the two-way intermittent glider stream of the IMG in such a way that gliders only occasionally escape.

:island The individual polyplets of which a stable pattern consists are sometimes called islands. So, for example, a boat has only one island, while an aircraft carrier has two, a honey farm has four and the standard form of the eater3 has five.

:Iwona (stabilizes at time 28786) The following methuselah found by Andrzej Okrasinski in August 2004.

..............OOO...
....................
....................
....................
....................
....................
..O.................
...OO...............
...O..............O.
..................O.
..................O.
...................O
..................OO
.......OO...........
........O...........
....................
....................
....................
....................
OO..................
.O..................

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_j.htm0000644000175100001440000001542612156145314015703 00000000000000 Life Lexicon (J)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:J = Herschel

:jack (p4) Found by Robert Wainwright, April 1984.

...O.....O...
...OO...OO...
O..OO...OO..O
OOO..O.O..OOO
.....O.O.....
OOO..O.O..OOO
O..OO...OO..O
...OO...OO...
...O.....O...

:jagged lines A pattern constructed by Dean Hickerson in May 2005 that uses puffers to produce a line of bi-blocks that weaves back and forth in a complicated way.

:jam (p3) Found by Achim Flammenkamp in 1988, but not widely known about until its independent discovery (and naming) by Dean Hickerson in September 1989. Compare with mold. In fact this is really very like caterer. In terms of its 7x7 bounding box it ties with trice tongs as the smallest p3 oscillator.

...OO.
..O..O
O..O.O
O...O.
O.....
...O..
.OO...

:Jaws A breeder constructed by Nick Gotts in February 1997. In the original version Jaws had an initial population of 150, which at the time was the smallest for any known pattern with superlinear growth. In November 1997 Gotts produced a 130-cell Jaws using some switch engine predecessors found by Paul Callahan. Jaws has since been beaten by the even smaller mosquitoes, teeth, catacryst and metacatacryst.

Jaws consists of eight pairs of switch engines which produce a new block-laying switch engine (plus masses of junk) every 10752 generations. It is therefore an MMS breeder.

:JC = dead spark coil

:JHC John Horton Conway. Also another name for monogram.

:J-heptomino = Herschel

:Jolson (p15) Two blocks hassled by two pentadecathlons. Found by Robert Wainwright in November 1984 and named by Bill Gosper. A p9 version using snackers instead of pentadecathlons is also possible.

.OO......OO..
O..O....O..O.
O..O....O..O.
O..O....O..O.
.OO......OO..
.............
.............
.......O.....
.....O..O.OO.
......OO..OO.
.............
.............
......OOOO...
.....OOOOOO..
....OOOOOOOO.
...OO......OO
....OOOOOOOO.
.....OOOOOO..
......OOOO...

:Justyna (stabilizes at time 26458) The following methuselah found by Andrzej Okrasinski in May 2004.

.................O....
................O..O..
.................OOO..
.................O..O.
......................
OO................O...
.O................O...
..................O...
......................
......................
......................
......................
......................
......................
......................
...................OOO
...........OOO........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_k.htm0000644000175100001440000001277312156145314015706 00000000000000 Life Lexicon (K)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:keys See short keys, bent keys and odd keys.

:kickback reaction The following collision of two gliders whose product is a single glider travelling in the opposite direction to one of the original gliders. This is important in the proof of the existence of a universal constructor, and in Bill Gosper's total aperiodic, as well as a number of other constructions.

.....O..
......OO
.OO..OO.
O.O.....
..O.....

:kidney A Gosperism for century. See also diuresis.

:killer toads A pair of toads acting together so that they can eat things. Here, for example, are some killer toads eating a HWSS. Similarly they can eat a MWSS (but not a LWSS). For another example see twirling T-tetsons II. See also candlefrobra.

..OO.......OOO
O....O....OOO.
......O.......
O.....O.......
.OOOOOO.......
..........OOO.
...........OOO

:Klein bottle As an alternative to a torus, it's possible to make a finite Life universe in the form of a Klein bottle. The simplest way to do this is to use an m x n rectangle with the top edge joined to the bottom edge (as for a torus) and the left edge twisted and joined to the right.

:knightship Any spaceship of type (2m,m)/n. Such spaceships do exist (see universal constructor), but no concrete example is known. A knightship must be asymmetric and its period must be at least 6, which makes searching for them using programs like lifesrc very difficult.

By analogy with the corresponding fairy chess pieces, spaceships of types (3m,m)/n, (3m,2m)/n and (4m,m)/n would presumably be called camelships, zebraships and giraffeships, respectively. But no examples of these are known either, and they are even more difficult to search for.

:Kok's galaxy (p8) Found by Jan Kok in 1971. See converter for a use of this sparker.

OOOOOO.OO
OOOOOO.OO
.......OO
OO.....OO
OO.....OO
OO.....OO
OO.......
OO.OOOOOO
OO.OOOOOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_l.htm0000644000175100001440000005336712156145314015713 00000000000000 Life Lexicon (L)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:lake Any still life consisting of a simple closed curve made from diagonally connected dominoes. The smallest example is the pond, and the next smallest is this (to which the term is sometimes restricted):

....OO....
...O..O...
...O..O...
.OO....OO.
O........O
O........O
.OO....OO.
...O..O...
...O..O...
....OO....

:Laputa (p2) Found by Rich Schroeppel, September 1992.

...OO.OO....
...OO.O...OO
........O..O
.OOOOOO.OOO.
O..O.O......
OO...O.OO...
....OO.OO...

:large S = big S

:Lidka (stabilizes at time 29053) A methuselah found by Andrzej Okrasinski in July 2005.

..........OOO..
..........O....
..........O...O
...........O..O
............OOO
...............
.O.............
O.O............
.O.............
The following variant, pointed out by David Bell, has two fewer cells and lasts two generations longer.
..........OOO..
...............
...........OO.O
............O.O
..............O
...............
.O.............
O.O............
.O.............

:Life A 2-dimensional 2-state cellular automaton discovered by John Conway in 1970. The states are referred to as ON and OFF (or live and dead). The transition rule is as follows: a cell that is ON will remain ON in the next generation if and only if exactly 2 or 3 of the 8 adjacent cells are also ON, and a cell that is OFF will turn ON if and only if exactly 3 of the 8 adjacent cells are ON. (This is more succinctly stated as: "If 2 of your 8 nearest neighbours are ON, don't change. If 3 are ON, turn ON. Otherwise, turn OFF.")

:Life32 A freeware Life program by Johan Bontes for Microsoft Windows 95/98/ME/NT/2000/XP: http://www.xs4all.nl/~jbontes/.

:LifeLab A shareware Life program by Andrew Trevorrow for the Macintosh (MacOS 8.6 or later): http://www.trevorrow.com/lifelab/.

:LifeLine A newsletter edited by Robert Wainwright from 1971 to 1973. During this period it was the main forum for discussions about Life. The newsletter was nominally quarterly, but the actual dates of its eleven issues were as follows:


Mar, Jun, Sep, Dec 1971
Sep, Oct, Nov, Dec 1972
Mar, Jun, Sep 1973

:Lifenthusiast A Life enthusiast. Term coined by Robert Wainwright.

:lifesrc David Bell's Life search program, for finding new spaceships and oscillators. This is a C implementation of an algorithm developed by Dean Hickerson in 6502 assembler. Most of the spaceships and many of the oscillators shown in this lexicon were found with lifesrc or by Hickerson's original program.

Although lifesrc itself is a command-line program, Jason Summers has made a GUI version called WinLifeSearch for Microsoft Windows.

The lifesrc algorithm is only useful for very small periods, as the amount of computing power required rises rapidly with increasing period. For most purposes, period 7 is the practical limit with current hardware.

Lifesrc is available from http://www.canb.auug.org.au/~dbell/ (source code only).

Compare gfind.

:light bulb (p2) Found in 1971.

.OO.O..
.O.OO..
.......
..OOO..
.O...O.
.O...O.
..O.O..
O.O.O.O
OO...OO
The same rotor can be embedded in a slightly smaller stator like this:
...O.....
.OOO.....
O........
OOOOOO...
......O..
..O...O..
..OO.O...
......OOO
........O

:lightspeed ribbon = superstring

:lightspeed wire Any wick that can burn non-destructively at the speed of light. These are potentially useful for various things, but so far no one has found the necessary mechanisms. The following diagram shows an example of a lightspeed wire, with a small defect that travels along it at the speed of light.

....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
..........................................................
..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
.O......O...............................................O.
O.OOOOO....OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.O
.O.....O................................................O.
..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
..........................................................
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....

:lightweight emulator = LW emulator

:lightweight spaceship = LWSS

:lightweight volcano = toaster

:line puffer A puffer which produces its output by means of an orthogonal line of cells at right angles to the direction of travel. The archetypal line puffer was found by Alan Hensel in March 1994, based on a spaceship found earlier that month by Hartmut Holzwart. The following month Holzwart found a way to make extensible c/2 line puffers, and Hensel found a much smaller stabilization the following day. But in October 1995 Tim Coe discovered that for large widths these were often unstable, although typically lasting millions of generations. In May 1996, however, Coe found a way to fix the instability. The resulting puffers appear to be completely stable and to exhibit an exponential increase in period as a function of width, although neither of these things has been proved.

Line puffers have enabled the construction of various difficult periods for c/2 spaceships and puffers, including occasionally periods which are not multiples of 4 and which would therefore be impossible to attain with the usual type of construction based on standard spaceships. (See frothing puffer for another method of constructing such periods.) In particular, the first c/2 rake with period not divisible by 4 was achieved in January 2000 when David Bell constructed a p42 backrake by means of line puffers.

See also hivenudger and puff suppressor.

:line ship A spaceship in which the front end is a linestretcher, the line being eaten by the back end.

:linestretcher A wickstretcher that stretches a single diagonal line of cells. The first example was constructed by Jason Summers in March 1999; this was c/12 and used switch engine based puffers found earlier by Dean Hickerson. The first c/4 example was found by Hartmut Holzwart in November 2004.

:loading dock (p3) Found by Dave Buckingham, September 1972.

....O....
..OOO....
.O...OO..
O.OO...O.
.O...OO.O
..OO...O.
....OOO..
....O....

:loaf (p1)

.OO.
O..O
.O.O
..O.

:loaflipflop (p15) Here four pentadecathlons hassle a loaf. Found by Robert Wainwright in 1990.

................O.................
...............OOO................
..................................
..................................
...............OOO................
..................................
...............O.O................
...............O.O................
..................................
...............OOO................
..................................
..................................
...............OOO................
................O.................
..................................
.O..O.OO.O..O...............OO....
OO..O....O..OO...OO.......O....O..
.O..O.OO.O..O...O..O.....O......O.
................O.O.....O........O
.................O......O........O
........................O........O
.........................O......O.
..........................O....O..
............................OO....
..................OOO.............
.................O...O............
................O.....O...........
..................................
...............O.......O..........
...............O.......O..........
..................................
................O.....O...........
.................O...O............
..................OOO.............

:loaf on loaf = bi-loaf

:loaf siamese barge (p1)

..OO.
.O..O
O.O.O
.O.O.
..O..

:LoM = lumps of muck

:lone dot agar An agar in which every live cell is isolated in every generation.

:lonely bee = worker bee

:long A term applied to an object that is of the same basic form as some standard object, but longer. For examples see long barge, long boat, long bookend, long canoe, long shillelagh, long ship and long snake.

:long^3 The next degree of longness after long long. Some people prefer "extra long".

:long^4 The next degree of longness after long^3. Some people prefer "extra extra long".

:long barge (p1)

.O...
O.O..
.O.O.
..O.O
...O.

:long boat (p1)

.O..
O.O.
.O.O
..OO

:long bookend The following induction coil, longer than a bookend.

...OO
O...O
OOOO.

:long canoe (p1)

....OO
.....O
....O.
...O..
O.O...
OO....

:long hat = loop

:long hook = long bookend

:long house = dock

:long integral (p1)

..OO
.O.O
.O..
..O.
O.O.
OO..

:long long The next degree of longness after long. Some people prefer "very long".

:long long barge (p1)

.O....
O.O...
.O.O..
..O.O.
...O.O
....O.

:long long boat (p1)

.O...
O.O..
.O.O.
..O.O
...OO

:long long canoe (p1)

.....OO
......O
.....O.
....O..
...O...
O.O....
OO.....

:long long ship (p1)

OO...
O.O..
.O.O.
..O.O
...OO

:long long snake (p1)

OO....
O.O...
...O.O
....OO

:long shillelagh (p1)

OO..OO
O..O.O
.OO...

:long ship (p1)

OO..
O.O.
.O.O
..OO

:long sinking ship = long canoe

:long snake (p1)

OO...
O.O.O
...OO

:loop (p1)

.OO..
O..O.
.O.O.
OO.OO

:low-density Life = sparse Life

:lumps of muck The common evolutionary sequence that ends in the blockade. The name is sometimes used of the blockade itself, and can in general be used of any stage of the evolution of the stairstep hexomino.

:LW emulator (p4) The smallest (and least useful) emulator, found by Robert Wainwright in June 1980.

..OO.O..O.OO..
..O........O..
...OO....OO...
OOO..OOOO..OOO
O..O......O..O
.OO........OO.

:LWSS (c/2 orthogonally, p4) A lightweight spaceship, the smallest known orthogonally moving spaceship, and the second most common (after the glider). Found by Conway in 1970. See also MWSS and HWSS.

.O..O
O....
O...O
OOOO

:LWSS emulator = LW emulator

:LWTDS Life Worker Time Deficiency Syndrome. Term coined by Dieter Leithner to describe the problem of having to divide scarce time between Life and real life.

:LW volcano = toaster


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_m.htm0000644000175100001440000005656312156145314015715 00000000000000 Life Lexicon (M)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:mango (p1)

.OO..
O..O.
.O..O
..OO.

:mathematician (p5) Found by Dave Buckingham, 1972.

....O....
...O.O...
...O.O...
..OO.OO..
O.......O
OOO...OOO
.........
OOOOOOOOO
O.......O
...OOOO..
...O..OO.

:Max A name for the smallest known spacefiller. The name represents the fact that the growth rate is the fastest possible. (This has not quite been proved, however. There remains the possibility, albeit not very likely, that a periodic agar could have an average density greater than 1/2, and a spacefiller stretching such an agar at the same speed as the known spacefillers would have a faster average growth rate.)

:mazing (p4) In terms of its minimum population of 12 this ties with mold as the smallest p4 oscillator. Found by Dave Buckingham in December 1973. For some constructions using mazings, see popover and sixty-nine.

...OO..
.O.O...
O.....O
.O...OO
.......
...O.O.
....O..

:medium fish = MWSS

:metacatacryst A 52-cell pattern exhibiting quadratic growth. Found by Nick Gotts, December 2000. This is currently the smallest known pattern (in terms of initial population) with superlinear growth. See also catacryst.

:metamorphosis An oscillator built by Robert Wainwright that uses the following reaction (found by Bill Gosper) to turn gliders into LWSS, and converts these LWSS back into gliders by colliding them head on. (There are in fact two ways to do the following reaction, because the spark of the twin bees shuttle is symmetric.)

...................O.........
....................O........
..................OOO........
.............................
.............................
.............................
.............................
.............................
............O...O.....O.OO...
OO.........O.....O....O.O.O..
OO.........O.........O....O..
...........OO...O.....O.O.O..
.............OOO......O.OO...
.............................
.............OOO.............
...........OO...O............
OO.........O...............OO
OO.........O.....O.........OO
............O...O............

:metamorphosis II An oscillator built by Robert Wainwright in December 1994 based on the following p30 glider-to-LWSS converter. This converter was first found by Paul Rendell, January 1986 or earlier, but wasn't widely known about until Paul Callahan rediscovered it in December 1994.

......................O.
.....................O..
.....................OOO
........................
........................
.........O.O............
.........O..O...........
OO..........OO..........
OO........O...OO........
.....OO.....OO..........
....O....O..O...........
.........O.O............
........................
........................
........................
........................
................O.......
...............OOO......
..............OOOOO.....
.............O.O.O.O....
.............OO...OO....
........................
........................
................O.......
...............O.O......
...............O.O......
................O.......
...............OO.......
...............OO.......
...............OO.......

:methuselah Any small pattern that stabilizes only after a long time. Term coined by Conway. Examples include rabbits, acorn, the R-pentomino, blom, Iwona, Justyna and Lidka. See also ark.

:Mickey Mouse (p1) A name proposed by Mark Niemiec for the following still life:

.OO....OO.
O..O..O..O
O..OOOO..O
.OO....OO.
...OOOO...
...O..O...
....OO....

:middleweight emulator = MW emulator

:middleweight spaceship = MWSS

:middleweight volcano = MW volcano

:mini pressure cooker (p3) Found by Robert Wainwright before June 1972. Compare pressure cooker.

.....O.....
....O.O....
....O.O....
...OO.OO...
O.O.....O.O
OO.O.O.O.OO
...O...O...
...O.O.O...
....O.O....
.....O.....

:M.I.P. value The maximum population divided by the initial population for an unstable pattern. For example, the R-pentomino has an M.I.P. value of 63.8, since its maximum population is 319. The term is no longer in use.

:MIT oscillator = cuphook

:MMM breeder See breeder.

:MMS breeder See breeder.

:mod The smallest number of generations it takes for an oscillator or spaceship to reappear in its original form, possibly subject to some rotation or reflection. The mod may be equal to the period, but it may also be a quarter of the period (for oscillators that rotate 90 degrees every quarter period) or half the period (for other oscillators which rotate 180 degrees every half period, and also for flippers).

:mold (p4) Found by Achim Flammenkamp in 1988, but not widely known until Dean Hickerson rediscovered it (and named it) in August 1989. Compare with jam. In terms of its minimum population of 12 it ties with mazing as the smallest p4 oscillator. But in terms of its 6x6 bounding box it wins outright. In fact, of all oscillators that fit in a 6x7 box it is the only one with period greater than 2.

...OO.
..O..O
O..O.O
....O.
O.OO..
.O....

:monogram (p4) Found by Dean Hickerson, August 1989.

OO...OO
.O.O.O.
.OO.OO.
.O.O.O.
OO...OO

:moose antlers (p1)

OO.....OO
O.......O
.OOO.OOO.
...O.O...
....O....

:mosquito See mosquito1, mosquito2. mosquito3, mosquito4 and mosquito5.

:mosquito1 A breeder constructed by Nick Gotts in September 1998. The original version had an initial population of 103, which was then the smallest for any known pattern with superlinear growth (beating the record previously held by Jaws). This was reduced to 97 by Stephen Silver the following month, but was then almost immediately superseded by mosquito2.

Mosquito1 consists of the classic puffer train plus four LWSS and four MWSS (mostly in predecessor form, to keep the population down). Once it gets going it produces a new block-laying switch engine (plus a lot of junk) every 280 generations. It is therefore an MMS breeder, albeit a messy one.

:mosquito2 A breeder constructed by Nick Gotts in October 1998. Its initial population of 85 was for a couple of hours the smallest for any known pattern with superlinear growth, but was then beaten by mosquito3.

Mosquito2 is very like mosquito1, but uses two fewer MWSS and one more LWSS.

:mosquito3 A breeder constructed by Nick Gotts in October 1998. Its initial population of 75 was at the time the smallest for any known pattern with superlinear growth, but was beaten a few days later by mosquito4.

Mosquito3 has one less LWSS than mosquito2. It is somewhat different from the earlier mosquitoes in that the switch engines it makes are glider-producing rather than block-laying.

:mosquito4 A slightly improved version of mosquito3 which Stephen Silver produced in October 1998 making use of another discovery of Nick Gotts (September 1997): an 8-cell pattern that evolves into a LWSS plus some junk. Mosquito4 is a breeder with an initial population of 73, at the time the smallest for any known pattern with superlinear growth, but superseded a few days later by mosquito5.

:mosquito5 A slightly improved version of mosquito4 which Nick Gotts produced in October 1998. The improvement is of a similar nature to the improvement of mosquito4 over mosquito3. Mosquito5 is a breeder with an initial population of 71. At the time, this was the smallest population for any known pattern with superlinear growth, but it has since been superseded by teeth, catacryst and metacatacryst.

:mould = mold

:moving sawtooth A sawtooth such that no cell is ON for more than a finite number generations. David Bell has constructed patterns of this type, with a c/2 front end and a c/3 back end.

:MSM breeder See breeder.

:multi-state Life = colorized Life

:multum in parvo (stabilizes at time 3933) A methuselah found by Charles Corderman, but not as long-lasting as his acorn.

...OOO
..O..O
.O....
O.....

:muttering moat Any oscillator whose rotor consists of a closed chain of cells each of which is adjacent to exactly two other rotor cells. Compare babbling brook. Examples include the bipole, the blinker, the clock, the cuphook, the Gray counter, the quad, the scrubber, the skewed quad and the p2 snake pit. The following diagram shows a p2 example (by Dean Hickerson, May 1993) with a larger rotor. See ring of fire for a very large one.

OO.....
O.O.OO.
.....O.
.O..O..
..O....
..O.O.O
.....OO

:MW emulator (p4) Found by Robert Wainwright in June 1980. See also emulator and filter.

.......O.......
..OO.O...O.OO..
..O.........O..
...OO.....OO...
OOO..OOOOO..OOO
O..O.......O..O
.OO.........OO.

:MWSS (c/2 orthogonally, p4) A middleweight spaceship, the third most common spaceship. Found by Conway in 1970. See also LWSS and HWSS.

...O..
.O...O
O.....
O....O
OOOOO.

:MWSS emulator = MW emulator

:MWSS out of the blue The following reaction, found by Peter Rott in November 1997, in which a LWSS passing by a p46 oscillator creates a MWSS travelling in the opposite direction. Together with some reactions found by Dieter Leithner, and a LWSS-turning reaction which Rott had found in November 1993 (but which was not widely known until Paul Callahan rediscovered it in June 1994) this can be used to prove that there exist gliderless guns for LWSS, MWSS and HWSS for every period that is a multiple of 46.

O..O.................................
....O................................
O...O................................
.OOOO................................
.....................................
.....................................
.....................................
.....................................
.....................................
...................OO..............OO
..................OO...............OO
...................OOOOO.............
..OO................OOOO.............
..OO.....O...........................
........OOO.........OOOO.............
.......O.O.O.......OOOOO.............
........O..O......OO...............OO
........OOO........OO..............OO
.........O...........................
.....................................
.....................................
.....................................
.....................................
..O.......O..........................
.....................................
OOO.......OOO........................
.OO.OO.OO.OO.........................
..OOO...OOO..........................
...O.....O...........................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
..OO.....OO..........................
..OO.....OO..........................

:MW volcano (p5) Found by Dean Hickerson in April 1992.

......O......
....O...O....
.............
...O.....O...
.OOO.OOO.OOO.
O...OO.OO...O
O.OOO.O.OOOO.
.O...........
...O.O.O.OO.O
..OO.OOO.O.OO
...O.O..O....
...O..OO.....
..OO.........

:My Experience with B-heptominos in Oscillators An article by Dave Buckingham (October 1996) that describes his discovery of Herschel conduits, including sufficient (indeed ample) stable conduits to enable, for the first time, the construction of period n oscillators - and true period n guns - for every sufficiently large integer n. (See Herschel loop and emu.)


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_n.htm0000644000175100001440000002252212156145314015702 00000000000000 Life Lexicon (N)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:natural Occurring often in random patterns. There is no precise measure of naturalness, since the most useful definition of "random" in this context is open to debate. Nonetheless, it is clear that objects such as blocks, blinkers, beehives and gliders are very natural, while eater2s, darts, guns, etc., are not.

:negentropy (p2) Compare Hertz oscillator.

...OO.O....
...O.OO....
...........
....OOO....
...O.O.O.OO
...OO..O.OO
OO.O...O...
OO.O...O...
....OOO....
...........
....OO.O...
....O.OO...

:neighbour Any of the eight cells adjacent to a given cell. A cell is therefore not considered to be a neighbour of itself, although the neighbourhood used in Life does in fact include this cell (see cellular automaton).

:new five (p3) Found by Dean Hickerson, January 1990.

..OO.....
.O..O....
.O.O..O..
OO.O.OO..
O........
.OOO.OOOO
.....O..O
O.OO.....
OO.OO....

:new gun An old name for the second known basic gun (found, like the first, by Bill Gosper), shown below. A number of other ways of constructing a gun from two twin bees shuttles have since been found - see edge shooter for one of these.

.........................OO.....OO
.........................OO.....OO
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
...........................OO.OO..
..........................O.....O.
..................................
.........................O.......O
.........................O..O.O..O
.........................OOO...OOO
..................................
..................................
..................................
..................................
.................O................
OO...............OO...............
OO................OO..............
.............OO..OO...............
..................................
..................................
..................................
.............OO..OO...............
OO................OO.......OO.....
OO...............OO........OO.....
.................O................

:Noah's ark The following diagonal puffer consisting of two switch engines. This was found by Charles Corderman in 1971. The name comes from the variety of objects it leaves behind: blocks, blinkers, beehives, loaves, gliders, ships, boats, long boats, beacons and block on tables.

..........O.O..
.........O.....
..........O..O.
............OOO
...............
...............
...............
...............
...............
.O.............
O.O............
...............
O..O...........
..OO...........
...O...........

See also ark.

:n-omino Any polyomino with exactly n cells.

:non-monotonic A spaceship is said to be non-monotonic if its leading edge falls back in some generations. The first example (shown below) was found by Hartmut Holzwart in August 1992. This is p4 and travels at c/4. In April 1994, Holzwart found examples of p3 spaceships with this property, and this is clearly the smallest possible period. Another non-monotonic spaceship is the weekender.

..........OO.O.......
......OOO.O.OOO......
..O.O..........O...OO
OO....OO.....O...OOOO
..O.OO..O....OOO.O...
........O....O.......
..O.OO..O....OOO.O...
OO....OO.....O...OOOO
..O.O..........O...OO
......OOO.O.OOO......
..........OO.O.......

:non-spark Something that looks like a spark, but isn't. An OWSS produces one of these instead of a belly spark, and is destroyed by it.

:non-standard spaceship Any spaceship other than a glider, LWSS, MWSS or HWSS.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_o.htm0000644000175100001440000002523012156145314015702 00000000000000 Life Lexicon (O)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:obo spark A spark of the form O.O (so called after its rle encoding).

:octagon II (p5) The first known p5 oscillator, discovered in 1971 independently by Sol Goodman and Arthur Taber. The name is due to the latter.

...OO...
..O..O..
.O....O.
O......O
O......O
.O....O.
..O..O..
...OO...

:octagon IV (p4) Found by Robert Wainwright, January 1979.

.......OO.......
.......OO.......
................
......OOOO......
.....O....O.....
....O......O....
...O........O...
OO.O........O.OO
OO.O........O.OO
...O........O...
....O......O....
.....O....O.....
......OOOO......
................
.......OO.......
.......OO.......

:octomino Any 8-cell polyomino. There are 369 such objects. The word is particularly applied to the following octomino (or its two-generation successor), which is fairly common but lacks a proper name:

..OO
..OO
OOO.
.O..

:odd keys (p3) Found by Dean Hickerson, August 1989. See also short keys and bent keys.

..........O.
.O.......O.O
O.OOO..OO.O.
.O..O..O....
....O..O....

:omino = polyomino

:omniperiodic A cellular automaton is said to be omniperiodic if it has oscillators of all periods. It is not known if Life is omniperiodic, although this seems likely. Dave Buckingham's work on Herschel conduits in 1996 (see My Experience with B-heptominos in Oscillators) reduced the number of unresolved cases to a finite number. At the time of writing the only periods for which no oscillator is known are 19, 23, 31, 37, 38, 41, 43 and 53. If we insist that the oscillator must contain a cell oscillating at the full period, then 34 and 51 should be added to this list. The most recently achieved periods were all found by Noam Elkies: p49 in August 1999 (a glider loop using p7 reflectors built from his new p7 pipsquirter), p39 (previously only possible without a p39 cell) in July 2000, and p27 in November 2002.

Note that if we were to allow infinite oscillators, then all periods are certainly possible, as any period of 14 or more can be obtained using a glider (or LWSS) stream.

:one-sided spaceship synthesis A glider synthesis of a spaceship in which all gliders come from the same side of the spaceship's path. Such syntheses are used extensively in the 17c/45 Caterpillar.

:onion rings For each integer n>1 onion rings of order n is a stable agar of density 1/2 obtained by tiling the plane with a certain 4n x 4n pattern. The tile for order 3 onion rings is shown below - the reader should then be able to deduce the form of tiles of other orders.

......OOOOOO
.OOOO.O....O
.O..O.O.OO.O
.O..O.O.OO.O
.OOOO.O....O
......OOOOOO
OOOOOO......
O....O.OOOO.
O.OO.O.O..O.
O.OO.O.O..O.
O....O.OOOO.
OOOOOO......

:on-off Any p2 oscillator in which all rotor cells die from overpopulation. The simplest example is a beacon. Compare flip-flop.

:O-pentomino Conway's name for the following pentomino, a traffic light predecessor, although not one of the more common ones.

OOOOO

:orbit A term proposed by Jason Summers to refer to a natural stabilization of a puffer. For example, the switch engine has two (known) orbits, the block-laying one and the glider-producing one.

:Orion (c/4 diagonally, p4) Found by Hartmut Holzwart, April 1993.

...OO.........
...O.O........
...O..........
OO.O..........
O....O........
O.OO......OOO.
.....OOO....OO
......OOO.O.O.
.............O
......O.O.....
.....OO.O.....
......O.......
....OO.O......
.......O......
.....OO.......
In May 1999, Jason Summers found the following smaller variant:
.OO..........
OO...........
..O..........
....O....OOO.
....OOO....OO
.....OOO.O.O.
............O
.....O.O.....
....OO.O.....
.....O.......
...OO.O......
......O......
....OO.......

:orphan Conway's preferred term for a Garden of Eden.

:oscillator Any pattern that is a predecessor of itself. The term is usually restricted to non-stable finite patterns. An oscillator is divided into a rotor and a stator. See also omniperiodic.

In general cellular automaton theory the term "oscillator" usually covers spaceships as well, but this usage is not normal in Life.

:overcrowding = overpopulation

:over-exposure = underpopulation

:overpopulation Death of a cell caused by it having more than three neighbours. See also underpopulation.

:overweight spaceship = OWSS

:OWSS A would-be spaceship similar to LWSS, MWSS and HWSS but longer. On its own an OWSS is unstable, but it can be escorted by true spaceships to form a flotilla.

:Ox A 1976 novel by Piers Anthony which involves Life.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_p.htm0000644000175100001440000016072012156145314015707 00000000000000 Life Lexicon (P)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:p = period

:p30 shuttle = queen bee shuttle

:p46 shuttle = twin bees shuttle

:p54 shuttle (p54) A surprising variant of the twin bees shuttle found by Dave Buckingham in 1973. See also centinal.

OO.........................OO
.O.........................O.
.O.O.......O.............O.O.
..OO.....O..O.....O......OO..
............O.....OO.........
........O..........OO........
........O...OO....OO.........
.........OOOOO...............
.............................
.........OOOOO...............
........O...OO....OO.........
........O..........OO........
............O.....OO.........
..OO.....O..O.....O......OO..
.O.O.......O.............O.O.
.O.........................O.
OO.........................OO

:p6 shuttle (p6) The following oscillator found by Nicolay Beluchenko in February 2004.

O.............
OOO...........
...O..........
..OO..........
..............
......O.......
.....OOOO.....
......O..O....
.......OOO....
..............
..........OO..
..........O...
...........OOO
.............O
This is extensible in more than one way:
O........................
OOO......................
...O.....................
..OO.....................
.........................
......O..................
.....OOOO................
......O..O...............
.......OOO...............
.........................
..........OOO............
..........O..O...........
...........OOOO..........
.............O...........
.........................
.................O.......
................OOO......
.................O.O.....
.................O.O.....
..................OO.....
.....................OO..
.....................O.O.
.......................O.
.......................OO

:pair of bookends = bookends

:pair of tables = table on table

:paperclip (p1)

..OO.
.O..O
.O.OO
OO.O.
O..O.
.OO..

:parallel grey ship = with-the-grain grey ship

:parent A pattern is said to be a parent of the pattern it gives rise to after one generation. Some patterns have infinitely many parents, but other have none at all (see Garden of Eden).

:parent cells The three cells that cause a new cell to be born.

:PD = pentadecathlon

:pedestle (p5)

.....O.....
....O.O....
.O..OO.....
.OOO.......
.....OOO...
...OO...O..
..O....O..O
.O.O.O.O.OO
.O.O...O.O.
OO.O.O.O.O.
O..O....O..
..O...OO...
...OOO.....
.......OOO.
.....OO..O.
....O.O....
.....O.....

:penny lane (p4) Found by Dave Buckingham, 1972.

...OO.....OO...
...O.......O...
OO.O.......O.OO
OO.O.OOOOO.O.OO
....O..O..O....
.....OOOOO.....
...............
.......O.......
......O.O......
.......O.......

:pentadecathlon (p15) Found in 1970 by Conway while tracking the history of short rows of cells, 10 cells giving this object, which is the most natural oscillator of period greater than 3. In fact it is the fifth or sixth most common oscillator overall, being about as frequent as the clock, but much less frequent than the blinker, toad, beacon or pulsar.

..O....O..
OO.OOOO.OO
..O....O..
The pentadecathlon is the only known oscillator which is a polyomino in more than one phase.

:pentant (p5) Found by Dave Buckingham, July 1976.

OO........
.O........
.O.O......
..OO....OO
.........O
.....OOOO.
.....O....
..O...OOO.
..OOOO..O.
.....O....
....O.....
....OO....

:pentaplet Any 5-cell polyplet.

:pentapole (p2) The barberpole of length 5.

OO......
O.O.....
........
..O.O...
........
....O.O.
.......O
......OO

:pentoad (p5) Found by Bill Gosper, June 1977. This is extensible: if an eater is moved back four spaces then another Z-hexomino can can be inserted. (This extensibility was discovered by Scott Kim.)

...........OO
...........O.
.........O.O.
.........OO..
.....OO......
......O......
......O......
......OO.....
..OO.........
.O.O.........
.O...........
OO...........

:pentomino Any 5-cell polyomino. There are 12 such patterns, and Conway assigned them all letters in the range O to Z, loosely based on their shapes. Only in the case of the R-pentomino has Conway's label remained in common use, but all of them can nonetheless be found in this lexicon.

:period The smallest number of generations it takes for an oscillator or spaceship to reappear in its original form. The term can also be used for a puffer, wick, fuse, superstring, stream of spaceships, factory or gun. In the last case there is a distinction between true period and pseudo period. There is also a somewhat different concept of period for wicktrailers.

:perpendicular grey ship = against-the-grain grey ship

:perturb To change the fate of an object by reacting it with other objects. Typically, the other objects are sparks from spaceships or oscillators, or are eaters or impacting spaceships. Perturbations are typically done to turn a dirty reaction into a clean one, or to change the products of a reaction. In many desirable cases the perturbing objects are not destroyed by the reaction, or else are easily replenished.

:perturbation See perturb.

:phase A representative generation of a periodic object such as an oscillator or spaceship. The number of phases is equal to the period of the object. The phases of an object usually repeat in the same cyclic sequence forever, although some perturbations can cause a phase change.

:phase change A perturbation of a periodic object which causes the object to skip ahead by one or more phases. If the perturbation is repeated indefinitely, this can effectively change the period of the object. An example of this, found by Dean Hickerson in November 1998, is shown below. In this example, the period of the oscillator would be 7 if the mold were removed, but the period is increased to 8 because of the repeated phase changes caused by the mold's spark.

..........O....
.........O.OO..
..OO.........O.
..O......O..O.O
.......O...O..O
OOOOOO.O....OO.
O..............
.OO.OO...OO....
..O.O....O.O...
..O.O......O...
...O.......OO..
The following pattern demonstrates a p4 c/2 spaceship found by Jason Summers, in which the phase is changed as it deletes a forward glider. This phase change allows the spaceship to be used to delete a glider wave produced by a rake whose period is 2 (mod 4).
........O...........................
.......OOO.OO.......................
......OO...O.OO.....................
.....OO..O.....O....................
......O.....O...O.OOO...............
.....OO.....O...O.O..O..............
...OO.O.OO....O.O.O...O.............
....O.O..OO...........O.............
.OO.O..O..O.........O...............
.OO.O.....OO.........O.OOO..........
.O.O.............OOO.O.O.OO.........
OO.OO...........OO.O..O.O.O.........
..............OO.O...OOO..OO.....OO.
.............O...O......O........O.O
............O.....O..OO.O.OO.....O..
...........O..O.O......O.O..........
...........O.....OO....OOO..........
.............O..........O...........
..........O.O...........O...........
.........OO.O.OOO...................
........O.O.O...O...................
.......OO.O.........................
......O...O.....OO..................
....................................
......OO.OO.........................

Phase changing reactions have enabled the construction of spaceships having periods that were otherwise unknown, and also allow the construction of period-doubling and period-tripling convoys to easily produce very high period rakes.

See also blinker puffer.

:phi The following common spark. The name comes from the shape in the generation after the one shown here.

.OOO.
O...O
O...O
.OOO.

:phoenix Any pattern all of whose cells die in every generation, but which never dies as a whole. A spaceship cannot be a phoenix, and in fact every finite phoenix eventually evolves into an oscillator. The following 12-cell oscillator (found by the MIT group in December 1971) is the smallest known phoenix, and is sometimes called simply "the phoenix".

....O...
..O.O...
......O.
OO......
......OO
.O......
...O.O..
...O....
Every known phoenix oscillator has period 2. In January 2000, Stephen Silver showed that a period 3 oscillator cannot be a phoenix. The situation for higher periods is unknown.

:pi = pi-heptomino

:pi-heptomino (stabilizes at time 173) A common pattern. The name is also applied to later generations of this object - in a pi ship, for example, the pi-heptomino itself never arises.

OOO
O.O
O.O

:pincers = great on-off

:pinwheel (p4) Found by Simon Norton, April 1970. Compare clock II.

......OO....
......OO....
............
....OOOO....
OO.O....O...
OO.O..O.O...
...O...OO.OO
...O.O..O.OO
....OOOO....
............
....OO......
....OO......

:pi orbital (p168) Found by Noam Elkies, August 1995. In this oscillator, a pi-heptomino is turned ninety degrees every 42 generations. A second pi can be inserted to reduce the period to 84.

..............OO....OO....OO...............................
.............O..O.O....O.O..O..............................
.............OOO..........OOO..............................
................OO......OO.................................
...............O..OOOOOO..O................................
...............OO........OO................................
...........................................................
........O.............................OO..........O........
.......O...OOO......O.........O.......OO.........O.O.......
........O.OOOOO..........OOO...O...........................
............O...O.....O.OOOOO.O..................O.........
............OO....OOO.....O......................OO........
............OO....OOO....OO...................OOOOO........
...................O.....OO...................OO.OO.....OO.
.................................................O......O.O
.....................................................OO.O.O
.....................................................O.O.O.
.......................................................O...
...................................OOO.........O.O...O..O..
.......OO..........................O..O........O..O.....O..
.......OO..............................O.......O.O..O...O..
...................................O..O.............O...O..
...................................OOO..................O..
.....................................................O..O..
................................................O......O...
.............................................OO.OO...O.O.O.
.............................................OOOOO...OO.O.O
.........O......................................OO......O.O
........O.O.....................................O.......OO.
...........................................................
.OO.......O.....................................O.O........
O.O......OO......................................O.........
O.O.OO...OOOOO.............................................
.O.O.O...OO.OO.............................................
...O......O................................................
..O..O.....................................................
..O........................................................
..O...O....................................................
..O...O..O.O......................................OO.......
..O.....O..O......................................OO.......
..O..O...O.O...............................................
...O.......................................................
.O.O.O.....................................................
O.O.OO.....................................................
O.O......O.................................................
.OO.....OO.OO...................OO.....O...................
........OOOOO...................OO....OOO....OO............
........OO......................O.....OOO....OO............
.........O..................O.OOOOO.O.....O...O............
...........................O...OOO..........OOOOO.O........
.......O.O.........OO.......O.........O......OOO...O.......
........O..........OO.............................O........
...........................................................
................................OO........OO...............
................................O..OOOOOO..O...............
.................................OO......OO................
..............................OOO..........OOO.............
..............................O..O.O....O.O..O.............
...............................OO....OO....OO..............

:pi portraitor (p32) Found by Robert Wainwright in 1984 or 1985. Compare with gourmet and popover.

...........OO...........
......OO.O....O.OO......
......O..........O......
.......OO......OO.......
....OOO..OOOOOO..OOO....
....O..O........O..O....
.OO.O.O..........O.O.OO.
.O.O.O............O.O.O.
...O................O...
.O..O..............O..O.
....O.......OOO....O....
O...O.......O.O....O...O
O...O.......O.O....O...O
....O..............O....
.O..O..............O..O.
...O................O...
.O.O.O............O.O.O.
.OO.O.O..........O.O.OO.
....O..O........O..O....
....OOO..OOOOOO..OOO....
.......OO......OO.......
......O..........O......
......OO.O....O.OO......
...........OO...........

:pipsquirt = pipsquirter

:pipsquirter An oscillator that produces a domino spark that is orientated parallel to the direction from which it is produced (in contrast to domino sparkers like the pentadecathlon and HWSS, which produce domino sparks perpendicular to the direction of production). The following is a small p6 example found by Noam Elkies in November 1997.

.....O.........
.....O.........
...............
...O...O.......
.OOO.O.OOO.....
O...OO....O....
O.OO..OO.O.O...
.O..OO..OO.O...
..OO..OO.O.O.OO
....O..O.O.O.OO
....OOOO.OO....
........O......
......O.O......
......OO.......

:pi ship A growing spaceship in which the back part consists of a pi-heptomino travelling at a speed of 3c/10. The first example was constructed by David Bell. All known pi ships are too large to show here, but the following diagram shows how the pi fuse works.

............O............
...........O.O...........
OO........OO.OO........OO
OO.....................OO

:piston (p2) Found in 1971.

OO.......OO
O.O..O..O.O
..OOOO..O..
O.O..O..O.O
OO.......OO

:pi wave A line of pi-heptominoes stabilizing one another. For example, an infinite line of pi-heptominoes arranged as shown below produces a pi wave that moves at a speed of 3c/10, and leaves no debris.

OOO...............OOO...............OOO...............OOO
O.O...............O.O...............O.O...............O.O
O.O...............O.O...............O.O...............O.O

:pixel = cell

:plet = polyplet

:polyomino A finite collection of orthogonally connected cells. The mathematical study of polyominoes was initiated by Solomon Golomb in 1953. Conway's early investigations of Life and other cellular automata involved tracking the histories of small polyominoes, this being a reasonable way to ascertain the typical behaviour of different cellular automata when the patterns had to be evolved by hand rather than by computer. Polyominoes have no special significance in Life, but their extensive study during the early years lead to a number of important discoveries and has influenced the terminology of Life. (Note on spelling: As with "dominoes" the plural may also be spelt without an e. In this lexicon I have followed Golomb in using the longer form.)

It is possible for a polyomino to be an oscillator. In fact there are infinitely many examples of such polyominoes, namely the cross and its larger analogues. The only other known examples are the block, the blinker, the toad, the star and (in two different phases) the pentadecathlon.

A polyomino can also be a spaceship, as the LWSS, MWSS and HWSS show.

:polyplet A finite collection of orthogonally or diagonally connected cells. This king-wise connectivity is a more natural concept in Life than the orthogonal connectivity of the polyomino.

:pond (p1)

.OO.
O..O
O..O
.OO.

:pond on pond (p1) This term is often used to mean bi-pond, but may also be used of the following pseudo still life.

.OO...OO.
O..O.O..O
O..O.O..O
.OO...OO.

:popover (p32) Found by Robert Wainwright in August 1984. Compare with gourmet and pi portraitor.

.....................O..........
.....................O..........
.....................OOO........
.............OO.......OO........
.............OO..OOO..OO........
...................OOO..........
...................OOO..........
..............OO................
..OOO........O..O...............
..OOO........O.O................
OOO..OO...O...O....OOO..........
.....OO...O.....................
....OOO...O.....................
....O.................OO...OO...
....O...........OOO..O..O..OO...
........O.......O.O...O.O.......
.......O.O......O.O....O........
...OO..O..O................O....
...OO...OO.................O....
.....................O...OOO....
.....................O...OO.....
..........OOO........O...OO..OOO
.................OO........OOO..
................O..O.......OOO..
................O.O.............
..........OOO....O..............
..........OOO...................
........OO..OOO..OO.............
........OO.......OO.............
........OOO.....................
..........O.....................
..........O.....................

:population The number of ON cells.

:P-pentomino Conway's name for the following pentomino, a common spark.

OO
OO
O.

:PPS (c/5 orthogonally, p30) A pre-pulsar spaceship. Any of three different p30 c/5 orthogonal spaceships in which a pre-pulsar is pushed by a pair of spiders. The back sparks of the spaceship can be used to perturb gliders in many different ways, allowing the easy construction of c/5 puffers. The first PPS was found by David Bell in May 1998 based on a p15 pre-pulsar spaceship found by Noam Elkies in December 1997. See also SPPS and APPS.

:pre-beehive The following common parent of the beehive.

OOO
OOO

:pre-block The following common parent of the block. Another such pattern is the grin.

O.
OO

:precursor = predecessor

:predecessor Any pattern that evolves into a given pattern after one or more generations.

:pre-pulsar A common predecessor of the pulsar, such as that shown below. This duplicates itself in 15 generations. (It fails, however, to be a true replicator because of the way the two copies then interact.)

OOO...OOO
O.O...O.O
OOO...OOO

A pair of tubs can be placed to eat half the pre-pulsar as it replicates; this gives the p30 oscillator Eureka where the pre-pulsar's replication becomes a movement back and forth. (See twirling T-tetsons II for a variation on this idea.) By other means the replication of the pre-pulsar can be made to occur in just 14 generations as half of it is eaten; this allows the construction of p28 and p29 oscillators, and is in fact the only known method for creating a p29 oscillator. The pre-pulsar is also a vital component of the only known p47 oscillator.

See also PPS.

:pre-pulsar spaceship See PPS.

:pressure cooker (p3) Found by the MIT group in September 1971. Compare mini pressure cooker.

.....O.....
....O.O....
....O.O....
...OO.OO...
O.O.....O.O
OO.O.O.O.OO
...O...O...
...O...O...
....OOO....
...........
...O.OO....
...OO.O....

:primer A pattern originally constructed by Dean Hickerson in November 1991 that emits a stream of LWSSs representing the prime numbers. Some improvements were found by Jason Summers in October 2005.

:protein (p3) Found by Dave Buckingham, November 1972.

....OO.......
....O........
......O......
..OOOO.O.OO..
.O.....O.O..O
.O..OO.O.O.OO
OO.O.....O...
...O..OO.O...
...O....O....
....OOOO.....
.............
....OO.......
....OO.......

:pseudo Opposite of true. A gun emitting a period n stream of spaceships (or rakes) is said to be a pseudo period n gun if its mechanism oscillates with a period different from n. This period will necessarily be a multiple of n. Pseudo period n glider guns are known to exist for all periods greater than or equal to 14, with smaller periods being impossible. The first pseudo p14 gun was built by Dieter Leithner in 1995.

The same distinction between true and pseudo also exists for puffers.

:pseudo-barberpole (p5) Found by Achim Flammenkamp in August 1994. In terms of its minimum population of 15 this is the smallest known p5 oscillator.

..........OO
...........O
.........O..
.......O.O..
............
.....O.O....
............
...O.O......
............
..OO........
O...........
OO..........

:pseudo-random glider generator An object which emits a random-looking stream of gliders, like the sequence of bits from a pseudo-random number generator. Pseudo-random glider generators contain gliders or other spaceships in a loop with a feedback mechanism which causes later spaceships to interfere with the generation of earlier spaceships. The period can be very high, since a loop of n spaceships has 2n possible states.

The first pseudo-random glider generator was built by Bill Gosper. David Bell built the first moving one in 1997, using c/3 rakes.

:pseudo still life The strict definition of still life rules out such stable patterns as the bi-block. In such patterns there are dead cells which have more than 3 neighbours in total, but fewer than 3 in any component still life. These patterns are called pseudo still lifes. Mark Niemiec has enumerated the pseudo still lifes up to 24 bits, and his figures are shown below.


-------------
Bits   Number
-------------
  8        1
  9        1
 10        7
 11       16
 12       55
 13      110
 14      279
 15      620
 16     1645
 17     4067
 18    10843
 19    27250
 20    70637
 21   179011
 22   462086
 23  1184882
 24  3068984
-------------

:puffer An object that moves like a spaceship, except that it leaves debris behind. The first known puffers were found by Bill Gosper and travelled at c/2 orthogonally (see diagram below for the very first one, found in 1971). Not long afterwards c/12 diagonal puffers were found (see switch engine). Discounting wickstretchers (which are not puffers in the conventional sense), no new velocity was obtained after this until David Bell found the first c/3 orthogonal puffer in April 1996. Since then c/5 orthogonal puffers have also been found, the first by Tim Coe in May 1997. Jason Summers built the first c/4 orthogonal puffer in January 1999, and the first 2c/5 orthogonal puffer in February 1999. Hartmut Holzwart built the first c/4 diagonal puffer (as opposed to a wickstretcher) in February 2004.

.OOO......O.....O......OOO.
O..O.....OOO...OOO.....O..O
...O....OO.O...O.OO....O...
...O...................O...
...O..O.............O..O...
...O..OO...........OO..O...
..O...OO...........OO...O..

:puffer engine A pattern which can be used as the main component of a puffer. The pattern may itself be a puffer (e.g. the classic puffer train), it may be a spaceship (e.g. the Schick engine), or it may even be unstable (e.g. the switch engine).

:puffer train The full name for a puffer, coined by Conway before any examples were known. The term was also applied specifically to the classic puffer train found by Bill Gosper and shown below. This is very dirty, and the tail does not stabilize until generation 5533. It consists of a B-heptomino (shown here one generation before the standard form) escorted by two LWSS. (This was the second known puffer. The first is shown under puffer.)

.OOO...........OOO
O..O..........O..O
...O....OOO......O
...O....O..O.....O
..O....O........O.

:puff suppressor An attachment at the back of a line puffer that suppresses all or some of its puffing action. The example below (by Hartmut Holzwart) has a 3-cell puff suppressor at the back which suppresses the entire puff, making a p2 spaceship. If you delete this puff suppressor then you get a p60 double beehive puffer. Puff suppressors were first recognised by Alan Hensel in April 1994.

............O....................
..........OO.O...................
..........OO...O.................
........O...OO.O.....O...........
........OOOO.OO...OOOO.......O.O.
......O......O....OOO.....O.O..O.
......OOOOOOO...O...O....O..O....
...O.O......OO..O...O.O.OO....O..
..OOOOOOOOO.....O..OO........O...
.OO..............O.OO.OOOO...O..O
OO....OO.O..........O...O..O.O...
.OO....O........OOO......O.O.O..O
.........O......OO......O....OO..
.OO....O........OOO......O.O.O..O
OO....OO.O..........O...O..O.O...
.OO..............O.OO.OOOO...O..O
..OOOOOOOOO.....O..OO........O...
...O.O......OO..O...O.O.OO....O..
......OOOOOOO...O...O....O..O....
......O......O....OOO.....O.O..O.
........OOOO.OO...OOOO.......O.O.
........O...OO.O.....O...........
..........OO...O.................
..........OO.O...................
............O....................

:pulsar (p3) Despite its size, this is the fourth most common oscillator (and by far the most common of period greater than 2) and was found very early on by Conway. See also pre-pulsar and pulsar quadrant.

..OOO...OOO..
.............
O....O.O....O
O....O.O....O
O....O.O....O
..OOO...OOO..
.............
..OOO...OOO..
O....O.O....O
O....O.O....O
O....O.O....O
.............
..OOO...OOO..

:pulsar 18-22-20 = two pulsar quadrants

:pulsar CP 48-56-72 = pulsar (The numbers refer to the populations of the three phases.)

:pulsar quadrant (p3) This consists of a quarter of the outer part of a pulsar stabilized by a cis fuse with two tails. This is reminiscent of mold and jam. Found by Dave Buckingham in July 1973. See also two pulsar quadrants.

.....O..
...OOO..
..O...OO
O..O..O.
O...O.O.
O....O..
........
..OOO...

:pulse A moving object, such as a spaceship or Herschel, which can be used to transmit information. See pulse divider.

Also another name for a pulsar quadrant.

:pulse divider A mechanism that lets every n-th object that reaches it pass through, and deletes all the rest, where n > 1 and the objects are typically spaceships or Herschels.

The following diagram shows a p5 glider pulse divider by Dieter Leithner (February 1998). The first glider moves the centre block and is reflected at 90 degrees. The next glider to come along will not be reflected, but will move the block back to its original position. The small size and low period of this example make it useful for constructing glider guns of certain periods. p7, p22, p36 and p46 versions of this pulse divider are also known.

.....OO...................
.....OO...................
..........................
..................OO......
.................O..O.....
.................O.O..O..O
O...............OO.O.OOOOO
.OO...........O...OO......
OO...............OO..OOO..
.............O...O.O..O.O.
........OO.......OO..OO.O.
........OO....O...OO...O..
................OO.O.OO...
.................O.O.O....
.................O.O..O...
..................O..OO...
..OO......................
...O......................
OOO.......................
O.........................
..........................
............OO............
............O.............
.............OOO..........
...............O..........

:pulshuttle V (p30) Found by Robert Wainwright, May 1985. Compare Eureka.

.............O..............O.............
............O.O.......O....O.O............
.............O......OO.OO...O.............
......................O...................
..OO......OO..................OO......OO..
O....O..O....O..............O....O..O....O
O....O..O....O..............O....O..O....O
O....O..O....O........O.....O....O..O....O
..OO......OO........OO.OO.....OO......OO..
......................O...................
..........................................
..........................................
..OO......OO..................OO......OO..
O....O..O....O........O.....O....O..O....O
O....O..O....O......OO.OO...O....O..O....O
O....O..O....O........O.....O....O..O....O
..OO......OO..................OO......OO..
..........................................
..........................................
......................O...................
..OO......OO........OO.OO.....OO......OO..
O....O..O....O........O.....O....O..O....O
O....O..O....O..............O....O..O....O
O....O..O....O..............O....O..O....O
..OO......OO..................OO......OO..
......................O...................
.............O......OO.OO...O.............
............O.O.......O....O.O............
.............O..............O.............

:pure glider generator A pattern that evolves into one or more gliders, and nothing else. There was some interest in these early on, but they are no longer considered important. Here's a neat example:

..O............
..O............
OOO............
...............
......OOO......
.......O.......
............OOO
............O..
............O..

:pushalong Any tagalong at the front of a spaceship. The following is an example (found by David Bell in 1992) attached to the front of a MWSS.

..OOO.O.....
.OOOO.O.....
OO..........
.O.O........
..OOOO.O....
...OOO......
............
............
......OOOOO.
......O....O
......O.....
.......O...O
.........O..

:pyrotechnecium (p8) Found by Dave Buckingham in 1972.

.......O........
.....OOOOO......
....O.....O.....
.O..O.O.OO.O....
O.O.O.O....O..O.
.O..O....O.O.O.O
....O.OO.O.O..O.
.....O.....O....
......OOOOO.....
........O.......

:pyrotechneczum A common mistaken spelling of pyrotechnecium, caused by a copying error in the early 1990s.

:python = long snake


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_q.htm0000644000175100001440000002171212156145314015705 00000000000000 Life Lexicon (Q)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Q = Quetzal

:Q-pentomino Conway's name for the following pentomino, a traffic light predecessor.

OOOO
...O

:quad (p2) Found by Robert Kraus, April 1971. Of all oscillators that fit in a 6x6 box this is the only flipper.

OO..OO
O..O.O
.O....
....O.
O.O..O
OO..OO

:QuadLife A form of colorized Life in which there are four types of ON cell. A newly-born cell takes the type of the majority of its three parent cells, or the remaining type if its parent cells are all of different types. In areas where there are only two types of ON cell QuadLife reduces to Immigration.

:quadpole (p2) The barberpole of length 4.

OO.....
O.O....
.......
..O.O..
.......
....O.O
.....OO

:quapole = quadpole

:quarter (c/4 diagonally, p4) The following 25-cell spaceship, found by Jason Summers in September 2000. See also tubstretcher.

........OO...
.......OO....
.........O...
...........OO
..........O..
.............
.........O..O
.OO.....OO...
OO.....O.....
..O....O.O...
....OO..O....
....OO.......

:quasar (p3) Found by Robert Wainwright, August 1971. See pulsar.

..........OOO...OOO..........
.............................
........O....O.O....O........
........O....O.O....O........
........O....O.O....O........
..........OOO...OOO..........
.............................
........OOO.......OOO........
..OOO..O....O...O....O..OOO..
.......O....O...O....O.......
O....O.O....O...O....O.O....O
O....O.................O....O
O....O..OOO.......OOO..O....O
..OOO...................OOO..
.............................
..OOO...................OOO..
O....O..OOO.......OOO..O....O
O....O.................O....O
O....O.O....O...O....O.O....O
.......O....O...O....O.......
..OOO..O....O...O....O..OOO..
........OOO.......OOO........
.............................
..........OOO...OOO..........
........O....O.O....O........
........O....O.O....O........
........O....O.O....O........
.............................
..........OOO...OOO..........

:queen bee See queen bee shuttle.

:queen bee shuttle (p30) Found by Bill Gosper in 1970. There are a number of ways to stabilize the ends. Gosper originally stabilized shuttles against one another in a square of eight shuttles. Two simpler methods are shown here; for a third see buckaroo. The queen bee shuttle is the basis of all known true p30 guns (see Gosper glider gun).

.........O............
.......O.O............
......O.O.............
OO...O..O.............
OO....O.O.............
.......O.O........OO..
.........O........O.O.
....................O.
....................OO

:Quetzal Dieter Leithner's name for the true p54 glider gun he built in January 1998. (This is short for Quetzalcoatlus and expresses the fact that the gun was a very large Herschel loop that was not an emu.) Shortly afterwards Leithner also built a p56 Quetzal using a mechanism found by Noam Elkies for this purpose. In October 1998 Stephen Silver constructed a p55 Quetzal using Elkies' p5 reflector of the previous month.

Some of the more recent Quetzals are not Herschel loops, but are instead short Herschel tracks firing several glider streams all but one of which is reflected back to the beginning of the track to create a new Herschel. Noam Elkies first had the idea of doing this for the p55 case, and Stephen Silver constructed the resulting gun shortly after building the original (much larger) p55 Quetzal. Jason Summers later built a p54 version, which is more complicated because the evenness of the period makes the timing problems considerably more difficult.

:Quetzalcoatlus A giant flying dinosaur after which Dieter Leithner named his p54 gun. Usually abbreviated to Quetzal, or simply Q (as in Q54, Q55, Q56, Q-gun, etc.).

:quilt = squaredance


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_r.htm0000644000175100001440000005021212156145314015703 00000000000000 Life Lexicon (R)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:R = R-pentomino

:R2D2 (p8) This was found, in the form shown below, by Peter Raynham in the early 1970s. The name derives from a form with a larger and less symmetric stator discovered by Noam Elkies in August 1994. Compare with Gray counter.

.....O.....
....O.O....
...O.O.O...
...O.O.O...
OO.O...O.OO
OO.O...O.OO
...O...O...
...O.O.O...
....O.O....
.....O.....

:r5 = R-pentomino

:rabbits (stabilizes at time 17331) A 9-cell methuselah found by Andrew Trevorrow in 1986.

O...OOO
OOO..O.
.O.....
The following predecessor, found by Trevorrow in October 1995, has the same number of cells and lasts two generations longer.
..O....O
OO......
.OO.OOO.

:rake Any puffer whose debris consists of spaceships. A rake is said to be forwards, backwards or sideways according to the direction of the spaceships relative to the direction of the rake. Originally the term "rake" was applied only to forwards c/2 glider puffers (see space rake). Many people prefer not to use the term in the case where the puffed spaceships travel parallel or anti-parallel to the puffer, as in this case they do not rake out any significant region of the Life plane (and, in contrast to true rakes, these puffers cannot travel in a stream, and so could never be produced by a gun).

Although the first rakes (circa 1971) were c/2, rakes of other velocities have since been built. Dean Hickerson's construction of Corderships in 1991 made it easy for c/12 diagonal rakes to be built, although no one actually did this until 1998, by which time David Bell had constructed c/3 and c/5 rakes (May 1996 and September 1997, respectively). Jason Summers constructed a 2c/5 rake in June 2000 (building on work by Paul Tooke and David Bell) and a c/4 orthogonal rake in October 2000 (based largely on reactions found by David Bell).

The smallest possible period for a rake is probably 7, as this could be achieved by a 3c/7 orthogonal backwards glider puffer. The smallest period attained to date is 8 (Jason Summers, March 2001) - see backrake.

:$rats (p6) Found by Dave Buckingham, 1972.

.....OO.....
......O.....
....O.......
OO.O.OOOO...
OO.O.....O.O
...O..OOO.OO
...O....O...
....OOO.O...
.......O....
......O.....
......OO....

:R-bee = bun

:receiver See Herschel receiver.

:reflector Any stable or oscillating pattern that can reflect some type of spaceship (usually a glider) without suffering permanent damage. The first known reflector was the pentadecathlon, which functions as a 180-degree glider reflector (see relay). Other examples include the buckaroo, the twin bees shuttle and some oscillators based on the traffic jam reaction. Glider guns can also be made into reflectors, although these are mostly rather large.

In September 1998 Noam Elkies found some fast small-period glider reflectors. The p8 version is shown below. Replacing the figure-8 by the p6 pipsquirter gives a p6 version. A more complicated construction allows a p5 version (which, as had been anticipated, soon led to a true p55 gun - see Quetzal). And in August 1999 Elkies found a suitable p7 sparker, allowing the first p49 oscillator to be constructed.

......OO.....OO..
O.O...OO.....O...
.OO........O.O...
.O.........OO....
.......OO........
.......O.O.......
........O........
.................
...........OOO...
...........OOO...
...........OOO...
..............OOO
..............OOO
..............OOO

Stable reflectors are special in that if they satisfy certain conditions they can be used to construct oscillators of all sufficiently large periods. It was known for some time that stable reflectors were possible (see universal constructor), but no one was able to construct an explicit example until Paul Callahan did so in October 1996.

All known stable reflectors are very slow. Callahan's original reflector has a repeat time of 4840, soon improved to 1686 and then 894 and then 850. In November 1996 Dean Hickerson found a variant in which this is reduced to 747. Dave Buckingham reduced it to 672 in May 1997 using a somewhat different method, and in October 1997 Stephen Silver reduced it to 623 by a method closer to the original. In November 1998 Callahan reduced this to 575 with a new initial reaction. A small modification by Silver a few days later brought this down to 497.

But in April 2001 Dave Greene found a 180-degree stable reflector with a repeat time of only 202 (see boojum reflector). This reflector also won the $100 prize that Dieter Leithner had offered in April 1997 for the first stable reflector to fit in a 50x50 box, and the additional $100 that Alan Hensel had offered in January 1999 for the same feat. Dave Greene has subsequently offered $50 for the first 90-degree stable glider reflector that fits in a 50x50 box, and a further $50 for the first in a 35x35 box.

See also glider turner.

:regulator An object which converts input gliders aligned to some period to output gliders aligned to a different period. The most interesting case is a universal regulator.

:relay Any oscillator in which spaceships (typically gliders) travel in a loop. The simplest example is the p60 one shown below using two pentadecathlons. Pulling the pentadecathlons further apart allows any period of the form 60+120n to be achieved - this is the simplest proof of the existence of oscillators of arbitrarily large period.

...........................O....O..
................OO.......OO.OOOO.OO
.................OO........O....O..
................O..................
..O....O...........................
OO.OOOO.OO.........................
..O....O...........................

:repeater Any oscillator or spaceship.

:repeat time The minimum number of generations that is possible between the arrival of one object and the arrival of the next. This term is used for things such as reflectors or conduits and the objects (gliders or Herschels, for example) will interact fatally with each other (or one will interact fatally with a disturbance caused by the other) if they are too close together. For example, the repeat time of Dave Buckingham's 59-step B-heptomino to Herschel conduit (shown under conduit) is 58.

:rephaser The following reaction that shifts the phase and path of a pair of gliders. There is another form of this reaction that reflects the gliders 180 degrees - see glider-block cycle.

..O..O..
O.O..O.O
.OO..OO.
........
........
...OO...
...OO...

:replicator A finite pattern which repeatedly creates copies of itself. Such objects are known to exist (see universal constructor), but no concrete example is known.

:reverse fuse A fuse that produces some initial debris, but then burns cleanly. The following is a simple example.

.............OO
............O.O
...........O...
..........O....
.........O.....
........O......
.......O.......
......O........
.....O.........
....O..........
...O...........
..O............
OO.............

:revolver (p2)

O............O
OOO....O...OOO
...O.O.O..O...
..O......O.O..
..O.O......O..
...O..O.O.O...
OOO...O....OOO
O............O

:ring of fire (p2) The following muttering moat found by Dean Hickerson in September 1992.

................O.................
..............O.O.O...............
............O.O.O.O.O.............
..........O.O.O.O.O.O.O...........
........O.O.O..OO.O.O.O.O.........
......O.O.O.O......O..O.O.O.......
....O.O.O..O..........O.O.O.O.....
.....OO.O..............O..O.O.O...
...O...O..................O.OO....
....OOO....................O...O..
..O.........................OOO...
...OO...........................O.
.O...O........................OO..
..OOOO.......................O...O
O.............................OOO.
.OOO.............................O
O...O.......................OOOO..
..OO........................O...O.
.O...........................OO...
...OOO.........................O..
..O...O....................OOO....
....OO.O..................O...O...
...O.O.O..O..............O.OO.....
.....O.O.O.O..........O..O.O.O....
.......O.O.O..O......O.O.O.O......
.........O.O.O.O.OO..O.O.O........
...........O.O.O.O.O.O.O..........
.............O.O.O.O.O............
...............O.O.O..............
.................O................

:rle Run-length encoded. Run-length encoding is a simple (but not very efficient) method of file compression. In Life the term refers to a specific ASCII encoding used for Life patterns (and patterns for other similar cellular automata). This encoding was introduced by Dave Buckingham and is now the usual means of exchanging Life patterns (especially large ones) by e-mail.

:rock Dean Hickerson's term for an eater which remains intact throughout the eating process. The snake in Dave Buckingham's 59-step B-to-Herschel conduit (shown under conduit) is an example. Other still lifes that sometimes act as rocks include the tub, the hook with tail, the eater1 (eating with its tail) and the hat (in Heinrich Koenig's stabilization of the twin bees shuttle).

:roteightor (p8) Found by Robert Wainwright in 1972.

.O............
.OOO........OO
....O.......O.
...OO.....O.O.
..........OO..
..............
.....OOO......
.....O..O.....
.....O........
..OO..O...O...
.O.O......O...
.O.......O....
OO........OOO.
............O.

:rotor The cells of an oscillator that change state. Compare stator. It is easy to see that any rotor cell must be adjacent to another rotor cell.

:R-pentomino This is by far the most active polyomino with less than six cells: all the others stabilize in at most 10 generations, but the R-pentomino does not do so until generation 1103, by which time it has a population of 116.

.OO
OO.
.O.

:rule 22 Wolfram's rule 22 is the 2-state 1-D cellular automaton in which a cell is ON in the next generation if and only if exactly one of its three neighbours is ON in the current generation (a cell being counted as a neighbour of itself). This is the behaviour of Life on a cylinder of width 1.

:ruler A pattern constructed by Dean Hickerson in May 2005 that produces a stream of LWSS with gaps in it, such that the number of LWSS between successive gaps follows the "ruler function" (sequence A001511 in The On-Line Encyclopedia of Integer Sequences).

:rumbling river Any oscillator in which the rotor is connected and contained in a strip of width 2. The following p3 example is by Dean Hickerson, November 1994.

..............OO......OO......OO...O.OO..........
....O........O..O....O..O....O..O..OO.O..........
O..O.O....O...OO..O...OO..O...O.O.....O.OO.......
OOOO.O..OOOOOO..OOOOOO..OOOOOO..OOOOOO.O.O.......
.....O.O.....O.O.....O.O.....O.O.....O.O......OO.
..OO.O.O.O.O...O.O.O...O.O.O...O.O.O...O.O.....O.
.O.....O.O...O.O.O...O.O.O...O.O.O...O.O.O.O.OO..
.OO......O.O.....O.O.....O.O.....O.O.....O.O.....
.......O.O.OOOOOO..OOOOOO..OOOOOO..OOOOOO..O.OOOO
.......OO.O.....O.O...O..OO...O..OO...O....O.O..O
..........O.OO..O..O....O..O....O..O........O....
..........OO.O...OO......OO......OO..............

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_s.htm0000644000175100001440000020264512156145314015715 00000000000000 Life Lexicon (S)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:S Usually means big S, but may sometimes mean paperclip.

:sailboat (p16) A boat hassled by a Kok's galaxy, a figure-8 and two eater3s. Found by Robert Wainwright in June 1984.

........O...........O........
.......O.O.........O.O.......
........O...........O........
.............................
......OOOOO.......OOOOO......
.....O....O.......O....O.....
....O..O.............O..O....
.O..O.OO.............OO.O..O.
O.O.O.....O.......O.....O.O.O
.O..O....O.O.....O.O....O..O.
....OO..O..O.....O..O..OO....
.........OO.......OO.........
.............OO..............
.............O.O.............
........O..O..O..............
.......O.....................
.....OO..........OOO.........
..O......OO.O....OOO.........
.....O...O..O....OOO.........
.....OOO.O...O......OOO......
..O...........O.....OOO......
...O...O.OOO........OOO......
....O..O...O.................
....O.OO......O..............
..........OO.................
.........O...................
.....O..O....................

:sawtooth Any finite pattern whose population grows without bound but does not tend to infinity. (In other words, the population reaches new heights infinitely often, but also infinitely often returns to some fixed value.) Conway's preferred plural is "sawteeth".

The first sawtooth was constructed by Dean Hickerson in April 1991. The least infinitely repeating population of any known sawtooth is 262 (David Bell, July 2005).

See also tractor beam.

:SBM = sliding block memory

:Schick engine (c/2 orthogonally, p12) This spaceship, found by Paul Schick in 1972, produces a large spark (the 15 live cells at the rear in the phase shown below) which can be perturbed by other c/2 spaceships to form a variety of puffers. The diagram below shows the smallest form of the Schick engine, using two LWSS. It is also possible to use two MWSS or two HWSS, or even a LWSS and a HWSS.

OOOO..............
O...O.........O...
O...........OO....
.O..O..OO.....OOO.
......OOO......OOO
.O..O..OO.....OOO.
O...........OO....
O...O.........O...
OOOO..............

:Schick ship = Schick engine

:scorpion (p1)

...O...
.OOO...
O...OO.
O.O.O.O
.OO.O.O
.....O.

:scrubber (p2) Found in 1971.

....O......
..OOO......
.O.........
.O..OOO....
OO.O...O...
...O...O...
...O...O.OO
....OOO..O.
.........O.
......OOO..
......O....

:SE = switch engine

:seal (c/6 diagonally, p6) The first c/6 diagonal spaceship, found by Nicolay Beluchenko in September 2005.

...O..OO..........................
.OOO.O.O.O........................
.O..OOO..OO.......................
O..OOOOOO.O.OOO...................
.O..OOO.O.OOOOO...................
......O.O.O.O.....................
O.O...O.O.OOOOO...................
O..O.O..O.OO...O..................
...O..OO.......OOO................
.O...OOOOO.OOO..OO................
....O.........O...................
..O.O.........O...................
....OO.OOOOO...O..................
......O.OOO..O.....OO.............
......O..O...O.OOO.OO.............
........OO...OOO.O..O...O.........
........OO....OO.OOOO...OOO.......
...................O.O..O.........
.............O.O.....OO..OO.......
.............O..O.....O.OOO.....O.
.............O...O....OO..O...O..O
...............OOO.....OO........O
...............O.O..O..O.....OO..O
.................O..OO.OO.O..O....
................O.......O.O.......
.................O...OOOO.........
..................O...O...........
..................................
.......................O..........
......................O.O.........
.....................OO...........
.....................O.O..........
.....................OO...........
.......................O..........
......................O...........

:second glider domain The second glider domain of an edge shooter is the set of displacements (in space and time, relative to the glider stream emitted by the edge shooter) that a glider stream may have without interfering with the edge shooter. This is useful to know, because edge shooters are often used to generate glider streams very close to other glider streams.

:sesquihat (p1) Halfway between a hat and a twinhat.

....O
OO.O.O.
.O.O.O.
.O.O.OO
..O...

:SGR Abbreviation for stable glider reflector.

:shillelagh (p1)

OO...
O..OO
.OO.O

:ship (p1) The term is also used as a synonym of spaceship.

OO.
O.O
.OO

:ship in a bottle (p16) Found by Bill Gosper in August 1994. See also bottle.

....OO......OO....
...O..O....O..O...
...O.O......O.O...
.OO..OOO..OOO..OO.
O......O..O......O
O.OO..........OO.O
.O.O..........O.O.
...OO...OO...OO...
.......O.O........
.......OO.........
...OO........OO...
.O.O..........O.O.
O.OO..........OO.O
O......O..O......O
.OO..OOO..OOO..OO.
...O.O......O.O...
...O..O....O..O...
....OO......OO....

:ship on boat = ship tie boat

:ship on ship = ship-tie

:ship-tie (p1) The name is by analogy with boat-tie.

OO....
O.O...
.OO...
...OO.
...O.O
....OO

:ship tie boat (p1)

OO....
O.O...
.OO...
...OO.
...O.O
....O.

:short keys (p3) Found by Dean Hickerson, August 1989. See also bent keys and odd keys.

.O........O.
O.OOO..OOO.O
.O..O..O..O.
....O..O....

:shuttle Any oscillator which consists of an active region moving back and forth between stabilizing objects. The most well-known examples are the queen bee shuttle (which has often been called simply "the shuttle") and the twin bees shuttle. See also p54 shuttle and Eureka. Another example is the p72 R-pentomino shuttle that forms part of the pattern given under factory.

:siamese A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects sharing two or more cells. See snake siamese snake and loaf siamese barge for examples.

:side Half a sidewalk. In itself this is unstable and requires an induction coil.

OO...
O.OOO
....O

:sidecar A small tagalong for a HWSS that was found by Hartmut Holzwart in 1992. The resulting spaceship (shown below) has a phase with only 24 cells, making it in this respect the smallest known spaceship other than the standard spaceships and some trivial two-spaceship flotillas derived from them. Note also that a HWSS can support two sidecars at once.

.O......
O.....O.
O.....O.
OOOOO.O.
........
....OO..
..O....O
.O......
.O.....O
.OOOOOO.

:side-shooting gun = slide gun

:side-tracking See universal constructor.

:sidewalk (p1)

.OO.OO
..O.O.
.O..O.
.O.O..
OO.OO.

:siesta (p5) Found by Dave Buckingham in 1973. Compare sombreros.

...........OO...
...OO.....O.O...
...O.O....O.....
.....O...OO.O...
...O.OO.....OOO.
.OOO.....O.O...O
O...O.O.....OOO.
.OOO.....OO.O...
...O.OO...O.....
.....O....O.O...
...O.O.....OO...
...OO...........

:signal Movement of information through the Life universe. Signals can be carried by spaceships, fuses, drifters, or conduits. Spaceships can only transfer a signal at the speed of the spaceship, while fuses can transfer a signal at speeds up to the speed of light.

In practice, many signals are encoded as the presence or absence of a glider (or other spaceship) at a particular point at a particular time. Such signals can be combined by the collision of gliders to form logic operations such as AND, OR, and NOT gates. Signals can be duplicated using glider duplicators or other fanout devices, and can be used up by causing perturbations on other parts of the Life object.

Signals are used in pseudo-random glider generators, the unit Life cell and the Fermat prime calculator, among others.

:Silver's p5 (p5) The following oscillator found by Stephen Silver in February 2000:

OO.........
O..........
.O..O......
...OO......
...O...O.OO
..O....OO.O
..OO.......

As this has no spark, it appears useless. Nonetheless, in March 2000, David Eppstein found a way to use it to reduce the size of Noam Elkies' p5 reflector.

:singular flip flop (p2) Found by Robert Wainwright, July 1972.

..O...
..O.O.
O....O
OOOOOO
......
..OO..
..OO..

:sinking ship = canoe

:six Ls (p3) This is a compact form of loading dock.

...O...
.OOO..O
O...OOO
OOO....
....OOO
OOO...O
O..OOO.
...O...

:sixty-nine (p4) Found by Robert Wainwright, October 1978.

.........O...........
........O.O..........
.....................
......O...OO.........
.....O.....O.........
......O.O............
........OO......O....
................O....
..O.....OO....OOO....
..O...........OO.....
OOO.......OO..OO..OOO
OO......O.OO....OOO..
OO..OOO.O.O.....OOO..
..OOO................
..OOO......O.........
..........O.O........
.....................
........O...OO.......
.......O.....O.......
........O.O..........
..........OO.........

:skewed quad (p2)

.OO....
.O...OO
..O.O.O
.......
O.O.O..
OO...O.
....OO.

:skewed traffic light (p3) Found by Robert Wainwright, August 1989.

.............OO.........
............O..O........
.............O.O........
.........OO...O.........
..........O.OO..........
............O...........
............O...........
........................
OO........OOO......O....
OOOO.O........O...OO....
O.O..OOO.O....O.........
.........O....O.OOO..O.O
....OO...O........O.OOOO
....O......OOO........OO
........................
...........O............
...........O............
..........OO.O..........
.........O...OO.........
........O.O.............
........O..O............
.........OO.............

:slide gun A gun which fires sideways from an extending arm. The arm consists of streams of spaceships which are pushing a pattern away from the body of the gun and releasing an output spaceship every time they do so. Each output spaceship therefore travels along a different path.

Dieter Leithner constructed the first slide gun in July 1994 (although he used the term "side shooting gun"). The following pattern shows the key reaction of this slide gun. The three gliders shown will push the block one cell diagonally, thereby extending the length of the arm by one cell, and at the same time they release an output glider sideways. (In 1999, Jason Summers constructed slide guns using other reactions.)

..............OO.
..............OO.
........OOO......
..........O......
.........O.....OO
..............O.O
................O
.................
.................
.................
.................
.................
.................
.................
.................
.................
.................
.O...............
.OO..............
O.O..............

:sliding block memory A memory register whose value is stored as the position of a block. The block can be moved by means of glider collisions - see block pusher for an example.

In Conway's original formulation (as part of his proof of the existence of a universal computer in Life) 2 gliders were used to pull the block inwards by three diagonal spaces, and 30 gliders were used to push it out by the same amount. Dean Hickerson later greatly improved on this, finding a way to pull a block inwards by one diagonal space using 2 gliders, and push it out using 3 gliders. In order for the memory to be of any use there also has to be a way to read the value held. It suffices to be able to check whether the value is zero (as Conway did), or to be able to detect the transition from one to zero (as Hickerson did).

Dean Hickerson's sliding block memory is used in Paul Chapman's URM.

:slow glider construction Construction an object by a "slow salvo" of gliders all coming from the same direction, in such a way that timing of the gliders does not matter as long as they are not too close behind one another. This type of construction requires an initial seed object, such as a block, which is modified by each glider in turn until the desired object is produced.

In May 1997, Nick Gotts produced a slow glider construction of a block-laying switch engine from a block, using a slow salvo of 53 gliders. Constructions like this are important in the study of sparse Life, as they will occur naturally as gliders created in the first few generations collide with blonks and other debris.

Slow glider constructions are also useful in some designs for universal constructors. However, in this case the above definition is usually too restrictive, and it is desirable to allow constructions in which some gliders in the salvo are required to have a particular timing modulo 2 (a "p2 slow salvo"). This gives much greater flexibility, as blinkers can now be freely used in the intermediate construction steps.

:slow salvo See slow glider construction.

:small fish = LWSS

:small lake (p1) See also lake.

....O....
...O.O...
...O.O...
.OO...OO.
O.......O
.OO...OO.
...O.O...
...O.O...
....O....

:smiley (p8) Found by Achim Flammenkamp in July 1994 and named by Alan Hensel.

OO.O.OO
...O...
O.....O
.OOOOO.
.......
.......
OOO.OOO

:SMM breeder See breeder.

:smoke Debris which is fairly long-lived but eventually dies completely. Basically, a large spark. This term is used especially when talking about the output from a spaceship - see smoking ship.

:smoking ship A spaceship which produces smoke. If the smoke extends past the edge of the rest of the spaceship, then it can be used to perturb other objects as the spaceship passes by. Running gliders into the smoke is often a good way to turn or duplicate the them, or convert them into other objects. Sometimes the smoke from a smoking ship may itself be perturbed by accompanying spaceships in order to form a puffer. A simple example of a smoking ship is the Schick engine.

:snacker (p9) Found by Mark Niemiec in 1972. This is a pentadecathlon with stabilizers which force it into a lower period.

OO................OO
.O................O.
.O.O............O.O.
..OO............OO..
.......O....O.......
.....OO.OOOO.OO.....
.......O....O.......
..OO............OO..
.O.O............O.O.
.O................O.
OO................OO
The stabilizers make the domino spark largely inaccessible, but the snacker is extensible, as shown in the next diagram, and so a more accessible p9 domino spark can be obtained. In April 1998 Dean Hickerson found an alternative stabilizer that is less obtrusive than the original one, and this is also shown in this diagram.
OO................................
.O................................
.O.O.........................OO...
..OO.......................O..O...
.......O....O..............OOO....
.....OO.OOOO.OO...O....O......OOO.
.......O....O...OO.OOOO.OO...O...O
..OO..............O....O......OOO.
.O.O.......................OOO....
.O.........................O..O...
OO...........................OO...
An end can also be stabilized by killer candlefrobras, although this isn't efficient.

:snail (c/5 orthogonally, p5) The first known c/5 spaceship, discovered by Tim Coe in January 1996. For some time it was the slowest known orthogonal spaceship.

.O....................................
.O....................................
O.....................................
.OOO.................OOO...OOO........
.OO.O.........O...O.O......OOO........
..O...........OO.O.......O....OOOO....
......O......O...O.O...OO.O.....OO....
...O..O.OOO...OO.........O........OO.O
...OO.O.....O.....O.................O.
.........O.OOOOOOO....................
......................................
.........O.OOOOOOO....................
...OO.O.....O.....O.................O.
...O..O.OOO...OO.........O........OO.O
......O......O...O.O...OO.O.....OO....
..O...........OO.O.......O....OOOO....
.OO.O.........O...O.O......OOO........
.OOO.................OOO...OOO........
O.....................................
.O....................................
.O....................................

:snake (p1)

OO.O
O.OO

:snake bit An alternative name for a boat-bit. Not a very sensible name, because various other things can be used instead of a snake.

:snake bridge snake (p1)

....OO
....O.
.....O
....OO
OO.O..
O.OO..

:snake dance (p3) Found by Robert Wainwright, May 1972.

...OO.O..
...O.OO..
OO.O.....
.O..O.OOO
O..O.O..O
OOO.O..O.
.....O.OO
..OO.O...
..O.OO...

:snake pit This term has been used for two different oscillators: the p2 snake pit (essentially the same as fore and back)

O.OO.OO
OO.O.O.
......O
OOO.OOO
O......
.O.O.OO
OO.OO.O
and the p3 snake pit.
.....OO....
....O..O...
....O.OO...
.OO.O......
O.O.O.OOOO.
O.........O
.OOOO.O.O.O
......O.OO.
...OO.O....
...O..O....
....OO.....

:snake siamese snake (p1)

OO.OO.O
O.OO.OO

:sombrero One half of sombreros or siesta.

:sombreros (p6) Found by Dave Buckingham in 1972. If the two halves are moved three spaces closer to one another then the period drops to 4, and the result is just a less compact form of Achim's p4. Compare also siesta.

...OO........OO...
...O.O......O.O...
.....O......O.....
...O.OO....OO.O...
.OOO..........OOO.
O...O.O....O.O...O
.OOO..........OOO.
...O.OO....OO.O...
.....O......O.....
...O.O......O.O...
...OO........OO...

:soup A random initial pattern, often assumed to cover the whole Life universe.

:space dust A part of a spaceship or oscillator which looks like a random mix of ON and OFF cells. It is usually very difficult to find a glider synthesis for an object that consists wholly or partly of space dust.

:spacefiller Any pattern that grows at a quadratic rate by filling space with an agar. The first example was found in September 1993 by Hartmut Holzwart, following a suggestion by Alan Hensel. The diagram below shows a smaller spacefiller found by Tim Coe. See also Max. Spacefillers can be considered as breeders (more precisely, MMS breeders), but they are very different from ordinary breeders. The word "spacefiller" was suggested by Harold McIntosh and soon became the accepted term.

..................O........
.................OOO.......
............OOO....OO......
...........O..OOO..O.OO....
..........O...O.O..O.O.....
..........O....O.O.O.O.OO..
............O....O.O...OO..
OOOO.....O.O....O...O.OOO..
O...OO.O.OOO.OO.........OO.
O.....OO.....O.............
.O..OO.O..O..O.OO..........
.......O.O.O.O.O.O.....OOOO
.O..OO.O..O..O..OO.O.OO...O
O.....OO...O.O.O...OO.....O
O...OO.O.OO..O..O..O.OO..O.
OOOO.....O.O.O.O.O.O.......
..........OO.O..O..O.OO..O.
.............O.....OO.....O
.OO.........OO.OOO.O.OO...O
..OOO.O...O....O.O.....OOOO
..OO...O.O....O............
..OO.O.O.O.O....O..........
.....O.O..O.O...O..........
....OO.O..OOO..O...........
......OO....OOO............
.......OOO.................
........O..................

:space rake The following p20 forwards glider rake, which was the first known rake. It consists of an ecologist with a LWSS added to turn the dying debris into gliders.

...........OO.....OOOO
.........OO.OO...O...O
.........OOOO........O
..........OO.....O..O.
......................
........O.............
.......OO........OO...
......O.........O..O..
.......OOOOO....O..O..
........OOOO...OO.OO..
...........O....OO....
......................
......................
......................
..................OOOO
O..O.............O...O
....O................O
O...O............O..O.
.OOOO.................

:spaceship Any finite pattern that reappears (without additions or losses) after a number of generations and displaced by a non-zero amount. By far the most natural spaceships are the glider, LWSS, MWSS and HWSS. For further examples see B29, big glider, brain, Canada goose, Coe ship, Cordership, crane, dart, dragon, ecologist, edge-repair spaceship, Enterprise, flotilla, fly, hammerhead, hivenudger, non-monotonic, Orion, puff suppressor, pushalong, quarter, Schick engine, seal, sidecar, snail, still life tagalong, sparky, swan, turtle, wasp, weekender and x66. See also Caterpillar.

It is known that there exist spaceships travelling in all rational directions and at arbitrarily slow speeds (see universal constructor). Before 1989, however, the only known examples travelled at c/4 diagonally (gliders) or c/2 orthogonally (everything else). In 1989 Dean Hickerson started to use automated searches to look for new spaceships, and had considerable success. Other people have continued these searches using tools such as lifesrc and gfind, and as a result we now have a great variety of spaceships travelling at twelve different velocities. The following table details the discovery of spaceships with new velocities.


-----------------------------------------------------
Speed   Direction    Discoverer                Date
-----------------------------------------------------
c/4     diagonal     Richard Guy                 1970
c/2     orthogonal   John Conway                 1970
c/3     orthogonal   Dean Hickerson          Aug 1989
c/4     orthogonal   Dean Hickerson          Dec 1989
c/12    diagonal     Dean Hickerson          Apr 1991
2c/5    orthogonal   Dean Hickerson          Jul 1991
c/5     orthogonal   Tim Coe                 Jan 1996
2c/7    orthogonal   David Eppstein          Jan 2000
c/6     orthogonal   Paul Tooke              Apr 2000
c/5     diagonal     Jason Summers           Nov 2000
17c/45  orthogonal   Gabriel Nivasch et al.  Dec 2004
c/6     diagonal     Nicolay Beluchenko      Sep 2005
-----------------------------------------------------

A period p spaceship that displaces itself (m,n) during its period, where m>=n, is said to be of type (m,n)/p. It was proved by Conway in 1970 that p>=2m+2n. (This follows immediately from the easily-proved fact that a pattern cannot advance diagonally at a rate greater than one half diagonal step every other generation.)

The following diagram shows one of only two known c/5 diagonal spaceships. It was found by Jason Summers in January 2005.

..........OO..........
.........O..O.........
........OO............
.........O.OO.........
..........O.OOO.......
..........OO.OOO......
............O....OO...
............OOO....OO.
..O.........O.O.......
.OOO........O..O......
O...OO................
O..O.O.......OO.O..O..
.O.OO.OOOO...O...OOOO.
....OO.O...OO.......O.
....OO.OO..O.........O
.....O...O........O.OO
...........O.......O..
......O.....O......O..
......O.....O..O......
.......O...OO...OO....
.......O....OO.O......
..............OO......

:Spaceships in Conway's Life A series of articles posted by David Bell to the newsgroup comp.theory.cell-automata during the period August-October 1992 that described many of the new spaceships found by himself, Dean Hickerson and Hartmut Holzwart. Bell produced an addendum covering more recent developments in 1996.

:spark A pattern that dies. The term is typically used to describe a collection of cells periodically thrown off by an oscillator or spaceship, but other dying patterns, particularly those consisting or only one or two cells (such as produced by certain glider collisions, for example), are also described as sparks. For examples of small sparks see unix and HWSS. For an example of a much larger spark see Schick engine.

:spark coil (p2) Found in 1971.

OO....OO
O.O..O.O
..O..O..
O.O..O.O
OO....OO

:sparker An oscillator or spaceship that produces sparks. These can be used to perturb other patterns without being themselves affected.

:sparky A certain c/4 tagalong, shown here attached to the back of a spaceship.

..........O....................
..........O...............OO...
......OO.O.OOO..........OO...O.
O.OO.OO.OO..O.O...OO.OOOO......
O...OO..O.OO..OOO..O.OO..OO...O
O.OO....OOO.O.OOO......OO..O...
........OO.O...............O..O
O.OO....OOO.O.OOO......OO..O...
O...OO..O.OO..OOO..O.OO..OO...O
O.OO.OO.OO..O.O...OO.OOOO......
......OO.O.OOO..........OO...O.
..........O...............OO...
..........O....................

:sparse Life This refers to the study of the evolution of a Life universe which starts off as a random soup of extremely low density. Such a universe is dominated at an early stage by blocks and blinkers (often referred to collectively as blonks) in a ratio of about 2:1. Much later it will be dominated by simple infinite growth patterns (presumably mostly switch engines). The long-term fate of a sparse Life universe is less certain. It may possibly become dominated by self-reproducing patterns (see universal constructor), but it is not at all clear that there is any mechanism for these to deal with the all junk produced by switch engines.

:speed of light A speed of one cell per generation, the greatest speed at which any effect can propagate.

:S-pentomino Conway's name for the following pentomino, which rapidly dies.

..OO
OOO.

:spider (c/5 orthogonally, p5) This is the smallest known c/5 spaceship, and was found by David Bell in April 1997. Its side sparks have proved very useful in constructing c/5 puffers, including rakes. See also pre-pulsar.

......O...OOO.....OOO...O......
...OO.OOOOO.OO...OO.OOOOO.OO...
.O.OO.O.....O.O.O.O.....O.OO.O.
O...O.O...OOOOO.OOOOO...O.O...O
....OOO.....OO...OO.....OOO....
.O..O.OOO.............OOO.O..O.
...O.......................O...

:spiral (p1) Found by Robert Wainwright in 1971.

OO....O
.O..OOO
.O.O...
..O.O..
...O.O.
OOO..O.
O....OO

:SPPS (c/5 orthogonally, p30) The symmetric PPS. The original PPS found by David Bell in May 1998. Compare APPS.

:squaredance The p2 agar formed by tiling the plane with the following pattern. Found by Don Woods in 1971.

OO......
....OO..
..O....O
..O....O
....OO..
OO......
...O..O.
...O..O.

:squirter = pipsquirter

:S-spiral = big S

:stable A pattern is said to be stable if it is a parent of itself. See still life.

:stairstep hexomino (stabilizes at time 63) The following predecessor of the blockade.

..OO
.OO.
OO..

:stamp collection A collection of oscillators (or perhaps other Life objects) in a single diagram, displaying the exhibits much like stamps in a stamp album. The classic examples are by Dean Hickerson (see http://www.radicaleye.com/DRH/stamps.html).

:standard spaceship A glider, LWSS, MWSS or HWSS. These have all been known since 1970.

:star (p3) Found by Hartmut Holzwart, February 1993.

.....O.....
....OOO....
..OOO.OOO..
..O.....O..
.OO.....OO.
OO.......OO
.OO.....OO.
..O.....O..
..OOO.OOO..
....OOO....
.....O.....

:star gate A device by Dieter Leithner (October 1996) for transporting a LWSS faster than the speed of light. The key reaction is the Fast Forward Force Field.

:stator The cells of an oscillator that are always on. Compare rotor. (The stator is sometimes taken to include also some of those cells which are always off.) The stator is divided into the bushing and the casing.

By analogy, the cells of an eater that remain on even when the eater is eating are considered to constitute the stator of the eater. This is not necessarily well-defined, because the eater may have more than one eating action.

:step Another term for a generation. This term is particularly used in describing conduits. For example, a 64-step conduit is one through which the active object takes 64 generations to pass.

:stillater (p3) Found by Robert Wainwright, September 1985. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are 1-2-3 and cuphook.

...O....
..O.O.OO
..O.OO.O
OO......
.O.O.OO.
.O.O..O.
..O..O..
...OO...

:still life Any stable pattern, usually assumed to be finite and nonempty. For the purposes of enumerating still lifes this definition is, however, unsatisfactory because, for example, any pair of blocks would count as a still life, and there would therefore be an infinite number of 8-bit still lifes. For this reason a stricter definition is often used, counting a stable pattern as a single still life only if its islands cannot be divided into two nonempty sets both of which are stable in their own right. Compare pseudo still life.

The requirement that a still life not be decomposable into two separate stable patterns may seem a bit arbitrary, as it does not rule out the possibility that it might be decomposable into more than two. This is shown by the patterns in the following diagram, both found by Gabriel Nivasch in July 2001. On the left is a 32-cell pattern that can be broken down into three stable pieces but not into two. On the right is a 34-cell pattern that can be broken down into four stable pieces but not into two or three. (Note that, as a consequence of the Four-Colour Theorem, four is as high as you need ever go.) It is arguable that patterns like these ought not to be considered as single still lifes.

......OO...........OO.
..O.O..O......OO.O..O.
.O.OO.O.......O.OO.O..
.O....OO...........OO.
OO.OO.........O.OO...O
...OO.OO....OOO.OO.OO.
OO....O....O.......O..
.O.OO.O.....OOO.OO.O..
O..O.O........O.O.O...
OO....................

Still lifes have been enumerated by Conway (4-7 bits), Robert Wainwright (8-10 bits), Dave Buckingham (11-13 bits), Peter Raynham (14 bits) and Mark Niemiec (15-24 bits). The resulting figures are shown below. (These figures shouldn't be affected by the above discussion of the strict definition of "still life", because it is unlikely that there are any doubtful cases with much less than 32 cells.)


-------------
Bits   Number
-------------
  4        2
  5        1
  6        5
  7        4
  8        9
  9       10
 10       25
 11       46
 12      121
 13      240
 14      619
 15     1353
 16     3286
 17     7773
 18    19044
 19    45759
 20   112243
 21   273188
 22   672172
 23  1646147
 24  4051711
-------------

:still life tagalong A tagalong which takes the form of a still life in at least one phase. An example is shown below.

..OO...............
.OO.OO.............
..OOOO.............
...OO..............
...................
...OOOOO...........
..OOOOOOO..........
.OO.OOOOO..........
..OO...............
...................
........O.O.....OO.
......O....O...O..O
......OO.....O.O..O
.O..O..OOOO.O...OO.
O.......OO.........
O...O..............
OOOO...............

:stretcher Any pattern that grows by stretching a wick or agar. See wickstretcher and spacefiller.

:strict volatility A term suggested by Noam Elkies in August 1998 for the proportion of cells involved in a period n oscillator which themselves oscillate with period n. For prime n this is the same as the ordinary volatility.

:super beehive = honeycomb

:superfountain (p4) A p4 sparker which produces a 1-cell spark that is separated from the rest of the oscillator by two clear rows of cells. The first superfountain was found by Noam Elkies in February 1998. In January 2006 Nicolay Beluchenko found the much smaller one shown below. See also fountain.

...........O...........
.......................
.......................
.....O..O.....O..O.....
...OO..O.OOOOO.O..OO...
.....O...........O.....
...O.OO.........OO.O...
.O.O...OOO...OOO...O.O.
OOO.O.............O.OOO
..........O.O..........
....OOO...O.O...OOO....
....O..O...O...O..O....
...OOOO..O.O.O..OOOO...
...OO..OOO.O.OOO..OO...
..O...O...O.O...O...O..
...O..O.O.O.O.O.O..O...
....O.O.OO...OO.O.O....
.....O...........O.....

:superstring An infinite orthogonal row of cells stabilized on one side so that it moves at the speed of light, often leaving debris behind. The first examples were found in 1971 by Edward Fitzgerald and Robert Wainwright. Superstrings were studied extensively by Peter Rott during 1992-1994, and he found examples with many different periods. (But no odd periods. In August 1998 Stephen Silver proved that odd-period superstrings are impossible.)

Sometimes a finite section of a superstring can be made to run between two tracks ("waveguides"). This gives a fuse which can be made as wide as desired. The first example was found by Tony Smithurst and uses tubs. (This is shown below. The superstring itself is p4 with a repeating section of width 9 producing one blinker per period and was one of those discovered in 1971. With the track in place, however, the period is 8. This track can also be used with a number of other superstrings.) Shortly after seeing this example, in March 1997 Peter Rott found another superstring track consisting of boats. At present these are the only two waveguides known. Both are destroyed by the superstring as it moves along - it would be interesting to find one that remains intact.

See titanic toroidal traveler for another example of a superstring.

.OO..........................................................
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
....O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
.OOO.........................................................
..OO.........................................................
..OO.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
..OO.........................................................
..OO.........................................................
.OOO.........................................................
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
....O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
.OO..........................................................

:support Those parts of an object which are only present in order to keep the rest of the object (such an engine or an edge spark) working correctly. These can be components of the object, or else accompanying objects used to perturb the object. In many cases there is a wide variation of support possible for an engine. The arms in many puffers are an example of support.

:surprise (p3) Found by Dave Buckingham, November 1972.

...O....OO
...OOO..O.
.OO...O.O.
O..OO.O.OO
.O......O.
OO.O.OO..O
.O.O...OO.
.O..OOO...
OO....O...

:swan (c/4 diagonally, p4) A diagonal spaceship producing some useful sparks. Found by Tim Coe in February 1996.

.O..........OO..........
OOOOO......OO...........
O..OO........O.......OO.
..OO.O.....OO......OOO.O
...........OO...O.OO....
.....O.O......OO........
..........OOO.O....O....
.......OOO...O....O.....
........O.......O.......
........O......O........
........................
...........O............

:switch engine The following pattern, which in itself is unstable, but which can be used to make c/12 diagonal puffers and spaceships.

.O.O..
O.....
.O..O.
...OOO

The switch engine was discovered by Charles Corderman in 1971. He also found the two basic types of stabilized switch engine: a p288 block-laying type (the more common of the two) and p384 glider-producing type. These two puffers are the most natural infinite growth patterns in Life, being the only ones ever seen to occur from random starting patterns.

Patterns giving rise to block-laying switch engines can be seen under infinite growth, and one giving rise to a glider-producing switch engine is shown under time bomb. See also Cordership and ark.

:synthesis = glider synthesis


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_t.htm0000644000175100001440000014615412156145314015720 00000000000000 Life Lexicon (T)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:T = T-tetromino

:table The following induction coil.

OOOO
O..O

:table on table (p1)

O..O
OOOO
....
OOOO
O..O

:tag = tagalong

:tagalong An object which is not a spaceship in its own right, but which can be attached to one or more spaceships to form a larger spaceship. For examples see Canada goose, fly, pushalong, sidecar and sparky. See also Schick engine, which consists of a tagalong attached to two LWSS (or similar).

:tail spark A spark at the back of a spaceship. For example, the 1-bit spark at the back of a LWSS, MWSS or HWSS in their less dense phases.

:tame To perturb a dirty reaction using other patterns so as to make it clean and hopefully useful. Or to make a reaction work which would otherwise fail due to unwanted products which interfere with the reaction.

:taming See tame.

:teardrop The following induction coil, or the formation of two beehives that it evolves into after 20 generations. (Compare butterfly, where the beehives are five cells further apart.)

OOO.
O..O
O..O
.OO.

:technician (p5) Found by Dave Buckingham, January 1973.

.....O.....
....O.O....
....OO.....
..OO.......
.O...OOO...
O..OO...O.O
.OO....O.OO
...O.O.O...
...O...O...
....OOO....
......O.O..
.......OO..

:technician finished product = technician

:teeth A 65-cell quadratic growth pattern found by Nick Gotts in March 2000. This (and a related 65-cell pattern which Gotts found at about the same time) beat the record previously held by mosquito5 for smallest population known to have superlinear growth. Now superseded by catacryst and metacatacryst.

:ternary reaction Any reaction between three objects. In particular, a reaction in which two gliders from one stream and one glider from a crossing stream of the same period annihilate each other. This can be used to combine two glider guns of the same period to produce a new glider gun with double the period.

:test tube baby (p2)

OO....OO
O.O..O.O
..O..O..
..O..O..
...OO...

:tetraplet Any 4-cell polyplet.

:tetromino Any 4-cell polyomino. There are five such objects, shown below. The first is the block, the second is the T-tetromino and the remaining three rapidly evolve into beehives.

OO......OOO......OOOO......OOO......OO.
OO.......O...................O.......OO

:The Recursive Universe A popular science book by William Poundstone (1985) dealing with the nature of the universe, illuminated by parallels with the game of Life. This book brought to a wider audience many of the results that first appeared in LifeLine. It also outlines the proof of the existence of a universal constructor in Life first given in Winning Ways.

:thumb A spark-like protrusion which flicks out in a manner resembling a thumb being flicked.

Here are two examples. On the left is a p9 thumb sparker found by Dean Hickerson in October 1998. On the right is a p4 one found by David Eppstein in June 2000.

.......O..............O.....
...OO...O.........OO...O....
...O.....O.OO.....O.....O...
OO.O.O......O......OOO.O.OO.
OO.O.OO.OOOO............OO.O
...O.O...........OOOOOO....O
...O.O.OOO.......O....OOOOO.
....O.O...O.........O.......
......O..OO........O.OOOO...
......OO...........O.O..O...
....................O.......

:thunderbird (stabilizes at time 243)

OOO
...
.O.
.O.
.O.

:tick = generation

:tie A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects joined point to point, as in ship tie boat.

:time bomb The following pattern by Doug Petrie, which is really just a glider-producing switch engine in disguise. See infinite growth for some better examples of a similar nature.

.O...........OO
O.O....O......O
.......O....O..
..O..O...O..O..
..OO......O....
...O...........

:titanic toroidal traveler The superstring with the following repeating segment. The front part becomes p16, but the eventual fate of the detached back part is unknown.

OOOOOO
OOO...

:TL = traffic light

:T-nosed p4 (p4) Found by Robert Wainwright in October 1989. See also filter.

.....O.....
.....O.....
....OOO....
...........
...........
...........
...OOOOO...
..O.OOO.O..
..O.O.O.O..
.OO.O.O.OO.
O..OO.OO..O
OO.......OO

:T-nosed p6 (p6) Found by Achim Flammenkamp in September 1994. There is also a much larger and fully symmetric version found by Flammenkamp in August 1994.

......OO...OO......
......O.O.O.O......
.......O...O.......
...................
..O.O.O.....O.O.O..
OOO.O.OO...OO.O.OOO
..O.O.O.....O.O.O..
...................
.......O...O.......
......O.O.O.O......
......OO...OO......

:toad (p2) Found by Simon Norton, May 1970. This is the second most common oscillator, although blinkers are more than a hundred times as frequent. See also killer toads.

.OOO
OOO.

:toad-flipper A toad hassler that works in the manner of the following example. Two domino sparkers, here pentadecathlons, apply their sparks to the toad in order to flip it over. When the sparks are applied again it is flipped back. Either or both domino sparkers can be moved down two spaces from the position shown and the toad-flipper will still work, but because of symmetry there are really only two different types. Compare toad-sucker.

.O..............O.
.O..............O.
O.O............O.O
.O..............O.
.O......O.......O.
.O......OO......O.
.O......OO......O.
O.O......O.....O.O
.O..............O.
.O..............O.

:toad-sucker A toad hassler that works in the manner of the following example. Two domino sparkers, here pentadecathlons, apply their sparks to the toad in order to shift it. When the sparks are applied again it is shifted back. Either or both domino sparkers can be moved down two spaces from the position shown and the toad-sucker will still work, but because of symmetry there are really only three different types. Compare toad-flipper.

.O................
.O..............O.
O.O.............O.
.O.............O.O
.O......O.......O.
.O......OO......O.
.O......OO......O.
O.O......O......O.
.O.............O.O
.O..............O.
................O.

:toaster (p5) Found by Dean Hickerson, April 1992.

....O......OO..
...O.O.OO..O...
...O.O.O.O.O...
..OO.O...O.OO..
O...OO.O.OO...O
...O.......O...
...O.......O...
O...OO.O.OO...O
..OO.O...O.OO..
...O.O.O.O.O...
...O.O.OO..O...
....O......OO..

:torus As applies to Life, usually means a finite Life universe which takes the form of an m x n rectangle with the bottom edge considered to be joined to the top edge and the left edge joined to the right edge, so that the universe is topologically a torus. There are also other less obvious ways of obtaining an toroidal universe.

See also Klein bottle.

:total aperiodic Any finite pattern which evolves in such a way that no cell in the Life plane is eventually periodic. The first example was found by Bill Gosper in November 1997. A few days later he found the following much smaller example consisting of three copies of a p12 backrake by Dave Buckingham.

.........................................O.................
........................................OOO................
.......................................OO.O.....O..........
.......................................OOO.....OOO.........
........................................OO....O..OO...OOO..
..............................................OOO....O..O..
........................................................O..
........................................................O..
........................................................O..
........................................OOO............O...
........................................O..O...............
........................................O..................
........................................O..................
.........................................O.................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
......................................OOO..................
......................................O..O...........O.....
......................................O.............OOO....
......................................O............OO.O....
......................................O............OOO.....
.......................................O............OO.....
...........................................................
...........................................................
...................................OOO.....................
..................................OOOOO....................
..................................OOO.OO.......OO........O.
.....................................OO.......OOOO........O
..............................................OO.OO...O...O
................................................OO.....OOOO
...........................................................
...........................................................
....................O......................................
.....................O.....................................
.OO.............O....O................................OOO..
OOOO.............OOOOO..................................O..
OO.OO...................................................O..
..OO...................................................O...
....................................O......................
.....................................O.....................
.....................OO..........O...O.....................
......................OO..........OOOO...............OO....
.....................OO...........................OOO.OO...
.....................O............................OOOOO....
...................................................OOO.....
...........................................................
......................OO...................................
.............OOOO....OOOO..................................
............O...O....OO.OO.................................
.OOOOO..........O......OO..................................
O....O.........O...........................................
.....O.....................................................
....O......................................................

:T-pentomino Conway's name for the following pentomino, which is a common parent of the T-tetromino.

OOO
.O.
.O.

:track A path made out of conduits, often ending where it begins so that the active object is cycled forever, forming an oscillator or a gun.

:tractor beam A stream of spaceships that can draw an object towards the source of the stream. The example below shows a tractor beam pulling a loaf; this was used by Dean Hickerson to construct a sawtooth.

.....................O..O......................
.....OOOO...........O..............OOOO........
.....O...O..........O...O..........O...O.......
.....O........OO....OOOO...........O........OO.
.OO...O..O...OOOO...........OO......O..O...OOOO
O..O........OO.OO..........OO.OO..........OO.OO
O.O..........OO.............OOOO...........OO..
.O...........................OO................

:traffic circle (p100)

.....................OO....OO...................
.....................O.O..O.O...................
.......................O..O.....................
......................OO..OO....................
.....................OOO..OOO...................
.......................O..O.....................
...............................O................
..............................O.OO..............
..................................O.............
..........................O...O..O.O............
..........................O.....O..O............
..........................O......OO.............
.........OO.....................................
........O..O..........OOO...OOO.................
.......O.O.O....................................
......OOO.O...............O.....................
......OOO.................O.....................
..........................O.....................
............OOO.................................
OO..O................OOO........................
O..OO.....O.....O...............................
.OOOOO....O.....O..O.....O.................O..OO
..........O.....O..O.....O.................OO..O
...................O.....O.......OOO......OOOOO.
.OOOOO......OOO.................................
O..OO................OOO.......O.....O..........
OO..O..........................O.....O....OOOOO.
...............................O.....O.....OO..O
...........................................O..OO
.................................OOO............
.......................................OO.......
......................................OOO.......
.....................................O.OO.......
....................................O.O.........
....................OOO.............O..O........
.....................................OO.........
.............OO....O..O.........................
............O..O................................
............O.O.O...............................
.............O..O...............................
.................O..............................
..............O.O...............................
.....................O..O.......................
...................OOO..OOO.....................
....................OO..OO......................
.....................O..O.......................
...................O.O..O.O.....................
...................OO....OO.....................

:traffic jam Any traffic light hassler, such as traffic circle. The term is also applied to the following reaction, used in most traffic light hasslers, in which two traffic lights interact in such a way as to reappear after 25 generations with an extra 6 spaces between them.

..OOO...........
...........OOO..
O.....O.........
O.....O..O.....O
O.....O..O.....O
.........O.....O
..OOO...........
...........OOO..

:traffic light (p2) A common formation of four blinkers.

..OOO..
.......
O.....O
O.....O
O.....O
.......
..OOO..

:trans-beacon on table (p2)

....OO
.....O
..O...
..OO..
......
OOOO..
O..O..

:trans-boat with tail (p1)

OO...
O.O..
.O.O.
...O.
...OO

:transceiver See Herschel transceiver.

:trans-loaf with tail (p1)

.O....
O.O...
O..O..
.OO.O.
....O.
....OO

:transmitter See Herschel transmitter.

:transparent block reaction A certain reaction between a block and a Herschel predecessor in which the block reappears in its original place some time later, the reaction having effectively passed through it. This reaction was found by Dave Buckingham in 1988. It has been used in some Herschel conduits, and in the gunstars. Because the reaction involves a Herschel predecessor rather than an actual Herschel, the following diagram shows instead a B-heptomino (which by itself would evolve into a block and a Herschel).

O.............
OO..........OO
.OO.........OO
OO............

:transparent debris effect A reaction in which a Herschel or other active region destroys a still life, then later, having passed through the place where the still life was, recreates the still life in its original position. For an example, see transparent block reaction.

:trice tongs (p3) Found by Robert Wainwright, February 1982. In terms of its 7x7 bounding box this ties with jam as the smallest p3 oscillator.

..O....
..OOO..
OO...O.
.O.O.O.
.O.....
..OO..O
.....OO

:triomino Either of the two 3-cell polyominoes. The term is rarely used in Life, since the two objects in question are simply the blinker and the pre-block.

:triple caterer (p3) Found by Dean Hickerson, October 1989. Compare caterer and double caterer.

.....OO.........
....O..O..OO....
....OO.O...O....
......O.OOO....O
..OOO.O.O....OOO
.O..O..O....O...
O.O..O...O..OO..
.O..............
..OO.OO.OO.OO...
...O...O...O....
...O...O...O....

:triplet Any 3-cell polyplet. There are 5 such objects, shown below. The first two are the two triominoes, and the other three vanish in two generations.

O..................O.......O.......O..
OO......OOO......OO.......O.O.......O.
.....................................O

:tripole (p2) The barberpole of length 3.

OO....
O.O...
......
..O.O.
.....O
....OO

:tritoad (p3) Found by Dave Buckingham, October 1977.

.........OO.......
.........O........
..........O..OO...
.......OOO.O..O...
......O....OO.O.OO
......O.OO..O.O.OO
...OO.O...OO..O...
...O..OO...O.OO...
OO.O.O..OO.O......
OO.O.OO....O......
...O..O.OOO.......
...OO..O..........
........O.........
.......OO.........

:true Opposite of pseudo. A gun emitting a period n stream of spaceships (or rakes) is said to be a true period n gun if its mechanism oscillates with period n. (The same distinction between true and pseudo also exists for puffers.) True period n guns are known to exist for all periods greater than 61 (see My Experience with B-heptominos in Oscillators), but only a few smaller periods have been achieved, namely 22, 24, 30, 36, 44, 46, 48, 50, 54, 55, 56 and 60. (Credits for these small period guns are: p30, p46 and p60 by Bill Gosper in 1970-1971, p44 by Dave Buckingham in 1992, p50 by Dean Hickerson in 1996, p24 and p48 by Noam Elkies in 1997, p54 and p56 by Dieter Leithner in early 1998, p55 by Stephen Silver in late 1998, p22 by David Eppstein in 2000 and p36 by Jason Summers in 2004.)

The following diagram shows the p22 gun (David Eppstein, August 2000, using two copies of a p22 oscillator found earlier the same day by Jason Summers).

..................OO.........................
...................O.......O.................
...................O.O..............OO.......
....................OO............OO..O......
........................OOO.......OO.OO......
........................OO.OO.......OOO......
........................O..OO............OO..
.........................OO..............O.O.
...................................O.......O.
...........................................OO
.............................................
OO.......................O...................
.O.....................O.O...................
.O.O.............OOO....OO...................
..OO...O........O...O........................
......O.OO......O....O.......................
.....O....O......OO.O.........O..............
......O...O........O...OO......O.............
.......OOO.............O.O...OOO.............
.........................O...................
.........................OO..................

:T-tetromino The following common predecessor of a traffic light.

OOO
.O.

:tub (p1)

.O.
O.O
.O.

:tubber (p3) Found by Robert Wainwright before June 1972.

....O.O......
....OO.O.....
.......OOO...
....OO....O..
OO.O..OO..O..
.O.O....O.OO.
O...O...O...O
.OO.O....O.O.
..O..OO..O.OO
..O....OO....
...OOO.......
.....O.OO....
......O.O....

:tubeater A pattern that consumes the output of a tubstretcher. The smallest known tubeater was found by Hartmut Holzwart, and is shown below in conjunction with the smallest known tubstretcher.

.......OO.........................
.......O.O........................
.......O..........................
..........O.......................
..........OO......................
..........OO......................
.........OO.......................
OO......OO...O....................
O.O...OO..O.O.O...................
O.....OOO....O.O..................
...O..........O.O.................
...OO..........O.O................
................O.O...............
.................O.O...O..........
..................OO..O.O.........
.....................OO.O.........
.....................OO...........
.....................OO...........
...............................OO.
.......................O....OO.O..
.......................OOO..OO....
.......................OOO..OO....
........................OO........
..................................
..........................O.......
.........................OO.......
.........................O........
..........................O.......
..................................
...........................OO.....
............................O.OO..
................................O.
.............................OO...
.............................OO...
...............................O..
................................OO

:tubstretcher Any wickstretcher in which the wick is two diagonal lines of cells forming, successively, a tub, a barge, a long barge, etc. The first one was found by Hartmut Holzwart in June 1993, although at the time this was considered to be a boatstretcher (as it was shown with an extra cell, making the tub into a boat). The following small example is by Nicolay Beluchenko (August 2005), using a quarter.

.......OOO.....
.......O.......
........O......
..........OO...
...........O...
...............
........OO...O.
OOO.....OO..O.O
O......O.O...O.
.O....OO.......
...OOOO.O......
....OO.........

:tub with tail (p1)

.O...
O.O..
.O.O.
...O.
...OO

:tugalong = tagalong

:tumbler (p14) The smallest known p14 oscillator. Found by George Collins in 1970.

.O.....O.
O.O...O.O
O..O.O..O
..O...O..
..OO.OO..

:tumbling T-tetson (p8) A T-tetromino hassled by two figure-8s. Found by Robert Wainwright.

.OOO.................
O..................OO
O...O............O.OO
O..O.O..........O....
..O.O..O...........O.
...O...O.......OO.O..
.......O.......OO....
....OOO....O.........
.........OO..........
...........O.........

:Turing machine See universal computer.

:turning toads (p4 wick) Found by Dean Hickerson, October 1989.

..............OO.....OO.....OO.....OO.....OO..............
.......O.....O......O......O......O......O................
......OO...O....O.O....O.O....O.O....O.O....O.O.O.OO......
..OO.O.OOO.O..OO..O..OO..O..OO..O..OO..O..OO..O..O..O.OO..
O..O.OO.........................................OOOOO.O..O
OO.O..............................................OO..O.OO
...O..................................................O...
...OO................................................OO...

:turtle (c/3 orthogonally, p3) Found by Dean Hickerson.

.OOO.......O
.OO..O.OO.OO
...OOO....O.
.O..O.O...O.
O....O....O.
O....O....O.
.O..O.O...O.
...OOO....O.
.OO..O.OO.OO
.OOO.......O

:twin bees shuttle (p46) Found by Bill Gosper in 1971, this is the basis of all known p46 oscillators, and so of all known true p46 guns (see new gun for an example). There are numerous ways to stabilize the ends, two of which are shown in the diagram. On the left is David Bell's double block reaction (which results in a shorter, but wider, shuttle than usual), and on the right is the stabilization by a single block. This latter method produces a very large spark which is useful in a number of ways (see, for example, metamorphosis). Adding a symmetrically placed block below this one suppresses the spark. See also p54 shuttle.

.OO........................
.OO........................
...........................
...............O...........
OO.............OO........OO
OO..............OO.......OO
...........OO..OO..........
...........................
...........................
...........................
...........OO..OO..........
OO..............OO.........
OO.............OO..........
...............O...........
...........................
.OO........................
.OO........................

:twinhat (p1) See also hat and sesquihat.

..O...O..
.O.O.O.O.
.O.O.O.O.
OO.O.O.OO
....O....

:twin peaks = twinhat

:twirling T-tetsons II (p60) Found by Robert Wainwright. This is a pre-pulsar hassled by killer toads.

.......OO...OO..........
......O.......O.........
.........O.O............
.......OO...OO..........
........................
........................
........................
.....................OOO
....................OOO.
.............O..........
OOO.........OOO.........
.OOO....................
....................OOO.
.....................OOO
........................
.OOO....................
OOO.........OOO.........
.............O..........
........................
........................
..........OO...OO.......
............O.O.........
.........O.......O......
..........OO...OO.......

:TWIT = tub with tail

:two eaters (p3) Found by Bill Gosper, September 1971.

OO.......
.O.......
.O.O.....
..OO.....
.....OO..
.....O.O.
.......O.
.......OO

:two pulsar quadrants (p3) Found by Dave Buckingham, July 1973. Compare pulsar quadrant.

....O....
....O....
...OO....
..O......
O..O..OOO
O...O.O..
O....O...
.........
..OOO....

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_u.htm0000644000175100001440000002337012156145314015713 00000000000000 Life Lexicon (U)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:underpopulation Death of a cell caused by it having fewer than two neighbours. See also overpopulation.

:unit Life cell A rectangular pattern, of size greater than 1x1, that can simulate Life in the following sense. The pattern by itself represents a dead Life cell, and some other pattern represents a live Life cell. When the plane is tiled by these two patterns (which then represent the state of a whole Life universe) they evolve, after a fixed amount of time, into another tiling of the plane by the same two patterns which correctly represents the Life generation following the one they initially represented. It is usual to use capital letters for the simulated things, so, for example, for the first known unit Life cell (constructed by David Bell in January 1996), one Generation is 5760 generations, and one Cell is 500x500 cells.

In December 2005, Jason Summers constructed an analogous unit cell for Wolfram's Rule 100, a one-dimensional cellular automaton that is know be universal.

:universal computer A computer that can compute anything that is computable. (The concept of computability can be defined in terms of Turing machines, or by Church's lambda calculus, or by a number of other methods, all of which can be shown to lead to equivalent definitions.) The relevance of this to Life is that both Bill Gosper and John Conway proved early on that it is possible to construct a universal computer in the Life universe. (To prove the universality of a cellular automaton with simple rules was in fact Conway's aim in Life right from the start.) Conway's proof is outlined in Winning Ways, and also in The Recursive Universe.

Until recently, no universal Life computer had ever been built in practice, because it would be enormous, even with the improvements that have been devised since those early proofs. In April 2000, Paul Rendell completed a Turing machine construction (described in http://www.cs.ualberta.ca/~bulitko/F02/papers/tm_words.pdf). This, however, has a finite tape, as opposed to the infinite tape of a true Turing machine, and is therefore not a universal computer. But in November 2002, Paul Chapman announced the construction of a universal computer, details of which can be found at http://www.igblan.free-online.co.uk/igblan/ca/. This is a universal register machine based around Dean Hickerson's sliding block memory.

See also universal constructor.

:universal constructor A pattern that is capable of constructing almost any pattern that has a glider synthesis. This definition is a bit vague. A precise definition seems impossible because it has not been proved that all possible glider fleets are constructible. In any case, a universal constructor ought to be able to construct itself in order to qualify as such. An outline of Conway's proof that such a pattern exists can be found in Winning Ways, and also in The Recursive Universe. The key mechanism for the production of gliders with any given path and timing is known as side-tracking, and is based on the kickback reaction. A universal constructor designed in this way can also function as a universal destructor - it can delete almost any pattern that can be deleted by gliders.

In May 2004, Paul Chapman and Dave Greene produced a prototype programmable universal constructor. This is able to construct objects by means of slow glider constructions. It likely that it could be programmed to be construct itself, but the necessary program would be very large; moreover an additional mechanism would be needed in order to copy the program.

A universal constructor is most useful when attached to a universal computer, which can be programmed to control the constructor to produce the desired pattern of gliders. In what follows I will assume that a universal constructor always includes this computer.

The existence of a universal constructor/destructor has a number of theoretical consequences.

For example, the constructor could be programmed to make copies of itself. This is a replicator.

The constructor could even be programmed to make just one copy of itself translated by a certain amount and then delete itself. This would be a (very large, very high period) spaceship. Any translation is possible (except that it must not be too small), so that the spaceship could travel in any direction. It could also travel slower than any given speed, since we could program it to perform some time-wasting task (such as repeatedly constructing and deleting a block) before copying itself. Of course, we could also choose for it to leave some debris behind, thus making a puffer.

It is also possible to show that the existence of a universal constructor implies the existence of a stable reflector. This proof is not so easy, however, and is no longer of much significance now that explicit examples of such reflectors are known.

:universal destructor See universal constructor.

:universal register machine = URM

:universal regulator A regulator in which the incoming gliders are aligned to period 1, that is, they have arbitrary timing (subject to some minimum time required for the regulator to recover from the previous glider).

Paul Chapman constructed the first universal regulator in March 2003. It is adjustable, so that the output can be aligned to any desired period.

:unix (p6) Two blocks eating a long barge. This is a useful sparker, found by Dave Buckingham in February 1976. The name derives from the fact that it was for some time the mascot of the Unix lab of the mathematics faculty at the University of Waterloo.

.OO.....
.OO.....
........
.O......
O.O.....
O..O..OO
....O.OO
..OO....

:up boat with tail = trans-boat with tail

:U-pentomino Conway's name for the following pentomino, which rapidly dies.

O.O
OOO

:URM A universal register machine, particularly Paul Chapman's Life implementation of such a machine. See universal computer for more information.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_v.htm0000644000175100001440000001143612156145314015714 00000000000000 Life Lexicon (V)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:vacuum Empty space. That is, space containing only dead cells.

:Venetian blinds The p2 agar obtained by using the pattern O..O to tile the plane.

:very long = long long

:very long house The following induction coil.

.OOOOO.
O..O..O
OO...OO

:volatility The volatility of an oscillator is the size (in cells) of its rotor divided by the sum of the sizes of its rotor and its stator. In other words, it is the proportion of cells involved in the oscillator which actually oscillate. For many periods there are known oscillators with volatility 1, see for example Achim's p16, figure-8, Kok's galaxy, mazing, pentadecathlon, phoenix, relay, smiley and tumbler. The smallest period for which the existence of such statorless oscillators is undecided is 3, although Dean Hickerson showed in 1994 that there are p3 oscillators with volatility arbitrarily close to 1 (as is the case for all but finitely many periods, because of the possibility of feeding the gliders from a true period n gun into an eater).

The term "volatility" is due to Robert Wainwright. See also strict volatility.

:volcano Any of a number of p5 oscillators which produce sparks. See lightweight volcano, middleweight volcano and heavyweight volcano.

:V-pentomino Conway's name for the following pentomino, a loaf predecessor.

O..
O..
OOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_w.htm0000644000175100001440000003254212156145314015716 00000000000000 Life Lexicon (W)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:washerwoman (2c/3 p18 fuse) A fuse by Earl Abbe.

O.......................................................
OO....O.....O.....O.....O.....O.....O.....O.....O.....O.
OOO..O.O...O.O...O.O...O.O...O.O...O.O...O.O...O.O...O.O
OO....O.....O.....O.....O.....O.....O.....O.....O.....O.
O.......................................................

:washing machine (p2) Found by Robert Wainwright before June 1972.

.OO.OO.
O.OO..O
OO....O
.O...O.
O....OO
O..OO.O
.OO.OO.

:wasp (c/3 orthogonally, p3) The following spaceship which produces a domino spark at the back. It is useful for perturbing other objects. Found by David Bell, March 1998.

..........OO.OO.......
........OO.O.OO.OO....
.....OOO.O..OOO..OOOO.
.OOO....OOO.....O....O
O.O.O.OOO.O........OO.
O.O.O.OOOO............
.O.O....O..O..........
..........O...........
..O...................
..O...................

:wavefront (p4) Found by Dave Buckingham, 1976 or earlier.

........OO...
........O....
.........O...
........OO...
.....OO...OO.
....O..OOO..O
....O.....OO.
.....O...O...
OO.O.O...O...
O.OO.O.OO....
....O.O......
....O.O......
.....O.......

:waveguide See superstring.

:weekender (2c/7 orthogonally, p7) Found by David Eppstein in January 2000. In April 2000 Stephen Silver found a tagalong for a pair of weekenders. At present, n weekenders pulling n-1 tagalongs constitute the only known spaceships of this speed or period.

.O............O.
.O............O.
O.O..........O.O
.O............O.
.O............O.
..O...OOOO...O..
......OOOO......
..OOOO....OOOO..
................
....O......O....
.....OO..OO.....

:weld To join two or more still lifes or oscillators together. This is often done in order to fit the objects into a smaller space than would otherwise be possible. The simplest useful example is probably the integral sign, which can be considered as a pair of welded eater1s.

:Wheels, Life, and other Mathematical Amusements One of Martin Gardner's books (1983) that collects together material from his column in Scientific American. The last three chapters of this book contain all the Life stuff.

:why not (p2) Found by Dave Buckingham, July 1977.

...O...
...O.O.
.O.....
O.OOOOO
.O.....
...O.O.
...O...

:wick A stable or oscillating linearly repeating pattern that can be made to burn at one end. See fuse.

:wickstretcher A spaceship-like object which stretches a wick that is fixed at the other end. The wick here is assumed to be in some sense connected, otherwise most puffers would qualify as wickstretchers. The first example of a wickstretcher was found in October 1992 (front end by Hartmut Holzwart and back end by Dean Hickerson) and stretches ants at a speed of c/4. This is shown below with an improved back end found by Hickerson the following month.

.................OO..............................
.............OO....O.............................
............OOO.O................................
O.OO..OO...O...OOOO.O.O....OO.......OO...........
O....OO..O........O.OOO....O....OO.O..O.OO.O.....
O.OO....OO.OO....O...........O...O.O.OO.O.OO.....
......O.......O.............OO.....O..O.O...OO...
.....O.........O.O....OOO...O....O..O.O.OOO...O..
.....O.........O.O....OOO.OO.O..OO.O.O...O..OO.O.
......O.......O.............OO.O...OO....OO....O.
O.OO....OO.OO....O..........O........OO.O.O.OO.OO
O....OO..O........O.OOO........O...O...OO.O..O.O.
O.OO..OO...O...OOOO.O.O.......O.O...OO....O..O.O.
............OOO.O..............O.....O.OOO....O..
.............OO....O.................O.O.........
.................OO...................O..........
Diagonally moving c/4 and c/12 wickstretchers have also been built: see tubstretcher and linestretcher. In July 2000 Jason Summers constructed a c/2 wickstretcher, stretching a p50 traffic jam wick, based on an earlier (October 1994) pattern by Hickerson.

:wicktrailer Any extensible tagalong, that is, one which can be attached to the back of itself, as well as to the back of a spaceship. The number of generations which it takes for the tagalong to occur again in the same place is often called the period of the wicktrailer - this has little relation to the period of the tagalong units themselves.

:windmill (p4) Found by Dean Hickerson, November 1989.

...........O......
.........OO.O.....
.......OO.........
..........OO......
.......OOO........
..................
OOO...............
...OO..OOO.OO.....
..........OOOOOOO.
.OOOOOOO..........
.....OO.OOO..OO...
...............OOO
..................
........OOO.......
......OO..........
.........OO.......
.....O.OO.........
......O...........

:wing The following induction coil. This is generation 2 of block and glider.

.OO.
O..O
.O.O
..OO

:WinLifeSearch Jason Summers' GUI version of lifesrc for MS Windows. It is available from http://entropymine.com/jason/life/software/.

:Winning Ways A two-volume book (1982) by Elwyn Berlekamp, John Conway and Richard Guy on mathematical games. The last chapter of the second volume concerns Life, and outlines a proof of the existence of a universal constructor.

:with-the-grain grey ship A grey ship in which the region of density 1/2 consists of lines of ON cells lying parallel to the direction in which the spaceship moves. See also against-the-grain grey ship.

:WLS = WinLifeSearch

:worker bee (p9) Found by Dave Buckingham in 1972. Unlike the similar snacker this produces no sparks, and so is not very important. Like the snacker, the worker bee is extensible - it is, in fact, a finite version of the infinite oscillator which consists of six ON cells and two OFF cells alternating along a line. Note that Dean Hickerson's new snacker ends also work here.

OO............OO
.O............O.
.O.O........O.O.
..OO........OO..
................
.....OOOOOO.....
................
..OO........OO..
.O.O........O.O.
.O............O.
OO............OO

:W-pentomino Conway's name for the following pentomino, a common loaf predecessor.

O..
OO.
.OO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_x.htm0000644000175100001440000000674212156145314015722 00000000000000 Life Lexicon (X)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:x66 (c/2 orthogonally, p4) Found by Hartmut Holzwart, July 1992. Half of this can be escorted by a HWSS. The name refers to the fact that every cell (live or dead) has at most 6 live neighbours (in contrast to spaceships based on LWSS, MWSS or HWSS). In fact this spaceship was found by a search with this restriction.

..O......
OO.......
O..OOO..O
O....OOO.
.OOO..OO.
.........
.OOO..OO.
O....OOO.
O..OOO..O
OO.......
..O......

:Xlife A popular freeware Life program that runs under the X Window System. The main Life code was written by Jon Bennett, and the X code by Chuck Silvers.

:X-pentomino Conway's name for the following pentomino, a traffic light predecessor.

.O.
OOO
.O.

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_y.htm0000644000175100001440000000465412156145314015723 00000000000000 Life Lexicon (Y)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Y-pentomino Conway's name for the following pentomino, which rapidly dies.

..O.
OOOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/Lexicon/lex_z.htm0000644000175100001440000000607512156145314015723 00000000000000 Life Lexicon (Z)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Z-hexomino The following hexomino. The Z-hexomino features in the pentoad, and also in Achim's p144.

OO.
.O.
.O.
.OO

:Z-pentomino Conway's name for the following pentomino, which rapidly dies.

OO.
.O.
.OO

:zweiback (p30) An oscillator in which two HW volcanoes hassle a loaf. This was found by Mark Niemiec in February 1995 and is too big to show here.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/gui-ios/Help/about.gif0000644000175100001440000013617112156145314014271 00000000000000GIF89ayað1ÿÿÿ333!ÿ NETSCAPE2.0}!þGifBuilder 1.1!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷¾xÃý†Ä¢ñØ ‘̦óù»5”ЪõŠÚ"K„´› ‹ÇÌ­JhfHÉì¶ÛØM×`úúÏë=ñ©á^¸7HXø!˜@ågÈØèøW9‡øhyé3©ò€&è‰*Ê¢éP¸4ºÊz±ª’kGÛz‹›Hq:ÇË›,ü×2Ù9Œ|kKÌœºœMXê¬Û[]-­}I½íý­–!.A~fŽÎ®žÒÝï¸._?LMo¯¿Ï‘ÏÿïÎÔ8N š€öb<ƒ gó×ÁĆ +%zÕkFŠÿm‚ôŽÏÆŽ$+¨šf!„‘%[æPB–JY.kºR„ÊÂ9®ÚüirÅ12ùÛ 4i3f‘2õ"Ž¥Ò©ã^y:ÉtM$„N­˜XN(3°{p˜}*Ê—Z¯[ŽšfUYª¸®ú²#É–™­FñJ aUÛ±:¹@Íû±¯¦¶uÎ^û Ùq¸•qaIy²e´> ]œRJÏ^òÆÜ x.]p Ð ®%ö §ÖZ(#™ókŸ“éè\xsæà±I[>µ¬ÏðE‹?'^Jú/ã³s:¿Èó6RÕ¢«OÞøWaßË5n·ñð¶‘_þ°pÅ„¥_÷:>– äŸ¹ÿþ MWØì"Uuaav {=e0 J.•`9»°uTrtÂvÞsÖçÝy<)š€¿á—ÛJ'j‡^ˆš¸SÇiNW«ÝÈ ­)'>»Y04¦è¢f­ˆ—ò}XZ“ð5÷ã{Ðip™ƒÙã;‚‘’8~)áà})^&\ob"ItÎacæz‡]Z“RªØ!vê¸ÜYA‚Dçäù–ežµ˜æ¥š`.ZL¢²mè$—iŠh }é½Éç…„]xä¥-bF"‘SFúg”lަߓ£šÉ`™ZÖW ²Í7*¤¸¨inœRGi¤x†Ze‘›ÆÙ©°¥j)N­ÿú˜‘_aáhrT­3»FHеqÅj¥svE·žúq-AŽ’pk¦½rkª\±>:(•2Ê‘]ïZÈݘ,î)ª´íykŸ–Åq™dT˜ž)ðƒVzûÝFrG&—˫‚Ǫ¢¬i(¢ à¼ô¢3løR6¯¾Kl¤ùùúfe°Îº¿Á.©ò¤¶Ì2–ìÅô²¿<>¸”?öñO·9èvç>KƒŸâæ‚óÒ…”šÕ\5#ÙÐ28Ý.Ôûj}Å^X/Õ²~òØE³#önŒù'ô‚€®}ãI÷'¯GtÓS±AÌYjïÍÓs[`?„×=3¢Pž­øâ_†œŠä–ª o×&q¹Ñ)ñ¦ùkùÞy+3*l1é¥—Þ ƒ«/šáC‰¿®”Ô±LKûäåλa½ÿŽ‚í¸ûKÄ<ð÷æ|ç±WÞüT* ­zô “.¼õe3{vÙk¿ý@‚O·DWŸJ~E›ÿ«Sõé׺Ɇ"ý¾ÑybØ~ý{‰œtúïßùýOz3ù„ûx=”¬/×8ô=^œàï2fÁ Ê !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÚø‚Íì¶«N„ÅrôûŽÏoâq%±¤'8Hè ö'ˆhÐÕWøɶ¨¤8y`w¹ÉéäHé¥ÈPÕYjªcIe¸æ5©y ;ô÷):”*«» ”™S „É;,{H’úØšKÜì|ùÁœ&ý\mJ­êq(lÝ+ ¬í=NŒaNž®Þ»ÞNžì/ŽR?g<‚œï¯w/Ø¿ÕÂ!!ˆ°DÀ1 :œc_‰+j0È.ÛD+ÿ¹Züˆ¥€¡<‰¢FJBè‡2&WSV¦œ&3gHnùñirÔ9Dúb„Œ¨Œ\Š:m©R$7žK›"}ŠU(Ò>Ê2äS5¤U¯pu3ËÎ¥ •j¸Ò¤¨Ñ‚ÚžYr…Ö–îO½G[e:Øœ´@oEØÆ(³W†¡aí㽆;.¼ pÄ„[*ö)øðHÄ›o%sÈÇܺíh™å#˜ccÙ\ .û™U(œ&G®Ìy2NÜ„w™H3¨ÑÁ1Ï9zXü_åhŽª6㉠¿úxoÑÊ}].¿Ù;h¶/‘§Fÿžùyß_K[=¬[¼ÆbÛÿãîY€½7`Z8 aÃ\ RƒÑ_á˜\_æýáE¶Ý§ƒÖQÖ™_òÙŸyÈebfãM8âräµèFtpè`%ëU²k:¦ÀÒyîÁŠéâw?Á˜}BŠB~Ffƒd|/^ô¡nö"c•ÔmÍ’;~ Q\Ú=È^^õÙR!ˆ>™Þ‹Ò1H£dzù¨¦slJÙ^wZ™dw¤¥i¥„4Ö¨dn]‚‰è s}2ØŠ“Ñ9‰…æyÛƒs~Ö‰"JzØž&¦HiŸ‚hcBeYâu†–$̨g2él.†Jé›–šišWÊ e§©ú ªˆ¢Æ©)p¶qÖ+­eÿ± `˜¤ú*„—ÏâWAŽÛáŸyF”Ÿ´¥­¬‹yê‚«†–i§Þó›\íò:í‘Ön¹m¼ôÌ›(H®éšÉºÓ”ië«öþXç™®ª§œ¹n¾J¬Šâ ¬£7‚{/ÃLnyonü/¿o„o¾­-'TøRUi°LÂE¯Ä·+'¸$Ál(Ÿ»œëÁÐ÷.=;‡;#´ßZxi8]©&²S¹èÕ˜GóÃ-–ƒ6ñ¿„ܶŸÔu0ʘ±yä²$ÀZ=Ö¨a†r†d')yñ´D³{° ¦T[oÈò¯5fL7JS÷ÛóÇÔÊEtßEM*†?e´Rƒë­à͋뫶ä}µå¸öäî$ž&8–kz¬Cü9è;»7á©Cez]IÎtì­n´X³ßïNVé¼ÿ^­ïÀ'öð®³k<îØE“üï05ýNÑO?t©»o=õY…½MæÚ§ó<äSü÷9©]¾ù#ß›­úˆî[Ùqé»¶ª|5&ýMÕ¯iúÓÞ8®îD)V-~à=:ä€ÛÊü(ò ‚" ø(˜/š`°uùÛ ŸæÁº !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªU…$Ðíõ /irÔ,N«×L´"éEãìºýî±¹å†ìâ‡(8è°7aÈçG¸È¸¶…xyØx‰9$YÈ7C)•*Z÷Hé99šªúaJAwzÖº:K˲éùŠÚWÛëË{¡Û!Iü{LhœW¨ü׌ ñl++}}IA¬íÝØlý=.ÍM~Ž~Ó œÞ.(þF²îNß–_ŸŸ:‚«ÿÿ…Ÿ žùskÁ(Þâ°AD‡Æñ‚!'ÿ;–04‘™«HKÞòjN'¥LºüHÒÙ®™Åb²ë÷ äKŠ–$¶¢£³ÒΡÓôÔìÃͨHšƒmTÑcfüA´ù4ëÆIRAùˆ‹Â•Ã,îBYÚhz.¢\Ë•iN·WY9ÕZË«8m—l¹a”}× ³Ö\°`ÞԢ԰߃5?–x9°e¹%›R†F1ÆDèÞ š¯AY~z:KzWìÔ¸*ÏfFF¦F-gãw^úB¡hjV™Tj)Ófƒ²Yž›¢õ&˜âAig‹yž2Zsdž^ú¾v'ºñý .yßã²ï–?>þÉ®pH€Ÿ½ñ“¹Ìî€PÑßþˆ:¶-‚•ûW÷À ÚŽ[ì  !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·ÜÙÕºvÇärôÛ¨ZÍì¶ÛD'nâ·ýŽ©ç89‚ž(88QWsà÷甈HèøHXg¨Ây‰I5ĸ±‡x5™):Ê"Úxöv Hú «qzˆ*Âi›«+cª×´ l2AlÀ)œ¬LaÌ@ܼ-}D-}=ÖƒŒÝí=¢ý-.´:Žþ ýÅîmÿN8ŸZŸ¯ó|oÑñOŸÀå| <˜%TÀ9x!|ø¢„…… ZŒ(g’ÂUÿv¼²jÖ>Ò ‰r7‰ž‘0™òâ¢4íî±<– f̃ž>©rv“IK :w>”´©ç1¥ …v(h4*GE¦”º¢¹æ)T©\ùl–ÓZ|&šò³9œXÚ.Së–ª¢¬”ú¹$Ë!h×q‘6ËT"»j¥e ´ØÜDp§Î2,´äá¶dYqÜ5Œk†‹9Èʼn?ÑÓCï^ˆ†.ó©¼Y. P˜gRöl`Km`&î›Ò/Ð8[~Ì08-ØÀ{ß¾ ùäî¡Tû´ö»Ô÷뢨!Û&~Z4VTΙkÄý{²Zã©“ÿ<½ùhðµÏ·ßhpÙ¹ù[ÿÕšY²Õx£áw WTÒtÞ— fâ%ZR^õ’u¿ˆ× rû±U^|ö•‡\P¹"|XÉמyÌlxÎ_`÷Ùq·ZŽÙ˜…²x÷Ot~øœc"fÖbÚØÔ{ºy8܈óÉ‚žpÒa!X•¦±çÓÿ馗§}I`}M·”SVyâŠóÕÆL€ÏÉ \iÉ9#‰ENyf”<úØc“ÅÍå–)ªf¢;ÀDŒszVç‘Ëñéœ:JœkW¦‡džoîÙbrf hYeYhšhnšÓ¨‡žéŠR†šäpqbš¢¦wJ*ªŠ•‚jdŸB:Z*iL b‘UÿQG‡iH„j¤îê& ’TÕ¥©1IæT~rø§‚8^Kì§f«›´ˆÚ´¤©èò ÃM—1;®¢)!µžFmèçw‡>« ·½bI§zU;‘¥™¾«&“ïÙ'tú¦*}ßÜpÀ A<ÒÁßùWT·öît]2B‰¡®ù‹2:骭r¦äÌÌQk§°1[̃¯–q±€ÖW2rÖ5®º#dÝ-b¼[½Z‚3(ÐÀ˜©´#o’UÊ)w9uír‘¯Õ»`-u[C-óÊ41üaÚK TX/NsÞÜz_Ëð×`LåÞs]rã\AÖ‚ËTIa*þäâ{­”‘SÀ ¹äQ} «˜þX¨¹QœjÒBr‡~µM˜ J5ê1©¾zì®Ïvà¶Ð&Ž!ãžûK¼ÿ®±š,ñ<ê+cñÊ'®Äò³Cþ¢óšÇ;ÅÒ'zù‚×ã.õéÛóåý÷Ó'_Šø‚‡½ùïü“é«o‘³/¾: :ÇQøõ_}«„5‰¼?ž ..V¡_I&’SY W— È@™¼Íl~‹ààüS; O!¶Ñ ðÇ:Ò€"ä+ôWÂJ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªÕ—\³(÷ ‹•´H™ñ«×ì& °}åyûŽÏwäóú[û§'8HÈqgg UÈØ8x¨•e·èx‰i”¨ˆ(™–* 39± eæ9ÊÚZq*™K—héz‹›:³Rç› l2Yª°*œ¬üʻ쮸NŽ.z.’´žþ^ElÌ_âîþ oßÿ‹“¿wÌ­H0!cóÞS‘T$SûR4ü1#¾/ÿ\æ™ HO£Èl°¶‰ÌEDfЬL ó„—/á8ÜC'¦NSÈhí éÔÁDUQsÈfŸŠ:u0 (@VÍù4«Ír'§bôz¬d%¨YbõPG YA[Ô>kë«”§v|ÈþìQS+9¹GYVý;\‰7~~ÁE3«l]™ídÉ[ZÃ7Ãî²8`âÊÔr†ê6.Ó»>c)º’سXô:UŠðçž!Ò†kÚçL»XËqÜç³åɸ!÷¥º‹pÍÀ'ú¦L¹0cÒ[9åÈQwÒµdoÿ†¾´%òÞF{nŒœ¸Û¤—u‘ß¾sðø¨Š‹6®¼}õûº©Ûÿú”—,´M$Í eQàU<%×”7·uú‰Wàrræ•bô}ãS’YØtw™7ßsW("ƒ¡U´a9ø½7bsÕÔÑ‹6ñÝi\¡èZ:\§\TIw‘긢c22w§=7]’ºè\y䆨…ü±H¥\5rÈb†ÈÚ€¯t˜Ÿ}.FiY›Rfib]’e~çeÉ&–U6ùÝœèµeä¨äiãž1¦HæNŽÉ¨!ÜÙv`‰¶ød‰Vòé‚t$›pZ _œˆJ^ ó‘ º¨æ Š¢ùži‚¦*ª´fº`Pëièi}µ&'ªžé1gª–p¡*¥¥ÿIÉë«(6K!^ùŒVä‹®iÔ¤xî൱Ñ’ÀJ[èˆuZ‘·$Lv&¥Åš{ƒTJ®šm£ön«^(k¤¸¶ª „±ú¥¡}á9y[h›R{d©rFÊéÁEö¹« GhÝÃvfV«¬†ÉÕ½zÍ*•™ˆ{å Zi~+Lð“07­¤æ¡ÖpÅÂÌž>—Ël´AâèåÇ´˜l²€"EWŽ‘ È8¯Ë±ºŒhl5!ÞYÜæÂ²é'5 €‚+ Öa¯±5ºd>­ÚÔG/ 7„Fv/¶¨·=s勘`Çõ‹wÞ{õmw8g-xd«xÖ‡‰?õÉ_N°¦¬ÃAŽÒJ*Ÿô { b>l8讜39¥›ÎJÖŽ×v9ëc¾þìO…½ºí:]ܹ«ºÃ-ÔçÿΨŸîåN|èkù|ó ] òÎë}BêÓÛøÓ×ç-ýövï}V•[~ø¸”T½Ëæ‹I{äâ®â¾÷-?üÖOùûT•o뱫2è §âK-’F@¦ý pßI`ñèÒú90# ÙÂ%8A ^ƒdšjØÁ{5ÐX!LáJø»ÿ p…0(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjYK UQ nÇärTì˜RÑæ¶û]þ²©^¸ýŽ'©â9Ÿ(8ØðÅ`èw–HØèøÈƸfø×õx‰G9Ãø#™ Ú³IA fêõ)ºÊ‚º!'éÙJ[û ªòúg€k뛉x»¢ËKü{ìhÌ›¢«Œü $|á¼}¶›ÍÝR]ªè=n>JŽÞÔœ›fnOæ±oß6¯Ä“ï¯× ' ÿd7¡Þ‰^.<”0œ6j+Æ`¸ÍBA‹ÿwô’3cÇ‘JDJÔ$É•!˜ì·QË™¥Ö!Ú‹ZL4{œ&íe;}:œƒQq'¾3 µÐÍIRû "²hÔ­Å*bZç–1•8 bµ¦õŽ•µO‘±•öiVX¯%Éf<é#-×ZHAF+´mW:kðdéí¡±»)ntñÜ}‘é%F Ylã«‚e¾Âʹ²KÌp?[nÂ’ã±òåÈNëQ>ᙣ°¸˜Tš*NÔ«¨£lª«iÜŽV-@×Öy¥´÷éP…,‰mÔ®£\õX®¼cŠ'+ª”è~ÜŽ—¤µ•"<s㚚隘½éÎnÓkío‰‡®~ûÖok‡å«oC8Åb§erA p³óÒjàÅ[LZÚº7l²©ŒÇôñzž–gÜ–Æ8F,²§;Òùì» –ìžH ŒmZŒMò HgˆÏú'f\ ­|ÖÞâ#¨Â¬xÝ›¯fÛ»ÝAMwÒ ÃÕ$puï­Ó¤Sµ3Ygó=c‡m]Ⱦ/‚Mëé«¡Œ3®Ô–¦Â >yÔO ¹sæžëô¨u×¹Òùç&ÔbJ‘›.Û·Ù²ÞèÒä‹9ìäØU¶Ôn{: 9Ý{ÝEæ¼ç1É®{îÅÓ´“’ª/ß“¦NéÅ;ô|åV½õÂs¡=áÙgß=ªz5(¥4˼úÁµ¬EÃÜ´Ih‰ÜŸÜÞ¢Rk‡šHEs¤ÎMÛbêWpáíí“Dî°aaj‘ò·ž35H•MFüÐÏߘ#—âDù.Ù[6ƒ¬<ú›ç?¯…^|š´:ÉÿÂj5!xpÄÖW%—ÎÝÔí-ÓxKÆy™tlÍt3w¶«¹a½ÔךKb®<³]Ö¨×>œtjMèëc¶žJøêg¸¾oÿý:ãøËŸm>xäÕé«ÿÅžÜjHa§_Káù–jaÄ‚\`4PSÞZ{œY¸9+gà…*¢ufçWOZ ÷xª‰hÔ{Ÿù køE’ qº¨â‹ó¨c„³ôô£ˆªt¡ Zº)GlÅq'[:S-Xa‹÷UãŽ2æ†"‡ÞÙ‹·ÅH¥†É)sOþ}Y¢QÝÁ„’nFI]V;™µÝx£%¦$Žx8 „4ÝU—îmé%;|Ny¡‰Ú9a~wê5Y¡ÿé™'"¾‰)Q\jÊ¢3JЦ ÅÙŸétt]P¬ÇØóò‹®¬rþ™cüw®þŽ{]ž o_Æ Â~M￲-)^ÿ æ¡×/‘Á… ½U×0b†„í.P,¥J¢F}ÿÝýÁøm£H€Ilíëi¤Êrò4¡¬÷°ÚÊ™°XíÈG3§.w-§¼Ô 4¿*&kåøt#"/¥™4ê k§¦U*é´¢Ô­–“ÔT¡Ã±$c¦²‚ÚŒiá¬õ6 UJ0ÑlW[®ËªÊ±6BQ¡FëŠõ(—¨Ó¯JVÙÄÈ­ñÙŒXÏý},ÐðbÇŠ!á|‹™¬O_¤èLšK‹\Ë>qgìå Ž5ت‚-KÖÜ4e_µ‰Aþ8Øånß…u»6ôwïàx‡cÕ 74îÃYUYMM½³öçPùw¾=çÌŒ§+nžî÷ÉÇ›|ö¼úæéC¿ƒÞ2¹RMoÓÿíî߯ÉEß ;eæš0ï)¸_9àTÙ& &(L`juXh¨5 GðVyÀq†^yCµöblUÄÜfî™WK>ý3#Œ²áWk°í¨ŽñyÇLŒ/®¡œ~-zBF |GŸ‰:ÉÛXÒ! ¥‹DþçA‡<~ÉÇ–r$YŠáQÙžˆ/šˆßN€±wYub6Yßdk–鿇BrÙ]vÃ]ù¤‘+*ø’Ž`ª‡vÆùT–X zçynþµâ†}ŽV"‹IÚ™à)Ö=–‰›Ô(%§š^ÔÅ ‰5ú\”#FZX§”ÂYå¥DfºÜ¦f®©'¨Šú©¯îJ Z^êò+ŠqÿL´ ƒBʧ~ÑŽ·Žœ¢ê)LÂò°ç¤ª1ÊÓ€Í,ùj«µšË-ç’舾«â˜Óv†Tª¦&'í“øÅy¦æÙ¯¥¬Ž†$À³‡¹¼.z¸Ö>]ÃÛ!¬W­{âÂŽlÔy¦Þ:k¾ÊíKÚ  ŸÉ`¿Ä‰6§ˆŸü)¦S2œ\¶ñ 43`ß«°'Lɲ1ÇÁ0uh`õ€ÒZÝ&ƒrÆŒôäœ^áÖ.v0ãàtÖËH,õ"T3™ôYüæ5äÐF#ê#X‹†DBE¯NÛ£ôªtï]¡kiîÌwàâ­ÆÊ*Ì-¸2Ðþj+Ä'žSÞò®+!…¸sŒÜ…Q{9æèìxç`R„¶è¦'ê˨Ÿþn³TÖ™⬫Sú!”Ï›ë¶kŽûŽÔûè*ʼF…ò^<äÇ¿îlò35Ý8óÎK™!M¯¾¡‰}ç2qA|÷ð†-þ;sƒ~ù¡d\}¸é«¿þÍ&ûD>üð\¼5磾oÿ+’«K?þõï~Û VýH“cuA€ŒM×À½Å ŒàB&2 z¯v\;<Ó€p„;(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ†^™ñ8 ËÕírû`ǯçü¾Ÿãæ¶ ¨Gøwˆ˜ˆ§‘Ö¨)é±WWó8©¹©“™9X×àôÉYjšcF)jóHv ‹²ôiG(dŠ%ËÛ»‘ú¼ê ìk|¬;KZŒÜÌKê’뚭Ѹ#‡å; S ´+©‹‰óÂL=Œæü™…1 Dáìl•*¶šE›2zó.éÑ Ijtе-1BµLÆ2«X@—\îBê)eÕ÷0Q=Ûì†Ü·Îæb i‹k^Q_wôëM)TªxÓ²ÄÅóÃÃ6yÞ¢KÌ-ßVÙÚî²Ë8r¨Çpµæ|ïí܇75h«W+S×*f Ø ½ƒYKµ…qçwa'—L)™5eU»SSÆL8O1ÒwŠÿ¬òdäw1E×:ôŽ0É#ˤýka±tÞ…ÿ. ½2z×6ïúrïôÏÑ·¯î¾yÅ싘ÉÿÝ –u|½B‚%¡]³‚ ^…ƒâ<qjFÎM:W•Je½‡K%€3^vÀ57"}l`¸Y:_ÙõÒy™H¢}Ó…æ5¢HF ´^l>ª œjkÁÖÚqË#v0º¸_Ç•F“"jšŒ¡˜Ø‰ý©…£€õåG^T¯Áöc™Yê‡Ô˜÷…‰¦Yl²HåzO*ÈU{;j)!žò½('œJž(àm¾'—/•¸æ|D’if£Pz"\œ5y¢JªŽ¡{j:)••Î×gˆÓj$X%5y—–úyè©=QǦ«3ª÷ç¥sVX§|‚Ê*\•|ÚÊjœ1æhª¨ohxãªÆÿ÷MËH 1wåN¶´+…Ö·JE*d«=+ަªd Š“—i—ù-g.*¢…KI³(9Šï€.ÝÂh!‰R«m’ªF’[ð»íW "Ç/–½Þ70´¼fsnŹޯi^ôŽÁh‘ùÆ4)§`Ú&qx¨Íz±››–êÅÌNËÞžšç°»È1³BÌ‘w½e\êÆâ·¥VýÆ:rFžÙŸ~]œòƒdá§.$/‡Ã'S=œ¹GH)=g­ÈÖÓx ð×t}\o…7íãuâÅ´ÛáÑ]¦ÝH¦– žò=V¼þ:wãà„Çv›Å@.Îx-ÏF yå*¾/…ó„YrmùB‰ŸÕ]yhwþÑèÑrNzN¨»·zêM/l•…®ó½°éh¶>;?>…œyî€á.·ïfÂ>‹ðî~ðÆŸ³RÕV/¯:ºE ½£Kó^ýOÄ3Œcöù6ŸTïy‘í‚ç¦<ù±¤Ÿ)ûêŸb>Øú¾Tëþ±K?N&× üù¿~¤Zý+SC·H;x©„l¤[ãâ×@“HEoŒà÷\, vÎÒ ðÜçÁúA0„Ç« Oˆƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇQ@Óòçú·uÝ ‡Ä¢ËÆøŒÌ¦ó9D.~€%ôŠÍjYÖj7¡ÜŠÇä«TÑ=#¨å¶û]<«§_°ŽÏë?õê¬À¶7HXØöð5fèøˆ·(ˆF险)d ÑY™Ô¸9Jº‡9è XÊÚzò‰†!Iëj{K![²¤‹û;X;!l ¨º«ê ¼LÚ©|ÈKÌ<%ˆ˜cM½Íô<œ¢Í-^&ý>³v>¾^œúÍ÷ÊNOX¾VŸ¯=™Í¸6ê„S§à±ƒ ¡xëWL!>y +ò’E1ÆC‰ÿ;ÒÆ‘ƒ”{Kòñ&ñ!:“,oôºv!ä™-k 7NF›<³){é®Xb4{7S¥<¥E:M—.Í*Œ3ŸZ!G‘(|?›^ýª!kB w"žJµ¬X6¬¸åöÖ\jq{«•ÑY;9ÿ…õáì-5„ EúñO{¡z‚º(.LgvQÍU\÷0âÄÿ"k^HYíD’™}ÕÊz™kŸ9¨õ¦NeNéÐÀ‚é­3öu®¶;; „2èáÓduzÖ Š·Ü·‘Ù:³ƒzèãÄ—¿s&?ØÄG®®+U4䉀‹ûM$ܺ'ó¸Å__ý}ePÚ^9øçÄ™ý´ÿÕßvBwÙwÐÁÝå%ˆŒb½qæ }“<‡V…mÖ`€®tá~èýány™ÕØI‚¶¡dîägYu¦¹‡âc÷ÉÈâ..®xÜá‡#yfùx ƒµ IÄY¬…x’%ÿièØ{“õh#fê(W*òS£t˜ý%$Œ Á%ØÞ’I‰& dyæˆ Ò×Þ;7·d9óÉ'Zv:ex¥}.egjÌÝéezŠå–êA$•L²¥ )AŒ©¨§˜-*:YeÊq]koÎCtº› Z)¨‹8gŸ1"(•…Žz)RÆwSžº $¨cŠšé¢˜îš'€O¢Âª¢®ÿbéÝ£•ÇTSR˜VÎF”ëyLòpš€`Vð[“¯ê`f©/zz̵Ñt™”ØË­‡è–‰¨,´EÊ^½¾Û¼fˆ!žåâÚ½Ô)ð¿Ÿî©e†•{Ê;ªëW˜ÂJô«.¾&­©1YK«’o›p±ê¹:0¸¤ Ûî¾pÞçðŒƒÇ%ÄãvI‰¦Bë|¤‚ÿu{bX÷Š,N³7«s‡kU8ô6C‡lHÎêè–VÔ‚ÆXgñ·¶h]¸Ø¬#Ëì2}a|ÅÊ%ÜpÙ(z±Õ´Ýq¯××»Úö“ßDN5£n©ª}°áµu¥™±à:Ny,±À­iYåšc%aÀ›þtãÞšó`æ ç›µÊxzë öëzìÞÊN»Ô׎»íäýaîh²UzÝKû^éðÌFüï2–¼UÌ#öuµÍ;¸•ÓØð×¼PáÛkš÷&hÿý#À Þûºå3ôâño9ùëõLÔó‹œöG¼ßßSýÎíÏ¿}ü/h%  ò‚78ÕÈÏ€)à%ÈÀÃ1KeŒ Kf± ‚ƒÔàݺf(Rq"¬]XÂ. !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íò›Ñœë÷üïl—à&¸Ögxˆ¨¢(t5xð˜(99ŨIdIéùI“9ÑÙ¸ F šªZ‚ê‘yʘ·:KY×ÀY»»Ûá‹ÅF!êÌ{¼Ú)*(\±ŒeŒ,Ûl-Q9Ímø<ªíìüÝ]®¬nήê«| Ô>O_¿¡^¯¯GŽÒ*ÖoŸ@5Ã0äÃ60¡™wBº§0â–€þ8´'1ãÄ/ÿ ÿiüØâ"Ç ð‚4`Žº¢[ºíFdJ¸„(zÅ@h~)Š·b é_†?Θ”e×PŒw\y>R7ÌT.v$Y‘jbHÞˆ$ù&c“Abù$ŽÛ•™Þ|p²)§IðUäå”f¢c&|KjueŸ¨…™%ŽNŠ™(>i®I醭'.¢Øbsw®ch{FšÚ–J¹Ü xÆ]žQ¶'[uüÑ é‹­ñ_ŠQrÙÞ§†úÖ¨–ŠÝ©žÒ*™‡ÿÖçg²öô8+§ºVJ¸ÂX•Óu™íOïi%jZ •ˆ2à¤ãœ©¥5º«îªo¢º,»6Æk![Ñš‹n¥þžŠ ¸“ñ{Û¹|’Kf«pΧ\½¿ª*ªÀÙÌvŒ2̨óbìŸÄ¤’jqÇãð£Õ&xáaøþ[Ï«õ56XÆ—F—g¸†¬ñs4k ±´97›rÄ"ßLòÎsél/ŠÆ)²d½z>ÂØ‹£’ÛÊ,w¬Ë†W0ÐÖ’T´½½ˆLð!MË,ŽmcÙµu½ÅvÙf“mõD!Ϧ¨°=ÄõÕ~<'ÚSœv y­`]Oxxã¬!è ýî8âÅÑ…ÊdˆVžØÞ¬vóMœå¦zAŽúƒŒCù¸©[ÅoI¬¼Nú_4þqî´ûÝ¡»ÿ~4îÀo»×Ä0ã#!ÿ7pƒë.9ó•bKܰÒÃnýäãyýn¡COW÷jR/ºøµ¯¼ù‡§¶ú´ËÞúyî³ä¼ëhy<D¾'¯¡˜uço6q¯]¬R¤#·:倎I [¦(áHå©{ÍÚ†* bC›×4È}Ѐ±ðÙ+Xž žsPY!ðJçBâ5á1¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ›KªôŠÍjAJHWnÇä2ô[ƒÕæ¶ûíD«Ø&ŽÏë1ì;  ·GXhx1øôàwøy¤(áXçgW©¹9“Ù¸6É9Júé5á9áÈXêúšñ•j1+È ›[Êû&j©+L Ì#Æ´<¼ YËKQ»èpÍl5[);Ý }ý .ø×ˆn~NY}RŒÞþȾ ¾êN¿Û TŸ,ϯðÊ6BD ˆ0г :ŒSμòZü·£âÅÿ5ÒâV‡£H…ž“üXEè9kŠõ6Öòh{sìÃ5·æÃ¡t36¬2Þ1ÙUfKë\²0]¸µžÎL4òU6—KíŒZõ8x‘¯½ËÛXcÒªn&7þ˜NdÍF¡V¼[»yÇÒÕ§ìþºýÍÁMÓÿï¿VèÉG;D¡tY‚ò— F4TÞ‚Ù1˜R…÷¸Û6‚ x.¿EGJçÕ·Ø€ÇñÒÓz ÎbqÓñGb9Ü%6£‰®-¶a\zùe[8éßj´5f zÙ˜š‹ûXQ{"96¾'Úˆ¨!”þµHÙ’O†Gå'µùHæG¾µ"¦‡ ‰¥pHòvã¿dÆ¡hY¢Õ&^!:)g•ú‡–oZ†Ù •¥¥¤&cYf£ü†{^¸§rЄi]ZvYbIòÅ祣1‡é~’ÝA¨v†æ©*ŠšF‰§Nzj¥×‰:'fšêæ‹R2yèž~Þ˜Ô¦½ªV㪟ÿ¶ºˆk>ˆ¦cCŒéƒâÅ’ Y ªÔ‚‹¦÷ŸÄ⊢¶ä| „MÐN sBêÀjR϶+¦£ö>[‡Â–fµ²¨gùZMœùíjg|"þ™k¦F¾ylišðŠ®2|$©ï;ÈrF΋-÷"ô]±Ñ¢/DùïÁ¥J|ḴTeļ2JçÄÇÔÄ…æüYÅò¶ã¢.é ø<·˜¥ ï r‚f~x1‰×,-lx3n›š*Â-¥Ö”'„ª”“wûùæ}«¹èN£ë¯éª¿äùê®SEÞS¾®·¿ZK{îøÂ®ûÜ¢â]zïJm%«ðÆïþ%>ÇÆrä-Ï<ñLCVó9Oý5Öm·WÝg?„† ¾>M‹üZù|ˆêNÂÛ¾Ïy쩤:Òôo„y¾ ³†½ý 7åÙãبIH YýC Lw@öè¸ÛN%ȹÁ]ƒLC9øn„á! —‚‰ª°!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍj_¶ibÜŠÇd¨WVTËì¶»ÝM×ïºý>’3Έ%þè çñÃ'ˆ˜ÈF83xp”ĨHY‰2i B×Ç„i z’ö™Ñ¡é'ºÊêèŠÚG’*ÙZ[«ÙSš¹kë{÷I 3Ź×û‹ 7qlUûš-­ôõÀL!w=½M‰û<ªÍ-.ÈŒ>®œÞ쳈ëm,ow~ÙÛŽïŸÕZ¹±Ð£°ª„rÁæ0b¨tÇ„5úÀP¢Æÿ=Z¶1äbT.u‚(2%—ƒ%1¢³¦2¦oždÚEË1=„:æ²Àò¦P„“Hvâ Ê¡Lf3ŒNO“›Z]FÊ‹*5FÅùv5ìÊ£\Fš·+¡Ow¹‚¸åö¶ÙÚ|™êÅšµ¬NkS“š+ö×™*_?¢å«FobŒ’Òž<1¦Æ-Ë’[ ­…:f[ræ‹q;·Dì´áÏŠÏz•waˆ»UòtË©ëO4—KxbðYÚÞÁE«.~¹ô÷x†u<µñá˜1S^Üü´ÝÏHyÝž#·ÅÙ×aj®J}²iô²s*‡\jÞóÍ£‘WnŸùmy°çÇÿ:Q­-·YàL†Íx²q¤TvØ]ÐÏ@ýi·YE^T† fèx©yÝ_æQÇ^…!¶ÕWzÞ 5ÂA§Þr%J6HŽX Ž'îÇÞS±yG[mB Q“Ž}E|/šãtíµ““ƒõU7b2懟)SÖó :6™"t­éV™Cžé’‡guDRŒcnYÜ“m%H –œQ¨&-ú§"•Yöhšq\šµŒYîéJ6(’‡f£9øIŸ‹¥'g”r–h_’…I߉Ò%G§¢^fŠgœ%}y(œ.*J™™ ij¥“LVJ“é÷#õÈZ¥­~Îúâ~‚ÆêªÀ"ºjŽ~ÿle ‹Dù¡/I¥…Ìm¨‹–ƒv¨KÈÆÀã¥ÅæJ ´&XŠÕޤnš­§ÑvåCæ:Ц…¸‰|&NZèÊ®¯ÿ®+­•ü¶z«=ÕÊàÀ‹F[j—«-ª•ÂWþºĆÉ2/½¶ X1€¸‘‡¤‚bú0/Õ!pÃXª ‰Ï!¼$®¦Nû‚1‹©,Å ºÛw×]#1Œz\¹[Bå×¹†¶ìKÉG-uÇxr–UQAña5„ýöFÕ`Ã!v·yªŒÓZït²»H )•0 ƒh°É<¿íè`L‡h&¬Mã}¦t+©/à†£©«në*æØ‡¯C“‘Ž/þ¸Md»B;¹¨•3Õ·‹ûú¶ySVë£jš¡ ¥–y§¯¾êö°:éwÃN{ƒ¶|{íõ­—ì]ë>$?„OüëÅ_ðäÈŸ^1¶y,7‡‚½XvÿŽÆÕ[?’ôÛ‡u¡éS?Tøy(O~%`kcYú!ɾÔLî¿o̼Í/’ïnZË×ïø#CFd-cÿ‹ƒNE¹‚wdñŸ-ç¼£ ï)72 ƒµ+a§¸vpƒ",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰6Aʶî ÇòŒöJçúÎ÷¾xÃý†Ä¢ñ販7¤ó ›*ªôŠÍjAÖ*#(ÜŠÇd¨rqf†ݲû w¦½ßvüŽÏ‡ÖµÃ<¤'8(È÷ñè`HØè¨Å¸ô`ç§ùˆ™Ùry99Aéª9JÊÕÙ™±†˜¸(Zú Û×Z™ãª‹›Ë´(+Šáj°ªK¬û+Ü;ò;\ÜLÊ,í<Ýx¼qjÝ—MÍÝÆû™ì=þȼ-$M¶MÞ.†í›zÌî^—m½®nϯ™–Þ/ @4ôì§/ÞÁ…ä î’„Œ¡ÄÙ8ütJ\‹ÿ;b´¢ ŽK^[¦Qä ’&[Ê#¨ÜH–.]J«¨PÊ4kÚdI)£²>‹úJ-„žF›R…nÎ:¦ÒrеBR¥KÙ…ŒÀ4«Ç9mʆ’ÊiZOWy*Á×[܇añÌEë¡,Ÿ¨Á¶ÂËÔªX„PY5¯k ¥ëð²‰8Iê¬UsÒÈ YÇ:²Í¬æ›g°˜‘%¼q´6lqýi,8‘¡°±›ÜkX˜-Ö‹QÒ)­4eÈ“%_ÞEY3§Î¾…Ï&îå®iÎDS«¤.)R0¹¯ ®«[ó,ZËŒS®ú¼qéÉ_‡þ~jôå·Æ.ߢÌé¤ÓÏÿ·ã—rùq :_¹‡ZNãÅ—Šø,(šeÆÔ_[KX_²uf ô%\dþ…Úc#²rÚT•íwÜgʼnVŸsû¤J‰.F÷Üh¯eV›m>N±™~ÕtËoÖ…8Ù‹&ÆèÐ[ гbvJ2‡ÚEQReb%4Ú‡"‡’öøc™ vÇÕQè@H"yUV‰>Ô±×X„q(&ƒL¶ø¦,qÖ™åPÚNŒyªwÜåž™Ž:hʺêfppv‰!Y¥(Ž0ö·ç•IúÙ% xFß–'Îw¨”«•ÚæIk—£¡´bú‘¦—qzªzŸ~*—úÕ&¡è‰¸–ª¶ÿŠêª–hQ‘fdâÑãigQm>¦"øƒ•”J Ìr«Æð–Wø½+/d*c^¦S~;l£gšË–†ûh¾×†wäFëfØ©½¤¤tþ•K$®tö° n"¬ëÂÃVµÞ¦sŠËÖcÏi1¼Ìvèo¯‹îñ¯¾%íUØa]É;ò¸“.É_ÁÀÍv®e ׫Ã#\é}0yk¼•Þkç«ü§E)Ÿ·CÉ&ôkaÂ*"ÃJÉ37I;­ÇÑ\wÍ7•7µ‡1ËûÆÖh—á5PK§«c´Ò>M7·Još[uÓm¿cz7°{‹Õò†£*(¸Žƒ?Zä—†8Ñ‹g5öÛBÂOŽù r'~Hæ„+GÏÚžÿø5ƒ%8zK%c|Ó5©{þàà¾nê`#N{îYš£{ïCù< ¶ãÞpð°GE¡ÝÆùòΛ^¡Ë =_·èŽS¯ï¾>]¡ÛÀÍ>ïúõMŸ¿G»¯ï¯|ÆÚ»‰ X0ᨃØ*|øŒƒ/‡µàA¼L8ÿÐ6büè­ß¹_srx‰Ò µ2›A h¨dÊ™_œ˜&Í™+e’¤ GçΡ>Ðñ9iÑœK¢LMg) ŸšüšZ…ƒ«R0E}ªZZñªØ^¸˜AhÖåF¯²–¸ÕöV¦Ð@qYÍ%›U2V*/Üòwl²7„å%-»Ê죿È,zA·/:»R}•k²Í¬]WÖÜÙòËÌ©îm>$ZoZŸtrŒjê˜ ¶‚1z])5ê^AGôŒgX±nÔ¡…»&Ýõ˜QSÃÑx&ùy)ÇÄ.öêÉTn?Ý < oÓ]‚_½9g¾˜K&?}Öv²ÅÏ“voÝ9üʪ§ªÿ Va±ýtŠx„†U‚ñ]5„ Nè_?ÒI¸`¹m8ÉY´)x__òÙÜW†gÔI‘¸bƒÿåÇœqôANo5^à‰š˜TcµýHÆH£UÓÍ{#n†Þgç9”‹ˆúYK’:"éà…à1×ßRê7_„&ñ%b¥a‡a–õ"˜1’(e ÁHnוùdˆ¿ ØV½áÇcŸ`åU'ŸZ’Øb”ÎhcÉhHDZÙ¡Ÿv–ˆg“K®)h¤s–'ižw^Z(}\~%g œ.Öé”’Mj¨v¤Ê#xª**’n:ÕgœBšªf}ƒÚê)•kæ¨)¯¢z£zÄÿ±ú©« y=|(­3Q0)Юîð –t¦êªÊj£ž)jÛà™!Xz`š¥Rºè¡ÚÄRb€:o£Lywïn‹R"Ü”nŽDnĶ{fïnª¦Žˆš§0dì…ÛÞ[W» ³cº1­¸^i¦º€å«ï?üÞ›-ÉSxdÇ‘,1¸Â|ª±ërÅÕõZ¥Î¦í–Ưr<´'/ew*“\ò:õv”H²§(y0@C‹ŒÇÃ2“r³€ÈÂqt —;ØÕL¡5Ö¢µ¦­ád»cÓ ¨o"¾s¶Ü Ñ­ N²e€®Þ?®V«‹ßž·àóÀ†˜“€[«xmE2œŽ£îÂD.ØÄå…Í0æžø·_'Tþù¾gCXºç‰nsê@Ý0Æ»Þ4éŸN;æ«çλej÷<»ïºíI|îcùæñÉïðÏóäÃôzKo}éáž}æþ öÝ[Ííïãûád‚-þùÂ,÷=§£™ï>>4²î-§_+m-±jÏêŽé‡^¿Žö¹:H‡ Â{ì: óO¤3 =D|ˆŠ|ÿ\ˆeü8ÂÔ! -f¨2¥!OÎã‚R¥Ì^«ÌL23ç‘’*¸ñ¥ODÁñu¬T/¡“n}ª‡K{ÜQ'šþ‰j6 räj¥j•igªV¦ZcžRšzÙx¾~¹—­ÿò×b¬Æöªª¶Fz ¥žWqª¹D„¶Þ@报¹yù(šJk­v˜k‡2r®cg†ûão欫Cº3R ¤Ä‹én†› ¥j,µØq7g»œÎç®ÃàK­¨;ùj² ^ÇÓÞI'€®êÚÀˆ½)®µ“õ&˜¶œ#.ps)òžÿ5ì-Äõú{%~ ã§ÆìÜ,±Ÿù5ö³Å…й´‚­ýŠPœ1¯¼Á)ÞFQeS+¶´Ã¸Üêµ,Io=$¢fyâÌÈšT3Ùc€ 0]pìtšàFäËUTï}\ÙøÂ‰°SqóQ&èEUîN„ür‰d†¸xä;V”6 ƒÉKn6*[\œ™˜G˜‡›ýùL÷V%–k—^¸6V 9ë„ë–Õ nËŽ{>Ãí»¿ÃyÏ!ýNuåG§N|›¸òÙNò˜_¾’ó «+ýôQ«^ýïÿ š=îâøÞ½ìà‡¿Õò‰;8>ùÓø’è¿e«?˜èž ù¤ÿ‹¶€õÇß”ˆDîÏ&ƒÀ&vKI £ªPJeÔ >8c®Ñ5Ðtô"ô&¨Jä‚Ì`¿4ØAÉuå`!ÜÉ$XÂÅ‘0…ák _èƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·\ö¡¬Z»ä²YvPã³û §}ÁsÄ*;Öãü¾_µ·W³öwˆØXEAhǤ–(9é´˜¶È†i`øÈIù gÙ ØzŠ ¥iW#¸é˜*;ûÓ´z«§tKÛëÛby{§÷[lÌŠËÛ¨|µt—{}j „]È,­-š}¢|½®hÝ-n~®2QŽÎÞ¾Yλî>O)ߨFM¯¿Ÿ‰œÎ/à™Q÷.`²'0!p¸:,v-Ÿ¿AäZ$Î?ÿ]ü¤£³†:D‚üȰ™Á &Oº 1 ßÊð^ÚD±Kb’€6Þü©îà+žBĴʈ„,ö‡ýú¥4\»Ö;×Íá,]ödÏŒ¶¢„A"ã·´±lµCе"˜ƒqõM¸qÄÒ\ Å_ò]8:]9x¦§EV'Ð ÓäºÅùÄrj¾Û™0Žï}¤ƒ^—T{[c6§£Þ‹¥sý±Ù°Ÿ¤íë·ß®;¸»_÷ïÂ<ÅðI2KaðÊõn<;[gN{ó^1¯·ôn*o½ôÔgßòì¹zÎýäoI~ãä¯^~ùÈC}ú/mOö>–µ7*ÿüÎÛn|ðëï ¡TÏn¥øÁ¾þYö È@ÍAækÏ0`c—'àäï‚KéÖbA:/2x¡ð V9JÐ]@Sá 7èÂã,†4ôA!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä" Øø!̦óÙ«%ЪõŠIÈ%BêÍŠÇä"BslËì¶V§ÑS@üÏë“Û\´(¸Whxò·à§ˆèø)·¡YiiIøuvÉÙyt’Y‘êizÚWJ±Ô(9ÕŠ+»ø š`{À kàg7û L‚K ¸Œœl7q|{ˬ,M­£è<]V[Û­ ŽíÁÌ~Þfn1þ…îÙå¢þ^_ÅnŸ¯ï›;L¿hß¾VÊÉ›ñ Â,^TýSÓn¡ÄD›ù{61£™yÿ«ú`¨¨1ä¸]¥jˆ2¤Êƒ€\™ìèq¥Ì ØZ9Lïå̶FÆKÈ!åΡhDõ»yÂ+¢LSAëÇ‹K/WO›ZBIª3›‰€^ýJëhÕˆËNª©ƒP~Á¡]«Ç­/ÃpåubtÁf» ï29%qý«é£°†óÜ’­E~r M K®<Ë™Ñ"¤uëd¨wÓ‘<(sÃvû®CìW\ÏÃFñšLõXЗ9ÇÑ,‰ÔÛпgëýfØ3@ÈóvKê÷h.ÏØÜy®]»¤‹ÁNmùdߌÇO­Ìûø©Û~mâò¦Q"µÝ}½Î õúÍñm·ý<ðµ„Ë{Ø„‹?a¶;ö ù):¯õýå•›BÓ0:¾ù—?imè‡þ«¦¯ÞÂ謿Þì²ã4»è‘ƒ];X®Ÿ†{î±iî;Ús|ñ&U¼— ‚þpòL¡þ¹äzîüD°|õà {û‰ÔkÿK£ôD7ø+!…÷^7šRò®7ûÏsˆý+ÙË/Žž¾¾R.þ9£„ûù5¹‘¾÷iå€Ô¢± o[’ áÒgAÙu+ƒ”A!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Äb ÈøÙŒÌ¦óü%•ЪõŠõÑ"Û5 ‹¶®×°œšÇì¶;–† “€u¢ë÷|QÞkwðÕGXhØ(8xØèøøð§07)y‰yI‰ $™ù ʢȱ è`šªZaæ):Ú¹*;{”QÊYçJ»Ë;¹9ñçªÛ[lÌJ’H|̼º,ù\çÛ\M(MmÍ}ˆŒöýÝMîÖš3^®.–¾îþŽ~ 3 Õ>=“Œïo¤o"}ÿd7OÛÁ…& rç‡É7³wLJÿ;b”H޼„AÊ鈅"]=´™2¦…/ï¤á(3狚іàô¡3è ž €d)4é‰5s¶5²èP“J«Vâ¤ÌiÑ‹’~Fµ ö×¢ºå­šÝ©žyZ¨¿¾ŽèjÑŽ{Ú¹ïÎ{ï³GØûÒØžxðp_…Š5„TbI¯±J™5lê–ÚÔk3 è‹%®’q'Ím¸æô½F—ä×¥ïŠ5 hJªf…i¼†R°S1yèªA¢IãÃ(ÍYv¬´2áÉ–éuÎ<s·¸Ÿ¾æRYÔàÑŸ ¯i´.¦ØTaÉý{Î×k1^{M8gëÞÃ…†¦LiÙ™ó¼œ ¹qÎÁ”Cg~\³µµ8¥oV}½ö`á«‹n»umqב˫¯.ù:ÜÐj½¾~ZvøòKÇÿgsÚsÿy6Ò€÷¦-dÐÕkÌ4ÒƒÏU0DíÙÇV†áW‡bèápç‘w[p:W {ßðgš>¢m·"~)îàŒvÇ]uÞéGŒ ÅÜ*váF¤»åØM Çb{4V6$aî86‚×d/6G¥ö] `~'Jˆ˜zŠDYdšq¶J;0YcñAd`^îeG\˜1²Æbjt¶6_lri¦>B¹Ü2áQ'Œ*n€¦š’úu&£XÆ åœ:Ý‘z:Ù#ŸrV‰è}–îô)EÃHopu—çgxˆø øå5HØÈ˜8I'Ù8ȘwYù zFøjzú´XñÈf7Š+»¥êæ9‹››qÛJÁJª,ÌÂûe ñ;¬\™üÑŒg7ö¼LXŒ¼»Z½­|]ìÍŽ:ÝíÃv-®>ù­Èë¸?—žùRG/Ÿ/„¯ÿ¯‹Ü~ ÆðwœÁ…MVAGB!É%+'C EŠÿWÑ#HOÈŽ$ÿÜ)Bâ±’,UlÄØ¢”-k^ÔéÕŒz)múÔð’Á=_<b ù³$,À‚&}:Ðѽw’œB½ºBÌRŠ\‰Ä 6È ±[kýš6ôè\Hz!5ÔÖ˜Õ™dݪ²¨'-²·_ò¬‹­qûÝt„kΓKt²*ܯñ1Ȇq"~ Shfi˜ ­Œ9¹U3ÆœÂöù+Ù7jZK• ú"ßÊ~ò¾iiçÍs}I­GºêéÅ‘1ÅmûØÓh⨅ï^ü¸èᇅV…DŽrÓ¼åÊöí$3Ç`ÁsOmݸÛéU”_‡ÞܼÑò¡åR÷êΜ«ì›!bÿFžLÔµ¶WŒWSÅ­1ÁrÙ<¸“eFÍðJ¨áÛ‚š5X`œÑo^Ñ—ÞÁ]·‘v®Ÿ&&F'_ƒÏ1¸ßIwž6…4³Õ¤=S±¦•Iµ°˜Ÿs/8z6"hJæヤAÉ^‹%R©¥2c½I&Q¸IÊ‘õ%]!Þ ¸žwXÒ“Šž¸f•QºöaNéÍy߆ôÙ)(vn:Tn Yf£ðÅçzÊç$…ÏI'§Ÿ12×€ªIöfjÈ x›ñçiSHJi(Ž ¦Ê(’2Ù¦z^§ˆšºÈe§xÚž¨ìeúªª§ê8è³ÿÖè*†<•…’¢Ä€ôžZûP{+ˆ ö’s4B é…É$ŠºFèI©:¶)¹Ûq«l¡¼¶¨€ñjèh¾z¨mn?ÊÊÜ¡¥±˜W½I‚škŸ+J¸§ÀQ†–ܺ.Ü,bß^Ì,Ÿ[%¼¤6õ¬ð&•:“®¾ØkˆŠ|¯GKaJêǼL«Ì2ÇpÊq·;Xä…­jLÞ°½>ùaÌøÌV²Éù+òjúj‚¸rÜ4D» ×gFì^V«ƒõØplµo¸YÌvg41a¶Ó5°·K,wÞîèêÚ%*F¬wành*m˜· Žxdhå7gO‰ƒõ Ø÷ãO»é¥¶Œ–o~“JídÈùOi»0uèsWžó8›Îzë®›1úëúTþê²;úÑíA®¼ö¾fê^f2¨Û¼å¼Ÿñ #ϼ—«7ïSµi}ò¶ü;ÞÕ·¤Ü´Ûcå KÊÐõ‹fN¾MÔ³]a…éƒÏ |Û¾2þû³£å^ìö3Ô¼ÂÕ¿¿q ¯pŠO­§9®ù뀸Ûp„§@B®w) &ëî‚ÓwgÁF/",á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡ÄâÊ2~H£ó êšµSŠÍj·œæAùð"ªb®ùŒŠÁ /»]MËçôVyö^Zãõ¾ÿïA•t·Çˆ˜¨’7ö³)©gðÖ8x8¹É9…GáæpÕIZZFX)ˆéh˜j ›óê–:*‹›»ñ*J[Á«+l\²Ì:¬¼,”Ìüœèü5« mí'MQOÿº®N¿µö9 ¿P¼ÂmÁ…§ìÉcñ\Â6gF¼Ø a7„ÿ1zd! •ÁÃ|<Ù¡Ú¯’ñ–Xd‰¥³œ‰ÓB†×ïê—%Oƒ<ƒn:¯Û2ëÉæø¨f¿‰AîåõçßÂk“®ÉUÒ¾>¥ÎØY³ëÈ@,þŠ9ßçb¿ûêe;\µèçÂ{Z¡ˆz³Ðç¼£o\*ÒÙŽøzw~^·pæÔ§{Öm})dæÚѯ/=Ÿnñ¯ø¯«ÿËžžB÷=¶wîE^^æýÓŸ|ñAgU„Ûd䃆¶‘bÀ€"†ŸÁWE]¡`T~Ç_€…݆S}ò5G ŠÐ±à~ìX}58Ù„;>…WW¹ÕF¤Û­uœˆøæâ‘2vG£M…ÐØÝr>>)b”75‰^•In¸ã{&r¶%xH¦$e‘jrábKš§å‰íç— jø‹’¢‘)ç˜øù3Õée Wþ¹ç¡ÿQJ›].¹f¤vÁxM\Nù真Ôi(mz—¢ŽQVÆáppÙè)žNž&*¢~‚é ~šÖ.]Úʨ–Ê© )ö4 ŸÀ’Jg–žù!p¬ÿ* l¢°bǨªçik‚V@ÚXC¤™êƒq;Ζ‘]Ø¥^0k«˜Ã®ƒÛ„è’P\¥­9I-¨=Pú¬½©²rkÖJz’™Ý.ö—Yúùj"¥¨òJì©õZk²6jk*J—ð±KKk’÷hh°ñTÌãˆ/ÌÈ»c´ž(o¿KoÆöuT³qÄuü¨ÄÑZ™ŸÅ%é\²±K-Ê$‹‰ïµ<-üòvBº²mg}–O³$LÒÿVäõ¶áͬ ¿Cš|ôBa3ó±Ê÷t\³kTmìÒ×Uë$’ºwêáÝ~;èÓã&»÷߆Ӊà¼Èšj÷áL•GÞp—êxå…ÇGU²r5nù3ˆuáÇçz§=º`Ûdzêà¸m†®K:´Ø³ßÞsè¸ÓNùî¾›ðµx¿On…­¿ŒÝ:âŠ/][zñõÓC™èå§•ðí¯-’6r¹âMv—3LzÈ ÀøõÎl Œ`‘S7 ЂïHÜ9ÈLÜ„·CàI8 ¢px#\¡ oP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ú„JGPŠÍj·! i­*‚^®ùŒ–¿ëX%NËçôV[…x/ïìxý¸ÀAxà—§'¸ÈØ8x¡8™çXiyyhȶԇéùi楙IxzŠ 3º9!Šèöš:K"+™ÙZ:YÛë;&ãªyû[l <²6J|ÜŒÉ|h í\Ý»úEÂdÍ]mòÝ-žEÍn5ž®np¹þþgø-úPŸ¶ÊÜž/à–~æ¨ðq%0¡‚7”S1GÃ'&F¼gЇÿ;ÒàÈŽR2mKz v¯P‹xLº¬ˆC È—4¹ðÛ¦cfÍtJjÃ2d+žD§»‡I€E›Ú+#s«Œþ„:½ªj´*@c2mi«Ø•PËB%5V µÈb%'Ô«·¸iwøAd—.°/|޵v·l"½7 ½pÎŒ¯äJP"×ñ a‡åTur]ºCýy=j8QfJ(/à üYYäÁ*÷µuø¯:¼Ñ’êíäÚïã{ŠGŸ~í[3dÎLºB-r™iÑ–ƒãZ 2ð§C–vήø#ì\#ÑÎÞãä=Ø75ï=ܳuãÔ1'n½k³úã8WKßÞžotååï#ÿSŽW|òèf<„ÜnÕYÐЋÖêrΣOí zéT·fz䕲àyê&}R×®Ïîí¡O»í³—3¥î’Ÿ^Ýæ¾s#OOÊ>öÅí€c’…AvÄÀèÄTÜ'WÁùh¤;è¶ât„$4@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ¦ŽË ñ8 Ëa쉛l4çü¾ßQGqhsõ‡˜(W–1ˆPó¨8IyÄ"t¸†Uéù‰tÙ±ùÖ zŠÊ#ªñVH–+ë² (*éT;»ËkŠ+tëȸ×[lŒñ5 l‘©yü -ø¡KH}}j ÈÚŒý .ÍNî©í%^®ŽX뜾–¬“ |.ŸŸ6¬ßïŸg' @€ÿ ¢º7Í B-ø \rg*â‰?.4¬p±”DŠÿé€!cÇ‘IV!$‰2)nïRºä²²”®“8D¾¼Yí!›8{î´S›™èù<*¢L² †– ÄïcQ¤Tí8C,çÀqzªz 鎛{°Úxã‰ÉÀhÿ°Í²…X¬C[lØ6îWr+•:Ýf¶¨É¶zr…ŒdËP‚‡;½ÝÖáUÅ WVFe+káFjf–˜Ÿ2†\vnaÂÝöRUe,PÁ¬Ÿ¶‚¸ðh©›Cç~©ÎÙÏÞö½¸÷ÇßÉoÜu›»Ç¸wͶ!ÜX½–ÜÛyòÁŠ{¶8:o“Ç—[wÜØ|ìàÉA«?o<<ýË`×ÿÕ8ßjµ…EÍ]ÄwW-ÍgV=¸U~¼1¡ƒ w{B è^{o”öœrÎØó^t®×ˆãÅ—X\ûM%†*ò—ŸŠ¤lBS®í˜†‘I8Êwص"yz…f(ÖHäŠà]D]ƒ€I5‡å™"+§Á&Ô4Gòf’€5ÖFÆG_/Â`‡J¢7åu¤¡Éæ ¹¡(ž›qnW•2²Xg–1^¹ç„p~©[˜ŠÊ•×2OÒY–£™GW}MÒ£‘Ì=¨Ôy•öÙ"gUŠXžœLšg{ZiU”ºiZ*§Á÷雯by*v›JÚi€µ˜h£žh®ž®)Ú£%ÿb„¨ExˆQÍø£˜=@)e…|v¹A³‚¬É+?¿vå­w¤n7£3ºúàê…—n9YuÙ¹h½«ñ ®ºÞQŠì¦íÊl¬üVki¢š¥‰lqùư| j‚~Ú­ ÿ{ê[⥺Üo¯”k‡öªc~ž5#¤—Wêp°Ï²‰ñˆ¶VÇ߯³Œ®–0/[ì‰xØNùÝl»Ó£¤•+Zv›~Žš{›ý9èÂL^zêg.¹êaâ¡Ä®Ï^ÑÓ´·¹³ÞÎ÷Ôˆó>Òï<Ï#>z Oü?°G›üQ»ÓÌ|ôÍ¿öŠGÓ_/YçØƒ2 öömèè¬~™÷૵Õg(“Ï òç÷AÔèo­'ôïë#þ¹õ[žóýýØ1§1Å|þSH†Ld—;°nìkÊðøÎ}”Ç/WA{%PÔ`‰¹–ŽL",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf樒ΪõŠý@I*BêÍŠÇdåVq>/¤å¶ûÝ OÔ‰.×&‡ë÷ü¯†ŽxðÓWh—'"hÅvø锈ö79õ€©¹ùbÉU²8EÈIZŠãé:ƒgÚꪈz©Õ•˜ùz‹«è7SÊ›\«f ¼á(¼ÌŒILuL¡ÚL]­…m½ÝfL-Í-Îù b77žþ¨íS®þ~Ë?Ï<ý´KŸŸ -¯ï_è #Láþ;Ø \*|~ë7b{ZDA±Ž•Œÿ;^ ¨ÐB@$ßÐú(qaÉ•¦5J‘’¥Ìv¼î bHPàÌ ”šä“£¬1yµùåä"ŸkØ; Õ…-¢MEŒŠU§(/A#Éó©Õ›×Öüº í%¡RÃte”-Y”¢³²’ÄܨŸs‡2`‹iU q)ùMÆJ–Ú¿žŠÖxøoÅÁrSUOz>\ºÇß‘ûæÿ?cKÛ¿+e}ü `Æj/Òn Ô\˜¸ûAp] œ eP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íòçN4çü¾ÿ›•džeG(ø‡˜ˆVÁˆ¥×t(ä¨hyIS iÈ ‰  £I*tÇt7¹d*êújÑÚª2A¦9I‰ »Ë;›áKYÃÆøÉk|\|1‹‹§Œ Í’wX'}ýèðœ¦Ç¾8è9¤{ºL±'ÎîZy®ŠOØ^ßi¯¿ïIÂÏ/ »w "ØoBƒ -¤Õ0¢1ór<”ˆñÌÅŒÿ-¢hãM³Ž$ùœÛˆ*eÉ•›½xg %Ë™Dþª¥.ŒLš,OâYFP¥KžD[\!¶FØË¢LS$FÝ·2;›ZöMU³5vª&¼ Vd :«X• ‹¶ÈسÚrµÍ:4˜¯sµýdw×–™b‚¶ÊÊénZcÔÖ¢Òµ.9¸Rsx:ÌqÖjoEEw—í6k”%+ut´kåyå~ݹޡ WçSv”ÞÔrÖdTÌ“ª³Âž !lúlëà)I…Æl—¸lÔœÈZtïÉÉO‡¨s¤y™Su~Ž9j5ù~ƒ9Þð¶Þõè×í¡«—nüréëù²7ÿ? ÞzøÕ‡|º1_)Î6œXÚÕ2ßMÚTʃ^Ha†öf™…jVY_hõLÓÃ^‡ˆ)÷ xÅ(àgí]&ÜHÜm j)’¦#1³%¨p¸ y®©'ÔcˆÑèÝ€*þÃd…ØUÇc…;ê¨AwRö÷È'òçŒYnˆ%‹¿ÜFdšXéÑ“ŠQfçÆ~µqùÆ”VI§~êDù˜˜ä‘ÍÅù…#ºwžž&Ù’š’z©p3Êyâu&W§t}ÊÈÚ¥±eJ]˜‚zZ&-^"J¥˜ƒ0ºž ŇЛ(Šª3GÚ™£M‚Êg{ŠJß©JÑÙϪÄÿ꫹6*+°æ ©` ÔöÊa7jA !¶ª5æ–±˜#e]‹ë¸fvy§vèš0j2sFçmTy¨°Ne(‚¶b8iÀºÏ2I²«ŸÌ Œ{Õ%졸/Âú"rã‘êÝØœí±8bº©Åý.ìj ÏÆ:F½*wð¯À`¡ÜÈ?*D1œkÊí{ëE›g±'WlrÆòš/Ê'Xs?Ó74»lr ¤‚U½ë2GAXQR( yoÒØÀJu]p%æmb1É5"'‡m Øi‡ õr1Ï[Ó¥øV­&W -éÏ~ã-©ÞÏüŸÑ€.Œ_}G¼ï‡ˆã–Ùo3þøU>Ëè+ÆpWnùmÐ*ÆyèÝÆõ¨áè‰Û#zêé4~ôæ­WžõŸÏŽû[[çÎ{¬»ÃÞ;â°M|ZÓV|ò§ý¥<êºE|óµ«ôÖ_?éNlÛŽ½DÏW/w‹Ý[<餻¸îøû0/ûšS¯~@ß§¿¦,ÑÇ/ÇêŽË[ßöø¯_¾ð®Zÿ³ 8àÀ–&-‹œÿØ[™Ël÷ƒ 4P¥¸ZHYÙ6Xµ­Ü „ÂSM¼Hˆ;¢pv \a ?èÂÊ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"@—̦SXkآϪõŠ)@E´› ‹ÇͭÜø‘×ìvœ„3ä$ÝÏë3Ý齇¶GXh˜¸x¦vèøX†1ˆÐø“¹É©•¢ ˆÙØIZê¡ù‘ˆ6Iagú ë5z:«J›KJ{${–¤,œV—ã7WÇ:¼üÊ«l±¥ŠÈL ú)m0ZÍíè vÝ->®õýIŽž>-¥Þ.Í%éN?_Á[¯Oô¼ïÿ0 À~ì^äˆÏAÏòI1•Ãx³Šýª1c‚ÿ/ÉÓÖê£Æ‘+:2 )¥RA’,‚šådË™ó¸À¹Î×Jš½ÚK*UpÉ^BhZR±8«‘Ö§œ/g-¥Uª­í o±’„tQC¹ZÁÁ‰V×´[–|t,1a›}­&þHx_È8“"ûê÷1±Ž“+*{1'h?Dã õQÚ…ã"† T§Ä”šáJMñYËZïTì±ö`Ç´tWvëØ÷åbœqÿ,únAxo–µógiê”Ù£'kMɹ¢cÓÑ2EÅ:¼wbë‘K¿ts:vèÊéƒlÞ~¾áàòyÓÿv­Œ`$øÝ ÙÚ©&ÓrðÙ‚Ò\êIˆào"gŸpr…B€Öax[{ß±Vg²÷•x#÷`d âÇ\q*š¢Œùù'nÑL¥ZNì¸Ö_t±òˆ,b>þÇžE6ºø’ ÎØ[“÷=yRüi`b•½u©`]>ŽY!{8rIä’s§f–’¥]†9êH¥“-Æ×Ê’pòâšž¹Ÿ”Ça$ä|K9[“¢If£0ˆé§ŸÅ±)âsvšçåi¹I™”xB($¦qž()2øMŠ"ƒµQz¨œQZºÁ¢nÝ9+¨o^™i4rzªÆj¦{Z™›©X Š¢„…ÿRªi³¯^)«’ÛEf‚iS£>ÓCLB“™ÓB*©Cú›ëgä¢V)ˆn¦ «`¥³¶µ9¬®Ü:ÊoƒùV-šçÖZ^¼þº'¼újiè­ÀI†/cå1kš…®ŠJqªÂKQ¯ªT¨} ¸n¿ý G%sÇç§ ¬¤Æ7‚Œä~ «ç±m\ è ö£{­&¬¥·{¸WÀùn4­Éõ„¢óÏ@5m­!¬R½ÇÍ+Ç ²T{•©=Ws£5Öçä•P݉;šÓn ó:f¿M÷†KcXß„tï  (_ç-5ßüòx­·… >S?Sýµˆ s#nW¤êÝîµ¾Cnz …yO…ûhç4•¬êF¢ó}Ïã—ŸžQz•W|!묇-{ítQî‰íˆµµîžç {p¾¯i>«|ÍɯFrð>,Ða«}B¥§ˆQ„IVïŽñÚ_cÏÜ‹#ýÙy?þ!¥U‘IJ§èïËÎûðG«æ˜õ~ÿH0Û¿§LÊoè  >Ç›DÌ€viÜxÇÀ1)NŒàjXA ’$MöÓ ÛäAȉ/„¢‹ OØ‚!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍjcÓÄ2¸ ‹ÇÐ.£J5“×ìöZ}Xºçô: ­„äö¾ÿ¯„¡·—4xˆ(±hˆ ÷³˜8IÉãèu÷È$YéùÉÑé!:Aêeʪºú(bê ¹iËjëWûK»K¥Kë{;Ì&ܘ#›F¼ü'¬á¬Ë,==sÕM­Í›W½ý Z‹½÷~Þç{Ùj>2Žÿd¸ô¿aŸÏßÌÞ±¯Ÿ@\1eˆpUÁ„ a,¤` bÉ7èmÊä,b,ŠÿÝ­{¸1ÈŽ$#$3­] o,KºÔçÈâ™”>þ½¼ ‘Vžk D¤7gÉ“õÀøT´TR¡ÍLùræ£J¦TwtÁ“êTÌ}ЖVExuÑ8[ š=å°Mµä²±µ"³I$n³¢Šó*ï×[N9Õ³Ù­-ZF¤~†µÒ ÎÛ:/Vì¢bÁ!aòI™Q[¶óLò,üW3⨡ f$MÖ(ѬJCÄÝÛ±ÓẉG×Õ[š—å`¿l'nü–wÏ\Ùíz<¹ŸŽä]§¥H™q! %d™î$wà(HžÈ[FÈ–hžåX—ç5ך$œ½)˜Fz¸Ò’õñè[›o®¦M%ªif£V½¢gcw>Ç`u i\¶Èfyš¸(tçÍtc“žz£çs‡bXYŒcùY§èåyÌ¥qÒ©iŽœR‰'…©j—›¨[’  ©0Љ€µÿÊ)áQUÉØ˜öçŠÓ*XdtR<ÃF®'LÚi ˜š d¥ÞJÉ䇯pl”[.;ï­s¶;¡£úV©½Wz«§GáëªÀYþËj„Æ©lz/Jª®Á¡.(~Ê6lë‹_v¹'ÃFã¯}w¼»ïPsú´‚¬i0}×¶,#®‰ºw1‹ÓÇ­ÄÿJS²†bÜñ¦Õýj¶ oE²“%Ãruª / ?'}ÈÅT÷ Û5Zï”/?S§»…Õ`».]áRjW×K¯=œ½:V@l/=¢\le…s›Iîón<öÞLô¢Z(xHoè%ã‰37êÈüøP—¾ RÞ•“tµ8™†òùæ±Þ`M¢ŸŽoà¨ î¹æ«¿~~ªÃ.dÓWºI{îPo¬{ïà6»ïˆxõîÕÂ'„»ƒ­óÎìñ ÖÒò“;Ïùî_¿»ñÔ“<¿ÀoÏôŽ#>Uâß‘fù8I~ùZÁ«ßhßð¯8È„½?¿*¶›a/ÚçžÑ ÿàठ¸pnû‹þˆT,J+„`%¨2 >Ž€Ô`â¨åÁÕu0„°ƒ Oȃ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~x³ý†Ä¢ñé‚Ȧó - AeôŠÍjASΊ¸ÀÛ²ùÜì:Ô &ú ?ÅÔù ¼Ë÷üþ‡ÝF·$èWhxÈ¥7Vµ†èø¨¥ضè噩I$Y‰!ɸ):*ÓÕ9–A‰gy©JúJzJÕhàºá «ûÉõ‰‹*»;,'Ìj¼ä…—Lì\fÜùè÷˜³3¥ =¶iù€ãKÿ§_žv¸áWÔ*Y9üYvÚjçÁ×_ÃYàW41ita/éôD ‚‘aè“@Ûí÷a~$Þg"bTwQq¯!÷ŸsÞùô]tû½èß$ôQ—Ò•ø¸ ƒ Öˆ#†ìHVÙR¼-ùÆW­ø‡d;Î7¤Ž2bãg6F¤yUbIX¹h—EjId˜YŽÛFì1 '_ª¥{bZååe:5褖›‘‰ yV.GД˜y9æ€Ïz¥~`Ö'¢qî9ç`¸åéæ^qnJR¦€ ºX¡­ø[¥<¢y#¨Ê ¢´‘©Ü2@ƈ]¤Caª(›¨&˜(qvÒ*ˆ”¢Ö™©Tî°«ÿ>ªŸ«ÍÑ*kšêÚ¦•+²¥öéQ>ö kˆ?|ûªj‘{Q˜Rx›Žó ‹§4Î~Æm#ðŽ0Y§] èÛ½Géš,„ØòHéºwZÉiÂÄYª¢¡TXµóªŠ¿úƒ*®Ž;Ú„jqw&>9©` ? pµ';Û.‹ŠšÒ› /‰Ü˜‹…Äë1€ R6”jÍ^û3ÇÇ©Éç…A‡FoÉ[½¥†×[n’¶Ò’¦3£bàb!N{ƒ«¿r¡Wjp-c|ÐØÝ”­5¾áæk2ÛBŽuo.®m)—yÿÍÙÒH¶Â÷†€+|³[ºZtä1ÎdXœÑçݘÌf×xy™ÓÅaçpú汆~§,ºR\,÷ã©Óä/å®ÿñ:WU{î-¤¦{ï–Ïþ*Þ¾ÿͺðÃo •¨ÇOBUËYé"GzðóÉF=‰@Z/D¡óŽzøÜO=…¡Ï)ö'¶ˆþè!š=¢äíÛ~v¶ó£ Ì÷/¯¿^Æï?ŒòU Eƒø‰±“}ÍQ×9 ç€±@µÐûhœWòEÁËEúË òa'ÂyPwÂéàs§ %‹à {'¿îO…2¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋uÝ ‡Äb ¸øÙŒÌ¦ó)D*K¨õŠÍ®€4F·« ‹ÇPpò`N|Éì¶ûmK«ò·ýŽU§Ë:Zš(8¨·§¦D˜¨8hшÐçG÷³Xiéô˜”i°‰x* Ói²7Ù·9Úê:3Q:"9‰úz‹ë@{&õ› ìÆª1¬Z<ç¼xÌëQå ËÉ\m'm*ÛщmíM$Íý=NmÕ]žžˆNý®/øK1ߎ_ùþî•ïÏæ,Ͱhôþ¼f—ÀX:„„ì¡Düîé‚hn¢Æÿõ>Tœ‚áãÆ‘%›F2%O|žE©2&EG«,)Sæ/[œ±ÛWgΑ #~âùÒf¿?‡:Ý ÇL=CÎzŠ5ƒ@ª´(éªú¥½¬dÃþ9m'ÚÊ<†éÓNh¸tRÍ¥»RM.È-»,*Á…4Lý›lï!»È°­© Yo±­Œ1®…|ÒÝix+ƒ,Ì4SM“˜ùjK:’Oqg/NVѰÊÕ­?¶z1ßÒ-OóÎl«³æÉz'ýmÛ7ÚàqSù¾ÝôÞTÔ‹•^PÁL‘×ÒÛ{OÏÍ ?ƾÛìR‹—%“ü’9ü/`A¯§6]¼óúí›Óÿ'O›mÒIá ‚!S1ÑÅ—`ƒbé÷Ù wR„=m\Z,PXÖ™W\lð‘ÆÞu"ò¡{&ŽfØù¹Èbj+FøXr¨"[ZP†â69šV#t&Va…åŨߟ-G!“P*Y׌7>©¢VÔ¥WÒbÝAs¤bjéå† éàŽÁx"›Ïq©Ô‰R¶(Ÿ…¼ÁåäxT–Ùe•ý™·d–î×gœ|*•§ž`ŽÉhr…H¢sô¸ékF¥YdSPž7éø¹YŸ‘ýX ¨œ‚~J¨¡[bÙÛ)B*F¤¤8Ê‚§¥…ÆÊ꜑nÖ¢q‰¾™æ¨Šjª©©Í¥KÿU5P…ù¥E‘´ŠÚ÷^†Õ2è [ i›mP?±igQκV ·ã6 j¤<ðú-·¶ÊgWÙÁdm£cxmwˆqQ³ábÚ&ªÑî g¥©l0’ÒÊWkeÓ2 ²+MÖîT$íÑo© >w÷•Ê)ܾ6Öê…½ƒyª-–©$6’ŒáÔxPÞ›ìBÅ—‘äË _B¦º ¡e½s/ÒôÜhïäÏ›QŸÃµ©™­ÝºxeؾŒ×„Û™vqη£;Ï;Ü:羫Ðb~ü†)èæØS'ý9`öѯÕ{o¼[kùÌ«oÿ®Ùuÿ§_ràhÕ_¤”"’tóa×=³puËVÔ¬#5xhxჯa6ØJY5aƒ#·}¦‘”bgÿ±Wߊ‚ `¹Á·–vßÉHÜŽ®ä&^bw9C¢nFF!›]•äEd3¶ÇÎtüm£‹|T¬9zL1ÐÇ;4u"ã¹2UOC60Î.÷GX…>EØ%† ÃÇV'òóØjœèX@‚í‡Øl7äö?¯·qÊ’y5¥~(nÏæ xÔ/™˜Þ”!~õÔh–iÓˆOZ$ÕoQÉöÛÑ߃oL–Àïå^Öb2{ãùç™u‹wéª ~Ö˜«»o©¨¿®w-ŽûDûã–Ï{TÜ4Õjë½ÿ${ê?ý!9„-e»ëÏÉɯXüJ;ܤ¹êg¬ØÜΘ–eA,iDµüUpMµaÞaW›¹ïƒR ÍHػΠ…×£ ¹7Â^.]2¬á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·Ü$ÁìŠÇä¬rVXËì¶û˜¦:Òêë÷Ïë5_ºÊ&·7HX¨rpW¸¶døiXEi'(™©©eù€‰Ø¸):Š÷Y5gGªºÊ‘˜Ñäú÷§Ëj{KÒ7W[׉û»‰å[rÇ;i œlˆ<¹#̬ý6¬ØìU-Ý]Ë «-Îõ‹4žNÎRGÁ[®.ŸŸ:Q?¯_f?£»°P8|2ú<(Æ` fÿ:Œâk` …+Z°'±Oÿ;&T!E$'"sEmDÆ#Kº¼s×)Tà-z‰ÓGJšZæüùΦ±‘>±=”箢v"} *·aÔ(Ú„Šõâ3©±Ö0Š™5¬:ŸúL­ÊÑš¦!ZÃÁ¶ÔÛ{yüŠcê\ÄDWUÆkËn_™2Ý-Të·Ø Jp“6ŽÙnèVƈÕHù2š¹0#²œ|(åcY™¹=^ŒÙgy{:ãT+àÙÅ/2ˆ).cÔ3Oò>Ýl7švÕNV>\ú3ä¹´ø*·¬×¸fäΧ÷fþÛ¬75¬£.–˜;ݶ¾SïÌW²Òå›­GM>œ}ãæ3_¯çÝ>òøsî‹cÿ7_Ýqv)ÒUC!䵟QñAWïv>õ˜ö`[k%Å`{²`›v7]‚‚pðÙçYl£ÝwÜu_XXaŠF tú±hÙŒ&¨Ù]ÝÍÆã6°•e`+ªáç_|±!÷œ‚'Ö袊$:Øß‡'c“uDÉn)Šwå1CÎ_=Ž9å1ü…¹âoŽ·ÜjõiÔ%gi•GË–¤ùGŸw Ú¦$ŽWÒ)'K•e7JN™'#>If£"µ˜¦)_¡ZYäœÊÕ‰%’ä©g™wžc§æš_Œ nY¥x0Õ }œ®E)pnÆ™¦“4Ñéš©ïáYë¥+†Öê“ì]˜£¤lÿâaz~âÅ(w7rHÜ+EDk&­RÚG„–_Qkm„¡¾Â«l%nµ¶ÄôÚ »˜¡‹)K"k£¨ïr›-œùò!¦£?yx&Ÿrê,£²rìz»j¥èaVS¯¶&œ¡¸ªÊÊæ|”fÙ`¥Û;î¶:Jû‚þf¥˜ÀŠ)ļ ·ëðŒ{êûéÇ·Y0”ï:3³T*ûéÃ4vóŸgq™°z,÷{²6·Š¼Ñv†;¡ê>òñÕf¸º¯ŸÁÑên2V3MFÖd›$°™pÁš„ˆÝ4@nDÜJ]KwÜ#{ÉQ¤Tçío99+Œ7àdzErÀzÂmxZ[Èx々--—ÊKŽùENÚB䙯¢uµŠ?úùQ‘{^:P%c”zÞœ«4zÅ­«^¡ M]&곋’ȸû®”î»kòº¯¿o üð™Pˆ{òÊÓ¶mÏM=ò²¶ƒC½ëµgÏý¡„›V÷Žch¼Ûâýñüžo8ó^ƒÏ>R‰~w—ǯ¶úñ=§óø“â-|ÍÂÿ ¸’¤(ð¾A‰É¨7ÆH”G¬UÁöAç‚÷Ë üˆ8*Ï¡áìZ¶?î.„*d_jZC#!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÊ@'¾æ¶û}fSⵎÏë5_›\Y‡°´GXhè8ñwеxøi–˜fqgð3¹ÉùxI¤Ù9JŠä%Úà‡J—êWú ë¤j©Ù{‹Káx±ÚšŠÙ›+<œ \yjL¼¬§¼öáŒÌ<½ilµ{"6HÍmˆ=gíÛM^&¡­¨{ZÞ®u®‹š>ãånòÈïßdMк…åSçÞÁ‚ ]\ ¶°XÉc”E<†Ž¢F‡ÿä常1$‰‡ãè…«R¤JŒõ”°Cw-ÞÊ™÷u™’¦Îpò¢)ìÇk§PŸ¢gs¨R0¢¾%M¸4j6iN!J½*E›mL?býŠRM’É,Q‚‘³D(Ll©­ªÚÖ@ŸŠ‚kûkdZ°¹þÔÙ “«X˜ŒÔÎû ®"WŠß¦Yux‘ã~Mg³Øv-¶^‘)Å ±QÌYmÖ ¦UÒyúöòµGµØÊ´§•&Ñd_a2³• ¹ibΠSK.þ¸téÜ.kç-üYqòãÒ)ûf¼6ÙŬ[£¦ÎyÖ[ͺƒõm¶ºqÝÈCÿm9ñ˳Љ«¯>£rññúÿgôW:§•Ýs„x’D%‡à|Ιa{ ""Ü‚¡a`Ë`Ò€öT1ŠVØ}î ×ánô¡×mùiG!ˆõDWŸ~*²'âe->Å܉ hL‡¯ý(ÄawIˆad4†çâb5nbˆöÍØ’ù˜x¡|ðÉxã‘X*ˆä9nhJ>IfP— ¶Á%Ø16Cï iejC*—"a½-éÞp¦É'“Åõ——”(nã—5Òæ% :väZ™ŽZÈètâÉØr|þÇ›–éIɘEl^ç&ìL¢h”vºé3kbÚ¤uëÉ‘šüáùª“WØÜ¨šÖ©]§”êi(u£zöä©tze°‹ÿšZë/¡Ä:–Bb˜•‡JâÚ¦|´Xdš%%É“®án&Úgcfó©’Pb›eT¦š)«#H/¸b>Š/¤å–w.-Tšío^:'ƒÀÎj«¥yŽ‹Â,åzž@«VJ^’ïòZ±²ß¶I0Þå[¦¨nÚ `£UÌÛí{xÞÙêÆ î9ÚËÆm»É»Ù7ÇÄód¼«™<»znöÔo½ KUqÁÛ%Ó(‘gÀ\´'³FEl·–¬šºò–2uÓ’tMȇsjU™51öŽìÂuÚ.Ew—6hÛUËN§÷£¥>Ìà´yÿØcE xá2q+ïÙ†/x„2¹œ-I^pä–»Sí®å4)â^{­ù-žšI¸~¡Ešéªã|ºPék U­»~8QÔήRê+³:îÝÀí¥[û®ðHôNü=˜'ï»îP1ÿšñ<Þ†<ôn­måè·[¯÷ðw7ÎýN?Mˆ·Úá‹¿Waz|¾ø¼˜mvûÅKTUpÕË?Ñ>ú¯¿Nû“º¼þ-å‚£•Q1·ì€ørßfs?Dß“`Ü‘ ž®Ô`HøçÁÈ-¡ƒ!,á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Ä¢‹ÖøÙŒÌ¦ó).”K¨õŠÍ‚IW¡ÔŠÇdë·›”–×ìöó À¶¹ûŽÏoÑòj"¬(88bçH˜¨èöåá8eا¶XiÙYhHuÙé)S%)§‘—&ú™ªŠµ‰¸ú ÛÑX‚Ú{‹KZê±{Л \ºçû+ŒÛë÷;Kqœ]ùìÀ,­ú°nŸ™±¾|Ï­/ ¼íLöï¹rø:$‘°žDϾ=¼h‚¯ÿô"büøZDMy‰RÅ»kýPhL ³K GƼ鲤1xâü9ãå >§=šâŒš—3/C u ³©Beò‹Š•Õ?Ž¡‚34HQˆ'ëÕ³$­-B”ʦ ÕÖi§Ïf½¶+6¥\'öíYêl;j¹Õq[–A-¥u2¶—¸áÈ=%rªßrçKvL²Y[C!!9Mõ+KÏv™Þ½hú¯±µ`š>švÁ̤-7¶š†ÜîG¡éü6Å»°ÚÜ&›*þ£¿è–E+'}ºÂ²'Í>f7QЛ?M¼E†"‹'ŸÜ7v£€…sn_þ=}ü×sOÿæ3[€ —\ö…t M¤4\sõÅ`edX‚¢)F’^;™¦Ù!áÕ6rbFpø±G\~Â7âLUuŒ*†¨.vÜs øÃk>fAIiÆI5Þ~#f8£€VgâFÖW’gÁ9˜]“ÁýgãUIn§ÝŠJrY"?®ýHf„ºÅ%¦þUt&bŒÑ‡!œLJwäyvuRŽ%NGe˜5¶hgŠxú‡œ 6§§thÎóa™ŽR¨ÕkVÈzv餈&wØ–’þ©çöt‡ŒñºiŒ¿Uêàså%êªÞx5_?Uöwé’W²˜*”Úê×r·’7j~UÒ åœÖÿ©J£±‚š˜W<-ê烮Î3Ę`û¥Žâ^¯×¾nÓ𿃲ñ8:e½¯|0t}õVÇž¼õ)3¿:õÝk”è—³-ø7ÉÚ;ßê››å"Èþö¯}üú¨TýöÃsx_‹Q»¿‡€~Ó_ÃÁ½æ•JxDI+LÖÀ2ñ¦€Œš$ XÁÅ탌TÓAÆõ/„®kŒIˆB!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·Ü×ê;LÃݲù ½>ÔV´û ‡_ÙâjüŽÏȈ9ÿpó§7HXÈ 81†ˆeèøiÀˆc×çÄ™©£FçQ 8·9J ƒ rÚÔXÚꊑ*ÙGâúõŠ› »§ªû ,Q Á›H\œœË[Œ¬ü º6+|ñŸÐn|Y«µ>e™É“¤»ê¼=/éer„9õèô^»éÚ?eõ¥ßO~òzêÒljþã9ÑImûy“—¶ü=íæpåöß/ÐËMÔ¿?sK?ŠË^ÛqÂu†qT^äÕÀ€¡ÈnœßWA V΀ôÐ:ºÅ0s`ààO€!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Äb‹Ö°ÕŒÌ¦ó9\&¥ÐªõŠQ§Œ0 ‹ŸÈî¡ÜE×ì¶ð ئ“q¸ûŽÏ‹ìs³Z(øð‡ V¨ 7¸ÈØxÇ÷h€8Y鈙If8¡hè©*uy–@É9…:ÊÚê°êQº°úãj{k†!{Jú‰ ¼›Z×ÛG79ÌÜ|²¬ í<·‹&ýL­=]Ò½ kJHòŽ.nœÃ'ÉK—4‹½šÉ »š<5l¼¹™•=‹rGKÉÀ˜F›Ê8t ZReúœZ`êÏ>ë.à¼úðX¨1KÊ S—"…~­V ÙV6rÆJÚIç¹`ÃÙýeêÐ)kËøåÓ¶Û¸²BR:+®ÂÆIÆÊ¸R¾€…Z.˜8¤M^ž1/F’ïlçGÝò¾Ý·/âÁŸ¦½û2ri.¨3ËuÍùé—UŽ5åâߣ‰ÝÉ<`qÚˆB'k u^.–‹¤RæuEÖçô^~ðó\äˆï¦¾ý½hìšÓßæª;°{ÊÍÛ›ÿ¦¯]Ó…¤Z}¿(‡ŸõÒ˜OŽ” iŠM8CWBGHƒÂæa¬¡µZ4†%§[aöñòSyùù6PÕ]H‹K†â~2–øßŠÑÈUn=†`lBþCÖ`åtŒÒs^†+.×"oñ™(ßHTZÆ ü½X%r¨hÜŠFˆ–#‰æ†>®9Q-M’(Øi!:&–þI×å’P‰ܘlÞ§'â}VÖXLœvr蜟½çËQiNº—™‰Y(?ßÍ h˜\ژ鞅ö™—N^2(–TZánÙ•ÊÞ£ÀiÉÝ^$Ê`srªä]Sæ*˜æ‘ªk|§úê±¢ÿF©ß¥tvê%|ÀëxLj¨Ö×vÂk­$=!·±‡S€s9úY·é’„éŽ:þ9Ÿx_öšË–Gš—Q‘° ›+¥þ¶ÊZ ¾uë¹ÙùV*¶ë¥òª® ˆ«¤†6Üã¢h®¦ÿÊÑÃ?+p¬3*â™iÈû/<Þ}XÛ½–@l«›ÛN좄 û÷ñ›Î÷லÚ|1s9{<(¿xFG•4á…`rÊýèËòËð u GÈÇ\ß3[ KDi#[£ ¶³_I[ÛlÞŠ$ÚR$Öy>]çÜz£bxÖ ¸öÞiÖrÞ÷É-¸QµÄ|µ9‰ƒõ¦´vLùã²ÂñG/´Oš–¹å ažç¢ «éyO‘;Yzêmj.ú䪿žȲkû܈‹[ûÞçÎû³÷®øï£œð±I%¼ñÊsÎüíˇå8ëÒ?ÏÓîkºã<õÂ$öN¹Œu,ÞˆƒºãÓdý—ÙŸËRÇ~õÜk^&…ñ×ÔQ«f5nÜú÷£$øÝ$}ÿ ”’â¿Ú¾PJ¨2Ê” ‚BºRdHA‹ ðÔ *0ØÁ¢€0„ä ñgµªð!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjaAeͺ ‹ÇЮcJ5“×ìv—±‡pòk!Í ÉVž{9?Lñž]n,kÉE†ª—TÉå­Êø°f*¥ý†›§ˆ*åìÌÐ)cÁòÈå’,Ø×M|l6&h‡bsç~a¬>iK}ÀÉ%;0ÝzÏïO /½wà«Î„[\ Žø#oÁEàµZ'žÕØ‚^ š€ÃCþQµ_V>NǘµîÕ:Ìý¹(|9ˆz¥¥Ó]ïã2­.5Ð/D {O¤×Ž» ·ç®ÂŠ‚Äû¿;!|¤]Ž|çÅGŽí‹Ê/Ÿí g ½™_ï^ý=f„}öÆt?øÞßâ:ðã3¿ƒôç{ã{Ï6‡¼>KÉ”ÿ>r'ÇÑñì5‰øø³¢“W±Ksÿ£‰Šªæ¿Ú%’SŠê$Y‚ÖãŸâHÁlHP}Œ 9ØÁèa0„ª! U¦–žp…(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó •Ë ôŠÍjÔ³[³nÇä²ìmV…æ¶ûýD§×l¸ýŽBÔiyþXsÁ§R¨P'¨¸•Há‡p ÉhyYæh¨I)†ù ŠÔ¹ù@Úyªº’zàjèàÉJ[ÁiÀ†»‘Ziû ühª±‹|¼:ZœË‹ül§+¼³ mí&´[}²}í}ç\ÒMù].¨=Î<nÞ^›î/Ÿ!íQ?ÏÚÍþ ŸÿÃ_«I b[GÍ BüreÓ–£á‰¨†Åÿ#”@äðÑBHŽ$VáöðÃÅ’,Ãàò8feË’³IœFh¦N‘¾¾¼ùJ%ÁD×ÕQ¦ÎË-Go}ŠáTÍ9äÉÄ5«4\ =drò§ŠWé©ÃQöZf@£MôÕ•X¥Ój Ö5L¤žL ª7£š}×Våwo_DIe5¶ºxÐa§U×J]ªXÓÊbýÞz¶¯Ô¼?Û#«­Ñ»wåd‹Œê§ìÀ `N[8´çb— .3 ÙóãX†-of¼çå XÀõ ¿=¶2ÛÍÏý‚q ·ŸHb~SMnwrǾ9§† Ø»té™b^²ü÷ðÌî¡Ó-.ú¸äÄ´µ‡ÿÅj_|F^TÄàDUt[mÃÎ>ûQ¶`&ÈSEhéçÓ~A¨v^ss\Öà|È¥gn÷aÖ™ƒÌÅW"qõÉ Cèu£Œíõg_¬í(Š2p XÛ`( d®‡QŠ'Žw‘‡8]‹¾(åv1*å¨až=ò&j´éhaƒâw]}ˆé¤dêÙFàQQ¦IךCE)æ›]VIÝ™ R˜0f×]_†‰(=†þáuºé¢&K&9$’(º™–G7ÖŠWj‡B·õ ›fU zªRd&gf©jz§‰È Zi›bª¥ŒPþ§*­Lî™'‹¹è«sÅ>¹!H7ÿõf @…Cg„ÎxRTv§ †ŠV"¤Nª£ˆœ·‰kˆ”ʪ.}AšK•­«%J/h{Á{ïªãŽsc¨g*7Þ¬™:ºž¶6ÚTðœøîúç$ýúÉžÁ–ŠŠ&©Ú°1ÉÞ»i‘­ [ï?? ©\qáœÀ:·)ÆgJâËÁQ[1yrŠÉØÃ®¾ü\“¯ö¶0Æ'Ïle¸!gå#ÑI9#ɵצ«ó3:ƒŒ ¡k´» Õj ü4Swi°N64/ÕhÙùÎfÕh‡ÙÄk>A;2Ö¿½ã†šõ"®Öé€7>W‹Ø=u"8kqo‚ÔØv'y¶9>Þà‘¯Ce²¼-×ëå$5dy…žïä6 ¡Ž¹¨¿M 8§¯.rçÃN»€â\{í`Ãózîñ4®¬ï¾÷^´ðZŽ{GÆ£¾ûòÎßþ|ôˆKtó³ÏK½NÈS«(ñÙ3¿¢~´‘¦JþLüp’«é ™™{ÿ>^1—ýõ Î7ûáퟸÑè €­á ûHÀæO ÜÈØÀzIìzô+¹/0ƒd@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡Ä¢ ȰՌ̦ó9\.~ôŠÍjYK¤âgÝŠÇä§÷{8#¨å¶ûýV†Ñj¸ýŽÍ“õ´4(è³·6ˆ˜ˆW8ÃøÕWŦ8Iä9 vYéù×Ö)jzúA:ש±Ù…  â¥ZR*‹››Y•vÂjð§;Œ ¼ö`L¬¼ì@›•Ì=¶ MRÝ+ 8ŠŒQÍ{­-®>n~®émÎÞî]îÏ /:Á‹ÏEýb¯ŸÀôô¥¨70!Ápûvù"Ø, Â‰¢º] 'ÑÅÿ” ˈi]0Ž$Õ]jØ ä”c%[6vlH•h\ÚÄäq%F0+ ¼ ÔÚZ=²4j‚fЄgÔ öÔg—ZÅ¹ËØ(IN6³ÃŠØ‘ËÆöBiêU$©OsŠâíÕqN›®zøuƒÜ”n#1k–V¶p±Y¬Õ'°_²cÁùýçèÖáˆkk~c¼Ö±à¬ýªüö‘¥sÍ":X߬C’ý˜óYžª?³Ôú:]âÜ¡ü[vU_(‹Þm8¯oà R~ݳ®ç“ÂHC]-ø¯lÉŸ'1Š;ùñÂZs.çŽ×ûʘá“_Œ­q)äÂ×wçݹøTÚõÙÿV×µ ÷˜¨ŸEä5ƒz>•#Ivy¶ß,Æe÷Ù^Ú'Ûd½½‡•{牶^{”ÉÅ\H(¦É]†DUZBTžjÁ¶gåq|"ZV`@ŠVq*~˜¢­ð¶R™-9^sõhc–qv…д¸]sô¥“d‡Êiž€«É'fpdJ9›“!šébkÌ5õ]he‚y&NJa©e üù wçÝ#†MÖ‰f¶ç„eöö‰?ú¶¥óÉ8iž´Yé©“3±h(f’©(‘Œ†˜æ£àM‰(”ºUJåŠtz¨$¬‰Êªªµj"/MõßEQØCj¬zÿZòä²Ä¶à…Wª *{ÊÒa^ùÍɤT


This is Golly version 1.1 for iOS

© 2013 The Golly Gang:
Andrew Trevorrow, Tom Rokicki, Tim Hutton,
Dave Greene, Jason Summers, Maks Verver, Robert Munafo.



Golly is an open source, cross-platform application for
exploring the Game of Life and other cellular automata.

http://golly.sourceforge.net/
golly-2.5-src/gui-ios/Help/algos.html0000644000175100001440000000105712156145314014455 00000000000000

Algorithms

Golly can generate patterns using a number of different algorithms:

QuickLife
HashLife
Generations
JvN
RuleLoader

The same information is also available after tapping the Pattern tab's Rule button. golly-2.5-src/gui-ios/Help/archives.html0000644000175100001440000000211212156145314015145 00000000000000

Online Archives

Golly can download patterns and rules from these online archives:

LifeWiki Pattern Archive

Gliders in Life-Like Cellular Automata

Alan Hensel's Pattern Collections

Jason Summers' Pattern Collections

Rule Table Repository

Note that Golly stores downloaded files in Documents/Downloads/ so you can open them again quickly from the Open tab. golly-2.5-src/gui-ios/Help/bounded.html0000644000175100001440000005566512156145314015006 00000000000000

Bounded Grids

Bounded grids with various topologies can be created by adding a special suffix to the usual rule string. For example, B3/S23:T30,20 creates a toroidal Life universe 30 cells wide and 20 cells high. The suffix syntax is best illustrated by these examples:

:P30,20 — plane with width 30 and height 20
:P30,0 — plane with width 30 and infinite height
:T0,20 — tube with infinite width and height 20
:T30,20 — torus with width 30 and height 20
:T30+5,20 — torus with a shift of +5 on the horizontal edges
:T30,20-2 — torus with a shift of -2 on the vertical edges
:K30*,20 — Klein bottle with the horizontal edges twisted
:K30,20* — Klein bottle with the vertical edges twisted
:K30*+1,20 — Klein bottle with a shift on the horizontal edges
:C30,20 — cross-surface (horizontal and vertical edges are twisted)
:S30 — sphere with width 30 and height 30 (must be equal)

Some notes:

  • The first letter indicating the topology can be entered in lowercase but is always uppercase in the canonical string returned by the getrule() script command.
  • If a bounded grid has width w and height h then the cell in the top left corner has coordinates -int(w/2),-int(h/2).
  • The maximum width or height of a bounded grid is 2,000,000,000.
  • Use 0 to specify an infinite width or height (but not possible for a Klein bottle, cross-surface or sphere). Shifting is not allowed if either dimension is infinite.
  • Pattern generation in a bounded grid is slower than in an unbounded grid. This is because all the current algorithms have been designed to work with unbounded grids, so Golly has to do extra work to create the illusion of a bounded grid.

The different topologies are described in the following sections.

Plane

A bounded plane is a simple, flat surface with no curvature. When generating patterns in a plane, Golly ensures that all the cells neighboring the edges are set to state 0 before applying the transition rules, as in this example of a 4 by 3 plane:

 0  0  0  0  0  0 
 0  A  B  C  D  0 
 0  E  F  G  H  0 
 0  I  J  K  L  0 
 0  0  0  0  0  0 
   rule suffix is :P4,3

Torus

If the opposite edges of a bounded plane are joined then the result is a donut-shaped surface called a torus. Before applying the transition rules at each generation, Golly copies the states of edge cells into appropriate neighboring cells outside the grid. The following diagram of a 4 by 3 torus shows how the edges are joined:

 L  I  J  K  L  I 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 D  A  B  C  D  A 
   rule suffix is :T4,3

A torus can have a shift on the horizontal edges or the vertical edges, but not both. These two examples show how shifted edges are joined:

 K  L  I  J  K  L 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 A  B  C  D  A  B 
   :T4+1,3
 H  I  J  K  L  A 
 L  A  B  C  D  E 
 D  E  F  G  H  I 
 H  I  J  K  L  A 
 L  A  B  C  D  E 
   :T4,3+1

Klein bottle

If one pair of opposite edges are twisted 180 degrees (ie. reversed) before being joined then the result is a Klein bottle. Here are examples of a horizontal twist and a vertical twist:

 I  L  K  J  I  L 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 A  D  C  B  A  D 
   :K4*,3   
 D  I  J  K  L  A 
 L  A  B  C  D  I 
 H  E  F  G  H  E 
 D  I  J  K  L  A 
 L  A  B  C  D  I 
   :K4,3*

A Klein bottle can only have a shift on the twisted edges and only if that dimension has an even number of cells. Also, all shift amounts are equivalent to a shift of 1. Here are two examples:

 J  I  L  K  J  I 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 B  A  D  C  B  A 
   :K4*+1,3
 F  J  K  L  D 
 C  A  B  C  A 
 L  D  E  F  J 
 I  G  H  I  G 
 F  J  K  L  D 
 C  A  B  C  A 
   :K3,4*+1

Cross-surface

If both pairs of opposite edges are twisted and joined then the result is a cross-surface (also known as a real projective plane, but Conway prefers the term cross-surface). Here's an example showing how the edges are joined:

 A  L  K  J  I  D 
 L  A  B  C  D  I 
 H  E  F  G  H  E 
 D  I  J  K  L  A 
 I  D  C  B  A  L 
   :C4,3

Note that the corner cells have themselves as one of their neighbors. Shifting is not possible.

Sphere

If adjacent edges are joined rather than opposite edges then the result is a sphere. By convention we join the top edge to the left edge and the right edge to the bottom edge, as shown in this 3 by 3 example:

 A  A  D  G  C 
 A  A  B  C  G 
 B  D  E  F  H 
 C  G  H  I  I 
 G  C  F  I  I 
   :S3

Note that the cells in the top left and bottom right corners (the "poles") have different neighborhoods to the cells in the top right and bottom left corners. Shifting is not possible.

Example patterns using the above topologies can be found in the Open tab's supplied patterns, especially in Generations and Life/Bounded-Grids. golly-2.5-src/gui-ios/Help/changes.html0000644000175100001440000000340312156145314014755 00000000000000

Changes

Changes in version 1.1 (released June 2013)

  • This version introduces a new rule format. A file in the new format has a .rule extension and contains all the information about the rule: its name, description, table/tree data, and any color/icon information. More details can be found here.
  • The RuleTable and RuleTree algorithms have been replaced by a new algorithm called RuleLoader.
  • If the Paste button sees pasteboard text starting with "@RULE rulename" then it will save the text as Documents/Rules/rulename.rule and switch to that rule.
  • When the Rule dialog is switched to the RuleLoader algorithm it will display links to all the .rule files in Documents/Rules/ and to the supplied .rule files. Any deprecated files (.table or .tree or .colors or .icons) are automatically converted to .rule files and then deleted.
  • Icons can be displayed at scales 1:8, 1:16 and 1:32 by turning on the "Show icons" option in either the Settings tab or the Pattern tab's state picker window.
  • Fixed a bug that could cause the Undo/Redo buttons to be incorrectly enabled/disabled after tapping STOP.
  • The Open tab has READ and EDIT links that let you display or change the contents of pattern files. Only files stored in the Documents folder can be edited.
  • After tapping on a DELETE link you now get a warning dialog asking if you really want to delete the corresponding file.
  • The size of text in the Help tab has been increased.
  • Added support for file sharing using iTunes. More details here.

Version 1.0 released August 2012

golly-2.5-src/gui-ios/Help/credits.html0000644000175100001440000000526412156145314015011 00000000000000

Credits

The pioneers

First and foremost, a big thanks to John Conway for creating the Game of Life, and to Martin Gardner for popularizing the topic in his Scientific American column.

The programmers

Tom Rokicki wrote most of the complicated stuff. Golly is essentially the merging of two of Tom's programs (hlife and qlife). The HashLife algorithm is based on an idea by Bill Gosper. The QuickLife algorithm uses some ideas from Alan Hensel. David Eppstein provided the idea on how to emulate B0 rules.

Andrew Trevorrow wrote the cross-platform GUI code for the desktop version of Golly using wxWidgets. Much thanks to Julian Smart and all the other wxWidgets developers. Andrew also wrote the GUI code for the iOS version of Golly.

Tim Hutton wrote the RuleTable algorithm (now merged into the RuleLoader algorithm) and created the excellent Rule Table Repository.

Various code improvements have been contributed by Dave Greene, Jason Summers, Maks Verver and Robert Munafo.

If you'd like to join us and help make Golly the best Life/CA app in the known universe then please get in touch.

The beta testers

Thanks to all the bug hunters for their reports and suggestions, especially Dave Greene, Gabriel Nivasch, Dean Hickerson, Brice Due, David Eppstein, Tony Smith, Alan Hensel, Dennis Langdeau, Bill Gosper.

Other contributors

Dave Greene and Alan Hensel helped put together the pattern collection. Thanks to everybody who allowed us to distribute their fantastic patterns, especially Nick Gotts, Gabriel Nivasch, David Eppstein, Jason Summers, Stephen Morley, Dean Hickerson, Brice Due, William R. Buckley, David Moore, Mark Owen, Tim Hutton, Renato Nobili and Adam P. Goucher.

Thanks to Stephen Silver for compiling the wonderful Life Lexicon.

Thanks to Nathaniel Johnston for creating the brilliant LifeWiki and for making its patterns available to Golly users via an online archive.

Some of the tab bar icons are from the free set created by The Working Group. golly-2.5-src/gui-ios/Help/formats.html0000644000175100001440000010146512156145314015027 00000000000000

File Formats

Here are the important file formats used by Golly:

Extended RLE format (.rle)
Macrocell format (.mc)
Rule format (.rule)
     @RULE
     @TABLE
     @TREE
     @COLORS
     @ICONS
          Specifying icons using XPM
          Grayscale icons or multi-color icons
          Requesting built-in icons
     How Golly finds .rule files
     Related rules can share colors and/or icons
     How to override a supplied or built-in rule
     The easy way to install a new .rule file
     Deprecated files (.table, .tree, .colors, .icons)
Zip files (.zip)

Extended RLE format

Golly prefers to store patterns and pattern fragments in a simple concise textual format we call "Extended RLE" (it's a modified version of the RLE format created by Dave Buckingham). The data is run-length encoded which works well for sparse patterns while still being easy to interpret (either by a machine or by a person). The format permits retention of the most critical data:

  • The cell configuration; ie. which cells have what values.
  • The transition rule to be applied.
  • Any comments or description.
  • The generation count.
  • The absolute position on the screen.

Golly uses this format for internal cuts and pastes, which makes it very convenient to move cell configurations to and from text files. For instance, the r-pentomino is represented as

x = 3, y = 3, rule = B3/S23
b2o$2o$bo!

Pattern data in this format can be cut from a browser or email window and pasted directly into Golly.

RLE data is indicated by a file whose first non-comment line starts with "x". A comment line is either a blank line or a line beginning with "#". The line starting with "x" gives the dimensions of the pattern and usually the rule, and has the following format:

x = width, y = height, rule = rule

where width and height are the dimensions of the pattern and rule is the rule to be applied. Whitespace can be inserted at any point in this line except at the beginning or where it would split a token. The dimension data is ignored when Golly loads a pattern, so it need not be accurate, but it is not ignored when Golly pastes a pattern; it is used as the boundary of what to paste, so it may be larger or smaller than the smallest rectangle enclosing all live cells.

Any line that is not blank, or does not start with a "#" or "x " or "x=" is treated as run-length encoded pattern data. The data is ordered a row at a time from top to bottom, and each row is ordered left to right. A "$" represents the end of each row and an optional "!" represents the end of the pattern.

For two-state rules, a "b" represents an off cell, and a "o" represents an on cell. For rules with more than two states, a "." represents a zero state; states 1..24 are represented by "A".."X", states 25..48 by "pA".."pX", states 49..72 by "qA".."qZ", and on up to states 241..255 represented by "yA".."yO". The pattern reader is flexible and will permit "b" and "." interchangeably and "o" and "A" interchangeably.

Any data value or row terminator can be immediately preceded with an integer indicating a repetition count. Thus, "3o" and "ooo" both represent a sequence of three on cells, and "5$" means finish the current row and insert four blank rows, and start at the left side of the row after that.

The pattern writer attempts to keep lines about 70 characters long for convenience when sharing patterns or storing them in text files, but the reader will accept much longer lines.

Comment lines with a specific format will be added at the start of the file to convey extra information. These comment lines start with "#CXRLE" and contain keyword/value pairs. The keywords currently supported are "Pos", which denotes the absolute position of the upper left cell (which may be on or off), and "Gen", which denotes the generation count. For instance,

#CXRLE Pos=0,-1377 Gen=3480106827776

indicates that the upper left corner of the enclosing rectange is at an X coordinate of 0 and a Y coordinate of -1377, and that the pattern stored is at generation 3,480,106,827,776.

All comment lines that occur at the top or bottom of the file are treated as information lines and are displayed in a modal view when you tap the Info button in the Pattern tab's bottom toolbar. Any comment lines interspersed with the pattern data will not be displayed.

Macrocell format

The size of an Extended RLE file is frequently proportional to the number of cells it contains, yet Golly supports universes that can contain trillions of cells or more, using hashlife-based algorithms. The storage of these huge universes, for which Extended RLE is not feasible, is done by essentially dumping the in-memory compressed representation of the universe in "Macrocell format". Since little translation need be done between external and internal representation, this format is also used to store backups of universes at certain points in Golly's operation when using one of the hashlife-based algorithms.

The macrocell format has two parts: the header, and the tree. The first portion of the file is the header; this contains the format identifier, the rule, the generation count (if non-zero), and any comments associated with this file. The format identifier is a line that starts with "[M2]" and contains the name and version of the program used to write it:

[M2] (golly 2.0)

Following this is any comment lines, which are lines that begin with '#'. If the first two characters of a line are '#R', then the remainder of the line (after intervening whitespace) is the rule for the pattern. If the first two characters are '#G', then the remainder of the line is the current generation count. Any other line starting with a '#' is treated as an ordinary comment line.

Following the header is is a child-first textual representation of a canonicalized quadtree. Each line is either a leaf node, or a non-leaf node. For two-state algorithms, the leaf nodes contain an 8x8 pixel array in a simplified raster format, left-to-right, then top-down, with "." representing an empty cell, "*" representing a live cell, and "$" representing the end of line; empty cells at the end of each row are suppressed. No whitespace is permitted; lines representing leaf nodes for two-state algorithms are recognized because they start with ".", "*", or "$". A sample leaf node containing a glider is:

$$..*$...*$.***$$$$

For algorithms with more than two states, leaf nodes represent a two-by-two square of the universe. They contain five integers separated by single spaces; the first integer is 1, and the next four are the state values for the northwest, northeast, southwest, and southeast values of the square.

Nodes with children are represented by lines with five integers. The first integer is the logarithm base 2 of the size of the square this node representes; for two-state patterns, this must be 4 or larger; for multi-state patterns, this must be 2 or larger. The next four values are the node numbers of the northwest, northeast, southwest, and southeast child nodes. Each of these child nodes must be the appropriate size; that is, a square one fourth the area of the current node.

All nodes, both leaf and non-leaf, are numbered in the order they occur in the file, starting with 1. No node number can point to a node that has yet been defined. The special node number "0" is used to represent all squares that have no live cells.

The total universe represented by a macrocell file is that of the last node in the file (the root node), which also must be the single node with the largest size. By convention, the upper left cell of the southeast child of the root node is at coordinate position (x=0,y=1).

Macrocell files saved from two-state algorithms and from multi-state algorithms are not compatible.

Rule format

A .rule file contains all the information about a rule: its name, documentation, table/tree data (used by the RuleLoader algorithm), and any color/icon information. The .rule format is textual and consists of one or more sections. Each section starts with a line of the form @XXX... where X is an uppercase letter. If there is more than one section with the same name then only the first one is used. Any unrecognized sections are silently ignored (this will allow us to add new sections in the future without breaking old versions of Golly).

The currently recognized sections are described below. You might like to refer to WireWorld.rule while reading about each section.

@RULE

This is the only mandatory section. The first line of a .rule must start with @RULE followed by a space and then the rule name. For example:

@RULE WireWorld

The supplied rule name must match exactly the name of the .rule file. This helps Golly to avoid problems that can occur on case-sensitive file systems. When naming a new rule it's best to stick to the following conventions, especially if you'd like to share the .rule file with other Golly users:

  • Please capitalize all rule names and create files like Foo.rule rather than foo.rule. This helps to emphasize that rule names are important, especially on case-sensitive file systems. If the rule "foo" is specified inside a .rle or .mc file then Golly won't be able to find Foo.rule on a case-sensitive system like Linux.
  • To allow for possible future extensions in the way Golly handles rule names, it's best to use only letters and digits. Hyphens and underscores are also okay if you need some sort of separator. Hyphens can allow a set of related rules to share colors and/or icons (see below). Note in particular that spaces and colons must not be used.

After the @RULE line and before the next section (or end of file) you can include any amount of arbitrary text, so this is the place to include a description of the rule or any other documentation. If the .rule file has a @TREE section then this is a good place to put the Python transition function that was used to create the tree data.

@TABLE

This section is optional. If present, it contains a transition table that can be loaded by the RuleLoader algorithm. The contents of this section is identical to the contents of a .table file. A detailed specification of the table format is available here. This is a simple example:

# Signals (2/3) pass alongside a wire (1):
n_states:4
neighborhood:vonNeumann
symmetries:rotate4
var a={2,3}
var b={2,3}
var c={2,3}
a,0,b,1,c,b

Empty lines and anything following the hash symbol "#" are ignored. The following descriptors must appear before other content:

  • n_states: specifies the number of states in the CA (from 0 to n_states-1 inclusive).
  • neighborhood: specifies the cell neighborhood for the CA update step. Must be one of: vonNeumann, Moore, hexagonal, oneDimensional.
  • Other neighborhoods are supported through emulation, using RuleTableToTree.py, see the RoadMap for a full list.
  • symmetries: can be none, permute or one of the symmetries supported for the neighborhood you have chosen. For a full list, see the RoadMap.

After the descriptors comes the variables and transitions. Each variable line should follow the form given in the above example to list the states. Variables should appear before the first transition that uses them. Variables can be used inside later variables.

Transition lines should have states or variables separated by commas. If there are no variables and n_states is less than 11 then the commas can be omitted. Only one transition (or variable) should appear on each line. Inputs are listed in the order C,N,E,S,W,C' for the von Neumann neighborhood, C,N,NE,E,SE,S,SW,W,NW,C' for the Moore neighborhood, C,N,E,SE,S,W,NW,C' for the hexagonal neighborhood, and C,W,E,C' for the oneDimensional neighborhood.

Where the same variable appears more than once in a transition, it stands for the same state each time. For example, the transition in the example above expands to the following: 20212->2, 20213->2, 20312->3, 20313->3, 30212->2, 30213->2, 30312->3, 30313->3, and all 90-degree rotations of those (because of the rotate4 symmetry).

A transition can have a variable as its output (C') if that variable appears more than once in the transition (as in the example above), so that it has a definite value.

Rule tables usually don't specify every possible set of inputs. For those not listed, the central cell remains unchanged.

Transition rules are checked in the order given — the first rule that matches is applied. If you want, you can write rules in the form of general cases and exceptions, as long as the exceptions appear first.

(This form of CA rule table representation was inspired by that in Gianluca Tempesti's PhD thesis: http://lslwww.epfl.ch/pages/embryonics/thesis/AppendixA.html.)

To share your rule tables with others, you can archive them at the public Rule Table Repository.

@TREE

This section is optional. If present, it contains a rule tree that can be loaded by the RuleLoader algorithm. (If the .rule file also contains a @TABLE section, RuleLoader will use the first one it finds.) The contents of this section is identical to the contents of a .tree file.

Essentially, the tree format allows you to add your own rules to Golly without needing to know how to recompile Golly and without dealing with the intricacies of external libraries; it generates relatively compact files, and the data structure is designed for very fast execution.

A rule tree is nothing more than a complete transition table for a rule, expressed in a compressed, canonicalized tree format. For an n state rule, each tree node has n children; each child is either another tree node or a next state value. To look up a function of m variables, each of which is a state value, you start at the root node and select the child node corresponding to the value of the first variable. From that node, you select the child node corresponding to the value of the second variable, and so on. When you finally look up the value of the final variable in the last node, the result value is the actual next state value, rather than another node.

The tree format has fixed the order of variables used for these lookups. For a four-neighbor rule, the order is always north, west, east, south, center; for an eight-neighbor rule, the order is always northwest, northeast, southwest, southeast, north, west, east, south, center.

Without compression, for an n-state rule, there would be a total of 1+n+n^2+n^3+n^4 nodes for a four-neighbor rule, and 1+n+...+n^8 for an eight-neighbor rule; this could quickly get unmanageable. Almost all rules show significant redundancy, with identical rows in the transition table, and identical nodes in the rule tree. To compress this tree, all we do is merge identical nodes, from the bottom up. This can be done explicitly as we construct the tree from a transition function (see Rules/TreeGenerators/RuleTreeGen.java) or symbolically as we evaluate a more expressive format.

The tree format itself is simple, and has similarities to the macrocell format. It is not intended for human authorship or consumption. The tree format has two parts: a header, and the rule tree itself. The header consists of comments (lines starting with a "#") that are ignored, and three required parameter values that must be defined before the first tree node. These values are defined, one per line, starting with the parameter name, then an equals sign, and finally an integer value. The three parameters are num_states, which must be in the range 2..256 inclusive, num_neighbors, which must be 4 or 8, and num_nodes, which must match the number of node lines.

The tree is represented by a sequence of node lines. Each node line consists of exactly num_states integers separated by single spaces. The first integer of each node line is the depth of that node, which must range from 1..num_neighbors+1. The remaining integers for nodes of depth one are state values. The remaining integers for nodes of depth greater than one are node numbers. Nodes are numbered in the order they appear in the file, starting with zero; each node must be defined before its node number is used. The root node, which must be the single node at depth num_neighbors+1, must be the last node defined in the file.

@COLORS

This section is optional and can be used to specify the RGB colors for one or more states using lines with 4 numbers, like these:

0  48  48  48   dark gray
1   0 128 255   light blue
2 255 255 255   white
3 255 128   0   orange

Golly silently ignores any states that are invalid for the rule. To specify a color gradient for all live states (all states except 0) you can use a line with 6 numbers, like this:

0 0 255  255 0 0   blue to red

In both cases, any text after the final number on each line is ignored. Blank lines or lines starting with "#" are also ignored.

Note that a .rule file is loaded after switching to the current algorithm's default color scheme, so you have the choice of completely changing all the default colors, or only changing some of them.

@ICONS

This section is optional and can be used to override the default icons displayed for this rule (when Golly is in icon mode).

Specifying icons using XPM

Icon bitmaps can be specified using a simple subset of the XPM format. Here's a small example that describes two 7x7 icons suitable for a 3-state rule (icons are never used for state 0):

XPM
/* width height num_colors chars_per_pixel */
"7 14 2 1"
/* colors */
". c #000000"
"A c #FFFFFF"
/* icon for state 1 */
"A......"
".A....."
"..A...."
"...A..."
"....A.."
".....A."
"......A"
/* icon for state 2 */
"......A"
".....A."
"....A.."
"...A..."
"..A...."
".A....."
"A......"

Any blank lines or lines starting with "#" or "/" are ignored. A line with XPM by itself indicates the start of a set of icon bitmaps at a particular size. The @ICONS section can contain any number of XPM subsections, and their order is not important. Three different icon sizes are currently supported: 7x7, 15x15 and 31x31 (for displaying at scales 1:8, 1:16 and 1:32 respectively). Any missing icon sizes will be created automatically by scaling a supplied size. Scaled icons can look rather ugly, so if you want good looking icons it's best to supply all three sizes.

After seeing an XPM line, Golly then looks for lines containing strings delimited by double quotes. The first double quote must be at the start of the line (any text after the second double quote is ignored). The first string contains crucial header information in the form of 4 positive integers:

  • The 1st number is the bitmap's width which also defines the icon size. If it is not 7, 15 or 31 then Golly simply ignores the rest of the XPM data. (This provides upward compatibility if we ever decide to support more sizes.)
  • The 2nd number is the bitmap's height. This must be an integer multiple of the width — the number of icons is the height divided by the width.
  • The 3rd number is the total number of different colors used in the bitmap. After the first string comes the strings that specify each color.
  • The 4th number is the number of characters used to specify each pixel and must be 1 or 2. After the color strings comes the strings with the pixel data for each row of the bitmap. Each such string should contain width × chars_per_pixel characters.

The total number of strings after the XPM line should be 1 + num_colors + height. You'll get an error message if there aren't enough strings. Any extra strings are ignored.

The 1st icon specified is for state 1, the 2nd is for state 2, etc. If the number of icons supplied is fewer than the number of live states then the last icon is automatically duplicated. If there are more icons than required then the extra icons are simply ignored.

Grayscale icons or multi-color icons

Golly recognizes two types of icons: grayscale or multi-color. Grayscale icons only use shades of gray (including black and white), as in the above example. Any black areas will be transparent; ie. those pixels will be replaced by the color for state 0. White pixels will be replaced by the color for the cell's current state. Gray pixels are used to do anti-aliasing; ie. the darker the gray the greater the transparency. Using grayscale icons minimizes the amount of XPM data needed to describe a set of icons, especially if the icons use the same shape for each state (as in WireWorld.rule).

If a set of icons contains at least one color that isn't a shade of gray (including black or white) then the icons are said to be multi-colored. Any black pixels are still converted to the state 0 color, but non-black pixels are displayed without doing any substitutions.

If you want to use multi-colored icons then you'll probably want a @COLORS section as well so that the non-icon colors match the icon colors as closely as possible. For example, if the icon for state 1 consists of red and blue triangles then it would be best to set the color of state 1 to purple in the @COLORS section. This minimizes "color shock" when switching between icon and non-icon display mode.

Requesting built-in icons

Instead of specifying icon bitmaps using XPM data, you might prefer to use Golly's built-in grayscale icons by supplying one of the following words on a line by itself:

  • circles — circular icons (normally used for Moore neighborhood rules).
  • diamonds — diamond-shaped icons (normally used for von Neumann neighborhood rules).
  • hexagons — hexagonal icons (normally used for hexagonal neighborhood rules).
  • triangles — triangular icons (only suitable for a 4-state rule that is emulating a triangular neighborhood).

How Golly finds .rule files

There are two situations where Golly needs to look for a .rule file:

1. If the RuleLoader algorithm is asked to switch to a rule called "Foo" then it first looks for Foo.rule in Documents/Rules/. If not found, or if Foo.rule has no @TABLE or @TREE section, it will then look for Foo.rule in the supplied Rules folder. If Foo.rule doesn't exist then it will use the same search procedure to look for Foo.table, then Foo.tree.

2. After switching to a new rule (not necessarily using RuleLoader), Golly needs to look for color and/or icon information specific to that rule. A similar search procedure to the one above is used again, where this time Golly looks for any @COLORS and/or @ICONS sections in Foo.rule. (Unlike the above search, if Foo.rule is found in Documents/Rules/ but doesn't have any color/icon info then Golly will not look for Foo.rule in the supplied Rules folder.)

Related rules can share colors and/or icons

If rulename.rule is missing either the @COLORS or @ICONS section, Golly checks to see if rulename contains a hyphen. If it does then it looks for the missing color/icon data in another .rule file called prefix-shared.rule where prefix consists of all the characters before the final hyphen. (As in the above searches, it looks in Documents/Rules/ first, then in the supplied Rules folder.) This allows related rules to share a single source of colors and/or icons.

For example, suppose you have a set of related rules in files called Foo-1.rule, Foo-2.rule, etc. If you want all these rules to use the same colors then create a file called Foo-shared.rule:

@RULE Foo-shared
This file contains the colors shared by Foo-* rules.

@TABLE
n_states:3
neighborhood:Moore
symmetries:none
# do nothing

@COLORS
0 0 0 0     black
1 255 0 0   red
2 0 0 255   blue

Note that a shared .rule file should contain a valid @TABLE section with an appropriate value for n_states (the neighborhood setting doesn't really matter, as long as it's legal). This allows the RuleLoader algorithm to load it.

For another good example, see Worm-shared.rule. It contains the icons shared by all the other Worm-* rules.

How to override a supplied or built-in rule

The search procedure described above makes it easy to override a supplied .rule file, either completely or partially. For example, if you want to override the colors and icons used in the supplied WireWorld.rule then you can create a file with the same name in Documents/Rules/. Its contents might look like this:

@RULE WireWorld

@COLORS
0 0 0 0               black background
0 255 0   255 255 0   live states fade from green to yellow

@ICONS
diamonds

It's also possible to override a built-in rule (ie. a rule recognized by an algorithm other than RuleLoader). A built-in rule name can contain characters not allowed in file names ("/" and "\"), so Golly will substitute those characters with underscores when looking for the corresponding .rule file. For example, if you want to change the colors and/or icons for Life (B3/S23) then you'll need to create a file called B3_S23.rule. This example uses a multi-colored icon to show a blue sphere on a white background:

@RULE B3_S23

Override the default colors and icons for Life (B3/S23).

@COLORS

0 255 255 255   white (matches icon background below)
1 54 54 194     dark blue (average color of icon below)

@ICONS

# 7x7 and 15x15 icons will be created by scaling down this 31x31 icon:

XPM
/* width height num_colors chars_per_pixel */
"31 31 78 2"
/* colors */
".. c #FFFFFF"   white background
"BA c #CECEDE"
"CA c #7B7BAD"
"DA c #4A4A84"
"EA c #18187B"
"FA c #08006B"
"GA c #18186B"
"HA c #29297B"
"IA c #6B6BAD"
"JA c #ADADDE"
"KA c #EFF7FF"
"LA c #ADADC6"
"MA c #39398C"
"NA c #3939BD"
"OA c #7B7BCE"
"PA c #ADB5DE"
"AB c #8C8CD6"
"BB c #4A4A9C"
"CB c #18188C"
"DB c #EFEFEF"
"EB c #EFEFFF"
"FB c #525A9C"
"GB c #08088C"
"HB c #ADADE7"
"IB c #DEDEEF"
"JB c #D6D6F7"
"KB c #DEE7F7"
"LB c #BDBDEF"
"MB c #525ABD"
"NB c #21219C"
"OB c #292984"
"PB c #CECEE7"
"AC c #ADB5CE"
"BC c #2929BD"
"CC c #7B7BDE"
"DC c #BDC6E7"
"EC c #CECEF7"
"FC c #8C8CE7"
"GC c #4242C6"
"HC c #A5A5BD"
"IC c #08087B"
"JC c #3939CE"
"KC c #5A5AC6"
"LC c #BDBDF7"
"MC c #BDBDDE"
"NC c #6B6BD6"
"OC c #9494DE"
"PC c #3931DE"
"AD c #1818AD"
"BD c #2929CE"
"CD c #9C9CC6"
"DD c #10087B"
"ED c #9C9CBD"
"FD c #1818B5"
"GD c #1818C6"
"HD c #847BCE"
"ID c #181094"
"JD c #6B6BCE"
"KD c #7B7BB5"
"LD c #2121AD"
"MD c #BDC6D6"
"ND c #0808AD"
"OD c #4A42B5"
"PD c #00009C"
"AE c #3942BD"
"BE c #3129B5"
"CE c #B5B5CE"
"DE c #0000BD"
"EE c #0000CE"
"FE c #0000DE"
"GE c #42427B"
"HE c #C6CECE"
"IE c #0000EF"
"JE c #9494AD"
"KE c #F7FFEF"
"LE c #10086B"
"ME c #7B849C"
"NE c #0000F7"
/* icon for state 1 */
".............................................................."
".............................................................."
"......................BACADAEAFAGAHAIAJA......................"
"................KALAMAFANAOAJAPAJAABBBCBEAIADB................"
"..............EBFBGBNAHBIBDBJBKAKBEBJBLBMBNBOBPB.............."
"............ACHABCCCDCECIBPBJBPBIBPBJBIBECFCGCCBCAKA.........."
"..........HCICJCKCLBLCLBMCLBLBLBLBMCLBLBMCLCNCJCCBCAKA........"
"........DBOBBCJCCCJAJAJAJAJAJAJAJAJAJAJAJAJAOCJCPCICAC........"
"......KADAADBDBCABABOCABOCOCOCOCABOCABOCABCDFCJCBDBCDDBA......"
"......EDGBFDGDADCCABOAOAOAOAOAOAOAOAHDOAHDCCCCNAADGDIDMA......"
"....KAHAADFDFDADJDMBOAJDJDJDJDJDKDJDJDJDJDJDJDLDFDFDFDICBA...."
"....MDFANDNDNDADODMBMBMBMBMBMBMBKCKCMBMBMBMBODADNDNDNDGBIA...."
"....CAGBNDPDNDPDADGCODODODODODODNAODODGCODAEBCPDNDPDNDPDGA...."
"....OBPDPDNDPDNDNDADBCBEBCBEBCBCBEBCBCBCNAADPDNDNDPDPDNDICPB.."
"....ICNDNDPDNDNDNDPDNDADADADADADADADADADNDNDNDNDNDNDNDPDGBCE.."
"....FANDNDDENDNDNDDENDDENDNDNDNDNDNDNDNDNDNDNDNDNDNDNDNDGBLA.."
"....FANDDENDDEDENDDEDENDDENDDEDEDEDEDEDEDEDEDEDEDENDDEDEGBED.."
"....GANDEEDEDEDEDEDEDEDEDEDEDEDENDDENDDEDEDEDEDEDEDEDEDEGBLA.."
"....BBPDEEDEEEDEEEDEEEDEEEDEDEDEEEDEEEDEDEDEDEDEEEDEEEDEFABA.."
"....EDGBDEEEDEEEEEEEDEEEDEEEEEEEEEEEEEEEEEEEEEEEEEDEEENDGADB.."
"....KBICDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEGBDA...."
"......FBNDFEFEEEEEEEEEFEEEEEFEEEEEEEEEEEEEEEEEEEEEFEDEICHC...."
"......IBEADEFEFEEEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEDEGBGEDB...."
"........LAGBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFENDGAHE......"
"..........FBNDFEFEIEFEFEIEIEIEFEIEFEFEIEFEFEFEFEEEDDJEKE......"
"..........EBFBIDEEIEIEIEFEFEFEIEFEIEIEIEIEIEIENDLEMEKE........"
"..............CDGBDEIEIENENEIEIEIEIEIEIEIEGDPDGAJEKE.........."
"................BAOBGBADFEIENEIENEIEIEEENDFAGECEKE............"
"....................CDBBDDPDIDNDADPDICEAGEJEDB................"
"........................EBBALAEDEDHCMCDBKE...................."
".............................................................."

The easy way to install a new .rule file

Golly provides a quick and easy way to create a new .rule file in the right place. Simply copy the rule contents to the pasteboard, then tap the Paste button. If the first line of the pasteboard starts with "@RULE rulename" then Golly will save the text as Documents/Rules/rulename.rule and switch to that rule.

Deprecated files (.table, .tree, .colors, .icons)

Golly still supports the old rule-related files with extensions of .table, .tree, .colors and .icons, but their use is discouraged. When Golly opens a .zip file containing .table/tree/colors/icons files it will automatically convert them into .rule files, but only if the zip file has no .rule files. Any existing .rule files are overwritten (in case the zip file contents have changed).

Zip files

Golly can open a standard zip file and display its contents in the Help tab. It does this by building a temporary HTML file with special unzip links to each included file. Any .rule files in the zip file are automatically extracted and installed into Documents/Rules/.

A number of pattern collections in the form of zip files can be downloaded from the online archives. golly-2.5-src/gui-ios/Help/help.html0000644000175100001440000000321112156145314014272 00000000000000

Help Tab

The Help tab behaves like a simplified browser and is used to display HTML information on a variety of topics.

Special links

A number of Golly-specific links are used for various purposes:

  • edit:file
    Display the given file in a modal view.
  • get:url
    Download the specified file and process it according to its type:
    • A HTML file (.htm or .html) is displayed in the Help tab. Note that this HTML file can contain get links with partial URLs. For a good example of their use, see the LifeWiki Pattern Archive.
    • A text file (.txt or .doc or a name containing "readme") is displayed in a modal view.
    • A zip file's contents are displayed in the Help tab.
    • A rule file (.rule) is installed into Documents/Rules/ and Golly then switches to the corresponding rule.
    • A pattern file is loaded and displayed in the Pattern tab.
  • lexpatt:pattern
    Load the given Life Lexicon pattern and display it in the Pattern tab.
  • open:file
    Load the given pattern and display it in the Pattern tab.
  • rule:rulename
    Load the given rule and switch to the Pattern tab.
  • unzip:zip:file
    Extract a file from the given zip file and process it in the same manner as a get link (see above). Golly creates unzip links when it opens a zip file and displays its contents in the Help tab.
golly-2.5-src/gui-ios/Help/index.html0000644000175100001440000000230412156145314014453 00000000000000

 

 

Table of Contents

About
Introduction
Hints and Tips
Algorithms
Life Lexicon
Online Archives
Pattern Tab
Open Tab
Settings Tab
Help Tab
References
File Formats
Bounded Grids
Known Problems
Changes
Credits

golly-2.5-src/gui-ios/Help/intro.html0000644000175100001440000000334012156145314014500 00000000000000

Introduction

Golly is a cross-platform application for exploring John Conway's Game of Life and many other types of cellular automata. It's also free and open source. More details are available at the Golly web site:

http://golly.sourceforge.net/

What is Life?

The Game of Life is a simple example of a set of rules more broadly known as a "cellular automaton", or CA for short. CAs were first studied in the mid-1950s by Stanislaw Ulam and John von Neumann but became much more widely known in 1970 when Conway's Life was described by Martin Gardner in his Scientific American column.

Life is played on an arbitrary-sized grid of square cells. Each cell has two states: "dead" or "alive". The state of every cell changes from one "generation" to the next according to the states of its 8 nearest neighbors: a dead cell becomes alive (a "birth") if it has exactly 3 live neighbors; a live cell dies out if it has less than 2 or more than 3 live neighbors. The "game" of Life simply involves starting off with a pattern of live cells and seeing what happens.

Even though the rules for Life are completely deterministic, it is impossible to predict whether an arbitrary starting pattern will die out, or start oscillating, or expand forever. Life and other CAs provide a powerful demonstration of how a very simple system can generate extremely complicated results.

If you'd like to learn more about Life and other cellular automata then check out the links and books mentioned in the References, or start exploring the Life Lexicon. golly-2.5-src/gui-ios/Help/open.html0000644000175100001440000000401712156145314014310 00000000000000

Open Tab

The Open tab lets you select a pattern to load from a number of different sources:

  • The large collection of patterns supplied with the app.
  • The most recently opened patterns (from newest to oldest).
  • Patterns you have saved (stored in Documents/Saved/).
  • Patterns you have downloaded (stored in Documents/Downloads/).

In the last two cases you have the option of deleting a file by tapping on the "DELETE" link.

Text files stored in Documents have an "EDIT" link which will display the file's contents and let you edit it. The resulting view has a Save button which lets you save any changes to the original file or to a new file. Text files supplied with the app have a "READ" link so you can view the file (editing is disabled and there is no Save button).

When you tap on a link to a pattern file, Golly will load the pattern and automatically switch to the Pattern tab. (However, if you tap on a link to a zip file, Golly will switch to the Help tab and display its contents there.)

File sharing using iTunes

Golly supports the transfer of pattern files and rule files from a desktop computer to your iPad (or vice versa) by using iTunes file sharing.

A minor annoyance is that iTunes only lets you put files into the Documents folder and not inside the various sub-folders that Golly uses. But it's not really a problem because when you switch to Golly's Open tab or tap the Pattern tab's Rule button, Golly will check for files in the Documents folder and automatically move them into the appropriate sub-folders. Any rule-related files (those with extensions of .rule, .tree, .table, .colors or .icons) are moved into Documents/Rules/. All other files are assumed to be pattern files and are moved into Documents/Saved/. Note that any existing files with the same names as the files being moved will be replaced. golly-2.5-src/gui-ios/Help/pattern.html0000644000175100001440000000352312156145314015025 00000000000000

Pattern Tab

The Pattern tab lets you display, edit and generate patterns. There are three toolbars:

  • The top toolbar has buttons for generating the current pattern, changing the speed (by setting how often the pattern is rendered), and for changing the scale and/or location.
  • The middle toolbar has buttons for editing the current pattern. You can undo or redo all editing changes (and generating changes), select all of the current pattern, perform a variety of actions on the selection, paste, or change the current drawing state. The segmented buttons at the right edge of the toolbar let you choose an editing mode: drawing cells, picking cell states, selecting cells, or moving the viewport (with a one-finger drag).
  • The bottom toolbar has buttons for miscellaneous functions. You can create a new pattern, change the current rule (and/or algorithm), display comment information in the current pattern file, save the current pattern, or switch to full screen mode.

The thin area in between the top two toolbars is used to display status information about the current pattern. It consists of three lines: The 1st line shows the pattern name, the current algorithm, and the current rule. The 2nd line shows the generation count, the population (ie. number of live cells), the current scale (in cells per pixels), the current step size, and the XY location of the cell in the middle of the viewport. The 3rd line is for various messages.

The background color of the status area depends on the current algorithm: pale yellow for QuickLife, pale blue for HashLife, etc.

The large area above the bottom toolbar is for displaying the current pattern. Two-finger pinching can be used to zoom in or out, and two-finger dragging can be used to move the viewport. golly-2.5-src/gui-ios/Help/problems.html0000644000175100001440000000174112156145314015173 00000000000000

Known Problems

This section lists all known bugs and limitations. If you come across any problems not mentioned below then please report them to Andrew Trevorrow (andrew@trevorrow.com).

  • All editing operations are restricted to cells whose coordinates are within +/- 1 billion. Not much of a limitation really!
  • The QuickLife algorithm has a minor bug that can cause selecting a large pattern to appear to be incorrect. The selection is actually correct but the rectangle is slightly offset (by one pixel).

The iOS version of Golly has a number of significant limitations when compared with the desktop version:

  • No scripting.
  • No multiple layers.
  • No timelines.
  • No auto fit mode.
  • No hyperspeed mode.
  • You can't change the colors, base step, or origin.
Some of these capabilities might be added in future versions. golly-2.5-src/gui-ios/Help/refs.html0000644000175100001440000000735412156145314014315 00000000000000

References

Good web sites

Good books and magazine articles

  • "Wheels, Life and Other Mathematical Amusements" by Martin Gardner. W. H. Freeman and Company, 1983. The last three chapters are an updated collection of his superb columns from Scientific American (see below). The last chapter has an excellent bibliography.
  • "The Recursive Universe" by William Poundstone. William Morrow & Company, 1985. An entire book devoted to a discussion of cellular automata and other fascinating topics in physics and mathematics.
  • "Winning Ways", Volume 2 by Elwyn Berlekamp, John Conway and Richard Guy. Academic Press, 1982. Chapter 25 has the title "What is Life?".
  • "Cellular Automata Machines" by Tommaso Toffoli and Norman Margolus. MIT Press, 1987. Describes CAM, a machine for doing sophisticated experiments with cellular automata.
  • "A New Kind of Science" by Stephen Wolfram. Wolfram Media, 2002. Bloated and egotistical, but there is plenty of fascinating stuff.
  • Scientific American articles:
    "Mathematical Games" columns by Martin Gardner: Oct, Nov 1970, Jan, Feb, Mar, Apr, Nov 1971, Jan 1972.
    "Computer Recreations" by Brian Hayes, Mar 1984.
  • BYTE articles:
    "Some Facts of Life" by David Buckingham, Dec 1978.
    "Life Algorithms" by Mark Niemiec, Jan 1979.
golly-2.5-src/gui-ios/Help/settings.html0000644000175100001440000000027412156145314015210 00000000000000

Settings Tab

The Settings tab lets you change various options. All of these should be pretty obvious. If not, let us know! golly-2.5-src/gui-ios/Help/tips.html0000644000175100001440000000131012156145314014317 00000000000000

Hints and Tips

  • Displaying the population count can cause a significant slow-down when generating large patterns, especially when using HashLife. If you want to generate at maximum speed then hit the Full Screen button.
  • Editing operations are fastest in QuickLife.
  • Pasting large, sparse patterns is much faster when using OR mode, or if the current pattern is empty, or if the paste image is completely outside the current pattern edges.
  • After making a selection you can change its size by dragging inside the selection near a corner or edge, or move the selection by dragging near the middle.
golly-2.5-src/Help/0000755000175100001440000000000012156146014011161 500000000000000golly-2.5-src/Help/Algorithms/0000755000175100001440000000000012156146014013272 500000000000000golly-2.5-src/Help/Algorithms/Generations.html0000644000175100001440000000637212156145314016370 00000000000000 Golly Help: Generations

The Generations algorithm supports rules similar to Life but with an extra history component that allows cells to have up to 256 states. The rule notation is "0..8/1..8/n" where the 1st set of digits specify the live neighbor counts necessary for a cell to survive to the next generation. The 2nd set of digits specify the live neighbor counts necessary for a cell to be born in the next generation. The final number n specifies the maximum number of cell states (from 2 to 256).

Here are some example rules:

2367/3457/5 [Banners] - an exploding rule by Mirek Wojtowicz.
234/34678/24 [Bloomerang] - an expanding rule by John Elliott.
/2/3 [Brian's Brain] - a chaotic rule by Brian Silverman.
124567/378/4 [Caterpillars] - a chaotic rule by Mirek Wojtowicz.
23/2/8 [Cooties] - an exploding rule by Rudy Rucker.
2/13/21 [Fireworks] - an exploding rule by John Elliott.
12/34/3 [Frogs] - a chaotic rule by Scott Robert Ladd.
12345/45678/8 [Lava] - an expanding rule by Mirek Wojtowicz.
012345/458/3 [Lines] - a stable rule by Anders Starmark.
345/2/4 [Star Wars] - an exploding rule by Mirek Wojtowicz.
3456/2/6 [Sticks] - an exploding rule by Rudy Rucker.
345/26/5 [Transers] - an exploding rule by John Elliott.
1456/2356/16 [Xtasy] - an exploding rule by John Elliott.

Other rules in this family, along with more detailed descriptions, can be found at Mirek Wojtowicz's MCell website. See also the Patterns/Generations folder which contains a number of interesting patterns extracted from the MCell pattern collection. golly-2.5-src/Help/Algorithms/HashLife.html0000644000175100001440000000120512156145314015563 00000000000000 Golly Help: HashLife

HashLife uses Bill Gosper's hashlife algorithm to achieve remarkable speeds when generating patterns that have a lot of regularity in time and/or space.

HashLife supports the same set of rules as QuickLife, but with one exception: if a rule contains B0 it must also contain S8 (or S6 if the rule ends with H, or S4 if it ends with V).

Note that HashLife performs very poorly on highly chaotic patterns, so in those cases you are better off switching to QuickLife. golly-2.5-src/Help/Algorithms/JvN.html0000644000175100001440000000473612156145314014611 00000000000000 Golly Help: JvN

John von Neumann created the very first cellular automata in the 1940's, together with fellow mathematician Stanislaw Ulam.

The JvN algorithm supports 3 rules:

JvN29
The original 29-state CA as created by von Neumann. To see how his rules work, load the simpler examples first: counter-demo.rle and cell-coders-demo.rle and read their pattern info (hit the 'i' button). For a more complex example, see read-arm-demo.rle which shows one component of von Neumann's original design, the tape reader. For a complete self-replicating machine within von Neumann's CA, open sphinx.mc.gz.

Nobili32
An extension of JvN29 created by Renato Nobili in 1994. This rule adds three new states to allow signal crossing, allowing self-replicating machines to be greatly reduced in size. The example pattern construction-arm-demo.rle shows some of the crossing cells in action under this rule. The pattern NP-replicator.rle.gz shows the 1994 design that was the first implementation of von Neumann's vision of a self-reproducing universal constructor in a CA.

Hutton32
Created by Tim Hutton in 2008, this rule uses the same states as Nobili32 but has a slightly modified rule table. Examples golly-constructor.rle and Hutton-replicator.rle show what it can do.

References:

http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor
http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata
http://www.pd.infn.it/~rnobili/wjvn/index.htm
http://www.pd.infn.it/~rnobili/au_cell/
http://www.sq3.org.uk/Evolution/JvN/

golly-2.5-src/Help/Algorithms/QuickLife.html0000644000175100001440000001256512156145314015767 00000000000000 Golly Help: QuickLife

QuickLife is a fast, conventional (non-hashing) algorithm for exploring Life and other 2D outer-totalistic rules. Such rules are defined using "B0...8/S0...8" notation, where the digits after B specify the counts of live neighbors necessary for a cell to be born in the next generation, and the digits after S specify the counts of live neighbors necessary for a cell to survive to the next generation. Here are some example rules:

B3/S23 [Life]
John Conway's rule is by far the best known and most explored CA.

B36/S23 [HighLife]
Very similar to Conway's Life but with an interesting replicator.

B3678/S34678 [Day & Night]
Dead cells in a sea of live cells behave the same as live cells in a sea of dead cells.

B35678/S5678 [Diamoeba]
Creates diamond-shaped blobs with unpredictable behavior.

B2 [Seeds]
Every living cell dies every generation, but most patterns still explode.

B234 [Serviettes or Persian Rug]
A single 2x2 block turns into a set of Persian rugs.

B345/S5 [LongLife]
Oscillators with extremely long periods can occur quite naturally.

 
Emulating B0 rules

Rules containing B0 are tricky to handle in an unbounded universe because every dead cell becomes alive in the next generation. If the rule doesn't contain S8 then the "background" cells alternate from all-alive to all-dead, creating a nasty strobing effect. To avoid these problems, Golly emulates rules with B0 in the following way:

A rule containing B0 and S8 is converted into an equivalent rule (without B0) by inverting the neighbor counts, then using S(8-x) for the B counts and B(8-x) for the S counts. For example, B0123478/S01234678 (AntiLife) is changed to B3/S23 (Life) via these steps: B0123478/S01234678 -> B56/S5 -> B3/S23.

A rule containing B0 but not S8 is converted into a pair of rules (both without B0): one is used for the even generations and the other for the odd generations. The rule for even generations uses inverted neighbor counts. The rule for odd generations uses S(8-x) for the B counts and B(8-x) for the S counts. For example, B03/S23 becomes B1245678/S0145678 (even) and B56/S58 (odd).

In both cases, the replacement rule(s) generate patterns that are equivalent to the requested rule. However, you need to be careful when editing an emulated pattern in a rule that contains B0 but not S8. If you do a cut or copy then you should only paste into a generation with the same parity.

 
Von Neumann neighborhood

The above rules use the Moore neighborhood, where each cell has 8 neighbors. In the von Neumann neighborhood each cell has only the 4 orthogonal neighbors. To specify this neighborhood just append "V" to the usual "B.../S..." notation and use neighbor counts ranging from 0 to 4 (counts above 4 are silently ignored). For example, try B13/S012V or B2/S013V.

Note that when viewing patterns at scales 1:8 or 1:16 or 1:32, Golly displays diamond-shaped icons for rules using the von Neumann neighborhood and circular dots for rules using the Moore neighborhood.

 
Hexagonal neighborhood

QuickLife can emulate a hexagonal neighborhood on a square grid by ignoring the NE and SW corners of the Moore neighborhood so that every cell has 6 neighbors:

   NW N NE         NW  N
   W  C  E   ->   W  C  E
   SW S SE         S  SE
To specify a hexagonal neighborhood just append "H" to the usual "B.../S..." notation and use neighbor counts ranging from 0 to 6 (counts above 6 are silently ignored). Here's an example:
x = 7, y = 6, rule = B245/S3H
obo$4bo$2bo$bo2bobo$3bo$5bo!
Editing hexagonal patterns in a square grid can be somewhat confusing, so to help make things a bit easier Golly displays slanted hexagons (in icon mode) at scales 1:8 or 1:16 or 1:32.

 
Wolfram's elementary rules

QuickLife supports Stephen Wolfram's elementary 1D rules. These rules are specified as "Wn" where n is an even number from 0 to 254. For example:

W22
A single live cell creates a beautiful fractal pattern.

W30
Highly chaotic and an excellent random number generator.

W110
Matthew Cook proved that this rule is capable of universal computation.

The binary representation of a particular number specifies the cell states resulting from each of the 8 possible combinations of a cell and its left and right neighbors, where 1 is a live cell and 0 is a dead cell. Here are the state transitions for W30:

   111  110  101  100  011  010  001  000
    |    |    |    |    |    |    |    | 
    0    0    0    1    1    1    1    0  = 30 (2^4 + 2^3 + 2^2 + 2^1)
Note that odd-numbered rules have the same problem as B0 rules, but Golly currently makes no attempt to emulate such rules. golly-2.5-src/Help/Algorithms/RuleLoader.html0000644000175100001440000003206312156145314016144 00000000000000 Golly Help: RuleLoader

The RuleLoader algorithm allows rules to be specified in external files. Given the rule string "Foo", RuleLoader will search for a file called Foo.rule. It looks for the file in your rules folder first, then in the supplied Rules folder. The format of a .rule file is described here. A number of examples can be found in the Rules folder:

B3/S23 or Life
Conway's Life. This is the default rule for the RuleLoader algorithm and is built in (there is no corresponding .rule file).

Banks-I, Banks-II, Banks-III, Banks-IV
In 1971, Edwin Roger Banks (a student of Ed Fredkin) made simpler versions of Codd's 1968 CA, using only two states in some cases. These four rules are found in his PhD thesis. To see the rules in action, open Banks-I-demo.rle and the other examples in Patterns/Banks/.

BBM-Margolus-emulated
Ed Fredkin's Billiard Ball Model, using the Margolus neighborhood to implement a simple reversible physics of bouncing balls. In this implementation we are emulating the system using a Moore-neighborhood CA with extra states. Open BBM.rle to see the rule in action.

BriansBrain
An alternative implementation of the Generations rule /2/3.

Byl-Loop
A six state 5-neighborhood CA that supports small self-replicating loops. To see the rule in action, open Byl-Loop.rle.

Caterpillars
An alternative implementation of the Generations rule 124567/378/4.

Chou-Reggia-1 and Chou-Reggia-2
Two 5-neighborhood CA that supports tiny self-replicating loops. To see the rules in action, open Chou-Reggia-Loop-1.rle and Chou-Reggia-Loop-2.rle.

Codd
In 1968, Edgar F. Codd (who would later invent the relational database) made a simpler version of von Neumann's 29-state CA, using just 8 states. To see the rule in action, open repeater-emitter-demo.rle and the other examples in Patterns/Codd/.

Codd2
A very minor extension of Codd's transition table, to allow for some sheathing cases that were found with large patterns. See sheathing-problems.rle for a demonstration of the problem cases.

CrittersMargolus_emulated
The Critters rule is reversible and has Life-like gliders. See CrittersCircle.rle.

Devore
In 1973, John Devore altered Codd's transition table to allow for simple diodes and triodes, enabling him to make a much smaller replicator than Codd's. See Devore-rep.rle and the other examples in Patterns/Devore/.

DLA-Margolus-emulated
Diffusion-limited aggregation (DLA) is where moving particles can become stuck, forming a distinctive fractal pattern seen in several different natural physical systems. See DLA.rle.

Ed-rep
A version of Fredkin's parity rule, for 7 states. See Ed-rep.rle for an image of Ed Fredkin that photocopies itself.

Evoloop and Evoloop-finite
An extension of the SDSR Loop, designed to allow evolution through collisions. To see the rule in action, open Evoloop-finite.rle.

HPP
The HPP lattice gas. A simple model of gas particles moving at right angles at a fixed speed turns out to give an accurate model of fluid dynamics on a larger scale. Though the later FHP gas improved on the HPP gas by using a hexagonal lattice for more realistic results, the HPP gas is where things began. Open HPP-demo.rle.

Langtons-Ant
Chris Langton's other famous CA. An ant walks around on a binary landscape, collecting and depositing pheremones. See Langtons-Ant.rle.

Langtons-Loops
The original loop. Chris Langton adapted Codd's 1968 CA to support a simple form of self-replication based on a circulating loop of instructions. To see the rule in action, open Langtons-Loops.rle.

LifeHistory
A 7-state extension of the HistoricalLife rule from MCell, allowing for on and off marked cells (states 3 and 4) as well as the history envelope (state 2). State 3 is useful for labels and other identifying marks, since an active pattern can touch or even cross it without being affected. State 5 is an alternate marked ON state most often used to mark a 'starting' location; once a cell changes to state 2, it can not return to this start state. State 6 cells kill any adjacent live cells; they are intended to be used as boundaries between subpatterns, e.g. in an active stamp collection where flying debris from one subpattern might adversely affect another subpattern. See Herschel-conduit-stamp-collection.rle for an example using all of LifeHistory's extra states.

LifeOnTheEdge
A CA proposed by Franklin T. Adams-Watters in which all the action occurs on the edges of a square grid. Each edge can be on or off and has six neighbors, three at each end. An edge is on in the next generation iff exactly two of the edges in its seven edge neighborhood (including the edge itself) are on. This implementation has 3 live states with suitable icons that allow any pattern of edges to be created. Open life-on-the-edge.rle.

LifeOnTheSlope
The same behavior as LifeOnTheEdge but patterns are rotated by 45 degrees. This implementation has only 2 live states (with icons \ and /), so it's a lot easier to enter patterns and they run faster. Open life-on-the-slope.rle.

Perrier
Perrier extended Langton's Loops to allow for universal computation. See Perrier-Loop.rle.

Sand-Margolus-emulated
MCell's Sand rule is a simple simulation of falling sand particles. See Sand.rle.

SDSR-Loop
An extension of Langton's Loops, designed to cause dead loops to disappear, allowing other loops to replicate further. To see the rule in action, open SDSR-Loop.rle.

StarWars
An alternative implementation of the Generations rule 345/2/4.

Tempesti
A programmable loop that can construct shapes inside itself after replication. To see the rule in action, open Tempesti-Loop.rle. This loop prints the letters 'LSL' inside each copy — the initials of Tempesti's university group.

TMGasMargolus_emulated
A different version of the HPP gas, implemented in the Margolus neighborhood, see TMGas.rle.

TripATronMargolus_emulated
The Trip-A-Tron rule in the Margolus neighborhood. See TripATron.rle.

WireWorld
A 4-state CA created by Brian Silverman. WireWorld models the flow of currents in wires and makes it relatively easy to build logic gates and other digital circuits. Open primes.mc and the other examples in Patterns/WireWorld/.

Worm-1040512, Worm-1042015, Worm-1042020, Worm-1252121, Worm-1525115
Examples of Paterson's Worms, a simulation created by Mike Paterson in which a worm travels around a triangular grid according to certain rules. There's also a rule called Worm-complement which can be used to show the uneaten edges within a solid region. Open worm-1040512.rle and the other examples in Patterns/Patersons-Worms/.

References:

Banks-I, Banks-II, Banks-III, Banks-IV (1971)
E. R. Banks. "Information Processing and Transmission in Cellular Automata" PhD Thesis, MIT, 1971.

Byl-Loop (1989)
J. Byl. "Self-Reproduction in small cellular automata." Physica D, Vol. 34, pages 295-299, 1989.

Chou-Reggia-1 and Chou-Reggia-2 (1993)
J. A. Reggia, S. L. Armentrout, H.-H. Chou, and Y. Peng. "Simple systems that exhibit self-directed replication." Science, Vol. 259, pages 1282-1287, February 1993.

Codd (1968)
E. F. Codd, "Cellular Automata" Academic Press, New York, 1968.

Devore (1973)
Devore, J. and Hightower, R. (1992) "The Devore variation of the Codd self-replicating computer" Third Workshop on Artificial Life, Santa Fe, New Mexico, Original work carried out in the 1970s though apparently never published. Reported by John R. Koza, "Artificial life: spontaneous emergence of self-replicating and evolutionary self-improving computer programs," in Christopher G. Langton, Artificial Life III, Proc. Volume XVII Santa Fe Institute Studies in the Sciences of Complexity, Addison-Wesley Publishing Company, New York, 1994, p. 260.

Evoloop (1999)
Hiroki Sayama "Toward the Realization of an Evolving Ecosystem on Cellular Automata", Proceedings of the Fourth International Symposium on Artificial Life and Robotics (AROB 4th '99), M. Sugisaka and H. Tanaka, eds., pp.254-257, Beppu, Oita, Japan, 1999.

HPP (1973)
J. Hardy, O. de Pazzis, and Y. Pomeau. J. Math. Phys. 14, 470, 1973.

Langtons-Ant (1986)
C. G. Langton. "Studying artificial life with cellular automata" Physica D 2(1-3):120-149, 1986.

Langtons-Loops (1984)
C. G. Langton. "Self-reproduction in cellular automata." Physica D, Vol. 10, pages 135-144, 1984.

Paterson's Worms (1973)
See these sites for a good description and the latest results:
http://www.maa.org/editorial/mathgames/mathgames_10_24_03.html
http://wso.williams.edu/~Ebchaffin/patersons_worms/
http://tomas.rokicki.com/worms.html

Perrier (1996)
J.-Y. Perrier, M. Sipper, and J. Zahnd. "Toward a viable, self-reproducing universal computer" Physica D 97: 335-352. 1996

SDSR-Loop (1998)
Hiroki Sayama. "Introduction of Structural Dissolution into Langton's Self-Reproducing Loop." Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, C. Adami, R. K. Belew, H. Kitano, and C. E. Taylor, eds., pp.114-122, Los Angeles, California, 1998, MIT Press.

Tempesti (1995)
G. Tempesti. "A New Self-Reproducing Cellular Automaton Capable of Construction and Computation". Advances in Artificial Life, Proc. 3rd European Conference on Artificial Life, Granada, Spain, June 4-6, 1995, Lecture Notes in Artificial Intelligence, 929, Springer Verlag, Berlin, 1995, pp. 555-563.

WireWorld (1987)
A. K. Dewdney, Computer Recreations. Scientific American 282:136-139, 1990. golly-2.5-src/Help/Lexicon/0000755000175100001440000000000012156146014012562 500000000000000golly-2.5-src/Help/Lexicon/lex_1.htm0000644000175100001440000001072712156145314014235 00000000000000 Life Lexicon (1)

Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:101 (p5) Found by Achim Flammenkamp in August 1994. The name was suggested by Bill Gosper, noting that the phase shown below displays the period in binary.


....OO......OO....
...O.O......O.O...
...O..........O...
OO.O..........O.OO
OO.O.O..OO..O.O.OO
...O.O.O..O.O.O...
...O.O.O..O.O.O...
OO.O.O..OO..O.O.OO
OO.O..........O.OO
...O..........O...
...O.O......O.O...
....OO......OO....

:1-2-3 (p3) Found by Dave Buckingham, August 1972. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are stillater and cuphook.


..OO......
O..O......
OO.O.OO...
.O.O..O...
.O....O.OO
..OOO.O.OO
.....O....
....O.....
....OO....

:1-2-3-4 (p4) See also Achim's p4.


.....O.....
....O.O....
...O.O.O...
...O...O...
OO.O.O.O.OO
O.O.....O.O
...OOOOO...
...........
.....O.....
....O.O....
.....O.....

:14-ner = fourteener

:2 eaters = two eaters

:4-8-12 diamond The following pure glider generator.


....OOOO....
............
..OOOOOOOO..
............
OOOOOOOOOOOO
............
..OOOOOOOO..
............
....OOOO....

:4 boats (p2)


...O....
..O.O...
.O.OO...
O.O..OO.
.OO..O.O
...OO.O.
...O.O..
....O...

:4F = Fast Forward Force Field


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_a.htm0000644000175100001440000003132012156145314014305 00000000000000 Life Lexicon (A)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Achim's p144 (p144) This was found (minus the blocks shown below) on a cylinder of width 22 by Achim Flammenkamp in July 1994. Dean Hickerson reduced it to a finite form using figure-8s the same day. The neater finite form shown here - replacing the figure-8s with blocks - was found by David Bell in August 1994. See factory for a use of this oscillator.


OO........................OO
OO........................OO
..................OO........
.................O..O.......
..................OO........
..............O.............
.............O.O............
............O...O...........
............O..O............
............................
............O..O............
...........O...O............
............O.O.............
.............O..............
........OO..................
.......O..O.................
........OO..................
OO........................OO
OO........................OO

:Achim's p16 (p16) Found by Achim Flammenkamp, July 1994.


.......OO....
.......O.O...
..O....O.OO..
.OO.....O....
O..O.........
OOO..........
.............
..........OOO
.........O..O
....O.....OO.
..OO.O....O..
...O.O.......
....OO.......

:Achim's p4 (p4) Dave Buckingham found this in a less compact form (using two halves of sombreros) in 1976. The form shown here was found by Achim Flammenkamp in 1988. The rotor is two copies of the rotor of 1-2-3-4, so the oscillator is sometimes called the "dual 1-2-3-4".


..OO...OO..
.O..O.O..O.
.O.OO.OO.O.
OO.......OO
..O.O.O.O..
OO.......OO
.O.OO.OO.O.
.O..O.O..O.
..OO...OO..

:Achim's p5 = pseudo-barberpole

:Achim's p8 (p8) Found by Achim Flammenkamp, July 1994.


.OO......
O........
.O...O...
.O...OO..
...O.O...
..OO...O.
...O...O.
........O
......OO.

:acorn (stabilizes at time 5206) A methuselah found by Charles Corderman.


.O.....
...O...
OO..OOO

:A for all (p6) Found by Dean Hickerson in March 1993.


....OO....
...O..O...
...OOOO...
.O.O..O.O.
O........O
O........O
.O.O..O.O.
...OOOO...
...O..O...
....OO....

:against-the-grain grey ship A grey ship in which the region of density 1/2 consists of lines of ON cells lying perpendicular to the direction in which the spaceship moves. See also with-the-grain grey ship.

:agar Any pattern covering the whole plane that is periodic in both space and time. The simplest (nonempty) agar is the stable one extended by the known spacefillers. For some more examples see chicken wire, houndstooth agar, onion rings, squaredance and Venetian blinds. Tiling the plane with the pattern O......O produces another interesting example: a p6 agar which has a phase of density 3/4, which is the highest yet obtained for any phase of an oscillating pattern.

:aircraft carrier (p1) This is the smallest still life that has more than one island.


OO..
O..O
..OO

:airforce (p7) Found by Dave Buckingham in 1972. The rotor consists of two copies of that used in the burloaferimeter.


.......O......
......O.O.....
.......O......
..............
.....OOOOO....
....O.....O.OO
...O.OO...O.OO
...O.O..O.O...
OO.O...OO.O...
OO.O.....O....
....OOOOO.....
..............
......O.......
.....O.O......
......O.......

:AK47 reaction The following reaction (found by Rich Schroeppel and Dave Buckingham) in which a honey farm predecessor, catalysed by an eater and a block, reappears at another location 47 generations later, having produced a glider and a traffic light. This is the basis of a very small (but pseudo) p94 glider gun found by Paul Callahan in July 1994, and was in 1990 the basis for the Dean Hickerson's construction of the first true p94 gun. (This latter gun was enormous, and has now been superseded by comparatively small Herschel loop guns.)


.....O....
....O.O...
...O...O..
...O...O..
...O...O..
....O.O...
.....O....
..........
..OO......
...O......
OOO.....OO
O.......OO

:Al Jolson = Jolson

:almosymmetric (p2) Found in 1971.


....O....
OO..O.O..
O.O......
.......OO
.O.......
O......O.
OO.O.O...
.....O...

:anteater A pattern that consumes ants.

:antlers = moose antlers

:ants (p5 wick) The standard form is shown below. It is also possible for any ant to be displaced by one or two cells relative to either or both of its neighbouring ants. Dean Hickerson found fenceposts for both ends of this wick in October 1992 and February 1993. See electric fence, and also wickstretcher.


OO...OO...OO...OO...OO...OO...OO...OO...OO..
..OO...OO...OO...OO...OO...OO...OO...OO...OO
..OO...OO...OO...OO...OO...OO...OO...OO...OO
OO...OO...OO...OO...OO...OO...OO...OO...OO..

:antstretcher Any wickstretcher that stretches ants.

:anvil The following induction coil.


.OOOO.
O....O
.OOO.O
...O.OO

:APPS (c/5 orthogonally, p30) An asymmetric PPS. The same as the SPPS, but with the two halves 15 generations out of phase with one another. Found by Alan Hensel in May 1998.

:ark A pair of mutually stabilizing switch engines. The archetype is Noah's ark. The diagram below shows an ark found by Nick Gotts that takes until generation 736692 to stabilize, and can therefore be considered as a methuselah.


...........................O....
............................O...
.............................O..
............................O...
...........................O....
.............................OOO
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
................................
OO..............................
..O.............................
..O.............................
...OOOO.........................

:arm A long extension hanging off from the main body of a spaceship or puffer perpendicular to the direction of travel.

A lot of known spaceships have multiple arms. This is an artefact of the search methods used to find such spaceships, rather than an indication of what a "typical" spaceship might look like.

:ash The (stable or oscillating) debris left by a random reaction. Experiments show that for random soups with moderate initial densities (say 0.25 to 0.5) the resulting ash has a density of about 0.0287. (This is, of course, based on what happens in finite fields. In infinite fields the situation may conceivably be different in the long run because of the effect of certain initially very rare objects such as replicators.)

:aVerage (p5) Found by Dave Buckingham, 1973. The average number of live rotor cells is five (V), which is also the period.


...OO........
....OOO......
..O....O.....
.O.OOOO.O....
.O.O....O..O.
OO.OOO..O.O.O
.O.O....O..O.
.O.OOOO.O....
..O....O.....
....OOO......
...OO........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_b.htm0000644000175100001440000010644212156145314014316 00000000000000 Life Lexicon (B)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:B = B-heptomino

:B29 (c/4 diagonally, p4) The following spaceship, found by Hartmut Holzwart in September 2004.


.......OOO.......
.......O.........
OOO......O.......
O......O.O.......
.O....OO.OOOO....
...OOOO.OOOOO.OO.
....OO.......OO.O

:B-52 bomber The following p104 double-barrelled glider gun. It uses a B-heptomino and emits one glider every 52 generations. It was found by Noam Elkies in March 1996, except that Elkies used blockers instead of molds, the improvement being found by David Bell later the same month.


.OO....................................
.OO.................O..................
...................O.O............O.O..
....................O............O.....
OO.......OO.......................O..O.
OO.O.....OO.......................O.O.O
...O.......................O.......O..O
...O.......................OO.......OO.
O..O.................OO.....O..........
.OO..................O.................
.....................OOO...............
....................................OO.
....................................OO.
.OO....................................
O..O...................................
O.O.O................O.O....OO.....OO..
.O..O.................OO....OO.....OO.O
.....O............O...O...............O
..O.O............O.O..................O
..................O................O..O
....................................OO.

:babbling brook Any oscillator whose rotor consists of a string of cells each of which is adjacent to exactly two other rotor cells, except for the endpoints which are adjacent to only one other rotor cell. Compare muttering moat. Examples include the beacon, the great on-off, the light bulb and the spark coil. The following less trivial example (by Dean Hickerson, August 1997) is the only one known with more than four cells in its rotor. It is p4 and has a 6-cell rotor.


.......O........
.....OOO....OO..
....O...OO..O...
.O..O.OO..O.O...
O.O.O....OO..OO.
.OO..OO....O.O.O
...O.O..OO.O..O.
...O..OO...O....
..OO....OOO.....
........O.......

:backrake Another term for a backwards rake. A p8 example by Jason Summers is shown below. See total aperiodic for a p12 example.


.....OOO...........OOO.....
....O...O.........O...O....
...OO....O.......O....OO...
..O.O.OO.OO.....OO.OO.O.O..
.OO.O....O.OO.OO.O....O.OO.
O....O...O..O.O..O...O....O
............O.O............
OO.......OO.O.O.OO.......OO
............O.O............
......OOO.........OOO......
......O...O.........O......
......O.O....OOO...........
............O..O....OO.....
...............O...........
...........O...O...........
...........O...O...........
...............O...........
............O.O............

:backward glider A glider which moves at least partly in the opposite direction to the puffer(s) or spaceship(s) under consideration.

:baker (c p4 fuse) A fuse by Keith McClelland.


..............OO
.............O.O
............O...
...........O....
..........O.....
.........O......
........O.......
.......O........
......O.........
.....O..........
....O...........
...O............
OOO.............
.O..............

:baker's dozen (p12) A loaf hassled by two blocks and two caterers. The original form (using p4 and p6 oscillators to do the hassling) was found by Robert Wainwright in August 1989.


OO.........OO..........
OOOO.O.....OO..........
O.O..OOO...............
...........O...........
....OO....O.O..........
....O.....O..O....O....
...........OO....OO....
.......................
...............OOO..O.O
..........OO.....O.OOOO
..........OO.........OO

:bakery (p1) A common formation of two bi-loaves.


....OO....
...O..O...
...O.O....
.OO.O...O.
O..O...O.O
O.O...O..O
.O...O.OO.
....O.O...
...O..O...
....OO....

:barberpole Any p2 oscillator in the infinite sequence bipole, tripole, quadpole, pentapole, hexapole, heptapole ... (It wasn't my idea to suddenly change from Latin to Greek.) This sequence of oscillators was found by the MIT group in 1970. The term is also used (usually in the form "barber pole") to describe other extensible sections of oscillators or spaceships, especially those (usually of period 2) in which all generations look alike except for a translation and/or rotation/reflection.

:barberpole intersection = quad

:barber's pole = barberpole

:barge (p1)


.O..
O.O.
.O.O
..O.

:basic shuttle = queen bee shuttle

:beacon (p2) The third most common oscillator. Found by Conway, March 1970.


OO..
O...
...O
..OO

:beacon maker (c p8 fuse)


..............OO
.............O.O
............O...
...........O....
..........O.....
.........O......
........O.......
.......O........
......O.........
.....O..........
....O...........
...O............
OOO.............
..O.............
..O.............

:beehive (p1) The second most common still life.


.OO.
O..O
.OO.

:beehive and dock (p1)


...OO.
..O..O
...OO.
......
.OOOO.
O....O
OO..OO

:beehive on big table = beehive and dock

:beehive pusher = hivenudger

:beehive with tail (p1)


.OO...
O..O..
.OO.O.
....O.
....OO

:belly spark The spark of a MWSS or HWSS other than the tail spark.

:bent keys (p3) Found by Dean Hickerson, August 1989. See also odd keys and short keys.


.O........O.
O.O......O.O
.O.OO..OO.O.
....O..O....
....O..O....

:B-heptomino (stabilizes at time 148) This is a very common pattern. It often arises with the cell at top left shifted one space to the left, which does not affect the subsequent evolution. B-heptominoes acquired particular importance in 1996 due to Dave Buckingham's work on B tracks - see in particular My Experience with B-heptominos in Oscillators.


O.OO
OOO.
.O..

:B-heptomino shuttle = twin bees shuttle

:bi-block (p1) The smallest pseudo still life.


OO.OO
OO.OO

:bi-boat = boat-tie

:biclock The following pure glider generator consisting of two clocks.


..O....
OO.....
..OO...
.O...O.
...OO..
.....OO
....O..

:big beacon = figure-8

:big fish = HWSS

:big glider (c/4 diagonally, p4) This was found by Dean Hickerson in December 1989 and was the first known diagonal spaceship other than the glider.


...OOO............
...O..OOO.........
....O.O...........
OO.......O........
O.O....O..O.......
O........OO.......
.OO...............
.O..O.....O.OO....
.O.........OO.O...
...O.O......OO..O.
....OO.O....OO...O
........O.......O.
.......OOOO...O.O.
.......O.OO...OOOO
........O...OO.O..
.............OO...
.........O.OOO....
..........O..O....

:big S (p1)


....OO.
...O..O
...O.OO
OO.O...
O..O...
.OO....

:big table = dock

:billiard table configuration Any oscillator in which the rotor is enclosed within the stator. Examples include airforce, cauldron, clock II, Hertz oscillator, negentropy, pinwheel, pressure cooker and scrubber.

:bi-loaf This term has been used in at least three different senses. A bi-loaf can be half a bakery:


.O.....
O.O....
O..O...
.OO.O..
...O.O.
...O..O
....OO.
or it can be the following much less common still life:

..O....
.O.O...
O..O...
.OO.OO.
...O..O
...O.O.
....O..
or the following pure glider generator:

..O.
.O.O
O..O
.OO.
O..O
O.O.
.O..

:bipole (p2) The barberpole of length 2.


OO...
O.O..
.....
..O.O
...OO

:bi-pond (p1)


.OO....
O..O...
O..O...
.OO.OO.
...O..O
...O..O
....OO.

:bi-ship = ship-tie

:bit A live cell.

:biting off more than they can chew (p3) Found by Peter Raynham, July 1972.


O...........
OOO.........
...O........
..OO........
...OO.......
....OO......
...O..O.....
...O..OO....
....OO.OOO..
........O.O.
..........O.
..........OO

:Black&White = Immigration

:blasting cap The pi-heptomino (after the shape at generation 1). A term used at MIT and still occasionally encountered.

:blinker (p2) The smallest and most common oscillator. Found by Conway, March 1970.


OOO

:blinker puffer Any puffer whose output is blinkers. However, the term is particularly used for p8 c/2 puffers. The first such blinker puffer was found by Robert Wainwright in 1984, and was unexpectedly simple:


...O.....
.O...O...
O........
O....O...
OOOOO....
.........
.........
.........
.OO......
OO.OOO...
.OOOO....
..OO.....
.........
.....OO..
...O....O
..O......
..O.....O
..OOOOOO.
Since then many more blinker puffers have been found. The following one was found by David Bell in 1992 when he was trying to extend an x66:

.............OOO.
............OOOOO
...........OO.OOO
............OO...
.................
.................
.........O.O.....
..O.....O..O.....
.OOOOO...O.O.....
OO...OO.OO.......
.O.......O.......
..OO..O..O.......
..........O......
..OO..O..O.......
.O.......O.......
OO...OO.OO.......
.OOOOO...O.O.....
..O.....O..O.....
.........O.O.....
.................
.................
............OO...
...........OO.OOO
............OOOOO
.............OOO.
The importance of this larger blinker puffer (and others like it), is that the engine which produces the blinker output is only p4. The blinker row produced by the puffer can easily be ignited, and burns cleanly with a speed of 2c/3. When the burning catches up to the engine, it causes a phase change in the puffer. This fact allows p8 blinker puffers to be used to construct rakes of all periods which are large multiples of four.

:blinkers bit pole (p2) Found by Robert Wainwright, June 1977.


.....OO
OOO.O.O
.......
.O.O..O
O....O.
OO...O.

:blinker ship A growing spaceship in which the wick consists of a line of blinkers. An example by Paul Schick based on his Schick engine is shown below. Here the front part is p12 and moves at c/2, while the back part is p26 and moves at 6c/13. Every 156 generations 13 blinkers are created and 12 are destroyed, so the wick becomes one blinker longer.


..........OOOO.............
..........O...O............
..........O................
.OO........O..O............
OO.OO......................
.OOOO...O..................
..OO...O.OO........O....OOO
......O...O........O....O.O
..OO...O.OO........O....OOO
.OOOO...O..................
OO.OO......................
.OO........O..O............
..........O................
..........O...O............
..........OOOO.............

:block (p1) The most common still life.


OO
OO

:blockade (p1) A common formation of four blocks. The final form of lumps of muck.


OO.....................
OO.....................
.......................
.......................
.OO.................OO.
.OO.................OO.
.......................
.......................
.....................OO
.....................OO

:block and dock (p1)


...OO.
...OO.
......
.OOOO.
O....O
OO..OO

:block and glider (stabilizes at time 106)


OO..
O.O.
..OO

:blocker (p8) Found by Robert Wainwright. See also filter.


......O.O.
.....O....
OO..O....O
OO.O..O.OO
....OO....

:block on big table = block and dock

:block on table (p1)


..OO
..OO
....
OOOO
O..O

:block pusher A pattern emitting streams of gliders which can repeatedly push a block further away. This can be used as part of a sliding block memory.

The following pattern, in which three gliders push a block one cell diagonally, is an example of how a block pusher works.


...................O.O
...................OO.
....................O.
......................
......................
......................
...O..................
..O...................
..OOO.................
......................
......................
......................
......................
OO...O................
OO...O.O..............
.....OO...............

:blom (stabilizes at time 23314) The following methuselah, found by Dean Hickerson in July 2002.


O..........O
.OOOO......O
..OO.......O
..........O.
........O.O.

:blonk A block or a blinker. This term is mainly used in the context of sparse Life and was coined by Rich Schroeppel in September 1992.

:blonker (p6) The following oscillator, found by Nicolay Beluchenko in April 2004.


O..OO....O..
OO..O.OO.O..
....O.O.....
.....OO.....
.......O....
.......O...O
.........O.O
..........O.

:boat (p1) The only 5-cell still life.


OO.
O.O
.O.

:boat-bit A binary digit represented by the presence of a boat next to a snake (or other suitable object, such as an aircraft carrier). The bit can be toggled by a glider travelling along a certain path. A correctly timed glider on a crossing path can detect whether the transition was from 1 to 0 (in which case the crossing glider is deleted) or from 0 to 1 (in which case it passes unharmed). Three gliders therefore suffice for a non-destructive read. The mechanisms involved are shown in the diagram below. Here the bit is shown in state 0. It is about to be set to 1 and then switched back to 0 again. The first crossing glider will survive, but the second will be destroyed. (In January 1997 David Bell found a method of reading the bit while setting it to 0. A MWSS is fired at the boat-bit. If it is already 0 then the MWSS passes unharmed, but if it is 1 then the boat and the MWSS are destroyed and, with the help of an eater1, converted into a glider which travels back along exactly the same path that is used by the gliders that toggle the boat-bit.)


......O..................
.......O.................
.....OOO.................
.........................
.........................
.........................
.........................
.........................
.........................
.........................
................O........
..............O.O........
..........OO...OO........
...........OO............
..........O..........O.OO
.....................OO.O
.........................
.........................
.........................
.........................
.........................
.O.......................
.OO......................
O.O......................

:boat maker (c p4 fuse)


................OO
...............O.O
..............O...
.............O....
............O.....
...........O......
..........O.......
.........O........
........O.........
.......O..........
......O...........
.....O............
OOOOO.............
....O.............
....O.............
....O.............
....O.............

:boat on boat = boat-tie

:boat-ship-tie = ship tie boat

:boatstretcher See tubstretcher.

:boat-tie (p1) A 10-cell still life consisting of two boats placed tip-to-tip. The name is a pun on "bow tie".


.O....
O.O...
.OO...
...OO.
...O.O
....O.

:boojum reflector (p1) Dave Greene's name for the following reflector which he found in April 2001, and which is currently the smallest known stable reflector.


....O.O......OO.............................
.....OO......OO.............................
.....O......................................
............................................
............................................
............................................
............................................
............................................
............................................
........................................O...
.......................................O.O..
.......................................O.O..
....................OO................OO.OO.
....................OO......................
......................................OO.OO.
..OO..................................OO.O..
.O.O.......................................O
.O........................................OO
OO..........................................
............................................
..................................OO........
..................................OO....OO..
...........OO...........................O.O.
..........O.O.............................O.
..........O...............................OO
.........OO.......................OO........
..................................OO........
............................................
............................................
.............................O..............
............................O.O.............
.............................O..............

:bookend The following induction coil. It is generation 1 of century.


..OO
O..O
OOO.

:bookends (p1)


OO...OO
O.O.O.O
..O.O..
.OO.OO.

:boss (p4) Found by Dave Buckingham, 1972.


.....O.....
....O.O....
....O.O....
...OO.OO...
..O.....O..
.O.O.O.O.O.
.O.O...O.O.
OO.O...O.OO
O..O.O.O..O
..O.....O..
...OO.OO...
....O.O....
....O.O....
.....O.....

:bottle (p8) Found by Achim Flammenkamp in August 1994. The name is a back-formation from ship in a bottle.


....OO......OO....
...O..O....O..O...
...O.O......O.O...
.OO..OOO..OOO..OO.
O......O..O......O
O.OO..........OO.O
.O.O..........O.O.
...OO........OO...
..................
..................
...OO........OO...
.O.O..........O.O.
O.OO..........OO.O
O......O..O......O
.OO..OOO..OOO..OO.
...O.O......O.O...
...O..O....O..O...
....OO......OO....

:bounding box The smallest rectangular array of cells that contains the whole of a given pattern. For oscillators and guns this usually is meant to include all phases of the pattern, but excludes, in the case of guns, the outgoing stream(s).

:bow tie = boat-tie

:brain (c/3 orthogonally, p3) Found by David Bell, May 1992.


.OOO.........OOO.
O.O.OO.....OO.O.O
O.O.O.......O.O.O
.O.OO.OO.OO.OO.O.
.....O.O.O.O.....
...O.O.O.O.O.O...
..OO.O.O.O.O.OO..
..OOO..O.O..OOO..
..OO..O...O..OO..
.O....OO.OO....O.
.O.............O.

:breeder Any pattern whose population grows at a quadratic rate, although it is usual to exclude spacefillers. It is easy to see that this is the fastest possible growth rate.

The term is also sometimes used to mean specifically the breeder created by Bill Gosper's group at MIT, which was the first known pattern exhibiting superlinear growth.

There are four basic types of breeder, known as MMM, MMS, MSM and SMM (where M=moving and S=stationary). Typically an MMM breeder is a rake puffer, an MMS breeder is a puffer producing puffers which produce stationary objects (still lifes and/or oscillators), an MSM breeder is a gun puffer and an SMM breeder is a rake gun. There are, however, less obvious variants of these types. The original breeder was of type MSM (a p64 puffer puffing p30 glider guns).

The known breeder with the smallest initial population is the metacatacryst.

:bridge A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects joined edge to edge, as in snake bridge snake.

:broken lines A pattern constructed by Dean Hickerson in May 2005 which produces complex broken lines of gliders and blocks.

:broth = soup

:BTC = billiard table configuration

:B track A track for B-heptominoes. The term is more-or-less synonymous with Herschel track, since a B-heptomino becomes a Herschel plus a block in twenty generations.

:buckaroo A queen bee shuttle stabilized at one end by an eater in such a way that it can turn a glider, as shown below. This was found by Dave Buckingham in the 1970s. The name is due to Bill Gosper.


..O.....................
O.O.....................
.OO.....................
...........O............
.........O.O............
........O.O.............
.......O..O...........OO
........O.O...........OO
...OO....O.O............
..O.O......O............
..O.....................
.OO.....................

:bullet heptomino Generation 1 of the T-tetromino.


.O.
OOO
OOO

:bun The following induction coil. By itself this is a common predecessor of the honey farm. See also cis-mirrored R-bee.


.OO.
O..O
.OOO

:bunnies (stabilizes at time 17332) This is a parent of rabbits and was found independently by Robert Wainwright and Andrew Trevorrow.


O.....O.
..O...O.
..O..O.O
.O.O....

:burloaf = loaf

:burloaferimeter (p7) Found by Dave Buckingham in 1972. See also airforce.


....OO....
.....O....
....O.....
...O.OOO..
...O.O..O.
OO.O...O.O
OO.O....O.
....OOOO..
..........
....OO....
....OO....

:bushing That part of the stator of an oscillator which is adjacent to the rotor. Compare casing.

:butterfly The following pattern, or the formation of two beehives that it evolves into after 33 generations. (Compare teardrop, where the beehives are five cells closer together.)


O...
OO..
O.O.
.OOO

:by flops (p2) Found by Robert Wainwright.


...O..
.O.O..
.....O
OOOOO.
.....O
.O.O..
...O..

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_bib.htm0000644000175100001440000001034312156145314014623 00000000000000 Life Lexicon (Bibliography)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

BIBLIOGRAPHY

David I. Bell, Spaceships in Conway's Life. Series of articles posted on comp.theory.cell-automata, Aug-Oct 1992. Now available from his web-site.

David I. Bell, Speed c/3 Technology in Conway's Life, 17 December 1999. Available from his web-site.

Elwyn R. Berlekamp, John H. Conway and Richard K. Guy, Winning Ways for your Mathematical Plays, II: Games in Particular. Academic Press, 1982.

David J Buckingham, Some Facts of Life. BYTE, December 1978.

Dave Buckingham, My Experience with B-heptominos in Oscillators. 12 October 1996. Available from Paul Callahan's web-site.

David J. Buckingham and Paul B. Callahan, Tight Bounds on Periodic Cell Configurations in Life. Experimental Mathematics 7:3 (1998) 221-241. Available at http://www.expmath.org/restricted/7/7.3/callahan.ps.

Noam D. Elkies, The still-Life density problem and its generalizations, pp228-253 of "Voronoi's Impact on Modern Science, Book I", P. Engel, H. Syta (eds), Institute of Mathematics, Kyiv, 1998 = Vol.21 of Proc. Inst. Math. Nat. Acad. Sci. Ukraine, math.CO/9905194.

Martin Gardner, Wheels, Life, and other Mathematical Amusements. W. H. Freeman and Company, 1983.

R. Wm. Gosper, Exploiting Regularities in Large Cellular Spaces. Physica 10D (1984) 75-80.

N. M. Gotts and P. B. Callahan, Emergent structures in sparse fields of Conway's 'Game of Life', in Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, MIT Press, 1998.

Mark D Niemiec, Life Algorithms. BYTE, January 1979.

William Poundstone, The Recursive Universe. William Morrow and Company Inc., 1985.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_c.htm0000644000175100001440000011234512156145314014316 00000000000000 Life Lexicon (C)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:c = speed of light

:CA = cellular automaton

:caber tosser Any pattern whose population is asymptotic to c.log(t) for some constant c, and which contains a glider (or other spaceship) bouncing between a slower receding spaceship and a fixed reflector which emits a spaceship (in addition to the reflected one) whenever the bouncing spaceship hits it.

As the receding spaceship gets further away the bouncing spaceship takes longer to complete each cycle, and so the extra spaceships emitted by the reflector are produced at increasingly large intervals. More precisely, if v is the speed of the bouncing spaceship and u the speed of the receding spaceship, then each interval is (v+u)/(v-u) times as long as the previous one. The population at time t is therefore n.log(t)/log((v+u)/(v-u)) + O(1), where n is the population of one of the extra spaceships (assumed constant).

The first caber tosser was built by Dean Hickerson in May 1991.

:Cambridge pulsar CP 48-56-72 = pulsar (The numbers refer to the populations of the three phases. The Life pulsar was indeed discovered at Cambridge, like the first real pulsar a few years earlier.)

:Canada goose (c/4 diagonally, p4) Found by Jason Summers, January 1999. It consists of a glider plus a tagalong.


OOO..........
O.........OO.
.O......OOO.O
...OO..OO....
....O........
........O....
....OO...O...
...O.O.OO....
...O.O..O.OO.
..O....OO....
..OO.........
..OO.........
At the time of its discovery the Canada goose was the smallest known diagonal spaceship other than the glider, but this record has since been beaten, first by the second spaceship shown under Orion, and more recently by quarter.

:candelabra (p3) By Charles Trawick. See also the note under cap.


....OO....OO....
.O..O......O..O.
O.O.O......O.O.O
.O..O.OOOO.O..O.
....O.O..O.O....
.....O....O.....

:candlefrobra (p3) Found by Robert Wainwright in November 1984.


.....O....
.O.OO.O.OO
O.O...O.OO
.O....O...
.....OO...
The following diagram shows that a pair of these can act in some ways like killer toads. See also snacker.

....O...........O....
OO.O.OO.O...O.OO.O.OO
OO.O...O.O.O.O...O.OO
...O....O...O....O...
...OO...........OO...
.....................
.....................
.........OOO.........
.........O..O........
.........O...........
.........O...O.......
.........O...O.......
.........O...........
..........O.O........

:canoe (p1)


...OO
....O
...O.
O.O..
OO...

:cap The following induction coil. It can also be easily be stabilized to form a p3 oscillator - see candelabra for a slight variation on this.


.OO.
O..O
OOOO

:carnival shuttle (p12) Found by Robert Wainwright in September 1984 (using MW emulators at the end, instead of the monograms shown here).


.................................O...O
OO...OO..........................OOOOO
.O.O.O...O..O......OO...O..O.......O..
.OO.OO..OO...OO....OO..OO...OO....O.O.
.O.O.O...O..O......OO...O..O.......O..
OO...OO..........................OOOOO
.................................O...O

:carrier = aircraft carrier

:casing That part of the stator of an oscillator which is not adjacent to the rotor. Compare bushing.

:catacryst A 58-cell quadratic growth pattern found by Nick Gotts in April 2000. This was formerly the smallest known pattern with superlinear growth, but has since been superseded by the related metacatacryst. The catacryst consists of three arks plus a glider-producing switch engine. It produces a block-laying switch engine every 47616 generations. Each block-laying switch engine has only a finite life, but the length of this life increases linearly with each new switch engine, so that the pattern overall grows quadratically, as an unusual type of MMS breeder.

:catalyst An object that participates in a reaction but emerges from it unharmed. The term is mostly applied to still lifes, but can also be used of oscillators, spaceships, etc. The still lifes and oscillators which form a conduit are examples of catalysts.

:caterer (p3) Found by Dean Hickerson, August 1989. Compare with jam. In terms of its minimum population of 12 this is the smallest p3 oscillator. See also double caterer and triple caterer.


..O.....
O...OOOO
O...O...
O.......
...O....
.OO.....
More generally, any oscillator which serves up a bit in the same manner may be referred to as a caterer.

:Caterpillar A spaceship that works by laying tracks at its front end. The only example constructed to date is a p270 17c/45 spaceship built by Gabriel Nivasch in December 2004, based on work by himself, Jason Summers and David Bell. This Caterpillar has a population of about 12 million in each generation and was put together by a computer program that Nivasch wrote. It is by far the largest and most complex Life object ever constructed.

The 17c/45 Caterpillar is based on the following reaction between a pi-heptomino and a blinker:


...............O
O.............OO
O............OO.
O.............OO
...............O
In this reaction, the pi moves forward 17 cells in the course of 45 generations, while the blinker moves back 6 cells and is rephased. This reaction has been known for many years, but it was only in September 2002 that David Bell suggested that it could be used to build a 17c/45 spaceship, based on a reaction he had found in which pis crawling along two rows of blinkers interact to emit a glider every 45 generations. Similar glider-emitting interactions were later found by Gabriel Nivasch and Jason Summers. The basic idea of the spaceship design is that streams of gliders created in this way can be used to construct fleets of standard spaceships which convey gliders to the front of the blinker tracks, where they can be used to build more blinkers.

A different Caterpillar may be possible based on the following reaction, in which the pattern at top left reappears after 31 generations displaced by (13,1), having produced a new NW-travelling glider. In this case the tracks would be waves of backward-moving gliders.


.OO.....................
...O....................
...O.OO.................
OOO....O................
.......O................
.....OOO................
........................
........................
........................
........................
........................
........................
.....................OOO
.....................O..
......................O.

:Catherine wheel = pinwheel

:cauldron (p8) Found in 1971 independently by Don Woods and Robert Wainwright. Compare with Hertz oscillator.


.....O.....
....O.O....
.....O.....
...........
...OOOOO...
O.O.....O.O
OO.O...O.OO
...O...O...
...O...O...
....OOO....
...........
....OO.O...
....O.OO...

:cavity = eater plug

:cell The fundamental unit of space in the Life universe. The term is often used to mean a live cell - the sense is usually clear from the context.

:cellular automaton A certain class of mathematical objects of which Life is an example. A cellular automaton consists of a number of things. First there is a positive integer n which is the dimension of the cellular automaton. Then there is a finite set of states S, with at least two members. A state for the whole cellular automaton is obtained by assigning an element of S to each point of the n-dimensional lattice Zn (where Z is the set of all integers). The points of Zn are usually called cells. The cellular automaton also has the concept of a neighbourhood. The neighbourhood N of the origin is some finite (nonempty) subset of Zn. The neighbourhood of any other cell is obtained in the obvious way by translating that of the origin. Finally there is a transition rule, which is a function from SN to S (that is to say, for each possible state of the neighbourhood the transition rule specifies some cell state). The state of the cellular automaton evolves in discrete time, with the state of each cell at time t+1 being determined by the state of its neighbourhood at time t, in accordance with the transition rule.

There are some variations on the above definition. It is common to require that there be a quiescent state, that is, a state such that if the whole universe is in that state at generation 0 then it will remain so in generation 1. (In Life the OFF state is quiescent, but the ON state is not.) Other variations allow spaces other than Zn, neighbourhoods that vary over space and/or time, probabilistic or other non-deterministic transition rules, etc.

It is common for the neighbourhood of a cell to be the 3x...x3 (hyper)cube centred on that cell. (This includes those cases where the neighbourhood might more naturally be thought of as a proper subset of this cube.) This is known as the Moore neighbourhood.

:centinal (p100) Found by Bill Gosper. This combines the mechanisms of the p46 and p54 shuttles (see twin bees shuttle and p54 shuttle).


OO................................................OO
.O................................................O.
.O.O.....................OO.....................O.O.
..OO........O............OO............OO.......OO..
...........OO..........................O.O..........
..........OO.............................O..........
...........OO..OO......................OOO..........
....................................................
....................................................
....................................................
...........OO..OO......................OOO..........
..........OO.............................O..........
...........OO..........................O.O..........
..OO........O............OO............OO.......OO..
.O.O.....................OO.....................O.O.
.O................................................O.
OO................................................OO

:century (stabilizes at time 103) This is a common pattern which evolves into three blocks and a blinker. In June 1996 Dave Buckingham built a neat p246 glider gun using a century as the engine. See also bookend and diuresis.


..OO
OOO.
.O..

:chemist (p5)


.......O.......
.......OOO.....
..........O....
.....OOO..O..OO
....O.O.O.O.O.O
....O...O.O.O..
.OO.O.....O.OO.
..O.O.O...O....
O.O.O.O.O.O....
OO..O..OOO.....
....O..........
.....OOO.......
.......O.......

:C-heptomino Name given by Conway to the following heptomino, a less common variant of the B-heptomino.


.OOO
OOO.
.O..

:Cheshire cat A block predecessor by C. R. Tompkins that unaccountably appeared both in Scientific American and in Winning Ways. See also grin.


.O..O.
.OOOO.
O....O
O.OO.O
O....O
.OOOO.

:chicken wire A type of stable agar of density 1/2. The simplest version is formed from the tile:


OO..
..OO
But the "wires" can have length greater than two and need not all be the same. For example:

OO...OOOO.....
..OOO....OOOOO

:cigar = mango

:cis-beacon on anvil (p2)


...OO.
....O.
.O....
.OO...
......
.OOOO.
O....O
.OOO.O
...O.OO

:cis-beacon on table (p2)


..OO
...O
O...
OO..
....
OOOO
O..O

:cis-boat with tail (p1)


.O...
O.O..
OO.O.
...O.
...OO

:cis fuse with two tails (p1) See also pulsar quadrant.


...O..
.OOO..
O...OO
.O..O.
..O.O.
...O..

:cis-mirrored R-bee (p1)


.OO.OO.
O.O.O.O
O.O.O.O
.O...O.

:cis snake = canoe

:clean Opposite of dirty. A reaction which produces a small number of different products which are desired or which are easily deleted is said to be clean. For example, a puffer which produces just one object per period is clean. Clean reactions are useful because they can be used as building blocks in larger constructions.

When a fuse is said to be clean, or to burn cleanly, this usually means that no debris at all is left behind.

:clock (p2) Found by Simon Norton, May 1970. This is the fifth or sixth most common oscillator, being about as frequent as the pentadecathlon, but much less frequent than the blinker, toad, beacon or pulsar. But it's surprisingly rare considering its small size.


..O.
O.O.
.O.O
.O..

:clock II (p4) Compare with pinwheel.


......OO....
......OO....
............
....OOOO....
OO.O....O...
OO.O..O.O...
...O..O.O.OO
...O.O..O.OO
....OOOO....
............
....OO......
....OO......

:cloud of smoke = smoke

:cloverleaf This name was given by Robert Wainwright to his p2 oscillator washing machine. But Achim Flammenkamp also gave this name to Achim's p4.

:cluster Any pattern in which each live cell is connected to every other live cell by a path that does not pass through two consecutive dead cells. This sense is due to Nick Gotts, but the term has also been used in other senses, often imprecise.

:CNWH Conweh, creator of the Life universe.

:Coe ship (c/2 orthogonally, p16) A puffer engine discovered by Tim Coe in October 1995.


....OOOOOO
..OO.....O
OO.O.....O
....O...O.
......O...
......OO..
.....OOOO.
.....OO.OO
.......OO.

:Coe's p8 (p8) Found by Tim Coe in August 1997.


OO..........
OO..OO......
.....OO.....
....O..O....
.......O..OO
.....O.O..OO

:colorized Life A cellular automaton which is the same as Life except for the use of a number of different ON states ("colours"). All ON states behave the same for the purpose of applying the Life rule, but additional rules are used to specify the colour of the resulting ON cells. Examples are Immigration and QuadLife.

:colour of a glider The colour of a glider is a property of the glider which remains constant while the glider is moving along a straight path, but which can be changed when the glider bounces off a reflector. It is an important consideration when building something using reflectors.

The colour of a glider can be defined as follows. First choose some cell to be the origin. This cell is then considered to be white, and all other cells to be black or white in a checkerboard pattern. (So the cell with coordinates (m,n) is white if m+n is even, and black otherwise.) Then the colour of a glider is the colour of its leading cell when it is in a phase which can be rotated to look like this:


OOO
..O
.O.

A reflector which does not change the colour of gliders obviously cannot be used to move a glider onto a path of different colour than it started on. But a 90-degree reflector which does change the colour of gliders is similarly limited, as the colour of the resulting glider will depend only on the direction of the glider, no matter how many reflectors are used. For maximum flexibility, therefore, both types of reflector are required.

:complementary blinker = fore and back

:compression = repeat time

:conduit Any arrangement of still lifes and/or oscillators which move an active object to another location, perhaps also transforming it into a different active object at the same time, but without leaving any permanent debris (except perhaps gliders, or other spaceships) and without any of the still lifes or oscillators being permanently damaged. Probably the most important conduit is the following remarkable one (Dave Buckingham, July 1996) in which a B-heptomino is transformed into a Herschel in 59 generations.


.........OO.O
O.OO......OOO
OO.O.......O.
.............
.........OO..
.........OO..

:confused eaters (p4) Found by Dave Buckingham before 1973.


O..........
OOO........
...O.......
..O........
..O..O.....
.....O.....
...O.O.....
...OO..OO..
.......O.O.
.........O.
.........OO

:converter A conduit in which the input object is not of the same type as the output object. This term tends to be preferred when either the input object or the output object is a spaceship.

The following diagram shows a p8 pi-heptomino-to-HWSS converter. This was originally found by Dave Buckingham in a larger form (using a figure-8 instead of the boat). The improvement shown here is by Bill Gosper (August 1996). Dieter Leithner has since found (much larger) oscillators of periods 44, 46 and 60 to replace the Kok's galaxy.


.O.O..O........
.OOO.O.OO......
O......O.....O.
.O.....OO...O.O
.............OO
OO.....O.......
.O......O......
OO.O.OOO.......
..O..O.O.......
............OOO
............O.O
............O.O

:convoy A collection of spaceships all moving in the same direction at the same speed.

:Corder- Prefix used for things involving switch engines, after Charles Corderman.

:Corder engine = switch engine

:Cordergun A gun firing Corderships. The first was built by Jason Summers in July 1999, using a glider synthesis by Stephen Silver.

:Cordership Any spaceship based on switch engines. These necessarily move at a speed of c/12 diagonally with a period of 96 (or a multiple thereof). The first was found by Dean Hickerson in April 1991. Corderships are the slowest spaceships so far constructed, although arbitrarily slow spaceships are known to exist (see universal constructor). Hickerson's original Cordership used 13 switch engines. He soon reduced this to 10, and in August 1993 to 7. In July 1998 he reduced it to 6. In January 2004, Paul Tooke found the 3-engine Cordership shown below.


................................OO.O...........................
...............................OOO.O......O.O..................
..............................O....O.O....O....................
...............................OO......O.O...O.................
................................O...O..O..OO...................
...................................O.OO...O....................
..................................O.O................OO........
..................................O.O................OO........
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
...............................................................
.............................................................OO
....................................................OO.......OO
.......................................O.........O.OOOO........
..................................O...OOOOO.....OO.O...OO......
.................................O.O.......OO....O..OO.OO......
.................................O.......O.OO.....OOOOOO.......
..................................O........OO......O...........
...................................O...OOOO....................
........................................OOO....................
........................O.O.........OO.........................
........................O.O.O......O.O.........................
.......................O..OO.O....OO...........................
........................OO...O.O.OO.O..........................
........................OO...OO.OOOOO..........................
............................O.OO...OO..........................
...........................O.O.................................
..OO.O.........................................................
.OOO.O......O.O................................................
O....O.O....O..................................................
.OO......O.O...O...............................................
..O...O..O..OO...........O.....................................
.....O.OO...O...........OOO....................................
....O.O.................O..O...................................
....O.O................O....O..................................
........................O......................................
...............................................................
........................O..O...................................
.........................O.O...................................
...............................................................
.....................O.........................................
....................OOO........................................
...................OO.OO.......................................
.........O........OO.O.....O...................................
....O...OOOOO....OO......OO....................................
...O.O.......OO..OO.......OO...................................
...O.......O.OO................................................
....O........OO................................................
.....O...OOOO..................................................
..........OOO..................................................
...............................................................
...............................................................
...............................................................
...........OO..................................................
...........OO..................................................

:cousins (p3) This contains two copies of the stillater rotor.


.....O.OO....
...OOO.O.O...
O.O......O...
OO.OO.OO.O.OO
...O.O....O.O
...O.O.OOO...
....OO.O.....

:cover The following induction coil. See scrubber for an example of its use.


....O
..OOO
.O...
.O...
OO...

:covered table = cap

:cow (c p8 fuse)


OO.......OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....
OO....O.OOO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO...OO
....OO.O.................................................O.O
....OO...OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
....OO.O..................................................O.
OO....O.OOO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.
OO.......OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO.....

:CP pulsar = pulsar

:crane (c/4 diagonally, p4) The following spaceship found by Nicolay Beluchenko in September 2005, a minor modification of a tubeater found earlier by Hartmut Holzwart. The wing is of the same form as in the swan and Canada goose.


.OO.................
OO..................
..O.................
....OO...O..........
....OO..O.O.........
.......OO.O.........
.......OO...........
.......OO...........
.................OO.
.........O....OO.O..
.........OOO..OO....
.........OOO..OO....
..........OO........
....................
............O.......
...........OO.......
...........O........
............O.......
....................
.............OO.....
..............O.OO..
..................O.
...............OO...
...............OO...
.................O..
..................OO

:cross (p3) Found by Robert Wainwright in October 1989.


..OOOO..
..O..O..
OOO..OOO
O......O
O......O
OOO..OOO
..O..O..
..OOOO..
In February 1993, Hartmut Holzwart noticed that this is merely the smallest of an infinite family of p3 oscillators. The next smallest member is shown below.

..OOOO.OOOO..
..O..O.O..O..
OOO..OOO..OOO
O...........O
O...........O
OOO.......OOO
..O.......O..
OOO.......OOO
O...........O
O...........O
OOO..OOO..OOO
..O..O.O..O..
..OOOO.OOOO..

:crowd (p3) Found by Dave Buckingham in January 1973.


...........O..
.........OOO..
.....OO.O.....
.....O...O....
.......OO.O...
...OOOO...O...
O.O.....O.O.OO
OO.O.O.....O.O
...O...OOOO...
...O.OO.......
....O...O.....
.....O.OO.....
..OOO.........
..O...........

:crown The p12 part of the following p12 oscillator, where it is hassled by caterer, a jam and a HW emulator. This oscillator was found by Noam Elkies in January 1995.


..........O...........
..........O......O....
...O....O...O...OO....
...OO....OOO..........
.........OOO..OOO..O.O
.O..OOO.........O.OOOO
O.O.O...............OO
O..O..................
.OO........OO.........
......OO.O....O.OO....
......O..........O....
.......OO......OO.....
....OOO..OOOOOO..OOO..
....O..O........O..O..
.....OO..........OO...

:crucible = cauldron

:crystal A regular growth that is sometimes formed when a stream of gliders, or other spaceships, is fired into some junk.

The most common example is initiated by the following collision of a glider with a block. With a glider stream of even period at least 82, this gives a crystal which forms a pair beehives for every 11 gliders which hit it.


.O......
..O...OO
OOO...OO

:cuphook (p3) Found by Rich Schroeppel, October 1970. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are 1-2-3 and stillater.


....OO...
OO.O.O...
OO.O.....
...O.....
...O..O..
....OO.O.
.......O.
.......OO
The above is the original form, but it can be made more compact:

....OO.
...O.O.
...O...
OO.O...
OO.O..O
...O.OO
...O...
..OO...

:curl = loop


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_d.htm0000644000175100001440000004110112156145314014306 00000000000000 Life Lexicon (D)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:dart (c/3 orthogonally, p3) Found by David Bell, May 1992.


.......O.......
......O.O......
.....O...O.....
......OOO......
...............
....OO...OO....
..O...O.O...O..
.OO...O.O...OO.
O.....O.O.....O
.O.OO.O.O.OO.O.

:dead spark coil (p1) Compare spark coil.


OO...OO
O.O.O.O
..O.O..
O.O.O.O
OO...OO

:de Bruijn diagram = de Bruijn graph

:de Bruijn graph As applied to Life, a de Bruijn graph is a graph showing which pieces can be linked to which other pieces to form a valid part of a Life pattern of a particular kind.

For example, if we are interested in still lifes, then we could consider 2x3 rectangular pieces and the de Bruijn graph would show which pairs of these can be overlapped to form 3x3 squares in which the centre cell remains unchanged in the next generation.

David Eppstein's search program gfind is based on de Bruijn graphs.

:Deep Cell A pattern by Jared James Prince, based on David Bell's unit Life cell, in which each unit cell simulates two Life cells, in such a way that a Life universe filled with Deep Cells simulates two independent Life universes running in parallel.

In fact, a Life universe filled with Deep Cells can simulate infinitely many Life universes, as follows. Let P1, P2, P3, ... be a sequence of Life patterns. Set the Deep Cells to run a simulation of P1 in parallel with a simulation of a universe filled with Deep Cells, with these simulated Deep Cells running a simulation of P2 in parallel with another simulation of a universe filled with Deep Cells, with these doubly simulated Deep Cells simulating P3 in parallel with yet another universe of Deep Cells, and so on.

Deep Cell is available from http://psychoticdeath.com/life.htm.

:density The density of a pattern is the limit of the proportion of live cells in a (2n+1)x(2n+1) square centred on a particular cell as n tends to infinity, when this limit exists. (Note that it does not make any difference what cell is chosen as the centre cell. Also note that if the pattern is finite then the density is zero.) There are other definitions of density, but this one will do here.

In 1994 Noam Elkies proved that the maximum density of a stable pattern is 1/2, which had been the conjectured value. See the paper listed in the bibliography. Marcus Moore provided a simpler proof in 1995, and in fact proves that a still life with an m x n bounding box has at most (mn+m+n)/2 cells.

But what is the maximum average density of an oscillating pattern? The answer is conjectured to be 1/2 again, but this remains unproved. The best upper bound so far obtained is 8/13 (Hartmut Holzwart, September 1992).

The maximum possible density for a phase of an oscillating pattern is also unknown. An example with a density of 3/4 is known (see agar), but densities arbitrarily close to 1 may perhaps be possible.

:D-heptomino = Herschel

:diamond = tub

:diamond ring (p3) Found by Dave Buckingham in 1972.


......O......
.....O.O.....
....O.O.O....
....O...O....
..OO..O..OO..
.O....O....O.
O.O.OO.OO.O.O
.O....O....O.
..OO..O..OO..
....O...O....
....O.O.O....
.....O.O.....
......O......

:diehard Any pattern that vanishes, but only after a long time. The following example vanishes in 130 generations, which is probably the limit for patterns of 7 or fewer cells. Note that there is no limit for higher numbers of cells - e.g., for 8 cells we could have a glider heading towards an arbitrarily distant blinker.


......O.
OO......
.O...OOO

:dinner table (p12) Found by Robert Wainwright in 1972.


.O...........
.OOO.......OO
....O......O.
...OO....O.O.
.........OO..
.............
.....OOO.....
.....OOO.....
..OO.........
.O.O....OO...
.O......O....
OO.......OOO.
...........O.

:dirty Opposite of clean. A reaction which produces a large amount of complicated junk which is difficult to control or use is said to be dirty. Many basic puffer engines are dirty and need to be tamed by accompanying spaceships in order to produce clean output.

:diuresis (p90) Found by David Eppstein in October 1998. His original stabilization used pentadecathlons. The stabilization with complicated still lifes shown here (in two slightly different forms) was found by Dean Hickerson the following day. The name is due to Bill Gosper (see kidney).


.....OO................OO....
......O................O.....
......O.O............O.O.....
.......OO............OO......
.............................
....OO..................OO...
....O.O..........OO....O.O...
.....O..........O.O.....O....
..O.............OO.........O.
..OOOOOO........O.....OOOOOO.
.......O..............O......
....OO..................OO...
....O....................O...
.....O..................O....
..OOO..O..............O..OOO.
..O..OOO........O.....OOO...O
...O............OO.......OOO.
....OO..........O.O.....O....
......O..........OO....O..OO.
....OO..................OO.O.
.O..O....................O...
O.O.O..OO............OO..O...
.O..O.O.O............O.O.OO..
....O.O................O..O..
.....OO................OO....

:dock The following induction coil.


.OOOO.
O....O
OO..OO

:domino The 2-cell polyomino. A number of objects, such as the HWSS and pentadecathlon, produce domino sparks.

:do-see-do The following reaction, found by David Bell in 1996, in which two gliders appear to circle around each other as they are reflected 90 degrees by a twin bees shuttle. Four copies of the reaction can be used to create a p92 glider loop which repeats the do-see-do reaction forever.


.....................................................O.O
.....................................................OO.
......................................................O.
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
........................................................
................................................OO......
................................................O.......
..............................................O.O.......
..............................................OO........
..............................O.O.......................
..............................OO........................
...............................O........................
........................................................
.......................OOO..............................
OO........OOO........OO.O.OO............................
OO........O...O.....O.....OO............................
..........O....O.....OO.O.OO............................
...........O...O.......OOO..............................
........................................................
...........O...O........................................
..........O....O........................................
OO........O...O............OO...........................
OO........OOO..............OO...........................

:double-barrelled Of a gun, emitting two streams of spaceships (or rakes). See B-52 bomber for an example.

:double block reaction A certain reaction that can be used to stabilize the twin bees shuttle (qv). This was discovered by David Bell in October 1996.

The same reaction sometimes works in other situations, as shown in the following diagram where a pair of blocks eats an R-pentomino and a LWSS. (The LWSS version was known at least as early 1994, when Paul Callahan saw it form spontaneously as a result of firing a LWSS stream at some random junk.)


.OOOO.....OO....
O...O......OO.OO
....O......O..OO
O..O............
................
.............OO.
.............OO.

:double caterer (p3) Found by Dean Hickerson, October 1989. Compare caterer and triple caterer.


.....OO...O........
....O..O..OOO......
....OO.O.....O.....
......O.OOOO.O.....
..OOO.O.O...O.OO...
.O..O..O...O..O.O..
O.O..O...O.OO....O.
.O..........OO.OOO.
..OO.OO.OO...O.....
...O...O.....O.OOO.
...O...O......OO..O
.................OO

:double ewe (p3) Found by Robert Wainwright before September 1971.


......OO............
.......O............
......O.............
......OO............
.........OO.........
......OOO.O.........
O.OO.O..............
OO.O.O..............
.....O...O..........
....O...OO....OO....
....OO....OO...O....
..........O...O.....
..............O.O.OO
..............O.OO.O
.........O.OOO......
.........OO.........
............OO......
.............O......
............O.......
............OO......

:double wing = moose antlers

:dove The following induction coil.


.OO..
O..O.
.O..O
..OOO

:down boat with tail = cis-boat with tail

:dragon (c/6 orthogonally, p6) This spaceship, discovered by Paul Tooke in April 2000, was the first known c/6 spaceship. All other known orthogonal c/6 spaceships are flotillas involving at least two dragons.


.............O..OO......O..OOO
.....O...OOOO.OOOOOO....O..OOO
.OOOOO....O....O....OOO.......
O......OO.O......OO.OOO..O.OOO
.OOOOO.OOO........OOOO...O.OOO
.....O..O..............O......
........OO..........OO.OO.....
........OO..........OO.OO.....
.....O..O..............O......
.OOOOO.OOO........OOOO...O.OOO
O......OO.O......OO.OOO..O.OOO
.OOOOO....O....O....OOO.......
.....O...OOOO.OOOOOO....O..OOO
.............O..OO......O..OOO

:drain trap = paperclip

:drifter A perturbation moving within a stable pattern. Dean Hickerson has written a program to search for drifters, with the hope of finding one which could be moved around a track. Because drifters can be very small, they could be packed more tightly than Herschels, and so allow the creation of oscillators of periods not yet attained, and possibly prove that Life is omniperiodic. Hickerson has found a number of components towards this end, but it has proved difficult to change the direction of movement of a drifter, and so far no complete track has been found. However, Hickerson has had success using the same search program to find eaters with novel properties, such as that used in diuresis.

:dual 1-2-3-4 = Achim's p4


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_e.htm0000644000175100001440000004635312156145314014325 00000000000000 Life Lexicon (E)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:early universe Conway's somewhat confusing term for sparse Life.

:eater Any still life that has the ability to interact with certain patterns without suffering any permanent damage. (If it doesn't suffer even temporary damage then it may be referred to as a rock.) The eater1 is a very common eater, and the term "eater" is often used specifically for this object. Other eaters include eater2, eater3, eater4 and even the humble block. (In fact the block was the first known eater, being found capable of eating beehives from a queen bee.) Another useful eater is shown below, feasting on a glider.


...O.....
...O.O...
...OO....
.........
.......OO
...O...OO
..O.O....
.O.O.....
.O.......
OO.......

:eater1 (p1) Usually simply called an eater, and also called a fishhook. Its ability to eat various objects was discovered by Bill Gosper in 1971.


OO..
O.O.
..O.
..OO

:eater2 (p1) This eater was found by Dave Buckingham in the 1970s. Mostly it works like the ordinary eater (see eater1) but with two slight differences that make it useful despite its size: it takes longer to recover from each bite and it acts like an eater in two directions. The first property means that, among other things, it can eat a glider in a position that would destroy a fishhook. This novel glider-eating action is occasionally of use in itself, and combined with the symmetry means that an eater2 can eat gliders along four different paths.


...O.OO
.OOO.OO
O......
.OOO.OO
...O.O.
...O.O.
....O..
The following eater2 variant (Stephen Silver, May 1998) can be useful for obtaining smaller bounding boxes. A more compact variant with the same purpose can be seen under gliderless.

OO....
O.....
..O.OO
.OO.OO
......
.OO.OO
..O.O.
..O.O.
...O..

:eater3 (p1) This large symmetric eater, found by Dave Buckingham, has a very different eating action from the eater1 and eater2. The loaf can take bites out things, being flipped over in the process. The rest of the object merely flips it back again.


.........OO.
....OO..O..O
.O..O....O.O
O.O.O.....O.
.O..O.OO....
....O..O....
.....O....O.
......OOOOO.
............
........O...
.......O.O..
........O...

:eater4 (p1) Another eater by Dave Buckingham, which he found in 1971, but did not recognize as an eater until 1975 or 1976. It can't eat gliders, but it can be used for various other purposes. The four NE-most centre cells regrow in a few generations after being destroyed by taking a bite out of something.


...OO.........
...O..........
OO.O..........
O..OO.........
.OO....O......
...OOOOO......
...O....OO....
....OO..O.....
......O.O.....
......O.O.O..O
.......OO.OOOO
.........O....
.........O.O..
..........OO..

:eater/block frob (p4) Found by Dave Buckingham in 1976 or earlier.


.OO.......
..O.......
..O.O.....
...O.O....
.....OO.OO
........OO
..OO......
...O......
OOO.......
O.........

:eater-bound pond = biting off more than they can chew

:eater-bound Z-hexomino = pentoad

:eater eating eater = two eaters

:eater plug (p2) Found by Robert Wainwright, February 1973.


.......O
.....OOO
....O...
.....O..
..O..O..
.O.OO...
.O......
OO......

:eaters + = French kiss

:eaters plus = French kiss

:ecologist (c/2 orthogonally, p20) This consists of the classic puffer train with a LWSS added to suppress the debris. See also space rake.


OOOO.....OO........
O...O...OO.OO......
O........OOOO......
.O..O.....OO.......
...................
.....O.........OO..
...OOO........OOOOO
..O...O.....O....OO
..O....OOOOO.....OO
..OO.O.OOOO....OO..
....O...OO.OOO.....
.....O.O...........
...................
...................
OOOO...............
O...O..............
O..................
.O..O..............

:edge-repair spaceship A spaceship which has an edge that possesses no spark and yet is able to perturb things because of its ability to repair certain types of damage to itself. The most useful examples are the following two small p3 c/3 spaceships:


..................................O.....
........O.......................OOO.OOO.
.......OOOO....................OO......O
..O...O...OO.OO...........O...O..O...OO.
.OOOO.....O..OO..........OOOO...........
O...O.......O..O........O...O...........
.O.O..O..................O.O..O.........
.....O.......................O..........
These were found by David Bell in 1992, but the usefulness of the edge-repair property wasn't recognised until July 1997. The following diagram (showing an edge-repair spaceship deleting a Herschel) demonstrates the self-repairing action.

................O.......
O..............OOOO.....
O.O.......O...O...OO.OO.
OOO......OOOO.....O..OO.
..O.....O...O.......O..O
.........O.O..O.........
.............O..........
In October 2000, David Bell found that a T-tetromino component of a c/4 spaceship can also be self-repairing. Stephen Silver noticed that it could be used to delete beehives and, in November 2000, found the smallest known c/4 spaceship with this edge-repair component - in fact, two copies of the component:

.OO..........................
O..O.........................
.OO..........................
.............................
.......O.O...................
.......O.....................
.......O.O..O..O.............
..........O..................
...........O.OO.O............
............OOO.O............
...........O....O..O.OO......
........O...OO...O.OOOO......
........OO..O..O.OO....O....O
........O........OO....O..OOO
.............OO...OO...O..OO.
.OO..........................
O..O.........................
.OO..........................

:edge shooter A gun which fires its gliders (or whatever) right at the edge of the pattern, so that it can be used to fire them closely parallel to others. This is useful for constructing complex guns. Compare glider pusher, which can in fact be used for making edge shooters.

The following diagram shows a p46 edge shooter found by Paul Callahan in June 1994.


OO............OO..O....OO..OO.............
OO............O.OO......OO.OO.............
...............O......O.O.................
...............OOO....OO..................
..........................................
...............OOO....OO..................
...............O......O.O.................
OO............O.OO......OO................
OO............OO..O....OO.................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...............................OOO...OOO..
..............................O...O.O...O.
.............................O...OO.OO...O
.............................O.OO.....OO.O
...............................O.......O..
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
..........................................
...............................OO.....OO..
...............................OO.....OO..

:edge spark A spark at the side of a spaceship that can be used to perturb things as the spaceship passes by.

:edge sparker A spaceship that produces one or more edge sparks.

:egg = non-spark

:E-heptomino Name given by Conway to the following heptomino.


.OOO
OO..
.OO.

:elbow ladder Scot Ellison's name for the type of pattern he created in which one or more gliders shuttle back and forth (using the kickback reaction) deleting the output gliders from a pair of slide guns.

:electric fence (p5) A stabilization of ants. Dean Hickerson, February 1993.


..........O..................................................
.........O.O........................OO.......................
..O....OOO.O.....O...................O...O..O......O.....OO..
.O.O..O....OO...O.O..................O.OOO..OOO...O.O....O...
.O.O..O.OO.......O....................O...OO...O.O..O......O.
OO.OO.O.O.OOOOO.....O..................OO...O..O.O.OO.OO..OO.
.O.O..O...O..O..O.......OO...OO...OO....OO.OO..O.O..O.O.O....
.O..OO....OO......OOO.OO...OO...OO...OOO.....OOOO.OOO.O...OO.
..O..OOO..O..O.OOOO...OO...OO...OO...OOO.OO..O....O.O....O..O
...OO...O.O..O.....OO...OO...OO...OO......O............O...OO
.....OO.O.OO.O.OO..O......................O........OO.O......
.....O.OO.O..O.OO....O.................OO.O.O................
...........OO.......OO..................O..OO................
......................................O.O....................
......................................OO.....................

:elevener (p1)


OO....
O.O...
..O...
..OOO.
.....O
....OO

:Elkies' p5 (p5) Found by Noam Elkies in 1997.


.O.......
O..OOO...
..O......
...O.O..O
..OO.OOOO
....O....
....O.O..
.....OO..

:emu Dave Buckingham's term for a Herschel loop that does not emit gliders (and so is "flightless"). All known Herschel loops of periods 57, 58, 59 and 61 are emus. See also Quetzal.

:emulator Any one of three p4 oscillators that produce sparks similar to those produced by LWSS, MWSS and HWSS. See LW emulator, MW emulator and HW emulator. Larger emulators are also possible, but they require stabilizing objects to suppress their non-sparks and so are of little use. The emulators were discovered by Robert Wainwright in June 1980.

:engine The active portion of an object (usually a puffer or gun) which is considered to actually produce its output, and which generally permits no variation in how it works. The other parts of the object are just there to support the engine. For examples, see puffer train, Schick engine, blinker puffer, frothing puffer and line puffer.

:en retard (p3) Found by Dave Buckingham, August 1972.


.....O.....
....O.O....
OO.O.O.O.OO
.O.O...O.O.
O..O.O.O..O
.OO.....OO.
...OO.OO...
...O.O.O...
....O.O....
..O.O.O.O..
..OO...OO..

:Enterprise (c/4 diagonally, p4) Found by Dean Hickerson, March 1993.


.......OOO...........
.....O.OO............
....OOOO.............
...OO.....O..........
..OOO..O.O.O.........
.OO...O.O..O.........
.O.O.OOOOO...........
OO.O.O...O...........
O........OO..........
.OO..O...O.O.........
....OO..O.OO......O..
...........OO.....OOO
............O..OOO..O
............O..O..OO.
.............O.OO....
............OO.......
............OO.......
...........O.........
............O.O......
...........O..O......
.............O.......

:Eureka (p30) A pre-pulsar shuttle found by Dave Buckingham in August 1980. A variant is obtained by shifting the top half two spaces to either side.


.O..............O.
O.O....O.......O.O
.O...OO.OO......O.
.......O..........
..................
..................
..................
.......O..........
.O...OO.OO......O.
O.O....O.......O.O
.O..............O.

:evolutionary factor For an unstable pattern, the time to stabilization divided by the initial population. For example, the R-pentomino has an evolutionary factor of 220.6, while bunnies has an evolutionary factor of 1925.777... The term is no longer in use.

:exposure = underpopulation

:extensible A pattern is said to be extensible if arbitrarily large patterns of the same type can be made by repeating parts of the original pattern in a regular way.

:extra extra long = long^4

:extra long = long^3

:extremely impressive (p6) Found by Dave Buckingham, August 1976.


....OO......
...O.OOO....
...O....O...
OO.O...OO...
OO.O.....OO.
....OOOOO..O
..........OO
......O.....
.....O.O....
......O.....

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_f.htm0000644000175100001440000004365312156145314014326 00000000000000 Life Lexicon (F)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:factory Another word for gun, but not used in the case of glider guns. The term is also used for a pattern that repeatedly manufactures objects other than spaceships or rakes. In this case the new objects do not move out of the way, and therefore must be used up in some way before the next one is made. The following shows an example of a p144 gun which consists of a p144 block factory whose output is converted into gliders by a p72 oscillator. (This gun is David Bell's improvement of the one Bill Gosper found in July 1994. The p72 oscillator is by Robert Wainwright, 1990, and the block factory is Achim's p144 minus one of its stabilizing blocks.)


.......................OO........................OO
.......................OO........................OO
.........................................OO........
........................................O..O.......
.........................................OO........
...................................................
....................................OOO............
....................................O.O............
.........OO.........................OOO............
.........OO.........................OO.............
........O..O.......................OOO.............
........O..O.OO....................O.O.............
........O....OO....................OOO.............
..........OO.OO....................................
...............................OO..................
.....................OO.......O..O.................
.....................OO........OO..................
.................................................OO
.................................................OO
...................................................
....OO..................O..........................
OO....OOOO..........OO..OO.OOO.....................
OO..OO.OOO..........OO....OOOO.....................
....O...................OO.........................

:familiar fours Common patterns of four identical objects. The five commonest are traffic light (4 blinkers), honey farm (4 beehives), blockade (4 blocks), fleet (4 ships, although really 2 ship-ties) and bakery (4 loaves, although really 2 bi-loaves).

:fanout A mechanism that emits two or more objects of some type for each one that it receives. Typically the objects are gliders or Herschels; glider duplicators are a special case.

:Fast Forward Force Field The following reaction found by Dieter Leithner in May 1994. In the absence of the incoming LWSS the gliders would simply annihilate one another, but as shown they allow the LWSS to advance 11 spaces in the course of the next 6 generations. A neat illusion. See also star gate. (Leithner named the Fast Forward Force Field in honour of his favourite science fiction writer, the physicist Robert L. Forward.)


.......O......O..
........O......OO
..OO..OOO.....OO.
OO.OO............
OOOO.........O...
.OO.........OO...
............O.O..

:father = parent

:featherweight spaceship = glider

:fencepost Any pattern that stabilizes one end of a wick.

:Fermat prime calculator A pattern constructed by Jason Summers in January 2000 that exhibits infinite growth if and only if there are no Fermat primes greater than 65537. The question of whether or not it really does exhibit infinite growth is therefore equivalent to a well-known and long-standing unsolved mathematical problem. It will, however, still be growing at generation 102585827975. The pattern is based on Dean Hickerson's primer and caber tosser patterns and a p8 beehive puffer by Hartmut Holzwart.

:F-heptomino Name given by Conway to the following heptomino.


OO..
.O..
.O..
.OOO

:figure-8 (p8) Found by Simon Norton in 1970.


OOO...
OOO...
OOO...
...OOO
...OOO
...OOO

:filter Any oscillator used to delete some but not all of the spaceships in a stream. An example is the blocker, which can be positioned so as to delete every other glider in a stream of period 8n+4, and can also do the same for LWSS streams. Other examples are the MW emulator and T-nosed p4 (either of which can be used to delete every other LWSS in a stream of period 4n+2), the fountain (which does the same for MWSS streams) and a number of others, such as the p6 pipsquirter, the pentadecathlon and the p72 oscillator shown under factory. Another example, a p4 oscillator deleting every other HWSS in a stream of period 4n+2, is shown below. (The p4 oscillator here was found, with a slightly larger stator, by Dean Hickerson in November 1994.)


..........OOOO............
....OO...OOOOOO...........
OOOO.OO..OOOO.OO..........
OOOOOO.......OO...........
.OOOO.....................
..........................
................OO........
..............O....O......
..........................
.............O.O..O.O.....
...........OOOO.OO.OOOO...
........O.O....O..O....O.O
........OO.OO.O....O.OO.OO
...........O.O......O.O...
........OO.O.O......O.O.OO
........OO.O..........O.OO
...........O.O.OOOO.O.O...
...........O.O......O.O...
..........OO.O.OOOO.O.OO..
..........O..OOO..OOO..O..
............O..OOOO..O....
...........OO.O....O.OO...
...........O..O....O..O...
............O..O..O..O....
.............OO....OO.....

:fire-spitting (p3) Found by Nicolay Beluchenko, September 2003.


...O......
.OOO......
O.........
.O.OOO....
.O.....O..
..O..O....
..O.O..O.O
........OO

:fish A generic term for LWSS, MWSS and HWSS, or, more generally, for any spaceship.

:fishhook = eater1

:fleet (p1) A common formation of two ship-ties.


....OO....
....O.O...
.....OO...
.......OO.
OO.....O.O
O.O.....OO
.OO.......
...OO.....
...O.O....
....OO....

:flip-flop Any p2 oscillator. However, the term is also used in two more specific (and non-equivalent) senses: (a) any p2 oscillator whose two phases are mirror images of one another, and (b) any p2 oscillator in which all rotor cells die from underpopulation. In the latter sense it contrasts with on-off. The term has also been used even more specifically for the 12-cell flip-flop shown under phoenix.

:flip-flops Another name for the flip-flop shown under phoenix.

:flipper Any oscillator or spaceship that forms its mirror image halfway through its period.

:flotilla A spaceship composed of a number of smaller interacting spaceships. Often one or more of these is not a true spaceship and could not survive without the support of the others. The following example shows an OWSS escorted by two HWSS.


....OOOO.......
...OOOOOO......
..OO.OOOO......
...OO..........
...............
...........OO..
.O............O
O..............
O.............O
OOOOOOOOOOOOOO.
...............
...............
....OOOO.......
...OOOOOO......
..OO.OOOO......
...OO..........

:fly A certain c/3 tagalong found by David Bell, April 1992. Shown here attached to the back of a small spaceship (also by Bell).


..O...............................
.O.O..............................
.O.O......................O.O...O.
.O.......................OO.O.O..O
...........OOO........O.........O.
OO.........OO..O.OO...O..OOOO.....
.O.O.........OOOO..O.O..OO....OO..
.OO........O..O...OOO.....OOO.....
..O.......O....O..OO..OO..O..O....
...O..O...O....O..OOO.O.O....OO...
.......O.OO....O..OOOO.....O......
....OO...OO....O..OOOO.....O......
....O.O...O....O..OOO.O.O....OO...
...OO.....O....O..OO..OO..O..O....
....O.O....O..O...OOO.....OOO.....
.....O.......OOOO..O.O..OO....OO..
...........OO..O.OO...O..OOOO.....
...........OOO........O.........O.
.........................OO.O.O..O
..........................O.O...O.

:flying machine = Schick engine

:fore and back (p2) Compare snake pit. Found by Achim Flammenkamp, July 1994.


OO.OO..
OO.O.O.
......O
OOO.OOO
O......
.O.O.OO
..OO.OO

:forward glider A glider which moves at least partly in the same direction as the puffer(s) or spaceship(s) under consideration.

:fountain (p4) Found by Dean Hickerson in November 1994, and named by Bill Gosper. See also filter and superfountain.


.........O.........
...................
...OO.O.....O.OO...
...O.....O.....O...
....OO.OO.OO.OO....
...................
......OO...OO......
OO...............OO
O..O...O.O.O...O..O
.OOO.OOOOOOOOO.OOO.
....O....O....O....
...OO.........OO...
...O...........O...
.....O.......O.....
....OO.......OO....

:fourteener (p1)


....OO.
OO..O.O
O.....O
.OOOOO.
...O...

:fox (p2) This is the smallest asymmetric p2 oscillator. Found by Dave Buckingham, July 1977.


....O..
....O..
..O..O.
OO.....
....O.O
..O.O.O
......O

:French kiss (p3) Found by Robert Wainwright, July 1971.


O.........
OOO.......
...O......
..O..OO...
..O....O..
...OO..O..
......O...
.......OOO
.........O

:frog II (p3) Found by Dave Buckingham, October 1972.


..OO...OO..
..O.O.O.O..
....O.O....
...O.O.O...
...OO.OO...
.OO.....OO.
O..O.O.O..O
.O.O...O.O.
OO.O...O.OO
....OOO....
...........
...O.OO....
...OO.O....

:frothing puffer A frothing puffer (or a frothing spaceship) is a puffer (or spaceship) whose back end appears to be unstable and breaking apart, but which nonetheless survives. The exhaust festers and clings to the back of the puffer/spaceship before breaking off. The first known frothing puffers were c/2, and most were found by slightly modifying the back ends of p2 spaceships. A number of these have periods which are not a multiple of 4 (as with some line puffers). Paul Tooke has also found c/3 frothing puffers.

The following p78 c/2 frothing puffer was found by Paul Tooke in April 2001.


.......O.................O.......
......OOO...............OOO......
.....OO....OOO.....OOO....OO.....
...OO.O..OOO..O...O..OOO..O.OO...
....O.O..O.O...O.O...O.O..O.O....
.OO.O.O.O.O....O.O....O.O.O.O.OO.
.OO...O.O....O.....O....O.O...OO.
.OOO.O...O....O.O.O....O...O.OOO.
OO.........OO.O.O.O.OO.........OO
............O.......O............
.........OO.O.......O.OO.........
..........O...........O..........
.......OO.O...........O.OO.......
.......OO...............OO.......
.......O.O.O.OOO.OOO.O.O.O.......
......OO...O...O.O...O...OO......
......O..O...O.O.O.O...O..O......
.........OO....O.O....OO.........
.....OO....O...O.O...O....OO.....
.........O.OO.O...O.OO.O.........
..........O.O.O.O.O.O.O..........
............O..O.O..O............
...........O.O.....O.O...........

:frothing spaceship See frothing puffer.

:fumarole (p5) Found by Dean Hickerson in September 1989. In terms of its 7x8 bounding box this is the smallest p5 oscillator.


...OO...
.O....O.
.O....O.
.O....O.
..O..O..
O.O..O.O
OO....OO

:fuse A wick burning at one end. For examples, see baker, beacon maker, blinker ship, boat maker, cow, harvester, lightspeed wire, pi ship, reverse fuse, superstring and washerwoman. Useful fuses are usually clean.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_g.htm0000644000175100001440000006400412156145314014320 00000000000000 Life Lexicon (G)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Gabriel's p138 (p138) The following oscillator found by Gabriel Nivasch in October 2002.


.......OOO.....
......O..O.....
.......O...O...
..O.....OOO....
...O.....O.....
OO.OO..........
O..O.........O.
O.O.........O.O
.O.........O..O
..........OO.OO
.....O.....O...
....OOO.....O..
...O...O.......
.....O..O......
.....OOO.......

:galaxy = Kok's galaxy

:Game of Life = Life

:Game of Life News A blog reporting on new Life discoveries, started by Heinrich Koenig in December 2004. Dave Greene is also a frequent contributor to the blog, which can be found at http://gameoflife-news.blogspot.com.

:Garden of Eden A configuration of ON and OFF cells that can only occur in generation 0. (This term was first used in connection with cellular automata by John W. Tukey, many years before Life.) It was known from the start that there are Gardens of Eden in Life, because of a theorem by Edward Moore that guarantees their existence in a wide class of cellular automata. Explicit examples have since been constructed, the first by Roger Banks, et al. at MIT in 1971. This example was 9 x 33. In 1974 J. Hardouin-Duparc et al. at the University of Bordeaux 1 produced a 6 x 122 example. The following shows a 12 x 12 example found by Nicolay Beluchenko in February 2006, based on a 13 x 12 one found by Achim Flammenkamp in June 2004.


..O.OOO.....
OO.O.OOOOO.O
O.O.OO.O.O..
.OOOO.O.OOO.
O.O.OO.OOO.O
.OOO.OO.O.O.
..O...OOO..O
.O.OO.O.O.O.
OOO.OOOO.O.O
OO.OOOO...O.
.O.O.OO..O..
.OO.O..OO.O.

:generation The fundamental unit of time. The starting pattern is generation 0.

:germ (p3) Found by Dave Buckingham, September 1972.


....OO....
.....O....
...O......
..O.OOOO..
..O....O..
.OO.O.....
..O.O.OOOO
O.O.O....O
OO...OOO..
.......OO.

:gfind A program by David Eppstein which uses de Bruijn graphs to search for new spaceships. It was with gfind that Eppstein found the weekender, and Paul Tooke later used it to find the dragon. It is available at http://www.ics.uci.edu/~eppstein/ca/gfind.c (C source code only).

Compare lifesrc.

:GIG A glider injection gate. This is a device for injecting a glider into a glider stream. The injected glider is synthesized from one or more incoming spaceships assisted by the presence of the GIG. (This contrasts with some other glider injection reactions which do not require a GIG.) Gliders already in the glider stream pass through the GIG without interfering with it. A GIG usually consists of a small number of oscillators.

Glider injection gates are useful for building glider guns with pseudo-periods that are of the form nd, where n is a positive integer, and d is a proper divisor of some convenient base gun period (such as 30 or 46), with d > 13.

:glasses (p2) Compare scrubber and spark coil.


....O........O....
..OOO........OOO..
.O..............O.
.O..OOO....OOO..O.
OO.O...O..O...O.OO
...O...OOOO...O...
...O...O..O...O...
....OOO....OOO....
..................
....OO.O..O.OO....
....O.OO..OO.O....

:glider (c/4 diagonally, p4) The smallest, most common and first discovered spaceship. This was found by Richard Guy in 1970 while Conway's group was attempting to track the evolution of the R-pentomino. The name is due in part to the fact that it is glide symmetric. (It is often stated that Conway discovered the glider, but he himself has said it was Guy. See also the cryptic reference ("some guy") in Winning Ways.)


OOO
O..
.O.
The term "glider" is also occasionally (mis)used to mean "spaceship".

:glider-block cycle An infinite oscillator based on the following reaction (a variant of the rephaser). The oscillator consists of copies of this reaction displaced 2n spaces from one another (for some n>6) with blocks added between the copies in order to cause the reaction to occur again halfway through the period. The period of the resulting infinite oscillator is 8n-20. (Alternatively, in a cylindrical universe of width 2n the oscillator just consists of two gliders and two blocks.)


...OO...
...OO...
........
........
..O..O..
O.O..O.O
.OO..OO.

:glider construction = glider synthesis

:glider duplicator Any reaction in which one input glider is converted into two output gliders. This can be done either by oscillators or by spaceships. The most useful glider duplicators are those with low periods.

The following period 30 glider duplicator demonstrates a simple glider duplicating mechanism found by Dieter Leithner. The input glider stream comes in from the upper left, and the output glider streams leave at the upper and lower right. One of the output glider streams is inverted, so an inline inverter is required to complete the duplicator.


..........O.O.......................
...........OO.......................
...........O........................
....................................
....................................
....................................
........................OO....O.....
..................O.....OO....OO....
...................OO........O.O....
..................OO................
....................................
....................................
....................................
....................................
......................OO............
.......................OO...........
............O.........O.............
............O.O.....................
.............O.O.........OO.........
OO...........O..O.......OOO.........
OO...........O.O.....O.OO...........
............O.O......O..O...........
............O........O.OO...........
........................OOO.....OO..
.........................OO.....O.O.
..................................O.
..................................OO

Spaceship convoys which can duplicate gliders are very useful since they (along with glider turners) provide a means to clean up many dirty puffers by duplicating and turning output gliders so as to impact into the exhaust to clean it up.

Glider duplicators (and turners) are known for backward gliders using p2 c/2 spaceships, and for forward gliders using p3 c/3 spaceships. These are the most general duplicators for these speeds.

:glider gun A gun which fires gliders.

:glider injection gate = GIG

:gliderless A gun is said to be gliderless if it does not use gliders. The purist definition would insist that a glider does not appear anywhere, even incidentally. For a long time the only known way to construct LWSS, MWSS and HWSS guns involved gliders, and it was not until April 1996 that Dieter Leithner constructed the first gliderless gun (a p46 LWSS gun).

The following diagram shows the p44 MWSS gun that Dieter Leithner discovered (in a somewhat larger form) in April 1997. This is the smallest known gliderless gun, and also the smallest known MWSS gun. It is based on an important p44 oscillator discovered by Dave Buckingham in early 1992, shown here in an improved form found in January 2005 by Jason Summers using a new p4 sparker by Nicolay Beluchenko. Note that a glider shape appears in this gun for three consecutive generations, but always as part of a larger cluster, so even a purist would regard this gun as gliderless.


.......O..........................................
..OO...O.O....O...................................
..O..OO..O.O.OO.O..OOO..OO........................
....OO.......OO.O.O.OO..OO........................
...OOO.......O.......OOO.........O................
.......................O.......OOO................
.......................O......O........OOO........
..............................OO.......O..O.......
.........OO..............O.............O..........
.........OO.............O..............O...O......
.........................OO............O..........
........................O.O.............O.O.......
..................................................
.......................O.O.....OOO................
........................O.....O..O..............OO
OO............OOO.......O......OO...........OO.O.O
OO...........O...O..........................OO.O..
.............OO.OO..............................O.
.................................OO.........OO.OO.
..............................OO.............O.O..
.............................................O.O..
..............................................O...
.............OO.OO.............O.O................
OO...........O...O.............OO.................
OO............OOO.................................
...........................OO.....................
...........................O.O....................
.............................O....................
.............................OO...................
..................................................
.........OO.......................................
.........OO.......................................
..................................................
.......................O..........................
.......................O..........................
...OOO.......O.......OOO..........................
....OO.......OO.O.O.OO..OO........................
..O..OO..O.O.OO.O..OOO..OO........................
..OO...O.O....O...................................
.......O..........................................

:glider pusher An arrangement of a queen bee shuttle and a pentadecathlon that can push the path of a passing glider out by one half-diagonal space. This was found by Dieter Leithner in December 1993 and is shown below. It is useful for constructing complex guns where it may be necessary to produce a number of gliders travelling on close parallel paths. See also edge shooter.


.........OO..............
.........OO..............
.........................
..........O..............
.........O.O.............
.........O.O.............
..........O..............
.........................
.........................
.......OO.O.OO...........
.......O.....O...........
........O...O............
.O.......OOO.............
..O......................
OOO......................
.........................
.........................
.................O....O..
...............OO.OOOO.OO
.................O....O..

:gliders by the dozen (stabilizes at time 184) In early references this is usually shown in a larger form whose generation 1 is generation 8 of the form shown here.


OO..O
O...O
O..OO

:glider synthesis Construction of an object by means of glider collisions. It is generally assumed that the gliders should be arranged so that they could come from infinity - that is, gliders should not have had to pass through one another to achieve the initial arrangement.

Glider syntheses for all still lifes and known oscillators with at most 14 cells were found by Dave Buckingham.

Perhaps the most interesting glider syntheses are those of spaceships, because these can be used to create corresponding guns and rakes. Many of the c/2 spaceships that are based on standard spaceships have been synthesized, mostly by Mark Niemiec. In June 1998 Stephen Silver found syntheses for some of the Corderships (although it was not until July 1999 that Jason Summers used this to build a Cordership gun). In May 2000, Noam Elkies suggested that a 2c/5 spaceship found by Tim Coe in May 1996 might be a candidate for glider synthesis. Initial attempts to construct a synthesis for this spaceship got fairly close, but it was only in March 2003 that Summers and Elkies managed to find a way perform the crucial last step. Summers then used the new synthesis to build a c/2 forward rake for the 2c/5 spaceship; this was the first example in Life of a rake which fires spaceships that travel in the same direction as the rake but more slowly.

A 3-glider synthesis of a pentadecathlon is shown in the diagram below. This was found in April 1997 by Heinrich Koenig and came as a surprise, as it was widely assumed that anything using just three gliders would already be known.


......O...
......O.O.
......OO..
..........
OOO.......
..O.......
.O.....OO.
........OO
.......O..

:glider train A certain puffer that produces two rows of blocks and two backward glider waves. Ten of these were used to make the first breeder.

:glider turner An reaction in which a glider is turned by an oscillator or a spaceship. In the former case, the glider turner is usually called a reflector.

Glider turners are easily built using standard spaceships. The following diagram shows a convoy which turns a forward glider 90 degrees, with the new glider also moving forwards.


.........OO.........
........OO.OOOO.....
.O.......OOOOOO.....
O.........OOOO......
OOO.................
....................
....................
....................
....................
...O................
.O...O..............
O...................
O....O..............
OOOOO...............
....................
....................
.............OOOOOO.
.............O.....O
.............O......
..............O....O
................OO..
Small rearrangements of the back two spaceships can alternatively send the output glider into any of the other three directions.

See also glider duplicator and reflector.

:glide symmetric Undergoing simultaneous reflection and translation. A glide symmetric spaceship is sometimes called a flipper.

:gnome = fox

:GoE = Garden of Eden

:GoL = Game of Life

:Golly A cross-platform open source Life program by Andrew Trevorrow and Tomas Rokicki. Unlike most Life programs it includes the ability to run patterns using the hashlife algorithm. It is available from http://golly.sourceforge.net.

:Gosper glider gun The first known gun, and indeed the first known finite pattern with unbounded growth, found by Bill Gosper in November 1970. It remains by far the smallest known gun. Gosper has since found other guns, see new gun and the p144 gun shown under factory.


........................O...........
......................O.O...........
............OO......OO............OO
...........O...O....OO............OO
OO........O.....O...OO..............
OO........O...O.OO....O.O...........
..........O.....O.......O...........
...........O...O....................
............OO......................

:gourmet (p32) Found by Dave Buckingham in March 1978. Compare with pi portraitor and popover.


..........OO........
..........O.........
....OO.OO.O....OO...
..O..O.O.O.....O....
..OO....O........O..
................OO..
....................
................OO..
O.........OOO..O.O..
OOO.......O.O...O...
...O......O.O....OOO
..O.O..............O
..OO................
....................
..OO................
..O........O....OO..
....O.....O.O.O..O..
...OO....O.OO.OO....
.........O..........
........OO..........

:grammar A set of rules for connecting components together to make an object such as a spaceship, oscillator or still life.

:grandfather = grandparent

:grandparent A pattern is said to be a grandparent of the pattern it gives rise to after two generations. See also parent.

:Gray counter (p4) Found in 1971. If you look at this in the right way you will see that it cycles through the Gray codes from 0 to 3. Compare with R2D2.


......O......
.....O.O.....
....O.O.O....
.O..O...O..O.
O.O.O...O.O.O
.O..O...O..O.
....O.O.O....
.....O.O.....
......O......

:gray ship = grey ship

:great on-off (p2)


..OO....
.O..O...
.O.O....
OO.O..O.
....OO.O
.......O
....OOO.
....O...

:grey counter = Gray counter (This form is erroneous, as Gray is surname, not a colour.)

:grey ship A spaceship that contains a region with a density of 1/2, and which is extensible in such a way that the region of density 1/2 can be made larger than any given square region.

See also with-the-grain grey ship, against-the-grain grey ship and hybrid grey ship.

:grin The following common parent of the block. This name relates to the infamous Cheshire cat. See also pre-block.


O..O
.OO.

:grow-by-one object A pattern whose population increases by one cell every generation. The smallest known grow-by-one object is the following 44-cell pattern (David Bell's one-cell improvement of a pattern found by Nicolay Beluchenko, September 2005).


........OO.......
.......OO........
.........O.......
...........OO....
..........O......
.................
.........O..OO...
.OO.....OO....O..
OO.....O.....O...
..O....O.O...OO..
....O..O....OO.O.
....OO.......OO..
........O....O.OO
.......O.O..O.OO.
........O........

:growing/shrinking line ship A line ship in which the line repeatedly grows and shrinks, resulting in a high-period spaceship.

:growing spaceship An object that moves like a spaceship, except that its front part moves faster than its back part and a wick extends between the two. Put another way, a growing spaceship is a puffer whose output is burning cleanly at a slower rate than the puffer is producing it. Examples include blinker ships and pi ships.

:gull = elevener

:gun Any stationary pattern that emits spaceships (or rakes) forever. For examples see double-barrelled, edge shooter, factory, gliderless, Gosper glider gun, new gun and true.

:gunstar Any of a series of glider guns of period 144+72n (for all non-negative integers n) constructed by Dave Buckingham in 1990 based on his transparent block reaction and Robert Wainwright's p72 oscillator (shown under factory).


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_h.htm0000644000175100001440000007514612156145314014332 00000000000000 Life Lexicon (H)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:half bakery See bi-loaf.

:half fleet = ship-tie

:hammer To hammer a LWSS, MWSS or HWSS is to smash things into the rear end of it in order to transform it into a different type of spaceship. A hammer is the object used to do the hammering. In the following example by Dieter Leithner a LWSS is hammered by two more LWSS to make it into a MWSS.


O..O................
....O...OO..........
O...O..OOO.....OOOO.
.OOOO..OO.O....O...O
........OOO....O....
.........O......O..O

:hammerhead A certain front end for c/2 spaceships. The central part of the hammerhead pattern is supported between two MWSS. The picture below shows a small example of a spaceship with a hammerhead front end (the front 9 columns).


................O..
.OO...........O...O
OO.OOO.......O.....
.OOOOO.......O....O
..OOOOO.....O.OOOO.
......OOO.O.OO.....
......OOO....O.....
......OOO.OOO......
..........OO.......
..........OO.......
......OOO.OOO......
......OOO....O.....
......OOO.O.OO.....
..OOOOO.....O.OOOO.
.OOOOO.......O....O
OO.OOO.......O.....
.OO...........O...O
................O..

:handshake An old MIT name for lumps of muck, from the following form (2 generations on from the stairstep hexomino):


..OO.
.O.OO
OO.O.
.OO..

:harbor (p5) Found by Dave Buckingham in September 1978. The name is by Dean Hickerson.


.....OO...OO.....
.....O.O.O.O.....
......O...O......
.................
.....OO...OO.....
OO..O.O...O.O..OO
O.O.OO.....OO.O.O
.O.............O.
.................
.O.............O.
O.O.OO.....OO.O.O
OO..O.O...O.O..OO
.....OO...OO.....
.................
......O...O......
.....O.O.O.O.....
.....OO...OO.....

:harvester (c p4 fuse) Found by David Poyner, this was the first published example of a fuse. The name refers to the fact the it produces debris in the form of blocks which contain the same number of cells as the fuse has burnt up.


................OO
...............O.O
..............O...
.............O....
............O.....
...........O......
..........O.......
.........O........
........O.........
.......O..........
......O...........
.....O............
OOOOO.............
OOOO..............
O.OO..............

:hashlife A Life algorithm by Bill Gosper that is designed to take advantage of the considerable amount of repetitive behaviour in many large patterns of interest. This algorithm is described by Gosper in his paper listed in the bibliography at the end of this lexicon. Roughly speaking, the idea is to store subpatterns in a hash table so that the results of their evolution do not need to be recomputed if they arise again at some other place or time in the evolution of the full pattern. This does, however, mean that complex patterns can require substantial amounts of memory.

Hashlife provides a means of evolving repetitive patterns millions (or even billions or trillions) of generations further than normal Life algorithms can manage in a reasonable amount of time. It is not, however, suitable for showing a continuous display of the evolution of a pattern, because it works asynchronously - at any given moment it will usually have evolved different parts of the pattern through different numbers of generations.

:hassle See hassler.

:hassler An oscillator that works by hassling (repeatedly moving or changing) some object. For some examples, see Jolson, baker's dozen, toad-flipper, toad-sucker and traffic circle.

:hat (p1) Found in 1971. See also twinhat and sesquihat.


..O..
.O.O.
.O.O.
OO.OO

:heat For an oscillator or spaceship, the average number of cells which change state in each generation. For example, the heat of a glider is 4, because 2 cells are born and 2 die every generation.

For a period n oscillator with an r-cell rotor the heat is at least 2r/n and no more than r(1-(n mod 2)/n). For n=2 and n=3 these bounds are equal.

:heavyweight emulator = HW emulator

:heavyweight spaceship = HWSS

:heavyweight volcano = HW volcano

:hebdarole (p7) Found by Noam Elkies, November 1997. Compare fumarole. The smaller version shown below was found soon after by Alan Hensel using a component found by Dave Buckingham in June 1977. The top tens rows can be stabilized by their mirror image (giving an inductor) and this was the original form found by Elkies.


...........OO...........
....OO...O....O...OO....
.O..O..O.O....O.O..O..O.
O.O.O.OO.O....O.OO.O.O.O
.O..O..O.O.OO.O.O..O..O.
....OO....O..O....OO....
...........OO...........
.......O..O..O..O.......
......O.OO....OO.O......
.......O........O.......
........................
...OO..............OO...
...O..OOOO....OOOO..O...
....O.O.O.O..O.O.O.O....
...OO.O...OOOO...O.OO...
.......OO......OO.......
.........OO..OO.........
.........O..O.O.........
..........OO............

:hectic (p30) Found by Robert Wainwright in September 1984.


......................OO...............
......................OO...............
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.........O..........OO...OO............
.......O.O............OOO..............
......O.O............O...O.............
OO...O..O.............O.O..............
OO....O.O..............O...............
.......O.O......O.O....................
.........O......OO.....................
.................O...O.................
.....................OO......O.........
....................O.O......O.O.......
...............O..............O.O....OO
..............O.O.............O..O...OO
.............O...O............O.O......
..............OOO............O.O.......
............OO...OO..........O.........
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
.......................................
...............OO......................
...............OO......................

:Heisenburp device A pattern which can detect the passage of a glider without affecting the glider's path or timing. The first such device was constructed by David Bell in December 1992. The term is due to Bill Gosper.

The following is an example of the kind of reaction used at the heart of a Heisenburp device. The glider at bottom right alters the reaction of the other two gliders without itself being affected in any way.


O.....O....
.OO...O.O..
OO....OO...
...........
...........
...........
.........OO
........O.O
..........O

:helix A convoy of standard spaceships used in a Caterpillar to move some piece of debris at the speed of the Caterpillar. The following diagram illustrates the idea.


...............................O.............
.................O............OOO............
................OOO....OOO....O.OO...........
.........OOO....O.OO...O..O....OOO..OOO......
.........O..O....OOO...O.......OO...O........
.........O.......OO....O...O.........O.......
.........O...O.........O...O.................
OOO......O...O.........O.....................
O..O.....O..............O.O..................
O.........O.O................................
O............................................
.O.O.........................................
.............................................
.............................................
..........O..................................
.........OOO.................................
.........O.OO................................
..........OOO................................
..........OO.................................
.............................................
.............................................
...............OOO...........................
...............O..O....O.....OOO.............
...............O......OOO....O..O....O.......
...............O.....OO.O....O......OOO......
....OOO.........O.O..OOO.....O.....OO.O......
....O..O.............OOO......O.O..OOO.......
....O................OOO...........OOO.......
....O.................OO...........OOO.......
.....O.O............................OO.......
...........................................O.
..........................................OOO
.........................................OO.O
.........................................OOO.
..........................................OO.
.............................................
.............................................
.............................................
.............................................
.............................................
.............................................
.........................................O...
..............................OOO.......OOO..
................OOO.....O....O..O......OO.O..
..........O....O..O....OOO......O......OOO...
.........OOO......O....O.OO.....O......OOO...
.........O.OO.....O.....OOO..O.O........OO...
..........OOO..O.O......OOO..................
.O........OOO...........OOO..................
OOO.......OOO...........OO...................
O.OO......OO.................................
.OOO......................................O..
.OO......................................OOO.
........................................OO.O.
........................................OOO..
.........................................OO..
.........OOO.................................
........O..O.................................
...........O.................................
...........O.................................
........O.O..................................

:heptaplet Any 7-cell polyplet.

:heptapole (p2) The barberpole of length 7.


OO........
O.O.......
..........
..O.O.....
..........
....O.O...
..........
......O.O.
.........O
........OO

:heptomino Any 7-cell polyomino. There are 108 such objects. Those with names in common use are the B-heptomino, the Herschel and the pi-heptomino.

:Herschel (stabilizes at time 128) The following pattern which occurs at generation 20 of the B-heptomino.


O..
OOO
O.O
..O

:Herschel conduit A conduit that moves a Herschel from one place to another. See also Herschel loop.

Sixteen simple stable Herschel conduits are currently known, having been discovered from 1995 onwards by Dave Buckingham (DJB) and Paul Callahan (PBC). (Of course, the number depends on what is meant by "simple".) These are shown in the following table. In this table "steps" is the number of steps, "m" tells how the Herschel is moved (R = turned right, L = turned left, B = turned back, F = unturned, f = flipped), and "dx" and "dy" give the displacement of the centre cell of the Herschel (assumed to start in the orientation shown above).


------------------------------------
steps  m     dx   dy     discovery
------------------------------------
  64   R    -11    9   DJB, Sep 1995
  77   Ff   -25   -8   DJB, Aug 1996
 112   L    -12  -33   DJB, Jul 1996
 116   F    -32    1   PBC, Feb 1997
 117   F    -40   -6   DJB, Jul 1996
 119   Ff   -20   14   DJB, Sep 1996
 125   Bf     9  -17   PBC, Nov 1998
 153   Ff   -48   -4   PBC, Feb 1997
 156   L    -17  -41   DJB, Aug 1996
 158   Ff   -27   -5   DJB, Jul 1996
 166   F    -49    3   PBC, May 1997
 176   Ff   -45    0   PBC, Oct 1997
 190   R    -24   16   DJB, Jul 1996
 200   Lf   -17  -40   PBC, Jun 1997
 202   Rf    -7   32   DJB, May 1997
 222   Bf     6  -16   PBC, Oct 1998
------------------------------------

See also Herschel transceiver.

:Herschel loop A cyclic Herschel track. Although no loop of length less than 256 generations has been constructed it is possible to make oscillators of smaller periods by putting more than one Herschel in the track. In this way oscillators, and in most cases guns, of all periods from 54 onwards can now be constructed (although the p55 case is a bit strange, shooting itself with gliders in order to stabilize itself). See also emu and omniperiodic.

:Herschel receiver A pattern found by Paul Callahan in 1996, as part of the first stable glider reflector. Used as a receiver, it converts two parallel input gliders (with path separations of 2, 5, or 6) to an R-pentomino, which is then converted to a Herschel by one of two known mechanisms (the first of which was found by Dave Buckingham way back in 1972, and the second by Stephen Silver in October 1997). The version using Buckingham's R-to-Herschel converter is shown below.


...............................................O.O
......................................OO.......OO.
......................................OO........O.
...OO.............................................
...O..............................................
....O.............................................
...OO.............................................
............OO....................................
...........O.O....................................
............O..............................O......
......................................OO...O.O....
.....................................O..O..OO.....
OO....................................OO..........
OO.............................OO.................
...............................OO.................
..................................................
..................................................
..................................................
..................................................
..................................................
..................................................
............................................OO....
............................................OO....
........................................OO........
........................................O.O.......
..........................................O.......
..........................................OO......
.............................OO...................
.............................OO...................
..................................................
..................................................
...........................OO.....................
...........................OO.....................

:Herschel track A track for Herschels. See also B track.

:Herschel transceiver An adjustable Herschel conduit made up of a Herschel transmitter and a Herschel receiver. The intermediate stage consists of two gliders on parallel tracks, so the transmitter and receiver can be separated by any required distance. The conduit may be stable, or may contain low-period oscillators.

:Herschel transmitter Any Herschel-to-glider converter that produces two gliders on parallel tracks which can be used as input to a Herschel receiver. If the gliders are far enough apart, a suitably oriented mirror image of the receiver will also work: the first glider triggers the receiver and the second glider deletes the extra beehive.

The following diagram shows a stable Herschel transmitter found by Paul Callahan in May 1997:


......OO...........
.....O.O...........
...OOO.............
..O...O......O.....
..OO.OO......OOO...
.............O.O...
...............O...
...................
...................
OO.O...............
O.OO...............
...................
...................
...................
...............OO..
...............O...
................OOO
..................O
Examples of small reversible p6 and p7 transmitters are also known.

:Hertz oscillator (p8) Compare negentropy, and also cauldron. Found by Conway's group in 1970.


...OO.O....
...O.OO....
...........
....OOO....
...O.O.O.OO
...O...O.OO
OO.O...O...
OO.O...O...
....OOO....
...........
....OO.O...
....O.OO...

:hexadecimal = beehive and dock

:hexaplet Any 6-cell polyplet.

:hexapole (p2) The barberpole of length 6.


OO.......
O.O......
.........
..O.O....
.........
....O.O..
.........
......O.O
.......OO

:hexomino Any 6-cell polyomino. There are 35 such objects. For some examples see century, stairstep hexomino, table, toad and Z-hexomino.

:H-heptomino Name given by Conway to the following heptomino. After one generation this is the same as the I-heptomino.


OO..
.O..
.OOO
..O.

:hive = beehive

:hivenudger (c/2 orthogonally, p4) A spaceship found by Hartmut Holzwart in July 1992. (The name is due to Bill Gosper.) It consists of a pre-beehive escorted by four LWSS. In fact any LWSS can be replaced by a MWSS or a HWSS, so that there are 45 different single-hive hivenudgers.


OOOO.....O..O
O...O...O....
O.......O...O
.O..O...OOOO.
.............
.....OO......
.....OO......
.....OO......
.............
.O..O...OOOO.
O.......O...O
O...O...O....
OOOO.....O..O
Wider versions can be made by stabilizing the front of the extended "pre-beehive", as in the line puffer shown below.

.........O.O..................
........O..O..................
.......OO.....................
......O...O...................
.....OOO.O....................
..OO..........................
.O...OOOOO.......OOOO.....O..O
O...O............O...O...O....
O.....OO.........O.......O...O
OOO...OOOO........O..O...OOOO.
.O.......O....................
.OO...................OO......
.O.O..................OO......
.OO..OO.O........O.O..OO......
..O.OOO.O...O.OOOO.O..OO......
.........OO.O.OO..O...OO...OOO
....OOOOOO.OO...OOOO..OO...OOO
.....O....OOO......O..OO...OOO
......OO.....OO..OO...OO......
.......O..O.....OOOO..OO......
........O.O.OO.....O..OO......
......................OO......
..............................
..................O..O...OOOO.
.................O.......O...O
.................O...O...O....
.................OOOO.....O..O

:honeycomb (p1)


..OO..
.O..O.
O.OO.O
.O..O.
..OO..

:honey farm (p1) A common formation of four beehives.


......O......
.....O.O.....
.....O.O.....
......O......
.............
.OO.......OO.
O..O.....O..O
.OO.......OO.
.............
......O......
.....O.O.....
.....O.O.....
......O......

:hook Another term for a bookend. It is also used for other hook-shaped things, such as occur in the eater1 and the hook with tail, for example.

:hook with tail (p1) For a long time this was the smallest still life without a well-established name. It is now a vital component of the smallest known HWSS gun, where it acts as a rock.


O.O..
OO.O.
...O.
...OO

:houndstooth agar The p2 agar that results from tiling the plane with the following pattern.


.OOO
.O..
..O.
OOO.

:house The following induction coil. It is generation 3 of the pi-heptomino. See spark coil and dead spark coil.


.OOO.
O...O
OO.OO

:hustler (p3) Found by Robert Wainwright, June 1971.


.....OO....
.....OO....
...........
...OOOO....
O.O....O...
OO.O...O...
...O...O.OO
...O....O.O
....OOOO...
...........
....OO.....
....OO.....

:hustler II (p4)


....O...........
....OOO.........
.......O........
......O..OO.....
O.OO.O.OO..O....
OO.O.O.....O....
.....O....O.....
....O.....O.O.OO
....O..OO.O.OO.O
.....OO..O......
........O.......
.........OOO....
...........O....

:HW emulator (p4) Found by Robert Wainwright in June 1980. See also emulator.


.......OO.......
..OO.O....O.OO..
..O..........O..
...OO......OO...
OOO..OOOOOO..OOO
O..O........O..O
.OO..........OO.

:HWSS (c/2 orthogonally, p4) A heavyweight spaceship, the fourth most common spaceship. Found by Conway in 1970. See also LWSS and MWSS.


...OO..
.O....O
O......
O.....O
OOOOOO.

:HWSS emulator = HW emulator

:HW volcano (p5) A p5 domino sparker, found by Dean Hickerson in February 1995. There are at least two known forms for this, one of which is shown below.


.........O..........................
........O.O.........................
......OOO.O.........................
.....O....OO.O......................
.....O.OO...OO......OO..............
....OO.O.OO.........O.O.............
.........O.OOOOO......O..O.OO.......
..O.OO.OO.O.....O....OO.O.OO.O......
.....OO.....OOOO........O....O......
O...O.O..O...O.O....OO.O.OOOO.OO....
O...O.O..OO.O.OO.OO....O.O....O.O...
.....OO...OOO.OO.O.OOO.O..OOO...O...
..O.OO.OO.OO.............O.O..O.O.OO
...........O......O.O.O.O..OO.O.O.O.
....OO.O.O.OO......OO.O.O.O...O.O.O.
.....O.OO.O..O.......O.OO..OOOO.OO..
.....O....O.O........O...OO.........
....OO....OO........OO...O..O.......
...........................OO.......

:hybrid grey ship A grey ship containing more than one type of region of density 1/2, usually a combination of a with-the-grain grey ship and an against-the-grain grey ship.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex.htm0000644000175100001440000001736012156145314014015 00000000000000 Life Lexicon (Introduction)
Life Lexicon

Release 25, 2006 February 28
Multipage HTML version


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

INTRODUCTION
This is a lexicon of terms relating to John Horton Conway's Game of Life. It is also available in a single-page HTML version and an ASCII version.

This lexicon was compiled by Stephen A. Silver - see below for additional credits. See my web-site for contact information.

The latest versions of this lexicon (both HTML and ASCII) should be available from the Life Lexicon Home Page.

CREDITS
The largest single source for the early versions of this lexicon was a glossary compiled by Alan Hensel "with indispensable help from John Conway, Dean Hickerson, David Bell, Bill Gosper, Bob Wainwright, Noam Elkies, Nathan Thompson, Harold McIntosh, and Dan Hoey".

Other sources include the works listed in the bibliography at the end of this lexicon, as well as pattern collections by Alan Hensel and David Bell (and especially Dean Hickerson's file stamp.l in the latter collection), and the web sites of Mark Niemiec, Paul Callahan, Achim Flammenkamp, Robert Wainwright and Heinrich Koenig. Recent releases also use a lot of information from Dean Hickerson's header to his 1995 stamp file.

Most of the information on recent results is from the discoverers themselves.

The following people all provided useful comments on earlier releases of this lexicon: David Bell, Nicolay Beluchenko, Johan Bontes, Scot Ellison, Nick Gotts, Dave Greene, Alan Hensel, Dean Hickerson, Dieter Leithner, Mark Niemiec, Gabriel Nivasch, Andrew Okrasinski, Peter Rott, Ken Takusagawa, Andrew Trevorrow and Malcolm Tyrrell.

The format, errors, use of British English and anything else you might want to complain about are by Stephen Silver.

COPYING
This lexicon is copyright © Stephen Silver, 1997-2005. It may be freely copied and/or modified as long as due credit is given. This includes not just credit to those who have contributed in some way to the present version (see above), but also credit to those who have made any modifications.
LEXICOGRAPHIC ORDER
I have adopted the following convention: all characters (including spaces) other than letters and digits are ignored for the purposes of ordering the entries in this lexicon. (Many terms are used by some people as a single word, with or without a hyphen, and by others as two words. My convention means that I do not have to list these in two separate places. Indeed, I list them only once, choosing whichever form seems most common or sensible.) Digits lexicographically precede letters.
FORMAT
The diagrams in this lexicon are in a very standard format. You should be able to simply copy a pattern, paste it into a new file and run it in your favourite Life program. If you use Johan Bontes' Life32, Mirek Wojtowicz' MCell or Andrew Trevorrow and Tomas Rokicki's Golly then you can just paste the pattern directly into the Life program. I have restricted myself to diagrams of size 64x64 or less.

Most definitions that have a diagram have also some data in brackets after the keyword. Oscillators are maked as pn (where n is a positive integer), meaning that the period is n (p1 indicates a still life). Wicks are marked in the same way but with the word "wick" added. For spaceships the speed (as a fraction of c, the speed of light), the direction and the period are given. Fuses are marked with speed and period and have the word "fuse" added. Wicks and fuses are infinite in extent and so have necessarily been truncated, with the ends stabilized wherever practical.

SCOPE
This lexicon covers only Conway's Life, and provides no information about other cellular automata. David Bell has written articles on two other interesting cellular automata: HighLife (which is similar to Life, but has a tiny replicator) and Day & Night (which is very different, but exhibits many of the same phenomena). These articles can be found on his web-site.
ERRORS AND OMISSIONS
If you find any errors (including typos) or serious omissions, then please let me know.
NAMES
When deciding whether to use full or abbreviated forms of forenames I have tried, wherever possible, to follow the usage of the person concerned.
QUOTE
Every other author may aspire to praise; the lexicographer can only hope to escape reproach.    Samuel Johnson, 1775
DEDICATION
This lexicon is dedicated to the memory of Dieter Leithner, who died on 26 February 1999.
1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_i.htm0000644000175100001440000002663612156145314014333 00000000000000 Life Lexicon (I)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:I-heptomino Name given by Conway to the following heptomino. After one generation this is the same as the H-heptomino.


OO..
.O..
.OO.
..OO

:IMG = intermitting glider gun

:Immigration A form of colorized Life in which there are two types of ON cell, a newly-born cell taking the type of the majority of its three parent cells and surviving cells remaining of the same type as in the previous generation.

:induction coil Any object used to stabilize an edge (or edges) without touching. The tubs used in the Gray counter are examples, as are the blocks and snakes used in the Hertz oscillator and the heptomino at the bottom of the mathematician.

:inductor Any oscillator with a row of dead cells down the middle and whose two halves are mirror images of one another, both halves being required for the oscillator to work. The classic examples are the pulsar and the tumbler. If still lifes are considered as p1 oscillators then there are numerous simple examples such as table on table, dead spark coil and cis-mirrored R-bee. Some spaceships, such as the brain, the snail and the spider use the same principle.

:infinite glider hotel A pattern by David Bell, named after Hilbert's "infinite hotel" scenario in which a hotel with an infinite number of rooms has room for more guests even if it is already full, simply by shuffling the old guests around.

In this pattern, two pairs of Corderships moving at c/12 are pulling apart such that there is an ever-lengthening glider track between them. Every 128 generations another glider is injected into the glider track, joining the gliders already circulating there. The number of gliders in the track therefore increases without limit.

The tricky part of this construction is that even though all the previously injected gliders are repeatedly flying through the injection point, that point is guaranteed to be empty when it is time for the next glider to be injected.

:infinite growth Growth of a finite pattern such that the population tends to infinity, or at least is unbounded. Sometimes the term is used for growth of something other than population (for example, length), but here we will only consider infinite population growth. The first known pattern with infinite growth in this sense was the Gosper glider gun.

An interesting question is: What is the minimum population of a pattern that exhibits infinite growth? In 1971 Charles Corderman found that a switch engine could be stabilized by a pre-block in a number of different ways, giving 11-cell patterns with infinite growth. This record stood for more than quarter of a century until Paul Callahan found, in November 1997, two 10-cell patterns with infinite growth. The following month he found the one shown below, which is much neater, being a single cluster. This produces a stabilized switch engine of the block-laying type.


......O.
....O.OO
....O.O.
....O...
..O.....
O.O.....
Nick Gotts and Paul Callahan have also shown that there is no infinite growth pattern with fewer than 10 cells, so that the question has now been answered.

Also of interest is the following pattern (again found by Callahan), which is the only 5x5 pattern with infinite growth. This too emits a block-laying switch engine.


OOO.O
O....
...OO
.OO.O
O.O.O

Following a conjecture of Nick Gotts, Stephen Silver produced, in May 1998, a pattern of width 1 which exhibits infinite growth. This pattern was very large (12470x1 in the first version, reduced to 5447x1 the following day). In October 1998 Paul Callahan did an exhaustive search, finding the smallest example, the 39x1 pattern shown below. This produces two block-laying switch engines, stability being achieved at generation 1483.


OOOOOOOO.OOOOO...OOO......OOOOOOO.OOOOO

Although the simplest infinite growth patterns grow at a rate that is (asymptotically) linear, many other types of growth rate are possible, quadratic growth (see breeder) being the fastest. Dean Hickerson has found many patterns with unusual growth rates, such as sawtooths and a caber tosser.

See also Fermat prime calculator.

:initials = monogram

:inline inverter The following reaction in which a p30 gun can be used to invert the presence or absence of gliders in a p30 stream, with the output glider stream being in the same direction as the input glider stream.


................O...................
.................O..................
...............OOO..................
....................................
.......................O.O..........
.....................O...O..........
.............O.......O..............
............OOOO....O....O........OO
...........OO.O.O....O............OO
OO........OOO.O..O...O...O..........
OO.........OO.O.O......O.O..........
............OOOO....................
.............O......................

:integral = integral sign

:integral sign (p1)


...OO
..O.O
..O..
O.O..
OO...

:intentionless = elevener

:interchange (p2) A common formation of six blinkers.


..OOO....OOO..
..............
O............O
O............O
O............O
..............
..OOO....OOO..

:intermitting glider gun Despite the name, an intermitting glider gun (IMG) is more often an oscillator than a gun. There are two basic types. A type 1 IMG consists of two guns firing at one another in such a way that each gun is temporarily disabled on being hit by a glider from the other gun. A type 2 IMG consists of a single gun firing at a 180-degree glider reflector in such a way that returning gliders temporarily disable the gun.

Both types of IMG can be used to make glider guns of periods that are multiples of the base period. This is done by firing another gun across the two-way intermittent glider stream of the IMG in such a way that gliders only occasionally escape.

:island The individual polyplets of which a stable pattern consists are sometimes called islands. So, for example, a boat has only one island, while an aircraft carrier has two, a honey farm has four and the standard form of the eater3 has five.

:Iwona (stabilizes at time 28786) The following methuselah found by Andrzej Okrasinski in August 2004.


..............OOO...
....................
....................
....................
....................
....................
..O.................
...OO...............
...O..............O.
..................O.
..................O.
...................O
..................OO
.......OO...........
........O...........
....................
....................
....................
....................
OO..................
.O..................

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_j.htm0000644000175100001440000001400012156145314014312 00000000000000 Life Lexicon (J)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:J = Herschel

:jack (p4) Found by Robert Wainwright, April 1984.


...O.....O...
...OO...OO...
O..OO...OO..O
OOO..O.O..OOO
.....O.O.....
OOO..O.O..OOO
O..OO...OO..O
...OO...OO...
...O.....O...

:jagged lines A pattern constructed by Dean Hickerson in May 2005 that uses puffers to produce a line of bi-blocks that weaves back and forth in a complicated way.

:jam (p3) Found by Achim Flammenkamp in 1988, but not widely known about until its independent discovery (and naming) by Dean Hickerson in September 1989. Compare with mold. In fact this is really very like caterer. In terms of its 7x7 bounding box it ties with trice tongs as the smallest p3 oscillator.


...OO.
..O..O
O..O.O
O...O.
O.....
...O..
.OO...

:Jaws A breeder constructed by Nick Gotts in February 1997. In the original version Jaws had an initial population of 150, which at the time was the smallest for any known pattern with superlinear growth. In November 1997 Gotts produced a 130-cell Jaws using some switch engine predecessors found by Paul Callahan. Jaws has since been beaten by the even smaller mosquitoes, teeth, catacryst and metacatacryst.

Jaws consists of eight pairs of switch engines which produce a new block-laying switch engine (plus masses of junk) every 10752 generations. It is therefore an MMS breeder.

:JC = dead spark coil

:JHC John Horton Conway. Also another name for monogram.

:J-heptomino = Herschel

:Jolson (p15) Two blocks hassled by two pentadecathlons. Found by Robert Wainwright in November 1984 and named by Bill Gosper. A p9 version using snackers instead of pentadecathlons is also possible.


.OO......OO..
O..O....O..O.
O..O....O..O.
O..O....O..O.
.OO......OO..
.............
.............
.......O.....
.....O..O.OO.
......OO..OO.
.............
.............
......OOOO...
.....OOOOOO..
....OOOOOOOO.
...OO......OO
....OOOOOOOO.
.....OOOOOO..
......OOOO...

:Justyna (stabilizes at time 26458) The following methuselah found by Andrzej Okrasinski in May 2004.


.................O....
................O..O..
.................OOO..
.................O..O.
......................
OO................O...
.O................O...
..................O...
......................
......................
......................
......................
......................
......................
......................
...................OOO
...........OOO........

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_k.htm0000644000175100001440000001246512156145314014330 00000000000000 Life Lexicon (K)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:keys See short keys, bent keys and odd keys.

:kickback reaction The following collision of two gliders whose product is a single glider travelling in the opposite direction to one of the original gliders. This is important in the proof of the existence of a universal constructor, and in Bill Gosper's total aperiodic, as well as a number of other constructions.


.....O..
......OO
.OO..OO.
O.O.....
..O.....

:kidney A Gosperism for century. See also diuresis.

:killer toads A pair of toads acting together so that they can eat things. Here, for example, are some killer toads eating a HWSS. Similarly they can eat a MWSS (but not a LWSS). For another example see twirling T-tetsons II. See also candlefrobra.


..OO.......OOO
O....O....OOO.
......O.......
O.....O.......
.OOOOOO.......
..........OOO.
...........OOO

:Klein bottle As an alternative to a torus, it's possible to make a finite Life universe in the form of a Klein bottle. The simplest way to do this is to use an m x n rectangle with the top edge joined to the bottom edge (as for a torus) and the left edge twisted and joined to the right.

:knightship Any spaceship of type (2m,m)/n. Such spaceships do exist (see universal constructor), but no concrete example is known. A knightship must be asymmetric and its period must be at least 6, which makes searching for them using programs like lifesrc very difficult.

By analogy with the corresponding fairy chess pieces, spaceships of types (3m,m)/n, (3m,2m)/n and (4m,m)/n would presumably be called camelships, zebraships and giraffeships, respectively. But no examples of these are known either, and they are even more difficult to search for.

:Kok's galaxy (p8) Found by Jan Kok in 1971. See converter for a use of this sparker.


OOOOOO.OO
OOOOOO.OO
.......OO
OO.....OO
OO.....OO
OO.....OO
OO.......
OO.OOOOOO
OO.OOOOOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_l.htm0000644000175100001440000004533312156145314014331 00000000000000 Life Lexicon (L)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:lake Any still life consisting of a simple closed curve made from diagonally connected dominoes. The smallest example is the pond, and the next smallest is this (to which the term is sometimes restricted):


....OO....
...O..O...
...O..O...
.OO....OO.
O........O
O........O
.OO....OO.
...O..O...
...O..O...
....OO....

:Laputa (p2) Found by Rich Schroeppel, September 1992.


...OO.OO....
...OO.O...OO
........O..O
.OOOOOO.OOO.
O..O.O......
OO...O.OO...
....OO.OO...

:large S = big S

:Lidka (stabilizes at time 29053) A methuselah found by Andrzej Okrasinski in July 2005.


..........OOO..
..........O....
..........O...O
...........O..O
............OOO
...............
.O.............
O.O............
.O.............
The following variant, pointed out by David Bell, has two fewer cells and lasts two generations longer.

..........OOO..
...............
...........OO.O
............O.O
..............O
...............
.O.............
O.O............
.O.............

:Life A 2-dimensional 2-state cellular automaton discovered by John Conway in 1970. The states are referred to as ON and OFF (or live and dead). The transition rule is as follows: a cell that is ON will remain ON in the next generation if and only if exactly 2 or 3 of the 8 adjacent cells are also ON, and a cell that is OFF will turn ON if and only if exactly 3 of the 8 adjacent cells are ON. (This is more succinctly stated as: "If 2 of your 8 nearest neighbours are ON, don't change. If 3 are ON, turn ON. Otherwise, turn OFF.")

:Life32 A freeware Life program by Johan Bontes for Microsoft Windows 95/98/ME/NT/2000/XP: http://www.xs4all.nl/~jbontes/.

:LifeLab A shareware Life program by Andrew Trevorrow for the Macintosh (MacOS 8.6 or later): http://www.trevorrow.com/lifelab/.

:LifeLine A newsletter edited by Robert Wainwright from 1971 to 1973. During this period it was the main forum for discussions about Life. The newsletter was nominally quarterly, but the actual dates of its eleven issues were as follows:


Mar, Jun, Sep, Dec 1971
Sep, Oct, Nov, Dec 1972
Mar, Jun, Sep 1973

:Lifenthusiast A Life enthusiast. Term coined by Robert Wainwright.

:lifesrc David Bell's Life search program, for finding new spaceships and oscillators. This is a C implementation of an algorithm developed by Dean Hickerson in 6502 assembler. Most of the spaceships and many of the oscillators shown in this lexicon were found with lifesrc or by Hickerson's original program.

Although lifesrc itself is a command-line program, Jason Summers has made a GUI version called WinLifeSearch for Microsoft Windows.

The lifesrc algorithm is only useful for very small periods, as the amount of computing power required rises rapidly with increasing period. For most purposes, period 7 is the practical limit with current hardware.

Lifesrc is available from http://www.canb.auug.org.au/~dbell/ (source code only).

Compare gfind.

:light bulb (p2) Found in 1971.


.OO.O..
.O.OO..
.......
..OOO..
.O...O.
.O...O.
..O.O..
O.O.O.O
OO...OO
The same rotor can be embedded in a slightly smaller stator like this:

...O.....
.OOO.....
O........
OOOOOO...
......O..
..O...O..
..OO.O...
......OOO
........O

:lightspeed ribbon = superstring

:lightspeed wire Any wick that can burn non-destructively at the speed of light. These are potentially useful for various things, but so far no one has found the necessary mechanisms. The following diagram shows an example of a lightspeed wire, with a small defect that travels along it at the speed of light.


....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
..........................................................
..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
.O......O...............................................O.
O.OOOOO....OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.O
.O.....O................................................O.
..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..
..........................................................
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....
....OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO..OO....

:lightweight emulator = LW emulator

:lightweight spaceship = LWSS

:lightweight volcano = toaster

:line puffer A puffer which produces its output by means of an orthogonal line of cells at right angles to the direction of travel. The archetypal line puffer was found by Alan Hensel in March 1994, based on a spaceship found earlier that month by Hartmut Holzwart. The following month Holzwart found a way to make extensible c/2 line puffers, and Hensel found a much smaller stabilization the following day. But in October 1995 Tim Coe discovered that for large widths these were often unstable, although typically lasting millions of generations. In May 1996, however, Coe found a way to fix the instability. The resulting puffers appear to be completely stable and to exhibit an exponential increase in period as a function of width, although neither of these things has been proved.

Line puffers have enabled the construction of various difficult periods for c/2 spaceships and puffers, including occasionally periods which are not multiples of 4 and which would therefore be impossible to attain with the usual type of construction based on standard spaceships. (See frothing puffer for another method of constructing such periods.) In particular, the first c/2 rake with period not divisible by 4 was achieved in January 2000 when David Bell constructed a p42 backrake by means of line puffers.

See also hivenudger and puff suppressor.

:line ship A spaceship in which the front end is a linestretcher, the line being eaten by the back end.

:linestretcher A wickstretcher that stretches a single diagonal line of cells. The first example was constructed by Jason Summers in March 1999; this was c/12 and used switch engine based puffers found earlier by Dean Hickerson. The first c/4 example was found by Hartmut Holzwart in November 2004.

:loading dock (p3) Found by Dave Buckingham, September 1972.


....O....
..OOO....
.O...OO..
O.OO...O.
.O...OO.O
..OO...O.
....OOO..
....O....

:loaf (p1)


.OO.
O..O
.O.O
..O.

:loaflipflop (p15) Here four pentadecathlons hassle a loaf. Found by Robert Wainwright in 1990.


................O.................
...............OOO................
..................................
..................................
...............OOO................
..................................
...............O.O................
...............O.O................
..................................
...............OOO................
..................................
..................................
...............OOO................
................O.................
..................................
.O..O.OO.O..O...............OO....
OO..O....O..OO...OO.......O....O..
.O..O.OO.O..O...O..O.....O......O.
................O.O.....O........O
.................O......O........O
........................O........O
.........................O......O.
..........................O....O..
............................OO....
..................OOO.............
.................O...O............
................O.....O...........
..................................
...............O.......O..........
...............O.......O..........
..................................
................O.....O...........
.................O...O............
..................OOO.............

:loaf on loaf = bi-loaf

:loaf siamese barge (p1)


..OO.
.O..O
O.O.O
.O.O.
..O..

:LoM = lumps of muck

:lone dot agar An agar in which every live cell is isolated in every generation.

:lonely bee = worker bee

:long A term applied to an object that is of the same basic form as some standard object, but longer. For examples see long barge, long boat, long bookend, long canoe, long shillelagh, long ship and long snake.

:long^3 The next degree of longness after long long. Some people prefer "extra long".

:long^4 The next degree of longness after long^3. Some people prefer "extra extra long".

:long barge (p1)


.O...
O.O..
.O.O.
..O.O
...O.

:long boat (p1)


.O..
O.O.
.O.O
..OO

:long bookend The following induction coil, longer than a bookend.


...OO
O...O
OOOO.

:long canoe (p1)


....OO
.....O
....O.
...O..
O.O...
OO....

:long hat = loop

:long hook = long bookend

:long house = dock

:long integral (p1)


..OO
.O.O
.O..
..O.
O.O.
OO..

:long long The next degree of longness after long. Some people prefer "very long".

:long long barge (p1)


.O....
O.O...
.O.O..
..O.O.
...O.O
....O.

:long long boat (p1)


.O...
O.O..
.O.O.
..O.O
...OO

:long long canoe (p1)


.....OO
......O
.....O.
....O..
...O...
O.O....
OO.....

:long long ship (p1)


OO...
O.O..
.O.O.
..O.O
...OO

:long long snake (p1)


OO....
O.O...
...O.O
....OO

:long shillelagh (p1)


OO..OO
O..O.O
.OO...

:long ship (p1)


OO..
O.O.
.O.O
..OO

:long sinking ship = long canoe

:long snake (p1)


OO...
O.O.O
...OO

:loop (p1)


.OO..
O..O.
.O.O.
OO.OO

:low-density Life = sparse Life

:lumps of muck The common evolutionary sequence that ends in the blockade. The name is sometimes used of the blockade itself, and can in general be used of any stage of the evolution of the stairstep hexomino.

:LW emulator (p4) The smallest (and least useful) emulator, found by Robert Wainwright in June 1980.


..OO.O..O.OO..
..O........O..
...OO....OO...
OOO..OOOO..OOO
O..O......O..O
.OO........OO.

:LWSS (c/2 orthogonally, p4) A lightweight spaceship, the smallest known orthogonally moving spaceship, and the second most common (after the glider). Found by Conway in 1970. See also MWSS and HWSS.


.O..O
O....
O...O
OOOO

:LWSS emulator = LW emulator

:LWTDS Life Worker Time Deficiency Syndrome. Term coined by Dieter Leithner to describe the problem of having to divide scarce time between Life and real life.

:LW volcano = toaster


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_m.htm0000644000175100001440000004727312156145314014337 00000000000000 Life Lexicon (M)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:mango (p1)


.OO..
O..O.
.O..O
..OO.

:mathematician (p5) Found by Dave Buckingham, 1972.


....O....
...O.O...
...O.O...
..OO.OO..
O.......O
OOO...OOO
.........
OOOOOOOOO
O.......O
...OOOO..
...O..OO.

:Max A name for the smallest known spacefiller. The name represents the fact that the growth rate is the fastest possible. (This has not quite been proved, however. There remains the possibility, albeit not very likely, that a periodic agar could have an average density greater than 1/2, and a spacefiller stretching such an agar at the same speed as the known spacefillers would have a faster average growth rate.)

:mazing (p4) In terms of its minimum population of 12 this ties with mold as the smallest p4 oscillator. Found by Dave Buckingham in December 1973. For some constructions using mazings, see popover and sixty-nine.


...OO..
.O.O...
O.....O
.O...OO
.......
...O.O.
....O..

:medium fish = MWSS

:metacatacryst A 52-cell pattern exhibiting quadratic growth. Found by Nick Gotts, December 2000. This is currently the smallest known pattern (in terms of initial population) with superlinear growth. See also catacryst.

:metamorphosis An oscillator built by Robert Wainwright that uses the following reaction (found by Bill Gosper) to turn gliders into LWSS, and converts these LWSS back into gliders by colliding them head on. (There are in fact two ways to do the following reaction, because the spark of the twin bees shuttle is symmetric.)


...................O.........
....................O........
..................OOO........
.............................
.............................
.............................
.............................
.............................
............O...O.....O.OO...
OO.........O.....O....O.O.O..
OO.........O.........O....O..
...........OO...O.....O.O.O..
.............OOO......O.OO...
.............................
.............OOO.............
...........OO...O............
OO.........O...............OO
OO.........O.....O.........OO
............O...O............

:metamorphosis II An oscillator built by Robert Wainwright in December 1994 based on the following p30 glider-to-LWSS converter. This converter was first found by Paul Rendell, January 1986 or earlier, but wasn't widely known about until Paul Callahan rediscovered it in December 1994.


......................O.
.....................O..
.....................OOO
........................
........................
.........O.O............
.........O..O...........
OO..........OO..........
OO........O...OO........
.....OO.....OO..........
....O....O..O...........
.........O.O............
........................
........................
........................
........................
................O.......
...............OOO......
..............OOOOO.....
.............O.O.O.O....
.............OO...OO....
........................
........................
................O.......
...............O.O......
...............O.O......
................O.......
...............OO.......
...............OO.......
...............OO.......

:methuselah Any small pattern that stabilizes only after a long time. Term coined by Conway. Examples include rabbits, acorn, the R-pentomino, blom, Iwona, Justyna and Lidka. See also ark.

:Mickey Mouse (p1) A name proposed by Mark Niemiec for the following still life:


.OO....OO.
O..O..O..O
O..OOOO..O
.OO....OO.
...OOOO...
...O..O...
....OO....

:middleweight emulator = MW emulator

:middleweight spaceship = MWSS

:middleweight volcano = MW volcano

:mini pressure cooker (p3) Found by Robert Wainwright before June 1972. Compare pressure cooker.


.....O.....
....O.O....
....O.O....
...OO.OO...
O.O.....O.O
OO.O.O.O.OO
...O...O...
...O.O.O...
....O.O....
.....O.....

:M.I.P. value The maximum population divided by the initial population for an unstable pattern. For example, the R-pentomino has an M.I.P. value of 63.8, since its maximum population is 319. The term is no longer in use.

:MIT oscillator = cuphook

:MMM breeder See breeder.

:MMS breeder See breeder.

:mod The smallest number of generations it takes for an oscillator or spaceship to reappear in its original form, possibly subject to some rotation or reflection. The mod may be equal to the period, but it may also be a quarter of the period (for oscillators that rotate 90 degrees every quarter period) or half the period (for other oscillators which rotate 180 degrees every half period, and also for flippers).

:mold (p4) Found by Achim Flammenkamp in 1988, but not widely known until Dean Hickerson rediscovered it (and named it) in August 1989. Compare with jam. In terms of its minimum population of 12 it ties with mazing as the smallest p4 oscillator. But in terms of its 6x6 bounding box it wins outright. In fact, of all oscillators that fit in a 6x7 box it is the only one with period greater than 2.


...OO.
..O..O
O..O.O
....O.
O.OO..
.O....

:monogram (p4) Found by Dean Hickerson, August 1989.


OO...OO
.O.O.O.
.OO.OO.
.O.O.O.
OO...OO

:moose antlers (p1)


OO.....OO
O.......O
.OOO.OOO.
...O.O...
....O....

:mosquito See mosquito1, mosquito2. mosquito3, mosquito4 and mosquito5.

:mosquito1 A breeder constructed by Nick Gotts in September 1998. The original version had an initial population of 103, which was then the smallest for any known pattern with superlinear growth (beating the record previously held by Jaws). This was reduced to 97 by Stephen Silver the following month, but was then almost immediately superseded by mosquito2.

Mosquito1 consists of the classic puffer train plus four LWSS and four MWSS (mostly in predecessor form, to keep the population down). Once it gets going it produces a new block-laying switch engine (plus a lot of junk) every 280 generations. It is therefore an MMS breeder, albeit a messy one.

:mosquito2 A breeder constructed by Nick Gotts in October 1998. Its initial population of 85 was for a couple of hours the smallest for any known pattern with superlinear growth, but was then beaten by mosquito3.

Mosquito2 is very like mosquito1, but uses two fewer MWSS and one more LWSS.

:mosquito3 A breeder constructed by Nick Gotts in October 1998. Its initial population of 75 was at the time the smallest for any known pattern with superlinear growth, but was beaten a few days later by mosquito4.

Mosquito3 has one less LWSS than mosquito2. It is somewhat different from the earlier mosquitoes in that the switch engines it makes are glider-producing rather than block-laying.

:mosquito4 A slightly improved version of mosquito3 which Stephen Silver produced in October 1998 making use of another discovery of Nick Gotts (September 1997): an 8-cell pattern that evolves into a LWSS plus some junk. Mosquito4 is a breeder with an initial population of 73, at the time the smallest for any known pattern with superlinear growth, but superseded a few days later by mosquito5.

:mosquito5 A slightly improved version of mosquito4 which Nick Gotts produced in October 1998. The improvement is of a similar nature to the improvement of mosquito4 over mosquito3. Mosquito5 is a breeder with an initial population of 71. At the time, this was the smallest population for any known pattern with superlinear growth, but it has since been superseded by teeth, catacryst and metacatacryst.

:mould = mold

:moving sawtooth A sawtooth such that no cell is ON for more than a finite number generations. David Bell has constructed patterns of this type, with a c/2 front end and a c/3 back end.

:MSM breeder See breeder.

:multi-state Life = colorized Life

:multum in parvo (stabilizes at time 3933) A methuselah found by Charles Corderman, but not as long-lasting as his acorn.


...OOO
..O..O
.O....
O.....

:muttering moat Any oscillator whose rotor consists of a closed chain of cells each of which is adjacent to exactly two other rotor cells. Compare babbling brook. Examples include the bipole, the blinker, the clock, the cuphook, the Gray counter, the quad, the scrubber, the skewed quad and the p2 snake pit. The following diagram shows a p2 example (by Dean Hickerson, May 1993) with a larger rotor. See ring of fire for a very large one.


OO.....
O.O.OO.
.....O.
.O..O..
..O....
..O.O.O
.....OO

:MW emulator (p4) Found by Robert Wainwright in June 1980. See also emulator and filter.


.......O.......
..OO.O...O.OO..
..O.........O..
...OO.....OO...
OOO..OOOOO..OOO
O..O.......O..O
.OO.........OO.

:MWSS (c/2 orthogonally, p4) A middleweight spaceship, the third most common spaceship. Found by Conway in 1970. See also LWSS and HWSS.


...O..
.O...O
O.....
O....O
OOOOO.

:MWSS emulator = MW emulator

:MWSS out of the blue The following reaction, found by Peter Rott in November 1997, in which a LWSS passing by a p46 oscillator creates a MWSS travelling in the opposite direction. Together with some reactions found by Dieter Leithner, and a LWSS-turning reaction which Rott had found in November 1993 (but which was not widely known until Paul Callahan rediscovered it in June 1994) this can be used to prove that there exist gliderless guns for LWSS, MWSS and HWSS for every period that is a multiple of 46.


O..O.................................
....O................................
O...O................................
.OOOO................................
.....................................
.....................................
.....................................
.....................................
.....................................
...................OO..............OO
..................OO...............OO
...................OOOOO.............
..OO................OOOO.............
..OO.....O...........................
........OOO.........OOOO.............
.......O.O.O.......OOOOO.............
........O..O......OO...............OO
........OOO........OO..............OO
.........O...........................
.....................................
.....................................
.....................................
.....................................
..O.......O..........................
.....................................
OOO.......OOO........................
.OO.OO.OO.OO.........................
..OOO...OOO..........................
...O.....O...........................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
.....................................
..OO.....OO..........................
..OO.....OO..........................

:MW volcano (p5) Found by Dean Hickerson in April 1992.


......O......
....O...O....
.............
...O.....O...
.OOO.OOO.OOO.
O...OO.OO...O
O.OOO.O.OOOO.
.O...........
...O.O.O.OO.O
..OO.OOO.O.OO
...O.O..O....
...O..OO.....
..OO.........

:My Experience with B-heptominos in Oscillators An article by Dave Buckingham (October 1996) that describes his discovery of Herschel conduits, including sufficient (indeed ample) stable conduits to enable, for the first time, the construction of period n oscillators - and true period n guns - for every sufficiently large integer n. (See Herschel loop and emu.)


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_n.htm0000644000175100001440000001701212156145314014324 00000000000000 Life Lexicon (N)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:natural Occurring often in random patterns. There is no precise measure of naturalness, since the most useful definition of "random" in this context is open to debate. Nonetheless, it is clear that objects such as blocks, blinkers, beehives and gliders are very natural, while eater2s, darts, guns, etc., are not.

:negentropy (p2) Compare Hertz oscillator.


...OO.O....
...O.OO....
...........
....OOO....
...O.O.O.OO
...OO..O.OO
OO.O...O...
OO.O...O...
....OOO....
...........
....OO.O...
....O.OO...

:neighbour Any of the eight cells adjacent to a given cell. A cell is therefore not considered to be a neighbour of itself, although the neighbourhood used in Life does in fact include this cell (see cellular automaton).

:new five (p3) Found by Dean Hickerson, January 1990.


..OO.....
.O..O....
.O.O..O..
OO.O.OO..
O........
.OOO.OOOO
.....O..O
O.OO.....
OO.OO....

:new gun An old name for the second known basic gun (found, like the first, by Bill Gosper), shown below. A number of other ways of constructing a gun from two twin bees shuttles have since been found - see edge shooter for one of these.


.........................OO.....OO
.........................OO.....OO
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
..................................
...........................OO.OO..
..........................O.....O.
..................................
.........................O.......O
.........................O..O.O..O
.........................OOO...OOO
..................................
..................................
..................................
..................................
.................O................
OO...............OO...............
OO................OO..............
.............OO..OO...............
..................................
..................................
..................................
.............OO..OO...............
OO................OO.......OO.....
OO...............OO........OO.....
.................O................

:Noah's ark The following diagonal puffer consisting of two switch engines. This was found by Charles Corderman in 1971. The name comes from the variety of objects it leaves behind: blocks, blinkers, beehives, loaves, gliders, ships, boats, long boats, beacons and block on tables.


..........O.O..
.........O.....
..........O..O.
............OOO
...............
...............
...............
...............
...............
.O.............
O.O............
...............
O..O...........
..OO...........
...O...........

See also ark.

:n-omino Any polyomino with exactly n cells.

:non-monotonic A spaceship is said to be non-monotonic if its leading edge falls back in some generations. The first example (shown below) was found by Hartmut Holzwart in August 1992. This is p4 and travels at c/4. In April 1994, Holzwart found examples of p3 spaceships with this property, and this is clearly the smallest possible period. Another non-monotonic spaceship is the weekender.


..........OO.O.......
......OOO.O.OOO......
..O.O..........O...OO
OO....OO.....O...OOOO
..O.OO..O....OOO.O...
........O....O.......
..O.OO..O....OOO.O...
OO....OO.....O...OOOO
..O.O..........O...OO
......OOO.O.OOO......
..........OO.O.......

:non-spark Something that looks like a spark, but isn't. An OWSS produces one of these instead of a belly spark, and is destroyed by it.

:non-standard spaceship Any spaceship other than a glider, LWSS, MWSS or HWSS.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_o.htm0000644000175100001440000002333412156145314014331 00000000000000 Life Lexicon (O)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:obo spark A spark of the form O.O (so called after its rle encoding).

:octagon II (p5) The first known p5 oscillator, discovered in 1971 independently by Sol Goodman and Arthur Taber. The name is due to the latter.


...OO...
..O..O..
.O....O.
O......O
O......O
.O....O.
..O..O..
...OO...

:octagon IV (p4) Found by Robert Wainwright, January 1979.


.......OO.......
.......OO.......
................
......OOOO......
.....O....O.....
....O......O....
...O........O...
OO.O........O.OO
OO.O........O.OO
...O........O...
....O......O....
.....O....O.....
......OOOO......
................
.......OO.......
.......OO.......

:octomino Any 8-cell polyomino. There are 369 such objects. The word is particularly applied to the following octomino (or its two-generation successor), which is fairly common but lacks a proper name:


..OO
..OO
OOO.
.O..

:odd keys (p3) Found by Dean Hickerson, August 1989. See also short keys and bent keys.


..........O.
.O.......O.O
O.OOO..OO.O.
.O..O..O....
....O..O....

:omino = polyomino

:omniperiodic A cellular automaton is said to be omniperiodic if it has oscillators of all periods. It is not known if Life is omniperiodic, although this seems likely. Dave Buckingham's work on Herschel conduits in 1996 (see My Experience with B-heptominos in Oscillators) reduced the number of unresolved cases to a finite number. At the time of writing the only periods for which no oscillator is known are 19, 23, 31, 37, 38, 41, 43 and 53. If we insist that the oscillator must contain a cell oscillating at the full period, then 34 and 51 should be added to this list. The most recently achieved periods were all found by Noam Elkies: p49 in August 1999 (a glider loop using p7 reflectors built from his new p7 pipsquirter), p39 (previously only possible without a p39 cell) in July 2000, and p27 in November 2002.

Note that if we were to allow infinite oscillators, then all periods are certainly possible, as any period of 14 or more can be obtained using a glider (or LWSS) stream.

:one-sided spaceship synthesis A glider synthesis of a spaceship in which all gliders come from the same side of the spaceship's path. Such syntheses are used extensively in the 17c/45 Caterpillar.

:onion rings For each integer n>1 onion rings of order n is a stable agar of density 1/2 obtained by tiling the plane with a certain 4n x 4n pattern. The tile for order 3 onion rings is shown below - the reader should then be able to deduce the form of tiles of other orders.


......OOOOOO
.OOOO.O....O
.O..O.O.OO.O
.O..O.O.OO.O
.OOOO.O....O
......OOOOOO
OOOOOO......
O....O.OOOO.
O.OO.O.O..O.
O.OO.O.O..O.
O....O.OOOO.
OOOOOO......

:on-off Any p2 oscillator in which all rotor cells die from overpopulation. The simplest example is a beacon. Compare flip-flop.

:O-pentomino Conway's name for the following pentomino, a traffic light predecessor, although not one of the more common ones.


OOOOO

:orbit A term proposed by Jason Summers to refer to a natural stabilization of a puffer. For example, the switch engine has two (known) orbits, the block-laying one and the glider-producing one.

:Orion (c/4 diagonally, p4) Found by Hartmut Holzwart, April 1993.


...OO.........
...O.O........
...O..........
OO.O..........
O....O........
O.OO......OOO.
.....OOO....OO
......OOO.O.O.
.............O
......O.O.....
.....OO.O.....
......O.......
....OO.O......
.......O......
.....OO.......
In May 1999, Jason Summers found the following smaller variant:

.OO..........
OO...........
..O..........
....O....OOO.
....OOO....OO
.....OOO.O.O.
............O
.....O.O.....
....OO.O.....
.....O.......
...OO.O......
......O......
....OO.......

:orphan Conway's preferred term for a Garden of Eden.

:oscillator Any pattern that is a predecessor of itself. The term is usually restricted to non-stable finite patterns. An oscillator is divided into a rotor and a stator. See also omniperiodic.

In general cellular automaton theory the term "oscillator" usually covers spaceships as well, but this usage is not normal in Life.

:overcrowding = overpopulation

:over-exposure = underpopulation

:overpopulation Death of a cell caused by it having more than three neighbours. See also underpopulation.

:overweight spaceship = OWSS

:OWSS A would-be spaceship similar to LWSS, MWSS and HWSS but longer. On its own an OWSS is unstable, but it can be escorted by true spaceships to form a flotilla.

:Ox A 1976 novel by Piers Anthony which involves Life.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_p.htm0000644000175100001440000012622712156145314014337 00000000000000 Life Lexicon (P)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:p = period

:p30 shuttle = queen bee shuttle

:p46 shuttle = twin bees shuttle

:p54 shuttle (p54) A surprising variant of the twin bees shuttle found by Dave Buckingham in 1973. See also centinal.


OO.........................OO
.O.........................O.
.O.O.......O.............O.O.
..OO.....O..O.....O......OO..
............O.....OO.........
........O..........OO........
........O...OO....OO.........
.........OOOOO...............
.............................
.........OOOOO...............
........O...OO....OO.........
........O..........OO........
............O.....OO.........
..OO.....O..O.....O......OO..
.O.O.......O.............O.O.
.O.........................O.
OO.........................OO

:p6 shuttle (p6) The following oscillator found by Nicolay Beluchenko in February 2004.


O.............
OOO...........
...O..........
..OO..........
..............
......O.......
.....OOOO.....
......O..O....
.......OOO....
..............
..........OO..
..........O...
...........OOO
.............O
This is extensible in more than one way:

O........................
OOO......................
...O.....................
..OO.....................
.........................
......O..................
.....OOOO................
......O..O...............
.......OOO...............
.........................
..........OOO............
..........O..O...........
...........OOOO..........
.............O...........
.........................
.................O.......
................OOO......
.................O.O.....
.................O.O.....
..................OO.....
.....................OO..
.....................O.O.
.......................O.
.......................OO

:pair of bookends = bookends

:pair of tables = table on table

:paperclip (p1)


..OO.
.O..O
.O.OO
OO.O.
O..O.
.OO..

:parallel grey ship = with-the-grain grey ship

:parent A pattern is said to be a parent of the pattern it gives rise to after one generation. Some patterns have infinitely many parents, but other have none at all (see Garden of Eden).

:parent cells The three cells that cause a new cell to be born.

:PD = pentadecathlon

:pedestle (p5)


.....O.....
....O.O....
.O..OO.....
.OOO.......
.....OOO...
...OO...O..
..O....O..O
.O.O.O.O.OO
.O.O...O.O.
OO.O.O.O.O.
O..O....O..
..O...OO...
...OOO.....
.......OOO.
.....OO..O.
....O.O....
.....O.....

:penny lane (p4) Found by Dave Buckingham, 1972.


...OO.....OO...
...O.......O...
OO.O.......O.OO
OO.O.OOOOO.O.OO
....O..O..O....
.....OOOOO.....
...............
.......O.......
......O.O......
.......O.......

:pentadecathlon (p15) Found in 1970 by Conway while tracking the history of short rows of cells, 10 cells giving this object, which is the most natural oscillator of period greater than 3. In fact it is the fifth or sixth most common oscillator overall, being about as frequent as the clock, but much less frequent than the blinker, toad, beacon or pulsar.


..O....O..
OO.OOOO.OO
..O....O..
The pentadecathlon is the only known oscillator which is a polyomino in more than one phase.

:pentant (p5) Found by Dave Buckingham, July 1976.


OO........
.O........
.O.O......
..OO....OO
.........O
.....OOOO.
.....O....
..O...OOO.
..OOOO..O.
.....O....
....O.....
....OO....

:pentaplet Any 5-cell polyplet.

:pentapole (p2) The barberpole of length 5.


OO......
O.O.....
........
..O.O...
........
....O.O.
.......O
......OO

:pentoad (p5) Found by Bill Gosper, June 1977. This is extensible: if an eater is moved back four spaces then another Z-hexomino can can be inserted. (This extensibility was discovered by Scott Kim.)


...........OO
...........O.
.........O.O.
.........OO..
.....OO......
......O......
......O......
......OO.....
..OO.........
.O.O.........
.O...........
OO...........

:pentomino Any 5-cell polyomino. There are 12 such patterns, and Conway assigned them all letters in the range O to Z, loosely based on their shapes. Only in the case of the R-pentomino has Conway's label remained in common use, but all of them can nonetheless be found in this lexicon.

:period The smallest number of generations it takes for an oscillator or spaceship to reappear in its original form. The term can also be used for a puffer, wick, fuse, superstring, stream of spaceships, factory or gun. In the last case there is a distinction between true period and pseudo period. There is also a somewhat different concept of period for wicktrailers.

:perpendicular grey ship = against-the-grain grey ship

:perturb To change the fate of an object by reacting it with other objects. Typically, the other objects are sparks from spaceships or oscillators, or are eaters or impacting spaceships. Perturbations are typically done to turn a dirty reaction into a clean one, or to change the products of a reaction. In many desirable cases the perturbing objects are not destroyed by the reaction, or else are easily replenished.

:perturbation See perturb.

:phase A representative generation of a periodic object such as an oscillator or spaceship. The number of phases is equal to the period of the object. The phases of an object usually repeat in the same cyclic sequence forever, although some perturbations can cause a phase change.

:phase change A perturbation of a periodic object which causes the object to skip ahead by one or more phases. If the perturbation is repeated indefinitely, this can effectively change the period of the object. An example of this, found by Dean Hickerson in November 1998, is shown below. In this example, the period of the oscillator would be 7 if the mold were removed, but the period is increased to 8 because of the repeated phase changes caused by the mold's spark.


..........O....
.........O.OO..
..OO.........O.
..O......O..O.O
.......O...O..O
OOOOOO.O....OO.
O..............
.OO.OO...OO....
..O.O....O.O...
..O.O......O...
...O.......OO..
The following pattern demonstrates a p4 c/2 spaceship found by Jason Summers, in which the phase is changed as it deletes a forward glider. This phase change allows the spaceship to be used to delete a glider wave produced by a rake whose period is 2 (mod 4).

........O...........................
.......OOO.OO.......................
......OO...O.OO.....................
.....OO..O.....O....................
......O.....O...O.OOO...............
.....OO.....O...O.O..O..............
...OO.O.OO....O.O.O...O.............
....O.O..OO...........O.............
.OO.O..O..O.........O...............
.OO.O.....OO.........O.OOO..........
.O.O.............OOO.O.O.OO.........
OO.OO...........OO.O..O.O.O.........
..............OO.O...OOO..OO.....OO.
.............O...O......O........O.O
............O.....O..OO.O.OO.....O..
...........O..O.O......O.O..........
...........O.....OO....OOO..........
.............O..........O...........
..........O.O...........O...........
.........OO.O.OOO...................
........O.O.O...O...................
.......OO.O.........................
......O...O.....OO..................
....................................
......OO.OO.........................

Phase changing reactions have enabled the construction of spaceships having periods that were otherwise unknown, and also allow the construction of period-doubling and period-tripling convoys to easily produce very high period rakes.

See also blinker puffer.

:phi The following common spark. The name comes from the shape in the generation after the one shown here.


.OOO.
O...O
O...O
.OOO.

:phoenix Any pattern all of whose cells die in every generation, but which never dies as a whole. A spaceship cannot be a phoenix, and in fact every finite phoenix eventually evolves into an oscillator. The following 12-cell oscillator (found by the MIT group in December 1971) is the smallest known phoenix, and is sometimes called simply "the phoenix".


....O...
..O.O...
......O.
OO......
......OO
.O......
...O.O..
...O....
Every known phoenix oscillator has period 2. In January 2000, Stephen Silver showed that a period 3 oscillator cannot be a phoenix. The situation for higher periods is unknown.

:pi = pi-heptomino

:pi-heptomino (stabilizes at time 173) A common pattern. The name is also applied to later generations of this object - in a pi ship, for example, the pi-heptomino itself never arises.


OOO
O.O
O.O

:pincers = great on-off

:pinwheel (p4) Found by Simon Norton, April 1970. Compare clock II.


......OO....
......OO....
............
....OOOO....
OO.O....O...
OO.O..O.O...
...O...OO.OO
...O.O..O.OO
....OOOO....
............
....OO......
....OO......

:pi orbital (p168) Found by Noam Elkies, August 1995. In this oscillator, a pi-heptomino is turned ninety degrees every 42 generations. A second pi can be inserted to reduce the period to 84.


..............OO....OO....OO...............................
.............O..O.O....O.O..O..............................
.............OOO..........OOO..............................
................OO......OO.................................
...............O..OOOOOO..O................................
...............OO........OO................................
...........................................................
........O.............................OO..........O........
.......O...OOO......O.........O.......OO.........O.O.......
........O.OOOOO..........OOO...O...........................
............O...O.....O.OOOOO.O..................O.........
............OO....OOO.....O......................OO........
............OO....OOO....OO...................OOOOO........
...................O.....OO...................OO.OO.....OO.
.................................................O......O.O
.....................................................OO.O.O
.....................................................O.O.O.
.......................................................O...
...................................OOO.........O.O...O..O..
.......OO..........................O..O........O..O.....O..
.......OO..............................O.......O.O..O...O..
...................................O..O.............O...O..
...................................OOO..................O..
.....................................................O..O..
................................................O......O...
.............................................OO.OO...O.O.O.
.............................................OOOOO...OO.O.O
.........O......................................OO......O.O
........O.O.....................................O.......OO.
...........................................................
.OO.......O.....................................O.O........
O.O......OO......................................O.........
O.O.OO...OOOOO.............................................
.O.O.O...OO.OO.............................................
...O......O................................................
..O..O.....................................................
..O........................................................
..O...O....................................................
..O...O..O.O......................................OO.......
..O.....O..O......................................OO.......
..O..O...O.O...............................................
...O.......................................................
.O.O.O.....................................................
O.O.OO.....................................................
O.O......O.................................................
.OO.....OO.OO...................OO.....O...................
........OOOOO...................OO....OOO....OO............
........OO......................O.....OOO....OO............
.........O..................O.OOOOO.O.....O...O............
...........................O...OOO..........OOOOO.O........
.......O.O.........OO.......O.........O......OOO...O.......
........O..........OO.............................O........
...........................................................
................................OO........OO...............
................................O..OOOOOO..O...............
.................................OO......OO................
..............................OOO..........OOO.............
..............................O..O.O....O.O..O.............
...............................OO....OO....OO..............

:pi portraitor (p32) Found by Robert Wainwright in 1984 or 1985. Compare with gourmet and popover.


...........OO...........
......OO.O....O.OO......
......O..........O......
.......OO......OO.......
....OOO..OOOOOO..OOO....
....O..O........O..O....
.OO.O.O..........O.O.OO.
.O.O.O............O.O.O.
...O................O...
.O..O..............O..O.
....O.......OOO....O....
O...O.......O.O....O...O
O...O.......O.O....O...O
....O..............O....
.O..O..............O..O.
...O................O...
.O.O.O............O.O.O.
.OO.O.O..........O.O.OO.
....O..O........O..O....
....OOO..OOOOOO..OOO....
.......OO......OO.......
......O..........O......
......OO.O....O.OO......
...........OO...........

:pipsquirt = pipsquirter

:pipsquirter An oscillator that produces a domino spark that is orientated parallel to the direction from which it is produced (in contrast to domino sparkers like the pentadecathlon and HWSS, which produce domino sparks perpendicular to the direction of production). The following is a small p6 example found by Noam Elkies in November 1997.


.....O.........
.....O.........
...............
...O...O.......
.OOO.O.OOO.....
O...OO....O....
O.OO..OO.O.O...
.O..OO..OO.O...
..OO..OO.O.O.OO
....O..O.O.O.OO
....OOOO.OO....
........O......
......O.O......
......OO.......

:pi ship A growing spaceship in which the back part consists of a pi-heptomino travelling at a speed of 3c/10. The first example was constructed by David Bell. All known pi ships are too large to show here, but the following diagram shows how the pi fuse works.


............O............
...........O.O...........
OO........OO.OO........OO
OO.....................OO

:piston (p2) Found in 1971.


OO.......OO
O.O..O..O.O
..OOOO..O..
O.O..O..O.O
OO.......OO

:pi wave A line of pi-heptominoes stabilizing one another. For example, an infinite line of pi-heptominoes arranged as shown below produces a pi wave that moves at a speed of 3c/10, and leaves no debris.


OOO...............OOO...............OOO...............OOO
O.O...............O.O...............O.O...............O.O
O.O...............O.O...............O.O...............O.O

:pixel = cell

:plet = polyplet

:polyomino A finite collection of orthogonally connected cells. The mathematical study of polyominoes was initiated by Solomon Golomb in 1953. Conway's early investigations of Life and other cellular automata involved tracking the histories of small polyominoes, this being a reasonable way to ascertain the typical behaviour of different cellular automata when the patterns had to be evolved by hand rather than by computer. Polyominoes have no special significance in Life, but their extensive study during the early years lead to a number of important discoveries and has influenced the terminology of Life. (Note on spelling: As with "dominoes" the plural may also be spelt without an e. In this lexicon I have followed Golomb in using the longer form.)

It is possible for a polyomino to be an oscillator. In fact there are infinitely many examples of such polyominoes, namely the cross and its larger analogues. The only other known examples are the block, the blinker, the toad, the star and (in two different phases) the pentadecathlon.

A polyomino can also be a spaceship, as the LWSS, MWSS and HWSS show.

:polyplet A finite collection of orthogonally or diagonally connected cells. This king-wise connectivity is a more natural concept in Life than the orthogonal connectivity of the polyomino.

:pond (p1)


.OO.
O..O
O..O
.OO.

:pond on pond (p1) This term is often used to mean bi-pond, but may also be used of the following pseudo still life.


.OO...OO.
O..O.O..O
O..O.O..O
.OO...OO.

:popover (p32) Found by Robert Wainwright in August 1984. Compare with gourmet and pi portraitor.


.....................O..........
.....................O..........
.....................OOO........
.............OO.......OO........
.............OO..OOO..OO........
...................OOO..........
...................OOO..........
..............OO................
..OOO........O..O...............
..OOO........O.O................
OOO..OO...O...O....OOO..........
.....OO...O.....................
....OOO...O.....................
....O.................OO...OO...
....O...........OOO..O..O..OO...
........O.......O.O...O.O.......
.......O.O......O.O....O........
...OO..O..O................O....
...OO...OO.................O....
.....................O...OOO....
.....................O...OO.....
..........OOO........O...OO..OOO
.................OO........OOO..
................O..O.......OOO..
................O.O.............
..........OOO....O..............
..........OOO...................
........OO..OOO..OO.............
........OO.......OO.............
........OOO.....................
..........O.....................
..........O.....................

:population The number of ON cells.

:P-pentomino Conway's name for the following pentomino, a common spark.


OO
OO
O.

:PPS (c/5 orthogonally, p30) A pre-pulsar spaceship. Any of three different p30 c/5 orthogonal spaceships in which a pre-pulsar is pushed by a pair of spiders. The back sparks of the spaceship can be used to perturb gliders in many different ways, allowing the easy construction of c/5 puffers. The first PPS was found by David Bell in May 1998 based on a p15 pre-pulsar spaceship found by Noam Elkies in December 1997. See also SPPS and APPS.

:pre-beehive The following common parent of the beehive.


OOO
OOO

:pre-block The following common parent of the block. Another such pattern is the grin.


O.
OO

:precursor = predecessor

:predecessor Any pattern that evolves into a given pattern after one or more generations.

:pre-pulsar A common predecessor of the pulsar, such as that shown below. This duplicates itself in 15 generations. (It fails, however, to be a true replicator because of the way the two copies then interact.)


OOO...OOO
O.O...O.O
OOO...OOO

A pair of tubs can be placed to eat half the pre-pulsar as it replicates; this gives the p30 oscillator Eureka where the pre-pulsar's replication becomes a movement back and forth. (See twirling T-tetsons II for a variation on this idea.) By other means the replication of the pre-pulsar can be made to occur in just 14 generations as half of it is eaten; this allows the construction of p28 and p29 oscillators, and is in fact the only known method for creating a p29 oscillator. The pre-pulsar is also a vital component of the only known p47 oscillator.

See also PPS.

:pre-pulsar spaceship See PPS.

:pressure cooker (p3) Found by the MIT group in September 1971. Compare mini pressure cooker.


.....O.....
....O.O....
....O.O....
...OO.OO...
O.O.....O.O
OO.O.O.O.OO
...O...O...
...O...O...
....OOO....
...........
...O.OO....
...OO.O....

:primer A pattern originally constructed by Dean Hickerson in November 1991 that emits a stream of LWSSs representing the prime numbers. Some improvements were found by Jason Summers in October 2005.

:protein (p3) Found by Dave Buckingham, November 1972.


....OO.......
....O........
......O......
..OOOO.O.OO..
.O.....O.O..O
.O..OO.O.O.OO
OO.O.....O...
...O..OO.O...
...O....O....
....OOOO.....
.............
....OO.......
....OO.......

:pseudo Opposite of true. A gun emitting a period n stream of spaceships (or rakes) is said to be a pseudo period n gun if its mechanism oscillates with a period different from n. This period will necessarily be a multiple of n. Pseudo period n glider guns are known to exist for all periods greater than or equal to 14, with smaller periods being impossible. The first pseudo p14 gun was built by Dieter Leithner in 1995.

The same distinction between true and pseudo also exists for puffers.

:pseudo-barberpole (p5) Found by Achim Flammenkamp in August 1994. In terms of its minimum population of 15 this is the smallest known p5 oscillator.


..........OO
...........O
.........O..
.......O.O..
............
.....O.O....
............
...O.O......
............
..OO........
O...........
OO..........

:pseudo-random glider generator An object which emits a random-looking stream of gliders, like the sequence of bits from a pseudo-random number generator. Pseudo-random glider generators contain gliders or other spaceships in a loop with a feedback mechanism which causes later spaceships to interfere with the generation of earlier spaceships. The period can be very high, since a loop of n spaceships has 2n possible states.

The first pseudo-random glider generator was built by Bill Gosper. David Bell built the first moving one in 1997, using c/3 rakes.

:pseudo still life The strict definition of still life rules out such stable patterns as the bi-block. In such patterns there are dead cells which have more than 3 neighbours in total, but fewer than 3 in any component still life. These patterns are called pseudo still lifes. Mark Niemiec has enumerated the pseudo still lifes up to 24 bits, and his figures are shown below.


-------------
Bits   Number
-------------
  8        1
  9        1
 10        7
 11       16
 12       55
 13      110
 14      279
 15      620
 16     1645
 17     4067
 18    10843
 19    27250
 20    70637
 21   179011
 22   462086
 23  1184882
 24  3068984
-------------

:puffer An object that moves like a spaceship, except that it leaves debris behind. The first known puffers were found by Bill Gosper and travelled at c/2 orthogonally (see diagram below for the very first one, found in 1971). Not long afterwards c/12 diagonal puffers were found (see switch engine). Discounting wickstretchers (which are not puffers in the conventional sense), no new velocity was obtained after this until David Bell found the first c/3 orthogonal puffer in April 1996. Since then c/5 orthogonal puffers have also been found, the first by Tim Coe in May 1997. Jason Summers built the first c/4 orthogonal puffer in January 1999, and the first 2c/5 orthogonal puffer in February 1999. Hartmut Holzwart built the first c/4 diagonal puffer (as opposed to a wickstretcher) in February 2004.


.OOO......O.....O......OOO.
O..O.....OOO...OOO.....O..O
...O....OO.O...O.OO....O...
...O...................O...
...O..O.............O..O...
...O..OO...........OO..O...
..O...OO...........OO...O..

:puffer engine A pattern which can be used as the main component of a puffer. The pattern may itself be a puffer (e.g. the classic puffer train), it may be a spaceship (e.g. the Schick engine), or it may even be unstable (e.g. the switch engine).

:puffer train The full name for a puffer, coined by Conway before any examples were known. The term was also applied specifically to the classic puffer train found by Bill Gosper and shown below. This is very dirty, and the tail does not stabilize until generation 5533. It consists of a B-heptomino (shown here one generation before the standard form) escorted by two LWSS. (This was the second known puffer. The first is shown under puffer.)


.OOO...........OOO
O..O..........O..O
...O....OOO......O
...O....O..O.....O
..O....O........O.

:puff suppressor An attachment at the back of a line puffer that suppresses all or some of its puffing action. The example below (by Hartmut Holzwart) has a 3-cell puff suppressor at the back which suppresses the entire puff, making a p2 spaceship. If you delete this puff suppressor then you get a p60 double beehive puffer. Puff suppressors were first recognised by Alan Hensel in April 1994.


............O....................
..........OO.O...................
..........OO...O.................
........O...OO.O.....O...........
........OOOO.OO...OOOO.......O.O.
......O......O....OOO.....O.O..O.
......OOOOOOO...O...O....O..O....
...O.O......OO..O...O.O.OO....O..
..OOOOOOOOO.....O..OO........O...
.OO..............O.OO.OOOO...O..O
OO....OO.O..........O...O..O.O...
.OO....O........OOO......O.O.O..O
.........O......OO......O....OO..
.OO....O........OOO......O.O.O..O
OO....OO.O..........O...O..O.O...
.OO..............O.OO.OOOO...O..O
..OOOOOOOOO.....O..OO........O...
...O.O......OO..O...O.O.OO....O..
......OOOOOOO...O...O....O..O....
......O......O....OOO.....O.O..O.
........OOOO.OO...OOOO.......O.O.
........O...OO.O.....O...........
..........OO...O.................
..........OO.O...................
............O....................

:pulsar (p3) Despite its size, this is the fourth most common oscillator (and by far the most common of period greater than 2) and was found very early on by Conway. See also pre-pulsar and pulsar quadrant.


..OOO...OOO..
.............
O....O.O....O
O....O.O....O
O....O.O....O
..OOO...OOO..
.............
..OOO...OOO..
O....O.O....O
O....O.O....O
O....O.O....O
.............
..OOO...OOO..

:pulsar 18-22-20 = two pulsar quadrants

:pulsar CP 48-56-72 = pulsar (The numbers refer to the populations of the three phases.)

:pulsar quadrant (p3) This consists of a quarter of the outer part of a pulsar stabilized by a cis fuse with two tails. This is reminiscent of mold and jam. Found by Dave Buckingham in July 1973. See also two pulsar quadrants.


.....O..
...OOO..
..O...OO
O..O..O.
O...O.O.
O....O..
........
..OOO...

:pulse A moving object, such as a spaceship or Herschel, which can be used to transmit information. See pulse divider.

Also another name for a pulsar quadrant.

:pulse divider A mechanism that lets every n-th object that reaches it pass through, and deletes all the rest, where n > 1 and the objects are typically spaceships or Herschels.

The following diagram shows a p5 glider pulse divider by Dieter Leithner (February 1998). The first glider moves the centre block and is reflected at 90 degrees. The next glider to come along will not be reflected, but will move the block back to its original position. The small size and low period of this example make it useful for constructing glider guns of certain periods. p7, p22, p36 and p46 versions of this pulse divider are also known.


.....OO...................
.....OO...................
..........................
..................OO......
.................O..O.....
.................O.O..O..O
O...............OO.O.OOOOO
.OO...........O...OO......
OO...............OO..OOO..
.............O...O.O..O.O.
........OO.......OO..OO.O.
........OO....O...OO...O..
................OO.O.OO...
.................O.O.O....
.................O.O..O...
..................O..OO...
..OO......................
...O......................
OOO.......................
O.........................
..........................
............OO............
............O.............
.............OOO..........
...............O..........

:pulshuttle V (p30) Found by Robert Wainwright, May 1985. Compare Eureka.


.............O..............O.............
............O.O.......O....O.O............
.............O......OO.OO...O.............
......................O...................
..OO......OO..................OO......OO..
O....O..O....O..............O....O..O....O
O....O..O....O..............O....O..O....O
O....O..O....O........O.....O....O..O....O
..OO......OO........OO.OO.....OO......OO..
......................O...................
..........................................
..........................................
..OO......OO..................OO......OO..
O....O..O....O........O.....O....O..O....O
O....O..O....O......OO.OO...O....O..O....O
O....O..O....O........O.....O....O..O....O
..OO......OO..................OO......OO..
..........................................
..........................................
......................O...................
..OO......OO........OO.OO.....OO......OO..
O....O..O....O........O.....O....O..O....O
O....O..O....O..............O....O..O....O
O....O..O....O..............O....O..O....O
..OO......OO..................OO......OO..
......................O...................
.............O......OO.OO...O.............
............O.O.......O....O.O............
.............O..............O.............

:pure glider generator A pattern that evolves into one or more gliders, and nothing else. There was some interest in these early on, but they are no longer considered important. Here's a neat example:


..O............
..O............
OOO............
...............
......OOO......
.......O.......
............OOO
............O..
............O..

:pushalong Any tagalong at the front of a spaceship. The following is an example (found by David Bell in 1992) attached to the front of a MWSS.


..OOO.O.....
.OOOO.O.....
OO..........
.O.O........
..OOOO.O....
...OOO......
............
............
......OOOOO.
......O....O
......O.....
.......O...O
.........O..

:pyrotechnecium (p8) Found by Dave Buckingham in 1972.


.......O........
.....OOOOO......
....O.....O.....
.O..O.O.OO.O....
O.O.O.O....O..O.
.O..O....O.O.O.O
....O.OO.O.O..O.
.....O.....O....
......OOOOO.....
........O.......

:pyrotechneczum A common mistaken spelling of pyrotechnecium, caused by a copying error in the early 1990s.

:python = long snake


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_q.htm0000644000175100001440000001725312156145314014336 00000000000000 Life Lexicon (Q)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Q = Quetzal

:Q-pentomino Conway's name for the following pentomino, a traffic light predecessor.


OOOO
...O

:quad (p2) Found by Robert Kraus, April 1971. Of all oscillators that fit in a 6x6 box this is the only flipper.


OO..OO
O..O.O
.O....
....O.
O.O..O
OO..OO

:QuadLife A form of colorized Life in which there are four types of ON cell. A newly-born cell takes the type of the majority of its three parent cells, or the remaining type if its parent cells are all of different types. In areas where there are only two types of ON cell QuadLife reduces to Immigration.

:quadpole (p2) The barberpole of length 4.


OO.....
O.O....
.......
..O.O..
.......
....O.O
.....OO

:quapole = quadpole

:quarter (c/4 diagonally, p4) The following 25-cell spaceship, found by Jason Summers in September 2000. See also tubstretcher.


........OO...
.......OO....
.........O...
...........OO
..........O..
.............
.........O..O
.OO.....OO...
OO.....O.....
..O....O.O...
....OO..O....
....OO.......

:quasar (p3) Found by Robert Wainwright, August 1971. See pulsar.


..........OOO...OOO..........
.............................
........O....O.O....O........
........O....O.O....O........
........O....O.O....O........
..........OOO...OOO..........
.............................
........OOO.......OOO........
..OOO..O....O...O....O..OOO..
.......O....O...O....O.......
O....O.O....O...O....O.O....O
O....O.................O....O
O....O..OOO.......OOO..O....O
..OOO...................OOO..
.............................
..OOO...................OOO..
O....O..OOO.......OOO..O....O
O....O.................O....O
O....O.O....O...O....O.O....O
.......O....O...O....O.......
..OOO..O....O...O....O..OOO..
........OOO.......OOO........
.............................
..........OOO...OOO..........
........O....O.O....O........
........O....O.O....O........
........O....O.O....O........
.............................
..........OOO...OOO..........

:queen bee See queen bee shuttle.

:queen bee shuttle (p30) Found by Bill Gosper in 1970. There are a number of ways to stabilize the ends. Gosper originally stabilized shuttles against one another in a square of eight shuttles. Two simpler methods are shown here; for a third see buckaroo. The queen bee shuttle is the basis of all known true p30 guns (see Gosper glider gun).


.........O............
.......O.O............
......O.O.............
OO...O..O.............
OO....O.O.............
.......O.O........OO..
.........O........O.O.
....................O.
....................OO

:Quetzal Dieter Leithner's name for the true p54 glider gun he built in January 1998. (This is short for Quetzalcoatlus and expresses the fact that the gun was a very large Herschel loop that was not an emu.) Shortly afterwards Leithner also built a p56 Quetzal using a mechanism found by Noam Elkies for this purpose. In October 1998 Stephen Silver constructed a p55 Quetzal using Elkies' p5 reflector of the previous month.

Some of the more recent Quetzals are not Herschel loops, but are instead short Herschel tracks firing several glider streams all but one of which is reflected back to the beginning of the track to create a new Herschel. Noam Elkies first had the idea of doing this for the p55 case, and Stephen Silver constructed the resulting gun shortly after building the original (much larger) p55 Quetzal. Jason Summers later built a p54 version, which is more complicated because the evenness of the period makes the timing problems considerably more difficult.

:Quetzalcoatlus A giant flying dinosaur after which Dieter Leithner named his p54 gun. Usually abbreviated to Quetzal, or simply Q (as in Q54, Q55, Q56, Q-gun, etc.).

:quilt = squaredance


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_r.htm0000644000175100001440000004225312156145314014335 00000000000000 Life Lexicon (R)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:R = R-pentomino

:R2D2 (p8) This was found, in the form shown below, by Peter Raynham in the early 1970s. The name derives from a form with a larger and less symmetric stator discovered by Noam Elkies in August 1994. Compare with Gray counter.


.....O.....
....O.O....
...O.O.O...
...O.O.O...
OO.O...O.OO
OO.O...O.OO
...O...O...
...O.O.O...
....O.O....
.....O.....

:r5 = R-pentomino

:rabbits (stabilizes at time 17331) A 9-cell methuselah found by Andrew Trevorrow in 1986.


O...OOO
OOO..O.
.O.....
The following predecessor, found by Trevorrow in October 1995, has the same number of cells and lasts two generations longer.

..O....O
OO......
.OO.OOO.

:rake Any puffer whose debris consists of spaceships. A rake is said to be forwards, backwards or sideways according to the direction of the spaceships relative to the direction of the rake. Originally the term "rake" was applied only to forwards c/2 glider puffers (see space rake). Many people prefer not to use the term in the case where the puffed spaceships travel parallel or anti-parallel to the puffer, as in this case they do not rake out any significant region of the Life plane (and, in contrast to true rakes, these puffers cannot travel in a stream, and so could never be produced by a gun).

Although the first rakes (circa 1971) were c/2, rakes of other velocities have since been built. Dean Hickerson's construction of Corderships in 1991 made it easy for c/12 diagonal rakes to be built, although no one actually did this until 1998, by which time David Bell had constructed c/3 and c/5 rakes (May 1996 and September 1997, respectively). Jason Summers constructed a 2c/5 rake in June 2000 (building on work by Paul Tooke and David Bell) and a c/4 orthogonal rake in October 2000 (based largely on reactions found by David Bell).

The smallest possible period for a rake is probably 7, as this could be achieved by a 3c/7 orthogonal backwards glider puffer. The smallest period attained to date is 8 (Jason Summers, March 2001) - see backrake.

:$rats (p6) Found by Dave Buckingham, 1972.


.....OO.....
......O.....
....O.......
OO.O.OOOO...
OO.O.....O.O
...O..OOO.OO
...O....O...
....OOO.O...
.......O....
......O.....
......OO....

:R-bee = bun

:receiver See Herschel receiver.

:reflector Any stable or oscillating pattern that can reflect some type of spaceship (usually a glider) without suffering permanent damage. The first known reflector was the pentadecathlon, which functions as a 180-degree glider reflector (see relay). Other examples include the buckaroo, the twin bees shuttle and some oscillators based on the traffic jam reaction. Glider guns can also be made into reflectors, although these are mostly rather large.

In September 1998 Noam Elkies found some fast small-period glider reflectors. The p8 version is shown below. Replacing the figure-8 by the p6 pipsquirter gives a p6 version. A more complicated construction allows a p5 version (which, as had been anticipated, soon led to a true p55 gun - see Quetzal). And in August 1999 Elkies found a suitable p7 sparker, allowing the first p49 oscillator to be constructed.


......OO.....OO..
O.O...OO.....O...
.OO........O.O...
.O.........OO....
.......OO........
.......O.O.......
........O........
.................
...........OOO...
...........OOO...
...........OOO...
..............OOO
..............OOO
..............OOO

Stable reflectors are special in that if they satisfy certain conditions they can be used to construct oscillators of all sufficiently large periods. It was known for some time that stable reflectors were possible (see universal constructor), but no one was able to construct an explicit example until Paul Callahan did so in October 1996.

All known stable reflectors are very slow. Callahan's original reflector has a repeat time of 4840, soon improved to 1686 and then 894 and then 850. In November 1996 Dean Hickerson found a variant in which this is reduced to 747. Dave Buckingham reduced it to 672 in May 1997 using a somewhat different method, and in October 1997 Stephen Silver reduced it to 623 by a method closer to the original. In November 1998 Callahan reduced this to 575 with a new initial reaction. A small modification by Silver a few days later brought this down to 497.

But in April 2001 Dave Greene found a 180-degree stable reflector with a repeat time of only 202 (see boojum reflector). This reflector also won the $100 prize that Dieter Leithner had offered in April 1997 for the first stable reflector to fit in a 50x50 box, and the additional $100 that Alan Hensel had offered in January 1999 for the same feat. Dave Greene has subsequently offered $50 for the first 90-degree stable glider reflector that fits in a 50x50 box, and a further $50 for the first in a 35x35 box.

See also glider turner.

:regulator An object which converts input gliders aligned to some period to output gliders aligned to a different period. The most interesting case is a universal regulator.

:relay Any oscillator in which spaceships (typically gliders) travel in a loop. The simplest example is the p60 one shown below using two pentadecathlons. Pulling the pentadecathlons further apart allows any period of the form 60+120n to be achieved - this is the simplest proof of the existence of oscillators of arbitrarily large period.


...........................O....O..
................OO.......OO.OOOO.OO
.................OO........O....O..
................O..................
..O....O...........................
OO.OOOO.OO.........................
..O....O...........................

:repeater Any oscillator or spaceship.

:repeat time The minimum number of generations that is possible between the arrival of one object and the arrival of the next. This term is used for things such as reflectors or conduits and the objects (gliders or Herschels, for example) will interact fatally with each other (or one will interact fatally with a disturbance caused by the other) if they are too close together. For example, the repeat time of Dave Buckingham's 59-step B-heptomino to Herschel conduit (shown under conduit) is 58.

:rephaser The following reaction that shifts the phase and path of a pair of gliders. There is another form of this reaction that reflects the gliders 180 degrees - see glider-block cycle.


..O..O..
O.O..O.O
.OO..OO.
........
........
...OO...
...OO...

:replicator A finite pattern which repeatedly creates copies of itself. Such objects are known to exist (see universal constructor), but no concrete example is known.

:reverse fuse A fuse that produces some initial debris, but then burns cleanly. The following is a simple example.


.............OO
............O.O
...........O...
..........O....
.........O.....
........O......
.......O.......
......O........
.....O.........
....O..........
...O...........
..O............
OO.............

:revolver (p2)


O............O
OOO....O...OOO
...O.O.O..O...
..O......O.O..
..O.O......O..
...O..O.O.O...
OOO...O....OOO
O............O

:ring of fire (p2) The following muttering moat found by Dean Hickerson in September 1992.


................O.................
..............O.O.O...............
............O.O.O.O.O.............
..........O.O.O.O.O.O.O...........
........O.O.O..OO.O.O.O.O.........
......O.O.O.O......O..O.O.O.......
....O.O.O..O..........O.O.O.O.....
.....OO.O..............O..O.O.O...
...O...O..................O.OO....
....OOO....................O...O..
..O.........................OOO...
...OO...........................O.
.O...O........................OO..
..OOOO.......................O...O
O.............................OOO.
.OOO.............................O
O...O.......................OOOO..
..OO........................O...O.
.O...........................OO...
...OOO.........................O..
..O...O....................OOO....
....OO.O..................O...O...
...O.O.O..O..............O.OO.....
.....O.O.O.O..........O..O.O.O....
.......O.O.O..O......O.O.O.O......
.........O.O.O.O.OO..O.O.O........
...........O.O.O.O.O.O.O..........
.............O.O.O.O.O............
...............O.O.O..............
.................O................

:rle Run-length encoded. Run-length encoding is a simple (but not very efficient) method of file compression. In Life the term refers to a specific ASCII encoding used for Life patterns (and patterns for other similar cellular automata). This encoding was introduced by Dave Buckingham and is now the usual means of exchanging Life patterns (especially large ones) by e-mail.

:rock Dean Hickerson's term for an eater which remains intact throughout the eating process. The snake in Dave Buckingham's 59-step B-to-Herschel conduit (shown under conduit) is an example. Other still lifes that sometimes act as rocks include the tub, the hook with tail, the eater1 (eating with its tail) and the hat (in Heinrich Koenig's stabilization of the twin bees shuttle).

:roteightor (p8) Found by Robert Wainwright in 1972.


.O............
.OOO........OO
....O.......O.
...OO.....O.O.
..........OO..
..............
.....OOO......
.....O..O.....
.....O........
..OO..O...O...
.O.O......O...
.O.......O....
OO........OOO.
............O.

:rotor The cells of an oscillator that change state. Compare stator. It is easy to see that any rotor cell must be adjacent to another rotor cell.

:R-pentomino This is by far the most active polyomino with less than six cells: all the others stabilize in at most 10 generations, but the R-pentomino does not do so until generation 1103, by which time it has a population of 116.


.OO
OO.
.O.

:rule 22 Wolfram's rule 22 is the 2-state 1-D cellular automaton in which a cell is ON in the next generation if and only if exactly one of its three neighbours is ON in the current generation (a cell being counted as a neighbour of itself). This is the behaviour of Life on a cylinder of width 1.

:ruler A pattern constructed by Dean Hickerson in May 2005 that produces a stream of LWSS with gaps in it, such that the number of LWSS between successive gaps follows the "ruler function" (sequence A001511 in The On-Line Encyclopedia of Integer Sequences).

:rumbling river Any oscillator in which the rotor is connected and contained in a strip of width 2. The following p3 example is by Dean Hickerson, November 1994.


..............OO......OO......OO...O.OO..........
....O........O..O....O..O....O..O..OO.O..........
O..O.O....O...OO..O...OO..O...O.O.....O.OO.......
OOOO.O..OOOOOO..OOOOOO..OOOOOO..OOOOOO.O.O.......
.....O.O.....O.O.....O.O.....O.O.....O.O......OO.
..OO.O.O.O.O...O.O.O...O.O.O...O.O.O...O.O.....O.
.O.....O.O...O.O.O...O.O.O...O.O.O...O.O.O.O.OO..
.OO......O.O.....O.O.....O.O.....O.O.....O.O.....
.......O.O.OOOOOO..OOOOOO..OOOOOO..OOOOOO..O.OOOO
.......OO.O.....O.O...O..OO...O..OO...O....O.O..O
..........O.OO..O..O....O..O....O..O........O....
..........OO.O...OO......OO......OO..............

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_s.htm0000644000175100001440000015236012156145314014337 00000000000000 Life Lexicon (S)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:S Usually means big S, but may sometimes mean paperclip.

:sailboat (p16) A boat hassled by a Kok's galaxy, a figure-8 and two eater3s. Found by Robert Wainwright in June 1984.


........O...........O........
.......O.O.........O.O.......
........O...........O........
.............................
......OOOOO.......OOOOO......
.....O....O.......O....O.....
....O..O.............O..O....
.O..O.OO.............OO.O..O.
O.O.O.....O.......O.....O.O.O
.O..O....O.O.....O.O....O..O.
....OO..O..O.....O..O..OO....
.........OO.......OO.........
.............OO..............
.............O.O.............
........O..O..O..............
.......O.....................
.....OO..........OOO.........
..O......OO.O....OOO.........
.....O...O..O....OOO.........
.....OOO.O...O......OOO......
..O...........O.....OOO......
...O...O.OOO........OOO......
....O..O...O.................
....O.OO......O..............
..........OO.................
.........O...................
.....O..O....................

:sawtooth Any finite pattern whose population grows without bound but does not tend to infinity. (In other words, the population reaches new heights infinitely often, but also infinitely often returns to some fixed value.) Conway's preferred plural is "sawteeth".

The first sawtooth was constructed by Dean Hickerson in April 1991. The least infinitely repeating population of any known sawtooth is 262 (David Bell, July 2005).

See also tractor beam.

:SBM = sliding block memory

:Schick engine (c/2 orthogonally, p12) This spaceship, found by Paul Schick in 1972, produces a large spark (the 15 live cells at the rear in the phase shown below) which can be perturbed by other c/2 spaceships to form a variety of puffers. The diagram below shows the smallest form of the Schick engine, using two LWSS. It is also possible to use two MWSS or two HWSS, or even a LWSS and a HWSS.


OOOO..............
O...O.........O...
O...........OO....
.O..O..OO.....OOO.
......OOO......OOO
.O..O..OO.....OOO.
O...........OO....
O...O.........O...
OOOO..............

:Schick ship = Schick engine

:scorpion (p1)


...O...
.OOO...
O...OO.
O.O.O.O
.OO.O.O
.....O.

:scrubber (p2) Found in 1971.


....O......
..OOO......
.O.........
.O..OOO....
OO.O...O...
...O...O...
...O...O.OO
....OOO..O.
.........O.
......OOO..
......O....

:SE = switch engine

:seal (c/6 diagonally, p6) The first c/6 diagonal spaceship, found by Nicolay Beluchenko in September 2005.


...O..OO..........................
.OOO.O.O.O........................
.O..OOO..OO.......................
O..OOOOOO.O.OOO...................
.O..OOO.O.OOOOO...................
......O.O.O.O.....................
O.O...O.O.OOOOO...................
O..O.O..O.OO...O..................
...O..OO.......OOO................
.O...OOOOO.OOO..OO................
....O.........O...................
..O.O.........O...................
....OO.OOOOO...O..................
......O.OOO..O.....OO.............
......O..O...O.OOO.OO.............
........OO...OOO.O..O...O.........
........OO....OO.OOOO...OOO.......
...................O.O..O.........
.............O.O.....OO..OO.......
.............O..O.....O.OOO.....O.
.............O...O....OO..O...O..O
...............OOO.....OO........O
...............O.O..O..O.....OO..O
.................O..OO.OO.O..O....
................O.......O.O.......
.................O...OOOO.........
..................O...O...........
..................................
.......................O..........
......................O.O.........
.....................OO...........
.....................O.O..........
.....................OO...........
.......................O..........
......................O...........

:second glider domain The second glider domain of an edge shooter is the set of displacements (in space and time, relative to the glider stream emitted by the edge shooter) that a glider stream may have without interfering with the edge shooter. This is useful to know, because edge shooters are often used to generate glider streams very close to other glider streams.

:sesquihat (p1) Halfway between a hat and a twinhat.


....O
OO.O.O.
.O.O.O.
.O.O.OO
..O...

:SGR Abbreviation for stable glider reflector.

:shillelagh (p1)


OO...
O..OO
.OO.O

:ship (p1) The term is also used as a synonym of spaceship.


OO.
O.O
.OO

:ship in a bottle (p16) Found by Bill Gosper in August 1994. See also bottle.


....OO......OO....
...O..O....O..O...
...O.O......O.O...
.OO..OOO..OOO..OO.
O......O..O......O
O.OO..........OO.O
.O.O..........O.O.
...OO...OO...OO...
.......O.O........
.......OO.........
...OO........OO...
.O.O..........O.O.
O.OO..........OO.O
O......O..O......O
.OO..OOO..OOO..OO.
...O.O......O.O...
...O..O....O..O...
....OO......OO....

:ship on boat = ship tie boat

:ship on ship = ship-tie

:ship-tie (p1) The name is by analogy with boat-tie.


OO....
O.O...
.OO...
...OO.
...O.O
....OO

:ship tie boat (p1)


OO....
O.O...
.OO...
...OO.
...O.O
....O.

:short keys (p3) Found by Dean Hickerson, August 1989. See also bent keys and odd keys.


.O........O.
O.OOO..OOO.O
.O..O..O..O.
....O..O....

:shuttle Any oscillator which consists of an active region moving back and forth between stabilizing objects. The most well-known examples are the queen bee shuttle (which has often been called simply "the shuttle") and the twin bees shuttle. See also p54 shuttle and Eureka. Another example is the p72 R-pentomino shuttle that forms part of the pattern given under factory.

:siamese A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects sharing two or more cells. See snake siamese snake and loaf siamese barge for examples.

:side Half a sidewalk. In itself this is unstable and requires an induction coil.


OO...
O.OOO
....O

:sidecar A small tagalong for a HWSS that was found by Hartmut Holzwart in 1992. The resulting spaceship (shown below) has a phase with only 24 cells, making it in this respect the smallest known spaceship other than the standard spaceships and some trivial two-spaceship flotillas derived from them. Note also that a HWSS can support two sidecars at once.


.O......
O.....O.
O.....O.
OOOOO.O.
........
....OO..
..O....O
.O......
.O.....O
.OOOOOO.

:side-shooting gun = slide gun

:side-tracking See universal constructor.

:sidewalk (p1)


.OO.OO
..O.O.
.O..O.
.O.O..
OO.OO.

:siesta (p5) Found by Dave Buckingham in 1973. Compare sombreros.


...........OO...
...OO.....O.O...
...O.O....O.....
.....O...OO.O...
...O.OO.....OOO.
.OOO.....O.O...O
O...O.O.....OOO.
.OOO.....OO.O...
...O.OO...O.....
.....O....O.O...
...O.O.....OO...
...OO...........

:signal Movement of information through the Life universe. Signals can be carried by spaceships, fuses, drifters, or conduits. Spaceships can only transfer a signal at the speed of the spaceship, while fuses can transfer a signal at speeds up to the speed of light.

In practice, many signals are encoded as the presence or absence of a glider (or other spaceship) at a particular point at a particular time. Such signals can be combined by the collision of gliders to form logic operations such as AND, OR, and NOT gates. Signals can be duplicated using glider duplicators or other fanout devices, and can be used up by causing perturbations on other parts of the Life object.

Signals are used in pseudo-random glider generators, the unit Life cell and the Fermat prime calculator, among others.

:Silver's p5 (p5) The following oscillator found by Stephen Silver in February 2000:


OO.........
O..........
.O..O......
...OO......
...O...O.OO
..O....OO.O
..OO.......

As this has no spark, it appears useless. Nonetheless, in March 2000, David Eppstein found a way to use it to reduce the size of Noam Elkies' p5 reflector.

:singular flip flop (p2) Found by Robert Wainwright, July 1972.


..O...
..O.O.
O....O
OOOOOO
......
..OO..
..OO..

:sinking ship = canoe

:six Ls (p3) This is a compact form of loading dock.


...O...
.OOO..O
O...OOO
OOO....
....OOO
OOO...O
O..OOO.
...O...

:sixty-nine (p4) Found by Robert Wainwright, October 1978.


.........O...........
........O.O..........
.....................
......O...OO.........
.....O.....O.........
......O.O............
........OO......O....
................O....
..O.....OO....OOO....
..O...........OO.....
OOO.......OO..OO..OOO
OO......O.OO....OOO..
OO..OOO.O.O.....OOO..
..OOO................
..OOO......O.........
..........O.O........
.....................
........O...OO.......
.......O.....O.......
........O.O..........
..........OO.........

:skewed quad (p2)


.OO....
.O...OO
..O.O.O
.......
O.O.O..
OO...O.
....OO.

:skewed traffic light (p3) Found by Robert Wainwright, August 1989.


.............OO.........
............O..O........
.............O.O........
.........OO...O.........
..........O.OO..........
............O...........
............O...........
........................
OO........OOO......O....
OOOO.O........O...OO....
O.O..OOO.O....O.........
.........O....O.OOO..O.O
....OO...O........O.OOOO
....O......OOO........OO
........................
...........O............
...........O............
..........OO.O..........
.........O...OO.........
........O.O.............
........O..O............
.........OO.............

:slide gun A gun which fires sideways from an extending arm. The arm consists of streams of spaceships which are pushing a pattern away from the body of the gun and releasing an output spaceship every time they do so. Each output spaceship therefore travels along a different path.

Dieter Leithner constructed the first slide gun in July 1994 (although he used the term "side shooting gun"). The following pattern shows the key reaction of this slide gun. The three gliders shown will push the block one cell diagonally, thereby extending the length of the arm by one cell, and at the same time they release an output glider sideways. (In 1999, Jason Summers constructed slide guns using other reactions.)


..............OO.
..............OO.
........OOO......
..........O......
.........O.....OO
..............O.O
................O
.................
.................
.................
.................
.................
.................
.................
.................
.................
.................
.O...............
.OO..............
O.O..............

:sliding block memory A memory register whose value is stored as the position of a block. The block can be moved by means of glider collisions - see block pusher for an example.

In Conway's original formulation (as part of his proof of the existence of a universal computer in Life) 2 gliders were used to pull the block inwards by three diagonal spaces, and 30 gliders were used to push it out by the same amount. Dean Hickerson later greatly improved on this, finding a way to pull a block inwards by one diagonal space using 2 gliders, and push it out using 3 gliders. In order for the memory to be of any use there also has to be a way to read the value held. It suffices to be able to check whether the value is zero (as Conway did), or to be able to detect the transition from one to zero (as Hickerson did).

Dean Hickerson's sliding block memory is used in Paul Chapman's URM.

:slow glider construction Construction an object by a "slow salvo" of gliders all coming from the same direction, in such a way that timing of the gliders does not matter as long as they are not too close behind one another. This type of construction requires an initial seed object, such as a block, which is modified by each glider in turn until the desired object is produced.

In May 1997, Nick Gotts produced a slow glider construction of a block-laying switch engine from a block, using a slow salvo of 53 gliders. Constructions like this are important in the study of sparse Life, as they will occur naturally as gliders created in the first few generations collide with blonks and other debris.

Slow glider constructions are also useful in some designs for universal constructors. However, in this case the above definition is usually too restrictive, and it is desirable to allow constructions in which some gliders in the salvo are required to have a particular timing modulo 2 (a "p2 slow salvo"). This gives much greater flexibility, as blinkers can now be freely used in the intermediate construction steps.

:slow salvo See slow glider construction.

:small fish = LWSS

:small lake (p1) See also lake.


....O....
...O.O...
...O.O...
.OO...OO.
O.......O
.OO...OO.
...O.O...
...O.O...
....O....

:smiley (p8) Found by Achim Flammenkamp in July 1994 and named by Alan Hensel.


OO.O.OO
...O...
O.....O
.OOOOO.
.......
.......
OOO.OOO

:SMM breeder See breeder.

:smoke Debris which is fairly long-lived but eventually dies completely. Basically, a large spark. This term is used especially when talking about the output from a spaceship - see smoking ship.

:smoking ship A spaceship which produces smoke. If the smoke extends past the edge of the rest of the spaceship, then it can be used to perturb other objects as the spaceship passes by. Running gliders into the smoke is often a good way to turn or duplicate the them, or convert them into other objects. Sometimes the smoke from a smoking ship may itself be perturbed by accompanying spaceships in order to form a puffer. A simple example of a smoking ship is the Schick engine.

:snacker (p9) Found by Mark Niemiec in 1972. This is a pentadecathlon with stabilizers which force it into a lower period.


OO................OO
.O................O.
.O.O............O.O.
..OO............OO..
.......O....O.......
.....OO.OOOO.OO.....
.......O....O.......
..OO............OO..
.O.O............O.O.
.O................O.
OO................OO
The stabilizers make the domino spark largely inaccessible, but the snacker is extensible, as shown in the next diagram, and so a more accessible p9 domino spark can be obtained. In April 1998 Dean Hickerson found an alternative stabilizer that is less obtrusive than the original one, and this is also shown in this diagram.

OO................................
.O................................
.O.O.........................OO...
..OO.......................O..O...
.......O....O..............OOO....
.....OO.OOOO.OO...O....O......OOO.
.......O....O...OO.OOOO.OO...O...O
..OO..............O....O......OOO.
.O.O.......................OOO....
.O.........................O..O...
OO...........................OO...
An end can also be stabilized by killer candlefrobras, although this isn't efficient.

:snail (c/5 orthogonally, p5) The first known c/5 spaceship, discovered by Tim Coe in January 1996. For some time it was the slowest known orthogonal spaceship.


.O....................................
.O....................................
O.....................................
.OOO.................OOO...OOO........
.OO.O.........O...O.O......OOO........
..O...........OO.O.......O....OOOO....
......O......O...O.O...OO.O.....OO....
...O..O.OOO...OO.........O........OO.O
...OO.O.....O.....O.................O.
.........O.OOOOOOO....................
......................................
.........O.OOOOOOO....................
...OO.O.....O.....O.................O.
...O..O.OOO...OO.........O........OO.O
......O......O...O.O...OO.O.....OO....
..O...........OO.O.......O....OOOO....
.OO.O.........O...O.O......OOO........
.OOO.................OOO...OOO........
O.....................................
.O....................................
.O....................................

:snake (p1)


OO.O
O.OO

:snake bit An alternative name for a boat-bit. Not a very sensible name, because various other things can be used instead of a snake.

:snake bridge snake (p1)


....OO
....O.
.....O
....OO
OO.O..
O.OO..

:snake dance (p3) Found by Robert Wainwright, May 1972.


...OO.O..
...O.OO..
OO.O.....
.O..O.OOO
O..O.O..O
OOO.O..O.
.....O.OO
..OO.O...
..O.OO...

:snake pit This term has been used for two different oscillators: the p2 snake pit (essentially the same as fore and back)


O.OO.OO
OO.O.O.
......O
OOO.OOO
O......
.O.O.OO
OO.OO.O
and the p3 snake pit.

.....OO....
....O..O...
....O.OO...
.OO.O......
O.O.O.OOOO.
O.........O
.OOOO.O.O.O
......O.OO.
...OO.O....
...O..O....
....OO.....

:snake siamese snake (p1)


OO.OO.O
O.OO.OO

:sombrero One half of sombreros or siesta.

:sombreros (p6) Found by Dave Buckingham in 1972. If the two halves are moved three spaces closer to one another then the period drops to 4, and the result is just a less compact form of Achim's p4. Compare also siesta.


...OO........OO...
...O.O......O.O...
.....O......O.....
...O.OO....OO.O...
.OOO..........OOO.
O...O.O....O.O...O
.OOO..........OOO.
...O.OO....OO.O...
.....O......O.....
...O.O......O.O...
...OO........OO...

:soup A random initial pattern, often assumed to cover the whole Life universe.

:space dust A part of a spaceship or oscillator which looks like a random mix of ON and OFF cells. It is usually very difficult to find a glider synthesis for an object that consists wholly or partly of space dust.

:spacefiller Any pattern that grows at a quadratic rate by filling space with an agar. The first example was found in September 1993 by Hartmut Holzwart, following a suggestion by Alan Hensel. The diagram below shows a smaller spacefiller found by Tim Coe. See also Max. Spacefillers can be considered as breeders (more precisely, MMS breeders), but they are very different from ordinary breeders. The word "spacefiller" was suggested by Harold McIntosh and soon became the accepted term.


..................O........
.................OOO.......
............OOO....OO......
...........O..OOO..O.OO....
..........O...O.O..O.O.....
..........O....O.O.O.O.OO..
............O....O.O...OO..
OOOO.....O.O....O...O.OOO..
O...OO.O.OOO.OO.........OO.
O.....OO.....O.............
.O..OO.O..O..O.OO..........
.......O.O.O.O.O.O.....OOOO
.O..OO.O..O..O..OO.O.OO...O
O.....OO...O.O.O...OO.....O
O...OO.O.OO..O..O..O.OO..O.
OOOO.....O.O.O.O.O.O.......
..........OO.O..O..O.OO..O.
.............O.....OO.....O
.OO.........OO.OOO.O.OO...O
..OOO.O...O....O.O.....OOOO
..OO...O.O....O............
..OO.O.O.O.O....O..........
.....O.O..O.O...O..........
....OO.O..OOO..O...........
......OO....OOO............
.......OOO.................
........O..................

:space rake The following p20 forwards glider rake, which was the first known rake. It consists of an ecologist with a LWSS added to turn the dying debris into gliders.


...........OO.....OOOO
.........OO.OO...O...O
.........OOOO........O
..........OO.....O..O.
......................
........O.............
.......OO........OO...
......O.........O..O..
.......OOOOO....O..O..
........OOOO...OO.OO..
...........O....OO....
......................
......................
......................
..................OOOO
O..O.............O...O
....O................O
O...O............O..O.
.OOOO.................

:spaceship Any finite pattern that reappears (without additions or losses) after a number of generations and displaced by a non-zero amount. By far the most natural spaceships are the glider, LWSS, MWSS and HWSS. For further examples see B29, big glider, brain, Canada goose, Coe ship, Cordership, crane, dart, dragon, ecologist, edge-repair spaceship, Enterprise, flotilla, fly, hammerhead, hivenudger, non-monotonic, Orion, puff suppressor, pushalong, quarter, Schick engine, seal, sidecar, snail, still life tagalong, sparky, swan, turtle, wasp, weekender and x66. See also Caterpillar.

It is known that there exist spaceships travelling in all rational directions and at arbitrarily slow speeds (see universal constructor). Before 1989, however, the only known examples travelled at c/4 diagonally (gliders) or c/2 orthogonally (everything else). In 1989 Dean Hickerson started to use automated searches to look for new spaceships, and had considerable success. Other people have continued these searches using tools such as lifesrc and gfind, and as a result we now have a great variety of spaceships travelling at twelve different velocities. The following table details the discovery of spaceships with new velocities.


-----------------------------------------------------
Speed   Direction    Discoverer                Date
-----------------------------------------------------
c/4     diagonal     Richard Guy                 1970
c/2     orthogonal   John Conway                 1970
c/3     orthogonal   Dean Hickerson          Aug 1989
c/4     orthogonal   Dean Hickerson          Dec 1989
c/12    diagonal     Dean Hickerson          Apr 1991
2c/5    orthogonal   Dean Hickerson          Jul 1991
c/5     orthogonal   Tim Coe                 Jan 1996
2c/7    orthogonal   David Eppstein          Jan 2000
c/6     orthogonal   Paul Tooke              Apr 2000
c/5     diagonal     Jason Summers           Nov 2000
17c/45  orthogonal   Gabriel Nivasch et al.  Dec 2004
c/6     diagonal     Nicolay Beluchenko      Sep 2005
-----------------------------------------------------

A period p spaceship that displaces itself (m,n) during its period, where m>=n, is said to be of type (m,n)/p. It was proved by Conway in 1970 that p>=2m+2n. (This follows immediately from the easily-proved fact that a pattern cannot advance diagonally at a rate greater than one half diagonal step every other generation.)

The following diagram shows one of only two known c/5 diagonal spaceships. It was found by Jason Summers in January 2005.


..........OO..........
.........O..O.........
........OO............
.........O.OO.........
..........O.OOO.......
..........OO.OOO......
............O....OO...
............OOO....OO.
..O.........O.O.......
.OOO........O..O......
O...OO................
O..O.O.......OO.O..O..
.O.OO.OOOO...O...OOOO.
....OO.O...OO.......O.
....OO.OO..O.........O
.....O...O........O.OO
...........O.......O..
......O.....O......O..
......O.....O..O......
.......O...OO...OO....
.......O....OO.O......
..............OO......

:Spaceships in Conway's Life A series of articles posted by David Bell to the newsgroup comp.theory.cell-automata during the period August-October 1992 that described many of the new spaceships found by himself, Dean Hickerson and Hartmut Holzwart. Bell produced an addendum covering more recent developments in 1996.

:spark A pattern that dies. The term is typically used to describe a collection of cells periodically thrown off by an oscillator or spaceship, but other dying patterns, particularly those consisting or only one or two cells (such as produced by certain glider collisions, for example), are also described as sparks. For examples of small sparks see unix and HWSS. For an example of a much larger spark see Schick engine.

:spark coil (p2) Found in 1971.


OO....OO
O.O..O.O
..O..O..
O.O..O.O
OO....OO

:sparker An oscillator or spaceship that produces sparks. These can be used to perturb other patterns without being themselves affected.

:sparky A certain c/4 tagalong, shown here attached to the back of a spaceship.


..........O....................
..........O...............OO...
......OO.O.OOO..........OO...O.
O.OO.OO.OO..O.O...OO.OOOO......
O...OO..O.OO..OOO..O.OO..OO...O
O.OO....OOO.O.OOO......OO..O...
........OO.O...............O..O
O.OO....OOO.O.OOO......OO..O...
O...OO..O.OO..OOO..O.OO..OO...O
O.OO.OO.OO..O.O...OO.OOOO......
......OO.O.OOO..........OO...O.
..........O...............OO...
..........O....................

:sparse Life This refers to the study of the evolution of a Life universe which starts off as a random soup of extremely low density. Such a universe is dominated at an early stage by blocks and blinkers (often referred to collectively as blonks) in a ratio of about 2:1. Much later it will be dominated by simple infinite growth patterns (presumably mostly switch engines). The long-term fate of a sparse Life universe is less certain. It may possibly become dominated by self-reproducing patterns (see universal constructor), but it is not at all clear that there is any mechanism for these to deal with the all junk produced by switch engines.

:speed of light A speed of one cell per generation, the greatest speed at which any effect can propagate.

:S-pentomino Conway's name for the following pentomino, which rapidly dies.


..OO
OOO.

:spider (c/5 orthogonally, p5) This is the smallest known c/5 spaceship, and was found by David Bell in April 1997. Its side sparks have proved very useful in constructing c/5 puffers, including rakes. See also pre-pulsar.


......O...OOO.....OOO...O......
...OO.OOOOO.OO...OO.OOOOO.OO...
.O.OO.O.....O.O.O.O.....O.OO.O.
O...O.O...OOOOO.OOOOO...O.O...O
....OOO.....OO...OO.....OOO....
.O..O.OOO.............OOO.O..O.
...O.......................O...

:spiral (p1) Found by Robert Wainwright in 1971.


OO....O
.O..OOO
.O.O...
..O.O..
...O.O.
OOO..O.
O....OO

:SPPS (c/5 orthogonally, p30) The symmetric PPS. The original PPS found by David Bell in May 1998. Compare APPS.

:squaredance The p2 agar formed by tiling the plane with the following pattern. Found by Don Woods in 1971.


OO......
....OO..
..O....O
..O....O
....OO..
OO......
...O..O.
...O..O.

:squirter = pipsquirter

:S-spiral = big S

:stable A pattern is said to be stable if it is a parent of itself. See still life.

:stairstep hexomino (stabilizes at time 63) The following predecessor of the blockade.


..OO
.OO.
OO..

:stamp collection A collection of oscillators (or perhaps other Life objects) in a single diagram, displaying the exhibits much like stamps in a stamp album. The classic examples are by Dean Hickerson (see http://www.radicaleye.com/DRH/stamps.html).

:standard spaceship A glider, LWSS, MWSS or HWSS. These have all been known since 1970.

:star (p3) Found by Hartmut Holzwart, February 1993.


.....O.....
....OOO....
..OOO.OOO..
..O.....O..
.OO.....OO.
OO.......OO
.OO.....OO.
..O.....O..
..OOO.OOO..
....OOO....
.....O.....

:star gate A device by Dieter Leithner (October 1996) for transporting a LWSS faster than the speed of light. The key reaction is the Fast Forward Force Field.

:stator The cells of an oscillator that are always on. Compare rotor. (The stator is sometimes taken to include also some of those cells which are always off.) The stator is divided into the bushing and the casing.

By analogy, the cells of an eater that remain on even when the eater is eating are considered to constitute the stator of the eater. This is not necessarily well-defined, because the eater may have more than one eating action.

:step Another term for a generation. This term is particularly used in describing conduits. For example, a 64-step conduit is one through which the active object takes 64 generations to pass.

:stillater (p3) Found by Robert Wainwright, September 1985. This is one of only three essentially different p3 oscillators with only three cells in the rotor. The others are 1-2-3 and cuphook.


...O....
..O.O.OO
..O.OO.O
OO......
.O.O.OO.
.O.O..O.
..O..O..
...OO...

:still life Any stable pattern, usually assumed to be finite and nonempty. For the purposes of enumerating still lifes this definition is, however, unsatisfactory because, for example, any pair of blocks would count as a still life, and there would therefore be an infinite number of 8-bit still lifes. For this reason a stricter definition is often used, counting a stable pattern as a single still life only if its islands cannot be divided into two nonempty sets both of which are stable in their own right. Compare pseudo still life.

The requirement that a still life not be decomposable into two separate stable patterns may seem a bit arbitrary, as it does not rule out the possibility that it might be decomposable into more than two. This is shown by the patterns in the following diagram, both found by Gabriel Nivasch in July 2001. On the left is a 32-cell pattern that can be broken down into three stable pieces but not into two. On the right is a 34-cell pattern that can be broken down into four stable pieces but not into two or three. (Note that, as a consequence of the Four-Colour Theorem, four is as high as you need ever go.) It is arguable that patterns like these ought not to be considered as single still lifes.


......OO...........OO.
..O.O..O......OO.O..O.
.O.OO.O.......O.OO.O..
.O....OO...........OO.
OO.OO.........O.OO...O
...OO.OO....OOO.OO.OO.
OO....O....O.......O..
.O.OO.O.....OOO.OO.O..
O..O.O........O.O.O...
OO....................

Still lifes have been enumerated by Conway (4-7 bits), Robert Wainwright (8-10 bits), Dave Buckingham (11-13 bits), Peter Raynham (14 bits) and Mark Niemiec (15-24 bits). The resulting figures are shown below. (These figures shouldn't be affected by the above discussion of the strict definition of "still life", because it is unlikely that there are any doubtful cases with much less than 32 cells.)


-------------
Bits   Number
-------------
  4        2
  5        1
  6        5
  7        4
  8        9
  9       10
 10       25
 11       46
 12      121
 13      240
 14      619
 15     1353
 16     3286
 17     7773
 18    19044
 19    45759
 20   112243
 21   273188
 22   672172
 23  1646147
 24  4051711
-------------

:still life tagalong A tagalong which takes the form of a still life in at least one phase. An example is shown below.


..OO...............
.OO.OO.............
..OOOO.............
...OO..............
...................
...OOOOO...........
..OOOOOOO..........
.OO.OOOOO..........
..OO...............
...................
........O.O.....OO.
......O....O...O..O
......OO.....O.O..O
.O..O..OOOO.O...OO.
O.......OO.........
O...O..............
OOOO...............

:stretcher Any pattern that grows by stretching a wick or agar. See wickstretcher and spacefiller.

:strict volatility A term suggested by Noam Elkies in August 1998 for the proportion of cells involved in a period n oscillator which themselves oscillate with period n. For prime n this is the same as the ordinary volatility.

:super beehive = honeycomb

:superfountain (p4) A p4 sparker which produces a 1-cell spark that is separated from the rest of the oscillator by two clear rows of cells. The first superfountain was found by Noam Elkies in February 1998. In January 2006 Nicolay Beluchenko found the much smaller one shown below. See also fountain.


...........O...........
.......................
.......................
.....O..O.....O..O.....
...OO..O.OOOOO.O..OO...
.....O...........O.....
...O.OO.........OO.O...
.O.O...OOO...OOO...O.O.
OOO.O.............O.OOO
..........O.O..........
....OOO...O.O...OOO....
....O..O...O...O..O....
...OOOO..O.O.O..OOOO...
...OO..OOO.O.OOO..OO...
..O...O...O.O...O...O..
...O..O.O.O.O.O.O..O...
....O.O.OO...OO.O.O....
.....O...........O.....

:superstring An infinite orthogonal row of cells stabilized on one side so that it moves at the speed of light, often leaving debris behind. The first examples were found in 1971 by Edward Fitzgerald and Robert Wainwright. Superstrings were studied extensively by Peter Rott during 1992-1994, and he found examples with many different periods. (But no odd periods. In August 1998 Stephen Silver proved that odd-period superstrings are impossible.)

Sometimes a finite section of a superstring can be made to run between two tracks ("waveguides"). This gives a fuse which can be made as wide as desired. The first example was found by Tony Smithurst and uses tubs. (This is shown below. The superstring itself is p4 with a repeating section of width 9 producing one blinker per period and was one of those discovered in 1971. With the track in place, however, the period is 8. This track can also be used with a number of other superstrings.) Shortly after seeing this example, in March 1997 Peter Rott found another superstring track consisting of boats. At present these are the only two waveguides known. Both are destroyed by the superstring as it moves along - it would be interesting to find one that remains intact.

See titanic toroidal traveler for another example of a superstring.


.OO..........................................................
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
....O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
.OOO.........................................................
..OO.........................................................
..OO.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
...O.........................................................
..OO.........................................................
..OO.........................................................
.OOO.........................................................
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
....O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
O..O...O...O...O...O...O...O...O...O...O...O...O...O...O...O.
.OO..........................................................

:support Those parts of an object which are only present in order to keep the rest of the object (such an engine or an edge spark) working correctly. These can be components of the object, or else accompanying objects used to perturb the object. In many cases there is a wide variation of support possible for an engine. The arms in many puffers are an example of support.

:surprise (p3) Found by Dave Buckingham, November 1972.


...O....OO
...OOO..O.
.OO...O.O.
O..OO.O.OO
.O......O.
OO.O.OO..O
.O.O...OO.
.O..OOO...
OO....O...

:swan (c/4 diagonally, p4) A diagonal spaceship producing some useful sparks. Found by Tim Coe in February 1996.


.O..........OO..........
OOOOO......OO...........
O..OO........O.......OO.
..OO.O.....OO......OOO.O
...........OO...O.OO....
.....O.O......OO........
..........OOO.O....O....
.......OOO...O....O.....
........O.......O.......
........O......O........
........................
...........O............

:switch engine The following pattern, which in itself is unstable, but which can be used to make c/12 diagonal puffers and spaceships.


.O.O..
O.....
.O..O.
...OOO

The switch engine was discovered by Charles Corderman in 1971. He also found the two basic types of stabilized switch engine: a p288 block-laying type (the more common of the two) and p384 glider-producing type. These two puffers are the most natural infinite growth patterns in Life, being the only ones ever seen to occur from random starting patterns.

Patterns giving rise to block-laying switch engines can be seen under infinite growth, and one giving rise to a glider-producing switch engine is shown under time bomb. See also Cordership and ark.

:synthesis = glider synthesis


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_t.htm0000644000175100001440000011332112156145314014332 00000000000000 Life Lexicon (T)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:T = T-tetromino

:table The following induction coil.


OOOO
O..O

:table on table (p1)


O..O
OOOO
....
OOOO
O..O

:tag = tagalong

:tagalong An object which is not a spaceship in its own right, but which can be attached to one or more spaceships to form a larger spaceship. For examples see Canada goose, fly, pushalong, sidecar and sparky. See also Schick engine, which consists of a tagalong attached to two LWSS (or similar).

:tail spark A spark at the back of a spaceship. For example, the 1-bit spark at the back of a LWSS, MWSS or HWSS in their less dense phases.

:tame To perturb a dirty reaction using other patterns so as to make it clean and hopefully useful. Or to make a reaction work which would otherwise fail due to unwanted products which interfere with the reaction.

:taming See tame.

:teardrop The following induction coil, or the formation of two beehives that it evolves into after 20 generations. (Compare butterfly, where the beehives are five cells further apart.)


OOO.
O..O
O..O
.OO.

:technician (p5) Found by Dave Buckingham, January 1973.


.....O.....
....O.O....
....OO.....
..OO.......
.O...OOO...
O..OO...O.O
.OO....O.OO
...O.O.O...
...O...O...
....OOO....
......O.O..
.......OO..

:technician finished product = technician

:teeth A 65-cell quadratic growth pattern found by Nick Gotts in March 2000. This (and a related 65-cell pattern which Gotts found at about the same time) beat the record previously held by mosquito5 for smallest population known to have superlinear growth. Now superseded by catacryst and metacatacryst.

:ternary reaction Any reaction between three objects. In particular, a reaction in which two gliders from one stream and one glider from a crossing stream of the same period annihilate each other. This can be used to combine two glider guns of the same period to produce a new glider gun with double the period.

:test tube baby (p2)


OO....OO
O.O..O.O
..O..O..
..O..O..
...OO...

:tetraplet Any 4-cell polyplet.

:tetromino Any 4-cell polyomino. There are five such objects, shown below. The first is the block, the second is the T-tetromino and the remaining three rapidly evolve into beehives.


OO......OOO......OOOO......OOO......OO.
OO.......O...................O.......OO

:The Recursive Universe A popular science book by William Poundstone (1985) dealing with the nature of the universe, illuminated by parallels with the game of Life. This book brought to a wider audience many of the results that first appeared in LifeLine. It also outlines the proof of the existence of a universal constructor in Life first given in Winning Ways.

:thumb A spark-like protrusion which flicks out in a manner resembling a thumb being flicked.

Here are two examples. On the left is a p9 thumb sparker found by Dean Hickerson in October 1998. On the right is a p4 one found by David Eppstein in June 2000.


.......O..............O.....
...OO...O.........OO...O....
...O.....O.OO.....O.....O...
OO.O.O......O......OOO.O.OO.
OO.O.OO.OOOO............OO.O
...O.O...........OOOOOO....O
...O.O.OOO.......O....OOOOO.
....O.O...O.........O.......
......O..OO........O.OOOO...
......OO...........O.O..O...
....................O.......

:thunderbird (stabilizes at time 243)


OOO
...
.O.
.O.
.O.

:tick = generation

:tie A term used in naming certain still lifes (and the stator part of certain oscillators). It indicates that the object consists of two smaller objects joined point to point, as in ship tie boat.

:time bomb The following pattern by Doug Petrie, which is really just a glider-producing switch engine in disguise. See infinite growth for some better examples of a similar nature.


.O...........OO
O.O....O......O
.......O....O..
..O..O...O..O..
..OO......O....
...O...........

:titanic toroidal traveler The superstring with the following repeating segment. The front part becomes p16, but the eventual fate of the detached back part is unknown.


OOOOOO
OOO...

:TL = traffic light

:T-nosed p4 (p4) Found by Robert Wainwright in October 1989. See also filter.


.....O.....
.....O.....
....OOO....
...........
...........
...........
...OOOOO...
..O.OOO.O..
..O.O.O.O..
.OO.O.O.OO.
O..OO.OO..O
OO.......OO

:T-nosed p6 (p6) Found by Achim Flammenkamp in September 1994. There is also a much larger and fully symmetric version found by Flammenkamp in August 1994.


......OO...OO......
......O.O.O.O......
.......O...O.......
...................
..O.O.O.....O.O.O..
OOO.O.OO...OO.O.OOO
..O.O.O.....O.O.O..
...................
.......O...O.......
......O.O.O.O......
......OO...OO......

:toad (p2) Found by Simon Norton, May 1970. This is the second most common oscillator, although blinkers are more than a hundred times as frequent. See also killer toads.


.OOO
OOO.

:toad-flipper A toad hassler that works in the manner of the following example. Two domino sparkers, here pentadecathlons, apply their sparks to the toad in order to flip it over. When the sparks are applied again it is flipped back. Either or both domino sparkers can be moved down two spaces from the position shown and the toad-flipper will still work, but because of symmetry there are really only two different types. Compare toad-sucker.


.O..............O.
.O..............O.
O.O............O.O
.O..............O.
.O......O.......O.
.O......OO......O.
.O......OO......O.
O.O......O.....O.O
.O..............O.
.O..............O.

:toad-sucker A toad hassler that works in the manner of the following example. Two domino sparkers, here pentadecathlons, apply their sparks to the toad in order to shift it. When the sparks are applied again it is shifted back. Either or both domino sparkers can be moved down two spaces from the position shown and the toad-sucker will still work, but because of symmetry there are really only three different types. Compare toad-flipper.


.O................
.O..............O.
O.O.............O.
.O.............O.O
.O......O.......O.
.O......OO......O.
.O......OO......O.
O.O......O......O.
.O.............O.O
.O..............O.
................O.

:toaster (p5) Found by Dean Hickerson, April 1992.


....O......OO..
...O.O.OO..O...
...O.O.O.O.O...
..OO.O...O.OO..
O...OO.O.OO...O
...O.......O...
...O.......O...
O...OO.O.OO...O
..OO.O...O.OO..
...O.O.O.O.O...
...O.O.OO..O...
....O......OO..

:torus As applies to Life, usually means a finite Life universe which takes the form of an m x n rectangle with the bottom edge considered to be joined to the top edge and the left edge joined to the right edge, so that the universe is topologically a torus. There are also other less obvious ways of obtaining an toroidal universe.

See also Klein bottle.

:total aperiodic Any finite pattern which evolves in such a way that no cell in the Life plane is eventually periodic. The first example was found by Bill Gosper in November 1997. A few days later he found the following much smaller example consisting of three copies of a p12 backrake by Dave Buckingham.


.........................................O.................
........................................OOO................
.......................................OO.O.....O..........
.......................................OOO.....OOO.........
........................................OO....O..OO...OOO..
..............................................OOO....O..O..
........................................................O..
........................................................O..
........................................................O..
........................................OOO............O...
........................................O..O...............
........................................O..................
........................................O..................
.........................................O.................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
...........................................................
......................................OOO..................
......................................O..O...........O.....
......................................O.............OOO....
......................................O............OO.O....
......................................O............OOO.....
.......................................O............OO.....
...........................................................
...........................................................
...................................OOO.....................
..................................OOOOO....................
..................................OOO.OO.......OO........O.
.....................................OO.......OOOO........O
..............................................OO.OO...O...O
................................................OO.....OOOO
...........................................................
...........................................................
....................O......................................
.....................O.....................................
.OO.............O....O................................OOO..
OOOO.............OOOOO..................................O..
OO.OO...................................................O..
..OO...................................................O...
....................................O......................
.....................................O.....................
.....................OO..........O...O.....................
......................OO..........OOOO...............OO....
.....................OO...........................OOO.OO...
.....................O............................OOOOO....
...................................................OOO.....
...........................................................
......................OO...................................
.............OOOO....OOOO..................................
............O...O....OO.OO.................................
.OOOOO..........O......OO..................................
O....O.........O...........................................
.....O.....................................................
....O......................................................

:T-pentomino Conway's name for the following pentomino, which is a common parent of the T-tetromino.


OOO
.O.
.O.

:track A path made out of conduits, often ending where it begins so that the active object is cycled forever, forming an oscillator or a gun.

:tractor beam A stream of spaceships that can draw an object towards the source of the stream. The example below shows a tractor beam pulling a loaf; this was used by Dean Hickerson to construct a sawtooth.


.....................O..O......................
.....OOOO...........O..............OOOO........
.....O...O..........O...O..........O...O.......
.....O........OO....OOOO...........O........OO.
.OO...O..O...OOOO...........OO......O..O...OOOO
O..O........OO.OO..........OO.OO..........OO.OO
O.O..........OO.............OOOO...........OO..
.O...........................OO................

:traffic circle (p100)


.....................OO....OO...................
.....................O.O..O.O...................
.......................O..O.....................
......................OO..OO....................
.....................OOO..OOO...................
.......................O..O.....................
...............................O................
..............................O.OO..............
..................................O.............
..........................O...O..O.O............
..........................O.....O..O............
..........................O......OO.............
.........OO.....................................
........O..O..........OOO...OOO.................
.......O.O.O....................................
......OOO.O...............O.....................
......OOO.................O.....................
..........................O.....................
............OOO.................................
OO..O................OOO........................
O..OO.....O.....O...............................
.OOOOO....O.....O..O.....O.................O..OO
..........O.....O..O.....O.................OO..O
...................O.....O.......OOO......OOOOO.
.OOOOO......OOO.................................
O..OO................OOO.......O.....O..........
OO..O..........................O.....O....OOOOO.
...............................O.....O.....OO..O
...........................................O..OO
.................................OOO............
.......................................OO.......
......................................OOO.......
.....................................O.OO.......
....................................O.O.........
....................OOO.............O..O........
.....................................OO.........
.............OO....O..O.........................
............O..O................................
............O.O.O...............................
.............O..O...............................
.................O..............................
..............O.O...............................
.....................O..O.......................
...................OOO..OOO.....................
....................OO..OO......................
.....................O..O.......................
...................O.O..O.O.....................
...................OO....OO.....................

:traffic jam Any traffic light hassler, such as traffic circle. The term is also applied to the following reaction, used in most traffic light hasslers, in which two traffic lights interact in such a way as to reappear after 25 generations with an extra 6 spaces between them.


..OOO...........
...........OOO..
O.....O.........
O.....O..O.....O
O.....O..O.....O
.........O.....O
..OOO...........
...........OOO..

:traffic light (p2) A common formation of four blinkers.


..OOO..
.......
O.....O
O.....O
O.....O
.......
..OOO..

:trans-beacon on table (p2)


....OO
.....O
..O...
..OO..
......
OOOO..
O..O..

:trans-boat with tail (p1)


OO...
O.O..
.O.O.
...O.
...OO

:transceiver See Herschel transceiver.

:trans-loaf with tail (p1)


.O....
O.O...
O..O..
.OO.O.
....O.
....OO

:transmitter See Herschel transmitter.

:transparent block reaction A certain reaction between a block and a Herschel predecessor in which the block reappears in its original place some time later, the reaction having effectively passed through it. This reaction was found by Dave Buckingham in 1988. It has been used in some Herschel conduits, and in the gunstars. Because the reaction involves a Herschel predecessor rather than an actual Herschel, the following diagram shows instead a B-heptomino (which by itself would evolve into a block and a Herschel).


O.............
OO..........OO
.OO.........OO
OO............

:transparent debris effect A reaction in which a Herschel or other active region destroys a still life, then later, having passed through the place where the still life was, recreates the still life in its original position. For an example, see transparent block reaction.

:trice tongs (p3) Found by Robert Wainwright, February 1982. In terms of its 7x7 bounding box this ties with jam as the smallest p3 oscillator.


..O....
..OOO..
OO...O.
.O.O.O.
.O.....
..OO..O
.....OO

:triomino Either of the two 3-cell polyominoes. The term is rarely used in Life, since the two objects in question are simply the blinker and the pre-block.

:triple caterer (p3) Found by Dean Hickerson, October 1989. Compare caterer and double caterer.


.....OO.........
....O..O..OO....
....OO.O...O....
......O.OOO....O
..OOO.O.O....OOO
.O..O..O....O...
O.O..O...O..OO..
.O..............
..OO.OO.OO.OO...
...O...O...O....
...O...O...O....

:triplet Any 3-cell polyplet. There are 5 such objects, shown below. The first two are the two triominoes, and the other three vanish in two generations.


O..................O.......O.......O..
OO......OOO......OO.......O.O.......O.
.....................................O

:tripole (p2) The barberpole of length 3.


OO....
O.O...
......
..O.O.
.....O
....OO

:tritoad (p3) Found by Dave Buckingham, October 1977.


.........OO.......
.........O........
..........O..OO...
.......OOO.O..O...
......O....OO.O.OO
......O.OO..O.O.OO
...OO.O...OO..O...
...O..OO...O.OO...
OO.O.O..OO.O......
OO.O.OO....O......
...O..O.OOO.......
...OO..O..........
........O.........
.......OO.........

:true Opposite of pseudo. A gun emitting a period n stream of spaceships (or rakes) is said to be a true period n gun if its mechanism oscillates with period n. (The same distinction between true and pseudo also exists for puffers.) True period n guns are known to exist for all periods greater than 61 (see My Experience with B-heptominos in Oscillators), but only a few smaller periods have been achieved, namely 22, 24, 30, 36, 44, 46, 48, 50, 54, 55, 56 and 60. (Credits for these small period guns are: p30, p46 and p60 by Bill Gosper in 1970-1971, p44 by Dave Buckingham in 1992, p50 by Dean Hickerson in 1996, p24 and p48 by Noam Elkies in 1997, p54 and p56 by Dieter Leithner in early 1998, p55 by Stephen Silver in late 1998, p22 by David Eppstein in 2000 and p36 by Jason Summers in 2004.)

The following diagram shows the p22 gun (David Eppstein, August 2000, using two copies of a p22 oscillator found earlier the same day by Jason Summers).


..................OO.........................
...................O.......O.................
...................O.O..............OO.......
....................OO............OO..O......
........................OOO.......OO.OO......
........................OO.OO.......OOO......
........................O..OO............OO..
.........................OO..............O.O.
...................................O.......O.
...........................................OO
.............................................
OO.......................O...................
.O.....................O.O...................
.O.O.............OOO....OO...................
..OO...O........O...O........................
......O.OO......O....O.......................
.....O....O......OO.O.........O..............
......O...O........O...OO......O.............
.......OOO.............O.O...OOO.............
.........................O...................
.........................OO..................

:T-tetromino The following common predecessor of a traffic light.


OOO
.O.

:tub (p1)


.O.
O.O
.O.

:tubber (p3) Found by Robert Wainwright before June 1972.


....O.O......
....OO.O.....
.......OOO...
....OO....O..
OO.O..OO..O..
.O.O....O.OO.
O...O...O...O
.OO.O....O.O.
..O..OO..O.OO
..O....OO....
...OOO.......
.....O.OO....
......O.O....

:tubeater A pattern that consumes the output of a tubstretcher. The smallest known tubeater was found by Hartmut Holzwart, and is shown below in conjunction with the smallest known tubstretcher.


.......OO.........................
.......O.O........................
.......O..........................
..........O.......................
..........OO......................
..........OO......................
.........OO.......................
OO......OO...O....................
O.O...OO..O.O.O...................
O.....OOO....O.O..................
...O..........O.O.................
...OO..........O.O................
................O.O...............
.................O.O...O..........
..................OO..O.O.........
.....................OO.O.........
.....................OO...........
.....................OO...........
...............................OO.
.......................O....OO.O..
.......................OOO..OO....
.......................OOO..OO....
........................OO........
..................................
..........................O.......
.........................OO.......
.........................O........
..........................O.......
..................................
...........................OO.....
............................O.OO..
................................O.
.............................OO...
.............................OO...
...............................O..
................................OO

:tubstretcher Any wickstretcher in which the wick is two diagonal lines of cells forming, successively, a tub, a barge, a long barge, etc. The first one was found by Hartmut Holzwart in June 1993, although at the time this was considered to be a boatstretcher (as it was shown with an extra cell, making the tub into a boat). The following small example is by Nicolay Beluchenko (August 2005), using a quarter.


.......OOO.....
.......O.......
........O......
..........OO...
...........O...
...............
........OO...O.
OOO.....OO..O.O
O......O.O...O.
.O....OO.......
...OOOO.O......
....OO.........

:tub with tail (p1)


.O...
O.O..
.O.O.
...O.
...OO

:tugalong = tagalong

:tumbler (p14) The smallest known p14 oscillator. Found by George Collins in 1970.


.O.....O.
O.O...O.O
O..O.O..O
..O...O..
..OO.OO..

:tumbling T-tetson (p8) A T-tetromino hassled by two figure-8s. Found by Robert Wainwright.


.OOO.................
O..................OO
O...O............O.OO
O..O.O..........O....
..O.O..O...........O.
...O...O.......OO.O..
.......O.......OO....
....OOO....O.........
.........OO..........
...........O.........

:Turing machine See universal computer.

:turning toads (p4 wick) Found by Dean Hickerson, October 1989.


..............OO.....OO.....OO.....OO.....OO..............
.......O.....O......O......O......O......O................
......OO...O....O.O....O.O....O.O....O.O....O.O.O.OO......
..OO.O.OOO.O..OO..O..OO..O..OO..O..OO..O..OO..O..O..O.OO..
O..O.OO.........................................OOOOO.O..O
OO.O..............................................OO..O.OO
...O..................................................O...
...OO................................................OO...

:turtle (c/3 orthogonally, p3) Found by Dean Hickerson.


.OOO.......O
.OO..O.OO.OO
...OOO....O.
.O..O.O...O.
O....O....O.
O....O....O.
.O..O.O...O.
...OOO....O.
.OO..O.OO.OO
.OOO.......O

:twin bees shuttle (p46) Found by Bill Gosper in 1971, this is the basis of all known p46 oscillators, and so of all known true p46 guns (see new gun for an example). There are numerous ways to stabilize the ends, two of which are shown in the diagram. On the left is David Bell's double block reaction (which results in a shorter, but wider, shuttle than usual), and on the right is the stabilization by a single block. This latter method produces a very large spark which is useful in a number of ways (see, for example, metamorphosis). Adding a symmetrically placed block below this one suppresses the spark. See also p54 shuttle.


.OO........................
.OO........................
...........................
...............O...........
OO.............OO........OO
OO..............OO.......OO
...........OO..OO..........
...........................
...........................
...........................
...........OO..OO..........
OO..............OO.........
OO.............OO..........
...............O...........
...........................
.OO........................
.OO........................

:twinhat (p1) See also hat and sesquihat.


..O...O..
.O.O.O.O.
.O.O.O.O.
OO.O.O.OO
....O....

:twin peaks = twinhat

:twirling T-tetsons II (p60) Found by Robert Wainwright. This is a pre-pulsar hassled by killer toads.


.......OO...OO..........
......O.......O.........
.........O.O............
.......OO...OO..........
........................
........................
........................
.....................OOO
....................OOO.
.............O..........
OOO.........OOO.........
.OOO....................
....................OOO.
.....................OOO
........................
.OOO....................
OOO.........OOO.........
.............O..........
........................
........................
..........OO...OO.......
............O.O.........
.........O.......O......
..........OO...OO.......

:TWIT = tub with tail

:two eaters (p3) Found by Bill Gosper, September 1971.


OO.......
.O.......
.O.O.....
..OO.....
.....OO..
.....O.O.
.......O.
.......OO

:two pulsar quadrants (p3) Found by Dave Buckingham, July 1973. Compare pulsar quadrant.


....O....
....O....
...OO....
..O......
O..O..OOO
O...O.O..
O....O...
.........
..OOO....

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_u.htm0000644000175100001440000002332212156145314014334 00000000000000 Life Lexicon (U)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:underpopulation Death of a cell caused by it having fewer than two neighbours. See also overpopulation.

:unit Life cell A rectangular pattern, of size greater than 1x1, that can simulate Life in the following sense. The pattern by itself represents a dead Life cell, and some other pattern represents a live Life cell. When the plane is tiled by these two patterns (which then represent the state of a whole Life universe) they evolve, after a fixed amount of time, into another tiling of the plane by the same two patterns which correctly represents the Life generation following the one they initially represented. It is usual to use capital letters for the simulated things, so, for example, for the first known unit Life cell (constructed by David Bell in January 1996), one Generation is 5760 generations, and one Cell is 500x500 cells.

In December 2005, Jason Summers constructed an analogous unit cell for Wolfram's Rule 100, a one-dimensional cellular automaton that is know be universal.

:universal computer A computer that can compute anything that is computable. (The concept of computability can be defined in terms of Turing machines, or by Church's lambda calculus, or by a number of other methods, all of which can be shown to lead to equivalent definitions.) The relevance of this to Life is that both Bill Gosper and John Conway proved early on that it is possible to construct a universal computer in the Life universe. (To prove the universality of a cellular automaton with simple rules was in fact Conway's aim in Life right from the start.) Conway's proof is outlined in Winning Ways, and also in The Recursive Universe.

Until recently, no universal Life computer had ever been built in practice, because it would be enormous, even with the improvements that have been devised since those early proofs. In April 2000, Paul Rendell completed a Turing machine construction (described in http://www.cs.ualberta.ca/~bulitko/F02/papers/tm_words.pdf). This, however, has a finite tape, as opposed to the infinite tape of a true Turing machine, and is therefore not a universal computer. But in November 2002, Paul Chapman announced the construction of a universal computer, details of which can be found at http://www.igblan.free-online.co.uk/igblan/ca/. This is a universal register machine based around Dean Hickerson's sliding block memory.

See also universal constructor.

:universal constructor A pattern that is capable of constructing almost any pattern that has a glider synthesis. This definition is a bit vague. A precise definition seems impossible because it has not been proved that all possible glider fleets are constructible. In any case, a universal constructor ought to be able to construct itself in order to qualify as such. An outline of Conway's proof that such a pattern exists can be found in Winning Ways, and also in The Recursive Universe. The key mechanism for the production of gliders with any given path and timing is known as side-tracking, and is based on the kickback reaction. A universal constructor designed in this way can also function as a universal destructor - it can delete almost any pattern that can be deleted by gliders.

In May 2004, Paul Chapman and Dave Greene produced a prototype programmable universal constructor. This is able to construct objects by means of slow glider constructions. It likely that it could be programmed to be construct itself, but the necessary program would be very large; moreover an additional mechanism would be needed in order to copy the program.

A universal constructor is most useful when attached to a universal computer, which can be programmed to control the constructor to produce the desired pattern of gliders. In what follows I will assume that a universal constructor always includes this computer.

The existence of a universal constructor/destructor has a number of theoretical consequences.

For example, the constructor could be programmed to make copies of itself. This is a replicator.

The constructor could even be programmed to make just one copy of itself translated by a certain amount and then delete itself. This would be a (very large, very high period) spaceship. Any translation is possible (except that it must not be too small), so that the spaceship could travel in any direction. It could also travel slower than any given speed, since we could program it to perform some time-wasting task (such as repeatedly constructing and deleting a block) before copying itself. Of course, we could also choose for it to leave some debris behind, thus making a puffer.

It is also possible to show that the existence of a universal constructor implies the existence of a stable reflector. This proof is not so easy, however, and is no longer of much significance now that explicit examples of such reflectors are known.

:universal destructor See universal constructor.

:universal register machine = URM

:universal regulator A regulator in which the incoming gliders are aligned to period 1, that is, they have arbitrary timing (subject to some minimum time required for the regulator to recover from the previous glider).

Paul Chapman constructed the first universal regulator in March 2003. It is adjustable, so that the output can be aligned to any desired period.

:unix (p6) Two blocks eating a long barge. This is a useful sparker, found by Dave Buckingham in February 1976. The name derives from the fact that it was for some time the mascot of the Unix lab of the mathematics faculty at the University of Waterloo.


.OO.....
.OO.....
........
.O......
O.O.....
O..O..OO
....O.OO
..OO....

:up boat with tail = trans-boat with tail

:U-pentomino Conway's name for the following pentomino, which rapidly dies.


O.O
OOO

:URM A universal register machine, particularly Paul Chapman's Life implementation of such a machine. See universal computer for more information.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_v.htm0000644000175100001440000001144412156145314014337 00000000000000 Life Lexicon (V)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:vacuum Empty space. That is, space containing only dead cells.

:Venetian blinds The p2 agar obtained by using the pattern O..O to tile the plane.

:very long = long long

:very long house The following induction coil.


.OOOOO.
O..O..O
OO...OO

:volatility The volatility of an oscillator is the size (in cells) of its rotor divided by the sum of the sizes of its rotor and its stator. In other words, it is the proportion of cells involved in the oscillator which actually oscillate. For many periods there are known oscillators with volatility 1, see for example Achim's p16, figure-8, Kok's galaxy, mazing, pentadecathlon, phoenix, relay, smiley and tumbler. The smallest period for which the existence of such statorless oscillators is undecided is 3, although Dean Hickerson showed in 1994 that there are p3 oscillators with volatility arbitrarily close to 1 (as is the case for all but finitely many periods, because of the possibility of feeding the gliders from a true period n gun into an eater).

The term "volatility" is due to Robert Wainwright. See also strict volatility.

:volcano Any of a number of p5 oscillators which produce sparks. See lightweight volcano, middleweight volcano and heavyweight volcano.

:V-pentomino Conway's name for the following pentomino, a loaf predecessor.


O..
O..
OOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_w.htm0000644000175100001440000002612712156145314014344 00000000000000 Life Lexicon (W)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:washerwoman (2c/3 p18 fuse) A fuse by Earl Abbe.


O.......................................................
OO....O.....O.....O.....O.....O.....O.....O.....O.....O.
OOO..O.O...O.O...O.O...O.O...O.O...O.O...O.O...O.O...O.O
OO....O.....O.....O.....O.....O.....O.....O.....O.....O.
O.......................................................

:washing machine (p2) Found by Robert Wainwright before June 1972.


.OO.OO.
O.OO..O
OO....O
.O...O.
O....OO
O..OO.O
.OO.OO.

:wasp (c/3 orthogonally, p3) The following spaceship which produces a domino spark at the back. It is useful for perturbing other objects. Found by David Bell, March 1998.


..........OO.OO.......
........OO.O.OO.OO....
.....OOO.O..OOO..OOOO.
.OOO....OOO.....O....O
O.O.O.OOO.O........OO.
O.O.O.OOOO............
.O.O....O..O..........
..........O...........
..O...................
..O...................

:wavefront (p4) Found by Dave Buckingham, 1976 or earlier.


........OO...
........O....
.........O...
........OO...
.....OO...OO.
....O..OOO..O
....O.....OO.
.....O...O...
OO.O.O...O...
O.OO.O.OO....
....O.O......
....O.O......
.....O.......

:waveguide See superstring.

:weekender (2c/7 orthogonally, p7) Found by David Eppstein in January 2000. In April 2000 Stephen Silver found a tagalong for a pair of weekenders. At present, n weekenders pulling n-1 tagalongs constitute the only known spaceships of this speed or period.


.O............O.
.O............O.
O.O..........O.O
.O............O.
.O............O.
..O...OOOO...O..
......OOOO......
..OOOO....OOOO..
................
....O......O....
.....OO..OO.....

:weld To join two or more still lifes or oscillators together. This is often done in order to fit the objects into a smaller space than would otherwise be possible. The simplest useful example is probably the integral sign, which can be considered as a pair of welded eater1s.

:Wheels, Life, and other Mathematical Amusements One of Martin Gardner's books (1983) that collects together material from his column in Scientific American. The last three chapters of this book contain all the Life stuff.

:why not (p2) Found by Dave Buckingham, July 1977.


...O...
...O.O.
.O.....
O.OOOOO
.O.....
...O.O.
...O...

:wick A stable or oscillating linearly repeating pattern that can be made to burn at one end. See fuse.

:wickstretcher A spaceship-like object which stretches a wick that is fixed at the other end. The wick here is assumed to be in some sense connected, otherwise most puffers would qualify as wickstretchers. The first example of a wickstretcher was found in October 1992 (front end by Hartmut Holzwart and back end by Dean Hickerson) and stretches ants at a speed of c/4. This is shown below with an improved back end found by Hickerson the following month.


.................OO..............................
.............OO....O.............................
............OOO.O................................
O.OO..OO...O...OOOO.O.O....OO.......OO...........
O....OO..O........O.OOO....O....OO.O..O.OO.O.....
O.OO....OO.OO....O...........O...O.O.OO.O.OO.....
......O.......O.............OO.....O..O.O...OO...
.....O.........O.O....OOO...O....O..O.O.OOO...O..
.....O.........O.O....OOO.OO.O..OO.O.O...O..OO.O.
......O.......O.............OO.O...OO....OO....O.
O.OO....OO.OO....O..........O........OO.O.O.OO.OO
O....OO..O........O.OOO........O...O...OO.O..O.O.
O.OO..OO...O...OOOO.O.O.......O.O...OO....O..O.O.
............OOO.O..............O.....O.OOO....O..
.............OO....O.................O.O.........
.................OO...................O..........
Diagonally moving c/4 and c/12 wickstretchers have also been built: see tubstretcher and linestretcher. In July 2000 Jason Summers constructed a c/2 wickstretcher, stretching a p50 traffic jam wick, based on an earlier (October 1994) pattern by Hickerson.

:wicktrailer Any extensible tagalong, that is, one which can be attached to the back of itself, as well as to the back of a spaceship. The number of generations which it takes for the tagalong to occur again in the same place is often called the period of the wicktrailer - this has little relation to the period of the tagalong units themselves.

:windmill (p4) Found by Dean Hickerson, November 1989.


...........O......
.........OO.O.....
.......OO.........
..........OO......
.......OOO........
..................
OOO...............
...OO..OOO.OO.....
..........OOOOOOO.
.OOOOOOO..........
.....OO.OOO..OO...
...............OOO
..................
........OOO.......
......OO..........
.........OO.......
.....O.OO.........
......O...........

:wing The following induction coil. This is generation 2 of block and glider.


.OO.
O..O
.O.O
..OO

:WinLifeSearch Jason Summers' GUI version of lifesrc for MS Windows. It is available from http://entropymine.com/jason/life/software/.

:Winning Ways A two-volume book (1982) by Elwyn Berlekamp, John Conway and Richard Guy on mathematical games. The last chapter of the second volume concerns Life, and outlines a proof of the existence of a universal constructor.

:with-the-grain grey ship A grey ship in which the region of density 1/2 consists of lines of ON cells lying parallel to the direction in which the spaceship moves. See also against-the-grain grey ship.

:WLS = WinLifeSearch

:worker bee (p9) Found by Dave Buckingham in 1972. Unlike the similar snacker this produces no sparks, and so is not very important. Like the snacker, the worker bee is extensible - it is, in fact, a finite version of the infinite oscillator which consists of six ON cells and two OFF cells alternating along a line. Note that Dean Hickerson's new snacker ends also work here.


OO............OO
.O............O.
.O.O........O.O.
..OO........OO..
................
.....OOOOOO.....
................
..OO........OO..
.O.O........O.O.
.O............O.
OO............OO

:W-pentomino Conway's name for the following pentomino, a common loaf predecessor.


O..
OO.
.OO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_x.htm0000644000175100001440000000662212156145314014343 00000000000000 Life Lexicon (X)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:x66 (c/2 orthogonally, p4) Found by Hartmut Holzwart, July 1992. Half of this can be escorted by a HWSS. The name refers to the fact that every cell (live or dead) has at most 6 live neighbours (in contrast to spaceships based on LWSS, MWSS or HWSS). In fact this spaceship was found by a search with this restriction.


..O......
OO.......
O..OOO..O
O....OOO.
.OOO..OO.
.........
.OOO..OO.
O....OOO.
O..OOO..O
OO.......
..O......

:Xlife A popular freeware Life program that runs under the X Window System. The main Life code was written by Jon Bennett, and the X code by Chuck Silvers.

:X-pentomino Conway's name for the following pentomino, a traffic light predecessor.


.O.
OOO
.O.

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_y.htm0000644000175100001440000000471412156145314014344 00000000000000 Life Lexicon (Y)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Y-pentomino Conway's name for the following pentomino, which rapidly dies.


..O.
OOOO

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/lex_z.htm0000644000175100001440000000611312156145314014340 00000000000000 Life Lexicon (Z)
Introduction | Bibliography

1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

:Z-hexomino The following hexomino. The Z-hexomino features in the pentoad, and also in Achim's p144.


OO.
.O.
.O.
.OO

:Z-pentomino Conway's name for the following pentomino, which rapidly dies.


OO.
.O.
.OO

:zweiback (p30) An oscillator in which two HW volcanoes hassle a loaf. This was found by Mark Niemiec in February 1995 and is too big to show here.


1-9 | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

golly-2.5-src/Help/Lexicon/modify.pl0000755000175100001440000000273112156145314014336 00000000000000#!/usr/bin/perl @files = glob "*.htm" ; for $file (@files) { open F, "$file" or die "Can't open $file\n" ; @f = ; close F ; $f = join('', @f) ; for (($f)) { s///g ; s!
Life Lexicon Home Page!
Introduction \| Bibliography
!g ; s|
Life Lexicon
||g ; s:^Introduction \|::gm ; s:^Introduction \|::gm ; s:Z \|:Z:g ; s:Z \|:Z:g ; s|^Bibliography||gm ; s|^Bibliography||gm ; s||
|gm ;
      s|^
|
|gm ; # fix problems in lex_[hps].htm s|\n-|\n-|g ; s|-\n|-\n|g ; # fix problem in lex_l.htm s|\nMar|\nMar|g ; s|1973\n|1973\n|g ; } open F, ">$file" or die "Can't write $file\n" ; print F $f ; close F ; } golly-2.5-src/Help/about.gif0000644000175100001440000013617112156145314012715 00000000000000GIF89ayað1ÿÿÿ333!ÿ NETSCAPE2.0}!þGifBuilder 1.1!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷¾xÃý†Ä¢ñØ ‘̦óù»5”ЪõŠÚ"K„´› ‹ÇÌ­JhfHÉì¶ÛØM×`úúÏë=ñ©á^¸7HXø!˜@ågÈØèøW9‡øhyé3©ò€&è‰*Ê¢éP¸4ºÊz±ª’kGÛz‹›Hq:ÇË›,ü×2Ù9Œ|kKÌœºœMXê¬Û[]-­}I½íý­–!.A~fŽÎ®žÒÝï¸._?LMo¯¿Ï‘ÏÿïÎÔ8N š€öb<ƒ gó×ÁĆ +%zÕkFŠÿm‚ôŽÏÆŽ$+¨šf!„‘%[æPB–JY.kºR„ÊÂ9®ÚüirÅ12ùÛ 4i3f‘2õ"Ž¥Ò©ã^y:ÉtM$„N­˜XN(3°{p˜}*Ê—Z¯[ŽšfUYª¸®ú²#É–™­FñJ aUÛ±:¹@Íû±¯¦¶uÎ^û Ùq¸•qaIy²e´> ]œRJÏ^òÆÜ x.]p Ð ®%ö §ÖZ(#™ókŸ“éè\xsæà±I[>µ¬ÏðE‹?'^Jú/ã³s:¿Èó6RÕ¢«OÞøWaßË5n·ñð¶‘_þ°pÅ„¥_÷:>– äŸ¹ÿþ MWØì"Uuaav {=e0 J.•`9»°uTrtÂvÞsÖçÝy<)š€¿á—ÛJ'j‡^ˆš¸SÇiNW«ÝÈ ­)'>»Y04¦è¢f­ˆ—ò}XZ“ð5÷ã{Ðip™ƒÙã;‚‘’8~)áà})^&\ob"ItÎacæz‡]Z“RªØ!vê¸ÜYA‚Dçäù–ežµ˜æ¥š`.ZL¢²mè$—iŠh }é½Éç…„]xä¥-bF"‘SFúg”lަߓ£šÉ`™ZÖW ²Í7*¤¸¨inœRGi¤x†Ze‘›ÆÙ©°¥j)N­ÿú˜‘_aáhrT­3»FHеqÅj¥svE·žúq-AŽ’pk¦½rkª\±>:(•2Ê‘]ïZÈݘ,î)ª´íykŸ–Åq™dT˜ž)ðƒVzûÝFrG&—˫‚Ǫ¢¬i(¢ à¼ô¢3løR6¯¾Kl¤ùùúfe°Îº¿Á.©ò¤¶Ì2–ìÅô²¿<>¸”?öñO·9èvç>KƒŸâæ‚óÒ…”šÕ\5#ÙÐ28Ý.Ôûj}Å^X/Õ²~òØE³#önŒù'ô‚€®}ãI÷'¯GtÓS±AÌYjïÍÓs[`?„×=3¢Pž­øâ_†œŠä–ª o×&q¹Ñ)ñ¦ùkùÞy+3*l1é¥—Þ ƒ«/šáC‰¿®”Ô±LKûäåλa½ÿŽ‚í¸ûKÄ<ð÷æ|ç±WÞüT* ­zô “.¼õe3{vÙk¿ý@‚O·DWŸJ~E›ÿ«Sõé׺Ɇ"ý¾ÑybØ~ý{‰œtúïßùýOz3ù„ûx=”¬/×8ô=^œàï2fÁ Ê !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÚø‚Íì¶«N„ÅrôûŽÏoâq%±¤'8Hè ö'ˆhÐÕWøɶ¨¤8y`w¹ÉéäHé¥ÈPÕYjªcIe¸æ5©y ;ô÷):”*«» ”™S „É;,{H’úØšKÜì|ùÁœ&ý\mJ­êq(lÝ+ ¬í=NŒaNž®Þ»ÞNžì/ŽR?g<‚œï¯w/Ø¿ÕÂ!!ˆ°DÀ1 :œc_‰+j0È.ÛD+ÿ¹Züˆ¥€¡<‰¢FJBè‡2&WSV¦œ&3gHnùñirÔ9Dúb„Œ¨Œ\Š:m©R$7žK›"}ŠU(Ò>Ê2äS5¤U¯pu3ËÎ¥ •j¸Ò¤¨Ñ‚ÚžYr…Ö–îO½G[e:Øœ´@oEØÆ(³W†¡aí㽆;.¼ pÄ„[*ö)øðHÄ›o%sÈÇܺíh™å#˜ccÙ\ .û™U(œ&G®Ìy2NÜ„w™H3¨ÑÁ1Ï9zXü_åhŽª6㉠¿úxoÑÊ}].¿Ù;h¶/‘§Fÿžùyß_K[=¬[¼ÆbÛÿãîY€½7`Z8 aÃ\ RƒÑ_á˜\_æýáE¶Ý§ƒÖQÖ™_òÙŸyÈebfãM8âräµèFtpè`%ëU²k:¦ÀÒyîÁŠéâw?Á˜}BŠB~Ffƒd|/^ô¡nö"c•ÔmÍ’;~ Q\Ú=È^^õÙR!ˆ>™Þ‹Ò1H£dzù¨¦slJÙ^wZ™dw¤¥i¥„4Ö¨dn]‚‰è s}2ØŠ“Ñ9‰…æyÛƒs~Ö‰"JzØž&¦HiŸ‚hcBeYâu†–$̨g2él.†Jé›–šišWÊ e§©ú ªˆ¢Æ©)p¶qÖ+­eÿ± `˜¤ú*„—ÏâWAŽÛáŸyF”Ÿ´¥­¬‹yê‚«†–i§Þó›\íò:í‘Ön¹m¼ôÌ›(H®éšÉºÓ”ië«öþXç™®ª§œ¹n¾J¬Šâ ¬£7‚{/ÃLnyonü/¿o„o¾­-'TøRUi°LÂE¯Ä·+'¸$Ál(Ÿ»œëÁÐ÷.=;‡;#´ßZxi8]©&²S¹èÕ˜GóÃ-–ƒ6ñ¿„ܶŸÔu0ʘ±yä²$ÀZ=Ö¨a†r†d')yñ´D³{° ¦T[oÈò¯5fL7JS÷ÛóÇÔÊEtßEM*†?e´Rƒë­à͋뫶ä}µå¸öäî$ž&8–kz¬Cü9è;»7á©Cez]IÎtì­n´X³ßïNVé¼ÿ^­ïÀ'öð®³k<îØE“üï05ýNÑO?t©»o=õY…½MæÚ§ó<äSü÷9©]¾ù#ß›­úˆî[Ùqé»¶ª|5&ýMÕ¯iúÓÞ8®îD)V-~à=:ä€ÛÊü(ò ‚" ø(˜/š`°uùÛ ŸæÁº !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªU…$Ðíõ /irÔ,N«×L´"éEãìºýî±¹å†ìâ‡(8è°7aÈçG¸È¸¶…xyØx‰9$YÈ7C)•*Z÷Hé99šªúaJAwzÖº:K˲éùŠÚWÛëË{¡Û!Iü{LhœW¨ü׌ ñl++}}IA¬íÝØlý=.ÍM~Ž~Ó œÞ.(þF²îNß–_ŸŸ:‚«ÿÿ…Ÿ žùskÁ(Þâ°AD‡Æñ‚!'ÿ;–04‘™«HKÞòjN'¥LºüHÒÙ®™Åb²ë÷ äKŠ–$¶¢£³ÒΡÓôÔìÃͨHšƒmTÑcfüA´ù4ëÆIRAùˆ‹Â•Ã,îBYÚhz.¢\Ë•iN·WY9ÕZË«8m—l¹a”}× ³Ö\°`ÞԢ԰߃5?–x9°e¹%›R†F1ÆDèÞ š¯AY~z:KzWìÔ¸*ÏfFF¦F-gãw^úB¡hjV™Tj)Ófƒ²Yž›¢õ&˜âAig‹yž2Zsdž^ú¾v'ºñý .yßã²ï–?>þÉ®pH€Ÿ½ñ“¹Ìî€PÑßþˆ:¶-‚•ûW÷À ÚŽ[ì  !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·ÜÙÕºvÇärôÛ¨ZÍì¶ÛD'nâ·ýŽ©ç89‚ž(88QWsà÷甈HèøHXg¨Ây‰I5ĸ±‡x5™):Ê"Úxöv Hú «qzˆ*Âi›«+cª×´ l2AlÀ)œ¬LaÌ@ܼ-}D-}=ÖƒŒÝí=¢ý-.´:Žþ ýÅîmÿN8ŸZŸ¯ó|oÑñOŸÀå| <˜%TÀ9x!|ø¢„…… ZŒ(g’ÂUÿv¼²jÖ>Ò ‰r7‰ž‘0™òâ¢4íî±<– f̃ž>©rv“IK :w>”´©ç1¥ …v(h4*GE¦”º¢¹æ)T©\ùl–ÓZ|&šò³9œXÚ.Së–ª¢¬”ú¹$Ë!h×q‘6ËT"»j¥e ´ØÜDp§Î2,´äá¶dYqÜ5Œk†‹9Èʼn?ÑÓCï^ˆ†.ó©¼Y. P˜gRöl`Km`&î›Ò/Ð8[~Ì08-ØÀ{ß¾ ùäî¡Tû´ö»Ô÷뢨!Û&~Z4VTΙkÄý{²Zã©“ÿ<½ùhðµÏ·ßhpÙ¹ù[ÿÕšY²Õx£áw WTÒtÞ— fâ%ZR^õ’u¿ˆ× rû±U^|ö•‡\P¹"|XÉמyÌlxÎ_`÷Ùq·ZŽÙ˜…²x÷Ot~øœc"fÖbÚØÔ{ºy8܈óÉ‚žpÒa!X•¦±çÓÿ馗§}I`}M·”SVyâŠóÕÆL€ÏÉ \iÉ9#‰ENyf”<úØc“ÅÍå–)ªf¢;ÀDŒszVç‘Ëñéœ:JœkW¦‡džoîÙbrf hYeYhšhnšÓ¨‡žéŠR†šäpqbš¢¦wJ*ªŠ•‚jdŸB:Z*iL b‘UÿQG‡iH„j¤îê& ’TÕ¥©1IæT~rø§‚8^Kì§f«›´ˆÚ´¤©èò ÃM—1;®¢)!µžFmèçw‡>« ·½bI§zU;‘¥™¾«&“ïÙ'tú¦*}ßÜpÀ A<ÒÁßùWT·öît]2B‰¡®ù‹2:骭r¦äÌÌQk§°1[̃¯–q±€ÖW2rÖ5®º#dÝ-b¼[½Z‚3(ÐÀ˜©´#o’UÊ)w9uír‘¯Õ»`-u[C-óÊ41üaÚK TX/NsÞÜz_Ëð×`LåÞs]rã\AÖ‚ËTIa*þäâ{­”‘SÀ ¹äQ} «˜þX¨¹QœjÒBr‡~µM˜ J5ê1©¾zì®Ïvà¶Ð&Ž!ãžûK¼ÿ®±š,ñ<ê+cñÊ'®Äò³Cþ¢óšÇ;ÅÒ'zù‚×ã.õéÛóåý÷Ó'_Šø‚‡½ùïü“é«o‘³/¾: :ÇQøõ_}«„5‰¼?ž ..V¡_I&’SY W— È@™¼Íl~‹ààüS; O!¶Ñ ðÇ:Ò€"ä+ôWÂJ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf°Ö@:§ÔªÕ—\³(÷ ‹•´H™ñ«×ì& °}åyûŽÏwäóú[û§'8HÈqgg UÈØ8x¨•e·èx‰i”¨ˆ(™–* 39± eæ9ÊÚZq*™K—héz‹›:³Rç› l2Yª°*œ¬üʻ쮸NŽ.z.’´žþ^ElÌ_âîþ oßÿ‹“¿wÌ­H0!cóÞS‘T$SûR4ü1#¾/ÿ\æ™ HO£Èl°¶‰ÌEDfЬL ó„—/á8ÜC'¦NSÈhí éÔÁDUQsÈfŸŠ:u0 (@VÍù4«Ír'§bôz¬d%¨YbõPG YA[Ô>kë«”§v|ÈþìQS+9¹GYVý;\‰7~~ÁE3«l]™ídÉ[ZÃ7Ãî²8`âÊÔr†ê6.Ó»>c)º’سXô:UŠðçž!Ò†kÚçL»XËqÜç³åɸ!÷¥º‹pÍÀ'ú¦L¹0cÒ[9åÈQwÒµdoÿ†¾´%òÞF{nŒœ¸Û¤—u‘ß¾sðø¨Š‹6®¼}õûº©Ûÿú”—,´M$Í eQàU<%×”7·uú‰Wàrræ•bô}ãS’YØtw™7ßsW("ƒ¡U´a9ø½7bsÕÔÑ‹6ñÝi\¡èZ:\§\TIw‘긢c22w§=7]’ºè\y䆨…ü±H¥\5rÈb†ÈÚ€¯t˜Ÿ}.FiY›Rfib]’e~çeÉ&–U6ùÝœèµeä¨äiãž1¦HæNŽÉ¨!ÜÙv`‰¶ød‰Vòé‚t$›pZ _œˆJ^ ó‘ º¨æ Š¢ùži‚¦*ª´fº`Pëièi}µ&'ªžé1gª–p¡*¥¥ÿIÉë«(6K!^ùŒVä‹®iÔ¤xî൱Ñ’ÀJ[èˆuZ‘·$Lv&¥Åš{ƒTJ®šm£ön«^(k¤¸¶ª „±ú¥¡}á9y[h›R{d©rFÊéÁEö¹« GhÝÃvfV«¬†ÉÕ½zÍ*•™ˆ{å Zi~+Lð“07­¤æ¡ÖpÅÂÌž>—Ël´AâèåÇ´˜l²€"EWŽ‘ È8¯Ë±ºŒhl5!ÞYÜæÂ²é'5 €‚+ Öa¯±5ºd>­ÚÔG/ 7„Fv/¶¨·=s勘`Çõ‹wÞ{õmw8g-xd«xÖ‡‰?õÉ_N°¦¬ÃAŽÒJ*Ÿô { b>l8讜39¥›ÎJÖŽ×v9ëc¾þìO…½ºí:]ܹ«ºÃ-ÔçÿΨŸîåN|èkù|ó ] òÎë}BêÓÛøÓ×ç-ýövï}V•[~ø¸”T½Ëæ‹I{äâ®â¾÷-?üÖOùûT•o뱫2è §âK-’F@¦ý pßI`ñèÒú90# ÙÂ%8A ^ƒdšjØÁ{5ÐX!LáJø»ÿ p…0(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjYK UQ nÇärTì˜RÑæ¶û]þ²©^¸ýŽ'©â9Ÿ(8ØðÅ`èw–HØèøÈƸfø×õx‰G9Ãø#™ Ú³IA fêõ)ºÊ‚º!'éÙJ[û ªòúg€k뛉x»¢ËKü{ìhÌ›¢«Œü $|á¼}¶›ÍÝR]ªè=n>JŽÞÔœ›fnOæ±oß6¯Ä“ï¯× ' ÿd7¡Þ‰^.<”0œ6j+Æ`¸ÍBA‹ÿwô’3cÇ‘JDJÔ$É•!˜ì·QË™¥Ö!Ú‹ZL4{œ&íe;}:œƒQq'¾3 µÐÍIRû "²hÔ­Å*bZç–1•8 bµ¦õŽ•µO‘±•öiVX¯%Éf<é#-×ZHAF+´mW:kðdéí¡±»)ntñÜ}‘é%F Ylã«‚e¾Âʹ²KÌp?[nÂ’ã±òåÈNëQ>ᙣ°¸˜Tš*NÔ«¨£lª«iÜŽV-@×Öy¥´÷éP…,‰mÔ®£\õX®¼cŠ'+ª”è~ÜŽ—¤µ•"<s㚚隘½éÎnÓkío‰‡®~ûÖok‡å«oC8Åb§erA p³óÒjàÅ[LZÚº7l²©ŒÇôñzž–gÜ–Æ8F,²§;Òùì» –ìžH ŒmZŒMò HgˆÏú'f\ ­|ÖÞâ#¨Â¬xÝ›¯fÛ»ÝAMwÒ ÃÕ$puï­Ó¤Sµ3Ygó=c‡m]Ⱦ/‚Mëé«¡Œ3®Ô–¦Â >yÔO ¹sæžëô¨u×¹Òùç&ÔbJ‘›.Û·Ù²ÞèÒä‹9ìäØU¶Ôn{: 9Ý{ÝEæ¼ç1É®{îÅÓ´“’ª/ß“¦NéÅ;ô|åV½õÂs¡=áÙgß=ªz5(¥4˼úÁµ¬EÃÜ´Ih‰ÜŸÜÞ¢Rk‡šHEs¤ÎMÛbêWpáíí“Dî°aaj‘ò·ž35H•MFüÐÏߘ#—âDù.Ù[6ƒ¬<ú›ç?¯…^|š´:ÉÿÂj5!xpÄÖW%—ÎÝÔí-ÓxKÆy™tlÍt3w¶«¹a½ÔךKb®<³]Ö¨×>œtjMèëc¶žJøêg¸¾oÿý:ãøËŸm>xäÕé«ÿÅžÜjHa§_Káù–jaÄ‚\`4PSÞZ{œY¸9+gà…*¢ufçWOZ ÷xª‰hÔ{Ÿù køE’ qº¨â‹ó¨c„³ôô£ˆªt¡ Zº)GlÅq'[:S-Xa‹÷UãŽ2æ†"‡ÞÙ‹·ÅH¥†É)sOþ}Y¢QÝÁ„’nFI]V;™µÝx£%¦$Žx8 „4ÝU—îmé%;|Ny¡‰Ú9a~wê5Y¡ÿé™'"¾‰)Q\jÊ¢3JЦ ÅÙŸétt]P¬ÇØóò‹®¬rþ™cüw®þŽ{]ž o_Æ Â~M￲-)^ÿ æ¡×/‘Á… ½U×0b†„í.P,¥J¢F}ÿÝýÁøm£H€Ilíëi¤Êrò4¡¬÷°ÚÊ™°XíÈG3§.w-§¼Ô 4¿*&kåøt#"/¥™4ê k§¦U*é´¢Ô­–“ÔT¡Ã±$c¦²‚ÚŒiá¬õ6 UJ0ÑlW[®ËªÊ±6BQ¡FëŠõ(—¨Ó¯JVÙÄÈ­ñÙŒXÏý},ÐðbÇŠ!á|‹™¬O_¤èLšK‹\Ë>qgìå Ž5ت‚-KÖÜ4e_µ‰Aþ8Øånß…u»6ôwïàx‡cÕ 74îÃYUYMM½³öçPùw¾=çÌŒ§+nžî÷ÉÇ›|ö¼úæéC¿ƒÞ2¹RMoÓÿíî߯ÉEß ;eæš0ï)¸_9àTÙ& &(L`juXh¨5 GðVyÀq†^yCµöblUÄÜfî™WK>ý3#Œ²áWk°í¨ŽñyÇLŒ/®¡œ~-zBF |GŸ‰:ÉÛXÒ! ¥‹DþçA‡<~ÉÇ–r$YŠáQÙžˆ/šˆßN€±wYub6Yßdk–鿇BrÙ]vÃ]ù¤‘+*ø’Ž`ª‡vÆùT–X zçynþµâ†}ŽV"‹IÚ™à)Ö=–‰›Ô(%§š^ÔÅ ‰5ú\”#FZX§”ÂYå¥DfºÜ¦f®©'¨Šú©¯îJ Z^êò+ŠqÿL´ ƒBʧ~ÑŽ·Žœ¢ê)LÂò°ç¤ª1ÊÓ€Í,ùj«µšË-ç’舾«â˜Óv†Tª¦&'í“øÅy¦æÙ¯¥¬Ž†$À³‡¹¼.z¸Ö>]ÃÛ!¬W­{âÂŽlÔy¦Þ:k¾ÊíKÚ  ŸÉ`¿Ä‰6§ˆŸü)¦S2œ\¶ñ 43`ß«°'Lɲ1ÇÁ0uh`õ€ÒZÝ&ƒrÆŒôäœ^áÖ.v0ãàtÖËH,õ"T3™ôYüæ5äÐF#ê#X‹†DBE¯NÛ£ôªtï]¡kiîÌwàâ­ÆÊ*Ì-¸2Ðþj+Ä'žSÞò®+!…¸sŒÜ…Q{9æèìxç`R„¶è¦'ê˨Ÿþn³TÖ™⬫Sú!”Ï›ë¶kŽûŽÔûè*ʼF…ò^<äÇ¿îlò35Ý8óÎK™!M¯¾¡‰}ç2qA|÷ð†-þ;sƒ~ù¡d\}¸é«¿þÍ&ûD>üð\¼5磾oÿ+’«K?þõï~Û VýH“cuA€ŒM×À½Å ŒàB&2 z¯v\;<Ó€p„;(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ†^™ñ8 ËÕírû`ǯçü¾Ÿãæ¶ ¨Gøwˆ˜ˆ§‘Ö¨)é±WWó8©¹©“™9X×àôÉYjšcF)jóHv ‹²ôiG(dŠ%ËÛ»‘ú¼ê ìk|¬;KZŒÜÌKê’뚭Ѹ#‡å; S ´+©‹‰óÂL=Œæü™…1 Dáìl•*¶šE›2zó.éÑ Ijtе-1BµLÆ2«X@—\îBê)eÕ÷0Q=Ûì†Ü·Îæb i‹k^Q_wôëM)TªxÓ²ÄÅóÃÃ6yÞ¢KÌ-ßVÙÚî²Ë8r¨Çpµæ|ïí܇75h«W+S×*f Ø ½ƒYKµ…qçwa'—L)™5eU»SSÆL8O1ÒwŠÿ¬òdäw1E×:ôŽ0É#ˤýka±tÞ…ÿ. ½2z×6ïúrïôÏÑ·¯î¾yÅ싘ÉÿÝ –u|½B‚%¡]³‚ ^…ƒâ<qjFÎM:W•Je½‡K%€3^vÀ57"}l`¸Y:_ÙõÒy™H¢}Ó…æ5¢HF ´^l>ª œjkÁÖÚqË#v0º¸_Ç•F“"jšŒ¡˜Ø‰ý©…£€õåG^T¯Áöc™Yê‡Ô˜÷…‰¦Yl²HåzO*ÈU{;j)!žò½('œJž(àm¾'—/•¸æ|D’if£Pz"\œ5y¢JªŽ¡{j:)••Î×gˆÓj$X%5y—–úyè©=QǦ«3ª÷ç¥sVX§|‚Ê*\•|ÚÊjœ1æhª¨ohxãªÆÿ÷MËH 1wåN¶´+…Ö·JE*d«=+ަªd Š“—i—ù-g.*¢…KI³(9Šï€.ÝÂh!‰R«m’ªF’[ð»íW "Ç/–½Þ70´¼fsnŹޯi^ôŽÁh‘ùÆ4)§`Ú&qx¨Íz±››–êÅÌNËÞžšç°»È1³BÌ‘w½e\êÆâ·¥VýÆ:rFžÙŸ~]œòƒdá§.$/‡Ã'S=œ¹GH)=g­ÈÖÓx ð×t}\o…7íãuâÅ´ÛáÑ]¦ÝH¦– žò=V¼þ:wãà„Çv›Å@.Îx-ÏF yå*¾/…ó„YrmùB‰ŸÕ]yhwþÑèÑrNzN¨»·zêM/l•…®ó½°éh¶>;?>…œyî€á.·ïfÂ>‹ðî~ðÆŸ³RÕV/¯:ºE ½£Kó^ýOÄ3Œcöù6ŸTïy‘í‚ç¦<ù±¤Ÿ)ûêŸb>Øú¾Tëþ±K?N&× üù¿~¤Zý+SC·H;x©„l¤[ãâ×@“HEoŒà÷\, vÎÒ ðÜçÁúA0„Ç« Oˆƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇQ@Óòçú·uÝ ‡Ä¢ËÆøŒÌ¦ó9D.~€%ôŠÍjYÖj7¡ÜŠÇä«TÑ=#¨å¶û]<«§_°ŽÏë?õê¬À¶7HXØöð5fèøˆ·(ˆF险)d ÑY™Ô¸9Jº‡9è XÊÚzò‰†!Iëj{K![²¤‹û;X;!l ¨º«ê ¼LÚ©|ÈKÌ<%ˆ˜cM½Íô<œ¢Í-^&ý>³v>¾^œúÍ÷ÊNOX¾VŸ¯=™Í¸6ê„S§à±ƒ ¡xëWL!>y +ò’E1ÆC‰ÿ;ÒÆ‘ƒ”{Kòñ&ñ!:“,oôºv!ä™-k 7NF›<³){é®Xb4{7S¥<¥E:M—.Í*Œ3ŸZ!G‘(|?›^ýª!kB w"žJµ¬X6¬¸åöÖ\jq{«•ÑY;9ÿ…õáì-5„ EúñO{¡z‚º(.LgvQÍU\÷0âÄÿ"k^HYíD’™}ÕÊz™kŸ9¨õ¦NeNéÐÀ‚é­3öu®¶;; „2èáÓduzÖ Š·Ü·‘Ù:³ƒzèãÄ—¿s&?ØÄG®®+U4䉀‹ûM$ܺ'ó¸Å__ý}ePÚ^9øçÄ™ý´ÿÕßvBwÙwÐÁÝå%ˆŒb½qæ }“<‡V…mÖ`€®tá~èýány™ÕØI‚¶¡dîägYu¦¹‡âc÷ÉÈâ..®xÜá‡#yfùx ƒµ IÄY¬…x’%ÿièØ{“õh#fê(W*òS£t˜ý%$Œ Á%ØÞ’I‰& dyæˆ Ò×Þ;7·d9óÉ'Zv:ex¥}.egjÌÝéezŠå–êA$•L²¥ )AŒ©¨§˜-*:YeÊq]koÎCtº› Z)¨‹8gŸ1"(•…Žz)RÆwSžº $¨cŠšé¢˜îš'€O¢Âª¢®ÿbéÝ£•ÇTSR˜VÎF”ëyLòpš€`Vð[“¯ê`f©/zz̵Ñt™”ØË­‡è–‰¨,´EÊ^½¾Û¼fˆ!žåâÚ½Ô)ð¿Ÿî©e†•{Ê;ªëW˜ÂJô«.¾&­©1YK«’o›p±ê¹:0¸¤ Ûî¾pÞçðŒƒÇ%ÄãvI‰¦Bë|¤‚ÿu{bX÷Š,N³7«s‡kU8ô6C‡lHÎêè–VÔ‚ÆXgñ·¶h]¸Ø¬#Ëì2}a|ÅÊ%ÜpÙ(z±Õ´Ýq¯××»Úö“ßDN5£n©ª}°áµu¥™±à:Ny,±À­iYåšc%aÀ›þtãÞšó`æ ç›µÊxzë öëzìÞÊN»Ô׎»íäýaîh²UzÝKû^éðÌFüï2–¼UÌ#öuµÍ;¸•ÓØð×¼PáÛkš÷&hÿý#À Þûºå3ôâño9ùëõLÔó‹œöG¼ßßSýÎíÏ¿}ü/h%  ò‚78ÕÈÏ€)à%ÈÀÃ1KeŒ Kf± ‚ƒÔàݺf(Rq"¬]XÂ. !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íò›Ñœë÷üïl—à&¸Ögxˆ¨¢(t5xð˜(99ŨIdIéùI“9ÑÙ¸ F šªZ‚ê‘yʘ·:KY×ÀY»»Ûá‹ÅF!êÌ{¼Ú)*(\±ŒeŒ,Ûl-Q9Ímø<ªíìüÝ]®¬nήê«| Ô>O_¿¡^¯¯GŽÒ*ÖoŸ@5Ã0äÃ60¡™wBº§0â–€þ8´'1ãÄ/ÿ ÿiüØâ"Ç ð‚4`Žº¢[ºíFdJ¸„(zÅ@h~)Š·b é_†?Θ”e×PŒw\y>R7ÌT.v$Y‘jbHÞˆ$ù&c“Abù$ŽÛ•™Þ|p²)§IðUäå”f¢c&|KjueŸ¨…™%ŽNŠ™(>i®I醭'.¢Øbsw®ch{FšÚ–J¹Ü xÆ]žQ¶'[uüÑ é‹­ñ_ŠQrÙÞ§†úÖ¨–ŠÝ©žÒ*™‡ÿÖçg²öô8+§ºVJ¸ÂX•Óu™íOïi%jZ •ˆ2à¤ãœ©¥5º«îªo¢º,»6Æk![Ñš‹n¥þžŠ ¸“ñ{Û¹|’Kf«pΧ\½¿ª*ªÀÙÌvŒ2̨óbìŸÄ¤’jqÇãð£Õ&xáaøþ[Ï«õ56XÆ—F—g¸†¬ñs4k ±´97›rÄ"ßLòÎsél/ŠÆ)²d½z>ÂØ‹£’ÛÊ,w¬Ë†W0ÐÖ’T´½½ˆLð!MË,ŽmcÙµu½ÅvÙf“mõD!Ϧ¨°=ÄõÕ~<'ÚSœv y­`]Oxxã¬!è ýî8âÅÑ…ÊdˆVžØÞ¬vóMœå¦zAŽúƒŒCù¸©[ÅoI¬¼Nú_4þqî´ûÝ¡»ÿ~4îÀo»×Ä0ã#!ÿ7pƒë.9ó•bKܰÒÃnýäãyýn¡COW÷jR/ºøµ¯¼ù‡§¶ú´ËÞúyî³ä¼ëhy<D¾'¯¡˜uço6q¯]¬R¤#·:倎I [¦(áHå©{ÍÚ†* bC›×4È}Ѐ±ðÙ+Xž žsPY!ðJçBâ5á1¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ›KªôŠÍjAJHWnÇä2ô[ƒÕæ¶ûíD«Ø&ŽÏë1ì;  ·GXhx1øôàwøy¤(áXçgW©¹9“Ù¸6É9Júé5á9áÈXêúšñ•j1+È ›[Êû&j©+L Ì#Æ´<¼ YËKQ»èpÍl5[);Ý }ý .ø×ˆn~NY}RŒÞþȾ ¾êN¿Û TŸ,ϯðÊ6BD ˆ0г :ŒSμòZü·£âÅÿ5ÒâV‡£H…ž“üXEè9kŠõ6Öòh{sìÃ5·æÃ¡t36¬2Þ1ÙUfKë\²0]¸µžÎL4òU6—KíŒZõ8x‘¯½ËÛXcÒªn&7þ˜NdÍF¡V¼[»yÇÒÕ§ìþºýÍÁMÓÿï¿VèÉG;D¡tY‚ò— F4TÞ‚Ù1˜R…÷¸Û6‚ x.¿EGJçÕ·Ø€ÇñÒÓz ÎbqÓñGb9Ü%6£‰®-¶a\zùe[8éßj´5f zÙ˜š‹ûXQ{"96¾'Úˆ¨!”þµHÙ’O†Gå'µùHæG¾µ"¦‡ ‰¥pHòvã¿dÆ¡hY¢Õ&^!:)g•ú‡–oZ†Ù •¥¥¤&cYf£ü†{^¸§rЄi]ZvYbIòÅ祣1‡é~’ÝA¨v†æ©*ŠšF‰§Nzj¥×‰:'fšêæ‹R2yèž~Þ˜Ô¦½ªV㪟ÿ¶ºˆk>ˆ¦cCŒéƒâÅ’ Y ªÔ‚‹¦÷ŸÄ⊢¶ä| „MÐN sBêÀjR϶+¦£ö>[‡Â–fµ²¨gùZMœùíjg|"þ™k¦F¾ylišðŠ®2|$©ï;ÈrF΋-÷"ô]±Ñ¢/DùïÁ¥J|ḴTeļ2JçÄÇÔÄ…æüYÅò¶ã¢.é ø<·˜¥ ï r‚f~x1‰×,-lx3n›š*Â-¥Ö”'„ª”“wûùæ}«¹èN£ë¯éª¿äùê®SEÞS¾®·¿ZK{îøÂ®ûÜ¢â]zïJm%«ðÆïþ%>ÇÆrä-Ï<ñLCVó9Oý5Öm·WÝg?„† ¾>M‹üZù|ˆêNÂÛ¾Ïy쩤:Òôo„y¾ ³†½ý 7åÙãبIH YýC Lw@öè¸ÛN%ȹÁ]ƒLC9øn„á! —‚‰ª°!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍj_¶ibÜŠÇd¨WVTËì¶»ÝM×ïºý>’3Έ%þè çñÃ'ˆ˜ÈF83xp”ĨHY‰2i B×Ç„i z’ö™Ñ¡é'ºÊêèŠÚG’*ÙZ[«ÙSš¹kë{÷I 3Ź×û‹ 7qlUûš-­ôõÀL!w=½M‰û<ªÍ-.ÈŒ>®œÞ쳈ëm,ow~ÙÛŽïŸÕZ¹±Ð£°ª„rÁæ0b¨tÇ„5úÀP¢Æÿ=Z¶1äbT.u‚(2%—ƒ%1¢³¦2¦oždÚEË1=„:æ²Àò¦P„“Hvâ Ê¡Lf3ŒNO“›Z]FÊ‹*5FÅùv5ìÊ£\Fš·+¡Ow¹‚¸åö¶ÙÚ|™êÅšµ¬NkS“š+ö×™*_?¢å«FobŒ’Òž<1¦Æ-Ë’[ ­…:f[ræ‹q;·Dì´áÏŠÏz•waˆ»UòtË©ëO4—KxbðYÚÞÁE«.~¹ô÷x†u<µñá˜1S^Üü´ÝÏHyÝž#·ÅÙ×aj®J}²iô²s*‡\jÞóÍ£‘WnŸùmy°çÇÿ:Q­-·YàL†Íx²q¤TvØ]ÐÏ@ýi·YE^T† fèx©yÝ_æQÇ^…!¶ÕWzÞ 5ÂA§Þr%J6HŽX Ž'îÇÞS±yG[mB Q“Ž}E|/šãtíµ““ƒõU7b2懟)SÖó :6™"t­éV™Cžé’‡guDRŒcnYÜ“m%H –œQ¨&-ú§"•Yöhšq\šµŒYîéJ6(’‡f£9øIŸ‹¥'g”r–h_’…I߉Ò%G§¢^fŠgœ%}y(œ.*J™™ ij¥“LVJ“é÷#õÈZ¥­~Îúâ~‚ÆêªÀ"ºjŽ~ÿle ‹Dù¡/I¥…Ìm¨‹–ƒv¨KÈÆÀã¥ÅæJ ´&XŠÕޤnš­§ÑvåCæ:Ц…¸‰|&NZèÊ®¯ÿ®+­•ü¶z«=ÕÊàÀ‹F[j—«-ª•ÂWþºĆÉ2/½¶ X1€¸‘‡¤‚bú0/Õ!pÃXª ‰Ï!¼$®¦Nû‚1‹©,Å ºÛw×]#1Œz\¹[Bå×¹†¶ìKÉG-uÇxr–UQAña5„ýöFÕ`Ã!v·yªŒÓZït²»H )•0 ƒh°É<¿íè`L‡h&¬Mã}¦t+©/à†£©«në*æØ‡¯C“‘Ž/þ¸Md»B;¹¨•3Õ·‹ûú¶ySVë£jš¡ ¥–y§¯¾êö°:éwÃN{ƒ¶|{íõ­—ì]ë>$?„OüëÅ_ðäÈŸ^1¶y,7‡‚½XvÿŽÆÕ[?’ôÛ‡u¡éS?Tøy(O~%`kcYú!ɾÔLî¿o̼Í/’ïnZË×ïø#CFd-cÿ‹ƒNE¹‚wdñŸ-ç¼£ ï)72 ƒµ+a§¸vpƒ",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰6Aʶî ÇòŒöJçúÎ÷¾xÃý†Ä¢ñ販7¤ó ›*ªôŠÍjAÖ*#(ÜŠÇd¨rqf†ݲû w¦½ßvüŽÏ‡ÖµÃ<¤'8(È÷ñè`HØè¨Å¸ô`ç§ùˆ™Ùry99Aéª9JÊÕÙ™±†˜¸(Zú Û×Z™ãª‹›Ë´(+Šáj°ªK¬û+Ü;ò;\ÜLÊ,í<Ýx¼qjÝ—MÍÝÆû™ì=þȼ-$M¶MÞ.†í›zÌî^—m½®nϯ™–Þ/ @4ôì§/ÞÁ…ä î’„Œ¡ÄÙ8ütJ\‹ÿ;b´¢ ŽK^[¦Qä ’&[Ê#¨ÜH–.]J«¨PÊ4kÚdI)£²>‹úJ-„žF›R…nÎ:¦ÒrеBR¥KÙ…ŒÀ4«Ç9mʆ’ÊiZOWy*Á×[܇añÌEë¡,Ÿ¨Á¶ÂËÔªX„PY5¯k ¥ëð²‰8Iê¬UsÒÈ YÇ:²Í¬æ›g°˜‘%¼q´6lqýi,8‘¡°±›ÜkX˜-Ö‹QÒ)­4eÈ“%_ÞEY3§Î¾…Ï&îå®iÎDS«¤.)R0¹¯ ®«[ó,ZËŒS®ú¼qéÉ_‡þ~jôå·Æ.ߢÌé¤ÓÏÿ·ã—rùq :_¹‡ZNãÅ—Šø,(šeÆÔ_[KX_²uf ô%\dþ…Úc#²rÚT•íwÜgʼnVŸsû¤J‰.F÷Üh¯eV›m>N±™~ÕtËoÖ…8Ù‹&ÆèÐ[ гbvJ2‡ÚEQReb%4Ú‡"‡’öøc™ vÇÕQè@H"yUV‰>Ô±×X„q(&ƒL¶ø¦,qÖ™åPÚNŒyªwÜåž™Ž:hʺêfppv‰!Y¥(Ž0ö·ç•IúÙ% xFß–'Îw¨”«•ÚæIk—£¡´bú‘¦—qzªzŸ~*—úÕ&¡è‰¸–ª¶ÿŠêª–hQ‘fdâÑãigQm>¦"øƒ•”J Ìr«Æð–Wø½+/d*c^¦S~;l£gšË–†ûh¾×†wäFëfØ©½¤¤tþ•K$®tö° n"¬ëÂÃVµÞ¦sŠËÖcÏi1¼Ìvèo¯‹îñ¯¾%íUØa]É;ò¸“.É_ÁÀÍv®e ׫Ã#\é}0yk¼•Þkç«ü§E)Ÿ·CÉ&ôkaÂ*"ÃJÉ37I;­ÇÑ\wÍ7•7µ‡1ËûÆÖh—á5PK§«c´Ò>M7·Još[uÓm¿cz7°{‹Õò†£*(¸Žƒ?Zä—†8Ñ‹g5öÛBÂOŽù r'~Hæ„+GÏÚžÿø5ƒ%8zK%c|Ó5©{þàà¾nê`#N{îYš£{ïCù< ¶ãÞpð°GE¡ÝÆùòΛ^¡Ë =_·èŽS¯ï¾>]¡ÛÀÍ>ïúõMŸ¿G»¯ï¯|ÆÚ»‰ X0ᨃØ*|øŒƒ/‡µàA¼L8ÿÐ6büè­ß¹_srx‰Ò µ2›A h¨dÊ™_œ˜&Í™+e’¤ GçΡ>Ðñ9iÑœK¢LMg) ŸšüšZ…ƒ«R0E}ªZZñªØ^¸˜AhÖåF¯²–¸ÕöV¦Ð@qYÍ%›U2V*/Üòwl²7„å%-»Ê죿È,zA·/:»R}•k²Í¬]WÖÜÙòËÌ©îm>$ZoZŸtrŒjê˜ ¶‚1z])5ê^AGôŒgX±nÔ¡…»&Ýõ˜QSÃÑx&ùy)ÇÄ.öêÉTn?Ý < oÓ]‚_½9g¾˜K&?}Öv²ÅÏ“voÝ9üʪ§ªÿ Va±ýtŠx„†U‚ñ]5„ Nè_?ÒI¸`¹m8ÉY´)x__òÙÜW†gÔI‘¸bƒÿåÇœqôANo5^à‰š˜TcµýHÆH£UÓÍ{#n†Þgç9”‹ˆúYK’:"éà…à1×ßRê7_„&ñ%b¥a‡a–õ"˜1’(e ÁHnוùdˆ¿ ØV½áÇcŸ`åU'ŸZ’Øb”ÎhcÉhHDZÙ¡Ÿv–ˆg“K®)h¤s–'ižw^Z(}\~%g œ.Öé”’Mj¨v¤Ê#xª**’n:ÕgœBšªf}ƒÚê)•kæ¨)¯¢z£zÄÿ±ú©« y=|(­3Q0)Юîð –t¦êªÊj£ž)jÛà™!Xz`š¥Rºè¡ÚÄRb€:o£Lywïn‹R"Ü”nŽDnĶ{fïnª¦Žˆš§0dì…ÛÞ[W» ³cº1­¸^i¦º€å«ï?üÞ›-ÉSxdÇ‘,1¸Â|ª±ërÅÕõZ¥Î¦í–Ưr<´'/ew*“\ò:õv”H²§(y0@C‹ŒÇÃ2“r³€ÈÂqt —;ØÕL¡5Ö¢µ¦­ád»cÓ ¨o"¾s¶Ü Ñ­ N²e€®Þ?®V«‹ßž·àóÀ†˜“€[«xmE2œŽ£îÂD.ØÄå…Í0æžø·_'Tþù¾gCXºç‰nsê@Ý0Æ»Þ4éŸN;æ«çλej÷<»ïºíI|îcùæñÉïðÏóäÃôzKo}éáž}æþ öÝ[Ííïãûád‚-þùÂ,÷=§£™ï>>4²î-§_+m-±jÏêŽé‡^¿Žö¹:H‡ Â{ì: óO¤3 =D|ˆŠ|ÿ\ˆeü8ÂÔ! -f¨2¥!OÎã‚R¥Ì^«ÌL23ç‘’*¸ñ¥ODÁñu¬T/¡“n}ª‡K{ÜQ'šþ‰j6 räj¥j•igªV¦ZcžRšzÙx¾~¹—­ÿò×b¬Æöªª¶Fz ¥žWqª¹D„¶Þ@报¹yù(šJk­v˜k‡2r®cg†ûão欫Cº3R ¤Ä‹én†› ¥j,µØq7g»œÎç®ÃàK­¨;ùj² ^ÇÓÞI'€®êÚÀˆ½)®µ“õ&˜¶œ#.ps)òžÿ5ì-Äõú{%~ ã§ÆìÜ,±Ÿù5ö³Å…й´‚­ýŠPœ1¯¼Á)ÞFQeS+¶´Ã¸Üêµ,Io=$¢fyâÌÈšT3Ùc€ 0]pìtšàFäËUTï}\ÙøÂ‰°SqóQ&èEUîN„ür‰d†¸xä;V”6 ƒÉKn6*[\œ™˜G˜‡›ýùL÷V%–k—^¸6V 9ë„ë–Õ nËŽ{>Ãí»¿ÃyÏ!ýNuåG§N|›¸òÙNò˜_¾’ó «+ýôQ«^ýïÿ š=îâøÞ½ìà‡¿Õò‰;8>ùÓø’è¿e«?˜èž ù¤ÿ‹¶€õÇß”ˆDîÏ&ƒÀ&vKI £ªPJeÔ >8c®Ñ5Ðtô"ô&¨Jä‚Ì`¿4ØAÉuå`!ÜÉ$XÂÅ‘0…ák _èƒ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·\ö¡¬Z»ä²YvPã³û §}ÁsÄ*;Öãü¾_µ·W³öwˆØXEAhǤ–(9é´˜¶È†i`øÈIù gÙ ØzŠ ¥iW#¸é˜*;ûÓ´z«§tKÛëÛby{§÷[lÌŠËÛ¨|µt—{}j „]È,­-š}¢|½®hÝ-n~®2QŽÎÞ¾Yλî>O)ߨFM¯¿Ÿ‰œÎ/à™Q÷.`²'0!p¸:,v-Ÿ¿AäZ$Î?ÿ]ü¤£³†:D‚üȰ™Á &Oº 1 ßÊð^ÚD±Kb’€6Þü©îà+žBĴʈ„,ö‡ýú¥4\»Ö;×Íá,]ödÏŒ¶¢„A"ã·´±lµCе"˜ƒqõM¸qÄÒ\ Å_ò]8:]9x¦§EV'Ð ÓäºÅùÄrj¾Û™0Žï}¤ƒ^—T{[c6§£Þ‹¥sý±Ù°Ÿ¤íë·ß®;¸»_÷ïÂ<ÅðI2KaðÊõn<;[gN{ó^1¯·ôn*o½ôÔgßòì¹zÎýäoI~ãä¯^~ùÈC}ú/mOö>–µ7*ÿüÎÛn|ðëï ¡TÏn¥øÁ¾þYö È@ÍAækÏ0`c—'àäï‚KéÖbA:/2x¡ð V9JÐ]@Sá 7èÂã,†4ôA!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä" Øø!̦óÙ«%ЪõŠIÈ%BêÍŠÇä"BslËì¶V§ÑS@üÏë“Û\´(¸Whxò·à§ˆèø)·¡YiiIøuvÉÙyt’Y‘êizÚWJ±Ô(9ÕŠ+»ø š`{À kàg7û L‚K ¸Œœl7q|{ˬ,M­£è<]V[Û­ ŽíÁÌ~Þfn1þ…îÙå¢þ^_ÅnŸ¯ï›;L¿hß¾VÊÉ›ñ Â,^TýSÓn¡ÄD›ù{61£™yÿ«ú`¨¨1ä¸]¥jˆ2¤Êƒ€\™ìèq¥Ì ØZ9Lïå̶FÆKÈ!åΡhDõ»yÂ+¢LSAëÇ‹K/WO›ZBIª3›‰€^ýJëhÕˆËNª©ƒP~Á¡]«Ç­/ÃpåubtÁf» ï29%qý«é£°†óÜ’­E~r M K®<Ë™Ñ"¤uëd¨wÓ‘<(sÃvû®CìW\ÏÃFñšLõXЗ9ÇÑ,‰ÔÛпgëýfØ3@ÈóvKê÷h.ÏØÜy®]»¤‹ÁNmùdߌÇO­Ìûø©Û~mâò¦Q"µÝ}½Î õúÍñm·ý<ðµ„Ë{Ø„‹?a¶;ö ù):¯õýå•›BÓ0:¾ù—?imè‡þ«¦¯ÞÂ謿Þì²ã4»è‘ƒ];X®Ÿ†{î±iî;Ús|ñ&U¼— ‚þpòL¡þ¹äzîüD°|õà {û‰ÔkÿK£ôD7ø+!…÷^7šRò®7ûÏsˆý+ÙË/Žž¾¾R.þ9£„ûù5¹‘¾÷iå€Ô¢± o[’ áÒgAÙu+ƒ”A!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Äb ÈøÙŒÌ¦óü%•ЪõŠõÑ"Û5 ‹¶®×°œšÇì¶;–† “€u¢ë÷|QÞkwðÕGXhØ(8xØèøøð§07)y‰yI‰ $™ù ʢȱ è`šªZaæ):Ú¹*;{”QÊYçJ»Ë;¹9ñçªÛ[lÌJ’H|̼º,ù\çÛ\M(MmÍ}ˆŒöýÝMîÖš3^®.–¾îþŽ~ 3 Õ>=“Œïo¤o"}ÿd7OÛÁ…& rç‡É7³wLJÿ;b”H޼„AÊ鈅"]=´™2¦…/ï¤á(3狚іàô¡3è ž €d)4é‰5s¶5²èP“J«Vâ¤ÌiÑ‹’~Fµ ö×¢ºå­šÝ©žyZ¨¿¾ŽèjÑŽ{Ú¹ïÎ{ï³GØûÒØžxðp_…Š5„TbI¯±J™5lê–ÚÔk3 è‹%®’q'Ím¸æô½F—ä×¥ïŠ5 hJªf…i¼†R°S1yèªA¢IãÃ(ÍYv¬´2áÉ–éuÎ<s·¸Ÿ¾æRYÔàÑŸ ¯i´.¦ØTaÉý{Î×k1^{M8gëÞÃ…†¦LiÙ™ó¼œ ¹qÎÁ”Cg~\³µµ8¥oV}½ö`á«‹n»umqב˫¯.ù:ÜÐj½¾~ZvøòKÇÿgsÚsÿy6Ò€÷¦-dÐÕkÌ4ÒƒÏU0DíÙÇV†áW‡bèápç‘w[p:W {ßðgš>¢m·"~)îàŒvÇ]uÞéGŒ ÅÜ*váF¤»åØM Çb{4V6$aî86‚×d/6G¥ö] `~'Jˆ˜zŠDYdšq¶J;0YcñAd`^îeG\˜1²Æbjt¶6_lri¦>B¹Ü2áQ'Œ*n€¦š’úu&£XÆ åœ:Ý‘z:Ù#ŸrV‰è}–îô)EÃHopu—çgxˆø øå5HØÈ˜8I'Ù8ȘwYù zFøjzú´XñÈf7Š+»¥êæ9‹››qÛJÁJª,ÌÂûe ñ;¬\™üÑŒg7ö¼LXŒ¼»Z½­|]ìÍŽ:ÝíÃv-®>ù­Èë¸?—žùRG/Ÿ/„¯ÿ¯‹Ü~ ÆðwœÁ…MVAGB!É%+'C EŠÿWÑ#HOÈŽ$ÿÜ)Bâ±’,UlÄØ¢”-k^ÔéÕŒz)múÔð’Á=_<b ù³$,À‚&}:Ðѽw’œB½ºBÌRŠ\‰Ä 6È ±[kýš6ôè\Hz!5ÔÖ˜Õ™dݪ²¨'-²·_ò¬‹­qûÝt„kΓKt²*ܯñ1Ȇq"~ Shfi˜ ­Œ9¹U3ÆœÂöù+Ù7jZK• ú"ßÊ~ò¾iiçÍs}I­GºêéÅ‘1ÅmûØÓh⨅ï^ü¸èᇅV…DŽrÓ¼åÊöí$3Ç`ÁsOmݸÛéU”_‡ÞܼÑò¡åR÷êΜ«ì›!bÿFžLÔµ¶WŒWSÅ­1ÁrÙ<¸“eFÍðJ¨áÛ‚š5X`œÑo^Ñ—ÞÁ]·‘v®Ÿ&&F'_ƒÏ1¸ßIwž6…4³Õ¤=S±¦•Iµ°˜Ÿs/8z6"hJæヤAÉ^‹%R©¥2c½I&Q¸IÊ‘õ%]!Þ ¸žwXÒ“Šž¸f•QºöaNéÍy߆ôÙ)(vn:Tn Yf£ðÅçzÊç$…ÏI'§Ÿ12×€ªIöfjÈ x›ñçiSHJi(Ž ¦Ê(’2Ù¦z^§ˆšºÈe§xÚž¨ìeúªª§ê8è³ÿÖè*†<•…’¢Ä€ôžZûP{+ˆ ö’s4B é…É$ŠºFèI©:¶)¹Ûq«l¡¼¶¨€ñjèh¾z¨mn?ÊÊÜ¡¥±˜W½I‚škŸ+J¸§ÀQ†–ܺ.Ü,bß^Ì,Ÿ[%¼¤6õ¬ð&•:“®¾ØkˆŠ|¯GKaJêǼL«Ì2ÇpÊq·;Xä…­jLÞ°½>ùaÌøÌV²Éù+òjúj‚¸rÜ4D» ×gFì^V«ƒõØplµo¸YÌvg41a¶Ó5°·K,wÞîèêÚ%*F¬wành*m˜· Žxdhå7gO‰ƒõ Ø÷ãO»é¥¶Œ–o~“JídÈùOi»0uèsWžó8›Îzë®›1úëúTþê²;úÑíA®¼ö¾fê^f2¨Û¼å¼Ÿñ #ϼ—«7ïSµi}ò¶ü;ÞÕ·¤Ü´Ûcå KÊÐõ‹fN¾MÔ³]a…éƒÏ |Û¾2þû³£å^ìö3Ô¼ÂÕ¿¿q ¯pŠO­§9®ù뀸Ûp„§@B®w) &ëî‚ÓwgÁF/",á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡ÄâÊ2~H£ó êšµSŠÍj·œæAùð"ªb®ùŒŠÁ /»]MËçôVyö^Zãõ¾ÿïA•t·Çˆ˜¨’7ö³)©gðÖ8x8¹É9…GáæpÕIZZFX)ˆéh˜j ›óê–:*‹›»ñ*J[Á«+l\²Ì:¬¼,”Ìüœèü5« mí'MQOÿº®N¿µö9 ¿P¼ÂmÁ…§ìÉcñ\Â6gF¼Ø a7„ÿ1zd! •ÁÃ|<Ù¡Ú¯’ñ–Xd‰¥³œ‰ÓB†×ïê—%Oƒ<ƒn:¯Û2ëÉæø¨f¿‰AîåõçßÂk“®ÉUÒ¾>¥ÎØY³ëÈ@,þŠ9ßçb¿ûêe;\µèçÂ{Z¡ˆz³Ðç¼£o\*ÒÙŽøzw~^·pæÔ§{Öm})dæÚѯ/=Ÿnñ¯ø¯«ÿËžžB÷=¶wîE^^æýÓŸ|ñAgU„Ûd䃆¶‘bÀ€"†ŸÁWE]¡`T~Ç_€…݆S}ò5G ŠÐ±à~ìX}58Ù„;>…WW¹ÕF¤Û­uœˆøæâ‘2vG£M…ÐØÝr>>)b”75‰^•In¸ã{&r¶%xH¦$e‘jrábKš§å‰íç— jø‹’¢‘)ç˜øù3Õée Wþ¹ç¡ÿQJ›].¹f¤vÁxM\Nù真Ôi(mz—¢ŽQVÆáppÙè)žNž&*¢~‚é ~šÖ.]Úʨ–Ê© )ö4 ŸÀ’Jg–žù!p¬ÿ* l¢°bǨªçik‚V@ÚXC¤™êƒq;Ζ‘]Ø¥^0k«˜Ã®ƒÛ„è’P\¥­9I-¨=Pú¬½©²rkÖJz’™Ý.ö—Yúùj"¥¨òJì©õZk²6jk*J—ð±KKk’÷hh°ñTÌãˆ/ÌÈ»c´ž(o¿KoÆöuT³qÄuü¨ÄÑZ™ŸÅ%é\²±K-Ê$‹‰ïµ<-üòvBº²mg}–O³$LÒÿVäõ¶áͬ ¿Cš|ôBa3ó±Ê÷t\³kTmìÒ×Uë$’ºwêáÝ~;èÓã&»÷߆Ӊà¼Èšj÷áL•GÞp—êxå…ÇGU²r5nù3ˆuáÇçz§=º`Ûdzêà¸m†®K:´Ø³ßÞsè¸ÓNùî¾›ðµx¿On…­¿ŒÝ:âŠ/][zñõÓC™èå§•ðí¯-’6r¹âMv—3LzÈ ÀøõÎl Œ`‘S7 ЂïHÜ9ÈLÜ„·CàI8 ¢px#\¡ oP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó ú„JGPŠÍj·! i­*‚^®ùŒ–¿ëX%NËçôV[…x/ïìxý¸ÀAxà—§'¸ÈØ8x¡8™çXiyyhȶԇéùi楙IxzŠ 3º9!Šèöš:K"+™ÙZ:YÛë;&ãªyû[l <²6J|ÜŒÉ|h í\Ý»úEÂdÍ]mòÝ-žEÍn5ž®np¹þþgø-úPŸ¶ÊÜž/à–~æ¨ðq%0¡‚7”S1GÃ'&F¼gЇÿ;ÒàÈŽR2mKz v¯P‹xLº¬ˆC È—4¹ðÛ¦cfÍtJjÃ2d+žD§»‡I€E›Ú+#s«Œþ„:½ªj´*@c2mi«Ø•PËB%5V µÈb%'Ô«·¸iwøAd—.°/|޵v·l"½7 ½pÎŒ¯äJP"×ñ a‡åTur]ºCýy=j8QfJ(/à üYYäÁ*÷µuø¯:¼Ñ’êíäÚïã{ŠGŸ~í[3dÎLºB-r™iÑ–ƒãZ 2ð§C–vήø#ì\#ÑÎÞãä=Ø75ï=ܳuãÔ1'n½k³úã8WKßÞžotååï#ÿSŽW|òèf<„ÜnÕYÐЋÖêrΣOí zéT·fz䕲àyê&}R×®Ïîí¡O»í³—3¥î’Ÿ^Ýæ¾s#OOÊ>öÅí€c’…AvÄÀèÄTÜ'WÁùh¤;è¶ât„$4@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇRµŒçúÎ÷!m¸ù†Ä¢ñÈ¢ J ò J‰JFÕ6Íj·Ü‘SQý2Ë®ùŒ¦ŽË ñ8 Ëa쉛l4çü¾ßQGqhsõ‡˜(W–1ˆPó¨8IyÄ"t¸†Uéù‰tÙ±ùÖ zŠÊ#ªñVH–+ë² (*éT;»ËkŠ+tëȸ×[lŒñ5 l‘©yü -ø¡KH}}j ÈÚŒý .ÍNî©í%^®ŽX뜾–¬“ |.ŸŸ6¬ßïŸg' @€ÿ ¢º7Í B-ø \rg*â‰?.4¬p±”DŠÿé€!cÇ‘IV!$‰2)nïRºä²²”®“8D¾¼Yí!›8{î´S›™èù<*¢L² †– ÄïcQ¤Tí8C,çÀqzªz 鎛{°Úxã‰ÉÀhÿ°Í²…X¬C[lØ6îWr+•:Ýf¶¨É¶zr…ŒdËP‚‡;½ÝÖáUÅ WVFe+káFjf–˜Ÿ2†\vnaÂÝöRUe,PÁ¬Ÿ¶‚¸ðh©›Cç~©ÎÙÏÞö½¸÷ÇßÉoÜu›»Ç¸wͶ!ÜX½–ÜÛyòÁŠ{¶8:o“Ç—[wÜØ|ìàÉA«?o<<ýË`×ÿÕ8ßjµ…EÍ]ÄwW-ÍgV=¸U~¼1¡ƒ w{B è^{o”öœrÎØó^t®×ˆãÅ—X\ûM%†*ò—ŸŠ¤lBS®í˜†‘I8Êwص"yz…f(ÖHäŠà]D]ƒ€I5‡å™"+§Á&Ô4Gòf’€5ÖFÆG_/Â`‡J¢7åu¤¡Éæ ¹¡(ž›qnW•2²Xg–1^¹ç„p~©[˜ŠÊ•×2OÒY–£™GW}MÒ£‘Ì=¨Ôy•öÙ"gUŠXžœLšg{ZiU”ºiZ*§Á÷雯by*v›JÚi€µ˜h£žh®ž®)Ú£%ÿb„¨ExˆQÍø£˜=@)e…|v¹A³‚¬É+?¿vå­w¤n7£3ºúàê…—n9YuÙ¹h½«ñ ®ºÞQŠì¦íÊl¬üVki¢š¥‰lqùư| j‚~Ú­ ÿ{ê[⥺Üo¯”k‡öªc~ž5#¤—Wêp°Ï²‰ñˆ¶VÇ߯³Œ®–0/[ì‰xØNùÝl»Ó£¤•+Zv›~Žš{›ý9èÂL^zêg.¹êaâ¡Ä®Ï^ÑÓ´·¹³ÞÎ÷Ôˆó>Òï<Ï#>z Oü?°G›üQ»ÓÌ|ôÍ¿öŠGÓ_/YçØƒ2 öömèè¬~™÷૵Õg(“Ï òç÷AÔèo­'ôïë#þ¹õ[žóýýØ1§1Å|þSH†Ld—;°nìkÊðøÎ}”Ç/WA{%PÔ`‰¹–ŽL",! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"ï4*—Ìf樒ΪõŠý@I*BêÍŠÇdåVq>/¤å¶ûÝ OÔ‰.×&‡ë÷ü¯†ŽxðÓWh—'"hÅvø锈ö79õ€©¹ùbÉU²8EÈIZŠãé:ƒgÚꪈz©Õ•˜ùz‹«è7SÊ›\«f ¼á(¼ÌŒILuL¡ÚL]­…m½ÝfL-Í-Îù b77žþ¨íS®þ~Ë?Ï<ý´KŸŸ -¯ï_è #Láþ;Ø \*|~ë7b{ZDA±Ž•Œÿ;^ ¨ÐB@$ßÐú(qaÉ•¦5J‘’¥Ìv¼î bHPàÌ ”šä“£¬1yµùåä"ŸkØ; Õ…-¢MEŒŠU§(/A#Éó©Õ›×Öüº í%¡RÃte”-Y”¢³²’ÄܨŸs‡2`‹iU q)ùMÆJ–Ú¿žŠÖxøoÅÁrSUOz>\ºÇß‘ûæÿ?cKÛ¿+e}ü `Æj/Òn Ô\˜¸ûAp] œ eP!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰*Aʶî Çò¼öJçúÎ÷~xà~Ä¢ñˆtk·aò JK•Íàœj·Üîçú[WY¯ùŒ~VN±5 Ë¡íòçN4çü¾ÿ›•džeG(ø‡˜ˆVÁˆ¥×t(ä¨hyIS iÈ ‰  £I*tÇt7¹d*êújÑÚª2A¦9I‰ »Ë;›áKYÃÆøÉk|\|1‹‹§Œ Í’wX'}ýèðœ¦Ç¾8è9¤{ºL±'ÎîZy®ŠOØ^ßi¯¿ïIÂÏ/ »w "ØoBƒ -¤Õ0¢1ór<”ˆñÌÅŒÿ-¢hãM³Ž$ùœÛˆ*eÉ•›½xg %Ë™Dþª¥.ŒLš,OâYFP¥KžD[\!¶FØË¢LS$FÝ·2;›ZöMU³5vª&¼ Vd :«X• ‹¶ÈسÚrµÍ:4˜¯sµýdw×–™b‚¶ÊÊénZcÔÖ¢Òµ.9¸Rsx:ÌqÖjoEEw—í6k”%+ut´kåyå~ݹޡ WçSv”ÞÔrÖdTÌ“ª³Âž !lúlëà)I…Æl—¸lÔœÈZtïÉÉO‡¨s¤y™Su~Ž9j5ù~ƒ9Þð¶Þõè×í¡«—nüréëù²7ÿ? ÞzøÕ‡|º1_)Î6œXÚÕ2ßMÚTʃ^Ha†öf™…jVY_hõLÓÃ^‡ˆ)÷ xÅ(àgí]&ÜHÜm j)’¦#1³%¨p¸ y®©'ÔcˆÑèÝ€*þÃd…ØUÇc…;ê¨AwRö÷È'òçŒYnˆ%‹¿ÜFdšXéÑ“ŠQfçÆ~µqùÆ”VI§~êDù˜˜ä‘ÍÅù…#ºwžž&Ù’š’z©p3Êyâu&W§t}ÊÈÚ¥±eJ]˜‚zZ&-^"J¥˜ƒ0ºž ŇЛ(Šª3GÚ™£M‚Êg{ŠJß©JÑÙϪÄÿ꫹6*+°æ ©` ÔöÊa7jA !¶ª5æ–±˜#e]‹ë¸fvy§vèš0j2sFçmTy¨°Ne(‚¶b8iÀºÏ2I²«ŸÌ Œ{Õ%졸/Âú"rã‘êÝØœí±8bº©Åý.ìj ÏÆ:F½*wð¯À`¡ÜÈ?*D1œkÊí{ëE›g±'WlrÆòš/Ê'Xs?Ó74»lr ¤‚U½ë2GAXQR( yoÒØÀJu]p%æmb1É5"'‡m Øi‡ õr1Ï[Ó¥øV­&W -éÏ~ã-©ÞÏüŸÑ€.Œ_}G¼ï‡ˆã–Ùo3þøU>Ëè+ÆpWnùmÐ*ÆyèÝÆõ¨áè‰Û#zêé4~ôæ­WžõŸÏŽû[[çÎ{¬»ÃÞ;â°M|ZÓV|ò§ý¥<êºE|óµ«ôÖ_?éNlÛŽ½DÏW/w‹Ý[<餻¸îøû0/ûšS¯~@ß§¿¦,ÑÇ/ÇêŽË[ßöø¯_¾ð®Zÿ³ 8àÀ–&-‹œÿØ[™Ël÷ƒ 4P¥¸ZHYÙ6Xµ­Ü „ÂSM¼Hˆ;¢pv \a ?èÂÊ !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Ä"@—̦SXkآϪõŠ)@E´› ‹ÇͭÜø‘×ìvœ„3ä$ÝÏë3Ý齇¶GXh˜¸x¦vèøX†1ˆÐø“¹É©•¢ ˆÙØIZê¡ù‘ˆ6Iagú ë5z:«J›KJ{${–¤,œV—ã7WÇ:¼üÊ«l±¥ŠÈL ú)m0ZÍíè vÝ->®õýIŽž>-¥Þ.Í%éN?_Á[¯Oô¼ïÿ0 À~ì^äˆÏAÏòI1•Ãx³Šýª1c‚ÿ/ÉÓÖê£Æ‘+:2 )¥RA’,‚šådË™ó¸À¹Î×Jš½ÚK*UpÉ^BhZR±8«‘Ö§œ/g-¥Uª­í o±’„tQC¹ZÁÁ‰V×´[–|t,1a›}­&þHx_È8“"ûê÷1±Ž“+*{1'h?Dã õQÚ…ã"† T§Ä”šáJMñYËZïTì±ö`Ç´tWvëØ÷åbœqÿ,únAxo–µógiê”Ù£'kMɹ¢cÓÑ2EÅ:¼wbë‘K¿ts:vèÊéƒlÞ~¾áàòyÓÿv­Œ`$øÝ ÙÚ©&ÓrðÙ‚Ò\êIˆào"gŸpr…B€Öax[{ß±Vg²÷•x#÷`d âÇ\q*š¢Œùù'nÑL¥ZNì¸Ö_t±òˆ,b>þÇžE6ºø’ ÎØ[“÷=yRüi`b•½u©`]>ŽY!{8rIä’s§f–’¥]†9êH¥“-Æ×Ê’pòâšž¹Ÿ”Ça$ä|K9[“¢If£0ˆé§ŸÅ±)âsvšçåi¹I™”xB($¦qž()2øMŠ"ƒµQz¨œQZºÁ¢nÝ9+¨o^™i4rzªÆj¦{Z™›©X Š¢„…ÿRªi³¯^)«’ÛEf‚iS£>ÓCLB“™ÓB*©Cú›ëgä¢V)ˆn¦ «`¥³¶µ9¬®Ü:ÊoƒùV-šçÖZ^¼þº'¼újiè­ÀI†/cå1kš…®ŠJqªÂKQ¯ªT¨} ¸n¿ý G%sÇç§ ¬¤Æ7‚Œä~ «ç±m\ è ö£{­&¬¥·{¸WÀùn4­Éõ„¢óÏ@5m­!¬R½ÇÍ+Ç ²T{•©=Ws£5Öçä•P݉;šÓn ó:f¿M÷†KcXß„tï  (_ç-5ßüòx­·… >S?Sýµˆ s#nW¤êÝîµ¾Cnz …yO…ûhç4•¬êF¢ó}Ïã—ŸžQz•W|!묇-{ítQî‰íˆµµîžç {p¾¯i>«|ÍɯFrð>,Ða«}B¥§ˆQ„IVïŽñÚ_cÏÜ‹#ýÙy?þ!¥U‘IJ§èïËÎûðG«æ˜õ~ÿH0Û¿§LÊoè  >Ç›DÌ€viÜxÇÀ1)NŒàjXA ’$MöÓ ÛäAȉ/„¢‹ OØ‚!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±EkԒǦó 2?`ôŠÍjcÓÄ2¸ ‹ÇÐ.£J5“×ìöZ}Xºçô: ­„äö¾ÿ¯„¡·—4xˆ(±hˆ ÷³˜8IÉãèu÷È$YéùÉÑé!:Aêeʪºú(bê ¹iËjëWûK»K¥Kë{;Ì&ܘ#›F¼ü'¬á¬Ë,==sÕM­Í›W½ý Z‹½÷~Þç{Ùj>2Žÿd¸ô¿aŸÏßÌÞ±¯Ÿ@\1eˆpUÁ„ a,¤` bÉ7èmÊä,b,ŠÿÝ­{¸1ÈŽ$#$3­] o,KºÔçÈâ™”>þ½¼ ‘Vžk D¤7gÉ“õÀøT´TR¡ÍLùræ£J¦TwtÁ“êTÌ}ЖVExuÑ8[ š=å°Mµä²±µ"³I$n³¢Šó*ï×[N9Õ³Ù­-ZF¤~†µÒ ÎÛ:/Vì¢bÁ!aòI™Q[¶óLò,üW3⨡ f$MÖ(ѬJCÄÝÛ±ÓẉG×Õ[š—å`¿l'nü–wÏ\Ùíz<¹ŸŽä]§¥H™q! %d™î$wà(HžÈ[FÈ–hžåX—ç5ך$œ½)˜Fz¸Ò’õñè[›o®¦M%ªif£V½¢gcw>Ç`u i\¶Èfyš¸(tçÍtc“žz£çs‡bXYŒcùY§èåyÌ¥qÒ©iŽœR‰'…©j—›¨[’  ©0Љ€µÿÊ)áQUÉØ˜öçŠÓ*XdtR<ÃF®'LÚi ˜š d¥ÞJÉ䇯pl”[.;ï­s¶;¡£úV©½Wz«§GáëªÀYþËj„Æ©lz/Jª®Á¡.(~Ê6lë‹_v¹'ÃFã¯}w¼»ïPsú´‚¬i0}×¶,#®‰ºw1‹ÓÇ­ÄÿJS²†bÜñ¦Õýj¶ oE²“%Ãruª / ?'}ÈÅT÷ Û5Zï”/?S§»…Õ`».]áRjW×K¯=œ½:V@l/=¢\le…s›Iîón<öÞLô¢Z(xHoè%ã‰37êÈüøP—¾ RÞ•“tµ8™†òùæ±Þ`M¢ŸŽoà¨ î¹æ«¿~~ªÃ.dÓWºI{îPo¬{ïà6»ïˆxõîÕÂ'„»ƒ­óÎìñ ÖÒò“;Ïùî_¿»ñÔ“<¿ÀoÏôŽ#>Uâß‘fù8I~ùZÁ«ßhßð¯8È„½?¿*¶›a/ÚçžÑ ÿàठ¸pnû‹þˆT,J+„`%¨2 >Ž€Ô`â¨åÁÕu0„°ƒ Oȃ!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~x³ý†Ä¢ñé‚Ȧó - AeôŠÍjASΊ¸ÀÛ²ùÜì:Ô &ú ?ÅÔù ¼Ë÷üþ‡ÝF·$èWhxÈ¥7Vµ†èø¨¥ضè噩I$Y‰!ɸ):*ÓÕ9–A‰gy©JúJzJÕhàºá «ûÉõ‰‹*»;,'Ìj¼ä…—Lì\fÜùè÷˜³3¥ =¶iù€ãKÿ§_žv¸áWÔ*Y9üYvÚjçÁ×_ÃYàW41ita/éôD ‚‘aè“@Ûí÷a~$Þg"bTwQq¯!÷ŸsÞùô]tû½èß$ôQ—Ò•ø¸ ƒ Öˆ#†ìHVÙR¼-ùÆW­ø‡d;Î7¤Ž2bãg6F¤yUbIX¹h—EjId˜YŽÛFì1 '_ª¥{bZååe:5褖›‘‰ yV.GД˜y9æ€Ïz¥~`Ö'¢qî9ç`¸åéæ^qnJR¦€ ºX¡­ø[¥<¢y#¨Ê ¢´‘©Ü2@ƈ]¤Caª(›¨&˜(qvÒ*ˆ”¢Ö™©Tî°«ÿ>ªŸ«ÍÑ*kšêÚ¦•+²¥öéQ>ö kˆ?|ûªj‘{Q˜Rx›Žó ‹§4Î~Æm#ðŽ0Y§] èÛ½Géš,„ØòHéºwZÉiÂÄYª¢¡TXµóªŠ¿úƒ*®Ž;Ú„jqw&>9©` ? pµ';Û.‹ŠšÒ› /‰Ü˜‹…Äë1€ R6”jÍ^û3ÇÇ©Éç…A‡FoÉ[½¥†×[n’¶Ò’¦3£bàb!N{ƒ«¿r¡Wjp-c|ÐØÝ”­5¾áæk2ÛBŽuo.®m)—yÿÍÙÒH¶Â÷†€+|³[ºZtä1ÎdXœÑçݘÌf×xy™ÓÅaçpú汆~§,ºR\,÷ã©Óä/å®ÿñ:WU{î-¤¦{ï–Ïþ*Þ¾ÿͺðÃo •¨ÇOBUËYé"GzðóÉF=‰@Z/D¡óŽzøÜO=…¡Ï)ö'¶ˆþè!š=¢äíÛ~v¶ó£ Ì÷/¯¿^Æï?ŒòU Eƒø‰±“}ÍQ×9 ç€±@µÐûhœWòEÁËEúË òa'ÂyPwÂéàs§ %‹à {'¿îO…2¬! !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋uÝ ‡Äb ¸øÙŒÌ¦ó)D*K¨õŠÍ®€4F·« ‹ÇPpò`N|Éì¶ûmK«ò·ýŽU§Ë:Zš(8¨·§¦D˜¨8hшÐçG÷³Xiéô˜”i°‰x* Ói²7Ù·9Úê:3Q:"9‰úz‹ë@{&õ› ìÆª1¬Z<ç¼xÌëQå ËÉ\m'm*ÛщmíM$Íý=NmÕ]žžˆNý®/øK1ߎ_ùþî•ïÏæ,Ͱhôþ¼f—ÀX:„„ì¡Düîé‚hn¢Æÿõ>Tœ‚áãÆ‘%›F2%O|žE©2&EG«,)Sæ/[œ±ÛWgΑ #~âùÒf¿?‡:Ý ÇL=CÎzŠ5ƒ@ª´(éªú¥½¬dÃþ9m'ÚÊ<†éÓNh¸tRÍ¥»RM.È-»,*Á…4Lý›lï!»È°­© Yo±­Œ1®…|ÒÝix+ƒ,Ì4SM“˜ùjK:’Oqg/NVѰÊÕ­?¶z1ßÒ-OóÎl«³æÉz'ýmÛ7ÚàqSù¾ÝôÞTÔ‹•^PÁL‘×ÒÛ{OÏÍ ?ƾÛìR‹—%“ü’9ü/`A¯§6]¼óúí›Óÿ'O›mÒIá ‚!S1ÑÅ—`ƒbé÷Ù wR„=m\Z,PXÖ™W\lð‘ÆÞu"ò¡{&ŽfØù¹Èbj+FøXr¨"[ZP†â69šV#t&Va…åŨߟ-G!“P*Y׌7>©¢VÔ¥WÒbÝAs¤bjéå† éàŽÁx"›Ïq©Ô‰R¶(Ÿ…¼ÁåäxT–Ùe•ý™·d–î×gœ|*•§ž`ŽÉhr…H¢sô¸ékF¥YdSPž7éø¹YŸ‘ýX ¨œ‚~J¨¡[bÙÛ)B*F¤¤8Ê‚§¥…ÆÊ꜑nÖ¢q‰¾™æ¨Šjª©©Í¥KÿU5P…ù¥E‘´ŠÚ÷^†Õ2è [ i›mP?±igQκV ·ã6 j¤<ðú-·¶ÊgWÙÁdm£cxmwˆqQ³ábÚ&ªÑî g¥©l0’ÒÊWkeÓ2 ²+MÖîT$íÑo© >w÷•Ê)ܾ6Öê…½ƒyª-–©$6’ŒáÔxPÞ›ìBÅ—‘äË _B¦º ¡e½s/ÒôÜhïäÏ›QŸÃµ©™­ÝºxeؾŒ×„Û™vqη£;Ï;Ü:羫Ðb~ü†)èæØS'ý9`öѯÕ{o¼[kùÌ«oÿ®Ùuÿ§_ràhÕ_¤”"’tóa×=³puËVÔ¬#5xhxჯa6ØJY5aƒ#·}¦‘”bgÿ±Wߊ‚ `¹Á·–vßÉHÜŽ®ä&^bw9C¢nFF!›]•äEd3¶ÇÎtüm£‹|T¬9zL1ÐÇ;4u"ã¹2UOC60Î.÷GX…>EØ%† ÃÇV'òóØjœèX@‚í‡Øl7äö?¯·qÊ’y5¥~(nÏæ xÔ/™˜Þ”!~õÔh–iÓˆOZ$ÕoQÉöÛÑ߃oL–Àïå^Öb2{ãùç™u‹wéª ~Ö˜«»o©¨¿®w-ŽûDûã–Ï{TÜ4Õjë½ÿ${ê?ý!9„-e»ëÏÉɯXüJ;ܤ¹êg¬ØÜΘ–eA,iDµüUpMµaÞaW›¹ïƒR ÍHػΠ…×£ ¹7Â^.]2¬á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷>x»ý†Ä¢ñ³5‚8¤ó …‹  )Íj·Ü$ÁìŠÇä¬rVXËì¶û˜¦:Òêë÷Ïë5_ºÊ&·7HX¨rpW¸¶døiXEi'(™©©eù€‰Ø¸):Š÷Y5gGªºÊ‘˜Ñäú÷§Ëj{KÒ7W[׉û»‰å[rÇ;i œlˆ<¹#̬ý6¬ØìU-Ý]Ë «-Îõ‹4žNÎRGÁ[®.ŸŸ:Q?¯_f?£»°P8|2ú<(Æ` fÿ:Œâk` …+Z°'±Oÿ;&T!E$'"sEmDÆ#Kº¼s×)Tà-z‰ÓGJšZæüùΦ±‘>±=”箢v"} *·aÔ(Ú„Šõâ3©±Ö0Š™5¬:ŸúL­ÊÑš¦!ZÃÁ¶ÔÛ{yüŠcê\ÄDWUÆkËn_™2Ý-Të·Ø Jp“6ŽÙnèVƈÕHù2š¹0#²œ|(åcY™¹=^ŒÙgy{:ãT+àÙÅ/2ˆ).cÔ3Oò>Ýl7švÕNV>\ú3ä¹´ø*·¬×¸fäΧ÷fþÛ¬75¬£.–˜;ݶ¾SïÌW²Òå›­GM>œ}ãæ3_¯çÝ>òøsî‹cÿ7_Ýqv)ÒUC!䵟QñAWïv>õ˜ö`[k%Å`{²`›v7]‚‚pðÙçYl£ÝwÜu_XXaŠF tú±hÙŒ&¨Ù]ÝÍÆã6°•e`+ªáç_|±!÷œ‚'Ö袊$:Øß‡'c“uDÉn)Šwå1CÎ_=Ž9å1ü…¹âoŽ·ÜjõiÔ%gi•GË–¤ùGŸw Ú¦$ŽWÒ)'K•e7JN™'#>If£"µ˜¦)_¡ZYäœÊÕ‰%’ä©g™wžc§æš_Œ nY¥x0Õ }œ®E)pnÆ™¦“4Ñéš©ïáYë¥+†Öê“ì]˜£¤lÿâaz~âÅ(w7rHÜ+EDk&­RÚG„–_Qkm„¡¾Â«l%nµ¶ÄôÚ »˜¡‹)K"k£¨ïr›-œùò!¦£?yx&Ÿrê,£²rìz»j¥èaVS¯¶&œ¡¸ªÊÊæ|”fÙ`¥Û;î¶:Jû‚þf¥˜ÀŠ)ļ ·ëðŒ{êûéÇ·Y0”ï:3³T*ûéÃ4vóŸgq™°z,÷{²6·Š¼Ñv†;¡ê>òñÕf¸º¯ŸÁÑên2V3MFÖd›$°™pÁš„ˆÝ4@nDÜJ]KwÜ#{ÉQ¤Tçío99+Œ7àdzErÀzÂmxZ[Èx々--—ÊKŽùENÚB䙯¢uµŠ?úùQ‘{^:P%c”zÞœ«4zÅ­«^¡ M]&곋’ȸû®”î»kòº¯¿o üð™Pˆ{òÊÓ¶mÏM=ò²¶ƒC½ëµgÏý¡„›V÷Žch¼Ûâýñüžo8ó^ƒÏ>R‰~w—ǯ¶úñ=§óø“â-|ÍÂÿ ¸’¤(ð¾A‰É¨7ÆH”G¬UÁöAç‚÷Ë üˆ8*Ï¡áìZ¶?î.„*d_jZC#!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5`ë ‡Ä¢±õ[ÔhǦó %&É`ôŠÍjCÌG—Ê´nÇäòsÊ@'¾æ¶û}fSⵎÏë5_›\Y‡°´GXhè8ñwеxøi–˜fqgð3¹ÉùxI¤Ù9JŠä%Úà‡J—êWú ë¤j©Ù{‹Káx±ÚšŠÙ›+<œ \yjL¼¬§¼öáŒÌ<½ilµ{"6HÍmˆ=gíÛM^&¡­¨{ZÞ®u®‹š>ãånòÈïßdMк…åSçÞÁ‚ ]\ ¶°XÉc”E<†Ž¢F‡ÿä常1$‰‡ãè…«R¤JŒõ”°Cw-ÞÊ™÷u™’¦Îpò¢)ìÇk§PŸ¢gs¨R0¢¾%M¸4j6iN!J½*E›mL?býŠRM’É,Q‚‘³D(Ll©­ªÚÖ@ŸŠ‚kûkdZ°¹þÔÙ “«X˜ŒÔÎû ®"WŠß¦Yux‘ã~Mg³Øv-¶^‘)Å ±QÌYmÖ ¦UÒyúöòµGµØÊ´§•&Ñd_a2³• ¹ibΠSK.þ¸téÜ.kç-üYqòãÒ)ûf¼6ÙŬ[£¦ÎyÖ[ͺƒõm¶ºqÝÈCÿm9ñ˳Љ«¯>£rññúÿgôW:§•Ýs„x’D%‡à|Ιa{ ""Ü‚¡a`Ë`Ò€öT1ŠVØ}î ×ánô¡×mùiG!ˆõDWŸ~*²'âe->Å܉ hL‡¯ý(ÄawIˆad4†çâb5nbˆöÍØ’ù˜x¡|ðÉxã‘X*ˆä9nhJ>IfP— ¶Á%Ø16Cï iejC*—"a½-éÞp¦É'“Åõ——”(nã—5Òæ% :väZ™ŽZÈètâÉØr|þÇ›–éIɘEl^ç&ìL¢h”vºé3kbÚ¤uëÉ‘šüáùª“WØÜ¨šÖ©]§”êi(u£zöä©tze°‹ÿšZë/¡Ä:–Bb˜•‡JâÚ¦|´Xdš%%É“®án&Úgcfó©’Pb›eT¦š)«#H/¸b>Š/¤å–w.-Tšío^:'ƒÀÎj«¥yŽ‹Â,åzž@«VJ^’ïòZ±²ß¶I0Þå[¦¨nÚ `£UÌÛí{xÞÙêÆ î9ÚËÆm»É»Ù7ÇÄód¼«™<»znöÔo½ KUqÁÛ%Ó(‘gÀ\´'³FEl·–¬šºò–2uÓ’tMȇsjU™51öŽìÂuÚ.Ew—6hÛUËN§÷£¥>Ìà´yÿØcE xá2q+ïÙ†/x„2¹œ-I^pä–»Sí®å4)â^{­ù-žšI¸~¡Ešéªã|ºPék U­»~8QÔήRê+³:îÝÀí¥[û®ðHôNü=˜'ï»îP1ÿšñ<Þ†<ôn­måè·[¯÷ðw7ÎýN?Mˆ·Úá‹¿Waz|¾ø¼˜mvûÅKTUpÕË?Ñ>ú¯¿Nû“º¼þ-å‚£•Q1·ì€ørßfs?Dß“`Ü‘ ž®Ô`HøçÁÈ-¡ƒ!,á !ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú·uÝ ‡Ä¢‹ÖøÙŒÌ¦ó).”K¨õŠÍ‚IW¡ÔŠÇdë·›”–×ìöó À¶¹ûŽÏoÑòj"¬(88bçH˜¨èöåá8eا¶XiÙYhHuÙé)S%)§‘—&ú™ªŠµ‰¸ú ÛÑX‚Ú{‹KZê±{Л \ºçû+ŒÛë÷;Kqœ]ùìÀ,­ú°nŸ™±¾|Ï­/ ¼íLöï¹rø:$‘°žDϾ=¼h‚¯ÿô"büøZDMy‰RÅ»kýPhL ³K GƼ鲤1xâü9ãå >§=šâŒš—3/C u ³©Beò‹Š•Õ?Ž¡‚34HQˆ'ëÕ³$­-B”ʦ ÕÖi§Ïf½¶+6¥\'öíYêl;j¹Õq[–A-¥u2¶—¸áÈ=%rªßrçKvL²Y[C!!9Mõ+KÏv™Þ½hú¯±µ`š>švÁ̤-7¶š†ÜîG¡éü6Å»°ÚÜ&›*þ£¿è–E+'}ºÂ²'Í>f7QЛ?M¼E†"‹'ŸÜ7v£€…sn_þ=}ü×sOÿæ3[€ —\ö…t M¤4\sõÅ`edX‚¢)F’^;™¦Ù!áÕ6rbFpø±G\~Â7âLUuŒ*†¨.vÜs øÃk>fAIiÆI5Þ~#f8£€VgâFÖW’gÁ9˜]“ÁýgãUIn§ÝŠJrY"?®ýHf„ºÅ%¦þUt&bŒÑ‡!œLJwäyvuRŽ%NGe˜5¶hgŠxú‡œ 6§§thÎóa™ŽR¨ÕkVÈzv餈&wØ–’þ©çöt‡ŒñºiŒ¿Uêàså%êªÞx5_?Uöwé’W²˜*”Úê×r·’7j~UÒ åœÖÿ©J£±‚š˜W<-ê烮Î3Ę`û¥Žâ^¯×¾nÓ𿃲ñ8:e½¯|0t}õVÇž¼õ)3¿:õÝk”è—³-ø7ÉÚ;ßê››å"Èþö¯}üú¨TýöÃsx_‹Q»¿‡€~Ó_ÃÁ½æ•JxDI+LÖÀ2ñ¦€Œš$ XÁÅ탌TÓAÆõ/„®kŒIˆB!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰.Aʶî Çò¬öJçúÎ÷~xà~Ä¢ñˆtUB[ò JËšS8Íj·Ü×ê;LÃݲù ½>ÔV´û ‡_ÙâjüŽÏȈ9ÿpó§7HXÈ 81†ˆeèøiÀˆc×çÄ™©£FçQ 8·9J ƒ rÚÔXÚꊑ*ÙGâúõŠ› »§ªû ,Q Á›H\œœË[Œ¬ü º6+|ñŸÐn|Y«µ>e™É“¤»ê¼=/éer„9õèô^»éÚ?eõ¥ßO~òzêÒljþã9ÑImûy“—¶ü=íæpåöß/ÐËMÔ¿?sK?ŠË^ÛqÂu†qT^äÕÀ€¡ÈnœßWA V΀ôÐ:ºÅ0s`ààO€!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçúÎµÝ ‡Äb‹Ö°ÕŒÌ¦ó9\&¥ÐªõŠQ§Œ0 ‹ŸÈî¡ÜE×ì¶ð ئ“q¸ûŽÏ‹ìs³Z(øð‡ V¨ 7¸ÈØxÇ÷h€8Y鈙If8¡hè©*uy–@É9…:ÊÚê°êQº°úãj{k†!{Jú‰ ¼›Z×ÛG79ÌÜ|²¬ í<·‹&ýL­=]Ò½ kJHòŽ.nœÃ'ÉK—4‹½šÉ »š<5l¼¹™•=‹rGKÉÀ˜F›Ê8t ZReúœZ`êÏ>ë.à¼úðX¨1KÊ S—"…~­V ÙV6rÆJÚIç¹`ÃÙýeêÐ)kËøåÓ¶Û¸²BR:+®ÂÆIÆÊ¸R¾€…Z.˜8¤M^ž1/F’ïlçGÝò¾Ý·/âÁŸ¦½û2ri.¨3ËuÍùé—UŽ5åâߣ‰ÝÉ<`qÚˆB'k u^.–‹¤RæuEÖçô^~ðó\äˆï¦¾ý½hìšÓßæª;°{ÊÍÛ›ÿ¦¯]Ó…¤Z}¿(‡ŸõÒ˜OŽ” iŠM8CWBGHƒÂæa¬¡µZ4†%§[aöñòSyùù6PÕ]H‹K†â~2–øßŠÑÈUn=†`lBþCÖ`åtŒÒs^†+.×"oñ™(ßHTZÆ ü½X%r¨hÜŠFˆ–#‰æ†>®9Q-M’(Øi!:&–þI×å’P‰ܘlÞ§'â}VÖXLœvr蜟½çËQiNº—™‰Y(?ßÍ h˜\ژ鞅ö™—N^2(–TZánÙ•ÊÞ£ÀiÉÝ^$Ê`srªä]Sæ*˜æ‘ªk|§úê±¢ÿF©ß¥tvê%|ÀëxLj¨Ö×vÂk­$=!·±‡S€s9úY·é’„éŽ:þ9Ÿx_öšË–Gš—Q‘° ›+¥þ¶ÊZ ¾uë¹ÙùV*¶ë¥òª® ˆ«¤†6Üã¢h®¦ÿÊÑÃ?+p¬3*â™iÈû/<Þ}XÛ½–@l«›ÛN좄 û÷ñ›Î÷லÚ|1s9{<(¿xFG•4á…`rÊýèËòËð u GÈÇ\ß3[ KDi#[£ ¶³_I[ÛlÞŠ$ÚR$Öy>]çÜz£bxÖ ¸öÞiÖrÞ÷É-¸QµÄ|µ9‰ƒõ¦´vLùã²ÂñG/´Oš–¹å ažç¢ «éyO‘;Yzêmj.ú䪿žȲkû܈‹[ûÞçÎû³÷®øï£œð±I%¼ñÊsÎüíˇå8ëÒ?ÏÓîkºã<õÂ$öN¹Œu,ÞˆƒºãÓdý—ÙŸËRÇ~õÜk^&…ñ×ÔQ«f5nÜú÷£$øÝ$}ÿ ”’â¿Ú¾PJ¨2Ê” ‚BºRdHA‹ ðÔ *0ØÁ¢€0„ä ñgµªð!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5@ë ‡Ä¢±õ[ؒǦó 2I[ôŠÍjaAeͺ ‹ÇЮcJ5“×ìv—±‡pòk!Í ÉVž{9?Lñž]n,kÉE†ª—TÉå­Êø°f*¥ý†›§ˆ*åìÌÐ)cÁòÈå’,Ø×M|l6&h‡bsç~a¬>iK}ÀÉ%;0ÝzÏïO /½wà«Î„[\ Žø#oÁEàµZ'žÕØ‚^ š€ÃCþQµ_V>NǘµîÕ:Ìý¹(|9ˆz¥¥Ó]ïã2­.5Ð/D {O¤×Ž» ·ç®ÂŠ‚Äû¿;!|¤]Ž|çÅGŽí‹Ê/Ÿí g ½™_ï^ý=f„}öÆt?øÞßâ:ðã3¿ƒôç{ã{Ï6‡¼>KÉ”ÿ>r'ÇÑñì5‰øø³¢“W±Ksÿ£‰Šªæ¿Ú%’SŠê$Y‚ÖãŸâHÁlHP}Œ 9ØÁèa0„ª! U¦–žp…(!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–æ‰2Aʶî ÇòœöJçúÎ÷¾xÃý†Ä¢ñè²5V7¤ó •Ë ôŠÍjÔ³[³nÇä²ìmV…æ¶ûýD§×l¸ýŽBÔiyþXsÁ§R¨P'¨¸•Há‡p ÉhyYæh¨I)†ù ŠÔ¹ù@Úyªº’zàjèàÉJ[ÁiÀ†»‘Ziû ühª±‹|¼:ZœË‹ül§+¼³ mí&´[}²}í}ç\ÒMù].¨=Î<nÞ^›î/Ÿ!íQ?ÏÚÍþ ŸÿÃ_«I b[GÍ BüreÓ–£á‰¨†Åÿ#”@äðÑBHŽ$VáöðÃÅ’,Ãàò8feË’³IœFh¦N‘¾¾¼ùJ%ÁD×ÕQ¦ÎË-Go}ŠáTÍ9äÉÄ5«4\ =drò§ŠWé©ÃQöZf@£MôÕ•X¥Ój Ö5L¤žL ª7£š}×Våwo_DIe5¶ºxÐa§U×J]ªXÓÊbýÞz¶¯Ô¼?Û#«­Ñ»wåd‹Œê§ìÀ `N[8´çb— .3 ÙóãX†-of¼çå XÀõ ¿=¶2ÛÍÏý‚q ·ŸHb~SMnwrǾ9§† Ø»té™b^²ü÷ðÌî¡Ó-.ú¸äÄ´µ‡ÿÅj_|F^TÄàDUt[mÃÎ>ûQ¶`&ÈSEhéçÓ~A¨v^ss\Öà|È¥gn÷aÖ™ƒÌÅW"qõÉ Cèu£Œíõg_¬í(Š2p XÛ`( d®‡QŠ'Žw‘‡8]‹¾(åv1*å¨až=ò&j´éhaƒâw]}ˆé¤dêÙFàQQ¦IךCE)æ›]VIÝ™ R˜0f×]_†‰(=†þáuºé¢&K&9$’(º™–G7ÖŠWj‡B·õ ›fU zªRd&gf©jz§‰È Zi›bª¥ŒPþ§*­Lî™'‹¹è«sÅ>¹!H7ÿõf @…Cg„ÎxRTv§ †ŠV"¤Nª£ˆœ·‰kˆ”ʪ.}AšK•­«%J/h{Á{ïªãŽsc¨g*7Þ¬™:ºž¶6ÚTðœøîúç$ýúÉžÁ–ŠŠ&©Ú°1ÉÞ»i‘­ [ï?? ©\qáœÀ:·)ÆgJâËÁQ[1yrŠÉØÃ®¾ü\“¯ö¶0Æ'Ïle¸!gå#ÑI9#ɵצ«ó3:ƒŒ ¡k´» Õj ü4Swi°N64/ÕhÙùÎfÕh‡ÙÄk>A;2Ö¿½ã†šõ"®Öé€7>W‹Ø=u"8kqo‚ÔØv'y¶9>Þà‘¯Ce²¼-×ëå$5dy…žïä6 ¡Ž¹¨¿M 8§¯.rçÃN»€â\{í`Ãózîñ4®¬ï¾÷^´ðZŽ{GÆ£¾ûòÎßþ|ôˆKtó³ÏK½NÈS«(ñÙ3¿¢~´‘¦JþLüp’«é ™™{ÿ>^1—ýõ Î7ûáퟸÑè €­á ûHÀæO ÜÈØÀzIìzô+¹/0ƒd@!ù ,yaÿ„©Ëí£œ´Ú‹³Þ¼û†âH–扦êʶî ÇR@òçú΋5Ý ‡Ä¢ ȰՌ̦ó9\.~ôŠÍjYK¤âgÝŠÇä§÷{8#¨å¶ûýV†Ñj¸ýŽÍ“õ´4(è³·6ˆ˜ˆW8ÃøÕWŦ8Iä9 vYéù×Ö)jzúA:ש±Ù…  â¥ZR*‹››Y•vÂjð§;Œ ¼ö`L¬¼ì@›•Ì=¶ MRÝ+ 8ŠŒQÍ{­-®>n~®émÎÞî]îÏ /:Á‹ÏEýb¯ŸÀôô¥¨70!Ápûvù"Ø, Â‰¢º] 'ÑÅÿ” ˈi]0Ž$Õ]jØ ä”c%[6vlH•h\ÚÄäq%F0+ ¼ ÔÚZ=²4j‚fЄgÔ öÔg—ZÅ¹ËØ(IN6³ÃŠØ‘ËÆöBiêU$©OsŠâíÕqN›®zøuƒÜ”n#1k–V¶p±Y¬Õ'°_²cÁùýçèÖáˆkk~c¼Ö±à¬ýªüö‘¥sÍ":X߬C’ý˜óYžª?³Ôú:]âÜ¡ü[vU_(‹Þm8¯oà R~ݳ®ç“ÂHC]-ø¯lÉŸ'1Š;ùñÂZs.çŽ×ûʘá“_Œ­q)äÂ×wçݹøTÚõÙÿV×µ ÷˜¨ŸEä5ƒz>•#Ivy¶ß,Æe÷Ù^Ú'Ûd½½‡•{牶^{”ÉÅ\H(¦É]†DUZBTžjÁ¶gåq|"ZV`@ŠVq*~˜¢­ð¶R™-9^sõhc–qv…д¸]sô¥“d‡Êiž€«É'fpdJ9›“!šébkÌ5õ]he‚y&NJa©e üù wçÝ#†MÖ‰f¶ç„eöö‰?ú¶¥óÉ8iž´Yé©“3±h(f’©(‘Œ†˜æ£àM‰(”ºUJåŠtz¨$¬‰Êªªµj"/MõßEQØCj¬zÿZòä²Ä¶à…Wª *{ÊÒa^ùÍɤT


This is Golly version 2.5

© 2013 The Golly Gang:
Tom Rokicki, Andrew Trevorrow, Tim Hutton,
Dave Greene, Jason Summers, Maks Verver, Robert Munafo.



Golly is an open source, cross-platform application for
exploring the Game of Life and other cellular automata.

http://golly.sourceforge.net/
golly-2.5-src/Help/algos.html0000644000175100001440000000107212156145314013076 00000000000000 Golly Help: Algorithms

Golly can generate patterns using a number of different algorithms:

QuickLife
HashLife
Generations
JvN
RuleLoader

The same information is also available in the Control menu's Set Rule dialog. golly-2.5-src/Help/archives.html0000644000175100001440000000350312156145314013576 00000000000000 Golly Help: Online Archives

Golly can download patterns, rules and scripts from these online archives:

LifeWiki Pattern Archive

Gliders in Life-Like Cellular Automata

Alan Hensel's Pattern Collections

Jason Summers' Pattern Collections

Rule Table Repository

Golly Scripts Database

Note that Golly stores downloaded files in a directory that can be changed via a button at the bottom of Preferences > File. You might like to change the download location to a directory visible in the Show Patterns panel (to the left of the viewport), then you can easily re-open a pattern or zip file without having to download it again. Also, downloaded patterns and zip files are remembered in the Open Recent submenu, and downloaded scripts are remembered in the Run Recent submenu. golly-2.5-src/Help/bounded.html0000644000175100001440000005565012156145314013424 00000000000000 Golly Help: Bounded Grids

Bounded grids with various topologies can be created by adding a special suffix to the usual rule string. For example, B3/S23:T30,20 creates a toroidal Life universe 30 cells wide and 20 cells high. The suffix syntax is best illustrated by these examples:

:P30,20 — plane with width 30 and height 20
:P30,0 — plane with width 30 and infinite height
:T0,20 — tube with infinite width and height 20
:T30,20 — torus with width 30 and height 20
:T30+5,20 — torus with a shift of +5 on the horizontal edges
:T30,20-2 — torus with a shift of -2 on the vertical edges
:K30*,20 — Klein bottle with the horizontal edges twisted
:K30,20* — Klein bottle with the vertical edges twisted
:K30*+1,20 — Klein bottle with a shift on the horizontal edges
:C30,20 — cross-surface (horizontal and vertical edges are twisted)
:S30 — sphere with width 30 and height 30 (must be equal)

Some notes:

  • The first letter indicating the topology can be entered in lowercase but is always uppercase in the canonical string returned by the getrule() script command.
  • If a bounded grid has width w and height h then the cell in the top left corner has coordinates -int(w/2),-int(h/2).
  • The maximum width or height of a bounded grid is 2,000,000,000.
  • Use 0 to specify an infinite width or height (but not possible for a Klein bottle, cross-surface or sphere). Shifting is not allowed if either dimension is infinite.
  • Pattern generation in a bounded grid is slower than in an unbounded grid. This is because all the current algorithms have been designed to work with unbounded grids, so Golly has to do extra work to create the illusion of a bounded grid.

The different topologies are described in the following sections.

Plane

A bounded plane is a simple, flat surface with no curvature. When generating patterns in a plane, Golly ensures that all the cells neighboring the edges are set to state 0 before applying the transition rules, as in this example of a 4 by 3 plane:

 0  0  0  0  0  0 
 0  A  B  C  D  0 
 0  E  F  G  H  0 
 0  I  J  K  L  0 
 0  0  0  0  0  0 
   rule suffix is :P4,3

Torus

If the opposite edges of a bounded plane are joined then the result is a donut-shaped surface called a torus. Before applying the transition rules at each generation, Golly copies the states of edge cells into appropriate neighboring cells outside the grid. The following diagram of a 4 by 3 torus shows how the edges are joined:

 L  I  J  K  L  I 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 D  A  B  C  D  A 
   rule suffix is :T4,3

A torus can have a shift on the horizontal edges or the vertical edges, but not both. These two examples show how shifted edges are joined:

 K  L  I  J  K  L 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 A  B  C  D  A  B 
   :T4+1,3
 H  I  J  K  L  A 
 L  A  B  C  D  E 
 D  E  F  G  H  I 
 H  I  J  K  L  A 
 L  A  B  C  D  E 
   :T4,3+1

Klein bottle

If one pair of opposite edges are twisted 180 degrees (ie. reversed) before being joined then the result is a Klein bottle. Here are examples of a horizontal twist and a vertical twist:

 I  L  K  J  I  L 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 A  D  C  B  A  D 
   :K4*,3   
 D  I  J  K  L  A 
 L  A  B  C  D  I 
 H  E  F  G  H  E 
 D  I  J  K  L  A 
 L  A  B  C  D  I 
   :K4,3*

A Klein bottle can only have a shift on the twisted edges and only if that dimension has an even number of cells. Also, all shift amounts are equivalent to a shift of 1. Here are two examples:

 J  I  L  K  J  I 
 D  A  B  C  D  A 
 H  E  F  G  H  E 
 L  I  J  K  L  I 
 B  A  D  C  B  A 
   :K4*+1,3
 F  J  K  L  D 
 C  A  B  C  A 
 L  D  E  F  J 
 I  G  H  I  G 
 F  J  K  L  D 
 C  A  B  C  A 
   :K3,4*+1

Cross-surface

If both pairs of opposite edges are twisted and joined then the result is a cross-surface (also known as a real projective plane, but Conway prefers the term cross-surface). Here's an example showing how the edges are joined:

 A  L  K  J  I  D 
 L  A  B  C  D  I 
 H  E  F  G  H  E 
 D  I  J  K  L  A 
 I  D  C  B  A  L 
   :C4,3

Note that the corner cells have themselves as one of their neighbors. Shifting is not possible.

Sphere

If adjacent edges are joined rather than opposite edges then the result is a sphere. By convention we join the top edge to the left edge and the right edge to the bottom edge, as shown in this 3 by 3 example:

 A  A  D  G  C 
 A  A  B  C  G 
 B  D  E  F  H 
 C  G  H  I  I 
 G  C  F  I  I 
   :S3

Note that the cells in the top left and bottom right corners (the "poles") have different neighborhoods to the cells in the top right and bottom left corners. Shifting is not possible.

Example patterns using the above topologies can be found in Patterns/Generations and Patterns/Life/Bounded-Grids. golly-2.5-src/Help/changes.html0000644000175100001440000011170012156145314013401 00000000000000 Golly Help: Changes

Changes in version 2.5 (released June 2013)

  • This version introduces a new rule format. A file in the new format has a .rule extension and contains all the information about the rule: its name, description, table/tree data, and any color/icon information. More details here.
  • The RuleTable and RuleTree algorithms have been replaced by a new algorithm called RuleLoader. If asked to load a rule called "Foo", RuleLoader will look for Foo.rule first, then Foo.table, then Foo.tree.
  • The Control menu has a new command called Convert Old Rules that can be used to convert all your old .table/tree/colors/icons files into new .rule files (it won't overwrite any existing .rule files). After the conversion finishes you're given the option of deleting all the old files.
  • If File > Open Clipboard or Edit > Paste sees clipboard text starting with "@RULE rulename" then Golly will save the text as rulename.rule in your rules folder and switch to that rule.
  • All Python scripts that created a .tree file (and possibly .colors/icons files) now create a .rule file containing the same tree data (and any color/icon info).
  • Two new scripts allow Golly to be used as an icon editor. First, run icon-importer.py to import any icons for the current rule and display their bitmaps in a new layer for you to edit. When you've finished, run icon-exporter.py to extract the icon images and create or update the @ICONS section in the appropriate .rule file, then display the icons in a separate test layer.
  • A script has been added: goto_expression.py. It works like goto.py, except that it also accepts expressions. An example of an "expression" is "17*(2^(3*143)+2^(2*3*27))".
  • The status bar now displays quantities larger than 10308 in scientific notation. Golly can easily exceed this in both the Generation and Population statistics. For example, open the pattern puffer-train.rle, then run the script goto_expression.py and enter "f10^2000".
  • Added a new pattern: partial-constructor.mc.gz.
  • Patterns can now be displayed at scale 1:32. If you want to use that scale when creating a new pattern then choose the appropriate pop-up menu option in Preferences > File.
  • Support for monochrome icons has been extended to allow grayscale icons, where shades of gray can be used to do anti-aliasing. See the icons in WireWorld.rule for a good example. Most of the default icons are now grayscale bitmaps.
  • The current directory is now inserted at the start of sys.path for Python scripts.
  • The "Load Icons" button in Preferences > Color has been removed (it's no longer possible to change an algorithm's default icons).
  • The RuleTableToTree program is no longer included (you can use the RuleTableToTree.py script instead).
  • Fixed bug in Linux app: the shift key wasn't toggling cursor mode.
  • Fixed bug in Linux app: the space key wouldn't stop a pattern generating.
  • Fixed bug in Mac app: resizing the window could cause the sash position to change unexpectedly.
  • Fixed bug in Mac app: the first keyboard shortcut after a Paste command might be ignored.

Changes in version 2.4 (released June 2012)

  • Fixed bug that prevented 64-bit Windows app using more than 4GB of hash memory.
  • Fixed bug that caused corrupted macrocell files if saved with timeline data.
  • Fixed bug in Langtons-Ant.tree that had ants colliding incorrectly.
  • Fixed Mac app crashing if user's language setting is non-English.
  • Clipboard data on the Mac now uses LF as the end-of-line character rather than CR.
  • A pending paste is aborted if the main window becomes inactive.
  • Error messages from each algorithm are shown if a pattern file can't be loaded.

Changes in version 2.3 (released November 2011)

  • QuickLife and HashLife support rules using the von Neumann neighborhood or the hexagonal neighborhood. More details here.
  • The default icon for most rules is now a circular dot rather than a diamond. A diamond is the default icon for rules using the von Neumann neighborhood and a slanted hexagon is the default icon for rules using the hexagonal neighborhood.
  • A number of new script commands have been added to allow mouse interaction and better keyboard interaction: getevent, doevent and getxy. The getkey and dokey commands still work but are deprecated. In particular, there is no longer any need for scripts to call dokey(getkey()). See the description of getevent for more details.
  • Some scripts have been added to take advantage of the new commands: draw-lines.py, flood-fill.py, move-object.py and move-selection.py.
  • New patterns: ComputerArt.rle, CrittersCircle.rle, CrittersOscillators.rle, HPP.rle, HPP_large.rle, Sand-Test.rle, TMGas.rle, TMGas_largeWithHole.rle, TripATron.rle, TripATron_BlockAligned.rle.
  • Scripts that create table/tree files have been moved into Scripts/Python/Rule-Generators.
  • Langtons-Ant-gen.py now accepts turns 'U' and 'N' (U-turn and no-turn) as well as 'L' and 'R'.
  • The hash() command uses a better hash function in a two-state universe.
  • Pattern rendering is faster at scales 1:16 and 1:8, especially in the Linux app.
  • The mouse wheel now zooms in/out from the current cursor location rather than the middle of the viewport.
  • Patterns can be saved as gzipped files (*.rle.gz or *.mc.gz).
  • If an algorithm can save patterns in macrocell format (currently all except QuickLife) then the Save Pattern dialog now prefers that format over RLE; ie. the file type order is *.mc, *.mc.gz, *.rle, *.rle.gz.
  • While waiting for a paste click, the keyboard shortcuts for flipping or rotating a selection now modify the paste pattern rather than the current selection.
  • Fixed a bug in Win and Linux apps that prevented keyboard shortcuts being used while waiting for paste click.
  • Pasted patterns are no longer truncated if the RLE header info is incorrect.
  • Quitting Win app no longer clears clipboard.
  • Fixed unwanted cursor changes while running a script.
  • Fixed bug if layer was changed while recording a timeline.
  • Fixed bug in EmulateMargolus.py when using square4_* neighborhoods.
  • Removed emulate-Margolus-table.py script (use RuleTableToTree.py instead).
  • Fixed bug that could result in all buttons and menus being disabled after hitting the tool bar's Reset button.
  • Fixed cursor problems if shift key is used in a keyboard shortcut.
  • The Mac app now runs on Lion (10.7). There are two Mac apps: a 64-bit version for 10.6 and later (based on Cocoa), and a 32-bit version for 10.4 and 10.5 (based on Carbon).

Changes in version 2.2 (released November 2010)

  • Golly supports bounded grids with various topologies (plane, torus, Klein bottle, etc.). Such grids are created by adding a special suffix to the usual rule string. The details are in Help > Bounded Grids.
  • Two new script commands, getwidth and getheight, return the size of the current grid.
  • The new scripts, make-torus.py and make-torus.pl, can be used to convert the current selection into a toroidal universe.
  • Any BOARD and WRAP settings in an MCell file are now obeyed (e.g. Bloomerang.mcl).
  • Golly can record and play back a pattern's "timeline", a sequence of steps saved by the new Start Recording item in the Control menu. Use the Delete Timeline item to delete a timeline. Timelines are supported by all the hashlife-based algorithms (ie. all except QuickLife).
  • Show Timeline in the View menu toggles the new timeline bar below the viewport window.
  • If a timeline exists when you save a .mc file then all the steps will be stored in the file. On opening such a file, Golly will load the timeline and automatically show the timeline bar.
  • Multi-color icons are supported and allow both icon and color information to be stored in the one file (more details here).
  • Rule tables now support hexagonal and oneDimensional neighborhoods and the permute symmetry.
  • Added a section on naming conventions for .table and .tree files.
  • Added a new Python script, make-ruletree.py, that allows you to write rules in Python and have them installed in the form of .tree files. See the comments at the top of the script.
  • Added RuleTableToTree.py for converting rule tables to trees. It provides emulation for several neighborhoods not natively supported by Golly: triangularVonNeumann, triangularMoore, Margolus, etc. More details here.
  • New Turmite scripts, e.g. Turmite-gen.py, for generating rule trees and icons for relative- and absolute-movement turmites on square, hexagonal and triangular grids.
  • The goto.py script is much faster (thanks to PM 2Ring).
  • Hitting escape aborts a script that has called a lengthy run() or step() command.
  • Langtons-Ant.table has been replaced with Langtons-Ant.tree. The new rule is faster, handles multiple ants correctly, and matches most other implementations of this CA.
  • Reorganized the Patterns folder: moved Conway's Life patterns into Life subfolder, moved rule subfolders out of Other-Rules to top level under Patterns, added Life-Like folder.
  • Added new Turmite patterns, e.g. WormTrails.rle.
  • Other new patterns: golly-ants.rle, Langtons-Ant.rle, JvN-loop-replicator.rle.gz, Herschel-conduit-stamp-collection.rle, Boustrophedon-replicator.rle.
  • Increased the maximum base step from 10,000 to 2,000,000,000.
  • Help > Keyboard Shortcuts lists unassigned actions at the end.
  • The drawing state can be changed by creating keyboard shortcuts for two new actions called Next Higher State and Next Lower State (see Preferences > Keyboard).
  • You can turn off the beep sound by unticking the option at the bottom of Preferences > Edit.
  • Loading a pattern won't proceed if the "save changes" dialog appears and you select Save but then decide to cancel the "save pattern" dialog.
  • Fixed bug that caused cells to be created in the wrong location when editing very large patterns.
  • Fixed bug drawing incorrect selection rectangle if very large.
  • Fixed cursor problem if the shift key is used in a keyboard shortcut to open a dialog/window.
  • Fixed weird bug on Mac that could cause the viewport to lose keyboard focus after clicking in the layer bar's "delete layer" button.
  • Fixed undo history getting out of sync if you tried to reset to a saved starting pattern that had been deleted.
  • Fixed a bug drawing incorrect icons when layers are stacked.
  • Fixed a bug not updating the paste image when colors are inverted.
  • Fixed a problem with the hash() command in a multi-state universe.
  • Fixed problems using a keyboard shortcut or menu command while a script is running.
  • Dropped support for Mac OS 10.3.9.

Changes in version 2.1 (released September 2009)

  • Golly can download patterns, rules and scripts from various online archives. You can change the location of downloaded files using the new button at the bottom of Preferences > File.
  • Zip files can be opened and processed as described here.
  • If the mouse moves over a link in the help window then the link reference is displayed at the bottom of the window. Ditto for links in the Set Rule dialog.
  • The algorithm info in the Set Rule dialog can now be accessed from the new Algorithms help item.
  • Translucent buttons for speed/scale/scroll functions now appear in a corner of the viewport whenever the mouse moves over that corner. The initial location is the top left corner, but you can use Preferences > View to specify any other corner or disable the buttons.
  • Layer bar buttons now show each layer's name rather than its numeric position.
  • New rules: Codd2, Devore, DLA, Ed-rep, LifeHistory, Perrier, Sand.
  • New patterns in Other-Rules/, Other-Rules/Codd/, Other-Rules/Codd/Devore/, Other-Rules/Margolus/, Loops/.
  • New scripts: FredkinModN-gen.py, make-Devore-tape.py, Margolus/emulate-Margolus-table.py, Margolus/convert-MCell-string.py.
  • All Python scripts now need to explicitly import the golly module. This wasn't strictly necessary in previous versions, but only because it was an undesirable side-effect of the way Golly ran scripts.
  • The open command can now be used to run a given Perl/Python script.
  • New scripting commands: opendialog, savedialog, getclipstr, setclipstr, getdir, setdir.
  • The appdir and datadir commands are deprecated; use the new getdir command.
  • The color of dead cells (state 0) is now handled like all other states, so it's possible for each algorithm/rule to have a different background color.
  • The setcolors and getcolors commands can be used to set/get the color of state 0.
  • Golly restores a layer's default colors whenever you create a new pattern or open a pattern file (and not just if the algorithm or rule changes). If you have any scripts that use setcolors then make sure it is called after calling new/open.
  • The base step can now be changed temporarily via the new Set Base Step dialog in the Control menu. Golly will restore the default base step (set in Preferences > Control) when you create a new pattern, open a pattern file, or switch to a different algorithm.
  • The setbase command also changes the base step temporarily, so if you have any scripts that use setbase then make sure it is called after calling new/open/setrule/setalgo.
  • The setoption/getoption commands can use "drawingstate" to set/get the edit bar's current drawing state, and they can use "restoreview" to set/get the state of the "Reset/Undo will restore view" option set in Preferences > View.
  • Paste now supports "And" mode.
  • The RLE reader allows alphabetic characters other than "o" to represent live cells.
  • Menu items can show single-character keyboard shortcuts.
  • When a lexicon pattern is loaded, Golly automatically switches the current rule to B3/S23 (and changes the algorithm to QuickLife, if necessary).
  • Fixed a bug with Random Fill. Golly wasn't initializing the seed, so the internal rand() calls were returning the same sequence of "random" integers each time!
  • Fixed a bug that prevented the getkey command from returning uppercase letters.
  • Fixed oscar.pl/py to handle B0-and-not-S8 rules correctly (they no longer report some spaceships to be stable patterns).
  • Fixed a couple of bugs when duplicating a layer's undo/redo history.
  • Fixed crash in Mac app if a script saved a pattern and the progress dialog appeared.

Changes in version 2.0 (released December 2008)

  • Golly now supports multiple algorithms and multi-state universes (up to 256 states).
  • The Generations algorithm supports an entire family of new rules, including Brian's Brain (/2/3), Star Wars (345/2/4), and Transers (345/26/5).
  • The JvN algorithm implements John von Neumann's classic 29-state CA, plus a couple of 32-state variants created by Renato Nobili and Tim Hutton. See Patterns/JvN for a variety of self-replicators.
  • The RuleTable and RuleTree algorithms allow you to add new rules by creating .table and .tree files and storing them in the Rules folder or your rules folder. A number of example rules are supplied, including Langtons-Loops, Evoloop, LifeOnTheEdge and WireWorld.
  • The tool bar has a new button for switching algorithms, or you can use the Set Algorithm submenu in the Control menu. The Use Hashing option has been removed.
  • The Control > Set Rule dialog also has a menu for changing the current algorithm. A help button can be used to expand the dialog and display information about the current algorithm, along with examples of the rules it supports.
  • Golly can read some MCell files (if an algorithm supports the given rule).
  • The ten layer-specific colors have been replaced by a more flexible approach to cope with multi-state universes. Each algorithm has a default color scheme that can be changed in Preferences > Color.
  • Each algorithm also has a default set of icons, small bitmaps that are only drawn at scales 1:8 and 1:16, and only if the Show Cell Icons option (in the View menu) is ticked. The default icons can be changed by using the Load Icons button in Preferences > Color.
  • Rule-specific colors and icons can be created by adding suitably named .colors and .icons files to the Rules folder or your rules folder. Golly looks for these files whenever it switches to a new rule.
  • The Layer > Set Layer Colors dialog can change one or more colors used by the current layer (and its clones). These changes are temporary and only remain in effect while the layer exists, or until the layer's algorithm or rule changes.
  • The View > Swap Cell Colors option has been changed to Invert Colors.
  • New script commands have been added to support the above changes: setalgo, getalgo, numalgos, numstates, join, setcolors and getcolors.
  • Some script commands have been modified to handle multi-state patterns. Perl users should read the section on cell arrays. Python users should read the section on cell lists.
  • The getrule command now returns a canonical rule string.
  • The setcursor/getcursor commands now accept/return strings.
  • Modified oscar.pl to use arbitrarily big integers.
  • It's now possible to open a pattern or run a script from the Help window by clicking on special links. For example, open golly-ticker.rle or run bricklayer.py.
  • Diagonal scrolling is supported. Open Preferences > Keyboard and assign keys to the new scrolling actions: Scroll NE/NW/SE/SW.
  • A new check box in Preferences > View can tell Reset/Undo not to restore the view.
  • View > Show Edit Bar toggles the new edit bar. The cursor mode buttons have been moved from the tool bar into the edit bar.
  • View > Show All States toggles the display of colors and icons for all states in the current universe. A box is drawn around the current drawing state.
  • Help > File Formats describes the various file formats used by Golly.
  • Rendering speed in the Mac and Linux apps has been improved.
  • Fixed a problem with ampersands not being displayed in the recent pattern/script menus.
  • Fixed a bug in the Linux/GTK app if a recent pattern/script path contained an underscore.
  • The Linux and Win apps require Perl 5.10 or later to run .pl scripts (older Perl versions are not binary compatible).
  • The Linux/X11 app is no longer supported due to limitations in wxX11.

Changes in version 1.4 (released May 2008)

  • Editing and other actions are now allowed while generating a pattern.
  • Golly saves files in the standard user-specific data directory on each platform rather than in the application directory. However, you can still keep the GollyPrefs file in the application directory if you prefer that option.
  • Right-click or control-click on a pattern/script file to open the file in a text editor. Use the new button in Preferences > File to select your preferred text editor.
  • Pasting a clipboard pattern can now change to the specified rule, depending on the option set in Preferences > Edit.
  • The Preferences dialog can be opened from the help window by clicking on special links like the examples above.
  • Added Reset button to tool bar and Duplicate Layer button to layer bar.
  • A duplicated layer now gets a copy of the original layer's undo/redo history.
  • Improved the automatic detection of Perl/Python code used by Run Clipboard.
  • Added help command to open given HTML file in help window.
  • A warning is displayed if a bad rule string is detected while loading a pattern.
  • Added support for reading WinLifeSearch output.
  • An error message is displayed if you try to load a JPEG file.
  • Fixed some problems if you quit Golly while running a script.
  • Fixed problem shrinking selection while generating a pattern.
  • Fixed "Rules differ" warning when undoing/redoing generating changes using hashing.
  • Fixed problems with incorrect file selections in Win app's directory pane.
  • Fixed bug in Mac app's activate event handler.
  • Fixed bug in Linux/GTK app that prevented using shift-space as a keyboard shortcut.
  • Mac app allows option-E/I/N/U/` to be used as keyboard shortcuts.
  • Golly can be built for 64-bit platforms.

Changes in version 1.3 (released November 2007)

  • Added unlimited undo/redo; see the Edit Menu help for details. For consistency with Undo, the Reset item now restores the starting selection and layer name.
  • Keyboard shortcuts are now configurable using Preferences > Keyboard. Note that you can also specify key combinations to open a pattern, run a script, or show any HTML file in the help window.
  • Golly can be scripted using Perl; see the new Perl Scripting help.
  • Added pop-plot.pl/py to the Scripts folder for creating population plots.
  • The metafier.py script now creates the metafied pattern in a separate layer.
  • Added getstring command for getting user input via a dialog box (glife's getstring function still exists but is deprecated).
  • Added hash command to speed up oscar.pl/py.
  • The parse and transform commands have optional parameters.
  • A script is aborted if a progress dialog appears and you hit Cancel.
  • The Open/Run Recent submenus show relative paths for files inside the Golly folder.
  • Added a Clear Missing Files item to the Open/Run Recent submenus.
  • The Control menu's Go and Stop items have been replaced by a single Start/Stop item for consistency with the tool bar's start/stop button.
  • The Control menu has a Set Generation item for changing the generation count, or you can click in the "Generation=..." text in the status bar. Scripts can use the new setgen command.
  • Flip operations are much faster.
  • The About box uses Brice Due's Golly ticker.
  • Reduced chances of out-of-memory error while loading a large .mc file.
  • Fixed crash if a pattern update occurred while saving a .mc file.
  • Fixed bug pasting a macrocell pattern.
  • Fixed bug reading an empty macrocell pattern.
  • Fixed bug not marking a layer as modified after clearing the entire pattern.
  • Fixed bug if apostrophe was in Python script path or file name.
  • Fixed drawing problems on Mac OS 10.3.9.

Changes in version 1.2 (released April 2007)

  • Golly supports multiple layers; see the new Layer Menu help for details.
  • Added layer-related scripting commands. See heisenburp.py and envelope.py in the Scripts folder for how these commands can be used.
  • Added other useful scripting commands: exit, check and note.
  • The putcells command has optional parameters, including a new mode parameter.
  • Clicked lexicon patterns are loaded into a separate "lexicon" layer (and the clipboard is no longer changed).
  • If a pattern has been modified then its layer name is prefixed with an asterisk and a "save changes" dialog will appear before certain actions, such as opening a pattern file or quitting Golly. The dialog can be disabled via check boxes in Preferences > Layer.
  • Scrolling is optional if the pencil/cross/hand cursor is dragged outside the view window; see Preferences > Edit.
  • The hand cursor no longer has a pointing finger.
  • A .py file selected via Open Pattern is run as a script.
  • If golly-start.py exists in the same folder as the application then it is automatically executed when Golly starts up.
  • New tool bar buttons, including a single start/stop button.
  • Reset and Use Hashing can be selected while a pattern is generating.
  • Renamed Flip Up-Down to Flip Top-Bottom.
  • GTK app no longer does unnecessary buffered drawing.
  • X11 app has a vertical tool bar which can be toggled.
  • Mac app has a creator code (GoLy) and .mc/rle files are saved with an appropriate type and creator.
  • Fixed a bug if Win app given a long-running script on command line.
  • Fixed a bug in the advance and evolve commands if using hashing with Wolfram rule.
  • Fixed a delay bug.

Changes in version 1.1 (released November 2006)

  • Added Save Extended RLE option (initially ticked) to the File menu. An extended RLE file stores the pattern position and generation count (if > 0) so they can be restored when the file is loaded.
  • Macrocell files also store the generation count if > 0.
  • Non-extended RLE files are now loaded so that 0,0 is at the top left corner of the pattern rather than in the middle of the pattern.
  • Golly can read BMP/GIF/PNG/TIFF files and paste bitmap data. All non-white pixels become live cells.
  • Golly can read pattern files using David Bell's dblife format.
  • Starting patterns are saved in a temporary file rather than in memory. This is much faster when hashing (saving a macrocell file is very quick).
  • Random Fill is much faster in typical cases.
  • Escape key can be used to stop generating.
  • Numerous additions and updates to the pattern collection.
  • Added fuse-watcher.py, metafier.py and shift.py to the Scripts folder.
  • More mouse interaction is allowed while a script is running. A script can be aborted by clicking the stop button in the tool bar or by selecting Stop in the Control menu.
  • Resizing the help window no longer changes the scroll position.
  • Fixed a bug loading huge macrocell files.
  • Fixed an obscure bug in the non-hashing algorithm.
  • Path to Scripts folder is only added to Python's sys.path once.
  • Fixed rect bug in Scripts/glife/__init__.py (thanks to Dan Hoey).
  • Golly's code can be compiled with a Unicode build of wxWidgets.

Changes in version 1.0 (released June 2006)

  • Added Python script support; see the new Python Scripting help.
  • Golly is available for Linux/GTK.
  • Mac app is a Universal Binary (4 times faster on an Intel Mac).
  • Added ability to change various colors via Preferences > Color. The Black on White option has been replaced by Swap Cell Colors.
  • Increased the base step limit from 100 to 10,000.
  • Added Show Hash Info option to the Control menu.
  • Added Show Exact Numbers option to the View menu.
  • Save Pattern preserves comments when writing to an existing file.
  • Added tool bar buttons for toggling patterns and scripts.
  • Included the latest release of the Life Lexicon.
  • Renamed Flip Horizontally/Vertically to Flip Up-Down/Left-Right.
  • Fixed disabled menu item bug after closing a modal dialog on Mac OS 10.4.
  • Fixed a couple of rule-related bugs in the non-hashing algorithm.
  • Fixed crash due to very long rule strings.
  • Fixed paste positioning bugs at scale 1:2.
  • Fixed error if Win app is closed while script is running.
  • Fixed problem if Win app is closed when window(s) minimized.

Changes in version 0.95 (released January 2006)

  • Stephen Silver's Life Lexicon has been integrated into the help. Note that clicking on a lexicon pattern loads it into the Golly window.
  • Added an Open Recent submenu to the File menu.
  • Added Show Patterns and Change Folder to the File menu.
  • Added a Preferences dialog to the File menu (app menu on Mac).
  • Added more items to the Edit menu: Clear Outside, Shrink Selection, Random Fill, Flip Vertically, Flip Horizontally, Rotate Clockwise and Rotate Anticlockwise.
  • The clipboard pattern is displayed when pasting.
  • Pasting large, sparse patterns is much faster when using Or mode.
  • Added more items to the View menu: Fit Selection, Restore Origin and Set Scale.
  • The thumb scroll range is adjustable (see Preferences > View).
  • The Reset item now restores the rule, scale, location, step size and hashing option to the values they had at generation 0.
  • Removed Max Hash Memory from Control menu (now set in Preferences > Control).
  • The Rule dialog lets you select/add/delete named rules. If a rule has a name then it's shown in the main window's title bar.
  • Hit control-space to advance the selection, or shift-space to advance everything outside the selection. The generation count will not change.
  • The delete key is a shortcut for Clear, or shift-delete for Clear Outside.
  • F5 to F9 can be used to set cursor modes.
  • Hit "s" to shrink the selection and fit it in the current view.
  • Hit "0" to change the origin to the cell under the cursor.
  • Hit "9" to restore the true origin.
  • Hit "6" to set the scale to 1:16.
  • Hit "," to open the Preferences dialog.
  • If the help window is in front, hit "+" and "-" to change the font size.
  • While dragging the mouse to make (or modify) a selection, the escape key can be used to cancel the operation and restore the original selection.
  • The escape key can no longer be used to stop generating.
  • In zoom in/out mode, right-click or control-click zooms in the opposite direction.
  • The mouse wheel can be used for zooming, regardless of cursor mode.
  • Commas are used to make large status bar numbers more readable.
  • Fixed a hashing bug that could cause advancing by the wrong step.
  • Fixed a bug in Mac app when returning from full screen mode.
  • Fixed a bug in Win app that prevented space bar being used to stop generating.
  • Fixed Win app's cross cursor (now visible on a black background).

Changes in version 0.91 (released October 2005)

  • Return key can be used to start/stop generating.
  • Space bar can be used to stop generating.
  • Win app puts CR+LF in clipboard data.
  • Fixed occasional bug when +/- pressed while hashing.

Changes in version 0.9 (released October 2005)

  • Implemented pattern saving (as RLE or macrocell format).
  • Implemented cell editing and selecting.
  • Implemented scrolling via hand cursor.
  • Edit menu has a Cursor Mode submenu (items match new tool bar buttons).
  • Hit "c" to cycle through all cursors.
  • Win app can now read gzipped pattern files.
  • Can now display comments in pattern files.
  • Added Patterns folder to distribution.
  • Toggling the hashing option doesn't change the pattern or generation count.
  • The Reset item is smarter about restoring the starting pattern.
  • Fixed colored frame after dropping pattern file onto Mac app's main window.
  • Fixed horizontal scroll bar problem in Mac app's help window.
  • The help window's cursor now gets updated while generating.
  • Fixed problem with location of help window in X11 app.
  • Added limited clipboard support to X11 app.
  • Golly has a new app icon based on Galaxy, a period-8 oscillator.

Changes in version 0.2 (released July 2005)

  • Added support for B0 rules.
  • Golly comes to the front after dropping a pattern file onto main window.
  • The help window can move behind the main window in Win/X11 apps.
  • Text in the help window can be selected and copied to the clipboard.
  • Fixed keyboard shortcuts in the help window.
  • Fixed RLE rule problem in Mac app.
  • Fixed menu and tool bar update problems in Mac/Win apps.
  • Fixed some cosmetic problems in Win app.

Initial version 0.1 released July 2005 golly-2.5-src/Help/control.html0000644000175100001440000002317512156145314013461 00000000000000 Golly Help: Control Menu

Start/Stop Generating

Starts or stops generating the current pattern. This item can also be used to stop a running script, but it's much easier to hit escape or click the tool bar's stop button.

Next Generation

Advances the pattern to the next generation. Note that you can hit control-space to advance only the current selection, or shift-space to advance everything outside the selection (in both cases the generation count will not change).

Next Step

Advances the pattern to the next step. The current step size is displayed in the status bar as a number of the form "b^e" where b is the base step and e is the exponent. The base step can be changed by the Set Base Step dialog (see below), and the exponent can be changed by the Faster/Slower items (see below).

Reset

Restores the starting pattern and generation count. It also resets the algorithm, rule, scale, location, step size, selection and layer name to the values they had at the starting generation. The starting generation is typically zero, but it can be larger after loading an RLE/macrocell file that stores a non-zero generation count.

Set Generation...

Opens a dialog to change the generation count. You can enter readable numbers like "1,234,567", or include a leading +/- sign to specify a number relative to the current generation count.

Faster

Increases the step exponent in the status bar by 1. This increases the speed by displaying fewer generations. The step exponent is reset to 0 when you create a new pattern, load a pattern file, or switch to a different algorithm.

Slower

Decreases the step exponent in the status bar by 1. This decreases the speed by displaying more generations. The step exponent is reset to 0 when you create a new pattern, load a pattern file, or switch to a different algorithm. If the exponent is 0 when you select this item then a small delay will occur between each generation. Further slowing will double the delay until a maximum value is reached. Use Preferences > Control to set the minimum and maximum delay times.

Set Base Step...

Opens a dialog to change the current base step, but only temporarily. Golly will restore the default base step (set in Preferences > Control) when you create a new pattern, load a pattern file, or switch to a different algorithm. The base step can be any number from 2 to 10,000 (but be aware that Golly's hashing algorithms are most efficient when the base step is a power of 2).

Auto Fit

If ticked then Golly will automatically fit a generating pattern inside the view if any part of the pattern moves out of view. This option is only used when doing many generations via Start or Next Step (that's why it's in the Control menu rather than the View menu), or when displaying patterns in a timeline (see Show Timeline).

Note that if you are generating a pattern and decide to change scale or do any sort of scrolling then the Auto Fit option is automatically turned off (the assumption being that you now want manual control over the scale and/or location).

TIP: If you find the Auto Fit option too confusing then leave it off and hit "f" to manually fit the pattern inside the view whenever you like.

Hyperspeed

If ticked, and the current algorithm uses hashing, then Golly will automatically increase the step exponent at regular intervals (every 64 steps). Hyperspeed mode is a convenient way to run a complex pattern as far as possible. (For very chaotic patterns, using QuickLife may actually run it further.) For highly regular patterns, hyperspeed mode quickly "runs away", generating exponentially fast.

Show Hash Info

Tick this option to turn on status messages that inform you when a hashing algorithm is doing garbage collection, resizing its internal hash table, or changing the step size (which can involve walking the entire hash). The garbage collection messages say which garbage collection it is overall, and if it is a subsequent garbage collection for the same step (the count will be in parentheses), and the percentage of memory reclaimed.

Interpreting these numbers is more an art than a science because some patterns exhibit odd behavior, but in general, if a garbage collection is reclaiming less than 70% of the total memory, or more than ten garbage collections occur for a single step, you can be fairly certain that the algorithm is effectively stalled and further progress will be extremely slow. Reducing the step size may help, but it may need to be reduced substantially in order to have an impact. Increasing the maximum memory that the algorithm can use may also help.

Start/Stop Recording

This item lets you start recording a new timeline (if none exists), or extend an existing timeline (always from its final frame). Golly will proceed to generate and save (in memory) a sequence of patterns separated by the current step size.

If a timeline is being recorded then this item will stop the recording. Note that it's probably easier to click on the start/stop button in the timeline bar (use Show Timeline in the View menu to show/hide this bar). Recording will also stop if you hit the escape key, or if the maximum number of frames is reached (32,000).

A lot of Golly's functionality is disabled while a timeline exists (which includes when it's being recorded). For example, you can't do any editing or generating, nor can you change the current algorithm, rule or step size. You can however do the usual zooming and panning, and you can add/delete/switch layers (each non-cloned layer has its own separate timeline). You can also make selections, but only the last selection is remembered when the timeline is deleted.

Delete Timeline

Deletes the existing timeline. The currently displayed frame becomes the current generation (any later frames are lost), but Golly saves the first frame of the timeline so you can Reset/Undo back to that generation.

Set Algorithm

This submenu lets you switch algorithms. Note that changing the current algorithm can change the current rule. If the new algorithm doesn't support the current rule then Golly will switch to the new algorithm's default rule. If a pattern exists then some cell states might have to be modified if the new universe has fewer states than the old universe.

Golly assigns a different status bar color to each algorithm to give you some feedback about which algorithm is currently in use. You can use Preferences > Color to change these colors.

Most of Golly's algorithms (all except QuickLife) use a hashing technique to generate patterns. This method performs brilliantly on patterns that have a lot of regularity in time or space. Conversely, it can perform very poorly on chaotic patterns. A hashing algorithm may initially appear to be slow, but as the hash table fills up with knowledge about the pattern, it will run faster and faster, so be patient.

Use Preferences > Control to set the maximum amount of hash memory for each algorithm. The initial setting is 500MB. The higher you set the memory limit, the larger patterns you can run and the farther and faster you can run them. However, setting this limit high also increases the amount of time required to change the step size (both manually and in hyperspeed mode) and increases the length of the garbage collection pauses. Nonetheless, it is generally best to set this quite high — typically 80% of the amount of physical memory in your computer. Setting this number high enough often makes more than a difference of 1000 in performance. How high is high enough depends greatly on the pattern and the step size, however, in unpredictable ways.

Set Rule...

Opens a dialog to change the current rule (which is displayed inside square brackets in the main window's title bar). The dialog also allows you to change the current algorithm — if the current rule is not valid in the new algorithm then the algorithm's default rule will be used.

A help button can be used to expand the dialog and display information about the current algorithm along with examples of the rules it supports. If you click on one of the special rule links then the rule string is automatically pasted into the new rule box. Another way to enter a new rule is to choose one from the list of named rules. You can add your own names to this list.

By default, all algorithms create an unbounded universe, but it's also possible to create a bounded universe by adding a special suffix to the usual rule. See here for details.

Convert Old Rules

Converts any .table/tree/colors/icons files into corresponding .rule files (but existing .rule files will not be changed). Golly looks in the supplied Rules folder first, then in your rules folder. The results are displayed in the help window. If the conversion succeeds you'll be asked if you want to delete the .table/tree/colors/icons files. golly-2.5-src/Help/credits.html0000644000175100001440000000513412156145314013431 00000000000000 Golly Help: Credits

The pioneers

First and foremost, a big thanks to John Conway for creating the Game of Life, and to Martin Gardner for popularizing the topic in his Scientific American column.

The programmers

Tom Rokicki wrote most of the complicated stuff. Golly is essentially the merging of two of Tom's programs (hlife and qlife). The HashLife algorithm is based on an idea by Bill Gosper. The QuickLife algorithm uses some ideas from Alan Hensel. David Eppstein provided the idea on how to emulate B0 rules.

Andrew Trevorrow wrote the cross-platform GUI code using wxWidgets. Much thanks to Julian Smart and all the other wxWidgets developers.

Golly's scripting capabilities were inspired by the generosity and efforts of Eugene Langvagen (author of PLife), Larry Wall (creator of Perl) and Guido van Rossum (creator of Python).

Tim Hutton wrote the RuleTable algorithm (now merged into the RuleLoader algorithm) and created the excellent Rule Table Repository.

Various code improvements have been contributed by Dave Greene, Jason Summers, Maks Verver and Robert Munafo.

If you'd like to join us and help make Golly the best Life/CA app in the known universe then please get in touch.

The beta testers

Thanks to all the bug hunters for their reports and suggestions, especially Dave Greene, Gabriel Nivasch, Dean Hickerson, Brice Due, David Eppstein, Tony Smith, Alan Hensel, Dennis Langdeau, Bill Gosper, Mark Jeronimus and Eric Goldstein.

Other contributors

Dave Greene and Alan Hensel helped put together the pattern collection. Thanks to everybody who allowed us to distribute their fantastic patterns, especially Nick Gotts, Gabriel Nivasch, David Eppstein, Jason Summers, Stephen Morley, Dean Hickerson, Brice Due, William R. Buckley, David Moore, Mark Owen, Tim Hutton, Renato Nobili and Adam P. Goucher.

Thanks to Stephen Silver for compiling the wonderful Life Lexicon.

Thanks to Nathaniel Johnston for creating the brilliant LifeWiki and for making its patterns available to Golly users via an online archive. golly-2.5-src/Help/edit.html0000644000175100001440000001375212156145314012726 00000000000000 Golly Help: Edit Menu

Undo

Lets you undo one or more recent changes, including all editing changes and generating changes, as well as changes to the selection, rule, hashing state and layer name. The number of changes you can undo is limited only by available memory and disk space. Multiple changes made by a script are treated like a single change and will be undone all at once.

Each layer maintains its own undo/redo history (but cloned layers share the same undo/redo history). The current layer's undo/redo history is automatically cleared after creating a new pattern or opening a pattern file.

Redo

Lets you redo one or more recently undone changes. Note that the redo history is automatically cleared after you make a new change; i.e., if you do something like rotate the current selection, undo the rotation, then edit some cells or change the selection, you can no longer redo the rotation.

Disable Undo/Redo

If ticked then the Undo and Redo items are disabled, and any existing undo/redo history for the current layer is cleared. When editing or generating a very large pattern you may want to temporarily disable undo/redo to speed up some operations. But be careful using this feature — if you switch to another layer when this item is ticked then that layer's undo/redo history is also cleared.

Cut

Copies the pattern in the current selection to the clipboard (in RLE format) and then kills all cells in the selection.

Copy

Copies the pattern in the current selection to the clipboard. The clipboard data is in RLE format.

Clear

Kills all cells in the current selection.

Clear Outside

Kills all cells outside the current selection. This is often the quickest way to delete escaping gliders.

Paste

Pastes a pattern stored in the clipboard into the existing pattern. After selecting this item you'll be asked to click where you want the paste to occur. Before clicking you can use keyboard shortcuts to scroll, change scale, etc. The keyboard shortcuts normally used to flip/rotate the selection will instead modify the paste pattern. You can also type "M" to change the paste mode or "L" to change the paste location (see below). To cancel the paste, just click anywhere outside the view area or hit the escape key.

Settings in Preferences > Edit specify how to handle rule information in the clipboard pattern. You can tell Golly not to change the current rule, or only change the rule if the universe is empty, or always change to the given rule. Note that a rule change might cause the current algorithm to change.

The References section has links to a number of good sources for clipboard patterns.

If the clipboard text starts with "@RULE rulename" then Golly will save the text as rulename.rule in your rules folder (set in Preferences > Control) and switch to that rule.

Paste Mode

This submenu lets you choose the logical function used when pasting in a clipboard pattern. The choices are Copy, Or and Xor. Typing "M" will cycle through all these modes, even after selecting the Paste command.

Paste Location

This submenu lets you choose the location of the cursor within the paste rectangle that appears after selecting the Paste command. You can choose any corner or the middle of the rectangle. Typing "L" will cycle through all possible locations, even after selecting the Paste command.

Paste to Selection

Pastes a clipboard pattern into the current selection, but only if it will fit. The paste always occurs at the top left corner of the selection. This command can be used as a quick check to see if the pattern in the clipboard matches the pattern in the selection — if Xor paste mode is used then all the resulting cells will be dead if the patterns match.

Select All

Selects the entire pattern, assuming there are one or more live cells. If there are no live cells then any existing selection is removed.

Remove Selection

Removes the current selection (without changing any cell states).

Shrink Selection

Reduces the size of the current selection to the smallest rectangle containing all of the selection's live cells. You can hit "s" to shrink the selection and fit it in the current view.

Random Fill (n%)

Randomly fills the current selection with the indicated percentage of live cells. Use Preferences > Edit to change the percentage (from 1 to 100).

Flip Top-Bottom

The cells in the current selection are reflected about its central horizontal axis.

Flip Left-Right

The cells in the current selection are reflected about its central vertical axis.

Rotate Clockwise

The current selection is rotated 90 degrees clockwise about its center.

Rotate Anticlockwise

As above, but the rotation is anticlockwise.

Cursor Mode

This submenu lets you choose a cursor mode for various editing operations: drawing cells, picking cell states, selecting cells, moving the view, and zooming into or out from a clicked cell. There are other (quicker) ways to change the cursor mode:

  • Click on the corresponding buttons in the edit bar.
  • Hit the corresponding function keys (F2 to F7).
  • Hit "c" to cycle through all the cursor modes.
  • Press the shift key to temporarily toggle the draw/pick cursors or the zoom in/out cursors.
golly-2.5-src/Help/file.html0000644000175100001440000001474012156145314012716 00000000000000 Golly Help: File Menu

New Pattern

Creates a new, empty universe and switches to a scale suitable for editing cells. Use Preferences > File to set the scale (initially 1:32), the cursor mode, and whether any selection should be removed.

Open Pattern...

Opens the standard file browser so you can select a pattern file. Golly can read all the common pattern formats: RLE, PC Life 1.05/1.06, dblife, some MCell files, and text patterns like "ooo...ooo". It can also read patterns in a "macrocell" format which allows huge, highly repetitive patterns to be stored in a very compact way. Such files usually have a .mc extension. If a .mc file contains timeline data then Golly will load all the frames and automatically show the timeline bar.

All the above formats are text based and can have DOS/Mac/Unix line endings, or they can be compressed in a .gz file.

Golly can also read graphic files in a number of popular formats: BMP, GIF, PNG and TIFF. The file name must end with an appropriate extension: .bmp, .gif, .png, .tif or .tiff. All the pure white pixels (RGB = 255,255,255) are treated as cells of state 0. All other pixels are treated as cells of state 1. This can be handy if you prefer to use a sophisticated drawing program to create your patterns.

Use Preferences > File to set the cursor mode, and whether any selection should be removed.

Open Clipboard

Opens a pattern stored in the clipboard. The References section has links to a number of good sources for clipboard patterns.

If the clipboard text starts with "@RULE rulename" then Golly will save the text as rulename.rule in your rules folder (set in Preferences > Control) and switch to that rule.

Open Recent

This submenu lets you open a recently loaded pattern file. The most recent file is always at the top. The maximum number of pattern files remembered is determined by a setting (initially 20) which you can change in Preferences > File.

Show Patterns

if ticked then a scrollable pattern folder is displayed next to the viewport. Clicking on a pattern file will load it in. The initial pattern folder is the Patterns collection supplied with Golly. If you have your own collection then use Set Pattern Folder (see below) to select a different folder.

Set Pattern Folder...

Lets you change the pattern folder displayed by Show Patterns (see above).

Save Pattern...

Opens the standard file saving dialog so you can save the current pattern in RLE format (but only if all live cells are within coordinates of +/- 1 billion), or in macrocell format if the current algorithm supports hashing (all algorithms except QuickLife). Note that if a timeline exists when you save a .mc file then all the frames will be stored in the file.

You also have the option of saving patterns as compressed files (.rle.gz or .mc.gz).

Save Extended RLE

If ticked, Golly will include additional information whenever it saves a pattern in an RLE file via the above Save Pattern item or the save/store script commands. The pattern's position is recorded, along with the current generation count if it's greater than zero. This allows Golly to restore the pattern's position and generation count when the file is loaded at a later date. The extra information is stored in a special "#CXRLE" comment line at the start of the file. Because it's a comment, other RLE-reading programs should have no problem loading such files.

Note that if the current grid is bounded (ie. has a finite width or height) then Golly ignores this item's setting and always records the pattern's position so it can be restored when the file is loaded.

Run Script...

Opens the standard file browser so you can run a selected Perl or Python script. Such scripts can be used to automate or extend Golly's user interface, or to construct complex patterns. A number of sample scripts are provided in the Scripts folder. More details about Golly's scripting capabilities can be found in the Perl Scripting and Python Scripting help topics.

Run Clipboard

Runs the Perl or Python script stored in the clipboard.

Run Recent

This submenu lets you run a recently executed script file. The most recent script is always at the top. The maximum number of scripts remembered is determined by a setting (initially 20) which you can change in Preferences > File.

Show Scripts

if ticked then a scrollable script folder is displayed next to the viewport. Clicking on a Perl or Python script file will execute it. The initial script folder is the Scripts folder supplied with Golly. If you want to write your own scripts then best to do so in a new folder and use Set Script Folder (see below) to select that folder.

Set Script Folder...

Lets you change the script folder displayed by Show Scripts (see above).

Preferences...

Opens the Preferences dialog so you can change various settings. All your settings are stored in a file called GollyPrefs. This file is initially saved in a user-specific data directory:

On Linux: ~/.golly/
On Mac: ~/Library/Application Support/Golly/
On Windows: C:\Documents and Settings\username\Application Data\Golly\

You might prefer to move GollyPrefs into the same folder as the application. This allows multiple copies of Golly to have their own set of preferences.

Notes for Mac users: On the Mac, the Preferences item is in the application menu, not the File menu. On newer Macs the ~/Library folder might be invisible, so to get access to GollyPrefs just use the "Go to Folder..." command in the Finder's Go menu and type in "~/Library/Application Support/Golly". golly-2.5-src/Help/formats.html0000644000175100001440000011735112156145314013454 00000000000000 Golly Help: File Formats

Here are the important file formats used by Golly:

Extended RLE format (.rle)
Macrocell format (.mc)
Rule format (.rule)
     @RULE
     @TABLE
     @TREE
     @COLORS
     @ICONS
          Specifying icons using XPM
          Grayscale icons or multi-color icons
          Requesting built-in icons
          Tools for creating icons
     How Golly finds .rule files
     Related rules can share colors and/or icons
     How to override a supplied or built-in rule
     The easy way to install a new .rule file
     Deprecated files (.table, .tree, .colors, .icons)
Zip files (.zip)

 
Extended RLE format

Golly prefers to store patterns and pattern fragments in a simple concise textual format we call "Extended RLE" (it's a modified version of the RLE format created by Dave Buckingham). The data is run-length encoded which works well for sparse patterns while still being easy to interpret (either by a machine or by a person). The format permits retention of the most critical data:

  • The cell configuration; ie. which cells have what values.
  • The transition rule to be applied.
  • Any comments or description.
  • The generation count.
  • The absolute position on the screen.

Golly uses this format for internal cuts and pastes, which makes it very convenient to move cell configurations to and from text files. For instance, the r-pentomino is represented as

x = 3, y = 3, rule = B3/S23
b2o$2o$bo!

I just drew this pattern in Golly, selected the whole thing, copied it to the clipboard, and then in my editor I did a paste to get the textual version. Similarly, data in this format can be cut from a browser or email window and pasted directly into Golly.

RLE data is indicated by a file whose first non-comment line starts with "x". A comment line is either a blank line or a line beginning with "#". The line starting with "x" gives the dimensions of the pattern and usually the rule, and has the following format:

x = width, y = height, rule = rule

where width and height are the dimensions of the pattern and rule is the rule to be applied. Whitespace can be inserted at any point in this line except at the beginning or where it would split a token. The dimension data is ignored when Golly loads a pattern, so it need not be accurate, but it is not ignored when Golly pastes a pattern; it is used as the boundary of what to paste, so it may be larger or smaller than the smallest rectangle enclosing all live cells.

Any line that is not blank, or does not start with a "#" or "x " or "x=" is treated as run-length encoded pattern data. The data is ordered a row at a time from top to bottom, and each row is ordered left to right. A "$" represents the end of each row and an optional "!" represents the end of the pattern.

For two-state rules, a "b" represents an off cell, and a "o" represents an on cell. For rules with more than two states, a "." represents a zero state; states 1..24 are represented by "A".."X", states 25..48 by "pA".."pX", states 49..72 by "qA".."qZ", and on up to states 241..255 represented by "yA".."yO". The pattern reader is flexible and will permit "b" and "." interchangeably and "o" and "A" interchangeably.

Any data value or row terminator can be immediately preceded with an integer indicating a repetition count. Thus, "3o" and "ooo" both represent a sequence of three on cells, and "5$" means finish the current row and insert four blank rows, and start at the left side of the row after that.

The pattern writer attempts to keep lines about 70 characters long for convenience when sharing patterns or storing them in text files, but the reader will accept much longer lines.

If the File menu's "Save Extended RLE" option is ticked then comment lines with a specific format will be added at the start of the file to convey extra information. These comment lines start with "#CXRLE" and contain keyword/value pairs. The keywords currently supported are "Pos", which denotes the absolute position of the upper left cell (which may be on or off), and "Gen", which denotes the generation count. For instance,

#CXRLE Pos=0,-1377 Gen=3480106827776

indicates that the upper left corner of the enclosing rectange is at an X coordinate of 0 and a Y coordinate of -1377, and that the pattern stored is at generation 3,480,106,827,776.

All comment lines that are not CXRLE lines, and occur at the top or bottom of the file, are treated as information lines and are displayed when the user clicks the "information" button in Golly's tool bar. Any comment lines interspersed with the pattern data will not be displayed.

 
Macrocell format

The size of an Extended RLE file is frequently proportional to the number of cells it contains, yet Golly supports universes that can contain trillions of cells or more, using hashlife-based algorithms. The storage of these huge universes, for which Extended RLE is not feasible, is done by essentially dumping the in-memory compressed representation of the universe in "Macrocell format". Since little translation need be done between external and internal representation, this format is also used to store backups of universes at certain points in Golly's operation when using one of the hashlife-based algorithms.

The macrocell format has two parts: the header, and the tree. The first portion of the file is the header; this contains the format identifier, the rule, the generation count (if non-zero), and any comments associated with this file. The format identifier is a line that starts with "[M2]" and contains the name and version of the program used to write it:

[M2] (golly 2.0)

Following this is any comment lines, which are lines that begin with '#'. If the first two characters of a line are '#R', then the remainder of the line (after intervening whitespace) is the rule for the pattern. If the first two characters are '#G', then the remainder of the line is the current generation count. Any other line starting with a '#' is treated as an ordinary comment line.

Following the header is is a child-first textual representation of a canonicalized quadtree. Each line is either a leaf node, or a non-leaf node. For two-state algorithms, the leaf nodes contain an 8x8 pixel array in a simplified raster format, left-to-right, then top-down, with "." representing an empty cell, "*" representing a live cell, and "$" representing the end of line; empty cells at the end of each row are suppressed. No whitespace is permitted; lines representing leaf nodes for two-state algorithms are recognized because they start with ".", "*", or "$". A sample leaf node containing a glider is:

$$..*$...*$.***$$$$

For algorithms with more than two states, leaf nodes represent a two-by-two square of the universe. They contain five integers separated by single spaces; the first integer is 1, and the next four are the state values for the northwest, northeast, southwest, and southeast values of the square.

Nodes with children are represented by lines with five integers. The first integer is the logarithm base 2 of the size of the square this node representes; for two-state patterns, this must be 4 or larger; for multi-state patterns, this must be 2 or larger. The next four values are the node numbers of the northwest, northeast, southwest, and southeast child nodes. Each of these child nodes must be the appropriate size; that is, a square one fourth the area of the current node.

All nodes, both leaf and non-leaf, are numbered in the order they occur in the file, starting with 1. No node number can point to a node that has yet been defined. The special node number "0" is used to represent all squares that have no live cells.

The total universe represented by a macrocell file is that of the last node in the file (the root node), which also must be the single node with the largest size. By convention, the upper left cell of the southeast child of the root node is at coordinate position (x=0,y=1).

Macrocell files saved from two-state algorithms and from multi-state algorithms are not compatible.

 
Rule format

A .rule file contains all the information about a rule: its name, documentation, table/tree data (used by the RuleLoader algorithm), and any color/icon information. The .rule format is textual and consists of one or more sections. Each section starts with a line of the form @XXX... where X is an uppercase letter. If there is more than one section with the same name then only the first one is used. Any unrecognized sections are silently ignored (this will allow us to add new sections in the future without breaking old versions of Golly).

The currently recognized sections are described below. You might like to refer to WireWorld.rule while reading about each section.

 
@RULE

This is the only mandatory section. The first line of a .rule must start with @RULE followed by a space and then the rule name. For example:

@RULE WireWorld

The supplied rule name must match exactly the name of the .rule file. This helps Golly to avoid problems that can occur on case-sensitive file systems. When naming a new rule it's best to stick to the following conventions, especially if you'd like to share the .rule file with other Golly users:

  • Please capitalize all rule names and create files like Foo.rule rather than foo.rule. This helps to emphasize that rule names are important, especially on case-sensitive file systems. If the rule "foo" is specified inside a .rle or .mc file then Golly won't be able to find Foo.rule on a case-sensitive system like Linux.
  • To allow for possible future extensions in the way Golly handles rule names, it's best to use only letters and digits. Hyphens and underscores are also okay if you need some sort of separator. Hyphens can allow a set of related rules to share colors and/or icons (see below). Note in particular that spaces and colons must not be used.

After the @RULE line and before the next section (or end of file) you can include any amount of arbitrary text, so this is the place to include a description of the rule or any other documentation. If the .rule file has a @TREE section then this is a good place to put the Python transition function that was used to create the tree data.

 
@TABLE

This section is optional. If present, it contains a transition table that can be loaded by the RuleLoader algorithm. The contents of this section is identical to the contents of a .table file. A detailed specification of the .table format is available here. This is a simple example:

# Signals (2/3) pass alongside a wire (1):
n_states:4
neighborhood:vonNeumann
symmetries:rotate4
var a={2,3}
var b={2,3}
var c={2,3}
a,0,b,1,c,b

Empty lines and anything following the hash symbol "#" are ignored. The following descriptors must appear before other content:

  • n_states: specifies the number of states in the CA (from 0 to n_states-1 inclusive).
  • neighborhood: specifies the cell neighborhood for the CA update step. Must be one of: vonNeumann, Moore, hexagonal, oneDimensional.
  • Other neighborhoods are supported through emulation, using RuleTableToTree.py, see the RoadMap for a full list.
  • symmetries: can be none, permute or one of the symmetries supported for the neighborhood you have chosen. For a full list, see the RoadMap.

After the descriptors comes the variables and transitions. Each variable line should follow the form given in the above example to list the states. Variables should appear before the first transition that uses them. Variables can be used inside later variables.

Transition lines should have states or variables separated by commas. If there are no variables and n_states is less than 11 then the commas can be omitted. Only one transition (or variable) should appear on each line. Inputs are listed in the order C,N,E,S,W,C' for the von Neumann neighborhood, C,N,NE,E,SE,S,SW,W,NW,C' for the Moore neighborhood, C,N,E,SE,S,W,NW,C' for the hexagonal neighborhood, and C,W,E,C' for the oneDimensional neighborhood.

Where the same variable appears more than once in a transition, it stands for the same state each time. For example, the transition in the example above expands to the following: 20212->2, 20213->2, 20312->3, 20313->3, 30212->2, 30213->2, 30312->3, 30313->3, and all 90-degree rotations of those (because of the rotate4 symmetry).

A transition can have a variable as its output (C') if that variable appears more than once in the transition (as in the example above), so that it has a definite value.

Rule tables usually don't specify every possible set of inputs. For those not listed, the central cell remains unchanged.

Transition rules are checked in the order given — the first rule that matches is applied. If you want, you can write rules in the form of general cases and exceptions, as long as the exceptions appear first.

(This form of CA rule table representation was inspired by that in Gianluca Tempesti's PhD thesis: http://lslwww.epfl.ch/pages/embryonics/thesis/AppendixA.html.)

If you have a C/C++ implementation of a transition function, there is a way to automatically produce a rule table. See Rules/TableGenerators/make-ruletable.cpp for instructions.

To share your rule tables with others, you can archive them at the public Rule Table Repository.

 
@TREE

This section is optional. If present, it contains a rule tree that can be loaded by the RuleLoader algorithm. (If the .rule file also contains a @TABLE section, RuleLoader will use the first one it finds.) The contents of this section is identical to the contents of a .tree file.

A detailed description of a rule tree is provided below, but most people don't need to know these details because Golly provides a number of tools for creating rule trees. The make-ruletree.py script in Scripts/Python/Rule-Generators can convert a Python transition function (passed via the clipboard) into a rule tree. The script will either create a new .rule file or update the @TREE section in an existing .rule file. Another script, RuleTableToTree.py, does much the same job using a requested .table file as input.

Golly also includes programs that permit you to transform a given transition function in C++, Perl, or Java into a .tree file (see Rules/TreeGenerators) if the number of states is sufficiently small (approximately 10 states for eight-neighbor rules, and 32 states for four-neighbor rules). The contents of the .tree file can then be copied into the @TREE section of your .rule file.

Essentially, the tree format allows you to add your own rules to Golly without needing to know how to recompile Golly and without dealing with the intricacies of external libraries; it generates relatively compact files, and the data structure is designed for very fast execution.

A rule tree is nothing more than a complete transition table for a rule, expressed in a compressed, canonicalized tree format. For an n state rule, each tree node has n children; each child is either another tree node or a next state value. To look up a function of m variables, each of which is a state value, you start at the root node and select the child node corresponding to the value of the first variable. From that node, you select the child node corresponding to the value of the second variable, and so on. When you finally look up the value of the final variable in the last node, the result value is the actual next state value, rather than another node.

The tree format has fixed the order of variables used for these lookups. For a four-neighbor rule, the order is always north, west, east, south, center; for an eight-neighbor rule, the order is always northwest, northeast, southwest, southeast, north, west, east, south, center.

Without compression, for an n-state rule, there would be a total of 1+n+n^2+n^3+n^4 nodes for a four-neighbor rule, and 1+n+...+n^8 for an eight-neighbor rule; this could quickly get unmanageable. Almost all rules show significant redundancy, with identical rows in the transition table, and identical nodes in the rule tree. To compress this tree, all we do is merge identical nodes, from the bottom up. This can be done explicitly as we construct the tree from a transition function (see Rules/TreeGenerators/RuleTreeGen.java) or symbolically as we evaluate a more expressive format.

The tree format itself is simple, and has similarities to the macrocell format. It is not intended for human authorship or consumption. The tree format has two parts: a header, and the rule tree itself. The header consists of comments (lines starting with a "#") that are ignored, and three required parameter values that must be defined before the first tree node. These values are defined, one per line, starting with the parameter name, then an equals sign, and finally an integer value. The three parameters are num_states, which must be in the range 2..256 inclusive, num_neighbors, which must be 4 or 8, and num_nodes, which must match the number of node lines.

The tree is represented by a sequence of node lines. Each node line consists of exactly num_states integers separated by single spaces. The first integer of each node line is the depth of that node, which must range from 1..num_neighbors+1. The remaining integers for nodes of depth one are state values. The remaining integers for nodes of depth greater than one are node numbers. Nodes are numbered in the order they appear in the file, starting with zero; each node must be defined before its node number is used. The root node, which must be the single node at depth num_neighbors+1, must be the last node defined in the file.

 
@COLORS

This section is optional and can be used to specify the RGB colors for one or more states using lines with 4 numbers, like these:

0  48  48  48   dark gray
1   0 128 255   light blue
2 255 255 255   white
3 255 128   0   orange

Golly silently ignores any states that are invalid for the rule. To specify a color gradient for all live states (all states except 0) you can use a line with 6 numbers, like this:

0 0 255  255 0 0   blue to red

In both cases, any text after the final number on each line is ignored. Blank lines or lines starting with "#" are also ignored.

Note that a .rule file is loaded after switching to the current algorithm's default color scheme, so you have the choice of completely changing all the default colors, or only changing some of them. Use Preferences > Color to change the default colors for each algorithm.

 
@ICONS

This section is optional and can be used to override the default icons displayed for this rule (when Golly is in icon mode).

 
Specifying icons using XPM

Icon bitmaps can be specified using a simple subset of the XPM format. Here's a small example that describes two 7x7 icons suitable for a 3-state rule (icons are never used for state 0):

XPM
/* width height num_colors chars_per_pixel */
"7 14 2 1"
/* colors */
". c #000000"
"A c #FFFFFF"
/* icon for state 1 */
"A......"
".A....."
"..A...."
"...A..."
"....A.."
".....A."
"......A"
/* icon for state 2 */
"......A"
".....A."
"....A.."
"...A..."
"..A...."
".A....."
"A......"

Any blank lines or lines starting with "#" or "/" are ignored. A line with XPM by itself indicates the start of a set of icon bitmaps at a particular size. The @ICONS section can contain any number of XPM subsections, and their order is not important. Three different icon sizes are currently supported: 7x7, 15x15 and 31x31 (for displaying at scales 1:8, 1:16 and 1:32 respectively). Any missing icon sizes will be created automatically by scaling a supplied size. Scaled icons can look rather ugly, so if you want good looking icons it's best to supply all three sizes.

After seeing an XPM line, Golly then looks for lines containing strings delimited by double quotes. The first double quote must be at the start of the line (any text after the second double quote is ignored). The first string contains crucial header information in the form of 4 positive integers:

  • The 1st number is the bitmap's width which also defines the icon size. If it is not 7, 15 or 31 then Golly simply ignores the rest of the XPM data. (This provides upward compatibility if we ever decide to support more sizes.)
  • The 2nd number is the bitmap's height. This must be an integer multiple of the width — the number of icons is the height divided by the width.
  • The 3rd number is the total number of different colors used in the bitmap. After the first string comes the strings that specify each color.
  • The 4th number is the number of characters used to specify each pixel and must be 1 or 2. After the color strings comes the strings with the pixel data for each row of the bitmap. Each such string should contain width × chars_per_pixel characters.

The total number of strings after the XPM line should be 1 + num_colors + height. You'll get an error message if there aren't enough strings. Any extra strings are ignored.

The 1st icon specified is for state 1, the 2nd is for state 2, etc. If the number of icons supplied is fewer than the number of live states then the last icon is automatically duplicated. If there are more icons than required then the extra icons are simply ignored.

 
Grayscale icons or multi-color icons

Golly recognizes two types of icons: grayscale or multi-color. Grayscale icons only use shades of gray (including black and white), as in the above example. Any black areas will be transparent; ie. those pixels will be replaced by the color for state 0. White pixels will be replaced by the color for the cell's current state. Gray pixels are used to do anti-aliasing; ie. the darker the gray the greater the transparency. Using grayscale icons minimizes the amount of XPM data needed to describe a set of icons, especially if the icons use the same shape for each state (as in WireWorld.rule).

If a set of icons contains at least one color that isn't a shade of gray (including black or white) then the icons are said to be multi-colored. Any black pixels are still converted to the state 0 color, but non-black pixels are displayed without doing any substitutions.

If you want to use multi-colored icons then you'll probably want a @COLORS section as well so that the non-icon colors match the icon colors as closely as possible. For example, if the icon for state 1 consists of red and blue triangles then it would be best to set the color of state 1 to purple in the @COLORS section. This minimizes "color shock" when switching between icon and non-icon display mode.

 
Requesting built-in icons

Instead of specifying icon bitmaps using XPM data, you might prefer to use Golly's built-in grayscale icons by supplying one of the following words on a line by itself:

  • circles — circular icons (normally used for Moore neighborhood rules).
  • diamonds — diamond-shaped icons (normally used for von Neumann neighborhood rules).
  • hexagons — hexagonal icons (normally used for hexagonal neighborhood rules).
  • triangles — triangular icons (only suitable for a 4-state rule that is emulating a triangular neighborhood).

 
Tools for creating icons

One way to create XPM icons is to use a painting application that can write .xpm files. Their contents can then be pasted into a .rule file with a small amount of editing.

Another way is to use two Python scripts called icon-importer.py and icon-exporter.py (both can be found in Scripts/Python/Rule-Generators). These scripts allow Golly to be used as an icon editor. Here's how:

Step 1: Switch to the rule whose icons you wish to change or create and then run icon-importer.py. This will create a new layer called "imported icons for rulename" (the name will be used by icon-exporter.py, so don't change it). The script searches for rulename.rule in your rules folder, then in the supplied Rules folder. If found, it extracts any @ICONS data and displays the icon bitmaps in gray boxes. The location of these boxes will be used by icon-exporter.py, so don't move them.

If the @ICONS data is missing icons at a particular size then the script creates them by scaling up or down an existing set of icons. For example, missing 31x31 icons will be created by scaling up the 15x15 icons.

The new layer uses a Generations rule with the maximum number of states (//256) so we can have lots of colors. The initial palette contains a grayscale gradient from white to black, followed by the colors used in the imported icons (if any), followed by three rainbow gradients (bright, pale, dark). You can change these colors by using Layer > Set Layer Colors.

Step 2: Edit the icon bitmaps using Golly's editing capabilities. Golly isn't as powerful as a full-blown painting app, but hopefully it's sufficient for such small images.

Step 3: When you've finshed editing, run icon-exporter.py. This script will extract the icon data and create a suitable @ICONS section in rulename.rule in your rules folder (the script will never create or modify a .rule file in the supplied Rules folder). If rulename.rule already exists in your rules folder then the script replaces any existing @ICONS section (and any @COLORS section if the icons are multi-color) so it won't clobber any other info in the file.

If rulename.rule doesn't exist in your rules folder then it will be created. This file won't have any @TABLE or @TREE section, but that's perfectly valid. It means either the rule is built-in (ie. recognized by a non-RuleLoader algorithm), or else rulename.rule also exists in the supplied Rules folder and so the RuleLoader algorithm will use that file when it can't find any @TABLE or @TREE section in the .rule file in your rules folder.

Finally, icon-exporter.py creates a new layer called "icon test" which uses the original rule and displays a simple pattern containing all live states so you can check what the new icons look like.

 
How Golly finds .rule files

There are two situations where Golly needs to look for a .rule file:

1. If the RuleLoader algorithm is asked to switch to a rule called "Foo" then it first looks for Foo.rule in your rules folder. If not found, or if Foo.rule has no @TABLE or @TREE section, it will then look for Foo.rule in the supplied Rules folder. If Foo.rule doesn't exist then it will use the same search procedure to look for Foo.table, then Foo.tree.

2. After switching to a new rule (not necessarily using RuleLoader), Golly needs to look for color and/or icon information specific to that rule. A similar search procedure to the one above is used again, where this time Golly looks for any @COLORS and/or @ICONS sections in Foo.rule. (Unlike the above search, if Foo.rule is found in your rules folder but doesn't have any color/icon info then Golly will not look for Foo.rule in the Rules folder.)

Note that the 2nd search always occurs after clicking OK in the Control menu's Set Rule dialog, even if the current rule wasn't changed. This is a quick way to test changes to a .rule file.

 
Related rules can share colors and/or icons

If rulename.rule is missing either the @COLORS or @ICONS section, Golly checks to see if rulename contains a hyphen. If it does then it looks for the missing color/icon data in another .rule file called prefix-shared.rule where prefix consists of all the characters before the final hyphen. (As in the above searches, it looks in your rules folder first, then in the supplied Rules folder.) This allows related rules to share a single source of colors and/or icons.

For example, suppose you have a set of related rules in files called Foo-1.rule, Foo-2.rule, etc. If you want all these rules to use the same colors then create a file called Foo-shared.rule:

@RULE Foo-shared
This file contains the colors shared by Foo-* rules.

@TABLE
n_states:3
neighborhood:Moore
symmetries:none
# do nothing

@COLORS
0 0 0 0     black
1 255 0 0   red
2 0 0 255   blue

Note that a shared .rule file should contain a valid @TABLE section with an appropriate value for n_states (the neighborhood setting doesn't really matter, as long as it's legal). This allows the RuleLoader algorithm to load it, which means you can switch to the Foo-shared rule in case you want to add/edit icons using icon-importer.py.

For another good example, see Worm-shared.rule in Golly's Rules folder. It contains the icons shared by all the other Worm-* rules.

 
How to override a supplied or built-in rule

The search procedure described above makes it easy to override a supplied .rule file, either completely or partially. Note that there is never any need to add or modify files in the supplied Rules folder. For example, if you want to override the colors and icons used in the supplied WireWorld.rule then you can create a file with the same name in your rules folder. Its contents might look like this:

@RULE WireWorld

@COLORS
0 0 0 0               black background
0 255 0   255 255 0   live states fade from green to yellow

@ICONS
diamonds

It's also possible to override a built-in rule (ie. a rule recognized by an algorithm other than RuleLoader). A built-in rule name can contain characters not allowed in file names ("/" and "\"), so Golly will substitute those characters with underscores when looking for the corresponding .rule file. For example, if you want to change the colors and/or icons for Life (B3/S23) then you'll need to create a file called B3_S23.rule. This example uses a multi-colored icon to show a blue sphere on a white background:

@RULE B3_S23

Override the default colors and icons for Life (B3/S23).

@COLORS

0 255 255 255   white (matches icon background below)
1 54 54 194     dark blue (average color of icon below)

@ICONS

# 7x7 and 15x15 icons will be created by scaling down this 31x31 icon:

XPM
/* width height num_colors chars_per_pixel */
"31 31 78 2"
/* colors */
".. c #FFFFFF"   white background
"BA c #CECEDE"
"CA c #7B7BAD"
"DA c #4A4A84"
"EA c #18187B"
"FA c #08006B"
"GA c #18186B"
"HA c #29297B"
"IA c #6B6BAD"
"JA c #ADADDE"
"KA c #EFF7FF"
"LA c #ADADC6"
"MA c #39398C"
"NA c #3939BD"
"OA c #7B7BCE"
"PA c #ADB5DE"
"AB c #8C8CD6"
"BB c #4A4A9C"
"CB c #18188C"
"DB c #EFEFEF"
"EB c #EFEFFF"
"FB c #525A9C"
"GB c #08088C"
"HB c #ADADE7"
"IB c #DEDEEF"
"JB c #D6D6F7"
"KB c #DEE7F7"
"LB c #BDBDEF"
"MB c #525ABD"
"NB c #21219C"
"OB c #292984"
"PB c #CECEE7"
"AC c #ADB5CE"
"BC c #2929BD"
"CC c #7B7BDE"
"DC c #BDC6E7"
"EC c #CECEF7"
"FC c #8C8CE7"
"GC c #4242C6"
"HC c #A5A5BD"
"IC c #08087B"
"JC c #3939CE"
"KC c #5A5AC6"
"LC c #BDBDF7"
"MC c #BDBDDE"
"NC c #6B6BD6"
"OC c #9494DE"
"PC c #3931DE"
"AD c #1818AD"
"BD c #2929CE"
"CD c #9C9CC6"
"DD c #10087B"
"ED c #9C9CBD"
"FD c #1818B5"
"GD c #1818C6"
"HD c #847BCE"
"ID c #181094"
"JD c #6B6BCE"
"KD c #7B7BB5"
"LD c #2121AD"
"MD c #BDC6D6"
"ND c #0808AD"
"OD c #4A42B5"
"PD c #00009C"
"AE c #3942BD"
"BE c #3129B5"
"CE c #B5B5CE"
"DE c #0000BD"
"EE c #0000CE"
"FE c #0000DE"
"GE c #42427B"
"HE c #C6CECE"
"IE c #0000EF"
"JE c #9494AD"
"KE c #F7FFEF"
"LE c #10086B"
"ME c #7B849C"
"NE c #0000F7"
/* icon for state 1 */
".............................................................."
".............................................................."
"......................BACADAEAFAGAHAIAJA......................"
"................KALAMAFANAOAJAPAJAABBBCBEAIADB................"
"..............EBFBGBNAHBIBDBJBKAKBEBJBLBMBNBOBPB.............."
"............ACHABCCCDCECIBPBJBPBIBPBJBIBECFCGCCBCAKA.........."
"..........HCICJCKCLBLCLBMCLBLBLBLBMCLBLBMCLCNCJCCBCAKA........"
"........DBOBBCJCCCJAJAJAJAJAJAJAJAJAJAJAJAJAOCJCPCICAC........"
"......KADAADBDBCABABOCABOCOCOCOCABOCABOCABCDFCJCBDBCDDBA......"
"......EDGBFDGDADCCABOAOAOAOAOAOAOAOAHDOAHDCCCCNAADGDIDMA......"
"....KAHAADFDFDADJDMBOAJDJDJDJDJDKDJDJDJDJDJDJDLDFDFDFDICBA...."
"....MDFANDNDNDADODMBMBMBMBMBMBMBKCKCMBMBMBMBODADNDNDNDGBIA...."
"....CAGBNDPDNDPDADGCODODODODODODNAODODGCODAEBCPDNDPDNDPDGA...."
"....OBPDPDNDPDNDNDADBCBEBCBEBCBCBEBCBCBCNAADPDNDNDPDPDNDICPB.."
"....ICNDNDPDNDNDNDPDNDADADADADADADADADADNDNDNDNDNDNDNDPDGBCE.."
"....FANDNDDENDNDNDDENDDENDNDNDNDNDNDNDNDNDNDNDNDNDNDNDNDGBLA.."
"....FANDDENDDEDENDDEDENDDENDDEDEDEDEDEDEDEDEDEDEDENDDEDEGBED.."
"....GANDEEDEDEDEDEDEDEDEDEDEDEDENDDENDDEDEDEDEDEDEDEDEDEGBLA.."
"....BBPDEEDEEEDEEEDEEEDEEEDEDEDEEEDEEEDEDEDEDEDEEEDEEEDEFABA.."
"....EDGBDEEEDEEEEEEEDEEEDEEEEEEEEEEEEEEEEEEEEEEEEEDEEENDGADB.."
"....KBICDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEGBDA...."
"......FBNDFEFEEEEEEEEEFEEEEEFEEEEEEEEEEEEEEEEEEEEEFEDEICHC...."
"......IBEADEFEFEEEFEFEFEFEFEEEFEFEFEFEFEFEFEFEFEFEDEGBGEDB...."
"........LAGBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFENDGAHE......"
"..........FBNDFEFEIEFEFEIEIEIEFEIEFEFEIEFEFEFEFEEEDDJEKE......"
"..........EBFBIDEEIEIEIEFEFEFEIEFEIEIEIEIEIEIENDLEMEKE........"
"..............CDGBDEIEIENENEIEIEIEIEIEIEIEGDPDGAJEKE.........."
"................BAOBGBADFEIENEIENEIEIEEENDFAGECEKE............"
"....................CDBBDDPDIDNDADPDICEAGEJEDB................"
"........................EBBALAEDEDHCMCDBKE...................."
".............................................................."

 
The easy way to install a new .rule file

Golly provides a quick and easy way to create a new .rule file in the right place. Simply copy the rule contents to the clipboard, then select the Open Clipboard command (in the File menu) or the Paste command (in the Edit menu). If the first line of the clipboard starts with "@RULE rulename" then Golly will save the text as rulename.rule in your rules folder and switch to that rule.

 
Deprecated files (.table, .tree, .colors, .icons)

Golly still supports the old rule-related files with extensions of .table, .tree, .colors and .icons, but their use is discouraged. To help speed up the transition to .rule files, Golly has a couple of handy features:

1. At the bottom of the Control menu is a new command called Convert Old Rules. This will convert all .table/tree/colors/icons files into corresponding .rule files (but existing .rule files will not be changed). The results are displayed in the help window. If the conversion succeeds you'll be asked if you want to delete the .table/tree/colors/icons files.

2. When Golly opens a .zip file containing .table/tree/colors/icons files it will automatically convert them into .rule files, but only if the zip file has no .rule files. Unlike the Convert Old Rules command, this conversion will overwrite existing .rule files (in case the zip file contents have changed).

 
Zip files

Golly can open a standard zip file and process its contents in the following way:

If the zip file is "complex" then Golly builds a temporary HTML file with special unzip links to each included file and shows the result in the help window. A complex zip file is one that contains:

  • Any folders.
  • Any rule files (.rule extension). Such files are automatically extracted and installed into your rules folder. Note that files with a .colors or .icons or .table or .tree extension are automatically converted into corresponding .rule files, but only if those .rule files aren't present in the zip file.
  • Any HTML files (.htm or .html extension).
  • Any text files (.txt or .doc extension, or a name containing "readme").
  • Multiple scripts (.pl or .py extension).
  • Multiple patterns (no extension, or one that doesn't match any of the above).

A "simple" zip file contains at most one pattern and at most one script. In this case Golly will load the pattern (if present) and then run the script (if present). For security reasons, if the zip file was downloaded via a get link then Golly will ask if you really want to run the included script. Both the pattern and the script must be at the root level of the zip file; ie. not inside a folder. For an example of such a zip file, open Langtons-ant.zip from the Patterns/WireWorld/ folder. This zip file contains a pattern file and a simple Python script that sets up a nicer initial view and step size.

A number of pattern collections in the form of zip files can be downloaded from the online archives. golly-2.5-src/Help/help.html0000644000175100001440000000633612156145314012731 00000000000000 Golly Help: Help Menu

The Help menu items can be used to display information on a variety of topics. Each item corresponds to a HTML file in the Help folder. The information is displayed in a separate help window which behaves like a simplified browser. The size and location of this window is remembered when it closes.

Keyboard shortcuts

Various keyboard shortcuts can be used when the help window is in front:

  • Hit "+" and "-" to change the font size.
  • Hit the left arrow or "[" to go back.
  • Hit the right arrow or "]" to go forwards.
  • Hit the home key to go to the Contents page.
  • Hit the up/down arrow keys or page up/down keys if a scroll bar appears.
  • Hit Ctrl-A on Windows/Linux or Cmd-A on Mac to select all text.
  • Hit Ctrl-C on Windows/Linux or Cmd-C on Mac to copy selected text to the clipboard.
  • Hit escape or return to close the help window.

Special links

The help window supports a number of Golly-specific links:

  • edit:file
    Open the given file in your preferred text editor. A non-absolute path is relative to the location of the Golly application.
  • get:url
    Download the specified file and process it according to its type:
    • A HTML file (.htm or .html) is displayed in the help window. Note that this HTML file can contain get links with partial URLs. For a good example of their use, see the LifeWiki Pattern Archive.
    • A text file (.txt or .doc or a name containing "readme") is opened in your text editor.
    • A zip file is opened and processed as described in the File Formats help.
    • A rule file (.rule) is installed into your rules folder and Golly then switches to the corresponding rule.
    • A script file (.pl or .py) is run, but only if you answer "Yes" to the query dialog that appears.
    • A pattern file is loaded into the current layer.
  • lexpatt:pattern
    Load the given Life Lexicon pattern into a "lexicon" layer which is automatically created if it doesn't already exist.
  • open:file
    Load the given pattern or run the given script or switch to the given rule. A non-absolute path is relative to the location of the Golly application.
  • prefs:pane
    Open the Preferences dialog at the given pane. The pane string must be lowercase and must match a known pane: file, edit, control, etc.
  • rule:rulename
    Switch to the given rule.
  • unzip:zip:file
    Extract a file from the given zip file and process it in the same manner as a get link (see above). Golly creates unzip links when it opens a zip file, so you probably won't ever need to use such links in your own HTML files.

Note that for some links (get, open, unzip) you can tell Golly to open the specified file in your text editor by control-clicking or right-clicking on the link. golly-2.5-src/Help/index.html0000644000175100001440000000263512156145314013106 00000000000000 Golly Help: Contents

 

Table of Contents

Introduction
Hints and Tips
Algorithms
Life Lexicon
Online Archives

Perl Scripting
Python Scripting

Keyboard Shortcuts
Mouse Shortcuts
File Menu
Edit Menu
Control Menu
View Menu
Layer Menu
Help Menu
References
File Formats
Bounded Grids
Known Problems
Changes
Credits

golly-2.5-src/Help/intro.html0000644000175100001440000000354412156145314013132 00000000000000 Golly Help: Introduction

What is Golly?

Golly is a cross-platform application for exploring John Conway's Game of Life and other cellular automata. It's also free and open source. More details, including links to the source and binary distributions, are available at the Golly web site:

http://golly.sourceforge.net/

What is Life?

The Game of Life is a simple example of a set of rules more broadly known as a "cellular automaton", or CA for short. CAs were first studied in the mid-1950s by Stanislaw Ulam and John von Neumann but became much more widely known in 1970 when Conway's Life was described by Martin Gardner in his Scientific American column.

Life is played on an arbitrary-sized grid of square cells. Each cell has two states: "dead" or "alive". The state of every cell changes from one "generation" to the next according to the states of its 8 nearest neighbors: a dead cell becomes alive (a "birth") if it has exactly 3 live neighbors; a live cell dies out if it has less than 2 or more than 3 live neighbors. The "game" of Life simply involves starting off with a pattern of live cells and seeing what happens.

Even though the rules for Life are completely deterministic, it is impossible to predict whether an arbitrary starting pattern will die out, or start oscillating, or expand forever. Life and other CAs provide a powerful demonstration of how a very simple system can generate extremely complicated results.

If you'd like to learn more about Life and other cellular automata then check out the links and books mentioned in the References, or start exploring the Life Lexicon. golly-2.5-src/Help/layer.html0000644000175100001440000001417612156145314013116 00000000000000 Golly Help: Layer Menu

Golly supports up to ten layers. Each layer is a separate universe (unless cloned; see the Clone Layer item below) with its own algorithm, rule, viewport, cursor mode, selection, step size, origin offset, color scheme and name. The current layer's name is displayed in the main window's title bar. Most edit/control/view operations only apply to the current layer.

Note that most of Golly's options apply globally to all layers. This is true for all of the options set in the Preferences dialog. It's also true for many of the options set via menu items, like Save Extended RLE, Paste Mode, Paste Location, Show Grid Lines, etc., but not for any of the Control menu options (Auto Fit, Hyperspeed, and Show Hash Info).

The items at the bottom of the Layer menu show the current names of all the existing layers. The names of cloned layers are prefixed by one or more "=" signs; all layers with the same number of "=" signs share the same universe. The current layer is indicated by a tick. To switch to another layer just select the corresponding item. If a script is running then you can only switch to another layer if the script has called golly.setoption("switchlayers",True).

A layer containing a modified pattern is indicated by a "*" at the start of the layer's name. To avoid losing your changes, a "save changes" dialog will appear before creating a new pattern, opening a pattern file, deleting the layer, or quitting Golly. If you'd rather not see this dialog then untick the appropriate check boxes in Preferences > Layer.

Common layer functions are also available via buttons in the layer bar located underneath the status bar. Use the Show Layer Bar item in the View menu to show/hide the layer bar, or just hit the "\" key.

Add Layer

Adds a new layer (with an empty universe) immediately after the current layer. The new layer becomes the current layer and inherits the preceding layer's algorithm, rule, scale, location, and cursor mode. The step size is set to 1, there is no selection, no origin offset, and the layer's initial name is "untitled". The new layer starts off using the default color scheme for the current algorithm and rule.

Clone Layer

Adds a new layer that shares the same universe, undo/redo history, and color scheme as the current layer. All of the current layer's settings are duplicated and most will be kept synchronized so that a change to one clone automatically changes all the others. Each cloned layer does however have a separate viewport, so the same pattern can be viewed at different scales and locations (at the same time if layers are tiled). Cloned layers can also have different names, cursor modes, or control options (Auto Fit, Hyperspeed, and Show Hash Info).

Duplicate Layer

Adds a new layer with a copy of the current layer's pattern. Also duplicates all the current settings but, unlike a cloned layer, the settings are not kept synchronized. A duplicated layer starts with the same undo/redo history as the original layer but their histories will diverge if changes are made to either layer.

Delete Layer

Deletes the current layer. The current layer changes to the preceding layer (unless the first layer was deleted).

Delete Other Layers

Deletes all layers except the current layer.

Move Layer...

Opens a dialog that lets you move the current layer to a new position in the layer sequence, where 0 is the position of the first layer.

Name Layer...

Opens a dialog that lets you change the name of the current layer. Note that loading a pattern file also changes the layer's name. Creating a new pattern resets the name to "untitled".

Set Layer Colors...

Opens a dialog that lets you change any of the cell colors used by the current layer and its clones (if any). Note that any changes you make here are temporary. If you open a pattern file or create a new pattern, or if you change the current algorithm or rule, then the colors will be reset to their default values as specified in Preferences > Color. If the new rule has a corresponding .colors file then those colors will also be loaded. The format of a .colors file is described in Help > File Formats.

Synchronize Views

If ticked, then when you switch to another layer Golly will automatically switch to the same scale and location as the old layer. Most of the time you'll probably prefer to keep this option turned off so that each layer has a different scale and location.

Synchronize Cursors

If ticked, then when you switch to another layer Golly will automatically switch to the same cursor mode as the old layer. You'll probably find it less confusing if this option is kept turned on, but it can be useful in some situations for different layers to use different cursors. For example, you might want to make selections in one layer but draw cells in another layer.

Stack Layers

If ticked then all layers are displayed on top of one another, temporarily using the same scale and location as the current layer. The pattern in layer 0 is drawn first (100% opaque), then the patterns in other layers are drawn on top as translucent overlays. The opacity percentage of the pattern overlays can be set in Preferences > Layer. For an example of how stacked layers can be useful, load in a pattern and run the envelope.py script.

Tile Layers

If ticked then the viewport window is tiled into sub-windows and each layer is displayed in a separate tile. Clicking in the window of a non-current layer will change the current layer. Tiling is very handy with cloned layers as it allows you to view the same pattern at different scales and/or locations. golly-2.5-src/Help/mouse.html0000644000175100001440000000212612156145314013122 00000000000000 Golly Help: Mouse Shortcuts

Mouse shortcuts

  • Click in the status bar's "Generation=..." text to change the generation count.
  • Click in the "Scale=..." text to reset the scale to 1:1.
  • Click in the "Step/Delay=..." text to reset the base step to its default value (specified in Preferences > Control) and the step exponent to 0.
  • Double-click in the edit bar's color/icon boxes to open the Set Layer Colors dialog.
  • Shift-click with the cross cursor to expand or shrink an existing selection. Hit the escape key to cancel the operation and restore the original selection.
  • In zoom in/out mode, use right-click or control-click to zoom in the opposite direction.
  • The mouse wheel can be used for zooming, regardless of cursor mode.
  • Right-click or control-click on a pattern/script file to open the file in a text editor. Use Preferences > File to select your preferred text editor.
golly-2.5-src/Help/perl.html0000644000175100001440000014721012156145314012740 00000000000000 Golly Help: Perl Scripting

Installing Perl
Incompatibility with Perl 5.14
Example scripts
Golly's scripting commands
Cell arrays
Rectangle arrays
Potential problems
Perl copyright notice

 
Installing Perl

Before you can run a .pl script, Perl needs to be installed on your system. Mac OS X users don't need to do anything because Perl is already installed. Windows and Linux users need to have Perl 5.10 or 5.12 (note that 5.14 or later won't work — see below). If you're using Linux then you might already have Perl 5.10 installed; if not, visit www.perl.org and download a suitable installer. Windows users are advised to download the ActivePerl installer. Note that a 32-bit version of Golly requires a 32-bit version of Perl, and a 64-bit Golly requires a 64-bit Perl.

On Windows and Linux, the Perl library is loaded at runtime (the first time you try to run a .pl script). Golly initially attempts to load a particular version of the Perl library: perl510.dll on Windows or libperl.so.5.10 on Linux. The numbers correspond to Perl version 5.10.x. If that library can't be found then you'll be prompted to enter a different library name matching the version of Perl installed on your system. A successfully loaded library is remembered (in your GollyPrefs file) so you won't get the prompt again unless you remove Perl or install a new version. If Perl isn't installed then you'll have to hit Cancel and you won't be able to run any .pl scripts.

 
Incompatibility with Perl 5.14

The Linux and Windows versions of Golly are built with the Perl 5.10 headers. Unfortunately, Perl 5.14 and later is not compatible with these headers and you'll get an error message if you try to use a Perl 5.14 library with Golly. If your Linux system doesn't have Perl 5.10 (or 5.12) then you can build and install a local version for Golly using these commands:

sudo apt-get install perlbrew
perlbrew init
perlbrew install -Duseshrplib -Dusethreads perl-5.10.1

This creates perl5/perlbrew/build/perl-5.10.1/libperl.so in your home directory. Quit Golly, edit GollyPrefs (in ~/.golly/), find the line that sets perl_lib and change it to use the appropriate path:

perl_lib=/home/username/perl5/perlbrew/build/perl-5.10.1/libperl.so

Restart Golly and now all the Perl scripts should run okay.

 
Example scripts

The Scripts folder supplied with Golly contains a number of example Perl scripts:

density.pl — calculates the density of the current pattern
envelope.pl — uses multiple layers to remember a pattern's live cells
giffer.pl — creates an animated GIF using the current selection
goto.pl — goes to a given generation
invert.pl — inverts all cell states in the current selection
make-torus.pl — makes a toroidal universe from the current selection
oscar.pl — detects oscillating patterns, including spaceships
pop-plot.pl — displays a plot of population versus time
shift.pl — shifts the current selection by given x y amounts
tile.pl — tiles the current selection with the pattern inside it
tile-with-clip.pl — tiles the current selection with the clipboard pattern

To run one of these scripts, tick the Show Scripts item in the File menu and then simply click on the script's name. You can also select one of the Run items in the File menu. For a frequently used script you might like to assign a keyboard shortcut to run it (see Preferences > Keyboard).

When Golly starts up it looks for a script called golly-start.pl in the same directory as the Golly application and then in a user-specific data directory (see the g_getdir command for the likely path on your system). If the script is found then it is automatically executed.

There are a number of ways to abort a running script. Hit the escape key, or click on the stop button in the tool bar, or select the Stop item in the Control menu.

 
Golly's scripting commands

This section describes all the Golly-specific scripting commands that can be used in a Perl script. Commands are grouped by function (filing, editing, control, viewing, layers and miscellaneous) or you can search for individual commands alphabetically:

g_addlayer
g_advance
g_autoupdate
g_check
g_clear
g_clone
g_copy
g_cut
g_dellayer
g_doevent
g_duplicate
g_empty
g_error
g_evolve
g_exit
g_fit
g_fitsel
g_flip
g_getalgo
g_getbase
g_getcell
g_getcells
g_getclip
g_getclipstr
g_getcolor
g_getcolors
g_getcursor
g_getdir
g_getevent
g_getgen
g_getheight
g_getlayer
g_getmag
g_getname
g_getoption
g_getpop
g_getpos
g_getrect
g_getrule
g_getselrect
g_getstep
g_getstring
g_getwidth
g_getxy
g_hash
g_help
g_join
g_load
g_maxlayers
g_movelayer
g_new
g_note
g_numalgos
g_numlayers
g_numstates
g_open
g_opendialog
g_parse
g_paste
g_putcells
g_randfill
g_reset
g_rotate
g_run
g_save
g_savedialog
g_select
g_setalgo
g_setbase
g_setcell
g_setclipstr
g_setcolor
g_setcolors
g_setcursor
g_setdir
g_setgen
g_setlayer
g_setmag
g_setname
g_setoption
g_setpos
g_setrule
g_setstep
g_show
g_shrink
g_step
g_store
g_transform
g_update
g_visrect
g_warn

 
FILING COMMANDS

g_open($filename, $remember=0)
Open the given file and process it according to its type:

  • A HTML file (.htm or .html extension) is displayed in the help window.
  • A text file (.txt or .doc extension, or a name containing "readme") is opened in your text editor.
  • A script file (.pl or .py extension) is executed.
  • A zip file (.zip extension) is processed as described here.
  • Any other type of file is assumed to be a pattern file and is loaded into the current layer.

A non-absolute path is relative to the location of the script. The 2nd parameter is optional (default = 0) and specifies if the given pattern or zip file should be remembered in the Open Recent submenu, or in the Run Recent submenu if the file is a script.
Example: g_open("my-patterns/foo.rle");

g_save($filename, $format, $remember=0)
Save the current pattern in a given file using the specified format:

"rle" run length encoded (RLE)
"rle.gz" compressed RLE
"mc" macrocell
"mc.gz" compressed macrocell

A non-absolute path is relative to the location of the script. The 3rd parameter is optional (default = 0) and specifies if the file should be remembered in the Open Recent submenu. If the savexrle option is 1 then extended RLE format is used (see the Save Extended RLE item for details).
Example: g_save("foo.rle", "rle", 1);

g_opendialog($title, $filetypes, $initialdir, $initialfname, $mustexist=1)
Present a standard Open dialog to the user and return the chosen path in a string. All parameters are optional; the default is an Open dialog showing the current directory, with a title of "Choose a file" and a file type of "All files (*)|*". If the 5th parameter (default = 1) is set to 0, the user can specify a new filename instead of choosing an existing file. If the given file type is "dir" then the dialog lets the user choose a directory rather than a file. If the user cancels the dialog, the return value will be an empty string.
Example: my $fname = g_opendialog('Open MCell File', 'MCell files (*.mcl)|*.mcl', 'C:\\Temp', 'sample.mcl');
Example: my $dirname = g_opendialog('Choose a folder', 'dir');

g_savedialog($title, $filetypes, $initialdir, $initialfname, $suppressprompt=0)
Present a standard Save dialog to the user and return the chosen path in a string. All parameters are optional; the default is a Save dialog showing the current directory, with a title of "Choose a save location and filename" and a file type of "All files (*)|*". If a file already exists at the chosen location, an Overwrite? query will be displayed unless the 5th parameter (default = 0) is set to 1. If the user cancels the dialog, the return value will be an empty string.
Example: my $fname = g_savedialog('Save text file', 'Text files (*.txt;*.csv)|*.txt;*.csv', 'C:\\Temp', 'Params.txt', 1);

g_load($filename)
Read the given pattern file and return a cell array reference.
Example: $blinker = g_load("blinker.rle");

g_store($cellarray, $filename)
Write the pattern in the given cell array reference to the specified file in RLE format. If the savexrle option is 1 then extended RLE format is used (see the Save Extended RLE item for details).
Example: g_store($cellarray, "foo.rle");

g_getdir(dirname)
Return the path of the specified directory:

"app" — the directory containing the Golly application.

"data" — the user-specific data directory:
On Linux: ~/.golly/
On Mac OS X: ~/Library/Application Support/Golly/
On Windows: C:\Documents and Settings\username\Application Data\Golly\
Example: g_setcolors([1,0,0,0, 2,0,0,0]); # set states 1 and 2 to black
Example: g_setcolors([-1,0,255,0]); # set all live states to green
Example: g_setcolors([255,0,0, 0,0,255]); # live states vary from red to blue
Example: g_setcolors([]); # restore default colors

g_getcolors(state=-1)
Return the color of a given state in the current layer as a reference to an array of the form

( state, red, green, blue )

or if the given state is -1 (or not supplied) then return all colors as

( 0, r0, g0, b0, . . . N, rN, gN, bN )

where N equals g_numstates() - 1. Note that the array reference returned by g_getcolors can be passed into g_setcolors; this makes it easy to save and restore colors.
Example: $allcolors = g_getcolors();
Example: $deadcolor = g_getcolors(0);

 
MISCELLANEOUS COMMANDS

g_setoption($name, $value)
Set the given option to the given value. The old value is returned to make it easy to restore a setting. Here are all the valid option names and their possible values:

"autofit" 1 or 0
"boldspacing" 2 to 1000 (cells)
"drawingstate" 0 to g_numstates()-1
"fullscreen" 1 or 0
"hyperspeed" 1 or 0
"maxdelay" 0 to 5000 (millisecs)
"mindelay" 0 to 5000 (millisecs)
"opacity" 1 to 100 (percent)
"restoreview" 1 or 0
"savexrle" 1 or 0
"showallstates" 1 or 0
"showboldlines" 1 or 0
"showeditbar" 1 or 0
"showexact" 1 or 0
"showgrid" 1 or 0
"showhashinfo" 1 or 0
"showicons" 1 or 0
"showlayerbar" 1 or 0
"showpatterns" 1 or 0
"showscripts" 1 or 0
"showstatusbar" 1 or 0
"showtoolbar" 1 or 0
"stacklayers" 1 or 0
"swapcolors" 1 or 0
"switchlayers" 1 or 0
"synccursors" 1 or 0
"syncviews" 1 or 0
"tilelayers" 1 or 0

Example: $oldgrid = g_setoption("showgrid", 1);

g_getoption($name)
Return the current value of the given option. See above for a list of all the valid option names.
Example: g_fit() if g_getoption("autofit");

g_setcolor($name, $r, $g, $b)
Set the given color to the given RGB values (integers from 0 to 255). The old RGB values are returned as an array of 3 integers to make it easy to restore the color. Here is a list of all the valid color names and how they are used:

"border" color for border around bounded grid
"paste" color for pasting patterns
"select" color for selections (will be 50% transparent)
algoname status bar background for given algorithm

Example: @oldrgb = g_setcolor("HashLife", 255, 255, 255);

g_getcolor($name)
Return the current RGB values for the given color as an array of 3 integers. See above for a list of all the valid color names.
Example: my ($r, $g, $b) = g_getcolor("select");

g_getclipstr()
Return the current contents of the clipboard as an unmodified string.
Example: $illegalRLE = g_getclipstr();

g_setclipstr($string)
Copy an arbitrary string (not necessarily a cell pattern) directly to the clipboard.
Example: g_setclipstr($correctedRLE);

g_getstring($prompt, $initial="", $title="")
Display a dialog box and get a string from the user. If the initial string is supplied it will be shown and selected. If the title string is supplied it will be used in the dialog's title bar. The script will be aborted if the user hits the dialog's Cancel button.
Example: $i = g_getstring("Enter a number:", "100");

g_getevent($get=1)
When Golly runs a script it initially handles all keyboard and mouse events, but if the script calls g_getevent() then future events are put into a queue for retrieval via later calls. These events are returned in the form of strings (see below for the syntax). If there are no events in the queue then the returned string is empty. Note that the very first g_getevent() call will always return an empty string, but this isn't likely to be a problem because it normally occurs very soon after the script starts running. A script can call g_getevent(0) if it wants Golly to resume handling any further events.

Keyboard events are strings of the form "key charname modifiers" where charname can be any displayable ASCII character from '!' to '~' or one of the following names: space, home, end, pageup, pagedown, help, insert, delete, tab, enter, return, left, right, up, down, or f1 to f24. If no modifier key was pressed then modifiers is none, otherwise it is some combination of alt, cmd, ctrl, meta, shift. Note that cmd corresponds to the command key on a Mac and the control key on Windows/Linux (this lets you write portable scripts that work on any platform). The alt modifier corresponds to the option key on a Mac.

Mouse events are strings of the form "click x y button modifiers" where x and y are integers giving the cell position of the click, button is one of left, middle or right, and modifiers is the same as above. The following examples show the strings returned after various user events:

"key m none" user pressed M key
"key space shift" user pressed space bar and shift key
"key , altctrlshift" user pressed comma and 3 modifier keys
"click 100 20 left none" user clicked cell at 100,20 with left button
"click -10 9 middle alt" user clicked cell with middle button and pressed alt key
"click 0 1 right altshift" user clicked cell with right button and pressed 2 modifiers

Example: $evt = g_getevent();

g_doevent($string)
Pass the given event to Golly to handle in the usual manner (but events that can change the current pattern will be ignored). The given event must be a string with the exact same format as returned by the g_getevent command (see above). If the string is empty then Golly does nothing.
Example: g_doevent("key q cmd"); # quit Golly

g_getxy()
Return the mouse's current grid position as a string. The string is empty if the mouse is outside the viewport or outside a bounded grid or over the translucent buttons, otherwise the string contains x and y cell coordinates separated by a space; eg. "-999 12345".
Example: $mousepos = g_getxy();

g_show($message)
Show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: g_show("Hit any key to continue...");

g_error($message)
Beep and show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: g_error("The pattern is empty.");

g_warn($message)
Beep and show the given string in a modal warning dialog. Useful for debugging Perl scripts or displaying error messages.
Example: g_warn("xxx = $xxx");

g_note($message)
Show the given string in a modal information dialog. Useful for displaying multi-line results.
Example: g_note("Line 1\nLine 2\nLine 3");

g_help($htmlfile)
Open the given HTML file in the help window. A non-absolute path is relative to the location of the script.
Example: g_help("results.html");

g_check($bool)
When Golly runs a script this setting is initially 1, which means that event checking is enabled. If the given parameter is 0 then event checking is disabled. Typically used to prevent mouse clicks being seen at the wrong time. This should only be done for short durations because the script cannot be aborted while the setting is 0.
Example: g_check(0);

g_exit($message="")
Exit the script with an optional error message. If a non-empty string is supplied then it will be displayed in the status bar along with a beep, just like the g_error command. If no message is supplied, or if the string is empty, then there is no beep and the current status bar message will not be changed.
Example: g_exit("There is no pattern.") if g_empty();

 
Cell arrays

Some scripting commands manipulate patterns in the form of cell arrays. Golly supports two types of cell arrays: one-state and multi-state. A one-state cell array contains an even number of integers specifying the x,y coordinates for a set of cells, all of which are assumed to be in state 1:

( x1, y1, . . . xN, yN )

A multi-state cell array contains an odd number of integers specifying the x,y,state values for a set of cells. If the number of cells is even then a padding integer (zero) is added at the end of the array to ensure the total number of integers is odd:

( x1, y1, state1, . . . xN, yN, stateN )      if N is odd
( x1, y1, state1, . . . xN, yN, stateN, 0 )  if N is even

All scripting commands that input cell arrays use the length of the array to determine its type. When writing a script to handle multi-state cell arrays you may need to allow for the padding integer, especially if accessing cells within the array. See tile.pl for example.

Note that all scripting commands return () if the resulting cell array has no cells. They never return (0), although this is a perfectly valid multi-state cell array and all commands can input such an array. For example, $newarray = g_join($array1,[0]) can be used to convert a non-empty one-state array to multi-state.

One-state cell arrays are normally used in a two-state universe, but they can also be used in a universe with more than two states. A multi-state cell array can be used in a two-state universe, but only if the array's cell states are 0 or 1.

The ordering of cells within either type of array doesn't matter. Also note that positive y values increase downwards in Golly's coordinate system.

Cell arrays can contain millions of integers, so all commands that accept or return cell arrays actually use references to those arrays.

 
Rectangle arrays

Some commands manipulate rectangles in the form of arrays. An empty rectangle is indicated by an array with no items; ie. (). A non-empty rectangle is indicated by an array containing four integers:

( left, top, width, height )

The first two items specify the cell at the top left corner of the rectangle. The last two items specify the rectangle's size (in cells). The width and height must be greater than zero.

Unlike cell arrays, rectangle arrays only contain a few items (0 or 4), so all commands that accept or return rectangle arrays don't bother using array references.

 
Potential problems

1. Mac users need to ensure their Perl scripts use Unix line endings (LF). If a script uses Mac line endings (CR) and the first line is a comment then the Perl interpreter will treat the entire file as one long comment and nothing will happen when the script is executed.

2. The escape key check to abort a running script is not done by Perl but by each Golly scripting command. This means that very long Perl computations should call an occasional "no-op" command like g_doevent("") to allow the script to be aborted in a timely manner.

3. When writing a script that creates a pattern, make sure the script starts with a g_new command (or, less useful, a g_open command) otherwise the script might create lots of temporary files or use lots of memory. From the undo history's point of view there are two types of scripts:

  • A script that calls g_new or g_open is assumed to be creating some sort of pattern, so when Golly sees these commands it clears any undo history and sets an internal flag that says "don't mark this layer as dirty and don't bother recording any further changes".
  • A script that doesn't call g_new or g_open is assumed to modify the current pattern. Golly must record all the script's changes so that when it finishes you can select "Undo Script Changes" from the Edit menu. Generating changes (due to g_run calls) are stored in temporary files, while other changes are stored in memory.

 
Perl copyright notice

Golly uses an embedded Perl interpreter to execute scripts. Perl is Copyright (C) 1993-2007, by Larry Wall and others. It is free software; you can redistribute it and/or modify it under the terms of either: a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License". golly-2.5-src/Help/problems.html0000644000175100001440000000216012156145314013613 00000000000000 Golly Help: Known Problems

This section lists all known bugs and limitations. If you come across any problems not mentioned below then please report them to Andrew Trevorrow (andrew@trevorrow.com) or Tom Rokicki (rokicki@gmail.com).

Problems on all platforms

  • All editing operations are restricted to cells whose coordinates are within +/- 1 billion.
  • The QuickLife algorithm has a minor bug that can cause selecting a large pattern to appear to be incorrect. The selection is actually correct but the rectangle is slightly offset (by one pixel).
  • Pattern rendering needs to be optimized, especially in the Mac and Linux apps. The solution will probably require using OpenGL rather than wxDC calls.

Mac problems

  • None.

Windows problems

  • None.

Linux problems

  • None.
golly-2.5-src/Help/python.html0000644000175100001440000015754412156145314013332 00000000000000 Golly Help: Python Scripting

Installing Python
Example scripts
Golly's scripting commands
Cell lists
Rectangle lists
Using the glife package
Potential problems
Python on Mac OS X
Python copyright notice

 
Installing Python

Before you can run a .py script, Python needs to be installed on your system. Mac OS X users don't need to do anything because Python is already installed (but see below for how to force Golly to use a newer version of Python). Windows and Linux users can download a Python installer from www.python.org/download. Note that a 32-bit version of Golly requires a 32-bit version of Python, and a 64-bit Golly requires a 64-bit Python.

On Windows and Linux, the Python library is loaded at runtime (the first time you try to run a script). Golly initially attempts to load a particular version of the Python library: python27.dll on Windows or libpython2.7.so on Linux. The numbers correspond to Python version 2.7. If that library can't be found then you'll be prompted to enter a different library name matching the version of Python installed on your system. A successfully loaded library is remembered (in your GollyPrefs file) so you won't get the prompt again unless you remove Python or install a new version. If Python isn't installed then you'll have to hit Cancel and you won't be able to run any .py scripts.

 
Example scripts

The Scripts folder supplied with Golly contains a number of example Python scripts:

density.py — calculates the density of the current pattern
draw-lines.py — lets you draw one or more straight lines
envelope.py — uses multiple layers to remember a pattern's live cells
flood-fill.py — fills a clicked region with the current drawing state
goto.py — goes to a given generation
gun-demo.py — constructs a few spaceship guns
heisenburp.py — illustrates the use of cloned layers
invert.py — inverts all cell states in the current selection
make-torus.py — makes a toroidal universe from the current selection
metafier.py — converts the current selection into a meta pattern
move-object.py — lets you move a connected group of live cells
move-selection.py — lets you move the current selection
oscar.py — detects oscillating patterns, including spaceships
pd-glider.py — creates a set of pentadecathlon+glider collisions
pop-plot.py — displays a plot of population versus time
shift.py — shifts the current selection by given x y amounts
slide-show.py — displays all patterns in the Patterns folder
tile.py — tiles the current selection with the pattern inside it
tile-with-clip.py — tiles the current selection with the clipboard pattern

To run one of these scripts, tick the Show Scripts item in the File menu and then simply click on the script's name. You can also select one of the Run items in the File menu. For a frequently used script you might like to assign a keyboard shortcut to run it (see Preferences > Keyboard).

When Golly starts up it looks for a script called golly-start.py in the same directory as the Golly application and then in a user-specific data directory (see the getdir command for the likely path on your system). If the script is found then it is automatically executed.

There are a number of ways to abort a running script. Hit the escape key, or click on the stop button in the tool bar, or select the Stop item in the Control menu.

 
Golly's scripting commands

This section describes all the commands that can be used in a script after importing the golly module. Commands are grouped by function (filing, editing, control, viewing, layers and miscellaneous) or you can search for individual commands alphabetically:

addlayer
advance
autoupdate
check
clear
clone
copy
cut
dellayer
doevent
duplicate
empty
error
evolve
exit
fit
fitsel
flip
getalgo
getbase
getcell
getcells
getclip
getclipstr
getcolor
getcolors
getcursor
getdir
getevent
getgen
getheight
getlayer
getmag
getname
getoption
getpop
getpos
getrect
getrule
getselrect
getstep
getstring
getwidth
getxy
hash
help
join
load
maxlayers
movelayer
new
note
numalgos
numlayers
numstates
open
opendialog
parse
paste
putcells
randfill
reset
rotate
run
save
savedialog
select
setalgo
setbase
setcell
setclipstr
setcolor
setcolors
setcursor
setdir
setgen
setlayer
setmag
setname
setoption
setpos
setrule
setstep
show
shrink
step
store
transform
update
visrect
warn

 
FILING COMMANDS

open(filename, remember=False)
Open the given file and process it according to its type:

  • A HTML file (.htm or .html extension) is displayed in the help window.
  • A text file (.txt or .doc extension, or a name containing "readme") is opened in your text editor.
  • A script file (.pl or .py extension) is executed.
  • A zip file (.zip extension) is processed as described here.
  • Any other type of file is assumed to be a pattern file and is loaded into the current layer.

A non-absolute path is relative to the location of the script. The 2nd parameter is optional (default = False) and specifies if the given pattern or zip file should be remembered in the Open Recent submenu, or in the Run Recent submenu if the file is a script.
Example: golly.open("my-patterns/foo.rle")

save(filename, format, remember=False)
Save the current pattern in a given file using the specified format:

"rle" run length encoded (RLE)
"rle.gz" compressed RLE
"mc" macrocell
"mc.gz" compressed macrocell

A non-absolute path is relative to the location of the script. The 3rd parameter is optional (default = False) and specifies if the file should be remembered in the Open Recent submenu. If the savexrle option is True then extended RLE format is used (see the Save Extended RLE item for details).
Example: golly.save("foo.rle", "rle", True)

opendialog(title, filetypes, initialdir, initialfname, mustexist=True)
Present a standard Open dialog to the user and return the chosen path in a string. All parameters are optional; the default is an Open dialog showing the current directory, with a title of "Choose a file" and a file type of "All files (*)|*". If the 5th parameter (default = True) is set to False, the user can specify a new filename instead of choosing an existing file. If the given file type is "dir" then the dialog lets the user choose a directory rather than a file. If the user cancels the dialog, the return value will be an empty string.
Example: fname = golly.opendialog("Open MCell File", "MCell files (*.mcl)|*.mcl", "C:\\Temp", "sample.mcl")
Example: dirname = golly.opendialog("Choose a folder", "dir");

savedialog(title, filetypes, initialdir, initialfname, suppressprompt=False)
Present a standard Save dialog to the user and return the chosen path in a string. All parameters are optional; the default is a Save dialog showing the current directory, with a title of "Choose a save location and filename" and a file type of "All files (*)|*". If a file already exists at the chosen location, an Overwrite? query will be displayed unless the 5th parameter (default = False) is set to True. If the user cancels the dialog, the return value will be an empty string.
Example: fname = golly.savedialog("Save text file", "Text files (*.txt;*.csv)|*.txt;*.csv", "C:\\Temp", "Params.txt", 1)

load(filename)
Read the given pattern file and return a cell list.
Example: blinker = golly.load("blinker.rle")

store(cell_list, filename)
Write the given cell list to the specified file in RLE format. If the savexrle option is True then extended RLE format is used (see the Save Extended RLE item for details).
Example: golly.store(clist, "foo.rle")

getdir(dirname)
Return the path of the specified directory:

"app" — the directory containing the Golly application.

"data" — the user-specific data directory:
On Linux: ~/.golly/
On Mac OS X: ~/Library/Application Support/Golly/
On Windows: C:\Documents and Settings\username\Application Data\Golly\

"temp" — the directory Golly uses to store various temporary files. All these files are deleted when Golly quits.

"rules" — the user-specific rules directory set in Preferences > Control.

"patterns" — the directory displayed by File > Show Patterns.

"scripts" — the directory displayed by File > Show Scripts.

"download" — the directory Golly uses to store downloaded files.

In each case a full path is returned, terminated by the appropriate path separator for the current platform.
Example: golly.open(golly.getdir("app") + "Patterns/Life/Breeders/breeder.lif")

setdir(dirname, dirpath)
Set the specified directory to the given path (which must be a full path to an existing directory). All the directory names listed above are allowed, except for "app", "data" and "temp".
Example: golly.setdir("patterns", "/path/to/my-patterns/")

 
EDITING COMMANDS

new(title)
Create a new, empty universe and set the window title. If the given title is empty then the current title won't change.
Example: golly.new("test-pattern")

cut()
Cut the current selection to the clipboard.

copy()
Copy the current selection to the clipboard.

clear(where)
Clear inside (where = 0) or outside (where = 1) the current selection.
Example: golly.clear(1)

paste(x, y, mode)
Paste the clipboard pattern at x,y using the given mode ("and", "copy", "or", "xor").
Example: golly.paste(0, 0, "or")

shrink()
Shrink the current selection to the smallest rectangle enclosing all of the selection's live cells.

randfill(percentage)
Randomly fill the current selection to a density specified by the given percentage (1 to 100).
Example: golly.randfill(50)

flip(direction)
Flip the current selection left-right (direction = 0) or top-bottom (direction = 1).

rotate(direction)
Rotate the current selection 90 degrees clockwise (direction = 0) or anticlockwise (direction = 1).

evolve(cell_list, numgens)
Advance the pattern in the given cell list by the specified number of generations and return the resulting cell list.
Example: newpatt = golly.evolve(currpatt, 100)

join(cell_list1, cell_list2)
Join the given cell lists and return the resulting cell list. If the given lists are both one-state then the result is one-state. If at least one of the given lists is multi-state then the result is multi-state, but with one exception: if both lists have no cells then the result is [] (an empty one-state list) rather than [0]. See below for a description of one-state and multi-state cell lists.
Example: result = golly.join(part1, part2)

transform(cell_list, x0, y0, axx=1, axy=0, ayx=0, ayy=1)
Apply an affine transformation to the given cell list and return the resulting cell list. For each x,y cell in the input list the corresponding xn,yn cell in the output list is calculated as xn = x0 + x*axx + y*axy, yn = y0 + x*ayx + y*ayy.
Example: rot_blinker = golly.transform(blinker, 0, 0, 0, -1, 1, 0)

parse(string, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1)
Parse an RLE or Life 1.05 string and return an optionally transformed cell list.
Example: blinker = golly.parse("3o!")

putcells(cell_list, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1, mode="or")
Paste the given cell list into the current universe using an optional affine transformation and optional mode ("and", "copy", "not", "or", "xor").
Example: golly.putcells(currpatt, 6, -40, 1, 0, 0, 1, "xor")

getcells(rect_list)
Return any live cells in the specified rectangle as a cell list. The given list can be empty (in which case the cell list is empty) or it must represent a valid rectangle of the form [x,y,width,height].
Example: clist = golly.getcells( golly.getrect() )

getclip()
Parse the pattern data in the clipboard and return a cell list, but where the first two numbers are the pattern's width and height (not necessarily the minimal bounding box because the pattern might have empty borders, or it might even be empty). If the clipboard data is multi-state but all cell states happen to be zero then the returned cell list is [wd,ht] rather than [wd,ht,0].
Example: clist = golly.getclip()

hash(rect_list)
Return an integer hash value for the pattern in the given rectangle. Two identical patterns will have the same hash value, regardless of their location in the universe. This command provides a fast way to detect pattern equality, but there is a tiny probability that two different patterns will have the same hash value, so you might need to use additional (slower) tests to check for true pattern equality.
Example: h = golly.hash( golly.getrect() )

select(rect_list)
Create a selection if the given list represents a valid rectangle of the form [x,y,width,height] or remove the current selection if the given list is [].
Example: golly.select( [-10,-10,20,20] )

getrect()
Return the current pattern's bounding box as a list. If there is no pattern then the list is empty ([]), otherwise the list is of the form [x,y,width,height].
Example: if len(golly.getrect()) == 0: golly.show("No pattern.")

getselrect()
Return the current selection rectangle as a list. If there is no selection then the list is empty ([]), otherwise the list is of the form [x,y,width,height].
Example: if len(golly.getselrect()) == 0: golly.show("No selection.")

setcell(x, y, state)
Set the given cell to the specified state (0 for a dead cell, 1 for a live cell).

getcell(x, y)
Return the state of the given cell. The following example inverts the state of the cell at 0,0.
Example: golly.setcell(0, 0, 1 - golly.getcell(0, 0))

setcursor(string)
Set the current cursor according to the given string and return the old cursor string. The given string must match one of the names in the Cursor Mode menu.
Example: oldcurs = golly.setcursor("Draw")

getcursor()
Return the current cursor as a string (ie. the ticked name in the Cursor Mode menu).

 
CONTROL COMMANDS

run(numgens)
Run the current pattern for the specified number of generations. Intermediate generations are never displayed, and the final generation is only displayed if the current autoupdate setting is True.
Example: golly.run(100)

step()
Run the current pattern for the current step. Intermediate generations are never displayed, and the final generation is only displayed if the current autoupdate setting is True.

setstep(exp)
Temporarily set the current step exponent to the given integer. A negative exponent sets the step size to 1 and also sets a delay between each step, but that delay is ignored by the run and step commands. Golly will reset the step exponent to 0 upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: golly.setstep(0)

getstep()
Return the current step exponent.
Example: golly.setstep( golly.getstep() + 1 )

setbase(base)
Temporarily set the current base step to an integer from 2 to 10000. Golly will restore the default base step (set in Preferences > Control) upon creating a new pattern, loading a pattern file, or switching to a different algorithm.
Example: golly.setbase(2)

getbase()
Return the current base step.

advance(where, numgens)
Advance inside (where = 0) or outside (where = 1) the current selection by the specified number of generations. The generation count does not change.
Example: golly.advance(0, 3)

reset()
Restore the starting pattern and generation count. Also reset the algorithm, rule, scale, location and step exponent to the values they had at the starting generation. The starting generation is usually zero, but it can be larger after loading an RLE/macrocell file that stores a non-zero generation count.

setgen(gen)
Set the generation count using the given string. Commas and other punctuation marks can be used to make a large number more readable. Include a leading +/- sign to specify a number relative to the current generation count.
Example: golly.setgen("-1,000")

getgen(sepchar='\0')
Return the current generation count as a string. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting string more readable. For example, golly.getgen(',') would return a string like "1,234,567" but golly.getgen() would return "1234567". Use the latter call if you want to do arithmetic on the generation count because then it's easy to use int to convert the string to an integer. Note that Python supports arbitrarily large integers.
Example: gen = int( golly.getgen() )

getpop(sepchar='\0')
Return the current population as a string. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting string more readable. For example, golly.getpop(',') would return a string like "1,234,567" but golly.getpop() would return "1234567". Use the latter call if you want to do arithmetic on the population count. The following example converts the population to a floating point number.
Example: pop = float( golly.getpop() )

empty()
Return True if the universe is empty or False if there is at least one live cell. This is much more efficient than testing getpop() == "0".
Example: if golly.empty(): golly.show("All cells are dead.")

numstates()
Return the number of cell states in the current universe. This will be a number from 2 to 256, depending on the current algorithm and rule.
Example: maxstate = golly.numstates() - 1

numalgos()
Return the number of algorithms (ie. the number of items in the Set Algorithm menu).
Example: maxalgo = golly.numalgos() - 1

setalgo(string)
Set the current algorithm according to the given string which must match one of the names in the Set Algorithm menu.
Example: golly.setalgo("HashLife")

getalgo(index=current)
Return the algorithm name at the given index in the Set Algorithm menu, or the current algorithm's name if no index is supplied.
Example: lastalgo = golly.getalgo( golly.numalgos() - 1 )

setrule(string)
Set the current rule according to the given string. If the current algorithm doesn't support the specified rule then Golly will automatically switch to the first algorithm that does support the rule. If no such algorithm can be found then you'll get an error message and the script will be aborted.
Example: golly.setrule("b3/s23")

getrule()
Return the current rule as a string in canonical format.
Example: oldrule = golly.getrule()

getwidth()
Return the width of the current universe (0 if unbounded).
Example: wd = golly.getwidth()

getheight()
Return the height of the current universe (0 if unbounded).
Example: ht = golly.getheight()

 
VIEWING COMMANDS

setpos(x, y)
Change the position of the viewport so the given cell is in the middle. The x,y coordinates are given as strings so the viewport can be moved to any location in the unbounded universe. Commas and other punctuation marks can be used to make large numbers more readable. Apart from a leading minus sign, most non-digits are simply ignored; only alphabetic characters will cause an error message. Note that positive y values increase downwards in Golly's coordinate system.
Example: golly.setpos("1,000,000,000,000", "-123456")

getpos(sepchar='\0')
Return the x,y position of the viewport's middle cell in the form of a Python tuple containing two strings. The optional parameter (default = '\0') specifies a separator character that can be used to make the resulting strings more readable. For example, golly.getpos(',') might return two strings like "1,234" and "-5,678" but golly.getpos() would return "1234" and "-5678". Use the latter call if you want to do arithmetic on the x,y values, or just use the getposint() function defined in the glife package.
Example: x, y = golly.getpos()

setmag(mag)
Set the magnification, where 0 corresponds to the scale 1:1, 1 = 1:2, -1 = 2:1, etc. The maximum allowed magnification is 5 (= 1:32).
Example: golly.setmag(0)

getmag()
Return the current magnification.
Example: golly.setmag( golly.getmag() - 1 )

fit()
Fit the entire pattern in the viewport.

fitsel()
Fit the current selection in the viewport. The script aborts with an error message if there is no selection.

visrect(rect_list)
Return True if the given rectangle is completely visible in the viewport. The rectangle must be a list of the form [x,y,width,height].
Example: if golly.visrect( [0,0,44,55] ): . . .

autoupdate(bool)
When Golly runs a script this setting is initially False. If the given parameter is True then Golly will automatically update the viewport and the status bar after each command that changes the universe or viewport in some way. Useful for debugging Python scripts.
Example: golly.autoupdate(True)

update()
Immediately update the viewport and the status bar, regardless of the current autoupdate setting. Note that Golly always does an update when a script finishes.

 
LAYER COMMANDS

addlayer()
Add a new, empty layer immediately after the current layer and return the new layer's index, an integer from 0 to numlayers() - 1. The new layer becomes the current layer and inherits most of the previous layer's settings, including its algorithm, rule, scale, location, cursor mode, etc. The step exponent is set to 0, there is no selection, no origin offset, and the layer's initial name is "untitled".
Example: newindex = golly.addlayer()

clone()
Like addlayer (see above) but the new layer shares the same universe as the current layer. The current layer's settings are duplicated and most will be kept synchronized so that a change to one clone automatically changes all the others. Each cloned layer does however have a separate viewport, so the same pattern can be viewed at different scales and locations (at the same time if layers are tiled).
Example: cloneindex = golly.clone()

duplicate()
Like addlayer (see above) but the new layer has a copy of the current layer's pattern. Also duplicates all the current settings but, unlike a cloned layer, the settings are not kept synchronized.
Example: dupeindex = golly.duplicate()

dellayer()
Delete the current layer. The current layer changes to the previous layer (unless layer 0 was deleted).

movelayer(fromindex, toindex)
Move a specified layer to a new position in the layer sequence. The chosen layer becomes the current layer.
Example: golly.movelayer(1, 0)

setlayer(index)
Set the current layer to the layer with the given index, an integer from 0 to numlayers() - 1.
Example: golly.setlayer(0)

getlayer()
Return the index of the current layer, an integer from 0 to numlayers() - 1.
Example: currindex = golly.getlayer()

numlayers()
Return the number of existing layers, an integer from 1 to maxlayers().
Example: if golly.numlayers() > 1: golly.setoption("tilelayers",1)

maxlayers()
Return the maximum number of layers (10 in this implementation).

setname(string, index=current)
Set the name of the given layer, or the current layer's name if no index is supplied.
Example: golly.setname("temporary")

getname(index=current)
Return the given layer's name, or the current layer's name if no index is supplied.
Example: if golly.getname() == "temporary": golly.dellayer()

setcolors(color_list)
Set the color(s) of one or more states in the current layer and its clones (if any). If the given list contains a multiple of 4 integers then they are interpreted as state, red, green, blue values. A state value of -1 can be used to set all live states to the same color (state 0 is not changed). If the given list contains exactly 6 integers then they are interpreted as a color gradient from r1, g1, b1 to r2, g2, b2 for all the live states (state 0 is not changed). If the given list is empty then all states (including state 0) are reset to their default colors, depending on the current algorithm and rule. Note that the color changes made by this command are only temporary. Golly will restore the default colors if a new pattern is opened or created, or if the algorithm or rule changes, or if Preferences > Color is used to change any of the default colors for the current layer's algorithm.
Example: golly.setcolors([1,0,0,0, 2,0,0,0]) # set states 1 and 2 to black
Example: golly.setcolors([-1,0,255,0]) # set all live states to green
Example: golly.setcolors([255,0,0, 0,0,255]) # live states vary from red to blue
Example: golly.setcolors([]) # restore default colors

getcolors(state=-1)
Return the color of a given state in the current layer as a list of the form

[ state, red, green, blue ]

or if the given state is -1 (or not supplied) then return all colors as

[ 0, r0, g0, b0, . . . N, rN, gN, bN ]

where N equals numstates() - 1. Note that the list returned by getcolors can be passed into setcolors; this makes it easy to save and restore colors.
Example: allcolors = golly.getcolors()
Example: deadcolor = golly.getcolors(0)

 
MISCELLANEOUS COMMANDS

setoption(name, value)
Set the given option to the given value. The old value is returned to make it easy to restore a setting. Here are all the valid option names and their possible values:

"autofit" 1 or 0 (True or False)
"boldspacing" 2 to 1000 (cells)
"drawingstate" 0 to numstates()-1
"fullscreen" 1 or 0 (True or False)
"hyperspeed" 1 or 0 (True or False)
"maxdelay" 0 to 5000 (millisecs)
"mindelay" 0 to 5000 (millisecs)
"opacity" 1 to 100 (percent)
"restoreview" 1 or 0 (True or False)
"savexrle" 1 or 0 (True or False)
"showallstates" 1 or 0 (True or False)
"showboldlines" 1 or 0 (True or False)
"showeditbar" 1 or 0 (True or False)
"showexact" 1 or 0 (True or False)
"showgrid" 1 or 0 (True or False)
"showhashinfo" 1 or 0 (True or False)
"showicons" 1 or 0 (True or False)
"showlayerbar" 1 or 0 (True or False)
"showpatterns" 1 or 0 (True or False)
"showscripts" 1 or 0 (True or False)
"showstatusbar" 1 or 0 (True or False)
"showtoolbar" 1 or 0 (True or False)
"stacklayers" 1 or 0 (True or False)
"swapcolors" 1 or 0 (True or False)
"switchlayers" 1 or 0 (True or False)
"synccursors" 1 or 0 (True or False)
"syncviews" 1 or 0 (True or False)
"tilelayers" 1 or 0 (True or False)

Example: oldgrid = golly.setoption("showgrid", True)

getoption(name)
Return the current value of the given option. See above for a list of all the valid option names.
Example: if golly.getoption("autofit"): golly.fit()

setcolor(name, r, g, b)
Set the given color to the given RGB values (integers from 0 to 255). The old RGB values are returned as a 3-tuple to make it easy to restore the color. Here is a list of all the valid color names and how they are used:

"border" color for border around bounded grid
"paste" color for pasting patterns
"select" color for selections (will be 50% transparent)
algoname status bar background for given algorithm

Example: oldrgb = golly.setcolor("HashLife", 255, 255, 255)

getcolor(name)
Return the current RGB values for the given color as a 3-tuple. See above for a list of all the valid color names.
Example: selr, selg, selb = golly.getcolor("select")

getclipstr()
Return the current contents of the clipboard as an unmodified string.
Example: illegalRLE = golly.getclipstr()

setclipstr(string)
Copy an arbitrary string (not necessarily a cell pattern) directly to the clipboard.
Example: golly.setclipstr(correctedRLE)

getstring(prompt, initial="", title="")
Display a dialog box and get a string from the user. If the initial string is supplied it will be shown and selected. If the title string is supplied it will be used in the dialog's title bar. The script will be aborted if the user hits the dialog's Cancel button.
Example: i = int( golly.getstring("Enter a number:", "100") )

getevent(get=True)
When Golly runs a script it initially handles all keyboard and mouse events, but if the script calls getevent() then future events are put into a queue for retrieval via later calls. These events are returned in the form of strings (see below for the syntax). If there are no events in the queue then the returned string is empty. Note that the very first getevent() call will always return an empty string, but this isn't likely to be a problem because it normally occurs very soon after the script starts running. A script can call getevent(False) if it wants Golly to resume handling any further events. See flood-fill.py for a good example.

Keyboard events are strings of the form "key charname modifiers" where charname can be any displayable ASCII character from '!' to '~' or one of the following names: space, home, end, pageup, pagedown, help, insert, delete, tab, enter, return, left, right, up, down, or f1 to f24. If no modifier key was pressed then modifiers is none, otherwise it is some combination of alt, cmd, ctrl, meta, shift. Note that cmd corresponds to the command key on a Mac and the control key on Windows/Linux (this lets you write portable scripts that work on any platform). The alt modifier corresponds to the option key on a Mac.

Mouse events are strings of the form "click x y button modifiers" where x and y are integers giving the cell position of the click, button is one of left, middle or right, and modifiers is the same as above. The following examples show the strings returned after various user events:

"key m none" user pressed M key
"key space shift" user pressed space bar and shift key
"key , altctrlshift" user pressed comma and 3 modifier keys
"click 100 20 left none" user clicked cell at 100,20 with left button
"click -10 9 middle alt" user clicked cell with middle button and pressed alt key
"click 0 1 right altshift" user clicked cell with right button and pressed 2 modifiers

Example: evt = golly.getevent()

doevent(event)
Pass the given event to Golly to handle in the usual manner (but events that can change the current pattern will be ignored). The given event must be a string with the exact same format as returned by the getevent command (see above). If the string is empty then Golly does nothing.
Example: golly.doevent("key q cmd") # quit Golly

getxy()
Return the mouse's current grid position as a string. The string is empty if the mouse is outside the viewport or outside a bounded grid or over the translucent buttons, otherwise the string contains x and y cell coordinates separated by a space; eg. "-999 12345". See draw-lines.py for a good example of how to use this command.
Example: mousepos = golly.getxy()

show(message)
Show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: golly.show("Hit any key to continue...")

error(message)
Beep and show the given string in the bottom line of the status bar. The status bar is automatically shown if necessary.
Example: golly.error("The pattern is empty.")

warn(message)
Beep and show the given string in a modal warning dialog. Useful for debugging Python scripts or displaying error messages.
Example: golly.warn("xxx = " + str(xxx))

note(message)
Show the given string in a modal information dialog. Useful for displaying multi-line results.
Example: golly.note("Line 1\nLine 2\nLine 3")

help(htmlfile)
Display the given HTML file in the help window. A non-absolute path is relative to the location of the script.
Example: golly.help("results.html")

check(bool)
When Golly runs a script this setting is initially True, which means that event checking is enabled. If the given parameter is False then event checking is disabled. Typically used to prevent mouse clicks being seen at the wrong time. This should only be done for short durations because the script cannot be aborted while the setting is False.
Example: golly.check(False)

exit(message="")
Exit the script with an optional error message. If a non-empty string is supplied then it will be displayed in the status bar along with a beep, just like the error command. If no message is supplied, or if the string is empty, then there is no beep and the current status bar message will not be changed.
Example: if golly.empty(): golly.exit("There is no pattern.")

 
Cell lists

Some scripting commands manipulate patterns in the form of cell lists. Golly supports two types of cell lists: one-state and multi-state. A one-state cell list contains an even number of integers specifying the x,y coordinates for a set of cells, all of which are assumed to be in state 1:

[ x1, y1, . . . xN, yN ]

A multi-state cell list contains an odd number of integers specifying the x,y,state values for a set of cells. If the number of cells is even then a padding integer (zero) is added at the end of the list to ensure the total number of integers is odd:

[ x1, y1, state1, . . . xN, yN, stateN ]      if N is odd
[ x1, y1, state1, . . . xN, yN, stateN, 0 ]  if N is even

All scripting commands that input cell lists use the length of the list to determine its type. When writing a script to handle multi-state cell lists you may need to allow for the padding integer, especially if accessing cells within the list. See tile.py for example.

Note that all scripting commands return [] if the resulting cell list has no cells. They never return [0], although this is a perfectly valid multi-state cell list and all commands can input such a list. For example, newlist = golly.join(list1,[0]) can be used to convert a non-empty one-state list to multi-state.

One-state cell lists are normally used in a two-state universe, but they can also be used in a universe with more than two states. A multi-state cell list can be used in a two-state universe, but only if the list's cell states are 0 or 1.

The ordering of cells within either type of list doesn't matter. Also note that positive y values increase downwards in Golly's coordinate system.

 
Rectangle lists

Some commands manipulate rectangles in the form of lists. An empty rectangle is indicated by a list with no items; ie. []. A non-empty rectangle is indicated by a list containing four integers:

[ left, top, width, height ]

The first two items specify the cell at the top left corner of the rectangle. The last two items specify the rectangle's size (in cells). The width and height must be greater than zero.

 
Using the glife package

The glife folder included in the Scripts/Python folder is a Python package that provides a high-level interface to some of Golly's scripting commands (it's based on Eugene Langvagen's life package included in PLife). When a script imports glife or any of its submodules, Python automatically executes the __init__.py module. This module defines the pattern and rect classes as well as a number of useful synonyms and helper functions. For example, consider this script:

from glife import *
blinker = pattern("3o!")
blinker.put(1, 2)
blinker.put(6, 7, rcw)   # rcw means rotate clockwise

Here is the equivalent script without using glife:

import golly as g
blinker = g.parse("3o!", 0, 0, 1, 0, 0, 1)
g.putcells(blinker, 1, 2, 1, 0, 0, 1)
g.putcells(blinker, 6, 7, 0, -1, 1, 0)

Here are some helper functions defined in glife:

validint(s) — return True if given string is a valid integer
getposint() — return viewport position as a tuple with 2 integers
setposint(x,y) — use given integers to set viewport position
getminbox(patt) — return minimal bounding box of given pattern

Most of the examples in the Scripts folder import glife, but it isn't compulsory. You might prefer to create your own high-level interface for the scripts you write.

 
Potential problems

1. The Python interpreter's memory allocator never releases memory back to the operating system. If you run a complicated or buggy script that uses lots of (Python) memory then that memory is no longer available for use by Golly, so you might need to quit Golly and restart. Python 2.5 has a smarter memory allocator that does release memory in some stuations, but it's still far from ideal.

2. The first time you run a script that imports a particular module, the Python interpreter caches the results so it won't need to reload that module the next time it is imported. This is good for efficiency, but it's a problem if you've modified an imported module and you want to test your changes. One solution is to quit Golly and restart. Another solution is to force the module to be reloaded by inserting a line like

import mymodule ; reload(mymodule)

at the start of each script that imports the module. When the module is stable you can remove or comment out the reload command.

3. The escape key check to abort a running script is not done by Python but by each Golly scripting command. This means that very long Python computations should call an occasional "no-op" command like doevent("") to allow the script to be aborted in a timely manner.

4. When writing a script that creates a pattern, make sure the script starts with a new command (or, less useful, an open command) otherwise the script might create lots of temporary files or use lots of memory. From the undo history's point of view there are two types of scripts:

  • A script that calls new or open is assumed to be creating some sort of pattern, so when Golly sees these commands it clears any undo history and sets an internal flag that says "don't mark this layer as dirty and don't bother recording any further changes".
  • A script that doesn't call new or open is assumed to modify the current pattern. Golly must record all the script's changes so that when it finishes you can select "Undo Script Changes" from the Edit menu. Generating changes (due to run calls) are stored in temporary files, while other changes are stored in memory.

 
Python on Mac OS X

Even though Apple supply Python with OS X, it is usually not the latest version. Golly is linked against the Python 2.6 framework stored in /System/Library/Frameworks. If you have Python 2.7 installed in your system you can tell Golly to use it by quitting Golly, opening Terminal.app and entering this command (on one line):

install_name_tool -change \
/System/Library/Frameworks/Python.framework/Versions/2.6/Python \
/Library/Frameworks/Python.framework/Versions/2.7/Python \
/path/to/Golly/folder/Golly.app/Contents/MacOS/Golly

If you ever need to switch back to the older Python then just run the command again with the framework paths swapped. To verify which version of Python Golly is using, copy the following code, start up Golly and select Run Clipboard from the File menu:

import golly, sys
golly.note(sys.version)

 
Python copyright notice

Golly uses an embedded Python interpreter to execute scripts. The Python license agreement is included in Golly's LICENSE file. Here is the official Python copyright notice:

Copyright (c) 2001-2007 Python Software Foundation.
All Rights Reserved.

Copyright (c) 2000 BeOpen.com.
All Rights Reserved.

Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.

Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.

golly-2.5-src/Help/refs.html0000644000175100001440000000744712156145314012744 00000000000000 Golly Help: References

Good web sites

Good books and magazine articles

  • "Wheels, Life and Other Mathematical Amusements" by Martin Gardner. W. H. Freeman and Company, 1983. The last three chapters are an updated collection of his superb columns from Scientific American (see below). The last chapter has an excellent bibliography.
  • "The Recursive Universe" by William Poundstone. William Morrow & Company, 1985. An entire book devoted to a discussion of cellular automata and other fascinating topics in physics and mathematics.
  • "Winning Ways", Volume 2 by Elwyn Berlekamp, John Conway and Richard Guy. Academic Press, 1982. Chapter 25 has the title "What is Life?".
  • "Cellular Automata Machines" by Tommaso Toffoli and Norman Margolus. MIT Press, 1987. Describes CAM, a machine for doing sophisticated experiments with cellular automata.
  • "A New Kind of Science" by Stephen Wolfram. Wolfram Media, 2002. Bloated and egotistical, but there is plenty of fascinating stuff.
  • Scientific American articles:
    "Mathematical Games" columns by Martin Gardner: Oct, Nov 1970, Jan, Feb, Mar, Apr, Nov 1971, Jan 1972.
    "Computer Recreations" by Brian Hayes, Mar 1984.
  • BYTE articles:
    "Some Facts of Life" by David Buckingham, Dec 1978.
    "Life Algorithms" by Mark Niemiec, Jan 1979.
golly-2.5-src/Help/tips.html0000644000175100001440000000741412156145314012756 00000000000000 Golly Help: Hints and Tips

Some useful hints and tips

  • To view a pattern file just drop it onto the Golly app or onto the Golly window if the app is already running.
  • When Golly starts up it looks for scripts called golly-start.pl or golly-start.py in the same directory as the Golly application and then in a user-specific data directory (see the Preferences item for the likely path on your system). If either script is found then it is automatically executed.
  • Displaying the population count can cause a significant slow-down when generating large patterns, especially when using HashLife. If you want to generate at maximum speed then just hit ";" to hide the status bar. You can toggle the status bar at any time, even in full screen mode.
  • Editing operations are fastest in QuickLife.
  • Pasting large, sparse patterns is much faster if using Or mode, or if the current pattern is empty, or if the paste rectangle is completely outside the current pattern edges.
  • The hand cursor can be used to scroll the view by clicking and dragging. If you drag the cursor outside any view edge then scrolling will occur continuously; ie. you don't have to move the cursor. If the cursor is outside any corner (ie. outside two edges) then the scrolling direction will be diagonal.
  • Actually, continuous scrolling also occurs if the hand cursor is dragged onto any view edge or corner. This allows such scrolling to occur in full screen mode.
  • While dragging the mouse to make (or modify) a selection, the escape key can be used to cancel the operation and restore the original selection.
  • Avoid the temptation to put your own patterns, scripts or rules inside Golly's supplied folders — it will make it difficult to upgrade to a future version. A much better idea is to create separate folders for your own files and put those folders alongside the supplied folders, so your Golly folder looks something like this:

    Golly
        Golly.exe (Golly.app on Mac, golly on Linux)
        Help
        Patterns
        Rules
        Scripts
        My-downloads (contains all your downloaded files; select in Preferences > File)
        My-patterns (contains all your pattern files)
        My-rules (contains all your .rule files; select in Preferences > Control)
        My-scripts (contains all your .pl/.py files)

    Use File > Set Patterns Folder and select the Golly folder. Now all your folders (and the supplied folders) are visible in the patterns panel, so with just a few clicks you can load any pattern, run any script, or switch to any .rule file. Or you can right-click (or control-click) on any of those files to open them in your preferred text editor. When upgrading to a new version of Golly, simply drag all the distributed files and folders into your Golly folder and replace the old versions.

golly-2.5-src/Help/view.html0000644000175100001440000001337412156145314012753 00000000000000 Golly Help: View Menu

Full Screen

Switches to full screen mode, automatically hiding the menu bar, the status bar, the tool bar, the layer bar, the edit bar, the pattern/script folder and the scroll bars. To exit from this mode just hit the menu item's keyboard shortcut or any unassigned key.

Fit Pattern

Changes the scale and location so the entire pattern fits within the current view.

Fit Selection

Changes the scale and location so the entire selection fits within the current view.

Middle

Moves the origin cell (0,0) to the middle of the view.

Restore Origin

Restores the true origin. The origin cell can be changed by hitting "0" while the cursor is over the view — the cell under the cursor will become the new origin and its location will be displayed as 0,0. This can be handy for measuring distances or for saving a location and returning to it quickly by hitting "m".

Zoom In

Zooms in by doubling the current scale. If the scale is 1:32 then you can't zoom in any further.

Zoom Out

Zooms out by halving the current scale. You can zoom out as far as you like.

Set Scale

This submenu lets you set the scale from 1:1 to 1:32. (A quicker is to use keyboard shortcuts. The initial shortcuts are: "1" for 1:1, "2" for 1:2, "4" for 1:4, "8" for 1:8, "6" for 1:16 and "3" for 1:32.)

Show Tool Bar

Shows or hides the tool bar at the left edge of the main window.

Show Layer Bar

Shows or hides the layer bar above the viewport window (and above the edit bar if it's visible).

Show Edit Bar

Shows or hides the edit bar above the viewport window. The edit bar contains buttons for undo and redo, buttons for changing the cursor mode, a button for showing/hiding all states (see below), boxes showing the current drawing state's color and icon, and a scroll bar for changing the drawing state.

Show All States

If ticked then the edit bar is made larger and the colors and icons for all cell states in the current universe are displayed. A box is drawn around the current drawing state; to change it just click on a different state.

Show Status Bar

Shows or hides the status bar at the top of the main window.

Show Exact Numbers

If ticked then the status bar is made larger and exact numbers are displayed instead of using scientific notation.

Show Grid Lines

Shows or hides the grid lines. Use Preferences > View to turn off the bold grid lines or change their spacing. You can also set the minimum scale at which grid lines should be displayed (1:4, 1:8, 1:16 or 1:32).

Show Cell Icons

If ticked then icons will be displayed at scales 1:8, 1:16 or 1:32. Icons are small bitmaps that can have any shape but their color is automatically synchronized with the cell's state color. Each algorithm can have a different set of icons. You can change these icons by loading suitably formatted files via the "Load Icons" button in Preferences > Color.

It's also possible to have rule-specific icons. Whenever Golly switches to a new rule it looks inside the Rules folder for a matching rule.icons file and, if it exists, loads the bitmaps stored in the file. The format of a .icons file is identical to that used above. See Help > File Formats for a description of the format.

Invert Colors

If ticked then the colors of all cell states in all layers are inverted; i.e., each RGB value is changed to 255-R, 255-G, 255-B.

Buffered

If ticked then window buffering is used to avoid flicker, but it does slow down pattern rendering a bit so you might prefer to live with the flicker. Note that buffering is always used if grid lines are displayed or if a selection is visible.

This option is disabled on Mac OS X and Linux/GTK because windows are automatically buffered on those systems.

Show Timeline

Shows or hides the timeline bar below the viewport window. If the current algorithm supports timelines (only QuickLife doesn't) then the timeline bar has a button to start/stop recording a timeline. This button is equivalent to the Control menu's Start/Stop Recording item.

When recording stops, or after a timeline is loaded from a .mc file, you'll see a scroll bar that lets you view any frame within the timeline. There are also buttons to automatically play the timeline forwards or backwards, a slider to adjust the speed of auto-play, and a button at the right edge to delete the timeline. Note that if the Control menu's Auto Fit option is ticked then Golly will force each timeline pattern to fit the viewport.

A number of keyboard shortcuts can be used while a timeline exists. Hit the escape key to stop recording or to stop auto-play. Hit your preferred keys for Faster/Slower to change the speed of auto-play. Hit your preferred key for Start Generating to play the timeline forwards and, if you wish, use Preferences > Keyboard to assign a keyboard shortcut for Play Timeline Backwards.

Pattern Info

Displays any comments in the current pattern file. golly-2.5-src/Patterns/0000755000175100001440000000000012156146014012071 500000000000000golly-2.5-src/Patterns/Banks/0000755000175100001440000000000012156146014013127 500000000000000golly-2.5-src/Patterns/Banks/Banks-I-demo.rle0000644000175100001440000000463012156145314015726 00000000000000# Edwin Roger Banks, PhD Thesis 1971 # # Two-state, five-neighbor CA for a universal computer. # (Appendix I) # # At the top are shown wires in several configurations. Signals travel # down either side of the wire and can be destroyed by single cell # protrusions on the wire. # # Below are shown a fan-out junction and an inside-to-inside turn. # # Below that is shown a clock, a periodic emitter of signals. # # At the bottom is shown a logic gate. If the input from the top is A # and that from the left is B then the output signal is present if the # function "B and not A" is true. The inputs have to be correctly # synchronized for this to work but this can always be arranged. # # Banks reports that this functionality is sufficient for constructs in # the CA to be computation universal. This CA is notable because there # are only three rules in the rule table (see Rules/Banks-I.table). # # See: http://www.bottomlayer.com/bottom/banks/banks_commentary.htm # x = 75, y = 123, rule = Banks-I o18bo$5ob14o$4ob15o$20o6b5o2b5o2b5o2b5o$o18bo7b3o4b3o4b3o4b3o$27b3o4b 3o4b3o4b3o$27b3o4b3o4b3o4b3o$o18bo7b3o4bobo4b3o4bobo$15ob4o7b3o5b2o4b 3o4b2o$16ob3o7b3o4b3o4b3o4b3o$20o7b3o4b3o4b3o4b3o$o18bo7b3o4b3o4b3o4b 3o$27b3o4b3o4b3o4b3o$27b3o4b3o4b3o4b3o$o18bo7b3o4b3o4b3o4b3o$20o7b3o4b 3o4b3o4b3o$4ob15o7b3o4b3o4b3o4b3o$5ob14o7b3o4b3o4b3o4b3o$o18bo7b3o4b3o 4b2o5b3o$28b2o4b3o4bobo4b3o$27bobo4b3o4b3o4b3o$o18bo7b3o4b3o4b3o4b3o$ 20o6b5o2b5o2b5o2b5o$17ob2o$16ob3o$o18bo5$o13bo4bo$5ob14o$4ob15o$20o6b 5o2b5o2b5o2b5o$o18bo7b3o4b3o4b3o4b3o$27b3o4b3o4b3o4b3o$27b3o4b3o4b3o4b 3o$o6bo11bo7b3o4bobo4b3o4bobo$15ob4o7b3o5b2o4b4o3b2o$16ob3o7b3o4b3o4b 3o4b3o$20o6b4o4b3o4b3o4b3o$o18bo7b3o4b3o4b3o4b3o$27b3o4b3o4b3o4b3o$27b 3o4b3o4b3o4b3o$o18bo7b3o4b3o4b3o4b3o$20o7b3o4b3o4b3o4b3o$4ob15o7b3o3b 4o4b3o4b4o$5ob14o7b3o4b3o4b3o4b3o$o12bo5bo7b3o4b3o4b2o5b3o$28b2o4b3o4b obo4b3o$27bobo4b3o4b3o4b3o$o18bo7b3o4b3o4b3o4b3o$20o6b5o2b5o2b5o2b5o$ 17ob2o$16ob3o$o5bo12bo7$14b5o30b5o$15b3o32b3o$15b3o32bobo$15b3o32b2o$ 15b3o32b3o$15b3o32b3o$15b3o32b3o$15b3o32b3o$15b3o32b3o$15b3o32b3o$o14b 3o32b3o$3ob14o15bo16b3o$2ob31o16b3o$15o3b16o15b4o$o12b2o3b16o16b3o$13b 2o3b3o12bo16b3o$12b4o2b3o28b4o4bo$18b3o30b7o16bo$18b3o30b24o$18b3o30bo 6b17o$18b3o37b17o$18b3o37bo15bo$18b3o$18b3o$18b3o$18b3o$18b3o$17b5o8$ 9bo25bo$9b27o$bo8b26o$b9ob25o$7obo26bo$8bo3$16b5o$17b3o$17b3o$17b3o$ 17b3o$17b3o$17bobo$18b2o$17b3o$17b4o$17b3o$o16b3o$3ob8ob7o19bo$2ob8ob 28o$17o3b20o$o14b2o3b20o$15b2o3bo18bo$14b4o! golly-2.5-src/Patterns/Banks/Banks-II-demo.rle0000644000175100001440000000357112156145314016042 00000000000000# Edwin Roger Banks, PhD Thesis 1971 # # Three-state, five-neighbor CA for a universal computer. # (Appendix II) # # While Banks's Appendix I rule (Banks-I) required an infinite extent # to be computation universal, his Appendix II rule seen here allows # a construction to grow its memory space as required. # # At the top are shown various wires and signals. Two signals that # collide head-on either annihilate each other or pass through each # other, depending on their initial separation. # # Below, junctions can be used to fan-out the signals, and for making # turns. Where two signals meet at right angles they pass through each # other (crossover). Where three signals meet they annihilate each other. # # If a wire ends with a single cell as shown, a signal causes it to # extend by two cells. An echo signal is generated, though this can # easily be destroyed by a second signal if required. # # A wire can be extended at each end by a bouncing signal, for a bit # of fun. # # In the lower-right is shown a repeater-emitter reminiscent of # Langton's Loops. Two signals are sent around a loop and down an # extender wire. # # See: http://www.bottomlayer.com/bottom/banks/banks_commentary.htm # x = 59, y = 85, rule = Banks-II 17.25B$17.2B.A17BA.2B$17.25B2$17.25B$17.2B.A16BA.3B$17.25B5$14.3B$14. 3B$14.3B$14.3B$14.3B27.3B$14.3B27.3B$14.3B27.B.B$14.3B5.3B19.BAB$14. 3B5.3B19.3B$25B19.3B$2B.A21B19.3B$25B19.3B$14.3B5.3B11.19B$14.3B5.3B 11.2B.A15B$14.3B5.3B11.19B$14.3B5.3B19.3B$14.3B5.3B19.3B$12.19B13.3B$ 12.19B13.3B$12.19B13.BAB$22.3B19.B.B$22.3B19.3B$22.3B19.3B$22.3B$22. 3B$22.3B$22.3B4$18.22B$18.16B.A5B$18.22B3$18.22B$18.B.A13B.A5B$18.22B 4$26.7B$25.2B.A5B$26.7B3$28.3B$28.3B$28.3B$28.3B$28.3B$28.3B$25.9B$ 24.2B.A7B$25.9B$28.BAB$28.B.B$28.3B$29.B9.3B3.3B$39.3B3.3B$39.3B3.3B$ 36.15B$36.15B$36.15B$39.3B3.3B$39.BAB3.B.B$39.B.B3.BAB$39.3B3.3B$36. 22B$36.23B$36.22B$39.3B3.3B$39.3B3.3B$39.3B3.3B! golly-2.5-src/Patterns/Banks/Banks-III-demo.rle0000644000175100001440000000175212156145314016152 00000000000000# Edwin Roger Banks, PhD Thesis 1971 # # Two-state, nine-neighbor CA for a universal computer. # (Appendix III) # # Here Banks shows that his previous 3-state CA can be implemented # in a 2-state version, using nine neighbors instead of four. Wires # and signals operate in a similar fashion to Banks-II. # # See: http://www.bottomlayer.com/bottom/banks/banks_commentary.htm # x = 89, y = 54, rule = Banks-III 30bo35bo$52bo$6b2ob26o14b4ob30o$5b4ob23o16b5ob30o$6b2ob23o17b4ob30o$ 31bo$31bo34bo5$6b2ob23o$5b4ob23o$6b2ob23o6$6b3ob22o$5b5ob22o$6b3ob22o 4$14b3o$14b3o34b3o23b3o$14b3o34b3o23b3o$15bo36bo25bo$14bobo34bobo23bob o$14b3o34b3o23b3o$14b3o34b3o23b3o$14b3o34b3o23b3o$3bo8bob3obo8bo21bob 3obo19bob3obo$3bo10b3o10bo23b3o23b3o$3b25o14b2ob18o5b2ob18o$2b27o13b3o b17o5b3ob17o$31o11b2ob18o5b2ob18o$14b3o34b3o23b3o$4bo7bob3obo7bo22bob 3obo19bob3obo$14b3o34b3o23b3o$14b3o34b3o23b3o$14b3o34b3o23b3o$14b3o34b 3o23bobo$14b3o34b3o24bo$14b3o34b3o23b3o$14b3o34b3o23b3o$14b3o$14b3o$ 14b3obo$12b5o$15b2o$16bo$16bo! golly-2.5-src/Patterns/Banks/Banks-IV-constructor.rle.gz0000644000175100001440000003071512156145314020137 00000000000000‹K¤5IBanks-IV-constructor.rleí}mܺ•æ÷ó+z‘Ù®u[*¹º:@>ØÞ @>3‹`g¾,úÚu¯;Óîöt·ãøß¯$Š”ø&‘¿<=¾¼>ß½Þ?=^=ýzõ±ùóÛÇæï»ÇOW¯Ï÷¿ýv|¾üíêþñêýÝã½¼ùóßèwÕãÿùôô¥þ°ºóõóñªºñóë›ÏõCÇêÕËêOîWÿóïß^^¯^|=^ýáKþ‡ÿÕ¼ùåøZ½¤¾çËÝÇÏõmÏ߫ʚ·ÿŸê‹u _>>ßÿrüTÿÒ»¯_«WßÿóêÏ«ßÿ/Ù¿eM‹þp•ßÞäWýü¿ë÷½Ü¿\UÿUïøx÷õî—‡c}ï·ÇûŸ_îª.~ùúíõNõ°ßåìê/O¿Ý¼z¹ÿíñîá¥~Eõí}Õøê_ïîŸ_!^êö¼T¯9¾\åÍ{ŠV^wÿ8>\ýr|ý~Þ½~®_T=×Ü~µË®þõéYûÙŸšf«ö>VOÖ_Um}múüúÔ6æê{%š¦W¯Ÿï^åï|zú^ýHõÍÃñMcÕ‚ï÷ÏÇ—þÏ5â|ÿ£zû·úNý}Õû?>=<Ü:þtuwõýùþµ¾åîù‹lÌñŸ¯•ÌŸ~ª»×Èô±yÓQ¾¿Gõ¢êîúÕýWu +«'³ɯwÕÇÏ5Q¾Õ·Õ/«îk~è®Å?îê^ÿò£êøß%)ïÚ&‹žü¹~¤Â÷øÏ»/_ªf?<©N½©DpÿøÒ ·y¶¾íêùøµ‚âøüæø¥þíçêMµ´ä¯^Ý¿Š–ªG«†ÈVW½­:øýéêÓýÓ§cÓ×O•”?6¬^ôëÃÓ÷Fâ‚6Ww/ÕÏý÷·ê–O’Ì÷M£~½ÿí[;Ø9vÍ|ü!í§J5ß+L«FÜ5 ??_^îžö¼~}Suéáþ£x]3®^¾Uƒõåõ¥åÈçšú¿¾|m†ïǧoŸêWõ`ú~ÿú¹Ñíõ›OÇßž•”žÄÈø©îãÝ?žî?5oùõ®ékûÎêR2U/þðªõ㩺ãYŽþ—»/Ç«ÏÇZ3T‚¨ü§oM×kâ><ÝUÝ«žþú£~ Êí®ÞrücõÀç×ׯüùçïß¿g¿<½¾>}y¸ûq|ΪQü³øûç_êçÄ¿ÿ¯úøËññµ–Óç×/ìÿýxüãÕ¿WJäëëËÏýñúùéñç/wÿu|#•ÙÕü§çìëê¡^ýéªV”Ån÷ÓÕêJaVÚ©bÑŸ:ØÜpg»ùMõÏïåß²úƒêßæ“üö¶ú2Ëo?È{êO>ÕMÕÿQá½Íñª›úwÞÖ?¸«?ܵÑN»¥º~Û<ÙÞ$ÿîßU?–ÝÔ¿•7¿R¿Eü­ÝT7óF4VÜÖ}ÐÝ·¿©?ï£]ýŽ›ö•æ÷ûêσޠG#©½ýå×ͪÿÞ~Èn›ÕŸÕwmCm‹Šæ%·Í¿EFýO´7Þô^w£¿K5QüL+[ÕÈöÓ£÷»æ»q%þû=õ¥¹kZ#.ŠæZ\ôqq¾©•IYßQÜ ù· ëþéšU6Ò,n³ñ?j[ÚÞ³×eöþ]þ¶úgW_ÜÊ‹y¡¾Ú‰ zW±A|$o–÷Ö·îÃ^Gê}ïˋþfchìérèéö+ò=}è}>ÚZ?xÝïu!*TFäKã À‹Âš<‚ ÍÛ¼}¿1U¿)˜XC/&ÙñÞ›ã_L~ D¼7”ºÃí¥DIHAˆo(…dÖ/{ÔEÒ˜b:qðýÀÉø²Oè‚ñ4®šÔûŠ·¾Ÿ"ngiQÈOB¿Ú‹o\¿IL¾‰ß$ #¿éùIJEEï*áÞ¦üºþãGÿî´ß&&ġĕŸìrg3„TxÍ7¯­ f+D#È' ùšÝn¼=t~©„6g"®¨_ßɧ­†]dyÚE!„iW²^)®{â©¥"¸Wt£-$åU ©Ãô 5#¦…ÄWµ0ÀíÇ[HqB<1Ìb\ÌæÙ£\4ð¢cYk Íã€qrYŒ‹Rk2lý¦R¢0µ¦ÛÉ®•µ5¨©S™åñ¦W¬¹Š±‹h1¥*X{Nß+€«sÒLòb õ¼vqè7¬T.›¿ÍtqÎEÛ0 nô Tíõ¸ )‘Z›‰mÀ„jê<½vèm¦ôÁ§ÚL) 8«ÍÄÕmĹ †JsÐrFaŸifƒÐÉçyAw“çm hsiS–dwE¿…¥ü­ñÄe‰è—%õÿ“!òÃxë§èÖŸ%†ºÖ apëíÆ_L©Xm'&ë' ÷´™e£²ª­¥|:„?Ä4¤…b›ýT¤wcFJ¿ $ꦣ½¼/FÎÕðI)EÐÀ ®Rjú3ñDGm¸9µ$£œ btcÂé¹àNé½8¯aŒ 1ǰ…¡lçá1Õ ¦É¸|>RÄ´—KìHçaA\‹Q(]ÀTµh¿šèUĹÔþC¾¢þ”+ëO±®þ ŸJ½-«;ÃlCw.Û¡¬•ÁT¼òt–jLE,lvŒ-Ì×áq§ÜLÈ늊?—)‹›Þ±Ùr¹svlþ¥yulIyau/¾¢16Ò¯©ÓT#ŒB†ØH¿.–E´ûE!#l¤_3HòÚ^´Ixõ&iýYN*䲋ñ=\ÈœPÿã=\®Y:;HëqºDþ/‰¤ ñQ„¦‘¯y+ëê ˆyœ]¥DXµ®Îj®ó: V­«KQ³û°®® ¸‘’êO¬ QL¹´®M1åþÁº:Å”fn´ž.D/õÇêPOiñjIë)­Z+5+¦TÇÞʧÇú¼è »1°ZŸ‰1zRœG½üqܘ\Ù1 g÷@ŸçŸË<Ä༎쒢6…r{Ö8æ%/j[ÕÔwÑ€/Ò©Þk=ìw~3æ+ú¿¶cÛ%þÁ<­ž÷þA¿~Ú7Éê­²~@ß­ŸõC~õ¬‹Ú¶Jûfú¦ëªJ7Ý(/gÞ½pöœbФ°öœùu˜ )Pš4)Ì)Ç\&IAÂò“9Úˆ 4)¬E?ÊOö*p«ôcº<Oxò¸Èj ·<ê âÊ£T¼_FÁŸˆ“½òØž!-ÆåÑ…'%e‡Çű•@cX{8”Ǻg”‡CwSâ#eN\MÒ+ü ¥·[æ+ª¼lßùe.rÔOÉ4Á³’ðA>í>|KøüJ©ZÂ"ý1á 5 álL@}èzKø§Ú>Tñ ŸB¤?"ü­J½3${ÄKgŠ—ÊáÈn½)û˜=Bü§ÄðU>ÖŠúk‡èáSˆôG„¿Ù¶Ý^µÊ"¼Uîg( n±Qpþã‡ÁƒÁý4P8™ût’ ÃiÎCò€@Q(¸A€J²Aðl¹ˆ‚„h¤=4Ò 4Ry­É\%£o¤sŒŠ‰VS¹ñÐà ®­Ø«H”YZ»îmk ÿøH&kò}Ÿ„‡1gt°ªDáÑ,ëé¤$<`ÎM<ÒîùÍÌy6½9?xáÐÑ XsctœÅš§ósÎ Á–wh\|㤞B‚)×ÇÔ¦|@WQ°äòB5–<[Œ%Ï—ÏÊ”CxhpÀ–KQ#.K4æi+ÄåÙÒìæiöiÌyè´ÌùD‘yÙ—þ­¼7ÊŽ`Ö¼LÓþ¬ysR+˜¥ °´å}§ÀxK[®³¾9g#†<á1t8Y-¥b™¸`'Þf+š"#.0bäð€Á¶ÈÂôËonÛgˆ«Ò0tœ%mU˜ÁèX]Ôèˆð²ý†Ô ‚¿&rymߢ@ššC¨#rùP§Ô2— „%8kÒŸ‡a¢Ð©·ÎfDj ¥„­{m€º­{¥ŠÍ&@gÉL;£¡Q€°šË輫¹b"æ\¶\räÝr)JÅ¡´éB¥M£z@„íkL€Æ·¯ÉûéB¤+9ì³"G¡˜íý¡ÇBè"GZ¹Âă…Ð%&r§£€‰ ¡Ëž<‰‡a„.;ñзC˜x°ºüÄC³áBgunåÓÈžÎ/{ÚX$…GEžb†lÅ|²Â%ìcåha67åx01‹ƒ ºqzÝXB†Å&dS6d5ÌÜA3šR3Âk\œf 5fÐŒ&d—=ªNã0fsS"¢VÉ{‚•$¥8 <”ΘàÅQä¸CK@œàr cè5ýÁLŒÞ”31#Øsä5-Áò8;þò¸:„#æÀC`àÄn¢”Iv˜j3±»üT›RšÄxMw°ÅÀî¼kQFœM<7Zà]´¸Q„y*.ȯÕÍɃ›/Z0N5™ªžöÂHì´KwÖ##Z˜€Âˆ:Fè’Œèè…•Ë0¢MäÒÁ—_«ç}ú—˜à62A¶Ï­çÉöEƒ+†0\l{o‚{–mï›Ò‘hp±RÕw–˱×) \1„çtàŠÑ7Ÿ8çÀ¶…–XØJh‰-*Ûml•Á%¶ ZbOºÝ(›p¶7lSw|Ї­ gS°UÐ+U!¡%¶(oðùRÄÄö=°°zuô°¹%&¶¢%HHõ°xš„Ôõ ¸íæ‹PÜ©ª#ƒ â‚+†0\,#4Á XF!«Ü·iȲÊêE^˜±x±c8 fØáÅÚá2 f™ó€/ÝÁ¼$_º…áðZÂaÊ´3¾NBëuL”/“вQ&nJºA™ºÁÌ@§‹˜(§œ.b£Lü‰ÔÑÍhâÁÖØjâƒ2V­›(_vMW?˜¢° yfì}fÂ|ùâòºETa¥RÇÖÊàs«å) ÒHÀ‰›CöÓ øÙ²Ÿ…âá€cÒ|I™“ý(àˆ»ÖwµQp‣®oŽ^[.m8¼¶xmy¼ׇ×f>o¯í7œ6 ï9m.®ã ŸmM>›o$Úl¼×á²)}.ËXÖÌYxÏÎcÂá±­ÉckSéêqu·z”7ØÐ/±¼!?x '®žo^‚å³ôsZ>Ûæbb†½ ½Ü–Ÿ§ñQplBÞ‚ã2yDoë‹ÞLä‰ï×ï°üÌõ½ÏÔG!5bòóW÷mD}ŸmOß_ë0÷“ºI  #603I0Û ÌÚÒ)ã$€*X“*(    ¤/U0‚U«‚¶î ª`„+Wð   rxPí$?4Á V­ \>H s¨Ææ)‚šÄUX°¶Ån7l7 Â8€¢›K, ð:"xmñ—¡óZ¥à H@§ØÎšÀ"A„&ûÏu€÷öȉ² : RТü+sütÀj>ÖQ.Òˆ¹ áBøà£¶D[þ–h"¡èUÈ*m1«e-Ù°hÖB 0ŒÎÀ\ɺÑAå€|ƒÍ†ÕæÒl…`EÐÁÏ:ÅQï°U£É†”­@“¸Æ¢ø[§SÜtÀÖé&†·Ne¬=èÕ‹tbHׂg7(:1cÈ‹³Æ¢´uœ1°¾13UÆÚÖ»:cPe`‡` ºjÈJvî×7¤0£O Ì|71–8ßÕ&´»{•^ƒêPr@ó@7èÖÐC1 ^ÀÿÌÖîö½Œd'矻Æ¢s[¶éó Óç.bôyAiÄÀþ Ëß¿!ÆÅÀ¤Ys¡ñbµ“f9#Å%=‹TçóV)%f­1Ͻj³Ö‚˜ÎçN5„YkAlç³W‰ï}¾Ã!x•±hï3×Ãâ'?w"±•ÆŒ>1äB@¸Ÿ1¦t?¯ ¨7öÈÆMƒâlk#K+ÚûÅz9"؆T¹Æ‘ͥʇõÈN~+SåÉy‡ h—Ñ–a‘lãQ¤U(XkÖ£HÓY¯5ÛGPëKi²ê©·vR6†#M["ËLgd½)²x="®ò.XIæN¼192ËoÚÈW=Þ½:Œ-Ä·:Í[ Q– QÚŠã$¶ J‘¦[ô8زþ §õVbØ‚º€ÍfQÚrå0¶ /ëbË–ò²~ –çc¦GÖ ‘SÇN²lqêxØkiÉÆ$ 6te‰‹¬|N Eåæ|d!”+­©\É&‹*–O' v˜2ɲަ”ÏB†jI#‹raYdA‰¬I–™”È^‹Ä}lfÎf NOu°em«ùB£çA¶(Âb uÊ%-˜Q4ÙrÊÅ„<®ÆÌ(:زÚÅv›uõEÉÞ ŠrÃùÿÞ ]çäÍÓu­/ãã éÄÁέp7ŸŒ9X´‘-#ÒÆN(mÖ;•ohƒÒ©­•N¥Ñu.Úl¨ÎÁ¶RnÚ`ZÓ’=Úxƒ)âÎ#(…’êÝ`ÒÉË›ËO:‰äMobRýZ¼£ƒª_ƒ6Põ{Ð9À /¯>ƒ¤2D‰Ñ–Î :Å'‚ôYé")¥„l©â‹BÁ ¢S^­õBàÕ1h¢À+€@È/; „üriHùÔ:ƒb„Õþ6V;“n3(œ@Øà Ë^Þùüh¤ƒêà r‚d rz6¨&r¨Y6L–÷ðl¦½LgW£q„úÔ÷hÒT ¶¨uyLv^›#Y\Ze)ó0—Æ©½ä¤ÒõR9H%¨%¨¥,X-µ^’L£\¢2r‰¢c6û)/ü\šzölW¼élW´¹s°Šâ̓UÄ^žQ³Šâhåf¦õmV¹¦õK­ü¬¢ZùY…£}LV­iݲ8Ú'ŠVnVáèkØ@E«ƒA˜@˜Àmâ Ê*X@›U6©Êæ-'0€a5VÁ«*@›T0€0€}V¹IÅ7€‡ ÐI*@†çöÁÚ´r³ Ðf•+ êK®Ã:ihÓÊÁªYPØÀ0e¿Ž6Т•›U°6«6°ð¹V°NZÁÚ´r° 3°&­NP ³×Ô5„‘hèøEœ2PÅ/J&XŸ_²4š`¿°NXQE1% Ñ`ÌàVÐÈ _XAc)0ׯqãü2è…­2°U†‡_ï­2Y Át~á]a ©"Xëu'ШÅS Ë•A5)u)"ÙŸúË2Õ@5yqVª¨ªÉ‹sRí ©Dl¦ÁUÓ¤Ô¥ˆd2YߦiÙ™™&50-ÓÀ40mLƒõÓ€ikbZ;»‰4¨–!£ª­„j˜'Õ&¢f?Aµi¨VÀWÕ&¢|5Pm¢ò¡¢e•¢Z÷|,éP‰¢È ÒÑAgUçdÉ7s’÷<Α®é° pÛm\f<ÎwqAÛ–S1EÜÅ8bJ^hœëY¸œëŽ˜áié°¢E^h¤ÃŠ‹tÆŠq¢G`êEƒôÊ=7ý°bOQE1eȹ eéôKdéôKdŸrÕ#)죔xÖbéôÂdE§»‘ìO&½<›}Ä lûˆØ*öQb¡³Ùy1ŸlJëïunW íE¼J?ÄRêRDZ¼‘æúõ‹˜[áP÷ »~mäÑ=¥Þ¨uu°Ãç¯àì3ÍCÄ@ª“åÓ 2b3·Ú§kDÅC b(±™›BSJÝ¿¡iG:Õl?%)Œ“#””qqºn¬)©ââDÝx»“bèÆæLݸW aèÆæLÝØ¥>º±yO7véºJŽ1’ø~£ä=WKR%GIL¿±a$…Pr„‘ÄôKÕ¦–$¦ß˜«†8Ãf¡%Õ{Tû]ä$NP­ÈIì‰cI|~±q'ŽQ¬ /4rž´X!Œœ^nJG”—îV!Ozº›xƼ妜Z᥻‰aÌ7)ŠœnnØ+nR9Ýܤ¤U»¼}"O;šÊ|P O;š*ÆÆò´£)â4w¹…uOq𻼰thàiî5hÚ±”4íXŠ&˜>š†î6+Ô©‚^õÈ`lK5&cUZ)±tŠj‹¦ä–ÏØV±S2V(ÖQÂBÅ: ›]LÅvìì+»RÅvÔNá®R±é^,âÔ»FŪG’¹+Ã.x±w'÷b}Ô¥ñuu‘(@¢ €º‰‰‚Žù]‚̧CY,›œ‹mX¬4uj.¶a,;‹…c³ÎÅŠ s DzXç%ùÀ-ÕpĪ‚Xì¨ ~D ‰‘Òu)ÝÌ$ñ„Îp‘}¨þû}Å’2/÷²¼~›}¨>§þÝu!ÿ(«ËîqÏ xEœ‡Õ±ÚpŠ®”išbÖq)ux¹V¸=OW=”þ>zßmí™'6¦'¦w¥[E*‹aŒ,:—Ô/½L{¹¸ï?|B•’¿˜˜;’)ÎñW•S²(úï%‹Ëþ[†Õ71D¢üÙs,D1gX'z¿±Úk`(ž(àØ÷|V{ÚHËÿStÖ*…{Ðúí.P ß ó7‰!ÓˆÙ‘îü±êùèòëg«ZR?u©S‡óæÔaf3N³ s/~s+åܧ·ç„\Q?>£ šß°if]»Vøƒ3by'kÛf³B­…Ä÷,ûñä¡B¼ÜTå>¬…Ä­åçÕyÃ<{”A¾ÜX¶%8Ç­µºæÌ:iu=ØTâJõ¤s{žXÊ<±æ;ÕŸq=4ÜTâŠUÀÌë!Óf´Ò§ &ò2Zzùõ¶¥l—˜oLÏ_OÈÙB5ÚßæÙYÓfgà‘Fµù¥Bçšm&î’´3/ÜÝÇ úò£0—Œ¦Dv\b挞Ý0<Ä’ãò£ÐÍçùÏ“/m Je‡18EÐ!¿YØü¢ßxâî±7u%27^ÑÏݲ±Ä™U\tëg”É(û-]ì“…Ý Ù‹%)ý&”pwCõ‚ݘhïˆ&ºé†êqµ’èOz7º^˜Sûˆnt½˜[&0÷ ¡1§ :F7T/.¾ÓOçé/uå‚{`,­ZRÃb¹‹÷•í\À¨á=ËÝ^K­Í*|[jw„%_O„I_QVÆ7¡ÖÓŸº3ãî”ZãUЯyçh‹èŽ-Ä×ññxÇ—¾vÖÛ1âÄ;ªcYã¼wuŒ¸ÛY_>ËûcŒ¸ëyçh'©Å™'B†ÙrO;$õkþ{ÐFõkAe.e¿žu¨5Ôܼ\©³ÕCâ*Ñž29é¤Ï!Ä‘ÎÛ‹±XL™ôwpùûÊ—ZwÖ}¦Ö×UŸ§'¢ gWW§fE` «ÖÕ…·"Tïêj‚'ÕŸU+¦Ü?Zצ˜rÿ`]b:$¡ªõt!z)´§ëp—T¿6rÎKc`UÇFúLŒÁ;§‚à}Ö×JÙäWc·¿ÏëËe†²{¨Ï Ê.p^Û”!}éòÒ’¥ÖAõz˪jaµü½_õIªÂ|í”ù íý:xŸ ÑäV‰ÜâÞžrÐ{€_·¾WÈoõ¹´uÛT÷à oåê¾ÔpVI˜ ¬Í»Þ^´4),?;%ܾŽ÷IbXA’¹ð’aSé¿4)lAAÊ‚Ïâ ¦8Ä;xâ8ßzxy4MaÊcž%ûdy¬Ò’æiãE.´ºü0O+ 5²ËćàÉÒ=.MyS˯êTìPä ¦8Mxâ¸ÜÒ§­ÝºcîÔ¥›Ì\”Yol؇ÑVy"|T§`H1f“ eï qíðò Ð,}Á­câ³|åÐï;1ΤTrY‘«Þ”ˊâ2ëû±ŒÃL×@I“ÐF +*¡M:~¹òK½ÑϺ€ ¨­Ìµ- }+èé=]jâPa¹[R›Nä›oŠŠ8ÃN‰ju{—¬0²n@ ¨¶ù8hréÚ$zmÄ6 žm¡…Èl»©ÇÂ+3âM–G´YΡ ó˜D´.³µp?(3ø™‰âÑÄämi‹½r¿FS2#.ÑÄ\MpÝ7ÇäYW%±rÃa}Ö}…I%²R ¨yËÊU@¯èµBIÏ/<¸l¶ðzç8HoHx›N5u=–ðˆc(”ð(màj›÷®q͸Ub•Ï Pà [B¤"ZŒ¶Q°(Âý¾)^Œ°Å"0LFŠãÖÖ°Šœ@ô˜ÆÌ¨µüŸ¸ªNNn©Æú‚¸ªqkañÁ%E‡1•a ±›ÊHSŒB®ÑR´…¸žtÃR'7òaøŽ‰¾ãu_f7*Ê08M¶:õÖx?š<•8á”g&=ÿny*qCž[«Ö8hÂSÙ·%È5jÑPÁ‚°á‚Íc ÁFvÁž¯ ‚=½`šÕnc62ÕÙ–0ÂKÂáÁ¡/΃rkUT<æ‘HyƒË*ÿ¢Ë:ZÔHlÙ¢Ö©(¹ä3!"'¦"Ùnåe1(sJä9æddÞÔ)VäÃQ„‡oâ”}àììˆð)Hú#ÂG¡†-|q $“úÐõ¦ðcªìýÂ'®sÓUo¢È°/|ê,-ƒú"ýáo6^Ðúðë-áŸÚ¯gh}bÎÌ¢tÅM}Jp7máSˆôG„¿î*¶ºÌ “´ÊØŒ äpNšÃC`§t}( nàš(DùŸÞÁ•4Jލè$è¤Ü(,M') “,Ü(œÏMRÌWéè‘AAiphh Mg ±ž* bÚŠýNögóûÖ6 ³z*) d“L<˜Ù$çð D<48ËJŒá1r¸ÓÞ‹‡¬ùDÌù¬ÌyÞ·0çÙ…Íù¡/r‚57FÇÔÖ|ÀxP0æòB5$ ‚-7ÇÙŽ’†)Oã<¦Üz á¡ÁS.EÍ6å9"s ŽÉ—Íú#Dæ"s'ë¶æ™«¡ás~®D;"ó9™smÞæÜS›ó²/û[yçA©XÌš÷†É”³æÀˆ‘ë[L`BWÞ#|)GxdĨ¯ˆ 6\1Ùp%˜âÓô;#÷€¸xvFV(ÜÊg"Œœ Œœ@„`t,„&0:EBð×.寉|Ì0B(¶š|Ñ‚!$ ,„.“ów"DššKDKM„’v϶¢1o;!Rƒ(!lß{°"9†!3m”œ™Ö¬…„CXÏ k=—ˆÔJˆ°ë’Щv]ŠI(`24 “Ö6ñ"Fù€B{Ø îa“Ž©A”޶Z±êmµ6EA­¡ók©A”Žfl„3!I9!L=˜yê!ÆaêÁBhªùîq„0õ`!4ÑÔCÙ‡ãV>¬#EÖ`ŠG éS©¤Ü,¨ˆ›d@È + Ô8wÝ̃gX…B…`Ö„êäÁ였 ù´yT·Â€jÊŠ†¨0-kAu ¿¢ÔpQoa-äÈjÁе´(Ì­01›à„¼PÌ -Ì.V²baF\Êщى”ãÁ…tãœucŒjD:Ê‚ìªÑ=Êà6šÍI3F¹ Ì MÌ&8 nc´(Ì.R+€Tê%mÀ¡vf»S×Έg¡vq4Á›|ÈÞ æb,ðæ9“4ô°ˆ¼ —Ȇ±Cd`b7§È`<̵™àÍh®mÀæ)ðˆ;òš¦`=Š=Jímwèa—j'xç¯o,ûHå×êVEÌÌÚú‰/Góþœ0R8ŽXcâx‘ƒcâ‡#ãˆÅê&ŽgÛ½³€‰j‹8äÅ¥œœC6áäÌÚÉñÇðÁÇDqjg`0R0ŒpqL'wqÒ"¸8Œpqàâ°]œÈQƒ‘؈5ŒŒ#|G$r"‡ãœ²Y~­ž©ð”‰œdýÚBÌÓ¯(b“ž#ElnD @Q%%ÁR ™c•”°˜AˆZ€bͺè Ö¬Y?ŒŒC;"ÏЊ*D @éa ¦›³K…)£J—ÒÕEH^œ5áõ•^p ¢¨ç1=G=O™i 6¿VÇTlîÜǶiÈÅ]¤f°ö‚Ðdp±µº î R¹ûzÄW a¸8ØÀ7ù`ƒ¦¢¤CøàÞ*-€Õví…jÈ%6i0M.1Ám›‚ ¶nÓ Ìw»Ü)bc‹CµLl§^1Ô·¸¶Á%&¶íæa‹E)&¶‹R|ãi¨¤¡dä·ù–¸àŠÌSu&¸#Û”¹¼)¸¢)Lp±ƒª îywP͇M®.rÉ&¸ È%G§1ßÞW¼ƒîYæÛKGõ áõ áX˜a†M˜a†c`&5œÓa†+mÂ|fW:Fi#^l8\„Á, «Ñê`^\Fke䤗Ÿ“F³J6ÊKœUò:`˜^Ó̰3œ¢n83`&néª;œ0§Tw” ·]VDšÄÆ›Ìq€7j,M¼O°gZ)ÛöOœ¸y1d?€Ÿ:ûY™9ăÇ,¤øüS'­åq×òã®Ö#÷§Íø¢¶\÷Ú(݈ci?àsÚœ!gq869²ŸílfcÄ1²ü™C ÞH£Úx/1êÛ˜‰—æXià}ùÊIWù5–φy,Àid„O}"OT‰”&9?[iR©c«n†1A~‰Æ¼ðAÐÜ‚~u¡ùÁƒ} ôؚφ~þ™ö6+=Ê#ÖTáôÄöëë 0o…¿wb…<ê«ðÛ ?ÛœÂ/u”Û‡(uük ö¬LÍJÿPKcs WKãfA °7¬ƒ‹ ö  èªà=/D\{XU`³ „KTm(UÐd«ª ‡WUÃ+€*e[PÙ†UÁÁÃh›«Õ> ,À&A–¨@ SA´ÓÞ½%^Q–ÁÔ Zl˜w© Ð >øé@|ðÓX5’̇Û|°é …¼;'€>:`Eï VôúÌEÞßp‹éBboS“ó] X òÁG¬%Z§¹8H¼)Š>6¨IÉÖ¢¾ ®µÀîŠN6î®8¨o°Ù°Ú|ƒr&ý|ðÒAæEKb I æ6 ±ù è`„šÄµÍq­ECŠâƒ‡ØhÀ¤ÃðF¥¼z‚Œ1=±î £e†N ,qÌL±¶/¢â5š:1pð³]5dñ?·¾…¸—R™Ñ'¦¾› Kœïjƒî^¥×à:TƆüÏ<Ð͹-žŠ=ï²Å8 yš›4[»zH"r[1l^,:·e;˜@Ï0.§DúÄèó‚ÒˆÍñ—¿ƒCÞXÇL ¦Íš ë6c$¹¤k‘ê}âÈy¡ƒÒ˜¡ƒdNÊ ¾ûù®ÝŠç~Öê„ï~¶‘ ÜÏŽŒ©UÕ~ús'R[iÌèCnÿ³#Æ„þgip@½°Ç5ngâjYZÕV1ÌA6äÊ5Žl.W~åHó­Ì•'säö$\lD[„qDÒÇ‘V£`¹Y#MCf½Ü,Š#(ÿrp¤iȺgßöÑiÚ‚Yfº#«Í‘µo,GúkU˜sµÄäH#{ÓãHÓ{SêtèÞ …’L–õ*[P ´5¥­CŽe ‚[Öô´ÎJ [P°Ý4Ê>‚-H̺ز¥Äl ß‚ú˜êy/ÓoClÁܱ“-[œ;> ’¥e“,ØWÐA–%®³òy-•›ó‘…P¯´¦z%[³¨rùt²`“)“,ëØd*—á³äHt&K´ز¶%Z>î8[T Ãb éÊ“Dó›$ŠÊ¶8ØBüÒ„æ-˜%2Ø2ÏY¢øL®b f‰¶6KTêÄP?”.RºoœÓE£¼‘ …—QžŽz$…7Ä ª%ohHß„òf³˜Ö•±yCœˆIñ†âk/of_-1T|­Cͼa“7ÆÉbÑþ |´ÙHC m0é¤Íg#½îMÞËrçš°5“‹7‹žk2Â)â¸7Š7Ä^?д oæ4‘PêQ?E ,ˆÝ®£#4O ƒP'Ûe1H,»ïq$M é ”•ƒA« Ò…ÛœfÆP4Œ¢á÷m~pAÈ0#Ã<À eÅ(^9¤jYVLúÔ<+†©t“@g™JO3bÈ: ´Åì¡îH›"ƒ°ùª“A¡Zßæ«Ü|лöx"…‚D eòA&ƒB>hÎù Ò KoMDºK])TZÿ®mXß'Ó—0ÇêäôRkÙT;BÈ4Ê%:›$xÂWLB&(&‹L£\òn—Å4L&(&›L6—Jƒ6½"×t ….Rmh…F;§Ö§•“U2ÝF+¬E ×Uë\‹jk+'­|¬"¾ |‡³¬Z´ lã¼.Ú¥•‹UÄ® PTcÛ@9³رêü6ð`ÐÆG*Š`•ŸTس{&0бòª*dÍa-Ue“ A `ŸUnRÁÂN^ÒÊÃ*Ä€°€¶®B 8B+7«B6Gt„V°&­Böäƒ Ì`O_£˜Ážr·6ݵ‚ tÓ 6Фհ ,0ø~HY¥—Ã(6ì:…Â0†Xe%/4zmq•Uë¹÷ Öç¥ [ª8 ¦ñk+Khl Ö'˜Î/l—áR`Ø.CJ½ã—yp Á ~I?Å±ïø¥\üǾã–‘¾Ÿå2Ò2ÓSªAQLkõÒ 6Ý 6Ó¹`ÓÓš†\|ÓÖëJ:Õ°¿ ¨6Hµ2Õ@5yqVª¨ªÉ‹sRí ©Dl¦á„K0MJ]ŠHö'“ª`˜–i`Ú*˜ë ¦My>4BPíüTCô ª!§ª­‹j˜)Õ¦¡Z_ T›ˆjðÕ@µ‰¨_ T›†j¥$•L«u§pN•§sŽp¦É9R¤KçÜœNÂiŽVI¤Ãéò’Oª!¨ÄµH׫ĽΒI‡s¦ä…F:œ3e‘Î8g*‘tØðLBKª×¨æ»¸‰”R:9')Wc§œÊMÎwã0"ä»mv6š³ãaمهßW,)órÿ!ÛÉë·Ù‡ês’ì>üúÿ=ÂR Ç golly-2.5-src/Patterns/Banks/Banks-IV-demo.rle0000644000175100001440000000465012156145314016056 00000000000000# Edwin Roger Banks, PhD Thesis 1971 # # Four-state, five-neighbor CA for universal computation and construction. # (Appendix IV) # # At the top are shown some wires, signals and junctions. These operate # in a similar fashion to Banks' first three CA. Junctions can act as # fan-outs and logic gates. # # Another type of action is possible here, however. A 'compute' signal # can be converted to a 'construct' signal which passes down a single- # cell wire. # # Where two construct signals meet, a new arm is constructed to the # side. Further construct signal pairs extend the arm further. # # Each time an arm is extended further, an echo signal returns. If the # timing of this echo and the next construct signal pair is correct, # they trigger the creation of an erasing wing. This travels up the # arm, deleting it and then depositing a new cell at the end. # # Below are shown four examples of erasing wings travelling up # construction arms and writing new cells at the end. These show that # any pattern consisting of cells in state 3 ('x') can be constructed. # # To activate the new construction, a method is provided to convert # an erasing wing to a compute signal. It leaves behind some stray cells # (garbage) but this can be cleaned up if required by writing some new # cells and then sending a new erasing wing (bottom-most example). # # See: http://www.bottomlayer.com/bottom/banks/banks_commentary.htm # x = 93, y = 112, rule = Banks-IV 37.3C$37.C.C$37.C.C$37.C.C$37.C.C3.3C$37.C.C3.C.C22.C.C$28.10C.5C.3C 20.C.C$30.BA6.C5.C2.C20.C.C$28.10C.5C.3C20.CBC$37.C.C3.C.C22.CAC$37.C .C3.C.C22.C.C$37.C.C3.C.C22.C.C$37.C.C3.C.C22.C.C$35.3C.5C.3C12.9C. 10C$35.C2.C5.C2.C15.BA4.C4.AB$35.3C.5C.3C12.9C.10C$37.C.C3.C.C22.C.C$ 37.3C3.C.C22.C.C$43.C.C22.C.C$37.3C3.C.C3.3C16.C.C$37.C.C3.C.C3.C.C 16.C.C$35.3C.5C.5C.3C14.C.C$35.C2.C5.C5.C2.C14.C.C$35.3C.5C.5C.3C14.C .C$37.C.C3.C.C3.C.C16.C.C$37.C.C3.3C3.C.C$37.C.C9.C.C$37.C.C9.C.C$37. C.C9.C.C$37.C.C3.3C3.C.C$37.C.C3.C.C3.C.C$35.3C.5C.5C.3C$35.C2.C5.C5. C2.C$35.3C.5C.5C.3C21.C$37.C.C3.C.C3.C.C10.15C$37.3C3.C.C3.3C11.BA12. 16C$43.C.C16.15C$43.C.C30.C$43.C.C$43.3C7$4CA8CA9CA12CA15CA12CA9CA8CA 6C$3.A8.A9.A12.A17.A12.A9.A8.A10$16.7CA12CA15CA12CA7C$22.A12.A8.C8.A 12.A$44.C$44.C$44.C$44.C$44.C$44.C$44.C8$35.A$36.A10C$35.A3$35.A$36.A 10C.C$35.A3$35.A11.C$36.A10C$35.A3$35.A11.C$36.A10C.C$35.A5$47.C$46. 3C$36.A11.15C$37.A10C14.C$36.A11.15C$46.3C$47.C4$47.C$47.2C$43.2C3. 15C$40.A21.C$41.A3C3.15C$40.A3.C2.2C$47.C! golly-2.5-src/Patterns/Codd/0000755000175100001440000000000012156146015012743 500000000000000golly-2.5-src/Patterns/Codd/clocking-on-demo.rle0000644000175100001440000000166612156145314016526 00000000000000# "Clocking-on" - a method for initializing a periodic pulser in Codd's CA # # From a starting point of quiescent cells (those in states 0,1,2) it is # slighty tricky to cause a periodic pulser to start emitting. For example, # if you just send a signal into a loop then it will collide with itself. # # One method is presented here. Three gates are created. One in the body of # the loop itself prevents the newly-injected signal from colliding with # itself by only allowing signals to go around the loop in one direction. # Another prevents signals from the loop returning back up the injection # wire. A third prevents later signals from disrupting the system. # x = 39, y = 20, rule = Codd 23B$BA.G19AB$15BA6BAB$10.B3.BAB4.BAB$9.BAB2.BAB4.BA5B$9.BAB2.BAB4.B6A B$9.BA4BAB4.BA4BAB$9.B6AB4.BAB2.BAB$10.5BAB4.BAB2.BAB$14.BAB4.BAB.2BA B$15.B5.BA2B3AB$13.9BAB.3B$12.B10AB$12.BA5BA3B$12.BAB3.BAB$12.BAB3.BA B$12.BAB3.BAB$12.BA5BA19B$12.B25AB$13.26B! golly-2.5-src/Patterns/Codd/coders-demo.rle0000644000175100001440000000124612156145314015574 00000000000000# Coders in Codd's CA # # When two signals collide head-on, the result is a change in state. Here # three coders are used to successively transform a 7-0 signal: # # 7-0 -> 4-0 -> 5-0 -> 6-0 # # In Codd's CA, 7-0 signals are the main carriers of binary information, # for logical operations and computation. For construction, they can get # transformed into states 4, 5 and 6 using one or more coders. # # Signals 4, 5 and 6 can get transformed back into 7 - see gates-demo.rle. # x = 44, y = 10, rule = Codd .5B$B5AB$BA3BAB$BAB.BAB5.3B7.3B7.3B$BAB.BAB4.B3AB5.B3AB5.B3AB$BA3BA6B ABA7BABA7BABA9B$B2A.G8AB9AB9AB9AB$.11BABA7BABA7BABA9B$11.B3AB5.B3AB5. B3AB$12.3B7.3B7.3B! golly-2.5-src/Patterns/Codd/construction-arm-demo.rle0000644000175100001440000000246412156145314017627 00000000000000#CXRLE Pos=-284,-2 # # Construction arm demo # # In this demo, a construction arm moves into position and writes a cell # before retracting back to its starting position. Hit 'm8' to see the # target area more closely, and set the demo running at a slow speed. # # Three 'advance' signals (76) arrive first, moving the construction arm # forwards three cells. The next signal (4456) turns the construction # arm left. It then advances three more cells before turning right (5546) # and advancing three more cells. A 'mark' signal is sent (764576) to # write a cell (state 1) and the construction arm then retracts. The # correct sequence of retract (4566), retract-left (5666) and # retract-right (4666) is needed to retrace the path of the arm. # # By scanning across an empty area, the construction arm can write any # pattern of cells in state 1. The pattern can then be sheathed and # triggered, to bring it to life. See sheathing-demo.rle and # golly-constructor.rle.gz for examples. # x = 289, y = 3, rule = Codd 288B$A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.F2A.E 2A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.F2A.D2A.F 2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.F2A.E2A.D2A.F2A.G2A.E2A.D2A.F2A.G 2A.FA.G2A.FA.G2A.FA.G2A.FA.D2A.E2A.E2A.F2A.G2A.FA.G2A.FA.GA.FA.EA.DA. DA.FA.GA.FA.GA.FA.GAB$288B! golly-2.5-src/Patterns/Codd/crossover-unidir-demo.rle0000644000175100001440000000663712156145314017643 00000000000000# Crossover for two unidirectional paths - Codd's CA (Fig. 5.9, page 75) # # This pattern shows a configuration that allows two signal-paths to cross. # As long as signals arrive with a sufficient delay between them, signals # from the top will arrive at the bottom, and signals from the left will # arrive at the right. # # Here we've connected the output wires to make a figure-of-8 shape, to # demonstrate the crossover. # # The first signals on each channel must be a 7, else the machine won't be # initialized correctly. Set the demo running and allow the signal to loop # once around completely. Now you can change the signal to 4, 5 or 6, and # see that the crossover still functions correctly - two "type 7" # transformers convert the signal into a 7 where necessary to turn gates # on and off. # # Originally distributed as unicross.l with XLife, credits: # esr "The System Owner"@snark Tue Dec 22 11:48:44 1992 # x = 128, y = 90, rule = Codd 69.58B$58.A9.B58AB$58.A9.BA56BAB$58.A9.BAB54.BAB$58.A9.BAB54.BAB$58.A 9.BAB54.BAB$58.A9.BAB54.BAB$54.9A5.B.B54.BAB$55.7A6.BGB54.BAB$56.5A7. BAB54.BAB$57.3A8.BAB54.BAB$58.A9.BAB54.BAB$68.BAB54.BAB$68.BAB54.BAB$ 68.BAB54.BAB$68.BAB54.BAB$68.BAB54.BAB$60.9BAB54.BAB$59.B10AB54.BAB$ 59.BA9B55.BAB$59.BAB2.B60.BAB$59.BAB.BAB59.BAB$59.BAB.BAB59.BAB$59.BA B.BA5B55.BAB$59.BAB.B6AB54.BAB$59.BAB.BA4BAB54.BAB$59.BAB.BAB2.BAB54. BAB$59.BAB.BAB.2BAB54.BAB$59.BAB.BA2B3AB54.BAB$59.BAB.BAB.3B55.BAB$ 59.BAB.BAB59.BAB$59.BA3BA14B4.19B23.BAB$59.B19AB2.B19AB22.BAB$60.9BA 8BAB2.BA17BAB22.BAB$68.BAB6.BAB2.BAB15.BAB22.BAB$18.34B5.5B3.4BAB6.BA B2.BAB15.BAB22.BAB$17.B34AB3.B5AB.B5AB6.BAB2.BAB15.BAB22.BAB$17.BA32B AB3.BA3BAB.BA3BAB6.BA4BAB15.BAB22.BAB$7.A9.BAB30.BAB3.BAB.BAB.BAB.BAB 6.B6AB15.BAB12.A9.BAB$7.2A8.BAB20.5B5.BAB3.BAB2.B2.BAB.BAB7.6B16.BAB 12.2A8.BAB$7.3A7.BAB19.B5AB4.BAB.3BA7BAB.BAB29.BAB12.3A7.BAB$7.4A6.BA B19.BA3BAB4.BA2B12AB.BAB29.BAB12.4A6.BAB$.11A5.BAB19.BAB.BAB4.BAB.11B AB.BAB29.BAB6.11A5.BAB$7.4A6.BAB2.10B7.BAB2.B5.BAB11.BAB.BAB29.BAB12. 4A6.BAB$7.3A7.BAB.B10AB6.BA7B2.BA13BAB.BAB29.BAB12.3A7.BAB$7.2A8.BAB. BA4BA3BAB6.B8AB.B15AB.BAB20.5B4.BAB12.2A8.BAB$7.A9.BAB.BAB2.BAB.BAB6. BA6BAB2.15B2.BAB19.B5AB3.BAB12.A9.BAB$17.BAB.BAB2.BA2B2AB6.BAB4.BAB 19.BAB19.BA3BAB3.BAB22.BAB$17.BAB2.B3.BAB.2B8.B5.BAB19.BAB19.BAB.BAB 3.BAB22.BAB$.17BA8BA19BA19B.BAB2.10B7.BAB2.B4.BA24BAB$B66A2BAB.B10AB 6.BA7B.B26AB$BA32BA3BA13BA14B.BAB.BA4BA3BAB6.B8AB.26B$BAB19.B10.BAB.B AB11.BAB14.BAB.BAB2.BAB.BAB6.BA6BAB3.B$BAB18.BAB2.5B2.BAB.BA11B.BAB 14.BAB.BAB2.BA2B2AB6.BAB4.BAB2.BAB$BAB18.BAB.B5AB.BAB.B12A2BAB14.BAB 2.B3.BAB.2B8.B5.BAB2.BAB$BAB18.BAB.BA3BAB.BAB.BA7BA3B.BAB14.BA8BA19BA 4BAB$BAB18.BAB.BAB2.B2.BAB.BAB2.B2.BAB3.BAB14.B35AB$BAB18.BA3BA7BAB.B AB.BAB.BAB3.BAB14.BA15BA3BA13BAB$BAB18.B13AB.BAB.BA3BAB3.BAB14.BAB2.B 10.BAB.BAB11.BAB$BAB19.13B2.BAB.B5AB3.BAB14.BAB.BAB2.5B2.BAB.BA11B.BA B$BAB34.BAB2.5B4.BAB14.BAB.BAB.B5AB.BAB.B12A2BAB$BAB34.BAB11.BA8B7.BA B.BAB.BA3BAB.BAB.BA7BA3B.BAB$BAB34.BAB11.B9AB6.BAB.BAB.BAB2.B2.BAB.BA B2.B2.BAB3.BAB$BAB34.BAB12.8BAB6.BAB.BA3BA7BAB.BAB.BAB.BAB3.BAB$BAB 34.BAB19.BAB6.BAB.B13AB.BAB.BA3BAB3.BAB$BAB34.BAB19.BAB6.BAB2.13B2.BA B.B5AB3.BAB$BAB34.BAB19.BAB6.BAB17.BAB2.5B4.BAB$BAB34.BAB19.BAB6.BAB 17.BAB11.BAB$BAB34.BA21BAB6.BAB17.BA13BAB$BAB34.B23AB6.BAB17.B15AB$BA B35.23B7.BAB18.15B$BAB65.BAB$BAB65.BAB$BAB65.BAB$BAB58.A6.BAB$BAB58.A 6.BAB$BAB58.A6.BAB$BAB58.A6.BAB$BAB58.A6.BAB$BAB58.A6.BAB$BAB54.9A2.B AB$BAB55.7A3.BAB$BAB56.5A4.BAB$BAB57.3A5.BAB$BAB58.A6.BAB$BAB65.BAB$B AB65.BAB$BA67BAB$B69AB$.69B! golly-2.5-src/Patterns/Codd/decoder-4bit-demo.rle.gz0000644000175100001440000024270012156145314017203 00000000000000‹ru¬Idecoder-4bit-demo.rleìýmÏ59r&ˆ}¿~EÛ€féàä{¦|ŸÂÚ0`؆½†ýµ¤.©k·UÕö×;ù$ƒdù´F3Ð]÷y’q] 23I&ñ?|ÿÿýþ_ÿ§ïþ¿üú?þÝ´\ÓßþÝ´ž þ‡ïîÿ­÷÷?ýöÝïü‡_~ÿãŸï¿ÿüËw÷Ý÷¿üþ÷óëwß}÷ŸþO?ýÓë»í5­ûÝŸ~ø§¿;®ÿŒÿáÆýÏøéW#~ÿýá;Eò÷JôþÞí·þ×ïÂ_¿ûéç?ýå·ïÎïþøÓÏ÷…?ÿø§?ÿøë?ÿöÓÏÿt3ýË~üí·ô?üþûå¿[Ù¯ŠöÿñÏ¿|÷Ÿ~ûåO÷5Mñëþî—?÷ËÏ?~÷Ÿþþ—ß~ûåŸCÁëfúÿüáÇŸo[~ýéŸ~þáßýðç?ÿô_nu¿üüÝÍkýá÷÷Ëm†2â»ÛÜ[ÁŸ~øõ×Küö‹–¹9~øÓŸþüËŸþüÓ¿ýøÝ-ý'øOï¿›¶ïþñÏ·NeÐ 0(Å7ìÿ¢”Xü­ærNøÃªÆÿðãmËïuÁ¯?þÿþòãÏÿðãw3½§÷ßümäe‚ú/?üñ/?~7½ïê)¦Ÿþù‡?¾¾û¿ýòÛO7î·?üðÛ]ÍÃUTUĸºÞ$ãëûg¥ï×ßþƶ‚ù‡[üÏ?þÝŸú§?ü¦¼NL~}÷õ¿Ý–/Û~*ªúñçÿüÃo?ýòó¯¦^í?þò—Ÿ•ûþø¯Žöoþñ®Rä8mí-»)ª¿üɺð5þ{ÙÞvËþñ‡?ß]íïü‡þòëκŸ¼øwû›^t·À?üù—_ïöý/®óÜD¿¨®ôrø÷?*[5è#­…ÿþÇßþåÇ»«¨Žô—ŸúýOwû¨êÝ•Ò&ÿðóïÕýëïóÂÛ¼Û¨ßÿ­ï¯ÿò‡Ÿîê.P]ç»›ê·o‡LÛû»ÿÝMøëOÿû¦¦ÿ÷›â~ùç?ýñ§Ð.ýî_~úíFß~ügÛ~‹¡¨ûľÛÿ¶ã¦1>ø‡»ÿ«m_u5U?øÍ³üÓmÊm—nÍlŸRýñïUíUQwÍÿë—þñ·ŸþùGݸ¿þèéþðÃùQ{ù—?þñ§ßß@Ý¡~þ[uíÇŸýËŸô¦ý«ºqþ¬÷óOøé·Öß«Ûú¾òó/¦Þ^üýë¾Aúãºq¾ûgýløù—ït­o?èVþéWå¯_ýËæ&ÒºUÅÿpsß\¸ü£qÚO?Gz7äo¾ËÜXu#ýË/ßùöûUu¾»e¿ûý/ÿò³©œvï?þé‡?+‹ÿV—ÆZÿùUµÒ¨üá§?ªÊ[noßņé/?ÿø¿ýéÖs×ûÇüÇûǯæIøë/ü‹®Ý¯¸µÞTÚ)?éÞ«ì¼ðÇüËïæþãÿú+ãÙ`˯Nï¿©öÿåìù¿þ¬ê£žG·ºþñÇ×wÿïŸïžðÛ_~6ýP?–~úU·Äü¥æO·Ï~úû?*©*ÿê;QöÏùõ7ýÿîOüá~èÜæüÏ÷¿üågãË¿µÍkÛþîuùãoßéYÿÎt »µuù]Á_þü£qÓ¿ÿýí¡¾û›ßþõO÷«äo¾ûíÏ?üüë]þÏêmñ‹rµº©T·ý[Óõ~Vþ¶òîå·ì¿~·Þwõßÿðÿë­ë.?þæWÕ©ÌûÃUôfùUÝOÿzÃôÃáWýŒûûÕïoU»¹WŽ} Xw(þFüî†Ê>Bî›æŸî'øÏΓÆë¶”óô“àÏ?©[Ï>Ò~¹»Ö¦œÔòöÑÝðw_ûýùA½nÿ‹rõß7-ËûM¸¶‰~ùû_üóùÑ>¹ÿøG¥ù?ýݺ;Ӿؿ¤¹~Qmùëo궺[B=Ðþ1éÝêÂ}‹øç‡{2ÛÇÆßÿò_ô³ð¦øã/ÿòúî?éÛ×¾ ŒÌOöµwsþåŸïÛRõ‰nó~¹;êßz9ór¸ÅþüË¿|÷/?üúóßüöî5wc«ûŽ<è ­jˆ{`^NúVøû»Ãÿ¯îjú×Öwت›[¿ôÛ\=ÅþüË_þéÆóºŸE `­•Óç¤~óþb ·vÓˆæE¨Dì+í6Ñ 0þV×”øK³*´º•½7ýßÞw—nÃýN=ÿü]úZ68[½×wÿÓÏæYýóÿ ùÕŒ””.ó7åÖ_ÌC;L¿ûŸ^÷L½ÞïiR½ì÷t¤ðËÏ–å?þão÷Ï¿¨[üîŠÄ £Ì3И”ûƒ”qÁ×w‘w,¿z·üéÇ?ß½A¿|Kü’¸Ê¼ÎÿÅ9õ¦úO·Î¿ùÇåoþ³zÐëG™z6ë~˜W™jhÕtQÍÜÈ)u°õ˜{œV†=ºÅ¿¿ƒ?üÃoÿuS¿þð—»Ê?ÿÿéŸï'ÿë¾­n‰ÿí»ÿñ»i?ö¿ýî_ï_óµ÷î/÷ÃãÔÌóþúLGôŸßÍóöú|ÝÿXó?\!Hét¼.u}ß㿾\iy«‚-ù'k„¾–Ï÷›Æ~*ŒýÌÊôIýBøéiŒ5V¿Ë?oØï •Ò¿•æ7è?ÂoØmýk¿ñ¿~HYí_{dT½¨lëßk\³Ïkþè6Ú¢ •ωo¾ÿ,¶É¿¹ºÈ€…úð…øŸô_šJÖÞxßí¾B_ã~~òŽ ¦KHù†pÂî†Br»ù›A~3¢}« 1ý”«3f×Fâqm[ÆMÂÔæ?jóµùÚüGmþ£6ÿÝ×fZסF1¸vó#ý{‹Üã¨ó]ÿ×H|§ê‹ú'ûËŠ~ý_}ù ú„A Ò²eÔ.<¬Êg¹îÑôíÀûÿÛi/ÿí)îë8ޝÏv¸¶þE¡_Çö±åH/TþQ|Žååe_ª_ᨠ¶¨ –©º«ÃP¡è,ùp5œç×ö1¨lù2â ý=…ß¾>ë– P,h5ˆÊÔ¤­«AË«eæ’¦’JË&:_ÓûsÙÉ9Ó¶rI1¸¦43ÞÓ,É,Ÿ5ë_‰š0v¨å Õ2÷?ÏÛWsÎK -"&Él1K%/#÷µ \V B¹ºÊr¿›îçûn–EÖϲPÚï?³ÿ˜á…e~ åyqtÊóâ 8õú×÷·ÀzWy¶ò‹]XšÞ÷c 𯗗FŸxA}âTÚØþµ}Œ[TçÑ»3ß}iZ?ßß µÎǬ%k‚KÖ‘IZCíº2JöX¿, ’1Œ¤@ #éw‹9ªé×4;/­ö3Ç«ü‹×‰Q ÅaáPÚJº5Xó="V¹ºe„ÙN÷g¯± KPƒ%(aIåô;AKí¯ù2/ÞýNâ=Ó–€2 F@r­ÔE_vhy¿Ì—ÍÓríTaè‡äÈ Ó<ë—ÙÎü¹_fúQó¦d7ˆžÕ(õŠ^*›éçú†'Œ€2 F@FÕ§o=񯧴úE²…5ßM¹c^íª¥™§šýL±7ô›Ê`ŰÅâ ØcÝh]{Æ÷wýgúE@}VµÃ·Í,Zfê¿è{eëí«ñ;žÁ ÏàÜxʹmþè_ºS‘‹ývm<{˜žœš½©±­6i6wPè)ì¡™gêÇžŽÈ\˜zpñ#ÕNøÐÏ?û`{©Á¹Ñ¾šäÙñ¹í·4x} |¾ ¾ѨGyX1êr)ƒYf5ÖvC'3“õ6©{åò­>‘ªþâM¸à÷g<áJ¼;È…¼’ý\ú˜ÁžKwæxÿñU3˜c;Ô Ó DV/Íá»Ò ,G8“r¢f¨˜òÊ«{açv;¬Œ!þ­in+$¦|æ¥V¹#(å0#JFv1BRí#ÚþoºOïè%^Ù÷ýæÐ­iæ)ºõ£î:1„&׉Á0½¬°ïÞ†YýìÇL²õéoI°S 3,e\(âF¹¾Üè1¼ÈçNÑ/€}xtæo×WØ*lV‘¶‘~4dƒâf{d3zڧȬ&Ç/<-7Ž»‡¾×ª¢MVÁ?üжìÙc{¶²ÕœüL+ÚÅ Žº“r£K̳òì#wæ{ ±Ž´ÏEnUó¼}éÁ]´ù/”ŒOÌîìØ&·\é¿]Ä}QÊŽ};zgÙÑk<ËŽ˜þ½ô·Ì[É?$H“»u»9²(Ìœjö<½i•ݺ«™¬.Rv”è»ØÑk<ËŽ^ãÙámËxQ{Þù9Ëµè ”¶tj žæ=îŸnž1¹«29 ì}äè3½@©é["»[ …ò4È-.ßä-²#ݸ£±){Ø&­W[„ÈÆK„¨À¤„h×¹Eˆ¡‡ZôIdµÓ²ýóý¤?d’¾V{“t콤fvm›5Ý0gî£ËÝI³ËÔzƒÂ9ä Gú^ÈÆšÑÖù²çHÔ!ã×ìö߆G+3TòÙÞØ%t˜¾‡%ú.vôϲ£×x–þÁÝ„´Î«½WM_HÆ.ÌÀfÞí)‹Û¯Îûµ u%BxR¯™?¹ôV„iGˆo¼ÉGÚÝçÖøµ:1uJÞ´®z1$"ÃÌÍEdÄ:äæ ª^Ÿ¥P])–áÛçµL÷ý»Ý&à¼ô†ï¯ÊÛ`V~ÉP}w C¢uö`·_I`žŸÀ­~Œ3ýè„_3iå›ìÒÿDòïÂ?Ïíó»Ï2…yѤ~ö…= ÿ^×¶ö/gjÉ )tT®å‹î‡œ6¿ÇNðÏs×}å¬kOÓÛ<=f³Sâþ§éºêå ¦ûU>/ö²½–ÃŽÁ£@‚CxÍt¯š½üO¤Å§>±¼³þô>£kvGëå¶d/Ô=œè_ËP‚Ä8” 1õÈ¡aòt™½6ÞwäMFœ·$¦Þ–þ˜:VkÚ:L±ªÏúO)¬kR|ç¾Ì©H3†÷®Ý žÉ¼õùWÔ‰Ÿ¶È3ÿ}ÐÚ à'{"åÞÀ1Œ§~Ä`_ÕcQëÈpêh2ÏëüEšD õp`#nT}ršóÒ/³µL°š¨ 4O 4a—â:¡oÅÇ/³åè!ÙWü¾ÆŸrΛ[Ø)ž­`,^r˜ÕUÜÐçƒ"À CäDtz‘8ÑŸpSg·è°Ì¾ ÉiZzC%p‹Æ3¸ cònÑ`áßäfÛwûb²«+ ½Ì.ÁCí“;Gp ƒ¸†:N8A³[y­w-f¡cýø3Ä;mˆåYqtÊóâØ¿tÝ‘iûlæt2]ªh‰àóœëò5n©ÿT_'·Yg&LÇGTŽ‚Ü|tÚ?]æ{Îýg#q.µf¾L^„¨lÔÕ&ªã¶«¥¾õåì®»9¶iõ^R ƒMz§+:/©ŽQÚÈç–ô\G(0öÉýx³N}ôãéB›eñsJO$ðˆD›?mε…s]Þî#?¼“#ÑnƒÎù®ËÕÅ ”KÅÔ+3œ¾Cr&ï:B²óÂ3s"Úv9¥\.Ï‹£Sž·¯øs¥õHÏóÇž‰&t#8º9€­ÏšÙóÔ´:½V½Vq]öÇœ_jöè ¹\º$Œ.éOÚö”+(,= ìŸ0[ê¡XrÑŠ$J¢Îæ+ët;IÕdáh‹$Ð)™4‡³ÃöûEª/– MáÍq—â¨zRj‰s/”‹ŠÑ‚Gëû%TkiêÛ¡i}^@TŽ&½MÕz±?…ïôàé|—Ke…àK£'Þe|Ÿaµç¶ñœB ÊEÒœf,î^j^?:ÜïuŠ/À]9÷²M‹þ$t¼¦ãüUÈ„S ³‡¬fEÃb¢‹ÒkŽ„Ú ÎRLû*øËŒñ>jOÊæÞ‚yä:[w’ݤ5ˡŴ •Š-.· ¶E%ðE •æàîu±e¨6ËÎÝ-å—=³žF¾/\»¬ =Àó°[ºzŠv•pbçZi±°"ði²÷T`®%–B aJ¥…(•Æê?ô,‘º›ïMR1J¥… ¥®íúÉFˈIî÷ëy¥¥¨ KÕb«ïøºøh#q=Ô˜Cñ°åh ˆÊAM¹^zÃý5ZâqåíÙ\"©†x)oÞµø—}8\£×HnK}ÚÈ®­6DË’‹r’Öb$¥‡L6sÊdŠ’vFþpÒèç¥Ñ'¾ðýÉ&­-:à1m䆺ÿ|§‹@BÅ ¡"øg@tÒaK:LÉãm•‚0„JAHQì#–Ø’s“K?<[€n@ŒˆÛ˾X̾¡-ÚC?¹¡ÅEÞ@MÁФ‚S:¨¡ïw¸Í9[´S|²C¯‹¾­Ë‚KÖ‘H’@:hÙüi¹Í>²³1OED V$¾ÔöÓÉ[V»“çÝcu*eò"djÕË—& ¨IŽÞk»ë-³‘Ra  tØ|¸çøö™Â:û,JH ¡`ÍY}‹š˜’fepMUR±†db¬T6•:ìÇ韞N9H„š2Èl#¦VÖnLÉB1å’bðfœ/¿éÕ߉ýj¡¾í:®Â^æT,ˆ½ˆ†(þå0×j—òÆØ>0k[Þ™ÛGz²ÁçD¼H~ÄÒïÄ/€ad›E‚äYz‘!IfŒÔy9¯³ö+¨L Úû#ú$O—ptz¿Ë?¡~»W-3íe¾ÞÖsæ:¡i½^ÇaªÀÿõ‚Ên/A…¤t?¢¿Tòë_¥¿ïÕÅ>˵8ß„mÚV32Í@ý:ç#HOÛfn›ÂsÞ}ÝØ<žÌ¯ü‡“^ÞsÑØÓż}¾×ÝéØtãp^„ûIÖÜéêNÛ]"ë¥ÌÆVp¿5žïð‰º”æØˆã–·ÓEs.s{5^ 1²‘û7»k×%Ëc áÒÇ\nÖg !;ò†Ã¬!<`°ù’!H¨Lj›ž¸Ñ²Íä½¥ÁÝ[Y–Ý£t;Ozù~"YfQÎåðá4W8ÒF^á(³1}¯Pr{©LQ&ã=ÌÏé1`~N†~ózô›ÏУb¾4÷3²ëW&Hu’ëN/DY¡[°%#@K’ªãqÂh½P”B©)¤,63FÛ ¡ðâ!™A4ýßBÙ¢¹®’—_E`d*G,ÀöÝv*iô'›ë¾L-eÑSõ–¢ždÓ¬GrÕà±¹V‘LÉàzj f¿ŽÅ@í/%•ÈäÖDœÿšæ§Æpþk*F>®!OyNä ³À†P×Rªl &¿¦Òèw7xRRÍw_TIº`Å©BªÎ³žõ¼ëèJŒ^Ê‹Žî<í¦Ëò¿ëú÷$€ßf}í\;ÓµGIÕ1š®=’…¦Õ-2ªa½<üfÈúšÖYc4e; ‘WEÙÍ|m±ƒ8áó{á›doo¤öf…æ§¢èóeN€È ­ìò­|ô/päÖ è¨A©+`(w|*ŽñTödÜ™d£ tÞ&Åëó¬öaÇ!#[êô‘Ðf¿‹´×« yöúŠ$r…ªÔ›0V«„r:{QÎ{—U».ÅWÆ×oÅKT-Ë®¼õk®^‘¢ŠRyE¢â¨IÊ,ÕŠ\$Ĭò Y= 6ÆR !äRçZ%¡©°Ô*¢w!“ :¨¬?·ÔÅêRˆÅεNC*CÅÉ•js¹ô±Ó›¤…yû¡“ÏB_kH!ˆ[ÆÕ&ãA"W¨MH <™ k— mÆ“'M­\—-‹¢${^B÷8i¯4ÚÒdÚ/­3 /µIP#E‡¬iCN±ThÉ6cu–FÑ8™@ñý„~HŽQöIééKLŠÉZ\'D2ëê'vãà#UØÄЇQ Á¡ <×¶…4ƒã=c›Çê†üÎÐyˆÖ0ÍO©˜(vÙU¬ìC †çW§Øö©a%ŠPÖW*ò¾e£C`Șˆ>tŒpF88“eâÎK‰ȼ“üw²3‰Jr0¡@æ]Ð~‹QƒÅ(D0e¬Ì.ãšþúTÿª¶GçËò4ÆÈžÕb0Ê0 3Æh[9İC€âÝq‘áÜÒÂ|Ù˜’gˆpêE! ýq^"[TîXsÊü9bm¨+<‘ßáU‹p„u>|¸ÍÆöðã7}?'Œ€2 èp­n‘Î ÊGÃ~õ*.½â7zzYEY£±Û+£s3›É`ñì°èoSAxy“`µlîîuÄôU…égšIÞN86r4—2.þkß•|/Æ3¸IïÔßÞ¬>”Âüµö|èW˜±úÝ{—OšöÕ´­V”rn/íG•À2= PjžRè<Û»Âøœ¦y÷ì.ã«âŸ¯a€œ¤ôCîrÏxªòãòŒ¨Ï„³ £r’×hðyNcâuIh¶)®¡Œ&@WkT]&³1¼£AÀœ5qbNó†ì^úõáó¾è£ì~ÇâÞÁGöˆ ±a<×¶Wk„2ršqót{‘Q©ÆÈÛÉ[ç“:žæ5¦€mâ/š>/N§¼l-NĤcœ¨*àÜ6›ìp˜ašwQZ¿ýj{½Ö\[†‹TI’õ¸•±ÛQnÈF´òÔ›f¬Ú„ƒmÆf–çý÷† n iÄÑeŠ>H°•J;†A¶z¥¬Hi‡XÑ2VÄ Jk^wåÓE*dv¼÷x\;dÑ[—%kàÕOÅcŸq™—ñ’7Èî¦.7ÊiåÜ(÷qƒ'ßÞlh™*õÃÍ­Ôe S¯XÙKG¦ÉwºJoÁ•†›ËxGh‘ñöÓ¢fîö®'²ödÔ½ÙÐó;¦. DÕ4³J¨êçÜ[ªÄãf—÷ÊVdMº¾éŒ¶ÊzênfpԽ̽,|lK†>²©€™ÏÇÕù^à(Hª³eí}‘ÄJ"€E)‚²d¸iŽ&ãCûÆ Ž{®”eúvôïØ—“ ÏÜa!Mqlåz᩟%,Eouÿ4aòUÏ‘2÷°q{¢O•É! ºï>˜‘¥ÂŽ2};úgØÁÐ/s'!ZöŠúÌëýQµP±bY«kû/Ÿg:çÔSš)ÈLbWÒ‘«[L¨»™ÁQw3Cdô2¿¢\ãKˆ~70 Âpž«cDtdIV­µø±Ë¼ÌîwD¤£4˜L´ìä¨^ÇwŸšÆAG Q2Ñ4îsáÓܬ=ó‡ÍßåÌ_k_¶íçuµSìôý… Ó{A‘Ža:û“€.9CŠ©1 ‘¢eªˆTÅmÔwëšdïâCl¥¼i©‡ðÈcÜ9Ìf#û¯hYâv=2e^›}¾ÐóˆikÛÑOßÅŽ};jÆ/³r¦}@Z1ˆ¬hõ¿ù*䚟£ÅÁÒ {ÞÃ@ÇBR4³­U׆™<ªˆÓ( @j½»Z%FÝzaöG¾{tÚ‚º'‹D­›šx»ÍLžÄD™˜qå:±9V]$ä3Žòa‰S^ìC”`òÀÝ4àªÚõôŸ\ü‡'.1»Œ²†|-“N¼¼ÎKï‚ûþúèÙÝ"ãš.³º"ôHq³L¯Jdž[pF.2ÀëGšjöC—äÈì5ÓXÝÓzUþyLŒ¡ªÓ†î¾OuíwŸe2KÑú‰=éGøaZÛÔ_×LRÍž54%œ€3Y.Ÿ6Í|:}Wþym!­ºò窻ß;ž]NÓÛ<½f³—N…'6,j  }T–«y±±íµ0Âaá0 t¸k&3µià¢ÓÍäŸ×ZS‚Š?Nÿˆ8gN5›×Mï3þÔeè\¥Æga%t‡$Æ¡ *M û¶LÑï²ÜmbébÉ¿ÜX§»NOé ombFÝÚKq©¬ÊO)BX²'6ê‚¡èmª "]^UÖ8‹ qæN¡i¶pð}2C$þå{FCLâ‘u”ä{| ’{„ûMIº›ˆ(ƒP›WÆ6ì¬Æ6þacËOú…™¿óÏ8þÇd¶Ò¯Oðއx÷uhµšM!±¬¢Â­bæ ¶üÙøÉ¾ó±ÄÇ¡N h Æ#´ãÚÁ¢ûn´Õ°ZbßÃ;ß‘ÇU¹e’BU%Èàé 4·h ÃÅIÒM´Õ€×Ã÷þiáú¾ e·Æ’“ÆH™T®¼ïMäã[x™ )ÃH Do_g5 îÖËú£käc¸Ó5z÷Gq/ý߸²1 c°…1A)·¢ß¯ =XþÜ©æ¤ðûŠšÉ/Ú¾»Q““81—~}¯»Fø@wݧvQ$(íŽ`\¦²"·© ¾&³ ó‡îŸƒ·ùwõÉD©¹\¶âA¾æ‡ÝùŒÃžÆz_NdÊtÚäžp­±™í™;»¹xÎ$ò õÁf¶þ=fØ «} ŸˆEÀPlðÍ«jiBdl¥üIÉt•löC1~‡>šðÓåC}7h<ƒ[4:E¼4õÐëtûÃ…úµËs+•¾Ìþzÿ¶›Â)à .†aÁÐ7lé¯Oö~MOzŠãBiÙÏô •²RcNµ¹ä:ãeL[Ž–€¨‰@Wý<rM|å¦Ë|P¾Ü£=˜…J™¼#ÉèQ¬Ã®VÐ×— Ÿ³î&ªˆµçŠJQ/–¢³>¼…å>wE>TÜÙPJ®£TP¿n,÷'°ÁÌ^ 6äÖžgèô‘ŒÌǶsJ%ð€DWËŒÊNë«íê xZ5˜L„iôžF0²‘­Þe1åêbàäÔà#‹Þ0q‡v7!h¦%&Ïœ+µS Ï‹£Sž‘ßõ¹=ô4û;J 3𑈈dÏi‚ ‘°Û%rHþ½ËøbMØEÄÌD½V½€¨C¬qœ¥*‚¿'öèFäà ÷Ä>F]Ò%aT¤uÕå–°Oõ-õt"È?—!­HB.J%÷i¦¢¨É¶ÞµöL›;^<íù[Ô‹$ÐC²O{“¥mÿ"óÄŠÑ”  ‘ÙžI0ÛË}x_„›=èîµb4Ê[ŻޑQ(Üß/ù^íN×gA9D¦«—Px€©ÏT>Ò—[ÞScëóÍ¢Z**4o bqaèq™¬|'YÓ¾kuNLQG â¢Ý`Pù*‹l:€ÏñR‘©+â û|¥,Ç›×4-ú«þñšŽ",» þ2ÕjÏ8Š&ÌfÀ¼Ò÷…k¨ :ÕÑÅL/ˆb3ùHÛWÁ_&ÐË¥ªƒl ÌÕI¯ƒ- ¦Dc‰.»ÞΛkm  a ²%õ"9­ÔýÍðJ qVÙ¢ãíç‡yRmé8=×U.C­°V¶Û/øsšŸK—SÚ”Çe£s¥ÉÀî —ñ6j…Ò2øB•_¼ˆ<öÌ@:z&'ÑÃÙßk%Å¢RHÁû¼•‹aN¶šÄT²{)™’¢Z*,„6³X|˜œ}‘‰zVÙ\§½;Ö›/•¢Pº›ë…ÒC ôûÐ}æ‘ÉN·Û¨ˆ¢Rô‚wýi/.)÷Y$uôñ)ãÚ¬6²eTŽ–€¨œL´©5†`ëõÒçG÷8VÀO¸îÖ‹¥ZBI…T¸¥Ðóµ¸?” ÇÃõå=t=n¿vD+’‹V$±/›T?ÛDË+5P„Ôñçi£‡ž#Ó³Ò‰4úÄ Òu[l;6Ùáfþì-mߢã¿ÓFNþâz R†P),J?ç:,të æ‚}:»'P´‘{KOԽЯ‡^T Â*G™7”ØB¿~Ÿó—ÙA½%ÇO§Í<½Þ䣎ÁÐà0ˆè-(²*êpïx³Ay‹Nv¨¢_q9H«r`ÍëSÀ與vvÇï[œÌ@ò¼Š‚KÖQ‘4/[ 'è3=ân>ÔÅfß“¬Ú"]$ªÓ5X¼Õf²òRÇ|ôç¿Ã*›÷ÉݕɋP*³)¶,5 Çêõ”:Æce*uÓC”Úõ¦ÈðÜ¡• \ä+”%ÖÀ.à©Ý–äˆÏFæí S¸9ìáŽAå"‰Å†lõ'œ™£å†XC 21+EkAÅÈqUÙý9æð­iM½ÛjÊ .D«PSÓÊÚã©YL1åÍâÝ&Ê+ ¤fž/ÔÉ<@çhª\,,E^ìüY@'ª71ÜsQmÔ'w*“¡ ³V±eÔ$ý¹Ì÷“cÈÒv\EzÙ©O.§Î°íiKAT,œÞÆE£éeFé–ólLjb¤†[A“ZšØ>ë5£ü‚Õ@YÇ€õß°dÇò„ŸoAƒ¯oAƒÏs˜ThŽÍ Y×êßø8Œ÷WcÔ02U;†Ôæüì]ÿ¹«Èþöª®Ï6ÍÄd‚Æ»ËïÚˆlYDvZ¯×q˜ ³UMô€Pu<Õ*û¡d÷ÙHį›åJþÂý°>>nÈN ÕêÎÇl]kvn«™ñ?6ýùMýšÌù£bÚ6s“ÃÿŠlÛdMÓé]¦xôÍœü€ÿ¥ô™_·¼çV•¬(î&Ü¥Í2‘B[åf¡®Y|ó„f±>ku­¼B";Ý¿CÒÙÍ_+æþ‰u{¿Î÷}9ÝåTŸV6ó×Áì?WµÏ=\G ü:N+k~°¹ áQ™Âƒdë3Ÿ ©ùMIì%C—#¶d©/Fˆ@ê6N„ØIƒDˆF‰ $D*C£yºš‡kø7y#-[Ít—ö‹*!‰£zøÃ<ü—äå_]íZ{"^$™¬~ xúªJK52Yÿ*£IwÍ+’Ðp¯Ó¼˜T{Ǫ ÒÕP™®†*ˆtµT¡Ã…EKº\XR…–TÕ5«…©uOÉå+º€²`¤¿HP¶d2#ò-³…„©Ú±E, µ¢U_a‹RªÊœ¿MMkë²de é~¶L%ÙÉv±W)iaæÄ6_¡ÕLÖEgfº\Z&ÊÀÈf°EbÖr¿átßeÖì´ à±À•¡¹J ÈOÐ…j|ÙCêÅq×97%ˆ‰«T<© ËrUð¥ÊD[ÔŠm¡F±\»rÄB¢´‚èÐ øª.42Ò²Ä[g{ ЄÁ7–¾_¼8xùØ’&%&¬ïõU7Ý6Ä!€|xËÅ~$W‹w±å¢1|8iPq÷8è¦/þ^Zê©8Zê#/а8‹M䶪Éëç{õÁ,Îëq7/ ^'-À…®.•„P)ˆ«øñ9¾ŒÚcýò‘È4¤H¯9)Ä ïEB[³º0/âõio³õ&Ô»>Ëžn‰…KŸÛXéë]UœéE±pZIB”Åwá)Žs;›^akbyé5)%<@}ªí7ÂH€™ÌÕöØd!ÇO¶àyªüð6,AÁY֬ѣ Óëf!ÆIÍŠ½æc¯Û€$ ÉÍ´ùh .øÁmN4‘úÐçÊ¢©G¢:$`îª#*frV&N%±5^‰B¿AdIãj“—úþÊQ=¡:×8;D§Á W†6׆ä»Ãâ6JƒŽD¦ÄáiâDŽ-lëL⥠ðÁžë°-f¯ëS[@*§nˆ¬…}•›u²V‡Mo3ÀÄ›¶d-Ñ­èIéxh#Ý\@†(‚ Kæ«ÇÛAüòÀoK¥Rö†«³aÉâò Ô 5hÒf[2 QL}þš%2‚ ‰Ê6ôB™ÀÕ"0té,©Dh‡A†½»ü«·:×êßga¢q¹zt%g±‰ZH7p+h‚HUKHï„#!l‹Žy¿}2ÿ¸ÜJ¿_»ÙŒ Ñ`××òr†2âHäÏõÕÏ üyÕ Ù\ªÕNCÔ×^é0‹„z±äüÄÊlÌ€h»Ùca©,ŠÂÔª#dêï©ZÅV èßæ8Ì—ýØ/—eÉhÕ¬6,dX„(˜ŽØ3vùr¯ŠcûìAÞâpq"¯!‰ä'¯ á6 9Šë6‘=5#eÏ'ëoÉØNÐß8DÁÐt˜Ýn޼Ñß:ì¹Ç“¹l—smLFW’—ˆ£Ü¼Äàä[]-•‡Ø’¢³Ðx¬mt2Ö¸y¶|¾×Aˆ†lÃ9öXOöQ§á”v­çàHVNˆÈÕÀ++Ñ{ûØùÏ%©úU¬7Hò:C¤+.xÐ.flÑh¡H*7b€¤ØÈ U1‹¨/’ÙÇ.Ž!·•‘¢FpÅè ¡õ¥ ÒÕ¨/½›õa¢ÈNÇðˇ“5cDŒTºÆ–kC,ÐlæKEÛñòmºkÌïÄ^V,HSŽO/«5ƒT)oÞÍëBÒ¨Èw—Í=f£úÍAh%Ùʲç%%„L¹uEIýÚÛ¸+ sèNÖÙÐQC.i4¾\ön&)!DÊCÿàe!Õ>;!Ñs? ‰x2qã{Rˆº‹²(òKé•ÃЉáM/\~¾,ëË~û"aó@¢:qµÍŒpàú ÀXy4,¼»–¢ Y2ñî/ó‡Tü»˜Øªn™, €ú9 ± ]”öI(#Ï•EpˆtUŒ%Ë |é‡O6¾É=E´—7rÏêIAdÆ^%Á*9Ú ïâIÈQR“ˆûÀùï¢ã>—-ê²É+ΖÒ×}0L£Rà˜ûˆ1Í4ŽóÑMp†åÖšXãmôv¯xªók>|ª‘9„–ò/‡7ÛøÝhePäÄ:9 ìeФãÄÐàß:µv/Mf# ‚ÕáÓF£ö¨¨LógÙ^™~7š2°Ç¢Þ¦Hž‡LYCŒÃ³òwSbÈþtalDÙ„V?ÓÜHx˜È’Åov¸²­6M¸EÃÁ··Áéƒ\¡ƒO4 œi ·Øs¬#5qÄè®IeVvßË'±Æö­6åÞ^&T«8)ez@a'lï£ZM˜›´üªÓ}Ã<õФJz´h­IÛñË Ì€BɇԸìö­Yg¶ø¸¾Pû!fóvÙ >Í6É”G Œ*§4¸ßÈó\Èí¡Þ+"¨*­]ìÚm©$ç¬/ÙP€ða]¦5d€Z¾t &¿ç¹àã ʹ¶8 ¡²óÄŠ‘MóÁ6'L{–Õˆ´ \Y©—Î(Ž^>C˜3ûB0D½sf¶ª|‚ÊiµãéÕ?ÂBÈÖàDL*áܶÔ*t2ðV¡XU ç4ïä»Ev#w8Ö³ô9!·u†£z‡¯t"´¦A"Í3&qÏg^ ºÌÕ•q@#XtÚ„¸ Ú„Z(uL¸4Ô£ Q@ÚvÆ1´»$ìáJ¿òô™×µˆòZ¸÷ÃܼëЮtÕ¾ÞK…–;BÜQÃòÀ#ž =Î]ŠEÍü“1ŸÆ¥¿­àÔînÆ(冼Ev;ŒÍÙÐ0Uf)†ÜrÃÅ­Î'\a8ßt>cUŠ„ÑJ8¶ŽÙ³ÙA~ä§CÒ!G±Ç®Ü¬:¡EÆ+¢5nñL`-ì5²Š7haC‡—»ËʺÄnêwýå™WÜá‚׸cHŸv_™õ‘¬è˜VІîZßž½üìxX-‰¶˜ÁQK˜íLÉ¡b§ÜLtz€gFB]Ì3œ÷›ïƒN<©Îbb c°1Ò3k¤ß\䩵†(ÀÑ‘IònMFÔ&îA2~7ý¦ÊŽ};,ý2W n1Bdp‹]î(%-…NfÑ¥˜Ñ‹¢âGAT•e­®»ï–äÖñql#­ÉÿT)AßôEï?œšµµÅ-ŠÙQ¢ÏÙ—¹@‘½-sñÈ–”¾˜W€*~B¿âÌOxXCø¶¿Œ…UÙEݧÚÀO ÌŒs&™ èrâ3ƒ§îbva梥:4,1Cäƒb²ßí)lâž!Õ9HȈjMê=Èν{þ²EºJ3‘DÛLzìäÇ áCÌ߂Ŧ×2 lE«½ƒQ…aŸR<`Y“õü»Gíó=}ǡü~Àêì³wà’_·H±ä“—"©¾78&0öõšI¥ë¤ï…L5™¥ÜHŸÊ ÷;’[ü‰S2>ŒÕ"y\ ÒSüwð“äð/;2ä÷¹–¼VûЦ1Ò6ÉØQ¤°û 2YÜ „Èâ;ªþ¨?c‚^ô+fô"wÕ% Þ_%û˼ñqé·æ¯9Z)/Mæ=|äV –rC‰t ®$‰ÕT"F·õœñè¶žÑ^‰´³¹¥€ ÞçÞè¯"ªÎ“£Þ*­Ž§Vï_æ‹ÊN“ÏÜ"”óÄ:¥¬ ÍÕzšpƒ|„z¿ÃbÓ-C©ª­þ¢?_ì>wà¨G—#Ð@P}C}šyª(í ¯eúl:bÃyéËß_=ËßC¾ÓùV74×#Ëï×9:±¿Ø³1óÜ‚k4¸àÖ†$4çŠñuÍ4aÔ´^ôŸÇ$âFÁ)}µBÝ“¶œ_:>öï>Ëg&ý6:L?ñ»E_×bu,g*!@ŵ|‘c‚Óö»ï?צÇcz0V5¢ ƒH(r˱ënüŽW¦émž§³Ùµ¬2ÐØä\W2^T‰ÚçÅ>V·×rä@‚Ã(0ÂaHqwÑÅÕoÉ?¯UÆŠ'õp8hàùI?ÇjÒKdsøé}F×Üã«4òÚC”æ•$Æ¡‰q(Aº ÁÅÆôÞÚ¬xX»E Ìéù•´”J–Ò» ¨žÂxå åŒÖõ¤ €xN1]$šÐ0E°EJQhIÄM¹|†ÜÖÂ>ÑhZ2) »…°EÓfæ‰ü(é¤AêLÆÓµHbÂYÿ7FR¾U8W æGÅJ9I½‘ÍÕ6¯þ"hs¡MzÀ`# £‘$&3õg¿óTãø²üÞÀ‘à›O]–,w¯i¨ã[7©Ù¸j[ÐÇ1šÌ»6"qh;j#¡Cä©'h†]o86­ïA´ç Õ;GÈ Îº^ã`˜mǦ'³íýž쟃 '­mÝ3™hf”ë?¶/—€šeþ1Èqæ"ãÖÜÂò|¹×sG8ÀàN”Ò¦ùN¯¶Äs³“1 W¤NR ð"©TþȃCºAç÷:Í©Ðú®ÈÕÅ ”cÄԘ͆ÁÒ+\ØË.vDru·dqg.ŽgÐX–çÅÑ)Ï‹ƒ“_—µËtÚÏ;ÞsitG>€&©[ݱÁЈÆxP@ Ñè~qGÂ]åk¢šâÙ`å!V4`´‘ûPôßž1Ñ/½^tI—„Ñ% k—á[Xâö&éêûoK½¾Rõùпj ¢IÈE‹’v‹çºlxIð¢e×\Ùí¼›;qõbâñ†H d]®oÀR¨)˜ªÎ!T$Ïž  )ѦȪ9ÀQiN·#)9l6 Ó¹‡b4ÊeÅ åëúîÅ›bL‡àÖ’c¨Пî^@K@T^Àܘb Èê/CõuÜÓõ¹+Õœì|J¥…àKõÃXN ZÚx±_Šþ ßYnœzÆY.ê(ÑÛ*W}Ⱦ“o[òãjÔr½8=>áwû¢+«ñL t¼‹K%Æ„iÑ›–Ž×t„¤è¢«( [³dÌ`-¤Îfêfr[’ôD‚ΰ‚ ÂE‰Qf꜒ØÏÙåæUbœ€Cb fDבPKEL¢6ö}w}&çB±¤U¹Vˆ©›Œ³™çÃV+AÄ8šáCRÔåìÍGô¼®r¡´ iáº-ݬЅÇTªÅqÙx¼ N½Q®Ý•¡V(.3Cöu{w#uÙ±ç§u\-\ê¢ §ï¤5/E½XXz¿Ÿ×s­#™øuKR•_j)q2…¨– uU0†U5ñÉ[Ý;ñ ‹Ü1àî¯ïf!F «yJ†RȱÇì’ô.¤TûìЃzz}ráÜ¥ƒWþ/F=m¹1Ü·ú„EϽOA@TŽ–€®HKj¡2×KGñˆÖ†Nhƹw W¥ZBI!Õár)th B¾ª×V§C#ýácÚ£Cvë@ErÑŠ$ ¢«ùð$$…P”mrŽÍfWW±r¦†È‰œLëpÒè/Hm‰ûE½¶³w8’Ãd[fÚH,õô÷\Â*a ŸãݰDd¨Éôaú¼ÏÂVni`•)~3¦¨„!T Âj]ãzAkèRIJ×?9_µÅQG` Kúr.#8º"Pt` q¼Lv{`i‹BjLv^r^a4V’ƒT°*‡DÐŒLzQŒŸe~´lŽûl4²ƒÞ9t¹aIM²&±$+¨€aíT^’¾ñÒÐæClv$K -"@*¢:þs_13_Öi=&¡VðŸw¿n@ŠP)éÉ>úq©µÇª† §û]øi—Ò˔̜±?ÌQñ]l‘• r–Tù%µ¶Kú:lF8-½‘E©ÃµtUB"F­ÔH9ô²Z"ÁVÉç{#Ç…ç•,KÄR‰¥ÕLÄЧ´Paì>LOøÆŸr6d ªË€Öt ÅZžVÖNMÉ¢b4ÊeÅ M7€7µ ;R¦ó埛FDS+Å ØÕ@£4ƒéøEBuäܤ¦L^„J™5Z@‰¨,5×w-“vÙBó« ;Ë8ad—9{NC¸ö*{‘Ú²°¦,5K¶œ<¹„–± ,®ÝÃí#jÍÆ+¡wA‰B³Ìg]kþQúmÉóG‰ˆs1ç %*fÊ)!­y•CÎ4”:ª“±%üL~ªäbDsÖ÷ƒþÕpz!@O¸çkQ¡˜ßî'ÈoòsÝV檛ÔÍö!tØ|Læ¯ý³Í'ù×tm „A ƒLëõ:ãö¯ªjtª*¯B˜üßU¥¡úuÓ]…¿¶}Â…éÚƒRS ðuôÿšÝg»Œ±š©uôþ×¢¿ªD…“9$j¦m3Ï¡üô¯åXÓÂi:½“¡~¨”~@Y\sË{®7,é'“ë>{gÃ:$t7êk؉öÙ› ò†µNæú.vwÒO|Ÿ=^‡þæ¼›¿1J}dŒ‹C½ûß©>únæoTæ¢b¯PõÛãÔ/ŒÍýdÀ¦€ˆDö+浑(ºI b"‰Q"¤CD`$ú‰ÀKô!õöBÝ–Ë=ÖÍS=ü»ðJ0k"·J8·ægØyÿ,É{ þ…e?±Òþå(Í Ñ\Ǽ@É«4PSÔ’¼VóÛ77‘mQì:QÍU%†HWCdºª ÒÕR…U¡Ç…EUèp!«jV‹œ0W(D_&• qo!FÞ’É/6;"#¤)Y“)díRÜÐQQ‘9· îAØ–š¢IÑU¸È°dÖµ4 dbø„Q&ðeˆŒ$þjn%ÝŽ_VS²SÍõ}Ê;¦ƒÐò¨§• À”ÄFçå™FÄå¬éö[‰û8¹fw˜ÝØ–H\e0[„5¿›ÛªYŽB5¾ìñL“ ÉœŒÉŒb‘«¯”!­ŠT}ÂRªLhP/H²”$’{,wµˆ2¤iE&¡,竺ð˜ËŸà™5ÊE•· Þ-ùHÜ× ™²Èú^µZHõÖÌ#üÅ’ôqç»E-}Ú'ÿlÏ#‹ÄiMI9ZIùú^r}¨ÈËÍCê’q± ÜWGü{õ¹È|cÑCf"ˆ¢äuŠ àÈõ‘ê3ýÅ“Œ«H*ȱ~y6ÛÌi™{g?¥E6”ÊbkÖ4]Ä]õ™x3ß&¡ã¤«ú,{[Ú Ÿ[T†ZaT¶\ï‚°â=FMëj7†.QÄ;ßE§eÙ>ú›Ao‹BýµçÚ’@[dQ_ïëf¢fgÛÌɼPaû‚=·c•[ð®ËÛtøÔrAA ;ײ¤‚‘z«‡7Cö'æ£ ³nK2¹Ú°o 9ß´…Ä.“ÑÁí^.¡}Ôs}®œdM-IãÆ†Eø+Õ‡wª ¾FiB ñ%ÍèC^À{fQ*¤6©RQw{  c°oxÔ5'0\èwC¦6q%áß"N·Sñ¾½ÅS „ÍÛXæCFÑà‹ÜÞi ‹M6cë¡Û­íH+Ru X «|é]FCÁyÞ°cpÉÂëÍɨg£Ç Hø¶2¤ Ðmǹ† ¢PwÇ™*à¡C–â™C ÒFÛ’9†Úœ½¼âh6bi‚Ø5D`jäÚFah@l[4ÌDA\Oð±Ëº¬²¸ðÉ[¨âQh°¡‰¤ÀøXy´ÆÁUÛP‚vÕ ¹-öp“úÿ~÷^ŽÌå]ØlR77ü…ÎzõMù ~®ARÁš´ë:,` FY^}ÕÜühéþÏ~úE“ó¹£¢s4øÝì±×D¸(‹¨îEƆÝv«¦oRÅŒ‘•ms9ÔþÙÏ|õ ™ÞdPj––WÙPÄŸ" .àȽ(Ú²ËuÔ-qñä¶g:˜p@>!/ãÁ"§òË«Ë ;àLˆÙ²(ÄLØ©é!ò°±Ñð`2†+8 DÁ+‰(:dKD·í Ñò`Ñ>¸<MI:`,ŽJŸJ‰‹‚H%[]5rù²Ó »q7:«w¸X¶äF ©†“ìÙ§¢E^Æ9èyª$ [$†’\Á)¼X‰º3R“ДkÞV¨:á*¸ BÍWÝ?W8~^«|§)Ãϵ®q’x*KEª\1SŒFy«Ñc‘)Åzƒ«øE²Æ nD³zX&)ƒ©x·)êAy¼ä=Ô[z³qMrÄébÔQ±Tê\I9ZL9©»+'3'Ôê_*ê›?3±™Ëó;}°4ÄÎMPŽŠ€«~ÛÄĹu!¹¨T\ÜË&"¶Aç Ĉ"—=/a$„’”u‰ÈDmÌe壄+ ‡RSëØ¿¤?Qeï^Ð&´B¨K…þReDÁÆ"/ëžidä“ ó›¼¥õ¸`eÑ#ÌÈÇaÀþ2¤ýø]V]?ÉÓˆÉ XÛ1½ìw<‚ƒx®-Eè$–Ý}×¼B¾A  fšjASEowkp©Ml``—GÑôŸ« Ý€`~£ŽÔ ®bÝHêmºµþ<»¶\3î8 1t|ŸŠHô8ó£K¼ F\{¹Ë,<¬Ï6³Ã–ÌÇn£Â™Än¦¿áÂÏ!Ù“¡ôW ™hE‰èr®Æ`°ñSMŸ^>âóþš/{õ QÍɇÈ È­¤‚9ľš‘˜Hø´½ç%s<S9N/›Tì q–ƒ%&$ ËR‰©AÐìRC¨ð9±5©@†@  –É×’ºMjóáóÇÍ!žcÅ  ƒy©BÉ¡"8©]àQî‘ýâíÂÓÊLsˆ}ˆÇ] ×¥Bò®qܨí•Ùä¦i öXÔÀÛ”Éóâè”·‹æ¥Ïocó]ߺjr£ºK Ñî¥ÕOe7‚‰hЖì'Ö+Û¬Ó„[4|{  2ÄDcWFy”ìIË^㹪£.X ¾ï“哸×ö.F=Õ±©…Âï·RwŸŠï;ZÐo!„A@ ©´Ò›&cê©Bâ<¡`òßq¯‹0G Ág&¦åro»ÔŠˆÑ´š}³‹K|+£Qo‘2Í6•G ¡"Ôë›o<õÖù•‘úuCóäœì”är ' | 2ó~õúÕ=ù.5…Ù1Ìfïg\~5`ÛǬÐ@ !§ù(¥©Ö»ajFM·—P©ì)j`2ÓôêB|U½EhŽuêíøo/|Å'™–-šKvs"&5/ú­×*wC®¶ân|VI°›1›†› õGzêò'öÊMÏ -Žü4M­iqPÍãd°lÏÈà“Ô§û¹/¨NŒ¹#ö2ÖçÕñÉ‹iYÏ™õa7˲¥Jý¸Zëݳ¥K«åØ3šó&ÔÝÌ ÔKˆ…ÝGÆÎ~2T*ý^¥ýC5Hu‚zÚ;º“¥ê¤‡é˜þs½HD…5ÄÝŽŽ£åÉh܇¸â¸ ök¥ßßt"v”è#öe®3Bbp“½.ˆ=ð¦GŸã.µõ:=Š‹®ÇXËFìXVÑ:¿’ûÊe6;W ƒûS¥<1»/´fénñì(Ñw±#¢_æ1B”ìí"„Ä良fºÙEÜ×s× ây9;¤íZíWÈ¿ÌYÜ¢SoPµü `ÞãE÷Ú}Á‘3ƒ£.2/3¡›lè5OB3ÆJ9̈r—оò5qjÑ­—ó: ì}ähu¨°ä>¿î—f¤²8HÔî!ö‚þbjÏWÊ„ª­ÿ½°T^hûUwd® ÝŽä!wÁÚÜzJ÷¡Ø­Jj_óé;byl Xç©™}à ›òCDŠ„µHªŸ«É\¡w>’»E}5+XÙÁ‡EPër¥=%ö[‹¯0®þVr½²aaG¡ ŽKRn„55f ïµÛG" —‘Ö-lšH黨á¢qÌ5‹[”à,î¦DÛ Õ·”qÞ—¹ ïËØ!kÛÆ{ ÅÎårÎúðb2ªç¦2óö!dQ8øJF:PWÒÖ±ÌaA 0û -=Ä`˜»‰%niw:<ÖW/ µJª#­’u@žnjÍÝ„ÈÛÝÆÄWÞõܤÆð5KªLkv¶øÎ2 |ËQ£Áç9 &fÎSª]±ÛÀ~D…^äÕ öâd£§u‚©kÔüZ¦Ï¦Ãcœ—ÞfýýÝsõšÁò÷˜¾¾Fó…uŽB",ö€Ð<4úá:d^¬ãPDzÍ4‘Û´^ôŸÇdk„a‡(—^ã>Ù³¦ó»ëwµþÿ»Ï2…EŸI¿«ÓmÜ\ìuÍ!PÊrÔ%숪%ƒšÐµ|‘c•Óö¦ÿ¼¶ MI3¤Û6§îàïxydšÞæ™k²±è|I¦5.;Œ _§{`?/öÉ»½–£ ŒpF8Œ·ÛAd5@m¦ºè,ýZ{Yñ¤›Šý_üx¶ï&CH¶60½Ïèš;Þ~•Fk{œ½rP‚Ä8” 1õH—í½ø‚™Þ[›ëbv‡hå“ÕúJZÌ ?t‹!ÜlT_aŒCb2íÆd<§X\įG_î w7EÔ¢(5i—(XØg …°‰É;Ü’ê †‹+5™Q)?X‰‚L›tÉë_$¡¡Q¾w;øQ´ò ‰¬±Íd×6óª6ç»$~“_䣠$|6µXà|Û˼ù’ò oàâëOc°Ü¦º¶v/ºkõ¬Ñ¶¤/5™wr2¤‚UFÂRchÆ#ô¢>@;0šïS 1žº„Vï¹ ½¥D¢lÔÉ, ©ÎšêžPàöÈÚ3¸E£6࿽[jQ/HN wûMä+¾aGaáUž„égm$b€#+Ë#Ùí6bú…&B|›™]Qí÷5UE1êU¬–#u•– 0‹Q¨Â¤@<7DÇÅ-ÂÚ=cæmB ù®BWÕW2úaÂß_z,´ÚÍe B—{Bð1 ÔIÀm\ÿâêäFf]·qÛÂ,²D-9™ ÷übÿl0s¿ÉŒ|˜ˆûfjºþ÷á:uõ&Ôô(ów˜ˆAŽ“=¾Ê´êÎÝç Í^‡É¸“ÚÁ@yŽ3̆äÃì·f¶[³FŽ"{y¨0œ/Ùí¹¹Éû+_qž}_!aAéãmrÇz𠾓Tãð(.{ ^Þᅧ[ø#*ào@;ÍßC¨nµ¾Ò ÇË¥S)il¶é^\ à .†¡‚kU<%þÚ¦4+¶-Sß ¿˜¥îõã#¥îdËŠ£SžG§<çkðÎî¬Zò"ß"·à³™¬tQ»*L[ý²¬UawÃtXŽSm¤»Qg¼È/*ÇAs%»Û8œŸ>L—Ùns¹—ÜlŽVêÌö\™´iY£ÉyFÔ´ j¸«/hX_.Âæº›(~Ö\‘UXŠ.p©¶z¯ÇÞ¡6)­Å^³•¾¢py*ŠÞì"¼Æ×Q*h\7u³Lö°&³Î}<µ !¶.ç™F=}¨T³›àô\ÐH  ¢+…ŒRGË ¼«n¯zMç‘ÝiXTÁ÷͉A(WCYNþBp²‰‹Zº‡$½VÔÂ÷d‘¤Gý«)­HB.Z‘D]—­Ë€(PqQ´í¢kN¢ Ó¢ÓžXê'Y—ë°l3»ÂXš½c.œD®M ‰2 R]!Ç삾î_Ò5Óå6]‘!Lô#tÏË%ÅÁ×õ]-G/ºÃ]dǘBMNw³Ê1J`n\³¿tŒ!©% OõÅ߇Mv ïjx¾™BTKE…ÐOï1l-Ÿ\à Ÿˆn—œSZ‚rQ»dÕa ÔÄ·U èƒt¤¨ÖÓ§Ã篗\¹²WÕ@Ç»õÙš2-zÃÖñšŽO`ª]EKØš'ä(Xš:›Iãºz2pלæ"*’RãLÀe=‰OÉ:®"ºL¬lsCÑt£j¥„ä:JåëÔ`7Ò®#„îE]v}¸(çl  a,/‘Á•ôô[š^=ÿÀXb‹:Jà‹8û›|¶讉uz‘€Ð¨ŠËp®Û2€¼ËŽ©¹v\6^s‚Wo¡kËP+”–Ý/÷÷òØËqµ]m\z¬ ¯ï¸5)E½XXj¶¬çÚE¤—·–TKå<[JÔ¾ÕRi¡g®ç6T(NPL«ò¡áÂ<êîËï´ÕRiáýÄ]G±Çl“QCg¤ÞH5&÷?Âì6c_Šzq³t5™"Ñ“ ÈiìÇä3AÄ•^mÒI9F tEœFBe®—ƒ8\ó/}Ü­¬¥ZBIµ„ÔÑ$l‹ÂøL‰à£úÿ*a•‚£ô£¼ÏBȔ度í$KÿXÑmiŒ)~E& ¡R†P)öÿ¨^¢Ô§¼l`«Á§î ý{Ú\(ú‚&ÇÛRºBD4¦ÈxP@ÔÝpËœúÚ¢*“ÀœW.©`EMA32©3¢Kuü(ó£çôY©- ±1™‰ÃyE’eAˆ%+‚ˆ%ͦ›5I:ÈIgF›ügrr^ﺈ@ÕñŸ³øŠ™ùôKFŸLðe[aÞÃj S&-BZfWú(‘›{¬^¾üÓ)S¿A®gu?Ìyü]ŸÇl‰JP.j”øj6f‚•Øi?&¼ô²\8‹¾‘Õ,"!@…[ÑI%ÐÁÁVÉæ2xG‡°ç5%ôÙ+R‰Õ¤Õs” NŒ«ñí)çî|ÒjÉ (D+Ú`B]ˆ©äiEí ÝÙfk9kå²bËI…šô`ÊÓjœ/’ß¼0"UŠz±°¡ØU¡íJóǤê¸W€:¦IîÑbúaÖfZ .µÖ÷,“êÛ>²ÓË=Wݽ,“æì1DSÐÂ15.F¶4dK6SŠØr’Ú¥`ªry/º‡ÛGÔ˜ú²+Ü…Ð;Ê,‰Æc bõß–yÉ%"ÎQJ”Íì „°æuJŒ83+@bæ±¹òâ/C]LOÇaʸ¿N/8$ôæaµÝV…Ó~×®ÛÊ\õ“ºÙ>…LŽƒøÏ6Ÿôâµ¥!Óz½ŽÃ¸!ý ýCÕ5* PUyŽþàÿ®*‹è•úu³]…¿¶}ìeÈtí*ñÊ|Ìq»u5skþÇrlé¥É 5Ó¦ŽÍoû+ÿ±kzišNïdE¨*ð¿’Ê‚ä’#XÞsR[vr½g/6¬oWÄ ;‘Ž×lXwA7p•7¬jWìYwozÅw¼ãu\áúÝ©ô?Ýßù~ à|ßÅ‹¾ûàùèÍüÓýÕ=Ný@R Šÿ:ÎOÄ`.„_¦ßÞ?‘y#â±_<)“½DÃÞ‘p'è?ùP2°‹í øÐãÀ"Æ$â«v•€>?˜·C(ÚLd›pa6_‡X0ýéÖíðoIÞqæ¶°ÿšÍ®÷‚ôuèêÁ¼aúo˜ DGù=Î)rƒ:t ÚŠW¨B{ ¥¡HY/£Ýz‹c¿.½KÝ‘^N-ºõ2jѯ—Q‹GÍq4õÎjñ5𔄠 úÈõÂåÈ–p9qv7m2Ó£ÎKéµÈQbiÑ%º4Ù<¯¹¥_a“îÅ]Lm2‘q e¡(38Ñ™ö¢ƒ£MóWr¹`]¡ ian;)äu¿Ì›¯5\Ö(Ú±À”D•ƒ–ÇU))f P,aëd¿?¹Ï³+}`³eÔðºJQÝX ¢•²´¨PïÕ~ã6y¿ÌY×+feqƒÚ"A"©%ËR3¢V†RM£x—z%7!£ I…JD¹X¹´ö-ÃÐg:« 8»,ñ¹­Ù†¶0ë¯ ³A,³½»(8„òó|”ù!µ¹*NÆ÷Ÿ% ÞêSL,v7Zy6ÏIÊÍ ˜rõ¥B‡>ñDZMÆ•8„òucÑ®Mä%vt1 t¾W–iý|¯>çÍá¬.I t<–â bÉXPûÃI¢*Z4+)@(‰+Ob~*%ÇêOØŸë•÷$b¤,-2uàÊÑ“Ÿ±akš!完úÒ¿¹\kú°Ç]·sË }Ù²×™Ð% ÏzÆj¿6ÅkVê2 §u ^ Ñý=2…ÐänSöaœœ++B$ÔT˜¡D/€•×QŒgµ‰AŠ`ŒF[„‘˜Ì°Áö$»Cðð™RéN‘…äY;Ü ˜såä ÚÓrzŒÁl´‘9l¾|\ò´)˜ÉQ÷" Ÿ¸“„›ç沑‘­ÕA]HúÌKF)ËjðíÀˆÑó4¿ꈼ’boAp’qïN¢RËÜž8.Žæí"£Ÿ=Õî·ÒÅ(0°4WsÉ‚@…’]T¨V&n²2¾¾…c0èÏeDM›„=Œj¾ô©)ô4Œ¾¶Ìë¡H°ºeºmÁ§dK8>ÓÜ5B4j,r`—hó1ÁÎ68âÆÝØ$x¢¯Ùò»d!3çd„[öÌ.Ñ9°2ÔÞ“e;ï—¶u2ĦµÈÜ-ž°¯h§‹þ¼›4÷–ÌÕñ„%dl¦LdXa Ä´¯³¤O \ÒÚ„ n[v³ÚMG¡ ‰[é kw‹ÏžÓ2¬QDâO°z+Ä·¬ª†& #MkáÓƒÊVýaÚÇô²Å#tÿß§Ð&—«¬K³Ùl“—Héˆ%DsQp£ ð¢Sžñ¶ÀÙ ©`YNínøDgLÍAÓ·õë¥ÃZRóìhø¢3óL : Rúô{…=±¬š‡Ÿaaº!-°UZ£mŽÏÇà\Ir3ÆdZ‘™ˆ†¬y65ÈÑ €y~“’Ý5ˆEÑ!›uØÒùu޽Çãê©ýag¬ÿÐàˆÖåͤ@‡lYD¶û¨åôØ/Éà¼fG$ ‰9r €QwºY´¨A£fF¶åtˆ»:7-©d£Ó:qtʯœ³ÑiyÝ’¦äZq3Fž([:ñGSªî®Í¥.˺…¼£j©¨:l ER²Çš®<’Õ0N>ª£ˆ¨ †T®~ûó†¡Ót>d$_eW¤åòš§!4¤ª^ºB4Ôµmp¹Øúo¿äûÖcBûA$×Ê+þ!BIUü£¥Pv@ÄR/ÆØ[ù"ù¨UC§KÏq9-&5¯¥¢ÅtâŸËÙÏÄ1Å‘)#þÑA´¦8]G|§ õ‰ãBy¨»ÞØ"+J¡)×2J¿‰jb7!l¸Ýl oý¶qö©ÎÏ­Vî¡MM AÌõ¥n£Ðcu5ÁßÖ…d[Tñ×/ó%×™7ñs/ÏR‘2T-BtÈÎÄu‘,–Šªcq%)iÝâ„U÷ßvtDzÛ€¬")߫ڄ‘(겡VyQµTT ÜJ<ãl uŸ”ás2íÝ£#MÊúÖá©Ö‚äH!äÅ‘C0^ " ±pÍ÷ˆ¿¬&Sˆ~ã¥>¬½îºú'|TZÉTF‡p~Ÿòº!Úæ×Y7/ 08@ýæ@Ô@‹Iâ½S›Ø€ùdÛÐyXUFFmTDÎïC\?ÄÐîúÙ¹b¢’h%}ŠéÏCÓìºÛšé`âù‡Á¿LÜåDLÔ`áPê× ÙW3*¢øìÄÛïDMã6cIò„ƒI 0;{vÿ³.jó„—` £`a¦Aþšõ±¢I8Qùk>j=&¶º×|ÙËÍT°‡±ï§&g6¦D¾¼š  )(ö~ƒz9{»ÿEÇëv}l¾lªÒ3$UØã5jbÚbôCÑÔG´+½¦°UG7‚À#znÀåûÆåy˜lŠ–TÙö2yEÌ®yc^Ž@ ²L™VN)žSÌæ©ÀRÄ­ú®ñaÜ~ˆzBÌD~.îXà^maBÓM!ˆÛå^Û:©Ñ·š m³Ë\°% ”Qw딕ST•KiP¯ƒ—x˜zEòœÈ«ØïŒz3!F-]÷ù%›X£xæ&Jáäý¨,—ïïYþØl tt#õÙ§ù“>&‡¬ˆ¸ðõ¨FÓ|Dû•YÙA ÖW½&aiƒ“T¿nÆÓ¹9«iñ®nf;K ºõ‰±·—¾âe±-e¸ Ððl¼UHHÇ8Q®j'Ì͹ǖ/cóeb"3(”ñ¼e!K Ô~Xkžz‰úϼ„6.˜/g¸âe0Ýðc6¡Ò•äŒ(I"°gýhåú~Ÿ8'â1ÖMûŽââ+÷PÚïRნ®’èw/ؤõ0#‚u g±\²‚~bˆêÝb…O/™qZ®¥¶?ôîâ2öø§ÂˆK³áë Œgh¦èì%7c·cùŒ µœm™¨¥¨›*äOÞÅ–á鬊U„µpŠÀ;|Ô'Øuù <Ç­î\בŸù”ùæ½bê3Ì„Þ)[<‰rfT™Q¾o+Ì©Áèx¬Ååô›Ÿ«Õ\ÜIÆè^2Ô<б+[É»çDÓœœÊýLE«ßr$_þ>ú;€ŒŠÉ°gã‰@6ef~Ï3£b§YÅ éôË ›O‹[7¬Ô Qƒ¦žei“Ajt¬Û·éA|æõLމ‘ !mKB‚¼‡’ÉŽ‰|•LÎÌÞldfA)ûõÆ>?"lÜdG‰¾‹2ãß$Ò‰ À›¨Â£š8U¨¹^ÌicVQï«x3¡Bú4¹¿}âÈŠd6wª-–f>ÓÜr>Ì,%a¬NKÅ\ˆìm±ã‘7;8ú¨›¾ŽÇhM"Ç£×x†ò¦¬‚š¸ö,ûÏÀ.RТSÅQõü|ЬRÌ$û^”EÙ¥ö£ƒçs_FcKód“š¬YbÁØ:ù^eÝn°Ìï%YIî®DЄªªÈáFˆ¯1bÈiÏDc-Úí yÝ„¨6t¶…h«ßI(©ù[°èOáE³PšvbjO´+„Y—“¹‘eG¯ÿmYºt6q’¹õTˆÂëóuú.]žPWë :V 5?`2mËdÓîùE÷ÕdvÓû¿É}—S£le™:³âª;RúÂݯWÈ<Öe}®‰"çâ>> ïáƒÀí.ÈnY ÛœUž ’òο÷“™"+ìK$Šë5 (óéj2í9aû”Äâ;Jô]ì(Ÿ÷в*<ªÉ2‡‘i§ù9%:š³L ÎÌΧ%R¹œßó×}®*Í:çìäÊ"“‘¶‰Á0—ˆù~eV_÷(+cÛzFJD‚¨"­. ªq¸Vh´‰ŒÕªH‰ÑÑK±S£6PßÕLæÝm¼~åe·ù8Ÿ¯SªÆh_šLHfv¦wW7qJˆ|]WFxRQ¬«€ïMÃýîWÕ\;OC4øzD£RMs¶/féz\¾–飷ø/¯óÒ§j¾¿>zejÙBÍ]³Fó©uŽ¢7™/òÇ(TKÝg˜g¯ðk¦Ù£É˜ƒa_PW`J@÷Öxî~0©GÑï>ËÖ'ý.>LÏssü×5‡@sËP–°Ðq–kù"Q ®­Á‰ÅE¡ªÿö·¾cÞñÂÖ4½íÞ?“ˆK'|5m}%cõ鞸̋}?l¯å0¯”€Ã(0Âaá@×Lœ®UHƒú£ÀM%'›‹&ÜæŠÓäDÌ–›¦÷]saº®ÒÈvtÖJ‡$Æ¡i“E¶é½uá‘ ‰q(ù\Ú(j6¡Òvvƒ1Ò΋SèÂF|$¿Š1cÍ)\¨'Ó6LŒSø½ÉŠR?XHX«gÕÂsŠ~ç ‚’D„¬§„î±…H¡“àƦQ.™i‹êP"qãÁg$~¶ùˆÄ.ÙTH Ý$¦Ä\ÑÊíú¯@RÚY¾³˜Å ÛMô¾›i}Òët,“…ˆD·¦¦·ñއøíãÎM?Á¿Ìc¡Ø%:Øð¼6z5øim&sT­½»(~^蹿í³Udò0cÏ$•µÙG5ŸX¡ÐŒ"škû¾…%&RÅ0Ú‘¢;[Ý4{ÇJÝQÓl¼šæi¢&ã|ŽâcÂÖF)¼Òòÿ涬åf€.ˆa@[Z²;ÞÝ[ã1l”‰J­MïLOm#)ÃÈ„Yoæa ÃH ‡ìº©MÀ»¸Uí÷²5€ž4Àù¥ÿ›ˆ1X‚Â,A!Àjê†ÅÒZŒ^Û~`ЄÒ{_QW¡’V22<éˆÎÆX¿ô8q[žШóÃGmËMßÈÿ-V¨}@Øv‚Éñºç}ûçàm~XÈd3ë kÆvÈ<àPo¢çô»W›ÃÞQWÐŒ8ؼKVápykÇÙ<•tŠ-„ÐÉ¿š¼ýS! IO 1dñïGfór}È`ÒÌÕÎ ãÃ7ðÊìž-너áì|4l4VWúeöŽDÀ§1·h<ƒ»„^Ïàö\ν82<®ŠÉZõ¬*¼ï]à×f»X¸‘OC+G¾Ìñs?T!0 âbq1 ÇæúYº´Ç°çæ:nX¯áî2‹ùº³~|¦ý>ãkR”çÅÑ)ωÃÊ·›§¢ ß 2*ÔcI^ïK¥£ê]ñ6×¶Mç$½Å&¦RÅÓ?[*¢rTÌsF¢ƒ&Ľ­W¡Úh䳕¸Zjñà|‡BTK……°¥úMÖ‰ …(—v,qœ&à³Î¡v†o¼·ÏIXhÞÎ*:à?) <àWŸ­¦ãK‹<ëÀˆÌÇÖÏr¼Å#„ÃÆÌW;{×t|,#øËâ«Æn<âpÕ€¸³Y¾XWBj¯»X¾fý_„]m,7KP)iá*šÂ¤Ã펦.ßhJ\¼ €Ö‡a‚\u¥V(ö+ße×§tsnR€>S³»M5lAR9ˆnϱ™‡ÊŽr‘¤ÄV}(¾DŸì~À%$:lÒö¹.¶PX¾p>öVÈTSµÆ U>.›¨%áQïêk/—¡VX+›%¢Y,SËÇ.mäÃ¥tNûŠ=å³òÅÂRTŠçcr£[õ±ÅÛH(œ%©¼ÊÚ½” H Q-BW|  Q¨õæã}¸ÿD•ýÌWûz§¥ÒBTKçý£Wí¡&• ùÿf&d¶¢“Ëiáv›~¬^ŠAð¼ï¤#ª³RXz2‹ÇöŽõ¹òb·¬6¿ZRŽ–€¨N@×s„áãc¶L•½^:Î^œÞ„܇úßwGa¤ZBIqBªS;)th, ¡!år-~â‚“êïÃS8%iV—ßkE´" ¹hEó9é§’ÖO»B3Ðx™› ˜9m4ðfÔhT}â¬4úÄi?#âè¶“F§íüѤ~‹‚=N‰ó¨æ•‚0„JABù@”êMu£Ð+èÂobÔdvÅ$¯¸è¤ý–Hœ6ÿXУ1*a•‚PE™‘QÛBÈ”Uua5™Õq7š²‘ÈQö-‰58m.* ÍÄt#8ºéðìµø ¸CõˆS-ŒÖC-Ž›~Žx„noQH»ÉNxÏ«(©`EeA3è0bLu""?‘ýdȔޢ(i“™-ž6Ä0Ä’eAˆ%­ 6&’Ô ¢-IÇéÄy QÌ7;&cEÚ]$êæû71Å×Ý,éè\ “É¢â\Í»_K‹P)kÙ¥«:q5KÒš«—/ÿt†Ü¿QÉYÜuhJHH¸•ÙŽÙ¼Ùåf°u^Càý²f^SÂõU—‚L¬!…؃lè¬ç—ÝlÕŽ'²)çþiÊ@"T–ñ ÚBuU4…OœVÔ(Aª1)£QN:A…£ê£ZBöô¡•ì0…ÒJÑ v5ŒŠ1¢:+EÚŠj(é^w*àyX”‹Ð ³U¢e«ã‹LEjâû¬þ`î ¢«à/;«Ÿp¤þ¶.§ÒñØ«•‹ÔBŒy›)El9IíR0 ½Ð¼Þæõˆ:Ãö‘^ý®ƒ%1áXÈc…þ#ÿmÕÕ…Pá—Ó£(ÕC~ózô›Ï¡ß|†]æ›+Ž\4¼%ɘð8L‘ú ÷ÃýÕDô‚û(NôkQi‡Þú'Èïøç|ÌUúÓ.qa¶L“ï.þ³˜´¯IÙ¥¿£@t!§õz‡ñý A9ƒ“ Ê;*GØÿ…û1+œDDñu³^ù_è¶ms‰éÚ ï;°.˜™ §m5Ë5üLWYj2QF Ó´mæI™ÿ€þ5©Ú¤¦éôÍ¢˜õã.ùÿKÙT’rLË{fRí9Ï;ßðî/Ê]ÃSl|Ãû.RÐ5ô_”»†mÁm…ö}%¸­@{ôñ:®P~÷RúOµ‚-¾ÌÒõ¿»õù[ôOÝw¹b«ÿuœŸH$º`úAäÚì˜Í¼ìí&"_²÷#{Íû¥Ÿœ\ÊvðARá&úÈòa¼Aár1/&ó^b‹fó±ö.ƒç¾áX]É[ÕîbH/Ï&ß'®ú7²P/Ì‹? Ò¢‚EÅšL3lñ0ðc¢±†ã¾^½üè±W/§Ýz9µèÖËŽÍ»õæj1 7W‹'ÍëÕ"Ò;«•ühæ.PŽTôJdK#¶t†™6™9`2ë÷—"×¶„c3apÔŒpÑP;WOÔ…Ó)%)ºX–Ìâ2"×€¤¬l79Ht%WQ°¼aL‡ SÓÞ|µðã²G./ þ>`Ü z…ªC%«•>o¿Qº] +¹¯“"¬Ù}.¯6c&­\/:ºýX‰B ¿l\“AzÉš[˜Ô‘“°«|aRË2Þ”¡_=ÿK£´ëeôD_I qî8QÚÆ#L`ýP"òÎXHƒe‰’ è(x§ÿÊÂYÀŠ`{Gœc”ˆdæùâDEFl&RŸEÑü}æ¶Ån¼S ÷[jŠú€UPaêÄt~¸¨OÍÓ[|`ìë7œxä%ò~1ÉA¿_u­ïÕg[›Zò:ùÀO@a]\‰öÆC¹qåIØx9VàÎþ\¯\ ¹˜©CR±Ø°5M6ðqÞz Xjɨ¸ø`é!aüôW3åÙmx¹õhÿí%2®\ bÝ8 uÔ_Ù”GÃ}@>¤IÖYc¨u¾Œ@0OJN€øJƒ’€Ìë.ôß—Š@íêÄ·®ùí ÜR¸ÜÚ—ÒàÓGãÜñ —0ŒØðm¸.$Á·JÎr™oÆ.‰„@¥ U?!JRÖ‡"Fmì01ªÎèjx’ÅaÒéhl»W…L,ßúC„È¥B·3‚•š”ÐDŽ¯Öš™Æ%æñ)Ÿs=5è×íôW¬Ïü´>Û,QfM䶉./ ˆ®4UÎì*´§VeIuæ;Õ WдÅ4KCëW]u(½Š lŽËç-Ú_óe¯úTpɰí»(è墖¸\&›HDެ.™I;:mçÉ@ýã1íÿ˾çÃ8únçù² äÏ#hÇú¹‚˜®ÀE‡ébbTŦyVƒü£Å.ËyÃ!³¼áw”^ío:ês+¢³>‚¸u¨K$( ÚwKŽ2HJ~ÏB&3³Ý¯Þ:-¯CÀ  Ü«N´âçªd,kNÔ,‹lt³ô)ˆC ¿L¯º.•UuÙe½ÉvXLzŒî:¢[/WGt:tnÞ@YF;^W¿æ²‘P¥F#.›oÇm&¹Ìiš2‚ ÞàºvÂ7²ü$CL4ŒþíMÄ ö€B\[ð ;oHè;rù$Jí’¢Má•Vr{™tUæ€9ÉÕ Y¦L):)x¥¨Aâ¦}—êg&DÝÓÑ9+ÕnԙΑ1È,9ÄCœ|äÀ˽êu*u£y5{ôf—Û4€ºkéÆ˜òD7d(5tñ0õöŒ½€o`‰NîÖï†Ì )_º¿‚èçœuº?ÁDÈœ¼=z‘ýòs" +Û^ER b¤>pÕc…áÂC+ þ´Ò|Äý¡Ç$|¾…cðùŽAÁгëÑ?œ3õ!c„Þ#:Ç6èCqïAöŠÞ¶>ÿ¬ k~ÛUˆIǬB‘aš÷¤÷”M„¬ÞuÑÍÀ8kwk$VÍÌ«ì3gÍ]¶cÚ à‰Ÿyi¹F‡ïaЮYérýš&ó° léRŒ×dôhxMf ^“Ù„š×éC ´;íŒ Tú ÙVºE¡`‡{‘‹x*õ1¯v‘u÷Œ’u‹ËHÛC•‚v²Ì¾Ôˆ´@dq‹ C.‰!ôêÒ¿p´úÅÀØšö„þ6ñÞÚæìvþP`£¶ÈØ–)·uSeÜh˜*c15ˆÉ=Œ>ŸÌÆ€rc}ê›èǘÚ?±;£‘ÿêζù¹WiKëg½qÚ8üÒz¶š!¦->¸cíy¿O„µ¾ÞcOaµõÔ@lt uÇʘ뾕vC”—ï Í4''éƒ~j3/.G•}süèvòÚ$ƒóWlj™‰Šm3¿·dhWºnæ›öܼC~/ö­Ê¾"4ºF†!ߦÌõmÔÓ!z.^ä ¼†lGqØŽ`L292ÑÀ’ùÙ¥ #¶Ø­å(#Ù‹X1¸Å‰ÁMFˆ]0½IÄGyŽ–q;­gT¡ßz†ëû¼Îî±öRYÝò~²0è³Ö8kØéæù:íì}¦Y(}„™9&DÄ8@8©£¿ÙÛb‡ÀÞ&!ZöF½õ]ð5ºgT¡ÛxŽ©³‡| IßX›“ðê‡t˳èôԌ¤լwÌ4—(ù’97èÎüªtÓÌŠº¥BC,lžÆš<ê£ÑwþWSzg1ìêhìm“ƒÚ»|ïRŸr ‰Ú ¼E6”¦j‰;66 ýñÝí !a7+eɺžÈFjݶQÊRwú£Ð«$›ƒ¿È2¹ ëx}¾NßÃiRØd 1¹dCH²™cBy.Wd²Y-‰y`ìë7Ïl`UÉõ&xrG÷ðÁY™u¶Ø£u=èö+Ç÷­¼ûÔ'Šß?áˆ5ð»}N’÷Ñ ˜Iž·Æ>¸ý;úE£;P"âô”©ÿìYÜ0N¿—ôÓŒÜüTFÌO(Ñg~ÁßxÒC<;žwY·Ö>—ç¯9ú0Vš–Í{ØëäX’(®þ-ÑC †™óîÌt ÛzÎxPfŸ®´—ÄúÚC7­J¤«âOϪB¢Xµ¢¡"ë׿Êg¡w«ÏV&@ö¿òÞgço.õî:¥*Œ‹ˆ d*X` ù®‹Æ!³®aÜÁÑàÓIÃtLýÀÕí+pa‘+‹4óùúD¡LÁù°Ó6”<ØõU)—^ËôÙtàµóÒ§w¾¿>z)j9nM_£)Ø:û(a>PŸmÝõHh‘å‘nŒA¯™&oÇ1ý×3%q”ï’ƒ;öÙ¨a¿û,SXìœôû0ÑM¿_׬ofÌo9  ; -±\Ë Ûpmªâ­“ASHr#©¯Uú&zÇ eÓô6/“øLç6 x%³‡I¥ëœû®Ú^ËÑ$8Œ#:€×L×j®5Ð`X?ÁaáÀÏôkäöÖQ–w¶Ö4½Ïèš Ør•†Ûö´™‰Ñ õHŒC Ðè…:½IÀØqãP‚D ÚñíyuyJ³e%ÒÞK¢?'†Ï€$¹1gR„1ÿ ;|Ha¶Ñ&|‡¨ÒÏfÃ6ýu+ß+³šˆ¤¶£å™ÐM¶©u2óvx§¦Î$\ø´Eu’¨þÿÐ]*”H³G Ù…oA}ïeH„^Ÿé4fmÄv½oáýò_{¹§ÎAH"Ó*HñÛǯT>À¿Ìi¦gøÉÆÂaºF7×f2›®Öf›‹ƒmîžz-ÁöŒÐK™m’Þ‰ÖÝvÕ ¡ÐŒ2šë.|K̽8Žv`¤è¾×‡m}„ŠÇÊÝYÚl€›æÐŠúîÜ¢ñ nÑè‡3=࿚-ŒÑ/wÔžÓÂtûUqMÆËQº°I¥šÉ{.ƒ$@ # ÃHÚÜÈïx1O0ÃH „Ù¾ÉÁ´¯ÙÞ)µŸ×hÀg5»t(úµ– 0KPhÂjp1‰ ¢ƒ%(èÿÝOk•ð}YuÉÛó6ª3‰oéåzQ{ñ” þÈ:H ñ˜ÍÄ|sÿ7Y¡Ú °½a2§àî‰ãþ9جP›FžÉQÇpòíâ »IÆ9‚-O8œ-!âÄûÊú„€q« Z…oÀq&{uÇÙõ¤@è[.”ªñîLRØ ëC†Íì¾{È`'zƒ ¡O€tŠÿƽrV¿ªT‰ ¶$)ª–Ùß[$K}ºqðÅ%{7h<ƒŸn‡}ç^-2|þ:¶tÁ Þ “Qjx»T2ÛeÈ|gZéDôeŽËû!M à .†aÃ`qܰ¯Ÿ¥W{ëw.7ðƒøöšî.´˜ÏIëÇfs€yÑð5bäyqtÊóâ òíf*(ÃãÊØ5›Š|ÿú)ߟÍdŠ Ÿ‹RdÚ"ˆeÞåH1`$²Íâ‘ã¦ÃržjóóÍrê%î –•C@À8+–†\_¥Ýßþ"M—ùN¤þš÷}PgËäE¨Ár1¤»'³ŒwÀ®>¡¯/¥Ý_6g¹–ºô—ùJ±°yq⌽M…1;¼rE1§U(êÙeŠ ñ”¹ÙuSy›*dûÀñu„‚þþºõð±‚OŸ®Áì“:§4­@Yã$Ú#&WÈrÊ5–$Ðx ©»Ž<ÈÿNS,Ø„"o*¡\U 95úV‹V\*ÿtL}$^®³÷Áú3‹Ç?3Y‚%‰8:åyqtÊÛè [l>ìÏÅ1`ÞÞÿa?47hBbS‘Ðà¨"LK4uàI=<RDõ†@¹=ÖÄ&6Ýun€•G/€•m‹Q“0Z‡H1`à½x˜E‘&£A0¨$Œ.é’0dÒÚ÷en|KÌçç¦tÓåàÆ"[Ú¨iÎÿúß>QâhYrQ#9oŒ©7€HB$Ú‘ÉŽÒÚxQ.|Ñž+õh¡)"@*2ïó7`i›Ò‘¼§ä¤9$ ZÑ” (‘9¨¢£fls5ïë·ß6*n6¾,νZ.+F©|Þ9=ºÕ,ž>¤zL©f¢§»¡ÍÙƒš€¤¼€y}/Õ€~n¢Ó†!÷™gÜ÷7µ\qÚ¨–J Jõ«¯ Q-íÈâ®Nœw†ïã·CÏ©Q‚.мl$ª˜’ø£ä3õ¥m:¾ôWÔ3¾€ìJ~a>¶~–ãÝ9ªƒ5vZôÆßã5Ÿ Kvüe[GõñógP©â† ZS©TZˆRý{ˆ!T«*¿ùÈ+ÑV³ÕÍVùC#{ü}s½›…Îû—¢W-[ˆû–Ÿu ƒøÿfÓ­ëd3ÌÅØÝ&´»KQ/–"*ž÷½ íJ!P=™en{ûäŠ1‹^Q<¬€¨m]Íšž™`+ û¤Öã9K¼yw–¢DR !$Rªgws¡ßøðQÁ¶>ôBŒË|éƒ-éoÞÓ…“µûñ8IÈE+’¨‹Îç$ Ÿ~’è†õ7 íB4ÆéfB¨N~QN¯aGíQ/H£O¼nKÜϺÁ×·0nqŸ}E«[˜sÚhLNõDïF¥ ¡RX”~]uX™²†…è@MÛɼâ–(æ–±œâQE¥ ¡R†Paˆ4¹ô¹RXYžxƒœÜ¨iŸ_ÙˆŠ„Ø’°Óæ"6‚iD€n@@Dc´>«ð wt;ð5é·(Êàd§¿zÄ!¬ÊA*Hä̘ bDu*`ü@ö“#sÈÜæ'öiÍ4ò¼ ’5Aˆ%k‚°ãÆ^íߨBt8€tF½ùn›’µ%ž“¨{ïßÄ_w³ä£SÊN&Ž .6ïaaš-“–Ù5®^Êš%iMŽÕS%?A~;CÊÒ™‡Zê(ë˜T‘ɦ¨£l‘÷Ž UIì—M’ÐGLrùÊÏ¢„D ·ÀY”ÀS3Ì‹Œ©ôê{o4¯)¡—‚L¬!…’X䈆jJí »|æ±)'•D¨)ƒTˆúCÊ„»#êXéÓÊÚ(/)Y£#pRiSŽQõQ1¸j~tЦÊS(MTŠz±°¾Š#hßû ÅIõÔPÒ½íTò°ÐãÒr™¼¡ÕºpQ²²´&¾Ïê/ò_¹pÕ\Fg¥ù6š‚Ž©qÔÄ‚°<ìÛrDû¢kĬ.6ptû¬GÔ@®„~'g™lžeg±±úo«€‘Jj( G‘¿‡ýæ3¿Ño>C~ó™ßè7?¦?6?ëŸÜ/C[,ëÉŠñ8L÷Wq„âT‘V¿•*ê]ÿ9sTØNýgû¼4 ã?‹É_ÄtmcHœÔ‘·ã0Žbÿ*g°BuÙC%xS~eþÎJ'WQ|);LsåmÛæÓµ 5˜”º`>f‚œ¶Õ,רð¿üéʤBÙt¦iÛÌ“þWücRµ/•M§oÅlž‘æWþCÙT,›\€&»}DÞ5&×÷¸Á!ïéÐIÃCØ5(EÖðu Û,Å›­»Cp[¡t_¯ãÊ@wg=ÌžŸÅü°ãïn}¾3üf®ê¾«~¸ º þë8?ƒ¹nú¿þ.‚³ãËnº`˜l‰½—;ìÚrL"Â1> ìრÂm>t9°Ä‡Á‰<˸\õ—˜yCY)¨·šùZp‘DÂã–¶­.ó6Eöz5o׎…M¾‡…-t0È Üå!@à°#†Å¦+-Jäê(¶ Ã67ô •â„P•ô2#¿n½µÑ£\oΈn½œZtëeÔ¢_/ç–GÍËp°zgµ’Í¼Ò W¨r9²…GUoÚdæ€[ÔØî'©¨ÉÈcOµûž1 c°…=óTÅð‚ó4r!«Í€Y÷'AÁÁâ¦M¢]G¦ÄAÓgiÁÄÝ£¥-³‡Áú§ÿl€ÂcµK;ëQ³Å4w!X { D£Æ2gå¶Ì6öÆÝØ$^¶7Éô¹ï—ô8‚ç¤£ÃØ¢°¥{‰âÉtC %¨½— UHÈаÃÝäu6R7íßλIsoÉLpZ샛ÆC·956’.¡NeôC„·2f ­„mÆqsðý«5丕²D§¢a¬þ…Ö(›Å' XYyôysî‘Ú&Eš&9ü¥(§Ïý¡£´%€maÎë³Ä[h›ËYb3éŽ4L0ˆ.ÅdYRAåŒÄ/F^û½à ©)V3d›‹§ÒÍ× 7û¼t”o;âŸHjÝf~²‘i/A$¥c„œŸ¸ÞD±°š¤W¤KÌ߬FÛ\‹kD9Xó…Þé"! BÆ»0©ÙBDÑ!ëEÍsޏ-Älö£¼ý K+Jd•EQ6êÈÂPÑþ“ß¼";0;Žnõ²eQp²"ïPDMÐб$¢èL¹É7 5IFè5»Ì¸T6µŸÊ: )6Jd:P«Á̳€ŽV(v'šÂ§Þ7j‚¨J6n'ŽUøªñ£Óòº%:?*uØò¥…‚DRN¨äj0² 73¼x^¿bô×z®Éú[]u‰jÏ=ˆw«®ò¡Ãôޏ=„+„8_«åâjwñRU¯SjN“„§ÝÍî¢ –·n–ô‹Á”—ê EþBQLÄŌ¢ò¡è°Ë-pû9‘þ¨ò¨˜Ô1B´üOÖʼnÁQqG$ãrÓçéC®j`ÇÚϵ *­g†ø,‘“±åF!¼/A÷ o6b‹Ë}Û4¿½[©-¨¢%5Hüv ±AluÍmw·Õ¯†N&éòe>Néh®÷ƒÀDÇ¿ŠR !¤RFaEmµ®\?¿« xÑUR„øN¾Ò$HÿIë{¨­a¶…ËR-!DR¾Oµ C/]H¢¥‚°ŒÍêÌŽ°r³CüL“'ѼUp¹yܳ§&\”EC8<úͧªÔ$2†ª•#Üÿä…_:\Mª7ýÎLS%|vÿE/€•Pä;,CØHñ>Çêtkĸ3²n.VYÔˆ!GÌNz›ÅMÄ6•ÛÀ¦·ê¦ý?Í*4;ûö¯Š$ä¢^Ò¤Wï¶Å4O„‹aª«jCw}L®¢f¹|V¨ý5_6Ìç YŒö0úŽ«rh Fº äH@qs\2“ RÕ¨/J‚]cä qÑ1»]œ/“ýýs†lI{­C&Ö‚i‚.ýÓ<«I€"«º0^ âŒ<ŸÔL<²ÉDLœõ©ùhÈn£sFVå ´¯ÝÔ A4©3_j¼_%´£GeQ#Äõ©Ýh4Èê¦øFJK³FPÍ(ÖëæÿSIžG§ü2q¶AžLHŠÅ$IyðЈ(¾l,ª0^OסôY¦hÓîê—k6m•ª^üÂËR‡Ä: eD¼ ¶f!8øD³k›ë¯gJ¡îe}þïtIV¸ý"§M{–*ß^&µ—9Ë`Ì ôC2ÈB³n íDL7ñ[ʇR-ºL˜#Ô#aòOZzñÓt{ÝóÌ$–stÔz¡Ñ¿šŠ³Ë‡³Ñ|¨„*êv0YY([Œºr5Æñ0õzå9Ñㆂiö&¡…ZD+YũœõÚÂÿœ¼£õcûò½{"+6Û^ER †‘¨OZîög\ðVLó÷ 11*VÊD³ÆmWÕšç?&ÀN(ç¬!)†Þ;'¶èƒo/}Å+{[›Aú|Ì`Ïà1 >µ•°^ˆIYÎiÞ“^”*€ØêŠÑèm ŽC¾L­2s^sìuôMÔhuü@Ø<ðs>ó’ƒ´:Ý ®û?cð»ÙŸÖ õ®%¤‡Èâ–ÁèöçDô1Ã&U·Ú™ÊD,I!°Ç½¡³ìµ!‡Ê(•ßÙØm’{ìäÉÍÕ´:-F:Lj83ñúgˆÁ0÷{%#…TËø ùêWýÐ'>‚—þ–¶Ðng OØBX“'lÈ|¶»… ¦]KܶǞOÜ6ºþº>ôIxŒÔ"Öj!ò7¤>©NQï£g6”x™LñÑ_Èï™õãêGRð¸-]==%;¢çB?]ŒA­ºbZ󅨾`Ä8"Rƒó3f Ö v1*vJÉž,LœÑ<Äì˜æ$ª@0ÆÏ…´={>³ i3G-¿"C¼=Á‘uZ†+ûkȦì¬0£]iÂü^ù~i;ÿ÷O|;Û*[ƒfÔj n5Ü‘FGl($‡Éˆ* 5BÚ(™M™iÉ„Ðì—Ðdæœs\Ï!F”ì`DØ)uÃŽªÁÓ›DÁQ±¥ ªð¨&®"xTÇqcV!hÌuø` ƒú:yøŒ>Ô*¤ÈóuÚiÿLóyú(=3GZÏaBð&vÞÞíq@%ú¸×¾ëªð¨&®"xT¿~*kÊ!jM¹J_þ¨~º·|‹N¡IÍI¦Ÿ°S;³N2Ót«äëLè&›ˆ2‚™,Ê·èP˜ Wé¦9Tâº×˜á©i_v4|ÂÍÅÅ• ä(²÷£Ù†FÄm¸ŽW‘ìòyÝ#ŒÈ–ÒÜ.2f¯‹‹Q6ÿûaÑ›º+‡ÄÙ”0í‚evˆìm™‹^°^|ȲŠ6ðµ6óÙ}úHÒé»|yf 2éwCȶÙN[UZG½?žÜB=| „ŠoÈ2PÓlfQZ_)*õÍ;]¬!¸Ë¿Ú-6î>j0mÖχrèxâ¡Þ'ý~£“äÌô?uC˜»y«ì;" (7×(1æ–=”¨™)£œfŸ…³Ë ); ôµ›©ÂÚ¸Á飚¸=)]ÍY¢Dµ9¥]ÍÇ©Uèçõü5GÜÖÒ ÚXg¶[e!òHñßçÌýÄ™Ü FÊœ>uÿná»4 ?]Q«TÆÚ$!F·õ1†‡¤¾“«=» ¾»Ý쯼!ã ß:¥¬æHêr<¤1 õ¶³LH÷áCZÃB÷œlxfžRÿykõ'Õ„ Á¶ªUžÏ×gšyªU]'ée¯eúl:‚ÝyésJß_½†¥c,d+Ú¹F&kë…ÓË ‡$Æ¡‰:T‰ÌsNç¬ üš]TÎ>¦È )Ú5˜ƒAGÄŠ‘A÷ÎÍÝkWþÝg™ÂRæ¤ßâ‡é—nòÿºæq9õXUTw»9˜j²ä×òE¢V\[¤•åDbšÄü\N¨ËŸëªo§·{òÛÖ™¦·y©˜„r:­³iÑ+™L÷ìh^ì›e{-‡]9F8Œ#ŠÀk¦+F×Z£Á°þ€Ã(0ÂaS öz¿pª{V¥}eÑu§÷­]Ù5Wi̼‡\QX‡¡‰q(ñ#F¯Ùé½¥DxdƒCbJÈ¡#Þ¯¸áý8´û’Ø‘RÝ(ä2f­b ×ÎÏ(tÇ}L¡¶6&¥ŽQ'a· ß¹ödHBÑÝað‰: YÚ Ýe Qq'3—HG¨ð¹¨Bh÷i‹êÔ&q§ÿŸ‘˜^÷”ÄD,ÍI ݦD &[W¿]ø$Ö»5’‘ð¤ó˜uÛmô&‰÷ËQŽ‹¡¿Ðï´*u¼}Ö=Ä8âÝçZ²áym\<ƒGµ1ß±GãsÒç Ì:„í>®ÉÔà n“ôZÓFFƒh›0þÚщæúÂKxBˆ®÷4»s@l„;ü²Oÿ0"N“™±uˆát1 Ÿ}2È'p‹F³+üײ¥îóœ}ƒg¦…{"Ldo”÷DéÛ&•ú‡¹Ÿ;‘ˆa$¢‚¬6{ă †‘‹|ÔÎæÄ}ÜÊö[àpOšàÒÿ &c – 0‹QH`µ–“¬CþÁl$L–mPÌñ}E]i1»Ãס6ª;ILpé‘èʸDiÏÌi—§›_W(D;œÓÚÓáó-*„Ï¿A…FÎs›^1™w÷Ìsÿlú®Í;Ϥ˅k'GXÊzÂályÆal ‘1ÞWÖ7DŒ`²ö[…oÀ‘gÙ0ç躂ë$[ˆ±”òÊÓ4´C 6žÇCE€g ¶o îƒ|ø^¹Ÿ–½rvm2cî°ûŠ}'šý½FòKЧž‡[4žÁ]6»gpûU¥ç^!WÅäŽ~VF.{yD/¦˜gÑ2h©[+‹¾L0€0öéÆÅ0 âb*8nxØÏ"¯,q±s‡‡ü´9áUÞ}j1_¾ÖO¯±“iIl!G§<+±|­¹ð¸2!ùÈPeH«`¼Y‚¦»Mêú*•i‹àÓKî‡õ+fDP—ök”<8–ûT¾o¶3þ¼GËÑ•ã¬}Ä”ÒA¬ï¬|tDOo›.³‘òr£Fòé¸P&/-Ëý2@RÑ=¾ê9m»ú¨¿¾\êƒuÙìôZêò¥¨ËJAЧìr*ôÙQðÝäŠb{« á³ËÉAcµs²ëÆ v¥qûÀñu„‚á—#¦óL“7œ>'†ÙÖuN- ´E$Ú5zmn· GiÙ~ry¶…æÐ°‘Ï·@®.¡SÃxµ*FòG`T=ƒPîÁÓé<˜D 3“òÁr‘<+ŽNy^A~ÞŽQ{0`.ŽX~ð¹×iª>£±l îFpt#b€i<¨GàA=üéÙóÚ4K’u¡‚ÇÊ£ÀÊ£`Û$`°±<ë·ºdO‘G>!E0Œ“. £Kº$Œ\Z7B7¾…%.Ô‘ßI¨Æ.[ÚÈi ?H%!-KB(:oSñÀ€-}ÜDe^F{LlãlYEÓžKõ ÔH ™÷ù°´MÉœñã uÖ²8€WO$$PdŽJ%ðԌϣ%¹ËŸb‘› ä{î¶\TŒNø¼/L9FÕGÅxöv?}`“˜[ÍuOwÇëQ‚r ˜À#ü²x2YµÑà}Î ÷©P-œoA!ú¡úU•¢[-Wˆ§ÃÀëc2ŸáËúíàsrEò”‹æíòA¤ªõ]J믋Óñ¥?Ÿ¥ (ŠÌÇÖÏr¼4LÄ"µéùxMÇ'¨è¹Šô²­È#Ž¡z4†o³¹³V·èÒ‹®>Œ‡[¤&fóiª¥}üeR£aŽÎz!»]ÈÑÌ\á:dZ?¹êJ-!yF”Ë®’S](–È LMÑ…)àÙÓ$m"ÈQ½auÍ”‹˜¶-ñA¢ªYgô´ðæR~\k _(-Ã|ìcHZ†´ð˜†¶Çe“1%JÕpâÚ›eèÎÇ’¢G%[vìûr—l>ó­y¿­´XX x>¦Z1†TÛÒc{¹ÏÑîöuÅ=¶š–ŒV!_*,_ªÝ '†X­òÁæ#ÞÄÿÑÛL£zhxiOrßyïb!ª¥Ây79iF°Y!hé1ë ùÿM° [ßÉåA ävyE§)dŠ…¥¨Ïû.äF·êɤ²°wôîŽ&Î[mÊÉ'äl—£—@W3À#h™õ$_Ûë¥ãVÆi‹–xyôî0T"©–*Rªw‹¸Ðm<'âkñ‹!°þŒ?íQÜ_»'1HB.Z”„\t>§’$†õSI4DÙ.DƒÐn6›Ì´Ñà³Q{$â¬4úÄyi°âq?k²£ÛvNqî ”LÝüyr|Ö®§«§z •€0„J@¢ô+«¤ 2e ]x⻇›½LHÞqQLˆ-*:Åà Â*a•{’ÁÒP½ðÈ„j2_âQ‰±°½âQ©.é°&E0t#8;NkèÀƒz8:¶£ÇcvµŒš'œW"X“ƒT°"'h}ƒŒxR÷@F2Ë3'ô·(Tàd¦—çU„X²&ˆŠ¤7J81¨½V!:HgÚ›t·Ù!™—@[D VDÝ|ÏYÚ¦øª›]0x2I‹TL·y÷ënÂ"H`v-¬LÙoI\“ÏëXýjœþÍÿt†”%«ÝÔ*€×®xEfKÐòÞ‰Š SÅ”ÐøÜÃz$7“PVYNn à …­ž›á¾sI³®Õ÷þ\i6)¨Ê’XC 21/åV„c1ô)-H¡$Æùe÷±lÃ<6ú„RjÊ@"”ø#‚T]MuOœVÖ†ÊIÉ\1å²bdµîÃgMÄ–§µ<_>æ—¥¬&ðÚY)•¢Tìj(âFŸê¤zj$éßÍ*´ yZ¸2i*e¶JJ±%iM|Ÿ]wò€Š/÷]…³ú gæÂjQ¥6XÁ^eÌÛrš!©‰³1Ô yÝ>ëõsÙæBèw,‰ Çp…ß°ÿ°êêˆ"=ZH=úÍgèÑo>óýæ3ôè7ŸÇl®¼øËк‹ÈÊ#Âã0EÜ_M¤~ - § gûµ¨ì`ïúÏûát4„íÔ¶ÏK“r2þƒÅdgN ¯­‰¤@dÈi½^ÇaüÄþUΈ.ÀýÊ;*ßÁÿ•ʤúGDñu³^…¿¶m“Ü?¦k'mø?ó1Û¥s–t[ÍÿcºÊB“Ákl˜¶Í<) ?&å…BÙ=Ç<}³(jý¸+ýP6åe°…–iyÏ}~1@¨Nµwv ß3¬nè~ÙÛ5Lψ(ú»†ê&f£èqs[¡ 9Ý/¨ãÊïbß÷S|wÞèoÀß½ú|óFÃô]U¬ÄéßÿuSNÇVèúø:Ô[ H~Å,÷0n)Þ>0û_ ÿ-a‚¥zÀ„ب&°ÕëbBÍQ2&\Þf­Þ´×ß>³ùîº\î‚ýâ’^ÿöKÕNÃÆ¿G1›T‹ý·yyòÿòoVÂi^Û`ßõÙ\lü¿Á*h Tˆ7À!ÄV*¿ÒЙ²†.È”5tA¦¬ª ^ä˜ÑíE~ÛëEN¼²Y­½G3 Ê…H5HU×¾LMA¨·mlît@˜m×.Yƒ°äE‘nQAáÒƒ p‚#XÁ_D¸¹+A¤V$E(”UL$§“ì,ƒ¿œ^Í­¤'Æ2;Ia­¬ÔÝÔ¢‰Ëgõ²v|IlrŽŒ KŠÑ(/:Ù~ÆóI…WrkFe‚¢¸ß²"ÔÆºJ¥z|Ù@!&»¸‰»á¾·°…µ²ø™ÀËÄuiJ€)Ö& –¯×™LøËmDµ«&5ŒÅ ” b\]£3Ô³ ¦­ã*SAKfž­bYxNÀön˳âÉžx/»¿³^UÞR?xQ9¨€š’¤ >—_O…æ3Òèg¥‘ˆ³Õ¿ïñU§û~ׄ|µLŠ%q®(M&°Ì%—¬ ¢"ÉÕìXý™3òö·±—D½Wܶl½E`ËJîU[6›"MŸ»m?õMX),•ÍzÓÇ¥qœËâËžÄs/£KZ O.d¨.\BÕ»~réÕ‰²s} $P™Õ>†¹Ü÷ú€€X6 €“‡ 0™w$û:Ù¡VŸ¬ûpGÑÎõ•¦ì,ÉA$¨‚€/sÂnÙª°…1X@iwõ—ß´„4Òd»û¹&‚K–çi¦Gálœìe—¨{€v`ÈÑångv£† ¾QncòŽÝSWE(ŒÁbØœæ }%ã¹À™¹O@…rm:¨Ððg¥YÈ®Ñx{íâ"º‡×ù–99‘~Ù½&£XŸâƒÁšVJ@GþH Q¯ˆöo›¬…½|hÔ˜ác ¾áí–ƒ%‹•='C™Øïdí” Ñ„ºûŠÄköþX|â©!övàÈÐíœ ™ib2×PÈfÔKàX" 2”‹¼<-6ðw$G€…ØÙ’éLÑLd Æob·ßþ ^¼+Ì2Çâ²Él¿Ft˜ÆµÀÉ£0^>è § T{§‰¤@ #-pSDZÎ'.ÜìÔ¥öÛl‚ùË|¶Øi%ÁªXAíÔËU¯M¬Ïöuȳâ(Ëosù$kˆq¾Û£/ŒûìPÕÌ%D"©XHÍÌέ*Ò·µ±pQ=Â6P~ƹzzÙ‹èñ1dì(·æšd8‹¢-;› g…BdÃ1ª‚ Q +Ôc&qqžÌEââTBÙº‹ÁAD.¦t#8 #4\lué ±æbF²e£©:,M•Óà\,M/Pw1â†%c½zŽ!–l:74úb"ŽNyþá€oÑsÕ‡Ú‹ŽäöšK‹B(J5ž¶‘lã–ŽdK¢`d¢•ö<[mr©æ^‚ˆ<†Š`Õ[‘$rM/áÑHÊ\€õµRÞ,ÖþA©B—Ä;—ïü©–gðäݼ¼õø ¥ªÛrQ1Š7[$VªslJCªåŒ<˜.·úè–ÀW=+—#¾©Ê,¤Î¹DR-Ï`è‘­O™¾Ý"·z(LWT÷X@P"@œSã õöR‰1RÔ?á¥Rÿì*Èm8Ö³é£<Ÿùíë¿Q9矫Îc+®¤ «Hms·_xÿ¸‡‚; ´™»Ùea¹of–úª A$e…¬Âu‰eÁ ©T¶, ™ì7|dïiJwÞûn@Ãö¡’TK‰TèmmFß—Ð![…“í1ï!}z¥éGN&W†{PyYôeûô”c$‹„ À@¾ÁÐtY]¥I4rrZø—¦ÀÈ£ ˜ß§±M¿,yM`‘*EtHqzÜ7xÞªEðiU3*’<.RÎf³ kÓ€nAÌïÃä¥r+Ëbë ò¶!)]Èo0~Ò%¦Ùßkî]&†wîšÙšJ£O|!í`ì2ÛÇÅH>7×8à 0Â!޽µ‚Ýß2ÛìÀ±ò4ù…MO¶JE+’HDïÝn›S¨6qq',BA«8=]ß;}÷Gö×|™½{ZÈ¡±‡p¬ÊA »ûbØÁ "g_“0ú&«•ÚÑ×ÇÒÃܰ}·ó|ÙìÖgHűÇCiN 21Ærž•n°ù £e´‘KÉ臤ˆmîrnÉÑPJ~VO™æ“F®›—JÜimˆ5êEHkrw+OƆÝʼQA/.±Å(à’?ÀQôüêfª>ú±a™Ž*FFØŒƒ"2ÅÍh§\žG§¼]‚1§€™ÞMÁ ²‡g™huñì±[mÁ]rÒ«öÄéä:ö´™* GíYüF¦Ëì€wëÝÛhÖÄ#ÚT¶J¹`µÇÛìÖ>SH á!ø6w¿B˜ûl‰_DiûÙu4›Ù&µh{™¤-f;±êºï^HŽ@ ·à›ÎŒí‰É,Í MX&žÂFózF¡£y‰ñ nÅ…N6Ùæt6'“Èå/PkYƬÕ쨚]6‚øÚƒ0„JAHQjHáaê%Wfe9Q·än ¾¾MÛ/‹àöD{ø7j]Ü„N›¼µêsù:‘E‰-ŽÈ=™Ø‰£HD9ÍGÜâIÍÖ@Œ®Êho1\(ZÙÃjXŸ“ÏÇß –%N Ë÷€,\ïç›cõ‰—·÷ÊèêGÓ6À-‰2̾ûOóžôŒÏœµfYj>Q¶‘ 'äVW81ê‰O89´Rõ˜•²°ýÅ"ÍC+±ñ3/á.JLܺ®8Ýò I ›÷—•iÙ"=Šü¤eŒZ\gÄ€âžòðÙ²“ ßO>ÑAº½h'CÝð  \»©Pt3üØ™æŽ&®‚ÊgZÔHb'ïùuЫé3—2w£j²hÔÂwºxF_±Ä‡€Ò€ôB÷îv>an£ˆaŒ Û;;sÓÏŸÔ&™¹lÜ¥¤v/SÏ}²tÖ"à Ü`›¯wõ QD~S Ë ú±mzFD†èhÝ(bÓúÉt/Cq‰ƒ÷¯5=ÙòE‰½5à˜!6ºÆŒGÛ \ÿB­ƒ™Ñ×`¡Ÿ2Ìúµg/q;Q˜6sÀ©I†ÙWùÓêd6+QÖ¿`Ý.ö§DÏ™vƒoå[!3¤FGoÝ_вv‘g§ï^0=£Œ¦'$3 &æŠ7aØ/Þ:8À<Àˆ3­ÿ#ŠF&ŒÓ›)Pþ˜ãÉÕ¸Ø"^×Ów°CP“6;ú÷ž_‡¾+fÃ4ÿŒe†ÿ“f¥ãðG¦&ó–óušÐÿÁZ÷‘òR¤„ ŒÃ„(˜X Œ;ÞÛ¹Éò_—7Ⱦ‡X×B=/f‡°&5vôŸ8~Ÿ ©ndz—V³&3gQiQ–ÈL~j³0ÓdgäƒÙ,cŒR  3¢dd•1êyûe?!Ð îðšÀªš_}äè©G‘}¦³n_¿É'~•kæºÝ²E–f7ó¯}î$HÌüï‡%íRa?E%z–}.B`o›}`½øz‹ßË”>¤V“¢Hï´%»0ÙBd¬ÉMÂâÌB¾xÆ9ʇÂĪȗ÷%畵Û‘¤Šæ°ÅJN QZÔ›º{ýFy|OC2 s›;N’ Ê¿À™©Lx.اqògî¢Ä–Tˆe3yÊzŸôÈvxEº’¾ÑbG_M ìè7žaDz¾ž?ç@{×ù\^b’Š+Œ ݬdÒ4ïaëJˆô—œ s?1d&׉Cð;®?¦MZPˆ±ª$Ý= QÔº‘ô¶É:tz“y<Þ¾?Èg¿kuë>{Evb¦Të”ñ‡ˆ€Oiðù4à;ÚdÃ7ÊØQ©ìdÏϵÉÐö\ÈÉY´]MQz–Éd¼–é³éˆDç¥$|¿¯QzÑkýèe•=ä˜3wÎÍ…Ö9Ž1ó²±C1 Ht@¯™¦>=&S©kØ%1ÏÁôÃcZöÑ£ókQ¢~÷Y¦°V6íÇ9"kÓc8=€ÛÃlôuÍ!ÀÕr6d ºe®…êNTcLw"ƒªôm»vÙõòަ}£ùk5o3WV±áíBA›´§Ž"4܃j=uî6‹Ç·Õ. V"àòÅò÷ôNf(ÎêÔL“„Œ5g‡½¯„$ê”Ö_‡$ºåE•Cš1bÈ.| ’èÐ1C"Ü€€Fo0«\7Ðߪßî³™åÃ3ŽEKëGñއøÓž˜lá¹vOÙð¸6§C=¬Þ4TÅ£†¶sx®¥ý©Ogf†‘gÊ—ÖÌ£-ÐÌè”Esmü_Ç’*ÚQBwí#B¹u­#j­ëÆ>[6 <“¨¼lÅÜQ?wtíœüyxµ#2|ýµmÀ-üÉfDÒÆÓÒjaû‰j K$öL3 <©Àüy¯ˆadÂ"ë÷l‹,@Œ!Ÿœ·M¨÷îì4KâûágF‰'f|éÿR` – PÕÚ-V!Ý©jŒÁêIHÛ\6ð×¾–»,ý\²’ÑÜJÆl÷ùí6QR/ÁìŽÊ¯Dp‹Æ3¸M càÜÓ»ƒ ŸohË(Ü ñø¹=ë§œ3Ì£d'I0^Ÿe¥°—9({øå!\ƒ Ç¥úY2í1 ƒ¸†€?í‚ÖMèí¸{Ñb¾^¬Þ{×£opvWäYq”åB•A¨­n:䟪–ø6Е N?T$&VEÀÉüЯ˜Á“ °åAátX§ÚQz«8ã;Y9Zç§â)' ±¾J9'ÑKjºÌ^²Ë½´ƒ-¤•2Z”{d€¤Rô$°[ä8wõ]v}¹xÎëî‚ÛjK®Z)êʼn/ Š ÑT/ýVN±ÁÕ×(jªŠ¦:»°å‚ëÆC¤(jë¹P®¬^ÔYÎ46õé£z›m6ç”EºfDÊèÐX”€TcÕIõëœ .í?ºéPßvsè» WCQN ™«ê‰8FÕGb rÃo"ø•¨‹u=3¼ƒe^ò¬8"ùy;†ìÁˆý™82ù#^ëÛ¹ˆÔ|Àmb#9#EpÆÏ2«ÐR"² DÛÛh­¬îyÌé<š6^sle ÀÊC0®.j@M…Ø$tž'~Þ…Ÿ9Ú¡ _†¤KÂJk÷¹ñ ,IZº(ý vQí!Ò´×Ǿ_óþíÚ­H¢ :og+Æ ’ ¢ßâv¥¨ÞzÚóÁ•@[ÄïœÛçoÀR‘@´3ktÔ Î%sˆCÍ›‘  )‘û#“@“£)ð| ±o¿)~m6@â¹Û¯‚bäåó¾Èñví¨CýóõóŒÑûGbê«ÚêknW^@TóyÀ`ž-é=ú LížñIÜ'"5—?ß´ÕÒ¤P¿¸R´±ÕÂo°Cs7Ùà sákèíÓS3ùÈKT_™·³•” .\¶G6ÚV_†¦ãKÑ;[fsz] ãýM†P:ê…Úžy¼¦ãã5¿œ]µ¦óÂq”j"I ×d6ëëJ”Ùkà.šk®ôjz2ÖK¶?ëÍ"PjA~éeR‡aŽîšdß"iM\R½Ôæ:òZJ]µB£wù »>´™ëÔ(–°+¡¥FT7ˆïÏmÓZR­(Å%\õlʨrIVCŒ½s"r“R@‡¿.Ns» ó±!iÒÂcz| n¦kdÊÕ«üª”¡V8‹Œ=*}hå5ª­ËÁšñ›ˆºk¹¸U:“=8‚ŽJ‘[¼¡@ð´Î*ÁíRÒ[+D¹TWXFŒ.µª²›ÌþƒèßQõ>4¬gÚTn›¤ÕRR8ïG± lµð˜õÉéM 3?¢ÿ/¤Z“Íþsì.€—.E½˜)÷=+†])UÉ®&³Pko5Ÿ×*vÂêÙpåh Ør]’$ ­r„Êè”`VÒÇ­\â%6“H)‚H*RJ¡GcQ)_Uó ÝãH‰ú»è´GÜþ«ŠhEÑùœ:H1¬ŸJ‚вMN£÷m&|ߴѨ}·“Ñ'ÎKƒ»C“EúcPçïðh&¼ùÍËG·ì«z6¶P C¨Å<Â= RXU†P)5™]Éó>:—¼¥áؼZ˜÷h'*A†2¯û¢.È”5taå~ív»R4& ¡Æ¶$ÖØ´¹0cô…mèFpD4 è³ êàq´C2sv‹ÂcMn^v^2Áªˆ Œ0bD5‘32ds:t‹¢/Mffr^Aˆ%SA3y‡$òÚcAth§/¼+]QØ| ÜÍ%ÒÙYS©ˆºž³´MñÛmÔ.‘Z­_&jμûµU&/‚_·èÃEEHËRsÕË'?òCå(çE²º&FÊ®c¤D¶úàP©()ñõ΋PF•K;a?©³m$üÇFVò(I¸Õ&‘ šW Vtõ}3ĵ˜×”°$™XRÃD Jy)äbI#N.BÛôŽç4Ñ®@¨.Z×A&ÈÕ1•<­¨ î•’¹rY1²ìÃÏѺv©<­ÆéÎæOöSÞlz­¥á‹¥îûÔ:)ERœT@ uÜ+@<'÷(-B¥ÌY»Ë”ªóE©µï¡j'PßájWy亂#}Þζƒä ÆEj F8K¶Q»Dl°× …æ½hû¬‡Fv%¾úIQ$gI4KÀå¿­†ÃLÎJRrJDœc”¨™)¦„¸æ! :3.@ÅÌcs²É/C.")hŽÃÑ¿š -€ú :fÝ×¢ÒC¼™Ÿóq0WA…í¤n}ÛLª+ù³Ø<ÂÑÅéÚÌܹ²Ìûë8Œô_¸ª®Q‰û Ê*ýÊÿ½_î+_A¿n6ãûð×¶Ða_…¤dºv•Tñ6c&i[ÍÜ:ú1iþB™:°G0m›yÅ?&U·R™Iªô;(/+FýPI~( ŠešàžqÜM{\Ò¦tŒ­ÿókûºûÐB¡ËÍëuêÞÄ4ãý&-6ðDûn_›ðÝ®;tûõuèŒów·Ò?Èßó}‹o5ðýÐ9Õ§ìÍü…ûáþ&8þu¨eúŠû…좀Æ~W5×ûݸ‚:”(ºèФhÒ¡Q[¤Î+ÿÆH[d¿ÑÕËå^ æ`ÿôóoþݽpÜÒ¡Õe_hæ5&ù—õ¥/Iÿ* Ìæõðôß( \Õ_‘Xœ¦Ž+(Bر©^Ĉ^µÅQ_—Zö zÕ²ZÑ«–½‚^µ¬VŒ5m¢ rµ³Zs5J{_Fázãò_@v…¹À[6™I‘ù‚i#%=îØÔ• Ë.i;ÁúöW§zù"tÀ®âEˆD‹îŽdfÃí2ð…WßU0—yëÕ:†KN’öG4Êeň˯°^®„­’ý<ä>È®ù3·"!@Iâ*ƒó"H`… ~Ù³ìÊ–{8mˆÇ" t\Å2Ô ëe®žH+EÖ+·¬±„ru10rW‹(@7…osÅ,®vÏX8á7ÛÀ5&Ë®©Ä;ÐfÄÑ)Ï‹C,W4@¦-‚Üeís-vëZfÞµ è¤uv‰¤Ñ'žIÛ¸–€¨¬@ä$uy1™Ø¾_uR’ïÕ§»Ùž¤¿D’5Aˆ%Áëô(– ÂxÃÆ§Ò\ë—·¬Y„˜žê°?aÇm²¦ù·îº¨ú›Í£ÏÆÜ5[Lü$tI—„Ñ% ŸvÛj…Â2øÂÉœÒ0N iý4…¼vCçaó8«©s'€“G/€•×!äϵeC]BH2­ éG>6ì2¿²tr ÉìyøDÄ,,Aa – 0s^°ç³¥‚59Hcï¦a]rîsóa]F˃ÛýФ… éŽ«q´ÍB ÏUXE/±dYÐÅ™b½oc£Ò:øo « qÓtöÌ*„¨äú£BZCŽŠº—õ Æ`1 c0‹r Ó²I4Õ¨âq¸Üøv˜3ÎÚ¼#‡øÇùÀØË‡F… _äÿN[*Ø™œÇz(fuãnk0Õ»"ìn]âƒÕ>„6Inäj’!‰É;F†%Ý>B¶žU2ïø€Ä8t‰ŽŠB 4ií-™vªË+¦{wÝdhMü("Ðx<%°[ߨüi‘%~ˆÐµq#toq9#¶¨™×(ˆ¹óMIF Fn\íåÑ `åÑ ò[8&æÜ ™,^®º.ŸÖfÓ_Q"ï!™‰'Ù¾1Œå%}6G§/«K¡%v®ír3Ëþš/{õ yJvï-Œ€2 F@èÜd¥r –ä¶yh¦Gšcž75T‡zÑéƒ]ªœ/›«ú ÉP‚§bú! ýŠ8/‘-aJS“‚L¬q[@Ò«™î6Ð[Vá{Ü¢åGƒ~Rñ]eŒ€2 z@‘‰¤‚U9Tå+ÔÚÅ,´Ü·ÈFC¯ª,+ c ?(²Ä­pM °Çâ ˜6ó88|Xܦ.yNò¬8&œ4Í ×žVýíi\ý‚ÐFÂlRsLj%½oîÊöðJágp\{¾½ Ý€nDxüQÝ6¯í.÷»|'ÛES›$)5h{™Œ@öhˆ¾{PÜåxNq+Sl:Gc/„A #Ì”ÈÝÐøJnhõò sÿçpò¯KÜ¡&m¿]ÍÖÉÙåá¸ÝÝMƒ¯oAƒÏ7 1§°Sšmj»‚‚0„JAè@-C¨üî}, ¸†&!óM$ÌÉcÔ³êòw×Dƒ4ÿÛòˆ sv;p!2l ΰm¬Ñ¶Ûî?„¤¹:ç·ï,Ÿ9ï,!½€ÞÙ;Çöé#Œoïõ˜dÙÈü™6N7'bÒ1NT •rBXùm«Y…Ç îÿ„Á|T¬2O?æ½leÜN{™gbÒzûM±Ðt1#’cŒ(Ùň’‘]Œ(·¬Ü&/“Î!;-}­Üú¦u‡Ò3Ô=Ìà©3‹?¯Ä²Åuƒ!²Ø´™ =Õ/‘aÄ—4Lè˜x¶‚eß!yÏœuà„(˜B0ÐϤ´{>h±Ó'µ9ëL™¿¯3ƒ£–1›!5ºÊ ©ÑUfêe$cg?Ê•î CÓƒi؉þÝwñƒs#Ïï5d&²ÎÝHZ/nFiÂÂ%So³wî£DßÅŽ};ºçØÑm<ÇP`Ètä eDÑ=Œ9uYŸnṁ¨þBÖ>>‡Ndj2Ó;_§]:˜iBE»®?‡pôì(Ów°£ßx†½Æ³ì°Ñ¤æoBdö¢ê)!¤­ö] ­Xú¯÷®Ë-:Ë"µ‘ŸÎ{|‡-š}šsêŤ6[Ää(°—Èy³ÑawÙltØ] _f÷ý¬Û1#(å0#JFv1¢]íõ›Žö‹ìæyÝ£‘`_ma 1qÛô@Ê8Lˆ‚‰}„àMì$Dn¢jåÿÎXÖîEP4?æ„E}#ôú|þnð“=dóÐÐ&É«Sg3SRR•üpÖ¹ÉÉVžâÖ©!2¸E ‰ÁM{Ñ0X?gš|; Æ‡‡æ|xÔ@®âé¾ûI<í ~÷ÓI²Oú±3÷›w÷¼´/<|/mø;Jô]ìè5žeG¯ñ,;jÆ/³bÔ(ÑOýj&¯ë£oM¦£øˆõ¯7ý\ŸõišdªÇ­ Ì{Øü•E仂Ó’·”Q"Ôº’zE¼<©ˆ¯žTd!‡¾2æ~b0ÌýÄ™Ü F·/ÖîV{oˆZÏÑ£ÔÝm¾å]#ž.®SFOûÜdƒ<‚0ZÂÓŒ—ó¡`¡á›gêÕ] ^ß‚ŸoAC€ÎÙ†S=^Œz-ÓgÓÿ¦ý ¹Ï»ÃÏê©êó*>鯹ÏÖh’·ÎqÌ5{æúø|iý´`°ýx·#÷6\‡‡g ‰q(AbJ·s÷Á—ëüZÔÂÇïÔí°z÷†/?ãRÓgÝÇëšCˆÉåÔÃZ3Ê­ };|®Ê@"ÔÁr޹Uí²Ô÷×ÛÅè´-6í]/ºVóò™Íñ*•çÙ4ù•LF0Ý“±y±¯ íµB`„Ã(0Âaá0 ŒpF8Xàùݾ¬&'Ý;[ìšv’Cazo‘€ Þs‘Ñ;¢¡ö’n­g J‡$Æ¡‰q(Ab¨AÅ›:ò¡ÜbÓúæ›LJÍ¿ SWez…@öÆÖPÁ…D‡z@1]$šØ0E°å ÅäO <¡ð;èQ˜WŠ'ñNh¿! CL¯};»ÐÓ™‰ðCÉ“†Ï7aÐMEñ$ÿ.I¶Ytt Õ‡ìâ÷ÐÑ›4Þ/ÿ)›jž4?â vã ñއxÇC¼ã!ÞÀ!Æ×/w »>Âuy2£¨|X|Æ!üiÍÐŒGh·ƒîÚñíÀx„ÞÂjzëÖ|Av½Áv¦7ÌWrF:Iãs&ùØŠ•àgp’,æ<}HÁ-Ïà~8Ó'0ðò˜²‘Ò.a¿—®ñðú¤Ù&•z)ª†‘ˆa$bIF †‘´¹1Ô‘}•[ɘõ̳C\zk’Žú~ЧvãÃCÇS3Ë{J°ù¹ï8]ã(4GÕžý¶sÌÓ;ë:íóÁ'sÛüˆõÌsP˜•µÁ¡£Ý>æð÷ÿàrœCý¤ÕW¶o*Z [Bܲ3O¦AkÅ3ØñíC5Ê ð˜Aïí}Ì ð˜a6í1œC3´{‡ —~›}gÉòAŸŒB8Mý1 ·h<ƒ[4žÁýäÜ¢Ñ/½Q FûÝe¹“Dg¯Ï²Ò9íËD=ð£¥)Ä€ 0 âbq ƒ¸ö×wË“sífµ½tÕ9·×²šã7‡{gñvSyVò¬8:å9q ™Ÿˆ£,ß±|ƒáÖùl&}Jô ¯"ÓÁç9 dª"èýXÇ>¼À;r:¬ÆS혿UœñwŸ-Q9žÄ T!h» Ýüé2;>/7® ¶peâ"ŒÁ’"Ô`Ï¿÷&þØÕƒõå2N¬» Co´a½jŲR<»Rô€‹NBß(Á,.®Qìôiõ·ó¹%]×Ñ à®#.|À¤Ãd½Ì¶œiÚŒÓ'%1»îN`m‘ç$±ó0°D9Û.!×B|ð&&±™uÞy6 F B¹ºzÕrb¯q/¿ïQæ X]3“k$X–eºHÄÑ)Ï‹£SžG¿ùŒ8„òõ‡Ä ’æ– ½a»:1²†àèF0t#8TƒÑh#ž|Ló¬‰iÞÝ騕-+^+^+±*$ò(úÞ±(µËžhduI—„Ñ%]ÆsCìsaÔ'éú\ „\ð Ó<~à°¥Ý#•„\´,‰qýDÃú©$‚è“DÅÎÛWú  )9¦=éFh‹$ðoJRõd=ôJßû>{ÆdY¦f¤m<§8·l¼ÑKñ$ŰuÖá⌠~n6¬ò¹ÛrQ1žÁw÷´}·Åxºj¤ÓqéÇÞ«ëP3èÓ=êåxJ°ÙØÏ|êÂTàI\òZVÙ|>'÷S-œo¾ÕRY!Æ¡¡I铬Stüx©Å5[ö_ÿoŸSµ# ¬# U²-ÝgXù™úp9_šå:ã+#Ð9ÞCßÀsÛ§Eoè>^Óñ šüUð—;¯¢—‚­šF.Úîο:eà.v_C'˜o/ŒUȬ8zeà/w^Å _½cíP=7}Î4~º®£À^G^ ¸ùŠ1u˜ÚÚpP»>qŸC Ða ÐaêŒG-l—,UÌLõnbÔÊK0ÊJP.êhoˆë®Ã…êä,×Åú¥T(.Ã(0*-<¦ÁA&¼'6ÓŸ2åjTrÕË0 ŒÊ0 ¤e8ö‡ÃíeS#TÕ½rúéc‡™íR<Ç]nìK¡ÃÖÒ­:‚?Ä!úÛó´”ôÞ¥ÒBŒCI!Æ¡ÊvS >aKòŸ¨îöó\Âtß’æpVµTZˆq(iæô˜uäÂÿ;ÝÔužl:ɘc·‰(›¥x>ÒgÜØ—B/V˜Ì#¦E'·‘1ñÐjmråh HÊñ”@¯cµB]÷—2§œ"iõ¿ï.S”jA$Õ‚\aEE)ï3`Øã¸ÎzïÁ´‡á“þXð^›¢IÈE+’ÖO%1¢?íAØÓ›‰œ˜mX¿‹ßnQÜŒ- ß:%ã^T Â*a•‚0„JAè@M;3¤z-þt×gKB“N›‹JJÇ4$bÅ–&ªéC0t#8T#0R¸—»1» ѰE‘3';‡>¯0V.ÉA*X•Àæ\Ϫ¢Wâ§±Ÿ3™h[tq2sÍóÊ!–, bTy$ˆ1å²úБ@:ëÞ|ÄÀÍÆÐùo†DÕd‘HgqžLÆ)oÞýº\£c°¤c0Ò„»‰/ô:V/?øÇšð*݇ v¶ë`g‘U| F@Y F@™côûãp¸™ÄìÚÈZtKÏ)&ÓëRØ( ¹DÒhFtõ=?IJYå)cY¬!™XC ]:KR`Å8·ì>‚qØà}Ûi 5e jÊ@¨­.ƒ¢#N+k£¥dQ1å²b<ƒÓ›‘-O+yºX8“ý&OhP/–â Ø—BNj§†î-7½ïv&OФL^„1XR„:,­ˆï°zÓ€keþrçU S¤/‘Ùö¶$½ˆ‡øpä†÷á–#Š— k\B¸–wÎí³Q')]@[Dp‰ÇÄä¿Q*èbG¯Z–½›…ý^ã‹,Ï]ƒŠÄìÇæû‹ú9ðËñA‡)ëù,ºŸt‹:¯¤’¥½_ã?¡Û9þú6Ìc•þ¹6S£aä2ï¯ã°# ÷Cô70Ü•ïðÐá~4ÿF _7©iªÃŽÆâ ìßéÚ CREÔê?3ANÛjÖdò¨”©“‰Ùcˆ¦m3ÌøòKùi:}‹(býˆó?_*ýpDëq¥õF£S8ä{©µ=*b"=¹Öö(v ÊÐê`;…mñ=ô¦º›ÌÂÂ=^;ôîžÝüµÉ?Ó«î6^TêÛSmžÙÌ_'ÿ3½êï#kü8mÙ—þE„£ ùuJ£Â³ï¾Üþ¦øW|²„«t|èÀ˜×K‡zm…t:¯J‡î¶ tË¥ßBê fÞ<öBü†ª‘ŸÈÄÜ‚µÕe_æÍ¹$/TsKá}ƒüÛ70›;aIßù¡<. 2ˆ T‘“YfÄB i nr¢D+zÕ.’qWS-«½jÛ~ö1zÕrZ1Ø´‹d¨/ôñ¬“i˜9…èëÑt+\(ÈáERË&3çÛ2$-¸XYˆ…¯Š.¤%¼ '7_f-5©aSe5+ÿ€…ïoóŸÀÊHÑHOzJ!ÌUˆuó>W«9—ËÜÈt.SN‹¯RFר)l•ìJÜé6¬Ùml?GÆW^„'`W„JY“—ïqfÙbâ¸Ý£lB%&ã$¼)cp÷m©V(¦F,RhÉ8C‚^§”hÊ]"H6‰pÉl®kŠVyt€0ÊmYâãÚ³ õ¦G‡–ÿíÄ!’ ÎEqŽR¢W-«Uùà±æÑðÙD-Äo§Â%VÄi÷˜BI ‹Î¯–6õÕÔAn~ä$šSÂ$¿Ÿ:«Î’÷½úk¾Jêp’D²(hÖxžR˜½F|I72ɸî${ƒ‚ë—g#E ez ËñRþ'ªˆØ®5ÍDz×EmýØì PÕlÙ«Ò±ði·Ý+ìfBKH jj&sZÌ8%„º÷ý{z“ “Ë ©Î . @*®.*JQDJ‰ˆ³­µNÒ[‘É ŒË¢È/$ÈÇüïrÜî4â²ÑØóËìÏ©ÕaçÚ¢G‘¿‡íPrµ#ñnŒ}!'Á7sÙ¥i?¸3.Š¥}®™ ÚzjÐÔ#1ÂŠ× ƒŽ¼Ÿ7§4~¿¥Í®I²—“ñÄžYT ò5ªSQ7x  ,ðTxbGa £Ðex‰ÊlË[6 ŽqÆñîÝ?°¸ a´yçJù²ç|‘«þ¶E€õÐ{d9Ûààýõðÿ@±émM‚‘{Úŧ‰xN:úÛÈmÅ‘!lÐ’yw$žÛA¶ÔÛ±D'É»¡‰±*$dhØ‘´ö–L)Õ‰œ…îÌLdàLÌ*ø†®8—Pƒ@—Î’Jté,X ¤a%šq#tåmqY¨°Q†5ÊBâlà‘ˆéFÅ<€Õ‰ª¦&ôXy x!ׄ­túwÝBÓ\ŽØ¥Ý »âÜÌ ÝFMiÉñs%Ù•k‚R^äÄR‚`Å·Ùìr+ž(÷“Î]ÇG§¼fª[l1ϨÃѦ²´f(Jõ0‚RŠôrBèÖ»ÍY<£8¿Ò…ÝŒ?™e+"œ+É9Ým‘£ÀÞaˆË¢Ën]U¥î;f¢p#ú‚uh >²¢×½BŽç†Ø<Ÿ½†äma#ÔÛÉðºí&Pz*ô£ˆè /2Cznt4B4â%¶A,_ì{³‰¤2wã™ Fƒ& Dñoyd,êVêVmù2R2Bì5ç1jY! Õ#íÏxîÙùrCd…­fÍ‘,ìåMô”UMM`åz_‹= ®z‘HñÕiØ$ÑR’R1ms5Ý…áζ¼õÒÖhH1U‰ŠñMHå"uQwár+ÚþÛ cEYÈ|­ú+“œk¾Šª3Ò,÷—>ÿòé”D¹&`@Aì\;hð¥¡åh›[¢Há’xíRÁ¿ÝC胷Îù؉åRçFÊñyNž¶Ä2FÄn[ýЍM0t™ïÐ.Ñ„œ(ª²ç%#„Ty•½j­`eŸ¿T¯4+”‹hasEͼ„¾_’½»Œ2åuB¤æR=BÀû\í@8õü™f…:™\DñÓRˆz¢eQäï¡ÿ÷bË6‹ÆÚÜSWÝ;‹{Îa6äÃÉs釴}10¡ s‹åPì"G]j…‘ÃC+\Ûá×ÏýÙ]ðÍw”by¡"X%G$%7rxh…Á Ïdt{˜uûžØh„^•ÓfB–šCoÄj’¼bê“…½©Kž×¸¡ ò¼msDÒŒèy¬­æXã–öë5‰ŒJÍXüžÁ+ÛkÑ÷wYä ËúС°h!ž»äFC¨px,·ë›Îžíá+³„yØ0©©!ÛËd 3çt÷¬Pèõ×ÅöN Zy¥èÔÊÛ‰DÌ%VB¦s}o5´z7†™wÝ8…è™—Ík0¿Ôz¡±f5û g—ïæ®P‘1ÍF¾/$ Œ)h0ª<a•Z ™ÉUD™ùúƦ´}ö+šÇ‡Ã–>ö°ùÖã1ê™tù~;}Hfr}ôk” †Ìqm{§~åè‘_&üò3+ cÈÄ|Œ´ˆ·âìNDVzPÐ…FoRH\¡·½Î±]ú|ßÛ »ãüöéäÓDq"&µã ­Ó*¤ CV¡TÕ«ð˜á&@‘¡§^h6¡µêèššU{×Êf™g_Rßý¢W¨ìš NãÌ Œ[8%0ÈàmWÍnFÐ^1j3,›ÙßÏ7^#„½ª¶äŸõª1‹"’¶a¥— Õ5à +2Ú*«G¤<éSäT™`˜û‰Q2²‹ ÕúJ©ÐÛ 1šm"^A2™Ú¸»ƒ&fA”¥EØ$»[¶°äÜpäÛûê¦ -…Ì KÑçÔ¾E‘÷Ѓ&2·Ñþõduz%âuœÕå;òS¾Œm`oŸ•[̨ÐBöZ?®}Hžô·ô‘V²u73*vÊÉЮ´€ ¢†i1CÐ6í‰î…E³×`šiD–ù‰‘¶mÏ)v6¤vIé’eFÝÍ C½„LG#d¨Ø¹Š™Ñô€ÄLHÝY#ó¶YC‚©mc˜³0ƒK%*[íß7z¶ &S+ ±‘vÇ„ßè(dG‰¾È¾Ì9#$7íÅw\á.ÜdD¯ XFôº€óº]Ù»ŽnVKG îûA²ÖèóôD&·óuºê3͢魗W;Jô,û2ó„ØÛ6¼A6Ž ìm¢Ï,!zÀÕÝ æ®ßlÁQoö§ßGè’šÆOòæ=¾£°|ˆ§™|øî`G1ë¦rt“M”0¢e¬ÄV”Ø»È!±·Ï·£ŒèõKŽ^,kס¨êú¥ÛØòº‡×~ðSè%¦í!™þ^ÙÑ2Â5Ìsk׸YH*:fÖ_‡e¬r(·"Û»D碘o/a ^…»¼>_§ïý/8)™¼ãtBÚÙl³™69RLa‘Tßý«NìˆIoº'÷è+UÒÈ>j´lñA^÷ ž4§Æ3·Ú~‰‡ÃÊýò í0Âí=:IšK?”`f‰ÞBØ'< —: ÅŽ2=þÌ<%„× ÆCvˆ,®SbÄ %FœúCNˆ ^»zm©ç"}¤ú‡¾~~Ï_3}¢O…™-¬©fëU÷D¦u%u¾A™}2Õ^bÈ­¯è@·õ1¾…[Üøß–[Vñ÷¦öãY-P¸Õ±=9H”,»š­SJO«®¾¶JDœ#”&dðcšÉ|´šç´ždðF=¡Ág„f>_d—nØ"{^w<9)J~_{ž ô õk™>›ŽQ7íM×~Ü|VøÓ·íj ȼm£a‹=‹|m¾¿Ê “‚t<ñ ” Á(¯ÙΛŽ͹Í„ÆÈò]²=8Žøº*ðï>ËV2ï~ðE"CàRWÓEݼýuÍ!âr¶ðq¹”«, H„š2j[ÎÎ ¹÷³cÕ·Ô;^g›ö®~\«yÃÌöx¡ÊÇlšøJfÓ={›û2Û^Ë€‡Q`„Ã(0Âaá0 ŒpÏO÷{uó}~·¼³e°i'Áý§wˆÏjλ\!J 7<ßCÚ§õŒ¸]è¤a(AbJ‡z$Æ¡‰!èH¸®÷+iöÙ/äs:i÷%1ª0®¼HducdðI?Åd÷)?£ÐÓS¬§ß­ö€"äxB±¸Ô#ÛÜÕW²þBVuJ½e qp'3­à†'ÅÛ×ð?Hþ’ ìê"}ç{è5îÝ¢7L¼_þû27öù ÚñíR6`­æÒᆠ¼½TžG§<+ŽNyNCæ'â(Ëd7·Êg3y:è§-dÚ"ø| |=¦Ùæþ={Œÿ`8VÓ©öjßÜgüy¯QާºO Ì[(Ÿæ}mºÌ.ÊË‚ Y*eâ"ŒÁ8C†W:g»ýÖùaWô×—Ku°î& ¹µàª•¢^,+ŰOù:Î;6É}\ùž]šŽÚuôØëèŒd/"½A/‚-gš§á´#­û.4ÛØÎ©$Ò–øwHòàšîn»iŸeivšÚÂæuy—Ä ”«‹¡W-+†áZP1<ø³û” 40ûÌä©e™ˆ8:åyqtÊóâè7ŸG‡üƒï;—7!Í@zLð| Ý€nÀx5>QÌúBx{ Ô,kb›_Â¥z{÷XyôXyôyŒV!’G +èöØML ‰`X&Œ.é’0º¤KÂxnÈ©Âç‹¥|¹ÛCF¯'M?hŠ–%!­HbXÿÑП9ò×ñ•>C껫2Æ"m‰w$†.W6jñixõE<§ðÊ'v`™It; ÞK‡ Ì7­÷Ü+Åh”‹Šñ >צånAú4Óœbj5Á=ÝÝΕ£% *ÇS]Žª€Ô;àG=j×—Ï"ä¾ ª5‘óÍ¢Z*-Ä84"){ÄÀÿ.µ¢&³þúíßs’”`”• ÄE EÇŒPœŽ/ý©÷¤]¹FäxÿÿÛû–eÙQ]Ûþø‹±Úé~4g®ÿÿ§›æ)@€€Yûìs¢U3—¥1Û€AÞ…b÷ŸlzWóùZÎO(³q=ÊÅ«(+wT lSèX3Êv´…T®AªX½†ìâ|û¸0(åvè#â¡,%=ôCF:jVW’ÙI™W S\S‚P&Ô®2:ÚW¹d÷ÍÚR eRRá¹ 4:´”éPY¡Ï ânË0 \¢¨gƒ@/;þ°Œ¶ (Û‹rך×ÝNÅB)fÀ®Ï΀Oåv ÅÛWØ?ÔßÕ²eŒ°òR¡ãP"„ú¸@ù 6Éÿž½Qµí‡­„ä{Û½+BT¥R!Æ¡DèÂøŸ«Ž‘ÿgOØê.6y`L~<+ÒwE,”bì¥è/&A…½›Ý潄E¯¼<<‘‚HŽY;à˜$°kG¾²ÇK‡ÈŒó!mñBè·»0Jiµ” /°¢„NÛ%ë˜å—ØÔ¯Òê—#Šå»¼wVrÕŠ&†Ë§š.Ÿj‚We{ ,«LdÙE…ÏÆ[Òeõ‚6úÔÿÙÂ?~¢e…@]‰~ª_#ݨ„!T Â*a•‚ G-f¯RòvÛ¢$!*ºÄ‰•‚0„JAB¥ ¡RÆ"­Ôr¬ùpŠÄLPI(ÌE¹(˜Ñ(J„`èFpt#8Æ«A`q7·#_°QE7 ¿n™bURŪJÎõÐTŒÆ~ŠdÜÛ.ì²i,fNyÝEÍš"ÄšE þ+õ¡;]„R>ž²ƒ±tþÍjà7Hâ……‚ÄWý°1!W³2zšðlëÖ,+2¹c°HN–Väܽ>ÿMçgæŸÓ„á:t.DG"¹# D‚²(©ýlªƒ:†°R棙]\,kH0Oñq9ž)\•Õy÷=?ÄHZ÷”0ׂL­¡…®2KZ©€ÓbÝrø°±aÛ\ÊÉè@¢ÔÔ°´ºäfÇŽ ~¸¬k]Ä›”ìú‰1·bÌÁW{®7©ååâ¹,öSyDS¢.J1vñsbqR»güèÞrO€ò  "TdrÆ`‰ìxõVÓwÐâUô(¯¢¡Ì¹%°W;/bŸX§ Q9¢ï†‘Ùƒv}öñìgÔä0€Iù‹Ð)(ÃO¥í™¿0¶ÈèÝ„aä·íö×iV!ŒàÛ?õ¿Ýßärÿ>÷®·¿Žçúóo÷×ÁãFðŸóúDŠßèr?3½Óèý±%îýMÉâK Xý>:pæuÓ¡Z[)dÎkÐAæ¼:Úb»™·²q¹ïèBE—=/3в’W¨yƒnì¿bl¥·o`N_ñÏüé…²*3N0åh;¸ñ a(^ñú¨‹?|õd,uÞ\ŠÞby–Þb¹RÑ]l£:Ã>ÆpÓR)äÅ®ÏÊ|4­òG —oVEÞ²ÅÌïT<# ×"3D‚.Fw±5Ê ý 'BnîbZŠuó29D€¢{£#Twr¹`\A†TØOg§céeÞúg9Ç%ËŽz•^pŠ%Q¡/™9q/¯«O.a«d¿6º½{¸ÁËhñ”è{Ø!*øã¢˜˜dç&îÈ©,6"Ö@[¥]æàa XRÑ(ª¿^OÈr¾>%¢’äVˆÐeyä‹?›–eXö϶Ň¢WïL9æDÅyåÒj(Su̘à)ÑcB‰D'¸LÑÜ>gáf7Î=ëð*¢FUá‰D(¡CŸ:­‘c°ô˜%…ÈI4ÂfòÙþÝu ´¿Çsˆ} GÅ"‰èUŠÝÆAiÖÊÂ<ù d#½Gi-ÏÝò³?÷;×BE&cxDˆÕb»ö4ßæ·.ÏÖeóÎé#yßšáReáv™Ð¥ý(3Å¢¿\† ‘p±‰µSBøv,!ý“Ý]}ê“~ßGöÞPÑ[ë”èÄú×îö,NØàNÕDœ5ÊÅ l?òÒ7¥C…¶qÉÔOw˜ðÚ_Ÿª¬â–ñKè }°‚U(ò÷ÐCPkØz7™¾‘ÚÊÇ:vyÁÉq‡k/)"ÑÜTؼ] ¦Ð>4Ì.Ô¬ƒ gxE—ž‹õ¾äMëå÷[n4dHÛÁ¬R|oEƒÜ>I\ö(ê§9F2DÀzKK?Rß¿, *Œ[,zÀEC!+ìŸôŠZÅùò¢æ³ð3ÚJ§W³ÌrŠ"AEiñ›ß`w›S5eD¼ýs•ËÃÜ.(‹ìm˜ yåò D¬ât«l{¾éd×i2 Чyˆ˜ ÔˤÁ2;ýÍ9„AÀC¶ER*[(æ)V»”+1\®KE¢«ÌR‘¨•)ëmÞçͦÕ!xáâCøÝv“óªsÎÛÔnöã­.ï‹Zª¨ƒúú««ð„Ÿ_ Áh¢²1Z‡¨lô¢6q’ëRÛ“Yz8¯è*˜p–‹Ç˜ÑëÖL º3¾kн,­È³x·9l–4jF0,™#™_É”x53 …ä7a¥ cƒ›ìÜdÇŒ;¼70ãψw¸?2ƒŒètÁÞ\mo/ý#œ^n/ìU6™‚]¯ËÎáWšLÒ‡™YÉñŸ«fˆv±z«ØÛdGÃ^;f¼á 1ã o.&¼Ø!°·Mˆ¦öÞ½àÙ4ÜL¶œ›NÜHMŠú˜±­G|mšF|eéPžVé–•Šº¥BfpÔy±iu仡ˆAOD䨯ÌE¯XF¿" ê¡åÑq“-'¯ïP"²§4c‹M‚þãBj­¿Á¢¿¼˜m+%DÁľzJXšfA๶YÝ,ûü×3²Rþk¼??Wx•'bÁ(Mu ÃÖÀ„Ëß7L61(k_')RÖˆôÉu¨÷À“ûœ£†°êu>t:€7 [e¦B\÷ŸŽ™·Ï~U­ªßès‘´Œ~„ÀLïœepo…(ÞÙÚI‰¸¶ eÚ6;D·Ø1åÇŽ)$íA8vtûƒ3ýNˆ(÷f$ù³Ó¿Îvû„^VúÌ^Jó½õÛœK·µ“sJÌ·V(Ö§e UˆO,Z+õBXåÄè¶ž3ÝÖse ÛzŽu·ŸÆ¨vîËD¸>Ü®ðWÞ)ìðÔùj_Ò2Œ9[› ñt°Àd›¥hYö•TÄ·®1øz6«yF4ø4hÖëEö®ìBÛÿ»ðé )Ú…÷ük[>JGO[ŽSÓº9ÑùíÔëó$¿Œaùºÿì#ó¯}"[éa¤zúhØ‚1·hôÀKvc¤ä¬` ”œŒ z[ýû€zžU>ÛBv}›þ‡Ä=¸Ÿ‹§énÿº×”o»‚še;Š­³¥¦„¥•udcµê;ç/†-‡ ¾¾wÒ½›Çjñ<‰‚M{ÞÉdùN™Ö;>Ôk;£À‡Q Åaá0 Œp^Ÿµx\=ùO½õ‘µw¶ ´$¢üòV!Ä. °r—FÖGHA´_7Æ¡‰q(Abꑇ$Æ¡=Gµv›4ßaAš®½ý O)ŒïÆÛ؆P¡QŠÝdb™¤pkÜsÛ˾‰¦(ÌÊÍ,ErI):âçEý„¬Á0÷-Ï\]̬€â]4X¸ úZè_’ÿ>µŠ—&hŸ1 Qoí.z“Âûå¿írÃÀ+3NêƒI¼=Ž1‡7pLâm<§I¼IÖ6‰O§,^¸… ÙãC¯pO‘u1cfˆ|ÅÉiMÊhÆú"¡âÇÑ~j½(òFDÛÇÁ º#fWÔø¶½¹×Æz'Ge³î•Cg|ˆ9xñÌÀ-spãdnјƒ[4Öj'ö·§¥zÿ/d'’×\$d»Ž5w0wPIF †‘ˆa$bI€°È¡æÕÛÉŽl/H×~åÛ£øEÃÈßúÿÉó©– 0‹Qƒ%(ŒÁ:`åfD©MdÁc/ß¡äsÕ3 CÊ+”ë¦ÉuȧŽN}VCæ§êšIE¾5>Êä{ _š**è´Uð™§Ðâºß }-§-àzöI)/ÿ¥Ìô“Š‚HŽY-ÇAGö¯¢‹–ÛìD¼ÝkŸ´P&‹0ë4Drk¡Vÿãù|¾¿\ýý0a²mÁw¢.I1öR´Àù'"§Ø<æQôè' õêò8ä×Qt]G/`ªóë5ªíJÃþ_.šÉe·˜]KAE ÿ>’·YÒÙWÒ0ýM¤`}¼óhþ‘„zu5ôË©a¼$’'º–G.’þúBž!XÂèóêèÔçÕѩϪcÀüL-ýþ‡œi€48>Ÿù€Ø”Åßo#8º݈€™jüÍr>ôfˆŠZ{R›Ù€Åê£Àê£Àêc¬ ‰>ƪ0òaöHcß§A"`N4ƒªÚeti—”1oˆM0iˆN3ÜóC$ýà–4Û€¯«´õSMÈUËš/Ÿhb¸|ª‰ :àÜJÝ‘‡Ë‘'ëøï'éòb'ùײ÷Ï–( ©!PÀ<Ånæ‚ÆÀ6¥ÓÅ|ˆÊˆ½Ž‚ ¹HŒ9¸£$é+ʉ)ŸéçåîæŠ-‘³æ”¯Ðù”}k>[¤|º÷­íY¡¸Þ!Æ¡Dˆqhbpôv? ÏTSŸ×#õ¯?¯%‰%¥TAÒOàHç ÏGµåüÑL/Ù `È…óݽÛÖnÚØôÎÞóµœÇ þrßUÌPØêH¦ÍIuV³h³ïÔæbï5ô}Úq§ò ˜Õµ”<\¹ï*z” ÕáÚ‡©ŽK›à¾Z”]×Ñ `+‡ÞÎæCãú3éq¬¤G€~ã\+)¶ ¨Ž.·2o¦|‰# ¬>M ªh·§rÙî»$CM(–aHeÐÂsémdezGÖÊzvuS¡T†Q`$Cð<º·Êö–œO?+ö E],“bì¥h€Oïá`ÿ€ºàIå¾•ì¨ 1 BŒCiç÷uW>nJô¿¨Âö‹PBþ6ÜïŠT*Ä8”!ž«ŽHÿg6õ˜ªâ ©wæØÃf‘“I1öRÌ€}€ïŤ*°w¯Û±–xf·YòJr´$rÌbš²ƒ±;]š¨¨4ð?Iâk~¸Š«YÙäI‘Èä"ŒÁê°´"¾Ãê/ùËW1LA„“oHz“x·V|¨rDñdjK×òΩ>ûu’Ò´UÒa˹5ùo”]ìè-–eïfa£×ø"˼k0P‘˜ýT¾¿Òa俔˩øÏyqˆ("yÆ”[JawV0—"1!Ò£§Y"X“æˆê6L„ÄIcDȽ=@„ÜÛú!p0ïózÙîTF–éºõgW€Š_‰0¯Ä-ySÆWãù·h Dö²–$üñ{žšÌ/•¢(ί”‹‚¨¬FQ•Õ ƒ¨¬VQèpaQŠÉÐáÂrQpe­ÏZz4¿ ( §‡†bárRi8K3×J¦ØþRÄ–éB¨\h«µ…ë„cÁ.r1åD/€!“ñ½e]â?¤Ä9Õ’•Y„0Ô„™¬`§ŽÌêG]é• "z*Æ(ŠQ”ó¦Ûrî{üN穬ŒZÁ*8,FÀ™RR5~lì “,ÚD­p¦èí`©0.ª ·2ôÁyˆ¤X™(ìº^ŽMBQ#)µJ„š†B½zU¡£Î]~í?i{Ê–QQïÈÛÖÔoS"âP²ê(ë—ž!v‹Ìª‰mLï•>r#öƒ†Ðü>W›ÓF¢>F‡ÁÒcmðµÿÞß»Îõ÷ùè·†SCœzÿ+‰@¿­½&ªž„¢Q‚&W±s÷G¹ìÏýލë Î2µ†¥®õµöÙ6 lî,}úêkûÅÊ`„Û‘„wõ–1!»˜be4´s¶'¿‘–7 ­¿¸ŒwÏÉ­kÏUbMÑè×ÛêvßbJDœ½68}p€Å¼Ù‡« ¾wÙ˜O—‘Ý_Qtyë %½­ä-Tƒ èQá—[…XÑ[[¶˜ìS¿HRÁ‚bvÜ!DmÞÖ&Ú$”Ó.ShF]îtdÇÛfQ…t¶ämy¤>Ma Ùn#SÛ‹T˜±À£0aA Âle4heª­G޳à®Ñ{\eŽ©`««”ÄŽªôÚ²º¾³¶àÃØÒÍÖYž¯Øfa'é–‡^“¡Iì¦J(Am'$A€}r2LÛáó9LÙñ )xæÈ$Î-µÓsŒÀï¥ß" 2P‹ü ÄTA%3Œ*ohy™¥"ÑU&o3ú W›cß7øîßN¿GÑí?aX–ê£Ð&Ÿt…¥R$E5K‚¤¨–!UzˆðX¸•J— NÙ\â7ˆ’Êòz Š­·³´‡uE/FíxbŸ¨0øq?7sçÛ<‹‹w»Á’*¡¡õó\ŸØ>F¹÷û1\|ð‰|Ë:–ùèââég­^ÉØÔ¬#la½ "Dƒrt#88D;HQìH”<™ äjuýûeÉt«¦sä(°¯99Šì=æ`È“©#–Œ³ê}&UD£?ʈÁhvïvÝIª_t„Þ‹G@ñœ ­zÝüðë¨5…”c…Â$Ô2'$îí^ÓhÙw’ÈÄSDè(°!θãU©å&U"yÍ®œ$ÄBé'©¾oyp`[”°½õ°¥Ô‚TŒ¢í$åT¤ÕPB§¢úß>ˆ_ûlwò\L¬ú§I­\I–˜q€>èœÑŠiM!ØUÑÂç7h ,­Þ Àºáxšúƒ$J-ù¬oß„*‘#Q°†Ý=4Èd4T eµþÇA8ÙasÜæƒK‚` ߼"-cã¾õ¢¤ÕAˆ]AÞμ¯$9 Ü!b›¹À¶ôXJZ¾![„ ŒŒÖ*#ÄXቓ }°¦éh*'›\H|¾7”‰nx<H Mzùå¡Ò1¶}ºîæ_Uiž‡“Í._m!À,ÏÚ’ô;fý$Ÿ+ÀrAk´¦XR» Œ#C00ÐÒ~ôNÊx¾äière†àpÉ!ŸÂܪ£I‹‚Q+ ÃH D†”ÇÌ›| « {V “FÀ{"ÓFI}ómW³4ËIŠYób (§mšÀ¶¯9Ûn’XmöÒØ¸4ŸÀê`¦&nÞ£Hâ…©Wf°›€«¥K[^Іâ3XÈÀ² +¬QfÀÞ+}Mbag´×öÔßâzB+cŒÚ°ù½'·Ùl‚Û‹ñf¤–‡ŽËåA^`¥<ÌÁ-ŸÁ&zG33wëV²+>§¹‘S+ÔËä¡0û:×ÐÙh’G·ÇÝ¥2…"‚èa^­ÌB‘è0»l58³;›Ì®S>o“0õzqmæ–,Oýr;ì=½èp9·ë^›wépìj©£R âþõAbÉÞEƒ±Â“²1VxBƒÏ Ë¿‚¾Û︣™ kKÄ郛¨R‹'xž·ï{ ™ˆ+³·s©÷®¯I© +h˜äq+ŒÎA.éÀ¼?kÚÎáÛ݇HÖ;¢ÖØ(}Tàí;(eüúE©){Mi}œˆI­Y¼¶ ŪöpBè>sb¥º¸]ìû§ö(±žáö&•ý˜U`Î*•—~¾ƒô0l*1p÷»2å°MbHm‚o¾Q›L"¦š½ŒvˆZ8È»ˆïŸhK½‹?Ú†RuÝWB…ºçÌ ô`ü­³—ì°úÊlDÉÈ.btÔ~¬…6a÷A:žWͧI0; ï-téa‡Ü)bj9Û¶³Aý˜›*ãFÃT¦Ê,Ån ¹xamæNnÏá™A žòiØ^òûÇ5R?YÚBš,›J·˜!yŽ4ÍDÇC©l&ÆÜ1£ÛbßNZ¹~Dº‘ Ÿ Ví>F¸¶ìÈ^ßvt¾(sÄ£@†%õ7É–+u¢l_´SÊŒšb2Tì3£×¿ãÛô¨ ³×})òðËßn:°<â³³¡âÉøÞD°HffæcªÞr´‘Xõ£Œ ”fÃP|SŠØ!1¸i/z]ÀÙ‹)w8vL¹Ã±£îŽ]ö ÂŸ|õwk¬¬ùðßΡ¿a¬GÜû·͵¸¶‘NQªŒËJ>çrHìm’Cbo‹{›ä˜p†#Ç”3\çYOv_îCç‚î]›Šª\š¯$v>ô„y#γ诋î“û !ã¸Y˰Yà+ÚGˆ¶çO”Ÿíîô‰³›$%z·¤»)P-ût¨5ÕX#>ìô.àsy}ü’+g«Œ [e|hØ*3#nȨ1↔ãï0Ò¡ŒÜ–‚‹¤‚ñ/Zfþ`ÌCxœF‘AÖ.J¨¤Ê eêÐŒ2‹cÀ 9%D·Ø1å-ˆõúc¯Nò„},ëb~÷ˆrð„3•X°Y#hBzZ'1fBÌû7+ÝÖsÆã7Üâ²ÚvXÏ•©õÕ20SgæYw]d)K§£<ÜîÊèe½0“Œ}ÉÎHnþ$Ù0 bß­ë’H66=;Ãö½˜ªÛ.pΊ;ÈbƒÇUÑð¾«è._ðÚ–ÒÁF–ã¤éûÎÅÄóWîý£W<ó¦õ»®õ¾2=Ø×(Þ„žzžÔ#ц>ëÊÃ-%çc ä¼`Dðï(æïÝÉ }kl?wô÷Ñð< þ|¶%¬}ÛÑÏ‹Ìn†ïùÿ­ôXJ¤Ž0Å{ÝkO³]A¥–¤¥Uu Qªºìx? b¯í/‰,‡¢óÞe¿é?ïÝ<­Í´S§Ó2–çh4 ^®oÙì3[½¶“F8Œ £@‚Ã(0¡x} _ZÂC[]úÄ;[hX]s1O2û7 «EŽwߥåâ‡ïWT;d?%HŒC ãP‚Ä8t ç€Q½Ï”Í ”˜Ž|ËÙ³ÊÄ¢ÂhìÖñ¡ãW C­º(LˆÇYŠgKÖ4ÅbÖ[&)ôzð4…Z«g³–&3tQ;«èk1C\~àcŽVÁ†b4')}íúHþâ7Hž8èó$& ç,É·¡•¤ýý›¶¹™,ÛÖFùy¬?œÚp‹¥ä#¢Ë„rt«sQ¥:ðn—ÁÞÀ1‰7pLâÝã|ÚœhÝÃzÚÙz¿"D3ÇÉ™áÛ‡‹¤Õ±`L¡-ShÆÚ1…v`dè¾{Òý[ƒ¤õNÎkeÃ?\IJ¶6E¸AcN¢ÌOÀÓz nц«µz+¦M¹lÍ›Q¿ZÈ^ÿ¾¿hôÌå EyÃH Ä0’1Œ$@ #-°o˜«·{”Ú é g?OìÑØì¢q‰Ì¸í SY7‰.´÷ÛöüÎ[ßõ¦üNZŽÏɆvWnø…ȧÔÌzw)‡y+Nr\I¿ãÈc®ŽpÐ{hœ#Ø8.aãÒ¶߸*(ÈW»½.p*läTZ•>“š`’aõGÆfÌnòY†‡“ W3ðÓ l{ÂÇå9^ùšýê{‰ãJŸ89¸Ac¾ù3@3p‹ÆÜ Q€‹ŸµºõP}Ö†#†GÄþ,Áït¤—ÕÞd˜ ÅÅ0 âbq†A\ CÀ‰§vù…j›|{ÈfÚ÷l{1ñ¢Â9"¹>¯ŽN}^ýægêÈõ\ Q·ÿM¼\º¤NT Ði«àó4àtz=S^à[NkÉõl üò^ñG *GKA$Ç,Á>†LÜ„Á)–ÛlºÝ»2Ða ‰Ð„ B ^àÇóqo¹Ø§ûábJºœu±Pа•‚ˆ;Ù.½¼C°–= Vh¢:Úˆh‚ëèp× úªdÖ(|¤àíJCµ^>–­Ùôq-e ´Uþ³$¾°+æ˜ ´Š(ÒêACÖÚyï< k¦¡^] ½Å²jàôÄ^RzcÑJ‚ÏØ7I‚6XQ]iØâ}^ú¼:úÍÏÕÑéÈ4Ðio8lÌ$¶ð€n@7‚`¼¤sBæÔ=aNbΜ–#Æ4¬>z¬>z¬>ºª¹¿&rç‘3‘aƒáqäÖ¶vI]Ú%eÌ¢‡ÈD»ãþ^}Pƒ]9ï¦_ýkL¥íÇkB®ZÑÄpùD U™§ ]u¤ƒÊu9ò!P¦¶Š@¿A" IèûÈ‘¾X\”VŠ mÌS|›Q4«ŒPçÓ®ǃe£‘]GEŒ†\$Æ8œT’Û_Æ©ž‰Èåî$³ÿµ¦ ‘c– :…¾±ŒÞèàC\»ïÏLó²Ñp¥BŒCƒU©´j°CŠû£oÕ+|Çúzè’J0J%`Eâµ[;ÞÄó¹`9ô·˜Ë}è¼P%9ßÒ/wÖ¤eÓ»ÑÎ×r~£ì*z”ù«ç[º›ÑÙ»š9ó¾ÒÕNŸÓ‹Ý×À*Šêšyq‡Ê³’:®b˜‚Ú ©S}â¡”Ø-½²‚®ëšÎFÅøíÐç°rîL€~#+ë/ŽÃfëbÊ­J0J%ˆE½ÉHLœÚûæÊnÈ0 ŒdÈ…ç"­ÔfNõeÍ£Û·ik© £@*CQxâçþfÌæ<îœa[ŠpôT‘‚OõâÒ&»o¼¾ÉLøƒe+P¢*• Ñ }ªå3f»ÿ!®Ž]WN êÉ2P¢*• Ñ =×$SºH W“Å&[ˆq‡‹CS•bì¤è/& ª1q4=ûÔ¹œ‚HŽY@VJê¢Ç`VÑO‹ïDÝéL‹H«¡‘VK òKJðUÝO?÷ ¼ô÷©åˆ¢w-ï=Õ„\µ¢‰áò©&ÆÊOZDRrè°S‹¢±¬"''ÚèSgµÑ§Îk£Ûô\üýÍêT?iQ$tÒó(\êÖT Â*aƒ0„ZÌ'mû¤÷Oëè ¡Jc-ñ[2a•‚0„JAB¥ ˆPÏgÐìýOòA%ÁvåâìÐ×3Apt#ºÕ0€§û!š“p*ŠãÒ!_7¯©bU%§z*Æ1?†6ÇÆ ¢x%‹™b\w®YS„X³¢ˆÁÂõ¡ïºt–¤|èeÇw:sçTø ’x6•¨„¡Œ¹ž£ûÏRÏiT¬GX¬Èä"ŒÁŒÈë_çîõ{"«ùib:vAdJQ‚P&A ”˜i?Uè5Ḿ¢k‹E¶æ)nóœ¬h°5Ú}·$¡£Ö=-2WkhA¦ÖÐBW™‰VÚkhyÇ!¤SNF¥¦„¥ÕuÀU’Ôñ²ºö´rJfÅhÈebÌÁ?.¬{R‹ËÖ]ì÷¦ˆ¦ E],”bœ˜¿..ܳûíÝÁÏÐG,Â,!‘¥Öú¾g>œ[hrüåΫ`.sæl•¿öjïE¤WCTN“\‚L­q LR³Êᛲq]˜¤¼s#-äÿÑõ›2޳Ðß(ÙÇR2rœe˜½ŽüŽÃ”û_à.¦¿"–ó4"úé÷7 ×'pÔÏö„.~¢®áNóåÆ$îÈÿ€üóV"HŽ€zo¯ó4^ýõe½ŸO-OüÿókŠýQý!ŸÈ}Æñö/Ò äïrY«Ü?×s%Eíf-ùç×bÎü¢”yöˆ`Yl+¾ŸõÆÝ¯ŽNý¸¢NH%¸c"úì›ÝPò¬eª€Ûo¯^ÐFŸzA[b‹{Δäh)DN ;7“Áæï³†½ìŸ¿Ï—ó½DÇ}á5kŠkVM}8IQ×ðc¾Hù4çþã ‘.%"Taz0žýŒÙñ“Pçç[¯²ÁøõYou¶#‰ß˜(£K»¤Œ¶ö¥š2°ÂÅlr7á }ÿ^Btn·Ið´™%•Àê£Àê#\{‹’Ó@¬²˜7©í >°àF΀ªÐ„6R$tÊ“QÉa c°…6ìÚ›ô*Ú¨Ôi!„t ¿\T>Œ˜ËAvrÛCÀ†A‡ýl3hŸCŠG_»°Š×NW5yŸÚÀy[wt#ÁÙ¢¬Säý}d•´T µ¦Iû5N…¤†ÝT×>äÚ|!Ï]7Q o‹SÍGQãDå=’ÆŒ<2ÂÎÀ^>°öò!10j€N[ú°« v§|‚Üd$ž¯NØí·e‘W?@‚!)Ò¡È ·ɘ6F¾ž„Ì;¾R)ŒC ÎMž‹*™Ÿ<›ª·WïІž…"aI½3:TðîÁFl'0¶8?Ê!  Hìñ“®¼l.H¶r£ÔõN¹¡¢%$bIF¡Àéƒ(z$É$×3Þ½µ.3‡úì>v ûúñú¬::õYu”õ¯]Æ{Ù¯æMEµ&GÑŽË/“\a½r! éµ·ýxXÙ#°×'®F¤‹å¢.ÊÔ9E%ˆ´ÔÊ<<ò¯T U2À5 [ @7‚ AöìÐ-õ¨BÒË+_k¤„ˆíU^37ÔîFp´ <ªèÐ-ûRjÎdÀè+‡nD¹z5§pä¬*…\·¯r½ŸŒÜ$i5«Òúœ:ÄúÅΔRÑŒcŸ¡ç®%£7ekTˆÑ-«¢C7›lz%ˆ´x¥àô>ÑVÿxiû%Õ««A¨W®å^BV ¶ã²Åj>¸%5ƒH«¥„X‹¯YS Q½kÕÞÞ&.r½F_­–DZ‰RV/4䱸¯©÷MRÚÆËkÄV¢‘VK œÖµWIr1"yOsëj6<±ÉMºÜŒµT­®™ZIëÚÝ‘½ºBQ^Iˆ•Ôþ~bÑùƒJ}ø¬ïÄÞû™ÈHÔªZ©]ª*GK¡Ýônпo$ߨ¶ø¶ ¦mä5(1ªèÐ-©B¤{Ýu%ˆ´q%‘õŒ$8´;ÄiCGí¾…àNrÝ¢*:t¿¡ ‘Ö3t²J¬oPxf¤á£/&ªq2Pèƒ0ôC„} <Ï©EŒnÙ–æí·_—‰0o†Oi|è“f¬+¸`„Ã(0ÂaÈDjöï§ŽªQ}Ä€õÃÚO¹ý:M\{· —Ú†9v ‹,ÃÈ("ñ0’Á#ýWj™‘èFHfòÚÙ?ËêúÊžq31”Íøé=ŒpF84ÚmbЧþõøÆ¸üsã|ùó±Û•ž>³XÊØì:ò» ¡0KPhÂ_ «#PÝÊ/{T\zûðÔÇk½íÕ“Æh>Ü|h”a0Ê0H@fxض(ÒCE±ù¤]Wõ ¸`³_訋7æ¹d¶·Mùv…Сž~ƒ@?„A Œ)kju-r?î$¡Êóã¸]g$6ÿ¬§K çGr.LÏ;¤~Ž1eŒ€<æò¹Q…ŠU=ˆýJsïèŸßnj§Qvqû ì»GÁÔ++ÔMÅvXÌ€=3`E¬–žZ¢S_0ƒX×RêÜ3Ú–±û‰­¢!£hٛ߬qgû‹2¸MK7w!L¦àöƒY Wï‚ Ñ\«4Í›Nuìîks;vÁ'-]½L¤ñ è´-- Ókg)âF¤p)8 õ.AÄ=uE¬ÅÔ*ͦz^aŠâÆ,!hÎm7£­:§™1`7æT*‰z;Çà÷ru1œ­©fý™í'°Ô#z”‡°ÿ.±ç³n5/SFìi<ÙFìaDÉÈ.FÔšQl¦ìó¿Údýº#Œ?>Ñns½VìómŸ$4±¤K4Y!²·EŒQGDÄ°Ìæe>Jjä0²ú ü ÊÌb™F ‘yéïÈ.”ÛápSÍ67xòNnô^äFáEn” Wo1Ún°AîÔö×ÍŽùw¸˜îüîhhý|O'ǰÔg~`§ƒù¤›±¸Á ™Å fÈ}aÚ›%C·c92 ºSðý¡§ïèhψO¸küˆ[td/r;Ê~>â_Q~-ó‘pYº™ÁQsFט!6ºÂŒ wlÛ/úvÛÌwÆ1c5›ž=IdÂ;d¡²£“¤Áªdb¢@Üñ÷gûéÒïŽéaG‰¾‹½Æsìè6žaG‘~[åŒÜbD· ¶}|j¥GGþ9K´ü·Í5ªi2쿞\ñQÂi÷q×,ç=ÇqP¢ïbG‰¾‹½Æ³ìè5ža·§„½áAÇ Á›Èõ«r·B6e÷¾,áfÉo‘IÉÜvr°qoßhÆòeåÉ•cFeÚ!fFÝErìn“£mú¶6ÑçŒ#:=@÷b‚_Ù"û8ýú¾Mý4¼:9Hì9B´…Ťe&a'ob'!Êu~šô¿†EþxÛÈbãn²6èM†¤çWFþÁ.]fõ!#lªJýlœ¾Â³¥<Ó“Bdpeƒ;¨Q3{[…|¹¡Á‡^·²]Ϻ^í>à_:]†Yl ïOfàͲÏtÚÂ%J-Ñw°£H/gÇ€ñ9;úgر­SþpÛ}¢H"C”¨™)}ãæ)vét’b9Ìæ9 ½õ[ÖÂdÊÎÜÈÚW…¨R‹²òƒ™‹Ätù©}­FHž‘ÿ’ð$²¶6³Ýv+ëï—6ߢGù˜êŠã šÌÒ¶2ƒxÇ$Þ}sžÃ8&ñök¤_Û‰ݳzÞX~Úvô!¦»±>i]q$BZí²O¡éríÀ˜B;0¦Ð,}ÞºæâÛyã… ÑɨìJ‚F÷Ð Ü…‰œƒÈBØ(Üçà&\Ò‚ðGâÄ7ßBv!Ø×8´ !ãò=Î; ƒ$@ # ÃH Ä0’ÑDÊZȶýj°GC-½˜æ#BÞúÿ±ÕXŒÂìÌœ;KPƒ%(PX»5LH™£xh'½WèZûN†DW”RN9lŠ1‚Y‚ý˜Ç L´YóXè&àvR#jÈuy×ï¦ïœãøœéÇ^ÅÙ‡®<䥙¬îeŽÍž3žãÐÇr§9ž7Ñ4‡zÂbMsø!n‘ãjÜœë ý¹FUá´~¶À¾ùÒÿ~M¡A8i¤ «N2èp/Ó :À4ƒ=ú0Éðt9YCÖÛ!2Eº½úND‚‚Ò'ËâŽa~Ûãp¿ï{ n sp‹ ¯œNaZ ¥ÛÏÎûŸûYßéäeØ~,׋aÄÅ0 âbq±[šãáä ýöˆÍ¬{ï'õ cÛØF¯ŽN}^ú¬:ÌÏÕÿ×~”‰ÏJW¸{8tÚ*øÌÒ¨5 žÙé‘åtû6®gŸß—ðŠü‚DŽY-‡œ ½„Õ¨ÿr›Í7·„rŸk¨È¤"ŒÁ’ b¤çSÚþr6Ÿt½f™i±Ùö"±Lа—¢"Þå6n´ìQ´¼'Pßꢵ֮£À^'UŇ“2áb¶+ zù©fŵ”5ÐVùÏ’|`'îæ`V!ÔFü;hLUƒ÷-¨A¨WUCw±œ½¦w”ÞÚ“Dé„^)N#›†’³¨žœ::õYutêóê0¿Fš:0¤ÉG9µ‹â×» ÁÐàèFpHÕΈàÌ=±IJŒØS¿tX}ôX}ŒU!ÑGÝÓQ|Ì8†­h 8’âyeti—”1oˆÌØ£]‹}朶úˆž/)êßJ±&äªEMÈU+š._ò¤;Ò§CºÙm~ƒD¿SÁ}”TkûÉ"PÀ<…òRHºÿi×dã1‡²!±®£,FC.c®Öò©;zwëoß1Å3M¸Üâåh)ˆä˜%pùŒ‚ì¹ÿ|×÷A‘Ý";ž‰ßõ.H¥BŒCƒT*žÞ}'^á[гIôâEŒ€¨DmìÜ9>+çËésÈ3ÐV©]8ßl÷Ï-Y6½#ë|-ç'0ÅWÁ_î» þ²5´mçªg®ß>·“2ÌÅÎk*VmCbœYHÉZWÑ£\ºŠ'ú 5)!J‚ŽëÊ6£lôvè³C9g.@?„€“t»6‚ÐóäcÊJ0J%ú¬ÂHÑÑ\t$ÓÛf, Å2Œ© çÒªÌfNœeøçÍt›&EM(•aèeçÑZaW›=½™ãõݶ»|[U±Pа—ÂEôá’Î’Z=É˶õ³Ú_‘J…‡!L}âÜ´&vA6¡üväw¢*• 1µóõñŸJZ‘Z,6î~Œ9l þ\ŠºX$Å x1±6ÿÀÜ%nWBRçݦhÉ1KðÈ1Jàêò<½ #½Ä¡‰·x‘ãÛÆ-%ˆ´ZJXQŠ‚¯ùªî§Ÿé„ˆPúkÍrDq –·øÈU+š«V41\¾×T§Unqc¤L £EÑðE‘“ÍÞ.õ‚6úÔÿ¶„{‚ÞÞÑnçYLô<»Q)C¨„!T Âʬò©‹<*ý#5:§Òà6Kür ¡R†P)C¨„Ôó-1{÷?G_Ü¡•ÄwY” íB_Íä´šJ#Öô!ºÕ<+u¶ÿE#?sˆKE1K;¹îDRÅšFJNôÐ[rü³cf¸£O* Ʊ˜ÙÂuÓÑuYbÍš"Æ OQѤ£›t6¤||3Àýv®ºŠ@ÿ!’0”1÷Âsª|1‘Ÿ8 ë¡+t•drÆ`‘©µçîõå?a~g5?ͱúC«LÉ%(‹:$€3í‡dõQl‡¸x ‰æ)\Ρ[£ÝwËoÜYêuO‹¤j -ÈÔZè*“ÕWáÃGT ; RÎH¥¦„¥Õu+1u¼,Ÿ=h›y¶!—‰1÷AbøZ\îÀéb?E4©u±HŠpXN°›z–—ß¿òœ¶$w°@„1X$BE–8{õ}Ï|¶¶È·ÿB•]º2gΖS½Ú{UÆ•Ó(†„Wk\Bt--üù¨kV9|K2ÐV)\ å=•s jc¿ÓÇí ýÇ0#J‚.FHŠj2¢×1ã©<‡þ)ý±œ§åx~´þäúÄ4úÙž`Øoýä·è§›¼æÃÌi_Ìæ/ÿçV „ùƒòÞ^çi¼ ú‹€|¾©<¡äOÙ_ üÞ>_6ãùößå>B‘2—¬çJ ‹ÚÍ:ÿ^¶˜£¯¿(eG…È/-ËåýûðéIå’K˜¤yÕÖ·lòŽ?êz÷5©·õé>çÌNܤ™´\½‰½]½8ÂkïÁ®64• ;ðgmA¨\ñ¦›œ¶,虉0KÞÅŠtMËV&sÑnçÈ›–’y‡×*…_°ƒ¤tçÈJÎ~v‚n¯$«Š ©HÜ@oJ†ª)©Ð $œ8g–!L‘è*3%p~C69Þ\ÈZEñ{mÑUúŒ¦Í#H D éÆ)Õ’ )ªU”;Ýpr“/˜^Ùd\7ù’q»‚eú¼:Xýkïâ…ÔŽç8­;žrÜŒl¹I*ø›Žº”=ïv}âŠ]ô(Ǻ¤Æ->Ò…9;LNÅ.Õ7WÙ›ÙÜN…b“‘X€A›œQ…â¨EÌÌá÷>WØ‘Š/ÍâS@ÑpU…È‘Ÿ(‡ÌÉ"­º9¢àµHŽ"{ŽÈ½afß oøBÍЩϪ'ƒÀÀ¢’/JyÑŠŽÈëõqªèÐ=ŠÕÆXáI¨¼ºg8¯]}ºñzµË~1Ÿ&‚°)SŠ;*…‚n‰5w?´ÿÉ@…¾SÅëÓ¬P®ÕRb*4@"«ÐM2ýÅË ´B ­–’©Ð,‰¨BúD©£SÒbìµ¥ÖЂ}\ÌР+­Õñ„ò;d•Iº¾ý9~[Ð]S«k!¨]j˜D­Y«°eÕÆ„¼m¶Nؘ’k(mß ºeUTu¯[FiáÕêÂíIBúô«:Hdä\Fº‰ê·M·°h­„²[1 Šyq¡ ã;¥ÉBžÛµ¨‹"¿”ž‰Ïl]²_—‹y«˜€—g¦‘$9~òœlîÉØF8 õs: ù©ë§PR³ pÀbÚ¯ÓÅÕUA"^±]ƃêV)Rk~0Œ¤@Päµ \Q•E‘å •vÚ“©Ø¹mÏH™xŒÎävõ#„@í°b1.:æZ,GR š=ÌZm ˜sÂ-|où5$Ô°Ÿê®",Aa ö¸éˆb/UÅ ‚Itø¸•Çk½Ía4Í¢8™w Ê0YŒ£˜‡BUQHŽTt˺*½ZÇqºmþ¸C‡ YÂRȓV®2XuÓQ‹E  `ôOÙRñÏN"œë •Dz>{µt½hŒ„õtiü8ðÂ'媀"_UôPd¯€2!r˜Kûççߎ¥ÂçI½C\_7ñ:V—EÛìɱ§Ö¢rÝÜi¡<*{,fÀ.“P VKUŸ/ ²Â²²ÖäSsÜÙt gô‘ÓìÁ·³ŸÛF:\.43`óß-ïìCóî'C_4æà!ìC®Þ ‚@^`¥<4n~ÞÛo:dÖƒ–Äãö8ͽ•š ^&ÐçÇlØL"Dµ¢ ËôÝêM(@Ì€,-³T$šeJœØûÏ8Œö¹þîíÔ¯‚ÃÝÒÏ÷ãRƒ?DWöï[•„sgitÇiüÔiÔÂ×!a´ ò·îûA¿ÉŸo°ËÉ_<Ûs¿Þþ0¿Žòá7Mñ^å‚%›ãBdÃ¥Aðù‡k”ç»+6èÝC&|S…Èbú»øšøEoV|{ÓcÆMeì1'bÒ1Nì5CœJ¹£ Þ*«ÚÃiöq©³ûö;n:!*¶¨û˜>1ê³nÄ$dõÜ™öl0"¢eDÑȬ5+6¡É ± MÇE6š¶<·fü.Dd“f^I͵g±ÞºˆÁ1w£j²y'¶©ÐSû¢r«ÊXDcIU}cKCÅÑßBãp¸I Sm)wé~îãF—ᇗ¦lrCj)FÜPêýÇÏÐ\b²¢äíOà%û|ÃÀöÌ›%U˜!îófˆ.2+̨Ç,z=À2£hgO³C2c·ÿ¢­òÁ¤Ý‡ÔÓ>²7 > xWZiÂ Žº›u73õ¶ ’¡×S¾MwäGÍŽÂí®È“…¹Ùõø>œAd[2®4g“ñ¼ù²â¿r‡c´};Jô]ì¿­F̹ßFœr‡ûäë ÞG–‘ì•Yä+¬bøÐu‘mÉ8÷Ò9+£,{îó”Y‘Ù|YñÂ@ÆŽ};zgÙaX­Þ„˜ðF`‡ØÅ®€ú¸Ÿ~VÈ7iSçs_Ãêõˆ»éFó$.« ‡GWì{9 ì}äš¾­5FŒ;#tÛgxrŸ,f›Ëß–%훊,* XÓ:ÂùÃe%ÇÄ„Hª9Dˆ¢‰áÓÆó,u³ ò\lÖ^Ú¨ÐhK÷U6½§wK‹ÞpCúZyHŒÓA²WrÒegñkJ†»“,w/5äfë»™çÈRS1䆘ÎÖÁ;Ù˜æÝî>^$¯é0#ÔpÚç=á™V½ÈŽ};zgÙᎧ®#þp”˜ò‡eG—?J£Ïÿœz9 1ŠÃ0„«®Gølš?EÁ.{ˆ¬ Ô –™Šøînë9bt[Ï•¹õƒcAóû$é|t2‰ƒ¦ö ‹i 3„ݳDf¤ÒëJɽõºÉô/½T“š×Mˆí|õÐ<o–|anÜ€mH+¶åk[>J ]Ž“Æóÿ>noúïsÑÿþ;½zï=¹îú³½³9ãr88ˆöñ?Þ*ÂÚ£Pw>zKâ#ßí—J‡$Æ¡äsf”Yo7±±åߊ"ß‹\-©IaHp‡°*ƺP¥œé§ˆ2F±Üä|ä0E°EJQh#¸ûƒÌº[è‰`åâ,fÆ¿Ý/^ƾðUû—Ä“p§zÍ ¥ÛÊ̾:Z î =·è÷pþŽ¿â¨-´Fæ3Ì ÞÀ1‰7»>æð!¾øpÛÞä£Eß=ãwñ›S[/äÉ+ŽCë’¢-ShÆÚ1…V$¼ž  ¼£ù&@£ Bª¯dÌq¥aÙªÈà!{á Ü¿à§à~8w<Œ4IJ Þ  »{¯Ž¢Ãzü•Wè£L”*º ØRÁgžV•!ë#O¦`]ÄõìBù’^Ѳ'Z "9 â:b°]—Û|¿õÛQé±L*B?¬“^K¬¶Š@$µ·Xîpé Á§\8¹·H¯®¡^U Œ^±]Ï…‹’¤ÓR¡DFŸWG§>¯ŽN}V"G¤¡ °HÙ-@7‚ ÁÐrÉž0±¡ @ }ôX}ôb}µf[G¨7Ž„ˆ ôÊE—vI]Ú%eÈ´+}á‰U„¤Ô4ô“«OErÕŠ&†Ëšåò¹né-9-GôE[E q.Æw¡kˆœÄ³k45$ S”§v§»¿•³p1æà!ÞY*oÜ/·Œù‰{ðìD1½”SÉ1KPû\ uÏ6®Í->ã÷ëQ•J…¨Co©Ûf½Âbô·’×Dtƒò5ÄãŠgIo9Bþ9Ù”TÎw}³lzÁùúÎ#MºâürçUð—›–¬f–°ï”$ºØ} 䢤|3¯J‰Á_îº rYd‰‹YLˆPt]+è±i;^¸ÙB¾’–a‘S6E›a«J0z$‘uhùM¹ÐK÷]–¡&”Ê Ï¥èÆ·ösÆ©_‡÷QŠeèžGñÿ¶''sœÛ5ß–b÷[î¦d¬cßæ„ß²8Q• …肞Šdö!fúe° žÈ©ãP"Ä|ru™—6âËÅF¥Œõwv6’¢.–Iѻܤ¦sº¯pi…vž‘WÉ1K M…½ãåz>ÀÂOúîŠDZ %t–"œ¿WˆŠà×+«ËXÞ»Õ–4!W­hb¸|«iÓÌ'-DO½+s.ݧÔSò›ÑFŸzA}êý¶ð÷O4H¶¯0؃Ø!}êwvþð•ß’`D%dv…°JŸm Ç ™ÂÐÔh+ ©A;„×Ü}§1a)̧¢=-2QkhA¦V×BY«Éá…‡/^&2ÒÝTjé@¢ÔÔAÍþËêÚ“&)Y£!—ˆ!‚§V^î(Æò¶çg#šT,’bœ>ž÷¯{>gÈ#a ‰ø,¤Ó ÈÚ¸Šes•)n‡J 껈Š*S¦ÊiC«/¥ïõùʱŸQ[H/€QI*b*îÚo0‚Y$,ú¬ÿ]ý…ð3ž§Ñªý%„û9íý³=QßÞòŸnX®læò“ÿs+¢[VÑ=®÷럜µ(ùÅÂÜUóÙÀˆ@ÿq¯lø ¬5eÝÚ‡uPL`-ÔÕdóHóÌ+ÿ›y>&vlöñkž¾ü¿²GtNaúÆÿ›¼)Ceß>\ºöuÕK‰øÒ %*¥H)!®ycÎŒ(«í³>«,f€GY²ËÈ®ßé…j1‹ƒª¬$#in†¥UÞOØ“òšEô²,+•\Œ‹S.Ùo•‘ó2d›…T«ü}¿}˜e¦I_21‚ü.kvØï—[Ãß³.j4  w\·GOÖ7snì;"0›üãò`Tî œ· ž/Š+¢—)ØbY5õ¨‰¹xC3D¤Ù¶x¿êjˆ™€ïv+ç»KŸWGQ?®«’½ÌŽƒ†jña27ûeðYÀP¾ßT}êm$ö—é2÷!¶ | ïogßuà·¿Ïâ§YSÔÇ%I”’"ÄšÆXNÖLzä¡<÷o+BEf†&æ'[XàÃÕàù^ l¸;½-îköv$!1eti{åKE2DÂÅìüЬ±"|GYB¤-·µâ´‘ð• ÀêCðù©‹XÌ5v½É°‘ýë*øÌ…z>ív=¸R}°)ìÚ+z Šlå’HÙïªüÁoÎøä¶µÐ.Üôz;Éþ¤kojÚszl•‡ åúï¤[¼—<¸dÃÉ•955K…`u¼2ÚOH•*ˆ,Šã4ÀÄØïåk(çCÌ>ÈÖ@–/r[Û–Õ½WåNFOèo~Ï{ø0¿eÁÖä=¥H×0dXÃKwœ ‰icd>ë¶Ãy Ìû” Œž >Û+`¸("Ä×l ÜÍã—?ßaû> í'%› À¤(ÑEHqµ?élf³ß.Gˆ"Ò½M6š(kêÙy©¬Ê·+Ü…!T6ªöMÇ¡™¥ú¼:jú×.ãÕ¸üˆ‚ήO\œÍvÓ7»r»Þ{”‹ºH•i%ŠŒÊf+pUàVÂrŽä…­Bòw»ìÓàÈ…*}üþ_Z+3bOšFT-ûæ F¢ÁPD4ªEUÉ‘Ážš%oH´ýŸ 8ÚˆBÍÖ$hPÒh}m¶šý á=ÜèW䥗¨C¤_l-únž©‘y«º!Y½6ŠŽÞ2U”uKµˆ”LÐ[ƒ3œÚÈêžL¯¦†‚Õç'?A\68·ä–Ø‘(¡¡Å›z3'½…®ýÖ/Öai•®½N"qéíC7úy4cÃMâäW”PÒºö*Il(XKõ&ËêDÇPÉðZ©1Z×äàZn}ðþøFzQâÉ@øNÌÈÔêZàÕ.U§IŒEjí¾‘ø®OÜ’Û&h°ÁOÖ ´“írݲ*\êËzá wãùĘÄñXVÉ$òfAºDõëýí“Ä÷Z«Ó܇!̆e¹˜P$qN÷DôCâ1óÑ…D9¯Ý¡^64Ñjc*m\°˜“.¢] ÁaáPjÛY ×O¦¾Ú»‰ˆ´‹ù±q‘aθF+IVj¢3 ˆa$µ¾æ?:Ó†©üóÛš²g´L ˜Rã0 Œph¯½] ¾^تնkѦÞna:‰øMœ†YCE'¦ÂÐOsÙCiÁ0õ2¡h\®ËmQ¬fw’BïÐæ(Ô»±ý²·úõçóóƒAdÄi²p}2ç¶ÞVÈóc¢&ìæóÁêÂl|=ÒKcÓ]ÎÑÀ¥lŠhÔÒ¬C‚Amã~‘(ôY'OúK8ëoŽp-»_Ÿxî4Ÿ‹Jµô»WBÖÇ .PÃê\ê­QˆÄ^ñ:ŠID×WÍë±{‹@ÏÚÖ$Iæ²Ó„©1ɦBˆËÈeýœˆI‡8Q4T)¹Uàξ›‘ß÷Z£ìLMíkîSfš¹Ô„é+5Iˆ8^à #JFv1"jŽQ›ÐÛÔá‡+ycLS|¢}.PÃ+¤.¯kžâ-b0ÌýÄ™Ü †{cLQÁ9ú±#îÒ°GqwM1‚ü†´î‡“3Ü(÷q£Ëð78rõîdCÍTñø ã#~ïÙÖ'ioÝ£K u738êNf´Vï&Ĩ5ª·™°¹t—3<¢í{¡Ê~´£í<²‡¶‹‡ý¬¯\©S»˜ÁQw2Cn´aÞ6† ݰd*ýò%}**r;ÓÖB$¡¹ëéþÒ`k22G WŸÎR]²£DßÃŽnã9vøs[ÇܿʨÁ!3¼ô¥òæú»•Þi^Âd©_É!;]OÆ‚(–»[ð6³ê°£DßÅŽ};Æok‹}Þ(4DãGº&Ê]‡[ý°‰ì·¨æüxj=âλ¹|ß‹jûŽ—Vdä(°÷‘£Ïtß_Ȉk_³Ì£Zcýü½ß3òÑ ×E³‚!‚¾]®çڟ϶„¹ÖãØ²9tQoù?o¥_€úqû˜æ†°¯{%™A/£ÔÔD©¡ƒírêÚuzdzåPtÔýtœìŸ(‰ïÝ]*@§­‚ºŽ¨R5í“F—s=Ÿv¿ÌW´øƒ–‚HŽ‚‚¼ušcë'×òjS._ñ¡"ŠHúé¹÷áñ,Dî/wÞ|?ÌÑakÀ-‘bœÑ×å]?uFîÑQÝçÌïjCl(^ÐuÅ^‘ŸŒl䀸 N|ù“üæ3ȵ¤gê«$‰í7¯ø%?Õéþp'ãzÒßî|Èšzu5õˆZÞ[.Š==«¾2ÇóCA™::õ9utêóÂS¡ôÐ:ÈŸÐàèF¬ÌÙH¸¦2Ûö`=)sî!9€ÓG/ ÕW«ß6O+u$ÌûPÞÈj—”Ñ¥”ó‡Âu~‡ÿN3ãÒÃðþ™ÃiB®ZÑD[5{ÜïwÒ1Aζ/Gþ|·Ûùè'ÉP™qk8~γf hj4òqÂývé¶â§­²çò®ƒ£!—‰‘;ÊtÀ¿[y†—ë!‘-‘^±Éæáôñ!ÜZÅ3»ÞDˆªT*„à±v|‡«:`ÿ–¢¾V_K.AYÔ’„Ù,¢²õZÃrþ„ è² °WÎ7[¥g‹ôóáë|ÒA’ôtÉUð—ù«¥¢tvûgp¶ÓDx×`.«ãvöf`züeþjµ:>>VJ ½VP­žÛÄl¹Ú$e%I²rí-ɰ< aeQ]JÙæðø}·dèžK6º½Î,)­? |2z€ç‘6ÁuØÜ”¹¾KWrþÖ¥èŸ.‚<5Å'XfËú‘ !‡ž&2d„›f&ºqÞj©èù¼ÒõsÛ™àR„»aDrÝ™X&Eì’9˜^áV=ºî¢‚HŽ–B0å|^VÑŸ6sÁÁÝðñ~—µJi%JÎ<=Îr£•p J/‚,Gt0kyï~\RÒ„\µ¢ ^•õ(=™¤ÌA¢E…8[â²zA}ê [ø«QѹšEÑóEÏ=ØJAB¥ °(—..~DûØT´“ú1è]ƒ0„JA¡žu¨ì1K6A%§:åtÐç'Apt#$ˆ¸½ì+ÆlÒrWŒN‡uóŠU=H+zˆïÿZ6 T´q1CˆëÎ!Ö,+B¤IWéxƼVõöveÙœŠ@=$Þ$3vÔÁ™tÓì×iîm,'“‹P’¥Åž»§ÊÂýÎŒ=ÍNäCïDŽìÉ%(‹Ê’¤D:HéóaÛ¯J²¾70LAÍWõ‘ɆÙ,=«™ZC ‘Zâ²ÅîXÞñùù”¥†êJŒi\Ö{9¹LŒ¢<5£–øu±PŠTœ˜ ÉqŠL(BZ¬(¯}z5e®6³=ŠùîéîÝã` ‘}~ Lkôæ¶“ÊÞ² R¶§©Z»‘ési I0Œl³ÄÈv6ú¤$¹çŸµá$s2š çïZÎr—üY¢´¿·×Ï®¶b6sDùå/&9›Vþв˜ƒIcîÒÉ_•ìå.¼Ñ0}¼Ö.äŠG–5þRg-k|œ+~yÛ³êÕ4ñ÷¶K²ÃöcÕŸ mpÆðþ´µ—´z¬^éRª‘ÿÝ+>‹áÕÄïT³œè$ç{„hd.3¯")ÃHª€ad›¥·š(!å‰Ý•yJ’Lïnþ§ÄiÝÕés5EAÕ™Õ]™±q¸À1Iò£¨ÔÃQ²ó#ºÓ§sŒèÀ—ÑëHæ *ÕÏç^PçK™LçÕ&’‹›Ïæ^ñ­3˜ÌÝÔH ä+üû¹ÜpÖŒ,•{“¢`›„ýW2¹·I“þã‰Ü+j zÞÎý¿+{=¢zŒ&sGwîwNݹßó¼ôº¢ì•LíËþž(¢¢¹¼šÜ‰ßY’lï¦Xi*v›·]Ú%eôgÏÒ¾›VÎßnõÑ øÕŒò.!¯® f¸oaïc7,Fa – g·Ý¼7;æ¸'ßÞ‡Ðq˜Þ^tZüßÍ?L>A¼÷š(‘;D‰×[‰ÜQÎ4/æƒ,s}ƒ/IæúÒþ7”‹Õ4ñR2HrÎ7Éð’'°/“¡+q<}G“äÉ×ËùÞ1K°9¯L¸˜‘íüñÆCIÜ[éß)ÃH Ä0Ò×× 5æÒÀ¯OЖ.}VúI»™|ñ˜ÎïËJ•‹ºh({ÛU-4FÒ¾gt#rˆÎúHò½—s¸w#dõ¡a}YÞÛIÞ1›H>©‡·O9»»8<†’ÇÇê(èËêáv8ýB ø¸§4t‹ªÙÝHèŽáÄïÅt牞ÈÌÛ;¥#Ý{¡‰û2Ç3æA˜ä½®„ž|ñE%¶•…IÛƒfó¿»sü™c^#Ÿ;ÆÒ¾GZèIûžšØJ¼Þ™Å]ÉÞy­´•ÿGs·Ëu×Ú³Á˜ÈØTÑ“±½¨Š\—éµ­ êOºè‡äð0t]ë™Ò #úS¬3¤1 Œp膺’„ìèÊŽ^H«Ža$b§RòȨÂ]IØQO¦.KÂŽ©´ï0®k– ­ç¢ ê˜É×îQÍ×Õ“éÖ•[›J·®1%ÿ2c3®3‰×ÙèO³îè‡04 ¡º{)„ ü¯®ôêI¦tŒ¥WO0ePTa¬›$Ùz_jó8-:fÀ‹ðVÐ*àØOíDb•$~» 79:’¡s¡cnИƒ[¿Aš1#Í1%.G5s¹4÷9æ)\å)ŠÅìßRT: ú²ª•£šs\˜ïÔå2üü >"÷¡½ÐA!J¦þß–à¼Ì&çy7Êáë\‹Ù±!NEÖJ¡î³ßMåHÿ¬Ñg²ñ¼ë˜Í‘N’« s¢]ùÅ^¬<›ÑhJrt’5ãÉÑ #Æ“£39¸çÒ­CRí&#„­Po dEÏÂ@Vôœ?¿‘n?¿nã¾ ÄÐG§÷}¸…ô`ó9Ås¥ÉÐ+ܘM´®ù0›h]Ñ=BNIzîÑ1TgïCùÄÝ Aô&3FÓ«Gù™‡Ó«Sf ¦W™ÁQw¶ê*a‚r43K”c(§xÊŒ_È×þÌ|çóµ?£KF›¼ˆ¢VB5º4å9&’’{vÌ$%÷ì˜Í×~“XŸãùÚí6®ãÍ<2o5H_Xµ\áèNEÎe"Gw*r޵<êbvŒdiOÙ1”¥²¯Ê†E†4áø… ç+í-ÃÎÍ2ál†s“Ko$9%ÿ'2¿«Á!&›ƒ0žØ<|4›Hl¾Ò:Ó™Ò!ªsB˜5:×øÄà“‰¼³œÊ©Ò1”Ï<¥†Üì 5&<Z Ÿ¡•Ÿ${4&3›]ù§1/³ã’¤;çÎ%Iÿ C¦\O¯†§¾d/o¦æ†${y³ ÌgH_Ìøi2Cú3–›Ï¾ì6WoEÒÖD÷ò+—õÔå²ÌåçB/b ±zN†Äê9!bóT’·\˜¶Å4æ9ËQNZÞ‘³å¤å9Ë1n)‹þ¨g,ïNX&cyžq f5u)-Ï®…®<å(å-ïÉSŽvÚpAÖpÌ&8×8 ¿n‹²j‡ÇÓxªÍ-,ûL&ÇdnrƒÄdnrƒDmå"ox¨æ"g_hË'Ç<ÅaŸÛsúaé(J¹ÇÇr™ÆÉº¹ºÑÌø-Iøß yÎÇÌ“üE 1¾I5Ž$×øXªqs}÷¤ Ç$^Ã1„ÿ7µøpjñr*qÆYèO%ÎdãÆd2o?¼[4æàìÞämîÅŽö¦ñN³xcIFR òÏp¦pä]l S8fŒï.*ëL‚ñ+¤âõ°¾Ìàìsÿ0/÷~‡ó{£Q6ún’¡Ý7—<âìÙµÜøŽÍnüžã0kŒ-Žv¢SÔsç Sf£œu»#é6¦VC2ǰú³‰¾QH–Ý—j³yÂݵùDßhÁEÃhbïÿéÝÅâPÇ ûd‰¼ë‰¶1•˜Ûªc:OxHRü™Ë^މ¤ÜAƒ¹½ã–CW%Ji¶Ñ“‡» GKaâFìM°Ñ¼Ü‘÷JnHópפ(‰ÿô¤ÝF1ï¶<½6êQšmDy¶GÓl£37«ñ<fÓjÛ¤›“iµÿ~Y:Ójÿá²h£;öï¥ÅNÔÑÒeÍÆHì €©ÌÜ€¢'K6Æ’XGúø…´Úv[òšT¢;+6zsh³ÊèÍ¡”IlŒfÁŽ41š›j‚We²^WRZCžõz€äOO’kŒæ°ŽÀiô&µF_Öê‚^>’Ä:œ›˜IbmåèKZ]bšå¨†(ßtCVÔ—“%•®Ôøô䠦ɃC*iŒåœ¶Ç`¢¼ÏÍ´Ñ«ˆ.s¹Ž%)¥;rPWRH£;S4#€•ô§Œô EAœ"z }ôŸ¾ŒÐHÊž,Ô‡<ÇsIŠpœ6“ÏýÓ›mhœ~”ÍãŒÞ,Ϭ±”MíÜÎÝŒÙÄÏÇo扔Í&uçÏ<Œ‘4͉&2>%¬qç_Í·Ü™ÄÕföfŒ%XN´1–ì¹aËPÚf´s)·0c4ÙsB %Î×LÖ9‡ó5ß&TÆd¾f³¸ØB5«ôlåP¢f Àh¢æ€¢œ¡™Ë§Œî ÍŒz34³™™ÿs —[”ðšÅœÌ¿pY@’%cþ…„ËXž„µ„ÌâìËæX.K¾ox’Dx0g2䉙K ‰£ù–!MË\ÕB¢Öhù'ކ-726·2,ŒgX&bÄrQjå\ŠÔÊ©Ô÷•ÞäȱRX5—2S,ïG–æøg$_2Ÿo™šÜ™=̵þ´ÉàTº³c QrŽ@?„µ¥ H†ÜN‚ ›þøÖYªtžãÚOX7KjëÒ×òR‘ãP"Ä8ôßÚü[›kóomþõùNËŽ£$5 ›‡ ¯þUP>‚=ÑШÃå¿Ãœßé¤(M>|›«ßbÎ%½dë¾Gk)ðH)ô|ÒTq%’#ç´(×á sN Ëç;¶…„ó&2‹ÛIai½çcJìAt“jÚHø8Eù¯ªÎ¼¨Ôƒ—qÍ™§ ¦S`drOí³û@&Ô¦Dß}'·½Ëžk"¦œ~TK®†Îø`5 EÖHy‹áVï™ò_‘áéÖŠÂíG¬UÉ•ø6$÷‡ÿw|'wäMLy*=U{²¾ëÿá±ë¹¾ìOÿÿ¯ˆÝÀõ golly-2.5-src/Patterns/Codd/echo-discriminator.rle0000644000175100001440000000533112156145314017155 00000000000000# Echo discriminator # from: # Cellular Automata, Edgar F. Codd (Fig. 5.13, page 78) # # The 'sense' operation is used to read the 0/1 state of the cell # at the end of an arm in Codd's CA. It returns an 'echo' signal # 60/70 respectively. The configuration shown here can be used to # discriminate between these two echo signals. # # Set the machine running. A periodic emitter in the lower-right # activates the machine by turning on some gates. Later signals are # blocked, as the machine is now waiting for an echo signal. # # The first echo *must* be 70 else the machine doesn't work. Stop the # demo and manually add the 70 signal to the input line at the top- # right. Both the lower two output lines on the left emit a signal, # indicating that '70' was detected. The machine then resets itself. # # Now manually add a 60 signal to the input line. Notice that now # the output signals are seen on the top and bottom output lines, # indicating that indeed a '60' signal was detected. # # The input signals must be well separated, else the machine fails. # # See sensing-demo.rle for a demonstration of how sensing works. # # Adapted from a pattern originally distributed with XLife: # esr "Eric S. Raymond"@snark.thyrsus.com Thu May 11 07:41:55 1995 # x = 119, y = 57, rule = Codd 69.30B$68.B29AB$68.BA27BAB$43.26BAB25.BAB$42.B27AB19.7BA5B$42.BA21BA 3BAB.6B11.B13A$42.BAB19.BAB.BA2B6AB10.BA12B$42.BAB16.2B.BAB.BAB.BA3BA B10.BAB2.B$42.BA11B5.B2A2BAB.BAB.BAB.BAB10.BAB.BAB$42.B12AB4.BAB.BAB. BAB.BAB.BAB10.BAB.BAB$43.11BAB4.BAB.BAB.BAB.BA2B2AB10.BAB.BA5B$53.BAB 4.BA3BAB.BAB.BAB.2B11.BAB.B6AB$43.11BAB4.B5AB.BA3BAB14.BAB.BA4BAB$42. B12AB5.4BAB.B5AB14.BAB.BAB2.BAB$42.BA11B9.BAB.BA4B15.BAB.BAB.2BAB$42. BAB19.BAB.BAB18.BAB.BA2B3AB$42.BAB20.B2.BAB18.BAB.BAB.3B$42.BA25BAB 18.BAB.BAB$42.B27AB18.BA3BAB$43.26BAB18.B5AB$68.BAB19.4BAB$69.B23.BAB $81B5.5B2.BAB$B80AB3.B5AB.BAB$59BA11BA3BA4BAB3.BA3BAB.BAB$58.BAB9.BAB .BAB2.BAB3.BAB.BAB.BAB$43.16BAB9.BAB.BAB2.BAB3.BAB2.B2.BAB$42.B17AB9. BAB.BAB2.BAB.3BA7BAB$42.BA11BA3BAB.6B2.BAB.BAB2.BA2B12AB$42.BAB9.BAB. BA2B6AB.BAB.BAB2.BAB.11BAB$42.BAB6.2B.BAB.BAB.BA3BAB.BAB.BAB2.BAB11.B AB$42.BAB5.B2A2BAB.BAB.BAB.BAB.BAB.BAB.2BA13BAB$42.BAB5.BAB.BAB.BAB.B AB.BAB.BAB.BA2B17AB$42.BAB5.BAB.BAB.BAB.BA2B2AB.BAB.BAB.16BAB$42.BAB 5.BA3BAB.BAB.BAB.2B2.BAB.BAB16.BAB$42.BAB5.B5AB.BA3BAB5.BAB.BAB13.2B. BAB$42.BAB6.4BAB.B5AB5.BAB.BAB12.B2A2BAB$42.BAB9.BAB.BA4B6.BAB.BAB12. BAB.BA4B$42.BAB9.BAB.BAB9.BAB.BAB12.BAB.B5AB$42.BAB10.B2.BAB9.BAB.BAB 12.BA3BA3BAB$42.BA15BAB9.BAB.BAB12.B5AB.BAB$42.B17AB9.BAB.BAB13.4BAB. BAB$43.16BAB9.BAB.BAB16.BA2B2AB$58.BAB4.6BAB.BAB16.BAB.2B$59.B4.B7AB. BA18BAB$65BA5BAB.B20AB$B65AB3.BAB.20BAB$67B3.BAB20.BAB$70.BAB20.BAB$ 71BAB20.BAB$B71AB20.BA23B$72B21.B24AB$93.BG22BAB$93.B.B20.BAB$93.BA 22BAB$93.B24AB$94.24B! golly-2.5-src/Patterns/Codd/echo-switch-demo.rle0000644000175100001440000003443112156145314016534 00000000000000# Echo switch demo - Codd's CA (Fig. 5.12, page 77) # # In this demo, an 'echo switch' is shown, connected to a tape head on # the right. The output of the echo switch passes into an echo # discriminator, which emits a signal on the line marked 0 or 1 # depending on the cell state under the tape head. The echo # discriminator also emits an echo receipt, which in this demo is passed # through a stack of coders in order to advance the tape head by one # cell and to read the next state. # # For the pattern to work correctly, the input signals must be # sufficiently well spaced. The first signal must be 7, and the first # echo must be 7, so the first tape entry must be 1. # # The other demos in this folder show components from this pattern. # x = 370, y = 659, rule = Codd 128.29B$127.B29AB$127.BA27BAB$102.26BAB25.BAB$101.B27AB19.7BA56B$101. BA21BA3BAB.6B11.B64AB$101.BAB19.BAB.BA2B6AB10.BA62BAB$101.BAB16.2B.BA B.BAB.BA3BAB10.BAB2.B57.BAB$101.BA11B5.B2A2BAB.BAB.BAB.BAB10.BAB.BAB 56.BAB$101.B12AB4.BAB.BAB.BAB.BAB.BAB10.BAB.BAB56.BAB$102.11BAB4.BAB. BAB.BAB.BA2B2AB10.BAB.BA5B52.BAB$112.BAB4.BA3BAB.BAB.BAB.2B11.BAB.B6A B51.BAB$102.11BAB4.B5AB.BA3BAB14.BAB.BA4BAB51.BAB$101.B12AB5.4BAB.B5A B14.BAB.BAB2.BAB51.BAB$2.2A97.BA11B9.BAB.BA4B15.BAB.BAB.2BAB51.BAB$.A 2.A96.BAB19.BAB.BAB18.BAB.BA2B3AB51.BAB$.A2.A96.BAB20.B2.BAB18.BAB.BA B.3B52.BAB$.A2.A96.BA25BAB18.BAB.BAB56.BAB$.A2.A96.B27AB18.BA3BAB56.B AB$2.2A98.26BAB18.B5AB56.BAB$127.BAB19.4BAB56.BAB$128.B23.BAB56.BAB$ 140B5.5B2.BAB56.BAB$B139AB3.B5AB.BAB56.BAB$118BA11BA3BA4BAB3.BA3BAB.B AB56.BAB$117.BAB9.BAB.BAB2.BAB3.BAB.BAB.BAB56.BAB$102.16BAB9.BAB.BAB 2.BAB3.BAB2.B2.BAB56.BAB$101.B17AB9.BAB.BAB2.BAB.3BA7BAB56.BAB$101.BA 11BA3BAB.6B2.BAB.BAB2.BA2B12AB56.BAB$101.BAB9.BAB.BA2B6AB.BAB.BAB2.BA B.11BAB56.BAB$101.BAB6.2B.BAB.BAB.BA3BAB.BAB.BAB2.BAB11.BAB56.BAB$ 101.BAB5.B2A2BAB.BAB.BAB.BAB.BAB.BAB.2BA13BAB56.BAB$101.BAB5.BAB.BAB. BAB.BAB.BAB.BAB.BA2B17AB56.BAB$101.BAB5.BAB.BAB.BAB.BA2B2AB.BAB.BAB. 16BAB56.BAB$101.BAB5.BA3BAB.BAB.BAB.2B2.BAB.BAB16.BAB56.BAB$101.BAB5. B5AB.BA3BAB5.BAB.BAB13.2B.BAB56.BAB$101.BAB6.4BAB.B5AB5.BAB.BAB12.B2A 2BAB56.BAB$2.A98.BAB9.BAB.BA4B6.BAB.BAB12.BAB.BA4B53.BAB$.2A98.BAB9.B AB.BAB9.BAB.BAB12.BAB.B5AB52.BAB$2.A98.BAB10.B2.BAB9.BAB.BAB12.BA3BA 3BAB45.A6.BAB$2.A98.BA15BAB9.BAB.BAB12.B5AB.BAB44.3A5.BAB$2.A98.B17AB 9.BAB.BAB13.4BAB.BAB43.5A4.BAB$.3A98.16BAB9.BAB.BAB16.BA2B2AB42.7A3.B AB$117.BAB4.6BAB.BAB16.BAB.2B42.9A2.BAB$118.B4.B7AB.BA18BAB49.A6.BAB$ 124BA5BAB.B20AB49.A6.BAB$B124AB3.BAB2.19BAB49.A6.BAB$125B4.BAB20.BAB 49.A6.BAB$129.BAB20.BAB49.A6.BAB$50.80BAB20.BAB49.A6.BAB$49.B81AB20.B A23B34.BAB$49.BA80B21.B13AG.9AB33.BAB$49.BAB100.BA22BAB33.BAB$49.BAB 100.BAB20.BAB33.BAB$49.BAB100.BA22BAB33.BAB.17B$49.BAB100.B24AB33.BA 2B17AB$49.BAB101.24B17.18BAB.3BA12BAB$49.BAB141.B19AB3.BAB2.B7.BAB$ 49.BAB141.BA18B4.BAB.BAB6.BAB$49.BAB141.BAB17.5BAB.BAB6.BAB$49.BAB 141.BAB16.B6AB.BA5B2.BAB$49.BAB141.BAB16.BA4BAB.B6AB.BAB$49.BAB141.BA B12.3B.BAB2.BAB.BA4BAB.BAB$49.BAB141.BAB11.B3A2BAB2.BAB.BAB2.BAB.BAB$ 49.BAB141.BAB11.BA2B.BAB2.BAB.BAB.2BAB.BAB$49.BAB141.BAB11.BAB2.BAB2. BAB.BA2B3AB.BAB$49.BAB141.BAB11.BA4BA2B.BAB.BAB.3B2.BAB$49.BAB141.BAB 11.B8A2BAB.BAB6.BAB$49.BAB141.BAB12.8B.BA3BA8BAB$49.BAB141.BAB21.B14A B$49.BAB141.BAB21.BA13B$49.BAB141.BAB21.BAB$49.BAB141.BAB21.BA8B$49.B AB141.BAB21.B9AB$49.BAB141.BA6B16.BA7BAB$49.BAB141.B7AB10.4B.BAB5.BAB $49.BAB142.6BAB9.B4A2BAB2.2B.BAB$49.BAB147.BAB9.BA2BA2BAB.B2A2BAB$49. BAB147.BAB9.BAB.B.BAB.BAB.BAB$49.BAB142.6BAB9.BA5BAB.BAB.BAB$49.BAB 141.B7AB9.B7AB.BA3BAB$49.BAB141.BA6B10.BA5BAB.B5AB$49.BAB141.BAB15.BA B3.BAB2.4BAB$49.BAB141.BAB15.BAB3.BAB5.BAB$49.BAB141.BAB15.BA3B.BAB. 5BAB$49.BAB141.BAB15.B4A2BA2B6AB$49.BAB141.BAB16.4B.BAB.6B$49.BAB141. BAB21.BAB$49.BA5B20.105B5.5B2.BA23BA37B5.5B3.40B$49.B6AB18.B12A.G78A. G11AB3.B5AB.B62AB3.B5AB.B40AB$50.5BA18B.BA103BAB3.BA3BAB.BA3BA56BAB3. BA3BAB.BA20BA17BAB$54.B19A2BAB101.BAB3.BAB.BAB.BAB.BAB12.B41.BAB3.BAB .BAB.BAB18.BAB15.BAB$54.BA3BA2BA7BA3B.BAB101.BAB3.BAB2.B2.BAB.BA9B3.B AB40.BAB3.BAB2.B2.BAB11.6B.BAB.4B10.BAB$54.BAB.BA2BAB3.B.BA3B.BAB101. BAB.3BA7BAB.B10AB2.BAB28.A11.BAB.3BA7BAB10.B6A2BA2B4AB9.BAB$54.BAB.B 4AB2.BA2B4A2BAB101.BA2B12AB2.5BA3BAB2.BAB28.2A10.BA2B12AB10.BA5B.BAB. 3BAB9.BAB$54.BAB2.3BAB2.B4A2BA2BAB101.BAB.11BAB6.BAB.BAB2.BAB28.3A9.B AB.11BAB10.BAB5.BAB3.BAB9.BAB$54.BAB4.BAB3.4B2.B.BAB91.A9.BAB11.BAB2. 3B.BAB.BAB2.BAB28.4A8.BAB11.BAB10.BA4B2.BAB3.BAB9.BAB$54.BAB4.BA13BAB 91.2A8.BA13BAB.B3A2BAB.BAB2.BAB10.8B4.11A7.BA13BAB10.B5AB.BA5BAB9.BAB $54.BAB4.B15AB91.3A7.B15AB.BA2B.BAB.BAB2.BAB9.B8AB9.4A8.B15AB10.BA3BA B.B7AB9.BAB$54.BAB5.14BAB91.4A7.15B2.BAB2.BAB.BAB2.BAB9.BA6BAB9.3A10. 15B11.BAB.BAB.BA5BAB9.BAB$54.BAB18.BAB85.11A23.BA4BAB.BAB2.BAB9.BAB4. BAB9.2A37.BAB.BAB.BAB.B.BAB9.BAB$54.BAB18.BAB91.4A24.B6AB.BAB2.BAB9.B AB4.BAB9.A38.BA2B2AB.BA2BA2BAB9.BAB$54.BAB18.BAB91.3A26.5BAB.BAB2.BAB 9.BAB4.BAB48.BAB.2B2.BA2B4AB9.BAB$54.BAB18.BAB91.2A31.BAB.BAB2.BAB9.B AB4.BAB48.BAB5.BAB.4B10.BAB$54.BAB18.BAB91.A32.BAB.BAB2.BAB9.BAB4.BAB 48.BA7BAB15.BAB$54.BAB18.BAB125.B2.BAB2.BA11BAB4.BAB48.B9AB15.BAB$54. BAB18.BAB120.9BAB2.B13AB4.BAB49.8BAB15.BAB$54.BAB18.BAB119.B10AB2.BA 12B5.BAB56.BAB15.BAB$54.BAB18.BAB119.BA9B3.BAB2.B13.BAB56.BAB15.BAB$ 54.BAB18.BAB119.BAB11.BAB.BAB12.BAB56.BAB15.BAB$54.BAB18.BAB119.BAB7. 5BAB.BAB12.BAB35.22BAB15.BAB$54.BAB18.BAB119.BAB6.B6AB.BA5B8.BAB34.B 23AB15.BAB$54.BAB18.BAB119.BAB6.BA4BAB.B6AB7.BAB34.BA17BA3BAB.8B6.BAB $54.BAB18.BAB119.BAB2.3B.BAB2.BAB.BA4BAB7.BAB34.BAB15.BAB.BA2B8AB5.BA B$54.BAB18.BAB119.BAB.B3A2BAB2.BAB.BAB2.BAB7.BAB34.BAB11.3B.BAB.BAB. 2BA4BAB5.BAB$54.BAB18.BAB119.BAB.BA2B.BAB2.BAB.BAB.2BAB7.BAB34.BAB10. B3A2BAB.BAB2.BAB2.BAB5.BAB$54.BAB18.BAB119.BAB.BAB2.BAB2.BAB.BA2B3AB 7.BAB34.BAB10.BA2B.BAB.BAB2.BAB.2BAB5.BAB$54.BAB18.BAB119.BAB.BA4BA2B .BAB.BAB.3B8.BAB34.BAB10.BAB2.BAB.BAB2.BA2B3AB5.BAB$54.BAB18.BAB119.B AB.B8A2BAB.BAB12.BAB34.BAB10.BA4BAB.BAB2.BAB.3B6.BA38B$54.BAB18.BAB 119.BAB2.8B.BA3BA14BAB34.BAB10.B6AB.BA4BAB10.B39AB$54.BAB18.BAB119.BA B11.B20AB34.BAB11.5BAB.B6AB10.BA37BAB$54.BAB18.BAB119.BAB11.BA19B35.B AB15.BAB.BA5B11.BAB36.B$54.BAB18.BAB119.BAB11.BAB53.BAB15.BAB.BAB15.B AB36.A.2A.A2.A.A2.3A2.A2.3A$54.BAB18.BAB119.BAB11.BA8B46.BAB16.B2.BAB 15.BAB$54.BAB18.BAB119.BAB11.B9AB45.BA21BAB15.BAB$54.BAB18.BAB119.BAB 11.BA7BAB45.B23AB15.BAB$54.BAB18.BAB119.BAB6.4B.BAB5.BAB46.22BAB15.BA B$54.BAB18.BAB119.BAB5.B4A2BAB2.2B.BAB67.BAB15.BAB$54.BAB18.BAB119.BA B5.BA2BA2BAB.B2A2BAB67.BAB15.BAB$54.BAB18.BAB119.BAB5.BAB.B.BAB.BAB.B AB67.BAB15.BAB$54.BAB18.BAB119.BAB5.BA5BAB.BAB.BAB67.BAB15.BAB$54.BAB 18.BAB119.BAB5.B7AB.BA3BAB67.BAB15.BAB$54.BAB18.BAB119.BAB5.BA5BAB.B 5AB67.BAB15.BAB$54.BA18B.BAB119.BAB5.BAB3.BAB2.4BAB67.BAB15.BAB$54.B 19A2BAB119.BAB5.BAB3.BAB5.BAB67.BAB15.BAB$54.BA2BABA9BA3B.BAB119.BAB 5.BA3B.BAB.5BAB67.BAB15.BAB$54.BA2B3A2B4.B.BA3B.BAB119.BAB5.B4A2BA2B 6AB67.BAB15.BAB$54.BAB.2B3AB2.BA2B4A2BAB119.BAB6.4B.BAB.6B68.BAB15.BA B$54.BAB2.BABA4B4A2BA2BAB119.BAB11.BAB75.BAB15.BAB$54.BAB2.B6A5B2.B.B AB119.BA13BAB75.BAB15.BAB$54.BAB3.3BABA10BAB119.B15AB75.BAB15.BAB$54. BAB5.B14AB120.14BAB75.BAB15.BAB$54.BAB6.13BAB133.BAB75.BAB15.BAB$54.B AB18.BAB133.BAB75.BAB15.BAB$54.BAB18.BAB133.BAB76.B16.BAB$54.BAB18.BA B133.BA95BAB$54.BAB18.BAB133.B97AB$54.BAB18.BAB126.A7.97B$54.BAB18.BA B125.3A$54.BAB18.BAB124.5A$54.BAB18.BAB123.7A$54.BAB18.BAB122.9A$54.B AB18.BAB126.A$54.BAB18.BAB126.A$54.BAB18.BAB126.A$54.BAB18.BAB126.A$ 54.BAB18.BAB126.A$54.BAB18.BAB126.A$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B A18B.BAB$54.B19A2BAB$54.BA3BA2BA7BA3B.BAB$54.BAB.BA2BAB3.B.BA3B.BAB$ 54.BAB.B4AB2.BA2B4A2BAB$54.BAB2.3BAB2.B4A2BA2BAB$54.BAB4.BAB3.4B2.B.B AB$54.BAB4.BA13BAB$54.BAB4.B15AB$54.BAB5.14BAB$54.BAB18.BAB$54.BAB18. BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B A18B.BAB$54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.B AB.2B3AB2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54. BAB3.3BABA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB $54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54. BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.BAB. 2B3AB2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54.BAB 3.3BABA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.BAB. 2B3AB2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54.BAB 3.3BABA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA3BA10BA3B.BAB$54.BAB.BA4B3.B.BA3B.BAB$54.BAB.B 5AB.BA2B4A2BAB$54.BAB2.4BAB.B4A2BA2BAB$54.BAB5.BAB2.4B2.B.BAB$54.BAB 5.BA12BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA B18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18. BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B.BAB$ 54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.BAB.2B3AB 2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54.BAB3.3BA BA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B.BAB$ 54.B19A2BAB$54.BA3BABA8BA3B.BAB$54.BAB.B3AB4.B.BA3B.BAB$54.BAB2.2BAB 3.BA2B4A2BAB$54.BAB3.BA2B2.B4A2BA2BAB$54.BAB3.B3AB2.4B2.B.BAB$54.BAB 3.BABA12BAB$54.BAB3.B16AB$54.BAB4.15BAB$54.BAB18.BAB$54.BAB18.BAB$54. BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B.B AB$54.B19A2BAB$54.BA3BABA8BA3B.BAB$54.BAB.B3AB4.B.BA3B.BAB$54.BAB2.2B AB3.BA2B4A2BAB$54.BAB3.BA2B2.B4A2BA2BAB$54.BAB3.B3AB2.4B2.B.BAB$54.BA B3.BABA12BAB$54.BAB3.B16AB$54.BAB4.15BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA3BA2BA7BA3B.BAB$54.BAB.BA2BAB3.B.BA3B.BAB$54.BA B.B4AB2.BA2B4A2BAB$54.BAB2.3BAB2.B4A2BA2BAB$54.BAB4.BAB3.4B2.B.BAB$ 54.BAB4.BA13BAB$54.BAB4.B15AB$54.BAB5.14BAB$54.BAB18.BAB$54.BAB18.BAB $54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54. BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA2BABA9BA3B.BAB$54.BA2B3A2B4.B.BA3B.BAB$54.BAB. 2B3AB2.BA2B4A2BAB$54.BAB2.BABA4B4A2BA2BAB$54.BAB2.B6A5B2.B.BAB$54.BAB 3.3BABA10BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B .BAB$54.B19A2BAB$54.BA3BA10BA3B.BAB$54.BAB.BA4B3.B.BA3B.BAB$54.BAB.B 5AB.BA2B4A2BAB$54.BAB2.4BAB.B4A2BA2BAB$54.BAB5.BAB2.4B2.B.BAB$54.BAB 5.BA12BAB$54.BAB5.B14AB$54.BAB6.13BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA B18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18. BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$ 54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.B AB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB 18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.B AB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BAB18.BAB$54.BA18B.BAB$ 54.B19A2BAB$55.4BA10BA3B.BAB$58.BA4B3.B.BA3B.BAB$58.B5AB.BA2B4A2BAB$ 59.4BAB.B4A2BA2BAB$62.BAB2.4B2.B.BAB$62.BA12BAB$62.B14AB$63.14B! golly-2.5-src/Patterns/Codd/extend-coder-demo.rle0000644000175100001440000000203612156145314016674 00000000000000# Extend coder - Codd's CA # # This coder generates 7-6 signals, causing the output line to extend. # # Initially in the unsheathed state as it would be after construction, # the pattern is first sheathed by the 6 signal, and then repeatedly # triggered by a 7 signal coming from a periodic emitter. # # Four gates are required for the machine to function correctly. One stops # the 7 signals from entering the lower section the wrong way. One stops # the 6 signals from entering the upper section the wrong way. The other two # stop these previous gates from being turned off. # # See construction-arm-demo.rle and golly-constructor.rle.gz for examples of # construction. Other demos show gates, sheathing and signals. # x = 54, y = 20, rule = Codd 34.5A$34.A3.A$.5B28.A3.A$B5AB27.A2.2A$BA3BAB27.A3.A$BAB.BAB27.A$BAB.B AB27.A$BAB.BAB21.13A$BAB.BAB21.A11.A$BAB.BAB21.A11.14A$BAB.BA9B13.A 11.A$BAB.B7A.F24A2.A$BAB.BA9B11.A6.A6.A$BAB.BAB19.A6.A6.A$BAB.BAB19.A 3.A2.A4.3A$BAB.BAB19.A3.4A4.A.A$BAB.BAB19.A11.3A$BA3BAB19.3A6.4A$BAG. 2AB19.A.A6.A.A$.5B20.12A! golly-2.5-src/Patterns/Codd/gates-demo.rle0000644000175100001440000000170012156145314015413 00000000000000# Gates in Codd's CA # # Signals can be stopped by the use of cells in state 3 embedded in # the sheath to the right of a signal (relative to its direction of # travel). A gate to the signal's left allows the signal through. # # The wire below shows two gate cells on either side of the same point # on a wire. This configuration has the effect of transforming signals # into 7-0, whatever their initial state. See coders-demo.rle for coders # that work the other way round. # # Gates can be constructed by injection of a 7-0 signal into the side # of the wire to be gated. In the pattern at the bottom, a 7-0 signal is # diverted to gate the wire. Only one 7-0 signal ever makes it to the # dead end, the others are blocked. # x = 50, y = 27, rule = Codd 25BC24B$BA.D2A.E2A.F2A.G33AB$36BC13B4$30BC19B$BA.D2A.E2A.F2A.G33AB$ 30BC19B6$7.17B$6.B17AB$6.BA15BAB$6.BGB13.BAB$6.B.B13.BAB$6.BA15BA20B$ 6.B36AB$7.26BA10B$28.B3.BAB$27.BAB2.BAB$27.BA4BAB$27.B6AB$28.6B! golly-2.5-src/Patterns/Codd/golly-constructor.rle.gz0000644000175100001440000001257712156145314017534 00000000000000‹‹¬5Igolly-constructor.rleíœÝoÛFÅßõWpÑéb5RR»)¶‹uÛD»À>Û>,öMµéX­-’Ü4ÿ})Ù—¿ï çãÎÌ’Ò¼¢Æ—?žsfH©ùìûÿý÷?o³7»o_Ì_½9Ÿ?ñj6ùlòY¶ØÜÞ~Ê.7ëÝ~{¹ßl³Õ:û~suõl—}q<äÿ›ÍÝ¡ºYgû›<Û®Þßì_Ü,×WY^üÝ\«·«už}ñëýnŸí?}ȳgw³gÍíò}1ÈᘻååÍá°íýz½Z¿ŸåâÏÏ7«]VüYfWùݱå~Uü®ÇËÖµËå‡å/«ÛÕ~•ï<6ZŒ2{söuÑð4»XOçzõþþi Ëüövw8‡Ý~¹Ï³Ù±±—Åpëì—üðöò·äW‡Ãö‡ž®—»›âýÓ#„‹ë}¾­4ó<ÛÜd»Õûõ²{¹Í‹7þš?ްß›_ç³Ë}ñÖu1Æý®8ëcýáÈCsÛü2_ý^ ýÅífóÛ®àø[ïo»ÕîÛÍÇ|ûâ6¿Þ?ô¹]çÛi-Ï®WÛ‚ö®¸xg/^>6Sô²¹/ÎïðîÇ_þ<ÛÝäËâ¬Öï‹AVûl¹;ü÷ý&ßM.Àò¶øE»Ó÷dÅ9pîwÅ ]º8¼´)þ³-Fx<ë‡>vyåê䜎óü©Ÿ7«Ë‚}¯ºeYþûázÔPM³#ò?^‡üå݇ۼÒÛUÑùúپؗòÓñÄ#_ßß>?œØQ‡Å¿ . ©ì6wùÉ¥*ñ|Ül¯²gG<{¸Î?åù7ÙO—ÛÕ‡ýîË‹‘7ë/ï–¿å/R{qâ“é‡OYÜGl¿É~^Ýeÿºßÿû~u7½9þüÏ÷wËÕíôrs÷bð?²o³G÷eŸŠŸ_ÍžV(NìÛ£Ž'Åkgç³éÅìåôâüøçóCéõÙôë‹×Ó7Åß–—.Š?¯•‡—']¯Ÿµ½y6;y+½8é}µëÅ7Õ—&O¯vË×^ÌOßYyõüpÀÉ‹“ÞW‡_¤SyS¼vøu±=À|xÛWÅaó§³k­Mº|ýpòlz6{:böò8Âùìì»ÏçÓw'ßÖ~þ¡o2pÀ»¡û““ÂâñﻯNŽXœ¼H#¾=iõXŸ´¸¨ýZ¥VO¾å\ßR'õ-û}.&Ö·½µu¢¼?;Àœ!Öþ˜«&`’ª±˜ Ó¢>ÈЃ[n²õnûÒ8ì.¶äb0“0˜PÅDi¾9í$áŒE'Ñzy&`ÒÎ„ŠœÓJWžTæ•–×SÎØ„:‹]¹LÀÄ :ˆ3À¢Î„u[Òvœ÷dC';IÅ;È0I„ 9à.ômáb_.01Á„j,&é c[™ ÂL6t¢0 $êä ˜„É„j,&J©Ïy¦N²¡¤½\ƒ ˜´@5­5ý<ÊdK¹xGaLÀÄ6ª±˜ †x}­%z˜É–@'2 ƒI¢LÊA8oè ëÓ<Ñëx’-¢Nàž}0ÓL¨Æb2¸‚®½çïy"'ÙìD¦báb0‰ƒI9ç Ù[w±Ö‚8±d“Û ¼ÃÜ0aì#cÑ k=+F±p1˜ÈdB5“Î,­mË( /ORìÞAž€ {¿„ó†ÞÈÄg^¡u¦báb0q„jøîV:À;È0)÷©Æb2µA*ÇEš'át‰báb0ÑaB5¥¤›0Œ0OäuïXò˜HdB5­µ[ây⯓H ƒÉi‘3@#¸º¼SI®–×SÎëÀ;®¼&˜ÐAœu&¬¥UÛqÞ]a'©(.Ž’ 9`¥$±xÇ—wÀD ÕXLÓ±­äM˜.–ßIªŠ…‹C`Òš+øôMp'ðŽï€ÉSÅDk]2ÒŸߋbRƇÉ`LÔÑZf„ébkÈÐ ¼““rÎzãàÔ;Úq‹GwÅÂÅÖ˜PÅDùfÁ»w丘݉LÀ;!2)ἡÓÝuÅjMꉹ˜åj(Lûp±ïNÂÐ ¼# ÕXL°¢6Ø  wì—ƒpÞÐkJ<Ýâu¦Nà L¨†OšlwÅ&ëâÒd&ÊËÎÓz¤Þ:0À; ‡‰’—&Œ#ôN¯‡ Ø˜´z¦‹‰Öü“ؼ©NRôN¯7æM+Tö»tÒº6ëÚÆá(6X+[€³R´€wÅë$Dàe©Ÿî'œöP¬T÷*kû¦’Õ‰<ï´*Or XÎ>žÛ P,tâÈ;¥ñ)mS€Þ¯N„Š-ἡWp§:Ñœ÷¹:1䪱˜(O©ÞuÂV¬Ì«#_±©ß:N´sEÌÕÁ¼c['q¸ëX¦N¼:£çÒÕ‘Þ'ââò2ö Þs¶H®ëj…ûÜÞÿ+ê^…ó9 ÅÚ¿:½ô‡à{ÿ^Å*'›2dNž BŽôuXŠuÃ$ŽŒÅªÀ–§œ¯c­x§L]Ì;#¯ŽûyÇ‹‹±Ží¸ìÖ×±2]Üëj܇êâÊeìЊ‹Ùá|ºí»:½áÜwu™‹å¯ÁL´˜PQãÉÆN81ÏÙЉF'ÈÍÁ$&T”ÁD+¤ç ³–¡‰%›³NbõòÄ*Ê`¢Ht:£i.ÉÅø÷¨ábcL]î”I¯ËÃxF-ÏÅ𼓨wdèDžw:•Ç'’¥r ¬ÖªÑd'øÌKC'½‰6æê4ÖüÆ’-Ñ‘D²!ÙlÔ‰Üd“§ä‰!&y“E‰uïôÆ…lîD†b#t±– Å0YÔ™XWl§ åzGËCr‹u,Ö±]t`E'x§Sêa0aKýt+óSÚÑi/ïêXQ,+¼ÃeÒªh««¥ðvr—áD'“ŠÞ¼3ŠIE¹NtÂR.kN±ŠH{%&½«+:ÑZcU0¬“йŠa’ÒS ™W§W?ò“­7ÉT®[?t:Æ+#O›‹ÁLœ0¡Z$LÑéìIÎàbPÞ3%tÂïy¢9 ˜„À„Š‘0QZA×·‘~‚@'ÈÞI„ Õ"aÂJ¼HŸ‚ÊO6¸Ø’‹ý3aåH8L”VNF½£•#V:qž'ê$ŒÒ¾s#÷.`.nÛO(OÀ$&T“‡ŸgÂïwä¤}Ä$àÁýó$&T“'×Wt"'Ù:靖w"‡‰³N'Šû 3¡˜WÐIÞQ^†:OûÎeh¤Š•½>0 ‡ ÕÀ„7@c6»¶ïœœw"‡IBÈóòL"bBE0ὡ÷FJVÆjMV:‘Ã$œN"ôòLÞÕŠ`Â{æ¨ÓÞX'ðŽâ~ÂL¨&Lô†0gë,O38¼d3ÞI ŠMÔÅT¦Nl!$›À;f˜P L˜:Ñ (/.n (™yb¬(6TS L˜:ÁJI@ÆÖ·uï´3¡"˜ðt2˜7b\,ð_²5Ί9€5&Z¹9­\“'‹:X­\Až Oûå `ÂÓÉຄ¶Þó¤Œïà~'ød£˜ðö+1!Â;.V^fÈÍ“ðt¨wXqVÈõŽVÈL6¸x¼b[™°lŸö*`.Ú;Ê«khÝ̃։ïôš3Q&½ælû®…Å*{‡eN§ybýêUl¯Ée‚Ðp'‰è„í¥„˜°½$Ë;Z–ÕNœ_7Še{†öãZ³)»¸uþ‘éíùŸª4­~ÚÛ÷NïÚ¬këÅ;­Ö°Ú‰ÿ«£e|š¯æb¶¼?·/-`½“0tB57: ƒ ÒžÙ‰¼«Ó4gÀÈ;ô¬í¡íŽÀL‚`B50ÑÔÉàÂÇûھщöta¼9Lê.ÖØ0á2¡"˜èé$ ;/í;°ç¹ŒV,\ &r™P L4uÒ:!©l'[ç|„´wЉÅÂÅ¡0¡ƒÀDo€2›ÃÉÖÍ‚ÌdsÑÉwŸÏ_½9Ÿ}÷—ÉŸ Lj»golly-2.5-src/Patterns/Codd/Goucher-replicator.mc.gz0000644000175100001440000036750612156145314017403 00000000000000‹HDòIGoucher-replicator.mctý[¯&É‘%Š½ç¯Ø€ Ì Ài„»›ßôÖ˜3:jaNë`Îzô,&ÉR+©ªb÷ô¿—¯enn汩F3*w|qñð‹¹]–-ûýoùÿýñÿôý§Ÿþý#ÿÃóŸ¾üŸþËÇùþ—¿þôí·o¿~ûéÿù—oýéǾþöãÏúøË×þüãÏß>~üy]ô‡?ü‡_?~øöÓOûéë/_ÿöÛ÷¿|ýíûÏë úÿÿË·_üÓÏßþðñõç?|üþo?þônÌÏ3?~ÿïÿø‡¯ùøßÿáãýþ·þüí—ÿø_¾þôÿÿåëÏÿÉŸð?¯;~üíǯ?}àQë?ß~þíÛ/¿~üöçoÖ˜ß}üö·_~Fë~üíãûÏÿðñ?þü ÷Z[øåÛ×ß¾ýúñ'¿^÷~üøëÇ/ûwÿîãßþüãÆ_ø ×ýþûoþøÃßÿ€Ûøü#Þý¿~üáÛ¿þøÃ·ß¾üðýçýö˺þçÇ­»•?þ¼~úúÑÿó³Ïü§Ø_´÷ñÇùõ·ßñ™ß^ýþ›ŸûáßøéÛÇ÷?~üöõ¯ß>N׳W×SÿõûOÿºZóv§üøëjøàý¸~ Õ×? #þ¼þ‹~X_·þÿ+îýý×_üáãû_¿ýÂÇéÇ~üòý7ö žðÿýÛß~ýaõ/oÇ·ýõûúÜü‡ïÿöó¿}ýå¿þøõø‘ÏX—|ûŸýŽFð ÿöã/ßì;ÿûnеm} †é×o?þ†ÑþúÑNç|üøG^÷ûù¶Õäïüãï>¾ÿrua¸Š—üì_¸N³ƒ~ùöÃ÷?ýüã¯kÊý^»õ‡ùáo?þöË¿£±8ñÓ·?þ†þýË¿üüõ/ß~‡Û´/~]}ýž…gþüÇï¿üE{ŠcùÛŸùöíã¯_ùí×ÿ?#ùëX4ø W¡U¿¢/ÿõ‡YÝü·ŸÑ£¸íÛÿüöÃßÖÚBc~þö?ûøïÿõÿ—õ’_ûåo?à…ñù¿®Zwò‰úŽú{TgÇê§uúß~ùñ7Îûßþüõ7í¤Ÿµ ¾ÿõÇÕ!¸%>z}ç/8mEâK¿ýò×5Pëò}óßþºfÌÇŸ¿þôGÜ÷]Gà\×{ÁØ øuÎÏ_Wgÿ° õýçoû¾_üŸñ#å2ýø·¯ÿ®íe¯ÿåO_^òDïáTýÆñýóš{{¶ýôõÇõæßÿí·ÿþ7]>?ûf»ºy­Ðß0|ìê…µ˜¹ê±hѬ_þáãŸ~Ûÿf›qß—üûþo”pß~ýõëŸÖ/?ýø/«ÿ¿ÿ_v—¥ýÿôÏÿô?þéÿÛ?ýÿõã?þðu5‹ø‡%…øë–ßV—RŒ>vË?ÿ?þw>ÂNüßþñ¿ýž°3ÿôÏÿ÷ÿú_þWÄÿñOÿë?ÿãÓ_÷Ïû×úþU޿ʧ_ùóþµÇ_ÏäÒeõÛ/«K÷¸éß¾ÿí'ŒÿÿçÄ õ;ï"]Y÷²üyOÊ5Îø~|ýå/ÿ /âJàšûëß~úuõìßùåÛ¯]›óùëzô/.ùþ¯ßþ²Mœ¦qÎØ¤äì×)¶þZ7,¹sv_ÐëÅÿöç÷;Ð̡߾ýüëÿúí>þ¯X½?ýûïl¬6¨¢”ø¿~?³è_X-ÿ®õýŸ~§‹å—ÿôgŠ«Ï—ýó÷_~û³]‡úu­£õ?}ÿùO§?bŠ®ýã÷ßÖ§¯õôýo¿ÿ “‚“h‹Olg#øøë/ß×KÖúÇ?®åz}KÛßÿô·oÿ7ýõ—54¶f}³\àC×2ÿ…kC_жÙÛ~]‚qI†µûíÚËoÖ®=b­ÙýÊŸ¿ýî;Mùþ‹.oÊ·=M~]¢æ_~5‰´:}w%þXßþ´†ú¥qìÝ| †ׯë!.òTÒ­þý¦ÔW®©8YL:-ñ/Àö=E`Mžõ‡N§?.ùÁNøéû÷¿îMå×ß¾ÿUËîþö‡ksÿàF±ºï_¶û¾VLøzLµŸ¿³O¾®óT䨭ÁøåÛ~Ç1b?þim+?S‰ºöSO~Ý*Çùþ—µAývï>~]+{2;ñlškrþ¸ö, Ã5ã—øjÏÇóÜÿûÓ·Ÿ· ð+»ðûéÓµ þiIÚý¦Rõ÷hØ×ßÿD9¾t$ ’ Ù¯¿ÿ¾Äïóùÿ¬“ëëoÿðñÏß°üùÛÚ—’°Ÿ³ºî_¿ýl³Ê¾ {Õ÷_þåw$kÓ\Ê㙺Q‚p/]ï¢\Ý߬Ýôß©æ/iIÙç#ä/™ÿJéKá¿ÖÙó볕õ¯²ÏÕ/•ö¥ò_}ýÚö½ãKçç:7ôÉëðeîŸSú’ö¿ðô¤/JÿÞ Á»’¾,Uü[_—þ­/LxcÒW¦ëKÞšôµ¯MúÞœð%ûãøUûñÞ¬ïÍxoÞÉ÷j°7ÒúWÚ}%¹ä±þÍÿî¿pcÆÛŠöTyôßh|Á£JÞ½UðRžÎvºàØ…?¶=Ï¢urðŸ¹ó ïÁ;­Ílc²Ëëÿ÷ه㸚*‚#þXÿöëzˆèÿ×i{h%}H÷_Zøe®ÿç‹åÑóÁ>·|T¼ ‡u}Mµèq}£Œº~’0Wjݼþewñþ€ŠO¬c€ND~–¦ˆ^3ü›¬­ wxDkæGKm–Ó9>©µ}w ÃŒ´±:û£Mtâšèý£ó³N?´úÑS¹ÎËð¢ý:ùè‚Ïç‘Nç%i¯»Õg飷޿ð½ëø÷ºi|ôÉ÷=§‡rüº‘âëF£lŠèŠæC>†|Œªmë¯õ€¦ï<ŽÎ1é×1NqÆì¿ÐÛ{B={BMû§­ž k.1>æúGÝë»w=r®/Ùúz»µÕÛ:1íùOxÒø˜sIH“´‡`¶õ¾¼ŒÓÞÓtÎo}œ6s=$=²þW×ÿÚþ»òÏ^xøê¶gì…š\3­ou2díýNºL\¶<ötX““½=ûI£á?5¡ÞŽÜO~6©Ò«òî=Âcý1©?¤ Q—ƺa¬¾ëŽ m¡âªî”½ Z±ÝÃ&§õlö%Õô³¸Ð¥t4I8çž"¸.?:yø6¼pâ\Ú[wZ“3?¶š)m±-»V”þÁÀdz  eOÜ\ZÓö¬ojëx×ü‚wÔõ?œYc•ž-—¡Ïé.‡¹ûÁÇô^ý¹zÀ²„gN²Ç=S“ o×@Lá ›˜{LÐcTrBÖKŒå|ºšÝ^°WwœÏ¦ZµçÈã¼Ä­~<º6/‰š3Îj{Ö+Ö3xä[(ë yg?áNöTÌÕ ™Êo^r:SßL)^«ª­Nî58,c Iÿd~cRI¾–I^ª%giÚgç5ÆX®*7l«àh*ÕLêjà̵:}ð?Xá¹àëê%^²í´éô€è–œ¹û\“%5Û l‚ïí;/Q›eøÃöZÚúÆš\Xx$ M¬OÆ›ŸØ3¼SÇeý¥Ëc-ú¼Dt^:WÈ’ŒiºD{^8×v”õÓ64é©Gà„¦çöØe_|AìICmsf Á¼Ähæl[7ôί—5ñÝdïOIÂù˜s¿:Y·3.:È>|ÜÄëÏ6yu¡ôðh¸£Öt°ñ¿Ä©8ÏT´Áô­Ùý/(«Ø:køÎFi7Ñ&m nØ÷¶mòÆ®íǬì}cB)wü¶®Ã§¯­_¼ÎôÒúu˜8¢@Š“t¨•»6N†¡Cz<ºÎnÅü•cAK ƒ”ç *1˜ëƒ/Ëëc±Ëa¦P^«Jªu¦ÞöR^S5/ý-CºÎfúZ²¾ƒ¦V`;v¨è(X§/A^\åIúÆ3¸vnyŠð’îåÁýnvûUùï¼JõH¶¾•Ú±ÏP}Ĉç´wÄD°vaîÈP—ÛVs˳›`"§õ?ìnyísyÍŠ‚æ'SÕ°wTë‘=›¶ CÛS;B0a"Ôg&•onÉÚ)iž%Mº¨Ú\¨2'Xn^ê®3½ìݱ¬m dœYýe"Jg1{W—Íú©±s³/=]ž²l6{'[Ùb½ ×W”µ=ìkÕÍóêb×¥²¤$Ι«fíç­ÂLQé¬÷–Òô?ø•†ð^&ÝÕRÓ‰ –dYB{‰ç‚Û$±9øZºž+aÉ­~°Q+²•$eÛåqºYÓóÞŽTÂ;)¾÷gb"—¥Gc™ó<ìé•äΣÈЙSö‚*kg(¯Ñ¥¢,ÙYÿƒÝ+Gå°þ­ú¿¥R®ÿݽº¬*½œæ£_¿†V¯Ÿ\Z\¦êá)m{phj¯¦4¸u25Ù’p;šµ~ÛJËÙðõ¯‡Ê:7ÎRµ÷ìBNäÖùük=² [°kæ«’,P¸u ‚²&Wé‰;Féyo¯[©)]•‘¼_Šy]1ÆùN_ˆ¥ã†ÕŽŽ'uÕ;ʼ,ÝvTlI¥AÐ £®ÀÌéӧƳg×QÛÛÜR,ÊnÊeh#0‰°ã©tp¬Ž(}PGíÇö4YRYG­‘º Þ‰Hõ{×LGþ©rxYôì¤Y؈‚ÕÕÇY=Ö‡ðQpßœ:#&ÍÏõßÕ¶Ùýí¦ÿ”9/O{¶öÆUæ¥:.ù²_…»!Zä9Z0Ÿ#)PÍ×háÕkÅ<É»§{xØy/ß’Ä\…e˜•ž­Mù¾·•æ½ÐÍUB׋þ¶ÁŒ/áßÂvMª÷‚ý!U3µTLM­9¸%;B‡ˆ¾ÙŒÉÏ~Ä~ÝzÍñ^ê‹Ð°õ2ÌT Ãg¯Yù†käˆPõ+lEq_œU54Q¼D½`Iv|ìvs÷Xj3>sIsYÍÆB•r™!ÛÝÂnZÂýXNj¨^wV²úàöR¨îÿÄ8áÉ:פô³@uõBÁ5øïz@™ðÆ&´gWoÈžO§3tÃÈÑå¥{¥¨…ï ‚L:¾Xªv_t=àÅ"ºÚPä=YÕ¿c[‰¨í$j© Ñ‚ýv;•$5åÌÛ]D£Ë¼ÒðrÖrZz,A©Rk\OµQ$K¥î¸þ»^Zá-ë¯^RÉÈP‘ N®™ºWúúnhu2My{4Ž™D}ÖfÿV x‡¸D,ö9ô³cž /Á_pÈïíòfû´ùóÜ^æ°ws&B˜Ã㼇Óa õAÓÓ+xçúO/æ*ÃhmqšUG¢k jïèüOÓYѼÇõ,}¯T÷Q©ÇY†èúpÕ5.˜õ(yïŒëTçF¡A¸óÈڙòGå’Òƒ´þ˰ߗ¤Ï¥Œùâj‚öü¤Éat><Û£ qt.Äšæ‡.5›ºpb KßæuÔprÍj|ÌzdÑõ2ÍÝ•=j‚­­{gõ~]jnöljó‹ù{ëuÐûêÃQžØ÷êÍšûk²ÖçhÉ©›‹á8Ûñû ¯®ô¢û§Þ£>²ú0î²ärMÇC(Û¥™3iØ‚jŠ!ÙZ}Z×:5jœfOÐըђ²55êv5mçctê=%Æðj~vL gpÿ’6´/hºPk?¦uá-KeÇ 3R>Ì™ÕÖ­ègd•¢¿ÕâÑ+(”,ŸVÏD¨åüµDÁR—@©Å$gpÍ è‹ÿr|ð[‰Éª"´m÷n-X©•ÖF¥Fw ó À;I9Ðbl-umµàâ5%ÊÜ>ó[¿€z™éQ¨˜iœF§sìÏ«¢á:±•§Á„-d«¨Ü¬¢á_š2ªZýZp븖|³ 2#h[8´ Ä&¶^ùTO“üºâgKQ§œ¨µèê3*®ŠFÁ¶<^2Þeâx?kià~ò:MŠÊ¦6B&«+>`-”-NÑ;ƒ›Ü’õµmIZÛ£ÿ ­Êµ_›.?H©‰…ä&ЏÔJ…n•XÛP̬6}âÚs®b¥/ÉT}ìéH*sA¤¬AN{ÞÝŽ¸uÝ‚æ×»uõû’èµÏ&¥ n*(«ÇáR±è¡ .¹(4àÑÚSsÉÓÇrM^ã ႪÆQP^ñßõðѶܥŒÑèÏíc2ÑlâWCN nðÐ?VëÐï“WkìÅ‚&8ÃXTÍ.¾5ÎqVƒF2ð´‰è1þ»š7aKÔ±¾šËT÷,¥gŠbŸ GAQ×ÊhuñúÿÚ.ï[~Ô#¢’º"©ÔmèÜ ‹Í noDçÇŽ¨F]ÿÀ ¥`M“g/Å´‰†Ñ•Q ½„fgÑ€tß»Ñzz[ª~[CÚÖòÖ8@º© ÇÒÝA¯˜uïÈlK`·5ý'†ºiöF´§"w¡=ýWóT¦o¥¿§ ÚÍÆ(´.¸‹}æmm-C}¨C]WÊÒá3lM…еC'"œ˜ôwÏcKl­nÇ ^3ì {€A4hî*¦ ÷aqPr¾ <.±˜%þ~üY;(µÃÝu+ÖÇ7Ö ^Ô–`oÿ]ŸYÔwÔ¶s‰>$^³‘5_,ônB VYªš÷¥ú¾˜ãƒá¬íËipîñrÈÛ¶ÄybÝÑØV¾ÎR^Цw˜+¢Q_aÿÈ<E~瑯kìËzs«ÉLLP iËܹÐÖŒjkAµŠË—ãû;7PkµÑÜÓ µÕ”VÛXÿ®Û–FÚñ:j5`)þmIå6Ì3ñX騲 ¾œ´ŸˆáÐ@–ÉïÒ,HµGL²gðšÀ…[g›\XÖ0.×Dh³Ò8Û¡.ÚòœÝIËíiÇcøî@—Îh¾êÛÒË0‰ÏÐÀÖ^ ûK·?Ñd:ƒöëfìú¸y©î=m¬Gµ]|û1÷ì,ÄU-õ5í¨z&)s÷[¢sñËåž-Cß…d5rHÏX}í^=á¿«ºÒ4¦Ô¤íôÛ¡ï¾úªçº?‹n@óóíýr»õh=‰5HÃVó,´Ž-ê÷„½x@—.>ü^ÔC£žÿž›Û’º½`#kë%}-øžqVÂzÜñë¼­-‹çléÈW¬Û—eЈÏh˜æ4ÈI7ž­R¥Do_—öµP°-tÙbm‡sJq9¦±/;´Ð·‹mÒhùñùHüž…Õ8pî0ÁPtjŠ;‚³c2¦>ÑßÜa9`œàÙO¾b¥êrçÊ3÷·¢^ü£Mí{:·ÌŽŠoO<溪 '®ÑiEìÎØ"lÇ(ÔŸg½ Yu‚/ªµ¹ÞÝL5Ø»ë}TB·B²µ„/G 9Ñ$ucö†ÿu‹Q¨ªnb4ÓÆTUkßo¥™zÀfÀ Ç QèTn¬Ä뱨‰ræuWF;†¡"4¬ÓçÞÓ·êvt÷­*ØæÏ'áñêGcߟk3|]>¢ì³Õ$Ú¶kJÃj¦¿¨süð$\}|FÛ6}´ ¡s9XáKÙQÛŸ4¬°ÝÎlÉz<ÆŽ-Ý/tW—øY ÛÏýå@Ô±ŒßÕómc&4NЄÕ@AÔi£„ŠBT4]dÖ´E¾­êlÕ¬åËqµ­¿èÛ›e `%ÂïXŽåÄ!˜C1:æåšÏQevÖ]ÒO™ëÃfCKÚZۤߔ]Òòñ˜}XÐ6òljQo/Ûú»RD}¦¨:3aØ?íà˜ÄTôsf½nI'®¥5¯æ’Rè@4¯G¨Ÿ³@q`ÀO `[ìµ}”¢¹~àëiuÃfG(Ï_­ì´¾4Ìorƒ¶9wLÎú}çyÂ~>µî­¦¡›(Ì!˜ðéᆑ÷+áMÆGᜦzø ÖÝrtü†{‘Q03&ãêÜŽÈXsíAŠ®4Ϋ9†eMÂHT9ñÐ "Ñöo›Õû×*Ÿ;¾Üxͦi¦ ÜëÛ+Z8¦9ÑÖT´i‘sIϹÖïœc¨6fm“›Ž™€M|1)œw Ú„XŠmkuÂM´ƒÎÌÞ¢Ç!¥ÝÙ°Îàc°`6f¦T= ™[ÿ°ŒÐõO*XÝbþÅr¿ u­JGM'v¡†æ7v•‰Aœˆ«ÒGwc£´/'!ÁœPë·¶};P+^õÜÂE½QX€.MOñÒFb]Òƒ¤ªŽ•ôÒàlÏÛT;A‚u*ë™!éÖ{yÀî™x¶~a—±³çÙˆ:4ÿÅ:­ ŠEó,TSx¦ºFª]]˜»–Nê¥~7,ñçd¡šâj ¸j Þ«pcËÓ;°·¶ñFû* ‹a=×?ñ= BGg¿†IœV–ºN rm z>>g+͵oo©êlëŒQ>pKÅ=ùº~çM„´|d$Íq<&:G0›Ó ÂÙªÒåSE2ÜÖ-tŽñfᦆÒïãI·WuD1~ó„¿Ý:YÅ98 Ôô¾‚¾™ }zBiñžÍî¤ÿƒÚ5Ĉ‹’uI>ƒË¶ŒsVÑ4«cøG‰ªp‰B(mT%£ðë)̘äãÙ M\ÿ˜§%†Â"BâKL]É‹5ë÷Œ(úP¼5Ý•šRbøºé²îøƵ;ÿ¬ìé\_‰?ZÄF̶Áˆ©ƒak~ö^¼îÀDÐøÅ…xKä`I°©"ü,«pÝ’_ù þeÚÊú'-…gTû8ÌCŠ?½Q=Äštêo)-·nÜð7ÌseƒY¨¸gš™*!YÓm#fj• ñ¬Ó‚3¸bJ×Oõ#¦Ü˜Õ‹}E» {MÄ{àÒ×`p5Ëàôä/“SÆÌÃñÀ”CœçL醴ìÃê l€ Õ¶Åè­e¾üOâó ÀLËÈãc™ˆLÚ&Ðdâþ‡ r7R¢eüä}4S>Ö\k4?“¯ÃeÍcù²ZеÅQ£0¡G á´ãµB¾i³ƒú ·§^iš¡)ª1!Rž6:'‡½%e“ç‰Nò”ËùRÍjeبs×Ü9‹h&Äå³ñ-ëø…?ðµCŸ:¶§ZL W»ï ¡Í !îËøÐ”Ôõ[¼%ÙEûoáá‹ENáÙ©ÍЭ¾ƒ$äæŠ/â/;5\³¡w@ù½Ø|¹„€fIÈ Nô½'C*Ï|ð ©À¤ÐVÞÁíÏݰ>œ£C ¥gKP?’ø“(/4Ô"@$¨ÈhÉDƒî캹Ïðá\ŸXÜŒp;â¿ÐþzaëmÓò¶ÉkÀÌŸtŸ¿¶ÎB˜šŒ·Õ½ªfÍTuñ%äWž˜{'E¬œjŸ½WÓÞÚ’%ëJji¯ÿÄ-#]Õ™vÌEi+€¾IM!{"õ+}T‘žú}Ø}1ÂYž€€_åÈ{K S9G1ñpK%†¡ g‚—m¸m¤N.¦$3')Ç\ØØ&Þ×ö–Ç…Î`BÈPÈãž5 4AÍBnÉa³b\a»‹RÙâ’^"ë7µ°œ?š¿nX×ÈkpË0(¨>e»-ÃÀî‡+H(»Ç!>`¾1RDÕ¦éºfâ|!úž¾ kL‘ÝgâaA¤Éq¦µýÀAÓI¤eÊ@Ùë†(sÏ^Ä}„FaÔµXŠ$B¹ºáT¹±§(u€(4® à—º5¾`ç“iI”˜^zø·‡ÙA³l…q*ÂÏ2*/Dœ ¶4•9e> 68Þšt­A: Õ:eE|©³¢'RtaX3vÆS8ëÝÒ÷ûÄ_—x¨ûuš78M±ü-Î¯Ž…ij7}“šÏ ÖuÊ̽Ț…?8 ü‰ø•ô…˜¢š×÷ÙŽr«˜&i"tSóçÙÿùÂÛ›þÞwÌ@~4³Ö¬•T; }JKw«nÐMœ²:qùŸ`ÝÐ{èI¬ëw“8e>çJXA4rÜcÌGnt¶¨wiǧIEb6ú~z¢7^ÿ¡ó+oA­ÃF!ê&Í5 «‚¬ÕºÍ´š`~Âå8èNˆ<%dQ'@WÖA¼Å´t’Ê|à阔éHœ2,øa–¿i‰n*gM¿ öZÕæRD¯¶«E±QÄb}GÙf“ì©„)³9•^wþé8uZ=g—ÛF¸6ªºŒ/²·95T‘At‚+6!škŠÈ€Yœ² >Ú=½Ræ´f(£åà$,{SµÈêÓη¼WË<Ž >º©]°þex)€”°+ìñk<ð…h3„Ä\zg¬HÈk±¹qRŠÎitJ×ÁaÇ+e€N¾ÈeÉ*[§;$ÙM„ñö±Ýœ‹[AÛ<Æøqì gEÒfÀ­Ñ¸±Axøú=ååXBr¶N»Á¿N‚—eÁ+2A…ìèÁ¹:mNåqH)TÊMÛáϬ´tŠ“4 9­ë|NŠÁñ4h—)}9ˆ:E Æ›ˆ—ñ*C°ç"x‘2ÑðÓü$È[Œˆ„<1¡J¦*Ü8Î:Ømf- ë“pýCCSM…Dy6{Ѻéä_@Bq@ÍÛ‰{ú0ë»0ì¾³xL\„HéP¶›n–äu¸u`•”ÏþeÃ¥í/¾YÛ7½Æú‡Ç­ôÝ ü‹t-KÜrréät]k§s=X\<Âéø?Ûê¾ç@É–Q+vÕ¹ïÃÄFØ'1]ûËÈpû·2Sö觺û¶Ù÷d> 2M·É©âUa$ùÑ„kåf)'|*ù#B¸¦=|R~¤/Û…‡çp` EÌ+•££m"°ƒ)O€W‘ô{Ñ™0«Î½YõßÄnZ"ùÑûôIØ]ž~ÞÎPD½ÏìÕs“Oé•d¾ýe\s”æ°}ÌHà.5rŠìçTêc=À¿Rp"Õ½]žÈØê–BI®.:êëHëN”¯Xë@}AÀ„ZBp*•jP%Ýö|šT‚C7öDyi²1j\cE@Ä)Rº×Á(ÉvØZG—•h•ág¤&gò>´ú¯ªz(!/A3CVWJ\®ºÚRÃnÛ€4D« ´¬½ªûÅV1†H œ-¢'Þ"!И€¹Lô`hr:ù–Ø!sîè²Íè+=F˜âx è’h™! ´ iòúΠüÃó&:¦]aºa ÿ[E˜ Š«}½{è\ÀÆŒHhŒKC\ yò ‰ê©h(¤Q×ä$*UŒ~¸Ó&nz>,=-šÔ Â_;ʳ‰,Ãe“‡Â_ÒýKÕèƒÓ‡ýË^’˜µ÷PÌN%ý—Ú$£>fÒÔ·(i ùIçá›)IŸ¦~ ¹—G®¦'}Ó&SkÖúýsh \A v‡UJèËæcQˆ8à¦3k†õÅõ­Eñ¡BÐi9‘:~¥ô=7R˜¼‰IuïuIäñ—ín/ÃW´cIÀ'Çé‚Të$bù™ ¦B<9 5}[(³˜ÚH½‰jÓÂt3Gw:î>ĘßÚÖë¶jt5T‚¶QýeÇa‰·” *Az%ãø¦Ê—@°îs%Ù¹­+™¬ž„žD%î>ÁC׳ø1±§xz‚Ùç{¸“.¬Ööãã™õWhçҲݵç$I'‚0Ð9u‚zp€®ƒOGˆFÑ\U]c×]ûì'ïB‹ÛYàœ6J[á2¤Ø¼Å_=é|u\|~^ª½š´ÜrF?¿ó·þš—ý,Èn *´:!+=ÉxμÄ$“aÐzþt~ßÒÓ/¼Â'1¶8d±'øÕ×á4´ßK¯0±|]Ð$ÓïÙ¯Ðq•JÈ*_æï½ÉÓ‚äæ(a©àž ’È»I¢l÷ìÙa#H13w)ðIf/¶ŽØØÆÓ«g,Ø'ć4õT˹wé¥bÛÆs¤ò×Ö¡úÎ¥WèU~¤ý¤ú + C X$æYÊ$ .OÏeÙÜ‹Úp%7UXªUêgY¯Ÿ¸€©jA7Zs¨ãÑM—³Ès'àS㛹dÔNÜŒ3*ý*!æÙZžºàéø3UE1¢—s:g¡þùY„²ñz¤Å›î©L›8qŸ=¾äÖ§ÏñMTõÐ1^®¢ª}5ëä£n>$m¬_ˆ«Êš”ÃË¢Gsn’Ü¡%Ö4ƒF˜jÙ9Êàm»@Ì Ê;C{È“·L˜=Üõ ¼„ý†ª|±LvÿbwÔŒ‡ø§6MÆÃNäï³EM¡'$&Ï&úq¾hþúYÃçêÒ<žJ½SÉHe½¡(këØÉÇ‘£• ¯…ãc»ÙÉ ‚0(´ºýa?&Íioú¬õWÕÿ8e"–¹JŽ֩ħ …3§>çgqœC®»Ó˘r3Ie¹y´Ð{̵ﰃqŒk¡¡[ìää‚T•éB¥äØÜ„¤úuh1dÈaçªG¼dOrRo5Þ1é W.oím^ÏaÎêQá¾è2S˜rïM3Ì[9Wn]:tÒê×Á\¼äÛýŽ'½¬›ç—— rbºŒæ ÅoY/4l-¦Þ*ÛU;(yÜ‘Z7Òq« Ùø ÉôE¨êÙËB¶ê•é°ð•ãÑgÐÌc§4ÈÛkZçØ[ÁØ,†‰€mX†Øt]Wâ;°£TF`‰Å çVù™ˆH¾2hÐñN¹¤wˆê¨ÑRÓ ŠÛãéž.ïhš•Ð%±{8¼ÈÑOHéOHÝO-™1ÉX|L0×HK;Ò\Ìq¢×Û¯L$H6uRÓ@ÿEÓ@‰’JË¢¯:™PÏÎRÞ~$Ó'dÚWD¬[¶[jÛwnN_&G²-á6«ð6:…«fúâýÅRÐx}ÐvHÀ¿B¢@Y ,`ÃtÕ”t ibDïfRDk 2ñ°€ÝãÊV,÷ éqú~Y)á2ÞÇVãwÈtà“9…ð6ñ–xmýâT0qL™€Åø0_4‹>Ÿ-ö‘£x_;6v>2¬óq#¬¦Ø¶¬-–¿Óbäì§Æ®AxÉüX”΃—á"KÖÔ };ì‘¢{ÈAÉ!<šffn+L° ¦÷íjõø8à9Á&Rãþ×§~QUß’éHÐOm“pÔêÐbQÆ“·I9ëÔˆ—R\l² gãÚïä.ެЀRX™ó»:«»Œà^£ß¶ñ¡|•s"U³æ±åQjð Â…Üe (¥l4n¹Ôš‚<²±Û&|L×nÑÖˆ5Øny¬“$³{‘óª)C:¦Ö Õˆv3åã`tqÒq¶kRÌvÎ൤mc£8˜üéüyþYß®YÏ&1îš—âóR'ßà"Ÿå‹çí¨xÕï‡ gp¶)ôzÿèûý <{IÂðy¹H˜q™Á»Êe6MRH¼†rb¾å>³=|†Uk Œ ܸ…+KÄëlûBÏÕE.8¦õmÛÛÞ­0þe݌ڲͤèláýåf H`X‡“÷~€Ô‰ .¬Ôùy†¢ÔR够‹É¦0ýá 6IÑ‹¹mµËè.ÉLÿDr€žÌeugºW¨±wìljT=YaˆàbÒ•t9¢ÜNä³ÐÔ4Ï‹‚OUÇÞCK ôë`¦2…&b‚õ‹¢šNÀÌ|Ej5‚<À]A—ÕØs;E’%ðÀÅóå„‘!ìN*}â4{ô“µÚšA>C\nºÓvF¼-Ó%¥Ÿl-,´€¯g6%Ö?ûG=þ09ζíƒn¡dú ô vÕڌťçZ= Ù 4ø~ùÑÚ†*“NÃsŒOu‘}C‡aÇì,î`U^Ïào–f­wi‹ô *$P$¤.ê" !sË6I}›âbÞÖ‚È9¾îCdžq^¦‹3ÞÉC w¢ lãö"p¾|±Ëîk¸Òñ¬_•,¤0ëXñò‘Rø<ö)ŸÒ¶‚fÔö|…ÆÏa©4›®½ÑÑÉ/JìBåݧ¶|w·c÷©- fº—•nŠü_Ñø`&4?·gÀÜ9`Ǧ)îbÑõšÞ.Ñ9ó÷–ÈåÊïÁ YY„ F %+k ¡€åÏIYI½{¢åY’ºéù0/·a˜­µuÅ)ª€Þ‹/‡-”ÄZŽ…S·²;C©"ÆÐ;Uc>OÇoÐ Ãác†r8'BÖ“:}ðÚÉ´­•s_õð(’È-ÛöŽž–ÀHú4]ƒÃÄò*0ò@S€áÚz«¢`2‰¹U¯Hä0õ¤(ÁN¤$Ifk#Ú—£)JR3ÁSU&4ªmQÂá[Rã×Ñ>° $P ¬Š> ÈêA˜WCÍ;Ð$îqZ}Å*#½ë챉T¸‡“v˜Àl°þÖxês8—É£Êgƒ;gúZzƨŽß“q¨ó_`wóÇ'®[ íÀu@v@6°œ÷`APýo$[Aš²…¤DªaÌvêq€Ó¹õg#ÒÚýõq>rzì°–£sˆ^c²I.6˜h0R? ÷C?{(èø È Ò(Û34£‘€G³ÍïÐvJ|Šm%Àv°QA|hgé ¤)OwÕf[¶íŸ¤> hÒ0¦6M Ç–«Ôœªn‹ìÒ)$žL 5XQ¤Àx° å0ܸÂÓ‡Þ²iŽ^| \þc'ô+¡³Ó.À -šODëa?t÷%p0$)$0¬³åKÀïÖ>뤼hŒX‰>𕛆A•Í:i=Þ¡É, ¹êÊ ÂŒˆJÉzÞ^dî¬36¦4è,ÄÇ cA’´Ú¶ÏŠ{àÚð*6t!à[߬£ôã('›”vêâ4úCïÕq!!‘­Àrƒ?ZY¾S£Œ¦Â׸ßàC{r×— Þù1ôq1à°H jHƒ$¤Ì×õeËL]í=õ³Š‡í„M}’ ìi°&ÖevJÒ/¢MQB ~šÎ¿ImRæ§¼ u0•—hØfÑ×¾â6£„ ²ãU*µÍC§Œ ð˜±Á“®ìÉ¡Â×°U‡ú'Ôpöâ¬v¡¢_¸ìÀ?kØ®Ôÿðu}»ÉþîMÊ•©Øb}ÏÆÌ‚A!Mu>©KΜwõ .Æ}Yù8.8|øÄ0¹;aŸ˜éø Ëî%…gÌcO9„’[.¾ŸPÀIÓIU$áÚ7ïn›-w³:ë¼^p–Ø‚'õ8íIJ@¹° ‡bOfpL„O¸²†+ùoü´“—øø V XÒÌý3é-´Îü;}'IûnÚ¬åÓÙ¤=êÍ‘Ó?àZH [`sØ*tä¦Öm§½¼7Ú+¯è ÓtÝ9ŽV躚Φ2mJÉs>‰¶Ž99|:H²é g<Õm´ö`õé# b# Õ?YÚý1ØþôcD?¹ðßêTâ׳'X¬Ð?}±Ò3ÐŒGÓžŠy-ëTÑ´ó>¦µèW¥LÙqH&¯ÌÚLÒU‚õî®R²‰Éuƒ¦(èµ³!*ˆÄ|¢ÉÅÐ’9“v•WUÀœ »»£°7 jô Mlm³W†îˆÆÓ­šËl–[M·×Üx sÃ8ä0;¥ÉÆw‹±|Àù›à€x=>®ãs7Ã:XžòúçŽæL]ÎÔjæqrn˘çyãy=ß1Ò}ýn?¯ß7ÅöÆß! æðç ®“,üùÙ¾½Ó^m´ÿ=Ù(Þɳ ç}™/õ¿›Î"^Ïr—õ¼Ÿ½í ãHîY‡Žòæ)—ýNÞ§Ïx’v„zØü{&ÚS’ÿ>´¡ö7‚ËÏÞfx=î/rµ©þ oèÚÜ0sòCþ»tØt¦ŽÄ›,éY 'ÆDž{L˜_´Wî™é™ï9Ä#Ì!©>ȃxö‚ö1öôêÓ†•ŒÏÈUÉ ràäªýÙxú¡€Cóé ˺Ÿ°dôз±ßO%í×ø Omú»h?^¿óA¿îð7°‰•a2}'jÎ<»ï™9¬3“½Í• ÷G6BÝÅßÉ'Uÿ›ßo ®±kk¨êb9Wd~O Í.l»Þv*Û¼ØlåŸ=Øœ¸¬°]nþ PœGЮkÛß||j¿— ‚Ä÷ý%ÞŸŸSŽ@¯G°8РЍ¡"Û³ïÇ·ù;cË25ô.ZfvúmçžÜW´ëŠéÝ4ÈRý¼né*xËÌ:+xEÒÉÁ!:ϘÌ0ïêÉûöì fØÃ³ïÉ¢½”Ÿ9®®be°ywUzž#™’K °iê{¾ïÁ“×Ëý»5“¬_» ý ‰†ÐnŸ”×ý—ÎS@ó~ž3î€LÖ¹´wHç”|¨!Sº$#¸2x®ÒÈÆ?^²K˜·è‘ÓÂ!ïÉœAo’SöB%Íe9Ó‚‚Ö’QâÖµ ŸŸžak)½ÝïÃæ3¢ tÈ`ØáiÍzN×ÑDíüÛ[«ÊÈæÍ 0á`¾_b–vÞ©•Jw-çÐ_ñû³•M<ϧK%ì}Þ¿“5ýìµl_x·œ½Ìœ ö>uÓWÞe3Ξý&‘‘ÚÆç“V–¡Ÿ÷£½ ’Òñ¿µº3?ìù¨©Š÷ï|îçóyÞØh`!£YL$d°ÑtÐÎûšÏ{_ã!ÙõWßK­œ÷A‚kƇö5?s"k½ëgI%Æôûñw£nƒ #9µyÆ¥¸Ú D2XÚ¥ ¸>’êAWÀ":ÏGu_¥aØó-©.qþæõݯçóµÿ ˜S¿$àž¯Åç—ÜëgðîùW¦Ï—çžïíÂ÷q-£&Ê‹×z‚¾“wÜK"ìáÏ<óG'‘ÿ-ÑJÈ,Ezðxÿä‰{~C)H-Œ'7Ëê÷£fóß ÝçV ã;yðñäQ¾Çw0±8 ËB2(b¦TtEHeu3›wdÿ>)U\ÀpÁ&½ž‡c0‘#?—MT/¼âVrÚ¥ËHälÞ^lõ Lçõ,Ý~˜ sº”U’BƒkïÜÏ™à ®³‚aÓçÑMþ\ïïœIþ7…Ê ÀSdi>[œRKŸÓ¾^8‹üïÉY¢÷3կ롊 vþnu½ísÍ8““½\j+˜Ö9W­Á‘Á¥ „è¡mžèÈóWíB|)‹:îO¢LT°Û+ýÚw÷Œö7ïÔ|H°>³ÜM„ÜÏ¢k¤M vºpÏýbñßGÕ…eÏ¢ á\ömï–½üŒ0O¬Kˆ°®ûS'ú~`ÖJþ@ý\‹ÿ>t¢ÚßèŜįÇýõžƒ•„â{ÎVhv¿rêû3TÓÿ½èD9ï‰`×3ÂÜ. šeéQƒþ|0ùN[Õ9Pù«?‘CìŠËΧ⊧TÝ;®7Ö°Åꣲծç68/E…áAíyZÔ‰‡ÊŠ#6¦®åëäØìºÌ›®µ³ D×Âu=ž1žðB\ ˜6_ŒAسŒÈ(ÕVõ(E&>¬%éä?ïÉß9x¶zQv]S˜“óºžùß¡ƒÌ$IoØ“ïÌ‹¢“+>€àý©H6©æÅ£“ãº×Ìî/$áÑT#< 9Ïð„¢“!<8¡¥3œí¥Sú‘Ê—H²W>éAsúÖpbòjü`›Îe/¾Ä'ñ’{hÉœ¸T€³¼3׸?’u–Ur.˜\ƒ¾;×H¸ˆ$Ú¾7ÝM4!gvéœO@P8 ¿€9Íÿ&·‹ p"dTPÐW\Ÿ}:‚»+[m{6îá[n£1,š´}_š5ƒÜŽd`Vúßœå±(Ü”ý»¦Î*ÿ›œÐµX» ÿË3÷:e3‚¾Qh€ô|)ÄQáÁ` Þ=ÿC;ñÞÏK¹%y‹†3NvObÙ =ÉzüiE½ÏÇå)^×X“èÓÌeW§ÁfqϼۜüÞC¼§Ÿ,,‡=Ë—O„ c‚_a¨R€¬!—zl$æW¼mš»ýˆŽuèîc¯ß祣‚'aÉ7·YÞ^ LÖ¢†íUp›Tm¸çz~#ã )°/”ë| Ëy¹Y‚s-húG‘cçß{·¿óâ6òۆƒ]¥cÄŸç% ¶ Üïç£ÿ‚Ãkð~ª\ %È%ô?ö•÷xm¹CÍ}:÷ø&ÖÈi/ß7êñ1¼Ç—>ý¡^J¾}¼½2ˆÖd¤õžç£Tå$ÿ|™g[AzX.3¬Ç¿ÏmÖ»ýØ5 “ŒÌ«t¯³‰Ïõ|¿Ï?\#OX/•‹Æç«.»Lô¼I>û,1‚·r M¿ŸåäºÏ׬óÉÆ»³<ÇÔçãß»?yºâïKeu1ÀEŒc¡ÎTüœ4éZ Á# lô:xƒ;9é5¡›_ÏFi±ÓH¾œ öܯN¬2΂5|–ìí#~jt¿ž÷{‡Á†ÌLÒ?Égƒj>K¾F™:+üoN2ÿÞƒ÷ÇœQàfp#@ ò}R.Ф2¥ºÀl*eôz ®+f MÈR.#™Å!|6.øìCއZXòF.´°¾¡LŠV,z=úGΞ…,'¿¿7qÖû„ÔY­÷ó¦ËF&hHüówW<®Çf!®‚@![«}/+ V×ÿ…@¶ªú?X:²Ôv¿qrZúŒkœvúF¾æn!4ÐoœS8mx=D¾4o!FKNNѾž£æC¯XÓ@ïǺ}‚ÝûÈy/ºG+ Ì]wÊm»Ÿ"{ó‚壥“Òreÿ éB9p®ÇßýR¥³^£+FB ~.ˆ®Ó÷UÎ`‹vÏ=n:{”ùý.¿%pÃëàKzð _¶4Èâ~.&d ~ä§Ý{`ÿ¼g€Á`¦í1Á¯i~èk@¾þ:ø˜<ßÏž¹ý¸÷ž "ƒ¬DüôãÇ>~öÛ/ j€up…>«) BŒºÇ÷Kgyë8`ÈZhŸúöÛ‚Ÿ€:U³¿•ô=$iŸgï¿ÂNôëÒJlhrMgƒl!×t™fàšÈÕ·pL “ýû3;í<ŸØMßB’„Nò¿'?Ò¯g¸@X’ªÞ[H%Ñósï¡Áï 0ÿ:„ù't>/³ÚΙÈÝÊ5ßz·ÌПکz?oºL%\ÛýÚ¨bŒæõµƒ”ý\o;ô뜋@ò xE býµ…0Àð’«‘ë`·^>®6A(®Žô¿';†m‚„­’®ë)uVn 󸀄ÍUŽÛ Ó7?F×éÂ:×ãÝ·ÿtë0¾ìáä@ØýØÂk>B¬²”lMþûÔŽ´¿KÖ8×c}ÔˉSYQ©ºíºƒu¢é&ýÊó€=Óío2æt?÷·=išŽäÔ¢½¯o,éä^$d°·8†îz¬B‡2 ÷Ø×yÏÐ'ýî󢟯ï<¤Ð|B?(¤aò¿ ú »Ií:Qa!×îóÅÐsí¯afcü0¡já‘D„>—ìØ¥1f”ÅQVTßKœëž§ƒXŸwJoº¼ZÈÈÎM‚>ÞýùÚw‡ÁåzŸr ¬ÿTu¥Ùû°õ4q}ºõë{ AkwÈ„”-„L;™A&À™ÁéZˆÔXr¼: ©4¹mYª;/oñYD¿°‹ûF°Ô âjÄlåÇWÑ MÒê £4ú@êa\õõ¼Æƒ¯ãVye9À7‹ýáhukõ~@Ó ÷<€ÛGUç5( r3DWÒ½ˆ"þt6‹¶ð*ÿ› kKÒÎ.·7¥Ñ‰š&>¿×£Ù¿¼G$˜®9‚O`ãX3Öá¸ü1@é–eÏ£é÷Cµç¢,—ÖÐ(œ«aÓk£ùö±½%ñ…mC<¹®Çín£·$zSðêÞjr9Yÿ¹ý=È…{ õ}î½P„?Ÿc°ðù|Wxþü„_k,>ÿ¸íiíá4N^¸ ÔÏßqgúvÚ邺½7X™Ý¿!¸åœÝv%µ?—¬é,}”܃B‚uB=è ›{OîAßD6*î,ùž$ ãöóFp¢Þ·1Bhщ'ç§çŸäE¡Òz?ŸŸã¢PV*rÝß³x{\ÞuˆŽ~o(`X71o”CWW'$8§Oï/³Þï/aC¾ŸG²ûù<´§xûô·ñmWQôõÛÃÕÙ¾âòº“U]£l>SžÎ‘{6, 9Þ5®ï¸¦:¸ýÝI"ýpÀ;«%Èc h.;{—éïÇáVÄ‘ÿ¿ÎI_4L¤Ïçfí!òNøîk °$ÿ¯ƒŠfð 侫Dw]RCp‡¸;[àH¦F‰Ê=î^½Ý^nº„\«îÍ-äÞnk¬“צÝ_ {‰ËÉΤô¦ÁÙN;#RÁûÞKÜir;&¯ N´¥$ÝàA:=z?³´Å‰û¹÷`òïÛ:âg…('E}+Ê}¸Ö;gp­¡S² ×À4’ûÞOu žØÝÀ )Ÿq ñûæ,´Ï &MCŒÌyèÃç")¹ç5 .ïÓ0í*Б‡âYG¹ Âç#ÙèŒÜkÁ;‡dÞ‹›LŸa1“_|7@º¤ljêbígÇÏir]×áö§kÒ§ò £ë•ºCd;0ëmr:x<ÓŸ‡¤«v,$âGÐâãþìAµ\>Rö=FÍ4F:V<òôóHý¾žæÐçÍË<tŒÌKì£ìVü [LÖ°öàUg¿ÄçÀZî­ígæ/6}\aƒj`¾øéÓò%l€ŸG û%]Kƒ‘Wˆ¯Õ»G™áî2¦ùlä€}2Š÷ „Ý(7êl¸R8XJº½F$yÓðý Uåò¸=5ÈÙ_çÜSF€<¶‚MÝk.î7Y9Ý¥û Ð9rù∓ÜûÃ`µçÈè?TMí~8vF½×RïíéÌ[«EÕËÇÐ4—Ésf•HíR…TàÊZ 7ì‘I{ÊÓ6q[f´€ì·ö5BbÓÛÕ…Ky„ÝlyxÌ„«&„Ý‘Kÿ)G†óPc&D•ï2î÷î\fÐ 2ö3ï£ø¯­ßâl_×À2úíIB³@üyÜkôz†¯îlLðuú<5™÷y„e0_<ì(d¶£Ø30>µE'žÐ“·о ÑFÞÑ^ã&Èd¹¯y<¯ãdùíhÈm‚0ú0Ü?3fˆÌø ³®†1Ý\Oó“úŠTüuè—øiꙦ 2ÖEõr>×ê#(·©º<5Ïä¥ÍQ‰’ƒ ˜.‘—¿—€Eî÷:xx ™þë„£p+Øô…ó#¦à1×|‹Dâtž)Ý â®6$`z‡0´þ¾ŒP$W¯ƒëóñµ ñý©»z¹E= ½ó~ÜÕ ðð뇺ìzØ3_kyõ‰òÖ!Hï_'t9χ·…å sbFÐçãs¢ïãpŒ4ö½:]«)㓉¬ùuð1F^ý:ô#Oß#Iì1j÷`Œäñ‡9`j—"\ Ó=Ž×O–sxå„I3垄ا¦Î±¬6›«eø»y ùðÙ’àû†A‡9ë…vˆ]ù;ï-…©¾³†1†ª6ëãÂÛ\¤VàË’þ¦Y?g1Î:Î23OCÄ]„d ºy‘ onÞéQxfIÎ'Œtúuð ²íóÜ8áIÂóáÁ $ïçÙð~ӭפʯCœŒâjÂdDák E•Ü„—¸‚Ã4‡|ƒJ°‘ uªfJS­Ä¡…én!¹P’3땺A°•JQ,Ç‚å^ÜãP±)o*4«òg6hwG%A6S´ ýå9vg¨˜ÿÛÚ›y8…‚®í8Ü›ÛUZ4²´û|òTOeQôf”_鎪4r….G픇\Ïån`A£Kh yy 6úi1•ÃAâžíøâŠè'ÛÏv~©“œ'¦MÍò y»×ÀÓúBÊl¨N¼eɯ ¡É»Æ½`FÕ “¾3§F:2'ÅãM-î®Ò·PÂ\då¤ËóU)¿Î%ÿꮩ}Ì!+=¾hd—»ë  Æ³IOÆEà ÷£Ëæ¼´Ôð‚„xkP¢a«yIù%=a[yÞ·» ?Â÷Âá"-ˆþ õ_W¿`H`.šÎ~¹… n n½Ehbºw€Kq½ nÀõSÒ;³)ãœ(xaãj»TÑ0‚ ià<‹eÄ[ƒßïK´~è¢ÄÃkB: 徤|YSL²Us±Ð5nùmè&W]ùl…Ií¹%‡ôy5¹œbIüd÷~Á.s±þPÖ^âŸñMEÁ©_¶‹ð‹Š'äqW<æbaÆûqXXVYÂ}gŽòš–I"ÛV*©ø FzezA*#éõ4¸à+%kŸCx%qk Aª¯¼‰òœF y‰²=ÏKWZ¢¤+@_’¶À ´øe;üð›¿yëwZl¡zò° › CséÊí*L\–¾1áÔFŽà´$ÿ:àã€YÞ3Èbu›=ÐùÒÁ:¤+—® ŒaIÃÅqPÅ£÷T‡Ê½r°$Ýq”ñDÑÂTæîŽòA¯–ëèô¹ã¹4SÒÌ×ó'Å»hðJ9žæ_ OsIó¼€²ª¸£yIó^(ØUVW±Aô¡ºQ5¶àÈ‚,ç5†H/[o ²U×At ±”-CÞbZÅrY9OIÜk)œÄ 'Îbax× }CÒAÆ$¼•ür‘õáNÚ߯gAÒ\ñ„dêÜ%_ùŒIËëÐ\Ïèî+R˨ûûç'a€œò’^© ­sH&~Ž€íoÔNzoÁ€–ì€2ÞúÁð¯Vk(ô%9梠ÃÊî[õ^P‹+F˜ºÂ‹1à%{>óä˜S¼ŠB‰Ž3­ =ž1‡ø|H‡,8”JÞ– ,Ý’ïˆJU]øŒ¨Ü¶u•âÄÌIј\¡*—Ý\&Íi–ËØ¥­µsHã ãw3+Ü®îäã‚ÜäuØE±u!’o3…Yãͪ «vÍÇ ά’íÅ…ç¨Ò’íu/4ˆ|$ÉoID“ýú}^±‚¤ö²úA‡šQn'PX¹ÊòŸÕ¯¿û~¢©ûéÜÒÐj‹ªðy<˜@Ö˜ùm)fË_‰<9AQ»®'äñ;fƫߩ ­¸ä~lf^R ärýóRîè6Ï#²q{ÆçE÷•C§Èk©[¬8Zj•n§’i%º"’±™X–¼½ðà†R¦Ûmå6 DekÛT¶òk=îÂÐ7Šöڟׅ¤åuȶÖR¾Öúô‰ÈØBXë œ¼ÖºÞã9ÒìKV Æ&Ío´Pž°4m)>®2ÿ5,EÈ-·ç Iõë '\mù–Û‘^Nøbòçþ†ƒ/MäÔ¯ƒZ¬!V¶ùÏi¾lÄRƒ8@" ³áû ò¹©>¿W‡X°à˪sðt) ±¢ ¢w)Çp- í,÷'e\;D‚ý:±#ZÕ]]%kÉnÙ"O¾Xnü%^ISSJîêYJî½< @Ÿú†Bõí€<,®Rü}%+à4Þ¯û÷É3î«Ð>Å Ru€ÿ:]Þ”ÂLäÀÒZP‡© yl˜ëb-ô=Uª1ðKµHšÅÊu§N DcŠ\ h…‰ñÐ_i_€µF'X^ÌÍÁ–Ú±]¬'qõ2À‹IKŸC>Âë_ä¹éÅ3¡ Rë‹”íi翃§ z%:BÔHLt1±P} ;ñŠçš©YêrE®¤£vÌH¢/H˜?!/]­)z ¥-4„&€Òo?6ç½ÔcœÈd8¹©¤Ö¥è±º°³A'kƒæPÑ +ãH'Г³ÄºÆ–kŠ*!¼Ìí¨ÝHÏ.r!c`2ªOìâkÝ©Ìôø—S)ÛE–‚”ûÄ7»›¢L·.Œ(âÌ+{Úù(*IÄ=ê©ÈT7YQzØEù6‡ØIsx“ â÷'c¨!œ‚TÐu‚Ò†t’žÌSÔÕè VïÛ­9!m¼TFS8céüÞ5Új/Ä|4¸ €a©Á5S.¨¹xºsí8ê™k¥êžríAHX]'(%?H xx‘"Ï0k${G£Òý…iç(Ÿ/€>V³Ž2SÝF¦ O½Xa<®K¾ã”ÚÛ¤»wJggÍÕ£¯ÙC¡Ü¯¬XR˜,ï1îÂDîǽ[šÊpÑ­¤U¯C:eJG× Eœ´È».µx"9§ ø´ƒà¨7N Ìuð¥Œlò‚:”]%u¤—JgÖÊ”¸ÉoÄžR•!’îA‡_MêΔ„†¶n T@lȦWBËÜV©ìÇW’?ç“RFî2¯ÌM Ö¡ˆ\ÿ¬¾]ÿn·éÐ-áÃ7*2o ɬ¥9õpÞ_v=Œˆƒ±¹èÜ ùô¥¹û 6Q}&>ôá÷bû«ÑýUþì”}ä œ/qƒèÁRATaPõ1òÒW@rPL)ÄzÆHƒÂô¤¸ß ‚[µ<ÏÓè Öò4Ã-°.²ácX'ÆqÌ[m¢®þ€>)¨H_º§H» ›Î=厎"Õ¾ì]ZÉñat…}Egt×Ò%„ú²šc×óx¡û¨ävåeY‚¯q^–Â`Ew^–î‡by,!sÁB[ÂöVïD¢Äï= “–%„¶:£:1Ö¥\`DZ}é^l«0¯Ý¼¨–ùò‚ß2"ÓcD¥òNѽðQXÌéHXˆÍštŸ»ó™õ¥ß/@ò}AÉô¡Ûê¡4íç8§@)Zz¿…ë»{†JA*þ:辄PÝúãÎP)݈¾ðo–NŸ8(8¤˜» Zhbhý”q¾¯0YRP3ÛZ3aÓôQLÌ2ïÀº‰L²Ž˜Cý‘‘ç~|È a“¾ ,òêzÜQ²Ò½6©YCÒ”öãÿêzO1;›ÙÔÖ y`ÒÕûºö :`Ô^á’ëÁPÖÐõY²ƒ9'7rT¢ë‡l*Q Òµ<ÜAï¦-H~_× "ÖAS•™;íˆ6z C6=éäžjH®/c—ç#ͤ#”™ö1üƒ-}f¿ïÇy‘­‚l÷uÐàrû‹åÓ󇇗„ÕðèPîWRF£Ü/°ÒÈùÓN5ØÌ¬DKìs׌AäQî`KÀ­s¡±ùŒÜÏòöŠehî £dHBt›K£ðàj$“ê«2S”ÁÚÊ[Ò¦mÀÒ<‚ÍÄ.±~ž,æ6Û¡¦ë‰óFÀ³¹®ç÷v±²&Îïtl>ÅQÎeÈçœpºTbR=]*HªßᲃÙšÊóŽZ貌AEØún3Æ'l’ä˨®@ PIèÅÒê~jøzm‡¯÷L!Ð#hƒ1“åESu(•Å`˜Ôã"ðµ”á‹¢ÎF0kEm[{>Ü`ãvƒ!¯¾„¼ú£¯ ã¶x.« õÇ‘‡M2‚sÎ1(Ê Ib6CÇåøcVýÍ)VD_BV}AÅû‚¬zö16’Ñ6 ®…·»Ã«ÇLÜ2œ¥D31{ÞÈ ç’ê"›ð¦€¦h®Œ;T?Æ ÚBɧ¾†+‡RéD"W0”íALqAùåÃÝK;_+c>· ÷‚öì"lQcú4D®hÓM>P'«bOa‘e)õ:s«[‰§rÜ2ÅÈŘÃY÷oÆ`:ñQÊÞV7öŽùì@.ÿí\XþóÂû aó@.¿c>õÌÌé0³Iô¦Ë}Ö´Ÿwˆ£uÎQ-í@2TÅ ˜\¤×—y¢Š»sÎ,ÅÝÝ9õûh™a_A¢þ:è¾‚Âæež p…Œàm…Ç'dÕ£w>Å%œf  «¾ÜYõYõeê¶¢,/í=(“ïsØv°Ü>ô  ¥¾¼¢YÈw^†–ODT\/S+S:mÕŠ2 ¨•|}Ÿ$NÇJÏÛ Ÿ×hE§ÇÝ/Cíär¼®ç3Ü@q÷‚‚ó½Sܘ|¥¸9€âìŧ•ÚXÁ1ÈäéÈâ+íö\¢à|ÑÚòŠurî â¤Êtæ/¦éßÞÞ‚´ùuð­¹øëÄ]x·9·¹q6±wîéö SÔëÔ\ÂB+(_VÏN‚cmVwiOuEøð¼Dêâ§²µ9¬®zO}-Ѧ~E‹kÑ><±^ŽxÖ ª‡hMXÔ½æ]þŸP/G–<@FX|=„Á…•Ň’ŸÈÓvbÊéõŠAja± ï9”ˆ(O{E ™vêJ…¶yùñ·ó@©/Ï]=¥r&´Süãs±tÌaè•§Ÿt3yúe‹–Aµ+yM씎¯ìaœ;ý0ÂHL®‡¯PBª&ñuÓwà©•ßî™0ð‘¿ì 7²8ëaWæ{êt³ TIAÑùu%Ç’=Ëm–×ðñ¸ŸÔ®]Ð303¶ êÇ 2ëÏ 9hsOE~²»  i’µ@ž7èE+¿]'(Æ[Ì\ü×j]ʯ„ÜzÁЯI‡-FÔ¡ Ì+cKJ¾n:»º.´lŒ‚A"¨6o/DùyI äñKzŽ–#ðe‰a\ Ë)½j‘‘!Ûi~ Ç’{ÁÛ/)y›ÈÏR_FRÃ>‹£¨WXw:LEX>þN¹-$|‹æ-¦JÎÃ0T<”M>‹Õ)HÜ”ä™Ô@Iºœa’Èÿ[ÛFÿ!É×,h !¹œÌV® L"É£…dÒ’“cF—¤×@c«»òPÿ-P»Å@NÎ…s=:µ„ÆÞ“Ê8aâv¤#6>@xÐüÿL'ã…Ž•˜]”Œ8t@MWW–t«@È&—$¡Š ?æ¨ô¯øL?¤ê3YÖbRHåÄËêÑ·|%’,o…º7.Û› wPÉÒ¿¡rXëÑ/›&Š\Rƒ¡ÖNÌ*a¿§ÒØÐA==»¾ñàzÒîYöCGùøã‡Žê«°– å~6]FÒá{Ì’éùÆ)‹NŸ \"Ýyt¿CF¿X’½ùß=Áa•¯.(X.(Ø=tßzP¢»ÇéÌ%±§ÉTÀxâ¡VÀúŽí[ýöè 2¶%‘"lj$fDºUÂjÎ7U`ŸJòŒHIi͈dýKrĨ€$@R‡Áp#E¶”bh™ G¨¶Ä€¤ë² …°¹ Í^ÒÞ\X'þ’j„PztJG!žhOý;ýSüýž)J…ŸÙ&Ìø@Æ aŠ‹ïZ ”ì ,‚ÄzA¦ý8„ƒ—·p™õ{=Þ¡à÷D˜TBÕnºžo”ª ç~fxáêUÔ&N|°à7­Øç9¸Äè† LÇõ ÐO%;*Œµ{£…)ò·y) åXÊEEE¤ðüÛaø¢ä[kpsB&^TŽGÍ9Õ9¶häÌK¾Qa‡÷·kZnÈû¤ÜK¾,ro#?Y3XŠ׊¿°¿cœë=TPÿWž{µÀÄ)w1¨ö>veC¡‡­úÔ,¬òx›=¬1ê,HQ£I‚\ú˜Ð!HÎSWÍ;EOá)0 b<«N"¨Ô.å§RXMæå­Â7•”·ªUŸšˆ1¦+Ò"È®_‡ÐäÄ´C‡*Å#ø›HI‡'qµ‰ ™G„ ÝBб‚aÚV<#Ôd¡d¾Ægÿdo"‰}Ä–ì ;/L¡¯Á¤FÈg6ApŽ)²T†ÓuZøJíP[3îË o;)ÃÙ¹Ü „RPr,HðZ]0Hˆ“⸄ÞkA"( jw”7Ž çë2¼ÍVš]ƒ&Òðö+€#…â&›dä*äß ÙdáÎH 8¤8Ö/u”Õ´ŸS[kÇy%Q)¬ê¨¥~‡ôDð¥|.(¬àxXåë¥ÔÝDrá‹ÍCB3§ÔË]Ì»Z_`¸Óè&ñŽ»Ö ÓñÚqx‰Ø&’B´4B˜I\lw­$ÿ¬sÎT¼’ub¸Ê2î»Ä"ÁøÃyå4ƒAÏ|÷¤oéšTyQ{'¢œëÑ€à+\ÕZQ‰5:†s¯²à€3j6 )×î’Á%#¨"54ó’Kzßϲ]iúý 6Ò*kv›W/v›5Ãt˜;o 3Q_çÙ§Çtr)ó^]ÈÉil–œ&®Ê1ôݖcVk‰x“&Þ<«úä†ó:ìþfO_Àü˜C-·ä©ÑCiåµã"WpRxáÄ ” CCäñÅsq®ÖKÛä rZ‡v8ûå ú²ÌW n³;!¢u…‹› &¢¥ø®yÅ´û\ÔJÒòÀJ­¨¼®Gƒ? 9úë QуG €£±…3=d; ¦0<â; @ÔoEbãGµSÖ·‰Åž èÉí#ÏyÈ:$é¯Ã‘tìjÇpp‰øba1úzÕOъ¾Sˆ–ÃU­ÐP±´{~5ÂFÔ àð£k"Hî‡>°<ñiåP"%4}ª<3RPl\,ùþ<5º_*ãðUKC .buë9W&O8ëP߬³ÄYRRƒ‹K³òŽ¢E VcHÅ—z«ÜHפßÿMDö ÝÛ?£Ä<1ÁŸ7¿-åL¸¢•È·> SOjvE‡ù÷ͱ7‚ÂòbÕëwHˆt#)‡ÊñkQí|ä¿ËU½¹ {€À5VÌV=Úî—ª›‹w’ò„]r“ÝZB¡ÚΗLÕRa²ýã!ˆG`™0~î‰~B uA–Ô@—A ù «Û¼d¹úÇË‚—Üÿ±î“Ôž m-µû˜(¡±ÜÏ»KÏ ª ¬Ã^+Ok¥ññîˆIªm.œ£xÈ´¯ $÷ÕÀzõàUr$®7鬘*¨_o”J,öã˜ÊÝ…@XA½T¶TáÉWKž EÇ8.ó ÇDœ™0I~îð ˜_%O‚Žr*gì+áö±cë®nÚ2†ý™ФŒp/d ¤èÒsöêîæªqœh̾€.iNk,°ÖAö' üqÒ4ž4§5^ÝÃûO ŒÌÑÜÅhÆ yB,a©DªL‘÷v(±ßãUÝeè×Ft*BÔ‘›VIßHöK…K ´L7`q1¢%®Nr‘ÐïVïð rö×)4¨á„ÚȰÛÝÐI`Ò:ü±–¸Û™ÈË&V6÷ÐtHËÈf®À~ÇS‘•¿¾âà3.ê¤*‹1v§é,–ÇŠqÂ+VÌž ƶßÊ)©*ðÚI D®ªÌÓ1D…—|ÛKPÓ×!਄'¦Þè7‡‚¼Ë nƒròë@Ç™äf¸žXóÛ‚\ûupÉA·*xé/Í iZ<îþ »”ôz"&cÝ¿W粺¾ cäÒ¯CX0؃Z=Y¬¶äæÐŒ‰³'›ì…o®œ’(ÂâóÕ)ª¥UŸ¼©v¯˜2-„òá4–ÖödÄvÓZ˜ŒØýZ;{4!͇]žS£ñ–ˆeAÈHƒÁÑj ²ó×¢”™ø!lúà/ë¥òE]=ÝXq¹¹Á'›?æHëaœ9¡uƒ!ZÚÉn!nN·Ï¦è5Äa‘¼¾Ë×®|ò÷<àôn_!sh":y¤XßDÙé„ÿ…©øùÖCý²ªç:ÎC¨5Wî%KÔ§zDn¾4ÍnlÒ<»e}uÂaµÄ›ÄDû›Êªõ«£NØÚ|ÈÝ8ñ!Ñ(ú£Nް¾ƒïèµê·“©?<„>„qÔÊgvÎÅÃNèC7¼2˜,¤ßÎGÀ2•®†Úd9зc8Øñ×õký„’öJPÙ%íIÏâÉø0 ŒûÌ;M§^,Húí@½ûu Ž;±”ß«¬æ¥ôÝu˜>³ëq×ÈØ``=Š Ûz²ªS •_ºSQ ¸Ä‚ \dØ¡­,¨Š4À³s ˜¿IšD+[+fD@/ß°VhàÇxt<Œl טrŸ¦˜¼eí¹%Bã¼l$´?éŰŸ|ŒûPYqã nÁ ÷éä#5Ï­ÓÛ=mR ¤3m’<*Š‘ôDÒë|a·Ù÷¢Æ2ö†¤|®/;)_¡/!)_¥/!)_`ÝHñ–Ôv}ü—¾‡}éê2Uv}¹p\ÒÝN×øËØ´Sz0^Õ¿N¤#GÌ(¥øßÂx˜ßå¾kAblDœ šñî¹µWÒzQNMR½Œ5È÷ð„ùÐý¸Xµd:lb9ù[wZßãF &è“] OjüüÒC¢(¤»ù¤‡XMXž/=˜/HÚKɇ2Õ¡®÷ØŸç85îéÁÂeãb`€KVÌQû¾c¼ø6YØweèú°r°+“«Øýç‚||öŽuyÈï0'’ð×!ôüàÅý²·þ§²DMe¦W¯¶Íô­ò’ŽÜf˜<0oúŽê#e_†§ Î|V¯¼Å%²1ÖAãk´Ý3Lze3¸Îõße‰%.j¦:Ádé’Jm$] d…s½ÈŒW¢± É^F“|êHº^u/–!Â+þêÙƒ9pÅ‚¼ÃYHÒ_‡É&Ä”h™Ÿ°È—ÐbHI¤å+ËÉšX†x†…d¸ñÂ*öw½#ªÀë‡^€^Ï:ÌÈá—±=¤üf2“Ï2òdÄôB&ri¹6ØIÛvÙmd©émܳòL˜À™ ãv±2½úÛ w {¼kÈ¢YW»‘©¿N8=ýú㦧_'ëtq ò$=÷T>Äårk0IøbÌ>Á( Ìu0ÃÊ1dæË1¤‰eæó¬UìµOD)âú¹BMKßËÐHy–=ׄ¼bP+e4Wºò!}"#oN¯E]$$ç œ25–”‚íäªì—ÜPXê=ß;72´àWÖ,£(³z}wü‚W9ßúv( Éù‚ä|ÙÉù‚ä|=&aw¥ ›¶bWêéÀp"Lůí–T ïÊ;£ÌwÅ,a›ˆ|c¶ÚPŽJͲrß. 2ŸÊ?]ß‚4ždÜ =(kô¡•»2ÜË•„l}Î%&Èé—ž/` á\ú$iÈG—Aá á‘ÃÞmo€wlLš‹h¿Ù‚’âæÅ¹žv… yÎ2µvq"{ö‘”B˜ì+ðÏbÛ¨Etæ‘ÎÎó@|…L­M,A2×$@> ÓÑÈM>ñ‹æ«3´Iê¬FL˜ÔcÜH¦Y÷åfúŽ?YNUifŒ˜É¿15uu^/ ßfS¢à.bX|síŠ0ÿÎÜ:2ÀZ†~¢B'å—ªC•?«ªƒÝuZ Êäø9Õ?æ_ïv exØ×¹Ø(W­ô¸Ìân ™šˆ½uk@òÔ›h ‚ÁØ„cK{¸€F•®a‰éòp`¨áº~=s†¸>rø× ]-ðDÉÉÐßœ*©yYÇ"Tò–ñI;C`[Pø~hÌ‚±[^¤Y¸£ŠÐØÖÁ— ×ˬ!ôÏCñ¿+ñ~„ûÜi”€™È¼äìNN?¸}HÊž€n<+½¥ÉÒô\™ØX¦sŠ (d6ߎ•ùâ~aøÝ=-dØX‰_@‚yþ®ÊHãÀ~2wt9úëð¢¯!ŒÿÍä¦zªóü‚A˜ów'ƒÉ7àkv>Íãé¼bV ™E%óŠ ˜ dö»•d®÷‘à1`½æà!ùTÂÂpa÷n{¢P¬N%[E?{¿X¨(÷²13Z×â¹`’SäüHØ߉æ–OØc¦ÓëÓ³)sº±ÌÏ€»K¬œ¿‹’nø;°ÓÉ{.hdÙð¿'/ l‡j¸H›­¯BRXKÅ×R!+øy*²÷×á |óôÉœè·-ᆊ]¢ þõyŽÑZá­V:ïT¤ ùû¸ÔjNHN‘‰gXê : óŠ} ….¯¸AÌä7i‘¯fà¢ý4ѱY•¯I+ÔTØwÕjË1ÊxqtA…õRƒ’á VV¶=‰u AQéE…Ý[m#å·f¼Ê•ç̺\†úµ–£šGÎ^B9£Ücβ[š1ªy„· é;º}n©<„g‡š•ï¼ÂßQ‹ËØðOän¡j§ty`õ)Õ_[ðA¥ùÇtj9k½b¯¬'‰ßJ”¥SRdBì‹‚+òËëc1û úÕ‹†&H°íXÓŠý——¿"ŸÒý> Fm÷¦^BaDµ#Ñг!Õ‡Ù0)_Ï«Ïå¸Y¡ÇëîKÁ·×0Q¯F;æÈöTÅKÒ¼ï”ät®kB!G »Ö¼£>Û¸ÙIòä±÷/­o]ÓÒùhå‰S¦"‰!{!Å €jIüÁ©³ÎÝi¾Yüüh:ÏB8¯BõÚ#‚¯>ù/W·6<°+‘`¾è‘²Î6Ïð+$C½TÖŠÔþu¢«£É;8NõGDz"ð§·[¦"¥;*¡yû¦„®?²“Éó‘£\¹úPRÙÖÃAÆL1Ÿ4—¯ˆQ®ÊÊP× ŸuÍ8¿3ÃéñùK} ë2<ïàÊÖ??QÕG‰øÃP64mÊfA³" ÿ£Ð¿0Tæ8­eÆä[' ŽÐf}œ†¿"õiÖÏýeüsֵ•ˆHÌ‹qL, @5ÝŽzdë¯s>ÚHÐ_ Ò:h"ëĸœ9ë/ÓwXGVN~Õþ<ÿęɣTÓ-Rº©æj" È^Ìç<6FçË:{ùJÙb<#)C‚®‹ÆÖûº$±KMj¡ØKT‚ˆ¹L§Àjõò¤5åOù5å;_¢"çì&þðU³î`Ø f» Ú—ð«Ì&/§)—UÇA `T½3ú™QS¬¶†r sžì3ùÊ®(p¿ÎMÿŠ2ö~‡¯`Ÿ–3!ªi{HÓÞûª•²ÕUwŸóáƒï݉“RÂ-²¥ÿ½W!¬žÂ UtïàiFx Z*÷Þ]È@œz8¨5~*òüëÉí·+X Ä] KÉIz Æ©†ÕQñAqupPªïÝpoU«®”8|Ðn)¥¾ÅŒÈÞgF<±[J6Þòê±B­©jK©¥x5&^Û8íÉ·òºÐ»å¿kjN<þ*दîÉ3#”††“úåãMd‹b0«&mÄ—c6Ï-:Ÿáš%rèסïOÂ’êaÌÆÜÂ6¸u<Š`ò6€.‡Ä6_vv}õ€pM#Ÿ åA{ùkÖ5èûÄ%KZ|…5[Æ3 #Õ1·ŒGfXXâÉ+“JØáë§âŠÙÁœ0Ùð~•‰þÛGZâš_!ƒ5]€Ä ¦€uò—•Å»®z$ìŸB h"Rú#ĤÂuYósÑTÕ¦›%uFÆác…ìR¬Q¬gC£îá¯Ìé—«Ñd3ª!Ïl.넺Ӊ!©wòt¢Ë6­™ûNÞŸÉ=§Š¦n–ŠqÂÀÈã¢ãBDWÄ“š @Ó“Êe%‰ùøœ®´¹ ª€š/þKÍ!YCâzÜãï€Ý–³.uòÕ› i)5Tš}Ò'Žj뚣*©D!$¾fÍš9303i¦Þ¦ûÞýkÐߺþUgÌÁÆÉLëttu…ùæ`ã c¤š¿7qfð QÏ`9ŽªTÄøUsyŸ)Õ O]•Ù踸+ˆJë¨Ìù_š„:1ë¯H\…‡}s„ RÍ —¦[³óÉ.]s(ý‡ÐFr/=«WˆGÓ9¯ùеUÄSÖA BZVýj{3ÇT$ü¯^ 󯢪¹62³Ç€ªµ¿IâN¾ €uÐ95_þµ,äÑ?î´ŒT’,=Œ=ÜR ÎH-Y['ï¸4å|na]²#Ú^3ëÙæ z£áò~œ€4 5€–¥ì—¦]¨hÚ?»¸:Jœ]˜ï¼Êš9˜=t 5¬ø¡dõùUc6q““EHƒ¿_€R©YäØO¡×(3‡èGÃàÉ`a$¹‚%QT0€Czž,×'Wfz¦ R€e è±ßÊ)‰X³þSN¿4”­çÓrÀ¶\,•™›ø„Ƀ«¼`-¨ùb“)´hòqc¦sŸG"•g¼l¸(’êlpº×òÜŠÜè¾VåBòù™‘µîjûo&ˆj1Ï?hâ„kæ ¨–ûo oœxÍç/tQQøìã÷ÄÜâ¤ñÑÒIn@ÃÒn%Þ[<æÑJ5í,¡ÀJLM­–ÛÂKmSÞ·ü‰® 2Ñ?n+ð»Udþ³Z9y?a/+ùXíÜÆòôL¥k9œĕ‘zB±µ”€Y {]ÝÉÿ¤ïpì6뀾¸d+}5$ÿW¨½µÐ¡£ãÅX 93Û4 ËAboÝêä[žëÑkzZoÑ@N…‹±O¹~Sx¥Fí DµD¦eVY¸ß(|f·ÐTynµ¸Ða4ÕWê†åT­¶ºR5r\®ê_UAe·_ƒ©ÿÑw [¸îÔÿ €ZjX0Â_O8¬Õ¿EzòýŠÆ³\É1|“9Wdó_Þp¤ÖÒö\lU5¼Ó2øwwx –æúì¶j{¥®,>Èí.@k9jò^½\ct†¯kÜË@gxщ*¥Æœ®>ë˜Ï… Öå¼§›³¯xÒŠÒÙ¼|°ˆ`×2Âtd Æ^ÕSYi÷ìTi]F–ú‹“º‚ ¥š£w4ŸÍÔqHÛáNž¬`X÷VËÜ»\™Aj`õÚ Zt 1E –ׄÇ>£ùÿ4èõıÎDë@~Qb‡ÚWÏ£u¤÷ßš»rò«p¿xuÉDN/„Mˆ¦\ Eà¸)b*@®ë8qBÚZŸ á±ÍÖç„È"{U죧±VÇ:¿*¨¿¶ºÇ¬26SÕcVkJW1¬Z ˜d“CRë\ÔÙr»ífºdJw V &Ðé'WºB0ÖzeT¤Ðãàm„nVó6Z!§N¿j:ßpJÕÍÜ®%RÌISµ^Úv¦c †¼µêS‘)Z«ï0ñðÍ›V}‘›vŠ4ÛMÅjåinÞÜ|̵2mêJ-«¤ÈÁ‡ƒýišâ[³e ¯é:]sc×µÓ_€ƒÜƒ$I­lËàÍ÷®K…«z*Mņ¸ª}ƒ‰ : @f…Ðq-?Ð=ášž0ÔS¶›Œbv9‘º§Vb*ÎÜÖårãï*I‹³êÉð‘žNê.w˜ b€ÚûŽ\45‘‚Ø«ý.˜N¯V¸¤ú¯÷?øÙJ~‚[ 6ás¿P fð]Qûzæt½NP,ó&ÌEì>}칟ZwåHCò{vw-pTœŠöÚoINd_g52®ì€[üû¼ÁÈ­C³Ø{ú<‡Ðƒýº*úm-¡,PUîeÙ 0´Üu‚*Ö!ˆDì=}ª¾‚Ú§›Ñ @X'ÜŒ×C5JSl°–ƒ¯ò6á„ïú ZHÎOx $ú™Ç=°Ä÷¥_f¹¤2î9;×9¡­ÃTAŽtõc±)jÇXNíl¤2ûñ}2YaØS%p¸f^‘ÛèD`n¼áYíFº€G„+Iž´CR ÷Ör²yf‚¿¬$æ3šLÿ¤éßõ·cYh„êýÂ~G¤SwD IÿÕ˜ 1òm:,ø¸’œN6Dœ–-ÙÁ0yùKV 4övðˆmD4~Ä þQ†é£û%Äí @¢èƒú¹T.lõ»‹”Ë\Ý [¯ÃcتŠWÞàVøæ}¢¶ùz&sÌOÿ úÉX¾šn·%L·ï¹Œë[ˆFU-ßíÓ¦²MÝ÷8#³bÐ7H†š³AŸßÙH߬ý_‘ É.@ǹœ0t†û|ÑÜ·?ü b„íIÚâ¯h|*}:,T=\Ñõ7+?‡Q1uŽwT±*Áá‚Äô:´4nÃ@ÇLÉÜsƒB;”cf|oW¥­ ¶€:‚‹fp¨ ¬Ì™ÌËb×25hu÷+5hèþBn=I1›±¹Ž&ô£q]Až¸Ü¼îC(7 @e’Ê&ÅÕ%oKŸü ¨!C´>t&ÓÿŽ¿Oý:ŽH ^6+xÖ¶  AoEëä[‡Gâë:Ñ [fÌ-†°y€@Õ½*n~±>ÒÈAæÛ:œR¯¾3pºú–¹·H¹!ÁŒëàB)°ë ”ï©k+öÔ‰tG‚``­CR=«‘¹¯gŠ­¡TÎõ_ n\U‘_[gru´Õ18¡dxT~Ï»›A€ž¡”xÊ'ùÿýû°·Ö¡¨o¢x2ºéÈ|`fÂ?ô¡|ƒ‰uæ;ð©2ƒg ¬u*ÇLe¢ê ¡Hÿ?س®™"ïÀˆ~íJÿdFχVSã)ZŽ”éo>—u)š1'Vd2¯ƒkþ@ÀT°v•z/iá]U™Eë»™H€­5OQ2ú“ʧòù.kAPçÞaÀ8P§Ç]ƒ=7™¹ES f{àÁÄÓA×Ì6–;ÌTJEþÿÖ¸©Jo©Ê FÙ½°Sc4å¾\ X'²*°@Òzœ8žc©ìíI+ëõè`/qøƒ‡¹ÕÇçå ÇÖì¡ 9ùv¾%f€r‚@¡Nçöâÿ”U¤#Pݘá×ê¡T!9Y¡7z‘ÅŸc…Þ‘5JwÝ> ;Ë„)3OÍ$”ÚTvKˆN@ØÄ€_Ý’éø³^±4BÝOµ»:wQ^ᮯ?êædÔårж‡w4¢=wšL{X‡1¤É€Û¹\• ~ Z{^éĉ6<¥aàšfÀ¡fIÿ¡„RɧFwcõ)%Rid|w"•´L³„Ó1Ú°-—V󺇙9\âð?¤&Êž·f}»4 nƒu}¢/' §=N/ì¡ö8Ó*Æ,K ^YÝÑ<©‘AÈWñ¹†ÙµšA÷ÊÑqšr+_[íø!41ã;4R%,Ÿw6\¥¨¿ô ›Á:ý7Kà&0ÿUí«ÁT[ñ´@SñÚã„Tà£~¸:™µµ‡Ÿ =—¡Ó€ähÏ~w1'÷Ì4Àí–†Ëucà:µ,UŒÍ^À¸)«?@vl¥uAæ³Î í6&<ßõƒRÿ[ˆº6P¬E»H0@žŠÕ°]·³¶8ü¸Ìœb˜‚o å¦{$Çäe©¯F`$šêšpŽÔzÏm'߈Æ×¡|Ù#¾·vyôkÈÂjHcÞþÞâ¾!/*а†ôÿu˜Ú ßµ¡b{.ùÅhµYñkzCKð9'·¿=Êìÿ\oT³åñ7vt¯æö7¤õGÖà‘m–Û¿i÷Y†N-“Õ<žq$Òà!Q"‘ Û=•óðò¥0o‹9ÊÕ)7ëþn ºòÐȹ $ÝÅÉÐqÞ1¡„‹šLÑuÈ–ÎV²è𺖽¶ü£ô×Ò gËÒ$–;uêOüæ\A‰_’'§ç"Rip®³:@*ÐŒWsìÍš˜ø#Ùé]5„O­™Åž83yb_.‚6i°D? ¾Ó6‡NhCÍË]¬wî#YSµŽîźÇîçÈdÏÝQ°c2 +,Î]ßD2;þbòl™ìv¬ƒU³ÅG`2µƒêìòÜý¹ïÇ'b«ÉŠî9÷g ÔL<»ž'ÕÂÿBÛ4¤ø¯Ch!,¡\†e7íZVNÿ³C4rx•¹ÆrHâ/„î˜oK ØÏuu=±{ˤ[>îp (•ø¼‡8ÏÃXzÒK#@ËŠk`hÙ±c $-9SçBqZ. ±!ùe¥Çâq ï×ïdcsŽHtË;ùŒœ?2&×Ö{Z5B5[Nf- ÓÐ߬:KWfP©‘Îî®Ô°˜ÀÀêMKÙP‚ýƪÃ!o š°giÈ·oÙsögÏDÿÄ­?ì ŒÀ¥ 1éSµÍÚiò­°[îÎËÒ²sÅm£CO ’üzß›ckì_«œ¶,é<îë4þ¾ó­p\?ø.0Ê:45«rêï èÇá†8/ä“§éÃSº˜ñ“Õûa ˜Yyâý0jò ’tò ê úë³ÀY wžXIcµÚra+9Ek€’r°¸í·p=à~­ÄÉ ÿNy´ jÞÞÝçPׇّzð¯N—Ñ€÷{Ó8¼2Äòø×Á4x¤ZÑ”—æ€VRXГ¿0hCVþ:qÀ  ¼­œÄJÝYßùú©9 hjÈ[}Bÿ:0æÛuH¼ÖQÉŸüO€µµ¨ã!“È>ù§§ÍÜSfë< jÀy@F·*7YCÞ+Wø¥2SÏœ¯ÐòK\ƒG¼•@_@  )þw½¨R>¬¡Ð_YxpS(uÂaòckA$/,§> ȶà5ǹ +éû˜fÓŠ#“é3,ö¥F’ƒ‰ƒ¬šu¶æ“V$4‘ä0žcÞûߊDÊÁŒphF—ýMÚ@wŽ UÐÆV˜'œ# ‰õ1¬Nwí¼u ZÂØ ãro-·°^Œs4(Úm§î“¾¡…Ô}"’[¨¦NŠhO$e)ñð¶W4’ï©'“¯A/^Às¾o?Cè--L%)E½dL[»‹&¼ý¾s„ó‘ÐX“~84­!^ºÎªÂˆ`jsÍŠÁØwa«Áá$pŒŽÀSchù~¨!i¿•z»Oé»â|u– 0=/¹H±‰—³ºÎa<”±W <\e„©[Ã,O¶“u¸Î =§ó’¡q<\¢@; ükD»´rñ»0ùz „äVÛ åZôÐXLuØ¡@“‘ì0C¸"[ %ØcEny?ùÊ@ §f™SmrÂûJr—kÍ€ÿ¯k4À1ÆpSŒ»~w ÉýëpL*˜#²¬ƒów⬈7tÔÄì'bÀäŒã¬9Ê06NæË#€ç ‰>hÐ]Ђ;÷Ú[¡y¶+ˆyƺ¬ë Ý›kÜ,DÚû:¨ç„U·Ï¢ÕdèÔèÓVW.P¼Ìw'ó4q&- 7Õ#km*x–qt¶’öÉâĹ*ñ´v…ÿRñ[ ÖLƒ¨mk†Áóæ„Ê”CÑ#¤øf!Í]à@ÿ =pýÀÊä! ¤£—˜éÑ/òÌðÓ:0ÄŠÌ“€}zyºS0 ~{oÒú×Á…VxÓt´¥ñt?Þ2‚7Ôú èwÏ’¢ô® Ú¦¿U­VD@}jA,Ÿú¶çz41xË:Œ•žTv;(íò XJº+‘‚Âa]èE66æ®é0t‚¿ì`zÚcØ“ysÙ4·{Ïïxs°:‘Ø¿ÖD|°o/ ˆ´ÖÃöÒy¶¸ØåB³h94:€—!æÑÃ[+ƒ’ÅWyVéë­Ä>WKÅGÅF; Æ'΋0¤!½¿õPv¸âuB¹Ša#¦ã9jÈsÏɑ҉,'†Ú:½e·¤d ¨;¦Œ½ðêðDµ.»#‚4&B·Õt '˜¶ªÂÉû­{U²†äýÖ«;;b2õŽ Ð†ëa¥#Ûb]ÙÍÙSêùN-Ž9gH¢õ‹ ¾!gKê.1г¹`n/"™ÝÓ8Êmçó7§›åó%è 4 ûµUzžÈ{¶‹y|jFN[Xe‡laÏW)öõ“h¦©ùb=Kàµ9‰}çztaØb‘¿ªí­ÓŽû—ߊ4žóMÜ7=Nêîæ!ÉI¹5îÙ…=§6Âõ ùÎï ÆXèåÁ‡ô/†½)JÒPrvNƒF”X¶o Tq6²Æôý»ì”§Ó-„Îeí…d‰&é[;0Œ‰lZÿ]‘ÓÒ1—á½%L>Óµ‰ñ([9žíé°F2}ÝŠ}œ´æÆ0:ž‹¹!™?·—ñ†ÈÏtdXëĦ#Ãȇ•qMÁÛ ñ%Ø´!É~Ò!' Ú,í}½hDä|4¿»Œfvßé„ô—1Y€\$þ;3µ×ï¡aŒí/¶¤ §#k†mdßì‘f±Nx,á·# ɳõ¢jƒmÒmÉ‚ã{[BÔgB±í  ïP.Ý—¸-ônŽz Šm[¸àh㊭ߦ–¶ý;â².ï7’IþMsúUWî‡Z;¦7xPÉwØé‰ëš(¤|ž»‰èæö§Bb†>ûôüF Šçg¾Äc­ëDÌšÈà.Yšz»ò¼F=ÑÍóúIÓ,ûÜ_a–°\ i’S´12¨qƒ#›în„;l8sc¦Óeœº0‚ìp)ÊQ^ÚíC,ìJ‡•5z7Ɔ•AƒoÃYˆ^.70­Pç, ÒÈ•iÀŸÈ (á\-ýØ‚¼å•Ì2àúBQå¡‚÷°ë1àÔ>‰Pty\¸ÒG>v<›9ÃK6øñ›9>7ß^¨±­üzí¯"Å¿ Í€ ºïæÛkŠÀˆ½ÈaÊCt„4¥˜zò;[½Qo¸.²¹×AM°´q*h‰¿zB_¢³ÐˈèLw¯ÂÌ!êO ‹9^Šl” ˆ—6¦«; =X'Ý9¶<éN|¿k¯¯šCíY›4/wV?Ù&›eõ§]ë¸M'÷!ò 4ÿ 2ñìoŠ‚À3ئ¿”ß$2̯ì0áE VZjgv‰z1n«‰÷Ë^{ N¨g,mn2Ö¼±ü ¹d!%[rࡲrC­ìuhGÊN'ÄÂJ¯(<’ü×AÙñ`ÔWwßh·!„$þuðÉ€†¬~~ÄÔÌ.a6ƒšñß°§•„Á¼„¦0FP ïU<™IÏÓ7æ»ÅÓ7§S’5äý¯ÃU3ˆ€ KxQޑ޹MÉ4$ú·©1™†d6ïè1ùÕ Ij8æJŒMb4Â\â+”7¦?ŸÊ«5„ÃÎòDN¥ã†h[3 ; ‚)îÿfNÿsëÓx¦¬;6èÿgxµy/™Yx;A Ñwûk´ÁŸ€Mcb2„œÁå®Í†N6˜¬ÁÔÞE#à¦é!K›âYB ­~ŸHnZ"'~&<Ú“¡(Î)æ ¤$]îùe¢îlw7A Î,Ÿ¹dfãOAêþåSA›!A*R;¡'|Læ‰SF½ vü þÑJ­Ç‡Ár ÷gx²~hç3_rdù#wÃ?ƒ2°7Êt ¶ºQNŠ?rF ƒWÍpóWÔy[&3¢Û1}r#NŽÝÐF"d2ïª>‰ÔÈá_U­ÀЦ—ºl̇·²ìk˜SÓk%z/¥‰ôæ€ee! ¥Á¥wÒ˜ã?ïèeB"Eh¦‚Ìf™õÇAfôYžÂf5döƒ?±ÃU¾›F­irÃþÜÚnª×Žlåþ¸9Óázì7æ80{a MêV7 ¡#í¿?‰¿7ël®È×z¯Oh 'ÕtЬ{­#ôÙŸtPGÞO·LŽÌäRH©{‘YÌgˆ/¥+<‡¯ÌIc"CµöSÖœÈwþt‡zß±5Ä€G´ÐeG¼¯‡:SLޏ!Œ"wäGY­×âêÌÂÒeJö‡~èÖ¹¼û½àÅ%ôcÆ@”ݬ ãĦ0¤n¹þ SºƒÐ6»CsgJˆ÷ïozÕëPLÖ!yXÊR}…“Oå@¶AÄËî± R¯zv²¡?¶Ý`f&|Ô¦¨dÒ ë®?Df‰„rn€yk3*. <Ë ÉíÏ]^¹±z[$âÊÈ ÎJõÒÁÐm×ëÊ@Rfý©÷Ö­÷ÄZ’|Ò´ý"§ã<æ~ÑŸ+6Óz5§ÒA=Œö¹ç¶¢ûÚÿg­·e3°£¸ðqPžç¡C4dý›Ù£ÅO°\ŒÖÚOûã•Q× <¾îòÈÝfcÜÇŽŠÕ8«ÕW ×É6lvü)pYô+áYìOïç+ú¢^o`>æð¯tÂìÁé5ï;¾âª¼œ™â–È +Û7äjÒš` RK†E•ÃRèÄ»®råÚ±IH0Û%‘`WõÇ7›Ò(¢}³é !觬ga•Y} Ù‰³£Áza¯XŒ†Ú¯ØÎ\FXÐÁ£VùP} Ö»!ðžU lJa‹¯¼#–µÓ?U8ÓûÁ¬õ$nk·êÉzc—A· …Gzä5:R}•Xê?;OxpŸ3jÚß °Æp YÌ⎻·#íÿýCÉÊõCöª<?`ÉGØ$‘ö2Ê9~ŒÌªàŠ©Ïqpuä­]µâëü´´‘üß‘ü\± ïú mQZO,kìá]¢ÙzržçŽÔþkãNÛ… %˜Ã‰Ê’Êû-hü{ÃIï Ç,ÕÑUÑÁ=€3¦û¼*ŽöÄ™«üeu5/ªçŽŒ~”Õóžèl…&¹2s¹\ør—¯Í†»M0Ÿg=qº8ÁK'{ØŽÙulÑëLþѼ<@Ùt‚ë"Ÿqc~Z¯tµ=c¼rqå"pŽÖC|b'°¥æswàøÖá´‘ˆ¨n|М1NÞ±©÷dšYã'`ª42ØÑ‘ê_^tlÏÇ­QbuƒËfdà¯Ã®ì^yõ ’•±9ÎCG^£S­ªZ˵gÝoNü´£h{Ïg¾qdëí„&‚kè‘ù tÐ37”^‰ËJ4ÃÒ=;âŒö~ÏN‘Ù3[æ¼Eí³!Ú³10ŸwhMe¾¬û3jýÛ]wcÌzf×gM —v„Ÿ¼Äl†”sl>LAÉéõq¾ØocÏ è™õ˜ Õ#îÙ‹“A;:döC‹µ¾§9rþסÝÓ<—~r•ž›§çr?@Þý(±±9e‡äO-uvo`Py2ÉÌÈÕó–ÃÌukgíHeX‡¦° ï',ö|ÙÏ’¹å-4Fý×ApiU™,ÿÍ×*@Z=ߤ'ÜK¦'LÉíÊïdì`©ƒ mb¬ž«¹Õ3ug”tl1XÐùš½³wâPžZÝxÉñtÀÅó©Îšá"?u'´“ Àëûu$ôÜîÑnø†®ö[OŸl¤ç­ßC“;šÚ‹é»ÅtË®ŒYõÒ‡yåȠçFŽ õÞ Àг£:ð!g'àÈÁ~³¢\$•'ò‘²pðt îB‘v§[ì  œfÙÅî,*G¢¡¯F-£Ã@FV2öXéw t›#t·Èw2øc ü;ƒ$Àá[Sc<1¬#»gOÖdý„ Ú¡¬ôàïˆß®ƒú$An×_õ~È —]mï¬3¼w½á%¡' Ž–%"q†ú­{Nüy'Ú%#®L&ÃxðÙUCßôK¾PóEÉÒaï%K“@/5ô<Ãsÿ˜K3^ë¨ó1Ýp¯|ˆÜ8#yÝágîå˜7dÕ¿”®ÂݦíŽl<œ)ÉtÉ^‚yƒ„ßu"LIá ÷K‚¤¢;:ýoùÒgYëÖg{éÏUP¶Ó–M ŸQ/ý“ðñ,ûß]•Hxg}ÝÛwêHÎ_‡ÛW)”Jˆ8t¾wøR/½!Xª[Ñ/vMÇ×]BXìW`ì½ù—R #KpÔƒQX„<Þíål¥ v¸K‚÷ÂÎrŠæLWf™Nc€ÈƒÎZ-*t(wB”¢U(Ïçîɉޛî€æÙËtµœ±ØPl]Á³zÂüŒ™£5[ýh~E$çw iµ™ß|¤xS €—'/|ž·Q>€ðUÀ¿WQ ©ƒ  ËÙo4î!‡‚¼±/Š.¼Ñ-2mrIeûOx‰¯n:påÀ²‰t{…¬; pRº–aLÛ Ù×kÅÄ;Ѓ¾KXÌÿ½ä¤•óíðEz ©J ÝI˜ò=‹rUß{šdÞcX]pñãŸÁ  XÝ^Cñ8å[7ÊIMÝÌVë·_Œë=U˜&¥åY&fÔ·érï?p÷èJÐZ†{ „š7Ç%ð@ëW-€Nè› ƒ ?û•wÁ¸~o·z uP3¤Ò‹æ9’±Æ,išï”TªÓ5§$”®ªßII¯ÎbɸO?No®ŽŸÎºm:t9†'ê£y£!rj:†ìCÏVð÷T:Ò¶¿I¹½æðUèÍê¸çÞƒ^óÕ¨ƒ{ÞS  â^ó¡ÿxÁ”Õs—¢?ë0Ü#T¯RžEkt‡M¾–àªåå¢u®€‚Ý<ŽS³B{»óPî·×èIƒžY‹aÜñíÅ Y¸—ºQ°cà‡0ü‚öO¤Òš!¸L‰ \„¹9-8P/=–KÒMúq  èÕA‰½rfÛð1fzÜž Jï/Z)(ÃU¡Ï3êl=%°Æa1åàå‘ïeµ]•Öá!î•”šÜž_Œ˜´ хͨ˜9 uø^Óé?0¢v,"*!_å‹¡WV{t4¦Îîw´ª¡—ýY¬Nõ†ú°÷þí|צëôÕæ|ñÙwl¸L{í÷tRVMמhàÕ®ææVÔžºN'÷jhâÉ« Ûd/7©ÚRÕ°MV¯†W§{Æ»vw¯”Šž%á#X'òn:~œ”I%W?‹¨ƒ"@n‰B`R%$­ ŠUR¿ÇžfHp¢‚E`T‡dRf@3w ÎÖY·¼h›Õ€%D÷Òö¤(éN,Ådè5 Ê«%P)e=ÐG8s¯WŽÍΙwÒ‡vÙZäæÏk«jêåpá†eñrŠÙS¯ª%¬ëßXpP8>Cæ·çÐw¤ Põ¼¹lè^Ý) -Ýn*j\ôvåÛ”®ªbsPÊåzb¢?ºJïJsÔc äKIÞ½{¥³N_q·À º{ò¾ÃÁßQï:€VåÞ0X +i†%ãŒãò!(‡=€À:\ƒë„ù#+ê}_E è{ÇAN|ï—Ó”¼‘…î\ÔNøÛ³€”^ôÎúì Ñï]ã6ô©æÏ•.zwKµƒ^ ÷·;¡÷·Ù@ï·!¤¬÷|0±EY1[<n|…¹®ê›þ­Ã(§ÿm/­N*› èï;l6€ü —÷…­AèÅpÍŒó¤ç XÖIRb÷{0žv®žNª¬›”}8ëæúwóúÀNlY^¾¯€Œ½”z뛚zâ…œ©êW+¶gmâ«=lÓáðY‡_5œrîÜP5x½aU¯jSâ M#×`TÁ ÐG(®IhÃépT¬nƒ}päÐÆ DÉÒóÃ/¶íæÙÃ_<ÿwýØn‹É)}dWzAZЇçÇw3ôèÓÁþÒ¼pë_—{ƒ) !ôyhùÄæŠ?´¹>Í3ÀÈLmf޾Jsõ¡¿‡ÎÕWìDTÚIESÌôÜ„‰“‚‰C&€Dž+[ÂuUݯ@ç4lš~ˆЕØ_Dðæ”Oygá€Ò›Ö‡¡G‹cs9LȾ΅…C bÛe¤ˆbå-nW|l°ÍäПezÃA%°)§ú8°4RNõ±·j»»ÀŠ"ô ]#†l”æX)$á¿ °£õáñ3ZsÄϸ6¹ L˜ôìE¯FºCG èÃ7å¡9¸AÓƒË"ö Â:#ˆðj¯®ð6©»Â;྆T£i7*.¢@`Äô¦çË´öÆÐÁù.„B‡MŽý¡¤hëÁh““¢uh}Áè.SS—?%¦öiü²áØf–B%vÑð t °-¸{ž®T£Ùh¥Ù•Ø®Æ NèO¸}Ì»¼a,x¹ ôáì/Ä›¾l ßÖ–­rÁ‰ÝHlóŠsHgÁ‡s÷ù„ur kÝ +û¼iX˼Ú•S+ è¼ÏKœ[Fnâã:N¸F –…¬ïêÉ/Þç’u8Ã%t´8I×áŒ_mêÓ×9ì@ŸÎœÊèJž/Í×\Ñ84¹á\ÉÒ}*Ùsh3¤ÎÜ1ˆ ‰8ƒO ,}–БåW«(óh  4ÜcŽ€>_ë¢ñ¡a0O´¨Ò0cÛ8_Spê´ Ú”G?›Ñ<ÝÀXѹ6‰M ê¦jTÓ ÙqƒÚ!º•ÃãÕ§¸Î ‚>݉›èX¼­"úgõpà§®‘·PGàXx‚ü¡ØXƒÀÙB Ù6«ë ¶î³ºÓeÖy$&×”Eop5ì°Ù< 6yY;ùúŒ%}žšh‚Ù$ÎZѧ¦<݈.Ø$s­‰Ó®JDô­ßÃè6¾Ä4Þª@u þVU¸/i¾Ã7ÄD̾™|½Ûe ˜”š>™]  @ŽþQÊo¶²õ;KÅWâëwABåfˆ7#­¬œÜèS ¬ãScA£_Sÿ橺Y OÖˆÍ[bÑÑAÆÍáAO"ãæ¸6EŠ›J›YïDIó%X¸ð ¯ÃîI&Ý\Žbáà®=Æs0‰Ì ŽEB§Ð© oÏ+x#• É Ò:h –EÃŽÈk½.‹Ž'€§@’0çyî NÏS¢šò‡U­÷,¼Á½i«ÆóÄ9”ß¼øè?¾qhi†+V7.Z‡#<8Ö‰|†N ¹hHw>ÓÀÞ0MºpçäJ Ê2ä;I“ªÄºf˜ß ßaû åp„m`«_'ÌxÁ™|öàèÖ°ùgüÙã‰ÕŸwêÐxò º7õ4‡"|Ý Vtmž<-ªB=×#Ë­m²(Àx4SžØÑñ"¹ÀM8mÕã©|Ú <ÍëнÑSJÝiCI<Ö;°ÇèÓ‚{ähø8®kNOžùޤ/ÿä1[×Tþ„ÜŽ±Öo7À0°aÂàñåÎÀ„ÒÄP Œ@)0Ôe€)ólŠ6¡ÝÈðØŒ‡`¦%—úšö̺q¹[OÝ]ÉOt°µçñ´Ð••'RlÔa3ÊMøb\ç5™.wù›úxG‹òÕ_×£- 7ÛØÆÔã¹Òna̸«Xú¶«ŽGË×<Þ³\Jý–Üϱgcéá<Þ:X©94ÑjLH;ÔÖ¿ybúœkxóˆK‡Ò[}O!âÓJø®Á‡ˆ~!Ðî´áX8p&áV®÷X LJå|†‹ùU¾n q/Ö¶ÚÝ,aC…éÙÒn&>(ýëñÀ¦ì¡˜h¿ƒ ÇÃŽtôx¶î¦¼’F„ ûéy>I ô¼%Ðê÷uv׹ʺ\7 g޶BfêK¶'ȃÍ*0+2’•°Ñ+D¨DW¥Âƒ5};RÛéJáÇS”/m€†`ýá¾—‘®µÊ’ݵ;T{p 2yÎÃóˆÔ/'à€­1R:®ª2†‘Ì¥†é<ð íRK”N¸ÅðiTéxâdØ3[àçLWÉylX{|$å±áv2R~‰-<êPÿS´F‚¼ûvtW"­ZHR &)ä'Sßå¦/]×”Wÿ’ÙÂãQåâ6¤¹±~m(®™°Œäø´ü„¨™PŒäôþ@GV¹ÄõHš{'*o*±#jò¢º¥±ÿe7‚£ã.5ªÅã.««1¾Bªd 5碛wÞŠ˜ÖÁ¡„Lns© BåF¬U䇮kBÉKèg©¶#h¹ûi^`WÈHóÉ7ú‚‘¦ƒ°ñHÍ÷o6¬wL¾Þ>»l…㦇ñdW‚NÆXøáCþßZmÑþHuZ‡ÝjlRÉa·¤œñr^¬˜ò‚áŽÄÑ&l °Ø¤‡™1½~{]O,©‹ÿĵdÉ=ÍèaJê‰iýÆ2ñ#RDÚé/¶ã‘^>µ‘XÌÆ¦½ò ¸R(X@á*›ñ-FbòM é@•í…;’ïZä ô¹zpëG×Ò@Ñûu(ÚHÚ83Söå<ت„qÈЇl„m;˜”oZÖ2QöV /±-¦<=ôHï¾ÝÀ:x3ò²FÂêDJ?c”Ÿ•äã§‘ õ³opd­ãô„FuænžfNµ52ŒÅ]ÄÜuâ®Äÿ12]YȡǺôƒðò{^"M?øÒ!Á:X˜¶âŸ—9ÒÁí4¯é¢‹Ê.pܬX—\þŠŒ'¤¾Õ¹:9#Gv®Îú‚‘«sd={‹JÖvò(ÛÈš@éN.Ön õ7Ý/9PRƒ1úqŒÌò&ýNˆYg÷”)íJ4`'æÒd‹!Å£b dD¶áa 'ß}IªV ¡¾ª±HÀº(|¶àÕ"ñ³Çv7«jô~Áíé  X5"Óù`Õ%Îr¹Áø*ŠÍŸ'yJö,®E‹hŸn©¼d÷.®]MµMd„I\ = ™“kèI|T®® eŽ„=ƒójû%®°}o錶„×’Yw†–BŽɯ˜ØŽ£T`Ét‡ŒÌõrGt€£@ˆïˆ $Ü6²‘Úl+qä BPê¼Y§ `¾C©¯þ4ªšpt\çׄÝa¦‘u÷ ¹;ì É[Œçñ\Qì‘Ém³wиH.ØyÊÞyÀc0J²7ì‚B·q¹y‚xšvžˆ-é€Cô[LY&ç¿2n‘Œë{x@ÃA Ê£8‚`ž½hHf¯Ït;ã¹™¨úŒÀ4ÀPüLMi`€ÕaÓÅ ”ƒwkŒ~¯B=®\*5|ë\ =C§y ˾ ßlPL—08ØIŠ2wJr´6ÖE` §88åFc¬ãä©xøÁ(wÅ3nÝ„)>.÷-“˜d˜‚!¦2ën%,°âDÑt‡âDÑd£¼ì|‹½X›hÇl`ì´mˆ¼z“ÇRãZ¿»œ#Ù@ÓPÄ€—²²ãë}íÀ17Šã֘МOºÌX:âÛ¦/|WS^º¸ø8õ¹G‹Èød”ëWi‰hÞM†^éŸ*ÁÉ&‚QÚ^:¿†¥Cáð- c:Ã:#Ã!ÈÀ<åb"H»«µ[GVh5'Áà"ñÊê¨+¬£À%&‚’) ×ïxH= UÊKŒ¨Þ½T#û& 5¿OÐÝ ãð $…Ø^Š9ÐDCÜöþ‡lÛŽT7ËϵHµ\Ì6CIª/,…J„ÑB8\F_¼©p`cO{ì6â 5H$†…ú;ƒ\}Ÿr¨mXês”z[ЏZ ›“>°†Ì ÎYkÔÁ4Cœ½s€†aˆ³w®±æ3fQ™¹SȃZ¤2¨sòG}>Ñ„‘VnÔ°éTz·¶—û¨o#T š¨±ÈÏ>¿uÏOä+˜ñ"ùSݨ7ofóäyC_2o ».É!sÖA%9²ÿGuîλ‡mVß|º>a»³O›ù¨ *›ù¨/r›Q_ä6Å»†3ж¢pÄ<ÞxM‹ýkÆ ð—â§E“vÇnÄ’äoÌ;ªé„ÚP¯ ‹ƒ eT{*Ǫžn¦ï²íýv˜¢ÉK´þî÷Ç–¨Œéì°ü ãð ðM8»Q§ÎY¦H=§lŽDzóÛc³3JÌ­GOú/þD¡GHP>×'=u®ž•£QçêY9öñ¨ž•3X·!¯fw›á»p¡åÏRË^jE£ÃI+&à:«î DwF½Ó@áá<ðÑ0a„ðŒzW¦°¬„;¼GÇp:¥Pm{å°+ÜH|é¨ÍÕ^¤¶z'j‘}úÒ°/Ì /‘iv9G½2Ay+Fpd’yÀÂÝH±Õ9HG%¿Í©© ¤4¬èY ·»ð¦=>¤Uëá¥ç´—Ø!$%íÑ ;>€ˆËh¨¼n÷ÞqűP ¾WdR楤Åe*¾X¹ÄÖhuOt=- ×€‰Y'\«cÂh‹ˆËwOOx´1ÁH°GÍèÏs[ uj 'í<ÁlÅŠ í4™àîú&q»`ëO$¡q…)z Ph©ý– |ô0\¢{ëƒßn4·sr\F3ÏZQÂÇѼÛ-Ãh^m4~ã‹ÅS¦„b HÆ[É^¸Í÷µ Ú)öI›@ªÜpáM„§¶ÏxüDMK^ïj]‹–åά™òv¬¢ÝC«Äk:ÀgeA–bjJá9@g0Ú8nsÒæ£\° Œæf0¤ý)÷`NÂØ°ØçFP1´T 8m†å}®bŸ…pÏœm§Åy'»ãΜXgØ 1úèº/óNQž38ÿË3 W«_i J¢±µSaé—´†ö{ùÄ©÷Ga€™µho&# ]W—$“KÇI');­átˆÖáê„Î'Dˆ;¿eËUNù¬œÚ‰ßWqÖ ,Ýub/›³çLFF˜~íí ¨dï¿f¤‘ #X‚”Qö•°tÏb¡ð.Õ|‘ª<ºsd „vFå‚Þ(ðè0 }ÇæEX­µ$/8ÖhNÕBcŽ]_>1Ó ð[`Hp›{`€v R¹ÎíÆ¹üGgäH”hÏM®<îé¢fKq¨ö@†Ô`¥KT£ßŽzèžU hØF¯;‚‚Åx(1Æ=@¾¦!69ý”ñ]rg Ÿ}„ÒðÀáÄnb塇~âslж L4äïø7Ébüä'þ½É|ËïÀöÁèN½ÁË<¶zÑÍÈÁNé`û u]Þ2O»¥¨)jà ÕÍ>0º%çØØL¹·åηtŒ€ )¯[¹/Äu-hCàF>LKgfM­;£˜ÈuOˆãèÞGVŒÊü¼ Æ ¼pËŸm,£ÑˆÍè§´´ìL›KКõà~ùî¦1šÕÃnƒ-i²ïÉý èa·AªÆè‡Z]k-óµ§V>¥û߬æØäCšóÑÃ#Á°—Œ¡© <c_dà›t`€³`Ò[Òæƒ1îJÁµh:D• òÀ-cæ¶0êÝ•y·¡gYǦ|å™0å•vÀ¨ý˜#*í`‡I¢=Æ]éS§pñ»cIÀAÏÐZ¢ÜчSáPçxÛ×äH^´Cñ£É5b`›ºO£ñ¾#"áa!»Q¦a¦ GM4µ·gž°f2(Xê¼Ü_a¼ÑÃÒéN}2jº6MlýgÓÜ“,ËHV(Ôp~µõ´u"ŒqeæÔa$Í[¶“m=°àÆ«eW«'G…ÁÝòÜA~¼™ØÆ´í†KmÛ ÷^á–ÍÜ>üÇ U<÷¶l”v ÐÕ2–2 ìÛ½úƒ‰To¢*†ù7vš;NÎÜ·éõ×T¤Îk«iMž>…øíºH³QVÚrº­MðB®Œ1*ö{àì…V0Ç=F¿ãœl9va Í>ôü+–V„aÅrv]ºl46aø˜ó³G ì꘶Õ`û¶Õ$u²SoòF £®ØMÙÝù Ðìï€í=ùÎÐ%[Ç;&B¯ó¹˜@‰q¯›sûB(wNçË4Ö,|v>œjŒ§\ú´vfhA]‡t6£#‚.[ôÖ°>~Š?€ž4ÝÏGgM&Ì'ÄnPcaZQ®£ÉÖ¬Û’ßz>ÇÁ¦õiŠ­C>Ñ…ùL4\Óó5G±¿ÁÕ”MôL ,U›ÂÑ ‚CEêOó¹"ÞKKxB›x"iÇd<½PahÞ`f5y}Òùpl½˜+ ¶yEÁw²ÒgcÖ•ÀÓ$çÀ»ŸÜ°‹©M–ÝB¹³&„ù8:m¦—'’µ?^Ým‡'_ïDÝÄ£¦;éÑe†&¶çùø2£â<Ÿ[”kí"O¾4ÙùÔ»úìD´ybºtuЗœ )VXª¶XßÿÀ|îbLÓ¯Â5ǃ˜î|Èß™|ѵ“Eþ¡¤wVÀ„]3/=‘ĺUû ¢Ë(0×qbjΧçóD.ç4ÊÄ~tÎhø,Êlî#ÜõâŒf«úh°NÈQ¾ç]ì­/qFŒ¤WBl,H& 1áëòÐNE L°Ìg„È…<<–< .HÖ¾¢cKUä0YCS™–šÏÍÔ¢6Vc¼÷Ëùè=A@ôçÜMœé"¶œÈêŒ9íŒó¹öê¾íÏœÎcN]~>^ê“N†» ÷|X'ú‚ÙÌ9&vO1eà!,¤tç²Òb¸÷Ð…À:ø”èotJ½µaJ.q5ÓÙjX©´–Sr•XlRõìžNéùx1MMP Ìäxš™T]}e*W”y’˜Ì‚Œ‰­åƒóy5Jp½¼K4Í”n¸Eã‹éXÉ8'öÍÀ L;S¾ÉŒ&ü¬ëPΚ€ð |¾äœ›k`Î3_\ Ë¿¿yT³\\ B3yi“™øÄò£Å`,欄 ðþuê¢N± €™>×ü]çèO%ãmó<,¸îgº–Óég¨¦¸þŽUxÀíÁLK› C˜ÉÈm*Ü?J{}®âX{­ðl@©2îÒd@3Àju§šôYÀc&ya¾}¥%©¿å.^Åx&7H'’;Ö¡è‡Vž‘ð¼üc*¿äÿVå5A¿‡´OÕSÏg` ˜h¦õ#.w¦‰ þiLý`Ù˜É }B€²+,Ÿ“Ön¶ I=ñ‰“4È÷'¸ fö´O$“4ÚU¹˜£{>ª„¾Ó t‰C;Œ.¶ ƒ™o Q¥©wðní!³®G#å Ã츅aV"Ï oþÌNäI—Û:q ø™?ƒf`F›¤€·³–ýD%“f¾|“uBXsfe±ÙM:{uœIç„Åx:¼CÛuj` Ääœ>Š'‚Ç/¦Ù‰\3¸(¼ ¤LÐó XϱïûQjä”Na–FxšN¤¡öl \47ÑÀÌìi'˜ ˜F4À®Ç&“Mmļƶ»€s£fw.V>¦ßëü#Ã󺙚›i€Àñ™ç¦ìF\~º]CóH™\×Z›;‘wŒ[X2Ú>Â`ØøŽªúÂùrˆü<š9Ûx) ¯ÚÉô‚Í<¦aê¼¶hJG LpÌq›`èk@Ôá¦ÍUõBá½QZºAÍ›Q–ŠBöjlJÚÌ3,Ê«þ‰\3l€¢T±êŸ¸:èá´°×vd* ˜‘—÷*»¶Üäëií ÈsÔ½ô³xÁŠ¡öª¬˜y—kê 8–bz©})ø f¹™nFº±v°¿q‘dzŠòæ—ýÌŠC¬UpÂåzÑç´4šáAH÷€Õœ…’wh•”Î@ÒÆY.­v‚o V¸™…5ÛнþÀÇúæ3Á5pô}D‰®»’š'\§HéôGpgDõ¾\s¹•‘Ž6EC,» õ<Èñwù,Ìþ¸”“ -oZx#º®™ϸ®Ê‚Y¼þçD&î,^ÿsÒp+â:ðÚ^UùçëwºÐ(;˜C{ ¨=pöŒÈZähÀF^$n”¹ÅFCÐÌË©«U)B½©õ{v§nQì@¿Ê³âŸ.xÁ±|HÂWÊór/ñ½Gð£c¢1A@°»•,.Ø^ªzq²=^ܱª*”P”^•Y¶G¡@U “8¢êœ ,˜¥ßô, _ìz^qB:B>¦\¢øý.•S9¯”BÒ‰u‚!ÔÄ{Õ[?ÝT ëD;¡×YôîOAïˆæ™ Xj*K}8Ç‚ýYFD0Ie* “¬äžE ¶ïF*ÏZØ7Ú‰Ï2N_3><­ÈûšÒ6$¦©p‹øŽ™nsA9éê•qŽ•3àð€Of. 1ï9pµŠ…ÔÓs‹ÒI÷0 •ÞÓž0¯¼°‰LÃ){ëéËtAˆ~ÂÞÄÞ”SvºZïÂ(ż›îãT°<¿# À#v´S´ìô¶ ›‡ÈÒȦQE&>—¥ ‡°gïÀP3¼¤z/h£’Š9 Û—&ÊiýîCR‚u`ê<9#îRìSX_©ÇXEHwSôËÇLQ‚ÜOd” )<—K"÷ÔN${à{ÊU©DàuTÛÙµ›¤<î‡J-פ¦a7Cá)ì–Ý_ïgýš 5˜RÜÜ”Ì+“= ¤ãMc!ƒ)×tP¤Ä²Óƒ'‚n)å¥[Ê º4À'_@Š)(d ˆ´Ú§ òS¤\Aæ R‚u[ˆ%ßði V iI =‰ì) ûGbñYXò͸FÁÑȼ©ù°£NáfsÁQ¦pÏ Æ =ë ëRhéåÜ ¯¼ÇE9¨Ö åÂûÌ×9^Ì×qÅ…Ú,¬,í.”9ÑµÒæÝõ€Hçèßㇷz\ž¯I?Ò Ó2AB°.üá=ú8 ¦b5*bJ¥N±ËT&Ù–=š€ùÀ…váöœ×ZííäÒ¯?Ð N%=A2ãïS8IÏ–Ûè·ãøå¹´è‚,§ß$á€\Žö-‚õ’‚)ÃãóS ­oÖðçúª1îè(rÚJ òÿë“ÃWÁv‘yÜÔ¬-ZŸ¸Ü'«…†åN0Ðj —îÙqX¼Þl=S {ƒÿÀ›h“^µto‚ÈKÅ &8 ÖÙ¤ÄøWgï›H¼ º5ã³Ù@'&r„O@Oi®[×kOb±‚\­•Á%cš5ÝÊÚú/Hn…ƒö`7ÓIÆgfx,à6Ý®ŽwÔÎ ¸n¼ XÆUù:&8.'i¥kÓÅÌíåÂ…9øá•é:g"Éà&X‡ãêU>Πª‘hÄT5XM³f÷ª¢dᬯW`[ ²±ópªêVÃDLkÖ°å‹3Mx&ö2ÎZ (– t–zœlômn ¶ånR Jnµba žñ°•ñêTÒĵ´«zï¬r®T7«Û»Oݬ:ÓÍ$ù@TÆ‘Ö3MPm´}öNû¿Ö 'voÓ Z5T µ{ìù»ÀûuM‰bˆ¥HNÇT|EU5F˲÷Så¾€ÒZÍD¼¶â¬¬™³¥+¶ÿËaY[ЄØ°‹ª“ÝLà.f=d7JD≆ÂQrþìò¬íx¤_e©„œ²oØ´¢)6áWÄh—Ž 3ùÿÇÖ•$HŽÂÀû¼¢ž`6!þÿ±!B,Ùsðt9½bÐ í’*gEÌYählo¸îWs^& —|VÌã2ïW4Hp¹Êéô…†¦ª¯ôã›f'êÑoMßòž·M˜"Ürí;7®fï{aë:]ßWùǸ¯…\M» )ˆô‰vèhVzSäXTAÔwÀ1¶d€G»tÒÃÖÁ¥“ÌÝlêDM\ÂÕ¬¼;s¡G¬K›íBý¥‚|‡„‰WJ p äü–[Ì|¬B°£¯+jŒ< ÖÃ>gµ~ÕÓ†Êm¬³ÞBx¥›ßÁÒÃ×ü˜Å Ãæ:¸†¼IBG?0Ð{tÈ¡¼‘[±ÞfĶäTâ4‰u1ÀkFÆpÈm3È'îz¾SÊ—ÓÚi‘ ¿|ågâ㹡†Á Cy lì5x›“±Î9V ­bP’pné{Àï—•Ý;Á8Üü7¯éFp)×J;Á}jÔû$ ØòäG~:µ>å¡ãwy™à†8ÕƒÂÿ!·â°sð£Õ&u‘®ˆY“ØødGÿªÏýí‚Ò0ÏÈrµƒ³ÌKÎy-9ð“ ±Öâî½c“¥zăº)Ó¸¹â| sÇ)‹FyüÜ÷…þOûô²zßéì͆Q„7ÛŸ‡/ñ¥¤Í®8†ñg‘5 \í·DÇ‚‡},“JÊŒ|w S>÷µ ÀÅexÀU0Äex1§L+«pǹFƒÈn·Q#€¬1lÇô‰¸0 Û®®ÈPfL[.pzØè: ˜ðÕô€’aþ´+›°ÅËÕ^‚ü<ÌžÐOrˆÖЬ)š |ιٱ¼kDªè”ÓñˆIœeÏ¢«y”)eÜ÷šÊH&ÝØ2 ågÒ qO5|(7¸¡@ð q 0+Œ@5³Ã­wj5EÓ% ssè@DŸ(j·+˜Ø?ÁØX¯]Ä)hõÄ>ºó'|ìÃ<6y¨[§ñÀx}l~4÷Zº§?u:&÷ˆa5) ‰Îßè·=¨< YÀÛˆúº‡`ã©õx ÏÁè;Ðfר$yZU‘¦{ºÓ=tk}«7öµËW< ”8«…Ä,ü › ·ÇPÛÓx³ª[C;¤]-ô“‡µÀ>µIæ1zŒ‘ŠÀÙL–£ï+àˆò×±ë¬ì-v\qÙ3¯y뎾½ «}'x°ð8tÙ­œäFb&†ˆp«¡¦ËŒ×Yʇ좙§Øè¢u7Àv£W‡bœr#(À€ëüT˜ PÀ ¯7?ü—úfÍ’vÅ+›íø Žñ’í«5”sX8Mc±ŒÎøËŠà¬þ-õ[&‡Hmˆ•a„N¯“`ëu0¿Ôc#ÈøÁ »ø¦Œè‚Í~Öœ4Hïè ®æySè_Uf5B@`éÝ%Píw'#T®_BHZˆ‡çcô Z5$H?ã@’§f¬Ó£ìýI×-.‚Ñ-ØæÆ1#ïvÎÂíð¹ÃÕ%kKæ_tj©Ù%¥ Eûéx%ŠC^æâhÚÓC8sq¨·PMÝÊC¸ F¿å¡£“õ¨†º~ŒVµ÷+¶c/ÜÑ¡ƒã³kÍ€më[ ¯ÅWý-A‹PÝÀ î=:¼ÀÙv/)Ù˜Æ=P9<N eB]5ì ý¢äh]®[êrèR7â9õ»bH?^óŠ!0 ŒMG@1-³ËÿwËK‰eJüµõ탥Xv0îü^±ïFW•÷6úrß½¨rßÎÇÃAí[¡º³!Û7¹î†fg¦ƒ^àLcµæ¨YbZiw§~5xAérsWÄxdBöÜã#ÀPg1+[2¬òÔ3½}©8†Þ¾Ôà‹¡e›l4–]ÁU57ô¤w²²oÐ5áHI Q-¡2rn'&;Ëg„¼×iƒÑ¨—7†½zäs¦*!Á6 Çã'€c`è ´} ø à˜×µó{]Éñí BÃ^½tK‡ày *®æx#ÓÈü!‘gŸØ‹ FEcõJ_çfî 榭wøãÖqÆöæ§•Ö)ŒfßüÁ§òð…e‡ùÇ«‚Ü`ìQà\€÷¤r㪠÷zãɃÕ/’í@æ1W]€ŽàD¸>=‡W}‚ä[3Íú„ÍF°fzÓD0PKÖG©áÈŠN熹ŸnõññyÙˆÛ·¾O{䜨ÛuÆê-z›ÂУk¨_©YÝ-ÚÆD@‚,‘ˆ®ÓüÝ­s„ÈTŠ0ñß8tK7òeªÄÕi¬” ÷îxìåä¨×®mªƒ¡—øf˜ü;y6¹Í±—x–yŒQ5^åTx [)g¡w)y$XGÈÒÌ?cã»à‘e i\C\´ãäu2þ¸/Œ¹ à5´Óx Ä)2F ,»¹±‘¾h§[°¼$Šá0[GŠÁ ðX@ð¥}·b‡•M©ÄaNÏ ønŽ-—ŠZ»v'xçÆÈ!N–mßqѹyôhÆX¸?,󹹓Ä c8ä4ÊrÇpÈiPTŒáÓ`&›‰ŽƒòÊ·?(´·<.°œûXe÷’]§¼qÎÌÜÃð@ˆÍa@‚f‚¹9=^È÷Ðn«-jë@£}DL*AeG€’üâS“° Æ0ª8ư¿“  ¨åBð„x(|Pd?7ê.8. ɹ1nqè@Vr<½ãùêýs±?äF³ng4!ªõwÂMÏ CÅ£À­Ù@7¼C[–G8Ä4󀄦hÈƸ°5ö5ëÑd»²ìh?HB´eœc8`ðÃË!¢lŒ|Ôc®ƒ‚àéL0PT;ûy°’àEvCXT×¹`0Ub<y ßð °Zó÷í/4ŒÞrÍ]ò¼Ö<Ž ™ƒL‰7Ì׎m·Ê·„–óÁQÅ»ÝZnTc— V<ÜE»‰mÐMÛ“6à¬[¾®LèynLð–=6ÁØ|ÂÎ2"° šêAŒâ7t½ö4n2Xöž°T¬5NœùóØl”*þ|ü¼Ÿ5ñÑoŒ »8Œ§«b®–ÈÛQ‰ƒ0°ì†–DZs€ŠOcÛ¹U÷,™e­ªç?HwÅ ö¤=ÄÁ•û7[QÚÝœ%)íp€£/ÈÆÐfà7±váé ‡¶8tT·=ÇH¢O¾€—xº‚±¶žp3øÃ¶y¿ Ǿž !sØj¸€‚`Ÿ[–Õ·ëtB'ù¯Z9’$|¤¶{Š;çop…ÀŒ¾Êå Yxt\äQÙ]´Ù®²ž¾òéC¹'[5À0€å;íoÙÕýiÖ„ó9 šŸ¶º­„Ctùv€l £í·]Qy-Ôy|¶mÚaƒ£ª(MêÕè÷ Þ:;;!Q“ a/ÿiZ’;QS%׈”˜¾ã>â·ñ¦É³ÚY®Á´~*kñ!wâ+åp^¬œ\„ßçz76¤•Âø]Ø’%`µ±ûÐÝ’Êê#¡œµB*'áÎFKóàGv€¡æÛ3—ã³l…– Ÿ6 ²Á•>uAvÂD’úy¶JТÆ,€Ÿíæ~*TN–[§ÚŠ Ìnàß©³ÓöºöµsVY6E³^½ü[´.»5y[pÔ³$èxy]ˆ`øÆÄà¯þç9Ù°‡Ÿª·¬8¤‰¹²qðBÈ´®6\®¢ÆÞMhÔ‘ÈoŒh« \pÝœ?ˆ9Ö/[»IŽÉQhøw7"Öx rÕù vâ7á¯xÇÉ‚@¦TJS…¥ÓÿO`®bÇs#¢%Ä^¾»ØcMÊB=u§Ÿµ\¢N˨H()¸4•M8€}Åæg2qgø‰k«A÷Ä5i¬Î`H&²Õ'í2ëË>6UÃoâ!ÑeØ¥ô½7–ºý–r»×£SÎNj°}i~–ò°­Ÿ~ÊWfg™Æ‰5l(¯Å¬VÆ‚+bKtq€³ZàEa»×á:â„øùÁÒ£.Ȧ^¸Eq]úqtXmƒ#ÊsV§O2ß /· q‡‹{‘iÆœÉܲ؛–WþÂE1¢Ù:šâOáŸN¸¢w,v9;!ÑHÙ¤[kéñôä …Ôl׉²B¥äX-ƒßQ³=Å¥çâÂgä»$6³=)ÞÆå’Cf³w¯[—™Z¶ö¦(£/#ŸžHtçÝ;ÒŽk6ëâE+·r˜ú.¶'#ÒŠô1w>rö£K÷muSß…F\ÒÔH7åâˆ1qlµ‰ -³8g »0¶òËçCM§Œ-:á–‹m£%˜M1d¨­Š™ €ªb/ß1“±]¾N¶ùw‘xØÅm=ü1—÷&ù½€¢‡#©M¸QÐ2¿Ž1bÙõÉ? 'w£­È2ÌX‡‡ßèâùïÓPÝS–‚ŶNCô»"IM¬m*Ù&úõÎÊ~–af¸ö£ZÅp‡gžd¦«X3µè3üðŸRs&~¦ºÉF3‡ØÎ“ÞDwiï¼6Æ”Ä'«ô}N \”²<<$ó„n[?Ô&G˜Žn¤`©!î[P€„˜µÂÒ«-®:b}8Ài°L ¶8ð¾Ü )â¶œ_·*†˜».XŸÌvÝmýI{à÷òØsY¿ñW¤ýÆžÞo"åZsPq¥Kš +Ι¿ü€V$ñÈÍ»3~  ý|Ä ¡Vlé8ࡌø æZ9×|xnº¿o=öÔ­á¬Åljçâöð¤ºà•58ÕMܽæäŸçP™92ì=D@rzOAKjõ§Tn×Ô- B–CÕÆ¢º¬§Ò†ÆŸ b¡î*Ö*sù°;ÓÍÈ¿s¹ØÝ’“a%ÙÖá “¬ý.†Š<iÜʞ܇‹oQN‚i€ù»tn×ì2sµÜzY¼pbÁâm1ƒ´EùfÇVK¾‡‡£Š)Ùž,§ õPj‰=z»&;Ýö;·¡Ð (;çeóšGíb&3„»öC×̘tÝÆQ{ ØÂ°Âyø·ð;G¸¸5–A(Öä«®–Ûh-±ÿ]uÂQe·^Â4h„Å#Æ\{êWµLéËü*ôÖŠê…Þeéθ-ÕŽ áK:‰˜ F‰P'ogÉ‹•ìaÇÄo€dØÃ%ß·P›ÝèÎú¥Ã)Ì]5)²©>øj$v?ùwü²— œÞ`Ç|Xë J®+oqàâRf͆RϳòÑ/Å-Ø“ÜHš€ØFN5%ЩN ܬÝ8:8 /ÞF]×2üÄ¥z+t‘K&ùÝA4!¯@Ö ƒ”õpw7Ú~Í˃J=V¿-†òσ·_n;~k&mÂËØ}¨Qž¤ZÔº~êoܹe ´S;¾9–Xsz`¿MåV‹-ÃßâzY¾`MNçV~”š–"¨Évž4&ž r×¹7¤lý‚Ú•žì q|æ|ºY ftpæ±™÷Ënê×lÛr® ¬~Ó $®únF4ùW&¬ÞæAz Ûå™WzpõÊØ|¥? ü-²ÇøŸôð¬ôaj¡¤ÅÀK”øœ#8€Ž9¼¥‰Xµè{-þY ¿ìg-|Ö[’‹?xÜm&AçuQ—ôCFßKÀacO=ÈMüÕ{\“è-F€sÌ~߸tkÝåf| zïz($Ùý<¨^- ï›úÒ?ÕX58%­µU×w¶.#``:„r0 i”èVúÕ'Ëj³‹,éU©ö5„='¾*‰*N|…]§ R®u“Ph ’Ý žL­«œCD¯øê}ú*vû±Í$^9\t í"„óÐÉÉý]#¦>åiIÁÚWZ¨vÛéxCzlnº #2ì>/â5ÕpY>k?:¦¡×t»•Äê­NPR`×±o!GENX,[©j ¤U6Õ»¦DS“ëzîÔ/bÍný&^ÃêÇv¬[w<…3­ f„„&}=ì4=[ ê™yƒ%`NÓVú]•FG³ý±EE&X ½~ñpŲjß2k*’í;ƒKc{nAúÁHHT ‚ 6¶d¿-¿&eûìʦw3s®ý9is¹˜"®Ÿ]zËT"•pãK4dÛWj#-¹b* Ååƒ,Œ‹fÓ™i1z‰)ý[Û”Ûú¬ÙÀy}HoÙ¹¾nÅxåBãWJ8*³•É"S@m",N h2Y;_–b‡¥í€þ¶ˆÂN¾RõÓš™³Åo¸Â6íéZ=N;4ùStÅæÖE¿¸xQ „þËÿmñƒ¸,îâVwkvw„Í.Hzƒ· ›8°Ëõ‘UE“e/Šõh:_p>W‘g è’…øW£Kvžz;aòŒ(û±žVl¤&ÍÏuíI”¶<ï¯òõÄ|¿ mŠv†$Yĵí«Åòå`­8®þjB³FZwQÔDNû{iüF½×º‹5:”—~"³r/7{PœÃ z´Û¶t[ÍÖ–Å|1î\ºI… UÂ}Ú NâC”þÊP¦¥š×°Mí.{}Q…5½ëÔØS®«È\Ky9CÂŽÎÔ (ƉJcßìI\5› ãÔèäzÑØªþ¸&mØåýò2 eÝ-ɧrß7f|?†ÔÓ'ôÅäsr µÖ›ƒÙ>—lhÃv¹HV£³%»@‹«œIçý–(¶£{´^ã®%ÀèíÒFÛâÆ €ÔÄ’œK8’Y{ˆÒgx´ðrÉ®d]ÀÙë8ýÄp€ Â'•´KÃ+ÿ (”¶±\£Œ*µˆúÐ1ˆmY»Vë/X!PŸ §XÃrò€Õ@ÈÒL›HöJ?LòŠ*™fÞt“üR’ìª'’¿ ·öŠÓìa5ÂïáU‹Õ~YqÔ‚lå{Gšò3D«ÍÔË•±o·ÖT…Pêxo ¯Óç¶a)ŧQ¥ÚvAT„Þ·ȶ±¶ipI†ƒêIÊ=$øQìÆîF[ZçÖÍÔQ "ÞÅÔW¼Ǻ™Ð&„ÁuÞ›7šž×¥O&Í)adPÚRÂp¥xRª“›)CLòd{Õˆ|²>Riv¡±}ë£Îæ*¿i0¡šG±m9Z6$á7Ò«?ÇCS„^Gd?4ðWá)ùQo»Y|gžK¼àæ°c),ð&çC;€c‹)=1’³VElu{u&T`bårW»ï%ÞØ¿kñ#-]zæ4ÚͱÏzÿ‚µ+ëm%ùük÷ot.sŸAÑWª& †t‡gß¹>ãªÙOlÆHDw©¶X G>ƒ¼¢~º¼1i¿£‹|}F%½ŸÃÀ¸: ÁæXêZ->#7ÀX?j`š)v/}@Ö {6:”^k‰‚)ÓÑ©Ôúçƒ*{Då4ÌP‹¦”–Á±v¤|c›Î°&Fj»/vºzÇê óõt^g!ªwL‚×)6LÅfû°£\ôChŸ÷ãšu   zæ ¥¼“±ç¨bû•\¿)3É,¦,ëcw*Œ‡÷B 3§jº,¡ æf­êNOlóV&ûÃ~¸Óa~¢šyo„O×åK[õ­ÑzŽ4VØ•`ëƒEXnlµY¿óÇí zôËÀT;çf/Ì”`Î{ûä!‹Å±]C “ §Ÿ»ÒÁ-åýL„õê–cg2¬o…ÖéÞ&ŒUÑ‚=§õ ¥EIÖk¼4KÀEÕÏ[ æ`öº‡¶‚?¾¸@²‡2Ô­éNo­oÿŒPoNŒÓðjŸÁB?]lÉxÿT-ãw»²¼½É©ÝÂ_ý\¤^€óc”°Ç¾ðìlþH—´ ïƒSºCJá§L¿WÂøÜ³ ª#É_ˆ˜éZ$ Yu9hVð{MÃÅg“öÐéõî_(“Þ½l`Ö¬cAf>·G‹&c.Q§\ÀlE»î5äXí‡ÖÚy=‘Q[š‡× ÄnI3Éö$áƒ0éè2`ÖKg\¨ÙÛ^íÔZ®;þ`¨q¯r¨_óì›ÜýÄ´5±YÑ9—L°m¾@®"šW‡<ÃD!8ˆ[i$;Å–ø­Ø0‡‡& Ä ±?o´ÏÛò­êtÄBiS7¡>è±çö¢HAÝéPàÂ<Ñ?ŽHÜ®ÄYgHvã¼7-öø1/h%[¾ä*!¨¾õ“sûÁJ‘ÆôzÖ ÒÏNØ\#è—„^HÔk¯V@¥7à(‰.«Z¼Q à©Éy–û:γTêa°¦ï©ñÅú·YÒñ×øó- æjÈ­†wZߘ*@©ÙµsÈæÖ²AÀ¢þÃ_Ñ/ïa9²/r4—=´É†|Š·À–Îxö’ÞEKûü—/¶]‹DéHkÉþ9N›¯Tº)m+†·ØPAD°‚üg;ÁÏ­)¥ÅNÓ{t\Oço„6µ;™©Õ¶û‰©ú´º´Ãx¡€bó êàL¬…î/V×<ÙçóŨÕÔ›•ž›²ÚŒ8G\gU›þme^ù®Ï<0€bõßŒŽ™îr3¥³§ÍÏ]:fz¨Zˆ¬¨o–|‚<Å~et°#7Á½“r{¸”€½«jÚ‰xÈÏû0ƨÞSS:o*ûiÅvž6£Åj"·’nÊô‰>&0†ÅWçbÏå…Á_#ÔçbÇÞ{sÊ” ö‰C•°ÞHø1YóuÝÝ ky> å;ìƒU"5?#;õ¸"ÜÓÚzíœ ˜9‡+3Cþ·Ú8µ^GdÿàOüOÉ#¦Ì@S].»!7[‰Õr–K$¸Aya¶kNªîÈOÁ-˜9¦#Zýy§Û%ÉQ!ÖZ×ÐÐÓSõ#bßyìge(rósؤ‰¤ãäLX<=.e¢ÝÎ;M°¾í¨óšˆažÓ ÁdaÿVƒmìòÏ7Áþú5+5æ>Á`VgÐWcææß•_š¶©É„f=…œ´»‡¯›˜Œ]Šhi¼që¦ ^|òÔOÿÏ'gèÂ'ÞÔ6ø«_n~Áe3’˦ãoWà„tˆ?± õJéõ¹("—jÑ_¤žs`P©¥Û£ Q>|]npVêܤAhÜcáŠOBjLßI¦AôßBSäñ€õ#‚ÿ2¨¸†Õpó Š>£­Ó¢ôjáx‚Ͷ{Ö2€èf)Jn™dR=µ"ƒîÙ°ÆïÈ38h)ã‹øñV¶Ðþ¿?}½ªAµ6|éì jÛòGíªgÜÂüÄâlšQm—³icëãÄ„ J­‰ Ü•Bí´u»G1¥6.ïs¶LÝè߆áržxÒr»œd2ŸV‚Dîàa&ÀN>?õX†k]SÐ0"ÃpYõcãŠF·íÕ(Åñ¬fØ¥f€ÖÜ*sRú½ÖÂà¦LI}ßO °M¬.ÑÊ×Xµf‰¬ )r€dâÝôb^eØ“Tâ/ e™uO—¨åÐóÛ¶¨ ‚<áýü“ðÖmOU›ah+¯Ú®~¬œ»Ž°ÑEŽeS5Ù;ZÙ¢%¥:[ü†(s&©AÒâQ+5;@6äjÎ’„ì+·y§‰ûƒ™'QÝmì“­Z³Dît‹ â§xV/`y%’pÊÒH€/óñ»sÛý<î¶åã’®®c½¨ ›ÑûÊz'µa¿òܦs^8e–>{ç¥Ì黄ðxnŽôòüi|tßt¿‘d«Å{éÇ…K~á¸ðD#îj`Æ;òJºDˆ>ü"¿Úu}# ´ wA»i³€,žº‡J6‹ÍT«šFäºèm«,Jì|”áWë°‹X)2û›´gNý5e‰Ñ¸åÅ è˜Â„NE0„ÁµŽê+}^GPЧ‡Eqšs pàó÷±Fönû9Ä ùS=K"YI³‹E&"ýñ?{qà¿°”ç_:@wRh`ºÁ"«GºwË fe¡·E/{4ײÚzþÇwHkVñySJnþ&ÛîïÉ¥“n¿KD_ß*aŠKëê4_u5jd8#¥;I±¿—zf|ôÒ8¾sKC¢Û¬bT>‹/ÝwÌñ’öUk’øVýN£÷ Ч*ŧwZÙ2lÅSæû\*y…”ž×Oä>Ié²Éãûóéê´UzK!+0!ÕÛ® è°-÷†Í87nü|¥~IuY äýHé–Œ#áÊ3‚‰%Å rJTc©ÎTß9é†ò=g4>©Ã…$ÖøÏ­ú‚ÜqÄj„íá 0‡¶ªžR¢s x2N¯ÝÊ‘U ¬HLž+ª˜ò$ì㘦8£¼Z±5Ôii(@JûÖ`L£–X™„øå½ô&çGZ­òð>rÀW²ðaW'ÂÕ-î%rë¸=±‡Wëg0J0Nð½²ö¨^Re¥¾§e}rÇ”ºw‚”óüÍN½~©m—…“¨ÖÚuæX÷;½p@ý{zPVøòøåðÔÇÏö,^¾dê½\–?HbŽ”OïZã!Œ aשæÏwE¨6â¿« ËMIåaÝ‚÷}è­zN”í;nN}Ê1Ç–ª¤r¦RذÌu(áеֈNõÉÕDöŽ”l?‘.åÛ+EXu{àÈd«ú˜ea{vV¤|Ú fÐRÈ0ú”Ê ilMÊj²”A\"ªhZ{úR>ÆŽ¦,Âe…¬;mj6)å°-€êaš ~îX¶Ì*öt¦<Flûš8Yœ‰Ÿ»¶¬¢_Ú©K76ï†YÇ{^¦avñÀžb¶¡þ’¹ˆMÆC6,¥Üžá&e™›dþƒOx{—ê,ß%½úÉr"uäò‚µµBVÛzdµ]|ZÝçÝ™%LC+ÙŒ!ôîl-`ŽÀK>¸#c·júˆošŽ9|Cå¥ÇÒÁÙæºC;¦Üí¤ËVðÇ5 +ò=ÂÄ4Ò0**Ĉꉷ² ?§²šÈ~æRñ•oéÛlþ¿?°ñT,†ªÉ<ôÆÁÜLåÊ0ƒK·gR¡N+^§ÙT*ßš$I寶ù)ÞâËŠ–YšÏ‘?\÷€lT÷Fvýtê“ zI+ࣕ¯úg£æ(‹ª1‘â#GÕ8”ƒâ2h‰üb©Ü°#LØžy upyB8 è\‰p¶ SK%×G–ì[Š.ÌY¯—qyÄ·ny0úWè£eë–>3I/ás}þAø’Ž/I¿±Rhý‡„1¶LþeŠ]v¿ ÅCñ>Z¡÷X®†]Â]N‚`»œ“F6£Tírid–¹¸)L±&ï ¢Vj9÷á–J`¨!0Wè•Æ­2»êúöŒ=Š’q+‚2’q·0¼ôÚÊ>j•rÔ$ñòu¬“¶©;¸ ºDvTŽB³l[i,¶ ñ-{'WæË»‘TéÕZ"¯Hª·k%cרã8dIõan¬DWÏ-7‹­V‘&Æ¢÷¾yÉB Ï~K ÈàõÔÛ%rH$Ï’È’6WHªÌÕÕðöÀ² ý½ Z¤Ò&«ÅMáÕÊ ÷²Ò•ÏÆâpÕ²Õ»jµØ®=¾Ånã"däIõöcøf+IñãVúj•töfSä–ŸÏ_Y‹éÖ[¥Wë’¼Fâ,86¡P*Uû@Õib[”›.$ÙôçÅOc¸ý5óÝ9§wvÍòª¼üή±¾Çž$`ºA‡ÎÆyî]‹”ÕK‹¥u·4ÚÜ7U NÖêPD ÉD^—¶˜V½Î ±Òµ©™~ËÛ±Rkôbûy¾ç¶Y„§Êi SÖD?Aùj‹ÝûHÕ–Ókd…z™x–sV»áAžr—Nº4¿‰ØJÝV»Ÿö†[“C$ÕH5¾Uq¼ c{è{R¥6«¤#¶®NzŠ5šÙäüؼ_Ì­ÿžj[..p~Å™Z•Rµ/Qß6—8&©úa¤º«[·­U¾Cöîû áÑÚ¨'µVàåü¾õØŠlÜâ›È·²?‘ðƒ×šgp­øtQ¥Ýh”!5Ž—«äºšGXNxå{teJ?äN¬FÛ4 ÇHjŽüŠMÕ÷ªp@첉ñ»pË<`½5jìR9òœgoñ˜Èÿ1w-ôë¸ñR|ºÄÉ~]@ð„´ô #+p’cêÄ®°gþ•¹u‚­Q@5﮵¦­]nŸ‡ž¢Lü#=sœ ÓbÞ ~Á“÷ÖJK¨9ÈcjÔHͺ–‘‰=rAW«";Ë_…Cr‹†%¢"‹Ò;‘é&5Wo•Ès3w-‰»O¾X¼ ¨ŸÕtè¾G«Üù`-ÍŸÊGç°Ýlj9¸ç\eDúžÔáhŽ+5º‡-’n¢›Ú\R·Ó½™¨­ºÌ+Ð*&-þÅ»€Fq8Å-¶Ví*K“(dn¯4gÅIÈ èZ3ÒŠ-®k† ræòýÚŒ»ì>ÂöÞôÙv™Jä¥ÙžÛ‰%µjç]¸SjÙ.ØÃçC¶]’Q‡ƒÔQrñ D1[¾H2”¡,üxjv÷ÐW´[‹“À6*t6H2÷Ú'“Å ¼†k­OQ"H@³+Å3Øcj§™³"´Åf뻥ñm!JÙ‚Lcôã1³Z÷¶l³…Õ÷ãvÛy€é<¨à‘̯÷2–Ëñ1²dÛ-`­kÞgeÝN:\¬ßZă›æv0Y²§ ½¦§â–´—oÈ‹ð›æa4͈±ö{ª¾ŸÅ¾ÛVsvþ°Õ'<íª5ôޤ‡ƒÚã˜Øô®Ï†ÍîÁÁ)†eiãx¬`,µ³†›·Ø‡,•à[t/IÅ'ß¡kÌzJ“±?ÿ\%‹ xçÉ)‹³=‘ˆ$R‘Ì?¦¹9Ám¤†]ÿhE0_óí­¤¤ïÎ~Ö 5Ýá©ÜÅë쌛 o¹3n–fG~sA«²Ÿ‘;ÐÓ•°%ò‡$9L:À±ÚŸu#ô<èÌìn`71ââFã$Ž·xþñt›ÛA·Ù{äE¢žÿž}wKµÝ[áÙÅÏ”XáÇ{"¹›ï‹•@*2ÊÎ P$w9³„%fªµÙÐ{7!¡• ×!Åf±‹7÷ÖÔ´R\b‘Ä'IÊ™ärõÕ~lŸŸ¬2b…Ï;Uj|µ_ÚÜ"[à ²ÈÈRSãëþ3ѓꟘÁ9ŒNl XʪB™PK¾›}³+ín_,¶Jà ayøþü <ŸŠhÊYPŒ@†ï|‚GØß¬`xÖ¦:¦¬ÄèÀÜîHO'Jä–8å×÷ÈÓ¡²Ý7±•äÜ7µ .cL:”$·u4ÞÞŽr)c˜óØåz |–gÖƒA©y‡U#o4Œ°µç üdÒùÑ9£Êøáºœ›éJ4sÊÐK•{YF’°ÇO‡n§Äìs £‡Ÿ{ÞŽúôm û4l¥±æ"Ò®-[¯ïlyOW®{¡èeàÿ±R¬DTÔ͇˜:½¼¾:¦ÌôØ%#õbwvN3VFû¼ÛB–“Ôo.™ÇÌóêŒVR5bÕcþÙUœ»Û©åzm~µÈðØ6‚¶¿íž}$õ Cüø'lÿŽý¸ÖU4Ó]êm/9®_Ði6]ºã-ì ” „ãéFR7 aU9nÄQÂg¶¼H›fÙ†—Z0RÿaËhï¡ô©´]~‹Ú8#Î@P…ôËÕÊþâŸÆÔ cŽ]ÚA²]Ý,ÙÚCÉz³¬bSÈ©1Žì±ó¦Jg,ÔŽ,SeŽØ¢£±í×ds…oÒ·TëÒ_˜Îæš©÷há ¹´äi·pLש÷ŽÌx´,@8¢}‡ÏÀÂw»o¥vÔÂuI«åÉÑ”™=ˆæ †Ý”Ü–jW ··mÀ²wû R é h^s‘„hA9YITÞìÜmŒãêÃÙ}Ø.gwóÛï©£Jû§n¶Ê\yFáRma¥¨I=õKýl»Fܺ\ù2 Ò¤M:ÂçC²%·‹BÄ¥» MÖN?²YF’†ôvå‰úEƒ™„~Ý]€ùC’¦`³Ó’Î}ä% íçe¨=ói –Ñ¢«³:ܽ:J—ΑVÒ˜)5UÊ ä" Ô‡«¢A¡yCʧ[¡†]NþQŸ‚f;ÏM]ç¸éÀ¨aÚ-ElÙ{€Ë¾™:“Ûz„ µk«,kiWpLG–árð^Ø_ ÌÞ |ia’+E°†ª€ d·ÖV—y…¿ø¡ ¤›è÷~Kt­\JëR¾”UêʵyGÒæ¹V†Ü{ÇÇâZÛ%%ÕÒ†ÆèO:NC:nŸEJNøÆ{\dgz’7$é¥<^y,õØI%œR›“ÂÊx¨=Gâ'ºµ…?úYýÔú}¤ù<é9ÒêvºŒÚÝgîQàB£¤6È·ðim''Šß‘~BS|qyM4µJ7ö™Å_7a8_="ÓIÒ€jÌhŽ^Ÿ¹ïÔ!%v&Uûz± Ø=b!"àaÈ+Œ¦\$xŸölÅÁñ†ˆ|¦Ã Luc'IY’ÔuVKjÛuVK𛨢±ïÚár‚~hD ?út1‘,}ªÁ—c›xo¯ÔnâP÷33Îãõ) A’^È ±š»üÿ|zÛf«zÕáàOÛð¯ïc[Yœ=wïGŠòPrG¨ŸÃ.õdà9™¯T]µ¿Ã¨üÕ7ËäOz1ì  8]ÏUkõ³œXZ|ÑñÙ•—Ý>èÈELR}GÍ·=ƒ]i2«Q³†~£…Ê`^®•Û“=¤?†¡Çk¤evŽd;Ú&S_Ú ÉžÛíÄq6Q¹o6мᩚه#ÂR- 2’5”Hº‚„Ý=`¶CŠ[þ#m 6…ÞƒÉÏá a“Ï|X¹›áåÀ\Ñ“ Uoª G±íý&îCÊ?–V?-îšÈ=!Il(´ÓÙ¤'IãÔ-‚¦%}Ÿ|"/ÖIë°ÏOÈÓöý!™±¸·ê+Çí°¶´Ì¨ÎFÕv9‘  Ò¨.Í5’íºUýIÕN¿UýIm7ì„®·Ã5Ñ‚£ù’h&ê±`àƒôcІ£Aû ß&¹Iæ6zبœ”¾”‘1´ õWå°=gûÖ€d$i¬ÀŒLôr)«øIú“ÊL '‰ap“ÜØØ`rÄg£À“ùCìÈ;ANMWÀÒ˜+SŒí7À9ØÑr‡Ææ ´â¹ ,=zÞ°€€}Àqa'Kpóü&}Üyt»ô±lYDÒ.dÕð9¶Iƒ¶üÐu†^˜îBåŽþ€õã-ÃÃ҉ ­'µ¼ùìwKl4K¹m8<>ÕOÌc^ÎxüfÛñÜ—c=VÅÔò{»Ô$$žÏã à=ÆðxÊAèÁØÊm¨]'øý¨1¨uÕ#£ò%Çz/œ0ÀÀã?1¬úlü$m<•¢?§k¨°Å£o•Qɇ­ Lú’üùTüìòÊ¢Û²`·Ùü:ÒÔfš…ŠÌ_Z£—Ìݨ‹£8%—wEÌÉ©²Ð« Vì Q)ä9­)SµÒ6U;°Q9´KâÁ‰‹sÔ_£LàÜ1ÿ¸|œ©ÜöAqYbaJ²Ú"QGkÔl÷ YSžÕƒ|·^Ù)?T'l­odÖ Æ†,E¡ôw2•¨™üŒä ^‚ï˜t, ?wå5Ø…Ÿ¶ÞqBñrªë2#ywÒÛT:ù4¸%}/èñΕcDsŸ&ÂÁxžîè’…"Ð45Y,5ž;m›ÝÓWÞŒMר6ô”ÏÞ“?< w£1(×ÃÅ!|¶¶ç[ãè»:î vì ËÞø¬«qx!kYRrã]6Æó0Ôeá„·”½Ê dRÝ­Ùo­_ƒÜT+2¤G,dگ׫àG&è³ ½Q]‰cmö5Í('Yñݬ3øCôÓ=?:Êåõ‘>yU«ŸØZ¢`áf9SJ‹½PæªI?]¦ Ðè·=+cG¶PÂ9ʧS/Æ”­‡Äêôä\ o‹…LÆü¹í ´¢f9Ñ4¶ìD®Ðß…»ª‚3óùw†£LÞ‰–ÑàˆÛ>º6R.$Ë™Îm;>.Mö“î‚AAsÏ6ø>†¡$ˆ»¾‹ÖŠ+Ç율ž@OBp-üËË»Ž,^ËšUŽ/î̉*/-G-“ò$§ ,I–PÍé»)€L:›œ¾.#‹zyüZýääÊrò¤[Ök)(+¢ÛFÀˆ(Ø×(º•j@ Y÷˜¹L*’œcu,É©ºMñ¬÷QYŠšS, È7! šAe‚ýy?«òχc:§| X’@b×u%æ.»ü©‚`‹Hjº”¸IšíÏÇ\5í$« (œ¥Dtç[¡ùÖ²¨5.—u|F`ÛêÞ‘ZÜ$^%ÊRÅ…ïWº» c€A²?ž×R4HÝæaEìJX{:ñc]m[ÖXÛOlÖ2oÔ„ZUà ½Î©ÚYT¼€FµÍÖç™­XÛ‘~@'y¾óœ¨µR ner–äÔ³ÚáVÎTRž å-EÖ“dÓû¨óäIЧ””ç÷6Ín3ÖPÛ%×A”lÎØuF¶ÊÓÊ¿£%§ÅnX&žB—ÉØŽò·»gèw5f26ûgùa´ÎÚ"Íð&]ɨ̾ä¿çèþåd+s;ùv%Ò aÒxà Ÿ–> Jgy0Ì´I+ü˜ÉZ’Ó ?²+§[f ³ŒSd¯ªŽ]Û—÷”åsóeÝڣؒ-u^¤ðÍô®dQ|ÊÑ5·ljvþó ‰ƒ4 ´ù¼pT<óv€Š±ùï1l»—µg:\™ÆÒyJÏïuXO%K \ÓIì”N„ÙQÓ–Ø™§¼—ÀÞü…géÜEùŒäaN_fDªœÝéËÅN™d#iòšÂ‡¹¥ ô ñkÎAc—Û`-¶k–"ÆR¿È8%‰}LžšnV"“ çø¨K ðvzÍŒ/;ñ|nÖ–·g)ÝjÂʼcv9Så㜠òèÃó籚p™õfÙöÝôÙ¢@9~¡0¤Ü#X•uŒo›Šd½ŽˆalûÖž®WKæÛy-±p´(û wðB°)ܺdó¶jBªЖnýBqÄïônô–Ef’ä|³åšåâŸJô£û6…!/[ŸðÂË^l+ßw(8y›ÊÑ=$Èb¦>•D™œ$s{¢5OEX9ðŸ˜Ò=/ÜéñÃEkñ± Åå3‰’?× qD nl³¦ç˜/å( ×_÷\Ý Ñ5%›}§Z­Ý™]´±©9œUÿeQm1u°Q5¹F¢ü✯Rm-ÇB‡®\+V™tÈ›Œ$[€a“‘Ð×ÏQ’ÀI. ½”­å‘çÒnNα¯ŒQÚ‡'¡^).Á=ÿ°‡£ßËæÍlŃfÎ !©ÉÇ£@¢¹ì×ÛçŠd/ÉEœÉÐA~ ÿa=ÙÉyï„+s=®ál IK‘3غîΟ’6;zÅ?(K[˜ÌlŒíZæBmQµ;‚(”ˆx—\N’²¢l({7»QÖ‡–ygÖQÞ‡£‹Wtƒ›‰Ä­}úz2 £€¢Qéô£ÅaÀð‰€hƒ¾k.ü¡zÜg³[û¯J›Œf=»µuIÙÙ”°ƒØ¿hp,Ç#‡A™ÙkÙZÊ”'›dKcxõÀˆb[† ÛžHCŽ}}–7]/îQ]‡zÒf ¤ äI^ä3ý‹Akí›ß2«ƒí²i*•_õAF:9§k„Í&µ“œQC›\—ƒ¶&Z>êwgÇXï°äéX/‹–oñŽ@Íá g±'§ÃæNG"Ũàù ®VÊÁš_Áê9Fðª»'U8ƒsÁ÷>aOxl—›nËîðd#Å‘¨öh­¬s}€[È,áº| ”œD¶®óƧXQûóNàŽðdôsÕÉ-Ç’Ä s{C'ð!d½¥«kŠmÁÅo^è¿Õ©H¾H\ÉhBÔ®•ˆ­]+pÝuÚjÅZ³ŽÜwmê|uSn»%5õdµ Vç«F$ë…˜/Ïoɬ Îô B'T°pÅ8!æv¨ kRj¿jZMØÚåéã<ÀÒ̤ç<ÈY,Ì\Y¼Öýà4»q¨p…_䩞kËv,³ˆ¸î:ÆY`ð"ÜD&¿ûy`'À‹k°œš3v<ÀÖyi•>XwŽ™çU¶Ñ ¨ÎýN4VƳ&+ܼÃtý^çžô7Òªœ0)Y/Œ¸XV±Æ £Ò,Ø€+#Iýnç6†"4ô¥0Ú¢yäe¿%9¬kSŸIA’‚„½jZÏrÓô„Q«fF%ÿÈÜ7r&ÕÅQ«Iöí€mòh_”ã°]¶5éI¸ø­^‰½ìâI¤ëù‰£ð‘ò·s–og£\›G81NˆÜn‡`ù"û^¦à`Çæ_•[g|6z;-;Ô#-R8/„ýÜ• ‚¬ þFXXnÁNÀ”zÌlÊÖwKƒFL¿Oe´b[ÿêÃʤÄ:½¨á>B[Xýì,õ7âw)F¨úá»ùdä„!wçÔ| ¸r«¶ÏIÊ."Å ëÝÎ$iÌÆBuMIŽâDì¨Ó°•½%¾ÛEнûhIk¶Mûùx…[º¶BLÈÛ”ý÷ŒÚ 8.>²zŠçhuš[ÑšÿnŒF7ÓÎÀ®©w:A×Å.Ká*’«µÎ×ê |Ÿ=÷ó6&>‘Õ2m°@²¼¡ÅáþÅŽ2+ÇŸ`-†»£ÇàJyæØêeų=ÜÙêÜ™\K¹ß‚Œ. Æšr»ú³¼íAmês»sˆ&U:•M6…ìCî $­r>oÔ§É/Û“´M/ÔµZļ‘h‹øÈRnN5×êïÁbܤ©ì˜ÛSÒ…ßôï-“ƒ«'[nô8ÚðoN×­o K}䣿¼ÅQ¿ô#h´÷:ËçñØ~}}žm<õ}ìnŽ­^\8óëѬ,„h“;ï•/0{’ø'u'Á@’¥-mö‘S¢VÑPbW.e·ûy¤#eàÇòlÒxqI¡y&ó[ÉC“ëb™“’l›÷£)ÿtÂLò×”ÍRù…›ì®<ôå½ʪ¼˜7O–d÷.—% DVò݆%ÈS¼~C¸K­H²@Øçú#gɶ?,eO {ɇØf+[Þ»Yædd50<±mÞßÙ䞥Ø6í‡á)®]v&óHóÚA딓\ë@üw•k±d¤Ð¥*Æ/ÇþýÂöJ]l¬ÊFrsßõßÊúlõÄn‡Oƒ8%]'̸ë’|dÛ-$yû”™vJ1mÂSY(HGÐAÄ_”ïSÇ«UëÐÉ­’˜1{¦Û,Í£›¤Ù>?{Ñ”ægoå®ZÄØu«2)næ.{êV‚ $XÇö· æƒh;–wúº_â V2)G‚Å$&>–óÆž_4ÍŸ:BAÔnz”2Àû¸^¾ Æüþf›„,^¹ Slm? £Ýâ™°IŽÀÒøñˆ«äd#‡Ñ¶É*M²cÙ7R:€dlßš¨mPÀœ SOFû;(äó0L¯yËQÔî¿…:œå/ø-jŒzo…ÃôyÒ6ïk ¨\{©qí:yR¼ùIÒ‘,c‹;SAÃï°ã¼ˆz£2h¾Ë¶K•9ãìé!ŠÔ³£VÈÈUo¥!¹Q>7Ôz0ÖMÓÅ0C„¸«6n—5Äv¶ŸcãÌÑÌèi ›ŒŽ>ÙiHLèn$’7I¿#–ÑÖÇ‚eÆ~n­¯`Ë?œW#$ï!vЇžöÃÚ&ŠîmûiH”Ü7©–}¿Á]·Ô2“W/÷ 1Á¥Üµæ¯ÙN¼ÇPÒ§äÜÙ+›"ê`;‹N×. YÃ*׆_ˆnáÆå¯æ‘MŸôdZ:¬Ë2.…ZÖ°—¥"zq&·hz¯æ+° ç¶yÈäÙ®÷ÎRrw· ­é4˜yö}8#}ˆÒ’O݇(IN’{½6ætÂiÑ 4ýû!Rñœ€$ Ô"ÃñóÁšF®±³Û¸©¶þdºóˆ_d`×ʇTH„!4q­2 ½íÑ¥õÛ½ÉCv’¼á—7 Ó·Ž³÷áhD"I.#ПX¹šÚu¶1]‘á_Ôi`™Ë‘ù=KÅ8Ù¹çQ΄ ÉÜ®˜T—·ŠÆ dº£ÓË—>Õ_ ¬/лfªáî*õ­°¦÷ÏJhàfù”lm«×7ï–äHŸ;u\÷:®ÛÇÝ“në$ó3ûÜ4Øà öIã±TAT‚ž7^.7`¡{Ó§8,S_Ñ«õÁ½Ó íêX™#Ú EùFaÀõ©pÎ]íPçrî ;—³›Œ:AjÏÌ–1aGöå& >º…QÊ>¶ÙÃÛÝ ¥Jç~K’µƒ‚áàšèã ·Š3ƒT„¥"^geÒqC toò¦lÜЭ ³X’N¨§|qÎ5ÿ¶MÊäŘۛ……§‚¬t¿t£#IŸÕ£#• X=:²ÓŽÛÌ#°k·`}¸{ªOЬ#×J‘Ç  Ø­R¿~ *K F¦'ÄRxä]lfª5lcÔ!åÈ<²ýëŒò 7ó æ‘i;i¡Ù®ÚŽÞ‚¯Ýw`xn±’Rähvz™!®ÃôšìÉ9à[½UîâW"šì²Òl'òF]Ù[·à¬{©,9J­z{ÉÑ-òÔÐiyã%jlÉKJ¢/B da—@ì¿MÌ[1ëÎ%ê½Ü ªm/¿[«_k½ê„¯V»Hhøñ@ËZ›dŠgï'C[÷4ð:'ÐPÑð!›mo¸˜¹1|DECî$Yo´ RÿA«—Á7‚¨ua²"vB§¯èÛ%f¥2QI—À'«øñgÐ@£ºCh±(}(Z¥o£ò2OrŠA©ãõJ˜†Š× 'Þ§8£\#NlŸˆñMÝnÿ`†I÷”±Ihg¯©™™3ÐH]f,áÞì0E:/ï ÐøÚÙ y‚l8czAþãÒ#ÓÝU*PqŽ /J%_ì=—À‹Il–Ší™´5y˜ÁÆà^zÈH?‹€â‹»Öò\•¾‚¿›W;„ ¦OG‰8ÄâôÌ£Óîë7û!X‡PWžx½ä+¯è"Ð\üñ9¾§=4kL “q‰ýÀ|¼`ðT$à›o­¶ ÈavU²Ç×ìv@Àæ¡È§‰Õ7Â:x›ŽäÁ’ï×7ÅØúmhŠ,:yh¾ù-NêÀ˜—؇·:/6}{Ú6j³ÜBAeryCÍCíÂêß'ÍKVŽó¸œ¾ã¶œ³¤×•­ô—öØJšç[MƹÿS)jå}ÃWT jÁ1ú¥ÅÉ‘È]#ûkPnéO‘%íIÃÓë Í­¸®°5!_ lz¬CÁþKjH< v¹P «Ê¡±i,ÜuI 38•°k- ªlþÇÒPkDœ#‘\bÛ1t?Þñçu_ÎJÛò%ÿb‰i5°€tP€»û‚\ʯө<“ŒcâÜ·Ï^j¹o\¯Eá*ä9„§¯pùNYCuÃ)œZRŒk#RHø›WR´`Jµ/ò šÀÉŽÔµVˆÑ£_ìçž.ó6åŠ_6j ÝÀÙ$ ûR¹³ÙÇElEOîóŠ—ƒ+`AI—Ëu=ÖÊ()ħ»KÕDtÙü#TÚä)ºmÉrúéü[(Yæö¼·‹5÷à#´ÆŠ¥˜œ,™ì(ºûzOcŒÄ?ø$rÄìl\S4A üôî¾w6apˆ‘ù—ƒ}¦0Ê×ýüm¼µ#F6eù1rYk¡Ï±RVŸì9ŽY’ÎØáØ~!×牻]YlûW·aµRáM¦TØ â5˜Q$~ÄQ~«íÚ3Xm§ŸÂí~q¨›–vH ŸÛÃýñQF$_l¶(ÇwóUåsÚ-ÛÙ·ÍŽ:€®ûë9ë^×oü§€K$ø£(lûzÇÁ}–¿!CXS¥jœ@ä™[ŸñæÊY$˜·oÏÕ¥Êä*AKÖ`>ñ…[¿B©‰ý®–"¾³ »¤÷~.ô  •]HA²“ׇþgÇ=§ ùdÀ $Ú“£h,‰wLi?2ƒ}.8Y’=äa_1ï'’+)\]ôª·”­ßLVºÄÛç|d`yðu¬¥ÅvM^ò&•À%UóÈc­ãñðÉRy|%ØÞàd!JI·jÓ£Äò<‹í̓\cʪd©7‹íÍ¿./]”¹ç”K2Ò1BnËp¦ó îÞ`ª6eQ<ß ü;ß=ý«¯M§šÎdÍ]Y 2@÷æ9/X‰Ã7mÿ•ä’*´%Ø®•–¨1SU7¸ÕŽóƒ[ø‚Ûuã Oo7%[’M‡vS²å³)A@þ%‹Ö9]†ÃšSf):Y¼¿³.Û“öž{¸ÖÛyl+<))¶e̽è%ËÌ<,³ñìËlD‰Ÿ!D2ï~ܽ¿7UÞ.:·Ç½yîõyPQF…svÎÆ»éäâXI,°U’ó‡J²OÜ‹û4bç’V &†ëÂþ2_pA âøÀ )ß¼cAô'sÍ·ï~w²žc„R`kà‡‘U¯-ÉãÅÎv…D%肱žUmë„pê õBØz¸…²CÕ}‡ÎÉû˜-)d)¨W<Z†ÖìW‘ÕÕìE4^£2Ñ)J‘62Élbf‚q”î@Çsã)¨>0J¹X>ÝØƒå/‰º(»î6%ñ¿¸AΫäMüÏ)¢vÞÝòД·ýhŠ™È©Y¹ãb ¼%ØŽ[PI‰•”[xd-î_+2§¬ÈÄÞì çh‚÷²µBæSçãÄ }Q´nCv ¤îWìñÆI_Çb°ù[Nï fÛžC麺λ”Ô‡…žF¶nBdz‚›Ô”Ÿ%Û'H©HTª¿!`kæK.qaÏ-‰XbÿC‚l «dØïeÚ£~°ùÀ #WHXRrqÜ$%ßÖ6Ä[cÏ uéœHêä –-ÖMûïuC¬ÎužäVi¦ž2Ž“ÇoÒ–1§´-–Ûmû*_Á«:°o¼ >KÊ~ÃY5HÁöÃðFþþ–ÄÏÚyeÍ YLuºkÀ¸q¶¹K%ViÖ>È*`&iùäÔìÂÇ0þˆŒó ²uí@V.±Ê¤ª¤äóJ4›çgðÎk¦Ž[¡¹eûgq"˜!÷’ñ!u±/g,¤<)›­Ä–,=ò¼GëñãQ[Ó™"çé[ÕÑ‹±'‰]lÂ…j÷äsP¤»å²F¦çéÓŒós§£—pÝs%ÞÁùÌT@9¸À±SÌŸz£REÂPÿ°ÊÓÓ¢ WTÃB¤aʶô9‰ úÃ*Ïrúh?³oeÉc<ƒá"Sy<ÕB¦¼IKšñÃù²m#„/y¸~‡DúÄ@K­JYVª_øHÄ™lƒ©0=”ÛÙv£õg½r‘ÐdÄRÔ৺%±GÁ4>)‚>>Rªµ!íòJt}`sFpUʧþª¶kìgÅ 4)…ñÕâ€&…¨³R’_ ô K¤ŠþÒ)3\\Yü%+RVn܆Þ×3qIOðmL{nI$’— …­KK¹¹8üÍ=.õÒ á/Ÿ«9÷òCZJ–G?•lçÚwrçèÀŸÓ®µ›fqû<8¦bŠ1—¸ÊÓb†ùZ婘­¨Kø†àüÞ*ø9ÇP/rÍâªv!qæK¹zn™/Åup+ÅÁë9’¸”²±”6CøÃeIÅ÷¯9Ù„¸¾‰ÂôœïUQJµë,ã´#G‘>½‚éï¨söKý×Z±rà4š–“)í5{J³íÖƒõ#Œ€Ì dU©ƒ]),ðð …B)^¶ &_H).£P C4¥ùámã/t¥š3ª‘ £Qù¶·fO6?–à]aï¸jÌRrä%@¸<¸éD„æôÕýtwBoûs€ZÒ7p,ÅÖÑÛÐ+£Tö0$÷Ïì wY[è¤x }þÂê ‘‚W¬÷­,o Ðq.Ý/ɸ J)Ýõ“×ó!ãBéÅ÷ZJæHDüpRcÝ­A8éõ=º~À(°¹tô#pkߊګè~+_, Vü¥‘!Æò®¥ŒË@Z—ìCŒà4Áö¥j/;Ëz”R#³%Û¬Žiéù‹ð%wœ²˜DΤ,ÃŽsÑ“Bõ[WÎZ­]íS8„ßóŽ¥”©ß^;(`£F}e-Ù‡³,©X٘ű²–úÙEÏrkìY_<ÉJnfj»–ºà §Iî»XÚt™—ð[}›G.Û¾ë”gQðU„vœ¤ž?äë/õ̆HÁ;a,³m“¿èà®=2´(kvú4&Ç$ãäªí‘”V×[V›eÕ ¤\æPõ¡ÊJ}Ñìp¤2u3XÔ÷r›ÌíÒéÕzo±’¿a¶„Hµp dªäÛöæJ-ÏàEyC$㣩[ë·ïk:k²ÚKV'fPR3‰•ÃzH…±6m”Smß“eA½»§ì@ PÊÕªÎ>Š,&„ò£ áFäüÎ1ºhµíéÀ¢z.'1¶È%޵ûI ®Cò&>¸BnȦÒ#ª®§MãH Ù°ü¤ÔQP oÕwËAá s-)KïvòþNÅeýÇ ¹%ü³"NöD×Ôzi!%ñ•ÚŠŽ óÐ…Lr@Z á61Yÿ(`94 ¥Ú—ôFjµçï~d¨]««§-UìØK-W*}ý‡_#AõÑËÂŒèŽX˜“LÆúÀNµ½tœEdklQ*• %¶„ŸriŸ‰uZ¹RWnu) ³{†¿2Õ•iª¼Œ!ÿÈôxêð<ŠÙ£:lë§60òޣו TK×Õì~jÿDªFwÛ5œúo»Þû¨ÿÝpÐ>˜SÊNyÚÇ£¾l»÷ºø·2&õJCù³,þc±K-˲}vû‡ôµFþmVõ]ŒÂ)ÂØJãJr°fæþN_¥%ÛçGcôšþÑL³Úºë²¤ÔÃ_aôíïìJƒñ>½•ÓŸ /8 (§×È6·i?ÞàŸÎ‰«+ãÞr 2l´zî¹»]ÈWñŒ&¥ÑÁy;b³M[w©¦Ž®l/#üˆíi-a¹‘Vü;W˜\@’NÃ(»9\¹Ã›k‘r˜ÊÒh64‡©,ìaTÚöælÚÕoW4¢J°k»PŠeþ›Îßk²(ÚÎsôÌÖƒî5hµºeŸ ž…WX,‡×ÄN«æxµÐȨ–[èbí¥Õ¥?HZQÚRx›¿’ÍoÖ''.­´ÐO ¹…O¥—·^Âwj_qÒ—Ü(¥ù e«véÓ.ÅúQ¶hHsVˆCZ[P$æ›7KÉk³cF8TÒ­æµjËÒÄ ã&ÞáàЄy"vyg‡4›êÁGÂÁ¦³ Z6¹dèB¨ç_78†É»`~åËø1¦åØHò‘c[\“ʤ´®D¨åïßLá0ç¶iÐ µÿ¼¤#´ ±ñÍèdQˆ¥ÅqÚè­7Ëέ8—ùÇMæh´›ú¦dk%›®O£Å´šuî ë¨Ò ŽÓøkåÔÛñèÀ𫸠ùDÐv?/ß8òN¢º)ÔWÐ ñ‚Λ”v‹Vù›ð δÃnbÓR¹ë„{’5‹¼ñ…ì&ß ªÐ¤œ§W…BKv¦[HÞåá>hr¤¡Z+ó·µ3/xB€•c—dôìøu×S/T~ŒZÔ&¬Ü~˜Qý¹O  ÙÐYÛ 6™'Žj¹6ÅõObß^3þ|þÕ‘ë§±§ÚºñÌ&…Ì%skâŸEž^nÓ©"Ý›Z¥Éú"O¼ú'ßÈÜ.1)y<ˆ=ö’.²‘•|E‚Ö½*ÔËrè£+¼¨VbpÕ )õÌùùÙɰtŸ¦ØÍ94PÀÓ:ó\|žŸD²åRKg¼P¢,« \ÐÿÔJ3³«ÏDiãØÈÝ{ß³:éAªtÂpx½MßjUí°XA0)M²ín"´xÝ%!@GnÕþH»$t>ä0-WãŠ;ó;‘þ§D™Òð‹ ½wÛ³Gí8`Æ8%’r€¸Bi"×™[.—DÐIúZì§¥Bñ,²›Ýs°äŠDLº¯Æ±"òè(ÍrÙiòšx}!]ç)´Á;Ô‰3a\ö$BmŠÙ.ð!N‘§\r>Á#øçSº¶°@aÒ“_{ù ';Ï4ÕŠ?iüœÔ/nׯµ½¤Š“Ýd¸È)ŽÛ€÷GÏØi~"«c÷+ . a èMNk õ¼@XÂA÷WpV¤,#í»¼wÖägîvÞ‘ÐÈØ½/íÃ0;(ãœ×‹jéú9Ùµß@“†ÝN•+€3-v?³¾ ó,g£™ðYîœ%ƒúç_›þ^¿ ¤2e¯ön?™ÕNe÷™em§¾-i…©á$Þ?pŠþÙ³¸(+ÜåÜÝA霜}Ç,9xô6{r5ÒÁ°3Ð Ù(Ÿ‡žç·êÍ©žn íÊô«æ²Fý",³€….D¥È܈ƒÎJÐÄIÐwEGõß¾ }zV“~!‰xÙ¼µFe¡ióÑ.P›Ü@ÏvWgôôl['&غô|ÇG7?=#el£>"ÖÙÇDRov­cì±êâiaíBçAÌ,!ÞôI}€à¤û^¸…ä%…ô&É0øËÕ:¥ûa7™Ÿ£SærþL_³×ü>ÎÐ ë†Éﻆ€èðáø¢ ¸MhêÜ«T$ŽÐ'ô*—j·×}•ñçaº”€swûÜ7¨¶ëñäИº½8Ý~KÀ¿Á ù  w@£;pÃÇc߉9²–Þbø†ÄÍÔ „øb¶SÂvY‘á. Aw†Òu·¡·w’ò˜ Yæþz×)ÉVJߣcëØv­EG½×mךȴÒicô­ïˆr£Rdšëñ.>ÃÈ83œ$%s»"Äݹ“…B›·á»" 9ÆmìÔm½»Ø ‰Þ;O~¶–P A6já—”2Q6ö£ðê' ½ãFÞ¬ykˆ¨ó„Y:f±–“˜$ÓI釈Y ¾síôd‰ZõƒEöë3›`Y;pî öqUúÑ~_¬æyêà 9NJ>èÇõÀp(«¾žvø­SÐÞÈÿ›N·¤G{0©$t+:;Jx¾È1¥Ýàõ¦twG/ºa?8”%û¼ý"ȶ–'¡¬ÌÒmƒ]Iè%·$]µÓ¯¤–8*ùOB¿;]P 'ù°5Mù±QÐdÞ´ÿC]8›$yÄ”#–ˈ‹vÖe Ãb9±§)Ò^JŒ¸ Ø<"èÆ4Œº>Å’)êú ‹è ÿ öå0y™ôàŸ²ÅÄb×ïûuØj7Ò˜¸ñS˜©7°¬92(u¼‘Á¦÷µl_W®²#z­¦¯ƒb:¿ý7šÍ’áÇï?Œôc%ë6ÙÉÕÐÃÛJE9Ž’¶݇耚!ú#,D>µƒÊ­ßQÓè9P°©¨.æôS…W‰éÜ%b»†];ùÛ&ÛOiÕhäS\1^¬5ÁÃ{F²]ûÙ9i†£«,ƒÁËÝ£ŒãŠ“ö9†Ü2ÁŸEؾK8¼$çXáJËJŒÍT™ÌØŒ˜ãAÇmåf9‡Ê޽ìñCŒð–á(ôCÙ8xå³Ñ¾ïM£t”Ÿ²ÆªX4Ød@öÈpöo–“EôvZ*à7‰ˆüQ<"0ëíªÁðæŽ¯áåÀl?nI¢f@—e35Ä‘„3 øöç,à8鮉igKûb'²pD~!ûÀ\¶Æ¾ÒöáHiR6Ÿƒ½=—Ἰ/QĚΠbà7͉Í:ºà£f6›—ò|»9ÏêøÜ¦­µˆNVùÒxI* pl‹\È\åáñ'†žržÙX6æžS³Ã"õX $^%ïúþÆk0ž:¹ÁÔå?¦b™†‘7È[qÅžCìÎ~ÍE.›zÛ4ܪB<Ï8ÝNÐ'¹Rhô°ÞºOÏÚ—Ü"}J9v¿œØUb´6ý4M£ÂcûpáÝñ•lUZª?‡·Ôå®â$qCm¿ÓqÈBÖ»T&Ëûk¢ ÝkWõbv€b\ºsŒïˆqc)ÃW ¥¼\'ˆŽûŽa…¨vo¥j“ì{$¶ÿ(fÌ_MmíMxbË…Ú}÷Å¥Þ& PÝÜ@É”øà.?@MHSåüëú}N¸±c”¼Ö:¢~Áct„ä}{°îÑõ÷¨ @ÁVý)­æ<"}ûÆ|ÚtG¹~é1Ü+˜V°?Ä `¨kg6U]„'fSÕÏååh–×ïi…F¯¾Áýíú¥q­pFŸ/Žwîµ ¶j)×j¬tiêçzÆU$j°mî-áÚÕ…Jü°¶½¤^5~y%êÇXn„U˜%®¤”ZºÃš ×ï­ÓÉUHºÙy» °’£z»2‰]§¼e¿êçÊå* lOˆµŠM«­ììJÕPɧ2´3s#îVÕ’* NªK-àêÉH3›MI$W©`<Ñ\ý|­—ÔœâúÝj9KÿÐó~¥Ê×tuá•àŽú¹ºðÊWý§×0Ö²%ª„¿W_"T¡ÌÀ?rehý~M¸©”|vŸµÒsè× C+xý®ªÃéÊPD¨ øŒ–Àl•…jýÎW ûw)Q QÊÛŒƒOàVÆÙ˜ZGq¯ A”Ý}¸»6n"’<½Cí~|»ËsU°™w¹ºpò\6T¶X\ðvÞÝõ‹®ƒ>Ä›ëâ=Ù2€ýë.Ȳas·Ã„|‹¥/È'~<’z‘oµ<¡ >uPLìáè¨èvsó©ê¯\Ÿ'„O0l›÷Óó ¿â¨åÄ‹iåèGGÉI¡n¾Š èpy¥úÝrË+Õo<À$à›˜&óÉÓéô¯'·rŽ”ø}¥¸–wô"ÝkúÎà Œ¶Ñy\*XP°½–e%}JM;hÇ?>^+]k¸Ò¯›øÄd†ÚQ—wµÚÚÞ)ÌsKQÇÄ&_;·šŒuÅÉj"sæv‡ÿøZ1¾6¸éd¿ª:åtèù—“,ä «éF,-ßTw‹´ÉÐå¹ìšueùÜãe­xrÔ丙kb]¸“ïó[«„ïgX’šÜ\c<¤¦SËß©|Ȫ&–,¨Ëü‹^\ŠŠ* ¹Vߌ+Ø^k­‚Þ»¼3h@够¿TEj=ÝðèÜ·å0s€== (>eVóܽG Õ‘>UÉprÚ³Ù3³.<8«La¬·ÚMùá9¨`D™Û¶ŒµÔÒ5£Ï+ÙAíÍ ˆÔ'ø»²Á{ô(k²~Å–Ü-ï)=äû°Go„¥&šr©ùeGaŸÞvóò¼pLl·ŒóšX–äŒsvz Æy%·HMr£ä1ØuƒjÀ_ìò3r@y€0×ß~8³;QÑý˜Ý)V¸P< QÞáΩt$InÉ6(½öT~®1wu÷ó(|‹î×\!NFýš–Æd´–Ú‰ /ÚɘԪ¤6™[G/N•ž´:S=éA¯)",É× Ò^ êuÀÛfJÙºÐÔHöX4^8œeæQÅŸR1ŸL¿Þ†æGJùlÃ˵ӷÁD„|—Ø÷½‚þijR`Ï힟g†“Uë}ËÔi¥æ¯:ÓüPŸdþa×9¼Lóü–äÐÔ¼üº˜Oæ?Òãá5§âáø?%è•opgŸw÷ý+èOJON"oZãó|ö.KW i¾¶éZø¡ZÀüáÝ7æ°ÞÑmidéBØí½Gû®Ù#_îÊËxG1‰o¤=96tª… ²ªf]ƒl*âæAλŠŠoá=w†8l}%#Òȃ¤¾n)[cðº%<.ß'Ò|A!¤uʦËAoI@€Í=`ÕteñþKêa@iœƒ»œ%‘é±o¼i'csŒÆ‚4 ïŒÊ’¹º.ª®‰–ÑN\Måq ø*>” ÆlõdRñ—ó %\iûiUèqÔg™oî/ 5wÔ@ÕÑÛ4 bfªŠ`cßôD-8¼/”ºœãù—8HÝNÚ`Œ¨_y9LuèÜ¢â£Bê49—å#бöóvTê 2<¯]ëéæ7÷ìNˆ¼ÔuæV„o_ÆFÆžÖ‘5×ÒlW¨V#ž‘§ø7KÝb¤Ûµ¯hßß!¹8ÓÚÉuRAAŸÉ!‹%¾`2tø9+—2ÆE8ñW’nþ£üná6|Thåé˜:E" î:zK Œ5¢–[!n¬sºÑRÛõ¸t¨Qµ8Ÿ”“ Ú“Q‡ŸÂƒw®Lªî¦bjióûàXWãyá ú€îÐ) ’)¥n•Ì?p*”žõsaõn{á¤ñÅ„8dýùæü«p{ûq™T?·ëg»¼T¶ËKµus?Ä`:3Ëwõ§ú±#Á€¢]Ü«ö`©¸ÌEuMbæ퉫T q~ÑÉg®b_WÙl$v•¯¯ÊQIlRk>`û‡'q˜åæs´dg»a šmëŸ7·ü˜žüÉ_aÍŽt9H̪…—¯tˆPÖÒîæÏ_ÖX¹_ú¼*äUÑW%‹Èܺà{¥çV½3ÇšµºòðZéÜÖÓTŽÉ«ž"›`­F”u<”^?kèò&ì>T7J­5=2D(%l)ü騛«ë ¾D@ýå•‹«its O›íe𢲽íÜú”muÕs•HZ]Ó \vÝB),£Øª¿Ã‰êNT*»3oØ¢Æû :9ÓÈ@Láïn“j …óoaÂögmUy•ñôIpžˆ^J£ÿ‘û)—q°­,"¹Þ®BX±­=¢³R?¡e-*dÑ"à»m/ Ÿsî00ÙÓ½4 ¿WûžÀT„µû LíS»ŸÀ4a 'p³£\œ•T<õ¡ð“=Àå7¨…âz¸ÂEI¹Tâò5Q¬‡h>½x9ÁØå"CÁ?êµIçZ>·)¦±ê)&(ÖØø o³ÁÄ?P•åØÎYvöCÆh|å™3Ôiž¥.”=9MÚ?;íñÆq… ôZk`m¦\Óô¥w:Ž Ö¶+wœ»+ .÷UZpÖíüj&gÙØÌÙù®HœÑ á¿ðÚ@eµì8¢*/j;}SÉ+ÕÛõO¤;nì'áÕw†.sWá.'!ÉM•iÓ‘A·C„bWoL›³ Y×Tg€¤Ã5³ï°=qÿ ±Ëí‡6:Ë“²‡?“dÇU©ZÎ&i¹ÐDzó¶ “+~Ü"APð69«z¥*K¶ Æ”p ©Iæö<+¿HñL ÛŠ`®ÔVNoºBMnûÌ•|k×çF(°<…Ùµ=t¢ØÓwŸh\æÈâ)#v#¬¨¢ÚÝñ;_È,›µis”7•tuó±d‚¶ þn?Üî©ÖhÐz®OA¶®]HCJPáܪ=Ô™ûÍÂaÍòsÖ~°F€¾€©væ9P6 µ"˜©Õ¬ÏRIÀR[Ìë|xè!Gm[Õ¼GÕfãA¬d; K¢ûže'ˆÌŽ(úØU¸¶C1ÂfÑhbê^’*§Én†gûüª½î©L±ëÙþá¾&}³Ã².\¡Ä*î!gs8Pì½é6¼$·tm#¬‚ë‘6×on]£Õ½Þà`÷«õ–'ùf…»â³ºÍ:Ì-•f^lS§œ›¾9Ðf^w‰VK „¥8ày`–ˆgn¶[úØèË‚bLè.9´„Ø=W4D›MþŒ=ÞƒÏìStÄ5ÏímÁyßë³ÂÈ,a½OaxÖò¤@S &ù–¥&,“òñ&²ŸlÐŽ &Õˆ¸²¹Úcל ša‡xi芨Êvéö#X7ª5Õ Ú!‘bÇLsé‹> ŒÜgŠ8KÉÑ4ªüÞâšFT±·Ù):Y[7Æ’ì¸SÚ<Û¶¯1g•*¡=Q'Í;»M&êXÌ=Í_Ûl"Û{$ ¡^šƒ,Ô.‘(ŒR«¬’ÒUÕÛcIññè„OžõAEHŽäwhÑâV»ÐÚº&2. »¸ù͵â -Õ`E–÷¿·¦Æ‘Õ¢  kÄùmJŒn’Õ¢úfœ•ô-UB‡æxBºËJÎÃòQÎø+T|'‹K<䛌(ë”Mx{m­ÕțӮEÁüƒyëÄ€w˜²ïù.Sá- f­ñÜ,ÐÀj:9Ï_¥Ù‰^†õçûth³Ï¹âÝjk¥…7,{˜ý‰%'.D¹>Ï3ý»'• Ôrâc€tðdu™«d5aÞþ¾‘Ø™ÛgëÊpn0éX*Šƒü¼êŸS ÒÓ“0Å þ™* 0Ÿ%Ç/Fq.ÝÙ>RízGÏAO<lüÞ­v?ª éê•ßy¶z5TrËT9vC‡í”ó©gÍÖL6EqOª‘ "”³#A왑ua?JúüÚo³pë˜R»ë^ÉHR{@¡l9 ñ;êÄe¹†öé®O%ÊåyNƒøoX\(àÍð×˃_¯€b½ _#•HíWÓ­ ~/N¤v ËM‡Â¯ÙíÕ‹$ƒ».ûE›+yi6‡cgê/R{†Ë~Qóº¼-?VŽw›eKãÁÍzhS£Ì¤©/3 PgZý P=¥E8^Ib¡¤F9®…ÖQ[Û.þÖÎ|(aÚä¶éÉî”g~#š²[7ÛfoŽcs–Ðz­æ 3iQØtHHßú»vÃ¥´}3}Àò ByH¡Õ½èIëD9¿ø©„[ýœyÏØW_EãµÓ ëá²ÖPÚ56Xò¿û‘dmÂÆ¾Œ]ÕÙÝÆvð86Ô—};x|TF·zßBcØZ9=ª²…2žü{³ËÝZk-:÷ì¦1œÌ×1X.`ïA2lÕ­è•§U@50õªŸ^€ëþ–޳àqó)VPœ>ÅÚÕ¶.˜AŠ•Ú,E‘ÔÌÁíz™;VÎsÇ)nγGRç®ß2†œh$EåÊ8À4ƒ¥ènC”e{R Ûk~¨ež÷9ŠjgB®çÈvS$»Þ€ŸÀ>ÍgÚ×Çé›!e} ¡›u?Eî=sZ…tZ€ËÛ‡·îê‹õ™¾ô9 þu£±¿wiޝ¼ªÎÕ}Rú"GcUÊJõ!M2…T Žâ]‘òq—Nׂ°Î”Õq¤X›åz(RÖ·`ésæ4{æ]öí1]”ÂZ7>…Ì&Us˜É 9€¿CÐZÉmf2»WÍn&+uÅáH±ççùfÂÀÃþ4ßfWVýnIa5sO=J¡ø¼ÁF$3©ê Í-ÑàVPª–Ä8Žª~A¤Ô}@)WúšbU_]§EŸÀ‚Û†Ågìãà€”uØ›6|Uøóz‹¹ÎË Ö WVØy=¶”BÓj[W¨,ŽÛÍÓ¹ºH6Qu»|œ“ŸÝ">9`ÇÜXJS[uÅÜÖqøEꉢâàj‰.·”ÌEÒÕÓGõÅÖà·=᪴Ütר©}>_~ ô5õà/…µ©:H96rrNI ¶ó|$L‰«Xš­¸;ÆbGÆŒÆ~ ›HSàN‚ tߊ«ï¤%ñ=‚Z·ÏÒ„£ ª’‰Öó® JM\xßQ»ýà,|¦PuÝiBu­§C‡­<p˜={IYdwÅLþ­1â”1!éGÕ`ËxÈÕˤK zyP1Ž/h²5k û5e e_G¹=«n©Ó±yvÑÎ]®ÔN‡ír¥vVér;@Dn¤É¢lÁO™$>½q瑬‡DûGÉ1r<±äxäpYoEµ·‰Slxrþñ Y†×Ù£Ÿóô“nãº}ËÂÜÜ)6<Ù¶?Ž*ÚX0N·_%:õ`OéÕ¡¨RÅþäÕý@¼{Hq=9Œ;¨nö{Íâ¨ø˜ÌüI•[3ãyäÓ"jîqúíS¦ë··ïv7©Ú¾€SÖ›Çút;¯Y*!s‚ßúC ƒ™ÒÀ‚wj$=i_Lä)*rÛjç8Mœ0¶Ê¶sX˜) Ü.Øup „1Ø“cÂjÕ (jÍSµ5 +±õ}Bí–!*«€Óëwà„õvS f̹®Jl$CAÅÛºQ¶þµ |)jc«}¼ÂbðÞž–™Í:¬À,‚ðá”F>·÷ñ(i³¼âˆiÚfO95RíÑ\dò€í®x¨Â~£ýí#b%?Éû†˜œ ·jƒš¡j£<%Tmì5lÓBlW »A’õúE棷}/>rlCÜ®8“Çb ó0×êEi7R¨l@c#AFû4û·àrºà•E¬®5I#/Iû^rcö¸Š‰Îî<ìmT”ÊDµ›ù‰‘Ù=å.Ñ–X þž<ö\¶š;¿B‡é4ð¤úÁrƒ!´@ð{¤ÐZxWáá;èúÙÜ0-¹.>`ý–vnÏüR›2—ƃpC´Šóø¹¶¯‡ÒHŸÒÒêX×5Qr¡§F•rÚP®;¡×wï×úO²Û€¶D%wøTvL²%¯öˆžh›Ne-0¬c¹ðMooVˆ¢¹lÜ¢MÖœeì{Û n‚GåɃ¬|@ñ‰*ËͦbvEzÊˤá%´Òì0(l˜½‡ÜÞ.'o$"i)û!Î×è ‘¸¥¥ì&F²mˆÿtƒùæw¸Xƒ×’U&dâ/_dn{~:©¯(ol¿YÚÙj|^K/Š¥%ªÂ;&Dê»-HŒðeÎC1®´¿_å ê¡VD$mz¼1×ì2Í=²õ.ghP##É¿;òì– Œ+Ø÷Z•cìˆ2)U|Û¤FŠ˜–Of#nªm^•#⚦«gNÀè˜áMo S«-“e|ÏðêmÝj¸Èáá$wKć¹$°Ò\K× ‘ÖÂ÷ÞWœ¶N4ÄRÌ"‘ê»"‘lÔ#I^{3‰ŸÉTˆ)j?9³çe6Æ0±…€öéÔ^HaCá±7 “Uߟ³Û6T±²íÈþ¤3ˆÂ?u΂­‡¥ŠþÉÞry{p HBå+F8+")Ðü›ÍVœzHZ_õà)UL=lJ;gIýäëv©3#€}m‘.LÈ2Ý5ùŤÙH3òwêÏórç]©ÖÉ„Åk`ÖŸ1ûˆôð¦xb Þ‘ÅCcùM ¶ÛqÍ@·³ÝM\&‡Z?ü y„5çG~²Ô½¬MËÔdŽQŪú›#TÁví@ Ä¡VÎêÆ¼yúv†â­k™:ÏUÁ7˜W-—5šymÝÈRåV!d6$^¸Ì ö¬¾È`'ûܾÄÊ/¬1jø¼Ø´IWZvýY[¶™%É Íl¹1·–©å³Õ<ŒêyGrY½F¬íƒ#lKu¼ÑÍHU|¾åÀȯ«o¡—láSþ¶C}ôq°ódØÁñ–©6§J˶:»ŸÃÝŽó²zvÐcô¿3µ$Ÿ'àj MÐr3vÀ4Â}I•–¢±J©å ¨XŒÓÊu(ÿpÔµãÁgëð8‰=[N6®‘Õ¤euv|¦Ÿ˜7vÅF…g%uì‹ÓHÉ;ÇkË7¦ñV]wÉróx-¿y¼¶yUŽ*mjÄ9;‹‡áÁºUÞ¾ð^ÃhOe¤»Z‰Øøx"މ°¡ÌK7]K#­JX¿„åÏmuƒAåZN i‚ïÍž'6VœGu/}yyÓx­$ÿÄ\²Ìe ± ³J Ç’xÐ/z¶ÔÃ/ndнÉqîäÄÞ;8­(æè¥µtIˆÂ쯴Æþ£~0 +;D¸ˆUœ0)Ùs*¯¬CÊc9×ÜáA† +[TXPßW‘'‡Z@rï#~¾K©1DØ¥ÛC „“ª«cjˆå²AðÖ…ïâ’xü*Ÿ0Ÿcp¿×­j솖-º$ãÊ‘µº¥œšx²xÆÇKMûaxŸzí †~Z¹®Œ=RÁÚß寧Íë6yH‹2·7ø˜°¹ŠL}Í!B˜Uz>ÏR9+C+?BëÒ¶¸Uö‡l?k®Ù~·æ ]ÆâZmHÄ]·(º†oËŽkš\áéÇ·±ÐwôíPûã;L[Ëdu/`ÛÜ…Î]qÓo-_Ù kš"OiU¡¢,BoõÓbŒÆ¨V¼óD¶”VNŸAŠÊ“ Ïçø Ù±µÒmŸ‹‚X%TµB—±ôKª Zð‡²Ù¬è'4ÛëC©ÛH{2·Çû§„WJ+Š]V‘K1ñgrCgœ8¡Ã±ŠNº=ŠVúùPßò¤’À¬$°ËN:s@#tl BÌw›m…Öuûií,ÃÏÏ‘c]`ƒÿ€ý.f\l…hfG-Þ4n¼ðòƒÞܪ¼eª©5Wtnú³EW­¥×µØ‚‘ဓl¶™@v#1š¿såÊÝ–B¥¯w¸UììþÏëg‡.sb+|vKv¼£ähÔ–¬æóûw_ÐVOPUá D±]톫¯Õµuö ZMÆÚÿSß'jô5P«@_#ƒÈ4¶¾û}+½ÓšýCâ›Vs°HƒÂ¨úEïµM±¢V{‰Lx{F¬ªc B<ž»:y™,LѪ)¶s;´îå.ÙRZ-ûÅi`Öâ¤DeØ´Þž­ì¤á{ûé\áE« dʾpé¡_ÙIÁKŸÊä[=µA†$§ɦšc‰4@Ÿ'yµyySeç¨)× 5¦¶Ó9É÷½ØÊÎ÷nàV¹™¡:ì²~ö‰í$Y[Z~öR,W×é§Õf»ÖCó…˜Åi®ÓO+<ª…XfÄšßÐàÊ;µo“. ÿ £$ž/¿XY1àå°2K'¿½4¢bÈS„ïOR•Ž•5Nlê°º­%Û.ÁÒB:+ö”»B`òÀÙßšµC*kI‘`ŴƦp^j„£µPÚ•¨iŸÃ1–•ÕÑfØÈÅžvä“›R&íZ»íÊC1T¡ë¥µìV]˶ ¶²ñ]zÕߨa; X‰øU¢±Kf–vHVl8mžâ?x Õw0OV—:ºgÉù ëÏÛ/º“”dËÔ‚DSy ÝP³¹¥E”‰´9¦¹ÚK„ZáX¾Xu6¹YZ;Q/Àö¹ C„#ö³Ò»l®ê¼µbG¬5—€aJ:o–­óãË|ÂÓw¯±\¹äW{Ï«{Ø€&?˜Í.·\íÆÔ\‹qÿ8·~CÖF<â¹ÍO È]e€WŽÃ'OŽ ý¸ÏO±mõïÍY”…0kö;_g³‡?„ä* zõYfìP …d_Ú¾NŽÝ—qŸÊá ³9W›Ù¸15ÜZH׉Ѩ¹;[gÖyØž@ÙÏ ÆZèõÃü¶´Û"`¥‹šé:ãÇjMßÈÄáXá8ÙŒÐÇÂlÄÛ¾³â" 5×%±¨·Þý¶E±‚PÊe×e sœ.ñY¯±¶ gðõe¦eúÛðs‚š¬…ŒÝ€sj ÐûÍùRí%Íl@GüUc˜Q¶¦ã ¢7+')Z*[sFzœ†4Ÿ5•ØŸ…1s¹Ðè‘O+eÙòÙeOUÆåŒv2¡Úã\7’ä“ B—H’I9ù%bm OAç¾Õý$Ai[¾WÑÈNÚ:«ív˜†t(­;~h"–nuÉú’(ïžFYw&}ºÎ jS?eü¸z¢Ã—Å—<$óÅŠ\ú©1ß?ú‡´n³0L2Òúª¶kÝÅUÛ5bÊZwÕv­3V½³ÄÛür§k)væ2Ï»< CüÀx:ú™OÃÍÏ4×Õn©ü~ f†°­_Œ”‚vXæe¡ØsĶàˆ7\Üm­÷fØvCˆgòÂç è]³½Åî¢3¥Û*ØAÑNEÙ½°ït&»úñµ%ª.ñÕiN›¨vâe5jZ¢ï¨µÍû­í,ŽfG]V£…zz˜U»HÚ‰hð¤D(uÙWÙŽUÈ÷h’QiD¸¡—ÒЪl[?ä™Ä|”/dÞð»2ùr¦IBßGšµ‘Öïx/èÜ .ÌPÂ¥çh•Â>›Öƒ³ô•#£‹£‘8âT×wîrfghV“6L¯ø¦×ùù{ñyW¯ò¦;­wn¥Îx/+À¸ynoUÿbnÛ|*ˆ¤uKH?£&ˆG¹HBˆ^’/en‰ÛF„òI|{ÝPL¥œVGœÙ”“R=0E×I˜B.™vUÒø cÙmSîé¿&ÀðÄ~ŒÒè©¶#D™iõÍÆ–KÀ—Û4z›©„eê®! Ëi̴Ӧ虇´éú;[û†æ¯bAC¸¢QD±vŒiõõ,¸(˵îEªm÷3¬Õ0•ªV?ÀÙŽ räXcäD«ãoZ_§*7r²:xÊ®SŽxlP«¶ýÈ4õ6B@ýÁc°K²±jÕ¬'Djk`™fG’y€ê)5O0Ïñµ†õ¤F9Û³lM§Ô…ê5™WšzMÇYßTœ$VZ *N“ó²ééU;@^öô Áï=Ò ’;û—oÖ”˜jƒÊI5€g€ £DËqŠE°«ûKœÂÂteRõ7 ö½$ ž),(¨Pç4á>Üñé¬ñ³†¤ o¿´g}ºM3ÓR]my#cK‹PN17E<@UI¿ÁÏD*<ª¼MAÀ9 ©ÙQz‹•qû×C”x<›ŽcOaWôôº`S#Ún†²‹ü<¨näÅÓïq!/4è:y:îø‚Ëü‹^,#âÏÁ}Æ·ç0Á™ãó£Be4|u“9ŠãósXí¨T•u=$¹S&Õ=Ñ]9vtZòsœðeA‰@î|ä­æH¡Ò6…J7F%—ÇoÅôµ“_&ú¦Î7jx]§tûe*‚ƒÍnë „Áµ:Žø"|‡âèT¥øtY^[€”“`enWcÐz¾š|ØÖq†‘¬»ž)Ñæüoõ’þ°=»Žÿ™ƒ·;!XöyÄP„§§Ü™òj6 R®‰QœÀv¯ãkL»´-Ž‚…¹Ý'×ÉÉ“ŽuU—Þ`.·mþ”Ó¤¼äãgÛå?ƒ!€±ÉH;êàÙˆ2%¶­±ÕðþÙ _æÛ±z·¼l¼Amü²e¦œªÝÆæåäcE€jýè~‹oÏÝHR2·ûÎͶNÞª›q×h Ã=´gý<¯óBh††çg°ò½±ûÞ7Ôñ=ËòCî[eT x÷ Û J â‡k†ÐkÈÇ-¬cìq^þ°¥ÖÃ\F¨";¡¹"ˆ+R1®Í¼â5ãYÅh`-w,´˜4ñ‚\§}Ôàcß *2B¢N±žóñ“¦'oûx»Øè‰X'?Ôssp7ƒ š Íy%ÚbºÄõî(SÚ› Ù~gd Ï8X ¬¨oøþ²Ⱥ%e>jMS3BcÓfÍ;öU>+oÝ‘Dœ(Ñ +ƒšn ÿ´ƒŸnìñ59û·*!^»ìL¾/E§@H4"Ÿ×u „Á.§ëëÅ.g¯±‰¨|ßñ8•Äéä½›‡È½:Ô£‰WoÆ39¦ùÑp(ÿ̾y@2B$O+hyJvmб‡¯—ö›'Û¹§„õ<ÄLHö<Ètõ|ó‘Òó±íA†¿w7PF‰ þJn„Ç.ßôÇÁ®ÀPóÕØÚJa^â¨$êœ/þ-3©Hu½d¶[y9Œ ÂßîäN*L’î°#ðÚsѨ§|láâžÛ²îSl[Ý[f~ËK3=%ßÎÖÙ»p[â–Í­¹½,*P£†|ÕU0ÎkTÛ¦ý@¼{$†F¹SïΦ/prpX oêzÜâG¹l¦rl»{ÑÊ/X$ndÆ–‡BV7i­w@˜—k>Sɵ' ©m†KÝÎÃ`³»á^¸WÀ§ Æ¢§ÀvÈž%/èSxgуJ©Ñ$Z·qq¿ ¶{R¼Ô˜Brù(E—Oü¤hvÔE¥ÈZï[Û™ìáv«;³7xúíY>H5yX|kå‹hâ€gÞ½‰Ãv“&jDq  M#Ê×å°ž/=ŽOç[ô=—ô³Î(ëi¡Aóf¿€\³ŠeäæP_Ê»°ß´ê¿ð—éj·7ì&ˆõ€v@XPz”²,(›ùÕ0H­Y–lã<>®PA¶bÀú”.G$é£"ò™ˆÇÑ7Ö’ð§”ä@Pò±a¹¸6ò¹b&kåð¦ð­ùýoŠ ”r×ÍsHºy»nâœoŸ/"p%ÅØ¸'E’Á/ņ@ž#Xád(XU°½øË9üì·x®¶ÒCL‡Ððy‚ëT.‰cšÒZr¤Y‘ض¹â•èmÏõ¤8²)ˆÁZ’HqA!‡ÊÜ®© 6’T™?qXB‚®Ã—êALƒÙ$r‘“Dr]Ƹ˜%e' @¸‚mpDËÑoöÕ—ìƒläÌëlß‹½ÕKq… ¿Û´_jðϪÔ>\GT”ìJb·ro@[c ¼I)Cé™|«dÎÇT¬×Ró¯íÔÛ)ÕäÆ¦Ø® >dÞÁK›«<68 –‡†‚9OGŒøÉ«Ù>èÖT.àò¬·á¥‘˜5&öT*ø)¶ô§‚ ¿•ûÇâòç„-’Z n&~‚æÏê·ªC’5>pš'5¾LÛ‘ÿétJ=OC¿c¼"äOÐ8¾)¦”Öç@¤•†Ç«q´W~Ž!@l/ÄÀ”Ç!I±?ìRtɬmÉ·¶S=œ‡õ[²7bÔ’\°8"ÿ·qµ=Æí¶Ôýw¶çéû»mýàáËmpš—¬é¹Ì’ƒMy$GΘ~$y œì%SiDW)‚2( Z/Ô¤é^âÙÍt?®ò Õ/?µúñ¥âÝ)¶N„S3@QÀí²ÄkÌ£FâœpsýŒý˜C·Á'êÞIÔÞ`ðv£…¥?ÝÏ^ÓK«´[Ȭ"i¨ûcÜJ}Ô*½™hCÆN“ÐIÅLšx$J½U—¤Ä‡iŽñŽ6e²ÄKâ? ·FF6IJ²ŸíÌ€¦"#AW1/ŽAöP•=OX3Î}Þ¼fܾ{²—¯Št rˆRx÷Ô"°YÈÇ"y—ÓQ »Ò-¸•Dc>Ÿ–ˆ”õ{Û[ó ¶*g#n–*„·ù³ÏxJ¦ðιø9šcc;ÒZ¯Ó•Ao µ«¿ ú*JÚcA]ÖYÀµ‚mð4¦®$ÓÕ¢ÁBô}o°¹çé &LUK.-ÑUÕ“…Âÿ»FÂHßE¾\S¥ø—*|‹2öÃñ ê&VÆ÷vô¡NÈž;‰AXɇ’å¿ÐƒÐ`ó˜=~t6MŠ DµüTF‘ã窷„1Ø^Íbˆh?í^ äN“ÑŠ2¢Ô %…HN¨‘¿F2Ý¡ÍÍ/æŸæ§¢ Ï®ùŽ ‘J5®Gƾ.©Œ/xˆ€&]Fe߉cu;ùb?^$JÁ)­,dJñv!SŠG+ ÝyÉÍlêÐÔd2¾–X6rNÑ àâO®‘Vϯy! %› <ºŠI\Þg§nX«*í”ÜýîìizX<Ñ/Û2P“ö9Ä.O'™Žc>-îH5ÿvð¤Dc;«·0³¾&$Eà‡{l¿bÏskÔ„ÉZÉQçÁò<#–ð—l`îLö³PƒU>:®˜‚¬›sÏžÔ_9:/ÌŽ¡õ„{O£ù·B"ä5NP´êí-æqÿऒ»xÝZ¹ÏOc*×òÝt¾ÀGnÛ€¹X—b:Š7膚zH`p~ŠãIÑÎøUY´AB6ÙD)„I%CÎù—ˆŒ ¨ÈìKQ\GHƒ"ËÏNüøÓ…×J²ã‚®Â§E*ø¿Ýž8Ú‡Â:2)Iý:·R,=È´&FÀìm”–”¶ÈÏ…D)R\¶N a—>ÌCV)®ÁXآǎ] ,F{o¶(•VªÔ‹Äd¥‘Äšk/(†^¹º²û"ÃÙÈë|V$,R"džºpÅ›h$R™[Ù/Í‘¼ÀKÉK9µtl’sÃEl¬ªÅwŒÞã< ìõ’Fœñ`KÁÖ-BÇçÖ Ãë"[³è¸FY‹ƒ9ü.u% @ÑÍ#¤T‘âJÆÜ(¡®XÈßò´0@ÿ9˜-ÇÑþæjŽ|gðìíÒ¥õ¸Ùp¤x{Ä(ã°çÛÏöPNž‘WGÊnêc2ˆ7ܬ`T`6é7&ÅBp|ŽÓÍ5œÿà®É_…ƒŒÄc ³ZOAF…誻&øŒ2Å`ÿê h†Qµ²Y±Ã—Â&.MLB”¹½•^¶¼ U8)ÛÀ+&—=JÃÆôCN'Ð0X ÏÔ¢£Tº\(±kqS®/²+D6bÁŠ»C€õ—r‹éŒ4EŠz̘d ÅtSÐÁÛÏŸ ìÒ¾I9õtór~¯cø¡ñø£™I„2·ËÆ,tXÊ7“¬öéÇ”m‰\)œ3ûÅç 8ð‡hA âêÇ¥ û!vì°jCÑr¡ÉR®·|ÖC•b÷ÅCWWS'dˆ‘ºÃ—ëÚ¤¹„îÝá¾Ü¬Ž àpiæÀú€ ¬RÂ3^䥺HŸ…Ð0©!K×",þ,‚“îó¡-šk•Ó¡8iNî¿“M!ë‰ÔäT‡Yª5D0»ÉÇU»3—2ÚUßv1_{ÂÁs%R“r"@ô¾íª„ {¸Ž¬~“zì@öÐ[ÁTaqLIàTEÍvÊZD¤˜ÛÈ®vÆÖ‚&hDÞCElºÊTJ¿zôG,ˆiâí2¥:\ŠT×v‹6Û媽>^½8i\‹íræeÍvžÇu¸GØÊ¿Od¤o‚d"¬sDËí5]é ÖúL#8n)a+ÕbÝ®)R¾!¤¾›V6’°y¨îs$Îíæ‹]Ò°^JbÑdU›ÀG‰MD2ÝãQYÕS<ÎŽ<H@“¢y1ûH¥H¨>-r”hå“GEjl[Î;mÌ•¯•Ç¢D uµ*™c¸D¶†”]ž‡ùuʰån ¤@™Û3ý[H=mËS"íìÓ¯[À‘RÁðGëRŒCh}làêK,§ž'ØZö!!Ò™ˆkQÃèäÔÈ+\VéfUàAJ ½’Jw¨ú Qµ¥Ñc‡jkdž’×eU·ê°Thz‡ØJTÇÆAoºjñÆúŽŸU0§¸ç“ÅÁœºe0c½Uý„Pûá„«€gÏj´B€LEMÿù¼ÙZ—85_m%< }Ô”Á½¹(›~•« ¥‡T*¿:ö3 ³M¢•8+; ¾à8 .žfMËÝÒ;Ê ^5‡oK¯y\1ØuZf«›ÊÏ­$ØQö©çîþßj\8vެ֯·?—à| Ú|›!EÈ©"Ž!ÅZÍH\rä•#kÀ6|Ðÿ%T Sæö64œ_@“Dû"jï)vó¥2Íßæ˜QNчŽ,+Ò²K!‘Ò…UËW´Ól;‚É¥OÀE‹ðKV$‡ V|ƒ§–ÿ‰VhÇæz •âÒŠm÷S1¶Ë¶2*íP}ŬÌmˆrÂ\Î*f9¡´'Ù@\³´HÖ1>ŸomÅnNiK MQYµšŽº`Û6I‹G”Hç!$C‘¶úH³¡­nÒ[›Gc"$êvÚÖ%Ã¥Ö»¤‘7?´žrlº†Õ€å¡rõ*NAÉíçÏà3lg±5Û^b\³_[‹ðašŸîY¾NIÝZ¨hö6ø‘|@—SùÒ ¹z²}Œ$Jó¡K`:b¢Ù2Ü6v¼Õ>j ¥¡/ i—Û£ÜóÁ&4Óyí¾øQúα—žBfܼvºL?¾P; >xß³¢ÛÖÏ *µp(lÞ>x©öî w) ð}5L/ÀïCBÀ²Í»6àøú(@Wb»­‹ï“ð…6TÇÒèE7]­Qé·#e‰ë{ 9›°ñ‘á6¼êaP/ l·p­GÅ‘ëÄZ£Ù?lgñïÌ7 ¬— 2¤t¾™•ÿ² '¶«û¡G‘zãJO"ëʵ™¨§&ñu¹ÝøÐþœ³bSD“Êc:­€œü$gÊÜv”‘ï&½‚©Ñ¢áŒ‘«çaòܵÅþ- ,… tÍWáhˆZ’uE$–y hécïdøÆQ[J ØB8Ìßi ôüÛwâ [ÑiO¯åL{r|Äi/öN®”N„ÊM&e)ð•¬Ùxƒ)OS)Tœ°?{ælO9܃È¡3“‰Pä–°"Î×%Šð•dÃ.É¡"R./.H[Óç—“õþ˜ù´\íã\†¤–Ã9—bÓèVàÉyWf ÂLÀáHY´ƒWp5/_à¹M{µµÄº pNxcíŸÝzÕìONeˆ8àŒN%³È.9ÙUãwV̳9j)È$v•æçƒ£ÒN| à €-¢ðAJviµX†´îT‰´õYh'¹É)¤A¥‰ÎQ8H)1Ÿ¹Ï)¼²,T ¹d`hÏÃ=N’V…Sã~Lº âa—RíÂv)Ÿ¾&†oüáV#ýòO–ÜyQh`?λѧþÁ¯H$˘7Ð.9h1vq5èB(>àʞ˻ÀM,ð(»m9ï¢ß­®>R•Êñ”¸‰X‘Á ’ˆ>22£í˜ÿ˜’Ó:q ÔÍ襷¹3WÊ#¨„D·Œ"¬^4`D4s?‰}>7æþä2Á†W׿eaÝ2r×Çföxà ³‘_ž*¶'2©/!UÏ…er>ÇžgÖ=0pKgü²ßRq€¹ŒTy- Ü%Ú߆(Óo?.C‘zKÅ—q«Ÿßa»œ¶èÔézã•'¨§—¸„òø H=·gü*{±Š2Ù—€®As¦¸tÈUV7HQj]ªBÆÑäf0èD)U£bÏßFƒë†lô7«äãù¸þs+×ÿ%»`ÉCbà oAƒUjö3˜è«ç”ƒªùŽ^‘7³°\Zê `f§–›¼øÌhÖÈe#Ê¢‚žÎ®rÀ;3¤î¨¤vO15¨eE"È}"Z\$D('Zå$¹:VúEWOt=ÿÚoÀ¯QåqJA‡âû€®JTðsߥ¤æƒ3ýƾïS. B©¾6â!Ü.ý Õ¶Í¿çeu%²ªˆV—€Q&Jµº¢~vÔÒ”€ŒÒëòãXÀᰉż-’VÔjêzƒd¢…bd'-9§—ÐÓ(jŒpü+‹êÂLˆgU‚E|’›,(¢b ð)ffÉkåy@Þ‰‡œƒâaÉðeFNwFNmT~ê Ô×(³WO§ÜÌÖß_ûou©|@–úQÝ«÷R´ÛöÖ/#ñt2˜¾Cö§ØUöãÚÃùü5êA†‚¹ŒP¶æ»dÀG:µ¨ìZÀ’óŠ>€5Hˆ)Ë«@ò°Ø0ðß_£ 'ðYO‹­8·Ëžd/QÇniÑ:uì–B¦Ñí¼ñš´4ÈqsCj;]ˆJ¶2ñoIbJÔ}«‚Xϧ&B˜Ô'¢;§To:œ f“ƒÌ%ip23ÒRÜLô-×ìÁÇý<Ê}ëAi|÷aávg#ˆ) %ÉòŠIÒú *ævé% òï†KL‚ŒÝ†ŽCN}¼;UUô¤`P‹û“d&Jȉ_DÆv,§Ú·Ô&͉ /-›Œ?š-š\+.ªŒ´ Þx­eÆñÐúëT¼Ú„@1·Ó÷Qm6önÛ‹$´ìDërÁÙR†BÇ¿í”[½Øå©d¹wÁâ…!0?– }Ðsw](ðßp(ÉC"Ã×…lG¸`”Á[‡/ vzqÁ(¶Ë¡ÿ‘þ?×cäÏßêg:,¼óqùˆV€¨²ç\‘Au6jÙ ‰'ù½žE'}­5+<¡šÌæà¶ôg ‡~í-¢$üMFX* PÁO£™Œþß%ØjjÔÃ;`?IµlÚ‡A?nÚbÅ"GsòlÐQ¡,¼¢Ð•McŽïíDhȸ&$I™Û²ç"r3K«å(~< ±‡y®Û3`Q&,3<±Ùª5­wb„uS›WE`EòLÝŽ:™cÀiKJÇØ¨Kô˜ÓELŒ5@;©à`öx[ÊDÙä'EÖœH߬äT¢KŠ™¹+Ä/‘|`< Ù [ðÄX ‹³üŒP»6¤d'!tŠ$^-§ï{j’²Ð_„+c»olÚ,cøЊ?¹§µjž1üg®'³ V,4ãœ{l{zÐÀÕëTXÂù-/tÏnÌsv0Fòá Ã_öBFÆç!7UÀHã(Ê;˜P°µÅÔÁ¡‚í…Ðåugþ‚»úybfˆcø†E'}ñž€‹¼Œ@pHêt„Jîa’m3q/°—8ÂxÛIP(º:zmÜQ-ÐHÍ>û·¸÷;ØT° P©©š†Csöï- ïø Ø¿yÉ:ýù;$Ù)‘b·¿…Œƒsg"¯To,õÖòtÏ|j'íÀŵ`ë,tï_¾ë¯oåk/˜ùÔå®·Nf–¾Ùmí+Ýœi8¾èÖs4Zo»õ3AÝv­ia°t»–M #e|úÔc¤@7€¤o/ÝyÂÔs5?Õ¶ŒSVr*„d2~« D[‘h–qù øoýE9juOŒÊç6$1г°³F¨¤HÎÞÃþ+gÉŸþ3Q9{É=:ð-Ç÷>0z-{ߥ¯Ù’pvÿ ½fD¬oò›Û]D`WBôq9˜­T²¾(±³öûK G òný#²‚º8Jʽ<_’”–.„Ð 2›[Ý×±¼0WlOp˜Û-Ç€g7^ G¡=”×ú85–.zý³…è*å:,Cl÷sÕô;Àcýîؾ–ðŸò‘u[½Ñn·i¤‡/ÚÆhSÊ…À}R”(¢úÊ­QÈë…úñ~Z×`ÿÔ,#P¬–dC3ü+^#pGý¶O¹Ã0ôeßÜ' {ûO¨ÒÉYE¦õ¹ëäÌyË7m‹kÓ‚›Û5¼$Béé»ngGÒÄð,GØêàé"NÔ´@:€pâ‚4Í…ÖÐü ‡”uo»ÝEœ¬ÅÒu6z¢(Jé:=}vöu6:Xw°ë¸H 8ÿ|ñÎô3^ XOöÓ¡Á<‚žª ~ÃÅ `¶]g Wò­ë'ª$‰¡Lûp~º&.ß”—„ƒ ¶Ã}+ 8ÏO·Zõá0â€zÎ1»Òª²y ¿ÂvOŒŸÅY…=Ùó•=% Ù×Ê}öD×ÙèàÂÖVG3FýÄ2 pDê&6Ç)`8RŽÆèømÎÆ@^‰½¼—ë=×Á¡‚í2 @t2ò”ØA å¼]»EçѱºÇdgY€GqvR ´U‰Ü“Mßæ”\²Õ¾dµ?¾e j“º-"÷Î{ù -ùÖ“ëõÔl{c«=U{¤ óúôÕͶ.ŽP½Ò„+Ãå²1 °#ÀN^¤Çdøg3ìªï¡ãs'Èj°ÚÉ‘Ò#ý áR~\Š™é&ãØ)o|d7É™\*®“䃤 îy*ûy¸ç±Ìw_œ–ùîŽÅ<³ž\9ÁüƒƒÜÝðæŸRÔ>­6 ™¶ôT(Ù·é¤D™ÛÛ‹&D0¹À¢uA:ùOz ~‹Ó‘¿%;Rrþ^O& uKÑÇêàP™ÛS%džÉس:ò1ІAK6Xa ÛÕ˜ÆîsÇ×Ü¥4üø>ä¸éäžì+m5Ç„2‹¾at‰×M¶k»ìfÄ®®AÌet–m>˜Š‹Fv² t° ¬C…@w[ZÛÁˆ‚íaP¦`ëd°µÆùN4£ûÝË]˧ŸxB«ç¿@©ÖI 7·‹ô–Œ’}Ï_!qPìh>U:­:™îˆ­óð;‚jž !ÙÅÞ¤“Ûä”MA#‹ómh­ò°¤´åÉ«;¢™¤E^yHew·ž]‹Õž³mýšªJ$@7¢TƳoµ=è5æ 1œÚÉž?='ÿ¥2'É îòeðçOŽf$ïig£úZâ†U5žø¢3‡Øw}ƒyæx7áF¤SkŒü¸Á"}? yTõ·¯FÊÁéUY#гÃU®O^ë&¦Îð†GE z÷‘ªÐÄÞôİF ëœLövT;»sšm—‘šéÎå;å„­8¯ƒý$°Ïw²ŸôÜœ¹–éo> (À땤.9Zì(K8Äs¹Ë²ÉrEfˆSüȧZçz6á"g„-ÑOsè­…*⪑∾1š­8‹°4Hvm ß`ª©îI>‰i˜Û¾×ý¿âóH±©)\”·Ó–Ð3¾½>">Û£t?¾TŹ;s˜¼/ %¿‚6Ûl t¤é –‹E× Giçã»p°Ž’—J$ÓºÉÌÕ`nŸÃ†^‘Ûe]²t­gõ¡l; –~¨Íþs"4õ–h8[ÒJócqp'¯IÏAæê‚L¬0í›ødg’Pßz]Éléœ+I‚’ž]ϹLt©Êþ“áº8à mÀ÷…94^§’E¥õÂBì(gæ#ήf³ó˜æÏ°&_êÈÎ2‰Ó ÈÜr/³?j©ú1¯×ŒÂþ ûÍFzüñ2lkýBÄþÅΚèÑI19 EÒŒXA†ßzÄXô2ìB[Ó+,ÃÏbª½ê(›K§·X??‹é×wf27¿fØçDº>8ÖƒSË°×æ`Öá'6P 8²ÃÜmPm $Õ5¾4㸭â: OÔ¯öHéæ•pÅ=?_¶..žN¶•ùg¸RÁºGvפ0ýeì1 à— Eg¸r;fêfê»®v<ìs†­su*¥BuíxzýlW´}­æaÕ–nŠrrSÜçÍv˜á£œÊmN³k®;Q¹ó £:LMç6s6ßd«Wú›µp£ ã¡LÄo¤œþ`®Æ–Âq+nþV1«ÓrÖu½îü%4±×ê¤0wúÅÿš%¶:©á§HÏž¾Qh–‚tØ–N¼gßœ'½Z_U§˜AvòSÅŽHB«1Äîé `3•fu2žôº£–jû$`¾1§úñ[lÝ’õT•>[uä½Ò7©bTgÀ¾$¹ ˜Œ%r¯LÂUñÏ:Uب֘ˆm›~!qÑr¯ô˜t%ùs5\zúÊrÖlÿboš^ rq úSEm}h:øN6Ä1K°É—3[]'ðN”^ ‘d­jz=Ñ~ ôçËH_5ZØß² aô@iœ}”»Ú§Uâ 3)åÑ«(ׯà‹X­äwÞâYâÊ¢^«ºì³j^Õ_yƒ+íõøÃ®Œã»Øj;”L6W}‰xKÇ_IøýÜs:u}@Ø)ËkÀ©—wZË\Tou«7¦`ë_ˆ ÙéÐ$Ç͵ŠY"=J§É4·nŠ5f«Úçšo V!}GoŸ[äí³ƒÍ¾Úø•zs^œeiZºÒ¬“Þ¤·ô;‰ö„íjv¹}ä:FÊ®í ë•{ñGZĸéOæÖÉ2[|ckèì÷FRªtpÊhwNÚÖmdÄìí”äš:b4~S£ûÕn¼Q´Á¡ Ûãh¡µºÓù#*¦²XJã$l®Ü²7çíä#ÄðS‚é ÕÖñ]ª­ƒèäÚ(ÛºŒQ[‡^4þœ½¶kÍ S[<ö…iÄIÝ3ŽÇ!ÇÉÜ–½zë[:ÃzDg­w’«’ë~\Û~\[sàÝH´›¿³ÉÜ)®(žN™? ÷Öö¤ §ÎVdùPo§ÜšRõKÅD ò7ýCΑ~éNÐDӤл3Wùq ‚e'ŒY1š~:âu’Í­Ù÷U_ÊPtËãþ.L°µí•²J°_-T^=ÚøÞH -²âcä¬t«dó÷á0­â¸G.ª?âù{ 3‘žk‹µß5ß.ðÊäÁ¸mÙqpGÐ$Œ‹ø{süéT}•3/Ø®ïfþÞ?s=Éá€:¯i &é¤ùŠÞJCÆü¿ñ8ðê¬y ×ìñ”ZÑ’µ Ž 0®b'÷ìÍ¢eçv0A(í´QP7¥?È0 翚å\kà^h†:lrBÆ’Þ®´ˆMãkðØ:Û—ìC]œïÖIrÒÅûn”ËÏÌÀ•ĸ_J?øŽúYªYg Î@=‰m+>Ã!ý9ªÛ1˜°<ÛE/ä&KgP ÔØóX¾¬[Éï¢!oŒÐó·Ö„¯~L@™»¤cñ}4™Þ‡MÊrCŠÏNm £? ‰„ç6ùóY²K%# ÆÊ.Òùü¸èòð±§r»>3bøØ:0Ðó“ì‚ÕòÙI‘‡Ebó^f»žfF¥]\ñ@'Ø¥ov“åñ^v^!÷àK+ v;ØMV™/ÞÃ[‚TéOævЄý-àøì©0¦y½G¦ÚNç“2¥o^çokˆ €”-]veœ­Ž¢ÃⱈBÞ¶¹vù# šÁl¦Ár"ìjà âÖ{óD×8Ÿ®¹Y ä8¢‚¡†­Ÿôì¤í7o¶ YYÚ®ìépÏš{Ê¢ÅëUç’œ&*¾í× 4``®»Ì\Î'ÞÓ³IËÖáv¶õŸ²ÜìdËë^}? ÇM™3 ÐÒÆ3mº2Ÿ7K÷KˆÙˆ±Âoÿ’&¨2òÐv¤Ž’Öí‘ Õ–°ðÛpr/²ýëÅ.ì܆O¿[ÚåFcWNF\åwÆ›–™_ž–‚èybeg½‰ðY?:¤ß¬ú@/f÷(#$…u†ß›gú ¡¾oºj2ö„0VÿáèGgÌŠ‹é«)og|¼Cú¹5nòŸõþ„bÙ§¸”lÿìÄ«2¦¼bS…0ËíJ§:ƒIäHHñ+† ä&K®ad@ú³MGvý[7aÃyÄA·òú­s€úÖo}mƒÍĨi-—Ý.á5KòÉ>Ò˜Ìí0H肘¿‘ÿ`OÅz"{G'B¤/2§ùÛy«Í:±¦½g?¼ÈõfÇ|ÔÉúÒ{v oRùô¾Õ§ }}c*i31þ» ‚ùBä€ïýŒëHì;§õy7ã&hHZÛñLbç'ÅIïÔt =ˆ-èU?$dÔ±£~þëQpLÅ´FŒš°×Ó8žÔ1¹î§g­ˆ²ü&¨ùµ°îgÉ5i€GzNà¨x” O˜wa„,TÒ ß·ÜÚN¬{@e§OÙÌd.’ÆaÍAÞâ€H’Òì,\X—–KaÔû-Ž3zËÞ]q\ïëÊcpJÎ,ÍVûÒŸÀÓ ]ü"w4 öhá`•"G!Oô¡›9½ ‰¢s¡¿(¿ë.èDDôPGÇÔó~¦e@Å+•N ×=sC^ç ºM¹î—\·3ZÍn$„ci'?Œí}ëbõ]8`¯ÀkÇîä64†B/ˆ5}7|Wcp'Ú÷]t캗~CÔ‰ÞØc\"qGy R[Ú³Ðá±Upfºqfl'µyµy»ÛXl²ÊMÚØôæû­»iß"ÓÆ‹J«¿PGeO%0Ögbˆ ~›^›jÉÉ#¨#@Ö½„R«é—÷+ þ8ŽQâK¼;Ù¦'¼Þœ|&M]3å®ô%4F*Œ¥CŒxùñz•ËßAºd?+w9׳³ïp ;¤‘ÿCߎÜÂÑšš¥Tǯ;+‰¥’÷U‹˜¶åB.”®ÁŒS|Ï|5O÷‚}-½tP†+u‡+•M½¥¢Ù;"îöéxsž/Gv³*V¼³Dog¹e–èVv|=õ’(ªõÐüÕNМ^¯n”j{–Ž×IË—òŒÿ/;À<Ɋ˻ܲØî¾/BÆE¸ þ¢ìˆTG‰$@ów ώõêã¶ä6™Ûý¸ Š ice_¥îRCZíDgQó¥»ò*D?{Ò÷q†ÿþuÑãó]m¶MN1iX­H¨Vf‚”  @JEuîÛÄ—ÄÃnG‘‰76È2·K躳‹÷( Æ"¹ŠèÇ\šK†ÒìÂw=y'‘ ‰î#2›˜/ˆ eÊOšXmÍ‹/ë{ˆNðu¾<Ù:t3 ¥aä5é«aS÷==¨QÞ¥—m¤þD”~¶k>ÓÕÆ‡Ê”ž˜v/äèª×u„ tÌÍ![”[×ñš g@M¤ðX H["1µQÿ 6{ÿÒø‡!â)O:ðZÓG_–¡…Sã þ@s€ã|U F~ªAÀu‚Ö6[ÆÑ¶~´:5ÑØØï·ë¹,}E6g±¿ÙnóóE¶“®>h ®“ÔV B'×.³«I=_)G,3™,ÜèûÆßä^¶ aúŽ`Aüu±×dËîã •ž(…ËÞÀz¢Ö Ãzêc–€îÄa$¹¸§ï þ|Þý™ˆuî(@6ç,ïe±*5¹X>Jñ±òÁy4¶[¦“ˆàkë–.[ú†ôÚ>;{Ëa¶«ÿiTË Ã°pna£îÓ6 ûËj"oåË¿qø*yû[?° }#– nµí5v§‰¼£™ô }ÿј—‡–¹¡3Ƥ²ÕÀnÚ“>‚%†ÙÛ"i¸a)¾Sqð "º}}Ð(W9è® 9¡•Õ‡Vúl#+‰âô\Æ'fà…/õ&,^4N&—Í{ó~l%â<èT8Á¹Ö ÂÈi2·ôóÙ¸;*sâó€æä2‰Edw4ÛMaÐÆH~9`ÒeI&‹é>{¤@±®1÷>|Çk)¤S†¬N–}М[ÉqŒ!âð~ƒÞí&§LVi“—·Œ¥œƒËƒôbÅqã¨`>™ÖºŸb·»«·Ò&žËlÏû,¡Û,jþ:#uÙ)—Èvô®¡ñ\ÓäNýÜyÕEÚÔÍQ^Ù™jNÙ¡·wùïCTÔŠˆ0ߎ4bE£Ao “Ã×·B;å¿ %ÅIg^eÄH^²PµT# Ït[|wœ´t(³|¬Ú¾¨‹Æ°­ŸÁÌÌyD¸ÐÀw¶·}ìágVäöq]ºÚ >Ü´'6±lÙŽÊ!Æ`ö-(çÛÍÎi¢n©mšgRëéRD–L4µ<­ :±b¾Ä¿ì2A»4FáZ·¶Ðˆ’½‰ðÕAó¼paáVÃw¨ŒÁœcÒw ®”IýÒµ&œ+ØucÚJ2ýÎ'4ø*ñµþ£g»~³; B#<?öXt§„ÛÎíYw=-/*­'L|ÂCïeäc;®9ÅNÜÑ)Q’Ž(ÜëíÖŸðcåö#ÚÈtÿpÙa±YhŠ­º±Êöñ}”’Þ¶ƒbÓÈŽZcl¢‡Ã¾ Pè)( ìi ÀW÷©‡ýdêèwH,í3ÕÒ£à̇£´k 5ÒI¨ï©ä>QpŸÐüT1ú…ï:ø5ˆâšùõË—€ŽÕ5¨•ïxœ: ÿÓc˜þ5ÈÒ€×+[Wã5´l8…[ÊòTýÚM."Á]7¹¨\0ú…x“å(¼•a¢Ao»?¾yà?±›…TÇŠG¯ƒ&t ï[Ÿ•@”ññ"~]¿]¾Ó0¿óáó¬´ªU?ë àVÞ.€OJ¯Z€Ôg…å ü˜ýmú“?_ž÷­;ÇÁE2çE8®\NA ƒ]W"ëúâÎB€Â_UUF-}ôº.ã6}_d W<"¶~Œ;_ƒ`K2û>¨.ã€A¡+#Âî"öÍu¿¨-Õ€·cת©Ö°Ähdj޽mX­îY )Ø¿‡¸€*@Só?•œëK¿8¨Ã°r„¯Êk4ôçžË’‚«±7/k™sŒªØIfTÐæ“œÙþœÄÆr颱`ºt¿Þõ[úÖ#î‰í­;¢(Ö”M®ŠDÃÑ»¼XIÒÜòm±‰]Û#ŒY-2÷ì&'üŒ¹ë c¯vßè¥_K>¥ê–|rÅáºîu{Ý{F7›éP5ƒ2ö/rÒ*‹í5žp„¬‘ P‰ºOéN…’âµ*ÚT`»´|ʶ)}ÒRxá“ î‹\¿¹—çcƒÑ²ÝÉ ”xy! ¶iߘC{ÛÊa—p×E«)Hb°ëÌa¨ähÕ7Zº¬‰&ë¸Ãl§e…^ß_Á}â|6ýŽìÍJR¹ÝL j¨3ª­Ýl^i>›‡c›aÂ+§ [í«¡°œ8ù’£²Tr™h:zŽ«EÕÁ™Eû wNãS·½.šítjŽ.s—SsˆÚa×ÅÐ(/šÞd“îqk+ý&üp.¤ü ‘\´Œš(ßSÌÚõfu´ÉÒþR+*¢ÔM&Ä’ŒxÔô,¶˜l^ ¨íÊ–?ÂWß½v8@Âíí.ÆL6ö\³8!xV.9"ùOÔ=E3¿_÷«ÙúíÈe¿€1M½ûÕŒrÐÕdjÛ¡`Q™ÛÃÜf !×6‘Ð5ÐGÏSøžÊÎ"ðà²\oU­÷S}ŸN…m¡¶ÀÞ=”²*9Pts h¢a™Ô¯ò×mG™U×?µ H[!›JRï`×­£Ôd§ß~ï <80ƒóÔCbÎG+Ä·1to¨âWP ‰£H´•^Í_ îËR s—9Â?èüVÙ¢è> :‡yFÑï Û€¿#2%ñ¨³ø~Ö¡> ' U|ܾ# ôCfšW/ }„*ŽƒSÉ€¢›EóÚ:K:õ(š?;õ§©4— Ur 4ݯMZKW3¥Ùº¨†úCDˆÜºãM³0³‹ ÈÇ mBøÓ<À¿,™}g~²ë?"4~úùÈè<è 00ØS®hN˜U‚ûáÈM¬ÇB!EŠfד@É\¢¹8IL>=v Ÿ-ÙQ?ÎõT^nFƒå:§ÙªÃz‰*mXƒõÎF+ fŸ)µFwãiømnSvL_ T/kÖ©]r ÍFº‹yH»Ì¡gúðW)âµn“…d'š[x!νæPÃØµ½€P9)ØÃl푹y×Aä( n,'É4Y ?‹C`±Ò2:@ä;imuÔl‹îiš Ü7gv‘ëZWi¤[Ù[ÍÄi]»ºÁöÂî¾oÄ+.8‘©,óÖtü£qT·¦ã·ÝÄ™®_$F$>uùM+$,>¬àFÁv+ ÒrЧö€ýÎCöSS•åÃø%$òx°› š£ŠÌ]-ü¾:Óý>l,£P(?v»‡£Ê7†òˆ¬G¡EŸÕ‹$:Šù&V-v¨›å& ÁÆå3Úçy¡ÒN±SÉ~¦äà=}’œ|¤šÏÌvœ ±ºË’ Å Óï)?Ä=öõTR¡Ì­î ?’ÅÞ÷DÚOË­20ذWd  \k9-æ*ªÚØîÞ½í+Õ+>@Øœô(Ÿ²g€öC«×¹G}K® 9ûÏŽ­Z¬|„ÛEÿ·™G¸¥Y솩\ôò†ë>FWóD[j±GJÆ–H‘ón¬BZ SÉŽ2·Ãk¥¦>D]¡›YRÉ¢‡ÅnÉçw]Tµ0V[*¥€Nò²õøveö´+®JÙy<ƒUNpáåÜYà„f)ƒ²2ªZ¨ôŠøéLÃí0¢Ø“ñ‡GÉxÌ—Ý—’W<À¿; ÷àtƒñïÇgÔ5­Õíût'K‘³û¼€`È»¬Ò%㈖§ËPËV‡íÎbËæ½”§XÃ{?…Z±8¢K-&3úÍñ[Éî(=¥»qG3 °tÜÛÕ0JÎíó°IÈB cUô/TGD¬²£Îßêš2yvqÁ´5:ë\"ŒKëgÛä/;¸kO ænêwó™©þÃWDdOnÃcw¯[™­«_ßÃOP«¤ „0„ie­^Abî'¡Z¦`¶š2¿‡Lb¥0¯;õP³]2Rj‘Ï–QdXf@ÀŽc©e°f‘èÀ×b[7!ؽ Ùçºç‡wô*½ê=¤ÇškKm…ê‘ÎmªOƒeJviHIü§™õ<íŒôΧ¯Ô‡ŒH+¥Z÷´`ÁµFØ»´»#M9:³k°W/7Šqu ºá­®òyùTiªÕ­íÈ¢»d΋ÎÏæk³Áì.¶U@_^e ptÁUV1" ‹Å¦ªÏWºöµÜVÓê^R–± cŠn;[óªH(m«æ'×ëdªR ‚#Eñ!ÌÅoæÍˆÃ`I´r£Ê• B‘…—<ñ–^C•=¼ HÕ)ÅÚýð‚ô½—}À;] h $þgzYÓíf¡sx[T•X°¥Z'7Þ¶xs§~¹AN’¹ÙÕnÜ; BŽ«ÐÒžGÕ;1ºþLÌé™}® C«Ú)Ë­6µ;Š¡®žEÁ‹Ò6Êæ¥I®áÜçJºŽ›ÜGîrýTi醪øfùÕz{‡×aów4ÛT“z´0!L==!˜ïjÛ·#6Í53’üDÛᮌǢÌs,bRJñI9£Eé« À±ÜŠ¿v¿THÃöÙöñ¡»Õìq¹0tùø–‰ŽÀZí SÎ!ÎCrsåVr³gØÍ–l盵k¡ÒŽ}Õ—þ(›Ã|Gf¾„¬xÎ9Äô™ÂòÎÎãMÈ£¢›$EI’¢—$…„E ¯ÏuÈsªþ:4‰—šƒÆ`©Áq8›+&W¢}µe7oÉØDª…#|íj;êD¼„u Ê¯Dyö(#pò ·¢}±Vö>Òí\`@_m®Ê@äËE¡©°Éê½°©9ƒ° Nhø#œ»³XIbðSZŠ|Ÿ®FõpmÛŠ ÁŠ6WMÃm¯Ú´íþªëJM³•$é¡ÙØ‘×ߨÖë!™Ç*º¹]š‡*º•ÀÁßj¤/ˆ‰¡TÕ¹˜6ä­ÓÀg—Áw~N}Ãþ;ÉfAÊ9vSÚo¥JX`ðwáš"C MlëÐÃo®VT[³kÝZQmÅ.¸ç;"lÝè€NüƒvMAi¸”lb¼â ‚}Õ=)éhi¸^m'Ži¤ªå»i*$ÌwÂ…ç61I<\ƒÉmÉ­ÁòU3‘uÑ))÷ä3ˆ,K“?Ç.³”Ùq-@9Øc•™½û²®Ë>“J¦ÝL)ÚèÉÙà á®ú·Ïm"$Ä1§ñ̯éÍ÷ÆòñÕ˪´!1΄¹Ui¡‚¡Ø¬‘Ïf æ½ÆÐ»BMÑîd»|vÎálFz„;â̹¤þœÆíš$ëЇ,¥Ziõ Ðh§ÃÇ`ÏJŸAìÏð ½5IÎTkt>%9S˜<2X†^ÜX¹-$ç,¤ï¿LÖ ÂÄ•­E$ÐÜõ„ >¥’ô9eDª:%WÉÕo¿æö/Òí€mùYw¼.¥1]‚OJ$Þ<à¸Õìëì„_{G1…Žø(&û7Ì]n>=F]‡g46%¾{k¡ FŸO|U¬TÂoò@¨‚íBוá!Ô™?ŽØCM­YÌŽ°˜_ŧÀsâ$qýªÄ€1÷*ЇÐÌ(¦|Èql¹ùu„@Ñlê«Ïǧ÷нv°T–ñ¤X1iùÊsbìàË<êº>© ò¤èæIQò¤èæI±ñ¤ýÖÏ7g±yÉ SŠwS‘þàî¶gZª½€ûcÌ’«gW*“rº "{°8gïºt àûTö` -[(ÑV|xåEû¡¹,mÕQ%H„iz´ã!skŒ¿`Ûlýq(«òyã¬ÓkërÒ¸Iú“ª-ì£á檛kA>ÇF¤VÎíRë]lÛüÐØUŽJ&œGÓ3dO‰EæIî{„˜žï¾Æ€Ås×v’…l-ê(^µ[ÁöT»oX–t¾\3?%w‹v_bЛêœN–5éÃËFΔåFv³iؾ ÃÈó ý§É*Ðò«A‘²{ø  ™úkŽ=E»¶à²PÕbÝë7ùÏíJ>’mE»OÊ‘qE{HÊ¡ù0Äó7-çåaos '¬ Ú„ÈJ^=T)v´<¡¾>ìÐP$ƒ…a!éí~c‰}Q9@̳ê÷[j¯êIÁØzîb¼”2/»—Áyôs2Q¢FL[¹uÁýì°ãu²˜1G>EVfJY'Pˆ8wS¸4ûl’”­¹!p²³V2{ÂÌÃêY«<÷!~Ø-Ur¤¥É®à4&{gY*CébkAc=̆…ý·"€t9ךC.×.e(fl8&W„pÉ5ð-•N”â­‘°Ð >*]©Ö¦§ C®ÙiPLÀ×?š­«Ú³ùx«Ûn¿ž^Q3¢6òþ8EdH N‘Ú'Y)ªö¸Å/EÆæHaÑ 6Ý~œy%éI§‚å¤S½ ã#0d$ ¤ÊªÌ•iÝÞ+•Äž&Ðï§“~Wc~A0P™èŒ> Q>ò~ÜñË6x>±V„ˆa½´“péu(Êú^ç*ÍkÝÁk¥VŸýWæÕ±‚±t»\ôZ™Î<<)|i7ÅE2AÎw_)Óaè¢ÿÑî)é¯ÍÁ=iÄþôA™?öÛEÉ›¢ê=:Бvð£IúªÎ54óŸ—íQÅ{:­"…¶«ÛÉ{+íùÜ`. 95]ÚÁˆ L"ЙÇVc7T_[£6v¯Íþ¹ðŤdQuÜ—JêÕ€>*ßnM2y2Äo¬šJw1‚ë–”ƒ Y†AbÏ÷ÓQ±ŠõðÑi¶ÝWüJ‡Ø™¼Ã¥?ÍšMÛœ®àxžÉ'½Ô&þ8hÏ)‘¢••ÍS×ËØBïÂíøLü ß™yºñù¦^¡’XEIŠ}€Ê]—EÂ&=Z¤DDIN¦4XSx³Ìq2)HQžV>£°ij1¬^?„&èâéîc—7Ô¥±-ép¨Ëôã„ãwtÚÍW7êàüÖÿ‚Qšœ‚¾pèã€.ɺ;]—]!Y„Ž\LU º4øÔð¨Ë‘ì$ÇR¿ÊFÓhÁ»jàH©uáµFPJl¢‘DIè$‚˜J‹¦M:‰ÝX¬XábT ["1¦"!0z j²K“Ò™sò¬Zp\‰Ç¹ š\c‡+I›¢Ã‡+5ßðáÊA0<è’ÄX:<è’œ7zˆRÖ ý¼Ýû[AÚìÌ=>·lg±Ó7ì]ãkƾYwëÉ“…YQ­`ý‚*%µ‘÷Ç£.Œ\)è‡ø'FbESþíò¢£É“6ùoëÔe’‰è< ŠÍcÚH–¢c;;ƒÞ!Já(P§¢ûvÔCôñâ²k ú¿H;æY~ñÒ·r¨h eGå5èДÖKb®Vÿô–F߫ިÇL«Ä/Õ×"!ÎÂÈWÄ#Œ]^cÊq„ù@wrÜp 1.I‡Z*÷È“23àmÉ»VàA±4Áº?BþåÊKúUã"T-F)σ  t”úqühºaâü4ÁHFŸò¢ ÇøžJ4jcÐ¥¬~^?Åæìp JIuNÎ?ù×¥3>L=T)]Ó@cGô“G€ ihçA'*\ ÕµCK¼)ØóEÞ Ð¤¤ê‹Àbµ-ÖAæ”ñ}§ë £>ä§×éÑzŒ4nëm|¦è® ñÂÜ®¤ /¬¿ù´Žt >þØ;eî7âÙaÕúœÔ¼‘ÏþgÁü¤D™Û¾/Ù5}_M;àútã³C½OGŽ‘ñe—- ÏÍø²Ë žŒ].[:AìZÒ˜ÑênG2¨B°],j¤Kù`¨|ÆÈàBKh’Ê-1P­O…üü­$_gD˜xH: šhs[ÖøÛyã?¬a;‘»5'OþMÍ´jÜxg ¤ØÓ¹ëNSÙq!b´ï±;¹QømÑZcVL'¨…ºîá"Íã³™c!LÉ?¤‰½µË¸É—†8$vïÕPíÎ7ø“‡Í¤ ¶\÷jPݧs ìJ1HR²7ìÇg·j7ª=HÜ2N#š-† LÛ`Ù{VË/Ü¢q&1MgýÄ_Ù6@°D*ØŸöó³D¿÷àL äwRQvË` ™d˜e-±vj°knWyÄ0c/1¢Rä3_ߣ)|?W9>>[OAã jºssmhiª¥ïYÝ[$¥àG AÍñÙô‹©›ú±<øÄ.h8)$`Gyfþ\¡xîá¤Ø/erãñëÀ:!¬ÛYÜp!CD—'yñ­öëIÂöÛO(m€Å‡Òæžñ-CÀ…Ã=üø*çãñëÈ…÷ÔEá÷êA2b€÷æ¿äàÓ YwB†Îg{øQB¶g€‹Ûšdi.m¶ wÝܵþÒ¯ Ï4»ÌkIíZÆ9Ò8íÓV\"÷¸=5€Jd—/oT"v|_”Ü)#-Ê ³Ê8,)™»øÄéð…"÷øðtwF…æAnÉÁíœË1 P\„¸×?J(#ií1ây X{E­Žâ í” gðK >RŽ £Ø›ñÒé´Ó@—(ÂRy®Ä²ãÔŸ{*·û2ŸÚQ‹±=½O0É‹÷m—qê£ÑƒT)# Lã©øœù=5]*Öi¾³23?Ï ‚˜Vª?I.$o ‡­Üòx]°ßMcvXéG ûоQovñ0· J3d”Qtz³ÌïŠ2ÚÜÅI]‚;£–«†âŸÝ7HÀ~€`–j~zàò  Oœ4¯É·\L)óO¾a󳓯Pº©:ØX? 8R1ó$š–»;ÙJ]Dσå.ž÷užN,çýÔ‹é0ôfÂd«sê2'Ÿ¡£rI²Ÿ¦²MwþHc$±kïoÂ&aÁY:мOX”ø} ¸t¶¬ê÷áÈAßG±Ýý@tÛ.¥ÖüYýHð+Ü®â(>Ï2ž¯9….bhþÊÙ*ÁÓF øQ¢“Lˆì Œ‚z9GÊî°ërŽ 2X™]¥¯RÊíÃ’gbt¿~ÕîèhâF ¨K‚&èùa÷äļ)ئ@)»ˆbqráǧF‘cJç¯òTGãG±êf>Þêß3@Ä‚­ú!µ› ª °ýÛæ$9R|£Ì>÷¡Qæ eÈÈ‚Í]¥º…=¦æqÔýÅ ŠH•–ÓtÜ·'ŸÙpÈAj”¶”-LÛ–q#Ðï´Ú²v0L%kÊwÌ×é­±Þ‚¾{¿xúÄn•°<ͧ¢O…ò’ÍòdÉÑ‚s•xö~KhøéG¯sx"WÊJöÁò­e•%þ~¶G#`ú]ÜLl†ºrãHýqBå¡û­¬toÙ5[©ŸåSìV³çô“xÚ±ø½æÖ«ÍY‰Qe¶IÜruˆ@M‹»-ÇkÞˆ6¤I!Îׇ>(.Ä­ksѽSèl(‡i¾ë`¹‡jq}:=H#ª¸º]Jb”ï8˜-Õ˜o¹iVg¥³öÇF}ÿšls )5¦„ujqA;Íî;Z­zHpvQ—ogÀ²¯e×ç°ç]–&?Œx³Û³NÁ:Æ¢¥¨’EË¡•uém¨ãƒÙéßqmÌ…ïºÍ©5ʦ >wêkÓr·RØ7 F¢¤Câ=²àK‰:D¡²9S¶¥Ö‡š™ë rwnÅaä´Ðž+‡÷™¤œ_¿OQq’ì€^Ã_3xœ»ƒÇëjÐP¿¦Ã§G—ÈS}o¹DÊÉ,!N8d²$0Ž„îOÆk˜ØËƒVJ¸ÈñT3£“¥8v;>:gŠ ÿQ¯ÃXIÖ£‡3…Ë…kâp¦ÐЙv֞Ͷ½¥`©_Ãw’O.d×êÖŽ96§ì8e1]}þÝ)ØË©ÎJt``ÐÕByW..i@àL$$jI’Xh¡÷ï ÿ½¹¹•…SÑb+ÑÅi¬“–‹ãÀÑñµ{tôGJnÝT) ’”Ï`w3I‘H7B÷çÔb›˜Rýfp™p‹k @Ÿ¥yÄÕ“¬[$–0G -ʧxžýÂlEÝ<)ßvVñïÀÅú㨮gkˆíŽ›®…Õ^6O-4ó²÷1šq®¢^®æ‰¹·Û%½ŽSf~\… wqeZ•,Z¢™×="|å8å’Ýñ®¿ ïÕ&–¿øòÓløÈX©Š•© ´¿N!ñ}õ¾2Ÿ|ÇP~:_¿Ëor—ð]toËôPõÛ²96ý^ªveðu—¹)×ZªÀH~ö³H–¢5‰˜¡T#ÖwÊ›šì§Ïhíl9A¼Œ,ò¢!’j´³ ®”¥bAéïê’4•T'Z™gñ©Z ¯»Ö¥¥VoåUyמi§‡-ÅÆVÙÔÜ>ɰJÜñÀAÐozïßÕJ°¬[O“! Éú,Y*Þ×A@âöê±ß?y£\n!÷ËÊÏ$d­õóºéÂ屿¦eT ÉêjhÍö°¨ßÃA ê-‚7Õî¼âöJƒÝÉ4)qq’sEkù5›fºñ¹ná„Z\¹2­·èSK¤ýN¨)"u”Ü(ÐÐÕ O*äX¶bf¨ò¨á‰UJ5H6âQud)øaç-!Ri(V—J®¤aÑX÷ü‰_†Cù* è|-Ký¨M"FÁ— ×Z)Ÿ6_ ç-)T´¶ FMGRúIvÅ.èA¨¡åö˜Jÿfm§?vc§­¦hyt+ÿáýL ©ËÐ+öÙ#–®³DRstc Þ”ƒD×Ê4Û0¡h“mµÉ†£Û©!ã¹õ¦‚!Óõ³šþVÆcT0^Eû6¢öµÚ*Ûüµ“eÊ=šSõô׿éý|4¾Ñr,i–ª¼OÒMñ™†ˆñÄ<­ˆâMWËG«m8ó|Üny®È‘Åê–ä<ÑÉjb¬,ÌmW¶ÆYY°Õ»uÉ®¢ž;EIì¢u³@Û'â$uä)Jzõä)Z©dÖ§”á°½·Ø_eÓ „!±»œÁBHVÀq—X—wŠ6ëóåN±¼G(ŠL|\A“êÇÒ.Rÿ vד°Lã\…(ñ?;:I â”H$ɉ6—y§-YSÄ(,,óZl‘@¼éÿÇádÉÉï¼£^(yIoµñ=Óß¹Ťº=oÊí®mä )À´yäJ#>¦]šyºÂÊ=û\­qòbÜW0’´t¤a9m®¢ÝworË” IçUÉÁŽ’ŸíXácÊ•9][YkÄz0z¬„~GßYº;›/Sžÿ _ðS›•)_Jƒ­íæ2Ë•ƒ=®æç¸UÆ´qéÄOZ êÒm2è¢ÓÙ“áø4Á¢Ÿ/G\0£ÚaĤ\Åã'¶Ôv¸^D¬ÆXuU òT}^ïÈXTë~6ÐÖöì)ÊâëêÙS”yaêÙS´ÑAqÙS2`Ĺ?éDÝ:éÀš•©êÀr«î‚…Ìf!}ØŒÀ€/onqAºT–G÷Ò0ç—Â7[÷”EäÀ¢,·\¶_ò[4æLg:7TX*¬þ¢€à¨xÀ¯½^™ð’抶j³I3o’Š’"FÛIêlÈzH!ÆZ…ŽÐYy©ó¶1îÖî<©"ï}þÚ\â‚:åe+§w¥Ýr5þ3Wàˆî°øx÷«Ü(½±Q*¬a°:Qš«ä%~fý,V»¯ŸÅt¹ôäg±ÚÝ~ëåôy³U{Oý‰ïÞÞ‰.0Ô8;¯¯£“=Øy{ÄŒG»3Ïzá´|ãæŠbëÇyg®„"€ ÚOŸ<ª:¾Fß`ͦÊ&—" Xí!¶/@—”°t8Ÿ×º´1óöÏ``|îîÙžífsç­Ë+Ú,3íXW.Äøb~0”ÈÖÛ%º&1Õãé2”—ì+N*YN´hÖ§”‚?ƒ ÉL­™ÙË’wäNÑ^ü SÖv/ñ˜!¤‡NÅFœçVà7Ö^€ ¿_ÓšÔ¦"òòM m>Q^¾I¡ Y´Ñ^6Ÿ±|Û*[6+ѧbM{ï'_ÝvhnÊ~ ­ƒ»øÙ¸:㿽*£JPas¥c¿ÿ²žttîl¸æÜCkÞ[õÄ«ef”}§úàt? ™ {ާøã÷¨˜^ J•| ÊÁxªEý)Àcµ¥E“Iå;úîvû‡3ö:Åf?Ò¯0U,v~ÿÉ.g/ŽŽ>œÁ[‡´¸éÁU†ÿíÎðÉšíÏÖb xšœ§¢_þ0z?ÐâJ§*Ò×ò±ÉjÓpžEHwiÖ 6ëšåÓ¥ÎïíÔ¯ZyÝÑeÂa_oüGV¥î¯a…˜’áDûS ’’®5Œ4"2Æ ç–¶'|ÙÉ!æMËNŸg×-PL.¸wJH‹ö‡U¸úÝW–1ßuo`vgꙤruË•L:Ò™Çîåþ`€Ç&•Þa¦~ͧä+>Ü¥v‹lœx‹Î\šûÖ$\ùŽkxIPòǼ‘'ëL‡D_yGм$ßøÞ³ÖáœxƒÂrW» ¦3RÍnŽžÇ’i>Úáªþ(iWt×é´Éž9Ý^:­éìl¸¼Q#â›ioßi9ð#^ïÆ‡õ`å"géq7Ɇ„®ôfå­R‰º'Xz&wΗÂñöÏ>¨þ&²B­þëR"•ŽònÄà0¨c{|Èj¢ÃÛy$rÑáQxŸ+~úbnd&Ëp¨ß!I¼òÕ²[bj$KÄ}{´lßRkå™ÒLÏñ®rŠw¥Ò.¶ÆX'óÛþÚõ›2á›9„î.ƒG&Œ‚Kë­•§õ­£>ÆeÚ£»®Ùß•u4?¼´9GóÃ ÔæðÛ)ùg¾öŸÂU€´ÝB;–0nåÖ¥cÙV;#5>G&E`ëùJSãÌÅni &5Os@&¾’óó¬/ßc$+wË­ˆù嫲¯´>Oy¨cØqo”+ÃÇÛ};ÉU‰‡¥Î4j&Û¨.ÏX‡íÃ0ÿ@¯ç[¯‰\}Ôè1`Þ¾ŽTŒdŸI0lcYb:h“Ç%Ê”¼p_FÛZªT–N~­SÈ',°8¿Ã-”ד–0oÚô*6t´Gœ¿€uû• ”?óÞ¿#uãdž¶@ò!ÃÚ¾´Å“…³o3l\åIµîù‰H7WÞ¹’þK#» 'ùd`!õGÌV™0û¾ãÚX¥.àog²£—jM^f {¼“ä0ÒÂZ’¼oÏàÛ/ÂrÔ¢.N{Z?œq]-¡b.Ÿ¦ïGçË­3Z5š2‡©¶¤?:‹­µ'j¬“êpO ¨kôëëá&¥Û‹6śм»ÊZ^ŒíFwÁ$Ðrîì²`è 2®BÆ•$â¯RàNŽXœäÉ‘œüä;G’\:]!WaÓrÕIÓh>¥ÆDèLn‰ï´mhó n†ÂJ«›%@A~àæ`Xùú CÎÈÞ<Œ18ÖÊôþ÷\#Ëw2»¿Iåq0}8ó,‡Œk¬Ä•)ˆŒgBPHMÊ¹Ž ÌüÔ2`ªòw‚“s&ç’sYmx97™Ã0½œ›Åä\+_š×«IÔïïB]üI¤ëK®¯›&>=€5tö|°®=ÐÒË•#rýiQ>Î@_ÿwÜãK5nvç ±JŽL¿ßÚÕE°¾©’É#IG‚";‡*HèÝ7ÓºdÃSc1µÍÒq©(iO¾ãî.ÝDÓÙr$*Öém¹I;Oq£µ›.Ÿâ»})Œ›ÎRõi2“†’ÒÙŸ§»V«%RÉÙºâh§,Œ3‡˜Z–ÂtbJ•&—Ÿ¤?Œ\tŠO |, ´t½¥„›Ë±Ú¤ÚÍoDÉL²éòÍuÒœêd†™rS̘&3t0¹ŸóÜŸh…°X$Žœ½øç¡ªÚŠ3=Sê1£š¬ ¶ÓÖ_vBEž×X2%JÄïÙšQWM•.']5aÕ`‚± šeu‘WA f÷!#˜KQFS¹¤…68Ã.Œ¨þÌ΃Äiý„@ð+¸QXÉ@¦ßáFKÐc p{ûN›~, õ>x¿Ã´Æâßß.x”RÜfrU oSý‚$å~šçÎ3$b£EƒtE ßób2ñtk:HVQŠT¹[¦\J+¶ØÍ¶£žŒ_¦€Heæ1Y†k\1ƒ†ˆ=ì/øÅòð›\…/ÅÄÏM®²¯ƒ?f艕Ká :‚7\ROü"1~ 1E¦Zå”»Ì=ª¸À:D,f#¯R„ê%ðªxây´\t ®U¶åûJB²N÷¡„óu³z’:hþÓ>£ÊY+V¬¼“á©›ž@ëá9FÐÂ7›Fôýz¬;´œÈD.\*1eœÔB 2§M­²ºÅWˆFâ¨cM$Bî .›OV.€ªž¨ -ÖI=±þï×f‡^Ž%´Dî— ‘Õ_Â71Ü–j¥ÎeUB`umüpò^–QvvE-÷ƒnÚ#¸âYm´ã|½ÈRªÈ”Á®õÔ›Bç…ž–cÞ#©¿z1gªa{ kt{0)bA Öcu‚ã#{{2/¯ÃÆ‹ÙAÝpG £š§÷ÆD5{/«šåéÇ—ä³ùz11"vÖñbb–XÓñbbá3®j“5­˜>Âi}ˆ‚ÜÕèn˜éØ¡K¡s)?¶A¦dËê§1ƒ¬™LbVir“"ß‹¢÷©µ‡T)QžfqY—@Í+­2Ý B•£ì—VyÚiq"+±»¦ceèëI*ɪ>:Û«ÐÌ+©‡QJ7jÌ]œ±Ô¥’짺åÃËÖ8X1C„ʱ™Yo·?Öd*v=ŸT"a§qË|§:Ž6ªÖ_“I ÜY=È+ðv3E‰< æ'øUp\»[± õzv·µ£”ꜗ¤|I%dt‘¸ u/ö·aó§w\"®°þÜ‚àxiÅkäPÙÝ´ºcÎÖæàC©å„ûòÊS‹fš)À¥µ-6ÿGÁ°› ÿh£ñšLRªÈ~zë³tÐ^ØÑv*²Û` -ì²²ÊèSðóê?J³t§¯K´Ý¦eÝrˆ·mg_š=R 6Áž›'·' iƒArzÈ.¹ˆo#Ý×8"nUZNi>ä8~wn"µ°û°b’¦8Ó0U†ÕNA`¹ó%Û#Õ “¦ÇÅQ'CtöÉî:÷ SÖçÇ4ŸîÆÙ Ûr‰Ùå %¡œ†¡0æ`"!¸•ìgè´,0G´9þ§Y¬E÷6i~nõ“XKXóÌÐFÍå0‰­Ž¶Æ„Q´Ü„Qü:h°ÌDËüÌY…-}½;S¨Öt˜zr=Åy –M_³oÁ(]ª.Çp¥–Ü6R)îê6ëj²c÷¯<Ùä̺¢v‘3ë¬üy Q;Ék÷uŠ=ØTZa-¡^_#“)ØpZñ׃ÊÚŠ™¿’•Êš±J¶ß•ü‹Ç™T©Õ-ôÜ—!'ÍßÊ‹/#ò=têWÕ¥Á¡Ó)w•^=p©Ø£³5Þ­Øöla´ì%Ú°‡¹èmþ TÙ…JõP-Óïë|Tf»ÂÙ àF™ N‡_|Áéâæ¶ÅÜìrü° Õ-fèÕàC¦ù (V,r%.7œ_—Zø4šxÍP±žt‚FË]òx)Å`þ&Ö™½hÔ‡(ºB@}óÖÃÁ¡â« …_ó©èE8øh'üÿ-Õ+.㿌lÙ×( ›“}æôh^ô±VfjiÆ^«ƒrÂèŠtäP#ÿGÜÆ(A:§ðq²V^kŒΪåHÔ±E2µg2B ±ŒOqÜðxs³qÒ1Q—½Ðn‚9þm¾“ûŒ77€ÙÉ}Æ'ã­^寙'ß½P—Íc¾-¤U壊À±Þ-[ùÇXËLÜs3 œ(wåZÞ‰_¹(†QmÝN~•´F@:1ßâ¬Àƒ3º4ÈVÊ~r/æZ˜íÖzÅß”5ìÄãÖ¬ž&î†âÊ?þ¿>êž 6¡=‚D*oLx÷¢jŒ”¬¯eWä¥YÓnQ ½vM { “}›ŸÕFôQa€sãÌ®~ä„4»q¨ºÔÄ8ý‹Z—Îòa͸o³Êþ”OJ‹ìÅLºÝp~È…yOÏ8]ôgµf|YÌežVÎåÑËù…»Ÿµ–®Ðo-ÅV^Kˆ'\' ,6­ ½Yêô8Ý-†–hCÜS2·c}Ôœþgçµ y¦UGËù”¡t›ÇB¸Àžä,êF›«m5šE.‘Ĭ[uP‡§*Œw[º†m”9áI[ÍË\ÆÞû¶_Û4²m?§v‰ÏðóT¯1Ä9s¤­€°‹25[N¶b; ÏÝTb¦>ò»Üº@,c1ÛxvsÄ€‹½xhjd&<šžÑ -ì…G§þË3”Àyò}²c Í9‚ÄÊ©';îý‘¦ÙãµìW’$õ—ÑõéòèÖÞ0fœÐxt{f§ ë« -¼%uU°^ี¦w6пvZâØž=ÜB·GÒËÙ¡×2ãÞƒ…Çq‚ a-ô¾v^¢ R¤^giÄ¡eî³ôÑ¥;eÜáUÙãD<Žv]£´ì—Kl)Á=;“¤g;É™$"¼?DšŒ:·ý‚Yì·r vè¤Ã_’Õ‡>;EZ·ôüä[”h"òö0îáß%0î¡ÅŽõ½Œ¹´†6úV2_µÄ%ˆ§un‹ý¦ß)3k|ó^íeÜ{TâÑ·³³`Ð\r¯úN'„„VûŠ…zõ“bo1›5ƒ‚öê`Ç’²âh€×çË[ö‹®zUUÙ¥”¾îloÝ~B H–«þªê¿™ÃwàÞtU¬oüÀÍ!Bz±&êFV°!›ëyÝ3swBv€šƒûl&»·¼H«Bï˜õ±ÛÑ91죟üYfAŽtòÑVnä›*ÔmöôéÅîm¯… Ÿ~ƒP?jDvZYGpXx¥' ÷±sžàŒîP-Ý ,~3 Üs”*è,‡j<#̪£z­ÚüEUõˆªúnAáÖçî²m)ÓÙÕö¤ð¥ê’ZÛffÑõ¨»uJ‰>W+­ŠÅ÷Í"%]-É}dcv ¬‘-ìžžÞrêEKøÉ!-\Õã¢ëë¸è”‡P…Ý¢ã°ßjxh½6£ÊzX3Áì™à•g™ .”p= a¢LC²•Œîÿ†Êó~4—J=(7§ÊÝùGðtÒ(A‘£ë§S»µÈµ&Rx#™(ÞÕ †”kæÚKDXØ/¨!Þs2•hÿ j;ãÖ~Å^opJÍÖÙN¾Å†Ð÷{|\,¤è+dàìÊãÒ- 3²4‰^N„6Û!2¨È\Jþ¾üàådC·W+öÀ't¡…[ÏÅŽnëEVþåò²®N¶Ÿdh4Ùu‡-ÀšÖİýÔ|࣮øÅß®{\¢ƒyÐÁ<¼)3hHE×ÍVõÝ*"³ •ä˜ûû –·ÁäAA¹Ñ5@\eã)þZ©Ú´3Ь®ë]£Y»Ó†øª)¦ŸM(•m×ÚA‚bzŠŸ ¶øßaLe¦mmÏÊC^Ï'ÐükÓˆ,=èŸý[Œ¾¡LôT–ñX+ƒ,bÞ¯È⣋W ¿GösÀ‡DüÄú&ƒ¦¬Wá=œcUb~>~úÁ¤‡z ?%i.fþ`¤tŒ º1_Óc)ÅàQ‰Þ²ÝëP஫vÒ i1„ùk–Ç ^m> ;l–îØÞ°í9€Ígš#V+ÀÀÏ2ŠH†¡7E:쬇ˆÔr¡ú¥1@N°ê["cÂÀ®—´àç*•&7嬉£µä†ØNa5©oÀÀþðÈ3¼×toÙ̚gÁŽé±!sqzò­¢% ºÕ¾jÃB¾Í¬€Œˆ†cvP¬O0º,˜Óv¶#7»4o0eû;njW>åÒ°dΡXZ‚‰ìqßI7±©¹ùÛr2|“qêSVt*%(á§Úk"%Kšµøwä“«óñ°DEšÕA-&åô h– oã§€$ÿ8Òž§é³Â'H´ž.“åÂ窾 ì‘j¸ÖošÌO£Ø¯^ò Äð 3†¢Ù]ü¢_s¿&øÔÖïñtˆM~k‡—'âôžÍI#aSƒØxQ"Çp2fW±*´÷æÌ‹^Ugñ3Ö˜C‹«1‡³Ô¹ýcÄÛà,ÿªÕ€(ÓB“{´~ñë&± £G5üg< K“¤°Ö cŠí#{Ÿø\·>h=ªº%ÝÜ[¤´y /œÍ1Ýú´?ýÛM?ÄÝÎrûC‘iN·¿Íjg­¹l[ÿ±ÝœÔNl÷À›ÒîµtN‚5ÕÎòcM¶1`REº±ï4½‘W(¦Õ\ˆç–òxè&#|^¶Sï˜< Ÿ§+“aßcÙÙE®•=wGþáŠÆõÖ1¿0¨éžD^‹æs- {[íšìè÷ î­šž@lâ\)ª^[×µ5­×Á¹\îšœuªÉNzŒ=jô†|"j3K@Þm׉QµÞ‹‘Š7š«ÈªÉ¬Â%#âaÚÊ ¤‹`9‘¿%é´lÆóKióý/“z7ôú“Ò¼ÑcååòîÃ?9ä\‘UYÔkÇ$Z©}o%J¥fçuSÎb¹è™õEšw#(ãys)BZä‘Zr ØÀ=yçâd»Õƒ/ÌÄHœ¸4C"FøÇs™°`;Îì™´”™b/[•ÕöàC‰Òòô·­vÌûµø}ÂeBi «!2­Ëê ÍJvT:hâûÆœôÎ29ß±¸–fۀ뇭'Y©·Y2¬P¾¾/n½iî®ð”w_£/Q©Nº %òº¤È¾‚+ˆèNþ²IhfÙ—é#‹ i [ôñÃÓ`=,[Ú€R ÌY°Ñ,§†ì«õ±Ìƒ+ÙØ7½sHiw#ÁmKÔTÂmÕâ:˜¼3`ƒœ5~vÛ6´J‰$¥¹§Ñ$kyiÿK"áÈâÇÂ^a8ŽÚŽ6œãÂJ’èpŽ -vÖÚå®6x«p.À•”(å¨[T³kôp•Ø9K ¨b.¾Ò0Ó¹gq,bg]‹*ë…މ A…Sº@Õ›{†×ÇÜ3µ®fc Ü"@o†ìÁÏÙ__îlÉžwT 8ëÇMɱáUñËŸÂOwX[²¤K Oc}@JBÐJ»¬@Þ4Û2ªxEEHÓÆ70Ä$%?/Ôνu‚ ÂTI íqÀ"‚%ÇŽèl{H,$IÐ;;TØ\‡±&øEBÒ .hƱèd7êëE¡&åXb y¬’«Ã1§ië¢LÌÑp£#¾K;†&êRÌH-ÏHd ä³‘ *Ôç{BGýŽîÞ sØW ƒÀ,ÆÝÞ@jíŠ&ÞSW]H <Ê» CˆW°{r·윋ÿ÷Møè,ŸQ=þVEˆ \¬ Y.àütØ]aÔè;îÑ-üB»X_¨ðXýð^Z¯–,d¶‘T¯–, B“Ó’©BÓa缤ä å:!'’Nl¹uV‚wNP!«‰¤º{݈×JÍõº‰«m¹Îq©× à­'å“ähXZµUuˆ+›¥È¡~Ï‚‘–‡4‘\áG¹Ù}O9èÝrãøu?Êÿ¸¥Q3óžZìàÓ(&-úzG¾ XWFq !ñŠ$cÜ£c¡„8FÓží¯î š±õŸÀ99%1¤÷¢-éÇÕÖvn5'íXÙýë«íXŸ*•ßɯ‹f™Ä}-sufð}v@/[!…Œ¤~7žƒÇyÑMBRIÇò%`ŸI?áñß¶ày"€P°»7â>°~–Ú$ óM/Ë:Õo†“¯0÷œ°m÷HãÇOö›UOn—šǨÙ/åK9ÂÍ Š9-ïá2áqkÁZ.ÈjÝpÙĉé´gœ:`ÜMc Ïâm±'”‚’"’kK\âžæE$ ÌÄÄ÷èæn è§4ô@ÔfœÆ ¼›‹ï xY.Ѻ̪籋À²‹%Îa}•>µý-TV ]™Št<¤ï1“W˜xûóî GÞ9;E¸=‰svŠPЊsv Éd¾¦ÇM™9§óVx¤Îˆ,AYÚÿY Àµ~ÊÌâé À‘°‘1% ý¨~¯`GnÆúkIË #€ã_ˆÍŽÝ½%ž^i2Ì<Ô‡Æq rÅÙC€…=ë“n#…ÏAa[Õ× ¦ËQ2³ÈbfÁ-B‘#6óÛÑý<ì¤r[¡iwf¸É콓ÙkS ÈpE¨ÊopîäÍ‘}ÛkøýM)KªÝþIÆËL¿·Â³ñ©$æ¦J?“8ãÛ]f%/±1ý¤X˜³Z¯§ÃiÇ=¡I‘%!ÌÇ äÕƒõˆYðó”šažN‰ÏhcÍ ;ˆÓæU–É2S3h6QUþ6³f 8ƒÓ}'óTŠq@…‘ù¤^“ìß{ÝtÙ#dtÑnHbÍíª0¢€*:~ǼóÖÓžaH„ùºu§î7\E]úw ª­¬¼~Ø®sk“LÙÙ}ß;õÚ}Bê>ɱ`kð$ŸÊ$àghûT«ÄÔ©ÝÅQÀ§,䞀¾Ç`øUˆ¦€ør²ì€«0ó1,Ál]—°Ñ5„¯æ7—·äìO`¹­»]ºE&*S|í_ø|-U[¤9»ùEþ‰ ÖN'žzÙpkr6¹dʸœW1âëOÌ%o­*g{’ºGÕK¯ÒrZhr?/ˆ;-c¨(kéLƒ¹”ãSËô¨d ™SmµúF».û.ÅìrÚ‰ã6þx…øaiá=©@mš–Ubåå8h,° >MNÈjQýZýCÙÏÐo«]Ýê3·Ä\§Oø6cæCf…ÕšºŸÆtŠW’ŸüNá÷]µNÒ´H¾%,=Brók¯Ù•±Ü²ÿz¹á’ ;Ù…l°Œ)å)A÷Üíèö&L.”oÝýãÌï;dWàÛ³ !H«õ¹/«ÔùyÑÇEóI¶‚ ~©ÒדçÜYÖ×ü¢NíˆÊÁõÈÕþt6x¤Òlº §‘¼EòpmkÉÃð$z&?|·/ч)`^AÈ̽%%˜áç!o¥ä;TßꙨдh ³0ó* ˜ÏR8úÁ±öfF¹¯o«º¬t°kózú´NÜ}¬¯ì|@x±éS™œcl!nöÍI¿‹‹-÷2­eÏl¤ˆµq+%¢É…]€T[›pÖÂz¸`ÞÛ›‰9½ÝVšå‡°Å;ØäT"²ÉÈ®1b[Ȱ³œJ‘ަ-3 fÍ^3³Ÿ|‹Í³8ìÇ÷Ãz57Œåܧ6‡V7_ u¾E.*…b¦ˆ3¥ K,ìA`!‘ñI!iVKýúðìb‚UË/sÄø Ö¡ß2nZ‡ÖJ"­‹’Â1,ÞßIô”\Ö– 8ßÃÿW¦Úº÷^é{KJ€‘EZðé|FÃÏW|¬Ú š©Ê%”Ô`y ®QÇ}¥”Cã™ÈÆ=“ 5)Ûi #ǰ xáÚ_NI†Ÿ?§˜X»%bÑ_4Õ-ül¼3›iC¶â¿žV¼@*nÅ®DÙ .BB©'ŒÏ* O#üÔÓ×­Ø™©ö5/QâŒO¹vg”…æ?Ž()ÔQŠ9¼CNAphnvÃê7iÔL°&o`è`Þn½ Åž4wïas›È£ú’»ì“{Óso)KY"$n‘ê¿É[¤^VN™Q=ì-^~ÖÍÞb½IvùÚ–¹›QŽÕíú4=†çn»Ï@|·MZ¶àéS¶†g]GRÔ¬¾GíFBΰÁnë,«V06PøN~[þù¥Ž“ZìÙn_&͋Բ‡šrµnÓo‰1Yµ·gK]nÄ;ŒtdW—V²´lŠªd׆”€U!¤ÙX¸vSwk¤,ƒO ¡\ÇÜDI^¯óU‚ºq¬/Jè2ƒ_ÏjÜKmÎbdWÎê~?Ã8xߪ7EÁ߂ٸt²³x¼’TJ²Ú\Ä„ŒR]ùTŒdS˜ÕÂNzóþ­Ê¦¹6*¢7¢qž7mÓèÑç]Y¤šØÞj0Ä{³÷íþÝàü,; _»=+²_t /pÜ@BT/IIë"Õ%³Cô³)*Qè€o§.Öë'\N›ÿ£r©Ÿ=L'¨clUú©¥Í‚‚8á UŒåÓ+BdO‘º;…t0Rç&7E±£ºÉN턱¥·gøOó÷í7WK@áuKR»ˆ'r‘j«Â¹nd¹ØD¿@=õµ2bãµÜäìf³P·_ ‚Ž2§|ýFÁò ªÚewRL‹›»Ð°¾Úh{¬ÔþâÌø’âÆ\Åß¼[3ž³ÖØÀeý­qG©/H¯9¤ÙbgÛ©1p5á[ŸóÒ÷³:^rÉQ 2Ñe§Ò#íRvZ iaâ(üØŸŠÌÌZ"·>!“ÐPóð™JÍú.ky€Ÿå³ó½'¥ÉSÉGÚ:Õ™&Æj‹fÆ?l¾=•@¸Eï®ÖÌ;Ù© ʘðxÓ¡Lo{\X.©8Ò¸ƒ?±´õŒFNãvæ?<Æóü ¶åé©©T,ß*ß‘lcnñ’Ãì¦VÜVAšÙô-w«0b‘’èhÅ{åøÀPj¾!+¼ VÜl&µW•ý¦´»ƒ Ï®tÞˆÛÐEi«Î4!ÏË×äLR›ÈÆŠšVcÏÞ8DsôÂZ¨öEtM·ïHs|šÙÚœÿÓ|’›Ä…¸«ò›]gƒíE ‹JämCEgÆ5š?¥Z¨cá(͇9Zë +­Ù•O¼dÇ1žRzçÝdþ¤ì`›¡EÚ­¸·à-Á±Fá³½º‘Ñ\Z¯áQSýæÌ ʉ&›øiÝÏÎ>c513¨u·9“{FÚãzÇÃ7˜Ém£|“% ,ýf´æ“kÌ,Ð5H²‚²EŽJHÏæ" ´nQ&k¡x°ÑlÛÍ´„x{ ;v%ññí§øæõ–ˆR»ÈFƒ[°HõÓöìËö%€~ºäóXm"Yiöq§ï-Õ›æ= fk¶ã%ç N®7ÙÆÛ¥Öµb© vƒö⟥¾ØÞ2Ðil¨i)`vm,Y†Êê5˜A!ýI,6Q­®K{„î2Á ¸îší ½*=ÙÑ/<µ‹œ“«ÑíÉKµû\" !mìD³Ç"†ý-ƒµöúÞhÏóú–îÏU`¤–Í4Ʈǿ†P[(¡œá$>çÕ쎚å‰xœ»;GõýÁËtGbö5ñ¸] in¾y²—'+ qy¨áµ1M¡aMpök ÌJ?x^ÈwÔgå1$| î³c!³Ìôbe=QD#E“€§Efñ€ŽhZšy/v¬þ8\õ:!©µt—Ú.éøeÒË Ê6/zó~.¹ôÚOø´º—  “ñƒÊW‰¸øN*wÀè ë7ö§$}CìiÝ·Ú%~ÒU;^éKÒ~ÙÛNÁ˜-Á*â·ˆ©í Lùê3¡ ’‘ìþˆå»nmŸæºÛH ¹êjN×ÞìY´Ö±ÐG¬øs¼üp®k–fEÊ‹Ÿ“ô wûì6uökòƒZ·õgœÃÓ/ºVÌß³Ù\¸®št,™NV.fÆô…%cn8:O7ÕE~´`¾©£ÍLɾ !.¥FAZPK><ßm: þæÝIgGýµû^ o˜³ˆQ;ñsíq(rÄqjŒjÛõ6ÿ:eG¿š˜w1µi5ÜF}Š«Ñ‘ÚŠ±Fov?zõ²GÏ›}ÚINà (ØÂ¢-Ætf*qìË}¾0=別Ë'ÏŒ”¬ŸZ8BJ— ‰ ¸þ÷càÈÍ…Þ;«= õçÔc ÌñþÌ.&Ðøëucl/‡‚u–d¤ß{Xå¡ MùƹÔxÝ. °q¦½Ã ¹1§•~ºVß ­5–Â× ªR9¢VÆüø/&gÑÕXˆÜK¬Û9"]Ôàrk–pD>3†ÆD+‹°vPçiå¦?Ü0›¯rlóŒ2öº2çRމVb–økè„¢%}§Â°  e«ã„ÁÆw:ì¦óàYŸÃ2I 28{"bi‘–!R÷È ?qx/2ØdŒ­®íŤ܋•þSævÀ·ÛÞ\åïüúÛj¬ÉN]3sƒ_øVL—Þücz”DÖ|ætš§ÌV ‘µ DA›4ù)vâÉ{ñ EAÛš¯Í†9NFŠ«‰+£ÙŠ£>ûFÑÆØoÿpN—æ!]—;`Ìyoi§ŽF†Y€â•!¯–Aò§ïÜyd6~È7rĹj—Mw•ããåÁH ‚¯ÆaE±6?-º59µ™¬12\E>!åŠl~x®ÒÁÈëØâÏ6 &«oðçgœ[ÐÁ;9þt°IᓎÙOåP#`ðÙWcñr®ÏEé1£)Љùá°ï.8œæ–hBæ/“qþ'`\õít~¨ ýj%”n²&ð£S-œ;²›êÅwìû¹ì½úïh›ôå3[1±áè̾Þc ft~¢ÆÉóqIìü­èµQO#à V%i%Ôoyx5Ø­§2ݱ’·»¥9ÊÖWÌmo&EÝtÅŠd2†xø]—HwÓ»|CjŒ¡Oºà4:Öì¦tcsuë{sÏ]|F°'¤‰£ö¬d; ÄXovß@퇖 ÷œ\„3|r¢¾5|œ‹Ém†ÚÄ.‚´¯hï’êE¯ eOvÅ\çºb&»aXg0º!9¼OˆývI¶–Ⱥ UҠȼeù–k}–S¦ ž6µË@¥„Ÿt@2¬Èåv±œÂáKn ¹]dZºp|OŸîG]K½7ÌÔwd¾fÍ>IÜ.³ÏýVFvïlh±Mí2­`© ù†“v̯ýàËráŸØéfszFšŽ+OH“"ÓK<’©tǾ%¤ð]PÖ¾0÷ýÙ~\oß{óÜÞN’½È¼ÞÎfÙoàéû´uá—²Tf¬#sñúû¾Qãê;*6üôÛŸ®h< Ýà½D­,¶XÈÍ·©]vdQK¨¨‰È{´™·ˆè˜>#€Œ+2ÇOd';ø™Z‚hå ê>õbÚdnK¦Ü‘“7Í¥Îwt[vÖš g¶…m‚3«ù ·èc`±ØYÖu£‚²œÿ£ÅÍ;#`vAÜìØ”´Ò£dõ/dúz´6gn˜Û|ÛÇEO6™êœ «Cê лÔÞŸÍ.z€³wuܵÊò=ÐÑB~E7Ÿ¸çyù´\«Bg7ʲí9kÝaÌPŸ*(5‡\ Űqê’lŸPŸôb‹‹ô0r˜^ö „Þ¡içãw»wÄ9ˆ±å-%G·Ÿþôš#ß1öÁ‰oïÚ{«±.“Õ„Þ..²¸€!élêæÄW_Òuôúkµ•ì+(¡×üSÔï #Ó‹¨Ïüxé¢6WÔ}Ž˜iÖŰf¡ò6Û¶ïË;ËOLïToú)y[Ù\oi¨ýbïpJöU¸>ÊŒ8¼Le,¨B z‘¶‹œV½ñ^à[ž¼©É„¥3/*K¿É¦ }­?Ë´Qoý)­?=ÎOBMò”èJ!§xnýÕZ¾­ó8½akŽêeˆÒüÛžÒI§ýI ”ÜvÍj€ä¸ÓdŒÎ^Ôè˘à › M¥ÿ”>à‡ •&9g4»­S˜È#ê¡/$õЭvVÐé©k–ÒjO®µZr‘«Înô½`{}RH‘²EvØqÓ£–Ù>ã2|È5üµ8$áLÇ×FNŸûÀ–G‘¿êçè'ÔzßE*º5¹]ÙTdõ©jÓ푃¨˜Y¶ôV~: ú‘Ö®@ÀÚz©Wÿ A¼ÅRß¼[Þ´6¿_PEÕ[©V–ï_]¥ZY;³«T+j¯ë*Õ ‰œDƒ›`A/‚n_ua,]UoòûJOz¹^Š•X;‚3%Wö”¥TŠlImK ¦FFvKï.fh°½à€H§S)Õ$™Ë}@eQ$|ò XrŠl¥=¨ÌäÍöBE&§ä!v—07¨ =oSX Ï φ>ÜcPR¾“îDÈÈÆÏ»@INÛ€ÛΤìÈ›é/’N6]®L›c(ˆÈ¬ÄÇr¤Ÿ<'ñ£Æ–±?¯1|0+'=΋?SÎ'vègbpÌî-,ò7ÜKØPÄjÝD%NT"Šó¦éXLâ~«aÞ{´ö[ž2ŸÙê8:/„YýfeúG²±±Ù%Rþ±PQ™Ä2y×Q°‘9 åº˜³‘î¤×á?Çê=^¯Ó´×zŠYm@¿LÀøòI­Í+Í'¹´wÔæãñx ˆ€“™™ÎGÂj8Ž}Ù”©Îx´Ç&Ém¡¹V@óCV9@A À¨{Ö¥f¾èTöÀ%þQÈÉ%þÑÎùèS¼¾rv·ñoü5õ+¯àVÒÂù€,+¤^#šXߥ³„ íréj­{étßéÎN?ôù`bœž®ƒ+ðóMŽ¡ ýñ3¼p dÂü_®B¢%À¨~¾;ï“Ô/Jëáð3Ú¾áð3ʸ±ÝŒn齜ùqŠ596èÄÐä…>Rerô“Q¹Éi…Á7MÍLN7Ô!ˆéY'm-ʳLî–ó¶gÇçŠ,í 3 'Nÿ(¾ëÖB9"“g=1À!V)k| ›¢Œ½µÂWÕûÓ;A¨^äCc¶‹ƒQ5­ÀàÚÒר¹5'`{zúÓ”–H¢n‡Às# …-Âc .ÔÂr–²' K@¹Ïž{Š,â(Ö$iDxe²ÀäÃSÙÄ>ÊMuÎ,Øœ Œõ¨%oèâ•7Œ=Í8°ÏbZ…Ýñ긻 '¶S0#ˆòf& ¾ÛÍ2‰a²l IÈ[½_~mÓp†¹9^ï6 (œdw/'Ð ×EJqNÑLÒ™,O1¿†Ú“Í÷ÑjùíOX8n®³ÚIìg[œK!´éoû.-špÔN‘ áz\ì8îh( „³øÑ(êäQ&G;å§ ëÛŠ‹fR¼@¾Ýé"”ІàxaÓSĦY6Ô ¤‚ao½[}Ьd©Þmwv!pç= ¶°z¸-À#×8ÉÒü2lvmxY¾ÆEÀ&£=ùÒ€GÆððfW>g2¡„­UšKÞï&é@Ô[.†mç]úü‰ƒÁáßl¨]¢¶mÆ`€iÖ€õµYû:!óñ½ï»ÏÈiÛ'ˆ=™`ƒLZ—¼¹_Ø,†^Òl,]¤™»ˆ‚¯°=ÏY‚™þÑ úȺ‹ ÛA )­ŒÖ a¿c¯ªÎý ¤Ò†HDÀà&-kÇÁw°…È„d²¾ì7 ¿Ü·åþ!MZÏ5™ÛÚl¯ÿäÞy,<ÕHa‚Œ Ÿãæ{™f Á¶‡B|÷?ë@‘´s¢Ú¾!L¾{{UÞÛ¾áu£rV¦8%©¼xX3 Ôµò3Ùh²¨Ÿ‘ä;Cwï¬ß4Ô¯‹}•Á¦ëP†¾/âÛS—Íé:“ÁøÊ¦ëL΋ÒåŸ9’ó¢sÁOsÛS¬§2€EËp+k*¬OZØdÓ”›9wkÔ‚Lÿ8ÓãνÐgolly-2.5-src/Patterns/Codd/repeater-emitter-demo.rle0000644000175100001440000000177312156145314017600 00000000000000# Repeater-emitter demo in Codd's CA # # Signals travel along state 1 wires, sheathed in state 2 cells. # # As in WireWorld, each signal has a trailing state to indicate its # direction. Here the signals 7 and 6 each with their trailing 0. # # T-junctions act as fan-outs - duplicating the signal onto the two # output wires. Here the two signals circulate around the loop but are # also copied onto the output wire. # # The effect of the 7-0 signal hitting the capped end is to expose the # bare wire. When 6-0 comes along afterwards it 'repairs' this exposed # end, restoring the sheath cells. The effect of a 7-0..6-0 signal train # is therefore to extend the wire by one cell. # # By putting the 7-0..6-0 signal trains in a repeater-emitter loop, the # extending operation happens again and again. This simple but useful # component became the inspiration for Langton's Loops (see # Patterns/Loops). # x = 21, y = 11, rule = Codd .9B$B9AB$BA7BAB$BFB5.BAB$B.B5.BAB$BAB5.B.B$BAB5.BGB$BAB5.BAB$BA7BA10B $B19AB$.19B! golly-2.5-src/Patterns/Codd/sensing-demo.rle0000644000175100001440000000132412156145314015760 00000000000000# Sensing demo - Codd's CA # # Two wires are shown, one with a state 1 cell just beyond the end, the # other without. Using the 'sense' command 70-70, the wire can detect which # case it is without disturbing the cell. # # The sense command first exposes the end of the wire, then generates one of # two 'echo signals' based on the state detected - '60' for a 0 cell, '70' for # a 1 cell. # # In our examples, these signals are then removed with the gate (state 3). # # The end of the wire is then repaired using the sequence '40-60'. # # See echo-discriminator.rle for an example that shows how these echo signals # can be used. # x = 41, y = 8, rule = Codd 29BC9B$A.F2A.D24A.G2A.G2AB$39B3$29BC9B$A.F2A.D24A.G2A.G2ABA$39B! golly-2.5-src/Patterns/Codd/sheathing-demo.rle0000644000175100001440000000217112156145314016265 00000000000000#CXRLE Pos=-45,-8 # # Sheathing demo # # In this demo a construction arm is shown approaching a written pattern. # In Codd's CA, only cells in state 1 can be written, so a method is provided # to sheath these wires to get them ready to receive signals. # # The construction arm first approaches (76) the injection point ('+' shape) and # then sends the 'inject_sheath' signal 756. This causes a 6 signal to travel # around the bare wires, sheathing them as it goes. # # In this example the construction arm then retracts (4566), leaving the new # pattern sheathed but inactive. An 'inject_trigger' signal (67766) could instead # be sent, which would activate the pattern by causing a 7 signal to start # travelling through it. This latter method is designed to be used in # self-reproducing machines to cause the daughter copy to come alive. # # See construction-arm-demo.rle for an example of writing a pattern. # See golly-constructor.rle.gz for an example of writing, sheathing and triggering. # x = 55, y = 9, rule = Codd 41.7A$41.A5.A$41.A5.A3.A$41.A5.A3.A$41.7A3.A$44.A6.A$35B3.A5.A6.A$2A. FA.FA.EA.D4A.FA.EA.G4A.FA.GAB.18A$35B3.A! golly-2.5-src/Patterns/Codd/sheathing-problems.rle0000644000175100001440000000325312156145314017166 00000000000000# A demonstration of the sheathing problems in Codd's ruleset. Run # the pattern and note that the sheathing goes wrong on every case. # At the top is shown the problem in isolated form, while the bottom # row shows a real-world example of the problem in context. # # Now reload the pattern (or undo back to generation 0) and change the # rule to Codd2 (Control menu | Set rule...). Now all the examples # sheath correctly. # # To achieve this, the following three transition rules were added to # Codd's ruleset: # 0,0,6,6,2,2 # 0,6,6,0,2,2 # 1,6,6,6,0,6 # # In simple patterns it is easy to avoid these problem patterns, by # introducing delays in various places. On more complex patterns though # this is not so easy - introducing a delay in one place causes the # sheathing problems to reappear elsewhere. For patterns over a certain # threshold there is no easy alternative to using the extended ruleset. # x = 99, y = 33, rule = Codd 87.BAB$8.A14.A20.BAB16.BAB21.BAB$8.A14.A20.B.B16.B.B21.BAB$8.A14.A21. F18.F22.B.B$2.3B3.A.3B6.3B.A3.3B15.A18.A23.F$2.2A.F3AF.2A6.2A.F3AF.2A 9.5B.A18.A.5B11.4B2.A2.4B$2.3B5.3B6.3B5.3B9.4A.F5A10.5AF.4A11.3A.F3AF .3A$39.5B22.5B11.4B5.4B5$5.6A11.6A16.7A10.6A$5.A4.A11.A4.A16.A5.A10.A 4.A16.6A4.6A$5.A4.A11.A4.A7.2B7.A5.A10.A4.9A8.A4.A4.A4.A$5.A4.A6.2B3. A4.A7.A.F7A5.A10.A9.A11.A4.A4.A4.A$2B3.A4.A6.A.F3A4.5A3.2B3.A9.A5.2B 3.A9.A6.2B3.A4.A4.A4.A$A.F3A4.5A2.2B3.A4.A12.A9.A5.A.F7A5.A6.A.F3A4. 6A4.A$2B3.A4.A11.A4.A12.A4.9A2.2B7.A5.A6.2B3.A14.A$5.A4.A11.A4.A12.A 4.A19.A5.A11.A14.A$5.A4.A11.A4.A12.6A19.7A11.A2.5A7.A$5.6A11.6A55.A2. A3.A7.A$83.A2.A3.A7.A$83.A2.A3.A7.A$83.4A3.A3.5A$83.A6.A3.A3.A$83.A6. A3.A3.A$83.A6.A3.A3.A$83.A6.5A3.A$83.A14.A$83.A14.A$83.A14.A$83.16A! golly-2.5-src/Patterns/Codd/signals-demo.rle0000644000175100001440000000055112156145314015753 00000000000000# Signal-trains in Codd's CA # # Six signal-trains are shown, travelling along a wire. Their functions # are listed here: # # 4456 : turn left # 5546 : turn right # 76 : advance # x = 27, y = 15, rule = Codd .24B$B5A.F2A.E2A.D2A.D5AB$BA23B$BAB$BA24B$B2AG.2AF.6AG.2AF.5AB$.24BAB $24.BAB$.24BAB$B4A.F2A.D2A.E2A.E7AB$BA24B$BAB$BA23B$B2AG.2AF.6AG.2AF. 4AB$.24B! golly-2.5-src/Patterns/Codd/tape-reader-demo.rle0000644000175100001440000001053212156145314016504 00000000000000# Tape Reader demo - Codd's CA # # In this demo, a stack of coders is repeatedly triggered. The coded # sequence is 4666,76,5546,77,7,46. The first four sets are the commands # retract-right, extend, extend_right, and sense. These cause the tape # head to advance one square and to read the tape cell at that position. # An echo signal bounces back: either 6 or 7 depending whether the # tape cell was 0 or 1. To keep this demo simple we just delete the echo # by colliding a 7 signal with it. The final 46 then caps the end of # the read head that was exposed for sensing, and the process can repeat. # # In Codd's design for a self-replicating machine the echo signal would # instead be passed as output. See echo-discriminator-demo.rle for a demo # that shows how the echo can be used. # # Within each coder, three gates are required. Two ensure that the # outputs flow in the right direction, the third is to make sure that # the first two aren't turned off by later signals. # x = 104, y = 162, rule = Codd .19B$B16A.F9A20.24A$BA10BA7B7.A20.A22.A$BAB8.BAB13.A20.A$BAB8.BAB13.A 20.A23.A.A.2A2.3A2.2A2.A2.A.3A.A3.2A$BAB8.BAB13.19A2.A$BAB8.BAB13.A3. A2.A7.A5.A$BAB8.BAB13.A3.A2.A7.A5.A$BAB8.BAB13.A3.4A4.A2.4A2.A$BAB8.B AB13.A6.A4.4A2.A2.A$BAB8.BAB13.A6.A13.A$BAB8.BAB13.A6.A13.A$BAB8.BAB 13.A6.15A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BA B13.A2.A.A9.A5.A$BAB8.BAB13.A2.3A9.A5.A$BAB8.BAB13.A4.3A4.A2.4A2.A$BA B8.BAB13.A4.A.A4.4A2.A2.A$BAB8.BAB13.A4.6A10.A$BAB8.BAB13.A7.A.A10.A$ BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A $BAB8.BAB13.A2.A.A9.A5.A$BAB8.BAB13.A2.3A9.A5.A$BAB8.BAB13.A4.3A4.A2. 4A2.A$BAB8.BAB13.A4.A.A4.4A2.A2.A$BAB8.BAB13.A4.6A10.A$BAB8.BAB13.A7. A.A10.A$BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB 13.19A2.A$BAB8.BAB13.A2.A.A9.A5.A$BAB8.BAB13.A2.3A9.A5.A$BAB8.BAB13.A 4.3A4.A2.4A2.A$BAB8.BAB13.A4.A.A4.4A2.A2.A$BAB8.BAB13.A4.6A10.A$BAB8. BAB13.A7.A.A10.A$BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$ BAB8.BAB13.19A2.A$BAB8.BAB13.A3.A10.A5.A$BAB8.BAB13.A3.A10.A5.A$BAB8. BAB13.A3.5A3.A2.4A2.A$BAB8.BAB13.A7.A3.4A2.A2.A$BAB8.BAB13.A7.A12.A$B AB8.BAB13.A7.A12.A$BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20. A$BAB8.BAB13.19A2.A$BAB8.BAB13.A2.A.A9.A5.A$BAB8.BAB13.A2.3A9.A5.A$BA B8.BAB13.A4.3A4.A2.4A2.A$BAB8.BAB13.A4.A.A4.4A2.A2.A$BAB8.BAB13.A4.6A 10.A$BAB8.BAB13.A7.A.A10.A$BAB8.BAB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BA B13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13.A3.A.A8.A5.A$BAB8.BAB13.A3.3A 8.A5.A$BAB8.BAB13.A5.A5.A2.4A2.A$BAB8.BAB13.A5.A5.4A2.A2.A$BAB8.BAB 13.A5.3A12.A$BAB8.BAB13.A5.A.A12.A$BAB8.BAB13.A5.16A$BAB8.BAB13.A20.A $BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13.A3.A.A8.A5.A$BAB8.BAB 13.A3.3A8.A5.A$BAB8.BAB13.A5.A5.A2.4A2.A$BAB8.BAB13.A5.A5.4A2.A2.A$BA B8.BAB13.A5.3A12.A$BAB8.BAB13.A5.A.A12.A$BAB8.BAB13.A5.16A$BAB8.BAB 13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13.A3.A2.A7.A5.A$ BAB8.BAB13.A3.A2.A7.A5.A$BAB8.BAB13.A3.4A4.A2.4A2.A$BAB8.BAB13.A6.A4. 4A2.A2.A$BAB8.BAB13.A6.A13.A$BAB8.BAB13.A6.A13.A$BAB8.BAB13.A6.15A$BA B8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13.A2.A.A9. A5.A$BAB8.BAB13.A2.3A9.A5.A$BAB8.BAB13.A4.3A4.A2.4A2.A$BAB8.BAB13.A4. A.A4.4A2.A2.A$BAB8.BAB13.A4.6A10.A$BAB8.BAB13.A7.A.A10.A$BAB8.BAB13.A 7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BAB13. A3.A10.A5.A$BAB8.BAB13.A3.A10.A5.A$BAB8.BAB13.A3.5A3.A2.4A2.A$BAB8.BA B13.A7.A3.4A2.A2.A$BAB8.BAB13.A7.A12.A$BAB8.BAB13.A7.A12.A$BAB8.BAB 13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BA B13.A3.A10.A5.A$BAB8.BAB13.A3.A10.A5.A$BAB8.BAB13.A3.5A3.A2.4A2.A$BAB 8.BAB13.A7.A3.4A2.A2.A$BAB8.BAB13.A7.A12.A$BAB8.BAB13.A7.A12.A$BAB8.B AB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.B AB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BA B13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8.BA B13.A3.A10.A5.A$BAB8.BAB13.A3.A10.A5.A$BAB8.BAB13.A3.5A3.A2.4A2.A$BAB 8.BAB13.A7.A3.4A2.A2.A$BAB8.BAB13.A7.A12.A$BAB8.BAB13.A7.A12.A$BAB8.B AB13.A7.14A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2.A$BAB8. BAB13.A3.A2.A7.A5.A$BAB8.BAB13.A3.A2.A7.A5.A$BAB8.BAB13.A3.4A4.A2.4A 2.A$BAB8.BAB13.A6.A4.4A2.A2.A$BAB8.BAB13.A6.A13.A$BAB8.BAB13.A6.A13.A $BAB8.BAB13.A6.15A$BAB8.BAB13.A20.A$BAB8.BAB13.A20.A$BAB8.BAB13.19A2. A$BAB8.BAB16.A.A9.A5.A$BAB8.BAB16.3A9.A5.A$BAB8.B.B18.3A4.A2.4A2.A$BA B8.BGB18.A.A4.4A2.A2.A$BAB8.BAB18.6A10.A$BA10BAB21.A.A10.A$B12AB21. 14A$.12B! golly-2.5-src/Patterns/Devore/0000755000175100001440000000000012156146015013316 500000000000000golly-2.5-src/Patterns/Devore/crossover.rle0000644000175100001440000000427312156145314015776 00000000000000# A demo of one-way units (diodes) and three-way funnelling units (triodes) in # the Devore variant of Codd's CA. With two diodes and two triodes arranged as # shown, a crossover can be made, for signals of any type (4, 5, 6 or 7). # # John Devore writes: (part I) # "I did the original work as a masters report back in 1973. The text of that # report may be completely lost, but I have a file of notes I have used in # presentations so could reconstruct all the important information again. I was # working full time while I worked on my masters degree and I never did follow # up appropriately on publishing results. I did all my simulations at that time # on an IBM 360/50 computer. The component I call a diode was suggested by Rod # Bates who was working on his PhD in EE at the time. It takes advantage of the # fact that the Codd space must include triplicate collision rules for signals # colliding at a T junction. A straight-on, a left-hand, and a right-hand # collision. Codd had treated these all the same and had to make diodes out of # extremely elaborate race conditions driving his "gates". By suggesting that # either the right or left collision annihilate the colliding signals Rod could # create a diode from "wires" arranged in a square with leads at two opposite # corners where one lead forms a right-hand T connection with two sides of the # square and the other lead forms a left-hand T connection. I discovered that # the square needed NO sheathing (with no additional rules) -- just a 2x2 array # of cells with values of 1's -- so the diode was extremely small. Further I # found one could add a third lead in the correct configuration to make what I # called the "triode" with the terrifically useful property of "funneling" # signals from either of two of the leads into the third while being blocked # from going out the other input lead. Again, this required no rule changes # beyond the basic diode rule change." # x = 25, y = 16, rule = Devore 18.6B$.8B8.B6AB$B8AB7.BA4BAB$BA5B2AB7.BAB2.BAB$BAB4.BAB7.BAB2.BAB$BAB 4.BAB3.4B2AB2.BAB$BGB4.BAB2.B6AB2.BAB$B.B4.BAB2.BA5B3.BAB$BAB3.B2A4BA B7.BAB$BAB3.B7AB7.BAB$BAB3.BA4B2AB7.BAB$BA5BAB2.BAB8.BAB$B7AB2.BAB8.B AB$.7B3.BA10BAB$11.B12AB$12.12B! golly-2.5-src/Patterns/Devore/Devore-body.rle0000644000175100001440000010013412156145314016121 00000000000000#CXRLE Pos=-37,-10 # Devore, J. and Hightower, R. (1992) # The Devore variation of the Codd self-replicating computer, # Third Workshop on Artificial Life, Santa Fe, New Mexico, # Original work carried out in the 1970s though apparently never published. # Reported by John R. Koza, "Artificial life: spontaneous emergence of # self-replicating and evolutionary self-improving computer programs," # in Christopher G. Langton, Artificial Life III, Proc. Volume XVII # Santa Fe Institute Studies in the Sciences of Complexity, # Addison-Wesley Publishing Company, New York, 1994, p. 260. # # See make-Devore-tape.py for a script to write tapes for this machine. # # John Devore writes: (part III) # "I then converted from a "microcode" to a "hardware" design which allowed # for tremendous miniaturization. I had estimated that a full-blown realization # of Codd's space would take at least a 10,000 x 10,000 array or 100,000,000 # cells. My design fit nicely in a 250 x 350 array or 87,500 cells -- less than # 1/1000 the estimated Codd size. Further it operated much more efficiently on # an instruction by instruction basis even if they had had the same distance for # signals to travel. Of course, Codd, was just trying to show that a self- # reproducing UCC was possible. I was trying to actually implement it # completely." # x = 367, y = 243, rule = Devore 18.10A2.14A2.17A2.15A2.16A2.17A2.11A2.103A$18.A8.A2.A12.A2.A15.A2.A 13.A2.A14.A2.A15.A2.A9.A2.A101.A$14.5A8.4A12.4A15.4A13.4A14.4A15.4A9. 4A101.A$17.2A10.2A14.2A17.2A15.2A16.2A17.2A11.2A2.78A4.A16.A$17.A11.A 15.A18.A16.A17.A18.A12.A3.A76.A4.A16.A$14.4A8.4A12.4A15.4A13.4A14.4A 15.4A9.4A3.A76.6A16.A$14.2A10.2A14.2A17.2A15.2A16.2A17.2A11.2A4.2A2. 69A5.A21.A$14.A11.A15.A18.A16.A17.A18.A12.A5.A3.A67.A5.A12.10A$14.A 11.A15.A18.A16.A17.A18.A12.A5.A3.A67.A5.A12.2A6.5A$5.7A2.A5.4A2.A9.7A 12.7A11.6A6.9A2.A8.7A3.A7.6A5.A3.A13.5A5.5A5.5A23.8A4.A12.A10.2A$5.A 5.A2.A5.A2.A2.A9.A4.4A10.A4.4A9.A3.4A4.A7.A2.A8.A5.A3.A7.A3.4A3.A3.A 13.A3.A5.A3.A5.A3.A23.A6.A4.A12.A11.3A$5.A5.A2.A5.A2.A2.A4.6A7.A5.6A 7.A9.A6.A4.A7.A2.A8.A5.A3.A7.A6.A3.A3.5A3.7A3.7A3.7A3.14A10.A6.A4.A 12.A12.11A$6A5.A2.A5.A2.4A4.A3.4A5.A5.A3.4A5.A4.6A6.A2.5A4.2A2.A8.A4. 2A3.A7.A6.A3.A7.A3.A2.A2.A3.A2.A2.A3.A2.A2.A3.A6.A5.A10.A6.A4.A11.2A 3.5A4.A9.A$A3.4A3.A2.A5.A4.4A2.A6.A5.A5.A6.A5.A4.A3.4A4.A2.A3.A4.5A6. 5A2.6A5.5A4.A3.A7.A3.A2.A2.5A2.A2.5A2.A2.5A6.A5.A10.3A2.5A2.A11.6A2. 2A4.A9.A$A6.A3.A2.A5.A7.A2.A6.A5.A5.A6.A5.A4.A6.A4.A2.A3.A4.A2.4A4.A 3.A2.A3.5A2.A3.A4.A3.A7.A3.A2.A9.A9.A13.A5.A12.A2.A3.A2.A9.3A3.2A3.6A 9.5A92.22A$A6.A2.2A2.A3.5A5.A2.8A5.A5.8A5.A4.A6.A4.A2.A3.A4.A5.A4.A3. A2.A7.A2.A3.A4.A3.A3.5A3.A2.A9.A9.A13.A3.8A7.A2.A3.A2.A9.2A4.A8.3A4. 2A2.A3.A92.A20.A$8A2.5A3.A3.A5.A7.A7.A10.A7.A4.8A4.A2.5A4.A5.A4.A3.A 2.A7.A2.A3.A4.A3.A3.A7.A2.A6.4A3.7A4.6A3.A3.A6.A7.A2.A3.A2.A9.A5.A10. A4.A3.A3.A92.A20.A$5.A4.A7.A3.A5.A7.A7.A10.A7.A9.A6.A4.A6.A5.A4.5A2. 4A4.A2.5A4.A3.A3.A7.A2.A6.A6.A10.A3.6A3.A6.A5.3A2.5A2.11A5.A10.A4.A3. A3.A92.A3.9A$5.A4.A7.A3.A5.A7.9A10.9A9.A6.A4.A6.A5.A6.A7.A2.3A4.A6.A 3.A3.A7.A2.A5.2A5.2A10.A3.A3.2A3.4A3.A5.A6.A20.2A9.A4.5A3.A92.5A7.A$ 5.6A7.5A5.A10.A3.5A10.A3.4A4.7A3.A4.A2.5A5.A6.A7.A2.A6.A6.A3.A3.9A2.A 5.4A3.4A2.4A2.A3.A3.A6.6A5.A6.A20.6A4.2A4.A3.A3.A95.2A7.A$5.A3.5A6.A 4.4A10.A7.A10.A6.A4.A5.A3.A4.A2.A2.5A2.A6.9A2.A4.5A4.A3.A11.A2.A5.A2. A3.A2.A2.A2.A2.A3.A3.A6.A10.A4.5A22.8A4.A3.A3.A95.A8.A$5.A7.A6.A4.A 13.A7.A10.A6.A4.A5.A3.A4.4A6.A2.A6.A10.3A2.A3.A4.A3.A11.A2.7A2.5A2.A 2.A2.A2.A3.A3.8A10.A4.A3.A22.A11.A2.2A3.A95.A5.4A$3.5A5.A6.6A11.5A3. 3A8.5A4.A4.A5.A3.A7.A6.A2.A6.A12.A2.A3.A4.A3.A11.A18.4A2.A2.A3.A21.A 4.A3.A11.6A5.A11.A2.3A2.A33.63A5.2A$3.A3.A5.A6.A3.4A9.A3.A3.A10.A3.A 4.A4.7A3.A7.8A2.A4.5A10.A2.A3.A4.A3.A8.4A24.4A3.A21.A4.A3.A11.A4.A5.A 11.A2.A4.A33.A67.A$3.A3.A5.A6.A6.A9.A3.A3.A10.A3.A4.A7.A6.A7.A9.A4.A 3.A2.4A2.3A2.5A4.A3.A8.A34.20A2.A4.5A11.A4.15A3.4A4.A33.A67.A$3.A3.A 5.A6.A6.A9.A3.A3.A10.A3.A4.A7.A4.3A7.A9.A4.A3.A2.A2.A2.A6.A6.A3.A8.A 53.A2.A6.A4.10A18.A11.A33.A40.5A4.19A$3.5A2.4A3.7A3.A9.5A3.A10.5A4.A 7.A4.A7.5A7.A4.A3.A2.A2.4A6.A6.A3.A8.A53.A2.A6.A4.A7.4A16.A11.A33.A 40.A3.A4.A16.4A$5.A4.A6.A5.A3.A11.A5.A12.A6.A4.9A7.A3.A5.3A4.5A2.A4. 4A2.5A2.3A3.A8.A16.5A5.5A5.5A12.A2.A4.5A2.A10.A16.A45.A3.20A12.6A3.6A 19.A$5.A4.A6.A5.A3.A11.A5.A12.A6.A4.A6.4A5.A3.A5.A8.A4.A7.A2.A3.A2.A 5.A8.A16.A3.A5.A3.A5.A3.A12.A2.A4.A3.A2.A10.A5.5A6.A45.A3.A18.A12.A 12.4A17.A$3.5A2.4A3.A5.A3.A9.5A3.A12.8A4.A9.A5.A3.A5.A8.A4.A7.A2.A3.A 2.A5.A8.A2.15A3.7A3.7A3.5A8.A2.A4.A3.A2.A3.8A2.A2.A3.A6.35A11.A3.A18. A8.5A15.A17.A$3.A3.A5.A3.7A3.A9.A3.A3.A15.A6.5A7.A5.5A5.A8.14A2.A3.A 2.A5.A8.A2.A10.A2.A3.A2.A2.A3.A2.A2.A3.A3.A8.A2.A4.A3.A2.A3.2A4.8A3. 4A37.A11.A3.A17.2A8.A2.4A13.A12.6A$3.A3.A5.A6.A6.A9.A3.A3.A15.A6.A3.A 2.6A7.A7.A16.A7.5A2.3A3.A8.A2.A10.A2.5A2.A2.5A2.A2.5A3.7A2.A2.A4.5A2. A3.A9.A2.A3.A2.A37.A11.A3.A17.11A5.A7.7A12.A3.4A$3.A3.A5.A6.A6.A9.A3. A3.A13.5A4.A3.A2.A12.A7.A16.A9.A6.A3.A8.A2.A10.A9.A9.A10.A5.A2.A2.A6. A4.A3.A12.5A2.A37.A11.A3.A17.A15.A7.A4.4A10.A6.A$3.5A2.4A4.5A2.3A9.5A 3.A13.A3.A4.A3.A2.A12.6A2.A14.5A7.A6.A3.A8.A2.A10.A9.A9.A10.A5.A2.A2. A6.A4.A3.A2.4A13.A37.A11.A3.A17.A15.A2.6A7.A5.6A6.A$5.A4.A7.A3.A2.A 13.A5.A13.A3.A4.5A2.A12.A4.A2.A14.A3.A7.8A3.A8.A2.A3.8A3.7A2.4A3.A10. A5.A2.A2.4A3.A4.A3.A2.A2.A13.A37.A11.A3.A6.9A2.A15.A2.A3.4A5.A5.A3.4A 4.A$5.A4.A7.A3.A2.A13.A5.A13.A3.A6.A4.A12.A4.A2.A14.A3.A8.A9.A8.A2.A 3.A6.A3.A8.A2.A3.A10.A3.3A2.A4.6A4.A3.A2.A2.15A36.2A11.A3.A6.A7.A2.A 15.A2.A6.A5.A5.A6.A4.A$3.5A2.4A4.A3.A2.A13.7A13.5A6.A4.A10.5A2.A2.A 14.A3.A8.A9.A8.A2.A3.A6.A3.A8.A2.5A10.A3.A4.A4.A9.A3.4A16.A36.14A3.A 6.A7.A2.A15.A2.A6.A5.A5.A6.A4.A$3.A3.A5.A4.5A2.3A13.A19.A8.6A10.A3.A 2.A2.A14.5A8.A9.A8.A2.A3.4A3.A3.4A5.A9.5A3.A3.A4.A4.A9.A5.2A16.A36.A 16.A4.5A4.2A2.A13.3A2.8A5.A5.8A4.A$3.A3.A5.A6.A6.A13.A19.A11.A12.A3.A 2.A2.A16.A10.A9.A8.A2.A6.A3.A6.A5.A9.A2.6A3.3A2.3A2.A9.A5.A3.5A2.5A2. A36.A16.A4.A3.A4.5A13.A9.A7.A10.A6.A$3.A3.A5.A6.A6.A11.5A15.5A9.A12.A 3.A2.4A16.A10.A9.A8.A2.A6.A3.A6.A5.A9.A2.A3.2A5.A3.5A9.A5.A3.A3.A2.A 3.A2.A36.A16.A4.A3.A4.A2.4A11.A9.A7.A10.A6.A$3.5A2.4A6.8A11.A3.A15.A 3.A7.5A10.5A22.A5.6A9.A8.A2.A3.4A2.2A5.2A4.2A9.A2.A3.A6.A3.A13.A5.5A 3.4A3.4A36.2A10.6A4.A3.A4.A5.A6.6A9.9A7.7A3.A$5.A4.A11.A16.A3.A15.A3. A7.A3.A12.A24.A5.A14.A8.A2.A3.A5.4A3.4A2.12A2.A3.A6.A3.A7.7A9.A3.A2.A 3.A6.6A27.4A8.A3.4A2.5A4.A5.A6.A3.4A10.A3.5A4.A5.A3.A$5.A4.A11.A16.A 3.A15.A3.A7.A3.A12.A24.A5.A14.A8.A2.A3.A5.A2.A3.A2.A2.A13.A3.8A3.A7.A 15.5A2.5A6.A4.A12.6A12.A8.A6.A4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A$5.6A11. A16.5A15.5A7.A3.A12.A17.8A5.A2.13A2.7A2.A3.7A2.5A2.4A13.A14.4A4.A33.A 4.A12.A4.A12.A8.A6.A4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A$5.A3.5A8.A18.A19. A9.5A12.A17.A12.A2.A14.A8.A36.A16.2A4.A33.A3.2A3.5A4.A4.14A6.5A4.A4.A 2.5A5.A4.5A4.A8.5A3.3A4.7A3.A$5.A7.A8.A18.A19.A11.A14.A17.A12.A2.A14. A8.A36.14A4.A4.A16.6A2.10A3.6A3.6A16.4A4.A3.A4.A4.A2.A2.5A2.A4.A3.A4. A8.A3.A3.A9.A6.A$5.A7.A8.A18.A19.A11.A14.A17.A12.A2.A2.13A2.7A4.30A 14.2A4.A4.A16.A4.A2.A12.A12.4A17.A4.A3.A4.A4.4A6.A2.A4.A3.A4.A8.A3.A 3.A9.A4.3A$5.9A8.A18.A19.A11.A14.A11.7A4.9A2.A2.A14.A10.A28.A15.A3.2A 4.A16.A4.A2.A12.A15.A17.A4.A3.A4.A7.A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.A$ 5.A16.A18.A19.A8.4A14.A11.A10.A10.A2.A14.A10.A28.A15.A3.4A2.A16.A3.2A 2.A7.6A15.A12.6A4.5A4.A7.8A2.A4.5A4.A8.5A3.A6.9A$5.A16.A18.A19.A8.A 17.A11.A10.A10.A2.A2.13A2.9A2.24A2.A7.5A3.5A2.A2.A2.15A3.5A7.A3.4A7. 7A12.A3.4A4.A6.A7.A9.A6.A6.A10.A5.A6.A6.4A$5.A16.A18.A19.A8.A17.A11.A 7.4A2.9A2.A2.A14.A10.A22.A2.A7.A3.A10.A2.A2.A17.A11.A6.A7.A4.4A10.A6. A4.A6.A7.A9.A6.A6.A10.A5.A6.A9.A$5.A16.A18.A19.A8.A17.A11.A7.A5.A10.A 2.A14.A10.A22.A2.A7.A3.A10.A2.A2.A17.A6.6A6.A2.6A7.A5.6A6.A2.5A4.A5. 5A7.A4.5A4.A8.5A3.A4.5A7.A$5.7A10.A18.A19.A8.A2.16A3.9A2.6A5.A10.A2.A 3.12A2.9A2.18A2.A2.5A3.A3.A9.2A2.A2.A6.9A2.A6.A3.4A4.A2.A3.4A5.A5.A3. 4A4.A2.A3.A4.A5.A3.A5.3A4.A3.A4.A8.A3.A3.A4.A3.A2.6A$11.A10.A18.A19.A 8.A2.A18.A10.A7.4A2.9A2.A3.A13.A10.A16.A2.A6.A3.A2.2A9.5A2.A6.A7.A2.A 6.A6.A4.A2.A6.A5.A5.A6.A4.A2.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A 2.A$11.A10.A18.A12.8A8.A2.A18.A10.A7.A5.A10.A3.A13.A10.A16.A2.A6.5A2. 5A6.A6.A6.A7.A2.A6.A6.A4.A2.A6.A5.A5.A6.A4.A2.A3.A4.A5.A3.A5.A6.A3.A 4.A8.A3.A3.A4.A3.A2.A$11.A10.A18.A12.A15.A2.A6.13A2.9A2.6A5.A10.A3.A 6.8A2.9A2.12A2.A2.5A6.A2.A2.2A3.4A6.A4.5A4.2A2.A6.8A4.A2.8A5.A5.8A4.A 2.5A4.A5.5A5.A6.5A4.A8.5A3.A4.5A2.A$11.A10.A18.A12.A15.A2.A6.A14.A10. A7.4A2.9A3.A6.A9.A10.A10.A2.A6.A6.4A3.A3.A9.A4.A3.A4.5A11.A6.A7.A7.A 10.A6.A4.A6.A7.A7.A8.A6.A10.A5.A6.A4.A$11.A10.A13.6A8.5A15.A2.A6.A14. A10.A7.A5.A11.A6.A9.A10.A10.A2.A6.A13.A3.A9.A4.A3.A4.A2.4A9.A6.A7.A7. A10.A6.A4.A6.A7.A7.A8.A6.A10.A5.A6.A4.A$11.A10.A13.A13.A11.9A2.A6.A6. 9A2.9A2.6A5.A11.A5.2A8.2A9.2A3.5A2.A2.5A2.A13.A3.A4.6A4.A3.A4.A5.A6. 7A3.A7.9A7.7A3.A2.5A2.3A7.6A2.A6.5A2.3A10.7A6.6A$11.A10.A13.A13.A11.A 10.A6.A6.A10.A10.A9.2A11.A5.5A5.5A6.6A3.A2.A6.A2.A12.2A3.A4.A3.4A2.5A 4.A5.A6.A5.A3.A10.A3.5A4.A5.A3.A2.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13.A$ 11.A10.A13.A13.A11.A10.A6.A6.A10.A10.A9.9A4.A3.3A3.A3.3A3.A4.3A3.2A3. A2.A6.A2.A12.6A4.A6.A4.A6.A5.A6.A5.A3.A10.A7.A4.A5.A3.A2.A3.A2.A9.A4. A2.A6.A3.A2.A14.A13.A$11.A9.2A9.5A6.8A3.9A2.9A2.5A5.2A9.2A9.2A7.3A3.A 2.2A4.A3.2A4.A3.2A4.A4.2A4.A4.A2.5A2.A2.A12.A9.A6.A4.A6.A5.A6.A5.A3.A 10.A7.A4.A5.A3.A2.A3.A2.A7.5A2.A2.A6.A3.A2.A12.5A9.5A$11.A9.A10.A10.A 10.A10.A10.A9.5A6.5A6.5A4.2A4.A3.A4.A3.A5.A3.A5.A4.A5.A4.A6.A2.A2.A 12.A7.5A4.A4.A2.5A5.A6.7A3.A8.5A3.3A4.7A3.A2.5A2.3A5.A3.A2.A2.A6.5A2. 3A10.A3.A9.A3.A$11.A9.A10.A10.A10.A10.A10.A7.3A3.A4.3A3.A4.3A3.A4.A5. A3.A3.2A3.A3.7A3.8A3.3A4.A6.A2.A2.A12.A7.A3.A4.A4.A2.A2.5A2.A9.A6.A8. A3.A3.A9.A6.A4.A6.A5.A3.A2.A2.A8.A6.A10.A3.A9.A3.A$11.A8.2A9.2A9.2A9. 2A9.2A9.2A7.2A4.A4.2A4.A4.2A4.6A3.3A3.A3.6A3.2A8.2A9.2A5.5A2.A2.A2.A 12.4A4.A3.A4.A4.4A6.A2.A9.A4.3A8.A3.A3.A9.A4.3A4.A6.A5.A3.A2.4A8.A6.A 10.A3.A9.A3.A$11.A8.5A6.5A6.5A6.5A6.5A6.5A4.A5.A4.A5.A4.A5.A8.2A4.5A 3.2A3.A9.A10.A10.A2.A2.A2.A15.A4.A3.A4.A7.A6.A2.A9.A4.A10.A3.A3.A9.A 4.A6.8A5.5A14.8A10.5A9.5A$11.A6.3A3.A4.3A3.A4.3A3.A4.3A3.A4.3A3.A4.3A 3.6A3.8A3.8A3.3A8.A13.A4.A9.A10.A10.A2.A2.A2.A15.A4.5A4.A7.8A2.A6.9A 10.5A3.A6.9A7.A13.A17.A18.A13.A$11.A6.2A4.A4.2A4.A4.2A4.A4.2A4.A4.2A 4.A4.2A4.A8.2A9.2A9.2A9.A13.A3.2A3.4A2.A4.4A2.A4.4A2.A2.A2.A2.A15.A6. A6.A7.A9.A6.A6.4A10.A5.A6.A6.4A5.A13.A17.A18.A13.A$11.A6.A5.A4.A5.A4. A5.A4.A5.A4.A5.A4.A5.A8.A10.A10.A10.A5.9A3.A4.A2.A2.A4.A2.A2.A4.A2.A 2.A2.A2.A2.A15.A6.A6.A7.A9.A6.A9.A10.A5.A6.A9.A5.66A$11.8A3.8A3.8A3. 8A3.8A3.8A3.3A8.A10.A10.A10.A5.2A10.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2. A2.A2.A15.A4.5A4.A5.5A7.A4.5A7.A8.5A3.A4.5A7.A70.A$11.A10.2A9.2A9.2A 9.2A9.2A9.2A9.A4.4A2.A3.8A4.7A5.A11.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A2. A2.A2.A15.A4.A3.A4.A5.A3.A5.3A4.A3.A2.6A8.A3.A3.A4.A3.A2.6A70.A$A10.A 10.A10.A10.A10.A10.A10.A10.A4.A2.A2.A3.A11.A11.A11.A3.A3.A2.A3.A3.A2. A3.A3.A2.A2.A2.A2.A15.A4.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A4.A3.A2.A 10.66A$A10.A10.A10.A10.A10.A10.A10.A10.A2.3A2.A2.A3.A11.A11.A11.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.A15.A4.A3.A4.A5.A3.A5.A6.A3.A2.A13.A 3.A3.A4.A3.A2.A10.A$A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2. A4.4A2.A3.2A2.A2.A3.A4.4A3.A4.4A3.A4.4A3.A3.5A2.A3.5A2.A3.5A2.A2.A2.A 2.A15.A4.5A4.A5.5A5.A6.5A2.A13.5A3.A4.5A2.A2.9A$A4.A2.A2.A4.A2.A2.A4. A2.A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A3.A3.A2.A3.A4.A2. A3.A4.A2.A3.A4.A2.A3.A3.A3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.A15.A6.A6.A 7.A7.A8.A4.A15.A5.A6.A4.A2.A18.6A$A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A 2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A3.A3.A2.A3.A2.3A2.A3.A 2.3A2.A3.A2.3A2.A3.A3.A3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.11A5.A6.A6.A7. A7.A8.A4.A15.A5.A6.A4.A2.A18.A4.A39.10A$A3.2A2.A2.A3.2A2.A2.A3.2A2.A 2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.5A2.A3.A3.2A2. A3.A3.2A2.A3.A3.2A2.A3.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A2.A2.A11.2A5.A 4.5A2.3A7.6A2.A8.6A15.7A6.6A2.A2.17A4.15A20.A4.A8.A$A3.A3.A2.A3.A3.A 2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A 3.A3.A3.A3.A3.A3.A3.A3.A3.5A6.5A6.5A6.A2.A2.A12.A5.A4.A3.A2.A9.A4.A2. A11.A19.A13.A4.A2.A14.4A16.A20.A4.A8.A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3. A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A3.A3.A3.A3. A3.A3.A3.A7.A10.A10.A6.A2.A2.5A8.A5.A4.A3.A2.A9.A4.A2.A11.A19.A13.A4. A2.A17.A16.A20.6A8.A$A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A 2.A3.5A2.A3.A2.2A2.A3.A3.5A3.A3.5A3.A3.5A7.A10.A10.A6.A2.A6.A8.A4.2A 4.A3.A2.A7.5A2.A2.A9.5A15.5A9.5A2.A2.A17.A5.5A6.A29.6A$A3.A3.A2.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.5A6.A3.A3. A3.A3.A3.A3.A3.A3.A3.A3.5A2.9A2.9A6.A2.A6.A7.2A3.3A4.5A2.3A5.A3.A2.A 2.A9.A3.A15.A3.A9.A3.A2.A2.A10.8A2.A2.A3.A6.A29.A3.4A$A3.A3.A2.A3.A3. A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A6.A6.A3.A3.A3. A3.A3.A3.A3.A3.A3.A3.A6.A10.A14.A2.A6.A7.6A8.A6.A5.A3.A2.A2.A9.A3.A 15.A3.A9.A3.A2.A2.A10.2A4.8A3.4A3.A29.A6.2A$A3.A2.2A2.A3.A2.2A2.A3.A 2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A6.A6.A3.A3.A2. 2A3.A3.A2.2A3.A3.A2.2A3.A6.A10.A14.A2.A5.2A7.A3.2A8.A6.A5.A3.A2.4A9.A 3.A15.A3.A9.A3.A2.A2.A10.A9.A2.A3.A2.A3.A3.27A6.4A$5A6.5A6.5A6.5A6.5A 6.5A6.5A6.5A6.5A2.5A3.5A7.5A7.5A7.A3.4A2.9A14.A2.A4.3A3.5A3.A9.8A5.5A 15.5A15.5A9.5A2.A2.A10.A12.5A2.A3.5A35.A$4.A10.A10.A10.A10.A10.A10.A 10.A6.A6.A11.A11.A11.A7.A3.A5.A11.12A2.A4.A5.A7.A10.A13.A19.A19.A13.A 4.A2.A10.A2.4A13.A43.A$4.A10.A10.A10.A10.A10.A10.A10.A6.A6.A11.A11.A 11.A7.A3.A5.A11.A13.A4.A4.2A7.A10.A13.A19.A19.A13.A4.A2.A10.A2.A2.A 13.A20.24A$4.A10.A10.A8.3A10.A5.6A3.8A2.9A3.4A3.4A3.9A3.9A4.8A5.3A3.A 5.A11.A13.A3.2A3.3A7.A10.69A4.A2.A10.A2.A2.15A20.A21.4A$4.A10.A10.A8. A5.8A5.A8.A9.A11.A6.A6.A11.A12.A12.A5.A5.A3.9A3.11A3.6A9.A78.A4.A2.A 10.4A16.A20.A24.A$5A10.2A2.8A8.A5.A12.A8.A9.A11.A6.A6.A11.A12.A12.A5. A5.A3.A11.A8.2A3.A3.2A9.A78.A4.A2.A12.2A16.A20.A24.A$A15.A2.A15.A2.4A 12.A2.7A9.A2.10A6.A2.5A11.A2.11A5.8A2.4A5.A3.A11.A8.A4.A3.A10.80A4.A 2.A5.A6.A3.5A2.5A2.A12.6A2.8A7.5A5.A$A15.A2.A15.A2.A15.A2.A15.A2.A15. A2.A15.A2.A15.A9.A8.A3.A11.A8.A4.A3.A94.A2.A2.7A3.A3.A3.A2.A3.A2.A12. A4.A9.A7.A3.A5.A$A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A9.A8. A3.A11.A8.A4.A3.A94.A2.A2.A2.A2.A3.5A3.4A3.4A12.A4.A9.A7.A3.A5.A$8A3. 6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A3.A11.A8.6A 3.96A2.A2.A5.A7.A3.A2.A3.A5.6A4.A3.2A9.A7.A3.A5.A$A6.A3.A4.A2.A6.A3.A 4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A 3.A4.A3.A11.A115.A2.A5.A7.5A2.5A5.A4.A4.A3.12A7.A2.2A5.A$A6.A3.A4.A2. A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4. A2.A6.A3.A4.A3.A10.2A115.A2.A5.A24.A4.A4.A3.A15.4A2.5A2.A$A6.A2.2A4.A 2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A 6.A2.2A4.A2.A6.A2.2A4.A3.A9.3A3.62A27.18A5.A2.A4.2A24.A3.2A4.A3.A15.A 2.A2.A3.A2.A$A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2. A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A3.A9.A5.A60.A2. A2.A21.A16.A5.A2.A4.15A2.10A3.7A3.A15.A2.4A3.A2.A$A5.2A2.A5.A2.A5.2A 2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A 5.A2.A5.2A2.A5.A3.A9.A4.2A60.10A18.A16.A5.A2.A4.A13.A2.A12.A9.7A9.A9. A2.A$A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A 3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A3.A8.2A3.3A7.4A3.5A44.A2.A2.A18.A6.7A3. A5.A2.A4.A13.A2.A12.A15.A9.A9.A2.A$A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A 3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3. 3A3.3A3.A3.4A5.6A9.A2.A3.A3.A44.A5.A4.15A6.2A3.6A5.A2.A4.A12.2A2.A7. 6A15.A9.A9.A2.A$A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A 7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A5.8A3.2A9.A2.5A3.A44.A5.A4. A20.A4.A10.A2.6A12.5A7.A3.4A7.7A9.8A2.A2.A$A3.A7.A3.A2.A3.A7.A3.A2.A 3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A 5.A10.A10.A10.A44.12A20.A4.A10.A2.A17.A11.A6.A7.A4.4A7.A5.5A2.A$A3. 10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A 2.A2.A3.10A2.A5.A10.A10.A10.A58.19A4.5A6.A2.A17.A6.6A6.A2.6A7.A7.A5.A 6.A$A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A 3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A3.3A10.A10.A10. A58.A16.4A6.A6.A2.A6.9A2.A6.A3.4A4.A2.A3.4A5.A7.A5.A6.A$A2.3A2.A2.3A 2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A 2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A3.A12.A8.11A2.A 10.22A12.15A19.A6.A6.A2.A6.A7.A2.A6.A6.A4.A2.A6.A5.A7.A4.2A6.A$A3.A3. A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2. A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A3.A12.A8.A8.5A10.A20.A12.A 12.4A17.A5.2A6.A2.A6.A7.A2.A6.A6.A4.A2.A6.A5.A7.A4.9A$A3.A3.A3.A3.A2. A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3. A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A3.A12.A8.A8.A14.A20.A8.5A15.A17.A5. 9A2.A4.5A4.2A2.A6.8A4.A2.8A5.A7.A4.A$A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A 3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A 3.A3.A12.A8.A8.A14.A19.2A8.A2.4A13.A12.6A5.A10.A4.A3.A4.5A11.A6.A7.A 7.A5.5A2.A$A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A 2.A7.5A3.A2.A7.5A3.A3.A12.A6.5A5.2A14.A19.11A5.A7.7A12.A3.4A3.A10.A4. A3.A4.A2.4A9.A6.A7.A7.A5.A3.A2.A$A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A2. A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A3.A12.A6.A3.A5.17A19.A15.A7.A4.4A 10.A6.A3.A5.6A4.A3.A4.A5.A6.7A3.A7.9A5.A3.A2.8A$A2.6A7.A2.A2.6A7.A2.A 2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A3.A12.A6.A3. A5.A14.4A17.A15.A2.6A7.A5.6A6.A3.A5.A3.4A2.5A4.A5.A6.A5.A3.A10.A3.5A 2.A3.A9.A$A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A 2.A2.A12.A2.A2.A12.A3.A12.A6.A3.A5.A17.A6.9A2.A15.A2.A3.4A5.A5.A3.4A 4.A3.A5.A6.A4.A6.A5.A6.A5.A3.A10.A7.A2.5A9.A$A2.A12.A2.A2.A12.A2.A2.A 12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A3.A12.A6.5A5.5A 13.A6.A7.A2.A15.A2.A6.A5.A5.A6.A4.A3.A5.A6.A4.A6.A5.A6.A5.A3.A10.A7.A 4.A7.5A$A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A 2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A3.A12.A8.A11.A13.A6.A7.A2.A15.A2.A6. A5.A5.A6.A4.A3.A3.5A4.A4.A2.5A5.A6.7A3.A8.5A3.3A4.A7.A$A2.14A2.A2.14A 2.A2.14A2.A2.14A2.A2.14A2.A2.14A2.A2.14A2.A2.14A3.A12.A8.A11.A13.A4. 5A4.2A2.A13.3A2.8A5.A5.8A4.A3.A3.A3.A4.A4.A2.A2.5A2.A9.A6.A8.A3.A3.A 6.6A2.A$A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A11.A12.A 8.8A4.A13.A4.A3.A4.5A13.A9.A7.A10.A6.A3.A3.A3.A4.A4.4A6.A2.A9.A4.3A8. A3.A3.A6.A4.A2.4A$A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A 7.A11.A12.A8.A6.A4.A13.A4.A3.A4.A2.4A11.A9.A7.A10.A6.A3.A3.A3.A4.A7.A 6.A2.A9.A4.A10.A3.A3.A6.A4.A5.A$9A10.9A10.9A10.9A10.9A10.9A10.9A10.9A 11.A12.A8.A6.A4.A8.6A4.A3.A4.A5.A6.6A9.9A7.7A3.A3.A3.5A4.A7.8A2.A6.9A 10.5A3.A4.5A2.A5.A$8.A18.A18.A18.A18.A18.A18.A18.A11.A12.A6.5A2.3A4.A 8.A3.4A2.5A4.A5.A6.A3.4A10.A3.5A4.A5.A3.A3.A5.A6.A7.A9.A6.A6.4A10.A5. A4.A3.A2.A2.4A$8.A18.A18.A18.A18.A18.A18.A18.A11.A12.A6.A3.A2.A6.A8.A 6.A4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A3.A5.A6.A7.A9.A6.A9.A10.A5.A4.A3.A 2.A2.A$8.9A10.17A2.A18.9A2.9A18.A2.17A10.9A11.A12.A6.A3.A2.A6.A8.A6.A 4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A3.A3.5A4.A5.5A7.A4.5A7.A8.5A3.A4.A3.A 2.4A$16.A26.A2.A26.A2.A26.A2.A26.A11.9A12.A6.A3.A2.A6.A6.5A4.A4.A2.5A 5.A4.5A4.A8.5A3.3A4.7A3.A3.A3.A3.A4.A5.A3.A5.3A4.A3.A2.6A8.A3.A3.A4. 5A4.4A$16.A26.A2.A26.A2.A26.A2.A26.A11.A20.A6.5A2.8A6.A3.A4.A4.A2.A2. 5A2.A4.A3.A4.A8.A3.A3.A9.A6.A3.A3.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A 6.A9.A$16.5A18.5A2.5A18.5A2.5A18.5A2.5A18.5A11.A20.A8.A10.4A4.A3.A4.A 4.4A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.3A3.A3.A3.A4.A5.A3.A5.A6.A3.A2.A13.A 3.A3.A6.A9.A$16.A3.A18.A3.A2.A3.A18.A3.A2.A3.A18.A3.A2.A3.A18.A3.A4. 8A20.A8.A13.A4.A3.A4.A7.A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.A5.A3.5A4.A5.5A 5.A6.5A2.A13.5A3.A6.6A4.A$16.A26.A2.A26.A2.A26.A2.A26.A4.A27.A8.6A8.A 4.5A4.A7.8A2.A4.5A4.A8.5A3.A6.9A5.A5.A6.A7.A7.A8.A4.A15.A5.A6.A4.A2. 3A$16.A26.A2.A26.A2.A26.A2.A26.A4.A27.A8.A4.A6.3A6.A6.A7.A9.A6.A6.A 10.A5.A6.A6.4A3.A5.A6.A7.A7.A8.A4.A15.A5.A6.A4.A2.A$16.12A7.9A2.12A7. 9A2.12A7.9A2.12A7.9A4.A27.A8.A4.A6.A8.A6.A7.A9.A6.A6.A10.A5.A6.A9.A3. A3.5A2.3A7.6A2.A8.6A15.7A4.5A2.4A$16.A10.A7.A7.A2.A10.A7.A7.A2.A10.A 7.A7.A2.A10.A7.A7.A4.A27.A6.5A2.A2.5A6.5A4.A5.5A7.A4.5A4.A8.5A3.A4.5A 7.A3.A3.A3.A2.A9.A4.A2.A11.A19.A8.A3.A4.4A$16.A10.A6.2A7.A2.A10.A6.2A 7.A2.A10.A6.2A7.A2.A10.A6.2A7.A4.A27.A6.A3.A2.A2.A2.4A4.A3.A4.A5.A3.A 5.3A4.A3.A4.A8.A3.A3.A4.A3.A2.6A3.A3.A3.A2.A9.A4.A2.A11.A19.A8.A3.A7. A$16.A2.9A6.7A2.A2.A2.9A6.7A2.A2.A2.9A6.7A2.A2.A2.9A6.7A2.A4.A27.A6.A 3.A2.A2.A5.A4.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A8.A3.A3.A2.A 7.5A2.A2.A9.5A15.5A6.A3.A7.A$16.A9.2A6.A8.A2.A9.2A6.A8.A2.A9.2A6.A8.A 2.A9.2A6.A8.A4.A27.A6.A3.A2.4A5.A4.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A 4.A3.A2.A8.A3.5A2.3A5.A3.A2.A2.A9.A3.A15.A3.A6.5A7.A$16.A9.A7.A8.A2.A 9.A7.A8.A2.A9.A7.A8.A2.A9.A7.A8.A4.A27.A6.5A11.A4.5A4.A5.5A5.A6.5A4.A 8.5A3.A4.5A2.A7.2A5.A6.A5.A3.A2.A2.A9.A3.A15.A3.A8.A9.A$16.A9.A7.A8.A 2.A9.A7.A8.A2.A9.A7.A8.A2.A9.A7.A8.A4.A27.A8.A11.3A6.A6.A7.A7.A8.A6.A 10.A5.A6.A4.A7.A6.A6.A5.A3.A2.4A9.A3.A15.A3.A8.A9.A$16.A9.10A7.A2.A9. 10A7.A2.A9.10A7.A2.A9.10A7.A4.A27.A8.A11.A8.A6.A7.A7.A8.A6.A10.A5.A6. A4.A7.A6.8A5.5A15.5A15.5A8.11A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A 3.A3.A8.A2.A9.A3.A3.A8.A4.A27.A8.13A6.5A2.3A7.6A2.A6.5A2.3A10.7A6.6A 7.A7.A13.A19.A19.A10.A$16.A8.3A2.A2.3A7.A2.A8.3A2.A2.3A7.A2.A8.3A2.A 2.3A7.A2.A8.3A2.A2.3A7.A4.A27.A8.A4.A5.4A4.A3.A2.A9.A4.A2.A6.A3.A2.A 14.A13.A9.2A6.A13.A19.A19.A10.A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A 3.A3.A8.A2.A9.A3.A3.A8.A4.A27.A8.A4.A8.A4.A3.A2.A9.A4.A2.A6.A3.A2.A 14.A13.A10.A6.66A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9. A3.A3.A8.A4.A27.A8.A4.A8.A4.A3.A2.A7.5A2.A2.A6.A3.A2.A12.5A9.5A8.A71. A$16.A9.5A3.A8.A2.A9.5A3.A8.A2.A9.5A3.A8.A2.A9.5A3.A8.A4.A27.A8.A4.A 2.4A2.A4.5A2.3A5.A3.A2.A2.A6.5A2.3A10.A3.A9.A3.A8.A71.A$16.A13.5A8.A 2.A13.5A8.A2.A13.5A8.A2.A13.5A8.A4.A27.A8.A4.A2.A2.A2.A6.A6.A5.A3.A2. A2.A8.A6.A10.A3.A9.A3.A8.34A38.A$16.A13.A12.A2.A13.A12.A2.A13.A12.A2. A13.A12.A4.A27.A8.A4.A2.A2.A2.A6.A6.A5.A3.A2.4A8.A6.A10.A3.A9.A3.A8.A 3.A22.A5.A3.13A15.8A$16.A3.11A12.A2.A3.11A12.A2.A3.11A12.A2.A3.11A12. A4.A27.A8.A4.4A2.4A6.8A5.5A14.8A10.5A9.5A8.A3.A22.A5.A3.A10.2A15.A$ 16.A3.A22.A2.A3.A22.A2.A3.A22.A2.A3.A22.A4.A27.A8.A21.A13.A17.A18.A 13.A10.A2.3A21.A2.A2.A3.A11.A5.6A4.A$16.A3.A22.A2.A3.A22.A2.A3.A22.A 2.A3.A22.A4.A27.A8.A21.A13.A17.A8.5A5.A13.A10.A3.A22.11A11.A5.A4.A4.A $16.A2.22A2.A2.A2.22A2.A2.A2.22A2.A2.A2.22A2.A4.A27.A8.64A3.21A10.A3. A25.A2.A15.A4.2A4.A4.A$16.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A2.A6.A13.A 2.A2.A2.A6.A13.A2.A4.A27.A95.A10.5A43.2A3.3A4.A4.A$16.A2.A6.A13.A2.A 2.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A2.A6.A13.A2.A4.A27.A95.A14.A43.6A 6.A4.7A$16.A2.A2.A2.3A7.A4.A2.A2.A2.A2.A2.3A7.A4.A2.A2.A2.A2.A2.3A7.A 4.A2.A2.A2.A2.A2.3A7.A4.A2.A4.A27.A53.43A14.8A36.A3.2A6.A4.A5.A$16.A 2.A2.A3.A4.5A.A2.A2.A2.A2.A2.A3.A4.5A.A2.A2.A2.A2.A2.A3.A4.5A.A2.A2.A 2.A2.A2.A3.A4.5A.A2.A2.A4.A27.A53.A62.39A3.A7.A4.A5.A$16.A2.A2.5A4.A 2.7A2.A2.A2.A2.5A4.A2.7A2.A2.A2.A2.5A4.A2.7A2.A2.A2.A2.5A4.A2.7A2.A4. A27.A53.A62.A41.A7.A2.A.A2.A2.A$16.A2.A11.A5.A2.A2.A2.A2.A11.A5.A2.A 2.A2.A2.A11.A5.A2.A2.A2.A2.A11.A5.A2.A2.A4.A27.A53.A9.51A2.A41.A7.12A $16.A2.A8.A2.A8.4A2.A2.A8.A2.A8.4A2.A2.A8.A2.A8.4A2.A2.A8.A2.A8.4A4.A 27.A53.A9.A48.2A2.4A5.30A3.4A7.A4.A2.A$16.A2.13A8.A5.A2.13A8.A5.A2. 13A8.A5.A2.13A8.A7.A27.A53.A9.A49.A4.2A5.A4.A17.A4.2A5.2A7.A7.A$16.A 11.A11.A5.A11.A11.A5.A11.A11.A5.A11.A11.A7.A27.A53.A9.A34.12A3.A5.3A 3.A4.A17.A5.A6.6A2.A7.A$16.A23.A5.A23.A5.A23.A5.A23.A7.A27.A53.A9.A 34.A10.A3.A6.6A2.5A13.5A3.A7.A3.A2.9A$16.A23.A5.A23.A5.A23.A5.A23.A7. A27.A53.A9.A34.A10.A3.A6.A7.A3.A13.A3.A3.A7.A3.A10.A$16.25A5.25A5.25A 5.25A7.A27.A42.12A9.A7.28A3.5A2.A3.A6.A7.A3.A13.A3.A3.A7.A3.A10.A$40. A29.A29.A29.A7.A23.5A42.A10.A9.A7.A30.A3.A2.12A7.A3.A13.A3.A3.9A3.4A 7.A$40.A29.A29.A29.A7.A23.A3.5A38.A10.A9.A7.A30.A3.A21.5A13.5A10.3A5. A7.A$40.6A24.17A2.12A29.A7.A23.A3.A3.A38.A10.12A6.A30.A3.A23.A17.A14. A5.3A5.A$45.A40.A2.A40.A7.A23.A3.A3.A38.A10.A5.A3.A7.A30.A2.2A23.A17. A14.A7.A5.A$45.A40.A2.A40.A7.A22.3A2.A2.3A37.A10.A5.A3.A7.A27.4A2.4A 17.7A10.14A6.A7.A5.A$45.7A34.A2.7A34.A4.4A23.A3.A3.A38.A7.A2.A2.A2.A 2.3A6.A19.5A3.A2.A2.A2.A17.A5.A10.A7.A4.A6.A7.A5.A$45.A4.12A7.13A.A2. A2.A4.12A7.13A.A2.A4.A26.A3.A3.A38.A4.13A3.A7.A19.A3.A3.A2.4A2.A17.A 5.A10.A7.A4.A6.A6.2A5.A$45.A4.A10.A7.A10.7A2.A4.A10.A7.A10.7A4.A25. 10A38.A4.A2.A5.A2.A3.A7.A16.4A3.5A8.A17.A5.A10.4A4.A2.5A4.A6.5A2.A$ 45.A4.A10.A7.A10.A2.A2.A2.A4.A10.A7.A10.A2.A2.A4.A26.A7.A38.A4.A2.A8. 5A7.A2.5A2.5A2.A2.A3.A3.A8.A3.7A7.A3.5A10.4A2.A2.A3.A4.A2.5A6.A$45.A 3.3A2.5A2.A7.A2.5A3.A5.A2.A3.3A2.5A2.A7.A2.5A3.A5.A4.A26.A7.34A5.A4.A 2.A8.A11.A2.A3.A2.A3.A2.A2.5A3.A7.2A3.A5.A7.A3.A3.A10.A2.A2.A2.A3.A4. A2.A3.A6.A$45.A4.A3.A3.A2.A7.A2.A3.A3.A5.A2.A4.A3.A3.A2.A7.A2.A3.A3.A 5.A4.A26.A39.2A5.A4.A2.10A11.4A3.4A3.4A10.A7.6A5.A7.A3.A3.A8.3A2.4A2. A3.A4.A2.A3.A6.A$45.A4.A2.3A2.A2.A7.A2.A2.3A2.A5.A2.A4.A2.3A2.A2.A7.A 2.A2.3A2.A5.A4.A26.A40.A5.A4.A11.8A4.A2.A3.A2.A3.A2.A9.2A7.A3.4A3.A7. A3.A3.A8.A10.5A4.A2.A3.A6.A$45.A8.A6.A7.A6.A9.A2.A8.A6.A7.A6.A9.A4.A 26.A40.A5.A3.2A18.A4.A2.5A2.5A2.A9.10A6.A3.A7.A3.5A8.A12.A6.A2.2A2.A 6.A$45.A8.A6.A7.A6.A9.A2.A8.A6.A7.A6.A9.A4.A26.A40.A4.2A3.10A10.A4.A 16.A9.A15.A3.A7.A5.A10.3A10.A6.A6.A6.A$45.17A7.18A2.17A7.18A4.A26.A 39.2A3.3A3.A8.8A3.A4.A16.11A15.A3.A7.A5.A12.A2.9A6.A6.A6.A$45.A15.A7. A16.A2.A15.A7.A16.A4.A26.A39.6A5.A15.A3.A4.A42.A3.A7.A3.5A10.A2.A7.A 6.A5.3A5.A$45.A15.A6.2A16.A2.A15.A6.2A16.A4.A17.10A39.A3.2A5.A15.A3.A 4.A42.A3.A7.A3.A3.A8.3A2.A7.A6.A6.A6.A$45.A4.12A6.16A2.A2.A4.12A6.16A 2.A4.A17.A48.A3.A6.9A7.A3.A4.A5.5A2.5A2.5A18.A3.A7.A3.A3.A8.A4.4A2.5A 4.A6.A6.A$45.A4.A9.2A6.A17.A2.A4.A9.2A6.A17.A4.A17.A48.A3.A14.A6.2A3. A4.A5.A3.A2.A3.A2.A3.A18.A3.A5.3A3.A3.A8.A7.A2.A3.A4.A4.10A$45.A4.A9. A7.A17.A2.A4.A9.A7.A17.A4.6A12.A48.A3.A14.A6.3A2.A4.A2.4A3.4A3.4A3.5A 14.A3.3A3.A5.5A8.A7.A2.A3.A4.A4.A$45.A14.A7.A13.5A2.A14.A7.A13.5A4.A 4.A12.4A14.32A3.11A4.A6.A4.A4.4A2.A3.A2.A3.A2.A3.A3.A14.A5.A3.A7.A10. 5A3.A2.A3.A4.A4.A$45.A14.10A12.A6.A14.10A12.A8.A4.A14.2A14.A43.7A2.5A 4.A4.A2.A2.5A2.5A2.5A3.A2.13A5.A3.5A3.A13.6A2.5A4.A4.A$45.12A3.A3.A3. A13.A6.12A3.A3.A3.A13.A8.A4.A15.9A6.A43.A3.A4.A3.A4.A4.A2.A24.A2.A10. 5A2.A6.9A10.A3.2A4.A6.A4.A$56.A2.3A2.A2.3A12.A17.A2.3A2.A2.3A12.A8.A 3.2A16.A6.A6.A43.A3.A4.A3.A4.A4.A2.A23.2A2.A14.A2.A6.A7.A10.A3.A5.A6. A4.A$56.A3.A3.A3.A13.A17.A3.A3.A3.A13.A8.A3.15A3.A6.A6.A4.40A2.3A3.2A 2.A4.A4.A2.A2.5A16.5A7.A6.A2.A6.A7.A10.A3.A5.A6.A4.A$56.A3.A3.A3.A13. A17.A3.A3.A3.A13.A8.A3.A4.A7.2A3.A5.2A6.A4.A38.A3.A8.A4.A4.A2.A2.A3.A 16.A11.A6.A2.A6.A5.8A5.A3.7A6.A4.A$56.A3.A3.5A13.A17.A3.A3.5A13.A8.A 3.A4.A8.5A5.5A3.A4.A38.A3.A8.A4.A4.A2.4A3.18A11.3A4.A2.A6.A5.A6.A5.A 16.A4.A$56.A3.5A17.A17.A3.5A17.A8.A3.A4.A11.4A3.A2.6A4.A22.5A11.A3.4A 5.A4.A4.A40.A4.A2.A6.A5.A6.A5.A16.A4.A$56.A7.A17.A17.A7.A17.A8.A3.A4. A14.A3.A2.A9.A22.A3.A10.2A3.A2.A4.3A3.A4.A40.A4.A2.A6.A5.4A3.A2.4A16. A4.A$56.A7.16A2.A17.A7.16A2.A8.A3.A4.A2.2A10.A3.A2.A9.A22.A3.A10.3A2. A2.A5.A4.A4.A33.5A2.A4.A2.A6.A7.6A2.A19.A4.A$56.A13.A8.A2.A17.A13.A8. A2.A8.A3.A4.A3.A10.A3.A2.4A6.A22.A3.A6.5A4.A2.A5.A4.A4.A12.6A8.4A3.A 3.A2.A4.A2.A6.4A4.A7.A19.A4.A$56.A13.A8.A2.A17.A13.A8.A2.A8.A3.A4.A3. A10.A3.A4.9A22.A2.2A6.A3.A4.A2.A5.6A2.3A12.A4.A8.A2.A3.A3.A2.A4.A2.A 8.7A7.A19.A4.A$56.A9.A2.3A2.A4.A2.A17.A9.A2.3A2.A4.A2.A8.A3.A4.5A10.A 3.A4.A27.4A2.4A4.A3.A4.A2.A5.A7.A14.A4.10A2.5A3.A2.A4.A2.A8.A13.A19.A 4.A$56.A9.A3.A3.A.A2.A2.A17.A9.A3.A3.A.A2.A2.A8.A3.A4.A14.A3.A4.A12. 5A2.5A3.A2.A2.A2.A4.A3.A4.A2.A5.A7.A8.8A22.2A2.A4.A2.A8.A13.A19.A4.A$ 56.A9.5A3.6A2.A17.A9.5A3.6A2.A8.A3.A4.A14.A3.A4.A12.A3.A2.A3.A3.A2.4A 2.A4.2A2.A4.A2.A5.A7.4A5.A5.A23.5A4.A2.A8.4A10.A19.A4.A$56.A19.A2.A2. A17.A19.A2.A2.A8.A3.A3.2A14.A3.A4.A2.5A2.4A3.4A3.5A8.A8.A4.A2.A5.A9. 2A5.A5.A2.5A2.5A2.5A2.A8.A2.A10.13A3.17A4.A$56.A22.4A17.A22.4A8.A3.A 3.12A4.A3.A4.A2.A3.A2.A2.A3.A2.A3.A3.A8.A8.A4.A2.A5.A10.3A3.A2.A2.A2. A3.A2.A3.A2.A3.A2.A8.A2.A10.A15.A6.A13.A$56.A22.A20.A22.A11.A3.A3.A9. 7A3.A4.4A3.4A2.5A2.5A3.A7.2A7.3A3.A2.A5.A11.15A3.4A3.4A3.5A7.A2.A8.3A 15.A6.A13.A$56.24A20.24A11.A3.A3.A9.A5.A3.A4.A2.A3.A2.A17.A7.7A3.A4.A 2.A4.2A3.5A3.A3.A3.A.A3.A3.A2.A3.A2.A3.A3.A7.A2.A8.A12.6A4.5A11.A$79. A43.A11.A3.A3.A.A7.A5.A3.A4.A2.5A2.A16.2A7.A5.A3.A4.A2.A4.6A2.2A3.A3. A5.A3.5A2.5A2.5A3.A7.A2.A8.A12.A9.A3.A11.A$79.A43.A11.A3.A3.7A3.A5.A 3.A4.A9.A16.10A5.A3.A4.A2.A2.3A3.2A3.5A3.A5.A24.2A7.A2.A8.A12.A9.A3.A 11.A$79.7A34.A2.A11.A3.A5.A3.A3.A5.A3.A4.A9.15A2.A14.A3.A4.A2.A2.2A4. A7.3A2.7A24.5A4.A2.A8.A10.5A7.A3.A11.A$85.A2.A5.5A11.5A3.6A7.5A3.A5.A 3.A3.A5.A3.2A3.A23.A2.A14.A3.6A2.A2.A5.A9.A8.A3.5A2.5A9.A3.A4.A2.A8.A 4.4A2.A3.A7.5A11.A$85.6A3.A3.A11.A3.A3.A.A2.A7.A6.3A4.A2.3A2.A5.A4.A 3.A23.4A14.A3.A7.4A3.3A9.A8.A3.A3.A2.A3.A2.8A3.A4.A2.A8.A4.A2.A2.A3.A 9.A13.A$85.A2.A.A2.3A2.A11.A2.3A2.A4.A7.A7.A5.A3.A9.A4.A3.A41.A3.A14. 2A10.A8.5A3.A2.A3.A2.A10.A4.A2.A8.A4.A2.A2.A3.A9.A13.A$85.A8.A19.A8.A 7.5A3.A5.A3.A9.A4.A3.A3.5A33.A3.A14.A8.4A16.4A3.4A10.A4.A2.A8.A4.A2.A 2.5A7.5A11.A$85.A8.A19.A8.A3.2A2.A3.A3.A3.13A3.A4.A3.A3.A3.A6.5A2.5A 2.5A8.A3.5A10.A8.A40.A4.A2.A8.A4.A2.A4.A9.A3.A11.A$85.16A7.16A3.A3.A 3.A3.A3.A3.A3.A3.A3.A4.A3.A3.A3.A6.A3.A2.A3.A2.A3.A8.A7.A10.A8.A40.A 4.A2.A8.A4.A2.A4.A9.A3.A11.A$85.A14.A7.A14.A3.A3.A3.A3.A3.A3.A3.A3.A 3.A4.A3.A3.A3.A3.4A3.4A3.4A3.5A4.A7.A10.A8.A12.5A13.5A5.A4.A2.A8.A4.A 2.6A9.A3.A11.A$85.A14.A6.2A14.A3.5A3.A3.5A2.3A2.A3.A3.A4.A3.A3.A3.5A 2.A3.A2.A3.A2.A3.A3.A3.2A7.A10.A8.A12.A3.A13.A3.A5.A4.A2.A8.A4.A7.A9. 5A11.A$85.A2.13A6.14A2.A3.A3.A3.A6.2A3.A3.A3.A3.A4.A3.A3.A7.A2.5A2.5A 2.5A3.A3.6A3.A10.A8.A9.4A3.4A3.5A2.A3.A5.A4.A2.A8.A4.A7.A11.A13.A$85. A13.2A6.A15.A3.A3.A3.A6.A4.A3.A3.A3.A4.A3.A3.A7.A24.A3.A4.A3.A10.A8.A 2.5A2.A2.A3.A2.A3.A3.A2.A3.A5.A4.A2.A8.A4.A5.5A9.A13.A$85.A13.A7.A15. A3.A2.2A3.A6.A3.6A3.A3.A4.A3.A3.A7.A23.2A3.A4.A3.A10.A8.A2.A3.A2.A2. 5A2.A3.A3.A2.A2.2A5.A4.A2.A8.A4.A5.A3.A5.8A10.A$85.9A5.A7.A15.A3.A2. 3A2.A6.A4.A7.A3.A4.A3.A3.A7.A2.5A16.6A4.A3.A10.A8.4A3.4A9.5A3.4A2.5A 2.A4.A2.A8.A4.A5.A3.A5.A6.A10.A$93.A5.10A14.A3.A2.A4.A6.A4.A7.A3.A4.A 3.A3.A7.A2.A3.A16.A3.4A2.A3.A10.A8.A2.A3.A2.A9.A3.A3.A2.A2.A3.A2.A4.A 2.A8.A2.3A5.A3.A5.A6.A10.A$93.A5.A3.A3.A15.A3.4A4.A6.A3.2A7.A3.A4.A3. A3.A7.4A3.18A6.A2.A3.A10.A8.A2.5A2.7A3.A3.A3.A2.4A3.A2.A4.A2.A8.A2.A 7.5A5.A4.5A8.A13.8A$93.A4.3A2.A2.3A14.A11.A6.A3.6A3.A3.A4.A3.A3.A38.A 2.A3.A10.A8.A15.A3.A3.5A9.A7.A2.A8.A2.A9.A7.A4.A3.A8.A13.A6.A$93.A5.A 3.A3.A15.A11.A6.A3.A4.A3.A3.A4.A3.5A38.A2.A3.A10.A8.A15.A2.2A16.2A7.A 2.A8.A2.A9.A7.A4.A3.A8.A13.A6.A$93.A5.A3.A3.A15.A11.A5.2A3.A4.A3.A3.A 4.A3.A26.5A6.6A2.A3.A10.A8.A15.A2.4A14.7A2.A2.A8.A2.A2.8A7.A4.A3.A8.A 11.5A4.A$93.A5.5A3.A15.A5.7A5.6A4.A3.A3.A4.A3.A26.A3.A6.A7.A3.A10.A8. A15.A2.A2.A14.A5.A2.A2.A8.A2.A2.A6.A7.A4.5A8.A11.A3.A4.A$93.A9.5A15.A 5.A9.3A3.2A4.A3.A3.6A3.A21.6A3.4A3.A7.A3.A10.A8.A15.4A2.16A5.A2.A2.A 8.A2.A2.A6.4A4.A6.A10.A11.A3.A4.A$93.A9.A19.A5.A9.2A4.A5.A3.A3.A4.A3. A2.5A5.5A4.A4.A3.A2.A3.A7.A3.A10.A8.A41.2A2.A2.A8.A2.A2.5A2.A2.A4.A6. A10.A11.A3.A4.A$93.A4.6A19.A4.2A9.A5.A5.A3.A3.A4.A3.A2.A3.A5.A3.A4.A 4.5A2.A3.A7.A3.A10.A8.A41.5A2.A8.A2.A5.5A2.A4.4A3.A10.A11.5A3.2A$93.A 4.A24.A4.12A5.A5.A3.A3.A4.A3.4A3.7A3.8A9.A3.A7.A3.A10.A8.A12.5A5.5A 14.A6.A8.A2.A5.A6.A6.9A7.A5.5A3.A5.4A$93.A4.A24.A4.A14.3A5.A3.A3.A4.A 3.A2.A3.A2.A2.A3.A2.A3.A9.A3.A7.A3.A10.A8.A12.A3.A5.A3.A6.9A6.A8.A2.A 5.A6.A6.A7.A7.A5.A3.A3.A5.A2.A$93.A2.28A4.A14.2A6.A3.A3.A4.A3.A2.5A2. A2.5A2.A3.A9.A3.A7.A3.A10.A8.A9.4A3.7A3.5A2.A6.4A4.A8.A2.A5.A4.5A4.A 7.A7.A2.4A3.11A2.A$93.A2.A6.A7.A7.A8.A14.A7.A3.A3.A4.A3.A9.A9.A2.2A9. A3.A7.A3.A10.A8.A9.A2.A3.A2.A2.A3.A3.A2.A9.A4.A8.A2.A5.A4.A3.A4.A5.8A 2.A2.A2.A3.A2.A9.A$93.A2.A6.A7.A7.A8.A14.A7.A3.A3.A4.A3.A9.A9.A2.9A2. A3.A7.A3.A10.A8.A9.A2.5A2.A2.5A3.A2.A9.A4.A8.A2.4A2.A4.A3.A4.A5.A6.A 2.A2.A2.5A2.A9.A$93.A2.A2.A2.3A2.A2.3A2.A3.A8.4A7.5A7.A3.A3.A4.A3.A3. 7A9.A2.A6.5A3.A7.A3.A10.A8.A9.A9.A10.A2.A4.6A4.A8.A4.5A4.A3.A4.A5.A6. A2.A2.A9.A9.A$93.A2.A2.A3.A3.A3.A3.A3.A8.A2.A7.A2.6A3.A3.A3.A4.A3.A3. A15.A2.A6.A7.A7.A3.A10.A8.A9.A9.A10.A2.A4.A3.4A2.A8.A4.A2.2A4.5A4.A5. 4A3.A2.A2.A8.2A9.A$93.A2.A2.5A3.A3.A3.A3.A8.A2.A2.3A2.A7.A3.A3.A3.A4. A3.A3.A15.4A5.2A7.A7.A3.A10.A8.A9.7A3.A2.6A2.A2.A4.A6.A2.A8.A4.A2.A7. A6.A7.6A2.A2.A8.9A2.A$93.A2.A10.5A2.3A2.A3.6A2.A3.A3.A7.A3.A3.A3.A4.A 3.A3.13A12.10A7.A3.A10.A8.A2.5A2.A5.A3.A2.A3.5A2.A4.A6.A2.A8.A4.A2.A 7.A6.4A4.A7.A2.10A6.5A$93.A2.A13.2A3.A3.A3.A3.2A2.A3.A3.A7.A3.A3.A3.A 4.A3.A15.A12.A7.4A5.A3.A10.A8.A2.A3.A2.A5.A3.A2.A3.A6.A4.8A2.A7.2A4.A 2.9A8.7A7.A2.A15.A$93.A2.A13.A4.A3.A3.A3.A3.9A7.A3.A3.A3.A4.A3.A15. 14A10.A5.A3.A10.A8.4A3.4A3.3A3.4A3.A6.A9.A4.A6.3A4.A19.A13.A2.A15.A$ 93.A2.A7.A5.A4.A3.A3.A3.A11.A2.3A2.A3.A3.A3.A4.A3.A3.5A31.A5.A3.A10.A 8.A2.A3.A2.A3.A11.2A6.A9.A4.A6.A6.A19.A13.A2.A15.3A$93.A2.20A3.A3.A3. A11.A3.A3.A3.A3.A3.A4.A3.A3.A3.A31.A5.A3.A10.A8.A2.5A2.A2.2A11.9A2.8A 4.4A3.A6.18A2.A13.A2.A2.5A10.A$93.A10.A9.6A3.A3.A11.A3.A3.A3.A3.A3.A 3.2A3.A3.A3.A3.4A2.4A2.17A5.A3.A10.A8.A9.A2.4A2.4A3.A10.A13.2A3.A22. 5A13.A2.A2.A3.A2.A7.A$93.A25.A3.A3.A11.9A3.A3.A3.A3.3A2.A3.A3.A3.A2.A 2.A2.A2.A21.A3.3A8.A8.A9.A2.A2.A2.A2.A3.A10.A14.A3.A22.A17.A2.4A3.8A 2.2A$93.A25.A3.A3.A19.A3.A3.A3.A3.A4.A3.A2.2A3.A2.4A2.4A21.A5.A8.A8.A 9.4A2.4A2.5A10.12A3.A3.A21.2A17.A5.A3.A2.A2.6A$93.27A3.A3.A8.A10.A3.A 3.A3.5A4.5A2.6A33.A5.A8.A8.A28.5A14.A3.A2.2A20.3A17.A5.5A5.A$119.A3.A 3.A5.15A3.A3.A16.A2.A29.6A2.2A5.A8.A8.A28.A3.A14.A3.A2.4A18.A19.A15.A $119.A3.A3.A5.A2.A14.A3.A16.4A29.A3.6A4.2A7.2A8.30A3.16A2.2A2.A2.A17. 2A18.2A14.2A$87.2A30.A3.A3.A5.A21.A49.A3.A9.4A5.4A57.5A2.A17.4A16.4A 12.9A$88.32A3.A3.A5.A21.A49.A3.A9.A2.A5.A2.A57.A6.A17.A2.A16.A2.A12.A 7.A$87.2A29.6A3.79A3.11A2.7A2.59A6.19A2.18A2.14A! golly-2.5-src/Patterns/Devore/Devore-rep.rle0000644000175100001440000034266012156145314015766 00000000000000# The Devore variation of the Codd self-replicating computer, # Devore, J. and Hightower, R. (1992) # Third Workshop on Artificial Life, Santa Fe, New Mexico, # Original work carried out in the 1970s though apparently never published. # Reported by John R. Koza, "Artificial life: spontaneous emergence of # self-replicating and evolutionary self-improving computer programs," # in Christopher G. Langton, Artificial Life III, Proc. Volume XVII # Santa Fe Institute Studies in the Sciences of Complexity, # Addison-Wesley Publishing Company, New York, 1994, p. 260. # # Zoom in on the left-hand end of the line to see the main machine. A step size # of 8^7 or higher will be needed, as replication takes 1.02E11 generations. # # See make-Devore-tape.py for the script that wrote the tapes for this machine, # and for more information about the encoding. See the other patterns in this # folder for information about the machine body. # # John Devore writes: (part IV) # "Where Codd used two read heads, one to read the program and a parallel one # to read the "marker" tape, I used a single head that could "look" either left # or right so read both. Also, as I recall I made my branches "relative" to the # current position and could branch forward or backward from the current # instruction. I think Codd used absolute addressing so had to go back to the # start of the program and count entry points to the address." # # I asked John: "You say you worked on an IBM 360/50 computer. Without a # monitor, is that right? So you would load your machine into memory and ask for # a printout after N iterations, or something like that? (I have heard about # such days but never experienced them.)" # # And John said: "Yes. I started with all 1's and 0's (which I printed as blanks # for readability) except for the injection signals on an injection head. I # printed a snapshot every 100 steps during sheathing (takes about 600 to # complete) and every 1000 to 5000 after that. Each snapshot was printed on 9 # sheets of wide (white -- really lost something on the standard green-bar # paper) band printer paper. I disabled page skips so only had to cut one edge # of two three-page sets and tape into the 3x3 with two strips of tape. I also # used 8-lines/inch instead of the standard 6 so almost had square cells -- # 10/inch across x 8/inch high. I still have a stack of printouts that have # never been trimmed and taped." # # Thanks to Ron Hightower and John Devore for getting us to the point where we # can run this pattern in Golly. Contact: tim.hutton@gmail.com # x = 106968, y = 244, rule = Devore 18.10A2.14A2.17A2.15A2.16A2.17A2.11A2.103A$18.A8.A2.A12.A2.A15.A2.A 13.A2.A14.A2.A15.A2.A9.A2.A101.A$14.5A8.4A12.4A15.4A13.4A14.4A15.4A9. 4A101.A$17.2A10.2A14.2A17.2A15.2A16.2A17.2A11.2A2.78A4.A16.A$17.A11.A 15.A18.A16.A17.A18.A12.A3.A76.A4.A16.A$14.4A8.4A12.4A15.4A13.4A14.4A 15.4A9.4A3.A76.6A16.A$14.2A10.2A14.2A17.2A15.2A16.2A17.2A11.2A4.2A2. 69A5.A21.A$14.A11.A15.A18.A16.A17.A18.A12.A5.A3.A67.A5.A12.10A$14.A 11.A15.A18.A16.A17.A18.A12.A5.A3.A67.A5.A12.2A6.5A$5.7A2.A5.4A2.A9.7A 12.7A11.6A6.9A2.A8.7A3.A7.6A5.A3.A13.5A5.5A5.5A23.8A4.A12.A10.2A$5.A 5.A2.A5.A2.A2.A9.A4.4A10.A4.4A9.A3.4A4.A7.A2.A8.A5.A3.A7.A3.4A3.A3.A 13.A3.A5.A3.A5.A3.A23.A6.A4.A12.A11.3A$5.A5.A2.A5.A2.A2.A4.6A7.A5.6A 7.A9.A6.A4.A7.A2.A8.A5.A3.A7.A6.A3.A3.5A3.7A3.7A3.7A3.14A10.A6.A4.A 12.A12.11A$6A5.A2.A5.A2.4A4.A3.4A5.A5.A3.4A5.A4.6A6.A2.5A4.2A2.A8.A4. 2A3.A7.A6.A3.A7.A3.A2.A2.A3.A2.A2.A3.A2.A2.A3.A6.A5.A10.A6.A4.A11.2A 3.5A4.A9.A$A3.4A3.A2.A5.A4.4A2.A6.A5.A5.A6.A5.A4.A3.4A4.A2.A3.A4.5A6. 5A2.6A5.5A4.A3.A7.A3.A2.A2.5A2.A2.5A2.A2.5A6.A5.A10.3A2.5A2.A11.6A2. 2A4.A9.A$A6.A3.A2.A5.A7.A2.A6.A5.A5.A6.A5.A4.A6.A4.A2.A3.A4.A2.4A4.A 3.A2.A3.5A2.A3.A4.A3.A7.A3.A2.A9.A9.A13.A5.A12.A2.A3.A2.A9.3A3.2A3.6A 9.5A92.22A$A6.A2.2A2.A3.5A5.A2.8A5.A5.8A5.A4.A6.A4.A2.A3.A4.A5.A4.A3. A2.A7.A2.A3.A4.A3.A3.5A3.A2.A9.A9.A13.A3.8A7.A2.A3.A2.A9.2A4.A8.3A4. 2A2.A3.A92.A20.A$8A2.5A3.A3.A5.A7.A7.A10.A7.A4.8A4.A2.5A4.A5.A4.A3.A 2.A7.A2.A3.A4.A3.A3.A7.A2.A6.4A3.7A4.6A3.A3.A6.A7.A2.A3.A2.A9.A5.A10. A4.A3.A3.A92.A20.A$5.A4.A7.A3.A5.A7.A7.A10.A7.A9.A6.A4.A6.A5.A4.5A2. 4A4.A2.5A4.A3.A3.A7.A2.A6.A6.A10.A3.6A3.A6.A5.3A2.5A2.11A5.A10.A4.A3. A3.A92.A3.9A$5.A4.A7.A3.A5.A7.9A10.9A9.A6.A4.A6.A5.A6.A7.A2.3A4.A6.A 3.A3.A7.A2.A5.2A5.2A10.A3.A3.2A3.4A3.A5.A6.A20.2A9.A4.5A3.A92.5A7.A9. A2.206A.A.23A.A.35A.A.33A.A.31A.A.35A.A.29A.A.22A.A.A.A.A.A.A2.2A.A. 2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A .A.4A.A.A.2A.A.4A.A.A.A.A.2A.A.3A.A.2A.A.A.A.2A.A.3A.2A.A.A.A.2A.A.4A .A.A.A.A.2A.A.4A.A.A.A.2A.A.3A.A.2A.A.3A.A.A.A.A.A.A2.2A.A.2A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.9A.A.A.9A.A. A.A.A.8A.A.2A.A.A.A.8A.2A.A.A.A.9A.A.A.A.A.9A.A.A.A.8A.A.2A.A.10A.A. 2A.A.A.A.A2.2A.2A.A.A.A.A.2A.2A.156A.A.5A.A.2A.A.A.4A.A.2A.A.A.A.A.4A .2A.A.A.A.A.5A.A.A.A.A.4A.A.2A.A.A.A.A.4A.A.2A.A.A.A.4A.2A.A.A.4A.A. 2A.A.A.A.A.A2.2A.2A.A.A.A.A.2A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.3A.3A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.A .A.A.3A.A.A.A.A.A.3A.A.A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A.A2.2A.2A.A.A .A.A.12A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.9A.A.A .9A.A.A.A.A.8A.A.2A.A.A.A.8A.2A.A.A.A.9A.A.A.A.A.9A.A.A.A.8A.A.2A.A. 8A.A.2A.A.A.A.A2.3A.A.A.A.A.A.A.2A.A.2A.138A.A.5A.2A.4A.A.2A.A.A.4A.A .2A.A.A.A.A.4A.2A.A.A.A.A.5A.A.A.A.A.4A.A.2A.A.A.A.A.4A.A.2A.A.A.A.4A .2A.A.A.4A.A.2A.A.A.A.A2.21A.A.A.A.2A.A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.3A.2A.A.2A.3A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.A.A. A.2A.2A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A2. 11A.A.5A.A.A.A.2A.A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.3A.2A.A.2A.3A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.A.3A.A .A.A.A.A.3A.A.A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A2.4A.2A.A.A.3A.A.A.A. 2A.2A.16A.A.2A.A.A.A.A.A.A.10A.A.2A.10A.A.2A.10A.2A.A.A.A.3A.2A.A.2A. 12A.2A.A.3A.14A.A.2A.A.2A.A.20A.A.12A.A.2A.A.A.15A.A.A.A.15A.A.A.2A.A .9A.A.2A.2A.A.15A.A.2A.A2.6A.A.2A.A.A.3A.A.A.A.2A.2A.3A.A.2A.A.2A.A.A .A.A.A.A.3A.2A.A.2A.3A.2A.A.2A.3A.2A.2A.A.A.A.3A.3A.9A.2A.2A.A.3A.2A. A.2A.2A.A.2A.A.2A.A.3A.2A.A.2A.2A.9A.3A.A.A.8A.2A.2A.2A.A.A.8A.2A.3A. A.A.2A.A.3A.A.3A.A.2A.2A.A.3A.A.2A.2A.A.2A.A2.23A.A.A.A.3A.A.A.A.2A. 2A.3A.A.2A.2A.A.A.29A.15A.15A.15A.11A.3A.3A.A.2A.2A.A.3A.2A.A.2A.2A.A .2A.A.2A.A.3A.2A.A.2A.2A.3A.A.3A.A.A.2A.2A.A.12A.A.2A.2A.2A.A.12A.2A. 2A.A.3A.A.3A.A.2A.2A.A.3A.A.2A.2A.A.2A.A2.3A.A.A.2A.2A.11A.4A.A.2A.A. A.2A.2A.3A.A.2A.2A.A.A.2A.A.2A.3A.A.3A.2A.A.3A.A.4A.2A.A.3A.A.4A.2A.A .3A.A.4A.2A.2A.A.3A.3A.A.2A.2A.A.3A.4A.2A.2A.A.2A.A.2A.A.5A.2A.10A.A. 4A.A.12A.2A.2A.A.2A.9A.2A.A.2A.2A.A.2A.9A.2A.2A.8A.A.3A.A.2A.2A.A.3A. A.2A.13A2.3A.A.A.2A.2A.4A.A.13A.A.2A.A.A.2A.A.11A.A.7A.2A.A.A.2A.A.2A .3A.A.10A.A.3A.A.11A.A.3A.A.11A.A.3A.A.4A.2A.2A.A.3A.2A.2A.10A.A.2A. 12A.A.12A.A.10A.2A.3A.2A.A.3A.2A.9A.2A.2A.2A.A.2A.3A.A.2A.A.2A.2A.A. 2A.3A.A.2A.A.9A.2A.2A.A.2A.2A.A.4A.9A.3A2.44A.A.2A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.11A.A.A.13A.5A.7A.A.A.2A.A.4A .2A.A.4A.A.A.A.2A.A.2A.2A.2A.A.A.A.3A.A.A.3A.A.A.2A.A.4A.2A.2A.A.3A. 2A.2A.3A.2A.A.12A.2A.A.4A.2A.2A.8A.A.3A.2A.3A.2A.A.3A.2A.3A.A.2A.2A. 2A.A.2A.3A.A.2A.A.2A.2A.A.2A.3A.A.2A.A.3A.2A.A.2A.A.2A.2A.A.4A.3A.A. 3A2.2A.A.2A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.3A.2A.A.5A.2A.6A.A.2A.A.2A.2A.5A.A.A.2A.A.4A.2A.A. 3A.2A.A.17A.2A.2A.A.A.A.3A.A.A.3A.A.A.2A.A.4A.11A.3A.2A.2A.3A.2A.A.3A .2A.A.2A.A.4A.2A.2A.2A.A.2A.2A.2A.3A.2A.A.3A.2A.3A.A.2A.2A.2A.A.2A. 16A.A.2A.2A.A.2A.16A.A.3A.A.2A.11A.2A.A.5A.A.4A.A.3A2.2A.A.2A.A.A.A.A .A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. 3A.3A.2A.2A.2A.2A.A.A.2A.A.2A.3A.A.A.2A.A.4A.2A.A.3A.2A.A.3A.A.3A.3A. 12A.2A.15A.9A.A.2A.A.3A.2A.A.3A.3A.2A.2A.3A.2A.A.3A.2A.A.2A.A.4A.2A. 2A.2A.A.2A.2A.2A.10A.A.3A.2A.16A.2A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A .2A.A.2A.3A.3A.10A.A.18A2.19A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.3A.3A.2A.2A.2A.2A.A.A.2A.A.2A.22A.A.11A.A. 7A.A.2A.3A.A.3A.13A.2A.2A.A.A.3A.A.3A.A.2A.A.3A.2A.A.3A.3A.2A.2A.10A. A.3A.2A.8A.A.11A.2A.2A.A.2A.3A.A.2A.2A.3A.A.3A.A.A.2A.2A.A.2A.2A.A.A. 2A.2A.A.2A.2A.A.2A.A.2A.3A.2A.2A.A.2A.2A.2A.A.2A.A2.2A.2A.A.10A.A.2A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.10A.2A. 3A.A.A.4A.A.2A.A.A.A.A.A.3A.A.2A.A.2A.3A.9A.5A.3A.2A.2A.A.A.4A.A.2A. 4A.A.2A.2A.A.3A.2A.A.3A.3A.3A.A.2A.2A.6A.A.3A.2A.A.3A.A.2A.A.2A.3A.A. 2A.2A.3A.A.3A.A.A.18A.2A.A.A.18A.2A.A.2A.A.2A.3A.2A.2A.A.2A.2A.2A.A. 2A.A2.2A.2A.A.4A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.3A.3A.2A.2A.4A.2A.12A.A.2A.A.A.A.A.A.3A.A.2A.A.2A.13A.A. 3A.3A.2A.A.9A.A.10A.8A.A.2A.2A.A.20A.3A.3A.A.3A.A.2A.A.3A.2A.A.3A.A. 2A.A.2A.10A.A.3A.2A.3A.14A.2A.9A.2A.2A.A.A.11A.2A.2A.A.A.2A.A.2A.10A. 2A.A.12A.A.2A.A2.2A.A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.3A.3A.2A.2A.16A.2A.A.A.A.A.A.A.10A.2A.2A.2A .A.A.3A.A.3A.3A.2A.A.3A.A.3A.A.3A.A.4A.2A.A.3A.A.2A.2A.A.3A.A.2A.A.A. 3A.2A.2A.10A.2A.2A.A.20A.A.2A.A.11A.A.3A.A.3A.2A.3A.2A.A.2A.2A.2A.3A. A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.8A.2A.3A.A.11A.2A.A.2A.A2.8A.A.2A.2A.A. 2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.4A. A.3A.A.2A.A.A.2A.2A.A.A.A.A.A.A.3A.2A.2A.2A.2A.A.A.17A.3A.2A.A.3A.A. 3A.A.3A.A.11A.A.15A.A.3A.A.2A.A.A.3A.2A.2A.3A.2A.A.7A.2A.A.A.3A.A.2A. A.4A.A.8A.2A.3A.2A.A.2A.2A.2A.3A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.A.2A. 2A.3A.A.2A.2A.A.2A.A.2A.A2.4A.A.2A.127A.A.A.A.A.A.A.A.A.A.A.2A.A.7A.A .3A.A.2A.A.A.2A.A.2A.12A.A.2A.A.A.3A.2A.2A.3A.A.A.A.A.A.A.3A.2A.A.3A. A.10A.A.A.A.A.A.2A.A.2A.A.A.3A.2A.2A.3A.2A.A.4A.A.A.A.3A.A.2A.A.4A.A. 2A.2A.A.3A.2A.A.2A.2A.2A.2A.2A.10A.A.2A.A.7A.10A.A.2A.A.A.13A.A.2A.A. 2A.11A.A2.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A. A.A.A.A.A.A.2A.2A.2A.A.3A.A.2A.A.A.2A.A.2A.2A.2A.2A.A.2A.A.A.3A.2A.2A .3A.A.A.A.A.A.A.3A.9A.A.A.A.A.A.A.A.8A.A.2A.A.3A.2A.2A.3A.2A.A.3A.2A. A.A.10A.2A.2A.A.17A.2A.A.3A.14A.2A.2A.2A.3A.2A.2A.A.A.3A.3A.3A.A.A.9A .3A.A.2A.A.2A.3A.3A.A2.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.3A.A.A.A.A.A.A.A.A.A.A.2A.2A.9A.30A.2A.2A.A.2A.A.A.10A.2A.2A.A.41A. 2A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.3A.2A.2A.10A.A.7A.A.9A.A.4A.2A.2A.3A .A.A.2A.2A.A.3A.A.2A.2A.A.2A.2A.3A.2A.2A.A.A.3A.3A.3A.A.A.3A.A.3A.A. 2A.A.2A.3A.3A.A2.38A.2A.10A.2A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A .A.A.A.A.2A.A.2A.A.A.3A.A.A.A.A.A.20A.2A.3A.A.2A.A.3A.A.2A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.3A.3A.A.3A.A.2A.A.3A.A.3A.A.4A.2A.2A. 3A.A.A.2A.2A.A.6A.2A.2A.2A.A.2A.2A.3A.2A.2A.A.A.3A.3A.3A.A.A.3A.A.3A. A.2A.A.2A.3A.3A.A2.8A.2A.A.A.A.A.2A.2A.3A.2A.2A.A.A.A.A.A.A.A.A.A.A.A .A.3A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.2A.2A.A.A.A.A.8A.2A.A.2A.2A.3A. A.2A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.3A.3A.A.3A.A .8A.A.3A.A.4A.2A.2A.2A.2A.A.10A.2A.A.2A.2A.2A.2A.A.2A.2A.10A.2A.A.A. 3A.11A.A.A.3A.15A.8A.A.12A.A2.2A.2A.A.A.A.A.A.13A.13A.A.A.A.41A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.2A.2A.A.A.2A.A.11A.2A.2A.A.4A .A.A.A.10A.A.2A.10A.A.2A.10A.2A.A.A.A.A.2A.A.2A.A.3A.6A.A.11A.A.9A.2A .2A.A.11A.2A.6A.A.2A.3A.2A.2A.A.18A.2A.3A.A.3A.A.A.A.2A.A.2A.2A.A.2A. A.A.3A.2A.A.2A.3A.A.2A.2A.2A.A.2A.A2.2A.A.2A.A.A.A.A.9A.A.A.A.3A.A.A. A.3A.A.A.A.A.A.3A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.10A.A.2A.2A.2A. A.A.2A.A.4A.2A.2A.2A.A.4A.A.A.A.3A.2A.A.2A.3A.2A.A.2A.3A.2A.2A.A.A.A. A.2A.A.2A.A.2A.A.2A.2A.A.4A.2A.A.3A.2A.A.2A.2A.2A.A.2A.A.2A.A.2A.3A. 2A.A.2A.9A.A.2A.2A.3A.A.3A.A.A.A.2A.A.2A.2A.A.2A.A.A.3A.2A.A.2A.3A.A. 2A.2A.2A.A.2A.A2.2A.A.2A.A.A.A.A.3A.A.A.A.A.10A.A.2A.A.3A.A.A.A.A.A. 3A.2A.A.2A.A.A.71A.A.3A.2A.A.3A.A.18A.2A.A.4A.2A.2A.2A.A.3A.A.2A.A. 11A.15A.15A.30A.A.3A.A.2A.A.2A.A.2A.2A.A.4A.2A.A.3A.2A.A.2A.2A.2A.A. 2A.A.2A.A.2A.3A.2A.A.2A.3A.A.A.2A.2A.17A.A.A.A.3A.11A.A.A.3A.2A.A.2A. 3A.8A.A.12A.A2.13A.A.A.A.2A.2A.A.A.A.8A.A.3A.A.2A.A.4A.A.2A.A.A.A.A. 3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.9A.16A.2A.5A.2A.A.4A.2A.2A .2A.A.3A.A.2A.A.3A.3A.2A.A.3A.A.4A.2A.A.3A.A.4A.2A.A.3A.2A.A.A.2A.A. 3A.A.2A.A.2A.A.2A.2A.A.4A.2A.A.29A.A.2A.A.2A.A.2A.10A.A.2A.2A.2A.A. 11A.A.3A.A.A.A.A.3A.3A.3A.A.A.3A.15A.2A.A.2A.3A.3A.A2.9A.3A.A.A.A.14A .2A.A.2A.A.2A.22A.A.2A.A.A.A.A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A .A.A.2A.A.4A.2A.A.4A.A.A.3A.2A.A.11A.2A.2A.A.3A.A.16A.10A.A.3A.A.11A. A.3A.A.11A.A.3A.2A.A.A.2A.A.3A.A.2A.A.3A.6A.A.11A.2A.A.2A.2A.A.A.A.A. 2A.2A.A.2A.2A.A.12A.A.4A.3A.A.3A.A.A.A.A.3A.3A.3A.A.A.3A.A.3A.A.2A.A. 2A.3A.3A.A2.3A.A.2A.2A.A.A.8A.2A.2A.2A.A.3A.A.A.A.A.2A.A.2A.A.A.A.A. 3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.2A.A.12A.A.A.A.3A.2A.2A.3A .A.2A.A.3A.A.3A.A.2A.2A.2A.A.A.3A.A.A.3A.A.A.2A.2A.A.A.2A.A.3A.A.2A.A .3A.3A.A.3A.A.A.2A.2A.A.A.A.A.2A.2A.A.3A.A.A.A.2A.A.4A.2A.2A.10A.2A.A .A.A.3A.3A.3A.A.A.3A.A.3A.A.2A.A.2A.3A.3A.A2.3A.A.12A.A.2A.2A.2A.A. 12A.A.4A.A.A.A.A.2A.A.2A.A.A.A.A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A .A.A.A.2A.2A.A.A.A.8A.A.4A.2A.2A.3A.A.2A.A.3A.A.3A.A.2A.2A.2A.A.A.3A. A.A.3A.A.A.2A.2A.A.A.2A.A.3A.A.2A.A.3A.3A.A.2A.2A.A.10A.A.2A.A.A.A.2A .A.14A.A.A.A.2A.A.4A.2A.2A.3A.2A.2A.A.A.A.3A.11A.A.A.6A.A.11A.2A.8A.A .12A.A2.2A.2A.9A.2A.A.2A.2A.A.2A.9A.2A.A.4A.A.A.A.A.2A.A.20A.A.3A.2A. A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.2A.A.3A.A.4A.2A.2A. 3A.8A.A.3A.A.3A.A.2A.2A.2A.A.A.3A.8A.A.16A.17A.2A.A.3A.A.2A.A.3A.16A. 2A.A.3A.2A.A.2A.A.A.A.2A.A.3A.2A.3A.A.A.A.2A.A.11A.2A.3A.2A.2A.A.A.A. 2A.A.2A.2A.2A.A.A.A.2A.A.4A.2A.2A.A.2A.2A.2A.A.2A.A2.2A.2A.3A.A.2A.A. 2A.2A.A.2A.3A.A.2A.A.4A.A.A.A.A.2A.A.3A.2A.A.3A.A.3A.2A.A.2A.A.A.5A.A .A.A.A.A.A.A.A.A.A.A.30A.A.3A.A.4A.2A.2A.12A.2A.2A.A.8A.2A.2A.A.A.3A. 2A.A.3A.A.2A.A.3A.3A.A.3A.2A.A.3A.A.2A.A.3A.A.A.2A.A.2A.A.3A.2A.A.2A. A.A.A.2A.A.3A.2A.3A.A.A.A.2A.2A.3A.A.3A.2A.2A.A.A.A.2A.A.2A.2A.2A.A.A .A.2A.A.4A.2A.2A.A.2A.2A.2A.A.2A.A2.2A.2A.3A.A.2A.A.2A.2A.A.2A.3A.A. 2A.A.4A.A.A.A.A.2A.A.3A.2A.A.3A.A.3A.29A.A.A.A.A.A.A.A.A.A.A.A.2A.2A. A.A.A.A.9A.3A.A.A.2A.2A.2A.2A.3A.2A.2A.A.A.10A.A.3A.A.2A.A.3A.3A.A.3A .2A.A.3A.A.2A.A.3A.A.A.2A.A.2A.A.3A.2A.A.2A.A.A.A.2A.A.3A.A.11A.2A.A. A.2A.2A.3A.A.10A.2A.A.A.A.14A.2A.A.A.A.2A.A.4A.2A.2A.8A.A.12A.A2.2A. 2A.16A.A.2A.2A.A.2A.16A.A.7A.2A.A.A.A.2A.A.5A.2A.10A.2A.2A.2A.A.A.A.A .3A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.4A.A.2A.3A.A.A.2A.2A.2A.2A.3A .3A.11A.A.A.2A.A.2A.9A.3A.9A.2A.A.3A.A.2A.A.3A.A.A.2A.A.2A.A.10A.A.2A .A.A.A.2A.A.3A.A.4A.2A.2A.A.A.12A.A.2A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A. 6A.A.11A.2A.2A.A.2A.3A.3A.A2.3A.A.2A.2A.A.A.2A.2A.A.3A.A.A.2A.2A.A.A. A.10A.2A.3A.2A.2A.2A.2A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.2A.A.11A.A. 12A.2A.A.2A.3A.A.A.2A.A.7A.A.8A.12A.A.4A.A.A.2A.A.2A.3A.A.3A.3A.A.2A. A.3A.A.2A.A.3A.A.A.2A.2A.A.A.2A.2A.A.A.A.A.2A.A.3A.A.4A.3A.A.A.A.2A.A .2A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.3A.A.3A.A.2A.A.2A.3A.3A.A2.3A.A. 2A.2A.A.A.2A.2A.A.3A.A.A.2A.A.2A.A.A.8A.A.3A.2A.3A.2A.2A.2A.2A.A.A.A. A.3A.A.A.A.A.A.A.A.A.A.A.A.2A.A.4A.2A.A.4A.3A.2A.A.2A.3A.A.A.11A.2A.A .2A.5A.2A.A.4A.A.A.2A.A.2A.3A.A.3A.3A.A.2A.A.3A.A.2A.A.3A.A.A.2A.2A.A .A.2A.2A.A.A.A.A.8A.A.4A.3A.A.A.A.3A.A.A.11A.A.A.A.A.10A.A.2A.A.A.3A. A.3A.A.2A.A.2A.3A.3A.A2.3A.14A.2A.A.19A.A.A.13A.A.2A.A.2A.2A.2A.3A.2A .2A.12A.2A.A.A.5A.A.A.A.A.A.A.A.A.A.A.A.9A.9A.10A.A.2A.2A.2A.A.A.A.3A .3A.A.3A.2A.A.4A.A.A.4A.2A.4A.A.2A.4A.A.10A.2A.A.3A.A.2A.A.3A.A.A.12A .A.2A.2A.2A.A.A.A.A.A.A.10A.2A.A.A.10A.2A.A.3A.3A.A.A.A.A.3A.2A.A.2A. A.A.17A.A.8A.A.12A.A2.3A.2A.A.2A.2A.2A.11A.2A.2A.A.A.9A.3A.A.2A.A.2A. 2A.2A.10A.A.10A.2A.A.2A.A.9A.A.A.A.A.A.A.A.A.13A.A.3A.2A.A.4A.3A.A.A. 14A.2A.A.3A.3A.A.3A.2A.A.25A.A.10A.8A.A.2A.3A.2A.A.3A.A.2A.A.2A.A.2A. A.A.A.2A.A.2A.3A.A.A.A.A.A.A.A.3A.A.A.A.3A.2A.2A.A.3A.3A.A.A.A.A.3A. 2A.2A.A.A.A.A.2A.A.2A.A.A.2A.2A.2A.A.2A.A2.3A.2A.A.2A.2A.2A.2A.2A.A. 2A.2A.A.A.3A.A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.A.A.13A.A. A.A.2A.2A.3A.A.10A.A.12A.A.A.A.A.2A.2A.A.3A.17A.2A.2A.A.A.A.2A.A.3A.A .4A.2A.A.3A.A.2A.3A.2A.A.3A.A.2A.A.2A.A.2A.A.A.A.2A.A.2A.3A.A.A.A.A.A .A.A.3A.A.A.A.3A.2A.2A.A.3A.3A.A.A.A.A.3A.2A.2A.A.A.A.A.2A.A.2A.A.A. 2A.2A.2A.A.2A.A2.3A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A.A.3A.A.3A.A.2A.A.2A .3A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.A.A.2A.2A.3A.A.A.A.2A.2A.3A.A.A.A.A.A .A.A.A.A.A.2A.2A.8A.A.2A.A.A.A.2A.2A.A.A.A.8A.A.11A.A.16A.2A.A.15A.A. 27A.A.3A.A.2A.16A.A.2A.A.A.A.A.3A.A.A.A.3A.2A.2A.A.11A.A.A.A.A.10A.2A .A.A.A.A.2A.A.2A.A.A.12A.A.2A.A2.3A.14A.2A.7A.10A.A.2A.A.2A.2A.10A.2A .2A.A.2A.10A.A.3A.2A.2A.2A.11A.A.28A.2A.2A.2A.11A.5A.3A.A.A.A.A.A.A.A .A.A.A.2A.2A.4A.2A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.2A.A.2A .A.A.A.2A.A.4A.A.A.A.2A.A.2A.A.A.A.A.3A.A.A.A.11A.A.A.2A.2A.A.A.A.A.A .3A.A.A.A.A.A.2A.A.2A.A.11A.2A.A.2A.A2.3A.A.3A.A.A.3A.3A.2A.A.2A.A.2A .2A.3A.2A.2A.2A.A.11A.A.3A.A.3A.2A.2A.2A.3A.2A.2A.8A.2A.A.A.A.A.13A. 13A.20A.A.13A.2A.A.A.A.A.2A.2A.2A.2A.29A.A.A.A.A.A.A.A.A.A.A.A.2A.A. 2A.A.2A.A.2A.A.A.A.2A.A.4A.A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.A.A.2A.A. 2A.A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.2A.2A.A.2A.A.2A.A2.6A. 2A.3A.A.A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.2A.A.4A.A.8A.2A.2A.2A.3A.2A. 2A.2A.A.2A.A.A.A.A.9A.A.A.A.3A.A.A.A.2A.A.3A.2A.2A.2A.A.A.A.A.2A.2A. 2A.2A.4A.A.2A.A.A.A.60A.2A.14A.A.27A.A.3A.A.4A.A.A.A.2A.A.2A.A.A.A.A. 2A.A.2A.A.A.A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.2A. 2A.A.2A.A.2A.A2.2A.2A.3A.A.A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.2A.A.4A.A .2A.2A.A.2A.2A.3A.2A.2A.2A.A.2A.A.A.A.A.3A.A.A.A.A.3A.A.A.A.2A.A.3A. 2A.2A.2A.A.A.A.A.2A.2A.5A.3A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A.2A.2A.A.A. 2A.A.2A.A.A.A.2A.A.3A.A.19A.2A.14A.A.2A.A.A.2A.A.2A.A.A.A.2A.A.2A.A.A .2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.A.2A.A.18A.A.2A.A2.19A.A.3A.10A.A.2A .A.2A.2A.10A.2A.2A.A.17A.2A.A.2A.2A.10A.2A.13A.A.A.A.3A.A.A.A.A.12A. 2A.A.2A.A.6A.2A.2A.A.A.A.A.2A.A.10A.3A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A. 2A.2A.A.A.2A.A.2A.A.A.A.2A.A.3A.2A.A.A.2A.2A.A.A.2A.A.2A.A.A.2A.A.2A. A.A.A.8A.A.2A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.2A.A.A.A.A.2A.A.2A.A 2.9A.A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.3A.A.3A.A.A.2A.2A.A.3A.A.2A.2A.9A. 3A.A.A.A.14A.2A.A.9A.2A.2A.A.11A.30A.A.3A.A.3A.A.12A.10A.2A.A.2A.A. 49A.A.19A.A.27A.A.3A.A.3A.2A.A.A.2A.2A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A. A.2A.A.2A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A.2A.2A.A.A.A.A.2A.A.2A.A2.3A. A.A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.3A.A.3A.A.A.2A.2A.A.3A.A.2A.2A.3A.A. 2A.2A.A.A.8A.2A.2A.2A.A.3A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A.2A.A.3A.A.3A .2A.A.A.3A.2A.2A.A.2A.A.3A.2A.A.A.A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A.2A. A.3A.A.19A.A.9A.2A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.2A.2A.A.A. A.A.A.3A.A.A.A.A.A.2A.2A.A.A.A.A.2A.A.2A.A2.2A.2A.A.10A.2A.3A.10A.A. 2A.A.2A.2A.10A.2A.2A.2A.A.10A.A.2A.2A.2A.10A.A.4A.A.12A.A.2A.2A.2A.A. 12A.A.4A.A.13A.A.2A.A.2A.A.A.A.A.2A.A.3A.A.3A.2A.A.A.3A.2A.2A.A.2A.A. 3A.2A.A.A.A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A.2A.A.3A.2A.A.A.2A.A.2A.2A. 2A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A .A.2A.2A.A.A.A.A.2A.A.2A.A2.12A.A.4A.2A.2A.3A.3A.2A.A.2A.A.2A.2A.3A. 2A.2A.6A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.A.3A.2A.9A.2A.A.2A.2A.A.2A.9A.2A .A.3A.2A.9A.3A.A.2A.A.20A.A.2A.A.3A.A.6A.A.A.3A.3A.10A.A.3A.A.37A.A. 19A.A.26A.2A.A.3A.2A.A.A.2A.A.2A.12A.A.20A.32A.A.3A.A.2A.A.2A.2A.A.A. A.A.A.3A.A.A.A.A.A.2A.2A.A.A.14A.A.2A.A2.2A.A.4A.2A.2A.3A.3A.2A.A.2A. A.2A.2A.3A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.A.3A.2A.3A.A.2A.A.2A. 2A.A.2A.3A.A.2A.A.3A.2A.3A.A.3A.A.2A.A.3A.2A.A.3A.A.2A.A.12A.A.A.4A.A .4A.3A.A.2A.A.3A.2A.A.A.A.A.2A.2A.A.A.2A.2A.A.A.A.3A.2A.A.19A.A.9A.2A .A.2A.2A.A.A.3A.A.A.A.A.A.2A.A.3A.A.2A.A.2A.2A.A.A.A.A.A.3A.A.A.A.A.A .2A.2A.A.A.2A.A.2A.A.A.A2.2A.A.4A.2A.2A.3A.3A.2A.A.2A.A.2A.2A.3A.3A.A .2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.A.3A.2A.3A.A.2A.A.2A.2A.A.2A.3A.A.2A. A.3A.2A.3A.A.3A.A.2A.A.3A.2A.A.3A.A.3A.A.3A.A.10A.A.12A.A.2A.A.3A.2A. A.A.A.A.2A.2A.A.A.2A.2A.A.A.A.3A.2A.2A.A.A.2A.A.2A.2A.2A.A.2A.2A.A.A. 3A.A.A.A.A.A.2A.A.3A.A.2A.A.17A.A.A.A.3A.A.A.A.A.A.2A.2A.A.A.2A.A.2A. A.A.A2.2A.A.11A.2A.3A.10A.A.2A.A.2A.2A.11A.A.2A.A.2A.10A.A.2A.2A.2A. 10A.A.3A.2A.16A.A.2A.2A.A.2A.16A.A.3A.2A.17A.A.2A.A.5A.2A.10A.2A.3A.A .9A.4A.A.3A.A.4A.A.10A.A.3A.A.25A.A.19A.A.18A.A.3A.2A.2A.A.A.2A.A.2A. 12A.A.19A.A.28A.A.2A.A.4A.A.A.A.A.3A.A.A.A.3A.A.A.A.A.A.2A.2A.A.A.2A. A.2A.A.A.A2.2A.2A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.2A.A.2A.A.2A.2A.A.2A.2A .A.3A.A.2A.2A.3A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.3A.A.2A.A.2A.A.A.10A.2A. 3A.2A.2A.3A.A.A.3A.3A.9A.A.3A.A.2A.A.3A.2A.A.A.2A.2A.A.A.3A.A.A.3A.A. 3A.18A.A.9A.2A.A.2A.2A.A.A.2A.A.2A.A.A.A.3A.A.2A.A.4A.A.A.A.A.3A.A.A. A.3A.A.A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A2.2A.2A.3A.A.2A.A.2A.2A.2A.A.A. 3A.A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.2A.2A.3A.A.2A.2A.A.A.2A.2A.A.2A. 2A.A.3A.A.3A.A.A.8A.A.3A.2A.3A.2A.2A.3A.A.A.3A.2A.2A.A.A.A.3A.A.2A.A. 3A.2A.A.A.2A.2A.A.A.3A.A.A.3A.A.2A.A.2A.A.A.2A.A.2A.2A.2A.A.2A.2A.A.A .2A.A.2A.A.A.A.3A.A.2A.A.4A.A.A.A.A.10A.A.2A.A.12A.2A.A.A.A.2A.2A.A.A .2A.A.2A.A.A.A2.13A.A.14A.2A.A.A.6A.A.12A.A.2A.A.13A.2A.A.6A.A.11A.A. 4A.14A.2A.A.18A.2A.A.3A.15A.A.2A.A.2A.2A.2A.3A.2A.2A.12A.2A.3A.2A.2A. A.A.A.2A.A.11A.A.3A.A.12A.5A.A.A.4A.A.2A.A.4A.A.2A.2A.A.2A.A.A.2A.A. 2A.12A.A.19A.A.20A.A.3A.A.2A.A.19A.A.2A.A.A.2A.2A.A.A.A.2A.2A.A.A.A. 2A.2A.A.A.2A.A.2A.A.A.A2.2A.2A.A.A.A.2A.A.2A.A.A.A.2A.A.4A.3A.A.2A.A. 3A.2A.3A.A.A.2A.A.4A.2A.A.4A.2A.A.2A.2A.2A.11A.2A.2A.A.A.3A.2A.A.2A. 3A.A.2A.A.2A.2A.2A.10A.A.10A.2A.2A.3A.5A.A.A.A.2A.A.4A.A.2A.A.4A.13A. A.10A.A.2A.10A.A.2A.2A.A.2A.A.A.5A.A.A.2A.2A.A.A.2A.2A.A.A.3A.A.3A.A. 2A.2A.A.A.2A.A.2A.A.A.2A.2A.A.A.A.2A.2A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A 2.2A.2A.A.A.A.2A.A.2A.A.A.A.2A.A.4A.3A.A.2A.A.3A.2A.3A.A.A.2A.A.4A.2A .A.4A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A.A.3A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A .2A.3A.A.2A.2A.13A.A.A.A.2A.A.4A.A.2A.A.4A.5A.6A.2A.3A.7A.3A.7A.2A.2A .19A.A.A.2A.2A.A.A.2A.2A.A.A.3A.A.3A.A.2A.2A.A.A.2A.A.2A.A.A.2A.2A.A. A.A.2A.2A.A.A.A.2A.2A.A.A.2A.A.2A.A.A.A2.11A.A.A.11A.A.A.A.2A.A.4A.3A .A.2A.A.3A.A.11A.2A.A.2A.A.4A.2A.A.4A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A.A .3A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.3A.A.A.3A.A.A.A.2A.A.3A.A. 11A.A.3A.2A.2A.2A.4A.2A.2A.2A.5A.2A.2A.5A.2A.2A.4A.A.4A.6A.2A.A.5A.A. A.5A.A.A.4A.A.2A.10A.A.19A.A.20A.17A.A.11A.A.A.5A.A.A.2A.A.2A.A.A.A2. 3A.3A.A.A.3A.2A.2A.A.A.6A.A.12A.A.2A.A.3A.A.4A.2A.A.2A.6A.A.11A.A.4A. 14A.2A.7A.10A.A.2A.A.3A.15A.A.2A.A.2A.10A.A.3A.2A.2A.2A.10A.2A.A.3A.A .A.A.2A.A.3A.A.4A.A.2A.2A.2A.A.2A.2A.2A.2A.A.2A.3A.2A.A.2A.3A.2A.2A. 3A.2A.2A.4A.2A.11A.A.11A.A.11A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A. 2A.A.A.2A.2A.A.A.3A.A.A.2A.A.2A.A.A.A2.3A.3A.A.A.3A.2A.2A.A.A.3A.A.2A .A.2A.A.2A.A.3A.A.4A.2A.A.2A.3A.A.2A.2A.3A.A.3A.A.A.3A.3A.2A.A.2A.A. 3A.A.3A.A.A.2A.A.11A.A.3A.A.3A.2A.2A.2A.3A.2A.2A.A.3A.A.A.A.2A.A.3A.A .4A.A.2A.2A.7A.17A.15A.3A.5A.3A.2A.A.2A.2A.2A.3A.6A.2A.3A.6A.2A.3A.6A .2A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.3A.A.A.2A.A. 2A.A.A.A2.3A.3A.A.A.3A.2A.2A.A.A.3A.A.2A.A.2A.A.8A.A.4A.2A.A.2A.3A.A. 2A.2A.6A.2A.3A.A.A.3A.3A.2A.A.2A.A.6A.2A.3A.A.A.2A.A.4A.A.8A.2A.2A.2A .3A.2A.2A.9A.A.A.A.2A.A.3A.A.3A.A.11A.A.2A.5A.A.A.4A.A.2A.A.5A.13A.3A .7A.12A.2A.4A.2A.2A.2A.4A.2A.2A.2A.4A.2A.A.5A.A.A.5A.A.A.5A.A.A.5A.A. A.5A.A.A.4A.A.2A.A.2A.A.2A.A.A.A2.11A.A.A.10A.2A.A.A.16A.A.2A.A.A.A. 10A.A.2A.17A.A.2A.2A.3A.A.A.3A.3A.2A.2A.A.A.2A.2A.3A.A.A.2A.A.4A.A.2A .2A.A.2A.2A.3A.2A.2A.3A.A.A.A.A.2A.A.3A.A.3A.A.3A.2A.A.A.2A.2A.A.A.3A .A.A.3A.5A.10A.2A.4A.A.2A.A.2A.A.2A.2A.2A.2A.A.2A.2A.2A.2A.A.2A.2A.2A .11A.A.11A.A.11A.A.11A.A.11A.A.10A.A.2A.A.2A.A.2A.A.A.A2.2A.2A.A.A.A. 3A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.2A.2A.A.19A.A.3A.10A.2A.A.A. 19A.A.2A.A.17A.2A.A.2A.2A.10A.2A.3A.A.A.A.A.2A.A.3A.A.3A.A.3A.2A.A.A. 2A.2A.A.A.3A.A.A.2A.2A.2A.2A.A.A.A.2A.A.2A.A.7A.17A.17A.13A.6A.2A.3A. 6A.2A.3A.6A.2A.3A.6A.2A.3A.6A.2A.3A.7A.A.2A.A.2A.A.A.A2.2A.2A.A.A.A. 3A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.2A.A.2A.9A.A.3A.A.2A.A.2A.2A .2A.A.A.9A.A.3A.A.3A.A.A.2A.2A.A.3A.A.3A.A.3A.A.A.A.A.2A.A.3A.A.3A.A. 3A.A.9A.2A.2A.A.9A.2A.2A.A.10A.5A.2A.2A.A.A.A.3A.A.A.5A.A.A.5A.A.A.4A .A.2A.A.2A.2A.4A.2A.2A.2A.4A.2A.2A.2A.4A.2A.2A.2A.4A.2A.2A.2A.4A.2A. 2A.2A.5A.A.2A.A.2A.A.A.A2.132A.A.2A.3A.A.A.3A.A.2A.A.2A.2A.2A.A.A.3A. A.A.3A.A.3A.A.A.2A.2A.A.3A.A.3A.A.3A.A.A.A.A.2A.A.3A.A.3A.A.3A.A.3A.A .3A.2A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A.2A.3A.18A.A.2A.2A.2A.A.A.2A.2A.A. A.2A.2A.A.A.2A.A.2A.A.2A.A.2A.2A.2A.2A.A.2A.2A.2A.2A.A.2A.2A.2A.2A.A. 2A.2A.2A.2A.A.2A.2A.2A.2A.A.2A.3A.A.2A.A.2A.A.A.A2.2A.2A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.10A.2A.3A.10A.A.2A.A.2A.2A.A. 10A.2A.2A.2A.A.10A.A.2A.2A.2A.10A.2A.3A.A.A.A.A.2A.A.3A.A.3A.A.3A.A. 3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.2A.A.A.4A.A.2A.2A.2A.A.A. 2A.2A.A.A.2A.2A.A.A.2A.A.2A.A.7A.17A.17A.17A.17A.17A.16A.A.2A.A.A.A2. 2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.12A.A.4A.2A.2A.3A. 3A.2A.A.2A.A.12A.A.4A.2A.2A.6A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.2A.3A.A.A. A.A.2A.A.3A.A.3A.A.3A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.2A.A.A .2A.A.2A.14A.2A.17A.2A.A.9A.2A.3A.A.A.5A.A.A.5A.A.A.5A.A.A.5A.A.A.5A. A.A.4A.2A.A.A.2A.A.2A.A.A.A2.132A.2A.A.A.2A.A.4A.2A.2A.3A.3A.2A.2A.A. A.A.2A.A.4A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.2A.3A.A.A.A.A.2A.A.3A .A.3A.A.3A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.2A.A.A.2A.A.2A.A.A.2A.A .2A.A.A.3A.2A.A.3A.A.3A.2A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A .2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.3A2.2A.2A.A.A.2A.A.4A.2A.2A.3A. 3A.2A.2A.A.A.A.2A.A.4A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.2A.3A.A.A. A.A.2A.A.3A.A.3A.A.3A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.2A.A.A.2A.A. 2A.A.A.2A.A.2A.A.A.3A.2A.A.3A.A.7A.A.3A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A .2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.3A2.18A.A.3A.A.11A.2A .3A.10A.2A.A.A.A.2A.A.12A.A.2A.A.2A.10A.A.2A.2A.2A.10A.2A.3A.A.A.A.A. 2A.A.3A.A.3A.A.3A.A.12A.2A.A.12A.2A.A.12A.3A.8A.2A.3A.8A.2A.3A.8A.2A. 3A.2A.A.3A.A.6A.2A.A.9A.2A.2A.A.9A.2A.2A.A.9A.2A.2A.A.9A.2A.2A.A.9A. 2A.2A.A.9A.2A.2A.A.9A.2A.2A.A.9A.2A.3A2.13A.A.A.A.A.A.2A.A.3A.2A.3A.A .2A.A.2A.3A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.3A.A.3A.A.A. A.A.2A.A.3A.A.3A.A.3A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.3A.2A.A.3A.2A.3A. 2A.A.3A.2A.3A.2A.A.3A.2A.3A.2A.A.4A.3A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A. 2A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A.2A.2A.A.3A.A.3A.2A.2A .A.3A.A.3A.2A.2A.A.3A.A.3A.2A.3A2.21A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A. 3A.A.A.A.A.A.2A.A.3A.2A.3A.A.2A.A.2A.3A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A .A.2A.2A.A.3A.A.3A.A.2A.A.2A.22A.A.3A.A.3A.A.3A.A.4A.3A.2A.A.4A.3A.2A .A.4A.3A.3A.2A.A.7A.A.4A.2A.A.7A.A.4A.2A.A.7A.A.4A.2A.A.4A.3A.2A.A.3A .A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A. 3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.3A.A.7A.A.4A2.2A.A.2A.A.2A.2A.2A.A .2A.A.A.A.A.A.30A.2A.34A.A.3A.A.14A.A.15A.A.A.A.A.12A.A.2A.A.2A.A.13A .2A.A.6A.A.11A.2A.2A.A.2A.4A.A.2A.A.A.2A.A.3A.A.3A.A.5A.A.4A.2A.A.5A. A.4A.2A.A.5A.A.4A.3A.2A.A.6A.3A.2A.A.6A.3A.2A.A.6A.3A.2A.A.12A.2A.A. 3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A.6A.2A.A.3A.A .6A.2A.A.3A.A.6A.2A.A.3A.A.6A.3A2.2A.A.2A.A.2A.2A.2A.A.2A.A.A.A.A.A. 2A.2A.A.A.A.A.8A.A.2A.A.A.A.2A.A.3A.2A.2A.2A.A.A.A.2A.2A.A.A.A.A.A.2A .A.2A.A.A.2A.A.3A.2A.3A.A.A.2A.A.4A.2A.2A.2A.A.2A.3A.A.A.A.2A.A.3A.A. 4A.A.11A.A.11A.A.11A.3A.3A.3A.3A.3A.3A.3A.3A.3A.2A.A.4A.3A.2A.A.4A.3A .2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A .A.4A.3A.3A2.2A.A.2A.A.12A.A.2A.A.A.A.A.A.2A.2A.A.A.A.A.2A.A.2A.A.A.A .A.2A.A.3A.2A.2A.2A.A.A.A.2A.2A.A.A.A.A.A.2A.A.2A.A.A.2A.A.3A.2A.3A.A .A.2A.A.4A.2A.2A.2A.A.2A.2A.A.2A.A.10A.A.3A.A.4A.A.2A.2A.A.A.2A.2A.A. A.2A.2A.A.3A.3A.3A.3A.3A.3A.3A.3A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A .2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.3A 2.12A.A.2A.A.A.A.A.A.A.A.A.3A.A.10A.A.2A.2A.A.2A.A.A.A.A.2A.A.3A.A. 12A.A.A.11A.A.A.A.A.11A.A.A.2A.A.3A.A.11A.2A.A.2A.A.4A.2A.2A.4A.2A.2A .A.2A.A.3A.A.2A.A.4A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.11A.3A.11A.3A.11A. 3A.2A.A.5A.A.4A.2A.A.12A.2A.A.12A.2A.A.12A.2A.A.12A.2A.A.12A.2A.A.12A .2A.A.12A.2A.A.12A.3A2.9A.2A.A.2A.A.A.A.A.A.A.A.A.3A.A.3A.2A.A.3A.A. 17A.2A.A.A.2A.A.3A.A.4A.3A.A.A.3A.3A.A.A.A.A.3A.3A.A.A.2A.A.3A.A.4A. 2A.A.2A.6A.A.11A.2A.7A.4A.2A.A.3A.A.2A.A.4A.A.18A.A.19A.A.12A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.A.10A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A. 3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.3A2.5A.A.2A.A.2A.A.A.A .A.A.A.A.A.3A.9A.16A.2A.4A.2A.A.A.2A.A.3A.A.4A.3A.A.A.3A.3A.A.A.A.A. 3A.3A.A.A.2A.A.3A.A.4A.2A.A.2A.3A.A.2A.A.2A.A.12A.2A.A.3A.A.2A.A.3A.A .2A.A.A.A.2A.2A.A.A.3A.A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.A.3A.A.3A. 3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A.2A.A.4A.3A. 2A.A.4A.3A.3A2.9A.A.55A.3A.2A.A.4A.2A.A.4A.A.A.2A.2A.A.A.2A.A.3A.A.4A .3A.A.A.3A.3A.A.A.A.A.3A.3A.A.A.8A.A.4A.2A.A.2A.3A.A.2A.A.2A.A.5A.2A. 2A.A.4A.A.2A.2A.A.3A.A.2A.A.A.A.2A.2A.A.A.3A.A.3A.4A.A.4A.3A.4A.A.4A. 3A.4A.A.4A.3A.3A.A.3A.A.4A.A.4A.2A.A.5A.A.4A.2A.A.5A.A.4A.2A.A.5A.A. 4A.2A.A.5A.A.4A.2A.A.5A.A.4A.2A.A.5A.A.4A.2A.A.5A.A.4A.3A2.2A.A.2A.A. A.A.A.A.A.A.A.A.A.11A.2A.A.12A.A.A.A.2A.2A.A.A.2A.A.3A.A.12A.A.A.11A. A.A.A.A.11A.A.A.A.A.10A.A.2A.17A.A.A.3A.11A.6A.2A.2A.A.3A.A.2A.A.A.A. 18A.A.10A.2A.2A.A.10A.2A.A.10A.2A.A.11A.10A.A.12A.A.11A.A.11A.A.11A.A .11A.A.11A.A.11A.A.11A.A.11A2.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A .A.A.8A.A.3A.2A.A.A.2A.A.3A.2A.2A.2A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A. A.A.A.2A.2A.A.A.A.2A.2A.A.A.2A.2A.A.2A.A.2A.2A.2A.2A.A.25A.A.2A.A.A. 2A.A.2A.3A.2A.2A.A.2A.A.2A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.3A.A.3A.A.2A. 2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A .2A.A2.48A.A.2A.A.A.A.A.A.2A.2A.A.A.A.2A.A.3A.A.3A.2A.A.A.2A.A.3A.2A. 2A.2A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.2A.2A.A.A.2A. 2A.A.4A.2A.2A.2A.2A.2A.A.A.A.2A.A.2A.A.A.2A.A.2A.3A.2A.2A.A.2A.A.2A.A .A.2A.A.2A.A.A.2A.A.2A.A.A.3A.A.3A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A .2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A2.9A.A.A.A.A.A.A.2A.A.2A .A.A.A.A.A.30A.A.3A.A.3A.2A.A.A.2A.A.3A.2A.138A.2A.A.A.2A.2A.A.7A.5A. 2A.2A.A.A.A.2A.A.2A.A.A.2A.A.2A.3A.6A.A.2A.16A.2A.19A.19A.9A.9A.18A.A .18A.12A.A.2A.2A.2A.A.A.6A.A.2A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A2.3A.A.A .A.A.A.A.A.2A.A.2A.A.A.A.A.A.2A.2A.A.A.A.A.8A.2A.A.A.2A.A.3A.2A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.13A.23A.19A.2A .A.2A.2A.A.2A.3A.A.A.A.3A.A.A.A.2A.A.2A.A.A.3A.A.3A.A.2A.A.2A.A.A.3A. A.A.2A.A.2A.A.2A.A.2A.16A.A.2A.2A.A.2A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A 2.3A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.2A.2A.A.A.A.A.5A.A.A.A.2A.A.3A. 2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.5A.3A. 4A.A.2A.A.2A.A.2A.A.A.3A.2A.A.2A.2A.A.2A.3A.A.A.A.3A.A.A.A.2A.A.2A.A. A.3A.A.3A.A.2A.A.2A.A.A.3A.A.A.2A.A.2A.A.3A.A.A.A.2A.A.2A.2A.A.2A.A. 16A.A.5A.2A.A.A.11A2.2A.A.2A.10A.2A.A.16A.A.14A.A.A.A.2A.A.11A.A.12A. 3A.A.2A.A.2A.2A.A.3A.2A.160A.2A.A.A.3A.2A.2A.2A.A.2A.A.2A.A.2A.A.A.3A .2A.A.2A.8A.A.17A.A.2A.22A.A.3A.A.2A.A.A.10A.A.4A.A.20A.A.4A.A.A.14A. A.4A.A.A.A.8A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.3A2.2A.A.2A.3A.2A.2A.A.3A. A.A.2A.2A.3A.A.A.A.2A.A.4A.2A.A.4A.3A.3A.14A.A.3A.A.3A.2A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.2A.2A.2A.A.2A.A. 2A.A.2A.A.A.3A.2A.A.2A.A.3A.A.A.3A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A. A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A .3A2.2A.A.2A.3A.2A.2A.A.3A.A.A.2A.2A.3A.A.A.A.9A.9A.11A.2A.A.3A.A.3A. A.3A.A.3A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.3A.2A.2A.2A.A.2A.A.2A.A.2A.A.A.3A.2A.A.2A.A.3A.A.A.3A.A.A.A.A.2A. A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A.A.A.A.A.2A.A.4A. A.A.A.A.2A.A.4A.A.A.A.A.3A2.2A.A.2A.3A.2A.2A.A.3A.A.A.5A.2A.2A.12A.A. 2A.3A.2A.A.4A.2A.2A.A.2A.A.2A.2A.A.3A.A.194A.12A.A.2A.A.2A.A.2A.A.A. 3A.13A.16A.A.14A.16A.A.14A.16A.A.14A.16A.A.14A.16A.A.14A.16A.A.14A. 16A.A.14A.17A2.2A.A.2A.4A.A.3A.2A.A.25A.2A.2A.2A.2A.2A.A.2A.10A.A.11A .2A.A.2A.A.2A.2A.A.3A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.3A.2A.2A.3A.3A.A.2A.A.3A.2A .3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A. A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.3A2.2A.A.11A.A. 10A.A.A.A.A.3A.2A.2A.2A.2A.3A.A.A.A.A.A.A.A.2A.A.2A.2A.A.3A.2A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. 4A.2A.A.A.3A.2A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A .3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A.A.2A.A.3A.2A.3A.3A .A.2A.A.3A.2A.3A.3A.A.3A2.2A.A.4A.2A.A.3A.A.4A.A.A.A.A.3A.2A.2A.5A.3A .A.A.A.A.A.A.A.4A.2A.2A.A.3A.A.2A.37A.A.A.A.A.A.A.A.A.125A.7A.A.A.3A. 2A.2A.4A.A.4A.A.2A.A.3A.2A.4A.A.4A.A.2A.A.3A.2A.4A.A.4A.A.2A.A.3A.2A. 4A.A.4A.A.2A.A.3A.2A.4A.A.4A.A.2A.A.3A.2A.4A.A.4A.A.2A.A.3A.2A.4A.A. 4A.A.2A.A.3A.2A.4A.A.4A.A.3A2.2A.A.4A.8A.A.4A.A.A.A.A.3A.15A.20A.A. 31A.2A.2A.A.3A.A.2A.2A.2A.A.A.A.A.3A.A.A.A.A.A.A.2A.A.3A.A.4A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.3A.A.A.3A.2A.A.9A.A.11A.A.3A.A .3A.A.9A.A.11A.A.3A.A.3A.A.9A.A.11A.A.3A.A.3A.A.9A.A.11A.A.3A.A.3A.A. 9A.A.11A.A.3A.A.3A.A.9A.A.11A.A.3A.A.3A.A.9A.A.11A.A.3A.A.3A.A.9A.A. 11A.A.4A2.2A.A.4A.A.A.3A.A.A.15A.A.A.3A.A.A.A.2A.A.3A.2A.A.A.A.2A.2A. 2A.A.3A.A.2A.2A.2A.A.A.A.A.3A.A.A.A.A.A.21A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.4A.2A.3A.A.A.3A.2A.A.2A.2A.A.5A.A.2A.2A.A.3A.A.2A.2A.A. 5A.A.2A.2A.A.3A.A.2A.2A.A.5A.A.2A.2A.A.3A.A.2A.2A.A.5A.A.2A.2A.A.3A.A .2A.2A.A.5A.A.2A.2A.A.3A.A.2A.2A.A.5A.A.2A.2A.A.3A.A.2A.2A.A.5A.A.2A. 2A.A.3A.A.2A.2A.A.5A.A.2A.3A2.2A.A.4A.A.A.3A.A.A.3A.A.A.A.A.3A.A.A.A. 2A.A.3A.2A.A.A.A.2A.2A.2A.A.3A.A.2A.3A.15A.A.3A.A.A.A.A.A.2A.A.3A.A. 3A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.11A.8A.2A.A.7A.4A.A.2A.A.3A.2A.A.2A .3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.2A.A.3A.A .2A.3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.2A.A. 3A.A.2A.3A.2A.A.2A.2A.A.3A.A.2A.3A.2A.A.2A.3A2.2A.A.4A.A.A.3A.A.A.3A. A.A.A.A.12A.2A.A.2A.A.6A.A.A.A.2A.2A.2A.A.3A.A.2A.13A.5A.A.30A.2A.2A. A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.3A.2A.A.4A.A.A.12A.A.2A.9A. 3A.7A.7A.2A.A.4A.7A.7A.2A.A.4A.7A.7A.2A.A.4A.7A.7A.2A.A.4A.7A.7A.2A.A .4A.7A.7A.2A.A.4A.7A.7A.2A.A.4A.7A.7A.3A2.2A.A.3A.A.18A.A.A.14A.2A.A. 9A.2A.2A.A.11A.A.A.A.12A.A.3A.2A.A.A.2A.2A.2A.A.2A.A.A.A.A.A.2A.2A.2A .A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.10A.A.4A.A.A.5A.16A.A.2A. 3A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A. 3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A. 2A.2A.A.3A.3A2.2A.A.11A.A.2A.2A.2A.A.8A.2A.2A.2A.A.3A.A.2A.A.2A.A.A. 2A.A.2A.A.A.A.A.2A.A.3A.2A.A.A.2A.2A.2A.A.2A.A.A.A.A.A.24A.A.2A.A.A.A .A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.2A.2A.A.A.2A.2A.A.A.2A.A.2A.3A.2A.2A.A .3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A. 2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A.2A.A.4A.2A.2A.A.3A. 3A2.3A.A.2A.A.2A.2A.2A.A.2A.2A.A.12A.A.4A.A.13A.A.2A.A.2A.A.A.A.A.2A. A.4A.A.10A.2A.38A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.A.2A .2A.A.A.2A.2A.A.A.2A.A.2A.2A.A.22A.2A.A.3A.A.22A.2A.A.3A.A.22A.2A.A. 3A.A.22A.2A.A.3A.A.22A.2A.A.3A.A.22A.2A.A.3A.A.22A.2A.A.3A.A.22A.3A2. 3A.A.2A.A.2A.2A.2A.A.2A.A.2A.9A.2A.A.3A.2A.9A.3A.A.2A.A.20A.A.2A.A.4A .A.3A.A.8A.2A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A .A.A.2A.2A.A.A.2A.2A.A.A.7A.3A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A. 3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A. 3A.3A.2A.A.4A.3A.3A.3A.3A2.3A.A.4A.2A.2A.2A.A.2A.A.2A.3A.A.2A.A.3A.2A .3A.A.3A.A.2A.A.3A.2A.A.3A.A.2A.A.4A.A.3A.A.2A.2A.A.A.A.A.A.31A.A.A.A .44A.2A.A.A.2A.A.23A.A.2A.A.3A.A.A.A.3A.2A.A.7A.A.3A.A.7A.A.3A.A.3A.A .7A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.7A.A.3A. A.3A.A.7A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.7A.A.3A.A.3A.A.7A.A.3A.A.7A .A.3A.A.3A.A.7A.A.3A.A.7A.A.4A2.18A.2A.2A.2A.A.2A.A.2A.3A.A.2A.A.3A. 2A.3A.A.3A.A.2A.A.3A.2A.A.3A.A.2A.A.4A.A.4A.A.2A.2A.A.2A.A.A.A.A.9A.A .A.A.3A.A.A.A.2A.A.2A.A.A.A.A.A.2A.2A.A.A.10A.A.2A.A.2A.A.2A.A.3A.A.A .A.3A.3A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A. 2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A. 3A2.2A.2A.2A.2A.A.2A.A.2A.16A.A.3A.2A.17A.A.2A.A.5A.2A.10A.2A.2A.A. 19A.A.2A.2A.A.2A.A.A.A.A.3A.A.A.A.A.10A.A.2A.A.2A.A.2A.A.A.A.A.A.2A.A .2A.A.A.A.2A.A.2A.A.2A.A.2A.A.3A.A.A.A.3A.3A.3A.3A.3A.2A.A.4A.3A.3A. 3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A. 3A.2A.A.4A.3A.3A.3A.2A.A.4A.3A.3A.3A.3A2.2A.A.11A.A.2A.2A.2A.A.2A.2A. A.3A.A.2A.A.2A.A.A.10A.2A.3A.2A.2A.2A.2A.A.A.2A.A.2A.13A.A.A.A.2A.2A. A.A.A.8A.A.3A.A.2A.A.4A.2A.A.A.A.A.A.2A.A.2A.A.A.A.2A.A.2A.A.2A.A.2A. A.3A.A.A.A.3A.3A.3A.11A.2A.A.4A.3A.11A.2A.A.4A.3A.11A.2A.A.4A.3A.11A. 2A.A.4A.3A.11A.2A.A.4A.3A.11A.2A.A.4A.3A.11A.2A.A.4A.3A.11A.3A2.2A.A. 4A.2A.A.2A.2A.2A.A.2A.2A.A.3A.A.3A.A.A.8A.A.3A.2A.3A.2A.2A.2A.2A.A.A. 3A.9A.3A.A.A.A.14A.2A.A.2A.A.2A.22A.2A.A.A.A.A.A.2A.A.2A.A.A.A.4A.A. 2A.11A.A.3A.A.A.A.3A.3A.10A.2A.A.2A.A.4A.10A.2A.A.2A.A.4A.10A.2A.A.2A .A.4A.10A.2A.A.2A.A.4A.10A.2A.A.2A.A.4A.10A.2A.A.2A.A.4A.10A.2A.A.2A. A.4A.10A.2A.A.3A2.16A.A.4A.2A.A.2A.18A.2A.A.3A.15A.A.2A.A.2A.2A.2A.3A .2A.2A.12A.A.2A.3A.3A.A.2A.2A.A.A.8A.2A.2A.2A.A.3A.A.A.A.A.2A.2A.A.A. A.A.A.34A.A.2A.3A.3A.A.3A.A.A.A.3A.2A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A .A.2A.A.3A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A.A.2A. A.3A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A.A.2A.A.3A.2A.A.2A.2A.A.3A2.3A.A. A.3A.2A.A.12A.2A.2A.A.A.3A.2A.A.2A.3A.A.2A.A.2A.2A.2A.10A.A.10A.2A.A. 2A.3A.3A.A.12A.A.2A.2A.2A.A.12A.A.4A.A.A.A.A.2A.A.2A.A.A.A.A.8A.A.2A. A.A.A.2A.A.2A.3A.3A.A.3A.A.A.A.3A.2A.2A.A.12A.A.3A.A.3A.2A.A.12A.A.3A .A.3A.2A.A.12A.A.3A.A.3A.2A.A.12A.A.3A.A.3A.2A.A.12A.A.3A.A.3A.2A.A. 12A.A.3A.A.3A.2A.A.12A.A.3A.A.3A.2A.A.12A.A.4A2.3A.A.A.10A.A.3A.2A.A. 2A.2A.A.A.3A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.2A.A.2A.3A.2A.2A.9A .2A.A.2A.2A.A.2A.9A.2A.A.4A.A.A.A.A.2A.A.20A.A.2A.A.2A.A.A.A.A.2A.A. 2A.3A.3A.A.3A.A.A.A.3A.3A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A .2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A. 4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.4A2.10A.2A.A.2A.2A.2A.2A.A.2A.2A.A.A .3A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.2A.A.2A.3A.2A.2A.3A.A.2A.A. 2A.2A.A.2A.3A.A.2A.A.4A.A.A.A.A.2A.A.3A.2A.A.3A.A.2A.2A.A.A.A.10A.A. 2A.11A.A.3A.A.A.A.3A.3A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A. 2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.3A.A.4A .A.A.A.2A.A.3A.A.4A.A.A.A.2A.A.4A2.2A.2A.A.2A.2A.7A.10A.A.2A.A.3A.15A .A.2A.A.2A.10A.A.3A.2A.2A.2A.11A.3A.2A.2A.3A.A.2A.A.2A.2A.A.2A.3A.A. 2A.A.4A.A.A.A.A.2A.A.3A.2A.A.3A.A.2A.2A.A.A.A.2A.A.2A.A.A.2A.A.2A.A. 3A.A.A.A.3A.3A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A. 3A.A.3A.A.4A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A.3A. A.3A.A.4A.A.A.2A.A.3A.A.3A.A.4A.A.A.2A.A.3A.A.4A2.2A.A.14A.A.3A.3A.2A .A.2A.A.3A.A.3A.A.A.2A.A.11A.A.3A.A.3A.2A.2A.2A.3A.3A.3A.2A.2A.16A.A. 2A.2A.A.2A.16A.A.7A.2A.A.A.A.2A.A.5A.2A.10A.2A.2A.2A.A.A.A.2A.A.2A.A. A.2A.A.2A.A.3A.A.A.A.3A.28A.A.3A.A.29A.A.3A.A.29A.A.3A.A.29A.A.3A.A. 29A.A.3A.A.29A.A.3A.A.29A.A.3A.A.29A.A.4A2.8A.A.3A.2A.3A.A.3A.3A.2A.A .2A.A.6A.2A.3A.A.A.2A.A.4A.A.8A.2A.2A.2A.3A.3A.3A.3A.A.2A.2A.A.A.2A. 2A.A.3A.A.A.2A.2A.A.A.A.10A.2A.3A.2A.2A.2A.2A.A.A.A.2A.2A.16A.A.2A.A. 3A.A.A.A.2A.A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A. 2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A. 2A.2A.A.A.2A.2A.A.3A2.2A.A.2A.2A.2A.3A.A.3A.3A.2A.2A.A.A.2A.2A.3A.A.A .2A.A.4A.A.2A.2A.A.2A.2A.3A.3A.3A.3A.A.2A.2A.A.A.2A.2A.A.3A.A.A.2A.A. 2A.A.A.8A.A.3A.2A.3A.2A.2A.2A.2A.A.A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.A.A. 2A.A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A. 2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.A.A. 2A.2A.A.3A2.2A.A.2A.2A.A.11A.2A.3A.10A.2A.A.A.19A.A.2A.A.17A.2A.A.2A. 2A.11A.3A.3A.14A.2A.A.19A.A.A.13A.A.2A.A.2A.2A.2A.3A.2A.2A.12A.A.2A.A .2A.2A.3A.A.2A.A.2A.A.3A.A.A.A.2A.A.2A.A.A.18A.2A.A.A.18A.2A.A.A.18A. 2A.A.A.18A.2A.A.A.18A.2A.A.A.18A.2A.A.A.18A.2A.A.A.19A2.8A.A.3A.A.4A. 2A.2A.2A.A.2A.2A.2A.A.A.9A.A.3A.A.3A.A.A.2A.2A.A.3A.A.2A.A.2A.3A.3A. 2A.A.2A.2A.2A.11A.2A.2A.A.A.9A.3A.A.2A.A.2A.2A.2A.10A.A.10A.2A.A.2A.A .2A.2A.6A.A.12A.A.3A.A.A.A.2A.A.2A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A .A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.2A.A.2A. A.A2.2A.A.3A.A.4A.2A.2A.2A.A.2A.2A.2A.A.A.3A.A.A.3A.A.3A.A.A.2A.2A.A. 3A.A.2A.A.2A.3A.3A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A.A.3A.A.3A.A.2A.A.2A. 3A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.2A.A.4A.3A.A.3A.A.A.A.2A.A.2A.A.A.3A.A .A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A.A.A.3A.A.A.A .A.A.3A.A.A.A.A.A.2A.A.2A.A.A2.8A.A.4A.2A.2A.3A.10A.A.2A.A.2A.2A.A. 10A.2A.2A.2A.A.10A.A.2A.2A.2A.11A.3A.3A.2A.A.2A.2A.2A.2A.2A.A.2A.2A.A .A.3A.A.3A.A.2A.A.2A.3A.A.2A.2A.3A.A.2A.A.2A.A.3A.A.2A.A.4A.3A.A.3A.A .A.A.2A.A.2A.A.A.18A.2A.A.A.34A.A.4A.A.A.A.A.A.18A.A.20A.A.A.A.A.A.2A .A.35A.2A.A.A.18A.A.2A.A.A2.8A.2A.10A.2A.3A.3A.2A.A.2A.A.12A.A.4A.2A. 2A.6A.A.2A.3A.2A.A.2A.2A.2A.3A.3A.3A.3A.14A.2A.7A.10A.A.2A.A.2A.2A. 10A.2A.2A.A.2A.10A.A.3A.2A.2A.2A.11A.A.3A.A.2A.A.4A.3A.A.3A.A.A.A.18A .A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A. 2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A2.3A.A.A. 3A.A.3A.3A.2A.2A.A.A.A.2A.A.4A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.3A.3A .3A.A.3A.A.A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.2A.A.11A.A.3A.A.3A.2A.2A. 2A.3A.3A.A.16A.A.12A.A.2A.A.2A.A.A.A.A.A.2A.A.2A.A.A.2A.A.2A.A.A.A.A. A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A .2A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A2.3A.A.A.3A.A.3A.3A.2A.2A.A.A.A.2A.A .4A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.3A.3A.6A.2A.3A.A.A.3A.3A.2A.A.2A .A.2A.2A.3A.2A.2A.2A.A.4A.A.8A.2A.2A.2A.3A.2A.2A.8A.2A.A.A.2A.A.2A.A. 2A.A.2A.A.A.A.A.A.2A.A.2A.A.A.11A.A.A.A.A.A.10A.A.12A.A.A.A.A.A.10A.A .12A.A.A.A.A.A.10A.A.12A.A.A.A.A.A.10A.2A.A.A.A.A.A2.2A.2A.13A.A.3A. 10A.2A.A.A.A.2A.A.12A.A.2A.A.2A.10A.A.2A.2A.2A.11A.2A.A.2A.2A.2A.3A.A .A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.2A.A.4A.A.2A.2A.A.2A.2A.3A.2A.2A.2A .2A.A.A.A.2A.A.2A.A.2A.A.2A.A.A.A.A.A.16A.2A.3A.3A.A.A.A.A.A.3A.2A.A. 4A.3A.A.A.A.A.A.3A.2A.A.4A.3A.A.A.A.A.A.3A.2A.A.4A.3A.A.A.A.A.A.3A.2A .2A.A.A.A.A.A2.6A.A.3A.2A.3A.A.2A.A.2A.3A.A.A.A.A.2A.2A.2A.A.2A.A.2A. 2A.A.2A.2A.A.3A.A.2A.A.2A.2A.A.2A.19A.A.3A.10A.A.2A.A.2A.2A.10A.2A.2A .A.17A.2A.A.2A.2A.10A.2A.2A.A.2A.A.12A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A. 2A.2A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A. A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A2.2A.A.3A.2A.3A.A .2A.A.2A.3A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.2A.A.2A.3A. 9A.A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.3A.A.3A.A.A.2A.2A.A.3A.A.3A.A.7A.A. 2A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.A.A.A.A.A.A.2A.A. 3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A .A.A.A.2A.2A.A.A.A.A.A2.8A.A.11A.2A.15A.A.A.A.A.12A.A.2A.A.2A.A.13A. 2A.A.6A.A.12A.3A.3A.A.A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.3A.A.3A.A.A.2A.2A .A.3A.A.2A.A.2A.A.3A.A.2A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.18A. 2A.A.24A.A.19A.2A.A.24A.A.19A.2A.A.24A.A.19A.2A.A.24A.2A.A.A.A.A.A2. 8A.2A.3A.2A.A.2A.A.2A.2A.A.A.A.A.A.2A.A.2A.A.A.2A.A.3A.2A.3A.A.A.2A.A .4A.3A.3A.2A.2A.A.10A.2A.3A.10A.A.2A.A.2A.2A.10A.2A.2A.2A.A.10A.A.2A. 2A.2A.11A.A.10A.A.3A.A.12A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.2A.A.2A.2A.A .2A.2A.A.A.2A.A.3A.2A.A.2A.2A.A.2A.2A.A.A.2A.A.3A.2A.A.2A.2A.A.2A.2A. A.A.2A.A.3A.2A.A.2A.2A.A.2A.2A.A.A.2A.2A.A.A.A.A.A2.2A.2A.A.3A.2A.A. 2A.A.2A.2A.A.A.A.A.A.2A.A.2A.A.A.2A.A.3A.2A.3A.A.A.2A.A.4A.3A.3A.12A. A.4A.2A.2A.3A.3A.2A.A.2A.A.2A.2A.3A.2A.2A.6A.A.2A.3A.2A.A.2A.2A.2A.3A .2A.2A.8A.A.3A.A.3A.A.4A.3A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.2A.A.5A.A. 2A.2A.A.A.2A.A.3A.2A.A.5A.A.2A.2A.A.A.2A.A.3A.2A.A.5A.A.2A.2A.A.A.2A. A.3A.2A.A.5A.A.2A.2A.A.A.2A.2A.A.A.A.A.A2.2A.2A.A.3A.3A.A.11A.A.A.A.A .11A.A.A.2A.A.3A.A.11A.2A.A.2A.A.4A.3A.2A.A.2A.A.2A.A.4A.2A.2A.3A.3A. 2A.A.2A.A.2A.2A.3A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.3A.2A.2A.2A.A.2A.2A. A.3A.A.4A.3A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.16A.A.18A.A.3A.A.3A.A. 16A.A.18A.A.3A.A.3A.A.16A.A.18A.A.3A.A.3A.A.16A.A.18A.A.3A.2A.A.A.A.A .A2.2A.2A.A.11A.A.3A.3A.A.A.A.A.3A.3A.A.A.2A.A.3A.A.4A.2A.A.2A.6A.A. 12A.2A.A.2A.A.2A.A.4A.2A.2A.3A.3A.2A.A.2A.A.2A.2A.3A.3A.A.2A.A.2A.3A. 2A.A.2A.2A.2A.3A.2A.2A.2A.A.2A.8A.A.4A.3A.A.3A.A.A.A.A.A.A.A.A.2A.2A. 2A.A.2A.A.3A.A.5A.A.A.2A.A.3A.A.2A.A.3A.A.5A.A.A.2A.A.3A.A.2A.A.3A.A. 5A.A.A.2A.A.3A.A.2A.A.3A.A.5A.A.A.2A.2A.A.A.A.A.A2.3A.A.A.2A.A.2A.A. 3A.3A.A.A.A.A.3A.3A.A.A.2A.A.3A.A.4A.2A.A.2A.3A.A.2A.A.2A.4A.2A.A.2A. A.11A.2A.3A.10A.A.2A.A.2A.2A.11A.A.2A.A.2A.10A.A.2A.2A.2A.10A.2A.2A.A .2A.A.A.11A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A.A.3A.A.A.2A.A. 3A.A.2A.A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A .2A.2A.A.3A.A.A.2A.2A.A.A.A.A.A2.3A.A.A.2A.A.2A.A.3A.3A.A.A.A.A.3A.3A .A.A.8A.A.4A.2A.A.2A.3A.A.3A.A.2A.2A.A.2A.2A.3A.A.2A.A.2A.2A.2A.A.A. 3A.A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.3A.A.6A.A.2A.A.A.2A.A.2A.A.3A.A.A .A.A.A.A.A.A.2A.2A.2A.A.2A.A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A.2A.2A.A.3A .A.A.2A.A.3A.A.2A.A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A.2A.2A.A.3A.A.A.2A. 2A.A.A.A.A.A2.22A.A.2A.A.11A.A.A.A.A.11A.A.A.A.A.10A.A.2A.17A.A.2A.2A .A.2A.2A.3A.A.2A.A.2A.2A.2A.A.A.3A.A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A. 2A.A.2A.A.2A.A.2A.A.A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.2A.A.21A. A.A.2A.A.3A.2A.A.21A.A.A.2A.A.3A.2A.A.21A.A.A.2A.A.3A.2A.A.21A.A.A.2A .2A.A.A.A.A.A2.2A.2A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A. 2A.2A.A.2A.2A.A.13A.A.14A.2A.A.A.6A.A.12A.A.2A.A.13A.2A.A.6A.A.12A.A. 26A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A. 2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A .A.A.2A.2A.A.A.A.A.A2.2A.2A.A.A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.A.A.2A.2A .A.A.A.3A.A.5A.A.A.2A.2A.A.A.A.2A.A.2A.A.A.A.2A.A.4A.3A.A.2A.A.3A.2A. 3A.A.A.2A.A.4A.2A.2A.8A.A.2A.2A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A .2A.2A.A.6A.A.3A.A.7A.A.2A.A.2A.A.3A.2A.A.6A.A.3A.A.7A.A.2A.A.2A.A.3A .2A.A.6A.A.3A.A.7A.A.2A.A.2A.A.3A.2A.A.6A.A.3A.A.7A.A.2A.A.2A.2A.A.A. A.A.A2.133A.A.2A.2A.A.A.2A.2A.A.A.A.2A.A.2A.A.A.A.2A.A.4A.3A.A.2A.A. 3A.2A.3A.A.A.2A.A.4A.2A.2A.2A.A.2A.A.2A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A .A.2A.2A.2A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A .2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A.A.A.2A.2A.A.A.A.A.A2.2A.A. 2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.11A.A.A.11A. A.A.A.2A.A.4A.3A.A.2A.A.3A.A.11A.2A.A.2A.A.4A.2A.2A.2A.A.2A.A.2A.2A. 2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A. 2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A.A.A.2A.A.3A.A.2A.A.3A.3A.3A .A.A.2A.2A.A.A.A.A.A2.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.2A.A.2A.A.3A.3A.A.A.3A.2A.2A.A.A.6A.A.12A.A.2A.A.3A.A.4A.2A.A.2A .6A.A.11A.2A.2A.A.9A.A.3A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A. 2A.A.3A.11A.A.A.2A.A.3A.A.2A.A.3A.11A.A.A.2A.A.3A.A.2A.A.3A.11A.A.A. 2A.A.3A.A.2A.A.3A.11A.A.A.2A.2A.A.A.A.A.A2.2A.A.2A.A.A.A.A.A.A.A.A.A. A.A.68A.A.2A.A.3A.3A.A.A.3A.2A.2A.A.A.3A.A.2A.A.2A.A.2A.A.3A.A.4A.2A. A.2A.3A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A. 2A.2A.A.2A.A.10A.2A.A.A.A.2A.A.3A.A.2A.A.10A.2A.A.A.A.2A.A.3A.A.2A.A. 10A.2A.A.A.A.2A.A.3A.A.2A.A.10A.2A.A.A.A.2A.2A.A.A.A.A.A2.17A.A.A.A.A .27A.2A.A.2A.2A.2A.A.A.A.A.A.A.3A.2A.A.2A.A.3A.3A.A.A.3A.2A.2A.A.A.3A .A.2A.A.2A.A.8A.A.4A.2A.A.2A.3A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.2A.A.2A.A .3A.A.A.A.A.A.A.A.A.2A.2A.3A.A.A.A.2A.2A.A.A.A.2A.A.4A.A.A.A.2A.2A.A. A.A.2A.A.4A.A.A.A.2A.2A.A.A.A.2A.A.4A.A.A.A.2A.2A.A.A.A.2A.2A.A.A.A.A .A2.3A.A.A.A.A.4A.2A.A.A.3A.2A.A.2A.2A.2A.A.A.A.A.A.A.3A.2A.A.2A.A. 11A.A.A.10A.2A.A.A.16A.A.2A.A.A.A.10A.A.2A.17A.A.8A.A.9A.2A.2A.A.2A.A .3A.A.A.A.A.A.A.A.A.2A.2A.3A.A.A.A.23A.2A.A.4A.A.A.A.23A.2A.A.4A.A.A. A.23A.2A.A.4A.A.A.A.23A.2A.2A.A.A.A.A.A2.2A.2A.12A.A.2A.2A.A.2A.A.A. 3A.2A.A.3A.A.4A.A.A.A.A.A.A.6A.A.3A.2A.A.A.2A.2A.A.A.A.3A.A.A.A.A.A. 2A.A.2A.A.A.A.A.2A.2A.A.A.A.3A.A.A.A.A.A.A.2A.A.2A.A.3A.A.A.A.A.A.A.A .A.2A.2A.2A.2A.A.A.A.A.A.A.3A.2A.A.3A.2A.A.A.A.A.A.A.3A.2A.A.3A.2A.A. A.A.A.A.A.3A.2A.A.3A.2A.A.A.A.A.A.A.3A.2A.2A.A.A.A.A.A2.2A.2A.2A.2A. 2A.A.2A.2A.A.2A.A.A.22A.2A.A.A.A.A.A.A.3A.2A.2A.A.A.2A.2A.A.A.A.2A.A. 2A.10A.A.2A.A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.3A.A.A.A.A.A.A.2A.A.2A.A.3A .A.A.A.A.A.A.A.A.2A.2A.2A.2A.A.A.A.A.A.A.3A.2A.A.3A.2A.A.A.A.A.A.A.3A .2A.A.3A.2A.A.A.A.A.A.A.3A.2A.A.3A.2A.A.A.A.A.A.A.3A.2A.2A.A.A.A.A.A 2.2A.2A.2A.2A.4A.2A.3A.A.A.A.A.2A.A.3A.2A.A.A.A.A.A.A.A.3A.2A.2A.A.A. 43A.128A.A.2A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.45A.A.3A.A.3A.A.45A.A. 3A.A.3A.A.45A.A.3A.A.3A.A.45A.A.3A.2A.A.A.A.A.A2.2A.2A.2A.2A.7A.4A.2A .A.A.A.A.A.A.A.A.A.A.A.A.A.10A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.3A .2A.A.A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A .A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A.3A.2A.A.A.A.A.A2.14A. 2A.3A.A.12A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.2A.A.2A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A. A.A.2A.2A.2A.A.3A.2A.A.A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A. 3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A.3A.A.3A.A.3A.2A.A.A.A.3A.A.2A.A.3A.2A .A.A.A.A.A2.2A.A.2A.2A.2A.3A.A.5A.3A.A.A.A.A.A.A.A.A.A.A.A.16A.A.2A.A .A.A.86A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A. 2A.2A.A.3A.2A.2A.2A.A.6A.A.3A.A.3A.A.3A.A.3A.A.3A.2A.2A.2A.A.6A.A.3A. A.3A.A.3A.A.3A.A.3A.2A.2A.2A.A.6A.A.3A.A.3A.A.3A.A.3A.A.3A.2A.2A.2A.A .6A.A.3A.A.3A.A.3A.2A.A.A.A.A.A2.2A.A.2A.2A.2A.2A.2A.A.3A.78A.A.2A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.2A.A.3A.A.3A.11A.2A.3A.2A.A.3A.A.3A.A .3A.A.3A.A.3A.11A.2A.3A.2A.A.3A.A.3A.A.3A.A.3A.A.3A.11A.2A.3A.2A.A.3A .A.3A.A.3A.A.3A.A.3A.11A.2A.3A.2A.A.3A.A.3A.2A.A.A.A.A.A2.2A.A.3A.A. 3A.3A.A.3A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A .A.A.A.A.A.A.A.2A.2A.2A.A.15A.A.3A.2A.10A.A.3A.A.3A.A.3A.A.15A.A.3A. 2A.10A.A.3A.A.3A.A.3A.A.15A.A.3A.2A.10A.A.3A.A.3A.A.3A.A.15A.A.3A.2A. 10A.A.3A.A.3A.2A.A.A.A.A.A2.24A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A. 2A.A.104A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A. A.A.2A.2A.2A.A.3A.A.3A.A.2A.2A.A.2A.A.A.2A.A.3A.A.3A.A.3A.A.3A.A.2A. 2A.A.2A.A.A.2A.A.3A.A.3A.A.3A.A.3A.A.2A.2A.A.2A.A.A.2A.A.3A.A.3A.A.3A .A.3A.A.2A.2A.A.2A.A.A.2A.A.3A.2A.A.A.A.A.A2.2A.A.3A.2A.2A.2A.A.9A. 60A.A.2A.8A.A.6A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.8A.A.2A.A.2A.A.3A.A .2A.A.2A.A.3A.A.9A.A.2A.A.2A.A.3A.A.2A.A.2A.A.3A.A.9A.A.2A.A.2A.A.3A. A.2A.A.2A.A.3A.A.9A.A.2A.A.2A.A.3A.A.2A.A.2A.A.3A.2A.A.A.A.A.A2.2A.2A .A.2A.2A.A.4A.A.2A.4A.2A.2A.A.2A.A.A.A.A.2A.2A.2A.A.2A.4A.2A.2A.2A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.26A.A.3A.A.2A.2A.A.2A.A. 26A.A.3A.A.2A.2A.A.2A.A.26A.A.3A.A.2A.2A.A.2A.A.26A.A.3A.2A.A.A.A.A.A 2.2A.2A.A.2A.A.14A.A.2A.A.2A.2A.A.2A.A.A.A.A.2A.2A.3A.6A.A.2A.3A.24A. 2A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .3A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.2A.A.2A.A.A.2A.A.2A.2A.A.2A.A .A.2A.A.2A.A.A.2A.A.2A.2A.A.2A.A.A.2A.A.2A.A.A.2A.A.2A.2A.A.2A.A.A.2A .A.2A.A.A.2A.2A.A.A.A.A.A2.18A.A.4A.2A.2A.A.3A.10A.2A.A.A.A.10A.A.14A .A.3A.2A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.2A .A.2A.2A.A.2A.A.A.A.A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.A.A.2A.A.2A.2A.A.2A .A.A.A.A.A.A.2A.2A.A.A.A.A.A2.2A.2A.A.A.3A.2A.2A.A.3A.3A.2A.2A.A.A.A. 3A.2A.2A.A.3A.A.3A.2A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.3A.A.A.2A.A.2A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A .A.A.A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.A.A.2A .A.2A.2A.A.2A.A.A.A.A.A.A.2A.2A.A.A.A.A.A2.2A.2A.A.A.3A.2A.2A.A.3A.3A .2A.2A.A.A.A.3A.2A.2A.A.3A.A.3A.2A.A.12A.56A.2A.A.3A.A.A.25A.A.A.A.A. A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.2A.2A.A.50A.A.2A.50A.A.2A.50A.A. 2A.50A.2A.A.A.A.A.A2.2A.2A.A.9A.19A.3A.2A.2A.A.A.A.3A.2A.2A.A.24A.A. 4A.3A.A.A.A.A.A.A.A.A.A.2A.2A.A.3A.A.A.2A.2A.A.A.3A.A.A.A.A.A.A.A.A.A .A.A.A.A.10A.A.2A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.2A.A.2A .A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A. A.A2.2A.2A.A.2A.A.2A.6A.2A.A.A.10A.2A.A.A.A.11A.A.A.A.A.A.A.3A.3A.A.A .A.A.A.A.A.A.A.2A.2A.A.3A.A.A.2A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A .11A.2A.A.2A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.2A.A.2A.A.A. A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A2. 2A.A.2A.6A.A.2A.2A.A.2A.A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.3A. 3A.A.A.A.A.A.A.A.A.A.3A.A.24A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.3A .3A.2A.A.2A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.24A.A.36A.A.A .A.A.A.A.A.12A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A.2A.2A.A.2A.A.2A. A.A.A.2A.A.2A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.4A.A.4A.A.A.A.A.A.A.A.A.A. 2A.2A.A.3A.2A.A.2A.2A.2A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.3A.3A.2A.A .2A.A.A.A.A.A.A.2A.2A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.3A.2A.A.A. A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A.2A.2A.A .3A.A.28A.2A.A.A.14A.A.2A.A.A.A.A.8A.A.10A.A.A.A.A.A.A.A.A.2A.2A.A.3A .2A.A.2A.2A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.6A.A.3A.A.7A.2A.A.A.A. A.A.A.2A.2A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.3A.2A.A.A.A.A.A.A.A. A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A.2A.2A.A.3A.A.2A. 2A.2A.2A.A.2A.2A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.2A.A.3A.A.3A.A.4A.10A.2A .A.A.A.A.A.3A.A.6A.A.3A.A.3A.A.3A.A.3A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A .A.A.3A.3A.2A.A.2A.A.A.A.A.A.A.8A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.14A.A. 3A.2A.A.A.A.A.A.A.A.A.A.A.15A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A. 5A.A.3A.A.2A.2A.2A.2A.A.2A.2A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.2A.A.9A.A. 4A.3A.2A.2A.A.A.A.A.A.2A.2A.A.3A.26A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A .3A.3A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.2A.A.3A.27A.2A.A.24A.2A.2A.A.3A.A. 3A.27A.2A.A.24A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.12A.A.2A.2A .10A.A.3A.2A.8A.2A.A.A.2A.A.2A.2A.A.2A.A.A.A.A.2A.A.2A.A.11A.8A.2A.A. A.A.A.2A.2A.A.3A.2A.A.3A.A.2A.2A.A.3A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A. A.20A.2A.A.A.A.A.A.A.A.2A.2A.14A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.2A.A. 15A.2A.A.A.2A.2A.A.2A.2A.A.A.2A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2. 3A.A.10A.A.3A.2A.3A.2A.A.3A.A.9A.2A.A.A.11A.2A.2A.A.15A.2A.A.2A.A.3A. 3A.2A.A.3A.A.11A.A.11A.A.3A.2A.A.10A.A.2A.A.2A.A.3A.2A.2A.A.2A.A.A.A. A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.2A.A.3A.A.3A.2A.A .A.2A.2A.A.2A.2A.A.A.2A.2A.2A.A.3A.A.3A.A.3A.2A.A.A.2A.2A.A.2A.2A.A.A .2A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.3A.A.3A.2A.A.3A.2A.3A.2A.A. 3A.A.3A.A.3A.2A.A.A.3A.3A.2A.2A.A.2A.A.2A.3A.4A.2A.A.3A.10A.A.3A.A.4A .2A.A.4A.2A.A.3A.A.2A.A.A.2A.A.2A.A.2A.A.3A.2A.2A.A.2A.68A.2A.A.2A.A. 2A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.3A.10A.A.3A.2A.A.2A.A.11A.A.8A.2A.A.3A .A.2A.3A.10A.A.3A.2A.A.2A.A.11A.A.8A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A 2.3A.A.3A.2A.A.3A.2A.3A.2A.A.9A.A.7A.A.2A.A.3A.3A.2A.2A.A.2A.A.2A.12A .2A.A.2A.2A.A.A.9A.9A.8A.A.2A.A.A.20A.A.3A.2A.2A.A.2A.5A.A.A.A.A.A.A. A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.3A.3A.2A.A.3A.2A.A.2A .A.4A.3A.2A.2A.2A.A.3A.A.2A.3A.3A.2A.A.3A.2A.A.2A.A.4A.3A.2A.2A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A2.3A.A.3A.2A.A.3A.2A.10A.2A.A.A.2A.A.2A.A. 3A.3A.2A.2A.A.3A.9A.2A.2A.A.5A.A.A.2A.A.4A.2A.A.4A.2A.A.3A.2A.16A.A. 2A.A.A.2A.2A.2A.A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A. A.A.2A.2A.2A.A.2A.2A.A.7A.A.3A.A.3A.2A.A.2A.A.3A.A.7A.A.3A.2A.2A.A.3A .A.2A.2A.A.7A.A.3A.A.3A.2A.A.2A.A.3A.A.7A.A.3A.2A.3A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A2.3A.A.2A.A.5A.A.4A.A.3A.A.A.A.2A.A.2A.A.11A.2A.2A.A.3A. 3A.A.21A.A.A.2A.A.11A.A.11A.A.3A.2A.3A.A.A.A.A.A.5A.2A.A.2A.2A.2A.A.A .A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.3A.A.A.3A.A.2A.2A.A. 3A.A.2A.A.2A.A.2A.A.4A.A.A.3A.A.2A.2A.A.3A.A.2A.A.2A.A.3A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A2.3A.A.3A.A.3A.A.2A.2A.A.A.6A.2A.A.A.2A.A.2A.2A.2A. A.3A.3A.A.A.A.A.3A.A.A.2A.2A.A.A.A.A.2A.2A.2A.2A.A.A.21A.4A.2A.2A.2A. A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.3A.A.A.3A.A.2A.2A .A.3A.A.2A.A.2A.A.2A.A.4A.A.A.3A.A.2A.2A.A.3A.A.2A.A.2A.A.3A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A2.3A.A.3A.A.3A.A.18A.A.4A.A.A.A.2A.A.2A.2A.2A.A. 3A.3A.A.A.A.A.22A.2A.A.A.A.A.2A.2A.3A.16A.A.2A.A.3A.7A.5A.A.A.A.A.A.A .A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.36A.2A.A.34A.A.37A.2A.A.35A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.A.2A.6A.A.2A.3A.A.2A.2A.A.2A.A.3A. 2A.A.A.11A.2A.2A.A.3A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.3A.3A.A.A.A. A.2A.A.2A.13A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.2A.2A.2A. 2A.A.A.A.A.2A.2A.A.3A.A.A.A.A.2A.A.3A.2A.A.A.A.A.2A.2A.A.3A.A.A.A.A. 3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.3A.A.3A.A.3A.A.2A.2A.A.2A.A.7A.A.2A .A.3A.3A.2A.2A.A.3A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.3A.3A.A.A.A.A. 2A.A.2A.5A.3A.A.A.A.A.A.A.A.A.A.A.A.A.20A.A.2A.A.A.A.A.2A.2A.2A.2A.A. A.A.A.5A.A.3A.A.A.A.A.2A.A.3A.2A.A.A.A.A.5A.A.3A.A.A.A.A.3A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A2.3A.A.3A.A.2A.2A.10A.A.9A.2A.2A.A.2A.A.3A.3A.2A. 2A.A.3A.3A.A.A.A.A.A.10A.A.11A.A.11A.A.2A.2A.2A.3A.2A.2A.A.19A.A.3A. 3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.2A.A.34A.A.24A .2A.2A.A.3A.A.34A.A.24A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.20A.2A. 2A.2A.3A.2A.A.3A.2A.A.2A.A.2A.A.3A.3A.6A.A.2A.3A.3A.A.A.A.A.A.3A.2A.A .4A.2A.A.4A.2A.A.2A.2A.2A.3A.5A.A.2A.A.2A.A.A.A.3A.3A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.2A.A.2A.A.A.A.A.3A.A.5A.A.A.2A. 2A.2A.A.3A.A.2A.A.A.A.A.3A.A.5A.A.A.2A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A2.2A.2A.2A.2A.3A.2A.A.3A.2A.A.2A.A.2A.A.10A.A.2A.3A.7A.2A.A.2A.A .A.A.11A.9A.9A.8A.A.3A.2A.2A.A.8A.A.2A.A.2A.A.A.A.3A.3A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.3A.A.A.A.12A.2A.2A.A.2A.A.A.A.A.2A.2A.A.3A.A.A.2A.2A .2A.A.3A.A.2A.A.A.A.A.2A.2A.A.3A.A.A.2A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A2.2A.2A.2A.2A.3A.2A.A.4A.10A.2A.A.A.2A.2A.A.3A.2A.A.2A.2A.A.2A. A.A.A.3A.3A.2A.A.4A.2A.A.4A.2A.A.9A.2A.2A.2A.3A.A.2A.2A.23A.64A.A.2A. A.A.A.9A.A.A.A.2A.2A.2A.2A.10A.2A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.2A.A. 11A.2A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2. 2A.2A.2A.2A.10A.A.13A.2A.A.A.A.3A.11A.2A.A.2A.26A.A.4A.10A.A.11A.A. 11A.A.3A.A.3A.2A.2A.2A.10A.A.15A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A .A.A.A.4A.A.2A.A.A.A.2A.2A.2A.A.2A.A.3A.A.A.A.20A.A.2A.A.A.A.3A.A.3A. A.A.A.20A.A.2A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.3A.A.2A. 2A.5A.2A.2A.A.A.19A.A.2A.A.11A.2A.A.A.2A.A.4A.A.A.A.A.A.A.A.2A.A.3A. 2A.2A.2A.3A.2A.2A.3A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.19A.A.A.A.A .2A.2A.2A.A.2A.A.2A.2A.A.A.A.3A.3A.3A.25A.A.2A.2A.A.A.A.3A.3A.3A.25A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.3A.A.2A.A.2A.3A.2A.2A.A.A.2A.2A. A.3A.A.2A.A.3A.A.2A.A.A.A.2A.A.5A.A.2A.A.A.A.A.A.A.2A.A.3A.2A.2A.2A. 3A.2A.2A.3A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.3A.A.2A.2A.A.A.A.A. 5A.2A.A.2A.A.3A.A.A.A.6A.A.3A.A.7A.A.3A.A.2A.A.A.A.A.3A.A.A.A.6A.A.3A .A.7A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.3A.A.2A.A. 2A.3A.2A.2A.A.A.2A.2A.A.3A.A.2A.A.4A.A.2A.2A.A.10A.2A.A.A.A.A.10A.A. 3A.A.3A.2A.2A.2A.2A.A.6A.6A.A.81A.2A.3A.A.3A.A.3A.31A.2A.A.2A.A.2A.2A .A.A.A.3A.3A.3A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.3A.3A.3A.2A.A.2A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.3A.A.15A.2A.A.2A.16A.A.2A.3A.A.2A. A.4A.A.2A.A.2A.A.A.2A.2A.A.A.A.A.3A.2A.A.3A.A.3A.2A.2A.2A.2A.A.2A.A. 3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.3A.A.4A.A.2A.3A.4A.2A.A.2A.2A. 3A.2A.A.2A.A.2A.2A.A.A.A.3A.3A.3A.2A.A.2A.A.A.A.A.2A.2A.A.A.A.3A.3A. 3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A. 2A.A.2A.3A.A.2A.A.2A.3A.A.2A.A.3A.2A.6A.A.2A.A.A.37A.8A.A.3A.2A.2A.2A .2A.A.2A.A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.2A.2A.3A.10A.A.2A.10A.A. 2A.A.2A.2A.3A.2A.A.2A.A.2A.2A.A.A.A.11A.3A.2A.A.2A.A.A.A.A.2A.2A.A.A. A.11A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A .A.A.2A.A.2A.3A.A.2A.A.2A.3A.A.2A.A.3A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A .A.2A.2A.2A.2A.2A.A.2A.9A.2A.A.2A.A.A.10A.2A.A.A.A.A.A.A.2A.2A.12A.A. 4A.8A.A.2A.A.A.2A.2A.3A.2A.A.2A.A.2A.A.2A.A.A.A.A.11A.2A.A.2A.A.A.A.A .2A.A.2A.A.A.A.A.11A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A. 2A.2A.2A.A.A.A.A.8A.A.4A.8A.A.2A.3A.A.2A.A.3A.2A.2A.2A.A.A.A.A.A.A.A. A.A.A.A.A.2A.2A.3A.6A.2A.2A.A.4A.4A.2A.A.A.3A.2A.2A.A.A.A.A.A.A.3A.A. A.2A.A.4A.2A.A.2A.A.A.A.2A.2A.3A.2A.A.2A.A.2A.A.2A.A.A.A.A.2A.2A.A.2A .A.2A.A.A.A.A.2A.A.2A.A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.A.13A.2A.A.3A.A.2A.A.3A.2A.2A. A.12A.A.A.A.A.A.A.A.A.A.A.2A.2A.2A.2A.2A.A.2A.2A.A.3A.A.7A.2A.A.A.3A. 2A.2A.A.A.A.A.A.A.3A.A.A.2A.A.4A.2A.2A.A.A.4A.A.3A.2A.3A.2A.A.2A.A.2A .A.33A.2A.A.2A.A.2A.A.A.A.A.2A.A.33A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.2A.A.2A.2A.9A.A.2A.A.3A.2A .2A.A.4A.3A.8A.A.2A.A.13A.A.A.A.2A.2A.2A.2A.2A.A.2A.2A.A.3A.2A.11A.A. 3A.2A.2A.A.A.A.A.A.A.3A.A.8A.A.4A.2A.2A.A.A.3A.2A.2A.3A.2A.A.2A.A.2A. A.3A.A.2A.A.2A.2A.A.A.A.2A.A.2A.A.A.A.A.2A.A.3A.A.2A.A.2A.2A.A.A.A.2A .A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A. 2A.A.14A.A.2A.A.2A.A.3A.2A.2A.A.4A.3A.2A.A.3A.A.2A.A.2A.2A.3A.A.A.A. 6A.A.13A.A.2A.2A.A.3A.2A.3A.3A.A.4A.A.3A.2A.A.A.A.A.A.A.18A.2A.3A.2A. 2A.A.A.3A.2A.2A.3A.2A.A.2A.A.2A.A.3A.A.2A.A.2A.2A.A.A.A.2A.A.2A.A.A.A .A.2A.A.3A.A.2A.A.2A.2A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.2A.A.A.A.2A.A.2A.A.2A.A.3A.2A.2A.A.4A. 10A.A.21A.2A.2A.A.2A.A.A.A.2A.2A.A.2A.A.2A.2A.A.3A.2A.3A.2A.2A.8A.A. 10A.A.A.A.A.A.A.A.A.2A.2A.3A.2A.2A.A.A.10A.2A.3A.2A.A.2A.A.2A.A.3A.2A .2A.A.7A.A.4A.A.A.2A.A.2A.A.A.A.A.2A.A.3A.2A.2A.A.7A.A.4A.A.A.2A.A.2A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.2A.A.A .A.2A.A.2A.A.2A.A.3A.2A.2A.A.5A.2A.A.A.A.A.A.A.16A.A.2A.A.2A.2A.A.2A. A.2A.2A.A.3A.2A.3A.2A.2A.2A.A.3A.A.3A.A.4A.10A.A.12A.A.A.A.2A.2A.3A. 2A.A.2A.A.A.A.2A.2A.3A.2A.A.2A.A.2A.A.3A.A.3A.4A.3A.3A.A.A.2A.A.2A.A. A.A.A.2A.A.3A.A.3A.4A.3A.3A.A.A.3A.A.A.A.A.A.A.6A.A.2A.A.A.A.A.A.A.A. A.A.A2.2A.2A.2A.2A.A.A.A.A.A.2A.2A.A.A.8A.A.2A.A.2A.A.3A.2A.10A.A.2A. A.A.A.A.A.A.2A.A.2A.2A.A.2A.8A.2A.A.2A.A.2A.2A.A.3A.2A.2A.A.5A.2A.2A. A.9A.A.4A.3A.2A.A.4A.3A.A.A.A.2A.2A.3A.2A.A.2A.A.A.A.2A.2A.3A.2A.A.2A .A.2A.A.14A.11A.A.A.2A.A.2A.A.A.A.A.2A.A.14A.11A.A.A.2A.A.2A.A.A.A.A. A.10A.2A.A.A.A.A.A.A.A.A.A.A2.2A.2A.35A.26A.2A.A.A.2A.A.3A.A.2A.A.2A. A.11A.A.11A.A.11A.A.3A.A.2A.2A.A.2A.5A.A.A.2A.A.2A.2A.A.3A.2A.2A.A.2A .A.2A.A.2A.A.11A.9A.8A.A.11A.A.3A.2A.3A.2A.A.2A.A.A.A.5A.3A.2A.A.2A.A .2A.A.3A.A.3A.2A.A.A.A.A.A.2A.A.2A.A.A.A.A.2A.A.3A.A.3A.2A.A.A.A.A.A. 3A.A.A.A.A.A.A.2A.A.3A.2A.A.A.A.A.A.A.A.A.A.A2.2A.2A.A.A.A.3A.A.3A.A. A.A.A.2A.2A.A.A.2A.A.3A.A.2A.A.2A.A.4A.2A.A.4A.2A.A.4A.2A.A.3A.A.3A.A .4A.6A.2A.A.A.2A.A.2A.2A.A.3A.2A.2A.A.2A.A.2A.A.2A.A.3A.3A.2A.A.4A.2A .A.3A.A.4A.2A.A.3A.2A.3A.2A.2A.25A.3A.2A.A.2A.A.8A.2A.A.A.A.A.A.A.2A. A.2A.A.A.A.A.8A.2A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.4A.2A.A.A.A.4A.A.4A.A .A.A.A2.2A.2A.A.A.A.3A.A.3A.A.A.A.A.6A.A.2A.A.2A.A.3A.2A.A.11A.9A.9A. 30A.A.2A.A.A.2A.A.2A.2A.A.4A.6A.2A.A.4A.2A.A.3A.10A.A.11A.A.10A.8A.2A .3A.15A.A.A.3A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.2A. 2A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.4A.A.2A.A.A.A.18A.2A.A.A2.2A.A.2A.A.A .10A.2A.13A.A.A.A.2A.A.2A.A.2A.A.3A.2A.A.3A.3A.2A.A.4A.2A.A.4A.3A.2A. 4A.3A.3A.11A.4A.2A.2A.A.3A.2A.3A.14A.2A.A.2A.A.2A.A.A.A.A.2A.A.4A.2A. A.3A.2A.3A.2A.A.2A.3A.A.A.3A.3A.2A.A.2A.A.A.48A.A.2A.A.A.A.A.A.48A.2A .A.A.A.A.A.A.A.3A.A.A.A.A.16A.2A.A.A2.2A.A.2A.A.A.3A.3A.A.A.3A.A.A.A. 2A.A.2A.A.2A.A.3A.2A.A.3A.10A.A.11A.A.12A.2A.A.2A.3A.3A.4A.A.13A.2A. 2A.A.3A.2A.3A.2A.A.2A.2A.2A.A.4A.2A.A.A.A.A.2A.A.11A.A.3A.2A.3A.2A.A. 2A.2A.2A.A.2A.4A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.4A.2A.A.A.A.A.6A.2A.A.A.A2.2A.A.2A.A.A.3A .3A.A.A.3A.A.A.A.2A.A.2A.A.2A.A.3A.2A.A.5A.A.A.A.A.A.A.A.2A.A.2A.3A. 11A.5A.6A.A.3A.A.3A.2A.3A.2A.A.2A.20A.2A.A.A.A.A.3A.A.A.2A.2A.3A.2A.A .2A.3A.15A.3A.2A.A.2A.A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.4A.2A.A.A.A.A.6A.2A.A.A.A2.2A.A.2A.A.A.3A.2A.2A .A.10A.2A.A.A.2A.A.2A.A.2A.A.3A.2A.11A.A.A.A.A.A.A.A.14A.A.7A.2A.A.2A .2A.4A.A.3A.A.3A.2A.3A.2A.A.2A.A.A.A.2A.A.32A.A.A.2A.2A.3A.2A.A.2A.3A .3A.2A.A.2A.3A.2A.A.2A.A.A.2A.A.3A.2A.A.A.A.A.A.A.A.A.A.A.14A.A.2A.A. A.A.A.A.A.A.A.A.5A.A.A.A.A.3A.2A.7A.A.2A.A.6A.2A.A.A.A2.2A.A.2A.A.A. 10A.2A.A.3A.2A.A.9A.2A.2A.A.2A.A.2A.A.3A.2A.3A.3A.A.A.10A.A.12A.2A.A. 2A.A.3A.A.A.2A.A.2A.2A.A.3A.A.14A.2A.A.2A.A.A.A.2A.A.3A.A.2A.A.A.A.A. A.A.3A.5A.2A.A.2A.3A.3A.2A.A.2A.3A.10A.2A.A.13A.10A.A.2A.A.A.10A.A.2A .2A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.4A.A.2A.4A.A.2A.A.A.A.3A.15A.A.4A.A. 2A.A.A.A2.2A.2A.A.A.A.3A.A.A.3A.2A.A.3A.A.3A.2A.2A.A.2A.A.2A.A.3A.2A. 3A.16A.A.4A.2A.A.4A.3A.2A.A.2A.A.3A.A.A.7A.8A.2A.A.3A.2A.A.2A.A.A.A. 8A.A.2A.A.A.A.A.A.A.3A.2A.2A.2A.A.2A.2A.A.7A.A.3A.2A.7A.A.2A.2A.A.2A. A.3A.4A.3A.2A.A.2A.A.A.3A.3A.12A.A.2A.A.A.A.A.A.A.A.A.A.6A.2A.6A.2A.A .4A.2A.3A.6A.9A.A.2A.4A.A.2A.A.A.A2.2A.2A.A.A.A.3A.A.A.3A.2A.A.3A.A. 3A.2A.2A.A.2A.A.2A.A.3A.2A.2A.2A.A.A.2A.A.4A.2A.A.4A.10A.A.2A.A.2A.2A .A.A.4A.A.2A.A.A.A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.3A.2A.2A.3A.A.A .3A.2A.A.2A.2A.2A.A.2A.2A.A.2A.2A.2A.A.7A.A.3A.A.2A.A.A.2A.A.7A.A.3A. 3A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.4A.4A.4A.5A.A.2A.8A.A.6A.7A.2A.A.2A.4A .A.2A.A.A.A2.2A.A.2A.A.A.10A.2A.A.10A.A.3A.A.3A.2A.2A.A.2A.A.2A.A.3A. 2A.2A.2A.A.A.9A.8A.2A.A.A.A.A.8A.A.2A.A.2A.A.2A.A.A.A.3A.3A.A.A.A.A.A .A.A.A.A.A.11A.3A.2A.2A.3A.A.A.3A.2A.A.2A.3A.10A.2A.A.2A.A.2A.A.2A.2A .A.A.A.A.A.2A.A.2A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.4A.A.4A.2A.A.2A.A.4A. 5A.6A.4A.2A.4A.2A.4A.A.2A.A.A.A2.2A.A.2A.A.A.3A.3A.A.A.2A.2A.2A.A.3A. 2A.2A.A.2A.A.2A.A.3A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.2A.2A .A.A.11A.2A.A.2A.A.10A.A.11A.A.12A.A.3A.3A.3A.2A.2A.3A.27A.3A.3A.2A.A .6A.2A.A.2A.A.2A.2A.A.A.A.A.A.2A.A.2A.A.3A.A.A.A.A.A.A.A.A.A.A.3A.2A. A.3A.2A.A.6A.A.3A.A.3A.2A.5A.4A.A.2A.2A.A.2A.A.A.A2.2A.A.2A.A.A.3A.3A .A.A.2A.2A.2A.A.3A.2A.2A.A.2A.A.2A.A.3A.2A.2A.2A.A.A.A.A.A.A.A.A.A.A. A.A.2A.A.2A.A.2A.2A.A.A.2A.2A.A.2A.A.2A.A.3A.2A.A.4A.2A.A.4A.3A.A.3A. 3A.3A.2A.2A.3A.3A.3A.3A.3A.3A.3A.3A.3A.32A.2A.A.32A.A.2A.A.A.A.A.A.A. A.A.A.7A.2A.6A.A.7A.6A.2A.5A.4A.A.2A.4A.2A.A.A.A2.2A.A.2A.A.A.3A.3A.A .A.12A.A.3A.2A.2A.A.2A.A.2A.A.3A.2A.2A.A.2A.10A.2A.A.A.A.11A.A.A.A.2A .A.2A.A.2A.2A.A.A.2A.2A.A.2A.2A.11A.9A.9A.9A.3A.3A.3A.2A.2A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.2A.A.2A.A.A.A.2A.2A.A.2A.A.2A.A.A.A.2A.A.2A.A.A.A.A .A.A.A.A.3A.4A.2A.4A.2A.A.7A.6A.A.2A.4A.A.5A.A.2A.4A.2A.A.A.A2.2A.A. 2A.A.A.11A.A.A.2A.2A.A.2A.2A.2A.A.2A.A.2A.A.3A.2A.2A.A.2A.3A.2A.2A.A. A.A.3A.3A.A.A.A.2A.A.2A.A.2A.2A.A.A.2A.2A.A.5A.3A.3A.2A.A.4A.2A.A.4A. 2A.A.12A.3A.3A.2A.2A.3A.3A.2A.A.7A.A.12A.3A.11A.2A.A.2A.A.A.A.5A.A.2A .A.2A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.4A.7A.2A.6A.A.5A.A.7A.2A.5A.A.2A. A.7A.2A.4A.2A.A.A.A2.2A.2A.A.A.A.2A.A.2A.A.A.2A.2A.A.2A.2A.2A.A.2A.A. 2A.A.3A.2A.2A.A.2A.3A.2A.A.12A.9A.9A.A.A.2A.A.2A.A.2A.2A.A.A.3A.13A. 3A.10A.A.11A.A.11A.A.3A.2A.A.3A.3A.2A.2A.3A.3A.3A.3A.5A.A.3A.3A.3A.2A .A.30A.A.26A.A.4A.A.A.A.A.A.A.A.A.A.10A.A.2A.5A.4A.5A.A.2A.7A.A.2A.6A .A.2A.2A.A.A.A2.2A.2A.A.A.A.3A.A.A.10A.A.2A.2A.2A.2A.A.2A.A.2A.A.3A. 2A.2A.A.2A.3A.2A.A.4A.3A.2A.A.4A.2A.A.3A.A.11A.A.3A.A.2A.A.2A.2A.A.A. 3A.2A.2A.3A.3A.A.A.A.A.A.A.A.2A.2A.A.3A.3A.2A.2A.3A.3A.3A.2A.2A.3A.A. 3A.3A.3A.3A.A.A.A.A.3A.A.4A.2A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.6A.A. 2A.4A.2A.8A.A.2A.6A.2A.A.7A.A.5A.A.A.A2.2A.2A.A.A.16A.A.2A.3A.2A.A.2A .2A.2A.2A.A.2A.A.2A.A.3A.2A.2A.A.2A.4A.A.3A.A.4A.3A.2A.A.11A.A.3A.A. 4A.2A.A.3A.A.2A.A.2A.2A.A.A.3A.2A.2A.3A.4A.A.2A.A.A.A.A.A.A.2A.2A.A. 3A.3A.2A.2A.3A.3A.13A.3A.A.3A.4A.A.4A.3A.A.A.A.A.2A.2A.A.2A.2A.A.A.A. 2A.2A.A.A.A.A.A.A.A.A.A.A.2A.2A.A.2A.A.2A.5A.A.4A.A.2A.A.4A.2A.A.3A.A .A.A2.2A.2A.A.A.3A.A.2A.A.2A.3A.2A.A.2A.2A.2A.2A.A.2A.A.2A.A.3A.2A.2A .A.11A.A.10A.11A.A.A.9A.8A.A.2A.A.2A.2A.A.A.3A.2A.2A.12A.2A.A.A.A.A. 10A.A.3A.2A.A.3A.3A.2A.2A.3A.2A.2A.A.2A.2A.3A.A.2A.A.7A.A.4A.3A.A.A.A .A.2A.2A.A.2A.A.2A.19A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A. A.A.A.3A.A.A.A2.2A.2A.A.A.3A.A.2A.A.2A.3A.2A.A.2A.6A.A.3A.A.2A.A.2A.A .3A.2A.2A.A.4A.2A.A.3A.A.4A.3A.3A.A.A.2A.A.4A.2A.A.3A.A.2A.A.2A.2A.A. A.3A.2A.A.10A.2A.2A.A.A.A.A.3A.2A.A.3A.2A.A.3A.3A.2A.2A.3A.2A.2A.A.2A .2A.3A.A.2A.2A.2A.A.4A.2A.A.2A.A.A.A.20A.A.2A.3A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A2.16A.2A.A.A.A.2A.A.2A.A .10A.2A.2A.A.2A.10A.2A.A.2A.A.3A.A.2A.A.2A.A.3A.2A.2A.A.4A.8A.A.4A.3A .3A.14A.A.11A.A.3A.A.2A.A.2A.2A.A.A.3A.2A.A.4A.A.37A.8A.2A.A.3A.3A.2A .2A.3A.2A.2A.A.5A.3A.A.2A.2A.9A.3A.A.A.A.A.3A.3A.2A.A.2A.2A.A.2A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.4A.A.2A.A.A2.3A.A.2A. 2A.A.A.A.2A.A.2A.A.3A.2A.2A.2A.2A.A.3A.A.A.2A.A.3A.A.2A.A.2A.A.3A.2A. A.3A.A.A.11A.3A.3A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.A.3A.A.2A.A.A.A. A.A.A.A.A.A.A.A.3A.3A.2A.2A.3A.3A.13A.3A.A.2A.A.2A.A.A.2A.A.2A.A.A.A. 6A.A.3A.A.7A.2A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.4A.2A.A.A2.3A.A.2A.2A.A.A.A.2A.A.2A.A.3A.2A.2A.2A.2A.A.3A.A.A.2A. A.3A.A.2A.A.2A.A.3A.2A.A.4A.2A.A.A.A.A.4A.A.4A.A.A.A.A.2A.A.2A.A.2A. 2A.A.A.3A.2A.A.3A.A.2A.A.A.A.A.A.A.A.A.A.A.A.11A.2A.2A.3A.3A.2A.2A.3A .3A.A.2A.A.2A.A.A.3A.A.A.A.A.3A.3A.2A.A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.8A.2A.A.A.2A.2A.A.A2.2A.2A.10A.A.2A.A.A.2A. A.2A.A.3A.2A.2A.2A.2A.A.16A.A.3A.A.3A.A.2A.A.2A.A.3A.A.15A.A.2A.A.A.A .8A.A.4A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.A.14A.A.10A.A.2A.A.A.A.A.A .A.A.3A.2A.2A.3A.3A.2A.2A.3A.4A.A.2A.2A.A.2A.A.A.3A.A.A.A.A.3A.3A.2A. A.2A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.14A.A.2A.A.A. 3A.A.A2.2A.2A.3A.2A.A.2A.A.A.2A.A.2A.A.10A.2A.2A.2A.A.3A.A.2A.A.3A.A. 3A.A.2A.A.2A.A.3A.A.3A.A.2A.2A.A.2A.A.A.A.2A.A.3A.A.4A.A.A.A.A.2A.A. 2A.A.2A.2A.A.A.3A.2A.2A.A.3A.A.3A.2A.A.2A.A.A.A.A.A.A.A.3A.2A.2A.3A. 3A.2A.2A.12A.A.2A.14A.A.2A.3A.A.A.A.A.3A.10A.A.2A.3A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.20A.A.2A.A.A.4A.2A.A2.2A.2A.3A.2A.A.2A.A.A. 2A.2A.A.A.3A.A.2A.2A.9A.A.2A.A.3A.A.3A.A.2A.A.2A.A.3A.A.3A.A.2A.32A.A .10A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.9A.13A.A.A.A.A.A.A.3A. 13A.3A.2A.2A.5A.7A.A.A.2A.A.2A.3A.A.A.A.A.11A.A.A.2A.A.2A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.10A.A.7A.A.2A.A.A.A.3A.A2.2A.2A.3A.2A.A. 2A.A.A.2A.2A.A.A.3A.A.2A.2A.2A.A.3A.A.11A.A.3A.A.3A.A.2A.A.2A.A.3A.A. 5A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.2A. A.4A.2A.2A.2A.2A.10A.A.2A.10A.A.4A.2A.2A.3A.3A.2A.A.2A.2A.2A.5A.A.A. 2A.A.2A.2A.2A.A.A.A.A.A.3A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.4A.A.2A.A.A.A .A.A.A.A.6A.A.2A.7A.A.A.A.A.4A.2A2.5A.10A.A.2A.A.A.2A.2A.A.A.3A.8A.2A .2A.A.11A.A.2A.2A.A.3A.A.2A.A.2A.A.11A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A. 2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.2A.A.11A.2A.2A.2A.3A.2A.A.2A.3A.2A. A.4A.2A.2A.3A.3A.2A.A.2A.2A.A.2A.3A.A.A.4A.2A.2A.2A.A.A.A.A.A.12A.2A. 3A.A.A.A.A.A.A.A.A.A.A.A.7A.A.A.A.A.A.A.A.7A.A.10A.A.2A.A.A.A.5A2.8A. A.2A.3A.10A.A.2A.2A.2A.A.19A.A.3A.A.2A.A.2A.2A.A.3A.A.2A.A.3A.A.2A.A. 2A.A.A.A.10A.A.2A.11A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.3A.A.A. 17A.15A.9A.2A.2A.3A.3A.2A.A.2A.2A.A.2A.24A.2A.3A.A.A.A.A.A.A.A.2A.2A. 3A.A.A.A.A.A.A.A.A.A.A.A.2A.A.3A.2A.A.A.A.A.A.A.6A.2A.A.7A.A.A.A.A.A. A2.2A.A.3A.A.2A.3A.3A.2A.A.2A.2A.2A.A.2A.2A.A.3A.A.3A.A.2A.A.2A.2A.A. 3A.A.2A.A.3A.A.19A.A.3A.2A.A.2A.3A.3A.A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A .2A.A.3A.3A.A.A.3A.2A.A.4A.2A.A.3A.A.4A.2A.A.4A.2A.2A.3A.3A.2A.A.2A. 6A.A.2A.A.A.A.2A.2A.3A.A.A.A.A.A.A.A.2A.2A.2A.A.2A.A.A.2A.A.2A.A.2A.A .2A.2A.8A.A.2A.2A.A.3A.A.A.3A.A.4A.A.2A.A.7A.A.A.A.A.A.A2.2A.A.24A.8A .A.3A.2A.A.2A.2A.A.2A.2A.10A.2A.2A.A.2A.2A.A.3A.A.2A.A.2A.2A.9A.A.2A. A.12A.15A.9A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.3A.A.A.3A.2A.A.11A .A.3A.A.11A.A.4A.2A.2A.3A.3A.3A.A.4A.A.2A.A.A.A.2A.2A.56A.A.4A.A.A. 10A.A.6A.6A.A.15A.2A.5A.A.6A.A.2A.11A.4A.2A.A.A.5A.A.A.A.A.A.A2.3A.A. A.2A.A.4A.2A.A.3A.A.3A.A.17A.A.2A.2A.2A.3A.2A.2A.2A.A.2A.2A.A.3A.A.2A .A.2A.2A.3A.A.A.2A.A.4A.3A.2A.A.3A.A.4A.2A.A.4A.A.A.2A.A.2A.A.2A.2A.A .A.3A.2A.2A.A.3A.3A.A.A.4A.A.4A.A.A.3A.A.A.3A.2A.2A.3A.3A.2A.2A.A.2A. A.2A.A.A.A.2A.A.2A.A.2A.2A.A.2A.2A.A.3A.A.2A.A.4A.A.A.4A.A.5A.A.7A.9A .7A.9A.2A.2A.2A.A.9A.4A.A.6A.2A.2A.A.A.5A.A.A.A.A.A.A2.3A.A.A.2A.A. 11A.A.3A.A.3A.A.4A.A.2A.A.2A.2A.2A.3A.2A.2A.2A.A.9A.A.3A.A.2A.A.2A.2A .3A.A.A.2A.A.4A.10A.A.3A.A.11A.A.4A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A. A.3A.2A.A.19A.A.4A.A.A.3A.A.A.3A.2A.2A.3A.3A.2A.2A.A.2A.A.2A.A.A.A.2A .A.2A.A.2A.2A.A.2A.2A.A.3A.A.2A.A.4A.A.A.4A.A.5A.A.2A.6A.3A.A.8A.2A. 2A.5A.A.4A.5A.A.5A.A.6A.2A.2A.A.A.5A.A.A.A.A.A.A2.3A.A.A.3A.A.A.2A.A. 3A.A.4A.A.2A.A.2A.2A.2A.3A.2A.2A.10A.2A.2A.A.2A.A.2A.2A.12A.2A.2A.A. 3A.2A.A.A.3A.A.A.3A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.3A.11A.A.2A.A. 4A.A.A.15A.3A.2A.2A.3A.3A.2A.2A.A.10A.2A.A.8A.A.2A.A.3A.2A.A.7A.A.3A. A.7A.A.3A.A.3A.A.4A.A.A.6A.A.5A.A.2A.4A.2A.4A.2A.4A.2A.3A.A.4A.A.2A. 6A.A.5A.A.6A.A.A.5A.A.A.A.A.A.A2.3A.A.A.4A.A.2A.A.2A.A.3A.A.4A.8A.A. 2A.2A.2A.10A.2A.4A.A.3A.2A.2A.A.2A.A.2A.A.10A.2A.2A.2A.A.3A.2A.A.A.3A .A.A.3A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.2A.2A.A.3A.A.2A.A.4A.A.A.A .A.3A.3A.2A.2A.3A.3A.3A.12A.A.3A.2A.A.2A.A.3A.A.2A.A.3A.3A.3A.3A.3A. 2A.A.3A.A.3A.A.2A.A.A.10A.A.2A.4A.A.2A.5A.4A.A.2A.2A.A.2A.4A.2A.A.11A .2A.2A.A.A.3A.A.A.A.A.A.A2.2A.A.19A.A.2A.A.2A.A.3A.A.13A.2A.A.3A.A.2A .2A.A.2A.A.3A.2A.2A.A.2A.A.2A.A.4A.A.2A.2A.2A.A.3A.A.13A.A.4A.15A.A.A .2A.A.2A.A.2A.2A.A.A.3A.2A.2A.A.2A.2A.A.4A.A.2A.9A.A.A.A.A.3A.3A.2A. 2A.3A.3A.3A.2A.2A.A.2A.A.7A.A.3A.A.3A.A.2A.A.3A.3A.3A.3A.10A.A.3A.A. 3A.2A.A.A.A.7A.A.4A.2A.5A.4A.A.2A.5A.7A.A.A.6A.2A.3A.A.A.3A.A.A.A.A.A .A2.11A.A.20A.A.3A.2A.A.2A.2A.9A.A.2A.2A.A.2A.A.3A.2A.2A.A.2A.A.2A.A. 4A.A.2A.2A.2A.A.12A.2A.A.4A.2A.A.2A.2A.A.11A.A.3A.A.2A.A.2A.2A.A.A.3A .2A.2A.A.21A.A.A.A.27A.3A.2A.2A.3A.3A.3A.2A.2A.A.3A.3A.2A.A.14A.2A.A. 7A.A.11A.2A.A.A.2A.A.3A.A.2A.A.A.A.6A.A.2A.4A.A.2A.4A.A.6A.A.4A.A.7A. 2A.A.A.6A.2A.4A.2A.A.3A.A.A.A.A.A.A2.3A.A.A.A.A.2A.A.3A.2A.A.14A.A.2A .A.18A.A.3A.2A.4A.2A.A.2A.A.17A.2A.3A.A.3A.2A.A.4A.2A.A.2A.2A.A.4A.2A .A.3A.A.2A.A.2A.2A.A.A.3A.2A.A.2A.8A.2A.A.3A.A.A.A.3A.A.A.A.A.3A.2A. 2A.3A.3A.3A.2A.2A.A.3A.3A.2A.A.6A.3A.3A.3A.4A.2A.A.A.A.2A.A.3A.2A.A. 3A.A.6A.A.2A.5A.A.2A.A.8A.A.4A.8A.3A.A.7A.A.4A.A.2A.4A.A.2A.A.A.A.A.A 2.3A.A.A.A.A.2A.A.3A.2A.A.A.A.2A.2A.A.A.A.A.A.2A.2A.7A.A.2A.2A.3A.A.A .3A.A.3A.9A.7A.9A.8A.A.2A.A.2A.2A.A.A.3A.2A.A.2A.2A.2A.A.A.29A.A.A.A. A.3A.2A.2A.3A.3A.3A.2A.2A.A.19A.3A.3A.3A.2A.2A.2A.2A.A.A.A.2A.A.3A.A. 2A.A.7A.6A.A.2A.4A.2A.A.2A.5A.A.2A.A.10A.2A.7A.6A.2A.A.6A.2A.2A.A.2A. A.A.A.A.A2.7A.A.A.A.A.2A.A.3A.2A.A.A.A.2A.2A.A.A.A.A.A.3A.A.3A.A.2A. 2A.3A.A.A.3A.A.4A.A.2A.A.A.3A.2A.A.4A.2A.A.3A.A.2A.A.2A.2A.A.A.3A.2A. A.2A.2A.2A.A.A.A.A.A.A.A.A.A.11A.3A.2A.2A.3A.3A.3A.2A.A.7A.A.3A.A.2A. A.A.3A.3A.3A.2A.2A.2A.A.2A.2A.2A.A.2A.A.3A.2A.A.A.14A.A.2A.6A.2A.A.7A .A.A.6A.2A.A.14A.2A.A.A.4A.A.3A.A.2A.A.A.A.A.A2.2A.2A.A.A.10A.A.3A.A. 3A.2A.A.A.A.2A.A.38A.A.3A.8A.2A.16A.A.19A.A.2A.A.A.4A.A.3A.A.11A.A.3A .A.2A.A.2A.2A.A.A.3A.2A.A.2A.2A.2A.A.A.A.A.A.A.A.A.A.3A.3A.3A.2A.2A. 3A.3A.3A.3A.3A.2A.A.2A.A.A.3A.3A.3A.40A.A.4A.A.A.A.11A.A.4A.A.2A.A.4A .2A.A.A.5A.A.A.11A.A.A.A.8A.2A.A.A.A.A.A2.2A.2A.A.2A.A.4A.2A.A.3A.A. 3A.2A.A.A.A.10A.2A.A.A.A.A.A.A.3A.4A.2A.A.A.A.2A.2A.A.A.3A.8A.A.9A.A. 4A.A.A.2A.A.2A.A.2A.2A.A.A.3A.2A.A.2A.34A.A.9A.A.10A.3A.3A.3A.5A.3A. 3A.3A.3A.3A.2A.A.2A.A.A.3A.3A.13A.A.A.2A.2A.A.A.3A.A.A.A.A.3A.A.A.A.A .A.A.A.A.A.3A.A.A.A.3A.A.A.A.A.8A.A.2A.A.A.A.A2.4A.A.18A.8A.A.3A.A.2A .A.A.A.A.2A.2A.A.A.A.A.A.A.3A.2A.A.2A.A.A.A.2A.2A.A.A.3A.2A.A.3A.A.3A .A.3A.A.4A.A.A.2A.A.2A.A.2A.A.2A.A.7A.3A.A.A.A.A.A.A.2A.A.3A.A.3A.A. 3A.A.4A.3A.3A.2A.A.8A.3A.3A.3A.18A.A.2A.A.A.3A.3A.2A.2A.A.A.A.A.A.A.A .2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.4A.A.2A.A.A. A.A2.12A.A.3A.A.4A.2A.A.2A.2A.A.2A.A.A.A.A.5A.A.A.A.A.A.A.3A.3A.24A. 2A.A.A.10A.A.9A.A.10A.A.A.2A.A.2A.A.2A.A.2A.A.2A.A.2A.3A.A.A.A.A.A.A. 8A.A.9A.A.4A.4A.A.4A.2A.2A.3A.3A.3A.3A.2A.2A.A.A.A.A.A.3A.3A.2A.2A.A. A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A .2A.A.A.A.A2.3A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A .2A.2A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.3A.A.A.A.A.A.A.A.A.A.A.3A.2A.2A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.A.A. A.A.2A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.2A .A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.2A.A.A.A.A.A.A.2A.2A.A.A.A.A.A.A.A.2A .A.2A.10A.A.2A.2A.A.2A.A.A.A.A.6A.A.2A.A.A.A.A.A.4A.A.4A.2A.A.2A.A.A. A.10A.2A.A.A.A.A.A.A.A.A.2A.A.2A.A.2A.A.2A.A.2A.A.2A.3A.A.A.A.A.A.A.A .A.A.A.12A.A.11A.2A.11A.3A.3A.2A.2A.A.A.2A.A.2A.A.3A.3A.55A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.3A.A.A.A.A.2A. 2A.A.A.A.A.A.3A.A.A.A.A.A.8A.A.4A.2A.A.2A.A.A.A.3A.2A.2A.A.A.A.A.A.A. A.A.2A.A.2A.A.2A.A.2A.A.2A.A.2A.4A.A.13A.A.2A.A.A.A.A.A.A.A.A.2A.A.3A .2A.A.A.A.A.3A.3A.30A.A.2A.3A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.4A.A.2A.A.A.A.5A.A .A.A.A.A.4A.A.2A.A.A.A.A.2A.A.3A.A.5A.A.34A.60A.A.2A.A.4A.2A.A.4A.2A. 13A.2A.A.2A.A.A.A.A.A.A.A.A.8A.2A.A.A.A.A.3A.2A.A.2A.A.A.A.2A.A.3A.A. 2A.3A.3A.2A.A.2A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A2.19A.A.A.A.8A.2A.A.A.A.A.8A.A.2A.A.A.A.A.2A .A.12A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.8A.A.2A.9A.A.A.3A.2A.2A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.2A.A.2A.3A.3A.3A.A.A.A.A.A .A.A.A.A.5A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A 2.2A.2A.A.3A.A.A.A.2A.A.3A.2A.A.A.A.A.2A.A.3A.A.2A.A.A.A.A.3A.A.3A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.2A.A.3A.A.2A.2A.A.4A.A.A.3A.2A.2A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.3A.A.A.A.A.A.A.2A.A.2A.3A.3A.64A.2A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.28A.A.37A.A. 40A.A.118A.A.15A.A.24A.159A.12A.A.2A.A.A.A.A.A.A.A.A.5A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A2.8A.3A.3A.3A.3A.3A.3A.7A .3A.9A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A .7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A .7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A .7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.3A.A. 3A.3A.3A.25A.A.2A.4A.3A.3A.3A.6A.2A.A.5A.7A.2A.8A.7A.7A.7A.7A.7A.7A. 7A.3A.A.9A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.2A.2A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.A.5A.3A.3A.3A.3A.3A.3A.5A.5A.3A.3A. 5A.3A.A.27A.A.2A.4A.3A.3A.3A.6A.2A.A.5A.7A.2A.8A.7A.7A.3A.A.9A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A.7A. 7A.7A.7A.7A.7A.7A.7A.7A.7A.3A.A.3A.19A.A.2A.7A.4A.6A.2A.A.5A.3A.A.3A. 17A.A.2A.6A.A.10A.3A.14A.A.2A.6A.7A.7A.A.15A.A.2A.7A.4A.3A.3A.3A.3A. 3A.3A.5A.5A.3A.3A.5A.3A.A.3A.A.2A.4A.3A.3A.3A.9A.A.7A.2A.2A.3A.3A.5A. A.19A.2A.4A.3A.3A.5A.3A.A.4A.A.2A.7A.3A.3A.3A.9A.A.7A.2A.2A.A.5A.3A. 3A.3A.3A.3A.7A.3A.3A.5A.3A.A.5A.7A.2A.2A.14A.3A.19A.3A.21A.2A.A.5A.3A .3A.3A.6A.2A.A.5A.7A.2A.8A.7A.7A.3A.A.3A.3A.A.2A.4A.3A.3A.3A.31A.A.7A .2A.2A.3A.3A.5A.A.4A.4A.5A.A.4A.6A.A.5A.5A.A.4A.6A.A.5A.5A.A.4A.7A.4A .6A.2A.A.5A.3A.A.3A.30A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A$5.6A7.5A5.A 10.A3.5A10.A3.4A4.7A3.A4.A2.5A5.A6.A7.A2.A6.A6.A3.A3.9A2.A5.4A3.4A2. 4A2.A3.A3.A6.6A5.A6.A20.6A4.2A4.A3.A3.A95.2A7.A$5.A3.5A6.A4.4A10.A7.A 10.A6.A4.A5.A3.A4.A2.A2.5A2.A6.9A2.A4.5A4.A3.A11.A2.A5.A2.A3.A2.A2.A 2.A2.A3.A3.A6.A10.A4.5A22.8A4.A3.A3.A95.A8.A$5.A7.A6.A4.A13.A7.A10.A 6.A4.A5.A3.A4.4A6.A2.A6.A10.3A2.A3.A4.A3.A11.A2.7A2.5A2.A2.A2.A2.A3.A 3.8A10.A4.A3.A22.A11.A2.2A3.A95.A5.4A$3.5A5.A6.6A11.5A3.3A8.5A4.A4.A 5.A3.A7.A6.A2.A6.A12.A2.A3.A4.A3.A11.A18.4A2.A2.A3.A21.A4.A3.A11.6A5. A11.A2.3A2.A33.63A5.2A$3.A3.A5.A6.A3.4A9.A3.A3.A10.A3.A4.A4.7A3.A7.8A 2.A4.5A10.A2.A3.A4.A3.A8.4A24.4A3.A21.A4.A3.A11.A4.A5.A11.A2.A4.A33.A 67.A$3.A3.A5.A6.A6.A9.A3.A3.A10.A3.A4.A7.A6.A7.A9.A4.A3.A2.4A2.3A2.5A 4.A3.A8.A34.20A2.A4.5A11.A4.15A3.4A4.A33.A67.A$3.A3.A5.A6.A6.A9.A3.A 3.A10.A3.A4.A7.A4.3A7.A9.A4.A3.A2.A2.A2.A6.A6.A3.A8.A53.A2.A6.A4.10A 18.A11.A33.A40.5A4.19A$3.5A2.4A3.7A3.A9.5A3.A10.5A4.A7.A4.A7.5A7.A4.A 3.A2.A2.4A6.A6.A3.A8.A53.A2.A6.A4.A7.4A16.A11.A33.A40.A3.A4.A16.4A$5. A4.A6.A5.A3.A11.A5.A12.A6.A4.9A7.A3.A5.3A4.5A2.A4.4A2.5A2.3A3.A8.A16. 5A5.5A5.5A12.A2.A4.5A2.A10.A16.A45.A3.20A12.6A3.6A19.A$5.A4.A6.A5.A3. A11.A5.A12.A6.A4.A6.4A5.A3.A5.A8.A4.A7.A2.A3.A2.A5.A8.A16.A3.A5.A3.A 5.A3.A12.A2.A4.A3.A2.A10.A5.5A6.A45.A3.A18.A12.A12.4A17.A$3.5A2.4A3.A 5.A3.A9.5A3.A12.8A4.A9.A5.A3.A5.A8.A4.A7.A2.A3.A2.A5.A8.A2.15A3.7A3. 7A3.5A8.A2.A4.A3.A2.A3.8A2.A2.A3.A6.35A11.A3.A18.A8.5A15.A17.A$3.A3.A 5.A3.7A3.A9.A3.A3.A15.A6.5A7.A5.5A5.A8.14A2.A3.A2.A5.A8.A2.A10.A2.A3. A2.A2.A3.A2.A2.A3.A3.A8.A2.A4.A3.A2.A3.2A4.8A3.4A37.A11.A3.A17.2A8.A 2.4A13.A12.6A$3.A3.A5.A6.A6.A9.A3.A3.A15.A6.A3.A2.6A7.A7.A16.A7.5A2. 3A3.A8.A2.A10.A2.5A2.A2.5A2.A2.5A3.7A2.A2.A4.5A2.A3.A9.A2.A3.A2.A37.A 11.A3.A17.11A5.A7.7A12.A3.4A$3.A3.A5.A6.A6.A9.A3.A3.A13.5A4.A3.A2.A 12.A7.A16.A9.A6.A3.A8.A2.A10.A9.A9.A10.A5.A2.A2.A6.A4.A3.A12.5A2.A37. A11.A3.A17.A15.A7.A4.4A10.A6.A$3.5A2.4A4.5A2.3A9.5A3.A13.A3.A4.A3.A2. A12.6A2.A14.5A7.A6.A3.A8.A2.A10.A9.A9.A10.A5.A2.A2.A6.A4.A3.A2.4A13.A 37.A11.A3.A17.A15.A2.6A7.A5.6A6.A$5.A4.A7.A3.A2.A13.A5.A13.A3.A4.5A2. A12.A4.A2.A14.A3.A7.8A3.A8.A2.A3.8A3.7A2.4A3.A10.A5.A2.A2.4A3.A4.A3.A 2.A2.A13.A37.A11.A3.A6.9A2.A15.A2.A3.4A5.A5.A3.4A4.A$5.A4.A7.A3.A2.A 13.A5.A13.A3.A6.A4.A12.A4.A2.A14.A3.A8.A9.A8.A2.A3.A6.A3.A8.A2.A3.A 10.A3.3A2.A4.6A4.A3.A2.A2.15A36.2A11.A3.A6.A7.A2.A15.A2.A6.A5.A5.A6.A 4.A$3.5A2.4A4.A3.A2.A13.7A13.5A6.A4.A10.5A2.A2.A14.A3.A8.A9.A8.A2.A3. A6.A3.A8.A2.5A10.A3.A4.A4.A9.A3.4A16.A36.14A3.A6.A7.A2.A15.A2.A6.A5.A 5.A6.A4.A$3.A3.A5.A4.5A2.3A13.A19.A8.6A10.A3.A2.A2.A14.5A8.A9.A8.A2.A 3.4A3.A3.4A5.A9.5A3.A3.A4.A4.A9.A5.2A16.A36.A16.A4.5A4.2A2.A13.3A2.8A 5.A5.8A4.A$3.A3.A5.A6.A6.A13.A19.A11.A12.A3.A2.A2.A16.A10.A9.A8.A2.A 6.A3.A6.A5.A9.A2.6A3.3A2.3A2.A9.A5.A3.5A2.5A2.A36.A16.A4.A3.A4.5A13.A 9.A7.A10.A6.A$3.A3.A5.A6.A6.A11.5A15.5A9.A12.A3.A2.4A16.A10.A9.A8.A2. A6.A3.A6.A5.A9.A2.A3.2A5.A3.5A9.A5.A3.A3.A2.A3.A2.A36.A16.A4.A3.A4.A 2.4A11.A9.A7.A10.A6.A$3.5A2.4A6.8A11.A3.A15.A3.A7.5A10.5A22.A5.6A9.A 8.A2.A3.4A2.2A5.2A4.2A9.A2.A3.A6.A3.A13.A5.5A3.4A3.4A36.2A10.6A4.A3.A 4.A5.A6.6A9.9A7.7A3.A$5.A4.A11.A16.A3.A15.A3.A7.A3.A12.A24.A5.A14.A8. A2.A3.A5.4A3.4A2.12A2.A3.A6.A3.A7.7A9.A3.A2.A3.A6.6A27.4A8.A3.4A2.5A 4.A5.A6.A3.4A10.A3.5A4.A5.A3.A$5.A4.A11.A16.A3.A15.A3.A7.A3.A12.A24.A 5.A14.A8.A2.A3.A5.A2.A3.A2.A2.A13.A3.8A3.A7.A15.5A2.5A6.A4.A12.6A12.A 8.A6.A4.A6.A5.A6.A6.A10.A7.A4.A5.A3.A$5.6A11.A16.5A15.5A7.A3.A12.A17. 8A5.A2.13A2.7A2.A3.7A2.5A2.4A13.A14.4A4.A33.A4.A12.A4.A12.A8.A6.A4.A 6.A5.A6.A6.A10.A7.A4.A5.A3.A$5.A3.5A8.A18.A19.A9.5A12.A17.A12.A2.A14. A8.A36.A16.2A4.A33.A3.2A3.5A4.A4.14A6.5A4.A4.A2.5A5.A4.5A4.A8.5A3.3A 4.7A3.A$5.A7.A8.A18.A19.A11.A14.A17.A12.A2.A14.A8.A36.14A4.A4.A16.6A 2.10A3.6A3.6A16.4A4.A3.A4.A4.A2.A2.5A2.A4.A3.A4.A8.A3.A3.A9.A6.A$5.A 7.A8.A18.A19.A11.A14.A17.A12.A2.A2.13A2.7A4.30A14.2A4.A4.A16.A4.A2.A 12.A12.4A17.A4.A3.A4.A4.4A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.3A$5.9A8.A18.A 19.A11.A14.A11.7A4.9A2.A2.A14.A10.A28.A15.A3.2A4.A16.A4.A2.A12.A15.A 17.A4.A3.A4.A7.A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.A$5.A16.A18.A19.A8.4A14. A11.A10.A10.A2.A14.A10.A28.A15.A3.4A2.A16.A3.2A2.A7.6A15.A12.6A4.5A4. A7.8A2.A4.5A4.A8.5A3.A6.9A$5.A16.A18.A19.A8.A17.A11.A10.A10.A2.A2.13A 2.9A2.24A2.A7.5A3.5A2.A2.A2.15A3.5A7.A3.4A7.7A12.A3.4A4.A6.A7.A9.A6.A 6.A10.A5.A6.A6.4A$5.A16.A18.A19.A8.A17.A11.A7.4A2.9A2.A2.A14.A10.A22. A2.A7.A3.A10.A2.A2.A17.A11.A6.A7.A4.4A10.A6.A4.A6.A7.A9.A6.A6.A10.A5. A6.A9.A$5.A16.A18.A19.A8.A17.A11.A7.A5.A10.A2.A14.A10.A22.A2.A7.A3.A 10.A2.A2.A17.A6.6A6.A2.6A7.A5.6A6.A2.5A4.A5.5A7.A4.5A4.A8.5A3.A4.5A7. A$5.7A10.A18.A19.A8.A2.16A3.9A2.6A5.A10.A2.A3.12A2.9A2.18A2.A2.5A3.A 3.A9.2A2.A2.A6.9A2.A6.A3.4A4.A2.A3.4A5.A5.A3.4A4.A2.A3.A4.A5.A3.A5.3A 4.A3.A4.A8.A3.A3.A4.A3.A2.6A$11.A10.A18.A19.A8.A2.A18.A10.A7.4A2.9A2. A3.A13.A10.A16.A2.A6.A3.A2.2A9.5A2.A6.A7.A2.A6.A6.A4.A2.A6.A5.A5.A6.A 4.A2.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A$11.A10.A18.A12.8A8.A 2.A18.A10.A7.A5.A10.A3.A13.A10.A16.A2.A6.5A2.5A6.A6.A6.A7.A2.A6.A6.A 4.A2.A6.A5.A5.A6.A4.A2.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A$ 11.A10.A18.A12.A15.A2.A6.13A2.9A2.6A5.A10.A3.A6.8A2.9A2.12A2.A2.5A6.A 2.A2.2A3.4A6.A4.5A4.2A2.A6.8A4.A2.8A5.A5.8A4.A2.5A4.A5.5A5.A6.5A4.A8. 5A3.A4.5A2.A$11.A10.A18.A12.A15.A2.A6.A14.A10.A7.4A2.9A3.A6.A9.A10.A 10.A2.A6.A6.4A3.A3.A9.A4.A3.A4.5A11.A6.A7.A7.A10.A6.A4.A6.A7.A7.A8.A 6.A10.A5.A6.A4.A$11.A10.A13.6A8.5A15.A2.A6.A14.A10.A7.A5.A11.A6.A9.A 10.A10.A2.A6.A13.A3.A9.A4.A3.A4.A2.4A9.A6.A7.A7.A10.A6.A4.A6.A7.A7.A 8.A6.A10.A5.A6.A4.A$11.A10.A13.A13.A11.9A2.A6.A6.9A2.9A2.6A5.A11.A5. 2A8.2A9.2A3.5A2.A2.5A2.A13.A3.A4.6A4.A3.A4.A5.A6.7A3.A7.9A7.7A3.A2.5A 2.3A7.6A2.A6.5A2.3A10.7A6.6A$11.A10.A13.A13.A11.A10.A6.A6.A10.A10.A9. 2A11.A5.5A5.5A6.6A3.A2.A6.A2.A12.2A3.A4.A3.4A2.5A4.A5.A6.A5.A3.A10.A 3.5A4.A5.A3.A2.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13.A$11.A10.A13.A13.A11.A 10.A6.A6.A10.A10.A9.9A4.A3.3A3.A3.3A3.A4.3A3.2A3.A2.A6.A2.A12.6A4.A6. A4.A6.A5.A6.A5.A3.A10.A7.A4.A5.A3.A2.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13. A$11.A9.2A9.5A6.8A3.9A2.9A2.5A5.2A9.2A9.2A7.3A3.A2.2A4.A3.2A4.A3.2A4. A4.2A4.A4.A2.5A2.A2.A12.A9.A6.A4.A6.A5.A6.A5.A3.A10.A7.A4.A5.A3.A2.A 3.A2.A7.5A2.A2.A6.A3.A2.A12.5A9.5A$11.A9.A10.A10.A10.A10.A10.A9.5A6. 5A6.5A4.2A4.A3.A4.A3.A5.A3.A5.A4.A5.A4.A6.A2.A2.A12.A7.5A4.A4.A2.5A5. A6.7A3.A8.5A3.3A4.7A3.A2.5A2.3A5.A3.A2.A2.A6.5A2.3A10.A3.A9.A3.A$11.A 9.A10.A10.A10.A10.A10.A7.3A3.A4.3A3.A4.3A3.A4.A5.A3.A3.2A3.A3.7A3.8A 3.3A4.A6.A2.A2.A12.A7.A3.A4.A4.A2.A2.5A2.A9.A6.A8.A3.A3.A9.A6.A4.A6.A 5.A3.A2.A2.A8.A6.A10.A3.A9.A3.A$11.A8.2A9.2A9.2A9.2A9.2A9.2A7.2A4.A4. 2A4.A4.2A4.6A3.3A3.A3.6A3.2A8.2A9.2A5.5A2.A2.A2.A12.4A4.A3.A4.A4.4A6. A2.A9.A4.3A8.A3.A3.A9.A4.3A4.A6.A5.A3.A2.4A8.A6.A10.A3.A9.A3.A$11.A8. 5A6.5A6.5A6.5A6.5A6.5A4.A5.A4.A5.A4.A5.A8.2A4.5A3.2A3.A9.A10.A10.A2.A 2.A2.A15.A4.A3.A4.A7.A6.A2.A9.A4.A10.A3.A3.A9.A4.A6.8A5.5A14.8A10.5A 9.5A$11.A6.3A3.A4.3A3.A4.3A3.A4.3A3.A4.3A3.A4.3A3.6A3.8A3.8A3.3A8.A 13.A4.A9.A10.A10.A2.A2.A2.A15.A4.5A4.A7.8A2.A6.9A10.5A3.A6.9A7.A13.A 17.A18.A13.A$11.A6.2A4.A4.2A4.A4.2A4.A4.2A4.A4.2A4.A4.2A4.A8.2A9.2A9. 2A9.A13.A3.2A3.4A2.A4.4A2.A4.4A2.A2.A2.A2.A15.A6.A6.A7.A9.A6.A6.4A10. A5.A6.A6.4A5.A13.A17.A18.A13.A$11.A6.A5.A4.A5.A4.A5.A4.A5.A4.A5.A4.A 5.A8.A10.A10.A10.A5.9A3.A4.A2.A2.A4.A2.A2.A4.A2.A2.A2.A2.A2.A15.A6.A 6.A7.A9.A6.A9.A10.A5.A6.A9.A5.66A$11.8A3.8A3.8A3.8A3.8A3.8A3.3A8.A10. A10.A10.A5.2A10.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.A2.A2.A15.A4.5A4.A5. 5A7.A4.5A7.A8.5A3.A4.5A7.A70.A$11.A10.2A9.2A9.2A9.2A9.2A9.2A9.A4.4A2. A3.8A4.7A5.A11.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A2.A2.A2.A15.A4.A3.A4.A 5.A3.A5.3A4.A3.A2.6A8.A3.A3.A4.A3.A2.6A70.A$A10.A10.A10.A10.A10.A10.A 10.A10.A4.A2.A2.A3.A11.A11.A11.A3.A3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.A 15.A4.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A4.A3.A2.A10.66A$A10.A10.A10. A10.A10.A10.A10.A10.A2.3A2.A2.A3.A11.A11.A11.A3.A3.A2.A3.A3.A2.A3.A3. A2.A2.A2.A2.A15.A4.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A4.A3.A2.A10.A$A 4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A4.4A2.A3.2A2.A2.A3.A 4.4A3.A4.4A3.A4.4A3.A3.5A2.A3.5A2.A3.5A2.A2.A2.A2.A15.A4.5A4.A5.5A5.A 6.5A2.A13.5A3.A4.5A2.A2.9A$A4.A2.A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A4.A2. A2.A4.A2.A2.A4.A2.A2.A4.A2.A2.A3.A3.A2.A3.A4.A2.A3.A4.A2.A3.A4.A2.A3. A3.A3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.A15.A6.A6.A7.A7.A8.A4.A15.A5.A6.A 4.A2.A18.6A$A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2.A2.A2.3A2. A2.A2.3A2.A2.A2.3A2.A2.A3.A3.A2.A3.A2.3A2.A3.A2.3A2.A3.A2.3A2.A3.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A2.A2.A2.11A5.A6.A6.A7.A7.A8.A4.A15.A5.A6.A4.A 2.A18.A4.A39.10A$A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A 3.2A2.A2.A3.2A2.A2.A3.2A2.A2.A3.5A2.A3.A3.2A2.A3.A3.2A2.A3.A3.2A2.A3. A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A2.A2.A11.2A5.A4.5A2.3A7.6A2.A8.6A15.7A 6.6A2.A2.17A4.15A20.A4.A8.A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A3.A3.A3.A3.A3.A3.A3.A 3.5A6.5A6.5A6.A2.A2.A12.A5.A4.A3.A2.A9.A4.A2.A11.A19.A13.A4.A2.A14.4A 16.A20.A4.A8.A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2. A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A3.A3.A3.A3.A3.A3.A3.A7.A10.A10.A6.A 2.A2.5A8.A5.A4.A3.A2.A9.A4.A2.A11.A19.A13.A4.A2.A17.A16.A20.6A8.A$A3. 5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.5A2.A3.A2.2A2.A3.A3. 5A3.A3.5A3.A3.5A7.A10.A10.A6.A2.A6.A8.A4.2A4.A3.A2.A7.5A2.A2.A9.5A15. 5A9.5A2.A2.A17.A5.5A6.A29.6A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A 3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.5A6.A3.A3.A3.A3.A3.A3.A3.A3.A3.A3.5A 2.9A2.9A6.A2.A6.A7.2A3.3A4.5A2.3A5.A3.A2.A2.A9.A3.A15.A3.A9.A3.A2.A2. A10.8A2.A2.A3.A6.A29.A3.4A$A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3.A2.A3.A3. A2.A3.A3.A2.A3.A3.A2.A3.A3.A6.A6.A3.A3.A3.A3.A3.A3.A3.A3.A3.A3.A6.A 10.A14.A2.A6.A7.6A8.A6.A5.A3.A2.A2.A9.A3.A15.A3.A9.A3.A2.A2.A10.2A4. 8A3.4A3.A29.A6.2A$A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A3.A2.2A2.A 3.A2.2A2.A3.A2.2A2.A3.A2.2A6.A6.A3.A3.A2.2A3.A3.A2.2A3.A3.A2.2A3.A6.A 10.A14.A2.A5.2A7.A3.2A8.A6.A5.A3.A2.4A9.A3.A15.A3.A9.A3.A2.A2.A10.A9. A2.A3.A2.A3.A3.27A6.4A$5A6.5A6.5A6.5A6.5A6.5A6.5A6.5A6.5A2.5A3.5A7.5A 7.5A7.A3.4A2.9A14.A2.A4.3A3.5A3.A9.8A5.5A15.5A15.5A9.5A2.A2.A10.A12. 5A2.A3.5A35.A$4.A10.A10.A10.A10.A10.A10.A10.A6.A6.A11.A11.A11.A7.A3.A 5.A11.12A2.A4.A5.A7.A10.A13.A19.A19.A13.A4.A2.A10.A2.4A13.A43.A$4.A 10.A10.A10.A10.A10.A10.A10.A6.A6.A11.A11.A11.A7.A3.A5.A11.A13.A4.A4. 2A7.A10.A13.A19.A19.A13.A4.A2.A10.A2.A2.A13.A20.24A$4.A10.A10.A8.3A 10.A5.6A3.8A2.9A3.4A3.4A3.9A3.9A4.8A5.3A3.A5.A11.A13.A3.2A3.3A7.A10. 69A4.A2.A10.A2.A2.15A20.A21.4A$4.A10.A10.A8.A5.8A5.A8.A9.A11.A6.A6.A 11.A12.A12.A5.A5.A3.9A3.11A3.6A9.A78.A4.A2.A10.4A16.A20.A24.A$5A10.2A 2.8A8.A5.A12.A8.A9.A11.A6.A6.A11.A12.A12.A5.A5.A3.A11.A8.2A3.A3.2A9.A 78.A4.A2.A12.2A16.A20.A24.A$A15.A2.A15.A2.4A12.A2.7A9.A2.10A6.A2.5A 11.A2.11A5.8A2.4A5.A3.A11.A8.A4.A3.A10.80A4.A2.A5.A6.A3.5A2.5A2.A12. 6A2.8A7.5A5.A$A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A9.A8.A3. A11.A8.A4.A3.A94.A2.A2.7A3.A3.A3.A2.A3.A2.A12.A4.A9.A7.A3.A5.A$A15.A 2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A2.A15.A9.A8.A3.A11.A8.A4.A3.A94.A 2.A2.A2.A2.A3.5A3.4A3.4A12.A4.A9.A7.A3.A5.A$8A3.6A2.8A3.6A2.8A3.6A2. 8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A2.8A3.6A3.A11.A8.6A3.96A2.A2.A5.A7.A3.A 2.A3.A5.6A4.A3.2A9.A7.A3.A5.A$A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6. A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A3.A11.A115.A2. A5.A7.5A2.5A5.A4.A4.A3.12A7.A2.2A5.A$A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A 4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A2.A6.A3.A4.A3.A10. 2A115.A2.A5.A24.A4.A4.A3.A15.4A2.5A2.A$A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A 2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A4.A2.A6.A2.2A 4.A3.A9.3A3.62A27.18A5.A2.A4.2A24.A3.2A4.A3.A15.A2.A2.A3.A2.A$A2.5A2. 4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A2.A2.5A 2.4A2.A2.A2.5A2.4A2.A2.A2.5A2.4A2.A3.A9.A5.A60.A2.A2.A21.A16.A5.A2.A 4.15A2.10A3.7A3.A15.A2.4A3.A2.A$A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A 2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A2.A5.2A2.A5.A3.A 9.A4.2A60.10A18.A16.A5.A2.A4.A13.A2.A12.A9.7A9.A9.A2.A$A5.A3.A5.A2.A 5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A2.A5.A3.A5.A 2.A5.A3.A5.A3.A8.2A3.3A7.4A3.5A44.A2.A2.A18.A6.7A3.A5.A2.A4.A13.A2.A 12.A15.A9.A9.A2.A$A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A 3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A2.A3.3A3.3A3.A3.4A5.6A9. A2.A3.A3.A44.A5.A4.15A6.2A3.6A5.A2.A4.A12.2A2.A7.6A15.A9.A9.A2.A$A3.A 7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A 3.A7.A3.A2.A3.A7.A3.A5.8A3.2A9.A2.5A3.A44.A5.A4.A20.A4.A10.A2.6A12.5A 7.A3.4A7.7A9.8A2.A2.A$A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A 2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A2.A3.A7.A3.A5.A10.A10.A10.A44.12A 20.A4.A10.A2.A17.A11.A6.A7.A4.4A7.A5.5A2.A$A3.10A2.A2.A3.10A2.A2.A3. 10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A2.A3.10A2.A5.A10.A 10.A10.A58.19A4.5A6.A2.A17.A6.6A6.A2.6A7.A7.A5.A6.A$A3.A3.A3.A3.A2.A 3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A 3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A3.3A10.A10.A10.A58.A16.4A6.A6.A2.A6. 9A2.A6.A3.4A4.A2.A3.4A5.A7.A5.A6.A$A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2. A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A2.A 2.3A2.A2.3A2.A2.A2.3A2.A2.3A2.A3.A12.A8.11A2.A10.22A12.15A19.A6.A6.A 2.A6.A7.A2.A6.A6.A4.A2.A6.A5.A7.A4.2A6.A$A3.A3.A3.A3.A2.A3.A3.A3.A3.A 2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A 3.A3.A2.A3.A3.A3.A3.A3.A12.A8.A8.5A10.A20.A12.A12.4A17.A5.2A6.A2.A6.A 7.A2.A6.A6.A4.A2.A6.A5.A7.A4.9A$A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A 3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A3.A3.A3.A3.A2.A 3.A3.A3.A3.A3.A12.A8.A8.A14.A20.A8.5A15.A17.A5.9A2.A4.5A4.2A2.A6.8A4. A2.8A5.A7.A4.A$A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A 3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A2.A3.5A3.A3.A3.A12.A8.A8.A14.A19. 2A8.A2.4A13.A12.6A5.A10.A4.A3.A4.5A11.A6.A7.A7.A5.5A2.A$A7.5A3.A2.A7. 5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A2.A7.5A3.A3.A 12.A6.5A5.2A14.A19.11A5.A7.7A12.A3.4A3.A10.A4.A3.A4.A2.4A9.A6.A7.A7.A 5.A3.A2.A$A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A7.A2.A7.A 7.A2.A7.A7.A3.A12.A6.A3.A5.17A19.A15.A7.A4.4A10.A6.A3.A5.6A4.A3.A4.A 5.A6.7A3.A7.9A5.A3.A2.8A$A2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A2.A2. 6A7.A2.A2.6A7.A2.A2.6A7.A2.A2.6A7.A3.A12.A6.A3.A5.A14.4A17.A15.A2.6A 7.A5.6A6.A3.A5.A3.4A2.5A4.A5.A6.A5.A3.A10.A3.5A2.A3.A9.A$A2.A12.A2.A 2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A3. A12.A6.A3.A5.A17.A6.9A2.A15.A2.A3.4A5.A5.A3.4A4.A3.A5.A6.A4.A6.A5.A6. A5.A3.A10.A7.A2.5A9.A$A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12.A2.A2.A12. A2.A2.A12.A2.A2.A12.A2.A2.A12.A3.A12.A6.5A5.5A13.A6.A7.A2.A15.A2.A6.A 5.A5.A6.A4.A3.A5.A6.A4.A6.A5.A6.A5.A3.A10.A7.A4.A7.5A$A2.A2.A9.A2.A2. A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2.A2.A2.A9.A2. A2.A2.A9.A3.A12.A8.A11.A13.A6.A7.A2.A15.A2.A6.A5.A5.A6.A4.A3.A3.5A4.A 4.A2.5A5.A6.7A3.A8.5A3.3A4.A7.A$A2.14A2.A2.14A2.A2.14A2.A2.14A2.A2. 14A2.A2.14A2.A2.14A2.A2.14A3.A12.A8.A11.A13.A4.5A4.2A2.A13.3A2.8A5.A 5.8A4.A3.A3.A3.A4.A4.A2.A2.5A2.A9.A6.A8.A3.A3.A6.6A2.A$A7.A10.A7.A10. A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A11.A12.A8.8A4.A13.A4.A3.A4.5A 13.A9.A7.A10.A6.A3.A3.A3.A4.A4.4A6.A2.A9.A4.3A8.A3.A3.A6.A4.A2.4A$A7. A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A10.A7.A11.A12.A8.A6.A4.A 13.A4.A3.A4.A2.4A11.A9.A7.A10.A6.A3.A3.A3.A4.A7.A6.A2.A9.A4.A10.A3.A 3.A6.A4.A5.A$9A10.9A10.9A10.9A10.9A10.9A10.9A10.9A11.A12.A8.A6.A4.A8. 6A4.A3.A4.A5.A6.6A9.9A7.7A3.A3.A3.5A4.A7.8A2.A6.9A10.5A3.A4.5A2.A5.A$ 8.A18.A18.A18.A18.A18.A18.A18.A11.A12.A6.5A2.3A4.A8.A3.4A2.5A4.A5.A6. A3.4A10.A3.5A4.A5.A3.A3.A5.A6.A7.A9.A6.A6.4A10.A5.A4.A3.A2.A2.4A$8.A 18.A18.A18.A18.A18.A18.A18.A11.A12.A6.A3.A2.A6.A8.A6.A4.A6.A5.A6.A6.A 10.A7.A4.A5.A3.A3.A5.A6.A7.A9.A6.A9.A10.A5.A4.A3.A2.A2.A$8.9A10.17A2. A18.9A2.9A18.A2.17A10.9A11.A12.A6.A3.A2.A6.A8.A6.A4.A6.A5.A6.A6.A10.A 7.A4.A5.A3.A3.A3.5A4.A5.5A7.A4.5A7.A8.5A3.A4.A3.A2.4A$16.A26.A2.A26.A 2.A26.A2.A26.A11.9A12.A6.A3.A2.A6.A6.5A4.A4.A2.5A5.A4.5A4.A8.5A3.3A4. 7A3.A3.A3.A3.A4.A5.A3.A5.3A4.A3.A2.6A8.A3.A3.A4.5A4.4A$16.A26.A2.A26. A2.A26.A2.A26.A11.A20.A6.5A2.8A6.A3.A4.A4.A2.A2.5A2.A4.A3.A4.A8.A3.A 3.A9.A6.A3.A3.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A6.A9.A$16.5A18.5A2. 5A18.5A2.5A18.5A2.5A18.5A11.A20.A8.A10.4A4.A3.A4.A4.4A6.A2.A4.A3.A4.A 8.A3.A3.A9.A4.3A3.A3.A3.A4.A5.A3.A5.A6.A3.A2.A13.A3.A3.A6.A9.A$16.A3. A18.A3.A2.A3.A18.A3.A2.A3.A18.A3.A2.A3.A18.A3.A4.8A20.A8.A13.A4.A3.A 4.A7.A6.A2.A4.A3.A4.A8.A3.A3.A9.A4.A5.A3.5A4.A5.5A5.A6.5A2.A13.5A3.A 6.6A4.A$16.A26.A2.A26.A2.A26.A2.A26.A4.A27.A8.6A8.A4.5A4.A7.8A2.A4.5A 4.A8.5A3.A6.9A5.A5.A6.A7.A7.A8.A4.A15.A5.A6.A4.A2.3A$16.A26.A2.A26.A 2.A26.A2.A26.A4.A27.A8.A4.A6.3A6.A6.A7.A9.A6.A6.A10.A5.A6.A6.4A3.A5.A 6.A7.A7.A8.A4.A15.A5.A6.A4.A2.A$16.12A7.9A2.12A7.9A2.12A7.9A2.12A7.9A 4.A27.A8.A4.A6.A8.A6.A7.A9.A6.A6.A10.A5.A6.A9.A3.A3.5A2.3A7.6A2.A8.6A 15.7A4.5A2.4A$16.A10.A7.A7.A2.A10.A7.A7.A2.A10.A7.A7.A2.A10.A7.A7.A4. A27.A6.5A2.A2.5A6.5A4.A5.5A7.A4.5A4.A8.5A3.A4.5A7.A3.A3.A3.A2.A9.A4.A 2.A11.A19.A8.A3.A4.4A$16.A10.A6.2A7.A2.A10.A6.2A7.A2.A10.A6.2A7.A2.A 10.A6.2A7.A4.A27.A6.A3.A2.A2.A2.4A4.A3.A4.A5.A3.A5.3A4.A3.A4.A8.A3.A 3.A4.A3.A2.6A3.A3.A3.A2.A9.A4.A2.A11.A19.A8.A3.A7.A$16.A2.9A6.7A2.A2. A2.9A6.7A2.A2.A2.9A6.7A2.A2.A2.9A6.7A2.A4.A27.A6.A3.A2.A2.A5.A4.A3.A 4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A8.A3.A3.A2.A7.5A2.A2.A9.5A15. 5A6.A3.A7.A$16.A9.2A6.A8.A2.A9.2A6.A8.A2.A9.2A6.A8.A2.A9.2A6.A8.A4.A 27.A6.A3.A2.4A5.A4.A3.A4.A5.A3.A5.A6.A3.A4.A8.A3.A3.A4.A3.A2.A8.A3.5A 2.3A5.A3.A2.A2.A9.A3.A15.A3.A6.5A7.A$16.A9.A7.A8.A2.A9.A7.A8.A2.A9.A 7.A8.A2.A9.A7.A8.A4.A27.A6.5A11.A4.5A4.A5.5A5.A6.5A4.A8.5A3.A4.5A2.A 7.2A5.A6.A5.A3.A2.A2.A9.A3.A15.A3.A8.A9.A$16.A9.A7.A8.A2.A9.A7.A8.A2. A9.A7.A8.A2.A9.A7.A8.A4.A27.A8.A11.3A6.A6.A7.A7.A8.A6.A10.A5.A6.A4.A 7.A6.A6.A5.A3.A2.4A9.A3.A15.A3.A8.A9.A$16.A9.10A7.A2.A9.10A7.A2.A9. 10A7.A2.A9.10A7.A4.A27.A8.A11.A8.A6.A7.A7.A8.A6.A10.A5.A6.A4.A7.A6.8A 5.5A15.5A15.5A8.11A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A 9.A3.A3.A8.A4.A27.A8.13A6.5A2.3A7.6A2.A6.5A2.3A10.7A6.6A7.A7.A13.A19. A19.A10.A$16.A8.3A2.A2.3A7.A2.A8.3A2.A2.3A7.A2.A8.3A2.A2.3A7.A2.A8.3A 2.A2.3A7.A4.A27.A8.A4.A5.4A4.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13.A9.2A6.A 13.A19.A19.A10.A$16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A 3.A3.A8.A4.A27.A8.A4.A8.A4.A3.A2.A9.A4.A2.A6.A3.A2.A14.A13.A10.A6.66A $16.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A2.A9.A3.A3.A8.A4.A27.A 8.A4.A8.A4.A3.A2.A7.5A2.A2.A6.A3.A2.A12.5A9.5A8.A71.A$16.A9.5A3.A8.A 2.A9.5A3.A8.A2.A9.5A3.A8.A2.A9.5A3.A8.A4.A27.A8.A4.A2.4A2.A4.5A2.3A5. A3.A2.A2.A6.5A2.3A10.A3.A9.A3.A8.A71.A$16.A13.5A8.A2.A13.5A8.A2.A13. 5A8.A2.A13.5A8.A4.A27.A8.A4.A2.A2.A2.A6.A6.A5.A3.A2.A2.A8.A6.A10.A3.A 9.A3.A8.34A38.A$16.A13.A12.A2.A13.A12.A2.A13.A12.A2.A13.A12.A4.A27.A 8.A4.A2.A2.A2.A6.A6.A5.A3.A2.4A8.A6.A10.A3.A9.A3.A8.A3.A22.A5.A3.13A 15.8A$16.A3.11A12.A2.A3.11A12.A2.A3.11A12.A2.A3.11A12.A4.A27.A8.A4.4A 2.4A6.8A5.5A14.8A10.5A9.5A8.A3.A22.A5.A3.A10.2A15.A$16.A3.A22.A2.A3.A 22.A2.A3.A22.A2.A3.A22.A4.A27.A8.A21.A13.A17.A18.A13.A10.A2.3A21.A2.A 2.A3.A11.A5.6A4.A$16.A3.A22.A2.A3.A22.A2.A3.A22.A2.A3.A22.A4.A27.A8.A 21.A13.A17.A8.5A5.A13.A10.A3.A22.11A11.A5.A4.A4.A$16.A2.22A2.A2.A2. 22A2.A2.A2.22A2.A2.A2.22A2.A4.A27.A8.64A3.21A10.A3.A25.A2.A15.A4.2A4. A4.A$16.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A2.A6.A13.A2. A4.A27.A95.A10.5A43.2A3.3A4.A4.A$16.A2.A6.A13.A2.A2.A2.A6.A13.A2.A2.A 2.A6.A13.A2.A2.A2.A6.A13.A2.A4.A27.A95.A14.A43.6A6.A4.7A$16.A2.A2.A2. 3A7.A4.A2.A2.A2.A2.A2.3A7.A4.A2.A2.A2.A2.A2.3A7.A4.A2.A2.A2.A2.A2.3A 7.A4.A2.A4.A27.A53.43A14.8A36.A3.2A6.A4.A5.A$16.A2.A2.A3.A4.5A.A2.A2. A2.A2.A2.A3.A4.5A.A2.A2.A2.A2.A2.A3.A4.5A.A2.A2.A2.A2.A2.A3.A4.5A.A2. A2.A4.A27.A53.A62.39A3.A7.A4.A5.A$16.A2.A2.5A4.A2.7A2.A2.A2.A2.5A4.A 2.7A2.A2.A2.A2.5A4.A2.7A2.A2.A2.A2.5A4.A2.7A2.A4.A27.A53.A62.A41.A7.A 2.A.A2.A2.A$16.A2.A11.A5.A2.A2.A2.A2.A11.A5.A2.A2.A2.A2.A11.A5.A2.A2. A2.A2.A11.A5.A2.A2.A4.A27.A53.A9.51A2.A41.A7.12A$16.A2.A8.A2.A8.4A2.A 2.A8.A2.A8.4A2.A2.A8.A2.A8.4A2.A2.A8.A2.A8.4A4.A27.A53.A9.A48.2A2.4A 5.30A3.4A7.A4.A2.A$16.A2.13A8.A5.A2.13A8.A5.A2.13A8.A5.A2.13A8.A7.A 27.A53.A9.A49.A4.2A5.A4.A17.A4.2A5.2A7.A7.A$16.A11.A11.A5.A11.A11.A5. A11.A11.A5.A11.A11.A7.A27.A53.A9.A34.12A3.A5.3A3.A4.A17.A5.A6.6A2.A7. A$16.A23.A5.A23.A5.A23.A5.A23.A7.A27.A53.A9.A34.A10.A3.A6.6A2.5A13.5A 3.A7.A3.A2.9A$16.A23.A5.A23.A5.A23.A5.A23.A7.A27.A53.A9.A34.A10.A3.A 6.A7.A3.A13.A3.A3.A7.A3.A10.A$16.25A5.25A5.25A5.25A7.A27.A42.12A9.A7. 28A3.5A2.A3.A6.A7.A3.A13.A3.A3.A7.A3.A10.A$40.A29.A29.A29.A7.A23.5A 42.A10.A9.A7.A30.A3.A2.12A7.A3.A13.A3.A3.9A3.4A7.A$40.A29.A29.A29.A7. A23.A3.5A38.A10.A9.A7.A30.A3.A21.5A13.5A10.3A5.A7.A$40.6A24.17A2.12A 29.A7.A23.A3.A3.A38.A10.12A6.A30.A3.A23.A17.A14.A5.3A5.A$45.A40.A2.A 40.A7.A23.A3.A3.A38.A10.A5.A3.A7.A30.A2.2A23.A17.A14.A7.A5.A$45.A40.A 2.A40.A7.A22.3A2.A2.3A37.A10.A5.A3.A7.A27.4A2.4A17.7A10.14A6.A7.A5.A$ 45.7A34.A2.7A34.A4.4A23.A3.A3.A38.A7.A2.A2.A2.A2.3A6.A19.5A3.A2.A2.A 2.A17.A5.A10.A7.A4.A6.A7.A5.A$45.A4.12A7.13A.A2.A2.A4.12A7.13A.A2.A4. A26.A3.A3.A38.A4.13A3.A7.A19.A3.A3.A2.4A2.A17.A5.A10.A7.A4.A6.A6.2A5. A$45.A4.A10.A7.A10.7A2.A4.A10.A7.A10.7A4.A25.10A38.A4.A2.A5.A2.A3.A7. A16.4A3.5A8.A17.A5.A10.4A4.A2.5A4.A6.5A2.A$45.A4.A10.A7.A10.A2.A2.A2. A4.A10.A7.A10.A2.A2.A4.A26.A7.A38.A4.A2.A8.5A7.A2.5A2.5A2.A2.A3.A3.A 8.A3.7A7.A3.5A10.4A2.A2.A3.A4.A2.5A6.A$45.A3.3A2.5A2.A7.A2.5A3.A5.A2. A3.3A2.5A2.A7.A2.5A3.A5.A4.A26.A7.34A5.A4.A2.A8.A11.A2.A3.A2.A3.A2.A 2.5A3.A7.2A3.A5.A7.A3.A3.A10.A2.A2.A2.A3.A4.A2.A3.A6.A$45.A4.A3.A3.A 2.A7.A2.A3.A3.A5.A2.A4.A3.A3.A2.A7.A2.A3.A3.A5.A4.A26.A39.2A5.A4.A2. 10A11.4A3.4A3.4A10.A7.6A5.A7.A3.A3.A8.3A2.4A2.A3.A4.A2.A3.A6.A$45.A4. A2.3A2.A2.A7.A2.A2.3A2.A5.A2.A4.A2.3A2.A2.A7.A2.A2.3A2.A5.A4.A26.A40. A5.A4.A11.8A4.A2.A3.A2.A3.A2.A9.2A7.A3.4A3.A7.A3.A3.A8.A10.5A4.A2.A3. A6.A$45.A8.A6.A7.A6.A9.A2.A8.A6.A7.A6.A9.A4.A26.A40.A5.A3.2A18.A4.A2. 5A2.5A2.A9.10A6.A3.A7.A3.5A8.A12.A6.A2.2A2.A6.A$45.A8.A6.A7.A6.A9.A2. A8.A6.A7.A6.A9.A4.A26.A40.A4.2A3.10A10.A4.A16.A9.A15.A3.A7.A5.A10.3A 10.A6.A6.A6.A$45.17A7.18A2.17A7.18A4.A26.A39.2A3.3A3.A8.8A3.A4.A16. 11A15.A3.A7.A5.A12.A2.9A6.A6.A6.A$45.A15.A7.A16.A2.A15.A7.A16.A4.A26. A39.6A5.A15.A3.A4.A42.A3.A7.A3.5A10.A2.A7.A6.A5.3A5.A$45.A15.A6.2A16. A2.A15.A6.2A16.A4.A17.10A39.A3.2A5.A15.A3.A4.A42.A3.A7.A3.A3.A8.3A2.A 7.A6.A6.A6.A$45.A4.12A6.16A2.A2.A4.12A6.16A2.A4.A17.A48.A3.A6.9A7.A3. A4.A5.5A2.5A2.5A18.A3.A7.A3.A3.A8.A4.4A2.5A4.A6.A6.A$45.A4.A9.2A6.A 17.A2.A4.A9.2A6.A17.A4.A17.A48.A3.A14.A6.2A3.A4.A5.A3.A2.A3.A2.A3.A 18.A3.A5.3A3.A3.A8.A7.A2.A3.A4.A4.10A$45.A4.A9.A7.A17.A2.A4.A9.A7.A 17.A4.6A12.A48.A3.A14.A6.3A2.A4.A2.4A3.4A3.4A3.5A14.A3.3A3.A5.5A8.A7. A2.A3.A4.A4.A$45.A14.A7.A13.5A2.A14.A7.A13.5A4.A4.A12.4A14.32A3.11A4. A6.A4.A4.4A2.A3.A2.A3.A2.A3.A3.A14.A5.A3.A7.A10.5A3.A2.A3.A4.A4.A$45. A14.10A12.A6.A14.10A12.A8.A4.A14.2A14.A43.7A2.5A4.A4.A2.A2.5A2.5A2.5A 3.A2.13A5.A3.5A3.A13.6A2.5A4.A4.A$45.12A3.A3.A3.A13.A6.12A3.A3.A3.A 13.A8.A4.A15.9A6.A43.A3.A4.A3.A4.A4.A2.A24.A2.A10.5A2.A6.9A10.A3.2A4. A6.A4.A$56.A2.3A2.A2.3A12.A17.A2.3A2.A2.3A12.A8.A3.2A16.A6.A6.A43.A3. A4.A3.A4.A4.A2.A23.2A2.A14.A2.A6.A7.A10.A3.A5.A6.A4.A$56.A3.A3.A3.A 13.A17.A3.A3.A3.A13.A8.A3.15A3.A6.A6.A4.40A2.3A3.2A2.A4.A4.A2.A2.5A 16.5A7.A6.A2.A6.A7.A10.A3.A5.A6.A4.A$56.A3.A3.A3.A13.A17.A3.A3.A3.A 13.A8.A3.A4.A7.2A3.A5.2A6.A4.A38.A3.A8.A4.A4.A2.A2.A3.A16.A11.A6.A2.A 6.A5.8A5.A3.7A6.A4.A$56.A3.A3.5A13.A17.A3.A3.5A13.A8.A3.A4.A8.5A5.5A 3.A4.A38.A3.A8.A4.A4.A2.4A3.18A11.3A4.A2.A6.A5.A6.A5.A16.A4.A$56.A3. 5A17.A17.A3.5A17.A8.A3.A4.A11.4A3.A2.6A4.A22.5A11.A3.4A5.A4.A4.A40.A 4.A2.A6.A5.A6.A5.A16.A4.A$56.A7.A17.A17.A7.A17.A8.A3.A4.A14.A3.A2.A9. A22.A3.A10.2A3.A2.A4.3A3.A4.A40.A4.A2.A6.A5.4A3.A2.4A16.A4.A$56.A7. 16A2.A17.A7.16A2.A8.A3.A4.A2.2A10.A3.A2.A9.A22.A3.A10.3A2.A2.A5.A4.A 4.A33.5A2.A4.A2.A6.A7.6A2.A19.A4.A$56.A13.A8.A2.A17.A13.A8.A2.A8.A3.A 4.A3.A10.A3.A2.4A6.A22.A3.A6.5A4.A2.A5.A4.A4.A12.6A8.4A3.A3.A2.A4.A2. A6.4A4.A7.A19.A4.A$56.A13.A8.A2.A17.A13.A8.A2.A8.A3.A4.A3.A10.A3.A4. 9A22.A2.2A6.A3.A4.A2.A5.6A2.3A12.A4.A8.A2.A3.A3.A2.A4.A2.A8.7A7.A19.A 4.A$56.A9.A2.3A2.A4.A2.A17.A9.A2.3A2.A4.A2.A8.A3.A4.5A10.A3.A4.A27.4A 2.4A4.A3.A4.A2.A5.A7.A14.A4.10A2.5A3.A2.A4.A2.A8.A13.A19.A4.A$56.A9.A 3.A3.A.A2.A2.A17.A9.A3.A3.A.A2.A2.A8.A3.A4.A14.A3.A4.A12.5A2.5A3.A2.A 2.A2.A4.A3.A4.A2.A5.A7.A8.8A22.2A2.A4.A2.A8.A13.A19.A4.A$56.A9.5A3.6A 2.A17.A9.5A3.6A2.A8.A3.A4.A14.A3.A4.A12.A3.A2.A3.A3.A2.4A2.A4.2A2.A4. A2.A5.A7.4A5.A5.A23.5A4.A2.A8.4A10.A19.A4.A$56.A19.A2.A2.A17.A19.A2.A 2.A8.A3.A3.2A14.A3.A4.A2.5A2.4A3.4A3.5A8.A8.A4.A2.A5.A9.2A5.A5.A2.5A 2.5A2.5A2.A8.A2.A10.13A3.17A4.A$56.A22.4A17.A22.4A8.A3.A3.12A4.A3.A4. A2.A3.A2.A2.A3.A2.A3.A3.A8.A8.A4.A2.A5.A10.3A3.A2.A2.A2.A3.A2.A3.A2.A 3.A2.A8.A2.A10.A15.A6.A13.A$56.A22.A20.A22.A11.A3.A3.A9.7A3.A4.4A3.4A 2.5A2.5A3.A7.2A7.3A3.A2.A5.A11.15A3.4A3.4A3.5A7.A2.A8.3A15.A6.A13.A$ 56.24A20.24A11.A3.A3.A9.A5.A3.A4.A2.A3.A2.A17.A7.7A3.A4.A2.A4.2A3.5A 3.A3.A3.A.A3.A3.A2.A3.A2.A3.A3.A7.A2.A8.A12.6A4.5A11.A$79.A43.A11.A3. A3.A.A7.A5.A3.A4.A2.5A2.A16.2A7.A5.A3.A4.A2.A4.6A2.2A3.A3.A5.A3.5A2. 5A2.5A3.A7.A2.A8.A12.A9.A3.A11.A$79.A43.A11.A3.A3.7A3.A5.A3.A4.A9.A 16.10A5.A3.A4.A2.A2.3A3.2A3.5A3.A5.A24.2A7.A2.A8.A12.A9.A3.A11.A$79. 7A34.A2.A11.A3.A5.A3.A3.A5.A3.A4.A9.15A2.A14.A3.A4.A2.A2.2A4.A7.3A2. 7A24.5A4.A2.A8.A10.5A7.A3.A11.A$85.A2.A5.5A11.5A3.6A7.5A3.A5.A3.A3.A 5.A3.2A3.A23.A2.A14.A3.6A2.A2.A5.A9.A8.A3.5A2.5A9.A3.A4.A2.A8.A4.4A2. A3.A7.5A11.A$85.6A3.A3.A11.A3.A3.A.A2.A7.A6.3A4.A2.3A2.A5.A4.A3.A23. 4A14.A3.A7.4A3.3A9.A8.A3.A3.A2.A3.A2.8A3.A4.A2.A8.A4.A2.A2.A3.A9.A13. A$85.A2.A.A2.3A2.A11.A2.3A2.A4.A7.A7.A5.A3.A9.A4.A3.A41.A3.A14.2A10.A 8.5A3.A2.A3.A2.A10.A4.A2.A8.A4.A2.A2.A3.A9.A13.A$85.A8.A19.A8.A7.5A3. A5.A3.A9.A4.A3.A3.5A33.A3.A14.A8.4A16.4A3.4A10.A4.A2.A8.A4.A2.A2.5A7. 5A11.A$85.A8.A19.A8.A3.2A2.A3.A3.A3.13A3.A4.A3.A3.A3.A6.5A2.5A2.5A8.A 3.5A10.A8.A40.A4.A2.A8.A4.A2.A4.A9.A3.A11.A$85.16A7.16A3.A3.A3.A3.A3. A3.A3.A3.A3.A4.A3.A3.A3.A6.A3.A2.A3.A2.A3.A8.A7.A10.A8.A40.A4.A2.A8.A 4.A2.A4.A9.A3.A11.A$85.A14.A7.A14.A3.A3.A3.A3.A3.A3.A3.A3.A3.A4.A3.A 3.A3.A3.4A3.4A3.4A3.5A4.A7.A10.A8.A12.5A13.5A5.A4.A2.A8.A4.A2.6A9.A3. A11.A$85.A14.A6.2A14.A3.5A3.A3.5A2.3A2.A3.A3.A4.A3.A3.A3.5A2.A3.A2.A 3.A2.A3.A3.A3.2A7.A10.A8.A12.A3.A13.A3.A5.A4.A2.A8.A4.A7.A9.5A11.A$ 85.A2.13A6.14A2.A3.A3.A3.A6.2A3.A3.A3.A3.A4.A3.A3.A7.A2.5A2.5A2.5A3.A 3.6A3.A10.A8.A9.4A3.4A3.5A2.A3.A5.A4.A2.A8.A4.A7.A11.A13.A$85.A13.2A 6.A15.A3.A3.A3.A6.A4.A3.A3.A3.A4.A3.A3.A7.A24.A3.A4.A3.A10.A8.A2.5A2. A2.A3.A2.A3.A3.A2.A3.A5.A4.A2.A8.A4.A5.5A9.A13.A$85.A13.A7.A15.A3.A2. 2A3.A6.A3.6A3.A3.A4.A3.A3.A7.A23.2A3.A4.A3.A10.A8.A2.A3.A2.A2.5A2.A3. A3.A2.A2.2A5.A4.A2.A8.A4.A5.A3.A5.8A10.A$85.9A5.A7.A15.A3.A2.3A2.A6.A 4.A7.A3.A4.A3.A3.A7.A2.5A16.6A4.A3.A10.A8.4A3.4A9.5A3.4A2.5A2.A4.A2.A 8.A4.A5.A3.A5.A6.A10.A$93.A5.10A14.A3.A2.A4.A6.A4.A7.A3.A4.A3.A3.A7.A 2.A3.A16.A3.4A2.A3.A10.A8.A2.A3.A2.A9.A3.A3.A2.A2.A3.A2.A4.A2.A8.A2. 3A5.A3.A5.A6.A10.A$93.A5.A3.A3.A15.A3.4A4.A6.A3.2A7.A3.A4.A3.A3.A7.4A 3.18A6.A2.A3.A10.A8.A2.5A2.7A3.A3.A3.A2.4A3.A2.A4.A2.A8.A2.A7.5A5.A4. 5A8.A13.8A$93.A4.3A2.A2.3A14.A11.A6.A3.6A3.A3.A4.A3.A3.A38.A2.A3.A10. A8.A15.A3.A3.5A9.A7.A2.A8.A2.A9.A7.A4.A3.A8.A13.A6.A$93.A5.A3.A3.A15. A11.A6.A3.A4.A3.A3.A4.A3.5A38.A2.A3.A10.A8.A15.A2.2A16.2A7.A2.A8.A2.A 9.A7.A4.A3.A8.A13.A6.A$93.A5.A3.A3.A15.A11.A5.2A3.A4.A3.A3.A4.A3.A26. 5A6.6A2.A3.A10.A8.A15.A2.4A14.7A2.A2.A8.A2.A2.8A7.A4.A3.A8.A11.5A4.A$ 93.A5.5A3.A15.A5.7A5.6A4.A3.A3.A4.A3.A26.A3.A6.A7.A3.A10.A8.A15.A2.A 2.A14.A5.A2.A2.A8.A2.A2.A6.A7.A4.5A8.A11.A3.A4.A$93.A9.5A15.A5.A9.3A 3.2A4.A3.A3.6A3.A21.6A3.4A3.A7.A3.A10.A8.A15.4A2.16A5.A2.A2.A8.A2.A2. A6.4A4.A6.A10.A11.A3.A4.A$93.A9.A19.A5.A9.2A4.A5.A3.A3.A4.A3.A2.5A5. 5A4.A4.A3.A2.A3.A7.A3.A10.A8.A41.2A2.A2.A8.A2.A2.5A2.A2.A4.A6.A10.A 11.A3.A4.A$93.A4.6A19.A4.2A9.A5.A5.A3.A3.A4.A3.A2.A3.A5.A3.A4.A4.5A2. A3.A7.A3.A10.A8.A41.5A2.A8.A2.A5.5A2.A4.4A3.A10.A11.5A3.2A$93.A4.A24. A4.12A5.A5.A3.A3.A4.A3.4A3.7A3.8A9.A3.A7.A3.A10.A8.A12.5A5.5A14.A6.A 8.A2.A5.A6.A6.9A7.A5.5A3.A5.4A$93.A4.A24.A4.A14.3A5.A3.A3.A4.A3.A2.A 3.A2.A2.A3.A2.A3.A9.A3.A7.A3.A10.A8.A12.A3.A5.A3.A6.9A6.A8.A2.A5.A6.A 6.A7.A7.A5.A3.A3.A5.A2.A$93.A2.28A4.A14.2A6.A3.A3.A4.A3.A2.5A2.A2.5A 2.A3.A9.A3.A7.A3.A10.A8.A9.4A3.7A3.5A2.A6.4A4.A8.A2.A5.A4.5A4.A7.A7.A 2.4A3.11A2.A$93.A2.A6.A7.A7.A8.A14.A7.A3.A3.A4.A3.A9.A9.A2.2A9.A3.A7. A3.A10.A8.A9.A2.A3.A2.A2.A3.A3.A2.A9.A4.A8.A2.A5.A4.A3.A4.A5.8A2.A2.A 2.A3.A2.A9.A$93.A2.A6.A7.A7.A8.A14.A7.A3.A3.A4.A3.A9.A9.A2.9A2.A3.A7. A3.A10.A8.A9.A2.5A2.A2.5A3.A2.A9.A4.A8.A2.4A2.A4.A3.A4.A5.A6.A2.A2.A 2.5A2.A9.A$93.A2.A2.A2.3A2.A2.3A2.A3.A8.4A7.5A7.A3.A3.A4.A3.A3.7A9.A 2.A6.5A3.A7.A3.A10.A8.A9.A9.A10.A2.A4.6A4.A8.A4.5A4.A3.A4.A5.A6.A2.A 2.A9.A9.A$93.A2.A2.A3.A3.A3.A3.A3.A8.A2.A7.A2.6A3.A3.A3.A4.A3.A3.A15. A2.A6.A7.A7.A3.A10.A8.A9.A9.A10.A2.A4.A3.4A2.A8.A4.A2.2A4.5A4.A5.4A3. A2.A2.A8.2A9.A$93.A2.A2.5A3.A3.A3.A3.A8.A2.A2.3A2.A7.A3.A3.A3.A4.A3.A 3.A15.4A5.2A7.A7.A3.A10.A8.A9.7A3.A2.6A2.A2.A4.A6.A2.A8.A4.A2.A7.A6.A 7.6A2.A2.A8.9A2.A$93.A2.A10.5A2.3A2.A3.6A2.A3.A3.A7.A3.A3.A3.A4.A3.A 3.13A12.10A7.A3.A10.A8.A2.5A2.A5.A3.A2.A3.5A2.A4.A6.A2.A8.A4.A2.A7.A 6.4A4.A7.A2.10A6.5A$93.A2.A13.2A3.A3.A3.A3.2A2.A3.A3.A7.A3.A3.A3.A4.A 3.A15.A12.A7.4A5.A3.A10.A8.A2.A3.A2.A5.A3.A2.A3.A6.A4.8A2.A7.2A4.A2. 9A8.7A7.A2.A15.A$93.A2.A13.A4.A3.A3.A3.A3.9A7.A3.A3.A3.A4.A3.A15.14A 10.A5.A3.A10.A8.4A3.4A3.3A3.4A3.A6.A9.A4.A6.3A4.A19.A13.A2.A15.A$93.A 2.A7.A5.A4.A3.A3.A3.A11.A2.3A2.A3.A3.A3.A4.A3.A3.5A31.A5.A3.A10.A8.A 2.A3.A2.A3.A11.2A6.A9.A4.A6.A6.A19.A13.A2.A15.3A$93.A2.20A3.A3.A3.A 11.A3.A3.A3.A3.A3.A4.A3.A3.A3.A31.A5.A3.A10.A8.A2.5A2.A2.2A11.9A2.8A 4.4A3.A6.18A2.A13.A2.A2.5A10.A$93.A10.A9.6A3.A3.A11.A3.A3.A3.A3.A3.A 3.2A3.A3.A3.A3.4A2.4A2.17A5.A3.A10.A8.A9.A2.4A2.4A3.A10.A13.2A3.A22. 5A13.A2.A2.A3.A2.A7.A$93.A25.A3.A3.A11.9A3.A3.A3.A3.3A2.A3.A3.A3.A2.A 2.A2.A2.A21.A3.3A8.A8.A9.A2.A2.A2.A2.A3.A10.A14.A3.A22.A17.A2.4A3.8A 2.2A$93.A25.A3.A3.A19.A3.A3.A3.A3.A4.A3.A2.2A3.A2.4A2.4A21.A5.A8.A8.A 9.4A2.4A2.5A10.12A3.A3.A21.2A17.A5.A3.A2.A2.6A$93.27A3.A3.A8.A10.A3.A 3.A3.5A4.5A2.6A33.A5.A8.A8.A28.5A14.A3.A2.2A20.3A17.A5.5A5.A25.A23.A 51.A44.A43.A85.A33.A25.A3.A33.A48.A24.A28.A38.A1034.A2517.A$119.A3.A 3.A5.15A3.A3.A16.A2.A29.6A2.2A5.A8.A8.A28.A3.A14.A3.A2.4A18.A19.A15.A $119.A3.A3.A5.A2.A14.A3.A16.4A29.A3.6A4.2A7.2A8.30A3.16A2.2A2.A2.A17. 2A18.2A14.2A$87.15B17.A3.A3.A5.A21.A49.A3.A9.4A5.4A57.5A2.A17.4A16.4A 12.9A$87.A.G11A.F17A3.A3.A5.A21.A49.A3.A9.A2.A5.A2.A57.A6.A17.A2.A16. A2.A12.A7.A$87.15B16.6A3.79A3.11A2.7A2.59A6.19A2.18A2.14A$363.14A.A2. A.2A2.A3.2A.2A3.3A3.A2.2A.2A2.3A3.A2.2A.2A2.3A3.A2.2A.2A3.A2.2A.A.A.A 4.3A2.15A.A.A.A.2A5.A.A2.A.3A.3A.4A4.3A.2A2.A3.2A.A.A.A.2A2.A3.10A3.A 3.9A3.A3.6A.A4.3A.2A2.A.2A.A.A.3A.A.A.A.A.A.2A2.A4.3A2.4A.A.A.A.3A.A 6.A2.A.2A.A.A.2A4.9A2.2A.A.A.A4.3A2.4A.A.A.A.2A5.A2.A.2A.A.A.2A.2A.A. A.A.A.A.A.2A3.3A5.7A2.3A.3A.3A5.7A3.A3.4A2.3A5.8A.A2.A.2A2.A3.2A.2A3. 3A5.9A.A2.A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.4A2.A.3A.3A.4A4.3A.2A2.A 3.2A.A.A.A.2A5.13A2.A.2A.A.A.2A.2A.A.A.A.A.A.A.2A2.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A. A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A.A .A.A.A.A.A.A.A.A.A.A.A4.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A. 3A.3A.3A.3A.3A.4A2.A.3A.3A.3A.3A.3A.3A.3A.4A4.3A.2A2.A3.2A.A.A.A.2A5. 12A.A.A.A2.A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A .3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A .3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A .3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A.3A .4A.A.3A.A.A.A.A.A.A.4A! golly-2.5-src/Patterns/Devore/discriminator.rle0000644000175100001440000000230112156145314016606 00000000000000# An organ that can discriminate between 6 signals and 7 signals. It uses # two compact "7-transforms" and a special T-junction structure to direct the # flow of signals appropriately. Unlike in Codd's CA, these structures are # initialised by the sheathing structure. # # John Devore writes: (part II) # "I recall two other important components. One was a miniature 7-transform. # Any signal that went through it came out as a 7. ... [And then] there was a # 6-7 discriminator. This latter one had an input and two outputs (sort of like # a T junction, but with a more complex structure at the junction). If a 6 came # in the input a 7 would go out one of the outputs. If a 7 came in the input a 7 # would go out the other output. This one required some minor modification to # the collision rules -- actually addition of rules to handle collision of # different signals -- Codd only defined collision of identical signals." # x = 79, y = 14, rule = Devore 67.5A4.3A$47.A19.A3.A6.A$43.25A3.A6.A$43.A3.A5.A13.A3.A5.A$43.A9.A13. 5A5.A$.35B7.A9.A$B3A.F29A.F17A$BA24BA9B4.A12.A$BAB22.BAB12.A12.A13.5A 5.A$BAB22.BAB12.A6.A5.A13.A3.A4.A$BAB22.BAB12.28A3.A4.2A$BA24BAB19.A 5.A13.A3.A4.A.A$B21AG.3AB39.5A5.A$.26B! golly-2.5-src/Patterns/Generations/0000755000175100001440000000000012156146015014350 500000000000000golly-2.5-src/Patterns/Generations/Banner.mcl0000755000175100001440000000050412156145314016175 00000000000000#MCell 2.0 #GAME Generations #RULE 2367/3457/5 #BOARD 800x800 #SPEED 0 #WRAP 1 #D "Banners" rule collection #D #D The banner. #D #D Mirek Wojtowicz, June 1999 #L 19.AA$19.ADAA$20.DBA$17.D.ABBA$16.C..3A$15.BDDAA$14.ACCA$11.D.ABBA$6.D #L 3.C..3A$4.CC3.BDDAA$4.DD..ACCA$3.CDD.ABBA$..AAD..3A$.ABBDDAA$.ABCCA$. #L BBCA$ADBA$3A golly-2.5-src/Patterns/Generations/Bloomerang.mcl0000755000175100001440000000037112156145314017057 00000000000000#MCell 4.00 #GAME Generations #RULE 234/34678/24 #BOARD 80x80 #WRAP 1 #D Bloomerang #D #D A wave rule that rebounds into a kinder, gentler form #D of kaleidoscopics - rounded, soft, full, and slow. #D #D John Elliott, July 2000 #L 5A$5A$5A$5A$5A golly-2.5-src/Patterns/Generations/Burst.mcl0000755000175100001440000000117512156145314016074 00000000000000#MCell 4.00 #GAME Generations #RULE 0235678/3468/9 #BOARD 400x400 #SPEED 0 #WRAP 1 #CCOLORS 9 #D Burst, a generations rule related to Nova, Prairie Fire and others #D which features large areas of cells that slowly die out or decay #D into oscillators. #D #D Named after a characteristic exploding oscillator. Similar to Day&Night #D in that constructions can be built both with inside and outside #D oscillations and growth/decay. Has still lifes similar to Life. #D #D Michael Sweney, March 2000 #L 12.A$12.A$12.A$12.A$12.A$12.A$12.A$11.3A$11.3A$9.7A$9.7A$7.11A$25A$7. #L 11A$9.7A$9.7A$11.3A$11.3A$12.A$12.A$12.A$12.A$12.A$12.A$12.A golly-2.5-src/Patterns/Generations/Caterpillars.mcl0000755000175100001440000000100612156145314017413 00000000000000#MCell 2.0 #GAME Generations #RULE 124567/378/4 #BOARD 300x300 #SPEED 50 #WRAP 1 #D "Caterpillars" rule by Mirek Wojtowicz #D #D June 1999 #L 51.AB$51.3AC$51.3AC$51.AB5$51.AB.B$51.5AC$51.5AC$51.AB.B5$51.AB.B.AC$ #L 51.7AB$51.7AB$51.AB.B.AC10$52.AA$54.AA$$54.A.AA7$54.A$53.A$52.A$51.A.A #L $51.A.A$52.A$53.A$54.A8$52.3A$51.A9$54.A$53.A$52.A$51.A.A$51.A.A$52.A #L 8$51.A$51.A$51.A$51.A8$66.A$..BA46.AB14.A$C3A46.3AC12.A$C3A46.3AC12.A$ #L ..BA46.AB14.A$66.A$66.A$66.A$66.A$$3.BA45.AB$.C3A45.3AC$.C3A45.3AC$3.B #L A45.AB golly-2.5-src/Patterns/Generations/Delta.rle0000644000175100001440000000134512156145314016031 00000000000000#C Generations 345/3/6 was noted and named "LivingOnTheEdge" by Mirek Wojtowicz in 2000. #C There is no evidence of this rule being explored in depth before Golly 2.0. #C This puffer head was found by Tony Smith in 2008 at iteration 191601 from a simple seed. #C "Delta" demonstrates how 345/3/6 bridges the border of order--edge of chaos. #C Stabilisation lengthens behind the puffer head at roughly half its c/2 forward speed. #C Mechanisms in the head show period doubling 2 to 8 then multiply by 7 before doubling more. #C Look for the illusion of space ships entering muck then re-emerging on time and on course. x = 13, y = 10, rule = 345/3/6 8.DB$7.EC3A$.ED2A.A2.DB2A$DC.AB7A$AB.A.A.A.A$2A.B.A.A.A$2A.AC7A$2.EBA .A2.DB2A$7.EC3A$8.DB! golly-2.5-src/Patterns/Generations/Ebb-and-Flow.mcl0000755000175100001440000000114212156145314017124 00000000000000#MCell 2.0 #GAME Generations #RULE 012478/36/18 #BOARD 300x300 #SPEED 10 #WRAP 0 #CCOLORS 18 #D Ebb&Flow #D #D A slow exploding rule with interesting internal dynamics #D within the growth boundaries. Different types of symmetries will #D often determine whether a pattern grows indefinitely or dies out. #D Presents challenging engineering problems. #D #D Best viewed with MCell standard/default color palette #D at speeds of 10 or slower. #D #D Michael Sweney, October 1999 #L 12A$A..6A..A$A.8A.A$3A.4A.3A$3A.4A.3A$A.8A.A$A.3A..3A.A$A.3A..3A.A$A. #L 3A..3A.A$A.8A.A$3A.4A.3A$3A.4A.3A$A.8A.A$A..6A..A$12A golly-2.5-src/Patterns/Generations/Fireworks.mcl0000755000175100001440000000031012156145314016736 00000000000000#MCell 2.0 #GAME Generations #RULE 2/13/21 #BOARD 200x200 #SPEED 0 #WRAP 0 #D Fireworks #D An admirably beautiful rule by John Elliott #D #D Sample starting pattern. #L 88.A6$A58$61.A24$107.A11$37.A golly-2.5-src/Patterns/Generations/Lava.mcl0000755000175100001440000000555412156145314015665 00000000000000#MCell 2.0 #GAME Generations #RULE 12345/45678/8 #BOARD 300x300 #SPEED 0 #WRAP 1 #CCOLORS 8 #D Lava rule by Mirek Wojtowicz #D #D June 1999 #L A115.64A7.26A$A115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A$A #L 115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A #L $A115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A$A115.A62.A7.A #L 24.A$A115.A62.A7.A24.A$A115.A62.A7.A24.A5.13A$A55.A59.A62.A7.A24.A5.A #L 11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A #L 62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A #L 11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A #L 62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A11.A$A55.A59.A62.A7.A24.A5.A #L 11.A$A55.A59.A62.A7.26A5.13A$A55.A59.A62.A$A55.A59.A62.A$A55.A59.A62.A #L $A55.A59.A62.A$A55.A59.A62.A$A55.A59.A62.A7.48A$A55.A59.A62.A7.A46.A$A #L 55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59. #L A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7. #L A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A #L 55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59. #L A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7.A46.A$A55.A59.A62.A7. #L A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A #L 7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A #L 62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A #L 115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A #L $A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A #L 46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A #L 7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.A46.A$A115.A #L 62.A7.A46.A$A115.A62.A7.A46.A$A115.A62.A7.48A$A115.A62.A$A41.57A17.A #L 62.A$A115.A62.A$A115.A62.A$A115.A62.A$A115.A62.A$A115.A62.A7.55A$A115. #L A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A #L 115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A #L $A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A #L 53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A #L 7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A #L 62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A #L 115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A #L $A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A #L 53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A #L 7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A #L 62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A #L 115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A #L $A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A #L 53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$A115.A62.A7.A53.A$72A44.64A7. #L 55A golly-2.5-src/Patterns/Generations/Lines.mcl0000755000175100001440000001106312156145314016044 00000000000000#MCell 4.00 #GAME Generations #RULE 012345/458/3 #BOARD 200x200 #WRAP 1 #D The rule quickly self-organizes into linear structures, with separate #D orthogonally hatched areas. To see most interesting behaviour seed #D the universe with a circle with r >= 40 and a density of 20%. #D #D Anders Starmark, September 2000 #L 41.A6.A8.A$39.A4.A8.A6.A..A$39.A16.A3.A4.AA$35.AA.AA4.A6.A..AA3.A5.3A$ #L 33.A3.A12.A..A.AA7.A..3A$31.A6.A.AA.A3.AA4.A3.AA7.A..3A$27.A4.A3.A17.A #L ..A.A..AA..A..AA$22.A..A3.A.A.A3.A4.A5.AA8.A..A7.A3.A$23.A4.A..A..A6.A #L 8.A6.A.A8.A..A5.A$20.A8.A5.A.A..A13.A.A11.AA4.A$42.A..A..3A.A5.A5.A11. #L 3A$26.A..A..A6.A8.A13.A3.A7.AA4.A$22.3A12.A7.A..AA15.A..A4.A6.A.A$20.A #L 3.A5.A11.A3.A4.A3.3A9.A4.A..A6.A$20.A4.3A10.A4.AA6.AA6.A5.A.A.A3.A.A.A #L .A4.A$15.A7.A..A9.A4.A.A6.A4.AA18.A4.AA$13.A8.A..AA..3A26.A3.A.A..AA.A #L ..A9.A.A$17.A3.A11.A3.A9.AA.A6.A.A4.A3.A8.A8.A$32.A.A..A7.3A16.A.A8.A #L ..AA3.A$17.A10.AA10.A4.A.AA3.A.A4.A.A4.A10.A8.AA$10.A5.A.A4.A.A10.A3.A #L 4.A..AA7.A7.A..A6.AA11.A$9.A5.AA..A5.AA4.A3.A6.A..A4.A4.A..AA.A5.A4.A #L 15.A$14.A28.A3.A8.A10.A..A.A5.AA3.A.A$7.A..A9.AA5.A6.A6.A4.A3.A12.A6.A #L 3.A4.A5.A.AA.A$9.A16.A3.A17.3A3.A..AA3.A4.AA3.A.A10.A$18.A23.AA13.AA8. #L AA..AA5.A12.A$10.A..A8.AA.A.AA8.A5.A..AA6.A5.A4.A3.A..A.A..A3.A.A.A..A #L 4.A$10.A.A..A8.A6.A7.A.A8.A3.AA4.A.AA5.A6.A10.A..A$4.A.A3.A3.A9.A4.A. #L AA5.A12.A10.AA.AA7.A11.AA$4.A5.A4.A.A4.A..A11.A3.A..A3.A8.A.A.A.AA.A #L 15.AA$5.A11.A..A6.AA13.A..A3.A3.A8.A3.A..AA3.A4.A3.A.A$5.A6.A6.A6.AA5. #L A.A6.AA8.A.A4.A.A.A6.A9.A8.A4.A$4.A3.A11.A.A3.A12.A12.A..A6.A19.A3.A4. #L A3.A$12.A10.A7.A3.AA.A3.A5.A6.AA4.AA..A3.AA.A4.AA12.A$..A.A8.A.A8.A12. #L A..A.A4.A5.A5.A4.A3.3A.A..A5.A3.A.AA.A5.A$13.A9.A16.AA.A4.A..A19.A.AA #L 9.AA8.A.A$3.3A..3A.A.A7.A..A4.A8.A..A12.A3.A4.A..A..A3.A9.A..A5.A$..AA #L .A3.A3.A20.A.4A.A6.A..A7.A..AA.A8.A.A9.A..A4.A.A$8.A.A4.A.A3.AA..A10. #L 3A3.A7.AA5.A22.A11.AA..A$.A3.A.A4.AA4.A..AA.A.A11.AA6.A9.A.A3.A4.A5.A #L 9.A.A$10.3A9.A.A11.A13.A.4A.A6.A5.A12.A8.A.A.A$3.A6.A.A10.A9.A.AA3.A.. #L A..A9.3A5.A8.AA..A3.A5.A.AA.A..A$9.AA3.A.A..A.A7.A4.A.A7.A6.A5.A3.A4. #L AA4.A3.A4.AA3.A10.A$A5.AA4.4A.A.A9.A4.AA3.A.A..3A4.A.A.A10.A7.A6.3A6.A #L $6.A.A9.A3.AA18.A4.AA4.A5.AA5.A9.A.A3.A3.A4.AA5.A$4.A3.A..A4.A.AA.AA6. #L A..A3.A3.A8.A8.AA4.A..A3.A.A.A9.A4.A5.A$..A3.A4.A8.A5.A..A..A5.A..A.A #L ..A5.A10.A6.A20.A$10.A8.A7.A.A8.A.A10.A..A7.A7.A7.A7.AA.A.A$A..A..AA3. #L A9.A5.A4.A.A.A.A8.A.A7.AA3.AA14.A.AA3.A4.A6.AA$A.A.3A7.A.A20.3A..A6.A #L 13.A3.A12.A12.A4.A$3.A9.A.AA..A..A3.AA4.A5.A3.A.A10.A16.A11.4A.A.A4.A$ #L 3.AA3.A.A.A16.3A.A13.A21.AA4.A11.A4.AA$.A4.A3.A5.AA3.A4.A7.A..A5.AA5.A #L .AA..A..A.A3.A.AA.A.A.A6.A3.AA3.A3.A.A$8.A..A.A9.A13.A12.A.3A5.AA4.3A #L 4.AA..A6.A8.A3.A$A23.A.AA..A4.AA11.A3.A8.A4.A7.A.A..A10.AA3.A.AA$6.A.. #L AA.AA..A3.AA.A..A3.A.A4.A3.A6.A7.AA..A3.AA5.A9.A.AA4.A3.A$A4.A11.A4.A #L 3.AA4.A.A5.AA5.A7.A4.A11.A7.A10.A$25.A3.3A4.A.A6.A.AA4.3A3.A..A3.3A5.A #L 3.AA3.A3.A..A.AA$AA5.A.A10.A4.AA.A6.A7.A..A..A..A3.A..A4.A15.AA9.AA3.A #L $.A12.A3.A..A9.A.A.A..A4.A5.A3.A3.A.A.A.A3.A.A.A3.A9.AA.AA.A4.AA$3.A.. #L A4.AA.A12.A10.A..A3.AA3.A..A4.A3.A.A4.A5.AA4.A.A3.A5.A$4.A3.3A12.AA4.A #L 4.A8.A12.AA12.A3.A9.AA4.A.A$..AA.A4.A.A6.A3.A6.A5.A6.A3.A3.A.AA5.A.A.A #L .A.AA..A15.A..A3.A.A$..A.A.A5.A.A14.A..A4.A4.3A4.3A.A11.A5.A.A12.A3.4A #L .A.A$13.A.A..AA..A..AA11.AA4.3A3.A..AA.A3.AA18.A.A$4.A.A5.A6.A6.A5.A.A #L .A..A13.A7.A.A5.A3.A4.A16.A$..A.A5.AA..3A5.A10.A..A3.3A3.AA..AA3.A12.A #L .A5.A3.A6.AA..A$9.AA.A12.3A7.A..A11.A9.A7.AA4.A10.A.AA..A.A$5.A.A.A20. #L A4.A5.AA..A..A.A3.A.A5.A6.A..A3.A6.A..A..A4.A$5.A3.A.A10.A8.AA..3A9.A #L 5.A.A.A.A.A11.A4.A5.A5.A.A$5.A6.A..A12.A7.A13.A.A5.A9.A..3A5.A10.A$5.A #L .A4.A14.AA6.A.A..A..A5.A6.A.A.A6.A..A5.AA3.A6.A$6.AA5.AA3.A3.A9.A4.AA #L 6.3A3.A.A14.A14.A9.A$6.A4.A10.A.AA..A3.A6.A..A..AA3.A4.A.A7.AA3.A3.A.. #L A..A.A3.A.A3.A$6.A..A3.A4.AA6.AA5.A3.A7.A4.AA6.A4.AA8.A.AA3.AA4.A$20. #L AA7.A4.A.A..A3.A10.AA12.AA3.A16.A$9.A3.A..A8.A12.AA3.A.A.A8.A.A4.A14.A #L ..A5.A$8.A.A3.A3.A11.A10.A6.A.A3.A..A3.A5.A8.A..A10.A$9.A3.AA..A19.A.. #L A4.A5.A.A3.A12.A4.A3.A4.A.A$16.A6.A4.A.AA9.AA.A..A7.A8.A16.A6.A$14.A6. #L A6.AA25.A8.A3.A5.AA.A4.A3.A$13.AA13.AA7.A25.A.A6.A9.AA$14.A3.AA..AA.A #L 10.3A3.A..A.A.AA4.A3.A11.AA.A3.AA$18.A12.A4.A3.A3.A..AA3.A.AA.AA7.A..A #L .A..A.AA3.A3.A$17.AA9.AA..A10.A14.AA8.A5.A.A..A$20.A3.A9.A.A3.3A.A3.A #L 23.A.A6.A$16.A5.A..A8.A4.A14.A4.A4.A..3A4.A4.A$17.A..A3.A5.A3.A7.A4.A #L 7.A..A6.A4.A3.A.A$27.A..A22.AA20.AA.A.A$19.AA.5A3.AA..A3.A4.A18.A7.A4. #L A$21.A4.A..A6.A.A5.A3.A10.A6.A..AA.A$25.A4.A9.AA.A7.AA3.A.A..A4.A6.A.A #L $38.A4.A16.A.AA.A7.A$26.A.A3.A5.A10.AA5.3A10.A$44.3A4.A.A..A3.A$31.AA #L 3.AA8.A8.A$34.A4.A4.4A8.A..A$36.A.A5.A.A.A3.A3.A$40.AA3.A3.A5.AA golly-2.5-src/Patterns/Generations/MeteorGuns.mcl0000755000175100001440000000117212156145314017062 00000000000000#MCell 4.00 #GAME Generations #RULE 01245678/3/8 #BOARD 180x180 #WRAP 0 #D MeteorGuns #D #D Almost any design above a certain level of complexity results in #D a slowly exploding ball of fire which then spits fairly large numbers #D of generational gliders "meteors". #D #D There are easily discovered stable oscillators and static patterns. #D A truly satisfying environment (if only finding a limited growth meteor #D gun were as easy...). #D #D Discovered by Charles A. Rockafellor, March 2000 #L 8.A$8.A$9.A$10.A7.5A$10.A6.A$11.A3.AA$12.A.A$12.AA$11.A..A$10.A4.A$9.A #L 6.A$8.A7.A$6.AA9.A$5.A12.A$3.AA14.A$..A16.A$.A17.A$.A$AA golly-2.5-src/Patterns/Generations/Nova.mcl0000755000175100001440000000046012156145314015674 00000000000000#MCell 2.0 #GAME Generations #RULE 45678/2478/25 #BOARD 300x300 #SPEED 10 #WRAP 0 #D "Nova" rule by Mirek Wojtowicz #D #D June 1999 #L 14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$ #L 14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$14A$ #L 14A$14A$14A$14A$14A$14A golly-2.5-src/Patterns/Generations/Perfect-spiral.mcl0000755000175100001440000000032012156145314017644 00000000000000#MCell 2.0 #GAME Generations #RULE 2/234/5 #BOARD 200x200 #SPEED 50 #WRAP 0 #D "Spirals" rule collection #D #D Perfect spiral construction #D #D Discovered by Mirek Wojtowicz, June 1999 #L .D$.AAD$.3A$DAAD golly-2.5-src/Patterns/Generations/Sawfish.rle0000644000175100001440000000115412156145314016402 00000000000000#C The most spectacular of several naturally occuring puffer engines #C found by Tony Smith during the first day of running Generations #C 3458/37/4, a previously neglected rule with several other #C surprises. While moving laterally at c/2, the sawfish puffer engine #C alternates left-right with period 40*2, forming 5 blocks and a #C period 250 switch engine which moves away diagonally 2 cells per #C half cycle, each switch engine phase being repeated 1016 cells back #C and 16 cells further away from the stable core axis. x = 8, y = 10, rule = 3458/37/4 4.CA$4.B3A$.B3.C2A$C7A$.2ACA$4.A$3.C4A$3.B.C2A$4.B3A$4.CA! golly-2.5-src/Patterns/Generations/SediMental.mcl0000755000175100001440000001572012156145314017023 00000000000000#MCell 2.20 #GAME Generations #RULE 45678/25678/4 #BOARD 220x220 #SPEED 0 #WRAP 1 #CCOLORS 4 #D "SediMental" rule. #D #D From a random seed state of 30% ones, it tends to form stable #D "islands", with active coastlines and fascinating inter-island #D "commerce". But an orbit's fate is quite sensitive to the starting percentage. #D Below 25% or so the world remains sparsely Brain-like, whereas somewhere #D above 30% the islands begin to accrete into larger "landmasses", so that by #D 40% you nearly always end up with a single huge "continent". #D #D As for simple seeds, they often lead to surprising results. And the rule #D clearly has great potential from the "engineering" standpoint. #D #D John Elliott, November 1999 #L .A..A..AA.A11.A4.A3.AA.A10.A3.A.AA5.A..AA4.AA10.A7.A..AA.A.A$A3.AA..A #L 3.A.A3.3A16.A..A6.AA3.A4.AA.A4.3A3.A5.A12.AA5.AA$A.A..3A4.AA..A.A..A7. #L A.AA3.AA.AA8.A..A.5A.A.A3.A7.AA19.A$AA..A..A4.AA.AA.AA..AA5.AA..A4.A.A #L .A..5A4.A..A..A3.A..A.A3.3A3.A3.A..A$..A.A3.A..A8.A9.AA..A.A..AA3.A3. #L AA..A6.A..AA7.A..AA..A4.A.A7.3A$4.A.AA.A4.A.A.A11.A.AA..A3.3A3.A3.5A.. #L A..A.A7.AA4.A3.A.A3.A..A6.AA$..A8.A4.A.A7.A4.3A4.A.A..A16.3A.A.AA4.A.. #L A4.A..A..AA..A..A..A.A$7.A5.A5.A3.A3.A6.AA9.AA8.A6.A.A3.A..A.A.A..A7.A #L ..AA6.AA$.A6.AA3.AA..AA.AA..A..A..A18.A4.A..A6.A..AA.A.AA.A..5A3.AA9.A #L $.A3.AA4.A6.AA.A..3A4.A5.A..A.A.A..A3.A5.A11.A.A3.AA3.A8.A..AA$4.A..AA #L 3.AA4.A5.A.A.4A7.A.A7.A.A10.4A5.5A.AA.A.A3.A.AA6.A$A.4A3.A..A.4A3.A6.A #L 3.A3.A..A4.A.AA..A8.AA9.AA.AA6.A11.A$A5.A3.5A.A5.A6.3A.A5.A5.A.A..A.A #L 3.A.A.A.A.AA.A..A7.A..3A6.AA..A$.3A.A.AA..A3.A..AA.4A4.4A.AA3.A.A.A.A #L 9.A..A5.AA..A3.A4.A.A5.AA6.A..AA$.A..A.AA.5A.A..AA3.5A.A..A.AA3.4A6.A #L 3.A.A.8A5.AA.5A.4A4.A.A.A.4A.A$..A..A..AA.A11.A4.A3.AA.A10.A3.A.AA5.A #L ..AA4.AA10.A7.A..AA.A.A$AA3.AA..A3.A.A3.3A16.A..A6.AA3.A4.AA.A4.3A3.A #L 5.A12.AA5.AA$.A.A..3A4.AA..A4.A9.AA3.AA.AA8.A..A.5A.A.A3.A7.AA19.A$.AA #L ..A..A4.AA.AA..A..AA3.A..A..A4.A.A.A..5A4.A..A..A3.A..A.A3.3A3.A3.A..A #L $A..A.A3.A..A4.A3.A9.AA..A.A..AA3.A3.AA..A6.A..AA7.A..AA..A4.A.A7.3A$ #L 3.A.A.AA.A4.A.3A11.A.AA..A3.3A3.A3.5A..A..A.A7.AA4.A3.A.A3.A..A6.AA$A. #L AA8.A4.3A7.A4.3A4.A.A..A16.3A.A.AA4.A..A4.A..A..AA..A..A..A.A$3.A4.A5. #L A5.A3.A3.A6.AA9.AA8.A6.A.A3.A..A.A.A..A7.A..AA6.AA$.AA6.AA3.AA..AA.AA #L ..A..A..A18.A4.A..A6.A..AA.A.AA.A..5A3.AA9.A$..A3.AA4.A6.A..A..3A4.A5. #L A..A.A.A..A3.A5.A11.A.A3.AA3.A8.A..AA$..A..A..AA3.AA4.A.A3.A.A.4A7.A.A #L 7.A.A6.A3.4A5.5A.AA.A.A3.A.AA6.A$.AA.3A3.A..A.4A3.A6.A3.A3.A..A4.A.AA #L ..A8.AA9.AA.AA6.A11.A$.AA4.A3.5A.A5.A6.3A.A5.A5.A.A..A.A3.A.A.A.A.AA.A #L ..A7.A..3A6.AA..A$4.A.A.A3.A3.A..A..4A4.4A.AA3.A.A.A.A4.A.A..A..A5.AA #L ..A3.A4.A.A5.AA6.A..AA$7.AA.A..A5.A4.AA..A4.A6.A.AA6.AA7.3A.AA7.A4.A.. #L A..A4.A5.3A$..A..A5.AA.A.A7.A.AA..A..A.AA4.A12.A.A.AA..AA.A5.A..3A.A.. #L AA7.A.A..3A.A$..A..A3.A3.A5.A..A3.A..A4.A6.AA3.A6.AA..A.A3.A4.A5.A..A #L ..A8.A$3.A7.A.AA7.A.A.4A..A3.A.A.AA3.A.A4.3A3.A3.A..A3.A.A..A.A3.A5.A. #L 3A.A3.AA.A$.A..A..A..A..A3.A4.3A.AA3.A7.A3.AA.A6.A.A..A5.AA13.A5.A.A.A #L .A..A.A.AA$8.A4.A5.A.A8.A4.A7.A7.A.A3.A3.A..A.A.A.A.A.AA6.AA3.A..A.A4. #L A.A$3.A5.A10.AA..A9.A5.A7.A.A.A3.A.A.A4.A3.8A.A5.A4.A..A.AA..A$.3A6.A. #L A.AA8.A7.A..AA..A3.A4.A.A..A.A.AA.AA17.A3.A..A..3A4.A$4.4A.A.A.4A..A3. #L 3A.AA.A..A5.A..A4.A..A.A..A..3A.A10.AA..AA4.A.A.A.AA.AA.A..A$..3A4.A3. #L A..4A4.A3.A6.A.A11.A..AA6.A9.A3.A.A7.A3.AA.AA$9.AA..A.A6.A4.A.A3.A4.A. #L 4A3.A3.A3.AA7.A.AA4.A.4A..AA.A.A5.A6.A$.A6.AA8.AA7.AA.A.A3.A.AA.A3.A.. #L A..A.AA5.A3.A.AA.3A5.A8.AA..A.A..AA..A$.AA6.A..A3.A4.A..A6.A..A.AA3.A #L 4.A5.A..A3.A..AA.A4.3A..A.A7.AA..AA.4A..A$6.AA6.A..AA4.A6.A6.A..A7.A.A #L .A..3A..A4.A.A4.A8.A4.3A3.A.A4.A$.A..A..A.3A..A..A7.A5.A6.A..A.A8.A..A #L 16.AA5.A..A..A.A3.A.3A..AA$3.A.A6.A..A5.3A4.A4.A..A.A.A3.A.A.A.A6.A.A. #L A6.A.A..AA8.4A.A.A5.AA$8.A9.A8.A.A.A..A7.A..A.A4.A4.A8.A..3A5.AA..A..A #L .AA..A.A.AA3.A$4.A3.A4.AA..A3.4A..5A..A.A4.A3.A8.A.AA4.A3.A..A.AA..AA #L 7.A3.A..AA5.A$..A..AA..AA5.AA5.AA4.A6.A.A4.A.3A5.AA..A.AA9.A4.3A.A.A6. #L A.A.A4.A$3.A11.A.A.A3.A..A..AA5.A10.A.A.AA..A..4A..AA.AA.AA6.AA6.A5.A #L ..A..A$7.A..4A.AA6.A..A.A3.A.A4.A.A.AA.A6.A9.AA.A..A..A.A5.A3.A$..A..A #L 7.A.A.A.A..A..A..A5.A..A9.A6.A10.AA4.A.A.A6.A5.A.A..A..A.A$.A.A4.3A.A #L 5.A4.A9.AA5.A7.6A6.A8.A5.A4.5A..A6.A.A.A$.AA.A.A.A7.AA..A.A5.A.A.AA.. #L AA4.A..AA4.A4.A..AA..A6.A.A7.A.A.A6.A.A5.A$7.AA.AA.AA..A..AA3.A.A..AA #L 9.A3.A4.A..AA..A4.A.A..A..A.A.A6.3A7.3A.A.A$..A..A3.AA.A6.A6.A4.A3.A.. #L A.AA.A.A3.A4.AA5.A..AA3.A5.A.A..A5.A.A3.A4.AA$..A.A3.3A5.A.A7.A3.AA..A #L 3.A5.A.A3.A.AA11.AA..AA..A3.AA..A..AA3.A..A5.A$.A..A.A4.A10.3A.A4.A.A #L 9.A5.A4.A.AA.A.A.A5.AA.A.AA12.A5.AA..AA$.A..A.A.A..AA4.A.AA4.A4.AA.4A #L 6.A..AA.A4.A..A..A3.3A6.A..AA..A.A..A.A10.AA$.A.A.AA..A3.3A4.A12.A..A #L 4.A.A..A..AA6.A..AA.A..AA.A..A3.A7.5A..A.A.A.A.A$9.3A..A7.A3.A3.A.A.A. #L AA.3A..A..A3.A.A.A.A..4A.A.A11.A..A7.A4.A3.A$7.AA.AA9.A.A3.AA..A..3A.A #L .A5.A5.AA.A5.A3.A10.A9.A.AA7.A$5.A.A14.A11.A..AA.A.AA3.A..A4.A..3A3.A #L 3.A9.3A..AA..A..A$7.AA.AA8.A4.A8.A..AA.A3.AA..A5.A3.A3.A.A.A4.A4.A3.AA #L 5.3A.A.A..AA$3.A5.A.AA..A.A12.AA21.A10.AA..A..A6.AA6.AA.AA..A.A.A$3.A #L 9.A4.A.A.A3.A3.A..A4.A4.3A7.A6.AA.AA10.A3.A4.3A..A.AA.A$5.A.A5.A..A.A #L 13.AA..A5.AA3.A8.A..A..A.AA5.A3.A11.A.A7.3A$..AA..5A..A6.A12.A4.A7.A3. #L A.A7.A6.AA6.A8.A..A.AA7.AA$4.AA4.AA9.A..A6.A6.A..AA.AA..A3.AA5.A5.A8.A #L .A.A.A3.A.AA3.AA.A..A$3.A.AA8.A4.A4.5A3.A3.3A6.A..A.A.A.3A.A.A.A..A.. #L 3A3.A5.A.AA5.A3.AA.AA$3.A6.3A..A..A..A..A.A.A..A5.A4.A..AA3.AA..AA..A #L 7.3A.AA4.A.A..AA.A..A.A..A..AA.A$5.A..3A.A.A.3A7.3A.A14.5A6.AA.A..A10. #L A..A.3A..A5.A..AA..A..A$.AA3.A4.AA..A.A.A3.A3.A..AA15.3A5.A..AA.AA3.AA #L .A..AA.A8.A6.A6.AA$3.A3.AA..AA.A4.AA5.A.A.AA.A5.A.4A..A3.3A4.A4.3A6.AA #L .AA..3A.A.A..A4.A$.A4.A11.A.3A..AA4.A..A6.A4.AA7.A.A.4A4.A.AA3.A5.A.. #L 3A7.3A3.A$7.A.AA.A3.A..A..A5.A..3A.A12.AA..AA9.AA8.A4.A..A..A.AA6.3A.A #L $3.A6.A4.A3.A4.A4.AA..A6.A..A..AA3.A.A.A..AA..A3.AA3.A.A4.AA4.A.AA.A.. #L A..A..A$3.A6.A.A..A..AA..AA.AA..A.5A.A.A6.A.A.A..A6.A.3A6.3A.4A.3A.A3. #L A..A3.A3.A$3.A..AA..A12.3A3.A..3A..A..A5.4A7.AA.AA.A..A5.AA.AA3.A11.AA #L ..A..A$3.AA.A.A3.A.A9.A6.A3.A4.AA5.A.A5.A3.A.A8.AA.4A..A4.A3.A.AA3.A$ #L 3.A.AA7.A7.A.AA4.A3.A3.AA8.A.AA7.A.AA5.AA.A..3A.A3.AA.A..A6.AA.AA$.AA #L 7.A.A.A.A5.3A..AA.AA3.A3.3A.A10.AA..A5.A3.5A.A3.AA6.A..5A3.A.A$4.A.A5. #L A..AA..AA3.A6.4A4.A8.A.AA.A.A..A.A..A3.A..AA5.3A6.A..A.A5.A.A$7.A4.A5. #L A4.A.A.A.AA.A.A5.A4.A..A.7A5.A3.AA4.A4.A3.A.3A3.AA.AA..A.AA$.A..AA.AA #L 7.A5.AA..A5.A.A..A.A6.4A.A4.A.AA4.A.A..A.A.A10.A.AA4.A4.A$5.A.AA4.A..A #L .A.AA4.A..AA.A5.A6.3A.7A..3A4.A..A6.A4.3A..A4.A$.AA4.A..A..AA..A.A5.A #L 4.3A3.3A.A..A4.A.A3.A5.A4.A.AA4.A..A5.A.A3.AA..3A.A$.A3.A3.A.A8.3A.A3. #L A.A20.A3.AA17.A..A..A6.4A.A3.AA.A$5.4A3.AA6.A.A..A6.A.AA.4A3.3A.A3.3A #L 13.A5.A5.A6.AA.A.AA3.A$3.AA.A..AA.A4.A8.AA3.A9.A3.A..A..A4.A5.3A5.A4.A #L ..A14.A4.A$.AA.3A.A6.A3.A6.AA4.A..AA.A4.A.A3.3A..4A.A3.AA6.A3.A7.3A.A #L ..AA5.A$.AA.A6.A5.AA5.AA5.5A.A3.AA5.A6.A4.A4.A.3A4.A.AA15.A.A$4.A.AA3. #L A3.A..A5.A5.AA4.A..A..A..A..A12.A.A3.3A7.A3.A.A.AA3.AA.3A..A$.AA.3A8.A #L .A.AA3.A8.A.A3.A..A.A..A..A.A..AA..A.A4.A..A3.A..A.A6.A..A..A3.A3.A$7. #L A8.A..3A..A6.3A4.A3.3A15.AA.4A.A.A.A..AA.A..A..A.AA6.A golly-2.5-src/Patterns/Generations/Steeplechase.mcl0000755000175100001440000000226012156145314017376 00000000000000#MCell 2.0 #GAME Generations #RULE 345/2/4 #BOARD 500x500 #SPEED 50 #WRAP 0 #D Star Wars Fun collection #D #D Steeplechase, p20 #D #D Mirek Wojtowicz, May 1999 #L 135.A$134.3A$4.CB118.A10.A$6.C9.A12.A6.A11.A6.A6.A..A11.A4.A8.A4.A4.A #L 11.A9.3A9.A$3.A.A.B7.3A10.3A4.3A9.3A4.3A4.6A9.3A..3A6.3A..3A..3A9.3A7. #L AA.AA8.AA$A.6A8.A12.A6.A11.A6.A6.A..A11.A.AA.A8.A.AA.A.AA.A9.AA.AA5.AA #L .A.AA7.A$BAA..A.A8.A12.A6.A11.A6.A6.A..A11.A.AA.A8.A.AA.A.AA.A8.AA.A. #L AA5.AA.A.AA6.A$C.BA.CB8.3A10.3A4.3A9.3A4.3A4.6A9.3A..3A6.3A..3A..3A6. #L AA.A.AA7.AA.AA7.AA$16.A12.A6.A11.A6.A6.A..A11.A4.A8.A4.A4.A8.AA.AA9.3A #L 8.A$111.3A11.A9.A$112.A21.3A$135.A16$37.A$36.3A15.A..A$37.A15.6A$37.A #L 16.A..A$36.3A15.A..A$37.A15.6A$37.A16.A..A49.CB$36.3A15.A..A49.A.A25.A #L $37.A15.6A47.3A25.3A$4.CB31.A16.A..A12.A..A..A..A..A24.A27.A$6.C29.3A #L 15.A..A11.15A51.A$3.A.A.B29.A15.6A11.A..A..A..A..A35.A.C14.AA$A.6A29.A #L 16.A..A12.A..A..A..A..A34.3AB14.A$BAA..A.A15.A12.3A15.A..A11.15A34.A.A #L 14.A$C.BA.CB15.3A12.A15.6A11.A..A..A..A..A52.AA$23.A13.A16.A..A77.A$ #L 23.A12.3A96.A$22.3A12.A96.3A$23.A13.A97.A$23.A12.3A$22.3A12.A$23.A13.A #L $23.A12.3A$22.3A12.A$23.A$$105.AB$105.A.C11.C$104.3A11.B.A$105.A12.4A$ #L 120.A golly-2.5-src/Patterns/Generations/Transers.mcl0000755000175100001440000000037412156145314016576 00000000000000#MCell 2.0 #GAME Generations #RULE 345/26/5 #BOARD 200x200 #SPEED 10 #WRAP 1 #CCOLORS 5 #D Transers rule by John Elliott #D #D The original pattern by John Elliott #D #D Slightly enhanced by Mirek Wojtowicz, May 1999 #L 4A$4A$.AA$.AA20$4A$4A$.AA$.AA golly-2.5-src/Patterns/Generations/What-a-mess.mcl0000755000175100001440000000056212156145314017062 00000000000000#MCell 2.0 #GAME Generations #RULE /2/3 #BOARD 800x300 #SPEED 10 #WRAP 0 #CCOLORS 3 #D Interesting puffer causing a lot of mess... #D #D Mirek Wojtowicz, June 1999 #L ..AB7.BA$.B.A4.BA.BA$..AAB..AA.BA$3.B.A.AB$..BB.B..BA$BB6.AA$3A.BB..BA #L $3.BB..AB$4.A5.BA$ABBA7.BA$ABBA7.BA$4.A5.BA$3.BB..AB$3A.BB..BA$BB6.AA$ #L ..BB.B..BA$3.B.A.AB$..AAB..AA.BA$.B.A4.BA.BA$..AB7.BA golly-2.5-src/Patterns/HashLife/0000755000175100001440000000000012156146015013555 500000000000000golly-2.5-src/Patterns/HashLife/broken-lines.mc0000644000175100001440000002067512156145314016421 00000000000000[M2] (golly 2.0) #C Broken lines pattern - does it work forever? #C Dean Hickerson, 7 May 2005 #C See also http://yucs.org/~gnivasch/life/broken_lines/ #C #C A p48 gun sends LWSSs eastward, while an eastward p24 puffer sends LWSSs #C westward, and a northward p24 rake sends gliders southeastward. When LWSSs #C collide, they send gliders northeast and southwest. The southwest ones #C escape, forming the longest broken line. A northeast glider may crash into #C one from the rake, in a kickback reaction that sends a glider southwest. #C The surviving southeast gliders delete westward LWSSs. #C #C Sometimes a kicked-back glider hits another northeast glider, forming a #C block. Sometimes a block will be deleted by yet another northeast glider. #C But some of the blocks survive, and some of the kicked-back gliders don't #C meet other gliders; in that case they either delete one LWSS from the #C eastward stream, or pass through the westward stream and escape. #C #C There's just one problem: It's possible that a block may be formed close #C enough to the LWSS streams so that a LWSS will hit it; in that case it's #C possible (but not certain) that a mess will form that will prevent future #C LWSS collisions, and maybe destroy the gun. It doesn't happen within the #C first 535000 gens, but I'm not willing to guess that it never will. (I #C think that the times when the pattern could fail are exponentially sparse, #C so even if I knew that it worked for billions of generations, I wouldn't #C be confident that it always would.) $$$$$$$.....***$ 4 0 0 0 1 $$$$$$$...***$ 4 0 0 3 0 5 0 0 2 4 6 0 0 5 0 7 0 0 6 0 8 0 0 0 7 $$$$$$...*..*$.******$ 4 0 0 9 0 5 0 0 10 0 $$$$$$.......*$......*$ 4 0 0 0 12 $$.......*$......*$.......*$$......*$......**$ .....**$.**...*$**.*.*$...*$*****.*$*...***$..**...*$***.****$ $$.......*$$.*.**$.**.*$*$..**$ ...*$**....**$..*...*$*....*$.*.*$...**.**$...*****$......*$ 4 14 15 16 17 ......*$.......*$ $$$.......*$......*$......*$.......*$ 4 0 19 0 20 **.*...*$..*...*$.*....**$...**.*$*..*...*$*..***$..**$*..***$ *$*$.......*$$*...*$*..**$*...*$*......*$ *..*...*$...**.*$.*....**$..*...*$**.*...*$..**$*$.**.*$ *.....*$......*$$*$*$ 4 22 23 24 25 5 13 18 21 26 *$*.******$*.*...*$*...**$****.*.*$....*.**$.**..***$.*$ .*$**..*$..***$**$...**$*...*$***$.**$ .*$*....*.*$......*$...**.*$...**.**$..**..**$..**$....*$ $.*$..*....*$......*$**.*...*$..*....*$.....***$.....***$ 4 28 29 30 31 $$*$****$.***..**$.*.*.*.*$.......*$...*.*.*$ $$**$*.*$..*..**$.**.*.*$.*..*$..**.*$ 4 0 0 33 34 $$*$..*$..*..*$.**..*$ ....**$....***$***.**$.....***$.....***$.......*$.......*$......*$ $..*$..*...*$.*.....*$..***$....*$ .......*$*$*$*$$$...****$..*...*$ 4 36 37 38 39 ....*$$....*$...*.*.*$.......*$.*.*.*.*$.***..**$****$ *..*.*$...*.**$*..*.*$..**.*$.*..*$.**.*.*$..*..**$*.*$ *$$$$$$.......*$......*$ **$$$$$$***$..*$ 4 41 42 43 44 5 32 35 40 45 6 0 11 27 46 $$$.....**$...***.*$..*$...****$....*$ 4 0 0 0 48 .......*$.....***$.**.*$*.*.*.**$*...*.*$.*..*$..*.****$..*$ ..*$***$.....*$******$......**$**.***$.....*.*$*.....*$ 4 0 0 50 51 5 0 0 49 52 $$$*$*$$*$*$ 4 0 0 54 0 5 0 0 55 0 $$$$$$.....*.*$.....**$ ..*...*$..****$.......*$....***$...*$....***$*.....**$*$ ...**$..*...**$..*.**.*$...*..*$......**$......**$......*$.....*$ .......*$$...**$..*.*$..*$***.*$..***..*$....***$ 4 57 58 59 60 ...*.**$****.*$*....*$..***$.**$.......*$.**$...*$ .*....**$..**..*$....***$..*$*.**$*.*.***$....***$.**..**$ ......*$*.**...*$$$$*$.*....*$..*....*$ *$$.......*$....*.*$....*$....*.**$$*$ 4 62 63 64 65 .....**$.....*$......*$......**$......**$...*..*$..*.**.*$..*...**$ ...***.*$....**$..***$***.*$..*$..*.*$...**$ ...**$.....**$.....*.*$$$$...****$..*...*$ $*$*$$$$.......*$......*$ 4 67 68 69 70 .*....**$*$$$.....**$.....*$......**$ $$$$....*$.....**$*...**$*$ $$$$$$***$..*$ $$$$$$...****$..*...*$ 4 72 73 74 75 5 61 66 71 76 $$$$...**.*$..*....*$..**$...*.*.*$ $$$$....**$....*.*$..**..*$*..*.**$ .*....*$...*$...*$..*$...*$...*$.*....*$...*.*.*$ ...*.*$*.**.***$*......*$......**$*......*$*.**.***$...*.*$*..*.**$ 4 78 79 80 81 $$$$$$.**$*.*$ *$.*$.*$.**$.*$.*$*$*.*$ 4 83 0 84 0 ..**$..*....*$...**.*$ ..**..*$....*.*$....**$ $$..*$...**$..**$$.......*$......*$ 4 86 87 88 74 .**$ 4 90 0 0 12 5 82 85 89 91 6 53 56 77 92 $$$$$$$...*.**$ ...**.*$.**$*...**$*.**.*$.*..*$...*...*$..**.*$..****$ $$$.**$*.*$$.*$.*$ 4 94 0 95 96 .*.**$ $$......*$....***$...*$...**$.......*$.......*$ .....*$.....**$....*.*$$$$$*$ 4 98 0 99 100 .....*.*$..*.*$.....*.*$..****$..**.*$...*...*$.*..*$*.**.*$ **$**$**$.*$.*$$*.*$.**$ *...**$.**$...**.*$...*.**$ $.....*.*$....*.*$$..**..*$.*$..***$ 4 102 103 104 105 ......*$***$*.*$***$$.......*$ *$$$$**.....*$**.....*$**.....*$.......*$ .....*$**...*.*$*....*$.....**$*$*....*$***...*$...*$ .......*$$*$**.***$*..**$*.*.*$*$....*$ 4 107 108 109 110 5 97 101 106 111 $$...*$...**$..*.*$ ......*$..*..*$$$$$.....*$....**$ $$$$$$$.*$ ....*.*$$$$$$$..**$ 4 113 114 115 116 $......*$ ..*$.*$ $$$$...*$..**$..*.*$ 4 118 119 120 0 *.**.*$*...*.*$$*.*.*..*$*....*$......**$..*$......**$ ..*.*$**..*..*$.*.**.*$.*.*..*$.*..*..*$..**.*.*$...**..*$..**.*.*$ *....*$*.*.*..*$$*...*.*$*.**.*$.*$ .*..*..*$.*.*..*$.*.**.*$**..*..*$..*.*$..**$ 4 122 123 124 125 $*$*$$$$*$ $$.*$**$*.*$ $$*$*$ .......*$......**$......*$$$$.....**$......*$ 4 127 128 129 130 5 117 121 126 131 *****.**$*...**$..*....*$.*****$*....*$.***$...**.*$.......*$ 4 0 133 0 0 **.*$.*.**..*$*.....*$*.****.*$*.*...*$..*.*$*.*.****$*.*$ $*..**$*.**..*$...*.**$..**$*...***$****..*$...*$ ...*****$.....*$ *$*$ 4 135 136 137 138 5 134 139 0 0 $$......**$......*$.......*$$..**$..*..**$ 4 0 19 0 141 ...*.*.*$..**..*$....*.*$....*..*$.....**$ 4 0 143 0 0 5 0 142 0 144 6 112 132 140 145 ......*$..*..*$$$....**$....*..*$.....**$.......*$ $......*$$$.*...**$****..*$....**$****$ ...***.*$..*..***$..**$....****$....*..*$$.....*.*$...*.*$ .*.*.***$...***$.......*$...****$...*..*$$*.**.*$.....*.*$ 4 147 148 149 150 ......*$..*..*$ $*$*$ 4 119 152 153 0 ..*...*$.....*$..*$..*.**.*$...**$......*$$.......*$ ....*$.....*$$*.**.**$.*....**$....*$$..*$ .......*$$*......*$$$$.....*$....**$ .*...***$.....***$**....**$$.....*.*$.....*$....*..*$...*...*$ 4 155 156 157 158 *$$*$*$$$.....**$....*.*$ $$$$$$**$*$ ..****$..*...**$..*....*$*..*...*$**.*$....*..*$*....*.*$......*$ *$.**$.*$.*$.*.**$.*.*$.*.*$.*.**$ 4 160 161 162 163 5 151 154 159 164 4 118 119 0 0 4 0 118 0 0 5 166 167 0 0 *...*.*$*$$$.....*$....*.*$...*...*$....*.*$ ....*$$$...*.*$...*..*$......*$...*$....*.*$ .....*$...***$.*******$..*.*.*$***...**$.*.....*$.*.....*$**.....*$ ......**$.......*$.**....*$..*$**$$.....**$*.**..*$ 4 169 170 171 172 ....*.*$..***.*$.*....**$.*.**$**.*.**$*..*...*$..**$..*$ **.*$...*$***$$.**$..*$**$*$ .*..*.*$.*.*..*$.*.*.**$*..*..*$...**..*$ .*$**$*$*$ 4 174 175 176 177 ***.*.**$...***$ **.*.*$..*..**$..*.*$.*..*$..**$ 4 179 180 0 0 5 173 178 181 0 6 165 168 182 0 7 47 93 146 183 .....*$.....*$.....*$......*$$$$.......*$ $$$***$*..*$*$*...*$*...*$ 4 0 185 0 186 *.*..*$.....*$.....*$*.*.*$$.*$***$*.**$ ***$***$***$*.*$*.*....*$.*.....*$ $$$*$**$.**$***$***$ 4 188 0 189 190 *$.*.*$ 4 0 192 0 0 $$$$$$..*$...**$ ***$**$ ..**$ 4 194 195 196 0 5 187 191 193 197 *$.**$**$ 4 0 0 0 199 4 0 0 74 0 $$$.....*$....*$....*$....****$ $$$*$$*$ 4 0 0 202 203 5 0 200 201 204 $$$$.......*$...****$...*****$....****$ 4 0 0 0 206 $.*$*$***$$$.....**$....**$ 4 0 0 0 208 $$$...*$..*$..***$ $....**$..*....*$$..*$...*****$ 4 0 210 0 211 5 0 207 209 212 6 198 0 205 213 $$$$*$**$*$ 4 0 0 215 0 $$$.....*$......*$....*..*$......*$.....*$ $...**$.**.**$.****$..**$$..**$.****$ $$$*$*$*$ .**.**$...**$ 4 217 218 219 220 5 216 0 221 0 6 0 0 222 0 4 119 0 0 0 5 224 0 0 0 ......*$$...*$...**$..*.*$ 4 0 226 0 0 $$$$.......*$......**$ .*$.**$*.*$$$$.......*$.......*$ $...****$..*...*$......*$..*..*$$**$**$ 4 0 228 229 230 $$$$$.......*$ 4 0 232 0 0 ......*$$.....*$.*...**$*.*$...**..*$.......*$*.....*$ ..*$**$$**.....*$**$..*$..*$..*$ ..******$$$$$....*..*$$....*$ *$$.....***$....*$$....*$*.....**$*$ 4 234 235 236 237 5 227 231 233 238 .....***$ *$ 4 240 241 0 0 5 0 242 0 0 6 225 239 0 243 $$$$*$$*$ $$$$$$$.......*$ $$$$$$**$***$ 4 245 0 246 247 $$....**$****.**$******$.****$ $$$$$......*$$......*$ ......*$......*$.**$**$..*$ ..*....*$...**$..***$...**$..*....*$......*$$......*$ 4 249 250 251 252 .......*$*..*$*...*$....**$*...*$*..*$.......*$.......*$ *.**$.**$$$$.**$*.**$***$ $$***$..*$..*$.*$ **$ 4 254 255 256 257 $.******$*.....*$......*$*....*$..**$ 4 259 0 0 0 5 248 253 258 260 $$$$$.*$..*$..*$ ***$$$$***$..*$..*$.*$ 4 262 0 263 0 5 264 0 0 0 6 261 265 0 0 7 214 223 244 266 8 184 267 0 0 9 0 8 0 268 golly-2.5-src/Patterns/HashLife/catacryst.mc0000644000175100001440000000232212156145314016013 00000000000000[M2] (golly 2.0) #C catacryst -- a 58-cell quadratic growth pattern #C #C This was at one time the smallest pattern known pattern #C with a faster-than-linear growth rate. It has since been #C surpassed by "metacatacryst". #C #C You need to run this at least 41,000 generations to #C see anything interesting happen. #C Nick Gotts, 21 Apr 2000 $$$$$$$......*$ 4 0 0 0 1 5 0 0 2 0 6 0 0 0 3 7 0 0 4 0 8 0 0 5 0 9 0 0 0 6 10 0 0 7 0 11 0 0 8 0 12 0 0 0 9 $$$$...*$..**$*..*$ *.*$.*$ 4 11 0 12 0 5 0 0 13 0 $$$$......*$......*$....**$...*$ ...*$...*$...*$ 4 0 15 0 16 5 0 17 0 0 6 14 0 18 0 7 0 0 19 0 8 0 0 20 0 9 21 0 0 0 10 0 0 22 0 $$$$$$$....**$ 4 0 0 0 24 5 0 0 0 25 .*$.*$..**$....*$....*$....*$....*$ 4 0 0 27 0 5 0 28 0 0 ......*$......*$.......*$ 4 0 30 0 0 5 0 31 0 0 $$***$ 4 33 0 0 0 5 34 0 0 0 6 26 29 32 35 7 36 0 0 0 8 0 0 0 37 9 38 0 0 0 10 0 0 39 0 11 0 0 23 40 ......*$....**$...*$...*$...*$...*$ 4 0 42 0 0 5 43 0 0 0 6 0 44 0 0 $$$$$......*$$......*$ $$$.*$**$.*$$*$ 4 0 0 46 47 .......*$ 4 49 0 0 0 5 48 0 50 0 6 51 0 0 0 7 45 52 0 0 $$$$$**$.**$.*$ 4 0 54 0 0 5 0 0 0 55 $$$$..*$.*.*$...*$....*$ 4 0 57 0 0 5 0 0 58 0 6 0 56 0 59 7 0 60 0 0 8 53 0 0 61 9 0 62 0 0 10 63 0 0 0 11 64 0 0 0 12 41 65 0 0 13 0 10 0 66 golly-2.5-src/Patterns/HashLife/gotts-dots.mc0000644000175100001440000000102712156145314016126 00000000000000[M2] (golly 2.0) #C 'Gotts Dots': sprouts its nth switchengine at t ~ 2^(24n-6) -- #C 41 ON cells, growth rate O(t ln t): Bill Gosper, 11 March 2006 $$$$$$$*$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 *$*$ $$....*$.....*.*$......*$ $$*$$.*$.*$.*$ 4 7 0 8 9 5 10 0 0 0 6 11 0 0 0 7 12 0 0 0 $$$$$$$.*$ $......*$.......*$...*$....**$...*$.......*$......*$ ..*$..*$***$$$$***$..*$ 4 0 14 15 16 5 0 0 0 17 $$.......*$$..*$...*****$ 4 0 19 0 0 $$$*$*$*$ ..*$.*$ 4 21 22 0 0 5 20 23 0 0 6 0 18 0 24 7 25 0 0 0 8 13 26 0 0 9 0 6 0 27 golly-2.5-src/Patterns/HashLife/hashlife-oddity1.mc0000644000175100001440000000077612156145314017167 00000000000000[M2] (golly 2.0) #C Forward-shooting switchengine interacts with a dirty Schickoidal #C backrake to produce complex long-term behavior. #C Bill Gosper, 26 February 2006 $$$$$$$***$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 $$$...*$....*$.....*$....*$...*$ .....***$ 4 0 6 0 7 5 8 0 0 0 6 9 0 0 0 $....*$.....*$*....*$.*****$ $$$$$$$......**$ 4 0 0 11 12 $$$$$$$**$ 4 0 0 14 0 .....*$$.**..*$.***$.**..*$$.....*$......**$ 4 0 16 0 0 .*$.*$*$$*$.*$.*$**$ 4 18 0 0 0 5 13 15 17 19 6 0 20 0 0 7 10 21 0 0 8 0 5 0 22 golly-2.5-src/Patterns/HashLife/hashlife-oddity2.mc0000644000175100001440000000074612156145314017165 00000000000000[M2] (golly 2.0) #C Slight variation on hashlife-oddity1 #C emits an unprecedented glider burst at 5e10. #C Bill Gosper, 26 February 2006 $$$$$$$***$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 $$$...*$....*$.....*$....*$...*$ .....***$ 4 0 6 0 7 5 8 0 0 0 6 9 0 0 0 $......**$.....*$ $***$..*$..*$.*$ 4 0 0 11 12 $$$$$.....*$......*$..*...*$ 4 0 0 14 0 $.......*$$.......*$ 4 0 16 0 0 ...****$$**$$...****$..*...*$......*$.....*$ 4 18 0 0 0 5 13 15 17 19 6 0 20 0 0 7 10 21 0 0 8 0 5 0 22 golly-2.5-src/Patterns/HashLife/hexadecimal.mc.gz0000644000175100001440000007254512156145314016717 00000000000000‹úÁ Fhexadecimal.mc”}[ɑ޻ý‡2<°$bDWfVÞ¼€ygµz°ÃX?6ÐCöpÚK²ÇÝÍ‘fýÆQ‘—S$‡ìˆ¼_#/‘‘Qyþ÷_ýÿÙ~ÿîñýû_6÷Úÿá·¿ùÿ¸ýåþïwßÝ¿yøp÷þõ‡7¯ßýûþËßÿøöáÝÃËö#…¿•ðíÍã§/÷OÛÃÇí?þíî—ß=oÿýá‡û×ÛöÝÃóËÝÇ—íéþýÝËÃÏ÷œËãÛŸÞß}¤2>>ß¿§ÈgA”Z2úýóýýöÏŸ>>ÿg®Õ_ÞüëýÓë§÷÷ø–s¸ûøv»ÛÞ¼|¾×¬‘íË÷ÛïþúOÿò§ßm?ݽPVŸQ«¿Ü=ÿøðñÝÿéïw~zÿü_ G~y çöã%‡óùîÃýöýåúÓýÓÃãÛo·ƒ/*ðü-ûüãÝGF’àýÝÓ»û?>¿¹{Oéþ~ÿ~ûp÷† ¼úåÛío/?RÂíîíÝO/÷oQé7ÿº}¸óãÝLJ篥_©ìžž_ÎôŸ~z{÷BûþþUÿÿ}z~!ëTð»{Ê–ÚûøqKû¾srÉB[ó†J»¿{~ r~Ozz|÷t÷áýò(¤Ú~xzü°í;<þüçíû_¶Ç÷ÏÒ³ßzážøøøóýû—_¶¿Ýß==S×þ°ýÿOÔ ïùõøô@U#šý|ÿôŒÚŸ¨}B`Ê„K¢NoÙÿeûð¬Ñ9øÿé/n§SeÈúÝ.ý ÝòßžÞÜoß}ºÿv«Û_ïžÞü¸ù}Ïÿ°}xüù”ûé´Ë‘¾ ¿5ÿùéžzªë*¼ ¢áã§÷oÑ;OŸ>b€ü(„ò}{ßHF-ºÿi{~ø7´åÿÔn2"ì?“í¥ËôÛíáåwp=Ñ`ùDC‚ºÿáÃOOÿçx»{9GèÝß>|ú@£àÃãÓ/¶ÕàwÛóý wÛïÿLÄÜþëö?žî¸ºÿøæ¤u&2ÁL{yz|¿½Ü}ÿ‡ííãý3‘ìe»ÿû›{ê‘_?=mw?ß=¼¿ûžrùŸú+Õø=S¾œÅÏO/ŸˆvR>†5Õû…r5¨C¨Fx¡oQ ú·ÛÛ'šfÔ;ïßËP¡šß=Ø»x‡AþËöüŠ¿{û35úîUêí§û–Oi)jýÔùFþ½zõÿ^}£>°ÛNÿÝæû›ÈÖ°í¿ýMbëkfkÜâoSÈ‚ÿ©Y¬•­y+ÍZ`uµnnWìrì"Ãyryqú#W×Aä:ké\Q\‰þ¬ h5êõ+BÔºÖ&W€*Ç{ ‚Þb}Á¦¸`ÂÂÙ^¯`p¶šjÉ¡Q“Š\Õ-µóÔÝ~óaóåŠpþCàèxݲ0 XÄ‹"-ôóyóE¨êé/n½aPsqÚ0éóïÇKp[ðJéu°ÃP:DãèW”KùX©œÍ™ >›òÊ*²ïK–µ:N†-º"„-¤í ¡MµïûT’™‡$^¼Ä­9£uG<‹×ò_‰‰ˆl±¡2æ>µ[QGJ±hbÍn.!V­¼e;ªôºµåª½Z'Ž'³ª•¥ 4÷ˆîŒ~‹âꈷ)Ä¨Õ uÛÊcDnC*Æ-¦-fé ùPQņ˜¯õ…aíF‰$n4pîV² Jû–Ü–ü––¾Ròµ­§Öù©Da:šEJÂ\LiKY§¸e-ëF¸5æuÖ¢á'~Õ ¨[æÅØÉÐé*<µ¥å>ÕÓp=;á:³S+ª?Œ’¶L8Ê´KTµ²e¿å„½%Ь [¤ÊæF¹ˆ­ÑdSSס\·²+EQ{ -^§€¶z¶tƒG-KÐ+.’MX Tb/ ³ ëÜѱoå®çù7]“á¯.ô·’¶"Cˆ[!ÎF‰Å [ñ… ÊÞ#Ñ-Ì鮄<3óC R=ù!RèwÎi¢¬K·q ¥™êÃÂ~®LÃÎ`5Œ‰ oio¾=:‚cÜL®üÀEd]7çwŒ7‰´°ÒSëÄY—÷¡&g6ô0‚Y µö‘ d‚ÂÄq…¬žÁ¡Ôžï71ácÝ<Ó5ó$ò8ëeì 1›M‰aý"ãÔÒ7êM± ãÊ•žES{.xݵú®èÕ,ÖÍ:Æ0¨†Þ>:g´É‡gn>È*¡]³06®tlêòCVÉžÆjC´øqŶè–œš»ö#d‚BPÑý0¬y.ºFD«÷ÚŽ®$®ìŒqòélb-kô%ÔR·f$HLäVTÌdÍ­a…k,,òºÕö5!Û¥´I2)WOKÍ•” `mõLŽÀ¡=r² Ô×FЇCM ³#…ÈÚ¨º8OЗšÿÊËHЏ!Mâ­6’í`7÷óÕÆî Å@£y]¦ŸÇEwW'‡ìì®ì0#£²ž´ée’¡.BÊÐéñî¹£+ò«!ù¿p}F¨Ž ä’¿–•ß7‹ªG›¼uÉ1üÛ¢ÒŸ5áö6¡ØÊòNxÙ$-GË_âhaÓˆ°Ò™ Aݼۛô!1m¼s ß²ú6U\Íä âÏÍÝjf’+¤DêÏD†pÄR3:.ûJ÷µûû!>Z8µÑ3 ½;[ê ;ýšŸíaèKfÍPž€‘Y{@$H2ÒÉ_ƒŠq}KVs³´!-ž}‰ã&Õf³ìkèh;#ð[tí ¥H\ %‚Y[ÌR‘y²øLPÉRw¬[,¶æK¯v>ÆXC.¤0Æz§›Énëõ2Ð¥Õþpg›½ã&æé+Xkq·Ysæ=úUw$c–XÊΜ¾Œk;R,ܺõ¹É<†UÜÈ}-èÙ/³ªÄÀx‚€ÝOFÉÒ;ÚmåhåˆúuÎMÒM1òå>f‚Âé¨dEa‰ òŠä1¦2‘=¡ô›#ÔrKz¢'5l=ðX¯ß:_iÚ8§‚Z‹ÄµækÕné*­uXù¤¦þÈ», ÆÚ÷Gc¼a±]ÏÖ 9¨tœœV>IÚ ¼’«fËWövYR"(ät‰)—¸ 9ë¡Êx8 ›œ`€=¦™—+°Ê’IðÊÙ¾:wºD±&wë‹çbÁq‹mZ÷ž©L#º²°;‚HGAø"ï·Œ¬i—cÃî” p‰&‹mö›Ä¾–¿±¶v§ bëî&+ûjÒ“PA&(¨**÷9¡ÊšTYM8‹bt_Vz)»:vJEzjæ‹Õ ÕDû®«\§ªÇ®Ïvرs¬ùêÙ^•ïü-ºMü‹Ý–aÐua–•xj‡»'°ËAG SˆZÉšuXV$)âÄ-ä¬â4!ïº-¶>9œ#ÐQ· ¤‹•Ø¢ZF‚#šz­Ù"d\yãŹ¦m-aÔË<— uGK¦f¸U ¿œ€W‡Ã‚DNG¦3ÜØÝUÆÜ>;¡ “ ÊÄJª93œv£1±«pßbHí8kâ\A–[‹kýÞÖ%a'pž€Žš€aþ\/]Öëz¾6VD-Zt$H™BýÖ³ja$ùXΜñ(Ýoå:M“CõŒö­V2çqàÉP'xiª¥nÉ&qÊ—ÏšÌchùc’«é°Îœ¯?:÷Šêf‚B@mŠ"_!GâWfgÞ±˜ðÈG„é‹@T»¢Üãk?ê0鄤Zº_ €õs7æVf!¨(³ÝµËl¶9ÚdNGL™<‘žœžà@.ž¼Ž–¤fI!ÉzKíªm¾³ÙZ7¨Æ&´Xó˜›e§¶LØêœ''}S!nIÊð”+¶EŸÞœí´üÙÓï6ÒPªÎ8îCS‚⤈âÏúåBx„¡y£ü^­¶l˜ÊƒÎû¾Jd¬z¬zz9“u‹e7¡KáT¢Ùw­ ±š…&‰æQc¯0@Vºa$¼+™Ç *¶–wT@$Hçˆ.™¨@ Ú®Z)×ÍÑI‚ôu‹ûNà´{®$ŸWc>î±r³¿š=°=Ÿ‘±™qO,šÇÎ}SÕ%6ž)’ÕÀ,[t¼(L›½ÌÝbMÞhû–¬fqº•'¬–ÄTëU9­.‰fɵ2D¥§èJѲÙæ[+ Tòt¼Œ4Ú‘—Ô /ؘ#]ŒW5Iæ¡ã±h€ZWy@$À,§rdräKÖuZ×yòÊúnI{3;`ãâMÈ9J?Æ\ÊM60zêÿ°8ߟúו®ô)èT>`ݬ' $‚Ì^ªwûº£*MC (ðåqãIÞ(±AÆíÈðätOÛwa/V®æW²2¦8{ÏØ¬S;‰ ”¶)ÇCpµ´gô‹.‹§M¤‰žgió?´ã¥;ËÊfçääd9:'c 03AAE¦Ž¹äbÒ[ èÛ²còaàHBgúõòmíH‰+žÁA{¶ ù+˜A«Ó¹ôŽBà˜1Ѻ[»sРe ó¾;ÿL9DiF†Ó ÜÌc:‚X•jWÈ«èr:/}0,jgàE“ÔÎuœ´÷ÀÄŲ8O€£ÇÔÞ[K§Æ°\"A²ëîXÆÙÎM&¥k÷ˆ0f ‚ud¡nªÊñF05Ü…¥°Ó ¡¾’­øòæhãf/-«ÇV3‘ Y‰ËÍ ¢fZ¦î u”ÈOç´–´{åP'uAuþ>³Ó¯wP”2r¶Ìˆé2ã·Ô$9_qÞºžžÉÀP(ÔiIÚ3A%O0¨’¯dù•k¶4ÒñÒK&ïÑ_8‘ŽËvruC/ûS[0rÍ °wÒ_N¢Ü¤³­?¿fI2Bx¦;øE=Î×TÉgŽSÎþô‰€µÒŽv €ò mD©ÒWSŽecm+Ñü}¿ä×T³›Ÿ•#9à¡ ’)t ’1c²òt2Ãxp[…½ÄE$iäqH'3ÉtÕÃÔ÷Ök£tx‚ r1M¯tÕ»\Nkò1/Ì„m—)µ>òz4ËÍ$b®ã£7xSy•z-º­2¼ªÐk¹TÔ»T£¦k«C;# $‚|Žû…Éy Vu¹!²K¢Ëû &’n9Zhrž `Bà|‘7-!)ŠèlÜ·"ã˜gÜÈL¬d]i” ãAùUU#íò Ý šMƒ¦d°Q³U%œ #é d/œv8ƒW/n°ŽÌ€H€’õ2 õR&ëI½LN -mÇét\Û}=pi€hZ¼i)dçÖ0«›T}¾ð뚊'°Cæ´ˆ!Û`*¹Ñ½$v—ÆIVûR¤ÿBUμ^‡¼ÛV~‚°ª~%V9†¸GK%ëq–¯­ÍëÛºiµâ/£¸‰5rÚ/7¯•R]Ùh[·Í}%)¤€ ¯õ/çßnò Fõ®¼;Oäæ“,èQ˜‘{´²&£5’3·+¦TCS—}«vgÚ®ñn¨dGå‚YYu}¨ÞÜ"»$—ßiœ$ðj®äË.‹ ¾v]t¶¦MºÛ$þ”~`ß,Á*Ï5SšW·ìwGàO‚¹"ó˜ä$ðm ÌÛ´vlë@Ób×Jì²PMc)Rµ¡e›Î¾¢rao„ð…Ýîsº·O·Wj9ÆÇ5eÑTµXjµjàXÄÊä¶ZÈÈM×lÖ%RÖµAÜæ*s :ûiº“Ž!òðLÇàÉôcÉy¬;ý•V,ü˾o¬Ù¤ó¥yÂÏ–ˆ#d‚B „Œ»é|˜îÁ‘Ç¡*)vÇhŠ·:8îàxtŸŸéˆ³Ù. MÅÕböšŒýX°®(* ¬zv}ôÔ4îÈênqU¶òt!Ú‡Ö™“Ñ[¿ëZ•‚̰{ä®MÉöÛN\w‚½}i<Þ´J‡sâÙ™õèŸÓ¹ŠdÇ]2Y½Ž¾äÉĉ‘ÉyˆŸ»䨻ÀW ¬rÎ[ã}ôV¥šX[â^-Ô¸•Ïeß…3øÝº¢8G€‚h¬°-ÏC…R¥hYº<¸QÖyñÍAË+uònÙ/a®…rd•›ZÝ,™ÅƒlúbTêµTáˆù¬?Ø™ˆ š§'иÅe1;Y™1C3³=Š¿Ø²ÐX-²Cަukpž ¢`= ƒü#AB³Ä™e‘,»g' H©ë°+AŒ"娻 ­¿•2žbcÅâd^ÿqØå ÿ_.Û—w´½|¼û˜©üN™™ È]&âÍçäµ¹ëF`âÕwGàuÐ^¿ÔÈxDiGe@.Ÿi¸L"m9¥AHÕsS¯®>¬E¼åœfŒ¦E˜Ž¬´8Æ/÷”ëÊ—n`¬d ìyÏÌq¯›ÇH‡éº£Õ$–d{¨qö³–u˙ţãx²6æýTÔ)`#.¾X×ãÔtLÔÉÊ.¸Õ¼©Ç§‰íë„¥Rf$Hý'Jœ¨Ï·aNj™ZV… n®ÉyKªäá ¨K yaþfèa²7}ÃnŸ¾Ø¬Çý²ä ËI~]]J„ãz9Xe® q¤î%”-VdZmœ%ØJ ä™-ÝG0¦á`F›¶ ›É÷ÍkY½9å’«öQ©ž À.Ó¾îŽ ­Ÿ,‹îÎü-ùÍûáÛ·Ü¥‚ºÕÝôÀ:™g•Çl†=`ýÊÜ*µwnS·Eë7¹U³Ã¡fP¬rdFá«tížÖe8µ<îñ‡¹IF÷LP¨‡QNVyé¾ú¬½_ƪÜ0M±W¬cÒÜy hÞÕeÛ^‰ ‹ÚZ4®/ý=kÏ”O/ÒhT›š©õØ«Yys%Tõ;#ð`sǬ®”b¯×ÞW¶OKj-)bá%3‰bÓ–ö·I3<»äÑЩ÷ìËvœ «^`«j!¨›##ì&Lé$ð¼Ð E‘H8ó ž 2$ªG!™<Aä5¹’Óy‚J^‰™µâ 9³œiK¨|4(pÞÚ—WrÛX=vÆn~µ)G6sêëëz4휭4Œ­ž ÚQeyN*0‘QÂm0›ÊJ=2g[à!ιâ0®Úšpí+}o¬Çpí§è€Áî<ÆjŽÏ* ]3*3Œ\†i3m 9Âñ ˆ‰ÇÉQÉŠê‚äÐV8AÔÆO+Qš[íùŸvËÊî î>Ó¯µ²Îáø™–]djkFöÁ¢6ÿ6c‰œ=P8Û»“Ö¾"î(güš ü|Ó ²h#•>’Ci=®ÚweÅ‚‹ „:7O¯vPµú:.pI Fÿ!óÌrp†ÛqH €³TàÔÿ¨Aà9+‚¸-ç/g"ªWódÖ€ùû>$ @41/n_wáaì^Qª‘¥Ìõ ¥UÙÏ–£ñ½¦U±Är²íÑØŠl•¬„Âä€üp Ÿ ½î Çô –j¼Ø’jSªžº/$ ÕÐûÒõèØü-ÏСA†õ!µÞÏiÚ~ÝZ¸~û'†bTÔXM§™èVa\ör¾²š6M€ØçÞ> Žƒé€ò¦ƒi½$ÕοÔöCBݤ$ '‘íSƒ¶»Za™?›ôpŠ“<Æ·÷§Îåæ©ŸRf4 ³¼Òž §: 3y¢§Z®nCñV„,e+'ÍËYëŠ*åÈÉWЯn’Ão'(móésL/Í]~ ,ÑÓ¬h`ËÇúýÅ™R‰—‹/Wƒ­ÚÁ6/ÁÑÀhú8È:Ã}Ï0G8›“©À#ŠìG…G™˜Æ~Yä ]ÍR€NBÔýæ×õ¯¦ž¯þòM ”øUwûÆ} ¿LÏ·ÅÚÕ•QJ@¹ux „ØrîóÕ<Âô¾m24u–ÛQëí q­-…¨8:Û‹Gƒ¹¦¯}¿ ²mïã[7—?0¿d2½5f¢¡cæ]þÚ¨º9Â@ÈŸÝ-ïI³?†7<€œ ï34ŠGw¨¹õêÊü“ ì™éâ2PA4;v ùš:‹[NÎï@¤‚Å ±ÀìÁbMš3ª ;GXWçq”™¤YhÏrm >lA4#ÏųmÚ”"…È©~,ü3¼¼ÐÇp„™¸|GeåôUMÐj"PÊx‰â–ƤnˆUuŠ„Â>‡É8Ý!1ÕvS%ëé³|ña<Ì1=L%ÚAfõ}Èk½Xã¦Ù°£^ÙŒrG*@ _”Δàç„t‡ƒÃÛÔ <‚îÎqôCÏÇ÷çÓ“¥V™³ÔñsS‹Y&ĘH±¾$‹ (u$*Œ"PÊmeÈýx»FÉKñ Ð}œ÷œKªué»Mdö×ài<­#gp­/ICj†¢ô ¯¥É†µ4î’Cª ;= ¿Ë7¨;78ˆ—ëW0#‚ú¯yÙÛvèó{b[¢Ìfî{UÛhª<—ÏF£Uº¸z ÚÊwLú ›:Áïì‰mOœ… ·<Œzõ † $|½D3/Ý àh¡âa5@ (4-Øë^¬_â‘M+ä<ÜÁªùz qÐ{Wá逎nÐϥݓÒßøxZÍ‹eJ÷\[6f-Ä/?½®:Œú3sŸ»6¹¡‰ar6(|†‡ Ù€t*³Íâqœȵ{ñ‹Ã,ÿÒc.½¢C3ú þc·n~° FõœvÓs·—¸Ö @§‡òã88vž¦°…E±ÂHhK TŠÖ‘rD ÛË„zËØ2™5SöëCDz{ÁVÇI€¾\ˆ8…œÑ™*ºÃî—ùåYéîñÉg£„Åhr£åºå ¶E s‘ŒyÝzV¶Ö81£,ÉlsåkD(¸r·$+錖m×¾`e¤õ)Œ$Hèh$ˆE|c›bѳÖõèË;>ëÃâbåÀ[¯—O^Zï„zçÈ )²7R\/ˆëÂu}ô³Þ†Œ Fl3TØê®éZoæ<öfN@¥õfbÔùÎ÷J˜bÁÓüB³Ì‼ôL ;y9²öÔ"£¸±‡]÷§Iu/%W,˜ È’€2PªÖ‡í¨º(¡GumD‰×9X³x>E¹„ô!‰ßa»Àµ1«JŒ®™]ã5¦QHÈdc·&è‡Ã’hP\¨ÎºÐªPE„;óÖ.¢ÕW¬?Ka Šð@cQ+<ÐÈX¨~áÊY„=]œ·¦nœÃPæÕ,¿ö*ËpT©ymy¶R´á u;±aÏ„˜çgdÃ…îø?5ÎH¿ð¤Òe£IÂ&¥Ip–“€Ú[#W! êhéп´ ®Œ‚ÝnŽ}:š´îkž¯X¥Å¶çèÂ5[Zu}b[2Vc5'òþ² ?xa-`ëY ¸AÛ°7ÚzÏFh«Hp‡xxiÌ(‹œúê•òQ“vˆ?le¯Mµ Œ"PÊB¹°ži¯îÀL<|ñ´Âõ%˜mqr;nöÝõ ÏñCëìã;ûð@±uv¨â«„¾ú唋_ ±Ý .uh= êw j††Å`ç²·:ú¾½¼1Öò¿ëË`+1µ^‰y=Ò†XZ¯Ä(FmCð|]‘~ ⺬šPƒÙóùý‹Š9}¯Ë!Y lŠÖ€”®Ž²6|¾|”U¤Ù :.R‰Q&”÷=©in\KÓLABcÂrù–ÐçÕ%àä¸ëYà 1ý‰Û"P²™=Pn4ÏNŒb«üº‰I›MóÏärkU¢àÝ‚‹òãç“óÁçêúzþáºq§)ŒâHDå1CIzí¢¥Œ“—õ]çMhå)Jª“õŒAyȨOBL{‡b°ÓùÅ3‰†¡ýˆm•gõüüà!xú•¿á±€õ×JQd*@ cÙ›,»—‰Œªÿ³Þeÿ’åô’žÆ×,O-DJ\U˜â;c#^Np: Ô&LfÄñr§iÀÅ4¤…é<—íL ”u²”• ÈXÖW-Ý8­ì /ÂuØzœœƒpJœÚ ýIÖ$èëïvY—h€Æ´´–›‘¶f©Z“€Îu¸zñã_¤–‰kT_çï™wÇ“ÆÍaa¶–·f‡C»V;î(ÁiÏ:¨^‰]h•«žÁ3ÃR:á6§Y4’/ÞpÑ1rV…* BúÎcT~´A$.+%È?±Møû¸'  ”úùd4X 3ëná}¦ÉÁ¢ÌeÝàí£+@¨¬ßÎÞB€¥Ó^œï4¯Ÿ Uþþ¶Ì[»×Ö‡èÛ"õ›(ëôÛu§:i¨bá@3ª´iÓ¯¤ê1ì@ncÃëC Lvˆ³º³RÑ'Žª·—/$æWu´«=$ °¥{­ÆÛû° Ú*åòÂÄÑ×;­-Ýp™eý.reÌ× (±“ÛÖo‚çÄ›•<<_G²÷ BkÍÓ.|†=Ãê” È:hpì@(Á›ˆ Ó!¶çîdoo«‰MÝ=§ë]ó‚Ñsð‚0bÐÆ¬Gø' ^ǧ{™Â®&͉ÐåÑs)¢²‘v>še=°¡ƒJÒ¤ xæ7Nrkaò@ˆqmh<,Ø)·H(•~ò%çtÃ8®Qe_ùÏé¹ø¶Ã)}Ôa¿ƒåbfäÅ+ó'@k=Z¿é`Ë(Iz¶ï@ˆÃóµ¬K·feë[T[Z¦]·Ø'}pí@^ˆóÅwG¹î¢†[Yo^R¨­¿ƒÇ>©±®2c³\é‰}åyä›ë ªÎßFXˆVgÎêúÂEØ…FÍ4åNX·¶2«Ê\]ñ§¨+ÆõCÀŸU#’)¡Íeÿu9d´Ûþ5ûn9Š(±3Ú4‹(µqTñÅ´'ããá_©?h,ƒ/jgÔOR™ä€<üj±;¸žï¾P è•û"PG@ @œ'²^ý‚½°`·më(I•P–¯ßË–÷Ù³­²o“;÷kp; £Ñ0ñ‘UŽužB÷­ÀÛ[£jÚ`žï÷¹ÃŒ´ê¨¡þEw"»™†·òk£Ý2µj ª¶jÑ1Ýr矠FCµÕÇ *éœõ}øit-e$EI@ºÎ–ÀFÝÛtÊâ§P)VñðR‹Ï?„"qn?TÐõ¡”TE ÄHúºÞÖo/ûÉ"QuúŸD8 ñ²…¥4ý‡¼ïc?Töt­„=ÈÈvÖBƒM»têÑ»€EÕ/ïæ5Ìt©i«Ô4gó^Ʊ,èâ²}èûyˆ‘y­’òõ¿$lËÂ*ôQI­Q9»Èy ãýò^áÅAœ™ °wY<‚x¤E*>n9뮯§™UUóF$!µ`­vtTÒ®_KßÃÏ÷-6àWIæºK¨~ó¬in;FöŒú ~¸PêuýVU”yty]s‹.2¯-øó?ã-kÓ”‡½M‰&„Èy ¾Â#´Ñà3átœ&ÍlΛ‚éÀèß"?Î!IÁ¨H'‡ÚO_­³}Î%iŽ] ×FpˆâÑÔ_³ËâAÍîô9ËJKsýȼvæ¨nÏF8 €ìsõ—ͰÀQ fÙ& ¼í0Îõ¾f8Ø'ÕEš£å`©O7o‚nBC'Á4} ÐzT.ÕËT‡GãàògÖö$¦ ËÈ«êÝ2o%J9²ä•ZQ>¶ì³uS@2ã—K‡b•ÞGaiÖí¹Y–ˆ€ýu«ZÁu œ›bgjZo~KU_pŸ¸.~Ψխ*+=ʵ†N«PàÜ·Ã iOó;OËÅÞåî)Ò¯aJÃù‘e5ëPŸ“ÃLÂQ}A9 êÉû¡æ.‰^\%;ÆU…LŸéÇ6ccç”ô}ÁIyMe`½<­åT¨#Å™L@‚*!^¬J§¶ª)b¢ãÞ¡Ç_k’s¯îÜ´,F(QEÛ:‘Â`äö4¼ê\ün~W1tBfäDcBwrJº~ ø$„8<ДdHÄŒ0Tà-jÕŸdsð+zBª.ãê}~ñh]i×,~wl¸£y„ƒØd„µx1‚ÎÛÆ!T¢ñ®Æ¨¬¯Zšl5m«¯%‹QiJC4pÕ]W3Wú±Vý´hr£ž5áÆ Lg[½êiÄáp‰¸‹eââç£÷El5o)Â,²6²=µ5¢µ5l~ß§oTód¹É _ÇRVÈÅØú‘Z£ âv„óK7QÎÒïÜóˆpH. (_Jï åR“®~Ô°ó±ŽuÞ4/¿;'†²5«ŠÞá¼Ä¡ýö!½e¥­‹Õ¸Td¤ÙŽs @ì<[~£ê‹_ßžU¨³ ŠP?Êö;ëJZ>ø–5`$ô:±°hÞÅ-´Cï—ÍÁ×χoÎXå°N-ÇO¬,… ø¨Xhyg TáMõå±ÁÍ`o8ƒ·§¿uÅ„?“ÔÇaý]UgOŸâ mTí§ñx±°´š™ ¤c·qe Š ×r’˾~Cp®•þLEXH\±HlŒ/˜(nÿNص%Ê®ªÚ®¬&DyýïØ=#”à#óî"ŠÆ$€ˆˆ–ÄÓêñHGßܺ,½}±çpYuj{^Ѐè¿gùÖgî柃­MÇ3lì©.ò½Á§>bŽ'Y» =/?š;2€ éÊ¢Ž²õã ½o¯Ô1KäB¶Öˆ®5ö^nÈ€÷¦àE¾ÔhM¹‘n –kdõ5ý£9¦¸}E}õSgœ@ÞËæ?ÿ–r¾^'þ×p‘Í}~ÿ=FÞ4` aó«zxq àë<|Üwe" •®?ÊSæ¨Ð?·Xƒ×Ô €—ôv©'Å=†ëA¾o ðüS$ö®…GXÌÃꆮÃ9ŸðíÈ6ë)ç+D¾ÆÚ 9Œ|u?R  æL´ºý?]HƲ?dßîŒ|©–¼ËRd‰`©V—5¯~p ÿ—Ë»Õ&õBh¯¦+_„’ tŠá=£!7&®Ÿâìü…õ%Pù  TÖf=íëTiŠ-Ÿ¡!ÏïÂN0›1RÚw£ìŠa^·4Ö¤©,ÂÚ¾¿<õqd÷Zýß1õ!°©^Ô¼´Ÿ‚#‚À“9ÿ눛FÑ$4ç9¥ø2XkN*µ¹AJj¿ÿ]¬¤_C`@À/µlO}È pµÐRŒ2}ËаwaeÀ~?P–M—Hwê{±'V3ÊÌÌ•îû¯ß€ýs‡¹ü^Ý_ñ‹@Šâ8üÂì o â@áúä7…ëœ\*Û|ëXóü›² ·øØ¸o9' +ÀŒt¿ÿ!*—_µÃqˆ”ÀSó̉skølØCáùÕ'¿ÿ³|ý·Øm÷DicÏâx$H|~Ùà¸ä'”¾\Ks˜A#.èý¸vPÿÏèB~ZF[p„fÿ†W•%n »©7ÓhôuXýÄšâØ[ðèaþ~·÷x™U–¦„~û׉q'äû>Èr‹C½pËÌÌu‘ÛŽ®çÌ–ˆÇãÔ×?ü'·O4ª&ù9–  <ؽCéhÿ¿ù Î]=o ë‰8ÜLf@u)×Ó} ð9§DzçY©äNÀþuÿóXÐY3üBQ­:ß•®îŒwt¶ØßOdàÅq%ŠD«ì’Ñ`ì«…GÐy3;PÙ£#^2I™`e£¶íV/“ŠEîè œ‚À†‚ˆ¯7 à¶»¶J#}:«¹£eØ:ÿ¹w˜ð(oŸàïE[®& ×׉rå.ÉDE”î”´G“=*qÑ`øº;?[‹–jVQ"¦wû¤¤r À±qM7î£0Š€)vñô”ŠÉ¸ŒÖB*ûxÛG u6½Ï¿iýŠñ/ôöZ‘ÞГ×Û5 êµê=ëí«Ï¡ êT¯À^S)Ͼ§ÿ&Ñ­­²;@z*‚ܤÉåß+ê˜ü“Ç·zK}¤òZᶉªwðÚ#‘»p¾»ë&¨õ°³â»Lã½Øô ·yÔ®p² êíðiŸß‰’B\÷ Úú•>.n¹@Üq߉ÝÞp“ƒNHÁ,£X»¢Õöi#è¾ù3jæ¶ø€ÐZ ˜uHY¢F4ò|(‰ŸT í9e{FÕ áîJÉÎãçùR 0 Ò^ôJ¡Ê)©ŸÕæëU›­ý£÷Úa¾¿”¥ =ÿ:XUÿwöf(5PØhH¬#Ú=³/EŠoÜÛ 5Öú“'¨ óÿ#d‡tm¡ú9,®3v³n<ºc!€´åš×:€Ä èÈ<@7Z§B-]™œ;CV+_—ZKÿsCjUÔ Àÿ°j7›þ–š}o]½’Ôß |„ì/žh4 "—)v…°äSjC½Žz‰6}t_“×z?$â ý‚¥ÔÀP£á¢/“åÁݹi¿väݳÔÓu*ŠË×&ºlU¶Ø¿#˜¸Î€¯‘'_e2ðfC¥àâ3Œ‰_0PÔh[rúØŸ_ÃÛ¹s7–¬¾# óø¦ë?ÔÏPêÕ(†ÓÕ• àÓ(PV…õé‹7]4 óõº§¡Ž«ÑOˆsÆ…Õ÷ õUÕj ¿ d:€X{^šþ8ãè 0Ù×3ˆFßh)Ì—*º4öÈHÅ{yùø¬è¸ÃÑ·FÖ»)Àˆemó Ç ˜î{bàä%­£À_ÇXW‚ét áö²ðµA Ë‹k¿ÍnŒ´ ã¯ý¶4 J@Xðð |¢1)”^<‡¥è¯ŸÂùÿùµÍÏãaÚÅeY’v³\Ê#öPɱҬÀ5à ¸•zþ‰}äiÿ{ xû¯üI4ÿ=EçS›í»Eî<‡Wò Ýõ ]ŠgµÎïw\ŸÈ‚hŒç C÷¡¬@§D9ÿkG€ØO¯Iÿ¦¢ÂXO¯ÂðùH(⌴×ÎC¡äÑv×6Óέ!%HõýF=O6³Ç-&¥¹1€(À¨­«È€m»ñœ<˧s¦ @ß¶I¡¬­Û¤Ð”ÛA–@d` 5\BÝÉ%„ºs{ïí(e\R†£É|ÈC}g·(ô’·)4)ÕáÅ)´Ü©¾K5mRÍħT3Iµ³Èm¬•Èù§üq6ã¨ß­Nx ¾(ÛÙN¨¶É$óY¹ä•µÃ0~òʽä•m•«U’ +«¸QV’·uŒã› I ´U¦÷€ íR&zH™0À¨û2ñEʘtJƒhº)>O‰j‹šdíP­HС]Y9´kŠ–â‹K.£ÕheD…1eFuÊžÚ”•¨ä»ìç’½ÑRä£N·Ùð 8ö<[|6H¼ÅˆÇè"¢c|Šè°UD‡ÄÄyæÄ^ÀΛ߃­ïçI‡­ç`ø8,¯$¡Î°›ýgç!k}S·ûQj‡ˆ74aøHÿèmÞÖå}yX€ R€ ±êhgP€‘]9Ûèõ­My ÈY mÙê1Õ7N‰B:N–+%ƒ:¨!H-#p  ËyÆ1PýU[û+ Þ\Ús÷Wimí¯#LÜØQ»¨£‚@äßÎÓ€§8â?Œ ô‰£§J“ì©è¥Õ«ËÇå­ñîå­Äx{+Rœ!¥¨$ýÉÞùvöVé=GÝ{«tÞ{«tɆœfÛel•TI÷d°t{50RŽÔ*GBOÊrí#ê!GÒGÉQ¤`HCJwÝþÞ/Åozv/~Óøà7ÙÂoé4ùM àeû­*™Z0Z¸Œæ^Œ&?ÌXaN¥«“àL¨$,;Y/6r Œ;ŸCFZ%oÍhCòÁÒ6K6§-ë6¾”´—ä +¥¤EôVÒ@U„„âÆ4óý—9Ì<Ñ©~)<ÑRxÈõ5Ü”#¥«¨)o·H ‚€þDM¼DMÇ¢‘Kg™ý€èÔÈiAQíf†Œ´E¡õ¨÷e¾Ê CQÀõ¾C>wè*¸lSpÕP8rN†ZvJé𜖅ؤtC>ã©V[÷€LQ²>U‘Ñ”&ûÝ» ›\2lºË0ºV½Æ&ÄfшÏ'ûs±·Cˆõ9¦cþkÄ©L dy‘b—O)v]¥Ø{Ü8¶ÃGKˆ!¿¨ãßB¬O)?äZ@–Hkè¢÷J‘FŽ·J¤õéS¤ÝR¤õ)‡!‡Ñp‰,ÞOy•€/CXÛ1ÝÒö‚^/Ó®é¼Ê«Ÿ¼êc(”kÝDVÛHÅzwQ¿s¥98jŒ z ŽzŽšƒ£pŠÓžgΓ}RuY¬Ú?-Víe±"§ñ^Æ^ j0öÒ[l¨­\§uZÜ©äS ñvË"(D?AQzrÆ¥”ºï°Èè7ž+ù=w´ÇëICað¡Ù\ºR—*÷Ÿ.U¦S¾˜ùâ°|ë‡|ñXäKs W2Zn¯>ª)ðžüür_©´ºœ­ƒ·bÅ…v1¾ÄLdŠ™µÝS»^S±sƺ’i¬~Õg‘?mŸò§}•?ñ¸‘€ØÝ:9“ÞÏzVTÔb¤©!Õ±JœÚœSLév½Ïaî:68ZñXˆþ“SåRhƒV¹ä)—²Á:8*)‡9¨ã2´UŠD§ ˆéá_¶ŸZ»GÕÆ$ë \®¸OÎ[J²Ë“é%O6Ï$¸j'ÍSÏS½Ý¶Œ“þkÁi‘/çOùrYåË{ܨ۱à éÃâ6·T÷u $¤©u1žR‰ÈM®"ýúÉÏi¼ˆÄ *æÒ5…튢GÈëÉ$¢c  ,×óH>˜D«á=Z2‰ÀØœ‡–¶wP—Ÿ»¿Ý.fr~ÒÖ·øÁrÿ·_Ë©\vîÁca>Û'óÙ“ùÈAå)'ÿn§EÒP­÷÷!´òWz‹¤‹\+þЦõŸOXÏÉQ±¯n'^OÐ烣ÚVŽ2MŽ €þ|>õÉ€Ÿ3Š9X;9­áôÙ§MÏä“5uì¬W»XŸš‹IÏd}mˆ5ä:ÒYó¶PÇàO&Y™ ÷-.ºY¨á“ŒÉÍÑa+GÃdXŒË8z¸mêÛõm/ ŸŒ‘æé0žz#½„zÍcpú¤¤Ž†¤ õ!)vJŠ €ERüKR|“”ñLI±·°ÏÿÇœ}ÿ’çk£æû$f¸N–ºÄ«"â·ˆ8)×û\²§„¹EHn ±çCB€^%ÄàºÅe•'ÄãvUÛS²œo^Ãz øk-zäúzw£äµpHŠ=%)Öd蕟š2Ç’¯aÛÚ!Ö€×Sû%@®RaÏ” kŠÂ¾üœS ëS$ ¹uÐרn}Ô¬õrÌY÷O>ÒsÏEZ­üN“K¤ÆÍM¢•Ä[Ç–­L‹j$ãÇ+êÅ+²}Ü~jÖù¿R~¦uﯸ]=Ø^OeúàóÊ«n“Wä(”Òéß=Øx,ìb»û'Ð~±KÖù)S;Ò&}ažÐ'ó„Ï¿lRÖ÷}$–¨1¾z¥l½RBc‡ÖäiÆe'Ô¶VÖ…Äúú1V´«\ŒýkŠYßTñ\Ó‹ÍúÙ%ué’ã«KŽ­KJ›lÖ·ð7¤'È+ð¨ño €ÊÀóäTô¶r%–‡j/V‘û Û%dÜbé\2Ûýf}7ñÌè0ñžô”“ÓlÕ¦ŸBecÕìÆqcEä”D…ŠÇ=Ž”•orâ}õ´ôôU´œ·[¤Øê ?ѲrÒ›)àH?SѶ§ÔøóÔì?í” û*5–Rã†BZWï„c´Cß“C9IóG“ï‘;ß²}mN-nÇ´Ý[Û—/ÛÛ§îðVº¹÷  bóïIœ·š”!gË$½3R¾ùw@ÍþT¯%¢ý›ŽøæJsx§s¥¼ÌŒÃwOCïÁÅ÷Uï 0JºUXP üCèYdÀÿÉ€wFaKØ|9Nt/ìY<…x—’K÷¬aݳaKó 9_ùÈO-Î¥OM‚ª“Ò\“*gšLì/:²äÀŽœîÎ~çñAD¶•ˆ4&™8æºrÌžÉ1ïc ŸÕZVrº“èyžuÀ¢%“"ßw&Ee¨d«ÀK2 9Ý'šeŽDe»9té7äâÚÖŒ?·=KÏ2ODŽÒŽn«c(–­òìiH3@ô4‚/‘¶r@ň§~¡ÐëüÓ¦¢Gqù},¿/>›ƒ£ô4G!§£ïÓÌ@ݹÖÇŵԇÃw}HÏ2+D®Õ eÅóxÆóøXII´ö xã5©5I3,€<”m'5ÉräAÎ3Þ2ü|’ÛJÊî“”À}p°uäA9„eÙ Ëz–s"n¶x^Pâk‡ÊÒR´WéËÙª,ôJ^<¸ø¥IPi!–è!w2>ˆ%¶‹mKÀºß ”ÔÀc´LžÛ¡‰ò¾ÓL颙æhÝš©®4Ó±ÒL-%s ¹¨ÈðU2—¥EäÚºDÿ‘Y½È<’ÌÓî§A„Z²ŠåÐrâ‹Òc£´Ê¤ô`ßíÝVé±C)Û­”’¢¾nj@Ѧ—- œ¾£2~¢þ·j¶M5ÿú‡?‹ñnYUýò£ò¦£–8¤äR/.‡zñEY;LeíÓ°EÚV+h[y£ö\jÈMmXj`wödÇ%à(æ@Iš£eÈ?’ÈÙ2FžNð5ÑÒÉXIÇ)N"Vq:%º‰†n¢¡=Gó58+•ZÛDyýD•Ýül:?Q—þ¥ã¤›Z ÒÅšGÛØÞvlo;zúýÏ}=uȶ®‹›™†”|ë÷6tý®_jÜÅ{(#Šýè%öφ ~sK/±¾²z]®G!°ÚäÓ lF½¤ÉËFo*<Á> ÿ’·¾åÌç#^Œš?¹âûœQ²Ô0DárŒNWŸóÅq ®Ÿƒ3RH«Î7½<Ò?|Ô—Uäæ ‰tÏÈ 4êÉ‘þPi~n<5¿Ì§fXÓk¾Ô˜rƒô¨î;y ¤¯Ý×ÚžÿڳŒºËÁ¥Þ®},\)9ÔŽyRòãdÇЇKiÏÈ# P?ú{¬åjµÛ7ï.ÕK‘ëK°ECëk¼‹\›dqåRGJ’ûØ~î0Šäý‹ä}%yo>IÞArJ뽄~ŸIuê;©ˆ.RÁQZ±s¯„"]÷31âÑ2mÔÔŃ9cžùˆ™º¯œ iuôIŸŽ>kíîI,kOb-êòÈž„WObËuà#gÍÙed wŠ¢ðx ¨‡ëb¼ÐÁxi\¯&òÁxÑ•ñ”}…#ý€ô5ñ%‚VõîJÏֶˇöK>”–]ܹuà-‘›µªŸ¬Õqv2 móá6F*´ØÍÚ±)ÉÑÖ°BJ÷pET¢í–…ä£ÈOtÑ«C·±x1-æhÜߦíPÀÕr®eÎ. Öaì¢x>„Áxå) À$Ó’ ¼[R-;¤;¡‚Rc%5p,žk+Ô=^Ò©ñ[j<»­ù÷†Rù”×Û¼ë>2ô‘Ö šÆNm£+åèŠtÏmûhÀÒÖMùŒ”\ÁÎÃÞå0Þž²Ü†½3Šhß& „x½Ü½Mȶ ‚OA ‡Q8Ýlã{ªT ´ÇºÛ¥zÄB'ñ6µŠy;9NÍË»tqœú§Ê§Þï¹uÚØ9Øõfo—•½]Óü%(d݃àPc[Tb!úKL—½¹%(†Ä'^‡O“JPƒr½4æâžž•÷$^ƒÆïiõeQ&ï©øf}Õ˜]¼çV¼³uÁ¥tõvâ`óÎ{–‹÷¬ÙÛi÷ƒQÌM³ÉÕEòTÐcôðˉ2žLCíþ="¡U„‹"ÙÑkÕÃE÷¨Íói{±`hœ¿ƒ ˆô©kûà ö•ƒ<&@)gß!ÌDØjÈèô¸˜£Vž„»cŽç³cŽ+þÈDêÝΡw¿;æà•+#Õä½óÃ8Rï]g¶5³tÖDÐ9ªÎjë&Ð&ÁÈ3Tõè _È5"«5’K…›ÝØ`Ô š}ù*êS ÝØQ‰F—¡ |Ëů 09ÕÀÝÆsweÌlq‘]Z\/iñQ]y]ÒG‘ïÖÆE§Úß—„Q£ßÒ4-j€±ú‰ ¯sféá°ú¶ôùY½å-EÚÒÒGNR,øñÕ}zs¸½|ÛUf;‘¸]Ö 7Úý%C Ë.æ& !š~¢3ÒH[ŒP)ù¶‹¹—yƒ\…ñž}‡;‘zà‘š‘ºì¤]!…뼇ûÏÔíG÷àî{÷zSéH¦KG¹êHn<Õ…´ê1ÖuI¼ÎaAu ã)ݧÄLcg/ÙÅ^ZL™›•ß³Wæþ!ÓLÅÊé`å§L³¬ìb-Rm³Wf.v±Uà®êÜ.j:Öq?b ˆ´éQïOØ4….Jàzµ{ö ¤®\ägr‘…/ù©Ì8ç®ÉÙ°UWŸ„MVk›¬öRñnJ;«•/V«ÔÙ©yôÚØHD„Ê£¡¶»AYýƒãY ¡º‰óh¡íù-$Æ·ð=gNÌÔx܆|s:á飣1N^²¼dÐzÇ;¬H[yI}ò’€oÛϺ\ÊZ$ºm…X‚ÓÇ–ÁZ¡¡ÉváÙ±lÙÙ.z±]Æ¿óHò²ÆMGÈö0|‡æ!~áÍ7øíÐíµPQùƒˆ*+Ŷ¡#¡<¯p+j ¥–w|çoåÛL—ôêÜ”q)ÏQʳ»µ}„”‡æ·æKÉa)ã[s;7{YšS~Òo2¾§Ób›þ´¾M“ï…]1.†ȯçÙ¢.MÏ«.éiG¹ínI1ÿà­?+oG*;ð Þÿ³ƒ8¤Ü(•3D‹ðò.º³ËÇÅ.·ŒººÙ¥Ï‡÷è+ÎÈ%ØçØôå/¶¡;©ô)ã¹#Þ§öX¢p>‰rlèãGàyIikûŠ¢Þ‡I+¯<üÀ?\Sí­FAY”µGøÝ¢ÔÛ/¬m±(÷åDíÛñh@ôMôû¡•ñi&vùdb×d"r7Ž-t®3Rø–µûÊ3:¶{ÔIP(lýdz^k J´F]í~B%ù`­³'MO¯ŒÃüsÑ}QOÉw¦ðe ‘GÓ¬c|úâ ©Zf-M£|Z)ËB¢¬?2ð"º'g‡œ°h¶aœ¾rV“³RkϦٚmáã¸LžÎ#HÏh 5ÞÙjr±Õö•'[]—At‹êU2Žm Õ=vH¨Oõâ­Ô‹Ó>$¸SÎeëQ×ÂùX gc.Úσák=çIÁ_)4Ž,ãÜÈíë„bž­Ê:Q*¹‘ªê8Ùâi»äŽÇw4Úû(±”ÜÑڲÖ¯ÇCïEÏѸLÝ@\úÈUÜW2ZXψdí‡-4šofê¹G‚F'÷ƒÒý¦t§ÍЗ}³ÂèÙ«&â K8ãd-ô¥ZÊñþ¼o¬Î:Îï¤sRTg{¡”vÅ:0‡Å…÷¯&¹¾št?JÝ Dëyö9*×@=ÈO[ÌO/F#yèk4|ÌŠ7€ET˜oê,Ô¥1E…=O5zN*²mÒr™ƒƒNòìt“vÑMz­öýÑÏØíèg"G?ýQV¸ú™Œ¹–›»¬Ç ñ¢Ÿ>ûrÁ¸—Tì+ý„&ýÄPH‹3ô)]:m'{ÚîXª;¡t\„R«µË¦Ò²C>F·Ë“<Æ fU(f¤ôvY "r5:]Æ— › Rßäj¤þÛÓˆ*僃=.ÇÖ{ôC*ÞÆúN?£‹~1Ц<˜!å·ö¡j{.Òcw¹{H_?Ýd‰¹À:(e|ê‹oç‘à›‹n8MÙqÞ59G Ù?Üõúpå‘»â‡û—ÉgÏsÆöÙ®Óåq‘í¬&Ô£ïÙ¨-GÚ"'{?×ç°ñ-X‘"¦§HÌ}ÑHû1|î3TkǶL»g¨@ÒÊÀ\«µöpYÞß»í¶;<ØÖÖ¿çPi¹°ŠôùâýëÅ·ý¤Ö¼¶  ×¡Žé0ÿ+bÆz̵‘û oÝöOë~}-²R¡Ì%=ä©~ËÑ*TbÀ|Š €þÄ€1 ‘´òî1“¨åa¬–ÊìOßzð8wˆ,,aú` óÊjS–ÈP(ëz½Œ{§¶ñ8„‹ðÍ…à’ñ'tŒw•{}’Ð!eŸ$²~’´MÊDC¿YCÕÀ üÏ‘ªxè WAuàÑ1a„µÓÌaÞ:ðþ;>/}Ñ.%´í”Ð~QBiFáïûdLks$reå#WÛÏ×Éé.™êûÜÈF<›LË¢³ÑfgP]޳JÌP‰Šƒ| ®¶ ®–á¸6:Àbßû5°Z ¬A%L“¬ÌýG&q,^äWíWÍj÷ÊaNK·¸IóIZˆxÌ„M6˜*˜Ê,ÿ"$¹Cæ ]Èÿ¤ô¬·ÐÛ;¼tùñÒŸâ¥ëêeàð2œÆ•¹·>ÁwŽú½ȶr4móÂ]‚¡€ûS“`ʈüa 5j'éç–ô<.•=Éàm“`nµW…ýøØûHx WèOŒ¯À7ÙvQµq|ÛáðõÛáëm?E§ÛÐ@ Uˆc‹KH7Rtõþ.`EÔŽÏh@‡‰÷ñ£`ç¢`߆¡6͵mjX˜ã—_Ê郜^°Ð›¾èM½ÓëÝQ(?…= Ì ÐO×m_T³ãøjT±ƒ7ä;on¿¯sËeÿ#P×™v•àÌ»Jp–U%d8#å5ÀÇ³Ç VÄn :€,“çÇ2Öb™LÕ©_Rý Ñq¡E Yh¡›“"'…´8)ビb+'ÓwìÒ|? à™„ÕVËø»Vwí;Ç”.Ž)W FNÃVSr4Ï'i´21„!e¨7¿œÏ>>Ü|T€rñƒ¢¥'hÞÍŸoÓÒG-€!· Ò_°Ä›!UsªçËkè3/“|" $D®\n}&j嵟c‹Z¼ªS“Cš~…U(T¦PXôå¿!÷gŽúì6¾{ÛeÂû%NÇÞp©†åà¸ëÂqb$ã6ÒöazÖ}#-?ÏìùW'@¶ýoxÚzv%ÊÓ¬ˆË¬RV2zUÀw€mo¯-¦åe•Gþ´Ê9h¿X]®ëÉ<¨Ðóÿ‰ ž‚"Š „#%¹ò’4ÔÁ/X÷å RŠÔXë¡+µpÒºã Þb-Z÷¶ 4šó¥}­…º¡*Õ:×@ù`A/»m“½Œ¨\ßžà ò[h©Ö D^Î72äjE¹þµâ¡c3P4 ¹)iÙM 4L(¢oŸ*M_©!ãæ ?ü\‚³™»‘üw"R‰0¤82¿œõî}}ø VD* À)"2E„G‰ˆlÊÑõ„>ø.¼òû¤ªt€˜$ÿããe"R‰0¤,>?^k̘£tžíµÍ)P·¿`E4Qàƒ&*?šh+š¨–1 @Úa –]ö°^份²}Øw¸ ½…À!':SƒÒ»Œ (-7tÖ1.aµï}›öñ“DËi›é D?—“qK˜ÂÅ㬈ÚiЃ/6~|1*¾˜mÃD-Gá_Äö¶ÊêðIlsÆLí{µå¼l“¡s8A‰'„ö›Ðn[\4±îj¢Ì2nðÖÆAê DOfF·¯3á®ðiä(Òò8M‹ü¡²È£’lˆ4vC{mSÀ@´àZË“Þìå´ {-·éƒPk\OhiNMÄeN9V{0x°ô™n½¦õÍž*¢¶1³ ¥@ÑÊ÷gï4­K>G„!¥“%ÝRÇ¥Åù„¹ùí)ÀЍ^ˆÐ÷^Ôˆ~üèž½¨ŸÜøKSzžÆáÉ·Γð$þ‹:úÓk|Йo:3í*²­¡FRšeARˆ¤4Ûå* áþ‚±J¹¼ R.ýGUö’r¡Ší]ê3ZÎ$ËÔV‹ØòElÙˆÍIlaÿþʼ£ZÒ'œ¸Nr(@¾•Úiµ×”ο¿ˆqgc)ê%­5ä^ug©Ž‹¥ËæÒ±yȸŠÑò-7Žsœ‡„Ë|èh ÉàÁ—•݆ô,ˆÃ.hCÆÑs†ýx<¤zÎð#z·››µr ¢0Óhe¦¦Ê²€k¢](ÐsšÌ~O;ÝÍ.ºÿDÔÝvg/.“°„õ> ët6>`™…çÿarëk=´ E$€“Þ>éí\ôvO'n¬þz—ó¤GîOË.‹\:5'â²aä•FðÀo¡gß&ˆ‚‘±^¶MùSÊ~O){;΄m›ü F7R´NÃàº÷i¸i[§á¨ª»¾êqT.’úª7ÛÏaû(ÐûS'f¢}б÷…Ž=瀽9 )%,D—©ï£@ﲓ­ëE¶+sNQ:¡»hÜä“lôìJ¿S;ŒT‡é\c3mÔ¥¬ˆR`ÙE·“þÈ›‹šH+jg¬F -ù ªmNçðD|Ñ›7zw›ô&C!ð½ýqE žs]Ån*òÎzp…Çζ‹+œ'·:¶žRîwé‰è ¢@ðd›”ë¸4€j‹l“°!V} àG—ÐçÇ3ÑêÚŽ€’£K(•z°Hee‘¤jÑ€Ù0v-Ú›ý=4‰Þšd” S¦ð}£ñ±<¢¿`C`¾\:àT#cª‘ÁE³aË^,—Ü‹µK»=+K¬*ú&¤•Ž#UËprþoVБ­Ùt§£‹ŽfåOwÅjÊwÊEª†T DÛéòÕtsÁЍ¹£ÐC©ø$vއHo:[Þþ{‹©þ?e".ä¦CÌ'aÝQH0sî:›ÎõJ Ò\dßû:=¾÷ujμ©^Ùõ.µ¾Ë#5 Qž4¯}X¯!Î(×R³$j«½Mé8¤&?{»+¨f‚xtÒ®.Q*»šz_íj_ÿŸ¥|ÚL˜hâr¼ßŸƒä³kø¨î9]ÝJ™„Ãe>ž@ôÉ¢Óì¹Ø uQ™@†ÅfN$¸F¶Ú»O‡øù`·•9=™CŽÂ~¸k˜úî®!æœ,9yzûù´Ìˆm·ÌˆýÛ2“Ý,£sIsIò9jArfôeò’£ªÁEž/_b-›Xó˜”ðT…›ÕKÚJ2RjßI©t‘RyVMY<Ÿ‚*¸LB«Â&¡ÕoYd¡¬ˆCG8•ǘÊc,Ä|ÚÄë_k¤\üšÔÓû¤ž†Xqcø7ìY¹¡2¹1Þ¶L“ŸI$£¿,i²Cªí–jÛ¥šüáÝòA¿F|rÃìEø3¹á­¸Q«í-VÛk©4î"€±¯3€rýqÈ{qÈÇj1ï®ò*ó³QÙRæÝPØB•X€F¬ZÄú(ób§7?EïÈôJ+úg_èáÇÖ… ü2à[xA!ލzæÖ·ÇȈÄ<i¾mKSº+_þyù r/~LøÄhw¯òá^åÛ½ÊÊ*Ûü«‚*H "•CJ1&]»}/_Ó#‡‚fz2Rû‘±{‘‘úa`¬1(ç]3ÉIW2¦÷”‰F†=¦ôd$ßÉx/D2ãžãõ¯:q¯Êüñª,ë«rß8κ,bPW9XňH%Š7—g²JZ²jÕ(%W­ã.zÁŠ(–‚ä`©è¥Ò‹¥2Vûp_ÃcùR*ú|Ú‡,†ÂŸRáþr (Àc¼‡MPûO{ñsh•ת¯uT„Ǿ®Îê˺:¤“â£Ý±³›[BQ‰vÅ̃4¥˜yÈ~Âm‹‹dLJ¬Ý{2ôUÖ4éú~¤¥…Ãb… ׆1æß~L¤hý? •m·ÊÎý˜R»ÏËûTÊU-ñDx"‚ب‹K›ôö~Iø<úUÚ¾þÆÎ/Ø„è!ásâÈN%áÛÄQv%ç¬Q¾f²ÍÙRñ»£rœûþ÷+–cÖ(÷¬QŽ]Û¶#5üxÕûØ[ × ‚<›Iëç·ãU[ÉIäåzÕ–r"‚AºËE†`F*†T4Û£"uj¾F!]Éw¹N/Ø%@0À¡ù¤¿š‰Ò|ÒÇõWwòðÒ”áEoú¢7mônS4¤ ûOÚË F žö ö-® 凼Ð-/4ŽXÇì‹B¾/¼ ?û«ðNóÎÎ jo]-¿ Ó¾Ú*̉Y~$æ…Ä1BNË8N˜BªâÓc²ç]ŽÕÿ«ëJ²-9qèVjà‘> ^ûßXå ‚ÁKç±>OÝ•@¸8@r DÕ_uUiLj€(ïËTOWA¾~ÓLõ<= ÍÅQDTG©OÁÕÆ»e¡µK„ÖëiBy„mm>ÉxÜE>†lŒ@JæÍyäø\í¨X`€F™;RÈ1ŒW§WêßV0¹ÜÔý>zX1·Btß…h4…èKˆÏ)ÄhCˆ‡÷(· ÕX@× *¢àKD!ÓÔIVS§ó¢¶1)Œ˜‰{œC&ƒF©pš„Ž —üBŸmU¸¼Üªóçhúô3vôC'ú© kª¤,uXëËß¡Ú3kikÒÖä8 ”{Õ}këI¶1)Œ‰´•"ˉ§¢ÑŠö¢Ó`¼:mßYyHó¹Bñ 1í!HÝ$ÖË `(È’õ¸e`}ï Z›2°ç … V橉 üáݰGÀå¿uLŒ¤ †ô ÙÕ1©0E­ÒFùヸíD¾üQ‘Ù‹?ªUÚ˜·½û™GïäyòÑpÚÝp{齘W7MãœÈñÎÀcd| ô©hBgï¥^eZ¬‰<¤0Ê«‰‚½Z“·W»ÎB:®ð𢛖i;„ò«±´ÒXÚ×Xš$2¹v0bµƒÕ?Åt Ö‘²CÃÔ«D4.‰h–Ø&@P5‘*³^;ïft|£ño4Ù¿ÑZQ<Óy.l5ïÝi~’ùñIõ“,¯OòV»ÈêíP2§Á@jcR<2•̵(pJœ%sHaT%óÉCÉjȱ¥dQ…Uèña]·ŠcQØB~ t€÷©dA 6L™1ˆ ð4ðý]Ê«ýn/î‘UÙ.9d¯í·úá¯hÉƒÔÆ¤Þ:åvˤ맯ì)Œâµhïá´ÛC¶X`‚”ÝFÃø0F ²„aúCf»0ô3šÈôaçýù*~äãàǘV†éÇö)¬´Š[VYµC÷¼WA9]‚r.¶žy9!Ö‘<.À]–Ir Ÿ¢ôóÁøN4²,‡?ŠÇ …± F¡Ãø¿R÷\Æ?dΗα†ök ‡¡¨mOðºBè?d¹ËÌeÊ,™{ÀIŒøÿeþàKš5*¹N„xF=o£žVå"FÕÁ3¶ùöü™‚Ê#FíN¤ú¹T¾\ cUÂh "µFS¼(ËzG;ŽG'mÛ}ÊPŒ¼AÞvÐsšîh ½/ŒÈàµo£:ŸÇÑpÆÝpF·ºZÚÑŠÕpÂ*îÆ1ú¸-}S¿7uŠùC £h}ƒHÕú  ó6;d{X9Eê:)“’ž¢±=!K\j‰_mg”¶3ú'€‡0•¸_ÆS,Ë¡NpkÛ%ö¢ä]øPòàœxK«îu!K§WˆÀÏܼú„†ðC cSu=T]ì•lª.÷VYâÜn•u&#ôØZÀæ˜`K “Þf!‘‰T0ƒÏÅÿ×Ĺ˜ë¹zÝÚz«^ ¡9Hm ¼šÇXŸB0º—Ó Ha7…0ÑCémn¼”Þ|? ©‡!Ñ©¸#eW†wôÍy¯]¨pú!ç]<ú‰Ç™²ù9£J\½Âp«+á^åâqÉųÎÁ¨d];èƒÔƤh0xÊ%ä–K÷|Ha”EòñC.¯\B—\"É–º4Ù³Ÿ¿Î‚t´‰t6™>£3T‰÷:_iØô ØŒ¥ßÕå [«.Ù.—ƒþuÓµºdã‡FÑòlrhyŽ`øH,ÓžÍ÷(B::P§i×qÃ\OèÅAŒ~ƒœv¿=‘Ù™\£…ܾ٫UÉ~Y•DË\€^Hô< v;_$•ã ¢Ó{ù\— “äÇ'Ó>Êó“‰@Þù•pD¾×þ5I­ÈIY¡àvAÁ}ƒÂÙ¦²1×Çd¹;e-Šë,x½Óu6§ëlò %Ÿ[xê:Sʱ…'å—¶íÐ1Mè8‘ÉõP¦:c‘rh‹ÜÚ"^›y¦œ(IVãÔöÛãX«wq*)¿i_©í24;DjG…Rÿ‘Æ‘|Ú¥ ²"ºL3^W¶%­Wî4ª˜_˜ÍeN´ú‡f™še¾0XüMM”Û·£†ù/5ñ¢&¦Kdr=mŠTµôCMüV_ˇSzzíЛè¿õMÕ¡:Á‡ê„¼°-ØB7Ø„UÚ^'ò\‚™;lþ©Nàƒó]ÃJ ùÀ‚ÎÆ›.GøWÀE>à¦TpS/pÓnwÀªuZ4øÓj+þ´™¾döóÔ±leyJ[ 6¦í 6–ÖU‹Ò5B  ¤6F ƒñnm½];ìgT*˽GYzHal- R†o`Œá›Îe<Ìwn‘;„zœhŠüøß~ãêÚ¤Úô©/ôµ½qÂp5QiÏÊ´븩TôI/ôÉ&ØTúOÈŠ½ÿFÞN4ø\¤¬®ÊdrÜ÷Nt@ÉüBÉmAɲ¢¤õ1䫽”²Pö½ëFü”s”|ÊÈ”ýÌ]&Ó}ã$ò‹>‡rË­Üò*7«åpµ¥í(ûÞ5>FlŒ@jµ6åV~Haš, U@ô‘Ú+"¥%"õm²"¿ÉŠô""Íbt´YÛ—ÏÀè?¤d´KI>µ×@&ø„êBŒ|Óª¡°©0W>*«`ænišº7ð¯€È|Ê×¢Ê×ò’¯·O€¼‰šŠ”!uÆ[ÁÕ4†_²pq]´}®·HÛ¶p“ëpøŠ¼ÇaÉü48ñËàD18Þ'ò4}e‹EЬ"1Qôìã)Z! » Øë¨å¾ ¹¿>×–íŒ@fߎI%'4{í…07åM¾šFcyÍ7£K~ÇôÆeů ñ…iþ²9YlNÄÄÒìm·9™­šœÞ•ìG{ÚÏö,ݨաðéX0”Ö½ýĺ÷…5 Åóàoj\—( Þñfówx˜ ÖTo¤uÖ’ÖAPpÆx×XײÑÅq^=x’óQ`ÑvääøCÛhŸ„æzܼ†@¸Üf{]ê o«ß;G˜ûÙa*HRvµÆW ÑN’( ^È@Að+:¿˜Œ_xA&¤Æ­=Ÿ l†^Vu»ƒ,óÞù!#Ô~˜ƒäss²%ð¥óé¹Bò÷xüçZ¢ÐôýŠç ¤ƒ‡O’çžO,8S†’ÀcG)Ìé÷ ãñÇG9uüÀ-ŸeP˜7p0¢At}›t["cÃqwjD úi?ºÔz HþI1uÕ-Àµ'Gq_íHɸT$ÀFÊh¼X¢LCéG´hôþû÷¿ÿäÏÿxuby^Q! üì Ž!•σP©÷Ûÿ¤XFiÃ_5¹ËÃe”Ã1º…-ð‰`ƒX[`©€ÑñFx6½¼{ßøy5a”b¤Þ7ÊçG[þ¤ rø+€Í¶ Å¸'øOIC BÅ Ìó¤ºj )ȸœÌþð¸6 ¸¥ƒªôï\ÿýgPüþÙ ³ ¥qáñud<A*†Fž€Rž˜ôÀ»ƒØ“z<“à½í@ϧܸu”¦ K€™£)è_¾?$Þ¦àòGp›ÍAPm^{ÍAÜÍÁl‰s…©1`—¹%3æ6þfn£˜ÛlkÜ3ÚÝ8ìjR)Ï«’f‘×®†/»š:û—1j@óÛϤ4øvÚÁÌâRÐrCÒ¡ÒâEVÔh—U|²JCæì„CO‰¾”ÐV™ZüPP–«¶¸³²(àãjßó>aHiZÛŽÎȤ»-›·~“¢Sæ«5H~kÜUöŽìtðd_K63ˆöݶQwøP§ž%>Ò¯/•ïOhuÌ÷ƒ¤‘%{,>0P¢Uo UÝRü§BJlK/“«÷HröIû×1RÊi¾Öx4…xvâ«ù"•Í‘ê~¦pï_TÿUÈË%±½Šä+c}™ô‡XÞŒ”#eG´3¾¢‘¿¶M÷ E´Ú62±õ‚æ?l›íí Oͱ’5–•xÎ…h±qSïUyœ.åqžFFRŒˆWh¥ߦ¸Üþ"./Ø{ì'h÷¤hW´ý’è O0è—ëWðìÈÄn«†Æt¾6ï :…~% dÓšÈBɶ Åe %™}48DŒÊ(ÑÀÇ·€Õp‹1à«ÑUò4’©ÅHîŽaÈõ9!b6«wŽz™‡MÌË&r›FÀUæÙkùÛ=ÿÁ&HÏ¥«gÀ“§<‚BbͳrÓé]ùªqn­RW°A”® )n«¨3}a¥Îž÷VüÜÜ¥O|‡(“7»ÌmÚen†L™½¼¿µaÜG¡D •¬m˜ƒá(¼f)^ª‘gê—¼hvLçÆiWÕ°éKyyý’«‚a¸-²$E+°#w¤òšG¹\s«S*ÌýÂL;ÂÄa dr R#Ç”³VPØ.P>Ï%ï¹o5EVÖ–eØ™ÒR–®ËÏ®ËêŠá×x9‘i%­ñ²“ë4t”ù‹©dÙM%ËÀùë‰aÞØ)ªuÖMÝõ!´„! ¿²–e>YešÅ®ã„¿ j=VñíaQ[.ÖF’m7’Ì1%¯Of¯Û¿(Z?„o\…or ßô‹µçSB¾—.N»mùSÐÞvAcRÌmVe ð¤£#E·¬]vY»1‚áóÂÙ$În ù Õ×äÇêÂLâW_…1(]·®ƒ+ù!ÆÐ]ŒfSŒÑAl´uÜQ”%|_&qEÝDFy×MåÊy˜¿¼Í_ÒŒ—Îý×ü}ïHRt·_©{û•¶ÛÍrîIs”Ø`O™°§|£i­î çÝGùT¼Tî3oÁ”ÝFæ´‘Ò:ˆîÛ°5ö£i%Šxz–cD*÷ˆTzÛ½5¡2ÌíV”¤õ=½L†üøž®Û÷ÈrSÁÏ&›ïÞwï÷»Ó9©.Ì QµùB¨®õ|ß:ÚÒÛ€m›)4–øã+^kÑ̽¶F‚r‰”]¶@xïï ÷u¡«<#¤ŽénáÃ(ˈízf`Úl>B +Îêö^8@rI]æltNÆ5 æ> #Ô§3ˆð±c®Å)xÑ*x±Kð²Sãv#,¹#¬£ü ‚†¯l*…y}¢v1ßÅ­÷…ªBÚÛ’Å ŸúfdEãÀNóv¥­‰‰2ß…4ü)à¿ ŽÀ¯w@ÑŸ1È“/k ÉhßaˆLû½ïY^aq ²|4›È³õo}·÷ÃRÜþ½`òn)ü ©7~Ê 68£T_ÆÂ­¾ªûõª5Š¡ RÆxÕè³ÚÝç0I§‡ï£H )nì`Ø[GƒW ~m•VkÛ­òÀ1Û³sêO2©XÜÌÄ” bêbÚNÆÛ+RÆ^‘2kEÒV¢º¢"Ù·­a¯á{ç±mN­_Úd¡­MkÓfwÓæ{{Ý£À'XALœ»ñT{«°iï6íTa‹ËYþÚ§î!µ1euÜeh4R~îÿÔ¯µö:y¯=rn%¤ì(G}aG¡C\MzÊoâ"©AxO¹ëÆ~…â‡P(7¡h—)B&·×îù£âØüGoÊ>pùŠãª1ÍR%ÅzIŠmÞÛOJAVì'¥€±|«Š «6@¥Wz‘•åD¥Rç˜3Ÿá…¥è¾o »m€Ê>Ǭü)¸HìljrŸ¨i›¨‰ïîÃÈ:ô[oýVþ¦:ŽŽ˜j9Œr$~ÁH™üQÑRU\kíÀÕú‹«ÆÂÕèÜË\q5©ŽhjúW³WýtÔÄ7Û*ÝéP=Ë ¢· DÎe9Ñ&ˆã”x·D/aèÀÐ#pTÄ$Ù²*¿ûC*ƒÕ  §ñ€ Ç–5ˆÊu‡lïqȶO-F"dZ’ÅíÜè‹RVçf5Ä—¸â—I‰bRœ¦¸v>kÀŠ<]xQäaraÊ%ÂÔ: áˆÊU5Ë»UYïms 9 {7"UbeL%7¤îk»{Œ5™¢úÖ8J(K±‡”aÌ ðYnÕFk²4ÆÐ[5Æ}óN¶ï †)Œe¿7³û¥Ö¥ªuÑõÈ~5÷`ú®9§-¬HŒ–Eå1&è|”‡†2JÑæâÍ´v¢T¿i#*úaħ~É´—-j5îþ—Í(L%6ŠfíaOÜiî2sǶt?Jù¼Ÿ‰ Æ5¦sÓéÄ“ ¤žy„ÇE‘¨Í‹qVؤ]°I/çÒöœŒØðgâ(<î"GÑYi&(b5 LÝ~RA‘¨MƒIþEÛŠÐE@´—eÝìÕãÛ”+*ªŸÕ(aë‘å[´¨#öàP`ä± zÍåÚ[ñæZåYÂŒÖAø¨â&/ªÖV7-U⺢xÓ]Å-Ž*n²¡ïíG÷¾UqӝЛ!“Êz¸”Ð:È—jæÍµŠÃí‡î¯GKÍDïMr­«—jÑŸK`ÑãXp1ós7í@­L]¨…>¤2Öâ7â‡Ø"^±…,±E±!kÝ'ûan“~È"y—…Ç”E6æÖ,EÊ|}Çá¼öÏRI¯Rɸ¤’ÅMÿŠú¨Þú` µ1)ŒQ‘º·ëJø £yÄeR¶ë‚ñ‚ímºê Åò¤T¿{ï½vöý×Â¥—…KoíÅÛ{‘£SÓä˜ãñnWï^q+Ê:f~aª¾9NãMi1úƤh0> IÊè–»n­¸  ¬=¤2bä QÛB§|Á'ýÚBçvnô©às9´ þ>Ë~Ï >wÝ;˜UvöŠ<Ç…<çBúðß5Xú´Dl{ dñ(Áz¡Á ½Ì1Cµ3): Het¢™È1fpm/ú²Æ ®¥è²O”ºríÝ»Êmg\÷Õ(—Oï•@lƒžÅíPz ½æ½µ-œ&Pò¶l~m‚ÝÒö!m4Òv!-Òv mþÊÞŒŒȉ´O¤mCÚw¤Û³s—qÿ³˜­O˜@ÞE?ï(ÊdŸL½gK°<Ö|´Q'_Žb"õïùDÃ]|à Qaxù£›³–‰Ògolly-2.5-src/Patterns/HashLife/jagged2.mc0000644000175100001440000001776412156145314015341 00000000000000[M2] (golly 2.0) #C A variant of the jagged line pattern in which some of the gliders #C from the LWSS collision undergo 3 kickback reactions. #C #C The pattern looks roughly like this; view in a fixed-width font: #C #C F #C . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C . . #C I . . J #C . . . . #C . . . L . #C . . ...... . #C . . ...... . . . #C . K ... . . . #C . . ... . . . #C . . .. . . . #C . . ... . . #C . . . ... . . #C .. . .... #C G .. . . H #C . .. . . . #C . .. . . . #C . .. . . . #C . .. . . . #C . ... . . #C . .. . . #C . . .. . . #C . . ... . #C ............................................................................. #C A B . C D E #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C . #C M #C #C The lines AE, BF, and DF are straight; the others are jagged. CG is #C actually two jagged lines, which sometimes cross. #C #C BF and DF are lines of gliders headed southwest and southeast. #C #C AC and CD are lines of LWSSs headed toward C. At C, they crash to form #C gliders headed northwest (CI) and northeast (CJ). #C #C At H some of the gliders reflect toward the northwest, forming HK. The #C rest escape, forming HJ. #C #C At K the gliders reflect again, toward the northeast, forming KL. #C #C At L they reflect again, toward the southwest, forming LM. #C #C At G some of the northwestward gliders hit gliders in BF, forming #C blinkers which are the other part of CG. The rest escape, forming GI. #C #C In generation t, some of the coordinates are (asymptotically): #C #C A=(-t/2,0) B=(-t/6,0) D=(t/6,0) E=(t/2,0) F=(0,t/2) #C I=(-t/4,t/4) J=(t/4,t/4) M=(-t/4,-t/4) #C #C If the collision point C didn't drift, then the coordinates of the #C other points would be: #C #C C=(0,0) G=(-t/8,t/8) H=(t/8,t/8) K=(-t/10,t/5) #C L=(t/11,5t/22) #C #C But it does drift, and I don't know if it oscillates back and forth, #C or moves slowly but steadily in one direction. (In gen 17409 it's moved #C 260 units west; in gen 72609 it's 700 units east.) #C #C In addition to the headon LWSS crashes at C, the glider+LWSS crashes #C at B and D, the kickbacks at H, K, and L, and the glider+glider -> #C blinker collisions at G, there are some other reactions that occur #C occasionally: #C #C When C drifts far enough to the left, one of the gliders on CH may hit #C one of the blinkers, turning it into a pond; this first happens at gen #C 11986. A subsequent glider on the same path turns it into a block (first #C happens at 12056), and a third glider deletes it (first at 12300). #C #C Sometimes a glider on LM will hit a glider on CG, deleting both (first at #C gen 11808). And sometimes an LM glider will hit an eastward LWSS on BC; #C this is a ternary reaction which deletes the glider and 2 LWSSs (first at #C gen 5393). #C #C Unless I've overlooked something, that's all that ever happens. #C #C The open question here is what happens to the collision point C. Does it #C drift infinitely far west? Infinitely far east? Both? #C #C Dean Hickerson (dean.hickerson@yahoo.com) 7 May 2005 $$$$$$$.....***$ 4 0 0 0 1 $$$$$$$...***$ 4 0 0 0 3 5 0 0 2 4 6 0 0 0 5 7 0 0 6 0 $$$$$$$****$ $$$$$$$.**$ 4 0 0 8 9 $$$$$$.......*$ 4 0 0 0 11 5 0 0 10 12 .....*$.....*$.....*$......*$ ......*$.....***$....**.*$....***$....***$.....**$ 4 0 14 0 15 *$....***$...*..*$...*...*$..**..*$....*$.....**$.....***$ ...*..*$...*$...*$....*$*$$*$....*$ .....***$$$$$.....*$.....**$....*..*$ ...***$...*.**$....***$....**$ 4 17 18 19 20 $$$$.***$*****$*.***$**$ 4 0 0 22 0 ......**$ $$$$$$......*$.....***$ 4 24 0 0 25 5 16 21 23 26 *...*$*$.*$$$...**$..*..*$..*..*$ **.**$.****$..**$$.....*$.....**$.......*$..*****$ ..**.**$....**$$$$****$*...*$*$ ..****$..*$$$...***$..*****$.**.***$..**$ 4 28 29 30 31 $$$$$...*$....**$...**$ 4 0 33 0 0 .*$ 4 35 0 0 0 $...**$..****$.**.**$..**$$$.......*$ .....***$....*.**$...**$....***$.....***$$$...**$ *$***$...*$*...*$...*$..*$ 4 37 0 38 39 5 32 34 36 40 $$$$$$$.....**$ 4 0 0 42 0 ....**.*$....***$....***$.....**$ 4 0 44 0 0 ....****$...**.**$....**$ $$$$$$$.***$ 4 46 0 0 47 $$.......*$......**$.......*$ $$*$.***$****$***...*$.....*.*$......*$ 4 0 0 49 50 5 43 45 48 51 6 13 27 41 52 $$....*$...***$...*.**$....***$....**$ $$$$...*$..***$.**..*$.*...*$ $$$...***$..*..*$.....*$.....*$..*.*$ .*.**$.**$ 4 54 55 56 57 $$..*$.***$.*.**$..***$..**$ $$$$.***$.*..*$.*$.*$ $$$$.***$*****$***.**$...**$ 4 59 0 60 61 5 0 0 58 62 $$$$$$$..**$ $$$$$$$.****$ 4 0 0 64 65 5 0 0 0 66 ..*$.*.**$.*..*$$.*$*.*$...*$ 4 0 68 0 0 .*$..*$ $$$$$$$......**$ 4 70 11 71 0 $$.***$.*..*$.*$.*$.*$..*$ $$....**$.***.**$.*****$..***$ 4 73 0 74 0 .....***$.....**$.......*$ *$**$*$ 4 76 77 47 0 5 69 72 75 78 $$$$$.*$*$**$ $$$$.......*$......**$.....*$......**$ .......*$$$$.......*$......**$......**$ 4 80 81 0 82 **.**$****$.**$$$$.......*$***....*$ *...*$....*$...*$$$**$..*$..*$ ***...**$..*....*$$$**$***$*.**$.**$ .**$*$$$$.****$*...*$....*$ 4 84 85 86 87 $$.......*$.......*$$$$.....*$ $**$***$*.**$.**$ ....****$..*****$.*$*...*.**$.*...***$..*$ $*$**$*$$$$**$ 4 89 90 91 92 ...*$ 4 0 94 0 0 5 83 88 93 95 6 63 67 79 96 $$..****$..*...*$..*$...*$ $$...**$..**.**$...****$....**$ .....*$....*$....*$....**$......*$ ....*$....**$...**$..**$$**$ 4 98 99 100 101 ..****$.**.**$..**$ ..****$..*...*$..*$...*$ $.......*$.......*$$$$..***$..*$ 4 103 104 0 105 4 104 0 0 0 $....*$...*$...*...*$...****$ 4 108 94 0 0 5 102 106 107 109 $$$$....***$....*$.....*$ $**$$*$ 4 111 70 112 0 5 113 0 0 0 6 110 114 0 0 ...*$..*$$$......**$$.......*$ .......*$......*$$$*$*$ $...***$.....*$....*$ 4 116 117 0 118 5 0 119 0 0 ***....*$..*....*$..*$.*$ ***$*.**$.**$......**$......**$.......*$ $$$$$$***$..*$ $.......*$ 4 121 122 123 124 $$**.....*$.**...*$**$*$ $$***$..*$..*$.*$ *......*$*$**$.**....*$......*$...**$ $*$*$*$ 4 126 127 128 129 .*$$$.....*$......**$ $*$.*$.*$**$ 4 131 132 0 0 .......*$......*$ ***$..*$..*$.*$ 4 134 135 0 0 5 125 130 133 136 6 120 137 0 0 7 53 97 115 138 8 0 7 0 139 golly-2.5-src/Patterns/HashLife/jagged.mc0000644000175100001440000000624012156145314015242 00000000000000[M2] (golly 2.0) #C Jagged lines of gliders, formed by a drifting collision of two #C LWSS streams, crash to form an approximately vertical jagged line #C of pairs of blocks. I don't know if the line stays within a #C bounded distance of the center line, or extends infinitely far to #C the left, or to the right, or both. #C Dean Hickerson, 5/3/2005 $$$$$$$..*$ 4 0 0 0 1 $$$$$$$*$ 4 0 0 0 3 5 0 0 2 4 6 0 0 0 5 $$$$$$$....*$ 4 0 0 7 0 4 0 0 1 0 5 0 0 8 9 6 0 0 10 0 7 0 0 6 11 $$$$****$*...*$*$.*$ $$$$.**$**.**$.****$..**$ 4 0 0 13 14 $$$.......*$ 4 0 0 0 16 $$...**$..*..*$..*..*$..**.**$....**$ $.....*$.....**$.......*$..*****$..****$..*$ $$****$*...*$*$.*$ $...***$..*****$.**.***$..**$ 4 18 19 20 21 $$...*$....**$...**$ $$$$$$...**$..****$ 4 0 23 24 0 5 15 17 22 25 .***$**.*$***$.**....*$.......*$ $.***$*****$*.***$**$ $.***$*..*$...*$...*$...*$..*$ 4 0 27 28 29 .......*$.*....**$***...**$..**...*$...*$**.*$..**$ **$.*$*$*$ .......*$.......*$.......*$.......*$$..*$**.*$*..*$ **$..*$$$*$ 4 31 32 33 34 $....**$.....*$ $$$$.....**$....****$...**.**$....**$ 4 0 36 37 0 $...*$..*.*$.*$ $$$$$$$.***$ 4 39 0 0 40 5 30 35 38 41 $$$$$$$..****$ $$$$$$$...**$ 4 0 0 43 44 .**.**$..**$$$.......*$.....***$....*.**$...**$ $$$$$*$***$...*$ ....***$.....***$$$...**$..****$.**.**$..**$ *...*$...*$..*$$$..****$..*...*$..*$ 4 46 47 48 49 ..*...*$..*$...*$$$.....*$....*$....*$ ..**.**$...****$....**$$$....*$....**$...**$ ....**$......*$$$$..****$..*...*$..*$ ..**$$**$ 4 51 52 53 54 ...*$$$$$$.......*$.......*$ $$$$$$....*$...*$ $$$..***$..*$...*$ 4 0 56 57 58 5 45 50 55 59 $$$$.***$.*$..*$ 4 0 0 0 61 $$$$$$$.......*$ *..*$...*$...*$...*$..*$$$*$ ......**$.......*$ .***$****$***$ 4 63 64 65 66 $....***$....*$.....*$$$**$ *$ 4 68 0 69 0 5 62 67 70 0 6 26 42 60 71 ...***$...*.**$....***$....**$ $...*$..***$.**..*$.*...*$.*.**$.**$ ...***$..*..*$.....*$.....*$....*$ $$$$$..*$.*.**$.*..*$ 4 73 74 75 76 .***$.*.**$..***$..**$ $.***$.*..*$.*$.*$.*$..*$ $.***$*****$***.**$...**$ 4 78 0 79 80 $.*$*.*$...*$ 4 0 82 40 0 $$$$......**$.....***$.....**$.......*$ $$$$$*$**$*$ 4 0 16 84 85 5 77 81 83 86 $$$$..**$**.**$****$.**$ $$$$.****$*...*$....*$...*$ 4 0 0 88 89 $$.*$*$**$ $.......*$......**$.....*$......**$.......*$ $.......*$......**$......**$$$**$***$ 4 91 92 63 93 $$$.......*$***....*$***...**$..*....*$ $$**$..*$..*$.**$*$ $**$***$*.**$.**$ $$.****$*...*$....*$...*$ 4 95 96 97 98 5 0 90 94 99 .*..*$.*$.*$.*$..*$$$....**$ .***.**$.*****$..***$ 4 101 0 102 0 $$$$.***$...*$..*$ $$$$$.......*$......*$ 4 0 0 104 105 $......**$$.......*$ $*$*$$$$...***$.....*$ ....*$ 4 107 108 0 109 5 103 106 0 110 .......*$$$$.....*$....****$..*****$.*$ *.**$.**$$$$$*$**$ *...*.**$.*...***$..*$$$***....*$..*....*$..*$ *$$$$**$***$*.**$.**$ 4 112 113 114 115 $$$$$$$**.....*$ $$$$$$$***$ 4 0 0 117 118 .*$ ......**$......**$.......*$$$$.......*$ $$$***$..*$.*$ $$$$$$*$.*$ 4 120 121 122 123 .**...*$**$*$$$*......*$*$**$ ..*$..*$.*$$$$*$*$ .**....*$......*$...**$$$.......*$......*$ *$$$$$***$..*$..*$ 4 125 126 127 128 5 116 119 124 129 6 87 100 111 130 ...*$ 4 132 0 0 0 ...*...*$...****$ 4 134 0 0 0 5 133 135 0 0 6 136 0 0 0 .....*$......**$ .*$**$ 4 138 139 0 0 4 0 120 0 0 5 140 141 0 0 6 0 142 0 0 7 72 131 137 143 8 0 12 0 144 golly-2.5-src/Patterns/HashLife/logarithmic-width.mc0000644000175100001440000005527212156145314017451 00000000000000[M2] (golly 2.0) #C Patterns whose population grows logarithmically have #C long been known, but this is believed to be the first pattern #C whose *diameter* grows logarithmically. It is based on a #C blinker puffer that can be deleted by its own output (a blinker), #C or push a block out by 8 cells. #C #C By Jason Summers with Gabriel Nivasch, 16 Aug 03 #C #C Analysis by Dean Hickerson: #C #C Let g(n) be the generation in which the leading puffer is in the #C same position as in gen 0, the block is 8n units to the right of #C its initial position, and there are no blinkers in between. I.e., #C the puffer is on its way to push the block from position n to #C position n+1. g(n) is always a multiple of 240; the first few #C values are: #C n 0 1 2 3 4 5 6 7 8 9 10 #C g(n) 0 240 720 1440 2400 3840 6000 9120 13680 20400 30240 #C g(n)/240 0 1 3 6 10 16 25 38 57 85 126 #C #C Letting h(n)=g(n)/240, we have the recurrence #C h(n) = h(n-1) + h(n-3) + 3. #C #C Also, #C h(n) = round(C * R^n) - 3, #C #C where #C R = (2 + cbrt(116 + 12 sqrt(93)) + cbrt(116 - 12 sqrt(93))) / 6 #C ~ 1.465571231876768026656731225219939108025577568472285701643 #C #C and #C C = 1 + cbrt((13113 + 151 sqrt(93))/17298) + #C cbrt((13113 - 151 sqrt(93))/17298) #C ~ 2.82110012372929333835936935875070702572316547898891137253679 #C (C satisfies 31 C^3 - 93 C^2 + 16C - 1 = 0.) #C #C Since the diameter in generation g(n) is 8n + O(1), we find that #C the diameter in gen t is asymptotic to A * log(t), where #C A = 8/log(R) #C ~ 20.92898063664810844728999060141708775230924963625537466402 $$$$$$$....**$ 4 0 0 1 0 5 0 0 2 0 6 0 0 0 3 7 0 0 0 4 8 0 0 0 5 9 0 0 6 0 10 0 0 7 0 11 0 0 8 0 $$$$$$$.**$ 4 0 0 0 10 ....**$....**$$$$$$...***$ .**$ $...*.*$..*****$.**...**$.**...**$$$....*$ 4 12 13 14 0 5 0 11 0 15 $$$$.....*$.....*.*$......*$......*$ $$$$......*$......*$*.....*$.*$ 4 0 0 17 18 $$..**$.***...*$**.....*$.*....*$**$.***$ $$.*.....*$...*...*$$....*$...**..*$.......*$ 4 0 0 20 21 ......*$.....*.*$.....*$ *$$.......*$$.......*$ ......**$.....***$....****$...**$....****$.....***$......**$ **$***$****$...**$****$***$**$ 4 23 24 25 26 ..**$$$**$*.....*$......*$......*$.......*$ $$$.....**$*....*$.*....*$.*.....*$**$ $.....**$.....**$....*$....*.**$.....***$......*$ ***$***$.**$ 4 28 29 30 31 5 19 22 27 32 6 0 0 16 33 $$*$*$$*$.*$.*$ 4 0 0 35 0 *$$$*.**$...*$..*$**$ $$$$$$.......*$.......*$ $$$$.*$*.*$...**$...**$ 4 37 0 38 39 $$$$$$$**$ 4 0 0 41 0 5 36 0 40 42 6 0 0 43 0 $$$$....**$....**$ $$......*$....*.*$..**$..**$..**$....*.*$ $$$$$**$**$ ......*$$$.....*$....*.*$....**.*$....**.*$....**.*$ 4 45 46 47 48 ..**$$.*$.*$.....*$..*$....**$ $$$$$$*$ 4 50 0 51 0 ....*.*$.....*$$$$$$......**$ .......*$ 4 0 53 0 54 $$***$***$$$$...**$ $......**$......**$$$......*$.....**$.....*.*$ ****$***$.*$$$$$.....**$ $$$$$$$.....**$ 4 56 57 58 59 5 49 52 55 60 $$$$$$$.....*$ 4 0 0 0 62 .......*$......*$.....*$......*$.......*$ *****$.....*$......*$.....*$*****$ $$$......*$.....***$**..*..*$**..**$ $$$......*$*.....*$*$$.*$ 4 64 65 66 67 .....*$....*.*$.....*$.....*$.....*$.....*$....*.*$.....*$ $$$$*$.**....*$.**....*$.**$ .....*$$$$$*$*$ 4 0 69 70 71 5 0 63 68 72 .....**$$.**$.**$ ....***$.....**$ 4 74 75 0 0 5 0 76 0 0 $$**$**$ .*....*$.*....*$ 4 78 79 0 0 *$ 4 81 0 0 0 5 80 82 0 0 6 61 73 77 83 ...**$*.*$.*$ 4 54 85 0 0 **$ 4 87 0 0 0 5 86 88 0 0 $$$$$.......*$$.......*$ 4 0 90 1 0 $$$$$..*$...*$...*$ ****$ $...****$..*...*$......*$..*..*$ 4 92 0 93 94 ....**$$$$$$....***$...**.**$ ...**.**$...*****$..**...*$ $$*$ 4 96 0 97 98 $$$$$..*$.*.*$.**.*$ 4 0 0 100 0 5 91 95 99 101 ...*$..**$..*.*$ $..**$..*.*$..*$ 4 0 0 103 104 .**.**$.**.*$.*.*$..*$......**$......**$ .**$.**...**$......**$ ......**$......**$$$$....**$.....***$......**$ *$*$$$$.**$**$*$ 4 106 107 108 109 $.*$*.*$$$***$***$.*$ $$.*$***$***$$$*.*$ 4 0 111 0 112 .......*$.***$.*$..*$ $....***$$....*.*$...*****$..**...*$..**...*$ $$$$$*$*$ 4 114 0 115 116 5 105 110 113 117 6 89 102 0 118 7 34 44 84 119 $$$$$$$....*$ 4 0 0 0 121 ...***$..**.**$.***.***$.***.***$.***.***$.***.***$..**.**$...***$ ....*$ 4 0 123 0 124 5 122 0 125 0 6 0 0 0 126 $$.......*$......*$$.....*$.....*$ $***$...*$....*$$.....*$.....*$ 4 0 0 128 129 ......*$.......*$ ....*$...*$***$ $....*.*$....**$.....*$ 4 131 132 0 133 5 0 130 0 134 ....**$$$$.....*$....***$...*...*$..*.***$ $$$$$$$*$ ...*****$$$$$$....*..*$....*.*$ 4 136 137 138 51 ...**$..**$..**.*$...***$$$....**$.......*$ $$$$$$.**$ ....*$.....**$......*$.......*$.......*$ ..*$**$*$$.....**$.....**$ 4 140 141 142 143 $$.......*$......*$......*$......*$.......*$ $**$.*$.....***$.*..*..*$.....**$.*$**$ 4 0 0 145 146 5 139 0 144 147 ......*$.....*$.....***$ 4 0 0 149 0 $...***$$$$$.....*$....*.**$ $$$......**$......*$.**....*$*..*$.**....*$ ...*...*$...*****$..**...*$...*****$....***$.....*$ ......*$......**$*$ 4 151 152 153 154 $$$$$$....**$....**$ 4 156 0 0 0 5 150 155 0 157 $......**$......**$$*$**$***$**$ $$$$$.**$.**$ 4 159 160 81 0 $$$$$$$......*$ $$$$$$$.*....*$ ....***$......*$ .******$.*....*$ 4 162 163 164 165 5 161 166 0 0 6 135 148 158 167 $$$$$$....**$...*.*$ 4 0 0 0 169 $$$$$.*******$.*.****$.*******$ $$$$$$$*.*$ 4 0 171 0 172 $$$$$*$*$*$ .....*$$$$$$...**$....**$ $$$$$....*$....**$...*.*$ ...*$ 4 174 175 176 177 5 0 170 173 178 .....*.*$......*$......*$......*$.....*.*$.....*$ $$$$....***$...*...*$..*$..*$ $$$$$$*$*$ 4 0 180 181 182 $*....**$.*...**$*$ 4 184 0 0 0 5 63 0 183 185 *...*$....*$*....*$....*$*...*$*.*$ 4 0 187 0 0 $.......*$.....*$....*$....*$....*$.....*$.......*$ $*$*$....**$...*$....****$*$*$ 4 189 190 0 0 5 188 191 0 0 .....*$...*...*$*...***$.*...*$.*$*$....**$....**$ 4 193 0 0 0 5 194 0 0 0 6 179 186 192 195 4 90 92 0 93 4 0 0 94 0 $$$$$$$...*.*$ 4 0 0 0 199 4 0 0 172 0 5 197 198 200 201 *.*..*$...*.*$ $$$**$**....**$ $..*.*$.*..*$**.....*$...*...*$**.....*$.*..*..*$..*.*$ 4 54 203 204 205 *..*.**$*.*$ $$$$.**$*.*$..*$ $$**$**.**..*$...*...*$.*$*......*$ $$$*$.*$..*$..*$..*$ 4 207 208 209 210 .......*$.......*$ .*$*$ 4 212 213 0 0 5 206 211 0 214 6 0 202 0 215 7 127 168 196 216 .*$ 4 0 218 0 0 $.....*$......**$$$$....*..*$....**$ $$$$*$ 4 220 221 0 0 5 219 222 0 0 6 0 223 0 0 7 0 224 0 0 8 120 217 225 0 $$$$$$$...*$ ..*.*$.*.**$**.**$.*.**$..*.*$...*$ $$.......*$.......*$ 4 227 0 228 229 $$$$$$$...**$ ...**$$*$*$.....**$ 4 231 0 232 0 5 0 0 230 233 $....*.*$.....**$.....*$$$$.*$ .***$.*$ ....*$.....**$....**$.....**$......**$......*$.......*$ 4 235 0 236 237 $.**...**$..*****$..**.**$..**.**$...***$ $$$$$*$ $...**$.*..*$*$*......*$*$.*..*$...**$ 4 239 0 240 241 $$$.***$*****$***.**$...**$ 4 0 0 243 0 ......*$....***$ 4 62 0 245 0 5 238 242 244 246 $$$*****$.....*$**...*$....*$ 4 0 0 248 0 5 249 0 0 0 6 234 0 247 250 4 0 0 0 172 5 0 0 0 252 $$$$$.......*$.....*$....*$ $$$$$*$*$....****$ 4 0 0 254 255 $$$$$....**$....**$*$ 4 0 0 257 0 5 0 0 256 258 $$......**$......**$ 4 0 260 0 0 4 0 187 0 171 5 261 262 0 0 ....*$....*$.....*$.......*$$...*.*$....**$....*$ ...*$....**$*$*$ $$$$...*$....**$...**$ 4 264 265 174 266 .*$.*...*$*...***$...*...*$.....*$..*$..*$...*...*$ ....***$ 4 268 116 269 62 $$$.......*$.......*$ 4 0 271 0 0 $$$*$*$ 4 273 180 0 243 5 267 270 272 274 6 253 259 263 275 $$$$$$**$.**$ $$.......*$......**$ 4 277 0 81 278 $$.**$*.*$$..*$.*$ $....*.*$..*...*$..*$.*....*$..*$..*...*$....*.*$ 4 0 0 280 281 .....*$.....*.*$......**$$$$.....**$.....*.*$ $.......*$....****$...****$...*..*$...****$....****$.......*$ 4 1 0 283 284 5 0 279 282 285 $$*$$*$ 4 0 0 287 0 $$$.***$ 4 0 0 0 289 $$$$$$$.......*$ $$$$$$$..**$ 4 0 0 291 292 5 288 0 290 293 $......**$......**$.....*$....*$.....*$......**$ $*$*$.*$..*$.*$*$ $$$$$..**$..**$ 4 295 296 297 0 $*$ 4 212 299 0 0 ......**$......**$ 4 301 0 0 0 5 298 300 302 0 $......**$......*$.......*$ ...*****$..*.***$...*...*$....***$.....*$ $*$$$$.**..**$.**..**$.....**$ 4 0 304 305 306 ......*$*......*$ ..***..*$..**$ ......**$......*$......*$..*$..**$...**$...***$...**$ $*$$......*$......*$......*$ 4 308 309 310 311 .....**$.....**$ 4 313 0 0 0 ..**$..*$ 4 315 0 0 0 5 307 312 314 316 6 286 294 303 317 4 0 90 0 0 $$$$$$$**..*$ 4 0 0 320 0 $$......**$....*$...*$..*$..*$..*$ 4 0 0 0 322 5 0 319 321 323 $$$.*$..*$...*$...*$...*$ $$$$$......**$.....*.*$.......*$ 4 0 0 325 326 $.***$ .......*$......**$.....***$......**$.......*$ 4 0 0 328 329 5 95 0 327 330 **...*$**..*$ $..**$.***$**$.*....*$**.....*$.***...*$..**$ $$$...**$....*$$...*$.*$ 4 332 0 333 334 ...*$....*$......**$$$$$.....*$ $**$**$ ....*.*$....**.*$....**.*$....**.*$....*.*$.....*$ 4 0 336 337 338 5 335 339 0 0 ..*$.*$$$$......**$$.......*$ $$*......*$......**$....**$......**$.......*$ $*.*$..*$$.*$.....**$..*....*$*.*$ 4 341 116 342 343 $$.......*$......**$.....***$....*.*$....**$ $$$*$**$*.*$.**$ $.......*$......*$..**..*$..**...*$......**$......**$......**$ $$*$*$ 4 345 346 347 348 5 344 349 0 0 6 324 331 340 350 7 251 276 318 351 $*$.*...**$*....**$ $$$$$$.*..*$.....*$ 4 353 0 354 0 5 0 0 355 0 6 0 0 356 0 $.......*$.......*$ ......**$*.....*$*.....**$.......*$ 4 0 291 358 359 5 0 0 0 360 $$$$$$..*$***...**$ $$$$......**$......*$.......*$ **...**$.*...**$**....*$***...*$..*$ .......*$*.**..*$*.**..**$**$ 4 362 363 364 365 $$$$$*$**$***$ $$$$.....**$.....**$$.**$ **$*$$$$$$*$ .**$$$$$$......*$.....***$ 4 367 368 369 370 5 0 0 366 371 $$$$...*$.**.****$...*$ $$$$*$.**$*$ 4 373 374 0 0 .**$**$ ....****$...**$....****$....*$.....*.*$......*$ $*$.*$**$ 4 376 377 0 378 4 0 0 243 354 5 375 379 0 380 6 361 372 0 381 .*...*$..****$$$..***$.*****$.***.**$....**$ 4 383 0 0 0 ***$.*.*...*$.*..*..*$.*.*$***$*$ $*$*$ 4 137 0 385 386 5 384 0 387 0 $$$$......**$$.....*$ 4 0 0 0 389 5 0 0 0 390 4 0 0 0 229 .....**$$$$$$$..**$ $.......*$*.....**$*......*$ ..**$*$*$*$..**$..**$ 4 0 393 394 395 $$$$$..**$.**$...*$ 4 0 0 397 292 5 392 396 122 398 6 388 391 0 399 $$$$$....*$...*.*$.**...*$ ....**$....**$$*$.**$$...*$ .**...*$.**...*$...*.*$....*$ 4 47 401 402 403 $$$...*$.**$..**$ ....*.*$...***$..***$...***$....*.*$.....**$ 4 0 59 405 406 5 0 197 404 407 4 0 383 0 0 $..**$.*..****$..**.***$ $$$$.....*$.....***$.....*$ 4 0 0 410 411 $$$$*.**.*$*.**.***$*.**.*$ $$$$*$*$*$ 4 0 0 413 414 5 198 409 412 415 *.**$$$$$.**$ $$$..*.*$..**$...*$ $$$.....**$.....**$ 4 417 418 419 0 $$$$$...*..*$...****$...*..*$ $$$$$**.*..*$**.****$**.*..*$ 4 421 422 0 0 5 420 423 0 0 $$$$$$.......*$......*$ ....**$....**$ .....***$....***$.....***$......*$.......*$ 4 0 425 426 427 $$....**$...*.*$.....*$ ....**$...*..**$....***$*....**$*......*$ ..*$.*.*$*...*$*...*$*...*$.*.*$..*$ 4 182 429 430 431 5 428 432 0 0 6 408 416 424 433 7 357 382 400 434 $...**..*$...**..*$.......*$ ....**$*....**$*....***$*....**$....**$....*$ $$$$$....**$....**$ 4 436 437 0 438 $$$$......**$......*$ ..*.*$..*$$$$*$*$**$ $$$$.*$..**$..**$..**$ 4 440 441 271 442 .*$$.....*$....*.*$...*...*$...*****$..**...*$...*****$ ....***$.....*$ 4 212 444 0 445 5 439 443 0 446 $$.....**$.....**$ 4 0 448 0 0 5 0 449 0 0 6 0 447 0 450 $$$$..*$..*$..*$ 4 0 0 452 0 $$$$$$..**$.**$ ...*$$$$$....**$...*.*$..***$ 4 51 454 10 455 $...*$.**.****$...*$ $*$.**$*$ $$$$..**.*$**.*.*$**.*.**$.....**$ $$$.*$.****$..****$..*..*$..****$ 4 457 458 459 460 5 453 0 456 461 $$$$$...**$...**$ 4 0 0 463 0 5 0 0 464 0 .***$..***$...*.*$....**$ 4 13 466 0 0 ....**$ .****$.*$ 4 468 469 0 0 5 467 470 0 0 6 462 465 471 0 7 451 472 0 0 8 352 435 0 473 9 226 474 0 0 $...***$...***$..*...*$.*.....*$..*...*$...***$ 4 0 45 0 476 5 0 0 0 477 $$$$$$....**$**.*..*$ $$$$.**$.*.*$....*$.*..*$ **..**$ ....*$.*.*$.**$......*$....**$.....**$ 4 479 480 481 482 $$$$$$*.*$..*....*$ ......**$....**$......**$.......*$ .....**$.*$$..*$*.*$ 4 291 484 485 486 5 0 0 483 487 *$**$*$*$$$....*$..*.*$ $$$$......**$......*$....*.*$....**$ **$**$**$..*.*$....*$ $$$.....**$....*.*$....*$...**$ 4 489 490 491 492 $$$$$$....*.*$..*...*$ ..*$.*....*$..*$..*...*$....*.*$ 4 494 0 495 0 $$$$$*$.*$**$ 4 0 0 291 497 $......*$.....*$.....***$ 4 0 0 499 0 5 493 496 498 500 $$$.....*.*$.....**$......*$ $$$$$.....**$ $.*$.*$.*$ 4 502 503 504 0 $$$$.*.*..*$*..*..*$.*.*..*$ $$$$*$.*.**$*$ 4 506 507 0 0 5 505 508 0 0 6 478 488 501 509 $$$$$$......**$.....***$ 4 0 0 0 511 $$$$..*$..**$...**$...***$ 4 0 0 227 513 $...**$...**$ ..*.**$..*..*$..*.**$.....***$......**$ $..**$..**$ $$$$...*..**$..*...**$...*..**$ 4 515 516 517 518 ..****$..*....*$...*...*$...**.*$ ...**$..**$..*$$$$$...*.*$ $$$$....**$*..***$....**$ ....**$....*$$$*$.*$*$ 4 520 521 522 523 5 512 514 519 524 $$$$.**$.**$ 4 0 0 59 526 .....**$ $.......*$$$$$...*$....**$ *****$.***.*$*...*$.***$..*$$$......**$ 4 528 0 529 530 $$$$$$.*$**$ $$$$..**$..*$*.*$**$ 4 0 0 532 533 5 527 0 531 534 ....**$$...*$....**$ .....***$.....*$.....***$......**$ 4 536 537 0 0 *$*$*$**$.*$$.......*$ .......*$.....**$.......*$.**$*.*$*$*$ 4 539 540 0 0 4 0 0 0 243 $$$$.....***$......**$...***$...**$ 4 0 0 354 543 5 538 541 542 544 6 525 535 0 545 $$$....*$....**$...*.*$ 4 0 0 0 547 .....*.*$$...*..*$...*$.....*$....*$ .......*$......**$.......*$$$$$...*$ 4 162 0 549 550 $$$$$$..**$..**$ *......*$*.....*$*......*$..**$..**$ ...**$..*.*$****$***$ 4 552 0 553 554 5 548 0 551 555 .**.**$$*.....*$$**.*.**$ 4 0 557 260 297 5 558 0 0 0 6 556 0 559 0 $$$$$.......*$.......*$.......*$ $$$$$*...*..*$****$*...*..*$ 4 561 562 0 292 5 319 95 0 563 $$$..**$.****$.**.**$...**$ $$$$$$$....*.*$ 4 383 565 0 566 $$$$$...**$*****$...**$ $$$.......*$......*$ $$$.......*$ $$$**$.*$*$ 4 568 569 570 571 $***$*$$*$*$$......*$ ...*..*$..**$**...*$..**$...*..*$....*.*$ .....*.*$....*$.....***$...**$ $*$$**$ 4 573 574 575 576 5 0 567 572 577 4 0 358 0 0 $*......*$*.....**$.......*$ ..**$*......*$*.....*$*.....**$..**$..**$ 4 580 581 0 0 5 579 582 0 0 *$****.**$.**....*$$*$$.......*$.....**$ $$$*$*$*$ 4 584 585 0 0 $$$.**$.**$$.....**$.....**$ 4 587 0 0 0 5 586 588 0 0 6 564 578 583 589 7 510 546 560 590 $$$$**$**$$....**$ 4 0 0 0 592 $$$$....**$..*...*$.*.....*$**.*...*$ 4 0 0 594 0 $$.......*$......*$.......*$.....**$ ....**$*$.*$..*$**$..**$ $$$$$$.*.*$*..*$ 4 596 597 598 0 .*.....*$..*...*$....**$ $$$.*.*$.**$..*$ $$...*$.**$..**$ $$$$..**...*$..*****$..**...*$ 4 600 601 602 603 5 593 595 599 604 $$$$$$.....**$.....**$ $$$$$$$...***$ 4 0 0 606 607 ..**$.***$..**$.....**$.....**$ ..*****$.*...*.*$..*...**$ $$$$..*...**$...*****$..*...**$ 4 609 610 611 0 $$$$$$..*$..**$ 4 0 0 613 0 5 608 0 612 614 *$..*$*$*..*$.*.*$ 4 616 448 0 0 4 0 0 116 0 5 617 0 618 0 .....**$.**..**$.**..**$ 4 0 620 0 0 ...**$...***$...**$..**$..*$ $$....*.*$.....**$.....*$ $$$...**$.*....*$.*....*$.*....*$...**$ 4 622 623 624 624 5 621 625 0 0 6 605 615 619 626 $$$$...*$...*.*$....*.*$....*..*$ $$$$.......*$.......*$$...**$ 4 0 0 628 629 $$$$*$*$ 4 0 0 631 0 5 0 0 630 632 $$$.......*$......*$......*$......*$.......*$ $$$$$$$......**$ 4 438 634 0 635 5 0 0 0 636 ....*.*$...*.*$...*$ ...**$$$$.......*$......**$.....*$ $$......**$.....*$.....**$$.......*$ .....**$$*$*$......**$$.**..*$***...*$ 4 638 639 640 641 $$*$*$.*$.**$...*$*$ ..**$$$*$$$.....**$*....*.*$ 4 643 0 644 0 *.....**$.......*$......**$.....*.*$.....**$ *$**$*$ 4 646 647 0 0 5 642 645 0 648 .....*$....****$.....*$......**$ 4 0 650 0 0 4 337 0 243 354 $$$....**$...****$...**.**$.....**$ 4 0 0 653 90 5 0 651 652 654 6 633 637 649 655 $......**$......**$.**$...*$ 4 657 0 0 0 $$$$$$.......*$......**$ 4 0 0 0 659 5 0 0 658 660 $$$$$**$..*....*$****..**$ $$$$$**$..*....*$****...*$ 4 0 0 662 663 $$$.....*$$...***$...**$...**$ 4 0 0 182 665 5 0 0 664 666 ......**$....*$...*$..**.*$...*$....*$......**$ 4 0 54 260 668 5 0 669 0 0 ..*....*$**$ ..*$**$ $*.....*$.*$.*$.*$*$ $.***$...*...*$..*....*$$$$.......*$ 4 671 672 673 674 *$.**$*.*$..*$ ....*.*$.....*$$$..**...*$..**...*$...*****$....*.*$ $$$.*$..**$..**$..**$.*$ $....***$$$**$**$$....**$ 4 676 677 678 679 4 0 54 0 0 4 0 468 0 0 5 675 680 681 682 6 661 667 670 683 $$$$$$..**$...*$ ..**$..*.*$.....*$..*..*$.....*$..*.*$..**$ ...*.*$....**$$$.......*$...**$...*.*$.....*$ 4 0 685 686 687 ...*$...**$....**$....***$*...**$...**$...*$ 4 0 0 689 0 5 197 198 688 690 4 565 0 0 0 $$$$$.......*$**....*$**....*$ 4 0 0 0 693 $$$$$*......*$.*....*$.*....*$ $$$$$*$.*$.*$ 4 0 0 695 696 5 409 692 694 697 4 631 528 0 0 $$...*$..***$..***$$**...**$**...**$ $$...*$..*.*$.**....*$.**....*$.***$..*.*$ 4 0 700 0 701 ...**$ 4 0 703 0 0 5 699 702 0 704 ......*$.......*$$$$..**$..*.*$..*$ $$.*.*$.*...*$.....*$.*....*$.....*$.*...*$ 4 0 706 631 707 .*....*$*......*$ .....*$...****$..*.*.**$.*..*.**$..*.*.**$...****$.....*$ $$$*$ 4 709 213 710 711 .*.*$ 4 0 713 0 0 5 708 712 714 0 6 691 698 705 715 7 627 656 684 716 8 591 717 0 0 $$**$...*$....*$..*.**$....*$...*$ ....*$..*.*$**$**$**$..*.*$....*$ **$$$$$$$......**$ $...*$....**$...**$ 4 719 720 721 722 $$$......**$......**$ ..**$..*..*$$......*$$....**$...*$ $**...**$**...**$.*****$..*.*$$..***$ 4 724 725 0 726 5 0 0 723 727 .**$.**$$.....**$.....**$$$.*$ ***$***$$...**$...**$$$.*$ 4 0 729 724 730 5 0 0 0 731 *....*$**..****$*....*$......**$ 4 733 647 0 0 $..*.*$...**$...*$$.....**$.....*.*$......*$ 4 735 0 0 0 4 0 0 92 0 ....*$..*.*$...**$ 4 0 738 0 0 5 734 736 737 739 $$..**$.*.*$*$*..*$*$.*.*$ ...**$...*$.*.*$.**$$$$..**$ ..**$ .*.*$.*$**$ 4 741 742 743 744 $$....*$...**$..**$.***$..**$...**$ *.*$*.*$..*$..*$..*...*$....**$**...**$ $$$$....*$....*.*$....**$ 4 746 747 124 748 5 745 749 0 0 6 728 732 740 750 ......*$....*$....*$...*$....*$....*$......*$ *$*$$*$$*...*.**$*..*.***$...**..*$ $$$$$....*.*$....**$.....*$ 4 752 753 754 59 $$$.......*$.*....**$.....***$*.....**$*......*$ $$*$***$.*.*$.*..*..*$.*.*...*$***$ 4 756 757 59 81 5 0 0 755 758 $$.....**$....*.*$...*$...*..*$...*$....*.*$ 4 116 0 297 760 $.......*$......*$.....**$..***.*$.*..*..*$..**$ *$.*$**$**$**$.*$*$ 4 0 0 762 763 5 0 0 761 764 ....*..*$....*..*$....*..*$.....**$ 4 0 766 0 0 4 766 0 0 0 5 767 768 0 542 ...*..*$.***..**$...*..*$ 4 0 528 0 770 $$.*.*$..**$..*$ ...*..*$****..**$...*..*$ 4 0 772 773 299 4 0 0 354 653 4 0 0 90 92 5 771 774 775 776 6 759 765 769 777 4 93 0 0 0 $$$$$$....*..*$..***..*$ ....*..*$ 4 0 780 0 781 $$$$$$....*..*$*****..*$ $.......*$$.......*$$$$**$ $......**$$.......*$ 4 783 784 781 785 5 779 0 782 786 $*$**$ .......*$.......*$$$.*$.*.....*$.......*$*$ $*$*$$$.......*$ .*$.*$$$$*...**$*****$**.**$ 4 788 789 790 791 *$..*$...*$...*$...*$..*$*$ $$..**$..**$ 4 793 794 0 0 5 0 319 792 795 $$...**..*$...**.*$.......*$ ....**$....*.*$*......*$.*..*..*$*......*$....*.*$....**$ $$.**$.**$ 4 797 798 799 0 .......*$......*$ *$*$*.....*$.....*.*$.....**$.....**$.....**$.....*.*$ ......*$ 4 801 802 0 803 5 800 804 0 0 $$$$*....**$**...**$*$ **.**$.***$$$$$$.**$ 4 806 807 0 13 5 808 0 0 0 6 787 796 805 809 $$$$$.....**$....*..*$...*****$ 4 0 0 0 811 5 95 0 0 812 4 383 565 0 0 4 0 93 0 0 $$$$$.....**$....*..*$*..*****$ 4 0 0 816 137 $...**$..*.**$...**.*$...***$...***$ .......*$.......*$$..*....*$$***....*$**.....*$**$ 4 0 0 818 819 5 814 815 817 820 ....*..*$.....**$ $$...**$...**..*$ ...**$.*...*$*.....*$*.*...*$*.....*$.*...*$...**$ 4 0 822 823 824 5 0 825 0 0 $......**$.....*.*$.......*$ $...*..**$$.......*$ $*$*...*$....*.*$.......*$.......*$.......*$....*.*$ 4 822 827 828 829 $$$$.......*$.......*$ .*.*$..*$$$*...**$*...**$*****$.*.*$ $$$$*....**$*....**$*$ $.***$$$$$$.**$ 4 831 832 833 834 4 0 124 0 0 4 0 13 0 0 5 830 835 836 837 6 813 821 826 838 7 751 778 810 839 $$$....**$....**$ **$**$$$$..**$ 4 0 0 841 842 5 0 0 843 0 $$......**$.......*$.......*$.......*$ $$...**$****$*.**$*.**$***$ $.*$..**$.**$$....*$....*$....*$ $$$......*$.....*$.....*$.....*$......*$ 4 845 846 847 848 $$**$.*$.....***$....*$.....**$.*$ $$$$**$..*$..*$.*$ 4 0 0 850 851 4 0 0 0 291 $$$$$$****$...*$ 4 87 0 854 0 5 849 852 853 855 6 844 0 856 0 5 0 0 0 380 5 0 0 654 737 6 0 0 858 859 .....**$...**.**$...****$....**$ $.......*$ 4 861 862 0 0 ...*$..*$ 4 864 0 0 0 $$$$$$.......*$ *$.*$..*$..*$..*$.*$*$ *.*$.**$$$....**$**$*.*$..*$ 4 866 182 867 868 *$**$.**$.***$.**$**$*$ $.....**$.....**$$$$.......*$.......*$ 4 0 0 870 871 5 863 865 869 872 $$$$$$**$ $$$$$....**$...*..*$...*..*$ 4 0 0 874 875 $$$$$.......*$$......*$ $$$$.*.....*$...*...*$...*$....*$ ......**$$$$$....**$...*..*$...*..*$ 4 877 878 879 358 5 0 197 876 880 4 0 743 0 0 $$$.......*$.......*$$.....**$.....**$ $$*$**$**$$..**$..**$ $$$.......*$......**$......**$......**$.......*$ $$*$.*$....**$....**$*$.*$ 4 883 884 885 886 4 0 87 0 0 5 882 887 0 888 *$$$$$.......*$.......*$.......*$ ...*..*$....**$$$$*$.*$ $$......*$......*$$......*$$......*$ $$*......*$..*...*$..*....*$...*$..*$..*$ 4 890 891 892 893 ...*..*$....**$ $$......*$.....*$......*$ ..*$****$.*.**$.*.***$.*.**$****$..*$ 4 895 896 897 260 4 803 81 0 0 5 894 898 899 0 6 873 881 889 900 $$$$*$**$.**.*$.*..*$ $$$.......*$......**$.....***$......**$.......*$ .**.*$**$*$ $....*$..*.*$...**$ 4 902 903 904 905 $$*$*$....**$....**$....**$*$ $$....**$....**$$**$**$.....*$ ....***$...*...*$..*.***$...*****$ 4 907 908 81 909 5 198 409 906 910 4 93 861 0 0 4 0 0 98 0 5 692 912 913 0 $$.**....*$.***..**$.**....*$ $$*..*$*...*$*..*$ 4 915 916 0 0 ...*$....*$..***$ 4 918 0 54 87 $$$$$.....***$.......*$......*$ 4 0 0 0 920 5 917 919 0 921 $$$$...*$...****$....****$....*..*$ ....****$...****$...*$ 4 923 59 924 528 $$$$$$$..*$ ...**$..**$ $$$.......*$....****$...****$...*..*$...****$ 4 926 0 927 928 $$$......**$......*$$.......*$ 4 0 930 121 47 5 925 0 929 931 6 911 914 922 932 7 857 860 901 933 *$*$ 4 0 0 212 935 5 0 0 0 936 6 0 937 0 0 $$$..*$.**$***$.**$..*$ $$$.*$.**$.***$.**$.*$ 4 0 0 939 940 $$$$$$$.*$ $$$$.....**$......**$.....*$ *.*$**$ 4 0 942 943 944 $$$$$$....*$...*.*$ $$$......*$......**$.....*.*$ ..*...**$..*...**$..*...**$...*.*$....*$ $.....***$....****$....*..*$....****$.....***$ 4 946 947 948 949 $.....***$....*$$...*$...**$ *$*$$$.....*$*....*$*$ ......*$.....*.*$.**..*.*$.**....*$.......*$....*..*$.....**$ 4 0 951 952 953 5 941 945 950 954 .....**$....*.*$....*$...**$$$......**$.....*$ ....****$.......*$$$$$$.*$ ....*$....*$....*$.....*$......**$ ..*...**$*.**..**$..*$.*$ 4 956 957 958 959 4 124 0 0 0 $$*$$.*$**$ 4 962 0 0 0 5 960 961 963 0 6 955 964 0 0 7 938 965 0 0 8 840 934 0 966 9 718 967 0 0 10 475 968 0 0 4 0 0 291 854 5 0 0 970 0 ...**$...*$.*.*$.**$ 4 0 972 0 794 4 972 0 0 0 5 0 0 973 974 6 0 0 971 975 4 862 864 0 0 $$$.......*$......*$......*$......*$......*$ 4 0 0 0 978 5 977 0 0 979 ...**$...**$ $$*$.*$..*$..*$..*$..*$ $$$.**...**$$..*...*$...***$...***$ 4 0 981 982 983 5 0 0 984 0 ......*$......*$.......*$$$$$.......*$ 4 0 986 0 0 $.......*$.......*$$....*$...*$...*...*$.*.....*$ $*$**$.**.*$.*..*$.**.*$**$*$ 4 988 989 0 0 $$$$$..***$..***$.*...*$ $**...**$ $$$$$$$..*****$ 4 991 0 992 993 5 0 987 990 994 ..*$..*$.*$*$$$.*.....*$*......*$ $$$$$*.....*$.....***$**...***$ $...**$...**$$$......*$.....*.*$.......*$ 4 996 997 87 998 $**$**$$$$$*$ 4 0 0 1000 0 $$$$$.......*$......**$.....***$ .......*$......**$.....*.*$.....**$*$*$....**$....**$ ......**$.......*$ ....**$*$*$ 4 1002 1003 1004 1005 *$*$$$$$**$**$ 4 1007 0 0 0 5 999 1001 1006 1008 6 980 985 995 1009 7 976 0 1010 0 $$$..**$..**$ .*.***.*$..*...*$...***$....*$$$$...**$ 4 1012 1013 0 703 5 0 1014 0 0 6 1015 0 0 0 7 1016 0 0 0 8 1011 0 1017 0 9 1018 0 0 0 10 1019 0 0 0 11 969 1020 0 0 12 0 9 0 1021 golly-2.5-src/Patterns/HashLife/metacatacryst.mc0000644000175100001440000000216212156145314016664 00000000000000[M2] (golly 2.0) #C metacatacryst -- a 52-cell pattern exhibiting quadratic growth. #C Found by Nick Gotts, December 2000. $$$$$$$......*$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 9 0 0 6 0 10 0 0 7 0 11 0 0 0 8 12 0 0 0 9 13 0 0 0 10 14 0 0 0 11 15 0 0 12 0 16 0 0 13 0 ......*$....**$...*$...*$...*$...*$ 4 15 0 0 0 $$$$$......*$$......*$ 4 0 0 0 17 .......*$ 4 0 19 0 0 5 16 18 0 20 $$$.*$**$.*$$*$ 4 0 0 22 0 5 23 0 0 0 6 21 24 0 0 7 25 0 0 0 $$$$$**$.**$.*$ 4 27 0 0 0 5 0 0 0 28 $$$$..*$.*.*$...*$....*$ 4 30 0 0 0 5 0 0 31 0 6 29 0 32 0 7 0 33 0 0 8 26 0 0 34 9 35 0 0 0 10 36 0 0 0 11 0 37 0 0 12 0 38 0 0 13 0 39 0 0 $$$$$$$.*...*$ ..*.*$*..*$*$*$ 4 41 0 42 0 5 43 0 0 0 6 0 0 44 0 $$.......*$$$.....***$ 4 0 46 0 0 5 0 47 0 0 .*$*$$*$.*$ 4 49 0 0 0 5 50 0 0 0 6 48 51 0 0 7 45 0 52 0 8 53 0 0 0 9 0 0 54 0 10 55 0 0 0 11 56 0 0 0 12 0 0 57 0 13 0 0 58 0 14 0 40 59 0 15 60 0 0 0 $$..**$.**$..*$ 4 0 62 0 0 5 0 0 63 0 6 0 0 64 0 $$$$.......*$ $.*$*.*$*$ 4 66 67 0 0 5 0 0 0 68 6 69 0 0 0 7 0 65 0 70 8 0 0 71 0 9 0 72 0 0 10 0 0 73 0 11 74 0 0 0 12 0 75 0 0 13 76 0 0 0 14 0 77 0 0 15 0 78 0 0 16 61 79 0 0 17 0 14 0 80 golly-2.5-src/Patterns/HashLife/metapixel-galaxy.mc.gz0000644000175100001440000010435312156145314017717 00000000000000‹#õHmetapixel-galaxy.mc­ý[Ï4I’Þç¯H@ˆ 4ƒ~ˆÃ,ö‚Ôr Hh(ðBX5=5Ý…íîê­ª††ÿ^þ¾€Ãk²¶ÞÏ<ý½¦ÞÝ7×ñê=áÃúë`üíó²Æ7déΉ_d 0ΫþÛó}Iø³tä½>â÷1ÏWŸÞH<ŽÑXFï³NÜ|EJ¹Mø–){1ºêDJ4ö°§fkrj™?Cù¾˜8Íþ”F@¹ðÿŸƒF"ˆ¾Íþu²-e\Úƒa­é•¹EAøxìóÀ7è*;ßñ4âók¼Ï/¤•ÓÒ<}ã (Çÿÿ ‚ä0J%où¤Ÿ…ÿ»QÞŸŸç^ÜiK›Br˜ãkœšµ×æ8Èl”óXØ}Å_Œ%r@¤C\½-ïå2}5#.o³ý€è­ÞYI·#Ú×)ìF&Éåv\tœÂ c樕üÇËAéc8ÿÅ)šr4ù¤3ÿ‹ ïD¸ŒðêrÑd뇿/i7 «Ë×׬2ƒ¾!AøðK9;’‹ó`«9¶æZ»H–ß“/Õ:ÏüJ_/KÐÄc_@Ã&òhÔùí®¹ê7`ÜÍ“KýÚ¸ù €¤®.Ñ{Bq/³ •IAãË·7C¤Û5Öc\u|n€sÿÕ¹.ðxê<úIÀyЩ“寀,È›ˆ¦—OX€ß~йh"p•FÞ¸Ùá797Š~™;Hnü›ØTž±i=ô.åsî#tÿ:VPçIÃ:Ê_}2¾8&—²s,í˜r Lßþf^‚>0PÚ–Ý¥ˆØ8£m>© ‡•>¡DfÊ“qŠ?zc¿€WÝDÍ'.Ê-,|ÀxÔÁÃÜ¿RÎËød7"FkB5•ÛQÁ°¨ú5ÐÊèÃŒRÓ“_¾&U¨}ñÛxœ¢=ñš†ßj ÈÓašò´ÌáÇmMSA‡/cÄÎ~òË>˜Õ!þHI¯yAf¤òkîlë$=»HéT>+kÏa6ƒ¡ÜÝ‘=‚3ê½æAÑЮCü‰ÑÌ÷šÜæÏÕãhŸ˜ð6à4~.óÇê¯ñýónm}sW¨‘mƒ ñXìS»Þúû ¶ÇB'. zöý2Šªïß”ÊÕ(ý$0ÃêÜ]‚8Éɉ0êí$}ovbÇu_óÀ°aU¯þ\ÇQ4g‡ºàiÉŠ'ÌÔ_ñ¹Ñ$ŽBi„ŽOø±‚¸– SJ!û1Í㻳«øìrvª–æÎ )¢åN¾ç_} ¬£/™O¨˜ñüc„΢Ýéï¹Cß=˜ËvÌ|R—üwŒçòìKùØ-2íÙ&OtÎ^`õ/ )­ªÆy$-hãûtÈŒÒÓ‡ `›†³ÉúÙEÿÍxyEË«×ÉÇòXóȹV?2Jñ€…OÀ*™0º¹SˆÎ2Æž{t1€tˆ}cÄgã/¸¡ÍîA*kðúzxR²Ì@és™qƒ?5=0á½/&{Âï—±°å^êhw“çe‰¡¸ •-†—™ßx–²HžšÄÆP~”u»Ý,å9k»tŸô®£zh°·rëÁˆºkácG„õå¿´e³à^…º÷;ŒÔÕË2›™ö­yöéÙ¶7ZùKåÍdÜ/(6ò1A§ÔåÐè˜ÚäzèÖ¾Þº*Io¥â—çS²þç A÷t^œ5§¥ ©>çT‡g´…ì´™ƒÖé6Î7 ÕÉfc-oF’VLk݇ǫ<ö× èn -jãx\Eí‚ÅeV¨/].NË@bÖy\±uYçKQ¯Xfc=F:ï\®#uDÄjcÿ±Mï|î›w»]yøå>ù7øÄz <5»=;]y³©3” ŠyÅCó‹a´–ì½} àx-¦ÌmÒ&6_p#r>%ä²B1ª´Ð¦Å³o;ø“N±6¢IHǬÍk¨^‘^ìm&cÞ[©â×Ìa/{9uÍKPû#O[?FÝNËŽÐÈ€ÖzŠ´Äjl!ÓÔ8ùÀ=ªª†š?ld…’ÀdÝR6©æÍœÍZbeäù¦RtQŽKë@•ÖK,¡´{-]ŒüÚšlYaeÄ-b·®%Löê\ýª”ë{lC•ñé´š(”âŸWçfé@D¦õœÓL:ó…¹ÏÈÁÛõ/¾â'zß6~ÀêÍŸ¾ŒOßÈûV; /7q ¼jÒá‹Ñ¿ñÔ“6}°gÛ¯Çøàyt=6PuÇéPá6Î~(м•ª<ã<Îõý‡O_å@èN‘¸»š «N ±·NÑç;¯ûƒ¡YÍlìåvyôÐúСÞféË}¨ú0c›õZýí¤³™s¡/§³J!¨¯ðwéö|PÝ‘§nÐ}…G8bdùæ`Khù2Å'Œs{pÜ; 3t1Ž[¾nMÇUL_AxÚimZ {'ºX²t#u,Èç¾â—÷íª-–=!¥aµà´Ù¨¯ÐõfT2#9Çg¬axòqÝžéR.’ͭɯýŒ¢N>ÓØêÑ$~vX Òð‹¦÷(ö0ÔØæGëû¼oµ$¦n9†ö‡¶üï딤e\OT þë¦X½÷ÍÇÃç2CYݶÁM^Ï`¬ùÖãÝkü¼Áv¯~Ì5B/¶~pžK§ðèÜ lù½tÜÝß—ð,ôöàÜ—²˜­m„9ßžW­¦úàö×4à¢ò <óñó6ׯšÇIÍnäßš>8nù0¯§úEÛ³ü0Ý.á¦ø}lðo¡áƒŽdnnźvðâ»Jö‡X½ŒdîåSج Í'A°…‰^Ó‡µ‡ `ÔkoD»yFn?Ì^ÍZ5d³’ödÏ.£*œ¼PkæÙ—íŽñäûåÎwóðÑ¥éË„jðÍýŸ§BØÃ6û.Ħ©· UÀOh‡\ÆJ—ñóãKÔ6¯É×å‚K×ë»W­ *—®O‡AKfƒ½.e6Ò[ÞM­eºûÔlŠôÙ;3ˆÝ»ôI·?¹o¨ºZPhßl”ÏĪ>;lœ£h mã0ÏžFà}”–÷Ö}zOÁõað0LläM¾j½ÜEõyJ6†Bàþ¥Ú fïvêb.0Öb”½¨ñM£É—m;ØÜoÒöú„µŸåE™SKÄãË6ûß×äbDž²~‚Tê’o¹q@¯ÖÐ6]+F×Òd„îí{'.F­ÂÁY~°…¼å°êe†êìfÍÃÂUÐϽ°,ý¥ ZcAwŸ÷m÷¦l¹‘÷>ß@;M·ê¿Ä.»ÀyP¨"<.ü.aqÞšŒRK5soÔÅÖM„ßüÊ{û‡(™?v»tIô%,>‰ƒÍcÖÔ‡½ÒEÃÃÎùÒ°¯}YL³õ}`ûdSçÞÅvæš|^w¾^lV¿³¶7~²üô±Z&Û9¥ù§=‚—šHÎeaʆHK|¼ÒÕÔ4ÝŠ¼Ïn„§œU{Lh¨öž´$P¹sM4ŠÞü©ºÁ„v]¼ {¬cÐÉY~„¤w ië‰MÏOèèœÆfßR«*c{Ó´¾»æ76 ð¼>°ä¨OCƒa°¡['gûÑÕ«jÌÉÇñUl0MË?~ù¢á½‡`ÓJ>“0¨B‡å‡ÌÒ»è`3_Æ´„ˆ#‘ð}“žC»NϽй-PÔ¤"*oMn¤ÔÉõC«§^éM¾Róoiôe_x‚½Û•Ìçá¥êË‘;ßxô‹UIÝ­2ªÂ'X&ó²Õ9õb{v0e­v Z{ºu–™SY祲wj")ößEÅEQªE’ 勲Óó‘¨zÕ“RÇÚ‘…>ÖžײÜËG=:s{.;ÖOߪ|üÍ·Å8ÍuýEŽ{‹†ž¥¡¨»Ð^æ8Цoâ†Âh5ŒÅ7м#øS齨“ÇÒÓp‘K‡Ë§âûxwY;"ëCû'òžÔñâ´Ñ>øï%+›m¿K z­ë-0+´h˜Ç k÷‚)þè/2ƒš¸“õý ObE}ŠáèÑÌl>5E´n²>Ùk?š$ÅÖ{Ê–êÉE‡ô ¼Bn²Ð¡ŸO|I»á‡6³èuüÙøÙR›Ÿyö›þàü«g¿Ì=ƒZdsÿ²þ|¢ÝÈpÕ=ûo§¢ænöÉÓã¯@ÜwYó!*–ãïA–HoPTJ5 ÷é}uÕ=rc/×8ì}Ež 9ýJ;6X¼ãHN^Ñ!#)ò‹Ñá£ÃWôŸ5Ê2u„Ú«ÃTlªæÙ"È*7¦Ù:ÍÆ}BÙâËI¼¨ö¸'Ý Ì´éPÔK­X ÅVfRÄ#Ø2mäÅ7×~²ýÀU^äb×´Åí¡H¡ÂÈɤsï4šËé-XQ]tñƒ¨ªÏg—´“’©®×uc9ÅŸúœcáñåÖÇÍé©äÕÉ5ZQn }hh˜Y…µ| Ÿ£Í2<3öòÅ:â_sX®-hŠ3ÒX¦[Ÿ‹;I1Êá ]¬ÙÀšžœ4Ãì\iiØ-Žmü)È4jS1lM—ÈhεAŽ/¦èó3â=anͬÛÉ*aÎ]ÿ¾ŒÎ}ª£ñßm'G…KtJ½ØfÓùg鋺µ>Äg“®J‘zDe‘«EÁép¬ø3¶T¸!Õ…¯6²1;Ô—¸“Õ)cq’êÔfÀ]l„×܆.ÅïÌff™Œ¢6JžÉtÌâ¤Òåo‡ýâ…±têŠtî4g¶f/ésš"ªz—nžÎnÀù³K˜Q¨3=;E{bËú:µn™íNÞy¯Z"µM‹‰+R¡8Ë5jÝ‹LŽ€¾ÌvV´ ê `gI—4C·Ë}®Ë4ºÎ-¨GCÿЇ&cíГÒÑÏŠ3êÁ/“O£q6G˜Ï³y¥/“]#o~úâaÅqïÎûóîb(DçùŠZôŽ«Pø±´ JD£‹)õ›´2õæÎß.Y—@Â:`A#A= dd9õ"û ¹}A}r™½§^¤6_ ý ›íd'ô†aÖ.4z©·#ÚÔ ½j TëØ}}ÃÈê}´Ò\Ÿö>–CÝj;I.ò_0òÆŠ¥…HLøžNÖ™Ôè"ïN aà>Ê'ÁÞ‹Ù¤b, ò$ÚóÝ*qjK4Kh ËÑD ­n±l™¬Ëglj¼-{rIäÛhZ|j¯@«u`R´”ñeã0¿Åæ÷0’û73Ά †s‰¯ëÞj¤¥nÕYý4LÀç4wÑú²)ÏsÐVÞÝ«¯È-×W¢¥û_}‹Ù‡Aµ ,<`ýþe4•^7©+ºÌ.ì¼õÈn/3oïT=9½-iQ„Ê]}›=õÖÀÜzñ¶ÃÖml?)†'3^—¥ÃÏ?›jVŒ˜ýiý’ÅÍ }^R9Y™ýu jýd‹ *vŠT…’eT NbQר¡ë:ªO_zQ ó2#Æ…»›‡ºÌå·x¡áyýY!Ou½%•¾a1Jègm/Uôui2–wÿe©CÁléÙ%¦ÉOƒá œ†‚ì,´ µZ&,Lýë]½:±Lã*dªÃ´l5³?3wßIZèS"cyä«·f#ÑßÜ<¶ìÞr—HA¶Üúý•ÖCÓ%z57ù5?æôßðäí¡Q_*º"ÝN³1NW²÷€6ì\gÖæÒu…Vš8ŸU¥ø³ª»4ˆsXÏ+¥MÎ}fc[Þ>?Èzÿb=tãÁ€d_nlçTŠ8Ù‡äs‹}Déb ó.{ä¹ªî¡ Òcú\¶t;EÅ}Ó¼n èd?ź/*{\ÉíZáÔ96¸/3TG˜Ï‰T aÀŸz©sÁ£¼÷YÊœ ù¦¸{5ü]<ˆxásOoì$ôl…ÏЯ‰¥9MŸöÈ“R¥ZOþM²[þÒp2×p ‚½³ÕíðÁ³î•=ै×]_ÍwSË9Ÿ©³5«]$õ>;Ü -õ<ÿ·<¨Ïp}qžý·{6Nè(vQ°.ƒ.®¢… 5–y¨QHr(bgFÞ. ­p×±„e8bû@Þj`õÑ2ZæGyGõ\ýòº/Çž–®“"rz|à—ô®@Pô9Çš0BÄuëâ‹¥Ãi^B»øùؘ+Ö†ÓÔªð„+Ž ƒzå2ß'ï³Äuæ9€a$Ýa–}¶s¨^ÆG‰ˆ~¶îaËØMl¢ D~Í]_Ü©«ßÈgažÜ¼r‘â\c™ÍRê"Åb¹!f©6ÄW߯ý k´ØtŒ6ÝAœÃ5ßjäm¼ó¥êßYµ„ó/¯ƒ,Îs0kn…u¦áfµÏÊH/o<éª>Ô|“ÿGA0hGý;ÇïºÁg u“Z]>Hº:Œ:E*{Ç7Ù%¢ÀÄÌbÐt´·s>˜¼äVÿÄŠåöد6ˆµWûxÙ•¸£ ¶ºÅëî$b= *[±±±«\}è†ËÀˆ‹ý[fC~xÎã®Ñšô©1ÛÉ;Ô… ÞHµ7ª.V›¸bÿæuæ‚¶ ªéwëñ!¹ˆóâeö4ö)à´?ðõ·¯ÊyãR';›Pó6Ñ´vOÞˆ§Ë%y,ì¾ID×_V:¥j½L6­pA~8\œLú™P•5+ø½¥yâóFŽl> ¼n;Š¥{•`¯>ëÐràÍìžÆM&-œC‡Oê7P`ÙÂâRM%¸a9L%€t“³~yÁØe0ý]bJóÉÔpä”@?ƒ$»q€7èUO®«f×Ó4èržœ}97›=6”U-Œ³K![ð€YDÇz§ˆ%45…ùÚY31ЂÈëâ}ŽÔçí{§¾ÐÑ:›–>ÙßÐ:4Äj@ï2–¾8j´Þ¢³†p‚÷ù+íb}„ãjšºRZæùCmxbšzó×cßxgù€‰o=¼üÖ‡§ÅÄð@¾•TN¬K ëèË /¸œ» еQ¾.]TEÌ´˾˜žæ{¯·VwR‰œñÄòä½D;˜mþEÿEüzkÌ 5Ï–7 ‰å±è&ÌgGXÀñ´2ÍŸéâD¨ qˆÏuá¹OT3Åi‚ºÿ¦Ý1}#…0ûØx‰4eOx}ž‹’üò¨ë²~xn(k\˜€Vj™o£ 3êú®¸5Ÿ| y+:$úÎK¯ï¤é«ŠÆÄ®ñAcƒÔÜë^c/¡îéSN =š2ôz7,{q/I[§’#½ÔÙÆdý5ko_?¶ÇæÛõ)ÏϹ8>Ui—aôm&Ûò+¼Ë{qä’X¯ÒÁ¿˜b½ñÛÝéÑò,ËóË8ó¯ªCÅVÇˊN¶þÑœBa%ã>‰ãÞà–/˽c“ Ýl— J|dÑ­ž8ó;ù ˘|¡R»ž (þͪFùƒ]=8;Gy“Û2ÁaeXg‚9˜Gå‡ ¨.J­€Ç ASÀäX=îŸ+sE˜[³"c¨žnû0N<¾ö¡rº¯Ú F¿UÓHŒCågQ0T-]Ýž `üÌìVù/¤ÈP„a,™u7˜üÊSŽA(¬*Š]#N%¡0Jƒ±èárdoöiåiÑøæ.Ç•‡Ì>š/>¬xQÌñÈVí#þîÜ¿øá }ûã¾u9ÇΧy€«ï äæ{ ³9g‹‘¹7èæ¯_ÌÀ›ÇçÊ.‚ƒÂ¼ ‹¹?õt%ï®Í—Í<úÛ­BõS'y«¡Qœuÿô­ÇÞÊÅØrzLHÚu÷è^·¸ …£½â¯(;î-w ,ÌÚ7«M§X°µ£vžocÝ¿D*¿!Úq¶h®H¥Ø*Bb¸r~4º}Xå'ýŠP1@>ü34 Ü7ÈúgØ9<ò ÆVƒ¼Ö.†>àó>Ñ^³t®ú\ûëõNN÷¡Å­ÚNzLS<óq—s­: M–¯E8-¼·ŽU\F€ýƾh?ŠÑ¸ày¹ ˆåÙ¶€ña´QáOÂÿÖÖ‘tûò¹õ4ß21Byÿ2°’wÿø7ÏåóÓ*e,ÿãöÈçþ%ëM<†9Oîô/Q\)MÎCC³-¬pÐ2 ˆê[ýÄ9ó½­Hœ°p¯"¢5>áÛ”–.›Ÿ­%†: èÈ]_=æÿ-OÝÅÖLŸ¾ ”\­È3Zü§Gý6mãå£ò%8KÎ៕-ʦ¡m×ïœâÇ_¾ÙtÈ£é b£Œ)÷KøŽ­§Á(Åî›ÄºÅ®Ÿ8††ºO¤ò©ÍdG2ç[ÕîOÞyÊ„…~R"]c;vìé‹F&R>WÝ‹?sÐw¤´Ð<ðô4(— *"ûmU.ŒÅËG¤ô΂7UÙØ°ëør÷æ%|y>9Ž|}Z•rùlo‘ºm$KéS[qV_tŽ€™ŸOÉô:CD¡ð饓ˈ=™¶?ó‡Jï÷· 7|4³ŒE½éýᇄ˜?ö÷x.к°åÒ}ëg³Q¦è¦éç }ë‰{ão*ûOïÃó£Î¸W…î¿h0}XDdø«ü‚¿oB½[Ìl¾XIìq°>7‘e÷}¦ÁÃñ@>koªV?7ZüúVô¶¯¹÷ä7!l4B9nݽ¼ïÙà¡ó¨Î£Ôa­Ÿw¤ñö¡¦WÅyÜVyûÁùÏ/A: ï¦vç­]—ç\ç2Pêv\F?ì®ö?áõ¦]DX-¿½é­ÍCœ ÖñÇæwò±Ù4¶¾AË‘ùõc_wºˆ2ÿTÿYìÄÇæ¹§´/ýKÐnžZÆ¢/ÀûùÙo ×ÍïÒ]}5_Ým–ŸFx’Î7æ1ßš·µ—ô¾Ëní:ù¡õÅǬr¶ä„PÙ/õ윶ÌÓ–¥ý ‡•5vAãOOá6Ê7x¶œ¨î•öäø9j‹/'ýõÃË2|ùôð2àÿŽŽþ1aHâc#q1D8~Õî ùDæ/>¿¹Ìa‘h7=—þ¹Ã/æyeãÂ~µùojýh_´þjq_5ÿ&w><û±“{ÕS–Œcö6ú7@çãŸWãýX\a‰ZÝ'¦¦µÚ[–Nôho_ï~]|õÄ•·Ò¯Ÿû&áüúSÿ-ý Ÿzïet‰øµ~Aßã7¼ÙSãìôÚ°åF ÷¼|/^¾(î  #$öhtþÍåy|à×¾ü¶æ÷yÜ ÷N¥÷þ²¢_ü©UÐd&ö9b™U¹m–ÛÞ˜LdKWî\”« iÖgl5K·7&‹Îz…|úôb5‹w*ˆžÌî{bPÛ¼ìøåƒYƲ Ì6I)”)-:³þ«WzE/[†–ñÉ+^ᬧ‡©_vxñœ2㉗ڵSp&¢óó ]ƒÇ¤µ+ÁšÍCg8c‡îd$Ùs/ïÒ¹‹µgv(Îíe+iž/7ÔõþÅå®bÔ]y‰Žw‰¸¨Béqùyî7×.´ÃÍʼåâ³,¢!Ô6-¦"MSú¯%¥Ÿ[ÄÖÐ)ßH`ðˆ¼‘÷¶8™9$’ËèÁ©éùåå|£õKÁîØÕS£-Ë—Ø­ëÎ †EƬÌ5pô (½©kÙž|Ë SÓPܧÈ*lÄÜ›.óø³#?45îpǪqÕqÙ;çàû|ŸkǨM)ȃNñ13Þ‘ª-;{†ØêÒÂÔéÎ,»JVãÜ4»%Þk<Àã·ÏÞ¨ÿç{ÎÑ#iŒ´Ý[.™ÛEnX«6zÉŽàýË+L¡“Ç€“%Âßiå5Ì}Ž®´SϽºsã‰Ó©".ÇÉá1±Hv¢ Sˆº±jz§ÿðê"'wW‹# Ü7 nT±¨_b»iº­!¢µãùÃRnöþ+“Û‹ËoGbW#&|æðÔ2»< sò¡(7EÄJC_zÿô/Ïg¦.÷MLè$îmo$:Zíేzòól-mÑ/š—>Ð@hq'<°ý­ñ­mÀâò¡õ=Êíß¡e—~Ë@åxehöº `Ö¡ýˆ’ØpWÜÚóC›Å¤Š)ÎN—aÈûCKßí»±ýôql?ÿÞö&¿lhë{TSRÝ›uù—o7ôÏ/š}h2góVq½ÁM†¿Ï ÜÁó¹·šúÙê_âBûc¾ÄÚ)Xo¯ÐãèM|s’¯[£ôr#©'LnŸßìÿ¡ÎB[©”þxHWíߟ Gš›Jb„ðW ™ç鱦_{f”1ÖK Ìòæ¡ëiz<æ+ÛénßXôxæV¯`ù¢¢•š¥?ÏŠƒ=5Ìÿ¥§‘º˜Ì¬ä„{p¶´‰ñí*Uµ§èïõãa/Sâ‡èagŸÿçê^lá•)¶å¿Ù=·Ì_ýUV¾¼n©ŒĈKbmÞƒ¡Ëâó"„cÙ2–Ý­ûHz½’å­ú‡Õ,qêz½4Øõý¢ðïþ{D´·_–¹¾K}]§W/³³ààJ¸¥&Ì£|1º„g·?g÷1€) -LÓÑ;[ðK9÷å±)‡¾Ö ^Ÿ/Ú—¡+c_Ò2ûÔ—y ,µôŸóì  þ¸Ëö¡Òª¬bnªâüh½õ¤c„mŸ“>héPÔV!ãoããmår¿håÒŒ¼ƒœ>¦®fokÜ<{ìtùXÇ2zÄ:·ŸJ¹KËâ.IoÕ™Õ&:Ôwˆä¯M¢@ðÂ)Ê\¥òNÔNƒ“Ï}¶…ö:§Ú×Ú¹yµ÷ÚÁpÊ™} ÖbŠ€t¡×¸wîgÕHÓ“øcî](øe-ñÏËà KœFœeœ®Ì¦q%7áP6à¬Ë¥0œO5¶°jEKXl¤èŽ…9~»WÞ¾yµQ‰“L„VIpã—ð€c94ï sG>*GkI?Òþ×u·òèè[:Æ®¼¡ùW*û'—pä €Þe€Õ½±-¸kü>úÐÔT‚#Û™°·Xn‹T"~´3¹u›X‡›ƒ£?`h N¡·üîÃÎ÷ú>Q+Ìà #Ai>W66úÔf‰ ¦Ö›Œmzã@ÆË] ÍÃB­në ÍC=CQãR̓@×9¬/ö5¶ ßBE@ð‡6ÎeÝJˆ´î¯ßþȨ×ÎãB~c³{«ð©6]o²Ì&£\9ê¿¡ÅÒ[ ŠTÿjoÑž×ýÑo°Á"ú@.OÞùb&K'ã±ñüyˆÙ:íé› |“rîñ…9øPÏG–‘]vý8µyèf˜Ù­¼û *¸BJ/›àý¯Eõï@ù¶Dûvûߨð¶®o7ÿB¢††ŸÚù·o´ÿmÓøÐê_Ðù¯Ìy”\±~ª~ ÜÛšòýÖ}€o¬b¨îE±áÇoC‹ËL=£Àó£VÙHú É‹Ê:“y‘2µ¥Î4ì/º‰ãvÜb­ã t±îóßdm•¯=i*.ÚéeË:^LÔ/J[.sȪ’2oÖ·¢ªíý÷àa'^óº'WÑIž}Eúrƒi,zRŽu½ÂGêWîJz‰kvC颠˜Z,–ajÍ!: Tš  #ƒ.\\ Fòé=„\3|{Ý€Õ¡‹¡ô8¹ Ï{‘¥h„Úé ©ZìIµdæPw L_”[…Îdxœ'ŸC§\F^hÚÂzë0³Y ì8<¹o˜J§c'ƒNÓ&f.¯a ”¸&‹xuèx½ãr,7Y±Øê´ÚÈͰŒÚ‚ƒ|ê¾,ó²|n¸X"W ƱqYÀá2÷…»•ñ¥ê ½Ù\–( ŒèÈš5R5¨q#Å*”§(ëîuF±¦ƒ8Fg¦% Öe“SÕmÂ.' ¨}®F2û{áÐC ¬e4Fb\^."æiø7ý2ÇôÉÏ·A<Ý zÿ‘å>|ü†–qY&O;¦ï]DÚqAë òhj_ 8s$áXçásœ” —%Jš¹×ö¦×nil³ø„ÅÓÀÙßV¤_­mT&]î Xx4\žfô­º7 qÿÏ˽ º|Ë@ya¼ÿ}f²­>ȘüÌ‚ø¢H®È„ßjúèüí–yúX?2êØQ÷ÕfèëÃêï(p/Ÿ:V냜‘ïÈZú RðC#ÓÑ7çý‰ìüˇv.K¢›?õè :ñ}«ÙÕçù_?“ã]…~ ”¯ÿ7¶^¾Ù8Õ#ò*µÝ¬j2KòV¼˜(P¹|«ñ¡¼ÂFŸý3 în&~ÔfØŸyhÿÉ-¤Ùœ´èÙ~·iÅ^¸Ø(n3÷]kÞ­#_¦Qζóu?¾áE#ù~QÑG_ÖçÊ"Ï=JÕe`”ß5ùk}¢¬HÁÝÿx•õçqKð¢æNn^b3ƒµÓ nq4*Å‘Jœ¥½NfÑ¿iEИq‰]Ñ^N¼ÍcÛ=”×ù†ˆáKh4nð©O=-¬ÿ}Vº4cïwï«W˜•4÷Õó2b¿)Âiw‡¸âΙãQ¼ÜŠmf³ÚúÍê§aãPË`ãò€6›_'0SN¡…¶p¬ H\¸[b¢÷ê.p¢¸°ÚÏþf]7F¶]h27)¯Ü+—dá2ã®ÇoÝ[³ò©v˜¢Wª<.h[õøÇÜ ¦O±ëñ¥ ­¦\ŒÇ¥3ß³¸Œ‰nÂ|oÑpÛ“y´rʉ_¾hÕÝq97sÄIv¹7ÓV÷/ó8ÿ/Û-›õÏð%4ësŽb|y1¶³/Ó³6Lîã”­žXþªÍ·}$£/[ýJ_ËK[`¾‚Olöå¤*Í+ÆùMæ.BÈA·zUÐ7!ú= -uRó0©P?9Ûľ\èz‘7ß‹¦9¶2mÑ‹Z2ÎȱÞJiì(7B xµ}+âšç0ŸÔ8Ëà%ù¾aõþ'–ʸó˜lçµvlfÊl GáX¤éE1h½ ϾBÙÝx§¦]eèü¬±øF,7Ìtß*;åÍC]Ô•J{Y@„)®PwonKìÜ:"/¬ä!¶>-ôÛµê®åüK¬_ ¾ªu´=§‡u­ñeëêsƒË»WÙ}/úé9£NcãRÆ [˜BH]f>=»v±ì_¼ÂúXÆrÙ­d™?43ǰŠ ÛuY´iòãH…±(R@”Æ·†Y7ÐP,›°=¨ÌJ>4–¸çöt±cá ÅÁÏ“a‚üúhàM0/ƒEÞ£ìÙÛýÙ%(î[¹;•÷âe°¡rñ)kn2f,Ræcñ³â«~¾h¿Ù-Æ0 ä¿—­jø}+¸ÿT¬ó§‚S‹>õÅóí·N~âÇüø=ßOCçV­ƒÏfZyýmð{5íÞðS‚Ÿ·mñº/å6Ûù¾tñnæá§ÿ˜o ¾O]lëágìkú€bÎþ³Ÿ³ß„I[aÐ{@â{öý·>ÌSüÇ•¼6–4¶¾L½Ø\Í›CÁ<õñß:à<üFí¼ PäùÃÐ9þÏ:8ÉšÏ^w?"â/þ°'çþÛ‘òšJòd\²üöîô§÷#p29hsÙ½%L–í4¡.±‘þ¶þâOüèËyù†Œ?8Ë‚Œ@ #Fñ¯É:ùÝimî}6/á,ÿ­ð SÿãÌŒ‡ãO£¹@³ÿŠ-u¢V;™Ô&VŒBF`ïrêvƒôXµ Yù­äfë ÷Ÿ¦}¬@÷mÂϾ‰è´ l0£¾×MŸ©Cn`ˆíŒõº7Ë.Q÷Ҫ헵ÿ 5q%³í¿úÏàëSêo_™L¾Hc2ùa16ÿíb±ÿö'4âÏð£8¦âÏáWÿ1àL·¦yˆKN÷º‡95šÙËXðɺþú·ø"ñ÷ãgð^FãUy*üìßÇš¡ÓÞl¾u!Áþ± Nwž4æì)V<Ü£i¼ i¨š—ÁLžbk€3dêï¡v¬³9t;›/§c˜)å]Ò/7ß"˜ÄÁ46kvRN},Ñ(*¾^7 ]„ÍâQe$ô|pœ˜k¨Ùžp‡N †ÙÍžþìøarR)Ä»TkLþvÙ‚sT_ ÃèHw>Üêb}•wzoø×¾­ü_iß²|ײÿíüv¶o——më»¶¯[žiåè²àa-l¿3¿m½å¥ßêðôVBG§æØ{ê_9üæl{èkËýk #¤0ØñN˜k ¶³—Ë·qj­|ç×d¥©Äñ®þõì_¡‡”m{ŸPõ¯2…´ÝÆMX2è… ¼íÛuŸ |Eçmrè*³{obCuØhÒ1â!ñëq`·ê-ŽŠEmÛúîc’d©Ce×D Tû@[¾Í`+ýëemmY[ÛF‚ k°GJè‹Hç;#$YºQf1šPí³W  É÷ßdÎl+E æð5B6Þ©“a>Êþ.}ôrma%mnO_ï üäôο8Vvjb%x‘4¢ùNˬ;þßÿþ8ÚƒøCRÈï €ÙþðN¼ÖÖjkóA³ÚØ™l gùz_Y…TQ¾Àmꆨÿ7ùTeRà2ü©G×õ. Ë[#¨¢0Û’1gg¸zõñÀO¶¨VT΃R¬8B¦^:¹’\¼¥wÍ ÁÒ%!yʳiÍd!Þr tª ½³uvž:FQA&´÷öÿ—½“ÄVa0pÖx Ç´g1B¡QD•ýjØh?Îó}öŠ#H´bKKk¤µ´“8W[Äç%°–9ÕÝ[·÷6§.üëiøÜû,¶õ`ÈœŒ³Ê $7h]΀gÄUë¥G%ù ¶lÖHLUmħ(Êzu_Λ®¥‘ÖZ|eú³Íûj?ª|ve™¢PقȸºººlÚƒÊÄÈ×å£Fu´ ¼n£\LVìôßœA<¯]8]ûØ%yg5ÅÒ¥¤šB?”é—(ë¸uôx¦[²NAÁµŸ X¡£u¥Ò¯JbÛ±Ú³ÄÉN{ïëX)@¼R›VJ]âaj$°&аmn¤¸¥SÞêå"75újìÞ„.g¶¥  J{º6ᵑô.ÒøÞêÛävÌ™Lyœ¹‘%H)Èö6µë½¯lO2 lR´5ÞÛ  &mV…ºµQú~ 54 Ô›0«©s2²¬[“4>ã­6]×dǶî¢Qk#ÕÚð½µß'-šm'Aí Àì 5Ù ©-–k ú¼õ3â1 k›x©N®k“X{“üí˱}­älòNÆ<Þ'>0‰Úžm‚RE÷v‘Æ tUSXœíµŸMôœZ!}@B¶ç6V8ŽhAm'Éð XãJëQ÷=.g§Ú¢Ùqì¹ýÃêDy¶qä %ÎÅ2DnNPxÄ´çÕXªIðØç›ä, I0Ž–CµAÞnMàÏÎÛéÚ Q.µ¤Kdðm?¼Û °¸µ¹@ø¹n¡Ÿ²s!€HmÖH§!!5j$YíÍJ¹Ü€L ©I¤ÔÖ[­ëŒ‘ªjŸ­S)™š¢²ßI¯NÙí¢L[!½¡ .¢¸M¢=XÉ«X.KÉ@?ñ>Úû+Ø Ú( Å©qDnê5 Ï4s¡A?aMJÃ[qy¿—«@©ñ‡Qs-ª%·óÀÀTNÚ!æÑð\Bùëæ89Öq\ÓPdñ¶tPVƇ“Á6gõf’m7aTE3ÓÌ®SD ñB¢û%v P‚öÂtÛqì„ˉ¦¥vÝŠš„Ål³Sçg.œ Ë•^|ä\³Z)Ðü,¹C­‰°M4cÃÒfH@•*¢ï6²:„J2UDÅtr£Ë|­n¥ÒdÝš¦Ö_BªÑ–*4.’òjˆÝhRž$¶„/2¢íH­+íã|µ¿Á”GÓZÇ KŠŠ½IR „P"ÖÁ§ž]¸m]«ñ Â»¾Ùˆˆ;2 ½«MSÕlûûhàlôn·®FÞÁ÷ÒâÄÊ®3ê ­à›2Ú‘ÃÌÎ=šg;Ùò9”ÑñÓÆ ŠVª÷&™²Š¯Fµm.rµŠ0‡5U`Ó4Âl2LYšlnŠŽÚìi}càÃHà‰TQ*$º&FJ¶/‘+ àG?µBj#“›©Qhdm E°ZC%©ø /C™Â8t ¶£ÑU¦Ñ¼ŠVkèh¸7ßà$´U¥ ‰‡„¹Î F1yuÓ‘UÕÑžA^भ¨xÈ›P…y# Ö¦ÃK·4 4õ‹s€)Ùqªì¸š–oÚ‹²–KJ1œ‚¦M‹²©ÈêRÔnhr¤·”ºEÐ@ ñênïô¾Ž<œù)w‰ho ÛP››Í_)8šûwq3‡´¦È l4}«Ô¸Ò\Rã©M¤é?âã²Eä&b²²ÿnV|âD»%I!ÐÆ‡¶UÛ,CY¿}jïÆ#gãÎfi@CQùT ô¦Ik¹B†\îÒ Zgž&Ö=p­c e3/­ÖKÖ¡ú©!<´‰mÚ$cÆŸF]WÁ¹ƒšÏà ‚óÄOîÚÖÄd‹óì¾ÃR3X¥|ñÇA£é‚MÑЩæ,b^ÍRÓØôx;‹NiðnãA*$uÀ{~§ÏªìÞÔr“¢À7-(X¬ìò³‘"Z mŠ¢"«Ðü®4ÈôØ›S¡&â~ÝQT©‘dX|©šŠÚEîac¬\œªCÿ\Íý;ºs& @ÌÔc…Ÿ Ë äº“ñA30àÞ: ÛçÃ#C{uÛ]õÒžhÌŠÃóLŒS%ÃÔ Evi#ÿm2E>\¬±Z9…Öá•DËÆa˜ÚòŒ»®µ‹*UMµ–Ã"‡MíØ\jÇC†ª<Ý6át¬¾æýðøbˆƒtMßDi#wþ›ÙÚpM”SßÒ¢n2'QÏÕ:¸›XwÀ}s3àþ­ ó•`‚]^Ýh#•LÉY±¿¤ Ø^”6øäó‡ª] ­Ç½Y`¥É+Ñ)ëä©êªùr6Ê›.î[#d;:Po]E`76ƒ¹Aõ¨ýº±«ï¦ÒùHŒ?ýâXû‡ÀB¯­®]0¥ÕØaî"6k¹y}…o“ƒ‘¦˜M[Mæ`m ÷xæFkîH5;¶7,Xóp8.W{%°zÃÅÕ´cs¢UÁ÷O²ÓѽxÎݹŽáÃÀÕC²ÛF®Lk¹‰(#n£äÑÍ DJ0qúÊ&œX_ÙÆ’Ü&BÀ-–­Š° ®è²´nJr”Oï$Ÿ¬'y!5_I£‘$‡ýÚ:=ÔÔ¬îœ|mð‰éýAÙ‰"IYw¢b[E¾÷d:[½øŒ,nr4æ‡gh;u/!mæ<£iʈç–. Õ—ÍqQW‹Õs  Ýh&͇&j¸kÄ%Q™ÑäÚ;ª+ÿ5Ü^„@jýŸôqcúíT:¡B{¡ÑèÎðdÒº£1͇ìô)µÅiˆ îVC7•Ü [DÙ» CvÀ¤MI(5#½Añ5T3BÁ n³ÕST˜R¢eLŠiÀ9W˜éQL•S¼«.øŠ°0¦n™GLV‘ÃT·úFnÐõ!ÄÑ€‘¨Ä/ˆ«ÓÕÎVÈlÕ~'†«šMŠç·¥Nýåx:Ô8œÞ®!J½åôA¢#$ºÆ±4)ÛY7h†F¼cÙªÊ>Õ“ÏjèBl?9î²J[åöØuÒWì¯M ËZŒ°A72w{šZYoRK· ÔDª”`B„ôœ4ƒç•±E`‘à"VMeu­’• Ú<àà`jOm%„èY #í ¿®a'ŠY&›dimÆf>h¨òŒàkÁþÚ‰h†â‘µÕèTÔFôÅm.ÒJgÎi_1r…±J³†«zˆ{őϺ)í"ø ŽHAW' J]àÐ|‰âA±ïÈWíŽ(PÐÅh]oýn²yTÅ£&ieyº¹\o„  M0£aªa,Æ¢Ì|k2¯¨e}2j‚°eyÙhuO—ËË 2ájº«M 6IªþÅî7 dÆØ‡8ac<¿ž¾-Õ&™°ØÆÍ`ÊL æö£ÖMC»Ôý6÷7ì#Á`i|/ ‹ •aöÓˆÃ7z}Ŝ֡dW¸Aƒ–DöÙÐsA£¯ÃYcïö^@ï´õ-‘µ»âé$YÁÍaT]öâÔ †%»a]7KŒYè” 'ÕðiBœLri”eKHr‡Ø²±ü6‚…þ6šCm é°:7ä.XÅØ A¶N û 4†eÓÔ’¨gwUÑÉw4½ dèU8†mº$¶ó¦oÈÇä«¡XF˜OÑÔôïó ÕÎhr©k M›*äco¡€›g!Z£­O"ÐI}¨sbbÛ‚E·r# ƶÍ,cû£©`EÝËLR·%æÏ OGéZA•PH²ÉİsdûTÐVãÊHÚ“!.%LH)4·!¸«S%”³—·TIs®¸œŠÐVÙEÑýÉŠZËÝA%`A¡7t°I ¿­‚€È´x¶ª–ËÙ>O÷éNì®'6w¸ ኃáM‚°G¥ÓeC-\6!%’(÷ípaL»›Þ`¹c_1ÓŒ¨} xØÜÂÆdvAw…WÆ.ªîé\!`£@^G ÕCö,ƒû}póI"†³ ‘»[@1£pÇŽH›÷“D62žtiðc+[Ø•Iþå1t{™8oJ„bcÏŸVÉûòS›C7T3“¾H \«‰Ú‚ÐÎÆÓ\s›D”n›»&U¥.÷7Ž1¿G·J„åd[ÍœÃ#Gc¹]Î j æÖÜmØæj'ÑÇMÕ¶I M‹&á¿æ‰+Ì §œNÜf«xœŒt¹ë±„†8ÿÜÐS=±r½<†Ð©Ð[-¤Fn ˆ‘WÖcL BW¦Ä›ò57B?Y B@‡qÿ†ÍÃFègÑÄ7FŸÏ FðBWô¤e|6J£@Çþ›yYM"—$:¨& q_Å}Jàóž·¥Ù á!Ðq¾n]¥Eƒ"f×`y11P·6쎵Õ4_b‡¹M!|H,u=-i‰YJ·ËÖÖ"v¶Xùܮ̋œüà ¾jÀ¥Û¿m%½Æv±«åú.ÇÔ¹•!ÌÓ Çº!ªkm™Ð级Y•à.‘K»lk7êl(†y˜•Žž.,¸p;¦ îø–-ÿ«]›•‡Íþ„…`(ìȳ÷eµí—+3jÝ̇ÒQje¹©ñ4œÃ•RN¦pµAÌE­%ûÛ.H•¢kMÂÀÞºØ¸× àOMºÓ‰‹íTˆæuÆ©r·p§5Ä“®Ë%ï~Å”ì~%ÙFCJÄîé_)l95Ú ~<9T4 ÒÌn±“Š{Á´$_îŒ4º£ó¹!Óá8ȯ ÕW+h‡0,*a!d@mpØÂ¥ÄѨRóšš d‰Wû¦+UŸüÁŽnþ¼Ü®isæ~wJf&éà²ôò¦~™ÎåIbUrÀ³0P‡|)˜ÀÇf®Ëé<‡½KI뤂†–TÀãpÁF¹ ¹¼ÉVžøèÍŽl€}"F¼Ü{IÉ"ù´[NFÁÅ`À®é†(XûÝÌàneóTu«ãô„âyfÛJKô’ÍxX•Ô6QC”œ$Bíž×Þ<]|¢4°w°n’A+Ûl+ä&B`+…‘pHñ½vM´pz#ŸW$1Ýg£ú±ê—¥Fíg¯¤7ئùà iVÜ£}yJ”oœNÖLíÝ "T»Ä—lØ­¬mB×å»j¢’]Ðx·4a=*{¢M®èŒ×Â.÷Ÿ2ä±V±Rl»-6D Z§øC-BõŸ„`Å ;÷.:a¤!qBw_î'V‰«5ʇ¡©iï²³CÒ‰¿~1«9”æÒ5nlŸÏhÏî {A™¥KÂ͈“qÕ”›'c›†’Ž"|&þÖvp6<¸A.sŸðH=žÐ~€ŠÅX¹ÃØk?LqN }»¥\mt”®öÔYBöÍÆð‡æÍ©G¡Ö%ò|hˆÄè‘ú[E¦·!ªï˜ÙƸÑ!iDД$Ûàaa64‘± üZß7¹Äî^×0F¢­Ô´â’žCªŽB«+\T%¡2ÆS´oªèuvÕÄ È—jN”ˆ“Ú–sïDD™n@Öã©+II=ž‡cNS'Ø·bÌát vp§ø)ç›»”šcŽQqæó¸Ù‚Ê&^*L>¢HܵC¶ÖôØv㙈y6yrîº,Ò^™ÊEk¨RÁ/ðK!>$hä+ñ„#Àjƒ=°A:ˆZkœÇèã.°½˜×ä쌙Ý=¬~Z¦ÙXmvP#Hiø3÷ÝØHñEñêœï»Ø4a`ÕÎv»çh2‰u;õ¤…ä¯Q¼í–ó»…ˆscî€a¦–B|¸fÊQiõ–%dx¸·iª,œ•Î5pF+çª[¶}Ìâ‰ß4kv(6hò¨ÌBÍ^r2ž«tu§¥6…#Qy q…~¸ìCSvUR“Mk¼Äªï9›=ãž´S4%fÇÊ hQ›?Ç®ÁGzÜ0Ü“%¡Á;Ãfóû®ÝF…¹óžâ|«ö¦ï~ªP®WŠþÊÆS -,¿¥SܱÇM Æ&Ür8 š45B8;ŸäX‘dÏï«Ùþð’#IÂáû2-+¤:R»(^VY}å^&ØŒ=^+éì(]¢5!Ybíc ÃH5iZUt6ö¡˜¡›tÝp~(­{;ÁÍhÐT"Dí±s]™>p‘}ŽÍZ@ŸXÃF—nKávžª´—î|®8%J@æGü­2ƒÙRdpš‡F9Î-4…ÀÙÍŽÓ)ª …Ý“Žu¥Î?6šK÷®Ý„Ǫi²+²;’ýÔå#ÑÔ&v(ï8+t`g™˜HÐÉä ¹Â-—&„êî´íaîäp pCUB`œ U‰¤Å‡ón{kºî'·‰:¹îŠÈ6wq%Á Ä…<—5èh„O*'ˆe8¶Š\«§ë8<âU ž˜¿I³­ìÌP¯¾-¨›)x\ó‘,0ȇ.¢üyé¶D¦\-°sèÎì!u¨ÑÍIöC^êø‘O²¢î{!Ëîpa›¥ÃŒ ª ¦ÚzOoe€ç0Æ—põvú~· Sugdí‘Xì lÈYF§ßä‹ìMÄÈ6T¹ ,*Ùjæ^M•ºJ@mž¦Òiª[–©Ÿ'Mçµ§¢_¥~#6Æúv&ØHMÚ4*°ÃØx¬Câ*dHGM49 e 9Ñâû* CÁ¥–@Ÿþ8q&ƒ*T3L0Y‡3”꬈¾X™lìê<@‰š^Ù웋B,3Ú7䢋Û,œ¥r@ n`;ì¬vÞ€QPÄ—WROðʈJA£íEXœFŰëaÌ¿<5bP•ŒSXÎ…j#™ V}@Z¬7+ÍÆ [Ó—Çà2ÌžÊ=å݈òq˜õd8á ÞívpSÎ’!·ë ƒšïGƒ·Ml*öîŸ ÁÞÂUôHoØó;.™Ä>ô(›¥Š;¨-±õ”ú–l3òœ•4 ÔÎL$t¨¥Ž b9ëc9v·£…¸ü$K†ø²~3!`_Ó½÷§/"=°Ôñ K¯¸6¾ïuñ ã’›px!‹½Ñq̈Zßn©oHðj ?žŸ‘Q‘ªÛ4ϥșÀ]hW·uëègm—no'SLa@«p ýêø8aZ¼‘ËdÖ%\i¯z)¼;y™¹ ½‹x¦nì+A•1$ít9µ… 9f#QH=‰dEîþ ã,ø•c6\Ъ§8vÿo‡;PBç&9K {ðƒ4w4©,É, ç`-x~ÆDbM’|º@<¤!ŬʞÆLW¼`eØ_¾_—Æ[DtËFCIz¦æŽxó0jÌé–ƒIYް0bW†pyÙnسÂRêJÎ(žQ„µX̦ʉڣoomØ$»x2 n‚:öÅ™5O‡gÄû‘5œÊ.·Û+#îMFàô9Éé¼LÞy©·³áH¬<¾k,ç$/PÈÈÞ*É)CšXs–àVj"Ý4¿bæ‚ gÊÒFË'cgï~ø¼LñfÒA«n¥½¿U‹ ®©çÙ! ±œ—ª¬”Ê­q=ø¶úáŽíbbôn°aÀWÑŠ¸cã¯CÃÜ#ï05[Îv¬PÈ<`º2sW ƤŠ,{ÞŒL¿µï³{¿óÀvÍÕ¾º28˜{ʬ,X‰×ª ûàMÆß&ýQe<¶ ¹¾¬ æS<&›WWkF€Z ¬Ã³e©,’*|{öºxš N¸HYDß5DPOî²…#¹µr¢àê' 6Ò 'À¯Â-XCB»[¢aL…|Ù ÝëS¤BBb^ý¼+·'/_ú¹eM¤Àžõ1¦'rÿ6É .'8|ëG÷°ì qÎÄ:X>šÑp2íOϜÿ‚<Ç13Ñ› œû‡t_®MŒe=*)ûUçe½ôs»x¶xæ ³wÊ¥:⢪¨çzëÚY\¶=x-QxÀQÒ]q&‰gö‡—¤ÔuÏŽÊFOV‡áäH]ðå ̦ mù½KZrdgA7^4yjÄÝZj_ìÒ UŽêûn0o*ØôžT®;©4¨ÇiouÔ¥À'@×*~·ìw0 Ä ¤… (À­Z5Ù»KÎÂDá꬛ùæÃ5„Èíš7mVÙþ‚hÌ<0²1°Kb¢/Ãm5nL¨;bö“„å<å­÷ó4ó™‡Ö„=\µ®ôEÑÛŽHá8Cöó<–•ÙDl+‘ôK±É¯wçz”¨Ø¶¨—ýÎ<™pe>’óÜ@s›¼ßoÆÔ**믱¥ˆŒ–d"®„"æYÂ!—  ±—–KW?0ÓÒ ]Ò9´ÍÊA’ê)ªW=™Éî ‹›bQï.i ÂÓá65T±ä• 8tç†w‹h8éä‘ß“‡ìÖ¤w-¤n^M¤–¹q&…©q‚Ôè3“&yÆ‚›Ú$@ˆ{V7Är«¯'f‡°’P7O›#èp¸e˺]Ç3éµÎãÔàªHeUð’=—èäáÎmáç[6$/ªÑjÈ ÎzIK[l¸''éé :(’Ê&¨4ÕƒCêWg2JeE¡fáA!gˆµªÇ)$Š…TÈ…Ç»ßÕ Ü#ªÜç…ÇÅW²!VûÅ0*¶ÝR|¸EåýIuV¨Ÿ”x'Uµ.“â·F-e¶û 9]>®Inâp‘*œ_êáhÃ/œ¨ü’mzuái´^¤.BDú¡n[Èàc–9Î#$5qÅ‘ç5­¼-†Y¸"KÄBÒsA"S¾C‚ŒG>»¨Ü€·´¯zŸ‹NšrJ<ºh%®Ø¢1<ñ¶˜7+$Œìüº´Ï&íIsz®LùèT>²K‹61$½‘Fó%ñïUÔOB5Ö‘´ÓÛöÄ;D¼d7>$?äÒ‘._šA*Çóíö'Í{ Üíã :øD„¬@¤ízEÄVx>7Fp‹ÅtŒ&yKÚnuªØâÏ›àų E§>O;¿Nô{à\•…r ×¾‰Txë-[nIïëÕ7u–]•pÝR• IUU›V¨@LR£ŽŽÎIƒ4Qr¸è©3VSï÷Xå ½ÚEÉÀv–”»ˆý|v EHÆÉjœdç•FօΑw©GLpÍQ[OÃj{ênƒ¢a“D; "bV؃µ"zzX çéø÷ ÔÄ.Nzªé¬Ê[Ö°ÚkçY‰·®)³Fv˜ÀgêØ@ë¬6¨‹=¨ înÒð+¼;‰¶Ïè¥ãNµj>!Z½e“–VѨ*\аQ›ëùŠ`¹.P,2ð`®Õ6Â. (kZo#Ugö«#H/8dnh¨r4[GÍ)±ë8² ãÂÄ_ùðã»ù&9À7'I·ÓX•ËR] )‹9 hÇ£VM¦Ú¢4Ú² /šéµñž0ìuJ®” h[0ü¹šÝªòÌ ¸W¿‘‚SlôÙb–™÷eÄ­šI}Ó\"µ©Aº6„‚¥ÒGž„ \Ÿ¼1å¬î±È.¶ŒÝ$ki[8^ûä ÜóÐRîTÜü7G9u,}ïK¯çm nhŸ²ˆ&µ|' ¿Ù¼J7}J½'B)³ž «çÚ‡MŽ™DÅ1vz8ؾiå©m’tŽ5ç¸ &_þb£-Þž—•†žCÉbNLüì0Ú; Èïâ —ö\ÜîíYÜ!L÷Ióû|NBEž·l>Üg¤“»"že£g½’÷tòOößÌ:;êqüµˆ_ø®lÊ‘“ÃÚú,t˜ËQœ*¬ñ.‡,q±56O·Éþ™j6y¬x_ü½¡N¯Ùço¨Ž´ùœ¯ÕI Ã`çâ¤>9Šeš’¦Ó>„Z”5l0ö[m^ü“er½1nL];®—Õæ'O¦÷ˆqÞ±r^:§$cmUÖ¸‰T²53W)Q®K}ïÌ™0àI®ÂDx°º 3FÛ\øé~nEzî 2Ñe¬Ù…‰ˆK;&*7ÌE²ƒžš 8–™‰ü 3wÉÙ¡ÏKd•u¯¡±ó¡ýîDáÊÁXTؽ³°°[èÌ%–ÍDñ",éòÛÀ(âdc¢Ö(†Ð*EüÙ4M\tá$* 4.œêHNUUÖa£ÂÂØqMyÍDVN6Þ%Ò“"c˜Õ@Ù T~wé¤sUÛ‹ö8™ž5¸8§Ë;©_}â6S“]TŠnˆz CKUqÿ-úÍä¼É7\¤D‹Ë K6ÀDcS 6ßÈ[*yý·JÞQ²x¥é3û}ørWL֘غÉÑJÖØ¤¦ÌäðåÚÃwr¼²­Ùägïù2±#’oV5w_¨µ§ ºÞ™(C™–©iݶ+^ßA“ÅÁD“¿ús„”´tD¤ˆ1i±~Àƒ\£ 1‘'k6 Õ‰âxß@'VŸk»Øm2ЉØÇ…x0¡^졽íÁ’¦ùúoÞý÷æÂ ë…®«Ó ¦õ7Žrl¼°‹÷ƒ×(ÍOçm^sÄöbµóÃ+MÚâ}’›£|EµßÓήq`úPû¥ØÖo"Ûª\ÞÁË„ëì½öZBúGBæKBbkNbõ!‰"%ÙéêÊ(“|Ù+\dfï#:*~S¡…ÓúS¸Œò!ÖG^yáê‰ÀÚäYc;Wónˤ;¼¸­ºƒü†TxAÂ.Î|SÁÆÛ׋?‹Ñ&¿#Î.Al$e^ù >ß©PsæÙmd9%.„<œÍO¸­>'ÖÓàÈå±€€Ad䦓ÖJ’«ƒ¼'DªN@HÈÇn]«E\õöº¼qq¼]–TIðV‚‰“ÊuuÞDÊ1áá¥]3KÑÀÊû@íHhH»0%n"I•矙s² $./_JÒ)¶›YôH¹#Wõ$y=çÆHU´L3’“³ˆ#‚=«¹:á`yÊœƒY¹‘â­{¥G0Ú`—Áóo]ƒä¯dOebš$U¡„HÁ™wðB²(¥HtNõ0‰%ÄFíå*Ú„„®t]®ùØUbLˆª'lt$QN›êÇ”¯¨RVPŸ0NN›ìCÑIH¶MH·Ï¸ oâárÀt’ž@w—ˆÅì“«™«0y—¿¤úÄMa°/n¯£ñ“q1Õ½Óä?Φ¼ó+n8)Ž»êžÕ!³&HI:HsO…ÜŠÀtÉ. sªY Thdïv .qIýÍ$oF+ÉÙ›°Ÿ4j þÍ,ß ÍåšaI·H‡FA˼ò4Zåu­AiSëÀ(´ª’isªYpO1…yç $·–ìØdq|lÁëÄõÑÇù‚âUß§ÌUäb!c»3Œšå-‰§,\þ&]"Ž„†Æ)—<…M¯­n³g_|:³ÛUºøËØyê™n 9Ý)EÓpS—?o§Ì\\ìþ¶rö)ì~qÀÔx5 äȨ¥uÒàZD pÅ„pÅ’c—¤¢}ï®k®È†ËÛ¥†Í!Êú¤3¨”’ùY´9®†LHÎȧO)jç3 Y%¼‚Ò,–gƒâ>Žàb#h§“+Ö™TÅsÆ] g‹2-“Cj£–-,‚:í Q‚]JQŠç,aì‘7Ít¹q*š0> Ì,~²¬ÑJ i$Þì‚«{óF33¯[‰=¹SJ»,ã@ @µÃl —v¤³– (pqi~½QÅŒ.ÝÛØû\³ÜSšðb£Jw93Œµœ™Dq_{°-›Ñ„Û|s×+¹åžÅàÌnÇ›†>Š¿(*‚–™j¼—kU–ÃŒ›Oµƒ+q?óÎÜäÎV³›3‘* /ïe˜¤ƒR(V:u¨‘¸La㆟B‚ôêryMj{eñGpö§­N*‰¤ó¶ÎÓ-’Ë¡¨”­ë”r_BšKr¹l÷è§ ̹õp…¦©ÚÂÝK8a’øê\Ø™ÅI8 p•iØ—ÉpRá ñ¯Ó´Ü¦QáÄ}8É©CåIáZMŒ¿pzf;»šÜª–´m]›hwr¸Î‹$GùµdÞrãòž’µZ¹Õ‚éWs€ÖFï*óñc”…×HçZ•Š¡+Î [qÌ™õ¸ ¦êÎÜ“mZ¤Çç-‹âwÌQ|ÂÀ{éêìb<à;aµøNìä!Tsž½}%Z“.®·/cÞ­RJ {𕕯F0®È¸è´K#• GÙ£žÝÄÀÈY¼Ì½nÎ1Ä6—¸S—m¥­nÞw&ÅïƒàæD–ÀaN祎AeH‡&RÎê$ µr7R rO2ã=eÕ¨rÿs2•½±„Ó™ï™ÈêE%9߯`÷¸F&!£.¯<#ñBî_!¥:1ã*à»@Ž\›uwª¢,]ÖhÂSžê¤Åš”»Ïö^”W¯{~–`R¦©Lwq§nI:ʶ»ìâ&u4*x-3ì– Ã…pFÂv*Êâyõ EJCbà‹ì’£Òè@ÝÈÕ%Eu\ºe 6Íbéã‘„;=R¥5|˜~ê¢w#P g! a ˆ@¾Ä ~\êœpð6#á }ïd7±@Äl¨GÓgÐÜãÛ‹Øõ‡Ètæ q7e¦Sp‚³V™ Ô8÷’J÷lq '‡ $îƒËåÅÖ^ª´,7zÆU„Ô*%Vz+夗’qµ]NE-[™\s¾MWÚî¦sj¨ê‰Ñ« ÙÂÒP™‡œÂM‚4e­AàxÞÎÈá×VTK`GøÚÊØGËóì͈°5vS÷R½Ìd mã8ÓÁâÔk¦é„·È$»ŸÜ ML¯F¿3yØ.ËõRÍj];ä· [€ÙÚû3{øI¤}Ö¬.PxQÖÀãZ;ÁWzt””“sJî„[ÜvL8šðb‰tq¡ ÷Âä•&%«˜S™ÑÍÛ±ßDWBzd:ĵ*k¡âDUÆÁ­ÄÉ“ŽÜ߇é\420czµÒ‹X¥ oÁ2«TG’RfÎ2’®ðI×.šÄjŸœR´ž¦„|Ç—V«GwŒŽ%)Z;o"ÂUb\}¿—†æä^mæ-Œ¸y'Qš9G”˜.F‹Ò‘F—I5>V b—è}=Ç€<õ“ùkÈ!ÁÉâFSyãº1€^97£‚LÙ¹FgÔœÈgHYøWÔ$„³2-3ýª,%™gpƒ¡p¨äÆ%Äé j˜RvŽ…pN¾ðf ^äÔäˆ&°,B­)™ ³“•¡!‘ƒÐ¦p£ú]¦"¾³¶ÚõªªºR¬“\B[ðÉØ wÄ0Û„7w ?ó.U0¾†ñ3eÁɤ ÝóÈ«˜nŒ±•»$]´¿2£ÃÝ…mëtû_H\¢Vr¯X^“-ùC¹*•&ñ€R"¢.B¬éæÎ¤­oÉÈëYRÑ6I¶|äFÞ·£óÚ-ýl¡dñã(Ÿ]“ýSé*H,ò䙓¢¨fR:Î’%&7BÞÈ K—ø#@ˆš:Yo>Û4 ÏÄôqDYM{Ý”¨ _¾`\~(³O9(ŽCãþÇ•²¼a!kR.¤ÈÜkà6—x̸®.á…sìíÎØy©ï.N2M0 ªÒBÚ%Ø'1DÏÚü…Ñň&%ºÉ›v¶ ®:(ƒ¼s.ƨñ'y–°õžJ6yk¦ÖÓ‰ò68jjä'¼Ú É­ Jw!RµŽ_Ê’D®ü“·J¤ÓMØÇ.NÌ¥í¶³ÆóÒNýÊ\1˜cEI‘qT^ºUÅ'Eᪧ„ÓP™ï<Ö$DNHðL¸f(•Ý yãVŒÌ#3q„ÂÙ#®ŽIØaÈ–Ó¢î|ØÞÐZ.hœ{ìAš%ê™Ø­bjÐˆÌØEçñú— 2áDÖËä q ñ ÓÐ7|Šâ–mÙ¯Zt3Éí`AÜj¥¸Ø']\Îfjs¢†äŒ-çtQ3ïæy&² Oóc¢Ø”¤‡\„fiPõ|1Ü£šNx%£«ê•÷ïp›*nõ€€‹Px.JSQKàá–ýE‹ŠÛI©Ã€ïÜÀ ÍiÝ(B°OB'Èv kÌØdacâPª´fyÛh¡ŠŠÄ „Ì ¬ñB£,éW*ŒáŒR@WÝHóË%ù£2IÇø;K¦ÀEƒš/ J4äBÈçÊÃ& “x j§KßþžNU¡TFçäUåþ*/õrÑ€ë°o™XÝâ@G¹l!¢"²'l—¶NE21û~ž¹,ë&î¢,ã6™t]q‰K;ÉNìæõžŠâU_ê†Â!<è,ÑÑÁñÊÓ”‰¡Sh[ç(ytÝÃ3I‚:©Ê–Ïf»ÿ!ĶC#4lupÛM Ðl®^ºjv*¤munÆyåK?(î¯Òi$ÃëUwŠ413P.‘M2çeXWOc£Ájëkʼ_ ÑÅLgÜ¡Q;ª¨Ûé5{ö[ŽnÆ.÷òAî çz°gchD8âˆZÜn›¹‘¸ë'›$š`+Kg‹å³oåÈ1Î%¼– "âè ËûU²Ä%Ü‹!Déóv X’ö-Ü iR­!nwȦ/ZÃM^™}GGÌ“¸jrå% C ú+¨èr‰w Þ9¨<Óí |P…äjïîVžAqö;õ”&›¦Ú3þvIÕ’74˜~½’MvÏ*èî]7Öî6­Ìg ÑEÎû¼s^ܑʪ €›ÕܑƟSüÝ““’NOž£©g€ß¹Ÿ®ŒgPP_`Æ1{x>uÕ …Ì›‰éª9¢QHæLjDZ›5É9Ë•° \²I´1‰‚7 Ù$Âf:iÆQ—Ix k†ïš$ŒDs8ÍMÎ¥êN”lpmÅlå½SÙ€ý(ܪÞFF¢¾x©8è@xã_LbÀÅEû…¥§¯¶=TPcšb¢Å‹÷Ò$\-’-ŒŠAð´Œd’\ÅüÇ “;Ѧ°uJHÌÆ—-ìv§Ë'˜¹]Èë9‹eža?73û qs{¢—]l^ƒ}‰`™çá $ê»gK§½Ã$WÛ(÷¼3r€j’*_…欓ñá–·Û’ìaÓ$CÈæÌ$ ‰l08Æ#ýVíØ¦Ï™wÖKTR^­’7ÛßÊѯ¼r³°g ¤ð;ù¾ÊK±°ÙvºÜ ÝþÊ.)L¢ÍóÿöU^V@Œ6­¦Oñ]²ˆ6$Ð丳hTšæ¼P+óÝsæž|58Y÷JÅ.)cK7¥-ìHH7í`“gS:L‚P Ê%†º(¥Rß)Ï8Ï–s ’U^I Ì*ÜD¹Ôþ”{;;äò©FÆ¥c¹§êøY‰H°Œhä‡D…w=fî?`›_׎_‡ê 5LOUBÍ9+óó-o— eþÊó=~Æ"Wf ta8+ð4‘‰¥f„‘r«×Pd\xš˜Ÿ%kÎHÈŒ±cÛ?ë¶–ì¨ë²8 [Ý™É<%¿‰bme˜D`G;AÓÄPœäíà ›¼­Öñ°†Ý•\Ä2¨Š!¤øVtœ™ÉEã‡8 Æ]Ním…›>+¯üØmÛæ$WÉK*W^‹ŒÐPæƒÜÐÈúª…î¢$¤ñåC|Ë»Z=ß8#£'3±‰7äVÙÞ‘SØ'ɰõTx®Löj‚lFà\e3•â!S·€µÜƒŒj±¸a¸V©  +OI—°‰BÁä¥Hlzì” fWÐb/cÓLI°òÝ›¾L$™g¹¹F‘TeÛ¨HÆ÷¸[¢Ä)ÊÚ}'ðªN•AJ œ«H *×Nôé°µ&rNÌÌ4„S%þ^Ú5AÖ\ŸÄ7|ånue½4L$š¨Žzvñ¾éXLâVýMùJ¨* K„æ¦0ò®ÒŽÊƒÔ6\”OÂúY ŠB…Ýmq3\¦å"‡BÅ´ Y¹`Ñ&W§ÂcÈF€É<“¼hÑlvø‡Š†À¶è5§‰Ú'µ²DØÜÏzÉë¿ ½•¡h—V©Í„GIäÌFÅËI ®(€.• ‡¨)æÔ—¶-*|³ëI±^2Í=|ÌŒ+ñ±‹ÌaÒ$‡òϪЈA±v‚:¶³-4ÒvÞ ½VÓÁ¬Œ«òr‡Z±øÁ<ƒ 4µzªlÅœî_]N¯7q+6¸à}å0xÑàiR%wêà68 ^Ö¥‡Èé’C‹g¼u¼8jK;îr*gF™–uÖȦÎùPöÐÀ·H±£”+x$N‚÷ärö=ÁÌsÐÐ;¶³ øÅ#<¥W14€rV6×S$¹r³x=K5Î>³ÔçÊ õšÜ`0÷ö3˜׊À$þ‹Ý{ѬƒbÙY! K¨¿Š©|É5Î4>‹ŸÞµ[VUb¦œyƒúYOê­’ïÆ’Ê8ò7at ’Õ£l‰öù*XMÔ\«ÚŠ´ dØÞ)õ‰òS¸%]"(3 9«]•å¾bóp 4åUŒošßKס\"™héÓ:Å jR7K“åÍ—îh þãaäŒËò2ôeâ[r“Yì‰Lb«’¾œù/lXMqæÊi2-ì[¨nsáÖfŠ:ëƒáaV AÚe*Çø”„·ªÉ+¸¾‰¡Ðrc¶Í5C4uEŒ0[‡ ù¢U+±wuj†}Î71=5Y_rà²õ-æ$/ó½ªFúðø„B«±†ìÏx­Aܱ]œù]¬'¹TÔôÜÆ¸aæ½;UÞ@M©êFÌó¬áµ$þ<"žÕ‡µ£$zJà4u]p2÷@k8ñ’ó© ª]0·HîWÈmî`€w2ó”/¦‘Îk•y+ãËîiwdn $CêÊ ÀQí䥩¬ùT(ãE€2«ì¦[K!ºÒ‰.jœ¡ÿDç`‰Ñ+bOAßçÕ°'–€Î\Îe¾ÇðbCž0AµK¢a¾z|¥-k4HwM6êF˜$#C#%J_âÁúFŒ©¤çëÕ_³s]‡äˆd&¿bãù*¹»Ž§%¯ASóÔ¹}ç¸YØT—ôtÒÒ…‰qñº/Iƒ–É2…ûŽâð52¼ÿ3{¢7Å8M{7ŠxøÒL3%ÑUâDf½Â·Óˆy*ê_ÓÇ^ nÏȵžªì2VQ·ÎõÕLFÒ…YÂI°/;ÏЛs•«VÕ8§Xm é»YNÕ_£o.¤N·t½L=g^¡Rhóu2žü%[æÛ¿øÂÁZ-iFº ‘ŒHÌ’è‰L(3J°Ò”ß^ÔJ;}v|¼`uÑôBŒ'¬Ú·ÌR8M»: l…Ù~ãñ,„“ü>Ôä–JÁ(RIø0‡³qÌïtfÁ¾…d`¹Š 4Ë$aÞ1cw¥g¼fƒ¯áûÁñúf?¥”oK5âÓŒw$³_ŒŒ‡Φ$)åw´…¥°gi ‡GWƒË:ï à¢8Ñ*õ§Ma|$¥ræh0´eŽsLÞÓ§ Mµ”óçrÐKc4®GØOw5ÜeB”³=’¾Ú+fÃàŒ õ$ËÆÆÎ+89a¡fƒ²þ2 e! A^¶Î3©æpÐAØe™'±Ô©÷òðb¢u-¥Õ°M˜ï—.ó’÷C‹õŒ¨¾%W4AZ±Á+¿ øùÊvF$.A×´Y³ƒ€UN°ÂW”Ù+´ƒrŠ+Q· @ƒRÊ f£Ç=âîÈë“ð›—Ãce¸xJW"ôzž¾2Òú!¨µ~¬Ö ”סښõ$“¢]ïGl֜ߕ¢ðÀ÷Õ«ªÌ^âE< !¿ùé7©T] ¿Ÿ>.i€7rA:Y ,ÎoWø0\©Ê"¹º‘ƒ’ö!îâ!¤,—|œ}Dع9Ñ!âïñÕ)TŽ-+=«É…‹Ä$P\Ã-c^Ž+Bý0ö\Uzà8†•õãY žT9NéVr[2Þ’O•²«qîvuàaS9q0n}î²€‹øIÅœM¬ô œ«/‚¤ßý2¢>DΘt¸*ÏË1œ›ÛRσF nójèãp§Œxp¥WZY%“ ¤þë*$çT‚Ùí»nwI¡DrÄÓ[9H1}ÀH¬›bšÀç(ûʂޘ pP¬Šù(òŒ {g[ÑIª¾äَΓKì²E‘Ïöd‹È×…¾ôÅ×t®6™ÒŸ%y\Éï²Ó¤\û©k$‡‚Sð2tjOá’mÈoòaÈá]GUè'‘R²Ñ&ØVJp¼©Šy»îØ&™šá Êi :™]æ¡bœ õ\‰s°BFmÆ Šï-"<%{úû͉¾“ D³*Ñ*‘UývýqšºP-s*&þU®Ë8Å}c-Yð}š g•ü¢Yrv†‘YèlY_‘¥Ù<Ô4éü&³+F6ªÑ I— ÖAWÒãöV Hõ«p”Èï·ë™srä‹É$ܸ i2'¾øŽ‹:)%E/¤ýÒg®Zðí&‡¬G4{‡ó.gÜx]FŽЧð÷Tèõ*;Esu)*ó覄X’w1ºÞn" ÖEƒv ̶՗&lb˜:Ô8ÚMývÓNåÛ¥Bƒ—hÔcW|—ÕV+¿.¹«–C”•oÙÃZp€.ŸÙ·€6ûšHâ%Ãx;NAÎFIªX• »8B8~Vä2»²—88ùÕº—A!ÓÎÃ¥¨¼˜© ½«¬*öTqtå(jàí&Š. š93èØSÀøãlÁôø^xS¦1tb˜Ú®Öƒš:$7²q¯xÆ±Âæ`PF\|ß#i._‡¢lßnaxìá¶•§ ñ’ŒCV™te­ª\ù«íÃqð²Æ$oœYÕøPQÕ…1ÇI|S=^|Âwb ÝLmýœ²˜Ë!P_"ˆÌõ1«ÆZW2u4K«ãCÕ}W§¯$ÂŽ[ÁÛ’t†Þo}¹ þ3 Ù–t #ª1›’0¥šß—gwͨ¢•««|çÖPxÊôÚŒà s›9<Ói òvKÚMM•ÄËã0éómˆ*¸Ò¢Aî4F餹w ð–Íêó¼ÝK‘ÏM¨CU`‘£xeÛ„.N!ö­2äDI[Òöbª_Y1gv7ÜExI——ùf@w'$u2ã„bYKub/«B Û+æÑ…߃µw•ë•;oÚ §Šm5Q»\9D©TP…÷ó^—.UˆÓzyB þÝÓQ˜ØàÂuîkQç'KÒ»éÙ ~¡HÓ•]ì)¸!·ôD²7Ûжâ¶@¾’þN+ëXæ^DÖ¥Æ7·ö.§[(8ºYCXÖK=>yézY÷]{À¡ nÒ&)k=” °óšù>;#£$t-lBTǦhZÙ‚ŠÂ:ËŠ%íª5¿L°œ×*+½ž‚#ÖéÝ™o³S¥sJ|ãö88 § —m§4Ê‘Dá(8J¢]6Õj.¾Ý¥RœB ðÅcë*˜ß‰L¨Y"o Þl–ê;ˆ+ó†EjWu"ÌM™ME«A¦€‚ÙÎê`!ØÅ‘F>6™"¾ñ ê$*éI…·_‚dÑa|ÿ,_=‹Ûf·MlG¨ËA‡†O[É­ 0ñjë Y¹Q¹tžÐ@Ϋˆ «êýŠGÚmbY 7Qê&á:;ü(¸‰ˆtº²1”Rä¶-*ì»h€birgGýİ.µ ¯$—É ”•<$¢ˆ*{B ëÞÔŒXÍ‚Pÿ•áõP ïb¢V,ÌJÖWF‰%ÑA¦`Á«¶¡ õÂß â³ÞfjÄ­3Mûd鱈. ôeþ™ðk!l ‡=†BGüíáv½Ž»òÉ—©Ñn)Ø‘Ï_kŽ^›—®y{Mˆ†@Þ:W¾ mÃzõA ½Ýó&h aic"g àHnªN Î1ÜÏ–qkH>U¡Â£õ‘T¢ƒyôåÀ"Z²`ߤòî&ƒ2dj"KÊaÃQà@QU [q¾Õ î®_WX›' cE-âÕÜ `ª¬ôHf>)î(Q¸ÔKÜ o½=”ÒíˆS(Æ—d}“Ö ówšp e(Ý•¶E­NBÊv aÖ¸S§`ã±$±¨äð¨Ä¿ŒðpN¬¤£úï´¹ÙΚ•”…×ñþÍ•:Á(±¼:ÛÖšXnh9S¼‹]¡Qe'ZwàÃeä­nËáÅ;ùZ…‘QÒÅtBât ü‹´jØûíÑö—Çç3®ø*›^°Ke›¶l4yÊJ$ cŠuˆ|ó²íîêYØãíBSšÚÑî‚TãÌ"Ž/Šiw ©½=8%ÜiZ=9Up§ø’àË©>ÍÚ]KŠvAfÁ«ò2Žé\6V¶C"<˜èV"N‰Î|Ë·%œ&,Ø3/ØÊ,™Žl)„_¯v>YŠ<ž‚ã${ÑsÉ­È<.‰¯Y#ãh@Ȃ䥬=H~‚4±SßÝfÙƒzþIŸ˜GÆ`ª^…*J±®L—¦ð6vÜKT°=Vj25&[TÒ%Ë¦Š‰ˆ9¸l¸°»äS=Ž³Ò¥ÈëàÙ–Iº°÷JaTâIN Ì[×ñƒ*¾f¦Ïuòµ”ôܤêy][N;MIN…ïi]e¸9/ãU<'ò[{÷i-bÇq‚ƒUpÌ«àŽ—‚¶æKp‚s‘ÙAi%Ä ’Q¶…ˆzÐC(µ‘jøZ¸‚fóÐ ÷r @Ö[æb¤E‹ÐûeO Ø8Gi@ûíaCßDÀw+Ah_,N¦ü4 *B‰$´AÈUD´íB•,áßo"B†ªÐÁ5¥Ò_)ØÿÌ8–ZpV¬i&Q‡‰æ7€ˆWçSÚRp®¤E’é9’!¶÷KE†T}a ¦*kœØØÔ,…ì°uk@c¼DlÙ•Ù*mGÙ9ÄËgQDú­dI4Ý5†%ÿÒ}ˆ‹FÿΡ•Æ5ÊûöÈÿ8» ‹²0ªÙz§,†„ÀÒ×UýYJB¤7ÈÖ;—Êb±áÄaÁõ{ÆíøQ*vºÐ­”·o‘È4%è‹7¶0lwÜ(4—é¤ûÜ+R˜|QI^”qß0ݶK™"#N’•‰é× Š»ÊÊO…1"‚™”%[X˜°£Ü`¤¡´S~a*bãàÔ@ÁêÂWtm)ÖH8–@6p•^MÛ~ŠŒ–•Aû¡ eQ5© ßöÜ\KP²@æô„Iáê•,q©Xˆ{’ B™B3¡j±RT“Z À/AY§·‚`GI˜ó—F©EØwA‚ó­ÊL’’“šG+ Æ)nhR=-áÙ·‡úEïœfÝëÆŽ00EwѯÒÀëj.Ýú]M0 #ÓÄ‹½E`#'ÍvŸÎÅ4 i¿»MJ¾`–Ðl?‰"¸„«KI¾= Â@6eN§ÊUfZ©\µèÕÛÃñÒ–V5QFE'…fö¦*§w&[e#ÉV7YLHz6…¯54WÕ€´ÆÑ6‘ Å7’:Z›H$†ZIÃTê‚¢DË€Ês¿€aIª|Ì”.4hBdB«ºB&¥#Bif£9ÕâT])j1Ãë¶Ÿ«Æ]Ý{\2 LPèlW1‡A€”­%×nþÓÁ%©R-–G‘9¸€#¥(l†’ov 2ÞKÍ=8Uª"ZwúßžuAPÓåºÀñŒmÚÖýܷﲊõö!¿¨àæLCì刵}Ä·ï(,ôptÇXå¨iÍCɵ¼Ÿ7â¨ÑÍîŽÚ · u·\"™L~f9¤°Túê’8›ãKÃãÍQÉü#J‘‡2ÄZ¡Šk%Øã)}mœXiAÄÞfJgßL VƆ!O 7{6µè‹Z6•±Wuv/ :,SÞ{*3ÃMIœoPS2ËÁ×°ŠÍhï`óA·¤(UJ(H†”ÑxìKG+bȇB63N¤šméò‚ÄÉ‚Uø U|òÛ…?™mO¾3à]¢¾8–Òý’Rjo:½¤íŽfUÀaZ>Àûw êæp³È£ÁOGûàpj¦TQ $jxg^þ©G@Ñ H¿À¡+ˆ s¸¬Ó‘)œú3² N¥Œ¾ƒÈ Dt9¤‡=u@q%X+æâÁ†i3Ù¹|RþÓ¤dcâ;¡†/+H=B)¡Â‚·‚À<§)©E­G™ v­`M$´Éɉ"°-¶%@ú,·•°Ò¸dt$RvÇiᤠN ±C{BŒ äA¼Ø!.ˆ'’ô ±ÍÊIpìXÿ—Ò–Z€†¸¥MäP⌆›¤ rqÐ/xRºTq‡?JaìQ—a·² •mI9„5‘%`Þ_i¤ ïFô„µƒ™{±l|¶ Ÿd-íäÎ?œ\é")€÷Éq5Š%3gJ2ô©ô*\Z®Ž•ˆ¥“7wµ§y³Y€nç £ñ…Ôä+BCØâ,V ¹"T¸:d ZPDR’aX!: dpÒgŽ9A2™‚–¸ùµ:SÒ×!"±Îg¾-t–uN§ò=©¤M‘mÉdÕ•Ô.3…”ÇÖDÁ^CAR ©¤p^FøIhvÃNlîl$|™Ë¹À7*§r\)Öe%U+T“ Yp¹„¬¹saÜFCAx±ý” ²±ä¥\„CàAG7W \.–ɶB·$¢ øÅþ4žŒ»É˜F‘üŽÙW¢–3C»Ð:c ­¡qJ÷ä¤&,v+×)pS³w½40S(–ãTyL¹@ê>1 Œ»Ë“¼™› ð,dìÞr¥S»oëÇ€¤þJ/ÑŠ¡ ™”hb/–¨"Џ“|’ k°m‹è Ö•aAŒ›“Nñß‚= Õ4x—厦27X¹#†PnA&GR’¡€G¾9)ñ²þõê.“ס•æR¹¥JSèRû‚–ºú{é-ã…{„2›¿Ð9Ú_‚\Z˜`ƒÓ-È jliV¦gáBâ‚\Q”òFØ*oÍ3r!1航€^Q±«îŒW¼3¨®Û1ÐUa‰Ò iÕKK§HTÚ…kùi‚H`9òfIr‰Ð½¨hh&+IF[¥Ù{%ÁØ–a¡E|^W ÑKä2Å!õ0Å=5H]WÆ¥}c˱"I©2ÆqåÊVÚzÓ†xI2Î¥nÝ]bI„e&>—}MÐ×~vˆcöBK‚½rÃ]‘ÉU¢{eÛKŒ™+*WöSø«¯ù*¡.‘¯µªœ×TìÏÒ)’}7~«#_QÚJò- ûOù¶ \]rCÇíû9ê`¤4”c7É4pêAIR£µ·)2ɆéÐXǦ¶%I*iÕ¾‹˜Ubæµ…J¼«P®ü>D”$áúŠdŸºc0»´!]ʼ.j® A ¯+½ª.’{ÝpSŽWƒ8Ļگ• $7ÔÇ´!U©‹ÛÜ"Øvê" 1a-¦4bZ…»N ™’ qä,N0Â( ϳ# Q” úùzh®fÀqf‡H@!æ–×5™è¤è"£m" JF<Ô<ªx^9IÝgñî+…šŠ@ ¢ô¤”l®“º^WîϹĪãÖU"PPŶV'…ÈiT^C:·+È™MD‹S˜­F÷»°’¼B¬ÊëH k=uWrªÂûeÞ› ¿eÑò”uÔò¥(dÀ£¹ëÊIP²ªÔH4d]‹(ú4 8ÞÚu?èù©\©:ã1,VT( r‘¼.¼íxU1´+FEig™»È†¸ Þ²fBl7YDU?Ùã×aî¤ÄÚëquÔ‚VSîA h[²òu<ïaÈ.‰«¼u³Ê]å´û(=i `ñltO#_´Ø™š"û–M7¯¦˜ËQX‡Ø®QÏSŒL¸€Íæ½Íƒ«Í*@ –OSõâzi]·±´ q¬—¶Ž^W‘i_‘úZ‘^‡ïX r­*’—+² N|´é"‹­n¼Ç ¨¼Í­bö"kˆ/HˬYÇɬNx‚©‘6{l¸û©"åµâõZ­—ÂTä|U$rWä4¡«Â­ö•¯Çb,úÌy'Ž‘9”̳÷ÆóøÛͲï¸p ÈÕÃ(Ìö,¦ÙdyEzyE.8Jüiº±bìÍDz„ã•Ø6ãýõ«”|8T+gztk—„í늼Պ“iÞh ©‡ œšYu²-²n+Rî+îX©¸Ä•&JÐŒ9/éaS„àµ(­Q@j-ŠT\ÐÃ9à,yÙíD AV°q;QEVzÇ>âÞU“ ïiŠú"ãœ&êCÀÏ6¨fÎU¸q]À…‡ ŒDÀ³íÜ)Ë6H%úð >°¯SÂ/½€l`qËõT,ª†_âicC¼¡¤"ë°âÞÛÖ½”‚sqoGEÂgŻ͸PŒ]WÄa¯â¬‚Rß&QÉŪ6]>FÛÑïŠ!wé£ #’®Ê%$En™Súåšö¬”¹ ïÈrñËm`MÂ;6([-àZY1Úf² P°Ë éµ ‹_ÆI›pˆÌ4>9…]ÈfeÇÈd$#D“îñmÃé„Ñ}&¥ ±¿pòurõëF …ØÒ ­1z€Ñh(; á5ŒCƒ,ñz ð*³áÛÑê):°3N™TÜÊ"s&‘7 HênrìÀKr^Ì"âØÖž¥Î­I×H’&´G¬¨Èd¨¸ÿ—E«Ë5ÊM –Ëd¾Nú‰¢†soŠ9´>øRŠã4À€Ä[(ù0¹ ó<@§–fà ÉO@‰<ùšIca¾xsfŀд—6%‘Úì—9ЏÄÎFICNUU¼nÕlv›6ÑBü¾ºÐÁY˜š©‡@ÅØ»"D@‰ Bé©¢ˆD@DSDæ^ºQ¼õR¤}WÙbmß̰!q Œ •®mìtxÃf‡RþZ?ô0L–8¢Š=Ï>^gÈ”êZ…éT•/’âoòn*vÖ*nêe'E¯4¢F+ ŠMŠt‹Öž}!‹µ"å³b›´ý)lKYBª¦rj&{8ñ¸ ¤—ë¡ã0×¾âÅHœ&BaMA±7UÜ­Sq nÅõ),Ř ¤MV¤D±V²Í Çö’TÑš©º™9d&ÌÀxk çÈéK2³îÔßìïBl³?eý˜hiïÛB)­Æ*;–ì…u\$ÛËìwB{À„èÁ¶…GN6ÄCŒ÷T¼é=’òqÍLEv!ä3\'¥@|piÅK¤³èz•¢´A@œH Ö‰o2›üÅœK±9CT %¨–C¨ª9䛀D‡Ä±V•¥ÝÁbt\ù­Jqºå:öº”ˆ®vY‘ðU‘y[q+_ÅE¢ñqH˜þ8Æ.ì‹l–ÏsRÚ”ëáâÆÝÖ^'"EU-¼Xæ¿eøÄ ÓµâR¿Š+EïÅèµy)ŸZÅÇi­‡Nz±·¾†¾½õõy&×ç¾{ñ0¬“‚|TΆ9ô1‰Ë’*6ûÛŸS‹ûŸ3 ¬sÝÂCÇÏñÏõ(¾¾QüE'V¼ß瞌í®o?{½n>÷}=:f ¼Ä:’‚ã^`78ƒË+BH¢­Èÿ©¸5YŠ7ÿSùçQ¼?Šþøsj1ÿ\ö­éeƒÜõOá#ZŒN6ï¤iéDzüØwü¦¾Ü;‘!S,îuXe3ÒÃ,Þŧ·ys –`•P5MÇJ1Tný¯HåiªãQ(Vä"Õ¦mµød–àO?üa„á òö§¾þ/0Èm¡tßgolly-2.5-src/Patterns/HashLife/metapixel-p216-gun.mc.gz0000644000175100001440000011761012156145314017711 00000000000000‹P#õHmetapixel-p216-gun.mc­ýY¯,I’&¾û¯p€°iȲ2ÓÅ–"øÀf× ›‹~ Ø@däÍÌ@EƉˆì잇ùíÔï“EEÍüœˆj22¯w5]DeÑÅþÿ%ýŸÏõ¿þïÿÃÿ—/¿|óãwÿéË÷ÿðüå»ï¿üÝ×_¾ýæ/?Î?~ÿß<þ«ÿíù¯óßÿSÊÿêxþòçï~~¶ÿóÃsh†Vßýð§çßþüÝ·~þôåÿû×ï~úòóóüúý÷ÿy~¢åŸ¾ü"?Ÿßüòüó/¿üøÿ÷â㟿þõ§o¿üñëOú2ÿðåTÆ¿±ÿ¿þðÝ/Ïo¿|ÿýó÷ÿùù¯úîÛ/Ïó×/ÏõÇoZQZ–úü»çÏ?þÚ¯í¿A­Ëçw?üñëïž¿ÿæç/Ï¿ùå—/?ýðóïôx~óüñËOß?þö§ï~üåùË×ç7ýåë_¾ùå‹N¥UC?ùbÐ'Ðüûï¿þéç¿þ2ûõ/OƒùßýÓÿ?þã?<ÿéÇ/_þðüù—/?þü<þCn ÿa{~óӗ矾~ýÃüü׿»/?üòüæ ¦ç·þæ‡?ö_þü¥M£µæØ­ƒÿ–Eþæç?ÿÝ¿<¿ýæÛöó‡Váçç_¾ð¿}óÓ_žýq~þï?ýç6ßoúòÍÏÖ×_¾ùOßýå¯Aoèãù—/ùÚjýüå—_På»?J­6«¿Sô<¿ýúC{ö×F½Ö÷Oý¡5ü•¥tš÷ÿ?CØ_¾þ¡W‡þ‡gûïË?¶y÷Ãßý˜Öíï»ý2ÿåÛ6“ïþРúþ *ÿë\Ÿÿl¬¹áù_¾ûÓŸÿõ§?7³«çÿòõëO­âªÿ=ÿ»õoÿýïþíïþí?þî÷Oíÿ¿û§ÿ»OVùýï¿þ' þÛïþøÝ¶þÝï~'lûן0¨ôØþûýôÝóÿÝÐò<Ÿkù‡5ÿCYÈrÿÏ#xþé¯?üîùo¾ùßýáùŠšçš Ázž‡ÕUýÛßþ6÷íÏó_¿ýnþò‡¿þýÿßÐù÷ß~ó÷¿Ïõ熫¿Gýy&5ÿÍ—&ÉÿÓwßþó—Ÿ~þúãnÿ_ž¿ÿòå‡ç÷_¿þ3ø¤‰l«÷ÝJ_~&çüÀÿñ›Ÿ¾ûæ‡_DR1 %¶ùùï~øþ»þÂ*¿{þøõë÷??¿þ<þµéŽD‡€„Ï_¾´ñ—ý駯{6,ÿ¹‰Â/MDò~ùæ÷Mÿm´ß=þŠ–ÿþë÷ü雿ü×??¿ýþ›Ÿn´ú¶‰Ñ×\-±ø™ççÿôõo_þã—Ÿ~÷lZCÅø/dhp÷7­+¨ °~ëý§/€(þL}ÑôLk÷ó7ß÷‹ð»"êþ…jïûÈ_Ûпÿ¾Íí÷ý¥qpë?|÷ÇË_¿o¨hcPÛ|Ê= [“öTÆ×Ÿ¿ýîûÆÃm o¾ÿú×ý l@YSŽmú¿°É›nüú7 ý|Ûòû/2(;k#ýøÓ×?üµ©Â¦Ê¾ûú¢YÚ6ÊôÏœ¦úó_ ¦ÙÆøþ›¦jñ¾‡·&ÿüߊjÿ¡~þó׿Aè~þóó¿{ž&ô sù Ñôå?ýòÓ7ßBÿøSÓ}£¿áݼñë‹ÿMíÿM/ù3ɃÙ~ñé„oR`õ¤š´õÖóÔ»™cJ¿ú½z¨Uàÿc­W€BÇž¦ù-,¡K¯Õ«),±ZïÔJ^·ZÞÇxx¼¬®÷3MCWïîÓy"§\~„éFΞïo¬ú"'šxX«Éª\[ÍÓ{,_'Áì­1‚Ê™ÿäD42ADðúÇeÈ6•qj7µªVæfEá­Ùû/ØUq¾Òi¤çÇtÿ˜žh+ç¥éõÉpŽÿÿ#DߨaÔJ^óÎ?3ÿwá¼)¶Ÿ¦^ÜyK«Jr€ñ1‚fõµÁ™Œsn»Îøƒ±Dˆvˆ³·é=\§ºf¤åÚ7„îØ è”u;¡pÃ.l‘\oÇIG3E«ä?ŽJÃå/‚hÆÑô“þ™ø_DygÂyÄW׋¦[ß|>¤Þ@¬®_“ê |!‚Èá‡zvd…á`­)Öæ\»J–ß/ŸªOtÛüJ_GK°Äb`ùUêòvµÜ÷2®îÉ›©~ìÜ|„@rW×è½GḇùÄÊKQãÓ·G¤û5Öcœul7้æ\'ø ºŒ¾Sð 7>u¶ü”}Éôp€ù]ñàç ]Š^D® À(2ü¦äFõÂ/SGÉE‚“˜JkQ›ÖCïRþN}„@î_§J@ê4i˜@'ù£ãè{CÓ×˵ìK;¥)¯Ï¿Y”`¨Ô‘v•Å›g7`)6B±Í–Zq¨p›éKÖ—bùe’âM/âwApª‹ªy'Á¸…‰6x€ý#ã<-»1zj©Ü ŽÅÀÕW^?Ì)5;9Èå㥵O~øqQ¯èO<^Ãou¤uSZ[Á~\æô :(Ðða‚ØÅO~Ùß æuÀo9é1 #Dª¿¦.¶ÎÒ“«”Î哊ö õîŽâ‚ÙHØðÜŸ\0(Úmˆ·¸0Ít}2°Ûôþñ8Ú;!¼ øÿÎÓÛÇâëß«·õé0nP£Ø†â6Ù»u½ô÷Æl…Î]Ü0tïûa/\ß¿)—«SúNaÌFÕ©‡È—3a´ÛJ‚ø^üÄNë>çA`ì½]§Qtg‡g!Ò’¿L1Ó~Åv£K•Òˆø6ƒ8E–+Sj!ûñšÆ×`WéÙ$tj–¦.Š)¢çN¹ç§6óèSf U3Þƒÿ±3kwú{êØ·J7á2…43[êtBüŽñ\Ÿ}¨{¥YÀž x’sò{þä‘òªZü‡gÒ‚µ1 °¿Ž™Q{úpm¯áÇdº~rÕq^ÑóêÏäÏ|›ó(¹ö(þmȨÅÞ!sxàÄìŒÑmÈ•Cʘÿ¹7÷ìb@é1údÄ{å¸$¡nÕ®I*«ðøxxrŠÌÀéS@™Iƒ·zÝ(á½Ï¦{Â°'åhw—ça‰‰ £¸¢• o=†‡¹Ÿ´¥.’V/ñ1TeÞî·GeÎêÎ=&½Ú¨^Á”ÇìµÜ{0¦îÖDäØ a}ù/íFÅ_ð,´W¥îý#uó2Oæ¦}gϾ°¾¡Ðʪo^&ýBbcS„¤®‡ÆÀÔ€ë©[ûzIèª&½”„Ÿï­dþ÷A‚íé"<»h¾æ®¤:Ì7¬m´†&ì´š£Öù6•êË ±š'I¼"Õ¾ ŽGwxìÓ éî Íêãx^Eý‚ÙeR¬Ï]/¾æÅ¬ó8c/êºÎ§¢Q±@c=F>ïR®#uBÄÇ&ýcÞùÔ«w¿]eøá1ù'rb½™š<Žžœ¯¼Ú« ”+Ši ÅCõŽ‹a´·žìµ‚} èxÌfÌ hS›À¸‘8ï‡v™£×F^èÓâÉ—¼¥s¬hÒ)kp çÀ¤A{— ï¥Tékî°—=œ»¦9˜ýQ¦­ãnçe'h@«ýмÔj¬!`jž|5Uƒ@Mo²BI²î)›VójÎæ­¾âÃ(ÓŤ褜–Öÿ@*}""1‡òðÀzSï1w5òks²i…™u~°ˆÝº•0Ý«pó«Z®¯± LN_³‘‰J)~<º4+J&2«ç’pÒ…/ü™:DÆ^¯ñßÙÐû¶ñU¯d~÷el}aïËÓ×Ðx¾øˆsUÓŒþI«;oú`÷ºñ6Ásëz¬4êJÓáû8sø¡HóZjòLòl8·÷oþú,FwvˆÌ݈P]Dõuó{=‘mße݆j5“‰—+ØùÖk ë͆z¹O÷fêÄõ§úÛH3—BŸN•>B0_ásîþ|0ŽÝQ¦.Ø}„ G8Rdþt°9Ô|Šb‹›à\ŽkÁ`†.Æ‘bÍÇ¥ê8‹×ÇLZ;¯½æ€ÃÞ‰£.–ÌÝIKö¹Îøá}»i‹ewLiZ-m6ê#t=†ÌÈαU -ß0×¥M×r‘m.U øÓ÷$êìókݪĿWƒ6ü ê5‹= ua¶éVû ÷å)™©{N££ý¦.ÿûxKÒ<Î'ÿu1¬ƒÝû´yø;OŸ«kcÜôUˆ Æ'Ÿ57ì¾ãû¶ëã¬{±öMò\;…¦Sw°å÷Üiw©|½Ðë¿ÁsŸÊl¾¶1æti¯VMíÁåÓ,à¬ú ´yû÷ëGÕ#P“;ù—ª7‰›ßð1¨Ô}åp»†{Åïc…O¾…Š7>ØÜ‹uëàÅW“ìøxÙÜË_a±&T -Môx½™{H †D½öF²[däþÃäùTÝ#`RÖ~YÛy4…//Ô'ÓäÓöÀøåëå.wÓð§kÓ‡)Õà›ú?ß a ú®Ä^¯^+<º%~B8ä<>t?ݾDkóxù¼ü#„týyªuÂÃùÛÓa„AQÅ’Ép¯S™Ì†ôšWWkž†îÞU{ Å7þìÆ®] ö¤{ï¿\TÝ,(¶/>ÊÛ6ñQ‡ãŠƨZBÝ8̽§yoµåµvï®¸Þ †‰•¼ÊGµç«ª~£cEÙ¡¸~é ‚É»}u5k6ΞU…ø¢‡ñäÖ ›´¾¶°ú“´Q’Ùø31G:>l¸>^®F¤•õ´R×|óEú³A`l/ãkeÐZšŽÐµ}ïÄÕ¨=p´E‘|!¯9Ìzž‡¡º¸Yõ0qUôS/ì‹ÃÅx鯂VYÈÝá¾LàZÕm(W&òÞ§ j_¯Ëã· ¿Ä.»Â¹q¨±êìû:9_cµÏ̪êØ^5"­¯nøÆ*ŸÄ‘íi¨0 6tëìl?ºyuF{2ÆÊq|5Áo+¼^oËß~ù âµ‡àÓÊ~&Pc„ŽË7;K¯ªƒÕ|¯9F ‹„¿¡Ò§üêu~î….m£.,Iy©ra¥Î®ojÝíJ¯ò‘ ˜~K¥ûºá30ìÕ§xkdÞ/>|"z瓦ÌJž]FSxGËË¢l N½ØÚ®¬=ƒÕž‡îF[ e¦ÇT×y©¬šJŠýwUq'QÔj‘åBù¬âto BtçÔñé(BoŸ™×<_ËG;: 0ŽÍîÓŽÏ_Ÿ=rüi…Ëdœç†ºý*Ç#YÓ÷ÒPÔCh/sE¯ná†Âè5ŒÅ޼ø]鵨7%Ž¥oÁp•KgÇË»âëxW];ëMý;ñîÜñ X³Xü÷™M¶Þ¥ý©Û-0/´hšÇ‰h÷‚Wü5þÐ_uq_Ö÷#´ÄŒ:ˆáèÑÄÝ|êŠè³—õÉ^ûÑ$)Ö´Þ#p¶<~¹êð‚À#¤á^–:ôó‰©7üÐj–½Ž?û?[ª°ù××3O^`àÁ¿FöóÔwP‹nî?î?´;nº'!Èík਩»}Òzü˜ûªkî*DÕrü=èéÍŠÊ©æáÞ2½n±zDnâå‡ý©¯(ó‚$£_©Ç ³wÙÉtÌÈùÙøðÖá#ÆÏšeyu„§ƒTP Ô. ÓddÕ¯É:L&}ÂÙËÉ&x1íqMº˜+úÒªCQ/µbE€[™iÏ` ZÉ‹/¡ý˶è©ò"W»f-."„ÆN¦{§Ñ-˜çÈoÁӈ梫ߘDU{>¹¦})›ê|Ý6öœSü©íœ ·/—>.AÿÈ%ήыréMEÃÀdÂ*¢å9Œeh3öòÁ<"€)L×&ôŠi.Ó½ÏÙƒ¤˜åpÔÎVmÍÎOΚ:7DZV‹coå|@ã6UÃVuŽ‚æRôøl†N)ß%#~è s«fݾìA`Ì©Û߇ñ¹ƒ::ÿÝwrR¸Fw¥Ô‹ š.?sŸì«{ëCÎq2íj¨} GT¦‘¸Z‚§Š·±©*¨®|µ’Ù±>Ç•¬Î³³Tç6Cîl#<¦Žü 0Dq)ý{çá¡uXÆ Þäd›G$iÞo¸Â¢;aýÛå¹s®}Ÿ¿^·²ùó6¯×}œ`âß•‡>Ìg fžŒª6jž—Ù˜ÙY¥ëߎûÙ cé«Ò©óœùš½¤ÃôФê]º{:¹çmçQxfvöý‰y,ëóÔgódwjôÎû£9rÛk65cEª'Ùá‰:F×"Óã¡óDm:ØIQÒ5ÍÐí|…už‚EWØ‚yt4ô?Úèe¢zR>šâYF=øeúitΦˆói²¨ôaºk”Íw_<í1›"îÝyÞ]L…(œhE¯±ŠŸ –£‚6EéM4«1›Q¿h+“P¯îòíšu,¬†4ÔBÆ–¯^AtŸ·O¨/@Γ÷Ô‹Ôç몡·0h_vBÏq v¥ÑK½þ˜Ñ¦UèæÀµNÝÇ'NVïì­—æö´÷1¿êò´³ä|« ÿ'o|0÷¢‰ Ÿ¡íp²Î´FWyWn÷QÞ)öXL¦caÐ'ÑŸï^‰+T›¢yB_Ž.J¨uÉe °®Ÿ&vhð2í—k"_FÓâ‹R{.¸y­ƒ¢¦Œ?«øfƒïæ$÷oæœ I —Ÿ×µÖÈKÝ«³ç¯Sœ¯©«Ö‡#÷\Q‰v‘ú -fóƒi Dx úõËè*=iÒPtž\ÙyíQÜæÞ^¹úåü"¼¤E+Wóebv«8<· ÖK´–ncý—RøeÎë«¢ êãõ¾lêûž§y\PÐÙþŸ}ð°'–ܱIb…ë4Ããh¡ƒð9“ 6Løà¯^êRp+ï½DÑŸ‡2E!'h¾W\¾>gÏ¢„ ^x_Ô; =[³ð7ôkjiŠLÓÁeRiCëÉ¿‰@v×_*¾,6|ÅÞÅjŽŽøZ÷‡=ã¥„× ]ŸÍ=ÃÃ; öy+¾tôá¤GhÉ4ÝŒ„- 6yêQg줸±@ä·×µîP;<÷LJäÇȨóP®òã2å¼ß僚# •g[œM]%Äzªfóì:dŽ7 ®'ì©Ãf¸Mž¨ ÖtŸÎSW¯ š¨Ï8PÈÉiÂ0™Ï`fjêù˜èòLÞnî ÇAN}Äšà AWz;›šf ­>„óN(»Žð ŠÁ3½·ÇC÷8mÇÿ°f8 øåÚ$¬«Li]Ûwïô1zOG|ùXaáyò"_ý4ý£ÁìÀªÝu·ÁÆ¿Ní‡QTÛ ¸}D˜Çl&?Ø ¯ÆÈn¯[ãGÈ8hzºº`»C:ÅÆô›¾\s`|®®–Ur9ÓhkR¿Hž;t‚¹Z2êiú/i¨m8¿gÿí‘3úŽ­³ã ««è!è“Î ó4«äu¼ó¹ž " ¿“Z ÇgŸ^GY„spk.…At^ÃÕ:ožÞFn|xå—ÎêÍ“OåTƒuÔÏ)~×>¨‹Öêú)`ÒÍa´)ò°w|Ñ]¢ LÍ̆ýÁF{=—ƒ——\žÆø`¾4ûÕ ñ©áÕþ< @eíÙìÏ®$R=**›±‰±›\mt¡eÄÙþÍ“?´óÄkô&” f;{‡gÀ «ö ÁÔÅǦ.¤Ø¿ù³ÎsÁÚ…¦êú]z¼i®á¼xž|û+д7øøÛG爾q©ÀN¦Ô¼Nôm†=’7æézIš…å7yb'Ñõ—•†ÎC©z//A¸"?/Î ¦ýL©Êœý^Ó"ñéFŽb>"üÙ¨v”:Ê÷ªÁêPs…fòH㢓æÀΡÃ;÷*²lbqªfܱ@ (°ê‡ŽMQ×ß5¦T™Ž’øgÐd ð ý#põËmÕäÖàõzär™œ|:Ÿ=V”YÍ“k!›ð@™D§zçˆ9T5ƒùêY5qЂÊëê}ŠÜçõ{§>ÑÑ;{ÍØßP;TÔj ï…3æ>9o5*Z¯ÑEHS8!úü•zñyÄÃíÑëÕÒöÔ‡ÙV’ç|‡þ,~¹¨Î^üž.Na+¡€ÜJ,Û¡yâÉÞy²• uRgL{z™i°S¨ï|42”3­0OºµÅ¥z¨8ûQ"ÜfÛýê†dPP¤Kóû¿ƒNó6]÷¿Bâý³Ðî×¼"؃¢î?°;¥/¬ •çÈSÖŸå9+ËÏ·g]×í^gÍB SÐÊ-Óe´¢>¬ÛŠKõ—4½Æ}å¥?ï¬é³ŠÎÄ€®±¡‰aêMDîÏc/áÙ'Í´•óBϦ ½^Ë^ÜÓKR×¹d H/u±1]?G À'B·›Í!°ù¼YyºÃâ4x÷H» £¿©ó²%¯ñwy-ŽRŸ«vð/fX/ò6Gg÷uëažçùþe„ü£ÇA b­áëŠÎ¶þ§7|….ÂLFÞ©ã^á²a0–›{ǦºÛ.I•ØdÖ¥žù•}†i¼|á¡v=Rü›=qä »yp6v‰ò*—à0€ ¬ ÁÜ‚.£òÃ!T'¥^À B'Ð+Pr|<®Ÿ«pEœ[µ7*cxü¤íÍ8ñüÚ›‡¯ë¬aôûðè52ãðð½*ÍÝ]Ú4Œ ß »=ürdx”a,™ˆ N~¥•SÐ…YEµkÌ©,Féj0]p8<Ù«½›ù[^4¹¹*Âqf&!“æ“3žG’w<ŠU$ûHÿ‚C8÷/n´ooîK—Sìü5 xõµ³Ý|a²àl66÷ ýc Èñç³9xÓØÎ±ì*8Ì‹²˜z«{(y m>¬æÛ©?¯ßm’×*E¨û_ÿó¦ö¬êØk™¡k¾nI½]ŸÍ®hFå¨Eø+êŽë@óÕ PûbµÙK¶vÒNÓe¬ë—Èå—1Ä:N–Í­kEL̃TN·J—?öð~D¬¢ßŸþªétý=íš|@‚±Ö ïïOçBoèy´?™»T½úëÏïCËc;êñzÅCW=w³¨¯¡Ê|‘µˆ§¹£÷Òñ¯ªËˆ°ßØàƒú£žæ‹‚˜ïÝh½oFë y§ü/uH—/ïk¿¦+BÆ$F(ï_QòîïÿfXÞ·V-cû?.MÞ÷/yX¯:Ð1Àüò ŽêJyr*šoa…ƒÝEU_žHˆ3]ëŠÆ «×G$Ôí‰|iîºù^[r¨£‚ŽÒõQ3GøoiuU[x¨ðz÷m¨ ìjE¾£UÐ/xº=³ßfm¼|TB>É)ü³²YÅ4Ôíö NqüùÓª#BnU/uäȹâw¬=;F-vØ4Öµ(v}oàž½c•wu^v&sº<ºÈϵåe»N¸qè;#É5Ö“aÇž>¨d*åý£kñ{)þŽœª™~ Æ%¨Š(~c]Õ cñü–(½³MDS6Vì6~à\“½i_î-Ç‘¯©O{¤R>ÙÂ[änɶô©¯8i,:EÄL÷V^ˆ¨Þ5˜;»ŒÔ°Ýù™Þ<ô~ÛpÃßg汨W½6¾iˆém·v×E,ç[ß«:EMßôY‹kåOý;÷¦ýh3®B÷Tx½™Dø·³ü@¾/J½{Ìm>˜IìqðÞW‘i÷ÒáŒt(Ÿ´75«ï+ÍýF€>ËÞö9÷ž|á&¤F,Ç¥»‡÷=>nÁê4z@×ú÷J” ÞÞ<é"—EÙ¾Iþ ÇÓíKÐNƒÆ»XÀ›ßy©×õ9çùÆ€ œúFç1»šýwt½X×[“ˆ«ù·W½Ô¹©³Á;~[ýª@ÞV{µ/Ørb~ÜìãNg1æïž¿W;±Ù4õ-ísÿ¬Û›VóXôzß·ýL¹¾­~Õî«ùì.P¾áÎ:ŸÀ1]ª…°µ—ô¾fÛÝÚmòFëŠÍìád›ÂÃ~«g—´yzMq`™Ú¿pX™cW4Þ2D —Q>mp¯ù ¨º>´–ãßÑZ|ôÇçyøò®ñ:àüŽMÇø˜8 ,ñ¶’„¢?ª÷Š郿ŸNs˜ÆÀäoê½îSßáp^UÙ8±_­þ›j¿GÚµ?šÜGÕ?¤€é7mßvr}t×%㘽Ž~ì¼mð~6ÞåæhÕ0u­Õß²íD·ZqòöõZé×õÁG-®¤¼”~ÜîSÆùõVÿ%þ…­nÊûÂ]#~2×ø{âB7»rj„Nï ›/¬pÝ—ïÅóÅåba„Ån•.êÿ¹> ~ áóo«~…ãâ¸w.½ö¦ãâwµ‚%{ØûŒqV•¶I®{pòê(›»qç¤ÜlHµ±=™»¿ñ²œá¤wÈw% ­g{2{§Bè—ù}w j‡¿p0ÉXÀd@J¡€4+dýWèzÙ<4˜Ç/ðg==Mý°À³ï)3™x¨_û ÁD ~aOX\•IÊmjáœç<Ù%Ê7úMc5áëv²ÅnmœæX4ß÷ çù6cÜÔiw‰œ“î5_ÁG4×-ä¬ ãÊOüÒ=4]$úMÍ£ÈöøÙ8Q_]0hʘº~hòàRX·ñš[ÖIk[fM=¸3ýVUùå ïó!”순m•ÌØÆ¦ô°]³}\È2GÛùN…J«TÆ¿f ~C=«¤LkÒ2aÇÆd½¾.ÂŒG×HîQXWS1ªµ¹«#kvZû‡uÚ™õª—T8’Œ/MD é‰î„sò>^ªÁ¦®áã¥O WB5ƒC!œL°Cw2’«ì©—wíÜÕÚý‰v,N]ìe)iz9].¤ëü‹ËÝÄh¸òïqVƒÒóòÓÔ1o,®]hÇ›•yÍÙ¡<¢!ÕöšÍDš¥ô_s88j?÷ˆ­¢s¾±Ày%ïmv6 zH4—ñƒsÓýËÃ;ù¤öCÑîÔÕ ¦Æ[2–O±{×]ŒŠ†ŒI…kèAQzU·“7~ùç ¥^Cq;°UXˆ¹V§ñg'~¨jÒá4ŽÆYÇi î\‚¯ðÎk§¨ôAçŠØLÇŒƒw¢jÍ.ž!·:wƒðê|çM„Êê’=qišÜïO<Áã·¿½Rÿœ¦k.Ñ#kŒ¼ÝkÎA˜ƒØEi˜g{lô*ŠÓÄû—G¡³Ç@“9âßyå1À>ÅPÚ¹çú¸KíŠÓ¹"NÇÙáXäÆˆ;OQb¥î¬šÝé?üqD‘³»›Å‘‡é7ªZÔ/±Þëu™C$k§ó›©\þØ °LoÏ®¿ˆÝŒ˜ò™B«yr}`ò¡)EÂJEŸzÿë_îm^]P ®u/,:^íè±F}óód5l1.šæ>ÐÀhq%<ˆý¥ò¥n âü¦ö5Ëýß¡f×~óÀåode¨ö¸ `Þ¡ýˆšØ*xWÚZû¡ÎlZÅ gçË0äµÑÜWû.bÿz;È ·ïЭ{чV´ùݪ©®Õ:üËçýïÕÞ ô²`óòà¢þz…‹˜ Ÿw®èyßÛ[K}¯õÉ—8ÑÞìÍ—øô¼·GèqŒ&>òq©ô†_.,uÇÉåï§ýßÌY¨+§ßé¬ýû½âÈsÓÍHŒþ5ÓôºÍé×ÚŒ:æV{î©i˜Ö4týzÝšùŒÆzºÚ7ÝÚ\ž«˜?xÐJÍÓŸ¦€ÅÁŸàèi¤n^æVàž$œlÛÄøúÕªÚSŒ÷úñ°‡™?‰Cô°³Ãÿþq/¶ôÊ+Öå¿É#÷Ìý]Vo¾<.[ߨ×ÄZ½'CçÙá2„cÙ<–]½ûÈz½’í[õ?öd„ÓÐë¡©ÀnïgÅß#¡½þ<´Gö`Ðnj"|Š´^û¥c„”m‡É4w,j-ÇɷɈI‰Ör=á_ôáÖŒ¼&ƒœ?^ÝL^פyòÜéüöË é}ëÜ~*çÎ-³‡$½VVtxÞ16²¿V‰ Á _Qç*—w¦v|9ì“M´?s®} ©KT{}:8Î9“O!àÂj¼""ÝGèO<:÷ÏI-ÒkÀIü1õ.ý2—Ž‚øñðôÂÁˆPFÅéÆì5Îä¢\Éšu½†sPcªV4‡ÉFŽîT˜â·ëÃË7l\â,±ÕQÂø94p*‡ê}bÈGãhxˆ¬yÿãg—ò7˜èä›;Æ®¼¢ÅWªû_®á"ʽˀ«ke›p·ø}ô¡ª™'¶ a¯1_&©L|«g(zëXÇ›££· 8´FC§¯Ð[G~a§ëóÆh¦a@‘`4ï3+½«3G”  õ*c^9pÆ­ò|5CÓ0‘À„C­Ë|CµÛP÷TÔ8Õ[õ Æyó‹}u·ð ø*€C—²î%D^÷Œ×oorEê µÓ8‘ßXíZ+üUŸ®W™'ÓQnõßPcî5 E® O/ٞǵé'bð†‰Þ°Ë]v>€dîl¯ÿ+^æõyõ4j¨ø®žû¤þoãM­Aç¿ó¨¹âó!©ú†q/sØ÷³}€Of1<îE±âÛoCË˼z2"f§ÛS#é'l~œUי΋œ©5Ò°¾è.Žûq³ÕŽ'ÐMÅzÎ/««r훦Bᬩ^6Ï¡ãÙTmˆ¢´æ<…]URæÕúÒC4µ½Òõ·ÿž>ìÄëlQ÷ËE ’'Ÿ‘¾Üà5Ý9Ç:‹Qá-õ+w%=$4»tVÔGJÍ–Ë0³æ} •T› Œ"ƒ-œ] Föé=„½æøögU‡þ-‡Ò'àì6´÷"Û¢ž¾îˆG³µTOf Ï®Y×åöÀçetœ^Cç\WF^hÖÂzë83¨qGé@é|ìlÐùá5À,ä5 „rC×Ë2^;þÜi9–›®˜mvúØØÍ¨ŠÚ„ƒ~ê>ÏÓ<¿¯8ÛF®ÀŒc厲@Ãyêw/ãCÓz3Xæ¨ o‚èÄš4S5½yâNŠ=P~E]w}f|ŸtÇìÌkƒuÝä\uØõ„!µÃz«$Ð_ ‡cÍà1ãúr}4½†ïQpÓÏãàqL~ºTêéRÐû"÷æÏo¨§eú´SúÚEäW´. ·ªöÅ3E˜uþŽ@¹r™£¦™úÓ^5ÈÚE!ufÈIü$û†òËŒôË­¶êÊâV¥ë ·Šóݾ<îÕBÞÿýt/ƒÎïÐ2p^ï"ï…ìm­7:æ‚?ó >¨ š+ ágUoRož^oŸ‚zEv´ýÕúz3û+ åó»N‡™Åç³aÎØw­ÿ-ø¦’Y‡Žp¿c;ÿò¦žë’hæw=z…Î|ŸU»“ú-œoäõ=;^MèNù¸òaíù”]™S#"¤¾›=z™'y)žM¨^¾<ñ¡ü>ùߘ,¸VºH˜ÄQS€°·¹Yÿ—{H“i1&²õn³Š½p¶QÜgî«Ö޼KG>M-2¦œlåëz|ËFöýàAYbY‡+!”Ežz–ªëÀ¨¿nò×úD])ñ¢»ø#ëÏ,âçEMݼÄ0gkç!ÜìdT‹"—¸Hû3¢ÓÁbÆ)ÞVE{9é6uGò XžÝæ!†/¡Ò¸À§1õ4Ö°zþyèÚtн_£¯þÀ¼¤©Ïv€Ë˜ýb_ó€¸+Æ•v.·âùRlMêè7{þ‡š›”²|ÁÌ8…ÆØÎÀñQ â|£Ýã½>î 'ª {úÁŸ>ëÎèÍ· U^&M*+ׇó[¶pqµã—î­ƒÉy÷tѦ¨ÕÃq:wÄYv¾VÓZ×/Óÿ‡õæ·Õúßð%Të0G5>²ëÙ—×ýiî-H·Zw*TçóJoÙèÃZ¿Ò×üÁÔæ€˜ð«}Ôͤùƒ¾—…‡³0r°­þ(Ø›ý~ 5¨i*<¹ØÄ¾\éz‘7]‹^S¬eÖ¢ ¶€.Èñ¹•Ú$øQî„ HðÇöe|ç<x:R#”!Jr>qzÿˆ¥2î4n¶ó§vlfÊl [áX¤éE1i=í^¡ìê<Œ ©FW:ÝŸX~#–e:Ê/;çMóh+ß”ö²@3\áÙµºM±KëИ±çšÆGŸ´š ®ãØCÙEU¾ŒFWš¾¿ÍqÔÛC£à®¥wÀ5¿Ä‡óû':ŸËÓp:ìV<»Kc¥³Apï' wá9ÎôjÙÂÓ»u¾FŽñ4òåíY|yæÃGWø]sM#FzùUb¢¿™U4»ïž~ÂPþtPæ¡/nÞ¶“†±Ø±5Ío‰frS[ï&úùÓÛãnåüK|>|ôÔÉv=ëVãà ÖÕû o§w}üa÷½@ž¿îu§2&ÝaëÚùëÞµ«eÿâ¬y,7”]JæéM5 {¡„б^×õÁšv%?ŽäX‹"Dm|©xÓuŲ׀¶—YÉ›JÃtƒô\Z;^H|ïÀ)ä×[oôº¡y,è¨òne÷Þ®mç`¸/åT^‹çÁ#”ÊeÄ»®¹è˜±8h™·Å÷õóAýùæŽúÉn1†c ÿ=lVÃïKÁõ§Ru(˜Þ ”šµÕ-¦Ëo~âÇtû=]¿†Îí±>™kåÏ/ƒ_Óï ?%ùy)ÐëT.ÐNשKt3 ?ýÇtAõtñ­‡Ÿ±¯ièk@Š5œüg? f¿‰3²¶â ÷< Ä×ìûom̯øªym,©l>̼¬ÎM¡`zõñ…Þ:à4üÆÓi( ÄóÆ‚Ð)þmÖ ˜”‚—÷ø°nÔS¼²2GÇ¿=†YÅ)½:CI©Ñæáíû÷—öŠìÁߢ§×+¢Øšâפ? “öÝ¿võ¥î‚þPà£9ôºúÑñ‡µœúo'ÊãåX’–qÊòÛ»ÓŸÞàÉô aÎu÷lœð²mÑÎÛèoë/þÄ>‡/ÈxÃI&d b1޼¬#Ñßצ^ÐÁ0¸D²ü·â+¼ú¯¸a0Bf2Ïþ›üW¬©€ÚÓ—)I­`jÅ8 ìì]¾ºßà=WíJV~+»Ù¼ÃÄý§Y+Ðu›ð³/":ïÆ̸ïq±gb=½îÇM²JÔ£tçjû%Hí¿Â“8“ÉÖ_ýgˆõL(õ·ÏÌ ^>I2ùa96ÿíj±ÿö–ÎñgøÑœŒRñçð«ÿ˜r^—^Ó—|]ŸÝÜ©Ñ͞ǂwÞõÇ¿%‰¿o?Cô2:¯*Ságÿ>>:íÕ¦K’ì "¸Ó°1d¿âƒ[xôš‡(è5<šæÁM~Å4Ök@ΰ{TOÇgC7±“År:†y‘RÞ5ý|‰-‚K\cóf_JÂ!¨±?stŠCS¥×ãâ¡‹2(nŒ…î GÀÜBMÖÂ:u&w{zÛñéIå¯ìZq|bú·ëÆ$˜¢iü€ÆGR¹«ði”VWsè«<ÓsÅ¿ömáÿJû–å»–íþmã·£};½l]žµ}]ÓЦ•£Ë‚ÆZØ?3¿­½æ©ßêÐz-¡£Ã sì=õ¯~õÖ-ôµæþµ„Rl&Àš0ƒõèå2Çu­•oüš¬4•8ÞÙ¿ýë>ô²A±u€ªÒz7aÊD¢6ô¶oç@ùŠÎpè*³{¯bCuÜjÒ>Ò!ñë~`³Çk“Z;.ÖåÙÇ$Ë*RÇÊ:΄¬vAk¾@°–þõ´º6­µŽu#!†UØ"'ôI¤ã™M’L]‘(PŒˆ&V;ôŠta"ùÞñ› Á™uE¢Èx¡Ã¾FÌ&à;u6, GÙž¥^v!£M¬D¦Í­õùÌ ONÏ\ñ‹°ðaç&>„,’G´£âê!_Ù cšuÃÿ»ŒÓï{kˆ²B~ž@̶÷ÆéZ[­µÁƒjµ°66YÍòù<³*©¢r t#ÔŽÿ›~ª8 ‡•êè<Ÿ¥Qym Ugk2áìWÏ>äÉ&ÕŠÊpPŠGÌÔS+ÉÕ[zÖÜ,]“‡´MK¦(ó–S°S]é­³ãP8REQÐzÜÚÿ^¶Îk†‰À q˜ã)ÓÚa„C£Š*ÛÙ¨Ñ~Çóèö ÑŠM--‘×ÒFæ\ÈlQ§àZ`ª›1þº¬Ï3 lN]ù×Ãè¹u(ÖådL&Ye‘¶NÀ#ÒªõÒ=ª’|† k6k$¥«VÒS e=;†O‹UçÒXk)>³ÆýÙà>Ûj#ÝX¦¨TÖ 2În®N›‡ö :1Êãyú¨Ñ-‚/ÅÛ¨“;ÿ· GPÏKWNç6vIÙYGËGµt*«¦Ðuú)FãÜ/;´éš¬ÓDTpîVøhYhô«²Øº/Ö¶±8Åië}í hÃWj`¥Ô5@#ƒ5U¼ClscÅ5Òx­§«ÜÔø«‰{Sº„lMÁ”Öº6åµ’õNòøÖž7à6ÀL¡ÜÜØ¬t{í|n ë“„›m•·6hÃIƒªÐ¶6NßáÆî”zSfµ uNÆ–umšÆ!^k³umBæp¬Ë&µ6V­Þkû}УY72ÔÖÌRÓÍ@™úb¹Ö`Ï[?#³ ±6ÀKuv]šÆÚšæo_vLˆõk¥dSv ,æþ<ð@ÔÖ¶)JUÝë¹G/°UÍ`Ús;šê9ˆ´Bþ€„nÏm¬ tìуZ²áNµÆ™Ö=¢n[œÎF³E·cßrû‡Ù‰ñlã4Ìjœ“ÿdˆÜ0`ðH;a*Xϳ‰TÓà¨Ï)6ÍY‘ aœ,»Zƒ¼Ü`šÅŸ]<Öí$¢œêI—¨<(àë¶{·hqos=@ðcYC?eãD€‘Ú$ ­±N#BjÜH¶Úš—rº™RÓH©Í·Z×#Uµ>k §R35Ce¿“(^Ùý¢ B[¡½a N’¸ÑÖÆòêÖÀT2ÈOºþþñ‚uJ#qj‘›yÍ"3Í]hØO˜c“ÒèV\߯å*XjòaÜ\‹ZÉõØ10“v8ëN,ïâÝìÇÚ÷³Sš Š"Þ¦ÎÊøãl°BÌùx5Ͷ™2ªb™éfWè© ¢ Ðd!hÑí¿$A}ºuß7âå@ÕR»ÍnEMÚ&ì´ù™S„äBÃr¦'›KV/VƒKîXk*lËßİ4‰hRUT“ÝÆV»pI¦‰¨'7¾Ìçâ^*]ÖµYjý%¬ºmªÂã¢)ÏFØ•þ'õIbM¸ñ¢#ÓžÀÔ²ÐO1ÉWÿB¹7«µ/ð¤hØ›(Z1A %RrøÙ•ÛÚm±:ª¼ë“•H¸=Ó›ú4UÝñ¿÷†ÎÆïÖyë:aä r/5Ìì<¢ Z ¾© í9@vlÑ=Û(–‡è¡ŒŽW˜>I´Ð¼7Í”U}5®m°dèÕ*ÊÞTOÓ³é@ eiº¹:Z;ˆ§yôM€wc¢C©bTÈtM” jŸ¢WÐ~jC…(ÔÆ&W£ÐÉZÁ‹µFJrñNY†1ÝEp@4"¬{ã«L§y«ÖÈÑ$pk±ÁAh³J=ˆpAx šÐUÍÑ–Á^¤µ¨zÈ«p…E# ×fÃK÷4 ,õŽ?'a€+Ýq¨î8›•oÖ‹ºžKJ1‚ªÍвªèêRÔohz¤×”g Š6 ¡êÜÝšoŒ¾ö<8œù-wŠjoÛH››Ï_©8Zøpqµ€´¦( Ll4{«Ü¸Ð]Rç©ÒìéqÚ$rS1YÅ3/>ÐîIR ´ñamÕ7Ë0ÖO`ŸÖ»ÉÈѤ³y°P4þ; £iòZ®Ð!§‡´BÖ&™‡©uϜ˘hY-J«õ”y¨}j‚ ­â›6͘ñѸëÌ¢87pó±›Cpø Æ]ÚœXc‡nq™Ý6øAê«–/Þ<šNøœêΠæÅ<Í>A¶³Ø”†ï6´BÒð±ågqþ¬*îÍ,7- zÓƒÒŒÅÂ.w9¢=¡OQTeºßU“™{ J ÔD=0®Û‹õ)’ /U3Q›¨Â (l‚µCŠSuì‹…{ÎĈ›º/ˆsáY]7 >xÜSGaý¼{fh«®b{¨^Z‹& ©8>Äçm÷übȃtKßTicþ›ÛÚhM’ÓÞÒ£n™“hçjÂŽU¼;о…ÿðùB4Á/¯´‘J&ƒä¬TB\?ä ø^Ô6øËöP‡žªÝ ì­Ç­y`¥é+±)ËǤ™ê¦ùt1Ê«Nî[3d:po]Da71A€¹Âô¨ÿº ¹«„è¦2øHÌ?€üXë»àJ¯Í¡]p¥5ØànH"6o¹E}'•oÓƒ+Ѧ€¦Í¦ ³³‡6‡k>s¥7€ð¬šÚ«)– ¬E8—³=D½ÑâlÖ±Ñj`(ûÅiïÈ^Á<Çf‚ÜPÀðˆiàê)Ùu¥ÈP¦Õ\E•‘6BQÊèj"5˜}eN¼¯lcIn%`“Ï‹^EX„€Tt]ZWe9ê§gŽO ^ˆ³¼°šÏ¤ñ‡h’]“~mžžjj^wN>7ÄÄŒþ`ìĤ&¬I±.bŸ[2›­QbÆ9špAÂ3¬†—жLsÑ5eÆsM§¤êËêȃº¨‹eŽê1ð†® ´“îCS5\5â”hÌèrmÔ•ÿ?mOb µþö¸ ýz(ŸÐ ‹¿Ðxtcz2é³½ ͆€ìpÚä4ņp«‘›Fî€/"‰ì&ƒLÐ!pÒ@NÍHA¯0|ÔÌP0‰Û|õ&•8f€”è“crŽnzTSåèê@¾ - 0BÂ-SáˆË*z˜æ–H_) :?¤82ø uu¸ÙY …­ÚïÄÔaU÷¡iC‰üÖÔ¹¿ì’Ò€º1‡óÛ9d©×Ü“þÁ#H ƒ¦bP×$–.%r;Ë ËИWs,kUݧv’èYŒ\Èí'§]Vm ¥ÜšcžðÚŒ°,¡eà q(sµ§™•墵t©@]¤J &LÈÈ I3D^K– .âÕÑUÖЪY¹ Á‡Sj-!EߨRbýu+y4Ìl’¤¥9›y§£Î3†¯ëk²JSdÖãS11”° ´H ƒ§YbAæÈǪÍ­ê.áG>ꪼ‹ä 482Ýœ0)uBBó)†[Ŷ (oRµu>¢BAOT£u¹ô»ÊâQ•ˆš¬•¥u ¹žH‚@«PFÓTÃXÌE™ûÖt^QÏú`ÖiË$ú²ñê–N×—+tÂÙlW 6MªñÅæ7lÆÜ‡ac>¿¾,Õ€L˜l“fe&sûŠQ목Ýæþ ‹û+Ö‘à°4¹ƒEÊpûéÄᣋ>c‚µ+ÛÕ=.Р&‰}4òœ°è ÔpVÁغ¿×Ð3­}Idé¡x:ÈVs˜U—µ8uƒáÉ®˜×ÊÅF#%ØIu|š§œšOÚ¨,Î'ÑÕ³!eëVµ¹üÈ&“Ïž´Åðëמ„͈ö4{Ü©zž½‘ªÉWfªQ+kVêy]º6[9n BWfÄw"›ú57F„<Ù:¤€v“þ‹‡Ñ¢ߘ}>N8  CуžñÑ8 ]û=,æeI4‰^’ì ºtBÆm‘ð)AÎwDÞ¶ÍN‰¨óeí&}/š„5»Ï{uI`ÅêX›M‹%6¸ÛT»äR—Ã6-`cVãÒõô kK?[¼|.Wf¢ENØüà(>k ¥û¿Mle{­„cUËí]Ž[ç¦0w늬®Õå†>·=Í«„t‰^ÚdY»qg#1ÜÃܸD8°pôtbÂ…Ë1yǧ,ùï˜íÒ¼<,öod,$CáG5„/‹-¿œ™Yëæ>”N p+³È MM¦.ÔrÂÙ±µ–à쯛$ UG¬È®5 këâ㞃‚?tÓ®H^l£é@6¯Ç0Ε›¥Ãø;-!Ÿtž®y·3n)ÁêW’e4l‰Ø|ûW KN7h_£ŒAM¨4·[ü¤âQ0=ɇ#ï|®Øé°ï”W¦ê+’ôC˜•´v@­TpXÂ¥ÆÑ¬R‹šš d¯¶Ug$(ªüÎŽ.þ<ܯi0s½;%s„õáPÙöòf~¹Ë7‰UÙ“@…‰:ì—‚ ¼¯º.yX»”m4аrÀ dÜ.X(W%—WYÊ“½ù‘ðOÄéA”»a-)Y&Ÿ~ËÁ,¸8 X5]‘k¿›Ü=£l‘ª.u¾a§ø>³u¡'zÊb<¼Êf›Q™C”= صù¾öéÂᣵƒe•´²Ì¶@o"¶P‰„_k×ÎodðãŒ,¦ël4?¶Bý°­QÛÑ2lÓýà ۬¸Fûð-Q¾4r8[skï ¤Ú)±d£nE:`i§¯ªQ‰Êî‚&»¥)CØQYmzE!^vKº ÝÈûRÅK16Cj¬È´NñA+BóŸ„aÅ ;¶®:á¤aã„®?’Hµ]–ÖôØVã¹óhúäØt!X´½2•“ÖT ´$’_—BzHÒÈg⎀«þÀ í f­I³›àöä¾&ßÁΜéÞÃÃê§ešÕ ƒÁv‘F? ßMŒ4_4¯Áù¶‰APíb·ùMnb]=i!ûרÞ6Û󻆌sî@an-…úpË”£ÑFh-+KØááNܪ[e¬t©A0Z «.Ùö1‹oü¦[³)By´A7 ¸›ßWíVÌÍ„÷à[­7c÷C•r=SŒWVžibaû[:Çí[\´`nÂ=‡ªI·ÆCHbÅA0Àá“+’ÝóÛb¾?¢äÄL’Høv†–Z[»°Q¼,2ûʵLˆ{<òÙYºDoBv‰µ?kØ0Œ­&ͪŠMÃÂ> 3l“ÎÁÏã±öh*¸9 º•Y{¬\Wn8)>ûjZÀŸ˜ÃJ—aKáržš´‡®|.9%K@áGþ­r³m‘Ái:å8·Ðb"g3?NAÔ +»ëJ›¿¯t—N®]» YÓ)dWwlöÓLS›Ú¡¾#TèÀÎ2q#Ag“]"¨ä —\šª›ó ¬‡…“ÃÀã4¨iÚÊÖÆUSåâaÛú„˜`p;L×Id[|8ï¶µªð~p™¨³ë¦„l°KØ(ÌÀ\Øç²ôI%€HP†ã`‹èµz¸-AÀ#qP•ä‰Å›tÛÊÆêÕ—u1Íu?’%Ùè$©!Ÿ§.KdúÉÕ;»®üÈRÇ* Ý‚d?ä¥Eñ (êºvÙí®l³tXƒRäT[ïé©¢ôì&ø’®^_Ïãòtª®Œ,=‹5{–‘ÁiÈ7ý"+FGS1² U.'(‹j6¦š¹–GW¥.’PÛD¦itšéAÀ–ôã ë¼ô­èçN­ß˜¹¾ldMZ5+°ÁXy¬Cò*'tXGMtsÊöD¯È l‹l !µ$úôÇ34¡’˜á“e8C©ÁŠØ‹…›Ýœ(YÓ3›sR‰…cF ûнè6KgÛ9A7°vT;oÀ,(òË‹§ i'Ø„:¢RÑh}Q‡q1üz8óß1˜Jæ)lÏ…Z#³Þ¡-¨›…n㉥éÓspnOåšòfLy;Ìz0p„èvݹ(g›!×󃚯Gƒ×U|*ö•Áþ…«è‘Þ°æ·ŸÄ6ô(‹¥J8¨5±ô”ú’lsò\”4  ÜÎ(ØÐ¡ž:vËYdßÜæjø“]2¤—õ›¹þ5Ã{o}Ò鉥&ˆ»HEz1 ´ñu—h‹8—\„ƒÆ »ØÇQËÓ=õ¼šÁçgdTlÕm‘'vø¬b,Ì’5ñPßAÇxn5ñ=:.1HäF ª«¡ž_ë©‹itdnœW‘˜ªeñƒ¸§¤.‚;iu}ýØ}ßb Ž"O+ê주è&kŒ +ÔwŽÕ¬!#”pϺ‹'/‡¹wn/V5‚ ¥°¢ïÁ´lfî™xîz‘}Æ|rnÜõŒ¡y.EÎn»º¬[Ç8k=ux=¸Å´:‡ð¯ŽÏc$ÅS\Ø,´R|6`“¥ÙˈˆD·„‹‹¬Q'eöè®gëºêfZÚœÍvâA±Çõ•Êüos »+Ä}žÅC]щCÆè†|º°²l«îöWqì&: Á|-Ê •°eze¾ìDbþD C{CÇ…žtŒŠüñªa…‰jY”„÷‘¸ ¯Uä9<vÈÐæ²°ˆ#¹YëÄüR%ýe!æÔó+cö³ !MÁ¼²Ñ!«&KHuá\·âR¶»3Ç*d92SÁÈ•a W êÁU&ÌLQ¸Oìe²ë©´ÄW=ß½ÌÝ„ÝE>S— ¶…¨Ê’~ºŠZÃ9f#YH=‰ÍŠ\ýùÆYð3ÇÝ@A«žâØ4ÿ¿îÀ«ìYjäÜB¤{G“ê’Ì¢pÖ’çGÜ(CªÉ&Ÿ®w©H5«º§ Ó/X˜ö—ïç©ùQݲÐP’žé»#Ñ<œ ºå`R–#,ÌØ•!]cQÀŠC¶+Ö¬@JÝÈÇ3‹°ËÙT9Q»÷å­‹d'OF!LÐÀþ¤¡8²îÓÁá‰~d‡ €ëíbeƽéœþÃFNJcÁöh^nÞyh´³âH¬9<¾j,ç$OSPØ‘½V²¶ éÆš¸„´Òé¢ùw.¨r¦.m¼|0wöì'€Ó o&$ñêúûkµÌà"™zžÒËqª)ÁLiÜšÔCn«îXOnŒÞ 7Lø*Y‘wlòµkz‚känÍ–³ 2˜.ܹ+㦊,kÞÌL?÷¥¯³ì[¿óÀ6Ý«}vc°sï)weÁK<ݰÙdþmç¦?š¬Çt¯…Oë‚ÙŠÇdóâfMÒ0 Ôuh[–¸•E¶ $_Þ‡¿.‘&¸!RÕwÔ&“›,áÈÞZ9Qpö+éŠàçFå¼!áÝ5Ñ1¦A>í@®õ)Q¡¡1Ï~Þ•Ë“§OýX³n¤Àšõ>nOäúm’5\N°ûÒ®aÙAÒœëàù莆ƒÛ ðôÌ9â+ès3»ÙйíqHå`Ì(ëQIY¯:Nó(¥ëøÄw@fv{‡\ª#!ª†z®·.]ÄeÙ# ×’…e»+Î$ñÌ>òð²)uYdz£²Ð“ÕÅãa89R×|9C³ê†¶üÜd[öÉÊ‚.¼èæ ˜ki}±Jƒ­r4ïXwƒ{ƒTÁª÷ìyär=ØI£‰D=N{kh¤(>ºT‰»e½ë€!^ =]@måÈТ›½ ¥ä(ÜH#Ru1ßb¸F¹=B÷Íc™U–¿ 3Œ¬Lì’™ËpY Ž˜ÿ$i9߉òÔûyšûÌCK®zWz Ž’èiG¤pœ!ûyhËÊD,"¶™ÈöK±é¯g—z”¨X¶¨§ýÎ<™pfA>6çasÝmÊ~¿CH«¤¬C¾Æ¦":Z6q&TÉp' È¹kˆµ´\z \ýÀ–†éª˜.ØCÛ¼lR=ä@õ¢'3ÙQqU*êÝ%Í@øv¸UULy! v]¹áÝ"šN:xä÷à!»%é] ) ›WS`ÓÎÏ\˜8‰ÂÕØCêè#“'yÆ‚‹Úd@¨{>n8Ø©ˆå,Vs^@‡´’p7O›š êp¸eͺ\Ç3éµ'ÎãÔäªhe5ð²{.1ÈÜÛÂϧ,Ⱦ¨Æ«aWpÖKZÚdÃ=9IOg0@‘­lBJ3=8¤~v!£6PQnv†Z«z¬‘Jb§ZH …\ø±?ûPÁ=£Êu^hp\|% bµ_ £ iÝl‹—¨¼?yœ5êç%ßISm§Ë¤ø©Y f™íþXÎÄs’›8€\lÎðG²áŽ*¿d™^Cx:­'¹ ‡±ýP—-€ìàã.sœGHê.âŠ#ß×´ð¶îÂ]"’ž ò™Ê6Èx泫ÊtKÛ¢÷¹(ÐÔSÑE/qBÀщ·À½Y adå×µ}6mOžÓse*G‡Ê‘]Z´Š+ ÛéÔq¿$þ=ŠÆ)à@˜Æ:²vzÚšq‡Œ—¬F"†ä¹t¤ë—æÊñ|»ýI÷=P n÷qøÄ„]ØB´ékáùXÜÁ%³1ºÉ[¶-áV§Ê-ÿ¼ ]|—¡ØÊa¢ÁßÃί“üž8W£E¥œÂµo¢žzËÖŠ[R ûzµÁÅœe7g%\·T%IRÕÔ¦E.—Ô¸£“sã¦Aº(9\ôÔ«™wÉ{,r…^í¢l`+Ë‚ÊMÔ~>º†¢$#°š'YG¸Ò(º°yÀ ö]ê\sÔæÓ¨ÚÇ–zØ dXe£Ž5+âÁ§¢zzZ çévÄ÷àÔÄ.Fj鈬Ê[Ö°~Þoç]‰=nÝRfÍìpŸ™cC­‹Ú`.¶`.¸ºIǯðî$úV<£#œŽ;ժń¨õ”EZz=$£šp!ÃJk®ç#¨‚åº@1°Øw­¶6Ù€²¤å2ÂNUud_¹ÚƒöB@掆GóuÔ¿ž‰#H‡&ލÄÊ»ßÍ͹9èüÈv;ÍU¹.Õ¹31™}·Tv¹Õ2ilc–K´6-H·†0°4úØ„'©WO«¨§ÑI±;G׃i9µ…fÔíè µ21ÉîˆK ‡Œn>V;7î;âõ`¸}{”79¦ºÕ§:NWOLÔí¹ÑѼŠh‡n¿Œt%Z¿uU¯38êÔŠ¿ ñNêY*&@ª;Ž ;ÔJˆµzRyºaÉr«’N9Á }Úa~e8[µ$…ᑸû­´c$µúˆô:NÙdƒ{–ºë|’M}’è ¯ƒˆ8v~Ⱥ™Ü';Bô==¡·9¸3%ÂÁåѲ:zÅÆ®»ðÞv/ 0¡ˆ\0‹\z@“£¢¢[×}Эɮq%«pEúÄN=@MªÁFbJ梄c“œ—À°Z½ÎÊ~mæp¯i·iÑ]Ùr\CT"Mųß6Öõ¢¸‚YòËÈ2I~ûÙ/0ì<•žz=ƒ GÂ'A)¼å§åɈp*é½_Ý8úÛL³K(l¯^ã¸^"dí–˺ݹ²W6‰PnòO]ÄGôpEÎÄM¾pNß 7æÃ¼"¬þŠóû°L÷ ËîuÙ!Fo™½J8éœ)Œ»*ãjºiªn ³hžÞ©:-ÄùYŸýRÌèOÊÆeq”ì lÇ@U ¬’Þ6…¾»±§º±1nì‘5룘Iêý•æ:éÍĶ+„!Y«¥%âtÔè¯X¤¤š˜‹:8ùzÿ¦¬x©êéÙ£;ÿẴDÑ—à^k“QÕ»ÞZ=rÑ.] f}3æ.‚£]‚‰]•*Á—Þ«$qûÕÓ5Þsê!ýÃïKÝTÚe âÜ>r·\‡[®ŠZ´ôüó¯r!ÜRì73} ¹RÔ½ÑWž×5þA‹vÎL‹UN óešÞãï]j÷Á7i_>‡Yd×®Ô_"Ozh$ÕöÉ+SÏꋬbËØýG²š¶„ãOxb3„œa‚[jÊŠ«ÿæÆQ‚Ž©o}êõ¸ŒÁeíS&Ñ´–ppú›Õ«tÓAê=K™Ï¹aõXú°ÉÉ"`AUì‘b»wƒm«><´N’Î1§ý§Áǧÿ†Úh“·ö2³Ãȳk%™ÌÀŽ£­ó€ü.Žr©ÏÉm^—Éí‚ÉuŸt¿s‡ç V¤½íaã‘wF:ËBÏr&ïéàGößÜttÒãøkC;?ñ]Å”#'ǵõEh4í‚–½8WXåMþì2MäÅ–ÈØ<Ý&}1;ÐA.QԘʓ9›†êL±?/¨¯Ï­]ì6êDmcŠA¼(˜ð\üá½õ&’fùúoQÞý÷êÊ ÛÅ®›³ fõ7Žr¬¼°‹÷ƒ×¨Í—m^sÄúâµó?4m‹SôInŽJˆÕO»Æé]ý”b}X¿‰n«ry/®kð÷Vúk Û?v¾$llÍI¼>l¢HIVºº1Êd_öŠ™»÷±:íª~S¡‡ÓúS¼ò.ÞG^xáêÄúäYs;HWónÓ ÂMwxqjaëö7¤Â VHqæ› VÞ¾Î\üQŒÇü†<»`¹‘”yå/ä|£AÍ™g·±Ë)q"”á„l~Âmõ9ñ9ެ¹Q ÄŽÜtÐ[IruPÂ÷„Œ@U@€„„ýØ­kõˆ«Þ^—WNŽ·Ëò‚*à! ÝJpqR9£­Î«h™"®#"¼´éÎRT²ò6p;64¤M„7‘¤ÊóÏÜs² Ÿ$N/_IÒ!¾Ò›YìH½#Wõ$y=ac¦*z¦›“³¨c‚-«»…:á`yÊ„A”¬\ŠHõÖ£Ò=8mðËù·®Áòg²V™”&ËŸU¸)rpæü»°ì D)6:§º›Æb¥õÎrm†®tžnùØUfLȪ',t$QN«ÚÇ”ÏhRpŸNN«¬CÑIØl›°Ý>ãv‚¼J\„ËÓA~ߢ³KL®æ®Âaä]Rüvë…!¾¸½ŽÎOÆ ÄT·ÎÐÿ8 ˜òÜ{̸Ѥ8íªGV»@M”’u°Í=J+Ó%»f€uÌ©fePá‘­û1¸Ä%­Œ7“¼¢$7f¯"~^بûWó|ƒ5—kDd»EÚ5C(ØHZæ…§Ñ’(/K J«zÆ¡UãLŸkäèT̓[yzŒ[˜7ž@ro ››N"÷5D¸>:ã8_cPp¼Úû”9‹¼R-d,w†Q³¼¥"ñ”…ëߤSÄ‘ÐP9凣°iå5°Õ}–ýè“OGv¿J'š8cŸzÆN·„=Ý)E×pÕ?¯‡@.!vÛ%ûq?ƒ:àÖxu äȸ¥uÒðZÄ ŠbJ´ÎâÉC°KRÕ¾õе+Wì†Ë멎Í.Æú`0¨œ’åY¬9®†LØ4œ±Ÿ>¥h,d•ô öfñ<·ql$C;Ÿœ9ˆ̤*‘3îÊH8[”é™ì"P+ý´œèaÕicŠâ²S‹R=gAs¼i¦GÈØ§ª ãÓÁÌ'Ë,­´”FâÍ.¸º7¯t3󲦑ÙÓž;§dñË2¤0û8Ì–piG:j Š—&‘±UÜèÒ£­ÃšåžÒ„{WzÈ™á¬åÌMtP÷µ'Û²9M¸Í7' ½’{îYÎì~ܾjê£ø‹i h¹S÷r-*rhÀ¸ÅT¤çð3ïÌMa6›Ù¹²ðò¾Qwà€IÚ©…òà¥Ó†‹ +üä6H/®——¤¾W–xgÚìd¢Â‘ØtÞæyxø"¹ìJJYºN)÷)Tá¹$—Ëöˆž y†À„­§+t›ªMÜ㱄&‰¯~Á…Y‚ ³€VI‰†u™Œp!ÑØñ<ÌÊ­šN\‡c‘œ:4TT®ÕÔä §gÖ£û¨É½jÙ¶­sëNé€Ôy‘ìÁþZ(2*o¹qyKÉj-&ÜêÁˆö«9`ket•Ù|uDáu’Å9åbØŠ#èVsæs\ WuãÞ“}ZlÏk/Äú„'€÷2ÔÙÄyÀv‚Ãjù?œØÉCªæ8z/úJ´¦]ÜnŸ&>¼[¥”˜öà+/*_`R‘qÑi×Fªö²E;»Šƒ‘³D™[]#ž3rˆ –¸R—m¥µ®^w&¥ïƒàâD–ÄaNÇ©AeJ‡.RÎ$ ¶J7¶@$ì=ÉÌ÷”E³JØûŸ“™|¬%œ&È|ÏDÖ(*ÉÉø6»Ç52 ;êòÂC0’/äú¶T'nã8„ ø.°#çfÝꆨH—%ºðÔ§ ´x“r÷ÙÖ‹ò"êu‹ÈÏ’LÊt•.n´-IGY7×]\¤ŽN¯e†ß²Ñ`¸ÎØ°ŠŠx^uÕ»©Ä³0†T _b?.uN8x›±á }o7ñ@Äm¨{TÓG°\ãÛŠøõ»ètîÀÆUÜ”™¡ ÎZen Æ¹—Tzd‹S89$%q\Ö,/–öR¥g¹22®¢¤aè,¹Ò#x)£”Œ«ír*êÙ \Íqø6i½ºÎIH´«£N2j$ƨ‚l OCuö®’¤)K çÀózD ?×¢f\#8Â×fÆ*8ZžÇdoF†­‰›†—èenZ7qŽ3,‚^3]'¼E&Ùýäîh¼ãÎäi»,×K5¯ué˜_ƒmekîìé'ÑbŒY³† áI]ƒˆké _}0PRIÎ)y¶¯qÙ1áh‹%Òɉ&Ü “ºxÔ¬âNefà4¯ûvQ] Û#Ó.¡UYB 'ª2n%î‘<˜àÈý=p礓ˆÕJ/â•&¼˼RÝ8’”‘2÷,c³`Â>éÜ$#C—Xý“CŠ–ÃŒ¯øÒkõìŽñ±d"ÅjçUT¸jŒ³¯âÒМ<ªÍ¼…7ï$jÓ=çH20ÓÉlQÚÓ2©ÅÇ àAl’½¯Ç˜§}²x {Hp²¸ñ”d^ ø…a °WŽÕ¸ Sw.1@Ä-'ö3¤,ò+jÒY™-3ãª,;J2ÏàGaWÍKˆÓNÔ4¥ìL ã|á Ü@¼È©é;QMY¤ZS2f£(ÃBbBä"Fó¾LEblÌZkwÖ«š~ØJñNR mÂs/\=H<ÃÝ&¼¹[ä™w©Bð5Ÿ© nªÐ5¼ˆëÆ[¹jÂ}t;ò&hÌ,ñ¹Õ [IQîæn}4á’±&{piãòj€ãÖ•„kŸ3òÀyÕ$Ô^ÜI Úti*¥]B5 T5Mf®ÉÁKÌkOÿç$vÿÐEûtÒÿÊÌ÷¶ÍÓýaqÉZɽbyI6eìÊU¹4I” uzbI—p&­}IF^Ï’ŠÖé„H²ä#'0òº»—îégK%KGýì–¼èGe¨ ¹ÈƒgNŠ’šEØÒ™p–,qsÓ!ìté”xQW'ë­ÓÇn‹Œ™¸}\QV×^%*“çO— ô)ñkÞ?ã¸R–7,dÝ€ )2×x§Í)3®«Kxá{»¤36^ê»IL ¤ªô6IöIŽÙ³¿º8ÑäDwyÓÆ´U;•cзâÎÅ5>Rñœg Kï©dÓ·æú`^q;Q^‡@Mü„W$¹•Aù.dª¶!ðKY6¤3$ÿä­é0EEö¶Êsi=†%ä¬ù¼´Ñ¾r¯ܱ¢¬È<*/Ý*Ìâ“£pÕSÂi¨Ìwë&DNØà™pÍP*›¥òÊ¥#3i„ÃÙ#®ŽIXaȶ§EÃù°¼¡ µœÐ&9רO:ƒtK42±[ÅÔ¡±‰Íãõ/lB@–Óô y ‰ ™ÓÐ7|Šá–eÙ•¯Zt3ÉíAÜj¥¸Ø'’\ÎæjP#rÆ’s:i™7‹<ņ§ùƒ&¨6eÓC.³t¨ú~1Ü£šx¥ «é•÷ïp™&nñ”€$€vËPø^”ž¦¢1–ÄÃ<û“—“RÇß¹ZкR…`„A­@Ö¸W`•U„•‡R¥7ËÛÎÀ UL$N d^`eÙ~¥ÊÁ(tÕ…4¿\’?“´¿³ì8éPóT‰Ž\HùœyX”$`’TÝátêÛßÓ¡&”Æè8‚¾ª\_å¥^®p]Ö-«kh/§MDLDö û鉭C €˜}=ÏB–å €»*˸M&gœ¢§ÀÒF¶¿…ûz€E‰ªO Cî –èàxåiʤÐ!¼­°Kž]÷ôL’¤Nª²ä³ÚêÈq¡m× kí\v4[¨—Κ é[« E^øÒªû³t^ËðzÕ*MsÌLBJd‘LÆÙÅÖÅ7‡ˆ³Ñpµö9eÞ/b¦#®Ð¨ŸSÔýôš}÷[ŽaÆ&÷òAnLçz²gejD$bZÜn›¹‘¸ê'‹$ºÁ^–B‹å³/åÈ1.%¼– *bï ËûU²%Ä%Ý‹!Äèóv`X²ö%Ý iR­!o·Ë¢/ZÃM_‚˜}EGÌ “¼jrã%ÂC*ú3˜èrJt Ñ9¸<3ì rP…‘äjïVAúvJ7›¦Úwüm²UKÞÐ`öõLì–U!0Ü;/¢Ý}Zg ÙEÂ}\%/îHeQÀÅj®Hããx÷ æӃçhê0ÆwEn‡cæÕ'„qcΑO]t‡BæÍÄÈtÕÉ(,vF«%¦ƒK¾É´™çyxœ;µSZÌu\I \#²ØbŒ¬ÓWÕ}‰K¦6AËgΔ/98™|̙܎ñ›u“s–+aºd‘hå& ÞD€d‘+˜é G[&é-D¬±k’4Ýá\tor.UW¢dkµÔ( •÷Ne›Ö£p«zõ%JÅAâÃÿä&\\DÕ©¹_hPF ˆj[£z÷)&z¼x/MÂÕ"ÙÒ¨ï@ËØL’«¸ÿxaR'ºÂT¶Î ‰»ñeÉ«Ýét3— y=g±gXÏÍÜ}¸¸½ ÓË*6¯Á¾ D°LÀy8(‰ùÓV÷ÈÅJ=oÌ`‚ºI•¯BsÑÉÌøpɉËmIV‡°h’¡dsæ& Él09Æ…#ýVœìX¦Ï™wÖKVR^­’W[ßÊѯ¼r³°g ¤ø;ø¾ÊS©°ÚrºÜ Ý>e•.ÑêûÿÖU^V@Š6«¦­ŠÄ.YT6Ðä¼³XTºæ¼P+óÝs|5$Y×JÅ/)cI7¥5¬HIW&íà“g3:Ü¡”K uRÊ¥¾Ržqž-ç4«¼’@…U¤‰rªÿ)÷vv$ÉåSK§rߪãg%"Ã2  ™2Þõ˜¹þ€e~;~íj7Ô1=DU 7ç¬ÂÏ·¼ªdTø+Ï÷ø‹\¹c ‹ÓYA¦ILL5#”«x…¸†"ãÂÓÄýY2çŒm™9v,ûg]öϲ;ê<-ÌVf2OɯâXGk€âh'#Hbº¸‰“¼¼Sa•W£Õº;–°º’‹xUR1ÄߊŽ33¹hþ§Á¸Ê §½ÍpÕ¶òÊÍ–mJ5‚ñ¤råµÈH e6ä‚FÖW-l eCOPÞÔ·¼«Õ÷gìèÉÜØÄr«,ïÈ©@$ì“ì°õ­ðœ™¬Õ݌ĹêfÅ]@·„µÜƒŒk1„a¸V©  3OI§°ŠApÌR$VÝ…G6Ê·« h¹—¹inM°ðÝ›>Ml2Ïrs©Ê²Q‘#\Gàj‰2§gX÷(«Uv)1p,¢e@¨\;Ó§Ýæš(9A1s§!‚*‰÷Ò¦d-ôI|ÃWî^WÖKÃD£‰é¨GW龜ÅMÜj¿©_‰UaÉÐ\ FÞTÛÑx{ †‹±òA¼Ñ>‹CQh°»/n®ƒë´\äP¨¸´! ',Öäì\¸»‘d2ÏM^ôhV;üCà G` Kôº§‰Ö'µ²°¹Ÿõ’×y+SÑ`/96¬Z›e#g6.îRJ‚pEtªnØEÉÀLqñN{iË¢"7›žTï%ÓÝÃ7aÁ̼›Ó&9Œ·xV…N ꈷ̱m¡“¶ñ饚 ÈHfe\½˜°ÿ'g øh‹Ì3¬€øØ¦VÕ­€™éþÅõôrQ·âÓIÕWvÞ¦Urç.ƒóêÙq]zŠœ!9¬xÆ[w ‹£µ´ã.û®zftéYgÍl*Ì»Š‡&ޏDŠ¥\¹Gò$xoA.G_Ì< »c+û‡ _"ÂCzqC(÷des=E’+‹—ý6U“ì#Ëó\¹C½&w$¸ ˜ëaëÜΕsEbH6þ‹ß{Ò¬ƒaY[!!KƤ?‹™|Ùkœé|?½'f·,jÄ :Ì8ó4í³žÔ[d7¾;Kªã(K\„Ñ9ȶ¨žeKôÏÑÀê¢æZÕW¤o ë öF­O’"-éE™‘`ÈYýª,÷»šGP¤A)/â|Ó…Üù^¾ åÍDOŸÞ)^P“†YŠ˜,oî8uEùO#g\–—a/ß’+”ÌâOd2[•íˉ™ÿÂŠÕ g®“Ûâ ¾…æ6.m¦¡3°ÞéîæUФM@ÙÇV’Þª¦¯ú&¦BËEØV· ÑÕ5ÂÝ:Ü/Vµ’zgçføç|“·§&ëK\¶¾Åäåb¾VÕÑÈ8Ÿph&ÇP’ý¯u Š»3¶I0¿‰÷$—Šš[™7̼w§ÊÛh)Õ܈{ž5½–dÁŸGijưv”DO f®K@Næh '^r>tƒj·Ü[$÷+dAØ6w4 :yÊ3ˆ»hç¥ Ü*ø²:A^Å]'™ (Ɉº0)°W;¹Cm*s>Ëx @•`†µT¢ ƒè¢ÎúO V°=±"þì}^Œzâ (är.(ó=†'+ò €)ªM6æ³çWÚ´F‡tÓÍ&0ÝH“dlÅÐL‰ò—D°Å³¾‘bªéùz5æ×ì\×.Ì#{D27¿„båù*¹»Ž§%ÏAWsܹ|ç¸yØ4—ŒhéÂÔ¸Ä =–¤CËÍ2…ëŽð52¼ÿ3ûFoªqºöîñð¥¹fÊ¢‹ä‰Ì{El!®÷©h|Í8k5¸=#×z T¨²ÊXÅܺÔWsÉæ 'Ù€u)øyFÞœ«\…´¨Å9ÄkKؾ›åT å5ÆæÂê K—ÓÌsæ*…1_'ã›_£fË|û_8X«mZ§“îJ¤'#wIöDÊÌ,tå×­ÒƘðºèz!G„Ví[f)‚¦MƒÖB…l¿Ñ< cç$¿wu¹å¡P[IؘÃÙ8ØÌï f!¾…2°\È EPšH¸wÜ1»Ò3^³ÁWŽðýàø€½Ù)åÛÒÀ¸Æ4ãÉì#£ñNhJ’R~G]x [–º°yxq1q5¸üA眭òü0ðÆÇ¦TBŽˆa`[`¬€19zAªj)áçtÐK4Á®GØw1Úeb”ÐîI_mȳâN1±ž¤¹,ll¼‚“ wp7(ŸŸF¡,Œ!ÄËÖy&×쎛Ló •:á^6 %Z×RZÚÄùvê4OépÛõ·xÏÈêÛXrES¢¼ò› Ÿ¯lgFbçtN«UÛ‰X•A+bE^ñ ”X\HºMÈ”R˜7ö¸K¸#¯OÂo^RŒˆ•àâ)‰ðëqøÌÈë»RÌú¾X/0^»Zk>'›ízÛ“P›¸&|WŠâßTzÉñ$„üf3ònR©:~?|\òoä‚vس2Eœß8® ðn$Ø9SÕEr1tceí]ÂÅ]X»\ò~ôáçî”d8D»¨¼ÇWA¨[fzTÓ '™I°½†[Æ2¼€:W”ún⹨öÀq +óG[( žTÙé^ö¶d¼1$ªe“Üõì4Þ‰¡ÃªzbgÞúØd&(€ ò“ª9¢ò ž«O‚ÒïvSï¢gL; ^UæåÎÆÅmy΃F`nÁóbäãp‡Œ¸s¦gWZY5“¤ýë",ç\è¶ÍP·¹¦P&Ùã驤”> adÖU)MäsŒ}f¡oÌ:¨VÅ‚á\eFȽ±®Ø$5_Ò¶“óà»nCäÐBlQ¹¢ãºÒ—¾øšÎÅ€)½-ÙãLþ{“ɘ%åÜ#%’‚—Ù Sk…K¶¡¿Ë»‡wUáŸDNÉÆD«P[9Áé¦&æé¶_p›4£Œ+¶(0›Ì]Õ8 ê±æ<`…µ7(f¼·ˆøp’ììYøCî7'ù6Œf5*b#T#«ùíöã0s¡&Z`*¦þU¯Ë8Å}-™轓›‰gÕübYrv†™YØl™_‘©êšty花Z4ÁBÒ©BtЕô¸>ÕRû*%úûéöD`NN|q™DWa­]`â‹ï8©ƒZRìÒAÞ/rµ‚Ow9d>bÙ;ž7a8“Æó4v¤R5£Ô®Îð¶Xê§»vªßNý#TUueÌqßTŸð˜»`BS[?‡LætÌÕgç°ž¢fÕYë&P@Gµ´8=ÔÜwsÊQðJ"¬¸±-I!<ñ~ëÄóYض¤CQÙ”D(Õý>9›[FU­œ]åû8÷0‡ÂS¦çj W¸·™Ãs;MÁ¾Ý’63S%ñò8}ÞF¨‚+-æ”ÎJÐ{§ oéPÕ¬1ÏÓ£ix¬Âj‹Å+ë*|q³¯Õˆ! JZ“ÖWýÌê<ˆ;³¹ã.Ê{O:½Ì7ã»™€ò#['3N(–¥Tgö²(²½b]ø=X[7¹þpãM»``áPµ­.j×+»•ªð~ÞóÔ©ŠbqZ¯`ŸPÃt4&5$8qûR48ÂIÇ’tÆîzv‡_8RðtfW{ .Èã­‡D= Ý› †¢µ¸,Ϥ¿ÇÊ:–…QtÀ)äñÕ½½“ Bp òG7 ö–åÔˆO^º^–mÓßžp(È›4 e®»²V^3ßggl”„¯¥É*Lµ¯J¦…U ¨¨¬³ÌX¶]µê§)ö‚óZeaÔSpÄ:c{wæÛìÔè’ß8Eƒº²hX´vÕ Ââq±”ÙL´Æ ˜õ¨Žv0‚ˆPiæcˆÐˆôÆ+¨“˜LlO*¼¥ø"‹ ãûgùêYÜ6»®â;Â\®L:4zÚÈnU‰W[gèʕƥ˄&z®":¬jô+i÷‰e6t$@ÜD­›Dêìð£Ð."¶Ó••©”"·mÑȨbßÌAÓK“;'†©pªÛðJrÜP 4ÐÈC#Š*¡±'¶0ïU݈Å<_‰¾Qò.&ZÅÂ]ÉúÊ(ñ$Ú Ø)XpàªÍAxB£ð§'¨ØvÇÛÌÀ¸u¦YŸ,=±E¿,>9ãÓ][Ó!ÅT¦!„%z:€Ýîã.„|ðejô[ VäóÉךc†çªÎ¥¤kžžA&„#×NÃ…ïB[1_m¨9¡§GÞ$¡‚#,m¬Cô ÙMÍIÁ9†‚ûÙ2n ÉÇ.¸*4xô>’jt¾XTKê›VÞÜeÐD†€&º¤ì6 U¥²•à[ÃàúuƒµªqP€2vQÔ#^,LѦêJÏdæƒêŽ…S=%œÑôÖÓS)Ý8t‚â|É®oòtþF*P± £»Ð·¨ÕY¨à QYa!@;u KJJþËçÄJÚ«ÿN«»í|¡YIYdïß\è¡’KÁk¡³-Ý©‹Õù†ž3Õ»øšUv¦õ>\ƾõÂe9¼x'Ÿ‹ò.Fº˜MHÊo·L«¦½Ÿžmx~>㊯²Jâ«ÔY–iËJ—§,ŒG’¦x‡Øo^ÖÍC=K{<=AhFS;Ú\‘jžYÔñ)X1ë®)µ§'§D:ͪ'ç ®Ÿ’|94æ [»©`IÑ&Ä,xU^Æ1‚ËÆÊº #P%Bà !Ä!Ù¹ƒoù¥„Ó„kæK™%3-…8àëÕvò'K±§à8IÁZt“\J+v—Ä׬Qp4!dIòR–ž$?ÀšXˆ)ØßÝ ìI=Mÿ‰&À‘1˜š—D¥ŠRÌ+3¤)¼÷,•šÌŒÉÅV;tɲ¨bêj!.ì.ùÉÁŽã¬t)ò:xÖå&]ø{¥0+qŠ&§æ­ëxƒA•X33æ:øZJFnÒ툼€¡-ÁÆJSÁ&§Â÷´.nÎËxOÁ‰üVßcZËØqœ`ó*¸ã¥à…­ùšà\dÁî ‚m%ïšÄ¤’q¶¥ˆzÒC8µ“júZ¤‚n÷¡ï ôP€]om˜C˜‘- Àï§%<%aã¥ í§§ }|ß­¥}j²8™ñÓ„¨(%²Ð í`WQѶ U²¤g }|¿‰(šF`×d”Êx¥`ý3ãXjÁY±f™Ä&ºß@"^Eœ©KŹɦÇȆXÞ/E ¶ê‹hpÛ¡ŠÆ…EÍR(k÷4ÇK–M…­Òw”Õ™]¢|&E¥¡ßJ‘DÕMsX¢ðO]‡8éôo„µ4¯¨YÞ§gþGè2<ʬfëºS_g© ±…¸a¶^¥X ' ®(X3nGiªØùB—Rž¾D"`JÒolaÚn¿px.3.ØîSp¯HáÆà“Fºð¢Œ“ô†ë¶ž*lT‘hŒ=Õ/vç0ï^vD˜@)¸“q•&^KpéÒ‡(ìjÊ€i/ö…=i¦°;d8Ó(¤ýn”&|‰À,©ÙžCpŠT—’|y@•, L‡êUî´R½jÙ«§§ã¥.½j’Œ†Ndà88ˆä#Ør"ƒDqý@Õ¬k¼–,+Ep-½®w-˜qE^Y¤.^·d‘©®ËlÊ‹š‡ÝX—=ÈL^»ÌT.o_WšGìäh•„8ÂÝ|¯Ñé6÷f’-Øô\N¹àÂÞ¦ÚÑÃFK!ªGW"Ÿ¾:'J†ï‚“€(² ƒt÷oïn³ÕÈ“£m‹VhÝ)u‹Ç÷[Ó² d(û ù%)X‹®qXâ_ˆénô] À²|‹·œ+/¸l­áD¸A‚²K‘ˆ Ê‚y²ìz§¤ž½>4µ/¼ ³A½Zé&íîó’¸ÚSI,}}R×]¢Å8k·Pí)SÆ  %„fi¹x«ØÄ×f² 3ÊKR4>”õ 1“Ç…Œ+гoœ­²ŠÆ¥ç[ø†bUs\Q»maÐÅÓ§/Ü zO3•L½‹©äÉSV›FëSèf¯º rxg²T6²l¥s“Å…ddSøZ3`sQ HouÙPbãaSGëaÄT+y˜F]H”è¹QÐxnG8,I¹Ò…Î]ˆ‚Ðjî„ÑEHˆÐFA›Ùhε8UWŠzŒÅÓðºìç¦qÓð— ˆÛUÜa0  eíHɵ»ÿ pɪ4‹åVd.ðH- Ÿ¡ä‹ƒï¥æžœ*U ­+ýOßuAT3ä:!ñÌ­’ÚÖõܧ¯²Š÷öfQÁÍ™FØÓ këˆO_%IXá花êQ³š»²kyÞwÜH Æ0»jƒÞ‚5ÖÕrÉdró‹Ë.…¥ÒÑ×ÄŇX/Jæ‡EÊo…&F¼•àŸäôeôapb¥iQ{«Aœ}3#X™†>)\ìYÕ£/êÙTæ^5Ø=©è0Myï©@†8º’8ß ®dd–¯a• š=ÐßÁ‚oÉ 8PªœP°RFã±/­HŠ!ïŠÙÌ<‘ZRÔeÈ ' NTá½âƒßN|dÖ=øB\@@_¢±8–Úý”RZo'›žRwCµª p˜–í€8HÿFEÝn–‚xtøhï„§fJ¥nÀFÍï,ÃË?õ(jÁÁëtya—á 0ž‘ –2û&/PÑe—¶ÔÅ™`®€̃Óæ²súäýÁÜñ5’‚qjçP‡„nAйÀÿlž SÄžé»1ñXÃÀÈ—l=B)©Â‚…·‚Ä<Á”­E­G«Vð& 64àdŠ$ÄËàmËe%Ì4N]`)»#Xø€vÁ†Sblמc9E0/Vˆ òI‰$¢ýBm`±²ÀD¦ÀÐRêÒ pÁ7¢4@vA%`4Ü$U°ýB&¥K`wø£ÎmV+ ¶¡².9‡¸&±Íëî Táñ͘ž¸v4s-¶`Ûcტ£¥ÝùA˜JÙXpŸgsb¢˜(s¤$Cʯ"¥åìT‰T:xsWk%ÄÈ«A¾i’+‚ÆRS®ˆ ‹£XA&æŠpáâ˜Idh!Y D†c…ì,ˆA OBŠ™BAORŒýµ )ùk•€\gA0ߦ>Ë Ó¡rO.i ².å‘¢ºÛRhy,M¬5lJ!wƒŽÓ? ÏÃoØHÍ•D¡à9ÄFåP‰+ź¬äjej:! Í£”P47NŒ‹ÃØÁP^l?€B1v†‡ Lð˜Në HÇkà—¬Ð› O ’xÿ'*9ÌâØ”·¨E¹¯Ô|6ÕÈ óT#‹;Í„WU»©sê: ¦]wîDÔ²9µ²yâ®ó$öÙD÷0¥Àið–5Sb›é"š"Ä Ü=~îNJ®½îg'-x5å>ð¶€¶)«\W¡ó†ìš¸Ê[7«ÜUN¿Ú“ÞF‘ÈF×4¢óE[SÄc_³ÙæÅ s3 ‹’s?PÒ5yŠ“‰°ù¼88Û¬ ¤`út5ñ\ÂA/­Ë:–n»Öei¯ÛºÇ¦»Šý÷b+6Ýá;¦ˆX[š+öøÓ&½muåí¶¨˜Àû âŠeÜŠ½DlNja³fÍ:Næã„¶PWáÙc+ÀPa+^ºÕJqULÅN°ŠíÝ;P€¹â®ûÊ—f±~~&܉cd%:|kšßáÑÙžäy/¾õýÀô@ìåhÏØDi’íÅØEX±íðmq¬ ‹¤÷Å¡vì;ÝŠ¯¼äZ»ë³âW­ÜˆÍ?W’³FŽwþ!õV©`ßš["ÍO©†æÚß2vVã ›õ3t–Æ5‡¡ÃǪìöÁ·{è`«ø ÒP?XÇ~†1Öð± ˆÚÞ j #º¨1à"t³ Ã;zTž6i–¯mìoûóªÙqÖ‡‰µûŽÍ°YGÌ¥+uB[çï|¸AÄ­Þè{#»ô°¾é!]ù)P6_i=€vØøiÝýcuŒ;²—zíøŠ¯ÈÖ÷ñzíu”Ãüv CÛëÌcëÈç©3ä 7±#«G1ñ18É0ôbÜ2°Õ}¤ô{Óý¦õ-G|€Œá_nÈƹI‹ô¸JAˆ»¨q4(à #Ž’cÀQzÓY‡³FRôɲøŒZ9Å F;/:‰ºÑVÛçW¯Š[» ò9:¨˜ý¢Šú8C=ÅG0VÁt™óïe67é鬾%´t%tÓêALÖAL.Ú7Ú“€Œ7Åùãâh«uå ücûk'oôv2²ø­“H¨ëtBßë­ïõcÜ]-ûMüMôbµíJ×ÈÃZÿ&ñr–nè¡+‹åMÙêð÷²óM½<Î`]®cÕ “ÖåíÜGàUÚ×7eË›²¡mñÖ‡¹Yè+ƒk‡—v´õ./.^DÆ`ØkÖX;½!ðèJx±ìõ¼º€d½›$^}™Oü  ,Î÷œ¿{óõ2º@g.Ç'–úd练ü¸“w=µóo=ƒàw˜‹SG4æÄkè89S§nÂÖçÍð]Ý΋•idà­3rwÓU)‚]ÔÄòÞÑL×+ÇïžÊ-ĸ+Æ;S3èsåòtÃ`èT:ЕêUÝÜFJ×>ÞO¸›T3—7 Îؼöª£O4ßUI¤¨ÞBà™ëjá•Õî^þ•oä /%¸cÝÝq!ÇéIÜ}®˜¬¸Ñ~ñœ¡‚^}C¸ñÖ­Tzc¹ÞÙC|¼·4ëo*Ï€‹âg®àPè™æ7?(‹ °Îx·lôÜFR±9œØƒŒv ¶ôÑþ ¡ëšßC¿€Ã¨÷£F«ó1*ǾUAA_ߢWA̘©£†1bžá2€XG÷6øl9ƒƒ£y㦋–OwÒ¾S`ý÷ÅCÜwáë¡ø³Õ;~¯gßö0˜ò›òt?ñ“Á¬‡0Îòƒ†¨d:N Ûä„6·ˆldð]~ë¶ÞŠÁó¸æÊ.¹’”»ûxu®é%ËtŒžßÍ“YÞ¤.!|ºûwnTu÷›ÚŽ òƒ øƒ lƒðŽÞâàÆJïÒ|kï‡4Î:O@¿yÙÁϽ%Z·!a÷Æ›õ¶)]}ä!ãû>©&k÷Œ/w~õq¥Í¥áBæ .ûÝ׌:AøèÕ^eß'>ºv+MÀÿq%ª_nÜy¾á숵õ¯ü.uP>>Ñ7Yƒ4ÜÕªúpNlmêÞÍûÔ”rب:À7•¼Ì¨V—0D}Ëà„t9ÿÀ_wG‡£gó×ÀÑÁà™.BõÎŽ€’ûWãž½0Üï!³~¼ÁkgÕž VüYc–ËÅçšÀ$ܵÞUKŽêÕß™ùèC9óÁ†¸°Kü/Ô°½uE>*¾§vÖOŠïnÎ=•drTÁf;¼2½™üð\R1«‘ ³ZwކЯ  !pLÂ|È/mƬÀèd_Òµ°«´õ&¼÷ð¿cb”ÒªøRàEC$ýS°š8]*±€ À+þxaoûІØêWYVÜïÒ>v-¶ûtµ'2ô[Æg%i;ð.6>à=gí£ô&¥z7UÜ:QqUû؇i”c˜Æ0Qäröñ«\Þ`ˆ©6Ùí&•Å áF¤¡'n£‘z§ íVæ8Úù¡m±ª·ÖV£è³Âz=n«8:^q’]Š1z^Q¿tvQ¿%#¯Â°e§G´zŦEòíG`Z÷shŽýØþÞ>V-Þ¬9v'Ô#—{òYéð1¸œ~w [vpä”Õb™ŠÛdq’=ò!>´WÔ;ö±Ø!g™ñö*ápkÅííC‹OgŸ¡iÛ­Ë“<–ÐV‰”wã™^ïVPq¢XÊp€ š;‡zE™n[ rô &eÊŠ#¹ÕÞÑè|‚« „¢8FmUyÇcݔ߱Y½â\xÅiâŠ+ø¥8Ù¨³)fc1p–—kqfß{,Îlg«7§X»ê‡€Ÿ³¯¿eH/FS¨Sœ´¯›‰!TœK®[¶!{±|hñià@Óà´¸L‚s8 *U-1mlµ±Øq^”ùñmT'ïmîäÀÆ'2îÀ7Õ%|VMý”Èû•ÅÑ_U\˹Æ»¨fÙ¨%÷Ú¿9ÀTÀNÕ¹I—86]ñ® «wŒó8ßÍC8UŽ Ô&‘Ï®`9ØFfPuPÈ΋ª4Ü"ß‘'ò‚Ýе&w“ÉÅÈt°¶©8HnfÇp¬nÔ¨ä íÔâóùë¶2àr#¤ü¶¦c£ž7Ó¡†ÅTFîÈäÖc#¬˜ÁV¼sÄ .Õ¨8z­'Å»G5Ž•e1®Þ Yh¶±7±^:R1¬b?$ŽÛ:x;XM•rt'”‚°LêTúÃBà0ZݨþZœÎ¯Û!4=ºG 3Xã|L=/Ï›¿ip\øÙícï ßh/´OëoïÃÉûÖzÂ&ÆýPuÉ [4Õ‡keeakq– æ8X&LC‰Tñ43ëw”)…Ü—¨E„kLºñ­êyhUÜÐÒ‡¹äé"yUNp¾õÍTp~8N%gŸ àèt}ë ª)R2A¤1TÉÀiúºkXtžQç/x@øÏ€Ñn=ÔÿІƒ:ÿj8vö´®—¾ÅžGìû­yÄ R7àDËÜ¥Ä<LfU©ã»(ëNtž‡“e ë¾*/ÑbtÚµ•peQ¯;Í«~ÓÎè=€c`ëðJ²>·bsÃÛÆF_ņ™šà§›‘wU¼,N Ý“K1ÙSºÐþÀjê‰{˜ÔVîQtÞS”MŽÉäë¬EÁ®†BÌ•%Б»{œëæºÐjS$Þ3Ö¬§ÒiWð”cÝ”GaÙsôpÂõ7ß|—pÁà›ïÎ-OwÒÄL(HÑVâ:˜é˜F«–.Z\­wu…Âx”»53Ê*ÁRÁ.èÉQw(êH6ºåۇܽ“ÉEZ‡b1fB–ãZ{O—Ú;…¡†MÉŠwóž|–;-^œüNO&¯bA¥Puv òc’6ôÍ,Gõ»« iŽÔSÌù^ÔZUž¬jQm•÷é‚Óx·&%ÙLš›cœ®¸»ÊëܤŒó?ž½¬T—.àÒYª®Ñš’Gw‚­é^µ~ï’mG“ïÜ•+ß±Á¾ëHe`ÚI;&ÁnŸ‹‚Ú3rÃXïo'·ûÛ:äõV°Ë¼!Ù›9Å•rtjwÖ?b\ϳÍRõØ5a‘qpB_œ¯ÝXs¾pýbŽ‹b`¢ŠÁ\y‰4”X;ýŽâû}ÑéVÁäìª)`¸©p…0ꊆ°ììnWˆœÝ²Kœ©}Þ\äÌ ­H¾E×q—<ÇÞ!®û]¬]2£‹Udރ秶̾© Å¥áU.3­xs§ØO:t9,'° üZî¼k¤­]R­”§ÇÛZŒ)î§Ù³Cða)…‰ ›º›°¿sóLÜ.ÖÝü*™æêJïØ3Ô³"¹\3%nžéª3ètðC@3 ʹ[©}a?SZûéô7G‘Î cÐÌbKd0¼XM§EÁé‹m´é_üi €6F5¸PU¹©¦Ý îYêʉ€¿sóöåšîØùì}îa_-pj'¢k¼»ÆLÅjÏ¢Ãi®°ÄdŸ>}jz­ª-p‡JÅeN·FÖýÔN˜#­¨"Ñc³#)¯‹§3’³Ÿ~‹,æÊzõÈ~2ˆä;M#˜ØìƒÖS檣Xƒx’DcŸ&¼ÿÁ\eËQÒ©d‚Ðb4 ,3cÀ©oŠkµGPéQwÞUFT¼œ&}ʈʬï¼àˆ1Úöˆ±c17L-ºÔÁÍ|¯Ì¬‡²ÈAa!Ñ)$š6õÙU’#Zå+àZÜêºïÑ­&WˆpYB]B^}pKžw»Ë ¾ò±Z†ÅDü †R­ Õ걪»Œ Dk3~JxVûL «² *êÊBD­°P ®1¢v¯jåHîuUuhvèjÎ`J‚„ºhå!þ' ¡ñ²Ç>ÐÎb® ÐJ§á0È`ûÔåFbˆzžAYÐì1 ºXÖc1M|HbRà•©ÝŽ­R_?!¤Z Ê¥žƒßÞ'ª; îUæ5(…EeÖ(±¦XP&ÙÝmtŠÓ~k›2•—4&nU1Ùt•°?õfµHíXÖ¯º*WƒlÕÈs–r>Ìé\L±à†õÐàî`þþÂAOUóð§àU BqYÞ¯ÝkëÅ­¡6M¡v¢ŠÙ¢ÏCÃR =€»Ÿð¡¦%HtÅbˆh|ƒ„̸¹¦ÖÉóG_M2ç^ù† ]µ S„¸7«\ S¸™Ãà—qõÏ"kuœ—±l‰GÑ´6ܽ¦/¦h“V8‡26æ9ª«³š;y¥äʬÏ,3fTm¥½Ò9Q#ç*øÎÜqG´»ù¯”ª5.î5.žºxhYíUÝ0ÜSØ>TSbaýÌR8|…'š5*d$ÜÛµá¶È ÷µM‹QÆ WèµC‹Qq‘Šø8µ? S¸m­}¬Z|àã‚Q“xfÞݽá:Ì ÷l¶ssŸ{Ù|N¸slKLö5ß]a¡bÞ^)ó)úó§bÅ)`WÙm¼uo ?n.Ûß0Ü*ø=4’ÐdÃe‡í£†LÍ¡™pIç†K#ÛÇÙëU~¬¡uáõ¡!Øï©ÞpÑä†û¥ƒo„"m: lH‚âòÒ ¯›b1l.ŽÜp…å†ûM¥ÁlàâÍö‘; |URÿ…ÚØ¥£qXûu.ÒÇv ç¹I1`8XýƒwQ ;†47ÜÆØ>6-F°;. m‡óó#ƒzñnç‹ñF ¯rÞp*ŠñžÕ Ëm¸Æ´}ìZ\ðoÐÀxoœ£¸—ëµëuÀ­¸*¶}qpQá†W8¶t—ª£$ ‹¶#Nî<³áe{[¶›kðgã‹:í18÷ëm¸e±}(%A‰ >Æ}§íCáƒÇ•Á¾xñnûPøàqáÂÔ ×$n¹(|ð»pm膗&·E 8òm¸®}ì7Èm¸õàáB³ o‰Üpÿžcx°+nÒÛp‰žKL `c|3æ½s>^ŒÝ>² ÖÆK»Ú‡B·÷ìm¸’oÃÕxR|JóÃÆûá®?G'/ëÕ­RhmG ø¡z…ÂΫÝÚð4Fƒe2x:ƒ§Q|²úOã@}Û솫þ–ðë_®ñÛð^ß 7íµƒÅxƒá†{ 7\=¸•uÑ⌂TX“WûXóÓªp\Œ§+ŸK)˜™e\›ÛGÖbŒ™Xc™µüÉÚú/YÝpbûÐæ`Xܰ·É•£X—émÜZÀ­,æz·p+KHÅR¼9¬5Þü¹áþ¿öqj1É‚Ë[=<Câ2» ·Ïmxõ­»¼4ð4®½CÁÿ¤Ž_h-golly-2.5-src/Patterns/HashLife/metapixel-parity64.mc.gz0000644000175100001440000010473512156145314020120 00000000000000‹ß!õHmetapixel-parity64.mc­½Ù®49’&vOÀøE£ÚÛ‹/-èbz4H€ZÂôs!h€¬¬¿ªRÊM™Yšî·¿Ï=âœÌj)«þ$‹íf4Òÿ÷ÿ9ýÏ¿ù_þó¿ÿwß}ùå«¿ùç/ßþýó—o¾ýò·?üòõWßý¸üøí¿}ü›ÿôü‡üwÿ”òãßüûç/þæçgûÿWß?‡ÇðÔ7ßÿéùßþüÍ×~þôåÿþË7?}ùùùøöÛYžxòO_~‘ŸÏ¯~yþù—_~üû¿û»?±úçþòÓ×_þøÃOú²|ÿå4Æ¿±ÿ¿|ÿÍ/ϯ¿|ûíó÷ÿòü‡Ÿ¾ùúËóøË—çßüñ«V”Öµ>ÿöùó?aí×þoÑCëòùÍ÷üáwÏßõó—ç_ýòË—Ÿ¾ÿùwmöx~õüñËOß>þú§o~üåùËϯþòËß}õË]Jk†>~þòÅfK˜Ø„–ßûß~þñ‡_–¯øîisþßþéßýÇÿð÷ÏúñË—?<þåË??ÏÿšÛÔÎÿº?¿úéËóO?üð‡åùœÌ7_¾ÿåùÕÛœž_ÿù«ïÿ„¹ÿòç/míiŽÝ:øïXôç¯~þó·ßüñËó믾n?¿o ~nóüî &þß¾úé»ç_~\žÿù§iëýú§/_ýl}}÷Õ?óÝ_¾CoèãùÝ—ï~h­~þòË/hòÍ¥U[Õß*xž_ÿð}«ûKÃ^ëû§¿|ßü¦t™ûÿý?Øw?ü¡!W‡þûgûïǯ~úæ—ÙËòÓ·_„6ÿoZþÐæòí4ù‡-×çß=ÿ©} Á÷_¾ùÓŸÿÃOn eÏÿç‡ïŸÿøå/ß}õ}ërÝäÏÿþoþñ¿üî÷ÿáwÿáwÿÔþÿ»ú/¿û/¤“ßÿþ‡Ô¿þæß|a¿ûÝï„f¿ÿòÆ–~ÛÿùÏyþO &ϳuü÷kþû”IoÿÿCæ%¸èçß`ɇÿ[uXà°üFY?üåû?4ÿ±QÈï¿úúÿBO öoû|å€~þøÓøKc¡ïÁGúòC#€ÆRÏ_~úòý~^žÿéË¿ýòõ/ßüðýÏÏ?þÔèD‚®öòÏ{yþ^ùæûÿ³µb¥·<ÿÇ6Ò7a(cW#žF_ß}×(ÿçç—þ姯¾f9ÆH l=ñ¿¹ýï±à¿y’Y*ûÅÚߤÀÚI3yÖŸ^æÞÍû{ÈPúÕèÍÛ@­ÿ[Ma:ö½‘x£o°ŒÞg¸ øˆ”r›ð#,7RöbtÿBª)ÑØÃžš­Éý©e~åûbâ4ûSåÂÿ|" ‰ ø6ûÇmȶ”qi/ kM¨4È- —ÇÞ|ƒ®²óO#>?ÆûÇøü@Z9-ÍÓ'_@9þÿüB£Tò–¯ô³ð7Ê›ãóóÜ‹;mi³QHs|ŒS³öúÀ™r^v_ñc‰éWoË{¸Ld͈ËÛlß ºC+€wVÒíˆ6Äu »‘ Gr¹§0è˜9j%ÿñpPúÎqЦM>éÇÌÿ"È;.#¼º\4ÙúæïCÚ Èêòõ1«Ìà„oH>üPÎŽ¤ðà<ØjŽ­¹Ö.’å÷äKõ…Îã3¿Ò×ÃÁ4qÇØа‰¼4êüv×Üõ0îæÉ›¥~lÜ|@RW—è½G¡¸‡Ù„ʤ ñå[‹›!Òíë1®:>7À¹‰ê\ø ž:¾ðÃD^èÔÉòW@äMDÓÃ',Àï‚?è\4¸Ê#oÜlÈð›œÅ ¿Ì$7þMl*O‹Ø´z—ò9÷º+¨ó€¤aå>ßœN“KÙ9–vL9P¦Ï¿™—`  ÔvçÅËn€RDlœQ„6ŸÔ†Cƒ—•¾B‰Ì:)”'ãôÆ~7®º‰šw\”[Xø€ñ¨ƒ‡¹¤œ—ñÉnDŒÖ„j*·£‚a1Põc •)Ї¥¦'¾|LªPûâ‡7ñ8E{â1 ¿Õ§Ã4åi+˜ÃÛš¦ ƒƈýä—}0«C&ü–’ó0‚ÌHå×ÜÙÖIzv‘Ò©|VÖžÃlC=¸»#{g6"6Ô{Í ‚¢¡]‡ø7¢™ï5¹Íï«ÇÑÞ1ámÀiü\æ·Õ+âûçÝÚútW¨‘mƒ ñ²ØWízëïÚ º(xÐkߣx¡úþM©\Òwc1¬ÎÝ%ˆ“œœ£Þ@Ø÷f'v\÷5 VõèÏuEsv¨ ž–¬x2ÁLýŸMâ(”Fèø„_V×¢ÀraJ)d?¦yüqwvŸ}@ÎNÕÒÜùQ!#E´ÜÉ÷ü«„uô%ó 3ÞƒŒÐY´;ý=wè[£æ2$3ŸÔåÿã¹<ûP>öF‹L{¶É³XýC‚GJ«ªñI ÚÆ8À>2£ôôáئáÇl²~vÑ3^Ñòêuò±¼¬yä\«ŠŸ‹ ¥xÀÂ;`ŽÌN]‡Ü)Dgã?¯{t1€tˆ}2âk㸡^šÝƒTÖàññð¤ e™Òç2ãjzÁ„÷¾˜ì ¿ÆÂ”{¨£ÝMž‡&n„â‚V¼µfv~ò,e‘<5‰¡ü(ëv»%X8ÊsÖvé>é]Gõ&<ÞÐ`oåÖƒu×&ÂÇŽëËi7ÊþgÁ½ uïw©«—e63í³yöéÙ¶7ZùCåÍdÜ/(6ò1A§ÔåÐè˜ÚäzèÖ¾Þº*Io¥â—×§dý¯ƒÝÓYxqÖœ–.¤úœ_ :<£-4`§Í´N·q¾Q¨N6ky3’´bŠXè>8Ý౿^(@wKhQÇã*j,Æ(³B}érqZ³Î㊽¨Ë:_ŠzÅ2ë1Òyçr©#"V{ ømzçsŸðؼÛíÊÃ÷É?áë%ðÔì~ôìtåͦÎP.(æ9Í;,†ÑÞZ²÷ö-€ã±˜2·I›Ø|ÂÈy?”ËŨ6ÒB˜ϾíàO:ÅÚˆ&!³6¯¡z Dx±·™Œyo¥Š_3‡½ìáÔ5/Aíæ>##o׿øŠ_ÉÐû¶ñVïh~÷e|úFÞ·Úixx¹ÙˆKàU“ŒþÉS¯´éƒ½¶ýxŒ·ž—®ÇFªî8*ÜÆYš·R•gœgù¾óé«ÝÉ!w7"BsaÕéÅBìí„SôùÎëþ`hÖA3{¹€]^z h}Ñ¡ÞféË}QõaÆ6-êµúÛHg3çB_Ng•>BP_áïÒíù :º#OÝ û ŽpÄÈòé`Khù0Å'^çöà¸wfèb)¶|ÜšŽ«˜>&‚ð´ÓÚ´öNt±déFêX:Ï}ÅïÛU[,{…”†Õ‚Óf£>B×s ˜QɌ䟱†áÉ7Äu{¦K¹H6·&¼ö=Š:ùLc«—&ñ³Ãj†4½G±‡¡nÄ6¿´¾ÏûVKbê–Óhh¿iËÿ>NIZÆõD¥à¿nŠuÐ{Ÿ>>—ùeuØ7y<ƒ±æ³Ç ºo×ø~ƒí^ý2×½Øú…ó\:…Gçn`Ëï¥ãîÖø¾„×BoÿÎ})‹ÙÚF˜óíyÕjªnM.*Â3o?osý¨yœÔìFþ­é Ç-o&ðñT?hûf–o¦Û%Ü¿ >ù¾Ð‘ÌÍ­X×^|WÉþ«—‘̽| ›5¡ù$¶0Ñcz³ö zíh7ÏÈí‡Ù«Y«æ‘Ì`VÒžìÙeT…“jÍ<û²Ý1ž|¿Üùn>º4}˜P ¾¹ÿóT{Øfß…Ø4õV¡ê%ðÚÄ!—±Òeüüò%j›Çäëò?Á¥ëõݫ֕KקàŠ%³Á^—2›é-ï¦Ö2ݽk6 Å/ôÙ;3ˆÝ»ôI·ß¹o¨ºZPhßl”·ÏĪ>;lœ£h mã0¯=À{+-ï­ûô^×›ÁÃ0±‘7ù¨õrÕoäal(Ù û—þi3˜½Û©‹¹ÀX‹Qö¢"Ä7=Œ&¶í`sp¿IÛëÖ~–ge6þMM,Ûî“‹yÊú R©K¾åƽn`XCÛdt­]K“º·ï¸µ [dùÁò–ê—eª³›5 WA?÷°8\ô—^HÐ ºû¼o ¸75`È•ˆ¼÷ùÚiºU¿%àø%vÙÎ …*ÂãÂï6ç­É(µT3÷F]lÝDøÍ¯¼·%óÛn—.‰>„Å;qð¶yÌšz³WºhxØ9_öµ/‹i¶¾lŸlêÜ»ØÃÎ\“ÏëÎ׋íÑê—`ÖöƯ,?½­–IÆvEiþnà¡&’sY˜²!ÒR'¯t55M·"ï³Û#á)gÕª½'- TîÜc"¤7U]`B».Þ€½¬cÐÉY~„¤w ië‰MÏOèèœÆfŸ©U•±½iZßÝó›xÞXrÔ§¡Á0ØÐ­“³ýèêÕ 5ædŒãøª‚ß6˜¦·åo¿|ÐðÞC°i%ŸIÔ¡ÃòMfé]t°™/cZBaÄ€‘Hø >¥çЮÓs/tn u#©ˆÊ[“)ur}ÓêU¯ô&©€ù·4ú°¯x‚½Ûo•Ìûá¥êÑ;Ÿ<úÁª¤îVUá+X&ó²Õ9õb{v0e­v Z{ºu–™SY祲wj")ößEÅ+Š¢T‹$Êe§×G¢BèU¯”:ÖŽ,ô¶6ðì ¸–å^>êÑy˜ãøØë²cýôYmäãOÜã4 Ôõ9î ,x- EÝ…ö2ÇñP4 x7F«a,¾QäÁïJïÅž”8–¾†‹¤Xº8\ÞßÇ»ËÚYoÚ¿"ï•:œÖ"Úÿ=de³íwiA¯u¢f…ö óø/aí^0Å_ãýEfPw²¾áI¬¨O1=š™Í§¦ˆÖMÖ'{íG“¤XÃz@ÙR=¹èð‚>GÃM:ôó‰i7üÐf½Ž?û?[ªsó¯Óà3Ï^`Óœõì—¹gP‹lî?CÖŸO´®ºg!ðí4PÔÜÍ>yzüˆû.k^EˆŠåø{%Ò›•RÍÂ}‰ô>ºÆê¹±—kö?„¾"Ï œ~¥,Þq$'¯è‘ùÅèð¥ÃGôŸ5Ê2u„Ú«ÃTlªæÙ"È*7¦Ù:ÌÆ}BÙâËI¼¨ö¸'Ý Ì´éPÔK­X ÅVfRÄ#Ø2mäÅ7×~²ýÀU^äb×´Åí¡H¡ÂÈɤsï4šËé-XQ]tñƒ¨ªÏg—´“’©®×uc9ÅŸúœcáåË­›Ó?RÉ£“k´¢Ü@zÓÐ 0³ kù@>G›exfìåƒuÄ >æ°\[Ðg¤±L·>w’b”ÃA»X³5;=9i†Ù¹"ÒÒ°[ÛøSþhÔ¦bØš.‘Ñœkƒ_LÑ)æ;gÄ?zÂÜšY·“Uœ»þ}ûTGã¿ÛNŽ —è.”z±Í¦óÏÒ;uk}ˆ9Î&] ”"ôˆÊ<"W‹‚ÓáXñgl© pCª _mdcv¨/q'«SÆâ$Õ©Í€»Ø¹? \ŠÿÞy¨´Nɘ›mË$û WXt#¬»Õ;åÚ·±~š^Ê–ÏŸ™¦×q‚ŠWú0›= ˜et0ŠÚ(y&Ó1‹“J—¿ö‹ÆÒ©+ҹӜٚ½¤ÏiЍê]ºy:»çÏ.aF¡Îôìí‰e,ëëÔºe¶;5zç½j‰Ô6-&f¬H…âl,;Ô¨at/29ú0ÛIXÑ6¨ƒ‚$]Ò Ý.÷¹.sÐè:·  ýCšŒµCOJGs<+b̨¿L>ÆÙa>Ïæ•>Lv¼ù=Ľ;ïÏ»‹¡ç#jÑ;B¬BáÄrÐ&(ýj,¦ÔoÒÊ8ô1»ï×0OöÍM½6Ã\Ÿmß]\fï©©A×ù¾?a3ŸìøÈäF ŒPêíÇpµ¬é‘l€uÔ=>± zgoM0W–½åÍP·ÚNoËKù/XpcÅÒ‹B˜%ü ÏÇæL$tyÖ©/L$˜0CyŸîÃôþ2÷à@, Â"ëÝäpiiK43'Âæf„V·@µLÖ…¯ãÄNÞ–=¹˜ñ=2-¾I¬G ‚“tà@´”ñåÑ0¿Åæ÷b÷ofy  ç_×½ÕHKÝd³úi˜€IÅiîróaSžç Š¼»G_‘›¥(!;K÷¿ ú -3þ‚Þ XxÀúýËh=nR?sQp VÓÈn³]ïT=9½-iQ„Ê]7›½4ê­ùìâJ‡}ÙØ~R Of™.K‡Ÿ-~6½«1ãÒú!‹›;ú¼¤r²2ûë@ÔúÉôç©jý"JÔdumÓç*˜¶6sÄ%¹zº¦å·Øù¡áûµB5 +)©ô­‡Q¿ÖöRÅUcy;Ì.ž]@š¸4(ºhè!ø´ÎAéY«QA„) ÿzWN=-”©Ó²ÕÌþÌÜý i¡Où\nå‘Vš"sóز{¾]Qrë÷WZM—è¡ÜÄÕü2§Å“·‡Fõ¨èŠ”;ÍÆ:]§ÞÝymØùÎ,Ç¥«­4é=«ñgå‘À>}Kàz¥´Éù±Ïà¥ÙØÁÀ˜·Ï7¢Ý¿XÝV0 Ù—[#Û•"7†}(¯ˆ‚Ôÿ*ñY³ðx]U÷6ù1½/[ºY¢Ò½‡\7t²ŸbÝ•=Fäf¬pêÜ—ª£>ÌçD*Ð0àƒO½Ô¹à¥¼÷YÊœ ù¦¸5ü]< xáëþÜØIèÙ Ÿ¡_Ks$š>í‘'¥J´žü›0d7ô¥ádnÞ{g«%šÝƒ—Ü+{ðJ¯Á¶¾šW𠕯 xDHØß—â[GŽ vE/Šhš_*FD„j h EEÔ;*^H ÒÛto;´õ‰ô uÊ•œ§œö;¡|Ðrœh˜‚ò³íì-Æ.b;•‹ó}fW .'¬Öçf¨Mj” m:µËÜÂôQÕ ‰úŠ†Æ ³Ù ¦¦æZ‰&ÏìÏ-½b˜É'åo‘ê´hâ+<ýp•éÊî#Lû=ØÐ{{,Ñks {|'adîé"½› en:âäc…âÙ‹|·Ò„Œú§=vÝ?¥C›>3À~ú1Åôz˜`/üÈÎX¼Ñøð£OÈ({~?uµ³Ív6C:ÆÆˆš¼\Õ¬ÆÔûìr(´dÐÆóü¯yPŸáúâ<ûow_œÐßPì¢`]]&E3@k:),óP£†Ž$=ÄÎŒ¼]ÜYá4®c ËpÄö¼ÕÀê£ù³Ì/åÕ#põËã¾xZºâ‰ÈuêñÒ»AAÐçkÂ}W ‹G!–§y íâgäcc®X>L¿T…'\;Ô+—ù>y|Ÿ%V3Ï #é³ì³Cõ2>JD ð³uXÆnbm òkîúâN]øF> Ãhäæz‹àòPÊlæP)Ÿ qH5æ¸úûËèTX£Å¦c´é^à.•ù¬‘·ñΗ>j¨@|gÕϾ¼²8ÏÁv¹Ö™†«pÞÔ¾VFj|xãIWõ¦æSþÁ õï¿ëŽœ1ÔMjuù éê0ê©ìßd—ˆ3‹AÐÑÞÎù`ò’[mü+–Ûc¿Ú Ö\íãaT⎂Ú꯻kˆõ(¨lÅÆÆ®rõ¡.#.öo™ ùá9¯FkÒ§Äl'ïP&x#ÕÞ ¨ºXmâBŠý›×uš Ú.<ª¦ß­ÇÉõ‚8/^fÏ;ŸNûû¨a ‘7. u²³ 5o-@[aw×xº\’ÇÂŽšÔØÉqýe¥¡óPªÖËdSÐ äá‡ÃÅ)Á¤Ÿ UY³‚ß[š»=OaäÈæ³ÂëF±£ØQºW öè³-þÑÙÌîiÜdÒÈ9tøJýÊ,[X\ª©7,‡©Îa²qÖ/0›  ¦¿KLi>™Žœègd7ðýO êÉuÕìÚ`š¦]Γ³/çf³Ç†²ª¥ƒqv)d ð#‹èXﱄ¦¦0C;k&Zy]¼Ï‘ú¼}ïÔ:ZgÓÒ'ûZ‡¦ƒX è½QÆÒçO‚Ö[tÒ8Mð>¥]¬px©š¦®”–y~Sž˜¦Þü1ÂØÆ7ÞYÞ Cⳇ—ßúð´˜È7 2‚ʉu t=}¹áe—b—A±6Ê×¥‹ªˆ€9ÖâcÙÃÓ|ïõÖêN*‘3^±<ùDg/Ñf[‡Ñ¿ÞÚsCÍkË…ÄòXtæ³#,àxZ^V7÷«ô÷&cסù€åùö{qëv™£µ9lh!a¥ËîX³H… bMÀ÷²yÑE¥q{Ð9³:÷«~£[:1‰\¼Ç‹¼âþ-†ëß4ŠS[æØæVæåÍ W'<ÕÅèðÀ´Ñ²ci6áÇ8 i§W‡eŠ­"YGEšï·ÌCo!ÚÉÖº˜>…ïo@ÁëæÅGÕo0öˆDÞ§å^í¡Ó­DÏl‡^¿ÜDg/~g§0€•A^J,Ú¡qâÙ Þe¶í5RcL«½­4hÈ9 aØw: ʉÖGXfM`q®.þcä×ÙAw?†¶!éãÖßòþsiþL'BýSˆC¼¯ Ͻ£š)N{Ôýç0íŽé)„ÙÇÆK¤){Âëƒð\”ä——º.ë‡ç¦²Á… h¥–ù6Ú0£>¬ëŠ[óÉš§±¢C¢ï¼ôúNš¾ªhL à4¶1H½ñȽî1öê>yLŸrZèÑ”¡×»aÙ‹{xIÚ:• é¥Î6&ë—¨X#xûø±%86Ÿ?Ö§<¿ÎÅqð®J» £¿i3Ù–×Xá]Þ‹#—Äz•þÅëß–hìN/=,˲¼~gþQu`¨ØjøpYÑÉÖ?úƒSè"¬dœÃ;qÜÜÒc¹±±wlR¡›íT‰,ºÕg~'Ÿa“/ ` Tj׳Å¿YÕ#°«'cç(or{B&8   ëL0³ ó¨üpÁcÕE©ð2CGÐ09V[" Í#Ì­Ù‘1TO·½'ž7{S9ÝWí£ß‡ªi$Æ¡ò½(ª–®nÏ0Œ¾gv«ü+)2TaKfÄ &¿ò”cÐ «Šb׈SI(ŒÒÅ`,ºÁp¨Ù›½[ù[Z4¾¹ ÂqeÆ!³æ‹+^F”s<²UDûˆÿwî¯~8Hßþ¸o]αóiàê{g¹ùÃlÎÙbdî úŸ9Çë3ðæñ9‡²‹à 0oÂbîO½º’w׿Ãfž3ýy«Pýª“¼ÕÐ(κúǛ֋ŠcoeŠbl9½LHÚu÷è^·¸ …£=â¯(;î-w ,ÌÚ7«M§X°µ£vžocÝ¿D*¿!Úq¶h®H¥Ø*Bb¸r~itû°Êw:ú¡b€~ gh¸oõ¯açðÈ([ òþµv0ôŸ÷‰öš¥sÕûÚ_¯wr¸-nÕv cšâÑŽ»œ{Ñ©ÓÐd¹ñZ„ÓÒÁ{ëøWÅeØo|àƒö£ ž—›€X^»Ñv0ÞŒÖ!*òNøßÚ:’n_Þ·žæ;@Æ F(ï_Vòî_þÍsyÿ´JËÿ¸=ò¾‰ÃzÓaΓ;ýKWJ“óÐÐl +ô† (¢úV?q@Î|o+'ìÜ«ˆ¨—ŸðmJK—ͯ­%†: èÈ]=æÿ-OÝÅÖLï¾ ”\­È3Zü§—:ûmÚÆËG!äKp–œÃ?+[”MCÛ®ß9Å9Ž¿|ÚtÈKÓÄF9Rî‡ð[/NƒQŠÝ6‰u/Š]¿>àêÞ‘Ê»6“³œoU7þ¹?yäU&¼Pè;%Ñ5¶“aÇž>hd"å}Õ½ø=}GJ ÍOOƒr ¢"²ßØVåÂX¼¼EJï,xQ• »Ž(×xo^—×'Ç‘ï¡O«R.Ÿmã-R·d)}j+Îê‹Î0óëS2½ÎQ(¼{`éä2bO¦íÆÏü¦Òûýmà ŸÍ,cQozøEBÌoû{y.к°åÒ}ë×f£LÑMÓ÷úì‰{ãO•ý;‰÷æùQgÜ«B÷4˜Þ,"2üÛU~Àß7¡Þ-æ@6¬$ö8Ø ï›È²{‹>ÓàáŒx Ÿµ7U«ï-þÆ }½íkî=ùÆMPŽ[wï{6x輪óhuXëç)A¼½©éUq·EÞ~áüç—/A: ï¦_ìÎ[».ϹÎ7 d Ô7츌~Ø]í¿ÃëM»¾<aµüö¦·6/âl°Žß6¿ ·Í¦±õ ZŽÌû¸ÓE”ù»ú÷bg`”åþŒ¼iþ¾ño{ö¯ÊŒœP9-˜›lË!Ö¾á•f>™Ç|küÕ^ÒûZ,­µ+ã7Ö³ÊÙ²Be¿~³³Ø2OsXeÐ_7¬¬±K2¸·Q>}àµå@u¯´'ÇÏQM|8é^–áË»‡?`þwŒ;>::Æ„Q ‰·Ä·©øQ»@ä™?øüt™Ã2"Ónz]úû?˜ç]† ûÕæ¿©õ{ }Ðú£Å}ÔüC ˜ÜyóìÛNîU¯²d³·Ñ¿:ox¿ïÇ KTç>1µ©Õв<¢—VqñöõÞè×åÁGOÜQy+ýø¹O çןú×<ôW>õ"¼o”Ñ%â'ký€¾Ç!nx³ë£ÆÙé`Ëî ù^¼|PÜA.FHì¥ÑM|ø7—çñ_øòÛšßçq³Ø;•Þû ËŠñ»VA“½™ØûPqdVå¶Yîe`2u-]¹sQ®6¤YŸ±Õ,ÝÞ˜,X8ëeï]èÓ‹Õ,Þ© ZϽXÚæaç.Ì2–M`¶IJ¡LiÑ™õ_½Ò+zÙ2<°ŒL^ñ‡<=>ý°£¿‹'“O<ôŒæ¼ˆèõbkKGöXH±ö?Öi'Ö»\R à@2º45 ËL4ÎÑû˜T‚Í}ºIk V‚5›‡Îp6ÆÝÉH.²ç^Þ¥sk¯5VØ¡8w¶—=¤yr¼ÜP×;ø«Ë]Ũ»òïqQ…ÒòóÜ!o$®]h‡›•yËÅg1XDCŒmZLEš¦ô_K88J?·ˆ­¡S¾‘Àày#ïmq2 rH$—уSÓë—‡wòI뇂ݱ«™¥F[2–/±[× ‹ŒY™kàèAPzS׳?<ù—¦¦¡¸O;Uع7]æñgG~hjÜá8ŽUãªã²vÎÁ÷ù.>׎Q›R*âc:f¼#U[vö AÕ¥+„©Ó?"X¶“¬Æ¹ivK¼×x€ÇnŸ½Qÿ;Ï÷œ£GÒi»·\3¶‹Ü°,Vmô& “7Àû—G˜B''K„¿ÓÊc˜û]i§ž{u熗&>N§Š¸'‡—‰EjŒ°óU˜BlÔUÓ;ý‡WG9¹»Zixà¾apC ŠEýÛMÓm ­Ïo–rû°7U™Ü^\~;»1á3‡§–ÙåQ˜“í@¹!("VúÒû§y}fêrßÄ„NâÞöF¢s Õ{¨g=ÏÖÒÑý¢yé „·ÀÛßßÚ,.oZߣ<ÑþZvé· Tþ†W†fÛfÚ(‰­ñwÅ­=?´YLª˜âìt†¼?´ôm¾ÛOoyí;ðßÛÞäᇠm}/ÕŸJª{³Ž#ÿòyCÿü Ù»&s6o7ñ×ÜØdøû:;xÞ÷öVS¿¶úäK\hìÍ—X;ëíz½‰O'ù¸5zC/7’z…ÉíóÓþ_ÔYh+ÕÒ_ÒUû÷׆#ÍÍ/Jb„ðG ™çéeM¿öÌ(c^Z/=40Ëš‡®§éå1_ÑØNwûÆ¢—gnõ*–*Z©Yúó 8ØSÃüz ©«ÉÌJN¸ gË—_% RU{Šþ^?ö0õ'~ˆžröù¿¯îÅ^™b[þ›ÝqËüÑ_:õæËã–ÃøFŒ¸$Öæ=º,>¯!B8–-cÙݺ©÷*YªXͧ®×CC]ß/ ÿî¿GD{ûe™û©‹±ÔÐuzõ2; ®„Qj¼”/¦C—âìöçìÞ¡b"0¥¡…i:zg ~é"ç¾¼16åÐךÁë³âEû2tEbìKZfŸú2O¥–þsždB£ÁwÙ>TZ•U ÒM5BœŸ­·žtŒ²ís2À-ŠÚÊ!dümúÐÔT‚#Û™°·Xn‹T"~ig rë6±7G.ÀÐ:BoøÝ‡ïõ}£V˜‡AF‚Ò|]AØØè]›%‚d˜Zo2¶ée¼4^îjhˆphu[ohö2Ôk(j\êKó Æuë‹}m·P|gÀ¡sY·"­{Äë·?rêÀµó¸ßØìÞ*|ªM×›,³É(WŽúoh±ô†"Õ?†Ú[´çqô6xCDoÈå•w>˜ÉÒÉxl<¿â¯[§=0}ÚÀ7)ç_˜ƒõúÈ2²ËÀ®o§6Ý 3»•w?AWh@ée¼ÿµ¨þ(ŸK´ÏÛÿƆ·u}Þü‰¾kçß>iÿÛ¦ñ¦Õ_Ñù¯Ìy”\±~ª¾!ÜÛšòýì>À'«ª{QløöÛÐÀâ2SFÄ(ðüR«l$ý„äÇEeɼH™ÚRgöÝÄq;n±Öñ蹉X÷Àùo²¶Êמ4  íô²e /&jƒ¥-—9dUI™7ë[QÕöF÷ÓÝþ{ð°£®‹yÝ“+‹è$Ͼ"}«Á4½RŽu½Â—Ô¯\’ô×ì†ÒEA1µX,ÃÔšCt©4F]¸¸ŒäÓ{¹føöº«CÿCé prž÷"KѵÓ+ ¤j±'Õ’™CÝ=*0}PnF8“áqž|r]y¡i ë­ÃÌf5°ãðpä¾a*Ž :=LK˜˜¹¼†Pnàš,âÕ¡ãõŽË±ÜdÅb«Ój#7Ãjü0j ò©sø²ÌËò¾áb‰\ÇÆd‡ËÜîVƇª/ôfsY¢(|aDGÖ¬‘ªùM)V¡ nü¯l½|²;qªGäUj»YÕd–ä­x1Q rùVãCy…>ûg ÜÝ8Lü¨9̰?ó¢ý'·fsÒ¢Odûݦ{áb£¸ÍÜw­x·Ž|™ZdD9ÛÎ×ýø†äûAEY|YŸW@B(‹<÷(U—Q~Ôäïó‰²Rü!wÿãUÖŸoXÄ5.Á‹š;¹y‰AÎ ÖN‚¸ÅѨ4D*q–ö:™Eÿ¦AcÆ%¾ìŠörâmÛŽè ¼¸Î7D _B£qƒO}êylaíüïk¥KÓ9ö~÷¾z…YIs_í0/#ö›"œ–pwˆ+îœ9^Š—[±ÍlVûC¿Yý4L`jl\ÐfóëfÊ)´0ÂvŽU‰Ë î–€‡è½º œ(.~€?¨ó)à¿i27)¯Ü+—·dá2ã®ÇoÝ[³ò®v˜¢Wª<.h[õøÇÜ ¦O±ëñ¥ ­¦¸ Jgc4a,î-ún{2/­œrâ—Zu÷c\ÎÍq’]îÍ´ÕýË<ÎÿÃvËÛfý3| Íúœ£_F^ŒíìËôZ&÷vJ/­^±üQ›Ï½%£[ýJ_ËK[`>‚Olöá¤^TšWŒó›Ì=\„ƒnõª oBô{Zê¤æaR¡~r¶‰}¹Ðõ"n¾MsleÚ¢ ´d‘c½•Ò$ØQn„ @ðjû2VÄ5Ïa>¨q–ÁKò |bõþ'–ʸó˜lçµvlfÊl —±H!Ò‹bÐzž7|…²»ñ0NM%ºÊÐùµÆâ±Ü0ÓA~«ì”7uQW¾)íe¦¸Bݽ¹-±sëð„c5UŸ<µÜdzie7Q9Žî8 tÿR´ÄQ_* ƒTÝK_'®á¸ø%V.ïk,t=·Úp:ì¥xq“ÆJ›Ák?¸/q¥wÍj_µãP99Âi¤Ë—ºXiæÃªûü]rÍ#Dzùc"“¿YUT»ïj?!(¯„yèË›·ÏɃ±Ø¡5/o‘Vò"¶Þ-ôóÚ—ê®åüK¬_ >ªu´½N=ëZãÃÖÕûo—w¯þ°û^ õÓëŒ:Kƒna !um˜ùôÚµ‹eÿâÖÇ2–Èn%Ëü¦™9†½P\èØ®Ëú M»Gr(ŒE‘¢4¾5|‘u ŲiÛ •YÉ›FÃr÷Üž"v,¼¡8 øµÇd˜ ¿¾4ð‡¦0/ƒEÞKÙko÷g— ¸oåîTÞ‹—Á"„ÊmÄWYs“1cq2o‹_+>êçƒöË‹m8Ê'»¾†ü÷°U ¿o÷ŸŠÕ¡`~W0`jѧ>xb¾ýÖéÏÃOü˜_~Ï÷ßÓйUëà³™V^ü^M»7ü”àç­@[<îK¹Ív¾/]¼›yøé?æ¨ïSÛzøûš‡¾ Øƒ³ÿì'Áì7aFÒVôžøž}ÿ­óÇÿ±@%¯%m†S/6WsçæP0O}|Á·8¿Q;/yþ°tŽ¿Ã³N2[HJÁä=>¬µTgo¬ÄÑáÆoaUqIS'()5Ü<üùþ}ÒÁ¦Hü=zž¦0…ÖL³þ0HÚwÿÚÅWäºGpúCæ³×݆ø‹?ìɹÿv¤<&‡’<—,¿½;ýéýœLä\v/F “¥E;M¨Kld£¿­¿ø?úr¾!ãβ #ÈQüc²ŽD~wZ›{AŸ†ÍK8Ë+¼BÁÔÅ„Á83ãáøÓh.Ðßì¿bK¨ÕN&$µ‰£€Ø»œºÝà=VíBV~+¹ÙºÃÂý§i+Ð}›ð³o":íÆ̨ïqÓgêb;c½nÇͲKÔ½t§jû%@í¿BM\Élû¯þ3øzÆ”úÛWæ“/Ò˜L~XŒÍ»Xì¿ýI'ø3üèΆ©øsøÕÌ8Óm„iâ’Ó½îÅœÍìe,xg]ü[|‘øûågð^FãUy*üìßÇš¡ÓÞl¾u!Áþ± Nwž4æì)V¼¸GÓ2xAÓP5/ƒ™<Å0Ö4gÈÕßCíXgsè*v6_NÇ0+RÊ»¤_n¾E0‰ƒilÖì¤(œûX¢QU|=nº!›ÅK•‘ÐëƒãÄ\CÍö„;tj0ÌnöôgÇ““J!ÞØ¥âXcò·ËÆ$˜£jüFGÒ¸‹ðyäVsè«<ÓsÿömåÿJû–å»–þmç·³}»¼l[Ÿµ}ÝÒðL+G—ka{ø™ùmë-/ýV‡§·::­0ÇÞSÿÊá7ï`ÛC_[î_K!…ÁŽgÂ\V°½\Ö¸Skå;¿&+M%Žwõ¯gÿz =¤l³Øû„ª•)¤í6nÂ’ D/làmß®ûå+:o“CW™Ý{ªÃÆ@“މ_Û»UoqT,jë°ØÖg“$# H*Û¸> Z Ú' Úòm[é_/kkËÚêØ0dXƒ=RB_D:ŸÙ!ÉÒˆ2‹ЄjŸ½]ˆH¾wø&pf[á(^è0‡¯² ðN ðQög飗CÐh +‘hs{úzfà'§g®øÅ¹°²S+Á‹¤í¨¸xÈw2ÈXfÝñÿÎcFôÇÑÄ’B~^Ì~ô‡wâµ¶V[›šÕ>ÀÖÈdk8Ë×óÊ*¤ŠòžhS7Dø¿É§*“â—Á°àO¥8º®giXÞA…Ù–Œ9;ÃÕ«~²Eµ¢r”bÅ2õÒÉ•äâ-=kn–. ÉSžMk&+ñ–K S]è­³óÔy¤0Š‚2¡õ¸·ÿ7¸ì$¶ €ã°ÆK8¦=#ˆ "ªìWÃFûqžÏ³WA¢[ZZ#­¥Ä¹’Ø¢ >/µÌ©îFøÛº=¯È°9uá_OÃçÞg±­—CædœUV ¹Aër<#®Z(=¢(ÉWh°e#°†@bÚ¨j#>EQÖ«Cør¶Øt-´Öâ+kÔŸmÞWûQmä³+Ë…ÊDÆÕÕÕeëÐT&F~¼.5ª£Uà¥påb²b§ÿÖà âyíÂéÚÇ.É;Û¨ù(–.%Õú¡L¿Di\Ç­£ Çƒ4Ý’uš ®ýÁ ­+•~UÛŽÕžm$NvÚ{_ÇJÚà•Ú´RêS#5Q|€ms#Å-òðV/¹©ÑWc÷&t9³-ePÚÓµ ¯¤w‘Æ÷Vß&·cÎdÊãÌ,AJA¶·©]Ï}e{’‘P`“¢­ñÞm0i³*Ô­Ò÷S¨ñ ù¡Þ„YmL“‘eÝš¤ñoµéº¶ 38¶uZ©Ö†ï­ý>iÑl; jof©Éf€Lm±\kÐç­ŸYÀXÛÄKur]›ÄÚ›äo_,ˆík%g“w 4æñ<ñIÔöl”*º·ëˆ4^ «šÂâl¯ýl¢ç$Ð é²=·±2ÀqD j;I†ÅWZ€ˆºïq9;ÕÍŽcÏíV'Ê³Ó W(q.þ“!rƒt‚Â# =¯ÆRM‚ŸÀ>—Ø$giH‚„q´ª òtƒh vöØN×fàˆr©%]¢ð ƒoûáÝV€Å­ÍíÂÏu ý” Dj´F: ©Q#ÉjoVÊådj`HM"¥¶Þj]gŒTUûl%hœJÉÔ•ýN"xuÊní`Ú é qÅmíÁÚH^ÍÀzpXJú‰÷ÑÞ_Á^ÐÀ@i(N#rS¯Yx¦™ ú kìlRÞŠËû ¼\J?ŒškQ-¹¦rÒ1†çzʇX7ÇɱŽã꘦€"‹·¥ƒ²2>œ 6°9«7“l» £*š™fv…œº Ú‚Ý/±k€´¦ÛŽc'\N4-µëìVÔ$,fÓ˜:?s‰à\HX®ôâ#çšÕJÖàgÉjM„m¢ù–6C¨TÕx·‘Õ!T’©"*¦“]æku+•&ëÖ4µþR=ˆ¶T¡q‘”WCìFû“ò$±%Ìx‘h/@j]i§ç«ý ¦<šÖ:VXRTìM ”©˜ „±> ôìÂmëºXÞõÉFDÜ‘é]mšªfƒØßGg£wë¼u0ò¾—'VvQmߔюfvîÑ<ÛÉ–§È¡ŒŽ7 ˜6Q´R½7É”U|5ªmsÉ«U„9¬©›¦f“dÊÒdsStÔv`O³èF ‡L¤ŠR!Ñ51R*°}‰\I?ú© "P™ÜLB#k-‚Õ*IÅyÊôÆ¡Ѱ®2æU´ZCGãÀ½ù') ­*eH<ô Ìu1ŠÉ«ƒÔ˜†ˆ¬ªŽö ò'mEÅCÞ„*Ìi°6^º¥Y ©|\œLÈŽSeÇÕ´|Ó^”}´\RŠá4mZ”MEV—¢vC“#½¥Ô%((ê€ZˆPw{|§÷uäÁàÌ—H¹KD{c؆ÚÜlþJÁÑܸ‹›9¤5Ef``£é[¥Æ•æ’Om"Mÿ—-"7“•ýw³â'Ú-I 6>´­ÚfÊú èS{79w6KŠÊÿ b 7MZË2är—VÐÚ8ó4±î1€k-›yiµ^²ÕO Aà¡MlÓ&3þ4꺲ÎÔ|fœ'~‚p×¶&¶8 [œg÷všÁ*å‹?MlІN5g¡ój– œÆ¦ŸÀÛYtJƒwR!©{ŽØó³8}Ve÷¦–›¾iAiÄbe—˜ÑjhSY…æwÕ A¦ÇÞœ5ô뎢Jý@ˆ$ÃâKÕTÔ.¢pcàâTúçjîßÑ3Qb¦+ü\XV ׌š÷ÔQØ>Ú«‹Øîª—öDc†Tžgbœª(¦æa«¡Õ¤†cW`nø ÉX+9ÒuK;iüZOj.«jÊ0¶.;Nšl„e꧘"3) Û¢”®<ñÚ€…º>V©‡is¶ð¬R×Ñã.'ÑT‹CR¸Àgœä2=·wÿ3Ó-5,R¯èКè×ÃKy)F³ÙÌÎ30N²ó)²ÃøKùo“)òá28`ÕÊ)´?¨$Z6ÃÔ–gÜu­]T©êlªµ9ljÇæR;2TåÙè¶ / cõ5ï‡ÇC¤kú&J¸óßÌÖ†k¢œú–u›Ù8‰z®ÖÁíØÄºî››÷o¯ìòêŽ@©dHΊ%øø MÀö¢´Á'Ÿ‡8ôxTíZàh=îÍ+M^‰NYw&MUPÍ—³QÞtq—ØØ!ÛéÐzë*»± Ì ªGí×}ˆ]%x7•ÎGbüèÇzÜG8>zmEpí‚)­À{tG±YËÍë»(|›ÜhĈ4ÅlÚjÚ0{hk¸Ç37Zp/@ªÙ±½™`Ù@À0Àš‡Ãq¹Ú+Õ.®¦›­ †¼’Žì ÄsîÆÈ Ôp Ï®’Ý6€teZËMDq#%nf R‚‰ÓW6±àÄúÊ6–Äà6¶h±¼hU„MpE—¥uS’£|z&¡ø”`…8É ©ùJ}ˆ$94è×Ö顦fuçäkƒOLïÊNIj̺Û*êð¹'ÓÙêõÀg<`qp“£184QÃ]#.‰ÊŒ&×ÞQ]ùÿ«áö"RëÿÜ Óo§Ò ²Ø Fw†'“Öiv8d§O©-NClp·º©äNØ"Èn<ÈÐØ²&mJB©!è Š¯¡š q›­Þ˜¢Æt-cRLιÂLbªœâ]pÁW„…1pË8b²Š¦º%Ð7rƒ®!ŽŒD%~A\®v¶Bf«ö;1tXÕ|hÒP<¿-uê/‡ÄƒÔ¡nÄáôv Qê-÷ °Á ©èÔ5Ž¥I‰ØÎºA34âÕËVUö©ž$xVCbûÉq—UÚB(·Ç®“¾bßxmJX¶Ð2`„ Џ ”¹ÛÓÔÊz“ZºU &R¥"¤ç„ <¯Œ-‹±êh*«kÕ¬TÐæ‡S{j+!DßÈRlùu ;yTÌ2Ù$Hk36óAC ”g_ ö×ND3§ˆ¬­F§¢6¢7(np‘V:+pN³ø‚Œ‘+ŒUš5\ÕCÜ+Ž|ÖMiÁHpD º:aPê‡æK·Š}@Þ¸jïtD‚ž(Fëzëw“Í£*5I+ËÓÍåz"Tm‚ S c1eæ[“yE-ë“Q„-“ÈËF«{º\^n WÓ]mµIRõ/v¸1 3Æ>Ä ãùõôm©6É„Å6nSf1·¯µnÚ½ î¯°¹¿a Kã{QXd¨ ³ŸF¾Ñ»è+æ´%»zÄ ´$²Ï†ž }…ÎÊ{·÷šz¦­o‰¬ÝO'É n£ê²§f0,Ù ëÚ¸YbÌBo¤=©†Oâd’KãI;…Åõ„!ºy4¤ì]«6“ÑdÒÙ“ºvýÖƒ°ÞžF#U³7ÔC”"øÊHUCj%`MK]b/ok×n;‡'U'…–åðpâ}Š ~#”FÈ VÑšå’Œ¯¶è‹B?à oS?¸·"|ßÔ"wƒÙtÎ4¿åßj›MXUFL›ã°KóAfx‰'ˆ4<ÚÔN†Y3uÐÞ¥_9¨ŠÒé,æW×ä‡}•'’§2Xb=ÄÅlš‹›7M¯=²‹¶Rþœ$i»hLâ:ˆ²ÓäÈÆX°ì_q9§²XÇŽÛðЩ$+´ œæ67UiëS=áKR˜žbðûh¢_&™ŠoK´Û IÕCñæ Õ]ãw×ÕGãqµØŒêúl4@c‚»¤dŸXÁ…Æöâ‘¥ ˆWÛª`´ê°Øff#•ÁŸÌ9lÊþð&{ô°‚W4Ï 2Z”w…Àª°ŽÔNÝ’ïµ6Öæ&Y•Ì÷¡,[B’;Ä–-ˆå·,ô·ÑjkH‡…й!wÁê,Æ ²¥pZØg 1,›& –D=»«ŠN¾“ é%kD¯Â1lÓ%±7}C>&_í Å2Â|Ц¦˜¿©†pF“K]chÚT!#x Ü< Ñm}NêË@Û,º•Q0¶mfÛM+êf’"¸-1}:J× ª„B’€L&†#Û§‚„¶×PFÒž q)aBJ¤¹ Á]*¡œ½<Ý Jš;ÐpÅåT„¶Ê.zˆî/HVôÐZ† è* ½¡ƒMùmD¦Å³Uµ\ÎöyºOwb—p=±¹ƒÄ W ·h„„=*(jä*° )‘D)¸o'€ cÚÝôËûŠ™fDí»H°ÀÃæ6&³ ºÓ(¼2vQuOç éòа€8©²gÜOê1œUˆÜÝ2Š…;vDÚ¸Ÿ$²‘ñ¤Kƒ[Ù®Lºð/¡ÛËÄyS"›xþ´Jž—G˜Úº¡š™ôE¹àj\MÔ„v6F˜vàšÛ$¢tÛÜ5©*u¹¿qŒù=ºU",'ÛjæØ9Ëí pnøSP0·ØànÃ6W;‰>nª¶MZhZ4 ÿ5§H\a†¸H8åtâ†0[Åãdœ Ë]%l4Äøç†žòè‰íxëå0„N…Þj!5rEŒ¼²cjº2%~Ø”¯¹"øÉRè:Œû7l6B?‹&¾1ú|^02€º¢'-ã³Qº8öGØÌËh¹$ÑA5éû*îSŸð¼-ÍNˆóuë*ý(„1»Ëûˆ‰º%°aw¬­¦ù;Ìm áCb©ëiI HÌjTº]ž°¶±³ÅÊçve&X$à„äñU.Ýþml+é5¶Ž]-×w9¦Î­ ažn8Ö Q]kË„>×=ͪw‰\Úe[»QgC1ÌÃܨD(°pôtaÁ…Û1qǧlùXíÚ¬”Ž P+£È L§á®”r2…« b.j-ÁØßv @ªŒØ]köÖÅÆ½jÒîH\l§ê@4¯û0N•»…Ãø;­!žt].y÷+¦”`÷+É6R"vOÿJaË©Ñõkä1È¡¢•fv‹TÜ ¦%ùpg¤ÑÏ ™ÇA~e¨¾"XA;„aQ !j£€Ã.%ŽF•š×ÔL K¼Ú7]‘€¨úä†ptóçávM›3÷»S23AH•¥—7õËt.O«’“@ž…:äKÁ>6s]Nç<ì]JZ'4´ ÷€ 6ÊUÈåM¶òÄGovdCì1zàåîØKJɧÝr2 .vM7DÁÚïfwË(›§ª[§'ìÏ3ÛVZ¢—lÆÃª< ¶™ˆÊ¢ä4 j÷¼öæéÂॽƒu“ ZÙf[!7[)Œ„CŠïµk¢…Ó ü¼"‰é>ÕíP?,5j?{%½Á¶0ÍNH³âíÃS¢|kät²fjï Ú%¾dÃnE8`mº.ßU£•ì‚Æ»¥ CèQÙmrEg¼tA¸ÿ”!µŠ•bØ h±!RÐ:Åjªÿ$+VعwÑ # ‰º{üp?±J\­Q> MM{—혒Nüõ‹YÈ¡D0—®qcû|F{vOØÓÊô(]nFœŒ«¦Ü<;Ø4”tá3ñ·Î°ƒ³áÁ r™û„Gêñ„öT,þÃÊÆFXûarˆsjèÛ-åj££tµ§Î²o6†?4oN= µ.‘çCC$FÔß*2½ Q}Ç̆4ÆI#‚¦ $Ù ³¤‰ŒUà×úÞ¸É%v÷º†1 m¥¦—ôRuZ= Xá¢* •1®˜¢}SE¯³«&N@¾Ts¢DœÔ¶œ{'"Êt ²O]IJêñz8æ4u‚}+ÆlNÇ`wŠŸr>¹K©Y!0æg>›-¡lâ¥Âä#ŠÄ];dkMí`7ž‰˜g“'ç®Á"íÕ‘©\´†Z %ü¿âC‚F¾O8¬6ؤƒ¨µÆyŒ>îÛ‹yMžÁΘéÑÝÃê§ešÕf5‚t‘†?sß4_4¯Îù¾‹}APíl·{Ž&“X·SOZHþÅÛn9¿[ˆ87æfj)ćk¦•6\kÙYB†‡q›¦ÊÂYé\g´r®ºeÛÇ,žøM³fW€òhƒ&Ê| DaáÐì%G! ã¹JWwZjS¨1•Wè‡Ë>4E!aW%5éдÆK¬úž³Ù3îI;EóQbv¬Ì€µùsì*|¤ Á Ã=Y¼3üa6¿ïÚmT˜»1ï)ηjoúî§ åz¥è¯l<ÒØÂò[:Å{Ü´`lÂ-‡¢ISc!„±ã àðIŽIöü¾ší/91’$¾_!Ó²Bª#µ ‰âe•ÕWîe‚ÍØãµ’ÎžˆÒ%Z’%Ö>¶0ŒT“¦UE§acŠºI× çç€òغ·ÜŒM%BÔ;וéÙçØ,¡ô‰5l4pé¶nç©J{èÎçˆS¢d~Äß*3˜-E§yh”ãÜBóQœÝì8¢ºPØÙ=éXWêüc£¹tqïÚMx¬šF!»"»#ÙO]>Mmb‡ò޳Bv–‰‰LÙˆ +ÜriB¨îN+ÐæN7T%Æ©PÅÓ´­‡; ›†ÊŶý QÁ v¨ î“HZ|8ï¶·¦;à~r›¨“뮈ls·QÌ@\ÈsYƒŽFø¤r‚P†ã`«Èµzº.Ã#~P•à‰ù›4ÛÊÎ õêÛ‚º™‚Ç5Ƀ|è"ªÁŸ—nKdÚÉÕ;‡îüÈR‡*Ýœd?䥎Yñ$+꾲춉Q:ìÁª bª­÷ôTVxc| Wo§ïçqû2UwF։ŞÀ†œeDpðM¾ÈŽÑÙDŒlC•Û Ê¢’¡fîåÑT©«Ôvái*¦zà°e™úyÒt^{*úuPê7bc¬og‚$ФM£;ÌÇ:$®rA–ôqÔD“ÓP–½!.°¯’0\j ôég2¨B%0Óu8C©ÎŠè‹•ÉÆ®Îƒ”¨é•;¹(ÄÂ1# }C.º¸ÍâÁY!âà¶ÃÎjç E|yõ!õ¡Œ¨4Ú^„ÅiT »ÆüÃS#UÉ8…å\¨6’É`դŠq³Òl¼°5}y .Ãì©ÜSÞ(_³ž 'œÁ»ÝnÊY2äv!bPóýhð¶‰MÅÞ=ð³‘!xbØS¸Šé {~Ç%“؇eÓ¢Tqµ%¶žRß’mFž³’”Ú™‰‚„µÔ‘A,g}l"Çîv´WƒŸdÉ_Öof"ìkº÷þôEC¤–#ÂdéÕ@ׯ÷]¢.^a\r/d±7:ŽQëÓ-õ ^MáÇó32*Ru›ç‰ ŸM”å™Y²%êtôç6cß³ÃëGîÔ ºêAð­^º™FãAÖÆuñi ZV?ˆ{Iè"(¸‹Z×÷ÙÏÃók0xÚ¸Q·"KŒü¢IÖZ¨gŽÕ¬.#„pº‹%/‡¹¦«ÓRØÐs0-š™{$žY/’gÌškgÖ3v܇æ¹9¸ íê¶ný¬íÒmàídŠ) h5N¡_ŸÇHЇ¸,´‘}v`“­Ée„G¢)áb"«×Iž=»éÙº®z ™š„:g·L<ö¸¿Rÿm¦a7…˜ááQTêŽTü0zPä+À…eÛ=p³¿Ša¯s` Ì÷‚ R )Óãeó|ê.´è cTÄ7u+é T˦$¬Ä$¼ÖçðxØ!CšKaCr·§ãK•ø—˜KÏlôÙ¯‚€$OðJ¢CVI–ê¹n…¥¤»3Æ*h93CÁˆ•!G†;Põä®Ncf‰È'L‹'r™Ìú„+-ðU/…w'/37¡wÏÔm‚}%¨2†¤.‡¢¶¡"Çl$ ©ç"‘¬ÈÝáoœ¿rÌ‚ ZõÇ®ñÿíp§JèÜ$g©¡s~æŽ&•%™Eá¬ÏϘ(C¬I’Oˆ‡4¤˜UÙӘ銗¬ ûË÷ëÒx‹ˆnÙh(IÏôÀÜoF9Ýr0)ËFìÊ®1/`Ã!Û {V˜@J]ÉÅ3а‹ÙT9Q{ôí­ ›dOFÁMPÇþ¢¢8³æéàðŒx?²†SÀåv›beĽÉœþC"'¹± =’—É;õv6‰5ƒÇwåœäe Ù[%9 eHkÂÜJM¤›æWÌ\PáLYÚhùdììÙOŸ—)ÞL:HbÕ­´÷·j‘ÁU"õ<;¤!–óRU‚•R¹5®ßV?ܱ]LŒÞ 6 ø*Zwlüuhx‚{äà¦fËÙŽ ™LWfî ĘT‘eÏ›‘éç±ö}–cïw>ðØ®¹ÚWWsO™•+ñZ5a¼ÉøÛÁ¤?ª¬ƒÇ4×—uÀ|ŠÇdóêjMÂP ”ux¶¬1•ER’oïÃ^OÔ )‹è»†jãÉ]¶p$·VN\ýDÁAºáøµS¸kHhwK4Œ©/;¤{}ŠTBHÌ«ŸwåöäåK?·¬‰س>ÆôDîß&Ù#Áå‡oýè–D ΙXËG3N¦=@àé™søWç8f&z³s?âî˵‰1¢¬G%e¿ê¼Ì¢ —~nW Ï6ÏtöN¹TG\Tuõ\o];‹Ë¶G¯! 8Jº+Î$ñÌ>â𒔺nãÙQÙèÉjâñ0œ©ë¾\ÁƒÙ4¡-?wIëAî‘ì,èÆ‹&o@¸[Kí‹]¤ÊQ½cß æ B›Þ³Cà‘Êõ`'•&õ8í­®‘: øèZÅï–ý®„X´t¸•#C«&{rÉY˜H#\u3ß|¸†¹=Bóæ±Í*Û_™F6vILôe¸­Æ uGÌ~’°œg¢<õ~žf>óÐÁ𰇫֕^ƒ£(zÚ)gÈ~žÒ²2Ð#›ˆm%’~)#6ùõì\σÛõ²ß™'®,ÀGr’hn“÷ûÍ‚ZEeâ5¶‘Ñ’LÄ•P$Ü€ K8ä´!öÒréOàêfZ¤«Bº ‡¶Y9HR=å@õª'3ÙaqS,êÝ%MAx:ܦ†*–¼‡îÜðn '<ò{òÝšô®…ÀÍ«)´sÂ2"N¤05Ž@š}fÒ$ÏXpS›qÏꃃ‚XÎb5ãõÄìVêæiSc$·lY·ëx&½öÀbœ\©¬ ^²ç<üÀ¹-ü|ÊÆäE5Z YÁY/ii‹ ÷ä$=AERÙ•¦zpHýêLFi ¬(Ô,<(ä ±VõX#…ÄA±€ ¹ðãxö; :{D•û¼à¸øJ6Äj¿FÒ¶[Š·¨¼?©Îêõs‚浪¶ÓeRüÔ¨£Ìvÿ4g¢ËÇ5ÉM.R…óC=üm¸ã…•_²M¯.<Ö‹Ô…CˆH?Ôm €|Ì2Çy„¤æ"®8ò¼¦•·Å0 Wd‰XHz.ÈCdÊwHñÈg•ð–öUïsÑISN‰G­Ä[4†'Þ6óf…„‘_—öÙ¤=iNÏ•)ÊGviÑ&¦€¤7Ò¨c¾$þ=Šú) @¨Æ:’vzÚža‡ˆ—ìF‡ä‡\:ÒåK3Håx¾Ýþ¤y‚{ }DgŸ¨ƒˆ¢]¯ˆØ ÏÇâÆn±˜ŽÑ$oI[­N•[üy¼x–¡èòa¢Áçiç׉~œ«Ò¢PNáÚ7‘ O½ekÃ-)à}½Úà¦Î²«³®[ª$©ªjÓ*ÀˆIjÔÑѹ3i&J=uÆjê]â«\a W»(ØÎ²€r±ŸÏ.¡h Â8Y“lã¼ÒȺÐy€ ò.õˆ ®9jëiXm‚cOÝmP4l’¨cDDÌ {°VDO‹á<Ýÿ”šØÅIïA5UyËö/@{bí\"+‘ãÖ5eÖÈøLhÕu±uÁÝM~…w'Ѷâ¡tÜ©VÍ'D«§lÒÒê!U… 6js=A,׊‚E̵ÚFØ%eMëm„ƒ¢ê̾sué‡Ì UŽfë¨9%v=G6!aR˜¢â+~|7ß$øæ¤ñ#év«rYªk!eb1Ça¡íxÔªÉô@[”F[VáE3½6Þ†½NÉ•2­q †?W³[Už™÷è·"Rp*‚Þ![Ì2s⾌¸U3©ocšK¤65H׆P°TúH“P‹§MÄÓh¤Ø£ÛɰœêB5êztƒX•˜DwĤ…AF3»;óŽx=nAŽò.ÇTW‚úRÃén‰‰¸½vÚ!WéÐõ—¡®Dí·mjuãOZ±WÁÞI-‹À@ÅHeÇd‡j ÑV*O7¬YnUÒ%'X¡O;Ìï® W«š¤Ð} ¿•vô¤6‘VÇ%I6¸g©›þÁ&ÙÕ&‰¦ð60€°c§‡,S—I&·‰E|OèíNnL sp{´l^1„‘õoþÑš Àî‹OÌ<—îP€Â䨨ÈÖídk²k\I*Ü‘¾©‡YkБÈAÉÜ”°qÌc’óÈ«ÕÁë¤ì×f÷šv½‘VÍÊ–ã"©*žý¶±.ÅÌ_F”IâÛÏ~a§©ôÔë<â> Ha-?-NF€SHýêÆÑÞf˜]\™ {õÇíæ!k·ÜÖíÆ•yาI˜r—j">¢…+|&fr°EsÚN¸é0Ÿfa÷WŒß‡E ˜7,Ùë’!Fk™½Š;é”)„»)᪺«ªî@³h–Þ¥:.ÄøÙžýRÌhOJâ²Jv¶C *6‰?ï»Î¾›±—š±Ñoìž%룘Jêý•f:êÌD·+ž„ îY«¦%âtÔh¯˜§¤š¨‹:ùzÿ¦ìx©èéÙ£ÿáš2iñ £-Á\kãQ•»þ´Zä"]º8Ï*òfŒ]C»»)V‚-}T âö«§k¼çÔ]ú‡ß—º+·ËعýÉ]s®¹*ZQÓóã!_åB¸µØoFúb¥h$¬z£¯Ô×-þA‹vÎH‹5N+ãeÞãïCZ÷Áwy¾ž¬‡Y%kWÚ¯>#Ozh(Õç“7¦œÕ=ÙÅ–±ûd-m Çkxb7€\a{ZÊŠ›ÿfâ(§Ž¥ï}éõ¼ÁmíSѤ–Oàäô7›Wé¦O©÷D(eÖ3aõ\û°ÉÑ"Ó‚¨8"ÆAïÛ7­<µM’α¦ã—ÁÄãËCl´ÅÛó²²ÓÐsh#Ỷ‰ŸF{§ù]äÒž‹Û½ý!‹;’ â>i¾sŸÏI¨Èó–-‡ûŒtrWijlô¬WòžNþÉþ›AgG=Ž¿6±ó ß•M9rrX[ÿ‘…Ó!`9ŠS…5Þåãe".¶FÂæé6yØ7³CÍ&ï‹¿7Ôé5ûü Õ‘6Ÿóµ: tì\œÔ'G±LSÒtÚ‡P‹²Æ€ Æ~«Í‹²L®£ 7Æ©kGÀ•ã²ÚüäÉô1Î;VÎKç”d¬­Ê7‘J¶fæ*%Êu©ï9<ÉU˜VdÆh› _ ÝÏ­HÏD&ºŒ5»0qibÇ„c@å&ƒ¹HvÐS3Ç23‘_aæ.9;ôy‰Œ ²îÏ54v>´ß(\9‹ »wv ¹Ä²™(^„%]~Eœ `LÔÅšB¥ˆ?›¦‰‹.œD„Æ¥“SÉ©ªÊ:làCøQ;®)0¯™ÈÊÉÆ»DzRd ³(;Êï.t®¢jûoÑž'Ó³÷ÃA çty'õ«OÜfjò¯‹JÑ Qth©*î¿E¿™œ7ù&ƒ‹”`qY!`É8€H`lŠÁæyK%¯ÿVÉ;J¯4}f¿_®ñŠÉ[7ù!ZɛԔ™¾\{øNŽW¶5›üì=_&vDò êæî "¢ötA×;e(Ó25m¢ÛvÅë3h²8˜hòGŽ’ö‘ƒˆ1&"-ÖxK`4&òdÍ&¡:QÏèÄêsm»M:[㘢o&Ô‹] ´·½°¤i¾þ[„wÿ½¹0èúD¡ë*Á4ˆé@ý£/ìâýà5JóÓy›×±½XíüðJ“¶8EŸäæ¨_Qí÷´³k˜>Ôþ@)ö‡õ›È¶*—wð2áº{o£½–þ‘ù’Øš“X}H¢HIvºº2Ê$_ö ™ÙûHN‡ŠßThá´þ.$£|ˆõ‘W^¸z"p 6yÖØÂÕ¼Ûãr„0é/î@+¤î ¿!^°‹3ßT°ñöuÆâÏb4†É dI™Wþ‚Ïw*ÔœyvYN‰ !'Dón«Ï‰õ48²ÆFy, `¹é¤µ’äê „ï ªò±[×jW½½.o\o—åU€C¼•`â¤rE]7‘2ELGxxi×ÌR4°ò>P;Ò.L‰›HRåùgæœlB'‰‹ÇËW€’tŠí„ðf=’EîÈU=I^ÏÀ¹1R-ÓŒää,¢Æˆ`ÏjnÁN8Xž2ç BV.E¤xë^éŒ6Øeðü[× ù+ÙS™˜&É_U¨!Rpæü‡ì D)S=Lb‰±Q{g¹Š6!¡+]—k>v•¢ê  G”Ó¦ú1å+ª”Ô'Œ“Ó&ûP´C’mÒí3n'È›øE¸0¤'ÐÝ%b1;Çäjæ* FÞ%Åo'©>qSì‹Ûëhüdœ@Luïtù³€)oÁ¼ÇŠNŠã®ºguȬ R’ÒÜS!·"0]²KhÇœjVÙ»ƒK\ÒF3É›ÀJrcö&làç…¨3Ë7hs¹fA@Ò-Ò¡‚DÆFÐ2¯<–Ay]k@PÚÔ:0 ­ê‡dÚ\#E§jÜÆÓcLaÞyÉ­%$;6™D[ð:q}tÆq¾F  xÕ÷)sy£XÈØî £fyKEâ) —¿I—ˆ#¡¡qÊ%GaÓÆk`«Û,ÇÙŸÎìv•.þ2vFžzF¦[BNwJÑ4ÜÔåÏÛ)3»¿m‡œ} »_A05^M9òji4¸QœE1!\g±äÁØ%©hß»ëÚ…+²áòv©asˆ²>é *¥äD~mŽ«!’†3òéSŠÚùLACV ¯ ‡4‹åÙ ¸c#¸ØÚéäʵp`&UñœqWFÂÙ¢LËä†Úh§åD ‹ N;C”`—ƒR”â9 @{äM3ÝCFnœŠ&ŒO3‹Ÿ,«@´ÒB‰7»àêÞ¼ÑÌÌë–FbOGî”’Å.Ë8P@íã0[Â¥é¬% \\š„DoT1£K÷6ö>×,÷”&¼ØÃ¨Ò]Î c-g&ÑAÜ×lËf4á6ßœÄõJn¹g18³ÛqǦ¡â/ ¤ € e¦ïåZ•åðcàæSíàJœÃϼ37¹s„ÕìæLd§ÊÂËûFÙ&é ʃ•Nj$.Sظá'G€ ½º\^“Ú^Yüœýi«“… E"é¼­óôG`‹är(*eë:¥Ü—P…æ’\.Û=zäésn=\¡iª¶p÷ÇN˜$¾úvfqRÎ\%Eöe2Ü…TxDC|Çë4-·iT8qŽErêÐ@yR¸Vcà/œžÙÎn£&·ª%m[×&ÚÜ®ó"ÉA~-…·Ü¸¼§d­Vcnµ`DúÕ µÑ»Ê|üeDáuŹV¥bèŠ3ÈVsf=.†‚©º3÷¤D›éñyËb…øsŸ°ð@º:»¸ÀN`X-þ‡;yÕœgïE_‰Ö¤‹ëíËØ‡w«”Ã|åE嫌+2.:íÒH%ÃQö¨g710r/s¯[„sF ±Í%îTàe[i«›7Á‚I±Åû ¸9‘%p˜Óy©cPÒ¡‰”³: h­Üˆ„Ü“ÌxOY5ª„ÜÿœLåco,á4Aæ{&²zQINÆ·1Ø=®‘IȨË+ÁH¼ûWH©NLã8… ø.#×fÝj†(K—5šð”§:i±&åî³½åUÄëŸ%˜”i*Ó]Ü©[’޲í.»¸I ^Ë »e§Âp!œ‘°Š²x^=H‘Ò„ø"ûä¨4:Pwrµ@IQ—n™‚M³Xú¸C$áNTi ¦ŸºèÝTÂYC"¯1ƒ—:'¼ÍHxCß;ÙM,1êÅô4÷øö"vý!29H\ÅM™éœà¬Uf5ν¤Ò=[œÂÉ!(‰ûà²Fy±µ—*-Ëžq!µ Ag‰•žÁJ9é¥d\m—SQËVæ×‡oÓ•¶»éœE‡êD£zbô*H¶°4Tæ!§p“ MYk8ž·3røµUãÁ¾¶26ÁÑò<{3"lÝÔ½TG/3hÛÅ8Ît°8õši:á-2Éî'wCÓ«ÑïL¶Ër½T³Z×ù-è`¶vçþÌ~)FŸ5«‹^”5ð¸ÖNð•Þ%å䜒;aÇ·&¼X"]\h½0y¥‰GÉ*æTftFóvì7Ñ•™q­ÊB¨8Q•qp+1Gòd€#÷÷Àa: ̘^­ô"ViÂ[°Ì*ÕÄ‘¤„”™³ŒdÁ„+|ÒµKD†&±Ú'§­§)!ßñ¥ÕêÑ£c‰DŠÖΛˆp•Wß/Ä¥¡9¹W›y #nÞI”¦GÎe ¦‹Ñ¢t¤ÑeRÀ‚Ø%z_Ï1 OýdþrHp²¸Ñ”D^Àø…n  WÎͨ Sv®Ñ€Ç5'òRþÆ5 á¬ÌDËL¿*KFIæÜ`(*¹q q:Hƒ¦T‡c!œ“/¼ˆ95y'¢ ,‹PkJfÃìdehHä ´é\ÄÁ¨þ@—©ˆ/‚Ĭ­vc½ªê‡®ë$—Ð|2öÂ݃Ä1Ì6áÍÝÂϼKŒ¯aüLYp2©B÷<ò*¦clå. ÑìÈ»€1Ëô ‰¯½ÙpÚNŠR7ïpí£—ŒD˜tÝÃ¥ŽË›M·®$\ûœΛ¡ŽâFÚ0«]·¦R:ÄUSGUÃdfšœ¼Ä¼öðN¢÷OÝ´Oí¯ÌèpwaÛ:Ýþ—¨•Ü+–×dKFþP®J¥I< ”ˆ¨Ëƒkº¹3ië[2òz–T´MGD’-9‘·Ãíè¼vK?[(Yü8Êg×äEÿTº ‹loèF-´‹GÎ=ö‹Æ ÍõLìV15hDfì¢óxýK™p"ëer†„Ç8†ø…Œiè>Eq˶ìÆW-º™äv ° n µR\ì“. .g3µ9QCrÆ–sº¨™wó<Ù†§ù1 QlJÒC.B³4¨z¾îQM'¼’ÑUõÊûw¸Í·zH@@‡E(<¥‡©¨Œ%ðpËþ¢EÅí¤ÔaÀwn`…æ´n!Ø'¡d;5æ l²‹°1q(UZ³¼í ´PEEâBæÖx¡Q–ô+ÆpF) «n¤ùå’üQ™¤cü%Sà¢AÍP%r!äsåaP‚€I¨BHrµww+Ï Œ8ûzJ“MSí»¤jÉL¿^É&»gt÷®kw›Vf‰³…è"ç}Þ9/îHeUÀÍjîHãÏ)þîÉII§'ÏÑÔ3@ŒïŠÜOWÆŒ3(¨/0ãΘ=<Ÿºj†BæÍĈtÕÑ($2£UÓÀ%ÝdêŒÌó<+¯üØmÛæ$WÉK*W^‹ŒÐPæƒÜÐÈúª…î¢$¤ñ勸–wµz¾qFFOfboÈ­²½#§°O’aë©ð\™ìÕÙŒÀ¹Êf*ÅC¦nk¹!Õb1pÃp­R@Wž’.a…‚É1J‘ØôÙ…)Ì®6 Å^Ʀ™8.’`å»7}™H2Ïrs"©Ê¶Q‘Œî#p·D‰S”3´ûNàU*;‚”8W‘2@T®èÓakMäœ ˜™i§Jü½´k‚¬¹>‰oøÊÝêÊzi˜H4Qõìâ}Ó±˜Ä­ú›ò•PU–ÍMaä]¥•©l¸)Ÿ„õ³… »Ûâf:¸LËE…ŠiA²rÁ¢M®N…Ç<“x&yÑ¢Ùìð3 5lÑkNµO8je‰°¹Ÿõ’×z+CÑ /96¬R› ’È™Š;—“@\Q]*2PSÌ/>¨/m[Tøfד*b½dš{ø&$˜Wâc™Ã¤I#ä=žU¡ƒ6bíulg[h¤í¼Az­¦2‚YW/&äÿä,µbñƒy ijõTÙŠ93Ü¿ºœ^oâVl:qÁ!úÊað¢ÁÓ¤JîÔÁmp@½:¬K‘Ó%‡ÏxëxqÔ–vÜå8TÎŒ2-묑Mó¡ì¡#n‘bG)W&ðHœï-Èåì{‚™ç ¡wlgÿð‹GxJ/®bhå¬ l®§Hråfñz¼,Õ8ûÌRŸ+3ÔkrC‚IÀÜÛÎ`vn\+C’ø/vïE{°Še d…€, 7¢þ*¦ò%×8Óø,~zOÔnYU‰At˜ræi êg=©·J6¾K*ãÈKÜ„Ñ5HZT²%Úç«H`5Qs­j+Ò6}H`{§Ô'ÊOá–t‰ Ì0ä¬vU–ûŠ]Ìà (tÒ ”W1¾iB|/ _†r‰d¢¥Oë/¨IÝ,L–7w\º£ø‡‘3.ËËЗ‰oÉLf±'2‰­Júrbä¿°a5Å™+§É´8°o¡ºÍ…[›)zèt¬„‡Y4 @i—©ãSÞª&¯àú&†BËÙ6× ÑÔ1Âl&ä‹V­ÄÞÕ©ö9ßdÄôÔd}ÉËÖ·˜“¼\Ì÷ª:éGÀã ­BÄbJ°?ãµq7Ævqæw±žäRQÓs㆙÷îTy;5¥ª1ϳ†×’løóˆxVÖŽ’è)ÓÔu ÀÉÜ­áÄKΧ&¨v}ÀÜ"¹_! @¶¹ƒÞÉxÌS¾˜B8›’¤”ßÑ–ž¥-t^Ed\ .較€‹âD«ÔŸ6=„ñ‘”Ê™£|XÀЖ9VÌ19xOŸ‚4ÕRΟËA/Ѻra?uÜÕp— QÎöHújC®˜ N€3&Ô“<.;¯àä„…:˜ ÊúË0”…0yÙ:ϤšÃABa—ežÄR§"ÜËȉֵ”VÃ6a¾_ºÌK:Üý-Ö3¢ú6–\ÑTiůü&àç+Û‘8¸]ÓfÍV9AÀ _Qf¯pÐÊA(®DÝ.h J)'˜wöxˆ»#¯OÂo^R •àâ)]‰ÐëyúÊH뇠RÔú±Z/P^‡jkÖ“LŠv½I°MXs|WŠÂßW¯ª2{‰ñ$„üæc¤ܤRu5ü~ú¸¤ÞÈépd%<²8¿q\eàÃPpp¥*‹äbèFJÚ‡¸‹‡6²\òqöaçädD‡ˆ¼ÇW§P9¶¬ô¬&.“@r ·Œelxt:®õÃØsUéãVÖg!,xRå8¥GXAÈmÉxcH>UʮƹÛÕq|<‚‡MåÄÁ¸õ¹ËJP.à's6°Ð/p®¾þ‘~÷ˈú9cÒYàªÛS-"Wd\úÒ_Ó¹ÚdJ–äq%ÿ½ËbL“rí§®‘ NÁËlЩ=…K¶!¿ʇ!‡wU¡ŸDJÉFD›`[)Áñ¦*æéº_`›dj†7(W¤èdvU˜‡Šq*Ôs%ÎyÀ µ7(f¼·ˆðp”ìYèCî7'úN>*ͪTDG¨DVõÛõÇiêBU´Ì©˜øW¹.ãôµdUÀ÷Aj&œUò‹fÉÙ Ff¡³e}E–fóPÓ¤ó›Ì®Ù¨F($]*X]IÛS- Õ¯ÂQ"¿Ÿ®OdÎÉ‘/&“pã&¤uÈœøâ;.ꤔ½t’öKŸ¹jÁ§›²Ñìλœqãu9R(žÂ;HÜS¡GÔ«ìÍÕ¥¨Ì£›bI ÜÅèzº‰(X Ú50{ØV_š°‰aêPã@h[4õÓM;•o—~ ^¢Q]ñ]VX­üºä®ZQV¾ekÁº|fgHÜÚìk"‰— ãí89%©bU6ìâ=âøY‘ËìÊZ\âàäWë^…L;—¢òb¦‚ô®²ªØSÅÑ•£¨§›(º4&häÌ cOã³MÓã{áMU˜ÆÐ‰aj»Zj~èÜÈÆ½âÇ ›ƒAqñ}¤¹|jPˆ²}º „᱇ÛVFü0ÄK2YdÒ•µª>r寶ÇÁË“¼qfUãCEUÆ'ñMõxñ ߉y$t3µõsÊb.‡ @}uŠ r0×KĬk]ÊÔÑ,­ŽU÷]r¼’;nGlKÒ^x¿õ䂸Ï,d[Ò)Œ¨ÆlJ”j~_œÝ5£ŠV®®ò}œGXCá)Ók3‚+ÌmæðL§)ÈÛ-i75U/äOÌ·!ªàJ‹¹Ó¥“äÞ% À[:T4«Ïót/E<7¡UEŽâ•mº8…Ø·jÈ%mIÛ‹©~e5ÄœÙÝpá}$]^æ›qÝD@þ‘ÔÉŒŠe-Õ‰½¬ l¯˜G~ÖÞU®Wî¼i(œ*¶ÕDírå¥rPAÞÏ{]ºT @ Nëä 5øwOG`bCü ×¹¯E#œt,IWì¦g7ø…"NWv±¦à†<ÞzHÐÈÞls(ÚŠÛùJú;q¬¬c™{Y”BßÜÚ»H œnA<¢àèfAaY/õøä¥ëeÝwý퇂¸I›¤¬õP2ÀÎkæû쌌’е<² Q›¢ie* ë,+–´«Öü2Á^p^«¬ôz ŽXg¤wg¾ÍN•Î)ñKØãà4œ>.\¶RÐ(G…£à(‰VtÙTK¨¹øt—Jq %À­«`~'Z0¡Bd‰¼-x³YªÏ ®Ì©]Õ‰0\4e6­þ™ f;«ƒ„`"GùØdFxˆøÆ+¨“¨L¤'ÞR| ’E‡ñý³|õ,n›Ý6±¡.7>m$·*ÀÄ«­3dåFåÒyB=:¯"2¬ª÷+i·‰e54$€ÜD©›„ëìð£à&"ÒéÊÆPJ‘Û¶¨dT°ïf iŠ¥ÉõÃR¸Ô‚4¼’\&7P Tòˆ"J¨ì -¬{S3b5 BýWB†oÔC¼‹‰Z±0+Y_%–D™‚®Ú„&Ô z€ŠÏx›¨·Î4í“¥Ç"º(ЗùgÂg¬=„°5RLôhBQñ§‡Ø=ô:îBÈ'_¦F»¥`G>_|­9Vxmj\J¸æé4!Byë8\ù.´ ëÕ5&ôtÏ› 1Tp„¥uŠœ‚#¹©:)8ÇPp?[Æ­!ù<V… ÖGR‰æÑ—‹hÉ‚}“Ê»› È©‰,)‡ GEU)lÅùV7¸»~]amjDœd`€Œ]µˆWsS4€©²Ò#™ù¤¸£DáR/qg4¼õôPJ·#N] _’õMZƒÌßiÂA*”¡tWÚµ: 4*Û)$„YãN‚Ç’Ä¢’ãÿ2ÂÃ9±’Žê¿Óæf;_hVR^Çû7WZè£ÄRðZèl[wjbuº¡åLñ.v…F•hÝ —‘·^¸-‡ïäkF>DIÓ ‰Óð;,Òªaï§G۟ϸâ«lxÁ.u–mÚ²Ñä)+ý‘$Œ)Ö!òÍ˶»«ga§MijG» R3‹8¾*¦Ý5¤öôà”p§iõäTÁâK‚/§ú4kwe,)Ú™¯ÊË8¦SpÙXÙ!ŠDð`¢[!ˆ8%:wò-ß"”pš°`ϼ`+³d:²¥|½ÚAúd)òx Ž“ìE7Î%·"ó¸$¾fŒ£! ’—²ö ù ÒÄFLA~w›eêiøO$p|bƒ©zIª(ź2]šÂÛØq/QÁöX©ÉÔ˜\luPI—,›*&N æà²áÂî’OYô8ÎJ—"¯ƒg[&éÂÞ+…Q‰K$950o]Ç ªøš™>×É×RÒs“¨Gä tm9mì4$9¾§u•9àæ¼ŒWñœÈoíݧµˆÇ VÁ1¯‚;^ ^Øš/Á ÎEd¤”|hC‚JFÙ"êA¡ÔbDªáká šÌC'ÜWÈ!€Yom˜Sˆ‘- @ï—<%`ã¥í§‡ ||ß­¡}i°8™òÓ€¨%’Ð WѶ U²„g ||¿‰ªF@×d”J¥`ÿ3ãXjÁY±¦™D&šß"^EœOiKÁ¹’I¦çH†ØÞ/ERõ…5˜v¨¬qB`cS³²ÃÖ­ñ±eWf«´ewæ/ŸAFiè·’%Ñt×–üK÷!.ý;g„VWÔ(ïÓ#ÿãì2,ʨfë²K_Wõg) ‘BÜ [ï\ (‹Å†‡×ì·?âGi¨ØéB·Rž¾E"Ó” /ÞØÂ°Ýq£Ð\¦\îSp¯HabðE%]xQÆE|ÃtÛ.e6ŠH<Œ8IV&¦_ƒ*î*+?ƈfR–laubÂŽrƒ‘†ÒNù…©ˆƒSG¨ _ѵi¤X#áXÙÀUz5mwúi(2ZVAî‡2H”EÔ¤‚V|Ûss-AÉ™wÐOJ$…CªW²Ä¥b!îI60Hd Í„ª ÄJQMj¿eÞ ‚E$afÌ\^¥aß Î´*3IJNj­d4§¸i MHõ´„gŸê½sšu¯;ÂLÀÜE¿J¯«¸tëCv5aÀ0ŒL/öœ4Ø}f8Ó0¤ýî6) ø€YB³=þ$Šà®.%ùö€ Ù”9*W™i¥rÕ¢WOÇK[ZÕDðÀy*pÉ! G°å D:‰bú«Y÷x-XVŠÀZ(zÛ^¥`Æye•¶xÝ’y¦º/³+-jTzc[À3yëùíŸ̶'_ˆ‹pŽ.Q _‡ ËNé~I)µ7Š‹^ÒvG³ªà0-ŸàÀý;us¸Y äÑà§£}p85S*(P5¼³ /ÿÔ# h ¤_àÐÄ…9\ÖéÈNýY§ÀRFßAä"ºÒÞ: ¸¬sñ`ô™ì\>)„NÿÎi§L3âk$â2ÔÁ¡N›<º!æû³9x,9Ò²1ñPÃÀˆ—¤¡Œ€PaÁÆ[A`žÓ”Ԣ֣̻V°& ’Úäd‰DØÛ }–ÛJXi\2º@)»ã´ðÒ §„Ø¡=!Ær‰ ^ìÄ“ Iú…ØÀfeŠ$8v,€KiK-À C܈Ò&r(ñFÃMR¹8è<)]ª¸Ã¥0ö¨Ë°[Y†Ê¶¤šÈ0o‡/€4R…Æw#zÂÚÁ̽؂ 6>[Œ„O²Ž–vrçÎ ®t‘À‚û业 Å’€™3%úTz.-WÇJÄÒÉ›»ÚS‚Œ¼Ù,@7s…ÑøBjò¡!lq+È„\*\2‰-("©É0¬28é‹3ÇŠ ™LAK\ŒüZ)éë‘€Xg3ß–:Ë:§SùžTҦȶäG²êJj—™BÊck¢`¯¡ )…Ô R8/#ü$4»a'6w6>„L€å\à•S9®ë²’ª•@ªÉ„,8\BÖܹ0n#ƒ¡ ¼Ø~Ê ÙØ òR.Â!ð £+.Ëd[¡[’ÑübšOÆÝdL£H~Çì+QË™!„]hž!E¤"Ý‘ dÍ+ÛnD­‹¬¨$î©#²òÒaÔÃÁŠ æ$’0…ƒä&sJÕ *bmëÊŒè"ÙAÄÌf8°ü×Êb„ RúÛ³rP¨`£¨œ"êOÀ>@¡»| Jà7Vz&ðe+Þ$/5«x‰M]Ù]‘^Hª83UÎU(1ˆƒÖ‹Ð8¥{rR–¿À¿»•븩ه»^H˜)”NËqª<¦\ uŸPÆÝåIÞÌÍx² vo¹Ò©Ý·õc@R¥‰hEƒPLJ4±KTEÜI>Ia5ضEôëʰ ÆÍI§‹øoÁž„j¼ËrGS„¬ÜC(· “‚#)ÉPÀ#ßœ”xY‰zu—ÉëÐJsH ©ÜR¥)t©}AK]Hý‡½t€–ñ‚Â=B™Í‰_èí/A®N-L°Áé–Fä5¶4+Ó³p!qA®(Jy#l•·æ¹tD U@¯ƒ(‡ØUwÆ+ÞT×íèª0‹Dé †´ê%Š¥S$* íB€Îµ‹üƒ4A$°y ³$¹Dè^T44Œ•$£­Òì½’àì˰Ð">¯+Ðè%r™âz˜âž¤®«ãÒ¾±åX‘¤Tã¸re«ƒŒGm½iC¼$çÒ ·î.±$Â2ŸË¾&èk?;Ä1{¡%Á^¹a‹®Èä*ѽ²í%ÆÌ••+û)üÕWŠ| •P—ÈWZUÎÆë *ögiŒ€ɾ¿Õ‘¯(íN%ùŠý§|Û®.¹¡ãöýu0Rʱ›d8õ À$©ÑÚÛ™dCÈth¬cSÛ’$•´jßEÌ*1óÚB%ÞU(W~"J’p}E²O]‰± ˜Î]Ú.e^5W… × ƒ^Uɽn¸)„ Ç«Ab‡]í×Ê’›êcÚ* ÈÔÅmnl;u ˜°S1­B]§…LɆ8ò § á@”„çÙ(Jý|=4W3à8³ƒC$ ?sËëšLtRt‘Ñ6% #jU¼¯œ¤î³x÷•BME QzRÊ‹ 6×I]¯+÷gá‹\bÕqk„*((ˆb[«“Bä4*/Œ!ÛäÌÎ&¢Å)ÌV£û]XI^!Våu¤„µˆžº+9UáÆý2ïÍ„_„²hyÊ:jùR2àÑÀÜuå$(YHUj$ ²®E” ý šoíºtƒüT.€Tñ+*P¹H^Þv¼ªÚ£¢´³Lž´IÛŽNæ5Èà‹Êrëh…h·ïÓ¹y‹Èý•²é¯óRXˆ¹ˆ/Ü»ºWäSe]A]ñÆEm$°8 „å¦O»ó¤i(°£j®‚ ºˆ´zŠI}¾ø¢\ç¡øß‰YB“ÄÔ [ÕEe éâ`4"Ľ˜B^ùf@‘N§Æ*̵öæê¥Lr™³v’8asÈŽé²¾t¼~Í:{Óá Hëÿ¤ñD!‡Uœ»Ò¥(óJÍfS‰L7O%²ˆ±ËTxUáp˜8§¬SgÚeçA@­»c+›%î2O|Ÿ]dC \oY3!¶›,¢*‚ŸÀìñë0wRbíõ¸:jA«)÷lj ´-Yùº ž÷0d—ÄUÞºYå®rÚ}”ž´0Šx6º§/ZìLM‹}˦›WSÌeŒ(¬ŠÎCì@ רç)F&\ÀfóÞæÁÕf ˧©‰zq½´®ÛXZ˜8voËÒÞ¶u¤»ŠüûŠ„ØŠ¤;|Ç‘U‘Ò\‘{pâ£-¹muãí¶h˜@ûmÆÛ¸¹D|œØB²fÍ:Nfu³WàÙc+ÀP‰°/Ýj¥¸*¦"¬"½»"Ó X+|i‹`çgÎ;qŒÌ¡d†œ¾5I€ï°è,' Ç€\=LÅlÏbšMÂW$Wdˆ£ôÀŸ¦1+¶ÑÚL¤G¸c‰m3Þj¿*@) ‡jåLO€nMã’°©]‘ÍZq¡"ùm! ‘—S3«N¶E.nE"~ÅÍ+W»ÒD š2ç%=lм,¥5 H­E‘Šk{8<€¥ [»bûˆ!Èj6î,ªÈUïØG4¼jj’á½"™BQ_d܃ÓÃD@}#ãÙæ%ÕÌ9¢ ÷° ¸ð0‘x¶=€;e$Ò©@ß~Áv{j"@8â%£ ìp¹´ŠEÕðKg“•¡¸´QŠ0jáiXü®°¥W3åߎR4Øn¼D+h9äGTl1W¤á 24¨{€ɯhK5ÒÊdž=I DAžkÊ8âÃâ*BÎÝ‚˜qƒLÅ­W(€šG¢YÅ{+Þ¢ÅÑ1&õÛÉ.YW! Kó‘’˜Z‘~Y‘tÊgÑàbßhßø…£sB’Ê9³îÒßì¥Ðº© {°í!tEuwVr cͼƛ½°nÃ7¶xlì›SD·…m3õ®?¯xý!> ÏÙú«ôKÅ ;‘/Q”Ç1Ï;WÜÃÑ) ±Á_‘¿ÃîÎwÝÝ&”«$³ôZ´ÇAòéƒÄ•ì}%iØÜתMæ˜Vr +á³Gx–øµÈ5·×?o‚&È·ÂNšb;H<®¸Ü³}Óbap\ÂVñ*ŒÞ廬ȕ¨È]«…£Ûûâsè$Ø{Å”ÀdÈ»m?µÑë¼zë³·WÖ|( s7 ²"q+ï÷bodÔÂèËÎ[Y›6Ò?k!Ù’ýšey/æä^‹×{1ìdi}½/öÖièûz-^ïÅoúîÅa&ÈÎhu|`n¼êÅÈ ¬H$ìÅàŽØ:õâØº'4,øSñ§#÷NŠ«ýáĬ8üÙ^Zg+^/->¼$ö­¾ô-Þ;‘6¥ÓbM¿½  5ç>äú¾˜K­/3AëæŸËì@ßâd„^¼ÅâÓþŒÅl}yq’bíñÞ·>zïD}é„?Â7-.^Rb'}H,>í/CîÔãe&lÝ@Å1°@HYdVœç`1Ô«þ)±xõ?¯ÅÉ‹«g/ú¾ÿ‰Å{ÿ‹ëK߇—±“>$š¯—!¯·Å°ñq{Ü}H´nö3‰ö7îÆ¬8 ÐþZÌvrÄâòIqõâS‹w/ú>nbñéß®{'u}i}Ý[k|žkº ]óaq¾÷ ã ï&'ïUÀo¨ƒºá>²6)†zÓ@§9XRÌt»óg[žßù<º… ;›ÿ_f9ÃQãgolly-2.5-src/Patterns/HashLife/mosquito5.mc0000644000175100001440000000213412156145314015764 00000000000000[M2] (golly 2.0) #C mosquito5 -- a 71-cell pattern with a quadratic growth rate. #C Nick Gotts, 21 Oct 1998 $$$$$$$......*$ 4 0 0 0 1 5 0 0 0 2 6 0 0 0 3 7 0 0 4 0 8 0 0 5 0 9 0 0 6 0 10 0 0 0 7 11 0 0 8 0 12 0 0 0 9 $$$$...*$....*$*...*$.****$ 4 11 0 0 0 5 0 0 12 0 6 0 0 13 0 7 14 0 0 0 $.......*$.....*$.....***$......*$ 4 0 0 0 16 $$**$ 4 0 0 18 0 5 17 19 0 0 6 0 20 0 0 7 21 0 0 0 8 0 0 15 22 9 0 0 23 0 .*****$*....*$.....*$....*$ 4 0 0 25 0 5 0 0 0 26 6 0 0 0 27 7 0 0 28 0 $$$$$$$.....*$ $$$$$*$.*$.*$ ......**$ **$ 4 30 31 32 33 5 0 34 0 0 6 35 0 0 0 7 36 0 0 0 8 29 0 37 0 9 0 38 0 0 $$$$$.......*$ $$$.*$**$.*$ 4 40 41 0 0 5 0 42 0 0 $$$$$$***$ 4 0 44 0 0 5 0 0 0 45 6 43 46 0 0 7 0 0 47 0 8 48 0 0 0 9 0 49 0 0 10 24 0 39 50 11 51 0 0 0 .......*$...*...*$....****$ 4 0 53 0 0 5 0 54 0 0 6 0 55 0 0 7 56 0 0 0 $.....*$......**$$$$.....*$......**$ .......*$.......*$......*$$$$$.....*$ 4 0 58 0 59 4 0 32 0 0 5 0 60 0 61 6 0 0 0 62 $$$$$$$*$ 4 0 0 64 0 5 0 0 65 0 .*$.*$**$ 4 67 0 31 0 4 33 0 0 0 5 68 0 69 0 6 66 0 70 0 7 63 71 0 0 8 57 72 0 0 9 73 0 0 0 10 0 74 0 0 11 75 0 0 0 12 52 76 0 0 13 0 10 0 77 golly-2.5-src/Patterns/HashLife/nick-gotts-1.mc0000644000175100001440000000073012156145314016237 00000000000000[M2] (golly 2.0) #C gosblor4c2-gosblor4c2f-s17sw51 #C by Nick Gotts (see http://nickgotts-eventful.blogspot.com/) $$$$$$$..****$ 4 0 0 0 1 5 0 0 0 2 6 0 0 0 3 7 0 0 4 0 .*...*$.....*$....*$$$..*$...*$...*$ $....*$...**$ ..**$.*$$$$..****$.*...*$.....*$ 4 0 6 7 8 ....*$ 4 0 10 0 0 5 0 9 0 11 6 0 12 0 0 $$$...*$..**$ $.*$*.....*$*......*$*..*$***$ $..*....*$.*....*$**....*$......*$......**$ 4 0 14 15 16 $$$$.*$*$ 4 0 0 18 0 5 17 19 0 0 6 20 0 0 0 7 13 0 21 0 8 0 5 0 22 golly-2.5-src/Patterns/HashLife/nick-gotts-2.mc0000644000175100001440000000102112156145314016232 00000000000000[M2] (golly 2.0) #C nikk-nikkm1r90-w4s164 #C by Nick Gotts (see http://nickgotts-eventful.blogspot.com/) $$$$$$$......*$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 .....*.*$$....*..*$....**$....*$ 4 7 0 0 0 5 8 0 0 0 $$$$$..*.*$.....*$.*..*$ 4 0 0 10 0 5 0 0 11 0 ***$ 4 13 0 0 0 5 14 0 0 0 6 9 12 0 15 7 16 0 0 0 $$$....*$.....*.*$......*$ 4 0 18 0 0 $$$$$$$*$ 4 0 0 20 0 5 0 19 21 0 $$$*$$.*$.*$.*$ 4 23 0 0 0 5 24 0 0 0 6 0 0 22 25 .*$..*$.*$*$..***$ 4 27 0 0 0 5 28 0 0 0 6 29 0 0 0 7 26 0 30 0 8 17 0 31 0 9 0 6 0 32 golly-2.5-src/Patterns/HashLife/puzzle.mc0000644000175100001440000000141712156145314015353 00000000000000[M2] (golly 2.0) #C At 2.3e12 (www.tweedledum.com/rwg/gottspuzz.png) this pattern seems #C to have regularized: the last twelve bursts from the left formed #C a geometric progression of trapezoids. But the top two corners #C of the next "trapezoid" are missing, as were several previous. #C To see that the trapezoid progression is exactly doubling, #C click with the up/down scaling cursor on the limit point. #C Bill Gosper, 27 Feb 2006 $$$$$$$*$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 *$*$ $$....*$.....*.*$......*$ $$*$$.*$.*$.*$ 4 6 0 7 8 5 9 0 0 0 6 10 0 0 0 $$$$......**$.....*$ 4 0 0 0 12 $$$$***$..*$..*$.*$ 4 0 0 14 0 $$$$.......*$$.......*$ .....*$......*$..*...*$...****$$**$$...****$ ..*...*$......*$.....*$ 4 16 17 0 18 5 13 15 0 19 6 0 20 0 0 7 11 21 0 0 8 0 5 0 22 golly-2.5-src/Patterns/HashLife/ruler.mc0000644000175100001440000001070112156145314015147 00000000000000[M2] (golly 2.0) #C This produces groups of LWSSs headed west, with gaps of fixed size #C between them. The lengths of the groups form the 'ruler' sequence, #C 1 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 ... (Sloane's A001511). The first #C group of length n is emitted about generation 96*2^n. The pattern #C uses a Corderman eater puffer found by Paul Tooke (Jan 2004), a #C p48 glider gun by Noam Elkies (Jun 1997), a p8 glider reflector by #C Noam Elkies (Sep 1998), and a p24 LWSS puffer (source unknown). #C Dean Hickerson, 4/20/2005 $$$$$$$.*$ 4 0 0 0 1 5 0 0 0 2 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 $$$$**$*$ 4 0 7 7 0 .......*$$.......*$.......*$ *.**$$*$$.*$.*$ $$$$$$......**$......*$ ...*$***$$$***$***$.**$ 4 9 10 11 12 ......**$ *$$$$$$.......*$.......*$ $......**$......*$.......*$ 4 14 15 0 16 5 8 13 0 17 $$$$$$**$**$ *$ $$$$$$$...**$ 4 19 0 20 21 $.......*$......*$.....*$$...**.*$....*.*$.....*$ $$*..**$.****$*$ 4 0 0 23 24 5 0 0 22 25 $$$$$$$.......*$ ...*$ ......**$.....*.*$....***$......*$.......*$ $*$.*$*.*$.*.*$*..***$.**.*$..**$ 4 27 28 29 30 $$$.......*$.......*$.......*$$.....***$ .....**$......**$ 4 0 32 0 33 ..*...*$.....*.*$......**$..**$.*.*$.*.....*$**.....*$ 4 0 35 0 0 $$$$$*$*$ 4 37 0 0 0 5 31 34 36 38 6 18 26 0 39 $$....**$...***$*.*.**$.**$ 4 0 0 41 0 5 0 0 42 0 $$$.*$..*..*$.**.*.*$.....*$ $$$$.....*.*$....**.*$....**.*$...*$ ....*$....*$ 4 44 45 0 46 $$$$$*$ 4 48 0 0 0 $$$$$.**$.*$ $$$...**$...*$ 4 0 50 51 0 5 47 49 52 0 $$$$****$*...*$*$.*$ 4 0 0 0 54 5 0 0 0 55 6 43 0 53 56 $$...**$...*..**$....**$......**$..***.*$.*..***$ $$*...**$***..*$...**$***$*.*.***$..***..*$ .**$...****$...*..*$$....*.**$..*.*$.*...*$....*$ ......**$..****$..*..*$$.**.*$....*.*$...*...*$....*$ 4 58 59 60 61 $$$$**.**$.*.*.*$.*..****$*.**...*$ $$.....**$......*$......*$.....**$......*$......*$ *.*....*$*.*...*$*.....*$*.*..*$*.*.*$*..*$**.*.*$...*.***$ 4 27 63 64 65 .*$.*.**.**$..**$.....*$$$..***$..***$ .......*$.**.**.*$*....**$...*$$.*$$***$ ..**$.*$***.*$....*$.**..*$..*...*$.....*$ 4 67 68 69 0 5 0 62 66 70 ****$.....**$*..**.*$..*...*$**....**$.*.....*$*..*.*$**.*..*$ .*.**.*$.*.*..*$..*..**$ 4 9 72 0 73 *$*...*.*$**.*..*$.*.*$......*$...*.*$*.**$*.*$ $$$....*$...***$...***$$....***$ *.*....*$.*.....*$$$...**$...*..**$....*.*$...**..*$ *.******$...*.*.*$****...*$..*$..*$.**$****.*.*$....***$ 4 75 76 77 78 .....*.*$.....*$......**$ $*$ 4 80 81 0 0 5 74 79 0 82 6 0 71 0 83 $$.....**$.....*$......**$$....***$...*..**$ $$.**$.*$ ...**$.....***$.....*$$......*$....*.*$...*...*$......*$ 4 0 85 86 87 $$$$$.....**$.....*$ $$$$...**$...*$.*.*$.**$ 4 0 89 90 0 ...*$...*.**$....**$.......*$ $$$$......**$.......*$.......*$ $$$$$$.*$**.....*$ 4 0 92 93 94 5 0 88 91 95 $$..*...**$*****..*$.....**$*****$*.*.*.**$*...***$ $$$$$$*$.*$ $*...****$*...*..*$$**.**.*$......*$.....*$......*$ **$$$$$*$.*$ 4 97 98 99 100 $**.**.**$..*....*$.....*$$$......**$***...**$ .*$.*$*$$......**$.....*.*$*..****$*..*...*$ .......*$$......*$......*$.....*$....*$*....*$*$ *..*$.*..*$***.*$.....*$**....*$*......*$.....*.*$...***.*$ 4 102 103 104 105 $$$$.**$.*$.*$*.**$ ......**$.......*$......*$ *.*$*.*$..*.**$*.*.*$*.*.*$..*.**$.**.*$....*$ $$$$$$...****$..*...*$ 4 107 108 109 110 5 101 0 106 111 *.**$...*$***$*$*.....**$**.**..*$***.*.*$...*..**$ 4 0 0 113 0 .......*$$$......*$......*$......*$$....***$ .......*$.......*$$$...**$...*..**$....*.*$...**..*$ 4 0 115 116 78 ...*.*$..*..*$...**$ 4 118 0 0 0 5 114 117 119 82 .*$....*.*$....*..*$.......*$....*$.....*.*$.......*$ ..*....*$..*.**$.**.*.**$.*..*$...**$...*$*.*..*.*$*.*.*..*$ *.*.*.**$.*..*..*$....**$ 4 121 122 113 123 ****$$..**$*..*$.**$.*$..*$.**$ ......*$.....*$ .*$.*$*$ 4 125 126 127 0 5 124 128 119 0 6 96 112 120 129 7 40 57 84 130 $$$..****$.******$.****.**$.....**$ 4 0 0 132 0 $$$....*$...**$...**..*$ $.......*$.......*$*..*$*...*$....**$*...*$*..*$ $$$.******$*.....*$......*$.....*$ .......*$.......*$ 4 134 135 136 137 **$***$*.**$.**$$$$.**$ *.**$***$**$ 4 139 0 140 0 5 133 0 138 141 6 0 0 142 0 $$$$$..*$.**$.*.*$ ...*$....*$*...*$.****$ 4 0 144 145 27 $.......*$......**$......**$ $***$****$**.**$..**$ $$$$$$$*$ ..*....*$..*...**$.....*$.**...**$*.*....*$ 4 147 148 149 150 .....**$.*...***$..*...**$*..*$..*...**$.*...***$.....**$.......*$ $.......*$$..*$...*****$ $$*$*$*$ 4 81 152 153 154 **$*$......*$.......*$$*$**$*$ ...*$....*$....*$*****$ 4 156 157 0 0 5 146 151 155 158 $$$$$$.....***$....*$ $$$$$$*$*$ *$**..*..*$.**$**..*..*$*$....*$.....***$ *$$$$*$*$*$ 4 160 161 162 163 5 164 0 0 0 6 159 165 0 0 7 143 0 166 0 8 131 167 0 0 9 0 6 0 168 golly-2.5-src/Patterns/HashLife/totalperiodic.mc0000644000175100001440000000262112156145314016662 00000000000000[M2] (golly 2.0) #C Without the block, this is Gosper's "total aperiodic" #C pattern (Nov '97), in which every cell in the universe #C eventually becomes aperiodic. #C With the block, every cell eventually becomes periodic, #C but incredibly slowly. The block remains untouched for #C very roughly 3^63 generations. It deletes the nth glider #C (and is shifted) at about generation 3^(57.5+5.5n). #C Bill Gosper, 24 Jun 2004 $$$$$$$***$ 4 0 0 0 1 5 0 0 2 0 6 0 0 0 3 .......*$$$.......*$ ..*$..*....*$..*....*$.*....*$......**$.......*$$.*$ $.......*$.......*$ ***$*.*$**$**$ 4 5 6 7 8 $**$..*....*$..*...**$**....*$.......*$.......*$.......*$ $$$*$**$**$**$*$ 4 10 11 0 0 $$.......*$......**$.....**$.....***$.....***$......**$ $$$*$*$ $$....*$..*...*$.......*$..*....*$...*****$ $$$$$......*$$......*$ 4 13 14 15 16 $$$$....***$...*..*$......*$......*$ ...*.*$$$$$.*$..*$..*....*$ $$$$$$.**$*.**$ 4 18 0 19 20 5 9 12 17 21 ...*..*$.......*$...*...*$....****$ 4 0 0 23 0 $$$$$$$.......*$ $$$$$$$*$ ....***$....****$.....***$ **$*$$$$$***$..*$ 4 25 26 27 28 $$$$$$.....***$**..****$ **..***$.......*$ **$*$ 4 30 26 31 32 $$$$.**$****$**.**$..**$ *.*$**$$$*..*$....*$*...*$.****$ 4 34 35 0 0 5 24 29 33 36 .......*$ $$....**$..**.**$..****$...**$ 4 0 38 39 0 ***....*$$$$.......*$.......*$$.......*$ ***$**$$$$*$**$*$ $$$$...*****$..*....*$.......*$..*...*$ 4 41 42 43 0 ....*$ 4 45 0 0 0 5 40 44 0 46 6 0 22 37 47 7 0 4 0 48 golly-2.5-src/Patterns/HashLife/unlimited-novelty.mc0000644000175100001440000000127312156145314017512 00000000000000[M2] (golly 2.0) #C nick-gotts-n type rake interaction with apparently unlimited novelty #C (screenshot at 4.9e8: www.tweedledum.com/rwg/nick-gotts-g.png). #C The interaction of the downward puffer's trail with the first #C bounce of its backrake produces two very sparse LWSS waves. #C Bill Gosper, 27 Feb 2006 $$$$$$$..****$ 4 0 0 0 1 5 0 0 0 2 6 0 0 0 3 7 0 0 4 0 .*...*$.....*$....*$$$..*$...*$...*$ $....*$...**$ ..**$.*$$$$..****$.*...*$.....*$ 4 0 6 7 8 ....*$ 4 0 10 0 0 5 0 9 0 11 $$$$$$$.*$ $...*$..**$$$$$..*....*$ 4 0 0 13 14 5 0 0 15 0 6 0 12 16 0 *.....*$*......*$*..*$***$ .*....*$**....*$......*$......**$ 4 18 19 0 0 $$.*$*$ 4 21 0 0 0 5 20 22 0 0 6 23 0 0 0 7 17 0 24 0 8 0 5 0 25 golly-2.5-src/Patterns/HashLife/wedge-grow.mc0000644000175100001440000000216512156145314016072 00000000000000[M2] (golly 2.0) #C 26-cell quadratic growth pattern: a forward-glider-producing switch #C engine repeatedly overtakes a crystal formed by collision with #C sideways gliders produced by a c/12 rake assembly. When the #C switch engine reaches the crystal, a reaction produces an #C orthogonal block-laying switch engine and restarts the crystal #C production at the c/12 rake boundary. #C Nick Gotts, 17 March 2006 -- closely based on Bill Gosper's #C 41-cell O(t ln t)-growth pattern from 11 March. $$$$$$$.**$ 4 0 0 1 0 5 0 0 2 0 6 0 0 3 0 7 0 0 4 0 8 0 0 5 0 9 0 0 6 0 10 0 0 7 0 11 0 0 8 0 12 0 0 9 0 13 0 0 10 0 14 0 0 11 0 **$.*$ 4 13 0 0 0 $$$$$$$.......*$ 4 0 0 0 15 $$$$$$*$.*$ 4 0 0 17 0 5 14 0 16 18 .......*$......*$ 4 0 20 0 0 5 21 0 0 0 6 19 0 22 0 7 23 0 0 0 8 24 0 0 0 9 25 0 0 0 10 26 0 0 0 11 27 0 0 0 12 28 0 0 0 13 29 0 0 0 $...*...*$....*.*$.....*$ 4 0 31 0 0 5 0 0 0 32 $$.......*$$$$.......*$ 4 0 0 0 34 5 0 35 0 0 $$$*$.*$*$$.***$ 4 0 0 37 0 5 38 0 0 0 6 0 33 36 39 $$$*$*$*$ 4 41 0 0 0 5 0 0 42 0 6 43 0 0 0 7 0 0 40 44 8 0 0 45 0 9 0 46 0 0 10 0 0 0 47 11 0 48 0 0 12 0 0 0 49 13 0 0 0 50 14 30 0 0 51 15 0 12 0 52 golly-2.5-src/Patterns/HashLife/wolfram22.mc0000644000175100001440000000017712156145314015637 00000000000000[M2] (golly 0.9) #R w22 #C Golly supports Wolfram's 1D rules. #C Rule 22 generates a nice fractal pattern. $$$$$$$*$ 4 0 1 0 0 golly-2.5-src/Patterns/JvN/0000755000175100001440000000000012156146015012567 500000000000000golly-2.5-src/Patterns/JvN/Boustrophedon-replicator.rle0000644000175100001440000002512712156145314020220 00000000000000#C Boustrophedon replicator #C #C This is similar in design to Hutton-replicator, but with a #C two-dimensional data tape. This facilitates quadratic growth, #C unlike the original Hutton-replicator, which grows at a #C linear rate. Langton's Loops also grow quadratically. #C #C The dimensions of the loop are controlled by two seven-bit #C binary counters. It is a fortunate coincidence that the tape #C fits in this loop; the next size up is twice as large in #C diameter! #C #C The name of the replicator is derived from the ancient #C boustrophedon scripts, which alternate direction in the #C same way as this tape. #C #C Adam P. Goucher and Tim Hutton, 30 July 2010. #C x = 126, y = 129, rule = Hutton32 2I$pAO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$ L3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJK O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO2K$LIM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IJ$LJ3KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO$L5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$L3IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJKO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO2K$L2IM5IM2IMIM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IJ$LJ2KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K2O$LIMI4MIMI4MIMI4MIMI4MIMI 4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MI2MIMIMI6M2IMIMN$ LN3OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO2K$LI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MI2MIMI3M3IMI4MI3M3IM5IM 5IM5IM5IM5IM5IM5IM2IJ$LNK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKO K4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5K$LMI4MI2MIMI3M3I3M2IMI4M5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IN$LJ4OKOK4OKOK4OKOK4OKOK4OKOK 4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OK$L4IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIN$LJO 5KO5KO5KO5KO5KO2K6OKO3K3OK4OKOK4OKO2K3O2K6OKOKOK2OK4OKOK4OKOK4OKOK4OK OK4OKOK4OKOK$L2IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI4MIMI4MIMI 4MIMI4MIMI4MIMI4MIMI4MIMI3MN$LJ2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO3K3O3K3OK4OKOK4OK$LIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIM I4MIMI4MIMI4MIMI4MIMI4MIMI4MI2MIMI2M2I3MI4MIMI4MIMI4MIN$LN3OKOK4OKOK 4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO3K$L3IMI4M IMI4MIMI4MI2MIMI2M4I2M4IMI5M4IMI5M4IMI6M3IM5IM5IM5IM5IM5IM5IM5IM5IMIJ $LN2OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OK OKO2KO5KO5KO5KO5KO2K$L4MIMI2MIMIMI4MI3M3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM2IJ$LNK4OKOK4OKOK4OKOK4OKO3K3OK4OKOK4OKOK4OKOK4O KOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OK$L5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIN$LN5KO3K3O4K2O4K2O3K3O3K 4OKOK2OK4OKO2K3O2K6OKO2K3O2K3OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK$L 3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI 3MN$LJKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K2O4K2O4K5OKO2K3O 2K3O2K3O$L2MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIM I6M2IMI6M2I3M2I3M2I3M2I3M2I3MIJ$LNOKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$LI4MIMI4MIMI4MIMI4MI3M3IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LNK4OKOK4OKOK4OKOK4OKOK4OKO K4OKOK4OKOK4OKO3K3O4K2O4K2OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK$L4IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI 4MIMI3MN$LJO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO3K$L2I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I2M4I 2M4I2M4I2M4I2MIMIMI4MI2MN$LJK2O4K2O4K2O4K2O4K5OKO4K2O4K2OK4OKOK4OKOK 4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO$L5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN3K3OK4OKOKOK2O3K3OKOK2O4K2OK4OKOK OK2O4K2O4K2O4K2O3K3O2K3O2K3O3K3OK4OKOKOK2O4K2O4K5OKOK4OKOK$LM5IM5IM5I M5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MI3M3I2M4IMI4MI4MIMI4MIMI4MIMI4MIMI 3MN$LJ4KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K$ L3MI3M3I2MIMI3M2I2MIMIMI4MIMI5M4I3M3I3M3I3M3I3M2I2MIMIMI4MI4MI3M3I2MI MI3M3I2MIMIMI4MI3M3IM5IN$LNKOK4OKOK4OKOK4OKOK4OKOK4OK3O2K2OK4OKO3K3OK 4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO$L5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN5KO5KO3K3O4K2O4K5OKO4K5OKO4K2O K2OK2OKOK2O3K3O4K2O3K3O4K2O4K2O3K3OK4OKOKOK2O3K3OKOK2O2K$L5IM5IM5IM5I M5IM5IM2IMIMI4MIMI4MIMI4MI3M3I3M3I2M2I3MI4MIMI4MIMI4MIMI4MIMI4MIMI4MI 3MJ$LN5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$ L3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJK O5KO5KO5KO5KO5KO5KO5KO5KO5KO5K2OKOK4O2K2OK4OKOK4OK2OKOK4O2K2OK4OKOK4O K2OKOK4O2K$L2M3IMI4MIMI4MI2M2I4MIMI2MI4MIMI4MI2M2I4MIMI2MI4MIMI4MI2M 2I4MIMI2MI4MIMI4MI2M2I4MIMI2MI4MIMI4MIMN$LNK4OKOK4OKOK4OKO3K3OK4OK4OK O4K5OKO4K5OKOKOK2O2K6OK4OKOK4OKOKOK2O3K3OKOK2O3K3OK4OKOK4OKO$LIM5IM5I M5IM5IM5IM5IM5IM5IM5IM2IMIMI4MI2M4I2M4I3M3I3M3I2M2I3MI4MIMI4MIMI4MIMI 4MJ$LJ3KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO $L5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN 5KO5KO5KO5KO5KO5KO5K4OKOK4OKO4K2O4K5OKOK4OKO4K2O4K5OKOK4OKO4K2O4K5OKO 4KO$LMI4MIMI6M3IMI4MIMI4MI2M4IMI5M4I2M4I2M4IMI5M4I2M4I2M4IMI5M4I2M4I 2M4IMI5M4I2M4IN$LJ2OK2OK2OK2OK4OKO3K3OKOK2O3K3OKOK2O3K3OK4OKOKOK2O3K 3OKOK2O3K3OK4OKOK4OKOK4OK4OKO2K6OKO2K6OK2OKO$LIM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MI3M3IMI4MI2MJ$LJ3KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO$L5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN2K3O2K3O2K3O2K6OKO2K3O2K 3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K6OK$LMIMI 3M3I2MIMIMI4MI3M3I2MIMI3M3I2MIMI3M3I2MIMI3M2IMI4MIMI4MI2M4I3M3I2MI2MI MI4MIMI6M2I2MIMI3M2I3M2IN$LN3K3OK4OKOK4OKOK4OKO3K3OK4OKO3K3OK4OKOK4OK OK4OK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO3K$L2IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIJ$LJ2KO5KO5KO5KO5KOKOK2O3K3OK4O KOK4OK2O3K2OK2OK2OK2OK2OK2OK2OK2OK2O3K3OKOK2O3K3OKOK2O3K3OKOK2O3K3OK 2O$L4IM5IM5IM2IMIMI4MIMI4MI3M3IMI4MIMI4MIMI4MI3M3I3M2IMI4MI4MIMI4MIMI 4MI3M3I2MIMI3M3I2MIMIMIMN$LJO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO3K$LIMI3M3I2MIMI3M3I2MIMI3M3I2M3I3MIMI3MIMI3MIMI 2MI6M2I3M2IMI6M2IM5IM5IM5IM5IM5IM5IM5IMIJ$LNO3K3OK4OKOKOK2O3K3OKOK2O 3K3OK4OKO2K6OKO3K3OK4OKOK4OKOK4OKOK4OKOK4OKO3K3OK4OKOK4OKOKO2KO5K$L4I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IN$LJO5KO 5KO5KO5KO5KO5KO5KO5KO3K3OK4OKOK4OKO2K3O2K3O2K3O2K3O2K3O3K3O2K3O3K3OKO K2O3K3OKO$LIM5IM2IMIMI4MIMI4MI3M3I2MIMI3M2I3M2IMI4MIMI4MIMI4MI3M3I3M 3IMI4MI3M3I2MIMI3M3I2MIMIMI4MI3M3I2MJ$LJ3KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO$L3I2MIMI3M3IMI6M2I3M2I3M2I3M2I3M2I 3M2I3M2I3M2I3M2IMI4MI3M3IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN2OKOK2O4K2O3K3O 2K3O3K3OK4OKO3K6OKO4K5OKO4K5OKO4K2OKOK2O3K3OK4OKOK4OKOKO2KO5KO5KO5KO$ L5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM4IJ$LN5K O5KO5KO5KO5KO5KO3K6OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOKO K2O4K5O$L3IM5IM2IMIMI4MIMI4MI3M3I2MIMI3M3I2MIMIMI4MI3M3IMI4MIMI4MIMI 4MIMI4MIMI4MI2MIMIMI6M2IMI4MI4MJ$LJKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO2K$LIM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM2IJ$LJ3KO5KO5KO5KO5KO5KOKOK5OKO2K3O2K6OKO2K 3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K3O$LIMI3M3I2M4I2M4I3M 3IMI4MIMI4MI2MIMIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MI2M3I4M3I2M3I 2MI2MN$LNOK4OKOK4OKOK4OKOK4OKOK4OKO3K3O4K2O4K2O3K3OKOK2O3K3OK4OKOK4OK OKO2KO5KO5KO5KO5KO5KO4K$L3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IMJ$LJKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO2K$LMIMI4MIMI4MIMI4MI2MIMI3M2I2M4I2M4I3M3I2M4I2MIMI2M 4I2M4I2M4I2MIMIM5IM5IM5IM5IM5IM5IM2IJ$LN2OKOK4OKOK4OKOK4OKOK4OKOK4OKO K4OKOK4OKOK4OKO2K3O2K6OK2O3K2OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK$L3MIMI 4MI3M3I2MIMI3M3I3M2I3M2I3M2I3M2I3M2I3M2IMI4MI4MI2MIMI3M3I3M3I3M2I3M2I 3M2I3M2I2MIMIMI4MIMI3MN$LNKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO3K$L2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IMIJ$LJ2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K4OKO KOK2O2K3O3K3OKOK2O2K3O2K3O2K5O$LIMI4MIMI4MIMI4MIMI4MIMI4MI3M3I3M2I3M 2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2IMI6M2IMIN$LN3OKOK4O KOK4OKOK4OKOKOK2O3K3O4K2O4K2O4K5OKO3K3OKOK2OK4OKO3K3OK4OKOK4OKOK4OKOK OK2O4K2O4K2O2K$LM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI 4MIMI4MI3M3I2M4I2MIJ$LJ4KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5K$L4IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IN$LJOKOK2O4K2OK4OKOK2OK2OKOK2O3K3O4K2OKOK2O3K3OK4OKOK4OKO 3K3O4K4O2K2OK4OKOK4OK2OKOK4O2K2OK4OKOK4OK$LM2I3M2I2M2I4MIMI2MI4MIMI4M I2M2I4MIMI2MI4MIMI4MI2M2I4MIMI2MI4MIMI4MI2M2I4MIMI2MI4MIMI4MI2M2I4MIM IMN$LNOKOK2O2K3OKOK2O3K3OK4OKOKOK2OK4OKO3K3OK4OKOK2OK5OK4OKO2K3O2K3O 2K3O2K6OKOK4OKOK4OKOKO2KO5KO4K$L3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO2K$L4IMI5M4IMI5M4IMI4MI4MI2MIMIM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM2IJ$LNO3K5O2K2OK2OK2OK2OK5OKOK4OKO4K2O4K5O KOK4OKO4K2O4K5OKOK4OKO4K2O4K5OKOK4OKO4K2O4K5O$LIMIMI4MI4MIMI4MI2MIMIM I4MI3M3I2MIMI3M3IMI5M4I2M4IMI4MIMI5M4I2M4IMI4MIMI5M4I2M4IMI4MIMJ$LNO 3K3OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5K O5KO5KO2K$LIM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM2IJ$LJ3KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO$LM4I2M4IMI5M4I2M4I2M4I3M3IMI4MIMI4MIMI4MI2MI2MI2MI2MI2M4I2MIMI2M IMIM5IM5IM5IM5IM5IM4IJ$LN4K5OKO4K2O4K2O4K5OKO4K2O4K2O4K5OKO4K2O4K2O4K 5OKO4K2O4K2O4K5OKO4K2O4K2O4K5O$LMI4MIMI4MIMI4MIMI4MIMI4MIMI4MI3M3I3M 3I3M3I2M4IMI5M4I2M4IMI5M4I2M4IMI5M4I2M4I2M4IMJ$LJ4OKOK4OKOKO2KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO4K$L3IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMJ$LJKO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOK2O2K3O2K2O$L2M2I3M2I3M2IMI6M2I3M 2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2I3M2I3M2I3M2I3M2I3M2I 3M2IN$LN3OKO2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O3K3OK4O KOK4OK2OKOK2O3K3O3K3O2K3O3K3O$L4IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIM I4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MJ$LJO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO3K$L2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIJ$LJ2KO5KO5KO5KO5KO2K3O2K3O2K3O2K3O 2K3O2K3O2K3O2K3O2K3O2K3O2K3O2K6OKO2K3O2K3O2K6OKO2K3O2K3O2K$L2I3M2I3M 2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2IMI6M2I3M2I3M2IMI6M2I 3M2I3M2IMI5MN$LN2OKOK2OK4OK4OKO3K3O3K3OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKO K4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KOK$LMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4M I3M3I3M2I3M3IMI4MI2MIMIM5IM5IM5IM5IM5IM5IM5IM3IJ$LJ4OKOK4OKOKO2KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO2K3O2K6OKO3K3OK4OKOK4OK$L3IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIMI4MIN$L N2O5KO10K8O$27IJ! golly-2.5-src/Patterns/JvN/cell-coders-demo.rle0000644000175100001440000000312212156145314016330 00000000000000# Cell coders demo. # Author: Renato Nobili # # There are nine cell types that can be constructed in von Neumann's # CA: 9-12,17-20 and 25. The signal trains needed for each are shown # on the left. Advance five generations to see the result. # # These nine signal trains can be created by using coders. On the right # are shown the necessary coders for each, converting a single excited # pulse into the necessary signal train. The confluent cell type is # used as a splitter, to duplicate a pulse onto two wires, and also as # a 1-generation delay unit, to synchronise the pulses correctly. # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata # # Originally distributed as: Q-STATE_CODERS.JVN # Redistributed with permission. # x = 60, y = 66, rule = JvN29 18.2pA.3pA.pA3.pA7.2pA2.2pA2.2pA2.3pA.2pA3.2pA$17.pA3.pA3.pA3.pA6.pA 3.pA2.pA.pA.pA.pA3.pA.pA.pA$17.pA3.2pA2.pA3.pA6.pA3.pA2.pA.pA.pA.2pA 2.pA.pA2.pA$17.pA3.pA3.pA3.pA6.pA3.pA2.pA.pA.pA.pA3.2pA4.pA$18.2pA.3pA .3pA.3pA5.2pA2.2pA2.2pA2.3pA.pA.pA.2pA5$4IM3.I14.M28I3.I$44.I$M3IM3.J $32.20I3.J$IM2IM3.K23.2JK5.I3.I$32.JIJ$2IMIM3.L23.2JK$23.M8IpAIJ$I2MI M3.Q2$3I2M3.R$32.20I3.K$IMI2M3.S23.JIJ6.I2.I$32.2JK$2I3M3.T14.M8IpAIpA 2$I4M3.pA2$33.19I3.L$33.JIJ6.I.I$33.2JK$23.M9IpAIJ4$33.19I3.Q$33.J3.pA 4.2I.I$33.J.2IJ$23.M9IpAIpAIpA6$33.19I3.R$23.M9IpAIpA7.2I4$33.19I3.S$ 33.J.JIJ4.I.2I$33.J.2JK$23.M9IpAIpAIJ6$33.19I3.T$23.M9IpAIpAIpA4.3I6$ 33.19I3.pA$23.M9IpAIpAIpAIpA.4I! golly-2.5-src/Patterns/JvN/codon4-auto-retract.rle0000644000175100001440000011200512156145314017011 00000000000000# A self-reproducing machine for Nobili cellular automata. # Copyright (C) 2008 by William R. Buckley # # The machine corpus appears at the left of the observed line; # zoom to see the machine. # # This configuration employs two mechanisms of tape message # compression: a) the assumption that during construction # (whether of daughter corpus or tape copy), retraction of the # construction arm should be automatic - no need for a specific # retract instruction to appear on tape (such as after appearance # of a construct instruction); b) that tape instructions are # represented by four bits. Whereas auto-retraction of the # construction arm yields an approximately 1/3 smaller tape, the # shortened instruction coding reduces the tape an additional # 20%. # # Translation of instruction code to construction code involves # the generation of five-bit long signals, generally. Hence, if # the instruction code is shorter, an additional bit must at # minimum be generated. Yet, the best way to minimise corpus size # is to do as little work as possible; put all the information in # the tape, none of it in the corpus. Here, the instruction code # is four bits, and so the corpus generates the fifth. Thus, this # corpus is marginally larger than is the corpus which has a five-bit # instruction code. We see this size increase represented in the # increased tape instruction count. # # This machine serves (even more) to demonstrate that one may obtain # optimal solutions to machine self-replication within von Neumannesque # cellular automata without the use of more complicated compression # schemes, like run-length encoding, and that indeed such schemes # may here serve to reduce the efficiency of solutions. # # Corpus cell count : 3574 # Bounding rectangle : 109w 59t # Length of tape : 37780 # Tape instruction count: 9445 # Bits per instruction : 4 # Replication time : 4.31 x 10^9 # # Instruction Set - fourteen total operations # ------------------------------------------- # # 0000 OR Ordinary Transmission Right Construct # 0001 OU Ordinary Transmission Up Construct # 0010 OL Ordinary Transmission Left Construct # 0011 XU Extend CArm Up Articulate # 0100 OD Ordinary Transmission Down Construct # 0101 RD Retract CArm Down Articulate # 0110 SR Special Transmission Right Construct # 0111 -- not used # 1000 SU Special Transmission Up Construct # 1001 XR Extend CArm Right Articulate # 1010 SL Special Transmission Left Construct # 1011 RL/QQ Retract CArm Left/Ground Articulate # 1100 SD Special Transmission Down Construct # 1101 -- not used # 1110 CN Confluent Construct # 1111 TM Tape Mark Meta # x = 37888, y = 59, rule = Nobili32 22.2IL14IpA13IpAIpA3IL8.13IL$14.5IpA2IJ.pAJ5IL.J3.2IpA13IpAIpA2IL9IJ 2IL2IL2IL.I2pA$12.2IJ4IpA2ILRpAKpA2KQ.pAIpAL2IpAIpA13IpAL.IL11IpA.pAJ .pAJ.pAIpA.L$4.IK3IpA2IpA2IJ.2IpAILIL.IJIpAR3.JIpALJ.L.ILIL2.IL2ILI2pA I2pAIL2IL2ILIL.IpA2IpA2IpA4IL$3.IpAIJ2IpA2IJ2.IpAJIpAL2IpAIJ.J2Q.pAIpA IJIpAIpAI5pAIJIpA.pAJIpAIpA2.IpA.pAJ.pAJIpAIpA10.pA$2.pA2JRSpAKpA3KpA KpA2KpAKIL.L3IpA3I3JK2.J.L.LIJIJ3.IpA10IpA2IpA13IpA3IpAIpAIpA3I$2.JIpA 2IJTSJL2K.J2.2JK2IpAJ2.J2.2IpAIpA2IpA2L.L5.2IL7.2ILI2pAL.pALILIpAIpA. pALIL.pALIpA4.2QR$2.3JR3S.JL2IpAJ2IpAKJ2.L3IpAILJIJIJ2.JIpAIpAIpAIpAI pA.pAIpAIpAIpAIpA.pAJIJ2IJIJIJ2.IpAJIJ2IJIpAL4.pA$2.2J.ILILI3pAKpAIJI pA2JpAIpAJ2.J.pA2J.JK2.pA.I2L.5IpA9IpA11IpA2IpA12IpAJ$IpA2J.JIJIJ.LJK JK.J.2IJ2IL.IpAR2.J2pAJ2.J2.2pA6IpA4IpAIpAIpA.pAIpALIpAIpALIpA.IpA.pA IpAIpAIpAI2pAI2pAJ$JpAKJ.JLKLK.LIJIpAKJIpA2KJTpAK2pAQIpAL2J.2IpAILIpA .5IpA4IpAIpAL2IJ2.IpA3.IJ.pAJ2IJ.pAIpAJ2.IJ2.J$.pA2J7pAKJLpA.4JI2JTL. 2JK.JL2JKJ3.ILIpAJ2ILIpA2ILIpAL.7IpA6IJ5IJIpA7IJ$.J2K2JKJKJK.JLJpA3JpA J.J.pAIpALJIpAIpAIpAJ4.pAIpAIpA.LJpAK.2pA.pAILILIL2IpA7IJ5IJ$.IL2J2KL KLK.JpA.JIpAIJ2.JKpA.JIpA2J.JKJ5.5I2pAIpAJ.IJLK.IJIJIJIpA8IJ$I3pA2.6pA 2K.pAJ7.J.J.JIpAQI2pA10.17IJ$pA.IJ2.JKJKJK3.J6K2.J.J.3J2.2J$JpA19KJ2. J.J.3J2.2J$IpA16IpAI2J2.J.J.3J2.2J$JpAK14ILJR.J2KJ.J.3J2.2J$IpA2J.LK 3.7IpAIpAIpAI2J.J.3J2.2J$JpAKJ3pAKpAKpA6KL.J.JR.J.J.3J2.2J$IpAJ.JK4.J 5IpA2IpA2QR.J.J.3J2.2J$J2.3IpAIpAI2J4IpA2IpA4IJ.J.3J2.2J$JpAKJLKpAK. 2I2J2IL8.2IJ.3J2.2J$IpA2JLIpAJIpA2I2JIpAIL6.J3I3J2.2J$JpAKJLJpA.pAJK 2.2JLTpA3.3I2J.2I2J2I2J6K$.pA2JLIJ.JLpA2I3pAI.3IpAIpAIpAIpAL.JpA8KJ$I J.3pA2KpAKJ3.JL2RL3KIJIJIJL4.5IL2J$pA2KJQT.IJIpAKpA.JLRpAK.2IpAIJIpA 2L.3IpA3I2L2J2K$pAI2JK.pAJI2JKJ.JLTS2.J.J.2pAJ2L.JLKJLKJ2LJ.IpA2IpAIpA 2IpA2IL$JK2IpA.JKJK.JpA.2pA2.pAIpAIpAL3J2L.JL2JL2J2LJpA2J2IpAIpA2IpAI 2L$I2JIpA2IpA.JpAIJ.JL2RL.J.JIpA2J2L.JKpAJKpAJ2L.J.2JIpAIpA2IpA3L$pAK 2JpAKLpAK.JK2.JLRpAK.pAIpALJ.JLIpAL6J2L.J.3JpAKpAKLpAK2L$pA2JIpAJL2J. IpAK.JLTS2.J.JLJ.JL.2LJpA2JpAJLILJ.2JIpAIpAJIpA.LIL.11IL31.ILILIL$JK 2JpAK3pAKpA.J.2pA3.IpALJLJ.2pAIL2IJ2IJIpA2LJK3JpAKpAK.LIpAIpAIpA9I2L 11.2IL5.2IL.2IL4.I6pA$I2J4.JK.JpAJ.JL3RS2LJLJKJ2IpA2IpAJ.2JLIpAL3JK.I pAJIpAJL.L.J7IL.IpA5IpAIpAIpAIpA.pAIpAIpAIpA.pAIpA.pAIpAIpAJLIJIJIpA$ pAKJpAKpA2KpA2KJK.JLRpAKpAKLJIL2JK.IL.J2.2J2LKIpAJIpAIpA2.J2IpAIpAIpA J6.pA2.LILIL.7IpA7IpA3IpA12IL$pAJIpAIpA2IpAIJIpAKJLTS3.IpA2LJKJpAIpAL J2.2J2L2IJ.2JKIL.J2.L.L.J.IpA2IpALIpAIpAJI2pAIpAIpAIpA.J3.IL.IpA2.IpA .pAIpAIpAIpAIpA3.L$JKJpAKpA2KpA2KpA.J2pA3.IpALJIpAIpAIJ.LpAJK.2JLIpAI LQJIpAIpAIpA2LpA.L.J.JpA.LpAK.IL2IL7.2IJ3.2pAIJ3IJ2IJ11.L$.pAKpA.pA2K pA2KJpA2JL3RS2LJ.L.J2.LKpAIpAI2JLIJ.pARJ.JLK.JIpA2IpAI2pAIJ.IpA.2IpAI LIpA.4IpA5IpAJ10.2IL5.2I2L$IpAIJ.L2IpALJKJKJLRpAKpAKIpAIpAIpA2IpAIJ.J IpAJIpAL3.J.JL2.J.IL.L.LJ4K2IJLK.IL2IpA3IpA5IpA3IpAIpAIpAIpAIpA.pAIpA IpAIpA.pAL$JpA3K2pAK2pAIpA.2JLTS4.J.L2K2.L2KpA3J2.J4IpAQ2IpAI2pAIpAIpA IpA4IpA3IpAIpAIpA2IJ3IpA5IpA5IpA6IpA7IpAIL$TpA2KI2pALJpAKL.3pA2.2IpAI JIpA4IpA2IJI2pATIpA4.J.JLKLKJ.L.L.L.2ILJ3.L.L.4IpAIpA.pAIpAIpA.pAIpAI pA.2pAIpAIpA.pAIpA6.L$3TpAJLJLIpAJL.2JL2R2.L.2JIL3.L2K.J.JIpA5.pA.JL. L.J.2LpAK2pAJLpAJ3IpAIpA5IpA.2IJ3.2IJ3.2I2J3.2IJ8.L$3.JLpAJI2pAKpA.2J LRpA3K.2JIpA3IpAIpAIpAI2JpA5KJ.JL.pALJ.4LKJ.L2IJ2.L.L3IL.7IpA4IpA4IpA 14.IL$J7IL2IpA.2JLTS2.2I3J2L3K3.J4.ILIL2J.J2LpAKJ.2LIpAIpAIpA5IpAIpAJ .LpA8IpA4IpA4IpA2IpA3IpA2IpA4I2L$JpAL2.pAK.L2.I4pA.3IpAIpA2JIpA3IpAQI pA2.I7pA.JLIpALJ.2L.L.JK3IL2.L.LIpA2IJIpA.IpAIpA.pALIpA.2pAIpA.pAL.pA IpA.pAL.pAI4pA$.JIpAIpAJ.IpAILI2JLR3.LIJIJ.L6.J2.JIJIJI2J.J2LpAKJ.3LpA .IJ.2IpALIpAIpAJIJ2.JIpAJ2.2IJLJ2I2J.2IJ2IJ.2IJ2IJ.IJ2L$.J.pAKpAKpAKpA KpA.2JLRpA3KJIJLKpAK4.IJ2.JLKLKLKJ.JLIpALJ.2LIpALJK.pAK2LJIL6IJIpAL.I LILIJIL.J16.J2L$IJ.T.T.T.T.T.2JLTS2.I2J.LILJ3KLpA2K.J7pA.J2LpAKJ.3LpA KIJIpAJ2LJIpA7IpA.IpAJIJ3IJ2IJ3IpA2IpA9IJ2L$JIpA.pA.pA.pA.pA2.3pA3.IpA IJL3pALQ.pAKL.pA2K.JKJK2J.JLIpALJLKLIpALJKJpA.LI2J2IL5IpA2IpA10IJIpA. pAL.pAL.pALJIL.3pA$JpA.pA.pA.pA.pA.pA.2JL3RSL2.2pAJLIpA2.LpAKpAKJ.ILI L2J.J2LpAKJL.pA2.2IJ.J.L.IpAILIJ.pAIpA.IpA.pA.IpA.pAIpAI2pAJ2IJ2IJL.J LJ2pAIJL2QT$2J.L8K.3JRpAKpAK.LKJLpAKQ.pAKL.L2JI6pA.JLIpAIJL.7IpAIpAI 2J.4IJ.2IJ2IJIJIpAJ3.LJ7.pAI2pAIJ3.3IL$2J.pA9I2J3K4.2LpAKLJ3K.L.L3J.I JI2J.JL2.IL9IJ.3IpA13IpA7.IJ19.4L2.2L2.2L2.2L2.2L2.2L2.3L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.6L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.3L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L54.L.3L.3L. 3L.3L.3L.3L.3L.2L.L14.3L5.3L53.3L58.L10.L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.4L.3L5.L.2L.L11.L11.L13.L37.L10.3L5.3L53. 3L9.L.3L.3L.2L3.2L.2L.L25.4L.L.2L3.L8.3L21.L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.L.L2.L.5L5.3L.L.2L3.4L.L.2L3.4L.L.5L46.L6.L.2L.L2.3L53.3L5.3L 10.L2.3L5.3L.L.2L.2L3.L3.L.3L3.L.3L.L4.L10.3L20.L8.L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.L.L18.3L9.3L9.3L5.L.2L.L7.L11.L11.L6.3L.3L5.3L.3L6.L11.L6.L .3L.2L.L7.L6.L.2L.L2.L.2L3.L.L2.3L8.2L.3L.3L.3L3.3L8.L4.L.2L.L7.L6.3L 9.L.2L3.L8.3L9.3L15.L5.L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.4L.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.5L5.3L8.4L. L.2L3.4L.L.5L5.L.3L.5L5.3L8.4L.L.5L8.L4.3L.3L.3L.3L.3L5.3L5.3L8.L4.3L 5.3L.L.2L.2L2.2L4.2L.2L3.L4.3L10.L2.3L8.4L5.L.3L.2L3.L8.3L12.L4.3L5.L .3L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L12.3L5.3L5.3L13.3L53.3L9.3L41.3L5.L. 3L.3L.2L3.L7.L5.L2.L.2L.L2.L.2L3.2L.3L.2L2.L4.L3.L3.L12.3L14.L2.L.2L. L8.L.3L3.L3.L.3L3.L.3L3.L3.L3.L.3L3.L.3L.L.L.L6.L3.4L.L.3L.2L.L.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L4.2L2.2L.L.3L.3L.3L.5L6.L2.3L.L.2L.L7.L2.3L.L.5L5. 3L6.L7.L2.3L.L.2L.L2.3L.3L6.L10.L.3L.3L.3L.3L.3L.3L.2L.L10.L.3L.3L.3L .3L.2L.L2.L.2L.L3.L2.3L9.3L5.3L9.L.3L.2L3.2L.3L.2L3.4L11.L4.L3.2L.3L. 2L3.2L.2L2.L3.L2.L5.2L.L.2L5.L8.3L8.2L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.4L.L.3L.3L. 3L.2L.L2.3L8.L11.L7.4L5.L.3L.2L3.L7.L7.L11.L7.4L.L.5L5.3L5.3L5.3L5.3L .L.5L5.3L5.3L5.3L5.3L8.2L.3L.2L3.L7.L7.L.L6.3L14.L2.L.3L.2L3.L2.L.3L 12.4L10.L5.2L.3L.L.L.L.L.L.L6.L3.L3.2L.3L.2L.L.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.4L49.3L 9.3L45.3L37.3L21.L.2L.L3.L6.L.5L.L.3L.2L2.L4.2L.2L3.L3.4L.L.2L3.2L.3L .2L3.4L5.3L4.L3.4L8.L4.3L3.L.3L.3L.3L6.L7.L6.L.2L3.L3.2L.3L.2L.L.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.L3.4L.3L5.3L.3L5.3L5.3L5.3L5.3L.L.5L5.L.5L6.L2.3L5.3L6.L2.3L 5.3L.L.5L5.3L5.3L17.3L25.3L.3L.L.3L.2L3.2L.3L.2L3.4L.3L4.2L.3L.3L3.3L 5.L.2L.L13.L8.L.2L3.2L.2L2.L4.L2.L4.L.L2.L.2L3.L7.L7.2L.2L3.L3.4L6.L. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.L3.2L.3L.2L3.L4.L.3L.2L3.4L5.3L.L.2L3.L11.4L.L.2L3.L4.L.3L.3L .5L5.L.3L.2L3.L9.L2.3L5.3L17.3L21.L.5L6.L6.3L9.L.2L3.L3.L.L2.3L6.2L. 3L.3L3.L.3L.2L5.L2.L3.L.3L8.L2.L.3L8.L5.L2.L.2L2.L2.L4.L2.L5.2L.2L3.L 2.L.3L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.L3.L28.3L8.L23.L24.3L29.L.2L.L2.3L6.L10.3L6.L13. 4L6.L6.L.3L.3L.2L3.L2.L4.L3.L.L5.2L.2L2.L4.L3.2L.2L.L2.2L5.L3.L7.L3.L 3.L3.2L.5L2.L5.L2.L.3L.3L.3L.3L.3L.3L.3L4.L3.4L.L.2L.L.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L23.L28.3L10.L7.L7.L6.3L.L.5L.3L.L.2L2.L .3L4.L.L2.L.5L5.3L5.3L.L.3L.3L.3L.2L3.4L5.3L5.3L8.L.L2.3L5.3L.L.2L3. 2L.2L3.4L4.L3.L3.4L4.L.L5.2L.2L2.L4.L2.L4.L2.L4.L3.L2.L3.L4.2L.2L.L. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.L3.L32.3L8.L7.L7.L4.L.2L2.L2.L5.L4.L.2L3.4L5.3L. 3L21.L.3L.3L.3L.3L.2L3.L2.L4.2L.2L3.L3.4L8.2L.5L3.L4.2L.3L.2L3.L4.3L 8.2L.5L4.2L.2L2.L2.L4.L2.L4.L3.L4.L3.L.L6.L.2L.L.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L68.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.5L.3L 6.2L.3L8.2L.2L3.2L.2L3.2L.3L.3L.3L.3L.3L.3L.2L3.4L.L.2L2.L3.L.3L.3L. 3L.3L.3L.3L.L.3L.5L.3L.3L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.2L.2L3. 2L.3L.2L2.L3.L3.L3.L3.L3.L4.2L.3L.3L.2L2.L4.L2.L4.L2.L4.2L.3L.2L3.L4. L.5L2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.2L.2L3.2L.3L.2L3.L2.L3.L3.L 3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L.3L4.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L. 3L.2L3.L3.L3.2L.2L3.2L.2L3.2L.3L.2L3.L3.L4.3L65.3L6.L.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L.3L .2L3.L3.L3.2L.2L3.2L.2L3.L2.L3.L4.2L.3L6.L.L60.L.3L4.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L. 3L.2L3.L3.L3.2L.2L3.2L.2L3.L3.L4.3L5.3L5.3L29.L.3L.3L.2L2.L2.L2.L.2L 3.L3.4L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.2L.2L3.2L.3L6.2L.2L3.2L.2L .L4.L3.L3.L3.L3.L3.L.3L3.L.3L3.L.3L.3L.3L4.L2.L.3L4.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L. 3L.2L3.L3.L3.2L.2L3.2L.2L3.2L.3L4.2L2.2L.3L9.3L24.2L.3L.3L.3L.2L2.L4. 2L.2L3.4L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.2L.2L3.L16.3L9.3L20.L3.L 4.3L5.3L13.L.3L.2L3.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.2L.3L.2L3.L3.L3.2L.2L3.L8.L.3L.3L. 3L.3L.3L.3L.3L.2L.L13.L3.L8.L.2L2.L.3L3.L2.L5.L2.L.3L4.L.L.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3. 2L.3L.2L3.L3.L3.L15.2L.3L.3L.3L.3L.3L.2L.L6.3L8.L3.L8.3L8.4L6.L5.L3. 4L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L3.L3.L3.L3.L3.L4.L3.L11.L3.L8.L .2L3.L3.L12.L.3L.3L.5L.2L3.L5.L3.2L.3L.2L2.L4.4L.L.5L4.L.L5.L2.L.3L4. L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L2.L3.L3.L3.L3.L3.L3.L3.L.3L4.2L. 2L.L2.3L5.3L5.3L5.3L13.L.2L4.3L.3L.3L9.3L2.L5.2L.2L3.L5.L5.L3.4L.L.2L .L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L3.L3.L.L22.L.3L.3L.3L.2L.L5.L7.L7.L6.L 3.L3.L2.L2.L3.L4.L5.2L.3L.3L.2L3.L2.L.3L3.L3.L.3L.3L.3L.L.2L3.L5.L.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L3.L4.L3.L.L3.L14.3L13.L.2L.L3.L 2.3L8.L4.3L9.L.2L2.L.3L.L4.L5.2L.5L3.L.3L8.L4.L.4L3.2L4.L2.L3.L.3L2.L .2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.L.L10.3L9.3L5.3L9.3L5.L.2L3.L.L3.L5.L2.L2.L5.L2.L2.L5.2L. 2L.L3.L5.4L.3L.L.2L3.2L.2L3.2L.3L.3L.L.2L3.L5.2L.2L3.L2.L4.L3.L7.4L.L .2L2.L4.L3.L4.3L2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L6.3L9.3L5.3L12.L3.4L4.L.L3.L5.L 3.L.L5.L3.L.L5.2L.2L.L3.L5.L3.L3.L.L2.3L5.3L5.3L.L.3L.5L.3L.L.5L4.2L. 2L2.L4.L2.L4.2L.5L11.L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L3.L2.3L9.3L5.3L8.L3.2L. 2L3.2L.2L.L3.L5.4L3.L4.4L3.L4.2L.2L.L3.L5.L3.4L8.2L.2L3.2L.2L.L2.L3.L 4.L5.2L.2L3.L4.3L4.2L.5L9.3L8.L3.L5.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L4.L.3L2.L4.L. 3L3.L.3L4.L3.L3.2L.2L3.2L.2L.L3.L5.L3.L3.L3.L3.L3.L.L2.3L6.L5.2L.2L3. L.L2.3L5.3L.L.2L2.L.3L.L4.L5.2L.3L.2L2.L4.2L.2L2.L.3L2.L4.L.3L4.L3.L 2.L.3L2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.L.L7.L7.L6.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L.L46.L.2L. L7.L2.L.5L8.4L5.3L8.L3.2L.2L3.L.L7.L5.4L4.L3.4L4.L.L3.L2.L.2L.L5.2L. 2L3.L.L5.2L.2L3.2L.3L.3L.L.2L3.L5.2L.2L2.L.3L5.L.2L3.L3.L.L5.4L8.L3. 4L2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.4L.3L.3L.3L.3L.3L5.L.3L.3L.3L.2L.L10.L.2L.L10.L.3L. 3L.3L.3L.2L.L10.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L.L3.L38.3L5.3L5.3L 6.L2.L.2L2.L.3L3.L.3L4.L3.L3.L2.L4.L.L3.L2.3L8.L11.L9.L6.3L.3L.L.2L3. L.L5.L.L2.3L5.L.3L.3L.5L.3L.L.2L3.2L.5L3.L.3L.3L.3L3.L.3L4.L3.L2.L4.L .L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.4L8.L7.L5.L5.4L5.3L5.3L.L.5L5.3L.L.5L5.3L5.3L5.3L.L .5L5.3L5.3L5.3L21.3L5.L.2L.L33.2L.2L.L2.L.2L.L5.4L8.4L5.L.2L2.L4.L3.L 3.L.L2.3L6.L5.L3.2L.2L3.4L9.3L12.L2.L4.L.L5.L.L3.L2.L.L.L3.L3.L4.L5. 2L.2L3.4L4.2L.2L2.L4.2L.3L.3L.3L.2L3.L3.L5.L.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L50.3L 13.3L29.3L29.L.2L.L7.L7.L2.L.3L.5L.L.3L.3L.3L.3L.3L.2L3.4L5.3L5.3L12. 2L.3L.5L5.3L8.4L7.L2.L3.L5.L3.2L.3L.2L3.2L.2L.L6.L.2L2.L4.L3.L.L9.L.L 4.L.3L3.L.3L.L4.L5.2L.2L2.L4.L2.L3.L.3L3.L3.L.3L3.L.3L4.L2.L.3L2.L.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.L.L2.L.3L.3L.5L5.3L5.3L5.3L5.3L.L.5L5.L.3L.5L5.L.2L.L6. L.3L.3L.2L3.2L.5L5.3L5.3L5.3L.3L8.4L5.3L6.L2.3L9.3L5.L.2L3.2L.2L.L2.L .2L.L2.L.3L.2L3.2L.2L.L8.L4.L3.2L.2L3.L9.L3.L5.L3.2L.3L.2L3.L.L2.3L5. 3L4.L2.L4.L.L3.L2.3L5.L.3L.3L.3L.L.2L3.L5.L2.L.3L8.L4.3L9.3L5.3L8.4L 2.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.L.L2.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L3.L11.L15. L4.3L.3L.L.3L.3L.2L3.L8.L.3L.3L.3L.3L.3L.3L.2L.L11.L6.L.2L2.L.3L2.L2. L.5L4.2L.2L3.2L.2L.L2.L.5L2.L3.L2.3L5.3L5.3L8.L.2L2.L6.3L6.L5.L3.2L. 2L2.L4.4L2.L2.L.2L3.L4.3L5.3L8.L.L2.3L5.L.3L.3L.5L.3L4.2L.5L3.L3.L.3L 3.L3.L.3L3.L.3L4.L2.L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L10.L.3L.3L.3L.3L.2L.L 10.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L3.4L21.3L17.L.5L6.L6.3L9.L.5L5.L.2L 3.L4.3L.3L5.3L9.3L8.2L.2L2.L2.L5.2L.2L3.2L3.3L.L.2L3.L5.L5.L3.L4.3L5. 3L3.L2.L2.L.3L.2L3.2L.2L.L2.L.2L3.L.L3.L2.L.L.L3.L3.L4.L5.L3.4L4.L2.L 3.L.3L3.L3.L.3L.L.5L3.L.3L.L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L2.3L.L.5L5.3L5. 3L5.3L.L.5L5.3L5.3L5.3L5.3L13.3L21.3L13.3L10.L6.L.2L2.L2.L5.L10.L3.L 3.L3.L4.L.L2.L.2L.L2.L.2L.L6.L.2L3.2L.3L.2L.L5.2L.2L3.2L.3L.3L.2L.L2. 3L8.4L8.2L.2L3.L4.3L9.3L5.3L5.3L7.L.3L3.L.3L.L4.L5.L2.L4.L2.L4.L.L2. 3L10.L2.L.2L3.L4.3L6.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L6.3L29.3L25.3L21.3L21.3L16.L 8.3L5.3L5.3L13.3L17.3L5.3L5.3L5.3L.3L5.3L10.2L.3L20.2L.3L.2L3.L3.L3. 4L3.L3.L2.L2.L.3L.2L2.L3.L2.L2.L.2L3.2L.3L.3L.3L.3L.L.2L3.L5.L3.2L.5L 5.3L.3L3.L.3L.3L3.L3.L3.L.3L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L2.L.3L.3L.3L.3L. 3L.5L5.3L.L.5L5.3L5.3L.3L.L.5L5.3L5.3L.L.5L5.3L5.3L.L.5L5.3L17.L.2L.L 2.L.2L.L2.L.3L.3L.2L3.L.L10.L.2L.L2.L.2L.L2.L.2L.L2.L.2L3.L2.L2.L4.L 2.L5.2L.2L3.2L.3L.3L.3L.5L5.2L2.3L.3L8.L8.3L17.3L8.L4.3L9.L.3L.5L.3L. 3L.L.2L.L4.L.3L4.L.L2.3L.3L7.L3.L.3L.2L3.L.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L2.L.3L. 3L.3L.3L.3L.3L.3L.2L3.L8.L.3L.3L.2L3.L3.L8.L.3L.3L.2L3.L8.L.3L.3L.2L 3.L8.L.5L21.3L5.3L16.4L2.L5.4L.3L3.L.3L2.L3.L2.L.2L3.2L.2L.L2.L.2L.L 5.2L.5L.L.3L.3L.3L.3L.5L8.2L.2L3.2L.2L2.L3.L2.L2.L.3L.3L.2L.L9.L3.2L. 2L.L2.L.3L.3L3.L4.L5.L3.2L.2L.L5.4L6.L5.L.L5.4L.2L2.2L2.2L3.L.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.L.L6.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.5L17.3L 17.3L29.L.2L.L15.L2.L.2L.L2.L.3L.2L3.L9.L2.L.2L3.L2.L2.L3.L3.L3.L2.L. 2L3.L.L2.3L.L.2L.L5.2L.2L3.L2.L3.L3.L3.L3.L.3L4.L3.L4.3L5.3L5.3L13.3L 8.L3.2L.2L2.L3.L3.L.3L.L4.L5.L3.2L.5L3.L.3L.3L8.4L2.L5.2L.3L.3L.2L.L. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.L.L3.L18.3L9.3L13.3L9.3L17.3L17.3L33.3L2.L2.L.2L 3.4L5.3L21.3L5.3L5.3L6.L3.L2.L.2L3.L2.L.3L2.L3.L5.2L.2L3.L3.L.L7.L6.L .3L.3L.3L.2L3.2L.3L.3L.2L2.L3.L3.L2.L3.L5.L3.L3.L8.L.3L.3L.L.2L3.L5.L 3.2L.5L10.L33.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.4L.3L.3L.3L5.3L.L.2L.L2.3L.L.5L 5.3L.L.2L.L2.3L.L.5L5.3L.3L.L.5L6.L2.3L.L.5L5.3L5.L.5L8.L8.3L6.L2.L. 2L.L2.L.3L.2L.L16.L4.2L.2L.L2.L.2L.L3.L2.L.2L3.L.L2.3L6.L5.2L.5L.3L. 3L.3L.3L.3L.3L5.L.3L.5L6.2L.3L13.3L8.L3.4L5.3L13.L.5L.3L.3L.3L5.L.3L. 2L.L2.L.2L2.L.3L.L.3L.2L.L2.3L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L5.L4.L. 2L3.L11.L8.L.2L3.L11.L8.L.2L3.L3.L11.L.L5.L8.L.3L.2L3.4L8.2L.3L.2L3.L 7.4L5.3L6.L2.3L9.L.2L3.L4.L.5L2.L3.L3.L2.L.2L3.L2.L.3L2.L3.L5.2L.2L3. L3.L7.L7.L7.2L.3L.2L3.2L.3L.3L.3L.3L.3L.2L.L2.L.2L3.L7.L5.L2.L.3L.3L. 3L4.L5.L3.L5.L6.3L5.L.2L3.4L5.3L8.2L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L 5.2L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L3.2L.2L.L9.L5.L7. L6.L.2L.L2.3L8.L25.L9.L.L3.L4.L.3L.L.2L2.L4.L.L2.3L6.L3.L2.L.2L3.L.L 2.3L6.L5.2L.2L3.L2.L2.L4.L2.L4.L2.L5.2L.3L.2L3.L4.L.3L.3L.3L.2L2.L.3L 3.L2.L5.L7.L2.L3.L3.L.3L.L4.L5.L3.2L.5L3.L.3L3.L.3L3.L.3L3.L.3L.L.2L 3.2L.2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L3.L5.L36.3L9.3L16.L11.L15.L7.4L5.L. 5L29.3L8.L.L3.L5.4L8.L6.L.3L2.L3.L3.L2.L.2L3.L2.L.3L2.L3.L5.2L.5L.3L. 3L.3L.3L.3L.3L4.2L.2L2.L3.L.3L2.L4.L3.L3.L4.L.L7.L2.L.2L3.L3.L4.L.3L. 3L.L.2L3.L5.L3.2L.4L2.L.4L2.L.4L2.L.4L2.L.4L2.L.2L3.L5.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.4L.3L.3L.L.2L.L9.L.L2.3L.L.2L.L2.3L.L.2L.L2.3L.L.5L8.L40.3L9. 3L22.L13.L3.L5.L2.L.5L4.L2.L4.L.L2.3L6.L4.L2.L5.L.L2.3L6.L5.2L.2L3.L 3.L2.L4.L2.L4.2L.2L2.L3.L.3L.L.2L.L4.L.3L.L.2L.2L2.L2.3L.3L.3L2.L5.L 4.3L5.L.3L.3L.5L.3L.3L.L.3L.5L.L.5L.L.5L.L.5L.L.5L8.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.3L3.2L2.2L2.L5.L4.3L.3L4.L.L5.2L.2L.L5.L11.L11.4L.3L 5.3L5.3L.L.5L5.L.5L.L.5L5.L.5L5.3L.L.2L3.L5.L6.3L5.L.2L.L2.L.2L3.2L. 2L3.L8.L.3L.5L.L.2L.L5.L2.L.3L2.L3.L5.2L.2L3.L3.L.L7.L6.L.2L3.L2.L.3L 3.L.3L2.L2.L.3L.5L6.L5.4L.3L.L.3L.2L.L2.L.L.L3.L3.L4.L5.L3.2L.5L.L.5L .L.5L.L.5L.L.5L.L.5L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L.L14.L.3L.3L. 2L3.L4.3L.3L5.3L.L.3L.3L.3L.3L.3L.3L.2L3.L.L2.L.3L.3L.2L3.4L8.L7.L11. L8.L.2L3.L16.L.2L3.L3.L4.3L5.3L29.L.2L.L5.L4.3L6.L5.2L.5L.3L.3L.3L.3L .3L8.L3.L.L2.L.2L.L4.L.3L.L.2L.2L3.L.3L2.L5.L2.L2.L2.L.2L2.L.3L3.L.3L .L6.L3.L3.2L.2L2.L3.L3.L3.L3.L3.L3.L3.L2.L2.L.2L3.L3.L.L.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.L3.L4.L.3L.3L.3L.3L.3L.3L.5L53.3L13.L.2L3.L37.L6.L.3L.2L.L5.2L.2L 3.L3.L7.L4.L.2L3.L3.L3.L.L2.L.2L.L2.L.2L2.L3.L3.L4.L.L4.L.3L2.L3.L2.L .3L.3L.3L.2L2.L3.L3.L4.L3.L36.3L.L.2L3.L3.L.L.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.L2.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3. L3.L3.L3.L3.L3.L3.L3.L3.L.3L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L2.L5. L63.L15.2L.2L3.2L.2L2.L3.L3.L3.L4.L3.L3.L.L4.L.3L3.L3.L3.L3.L3.L.3L3. L4.L.L4.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L.3L3.L 4.L3.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.L2.L3.L3.L3.L2.L4.L3.L2.L2.L.2L2.L3.L2.L2.L.2L2.L3.L3.L3.L3.L3.L 3.L3.L.3L3.L.3L3.L.3L3.L.3L3.L.3L4.L3.L.L5.L2.L3.L.3L6.2L2.2L2.L2.L. 3L.2L2.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L3.L.3L 3.L3.L4.L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L.3L3. L.3L3.L.3L3.L.3L3.L.3L.L.2L2.L3.L3.L2.L4.L2.L2.L.3L.2L3.2L.3L.3L.2L3. 2L.2L3.L2.L4.L2.L.3L3.L3.L.3L6.2L.3L5.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L .3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.2L.L.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L 2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L3.L.3L3.L.3L.L.5L2.L4.L3.L.3L3.L.3L3.L. 3L3.L.3L.L.L.3L3.L3.L3.L.3L3.L.3L4.2L.3L.2L3.L12.L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 2L.L.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2. 2L2.2L2.2L2.2L2.2L2.2L2.2L2.2L2.L2.L3.L4.L2.L3.L3.L.3L3.L.3L3.L.3L3.L .3L3.L4.2L.3L.3L.3L.3L.2L3.2L2.L4.L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L.3L. 3L.3L.2L.L.5L$2JKpA19KLJKpA5KpAKL3J4K.J.J3IJ15IJL12KpA29K$J2KpA20K2.L 2QIpA2KJL2JpAKpAKpAKpAKpA8K.L2K.L2KL4K$26.IpAQIpA2KpAKJKJ.J3.J2.LKL3K .pAKpAKpAKpAKpAK$30.3IJ2.JpAKpA3KpASpAKpAKpAKpA2KLpA.pAKpA2K$37.N5.JK pAKpAKpAKpA3KJ2K! golly-2.5-src/Patterns/JvN/codon5-auto-retract.rle0000644000175100001440000011145612156145314017023 00000000000000# A self-reproducing machine for Nobili cellular automata. # Copyright (C) 2008 by William R. Buckley # # The machine corpus appears at the left of the observed line; # zoom to see the machine. # # This configuration employs one mechanism of tape message # compression: the assumption that during construction (whether # of daughter corpus or tape copy), retraction of the construction # arm should be automatic - no need for a specific retract # instruction to appear on tape (such as after appearance of a # construct instruction). Auto-retraction of the construction # arm yields an approximately 1/3 smaller tape, versus a tape # which contains explicit instructions for construction arm # retraction. # # Consequently, this configuration has minimal size, in accord # with the minimal functionality necessary to both read and # service the tape. # # This machine serves to demonstrate that one may obtain optimal # solutions to machine self-replication within von Neumannesque # cellular automata without the use of more complicated compression # schemes, like run-length encoding, and that indeed such schemes # may here serve to reduce the efficiency of solutions. # # Corpus cell count : 3343 # Bounding rectangle : 110w 50t # Length of tape : 44150 # Tape instruction count: 8830 # Bits per instruction : 4 # Replication time : 5.87 x 10^9 # # Instruction Set - fourteen total operations # ------------------------------------------- # # 00000 RL/QQ Retract CArm Left/Ground Articulate # 00001 -- not used # 01111 # 10000 OR Ordinary Transmission Right Construct # 10001 OU Ordinary Transmission Up Construct # 10010 OL Ordinary Transmission Left Construct # 10011 XU Extend CArm Up Articulate # 10100 OD Ordinary Transmission Down Construct # 10101 RD Retract CArm Down Articulate # 10110 SR Special Transmission Right Construct # 10111 -- not used # 11000 SU Special Transmission Up Construct # 11001 XR Extend CArm Right Articulate # 11010 SL Special Transmission Left Construct # 11011 TM Tape Mark Meta # 11100 SD Special Transmission Down Construct # 11101 -- not used # 11110 CN Confluent Construct # 11111 -- not used # x = 44266, y = 50, rule = Nobili32 8.IK3IpA10IL14IpA13IpAIpA3IL8.13IL$7.IpAIJ2IpA7IL2.pAJ5IL.J3.2IpA13IpA IpA2IL9IJ2IL2IL2IL.I2pA$6.pA2JRSpAKpA7KL.RpAKpA2KQ.pAIpAL2IpAIpA13IpA L.IL11IpA.pAJ.pAJ.pAIpA.L$4.2IJIpA2IJTS.pALILIJ2IL.IJIpAR3.JIpALJ.L.I LIL2.IL2ILI2pAI2pAIL2IL2ILIL.IpA2IpA2IpA4IL$4.pAKI2JR3SLKJI3pAK.IpAIJ .J2Q.pAIpAIJIpAIpAI5pAIJIpA.pAJIpAIpA2.IpA.pAJ.pAJIpAIpA10.pA$4.pA2J 7K2JK.IpAJIJL3IpA3I3JK2.J.L.LIJIJ3.IpA10IpA2IpA13IpA3IpAIpAIpA3I$4.J 4KILIL.pAKJ3.IJIpAJ2.J2.2IpAIpA2IpA2L.L5.2IL7.2ILI2pAL.pALILIpAIpA.pA LIL.pALIpA4.2QR$4.ILIL2JLJL.pA2J3.JIJL3IpAILJIJIJ2.JIpAIpAIpAIpAIpA.pA IpAIpAIpAIpA.pAJIJ2IJIJIJ2.IpAJIJ2IJIpAL4.pA$4.9pAIJIpAL2.2JIpAJ2.J.pA 2J.JK2.pA.I2L.5IpA9IpA11IpA2IpA12IpAJ$4.JIJI2JIJ.2IpAJ3I3JIL.IpAR2.J 2pAJ2.J2.2pA6IpA4IpAIpAIpA.pAIpALIpAIpALIpA.IpA.pAIpAIpAIpAI2pAI2pAJ$ 4.J4IJ.2IJIpAJ4I2JTpAK2pAQIpAL2J.2IpAILIpA.5IpA4IpAIpAL2IJ2.IpA3.IJ.pA J2IJ.pAIpAJ2.IJ2.J$4.2pA.4IJ2IJIpAJ4.JTL.2JK.JL2JKJ3.ILIpAJ2ILIpA2ILI pAL.7IpA6IJ5IJIpA7IJ$4.2JIJ4IpAK.IJ5.J.pAIpALJIpAIpAIpAJ4.pAIpAIpA.LJ pAK.2pA.pAILILIL2IpA7IJ5IJ$4.3pAKpA2.IpAJIpA6IJ3.JIpA2J.JKJ5.5I2pAIpA J.IJLK.IJIJIJIpA8IJ$4.3JKJK.J.IJ.2IL7.J.JIpAQI2pA10.17IJ$4.2JIJIpAKJI pA2KJIpAIL5.J.3J2K2J$3.I3JLpA.4JI3JLTpA3.2IJ.2JK.3J9K$3.pAK2JLJpA3JpA J.3pAI.3IpAIpAIpAIpALJpA9KJ$3.pA3JpA.JIpAIJ2.2JL2RL3KIJIJIJL4.5IL2J$ 3.JKpAKpAIpAJ5.2JLRpAK.2IpAIJIpA2L.3IpA3I2L2J2K$3.IKJIJ8.2JLTS2.J.J. 2pAJ2L.JLKJLKJ2LJ.IpA2IpAIpA2IpA2IL$ILIpAI2J9.3pA2.pAIpAIpAL3J2L.JL2J L2J2LJpA2J2IpAIpA2IpAI2L$2pA2JRSpAK8.2JL2RL.J.JIpA2J2L.JKpAJKpAJ2L.J. 2JIpAIpA2IpA3L$J.IpA2I2J8.2JLRpAK.pAIpALJ.JLIpAL6J2L.J.3JpAKpAKLpAK2L $2pA2JR2IJ8.2JLTS2.J.JLJ.JL.2LJpA2JpAJLILJ.2JIpAIpAJIpA.LIL.11IL31.IL ILIL$2J2KRpA5K5.3pA3.IpALJLJ.2pAIL2IJ2IJIpA2LJK3JpAKpAK.LIpAIpAIpA9I 2L11.2IL5.2IL.2IL4.I6pA$JLKJKpAK.pAIpA5I2JL3RS2LJLJKJ2IpA2IpAJ.2JLIpA L3JK.IpAJIpAJL.L.J7IL.IpA5IpAIpAIpAIpA.pAIpAIpAIpA.pAIpA.pAIpAIpAJLIJ IJIpA$JLJLK.JKJLpAK.LK2.JLRpAKpAKLJIL2JK.IL.J2.2J2LKIpAJIpAIpA2.J2IpA IpAIpAJ6.pA2.LILIL.7IpA7IpA3IpA12IL$6pAK2JpA.pAK2pAK.JLTS3.IpA2LJKJpA IpALJ2.2J2L2IJ.2JKIL.J2.L.L.J.IpA2IpALIpAIpAJI2pAIpAIpAIpA.J3.IL.IpA 2.IpA.pAIpAIpAIpAIpA3.L$JLJLJL2JKJ2K.JLJ.2pA3.IpALJIpAIpAIJ.LpAJK.2JL IpAILQJIpAIpAIpA2LpA.L.J.JpA.LpAK.IL2IL7.2IJ3.2pAIJ3IJ2IJ11.L$7pA.pA 4KJ2pA.JL3RS2LJ.L.J2.LKpAIpAI2JLIJ.pARJ.JLK.JIpA2IpAI2pAIJ.IpA.2IpAIL IpA.4IpA5IpAJ10.2IL5.2I2L$JLJKJKJLpAKLKJ2KJ.JLRpAKpAKIpAIpAIpA2IpAIJ. JIpAJIpAL3.J.JL2.J.IL.L.LJ4K2IJLK.IL2IpA3IpA5IpA3IpAIpAIpAIpAIpA.pAIpA IpAIpA.pAL$pAKL2K.2pA.pAKJ3KJ.JLTS4.J.L2K2.L2KpA3J.IJ4IpAQ2IpAI2pAIpA IpAIpA4IpA3IpAIpAIpA2IJ3IpA5IpA5IpA6IpA7IpAIL$.TpATJKJKIpA2.IL2J3pA2. 2IpAIJIpA4IpA2IJI2pATJ3.LKJ.JLKLKJ.L.L.L.2ILJ3.L.L.4IpAIpA.pAIpAIpA.pA IpAIpA.2pAIpAIpA.pAIpA6.L$.4TpA2IJLI4pAK2JL2R2.L.2JIL3.L2K.J.JIpA3.3pA .JL.L.J.2LpAK2pAJLpAJ3IpAIpA5IpA.2IJ3.2IJ3.2I2J3.2IJ8.L$5.J2.LpAJIJIpA 3JLRpA3K.2JIpA3IpAIpAIpAI2JpA4K2J.JL.pALJ.4LKJ.L2IJ2.L.L3IL.7IpA4IpA 4IpA14.IL$.J11ILK.2JLTS2.2I3J2L3K3.J4.ILIL2J.J2LpAKJ.2LIpAIpAIpA5IpAI pAJ.LpA8IpA4IpA4IpA2IpA3IpA2IpA4I2L$.JpAL7.JKIL.3pA.3IpAIpA2JIpA3IpAQ IpA2.I7pA.JLIpALJ.2L.L.JK3IL2.L.LIpA2IJIpA.IpAIpA.pALIpA.2pAIpA.pAL.pA IpA.pAL.pAI4pA$2.JIpAIpAIpAIpAIpA.L.2JLR3.LIJIJ.L6.J2.JIJIJI2J.J2LpAK J.3LpA.IJ.2IpALIpAIpAJIJ2.JIpAJ2.2IJLJ2I2J.2IJ2IJ.2IJ2IJ.IJ2L$2.J.pAK pAKpAKpAKpAKpA.2JLRpA3KJIJLKpAK4.IJ2.JLKLKLKJ.JLIpALJ.2LIpALJK.pAK2LJ IL6IJIpAL.ILILIJIL.J16.J2L$.IJ.T.T.T.T.T.T.2JLTS2.I2J.LILJ3KLpA2K.J7pA .J2LpAKJ.3LpAKIJIpAJ2LJIpA7IpA.IpAJIJ3IJ2IJ3IpA2IpA9IJ2L$.JIpA.pA.pA. pA.pA.pA2.3pA3.IpAIJL3pALQ.pAKL.pA2K.JKJK2J.JLIpALJLKLIpALJKJpA.LI2J 2IL5IpA2IpA10IJIpA.pAL.pAL.pALJIL.3pA$.JpA.pA.pA.pA.pA.pA.pA.2JL3RSL 2.2pAJLIpA2.LpAKpAKJ.ILIL2J.J2LpAKJL.pA2.2IJ.J.L.IpAILIJ.pAIpA.IpA.pA .IpA.pAIpAI2pAJ2IJ2IJL.JLJ2pAIJL2QT$.2J.L10K.3JRpAKpAK.LKJLpAKQ.pAKL. L2JI6pA.JLIpAIJL.7IpAIpAI2J.4IJ.2IJ2IJIJIpAJ3.LJ7.pAI2pAIJ3.3IL$.2J. 12I2J3K4.2LpAKLJ3K.L.L3J.IJI2J.JL2.IL9IJ.3IpA13IpA7.IJ19.2L.3L2.3L2. 3L2.3L2.3L2.3L2.4L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L.2L555.L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.4L2.3L2.3L2.2L2.3L2.3L2.3L2.3L2.4L2.2L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.4L2.3L2.2L2.4L2.2L2.4L2.2L2.4L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L44.L.L 2.L4.L4.L4.4L.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L 4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L.L2.L4.L4.L4.L4.L4.L4.L4.L4.L4.L 4.4L.L4.L4.L4.L2.L.L4.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L.4L.L9.L.L2.L4.L 4.L.L2.L4.L4.L.L2.L4.L4.L3.2L4.L4.L4.L4.L4.L4.L4.L4.L4.L.L2.L4.L4.4L. L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L19.L3.L5.L.L2.L4. L4.L4.L4.L4.L3.5L11.L.L2.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L3.2L4.4L.L4.L .L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L7.4L.L4.4L6.L3.5L6.L3.5L6.4L.L4.L4. L4.L4.L4.L4.L4.L4.L4.L4.L4.L.L2.L9.L.L2.4L.L4.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L4.4L.L4.4L.L4.L4.L.L2.4L.L4.4L6.L.2L.L2.L.L2.L.4L.L2.L.4L .2L8.L.L2.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.4L.L2.L.4L.2L.L.2L3.L3. 2L3.5L.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.L4.L4.4L.L4.L4. 4L.L4.L4.4L.L9.L.L2.L4.L.L2.L4.L4.L.L2.L4.L4.L.L2.L4.4L.4L.L4.4L.4L.L 4.L.L2.L4.L4.L.L2.L14.L.L2.L4.L.L2.L9.L.L7.L3.2L.L2.4L.L4.L3.L15.2L3. 4L.L4.L3.2L9.L.L2.L4.L4.L3.2L4.L.L2.L4.L.L2.4L6.2L.L.3L2.L3.2L4.L4.4L .L4.L3.2L4.L4.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L51.4L.L4. 4L.L4.L3.5L6.L3.5L6.4L.L14.4L.L4.4L.L4.L3.5L6.4L.L4.L3.2L4.4L.4L.4L. 4L.4L.L4.4L.L4.4L.L4.L3.2L4.4L.L4.4L6.L.2L.L.2L.L3.L5.L3.2L4.4L.L9.L 2.L.4L.4L.4L.L4.L3.2L2.L.L.L2.2L.L.2L.L.2L.L.2L3.L3.2L3.2L4.L2.L.4L.L .L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.2L4.L4.L4.4L.L4.4L.L4.4L.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L4.4L.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L19.L3.2L 4.L3.2L4.L.L7.L.L7.L3.L10.L2.L.L3.2L3.2L3.2L4.L4.L4.4L.L4.L4.L4.L.L2. L3.2L4.L3.5L.L9.L2.L.L3.2L3.2L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L3.2L 3.5L.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L3.L.2L.L.2L21.4L.L4.L.L2.4L6.L.L2.L4.L.L2.4L6.4L.L4.4L. L4.L.L2.L4.L.L2.4L6.L.L2.4L.4L.L4.L.L2.L4.L39.L.L2.L4.L29.L.L7.L.L2.L .L2.4L.L4.L4.4L.L4.4L.L4.L14.L3.L10.L3.5L.L4.L3.2L19.L3.2L2.L.4L6.L.L 2.L4.L.L2.L4.L2.L.L2.L.L2.L.L2.L.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L21.L.L2.4L.L4.L3.2L4.L4.L3.2L4. L3.5L.L14.L3.2L4.L3.2L4.L3.2L4.L4.L3.2L4.L3.5L6.4L.L4.4L.L4.4L.L4.4L. L4.4L6.4L.L4.4L.L4.4L.L4.4L.L4.4L.L4.L3.L10.L3.2L4.L3.2L4.L3.2L.L2.L 4.4L.L4.L4.L4.L.L2.L3.2L4.L3.L15.L3.2L3.5L6.L.L2.L3.2L.L2.L3.2L3.2L.L 2.L4.L.L2.L4.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.2L3.5L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.4L.L 4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L 4.L4.L4.L9.L.L2.L.L2.L9.4L11.L2.L.L3.L5.L3.2L3.5L6.L3.L10.L3.5L.L4.L 3.2L3.L10.L.L2.4L.L4.L3.2L4.4L.4L.4L.4L.4L.4L.4L.4L.4L.L.L.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.5L.4L.L4.4L .4L.L4.4L.L4.4L.L4.4L.L4.4L6.4L.L9.4L.L4.L.L2.4L.L4.4L.L4.L.L2.4L.L4. 4L6.4L.L4.4L.L4.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.4L.4L11.L3.L10.L 3.5L.4L.L3.L10.2L3.4L.L9.L.L2.L4.L3.2L3.2L3.2L4.L4.L4.L3.5L.L4.L9.L3. 2L4.L3.2L3.2L4.L3.2L4.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.2L3.L10.L3.2L14.L3.5L.L4.4L6.L3.2L4.L4.L3.5L6.L 3.2L19.4L.L14.L3.2L4.L4.L.L2.4L.L4.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.L9. 4L.L4.L.L2.L4.4L.L4.L9.L3.2L3.2L.L2.4L.L4.L.2L.4L.4L.L2.L.4L.3L2.L3. 2L3.2L4.L4.L4.L4.L3.5L.L4.L3.2L4.L9.L3.2L4.L4.L4.L4.L3.2L.L.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.2L4.L4.L4.L4. L4.L4.L4.4L.L4.L3.2L4.L4.L4.L4.L4.L3.2L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L 4.L4.L4.L9.L.L2.4L.L4.L.L2.L4.L4.4L.L4.L.L2.L4.L4.L3.5L.L4.L.L2.L19.L 3.2L2.L.L3.2L3.2L.L2.L3.L5.L2.L.L3.2L3.L5.L.L2.3L2.L3.L20.L3.5L.L4.L 3.2L4.L4.L3.2L4.L4.L4.L9.4L.4L.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.2L4.L4. L4.L4.L4.L3.2L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L.L2.L4.L.L2.L4.L.L2.L4.4L 6.4L.4L6.L2.L.4L.L3.2L.L7.4L.L4.4L.L4.4L21.L3.5L.L4.4L.L4.4L.L4.L3.2L .L2.4L.L4.4L6.L3.L25.L3.2L9.L2.L.4L.L4.L4.L4.L4.L3.2L4.L3.2L3.2L.L.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.2L3.2L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L3.2L4.L3.2L4.L3.2L9.L2.L.L.L2.L 3.2L9.L3.5L.L4.4L.4L.L4.L4.L4.L4.L29.L3.2L2.L.L3.L5.L3.2L3.5L.L4.L3.L 15.L3.2L4.L4.L4.L4.L4.L4.4L.L4.L3.5L.L14.4L.L2.L.4L.4L.4L.L.L.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.2L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L54.4L.4L.L4.L.2L.4L.L4.L3.L5.L3.L35.L.L2.L4.L9.L3.2L9.L3. L5.L2.L.L3.2L2.L.L3.2L3.2L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.2L3.2L3.2L2.L.L2.L.L3.2L3.2L3.L5.L3.L25.L.L2.L4. 4L.L4.L3.2L2.L.L2.L.4L.L4.L3.2L2.L.4L.L4.L3.2L4.L3.2L3.2L.L.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.2L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L3.2L3. 2L3.L5.L2.L.L3.2L3.L5.L3.2L4.L19.4L.3L2.L.L2.L3.2L3.2L3.2L4.L3.2L3.2L 3.2L3.L5.4L.L.L2.L3.2L3.2L3.2L4.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3. 2L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.4L.L3.2L.L2.4L.L4.4L.L 4.4L.L4.4L.L4.L4.L9.L4.4L.4L.4L6.L3.5L.L3.2L3.2L3.5L.L3.2L.L2.L3.2L3. 2L2.L.4L.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L3.2L3.2L.L2.L4.L4.L4.L4.L 24.L.L2.L3.2L4.L3.2L4.L3.2L4.L2.L.L2.L.L2.L.L.L2.2L3.2L3.L.L2.L3.2L3. L10.L3.2L4.4L.L4.L3.L5.4L.L3.2L3.2L3.5L.L.L.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.2L2.L.L2.L.L3.2L3.2L.L2.L.L2.L4.L4.L4.4L.L4.L4.L9.L.L2.L. L2.4L.L4.L3.2L4.4L.L4.L9.L2.L.4L.2L3.L.L2.L3.2L3.L25.L3.5L.L4.4L.L2.L .4L.L2.L.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.4L.L4.L4.4L.L4.4L.L4.L4.4L.L 9.L3.2L.L2.L.L2.L3.2L2.L.L.L2.L3.2L2.L.L.L2.L3.L5.L.L2.L.L2.L3.5L.4L 6.L3.L5.L3.L10.2L.L.3L2.L.L2.L3.2L3.L40.L3.2L4.L3.2L2.L.L4.L.L.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.2L.L2.L.L2.L4.4L.L4.L4.4L.L4.4L.L4.L4.L3.2L3.5L.L3.2L.L2.L.L2.L 3.2L3.2L.L2.L3.2L3.2L.L2.L3.L5.L.L2.L.L2.L3.2L3.2L3.2L.L2.4L.L4.4L.L 4.4L11.4L.4L.4L46.L3.2L3.2L4.4L.L4.L.L2.L4.L.L.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.2L.L2.L.L2.L.L2.4L.L4.L4.4L.L4.4L.L4.L3.2L3.L5.L3.L5.L.L2.L.L2.L3. 5L.L2.L.L3.5L.L2.L.L3.L5.L.L2.L.L2.L3.2L3.5L.L4.L3.L5.L3.L5.L.L2.2L3. 2L3.L.L2.L3.2L3.L40.L2.L.4L.2L.L.2L3.L3.2L3.5L.4L.L.L.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.2L.L2.L.L2.L2.L.4L.L.L2.L2.L.4L.L2.L.4L.L3.2L3.2L3.L5.L3.L 5.L.L2.L.L2.L3.2L3.2L3.2L3.2L3.2L3.2L.L2.4L.L4.L.L2.L3.L5.L3.2L.L2.4L .L4.4L6.L2.L.4L.2L3.L.L2.L3.2L3.L40.L3.2L3.2L4.L4.4L.L9.L3.2L.L.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L.L2.L4.L.L2.L159.L.L2.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L4.L9.L.L2.L4.L.L7.4L.L4.L3.5L.L4.4L.L4.L3.2L3.L5.L3.2L.L 2.L4.L.L2.L3.5L.L3.2L3.5L.L3.2L.L2.L.L7.L.L2.L3.L5.L3.2L.L2.L3.L5.L3. L10.2L.L.3L2.L.L2.L3.2L3.L40.L3.2L4.L4.2L3.L3.2L3.5L.4L.L.L.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.5L.4L.4L.4L.4L.4L.L24.L.L2.L4.L9.L.L2.L4.L29.L.L2.L4. L59.L.L2.L.L2.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.4L.L4.4L.L4.L.L7.L2.L. 4L.L2.L.4L.L3.2L3.2L3.2L2.L.L3.2L.L2.L.L2.4L.L4.L3.2L4.L4.L3.2L4.L4.L .L2.L4.4L.4L6.L3.2L.L2.L3.2L.L2.4L.L19.4L.4L.4L26.L2.L.L2.L.L2.L.L2.L .L2.L.4L.2L3.L2.L.L2.L.L3.2L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L.L4.L 3.2L4.L3.2L4.L.L2.L3.5L.L4.4L.L4.4L6.4L.L4.4L6.4L.L4.4L.L4.4L.L4.4L6. 4L.L4.4L.L4.4L.L4.4L.L4.L4.L4.L4.L4.4L.L9.L.L2.L4.L4.L4.L4.L4.L4.L4.L 3.L5.L.L7.L.L2.L3.5L.L4.L3.5L.L9.L2.L.L3.2L3.2L3.2L.L2.4L.L4.L.L2.L3. 2L3.L5.L3.5L.L4.L4.4L.L4.L4.L3.2L2.L.L3.2L.L2.L3.2L.L2.L.L2.2L.L.2L3. 2L3.2L3.L.L2.L3.2L3.2L4.L4.L4.L4.L4.4L.L4.4L6.L2.L.4L.L2.L.L3.2L2.L.L .L2.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L4.L4.4L.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L 4.L9.L.L2.L4.L.L2.L4.L.L12.4L31.L3.5L.L4.4L.L4.4L.L4.L4.L3.L10.4L.L4. 4L.L4.L3.5L.L4.L2.L.L.L2.L.L2.L3.2L3.L10.L3.L5.L.L2.L9.L2.L.L3.2L3.2L .L2.L4.L3.2L.L2.L2.L.4L.L2.L.4L.2L3.L.L2.L3.L10.L2.L.L.L7.L2.L.4L.L.L 2.L3.2L2.L.L3.L5.L2.L.L.L2.L3.2L.L2.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.2L.L17.4L.L4.4L.L4.4L.L4.4L.L4.4L6.4L.L14.4L.L9.L.L2.L19.L3.L5.4L .L4.4L.L4.4L.L4.4L.4L.L4.L3.5L.L4.4L.L4.L.L2.4L.L4.L4.4L.L9.L3.L5.L.L 7.L.L12.L3.L5.L.L2.L4.L2.L.L3.2L3.L5.L3.2L4.L4.L.L2.L.L2.L3.2L3.L10.L 3.2L.L2.4L.L4.4L.L3.2L2.L.L3.2L.L2.L.L2.4L.L19.2L.L.3L2.L.L2.L3.L5.L 2.L.4L.4L.L2.L.4L6.4L.L3.2L3.2L2.L.4L.4L.4L.4L.4L.4L.L.L.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.2L.L57.L3.2L4.L4.L3.2L4.L4.L4.L3.2L4.4L.4L16.L3.2L4.L 39.L.L2.L4.L4.L.L2.L9.L2.L.4L.L.L7.4L.L3.L5.L3.L5.L.L7.4L.L.L2.L.L2. 4L.L4.4L.L4.4L.L4.L3.2L.2L.L.L2.L4.4L.L4.L.L2.L3.2L3.L5.L2.L.L3.5L.L. L7.L3.2L4.4L.L4.4L.L4.L3.2L.L2.4L.L19.4L.4L6.L3.2L.L2.L3.L5.L2.L.L2.L .L3.2L2.L.L3.2L3.2L.L2.L3.2L.L2.L3.2L.L2.L3.2L.L.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.2L.L2.L.L2.L4.L29.L.L2.L4.L54.L3.5L.L4.L4.L4.L4.L4.4L.L4.L4.L 4.L9.4L.L4.L.L2.L4.4L.L4.L9.4L.L9.L3.2L4.4L.4L.L4.4L.L4.L4.4L.L4.L3.L 5.L2.L.L.L2.L3.L5.L3.3L3.4L6.L3.2L4.L.L2.L3.2L3.2L4.4L.L4.4L.L2.L.L.L 12.L3.L5.L.L7.L3.2L.L2.L.L2.2L.L.2L3.2L3.2L3.L.L2.L3.L5.4L.4L.L3.2L2. L.L2.L.L2.L.L2.L.4L6.4L.4L.4L.4L.4L.4L.4L.L.L.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.2L.L2.4L6.4L.L4.4L.L4.4L.L4.4L6.4L.L4.4L.L4.4L.L4.4L.L4.4L.L4.L 4.L4.4L.L4.L4.L4.L4.L4.4L.L4.L4.L4.4L.L4.L4.L.L2.L9.L2.L.L.L2.L3.2L4. L4.L2.L.L2.L.L2.L.L2.L.L3.2L.L7.L.L7.L.L2.L9.L3.L10.L.L2.L3.L5.L3.L 15.L.L2.4L.L4.L3.5L.L4.L3.L5.L3.2L4.4L.L4.L4.4L.L4.4L.L4.4L.L4.L2.L. 4L.L2.L.4L.2L3.L.L2.L3.L5.L3.2L2.L.L2.L.L3.2L2.L.L.L2.L2.L.4L.L.L2.L 3.2L2.L.L3.2L2.L.L3.2L.L2.L3.2L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L 4.4L.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.4L.L 4.L4.L4.L4.L4.4L.L4.L4.L4.L3.2L4.L4.4L.L4.4L.L4.4L.L4.L4.L4.4L.L4.L4. L4.L4.4L.L4.4L.L4.4L.L4.4L.4L.L4.4L.L4.L4.L.2L.4L.L4.L4.L4.L4.L3.2L9. L3.2L3.2L3.5L.L2.L.L2.L.L.L12.L2.L.L2.L.L.L7.L3.L20.2L.L.3L2.L.L2.L3. L5.L3.2L2.L.L2.L.L2.L.L3.2L2.L.4L6.4L.4L6.L2.L.L2.L.L.L2.L2.L.4L.L.L. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L32.4L.L4.4L6.4L.L4.4L.L4.4L.4L6.4L.L 4.4L.L4.4L6.4L.L4.4L.L4.4L6.4L.L4.4L.L4.L4.L4.L9.L.L7.L.L17.L3.2L.L2. L4.L9.L.L7.L.L7.L.L7.L3.2L2.L.L.L2.L2.L.L.L2.L3.L5.L3.2L2.L.L.L17.L3. 4L2.4L.4L.L4.L3.2L4.L4.4L.L4.L4.L4.L4.4L.L4.L3.2L4.4L.L4.L14.4L.4L.4L .L3.2L3.2L.L2.L14.4L.L4.L2.L.L3.2L2.L.L3.4L2.4L.3L7.L.L.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.2L.L42.L3.2L4.L19.L3.2L3.2L4.L19.L3.2L4.L19.L3.2L4.L 9.4L.L4.L4.L4.L4.L4.4L.L4.4L.L4.L4.L4.L3.5L.L.L2.L3.5L.4L.L2.L.4L.L.L 2.L.L7.L3.L5.L.L7.L.L2.L3.L5.4L.4L.4L16.4L.L4.L3.L5.L3.L5.L2.L.L2.L.L .L17.L.L2.L4.L3.2L3.L5.L.L12.2L3.2L3.L.L2.L3.2L3.2L2.L.4L.4L.4L.4L.L 4.L.L2.L3.2L4.L4.4L.3L2.3L2.3L2.3L7.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.2L.L2.L74.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L9.L .L2.L4.L4.L4.L.L7.L.L12.L3.2L4.L4.L.L7.L3.2L2.L.L.L2.L.L2.L.L2.L.L7.L 3.2L.L2.4L6.L.L2.L3.L5.L3.2L3.2L2.L.L2.L.L2.L.L2.L.4L.L3.2L3.2L4.4L.L 4.4L.L4.4L.L4.L4.L4.4L.L4.L3.2L3.L5.L2.L.L2.L.L2.L.4L.2L3.L.L2.L3.2L 3.2L3.5L.L4.L3.2L4.L3.5L.L.L12.L3.L25.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.2L.L2.L.L2.L4.L4.L4.L4.4L.L4.L4.4L.L4.L4.L4.4L.L4.L4.4L.L4.L4.L 4.L4.4L.L4.L4.L4.L4.4L.L4.L4.L4.L4.L4.L4.L4.L4.4L.L.L7.L3.5L.L4.4L.L 4.L4.L4.L4.L4.4L.L4.4L.L4.4L.L4.L.L2.L.L7.L3.2L2.L.4L.L.L2.L.L2.L3.L 5.L3.2L3.2L.L2.L4.L.L2.L24.L3.L15.L2.L.L2.L.L2.L.L.L2.L.L2.L3.2L3.2L 3.2L4.L14.2L.L.3L2.L.L2.L3.2L3.L5.L2.L.L.L2.L4.L4.L4.L4.L4.L4.L4.L4.L 4.L4.L4.L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.5L.4L.4L.4L.L4.4L6. L.L2.4L6.4L.L4.4L6.L.L2.4L6.4L.L4.4L.4L6.4L.L4.L.L2.4L6.4L.L4.4L.L9. 4L.L4.L3.2L4.L4.4L.L4.L.L7.L.L12.L.L2.L4.L4.L4.L2.L.L3.L5.L.L7.L.L2.L .L7.L3.2L.L2.4L.L4.L.L2.L3.L5.4L.4L.4L.4L.4L.4L.4L.L14.4L.L4.L.2L.4L. L4.L4.L4.4L.L4.L3.2L3.5L.L4.4L.L4.L4.L9.4L.4L.4L6.L.L2.L4.L2.L.L3.L 35.L.L2.4L.L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L.L2.L3.2L 9.L3.2L4.L4.L3.2L4.L9.L3.2L4.L4.L3.2L4.L9.L3.2L3.2L4.L4.L3.2L.L2.L3. 2L4.L14.L3.5L.L4.L3.L10.L3.2L4.L3.5L.L4.4L.L4.L.L2.4L.L4.L9.L3.2L9.4L .L.L2.L.L2.L.L7.L3.2L2.L.4L.L.L2.L.L2.L3.L5.L3.2L3.2L4.L3.2L4.L3.2L4. L3.L10.L3.L30.L.L7.L3.2L4.L3.2L4.L.L17.2L3.L.L2.L3.2L3.L5.L.L7.4L.L4. 4L.L4.4L.L4.4L.L4.4L.L4.L3.L10.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L. L2.L.L2.L3.L80.L3.L5.L.L2.L4.L3.2L4.L.L2.L4.L.L2.L9.L.L2.4L.L4.L3.2L 4.L4.L4.L4.L4.L4.L.L2.L4.L3.2L.L2.L.L2.L2.L.4L6.L2.L.L3.2L.L2.4L.L4.L .L2.L.L7.L3.2L.L2.4L.L4.L.L2.L3.L5.L3.2L2.L.L.L2.L2.L.L.L2.L2.L.L.L2. L3.L10.L3.2L24.L2.L.4L.L2.L.L.L2.L3.2L4.L3.2L2.L.L2.L.L2.L.4L.2L3.L.L 2.L3.2L3.L5.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L6.L3.L10.L.L.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L.L2.L3.2L4.L4.L4.L4.L4.L4.L4.L4. L4.4L.L4.L4.4L.L4.L4.L4.L3.2L4.L4.L3.2L4.L4.L4.L3.2L4.L3.5L.L9.4L.L4. L4.L4.L4.L4.L4.L4.4L.L4.L3.2L.L2.L.L2.L3.5L.L4.L3.2L4.L2.L.4L.L.L2.L. L2.L.L7.L3.2L2.L.4L.L.L2.L.L2.L3.L5.4L.4L.4L.4L.4L.4L.4L.L3.L5.L2.L.L 2.L.4L.L.L2.L2.L.L2.L.L2.L.L3.2L.L2.L4.L.L7.L3.2L3.2L14.2L.L.3L2.L.L 2.L3.2L3.L5.3L7.3L7.3L7.3L7.3L7.3L7.L3.2L9.L.L.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.5L.4L.4L6.L.L2.L4.L3.2L.L2.4L6.L.L2.4L6.L.L2.4L6.4L.L4.L3. 2L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.4L.L4.L4.L4.L4.L4.L.L2.L4.L4. L3.2L3.2L4.L.L7.4L.L3.2L2.L.L3.2L.L2.4L.L4.L.L2.L2.L.L.L2.L3.2L.L2.4L .L4.L.L2.L3.L5.L3.2L3.2L2.L.L3.2L2.L.L3.L5.L2.L.L2.L.4L6.L.L2.L2.L.4L 6.L.2L.L.L2.4L.4L.4L.L.L2.L3.2L4.4L.L19.4L.4L.4L11.4L6.4L6.4L6.4L6.4L 6.4L.L4.L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.4L2.L.2L.L. 2L.L.L2.L3.2L4.4L.4L.L3.2L.L2.L3.L5.L.L2.L3.2L4.L4.L3.2L4.L4.L3.5L.4L .L4.4L.L4.4L6.4L.L9.4L6.4L.L9.4L.L4.4L6.L3.2L4.L.L2.L4.4L.L9.L.L7.L3. L5.L3.2L4.L14.4L6.L.L2.L3.2L2.L.4L.L.L2.L.L2.L3.L5.L3.2L3.2L.L2.L4.L. L2.L9.L3.2L2.L.4L.L2.L.4L.L.L12.4L.L4.L.L2.L3.5L.4L11.L.L2.2L.L.2L3. 2L3.2L3.L.L2.L3.2L3.L5.4L6.4L6.4L6.4L6.4L6.4L6.4L.L3.L5.L.L.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L.L2.L4.L4.L19.L3.2L4.4L.4L.L4.4L36. L3.2L.L17.L3.5L.L4.L3.2L4.L3.2L4.L4.L3.2L4.L9.L3.2L4.L4.L4.L9.L3.2L3. 2L4.4L.L4.4L.L4.L4.L4.L4.L4.L4.L9.L.L2.L3.2L4.4L.L4.L.L2.L3.L5.4L.4L. 4L.4L.4L.4L.L4.L3.2L3.2L.L7.L.L2.L2.L.4L6.L.2L.L2.L.4L.L.L2.L3.2L2.L. L.L7.L2.L.4L.L2.L.4L.2L3.L3.2L3.2L3.L5.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L. L2.L.L2.L.L2.L.L2.L.L.L7.L3.2L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L 3.2L39.4L.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.4L.L4.L4.L9.L3.2L4.L 4.L4.L4.L4.L4.L4.L4.L4.L.L2.L14.L.L2.L3.L5.L3.2L3.2L4.L3.2L9.L3.2L3. 2L3.2L.L7.L.L7.L2.L.L2.L.L2.L.L3.2L.L2.L2.L.4L.L.L2.L.L22.L2.L.L2.L.L 2.L.L3.2L3.2L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L4.L9.L3.2L3.L5.L.L.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L .L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2. L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.4L.L2.L.L2.L.L2.L.L2.L.L2.L .L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L.L2.L3.2L4.L4.L4.L4.L4.L4.L4.L4. L4.L4.L4.L4.L4.L4.L4.L3.2L4.L4.L4.L3.L5.L3.L5.L2.L.L2.L.L2.L.L2.L.L3. 2L3.2L3.2L.L2.L2.L.4L.L2.L.L2.L.L2.L.L2.L.L2.L.4L.L2.L.L3.2L.L2.L2.L. L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L .L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L3.2L3.L5.L.L.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L2.L.L 2.L.L2.L.L2.L.L.L2.L2.L.L2.L.L.L7.L2.L.L2.L.L.L7.L2.L.L2.L.L2.L.L2.L. L2.L.L2.L.L2.L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L3.2L3.2L.L2.L 3.2L2.L.L2.L.4L.L4.L.2L.L.2L.L.L12.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L .L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2.L.L2. L.L2.L.L2.L.L2.L.L2.L.L3.L5.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.2L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L6.L2. L.L2.L.L2.L.L.L2.L2.L.L.L12.L3.L15.L3.L5.L3.2L2.L.L3.2L2.L.4L.L2.L.L 2.L.4L.L4.L.2L.4L.L149.L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L 2.3L2.3L2.3L2.2L2.L.L2.L.4L.L2.L.4L6.4L.L.L2.L2.L.L2.L.4L.L2.L.4L.L2. L.4L.L2.L.4L.2L.L.4L.L2.L.L2.L.L2.L.4L.L2.L.4L.L3.L10.L3.2L4.L4.L169. L.L.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2. 3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.3L2.2L2.L.L2.L.L3.2L2.L.L2.L. L2.L.4L.L2.L.4L.L2.L.4L.L2.L.4L.L2.L.L3.L25.L3.3L2.2L204.L.L.3L.2L$. 2J23KLJKpA5KpAKL3J4K.J.J3IJ15IJL12KpA29K$.J25K2.L2QIpA2KJL2JpAKpAKpAK pAKpA8K.L2K.L2KL4K$29.IpAQIpA2KpAKJKJ.J3.J2.LKL3K.pAKpAKpAKpAKpAK$33. 3IJ2.JpAKpA3KpASpAKpAKpAKpA2KLpA.pAKpA2K$40.N5.JKpAKpAKpAKpA3KJ2K! golly-2.5-src/Patterns/JvN/construction-arm-demo.rle0000644000175100001440000001251512156145314017451 00000000000000# Construction-arm demo. # Author: Renato Nobili # # Controls are provided to direct the construction arm (c-arm). Use # the edit bar and the pencil tool to draw a right-directed excited # ordinary tranmission state (OTS, green arrow, 13) at the start of # one of the 14 input lines on the left. Set the machine running at # a slow speed to see it working. # # The first 9 inputs pass the pulse through quiescent cell coders # (QCC) before passing along the special transmission states (STS, red # arrows) of the c-arm. At the end the quiescent cell specified is # written. Immediately after writing, a sequence of pulses is sent to # retract the c-arm by one cell, to allow the next cell to be written. # # The next 4 inputs below allow the c-arm to be moved around in the # directions shown. The pulse passes through various coders that send # a choreographed sequence of instructions down both wires of the # c-arm. You will discover that the c-arm can be broken by moving it # down or left without having previously moved it up or right, # respectively. # # The final input inserts an activation pulse (AP) - an excited pulse # that enters the configuration you have constructed. This is used in # self-replication for triggering the new copy into life. If there is # no cell immediately above the final STS (red arrow) then the pulse # causes a right-directed OTS (blue arrow) to be written. # # The construction arm is designed to be capable of writing any pattern # of quiescent (non-active) cells, and of inserting one or more # activation pulses. This functionality is used to allow a suitably # designed machine to construct a working copy of itself - see for # example NP-replicator.rle. # # Although this demonstration uses the extended von Neumann rules, the # construction arm in von Neumann's original design works in the same # way, having both an STS line and an OTS line. # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata # # Originally distributed as: C-ARM_CONTROLS.EVN # Redistributed with permission. # x = 96, y = 110, rule = Nobili32 21.2pA6.2pA2.3pA2.pA3.pA7.2pA2.2pA2.pA2.pA.3pA.3pA3.2pA2.pA4.3pA$20.pA 7.pA2.pA.pA2.pA.2pA.2pA6.pA3.pA2.pA.2pA.pA2.pA2.pA2.pA.pA2.pA.pA3.pA$ 20.pA7.pA2.pA.pA2.pA.pA.pA.pA6.pA3.pA2.pA.pA.2pA2.pA2.pA2.pA.pA2.pA.pA 3.pA$20.pA3.3pA.4pA.3pA2.pA3.pA6.pA3.pA2.pA.pA2.pA2.pA2.3pA2.pA2.pA.pA 4.2pA$20.pA7.pA2.pA.2pA3.pA3.pA6.pA3.pA2.pA.pA2.pA2.pA2.2pA3.pA2.pA.pA 6.pA$20.pA7.pA2.pA.pA.pA2.pA3.pA6.pA3.pA2.pA.pA2.pA2.pA2.pA.pA2.pA2.pA .pA6.pA$21.2pA5.pA2.pA.pA2.pA.pA3.pA7.2pA2.2pA2.pA2.pA2.pA2.pA2.pA2. 2pA2.3pA.3pA10$4.2pA3.2pA2.2pA$3.pA2.pA.pA3.pA$3.pA2.pA.pA3.pA$3.pA2. pA.pA3.pA$4.3pA2.2pA2.2pA33.2IL.IpA2IpALIpAL$7.pA40.J.pAIpA.L2KIJ.pAI pA$43.5IpA5IpA8IL$43.JpAIpA.2JpAIpA.2IpAIpA4.L$pA.4IpAIpAIpAIpA4IL19. 7IJ.2IpAIJ12.L$6.9IL.L19.J25.L$15.L.L19.J6.pA2IL15.L$6.9IpAIL19.J6.J. LpALIpAL11.L$6.J2.2IL3.L.L19.J.5IpA.2LpAJ.IpAIpA8.L$Q.4IpA2IpA.pAIpA. L.L19.J.J4.L.17IL$9.IpA4IL.L19.J.J4.2IpAIpA14.L$15.L.L19.J.J14.3IL5.L $6.9IpAIL19.J.J4.10IpA2.pAL4.L$6.J6.I2L.L19.J.J4.J9KIpAI2pAIpAIpAL$S. 4IpA2IpAIpAIJ2L.L19.J.J.12IpA9IL$9.6IL.L19.J.J.JpAIpA.JpAIpALJKJ9.L$ 15.L.L19.J.J2.J.3IJ2.2IpAJ9.L$6.9IpAIL19.J.J2.J20.L$6.J8.L.L3.16IpAIpA 2IpA5IpA2IpAIL9.L$T.4IpA2IpAIpAIpA.L.L3.J15.J.J2.J5.L2.2LpAIpA2L5.L$ 9.6IL.L3.J15.J.J2.J5.L.LK4IpA6IL21.11Q$15.L.L3.J15.J.J2.J5.L.2IpAIpA. LJpAIpA2.L21.R9IJ$6.9IpAIL3.J15.J.J2.J5.L7.pAIJ4.L21.RJ$6.J8.L.L3.J 15.J.J2.J5.L14.pA21.RJ$R.4IpA2IpAIpA3.2IpA3IpA15IpAIpA2IpA5IpA13IpA 22QRJ$9.6IJ.L3.J15.J.J2.J5.L.6ILILILJ.23IJ$6.9IpAIL3.J15.J.J2.J5.L.JK pAIpAJLJLJLJ.J$6.J8.J.L3.J15.J.J2.J5.L3.J.IJIJIJIJ.J$6.J2.2IpA3.J.L3. J8.7IpAIpA2IpA5IpA3IpAIL.7IJ$J.4IpA2IpA.IpA2.J.L3.J8.J6.J.J2.J5.L3.pA KpA.pAIpA4.J11.2pA4.pA2.2pA2.pA3.pA$9.6IJ.L3.J8.J6.J.J2.J5.L3.4IJ6.J 10.pA5.pA.pA.pA.pA.2pA.2pA$15.J.L3.J8.J6.J.J2.J5.L7.IL5.J10.pA2.2pA.pA .pA.pA.pA.pA.pA.pA$6.9IpAIL3.J8.J6.J.J2.J5.L7.JIpAIpA2.J10.pA5.3pA.2pA 2.pA3.pA$6.J2.2IL3.J.4IpA8IpA6IpAIpA2IpA5.L3.4IpA6IJ11.2pA3.pA.pA.pA. pA.pA3.pA$K.4IpA2IpA.pA3.J.J3.J8.J6.J.J2.L5.4IpAIpA.2JpAIpA2.J$9.6IJ. J3.J8.J6.J.J2.L11.2IpAIJ4.J$15.J.J3.J8.J6.J.J2.L2.8IL9.J$6.9IpAIJ3.J 2.6IpA6IpA.J2.L2.J5K.LK9.J$6.J2.2IL3.J.J3.J2.J5.J6.L.J2.L2.5IpAIpA10I J$L.4IpA2IpA.L3.J.J3.J2.J5.J6.L.J2.L2.2JpA2IJ.IpAIpA2.pAKpAIpAJ$9.6IJ .J3.J2.J5.J6.L.J2.L2.JpAJ7.IpAIpAIJ.IJ$15.J.J3.J2.J2.3IpA6IpAIpA2.4IJ 16.J$15.J.J3.J2.J2.J2.J6.L.L9.2IpA2IpAIL6.J$6.9IpAIJ3.J2.J2.J2.J6.L.L 8.IpAL3.L.L.IL3.J$6.J8.J.J3.J2.J2.J2.J6.L.7IpAIpA.pAIpA.L.pAIpAL3.J$I .4IpA8IJ.J3.J2.J2.J2.J6.L8.8IpA8IJ$17.J3.J2.J2.J2.J6.L16.L.pAIpAIpA2. J$17.J3.J2.J2.J2.J6.L16.pAIJ6.J$17.J3.J2.J2.J2.J6.L25.J$17.J3.J2.J2.J 2.J6.L25IJ$17.J3.J2.J2.J2.J6.IpAIpA.JpAIpAJ3.pAI2pAIpA.pAKpA3K$17.J3. J2.J2.J2.J9.3IJ.IpAIpAIJ2.J.LIpA2.pAKpA$17.J3.J2.J2.J2.J17.5IpA.IJ3IpA IJ$6.pA10.J3.J2.J2.J2.J$5.2pA10.J3.J2.J2.J2.J$4.6pA.6IJ3.J2.J2.J2.J$ 5.2pA14.J2.J2.J2.J$6.pA14.J2.J2.J2.J$21.J2.J2.J2.J$21.J2.J2.J2.J$21.J 2.J2.J2.J$6.pA14.J2.J2.J2.J$6.2pA13.J2.J2.J2.J$3.6pA2.10IJ2.J2.J2.J$ 6.2pA16.J2.J2.J$6.pA17.J2.J2.J$24.J2.J2.J$24.J2.J2.J$6.pA17.J2.J2.J$ 6.pA17.J2.J2.J$6.pA17.J2.J2.J$4.5pA2.13IJ2.J2.J$5.3pA19.J2.J$6.pA20.J 2.J$27.J2.J$27.J2.J$6.pA20.J2.J$5.3pA19.J2.J$4.5pA18.J2.J$6.pA4.16IJ 2.J$6.pA23.J$6.pA23.J$30.J$30.J$30.J$4.pA2.2pA21.J$3.pA.pA.pA.pA20.J$ 3.pA.pA.pA.pA.19IJ$3.3pA.2pA$3.pA.pA.pA! golly-2.5-src/Patterns/JvN/counter-demo.rle0000644000175100001440000000336212156145314015621 00000000000000# Counter demo. # Author: Renato Nobili # # After 10 input pulses are seen on the input line (IN), a single output # pulse is sent (OUT) and the counter resets. Set the machine running at # a slow speed to see it working. # # Note that this counter only works for well-separated pulses. If pulses # arrive with less than 32 quiescent cells between them then the counter # may break or miscount. # # After ten pulses, the output pulse is duplicated and sent to the special # transmission states (STS) under the wire. These annihilate the section # of OTS wire above, causing the gap to be restored and the counter to be # reset to zero. # # Counters for other values can be made in a similar fashion. Counters for # large values can be made by chaining counters together. # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata # # Originally distributed as: SIMPLE_COUNTERS.EVN # Redistributed with permission. # x = 60, y = 26, rule = JvN29 5.2pA.pA.pA3.pA.2pA2.pA3.3pA4.2pA2.2pA2.pA2.pA.pA2.pA.3pA.3pA.2pA$4.pA 3.pA.2pA.2pA.pA.pA.pA3.pA5.pA3.pA2.pA.pA2.pA.2pA.pA2.pA2.pA3.pA.pA$5. pA2.pA.pA.pA.pA.pA.pA.pA3.2pA4.pA3.pA2.pA.pA2.pA.pA.2pA2.pA2.2pA2.pA. pA$6.pA.pA.pA3.pA.2pA2.pA3.pA5.pA3.pA2.pA.pA2.pA.pA2.pA2.pA2.pA3.2pA$ 4.2pA2.pA.pA3.pA.pA3.3pA.3pA4.2pA2.2pA3.2pA2.pA2.pA2.pA2.3pA.pA.pA7$ 17.pA.pA2.pA25.2pA2.pA2.pA.3pA$17.pA.2pA.pA24.pA2.pA.pA2.pA2.pA$17.pA .pA.2pA24.pA2.pA.pA2.pA2.pA$17.pA.pA2.pA25.2pA3.2pA3.pA3$10IpA22I9.IpA 14I$J9.L22.9R.L$J9.L22.RpA2RpA2RpAR.L$J9.L23.J2.J2.J2.L$J9.L23.J2KpA 2KpA3K10.pA2.pA$J9.L42.2pA.pA.pA$N9.L43.pA.pA.pA$J9.L43.pA.pA.pA$J10K 43.pA2.pA! golly-2.5-src/Patterns/JvN/golly-constructor.rle0000644000175100001440000000600512156145314016726 00000000000000# A simple tape that constructs the Golly logo. # Author: Tim Hutton # # Uses the Hutton32 rule, a modification of von Neumann's CA. Under # this rule, a simple tape with pulses can construct any pattern of # quiescent cells. # x = 131, y = 33, rule = Hutton32 MIMIM4IMI4MI4MI4MI4MI4MI4MI4MIMI4MIM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM IM3IM2IMIN$N2OKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K4OKO4K OKO4KOKO4KOKO4KOKO4KOKO$MI4MIMI4MIMIM4IMI4M5IM5IM5IM5IM5IM5IM5IM5IM5I M5IMIM3IM5IMI4MIMI4MIMIM4IMI4MIM3IJ$J4OKOK4OKOK4OK4OKO4KOKOK4OKOK4OKO 5KO3KOKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K4OKO4KOKO$M5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IMIM3IM5IMI4MIMI4MIMIM4IMI4MI4MIMIM4IMI4MI4MIMI4MJ$N2OKO4KOKOK 4OKOK4OK4OKO4KOKOK4OK4OKO4KOKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO5KO 5KO$M5IM5IM5IM5IM5IM5IMIM3IM5IMI4MIMI4MIMIM4IMI4MIM4IMIM4IMI4MI4MIMIM 4IMIM4IMI4M5IM4IJ$J4KO5KO5K4OKO4KOKOK4OK4OK4OK4OKO4KOKOK4OKOK4OKOK4OK O5KO3KOKOK4OKO5KO3KOKO5KO5KO5KO2K$M5IM5IM5IM5IM5IM5IM5IM5IM5IMIM3IM5I MI4MIMI4MIMI4MIMIMI2MIMIMI2MIMIMI2MIMIMI2MIM5IM5IM2IJ$J4KOK2OKOKOK2OK OKOK4OK3O2KOKOK4OKOK4OKOK4OKOK4OK2O3KOKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5K O5KO5KO$5IMIM3IM5IMI4MIMI4MIMIM3I2MI4MIMI4MIMI4MIMI4MIMIM2I3MI4MIMI4M IMI4MIMIM2I3M5IM5IM5IM5IM4IJ$N5KO5KO5KO5KO5KO5KO5KO5KO5KO5K3O2KOKOK4O KOK4OKOK4OKOK4OK4OK4OKOK4OKOK4OKOK4OKOK3O$2MIMI4MIMI4MIMI4MI4MIMI4MIM IM2I3M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIM3IM5IMI4MIMIN$NOKOK4OKOK2OKO KOK2OKOKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K3O2KOKOK4O KO$5IM5IM5IM5IM5IM5IM5IM5IM5IMIM3IM5IMI4MIMIM3I2MI4MIMI4MIMI4MI4MIMI 4MIMI4MIMI4MI4MJ$N5K2OKOKOK2OKOKOKOK4OKOK4OKOK4OKOK4OK4OKOK4OKOK4OK2O 3KOKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KOK$3M5IM5IM5IM5IM5IM5IM5IM5IM5IM5I MIM3IM5IMI4MIMIM3I2MI4MIMI4MIMI4MIMI4MIMI4MI4M3IJ$JKOKOK4OKOK4OKOK4OK OK4OK2O3KOKOK4OKOK4OKOK4OK2O3KOKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO5KO2K $2IM5IM5IM5IM5IMIM3IM5IMI4MIMI4MIMIMIMI2MIMIMI2MI4MIMIM3I2MI4MIMI4MIM I4MIMI4MIMIM2I3M5IM5IM2IJ$J2KO5KO5KO5KO5K2OKOKOK2OKOKOK2OKOKOK2OKOKOK OK4OKOK4OKOK4OKOK4OKOK4OKOK4OKO5KO3KOKOK4OKO5KO3KOKO2K$MIM3IM5IMI4MIM I4MIMIM4IMI4MI4MI4MI4MI4MI4MI4MI4M5IM5IM5IM5IM5IM5IM5IM5IM5IM2IJ$J4KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO4KOKO4KOKO4KOKO4KOKO4KOKO4KOKO4KOK4OKO4KOK OK4OKOK2O$3IMIM3IM5IMI4MIMI4MIMIM4IMI4M5IM5IM5IMIM3IM5IMI4MIMI4MIMIM 4IMI4M5IM5IM5IMIM3IM5IMIMN$JKO5KO5K4OKO4KOKOK4OKOK4OKO5KO3KOKOK4OKO5K O3KOKO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K$3IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIM 3IM5IMI4MIMI4MIMIM4IMI4MI4MI4MI4MI4MI4MI4MI3MN$JKO4KOKO4KOKO4KOKO4KOK O4KOKO4KOKO4KOK4OKO4KOKOK4OKOK4OKO5KO3KOKO5KO5KO5K4OKO4KOKOK4OKOK3O$ 4IMIM3IM5IMI4MIMI4MIMIM4IMI4M5IM5IM5IMIM3IM5IMI4MIMI4MIMIM4IMI4M5IM5I M5IMIM3IM5IMIN$JO5KO5KO5KO5KO5KO5KO5KO5KO5K4OK4OK4OK4OKOK4OKOK4OKOK4O KOK4OKOK4OKOK4OKOK4OKO5KO$3MIMI4MIMI4MIMI4MIMIM4IMI4MIM4IMIM4IMIM4IMI M4IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IMIM2IJ$NKOK4OKO5KO3KOKO5KO5KO5KO5KO 5KO5K4OK4OK4OK4OK4OKOK4OKOK4OKO5KO3KOKO5KO5KO5KO4K$4IM5IM5IM5IM5IM5IM 5IM5IM5IM5IMIM3IM5IMI4MIMI4MIMIM4IMIM4IMIM4IMIM4IMI4M5IM5IMJ$J4OK4OK 4OK4OKO4KOKO4KOKOK4OKOK4OKOK4OKOK4OKOK4OKO5KO3KOKO5KO5KO5KO5KO5KO5KO 5KO5KO$50.I4MIMI4MIMI4MIMI4MIMI4MIMI4MIMIM4IMIM4IMIM4IMIM4IM5IM4IJ! golly-2.5-src/Patterns/JvN/Hutton-replicator.rle0000644000175100001440000002424112156145314016642 00000000000000# Hutton-replicator - a self-reproducing machine in a modified version # of von Neumann's cellular automaton. # Author: Tim Hutton # # Having modified the von Neumann CA transition rules, a new form of # self-replicator becomes possible, one that replicates much faster # and exhibits exponential growth in the initial stages. # # Motivation: In the original von Neumann transition rules, lines of # transmission states can extend themselves by writing out binary # signal trains, e.g. 10000 for extend with a right-directed ordinary # transmission state (OTS). But for construction, a dual-stranded # construction arm (c-arm) is needed, simply because the arm must be # retracted after each write. I noticed that there was room to add the # needed write-and-retract operation by modifying the transition rules # slightly. This allows the machine to be greatly reduced in size and # speed of replication. # # Another modification was made when it was noticed that the # construction could be made rotationally invariant simply by basing # the orientation of the written cell on the orientation of the one # writing it. Instead of "write an up arrow" we have "turn left". This # allows us to spawn offspring in different directions and to fill up # the space with more and more copies in a manner inspired by # Langton's Loops. # # A single OTS line can now act as a c-arm in any direction. Below are # the signal trains: # # 100000 : move forward (write an OTS arrow in the same direction) # 100010 : turn left # 10100 : turn right # 100001 : write a forward-directed OTS and retract # 100011 : write a left-directed OTS and retract # 10011 : write a reverse-directed OTS and retract # 10101 : write a right-directed OTS and retract # 101101 : write a forward-directed STS and retract # 110001 : write a left-directed STS and retract # 110101 : write a reverse-directed STS and retract # 111001 : write a right-directed STS and retract # 1111 : write a confluent state and retract # 101111 : retract # # Achieving these features without adding new states required making # some slight changes elsewhere, though hopefully these don't affect # the computation- or construction-universality of the CA. The most # important effects are listed here: # # 1) OTS's cannot destroy special transmission states (STS's). This # functionality was used in von Neumann's construction and read- # write arms but isn't needed for the logic organs, as far as I # know. The opposite operation is still enabled. # 2) STS lines can only construct one cell type: an OTS in the forward # direction. Some logic organs will need to be redesigned. # # Under this modified JvN rule, a self-replicator can be much smaller, # consisting only of a tape contained within a repeater-emitter loop. # One early example consisted of 5521 cells in total, and replicates # in 44,201 timesteps, compared with 8 billion timesteps for the # smallest known JvN-32 replicator. This became possible because the # construction process runs at the same speed as a moving signal, # allowing the tape to be simply stored in a repeater-emitter loop. # The machine simply creates a loop of the right size (by counting # tape circuits) before allowing the tape contents to fill up their # new home. # # The rotational invariance allows the machine to make multiple copies # oriented in different directions. The population growth starts off # as exponential but soons slows down as the long tapes obstruct the # new copies. # # Some context for these modifications to von Neumann's rule table: # Codd simplified vN's CA to a rotationally-invariant 8 states. # Langton modified this to make a self-replicating repeater-emitter, # his 'loops'. Other loops were made by Sayama, Perrier, Tempesti, # Byl, Chou-Reggia, and others. So there are other CA derived from # vN's that support faster replication than that achieveable here, and # some of them retain the computation- and construction-universality # that von Neumann was considering. Our modifications are mostly a # historical exploration of the possibility space around vN's CA, to # explore the questions of why he made the design decisions he did. # In particular, why didn't von Neumann design for a tape loop stored # within a repeater-emitter? It would have made his machine much # simpler from the beginning. Why didn't he consider write-and- # retraction instead of designing a complicated c-arm procedure? Of # course this is far from criticism of vN - his untimely death # interrupted his work in this area. # # Some details of the modifications are given below: # # The transition rules are as in Nobili32 (or JvN29), except the # following: # 1) The end of an OTS wire, when writing a new cell, adopts one of # two states: excited OTS and excited STS, standing for bits 1 and # 0 respectively. After writing the cell reverts to being an OTS. # 2) A sensitized cell that is about to revert to an arrow bases its # direction upon that of the excited arrow that is pointing to it. # 3) A TS 'c', with a sensitized state 's' on its output that will # become an OTS next (based on the state of 'c'), reverts to the # ground state if any of 'c's input is 1, else it quiesces. # 4) A TS 'c', with a sensitized state 's' on its output that will # become a confluent state next (based on the state of 'c'), # reverts to the first sensitized state S is any of 'c's input is # one, else it reverts to the ground state. # 5) A TS 'c', with an STS on its output, reverts to the ground state # if any of 'c's input is 1. # # The body of the machine looks fiddly but it only does these things: # 1) detect a unique mark on the tape as it goes round # 2) starts and stops a 6-period pulser # 3) codes for: extend, turn left, turn left, extend some more # 4) counts when 3 tape marks have gone past, and switches coder # 5) when finished writing an empty tape of the right length, # divert the tape to copy itself into the new holder # 6) after the tape is copied across, it separates itself from its # old tape to prevent infection spreading from multiple copies. # x = 3129, y = 4, rule = Hutton32 2.J$2.J$2KpAOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO3KOKO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKO2KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKO4KOK4OKO 4KOKO4KOKO4KOKO4KOKO4KOKO4KOKO4KOKO4KOKOK4OKOK4OK2OKOKOK3O2KOKOK4OKOK 4OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KOKOKOKOK4OKOKOKOKOK4OKOK4OKOK4OKO3K2OKOK4OKO2K2OKO2K 2OKO3K2OKOKOKOKO4KOK4OK3O2KOKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K4OKO4KOKOK4OK 4OKOK4OKOKOKOKO4KOKO3K2OKOK4OKO3K2OKO4KOKO4KOKO4KOKO2K2OKO3K2OKOK2OKO KOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5K O5KO5KO5KO5KO5KO5KO5KO5KO5KO2K2OK4OKO4KOKOK2OKOK4OKO4KOKO3K2OK4OKO4KO KO4KOKOK4OKOK4OKOK4OKOK4OKO3K2OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK4OKOK O2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOK 4OKOK4OKOKOKOKOK4OKOK4OKO3K2OKOK4OK4OKOK4OKOK4OKOK4OKO4KOK4OKO4KOK4OK O4KOKO4KOKO4KOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KOKOKOKOK4OKOKOKOKOKOKOKOK2OKOKOK2OKOK4OKOK4OKOKOKOK 2O3KOK2O3KOK2O3KOKO3K2OKOKOKOKOK4OKO3K2OKOK4OKOK4OKOK4OKO3K2OKOK4OKOK O2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOK 4OKOKOKOKOKOKOKOK4OK2O3KOKO3K2OKOK4OKOKOKOK2O3KOK4OK2O3KOKO3K2OKOKOKO KOK4OK4OKO4KOK4OKO4KOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOK4OKO2K2OK4OKOKOKOK2O3KOK4OKOKOKOKO2K2O KO2K2OKO3K2OKO2K2OKO3K2OKOKOKOKOK4OKO3K2OKOK4OKOK4OKOK4OKO3K2OKOK4OKO KO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOK 4OKOK4OKOKOKOKOKOKOKOK4OKO3K2OKO2K2OKO2K2OKO2K2OKO2K2OKO3K2OKOKOKOKO 4KOKOK4OK4OKO4KOKO4KOKOKOKOK4OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KO5KO5KO5KO5KO5KO5KO5KO5KO5KOKOKOKOKOKOKO4KOKO4KOKOKOKOKOK4OKO3K2OKO K4OKOK4OKOK4OKOK4OKOKOKOKO3K2OKOK2OKOKOK4OKO3K2OKOK4OKO3K2OKO4KOKO3K 2OKOK4OKOKO2KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO5KO 5KOKOKOKO2K2OKO2K2OKOKOKOKO2K2OKO2K2OK4OKO2K$2.94I5M2IMIMIM4IMIM4IMIM 4IMI2M3IM5IM5IM5IM2IMIMI4MIMI4MIMI4MIMI4MIMI2M3IM5IM5IM5IM2IMIMI4MIMI M3I2MI4MI2M2IMI4MI2M2IMI2M2IMI2M2IMI2M2IMI2M2IM5IM5IM5IM5IM5IM5IM5IM 5IM2IMIMI4MIMIMI2MIMIMI2MIMI2M3IMI2M2IMI4MIMI4MIMI4MIMI4MIMIMIMIM5IM 5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMI2M3IMI4MI2M2IMI2M2IMI2M2IMI2M2IM I2M2IMI4MI2M2IMI2M2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMIM3I2MI 4MI2M3IMI4MIMI4MIMI4MIMI4MIMI4MIMIMIMIMI4MIMIMIMIMI4MIMIM4IMIM4IMIM4I MIM4IMIM4IMIM4IMIM4IMIM4IMIM4IMIM4IMIM4IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMIMI2MIMIMI2MIMI2M3IM I4MIM4IMIM4IMIM4IMIM4IMI4MIM4IMI4MIM4IMIMIMIMI4MIMI4MIMI4MIMI4MIMI4MI MI4MIMIMIMIMI4MIMI4MIMI4MIMI4MI2M2IMI2M2IMI2M2IMI2M2IMI2M2IMI2M2IMI2M 2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI2M3IMI2M2IMI2M2IMI2M2IMI4MIMI4MIMI 4MIMI4MIMIMIMIMI4MIMIMIMIMI4MIMI4MIMIM4IMIM4IMIM4IMIM4IMIM4IMI4MIMIMI MI4MIMI4MIMI4MIMI2M3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI2M3IMI4MIMI4MIMIM4IMIM4IMI2M3IMI4MIM I4MIMIMIMIMI2M2IMIMIMIMI2M3IMI2M2IMI4MI2M2IMI2M2IMI4MI4MIMI2M3IMIMIMI MI4MIMI4MIMI4MIMI4MIM4IMI2M3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIM4IMI4MIMIMIMI2M3IM I2M2IMIM3I2MI4MI4MIMIMIMIMIMIMIMI2M3IMI4MIMI4MIMI4MIMI4MIMIMIMIMI4MIM IM4IMIMIMIMI4MIMI4MIMI4MIMI2M3IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI2M3IMIM4IMI4MIM4IMI4MI4MI MIM3I2MIMIMIMI4MIMIMIMIMIMIMIMI2M3IMIM4IMIM4IMIM4IMIM4IMIMIMIMI4MIMI 4MIMIMIMIMI4MIMI4MIMI4MIMI2M2IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5I M5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMIMIMI4MIMI4MIMI2M3IMI4M IMIM3I2MI4MI4MIMIMIMIMIMIMIMI2M3IMIMIMIMI2M2IMI2M2IMI2M2IMI2M2IMI4MIM I4MIMIMIMIM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM 2IMIMI4MIMI2M3IMIM4IMI4MI4MIMI2M3IMI4MIMIM3I2MIMIMIMIM4IMIMIMIMIMIMIM IM4IMIM4IMI2M3IMI4MIMI4MIMIMIMIMI4MIMI4MIMIMIMIM5IM5IM5IM5IM5IM5IM5IM 5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM5IM2IMIMI4MIMI4MIMIMIMIM4IMIM4IMI4MI 4MIMIM3I2MIMIMIMI4MI2M2IMI4MI2M2IMIMN! golly-2.5-src/Patterns/JvN/JvN-loop-replicator.rle.gz0000644000175100001440000002503412156145314017445 00000000000000‹¨7óJJvN-loop-replicator.rleí]Ksã8’¾ãWhg13Õ ‹”lù°‡š>슢Û]UŽØÛF¨\ªjÇøµ¶ÜÓýï7|ˆ$^ ’()ÃU† ‰‰D"‘xýõçÑÇ»õý﫟ÖË—Õèáþiµ|½®^îï–ëçWñןáßèö·û·ü[Ž—w¿A¢Ñ÷ç×ÑïÏO£_Vï˧§¿½ž_ïÜ?-FñÕOoëåz5z}X½­ÖR˜¯+ª«·ÑÝóÓÛý·ÕëòëߣïË·õ‡ÑýÓhùòòúüÇý#$èøò|ôxÿðpÿü„~¬ž ýþzû0Z>}=ßݽ¿Ü¯ÔÛËòn5zþ}õŠó<£»ÕÃÃÛèßPLTÕb5ú¶z»ÿñ„uy»‡”Ë×£¯ïëÑÓóz)ŸÖða´~þ0úï÷õúùé§ +¢‚ÄŸ£¯ÏëßFoµÔoë×÷; k….GÏO?>ŒÖÀ$øøü2zþœùŒyý ¬_—Oo÷ooQ²é­ï«LüyZCmæûÛê‚:®îî¿ÿ‰%,_¬FOï_!ÅßãÿÏÿ8Âxü°Äæþ½=.FËG$…($“"lˆo÷w²`@ M¾zúÕyþ.Ña¢þû30æk¸6¿Êù0úmùðI5òU™þ!9ôëûÃ6 d}Y¾!øï¯ÏȨËÓýë²Ìk³|¸ÇïŸ_,ŸP 0ûêõê ØõC’E¡Œê2‚óýþÇ{.€šñù›¸µz[c>¡—Õë$#}||Î)="…û¼Æß—w€â·%¶úÓOwϲ´FCJðÏÐF_ I€çß0 ’&¾¾­Fo«ÿ{_=ÝA=¡þ_ï×o£¯«õ¿W«'Y*Ñèöþ±#DŠÙ_WË×aƒbñë¼Fïß ;6ô÷÷Ù±V¿??¼#” ¥PÌØùüoIäiõRô0z|_çý¡Á¡À"Å·ЦvP¹Çö Pô©œó²™þ;Ïòqô9ýóýî_«?¡gÿåË ˆó©Ñλ Жb÷¾~þéÚV¶è™öûòõ~™ËÝ=¿‚†ø"[>ü´¾‡æº{Eæ×eÓ—ðÿùçèã7(û×ò¼ßý¶‚RnîÖÏ(æñùù•øcôŸ£ñùdv9M>ŒþÄ?¦ãRËÀçô÷_â+quÅ/üuvu½|ŒáäùI&“ßÉ”WµTBÍ·!š`Ú$Ïb.#q‰á,šnbgWÑ<ßi”ÿuÁy4!n¥þœM_2Ïÿ‹òCùþe/SùaEŒgs™%M¢ôRþCìðee‘$˜ŠñUiâ<Þþï"‚_‹ò¶2__Fs +𠦻œgEЍ‰R‹8Î"q\„Ï—Ñ&k~Ï ìtžâϿʰJõ -vÈà£l‚¸_„ÚTkÿ v ce r sù I±bÙ®qÄñÿ¦ZX§)^5Iùian(©Oóå_i[‰Øz_â²ó0ñ÷…Œ®FYþ“”L²‘Kqd©Ì_Ìé‰xó¹ú„„æŸñ,jñk¼aݸúXòp2_X¸€½yzž˜Ä=[¤9§"¤° `N.ƒå¨ó ™gXRšŒáÓ"gyœÅ LuÅ0‰çy"Kž¢ÐdyíðÓ™Ÿ—Ÿl‰@^YQQ"-KG~å8°æ9Ë6"œK(“HÏ1ÕÉRžÌ(òVp7ŠÓE”Ë ° ËÍ¥Z÷RÊ[/æáhåÎ@^ÅÉôjž\ϯ§çók0DŸfçÄŠòC§Pt% CÁH # D’÷ëºxp(º¡èJàH‘4ô¯ü còŸzŒ) $’1‰9®¤Pt%ÀHœHâëÀ.-º‹ë‘öÀÞ‘L±™âVvňl§#÷GŒÄ¯KX„:¸Êá•͉%'’8JÖ§ ±Kœè.²§Ó ÷‡$xHïßUGM?0ÅÔ…6˜ˆÍ£P£ m"_BF#߃ÝȧÂ4Â¥µ„’f A+ËÉX ©c”YJ ‰±2FH#³1z™õ1OL=f˜<ü0’^‘ØÊÝ™£m½hDâJHFJH75õ'ÔBBnZi„®\³]­7—E¨EíDÒ™µ½‹»ïÉîg!=;ÃJØdAM8Yh¥ Ÿ,hlÚN„úŸ,ø†ä9ažÌ©…î«ÝM¶'üÂRVÈþ ÖNŒdHºyª‚»OÛª;Çs0/u#FP=ÖÖoDEÝN!ìIì ÝöBôæ”ôÈÖŒQ<´¥€V(L$V0’C@²§-e§§-»z¢èìC¯*´g¼N¥"ùŒIîøî„ÌÚÚcAX’¸Ázuv·º`‘dU*¤£í=  Ö’Œd‹H† ÎÖµÕíL7H5cXoH|‘õ$|×iå›gºñ¥©òÍI¨DvÆ\«&cá|ŒdGHöµtêíïh¢oÍn¢¯n8vÌ„vÍDE&ô^{“g¨'¿ŒVݪ !•ÛÆ˜@BVPtW,3ÞzÃHˆÃÁŽ×³¬Ø0òÁHÂ=ùšxtŪ’¦Ÿ³ÖÑ>Poˆ©þÕøÆj–‘lɾŽþ˜ô0û¯»òµjI»šÂÑv5¹\óBã…!IHƒ0}ñÆ‚§>3ôÇÓˬCÅBCͼÐ#ë•Þ|£WEá‰}µp͸¸MËÞì‚ §7v0’CD¢ñw³™œ²â8JK[ÀÆ{'²+P·\âs–¡jowh»@ú:‡NÝ'n9¡“önŸ>Ý£3¥Ó9@K yJ‹i\÷kúCv`EÕ2FrHxu.€Ð°WçÂYÎÛhßD¸=™#Ò1Ë-}ò¯)ȽÄç°vŠöiQwWÌZosšüΤֹöÜ2cEìBBùÆ©š‚ˆ„`Ýý3vè3’ÓE‡»Zá1îê¼ ­QµN<ÚB—‘°yšRômD®„0 Y„2ÆðFYk4$Ø@`$ŒÄ ‰-o6³Ì~HËã”Ò¥¾„:)}’O…JÈéS!)ýN¶ë¬ t…Ô´·Í§âÚDP‘±O·©xœ7Þð8.©¥m©°¯g¹ñU¬uõU§a糿єÆâ˜¡rìo$rØ„p{rÙÞa$Œäxìš¶60¥Ûß.žÐ†öXêsË‚$Ü\iï‹'–¬ó¹"Ã$5qu‰nñèŠT,Œ€Ý¸%Zc\‡âKMšîý§ÁÚ“| #éBhWoÄmyÊ?8­t}¬·ÓúJ¹™uû3,ilǘ¼*¤–íâÆ´¦;cÚ•$ ÉJ×_ÞhÛ!¢oG’ai²À:{Ò»f,D|2)ßho16d2§4añSûì×a$§Ž$xËŸ_Çé9ès£‹ºQÝ1 û®*ßleˆ­¢ 9«‡‰º–²A’`^ÜC~1^KaÆÞ¡¢È柹usÖÁ«}FÂHvŠ$ÌÎ9^ÉÛ\h„p›K#‡y–êsŸk¨ëŒ8{sc31­áä»@æiNÖÖ„é m¼)¡Bô-в™é[kÌi¡Îîø7íã4ïOwb$Œ$ ÍtÙÝíè‘” eiŒÄ®{šVZGÕ°}Îg¿Uëí½ùåØkáEûH°ç \áÆÛi-Xvß³«B¾ ꬛)Œ„‘ô‡dKfÊ6µAÀ8¡¦ækÁÁ„öº·±™V´w´÷ö‹´½Æ¯ìØ®Û¦Š‚À{Äl/9“}&ÔD®ÊipbåÓàOño--[&mØÛÅõ¡ÊNÕ>#a$‡Äo ÈëèÞi=§á£Vëñ–õʘEÜHá:ÆS3Ì]<i¿ëøL£«Šä*ÿîv±™¡}(™”4.#åp¬ o$fùáw¥ # c»f îÊ${~J¥3˨A8‚a™7Wßß±ÂaNäA²qÁb¨„;e4ŒÝü #ì%Ó<-»<lç»Ìús™µÒ8¯Ï§xØÂ`$ŒÄÇ4©u´ž.qOV-qMY¦'âgæti|wÁö¶8®Š…þ¯zݼm“XÏ “Í8¡Fµ³9¶|FT‚A·¾§B$´ éîGËmc?wY=¦ó"GU!s9îoz!b9orvñïDDk ob$Œd˜HÈ‹.=ç õè(º A…„šÐšnKkÉõ2)¦AÛ¡f¬zÓhïPFu5†j£ÐŒ´æ³Å>Ü:ª“«|(øY«ïQŠ!7[ÊûPGFÂH‰Ón ~è‡ñŽ4û>PBndªþ'mktˆ¶ *ÔáĹÕ&làž •åH#(«”N2ÂÍ '³}ÙìÖ2ˆa£ë˜YÛÃ-›±NtMg¼^ÉH ÙÑbctx À+Üë†ÏFUm’ø¶¯ýaâY&ý;AK´u´EgÝ´VÆÜdTkÇe4©¸wÓ8×ëôCrÀéþÞ- {C[âõ{ç|;¥mÓ=ÞvóÉø¿.–ö܉\Ul0FâƒÄÛL ù™\šë̃zUßAÐÙäW©{¼ø¾U¡.ÙǬfAè¡|ëšßÈpx‚²ŽdŸË¡èŒ£ÞÄæÆVß7¥ŒU´_å·o]=œQƒ‘0 ’[eGÞÒsy„z½I¶¡­,*„Úám=u‚Z‹Ã}.Ùþ’Qk1ÌÔ’‚âM!r…üŒ¶>Pê.µŽzÛû8am/Èb ú„7 %#éù&£® ²pfb$Œd«H‚—Y(*¥Ã3Ò®¬Ü¼Â½'íÆŸ.cFÐýPÁlÑ-@ù® ̬稜VÏöE¿³:`÷#a$ÁH¶ç~q‰îÔÇ>_çÛuµc½’¶ËÓ}- CWÝ\ <¯z ¿IÈã‚sA¤×¨M¼©ÈùQ£xK޽ÒÊ^_}y[[âûr š´ËmeñÖUFÂHèaÓ:ëoFu8˜ÂÏÛ!iÚo~åÎ=,«®wyF5lßz2ŒFÈ÷rÂL~éwì|Lw m²£Ñ÷v‰‹ÃUÕ;¯]ÜÂÒ*ZCS´Œ„‘ ‰ÝQÓß ŽPB‘4Âí»Šª¿5ö¹Þ8²uºçW? $zû qώצ óîJ‡9ÐÀä8TIð`\óyUÂAPBGÃZöb0Fq×^ âÜ”¤›øšÞ@B!j¿·uµ†XX|*É1q=Üå"y¢+‘š½ö“«¸Bªˆ#™ˆÕ*Ó½=a·ûöqŽ—Œ$´ ÊTŒnÐW=)ÇŽm%Ì%ÊÄHÉ0„í†õ^æ0*ß’Û„ú? _\ÜP|¡ÛK´ÚZqº8ìfJë‚‹½]H›n<†iÝ@è&Û®¸ëmWF¯û™Â²ÛYëGHÝvíÏ—NïlUyÜ7 öŠlcóO˜ªe #9U$aVE-4ƒÛÚ4jLÃ×ÚjÒìb«³•à&Æþ.OÐÒ‚nõÊ5‚µü)ú$”NayëÁ’%¥iÚ°’vãºN‘XK”ªÄÚàê!é`ÕD²FÍ–OðÝßšžìÆaK¡9øÁ‡‘0’"éfíxŸ(Ö†‡½W¦]UOÈ÷…8^Mro½1ÍÔ5 Öa2˜œ ÎåŸPǃÑ`ñ»¦ÔTyOOоò¤G Žhw ‰Ý=½=køƒU´Œ„‘ì‰÷Ïw®jªêµ¹ß¨?íGˆc¾ÏÔÉá:×b ïFíê:×m£ @s­ÙT´8ßÓe#$‡™3怌JÌÑl]íµ¥I{ô#a$}"© šžç&‹†2'ä§BÚštûƒ/¡½Þä¢ñ§„ùv™ «HIØ©U¢ÝEsï{žÇrx»<‰4• ÈŒÄN¦óìlz¥ã«HŒgó8½¼Z¼|ÌÒìåãl1¹Ï7ñâ&YÄð?Á¿éâ%7“üCŒ1Sü*¾ãKLÜÌÎÃCÑ•†¢+A!*Èùsärþ0; F„ekƈðò71¢[EòÑ#(´ÌÚ¡³#‡Ð‡£úC’´ÙíŠÐŒõPh¾‚ÐÀæˆaÙZ1"¸üzŒ°&¢2]¸8CøÝ;„r|²ßÿ¸LnqàZ“>‘›üÇ"õ¤Îìê:ï» ¨7hÑÖTJï7¢¦,FU42WÜc[nD£#ôòã#²µbDpùõÑ¥"ínL}Î<*›ZE·{«d‹‡­Ó¦)ÿö75Ì!#±öða÷Ÿá#1÷pÑ–M÷h¦I!ú Ò•0"ˆ¥;ÀBZ½x«ˆÜ{“Åú4WéNZ­¹²Ó·Ù." çGÿÙúØ<Ä‘° ¡íj¨ô*…ŒÙ¤m'µôn3OTãZW•øFQ(¦În‡«ÓJšUÆÔCÑÌè¶:¡~Ž„&/­AIäL#ˆ¥YÓ˜g•„ì^&*!—-ªÑêh(ÌÚÆiYlè #pŸ¡OâVT‚[㺓Y%«‚èˆÃAâÒüÚ^0t·ÝÇ”§”¤¦P㼦(Z}L[­ð£7ß< ™M2›ìß’öTÑOðl¥ÒÛE$ÞÒ¸3CŸf[;3(Còu:¦‡ÎL ǽ7¢Úµ¶^ø™í:ŒdƒÄÐjæ8`ÓB›¦cÿ묓H+ž8Ó*û€i±'þ¨Vɪ• !ù¬]>ž}¯í Xì‰VѶcì`X_´¬™g(v•#LÙ½bDX6«¦ %äÖ ~ªŸºQ@7þ <^ZêÔuÂá TÝgrýÔŠ5‘3 –fOÓƒæ>2C ·3)ÔØ+š ´¾ñÒØÎ»?:UŠ2’À%5ŠG³îã³°¡Õ¦SÆTϪÙâKp›çü=Cÿ+½t˜LgÅ èÝîï>õ,/ÒŸ §+ж'1Ð@·L_(Š)™¶BÞ„èW”YùÝù©RTS˜á¶]5Ir85ª–¯°‡-¨õVŸ¯Ì&§BL4_S¬³¨µ/U1?)ì×:P˜á±…èd7UYwØ$…¬Ý:ÏLY»(_í–û˜zè‚ýÍoaË(‘PÛ ¥ë’zOV·…P§“ªSÓ½ïí°‰ÙªžøéZÇdòÄ{ÀZ…‘lc 6Ô ”Rë7=WcŽ}‹‰šHÓ1U…mš_kÊ4ÇXW~È1Cº«ÆÌN{ß·í¨%kZÞ«rŒH4ÓBosXê¥Ö÷7ÿÝèºt½,ºèNÓ-Ê*¥åšY—{PD|ô\'7Q:'ÿ$=wØ}™‘0FÂwEÓØãó”³–YˬÝkÍ–1qÚ²¸÷š@hǯŸZuÜ ¡ó"ì…¥4ùÑ]FX~òʧ)d$Œ„‘"’ú0@¾†Õs„€ïÔº`Ö2k™µÇÀÚF„ñÉ.á^.0ÑÏ% ¯xy.V¯•8("¦¬.NmOR!‡d$”÷w #a$=!qêG‡?Òô€_ /ÙhcØùͬeÖ2k™µûb­~¦ÔŠÙ|³ß5ŽfŒiß´WLÇ売BÁ3'ã(4Ì]ã§#2â #a$»ER ¨Ĕ‘âÔGS6T˜µÌZf-³öYkž9 yígGDñf#Ã'ôšA-L¥ýÛ^Œ„‘0’CAâT~šÓ¯æ±â&¸1ҴǦÂT˜ Sa*Tüüüæè}b†sIØÃVØù/’¬u£•~Ê#a$ŒÄ U_*o;wjj7¼ðäI¬<ì¢WµTb¤›Î\Ä„¡ž^Ä„ƒi4bš[ň™·ü{s_“N FãÆBL9KËRËRËRÛ“Ôº]âúõ‰œiÔCéι ©¾+¢IouÜ÷~Wzø§1W #a$ÛE¢Þ¿HPô>ƒ2e"úvh¤ÝwïRH‹Àò1¦ƒ¹^¤wr­1‰tØ‹Hí˜à'ž4¬íÀk¥6„#D©%•ZeÆÐ‰#þ !PjI¤{{Ç«#GüB Ô’I÷q1é(„›4Q!J­é®Ã˜"µá·´¸Þ$'ň°lÆú/4BŸ#öÆ0ä u’td#a$ŒdËH”)ú„-Iž¢uïïÆ­W¯êL?÷b*L…©0¦bж4‹u_ϵ·B~¯ƒ‘0FrHHÜï&…û=£F´NáëPIë¡áÕkwÆZ>ën[ÆF>ãë~>U´-*“«Ø3‚x#:2µ>™ gêâ†6Ž:‘šÆQ¯*Š®L•ùÚ"‡ñFtcjc®Û‘7й´5sºs¿+o'g$Œ„‘Ò7ø©½ gÓÞú3ö*™}߀À—K0k™µÌZf­1‘úìµÑS{²¯RìvKFp:2¾¿Ð?çtçx,/FÂHÉÎ7‡XqÇñ«Õ;kǽ+|FrHœ¦Û ò$IÐFØ $Š t€j–‘0F2t$-ÏÓ;b³–Yˬ=LÖºL^üÔ¼n*ôxØ)O’ùUZFÂHÉ!qmíS7Ðj’"”e× ªŽ=šÄÑûöd&ÂD˜é‹ÈÍ¢cØÍá¸ËÅeÈá)ù¦·Ž3?$í+>Ý}¸¯;_ã½[L„ekÅŸl§´VÙé 1/$V•p¤ýç‘«Ýsþ¡Ð—ApCª7±tìC61xÃ#ñBâ׫C.iS»,éÎ9Ee4c´C]% ¿'û†|A#ñCâ? ë–*]C»v=¯Ù †¸[-±2`epp]p8HºMø§:IÑ áÓ¼HA³ ØDweps<“s õŽ„¤ Ž´’ö…2½§ÞçéYlóUæªÕ`Æ),%Q‰|†W³ƒãÑÔ‰¦æÒ v†0$ý9C與j ܪI%|xï Øbj¬»Í¨æè'¹dcïp 1ë<㕜o­:ç i³6§Ôöfd°ýÖ“ý>õvª&’=׋ÿ-qè4Â!±Ûsz¯1e%ª–fKN¢ Ëê}¶ñNÿ®çsGþŠÖp²¶óF²VqD‡×ƒN‰sHœwXõ†]’‚;a½PÿwÃ5ivò¶(PO`úewÍÚ½Ôb»é·³V4/;Ò¾|¸H’–¥°9¿%â=»U(Ýg·n• DºSÛÞ„Çc定f–ë±äRoÞÖX‡¡°¦Y© IàÐNོƒè&¢:P7‘±jÂO¥èÍeëT³…­ {7¼‚ °S×[C"û`¸„ÒÊäQÒoh'i¦.Fõx×Ú ÃmÂæ,—ø|˜’l{[£¼gcÃéAÃA"çÛ>oè›h¨;úÚÐ)cªŒz#©÷ „Xt e02׿ôkF ’ª \ù§MQ ƒ>m#ê>E½‘HB-üº…­o?½Òߨá=V Wc‡»½Z2ÛiÆaŸ†O] ©n•B´§²\ÂË×¾m‰fíSQ/4íDß;mK#ˆ¥ÙÓ hõF#ûË»D3Ð*Ѓ·í#!ì­µƒðlmH^°·¦£œTÞÞÈÞ%Ôô𛾠ɞÖ:ˆ!šCÄAˆîQõÝ yY¹$„ËŒCWã!o/ñ ]*;4ãyë4—:U±Ý¦Ê¾àÜ¿;!Ã%~„†²Éª?}ÐÙ“ÁE7ÇÕæVïcêïNÉÝDdžãûîHö¬gCÝ!»Ý¼æEˆ'tZM±…Û?ØÏºC$´£4[ÛSáu‰Û{( RµýãÄÄvgHvx³¸³Ý)—æ?ªé\_«.¼Â}˜H¼&V[Ý뵤C¹·°·™˜÷=öÝyÂŽô"qßTV[$ß³cóXÖ¢h³Â-î{&„A„ŒGì{3wÈÚá;sïHôÓ»]„åe:GV»›’yg>m±e$¸]:ÊuÂî$„ü<´&æðCGŒ(î¯êìmT_í "³ùF½¨e*{i×͸Âý? Fב”ªvBR)áÃ׌dH‚,ýöe þDt§ý=mëBõx{juMZÒkÚ`ÞºæCƾ¥Â2EpØ‘ç2uÕ¬†·¶á’쓾F`${@bÖ oœYR˜¼’nû­¦«\æ˜æf}§M­#ëôêSÈžºÕÅìtQÙcdãC¹º4¼;7UËHèáÞÖ`5½D]²tY²$"äÞW?BÞ©Ñ ?Db’ºÆê˽ÆfCÀnÛ'ãùð#(’N¾QîÝDZ¡Æ,v9LTýçŒÙòë ÎJÔ8è|ÔÅ¢6:^ØégKZ=DäÅÂ>ö ’”Ý1Ä´½·#¡-<Ѥ¢vC¯!¯%¯å@Ä1$ÁQOSüå‡a(ôëÔf}í±gž¸ëÓV±ÅÍîÎU¹«¶õÉ9ìÿ½ÝÞ=/‡§ ÉXµ§^¥xN DÈÚ[jÓ€ÛðLÒR’o7öU®½8SÜZ‰4üÜP¬|2!¾3T—ÆbåÓCÇê8i8QåÆHÜá¾¶GºâiO¨Ø­Èºš &§ïžv6ñÁG¸½ͽ7Iv½EȈÄ[^¶tñU2YœMÏ£t|¥Ÿn“ˆò_ÐFi–f9ñË(ž§Ÿ?EY´ù%Z‡ýÍ¿«"§ÑŠŒç/ç1üw‚Ækš—€ŸGð7pûåãE¿ °é<+Ä}F{þ~Yb`Ó,º0 È韉F*›¸öeW³EÅØ8‰f/'cü}VæOxŒéRQ¤KΣIRKÒ&g@éöËe2/)O®¢2ƒ¨¡ “yþÿ²1y”]Æ %g½(Q++Jùïeá6ͳX“³Vä¼ü'ªOX²Ì'Qäøb‘¡´/Q 90-¦ã Ì5)þlä‹nf <“üYà §#dç˜ÈVšÉO•d’“LJLåOqT.ø:*Š>˪!åª2Efù))Â< -èÃB¶BR|1‰Œ‰6yâ Œ8¯ òÅÔFPEÈ·'E½b…’¬ß¤@rYF`¿ 8I;sY/ì) ýWóÚ OáW ŠL‘GB—o”À’i3®äZÑ¢Œ©1Ë@Õç×ók*fûÐvó3òØT™Àq¡hϤNª [Ä$µ—dcb™"NsÞþrý’IiNQš¾À%DøÉ¢ä1µ£&…¬É ¸Ñ¯/ÿDú@ì-p²Õ¦Ð¨‰Ô—E#%…àÈ%!Ó—Ÿc,ûågèG_€L\cpˆº4HÖΜlݸâˆHÓÏ7(ß‹›IÑM¥¥›¥œÍ"M#  üÆ×8úeþòÏk`Ö/QüI Ѧ)ê]1.»“JYL*º1¶\š}Æ¿ 7ÐfÈn´gUu+Úef‘D—øW*{56äâZ¥ aÍcÍJ ’€˜BMd~Ð…×´C†æj1¾‚æ`L,9‰0<úU’@"Q¶ÀÏ‹ò'mÒÚúL’ú¥¤²HYA$]@ÕãX ÕíÙ$çÒâFö§2„_À†…Ì?B O˜d euòéó”Vˆ­#*P ãè3Ö òó òòå }Ž£ñ%j«³I‚¬‚ñ—èö³ì;I”µFË ÆØãb°¤Ò â©a²ŠŽÔ'hB…¤F.>A¶¢Õ$ÉX ´Æ A.‘Â9ŽéÑd<—Ÿ,IÑäùÇ2æ,>Ǿ’Fgñ¸Ï4Ÿ«ÆMjÔ¾±¦÷4ókUi¢ÞJ¤suHËßÿ!þ¾nûÆgolly-2.5-src/Patterns/JvN/N-compressed-replicator.rle0000644000175100001440000007764212156145314017735 00000000000000# A self-reproducing machine. # Author: Renato Nobili # # To see the machine, zoom in on the left-hand end of the line. # # A universal constructor is given a tape of instructions that # specify the construction of an identical machine. After copying # the tape, the machine then obeys its instructions, creating and # then activating an exact copy of itself. # # Replication takes around 9.59e+09 generations. With larger step # sizes (8^8 or higher) it should only take a few minutes on a # modern machine. # # This machine uses run-length encoding to compress the tape. # Blocks of repeated codons are replaced with a codon and a value # specifying the number of repeats. A special organ in the body # of the machine decompresses the tape before use. # # Length of tape: 56,325 cells # Replication time: 9.59 x 10^9 (9.59 billion timesteps) # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # Originally distributed as SR_CCN_AP.EVN # Redistributed with permission. # # About the tape: # The machine was originally not supplied with a complete tape because # before 2008 it was not possible to run these machines sufficiently # fast. Following the instructions here: # http://www.pd.infn.it/~rnobili/au_cell/ # under the section "Cell + cell-number coding modes", a Golly python # script was written to produce a suitable tape. The script makes the # minor optimisation that trailing empty cells on each row are skipped. # Similar other optimisations are possible. # Tape written by Tim Hutton # x = 56422, y = 100, rule = Nobili32 5.21IpAI4.pAL44.2IL.IpA2IpALIpAL$5IpA17IL2IpA.4R2L44.J.pAIpA.L2KIJ.pA IpA$J4.J16I2LJLK.pA2RpAKL39.5IpA5IpA8IL$J.3IpAJL14KpAIpA2ILJ3K.pA2IpA 2IL33.JpAIpA.2JpAIpA.2IpAIpA4.L$J.J2.J.pA4.2IL12.L5.L2.L2.L27.7IJ.2IpA IJ12.L$J.J2.J.L4.JKL12.L5.pAL.pA2.L27.J25.L$J.pA2IpAIpA5IpA13IL9K2.L 11.2IL13.J6.pA2IL15.L$J.2JR2.L.4RL13.L.pAJ.pA.J2K2.L.2IpAIpAIpAIpAIpA .L13.J6.J.LpALIpAL11.L$pAIpAJR2.2LpA2RpAK.pA2KpA2KpA2KpA2KpA.J2.J.pAL J2.L.J3.J.J.J.L.L13.J.5IpA.2LpAJ.IpAIpA8.L$J.J.pA2.2LJ3K2.T2.T2.T2.T 2.T.pA2IpA.JIJ2.L.J2.pAJ.JKJ.pAQ11IL2.J.J4.L.17IL$J.JIJ.LpAK5IpA.IpA. IpA.IpA.IpA.KJ4.J4.L.J2KJK.I2J.J12.L2.J.J4.2IpAIpA14.L$J.2J2.LILJ2K.J .LJ.LJ.LJ.LJ.L.J4.J4.L.2IpAIpAIpAIpA.J2K10.L2.J.J14.3IL5.L$J.2J2.pAL 3IpA.JpAKJpAKJpAKJpAKJpAK.pAIL2.J4.L.J7.IpA2IJ10.L2.J.J4.10IpA2.pAL4. L$J.2J2.L3IL2.L13K2.J.L.IJ4.L.J22.L2.J.J4.J9KIpAI2pAIpAIpAL$J.2J2.pAL 2.L2.pA15IpAIpAIpAIK3IpAIpA13IL8.L2.J.J.12IpA9IL$J.2J2.L4K2.L15.J.L.J .R3.L.L.L12K8.L2.J.J.JpAIpA.JpAIpALJKJ9.L$J.2J2.L4.LKpAIpAIpAIpA5IL3. J.L.J.pA3.L.L.13IL5KpAKpA2.J.J2.J.3IJ2.2IpAJ9.L$J.2J2.L4.L2.LK.L.L.L 4K3.J.L.J.J3.L.L.L13K5.T.L2.J.J2.J20.L$J.2J2.L4.L2.pAL.pA.L.pAQ3IL2.J .L.J.J3.L.L.20I2L2IpAIpA2IpA5IpA2IpAIL9.L$J.2J2.L4.L3.L.L.L.J.JK.L2.J .L.J.J3.L.L.15ILIL2.2LJQJ.J2.J5.L2.2LpAIpA2L5.L$J.2J2.L4.pA3IpAIpAIpA IpA2IJ.pA2IpAIpAIpAIpAIL.L.L.J12.LKpAJL2.2LJ.J.J2.J5.L.LK4IpA6IL$J.2J 2.L16.L3KLKJKILJ.J.L.L.L.J12K5IpAQLIpAIpAIpA2IpA2IL2.L.2IpAIpA.LJpAIpA 2.L$J.2JLKpA17K.LKLJKJKLJ.J.L.L.L13.JpAKpAIpA2.L.J.J.J2.J2.L2.L7.pAIJ 4.L$J.2JL.2LK2LKLKL11KJKIJ.JLJ.J.L.L.L.2IpAIpAIpAIpA2IL3.J4.L.J.J.J2. J2.L2.L14.pA$J.2JL.2LJ2KJKJK3IL2IL3ILILJ2KJLJ.J.L.L.L.J3.J.J.L.LK3.pA IL2.2IpAIpAIpA2IpA2IpA2IpA13IpAQ$J.2JL.IpA7IpAL.IJ.IJ2.IJL2I2JLJ.J.L. L.L.J2.pAJ.J.pAQ3IpAIJ.L2.J.J.J.J2.J2.L2.L.6ILILILJ.J$J.2JL2.L7.JIpA 2IpA2IpA2I2LJ2KJLJ.J.L.L.L.J2KJK.J.J4.2IpAIpA2IpAIJ.J.J2.J2.L2.L.JKpA IpAJLJLJLJ.J$J.2JL8IpAIJ.L2.L2.L2.2L2I2JLJ.pAIpAIpAIpAQT.pAIpAIpA.J3K 3.J.LJ.J3.J.J2.J2.L2.L3.J.IJIJIJIJ.J$J.2JLJKILI2L2KL2KpA2KpA2KpA2KLIpA I.JLJ.J.L.L.L.T.J.7IJ3.J.LJ.JL2KpAKpA2KpA2KpA2IpA3IpAIL.7IJ$J.2JLI2JL J2L2.L2.L2.L2.L.JLR2.R.LJ.J.pAIpAIpAIKIpA12IJ.LJ.JL2.J.J2.J5.L3.pAKpA .pAIpA4.J$J.2JLJKJLJ2L.pAK.pAK.pAK.pAK.pAKpA2IpA.LJ.J.L.L.L3.J.9IL.J. LJ.JL2.J.J2.J5.L3.4IJ6.J$J.2JLI2JLJ2L.TJ.TJ.TJ.TJ.T.J2.L.LJ.J.L.L.pA 3IpAIpAIpAIL.L2KpA.J.IpAIpAIpA.J.J2.J5.L7.IL5.J$J.2JLJKJLJL2I.pAI.pAI .pAI.pAI.IJ2.L.LJ.J.L.L.L5.L.L.L.L4.J2.J.J.T.J.J.SJ5.L7.JIpAIpA2.J$J. 2JLI2JLJL2.J2.J2.J2.J2.J4.L.LJ.J.L.L.L4.pAK.L.L.pAQIpAIJ2.J.J.2IpAIpA 2IpA5.L3.4IpA6IJ$J.2JLJKJLJLIpA.IpA.IpA.IpA.IpA.K3.L.LJ.J.L.L.L4.L2.L .L.J.JL.J2.J.J.J.J.J2.L5.4IpAIpA.2JpAIpA2.J$J.2JLI2JLJLJ.R2.R2.R2.R2. R4.L.LJ.J.L.L.L4.IpAIpAIpAIpA.JL.J2.J.J.J.J.J2.L11.2IpAIJ4.J$J.2JLJ.J LJLJ2pA2KpA2KpA2KpA2KpA.LK.L.LJ.J.L.L.L11.2IJL.J2.J.J.J.J.J2.L2.8IL9. J$J.2JLJ.JIJ2IJ12.J2KJ.L.LJ.J.L.L.L14.2IpA2IpAIpAIpAIpA.J2.L2.J5K.LK 9.J$J.2JLJ.pA12IpA4I2JIJ.L.LJ.J.L.L.4IpAIpAIpA5IL2.J2.J.J.JTL.J2.L2. 5IpAIpA10IJ$J.2JLJ.J4.J.L3K2.LJK.2IJpAK.L.IpAIpAIpAIpAL2.L2K.I2L.L3KpA 2.J2.J.J.J.L.J2.L2.2JpA2IJ.IpAIpA2.pAKpAIpAJ$J.2JLJKpA4KpAKpA2TpAK.2I pA.J2KLJ.L2.J.J.L.2L2.L3.LKL.L6.J2.J.J.J.L.J2.L2.JpAJ7.IpAIpAIJ.IJ$J. 2JL2.J4.J.4TJ5.ILJKJ.2LKpAKpA3KpAL2.L3.L.L.pAQ5IpA2IpAIpAIpAIpAIpA2. 4IJ16.J$J.2JL2.pA4IpAI4.pA5IJ3IJ.2L.J.J4.L2.pA3IpAIpA.J.JK6.J.J.JRL.L 9.2IpA2IpAIL6.J$J.2JL2.J2.J7.L4.L7KL.J.J2KpAIpAIpA6.2IpA2IJ6.J.J.J.L. L8.IpAL3.L.L.IL3.J$J.2JpA2KpA2KpA7KpA4KpA7KpAKpA4KJ.L.T18.J.J.J.L.7IpA IpA.pAIpA.L.pAIpAL3.J$J.J.L2.J2.J7.L4.L7.L.J3.2J.2IK17ILJ.J.J.L8.8IpA 8IJ$J.J.L2.J2.J6.LpA4.L3.4IpAIJ3.2J.L20KJ.J.J.L16.L.pAIpAIpA2.J$J.J.L 2.J2.J6.IL4.L3.J3.L5.2J.20ILJ.J.J.L16.pAIJ6.J$J.JKpA2KpA2KJ2.L4KpA4KpA 3KpA2K.K5.2J.L20KJ.J.J.L25.J$J3.L2.JQ2J2.L.QT.L2.J.L3.J2.R6.2J.21IpAI pAIJ.L25IJ$J3.L2.JRJ3.pAIpA.2L2.J.L3.J2.pA6KpAJ.21IJ.J.J.IpAIpA.JpAIpA J3.pAI2pAIpA.pAKpA3K$J3KpA2KJRpA2K.2IL2KL2.pAKpAIpALJ5.J3.2J.J2.20IJ. J4.3IJ.IpAIpAIJ2.J.LIpA2.pAKpA$4.LQ2J.J.pA4K2.L7KLJ5IJ3IpAJ.J2.JpA3. 17IJ12.5IpA.IJ3IpAIJ$4.LRJ2.J.L6.L3.2IL.L2JKpAIpA.J.JLJ.J3.J3.J$4.LRpA 2KpA2K6.L2.IJKL.LJ2.J.pAIpAIJIJ.J3.J3.J.pA2IpAIL10IpAL.11IpAIpAIL$4.L .J2.J2.L5KpA2IpAR.L.LJ2.J.J.J3.J.J3.J3.J.J2.pAKpAJ2.IL3.LKpAK.J10KL.pA KpA3.IL$4IpAIJK.J2.L8.J2.L.LJ2.pAIpAIpA2IpAJ.J3.J3.J.J2.4IpAIpAL.LKpA IpAL.10IJL.4IpAIpAL$J3.L.R2.J2.L8IJ2.L.LJ2.J.J.J2.IJ.J3.J3.J.J6.10IpA IpA10IpA12IL$J.2IpAIpA2IJK.LJ10K3IpA2IpAIpAIpA3IL.J3.J3.J.J13.L3K.J.L 2.pAIpAJL2KILILJKpALJ3.L$J.J.L.J2.R2.L10IJ.R.J2.J.J.J3.L.J3.J3.J.J13. 5IpA4IJ.IJ3IJIJ3IJIJ3.L$J.J.L.J2KpA3KJ10K.pAKpA2IpAIpAIpAIpA2L.J3.J3. J.J20.R21.L$pAIpAIpA4IpA13IJ3.J2.J.3J.3L.J3.J3.J.J.19IpA21.L$J.2JL22. J2.J.2JpA.pA2L.J3.J3.J.J.J40.L$J.pAJL2.L2KpA3KpA4KpA7KJ2.J.J.JLK2L.J 3.J3.J.J.J2.3IpA2ILIL7.3IpA2IL4.3IL7.L$J.J.L2.L2.L3.L4.L4.JI2J2.J.J.J 3IpAQL3.LSpAQL.J.J2.J2KL2.pAJL6.IpA4.LpALIpAIpA2.pAL6.L$J.J.L2.L2.L.L KpAKpA2KpAKpA2KJpAKJ2.J.J.J2.JL.J3.J.J.J.J.J4.2pAI2pAKpAIpAIpAL.JIpAI pA.2LpAJ2.IpAI2pAIpAIpA2.L$J.J.L.IL2.I2L.I2L2.I2L.2JL2J2.J.J.J.pAJL.pA 3IpAIpAIpAIpAIpA3ILJ10IpAIpA20IL.L$J.J.LIpAL.IpA2LIpA2L.IpA2L.2JK2J2. J.J.J.2JL.J3.J.J.J.L.J3.L3JpA.L6K.J5K3.2JpAL.pA2J4.L.L$J.J.LJ.pA.pA. 3pA.2pATJ.2pATJK.pAJ2.J.J.JIpAJL.J3.J.J.J.L.J.pAKpA2JpAJ.pA12IpA.L.JpA JIpAJ6.L.L$J.J.LJ.T.J.2TJ.3TJ.3T.J.J3.J.J.2JLJL.J3.J.J.J.L.J.5IJ15.5I J10.L.L$J.J.IpAILIpAIL.pAIL2.pAIL2.LJ.J3.J.J.3pAJL.J3.J.J.J.L.J24.R 11.I2L.L$J.J2.JKpA.JKpA.JKpA2.JKpA2.LJ.J3.J.J.2J2.L.J3.J.J.J.L.pA24IpA 11.J2L.L$J.J4.L3.L3.L4.L2.LJ.J3.J.J.2J2.L.J3.J.J.J.L.J31.5IpA2L.L$J.J 2.LKpA3KpA3KpA4KpA3KJ.J3.J.J.2J2.L.J3.J.J.J.L.J2.3IpAILIpA.9I2pA6ILIL J.I2LK2L.L$J.J2.L.L3.L3.L4.L3.J.J3.J.J.2J2.L.J3.J.J.J.L.J2.J2.2LpAJIpA 2JK.L5KJ6KIJIpAIpAL2I2L.L$J.J2.L.L3.L3.3IpAIpA3IpAIpA3IpAIpAIpAJ2.IpA JSpA.J.J.J.L.J2.J2.8IpAIpA11IpA10IpAIL$J.J2.L.L3.L6.L.L3.J.J3.J.J.J3. J.L.J.J.J.J.L.J2.J2.4IpAIpA2J.L4.JpALIpAIpAJ3IpAIpA4.L.L$J.J2.L.L3.L 6.L.pA3IpAIpAIL.J.J.J3.J.L.J.J.J.J.L.J2.J2.pAKpAL2.I2J.6IJIpA4.pAKpA 7.L.L$J.J2.L.L3.L6.L.L3.J.J.L.J.J.J3.J.L.J.J.J.J.L.J2.J2.pAIJ5IpA9.IpA IpAIpAIJ7.L.L$J.J2.L.L3.7IpA5IpAIpAIpAIpAIpAIpA3.J.L.J.J.J.J.L.J2.J3. J3K28.L.L$J.J2.L.L8.J.L5.J.J.L.J.J.L3.J.L.J.J.J.J.L.J.IpAIpA4IJ.5IL5. pAL4.3IL6.L.L$J.J2.L.9IpAIpA5IpAIpAIpAIJ.J.L3.J.L.J.J.J.J.L.J.2J.L6.pA KpA2LpALIpAL.J5IpA2.pAL5.L.L$J.J2.L6.J3.J.L5.J.J.L3.J.L3.J.2IpAIpAIpA IpAIpAIpA2IpA8IpAIJ3LpAJ.pA.J5KIpAI2pAIpAIpA.L.L$J.J2.L2.4IpA3IpA7IpA IpAIpA3IpA.L3.J3.J.J.J.2IL.J.R10.L2K12IpA10IL.L$J.J2.L2.J3.J3.J4.J2.J .J.L3.L.L3.J3.J.JKpA3KL.pAIpA6IL2.LKIL3.JpAI2pAIpAILJ10.L.L$J.J2.2LKpA .LKpA.LKpA2.LKpAIpAJ.J.L3.L.L3.J2.pAJ2K.J2.JL.J8.L2.ILJL4IJ2.JKpAKLJ 10.L.L$J.J2.IpAIJ.pAIJIpAIJ2.pAIJKL.IJ.L3.L.L3.J2.2JIJ.J2.JL.J7K.L3.I 3pAKpA3IpA2IpAJIJ10.L.L$J.J3.L.2RL.R.L.3RL.RLK.pAL.L3.2IpA3IpA2IpAJpA 2.J2.JL.pAJ.pAKpAIpA.L5.IpAIJ12.8IpAIL$J.J3.L.3pA.pA.L.2pARL.2pAL.JL. L5.L3.J2.L2J.pAJ2KJL.J4.J3.L.L19.JpA.pAIpAJ.L.L$J.J3.IpA2JIpAJ.IpA2J. IpAJL2IpAL.L5.L3.J2.pAJpA.2JI2J2IpA4IpA3IpA22IJ.J.IJ.L.L$J.J4.I2J.IJ 2.I2J2.IJL2.2L.L5.L3.J2.L.JIpAJpA.J2.J4.J3.L.R11.11IpA4IL.L$J.J5.2JKpA 3KpAKpA2KpA2K2.pAL.L5.4IpA2IpAI2JL2J.J2.J4.J3.2IpA11.2JpAIpA.pA4IJ4.L .L$J.J5.J2.J3.J4.J5.L.L9.J2.L2.2pAJpA.J2.J4.J17.J.JIpA.J9.L.L$J.J5.J 2KpA3KpA4KpA6K.10IpA2IpA2IJ2.J.J2.pA4IpA17IpAIpAJ2IpA.pAKpAKpA2K.L.L$ J.J35.J2.6IJ.J2.J4.J25.L3.L.J.L.L$J.J35KpA10KpA2KpA4KpA23KpAKpAKpAKpA .J.L.L$J37.J13.J28.T.L.J.J.J.L.pA2IL$J37KpA13KpA28KLKpA.JIJ.J.2IpA2QL $38.J41.JK3.2JK.J7.2L.4L2.L.L2.2L.L.L3.L.2L2.8L2.8L2.8L2.L5.2L.2L5.5L 5.5L5.5L10.L.L.7L.L.7L.L.7L.L.L4.3L2.8L2.8L2.8L2.L12.L.2L.L7.4L6.L9.L .L7.4L6.L8.5L6.L19.L.L7.L8.L5.5L6.L.3L.L7.4L14.3L9.4L6.L4.L.L9.L2.L2. 2L5.2L2.8L2.8L2.8L2.L13.6L6.L9.4L16.L3.L5.L9.L2.L5.2L.L17.4L6.L9.4L 16.L3.L10.5L6.L.3L.L6.3L6.2L10.4L6.L8.2L.L7.L4.L4.4L6.L6.L2.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L.L7.L6.7L6.L6.L2.4L6.L6.L7.5L7.2L.L.L7.L2.L6.4L 6.2L7.5L16.L2.L6.L.L7.L3.L5.L.L6.2L5.5L3.L13.3L3.L5.L2.2L5.2L2.8L2.8L 2.8L2.L13.L.L.L15.6L6.L9.4L6.L8.L10.4L6.L9.4L6.L3.L4.L10.4L6.L9.4L6.L 3.L10.5L10.L.L7.L8.5L6.L8.5L16.L2.L4.L.L3.L5.L.L7.L8.5L6.L9.4L6.L2.L 2.2L.2L.L7.L3.L5.4L6.L7.L11.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L13. L.3L3.L5.L9.4L6.L8.L10.L3.L5.L6.2L6.2L.L.L.L16.2L.L16.2L.L14.L2.L.L 13.L.3L.L7.L8.L8.6L16.L3.L14.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L.L12.2L3.L3.L10.2L.L.L.L16.5L16.L.L7.4L13.L2.L.L13.L.3L.L7.L2.L 6.L3.L13.3L.L17.L3.L14.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L 13.3L.L.L7.L8.5L13.L.2L3.L11.2L2.L.L7.L8.L6.L.L.L.L16.2L2.L2.L3.L.L7. L5.2L2.4L6.L6.L2.4L6.L9.4L6.L8.5L16.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13. L.L.L13.L.L.L.L7.4L6.L9.L.L7.4L6.L.L17.L3.L12.L.2L3.L11.2L2.L.L17.4L 6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L8.L10.L.L16.2L2.L5.2L3.L15.4L16.L3.L5. 4L16.L.L13.2L2.L.L7.2L6.2L10.L.L16.3L8.L3.L4.L10.L3.L5.L2.2L5.2L2.8L 2.8L2.8L2.L13.L.L.L14.7L6.L9.4L6.L19.L3.L5.4L6.L.L6.L10.4L6.L6.L12.L 3.L11.2L2.L.L17.L.L17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L16.2L3.L5.L.L 7.4L16.L3.L14.2L3.L15.4L6.L2.L5.5L6.L2.L5.5L6.L2.L5.5L6.L2.L5.5L16.L 2.L6.4L6.2L7.5L6.L.L6.L9.3L8.L3.L5.4L6.L9.4L6.L2.2L5.2L2.8L2.8L2.8L2. L13.L.L.L7.L4.L14.L.L15.3L3.L15.L3.L14.2L.L7.L5.L.L.L.2L6.4L16.L3.L5. L2.L6.L3.L15.L3.L5.4L15.2L3.L15.L.L16.2L3.L5.L9.L3.L15.4L6.L8.5L16.3L 16.4L16.4L16.4L16.4L16.2L2.L4.L.L3.L5.L.L6.L9.5L16.L3.L15.L3.L5.L2.2L 5.2L2.8L2.8L2.8L2.L13.L.L.L13.2L.5L6.L9.4L6.L8.L8.3L3.L15.L3.L14.2L.L 13.L.3L3.L15.L3.L4.2L19.L2.L6.L3.L5.L2.L5.2L3.L15.L.L15.3L3.L13.3L3.L 5.L2.L16.4L6.L19.4L6.L19.4L6.L19.4L6.L19.4L6.L6.L2.L2.L6.4L6.L.L17.L 3.L5.L9.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L14.L2.L.L7.L7.L 7.2L.2L3.L15.L3.L14.2L.L13.L2.2L2.L5.2L3.L15.4L6.L9.4L6.L9.4L6.L9.4L 6.L8.L10.L.L15.3L3.L13.3L3.L15.L.L17.L3.L5.L.L17.L3.L5.L.L17.L3.L5.L. L17.L3.L5.L.L17.L3.L15.L2.L5.2L3.L5.L.L7.L9.L.L16.2L3.L4.L10.L3.L5.L 2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L15.3L.L7.4L15.5L6.L5.L2.L8.3L3.L15.L3. L14.2L.L13.L2.2L3.L5.L8.5L6.L16.2L.L3.L15.L.L15.3L3.L14.2L.L7.L9.4L 16.L2.L6.4L6.L3.L5.L2.L6.4L6.L3.L5.L2.L6.4L6.L3.L5.L2.L6.4L6.L3.L5.L 2.L6.4L6.L3.L15.4L6.L7.L.L.L7.4L15.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L 2.8L2.L13.L.L.L7.4L6.L9.4L6.L9.4L5.2L9.4L6.L9.L2.L2.L3.L3.L13.3L3.L 15.L3.L14.2L.L12.L.L.2L3.L15.L.L15.3L3.L5.L19.L.L17.L3.L14.2L2.L2.2L 2.L.L16.2L.L7.L7.L.L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13. L.L.L7.L5.L3.4L6.L5.L.2L10.L3.L15.L3.L14.2L.L14.4L.L7.L5.2L2.4L6.L9. 4L6.L7.L.L2.L6.L9.4L6.L9.4L6.L9.4L6.L5.3L.4L15.2L.L16.2L.L7.4L15.2L3. L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L13.L3.L3.L5.L2.L6.L3.L5. L.L7.4L6.L9.4L6.L3.L15.4L6.L9.4L6.L3.L15.L3.L15.L3.L14.2L.L14.4L2.L2. L.3L.L17.L.L17.L.L15.L.2L18.L3.L15.L.L17.L3.L11.3L.L.L16.2L2.L4.3L.L 16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L13.L3.L3.L5.4L6.L 8.L9.2L3.L5.L7.L11.L3.L14.2L3.L15.L3.L14.5L6.L2.L6.4L6.L2.L3.L2.L.L7. L5.2L12.L.L17.L.L15.L.4L16.L3.L15.L.L17.L3.L13.L.L.L7.L6.L2.4L6.L9.4L 6.L9.4L6.L9.4L6.L2.L6.L.L15.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L 2.8L2.L13.L.L.L12.L2.3L3.L14.2L3.L15.L3.L14.2L.L17.3L14.L2.L2.L2.2L2. L.L17.L.L17.L.L15.L.L3.L15.L3.L15.L.L17.L3.L13.L.L2.L4.3L.L17.L.L17.L .L17.L2.L6.L.L16.2L.L15.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L 2.L13.L.L.L13.L3.L.L7.L9.4L6.L8.5L6.L6.L2.4L6.L8.5L6.L9.4L6.L8.2L.L6. 2L4.L2.2L10.L.L17.L.L15.L.L3.L15.L3.L15.L.L17.L3.L14.2L.L7.L7.L.L.2L 6.4L16.L.L17.4L16.L.L7.4L15.2L.L15.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L.L14.L2.L.L6.5L6.L9.4L6.L.L6.L9.2L.L14.L2.L3.L 14.2L3.L15.L3.L5.L.2L6.L3.L5.L.L6.L9.2L.L7.L9.L.L7.L5.3L11.L.L17.L.L 15.L.L3.L15.L3.L15.L.L17.L3.L14.2L.L17.L2.L6.L3.L15.L3.L15.L.L17.L.L 17.L.L15.L.L.L15.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L .L.L7.L6.L.5L6.L7.3L2.L6.L.L17.L.L14.L2.L3.L14.2L3.L15.L3.L15.L3.L5.L .L6.L9.2L.L7.L3.L5.4L6.L2.L6.L.L13.L.3L3.L15.L.L17.L.L17.L.L7.L9.4L6. L9.4L6.L9.4L6.L9.4L6.L8.5L16.L3.L5.L8.5L6.L9.4L6.L9.4L6.L9.4L6.L7.L. 4L14.3L.L16.2L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L16.5L6.L 9.4L6.L3.L5.L.L17.4L6.L9.4L6.L8.L10.L.L16.2L.L7.L8.5L6.L8.5L6.L9.4L6. L9.4L6.L9.L.L7.L.2L6.4L6.L6.L2.L2.L2.L.3L3.L15.L.L17.L.L17.L.L17.L3.L 15.L3.L5.L.L7.L9.L2.L6.L3.L5.L2.L6.L.L7.L2.L4.L.L.L13.5L.L16.2L3.L4.L 10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L15.3L3.L5.L9.4L13.2L.L.L16. 2L.L16.2L3.L14.2L3.L15.L3.L15.L3.L15.L.L16.5L6.L9.4L6.L2.L6.4L6.L3.L 11.2L2.L.L17.L.L17.L.L17.L3.L15.L3.L5.L.L7.L2.L6.L3.L5.L2.L6.L3.L5.L. L7.L2.L6.L.L17.L2.L.L4.4L6.L2.L6.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.4L12.2L.2L.L16.2L.L16.2L3.L14.2L3.L15.L3.L15.L3.L15.L.L 15.3L3.L13.L.L.L7.L8.5L6.L9.4L6.L9.4L6.L9.4L6.L8.L10.L.L17.L.L17.L.L 17.L3.L15.L3.L5.L.L7.L3.L15.L3.L5.L9.L2.L6.L3.L5.L2.L2.L.L.L.L7.L2.L 6.L.L7.L2.L6.L.L6.2L2.L6.L.L6.L10.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L 2.8L2.8L2.L13.L.L.2L6.4L6.L5.2L2.4L6.L8.5L6.L8.5L6.L8.5L6.L9.4L6.L9. 4L6.L8.L9.2L.L7.L9.4L14.L.L2.L6.L.L17.L.L17.L3.L15.L3.L13.L.L3.L15.L. L17.L.L17.L.L17.L3.L15.L3.L5.L.L7.L3.L5.L2.L5.2L3.L5.L.L7.L9.L.L7.L7. L.L.L7.L8.2L.L7.L7.L.L2.L6.L3.L5.L2.L6.L3.L5.L2.L5.2L3.L5.L.L6.L10.L. L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L15.L3.L5.L.L7.L9. L.L7.L9.L.L7.L6.L.L10.L.L16.2L.L16.2L3.L14.2L3.L15.L3.L15.L3.L15.L3.L 14.2L.L17.L3.L5.L9.4L6.L7.L.L.2L6.4L16.L3.L15.L3.L5.4L15.2L3.L15.L.L 17.L.L17.L.L17.L3.L15.L3.L5.L.L7.L3.L4.2L8.2L.L7.L3.L5.L18.2L3.L5.L 19.L3.L5.L19.L.L7.4L6.L6.2L.4L6.L19.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2. 8L2.8L2.8L2.L13.L.L3.L15.L3.L5.L.L7.L3.L5.L.L7.L3.L5.L.L7.L3.L5.4L6.L 9.4L6.L2.L6.L3.L15.L.L16.2L.L16.2L3.L14.2L3.L15.L3.L15.L3.L5.L9.4L6.L 8.5L6.L9.4L6.L8.L8.3L3.L15.L3.L15.L2.L6.L3.L5.L2.L5.2L3.L15.L.L17.L.L 17.L.L17.L3.L15.L3.L5.L.L7.L3.L5.L2.L5.2L3.L5.L.L6.2L8.5L6.L8.5L6.L8. 5L6.L9.L3.L12.2L.L.L16.2L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L3.L15.L3.L5.L9.L3.L5.L9.L3.L5.L9.L3.L5.L19.L3.L13.L.L.L16.2L.L 16.2L3.L14.2L3.L15.L3.L13.L.L3.L15.L3.L5.L.L17.L3.L13.L.L2.L4.L.L3.L 15.4L6.L9.4L6.L9.4L16.3L7.L.2L6.4L6.L9.4L6.L9.4L6.L9.4L16.L3.L5.L.L7. L3.L4.2L8.2L.L6.L9.2L.L16.2L.L16.2L.L17.L3.L5.L9.4L6.L6.4L.L7.L3.L4.L 10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.L6.2L11.L.L7.L9.4L6.L7.L. 4L6.L8.5L6.L2.L5.5L6.L2.L5.5L6.L2.L6.4L6.L2.L5.2L.L7.L3.L15.L3.L5.L.L 17.L3.L13.L.L3.L5.L6.2L11.L3.L15.3L17.L.L17.L.L17.L.L17.L3.L15.L3.L5. L.L7.L3.L15.L9.4L6.L9.L.L7.L2.L5.5L6.L2.L5.5L6.L2.L5.5L6.L2.L5.2L.L7. L2.L5.2L.L6.2L9.L.L7.L9.L2.L6.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2. 8L2.8L2.8L2.L13.L.L3.L13.6L6.L9.4L16.4L6.L2.L6.4L14.L.L.L14.L2.L3.L 14.2L3.L15.L3.L14.2L.L7.L3.L15.L3.L5.L.L17.L3.L5.L5.L.6L6.L9.L2.L6.L 9.4L6.L9.4L6.L9.4L16.L3.L15.L3.L5.L.L17.2L17.3L8.L.L7.L3.L15.L.L16.2L .L16.2L.L16.2L.L16.2L.L6.2L3.L5.L.L7.L3.L4.2L9.L.L7.L3.L4.L10.L3.L5.L 2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L12.L.2L3.L5.L7.2L8.L.L.L14.L2.L3.L14. 2L3.L15.L3.L14.2L.L7.L3.L15.L3.L5.L.L17.L3.L15.L.L7.L5.L13.L3.L13.L.L .L17.L.L17.L.L17.L3.L15.L3.L5.L.L17.4L6.L8.5L6.L2.L6.4L16.L2.L6.4L16. L2.L6.4L16.L2.L6.4L16.L2.L6.4L16.L.L6.2L3.L5.L.L7.L3.L5.L2.L6.L3.L5.L .L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L12.L2.L.L7.L16. 2L.L.L14.L2.L3.L14.2L3.L15.L3.L15.4L6.L9.4L6.L9.4L6.L19.L3.L15.4L6.L 2.L5.2L.L17.L.L7.L9.4L6.L9.4L6.L9.4L6.L7.L.4L16.L.L17.L.L17.L3.L15.L 3.L5.L.L17.L.L16.2L3.L15.3L17.L3.L5.3L17.L3.L5.3L17.L3.L5.3L17.L3.L5. 3L17.L.L6.2L3.L5.L.L7.L3.L4.2L9.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L3.L14.5L6.L9.4L6.L9.L3.L12.2L.L.L14.L2.L3.L5.2L.L16.L 3.L15.L3.L15.3L17.L3.L15.L3.L14.2L3.L13.3L.L17.L.L17.L.L17.L.L14.L2.L .L17.L.L17.L.L17.L3.L15.L3.L5.L.L17.L.L16.2L3.L5.L19.L9.4L16.L9.4L16. L9.4L16.L9.4L16.L8.2L.L7.L3.L5.L.L7.L3.L5.L2.L6.L3.L5.L.L7.L3.L4.L10. L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.L6.L.5L6.L7.2L8.L.L.L14.L2. 4L6.L8.5L6.L9.4L6.L8.L10.L3.L15.L3.L14.2L3.L5.L9.4L6.L9.L.2L6.4L16.L. L17.L.L17.L2.L6.4L14.3L.L17.L.L17.L.L17.L3.L15.L3.L5.L.L17.L.L15.3L3. L14.2L3.L14.2L3.L14.2L3.L14.2L3.L14.2L.L7.L3.L5.L.L7.L3.L4.2L9.L.L7.L 3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L14.5L6.L9.4L6.L3.L4.L 10.4L6.L9.4L6.L7.2L7.L2.L.L16.2L3.L15.L3.L15.L3.L15.L3.L15.L3.L14.2L 3.L15.L.L7.L3.L15.L3.L15.L.L17.L.L16.2L.L15.3L.L17.L.L17.L.L17.L3.L 15.L3.L5.L.L17.L.L15.L.L2.L16.4L6.L19.4L6.L19.4L6.L19.4L6.L19.4L6.L9. L.L7.L3.L5.L.L7.L3.L5.L2.L6.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L 2.8L2.8L2.L13.L.L3.L13.3L3.L5.L9.4L6.L8.L6.L.L.L.L16.2L3.L15.L3.L15.L 3.L15.L3.L15.L3.L14.2L3.L15.L.L7.L3.L15.4L6.L9.4L6.L9.4L6.L9.4L6.L17. 3L.L17.L.L17.L.L17.L3.L15.L3.L5.L.L17.L.L15.4L17.3L17.3L17.3L17.3L18. L3.L5.L.L7.L3.L5.L.L7.L3.L4.2L9.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L3.L11.L3.L.L7.L6.3L9.2L.L16.2L3.L15.L3.L15.L3.L15.L3.L 15.L3.L14.2L3.L15.L.L7.L3.L5.L8.L6.L.L.L.L17.L.L17.L.L17.L3.L15.L3.L 5.L.L17.L.L17.L2.L6.L.L17.4L6.L2.L5.5L6.L2.L5.5L6.L2.L5.5L6.L2.L5.5L 5.2L3.L5.L.L7.L3.L5.L.L7.L3.L15.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L3.L11.L3.L2.L6.L.L17.L2.L3.L2.L3.L14.2L.L16.2L3. L15.4L6.L9.4L6.L9.4L6.L9.4L6.L8.5L6.L8.L6.2L.2L.L17.L.L17.L.L17.L3.L 15.L3.L5.L.L17.L.L17.L3.L5.L2.L5.2L3.L11.L.3L3.L5.L8.2L3.L5.L9.L3.L 15.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.L5.L 2.5L6.L9.4L6.L6.L11.2L.L16.2L3.L15.L.L7.3L7.L3.L15.L3.L15.L3.L14.2L3. L14.2L.L7.L6.L2.4L6.L9.4L6.L9.4L6.L7.2L10.L.L17.L.L17.L3.L15.L3.L5.L. L17.L.L17.L3.L5.L9.L3.L4.2L7.6L6.L5.L.6L16.L3.L5.L.L7.L3.L4.L10.L3.L 5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.4L6.L9.4L6.L2.L6.4L15.5L6.L9.4L 6.L19.L3.L5.L8.5L6.L3.L4.L9.2L.L16.2L3.L15.L.L17.L3.L15.L3.L15.L3.L 14.2L3.L14.5L6.L2.L4.L.L.L17.L.L6.2L19.L2.L5.2L.L16.2L.L7.4L6.L9.4L6. L9.4L6.L9.4L6.L19.L.L17.L2.L6.4L6.L3.L5.L8.L10.L2.L6.L3.L5.L.L16.2L2. L4.L.L.L17.L3.L13.3L3.L15.L3.L5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L3.L5.L19.L3.L5.L9.4L6.L9.4L6.L16.2L.L3.L5.4L6.L3.L14. 2L.L16.2L3.L15.L.L17.L3.L15.L3.L15.L3.L14.2L3.L12.L.2L.L17.L.L7.L2.L 6.L.L15.L.L.L16.2L.L6.L10.L.L17.L3.L15.L3.L14.2L.L17.L3.L5.L.L7.L2.L 5.2L3.L15.4L6.L8.L10.L2.L6.4L6.3L6.5L6.L2.L6.4L6.L2.L4.6L6.L2.L6.L3.L 5.L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L11.5L3.L5.L7. 2L9.5L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L8.5L6.L6.L2.L.2L6.4L16.L.L17.L.L 15.L.L.L16.2L.L7.4L6.L2.L4.L.4L6.L2.L6.4L6.L2.L6.L.L6.L10.L3.L5.L2.L 6.L3.L5.L.L7.L16.L2.L3.L5.3L5.2L10.L3.L13.3L3.L14.2L.L7.L3.L4.L10.L3. L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L12.L.2L.L7.L9.4L6.L8.5L6.L8.L6.L 3.L.L17.L.L7.2L8.L3.L15.L3.L15.L3.L12.L.2L2.L6.L3.L15.L3.L15.4L6.L9. 4L6.L7.L.4L15.2L.L15.3L3.L15.L3.L15.L.L6.L10.L3.L5.L7.L.L3.L5.L6.L2. 4L14.3L9.4L6.L7.6L15.2L.L7.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L3.L13.L.L.L7.L19.L.L17.L.L15.L.L.L7.4L6.L16.4L.L17.L.L17.L3.L 15.L3.L15.L3.L12.L.2L3.L5.L8.5L6.L8.L7.L.5L6.L9.4L6.L9.4L6.L2.L5.2L3. L15.L3.L15.L.L7.L2.L3.2L.L.L15.3L.L14.2L.L3.L14.2L3.L14.2L.L7.L3.L4.L 10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L13.L.L.L7.4L6.L9.4L16.L.L 17.4L6.L9.4L16.4L6.L9.4L6.L6.2L11.L.L17.L3.L15.L3.L15.L3.L10.L3.4L17. L.L17.L3.L5.L2.L4.6L6.L2.L6.4L6.L2.L3.2L.4L6.L2.L4.6L6.L2.L3.2L.4L6.L 2.L5.5L6.L2.L5.5L6.L3.L4.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L 5.L6.7L6.L6.3L7.4L.L17.L3.L15.L3.L15.L3.L5.L.L7.L4.L4.L2.L6.L8.L10.L 3.L4.L8.L.L3.L15.L.L14.2L.L.L15.3L.L14.2L.L3.L14.2L3.L14.2L.L17.L3.L 15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L14.5L6.L9.4L6.L9.4L16.L.L 13.5L.L17.L3.L15.L3.L15.L3.L5.L2.L.L2.3L.L17.L3.L4.L8.L.L3.L5.L9.4L6. L7.2L8.L.L.L15.6L6.L.L14.L.2L3.L14.2L3.L14.2L.L17.L3.L15.L3.L5.L2.2L 5.2L2.8L2.8L2.8L2.L13.L.L3.L12.L.2L3.L5.L9.4L12.5L.L17.L3.L15.L3.L15. L3.L5.L.L7.L4.L2.2L10.L3.L4.L7.L2.L.L15.L.L3.L13.L.L.L15.3L.L7.L16.L. 2L3.L14.2L3.L14.2L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L 10.2L3.L.L17.L3.L15.L3.L15.L3.L5.L2.L.L2.3L.L17.L3.L4.L7.L2.L2.L16.L 2.L5.5L6.L2.L4.L.4L6.L2.L4.6L6.L2.L4.3L.L16.2L3.L5.L2.L5.5L6.L2.L5.5L 6.L2.L6.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L3.L5.L4.2L3.L.L17. L3.L5.L9.4L6.L9.4L6.L4.L.L12.L3.L4.L7.L.3L17.2L3.L13.L.L.L17.L3.L14. 2L.L17.3L7.L.2L16.L.L16.2L3.L4.2L.2L6.L3.L14.2L.L15.L.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.3L2.L4.L.4L6.L2.L6.4L16.4L6.L9.4L5.2L9.4L14.L.L3.L 5.4L6.L9.4L6.L3.L15.4L6.L9.4L6.L19.L3.L15.L3.L15.L3.L5.L4.L.L12.L3.L 5.4L6.L2.L3.L.5L15.2L3.L13.L.L.L17.L3.L14.2L.L6.L10.4L6.L9.4L14.L.L3. L5.2L8.L3.L14.2L.L15.L.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.6L6.L2.L6.4L 15.5L6.L9.L.L17.L3.L14.2L3.L5.L9.4L6.L9.4L6.L19.L3.L5.L7.L9.3L3.L15.L 3.L5.L4.L2.2L9.2L3.L15.L3.L4.L8.L.L3.L12.L2.L3.L5.L.L7.4L6.L9.4L6.L2. L6.4L15.2L.L7.L2.L5.2L.L7.L8.L10.L2.L5.5L6.2L8.L3.L5.L2.L5.5L6.L2.L4. L.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.3L3.L5.L9.4L6.L7.L.L3.L5.L19.4L6.L 6.L8.L.3L3.L5.L4.L12.L.4L6.L3.L14.2L3.L15.L3.L5.4L6.L7.L.L3.L5.L6.L2. L3.L5.L.L7.L2.L3.2L.L.L16.2L2.L4.6L16.L3.L15.L3.L4.2L.2L6.L.L15.3L2. 2L5.2L2.8L2.8L2.8L2.L10.5L6.5L3.L13.L.L3.L13.L.L3.L15.L3.L5.L.L7.L3.L 15.L3.L15.4L6.L9.4L6.L2.L6.L3.L4.2L.L17.L.L7.L8.L8.L.L.L14.L.2L.L17.L 3.L14.2L3.L5.2L8.L.L15.3L2.2L5.2L2.8L2.8L2.8L2.L11.L.3L.L7.L9.4L6.L9. 4L6.L5.L.L11.L.L7.4L6.L5.L2.2L.L7.L9.4L6.L8.5L16.L3.L13.L.L3.L13.L.L 3.L15.L3.L5.L9.L3.L5.L9.4L6.L9.4L16.L3.L14.2L3.L5.L.L17.L.L7.L2.L6.L 3.L5.L18.2L.L14.L.2L2.L5.5L6.L2.L5.5L6.2L8.L.L15.3L2.2L5.2L2.8L2.8L2. 8L2.L12.2L.L.L7.L17.L.4L6.L2.L6.4L16.L.L7.L2.L2.L2.2L3.L15.L2.L6.4L6. L2.L6.L.L15.L.L.L7.L18.2L3.L5.4L6.L2.L6.4L15.2L3.L15.L3.L13.L.L3.L13. L.L3.L15.L3.L13.L.L3.L15.L3.L15.L3.L14.2L3.L5.L.L17.L.L17.2L8.4L6.L8. 5L6.L2.L3.L2.L.L16.2L3.L14.2L3.L15.L.L15.3L2.2L5.2L2.8L2.8L2.8L2.L12. 2L.L.L7.4L6.L9.4L6.L7.2L10.L.L7.L3.L5.L5.L2.L10.L.L7.4L6.L9.4L6.L2.L 6.L.L17.L.L7.4L6.L9.4L6.L7.2L9.2L3.L15.L3.L13.L.L3.L13.L.L3.L15.L3.L 5.4L6.L8.5L6.L9.4L6.L9.4L15.2L3.L5.L.L17.L.L16.2L3.L12.4L.L16.2L3.L 15.L2.L6.L3.L5.L9.4L6.L7.3L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L7.L5.L.6L6. L5.L2.5L6.L9.4L6.L5.L2.L7.L.2L3.L15.L3.L13.L.L3.L13.L.L3.L15.L3.L5.L 18.2L3.L15.L3.L15.L3.L14.2L3.L5.L.L17.L.L16.2L3.L5.L6.4L.L16.2L3.L14. 3L18.L.L15.L.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L15.L.L3.L5.L.L7.4L 6.L2.L6.L3.L5.L.L7.L9.L.L7.L9.L2.L5.2L.L7.L3.L5.4L6.L9.4L15.2L.L17.L 3.L15.L2.L4.L.L.L13.2L2.L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L7.L7.L.4L 6.L9.4L6.L9.4L6.L8.5L6.L7.L.L2.L2.L2.2L3.L5.L.L17.L2.L6.L3.L5.L8.5L6. L9.4L6.L8.L10.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L15.L.L3.L5.L9.L3. L5.L7.L.L3.L5.L9.L3.L5.L7.L.L3.L5.L19.L3.L5.L7.6L6.L6.L8.2L2.L3.L15.L 3.L13.L.L3.L13.L.L3.L15.L.L15.L.L3.L15.L3.L15.L3.L14.2L3.L15.2L18.L3. L5.L5.L2.2L.L16.3L17.2L3.L15.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L 2.L13.L.L.L12.L.L2.2L13.L2.3L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L6.5L6. L9.4L6.L9.4L6.L9.4L6.L8.5L6.L2.L6.4L16.L2.L2.L2.2L3.L5.L2.L4.L.4L6.L 2.L5.2L3.L15.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L12.L. L2.4L6.L4.L2.L11.L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L5.L11.L3.L3.L11.L 3.L14.2L3.L13.L.L3.L5.L5.2L2.4L6.L7.6L6.L9.4L6.L9.4L6.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L.L12.5L7.4L3.L15.L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L6. 5L16.4L6.L3.L4.L10.L3.L14.2L3.L10.L.L.2L.L7.L3.L4.L10.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L.L14.2L.L.L7.L7.L9.3L.L7.L8.5L6.L7.L8.2L.L.L7.L 9.L.L7.L8.5L6.L7.L10.2L3.L15.L3.L15.L3.L13.L.L3.L13.L.L3.L15.L.L6.2L 2.L6.L.L7.L3.L15.L3.L15.L3.L14.2L3.L5.L2.L3.2L.4L6.L2.L4.6L6.L2.L4.L. 4L6.L2.L5.2L.L16.2L.L7.L3.L5.4L16.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L. L.L14.L.2L.L7.4L15.5L6.L9.4L6.L9.L.L7.4L6.L.L15.6L6.L16.L.2L.L7.L3.L 5.4L15.2L.L7.L2.L5.2L3.L14.2L3.L15.L3.L15.L.L7.L.2L6.4L6.2L.L6.L.L15. L.L.L7.L.2L6.4L6.L7.L.L3.L15.L3.L15.L3.L14.2L3.L4.2L9.L3.L13.3L.L15. 3L.L15.L.L.L16.2L.L16.2L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13. L.L.L16.5L6.L9.4L6.L9.4L5.2L9.4L6.L18.2L3.L5.4L6.L.L6.L10.4L6.L9.4L6. L9.L3.L15.L.L7.4L6.L9.4L6.L9.4L6.L2.L6.4L5.2L9.4L5.L8.3L3.L15.L3.L15. L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L14.2L3.L15.L3.L15.L3.L14.2L3.L 5.L2.L6.4L6.L3.L5.L2.L5.5L6.L2.L6.4L6.L2.L5.5L6.L2.L6.4L6.L2.L6.L.L 17.L.L16.2L.L16.2L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L 17.L.L7.L4.L2.6L6.L9.4L6.L5.L2.2L3.L5.L.L7.L7.L.4L6.L9.4L6.L9.4L6.L9. 4L6.L9.4L6.L7.L.4L16.L.L7.L3.L5.4L16.L3.L15.L3.L15.L3.L14.2L3.L4.2L.L 7.L3.L4.L10.L.L6.2L18.2L.L6.2L19.L.L6.2L18.2L.L7.L19.L.L17.L3.L15.L3. L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L15.3L3.L4.5L16.L.L7.4L6.L3.L 4.L8.L.L2.L3.L2.L3.L15.L2.L3.L.2L.L17.4L6.L3.L3.L.L.L15.L.L3.L15.L.L 17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L4.L10.L3.L15.L3.L15.L3.L14. 2L3.L4.2L2.L6.L3.L4.L10.L.L6.5L6.L19.L.L6.5L6.L9.L.L6.5L6.L19.L.L7.4L 6.L9.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L14.L.2L 3.L5.4L6.L9.L3.L5.4L6.L3.L15.L.L17.4L6.L5.L.6L16.L3.L5.4L6.L3.L4.5L6. L2.L6.4L16.L3.L15.L.L17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L5.4L6. L9.L3.L15.L3.L15.L3.L14.2L3.L5.4L16.L2.L6.L3.L5.3L7.4L5.L10.L3.L5.3L 7.4L5.L10.4L4.L11.4L16.4L16.L3.L5.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L.L17.L.L13.L2.2L3.L5.L6.L8.3L.L3.L5.L6.L12.L3.L15.L.L 17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L5.L.L7.L3.L4.L10.L3.L15.L3. L13.L.L3.L15.L3.L15.3L5.L11.L3.L5.3L5.L11.L3.L5.3L6.L10.L3.L15.3L17.L 3.L5.L.L17.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L6.2L15. L.L.2L13.L.4L3.L15.L.L17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L7.L3.L5.4L 4.L11.L3.L15.L3.L13.L.L3.L15.L3.L5.L.L16.2L.L7.L9.4L15.2L.L7.L9.4L16. L.L7.L9.4L6.L9.L.L7.L9.4L6.L19.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L.L17.L.L6.2L3.L11.L.L.4L6.L4.L.7L16.L.L17.L3.L15.L3.L15.L3.L13. L.L3.L15.L.L16.2L3.L4.L10.L3.L15.L3.L13.L.L3.L15.L3.L5.L.L16.5L6.L2.L 6.L3.L14.5L6.L2.L6.L3.L15.4L6.L2.L6.L3.L15.4L6.L2.L6.L3.L14.2L3.L15.L 3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L6.5L6.L6.L7.4L.L3.L15.L.L 17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L16.2L3.L4.L10.L3.L15.L3.L13.L.L3. L15.L3.L5.L.L16.2L.L15.3L.L15.L.L.L15.L.L.L15.3L3.L15.L3.L5.L2.2L5.2L 2.8L2.8L2.8L2.L13.L.L.L17.L.L6.2L2.L6.L.L6.2L19.L3.L5.L.L7.L9.L.L7.L 6.L.5L5.2L5.L13.4L6.L9.L.L7.L9.4L6.L7.L10.2L3.L15.L.L17.L3.L15.L3.L 15.L3.L13.L.L3.L15.L.L16.2L3.L4.L10.L3.L15.L3.L13.L.L3.L15.L3.L5.L2.L 4.L.4L6.L2.L4.6L6.L2.L4.L.4L6.L2.L4.L.4L6.L2.L6.L.L16.2L3.L15.L3.L5.L 2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L6.2L8.2L.L7.4L6.L9.4L6.L9.L3.L5. L9.L2.L3.L.2L3.L5.L2.L3.L2.L.L17.L2.L6.L3.L4.5L6.L9.L3.L5.4L6.L.L6.L 9.2L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L3.L13.L.L3.L15.L.L16.2L3.L4.L 10.L3.L15.L3.L13.L.L3.L15.L3.L13.L.L.L15.3L.L15.L.L.L15.L.L.L17.L.L 16.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L7.L9.4L6.L5.L2.5L6.L 5.L.L.4L6.L9.4L6.L6.3L9.2L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L3.L15.4L 6.2L.L6.L3.L5.4L6.L18.2L3.L5.4L6.L9.4L6.L9.4L6.L7.L.4L6.L9.4L6.L7.L. 4L6.L9.4L6.L7.L9.L.L.L15.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L2. 8L2.8L2.L13.L.L.L17.L.L15.6L6.L9.4L6.L7.L.L3.L5.4L6.L9.4L6.L9.L.L7.4L 6.L3.L13.3L.L17.L3.L4.5L6.L9.4L6.L7.2L9.2L3.L14.2L3.L15.L.L17.L3.L15. L3.L15.L3.L15.L3.L15.L.L17.L3.L13.L.L3.L15.L3.L15.L3.L13.L.L3.L15.L3. L13.L.L.L17.L.L14.L.2L.L15.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L 2.8L2.8L2.L13.L.L.L17.L.L14.2L.4L6.L2.L6.4L14.6L6.L9.L3.L5.L6.L.L10.L 3.L4.2L18.2L.L7.4L6.L2.L6.4L15.2L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L 3.L15.L3.L15.L.L17.L3.L13.L.L3.L15.L3.L15.L3.L15.L.L7.L9.4L6.L9.4L6.L 7.L.4L16.L.L14.L.2L.L15.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L 2.8L2.L13.L.L.L17.L.L14.2L.L3.L5.L9.4L6.L9.4L6.L9.4L6.L15.L3.4L6.L6.L 2.L3.L5.L9.4L15.2L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L3.L15.L3.L15.L.L 17.L3.L13.L.L3.L15.L3.L15.L3.L15.L.L17.L3.L15.L3.L13.L.L.L17.L.L14.L. 2L.L15.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L 17.L.L12.2L.L11.L2.L4.L.L3.L13.L.L3.L14.2L3.L15.L.L17.L3.L15.L3.L15.L 3.L15.L3.L15.L.L17.L3.L13.L.4L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L 6.L2.4L6.L6.2L9.L.L.L17.L.L16.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L 13.L.L.L17.L.L14.L.2L.L7.L7.L9.3L.L7.4L13.L2.L.L7.L6.L12.L3.L5.L7.6L 6.L9.4L6.L19.L3.L15.L.L17.L3.L15.L3.L15.L3.L15.L3.L15.L.L17.L3.L13.L. L.L17.L3.L15.L3.L15.L.L17.L3.L15.L3.L12.L2.L.L17.L3.L12.4L.L17.L.L16. 2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L14.L2.L.L7.4L15. 5L6.L6.L2.L3.L15.L.L7.4L6.L9.L.L7.4L6.L.L6.5L6.L2.L6.4L13.L.2L.L17.L 3.L4.L10.L3.L15.L.L17.L3.L15.L3.L15.L3.L15.L3.L15.L.L17.L3.L13.L.L.L 17.L3.L15.L3.L5.L9.4L6.L9.4L6.L9.4L6.L6.L2.4L6.L9.4L6.L5.L13.L.L16.2L 3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.4L6.L9.4L6.L9.4L 5.2L9.4L6.L9.L2.L3.L2.L3.L15.4L16.L3.L5.4L6.L.L5.L.L3.L5.L9.4L6.L6.7L 6.L8.5L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L9.4L6.L8.L10.L3.L13.L.L.L17.L3. L13.L.L.L17.L3.L15.L3.L12.L2.L.L17.L3.L13.L.L3.L12.L.2L.L16.2L3.L15.L 3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L7.L5.L2.5L6.L5.L.3L2.L5.2L .L13.L2.3L18.L3.L15.L.L7.L8.L10.L3.L15.L3.L15.L3.L13.L.L3.L13.L.L.L 17.4L6.L7.L.4L6.L9.4L6.L9.4L6.L6.2L.4L6.L7.L.4L6.L7.2L9.2L.L16.2L3.L 15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L13.L2.2L3.L5.L.L7.L9. 4L6.L9.4L5.2L9.4L6.L3.L13.L.L.L7.L9.L2.L6.L.L16.2L.L7.L6.L.5L6.L9.4L 16.L.L7.L2.L4.L.4L6.L2.L6.L3.L15.L3.L13.L.L3.L13.L.L.L17.L.L15.L.L.L 17.L3.L15.L3.L14.2L3.L13.3L3.L13.L.L3.L13.L.L3.L14.2L.L16.2L3.L15.L3. L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L13.L2.2L3.L5.L.L7.L2.L6.4L6. L2.L6.L3.L14.2L3.L5.L7.3L.L7.L3.L5.L.L7.L18.2L.L14.4L3.L15.L.L7.L3.L 14.2L3.L15.L2.L5.2L3.L5.4L15.2L3.L13.L.L.L17.L.L15.L.L.L17.L3.L15.L3. L5.4L6.L9.4L6.L2.L6.L.L16.5L6.L2.L6.L.L17.4L6.L2.L6.L.L17.4L6.L2.L6.L .L6.L9.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L13.L2.2L3. L5.L9.L3.L5.4L6.L8.5L6.L7.L.4L6.L2.L6.4L4.L.L17.L.L.L17.L2.L3.2L.L3.L 15.L.L7.L3.L14.2L3.L15.L3.L5.L9.L3.L4.L9.2L3.L13.L.L.L17.L.L15.L.L.L 17.L3.L5.L19.L.L7.L2.L6.L3.L5.L9.4L15.2L3.L5.L9.4L6.L9.L3.L5.L9.4L16. L3.L5.L9.4L6.L18.2L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L7.L9. 4L6.L6.3L6.L.3L3.L5.L9.4L6.L16.L2.L.L17.4L6.L9.4L6.L2.L6.4L16.L3.L5. 4L16.L.L7.L3.L14.2L3.L14.5L6.L3.L5.4L6.L8.5L6.L7.L.4L6.L8.L8.L.L.L17. L.L7.4L16.L2.L6.L.L7.2L18.L.L7.2L6.L11.L.L17.2L18.L.L7.2L7.L10.L.L15. L.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.L3.L5.4L6.L9. 4L16.4L6.L3.L10.L2.L.L.L17.L.L15.L.L3.L13.3L3.L15.L.L7.L3.L5.L2.L5.2L 3.L5.4L16.L3.L4.2L.L16.2L3.L13.L.L.L14.L2.L.L17.L.L7.L3.L15.L.L7.4L5. L10.L.L7.2L8.4L5.L10.L.L17.4L16.4L4.L11.L.L15.L.L3.L15.L3.L5.L2.2L5. 2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.L3.L5.L19.L3.L15.L3.L5.L4.L.L.5L6.L 7.L.4L6.L7.6L6.L8.2L3.L4.2L9.L3.L4.L10.4L6.L3.L5.4L15.2L3.L13.L.L.L 14.L2.L.L17.L.L7.4L6.L8.2L.L7.L3.L5.4L6.L19.L3.L4.5L6.L19.L3.L5.4L6.L 9.L3.L4.5L6.L17.L.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L 7.L7.6L6.L5.L.L7.L.L.2L18.L.L15.L.L3.L13.3L3.L14.2L3.L15.4L6.L3.L5.4L 6.L9.L3.L15.L.L16.2L3.L13.L.L.L14.L2.L.L17.L.L6.L9.2L.L7.L3.L5.L18.2L 3.L4.2L18.2L3.L5.L19.L3.L4.2L17.3L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2. L13.L.L.L17.L.L15.3L3.L5.L7.6L16.4L6.L9.4L6.L3.L4.L6.L.L.4L6.L8.L8.L. L3.L13.3L3.L14.2L3.L15.L3.L4.2L.L7.L3.L4.2L9.4L6.L8.5L6.L7.2L7.L2.L.L 17.L.L7.4L15.2L2.L5.5L6.L2.L5.5L6.L2.L6.4L6.L2.L4.L.4L6.L2.L6.L3.L4.L 7.L2.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L13.L3.L3.L15. 4L6.L9.L3.L15.L3.L10.L4.L3.L13.3L3.L14.2L3.L15.4L6.L3.L5.4L5.L9.2L.L 16.2L3.L11.L3.L.L17.L.L14.L2.L3.L13.3L3.L13.L.L3.L14.2L3.L12.L2.L3.L 15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.L2.L5.5L6.L2.L6.4L 6.L2.L6.4L16.4L6.L8.2L3.L5.4L6.L9.4L6.L4.L4.4L6.L7.6L15.2L3.L15.L3.L 14.2L3.L5.L8.5L6.L8.5L6.L5.L2.L10.L2.L3.L.5L6.L2.L4.6L6.L2.L4.L.4L6.L 2.L5.2L3.L12.L2.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L 17.L3.L15.L.L15.L.L.L12.2L3.L3.L13.3L3.L14.2L3.L15.L3.L5.L6.L.L9.2L3. L10.5L8.L.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L13.L.L.L17.L.L17.L3.L 15.4L6.L2.L6.4L6.L2.L6.4L6.L2.L6.4L6.L2.L.L.2L.4L6.L2.L4.6L6.L2.L5.5L 6.L2.L2.L2.5L6.L2.L.6L2.L4.L.L3.L15.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L5.L .L7.L8.5L16.L.L17.L3.L15.L3.L15.L3.L15.L.L17.3L12.2L.L11.L3.L11.2L2.L 3.L10.5L7.L2.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L5.L.L7.L.2L5.5L6.L8.L10.L 3.L15.L3.L5.L9.L3.L15.4L6.L2.L6.L.L7.L2.L.2L.L.L2.L6.4L6.L2.L2.2L2.4L 6.L2.L.6L2.L3.L2.L3.L5.L2.2L5.2L2.8L2.8L2.8L2.L12.2L.L3.L15.L2.L6.L3. L4.L8.L.L2.L6.L3.L10.5L6.L3.L3.L10.5L7.L.2L2.2L5.2L2.8L2.8L2.8L2.L5.L 2.L3.2L.4L6.L2.L6.4L6.L2.L6.4L11.5L6.2L.2L3.L5.L4.6L6.L.2L2.2L4.3L2.L 4.2L.L.L5.3L.L5.L2.2L11.L.L.2L.2L$M37IJ46.pAKpAKpA7K! golly-2.5-src/Patterns/JvN/NP-mutation.rle.gz0000644000175100001440000004525612156145314016022 00000000000000‹Ö INP-mutation.rleí}[wãHræ{ü ú¸÷l÷Ù4‘H±ÏzËc{— <¶Ôjûm稪X]ò¨$­¤êšÞ‡ýí›y‹¼àFµ$@Å"¢Hdd"ã‹/##/øÛÅ›ÅýþêÃîö·w7ï?¿»¼þeñéâÝÇËëý÷‹/—‹‡‹ÛýâáãÅÃâãÅýâí~½øôùáâaÿþvqy-ÚK!ïn®ß/~Ù_ïï..o®³ÅÙgõ“·ø|ýpyEß\ïÿú°xwsû›LïD^¼ß/.¤ Jƒò¥Y„«+ùûânÿëþâjÿ>[È4ßnþëýâþóííÍý^&¸Á+.ð‹»Ëûýß|'/‘ï¾¹[|º¹Û/Þï..¯¾—eÜ/þôox«W—ï.nî²»«}¶8ÿh.Á’\Ý|Y\Üíeúw7ŸÔm¸”×ÁßÊïþÐú~îªÌÛ»ýýþZVš¬²éêÛß_ü*¿ºù~ñs¶ø6ßlªïo®—Ÿn¯öŸäª n>,~•Úþtq}-o\&mË&[¼¹{¸üpùîòâjÑ\~Ø/Ä·åw?ÅúEUfºŸ¯/ÝßÝËK¤Òîî>¿“•±¸¼_ü"¿¿6—ù^ê_e1î©*0ëÛý»Ë¿‘šlr]Î Yø÷²à²z¯X‘><ìïHß²¤R¦Ä¾÷à!Ï¥Œ·ûßî—÷^Öß/ÞÝíeeÈûD€(²œò×_Í׋ý_åÿ)*ùV¢E^}¦5Ž¥|¸øËþ^jøæ³”´ÊŠrÿßò%Ãí}¶ø„ýÕÅÝ/²Ô÷û[¼éËÿ+S}{ò¿O²¦>^þòq÷ÌdqÿñæóÕûÅÍõÕo$ZVÞ‡ý—ŧËëÏ2Å Ö¦LÿéæýþîÚV •êü£¬qs÷òô‹¬:)ånÿËÅÝ{ “‹{ªŸ—w÷1&¤€úæãu_/ï*bŒXµË´\ñ7·tïòŠK,î%Šo/ÞéR¾ùüðñæîþGY‰×Òfºy{yuIzøùÓÛýüÊâ«úó•„ùÃúºBTæõ#ÚûÃÃí?üðåË—ìö}vyýá:»|øáÿÝ]Óõ?|ùÏ_¯¸¼~¿ÿköñáSÿõŸÿünuõƒ»r}¹üËåíþýåEvs÷Ëø¿þýæúϺšþlëáϬü¬îÿOi³ÏùáŸ~½¹úŒ•þCýëŸ~èbU_oo>?Xˆÿ¨5í`Îi€.»•—Ý-.ÞÞüº_|‘:wuqùɱÚÛ«=ž2›'(ïoe6×7’¹>ÑMX®x@X¡ IŽ÷—˜üB•ÍFJÎÿŠ`•¹‹åòD’<š’dáWHDªw’ò$.äý.îPŸ$îâý{U*)çÞ\]ýöýâýå{´·’û?í]~òš;â~ŽïëŇÏWWÙâ§Ëëw{,8i†dÿ*áA·úí%¶2ïe!U¤†ëý^æü7dnxñõþÝþþþâî7]˜/w—²:nc?ÈrÝ|A$ã {ì…fB‘Vòõ¿ÿiñqu++ÿ—=ê·?Ÿ5J ßiÒø¥Æ;²MiMWÒèe½\]|1š{¿¿¿üåºM£ÀsTÛÃ…¬ORŒÂÄâê’˜AÒ§D.–R>ýúöæýoæJËžHh°Ÿï‘¸dv7²¢>a­ãWN¬,¦d¿KY¢ŒïMcz-ÙUSï— › VÖ–ÍSÞAº7(DÓ&ɹ”¬ü)Éqí$A ÓÝa#Jˆæ¥ÃÜö×ß4i¾•ʦ Øø°—~©F}_n”YÉw—DÞX÷Wûíœü|e¹G’üðBÜ+dHIŸTѾ`‹õ‰jÝYT-ëO¶#ÒèÞ£rÐùAS–BoîUƒ²¿hê”U%+õžÐloRʹ¸’õ{On Yð/—×ÊÊóež“·q·ÿ€n ƒ¼øæîR^z!í ¥0L¡æÞã-%ÝX×÷x_ïo>¿}¸'û‘2Èxd9ïu[rCZÓ¬ŽH’±¿d…Ë{âïu«N-µ'+[*X5l·W²MXÜ YR“v'µuqýË•b¢{ɸ÷ê×·W×!lkUJ¼£ù0Јþð‘¹' I íåM(5îöòæöªíÃf×3·¿™¦;/þK¶øçÏwh¢heŸdÕ©´ÊÞßQ»Œ *«H’ Y§Dˆä™;4Ù΋¢¬†Ï2t©Yüt‹n„Ö zŒ?ýùüÓŸßü[öO’5.ɾS …»wwyû``.ËúãâüòÓâ}~x·ÿße5géüï‘–v•ÉÌþ‡I+I}}¿ÿqqûù­<—uÆØÛÚ`ËâHO !–D"¿B2 ða¢)qòùîªø=ÞîûK‰äË·ŸµÃîµðˆà‹«ûéXa“sù ‘©üCÉn0äh(–Õn)XcMÝ^ÈZ¸»K‚*&þ•õüɾ‹oÉ—ùòñòÝGÕd\9~§€úw¿Ã?t•~½¦&íçëË¿.–Yþ}ì¼Pý éé/þ^øþNÞ÷oÙ½4²ß¤Û¡úÿª-uñ7Òá’ŽV„æYÆ}£ŒyEäëó:“¼ý=™Ù÷è¢7i¼J”µ íü—»‹OX!R‚ø;kvtL\d|‰fg^&}]Ñ/&s‡,þU¿T‘Õöç|µeÿÏåõ«è/Ê eÒUKw{ú§ZžàOîFõ½6êõ ¸«2ÊüªÌVˆ»¢.âûÇ*Yÿ:v?ÂÜiúg*¼_(yXŠ(¹‘ÁöžJHÉK¼ÃŠNkYØïäB^+d•«/ÊVHÖƒ|¯õu優Ivø™¼ªð¥Õünð…ªÅk@‰ò$™ûi2{™'*_oërkJIt›—Y!e‹àò¸}#vM-x"|y÷\ᵺZ¬1»Û7%}ç߉ºá­»²ÎW²,eÖDW*ÄîØ•"+µX#™[H2Ií].µY—ô£¹Øª^Õ–/u€wT²[B+C}«‹D-Ý6'åZö¨ì5H£CY\”)²Ï,efIbá’› t…ç…L‘¾*À™¼RœÚ+eÑêìÎÍŵ­yݶv×ÕÙYvzޝ³sYMRëörº3y9—Ÿ«b¨f—«Û“ ’×ÉßÙbéC&>;¥—'XäVœÆÜY½»}³:• #­ÕøLÝ“„RÙi}’A±5)}zÖ$m®—Ùw!ÿU;›,}Û—NYÔ ݱD.Ë-hØ…‰Ðöj,u¹ó“udµJeåe—È)kèîLÀO×~[D[[Â7/ û²ÿõÓÊã®àIóT¶wÉš~õ{žñ_Q}k“Zj6­ø•C8`eZÔéEj­ËZgöFéüz¦‚øz¢Í0mÑ‚‘}”L‰ô'cì_Kösãê³é8Ë™¤.%„¤ty…DP.®,ºÊ-6!Z[T«ö ë,Ô~íhÍ jy £: 5Ó·«Rî’ÚS÷Y8õ75Ø*ñF—¥ÐõKiˆ…‡k›DVíJ6‡&•É‘R®°øž±œVÚ›*ŒbLÙ’ÑFd…Ø{7Ès*7£HYnD ÷tv,e]äx1¶g®0ŠÜ¨":½ t_n™ jë†pFŠõR)Ÿh§AJ%­Pœ%è,7*™l¶Â¿VœDj‡½Pz>ºÅSÊ;§v‚ª`ƒ÷#%mK.Ü6–Ôš˜¢œak$‹ºF0¡ZQf†è—à5éð;–êL–ܤÂk³­Nϰ ¤ŸCi„¼ëKsþS^š˜ª³”Õ3Ià6hlô] ù·&_ ±Ò¤§Ž9<%Å¥š]™g2LEµ¯K+•Èqé¾ hÜ}¯•f ›¼Î—;Y(.Ác'¯ç?ÉjnJ'c«Š )àl pEq€ÀV•ò4šŒ¡‹“ìlõmBT‘гŸј\ íj¡üSº²¢ïÄé9HFI%Ò²µRîq*}¥LSdª££ Yº gòC:߯ ›ó*‹“‰&¬‹ÔíCÓ’îö 5c•‚sNþ¤¯F„d¦³Ås–€È—™õ¡ÔÇ:S]ï¶•¥Õu]%Õ:‘Ë­ñôéErêÆ"Bvz„ßïU’Öº0B¹Þ™¶©zç P&ü®*Rìd#_RשYé’“örW]/•8ƒ&S¦®¤ !%S7d+2¼ÐûÚ9Q ­&³å#ñ%£;÷ùþ ’=y[Y"-©ÞÖA{°‹d aß*”ubE( 5Û ¦îUj`ÉE#›PUFö§OxrM}õŽb*²C€‰©!)¤C©sat-›•s¾"w@`#d3/P® 9.xW'êòz1¤P›·ÐJbeÇÜ)+ȵ>‰™*άÊ/e%P¥¨u~NT•‚>r›*OsN]›ÒTõáY‘\±˜( YõvwN>½l‚rulÎËSW6Šïdm 8Ë J)j"â‚ß’¼)’͹.ªµfIuù™½âBŒðR·.çH¥§ºhN3÷ÛVñ¥b|ÕBäÔVA‘0}S)«VEQa¨TšéœÕjR¢ˆÖg ¦ÎŠŸTí¡L@‹ñ°W­¶±„Át&=“š…£´C†î}f¾U…Fðª¶7NÞdR§ÒŠ‚´ä‡à_n²Tt®mÐã’P(¼Â‚NFym4RiÁÛxަ‹McF’×õ”µ""|˜šw‘¿Ÿž‡›™î‘‘,Xc7g“m 'Yìï2°ݘ[±` ¢ê‘ÊHbë"Œî¾ 7B²¥š"ÿAIUw®C¤U AðlMo9(‰(S.!….ÑeM¡HÞ¤# ¤H’l_¤›‹M|µ X,S(¢Ê KŸW’FÞ]&ÄàÕ&ű\ÅðI&Dõ±çäZï¬P<Έb.ÎCå¶PK61G­¸õ˜Â4ÀIdB4uv66ê ªÈWÕ`»­¥Â0dzw°D‚v7»p6›,.çÊðSßWÎ`¤£ í`ʹÊú'­èL‚S•dWŒ» ÚÿÎ"l¦¡©³>îfz;öÕ".D%øµTó¡¼Xâ¶…¡’Bu²Âñ¿@´Ì_J†UÁGZóát‰o Lbó\â(ç&ÛzÎI‰¬ Çnä6 þ„¦ØÉ¦× µÊEÁ$ÖjÌ—F~~IÛôÉ>6²šWô‡¾_EÇ|S‘¬ZÄ¿4º‚Gëæ¥ke:BŒ m¨â¡bZ`º0õŸÅ¦Ï6àñwóõ5[Ë:E„wÁÿʽI‰ù Õcí¦MY³ÇìË ÑÖâK?ƒÔ—îLîÒ‹, JÅUVqP”Cll:u23!‘ ×±³Ðþ N…b­t·^*SÓô8@{“«“ù±îD“/ ijïÿž‘¥u…ÌX*sÃwÂÓ›]­LSH¨+=H0ü-”S’Ÿ,•ƒRª8zO!DèΓ֗°­Vê íJ›TQ…zcb-½ß|•Ô´¯ÕxnóÂ:`ÖûÚ¹ƒ¬h K’/å•Ò8® qJ*ažlg^³Óê·`†ìw¾ýÞ¶ßã¶ËǤaƒÊiwEåªM§ñßTømFBb½ég€-uÓÐnêLkã¢eÞa¥Ó…þŒ„è^~W{šîòC2`â–LûiE—I~_(b.VŠ•Ç+z¢UûbB EzÑ€tÿƒõùS³~W¾L5»h—NºO¾§Q)3âL¦â®S V¤ÑãjéÜ]ÝdBžsË=p€a6Mس1.­RÃïe„Œó;,ÊðV«~M¡Vf"$¼k7¿ÐûͯÒ!¹¨Û n¼ïð ÂÌèíÉ…¸®BÀ¤k¿³Ñk†à)±”_¯Ç³åäq?M!ÎKÏÁd=´Ë7ÝÖ R³Kw-“‘Ÿù&BÒªmyR²×‰èLLÍ67t;Rϳ2žiA ä‚«ˆ"Z7zì㨛gÕMÑ?‘um¸:S‘ƒWÃÇ%:« ÌãòS Ê“AUåezÐ?Õ)À»õƒxÖjµ‘êÉiB,)ÿ¢mèdÌß š¯—¢ÕÌ"k]C(ë–¡èPËmÆ\.-9CŽ-r¿ý;˜¬ùLWHZã\Ø£¨[ÓkÌf›ì¶lÖùq8û©…$Ü_O'Ýo7ca3Ü„O*­[£ÚÉUÊëb¢v‰ñëµùoBm¾Ižlй¶û›p6 !‚Ù‰í/ZÃQ*`ñ£`œ³ÝÚ6KdãžàìT ;c!Iýa@§0s9èÖ*®°ÏY榠ؗ®•W ¤E±¤ ÝÖ™Ìñ!Ò­³>÷Æ)F Géi…´Ót‘c6eÐL¨(guê1o©Ø ù\­Ì_ˆ,Mšy·EÇú I? ë÷J3=jX¾«<Ðôªå ñÜâ” ³>lËžåéFòœÝæÊ”WKóAº-Cݺ¿‰º£ó⸠eô£:³~GV™*ôšñæŒS‡pÈNŪÓ¬Ù™ IîÍ4¤ºÈ-°ð(ß³yIú¶­4-Ðê‹vÓŸyÝNKˆ°ú§ëH­¥n;ô“Gü ­}*má+R5°Z¥ÜêØtmvY±–]h'\p5¢Ÿ=µZ™‘a磭V}Áƒ4éYãÊ×&<¾£<;–|^!*dµjYîé/p¾)¨B_–t©P¬ÝâËmRê&M)ýë}nèÏ\ÕûªŠ|«-ƒ…„]è¡uŽ ­ûød%ÿN‚ŽX¤üQºŸlÍN_ˆÑ}r.«ÐÁë$ÌWxüy‚ÞÛIØ¢;eU÷ê{v5;M!"bâq+×7­ŒÏ†²TFF ã»U•FÆh&˜½~^NˆhÌÒº¤‚½Yìžá7Êõ‹ON¢› í˜àÚaê]ÅNCˆèî2·ÎÓ ûÕ-í?z­çuíXšë‘Šp •J &›j!Òt­§-D¥éžó)ô£BÚnë3ä>¹G‘nf\ð'è˜?å±d4e”ï(ÌFA/'Ä@£}ŠhËg¼we k& ¿”=Ÿ!hÖJŠru ­Œ äO\AÓ2˜QŒ#Ùqè¿¢k{¥fC ·¯‡ˆæD<îo6ÂË 9V[¢ #Ã*•"Ï}1k›%kvŽƒO.DÄ+àùÉ™;„áE#ó*& ¡ ™BóÅ@–˜JÅÎPHKðàö=RÌq}U7 `/¹kþæ Úäy±V3•t„²m‚O‹‚C£ÇPz.VÜÒUv‚Æ'ffA3"\yTxÒE5óT¬Â4²žE»þ%çÛ Þe8«žXˆQ¾\·j±PSë[M×Îײo3¥#Ðßlje>B”pÃï+'ÔÉ&Ô3UjñÄr­^âëü8íú9”¬´3Ô;o‰*ßÚ×zå¢8Cã=àþÇ‘a`AóxCXÄ3÷˜^^ˆÐä9ê~‘Œ6),ð~XÂaÓW8u—¹¥„¤º§`>¯DˆÐÚÐ[Eèí ny«ÂA‰óc7É.™Ñü2Òüêø0§bToâ(-ÛG´©Ú]xï°ø%†óIñ¦—&Žñüg‰çÇzO¬½ boºyûÝu1³Äœ ­êb¤ª'g@ÓOJNälß[MuÃvÎÂ1†å¡ÏÖ3¼ Ö¥›MÝÎKˆ°¸;ì­põûÂ1\ÿê ßÓb:;Q!Ö—î ÁѨËÛDÒ½¶žC¨uÐYœèÞýɱ]žv=ôáüE•ýÛ÷{K°˜?š¡•“ºOŽÖ§âë:ØàØ¹Âø`Žr ™ÃçÖÔ çÿA)ã9-è•ޏ›É~Ÿ°ßx¼ÀÜBÏéƒhô}éB;C5?#œžÍÃs1Ìrÿ’O¥`¤à>óU¤|ãtæ¸óÙñ© O*DXýŒ1ý¤åƒ0ñ€!®_HŒ<T=”t$ýÏÎ _VH+ «/CÐÞe†_ú¦®ƒ=ÖÖÁe²±8Òí…AUÿˆÿÁ]SF+³ÐÏü„¶v¨LáJ=Á/¤PÀÕEâ›±£bVPÉ+VÐGOò …_Í„b‚ÇÑ.â!•„A#Áö°†Ê%’02I1^çS±  éÕù˜‡®j/CËVEWÏqÀ†^Øy×§„KAÇí\ŸTHütú¿N#–áËeY@´\vª{ÂŒ=?!| ðÆŒE/}/ÓÛ¢W ) ­ŒÙÓ•ò.Í(&<ƹ˜FÍN\ˆÝ·$4÷´öƒm„Õ{†´óÕ—n6âJ;"vÚ¡ëxœ©þfK´Ï#ĪYû{ÂĪ^/™K)ªcºgºzt‚)œZõ²a ?Tß“¬Ùi ¸S9BüÕÆZ}›/9‡Ðò}2XÅÔ 1°V[Ò] — òì´…<Ï~ÖÿÓÍu LwÕKK¬Ê,"=RÊ3¹Â8ÞT6Lù˜KÖ'èGæe :15)#çë%<1¨™¼~¦)d³@Š1:æ:{ˆ©ÔJ¤þÀA¢ ZF‚<ȲX[@ ‡Í¬4M!-d“"•p)–z:–Þ}³´\HOówNÂi3Ü™‰{0}!Á"g¤6•z@ŠDøÿË"U7j\µjq°!˜ÖeŽùjŒï2s½¬x 6{¢kR0HIíÌ AX¸9« ¯ìwšÍùFubˆÚÿk ½^Ì 5ôh!I«ÇÍ+…ÛiÑ› ãMÌU#ö¹`_±VÈy¤_MÂjsÕÖUæúúšÂšv¡‹Òƒ©~ÏÓó¢i¢­"”zF´¿é¿ÙzMO+$~¼×Ø7DÁa/òog®Ðò¤V(@+Ö&y3;ë™®åí4ldºÐÏ=æ›Ø¼÷¬öºúI» M¼}ê&@`èrY4ÀàsZu;3!é‰ Å:TòÆ–Ì2ô®®–OÉqÁºVÌù*]ƒá𬠻÷†?„éY¶·ÙGýwÒŽ˜x|ŠNì®æ >«DŒEs|ý‹&x˜Y)a=Äq˜T“cH}éŸ$ï&8–4øÆWU$éF)ì»ûŠè©/CÝŽ‰Óõ´…t͉6qÀACVì3@ÄðñZŽ$Ϩ1'ærg•C&oÌÓâ?ÌØŸ«ä(úx$ö#ZÜ›F]¶K„  DÉqÄs Ÿ¸‘<¸s2õô ÍÄXCK«£}~Þp´Õ¶6¼öæÀiVϳ áÁ6cÉý#H-JÖq*;/¶•’ÑþœJdJpœy°¯_Ý0F¥j¼8ºE>T®]8ö)_NÈ;"[e“|;(G¦gŒpôrX4ñ”#é¿ TÅÇŸ¢UšŸéa’R;SOÁA%‚ypz ›‹ ;¹¾œ:f"Iœ _ÁàJæïöª™§\v3 Dézæ\c¦Qù¤3iÎ…BÆABì„Nix'h©v4YeÐ|Õ¾B!I´$æ„mÀÄ&KDÜ…×Üx;ð#ŒÅlkvÆBP4yLˆöÌȆkŠT¹_ד«”W*DXs üÎî‘÷ΞO±D:âfÌH “­ÛW&ÄA%w¡ðܸ ,ÔèS~b ­JÑI:ò©Wˆ„#L ÷núq31/ÿ+âãFyš9ó4#±nx úLT%Ä[g‡Z´ZÙæ¥­ð+Ò ˆg>ƒ6¹U‹ˆ‘‘ Š'ˆ5n|è8'äE…Ð8ÿ îI|pô@;û¶ËËzß×:Œ^fÂúÓâ¹½ÆfQJppžˆÏ:ñ ô“Oib´›V¼€qr D·ŽKG_Vˆ²¸?MÞN>©9"•a0îÑØ•ð¾Kì %x?­JçB[ÔŒ\$B›j•¹³ÊË ñÜ&¿'v;Ïcx³sG2ZRº×e¼kížVa6ubƒŽÙ™ò+zÕ½¸hèa¥h'06É:Ô‰­ƒ8ÿåìY¤í³·;ö6t¶iEÙìÔóJ„ô¢Ìçèᣈ˜„ŽÃè ‘^fÂ>ñ¨´Ó&c¶Ê]ü<Š~lÍRA34p ~é]!â?\gÃË<£Ž%Y¼D [üY?]:ôRÔÆLÂÐXÓÓ9ªœ¡Ÿ2c!f ÜÍØ9ñ¥„Q#3}Ü×Ê TÆ`Z Úz…™^õœ›œÝ\qMž0M3Wϼ„x`ÒÛøŸxàb`Š†Ç’>·‰&Â’Æ› Ç¹¢œ¢žM’«ejþ MªåxåB<$q …óÔ]˜;T ùhíQ™ò%÷oš#öé$ŸW`Ê3Ò:å9 V=êñ/¶£—˜WŸžËºIO=hBï§dy‘Š­Ù=>rîX1$£ÛÁéyúBh\FO3,—™yôDr†0}ºvíèW8*³ûÅ„hèÃÌ«v†Bú*±‰[±~ˆT‘çw¸'ÙÄyÙš¯i÷®é é]¿3fµŽó¿µÈd#f ê~} ­ÒÎnÚ ¦ã¶2/)$X!8 /jÞ£?·ÞM ;RÉ®•÷«êêd¥¢áý´1‘&p^?‡áHNºô …ˆP!¥0;…‡,ÑD!©8€`.g«@@Ÿ•”­þŽØl‚D{( Ü’Ÿúa©VàÁcÛÒß¾2!ðÐ-¯|ìAQÐ }¦rò‚H<Œ}·AA«AÛ:°²š<¼2!CPæ@)”ÙàÖ n3B‚]ºƒIÄ¥[d‹GîÜ©œõ#œÇƸf¦W"$2¿O)\¼‹áÍ,wÛ$;¡ùæ‘hÓ£´a4+˜HÑÎ:ŽNJHº”—DÔ÷rôã3S]ÕÒìÐÊvÔ¡3P±3yZ„Ì7<€vŒ…¼¤T˺fk´Ò“”ÃY¦}ü]XŠcl-!6c;n”ø’BR¸ê{˜ 5–`[Ø¡³S„1lÖ|ƒñaÙ¨ç•I£,épÙ†‰¯ÎH¬‹OhóUµŸŸäÍô©–:ƒrCcr0é¿Ézèó’'°åÏé¹CŽA ì ñƵîc€Ghíp ˆÚÙ øœ9*jwŒ§¼”dW·}`ÀöR`h¡Úp>šåð§d#Ýdi͵D÷†÷Ž<9!!)ž´¯.'$o&¤þLïΙĦhø"O<¤ÈslhâØàøÐàq”㥄ô†Ë`æÛÆ5ï¼½OïÌžA¡ì¨£Ÿmxº‚„ƒc„Ðøð; }³¦¦iñÑgç€ìB-rTÙÆƒ]4mAk3½nHˆ7ÅeæJž®·lÎÃ_ÔÜùöEÛ»ò ˜bCèéQ‹(£Îƒ#Š3jÄf.$Í‚!%:¹=ÛளÔfdalæ0^äÈ„ŽPãðHãákÂÑ·iÇtÃ1Æ^wàÁOÁ©Xö±b=HÅ;©7f<Á'/$9uþ‚Ö4âÅ®8¤q!…$| J8< Él šƒÃ“Uñ+Ò6wºo‚o7i|„Hq[»Q6æ–Ž8öaXıwUÐ+2vÎþc»Ú ~8l#ŒV6ž7Ø3ÁŠGF‹h_Jˆ…ÝFfG‹äFȎ±5Ýà!­´m¯ÛÞ2ð>½¢9À£BˆæpÜ$÷……ÄÐóBu½³¼;nl{‘F{~AÆ{vK1…Ç1ÄãLˆi ‰Ñ§g»ØJq¤×OæsÔ„kCrѾ©"Æ8OO4›Ð›K†¹89„GõÍßLZ²y –Òì7xÆá@šd-±`7,=Ø ‰K¦)Ä –„3ÆrÃø1?ç`¢#Ⱥ½)&é0.LvâMXz¢…Ç}_\ˆ`ZqÐ7E{Èâ¯üHKéw‚ãÏ•šä˜Fæ˜À ð= ÎPË3Ò Ð¢r*6gàNÛÎ:æ:ÜÒÍ/O¯'hiòQ¡Ài´c_‹.´¹)±Þ'l²ôÉÏ6àE¯Ãì‹jŽK&aœo8i ½"!À– k¬× %8s€Œ!.%&樂ÆÄU-EvçÈ•^‹šÞLèÔ“™¬š_‰Ñj:0ŽM²‹³<ò®lRaCF“ö ¥eco¹äÛr·prúÊ„ð%*šc88[æ1¤ÐÉçG!ž¨]tÉ´ÏNñh±†³(Òýçèœõ¹ ²CN–w÷_©Cž¦ ÕkÃ1ÐtþNDgвµEÈŸø ¨<ŸÇã-<1!r=³aÔ%ÌÖ'ÀƲõsËðq}slN…¾W$è²ñ ¥ meºoÉÇ•Ô×èsF‘‡Ä@­_9¬¯rÔJOjÀ,htE°Í<ÌcÕãÃã~I/]8kp]v‡qÿ®û{rªíJaòZ›lß%QmQ„Å=`]8¬È_X¤à›†P5ý }ü¶ÍêªÒ1ª¹ÁŠÄU©¹Ý³šŽ•knÒMgYçIåMò~†Ü—¥.áÝ<~+Õ§¯”n}­ømÁ(ckû{®Mbº9†Þˆö¯Ë‘ÄòòͲ½Wš«îy³<€ŸqCT¦îÜ\Ùì`JsÛf°Q»óþ;ó<¤à-Jƒ„—m§U!›jN »*m$äô=ÿ$Ôð@Ž<þìµìBTø³h¾©DV7u“ÕY](??Siwòû¼ß6ôCMSôN1ô\œ’ink™4kêrWÓ«öªvß@K¦ÍV~%ÒEâÙžža³u†í™üYì Ìý.”1䕺ÉÛ7øù×Ðo&ÏÝíù^©þ.ñ£¹}£¯àÙƒËk—zùùç²æ¶uµ•Mr-äÝÊÈ3ê[Ê-Þe¶•Ö’ïÛ…moßÈ·PrÔð-ïèD~Ê:Ã{<=ËÔ×BÞè™L©eþBÇ"WX—ê%kK »¹»:;“7«SHË …ËÆ¯I¯­\ÈèêÞ6-«¤¼]¶5|É;ÇüTÔ4;—ÀÂõç…²-¬¶L€.LÍaƒ/¬J¯*æT~ÖÔÿ¨eõBktWKh¨É!9”Z'ž{¾ÞÖåÖ^ŒØ¥<Ÿ--f’ET!aP—û¢¹äZe.v²Ú¬ür‹Šå%±òë6µ NŒ™A\&.*,¼TOI×øu©Ô±Õ)Qã¹Ì–%­s©j¼|=ÔTjiE¾uI•¿4Åò2¤¨ËÊ¥ÀÔº^õõJUVa*+–Á_¸|TVù ÍmÛà5ÂÜH©ó­³“­†Oe.É$µlCA¦Ø*s’(_RŒN#‘ÆåJÉ *HRèí›äE²ä…ëSs¡,Vž× ¯­­fäeò†ìuÒJåuø:;¯Ñ^ÜåtW9¡…_}v®^ˆËš]­n-×*K\’Ìõbé•Éå”^žX‘aêÏ"`…–YY­œb*”Š}¤½[•já¨Ã½Ì圊°Mºj„cŒ-˜“F%,´}!Þ¤1–Ûš¥ ó3I4µÅÖXârç§²™¤2Âæ~žYï¦QMRdD»¶œˆck?oQæü¤Ø ’•ƒ‘Ù‚‘MØ2I ™R)¾I5Š-Uýˆ´˜z uPÏÒN»ª¦­»%S×–ºLQ‘L/‘Ê$šõ‹Sfç‚™†- Ô[×0yÅ!1X¦oˆíãäÇ7!A•BHb×’?~·Õ¹K‡£.dOõ±MæG—ãOµ‚ õ %BmõKàŽZ}#¹ç§Tò* ëJËlHDPlE&Þ˜­Ï½Š2LâK¨Ó3‚Èõ^hÛ(Y|¢²]´m˜\§˺[ÉÀêXeéDÚ‰µù]¾F‡cë …éïÒÿv–NW[7,3]KŒ˜H—!”Ue›­®*€'€^@Í/&¯Mòf³ÓÉuÄÁ+(%²g&@mD¥Ó+ 4Û sSÓ,o@l6²µS7oRváXZa‚ZüÎ8åZHÇSÒ ´c:AìÓY l8\b§fÿuí Ý ÒÍÕ¨ÞÜ.¥¥Gi› >©°šþЏ‚å­ò¯unZŽn)¸§JÒœcoF 9whѬ0®@žœz»;'7Z–*'ŸPXyZ1²Æ~j•;£àb¥GHLZPCY’C¥ÄvWRÁVÅù[#U„ ŸjÂÀÛ=G:<¥˜@sª³õL 0šS“¥Eöûd‹¯†6èúPM& RžqiŠ“9qøá*T­øM‘*æ¬ø‰jYvcƒ¼hµ5·Tùnð%ÚβÓ3“Ô í`ÖèV—¶*0×­**ÂSUK‘J+uè'$?ÿr“—"cÃsô„¤Þ‹m˜†2Ùl•"¨þž¾ó…=%»‘¶'ë_Pó¡Åý$2[Í Rìé91°ñ©‰Q;+¨Æí¶p€Høœ  ´'¡„2L¨ºs2ë‚•N+DuÃð–™é.Ö¡4ÕYjgà¡ud ²m'y%S…ûÐwä²À”måà‰‘-ÆPe£RíŠ$dŒ/V¤ÒW™¡;×L`¦Em"cQ0ß„Vˆ9¡Ög*3+”¥š¨°§É6œi±.BçàÛâf,pR3fI‚A ÍË„ýá'ùªlh“ø[°UÙ·‘<í¿nv^í:Žbl²¸„+F9,T™rÑ"`s,nã®2n„_F\ ªrÈ~÷µ Œ‚ …È¢œ5Š †ý!:¦T½è3S3yÊÚ°ò†XÆ O¨^Mb.(§Ì]ô¡M Œ|ô k5‘pµÛd[Ïq(½RZ Z AvO)Üs¢æ“ÉÅò”²°s/ëTøV´‰€4uW–jb+ ›ŠÒ}€ñI‚ÃËÏ: Á?œúvReO¢c5&ò{ˆÇ$£ýÍ/æX-¯®ZÒ–‘ Êñ_¬I¶Ì¬ã3µSG¾;Á}–lûB´"’Û©¨õƒÑ&â²þÙ¤ßYÀmÚBŒ1{¯CºÂg ·i± ûÙÕº1oiï)NFsÑD+eB¨Y´C¶[›:ôŒ¯P³5H©@ŸdAÓ¨”‰ ÑôåT."O}‚ýÂéLï 1BW®•i ±Í½}VËSÖᑚQ³m’Ÿ_H¨ѹJ,á‹ÍÑzžXˆ¯#»ð=>è‰,ZÍsÀí•aÝ—¡Ê´õ8ª‚$bU¦Õ7ÙJ™P}…u‹DÏÔøŸë+ ÿqU\ˆÔÞòèŸ?‘ÖØz²Á‘8r7 ÅÒÛkeúB:ö¦´|â™4½ÏµnB;„ÑúœyÍ>¹ÛײnEè¹{·ŸSÊÎàñ9ãÆçwânŸ¦Y>B3¸ýУ5óÒu2 !žf”Ñhã9\7¤˜ÃÖAóxïºá‡hêè>…„n6×òœó^%ÁÞÞ´@;3!ÎÆ¼±Ô¬å í[å©g·hs }BÒêùö”ìùôc:dª•y ÁÚÎcKQïzýͬVf$D…‘V-ëo=¾²Ub©\k¡Ø¸åai›~P­¼!TÑ«Ê,]CzåcÝû)U'¹ ÉdõÑ >qù$§äÚ~ùjy­BŒº“s2ÓZ¶]áR±–bÀãž Q¯*ÍT<ÉW$DõˆnLÀVå€oë)ý8H Ž÷”§P³3¢*zYõXµ[og´Ù(o->9‰zRFŸð;t}fTµ/#DŒléá¶ Áÿ-½'™'÷Uc¯/>Ì…?zoÏ&D˜s÷\Æg‰õƒy;{èVÃ]6ln¤`‡ÄF^¾jg&Ä ¡/¸É6ÙiûìR¼›XÒ˜™"ùÒ±£îOåb<#êo’t=M!#ÐAÇ|…nŠ/RÊH³ðß­ÿo‡ÃLŒp^B„¡ë^Έ>@[ðƒõc<¿] ‡é×í …ô²ô1Á NÕòj,̰n§/Äúýƒn­ƒÿå?]eº’=êž|ƒ:c!¶CLdi›Ý’°h°4ˈ+†[ôËCÿµ .t{X8ÉAz<§É+§é|Ù§êãD—§bT/×m#pMÑjð˜þ×dëdzB´MŒÜZš&øoÒÚdq—cêÙ…¨T1¼GÝDγjVej*¸U÷¿cäíÙ„cŽ}Ýf6ÂÎuŸR}GLjM gϤn_^ˆÐµßµi€ »CIý–ž;æb Ƨz”¢'^µÓbm"ñ®eJÉ,Yx vö Îu~„š'ëíLSH‹šk;ì ˆ¤v‡Å4=÷ôè]?½`±«—ì~ƒ×ÝMZñ€øùú™…Äê¤äÚnl•üJ6 ÁýaÏ7^F}¨u[Ï©ç@žW@àèz5;=!"étùKðzv o‚;L‚VgQéf7¯çÕì´„øzöŒÕ#Ò‡EQ”[§þÃzPÌN1ÿÛ<Æ›¬Ë4-!}ÀH„XÚ-ûǬÍçŸxà‘>æ)=“®Ûé  õÁ³¹öÕ£biõ ¸Ï|)Þø•ùº†ŸPˆðÕÜI(&äÛÄ!}ŸJ¸`o¯À&’02IqˆÎ_¾Qž™^Ùú'P{Z6¬˜íG=ÆA&:ÀÐ ;Ñæ¸ÁÁRP'kÊó?’AámDˆºy± Çµíª–ËNuÏÄ’ç!„¯¢o`WôÒ‡¿JRÃC ) ­ŒÙÓ“ò.ÍØ#<ι˜BÍN\ˆÝ-#4÷´ö}ãa5Å6©rÞ£úÒÍô[iGÄÎé£ïá±>$þÍ–hŸGˆU³ö÷„;‰U½^2— R”¿vÚü­ÅVvD‚)œZõ²a ?Tß“¬Ùi ¹ºâ¯6ÖêÛ|±È9„–ï“Á*œfˆµÚäîâP¸Lg§-dð:Zèþ9:󇳌ÿ§;›ë ˜îª#––@UÙä¹k€Ž”ò,k­ûC×ô $0!–¬OÐŒÌËtbjRF†9KxcP3yýLSÈfc´¯ÆôS¡õ $š e„!ȃ,‹µÔpØÌJAÓÒB6)R—b©ç^a§²£ Ê™¥åBA Fl„pEÚ w`fâL_H°øWš6,Þ "ÑÁþÿ²ˆFÕ͇W­Zl°þ‹ÿ[¾ã»Ì\A/+¤sj퀧ºiR0HIm AX¸y~« ¯œÞ{£º?1Díÿ5‹^/f†z´¤ŠÕC¼•ÂÌ8ŠÅ'Èx³pÕˆ}.ØW¬réÆW“°Ú\µu•¹¾¾¦°¦]ž¢ô`ªßóÄô ±Aš(D«…¥žíoúo¶^ÓÓ ‰Ÿñ4ö QpØ‹üÛ™+RUá6hÅÂÚ$ïofgb=Ó¢¼†LÊÙ ž•x¾AÐÕOr0ØýY¢ ñ|’K­bh€Á-æ´êvfBÒŠu<¨ä-ï¤E©m\IÉ!BDé ׄdMؽ7ü!Lϲ½Í>úè¿£vÄÄãSt|¤JW‰>‹æøúMÇZMdë!ŽÃ¤šäy Ik}=l%TZkö](‹½w«ã ÞþKî K+ëÌ>`Ê«Ì]TgüPÃìÔó2BÚ@aô‘ˆCêKÿ,Ú¦ÑLptË'â52>HÒRØwç{‘³=õe¨Û1qºž¶ _â# x}øg€ˆáãµIžQcNÌåÎ*‡ ,LÞ˜§)Ĭ­?WÉQFrMVÇðBŠV¼õô¾³Û‰  DÉqÄs Ÿ‘<¸s2uè~âc -­ŽöuúyÃÑVÛzpðÚ›§ALX=Ï*„?ÙŒ%÷ µ(YÇ©ì¼ØV HFûs*‘)ÁqväÁBøÃÍ#[eC„CTJþ?ë<˜#ùPuºváØ§|9!ì<`€°íí =˜žE0ÂÑË `ÑÄPޤÿ‚BP*ÂIÇgz˜¤TÁÎTÇSpP‰`œ‡èæ"ƒÀnä¼ýLXˆ3H‘ ‡$NÐ/`p%ó÷[ÕÌS.»"Œ´Lö·‡"&Isþ+2:b'tJÛÀ#8ù@{Lµ£É*ƒìä«ö I¢%10'l&6Y"â.¼æ&ØbÄa4(f[³3€¢É‹`B´€`FF0\S¤úÈýºž\¥¼R!šcàwv¼wö|ŠÍ 2¨Âç=H “­ÛW&ÄA%w¡ðܸ ,ÔèS~b ­JÑI:ò©Wˆ„Û %†{7ý¸™˜—ÿ•ñq£<Íœyš‹‘Øö¶ <}&ªâ­³C-Ú@OžÇ ¿!Ý 1›•&V«Žì%§#·Êa12ÒCAñ±Æ焼¨çÄ=‰ŽhgaÃvyRO€"ðûZÇçÙ¼˜Ïí56 ŒR‚ƒóD|Ö‰O Ÿ|J£Ý´âŒ“3` ºu\ú8Bø²B<Åý)Є1”ƒ¼=ø¼1’7_ê¿ÞP‚÷Óªt.´EÍÈEÒ)´©Vùñ›1«¼¼Ïmò{R`·óìa0†7;w$£%5¡{]ÆK±ÖîÉfS'v0è˜)¿!¡WíÑ‹€†VŠvcÓ‘¬CØ:ˆó_ΞóÙ>{»cKCg›V”ÍN=¯DH/Ê|Î>ŠˆI8à8üžée&ìCJ;m2f«ÜÅ?Áƒ¡èÇÖ,4c!A—à—Þ"à}µaŠežQÇŠ’,Þ"…-þ|Ÿ® z)jc&ah¬ééÕÎÐO™±3Pîfìœx‹R¨‘™>îk„ å*c0 -m½ÂL¯zÎMÎn®¸&O„¦™«g^B<0jÌNWrŠFxR4I®–=ªUø€4©–ã• ñÄÎSwaîèÙ"­=jâ!S¾äÞâMƒBS`Ä>äó Ly†BZ§<‡ÁªÃŸýÂfóêÓsY7Ià©Mèý”ì!/R±5»ÇGÎ+†Dxt;8#=O_Ëèi†å23žH®Ã¦O×’‚ ±¢ý Gev¿˜ `˜yÕÎPCCßC%6©'dõA¤Š<'ð¸Ã=ÑÈ&ÎË~Ð|M»wMOHïú1«uœÿ­E&1Q7ðëm•v¦p“Ð^0·•yI!Á ÁaxQóý¹õnz\Ø‘Jv­¼_U§PŸ + 柳4óú9 G¢pÒ W(D„ )}„Ù(<|`‰& IÅs9[bžMZRB ·ú;b³ í¡(pKF|êK„¥ZmK?>øÊ„DÀC·¼ò±E@'ô™ÊÈ  ñ0>öÝ­Jmë8ÀjpÈjò|ðÊ„ A™¤Pfƒ[ƒ¸Í vé&—n‘-¹s§r†|yHŒkfÚy%B óû”ÂÅ»ÞÌr·M²šo‰6-1Z@F³‚‰­á¬ãᤄD KyIt@}/G?>3ÕU-Íþ= lg@:;“§EÈ|ÃhÇXÈK Iµ¬k¶F+=I9œeÚÇoÐ…¥8ÆÖbƒQ1¶ãF‰/)$…«¾‡ Rc ¶…:Û9…@Ãf-Á7ö˜z^‰4Ê’—m˜øêŒÄê°ø$6¯QUûùy@ÞŒ@Ÿj)¡3(74&#Ñ™þ›¬‡>/! p[þœžk1äÄ0ÌÚo\+á>x„ÖÇ€¨ ÚÏ™£¢vÇxÊK IvuÛlo!†ª 磹QJv00ÒM–vÑ\KtohpïÈ“’âÉAûêrBòfBêÏôîœIlІ/2ñÄCŠ<dž!Ž Ž G9^JHoh° f¾m\óÎÛûô>ÀìTʈ:úÙ†¡+H88F¿ÃÐ7kjš†}vøaAÀ.Ô"G•m<ØEƒÐ´6Ó놄áqS\f®äé qËæ<üEÍíO`_´½+‚)6„žõ°ˆ"0ê<8¢8£FlæBÒ,ÒQ¢“Û³ î:KmFÆfãEŽLè54N¾F!}›vìA7cì%qüœŠe+†ÐƒTœ±“zaÆc|òB’3P‡á/hM#^ìŠC‡Q!RHÂ÷ª„ÃÃÌ– 98 9Y¿R!ms§û†!øv“ÆGˆ·µeanéˆcOÀ†E{p7Q½R!cçì?¶«­à‡Ã6"Áheãyƒ= ¡xdñ¸ˆö¥„XØÙmd6qt°Hn„<à(ËQÓ ÒJÛöºí-ïÓ !š<*„hÇMr_XH =/T×;Ëkиãƶi´ç$a¼ÇÑh·SxA<΄˜¦}p¶KЉ­Gzýd>1GM¸6$í›*bÌóôD³ ½¹dè‹Ó‘CxTÙüͤ%›—aù Í~ƒg¤IÖ †qÂÐC€Í8áq°dšBÜ`I8#!`¼!'0Œðs&:‚¬Ûë‘b’ÓáÂd(Þ„¥'ZxÜ÷÷Å…¦õ(}S´‡!þÊ´”~'8þ\©IŽidŽ ߨãà à µgyH Ôú•3ÁJñ*G­ô¤Ì‚FWÛÜÁÁÃŒ1î—ôÒ…³×ew÷ﺿ'§ÚŽ¡&¯µÉö]ÕEXÜօÊü…I ¾iµQÓŸÐÇoÛ¬®*£š¬ˆ@üP•šÛ=‹¡éX¹æ&Ýt–užTÞ$ïgÈ}YêÞ}Áã·R}úJéÖ׊ߌ2¶¶¿çÚ$¦›cè ‰hÿºI,/ß,Û{¥)±êž7Ëøñy7Deê.àÀ͕ͦ4·m5±;ï¿ã1ÏC Þ¢4HxyÐv Q²©æÔ°«ÒFBAßóOB äÈãÏ^Ë.D…?‹æ›ºhjìÙÔ4ïTŠS²¼m-²:kêrWÓ«¡4»žW^–'eµóŸžaÃs†-RV7b'é­&6¯›a/%mwûF¾WêC¾Áž•øÑܾї¤%ïR¯ojÉM[ÔûIVSÊãË™meùkɹ©DÛÛ7ö}"ÿNáL&•Ÿg™úZܾÉΤ”ojÕ{ÊÐñCéªw¹«³3Y\üÝÞÞQ.äQ]$K…*ÀkTì\j×dïðËjë~¤¥înßÔäpCM÷â’Jþ¤k²Ä(9ù5¤¯/éŽýoåUòîôB^Ë+Ô7PSfENuùM±Ñ‡¿ÿB°cÂgolly-2.5-src/Patterns/JvN/NP-replicator.rle.gz0000644000175100001440000002376012156145314016322 00000000000000‹Æ INP-replicator.rleí]m“Û8rþŽ_¡«s*»/-‚”4ÚÊ¥Îw—Q¬½xv.ù–-Í íQV#)’Ƴ·üöt7ÞAðEÛCŽei(Z@÷ƒHþ~ðv°/VïØÛÝæöáf¹þ0¸_ÜÜ-×ÅëÁvWì‹õ¡¸,×?²ß³ßþ½Ø/>ÂW›×ƒ¿Eƒïâétôýàíz°¼ß®Š{øaqXnÖƒÍûÁGøø©x¸_¬×¿@Öªb¢ÁÛÝaù~y³\¬ùò}1àߥßÿ˜$“’QQ±WÈ^ w…©Üÿn6÷P¯”ƒß¯Š÷‡îëÛAPúå“„·ƒ‡õòc±ÛC!7›õþ°{¸9lvƒå~ð¾_ƒÃb[`Æ¥ü²)‹V~[Ü,ß"¡:»léš M_Þ€lÓ¨÷‡bi·Ÿ ­ sb ¯íVà9ȸ.>íËÃÞ)úõàfW€:ASØ*!ê ¿~T_ŠßàÿT Õü€JŽÔâËb»‚*Q-‹_‹ý`±Û<€¤q”¤Å?ÄÃÁ‡b]ì(Á>üçòp7X-v ÖûC±ÅF/ÿr}wñ_ÐÔÝòÃ]±û ìï6+Pòzõ‰DƒòÞƒûåúá96¨MÈ¿¹-vk­aÉ;иj=œ>‚ê@Ê®ø°ØÝÐ{ÒÏûån(£ d›»µ®Ë½2EeÚì×6üfKm‡K¬îŸ¡l7 -‡»Ínÿ#(q½8l?m®—«%Ùáo÷מÒ=Uý°‚ŽrøQ¦K8 ùKqX,W{è8ƒ»Ãaûã›7Ñö6Z®ß¯£åáÍÿíÖ”þÍã\¿Y®o‹ß¢»Ã}súÅÃ/7ÅjõƤ,ÖÑãò×嶸].¢ÍîÃüß›ÿج‘júEëáK nQûÿI0oôðë›þ¸Y= ÒßdzCÍù!üOèëzópÐÿQZÚÀÜ&J¶…d»Áâzó±<‚ÍoV‹å=ü н8]¯ <µXƒ \ ®¡˜õfp[ÜS#4ÛV(h»Ùï—˜}!êƒÝ$Gƒ¿"X¡t>^¼¹XKèøôëõæö“J©Ùi;ìâaÄÅm@Q÷¨uüʈ…jû-¡D¯©Q~(ˆP%õ>.t!¨:Ô–.Z®Ä…HÚ$9K`åG4$=â%Ì·ÛtêY/ßÑˈeðÁcU¸håe6ß¾¿ƒô‰’UÙˤ^„€TtÈìP®2º¬+¹W¦†bô;™cÅÏMF‹•%7SÆ$ˆ‹¨±€T«¬ÃË…é<À(ó Q’Î\‘WsKƒ_;¤”ˉrh4KÃÎVÙ$¢¦ÌÍ‚ ¶:“>u²ÂqžØ9ã)ØØNÁ&ÖÏqdýˆFÓ?"é­¾^!6gDýÔä)9 c–Zrs=öÑ€‚‚/qlÚM2¨V”!¾Ÿ¢.9W™Êr ÕUy0%8zw‰M?… áÐʹJõsœ’k8‘ÆC£¥ð7š£üú‘#-ãð‡~ Kf¹*j,tZbM¸¢ÌAŠ–a'#·2‡FÙÔ‰°^"ó‚‘ãáª¦É {j9(5O€ ¿$»ËÌ,Ìù¤ØHiÁç[ìªû_D—㟙_é|ªq*“\þ,XC%I¤w„ÂßQ26¢/99"B"ÐDŠ­æBÿŽ\h#ç’дà9\"KgVûu™ã¨œ‡Ï1W–”š¬ôRÊ´}KCÐH 5&¿ÏjŸÊ@I×Ùe‚Ýãa¤=ñ1‰Ä„Â4•+£\rDšœI¥¤,ôô†3å…Ó‹„d¹h9LC\«1²O6‘ÕàÂ1ŽdgÉæ&·€;³Ðâ6¥‰LÎÆ²Âd'¤Ëq]çÑõ^ Ks馢0S.ÊÁ‡üÿÌA2¡YËÁÉŠ1Ù)rU'j°#ÅíR¹`K¡.ŰÜ“Í2¯*N×Ò3\ÉcºIJÙyC•Ô¬ŒêÄóÉ«“FWº2QîÔÆŒKNuH Öé‘ý·z£ìÊ9|­X=æ<Ð<”ŸIÔÏLñ ÎùÌ/OÕüL% B3>æ`^Ý+àžŸCÙ/¨ 3„>&L&FÆLæž²*@Î\ ™@Bê '"¯é6#=C›ÉÜÌÏ®RVc&çö¨ŽqTQ$^¬[ðbœ“O¼j–Kÿ›`1YÎD9aŠR„Ó€.ƒ/kMg¹¬ ùQŽ~1{¦²çӹ̧„< WªL 6ñ t~”|–¹•ÇrY¹pžÃh'¯rãÌõÂÎ+ ‹Mç†)(kžežãjË/Ôù˜œ2Þˆs$$ÊËé–Gµ¹iÇè^ét©ÊôªÊ”•8!–¦#ŠÙÌ(üB«lQ~& “rÄpÔ‚ %j’_ÑT"UM§Y²US!GN6có+ò£a؈gb0ʯÒw¦V3©ô†¤ÒØÌn'δˆI'SòqH0»²’¶\‘hŒøŸå#-A•ÊAá éðÅòw‘ùMw®›“JcÖÈ® fÎG¤bÀD9T ªbÏ™vP 3–å? @»\&? E™!7klÁè:žyÙ3Í%x*«×Á¢Ñ©N­Rv ª$ÂS¸¡¼`A7#¹ ø‡C:£ ‚ŒeŽ)úA`õdæç¡B¦œÔèÌ™ã<˜.ù×y†ampa¹ ¥fô9²wWÄÀª.I$gž{ï$¦@ghpê QöFˆ4º¯ièc jÓzU#:&¸ÁPè¿'pë¶Õ¦–ŽÙ(¬ðžÃ­Bx.×9& S¤”öGùfŠ¡øÅ‘\ÔY¥tB ëãØÊD¼ýY$6`Ða¨_ó˜é¤ÔcRùzB$}“MGuiåÔµŸk«k¥›Bôp!ZI€rx·-1‘Û¨N·Œøë ­ô@ˆo^r{SoüñÞ|zî=_Xˆk#®‡ÒA¬ÁLNì5_n/Dˆ5}i9¡¬è=¦¼,|œ†Í×Y¥ôGˆo>qÂü¯JsQw>ÊGŽál!`½áéþyoˆéy„TƸ=“-i€Sn~ÉpGÙ­ƒZé¾9ý­<ÿwô”Ø6²´";Úž=×ì¢çZL™Šûž»s³à’a¤öt‚ìñàóY…¤“–Yyv{”e0ødË<·Nº!ıŒè4²óœn2 {ªmz¯ÚÏ&Äóޙb©³ø%„üs¡÷‰ëœ7‰àíu ´=bú˜³–ê8ïÖ;´ð*Þñ´ ;ž×¿¬°9|;Fv|úc&dÒJ¿… ¶cn±%ã¥Ùõñ\Ùyfêž4DÒ¼8ÌJÝÆ¢Æð,»lÀžc¶›BÈM‰…ãô˜…cçàmÄàî8YîªVz(„Kÿ1´8&üH'Ä_mÇQmÏdÁ®Ù]µôXHØ¢¶¹“4ã±½±ÃZ釀Ó)lP=[¾Kë¢KʸLÝhÙü×'£;B¸¥tw¥t¢þ;ÕQ™§ †=~7„ØvÒs3õ^­3‰ ¯–ÖÝÚ8¤=TJO„mG¦i¿Ò&å*¬Û¶;vH)ýR2)Sg3Žš@¶=é×fuÖWSÿ¿íB;ñä¼AùK ©æåðÆ$íÐ6ÏUd€UpÅÅPx̹¡¬ÓJé¹ ¾æ RîZËŠÞÇ©k]Q™žsd7…¨U¬ÊëÍD3RaZ½R9±ºi,l>†ìÙ]¥ôXˆ!Y7\ÞèY;% ìob¡îÚv0V8ïø²BÂëaå±·4ÅM]Û{'={¤=n·wwN)/Cˆð¬ƒ;MSgpÕ‹GV;þ6tè©29kÃèM=åÙ¯'d”Ç!_¸Ü5½þINWêMŒ5YG•Ò}!\ß)a=°¶°Úqüt9Xk8t_·=ÒȬ‰ Zq‚¿¨Ž%ƒê¶ûB´ÿÐÒ?¨·:sâ¿öàO©ÔT²ÁÜP{,DO(½,U»[=šéša‰+Ú÷èç‡þKÂMèö´p ^$ÇÂë9y<2–އM¦>otù²B”©ãá¤j.O*;${Êü«³:éžÙ'޼µ4m🆭iÅ]Ψ¯.DL ’ö3ê¼ä<‹a&PCßÀ£ã£*ÌüïyûjB¸êŽMÓfk…ݶ}Èô5#kù8»'º}~!\j¿î¦N(ÄŸí›:Bôš‹64S>Õ“ ÝqÕvKˆ2´ŠT”ï*†ŒÜ¢'sÇÀ¦?3ã:?ÁÌõvº)¤ÂÌk;ôˆ uÛÅ4r¹÷ôì]y!ÞÅ®f]²þÍœén°·ˆo°3_e!es·2r kWF6ÎF~#«À·ýaÇ7–æP“ª™SÃ…„e_?iæHsñk(bQ#˜ŽÆ Ðç0àÂ]3׊ ùæå¾K%~\ˆ[ƒ‡=^1 `Â!KrŠÍŸPî™F›sëÏì©ß³ÙØêû¥c‹ XÛ„µ‡ÒÍq½ƒ¦ :v¶+÷GHù‘ oG„¨+‘ÇJ,cãZOUÓa­¹{Ò“û!Ä¾Šž9 »¼‘>Ü«$%<@Hªhå˜{zRÙ©Z{dOs.º ÙŽ ÑwËð»{Øúnçg\[ʺI•ñÅ—f§ßX:"zO}ÏžêCâ_o‰öëÑf–þ7'eSO†–KÈ2”{í´>¸·ë Ëà4ª§¹eðSíÝIÍvSÈ‘W׳òWSÝë«|±’sÈ*¾«ìà´…679¤Vœ —òl·…´¾Ž–Õÿ\:s—³”ÿ''›“ ¨éª!–Š@UšÇ±€Î”òU®µn]Ó'«IÀZs‚æ`dœ† S¦&á`Dø˜³€çq j:oŸn iÁ,,ÄÕWcºˆaïo8 AÆXì™L4 ÚæWê¦ ² ‘JK¸$C¹÷ '•5SP›Y*â š·bù©Ò´½Ó÷ ûB¼‹ŪinEÃ’&8Ìþš”VÕÕ‡XWU8ØLû/îoñøߥçz^!µ[k[<ÕM’‚BJèv Ì›s³ÏoìÍ•Ã÷㞊éO¢úÿˆI£ÓC =YHÐÄâ!ÞÂ`긊eoqváŠû˜[_Y£ñH§®™¸¶æ¸jªlÛë[ kêËS„”úOL^!ÖÊ ¯ì!\˜çˆñ7ü×[¯éË )?ãéØ7+‡È¿Þ¹¦ò·°YP`•X˜¨ìÍÃlOzOw…o'·V¦ályσ <ßÀ›ê9˜éû³”6ÄÛ›\n•…ÖzÄì–n{&$¼Q!™”•œµ%ï¡ãµÔ!È!tW2²žšà !QîOïp5³¬³Ï>úgR˜òú0{¥JÇ9˜ÍqíÏóškm$‘MÚ8’û%$lõI»+¡ÂVÓïDôx&ïÝjxÃ’¡í KxWÖ©û€ ¯26Qã—zgžçR e@Ę…¾tÏJ·iTÍååkd\„%înß‹Ü:‘[_Úº§ën ñæ%.’˜=Aoÿ顇•áãŒAžkN–ËÁlV9ea¡ó¹›BÜÇÚº{• e¯ÉªY^ÑŠs=½ëìÖ"âä¼âkñŸ<˜sêê¬nùÉ^k¨u¤¯Ó̆¶ª®gÎxsâ6ˆ›ç« ±ެ֒›W*Œ,ãTz_l%£ý1ÕHÕà¼;òd!öÃÍK}ÕZ"lcRòÿ­Éƒ:²$nkN3.œç”Ï'ä„û·X ¬z(1‡ÔÌÂ[áhä¦Ñd/ œIÿ…  FöúSâÏHj>ÃË$©v†&žÜ÷öÁ9èaõ\¤Xœ`Ÿ q £)BáÀ ú%Ì[\‰Üû­JæI‡õ ÃJ©Øì¯I™t:Íù/PÈqÐa>v|§´ <Ü&VS­²RoÛyÕ¾@!A´æ¸Àø4 Dܹ3Üx·1Gv4(z«Ù ñ@‘lj·!Ú€·#Ã[®IBsäf[wN)/T×ÝÑó;ëWÞkg>É´Œüç=œH Õí b ›Px¬\+ÔèR~`!m¢“päS^!âß)°Ü;mÆMǼüoDˆ‹áiÆ–§é¹ÛÞÖG¡OEU|¼ÕN¨yhØ Á“¯Ó ¿!õ Q7+ \­Þ80KGn…ÃÂËÈ/•7ˆåf}è¼'äY…Ð:+î |ØèaÕìÃuØ.N}êñPÄܹÖùy6Ï&Äq{UŸe¥x㉸¬S>aÍ䓪í´/L99-¢+×¥Ï+„Ï+ÄYy>Å$a´å ç|Κ@j_â¿ÎR‚óÓ85.´FÍ‘I‡Ð&Få§C®Ç¬òüB·ÉI1};ϳð¦÷ŽDtIï^§åK±&æÉê¦NÖA¡£w]ù…ñ½j‡^Ì4k`¥ÒÀ¬íHÚ¡Ü:Èæ¿ØzÎgõîíšÛX*:›V¢¬wæy!BQærkà£1qƒ?&7D:…qýP£To›,³UlâŸÌ!oÆV/ Ôc!Þà—Æ+D˜óÕÔ2¬åÕ\Q•o–ý|Ÿº òRÔ\mÂX“Û9F-ØC?¥ÇBÔB¹Ù±sá\”âGÔöqg]Ãg('PY—RðP5+ŒäUϱ*Ùì—äÉZ¡©çæé—LL f¸,0•–Ç‚Å\nãy Ko`øXÈIrîH‘$é¹Zú(®Âo¤N/\ˆƒ$Hþ>uæ.=[Ä㣉CMvÈÔ¾ä^ãM‚BR`‰}jÉçtå ©Üòì«Nö‹½0ØWÞË: OÎÝZ­Rmå:À¸uȪó|ð„´A™ ¡L·Zq›âÝ¥ÛÛDœš‹lñh;w¢dO‰qõÌ:/DHd›x—…7u¹Û48 §OD›”Xº€Öfy)*ÃYç5ÂN ).ä%Ñí=<úñ™¡©jªîÐÊj”¡3&bgpšøÌ×>€vŽ…<§ÐÈ:±®Ñ oRöw™6ñ«ÃR9ÆVbcGÅØÎ7J|N!!\5=LK¦Gض»CdǰYEðöèy^ˆ0Ê‚—˜ì«3W‡•OhsUq??ÈÓ#Ð'FJV”k“cG¢3ü×Y½_BàdÖåÏá½mŽ^ C]â¬kÜG¬rÂÑ"j§ƒvÌåÌ£¢vçxÊs Nu«ôl!† ªõ÷£™UwK¶·0RO–ú¢¹Šè^ÛàÞ™';$$Ä“­î«k’³R~†ïÎÄ&Ïí‹Lñ,DžÇ†Y96x|hð¼Êñ\BCƒ©·ómj†w{¼ßØzóe·Dý¬Ãƒ¬.HØ:FÈr~§¡¯×ÔÔ !.úôðÓ‚€u¨EŽJ«x°ŽYUÐZm¯k"dOÛâÒs#wWˆ¹lÎÁ_i¸móɬ/ªÞ#‚!6d 3êvEfQçÉÅ b=fAŸŽ“܆ÛàN¢ÐÍÈüØÌi¼h#“Õ„ÛG»@ߢ}Ójì±z8–±Äsà'à” ›Xч Åk©7f<Á;/$¸µþ¼Ñ´Ä‹uqHå0 $²’ð}U²ÓÃV_bùÉaÈΚø… ©Ú;Ý´ȼo§a|øH1·v£b˜_Z8âØpdí"Ž ¸ë¨^¨c÷ì?uª-à‡Ë6<Àhiîxƒ  YòÄ(âù"Úç¢a§o#3-G“à[¹a9º™ƒ´T½æö–ž÷é„Õ=)„¨ç›ä>³2ôœP]ã.¯VGf;nÖíEréùyY,޳Ѩo)&ðxLñ¼¢›BÊè“€ÓS‚Zl…8Ò™'ÛsĆkEr¥û¦ò2æ˜ñôx>õ½¹`èÐ'#‡ìI3dõד‘¬_B¸æƒ0ûµÞqØ’&­‘˜[W,È0o'Ù4 ÿü¬ÓÈ#àÕø‚MÑ@Éq|hI8Î7ì´…^` .ÐåÖËÛœ:°ÈB\HL\O¹Š«´ºÙœ#W:#vh{¯·¡£ÕL¦³f~!BND«šX°ãø00$›È±UFÜÀ•y(lhѤ~Bišë&§öm¹«Ø9 }cBìKT$ÇØà¬ØÇB§ 87ºÈʵ“:™úÙ)ÕE¬þ.Šðü¹tn͹²}lO–w÷_¨EžjœôÍ«Ã1¬:èØþˆÎ$i-jŸ?ñyÌôÅD ŽìF¹ÄÏÎdç…˜ ¼‚´˜Cs'~Ò*ªâ†ñ¢v;øD‡ÁÍåWGú~½´N…Ô\W9'á‘â5FgšÎØS2«3Ö"aM8ž+§ÖJj/C;”͵gbO“´GÁì/¸»¼Ó¾3ôd ì¹¶;¹K'Gëã³å# Ap¯¿êxQŒ[Ç.èÌL›B¸dO`éÎ[¹B|~jýh´Úæõ¹1‹Àô×{Ì!u†Ž ·¢zÙ¨üÉù«%YììT´w*_OÈÓñ柨±\™ZÔÅÕ­O˜µ–-Ÿ#˜úëëãpÊe[‘ ÓÜ $¤"´ɹ¥½®$¾f9g)òX¨u•ÓA¥8ÊWzÒ¦A#aÝÜÁÀC=V½|8¦s?§—ÎMo0Svƒq·ÕÍ391v´%ÈaÚZëìÜ% ¶R„Å<`¬À/V$±oBcT÷7ôÙÍVWW¥†QUGD n¨JìíîÅÒtÙ¸ª‘f;Ë$¯“íiÓ.M]Üi{ú­T¿¼Rêí5¶›ÅŽêlU_ë&1õCoˆöOÒ#‰åù‡eÝVÚ+Ú<žÀ_qmL&ZÁN¼¹²ºƒ)ímëÁš¬–7·ø˜ç!yož*$oxæŽÌw—8æ\â`e9Ÿ'(¦,o÷ÒæÛ·ð‹ùfô‘âi¾}+“„%ÏC¯WÏgDµQFÚƒã ëÍ þÐm(ÓlûV¿/àZn-~Fâk¾}]‚”W™˜8Eèó¡t1±œgÑ%T·›s80‘ª…ÚÇ4bòu†À˱çøåhf~¤ÁlÛ·ùÚ4…ÙY:) ýâý€’ƒ_crVþ!¥»ßB*hü‚C‚R¨o€ã’˜tù*™ŠÃO¿cìÿÃònOËŠgolly-2.5-src/Patterns/JvN/partial-constructor.mc.gz0000644000175100001440000017620012156145314017475 00000000000000‹A UQpartial-constructor.mcìý[“%7’&¾û¯8"ó0Ì’m¸]-%›ÉÊêÊڬʚLö”¬¬ìƒ3ÂIzWDx´»™ì_¿ø>UÅÅΉÌê™—•Ý%ÃqÌ`¸(€ªB¡Pü?ÿÉÿ¿._üðôîÝ/ÿuúÕÝÿòÇË?þôϾÝý/ß\ð÷Oï_^ß\î?¼½üËýóëãý»Ë7O^^Ÿ?½y}|úpyüpù©ÿüóç÷÷>\|ûêåõþõ™ÿôðîû¯þøðñÝã›û×Ç?\¾yx÷îÓ»ûç˯?½>½¿½·j¾yúøËóã?¾^¾xó«‹k-}å.ßýrù×Çwïïß_þøõå7ŸÞüÛ»‡_á/ü÷Ÿ~þîÿöæþÝÃO̯Ÿžø[«æÛûlÉýû‡oûßë ªøõÛ^þ¿|}ù/OŸÞüøð=ߣ­/—zøpéiz³ïŸ.½ˆÇ燎½×žø©7áñCGÐÏOÏÿ†ž¾¿þ׳üÇ—ËÿÛË÷ï.Ÿ^Ð}¯ôýÇûçÇ—ŽÖ^ÂëÏ—àòyâ¼1tÞ :;„_^îß½C®Ÿ||ó#AüîÓã»W)¨Ó[ÞËÂ;Kè5=}@µ_âóËÃsùî}vÿü|ÿá‡‡Ž³7ožžß"êõéòúóò¿}üþûŽŒ¯=Ù›_Þ¼v\½»||wÿáåë¿€HÖKëyßöâ>¢Èïž^{+¾dÿ¼}xÏ1¦é¾cç野 —GÁÉ›û÷ß=¾{|ýåòýóÓûvzšÞ«ï: ÚÎm¿Y†î—¨õ/å¼|”/˜šGÃ~ýöí#":Ιܺ´¤7£#èÇÿýÓÃåû§g-öõùéÝEÊþÔ±òÃÇÉÜ ¼½ô1"=ø©÷K/¢Ï®oïŸß~‰ìïŸÞrЯ/—ßÞ÷>dzu÷ûñøá…<~xûð±zt– …#¥§’ì/§<Ò/Oˆû¥#¼cæ¡Ãÿ‚¡€ (âçÇן>½^><¼éÓÇì;$ýô‚Qbuÿø ûêòøÊ:Žäg›d¨ìçsGØOoŽÿù7=§8Çt¯ 3¯4táSÓ÷/ûàC´ÞA%¾{øñþ§Ç§çþá—èOϽEïz hÖ&£­üðh]Îÿ¬[·~9þ™ÆnCÿûÇç—×½€Ž‡ŽÙel¼Hg£Ø Þšç÷_^[4îáÃ÷?<,‚†É8CÓ>õÑÙñóòøhÔ›ç§‚Þ $&ëåòÏ}Þë ¸Ç(ãáýÇwOFéGFȧï^~yy}x±þòæùñ»^«¶Iÿ¤ã•óe Œ‡—N×äc'ËÏÿÉP†ÿþ$0~c0þééÝ'™Oר‘ÿþt¢Ÿç5 5˜Ÿ>lpv ó¦#¬g}é5¼ûÔÇÔ+?1"÷æaÀhe^üqT‹üý§=<_þ„ ÿŒ‘ù›_;w ¿ý\þkZ7ÿ÷^ÅÛ§÷–ëwúÍ?åŽÿtq_µ#µš¿rù«4¿„ÿti¥~µ~ –×FØýwE}øwpŸžéó“xøîÝhƒŽOã`lsŸl_?÷$(EYÐÓO½;•!zddõÑŸžIx€Ù>¤zWÿôðîé#Xhï'R“161*zÙ??p®Û04_õõ7ã|z½:zùÇקNù+½õO¿ûVð|ùoOŸž{ÆQäoŸÞ=ýÐ[ÿ¨6ÂîW—¿¾„¯ò×íúçË¥c=¥ôUJÑ#ò·_!zD¦cEô$ö½-ï=}t¼yxþļ}xíÓŸ„t°‹Ž«§F6ˆ¨DyËŽPvPç ÷_ÞS"J^üðŠ‡ +bA˜òßáÓ›g!ËŠŸû­ö/H*:£xüÞhÅO÷—žŸ~~ýqôþéùã@üÃËc—z™ï>±³>>"¶ƒúò+ãÒ6†þ¯ôèÿ™¹÷»üæ›ßõ‰ç|'!ÿ²äTþ{³~÷áµ÷‰AðOé]‰ßŒ²/);Ð(  n?àëUÆßta§þ}¬ÿéã}oÃ%}U.èóP­[æn«í«šrú*„¯â:¤˜ À[éV¼µü·ÌñkÉBÉñ‡§uìr߃ÿð`2žŠNÈÿ}‹ï{þ4ÏqÕó?@ˆËQ vN]þ÷O]Þ}aƇ?\D2SgY/ý P Iý –m‰OõÞ?¿¿Í„´ãIžHìþBQ¿ÁÂ0ò7@”Ò¨.þõ2@Â&×{xû¥NÊÇï!Çüü)d~zúôî­ŠnXKu±öÓ›‡À‚•^ϧ>û”™5ö©Ë5“I!@¤ÈØSÒQÖòû4|Ѿë%}ÿéÃږ뱂"z{><½bñ„ WJ$±íC0ñ ”zz~è²Ñ3ŽÖRÞ)â$B| ŒüØ™ÎÕc•@§^Ÿ8ëQ†‰\£våVÖ€ûËw½¸N:‚¿ï£çõòd¬ãùÕ†Þ;oép<éÑ":±î²RïJp½%^>ö©!¯“5¬Í€ÿ¡n}Ø|Õ±/È·õâ>„ ¾{|ÿø¥Ãö›O¯_^~×ÛÏÕúç5Sý{Ä=\Úz[pP>ÚHÞÿ« §ó¢F‰­K¥ŒT©dáÉ ß9ÜSïŸ÷è.ï÷uÖÓóhÐ>ÿuDlOh÷Y×ñæÍÃÇס~á„{x5VýÒ¥Ì;°„NC)|?üÜYAoÆ)iÐßQ„HæïÓyP¹ûëâC÷§ûw²Øï#ø¡Ó4*B?¼¥È3ZòwShοuSŸ<ïž~þ’:š·O?wVbXõl Õ8èIá¯ç®eª·æÜÿãï;`°!òm¯å›5ïY º’Œ¾érë§‘„³â¿ÿt¹ø‹+\–õeqG¯IFú_OÒÈÿpùðéýw|ˆì½Œ‘Ì?|€’£Sƒ¡4¼âà=ÿ%ü»òÿ汑Ï[¨ÿBYðË"|€÷âµì~ë˜ò7™øç>ìî?üðîAS&Wÿ¡ƒârËÿzùb°™/E>|±žúwþÀ­ßýò?™ùJ;÷1FÒ>ƇèŽU•ªK>üôºÁЇ÷”_¡"ŽL>P×øÁÖ¥(å‡çû·ŸÀý0ä —T@ø”¨Ô(K€°}¤,?…À.Ò=˜$ò¤øµS³aúd Ô“¥ô¢öÆtò=ôÀ«dÑGË,µL»«ö.Âwú†¢ÏX½v¦€¯}æBsù倾ö¶GõUõ'‘Msø)´¨Ê6%Ù»@Ða…'°¼öõÕ;¬ì'EYŠçdïtO¨ÝE*â¨!x÷ ºá†¶ ˆ~•Ü9ó†ê¢ÆxÁÚæËk’Bpû#t—*A>Ü¿RþîáþûŽŠ>ôßPÿÓã(so˜íù:wBH)¢Ôïß}úþû_”q¯cWA¶ùªçIåîŸm-zyúôCgì²¥ÀJúÄúôîEeV |”ˆÙ{ÀÜwôµËÿ¡'ø/ÏOŸ>jiì<|x™bn6®”ŸˆÔN>APéüÔ¥hï»äÒáûô²þM{Ú!úñ^¤‘¡¨ðoñ¾}ùHÏ¿}è|A àN:vÏç‡Î1DeMAFâáëýÓlÜ#tÔß?ÊÔÿ$úòû·o!QÌ"П^»¸@ÎÕ%º_Aª»Ð5ªf³aú¡¯B*UÑ9+ôrÊ÷•;}ÿòã@ÄŠ%}¬õ9úüÄyÀýˆû÷ð_w˜öw¨š{ˆY¦T~édC0.Ìßz‡òõ²`~xÿøú*Í–ÎþRxò/ïÞ.,— Ïžú Z|fé“í=÷ðFy-zƒÕ¿1å.Ô­ö§®d.]€Ã$ï)Öݼ;LÓëãròÃ[_b1ýéùêE_G?r$½˜àLö¹ò"Ò‰4õ;*±Æ²°‹/Ÿ8)·š]¯¥j ·¡{crb¥7yê#9Ž^攡8üÎFã·ª5À µ}¹ï»ðü–¦ožÞb§szìHLEçw]>Ò2î_ ¦À»/ñ ›"9 EO*€æSìø'Qã\~¯`~Ù ÆåÛúýתðž4ˆurwªo }´ CK‡Ð6èt™Ñ …pÿt­[T¶ÞSrüÓÃ/÷2¨8¨Em`ýó¯à̲’çžÎý28€Ø>L¥…Ö²ËßþþW«Ú b‹ö 2IÕ·¿ÿ_- Ö×2©Q‰ŽöÙ£°ÚËÿxx~"óoßþÞ²¢ìûw¯Ø|üòòß>õaqÿr•]¾_¾8Ï”_IÅ?>ýÌeä_àéÃÃgëÇêä¯Á°¤¹|ñáéjÒ”?õ&ö’¿úÛŽÀžóWxêXúÒtT­¾P |ÓYã\Áüs'…J§:§¢6Ö†Ê;ÕV+Ñ\Î~˜ªÞû¯eˆéÚs£eS» 'ÉøÝ_Ïx"!’ïÍ×öu¡HÇö*QË^îƒl‚Ð/ß©[u˜¼c– ɼŸdA'¤ê“aúð–…}ñ»o8D˜ìŒ¾syUìtòþ(k¶o¿Wõøòòi“g{Ýî¥èzúô=·iXu‚'â=)1ªÿ†ûou%܉b'>ÂWæŘyèI®à;ÄàgŠêob&$´x'[¿¡@ ÔÁà¸~¯ã²¤ÖWÚýwO?ñÙA÷ÿî_­w¾þúk d eŽäþî>~þCÏ8ö~ÝIÖõû—?Xî?þǽüˆÕ9Ñ_ý°«ôÿêpæ°{yz‡AƒuËÇOÏŸt©oÃÝ6ˆŒ'ýcÍ$?’T£_ÿ¥š¯:ª>×ùÝ„SAÄZ/ÇW×2ošA| ÐC)fRÌïŒ+¼\¾%M|8dd,éØûRºÆ»i¶EÊÕñ†5Ñ;(1ûîc=>k…¢YÉbl­‰ Çñ:Ô, ébíu"‘V¿h6Ú÷2%úNE­óðöWä郒$V¸›ø\I"]â)'!›âo¨ØPFøòé™ZEÃEW,ÛoHâ9ÕzÇ–*ÊŠ~º|‡íàM~R‘ý,ø_KOº¥Ûë “¸—½¡›Ê.µôô˲9Ø9Æ6¿ºÀDò¿ýûöá•Âë®tÀǯ.¿ípüáûÝí+Èõ8Ü1̲ð̃qïD!„zž©¹ìAL§'éØÜêº1«ÔÐbÉ‚aÑ`a%ÑÛ¯¯A º^Þ÷Bû°è˜í}ÌåÀîžÿq£§‡:<“eëŽóúå3à£àÏ5¡K`€ÿ{üw|øþkúÜ™Ùý§¾¤~XV2’ z×%˧¾ŽéãòÜÈuù m%rd¥±¬cngb‡€ÎP/OƒžË°J¼\~øZlJAËVq?v™ë¬µú§Ç·oß=ü;•“ÿýäÿoh&ùåh&ÿÜÿûÿlÍäÔÎñ½ªÌw¢mKT Ùõµt$‚d:ÏßCú¼m^õ¥¬áEF{/ƒi«‚”YÄIUBê m{¼Á@nñ)Þcíp¨éG4Z³ïÀ¡ßß¿ªÉx¯ú<ÑZãȯøupˆ¶F˜³y¥âýKüpÛ˹ÿ°’>(Ï~ø³È)ƒ»qÍ* îu°?WݼîüÝ‹š£wÿ㻇ïYÖÛGQ6¯F'øÜ ±¹Ñ+üïþí»£0ýå1ð7Û&¤0Ðů”@Q¨è+Ê—eQŽZþ ¤î ï¾ú³pÅý¥ª¢íùêGj´Ÿž…O*y­¨¤@þ=€…‚û‹+}͵q†²"‘¸´cÉÀíîo©×ý~C'¹iVv[‘äß^>Ë[Õîèã»{¨Ò_>-{œ( •.y×nýC¯–©85ŠÓé¾ö¸êź°ùQ&ýƒÅnk8‘œÌfCu»f"ëÉ´‘–V«Òý¿%«Q— —Âtm1¿@g äaŸÚQ„õýãeàõ2u»èøÃ£… Î“ž¦¼÷ááçó†àdŠ¡Wu¿¡­öÿŸþ/;|ÿôÓýØÝá¬~ÿôÊög[7|qÖ&Èzi–8Ø4°2jvÖ`J”{³¶_7ãí«èÓľöeOrRÏÛ§öOW«‘evs[åü÷O÷oûÜ5Vyb¤öÕ}÷—ÿñËO¯ÔÃp¸|ŽóÞX‹_þÔçûW@Þ+­Fž6•õË_š9Ÿ™Lºœ:ú—ËŸ¾Õ>ýÓ«Úþ»L ûïŸÄš¹\_QY®ßŠ |+ÏžËõº~ûÍžk[ŠÝÎÕëúæŸõ(Æ;ì…Ü’£,ÍêØ¸ÿjû­ËýøïÊÚkýÓOYÿÈ-¾¿–ÍüÓß²þN=+jýý)ëïÁžþJVÇŽüƒµõ¶^»ÕØë¬½Ö?üñœõVc¯²¢­ø»sÖ[½ÎŠZÎz«±ç¬ì×ßZ[+*›Ýzùµé¢F^ Ý?îyoöë¼hí­µÐÛ={#o¯÷¿ÿÿûÿ¾æ½Ùµ3ïÜZ>(&Ú7§åú_`™»yî½pG1v¸’¦WÔaª+Ö. ½Þ«#ÕoOßïg.þðíå?ï\kõEø·\ëÿç+ý Wûøø­•÷ë—eßStתø} ŸÛêùò†*DŠ»L`öž(à{µ‘…M#÷éEQ9 •y–æÌXÿAè÷(êÖþ–D,¶C_²èÚ¾´}g•¨‡í.¥n)ÑrQ,ÛÕÎA5šVm)MTäWêVÛ¢ïÒboÛ{bcÍ2 b,61¹Õ=ä‡éüšL:Ôó‡·GÔg­pºùÔ…Ë÷/‹2ðlza-"K.L{µœãNXÏpƒÂú›µ£‘MiÙQ'Õ¯÷?ß?CÉó›{ùÇûŸÐ„Q—vßôUR¹ïÁé:+þ¯"<¾þBLþý§wïž_U8¾?Ÿ¹‚2·˜ï»Dð“h·8ºÞ<½}K^Åž¾Çîåg¬n~TÔ—Çÿñp[Uz:ø¥ˆ‚r‡æ‹‰#³0ÚSüJ•¿f7(¶7œ>ïÅ’^ľâ:æ[…_© ŒÇçÓ±Œ_÷dX޾yúøøæò<>pOg? ‹ywã<Åï~ûÛß1ÿG_¾]šÿòòÏO_w™üËËß=¼y PÝ;)Ž–ÿþñåUö°ad£ÒWG¥µÀá]õ=¾¾#ßÿ2L¶t’¾l:ã?HߨZDøê÷›ÅøéòŸ¦®Ïþû«g‘… Ûß߉‘ü éléàk;{±0ûz;{Õ…éç_Îävùïï± ûǧŽÊ×Ë?Üz™gÿ »OÏÖ¿À^ÇåïaëõþéÇ:~~ùȽýOHøŠƒe ­åT•ðí/}ŒÿúõõþÍ¿õOÿòã//} ýòú%Žt¾¡Y26 ¾îóñí×µz„q6ösÍûÍ3lë;îóûò¯ßÍÖý+4Ïbj÷á—Ë÷´¡yzú·(”S¸W=ÖµÂïž^ž>þ(S~;HuàïîŸ~„]õå·?=½û‰¨Eþ»ûŸßö.þøð³åø ö¿PÔ") à…Y_~|ÔÆ¦^ U²<–Ì?«Jƒ‹¥Ç÷´¯îÂîû[|ª•!w¬„‹¿ÿE‡¼X”tÒMf¡PP3ж ÞdO´ƒ!®Gy¢zvªýú  =±÷ô$›„°³ñÌœï ±l"~íE¼¨%ƒ09ƒómÇ–Ió `Oóô²<£¡>ýôŒC*s|Üë‰@0í_Ði0ª¹5dìÄüoßþÐÛ¬‡æÏ[!¿yúðáñáògý mµ¿ø‡û/~µz 0r.u¾é͆ñóV©Õöëw¾Gë.ì?Oï>þ¨å^;ø‡ûg9œÿ[éB ò_%Æß?ݳo‘íÕ·?=ñLÈó»G(OÁÉó8†€ÓÙ÷?uÌml}9wø?­oùhŸÈÐÀ>d³ãUy£‰= ×ñDQtäA–Ê7vo\>ó­,ŠÅE³Ì´gÉæÒ÷‹õú¸±j8hÌU èU=Üs×hØÛ}}¡A>Obˆ‚Ö¤=Ûý¡êpêì’ÿ4”@ýå=¬p†š%|?üoñWª0²ü)Ñ-Å?½<®²ÏwÏh¡’ÞÛÿ·lp_(±Î3jâEÏððo_™Î™r1úîIùßÿ¯Ö¦ùrÿ–ÆE2è†}âðåð$ã7]®|3|ìZ¢¡/ ~ÕIôó¿q îd÷qQùÏ]KÕí¢)wûÈ–i;}kìÎaùj±£þÐyÚÛXügõFòÍTáôåw8Òü·ëä§ï,å4ü4ž6Uçå¿<±íª|‡#”½Þ!XÈ=Íü>5ßÀøõÝÃÛþ=ÍzJΑ u•XÑÑ'$ä"f󠿀~|M¡9ûtÄÝPœ]9øZHI¯çc½çdZL•xåKX—àèÐD’B0§ïgHÂOOúÓýóãÓ§³VÞ2\¹-àò‘7 KþøÐY€¾Þjæ—Ò¤û·²³&þKÞoœå¯m9];hù_Ù7µ‘ßÞƒ»÷ÔÊôìß~ó‡cÒï?½~â0ÆFÓ[c½T…ñÝÓÛ_DÔÿ g>/v¼êë}Gå«d"ÄbÂ}±±Í@‹RÖ,ˆyøñEǼÿôîõ± ÓÖI_ˆQúWo° zÓÜ_¡¦¸zÁÙ)Ni"á±ËÖ(îòHWß>^ 4þݧ±ýøóý/CC¡ø'‘ÑÅþÛ[[+²–~ºìðüù#ÜLÀÄE·ûh`Å_ª¯~TÅë—f¿ò´zɳ %›aº©H팫È57üwvõKì¸â¸þkØÞÀA Ʋ³»ë8—Áùðp¿(Ÿ€FüËãŸ9 x1U_´Ö9¢¤–Ï]B#Âî»XO-‹Í­ì9b¿QÆšî9’éX•©l'}B¥žTcÁ‰ò2DzùxcŒŽ¹1ø„Z-‹`Ð…¢Ç³öÆ43ç]ƵNØ£êÔƒ#æÃ8±©"TóÝ㫺z¹7¥·>a5Ù'Ùïh×ô¥²³«÷ågö—2†ú燯lÊÂv»*#lŠ>̰72µuö½á Nlú©­/wíúµCˆ·O¾¦¯úrú‰8ü†”ÿü•ôx»nKtvØ%.¹ØýËÉ÷/¨—ˆ_­ñLÿõµt±8Œd9ÃlŒ,Ä2‘g©=‰Mš*ZÑ'¥æb‚L]ÚT]Š—©u›ôovj2òxúðÕÃû¯¿ôÎí<ÍväOåa,£hY¾9pÞõ©ÿ¼ípISHPåÐÌwhãë'.pÞ>b»ïÝ/r€%|úøQ»K!7º^·§¿Ã²ñ'ÅgžU•yò•yàš^‡dçÞøâëÓG¬”Y¸´Žš¯Å–Q•ñÒã4óhÒßÐkÎs ¡ß=¬¦Ž]`ÿâþ•kÚ_íFŽ6§éÔ‹r ÿ¦ä¿ó@%Ý—²yš´GdšžZéÅçL(Dˆ„LFÚŽ13Œ?^ºWö3Ü]‘*¦AÜT;ùgñ7È#TôiY†WC¢¶ó8zù('ÄÆ¹«á3ì¶›ºÿ ‡sîrðŸô±áÑóÑ]¼>ùþø.ñ.jž¤qqÄ•K¹K|Ê—z—5]E·Q²söÈg)Èù‹ öÎoÐ+Dã[¯8£bÔñ8Þú‡pÉ=,—lc=µKVøceô,Å2úãx³2Š¿” ùò1ò!ešùÒ|ùzÉEë.=IÕùPú¿¶t¥â£:”}¬è¨@G¯2&íKýŸtXž^{eãkîÔž­‡˜ƒ‰OœŸ Kí%4{nx¸ZÿçtžÖþ<è ÆŸ>fô-^šQ™–ð,¡åK+ö\ð,Ô¡ÕKkƒî¸ãPÊÓË_¨š;ü˜Î¹#j9xN3¯Í)w¢Rž+ò܈¡g‡ÍÇ%¯ãoñ6‹Ú;x–PÚè[ÁB]§t­¡eÞr0sMŸ;ôJæzçQäȸŒ}äþWû?ɃPZçQ`ò!Ï„@H‡ÏƒG´‰ytÛcœ €èQQ'FTÜ ÍSòÔ?GÇF¸Nö„Œt ýq-Љ¥Œ¼”e|B‰›üÓ´ÄÀu‚È‚]§J.ö+ lT'GÒ¸Â7/Tß9£”.‚ ‚ÈŘëTÎ~Ì=ùêȇ¤mIºÌnbØu äR¯µS³þ‡¾Í˜ÉŠš¨/½¢Ç>/V¸K™xôú%/)\ª‚ùe…EÿPRÃÐIÈÙÓ¢¬<{ÀØ;ÐðÎzrËŠÿ,LÜ‘ ¸œ,½;õSŽú[Œ— F‘07«Ì©¤h§fPW´Ssæ›Hp+:™$p@ÓÆ÷/ wã›þ–S$7ku¥è_ÅP׉±ü¡,Î<`¥ÓXWúoåÌjôö4ÕëßÁ4&.½k‘£ÿÖpBØÀAMö{êU)H%j9a1XÕ¶Ov¬S£§m Ô'¿ç¡Äú\ ú‡çh˜.Çš 1¨Uà Ó2$;iw¤»NÊuH6ûkø[[+mKûýáúIªŽA_dpù£ÏÕ#]†Ü§_,•«ëôúû£Ú´Ôø —*úNnýA‰Ð9íˆÂ7OÄúƒ"#åÜXV be˜®Co Ú»Nó:{ð-ô¿A´M®±M‹;kzäýAÐ|çœöVñø»CÁUþ<ÒŒÐDd¤‹wYÞðç%Ækë ó=+oó$´Þ׉Zë$¢Wi‘ò¦HsÐ>u3¾yéQ´CX$ð€ ˜&YÒý]CÔ"(ø qUè& ãOUÛ!Šœ) €|c¬~ëøé|—¢=úŸ3&¸ÓñÓ;Sþ𜘆߶\ð~.†Þ¹…@Kļð³ð/a,άl‘‚&ÃËZÐå;!ò)Š £¥E²<Ú?Þ$«O¨°èoÜ&uÚìG™Þc-ÙAÎŽi×ÂŽdß‹|Ï"†ù,eˆ æ)xr äJüÑ E¹h+f ™ˆ#A› ÐN-b}— Å <ÅÞ O3œ½·§`ˆ¯qkÓ†<²dAA)£È5¦Œ˜"1œò3WÄø‚·ÞŽŠ¦Ûr¹‘¦išÓùFoyÑ¿Î_|åÌ ÀrôgÒä­v…°híy-¹±^jÿ›i&ÌQ¿ã¯çlÇV{ÏÝÜU]e«Ë¯å4Œ ,©ãV×h)¿ãÏy­«á+"¶ ^ ë"QD©óEßùù[•Õê²R…×…(Âpx#øºf?D¼ØZ±õ¨ÄtÌÖ +<Û'”V‰ VWú‡Î!Bç%ᨲ†ïõš,Äœ]†ý4±JX4}éƒb"¿×ä¤#À´C~;!+ë˜9‚Í þµ2EÿBubJÓ®ðxéàS"Fg6úŒ˜rN#ÈÛZS¶iã׉½€lÚ­öÕMˆ(µÃëU9;æÜ(ÙËIÐ^ul¡}lhˆXH¡†ÞšÁ"8tÚtqmFø3 ÆwŒJ¤¹O9“ J]Àù¸Ù®™ËOÂ'¹:7 h×lEç{¡§ g.t†ƒgƒ¹œÓäëºfLÙjï0—æ5Í^N±\=&” æ Õa‡¹·4°b¹-C4Ïá,¬ç°­e¡z]¡Ôó2`Y(Åey:Ë `I.- ¥ ‹¤þÅŸJv×ð䲦©i­Ý$c­«ðo.ÊBEl¯¯B­U—WèÌ,ÔvÕ –Óÿn”Ó@üyQDC“¿[¹þÖÚhx¾Ã˜A{ªÜb:7ð”C9ÈÐÀ‘F·F:É´D4¹Q>üüíƒð,„JÛ#øPï‘x€¶G.•â‘õ;ã1Rùý<Êʨ×–ÝN<š«s¬€ õŠ[3Uª§"tjýÖ÷q(§lG_ò¢MS-^täÞNÖv¢R“Þ”cHÔ#«°èXÏP€9âI70 ›E±'pé&Цˆ{ ½L¡ëGã<¾·Ñ"Q®ÚS™B(v¤iwB×C ¾§fI x=Ès ‰É1Ýu ~yúC±ß¾r­´çTA7Š S¤»cÀ¨œ¡˜÷¢ó‡ÏSífK\§Z 0Dç˜4}8–ôTØUÍ@}8FÕÚüUÕSŒ™S:F.¤¡ H"ž§Ä&°:r¤ù°|Ç •_4â?ÿðŒ5D iQRÚÐÖ¤gíHa°P=Ñ1àEÓ·ñ¶ нìæw…º§ÈAþ&Lhr”ý9SW×µ#xêd{ÅñD³MAâƒê-USÌwÔÚ¤r üè_çýïÜ19«b ŠÅ¼r» ½â}ÖéÊ-‹VƒBYM,Yÿþ€–Œï½°‚ÝN,¾aºŒé©;ûiEîdx6©J—฾Ý56Hö©¨%ã·¬¥j®95m µc™š:jš“ 5îY†³À[°8ZÜàè¸hh/ »ˆ üz¶ôxFEb°ÜÁˆÀ¾"5eŸÕÅ1M‚–Ò2ôŽCÏ–Žƒz¶t g V„SU=%(ÎEQWnhÒ‘¨AJG¾Cê@}Q‚ÍÇ«…u9-¬ÓÑ®–ãkšÔ4–f£æÚ«å޵äÂV×X«r5]ñ½ÿqAäPªï3.o%Ÿ×à=\o%Ÿ×à 8ðKöú‡õ–[V¦©c.y?ZzkÅÝËèqÃÆyÅÝ¿÷¿¼Öå±®([ÉçõuÏÑÿv<Ÿ××ýû%·–°Më×Vxl°†>2ÓQ¹¾Nè÷U'LR‚Q.ûºF:”$-D|©ÔI«ü¡äª:á˜E'¼òŠ…$¨ì@ë”&#5kÁ¢§¨¿a8¤N¯vŸcdLÓ˜ÈòÚW¬²ÐWÖuœÈ[¾sl£¢7€¾Yõ²SñyÈJ؉rÓÇ$ 6y ‰Û׊BN³De5ÒÔõÖU7I­+‹È,"aØE((ýhlÄ·Þt쮓ÈþczØÔï|:uúš²cŒþõ%b¼€­À/oY$…DªÚ”G åt ¬š(eBhŒª.MPNÿ¹ŠpaÿÆ›ž@ °mýt+t×ÕךzA4 ´%c]ªég‚¼%@Ñ^ÿ°õ^TÖ]þT5› Õ²øÕ*½Xp«#Žbƒ=­1–F~Qu…‰¾à™ƒ3£‚ŽÊN³S%ÝÂccüPúš:i›jÕMSRj‚ÔûU"›j"ÛÜ(R2žZ“ÚUÌZË–'"ó÷1LjAYøëíè\)µ:Ѹ€š ª}•¬ òá•åÎè÷ ¤±jG%”Ú3Hûb(“ ®1i>’þ•þǙԹvê|3³ê¶VTâÒⵜs ÈFîH—?ßÿÎð Åx…ðØru˜ x8àqø }h‚éF§ý¹ÏÍLîe%ï}²–|ŽJsçHòSÏ9F16rá9­vn‘}^á9aÌ_a̯ëüGþzYÜ¢Øk·’1ÖŒY®.ÂåVx0TB¼lc}é—C‡Ë W^‡tù®öÅ8ä3ÐUXäšae *8>EYîÔ s%´ÝÔ&s[×¾r!2^MÂ4#%|ˆsU¢«–Þ¸˜%Dóúóòs¡ÎûrÄoo ù〥¬Å§CÑeŒŸ; àß,°³(˜`ˆtÙ›; Ì)Ž5æÌŸåïFþ‚¿)Mþ®stN”³YåÎÍrçBEßð‹¶B#/°ž Ó™ÄvÚbŒ7Úk &i@sæœ_ë´gÊy4u˜Ê¡McC–UR{»¨(‚7©n`º m_ Äò5ÔH`䯤 ÆiVZúöhøëo/äJ6Û¶¯ðï:Gç+¹Ž¾Ä\£˜­Xþ,7ò÷´Õb€:š‡YqÇð–ñ•SµDQ™´­§šß¾rTŽ×>X&²R‹™ØX«ë›bé×V²ýYþ*cM¾³¨Ü‰@9ŽÙÙåp³³K'pÚÙ| "DˆpW•qèUàA˜b(#OÄ1]Wéd©tVR¸ó"oø«Œ‘¼‰a!1£°cÂŒ´Óô{«h1‰â`qèû_èãõ/2&õšzC;k(…²yÃ_f á QÈÂÀkä:Zùý¯—å3Í`òZ#¾÷?1ÃKM¬ÎŒu˜X€“›Óbˆï 6“y1Fâ Ç*©~ÿZ™Uáé;йâ• N£œa䲿–ÃÓ>\J€±&xFé<°tþUº WBÜšçµy š–4¨CšœoAÄ1+<ÍvŸîf»ò•”Å\”×VôEPéÓ¨tQ"´¥/uŠCKûטuØ´Çyˆ -ŽßE¬GýRçaƒ-ÒæälhÅ&C+ù'}ú.8¹:‡™F}ÞòÞØÞ„Ôõ KÙä“t*òAéÄ®ôõÍ‚¥„²o‡;û»¨²y,´¡–jo yN’:çµÖ ‡A¶ÀÑ!Ïí³ÐûYOU©J|Žªâ lˆi]Üÿ ’QlG l„¹Ä®N¯ÿª¦ Éº­Ír›6«`Á7¥ ü²êFýVö.‰^*ž4^¥ùëЗê·ϘUwhºÐ°`Žu›ðÛ¡ê,¶ü·˜E9,¥¢ô]÷0réB^Õ ¨ ‹#˜Ye×a x:ëÀßÔe–Î xG_jà&„ér­Œ-2Vk’¶ÍrZÑr*þÐYGuâ«Y/Ê}é˜ õÞØ„†Yœþj7ÔC´äõ'¤Wá 5lú”ÚXÿ[*Vá¶•yKER1^¶*JF¯Tçøg‰`»¬ªŽekƒªò^$é¾…HT*ômup{‹\&âLK|)¥—ˆV£5H§‡ |^öˆIoVÞx–}©èÍZqa1A¯[\ý'ÚFP²ú4¤°p€¥qÁÌ´>Ó² CáúÌN ¯´¡aUÜÓ¾¿À@gAÛþ¼Â駪¹œìx9j›¸÷¥h½ãh]Cöì•‹³¯–½µÌؼçˆfƒc46W Ô ¡Fnômvn”6IBVl“çfz^(ºÐ€ˆb{a1/ÆibÈÂ+5DÄÜö‡f”©W ¦ƒ°P“gQÚ¦¡j±ö^©9Õ¾¸©)Þ"Íík’>¬ÉpÚÓØ³Â*G¥áŠóXÈT<¤e‡ ¶q1¹Æ/ó4ùëIû—Uþp"#‹µjíg.IÝÿþfÚä2ÍRW¡ )s%ýËøC]9êNr@7Pû¬•?@P×ÚµäSíbª:ív­vÛ+Øk/^j'û©ÅIí%Þª½`]1¾tQÐ'µE…æfÒ¥Ï,¹Ru[ Õ·+çÔ†*Yt9x¯˜îbjâ ¾¾éI+4q$ÐÄQ+Z¡ÃèÝÆ¶ˆ’R¯…ðZŒ´ VÑlWr %aK.+gRQ¨­k;„š6§JêZEI]›mQî$ èÚâ¨K¨è¶N©-ÓZ™ÂÝÝHʆWÎf6ºQ9Ü«*+¶0P›)ºL Ùyí€5ÓLÌ9Æ/JµÖF+™5ͳ«âZi`n¶Éžë©®]ùx­xk°aàyĽ®)\抷ÖyOã:jÔS—5Rë+¬æLm}ˆÈ|':g*Ž£ ¶¹aû¨ ͙ȗKaJ0ýQEqÃNAž[pP 7O%qÿ]°çÈ—kÕ^ƒe»¿n±?Å쪽‘Ó·›µ°BÜ3wê¯>eÉ:hZð4-œA^»-_®µ­³° d/謱^A¼$A¸HÔð×»(Ö„ˆz¢Ónl1¾ˆØZ1ä0\&¬ñš:Ú:_“¿Œ?Rñ¶Qú`ôsËÕ¡‹Ê1 º¸Iá/a1|¬u í^ùàǭ³¹Ö©á¬]Î&°®, î Lµõ±¦ZrúÄÒÕlèEç¥ÂÊÂùÅR~Æ ¼&'úD°I'ya±‚·\à@¿ü|‚ÊžÓ’‹f“bp·ÅP6™‚”=²Û\Ui£µÎ—Z§­Câ0ûl7re.ÊU ËÁ¤æ„Ÿ•SF9uËuŽaß”¬·À›Zoüá¹]Õ>!,“×rúŒjÕ¯¹–vÕ-×9¼©UûëµóX耧sÑVÁß[Ö?øëñ žrã×’¡ìižO+W++Æ:³’?<§Â!5o#¡\“KÇHàÓv³[sMG+Öb¿ºÚ¢¢äÕÖÔÔ™²s9ÈJÝ"bCÉ:µW4Q_V–øQU¥s4—M¬ëû~FSkX—Óq£¨äB}Á¹ƒÚô2Û³iŸ6˺YT›T5VSTZ ”'=htbàThdò»¢´ ”²ßÅC\Ñ!5/å#hL'­"_j¬•Ř a& ‰'¶úÈç€bûXJ[ý‹ý»üA;'ýwêœA¬»‡cwõ·`Þ0zT:,¦ÈC‰Õ_4®,ÝàN7䯖I·õh‰dÅÉÉ}'§l;Fà$6è&žSƒ£aŒ3-ƒ¬$ýIRÒ ’ÄòXG€Ûˆ˜¡ÒbUÄõS]—ëV~ÄR~³ÀklV"Ø“’Ì"¥xî´iI¢ í¿ñœ©Œ5ΰbüVL+îY°ƒFÐÁSƒ£c Ç5¦ƒ‹°÷ñdÇÖÁË…t mâq`™}i ?ÅÆ Ãñx XBõ† i¢LB$ÔhLm™ßÞæ·Ã¹ "ƒAW]ÝyUÔÐsI*Œˆé½ÕïÉ£³?S5£¥UƒO‰AHæê„%ª@ïÃôÍ §q†fÕ†ôÖe•ITÊ` n QYúMõÆçta”.CFèãaõNãÚ$V [N+]bpª72Q&nB²ÛÇr†F±à¯°€å±‰ž¿Öv¬XXÒy'hÀcX±EgZJ}/þaš;ˆÁ€"`ã rÂ? Ì.}_P{ÄºÒØ~>û¶9VßsO<‡¿ø­‚:Ú'X·DÚ"0騣§¯2'?â Çù"®ÐxFOó øA]œ¹åûp6FÊŸb¥eù©wšM£ÍÄ„ÛêôMiþÜ@¿§?¿¶ÙÁåˆó5¨“%®XFÛ+Hùâ< >94ÀÒ^ÛD +QmÔz+WmÓ¿žú3ÝWŠ‘'[Áþ|ó;–Zƒ®òmÁ“øÁòMà,,O- ¶Ö\+ö[5ìÇ‘¥-ù0̰ԅ£“`ÿ–V§>^\8ÌÂdm%)>Ϭ Ès<œS™ƒŒG wB 718¢E”¼CW%ÇМ•8ñ ²Ôƒ±ÖnöŒ¤â!p¯&§Ï·ö‰ t~H÷g°qA#r`qJ^Üðœù•âKYWúÁU}Á£¼'{GEÞL{ãÝøèõ£ƒ“â]$3¾ƒÅ…oM-9 À\$XÇ!ø&¤è8låïZ+âL"#kgÈnN8x7A€Ú"¹HC$Š?ãr‘ü®Á/‹dil%¿Gñÿ(,å$ºÀÏYÝu¬—½‘Ñ•TòÔ6yAe€‘Ñü²»À›#ŠŽk#8`qQ9© e+"ºdE³b-b±Žˆ®¯O–„ƒÝJÕ÷á†X„?-hká{…0 ~ð{jkéå2=Úˆ¤¹œþ 8Âu½hç©EÄDŽæÅw€.æFí^ï̳â% £ŒaÊNðàâà¶¥a9X§wÂFD¯. 6ªXµƒ‹ Ö.B¦z§.d'9ªÔìhä§•ÓtOè{ ÀÒD×)¸Ñ+ÔË·Ñ5‘5G»Q³ÈyèºÁL(ˆ‰Á²ìŠ8qÒw•ˆîuí`n«!ñšKî¼à.&/±"ÿN\çJ FÔA)àà•ÅAê" \¤›  ž¾a¢ÐîˆsáÞÔÞÊ’²Ö«”`£âÏC ½ÐS«³·V–.ˆ‘’$3®D|’̆ LÄç‘Õ#–Îîü 8hþwÌ$ú’ÀÍ %&‚PBY:CÊH¿Õ~á­ÖÌÏŽF°RÙé\5äŒØ‰2ÅGaæzŸn…·Ù±; WÝEªÛ’ÞîX°Ð({;ð•âàÒeǸxT'õ,›©ÌÚ>à úZ©mˆYgVç0nIƒÂ áåE‚•Âÿ‹Ã¹aN±…[BÝ™FðÎØÒ ²Û¬PÊå&'üʸHÎ'@ÓÙ/‡8:¬p7ob~j\:Ü„aЦgìÀ ‚[Š`Þc$X±“ÀµáxFà…k™‚ð;ðJ‚àÙMìÀ © Ž%d©?°•à5%› 5 ÿ¸¼'8»ÀÃÁq̸1 9V˜·õgrv‘å=Û;ÚáÚ|oò>=ŒQ4õ¶(Õw“ç…ºœ÷õÉ/O£K“4mg‰2ö¸x¹yYÉÅhõÚúhYk-±Ë‚µ'OHÐ&z±W¿aK浄|.á”¶ÎrÁg}ªñ†(˜]ÀK(žBÞð40B<…2£·Á(§¬žc©‡ã·L¡ž ù„Í;ý‡K ù8—‹â,!I ˆ LÄ­,¸ûq‰×š¾”S/X+nµ-H¹ÍŽ'ÙØ]JˆW%„S į!ã,M¬¡d~,A/S€o)ϧS¬;W‚‰«l0œ¤÷ÄÌoV–˜ä7ŸnŽËÛi¥•%ðu®ˆvH˜¢?ÆB1Ñ}õ*µ³\¿VVY—š—§YšNÉ(z .C-ÕpФõOÎTF:X¶bpÁa‹Ò%qvíSy3e^RFk=}ޱ?J‘ÞÆ‚´”h‚%ªF`²*±( ""|9x×q©žGœŽS‰mçùˆˆKÚÏÓ1›O›,Xg; « @p†ó¼‘«ÚMÎ3R@âi‡}3³6ÖÌ جC°CÄÖ³,kV•.23Ïñ¶M;cªÑ­§V†Öµ‰Ý®oYÙ‹ƒ³—cUX¹¡`ÔÄ–j>é¥3ùû@]µ$QSç#Ù÷hßG‰ífuÜÁb ù@^n0j™Ô=e»–!Ëò,ëÅ NŽN»ìôÎ g\ÇÔ>ÓAè±§ÈnR8á!.ûS1t6C¿8-¦i¡àUÆe?Ï]Rq°ho%Cö (XU–9w­AepB[T´…9®–îÀGÞ¥#cÀVƒÑHÀ[bòNŒç.dÁn*²”“¶-çË<­$ÁÄÞ9XSµr¬‹ ? Ù—þ0éÄvpM <ö ¤¸r™÷®×4"0Bb‰KäãECbN2^ø¯ÊmR|iò Ë 9’ ‹§ïO½[PtãòµÚÒš±Í›°àïQм‚óÂn˜eðNñ+äàpÈÁ‘ƒ? 'ç§5U–÷hÖù^åÙ€à6ÔŽxïº\‚·—BãÝË{±w€Ód`Ü=åçZ*7¡î°NçïvÜÜÁyÐTŽÂ¹+‡Yóq¼'<¢T™'—Va~ôëGB TAËxaØ»¸Â(&.çy·ÌOØ8G?Kl‹;ÎdPgîN㉴Áå‹¶âÂÍ´·èUcf’ªBòzUè½ÁN{P&x§QÊt¦Åù›¬¬ :Qü-:QœÑ‰âÏ´j…wÔ¯?Î$^ÙÁ ëø!r…ø5nÕvUB[J@;±´>Ž,xA† XRa÷m¸5¤ÜÎØ9arêÞB.qŽÞqÆ™Ñ÷eD­c‡å¶3 7yÁyL d}d¬+d¡ZGËÕZ¤œð#ä ‹\(g¡´”°“ uä=eÝWHM•ĉ;5|7Y¬pl¢Ö¥VÈÍ9Òºs§µ˜Å²Î¼-ÏôjÁÂUÝ:Øç>5eŠCd.“1)— ˜E‚‘å ÈáÎÏKZ– l± 9É’ :% 8±ò1L‘)­m·!'±‚Ô6IÜáŒå¹ÕNìI``Ú´ÀpjE­€ß—Ðv̦mÅòN?›YÁÍXm0Váð<µðê’:$âF¶E8FHl˜(™hôcGÙ £%Ù¬íì3rš±r…á9VZQαÍbµm¼²‚wr€%—ꆔy2^ofîݶ ⯮Ý6b'¼ X~áíŠibRîX •‰ä‰`P%–ýBL1 oBÁ‚AiÇ©/lHîUŸ +-—Q—ê‚Õ¶Œ’ߺökÎ#`YåæòbJ¹û(a £@)[=މÉÜNµž0€›'Äeˆ$t%žŸ$BcƒÄž¦±Â°ºóLÏÌ]ư­”JU=ê:#‡ÈÕ€9öyW)VʲPÇ&ê€XQm|MˆT•+²©«,ÕTjIª¼§2ïTV¥ŽêÒ F‹1}…ßS"«W»„|3¶žÊõ,!Ü€Ô`ðÉÉ@‰‰ÕKà™ˆSÅÀ‚Ç«Nñ垪«7k˧Ú0j˜m#ç8¼Uî‚3–€YVEÊ\àá¯!^þ›"ä["”`í ‹§†-`¡añVö´„>²6?›¹¢rÄ‹H!Øféç°9Û1û–Ò!6#8QÖVS%¡Åºaƒ§ª¹Ì4¹YØ)Ÿc£ä¼ý0Á¢¦‚Ó«vHÕìÜê^Âj¢—6è,ªgåé*í¢*LQÇéœoõg<ÂV¹†bYø¸*RÅXââ,288¨’ªôéö.ÔÇW^Àâå¸+3ȳ\ꨭ ³aùÔ°¥²7ÌÁõ–ƒ­m·.䤺›´ …‘Ì”p á„ì ùAÒ.õh§êNҲɮ–AŸJY*É{ïkùxs±œ(®ôZS˜}+r„•¶”f¾‹ìdXmº{1·)¶hHTëyPG·0îRQ±¶Õ*¹eå'>¡ð*S98ûÂO;n çOc¬io H÷Ê#­‚A³z\sYÀW¹Œ¬š Ú¬µåe”Î^þüØ%O1ÌRÜ»sRÖ½„Æ+bTxc·ñŠ®æZ½9«®ÊMnϪzsV]••ÓÑÎ\X}œæÀÒCðÊ%Áè¡Þë´qI °A÷›KK¿m­3nt§“ p–[FPH¹Mƒu<´ƒÐ àÍÍT–End(Iné‘Uà\ª¹[vË*:ÍËVË$Ô‡® QJóY’ 9€ÐB$ižß¦×ã ˜ZV¸ìrÊ»0ã¥D´4ãIï‡ÿ0üˆ’VÉ H½Ñ²Ià,¯ƒ£. øšvåbÂ34Y=‹ò>Qüà ½h\€¹D݈{X¦Ž±ÅaxuÆ€Õ™ÏuÒ‡ùU _tÎÃSÐM”›º”YÏe2 Œu)?èÓØL‡ØÉHôk:v̘ðsÂubZ ײ‡¿ÄBÑRãò þMD›ð#‚'Žw \•À´M{dk+&{ËÇh+ h^UE[Áxµ¼g‚,s%úcÜ󪋆¡ÓåÛ–‡V—Ç2ÛØ Ã9„9®Â —-êLÁë:-£ZÚ·"~³…ÞÑ£P+Œ÷[ñNÑ`ÕóÔ,œõ@°Ã‰M»S¾…n5Ù&8RCeíF±JÛš&ý”Õ ¯ÌÚ”ïµ*ã§’*h/€ Âæjì„~5Ôè¯ÅÚ+âÔ´–Í"ÇjU\s;óÍmÐVgm$©Óz#W|V§©âeÌ”Qʘ#¼es¤ ®å(Tky«»:½õQÆz[ǯîjlã¹án§±YÀÇñ΀ÇbŽÅdcòÎö³ÆÂy Øûšã”!36ÝÁ‚VnÔPà¯ãX 4ÍœöÚF´²ºRP#줨ÙÍ@ý!Äà7§Ù¨&¦­þ¥¼8Sã×R­‹Åx—˜ÃYSÁs©c¹Óô|‚EoFf抈¥-‡ïqr.Ï÷(Y¤`¿`þP—Ï ´‡[²à‰~þwT‚»Kxþ‰¹†C.¸%¤Ç¬òɆ×ÀÉfK­ezxóð2Öƒf;¸a‚ k¸ëçØñp„ÕßÌßÃϘ?æ5¥ž‡ü嘦NïyúTk y…¤²3§–ËN™ZÁvšÒJiDö»µ”4/h’@S±IÕ‚ÈS¦q…³Ö+8£L5NgZ u ã줦J‡+±Œ áNº‡¿2ÌA5Ok^Á•XtdYik›ÆÙÊë¼…ä­¬p$mt5gc6»ŸÕ ñ–áTO*Á’6œÒšá”‡k0bÊtX0 §üAŠ“ùDçÃù& »á”‡Û07aØ §üQx¥žŒ|Nôâ–Úø4Ð°Í §à_ÁœÆªëŠpwˆÓ23u<á¡0 •ÁMÎx¨ƒÝüö0­Áº=”H"}¤ËçpðË3rŒÕót‚ÍÊ̶jWùsÚ0븈%ê(M35Î]®|ýAZXGÓE;F-AŸ®cG¹’´‡ã€k#­Bfi½^­h"+F墮pf3UôtF–Ø/bŸ8LÁÜ“Z9zpÑßAë<öFkbvç$ð¯Š<ìx2•tEù»ÇÁjäÝ™Øn\òŽ×ªÊöºÀãQ<=ÇØi+¯6ïwÌ’GPœJÐÓ³„Õ^Jh8:>Ni·¢Á@ƒY….võÙÍraH¨ÚJ'Ù½¢Šg:2J NðZÛn´ØÊ-#`YõÜb7K˜ÇWœÑ鱎Á©6k1Ó ÖV€ûÙ¶ÂG“â÷ƒ«·bµ¸ÎRƒÂ`¦]®J,ZÁS§P…ºÄò€©ÅÆQÀßWhžwzK÷ÊNîq…Ç8j½¼Ü?í–ã”·ÇY`†t ¿W# |Ù3 38qvªíªÁnÅ-Úzævo‚qŠk´«ñ«åƬ½ ×Ôpr¦ñ&$¯l^Ï&v8Á’iËeòs°¬:Eœ†xF)#M¹^$” ÉÂ%·u‰  É.ͲNB/ÿ»-T4+—cJ#Óù¡‡S4  \y8óñpm†`È„â@c— 7gÌ ÖN®«ÐE$zh’cÐÓ}΄^ä¡ußd°,IËÓf<‡§¹¤o§Ø(èÓa'úV*ĸ’ ˆ<Ü Y€¦‰œÿlÞñ$º‡ó!ÖÇgobܽõw;Z»-Õœ@.œ@æA·,c¼_$Œ#vkó˜¶Y°Í+Ø“¸Hu|™e\õ§ÚVÈêÖÚX–{p6°^îæ!ºYûM¬TÂYYžÕèG÷”2F"°¡¬µI­XѺ6û„k󨳶l·1sÚÙnË;Ûmgæv›ð5^»Ün‘¢3áó žÏ=\¦yOþ“—µ Ž:#˜ öó„NÂÜbcR®ç ÝÂ{'áó¼«rCäΘy¸jóž²ÀÊ&“¿‰ïxiµ¿ïv°–÷ ƒcmR½Àp£¶+ìh ¯¿ØÙ¾ê1‹j±«-Ö$Y{ʰõì“àÌñÒmà—w5Ébßê%Ⱥ@ë˜BüRåmprs›ïúPØ¡Ò4]¬%ª†<Æ[%hì2,ÖòøZ–Úf÷¹»Ùsäwé>N6^™ïí<Ý©ËÐ\Ž ù›ÃM ã½ñ )žKXÒʸfõÌšo¦³HF+¢El±LƳ„·åG–5‡f˜CSŽ“ÇV–9Ç1¶:Ì8YŠmêU¬Œ(0F О,mKÅ\u¡wU[YbãÍØ2ë±zTe¶ ¢ <œyøqóª8(ã¹m û ;B ïía+r±,$é!HC€¥‡â&vÙŠX¹§/mS\/x` i™!+q¯œzê‡,¢–b‡€4wó äEwB| }_ÖC'g@ p<3€ª!ȆÂvˆmÇ€Ò–"ýtjÙ%[UµU£¶ºÖÆÞ‚Ê †`»0 ÂfÐA~?Ôr‹.—Sâq¬劽¦Ù½8ß³£Ñ˜BKa«Õ«ä½›¥D]®{ºÄ téägvc,«Wûžk— ü4Ÿ=ù6Ë•Ø"±½\8æ“réݶÇÕÉ;˜‘5 Rä6ϵ N`–mžÜîÌœF ²‡áއíËìÄhÉ$’VËð¯ïjS¡ÊÈU·V‹‰ô!£ù˜ƒ66hyÞ´gZR3¸29Räý§@uĨ‰Y]¡¨ßãÑ‹ûy’TùÖ¤“ÓÚǦCôQ62b¶–eÖ&sX„ÓÈ))A“ØëâÄ…”ÓŠ]¨Õƒþ°,ðÍ- S  %‰u#H»ÚØGñž!ÕrïÅÓ Ìªm‹…Ü ï–OÁ­î²ƒoØ€Œ@w‹±‡w@ëðAz2û·²kÞËÖ÷Y6Æ@] û‚É0#×x¹°”¦×¿"tL³ãÿ¾=Œê<œzñ 8Z7úzögz;£ü;¶á¨æÐŸ9(8ýlPŒ¼­myG僧§O¤[%Äú‰Uf.ˆ„?›#HÐÞÌ›‰ zÓhcmþo=|ð1Ð!øác°}zøúcpC²R¯wzˆñ0–®I¯H>l©æÑ1Ú%XQ&:;¢{$®Aé±q+±ªÕî<âP¨zåf×°˜ç[NÖȹ©m›‡@Ÿœœé-Ç’v±zbΠ‰`É(Þùaxïi­‚]F“¬%ZËôŸ8±éô‹.T—CcAÉC<>°œ›c¦"?·ê­qUHj ‡Ñä}9:¤Æß3—'*×±FóØl¬ñE,añ”îØIl6öÅy3gÈw\ïÓqP¢ÿL|g,¦-;]R±<ä/Çã£(¤KÅbUMÅ^7‡_>>‰…‚å;•°tŸ±qè äIbW…“Ä¢¶È †W=[òÒ‹KÞϵéÓ-ÈÄzÿœ–ùZXo'Kii[>·mUOì$iB>·4#ãâ6ñîqY×Ò Ž‹[¹âl]ÄÕ$‹¸‹ño.ÑÉim–¨ °ß­´ëÒ¿í‹|ì`xZ“­KFø¼Ó€çt«„²¥\… xàúÿ ²%ím¥„@Fü÷yÈx—/¸ôI0©‹ÙøÝÔåf+Ê©r/o¹ÙŠ+u À]À^’Y,¸ÕtsÓÈÍy±ŒÔeœq6ToãlS Ü%þé!¶õXüe?®ÅÓ ä­ K¢2€¸ÛH¸ô‰K€ÊrÛЂ$(VP®‡;¾8(!?ÉáªS_ˆYÒÎJŒ˜Áù‡,7ž¶³é"A1rÇ,YÉV&W²5;m!P™Ì#¥ ÀP-€pÐà!ÉH êÿls 1ËuáßÑ6wn[]Û¶tm›msÚ¶½5œZáf+Úl…­ðÒoìo ˜@‹Œ¥m2ÆÀ%ž tøk± 2˜­ïæH%OiL›e¤Æy ÃqŒIÐ X%ÇdæEå4{+O1Ýb»×“xé·àuØäpn[pÖ¶pî·•[‹·¹ ÏzÚâP¤Å£m¡Þj[m œoðÕç¡[÷PÔú“à›‚ ¾ÛùayGìv—qžr(@‚P"¹´QÙb·Ê羌õ!@÷4E„’íTþ„l= 2øä†²ü—!ƒ´‘å4Æ[æk“Ä´ËÇ'¼ð›Ì7=#-JÑ›A¸¨üíáeÆÃK•‡§2·Z. £Ü42‡¥¢±PIÀsŒÏ9ž{>Ýìù›øÍ,¦œ{¾Þìùz ¿4r9Nø…l“©iIÎüّܼ¼£$H ¹Ä¹ÆÛt-_žºÚT×4uK„ ^ó<ö Ø2DÌe­^,cj.ãlÙfNª3ÂQ¢žÁX‘Ùyð±ÄƒSD ¶Á®¬£?ë„¡ÑI€ðt-;a(†:`<èÓˆå2ŽkÅVÝ„ŒË#@–é’Øgž¬ô¹é²Ìky+Äk“…+¨–•÷Í« Ö|]øyx,´€%œ=ЈÏr3íyi¦·bI½á„ÑÓý⦩YO%ŸK¨ç‚¸¯BqøÖ›“ư‰Sç×X-÷ÎgíÑyLñ¸¸[k`¸sôE.xc¯€;B‹âá'Ò::Þ°W{qHÔ1ÊšÇM=2ö ²h”3³òðáDö(qÎQäpM‚M[gƒ mè£U'.V¯skF5å”PܲˆpÎÏÙë’=lÊ|UÊ©“(ÔÃCcʼ‡oC_ôê7+zk+×ôÖscENþøÂÛûú§Þ,pN[1“ÅBëŒÍ*ž­DýIRâ ’ÄòMtR T±¹T´7É.•¬êf>݉Šrh’µÒ(ͳF¼Yà$6 e$U„únZRo¥è€g$–?bN+÷ hYC+leµmº,Õ×38ÒÇX{Q³MŒ¢ç*²\UyÏŠ¼wœ]ÕTyTº,@ÑŸÂ >A|.}ÍÄó"´H!Œ-w}¾fÞ̃ˆœé”qÍ-±iTÓ“3G'÷Yo(Å.}öð–ÈóTg.ÌÅH‹Üo.zÀHß#[’àv6 ̨~ ½È¾|[‹iÜ,†RŽQLJµ©]ùÙ‹…®(/„p4<¦Qœ&^ i_é^$€Exá1áþSGA½³oÀ ÂýÓ‘!ŠêsÓŸn…ç¥:ˆ‹áW” î O‡=ˆ³]@BMÚ²Æ$ù®ÚW¦.Ó×ÞJ&_õîVl±ôrÓà±xÖ¿ ´æíÃ!™{xú¤EúÒô'I¢ ìÍw·|›õÀ‚IÐ~.}•å9íû ‡Î­‡Óq1¢¹rvø´Eþæâ¨l­]+Dmp è+Ç?ùRkâÿЯÍr²Ü fVhEò¶vš¯U~§ʮ/A‡'¶TÄF³!§ÙTuiÜë¡°÷i _ªôGtíŒîÒ&ƥţ¡ •ÌÄÐ:zÅ4qE=‹º|OiG\=ŽQÞèW툾 6®3Š•c ‡àH[`ð‘lðYìlÙuPË®±ÔyÆ‚aêÜ„XHõ";Í÷|FZð¹Ú@ã>¦FŒX×\tãÉï`nø‰¬¾Î§1_ö& ¤l0ÌÚòx*7biµHÖf‹Ákä>%åOUXq_ýyˆÇ|WœºÁé¸ïCðoÝ`Q3W"b!€åÂG6vïè~º0ô5µIáà°ÏéÅÃraÞš|Ò«ù‡×çôVbB‘ Bp­Ì}²ˆB)¡Øäå’œ ªŽ±*gfåZÉ‹7# yBïá§ÏWàî×|5aÙz€®)aÄÄQãÝ!Þï ²ˆE%|9¹!ES+ÕC»í~&ñ$CÚV7z»|^Èz0ñµÖäáÍ΂Èà:w8âb”_‹$“/gãúÛ& Ú^™Æi°€ghû*˜Gm”±.Õ<»’¹éÁ—cGZ‹iM>*ðÒ /ð¡*ÎAlms3m—YåÎñÑí×öi׳5Ò'˜du wíp£³¡"oÓÁ<%ùvhÎ ·|ú°wfK:ŒÛ‘mxkÔ1³è€%3ˆ¹RZ³ÒœjCàòÎÞ‡—8<1¡p²™ŠWÂÊl²6éæìZ¹“i³a¦£;lLéJ¸¯ómÜ´ŽGyOöÞ!m¼Ê†ýl··/m"kmÞîQMûÛUëo}’qœGÐ$Íô 4æTócÎA‹Á÷¥ñ`vM/i•a¡½4[ØÂ|7Úc-Óiô6`X Ù —öí”ö@ ¼Uò)¯ÔÁãm n–Çg=r¤hq<¦H)ùZô§Iª×èõÏImvÕ87XõßÐäÝþ‰wrü!‹†c<xžëzPulyB‰Ê¢\Wèá0ÑÃ뚇¶8ÊÂZ⤳ Åݙْx³„f%ì”ý¸AÖ[Ê&Æ–…dÃuœÉá^n&7°哘sÿîî<œÌõXw¢ÃmÌ¡kÒxœÓròÊdÿƒÂÓ7NõwŠÇ¹ÙŽ…:Ö…â1oÕb—i¼’̦ÜJëÔƒÅÏùVÜFõÕFÊÍ·­1p;׃¸p‘ÆÐ·oHsX…ðûÑŒêx‰–5péæá‹Î7™ÿ N¤¸pjR‰‹pÏ"Ôò tÕØŸÐ]Â/]$íõУ §QPäù´QiD2¼M"€+Üx‰#Uœ¸Fz<·I®&M*¥@ÕLûÚ2[À²µØ†id^âÐvòs£:,™/ [æcf¦BHDâZ©$FÚ XlR\_„Ç}ì™1:®ÇŒô¿ˆ]„˜%haØj^šXNµÄ|jLÑÆ°„Œ`°Ê£žk_Ó²¶¶ ”/{=àZåæx¦Ÿ¾m<Ï> ,Ñ¡DGr­LD©i1j*´ò,ùàò¹g”áYROåT´;hþ±üpx•7èTrÞ„ÎeD€ ;çÑJNmw¬‰ÍnøUH€¿¾px»ŽÈ7ö ´kð‡Ø¿äei–o.ÍòõÒ,Ы>-‹T·<ÍEض¸»R“ëª=¼Ô]—žC×`XÒòЮ€&‡€‡ñ'lÞW,À¸â¾k€®iÎÈ‚¸ô’y§“ÏÉäã9$’q IxÞµ 0Àt‘i| r­ÇÀ9ÀyŒKY)Yr–вb<ËexÙâu‰…U·å}‹C¹ôàΫwº)»3Èha†g²@5V`7c1ò5)'‚,¯Ž qœE%'rRBéÌ)'ìtRîª*\¨?ñ²BË„ !Vh éL4ºcÔ1œÒa$Ùå‚I%0“#Ïé<4ƒb¡çøÂB7p¡«ò%Ë q†r5Üî °t*ÉÞHÇB˹À+α`dÊ‰í ½Ì€ÞሀzûÑ¿d1tGÄ㸯nyªÒT:÷RáÔ'ÀW‚¸´lÅÌî)ÚÂÁ‚¥e+þ–t•ÁÞ²x0h“+(飛Íb ä0Vºg‚‰†l÷Tm¦ŠšŠ‡D ýÕ~%ULOÂU88©1-©b&JÀ£áA+ÀÑV€ï"í†oQ=72;ÞÃ¥_¨l.bý!³mEfÛºù"¼9|áMÈ‚ÀÀhˆ­H„õð¢›3‰g™zOm–<Ÿµ^sÇŸø—ääÒ€„ŽŠz¥éÈI5HÂ!¤12D;Öhkº0)è]DŒ5$"cŠ!î)Å,EâªH½@¹æ€<Ì(øjÀOuðø‘x‹üZ&-&ܱ×;Yܹh7AúzàO)ÓEn˜í†W–䤒‘`à%"+”àÑ1âìT€ó³?d!Rà%">QüDx= ‘šLO5DR±£®bJ! D(| (£×ÎCT€Ï, xÇÚÊ/{ùÌÄ#9î(LŒl-?LUD‘¤Üuõ€kú÷ÁTô 8xKªîDÝX¦RÆ‹T#íÒ—hƒ’üEbŒJg¡ÄŽ”¼­ß;-!¡ ðÀõÎ;…(‹á˜©òã²ÒÅ!…”“dRNq›dßIAÎ=1U;É5xoŸ•kà8+DÑHO¹Îz€ñ‹i¿Q}þFžzwÇ®áˆ)i/’#’¶s¬ß/hoäê]@Ye¸€•´°þž;ò¨l¤õŽï†¼ðàY«ÜjtŽHd)qt !’ÞT¡3\qN­zP810ªà@,D® mv?°ëˆ%Œsf(ìdVµ±o|ºÒArYèÐ#6»7'Dn½ÛR'ˆ›­—Y­ÙRçe=UYÛÈùÊB+ÄÒ±…?¸BH‚8Ð*ä dÓÁŒwÆÁ÷㸖æ]ˆ©e-–ã-qKv;/¬Iþœ!"ÚÁU½®ßpf¹7ªPÁ¹(´˜"¬j&ˆœÑP߯zp` ¾¶<@…ij "aðDàÉ ¸G~YêÄ|…O+M”³„8y‰³+R4ƒ‚€³l.À­X€ ®è©HQ‘AÔ‡j'> ЂFÊÔz’-AžjæƒÌ–u¶ 7¸Ä‚BHÔLéWÌ“ Îuõ<åÐyÁÅÀ‡‰sΉ¢ÎîΦd¼ËÙg+ >Õe☖Y|”‚p²kNžÈ÷=(kÆ…ƒ®®¹³¦$Ø€#­€«€”Æ–L¦O[Cm&xH\uÆIf - M¡`“"X$*k˜¾H^xšb^,ª$/|_Yà Ž‚tUè Û«õ_à '¥:Ĺã}|##¬øª"òø êD 2€ ‰ ‘m]øwÇKòÇ&ôÎÇßÎÓá¤î”2ão“1€ú$*Ì57Hq—°xê[“!@wj’1ÏÓWZðR"¿qÈ`I„g`l¹øW,')(S´œpoec 4ɼ̉1!Ïcê–½a}´‰g6d†™eý$“Þ¦<Ǹ*έ÷M–m/ÁEæWBUÏ`ÐI]€Ç*…£Ž¥!dRº»`-U/YØjâÔC\§L8ÌŒjÀŠ5@7vÆH€S®ÿW¨3ÁŒS‡ï{l–AFPe­S(é è«mã [* ©ÏŽmjÔæ¦ÎîöŽ~M˜.Ò:€«É€&K‡5LÂíMöN@)×)_–1¿  º‰úÞef”Ǽ ³êˆo¾J\À¡g* iŒ´<0Ï4[´[Çã ·ØÇz0¸:Áœ1zsÔ&Z_¬GC"„~:µ¶ ¡iîØÓ4YhÆY×!ð;äXï÷ÆJNÉB"‚?ó¾í9¡G‹Á}Û, `ùHt±`¶ÃunØobP=™0Ž õX.ßÍFW‚Ý~¾ÂLÚÒxBp:ª„jî{ÏU¾Z‰€!.CûÏ0ˆàf TÉpåÌÞ˜J­‹3yK-"2¶¾²,ŠáR*`~¸§ Š«—š˜£h¢½F˜L]ü<|åÆqF³l·»N§f€ó¨ÿxó®š {;èµ:1;¥=N–Û#Å Nfi¥&µ— /Rn ¯P=†÷wMŠw1©Ó6¨^3e}[b‹È—iK<¡˜ ‚Ú8€#J°Ä¶%–Ë" L[Æ=@©Ãý7¾‚¿npJ†™‚þ:Ý5š2µÛ!3-¸.¤²iŠDÇà<Ûh/}é$P|Ý“ªËˆ7ÎX“Ò;“X‘sœEgøl*­X2kè ørJKuKxeBp7 Kån]0Ú¢p -ó€ï§¹L¦oèw]´ú'$Êv@³A7¢Í6žbcz0Y:ãss=Ô(v|ËÎŒí§æB¦?Œ@?LrD.ä,Óž‡}xDn;o&ÁÝzÞ,ÐáO“•ó)4×qNÍŽ•±nñØÀ£ ¬¸0’Oùr:èÆsM]¯W«âài i`á´Õ±%ž–Ê}¤,ª<8«éQè%â*{5 jÜÊ•ã8¥?Î ðÍ Õ1ºqgøuŽJð_8A p»r­›µ7ŒXŒ¸ã0Írº±ú ,1ƒÇÁË»Ê+µ3øæAZ[ë‰ÁÉ‚ÚÚû+øpp1¯ÀAÈdœ@Ü8pý²|"@«ãñØÌ9x˜ã§0Öò—wÉ‚ÔðuzŒ0ûË ¼+²˜#Š ®G3¸FJb¹ð–h58j ptŠHŽ:h¢‘/ýCgDèà5óÄ46sý¤.’0B!—dÃÈÒÜh \Šn>-¸£/íÖCv9öÉÀ4á³§bäèô̱©©Í3i0YnOGMBñ+jI§R\Z‡˜û@íPì/`Ípˆ°@…WÇøÎ …5ay^xuB€ð2•mEK'í¥ýzô–׊𔣨b`¨ì)š ç5ùèй llHÎÊœØx³Ovê‰0÷òv–Å šeªÁ*áרÞŽ¾ÉAÑ‹zhijÔK3Þ2OÞ,Œ.z@¦®%2–ŠÁ Ôx;êa&Îhœi6OòmðÜ6]È¥é7¸/VA£c2Ûe±Qá*Ða5Ú †'Ή%aÜá p¦6Î K f] ü—Èa"À)P†˜&‘àwEhµh&Å«X rP‰e ýAo6ˆOµ-wãxС#º¨-))rSƒÃ’Û0÷n*u„R”œ² ¼1°q¢£v&Ña;Ka.>ø’6ÉEF'KóæmËP˜I-Ü€xP ðrÔƒvB]Ô©ùúp­!,®B©Ã„çeJ ³‹×äè\|N3y6gDÍœP4c-Æ­¸^)ÕÀ­M®ªÐãÖ^°1`0@UÍ*סªªpYcàR¤Ðßi€_¯ÇTUJËÃp~ qÁ ›®¾Ò„ü‘üèÍãßÝBÓ±IÆÀŒÆ3S¤š;TnJôŸh‘v~ÍöK?7Žª%'Z%M³ÒF6¡>£Ný*âÈŠ.T z°’ã‚TàIª÷éP½,îAl¼ñ8*KBv± :Ä[ŒÒ´»0’TY<’MÎr­/ÉE9؆êËyrØÂ¢°5‚ ˆÓž=ÐÓ#×Cã¡Ñ“ÄE¢1YŒ§úlCruµBSéJyÕ–Z2ŽŠ†ÊÏcíNiær`m-á"›'w׳À••&@Ž•8ûËâ6bœ÷ÈG[£ÊÔ¾V æJCòOi`=£ ¯>r´©°ñ¼*¶ÕÖvÀ îŒzÀ1 'E*¸Lq ˆ"çV’WE=`ÕÕHÇÒ­aº?E«PFv¬ÈhNU“ŸÜŠkI9¸Â{!$Ê8àô£!üBˆ•”xxþ¦Ï-[²ú!Y +“2D¸¯à'U]ÃEZ/ñ+¦Q¦† ·¼Jx[ â·vLÜ‹žß7@¯f¬Ìšš…p‡ª¾8™í8Y0õ$žŠBCÂ…Naˆã$Õ˜¾_˜–²€"Δ7ѵäÉ|ä¶; ìó©ñ* »•h ÔY•p²m ÆO< ÏÓYH@èŸ(4£j¬´’ EÝŠá?‘оdªüÍ îôpÂ3:`?œNç8õ0µCµó z‰™(mÆj;$¯4Ÿ µ™ÞÃ2³oBQö8ž'd`³Ö›^ä4“ÁÌàÅ(TZe´r‚ËT:SB€©—Ÿ N>L\’ÅÜg"ÔÞÀ$Ú”è71Ô¨¤²Ð6òv¤!+öPÆrÇZ£öÅ×ÓP— ¸ý¨VÞ¨ Ã>78S£9¬01ªÂàsèÔw%kßAáJT1Ÿ]Å´êÚ.'ÕÒu”Žsœ´$éðTš\ÄpUZ–Åèºú>ʲR.ƒÙ7Y(¨7="‹EQÌ…ïœÈxÍ ê>¿á*À9RÿDŠ¿Y¦1¿ËtH²°Jº@½ CÞzQs"c<æET+ÐË1Ù*Gl4?ÎÎ>y›$ü(‹Š¦¢*£BÐyåe3&ÀQÐ:Pì&L¯d-|Ì¥‘yÌ/ÃL`rpxú\\®x; C{åÔþNWU%:rrY fÃHh$©¤¥\—<®8i)Ñ'Ñs™0&ez)±Á€&[([Ì皘ʹ¦z̤èŠm«KAQk†qÀ¡@ŠHç:Òöã‘~—ÇH2"¦B3•*ñ8âèLÄ(dWcC,j IJT*ŽÎC#©é\1ÂÇP¨Î‚ã«x¨d ÇU»Ã¡<žÿ‹vëâ‡wG¡)òäT[éÆ3ª?e›én|"|íô€2UšL]D H úSSÛ¤ç<ñð‡ºßC u…S[<¼ƒÁ왽Èú)Ê·ŒÍÙ‚¨ÈR™¼ŸŠ£òÎñ{ šÅÅ™¡Ì»—m ®í°¢¼9-­û1õ„R†¨5éîH„ÿœç< ty¨œÎñ“­Kès!ÂÕŽr)ÛUÓ© íÕµŒ)Q¹Ô ´spÆ5V½ÿ ÔÆù õ=91DÄ‘€#ØHK è6"œ&õŸ°j„çžl¨d*T9£™·Ó›y‹Á4²Ó›[Uñ ¨¤i[ζÅì9êLaÀ—áM­;"eé9íLé‡Ä£>YîæˆþWϤPó1‘Ï®²¯E*Ý áøçȶ­sÌͪœ‰Ì„¡Ÿ™2™ç †Öã–‡nõnÏt™:iÖÉE¢¦`QhÜ'‹GÙ2™RV¦FÁ}5“7–êd4ùáðZ £×|¶õøêW‚üÃDøVéA]ÒIéC['’É[ˆŽÁ ¢rŒð§]0·2ëœò¾H·94 )"Ñre lS d'¬ø—‹4l…×¢8¢“²ìtht&roMX6Õ é±ˆ6Kmµ—=V:/Žs.û¹!¿¤ƒB ‹ŽâsƒrÉÐtŒív'þÅ)÷IòPc°¤(òItI<4›¬@E„“˜ˆ³{=(‹˜$sUxC/&“è¤k¬èUúXD޹ô“¥ôŠ98¨|Ž8@ýÞe€#‘ê…ãÝçzlZHƒtbªú&V•$^án5m ÎÅÀfì? ¥w<ùP1¯‰®ØR^Øõîÿ3 ¾"8FMt…'õ"‰»AÏó³<*ÓçЖž/M§ÅØoCmàEŽ®Àç\=MÍðRGe¥ B°q2™ÙÿÊK¿6. s£øÊÀ™JDƈZQ¢#_T°X7>=¨ }šÄLê2o‘­Z«W¸otÓgÿ¢®G³›b1º6àw¡7½ªùe›=:mhcI= ÜN3áaÅ­à6dæ•Æú±ÝáÕ&â`g_:*>©º¨ Š.[Zû3ÎmŠ"Ý W†6ód‚õVDJ²¤bŒÝb¦^ö½íQ^Ñ‹?Òyì óI~MŒÖ¢§pÔ¼©¾"`jÝ$•>Ûj›I\{zéÊa®8Šq¨öá´z ÷r|>Éa^¶"\åD¸Ê‰žÍ ±1BbY õÌ€W3¥´±eC¢à[¹Â¤è†ˆ“CV\ ₳Mâ ÍóHôA7ŽEÀeü °tàƒFÓÁf—›ò,ϭ~\AªRÇ1¬HÚ剎¸{tﱨ2º…±£0²°ÜÅaÙþ¦¾Ι¢çªN$Ô¥7ç*Ç–¯+4'O=óÑAÄŠ3ÝŪsvìÚÕsß­œgi£Oc˜È*øˆÉHÂÍ?ž„‘qÄY¾Ï5=Û*\„b֩†u1†Ïô„3íi ¼H×_ à4™!Iòj=2-^‡…€Ñ§#NñFñ‚3µ{…†‰ñ€ÚøDxl ¹Û;4Ó¦ãd¸µ¬ÑewPtfº¬b<ä8þòVeM^6õx%ŒZ*Ùf¸°G/†tÃÿ¹ù!£ #N+öÀsˆ%~âŽ^‹­uÚ)\ä o.$Ó5‹ž—V‡Ì\Ìá»i[ã$–Ëa}@;k¾+‘²ù4I˜bÛÆlÄáÞ™(ë#³¾ž0MŠO*{qB*æ+džÆ#tîá>§|ÂÜ«m@)šaÇEï©ÉÁ }±m˜Þâv\¾qàF%ÂÇM4÷6Ç 1U¨K M‡©ÔÇ…o´Ú æ¶a®[И8|¹'ýì†cý±%g>ƒI K€!,™ÂA5’ç¾RcÕð2td•«soA.ætÖŒY¼—Æáú j^z†ŒàpþŒÃèq ÃûÃÁX‡€*¥žjO©qè¿Ï寉UÞ»q2¿Ç¢Y˜z—IFGŠY9옢ã!œnm{Ô4ôYtP¨Î¦½­ô( „Ý˵Åì d¥ƒg¯ãnDd‘ÇËþ*„Fñ¡é'ˆ°OG§tXjKè%¶M£ <Úa²†Bøbs¬ž¸-S ¡ƒe¿wÃp)âÈõÄQPëq)ȪY¶ì 5y•«-9U/¾´c W-â­-xšFŒÏzC QPÅ¥eÄÑî;jz`—²õHŒ£˜­Pµr5*Î퀪l.Xw Ÿ’(XÖy8—಄pBµÉiZmÛ²‘o¸ƒ½ô nÁzÛcY Æ ÞezD-’.;«ŸKqÒ0R°ÈãÓMŒ"e(±G’¾`,l¹ig*©XÅü²³öIÍÆÞçò4yšÙ…â Èq)‘Ú$/ß±¤ yOªpRIH2U—lµõ…±YÝ6q´þXמôiFm…¾Ó0B°  tÜÚÏš.ŠªMªV©››–UÅ’Æe hJÆ^çB E=ÖÑ"~‡#μFø˜‰PÅNöx4ÀQ7™fŒÓ[gÛ™®i"¼QŒö‡„wÜeŽAxb“Æ¡2ȤÚÁŽdáÓº¸fQ\2ï†g!—ˆ}`x¡I3ª\+ÚÂÔŠŸó¥‘Ož–t2ˆ4]‘t¤bZz“kCõ6á^kŽFÚxÌbg·²¥‰ÀAM¼Y‚»u G1³vV¹Cñá§F±ª`"Ç1eï[¾Ú/šÅL ~ið‹FEQ·F½V `î K=r ×ELl³§´¤×;0Wø,éyd 'ªƒ¡á‘A¯NÅøÒ;GûK½Œóý7½D\ ¸‹Ÿ§ï#|X¸Àå_ùˆðHƒ€¥Á‘YËïS Ý[ùy@´×Óý^‚ˆ#¸=º w Jßv°…ïoY•þpŸ‚–Áô_IÂ`˜Í7^ ƒkºyè©¢$¦›‡á@ ÉbeØà™Ã“E:Ÿ0’Åcñ”׿W8‰ëÑÐ3Å(‹Y8ª‰â@†ç÷ÅÅEgúk:Å­gúcäÈá1w¦ÄVþæà8År­±.î"݃Dñ S•’7'Ö‡½®\¶4P~Ö5‚’$G2]„¤1•1H!á–|ìÎߎáRér’¯—Æ¡sÓñ‰n2÷›€ ¥ @(ˆó¬CM2… Æ= Adºö4H…¨ƒ(ÊëÇWÖïÌQØÄ iú4×Iá– ½§9Y%i or§눳㕀á¦dZŽjMxc kD¡LŽªy %Þ5.Hñ‰ŽÁªŽcbäYö÷M^‡"EqÓ+"Nåi2€ ²)cRÌ«Q¤S•¥£ºÀ®´±óMg¸?®ÜS滓i îË{™TÃ"&Ò“)$ àÇìàíå5ÊŸÃÖ9‚;ñä(Þ~ ÂwçT1Ò³›xTT·Žr”¤×/ê³€ÀMœ•r{ÔHF׊[QtÒ(Q÷àðö ¬ÉM ä„ט¬M\œ0Êf%_§â!;غx1ŠÃ]L{Ån9à…L!Bjê° L‡ ­u6cÐçšÏ3ÁHò}*ÂL„Ÿ™/0–2ãÌn†äzg·&àPÆÓÜ; [åÕ£3:Âã  IÜÈžé~}£ÚÎe"ÝÀp»†—]ÈÓ£fL¶· 3$p2Óƒ¢„£×Fz—Æö¹X‹€ ÁˆþJ -†½îqJAÞ'b.h"œõµù°ÝõàvôïI%¸ 1â3ÛƒÚÂ">o/ܤŠ(a1ˆšü YðAñ·®cšh]G‘uPú”ƒçZú˜,øeiAâFC!=¤0)%3ðÃÑÀZI‹PaØéq^+u0æÐZ§;­•äÞYŒàEyÝâX ;Ó :“ÌWL–›œ2b"JåäÄð +Ð$·yÁùØF»[n€—óæ_#&ŽBòY˜hc5 ëè&hÆþ:EÒ§Ž\!ÀS… ¸ŒÉ‘1¬­Äª.Iz@™T#x‰5Ÿ'üÅ9MF#ïêjйÑ$TÓ®R5IU5n!ÉæPÊ`üÖ89ZY˜F„G˜‘¾Qæ [ª2S¡!¢.,iŠ4X †' ˜ªø³ÂšRRvtÊ}ÊÓçð,©zGƒÇWO,JÊèá]\1‘8æA¢ÚÌJ„Ÿ¡oFQ<  ®mY®ˆi äoÚâU{M9›ŒHéÌéñÁ¦Ù°Í [0-M(œU-¥ÉLeò˜),M&ELt§‚\d >ÔF,/‘)EW/Xn\n›'Rá^ži0ZÜ‘ IÞa®KG\G´Ü`0t‚#‘‰Îîéñ惵ÁõÐ! b'æ‚·twìUuÙB«ÒÑÄRá·W¶ÚÇst»oŠñ#@Ü>Êœ£·`±£Ê9~’qµ–@¸Ê ZÇDõŽíq˜O®ÝQâ%Áæ@C¬¹jÑÅ‹zY„_¨GÏ´ÒËÊß³`Õ𢠞y¨>f=@‹¦½lnc¢plqDq6c…/©knãA §bÛw‡‰ÉVT“c»ôئô¸Æ¹ƒ«mwôµU¢t¸VÓÁÖe)á ¥€@êÉ» í¤L!c5&ŠA-;¼™Û¾H˜>í=#t]¼Á0‹+.‡Þ‹{|Èá(¥RY´Çp sôÚ‘QÀíhEÎD.YÇrgBªhceÚÚåÜy€?™EÛ““¨œ(-M³.UíÐ2ŠqqÍ&%‰rG # h*ha¦Ÿ7’'7å”LTÑE½ã’5äe(òìD¤EäE9®ÒðÎ3+=ËbÍ^¥ sᘠeœaQc n—UE —sÃ-Ž¥gÉ'µÍ–o”µ"Œ‚#œÏ žÉ3@Ø3E¬Œ½%¬Ò^(lþJáE ×1CBŸyýš]ò é™<Ÿ„^„:ùǼF\äœ-ûä-¿žçôÁ¦Š>¬S¥ªù*¥Œ\ŠY|&â`HäüqlLÃÁ ¦áD3›ÌEq±ùʺ«ôg¥Ød#Î3pqUD»3ÙÊÍmó˜S³y3TšÇvbwîò%iu:kóå ;–ÐðqÓƒIïár&f¶¸ ½/=6wï8H©i(tÌAtÇ®‡cZrEžãysñíÁ¯imÀd¢wP#¾n%»×9H,ÛÆÍ*ÙMòh›`{Íú‰0äwWÄéÑÚC’«zˆC»9–™»?TZT^­©-à®UQe,­€БýÖ D ˆ ¼íÜŠvŽ% @"Ô8´Å3ÒlŠDP·V ¢E¨VÖð’„ÌRZÁþ.qi:Õ; "42ý;9¯: zOhDJ2)—Ö¡ò&ÚLa('ìð“9DxPr™ ZÐìÓ(+ð‘6ðzc<7‹•óÐ6H,tŒE¹ Í™[‚àâ•Çx·´ÞÒ2™¥M’–?¼Ím#-¦þ`À3a”ؼÃÛ*ò"tž\:ì°Üg¬ƒžŽ±a¶è„:á´ÕöH Mbä„’D妤ž óÍg2IªòØWâð£OÜJ•ä@"åTÊÝò${.±¼ÐPvt*%XôCïëÅýýVBš%ÈEˆˆMm”Kn˜f lEÑ a¿ YJX!›± d8Vaù¼C¶”°¦å—”•èR¯^´<\/]aRÆ™Ôq‚ÌÃ{/!œ Kí;žª=8Ò¸† ^¢"v{°ŽÉó¼ˆñ<ÖO3+ñ«ó‚s¡Ñ‡ÝĈ­ÄÿO=pÛF¬“Øm^h¹mÎ Œê1[P¸)ÆÞ^„þ"Bèd8Ø¥Œ÷Ð`*ÊYÑ¥ë,Ôçf”"CwÎ[‘h-^Ûý±‚·5LJÀšNXøvŠ p›«Œõ E'Mç¸R?¬©zq9õMвãvÁ,Vy[R=/4DvÊ5‚A‘X>£½ßÑA ‡Ìò©øoœ§ªÔ"ì¢#Ž &¡[F¼$áãFDô,a‘Á ŠPÏ‘(:xì¿.W6Ö…¤Aÿ&$Mn~22ÕfYnU†¥mÈ€!~gP¤óÓ@ ƒ6±Ã #‹ 6X· 0X;di–›’”Û]¸ØL»Æ"Âbu°b•;k4‚‰k¬26â#vá /H^¢€‹ÊiöîpM¬‡¥0õ5xb¬<ëÊO …—ÔqÖd––´uIæóxªçR{ñ°ògi.Ûó#ßR‚éyþd1ZñKÚ3dÒâÏCù¤QÐ\!ƒ,ÓTUc0xìO8¯q(¬ð˜•¬#â‹n€Úîš<µæùÆà]ËÕÀ¶r!zì±(š øµšå¡…áЊ4¹åvéù ¿£çµ•'ìTSO=oi÷ž×öœJ€0Ñ(ì®ø…"¿ñ¨krŠîzÊJÇp8[ŸNõ–ç{žï@ ù€„g/7»r$\hƒr¶ÆËéà)7\À${ÿŒ°@cq±çÁ´áÔ`7|’I½­…ØNÚN¬E |h!Øò&¬ôìyÕÏóx§b-aýŸhþ JàäRc33×x·\¨xäB3y½§KºurÏb)ÌÅ6µs.Lõ_˜8 Åá‰[ Œ8$Êwt’tUÆ£ÜÿZI:õÔ³HÆ{T½9 r´ñ¬\Í{¼ÒÒGŸ!JÉ“¬ 1õÓAíEÿÉוôØ2”÷•Ky}bUÙbí …b‰ê°~Kp;•Žp,%¤%í,!-åî%aƒ,–¢"·æàÖf@Ž"&ñ~ájëaojüµL‡]ý§žZR’”²µzÄ_ùÀ´¸¨:¢;ÇÕT®äõIÒjธ©H¼v¥ƒ£<òU»— FD6£˜T»Æƒ€N,åøÐôGÛÇõþÓÆrª {b÷c‘‡ ÁÈ%$xëB 5„² o/Ä`ìU:X‚ÇLÅiÄ œ¦FBÛRS#±,4>ñ3öc{ã‰(ªøíopD/ÂÈ.Áø$¢YqØØp¼Á ä)œrbRr/Q×Ve,'d!ÄpÞÛé`á4ߣ„–ª#8+³-9Kà±ji¡×gàÔ Óbð,Î /¾¯oåR*ÏzM¤K• åŠ&Z{-ƒk”PF ÙJHpfA`@üJ³0– j7)º®™k•ÆáI(u91מ±õ,U œ‡¥Cö4 =wЮŸJ8(Ð~¶„Š1@ç) >¾ÒQWÔàýLoÊ‚O–~§ž'4QÚÆÞªÀ§ðÑ,±„Q›>I `÷œèpàUo­HpR–à˜,Ü3²Šf÷“É!³•à­„gd[+dq%§€¯@‘ É\ We]Uød"~¢S²FBû‡tpœqˆAþ Á›ÈœÒýJ„AqØÈ؉2v€H<m¸Cö]9R!âø=ÇoØTi™…6ª¼•m£Ú‘`T;^žàñL sxÏ¢5+²YÒ¶µQ×9{ˆ0&GÝ·ÇÙsÏ5îUÁ{˜ôãÙôY2K £6UB°^¤u\öÔµç'd3m“´°üq'`¾f w\˜SW¹ö¼çV´ò€Ì“Ò:Þ>îpU¹wÖó Nç%Ç[Ìyæ`2bG×öU4«Kl&ï¯;{†Ë®¤sZ”Ðê)ë¾v¸s ÉŸYs ^Ø-ܘmLر[,p˜Ö/ŒugîK¹ZB<—ϱ,—AÞ6Î0%ø-I8O‘ÔŒºkul^M @mçÚ!¼8¢;¿V¼‰óÀf.ÌØzÀuÀrzòËš´ÉX«ãx½<82›ÔÄ×V“‡þHª"ïjýhv'?ò]¤55K0mL8š#(qI†$ÉÆÁÒiH¨iº-8Ù:< $8Ú³¥…¿´ë´p –œ– /´»d‚Ý}è6ÉöÛ=h&™À][0 ó!’ UP‚(ujÀö •¿S ¥“5ƒ+ÁµšÂ%3©Ñ“ÕêsÕÓ-Á$SW É“#*@h¯WüF[²0¥¯'g²¾ô;íw¥€$ û·ZvSÙ>’JóX¼ApX'}ªak¿?µ-¯Ú8ô¯%ÂHÿðR"X§•ˆ÷`ÎTÑXˆð@”àÊ-ÁæõA:ð.,:X¥z,“ýA>³q_vD-ß ÿÇc,k`^ Ï1àþ‰&«KÚh4ˆ˜%x:¡Îµ1©±"|wà DÚ–‰É0W I– õ§Íˆ™ó«",Öc'pø× †˜bƒ$H2Žè ã63 PèA ÞÁ J,žSg¤šå0ÓƒÛâþõˆi:ÑÅ.õ¬-ú¦Ä"È]7p^?[ ÆÈN=ê„ -=ÄÙ"æÁçQB­“ÖFûú­6´ Ë_©­’§À;ÁO+-ÞÛWƒŽæ•kÛ _xQq£¢µ¯së+_Omoóžs~i¯ñG¾5ú´m¬­^Õ†¶ýKmMÚ‰‡ÙgÛPÑ‘$Hðd׿û;ÒQÒ4b‡±“ºdÔÌCÎïJ9I{Ö›ob'—l:¹ £‡Ô" nhƒWîv­žlg$qFçàðëÐ=ä:ÜE»CþDŽI ó=F<Ñõ€'Â}2[0¹O7!²oÂÆÅÕô‚Ø4ªˆœ°ÐŸÕ‹Øbé…’Ó€N|è–’î;-cæ(…Êi”ÑŸs=˜—h ()¸:/U·3@í‹’Á¨ƒ77 €Îë¾ü|^íãè ç¤{ôZ&ç$ÔäY’mŽlÀSQð Š+;»8yô¼4ð ăJfÅ-³lhÞS1‚ŸLzâ#± Ã^ÕRCŸLGg]ï!û°½¹h^Q=.ÕN®Z¡Öãrɳ‡ºI®Û…¨ÃŸhKz,‹B##ÙSz;µ€‘@äÄW™].=/´¦Óêqƒô!WKÜÅQ,Æ:}ä$»~%á0B É®:ÅuNܤ.—_Üq¯ý¸åe½cw ÏG€;ÃÁ\ì O¹L=›ß-®Þýpk'¾Þ’\OD—ÞŸÍч;vJÞ*`iøUàIA}çw® àŒ+¥ÀÉ 8æÀ³Ñ'£ˆÙËi21v›Ý( l3ä!‚•'qx,#tŽcÎÆr¡„¨Dç¡Ô`V[p¬‡ô #ç .,rN p55ê!TƦ ŽÒdK ã*&›kZd½šmšd›“5߬˜¥—µàk<Õ›¤«Í™ ^š» 㪛Hç…ô÷vØLöPû¨3^,Ðø†fïóúL\X܆¦NÎuœ„6fdkCÄgÞ9¿ÀMâáÆÀÉ¢‰O¾{ê¯iÇrmlÄ^/ù;˜+!Èæ0\ˆ­—+æ(Hó;¬’ÄxfáÆEäz 7ØY•l âR¤Gpfw~Üš-ÜG掑!JæƒÂ&áÈCÂñÓë€ïoŠ 0çEJ²w~¯vN*ùèÚôŠ'×(%¸s 8¤iDt%›âÄds¤\È-<₲A`IQhFôÌÃ×$dWâBÕ»?+œ$zÄQZ5´<ÏìÚ%ç“V§Èeƒs– Ç;ÆÆ9xq‚¾(ÁKVd6(ݨ­øåvªÐW£¤ÐCLJ:=û^ÓÜ™2¹c•-£§O>Åã:-o&Ž3ÅxâÖÌ%±§`}zçBÌbgÿ!ˆi<åk68ú$Ö3O£ª’²Õµº? rò_$Àá8ju.€Ïá¸-ÙbîM‡Žœ:rg¥¸‡Jð\e:Ë×£þèƒd/r½ŸN४fs‹q —pÞ7áœLŠìŠlw8-Ÿs?¼ 'ŸõæH™ÒVë˜ß9 ŸîOÔïÒ÷g»¨—J§P™Ch ‹Døˆc›Â°äŒò(-ñF˜·0@Cxó7Å%h&¬5U‹rZ(álMÂQç„£J)–½÷efñf6&Ö”ˆ’:gå̼û/Z/o=ÑÌ7–´±j÷i?×°õ§Ü–HÐÁLq)áÔPÒâÐÁy»åÁH±`É™Hmh‚4ÁgÖ nô¤Œ #ä^T*ܼµ`m.GÝúbÜ€_gãØ$¬Úà•-áäœ@ÖfYÞøÖKY*Ê©¡¯M‘| ÜMNê$œˆJÐ'V¥$;ðõ˜pt<áäW’³IgAo%:ðí¶)˜®„uzPWOæC4eª$g•‚¥t Gøã:x»H¼,dÑÊšdNË’[xhKI'#pðd–è1.‰Þ<Žé'xªë±iW+x,qQ+ðV¹Âƒküë…~Âê þÜü¹%9¶ªvÜæa¾pår¢9ëAcäÙnM´ˆ¢ÒG­|•M—w29t>kfŽ1@±5wè‡ó¸ßo >áz@OR D@Câè‚ʦÄq5–¸¾°Š7Ýh’!ö+R—r°Á‰JQ/OÉð¦z&ö•W‰Eca¨ÕQ– ÕÙ!z³c¨ÇàêDÔcÆß±IèaQ’à)º1ÿÄ›Þ2ëéZW\À.'Á‰[díŠÛ¶©`oôK3ð\³ÎnR—i+óûã›Ê‡½@´;@T’Ž™]±š Çe‡8xA‡—à§Ð'¸zK8÷æõàKÄ…Uz÷L ÿv\<:Ú©àÛÒ€ã Ððè8AjEÖ¢*mê'¸ EÒ—š—®NÌ‹ÖíÁ_Ûà°6Œ‹^–›à”-á^éét, ðÄÕF™Å6óÎ?)í zÃ5s‚óµ”ʸ£×ë•oñâÍ÷Ì@YSa@ýG¢Ê>ÁKÂI½”8‚J1ßø°!à¯#PMü)Hí2„t§DÙnr†Kð!ºVƆAÂYkÝ`%•C¡äH2ŒxY^ͳ /CNߤ«ñR釥ÎÖ…½ˆ$.ÔRâ@'„c˜„#{s9a¥ø9ÀBà?M}{¯²ŒÒ»¦ž¿»•MwœúiLGé?r&ØçCÅi‚󚀮gÜu ìàˆp³–pR®61”ÖyÄ%Ž!UŽ §ìRÒœÎR¦§hÅ8Zk+H• ¹aU}AܲS§Ð ¯§8GÁOd ø+ã¢5Á÷Y‚£²„sPàÜ‘MŠˆe‘¼V$Ë]Òã’\½3ÁÄ\®C/»è\)žÎ ¸7J<2•UÜâõÒÚH/¢yJ\FýŠ@ ¶”IM²·IѬ+lþ%q[4Ц„"Îȼí¤,÷N‹a®qÛäh~®qáfÌé]Éýe¹„Š×g›ª”˜ä)Å)&rÏâÍl/‚Õ¢à9Ì‹–Çb_n¦”êyÉ‘\yÝ_ü&-·ƒÙl‡]#Zõf‹á_f‘©)'ÿçB‹=`€,n·W¶H /B%¿3yûÂDSúàõ+|ŠM"0ÅY_±ë|à½1„%1;°ÅLN³ðÃò6¦*<€%.­yI(B)Ý d§ŒšM"¾ŽšÌeD2ç¥õ@xNÎL ØÄ nÜçŽ3%¹Ü7Á5a/±Y§ô.·õ5ê!Ä(s˵?”…œ ¹>Š“øûâÜþ $E¡96—¼#U’@µz™S¤ Rå&ï@ë B,(¹Óí4$ƒþéeUe­”0àe,eÎpnwZƒ ±¨¢2÷yp-ÎßÀYŽ»JEº†º4øÞJY†Í-ƒ }¦òræ/ÅÚ¡Ã*&Ó9 G#לbÕì(Á!˜‰â’Ö/%,P߬­Ì\çr1v·hsa;WnB.wK/ì® ØÃ~Œ úƒê±9¨´·§;>'9 0žîä~cNŠC ïXt¹Î”àSŒ?p F¦OíCjÚÅXžŽØ¼éî“ñúcÐ= ¹bÓu¢Õ/ó7i;ä¸ù.6¼Ö´8áåÄ pâÒg'œ‰¥¢÷7iWîÆèHÚ"µe=ª1Ê]žtÀÛ(_ZÌH¢{ÍíYq’ú¦glf°Äú%–-G߀ÂUX¸Ã·… ®é´%=®pSä† ìDà†—ðQ(Ê]{ ÞÆxȇ~’ÜÙà'óRÚ% â©€ŒÌ'¹€R°À;âT—΃ab_ºÖ‹ïµ¹ º©î„ç0Kx08e‡¯:qIÛ !TbÕƒ³¥©â»}Þ_UÒByiccê´WEÃIq…¬0±¨ <çOÜH…"{ 2¼“%hSgc¶5A”àIn”â¢&Tµ«UÄ%?Ÿn6TjOQ*žÛÞî_5Ÿò¬W⢆Th@8÷JhÆ—g ‡ÖÓô Ú. »WvaÎÈb—^ssÀÀZ­M<P²û¢¦¶^uÞ¦3°A¡©PÓB #þTh\´v¡ky@;;XFæ%mkƒ^Ê–ÓÖ^Q¥×Z&xnI¥ þ8êeª(û‹¨×n¯’I^$Ó0R,qOLòÀ„]Ç Ö¡Ýbs AF¿Û²šªnT†ŒSsh*xà>™ŽŽNú‘|€¡ŽáV£åº4¦Ê(wwãbB»sÀ´”³’THŸéöE ˜~p– 'õè_xà‡¶L¤ÂF75HX®§ûøI¯ÙÎzgg¾èE¯ýÝŠ-oKòSÆ®?tȶÄjvÅY¹XRk!ÓiŒ].†—;Š«lïŠ(.W˜ªHìü¸R§ŸŽ–J> ޶z7Ý¥ÅrÌà´GÂS‚ó«TºÀ+¤«Þ3Ï»ÏãxÀ9â¸/"›åM¸tÕÆï¼5ZÉ–\}%x Iðx•àKQ‡ ž ÁVg—VŽ«šÇ»A5ksã*ÝÇ[l¥îç(U°…G¯D½@ëªÞmåJÛø³j½.p6ÃJÅ^Óg©à¬ðÓ•àœ+Õ!sÊ ÖNèÄÈ5‘ô*ÇS§HIȶ-—ÍÊ]¨ã]¯E?®JÁ4«`š$½Ê'¨¯`ìð×Õƒy)±›‹í(¥ñÂ(ûxœ¾ÉQ×TI4Ss;XŽ0éǨL±Šq‹ÍgµQIÕ.¼ Ùï×÷꥿²&¥=ö9f¾²äSZ^+<¯öR€è/á†+Á§VªéØjôð¡²\_,+™íüšà _y+0äd^?jäµ­Î’H)vù¢ÃÏ .—f1,èI|h©®-j Þ9‚É(óY®¶Õä¿«Ùôà œ…¬[–V_8ú–€œl‡ûÎu'pÍ„S==àa>Ú³Ã)[‚K°Ty–ž+²eY&ëA]@Ì݃(ª3.5jQÕýVq°»DÑóÏfïf+vþà$ÿ¯«‚m=vZy‘»U^uZM]¯Ò(Ú×*H(„ÍÅ*UÏhœÏIJÏ%¢}5^×δ·VƒgøÁغ˜B˜ÀK5àkÝ`ØJšw.cÆ2å´†B«š×`¤cݰ.P)ÄW8¬J<;\OkÚ ³¬®n¬Ü²-•Ö~œ‹­¹üa ˆ ¨ÚÚ™?CÖS@@KkIYÀÀ›XªÄ$VÅí0¹p¬þ„Ùƒö¶c4FSjËpM•áwÉîÁGG “á9Ô6Ú·ù‹¼GÛŽ"çƒ0«ßˆ™ÚüÎ%@þá\B$z ÷½-‡•«Îð<Å`=.œ±wÆ`>8^K¨œJh¬ŽóÁ›+s•Ѓ.‡“²ƒk!è¡â¼†R­4hKëŒ#³îÐ žABžt‘õýù '£|è ã(˜65ªTkÛÊ~ÜŠCƒ:åìƒS¶×÷jƒ#Ob’Œã¹’.J}Ô+4×Ëùå|KÆ Ýþ…Ы@I@? ydT9bNU²ÌzŽ­‹ZrÃÇpí`@õŸ$.0å4À)¬QˆóÿìÃÀHtdÔ«•&Ù¸Ü8$žÅ³ÔŒE„Ä®çÄ3Î ÷ žc«Ä¢ lú-_N€gqèÐÌ­BOŒfò,ì<‚äÕfµ ã! H3ém*ãXñau犊œU·Š¸×•qæX(dœÞÎ…§òAþJœŸ/Þø¸«*ÞødWi¨úçËp•á2JVÇÚ¥9.ýjþ’Ú:?kÌRžÄìÞ'ú?í?ê“@|{y\›Øò¿þÓØ@\{ðHCQFŒ &ôR7·'º•–Ÿl&hyØFzø"ÍÇ‚ø‹r«/¸»³8)÷Tá-‘~|,àkÝÒúD—¾q/ÁÃ>Âgŵ„ŠW½²k´¢0Hì‰$ð‰Æ®´ÒŠë´iI‹Ú*?AÉLsŽªiÓ9í ¸#liÛ¹\ô ¶¶F¹D&EeÛ0NåŽJ;'âç‡ü;É 2#¸™ÖßL+ž«Dßc?'À¨°§¼ÏªFxìRzg{©Nyy¥çiFÂC–s†2#ÐÒøÔðE&%é6È¿q¨ž(™4•YŠˆ¬âðç&[´²b=LTÎ0Æ¥¨œõÐzKQs^ãåÈ—d6‘7ÓýDÞŒCí*×fzF‚pÛcݾ¥®^%+me=ÇŽtÌryÊbá"ü‡mðg'Ó\63tƒß¶»Ÿa›UDýa­d¥JuœŒ.€èQ8}Frï>;7žü0aÇ »fçU2Ä“=œb~Ôƒd†›#<íi³“ýÆÌÓ”t|1_Ñ’a¤kAc`†¦‡þܩ݈a";¹)‚O^j\ž){);0×I^ê¼'霕¾N±Ì^îÌYr£=ðµJ v·Í,b•[†ú„î¤x4Ñ륿 @3Ö´ŠD¤õ$`[Ú†¡ðÚ”áÏ Õã)œÆ„v¤t‰Á`5ŒVxc“Y§LݧŒ–P&@ÕY XÕxžžÌ^Ø]9ÝEÞã„ñ4ˆ ž½÷:\½÷§áŠNØ@Q& ÿMÙ›÷ŸC ƒ$QÏ‚¤ºò=˜€G³Ôþ£«W/½LBðuöÌáx,F‚ÆÀ‚7}*ûÐ$¢.äcOÛv*d£ìÄ9”ýÌÚ ‘×'/íAf¬îà§ Z´£Þö·˜( Ós;°7µœš%ÃST"!{ËpßÔƒ¶ç´`äLŽÁÊIxñ T·X¢þ°“Ò9  Yð‘DxĆíÔÇ•g†K%V­‰‹·#êx€È¯KÙ³S² ŒD˜Y^³L]NX 6|¢AYЉÁ [TžïÂÔå°XÿI6Œ÷€À‚0lž÷.qLI²xáÏÒ—(Ö0\¤QÈì k_¹¿žåoÔ*ËRà/ îiµ/³L~]öÒª/jÛ‡76i%®ß$ Ïñ\ÚÒE)½¹rTÍ›1LÿB2mOR]E8tÑ–á£$c38Ã/S^”´µ57”E¦ÔayqWêÀ¿R–ƒ;‹²ÉNiw`KF¼ÂMcËl‚âe (¢@êaZ#íøG¬7ÃlƒÝ‡XpsòxÙiŽG3O•(8Ø©³u)›¼ñPñ7úÃRIg2]-Nþ†Â n{²\Qì“—#R¾Î¼‡d<îF(­%¯{¤Ré–F)¨µ€"Ô”{3êôõuœÏA\ã‚e1¸F#½¡â8‡8ÔÔâR*cçÚáˆÒÀá±{žáziHIcIÆ–áFIL¯M@UÞ¦Aà¢e¤¸‘6y–'áˆÀQšOÅ40[ãeaä‘£;5dEŽ›Ÿs€æX¾Û|™ÁEÜ-Nl±©àdr%¨<ÕE´{a î25Hµ'Ú&Örª*c"dØSglO÷€”5Xqcƒ1‡b^=Œ?óˆb†ƒ&ºèP›¢CDMÙ#C¡Òƒ¸Ð.®hüÞ)–.ËKìÂÄJNzÓ§Ù÷ µÊxâÖT‹KFÜ)%«ACÁþmIë÷jå³,Ýi2 ?zdÏìË *#ò¨ §…˜¦+Õë^cb1ÐÒ1@c1yr§ŒÅ…•ãÖh(¢u)6I@DZÛšJ8FÌ„h }ƒM;Æ}Ú£Mµ‚32Ž/{µ9r :ÃU†ÿ¨q [‡Šé¾õü©-MP”à T†¨”Sa{6¾iï•cïGxkBïõ'p³8‡ß-cøŸ¢&$ÌŽÒDAí·Y”…~Ì‚æZ&ʨËã²n¬ú³G€ö*‡dçTâ‰ü1äù@Ež¢ß¥l—EÂ…—>Ñ›Ø)òfRyn…(oš0ëKXdg¸`¢k’1Ü1U<‡g­U'8mP¤ÓÚ@.õ^àS nJî*Ô³ú RÓÜËâ4~Ö.jyͧ$:èuàßy´J´mi©ÎÈ/+$Œ@ ("ܯXÚk¢Ììƒæ3V‹:ʢб`¸‘ÊéË­ÿŽÂ§£g@˜AïØÌF^áy°²ŠX–„ÑõÛ’ U`£Þg2Ü ái¢c°“1f½Þ9&ÿÝ ¨sæ°‰Xã`q†Š¤æŸô Ü[McŠ Ô>´9×¥t†=\0e¹Ì}´ O ™Uç›z2ì½Óïê?iÆÝ™¯KZTž B̳H©{0ì"ÄÕ̓nÇâ‰²ÊøàD$š£(¯çJ(râêI"ezR[ðóX‚rki-–ç–n†wFylÅ tò˜¬Ë´]úrþ|¦:ö™ gG. ²¸l¸ÂÝ<Œ¿È67+#.*p¢Ú:Ò®L>ôIí‰ã’üVe,æ¨,yÄ7fê­Y½ Uðõ”#é¬<3ÎLòpã™JXîðíÑÄÔ-óûkÐ6Q`&?ëS±dÃöDD4~ê±ðW•áœj-÷FU£§ö÷€Ì ¢â;i!­* µ4„ÖYfAƒéìƒÙ³ÞdÛ+MÎ ©ž+ëæ[œÜt~µ 2¥iûûè&^ÀR‚¡VMôûjÏh×®I/·O¦0OÒ@ñìv؉s­4=©ýû(Qîe ÇUŽ«2Ö³Y¬R2žõvyIJˆp·ÐO{ÊÇ™BÈ0™]D!"ÀÏ*£$ÞBxUZRIHR,i%È Vš^ésâ9è…Ä@¾5ËeŒÂUÆÊŸ’ …5•‰Ž‰Ü7«0¯Ž}’XI±¤¤ ~BÝY˜¨ìl1ͧ;zv AÂÙõX 'páÄã]æ¶…?xÇF0²È/óI&&Jzé Oè[â6²cþ›#]‚Îðd%‹›”W tLrK>Ê\ØWQá7§$mRˆ.Ž£ß9q˜Fâ”Cë4‰^lÓ†j,§Tl<± 0bxºêô¹ÁxßXçè×ìÄWÏ‹œDsÌI+… ƒl4«XÞ…YÒ-ÃCì&=à²?±¸@  Õ<ø•#…a–à™¶®z8 ÆõŸvƒ Ç_þ2œËÌ€à9‡ãx*yS¤2Ÿ†@÷ˆ”Ž,„‚%Q·ÀBAWâ2`Ãà਩?qìÛ[Ò.ëlõýs w–Þü²0/|œgËpâ£šÛ wZü‘Ñ#p³j`´&ÕðÂÊBáŠè®c¶Óžˆw’ÔpÃUN¤ƒ•µuMå× #3ñ b†×¬c]Ò/.‚è]ˆI“$5qVƸAÖŽ{±Ý–•­}DJªüA᧪,¤Óó¡ìî»P\¦eoZ^çãRŠŸc~áH8WáU‹σ´cùËDyt܉Žþ´’É Ÿšìt:q›µ;w+ç0„z{u±¸ Hfv\T6žˆpfx#êK*I~¥2|õز:Æs¶zíšh‚õ|ÜU»jÅ­.>ò^[hÍsŽ‹@uH5œÔù‹vkÔÁ’a’¡Ë5f¦wc½#‡#ÍÖCµäM’o®fi5<}Šª!'¿~±4‚+®McŸ G^{%NÝSäø¢ ØB,=-¦Ðpz%`ƒÐjmRõ¬UcâSºìNÐ%ö ƒ‰õND§Â!XÎÙnÁܨe80ë_ÈJÅnÃz@HÓØ ÅgÚœž¬¤jã2ë~ Dȱs&Eò†0ŠQÆ••ÂÉÙtæ,*˜\ÂîÇúÈ´ÃðÑ5Fuar´¯ð5ÏŒs…œè›?Ãg×aM—ƒ ƒÜiûN±¨MY®n®e•}Ù†¥Q=%“X‚b\.)‹U¨üZI¢d‡'ÃX†k° §_9×af±Ü]ºˆ7‚;)µ9ýá8€z§³ÌÄæÇ|NmÅ[ãéü|ÈéSöb¡”äÌÙ 1¼“+—sØÈŸQŠV•¯]“0\-ÇFdXEÇÃä¼QĤRz¶³ˆªÈ{Ðá «“â;àãfgtJ¥IÊÔ^-çMûZ¸Ã%?»2¶Ì²Øa7ñ• BÚ¤i£¸È\ HÙÅÃ)Fá‰áŒƒëÁåÉëEœ¼r ÐÛ4^Æ©ýŒãÑY˜+UË;}áκ˜ˆÖèÇ9#l8f8¿ ëF GtÆ☋'+¦\´wB=ßø…¯yÈn¶z¬Þ©£7eÜgÍ@½»¨ÃŒùŒÌ¾¡ß£Q!wD3nÎÎe\X"Ž3®Š¶™­UŽ oÆ „ˆY,€9±ã5³©‹íõÎÊðŒÕ¿I7—h3fxÃËp áa%Ãkõí\Žæ#SÄÅŒÙqRö9¾ˆ‹“ç¹@š´LÛ…=úÝ)——v‰Fx%–é4Ó‰×}Ù?­ÃùªxJfÉ`÷ìá%¨²‰™¡TSM… §ÑüŒ¶pê{”w€•˜c >Ž÷lé(o¢ç[Û?Vû˜áÖŠ¾#ܯ¨Û*ã¸Ç²°¨Kœ&ã]/¨Ê…˜Î6A½Ö Ò— Qï2Ò+©:gt“q‚¼rŒ ÃJ1| LÓazÙÓÝzéÓah-úלr*Ë­QóĬøPqÑëvr)Õ&B)cpºî¡eͬ·¹T[mLJµ ÙTQO[8‹åÔ¨,!IIxêêP«nb\æh©vå^šã—*qî® ˆ¢ô€Ù'.]b‘¼ˆ"n¨z l¢ØÒȽgwôÔ®uá¾RuáÃw ,Ù¼ÔKÒœŠ›¼ŒIð·ø$%ÞèÊKg‹a Y|¨Dò‹G¤¥¬@¸XÅÂUªt„â`â&ú´»Q¯»Èõaøè¬WïX!}±õô¯Â¡R]°žõ6¶…bA€¨¨\RÚ͸‚U¢é?ÅòÀ 7¶IeíVýãÏ“Of8«ê œ6´Š5-|bexgÈp¢Ñcƒf—»Õf¯Œá¢ÀH¹üÆl ÂÄ[lÍF‹œ^Ö–ïìÚ¶<ÚMS3¹7OJn†<0˜œV?ïÕ#²'ꘔ¶n« ‹íC¿‚3Á'Ãõ€>ˆP¢ ‰ÂèËд‡ºÐ[¾•û]vùѱ7Jg|•S#tC%·NÙDZ{£ÒÞe DE8‹ˆÖc°œ¯1/3ÀŸFÌ5fµ%°&ËpM¥OIØma¿GÉ.–Èè‡óá;/ôp½Õ°IPHÁmjšQF.:bö†n…/ª\é…¡W®õ wh¨3ÊÕ‘aµ*á×Áª^Ö¨˜4¬ÉÀÎ0þžhRƒC‹¹f;Ý-XãDqªº”ºŠ aåibö/xs/}ÅlË2\XåZÜVÁ$/„¹)Ö¹tÕSfƒ¸´Vj…® ¬!…Aè9FÃeܳ[Ë e ¬ £V7`Çô­uˆH50ËT9SÒ'}£#7 üO⥙ô…ßAî &²‡ Ž1±à ³M/áÊpÞ´ôeG„õ¥ÿY\ Ö]×p%•E™)óIm™¬×àêPÆ—+«X<(bXÜ ÓõÚtíLªªª¿6=îååsðÄÔKAýSd@Ò¥ßV’×NY׳ðødAa`¸¤Èe¹“ÅóµÚÇ ·N 66ëSn"ÏÈ»Ÿï àèDÐè5uLjÓ£¶&Ó—Óe‘ºš^Ÿ–Û¸¤e6rEE¦Ø,ˆC»ŠÕÀÜ2õÀïÌ-ò´¨%Ž·²¡it¿à¤4ŽÏ~)ˆö,“`1‹Ý׳5¼·Ñ™~»-8í2ðC¼Íêá%Uàó(’K˜b/ ’"‘µ[G¿žaødb*¿áÔé’±ä ¼R,‹$ˆÜ‰£¥ z n—,s(‰¥h‹qƒu\Ç¿Öã±ÌŸÃ]۲ϊ‘;ÍÜ£)Žš2¼eøeé‰Ü¹WGk2Ï< öÁcõcËX2 ¥§tk슴w5Hi—jEì)“ÜEÖÖqå0eq­4ÆEVi ®”eÉæ-‡d£®e;:œØ;ˆ‰#—Š×? (p¨–u_ –9‡9&KÓþ/Æ íbËáúa2EKEÀ¯@—D\‘Â'Mnê¿°@šj%÷qµ.ÆIdKX^ |Âå&¶ÙÖlÍ&'RÖÁ / ñnÕr~³|~ÃêªÕ¤4”1y~LëÇ 'GÆ<ç‚{£±Œjí˜Ûú1»jïÀ€ì[ˆ²_o3£Y_xŒèŽä#5ºH “K/¸6Êþ¤p#ì9)”uIJÄÁ¸¯Å ,à œ!¸GCNyíÕòZ6>E Fô&îZÃ{¶½ u§SŽC‹”1Wàp(€•44Wnܯ\bݨÇ1p†¦Ãî„™Dš·bzâ`Åè¢öPkqªSàtˆÁz|G+KŒø6ê ˆ^*P)’ŠÜž…>½ óý;ÙŽõãnôdÇAý'œ;) ›÷®ú ÜõxÊÒ ZbЂѳXg%nºÆÎ´ÑÐ_¶& Cp|ºcü„´ئ¢ÑMK‡Å‰Ï³§!0U'"-AŸX[à'>>Ú:°÷—Û·Ø-­Ô‘6""zi«§¯$sv¿ª|r¢jÖÛ3Ee[8Ò;㊶a™¹96÷ÝvYT“ä•>ÀYy#d‘ÏhkxI=–ëu·c'N½wg¹2g\:ÕÖ _ŒbøêA\A x?_O"}“øÌ'ôBªs´xA*ð7tB£v"5¸¸)/K™XO¿!N[Ñräy»Jýs’+äàJDtá^.d2‚SE´UÁ¦9 2?¡þ ´eú—†þ‹Ô‡©˜ìæÅu*åû:Á€ª±K¯Ü Ái–1 ÓŽ–ìlfd@CXàûªÀ‡U·—;.’í­6m4úG ¡è]›ØºY¥œ‚¤¬ÒŒqY§B^yL&pû™ª‹¤ËmiÞðW¥kR2\kE3*^É×9Xa[¾Íaó-2f"R¡õŽœ \8l*ð˜TŽ&p9ÊËÑ ÁœAtfoL«ÿÉyÆ}Kz < ©0×(ðÿƒªNèqts$·ÁI ™¤5?{lÐéÑpkƒ`D»Ã¦¯y7,‰Ç=Ý·I·Á+°„.ðð“í=]âd@Ë9ÌBMÌ,¥Ž%^qܳæ-u~ÞŠ%£D §N¡ ­sÜù"j Ô,+j˜ŒÑÁ´+Ë_QSàÜÇ‚B,YG0íUG,µ‰.£ÀkOP‘g[¤¯³«Æå$?K4D¯eûõÅ «„_šbG®¬Ÿ-‘`¬g¶¾ùV³¬ ít£‘Wƒ¢OÇÓ. <”ø-)ŽN¥üèªÛ@ÖWØá>à"h6NŒc:z#VÜafÁOÊÖ“³×Mˆ¼n2ˆ’”‹V»xlÎn•7m“‹~C¤¹›õLØg„gz^9õ£€áÙ<¤+l#¸.\8ú)ŽÞù ø[(`*=vΞpXïôÉÊù ¾ä’ÛSp[{¤àTÝñL¨ÜºjÁ¸p™½‘ð ¾èÊ諽 1è/:1=¿µäʹ¶¶ƒ6ä×óNæØ ¼ôèxÈaÃïçú›,q-—<œc›†7|ÏÌP¶ÿ £8Ÿ¡•1K&‚“ =˜n‹6ì&>A¼äƧ'»Áé÷">‚zŒMóBîMB8‰Ë\îÃJ¨q¡}”q#{sU=&I‰KËP˜&¼ÂÌ[3pNÁànœ£„š„i¸ï)ðûÑÆèa9ÚV­³å`ÍpüSàà´d´plUàû£À-HÇ>´@7&£g‘Šk⮤8êQåçŽ2iàÕ1ѦŒÇnbÿžÆ×+‡saEÜõ˜¹íÚÝ<¬ h‰ñYÛ7+nß \óxßé3À üó¸¹é±~®M1V$3Ñ<Í ¤7'ïRå°EöéÌ„jˆ(ò·æ)p’BÝu¨‰ÃÑÖ&Œ§¥Q~zzà ,º+0[+¸X»À£OñN:“jëÅ|Æk°z]רkƒ3Wª´Nôªši½dñ :øcØðŠs”PàS§ÀóNËœ Ià §Í Jt%¿4>eûl´ºe‚EƒÅ6|‚%Çý)äFž>Öƒç³T€L8AÃùÚX@\Š^ð6ËG_àI«ãP×€Š6„Ä,ˆ 0Sœbs‰\‘0²@C½pI¸*pxž';d¶Ó!~yÒs÷ú¼¸èåâਫ਼Á­v¼Ÿr1C´£Xùy®ß‹ï–">wöÇt4À„ŽwfÂ8`àce·¡ÈîB ŽºC¼ià4–h`,#б▲ãôÖ]°ã|‘w’¢]`›±h‡»¨™3kë\Ǭ;Psl=ƒãÅÓ–³e©¦K“ã/wã°d?^¶"ç <ðÔ]àž§¤RpΣøn ÅÍ<½§%(Þ%_ZJ0€ÔOÁç 3; ÷õ*¡BzJ(«[Èú4Äê„ 4>-ÖŸ|Ó"“øâ¹†|È/±7°·¦ å„=¬ta7kOuÃÞÚ$äŒÇ’}ĆãT(xtˆ~6YJþSpà+É›`·¤.s œ ®¶àŸ§È –±M¿ MP:Pvú·ÒJøì±€•µ™öš®Z°\ Éíi]eŠ ÁBÿ Üÿ¹ö€‰â-ÈÎô¾{Š\ÁtÙ™²ÁûE‘«W ¼W÷ -µ± |ÊÄš—9&ìŸÅÖ¼!ïÜásØÉÜâ:J1ÁÐlØ _<%¢-?Cv…°ž@¹à ²+ìÇ€µáãtì¬@¡±%,عA0Ö‰\nN»rsz—1½éÅþj:ÓÑéÕÄ-7ÉS(sŠÖc<¹[s¬º9§ Èœª:§¡pð³„8ce¦%›i…âJÀúéA>¥ÅX(K Ä#Mšà'™N ¡AÐJªÐµYÙK|M­êëÚNØâ ir­GJ“N Àáfa²ÚÕ‚ˆËAŽ|·"ïSDf–Í&A1ÖZ8öw·æBaë;gl¥àî˜ĵn« ;hÒLü´¬\xb:¼±0 nm”“RIêìr÷æoŠ-ÑÙ±7# æP£ˆVý[qap ¦À P‘sù¾|Jtf_§[EV—fcpÊÌŠ!ñ)% `_”iF?•E½·° ½L–e”èãÒ³îe‘4tœÕbÐnÕ 0Â"ÏF[™·RFÙ´…Ëþl—¸ *v%f‘‘ÂAy#§Éçh®ËðæŒŸÓHfL$Ç´‰v5± úœ×!ƹ ±ÿw_W–%É ÿû}„d÷¿˜‰ Ȫö¼g3Ùû" $B굺UZµøg/W¥ZÔ&Éè^ˆ Dµ–w^¯Ñ[5Þea j¿s½S´UÂ7~×Èß§–>ÇCq¡=à‹¼ŠVre{þ»CrjS¯%Ù•öŠãüK'!‡»QÉŸÿ¬ à+°?Ü›!zæûA{1ùó–×¾dUPÇÚË›:Egõ3¶*6$rm™Pˆî DÎZý¥?¾Ð Pã¼É'­}¦µÏ´˜IpúÊdàãz™¹¿¯X4,\ËìªVÅjÝ\·dg€Û®tžàŠUÀíÚ8{lÚ ¤…ýüÚÔXG՞ߣ0NN¯#-§îþZz;°ðGµú¦Éþ®í¢ÉûµÒúdã"95"^±Û@KYõÚסmÝxÏ9Štyñ³£n€¢Q¹;Ài*÷Ü|ã¡lX£¿b;ƒ)ì1·±nå4€Ù×uëK[<_²lóÊH6€¸QlÀ{šU„'… T•ósG™Šƒÿ©8šÈŸðƨ’ür£‚×·Ç¡_å² WiïŽÝåÚê·Ÿ”8iü|µ—±ÿl/Ö—|xSMEÊ«Ü="?z¾lãwÓCÐ>D©‘3?Î#ðeðF£©iD4F(¶œ|W _7!Þ†{]í¼Ch&8µ,÷g±¸¾˜Œ¥Ð…ˆºb™ >P ØkØÏ ¡l,Ñ~”²  ›J@ñ`q@[@Z¿ vÂl7lÍsÁmÑØì(Úº¬¦ž+·ÿ?¬Áëzîk­0ƒýu”Õñ x> îÃ0†€dî€üÕ²ÏÃðvüÕ²Ïðz°¶ÊÌýªß˜ÑuXêh¾¡aÕFðjB"Éîº]p+zJd‘éÁÐÎ-,Mp8¨„¶#BYZÒÜo¡ÌdBø•qKɺÚjê;®ÎV \vX¶Ó$Ó<øÌ0ïÕQ‚ùp„áÍ5Õ€ ZAÖÔ¡Å'îö„Æ—`”^ؘ·GJÅ£$y†P‚Ñò {î'X`ò0UN¨C·;Ñ¡Ø"P°\1¡fääÔ—ÂFž#ìh¼xhXÙ³!1zößg;M%ºô'fÙ€@3„œÊÎ0‚…%³‰Ú&—ÿÓ3–5¯vŠß者~x&Dù¼½I:I†32RõMÚ!k1x>8’(@0ôGÌ^;@þÐÐZ†‘“ z‚wvüßDUÜùPÑÜ»ùzO'ñƒ‚\$ñìÛü&~ZAÿ“|¦¿Èçw 7ú'_íÄÈ56=íÂ-®G—p„ ¬¡?Z~“íÅy×ÛYTûN‹²¾Ë‚Yz•À6òšu0­ô¡;²M¥HžOZ8?hág{ò3€Vä$.iDbÆEgõ¹cñ˜õ,‹j²Hå~Pÿ{$çg,KÀö·'úö´«eŸìvpÌpa  #P„äA±.ÿ>GŠ´ßí` aýÏ•¥÷ŸPçñzD÷'¨Yµ°"óÙ³:ŒÍ@[u“tÍ*­¤ï¨o½ºS"1ÅaKqR ÔÔ ˆ™tÑx©ø¢NÙ¸©¯æpônÓÙ­6ÈF&'ò‚冀1ZŽÝ!+°«³þõZžg`|} _hزÄ|Z¯×Àœ¹}•_g…²È­“²pj3Vhe£)ú°.W˜{2^ÓrVÖ׊ý£v0uÜLùÚÔõÕµ¸®q9%ÈŸ³JK}žæ‰¥³Kü1)zDŸ³FÑ à´¡9&l*Võw“( ̤E09 ñ_¶PÒ±ŸØËRŒÌ€PÃhyõeFpÒÞf'Vf@—F‹®?ÍA5ÌM5Æ60ýª-”[Tî_†$^.ºm´/2Ž¢Cù¡@]pwõ®t˜¡u|+}wìK‡ ©aŽÖ6Tpo­íŽý(­£ÓÔK 4«èI ´Ë¿n$Å;Й²8÷_ t»õþº[&ØäB¬r>ÌRvQÙM0µUyøë˜O½8=ëšh?`¨Vð¡_¾ÆðÒ/ÿ=†¶qÄÚ÷Ë„­"ŸÊ‰ñÔë£r¾[ß´œ‹¯] ‹P®V@Þ©^u±õ[åÓˆ#·öˆR ¶öôKÿzJ˜\úãÓ^¥•øF½ôåiÅ{¡¤òEËi¼S\i·^šÎÜÇÖ"³JZdS©ÒŠ÷bfš‘®:ƒè“ïjÚP¦¸•WÆÀ;gä1yίnë6ˆ^gfÂdá?0›–;‹BE2* Þ¨ë'»m›O¦å"r粌³ÔO©Óöj†®@R40Y6 bª»ò¯º¡…h×TÂFeý”¯û‰øšnU]PS kˆæ°D^¢ï¯8” *›u…+=Іʻq8ʼn?gy2kÛ9ú‰ ÷Ù_Y®ÇW,ÂÜàbÈX]5i¦œû±¨×Ø3+>¥Rd¡ì6ô»Ô–P+°õ<½H–žC4ªKÄ< 9Ì*G V ëþŽÉƾõ²ÇðY>žDÙ'!ëfÆëûŠÅ¡{0ÄvàSÊ3ô¶T`ôp°¸RÂã‡Ë‰í^euwnx2Íâ(>``ü@À€ÈÓ´>›t9…  Æä{ª18—— 6¨Xì¥ú `ÚP¼9“±~EKÀ'˜ë´|Üç‡e oò‰Î¤z^Iܯ3hWG­s ”W=Œ/£‰ùä"€à€Ücš^Yã ÛžÉ-8·ùïÆ¯)¦qYëi»:,rŸ7ÛËe_>ñÓ,n¨Ž6 U̯úYh+~{NÏ~ëW GçØ]+`},ˆB¸ ß€¿÷”ïLßrŸ›o E>_?[d Ü hiÎÝŽ(Dà3'{è>R_Ð{ôFËJõ]}&ÁŠ>Ã&Æ€À•ýjTâ]0­~ü=üö¨Uîþë©ô«Çž h1ö°9©¼†Ä€ódÂົ¹!Q÷ýM g+ìkêûkDlÂ]Ÿ|1v@²ý5¯±°S Ú¹øk.SÉc(¢?|Aü×@(.<éï]Í,ƒKQ{ì_Uþ§¼¼x}eoLÙY cÑgøt}2®L hcø†Ž“ 4ܾ©[œÎ>i’+xŽ/îr(ëÙò{£#5ƒvQ"òH–c@ûq¢¾éÛ@s‹]ô0ú]Eî¯C+˜Ὀ§t+ñ_G¢&-çf]„ïˆJ¼R×ðU“Á¶ÇW—<š×4õ±Oºª‡A·)hŸ ˆèaåïÿöpB f¸®€ [±ôN=õåê5ãÓ¤qQ¨Ìt‹*/¢þÅ)Ó9þå(ãn6ÚÐhÄ<~„–ÖÝdÒ-Žƒ!Vm¬»È¹ˆýì"´ÚC׬]@+û—iîµ[>cXß]~/*߀µ‚öÂ+º›®ß{µå­ºÍäâ·_\Ìl-ö–Á¤(W3ïQ4¸ØÃwUdÃÒ2`‚­Ø|„½ˆ6ã³GžQ69Œ¾])§Y'öêˆff° #6ö²ÖßÅSwŒò"´§p÷`­Å®YùPî@Oå¹5Vþµ^òޝŽòJ[êk·½ìá§Ârwóé™öGáãcæ–èÕ Æg±—^ä›Î©»»ýZ’&´š××c»püv&"ÿö]õÊ+ËCk‹/²ÒÝW0ý¸¬$z–ã5¢ceE`*ºÄ{uKÜ(œà‚?y¯n€»\k…{Ûx}1ÉG°CŸ‚bŸ‡žŽWõ<*AdZ{ú‡È®04©G¹tûzœ£‡«å8JÕš€àÀó‡%á«$_®­í +Ö½•GBHTCFìñçO¥1õ ­ {,Kg1z\j¼`÷ÅfÅ–SçUíÿø`ñ¸³rWF–ú ¶DW@àω´ï®\‡¿]Ôq2uo‰a<ô D¶4Ô 4¤É=;ï«Á‹¬uJük µÔ¸ö8¦wíÒ‡K+Þ™=ávÉ’]n—P‚å»Ío€Si,«~Lš5NšÚ vŽ9y·Ù®C›íSm>£ÿìÉÅŸ`±I ú$SÞ÷ŒÍòömÕEŠ•M̓N3ÀÃuˆ˜NªÖ7#âéî9LïWa<*r*æ< WR373æRPd:F›,¾Þ‡öKBÙUÿákØÿEÇa(ktaIŽ”ÅÌ·È9¹¾¤ÐGY Ád.àÔ°5Ÿ]ÎdÞqžvÂLžîú“nιv+¸¤üíZNû|O¯tûh÷’c†=˜Y£)I¾« ÈDÜ „ƒ•ç ð'-U·ÆßÛ™¬eÚÏo‡³áÆ– ¾û¾Æ²»”ÌÏ™ˆ¼'Bˆ(Û«®xA8i’·ZËùx:¼¼Æº‹EZ¯4:ª‚—^ËÙ¢¡hÙ 4½‡Ô ¡Ñ¸»/Eâ poX.z—ÐÌ2aT ÐoT7ÛŠ +=øº_O¹±ÂúýÃpˆç}NÌ$3JedË_†3R¦éÛú+¾!ÃÜ]4ýT¶35Óv?÷ J‹ó(÷—à\, èd·›:0šåzÜÒ­ŒUÎçVôx3§{'¬_õhâƶWt™:‡Å3ªÅAvx`28‘Þ–Ûç°nݘ¸ú"ס5JÁKPϬû¦ì²“Ïc(Ê}ÌÈìQó]Ö0Èè¯Í…#ùªšÙËxC–y)¤s$ ¹yx%EFì]Û>œÏ|W#S–ûì&w~¡;]–KP>»’ÄS¦kÅ~Ô,]=¾ 4 8eü¢äÁª2i''k\èüá¸<¿­—3sËC+ìÜvˆz]ùŽÀ½=z¿ "§â°®Áo3üuÙu„sÝt\µËU¶e{|úÝ×q¼…1¼ƒ+Ôíe£Q²á¢i„8NG}ËЦÿ–šïYËþÀµÜQUÔñ\þråO­³_`LŸ]ðdࣀÏLžßØúí»Ö²Ü`æpäyoÿéS–€–8ù:ÕúÐÌË•«71bTš4Ù¤.T ï<žÅðÓÊój„ä^Ñè—@Ìœ‚|‚øZ¡?¸§¾ÈWPf÷®ºóÑSª—Œß Bú0¢“A§dÅq· €f+5Š®3\áF4B,5}ûzîú}`’pSáYè ôÒ“ð–I¼ßú+TˆVHSœ-J ,$2 Z¡Ÿ®Ä¬ð<²%Üe:üD¸É¿%URpÃÈ90 }Dñ’‚£ˆë3`“ñaY£WUÊ¡pÿƤחñN®`p";p×1œÞL ŠÑЫ&p,õ$³M[OUèQu—j¥$§Ô)}ÔÅlG´WAùxšÜî)›¦¥4bŶWÆc¢’ü{¹¡”[Ìí Í}?bø}eÐ×’ÁôÆ ~Å-ö帮ú壹™„ÇÄøµóô ,Zî¥_µ´'_ÿ`Ætž1ìSÆ“¶ž6ýº[¿$ß~§Xo‚ Ìg…&åVxp½\•žß›O$ÿð8ØPÖ¬4ÕÚÖ#ÀÞú<>ëš>WO ½ ‚ _$få`?%Ò ðF >Y¡@=fg\Y!\10Øâ"Àʃ‘^3.0ÁÒ/áʛӳ‡¶ãÑŸîc¢ôgĸý¦x¯ðªó;®Ã*^Ÿæs¡â+½'ÊÃM‹SS¡çˆëF+ôq‹›’Â{hÕïâé>D­f9J&x²Á”jã· í³{p=¬°2Ä-~/·ÁTl¼X(8­bŸ,­`mà D¸„v)Œ#¥þ¨¥qä:2?% è|±#§Ñ£ ÷t"rnУx)fÅùGÙ#]µ°4{ÒwXŠÁÎ)ÞDðv¢Ÿ„†ï-ÞiÚ•¦âžž­¦G†?gçÎ"]ëçU^™ã^˱‚ªZ?¸ŠíÊ»Úä÷¤géý8Ì.—Œ•+޽YÖç>3~±1¾^ ô]þúœMTKŸmõ‘ûí(ÿ9QÅ„YLðÒ:‡pe@üÏ“U¡W5Ñû¬^ÀZÁ}ŸTaxуr!yN÷´;ßÀ lݸd¼W‹Ki ‚“÷·‹H‡ÖáêØ]Vé†Äïƒ9Ò3Ç&y~Y)»•·Ám1 Ïøk1&_€÷z]ˆ.-n)rwºC =b£eY­ÄÝrUDG@2G?ü2£Кßë¥àåÊp¯Œ;—‚MõáÙ"i ïtk¸À—w"TZ9 0•‰×0ƒ<Øé‚W# Î6å*ÜšG©’‘o".6k±«5ü»NÜ 8(õZ“íÛä&ÿvÑn¦Ç<¬ä±$ aq ÚìºÙ ¬ª \Ž«¸PoªÏ^‘8~ûIs%xXï€ 3 s­îRûs‘8µKk‘d8Z^i’È`Òf6 jq¡N,wÜ)n»QÅb§ü”1§l¸jå‘Äój~cZàR¯lP8€$ ËU«tñÚ/ÊCBÀÓ%ˆƒ†çVG<)®¸ÉÄnø¹LzÖ~/¯\V¹Jy½ÞðP£>ûõЯçðõk_1Ïð;W­¶Á–̳9Çl0\V¹´èGÐòSú³‰´“KI æ„’Hè•°àd¢âw+ÓÎtb®¦sq©‡Æ›ÈÌprz:à2¹¾Oð:íÅ¡£¶ÊåÄ]7 §zpÌñeÌU÷tá8Ó÷ôÐÃJØLº27?“iòhÍÏàI0~®8Òež_sm0?^Á¶3 }) ¬>7ô˜òˆµ§í|=†è¾b-ç°/çoŸ¼Dç‘Íô` ,VÒˆï±Êb€ÜïêÆEË rCâlê­ËØÆ‡Eã±`aµ^&?ð‘Ò{ù®ßÍÇð¹stÁ{±A§ZgiˆØ¦ZÉ7p¤ HZ¤-Ãe–Äd¯Œ­ârK×é×@®0Ù¿Ú>+AÃp X,k% r”]Öl{¡aK0¯+ÒŸEÛdàal …WWÉÝÈ U¾×6q‰SÁIæ“¢ëYªŸeƲVŸ˜‹÷¡âÁoùÈç´â+ƒÞÁIÆþÔnbxŸ¨ ˆV >Kí vÕ0?k@ÓõZù‡ýaRŒέ­}•xcíÕ°«­YºäÝüÖ:D 0­ ýøDs0ëïu!”C.…Ì¢3XÌc³¸ƒ¥J¦á"¶µÐèçyÆ\çÕ›ìjô{ 2CþúÚ”Ú0b¬”õy ¯R5bÜFåœ(ÏqŠíë,#&ÛÜ+SéG#ê5MН c-ë8x¼d‡¢5êéqõÿžB´¥m½)x‚“ªH¤&³ýÈ‹-œQ¸,ãY” €ª¸º2M㻆Ç-¼sÔØlXŒdûžßsŽŸ3œYÐHÄúÅιûS¿Ï±{N= P—"M‡µÉßGäí FÕ ^ÅæÌMnàÑŠmj BÑÐÈÀbÛ|-¦g|´nnaÈUx+¼Xб“,N- ê Ö8è`Ð$š.(Võ.þÎJf¶G^)cŵ;ýë‡ûwëOüƒºú“õWÝÏýл`—˜þ}sà7ª…Sެ%k}QÔÁRÜŸv¾™·NkX+LÞô·ëÇœLY`¯=ÒÖÉÒxNÅ<õô:ø¥K†8M²AsAަ9P1ëe#yY—¶®ëÞÎÒÛ•d*É•c»ìß[ Ë @c­€ªØ^µ-¡&í ®† †¤ø2ƒîÏzë» pÈÞÊGEÑ:Ê[¿ÏSÚÞ£cÒ^ ëùnîõÔ‡µ‚zÊ«,ô.ïzÝ¢~œòØ)ýéÓ©Zç곌|ÿŸ3‚®Ë¹`yeË¡§½{\¤cY)Ž+­iõøÊ©iRÄ6<Úµî”jP iTuì0Ü,_O¨X*Ó“®û(qC¿/è»ijB8ÍáxG!Õ¶s×õW\ãǯÔ0R¤^6‚ûB»g3sõ%óâV&eÒVÔ|ÏE=s«µakáy¯­këùø…íg;†]c}ö=±¸«íó,0¶×ÂBççüØ9òCõm€ÃŠ…;б.@ù^Øã©g#Økaçx0¾ãüï†À>ò¿c¤çþýk¡C}åã|1ÒÙás¾û‡µ`–õ3?|ˆp»lG‘DšÝÛû®u$æzâÈÏë÷C‡Þ™I„FÞM™™Ï€‹Üîù?ã™cdÜÔs²ÇÈ}®9äÔµ£Ö’ó”â.Ôv¢×ƒ:ÃuÀ´½ï†Ì̆0œqe5Dªà9%ú­ŒtjQ¨ùNæCÿ̽É_RÚ¨{³‡Fâñö^Ý….9õˆÝ†›«]-×%•šÕÍHÛà…¨:nñÄQ'K&í#¢6>ñš°ªVdâ*¡1‰ÑjÅ}Ì­ùÆ.X쀛“¿º ‹Ç4ÇrÛ.ýéÞ2³Ã²¿[Hiè÷˜QТÑ:hpáw÷ñKç‡ܨ·1a}„àçø =Ž Р\ úG2B(Á’É€´~ 5—éÑé“·è"m°´|<®¥ãýÍå0t ouÏŽ+¥!Õ3èC]å4Ì6nqø) /œ\ÃWC†¥fÅø.`W2H‘®kͰ;šL‹ Œ9€®ÒTõä µèÏ£³-U@F2`㬠¿ÚëWÑ»¥N‚ñ¾Þ`ê^ž…BŽ@ S %ÃÁr㥥Ûkš/ÖqH”sîxñÙ˜èÀ\ å=¤µ¦ë½P42Ð:RVNù»,W¸¡·ÈPC_Æ)êÝ_.ÿ¸©sB` 7®üžaÇjb2€òјäBÛÈ®i43÷WM}"Lü}¡¢¤v‹6Ä^ÚW#Ž7ôÝTõ€.Ü××»åÇIw¤ì—#o´Ì‘zES~a<¥¶Íj óïS«?N 3bZ@Ùif-‘õ¢$tÛ`³²bC­9(´;·&É›í%‹ª¿×¢akvz´©ÉÙ½ümcEg:~%¥+h¨ùå¹ùg›]lÊ(1ÁôfLÓ~ t&ÃN‚sk•’‚C½-vP\h~÷ËÔÍÉ Æ›%#^¹hÀÕ ’¨É*í»Î`° ø"õ*”AÊ e6BÄ¢s½D†,–qF §=å¤w•ÖÜ:øDÏrC…wï¥;<þpîE‚d`.™|Æòpb]€ÏDVøÇè¥ Ø@{·]‹ i“í3N?‹Ì˜¨E£ùŽ/]ö"®óáÝ>œ Ív,Ÿ@Åkº¡¡R¿ÊôüÙ<èI‡a>ïo.–ÇýmS¤üÃ8ÛàŦ‡!€Á2F`¡Ìôbú±â‚Qžv‹Ç‘Ûµ½ßÉbD#êF6jóùÝݬŠVk€%dÀU*Bÿ &ÅK´Ú^K]Â$8“;Iã7e²h\?“ü]²T t\Ô^r9Þ’C<zÈ·k#”ÀÍȽJß?NÔÉÌ xI±LÓd¼”’M=™×ºØÞÃ]¸H 0„ÀCgê›èMÚæüÚ-g¬¾çˆÁ–ñx¤ª»l&‚ÚòI„&‚ßNꨢßÉøDËhý¦Ýk;c·Mª)B{}OÔæÇ=$Z¸‚Câ(2ÖÙ÷熽½MNjþxl/Fª Aê…Tݤø`þ\{À÷-Sú?uò, verä•„,-N2»Ÿ”¨öf×hq°×è»pZ7’ï­î lvõá³Yï7UžW"e%'¿-PùS;ÓeÛò7ÿsnp‰èáƒ%¤÷]º®9¹¸äD¾è›ãU?.5g»W‡w|€@2¡-BBzÙd¶Jׇdʨ².zίšäTæž7ÝŒ‡‚éjãq?f×™ö°´˜X`iiS§ç•~PâÄêèåýBÀtÝa³×Sßó®Ÿ/ƒt çØ—,SXœª¦è/k@½Ä À“›ßɰç9žmVõü¦ÐÛô8q›´påð‚ló†¹î3°ó‰st¿Û 7¡åeëgã¦ÄQ-ÕíTÃ+·É«KŸ ¼ÿh!gÆ–ØkÒö™þÄÇ̱¹Ü¤à’ÀAZA ^ÜSlî`ˆµ¼=Óå–~o´Ã‡ HÜR圿»ÖYÇd?Rª1X&‹]NÐͤ½×E#÷n/Gh Äw>¯­ì_|Å6}˜«8Ñò £ú(ß­1ۤ충Âd1ÁÚåOòƒw÷K$âu)'–×]ó!‡l`À_º©Kcu雘ÇëÉì²!½˜éwÆ®åŽÞè†õRQM‡®€í^¢é#ïü¬’Ú…ŸÔjß’?ïž°º¯ušÈ¨êU§!2ÜèNà Íôœuʽ·ïË«ŽDöto¦ùÜ2‰Lç£)ÁÞši?Eôb>F0¥¯ ž.ÒÑžï©ÓIkךšF!jM,5žiO@Í”B¼’òw{H-»Ê2UåY¹›¨ž™òžûˆz¯ ”_wË2Z’ÛžÞ]d¾Ô}ºG ³™¯ˆi(¡wäTII(Íß«ØK³Òxa0…¼3aç2ñîz¦b·¢~\êB>38zýÐýÍTÔÆ}V»zAz’ü-ïLäv"ÊŠLjgr”ë«mΈg ›&{µ§ê™»O6®SU«êà|oå6FbÅZ‚¤¢†lmÓÎ ‹M-ß¿ëÕ0:BŽˆ×Áü[ñ7&)+µ—s²É¡ÿ:¢´h#³§g£4`=VoOWoz¼lG¯äêCŠÌ•/)j¤ž= â1ƒ_Q—3 >oÍjT?ÿ—ÃV¦ïgolly-2.5-src/Patterns/JvN/read-arm-demo.rle0000644000175100001440000001130112156145314015622 00000000000000# Read arm demo. # Author: Renato Nobili # # Controls are provided to direct the read arm (r-arm). Set the machine # running at a slow speed to see it working. # # A pulse on the input line (IN) causes the pattern to send one of two # signal-trains down the output line (OUT), depending on the presence (1) # or absence (0) of a mark on the tape at the current position. The # reading head then moves forward, ready to read the next cell. # # As with the construction arm, OTS (blue) and STS (red) lines work # together to manipulate the cells at the end of the read arm. Various # coders (C) and decoders (D) are used to send the required signal trains, # which depend on the output of the read operation since the read head is # left in one of two states. # # Other controls (not shown) are needed to retract the read-arm. # # http://www.pd.infn.it/~rnobili/wjvn/index.htm # http://www.pd.infn.it/~rnobili/au_cell/ # http://en.wikipedia.org/wiki/Von_Neumann_universal_constructor # http://en.wikipedia.org/wiki/Von_Neumann_cellular_automata # # Originally distributed as: RW-ARM_ADV.JVN # Redistributed with permission. # x = 124, y = 88, rule = JvN29 13.2pA6.pA2.2pA2.pA3.pA4.pA3.pA2.2pA2.pA.pA.pA.pA2.pA2.2pA4.3pA2.2pA 2.2pA2.pA3.pA2.pA2.2pA2.2pA3.2pA$13.pA.pA4.pA.pA.pA.pA.2pA.2pA4.2pA. 2pA.pA2.pA.pA.pA.pA.2pA.pA.pA6.pA3.pA2.pA.pA.pA.pA3.pA.pA.pA.pA.pA.pA .pA.pA$13.pA.pA.2pA.pA.pA.pA.pA.pA.pA.pA4.pA.pA.pA.pA2.pA.pA.pA.pA.pA .2pA.pA6.2pA2.pA2.pA.2pA2.pA3.pA.pA.pA.2pA2.pA.pA2.pA$13.2pA5.3pA.2pA 2.pA3.pA4.pA3.pA.pA2.pA.pA.pA.pA.pA2.pA.pA.pA4.pA3.pA2.pA.2pA2.pA.pA. pA.3pA.2pA2.pA.pA3.pA$13.pA.pA4.pA.pA.pA.pA.pA3.pA4.pA3.pA2.2pA3.pA2. pA.pA2.pA2.2pA4.pA4.2pA2.pA.pA2.pA.pA2.pA.pA.pA.pA.2pA2.2pA9$73.2pA2. 2pA$72.pA3.pA$72.pA3.pA$72.pA3.pA$51.2pA2.2pA16.2pA2.2pA$51.pA.pA.pA. pA$51.pA.pA.pA.pA8.18ILIL$51.pA.pA.pA.pA8.J.J.pA.J.J.pA7.LJLIpA$2.pA. pA2.pA17.3pA2.2pA19.2pA2.2pA9.J.J.JIJIJIJ7.LJLJL$2.pA.2pA.pA18.pA2.pA 36.J.J.2JKJKJK7.LJLJL$2.pA.pA.2pA18.pA2.pA21.pAIpAIpA10IpAIpAIpAIpAIpA IpAIpAIpAIpA.LJLJL$2.pA.pA2.pA18.pA2.pA20.IJ.J.J9.JL.L.2LKLKLKLKLKLK. LJLJL$2.pA.pA2.pA18.pA3.2pA18.JK.pA.J9.JL.L.LILILILILILIL.LJLJLIL$50. IJIJ.J9.JL.L.L.L.L.2LKLKLK.IJIJIJL.6IL$8.pA27.3Q11.JKJK.J9.JL.L.pA.L. L.LILILI2L7K.JL5K$8.2pA16.23IpAIpAIpAIpA9.JL.L.L.L.L.pA.L.2LKL3.5IJ6I L$2.9pA2.M12IpAIpAIpA14.J3.L.pAIpAIpAL8.JL.L.L.L.L.L.L.LI2L3.JL11K$8. 2pA35.J3.LIJ.J.JL8.J21IJ12IL$8.pA36.J3.LJK.J.J9IpA.10ILILILILILJ13.L$ 45.J3.LIJIJ.J9.L.J.J.pA5.LJLJLJLJLJ13.L$45.J3.LJKJK.J9.L.J.J.J5.LJLJL JLJLJ13.L$45.J3.pAIpAIpAIpA9.2IpAIpAIpA5.IJIJIJIJIJ13.L$45.J3.L50.L$ 45.J3.L50.L$45.J3.L50.L$41.2pA2.J3.L50.L$40.pA4.J3.L50.L$33.2pA5.pA4. J3.L50.L$33.pA.pA4.pA4.J3.L50.L$33.pA.pA5.2pA2.J3.pA50.L$33.pA.pA9.J 3.L50.L$33.2pA6.pA3.J3.L50.L$41.pA3.J3.L50.L$41.pA3.J3.L5.pA15.pA28.L $34.pA6.pA3.J3.L2.2pA.pA12.2pA.pA28.L$34.pA4.5pA.J3.L2.pA.pA12.pA32.L $34.pA5.3pA2.J3.pA2.pA.pA12.pA32.L$34.pA6.pA3.J3.L2.pA.pA12.pA32.L$ 34.pA10.J3.L2.2pA14.2pA30.L$32.5pA8.J3.L31.Q.Q.Q14.L$33.3pA3.Q2.2Q.J 3.L22.28IL$34.pA4.6IJ3.L.pAIpAIpA10IpAIpAIpA.J27.L$39.J.JIJ.J3.L.J.J. J10.L.2LK.J27.L$39.J.2JK.J3.LIJ.pA.J10.L.LIL.J27.L$33.pAIpA3IpAIpAIpA .J3.LJK.J.J10.L.pA.L.J27.L$33.J.J9.J3.pAIpAIpAIpA10.6IJ27.L$33.J.pA9. J3.L50.L$30.2Q.J.J3.Q.Q.Q.J3.L50.L$27.6IpAIpA3.6IJ3.L39.pA10.L$27.J 11.J.pA.J5.L32.2pA2.2pA.pA10.L$21.pA5.J11.J.JIJ5.L31.pA3.pA14.L$20.2pA 5.J11.J.2JK5.pA31.pA3.pA14.L$21.pA5.J5.pAIpA3IpAIpAIpA5.L9.pA21.pA3.pA 14.L$21.pA5.J5.J.J13.L2.2pA2.2pA.pA22.2pA2.2pA12.L$21.pA5.J5.JIJ13.L 2.pA.pA.pA.pA41.L$27.J.Q.Q.2JK13.L2.pA.pA.pA.pA12.10ILILILILILILILIL 4.L$4.pA15.2S5.pA5IpAIpA13.L2.pA.pA.pA.pA12.J.J.J.J.pA.LJLJLJLJLJLJLJ L4.L$3.2pA22.J21.pA2.2pA2.2pA13.J.J.J.J.J.LJLJLJLJLJLJLJL4.L$2.9pA.I 14KpA21.L13.8IpAIpAIpAIpAIpA.LJLJLJLJLJLJLJL4.L$3.2pA22.J4K17.L13.J.L 6K9.IJIJIJIJIJIJIJ4I2L$4.pA14.S.S5.J.pAKpAKpAK14.L.pAIpAIpA7IJ.L33I2L $27.J5.LJpAKpAKpA9.LIJ.J.J9.LJ.J.J.J.J.J.J.J.J.J.pA.pA.pA.pA.IL3.2L$ 20.2pA5.J4.LpA.J.J.JK8.LJK.J.J8.LKJ.J.J.J.J.J.J.J.J.J.J.J.JIJ.JL3.2L$ .2pA2.pA2.pA.3pA6.pA2.pA4.J4.2L.J.J.IJ8.LIJIJ.J8.ILJ.J.J.J.pA.pA.pA.pA .J.J.J.J.2JK.JL3.2L$pA2.pA.pA2.pA2.pA7.pA2.pA4.J4.LpA.J.JKJK8.LJKJK.J 9.LJ.J.J.J.J.J.J.JIJIJIJIJIJIJ.JL3.2L$pA2.pA.pA2.pA2.pA7.pA2.pA4.J4. 2L.J.IJIJ8.pAIpAIpAIpA9.LJ.J.J.J.J.J.J.2JKJKJKJKJKJK.JLIL.2L$pA2.pA.pA 2.pA2.pA8.2pA5.J4.LpA.pAKpAKpAKpAK6.L.pAIpAIpA10IpAIpAIpAIpAIpAIpAIpA IpAIpAIpAIpAIpAIpAIpA.JLJL.2L$.2pA3.2pA3.pA15.J4.2L7.LJ6.LIJ.J.J10.L. L.L.L.L.2LKLKLKLKLK7.JLJL.2L$27.J4.LpA7.LJ6.LJK.pA.J10.L.L.L.L.L.LILI LILILIL.ILILILJLJL.2L$27.J4.2L3.LKLKLJ6.LIJIJ.J10.L.L.L.L.L.L.L.2LKLK LK.JLJLJLJLJL.2L$27.J3K.LpA3.LJLJLJ6.LJKJK.J10.L.L.L.L.L.L.L.LILILIL. JLJLJLJLJL.2L$28.pA.J.pA4.LJLJLJ6.2IpAIpAIpA10.L.L.pA.pA.pA.pA.pA.pA. L.L.L.JLJLJLJLJL.LIpAIL$28.J.J.T4.LJLJLJ23.22IJIJIJIJIJ4IpAQL$28.pAKpA KpAK3.LJLJLJ60.L.L.L.L.L.L.L.L.L.L.L$33.J4KJKJKJ61K! golly-2.5-src/Patterns/JvN/sphinx.mc.gz0000644000175100001440000014763312156145314014777 00000000000000‹ªåHsphinx.mcuý[ËuK“%†Ý¿¿â_Ø«™yˆ<à; XÛ`ã‹rõ§îBÕõ‰êj‰þ÷Î1"3"#Ÿ-ö~óYkÍSÎ<ÄyDüþïùÿûóøÿçþ¯?éßÉÿñÏÿî¿]ÿÿüüü·ÿŸÿë¿þÓøÿö“¿¯ÿü¿þéŸÿùŸþá?ýüÿîçÿò_þñúç¿ýW;óÿñ/ÿô¿üí_ÿó?üóÏ?þý_þó¿ýëùÇûû¿þüÓ¿üüwÿÿòó¿üý_~þû¿ý—ÿôÿò/ÿûÿü“çóŸÿíþío?ÿð_þíïÿéþíþOzÿßý‹'ü»ŸŸÿÛ¿üã?ÿ—ÿ·ÿüóoÿð?ÿíçïÿãÏ?ýÛþÛ?ÿÿçŸÿuýó¯ûŸÿùŸþqÝNoòÿòïÖÝÿõß~þí?þíü—û?ýü¯ÿñŸþñ?ê%ëÈ¿üüã¿þ}øùÿº®ùÇÿøOÿüï¯;üýçïÿ²ýý§ýÏÿöóïÿöŸøRëüÿó¿þý_ÿ§ú—ÿðƒ.ü7çáú®çÅô>ÿÝÿó¿·7\·úÿýïÿ '­¡@Ïþùoÿãêâß×mþÆïÿéVþåoûÝþöøùïþ—ÿ>Ï?ég®ÿÒ÷óýÉ?ÿKëÇÄø•ŸyFÒSÊúWÿ Å7ÙwðôŸ¾~Ó[M~JYÿç©Y~öm3>¯ÿçºP®“ô ©ûHù?‰ü©¼ûIm? ç§ó9á³v'­Ó'»‹ÿòg}ã£öuzéþ¸œ×ßÕ“ò“+ŽùÿxÇÚú߯Òí¼©w×/: éÛ¯ËaÌ󧬡<N>Fù§^ßÊ>öéýÖk°öEÃRdŸV~Êú»~h?¥ãÄw9ãùùêgwX×ÌŸº>ʺlgN?yü”ñS³v÷üϬ• ß¶ ›3À?|"~ZŸÊOí¸eå,åsÝOÒÏ î"Î’¤sYÛOh³Ì·ØïR´»—Ž[÷ÅÄ[+±ï¥—ö ¯X]"¼ƒ`™¶O_Ï^O?-­ÇËú_жüg iÿ©«ƒå§•3¹“›9‡ÏÌpÙ±ÅbnKs¬s×õ­ý´‰÷IåZ¶YÖ›¤ë÷dŠØï8uîôÕåüÎͳ¯ä–±u¦w6ÙÔûö5>ã§ÏŸñ­ŽõõÚ±ö30Mðÿ~†m Yü7êÛ¶ìýÏh¾?²o¼1pÚµsΫ­ëçî›>çÏY⫯¾öÞØ¤àÓÏõù™õgÊ>Æóõº½í²Ï†ÁNDfÿ™ãgbP0cMÚϵÄ>íúÄÐã<õ;gj'?}–Þ~žùJß»Õ6{ÖÔó>E{‘i S×AúÖ^ùÖW¾$Wç‡kÓ,ƘÖ$ÔŸ»cP°«±, wÛ{W®N˜Óý ¿cí÷µöu _T#:¢¿S÷aâ—uÓŒ®p÷i®®$Fÿ·6ÌÀpWþ4%Íø¡õ™Î^Œfâsß”ŸÇ¡(k…øY©ðß9¶ê Gò¾CY+åì{¬W*ÕhuÜhÚ;’Hh°!Ö 6e\û³üÑE·–ÍšµÍÒ>]M÷Âÿ.¾i\¢‚P¯ñ©Õ–Æ^“‡Qåk7ó2th‘ÂBZæ`íüJ½oªìù'{Ù4,íßÖÁÊl\d d[ù$·ªð’êê9‹o“åú}$Ø"½Ó’¸:‹ñ›”¯š‘õ¬ÈÅiÚÀY7gKfêš[dl8*ˆ%·5¸òØ¡KJO‚ÅñÛÆé0hn+u³IÖó1>xðrú¢SMdRajúØÕ1<·]oPþ®_h)¯«;‹˜ƒ‚¯—Æ-Ž\ŸUam!é"Ñ#Ã.4üÉJú â7Ðg'yJ°úGŠI1$gva½Ñ"úu]_3Y¥n®³…ªAÁQ߆ºJkîœÌ>ŽÒ¢3¡ö«ÀÞŽ uֵR+Dw<¢œÉtUš€®§E7ê"Ñuu©qRÀº›¨ë+ ÌǸT3NS¢ÊÞw2þ<–°–/óS…­ºº± ^2s¸ìËY¯¨…WÑËÛá´ .ê^ÁŽÉðÒ•fŽè ¥JrõÉu¯"c‘ª‹;ÔEâëZûµ;ËTnK[>ôxuAÇaw©º ¹-ÌdÝE¼ˆ|ø‡Kê6š‘Ò­‡çÔ¶þu¾Œîy5íàbYÿÆú‹Š‰‡K&­›¬Wu`)‚…‚,Ö;„ƒqo•³Ôf”`æ¡«3ôUáo?QF%i’¦»ÉZþ-&°8ƒ˜»ñ^`‡xK¦ÛjI±gÐATÔ„U”ÇsdÑKYÝ“õŒï¼ñfúk÷¬·ÌÃæÞ/š?Rô:ƒáÌ¥½è ޾†a^¿UÓquqq˜ÆñfdÊTž3ñWââ¹ÛcI PÊ$ÝÊž-.!ýXT“]º½3[n[‡hïá/`ãGêús™–yäM9Fe3Êd‡÷¯ÇUø÷àÝ[¬jLôJf“pÍìrõ-“atdn ìrè÷éï)Â…nÛñ¼Î%– "8Gü2TÂA²ŽÜzIziA8·ˆ™ûön­‹šÕ1Ó¸ |Ÿ\ª‹6Ë¢õ²Äy¡)]*ÆsÍØâ¢4\eµ#q¡vz¥ï½ cí–è°Á`]]O‘ø†Oß~Ó‡æ!¦*äµ|¢Ï¢xÒÛ5ó êÖ 1zë®ÒI¹ò¿M¿Ò&’ÒqΚ¬E­e\~€-ˆQÄÈpsS¾·?z´ú³h®Œfã›Üþr\•ëÔEq*Õ¶­P$ÕH„²‰¬¡’wÜêÔLF|ÓŽR¸¾Ï³kÂÈ:õZç— ¨G1 æž&[”çÝQn‹Ž·Ô® «½MNTL+ 4áx4ðÜu«EÂ[Nû¥Ë›ãà„†>®×[¾-úÞ²©“jÛ{¢åv‘47FØR=š6[˸á–.µiëX?Ûl7ÍàÕÖFm‹÷7ª"Ðð|…:[[¼ -Ñ=nêM[Ol OZ£TšQ²3òP±ð®eøÒÏ7­Üû$¼U5#µšTôÁ¤ 7Uc1D9¨Ú„ºÐh‹ú´Eö[­‡ ¥¨èšN"«¨øç΋÷úo‹œ5xal-Þñwqé·mµá6Á¿Õ¸F¿áóâÄÕÈ|ƒAêä¾m‰úm‘æ&« /ìwDZv½‘î¾ÍºœNÑs8éLò…¼S˜ÍEð׈¶VuRû‘ÕÚZ*­á„õØÖØ/ Ä€¤ÿçx¼¿ãl”óyˆuÖj­¬­áî«?‹˜·ÎðlXA×òèpú Žè~QM÷–SóM7QnX‹·ï”.ñnl#õKÇòL?Ãù¼m­Oý7gãÏêáJý|¨Ô¦ûú¦ëFmÈf½I}’쫺`ÎKlï·Æc@”{Ä‹{iõôõo½xêôáñ.mn³®)°`¬‹&©Æ"ÃkœO0Ûz‡F×hJædl¢6Ò¤Üéó~§FÚYÎü©Rè—-t5P›5Ê^ño›ué†ÇWç<µC®_ Yá6­ô6ýÿ¥â!ÞåS/Y €x"m*²½\ Á:Á笕'­áÔÅÛadþÐEÄdì@°?õ‚V›¯ÈsäƒtèžI. ï³'êu*Æuî§<°’zÂ?\ ÷f¢Ã© ËRB8ˆº±é­æ<Ê4_zájÆHÑæ?9èŒÇÀåEGŠ>2Χÿxpwß;„r_i(ž¦ö±ääê5™¾¶|j[ÂCV?[è¤,·MÛ%†ó滳ë¼u]Q§N€…}¬1°°¥KÄ„î€aƒ/´ø }ŽcX0aW/ª®ôo›ö÷ëØv¹DnP,0ñ¨keÏZ¯¾Šè4üÅ/°õŒ§à×õôEõafZËóžñËø Ür 讚ºÝ•E§½­t¹b v"f*o÷?÷Œ|R?¦7=ºóûb} Ûþ»wxím"3A n hKx ò3\ì³U‡+Û§àp¥®±„Ó´ỸÎ$øEVY†­% Uð*š“1,Yêp©®åtî²Ú ˆ 玩ꂮàh=[ ïôA…àZñ»‡ü¨BíÑÞÓ#äóåm]oNå|°ÿ°ÀËñv|fá?–‚¬NiLèʈ€Ä5 ¼qóƒÊt·ã™±­Caißml3ß’Xà¹Nþ­ŒÎ¯ …èܸ™û:Íf.ÌvŸ˜FD\xt“kï˜ùŽˆC®˜ns¡–›`ëBbRK ú¶6u_¯Úᬛ' &\½¨LábõÆ•ñï*fáºßšý>ákOë)›Zk~Ôó#¬; …òdÍ–8ìezÔç«òžËyÝq|øwœ+[f»OþŽöÍZžCCÀ׎|¯±^·Áï²~©.ïÉ^?jPHî'ºm‚k,Ò`ˆ "cë‘Î:ûhÑÛ½×ñY© ÀÝ×h­U>²kþ‡Ýcn”Ü^|î›Öq9óË ùàXWâÙÃúŒ­3UF5QxÐÂ3 ©•#î0DåãØ)»¶$}„ áüÎÀ.j“<Ôh=½à<üE\'¥ .®ƒuÈûm«=¯Xc“õ(A?· n£¬{,61ªXØšq÷õ Fº"z³ƒ½,Ò>ëµþñØ:b;åÔñmQuÀ~¿ÆxÔN*äg«µ‚š+Ô-ú›áŒñêõˆÈëê!!ZÜÑbrB @iªý1è\E™Û- aÝz1ˆ±4 ìùê%¨RW·e%0WEoÛ‚ºÀÔT:Z:ç×AëÛ9ÏXÝ_”l,=vÃÀ$ z¾þ¶ªq*H´·…‹»¶1*h8.ÈQÚç™ÛÑ`’ ágôË©&Ð5v=߷ɾ*`¥Mš—²Ckÿ Dæ,Ú88+ŒÌ'éÛ:uÙq’*LБ4ժ͸œAoëúƒAf0d"Hz õP¥:Ó¨üYè`vØÐ’NÌÈòg¤ÿT‹°¿Ð\ ÒUMmÀŠ“!0ù4°aèÌ@Â"^ŒcPÓ¸6­[»2(ÿé‹q3/=f¾®€ñ^ɹQÜtÔahÓ›kŒÙìF«ó*Ìø¿ Ú}\sVHÏH‘¦rÊ#jM^w›kfÌ`‹+ÌoÛŠ¿v:YgÕÀŽÁHKÞb-~š‡&ÝvènûŒó(ßZëãÇã¾çâóS>óuª°±>±gœ>?ÇjBø.‚ïÆ×Ç5b°L¬30¾c¶‹ïhçæª$uÊ‘“î\¬Ë¹6 œ]ø,Ö‰£a«çM÷;ƒmÖYƒñb8¿›Š<‹êæX+Ä’ü9& Ø~õ|ž·ØÃ\À$‹˜}"¹þÖ+\œñÈ *5©º)F†z O\sE³ çq+6Pváno“$Lmû MðÜõ¼Å$&•¾ ‚3 #ƒŽ#`Ë+Âjšå§Ô-MrQ5†fÂr3Š~;ÿÖÞZ¿Ìs¿Ë}¹ˆå5ÁW†ÐÑùbýê1¨ÝlõÜ«ï¶m”xXÃYk,àù¥õŠ î½šï5?ï7S ^SÜŒùÓ•V’pÙ¼#Sp÷õ:‹iLô‹¤ g©àúõ²'Þ>_ø-FSÁ7wœ —{áôVÐIÒ9¨ÇöúVp|ÿÅãA­:Ά•Á=½ÝÿpÎ" ׿Ã~MXâ#æ(ú ™ eˇ2dƒUÙãÎ8ôÖ]×I£ßÍÎ9Æyàbsàz¸ €NúþÀ¾¿>¡k¿Ì¹ÑI7)Ô­4ˆã’k_×s‡ËðoÝîn]è#d=Ó z(çu]³¸}Ƈ»$î~îi`aˆ¡".€·;A¸¶x'Å]ç`"A›÷®¾T¦cñöøÔu&~]¡}„ýYÝBqܵ&³Ñ„û)EIߺctôUPíŒ=¡|D½böá;‘X©jϦrûÙv|£Û]›×7w–¾.Tïƒû¥aƒE¾î—PÁÚÓ´N¤¦Lyè˜ ’ÅÜöbJ~vó7Þº† N‡"Q¦=oË8›ãÜßHQ‡^M  Î_ƪ\]ƈ‚“}ÔË­O{m¯ŸýÃ^Ýë£8×(—ðK?H¼dȶÃúˆÙ@‡4äï;·.‚•øg‡O!^Rƒó &®‰„EåºuºÈ0ø• ·"ì XìÇO–k3É öûEpªÔÚìÓЧOöâ?C2¿¿~X±GÙ­4ænߊ¾1¢ñ¢“–a®wÇïŒÌ›5 JÆ¢JöÊ7pßÁ±¬ ú‘Œ·î3O˜¹ù ·;9™†[$Pk…êš•4¿%YƒÖ#hÈ\ÿ¨J8NJÇ=<É¥ëõ hæAÏ$Uü®'&{¢«Ó (Ã-Ÿ[;L’Ý!\×M£ëI‹+û¨¶h†d³û­…•6BŒ{àXÝÕ¾×Í“–4¶ˆxšƒåI„'ÆvÞ^ã5%‡3ûnkŒâyô¢jþ¸.M6›O”P¥Ž`“Æûm2À‰Øá”iUÆ‹d]££€XÞôéà9!RÄ[k7ö IÈ‘À©X˜§Õ†uÿ’é'¸Æy“ÆTtdñ‰ÍµøŽ¥`ýÔ+Î.µ×z a~F‚·~<¬‰ U{‰ìMUc5 ï« \"/§pŸ¸%—° …Mù à„én()î“ &¶0bü /ÃÓðI>R|Ð ÂÀ‰¢Þˆb‹’ «D=z{[içÎoŠ™vøT"¶8‰8U„UƒòT%KB䆻‡ðÚJx÷Õx •IHâ” 0¾¹Uå—Š€°1uÐqÊ‹:fÞÊ |™ßöd&‰@_\ û3hÃÚÚ²*`j1ºT-Þ T ~“3pÎf¹zw !^5qµ7nÂv˜ƒ‚ôªß”¿üÌ¿ ÄI{Aá—¤ì×#GÿTË^'p×ê‚Ç¥ð]]÷|çgv=ê#D•äMúuL¶:BQQišD"H9¡Ë¥;WJ—?ñx}á=eø-ïÜŒ¯êLèoJ:ǃÆ:Ãl¤ùxZ² ömƒ;0~i+Kt «éÏOu›í TÓ¶ÏÀƒôü„Ìã:ýhöS/ ÖÁÛ{–éKÃÝ…§ãmÁ"`Î ½3I5!ßwoªo/QÚÏ¿¼#Oiï*J½”_ªõG—¸àº–·é9òœ2-t` ™&7ô‚%‰ªNÉ8;¨h#B¬ÀËa‚º“9—Ÿ®`Š'`lDMç”ÎêÊîp?V†_Ã1¿œÇ'½Ã©¼ŒÞ:Ǿ ƒ[¦|>~tÁfÐåÌ)DJçC]jä¸ Ûå+ûjí}© ŒëÈùó¶«(•á6ËîL;&2 ?-dë ö/³AÿsËg´êdC~^nËíR˜uØiףůdFj$ÊŽ§KÔ+†µÁ^éžmž ab÷윪·FçøÎ Ô™ ºD‡·ÆäóšB¡?Q¾œ}ô¥~Lë± :0äN9Áô;‹Ï8ÛŸ'Wåæ0k=³4Q&àBÊzÚÿ6 Þ%r…ï¨ tüóÔ Õ¾’·u'e:Ü ‹dY,OH¦á“,k›Í*¤»éSÞ¡¶ˆŸ’fJy€MSUÍrü­ÒC¾@{ûœö8õ±]ih®àɽõ0Ñ[ ,;8ÂáqéâCëÙŒçgv=Šë ³®bðÜ~«í`†47 š·&P¥Zï5³ß ã×müúN¿S¸v/×G^fñ*Ûÿé4@ò~4Z¨…]ëíû@;š¬†da÷Ÿ$¯TǯM—EŸg` ù"X‡NÜiœ©¡ykÀ‰ÆN™Ti¨ÝöPø:Óà{6žÊïªËC§r-9ž EHÁÙ°çßóyž1;wh Ž@ZVñ>Ÿ£åǰ'¦2ŽMÖ |…ýÞ†cü™·o)e’næÚàîœ&8’"‹œI‘IQÎ@Z§ò‡xå§ALvþ·c¦™fÃ?Ç=!›€t\ BÁhÖûÈà3M‘ û(+Ž?Üaœ,Ž1ͽÏ4÷ÏôO#é8A@X§’®T@jöÐÕÍlXÏ“û¥$’´½íˉs>[s^'ΟãÈJ„w° `ÿRQ…)÷ÍšÕ°zGˆÏ 9`Ë8ŸRSÉþ™Ÿ|Jæ–§˜MßÜN?ú/ÏI"¾z7ìšI ´3Ìü{nukG3%-SO¨(cÓjr%ô°TæÜÉì=OFçI‘àcéúüªï¶“±»²:Q[Ðx2ØÞì”{Hª6»_›Îî·°_°ÏÕ ›mIì×›*/t Y ØÕ¤äáNTXÏu¦iÙ:×ñ©8[ì^x°•Âôë½à‹ƒb\øú›Tè[L…¦DÁʃ›kSÔcîÈçùò€¤œpÇP–Óì`¸€ß«û2t‘ <Ñ9J¡_#>ÙŒØð8!doìØ•m€F¢>*Li¼”_ë!%Ç;}é”ÈÂM·¾ôMwy“þãb¡¥'8_¨Tâ4$dÛ®“¬oKž½{ƒAdÜów1™1"ßv´'ÉM :#¥v@¸«ÚR+Ýb£n×’Ú‹7ŸÕI眔ÎϜð£2BjÇý¸Á{í§^kkÏ }maH¨v°_ƒ¯à†©ÔìQH$³–aʇåå:Ôg¤©<’KT8äã2 xmŠû>©”!\bëwˆ1@ˆƒ¾?´¤Âá'3ª“]5Òf¨‡ÃÝ"$y®héèMöŸ¸ÀI- çªk* -¨˜! Ð…mWÚÄ ¾~l`Oø §’+ãÁL*;è’›Ùuä³iŠ Ç‘]ô¼rŸ};°t#kʉ+‡²¹Í Ì!ÙN5Þ°qD?% ËWS¶†@ñ}÷áÏqpPôâ£nt€Ð0–¹þ’F}o龂/UĺU0§šÔ¾ ÍCߎ’'ôX©äÜzǃþñ@™­zòÎ þ½¯ zÏâJïyâ'¼‰ý¡Å(餩ô(n©R_ÜzqÌöV¨õaj7>á5òQ¯$‰®:ÖðXÚUûQ÷oÒ(¶„•§CÍX¶“NCmæ-Mn•þ¨ïz¡œ÷,ŒŽ÷d¨çy4à?I€êÖèÎû“W×Ç×Ç0^ÆOx³ªêÜF—¤+*y“¹›Jß™x’)·ôhšâÎ%ú)I^ ÷bªùÂæ¼DÇk7¦¶·³ÓŸêŸä^; ö‡!|áí÷Ò ×í„ÚÆ‡œI\ÔL2?©mÉbOñ;!êF™Ì’¡_¾’„Y‰9tÄ UJÇ|!!pœ‰Êh><ÒÏNå£Ë=ÓŸ¯9ˆ•.[ïoÛšŽhÒZÜ™Iºª®ã¯N9ˆ>´¬Bé`(|Û–Ò^=‚ø¢½.ôîèm%š‹Ê˜ìL­;pžj°&Èâ’iªBªÒÿœ´…Í#@ЫÀ'j^^ƒñS´Ð§p&3,k)‰âåúøsTÍ»¿‰‰R÷XwCS0•¡ö†M©¢ö@¢ý©E³Í3þ~ðsâÒ­ILšºñJvú»¤N=G†n®Ñ5˜Ž('E®ƒD°…€ñÊÁT#'ÁÚ/÷¼QL–~e’™wüòPpwcÒÈ´3Zqý #¨¶_pF óWCE-G_V±l7p¦Æ¤°"®|„¯&)olÊÐz!÷Ÿ×`ýJ$ 4 ‚çTðÑ}¦®ù¤·â6­õ@1E'ºé¶¦¾e.(zù:‹)\>¨Æˆ´|‚–@ƉÀ|U1¢yøn'Ùh´[ü츟âÉ´ŽƒYéÞdI!;Ÿî µx¾7;©ã;ï!'“ Üþõ‰¨úÝ#®®y…E6,üV™zvýÕafŠÍ«ñ‰@§µpï ÛªÚÍ뎽½ä©“Qqf“T,e:ÕVx”¯_ùö]•ŸKìíÖ8ÃuáËÂp%Ü`gÖ[ŒÃìðÔq›Môi·]RÓ¬íÛ¾'pÛ0qtŽÿl§åÅäì§ÇÂ\ñêLÏ{ûÒº»Än2mnl+òi»\ ].è óÆkXÞZSÈ3ÇCc¢ùÆ“p¯¦‘¤—WÿUƒ… ÜGç# à5p¯Æ´üÙ³£1¥°(NFK¶ Å3Dþ;0Új†ª£E#HËA'¤SHÈ¥¤`5cÓ}vÈ#„•gÝ8¡Zö$Ò¨IÐŸ×Æ“0„ zðk ÂåÿñߤåvV¢a4°-BÖ/˜ˆ$ «A×á.kŒ‚_¯ÁWÃÊ…;­Mõ“kÆQÊü ºQ™‹ ç)ÙÉw¶ÍœÓCâ…„¼ ©Í;c¢ÆÊàWíÒ­/9år=!†ô‡^l…l™i-¹èôIxØ›o!iÂFwöl]<ÞÒíàK¤øÀ)¨õï@°Rgä;ìørl±Í+ê÷³8³Ü-fç8±Þ»}41S»Âaø ¤Á£ëD=i¹@ì²"$dhX¿“˜È¹9™U•l¹8\ê¶ò/WØ éÒìR|’.Жîp¢ïÔjÊJÜþ->§ó0Þ7çl#„zKV$h„C&d{Xßq"6úÖ)ÕWþ” gñJ¾’Ý$sÃ0, ”¢—#í Áz·þc$º?zÙÁjì „­Þ„Ô«áÊžš”D½­óLÇßm Žä «Áû" C›Ö)ðËKn£åù8ÓW‡ IÇ#dˆZ)‘…J ŸoÒ2¤®GhMàüaý€×®(a0!¤–ÎhUo©ù&?õMª¦ÛAuC¾UH ;­Ÿs~ò‚QÊù>=Üå(¬F’”\2ÑC§šÅb@âuαîo'\–b\×ÔÕT ô^xoám÷¦ÝvKo}"a¿·Þû©¢eæåø•:¶ò-¤Îµ¥ºU CBFˆ¤©NhÈÏ•ÿÙ.òàÞÆÙLjÕQä©ÍO¤fÁ¿°XZxò0ôUörÀ:«tÞ´ž úQ=mî¯9¡±ÊÁkÕgrŸb²`©³ÿ`gHæÔ<é¸ld1yâô ‚E'ŸÆñ]à ;8ó8pG}¦Y'þê˜Õ4D½2X¤ïÖÏ>õPÞïy‚´©³¶ XZŸ´}tîÁÓðizR´ãú£MzKì³ê/ Qéåi²Å=lSÆÎUü£˜b°¶ÎÊ/¤Ûšÿ˜O; ø½ìj>¡õ;6ó'dìT¤€h „Œ‰²ï@RÓy½eUúé›siRYµÍ¦¡šŒ i–u¶2óåN S)q|'‘Ø< N°3¿nØc›<ÄÏÒÐAåB’VÑœÆ-ºˆ (ÜŽc‹×ØÐu—ׂ£)‚Âòtê ˜ûuýªi®ú.ŒXe‘Aݶj=ˆpÈ,‘"a5ÕéÇgɽ÷úF#Ñ„èô°²·>îß-Áà†\°ƒñ nƒpör§2NFhŽïÜÒCó]˜ÎO¸•–ÛÚ!~·}É$2U¡“b rƒ˜ið¿Q:KïQF™œ{^ˆ´>K™£Fƒã•

؆ƒQGaoƒK\›ÜyôS¢H¯Ò>òã䊠éÉ!u}‡l¨ÐΠ}×»XN…¼Á²bÃñÌ[@ØD F­12`‡ïw3¦êEªm~ܼæÛ!ŠŒ'ƒ«L¦Ìas00{^Ý鼯*öS=Ø^Mfn"Çá ‚æ®dOC4ïœÔš/õ8%'«˜}:'d#d`pó;¹Cé„Ö»UMØÎu:‘æW-#˜ª ¦LåiÃîÄò0Kl ûAãë›jÈé45FÉOñBÊPÞŒã¤×¢À³å»©þ¥‰;N¦ÄèO™Ó`b¨qH¬‘fª· ¢£Ó’M0ï.a˜ÚvVs¢Õ)‘ö"M¢Æ¿tÎca ÜnmJÌ Û’È9H×4ìÀΩÂ;oÎ[ž¢;n_ÇÜi}àòZ†àrÚm®s|}±ÀÒ}E=W4êÛ{}7<ÉâimHž³Xm\0ÎplÚh‘F}CL7Rw¬C‰Í22 âU™ˆoV7%aç\ÒM·‹ªpÞÿæ?†Šˆ¿ëŒ wšõQÙÒF;{?šýQF˜lÔ]Óx°0¯¥™Øe)wªIÞ/Â{ÙͱS‹sOMéôs=‰}ãˆ`™AzÚÛæ}âhôÆÃ õ%¬H¼Ûz˜æ¡Õ¬8ád„f.W$‘ù£EZçä¹ø ÒÿdL2¨A ÊäPï L°šS5½í¬s;Aë6ŒVú³Ô¡üy‚Ü—5n8†`vsžœ{†<£MÁ /ú1 (€ˆ1Š—Û&\?9éõ*)™‘ê#¬¹ÉmÅM 5e'øÔs:3|~'‰œr÷¹EÒÌüMÓ‡B»&ÜrçþÍ])íI['ó ÔÓòSŸìب¼ˆ’5ÃvÚžtÀb¤HÓA‡ÆP:ÂÏÂ!XècY¹n?¦ÐLx˜Ëƒÿ«ƒ&2° ‚9Û€×E‘däæÀ§?'luÚ7Ö],Í:¡¿¢áLš±SmüÉ»ÈÍÖd+Õvœ¦ÚÈŸ–q;¬;iÚf-–‰”)=VCŒº'Lþð+ªXÓØ°‹•R ¾f®Ž3"¨ZŽýÌÀ}˜dÚŠ¤´foDNؽ:¹ŠâšËÍ¢ü£fñØ%¥žüõãŠ8Ç3SN4f6×h³sy„^`@OŠŸ\`B5í‡ë+ÞØš¯ó1:ŽìÔ8+sǺ“XX·W"öí8x?U6G8Šzt„V+HÛF•Î+ãÉž½‘DÈÈ·á·äþlb¸-¥Cx­[jŽÃqí_ˆˆŠž*é9=c²9;Ë.0Á€É,()&°,dÝÐ[&Šÿ':¯2¸–@‚]Ç®CŽXHSü3rkä´Ýc|oÆŠ­ÂI™ÖHÀUÅ$o£óT+1ëóYãá™Õ·H·iæb†Žu&OÇÐrÇØÆÅõ#š1Ÿañ„U;uÈÎæ4³åãù¸ß,›0יּ;sîIrýD© íéì3dZ„fjÉ|aIÝðš‡K¸nNg]»à=8÷(Ù;rþƒN+¥¢DÞä'¢ñË Þ:Žæv5ŽXÙöüµ:NÙõòáÉënÝÞ¿írÚ!_;Q9má”3Sdšt2c8r¦â“3aÑrž‹i§"«•P÷WÍгóÄï4e;kž!ôÌdñ+¿ñåØ%Ÿ÷/{›ònƒÒ܇YMšHÙv¿þéþߪÇ­ ÌR噹æîÇž¾=ª"1I¢P÷eƒ£ÁlWDŒðÊìÉNwåefáø¶)I=,œ îŠÂtï5ö_1šô˜¦VMj˜‘Ê#ÓØ9—%îmšËÔtª{íµrbÆaÿæ?TÌÈ'û~QøŽ>ÓwqÎõVyLª÷ïg½Ð¸sÕ¾J;6õ¿R"4ÙGÈÈÈË1óÎùÅÊüDØM?ÒÒ!àçabãjŠìâ4 ò–ë‹è«T]¸ÂF.†`|ÈÚ‘5k‡.WÖ¨¾é:Ðà.ÈìÁFï²³˜o£HO ©±d'›®¿ûµë¯ºª¹]ËŽH žcë\ºU¹Ìè!ÌÔÛ¹í “ö)?#Åg’•/‹™ŒøûA>â™éP%d'އ2<ïjVž­\ŠAÉß^JýšÖÞÅﲃYŽ[¶ò„‡Soò—ïgàöwÞÝߺÓÐöOã}´‹ÂÄé[yšzÌN°Õ‘}VKÉç}ðѾŸY.Ð}üo ôbaÚÆç9’ $¨;d-Ý4œ¤š;S|6tž2äæH"w²v zQã÷(Ž«cèÁ¼6ã³ÞIrgöÍ8Ëo’»´’0ªSø¢à:»n´¿¸{q2…yQðÅ2ÇqoÀÞì;Å”0H´±šl+^U{Ÿï×ËÔOìeê×î—©züdzûöü×o†ûà̤ZK®)]wàùŒ"²rMÅúš6•F“=û ü~ŠŸÜÏÉÇÏqz i¯&›Âš÷ø"÷E®9Å®BÖÂmry·¯­~1ÊSIó}¦àdÏ5›ÊImá¬Ñ›òUứêyR]˜çú¬j.´¢V‹w’‹ØnC¾Š\Kœ7lýZzØm•‘P¹ü•„€ZëÅœT²~ËÚì×ä÷g÷ô¿í t­¿Ih­-¾·‚0Åï<#ÁNF€ÿàZ‰³ úosľœ6Vå¬öï÷ WÚ UZxìt>VI"µDÔÑjÎ"Ã/M—S3]Kd»ªÏuijô„ÄÝÉ«·üMâÆKÄéÀp:°·ý»Úð@Âÿô¶v(2€‹qÕžÃã‹k=†®R7õtQo€l.}VÉéyÀ¨Æ¼jŸ¿WÅPÑPåßÐ䢨’ëþŽÅ?ª8xOLTŒ VeG9K$ޝœ}s){7é™!¸ÂÞ!¸·ä¸øF×!Ri%²êR‹€s¼ :H~:‡W.¶ñ¤ìÎÝßëA(âý…È*¥úõâ/‡*%¾Á-Øÿì÷ÈR‚€ÄòÂe¯‡[;ïCšOªš…ü¢„µ¯T7’ü Ú.ªFeíÀÈBb5ÆÈk5{dÏ®=$(nb¤…È"›Ü#sB赜§«ü×[¡Gºc…+^bÇ@CEz8¿xà ó’klBiº ¹Z ·ƒr~¯HNb#A½ÖÈ’wd9Iæ¹bпíß§'ñê DÆ”Óç´=üpj"wQF ‡°ª/²‹ï/V7 𗼃Å(½FF¯’²pÛö8„Tœ0HçõƒïÜg`ªôÀß’±4 QQwˈì÷Ý!#!Ãy WþVò9Ÿ#t¢<ÒÝT^ƈ+{¯ØldFÊαZÑßû3KàqHù°šÊ€•J¦øàÙ‘kè€Wç*2Ç}%¡± Â÷=ÁÀ´çöÅENÓ>ãjíØ‰Wkßo®f÷k¾óïñknTißxYžŠ¿dK-Ùä)‹Œ7C„ÕäÈv¾ƒÕ21ä–ä÷`è`5n‡Hæ”äm8MìÉfcÈÁ62qŒp“ìš>Rk¬\ÓG¾ŒÜrÐ)íPhoùè´[‰´±‘9Èsý~Cä"ãhœ¢ò0~HsZbZ‰Ë VSÝ,õìoEHËpf¨•ÀuFÕ^Ñ”iH|ú\ƒBwúרXô°›Z›|FÀh·)¼È¶G£é¢­þ ÃOG¯ýõÖs‘…á<Š:FTp´bNnr«ûü¡ºNЄŠ>r4ä&n"œüѨnòÜ)7N‘óyN?[le< `SW\¹µßVŠuŸ«çl×ç…¯DÞÈëž¡Bæ„ïzážøÂPGZÕD¦„ŒüMȾ{qSE§žÚ,ÿ/œÀ$ç®ê …®MOHsíÝžOgÃ%dõ⎮¢FSUoçH†v$çÎR°õ·½µ×hoíÊeqªßï¬<=ÇïT «úí»¬5;H¨ûÏ]ήýT ºoÆ6‘‘4!wå½2ùª…äÁ$`¤“áo?é7?Udm»ø”ò8ž^n6wÓt]6êUŒ7ƒ XÊÓS0•ÞÚÍ;ƒ§±·°a÷†ÖûÓy Ïý±lz²ûÓù Z)¹w_–¬–ÛÝ €Ä¹w·0è¦÷ #‹ˆmCa7F<®»Í7ÖŒ 9ûÖo)œ†Ÿvøï/ÔqŽÑ#Ç@Z‚Üctˆ„}QWõ˜ÿ[7wÑþþ>7Ÿl²Ï-„›ØâÉzöó·yâº"£bo5NB §3…¹‚åkDâ®Â†?_-Pº‘Ž / Âd\Ç¢•p<Œ2d@’©^}*χã#odXÍ ÷I=‚öH ¿‚íHÛ:w ²ÛyD½m€YŒÄþ …Þh*)º0Ý¡ªò%äáªò äq©ƒö§WpÍ6 0eå‘ã€äÈͽJs‡z§YjÈ6ÍͶ\9à”åöž(¯³ãÅÉÀé 8Æpã@·ë»¸œjöyu&Õëîú=’ä™&‰ÁÖéQßóÀaªkžD\¡t¦ßëHM585ݺ(®¦Ý8ºÜ>ÞÖ—åT Ô(ýÕ¸A‘ÖmÑIqE, b&¹õ}=ü3›¬ h{#˜x³O‚S²[IÍfv«1²äùPŸ^ƒMW¿«4x}žnrU9¥=Àû¬À{ÛæÄÏ3wâí/¹c@SZ 5{ÃMêóq÷« º×ß2èC™5¹gƒ µ1ƒ‰M2«ͬõ¼훣ü6² ÞMmðÏçõaC^Ÿ§«ª´nÒ 2>%:ܧøô  Ÿ`æêã)Ç»Ìø¾$½Š•×ïPe¶rjtmôÔ¨òZŒyÎÍ*Nÿ…¿%ïÞ±é†e¹Õæ;h¶pJÔ[x˜mï&{XÍO.Ï6nÒ{$b â_—, ð´ŸÎAá˜Ýkœ/}X3Z£¸q|—톚Î'`¥¥ 9< s>Áì:5Á3æ0R ˜{ ]pŽÇÖt‘rŒ¸5 [ØÓˆé ú¨R$yþpE,ÌIŠäzžÓã­ †ÏyE,pì§G,pŸÖ%M2/ùí2ƒÁò¶›žéž¼cTiW-Q³VÙ¯1^¾èž˜¨æû}ùY®ß‘EËç`ÃA[v°y$²\Í‘’ËÇÚ.)±?Hg%*¦–ïq|kâ@ÓÉÊB Pïå»<¹¨ïcѯwçuïÛÖPc_M·Î„ D;àþHFþ¥ÛRõÍ˞Ђ§­¬Çב¡¾`£)À±—ÏmP” NÏ5ò)Ž$u Q4]þåWL]ŠÝîï´AÀçÊA±cB‘ôüû‹x¤MÈKÿv,•ÏW]â— E/¶j^€g/_‰Ž±æ„HXH­~áý KÖÿ‚çÕkfëìúL+Öð>Òœ¾žÛVxŒ”t€b²ÿʰ¤._pœ°ñiD> Öñ§bJ% t¿B#yÏv\båsm8˜yù8­2=$*˜ ì«I|¾:´?(¾—¯YŒQù¸c#ƒÐ³Hó×që·ž[¾m‹åkÁ¶X¾þ¢¶~H‡¨ äË×C˜éëÂNöê3ÐÅׯßLñ†ñqý;3ŒKõú`L¬ºB:+øEª¾`I¡:¬ŠJ½|£„xQÃÂÞ$Æò`#£‹ÀŽóÚïÇJ ¾q¹B¦n\ œX=S¿zÄÁòÍhé©ÊÛ|üf$$È£÷ÍvïˆÈÙt—–³—ï¶œs06çž»n¾óÎøö˜H€üið'4éÞ¿xþ¶¢l릤Š}¼OæÍlíÈ^àPANk” I[£à œ›L”§„ñN+°Î1‡Šè5ª¶ÿ…2È•—Rt¨¨Ú\ˆ4ïFÃÐÛ®Çóç²ìyŸ„t"ÙH@åë{æû$^dPŽÞÆ_Ò*‰ü›ð%-Çä„Ï1KÊ¿ ß„ª~ÙJ*ð%Öq*6³‰U´K¹bê/ßVIåýãQ• aãQ,y—´Å½|Ú›3Ö.Ä·ÎWã#GW6ÆKb&éjT(ý’ªY¶Kb!¢'`¶2 - Ö9NåR5W#©\ªîj$•;0mP9×׿j\û·Ø¨D¹ŽgÄK‹#7nRÜ¢3ÎKK ”8ÉÆËØŒE‹£.W™P¦¦ƒ¶’ZŠÏå‡d“KbeëÈ9TõÊ[›@‡"笼g~dÃcë8îèŒ_§b¶,|¶{^XuÙ0ÚEKTÅJêqpÐû‘X¾Ãˆé()†òeT-D F#h°¼X~:D\什{—4Nloꫤa{WíÕ‘êHGÕIôªŽÞMŽë|ôy8í|þ4ûúw Y$MÝî ³~ÛÁ$¿‚Ö÷Ê÷™ül¹laø(·èx0I¦Ç¥¸ißd…¢@Õ_ч9Ê?‹³*ȾWrˆ -@™ÀÅÏxLbß™¸ÉTã ÷ýxn0 Ao/9y(S$…ùƒŽÿ¤°RXX¼(íVïç;3ÚÂÈ]3/9#w³äS³„“ÉFMMãúY %oƖϟȾ’™B×ìRëc1’HP÷%'~©Ç…€ïãÑžó´ˆ]"%ÐÈ̼YÜzO¨]ZÜöKfö ô¥ðÛÙßfÀ£búsÉn‹Re‘ÆÓBh÷1„ÙžÆÏ’!ÍüÅá¥jrTEðIb·w0%µ\ãš«r»½ ß«iúZ˜ãmlÅc¸F6Óõx¿h5>»›½ä¨kd°d#˜ÓÒp‘>ñ2%³‚ØžÈ šYbðŠ.©¢ØQ±=®¶»v+p—|9»çgªNnÇ Ï¿ú¦‘›«e5Ý(äš›Ñ<5l†àºä6š[w: ‰8刜Ú盿{}Gÿ{ÖeÖcdŽÆ2Œ.¿. ÛÐí{²ìüH°Õ„ªFv†‘YkT³+egÀ©—<\Qˬé6Œ]2yÿã­z€ |(ZÉ,W味…²í¦¢(ÞýB ø9º»…Di:AèÓ,Âën)„fŸè1“ž{\ͤzÙ[Ò>jòYG‘,¨ZTùÒC  %• EÚKDt-) ç«b­y6©®|QU£EP D ŠŽL[1Ò.§ukU½Ï™D ^ ešÅJdKZÄ&ÅIâCÀcwÿ¨Ú’ ÝQß`íRÒ›•@< ‡ÖºÍIÁŸko.!5j–¼ÝèíÕiº» 8ßÍ^·YE¡×Q»Pðœ.–OÓÿ|ñþÌ€b´ÏÒ “GŒÅ(;ň‘–¢……IZ€ /å/'l\«YiV€O$õ€g—RãõRcÜßO€Æ.…XÕøUö¿” o”Â>T_IH³W.3­iyjSJqǼç<ËšÌBê‚U_ŠuÑÒXâÔ¥°¶GôC¨<¦V’BE½mg6¼G.,Ä­æÈFÛRŽÎâ– \.,{ÐJ N…nF]´ u‹Ôe[1·MŒQò­ÔòüÁúÛýyÍ8äÙx½o òª_Ĉ¥;ÀÙÞ†Ó_ðÔáÃX7Lfý£¾ ò·â´‡-8EìHì/'Ù°Ú¥ŒÏ¨c!„°0ÇÁjsBG‰Ô±0^tgöˆO]çhDÍ÷+:­l„ /Ñ1á¯`µ¬-òí©J\æ£NfãÖ˜¼ò íò€¶ @Û¢ÊogŽâA§“çé`›×Ѻգ^=”ˆíRÝN¼wAÚ¾GÃçÇJú·£|Î> ¢ùá·±A²ü2ÑŠ mCþ<7®Np”êŠ Þ«!w£\Q=âªql‚‰¼Â]òísQ‘Á}ÒÃjd ÿåØŸ¸Õÿ^Mñþ`<%†üH™(V³Àê[ªÄÕHG¸á~Š:5”س–j> Ðæ¥z†R[ŽÄ)Ša½Á‹o±-~ó0f½1Xøƒ"‚6P¦\Ð6¡iö7¼{ÒiÀ½4Y{pï–÷Þö C@«ûyÿ.ÏbßXU¸pK ¨ ž>\?®öo gW¿0­ÍBKÕHØCi«³@ÃÓ§—pÏíÛÃRG\{nða6Zˆ»¡Õ,Ü ½r·Få¤lx7¡²ŒBÁ¥ÎèiÞ KÿœûëßF^è½ãœüÍÔ /Y ¹Ì@^]Ýнˆ7×4yH6¡Œà- žË¦=#þŽ?^À”¯FÂhîMoA9UÛƒM ôtð>æQ°œ%áÙ¢a•Oq8†ºö·Ä„åx0Þ·¾Øn‡@2¢´w9ïóìö‹zF‰M•3b¸[DfÒ5µß°¯ÑšÀÊߎñ.ÂÔäÅÇOÙª˜ÁMÌH¥ÈÖGF$Swˆ+ôo•²ïÓаÙ:Ù®4ཋD‡8üûEÜÇùúNï0åEÜÇp}9*LØý* q_8…ÑRŸß¿º>.5@ î­c3wì"ƒAƒe0ð1È+‰êø¶É~í·Í[$ºžå„Ùò6 quˆ/¬ %)â±S”0¥…‚m+ÀzÓh¸û?"1âŒ4žèžSÇ"½-hQ4.楯À~qÐâë;•6­L,?H®à'?H‘~LB©Å&rY¸ÍŠ|x+5L–y<(ÛDcFùÓA­4í„.#™}¼·¢—¾ö€½‹hŽ3œóo9D…àêÇàÇ ëâN€ÅWCto‘yM·›}ЏŒ$sòšä@€½Ãt©u¸ŒDMÖ1ƒký®-Âr Ûà rzÛKQÏÇu>°ßÅÁÞ±”¥©ÖÜy9`ov“ç‹¡Ü÷Us‹RÅ{L~ˆ1ZͰ 1T»PVÔ`ÃBl÷޼YÄ‘K‘·«´èäà†jîäF{}ߟGª^ÐãõØÀÝß?¹Ü,xq¼wi9†ðZ.¼waq¿ƒ÷æV×kÙ¬¦ê£ï¥A-·@ƒÀײééCá¬Wÿa´²ÎÓ½¡¦å@'x̃• àÝx(6g+â/ˆf›©l‡|·h$ë½c‰ýxôXXUÊ‹ïÞz`£QÎõŒKaÌ}=Ü„Í5 –{h'»›Ã–+ùUs€÷^ÍÐÎv÷ ±’Ø Âè6#ž;:ëòkŠ)À‰¯Æk‚ ÍèAdÙI7Pt0J8ìžïƽQcÿ@qFµÅhóÐ4d:³Ê+Ÿ$žkdrõÜ!¤ºŒˆÃ¡§uâÏ›]v•Ù²…×»Ô7ø›s0r£=q¸4«¡@ð7Òo´Hš‰îÞ¤y´3y}Ù­×ãçÊá§{ovR˜qFÁÐCíTƒ9D¬¨™Jqx™’MX‚o²9ºJ³OæB±¸;ÌeóêÁ{ÅSÖÐ<¶“áÕB+šGcÄóYmnøâƒ2È7 Àéeß(ƒ…ï†ÉRë)Á© .wâ•1a  #ä$,ZEœ¸¸_)ù(ʘñ~[ñ€NSFýѧªfš2è! ÎçÐøj|À ¶Aá°ÈýŽÅuY¥ÐM–Ü÷h|5å¦$Gö %œQͨ™q{ý|¯h¸E8/óóàÍ’mvc‚ög­ÅWãúf g3;A–œÉm@Ûž¸JÀ´WCÙ03ƒÙqÞÃû-d2—ÈúƒBÎn¦¤½LÏ%RE ÌËL5ØÛËL… å Äoø6…ÏýwS¥o@qwÆp@ÈWs%M0E¨NÓ=å­…ðeç|¼bT?hYž®~кwÁÄ·iåÓëiå‹C^"lmCÅI³û.(¼~†”¡¹ÍšµšÅм‡fU®±*fMÆæªl豳͜8OvÔn™ì?\ýBgcÜÅÎôQÔäy‰aUdò½G]S10foÛɄ巳* ¥Ì¨pM¾ÃN2~{Äýžþ·#äÕžC5ÂÅ+ äõsÐçë{Ìžpɤ‘N™·*^?s PL}‚êÇú“žaJdIMx\áÐðêÑ}á ŒyM—t\?6Ò˜o²â“"‚Âc J(áSi³ó N¨¿Uùöø·‰Œ vòD§/à ÀóýÑÌ£UÀçkr‡9Y@Íî0¯ˆ®ù³$ I!ê‘oh䟾§ÌAû¤¡«Ï_Ìj¤šŠ ä5ÓZ ½æÏå«báBŒ·yHZEµñÕØDÀVÍêô¨t‰ŠGtÑiœ*ëT<Ï#¬TÞ¥¨PYi<ºm+@ä·|Ôùj`ºª@¬× EÎ%”ƒ¨BQªE~Û7.…MëÕ¨(Tyͱ äØÛõ8òSFù@óŠzã§™}Ò´¿¥¼N• 9qn ÁZ¯Ü·ˆÈ/`ùjŒ…v^³² ÏkvÄ|ÍÑÏ Ã!Í®„‹?¸RO–+õÌ7×`Qì— ©7³È±lëØuèkVêW^Åȹ* U|5ŽFè†÷¯Ž×l–«õ1ZÔ*Ðó5›Ç\©ÕÌÙ8U…* ÉP•%z¤¡{oÈ#¬æ5K¸R“ÐA­¶ÑùZ¡¹¬ÆØÐãhò]§f+ÞWa ¯MîÔÂA"ØøšŸüé°0ìd¬Ø·5{xka.¯§G7êOü°è”ÁãéÁvßkŒªˆT©ÙÒVU`ÀWó³Ú±;½xÕ4;nS )QÍP0òÓÙÁæ²üi4AeÉï‡òk Qß7cÔY‹7Ãx_|Ð@òP²([`.a ¿2±’’j8º6°¢*øjª­½–‚h|ùj4;yýeRQ*Ïq,›ïóµò‰Jλè·?`óZÌhUC_ß _3Q,*·#_‹GåRÌn´B(ŃF«p­F‘*Ì·[ãóuGÍÊ|ý˜"MRŠ{F4*ÄʼØý*µÐ=uÀAXíyà…ÀŽ Àz=lñ>-¶IÊR£åµ\F+øþj‰E˜´µÄt×ûSQ軺ÜÃ5¦N¯t¯fJT²ÕÕ¬Ç(sÔ»R<·;)Áq¸Ù^K1L…;©–íï üxÏ¿È ¢²“ö1¤{@÷ð›Ã‘Ò3)õ»e¿ €ùú‘²Ÿ–óŽÉ›&£Í.@xsÙ­0Ïk$/E+[µÄ˜×RUÖÓ@â`[GRöuüê¶ÏUã©àC­%ƺ^†*š7j‰Êðæµˆ/bΫnT„)Öb•™já³î1¿c¨«¬VÙÍG¨xôñlªÆÆã™¦Uܤ¡ž’ßG¹‹‰ç*0Û«1Y%Ã+Èë‘ÕÇ_^ªŽAaµÆxÝZ=^·ÖÇxU_ãàεz¼n–¸V×­pÿ×^޶'Æïƒdû5†ëÖêáºõ”ßJÁ"…ûç{^q`Ȇ§î#NɤÑäxÇ®“)¸1d¤ÖX ¶"þ”¥fÑmÒh+[x¯anbe5x mÉ>Šùeku¿àˆk¯¼á¼[‘H8s?ã…Žçê­N札â{†à°S‹v¿ ⫱=Œ÷¯XÓø¼Ãç©mšF~÷OóÅU¡£8 3*ªŒ¯Æ½ûZßyŸ/¿´0Ö|ÚÎL­Ž±#ªXÜU}5š“‡ùþ¢œÁâ 1íŒO¿á«ˆóÕP‘CìxËKR Q%_ ðWÊõ*'åz0[€5"ÌEû‚‚¿¦Ê)F“ݘ´%¸—Ép^QE\Ün4ÜâM¢ŠDøj|~á`—¢ó &%Ñû± 7uÛ`R¥ø­R#k™4ëWo¦¸@˜¿r&ÖCõBâ€õ*ÕýªŠÓû3–¿ÿEÙ@¥¡BVˆ ¬Â=ã:k†oš{± ,Ü/b¸þ_E\,¸°Š ÒêÖ‘ײy’iù­±¤xE«ìò õRõ÷÷WlCàl½,ö@W ̉”‘QŸY4ÍÚ7!AÂÀ—½nÞÙ$¿9Æ¡g yƒwÓv¦Äѱ;8)epMãÁ´³M¸s+ú¼Õ"#=@«¹ðYDð$Hïµ}Vƾ"YJm{ÓÔ2täßÄP ôzG^Aq€T›;‡ÔÓ‰'ÌYt ŒÀ–_ÜE0Îõ,·y +2V¯%^‚«ZK¼[^›{>(mtb‡ºg ìNÀ*ÜcUK‰¯?üá2£&-Ý›ŒIVIK+k7Ç÷µéócÑØ2bEÉ­BBé-nRR­bèóÚ8^êFhç`nîwÒ|”Ñœ„:㫱̟¶Ô`ÊeÄ…VÇ™WÒÊÆšN8ðÚš/èaíä²â´à¬“ËŠësë™t‰¤‹e*æJjþ+”Ž0åñ8åÕø(‰´~¹¶!·uù%@5U<|ÍSñ]ó0Ò5s˜sI?õ¥ª3]K’¥7òNêXßç±Nm#„›>ù›†vv°±1ÓŒð3$0…æ>ÀÇW£j–ÿ°N^ÛS§ƒZ1£ªj#é´+C>Ê5²Ó56J7A˜ÆÖHÈcm'5³wŠßZ<ª¬µÿ|4;ã®ú2KOutyEn(Iè äŽÚ¿HPúaG?:6\.S°¢ƒ/' ãÑÃÂÒía]ÝåHpk!8·r0‰ØÏ=`+Šu×î;Î¥®U¸=Úx…'Ȧµ[Aˆ $úúN“rÔ V´« g[MD+ôU ÌWsŒÍ_€ì®)¬ÅC »_$=À˜¯&¹©+ÇÕÎ*!çæP zÑ9Çì–¤ÂdQOeqù¹l:¢>.ó Øq—rÕöàQ–~lBxÛ¬3• %•ÎÅëñ/ûÍŸ²íŸ¹H±ýkú`Ç«QýŒRQÄ!½PuLyeÐPgÒ\õ(wKš[g¯Sžø²˜–Í‚° ;cÙ·Ùó˜Uc~€J¹ºî˜R°ö(ìã!MíÍR ÖÞÛ³D›OìÞ)­cǃ®€±{ÛÅC0ö¼ê–‹¤B²ª½=âÏ(R{¿2AuJÝÏë¸G/±=¢7w”ÜüY·?jÛßh|Wuçýæ±Ço_ùDì#?Ãùõ2eÓü¬(ò ”{íf–ú‚ÊΧ—¦‚Iôáù×—yf«äg§ÎM€O€Ý›Üç%à}:Ñï“>5#¯>Ž9ãÚž *Q{äZ×Xöñ»Ú_EÄ"žj¤¤…Ô“ÊB^¡›U@ÈþˆRÆýB“% Cþó ˆ8šsüÎÒ[ý.žŽa^Šà¨õ];ëÑ™¤ç_Õn+ N«±ÉY, Ø«±$^”£²¢øí·€¾9®FNˆzꊓ'à´SXô‡Áæ1ˆŽY…‘W@Ä…ø\ýÌÀ¯0óÕt3Ú«ƒWL|5î±ZìƒìÞsZŽU>ê %`aÖQ¬°ûS¾ì\ʱ­ï$,€ðÔó< <G÷7)a˜D­¨O¥ZQ‡[¥4sÈSVÃR×i\ÏD²‰à5z`ÃMRtƒe:r,Æ c¥H3R xùjÈÆP˜¼¾%^«J€/¨^1l„"Ѭ9„çh¥G-¹˜Æhjëôçã™MKý ¯Q7_áÈ”>ÃõxgeZêÈãWøýaÛ€ÖU¯&^7¯ZM¼ËZ‡U¬Ë×±ÉÞIú0EBÈ7ég±ïgÂ!—W‡×¡Õ9,b§’±uü•ê#†f¸æ 4y|ý‡ëû°–Ûì©™j+ê…_©r.\Kœ/ˆ"WMq­¤©‚?kŠ?®,Ö÷¼Quð}U±3Z ÕSSœT 1hcz8 ²/Ô±gx9c<@eQpOq@Mèà7€¯ÃÓ²rnLF^Qc¼óc—ÏOwXaVÖÈfêöSÜšø6—¡Èxу@ëÕh1…ö;ï å“é øòÕp›^çwç3¤M’¹OïÕ…Ý2ÝK„ÝÅÅwåzÀã<'üºÓvxAè  x)$d¼Ýý²§+ÄŽ“¸J{‘ï<¬VÌ/¸˜Xæ­Wb¥¦‡]b¾RbÒëôÔ†Z=¦7%übº\ßL¥( GŠçW¬ûi™+pæ«Ñ ¶µýjÛ#®ÎÂh8K›N}MSBJvKÏ%ùÔãø cÅÄ1uFÑ@ñÕøžž£{ iz`ù`HJäW‚Ç/ñlv@Iñ›Ñ\>/«i× "!-Á2[¤Ê•wŽA|9en®q¬ 3樽˺*˜‰d*€âõ-/®áÈ‘ªosâä>\£ì^çS[çB¦’¨mg(€áuF®Á"uV”î¦Çô¾?(ù´Â÷åË×wñ­Þ]ˆcµp¸Î1`Ó]ãdyý™ÍùÝÑg{5Îd,+†Ï¨ívjä3“ܸéûe<H|5Þ9n…m°9¶D{Û¨ÀýËwÁ6Ðy*9VO,ùáà½s„8ëny»ù‹D^­y' È÷+£,z‚2Þ«Ñà̇ú¤n•Ï|b¹  €× ÛOFõSiXpH\9¼tX%™7ê¡'‰7§'¿ŽÓØa »J¾~L‡ÇÿÒ+Ö0­ã…^u7yÌû¢5Æi ÎåÛæI<&ñ^aÉ=¬Iˆü.4S1 6w·å6ƈ#_ð ã$ùjl?kº¯’Žr,ŸY¢4ÉPL!@‚¯æ©913ߟ@§§¿5<°\¾ª“[xQ±÷§ÄîæVrY¾áƒðˆVúÀî1õÁ[†r´#˜Ù\q²ñáW?…Ï{Å£©]NÊ)0¾é¤|bî<Òd9JtÂW¬¬ãåæVD#îΛ즸;op1„송¬ïÚ¢A}¼Œ¨,Ä_%¼Ô€@ÉW£ °Ÿ7º²î¯J©Ð CŠ–øyL1”øj|à:3˜1æ²£îµy_Œ7ë¾;°yسŽ^öCàhuù"4£ž¬¸½£ž[2Û“kFàÂŃ«¼}ç¨Ð†ãbèÃÐâiz?#rM6!.D ¡Ë§v(Vâë§ÔäW%\¾é#7Ù¾ÿÀв<Ðûú˜Ö}ƒÄ¬x›D<¸ äV>óp³ÄŽC‘ô}¯x'):*5È%iì]·Q"}ǸŸ$–ùÀÇ%™£B€M—äŽ ä ©poSPD'=~)H\íPZ›ÄeM((qIf‡ ÄW£LÁÕ#)EW¤Ç%@:Kòd†”¶†yªü6¢â’r¾¥¯õý -£ & áAw%åvlŒï ÷*Ο7̘Z¡°rI¢!é†JE}O€ûF»Y©>7 [€ ¿ Bü…4öx9€ðqçé˜Ôk£t ðQ9¯"¾1”i â«1«»E´‰Ú6_…Âà’ªSåÇ=Ìk·î•ž=3ž¨Õ豂 ૱›8­d‚ å’ŒY ð’œY¬’ܶAð)2ªªû^,¬‘̸¤f×ÿ:NÆa¦\S®‘5Wˆg7†- 0á’45ÅL°ëØ–¢Ô/À|[*‹kƒ ^!Ç„ 0ᢘpA‘Lø6+=P$Iä%âcÕ–%,Z+já—š&À‘¯f—“¤qö… žc}ÿ]ã\Ý.BHtñú ãŽQ&ˆøjŒu¾Õ:IšÅ) üÝ”|)œT\YÎÀA²Éƒ£èÓ3Ñ,ÊJàWV{ Š ~m)•±WÓãýxÀ7¸aV³EøO#Ê®ó WAå—)IXVü’ªѸx0S·šBXò‰:ÒU6ƒJ˜á€N”L„Žß’¯ºè4îŒàk­K¶°(ÒÜ_ëðºâ‚ºâ¢uÅue0FòðÆCñXÊNPNÔ´øbÆ—Tª¹³ÖoYÓûÉ8ݧ °Ó«ÑJ)}¼¡Ë’µæaL°¥O…šÝ‹boð-A%_Éîµ`&娓 pá«ñy¿É…„tÉÅpòë»§'gHZ‰‹´0—§>¢(’ìæ¨¦7D.~ÉfŽ «åw¾‘]O\g{*°é¹Ï2É'WóÒ ’ë/çKÖ4;êøåp“µKí~ÂF3Ä 2éÉ,ªF•dJ×:7ð; ¨%+ ƒËñ.ZUÜep@ÄWC1psÉVØOPãZ²ö@óåä«â2‡²žÛ­s«™IAx¦èþ©‘¾šPõT2ªNåfsKàS9xˆŒV†"Ž‹?uî­#SË mû¼XZÜ#Z‘«rÁÀ{†aÀÈ®kÀ}, \r2—©ä@ýº~£œjSˆïŒ€EËk§ »Wã+p`Œ<‡ˆªéZã£qü,÷ .áã÷ý&3ÓŒÖrPÛOÀ9r(â!¬,~é@Š à/è9ÙuÀ! Y~Ç·i…UÅ[zî?q z¹uT/ѹ$`ø—éYP‚\PRܳœßf.²UbaÄögQg´ø€XD…µ`º\`pVBþ¬~îç;»n¶xalh50öçn*)¡æ†TQ€ ÀàR¬¸Ÿ¸Ÿ8w,˜ã)).'aÊScži»¯d¨šYGµó‰O÷ðqAî)s)©ÙuþàAQaÆ;‰ÅPn)®k L¹Ga4¯¢,„/Rµc-XÝ6Üï<5j’[âɇæþHax_A†+$EÓÉÌZe*郫lEå¤;Ž2hÖ­¢IDhÆ*±zª#JU·7S Ü1áßðï»? ƒR-ZJ`0^M,¯»Éuç+—Hâ%€·IýFØE Á¦âûÑÙý©†(¼¦¸àõ¥Òó-°ÿH5Ï· />_´èÑVîªIIM»šÔ%ŠÐ,çÚEÛzÊZþ5ðŒÎFK¥ŒÝÀ‡¯Æ&˜g‡k¤zì(ÂèäsgŽN..Ayð'‘ª.€ïÉ}ݬ{Ñ\ÜOª* ^uÅt9IWG¦á7Ëîm±£à«ˆ“ZÎüÓœwÔ…@•\ôÎz° Ú¯ŽT9 Õ×_Å“µæÎråÞ O}^f«jfªBX‘d„äEÞÉ€—*^g”1cQˆe)ãån#©Ú!À†Ë%d–˜µ—„v÷烇T:¿Y—Gªœˆ$A)s9õÄE«òZ€‹hŒñ“ªJî^ÍÎê>ïÌ…´Nñ1…”I"_,h/àk"Aoc$ù™ä“ßQ’™w ‘ä"ŸÕ5ùB‚‘ÈüNáÍ!÷÷ù{þ$iÖ»q¢¦½—íµ½ Pûh5ØárÊáèÔ1¿m¯qH"9”t^ßµQŸ¿ ôH«°Žk R¦ Ñ_åRCPÀ~‹„déÈðj̘ È’ ¢8:Ÿñ–åälrÍ2Ï‚ š§þî÷³‹5 k}Ⱦî ½EéáZáø$¥¶ÞA„ `ýï§~9|^"U-e:»Ùß­¾ý¹żVŸWhÂTé—“HD[—FÏ0h¯(ä¡qbaà —«ªß^ß-*yÖèT¨÷^7\Þõ2qÙŒç>‚¦ÞÿÙ€Ž)â_à câ¥Ä¨X¹J‰ïŒD‰“‡éW9Fõ[<“Õx¢¿O³Ú¡¸ˆÁ1DÚŒvz ÖEN–tŒ<T9YÒ±C>þ°W(&ØÊ‰SÝÆiGã ñ72CdWRÅÌFwÐ롞ÆÁW6Sf¹yGq°ñQÄŽîÛˆÔ8BÔ&RÂÎTGÃfåë¾û&a O²uhÎó\Žï-꽕Á<\æM7îó܆Ä|jNb¦ó}t¦:%(žclØ[Ī~Ë® ®ùŒŸ0ÀáþŸÆÐ(y ¢¸´+E jhi-Ô¾¯ NKS%˜>¤Õ˜$¬¸4†Ö $iVV—ƒó>+"šŸ˜ÈQZÊ&czN–r°‚­çùX‹Í™ ޝ¦©éc¼iîÔT”÷%‰2!‚]¿:Ú2gC/-[Ì,Íôi©13˜›–Z®1Ö<«bÈñ‡O£ºß]qÀ¡l¨€Š£¼auÂw t4óƒ ær¡¼¥qº¾?Ú,Ø‘æŽ :–Úã'¥ž!}É:øó2b‹V¢aF¡ëz ¿WSŽQºxæt~|ã-þ–îXÇó»J`@–K7CLÃzãäÃÀïÕÖû‰½Q#tF]`  4šž,}˜D¬wiÓÜÜ<uº®ª†¿@â3Oö(`àà}·ÙìLu»_0ó[}ôöüpꫯ³‰ûUsÊ5[lÒ³@_aÕÅWóLq9’ÊãøŒ•}HïÕx./ª)ˆ*1Ç¡IÀÑ‘ øj|8°{:“K ª˜¯&:&ñÛÎ&Û›ô(©SD‹ÏÌKL *$8]ãù™³'¢Þ„àîáœm¹äÒ±©–y°ûͬÿIv.'IaùtËÀ(˜éJ…åÒ=” Àu鱺†æm¤(=ø4”St¯Ì”{´^£ž8 !þ|<¨¥£“¿(7Ú`z+qqyÜÒ›ËòõÊÄ䆈’άÅ%X ~Xü5O­1Ç‘ TºGR/¾¾- u¡ÜD Š«†ƒ<_Ò-Á”œ.§ 8é…ð7‰~L÷«(r ÿ‹ …WVUéã·(ò—®v*&~M²Fs®T‰ÝÙÚµºG`ÊZ§îJ;6 ‚^ ©aâ„j.ßrŒ2°ÉÄìOèƒ~Ím¯é½ò1`I7¡‰%__=^7AþSëìÀ÷vÛ©tã×ø~{üÔÌÕ##j‚@‹ |–6 øÈï£Gß…üvºê9]ÿ¦&éùM .¨Ë&Žè®ï”û!! ^Ô-ô”²¤^·Îzÿ+#ñ¦p .EÖD—q˜ÇeÁ=¢Iÿ0—8£©è¿Ðþ?®º~ïOc ô‡£5Z—‘] GZ9éµÎÐ\~$ÿ0À¼‘Gƒþ 玄}w«±+DÃoëaÝâq’v^åp?ôÖ**¾ø6-x»ûS›Àѽu yðæ ×@ÌŒ ‹»ã­sO1pUÓûþpDØ»$.ÔG ÞŸ1?®æp› ¾˜Åo‹-¬[2biØŠ ‰ÒwÜŸ¬²½ˆ¿Œ-Ecu,\†%SįÆä–ö$õ®×ÍŒò +Ì$¨7¾}ׯŽ(AOGy2mu¾Õ"9˜…àzøžž6ÞxúóÐóþYÌâ°Ü¶0¹ŒnvR•¤Fw=5ô‡&t ÄWCÄueTó¸Nºû[ì|t°{aÇÒ‚â¤ý[½ÏñÍd„‰¨° õ€_!¼ûŠœwun`4eŒ“Cæž('C+Ó¥Æ,ÆÌ‘TL‚•ÄÔhÅ-1KÉ+hݺƒÔd’©Á²3 !½€Ì'o‚7†2ÑùÛd•‘gMæ§Î58ãpì6`lʤ÷ €ü ³¨L‹Æ% }wÕhæÅ<³ÉVºÁfkŒìsg¶e˜@,+%³è°w.›½mÓ»†f 9)e^QŽtáÌP’„k¸ÀórhÙ ¶ëÑçbi:LÜØâÅv€¸Ì]¡~^ß³§˜Æ¡jÙ)ÜoF3ðãâÕÄ%ÉE«‰ <rÖ$>‚Ó½=5¤f<àûnî± Ì“@€ØG‡on›¿cf–)òàï'ýÄåþ†ÿL‰ºïÔ¼S:à+³]ýû~çã[4ÎÁ§QùÑãºç›üÜÕ;a góõ—ǤòÁ(ÎGP7{DÇš™eö+5Á>0÷çÃÀFKÐââeÅ@sѲ⫘Ñî“ÛxìÚÀ•'øFR™ññLt½#{´¨¸gn€äùÚd—9vŽ˜!dB#ìþl_µÌa |øjL.@òÕL[ûO$Ëœ ÷QÌ€#—9Mò™óÂN¦ù CÎŽCBH—D„jYsäÿúnA뉤‡&û@4Ú"@¼aŽWS8ò<¿)tÛ¢ ¯‹¿™Þ¾èoŸ¥EÿÞÂ8ÛâíKžA‘‚õDX_®ºy9q²ê¦åİåÍˉkÕ×ÙõÍzH!Ù€ oŸæe2¿#µSK|¯ƒÇ•ÞP^|5Õ^&cs ÒÜ*¼<í 6WD¤ßöz° ¸ƒ·3 ³ J;åÄÁ³;ÏðÝZrÓCÒ 5ÆWS¬ÓµžÀÐf! £o‰Ga£ÁWÑ>OÃèú>9I ,5cY‡~eXk¨ÿ·ÿ­²v±G¾ªÉ=øÓÀã«ñI¬PéAÏî%fÁÐIo·Ï‡–ˆÉª¼Ê«Ñzâ¨]–-ã L1k…·Ï¢7Ô _îAÓmn€Î·/–ôSÆ®©„*—„•ôÓRF/×ooŸWQl_a}íc*'† Xðö=yÑ¿äÄJùÆý´©&íMŠw¨ŒoÁÁæØ$™øè$ äìÅLRícÜk ŒÖö~`%àÍjßí#¶“Ì-qøƒSDî=iÝÁˆÛ7S¤`óXý]ßµÄ@qçá,QÐj€c¯Æß`bþ§Ò扷™†Ìî\obD% ZÕÕ¤›"ne„&ö–,Ñ #ËA£Á«Ò¼’xC%ò–8Ÿ#·TÝ:H£¬½OÌ–NÑ%»ÙÄðg5@Ð[JÇ£ÐàÄl)¹Ú gñ‘ïÁOûHt–ÓdNÑí^‹š‡kxñ·Ö …,Zá.„ˆ#­9h¼DÞëi4ÀÔ[2й¦i:Ëó†8ÛïÙ´ÏÕxM!±²^Tû[² !fz¤þ¾#•«x†fÖ€sKl'j° °ü!v5 j/ã Òi‰¿qn|WCâ LzKV”©a¾Zò¢Lk€x‚9ó[b„³›°Ò,´´÷³Õ²>wä•wiœBhyÜ ²UKu˜ÍK0dE2ac @â-‰Eà¬Ï!ƒ§Ü¹ïRLüÑ&_¯ox<88r¥óàðO¥ãXîµ¾³ngõˆ“Á¤³êi@–¯Æ£éI‹¡v±Â‘ƒx’<,Asµ¸Y:Ng9´–áà‡¶ÊAãïÅcÿÁI’%¼mˆs]Måx4tÂÑÐV,¿]ô8Ãåh¦“æ×æ7›U²¼¥¡ãM£Ü5Þç3ªµDJeF1:„iÆÝK}!TëîÐ@§™u„.Æ'…ã(5íb5àå«™fxBþžüý vžæÕÄaWgÍ=š¯½óÝRĪjê'uîÀ„ß"n¼AkŽoÀ¥·4u÷bëåh·ÂëŒkˆthw)ñù+˜­JÞòç¨Õ8¦CÕð¤æ9¢Þ€ä ¥ÄûùÎ Ù¿LÎá¢0í-'§.9ŘáàËÆ?H,žTë°h^˜K[?6U¬® ÐÛ[úXuàâ ÅÄOów¬ ë–sp)—¿#nY5 ZmR¸´6_M;vã–ÍéÑ€PoÙ*ÎäüèÍ›.þÛj‰? šo(þ = á-kâ[p7Kœ»q,tÄÎGÍaÞ€8_Í0¥ÚõT-žP¸†ð´–ÕfÅŒƒhB„Œ#‰×wôõ4{‹è„©DÕŽÚ2Ydzþ×ýàÖÊŠHˈ.„–ˆìx\g@u›ój[«^¡ ¨ñæ•ÄÊ‘7­$Þ2× ø¼B!ÊV…©°üOÄÈâMDލÖöU§ë€ÀÇ|Ÿ áþÍˈ7 Î[VSÔi‹i5Ñ`®G‡Úvd%OJÏ)LÉ=’àÉÛ’4üyxKâë-o¾aBÅ4#?j„·³L¸í…¿šÚÛ&¡åã(Ç›Bì8r˜b¦½ ò/üMËtA¤_~ñ–GŽ„bX²–ÇQÍU¯8æL߈fÕnÃȤ1~BPO<ÐR±ò™-Ïh»€á#kž-¿ÕÜ’{¤\àyú /PyËä³Û eþ³0ü€ˆãVh22ÛŠV'~3àU[aÆ* ®å9Îê¦øiÞÊ.þÎ}hÁ=êa q¼´¤ø‘}öFiŲ¦7@Ê[Qµƒ$¸„Ù¦žùx›’¾i’7ék|¦»9Ö[!ˆ”nÀ×Êð8£¶7ÅÂpÂó>µVBù?Șs=tŽb®ŽìùjHõ€ToÅ\ Ø÷VÜÕÑߨJv.‰äíÀ,ƒœ¡é¹ÄÔÊ•z&ƒXU±=ÇA«Ž|›H4É~+¬ ÑŸëñ––0½aVCý]œAÍé2Q”úÁr|ýl {™(T§ØrÂÎHÿ]½mŠÿ´·µ½ J ´Ž¸¾í[Ó;©XtnÓóÅ¢RJsÞ@¤Õˆ¼ðìÕ˜Á ȶ­2Ã!çGxÖ´&;x·óÙ!­JC}ðÕØ¶@ðÕá¢Vy«æ$/´Aœ´;&AÔ 8ƒnÂ}úDÇ4ÀÉW£AÔ­­ Ò¸ãÇíKUsŽÀPüØö2LMë¸RåZÕžÇ2ñÃ"°U^k i[¢°¿køg÷¨Å ·Wmß’è jñ} Ÿat¯òý4ý4â†Sh¯%GíæŒÕ0J"1Ój€ø6¦¿î®=Ã.Õªj»k5¾KoSµ”@B³µÝ P]¢õ¿c †­Ê–?MN´™l.oò ì"Ñ-¿ðú °ïV]ç"½UÕ9Pü³«Ä(ø{;òÄ……_ÍÕÁ„G{%w…æÚ\h>ÄÐ\-@WSù5³V2Úñ©ŽÜtW4÷ÛÞCcuöH^¢™BêãºBAñÕи¢IZ[îašùp>F¸ûB©]G°ó‡àf¼Û.ëññÝ»g ï¿ð§  ñùŽ(¼>o>º’ouø†ƒ£j–!ÈALuÎ'ÑbFÊ„o ˆ2úå*í°óéÖ…ù9è rüØzNò¡´ã7äòi<Áwó’›¶\dûû<B{eò:JÞ²@ £M¢íóÕ˜”ˆÙh^;ü;B½Š¸wáðY=ӊݬ¡Q¡ ÛˆÇ'ãó0`Ë›$?à.›X~2fKš&jÓ·ºMç~àðƒ]¦¸3;’~Õuj,~æaªm(În„àÍ:ÓäXáäƒ7ý„rùXT0ÈAw`ÕA=;Åé`Þh+½ôíò’­zãÙyÓý–¢å=,Ô¯pK~Óâ*ìKþªÍB·þ¥6 t#–M•—²üÏfš`bO`g̼ÉõÐP̺…Ř1HO gCQí&ÚØÀèÚ†”CV­Ù¼¯|þ“<¯Â5•"4ð4Å÷…°Ü¼€xƒi§¡€8ÆûÖŠØ„›Â¬Êü«ºÍŒ”V“2PãVröôLCd{ §JgŸ¤_Éò@æ«ñþ o<"Ó#¿AÍ´xš-òÚØ„ ÏQåCÑë«Úñ>ŠbçÏòM ×¹0¿z\½Hù~ã/—IïØ\è<–è ༡|ø­7ï:HS>43Ýc¶|5Þ?ðé=ÄŸ‡qî—¡Í®Ç;Pÿ W?PT:»{¾ƒ;ÒÄ6a¿¯v;Xr ïí–ì„MM‡Cœ¼´P¡Òv´ªAµ”h´ús5F¢µp·*ò¬"~S­yÅÜ¡ k²Âo¾òFN'ýÊÚš%!QäD¥ñ…AÛçîJ8”×F·ýcZÀ6™¿B)Àæ«iÊÄæ/T«»€'C†Z:Qf¼5·\¡ùú®¥M5õpÿý¼T„B!kPx5Ë£ .øjlÿÞšòd¯j-ýÞ.ËŸïahè0zk¬ÛÂÚŽÙqâ;O0°êÒ>’UäMe¨U½šy̤ßõ2;~Œòbƒ‘Ènv.Kõúá ÀôÖ4׺VwOéKu4Äi7TÎ^M?W}B©f“ÀEj-D[4¨Ùë·äÏÇËÐUÞ€-n¿jOÛþ0(´&±?Ò‚ÐÒÄR~´&#lÀÒ[·"ÉßZ,ÊACBQÒ¦h8l¬ó§ˆCh›¹ËãqÇjsÓªŒ·ÖšÓ‹ È?[Wcú ÎÚ¹s#†F½~ãîeÇfÉ;Ôhþôhóæðò‡p»àåË£¦iV÷$Nô­ý¾ûDE„ëû¾µá<ØèC|kÃ'’H{²‘4C—c¥‚wt9iáXȆ­±ÈÍ:Óß³n{,ÎÙ€(_MŠ<—”<¶ÒŽ¢éîqk\‡î÷@ÙðÕ´ÀÒ4ƒ ý­™Õ@­—NKBS9—Ô%Гó@æ­[ Ä xëŸh<Ý­µÊð˜Õª*‘A ïÙj4ãË=YºF^>ápç«Iþ|ô?¹ óY Æ™ÑËʰý>¬úØ« è«Qç ·Ãt,Ïømµ QÝqýØž­‡t ¥-×o&"³ÞºF\ßĜӀþdw²î“|ãI‡­2BÏ!»uuúÒ]ö HoøåÿœdþÃ2XѲÿàF¬Ê­[âµzCü([øCÛ/ 2H÷z /¯ã®+ØÂR_ϧ™ïqR7€ÎWãXÙhä³èÞh„\CÆ`‚2˜àvܽ!@R·îD¨ôÕ0h%Ì[w ö Z&ì{ێχÆÑÅp´¦öïP]Æõ…ó±à<ä  ôÕêÝÌ”'bô}_(]StÈ}|Ç3´Ç$ys”yC=ò¦(ó†Zæí Ìq[á1¢Q¾õKÓî\þOÄ.·˜ú¢S.Q¦ïÊEv£È…Ä ‹Ä˜?b ú«1ˆÂä«i‹!Ìè ¶í¡ë³# B K÷,ºt`fî v­EŒy£ÓèbûŒ:×rã ÷Ö] é̃x";;à걫ÈåhJ>ëbY ¼ÓÉ&Å-¯¹™?ÇA ´<‰B(BCÕñ[ˆßF ÖxJìAjh—åbÝjt‹ÀÛ2,œlÙprÊëF1†^ºñ•c'mîQ¤Èø†Z¾Û"ÐAšWKz·b†à´˜;²zÞFRc‹;9¥§ &Êhc¼IçyXéƒyJ¼,íœÛ~˜iæÊ©Gvøê @Ÿ¯Æ(4ò^¶¡˜ÀÓÛ0Ì‡Ê £=¾Âá5<è<}|kD:+î—™€d»àæ»Zj`šÀè®Æ;²áæsõG_àå¯#S­WÀð)>³&”MòûcÊUaôÓðúð3¾ ŸÁBWšÜCó$˜¢E¡‡áá|ÞÓ'ÁÈÝ“´,PØ×²zÓ¥è^ ¡Næ¡H°µáZÈ …Òè+D)¶1}‡À¯7Üw©UmÌ·xŠÃzg€>_M²ís+¿ž®‚ pa5š‹˜aœOñ ’Uãç÷ >Ù¢Ó¦‡íÎÏã÷Mos‡…N|L‘Ÿ:ßÎì‘OÀ¨:-lW÷okazp^¶¡“Åcö ït‚9z5ãœÿT#l¬F‹Ü.ûz!2ÈÃ>_ — êësÌÆðÆbÔïX¹52~F˜ÀèmÒ•Îåa†h^嚣„ìy›é„íúž"¤¬M– tW;cbâÚðùjälj¶Wÿ5 •Ê6Yº)Z >_Âð½kq0°éX¨¹ÞæA}ú4-W k(\…Ñ3 ;?èî†âämVGs{|­Jl1ýEø¼y-òzÞ´9é›å1ÞZþé3±g§˜U3$\Vi–6FŒ‰éJ“7/r×ð:Mk‘7 ÛÛ”',[Uj5»Íh“D†„6ïÚ"ÓB/)O‹×eœÎ«¡~¾_Íà&€šñH¾À®g»ö/¬<^‡¼ßNòÄÏOØ=dÏ6O^] c⽉½úƹkùqJX¿ƒÒù…:3ÇqÃi0Ïœg}3L§e`õ(1T½¡yØ\¿ €ókƒ“ÕÚ¶ëÑ¿éýƒÆ2ç0¥z\ž"¸1gVê¯F+ ·äH—¬öÄŸwð Ày?ß39àv쟽/=/¨ø‘p;ðçEÉ/•r«´$¨=&¿R«$`sÛÊÙ¯ Ûþ=ï—Ð?sw€§û—ÚQ©ÛýcZXº]TÈ]ÚA×É™Mò›cÈ=:àìýËÇŠÚ¡™ö“—ûiIýóÕJHp 6±ŽÅ‰]í¡|×Û¢’Ç›’82ìŽBå«ñfô¬hÑ*ÞÁrå;¸òê¤îŠ“ ¯×Pa®Å*Ìõƒ9ßâk?×s îz`ƒŒ†¢üJÜÎ7ކoÑðGƒ‹xp|5ÍÞx³š~öÏ•ê“ú#w”ï÷ÝL ºÃõ#qèbw-Q¾®EcÑë4P›<}ož$nVžûc vröô+¨s^ܳ۱|×ZÕš$f·ÙõÈÜÄ£58+Ÿß06 Ø:ïŸZ8:Ë1mæ¼v“Ÿ;0é«™|ÿ†½f,¤`ß?ól³øSÿ ºÎ)a«I¬#޶dKHÁoßO:Æ«wëOÇ;uƒR–/$©î¬šÚÄ“hÄ]¾Cæsèéx Ó?8 ÖþD‘{ŽÃaëtß¿pµ¨ô\ž7¿¸#Þe ^Âϳ€ÕóËqt¢È]ƒÝ[rŠoIë gìÉæÐAÿ”@š~R@ÁÀýÓÓçDÿBk܆. È/=ÅèZÄÍô]_õhŒÁÜ~lapfP¼ÌпŽzæ=™²>òD ë=™ÒQ¹©'‡R|éÉuûV?Ðs²ŠÊ6™†¬Ðqÿ­Å'Ž-Ïñ¦˜ßSz"@Ó‰/é‰^ÁYÜP_ÒÑú®Ö"wmís~F,¢w}Ä3ïü%Óv€ç剱ïv?Œ^žç¸ÙÏ.ŠÉ\:ÐçÝÑçm=1«ÙÞ“c±èÐ T¶@1íŠ>×à¬oÄþ”ÁÆïÏó-Þ¦× 8>Ñ*кÅHÍ¡']ó¡v¹jixz Ù :é=9I\µóý¸€ëI›Ó]ÝSEž²a¦zbÂDs¨3ƃ®sÐ1ªžÄÆö¤6?£ I¢¡¼×Þ“žžò^@ á9šî4µ–îZš[Rú|M‘Hôž5Æǯ²O|Õ_ã!|¦÷šI¦+„é¾®ÊÆ¼TҌϋȷ1Ë_Pª{nÁEž©<¹xþT1êw¯fÞQ½k5óŽÒêýT3ç°aìO•(® üÚ]×D>‡~àè” +fw†PxIq: š_Â;Ðè¶Ç{{¼_Àš‘RBˆSg(}gÚ – |ݹ «Ý±èµ~aÑûƒEï½Ã²Ü‹N9Îâ7[ad{èoâÖ©'(¾Cñ&¨÷ìi¬¿—HOŒût"=ÙT³~}–»”Þ•š"^4Mð—Þ©ÎiAVå¢àÜcÈFö¼v·wÊÞ ‹tTSïŃzÛ`ÑE]ÏO^‹ŽEÐ=‹C|ïçüÇ}Ø7‡eb†„<ôO÷b1Yë#öÒ{I¶€€“ïåÉìMÖNÝ çf]ã÷§lnGóÕ ÞTíöŒçW —ü+w* 8@5†ºô¸^Xª×A$¡V¦í@«wOÌÓE¿k?v@ìû¤sOB.ù—  /PPgKјù+}/ÌÝ®m­ 0â ÁæãöäDz/ÊEP½—˜šrÙ—@qÊã ᩈATýYAĺÀúj޽C£"å Ž…(<µ‡hÆfØwúcფÐKU{Ñüå-èn÷ræŵ;Ê™ã}¡å9yØ:¨S?$ÌÔå§ž¹‚±´–‰è ÙOú›W#°\Uߢ¸’Cõû a…XîîõÌ×9èT;l’¿:v}Úq¡…Abêâa÷Ã\sH}5Tå 'ÔTc†ÈÜ!"ôø=ª7pé½hL&÷ÕLK‡~nσͦèx!„ÔHLÀÉh¥\Eƒ°R«9«Jéü2é¢Ðy/Ì…Õ·îe\‡DÐ˸¶Ü¸R"`Ë!f´ŸÚæ‰ËŸ§m6í§a€Eù‹(‹uN´9•áå…„‰À0gµÞ£•;Aå­ù¦„i¼°üG†®úásÅËô流#ÿ¬ðv­nN¤¤‰ÂÛIõÔÇé]1X’É‚HiÉã~í"b½C›>æŽ2TéçxCÃ5|]¯ß%ªÎ4ÁäT±þLÇêŠPßæ"Ï ÉjØîDújLÛ"½¡¾ûWaíÓ°)OↀúM4aÄ^ mn(öÙëvq˜Ðd7Z¢ò|¯9Äìh쵘×o÷Xp¸¸e®B·¨ùŸ¡r†¢¬Ö!è"5o/AóëwöÇ—oÕÂF­æ´ÈÎçx\ìðôJpHGè|¯éê¼ì1,p~o2‘~ œoÏJªÍJ&Ñ@SŸ!¯éΦ[ªÖˆ@»2÷úˆŽÐ®ª$XßÄ—ˆ–Tψhü+ï©S Íæ²`±Â³—Ðâ Zôü¹$ðQ§¤))øÑjLØzÒ«ø¶REÓK3§Á|ÎgiîúÇwï²Xf¯ÎF`ï@¨ã}ÀRj3I øø^ݵΜW ·×bW9æ;5V–_q à¢Ã—Ú«ûPz¼×ÚûýÞrDÒBJ€Ç«=£Ô9µÇs?iE¨w”8ï5°‘"4YèzÓ`ëUÈ%uxÿÀV¡®ã[%ö½“ü^)™³†LGˆE¯ÃwHçnîú¿ÁÌžÌïË:]CµkuÖEƒjžœ–ëTtbºEð2‡°^ïKS¡Ôé ºWJ£ÁŽÜrxPõD'*(‰':éÀÌwñD'¾ð.æ{¤=¯^ï£æ_(À«‘àE8² æS¾8„16¦Cv\‘m@Û»¤mú^ ‹JûbYöTÛ‘Ä9ª½‹kKèú­ÛW§öui;—+ªºÞ%9(+jOêz’¬Úå—~U¶ø8¨ÝÛEÏßýÃøB¤ƒÜt1ï:½×—*ôŒ˜/µÛ·…ÚØëÛzÓ}Í a†ªþ ¸Â©yα(¯jÕÒÐþÛýØÊ©€½÷æª`ì½]ªõë–Ýý´½ewÿÃßÛ‰ÒÂÚ†zvør¢*Œžl'Œ à®ÒFçQo¬Ÿ¨÷%¯¬ܯ S ©º…üEuЫg‘í«w«÷¦-ëWiå7J³­0`¡·r…Až2Ô*«ú€´p±bªzóša ;ë½(ÂæÇÒÝt©è¶Õ¨’@© –ŽP³¤»Þ¢xŠ µÝ ¡wÜ{S:‚Â뽉׺§s?šý€W_ÚÓ±Hlq¸¥è¼7­X°¹Íè¬âû'aŠ44~=:"º Áe^.ôd85Sζ?®1Æó¼úQ/âùÀ3xlŽsæI° ?NòñƒúѺŽ×¼' «þIˆÞOßÎ15œ?ΙF‡N÷ u¤©:Òϰí½õk6þ`@ ŽÜ ½y 8óÅQÙ¨Å<½ë»ûFZ,°Ž@S8Tbš]5}©~¹+cøÊ€õ6|I:¦¹W‹çûÑúkðóÕ¨a~£Y‡@+,ße|½·©#ý£P¤+£ð-®²Ç ›Óma Øó«<‚æ%~¤a,ÉîxõŽºg‰ÿlxìïó!nŒlÂ]ôôN†sà×WÃ-è{?û‰]9ÛT^}oX®iÙ?÷yFMôKÛ@8ßéwR¾!Dg¯†þC`Ù{Oæ?Dóî‘ÐjTŒù 9ØW?ß%}îÀŠ®†4ºç@¸úM£;_Ö³õ®òW«˜±æœgDç!ø-”‰ïxųº)$*Œtƒj"¶ü›êžÒ%³£V"侂îuÑ;íuÃïàVÕ':ÐçW0~E‰k3)Uíš3 îâ‰/)ÈÖý¯@™¯Æ¨ Rý­†{hùÞkdÃ4Ìg”­/qÉE.£ã'¾Dô»§Ú¾ìÌ„Ã>¾ ÒW#þ]BÔJ{w ÖÑ_ÎXê¬÷îiO:-{ˆ!™?p(œû¨Þ¯îõ{ï­gÅËÖàß^ÇÛÙãO¾ç0ãèì~ØÃí ô{ïу÷©YÉ#jÐO¹újŽ4 ?FPbï¬ãþê\÷=þžtïÔ5ôz¿’õñœ;âT\-­T"½ïj™Y£’¢f/ŽÞ5òi?æ Ö'º‚&]+pòËšÁ<2 èð'زñå^â#_F£ÁÐä°TxG0ª¤u Õòä¤ïgx˜ ë]!ëºÀdýðˆQ\a¦½â Ôß~\î`Kˆ3죸„L'ÝËë(•¸ ]'Jú(Õ­þTq»8mWØúæSOâ|غv §¯ °õ®°uõ=Ò2`ëå %l½+l½¶Þ‡ó!ôÁ…Y6‘Yä;5¿Ÿ°I¶È@6‘®ÖŒ÷¸Éœ~>æA(*ݾ3žÎïSÕ“©r,tlkßõ|^£|®Ž_ 1ZZF³þ±.ˆ§'\‡Ð¦ïí@¡÷S$ý°ºÌ<úv4ƒÂX„5 6q¡Ö; öýB­ ëÙ†EË|Â}Ð;RñîVØäÏí¡BPOF÷] >3ºƒN=¢3X€R'¼Æž>ÿÂ[­Jƒ«~ø‚…º6( 3.êÑ÷kã×ä›t@?ÀMÞÌGdY‹¤w ßû)’ŽÑ„n|2›šä?6æ;¢o,“|‹Šê—èz‹ÂˆÅ]‹ÒeW2¼DïKÎì(‹Þ‡úFNÌ}'€1MÆ1bå@KÀ­wÅ­³\ÖchWG„ãÖÕ1™:«ÃÞççû4xn¦nç®u éåºbÖ/Ñ@÷>Ÿ  qó óýÒ¶à¸Pì«Ñ æ-Ô¿¢%âµrAnì[ïäûLŽ››¦‹(Qž¦‹0ê©Íáº\–_fdÔ{í3»óëWžyÎÇóÝœ(w?°õµw¥†€>‰Äêíxñš-*?øÔL_ ÔT_ î}z.8e±&9ÌÜëEU±ºa4ÜO:B<6°õØúY€”cËÙ9Q7ÀÎØ•ÞaÔO﵎3þ Ìä‚É<ÙÃá'›M¡À„´Ç¹E<¨tßÄFU…r²§lÎWÝìóˆ\Þ§‘ ¬Á]&dä^ãÒ^ඤk~7 3 ÕT°˜*¦-AÒ<äâ±”ZKKAð™`"sjÍKÙ” ABî¡ðzwðzЮO ÔN¾OÇ0Ñ•âuÖY^÷õFÂ$ºšä4ÖæaLxöÕ°}_,Qf¯nÖa_ö Ë)’Ž¡‡ƒföþ¸ï,•ÃjunÕ`~Ø'iÝØŒ±¼‘Â8æ8Ò3ë´-áÈ{£ÔTÖ1aŸ˜W…¤¯0¡ÛùŒÏeNuôÃyÇg6,šEK„  Ï‹)²<ÞƒEÑSó$tسˆI¸êL²Dö€»}Ys9>S>Îÿè÷uš©÷€²²‡G Ô=Ÿ&틱$Á;Âà‘ËðëuÒÍQi”ðû¡OYû—ñ.ù à€Ð:Nô½žPÓ­káO¥ë3miv^qk|Ä|Ь<`;^'}N~½)d\uÒÇÇÆë¤¯5ÇûXÁ¸>¹à¼Nz(\uÒi‰Ÿ¯:V ‰7ìÃë¤ïU[5b63=» `v1éÜ€†:¾êƒJ “È ÀÛÇWgx~}ëáàzIÆìÿ"¯åøÄ ¿L*ö½T”‡ÛñŸaø^Øý@}òÕL¿'6GûØgAŸÛ‰JÇ£Å<1ã é¡3cˆºÁ|ÇÇ0Þä¤ÅÜL£éò²Oï9ØH +"%­ÛGB@ÆWd€Z—®ÿûø¬ÜÔÄ}|Ý$‚Áêè—%jY?¾ #аrûð §a#Õ§¸NsŒ€(±ñd:Ó“Yeë¸ÀÀ´2Ùâ’}|‘µ‰™×)„!õ‰0ƒÓçŒã’{ôhõK†ºÊ£ï÷EJÌ*ÔáàwÎq½Ð,%Õ.ž t£ÜÇ:U”u M² €z d¨‡õü0”:†«£‹bIÓç_%ëXçôãs´Hô÷€_gJ¤[—q½‚[`:4S!F.?™¡Q ÔùGÞ¢i#«iæjà @¤Ó]wžñ‚4[  Ý‡×GgÒÏ'þu0p¡R×îó7)xxÙ/Ê<ë÷Fò‚;#œç±ˆVF'ŸÀ¦­Œ>€^}'?bUH?5Ì™ŒÄ^økWô´žuK'mœ~œÏd¸)é ëüÆ ÷ uò’Ì\HâËRØxXi©¾L}1-có>’˜À7°'F )jwÆÖÏâuF’8Ú25FpÇüÑot˜c¥G!Ž~È6€Æ¦Ü𔪣Ë2!#YVAæ…®1 ­¯FQ”ù/DFKÓÐ|¤îK T7±ÄíúŒÉëÁ嶾DZ‘ãÀ‹°jBŒ˜!E¸¾,ÃÉ@ñsÙ…ZX5²¤¨·qJ- vIT>×r°~“q_eIÐæyƒ£ü<ÔÕÆIg‚·õÏY€ê«!ª}ädœõZÓŠ È©·Ç%ŽMp é8©Æ ï$Þ?xj·8Gºõ½¿} £u0c²I梲ŸÌæpšCiŽ”Árè=ÇU b5EJcøG³ÄYšJ:øTvájŒ,d.Ú§ ›LˆŒÇ©î™iM¾~“1Èêºþ•ž ÂÈ®q ÂidÕ8]Ù5äfÙ5޽zä¼ËÙF Â'Ú>Åh¥ò8Ü×X™Ì·h}ç>mÞC°ŠÜ}m܈™oäà:}5:‚ Â9fz¢ Yá2’Þ„2s£uÝ·‹iÜ„­qrrDÆwg Ðd¬¥Æ%ÁàÝïX*cÜìi‹oXF˜‘uáèô!Ûh™ °½(úÈš˜ždBJ%‚`ç¯ôŠ®‘¯Ñ˜l,þ ›;Ñà ìxçòQ0YŸ£Gú@iô[Xð|\õÑGÉ¿¢bÕ$®a¸8ô§ »jPÅvl†¨TºÍÁ J_È8t”r‡îbnÖÐzì"œ}!îãÉv¬Âg±,EXõ¡ñL,|+=&ÿƒŸ|G9*þ(‘fŒ>ŠFív“xI˜ƒ-ËÎÇÀþc¿2 ñyýF©nŽDÜÂå뿳J ZÆÊ¶Ti²ð%8çy°TÑ ¦ÃÒ Pìqð3œ`èbE\iFªQÄÃ]@uÚ 4ès4–d…š·E‡‹‘ßΟ|'1Ѹ¤ù(í¹?fÁ¹*°BB'Äc„@pÓàºuöß+r¼?ø„{æÐêCay@÷QQ˜d¶HŒçì< èóÕWFFþÛŒôùÑQ­d”M0à1Îù7IÁM¶·˜ç«$RxW(hÜR1]`Ó4ÈýÏõ6_H醿Ð@§æç[t¦¸·¨¥W¤§Õ&äκ£ýáñQž41é“¡)å‰?cŸGlÚÏôþÁøT½ÊT­î¹9­#{ò{®†ýi_—Yð){7Ïbx±ô¨úP(úùEg<[®VYYËŠŽhÇ×€¢oÙñWÆ3•ÂQÍÅ6ñ4ÉMÀ_z2ba þ`¶úAþf•ÒÉÏÐód¶ú%å㇣zÐNŽ÷9ªèH°D~jefåî¤In.SØO‹&UA‡ÉQ$d%ôKõVüX¡1‘£–›cîâk6J´JC„,É5êûÛ* Œúpú@ÈÉ8ª)g¥„¤bê»è±(—æÙ³%šŽdÓ/ ÒG­qù<©†pÉõÝÂ%Ç1ÃítJ¥o)ÊtÛS fËŒÊt&¬MóTg@!_™"ëGÅ$y=€yêqK·’¦Ã¿HNªxÿèa¶×b(£º[q«Ñ 7ªâážrec=Añ1Ê ¼ò¨ Ãn,úö¯T7i6JúÕ9€R_/ð“Útû6Ft㈀¼Ú\Ʀԓ‹«—¹[2‡¼¹=„çxQ&µU—f!1 ±q IkGíÞÃÎï»LÌ©=pMû•¶uD¡@ô¡@tæ"ÎÍ«¦Q+;ßÏù$P:¨'V5f5ª»=xýU†¥2c.$÷j´Ž'Ü$‘ØðKkꨖ~iiˆ7ñãÕ\˜•Toú³:¡-œ±¶0ä÷è(»¬3iŒ¥/Ù~<ô³‚΄ã¥ÕH ‡Xnw~1,@ñŸa¼æ8NÀ¢KRš†¼Ñ»sb@#eþGuA‘’âý°@ÅJK ¬Í!,-5džP¢}’Oèû—ííøŠæÝÝýGn„'/ñuâÞr‚˜Tþ9¾OöÏfÕÂ'Ì ¶ú`±ü É‹¥Slˆ-ȱÄtÆá!§‹ûjiBÄÖÜ®ÀpžÂlHôÕd*0YvG¾SP~45àÐWc| hõ!Ì‚5p<Ä6Y-4öK¿?d aCª=¯|Ñw)Ì…è|ÊûjŽŽ>—7ÎdåË?èk5²6²¾wÿ:þZ“Ûb!ÝÒWè¾Iq߈kn"Qs_ý#¸vË>ÕÛª£!y¯ ÔÐÑV4€4Ž<@› ÏZÖ¸Ðù¬Q›vð# 8®V#ÇtXZÖX Î à^‡¨ û Ðmš/×CŸè´Å<¤çÃG³<ïÇ2I–Qi—¾š§°jÞÒÛØ…Ù¯þªÞA§¢™‡¸ÞbíC.½©†œ4X\y8Í»“ïYa †7ÌȶD_Í•‡7èdÓ°œ5s)P§î®ÇùÓ™^ûŠâ:ÔJ”:ÝUº†–G>!A¾aì’©û ëBCm¥9&\ÏþÌ£¦>âêCj>]0ü¬Æˆ™ø²y¦˜R×qgÒG³Ý\Ð8‰)ï“Ýj{ó±ÐmWg$Xˆ’-Ùq+Ã2]‹,ßçƒì6ç@©…Sî«É o°6i  åFÛy„å1@H½õ×ÎGÿœ{¦¾¾“{V3ZL€%D†©iŸQHÍ`1øã(Gçþ™÷ÐÄ—è¶´šý±ÞSÓiÙäd¨ÉC«£ï€á¿ªü¥Þ€Vb™±0úhVØv°2:ß l§YUÛ$ý8ò˜9<Û °ÂÉ/Û2)è ÄÅvª‚‘â’ u(wtÆØj‰‰òÿ@aò7c vêF"c-˜pä«Ñ,ÐDýZà¿–w¨ÑÅ‚:éà £ Á†FÀ¡S}»³ßÛ8Ξ nrc1ª0ÍÕɇ¹7¬£i9µG $§ÛB†ºéëG]wð‚4ËX2€qÍ3– FïÍ`6'òâ‚ (%ø\X|4¬4ËtŒâ̓ÐzBD`¿(´Ûà‹@xŽæ+”cY M©K¡R(KȉZhg0ÓÛˆõJ´ÕPÇÄXOFÔÁï6€:^}–>ÚPÉêFA‹ò¨§Éh\ÏÃÇ e{!ÖáU šœªèì*Víˆ0îѺÞÐâS!“!5Ö´E^¹§üK-¾?æ/ýxe>ÍUÊh®„¸º~8i•›«1ú§ÔL©[øõ [ÿ¢ŠZn1@`¹ÑMåýx=®—­ÕÃ="?ëôÑ-Bw 0aôÐ_.ß ©4z2ôÝè) ïFO1eÓèÚDu˜N\],"íéLu}E“þê|t‹¸ð·Îþˆ¸‚uñÒW*HyÝ\ p£g@ø9:3ðØG7µƒ)í¬¢ï­Îk=¢ty‰ý#Ùˆc0ñ7B—D¦{„.ƒK»#kQ®Ï5‘ÇÍ6àÂ^Mãê=¬Ç®±ñ;óIù€Ýã¬à÷½šÈ§;é˜Z±“€ðÇøEá"S¯1h­}G'e±ŸÑƒTu´^ lZ5e‚Q_`¸‡VDÇ7ϘØÿ"l„æ¢"Vi°¦öѵˆ¯¨%]S”@¹|Yj‡_¬@éBWS€çã¨ü/¿±åçü)¾5Ú³5Ú»5ophÕ«r·¦Œ5£·åÑWŠ…­ï%ÖJFSý‰‹¾@EYžTMx’ѯ½ÝÙ}ôÚXGCÙ'wÔ1zWÞˤ=—-Ùʾ8a°uËu5€E¨†.ª]LÇw] 3”´œ¥°ë[½!ˆˆ®}øºSé„u ÖG÷«ÞyîƒKèŽêîeÓ0¶O¾x0®ü»²¤¨nC­&œÏ{zÁG:tÊ+¿u†ƒ’ _+5Éoƒ`äÃÓlUPÁ±aåcüRˆ”)Ž/2EBçϱ] ¶ÇÎùLNBÀèšk‹<•ldŽ1’Ò˜+ð)ä zã¸r]ì#1› üìV7yÆ-3ÿ¾0s%RáøìaRCzŸœÙ˜Ð”ö¬C8€_#¢¯9¼En/ÀöÀËWl´\ÝÊ$ °Õc)uS>FV?4ëSŽ/ƒà¥+ú¾áÕ.[Jð;ky¤ˆÀ—¡©l6ÿx§ÞÐYƒÁ„¦‹1¬áž} ¯A¨›ex ‡ï8UÐÁ'paý°H0œàã੽ðŒ°û#—PÎè&“˾c(^\ŸãV¨1þ} .ŸË^9h¨Þ„ø¦wPŹä®:h5bñà¤ÞÁ ›VHàû=uçh{ “ËJN9¾_Kú~èJã¦w`ÅŽá”Ëê.äû4Ý­ÅýGDù½ÿo ÇLMj½Lo!w#fÜ£ËkM3H#HNt3H~v U5Ä ˜áª³¤,bz‹±^Äe}ä…–~°N‹ºk…» òHˆL;ÝÆ‹y¶hŸ¿&ô‰¡® ÒǦŠ?ޝØWúpUüC_·êwn?÷œÞs”U ÜÓK#¿Ûá]Ô&aŒéuÝbVê×_‚>€(_Íôά‡ÏÏ-Ì)è‘„œ¯ãÖy¢ö÷‚D¼çj,>¹q ä›a±~Ë>®¥Ï¯xù˜ßï¼]ëKÑÂü(ÒT¦9Æ+ É6sŒT˜ÉݦÓÕ.–ñîO™nfþÕr`ÔgÄ$;fºœ“*«+³înØ–=C•3bs€oÛ3c`€â¯§öíân£ðø˜ŠI¨pL’-ÎüH+s{Åç §$\e¸Eñ¨ŒÔ~ L“0'G“XÀ=ûTC½–qõqp‚O–›_nW åœÕçþŽYÏäÒŸBYýâI°ÝØù¾š•öQTH>ÎwÅlEãÚj¨ÎmâÔ¬>„u>«“«o¿‹ªÁÏ¿å«Ë²ÎÉœCùUe¯V‰âÊñjÖqj V\jû7žbSXò15zjØN)UKôà=¦ëù¨}6æë`êT5˜OF‹šüÈåXbùÜ㘚ž4Ó6ŒÙ_mCQV±>ߌ{L—X€=_ßÉoLÓá€PÓÇt8à^ÓÝ Æ´X8až÷¨Ð¦dùO:ŸèKh°ü©ï$êôÁJ#8¨¨õÁ‘³fG 3ø\6_M³%=%n©Áûíçc¬ðùf}œÂç{ÉÖž|„æhv|5n`&ßr åcö«ªd ÞÛÓáÉj¢G¤V¬?à+Gc/°ž?¿Ï"»ò1ՆР†¾Ðû0¿à žpÚN“7 @­ˆ‰m±|*20s×ü¾¯ço‡FO€ÍçÇ|ˆ¦ây°ä{{Ï“Ôè,©ùyáÚÕü¼pí€d~^¸v nîüL°.° Q:¿úÌm5¼ú<¬1Û-1-Ÿ_Hb±˜¬AYžxÖ ùY†ö /Ãj ß>­¸h+Ä¡+± ñíëÄvÑ¢SAñࢿó+ß±aLÍ-w¹q34À„}~¡<7HäjÐÿÙñRó öÿÉ"è9…ø§ù±î'ó[˜yz-œ~yæx=îY¡_ß“vM ð±ùU³×ïEp4ŒlÁ"ð+5#yI0ÀØ{÷ ò&ãöDmO9mƒ3*¢Îi@?C\ñš‘qðòl %Áæ'ÆŠ×gÞÿÝÏ«ºGD†/3[ÍË+¤D$„Â;G»Õ~mVù_… X˽>&kžDD\ Cü;orQDü¢œ9ï·ï[ïÛ–`‰Ü°òKÆž€–ϯ› 8¬Üæÿ°›ÿÍF8ÿgôC&R¬ÜÃÑÅëj^¾dY•¼µ*…©ž¬Û9f\ò76Æ2Q!}~šg•¹~¢Åx²Š™§J†qøf$hêù‘‘L@Òç7|‚©={œþïês<-…ü^ óÙã^ºv¢zúj<Fe¥¨‹V^¤¥fPª÷ñvÏÄ@ßÏ‚šoËâ@y££7 ŸÉrÈL”O]ªÇ6='¯V¼ ”•>8_M1å´lâ¶ètŠÞè>┦ÔmÛ1)¥ÇåO ûfÚl䈳ãbu˜²äIÚ'lG3esÃB,sÆ5\yQWgÊâSbØSrRëÚ”xÝÁ ,ú<ú$‡¬ùÌw%Þä(%ä¼x«ÃLhÄá– ÛUmSm~±BêZ|jtîÄë|z ÌFhçãMŠOsÁ‹Ôïnƒ$/b—'BgR8}©9(­sÙXz݉”T31-âfÆX}f…mÎÏŸGD‰Ô®eÀ“kš•ÓžÃÊ·Œ8YýJz0'ÖâuÉšK#º¯×9¶W‰6¿¬š!ŒÌ!þPÒëN™šOšOÍgbNÄ ÐúLæý`iÌËsZ€¶{,;†£™vÁ(ÄS>9ï:'·ùä‚¶§®{°§8˜ §»(¹ æ-yJö™ºùwfйu'aðŸÜº¨õy°Ü#q“çh/”+®´ŽZ‹1ŽXI%n[{°V¤æŸž€’³Ù÷Â-3Ìö-›ZŒö*JF3ÉãÁ™@ƒO¯‚>!¡M­‚¾>ã¡nÑBÈV9x©#.³¤«¦Lƒiy¾zòý˜ˆgßkbÇ¯Æ ½Ïl˜Á ¬ôú®õ€?yu4æŽ4_«Ñ]D1ÍlaWbàÌv53­Z¿×Èw©ÂWV$G7ÈÌdÒ|¯Óg6/ùl)Á0>Q ÝX¼¢-0cÂI¶>_eFœÙR„kýiË€™™IJXI³ ï0pʾŸþ€ögã$Àô©…/ôüGÈj,8–hèA Þ|æ¬#é$[zÝ XüÌž^wæ’MI#¿wq'{w²A>f~J}Ìü”œ€¯Ïƒ9Ƕ€Ð9XÒAÌü™b–~TñJF33Õä/Nj æ· àùÌÕÙq¶ô­ô“=β™v3Îñ|FCôÜ“Nu[¾šäÏÃ`È Zª(‰÷ƒaæUcÚ®j× EÈè2û+¦v?³¡UíæÇ™£·gf÷†LV#¹hwVµäš3®ØÍLnwä’‹}ÒÛuƒ‡VçöÐj`w穆„ÜêIÎÜ“OQ·Œ·Û7|½”ç¢Ý2Oàȧ&Õ"Åâ8SZcZ¯ θI°è.;"¿[³s>Wçµ½raXì§W@Ÿ(Þ>czr(®TIýún"JQRÍc>3”ͬEüü/‹ÂQðyÁ,ÏLL6–§iÂÈ7ót¦Í×vªSäù±ÄÉT[êyr ï’K¼$ŠEÐÕ·¨Æî% Á/£Ë0}50NOH2³QṘí–\ÌÒqDSfù~…M˜%YÅ#?΢Y̦2K_ ç ¿{Ž1sDŽU,G;1\ÅNHÏîÊ|/4@ãc;„6¸ÎÉ0µ:¡o¸1tÔY4¼vƧû¤AÔ“L ÓWC*^³˜‹dyÉ.‚H!_Û"xÈðüvÙ¨-“çÏRâ`Ô•u ØLςǼ@–·Øè¸|5Fì€U_ÇŸ†·2K‹«¨ ÓØ«`°DŠ_€ÑgQ•–ãYúQß&ÊœÇU}©l/‰E ˜ ¢l­t§4œõcÜâµ,èú,ýöÂn{-§pzþké)1ÎÌ*²ëÇìS2|ÝqJ¼ÜK¬Æ"Bj<+ÃÜØO8æ„`Pró3ø<óƒ‰ä!OÙß 4újò¡•¯ BS.ƒ'pÓ«NÉä¦11~ =ý›#H*Enqc×/ªì€¢Ïú¹¸Š°¡Y·që–TΨSZ?7`fÞÕ7rýžŒâç³~×F†¡å@Ѓ±'–h™5¹ýí@ìÏÖ°-UÉ)_Tr"îÎá0èü5Ře0‡wMa­†!å°„I kd‚.Ùbg&0êëGë˜>éýÓRÖZÜà}^ž¸ ú¬t’ÌÊX=Ÿ3¥Y¯mˆò³æc~c¡À[«càã%MR™ÕK~L@Ög-A«û~‡)ª†'œZ=&sb9»Úù *§Ä-[&O(¼-ŽÕ;â;ŽÁ §Ý¥â1'Æ+N-…®eŸÔœð´®ã¦ &=AçÏ3Ž/8Ï 0cbÝv­Ë‹u,-UJoFõþï“E‘Ÿùˆf{¶~Ø›„†7:* ÙÖ/w.L5–›ÕJ~P±ºZØjÞªàW=tÆët‡ËÁdkÔëQ}ˆ¼¡ôN`Ð  xÁ·§QÈ{k›¨³1Þpû¬}—tùµIÔóXÝÚU{sÂÆQ-¾gX?« Ü“ØïÁÛUtGŠ“8ò_Mâp+?@³^¥£@J´òˆöõ0+ú¦kžqõ¢l0µ:qù*ä‹pšG©˜(‡>«Kt€­¯¦šâ幚ˆì~p4žžYÕIºN-$’™U‰¿ ±Ñ'îÓè¥Ý§¼N’ãG´ât<¡SmaïxË1nñsEãŒåç§ÖGua•ÔvÝ#’\'–ߌ${‹)i›ßDñ€ÙÁ_ ”zòN Ç熤“ž=!Zt´æ(ÏqÑ8$}’>’>1çsãÒ9D *}i¾' žÒ0I’}“ÈÃI4“Qþ% ÿ›1{qã–<Œdè5åb$-L)%Ü‘þóéæ=)òù/2…Šè±¡Àó©ŒCÈD_ 0õ·#ìzJõ!’×ßîùtˆ}M?¦÷%)ÙVw…˜~iï"æÜx…ü•}á˜rH¹@ÅÉ ²,ÏMç«WÈá&OðŠ£'2þ°w ¹n´¹‰ºµx­;!#„ Ùn÷µ›Nm‹’q¥Bc†(õG Á²ãÜ0”\VŸb&.•âäȉ6WýèØŠËô@ê'`àSóW¦F‰ "& èWò¶‰ÒèSK£Oá¬\3Gnò{3ì\¶·íí#4…¶W3NŽDl¶þ-pùÇ.јVB·ˆ¸½´ºw‰Žø»Kä,w— Ì´Ëý<ÅÒ¹œ¡¾xX>0Ì6n» l¯YqG ÂFâ[ËnLâRý- “8ÛëIió{Þ´½MŸkF¹“ XòØ…Yß.Ì2œµÙî¹-ˆE™íb/m¾ ~Ó.ö‚ íóÄÍïèÙÕÄ €ùÛ‡JÍ>ôï/xt¿ì_,™~÷ð÷Ù·Ú24Ìÿ“ì^tjö{[òðÊË¡ø|\r"…y{ž€…@Yºš#}±2„(ÌqOúrú ž]*ý&§Zú±Ðl´Áìù—q7µ„i“¹nÎæ wñ¨Y„ùízóÌÆ-ê´6Šsw*‰Ý¡%Øô8VcOt,8lŠ9¡ZçT‹qéå·éKì3™{tÍ0®ç²ØÆ>»›ºP·|*¬}Ñ>Œ}èGûŽÓ@¥»•&äGûÎåÁÎziB¾íŒ(ví‘›†f¯îÜé½KŸàö®Ù©£¸ÞªiªK¤Áà÷ÝUE²_AÏU>\ Kiºti~œS°çá~‡¸…û¯ï”Ì$û„’0oÿ J°Ïƒdç*ý­7—:g½¹¼€˜³ÙÏ&Ĉ³95nAVϘ¶°¨?„ćáâhüxHÍyŽn"è&=X\öÂ[µ‚ƒ\Ûhhö˜ZRrŠzŽOO…³Oøÿfß,dÝ/ϳùíä² ô=䄘0НÆlq(–:g?¬¢[”¹‘ìg2†ÑÜVÄgæ1qæÁDsìçIY„ÑßõÎ~T…0:û©Kˆ÷žíÆ*À7*µ|’ÎdþŒ\ÍùçÿL V·fgolly-2.5-src/Patterns/JvN/sphinx-midpoint.mc.gz0000644000175100001440000025304312156145314016611 00000000000000‹S6õHsphinx-midpoint.mct½Ë®-9’%6?_q Ô  ·ñ1Ñ@= H‚Ð ‚ÑYQ•ÎŒ(dDv«ôõâZFš}_UåõØÇŸt:I{-[öý/ùÿþþwÿòÛ_þòoßéå§ÿõßü‡õ¿ïïïÿðÛ¿þÛß~ù—?ÿñŸ§ÿ¿üå/¿üô×ïÿøßÿÃßÿôŸÿòó¿ý£ú¿ÿù—ß¿×ÿ~ÿ×?ÿòëÿóýÓ÷O|ÿËÏ¿þü·Ÿþøå·_¿S¯ÿОò==ÿP[ýÖÛþôÏüü·ï_þøþóO¿ë}þù—_ùýÏ?ÿÓ÷?ýý_ÿòËŸÖÅ¿þË:á÷ïßþë¯ßüô¯?ÿÃ÷O¿þÓ¾ü?ýüÏ¿ýíg\¿žüÓúíï|ÿñ›Þç÷?~úÛßúí×ßÿøÛßÿÄ»üñ矿ÿôç_þòOßýiý÷W\øûÏùçüþþŸûéŸÖñ_~ÿ‡ïÿ÷·ßþúý˯߫Íë½Ù_~þç?¾ÿåŸöÃÿןWÿþ¯¼ãï¿üõïÑwüwÿÝ÷þùßþý÷ßýã—¿àv¿þËïÚ½Í_û/k×?¬6~ÿþóÏÚkàºþ_ÿöÛŸ~þý÷Õžÿ󷿯FþÛ÷ýéW¼ÒjÏŸþöóO¿ïæàÂÿé¿ü¯ß?ýå_~ûÛ/üù¯ÿíïßýù¯¿ýíß¾ÿòË_Woü»ÿòËOßÿÛß~þçŸÿöó¯ë–ßÿýú”¿þñ·ßþòïõ‹ýG\Ÿç×ó?âìï²>Ëú*_é{®ÿOÏ÷ó•¿þZ;`/󌤧”õ¯~a‹¿dßÁoпûÚ§·šü•²þ§fùÞ·Íø½þ7×…ú€NÒ+x¤î#å{|'nä«òþí;µý0œŸÎï„ßÚœ´NŸl.þ??Ö6>j_§—îŸûÁyýwµ¤|gôRòÿ}ñ޵õ¿}k¼J·ó¦Þ]ÿÐnHÏ~]vcžßeuåypò>Êߥàðú«ìcÞoíXµ/Êè–"û´ò]Ö׎ö]:N|p—ÓŸß¡>v‡uÍü®ë§¬ËVæôÇwß5ksÏÿØ‘µr÷­ÂÍéào>»Ö¯ò];nYù•ò¹î;éï‚ î"Î’¤ß²¶ï:±|e¾Å~—¢íÛ­d°ßº&¾Ø‰}½´¿ðú‰Ñ….Â;†i{ôÕñìõ´ñÝÒz¼¬ÿ ¶-­.íßu5°|·r>nÇÇÍü†¯/Ãa»Çúƒ¹u ͱÎ]×·öÝ&Þ'•0"l²¬7Ia²EìwœúíôÕåìçäÙWrÊØ8Ów&ÙÔûöÕ?ã»Ïïñ¬†õµc}±ö=ÐMð¿þ|›Ö³øÿQ¿l>ذôߣùüÈ>ñÆÀiaæœW[×ÏÝ6}Î×â«­>öÜØKÁ£7žëå{Öï)ûÏ×ëö<´Ëë;m˜ý{Žï‰NA?ŒõÑV®!öhÓ'ºà©Ï9Sùè³ôöó|¯ô¬¾[ÛfÏšzÞã¯h/2m`ê8HÏš+Ïú“/ÉÑùàßš4K§õê÷ÀÝÑ)˜Õ–…³ŒÛ8+W'|Óý üޱßר×!V„Õí:ÿX7Íh gŸ6!4%aaôk ÜðáÊWÓ¥;ª­>ÓÅ‹­™øÝ÷JŽßã¬(k„øY©ðß9¶:깎ä}‡„e­”/Ù÷X¯Tª­Õ÷DÓöؑąbíÄbSF˜ŸåKÝ6ë«m‘öèhŠÿ rÓ¤DÅB½ú§V{LA•ÃlæehÐZ Ò:ð ÖÌOX©×›*[þÈ6 ÃFSð9}9Úëƒþ³$¤g7xm¤h×ê—Dl¹Ö½'c¼ kÚé‰ýòÓ$è5osÔ!Ø/X…ÛÚÙð»dOxSR|âZœRk\¹! ÖI` Ã'Œ^ÈÜÎÑóì/~¤úþZg¡á¼å°XÿÉaµ¡¶–Ç'*0hÐÀÒ³­5 Ó0uœ‡ÿb'eædåpY}{–¹=àÆÜ8[×®3úåׯ¼Òï¾–ê„™u*ûáœïœ…mwÁôY–´%è] žd×®‡'V'ˆýõŽ˜‡Öá:Ž=ìp]°9®ótô–¼võQÊåÎÆÎy÷ÉÓrÁ°,á(_jqyö?a[qþzÝ¥øf*‡±˜_g¾Ÿù²ÕGsL‚¼Þ\Ÿ=Aps s~JÈÉu#NJÇ4ÛÓO_+{®ø¯ŽÜ¼ßþÜ7˜{Ýâ¿Óš½Âä5ú¹Ý½éÜzuìZbsÅÙ>n½–÷\ÑofÚì ¤à×W¹¬wG¿á­³Èþ×x÷¸ç9Ï“óo=WðrkV.•îÑÕ›ý_·ûä\ ûþo˜UŸG9– È­ìÿÆ^â˜X£5/}Z•V[LU¦l“I‡G£nÖ~‘¡¯˜kÇÌÕñe¾pá0™uL¾51êãÚ‘jk÷j&Q}OáÚ±n¼:ËsQµQo¹½ºi}¯õ¹ ÄSÆ*‹×Xï—B†~Æ€ý¸¾ÀÒ·1`±hæeåQÔR:ÿ3{x¯Ä°û2ë–^.·vQÃŽ©?^Êy†¡ö90ö—DÈã÷ØŒ»kJ–g†¡Ù…z¬Eígغhv˜ <¶,`(ÛAeÞzþªëŒ-LZ.hK”ä‰ÁŒYyµ'¹zgªNrVÖŠ[\9>:(íNÑî+»ûmÎ{éàYš7‡Gá8Û²7+P¯¡Ccx¸òÀÞ^…¹žšÚºyâÀRߓ٫[?9Ÿzžß[®”„ñ[Ö_2Æ” ÕG•îT.+9éB‰¶äé7În/êªZV—eÃùR~ÀåÚ\™²ö[/ìxÖCà)€£D½oš(›ûÛñöpM”‡uÝ‹¥¼Ëi'ÌIhÙ*ÇNÃð©àx¶µYàÞXÓ¤À/P )”ŒÆ`ïêÞâ¢8m©½ÆäwÚ¼Õ¨§ à˜ uͽ¬…½`(@ã–®~¯´·l÷Ùƒ¾/Wàa«½T‹Í50.ÏOrÝ)™I^&ÙzÉgØm‰‡)²a–|fFPºÌ™gzËrù5JŠà ëkÉÕA<Œ šêúÙèüÃZ-jÙ'Á6eçYiJ«l§BSÚÍÓulöÝ!¥sÚÝÇ#V:]SPQ….:s-…Þ“|Öþãæ8Óé S|q‡²ìÒa·3ªŽ½33©²–îÙÝÓA$¼_ϹÁ±Jö”9F›:2¼ÃwÒc…ï¸Ö÷²ÄAkeÉîÒpç™{â1MëÐZÓÖÁKOºÆcF¬[7ßö7£VÜŽ¶ýœ%6Ÿ!¤¶IYê|ÁlÆžÕ?ç³m°2V²m| .·jðrÕÕ1b ˆ.Ëõy¸bŠôNOâj,úoBQ6¹jNÖ3"—T¤kgEÉ–ÌÕ5·ÊØ qT,ÔÜVàÊ㇠)= Çb§Ã¡¹½ÔÍ>²žþÁƒWÿPÒý„°D& ¦¦] ÃsqÛõ5á¿kÝ#eâAØ»š³s¬àë¥ÑeK"×ÄgUx[¸tqÑ£À.t|e]ú â7¬Ï¾äé‚Õ®˜TCrfÖ­E¿®ëk¦¨ÔÉu&¢Ð4(8êÓPGiͳc´è—PÿÕ%ÞŽ"uî‘m ­k¤V¨îxD9ÓMuX:žÖºQ×]W“? D÷u½q¥ƒù8—jÆiº¨²õŽŒ¯—'¬åà~ªðUWw¶ÁƒÀKf¾îÿrÖ+já¶èåðµ ®Õ½BSxrÝï˜98ç›Ç‘€k§™U‚ S­o¼üšŒeýa«ÖiKã¯kÖã8­Zw¡Óà´ä¬ii¯u à1ø Œ Éæ‘ ºŽW’^7¹ú×Õ_õÜ÷LÆÚtí_‹åm‚VãlÄ*V×ô¯ÐŠz‹lÉJYóñ»7\xéJ7 ûë µJJõÉq¯*cÁ"U—t¨k‰¯kì×nì S‰ž¶|ÖãÕ<< ‡ß¥ê€æ´0÷Ü xtÕ9j×¥Kg¢*GTàÎ…þžÇ©‹?’N€ÁÞé¸ þZ-¥–Žåë$þÕôå+µ*0{Ä8MM(j?PËWÆÖæË_·h]W¡›òÄt¯¬nȘÙE ?êä×Ä©°X±G§îé²xë̺Öïý_®¾õHœu Ö¼‰ø ž@íhÕúïDÇ@ @䳬»Ê‚‘ÿpIÝÎCsRº÷ðœÚֿΗÑ9¯®\,ëßXÿàQ1•âHéÇ¡u“õ ²,C°P‘Åx‡ €r0âT9CmÞÌ<«Äj cUøo?QA%irMw—µ$ü[B`I±pc`gñ–̰ÕÒbO§cQQVQÏ/ k½”Õôs\+÷<ÀÞªº‘ZMªú࣠5U±¢«Ú„¹Ð–ŒhkõikÙoµ)”nC×l¬¢âŸk ?0âøok9kˆÂÙZ¼áïÁ¥m#œØÿVs}†_\m™opÈáAÒ·-U¿­¥¹ `\ã ÛÝq¬…7ÒÁ·Y—3(ÚL«ÙuÏ©]Güia¾¤¢{[ÛK|?Š[[ã¦5œ´nÞ:©¨ ¨ý_'üýœÈ£œßkµXg­m£Ëµ-í¼­U½­sZG´½aö š»žÛqœó`œ­ÑC­óVZs\÷ Ý–o½ŸT5ñnÜÞKa:nhÎïílãÙÿVûFm¼RŸ%k }Óu£Fr8i€²WÞy½ë€=»Z8àrlèé%u¡1wÙêéëÕoC€8ø¥­Õ—³×¸3ÖEÔÛÚš«Ÿ² k1c¦X`2?Æ^eÔašTœûb½ß©?º&íï§!Iaˆ\¶ÖV·µ"ö¥ûõ'ë-“…ø×H¶C¨Y¸ -½M_Ëvð~ã¹\Ë!žH‹ìWrç ιœåI«;Ó·Þ{¬g`_Þ‹W"ð¬)œ È¢úXUz‚ûºuï±'êuªÓuN<0’:Œ×„8ÜzxÆ—èš‚=@X(¦ƒ¡k~G™X/Ü¡Îaô“NpþUí)Õ¤ñ}øùO8w·½¯Uš¶}Ÿ¦Î²äk×Íš^ͤBKº¯õ¼s‰z,õÉÕ‡óæ»±ë<˜ë Á`Õ¦Ì}†º­àñ>è¬c(³«%kýï\ûi ÐÏ¿§äÈvÒ%Іb(Åc»•ýÕzå=+þá¯Õ/zj§ÊŒ½±/L8ÌôöÌ/¸ãVO¬3ë*Ù ›Î´§•WLÁìÞ pXÅ' Jƒþ™¡õ;¶ß·nç¿{öAðF™imˆiÀt«ÈåÅØg«A¹¶OÁ#VG#zºDCoÁG¹Î¦òNùac‰÷®ŠY@O5—8öM“-KC©M»Ëz( ¢®§`ÕÿÖžCE5,«ƒ.$AÅgïn¤©uíЄ¾>†i<Ç—¹{G—âFK}°ýpÇË }<æî?n^Ùãvð,ôÁÒá;_¯´Öé¾åAeº;õÌóÖÇŽÖ¹çÍ¢|K^8МÉÒ~çÁ/^‰‹èR A–³x¾vŸøŒëŠ™¿XGñZǘ>OôÇHÚ#¹¨ÛF…+0iÀî‚rt…3κ7GÞsFÇñ©Ä¬Ë3𳫑GÑô¿í@èôËÇÏÆ—ù+b¬{!¼z¾ \†”‰#ãhÃzÉòXû1¦*¯¦#B˼0ØB«‰3 ÂQeÉ8Œt®œçÊFœÚÀ"NHfmíY¥VK–ØÀÏõÎE=v…}³;ñ,ûß6ÝÎ',i>¦3xÃíP¡À1V,×ë)†ÉÈxöÂÛ€¸KXsâ³Ãºí_P‘ýt»g«°@ÜCtuò³Õ¥Aó6ƒÒ&±¼áê%†^=¤F;¯4p+¦§E¶NÓ…’ÈtU‰dîØ1tÜr}εµ4…AGB$H¨™±ºôœF„ÆÉÔŸ: ôü:è¢;ç¯g,`4üw}°†%kN'øký·m0Ëj2·Ñ ÆÙŒ ú*!Š%DzŸçÛŽN۾⮽¸£Rý¤ëEל ·É>*থ㚗²A€îtàž×÷íãkÃ÷¹$nûl0eU·~SW}¦ÃwPÎX/5!Ôq¸ãêjÙ(^÷É ÝuQ!ˆ‰.éÛ°\?¶äâŸÚWcIŽçÊÀSÆñyìQsnÀÍ“¡HÛú¢ÚþKäùjÛ{æÖ°ˆÉþ'ý@ÚЮÎPZÚX¯±:k¥vΆ‡_—y[‰Ó±™õëÀµ¥É˜Ón´Ô<:Æ@ƒÑ(ÀóSøf…ëW½©ÿ´;¨§¨ËyÝmb€[c Çù¨JIÇa˜é¨Uуpý–¼ƒ™9Ÿ³X´Ç$’ʳ¡Ýþ‰‰ ö½avª.*oºÆ0î\{'$Öz±É0îhø8²®ä—¿eÞcê:éÖhÞXÚIsãÙÒîø’ÚÜEë½fÖ„’¹Þyf,;'3Ìß {iÒ³{?l„»wÒ±p§©ÙM°9gF¬Ç5"'¢ øú ¡c]ß½7‹j ø¯Âëù¥FèC840"V9ƒ´Þ —ûjNujœ³œ‘:‘¯T€”^ £˜ÐF[üÙ·/uâTéƵ5™1=«:×0z˜‚òuœpëùzþÁÈÄ*7 –Òõ€ŠÿvwÀ¢‘˜?É‚ÞO´wý~S bßq›@0‹¥oÂ5žLxèö9€T¯ç þ ¸¸œ¦³PtâG "òšÞü)cëTˆN8áp$>ðîõBk~Ì4ê¹ÆólEƒJDÞ@ïé|±ZŒõo6ñõt:¼ÛvmâakøÍµ Î¥¢NF`âà˜½9ŽùßLó÷KogÞa¸³në"”mÞ€€æ…Ç×;çªà¹ë6kõžÝ}µÏq:„E#òR÷4†»ž¬ÎÓ9¶H> Éàøþ/¿2Ð^8﹌¬ãáÎÁ@óG ËU1ž­*µ4ÖtV†ù rê­»þ­fÐkfž~Î~4¦î xþ­{!7jÍÌ9 pôùzñ©_÷Zu*a^Ã4ôy]7T·Æ¥È’š{êÂr¡0Ò;}åt æ×Íû0Ô|ä–¬âkM ˜ãÁŠ<¦‡0 ‡ÆžâªÍW·g9æ%ÏÁHƒ`Ø;ØWÇWîÈÖu&z‡KßÍ-§™¦¼|Ïj¶t '.*ëG5·ö>ŒÒC´”Ø:ªJn·<‰ù(R%¦èÐ’4·t€974ˆÀx·ýõÕ]ЧË#½)9=ÐOúâúɳTvOmènà`ûkÈt|Fx˜Gô"G1³ë,6”“W1?BšwB»àÜ ¢¹Cas¿/l}ß©#’oɉ¦¿²>}²…0 è`¨?~X±Gù­Z¸/CpÖBAzfÿR§5¼Ï cp\ )ã;o ©XŠ‹'áãC>'?fn‹h„º…¯w$:1í ·Ð«'÷[ 4&XöëA‰ù¹;÷r˜+Œ+3yR:ø™yœ2]¨1:NâMbnWÒt/}¢¿šÙš‹†[SŸåÐ0mv£'9®›4M”þY‚/Óå6“ˆLæqI–…l¹\´ÇYñéÃ:Ùh‚©ÿ/181?Œ×ýö õÐ;< þ6ŠzK"Òô-^4ìÇ—[Ø”³ùŒà倓R³zRr˜ß\ßs='Š):F9ÐNv~‘ƒ®bª¶6S3¦…·ÃͰX% %uþ‡nÝ{2£ ¡Ÿ÷Ò˜Šö,~aS|ÇQs‹_—6m Š˜Ÿ€ž`¨¢Ÿxlbº.¢#‰ Á©ªUB)ŒN?æ×Iáát㥰Ï^ù &±öÙ-¾±Ä,[ÜŽ=…Ó^Álà$Ð<³D™žø²"6=Î3vüoO+Í®8û4ÝÚ3¯ãI<“€¾bÀ+E@LÂkë«Wãë3ËiÆ&nÚm}g1q¦á<~ò¢Îð™·Á‚Èç³ãžIW ÎS´HsŽ!¢qµ˜©|µ¤HF` ª†U * é8g‹\ÞA—ÄE1uín2W4þ—`ý¬üå{þ`!Ö¼_špåè4ÀëQ¢# jRÿæ0®Õ±…Ç¡ d޵¡„@±21™ÉÌiä ’÷ÒOÀ2ÅêˆXŽ€nQm®3c0›ÉÂÂWp÷ &SBv2‘»xô|L®0TÍôå4uQÀŒz€Hd'˜Nö’O\&›fßv^ú/ÍDV‡ Ÿ¨ÛÐ ˆªq³}Ÿ·à#'B7à¤Æ‰õ™ƒ㈡ãkËŒ¼ánz߉Í`t‘®wFÂpB²sB.sÊO“êÙC”Á¾§mÐäi ½`EW/•gÕúÒ¨›àº–·C:1™É IËI#Ÿh#´ÄÚv™Ž¹¨‰Jp†Ì­u2 šQÒ¬´ÁHNȆN™«ÞES²‡ç瀎¾4,÷óD°7+S4`@œcÏÎ;ËŠïöþcЇ°8¢¿³çjtç¼ÏÅu‡ø"[‡8¹Wd×Aä5!_óèù3úVÔ“Íi–‹9b› ÝO/Ù:È¥*3/ŽÌ2°¡2M+Œæûau².?/·õö˜µÛIìÁ†ÁñMôh¢îxšô¥~MŒ ¶âh÷Ì©æ©P&vËΩzk4Ž# +~®››Â ®©TúI…À¼~$ˆ¯½•Œ kàP‚p×ñ_vê fßšãLt?ÌîÊ«æÆ÷1ŽKsW9N+­4ÐÒ£w.¾käšù£ÑûͧU¨>–¼=<‰j$´ÍDå,3ΫZ`™"k»Í3¤³iÛ¦êߺñèÒœ5†ö¨©šÛIù–~Q z<=®Ñ+ë˜ýˆ»ÜS?åÖŽØ7”Â3ëRC 9Ò*ˆp~NÈ{ôp±€Ø×$jÍýDgµ }Hô2=›§€îGï5³ÝŠN†ný×7dµp:íV®Ÿ¼ÌÐ-;Zêø$Lïûáã2}‚MOìM›  ])·ºÝ&6•O\[›‹®†LS“œH†~¨Á ÚÎ/5˜¹„îµABóÌC¹;žÝ>η¯9‘ç…ò{Ô婟z-%‰K+Cå“íßy*ØvîG -«z¯.Ô”I$â>®”>úFq4ƒœÊƒ£Æ·óxByÊÑe*tÞ‘Vç)nÙ^7 w’&H#Å9•'†±…<ÙùÏŒ yÒt~_ôÔäÚDÔ 0C‰ž÷’(àé¤C"ù:LY"sÌÃõ(~8^p¢FJt:ýQÜ?Óµ53{ÿ­¸ö™}2[šè¡)ô!lbžó=ÃÔœáDÕRù‘ƀļí¢S[4ç 1Üø—¡d+„x ÕšJöLDË.å±ÙÁ:H  "Há2w(û=IEÉ“¸Á½K9÷¢—xæ­÷Ä[¤·c™r-Cì”ëJ¸+:˜¬JLÛNH _¿ÑnÈŽBíqvEÙ›³OæÞ¡ ƒ Ý“ Ú)±K ³õÁ÷vÖÙý¶U×îý:—ÄÞTsð2BÈJ^<‹ÚÛu'¬ç:³´ëÂþ‘?Þ÷Š‹‘ÿÛÌCè"ˆ³"¤\) ûEªiR9ÆŒÇòìVo$¼!"hz¾eÀ²oⲤÝ̾„ZÚÐÙ™‡Ë£K8I NlD0Y[ür4 ú˜0ÈëN´æ4-<g˜Yæí`Zø|ªK@šS¿pOß®³Áùƒ×ò±ðIÖ·¥ÌÖÖð«ós9ùå+a ÃØ7,ñX.»iC5û„¬ïJƒ oý0ßBE’¨úppëy/ÇŸC?zc×à?ëÐôlë|m}j[ûK O½ º·¶¯H¡ó5/bêÔíQ¸HBè0¯¼Lˈ:«Ï†¯©>®çTµÃ˼b¥\g:÷ÓÔˆbÛw@ø@ŸñÀH§¾QæÜíR°5…¡‹pÉsC‹½W!‹vVW عÚèô¦ $¿ÍN( @#ÞqYÌ dŠLŒ„kˆñÒ£¶ùø?¾>F*ømÐQp0€zÁ€qâÉe’”}0;§7 ÒO¶¹Æ;WÀsÈ%‡uJ3ÍÛ±1v¾N€ƒZ’˜X \SÑ0J%"_U»¯JTǰ6Ú›7¡fÝ]ß…0b¥~’sëýrøÌ6=ygX5GNx9» õ ðܵƒ'°R[I'é÷ŽÑéž* ƨlƒš£Ë ƒgmÊ1]§š×ž¦x<íjý4ÆbSeø)!ƒ]»VTÍûݵÓfÙÚä6éù®Îóž$ìËŽº=Ï£êŠÛf` 8ï´¡„¼u}ŽüÃKs1@ZyÒÜw~õ&Õª1PwûÑkÊ K#ÌY0zò¡†ˆOæmÑXv5$Ym§Åê×Ûðo½«ZìtצÐzÞñuWH® Ýy³k£c™ü‰äDl!/~mxÉÖÍRÜ4¤.ÉEQÙL[5ðgªñÎÌAá@䜤YéݦÓ|Ða>¿øYЊ©-ÇPÃ2þ›TÉW9w&C Þ!ˆ:÷ê\·ËýQÇz¦¤^⨭(Ü™ó"sK>Ñ>̨¡OjÒ «‡X¶CrZÔÏð¾ìø•*{m‘çaî{Bd É1ÀÒíUÍ»[Çé[Sô!C\¾t´¨¬ª\¶Ç^ÉȤØt‘ÓÇánäE„á%£E”ž•Y-¸µ¤ˆà†N@·Z°“•Ø=ºZkRæ gX#.xÄ_õøø6‰Ëä—{ë1°Õ[¿Aú´¢kU6PÈCº·%ºÙ0BZÄaUÔ>ÏŠ!¢NÓª¢Jð1„) ü‘_ÏSŠ=ÌRÀò? 5Gæ$ï=$ìcµFÖþÚÐ… $$Ú%ŒÄ‰Lþ xüÖ¹˜ÔzV4ë×ái9©È™´uR’ZÆÈñG[ 7'õˆ©X|5wDÜžP +(Rð`“Ž’ šý&<äˇáiÞ~KÂî¨ ÌXr: ¤˜ïÍt³j݃×9Ká´ÛâHVp艞A+JIŠlô$JN‹ žÓ“è²—sd]hséà‡ôlr&ŸJ—íÀØÞ6€ª¼2W‹Æ‡Ð&«`¾YÇMGš{¹ÊÌèg,}i2ÉÈrF ï΄"%×Å H÷ï£4)S¬½úšžcv«´ƒRÞqmǃ UÎÁ‡áU øÛ¿6jÄT²"þ¤œH£GÉ•q¯ÛÒú¾`÷ßZŸQˆ)¶6èÁÆ5B˜HEÖ^ÈKY×rÜ£9™C=PÜlû†Æ?3¹ Ùum|;< Ö®ë &¼ÈÄóÖÎ0˜®›wD#;|V<ˆ4õ~~…pF¡¶ŸÈ: Îu~)ÏÂT¨ààBd!!óy2Ê×aºš±½‰Ô©;ÞÒ’†LÂP³ý°nݶ—ðGc‘J[?xGt$†2„ݦLIž¾KâÑsDµe$û³õJÒ«Ý ’‚µ—‡dëÈðSrÖ'Qe£waè‚¿6Ð Òc|[à€_'! FÃ[°Ú’¼S{HÖ™ã\ºž`ƒß‘­„j°Ð(bšêãðCU!UÑiG’œ‚°Á{Ìçu˜ZïÙõŒ/#qšákô‚%Ýv7¶tàñ †§"ÐõaÖÕ„w& ˆ²¨7J5:b!îZ’ˆëÐìÂG?52ðEØçTš¥[ÒyȾÐHþ—F]y:7›+Ÿã‡€ }eˆH$0¬ Í|§ÿeUÒh.+À¨o«YS%èRcÚŸE=¸±#!Œt©FÝ£•)‚ÛÚÑyFã·é­ º@RP3ç)¢ZÞæ°¤óëí‘j…7b(ñ¤ž7 À Ë*QB¿“?·Ù:è‰PÜîà”D'ÜÜÊž3ÐiÔeÒ xæžé}kú˜ìÝ©¹È»KEÕo¬¼ð^4¬vMw§Ç5P?tFTn”Ì¿UíæÂfá`Z4æ¾&ŒùÔˆÊlÔFÒn4ndÚËŽ‘3¥*é”máQ¾> Õ1öHÐD¶Ê¼Ýmhž×`ðf2Ýèò¤ÔçEAðù–¸EOh)zyIâ¹ja¥KÓž¶GGwþÐ?[¤b áëýf;MáTh±;t`èo¦Ù½L[P›³æ;à v¶ÌíÉ/Bjœp*5Bj¤¦o<ŽÉF…ŠéÖ¨°a1þ±<î W¿>ÎG àIHÆNötÿc€ µól—Ôª&üwt0zn¨rÑÔ³æú„Ô8Ì ËßWÔ£^Žî÷å>ŸÝwF¡6ÇåèÛA8Œó`¿6ŸÄSðFbÊ¡àÊeL{=°ZNçî9°xaA€<w…´cB¢©Ó&ª kHàpHH_:ɸZ6óÁ‘rÌœ§ËÈfñÙt}Æ6äXR9³×L1ÂÜ‘®ªÙÏQ@”~3¦­éÞ;v£ü˜txøxˆ’²,ë‰\ºÝÄ;Ýá¾Ô¹Ÿ Zý™Gݳò´Rçœß@dœì!¶)d¾¶ßŠl¤Ÿ…~+xÊÁ1xFâÍN<•kè&ØÖ ÌaS~Ž'ƒ*ç'H¸Ômä‡ÀØàÒ¥èz¼4’ÿÈÖF™Ö×~[rWêäâã¾-­Áµoœ³m!Ü·Ä@˜CÊõõ7šEÔfJ/NÆ£ª}CÁ»:] Ú4m 3ÊÂà¼Â;²ÑOÐ1q®€^‚N…<áBR:†2•ÄDã­_Êp+•ž—·Wí5 T ‰L ý±–@F]>ìºgHß®g‹ Y^ •¸ÔTí+ij:ÔÔI‚¶ÄkB‚¤ëg,Ç z|«£ÛQÍTÛq[·¤oè´¶ÔlÔ•uœs¾OŠdH¢fól¯S—“öiË.‘ yH cÐ;ßúÁo¸ÿ:€Yªn]MpÚ¼z‡hB¥íbvãÆ>XØgçaï˜ýT¨hÙ ör"K mHS‚ÂNå^«ñg Ry´åVtðü@z÷îñ¾O9¹ùB©cð>Kø1«f»"Æ;+¦hÉ´——£ z<Í#6G!bʬJíZõ™iCáÓ©)–:Û9Ö!ÇúPþ¨NÈ‘ÅtˆÓ&(@\ègà)º 2D‚ŸmŒ×gÖ¦n5åÀx‘žh“=;pÍõb×’™ü§°×TŒÇ"wbmðkžH¤ÿèæî4ÅŽ ÅªOTÆy(76òa»/6Ññ·æë4…L‡BïCÚÄ|ÚIŽßÃŽ‡“ùç9$"θR³øEMƒʆ¶;ñŽ •Ùt·±§½”¹ÓhÎÆÖÃg\óI@f´•7›ã*ÅÄ¡:À»<,‡Ž7$äÑúÄ¿èO½EÂPK`’X¶ð$NÁèËò3;xóÈÁj}Íônѱ>ˆ4(E0‡+ZQfΟä¨GO LT;Éx09¸kú we;¶³9oÌ*""ìs(|xæ†7âÃÃúñ؇äÜ* Š¢HqÃj9V¦qŸðÖZPŒˆvÀN1CßÄÚ:£“mqÕÚôU—<ðN'0M¬*I ò‹ÞQ´MûÃúÁoÆ¿1AC±Ž$Öíc1&ý¾¸eei 0Q&2À‘ägP&ÀÁ…é§?jØ3³‡EyºìéÐæœ@fiò3H¼:«ûÛ™15¸:íáYieí`SI·Åã8ÝÄKÜ>×|p2ê}VÆvNµfôæ8„Ï­º8³HÿáXmüÙY ôì28¯£"•^BnBÈ)‘G+–Z­¬pREýÂûVêï9{öŒ&é*Ò$¶ÖG˜™ÏD?BœÎ“ú<C?1ò¼³º@qAº=4z§ Ÿ÷Æbxß§xæþ¶5Û¯òx•ŽXŒž³«ì§€ˆO´8ªž¼=ŒÊbJÑT·iAÕŒÎßàk*“`H ç¼ß }‰ Bµ¡ðŸ¬éòk•„zJX ÿ¶¾ø‹0ü}Bš*í µ ° ÑZ3.ª‘Û×® ^>XJ0z#ͦéu…}<ŽÎÑ(«u…'I8O„P‰:×m®µã4‹ÃRN7E7á_EÌɳ¯ç ÍMÈ­½AÓºRµ.¹Ï‚æ´6_;‘ó:«Ûþ¼!+L’À¡óOù¢ âÂŽàU9߬qJd1¿e×2ÒrÇW!y2ŒÅƙѧzާy•ø–~Ù9Ò±ì1BrB®îJæÁª¾Æ4±kZnjJÜŸR¥'¹tŽZ,T<•¨éû@ù_¼ˆ­àÓðˆil½ÛZÁá™­Ê_ˆì òÌ›·V)[q¡“&÷+x/¾´ÂëG,›9uŘÜt>NŸ‰–ké̱\¿išF‡ÅÜϪuœh?çD.NQ€ÑB+V>àâ;àž{FšŠ(/úq h Ñ##ºmÏáÛ„ <KY-;|aêÅÜ*i&…GSºQX×L¸Ü\Áë ëoÊþhë ü›—áõÒÚ¨²ˆš5!›¼'t1FËÝ€ñR¸4˜ö½‹€ÒW™èÙG_æm-7²]m¥»Ç±h=ŽÂg—Q€+QcèL?Q‡tQ§ ¥3¨?òÃ|kˆŠ'Ÿº”¬Mi€t¯§œIÈèëX¶ʼ-ŽR› ,¯7ÁÝK=P+pä§œüâç„)¿´ÔªÐ=FªF ÚžC ißò××±nà=ÆûZ`“µH뉂QÂH46õÆWÞõâè¸Ö±"-š×¹=òÍkm‚Ñ#ƒÑcm˜§®yî߯Ptd@¸bž f>²›…O%ÚLÞµ_¯³˜±Â'á”%¼4¶ÇxÂKèC2yµßy¨°‚-n €2yìŠÎu<µpüfõ=0€ý™.È$ÏOSýL)—íx%àL¤|ÃÏÄ{µCóv8¹X,û+ï¥ÚÕÄÏ¡á–p§¡COÇíáxÚ´nBÁÓh/ƒC$?›Äœƒ ;ûéÆó¨ï,—4žÁæÁ *n>ÆÀâ‰I›„JãùÙt@žþžI;ÑÈ…®ˆ³s¥„^`Éž sÌ`¯i×G\§¡Ç¸±úèÐ~ì<³~`ÒßÛ û|¼ =1xÛa) Éâ–]‹@ƒúN!ûëa\ ^䩃Œt„ Ò ¿'ˆ*MÏæóÃ=õÆgøÇkíRŽkËøFL«ØÞ•›µ¼5Õþ*û3©ßŒi—ᙄJ#òDD‡weðr𠕤öX} È$vkå¯ ±ôeÕÃD¬JȎܨVšˆuÜ´~Ûwï§ ¼ñÐhä÷xbFÄ1¶Ox·¤GóîÑþíÛÙNe+>„ÃiLljç/9‹+lÝ8eéë6%í¦4O$aéEK¦#ÉçIQI÷NÝxd±ºK §Ñš<>(‹Zz†¡ñ ÑYœpa™Ý•vj¢W¡¾ ˜EÀЀÅѶç4µb­ÜÓ +¯-XÉ7ß8ËÁs†#CBÔ×èá;KÎU,˜ 2ù9Œ`öe¶Îat\ç¨Q­™m*q4Æœ‘bW æ¦c5{;k¹¡gÞþÅŒjëëïòê¢oþ“=›ÓA£ ܨ ú2ò§ âmaÒBiPà3]9ëDÎ,A³?Vf­-`µKhg`;ΠÓnëþ¶o˪Zš]œµŸéAÊ‹Lš)âÿ „pîÙ&4D™f!æLGá¿X0•P£ËäK«³(:¬Ø<âcë¯ÁK÷Ådû2agñ|ˆ3Æ ó©×’O¡ÛLæ 2½Y8†Ÿ*rä‘ån¿¦H=Hr¦æÌ8cd7¹æk ß°Lå]ÞC³Õ*‡³œÿÀ¤šYöh¶Ào!’™fP{üÇð¿Ïp¢O(TÙJ߇tþp°P±g¯âܬïDâvH70S¬M=zÕQpÎ%™\È3[=ÔscKdUæ½ïË2Xë?BÅ)W>CVVn> YÌ úè}ttâÔ–Õ-¶~í䡹·x G´ÚýƒƒŒ8ÇlÑ€êËñÆËtø7Jt|㓊É`zY¿qZ"œc¿{ßC`ãŖg¸ai¨œ*¤ï¸Ä ÈíÔ8] HÞu™ÐÂìë&SÞä±^ŽƒI‘;–Ô@ÙGr!Dâ‘¡‰ZXþ3Æ28Ö¦M†Ú>á³o+§6nt‚ïÂ=VÞvÌq¤zhKGÚL¶B¼o&ÚJˆ¶ÌE™÷#?o}IÎ\ƒabm%\K …æ÷)(©ZÞ~±_Êè±ê@Û©k|8ÅÅÔñéð]o_h&{Ê‘‚úÙÞÆ].L5N#Ï ÓP|,OÖ4 ]{39B¾x I§0²ùï\hãe0€d$U`¼Lþ6+±* QøXÛxÆ}^7Ó;áÕ”å#ƒ\„›3⓹Ø2ˆ/6/’f75þv}&Œ(eXxüy¼dúóòQ@÷q¼eN´G0+A·öâMˆQØgM¿K®º‰wÉ< z—³a ð¢EÙçæÈ*Áœ•m`êj£3…+t¡D#%C&4å1óªóL•’]™Þõ Ô°*å¨ÙèÌ;r7ôÚ`¼ÜÊÏ“Ku ²R‚WQ)s÷¨š;¥º…Rª[xÐßKu ÝÀ‹¼/¶y¾¿ä6û EïØì%ɵ^»½'VöR‡½*$‹nÎxn%Þ=çoœ )T¶S/±[q¯Íé1õ˜`£ŒÕµ÷0“f¯‹éü}Œð~ÃŒÌûøðãXÞJ;¨Ç7ÙÿÎú÷ýÊ g"ÅnE¡Å (ÚMäwhýj )¶Ø„»‰Oç8gv¿›Ø¹ñ&ÂrÂßw!lµÁ›ñVg!fÐÛÍ{$ôÓÆ=º¹vt$t?¿÷û|”2|zÀ2ÂæŒHuØßÅÿÆ­oÂFTm³¶1çû‘ãýÈñz¤7q¼Î‡Ã›sþ̺9M‚Ü)Ó›¿Ûùº$q0×Gb!öÙü#Í~$>A?"||¯ã ÈÀ†0ÙDž9±7ñ£A.Ö'ÛÌèü»øÔÁR ΜW;ÎgæHd7¢K4úò~ƒúx «‰–д[({SuÖÈž šö&vxMõêðºÃF§ƒAűÏÇ©ñ|[p³ÏŠ›©®ó©÷<©ÙçEÅR †]­j._|Z•Ý¥fEÍÍú+7ǚǵ8VJ _ù¤J±qi]¼«)⼫Û+ÇCõ¤•Âc–ïðyq»ý}¤ºÆ(/ηÆÇh­¾œ×Òv‹kåè7×jc©Ö¹Ö8/ÎÀÚ:нW¾bmûà­!TJ•í ȵþ`Ê{ÂѬÌì¼ÏQ'Þƒœ>ŠtÔ‰Üäµ:s¤I7Re\Æ.X&ÏiU•vFU£Ì«aµÙwÖ¹‘_c½•Ðk=v¡ËdeäÚ|Ø5îôaǶ¶×°k3 »—L¨&@r±6É>-]í.™AŸ’ã=¯Qòµ¦‚#®©µ·{¸rͶ5TEau§/¡Ó¯ S§ŽÇÕ:RüVÏç‡Å?Ô¸TC0i¬ÍaÊ|Î<÷:È31¹Ž8±cj¿öq>6eúÞÎ¥ûí9´FÍ=ϲ“™ùƓϻœ¶B€êáê,ä‹oÅÕsÞâ-®÷àˆ«­<®DÅeGžj…ö…/lBSÄ6ÄdzçúŸ‘z.>ú$®ÔXϾ,¥w'RBSàZ¨aµ&ŽTped¡{'©:`‹oÍÞ•WƒéoO#60N6´1Köfæ›Éƒ¦5KÞÓѧ €XY¶ˆÀÙX”$û-%ÎôE6»CŒCß˨êI±µôµBŠîã ÒŠ,¥\—Ó:u}¿æ’WPW˜¥\‹?(,Öfè{Ï3î:÷Î3„ß”¨&×Ì5-1çÏÍdÕ§¬µ¨²°E°odƸދ•yØoÏ·ãLú˜N—"úY±¼‰\ò_¤¹f¨*Ö~ pqe›±\ßöäàÈá öÅW'•¸NÙÇ­â@„‰˜y.¬´Ðžo[Ù_í»^r›v}Ú”iò¡Ü€"#Ó÷¼ŸhHÔ} 2&÷ørÏ^Îb°¿ÖYé†ÈÙr€÷EÏvS)s¤×ëú°‘ót›uÓfÎÇý0A¥û´P}Ì'ì8ëNq¶B:ÈðÙÚyFyMXN©á–%"ÆFÖpJâ^cÛàh<Çüþ6ÔžqšøÄa?æiÿ°žÃKS*žÆ«aQ8€¶»MómÊQm#õz¥É«µCÚßxÅÉ.Ú‡d9ÄY ;?Pš»ÑÉÚ¶q1õy§_A(‘Û^ß~ ²iý ]/•­%ûâ_䥲µd½©2õ„»ÂŸƒU¾¥Óµû„묽ž5êô í]“hµti{\“ÚÑQç÷ÛÿÔhw¨ÿÉÚt“Ù4–ÍÁÑ ÙZþAS£§Fõz€-»Þ…©Ý²Ù¾4•Z¶u‡´“ÒÐ4ã:Ö¸¬ºˆo”`õvÞI7E¬ñ×öu?Ïd>™V>UhÐAðêébëtDSS»ÜkS÷ë7µ;šþÎm’–MßkµÆãPŶ­‘lµ;Ÿ¹òÓRqm®ÏÜ*ÌË4ieØR-¦&fP4ä&ùº^¨Ð¾cÈ™Z›jÆœ<މc5¸—1Ø\º4·ôá¸tGDn&]¨X¼ -üÖ²÷ëa`Xȭ݃YåŒ;’ôÐÔÝ{ô·f+6rÛ̦-® CëQ úZßh€æ`üA¢ø2œæÜ|mmðnØá,xµͨ ÒHñPÛÝ÷/ÿW~: ‡-†ø,Þ{¸!D‰Ú6äRm_ÂÀ Û°…´ ì ¾ÈŸ»õ” Tϯiîæ–Ð%áҥѓ=Í«¦ Ѭ·(i ´i«xSÑ2¯UýüÍÊEqÞ«C£ý8ÍLëÏÒ<ÞuÍ}Ið9œõº–ý˜{[žÛ]²†)Ð÷ì!¡–­œA ôg¯·ûeºR˜ÝN#z½Â‚ßSŠÇuæ·¼Gà­®ƒ‘Š5›AÔÍ£µ# 2µ{]ï”1Oº§¥.F=}ºe(sÀÞpß%‡ÅXèQ>D»3»g×cÇómî<2scS‡ò¢çOÕº’‡”{¾\3½¨'Ä-ÝWGSm3Hh„ãT}±žêT½e2ò¾{¹pÓï‡ã³ªåBôŽö (¶tüð&v–è+G¼Yó4ý%ÐÀ®°6¢*_¯í~×väÎ^…ß}cåléÊÿvÏ–Jº™t/Íœo»B¥«P[CîrAý:MêQ–¹›ÁÍÀŽàŽaÓ$ó.>ç;7[¶pǪзG c¼qÖ·í,Â÷<ÃÖÄ­tÜ«WoÁ³uG›z»£M€\åÞβ£¾Q?¿?zÑ9Î5Õ­Õé8÷cƒû=ÎÔ9©ƒ¼%皇½¹ýù2ÞYÿ·»’@o¤Š×NV¡qh-T¼"½5w’ÃÀê,°NA$¥«¼Ú:\kÓ™.½úv#ó!u±óKÉkfÞd¿ÝCQFw*à~?Êì Ám¶6r_ïÒ±3´–öy{ö‘nžû–8l ðBÏË Óaæ ÷pÑÚ_žÐñ”«AšŽçö¤"œ•Çc‹ààÄí&£Á·AŸpµ‚@•`xù m¼`Ò -—¢qí‘c¡®}3P)¬ÍËþt€iP•¦×H—³„nhpŸÝV#”ˆ‘Ôk ¯.>äØž°Ë¡:5(¸‰m˼†>V8G鿼ދ™?ƒ¦QÝз¶#{—%žê’A€=œŽÞ9J4‡Î  Ó{TVLùA07a>~²øZÀŸwðD y”Ìm•A46F¹Ôðñ@,\ïµd=6êÝ‘•Ú׃7ÄfF­ö‘Á‘G•VØ]»‹Ñ8@xp™`HxL vK°ãbãJX2Ã,U¢‡˜«§·òÂy»$›^ï“*×&‚ô`m†_¯âÝÑ•âl ö>ZúìhýC5›K=B"ƒŽ¾“ „+<Í´ÂQ2öÒÁI›yò0q–“<<ņ‹EXl8f‡Û;V¾;µ<ÓÝ×ÎæÒß°_‡^ÙÑÎÆ‡.Fƒ8ÎôúÝ]\ÃnC¤ñ¦LlÃõ1maŒ{3ö¾'0&xÖ^ü¢’'8óhUON³A>)œxß1ãˆQïx0bãðQ˜ÌKMÀ`ÌÃãðƒÂ`Ö«‹Þb˜+Ì SuÞº,ýçFþÇú 4?_ã6¯ÐMÓûqóÂ5ï±zì¼eÆûäyM´%ü­G¹zr¤î—§äëzµå´—2oˆ–‚l*Hò/'©ßàJÖÊòSàeZ»‘ZÚ_ž2­—êsiWŠmp9‹¯<5èóº¿J`0™ûå©â÷Ç ÔK!Mæ?N±ðEø•«³Ë³EÄ>9\Ëœ¿rOÁ7–r/t¢ßKx7¹ú[ð D¿7ý‹íu|½¬€í`mð‹}"š*ômÍÔ.a´øÓþf :2!¬]Î;犟ۢzVë_ž– ÑFü,þÙ ’ù‹gð¤û—'¨ƒêã´ûÍB‡Æ¹ÔO¯v=y« Vü_˜=§ž‚µ÷(N…U“Ë—€“âÈ);} »ÖÁYmDA¿²0ìq\TËWü·0=?® ƒ_IPÜØÇýò “L_ké[ìåYðœpßøòð…¸#§ k?†= x Êc^-ç¼à,œé³?OyfŒ)–‡rMp0m°¤ç¹ü:%=ÁCJzî¨'áսðqÕý[@»_ÒóáXûÚ§_¨ìÌ}‹«……]í¬·+¶&¥ãÃâí©±U{-Öã·DAÊ~IÉÖVÆcƒt›tnÐÁ^–_’É–G]×ÍÐMŒPÇxJºÍŒ-ŵ3˜,2ïÍ ™Q@"P¿X,±€ $Ë ) a('•c÷áS ¸)J²Ù¼ƒá½d¸wñ8㌉erëCƒýîa7ä òðJ²ÜI™ù%µ8 ]°r‘¸0Ê8Dùi¢2µKµA~Iý:߆/^ú¸:áÄ?R¿G$$ RêÙð´@Ö¢n½yø"¢3,Hæ˜ T¯wG®1JPYì-‡¤ ޤqYJ¥¥y²üÿ½RwãW¨¬’Æð9 yHUó¨ŽH±\›Ï ñVUÒüTæ—ÔYÙ_£j ®0O,Jü884MÕÚÖÅ÷¶)Ñ6" ZRÒœÖy lzÆO*3ósüA÷%›¡øç3iöŒçý±P±ëyÒ5)‡¼‹´ ö —Y5é¶Gh¿Ä æmNÑ‹VÈS“5QèGÞóÉŽ›c² {mð+1m[Ì«%fsR‰{«¸ ]:UQ;]’-rPŠ’bò¸CJ&sp.ïW¤»}¹ë¸©úíì[˜3/ŽC0ª¶J¾\Û%³ªYÑö´úý‚€fÖo…liÿ%³ü]ĵ ³äýa9øpª…âÕyñ•\\Ó|‚s〒´­æ‡­õäN®îŒN˜5@Íð( fÅ›rvÜ¥­r³¤Éå˜Ôé«-ßÌyo†X]ãúmšˆ6( ´ àƒÊˆLù‚úKeDÞþÚk}É$÷¨2æÂ{½¤ßsf A2ëø¥#f™æ~w1·­#~ÆöTs,™EÀZð¥¦[Á™,¹u}¨(ÁâZr»I%…â'XjÛUX@>X²Éº}êðã=»Œ?o A±–kvn;Z ²ð×ÞêH·”>~á ³À·Ëj›Ëý¼X÷VO÷0çýÀH¶Äà&^Kyñ1˜V2‚¡C óV<µÞ«ÑA?êf.ù ‰9ŠðÊÛzaiJݱG œ’¼dƒ‰AmLâéê¶—ðz¶¦ _q\SÙ,´3µƒ‚l÷’§´Ë-þœPp)D>¤[ÚQ®Šš¦†ßZ+òã×F?òä;€úÙNQOƒ9eMÑôl'ø]Kyì#•çŠÓ¤É—âa‘½N¼²¥Ü”,$ÿ N¤ËHg­ ³R RÔKI—USèÕ’ýæù·&;=#ªmk•ׇãí¯”÷B_RÞ£Ž²e$u”’oœ,KƒfªàÏ+ÈÀ_;ÐM™jDaø Òh\¹]š'RÜK1 °~eŠmÙ–r9½è™-Êóô|ø»^6+oV×í‹3Cu‚Û#‡ øµ™|ß²Ñ9õë_PoMèŠ1Í© ¾”ê_LJ¥Fô¸½’Þ Ã—&„ê­)®¾ ͽyiŠbNDÖÙ²Èt/(Dƒ½k—1±p¾ÎïÝUø²ÚEÂÓ‡\_'éc§¶³jÐ[ô¡üu÷>!á½”*‰šº~uw“1•=Ø’H4/žP¹ãÅ.Ê1úJ1c¥IZŠ¡ƒuÝ¿QÌêe„šƒë9«,'‘ðÖ+ä Åßí.í¬cpw)êñ tu¢n5KÓ×UÍ*碇Y°‡ömïÙÚû¨ysº„3(d•´`ÇcW?W½ éàÕQ*rÇ­Ýqmæ`v+m5ù—6›MÐ/¾{ÓàÀ.˜ƒ.¶XW×qσUýVñ5±º£6utYíiRéÎJ®.©Zîëñ2k­(T0ÖŠûðÓÀ«åø6 †}9è~Ó•Nø?ñ3pG”]¡/K-7ê–aR_êßêEÞ{©Å´ÿŸK]AU˜RÝ¯Š…Zû ŠÒIq·“ë±çÙ¼$I­bó? bhÝäShÌ"É¿T_Åñ™K—Ä»‚O,Nk­à¡ „‚QNö;XÁa™ÈãàP²¸Ä”˜lr¾J:Qö±Éûqs§ô°nØ3áoRÒµœ ;~m̤~ú*×îúýÊ—+L††ÅÑóÁ‚SpÓ‚J>{űL#Ÿnª7K2ñ+|¥0½fh2â‰1·¹—£¯ö¹ìJ¤Æ—“;Ãû.Æý®·µdAá€ÒµOÓ#0ÅyŒŽdþaì ˆl!B« ™¿À“S¬VV—ÂrR¬ý{h|›ï³Hqu+КVxålt ]aʸ£Æ efðg¡qaj{ }ÉùNôÓú¹§uë§|ß €aqIòk2ÐÁæí"b.äÑ ŠiNÈŒ/ô°FÍ Šv9Ä.…+ˆ‘ °M¹ÅÊFF*á&í‰"žOC*ãKs"¸®(_Ó„÷"—×;Ò[SÂÉh-.'AþJ¥9Ú‡ÊÄÁpvA@I3´O©|A·L4„x! `Š[&Br«Xš™ãø:Q¼Nz¬írC¹)XÚõþۃŒqÒïþƒÐ‘Þ掠Nó«‰û/2ÑK$¯ÀYÆÊ¤VHG*cCò|‘ä‰A»’!ï–ÃáöµA†E^™¥DUL÷\È%DŠpR»Ùƒ’BDæ+9—!ÂíGzü[SEtmDµ/dîai`(ÇØ+’¹™ÌÖÃß·ÍŠ¼õÒ„KAfüúûv{Eˆ›'¾~“ñÇU"xÌŠ§Â—΂fŽr„õÀE3¾²JE*žå8ÎÏprã†"Ùô¥sæ@ðt1HU,ݬ”‚XZéÍìPúÀÂ+aâ”þÂ9$KZ) –„xâ~ƒ­÷ Å{Ø,K ~¢¢«DóŽ‹@N|éÝ^™ÃëÝ3¸tÖ›,ÈY/L”œ4T¹’Ó¨š÷n†C*ç-v<;ÄŸšœ£µ ¬´é‡æ§nÕ‡ÃI±ÄhÔ² Ÿxÿ0±ZHž  >žÀóma®tr=déx? 2ì×^ú71ÕJŸž`4gL@.Ì‚ ÈLx¸Á±`r†§–îF‡ß”D6ü[ƒBÆ|N*¢n= 4ާ¼oVHñcÍã $¼¯~hJÈ($¸TßÎIfïÇn<·úØ|8QtcWQ{И#î.z‘u»6z½³Ç<–“ŽªgioÏRAªùÚpÅcšË0s_Q{7ýQAûÚP]BRA~a ü–ó (ÃÈ &cÙ¸å .ÊÈ3›ýû ¶Á^8ónÞL&õõá‘ãB=A·Ê:L,cc‹Â;pú¼Ò:Cö‚Þu84†ÀˆQyÎ*© ›½Ä0Õ=VÈzg’¯5 cÀ òEujða56}KfÔ£èM}Ÿ—ÅHº¥g}²æ­Ó§©Kéç©.-aøy9€=¿=¯ØN0Ö-ÄiJ 7Cã%·!8ž#µËÎv¿¤ö8RæRì†"¿Z˜Ïõ~XâF{¿ô®¡â€É2‚E“ƒÄ…­ã&Gk®—ê!¡võ Áw½©éwˆDÄ㎕#§nmòñPY¬^6ÔýÎX-ƒßKÅÃa,¡;zsïSz”Fpccôyß-çü稖d8/cäWRWWa6ü V†„ù‚\øHN±v`¼ º&s_Æ0í°ã_û]æx”ëQŒ¶>fZQ„G¹­¥ =Åó« «3¹á¿ÓLÓ2bÌ דg…­â©œeX ^¦/83sÛ‡ÖLв¾¢qn¾ `È/ȅ磿¹%T˜jŠ­‡l] â·v+‘á^BF<ÉÑBg2€ìñ jŸ¡ §:ÀÌ!†dùr2â ®û¢gÅÚ4_)S³®hêqFe‘_˜Vèõ +PA.z™îcæ‡ AʳÍíä>^æ!À\ýezšJÿ› ×™{T"8£#`i«BH/ó€)ÿYê&s_Bu2²¤á@ FË,÷·‡+mMZö ”Gdì$ä—YBª€Hdć\킌xËÕÞ¹eî;o™³ÇŽÑ­ðÒ2ß”bEuÁw"núÅn*bº·óm(÷Ò¦”ŽPµ)®@/O<’ã‹&Çd",8Èggàg­L>1d­€J£L3h”^¡{V b4^QÑ)!çg:ðd<ºèV„Ïlæ3E6}‰ŸAxü³7'@å+º·¥UoÆ«ÂD†Ù:»æÔ Sâ6Ò¯t@ÕFŽs­ê¬.§;óÇ+ŠÙð!Zèìòš¼\X<ƒ¾À5¿6‡ £ ¿hò|PHhYM·qè¶:Ù-Ç?üïÌY?TÑx ¤Å´Š'e2Žÿñ”q£™ª_¦Ã‹×ïÀŘ8^xó»>sZ­nOiù"rZ‡Þ\Ù…Ùõl–­i}HWûÍ“¿Ž¾I/Ö®îNe×JèTž¦ËÕG՞ײ«p¿ÊDúúb^bL–S³"§¾Ômʼûµ‡^ð¯ú(EŸ¹zêóŒûz&aâ}ª†*róë“vg ü6\(ê|fYÌJd䛳]žžÀ¹.n×óoØÊD(ʾ¹µo®„Š,ûúd¥É¨Èä¯HÄ_»’-ý¢rœIëõ l‘¸¢Á~›öõ±þ®H»¯SÜ·|S¾«>[<ŸNšú81dž‡Y‘Ö]Ÿ»¿˜H¤kN}¢/@6vé†ïUä1¯ ÀV ÇU¼> ãÏþdIÙšøý3ÛϋХKwYA}jp…סUpéËN;U:иÊÍŠö.®kJÇBQ)öõ[¶7ÖíÂR¸‰q„­Õ×Gܹõ:_‡|Å ÞPðÞÒ©’¾øY±¶ÕG|A„wÁ—éŠäòê8áŠæ>Á‡¯O¤‹¼ŽWµwͧ"¥¾zúÖãhÄË«úŠíƒä©"§~-/(Ã>Ÿ+¦{¤áfH.^ßÑE$i¯à¨Èï¯HÒ_á¨>á­vt=ùõ‰S“·8BCÙâL$j°ÝîA‡ÈUÄ¡ëÀa󢨬&ú7hf€11ˆ|1Õ#Í fE’ýKªHÄ_gkKô阞ì~§'Ú7¯èÁàr4 »màýZ6qëɸ–m¸=1Óýå'7—$à6êÜy¹Œ­ U¤×—æ“ù÷õG9ö**–d£Ø9îÇ›¬"ýy€ ãµéG”W0Ôôø·VJèj­"Í4ë—ì~<_ó é÷5%sŠŽX¦¥ªÿ¦ O¼Ã¡šL°¬Ÿ¼éQs*SM)* §¯žìË3 «|yN/¿ã.鿽7éù5á}…û¨žE>ñr©1d 5eë ˤ¦K®ïbU#ê5‰÷ÛáSÓËœai ÑNeøë2âjr¿ëÚ[Õ9sh3=¨2©y– fTMŸ±ÿµoœ»ÖT4w¿&;‰Wí5/[ð pbñ&S€LªÉi51iòræ0¨F£$jRŠg­ÈʯÉ×8Ñd¹|õ–þ¤F@œ!r7ÊF¹×$÷•ëI8͓֕Ds…‡ª ð@U£Ôe|•šä2À•ª{è·“°¦›fÐL“Ž˜vOÓÆç2‰ûL5+%¼"mÌÓS±¬Täí¯MãW4%¤·ÄˆMÕ¨‚ð6š|€ŽÇ*™îáà٩ɸ#£äÞü¬C&Pàצ;ã+tÞ¥_×wG iœ“_±&κq=o³ÔÓEÕSðõþAiè‡^£§&οÎ3µÎI,= [“ò7´)ïøŠ<üššÆ‹O ­ÿâkdÇ+_¡4©a^ïTzjªÂ÷kâ@™Y=5UÓñ+Pºõ¤ãs$açtá j‹š“¼Y‘Mk*ÆHÁ¯Ù)Â6)@@bÔl€Šlýšû¿Â›¼U=ádQxnT ‘_ós;wY숞Ϛ•ÃÆ/žÎŠ ýºSòáÃ&’+Þ¸5UXÐ~\.ùŠ”ýµ¡X…@EJEÊ~Í©›Û/ÀŽ;tè@EV~Í–4IWNÍ7S…µÉ¡´ÕWV¾ÌîVæ½tÄVÂȹMÏì ë5¹fJ–¦«(ôk.Ï}¿}éðïUxñ*rý×^Ú ÈͯÙcƒ¢AÅÀÅCÝùõm 7—O#˜Ô5+æËT(fL{W$è×ü™²›•YùG.·âM®U‘¤¿6Âo [©û5k¥X¯Òæ$*•©•!zEggPqX”>¨8ÈÚ¯Y\’F(Œ ’æÝÙQÁ«NFðšÍ_V‘ª_O:>Z ›†õꣲ’9‚Œ ¿‚,¡fqG3ÑÅæù©L¼4œä¡wú©Šœüš[±§’·á­"±Â´{z*«Ò. €šG1ÖÜÉÓ><=`™úF”»Ž,ùÈÓ®Yù_^KÓ+Ψ"]¿æ~¢œlXÍÝ=‘“dN· R¢ƒ=K0kï\jD¹[[«fóC#Ê ûb(š/yÜÎñA\@6ßJ'ÍÏU­©¢FüÚH óªh’[t^¾Ô¤é¯Íäg£¿˜#òi3v ¤_ö‚_Ò/Z©šCa(5yÞJ‹2ÓKvm 1œš?¡5OÈ=bwÂýú¡ ÝHËZžK l ¢^ýQj2{ŸÉú¢aÂqNÇ"Á+Y±ŒŠóZ\¢oÒñó Ž;«øè—ÒƒŒýZ¼Â—²xÿ ††ÒZW‹?qÍóË*X›@·^MAR<7×ý ÏÅ«Ç}³Ž ?4I¦ŠÜÿZ2?4X Öïãä[Ý…ÇgK^¬àš¨%» ˆ…å®ñ›2pc×0g†ÓÙažZB˜%‚€×©ÅDNEÒ~-›ØFÏ*Ó\Aµ¼\Žã¦”eïiô¢¢4}-ά"ã~m:;‚¬”ã*4ïà‚ûE¯¡<=¹yœY¾")½–3¥Ã8+Rôk õ¼è±›ñ`ó›ñŠO[›¥½yÔ+ëÐ뀨œ¯<ýæ©•yú/Yá îª+/^н¢³G½¶p é÷õh8S¸*H *׆ KJãÕ³h•ÁšûÆ5LjNøÁ:þ *Rök1D‹^_"µ:“‡.]™úˆUÅÅéèNE+”\î¢á%ÃUѾSå+2ù«Žkáhxm(ӫþèÀ¨^7PŸcq©ÅÜ/Éüõ$ìorÔ pT'”gèÈÌ öÚ…¹«(_‹9É a4*¸œTe\K6‘•Ý¥¾â’[‘¸_ËmG"YäLì…Á-oß²j¼Æ¾Õ®$nu°«–wo ·Ÿ¾ò3y¶>šV«R*‚õdëã­ ¨êóÜL#³ {eº~·R¹$9ˆßBËlz4Ùüµ-}Ý/Ý ÌõøüWßU.½AwB.\­;BÕÿIÚOÔÏxÝÆùÀ¼‡F ø0Yê)WŸh©ó¦n=¢}¢¨î«¨í^«'ÍOŒ3$ïÆÝS~ñ±AÙ•év)`X”ê~¹Â»x¤†n]xLF!X«I¥7÷]!aÖ;pàpm®…kk–çÅ „¯RÝÆ©5Ô”&ÆåBqþ‚sB“bÆ5SâǸÂtnŸÉét»Ì «t™ñáh6äR刧R=vžn±à Ê…Z½^$S‚ÇÚÖñ"*×B‡äýŠÔ+¡‡â+NOœP¦Ï?©4·B²†Ä]kä’R/ÚÊÍQ.úMÛôâ'¢ÔGµ¶K5_Ì µi=¡¤f¹ÃX³gÆöÜî3T»_›aŽ%ÐTp¬Í4{ÅKÉ«=ô |æÚšTQÚ¾6'ë7ógEDmž&E\dowT[oQ²x 踵™=SAª­ßoM/öá¬ÃýÜW&¤UPÔÆid+hª[e= иcæuÎÆ¸<8ško)í¹õÚîÕˆÓ»àÖ½ÚܾájÚöØC«aiP­Ž"ugr8ömðƒ& ¶á#rLå5:w?Ò3À8PÙ8;“»žÑ`µézRUë‡'ê<û“p‡›—ŠG›ýŠÇæåiÁ›¦-÷ï z€—W©û®oøõ¼k;ðrÓ_jç·Zÿá2•§F€‰Ÿ<æÅ) »K'éÝšV{ ä5òµê1CtŽQµV¨±tFeœg«+cÀ¼¯ïØpV+í@EýÚÌ$ñšµ^õ@à£%Žø$õv aí[Ñת޾Zý±ïz'ÿW$ÿWMþç_<ýÅÌÿ 5¬v5«§E>øƒLkÖGÜôdÑ/‰9ò]£°•HSf8phÎk7o!C íA­iÞ—žUT¬Hþ߇ÞðZ‚°eÙÈÕn×ó#FÄ)M b}[-Xȹµ«thEȱö G-P%®Ü’ù+ÅE²@geò$ÿ7Ês…•œ[Šéreá>F‘ß_A n“ÞôCCìÍ×ߎhØ[Œ¾ÌÙé€^PTÏÿW¥*»ÒDt…gäT$Ñ×~'dªBlPo¼ ©'Hªý5eiÒ½ª:"Øcùÿû'³£®ëÑ®q. *HªFר`yLd\”Ü”™µ{x)Cµß9™4]6Òj9W‰-ñâ.µ_õ'+¼,kÓóè®ÂÚÇeFªæ3ÊðF£zŒùe‘àÃå2ªã€[¯£Þx£QU¡Ý^‡Yª#õ@OÍ4ª‹ßYq3`èöı}2C_‘qIÅ(æÖAF÷2oì @5ÀÚ´Ø¥g9¦—èy/ßbÄ%™Ý{ñšU°Te¨C& qǪ,„5²ô ?¢˜$gP¯Ë¸+¿³kz1ŠÖ—õ6H,“«ó”]Unê`ìˆø“ €:n¢eL<ª§^õ:8p.jÄŠÌÿ:z3 H*˜Ö^åÙÌâ¼A¢ÙdŒ4Ÿ¯ˆ•vªYy„ÚMZ-ÀÊê0O+-žHÇO;n¸ÿa¾:†kSµ)diÿMtS»càXŠ+ZÊÙÐPÄ&½ý5ðþ® í> T@ª*Ö¦ð«Ã®:ì&´Ê ¢¦Å‹È°(€¨ƒËÒôòl½_v!£wsŒVÍk"u«NÓq+ê ˽^½<-Å÷­Ø¸Û„ ñ…4Ù¥e%ûßVŠ¥ôY§1±Ë@°öéDÁúp–:&‰–7{’¯£S¹·¡Ó?8“Í_§EüYµÂJWì‰PJ•%Cºª#×yÓdÎd ÄñÕéÚ2Q Ë|Þ ¶ÆÌtÀb`ñ>áÙÿ¶óñ`†g*( *²Ê+Ö†áÄ*ët“ÌÜñÇánÜ ÓkÞ…{ùK…ìò …é>uÉ™ÇÞZ']Úµóh̘ò¨ .‚óÎøå"¼«…#?»ÎzM/$د£ŽÀQPA+°ö–¯Í„Õ+"°\³­³îÌÊýmw¹[Bq,˜fÌŸÕÝ—éþu¾œ² iäR79¶.¶¡:µÀ[Í›X¦¸ÌfÚÂt \Ãu àXuŠ£„‡ÞÇÊMÕ¡—X¹©ÚxÉ]º²Ìz9„‚ø¨Ô槹ɴ€‹s«Wª»ÓÜd\3B*u wùÄz> Œ) ¦˜ò~xÑíþà©ØÙ#{õI (¯>n·”Ž’îw¥ l´CUkÒ¿u¤É±g‘ëÔœ%‡PPìÞ:QçÂ7žèDs$óÍq˜¶U»9\øŠà¨Ó|fá6ʤ«© ™x Sû¨Õiˆfhõ²ÊUÒ² ª*@u ©ˆf° Ô9Ý£^Ë¥ÍY>t"åÚ„ÿü\ó^ºYÒH9€ ¬ã—/wr*¢™ "¯Ê‘»pµþ»¾Ïó½Ö(Ü\P—çbÑÐ ¬ S}&Qrœš«Ïœ[! #˜o'Ï.Ø8HÙîh^û¹"íãÐyå¹ÀëOnò±?¸ì(XãòM²ö×FøV°+êµ–0èp4s|hy.µSPh~m,Ì%ÐM ÇòÑ, 0ÇÍà{Ǥ‘B!MbæB¡§yU~DÌLZn|Õc¢©âØ{GS“'»¨e¦‰°«èè‡%z[î[pÏ¢ª±>×q‚\ðá´ÚAîþÚ437Áíw_µ¿äauaÐ •º¿EÅ ­NrÑôÊãÞÑÏÕxkˆ—óãÂè¹Ûä€<†ƒçªy¸›¾v NžžW³¸ aBoÑqR&ƒæ½S¶óRžW¯ zU´×*?êôZ¿„§à×JV¬O÷·áå 6–¨<Å[-Ž&pžï«¶AFX—<^5Sžv½"_©;f¾@mIãì¶{âð<—3]@ ‘à±J–òôwÂI~Gþ´¢´‚O- .ÐÈ£lÕ âÔ륨mÕŒ¨ ºäá(2¬ƒ€A@Ü-¡õAŽ•Xt%!ûa\¹(;náÒp9ÄÐðµ1lU\k)ÿ6a¸Ü©ºú]ª Ú¯‚°“<ó^ZBK†ž13\ /-cÂú},™Õhï4ã_N+Ïv%J[>ì|窔ЖX&d8nUŽ¸Ð½Lq÷’å:q:€ ºikÐFàjï'þ7ïÇÍ5µÚ¥… þÅ’$$PMPÀ$ gh…Sg ˜ÊÑoŒ"Ë`ˆt'J€Aæ‰ÓÒÿ%™ïŒtÆ Uì§®[Èç—d†Ìæ­°h€@’¥Š*é‹+ÛLß'yPHÚ°p¶ ÍíRÆ ’¼ã¹Îäê¯À@7 òþ?T:AZ}p{ €Þ’¼ ™0ÿ¿¹e@n¤vAuA¦„åSÇ[{›>¦{9^Q’£[;Êš$ç+©Ê5 ¨¬­Ém„v*kë—— ªÉRÇb«£rlÀ_×k£í%úkÓµ•5–¡žö*Š»NE¯ ÓÊ.æèLIß½âݬ’ÌzMsÚG2p Téµîª`¬æ¢%Ù¥~åJc§ ^-ã ÔlA|9¨ 0âxŽ÷Û®lA~¿¤·Œ)Ž (uÿJÊ[ûx ›¾&ýÀÚ 꽂vžÏ-`äø‡Ó­{-›­#ªÅòµƒ7ñu‡£Ñõ„ }Pû™E*Lþ/WY*Á—’äʃ’¦«ì%7ÀúsÓ ¡ó!QÔ^º‘4tú5ôM¨O–Â$®š¾HÁ%1}ÁU.ðH_PN.7”8=R~-Èóe’Š*ÂðgÐô^œüÛœ{,›ä`TVp5>®Ó \k 1¢´ô_bæà’žO,ò¥÷e¢©T¥ýÀÚðÌa’™ÖMö˜\0Ýñ$`°2¶Ukor{s\ñ|´RLË@º¿dÇ6oìŸ%¹sR Z$½,>)!vòÖ»ñVXñs»S»êAD¯cšY.³l:€bwiò­%s\´DP%ˆ±ð÷ˆZ‹2½´¤šx>µ–ÜÍ3%Òs³7êÀkóÒbf!9” Á@ºÍp´­4J2û{ýgðµôÙÓ^ 2#›tª­ù(Ûõ×)€ðé$Ëg@îâgú\Õ’JTòàæžÛÐDóØyÏí]D•§- 3#&·2”±ƒpýFY( X»?Aþø¬‘;÷ÿÑ„–°”lpÚo¯ö‹&þÐ$ùb[¨$RžÇ —/ŸRyòÉÆ[¿‹–"‹ }´Jˆ—räÀ¯M#êIÀ  X›Î •¶D†³SH¥0MÞ nèi8ŒÎ¢'B—öß0E!ÝDŠ#Ö QÜUæpZçÜY·éЏZí·òK ×öQ@ó/´‘ø_ ìÚŠ/Zì¼Ô°ÏÈÇ/|‹'ý š,'éý!f¹ˆçýï2âý¤úK1öLRD[,RŠ“&¦æ:ß–—ti®Hí—B[FÚ/…¬ìX‹Ú2 =X¿Íd}ÃúÛ0„ )[¾P!€–WœY˜K­/‚‚¼ÿ2L×$µ/:ÅŠôΖ+ÈïÏ7ó°ÖWNàÌÑ»Å,­ÛÀ½q1ð"å"hjíKé9!l²Âªþ$Ðò¸ñûmÖX†¸Ïñ{¶ŸÑد•ï‡7Ú Êmdî·µ{*qhµFÂB>>¹OÕ}‡q)fcÒÝõJRp¬Ód”M.rAz¹Œf)ícM ~ôs+ìO ¿r¿{î³µlš{üÒðÇAáö­¡57ƒ2)&X òý¥tŸcd¸¡Âö7Oåý}ÙéÓÿÆýd)Ô…_ÜFR†Eâ1n?€”ábáì œ0ýÊáR›Š3_.()`À’¤ Sv4¾h±c)óJTÐzŽÁUŒ[Iqï†|G½ÄV{¸¡» Ö©Ï‘p\CN`m¶‰Ò6»›²@k“Œ )l™Kg³Ò3»HÜUÈ&c®~ðä‹GÕ¾KKqž0ì¹ó–t¶¶tá0•¦$ÀƒäÎ?(A¿Ýãbådž¯næ¢íX@> o–)¬ÁŽ áç@c}ÒkcfBÓÒtáxÿô ‰"êÒ®tza }ÈýdÎ~œm4Ɣ𦱋ÊýŠXZá‡o™ÀkAÉ]§+Zsdr f2† –Vî@C(õqªÌ£¿iÓË2-iýg»nËRµ>Wˆf}|‹Êµ«×T%úRÚå=S´½jÚK»½g`Xûè54Ž$¬ åͬҬ¼™€ËAšX+™êUÜXR –î½BsÐ!„ ª›¥'z\˜1*ÍqÍ8C‡8$Í‘eHÿ—“þÏfózRëlÜ(ð9ÏWU†ÀúNþò°Ž!·Q¼Øˆ i_ ÀÑÒBµ3aß[=š^~TñÊ F²©œô^Š·ì/( X ¤uײFu¡5ô—6~¥Ñ”E÷ó µ_NþœŽ<ÆAóÐ_^JöàœAi‹i rÿ”†ªJ¨F*iž¶ÁôÏ—ÕJ§¢&‹(¯Â˯ÓÈI5j•R@°6æ<ÕjìêQh¤—}±îjÅe]Yæ5é ‰µ9£–s``€G>ž]rè2:@ °6V]ý4Hé_ý$“·2Á Ê„õ· n†åðP@ d„”ê¼§w'}éⓞ‚¸óE²ç_)šÁ N$Ët±Wd ”Ãë«ãŒ ²úÖæúœàžœ-­!iÞa:ÄáÖ†þ\Ð ôCAšþÚ0ƒ€dË:¨Êk )æ]4Uˆ¤ê®ñƒÔTºGnÈÈÐ9 Ùw'=S×£¥•Í=¯Ðñ¤›ä° ÈöŠB0©¹†AÿÆœ@½6ÁwÿX0 ÁµW’™ôú˜k§#ÒÔùYàjë•«›tçºG‘Õ·¤bPì|k%1T‰ÜúB±t·AA°6¦EãTÍzSkÏ'‰ÐáXHæB†ÈÚ—îÈ3Nýç΂—fcIÍ †ˆKurE#€t¹$cV8®NâÆw¯BŽt&lJç|…*µWñg; €Ü +¬ž¼ÐäPÍãÇû5³rWÞߥ‚榪F6£OÏÂ5éVq@°6:]‚ßyˆ>>ä,K·‚ëÅø·)jL"çº!¾¸[¶ =A«»Î×¾Ý⼬ü€"´BìE¨@/^üÍÙ§½Œ,—>ï·™’9,ø+‡@²³µˆ¾öYG…Õ2'wô«Ôˆ€ `mv5¯¤%}¯ãÝ” 1_ X›ñu|¬ê\wvõ¿Lží"=ŒFZž…]qÛÄó¯ŽWæ'8–F›¬!| rï׆¦# ‘Ë%LdfÕÓøV‰íåÑ¿ê8ƒ³TæEræDS Ü ¥>„€ªi޳Œ•«T¨¬¹íúÂ:ÏÍöm€€ ¨+@A/LYp£ˆ\;¡¼ƒ` § ×NHõ–INÐÇÜ ÈÊ—iî7užx°FÃ,a‘šˆðO“+¤P3-‰÷CmØOÅΚnáW¿œ‚]ìS´¢ZúµÀÁ(³žHWi¤…yë“#îýÐ$å›?§´á5/[9œ†™F[Ÿö÷€H®IòcJ1cÊQÄ5¸s_m=¸]åÃ<Ø>Ø«‡"Š)¯“ø&í6¼¥WeM4û”‘@Ù›œYˆ{»yDgbS‰ 2àdýÇÐfŒo‚"@¦KðÈ|G¹™›·ù{3 FL«&£´Z-¦wõE7”i e7ð–0¶ÛnÐ) !%% VÑI~ú *õ n3IZ›t®wžÄ_h £6ôÊ[Ö¾êáW÷DKB“7EÙä(Q‘Ô ñêÄÈ2Ç«x1n ¬‚6ßÔjÒØÄ©X•°x[Í髽ݺ§HR,!“_l^j$‰ÕvÖÄD̬XyST ü€íyüz'f'|¹=Ž @˜Çˆ’õú²€¦ìvAW6ð4e à0Œí6Õ‚w¿‘ôÉ¡†™Òœ@Ù»SÇ}{’{‰qù¦9ú–äÝà/kÏ…¨ í¼=;óhÈü/éBn7p„¢i‰;x&ooÝÀÐçBÓòëâoÉTg'NV®› PnmÁ§†Ýö˜b’ïûŒ’¦Ûoð¿µ'GÏÊc‰Äyñxãm°/Å¥uŸOŸÆ:vòîér¼ ÿèµY§ß­4'6==¶DÕÚtöXf1Ð ¾E_MY¥ßŽ™’BpU(—‡Î3¢\І:O­x)%Õ|´ðǼögVù@C†~ƒ¾²6ß± ™õ²7<´£Ëp]Ÿ¸Â‰m”ô.4«àÞ–8Â7h\ŽPFwƒ&ÑŽm²]~çæí‘[A€§=âc[¸±ãtÛä›*L ÷±Oˆ^¾ÝøüÚŽ’WA¤j5kŒzËî‡6µÁ>¼Dã^þšx}PÀCÒËÜ,™sÉ37I*îe=ÚCÆÙt$WƒM°6r9gl“öî¹l„±ñêlgÍYWhÚã3T“ºÌùÒàR ¾Ñ†K[¨&G m†uh„:h¸_÷:5šnì~ÜÙí­ÞjŒKkjLÿwÏK{8÷êÈ•i¦ïX ¾!Mdí½ÆD{’•RBÁ¹öÜ%5éDÑã Dí™÷ìž<ðÆæµwøY,H*–C|W¤ñÕ! „/ŒXCæþP¿ÀÚho@z% ×P{kÉk:C'ÊÍekåy¤¸;€›ý @ÐNÖ~HbëSÐâØò^m¸¥tQüð-m‰s¨Þša¸Zb¤yá9ô[òR¨âˆ‰Òù[òñ Vƒ‡75¤÷·tWvVl –2…Ÿ«¥E Iä«o)Ë[;hXŽ×ÆâJZœærc…·P@ƒàØ|˜6P ´Tž«FÁÚ›b+ LZ&¡á)K µT\Ÿ,ò6ò×ažÈ Éû¥f÷S¡ÐÉ»UX’S¹¹}îTµ/!§Ž¦Åóo‹Ì6ðQ4G&k®–{v‰Pj©^ƒP³¢C %â(©—§Q·D䱩n…©N¥× …­«’Ÿ•‹2P#¢àœÜ=‹²çlƒÀÚ4±Š^¼5–ðDâå÷ µ¸ÐC-„™v-É'VþƒJ5¸Õ~·µóñ±/âp8}ï2¢-µ2ÔHíjÈd«ÌÐÌÛ ~LÁÆ„h¢Î›?…ôš¹/X’H™ÝJ­‰¦#ÄM ½Ðº·êø™n4TÀÚ/G¢§r|©®ãúoÑñ¾\ ‡¡•HxtFˆsö· œµ_æó.¼nqª–.„6z‹YuÀ6´4ÆõƒšÇÁøâ(Ftâ²¼c»GØÄ[N‹¿¯{apM₪ƒvèpBç1âV‘öyQyƒËÁ&^é¢ÁnŽÓ´£€àó²“ïA)m'ÇRvM½›\¦e­[A%È‘b¥åøy]J–£Âh\ˆN50 4_”è8jGª‡8¹7"‚ƒi‹Ýôùu¨`s. ¤-§ÛáÒÀ7вÑoòÿ¥e*(ÆÿÒ3ðá¶i™5ØÌmÓÀ>Ðò;\'w쵟ßèÐpÒ›hîË7MmL×|ð¼'2%·œ¤qäl5"ZvJ4¬†v—ãñöÂú)¡Ogõˆ³K‘×q"Á^ðÚkC¯‹ØÜ†ç»ù§càëÎ#o¹Ü%³øZ&j-qÉ7AË.@qвË*x-;Ø‹p ‡ès´ì¤Lð1·ló†Ë_®%ø;y?ÃÏ¢HóZ爎 ½?2H¡"¬5w©t©äk Ú܃Zi‰cå êDZ×>¯G5Êq@P»hÙª¥Ñ²!ø4v&V÷Ì" 9 y°¯`ehà-hÙ¤æV‰¹¤òàç QYºYÚç[ ¦y6Ðä;ºó½6!Ömœ-k…´8ÜîÞ¹SK1LY>÷ëÜÐq‰PbÍAIÁÚ[`$1]Jáë„ê8LkÙË>'¦Žä{xõ ÙÙNßË©íÕÀJÐhåƒ_`éÌÚ—œpÃ&$nvôÄ£EV݈z®ªæ„1·ìzøZÜϨ#àiBÄ䆜÷r€–G˜Ôý-K׎Qè.-‚¡rï&ó¼{¤–œŽëÖ<νx3åÕfŠm³àš:5ǰe½«‡âÁ€í 2tìµbaŦ9 ˆ®–·ñˆÉÚìàépíÎÒÐåu¾`Cí ¼ Ô ”Mù¼ýÍ¡ôÌîÊîšm…PO$fŒÃ¡— ùýµ^†ÖäÕqζr9Ú Mû’ÄÆ}·d¥pq¹‰5{N½P\/·`‰­Ý@}Ð@jÐæZ{µriižœtÒ|ÜßÒ ¦á­±ª•WIí`¦#¥¿äPÝ’•9-äÖ ‹[Éw¯h1 :Ç éžåvÉ’Xõ¤¢É?÷·„ùQ‘nÔdAYÐò;R íþø±±)ÆgÒÀëÑŒcRR¸8‡ sžHÔJ½˜€)<Á@‹ŽǦ(gIœFM¬¸Å“• #ùý¸1íHåVjto¨vÐÏàŽnŃ<°£B¢PÃ$hE²ÝU~(Ô¨k ò40 ÄD¡VXd8¨‘dÅz®ÆPñ. ›§•‹1­!/¿­7¦wÔzÕ¼¿üùö¡ +mmÊ­[€“ oàh4¥ÝÞ:h)U‹dÃJ­ÉõÀnŸ­Í|?·íæ½ ®8õF–î¶Îÿmåƒ~œÕ@.À?Usšø1 ,À<ÐÀJ ~ x;.ÝØxBàOLbHåý<èë寭iµgÏÉhåÖ[&Gæ°5ˆ¯Ç!K`ô6¤Ä+Œê¨Ÿ¥p" >›˜(ï% 5€Ë!â&v< 2ͣѨÜ@2PœÊWŸ:ÐS˜EÞ‡FEà ]6yO‡EDhßCáâpnÔ0hÕ…ÍCÖË[ÛÖ|;5ôÈ.ðRgÀ@°6š±F炬XâÛf`SÁbЃÜ*«A+oÞèæÌtÆ„æVÝM·Á¿¶ ðÕªçisѯ @%ÑÁuÞôB‚ï³öõøŠGꃄ`mð‰g1¤~„VwH‡ß‡»¥&ŒVƒ¥û¹Õ`é€Â¥ÕÝ÷4Ò2²¥ @tÈ»ju;z¥2Þõ”·#0ñ¦¶–°´xHcbšTP±è©Å;²#P ll,V¬ò­º{Maз¹‚´ý5h©ˆmµK-ýÈÄäÍ€»6gh›æòò%ÀôZK`9O-©DXé;ª•!·Ên„³©²½•«:Ð×­V÷ÛÐè /O¿ªÑ´ÊQh6ŽVá|Œ6Sã-ßï.ܤK¯ß%LJÜUÖÞVý¦RÊÜË7ÖÆª±´Ê ,”µæK­„Ú¡‰œÔí K=‹•e¡ƒ„£€©VH­AjÕ±k¬/ÿJîiÕáeto7«¡Â/Úªå|6à‘[õÚœ”ÓîH§HhÕEBiñIÓ@«[ËÁ[p„`ä^oAÚ"÷-°´`”Óp“6Rgþ(cÍiÚä)¨Ý=G‘=Qƒzç€Vºs^5––šÜƒ¢èJ9—=ëO«a^>âôh1[‡rÇ’Äå.ƒŽ¸á:n¼!U¿!ŸµUõúÃ\nÕË "ëÉÈ­²0¨U‡  .ÏsE íQÜu>Õ¼K¨|²“µCüa&»•¸o hr_/D™± v›AI\;ðäAÊ/áí¥ßÌI¬ZÆ&Czúžæ¿`H~[›~æµK?P'¿Ü@)6IÄ&B¸!â‘`íV¬!ë¾I:§Ê„&É N $íP`éGòW+¬¶yU=æ#Œ¨™–ÓÈ6àf-ù&¡(:‚%™"&ŒC› P ÿÛim`x(²³\i«‡áq ¼0ƒ ©±kÃh=xx ra׆N  *þ TFã bÄêuªwÉÁ¨,›d0Qžî½xöŸƒëj¬òò2éiæWrX44ÚšBPù£_ ž’̦rõؤz“«WWМŠÉ4±âÏYùŸ/¨jº•5Ð× 9ÜK€Ô#ek²Èø:6£q]¶¡ß/¸N ÂÎË—G‰6%Èšxê'T«WÕëš¶qb¡+¿+$ýÅQÄqÐ)4‘Ëþ§ù{^Ôœ7)åÒv4áâü’îlúÊ‘>^çÚ¤mKVDYœ™}´N0IC;µÊ”¿E†Lc±Ùk²GV‘pV³c0+›ô“ÝÐ@;ÐdK CH©lb,+ZuÔ5¬†åµ¹…B6¾CÑÀÐú §þ(û³ÉýÙ„+ˆg6P:¬×D& ²íï!oݼcàSlh`W½QÍ]‹Dé뤗(tƒi@ÌM¬´ŠL™/‡ôøXž=ñJÐ Ž&^PMײ÷ø6Þ ƒæÎ^˜Uv™§ÃmIž s9³ÜN(¥ Ä][†b»¨Ò ý¦¤{ýÐ`ù!§FL¼²ccÀ‡GCŠþÚЈ BkÚáBGd¡FÑyðbL3–­ó¨-U³®ée˜Ã´ckÌþTEÏÑr¥ìûÜ­‘°ÓœÝÔ­ôd‡’)“Ä—ú9Ô<¾^y¾9h¶* g¬ ¡hD ”÷ñ¡¥eþU±áŸÚ…0€ÚŽvñuÑ„íÚ‹ë=ÊÍH«{ú×!ÜÚü¨gôƒÝ$ºÜ:ô´zC é7Åh¿ZÓúœ÷gdÆ Ëv4dò75ò“צšS¹ šÄ†ž¯Ü»oFÈÃÔ­YÔ¬5«‘ŽGb­?[÷6´&.Ô­³ŽÙBçÁtiNÿ¬¸K_k7_Róó‡BÿO„;gh‚Ÿ¨*3é΂œlÎ2 } Ùê@^/ãí>­:eš¼f \ëÿøâ·±µ·éS,­!Üߚŀ”˜6Yg«G£,Z½£N+@©ÖZ÷i‡ðåñh€®…ö–«ƒ`08§ÅçºwfçýÌ جԂ#R2}%‚×RãöÈ.pè Úa8µoîZ¥­iég&‹w.gtk£Ê5¸ÚpƒËÊN¬ ·€dy]E¾M-4‰Ü~§i£èXÇNojEd‘[ XþÈêoÍÓrà3}•kLRhžØ(ÑúóølÒ³±‘šÔºaÊ®8åN² Hõjý¹¬A‚ÛCÀ3°6Vcý®»#úÎ’‹!–9¦‰æ‹\®&3͘¹ì…x8Õ¨ÜnÄHÞK3òü['ŸM ï¾à"j7öä^Ú}%^X#5nùFXË;r8Z¨…€Z 8›®^!_ÚCÈLé^ÊOgOåÐt´­ÿ ÃŽ84Õº“A#¥ÿêO€º9ÎNU-ýØpŠ5çà®wŠa£Ê^œ)§8OCÙoQ¦€µ¡£ X­† ðÚàOUÃÀ*°~Û³^ë—ØÖÊæñŒ`Ø”p¯ _”Àк±oó›’økà@$ðÀuökG–“¬Ï«*ÙE‰½¬Ø’µÙ©úî1!QQëX?%êrLâÎÓ‰,)غX ­Ë!oˆ.ð4‘öž*¿VÚt¦:@iùÓÛ i†¼íÍѨñSÓýåoÔÎñš­ŒdVÎÅú:Ÿ÷Ô/ ³ , ‹þZè58‹°eóÔïGä#LÙBKÎõ`c€ˆ Zk¼ì†=fëîRsn¨#Ù¾¹XRßó˜axyèzv8ð&p÷Î7‘hŒ®*bÝÏ ö1¦ÖMÏã‡1s»p6^”5©ƒäwBëÛ€äƒåÚú±` Ox‹cÁÀÀ†K¦ÏãÍàÇ}Õ…£=¶ÎÑéºsååx)'*ÑÀ!`iŽçBȬµÃâå°±§Ü9ñ Äkc9ñm<. µàßíͼHŽ3“YV!ØÖ¦[eE±DÞ6˜ÈkQp•¸ÃýÃD&w ÈÚ0K¦4.#žž2m.þ• ¡ÆÞ:‘ ð4å"ȼœ zÜϘøMMö•Õ Ùš9_ ÉÁò¯NþÄ\ötkî {Y¢vÉ©7Æš"\mØŠ{t ÿÞЖºÅ‘¼oŒWà;–t4KÒCÇåg8³Å¦¦·„=³åóÕ¡<æÂ0"¬ AfÀAµá%Ô“ œÔ ÉÆ‹ÚÕ4#Æy²eŽA#e{ÐOé8Ý€˜qã7d-Pÿ¡ÛmØÇ *b4lçeù&¢^»œ?0Ì,9^™&Ù“mÀá6 ºÖ¦h/ðÆà*Ö:ôæUcY´vóó50 48$öùÙs‚õï—Ù‡²’m¼¦)j½Œ`íÊü°©F;Ô UÛð°ŒÖ< 5È`“ KðUÏTìò6"MxË@óX5ÙÔÊã¹ÑƒKïTÖ}©ÿPŽ 9úÇ+f$4®Úå ‘Ýl<-^*(XÑ##TFX,°¸ ·l!c¸¢œ^€RÛL7À­Ú¸e§Ú½…Û¸ì÷½ØŒv–HÍ¿e¦p+AÃ×lÀ¦¯N—Î߇yŽCíbÚ°HL{€A“m"_ê¹Â¡šºóÆÏ¥-–YW¿DÒðHŒ–Êzöõóv®™M—ÔS»¹!?{J§Uå1÷ëÎßµ¬àr€6Ÿ—‡¼kczŘ|X; qF›N“¶–¸„ÆLÅìdG1´IvÁvkm¯[ÑÛ€ÿ6 Ð@GЦhÑóË"ebõèÚ¤Ýß+Ë' þ€KÍ€лÌÐÙfÞU‚‚ã~3U7¤Ê·éž¥BÈõ£Öµ¹ 7.|Sù#ÁÓ‘Åhíí)wÑ´aèém^áõ†hÁÚÇ*Kð¿Ìá‚”›u¼Þ*Ö†8B†g,¢–Ô?_¨ ¥EÑãJFàæçÁ·ï“±ð9 ^A;Ç"Ç@%š‚#‚ýl* 3bÛtZgeBOFß@›VV™ÕÔTY,BÖÕd_æðs˜ƒ1ªR£lPœÑ$ý[£lû@ò6:¼ô ›6àchÓl•™±KUÛ¤ö•7‹€×“dy.-ÆÜˆ$™žlS”Ïæ^ ?fÓ&ÒDj@ðh„Ljäá!ÓÿXsÙu}zÛ´°2‹À¼Ê8â´eˆø¶;«Û¿ª#6䯝¶¬qƒ‚ý2÷Üä’Òoÿc¨ÿ Ц›ïਪ=(—ow[§Kk&­s@ìÜíÞ˜£¼Ï¯•_å<9 ¼ *çÚhrÀ¼0•ÙYæUsž¨Ct¤ó¯½Fì«È禡נ?f·0 nŒ;U9D)sJ»û²pç±ûûÃw/w:t¡@? -›…S«Mˆ¦Þôç.,Пèts¸ПWan‚þ\¦ ¼úEGMêmÞv4µÞAV>¶?òÓ¾?rYûsCÇa0±´Q„’ aÙöý‘ËG»éðÒµ((Ö§?œ°;T£ÀÚ„áY¯ÒJÔ3tQé§_»Ú|ÝN¶è欴ëþ ó©Ý®ˆŠ€µa“ØÙÀ£ýÖ\ž¼C\ŠÕ}nÙ‘ùßàd~φuQ”¢¢7°°³ÛvšrÚÁ-Ðstö‡Í!ÊòF´½'§ø˜ƒQ:,éþ˜eÜÎË¢Qƒ¥_$Y¥ é9vM…ä:6„2™þ7£åÒ"ÄwB7gë|Ú¯@yøøóÆuÐ ¬Mâ#—ઠk¯vìÀãç±_;ܦýp p¢wõᚸ™!á‰l4'¼Keâ§îLÿoY|%¢6Þ•G€¥w‹»OxëžLäÐøÏÝQðO1§\G\¦§'Îl3»4/œ=y= ˜‰/èM¡Àú*Õ3‹¢Æ€3HAÒáÿïH%ïàè‰e ;¨z2‘³‰Ý-q1vÑÓUš”5šwųž8¾üŒól-O»ÚÓ‘©ºö¥ÓÞ㹜ÐÏæІ¬D+ÈéÆˆ¢£Ý‰çYê©'óèö¤0§‹.y/­íiÇe¶õáwe“¹Øvæ¾ßaˆóe{<;H:ÐÅ=mà2{9óÒv†.Àþ=…ÄÍ&W6–-ðòòÀÁžLÒð-ì¸hZ{”g`è©^~Û—ÆÜ“R‹)y“<šZ~ÅMÝÒA °6ƒo ‘¤£³òq“8ôݯÛApÀ vôdxïN΀ã¥p9¦xÏàg‘Î{¥JÂõ(r%ü¦'Æÿ¯0FOÍt‹žd;):¼oëPâ·žfE‹€裃2 P›©F“œŒS—ÊÎïÍ5–æµóD×;xzj1º¾µ¹ÿSKÝÛ»w|üžœ¶&Ó@u©‘x/×=À#Б–yéÈxï©û¸l<Ë2»º®hýš•æGÖé´Ùmí«î‘ÈŒBC^*ílO!3@¿ÌÀ³_¤s`½µi¦²¤q4%UYkÀñȯÓ( ú©¯HÍ”·8‘ˆ ®Š'2à žz¶wÕ³ÆvÏÛBË3ð92÷^ºÈ>8õ:ò×ׂíÀ ‰+Xš.@u§ P%wTgÏÏ)%ÑaÛu¥ p NGniÏ›…ãâ/ç-\º¼¨ó2<»þ¦¨ºèv G¯ySÀÚÐZ€¯±ƒ* ƒZ`m˜ÕoVt%'Þ‚×Þ¼wdß6P¶¬™Žt©žÍš`ô%{<ƒŠÇí€à¢ïà èùæxÞUÉá’îȤŽèpø^%Ô;Š8­Í4g×]b¯&¾9ž;Žw0t$Ýw%PþpÇt%p&Mh¶šï¿&ÂZQx!]xÈh)É©Móð.ðGŽFþ­¢ ê X»¸(‚… g¯%@uõ²düÓ©pš Ù=]õP¿®rùÊæÓ&%ë&vwú XÏ—¬gv¤×€°~§w&çß^‡žÅÅ4Ø :<¶ û”ÛKˆ Xô¼ç°€îµµ:KŽ‘&[øšøõžxsýD l‘·ÿ 3ñ¾Ó…ÞÁ5Е1¤Ñ¾×@?f?>Ló‚ çƒQoÆvBÖ8ä!r·Ššà˜ÍÓŠø:^ìµ!>ÜÍÔ3eŠÒðFæÿÅ!P}^³ãýh×ÕÊÀ›Gý‘WüªÑóàF§ ¤ ¨:¨ÖÞ|œ;¤¤3Õ¿*z/ã%þ·Ü€V•ñdWõxGæd‹hõ̾ uÒ´óœëžGÄê–àz®è'è X›ØJ j´ß­í“70·@ ýÐp cæð»jˆîÄÊÅæUߘMÿž3 èå)?ð#”€aV †µ»y¹¶è+š0ƒ@*Y*®§Lu&^²ì½$.ôÐúzI··¢Xìð@lrò]úÍ”²vžãÏ;ÑÁPQ¥ùØõHóï,Lt¾déf±ªÒW,öŸáª´rn‡‘3á%7À=p81ëà®X×)µ•}ýN؈îïì˜$޶z wîÏÌUød3£˜keÃÂU¥@/7–Dy,êàx«3²R´ö\Î)"ŠGzë`X›É÷áêÐ1Ó{©:ëá¼tgcg–üÂáEëƒlú‡¢æñ»ˆä¿à„ükÓÔ’@oÀÚh†9 {'ßìHüíÅÉ7µÚ©—ñ@ıó˜ò[ ‹S nÖ-îÅmVqlfqÕ]ìœÌ;{®ý¨NÉcngÎÁ\»Á>k7ù\ÿyœÄa\wÀHÐÁ0°ö¢™.zK¼Ø_š `D"€4¯*ÐOêÅcæ2™²Äa.¯a=`¢¨qý9ø¹Xf{éá su/·)®+ó1;¨ÖoîÅ[1³ƒ ;€"ßs¦”y;HzØè>^q´×pøNÖF‚â½ãƒ¤nÔ«˜¤Ü¥û‰ï»éÌxå:~%µ÷2}„ þíñÿ!o>òÎ5oYí—s_±aÞY^ç7sîH6:CÁ °6:eà;3£eð²O’Å!÷Ê\Ì@†ÄEèJRîH_.¼;u{b‡™ÂZ^Ç î^Ÿæ¨«­è aVóš±ÐhtŽ ­WãÝì(oÖÉ&å+(z5 ³#Ê.a0Z%0IÀ…’;2üû¡àú¤x½1¼½:Ȭ#M¯Ÿ(-¤8ÒºP:s‡§Ü?Æþc'S}fAú]ó¼¬r%Á Ž~fÏmxõ{uè‡ks‡:¨úú†êÚ{”ó"^µk2Q–¼0Ôî‰ß·„ÝQ‰è èÕœhªT§¡Qó¿gÆ(íïƒØßzqõÚd6ˆÌßЖª—ÿAÞB?ÈZô\lZnìÌss滌&¹×0ö‚Œ¸<èÁÕùØé‘/éÆð¿Ø;Rùׯ /¡SU(CU8TÉ>ú\øà®ïƒ÷åàBd§ WK Œ^=Mîr“a€žÙg|€­ë#¶©Fø¬Þc=“¼ƒøkïnÖ‘2¶6» }v {9ì×ɧ?™%hnІ—Á¡ÞUÍgFª¯¨7 »]]•äïb땹3µD½ª`ÑÜkÉÚ8³ze)ž¡¯ s ÚBÅøú; ‚\ﵡ6½ò;Â`‚°Ç ïRmÉh¼Ì¡ L¿¾Pà´deK½ê@…*ŠE¯6äQ5s¦BAz%w£é8ÇLæìö]޼×éÚL¸:ï‹á «“.fÐ t ôÊ…`2%ˆeyĪÒýÀõs|ËÕ`Í2¯§‹óÃÖÅݪ ŒO~jö”<>y qxñùt˜~]sý;²ú;€akG2È º8t™zo(c°‹‡cXyÉóXñ §wä¹vÇ©œgk5ëUÌKA’µ•RP:èÖÞtžb/ ù.ÎÍÚ‘øßÅ­8–äæÑÝE5”W^û.WQZ€®Éþʳx³?väøïLî¾+i³uØ:¤ÀÐ¥Ò„‚~Ü œÐUNÚ¢äàÕWíê>8~xR9v¥øs?|»¦±™Þâœ]xW‹ÌÑÒH6;_H×î èË…·ƒ¢9ÃA-€³¯K{;-_ãj\ifÜLÀf5íB¦i/gÅÕ?ßâ‰ú]ä%ñÖ^ƒÿw±ŠœäüÊõ®¢éþÔÈ;꣄=…ØTB®«Ÿ'ë:È}0tiê¤EúôtG˜á!“§CYé:}Ìwp ßÀgÑÑ=Ñ¥–Íß%Çlµ,fÛwäíwq\3× ÎuÈü.ŒS, +L]úG˜ëXoãkçìt¹œÈ$Zûhžã±Š_ˆK.«γ𧃠ËÐ!™ð³BŒAgŠ‹v4wGî(ÔÜøapn× *¼è¬çÔéXû.¶bðy†%žcÖ;XwÞÖœÌËïêñØÊ°e€ý5) AaÐCõôÑ/RpõÓˆKª½¹°Ä9®¯@Uëz*e3Ÿùa­’}‹çôJG²íúÈøï!ãŸúÒöS#éßüv~?è¸Îˆü±Ž<ÿÞ˜™ÉV-“Ž“îyÿ»Î¹×ïCd¹7ãwéHjïÍ5ÍÄ:<§W<ÅuzÃ¥ÀÐ[:Ök†ÿà4ïÌý×`Xo¬“}¬Ä¿Ï[ÃÉM0I¶.Ëó{s$3Òã¡_ÏÑu½#›¼7öŒṳ́óñærñа¨Âaprÿ×e\VÜÖbûdÒTãýC q a|qEtà²ñ«×$ì_Æ{¾Q•3dþǪL@>\_VL3+ÆÇ£ö\A2lo 1W_ZKƒS¬íº ^½\wd`š$ìè è è`X›a ]£>ñ-z ek8CB/ÀÌp*"ˆi8ogY É1ôT‹yW[¯n«;€‡õÀЛaÍ:Øz3+†±³—·D}ÔÉ3:yoíÙ¡—Æü™ºƒî!y¦èÚ·Üãõmïbш ‹¼ˆ"!®o 9Ó\Î((Ã×&¬ó¥\9¸²µqîÇb%&;z©ävÉ d‹{î 6T70hzë¯ûó5òÆéѹ߇U9Õ3•LƒÕ÷Ð-â³ðø-šB$à ª€Þ†+@ˆ«õ6LZƒO¡7“6t•lT¢Û?ïv@¼‰yõPVÈŒœª¤ùÙÓËxio®¦# 7‡O`1ímF5„l‰}W*€·§qqÔ¶K™§AoÓ}Äv\]Aýù‘²Ö½˜ icƒ€eÆ›–ÖéÈïïý¹œÈZ‘Ô—Ìà߀ÊÛ¥?×RÒ€µa!M€¯ÅÓs‰í|0ëZ+(w0¹×†9ä½»ÁƒUÝlbÅ’_µ ×¹hB2ƽ XU²5 Gá„ ®¨Ç¦\&¦¢çÉæ˜ÔÎî=û‹13<¬é,‡näÄ›€´…çñ&ÝïÇQ:>Ž•ïýö‚à~¹Ü;%Tï¬ÿÜæï§¶ ~B÷Wýç~‚1ìþ‡WÛë+^ÔK¸G#(ÌåqJW­[} g,‹gÙaö‚ª@ÀDô~e«t°txÎù$õ#ßy‡KɆH¬êqÑRïqˆE¥Þ¼þóh~IÅ@_’g•v³Ò©—J}O¹±{àX*ºˆÕv0t0týPéR†ä9Õc{8°½]ó®åhM`÷Rh1Óœ°©ÃgÖû¸t{E´«|¢†Dß/ÆŠ?ÛêÕ›•E uäÿåëv~æùØpxõ©³gÀ':¨Ö†^pº-NKüä[YŸiæ!Ã[!2 cÜ%ãÓéþk‘P‘r ¦ Ç36ŽÿGá5¡Õ,5¼í4p“txIúx,þÅ»þÅ£#Ù¾€œPú¾›˜/hƒµp}øƒ Ëó $̽lž*F‹I¦Y“Ýöò0” ë«*kÃÔ!¿Ò€5â8£álèÃòi´¤Ÿ‡¥ú ÖË\©ÉøY*ûìFÃÁµSv;Òýs»ê0täò¯P}£]‡gÒ¬ÓŽ ^€#qü4³QÜÙÂWîÓ[¸ÿA*ã®ÐŒÒn•8»~øDþíàDÓºÓpŠƒf5Ö\ %ÒAЇãÏý.cG½á®` è œ‰Íº«@÷«@ó£Â!130jú8 Ì4f‡!‰Ÿ9ŽáKWDV«hI˜wȇϟÒ!/hè€4¤ÙUéªõ·úËíBçÑh¶.“ýí^ÛñîJ ÐÒíÃØNãë¬¦ÅøtS8ÍpÓnìK‡<ß0Π胋7I14UÛB¼„øÆ>œÄ1ï9H]À’Š~ýš v£ZᅹšïZÔy>*á~ X8™½v$lèî7BŸžò}'dXÀ£ªXvg¶è4BÕÇ„º0\ÿBžIñB}~¢9±ù:|7R˜Ö5Ôréà è XŒâ.…ª%T"I¯¿ÝÁÐgöÜ…V"—]}ø ¦Vž‰N`Z«Ìž§"UKéÄÕNÏQXIÿ¨™Ø'ó6U9,¡#—¿#ЧÚ4 >èÓm07¬¿Í¦éè¼>íãØ'N¦F`MD"Õ½OËóÒ$¡¼t&Ót–OíN€ý ë {…ÍFg*Ñ&n_‹ûÌ‹DYÞ€p ïÅ‘²™¤%”;Áúûž8àXŠŸ.@NG*iîE¿'ì ¥èà èÐ/;¸ºÒtÐôiˆtt—èR­ëÉÔœÅyÂ`•I¬´¡êÖ}˜Ÿ|×@„=6¯dŸïlêḭ̂Ìå ½DýØÜxh¹³½Ô Lâ>Y³ƒÝ OgÖìJ0R]žƒB¢O3³ø¥áf:NÙ?ØTsç²Ò„U¶“Mc>Sdʼ£pµhW±šA¹Â¢Cí$ÌìeHú‡Ù4ÙwãåTÀÚÕŽªÀY£âúæ”}®d”Ž|û>‡‡Ë&§Üz¡gf¨/°hž£YVÏe@€) ;°…¡à@5†pŽ®\¹g=“móÁ^áªuÀ“ú˜„vTAž³lY™ä ñ{<µE¯†Ò  ÏE–8àX›Ý¾Mð€­ö×ãûáëëãÃPì<Á‚ñ˜~4  ç Ê @ZàBYÖ©êK³¹.¾ÿΣßo]ð% &óxØå¯^xLæ6ƒñ¸¦À°z„p<¯cª9GAó0ÈŒôfŸ\qóKÒÔÎ,à¹iO³hY—qN¹Ú_Ñæ*lAÓ+^¨âÓ1äCðAÓd4ÇËÅÐx8°Ü¾ ²†}dmÎäál…gò÷<ð.]:Oñu´JÐLA3Å2`R±Ç#Çm1y5«¶©% ^¼A ¬SqQ³·Byë |ñHO­!—èˀϡ@y } r.Þ”u*žÚ:_‰ƒ¬¡z¨¡ê<¹7>J”|r–Hˆ‘:38Õ7ÕÅOÀÚèpìÏ™‰.ã¢Jã õÚ•fTt@8Žóexa"µ¬‡ã—á$ ™é­ãаxÞˆÅrª&µ0˜y‰&:.pÀëTÃ]yR³»Ž _»ks"²¬ãfÄƱ$|î‘iÏÚáYÐïÃÀ8pAšN5î8¼)²ÀËÙÒ˜¼c ãáò>•‰6O×ÓDÓ_ߣÄ#½Â5ê÷ÚkØšq¸¶Î0Gïq䀞8A|ÆÆ¥Aò½Êþ ƒûé Ê@ƒ¾æP†¼†"* §el\cfAçºLD˜ït ¡}$C;hÔ#mCMØ„Q ÝÕB\c“èfJXµµ€l-º‚•ì¥ p % ÑÄ;œ@Œ’zK¸ò¸2KHÖf°åb`HÚ_›©†ÏðJE1¢.ÅÁDÖñ*k]ΣS¥{6€)ù+ß”×#³-ö‘Ë‘7´y,˜Ù¸@y(HñÐÈ–É>¿?²…m bpD‡ö:wzn>Šä<æºÆÃ¼bl`ÉÍ—§&ºØ»½µ—Ús-Ý X|è£Oƃýd¬ð P P ¬¦ÙA† 2R4×x3ûÇ28UÖ?£²¨IFæŠpe¦<ÇÔ,ÚÙwÉïÎu0⑹¼p‘šCé.pJh¶G>± Ê@ZañðtŽ•±×Á¢qzÀþò\þ'F?Ö‰e X›íÓ[¿Z@sø 0ŠRYódC²h ý½ÚÖs^ÖF‘ØHÔšŽœÅÏyÔ€þ´6ÚDr&`ÐÁd_º-°¤Žð˜ø›—Ù(TNô5°xnQÉǺÖÅ äh]o›Üo·µeÚ)Z”y—[Ûí! c±0M7^<3{€(`”|Ø0†~Ÿt†Cd”vJ.¥5hFñ›„âQ®Êš(xxFw~Ø`ÒÿÒî>éëÕoZ¿/ö[á@hõ|øj‰A v sõHôA¸%tquÖ^ !årTs´J],ßÇ«Uø¹«­“(Á=e€ñ§âGgÁ}ÄqYd 2%”MÎÀ¢o'K!m,‹ 󣨨oóLkCxý=›ª¨¶0Bm¶âٵ𹕈ë, jÙêVÀD(æif“`n# AÝ h®9Ñx\¡ÐŠ3«\.|À(\ x¼! þUýa° ûxħ51„AÙ¼ÎaŽÒÄN¬È@û¼<á,-Ú\x àiĉÕÃqq:óÆ8¨ÒQâÙ£äÅ50#Ö&Ç9†Jƒü$ƒÀ«@ì¬×ç'iQæ s ß!¹ô–ÙâÌJë(¬ãiÎï –Qi iI"»}ÔV@%¦ ©…®ˆQŸO³>bF{º 2&ûO²o ЬMÁ†S÷â;Á5UÉlj4ìr×îiQ÷ÞÕæ_çЖÍÀ@:¡N¿š(ˆÁH0WÀÖY›}?2³"±-´)b@Wˆ.~ w ±¤¡åªnKöʼn>É2ªÖÊL#'á©­Ü~ƒÊö³þÙ°oÀÑ3*»?óÏ·Ôµª‡QËîª×"SÀZ° Jè C(`‹,ÔïZ;lD‚daŠŠ¨ÉÁîºì$µ®«ÅÔi“Öõô$ôÈ0.L)¿Ì¨æJc#¤‡ŒZÍîkÀ ãðJ2ÍùšÞšg¼P£Ò{òöžã‚Q·°ÁËË]€qT¹ 0çµwKpLf˜%uK¬‘À'Žz³:3…]“T¤×‹ç_ òúÊàT‘^E‘¯OS `s>6¹¸æxyÌÁ'0@€†7^èJ°ªW UiM+™Ç†nŽœ !¦z¨Q/ ã]¬øá¢zQ{:s·gmõb_¡ñ.þ›rÅ[jo¢éÏwPsTbNÒ%®ºâò1œA@`E¾Ù`Ê À[±yhØ(6Ñ҇耡üµÓ¹G½QÐLÙe‘5ÆýH‡2‡IË:'~6-¢Lë?Îz𠹘ǹ&6€ –<%J'w&ý€æ´6L¿d6¿‹7ô>ü-ª|I`XŸ5à.U¬ g T›!îOc<6xE³OýxFÁ׫"‘f êZ1X/½ßš¿> BmHX#šMÑjœåĹíÖ±‹óƒ¾M™ÅûæX^ —CÎlmJ€âoÉ#íxÌ×O4«½<æÂÙ¹¥ û ‹8iI‰øy ©ÄÖ5Ó;T“ˆCšKˆ"±© £&†` šˆ[Åüv·ÉE3a]æƒÑ`ã‹ËgÞEÓô«=òh¹]ò'Î[ÂÑôxˆŽã§®;ß"G^ˆ´\éÚ—ygØžS´„€» rí}=7:2±ž‹'mæ p¾È‡˜kÙ-×d„ú{°èjøä θø63Â]äH‚5ÄSnp©‘mlßÒч.ä%Œ]Hƒø®58 ³6YÛÃFìà!ª?HW_¿}@˜ÞÍÕí]ÁT2òŒfFÍ¿Àh.6ݲ?€Î6—«‚ΚfÉŽs-ªü.W–Ø@NÿhJ‰KÉá{‡g¨é·jl¾OGK»Î˜ÆÓŽáà ‘¤ë¸9÷Ìð8eu³W€-R>²†Nô™ƒAî@« jÀ1«Y>!T^àè¡jF'¤6c~Æ ¨øqHølæËmøøhóP0(ŒC%À…ÏáàúùðŒ­ðBöè%æ1UŒÍM¾?¸(Í;æÌJk¯;ÎÀ‰9w¯™¦¢?·ÒSKÁï|â¸3mX0YoÑÜ9F £Ö!7ktBœ1+3 êžý]ó×ð B¶gLãÔr¸ô[Ç U®°.Ÿ' =]j ÖÈZ¬þ5**—_Ç©m ³žøç8Â)ÐÖP Dãq·ê⬂tÓª0 ¬M9Ƶ}Øc`´Q<ÅcÜÄ8ôkÕî¥ÝJÈ€ž­…cw5›o€'†È<¢Š)/êè¡øäd.øÇîÐg=ÂáüÎɯbãhmú˸Qýçá q°ô²¿9¯@g0Àa0ÀE°öîÒ!ý’å,† ò~Ñÿ™–²áO¾I(=ƒKG€ÀÕ>zôÂí¼’ªm\ö@-0:;^’R®j¦EÚ  îF7›¤ßχ醧ÕZâ$ „Kä÷^'O¿Ï6,4]*VP¥a”œa¶7YÔüò ‹`pŒáñ…áÝ èŒ„ÉøƒYÌ[Jƒa ËŠ”jˆò:Öj•ZÆp)&¤ï—³&èö N0ŒS m<"©FtüÃÒØÇ |q'ÀàzÿvüC[,Å×ÂgÌ“Zàf‡ÔÀ¼2Q ÒôçÓ‹?ò­_¨_ 6¸î³#ƒŽ­¬(ücÜqcêÏ£”c¿Z1ÈTwêý˜ºҵᚠò‚áÔªåxaAÆô‹c'Ô02: …‡†?ˆƨ  È»3 v0sS3 èónÈõzçî ð ððG‹%ÁÚk.q¤ a…ÅË©qÇh—|"•†$ˆ6^–Ç!4ŽóTCã Ü ¬}Z£P>üMC¼²ãEÁœ{–¿4,©s‰1Ž;…O,|D7á†1vWS¼Ý–70yàÙGÞ0@Æg}ÖLe‡© x B¹C©ž ]\‡/–øºÃR- è*ÕÕ0†_ŸP5"–s|nǘÜУû ¦VŽé¸Qø2­¬Öv‰£ëÔè”)ûcp`jî DE»ŸŠœÔ»,+ (¼cLu¼ã‹Ÿ¯ËÉͤ»{uÚ`XM<ă×aœ4ô®ã×°D4äà\¦þùÔÍf»Í)ã÷1€ì•C0 J¬ [9Ÿ3¶\æò,Ñ÷P¬Gqç8Ƽ”;ÆÓˆJ¿âiêï¹ä˜ÃaÐ!+#q€F`mXƒ”|BÓ&/ao¥µ©_þxèNS]j`FÓðÐë]Ñ1ÊÉf.§Á+±);¦ÖϰxÍÁP2Óy8Ú¡¾˜£v1_PµÇ*¨T„ÊÇ,®d0Uª9¬ ãuÈù`$HÈ?‡Î„Ì~Þª A8( bŒY½U6³Z‚l'+°õ Wƒ@!4@.0¦ÉV¶xüfhW=‰ü‰þcÖyëH|3,(ZØ\”ÇsvIHZ{s #Å?Œðo8Lùâ@{ [€`œ Eì™g݆q7†µ±©ÂÇhYq„Û߸“â_ðÉÖ¶zB®V©uOGÆÑ®»öïü#Ä8[ÚÚà$³ÝN–éÈhu²Ì€ŒsL6çÉÚÝ×C¡ßÕ °ÝB¯j‚jQÍ®ƒ²ówßÚøX±'Øe§&boÑ.cMÂÖË8Oiþ‘A›üöI€`mh£ç×#~‚ÉZª1ÍС!Èó¼kù(g1˜3?>ó Ýq>b>ó &ùXåÍ{ÝýµIétL…¯a†ÝõÀ|¬È‘b <¤…'˜°!ÕXnÆÑ6£‘f‘  Úù``"‹e>`@ÔÀ!~P¯*ßÖ£€põ0—ÒîÚ£­?A80Yë Hε£b3­§Èîàÿ –ò› ^˜OÈÄ›{‘ŽF7V˜¿Ëý5<« _¿üvð¬”ÅÄ–xë÷kt´uÜè´ko:ÑŠùxJ½ Ý‘™ûá–ïõ* <É1ðµý½soíˆjŒ±žÌõ 2#ÝÒZab6o4K ðephVû<OµHΦSt2þí"~>ì…ù²Ç®Õx‚K`N{hõ]çpÏİ•nƵ!ào”Oš ìV¶šõZ¶µ=‘&;S¨Í:à `ÂO±6„>Á¯Ý^4ã°Þ·_—¨·™Òµî`my™IýÆ;xˆã¨²™’¥¼(1¾GaøÎC0°aËà $ÜÄÌŦ—`FÁ'î0…‰´ÿ™Œœ•Žh«=ZMEÕÙÌ„û+ ^Åfb ‚‰µf‚—`&ÝÛMßðaÑcÓZQ˜ôuSK»;€ \39kp˜ó$tã©oq"ÿgBMšÉPÒ< 39Jzîp»exZ"½ÐW’³u²†ðÓ¼ó d’„+Íì}êÓ ˜»5¼hû™¥ bgCf$­ÿì)®ãð9t}íŠöUŒ‹ Å7Ësó­!ù¦×±<—sWÁ¬¢€Š}¤ùœ(ÂÍeyI¨Xi–l™éÕjAû˜Š3ÓA¿M°,ž¢q—™š>›ÄH…àLΜßI+à˜Éô 5›(ü;øZ&3]Î5MÓL±®àdžs€U=o¶“™ôœìÓ_ŽÚ4A'òö¨oæúê•Îuâ46 / ¹•:'Ž?ˆÍý@3$¦JNXÌ3yø°Ò,uòdÛœ&M ¬‡nIHÂ~œfóP ðþ¼èøö'”º ¦KrCßœ‡n€ß gyQ„,­„Áê#8B¨hjœ£ú‡š¼þjåÉŠÒóC&ÙŽhXaS^¦Îa­ž¼(ú€ $Üïe¿OÐÌÓÖ‰ŸùÖByšù1ŒÃZ-xÙi •ŠW㉤Ö¨ÿ9¬C;„#™S˜^X‚Éi–ÓKÕÈ^tm‚·`f3y¨*”æÔjó é5 §¢éø4Î [XUìu·ÉÉ@dâ`’ŠÃÖq4Ò!U•,óÓêÊjîHÐëµ"f×È5óL¬jSY&H ¦³LP+ÌÃ:pœ3¿JÁŸ)|.†9&Ém"ÖIÜí]«h‚G`mÊ1 äqM‚Ý>ïw(¼Ñ]äqb<1 X¯ë|aà‹{´'’ušs2"*ÙkAxñÏLp¬MU{z¾ —ïšdÌk“±AÛ‰”ž™ÃÛñLã<Ã݈UmÕ$‰ÂÌÆ/3Á:°6îΓ¥›¸j¿d«xCYƒbƒÕ&Hº\¨È‰€û® :‘m>³Þ•Rš‡n½o¶ÇÛ• Ìl¬7ZÓ6h«¹•K¢’÷ç†Wòâ‚ îùAÎòBì¾Ü?ëôi£líÁDù„z.QÍ^ –îËO7 XyDàY Ùã:¾æÑ…%œ3Û*ðÖ¼êR¡]Ì©¬Ì•š^rJ•«ÎÅÁÚè'@œ ûko>€‚ÛÍA–®?L7lä>1 ,«—–Ç×s 4föt‘Pu]-A¼@lßä†Ì@”b¢oÞï#*Ó£6An0A0Á&°6ºä žaÈ?Xö9²zÌl¦Cƒ df‹])È@×!ŒŠ âø Ì«ž©é9a!¼``‚W€ñüÝ1 '˜Å•lDùk²G˾=.ÎáeŸ‡y€?¹óvœOP̲G,;§î§&€Y˜ :±ÏbUqYǦ¹Ó’Š—4óÔO$öÍÒÜ%˜J8>Ászó#PÿEô½¦òÍB¾ü[¡ ns¨jFWˆ &@Jóh"ˆî~ÜIÁdDDÏÃ@°Ã¼ÙËË“  ®&ÍÀb¡AÍA¹‘Sóõ›"O‡8@|«ºY5às.Wâú, LË™­ë7^hðLªA T˜Å<'fqÏY8ñœÀsÂ’Årsž(q¾1îŸÄ¾köÌb®5ú#¢! "‚Yæå¿WsýQù]xÜ“ ]ºP©²hmÒñ[åysF°€i!ÛD¸Çò ìú‚ ]qˆzLPLð¬M;*‰‘w«k¨)ýÄÅ_à_™Õ\‡ÌOxÞ•þ]†¤'0&ø¦ò ¨pßÁô‚í‚¡:ø¬ôyQ¤>øCû¯77*«Ú<®±×´Uæøê€ÐÀ¬Ùܨ &˜àˆ…ôåQäY³ü@Ð`V7oj ¸y3‘±d¾pÖ¥ôDQí¯¢È¾yIï”\ƒµdûþ7j!R¿+©LÄhÖÆ¼µ¹¡’ú—ç’$hÖÚX´Õh‰"ˆNGí÷ÀÛá R‚µÉïV K*HP ÌZÍW ì7$œxBy†YX}œ€€!ÒÖåšK̵ÙÄg´¨6¤ÔˆwáÁÚ¨ŒùLrï0×qê–€NØõˆÈµõë$`Ž|T¿md>ötWÒ/ÁÚÜnJ7 ¥iN‹4AA0«¹9YV¶ÞÌï|ËŒP-¡ú\exïí=„fº6¯Ô¸oƒE±>0÷šÕÃ9 †˜1ÄRöÇïÌ#KÇY§â•шUbS÷ß“iUná¹1«Y8„zõ”¢µËìÍuŽ xúÞÁ¬ -äM L¨—œ¢¥gªÇ]žôöC¤T[~˜ÊM?OÆ­ÍÂy”ï 6F‹+éÂ*ûêTZ\‰o5ªÉÚè|"Þ¾¬ªæ %³RáW:{9¯^iV}ŠsŒŽ'_‘äßs½çú4WiÞcÊ•3‘_†0±ÍB ‹i& Ç”Æ ™b#§{zÝl`C ›¡èèÖÚ”´ÇߣάÓäæ³¥X8™ï'ÉÀØâeйÎ&ƒà¤`ì Þ‚)ƪ61Šç1u¹wž°õJuÚÁ‡Á–‚oíðrQ¹Æ„ÉÚKÓ\X²yøã«Ù{–Þì,4…Iwáœà'Õš@lO1Sf2Œ#Ÿš(=jwOò?k0ËO!~)Å"ŠÌ“ü_óC (»€2@ý~Õagrñ:é¦@ #˜RïT°í ”õ‰åI.æŸÇkП§Â‹¦ÕÛ/|ùµ¸ú«¨lM¹M%"¯Ô² ³mm&û¢¢Ý–Z…ž"nsÃí6E<·€4óÀ[‡j¤Y ˆQ? øcr2µ³˜m íGœ6š™æî¦Ü{%ÃOÐ ¬ !AD9•«V‚¢'„¬5ÔÔÒumê ¿iMÖ”ì=A`˜b!œ0È„2V°È,*ïÎHáls„ZcÐú&ùÎyíÒ|!•Ïq/-U1d@:L0LØvkC[hÊ)^iÄ^t‰Eå§Ü Qµœ~ºuÜ‹< Šaóôveûº¥7Â!kCmv-“’öóQÁŠ@Øùhþ >M±(XÿeðÉÓt`OaBŽÉHy>ŰNJñ×%T+›–WªçQ` ç€ -Má…~+ó2U'¨¦Nÿ®*ðÅ4±r*æÀ}0éËq6#˜׳Y1‚ 2ŠÙlÄÐ1Õ½`FS<˜·¬³¹Ú‚´êi;[3ð±®SqÏÆaùˆÇ`[ŽvÚÓD-ßWmé‰ÎÚ¨õƒd+;ƒ>ß$C,u>54;›&â¤û~hy¢'h&¸&GeÛ<ÑPùœDžóÒr‚pqF‹²£ 9C™z®.VÀ1g€#ðßMd¼ÏCÏŸ›—c̳U´æR‡LYÆ!…øäPzu‚x`6éŸ<¦i)MR(•¾3Þ¹Ðî5–„/nÑO:y½òQÁl;ØÏC8©¦×[Ô‹|‚.aÎÄÑÉ˶ó”ràÿ«ëJ%Wqà¾Nñ`ãý/Ö($A¾ÞPõœ04…BÚoO2/è2C鮩ÚÕ¯[Ssš[³ƒ'ÝšÍ,¸ÛÌç¶ù–ó —œšà½šÛyª)Äz´9ôÙ©Ðé¼R—dóI…{ _]œífí_§k7á@kêQ6×ÍvtH¿¨L§‚9Vc]\7ÐÞ©Ô?€zÚœx@R©×dW[ÉfïLõaÌváÀ+³“~ñ˜-Ô*þc"*Á$ñà ¸9Ùw*õløp¹3T¶ƒ©®±Õ L˜ZwÙ»Ø^CˆÙ°=ƒ\ú,Ü!ÅQdSý¢³yš "J)w¯ d€T9ÖcØu†œJçSùæƒ)RN‚Õ@â("`ª+d*q5P‚”O`¨#¾º^1] RI>[ ³V_¿×M¬Ž2EBLg¿RiasVõ M¦R ¯‹Ãéy ]6ÕÖ·¢èÒ8Xt¾ß4SónW¥IR‘j,ßþÕ“È¢óà]ÌÞAûlâ*£Àìνƒ¯ÿYZ¯!BËHS ÇÙ/’<ãr£#±[ÔIûVþ¼OÂ9ºs¦|ýŽ6D¥=˜ÊW0±et”“žJ€0»k;hH›G˜™á ëjþك-a=ëLöØæìxå ˜|B§Æþ[‘ËÒäúʪrÍ.NèLnT¾zDj‡…C pWœBWï¯&]¯6’´€‡ÜÄm=Dœ;ÆÚq»î‹õR3nŠÇbù 2µªÃjÿö„¯—›Ukê~>{1õGñ³»ûL‡9ONOå¯2lÔç÷˜‚í{^áÇé•Ë& Ü,T–©¤wëEü5áÙŽe(˜½ñ×lX ž]©àiÛ]ªj ^ódá ‰3öM‘~¨gl«Y­x û~Ù¥4æ½™V@U;¢æ5QAnû35ÊòÆóÀ-ÀxÞ+¥•qàHiÏ(À ª 'X$×TJ€¸t€6K…S77ùëoF®ÙñüþàUnO%8^U¯¶»ÉàMäMe˜Ý}é©Ã¶dQÑ«†Ôe}‹|“þÍŽ/€$5tPÆA þÉõ»õrv¬ó£@?u•‡"Kóª5x8ëÿ뮵‚ñˆ²Mg¨ÝÝgǼ³½µªùû”Í!©$3{¦ñê÷Ý¦Ùæ€E@kÆ•4®o­ô«WR!³c(T(/›.aÝùƤŸ0 S æŽW%è8ž‚ËB[ÉT÷–en#¢,/›ÔTúÕœI^&R%Ψ–‚lO¼¸hƒÐ’²Lå<˜JS°|h%J˜#¹ª Ï$B–¦“0M5æ0ç’„Þc U)ãÀÎq ⟣ ÀϺ#cgŽ;uDS¤çÈ7ž–i@¸ÕVé îø¢ü«Á‡Vr„©T«Ñ×gØFÙ4ѽ3ªm`çziCÊ-° 2€¿×1Di+¾Hyÿ6UÛ|:¿àPöÖ@O‡Ùœ·P8Ù@i$FíJ)÷¨éÞ>ÀÜ9Î?ÕÞšö¿8W†q£X V™&æ!€xPÏöðDouÙÇ…ã·rt^KmšQ½v+ö¶ÏÕ/Áïfth@n»Íeƒq[àê¡¶8È `P5 Žçh÷°54P'Ôé6>ÇNÄ9ÙR]5Qâ«7ɶÀ]}Ф™AÒÍy/z¢ž,ñR!÷»Åþç@/»©Ê:0ÇCÚ9•I`:9ñű½zi˜†Y}šªÁ£û”íhÌ/0úôàs°b½íûÚ™N5À}HhðãMÔš³KUÚñÄ;Uh²§IæaeØh?*ö»[x~œ¸ÃÉëu¸ÅëÕfúúå´¦îj€åÆMPÍ"OeKI<õ‚ÖN%˜c¶ç=TR ¤ÉC–3£1¯ùL#=Pò« ®—6Š^ÎÏ`ð4‡éPWžð–,æþx†5)~5Xæ 4dÆèüðd.sµŠ<‹–Øvê…î ;u”ÉÔL¤Õò›™Ç}çòù¢ ¢”Ú`~åèwpØ—õ"X`JN»¥¦Rž·é£ÜsfÌ\ݧ§2LÍŒ™‡r@~ýÕp–^ê;}ËTÙ}Ÿßb ­©¼s:2­Iu$Å\õ;XøZæãzPB‚©u#Î[…(€Î`”3‹çó0h§ =ÍpŸ0Ò¦ ´¨Šã<½ÞüÃ<+Áø:¸ezŽnÏ­Y`G•f=±…Lók4ö•é) Ûº žL% XMýç™Ù6>‡oÈ ý v3»X_´À{ªSi ¦rÌÉÔ5 K¼ä ‘¢žÂ Ì÷œ¶"¦0çôY@,ozßT¦é©u%3sÁæÊõtIÝêWƒ@™~@q?ÔÒl%_¤›³]Ú¶Ò¬±…«L’LÍðŸ“n4e6˜ÓÀD@Ñÿ¯ HXÙ+f|Àã ãË9+§’`Îéep:=¢5IçaïÀ»2'ðÏÖê i"§7…®†ç|fE7j­©´QêÙõæznÃ5¨´ó’O/4Ðâ‰ÏS ¦Çü‘^ôÎҜ蹪®¦q§äs2ÒçâN æt(šêús(ÚT›oš]à ¯Ï?ÄçœÞMä߸]Îb~¯”h¸”˜å7øˆÀ" ̇Å¥þÊà‰–Ü $x¦ï{ªIë‘­Õ“Ö?ƒ¢"ùvÃi’å=Â-zAÔ4õoÞ¹ÿÛ$ ­Z6v…§szîÔöIÀÑãÇY†PSn<IËŸ©ù˜Î …|L=ë"²!½pú[§åóñÛ¹ÄNpÅÄ-× ÈšÐ Zà P³@áXÕ}?œëu æä'ÈîƒQî =âN%SÒ#–k ”€×=Ôßf¬ýÇ»ˆù&× ‚[ȑҌЄêQêïÖ|*(¡£®þ†¾_¶Ñ2V”þÜõ;™§Þi4z†F 'K¼%ô0˜oëÇ:¿·4™þŽq «Þ  úXø;á³PlÌ›©Ç›—y¨ô|Þ¯XpC÷Ãñ¶¯ß å¡XLA£)Ã-*¾^˜¢mÄ´ ÆD0E“õ½èï|Z³õí~ð±÷ŸY[1®HÕwàS-Ž UTÁÍXQ€'´|VËÑsqƒNÃn3(tåžX¤ç²5¹ªTIõs<¸ŠÜ'â¬ç£Ï¨Âƒò¤Ý‹¿×îì÷Ÿ¾ï‰Ðøfxˎϰ)–־ВÑïéñÓËÓŸÒÿp˜M¨WL¨ñxÌ]h ‚™ágý-».âÉ©Ÿ€£g=~`°É6kó@¾°D΢»#@†ª–¥}ãÖ4Ö‡z:zú²•ÊŽ#hŸJÖz\pÜ߀g{X\+Ñﯶ ´§¥5 =ÐU =<¢Ž¡øpSntñLÏ0íȰ?漞ô‡§]Ë¿ú¼3Sõ7¤¦’G¿VÇMW‚ŸTzÞ'G)HP:4³/–ñà½ånï8 í¸<*<ñrÙåzÀŒ?ÕxžÔý½‘C{û“CÿÑz’õôÏ!sú[¼XALng„z¤´‹µ«Ä.‡ªQzzkÎlæEæ··°š„;‹†ØºÉ9žž h½½-” "5A6$HÁT)/ÔÄҿ̹ ß‹¸ VÁÔmþ=öl ðh|wn}ð¸a5éñlmPËtû[K$°€Ï]0ŸK ghU[…¢äà\O˜oO€Ì×/“‹JцõΨQ8cv܆¾ÄëÍ=û‚ÑNž&ýê½oV‚fˆ'Fèy¸Þ%œºŠGA8R¸"CÂå»Ì /å Ž†9×sí«=ð7»FÓµÖÚœôçðÇ{‚d§ÁÖ>OÊhÙ³½íBjgw”ÏãÙ¢Ù svß´2LŸìŠ2‹!™0”­DO8¨oýAë\ìD[zÆ ýï˜O´dß^=çkÁ±£ý iÄs5ÿ§ž ·ÐUÒ„Kè*¾NÛÐYz9·Gì*ì]»ÜÍX&‡?!ñ²ùRm3ˈUw€ˆXgÙ~#ŠiÏóõá°•GáÁœ…EÂo®h„¿Ÿèz.ÞÑê0lÏøÇµ¦³]æ]M™Ö/å5ß3$`.T'3„_.AëÏL#Ú[žÖ@G5è¹è{ñ­ÔÄÍUÅô½ž=cŽ” Àî¦gåÂåø0Q®sÙÿš\Rëþ£->ÀŠè,º¤ Žû”r-hv‚´ û3Îe„+ÐU—k»™Ò `¾®î6¶“÷ÈtD¹ŸJÙz.v‡-×rå³ñnkJ·€OTyÞq(ëðˆ³’äqqë–ªb깸ÎÝêi Eÿõ Œzk b-w·0ÇÇðøî„BOu =Ÿ×Z`ãêÉpô¨¢!oý2öæ2ë<›¿$ÓWܤÀã˜z^q:«Í‰€ 3LàÆ™ƒ†W  Nˆ’Õ ˆl?–ëüÉåêC(©¾gˆòã4¾áà£ð ÜòÜûÔà_§ÃëFÚ‹Î:ØADA¨åéS•%8˜aÂü œâ“Àó¡2+XÈ;!PÏÍhͧ¦í·G`¢‰Ë4r&Ôêñ½¤\9 jJ¡mC;Íÿ“LIÃä“b„ó°w‹Å¾Úñµy¸‰˜v=Ma®|ò›¬9I!Q=¶y¼99²³N5¤ýÀäÖo`óÙr[`Ü |’ù3}’ø—û óäYæƒÔ%ŒSÝ ©›7¯3/¤ªBxÈÉ…Ÿ"ó¸֢q€OdÊÓ0²SZ!"ú”©ÁMr¼ð&å²ö© Ð@?{“º¯\¯×°uvì9b˜\›·¬—r•ÓÐ3ðŽåµæâÍ©ôÿò'‰ÆçB]JœÜÛ¸V>E¸Ìɹ Ú?p =—½™èA².á&5ðû¢vû”{§è÷R(Q¶“"³üëèHRÛûpÂõX \ ROXe[èRƒëA éÅx*¨ Ëß6ºX¢íçå\ñ•Zñdã“áöTP1×›ù²3â*¸õÇKµø±·²Múž }Â+Ãâ‹@ÏŒ9~ÏÖƒÃQ àÄœ4›<2x»óñkA©‚ü|üB#P kDÝ\(•ôrÓ•¬ [F*U:ÿ7{—à<·÷ßc/¨¡'\å$;‚/s°Í¬Àléy%Šº ‚æCÙn ð‰]ÀðZ“ƒ/y&0Édòw¥]0&°óéñ­P€±BQw=­S–F¿Ke ¼H‹Wèˆ')QmAò/¨šóù`ù;$*.ÂIX.×Fãuáºaé_ mA»—Ùä_g™éÀðˆ t¼¬¶À.BxÒÖ¹Øë‹3{'Ì4ú™ƒƒ²Óñ‡±ë8÷öå›â%¾?YIÄ¡Ü0þc´–ÌEV XJâó0ä9‡P¸õ&G­ñ„Å<¦%t]´ VÌÕ bÉþ–`‡zÑØáÂÌ©[ôH= ΢ÃpH8/Q2þˆ«±xêzVn©è Às=· !¶Ë{Mœt s‰Aó#‹Ä;âˆeRé¿ÄÙf~ÌŽ5B½ÙK.‡w*nèa¼vq›¢/5€—~Y´Å ^º£âky¡#PáÌy+FÊââ“ô4.<Ô ¬)Ob•A¯ÆÆ…ߣ4¢¬Žòì;±úÀí§áÝ+Ýf¥ò˜§Z«¹ìÙÂ[ŽçÇÓßêgàƒõ„R µ/ "›j2J/xöH%周ûŠ™ùº3­Nw_‘Ú²­4Þê`lFðG·±/3|C[Û8 ¹¬»±s%¢­Fì”þ6\víÌq«Bmý…ÄZõDNÃ-QËžQV=OÞúz/9hxJ ÄaA8¬ šÅ…C<Âæ¦ìEøoôˆpj5æ¬Üy—×¹XÅM01sõÒ/jU‡ýKÏ-·Ô*œMf¶uÍ1b)•bí§l¦žW$4 ÆUQ]DO…ïôÕ-õ†Ó±Lö`â—lIãžã¢Ç AW{‡ÚáBgW„rný?¯ ÉΉæ=>T2«"Zà[T¹ñùéʼnžŸÑ9¼!Š1&_M®¬×ÇOV!“–}ˆA©°1+¶® ¹X÷„ ×luœŠ‚)eXö«zmÎu.œèÕçΤuei (”©gDüáwBÉ€é¯Ïl‡4¨œl‹—²£!Àûñ%ªÂ–¡f^þàî’í;ûÌ-Ä Uñ™«°æÞ(ºe=x¡Í¸Îô‚ÉÎôºp—„m(T³­à ÑV©%Hâ Tƒ©V3OºrꃢÛ®º#R3ßJ*î¿)û)‡ÐYÿϧßåá¢×õ10ký£`£Þ ­¡Ó5Ø—‰ÏÇÄÛ¡6*sƒ§n[žRç†D‘^ß´gý}*xÿxð·ô+…u]ÐØ¾³ G£&tpÞ)0"ü®š:4üÖêòúÙëkã©Ls™õÇ üäFê¹³öÚÅ•K£3˜YaÁUcƒ;ˆ8±¦<ö"cú_ùF˜—^êBÿßœMxgQ>— Æy÷bîûÎø.w³ã0ûÝÞ"ªŽ|É;æÇêñE(LG~ žJÓ¢BòÕÁ_00£ÃtSBúéi²JÒ`nm¼1çXÌ÷šÏ+Ïüã5FÌnIæþNú(²³Ç¨E_ó»O^ ¤¡’Ãÿfk’×ÕO}p™1|e˜“•3¼} VÔÁ¿¼˜ÃÝæ‰wUÓB.qÞ`µÀ«xjg˜„ùÙ[ˆj7àBšëeŠå+)þø?[bë«ÕöÝÊ`»²Ž C’P©C5´£)9…¶íy^f˶ö±»ºÄ'Œ“+“»¡èÑ^?ZŠU˜ Ì6Ì®–ðAÖÆ 5ÛE ´²»õ\¶@Hzkážèµ×eê¨eöøT•ïb 1Ü?ðÞñ&7¡¨ž÷bËŒ<åÑÐcxá6Ý’[7 Š×ÊÐ¥ÆC^©¦¦èz˜D¥YÉ0Vë9bjZ–f=®š,Ø$èE v—ÛîР̸µ×*®nZ¨ßÃ&˜+¼Ä8ˆ¤^ó·ÁÙ6r¤ÁÈnD "°Uî@5\xvýj¥†Ã$k5ÄY¾X@«±Ž%H.ƒ¹U¶.…\‘ÊTqKÓ†¾y'Vƒ qåFû3ϵð¸ë·Š§Š pwº.=o)n9JÀðt¨]å õ÷bÇ`tß eÆv±‡orë·ÞQ`¥É0˜÷ñ6šCöÀø¸¿4 !€ßA»D³¦\k(zþÛaéé2‡!«×ÍÜ`¶µñÆŠ"nm$ËŠŽxK,å©Ì¤GÏÎù&Î0 ö¯ÃºÁaØ Ö¢ÓäñH¶%Ê %âéØ`‹îMê †c3P,2²‡CrEQiFˆ|R}£Dê£ÞÀµ†÷]›>ÛÕÈg¦Çç%ÕßYsþÊtÚ¡¤Ñ@Õã‡E[«¦¥=9˜^ÅþÉ‘V­ï`ÿ*ýÒg‹ú®Äív6¬ŽÇr(È‚Ëý°|ãÔÂY×bæ½Á»±Ó K)œt>Ú¡ò^´ž)«úÇÎb Žz¢ß! ¯*f! ÙîéΊÂÙ@¼¬ Úž?·Fñ l÷‡cÛŠB¹¥£¤%È"uôÖï¾Þæ Œ¾ISðÄk¶r_¶6 °Àzæ>ÜámìSæI7°Ç‘Œ¬ýÑéÆh¼yŒl´{gìpK:‘þ3 ¼®ÝRÍ+„²[§SOÀ˜€c™²þ`*ÕðXò¤ïEùµjBéR½Z ÷¤jÃá1/š¥¥ˆZPY[³gÎ!á耀,g*Ø£»y wÀ 0r´èõþl¯»»sÁ„”½këoÍÚiÛ!+{eOX*J«‰Oï£Y"övX•Ø•7kB¡:Ó­H¡þãv•)äãÑnÝ–Ø=ß ™'5Æ#ÄDåg©Ýåeo¼æâß µ‚×o=Ýærr²? ÓzDnªfV`ÁdÕìÏ×è úοägïÝåg4„ß6åp×Iƒk~Mcâ£×ëÈ$ì0ìÈ×Á¤§^ÃRƒ8:ªat^mv”ÆMï Mš˜YEÝ6f…<ã%°)X”þ¢fyöáÉ6»hìƒ=›Ná°ã#÷¦Fçïqjt>f«ÄœdÔý½hdtÚAˆ•‡¶ÏAcÌÚôU-ú, ‚e®'œÏƒ ¾zÀôHu&\øõu|¿þd2ïHÝøn¦xMB¬[8ƒ«¶=[ô€XÉ‚e–±”¸0ì ŒÄH4;ÆÇ~5Ã[¤BAÕbµ½ÌoâÊ>Uô€ÅþÛnFž°5òe‘¬ ¬Z€^Œ{æ ”Jâ–S i-^>Œ4+õç ˆ¤Ážap¼³éŸ+ðî™»üàÐC¼ ¶±SLÙa^†²¤ù|F@ÑäKÊyqá°¨˜ §2üzHª§úf€¶akŠ–W½ôÊ2*Ÿ¦z2ÞWz¾­Ñ±µZ¾¤ð|¼Váïù|¶:-¹ák7°aYŽ€5œË¦=“Å=þ TÄ(ð(|¬oÂÈ5Sbùt À)0­Ëá(Ø/ò´#Ç£>“½ò(ýQ–Qù ^k#JFá_ꇛ9¬°¤;Ì–gò%N4Èh¦ö ä…L¥ÜÜ5z î6.zCØNô#ÎT&lÕwICÆF=mÀ0W” dû‰1Ïj7Õ½„= 5‰9z8עɼF³»í989úk{nˆ^9,R^ÌDSŽ´êš2ƒÈ(¯“Z¹A.¡Ët´C8•øþhÇU ^~Ÿ64j\†Í6l—¡e œ¢’z|¼ŒÖzp’Òú–¯ØšSnËò1xÛÂ!:£w-¥?ßPÉ@*–3x®å«¢Oï½íš¡pÿò佸.Ç|³›Æn7Sp‰ñ²eg)†“õ@ŽìÓ™¼.Oꕇ(³ÈñJzÅóßC °¦ù±åS¹îæÇ“ÝM…²Y×HáµFâ]UÂD±òa7šÆ±r—moɰâJeðk:Ê…íú£¸Í¤™ lšÌÃ5ШÏ~5!Îæ†™LHÓ™ø@¼,`&ð{Ómý!uˆ{¡Æˆ†pدg¾· u«m–œŽe8ï$ò çÒÌP/_NŸÉ í3ƒ¦°¥Ä˜«3³‡x5!˜kBTNqÈçüø{ð÷ 觸&U hr3uðö:‹[Ç=Õ¬ZÇ…‘šü˜fÔa-ë°Aja§ ÞOx-§y-‘FhÄ(@ÊßXÕ¼Òn…xìESÂ%ÀÝÌßlà }]yFðRÆ““•¯Y“I‰Œae dz ìöL×fŸ@µóQæÀVŸÙ8aÏÏÊ4†ñy8çšR[òÌ-ΞuÝØÒtœ•æÿq÷F¥}œœ^ k úbI1¤ ò>w̓@³±=þJÔ]*Ñ[JEܳàxäJnœØúçeJUU95²Ë—€crr ÀØk¤üÌ$'w×ig³ÓR{ݲ·¦>%„×Ü ž“DÙGn¹7aÐÌáÁYÂß=†ï3&»Á©MÀ·¿B¿ *‰RuB¼ÄÈïäb5J,–&ú£Bß:i¾Ú‰bŒ¨ÿºâ4²¸™E§NV¸W¯‰¶ïÓ¢\#:Ž’¯?Ú>¡ÜuUÞ¹ª‚W]¶?ë8ŽlrD7ýÀ)0–Àç‹ê@z Š‚Íf‡|×ä;7Ahý>œzò@ ¥M}³,èªÿÅǰ"àñWòO¥~]5ö¸H¨¤`>Eà‚‡Xy=—WØuÛ¦áȳF³³o깃~ vÊfzóÊ6»úë:V¼ Zr .ûäÕàÕV>4ן@½æ ¡m¦„Îdþ‚/…üip€O×þõ¸Jã™Ã""Fg/!ÔÑP°NÓçáWÍl@k_^ƒÒ¿ýƒ]õ­MufZ bi•ýžƒwÞµó»f´.ê&Š•÷†;¸›@=’œº¤«·,fÔ|óÛ _‚!2òH2TƒßYžª_i5ÔŸ >ïyÉ‚—áâÓSÄË.à“þ~ùÊ6q8± ŸˆUÉ ¸JIh•Û Œ)#C’½B”ï” þr§ŠGzØ^•Å–Ú×~3î$ ª¢µ 8ð=†ˆãê—;Ö§þ¦ËêN•R÷,Ú=w+{Ç[a@Úž Ÿ©™õ©Økñý8!®1‡ÿLŸRHˆÚÙÒTÊð(O…S‹µä”é›®Mèhwר0£P/˯`kÆœ°¬Qº_–ä[™ïÚ1(o7ÌÅ” ñVÌïÞ]¿S× Z›] €ôB§ÑÛ€îNŸQqéÿ1î—ÁŠvD%ê’xõ¤Sñò«Òô‡üTø’Ÿªîâ°‹/ð Øí$VL%Žr“˜wq=ÂãVBÿ¸êC$•aº@J„ÃújÆ,·m†öDòDtd¶ÃO­Ç+LzÚ›ÀM¢ò¼AúØ2°»æì•˜›°E&Gçtzi‚·ɰ)…Œoð⹡§r½¶ΔßD[·òÛfŽ´¤÷j¹È ^Øt8LìY€[)»Š¶ì Žd |ôåð—ùLÕ6FÈÙœùÒì¨FRòL '·rc0¢:›@a’Rvé²#Ä`”@ê.p¯ƒÆ–Û1øNVË0 º?=Õ¢Ú†FŸÍ7ý™,µ [³;¬'\Ù½1h”@b’’y©Y#ïÉBKê=ÔˆÇq0dWFô&Ú®³„/„U“ ¯Ä÷aœ.%ö§xf½6¸÷r„ò±Bú‘IJ`^•eX~yx`fIÙ ¼õjGÜÃ@“œíˆÙ+ÀÄlÊîÓÔ ¹562(ø–k'ØCWÏz¼Êº9_t—'&™2²±G‚Æïic…-W™º0‰½ÁËÃ@Ì@©ä] †›uø IÈýFîfrj ý?îj;Xº– x‚)_2¤tµAÐÌ{±0O†;ü.¡ף{$AH†b†¤Éyy™s+ø3µsþžÊRÎó–àN?<ûÀ1™r¹Œ‰^ƒàÐåG z@¾×N #Y-¬gݾÞxB"UÉHÔè•PL[v/WÍcjTèñ5ñ†c€k‘œ‰ø§¤ä&¡à¢Àˆ˜/ÅM¡‰žJÚ°ˆ êOï+úØÌç·Qwe¯G˜\`KIÈ,^-·³\ù—9·Sæw­oÛó¼ô¼ÁM¹±uÚçï7´)08NÒá8a¯Ð›~§Qîò~-Ý#ìôÞ—¹â D*)ä/±Â›s— ×¢¹5Q`%²‡&qà”ªàtëÕÙN; Ïë³cðÆSÌ_˜ï„&ÈÜW ÿ^ÓFÿÀ°C|Éì¶N’a¥Ï<ôâ²ê,(Ó°ÑÜz(®$•ÏU°µêJyüïêª,¥›Óÿ±0;rŠÒ&BIåã5‚¶¢¥Š”ˆPØtR B£F~|æoV/Õ¦-tÙevøO”CÃÌŽZ!æ«ÜKŠ÷äuî°Sôúhíú/\,ô$•ìq¼'[_ÞàˆFVKoT’¿SX,¹Ø9w72>ôÇÐaµèJ(q ¿“£RÉô¦‡p뢬 XgßÛrûÇ’äÛ* èTRþ‚WÙ²®`ѯ( Q¸–¢Õ µµˆïlIùZ+k–!´™ïDw‚êÅ„c&Ц¤Ë™Þ«EDL#[eÄ©®K5Y4™Þ4/ šXyEÌJakófŽêB!eÊ[†˜uÒO³E³~jü≶¡³pµž•–8ŸÐZE“‚µƒ`Òå©I*fã!Í32_"Ì©g¸—´(©Ôy "Ü{z°2(— EXw%¸ Ó×úG*ž‚ÔìøþMFTnuYõÛŸ:¡2 o ü¨÷œUºv’žž@EélÓY•dFÝ—Ìü‡[87û+?À.²Úºß ]ÙrÏlœ#Šùñ sKò´À/ÇУÆÝ-›‰¹ìM˜”ÿ$dÕé‰ÕE R³ºá:Õv~ƒêeðfž`,î£~ê¼(ø,/ÁHKA*ósIT/Ę$âD¦s:’ wú£§¸ÖA–Õ=½ÔõÑ¢žSxkÓé÷€=¶¯½Ì½M>¤[øe)GüT¸Îøi`&Ý® ~‡øÁ˜ªáU°yåÞýëicQR(Á bЇû4)ûb^1à²ÓXôׂ–ÿב^ƒ¨˜g Žû“ÉrGw˜É’”*¥2JòdvFAk"ˆB™UJÃî ”Õ6 ¸QÒáÓÄ=?qÂFÀ{†©ÀW¹ÂQàéHÕ‚Ù` Ä­½IyRNÆcªØÙ+²òÿ Ç”bÑJ6áË,‘Tº 5Ç«v”vI5$It§w¥ÊÔ3bÚXRRåè°f·³ 3Ò+žKBéÅ`yª^¯š'vs‰qt-0Àl=+0©§üQëQ£Ý&¾Ü£SžøIñC¹ü{(NÕAã§¿«ývû‰}ôoMx,饭L MYm?:+œÏ·Õ½6–*gg½3R6’œNrO;¤þôF/+l²µ;¾á®Ü˜+ä­³¦@‘/Õrô·»©VöjÎQÌ2LJ‘bƒLÓ þk¬ë °Â ªÍ9QÐa‡ù52óBCu ¨¥A„‡rmì÷8P´¬¿ð¾0!5¸ î•|BõAšU®/å¡’æì,Üþ. Œ)©^`‹B“f ˳ÇÊ5[hzlí»Çñ†<Â]¹B2l“¬+Õ“•€W€îTÊ¢‰úáEºú¯@/ØSVk–ðÑÑY¤$"@çj$†ªÇH4 U—,¿ÊJ¹³ =ëº7`ˆLP›¤ áU§.¼FÊæa ú°Ñjd$ÂKŸÔ$¥«pß“žç®/®ñjfßPY&Þ…jKûø;õ kIÍÑš@6zYú £Ë SI-ñôî{.’5ÓoqÄxê‘*X:A.1HƒúWJZ¯#ZAxƒìë–yM¹d2zr›ñ¼¿È ”+©yƒ¤rç5€¸0µüCw¼ù*¶G§YP5¾I; 4IyV¢2IÄÐGv¾Çžiò°¯#IqObz[£hp8®3¹€ç"5“ƒ[o^£G7}Ûô“ÐåÕ‚ï3” :ŽšåäÉ*÷a£ŽA¿Šj"r«¡oè&“Ü6*ˆWRsчÒyô¶A©?Þ>eWYæøž•Ðf àCY-øãú¨a±ª]ÏJòCéP”5máøv%¹ «S³»…(NV›œ1µÊ—Âï _ƒÚª¯.©Ò,8…–V@k¼Â¶:¯3to.éévñe¬©–Ûá¨?³E߸ƖÈdƒ/xb·óô†[6욬.zˆa‚Æ×w&4Éú l`¦1áÎôŸˆ9–ô; ·”H¥Nà^Iʱ‚Qå>â9 l5éŒWuáIÅ%%õÌCAzðÂr€‹˜â)]±cŽèÊ©ãM ‰gFÈö ËLî”g~ÍÉ6ÙŸVuŸ0ÕÀ„ý2_'Ы¬Ö 6’#àã×ûsÉ@î ‡2l)©íÓ'¼·%“@5…¢ÜÁ£V•Ô`b‚B"1Itãw¸5;Isaê§ýóCO¹š]xGÇ0̇©y1©{}º†•Ôßút©“#ÓS‡˜lw¶ˆ~ÆwPà@9ê®uWã¾Þ /]IþìR¾•¥(¼ÞË=3Ám’ˆä¤½£òö°±:…ùMÉÝ=(â®7°$%aqOèWnÏ´"[Yí)°°À…Ÿ—ygÆ™Óà†êæ&z:Kú$p»$е$BU;Kú$Pµ¤ÀŽ‡ì æ]ø‘¡ ƒA ø@Ó-yÀ³²³ƒ6ŽùÕ.:$Ê×)yÀå’:¤eÇ”];ß?¸Ãøï¡K‰a„ó²ÿ€^|êôâÔ#ÊhôÔ#ê¥CIï†òÄœ¹'slàå.%®f&*̰sB¢©Xz9ÚíÌàs1÷}ï2ÙN’%ûþ nö®žúŒ*ýs<¦:šX=Š!#m?î€Îýmþìxx}öãð Ó˜—nGw—»æÏþÖ÷“µ@™?€Å$BM ŽÏÙ¯JsÛ5=Ì„¼~_pÓ}o¥uP¥)"ý4Ð\Õ€wÿð àpI [Y­º*ó[“G(4qóŠAV 'ÝL6^ÒÍœä,-¸ùY:ÎFà?øvo>í¥$KÊÖrm¹ I#0’%Û¤ßâx|<×i§ø·Ò£±~äCJýO¨ãèaw†…Ùž'mpÈg&éIÅìæ‘= §k7çÑÙ¥!3VÝ{óè·;fÖã×D€Ë¬Q¼x‹MbHÅ1Xj* ƒ÷ÔØšù„ò~i ͤ ?m1TƒºˆaÒg”™cåœ7ûL_¾ì/Øs÷½¬â!4ÉÊÕ}¯¦«AYTî½ì*i†4¿)–ÕªMV`ÚæÂz“ɦ +eÆ\cÎeój®_õM‡‰iñÂâM¿3cë BÊó|Z eE£ó 4$eÉœ¼+ÅõüýÞRƒ3v^ãaË2;ƒR"¡¤Âü~*üåÆKJg€ÈWQáÚÁõkB+h+ZFúǤóx«?:õLjO'òÚĵbf~ôÔÍÌÂY±™ú:FÆ†Š =C-Î_ò¼#ð×ä/9©V[Pv&xk%ØY¹<¤\ŽîAGßÐe&¡Ê–ìcBžžÓÚ±ÊP FxÝògªÂ‘…%&à^*3˜]âšáÀËŸáöpóÖÍe«¿ ‚ÆýVê}ì㽓Ö5{qÖ4=YE7Í}!%rÇ'¿L=úJÖA„ºt31'ïÖ™$Y'<:sL&­ ÷á|X]޾ž?qÉ•cFóM?“ ´6ùxŠ`3€Z+{ƒF…Ѳ{©k¶Vîo æ2­ºjȘª¤@}¼ç ÷Ä|΢¶Ÿ?S «ÆmÌÓ¼MÈæ FMˆÅ«ÔÇ4I·½ Õ‹6ÛBV™óÂo2_V‹D .WfVç¢Ì¹×oå!ô¶òÈ^P­ùEÑÙ¨ g°°Ä¢©(ªýX¹Àe®SËÙ?ÔGÑ¥ïõÌŠ­\– /Õ˜‚³6¯Ú 8T3+Õ]¤Yé^´u‘=‹ÃZt`rfG»‚óöÉâ.™mG4ì »ß1>CK\hFM¯ü.Tð–-»‘Šl€?–kƒôo΀´]ßåŒPÇ­º1ð”@Ü@ꭆϬˆáIaG=ÔBĬëÍÞW?±æãÞqàSp˃ï;0ÑÏGÝTàR2¾DÈ/ÌüÊJ£-Öð” ‡Ü>‡e«­YtòÇEg3Ü7v|Öƒ75Ìsþ¸Ìùîyú]òá{Áøªé˜ƒ‹ûŒÚÃ9™t #B£3€.üÞq j—ö8å}¹¶Xåx‰ÎguÛ#òVò½4õ“/†'mžWꧦÀãŠôЗgðª¬V|‡MW®ýÔ`€2’_éÁ›š)£0À›Šó€D2ˆ_V;žÊwåP³r½L¯íM3å  7zOÎ¥# _YC9Àû5hòÄš[Âö’Àä‰Ò§Š^@ö'„ÀMLÃKVÖ¼\ÆðJöϘðpñàëú^8õyòâ¥Ì,$+O,eõmÏÀ­ºS/VÙGxKVúÍŽ¡¥Þàà_<îÎ Ú˜Œ‚»/YÉ_¶Yk³Âš(±ºSVª—È!šyËÉp–M½º=_ÎV}.=½Áó{¼uz1{ƒ·€JurÁøJõIˆC’QÒçfÄé¼AÜtz‚Þ&¾ËiñÈ9Î ŒÉp#g0³¬vü#ž9üßM¹ò°¥äüS ™ðôœHê™Õë¬m:ðôõá»U¼¯gH¬#˜ö¸¬t›À1Ÿ—S4sÀëÉl@ÌÝ´K"n,(B&—œ<#žŒ99õônOЋ’» ví†ß}¬—gë¼£{t3(^rºkÉê0ü rLœà`ë9—¥—Ä^bµuàŠ8)’Æã_ NFÙ”ÕÊ»Ah¦QÂö7Ž1»ÌdÒ zaÄý0 ”ÄgiËjç9ã­˜k{^‚/ÍŸÝ™’eÒQa)¸#©Vf§~Ñÿkæºç ˶w×zÛ 4°YÕ6mÝO´_w½›¬ åë¦g……Gó­œÁŲڽ 1®àbÉàY-Õ$°±äìâqœ O]£àc9¿KΞ¯ZsÿìŒ Š‹ì¥©ÈßÔÿÎ: ›Ò€ürÎp_V–®Ï9ñúžx-@©*¥f¥^™Î¾„ ©>êœó·=šáq‰µh–ðš¥3Køæ s|.9øËÌ!ËÊ;£ù®‘?‰ËnðR2¥^ÎHÉàùÊÙ2ˆðE(xVã¿ ›^pâFŸb¦ß¸]©„wžW† >—Ì\‡kаa¯c ¢}Ýy´tóÎ¬§Èȼ¡™”ä›°?g¾•ðÿ²òqè`[æÀŽBhpKîšÎ,æà»_V†moh®qÍXà•'®ÁA:f·âá×èLÎeú7…LÎ[­Z£¢t—K4ƒY%gã`å$ž7Ãüά܆y®7‘GÞ˃f"(bš-QøË &ÕsÑóÊä~r½´¦êyä{G1LÎíÝòrã¯{~Cþ:= !öîÚ¨šèþæWePĬö`‰5uYµŸqmmÚü ˜ÕNc˜ wYùaz 5×ôî_ðeŸm°øÑd*³Ë”e8Ì‚Î;Û ì"©±÷º¹F ˆò1ü.\»yìÉ 5çpÂàÌN Cô~ïî_«~øÛ:w7Ô+Þ7‚/²ò»ˆ ¬ï«ƒoI¾³±£{@Ô0ô19C¶å™,ÊÙ½õ¸\Å"s¦å&ÆÀT/{á…|ûë*›ºó´¾5Þ̹6ygv‡ž od1(°ÄûÚ>¿k›·Ç%K%ê xA[¶/rû §£µ¿è÷ÙøÐ`E‚fµgSnÊÿÖùÎÊ!r(׳ò2k‹Tz(ÑkâÕ@>“# ~)!šûͧÐbâ¦ÁC¾/v„$ûî8žª‚„ëWýlu³F<+¨/uÐ_hÄñ‰eÐÈdÉ>¥·Ó&ú¼&ü%ÿx‡5ÆgÁÞß$ÿ¹¿I¶ýÍèû*áMVEÏeg¡‚iŠë9@©{C¡Ìj3ß Æ£Xy‡­cJ¨î•ÿY·)yÔ U½Ma •‘±¯706+ALÉTCÕðâfÔƒè©{gÑÉÂ_‰ùJÅ¡ •„€³gWy@ï’)† ­ÀII%h¦Ûw9¢J%¤ðaH’B&llçSc÷ZE)±\ÆV¼#èjŽÚ‡JWxðŽsOrƉZRʪ‰AƒéW¶ ,üª&gáÅsÜ&/«ÿmrd8Ë ³<á3 z¬îàSÁrF4$ƒ&+/ŒÒ³XÃųè±9êOÀW§ ¨qáÃÿe’Ö ]'"ó é‡ã†âÐÃÚCK칓¯' ÉF=ºßÐv™ù‘ÐäWÞbM›Ñøì Ù}ðˆä[‡,’……m5æðøÐfÛ'¼ÛøfVÛùný®O¶i“÷rÛƒT&—HsQ_¢|Ê: *<ßâÃ@plÊéiã5ü7mÂY•ôøŒI5,eÒL;TYºXf3c˜ÅNi¬èó³Áʼy †n§M·¯Ù˜wap¹ȉėí|>ʸ[Ù·¶H2jb;O%s–r±Ý,,¯WxÈ@ܬ½Ûj+pžîï0—ýõo"Ï*v‡&À-€~ìÇE4¯‰Ê ô~jΔ߄ªDÊ”‹+!ýÊÜ›ìÈC%ƒ 6xVÙàˆöl›™À×]7Ÿî¸fÎNGŸ²{1ÙœÎ[ª%7è.š¡ÂÅ$uq ¦ÍòüÊ„În²Ü V• ¦™¬Ì/¶KÔ'?©äð4­)w^üX]ˆ‚ž+$—]4µàåùË_!°ª#J ×#Ž(%çqäÌHȨ́f_âÀSCdkÔ—áihkÖþÛ™\FF¼y™Þj ”&ºnŸmâc'Ä¿LJi+5_ þD7U¦4f5œjê÷†X!;+ŒDÜ+÷}”AóåÔJ…Ы“f0ØäjH+`úʤ˜”¤ÎîE‚:"¡znAkÀ#D_ÖĬ X[‚¬Ø__øHÞ ½”yLCaàÆ–xbÉq·dŽb®Á¼¯Ðº«ù° _`sîŽÆñoÕ´ ú ~»ŠñÞ$*¼¥¨uHƒþL ¶žìî°ûäZåé`˪~ËA( Gd{©U?9¶m‘Œ1SÁz@r…ÊGm{è+oƒBe¬ªAé¥9!‚=|döS{eçó]7\x€àñA §ñdxZ …jr !cÖKÿ@Þ½ïy ‚3`·—hM‰ŒõÖ}w¢±r“âJ‡»ªkHï¤>?d©¼ýîô}a‡‚<(ŽÚ´§Š Põ¢ÀÍõ86h5× Ñãxÿ{c„ô;=<0–‹Þ¨]åv[Ìõ®Ýš+øž7 . q†ãZYªá{ÖÃd›Þmf K$þk ü„Ò{ý\äð«ñKCŸ+obcÖü³Â*;öú$©0W~êôîàiûh·#ž•ÛwçÖ¬QŒ@ˆ~™ÄÑJ8dÛ‡ŸGN¦/cËi!¥^y¾> `…èÏþÒsZ;¿o9‹rÕSá¿Lfä^YÇÆWëÙïj1¸)€å‚C¨JpyV@%“›%áÖ|ùÆ€m ”h K7X`+µl~v’³VÃ9‚¶a [¦žÂšÜ 3#ÝêÈt‰žaKu§¤Äe­x7@Ñø´Œn#a–åúÿ€CèØÄu;œ wOñkî5C†_ó^&—LÙá9$—­c®â5>Ìô­BòÞqSìôõ¯A=gàÕã“™A!“•P†˜9>oÉÑaRÅG×Ó!ÿä/èr-¦ønÑ åZØOw¦ù¸„úû&¯láîøì¥_[Ôf×üÙ¡À/“[6®•íãàlFгXu¯‘Ò¬h|µ¦›;ÓôÛt3pâL»bZ~û"ô\ ß“W¡GØ*Ú£iŒGŠA èÅn߃YíLn’t&¦òtØ•pGƒœkm„móÄÚO©Í.ä”2Æ”aÆ«‘9í„°2’G•V¦–V3dQ»ä&lUxHðQa±Í… †(¼mnÎñ~Î å˾H`§¿±=[GÓ2}1 ‰°ª÷¥Œƒzc¼ XámÐ+áZ+†0Wnܨ!ÛØ Od3øŒ¾+z<¤ªMÂ=`<3¸É>´Í üÇÞá™ÁVáY õi4 $Ã6tÛe-l_T>¶Ý›5W»ïj¢àÕÊŒ—}fµÍhâBÕ>¡ž¶==êê9‹vÚK½9ˆ`ˆÚT‚Mz²xÎñ›[j¦¿q¸tø"¾w+± œaþRÀùɶB9‡Ð2ƒ£&ƒ&wÈžk(©}ò8¹ð3vìAÝd§› ÏPhl\ñl‘Óå=µm?»K'gå¹c=ñù7Fs­ÁÛ†SQ;P,{>vÀÖEºIÅï‡a!+Ç ©¥vpùâ¥T5í-ªœ;¬¾žßTÔÀRw›n–­6û¼Jþ;ºj¯Ì¥±'Ãù;b6 íû¿_V>C+ ÅâÞŽ–|¼³¤²IÛîdTËàÉ݃ëðÐMS±èÛŠ©³|¹£ ´Í+ÄŒw‹BM“€£à’ÜÁû ®Œµ}ìIqÖ±ÜÀ©)Û6WXF ÔõÎÂ:A¬{ú(öõÏИ±Wº¸b{?³ÚÈç%XÈŸ}“ªWßš ˆk2‚v¹WÙãËù¸!±˜ŠPz såÃõ‹²g^gƒ¬æš³5©³íl(‘ŒÅâÔG×Z´*ñ&pu(†Oà„Éd„GYÒ]LîcDgV*FS[¼+ôje’1’ÜñVژ씞àïa5œ„H;vpá€ià‘K˜ÞùÈ=ÌGÎ!“'%¬[´›NVÓ]n A™¨7ø¶a 0K‚ÛúcF~#ÈãRÜ´íÇ_8½‚)ú1Í9w¤¨ÆOÞ Ðå¥_‚'%×;‰6jìŽ* —:Y¹íÿ(Žλ¨8¢8½ëB$ö Ô¬€"w„\ÑðÜìO§nÇ×O>™<À1ºÆñ=hˆa9œâ%Y ±~hâQSÛ~|aVÔàb¥ÜJÕ`øq+‚YbýôÙRrlzQâþÊåJ`i¦žˆèË%$cžÄÔG’f8žBñÆP»¯î$>–SJyf&ªÄ¯ÿ¢Í4’À²›LfÃM i1œùòxY Ô?j·oqÀÖž4‘&+ >ŸZ3ÓöalV#óÿ*Æ>a6˜œg;B“œI†¥Û¼t §â0=/èL2º9åqAî8ó`Å@ˆm+ºÿ245„§¹çœ7Æ8ðú1°sN†ÂÜá[žá­Ó+جt2æHÔJ)íN"ÎJ!cq`^Ñÿ‹aฉӘêß’øu—è߈¾éîú÷‡:n÷nN |°P}Áø@LFµgÈ£¸‹Îîh$òÓ÷"xc`Eœž£ì‰m³ø»@]&lðÉn´-ºCÝK¢ÆDôc ~›ØÌ– vÜ“£Ñ“rš<è!íüÿ~…íR SÖãø^вsl “Ík0åÑÿª;»=‰'ŠÃ»Ög»e\~܉@óîâ Øuê_Åj×/Çái¼ûE¤àeµ)lÁãÑŽ½ŽüTX7W€  =pœgô*Ìûp öbÒ8Y×… UkT'{Ò"øcîQ\ÓIdª"†XÊG®@$ ÈDäÔ¸ë˜åÁ¾¬©wQ²U æÒˆtü &Òž%d¾j‹Iˆ7W´1G€çy>u"4‹îèo%¢ûÓâœDºm¨ù 1’á!KB[ÏšQT´ã%IúMË›‰-"f¥‡Jç~†ü·Ñ“z{> ¯ƒ]p&ÖС ¼PúÃR@Ê^+Z?nq«Í 'Œ¨²Wu¼ÌÏ¡øÐÕ´Þg« L2\´×™ðÌXÕS޵àHµ‚Ì(ŸÀoâââýœªG÷O–!ú9¢_À“§á EvÒyØHBbgBú>þ}°¸h{¸¤5-cSžŠðµÍÅ…M¶™ã¬®›(*ƒ3fµãyûC=á\”`¦ÉJ³ÑèoÁ§ b`wÖЊ•¾Â·ÆLž…÷$î¶HgV»?Ìžé»úÖ^.4’ýþó.†5ÚjÍ_¼BOp¦ ­Âé¸Wý ]¸ô­]¬L+LÝ^äMØ™'D#i@“•2Æ+;n]ibBQV %e3bhy:#~‡?5¤81º;¯ § Ò@àˆY-O¬.\(àÝ2‡œGœïh,u.Ç–ü…˜‡ÂÀc~'þÿaèÉÖß´ÕD{ỦɖW³˳NQr#]*ðTÏ~mäе™+(ÄàÍ'j"‹ëU^³cBŸQæÍWæ9ÏkºѼ‹Ý;&® ži£o޾·Å|3ëuÈLЇùÓ_Xx•”DcP20°&T^ |rsz´OÓÜl‚VØÆ|ÆjòZ”©&•·A †BlF~PÉ`MYJ•s}æ¹Û(ó@n#ÎÓOʉûo…gGG…¨½¦íÃz9¬?R à’_ÀébàÖͺ”u©*ÄZò ~°Ã(´û,,8­þñV¼-^1á ’û-ÐÏž,X(î»'fF¾:›Øšì(`ç4,ªVþý™2ar#àÑÒÖÈ,2r(bð†ÑÓä;òÅt@Y„áì<ÒgæC·[zYá½ö:§“Ú"/FŒÞF‹hìCG}†·‡{Ó}!¢Ì/s˜2–Q9ù6ÖU«Þ Îtú®µ˜Í®Z:‡JxSþCU(0 p—$Ê ³6ç°o„®ÊÇ[‡µá…eÀÇ X!÷&ºÎ9Ÿ¹³…§ðöóðÉ"µì06.ŠË¨O™µ¹×°ÞŠL¾dú Ø\äÔ!Åä({ssîtùtÌ_Þ®¿óNy¸K7ÿ» â½ò¹·S” å’뼚#žˆOߥô(eé÷v ü­ôèaVÛîïØ0­Û_ìnë°³»ÉI"=²%–Ogrˆ9êfö56×£:6ŒŽr®ßêí.-&JÅÿM—½éÍY0\¥î¤Ýö Utµ7¯#]œ0!a§~ˆ¡\ Mé:ÉtNUÙw°¢7Tg¦oÕ¯¼‡nB‚á®íàè`“ƒ£¢À€Ü[XûÜT¨?¯ ‹1zNœ-òÍ;åÔÕÖŽˆ«Q³E[¨*HL¯5fnTæƒ&ùøÆEib´Í\äd—&~|P´£{a‚ÃýPܽ*Ë×}7úÿñŸóFwáqúÛètãU:)…‡ý7%/øŽÖ!/è–ÄI’,*¡<ÒVõ KLÓ(…•šÙaŸV­gâw^.QÂmÞf=uxŒšK£š“¯}9é,Q)éB{Ð *’#i›2ï’Ñ2FÖ'ºöOô ¯¥‚¯vÇ7Œ/«e&²ÜyÇLÆ;/Ë2èp•Ñ_¶Ž°~)ÈØäÞMxÝj¾½n’œDWí›àaÉE빸±W‰@÷*Š U»Ã§ë|H4fˆ Ó¼H1õʺ$ð­ë1þ‚iƒúvU7Ÿö™Ûa³PvY.{ ûj‚ucoPpoS¡ò˜+ aCçÉè~Å—fÁæI‚\MAæ%lnÉXï…jº¡Šð$=Á9(”Ü4€ºT-–ëÏàaí‘’@l·ä9Rx ÏJØÙ"+*LEmVeŒ2¼Hk¥ž‘šûY6ÒÉWL.õ"ÿ%SàÅ–döÝ–ˆÉ„NÕˆaé—C Ïï?1øu <¦;Ùå?÷òIr–õîÖÏÙ3±?!鋯ÍTHÁ¼å€þéÔVCå ˜7œã¹ç@OFu¦Ò(BHÛÆÁç¾7ÜûT KD5§Ž¸D2ˆ%Ñ gõ7“ˆ<©ï†ó&†^VKE4!3N[|CTø+ªg×H,Úø)mêà Dû2’%û6/ ßûä¸`2À¼ËÛ ã‹41xž€õÆ,NHÍ[Y‡Uh÷ç Èל.òݾšß#¡o¶6‡†¥¬ª[;²!ã$D–À‘«-gvÆÄªš/%-èÿåÛÌ0¸¬­³Gó'Lß1­7²ƒmI[ÓTÒ8èŸèAæž \3ú—c“¨˜•©yÜn ±”ì¨CøStv(XÜ®¿Ô°¸¬6[÷Û]›MÈí2†àßl1èRO'Àè»C$Í:®ýdŽdj¿^LljèNY¡ZO -I†dË”¦ÂlÊzŠ„õÿ=ÀÂ[ø¦›34aFªb†÷à¸T Ìgx–®þX»¸:›0T¯zQ"†KÀ Mà:…uæãµð"­¶ù»Ô'Ê/`P—\¯ø6ÂNô¹Ó.7›Û–)¹¥¿dJnè_Ü~ Ä.Šf2 ©V$c\ß ømá`û4Ã/,=n¨?Ê›ÆB’b¸»+s'êɵýjĆ’QöÍiZPý2÷ï¾5_"?–{ÿHô¦ì&‰g P_:¿ GÐÃ\Ü1wä)vMªNÀ­ °òpO4‰ºED«&›G×ðV6y?å+1Õk» _‚%ÉÜèÉ+¡rX§ëŒõ¤QuEÐʈRÇèüY#à|T\TŠ…?SB§cH¤Ô3xž”Œ®Ž*Q/6´0ƒ™aŠ”‹„ð W¡ý´×ç*&¨’|˜a•!Ž%È¡Vˆ1&’ªÇ ™wÜ_(ÄYCäzvç¯ôM´1çïJî'ÍÍ„ïƒ-ž/†ÊÖ=»þ¦¼-ãr0ºOeõ–'‡} Ñd¹œyKhT{ÔDšÆPÏž7ê¨xÑ"œÛ=JA¶YJVÛŽ)½­“ÓÚ+ѨѰþún2Ï>L~¿…þ–™…¿û§[;Bv J‹Õ‘Côp\‘Õ¬Œ¶žË8Dx¿É;í• éþˆªÏñBâç±ìHqkrÈahᆯñi)'+òñN[ÊѦㅞ®¢ìî§ ‰2 ¨“?ð&HÁ8„XÙw=³cs1¸ª)Æä‰ùÕf|ý–ÑÆùB« ãR°¤ ºÓáÔ0jïÎa§$ð.úMyí/ÎZÝ•¯¢¡ºC#m’)ÉûNϺuW°¸(!¦1h¿8[CûÊ u§B³ªÌjÛ~Ÿ¹´Ü} œ%h½´êö Õþ‡”,À¥ØÃ?Õ(ÑŠa!CTÌÓÏ‹N³´ðDÈ»bÈ”ªp¼qMý³[lâè`½5n¶Å ½£VÅ6Ï¢´Kå¨s[*%ÎÐbÆç‹[’¿=qKŠ)^`^‘ÂZ~R„¹I¤Ô6zÄHú5Ü… –¥–kGÕ"KK-èW´úP‘NŠ'‘¨·¿Ï£Y¿•ëYJ)?¦\á¸YÉzH×á–Dìht+*ÿÊ/”C”"#æÛHá™R ÏŒ³©LN|g¨Ê[ÌÚV|ou%Ü< ;ˆQ`Ñ­ž½tT¬Ro6)°çÊ=*ÑÊì/îk˜«~`;!”#o–ÿ:/zÅ•! Vjf{$3%Ž+_0hÖ døÉDRcÔ³Æ{ \¬4ú[”º2 <©0ÔŽü¨Î§@ÎʼÛå|ÏO}€[ýù¸ÎŠ5 7ÖfBØ]O‘ÅŠTØkJ½²í \S§0£ü!>*GÉ1v¾XªDÈÀò#-tG¼¤4RC‚¹€Mfú­•­ÙAØUj6Ó|°I>ðr½úX_û¨B$V0S“¸ý©ñ(•¡8hU}[FCaÿÉýY–"Ûôó0¼dãöU!¹ŸäËÅ·äTÜ“ÍpÑ2© « 6Cì*¬tĺaþ‚¿þH ž¬ŸcƒbÕ/½f/¼˜;r…K ÕKyRwùÚqG“X˜Cx%Rû 5/*/5"¥ý ôÍ3?aèÍ0¤™|R¤ô ô ²ŽN~¯gr"@¦LÓ–a:PÃÈa\á·ãïÛ"œÍ&`*ü u =š0=N}¨Mi{É}ÃìIψÁ§P Bÿ©: ãØwtÙéR …ñ%̶ä-ÐÙ½¯âåaø5ƒ Š~¯ØR¬Ø6pp“¡Ò•(» Œ‘0ç`Þ0R:En¾iÂÖþy”ðŒB³¾Ö ‘¶/à[Y-EGƒdt #bš?þWµá­Œ=Õö¸&ÝŸ!òÀl²ÚjÆ Ûó–Œk5[Œ˜Û!¨8Õ5 ‰ øS¤,yJ¿¦EÓÔ1-¼ˆš÷»5€Æ² Ò >[Àaî'ÍÓ °ÖjuI Œ*¶ño§]mFEUØm9\´Šä³e]DÙT@~wèàTÑX6UxU äR&œ•YåÞð.l&åÿ)(Mî´}{Š4±u§}ã!÷kÉcÛÝÕ¿vïÍ`RYí_¬·êéÚ'N–&›ck©Õs¿¶‡%¥›xV¯FÊ“¡$ ]Y-=ÅH f®Lä,Ð|vzâm¥©9U—4˜~ÍhǦj޹_ÈõJ-pùo—/ Y¯°ÞÚµÒ Z5Âýƒ7áSçqÛE¬¸¨gf~Óµg¤•™1™>¢—]Wl`‹“f¾D„«ÎI·Š}k¼GÇvž]#‚ñðR¾ hS¤õ=9‚Z AÑL?~ HêãVÂ5•Ġ»wø³ÏrÙždabMˆ a¤µuä/æ`éÉè‰Ã&°{÷áŽ>,`Ï ×é&°Э¬ãØ2vÎRe`'’â¯3ʳ[ª§Š–ïœÁÒkƒíÅÕn[E‡ CX±¹gjys7Ö¼‘6ø–ÍÉß÷îj›—Ú¢[­ÆgLį,Ôò/¯€´}Ö¸’„˜o×á‰7ÊåHõ‚ÐYÆp u¯sØQœÀÊpA‘×¶M¹þq#3‹ôÏb]k«ö}ZØÚ°Ðº¥‚—³žŽÜTOúÂöèYÚ6”J×Så ¼4Qg {ïdê@–»‚Še[9xT®-,Ò“íùòwùméùq u>"—PÿxÈa ¼Uº¯—˜eo̮݀"²77$k]Ë»&`V‘Ž}cרÛÏ‹ö]§ ÛWGæý:ž÷{bä½X–BñBQÉí êwæ]);”@é;³TÏE?%zŽØê|%H¼ÿôý*àjV÷¸ú®30cr HkP¶€¢YÛ‚‘Y;Ϩ†ÜÁ/óƒ¸nùvDbŸ"+3ˆqÐçí®tÙiRÀ!=\nžc=ãX™+ºõþŸ…H‚"»‹thäñºNbi¡IÓX:mÌ_¯`Ù[ÿaVáBØ×¨U°µÀ¨1jjéxàyÄåãY&ôëV=6Ä$ÖªHHol †ãþ{‹lG§¸U¤_¸»Ž аô^Öº…MQ Å-1ì !Ž!”âýÆ:«ï`C&õ7åiŠõä:c××ë|<Óh:×.C ¸ÿÆÙvxòºQ§L™)Ã!ÁeÔTš¯×ž{®jõªã×þÝ®ø\ú ÝÑÇ!íd­vïûm(·J“tùžg±q>7TÿÀÉ/ÆZÔCúè0U»'ÛÜÈ¢é•f†&F„§³õLW5õš½ÚŽv÷ùëö©m¯ ÌíͰÒð_Úÿ¨gòâ”Må # °J—§Îí:œÑÖ«é`hmLÆ÷Ê’ñ[D€Eœ•"»ÔÍ͸^!ý÷ºí1š.)`aU[&߸ÊÈð’f§+ŽæàC”CE†P˦ïŒAÄ7 ÝÆK'-àYYÇuŒÁÚu©z›P%h?b¥·'ã–ã.Æ#ʨRH{@6 ·Î ã|°\öþEKd%2öf‚G`£:t*¾¨,6ÀÁV|X³S¼êÎ㾃‡Ã"›•Åv%TµãGÏÊuǤŠò­$åKûwHˆoaQ´÷ˆDPmå\ù’†AD¾ ØõäöÜš7Òy1&BPFˆ*RÁJæ{ÿôTÒOïð^eÏ Á–;¬œPø.hŽ÷,žGƒÏ®‡öÇ‘÷Ý¢ ðãYGô‘oäd6lœñ:Áv£D”g­®2èJ.Ÿ9×jÈö¢Ù›l÷”Tk¬l[ôF(Îþ`„×f±¡ïz-ºyWZ(`BY-r•EŠŠç~J/¸|,ÍV4!&a'Õc¸³:ÀSUb“ÏhxÛÆÀ&²¹i_ø(/—Pt×ÐÖ,¾¢,‰i#q ×¶÷`vËNˆQ•,0oÎ'»yç%®¨Ä¾žÏ2V9+J/¦m÷þt L[ò¶Ó˜ ºSÖÁ¡sW.›> €K¥|#¬ýŽii‰æ¬PÏ¡âÁ9ćB=âIùL'<[À8>j(zœÌAUðÍç?4¨t®žn'Ô¸½v¬Ás¼úÎ:„ñ®ç[Ãy)|áîírÿ•/ÒE—#ÍY¢[£s׿ñE¹STCùC·,¬bÔ´^apuÚ€±ì©ø²N´o  bniÐèu‚=,Q¶çŠŽÉä™^Ù®€Y¦$ËRCO á~0ô””üûnW•ÇhétXD½ö›A¨ ~µÕ•GK¼e¬£¤»lcI‰gB=„±HìÊ•Åaʦ6¼¹—»õÃøQ”aePÝs T*%åâ +%e7bE¨=å Ü)¥š¯“Æ~Iâ$+|wWPË–ä,š…d*½Ûq9ú#w`¨^‘T•,æz…~Á㟙TTo†ÓEö‹ ÆQ|–§ý{\Žúe>:Ò¢ GæB/½ýwoˆ \Y­›7­ÕâïWJì•â<÷eõ^Ø _±rQ˜ÄIøÃÙwˆéŒë8=pΔÉSÑ °‘ž ^©Ûƒ^RÝ$±•0Î^ïè¢\+ÛßU‚šj3#²$ËÍ;«³Žðbcvâ}@¼È øq%âÜÀ¯©ä‰ýràr]' `Œ)Ó˜/Šæ^oÑxI{_r4¡œ,µŠ L¬DÈk\ÿ¤Óó 4¸p!á.å6Aä$çÒlÀ‚ß PÄbü4½vgï¹¶èlçm;§AC{— ÜÚ `2M ± áYóðÕ›¤‹¡^àʆ•´ 3| ?£ÞýàÕwF=ƒ°Ç¢E”<íؿù®±lߦÄyš——©1Û«xZ½…-‰Ó<ÖwF*ê:,€D9`âFUe$Í?PÕtç”4­ú†Ï–¡ùçêu*’ ÔkÓûMô^PL«ÿÌ× a™!÷²Ë¯PÌQ(fìÇ9 Å´/s8‘²(>Y±EéRÐMÖcŠã~X¿ôt-•·ËXØyg6¨#§Vƒpë}=Ç$2xz¦9“¸…#î‡áMi“•¡€P¥d¥±ZË:†gx úz¡NÛós¹ž¯fL¨±å\Y~Û…Ú,{¹flP9³?VëÄJ«â¥ktÚ‡ôÒj–’ nTÔσ—šoÄ©вÀÑs¯ ¶”ì E=âaŸ6î¬5×qÙå÷‚T4¢_jàdKíðµà‘•¹x–v/L9È{ó‰öü…«Z\D4Åitÿ®¢2þÒAs™aÔsï³Fj *<Çã®%MK®žG»Mæ\=¶W^òö„%šÅ¼ýé€;4ÞË*½©Žc0©£zà|´%£"„\¸0l^ÙìM“wÂ][q…÷«.`-gó÷BYµŠ&Ç¥ôÔ- _Y-XDk7®4Ïe@MU‚–îÁ8wÜ Ó™98Îõ½d¡câ ¾ sçÞárçA”†HÌWàI7×t"]Ng)¢@¯ÕômI78,+yBU¾I­5È÷ !›·´hHÌ PÏDHÒsÙºl•KQf–gÕAðæ¤ çvˆx©$œÈn¶¾WUÞ{A"Ú:Ð…¢Ð×ÁÄD™7`Akxåê‰yÔcA>žÒ¨ñ^ó®2^°«ìågg¥IYÆ8c•½uÖë o‹*fs×umºžj_šñÿ€þ êÖ¬¶ÿÜ’-âEàa“Š´ йVŠXBèD:˜géÑ»ðBGŠ$^Æœ•&ý‚(¬'\PˆrÒѻԙ 7.V–˜Çb’@˜vbx xmõ@~æ¸TÊAÄOᥞ5ÂÍ+«¶Ï1³…Æ—¸‡ ÀŽyix­ÌÇDÁ]7O§ º‹ :…ug+­€DÓ`™è¯U'R}þ*>ßæï®Bö‡§D‰Q. KKrh;C'Ê÷LsÉ õ†Šðk·9uBØcGPÚ¶zãF ¼à«­‰7)-:&µÁ¤¥º"ÁØœó]ê«ìAAì_á2 Þ|…B¥Yê+]!¶Ú=f¥büœ4ž®r'ß~ö‡S%”ûï?¯‘¡i†=íšxò»ª!…eñ>ˆ.Ÿ=¸Ÿ°ßu ÔÄæ®wA¯ŸP­(DHô*àRA{æÿR"“E‹‹…ÛO€Çs ÷ßqybˆ%¸3¯òÜ”ÿ*»´y‘ýÞ¡×°XïèzžTñ!îõ¿Pf $¥¡ z•r¸\ ãk‘«oý–ýEÇ~ß g( g)ÌDp¿¬ö6^Å“ÐÓz¸pü¹- >Çå¡Àqzm ör[‰ˆ¥µVÿP]שôÎ"áÈùÎN2Û»OÌþìœZ3x?äGR+.a#–tsæew9fr•æsj@-¯³^««ÀP,ÑPô\•|Éí1BÕ—²Yk´ï»wdîùúÓ»ÄöõDKÊÑwþ*FôK¤i _ á¾áW¬– ­27Û`°é ãê_Éo™ùsœ¸Ô_, ‹)À¼”ÂÒë¥@h— AxSŠKETµn´(ù¢'\}îÎa0~å¦KLŒÎµJ‘s‡²§xô)CÐê·µ4n8cHFøÙýP| /}½›6h ÎÓ$M\e ¶)åÊÞFѸ?|1¥¤ÇSLÐÏÒfèYÛÿô³çò, ƒ)%úN v/2M.ÑÖ«Sd•ãÌ nÆ[].¹m\~y\áߊ<=ù')Iq͵ 9KKÑ|ŒÈ»y’oK¤'s‚ÑE@…LÎ_dnl"¤diÙ"¥VÓ¤óï(ê)׋—ça‘L£¥±å=©P®‡æ›5èiJqJ4Ô‰£êÕr<¡ O2U1eœD<›VP^ò÷ ø+êÈ3ï xK HZJÙÁErÁÃ@9“ ]JñÚ Z@$ ÃrNýZ L¸2ʻȸ+ Ä—‚ˆbpÍ”¿…bë4vRò "¹2¸|æQy_!ø[}–§-Ç©óÏå8Ãr„ d0úÇÏr¤Ì›q:í…–¼*QTs—–᫦ÚD8é’á×Ë@TZþg)€fµÕm¹”# Vs6Èky|¢`RY-s€ä €Ðáº/^“#Ä *ùðµMðä=þ2„X©ˆxVc^(5âËV.÷“ŒZþˆ9N¯”éÜ@i»R!ç?±@Ž™3ã4Wg6]'+=vXo`…)Õ¤ ŠÑ†ÔÛ 9Ÿxxæú3oÁ¶Rj`³æ+{A…ãŒô5QåUŠU^«¶ÊãíL©â”¦ÓC¿îŽ«\sÑôçàîØáƒº½qã?V_¾4@u÷\äÌL&+õ˜…xuÁó·,¤pš<˼ß0_ðå^25D‹H“¬hÌgÒ>£ãGERû°}År!êSs«TP€¼Õô8¥ÂTawÖú€‚j=ª]sô⎮9ûÉ^•ÕëïÁÁjèŶ¡zÊeêÁDäc0> aÙµV Èßx[…O´"„ˆ5[Õ–$,ë Ê ðÒPÍÐ’” ¼ÃÛæ°ºá£Þâ–≻Èa¨‡£kÿ‚˜Tì®ÕS*J…í·C‚qš7þjiŽšªfE_t`4+0FäÀ Sjl‘‘¥}ß{oš„Á†–rÒH8­+ý!XŒÃ7C ˜Ÿ54Ž-qÉðSGÄðÌ”jð0Yþ€ì2·Îñ'6emoˆuƒûæue@ÝhÿmzS©wŠcQ˜Õºñ묜¸“`• ?jO\®\…Z?’öÑá!È¢ öÁ#ßÓ³6ÁϲÚì0Áz`‚¸B,Ï%´¸<¹´?ZB ×íìißÌ‹¡®_ :e‰©óI@E«L”…^>q":™Ù;:Ú[r7¯¥ ½©EÁ؈iˆÅÉ%V!6Ϥžß¯Ë¹µú[ ËeÞåvKs5ÝRzêŠ@ío¨s„3^â¾¢ 2 A—â„ uýv.Î¥EÅÖ öË}Ä<*4Åâ£@*³ZS÷~Ãt VE†·‰E†";ÌÆÍ(³º5ñ—S èµ¸ =¸;¸Ú]ò☸àóz‰d1¥{µ#ä—›°l2j£=ñ ­g9°â¶ç#2ni |/÷ÑÓPF åéZº 0È”þ–nG1=îXó¸‡Òí¥Á-ОƼ JÇMdi‡Áøÿ'yï…Ö³{™:,Ð.ו'·øg¥u ý§T +­ ÏñÕu{Ì#¹ªùÄ?l4)ñ稫ɗV—Óù½´n}+éGçܪA/¦úi4Xùj°l:9´ÍY­zòÏ⧉ӡ-¢¨`é™uë;-1 Fo„ùz!ÈŠI ÇÄ2S/”¬(Ê s/ã¦Á^7¯öO²ÕÍ&¿yù…ÞgU@EïÌjùq–8Ã#³uv]7Ô©ÎÒt’÷6Ð\ŽtHÉÞ^Ï^‡ í^ë¯tüÞ‚o¬2.ÑÁ¤» ç•\ƲƒÕå¥nô²_”Uæ^I›½¿ÎÞgHïúq ±¯º³^Ï rFÃò­7öÎÙ!_¢Žk6püHW}H½¸búx+ÒÄXîÇŽñw²Èªûæa%ÏàÒÖ’è?7bKä,ØjJ>aÄKéþx·“ñ¥ì2!"V£ôãMAöìjá^Ó<Éw#gžä:cÏYÈ_ˆÛέr6#®1mxŸg¾Ã5¸ˆJÇÖq˜xyï#?7vñ…oðÚ'9?Pl£òÔÚs_1©HœV@#S†‰F`RêG¨9PÑ ;Ǥ×÷0 õÃŒ)ÿ=c‘òcv¤‘Ä.)íÈmþè6wMãxãH8; ]G îëññ¬é[G„û 2P"Ãò3hÖü&eBL,ɇ‘Ë¥&ieîö×þ?΀A* O¬=µž¬¸át_Ú¡P(à\orø2 ‡dw­!‰*¥’3XYµmÖé*Þirƒy•CÞ{òhð@ áè¢(˘³PÒnÏ7ºdo€ÏØùŠXE¿Q‚s6êòöÏͱ÷„Å3ßÍ¿@5mŸ¼`j ¡§/³v )[ªÖïºÏòê~e`U“>&à!¸–ÃÎÎT¸áÕ“àËùCI“MÕeÍ@á¤?Êž0ßüö•ãg¥œœ±k©<5&Ê€x¡ÆDËN9d5\*ð;;w÷N"kÄi [â'b:šçÑQG&)O­hHTÞ˪6ä€ç]ÄË^PÀE³ÚWÖŒÎ_åßÉ ¶#<Å ž•ì?O‰2øõ:™H”&ÏNW€Íٓؕ±Ó·‚¾8·@ü™·V8®çìzű<Δ„–;t«€¶•Bö/¥°Ñ‰c„M{ ·ÛŒßÒÉò™Òë8”áè0$Âßç ›Õ³køŒÁ|uÌ”çåOüÀ³oöÂÜbÒÀ絸1a÷òÎðÉ$Ìp¨F_ƒ7k<ÀoõtüùõßI¿7þùÃàÐØ½G+áhŸÔ3¤;wù§Ðäáÿ[Wà©!¥pkþ–îË’aN V3hñ DÃô",NlkFž`z –h¸ÀKblŠãà&¤èüÉИ™¿žþd Ûâ½îòxeþŸ1c~ÆZˆ#pAìí¬‡rGüw¶Óµ<‡x±8`Ç)Feƒ+2ÏræÚ7Oã“0ã 4ýÿ£ú(¯Íɵ­Íaª2ë³æÔ*Ìês=³IC;a|Ö=ŠH’Ÿ^c°L˜nÓÏä´$c9—m;[гÿªŒz£ *Jh³äͶ ÀS)›Í<<¨È$Ý0 ƒ–×V+åæK£ýÌød§‡cᓵÎöd »7 ´ d³ÿ©– \Í59{ vçÄ©»Õ e„ø qyÄI“sž($n û}Ž€¹ž|í#*1Ž0PÓM¢žs÷êNTÖy¯íß‹Áßïk|û[•â»ó[ [ª›ùG£ÒTšK£R‚s;]¶ðKœŸàÈþ±…¡ú¼çéV%}?kðGöŽ*dó´:M :ÿ&öÿ·:s!Œ†QUóÒÊÜoJ”ª°CUÇ™šÒ΄¬àÄYmqkw8ÏV}ÖGìWåÉÑöŽ:Îd,ÄŠ†ñR@`n}5Ü=Hé½;L›¶ 8õK׿èó]³bö…õwÖÖ/ùÖX‘~Q¿·ÆÉn<¤ÞiÈ=cê÷zW°á<3†Þê6ÿÚdײ裸¼Ý®ü¹pª:ƒµ}@Ý0ÌùÆ•°Ê‰¸.›Ç6dƒw`…Å[?ÁS䟛ÉÉøÂ¶PY¹þ|A§ „jØR ÂT¿(IÇÅŒE×wýdø4¶q÷:4Ú!’¼lºDUÕfTÉ—–Z¿òW8¸*½Ž¶Å?œð†@Ž6]ê¾ôÌ‘Y—üP…}q?[ÅN=Ü8‰“Ï­·K„/׫ò̱ZÞ9Æ””_{­~õ±×ê÷pXapv½òªËaÐ÷JýôÕ›+h4úø‡6°ÃdÛÙ%ÝRl%¡øÁ ÒåX×4~¾VmÖ­ª•´—uÃÚñd`ZjϬÛ2Ô÷¶žî)¥Ò7pAâÙfnßr=d9èQ× “ò³Au|RÏô@-=Ò&n³§~}>*`yªíè¡&TõÜéF-ë7ÂLQKóŽŽü;}ηì™>c<ÓgÌÐÑ/îIpÚ>öjS"¼­AA¥¶O(—ë.%ìPƒ¢Þju%b³Ô? £¬l)³y| ó݉¼êS/MMÀj’Sh/‰wOÛðd Zðƒþ±]°OÚ­L9¯ Sêðå$þ,h{ø¼jEWcÌáŒàY¯¦JJ÷,ß@ýŸIp0µèE µ?tÿðàþæ)Õû›§(?Á¯S_ ‘åwBéiÓ’ܘ̣Ï4“{Ÿ‡qàäÔe'N©›3çÞ”`G[èë5åÃåTS\±)F1ù+É« ª0Ï‹ÜÕ$ßeÂï•ÄB²5æ¨{{Hèµ&yR|+¨wj ¨ž ¢uèÝÜkäò”K7ׇW`M1òÒeÇ[-½¦à¤­J…c_‰`ïþç;–ú¼cÁÄ(q® !¼Æw,lÃDG1ËšÊ/’ƒ,[eRÞš×Qš™4ågzåg⪩%ô T: Î|’“÷ž˜ÈxŽPS˜Â[%›A/倶ï­–žÑªh[œMÞÑÒà©¥Uÿ14íÛw¿ÂƒøïÌaCC¹åšÚˆO›ï°ù×2Þr4ì®×oÄälaYüeî<õ°9v,ݧLÿ™2Çã”iìUØwÞ#F¹Gáò? ±@ò="ùðìY—ÿ¯l=ÉõèÿÀsFìÿ¹ì´­HÅqíÈý5f3|ʉÇÌ8qæÏĘóÿLV½ðWßBÕ)Þ¿ž‡žÎ8ub勲™²Öò±º‘º~=ê{ ê_ÿî-HŠ«%ƒ–5îŸàß©‡r'ñÆü¡‡‰‚é{€ô·»#Râ× êWÍÏÉ"î ½¿ö•œJÁÎjËÓ7ö~ZûÃúËɰàÝQË;2i>#“¿wd FrÚcN†üë“çt8äÙ5çò×0l³tlÂì{@·~ 쀜oWÝ•€T3Ä_ÞÞ]ŽäøIOü¼<ëÊ)Ðo è,`ºRêþÚÀ³ìñ[¦æ­àëªan—ñî ±ìåk&ˆ{]Íåµ°Íþìàöå`Çyì‰nÖ\ndƒ‘‡×\~°5x-0ëœÿo•ªïḦÖóáÔ™¼À'ÿôØIÍ0]³qÌ|ÿy>pÛ§»/ˆ©ñ¿«µŽgNÖésÒ|‡§â çHcBjég¡¼Ë5k°ææ¡žšaÁæí€Ð/Ú~ÚA °NbqÎ[ýJÿJQ7Œ|7,qMšÄö‘ùÖü0kæÉ®S3$Ý™xP4Ë}. ÿµ¿ñQ:[7(÷mÇuósRÁòXfOÍ#Ìâ‘Þs è·¿ì“CpÎÏ#ü¡ýÜÆW<=Û<;ÏÏìèÀüÞÎÌ“r ›×™ˆ+9v<p†ÈK<Ô<럓fuœÌ(Csm°0Nó¼ì–5Ç~ lUù©So3_ø. ðZ£,xdå³ .îÂò .ú²˜¯oª'<þç:Ö €8ÏêçÀu”¢«Vm8 ¢ý~C,FÙ •×ô°<‡£Ž.‰ç¸&%˜@ M¤<¯CÁLΓçUPÙ›ôPPÈ¿(·Á¡-[ =tß é°ìéºýà5.Í:”ãÛhüY‰r¾«À¸Z;CÚßgÀSÁÊSÅ2H¦$’þ:À µšS‰B¼ê|q£ÑŽñÇ÷ý»±åƒ…-;ŸóÍ}“SiÐnPÎ2O•;Y¤ Äž¼!“*ð 9X+½…‡Z£”Ù\¢ø`WËþ¿Á-9ñC„.#)V$ pwÛTÜ L~×ê•0õ/<µšSpýÿhx$ìQ¶• =à®@U'ôˆuªÐézæ±Ô3¦˜Ã›QçÌß½“œ¹+Á¼•vTŒÄiÎKöÎŒ.¶“’ MPZ;2‡>îÙ˜÷“qhüûX„Ñß÷golly-2.5-src/Patterns/JvN/sphinx-spark.mc.gz0000644000175100001440000030470512156145314016110 00000000000000‹C6õHsphinx-spark.mctýÉ®-Ë•-ˆõ÷Wl ;™P `uõ2e6ÔÔ âÝx¼z Þ@ùõ²1fe¶öyä=¾×òånnnŬç˜ÿÏÿµü¿¾ÿÇÿúÇ_þòŸßùŸûŸþ§¯ÿá9ÿ}ÿ/üûþÇïÿõÏÿ.)ÍïÿÇïùËïú·ïÿýŸ¿ÿçüËûËoÿùÏ~éÿýÏ¿ÿíûü÷·ÿóïýÿýó¿ýË÷Ÿþþý_ûëoÿñ§¿ÿþÇ_¿ËÈÿÔÆü§–Æ?Õ:¾ÿô¯ÿí?¾ÿû÷Ÿÿô7iá_ÿüËýÛßÿãÿò÷ßþË÷ßÿüÛ÷¿üù÷¿ü—ïûÓùû×ß¾ÿô×ÿ‚‡üþñ·¿ÿéÿýÇ?þþý÷?Î#ÿôÿ K;rÇï=¿üå÷ý퟿¿ÿoü ýþ·úþ?þøãßÎoß§Ghý/¿ýëßÿ‰­þíß;OüÇ¿Køío¿ÿÛ?þ"ÿÿOßÿí·ÿüŸNSÿÛÿíüzÞ­¦ô¿þÏßü+^àÏßÿöÛ¿ýñÿyú&÷ÿþ׿ýã_ÿõ÷ùý·¿Jûøþãß1 §ñûã¿ÿù/ÿùþþÏ?þñý·?ÿñöù_þã·?ýí·èÃÝöß~ÿ?Î}¿ýýï¿ÿõ¿~ÿþ¯¸ñ?|`Î…ßç*öí¯ß}“¹ùß¿ÿ¯ÿßÿ­ì¯ÿáÿ‚)83p&àŒÿWþNçÿû;—ó1—ïÌãþ*<Ÿ¿ËWå§ô]õÚ¤×f½6ù¶‚û÷øžz9:g÷ùùÚÜúÎé«ñcÃïýnZ>ÈmüܼC§í§võîɹAzd¯çw^ßç°ã²,—é3Ò¹ªdþw.?Ëý;³Ì¿K}š¾.ü.=Þí:?Ï—Š»ÑÀùoé –ö]¶_–®«j>ÿÝã®ãW+Æ#xƬã?Ž…4пk—®%ü¨ÞÚ¾ÏÖªÖZ¾ëÖ!®gÀÓ×î×ï–ý-“Ïd’‡JÃí\ÔlÔÙŒ6ðŸu†·ä$ýl wiwNGZÿnó»a ÐZå,Úç³Z®.ØDïB¯gkÿîí4Ö3ÿ;g»¾[?ÿ ]Ò”|Ú¾²ñ¨¾¿GB+uêìë{ ¯çôHúîÉŸí<_ïõ{hWõ]“¼¹Ž_hÌóıü2T\þmãvÖdúžÙ‡ûmlDzö»&m¶ï)o¸e„¾²ÍHŽoEç!º)6ç÷<Þß Ó2NsçÜø^ùšŠtM…Qkó\¶Æpé÷£“núu&¹úÌ2kÇ=õ{ÿÎ3×÷ÆögœÏ·³Yô3~å+vgo€šÎ3çFge÷ïmó_Ê·Ÿß{]#ÊEp(MJ²:/šEB‘äß„óç¼V2nË k0'4‹¿ƒçõ†tǦiCa?mô?m¿í|Ý÷XòY×/™¼wzÑA<ýô‡ow>çvsŸ:ë"Ê’{ŒT)×ûI÷HW¶Sf>iÛ¿ÓöFç‡væ"ýÙ—ùÁ*ºsÁ+UÇ Wšš}úÈÇžVi=í:ƒ!ÕÌ8•“ñ¼²ùÛÖùÌe‘\%]üº]6?êÎM6[¹âßyâ¡‚vUÖ¥bâç|ˆ“ü²kçqé·äOåßÛ4öhYÿ?㥱&GÌT®¸ú´×p¦YmÊŽK±¥ù€¾¼’]1Êè°:ÛùåÃÜÉÇÅͽØ_¹aûËc/œ{0ƒ'xsÃÍX1àƒ§ý>ì/û8´ŸÊgì ‡”â ¸÷á,Ó!m-Þï;²ýåc³´Ù„˨ ý;ÉͪïÇ°×øi¥o6̉œ8y~(w&±æKq±d“”iå%¿Ì¡Îøvúb<õ…’¢í/v¨s^èÂéÝÚ×{ï{Hw œþ+öéÁæè*¶ò¹|ƒaóœÅŒã )(WM·¿7ßò§ìik±jŸ6¾Iyò>=¡ãâ,ŸÍ .ù ÓlKsC¨;[êï’bQÄîÚœZŒNìEdPÊC\q塯6ÀJtZŠÒøV%ïÐìrÜwÆÿÐíºŸó%$(9Î!²b…¤€ëÚ%ìqŽD¼*‡Â¦˜ÿýHa"âI;Ú(Fðc‘'­àïy4¨3$_é¬tÒ;[í7¿æ¼Ú,øå|æùƘôe¤ ëò»Ø· <¸ur•‚“œàe+C&øƒºí|í|,«ž®5Pñ/µ¢o2üyjm:ã[ÆJÖù5YuÜ+PÄž[ˆÔŸŠNi©§§‡z—–îa:T±´lC»‡v4›¡ìSäÚÖ¾ä»Ò'«Y¹PºR§„0X¼xDÁ(žã¶™Áš8$¹tHV:#ç fÒUI¸î삊EV”Ë‚RŸ?‡SÙ«*èv÷_+m<©%”–rFç°3Þ¯xœK»2…{†Ü:t3¥{bc˜B¢âÊÀP‡Ò’}' Ë÷¤ÓáKc)‡”C „o‰rÞ¾þRG(3‡á*ìRH™Íå“ñT:mÌÁgð‚ì$É+ ‡êPr2Ñ"·øIר-Mˆ•†…vˆkÁ¦Y˜˜2qæ\½ÎÓ£ÒñBxÚéæ|nKId*äoJâ—ò:goÉî²9©Ê²ÐD–ÄEn+G°/—k<ë<9_"#6ÜAdEa•Ëø4·¡!Ÿ€HïùˆÃ¯Ãùß›k ‚œß™)ãMgúhÀºïíWáß¦Ûø–WÑêÚ`5¡ý£.&42ƒ"ð ?èö¨Pëá*5áï: ½¬µ …‹ #¨ˆl lÍÕ^Ä8°m :Oc¹ßïNEú,{,"Ðèšqît•¶¨ûe£]ô¦…m’«®YmkÉ!Ç‚ÓQJ.rÊz«‡Æ×CQªT2ÖY Ö^£¨{®âÐ žÁà îÄu§‡‡ÄWZBp5÷–ŠèntÈ9ž¾}f9b ¨è;§6m'ñ¸/þtÇõ©#ÖU¼GÅr‡t_az=v’CµD8­5ÉßfsH*;U2Bž]îÚßµ^VeÎõôJé^W‘5ȦAÜôJt§á>Üs:Ù–ë6¡'ªP #†.ž/¢i/˜S…>D)>‹Hî@Ø®\…‡žY;TzXq†?Ê^䨻xñóÛ#+öFÒû[ŒLæœÝzÈ{\¨‡ÒVX`Þu¨ p^Aºøåö8¬í?ú[í5ðÒ§Ñ3õ÷žðekµá1›-Ô)Ö§ón‡¼×Cê!txüŽ3çó,àŒ +ÓZ ‰xë<ˆð['ÌGCŒmþ‹ÛM‹wý>$~£}tÃ0Eo‰‘9¼ìâ¡õïzÈw]ň”“¢óHÿ·¸ê!ŸCZÛÄ!‘ÖI…w³DÖñd½;¯¿–ôrAx¨GÞª Ÿ~ìÛ\•¹T+mg «•¤þpk úÀigvJϬ»’Bî.F'ò‘ fÁ§müC[ç‰{Þ[Õ”é éž±pIL05ÜK œu›ð%ä àyܱç FžC‘ : ²`]xèiâPÆFc"\ÙÞ!„¿Dó¯0ª‰ÿlÝ–p缈@r‘:¸tz©¶Ú8'ÛùÜ2>ûú’m_¬'…Ä•?›·’àÏ î%nÑ‹À÷ ßzŸ“íü;=->ºv›°¬VŠÌÚãä6FHC`iìëé­p[Ùj5r†y¦–,ýÇVVH¨a7t£…ÙNDR:cQaU.$ªhÿÎ(9«ÙöN÷fjµÛš÷a.Ú-siÜæ[2Ùç®vëŒrálÂÌÀnA¾ÚÙõoíRž/Œ.Ñv¨`k$JkÒçr©” Ø‚,ªX…%ýÄQpo°Ã6Ž‚{£ÉO8¿ö¬D|’ÏEꘄΑ€’¿¢P<6₼iz"&ƒ”ž_‡3Õ[ÎŒÏAK+vOG‹g^Fú2sºüxzÔFÑbÖNz9ÿáÝ:®9o3 Ê¶«}e“ÂLú5¨×òIÞÔW¹¿Ù™x„=fà1çÛ!H4ÿ< Ÿìµã9ðBœḭ̂ïºUMUèÓþĽíOg°ÊÕ¸ e~E¤åEv-ΞWÁ‚[‰™XÌ°óØ±•i5¯ÒkÏCLÌPî”~˜RKè:„û`HÍÉØpµÚ-`'¸ý ”~³1X,4¥ÌÅɹšŠ ÖúÃÚÙ*mK÷øÉÏ4êö 2þ…¶Ëµ—…X`3ƒ¨J÷0…›$ÛhHÞfݼ„Ìl*Bƒ5‡+™=Ø0©Ÿ?ða:Ðhð2 O¶]&î'±mT8ú¡øý¬Ùžê³ ûV[eOÝþÞT¯¥ëŠnÒžp)VX§ Ùß3.=áþŽïž“Q s†– P=‹!¦cž®1î ÔÛ,1P5Ô\¦x{jV3Ö«ê_á [ªû÷Œ~œþfÒ̬$fo›4Êé ±Õp:)HÑA¯{è…Ö“óBý´ÓÑzi—’œø$tˆ3†88Çù½ównî‚AZ2 ýPù~øE?z@/û6kݬ§ÃhCÑÃZׂ$XíÖs ´jF[ãbðÊü±Ì\¯3W1Zç_Å牶1’p*b0 .tUЩ¬8ÏÀôà>ƒ}V=<áð‹Þ2mgÆÜÛ|SÒŸäw¯©†ÆÄ[O°ÐàF•[“>£y˜Û:ÍeüûÆ_kþÏsþÅ64Þœwî·GwáåÎñ3æÿ+ôpõŽMzÖƒñwq 5{¿{ëOÓèÓ6:”öÕ8<¶Ùþ~¹;“Óìkh}°¯‰â§uõÜŸ,xZ&1Å÷ÓÍÖÎ QaàžÂêµµh#›)ÄŸö[Ç•›{¶Þ¤ŒæX¨UàÀß}>3ÕµÁ~øœøÜ8ÿó ^ÍnSa¶`£_#1'GBÆ PS7^±CrÆ«v7[ŠùTI°v¦Nµ:sø`0…ª«º/¯“ž{Hl?¬¦/|¾-Õ`£³Ù”¨D®Æ× l,íì­ý( }qͦלêgÌB :~®s;õ„|IE&TºlE»á¯?]£¿×õðÃÙÔ^Þ±Oóm¸èç¥úíÙl+L<âSÎl—̇‚hßxö!”ªÙ™‰/w*ÂG©]â¾ë .ÏßöO%OòD´}tÀ»õešùÑ>­í#áÓéÊéðÈaI4|ñ°+=¨Ù,ª+Ú³EþyÊóI_AGFó8szSUÏÄÏ?î‹3µÀÓH‘Š*—Ç2¹¾#:åQ°ÒÇ¡ÁË-°PŽ„.àßi·¸AÙTV“Ö}”ŒIŒÓî8 `T„²¸QF§Uåñ«•|Mf²F@#£š¯XÐÒµ Dôã,®Ìî¨ù’Û¨’ÌÒ¿Ì3΂â H!³+ÍÁºÍaÐÀXøwV/Ûñ¢Yרö:åØYGï6h⃟”¤TyGK»Ë_Șcá>üÃã Á¼á§­mBä@ôWZ—±Â,IÖÍÉ.1Š\ZÄA q0¹Ÿ©˜êšh7¨bêï”Î+Cl|çÁé¸W wYê°œG@›ç¾©‚0ô ìîîî¯â{^¬ÜØ@3£Gó¬ÈÃe¦q<ÈàX®I­… Õ°Ž>wdükº>gBhí @¾)ÞB(‡y·Ò lqÐÉA²ëGJ×jÍkð¼ó–PB΋̒UKEßú– ºÅ^æ*ºÎ¦CV¾ž& þ5ýÛBº5ÑÕý5åÅAƒ®Ç ‹ñɱ̭/„:­ëÙØÒ¸³"d®Ú<ïŒyE\_Xˆ(¹E¥lqûç­- NWÅÓÖW QpBG$Ls u:SNù&“ŇdÍC¨'%ü š°ŠÇeaðÞºCίóì߉©j…H¾œ$ÞÀL…@¸¿aRã‚Ü|zÙ6o†öˆOçÜwW(”_Í^lì ¥ìC¨\[71ÚòP:Â]wö`_´3UP¡@ú‹[Àh§ôÚÈÖ^ºVž†•7,¼Ë­»ä ¨OEça óŒü]WÆ?‘¶á—3æާ÷c^c]ÔvÄ‚îàÀe-ÙvÜ{¾0'œè3c)àeNëGty–áÆ5õ ¼òôƘs)51XVFÇùøàÁ=ãm/ÛÈœoÄÝDÄ–òJW«sYìä„›vI»m§p2ÑÙ÷-Vlm6†dÏC¸ç‚…Qü-¹Ê±é7úý5ærr”çâN©7Q(º¹=kW'”8§þU1 —øó翹¡\ã³ Ù<Á ¸í±E,Ê9ÑõŒÐšølÝ£ï˜>8¾eiÑùëàyxÆÑÊéÚ!ý ¶G&QøàTy>ä`J½Œ„G¥x¸¼O·ãÐX~ÖûáÒ sÜ®ÃòÆäHäku§PF0ø}‰”{‰—¦W{.ŽÌþZ›]Zbßžx:¿ÅRÆæpuhþ"Ǹ]ù\s$vp'/˜§·8a‹6Ç?PõUºm4s/ ;„™éX J‡¤®'ƒ|p©mür6y²h†7²Nc;á_¥ç2(*áK­á”.ÄI,éÛGƶ󕡤‘…m“Š[‡…ì„^É“$¿áʼnP,¸’oö„ õX㢳±6üõeÚn0wªJ¨›^e< ?düÅÉ˯.œ… (¤k€‘ºÒÙRP!§ÜHÂqpéàÉ6‡sq(å>bß>‹r[VÕχ+aùÚ…¶¿Ë"ãóCîbö¤…«Ò/ó lö~ Ðâ¼4¶ p†¥"dƒä! áìº]²öùîpìm¢l–_E†å¿óãm/Âð3÷…n¸íâÍÕ·UaÙá‘kù[ºÃ]Ö¥[tÖ ú¼5e`7üCDÒEq‡dÝ!Åú³ŸØMå7(™ú]š:ÓÛBsí†NSqÅùÜ,ÊE×õ›³´·Š Ö|5NA›o îaÃGÂÜg³íîI:힯o¢2á^üS÷ñ—›øí9C&VE7f¿;R}È”ÃÑø÷Ê¥ñ(7˜ŸT¯˜ ¦A‹pÃt4#äRïÎÕˆZ¢õœ7:²@ú~jæ?è+"ÈÚt½Z„-éu ¡Îd‹îá}¨ìF„ΡÆ{V½¿Ñr†1¯YÅÝ[£~8âdü°Ó#¾‰åãÖÍÝ kþîÉw84}³ûØËM2Ó9êuf#4«Lç€H1YNT»þ‡Ò²»¡%.ü=OZ{÷ù}R¼îœãÖFð ‘­öN6û¶z…ÙdY.cÐDOã’Gž÷Ø7WÛEÖZ—šHžìLÌíIŒ)ñ&‘.Æü©…f¯Q±>¿g¤e¬!tžùFÅh8'°æÄŒ1*©þhª?gf,$SÁøÖCò˜‰°§¯(Q…8 µ û+Ñ’•°oöÆ?F !ù-#²`wl L²­ >ŒPɯ)—Âe¯„ŽLý¾5?Cƒú“ã'dÑ&¤€%ùLâÎBøœ:7] ’Pâxýðõx:‹%ÞQãOÛùÀÄŽ”ãÀ³¦dë–wgg?è—62vÂb%ì‹xÞõýÏ xÂÌ;Ïdˆ_cñî&¾ƒmé¸-ìZ9!Î4! ,!*ñVsÊs¥Kcp_³“tl?m-àúïNs}Äž$(u‰yÀ:DˆæOœç*‰–H#Y^U¼Í9Ù_›‡{v-*µj©a‘MÁåiÞÖJûï—8%“‹U@ˆ°©±¥É.6FEr‚øuÍËÓ²h¸í`c’ØanXl")c‰Ñ¢È¢GÏéíÅh’s‡«…m‘¢Üí‘?o8mˆ3AŒ¬Œ´¨ò$þˆaKÝzŒ†(H ]Cè1}ªÍ4¦4ͤáU_áS"ICžCËRçtò4.'­Ø‹¨‹«…èNyœ†óI¡Æå4“ji§E|˜(›ÄèÙóŠ|m&š2ÉÒÓYWœ/t²ñÚzk›Ë=8»móÍÈ)\ŸÌ à>à)Fø‹Ñ ëW 'ÜoØ ‰æ %/SœKTßI´7>hÏjš½BðTK?ÅòJ‹ŸÐ)е Àœ°š™ù=À\Ñò"d jopÀ0.JLÛŸ¬Nxƒá‹üo÷ñM²0Ó¦´E!‰_…æí$¤ê¥Í«SÂ× Q«wÂ?ó¢Ÿ87÷ÄÉ2qó˜÷/c* ‹Éšñs~à#èÁZKI5«›ZÊ<Ñ WÈè¿>¬Ié^¬é^äQg¤-c‡oÉñ£UŽIÖ B—$h1R‹Å[}Ъ: ­ñ%³½y|IOþ–P&Øœ²SyzÆÉän¢HïQ­\ù¦!Y׺Û3Sž3iÜk©Y+úàŽTV¹šÏ“d޵°(šÔ2³Ë%¹"‹ï¥rJ¡9üȱX*c¦÷h$%¬ÔÅx‰§Ø$3ˇ2ÂìL†$Nr+lS¸%)kV¢F‚݉Pž2 ;¦Í¢Æ»€Ï0íY§¸¸$*9Â$ÄC¼ÙøpŠð¥6 ­éî kU ¶½ãPA½¡PÁ,á<˜4œ6W)ÇÏ”)Ùɉ±ã…qIˆþf¨wrÁ4› iöŽÊ4éúÖÞŸ³Õyÿû*Îõ%Ê{Љ)‹Á)ÛE‰QøIñULÖf\&£ –|†°‹\¿÷Ë5;x%¥–%שê›™:$ÄÜ`|S{1í;ô'ƒûb¦8rÈÏ}ZäLÊf"93Ïó² ·”ÊþåìÖŒ$®â;Õ"=w2(Ëg¥[—·on'öŒŠüd€yÆàˆ)‹—R{b}H*’m!Zîh2Ÿ¤›Ÿð–»_,]ƒ¯Û]¹P ïB q³Â<¯¸"™;”‰æÌ4/éMŸ’ÍË•¤ ÷²im¤ñDÈpÒñÓV ˜Òp3÷IIóôôŒÜôs°IÇK¿5$Þ ]ªYö™¸›-‚@CÖÕ†ÀÅJd.ê*Ï\ ¸QWˆdZ<Ž8i,6‹·>b{ó¤„ ôLj-rvÜ÷®.i8/Ó·Bpmô« õØŸ)°Gú™‹¬Ðuj±Ü¢ iÿd—%ŠÐ¡` T¸R¨].\°Zò®.p 0E\£uÕ÷ò…³"J%Âü—ZMrDÒyFÖyF"ú9´kxÐIãWÎïèžXªÝЙ¼KW:Ô_ÆoFåz”=˜š[Ài$]qf¯ )±%¼­U,¹o ½ñƒš!¼¤²ñ’•VPÙŠz äÕ¸BCñü6NôŒˆ7’Ô9N˜®¨7HT5âB.£2Z$­Q]€[y¿ú;J¯.lWš‹)Ì'†Ù˜vyQ­aà©ëYòÙAÔ #—-Ôfj‘èìhÚ[¨ßF´˜½T†£Í<Ò Ÿ†7·£¤TÈ¢-oÆI‰JÆû< ]nBúŒÌÙ8$OáZŒD/é¼ÊˆÃÊHîÉHaÏeÜáK²igöüƒ\Ë%8AA÷YëkÈó´> DÎH&Ï’ ?1“¤ )ÿ‰xIç 2åœj àÝ¡Áû0«RhôÆ£:r!ÓâàÎ5D–.ÂÂ-x‘}ÀsÁåh(«š2© >òò²(¸è¢á4ѧmæ'óA¸Å™íƒ¢ì¬e4,‰Ï#C¶hFòû‘i%)92„ZV!ñ]#§¬gü· ®Û°$‰{qËè.‘ÿq‚‡¡â·6–<†Ô“E—¤ìfˆt"¶l!IÓòRåKm•®Ãdù¬êuÏHf‡AXœn©,Q!#íK-ëC%0ʾ݉[pUFN}û4Íiy„£¢ËÔœØKp2 Û§™h«ZL¾¨²fÖÞ¹±bZ«ŒÌl_I×Ô‹áü¾ç`ÿ¼ ìr}KYPšß Z1šÏ©ÊÉØaÇI¿%@ú WÞ×Å)ðy‹uˆx•FW7ÅâJ“'u™Â¯žê­ð6˜ü]<:ÛŒU&·W*[-»ß#?>í É(™å¢Ð”H‰] ‘ ' |ª2{Œà!ˆØ ùêr“Æñ‰äÄ+Æ5’ErB_Ÿ±ù²ÍÝ1ã©Êh*¨è_ö¢²³4TÿÓ&V‘ÍŸEèk´Iã¬tN*o¨_´aW‘n2(ªµ«;ƒNØðÈð_‹.QöÁHøHq„O$jÛJH£„Ì(yû‘´ï—zj4Ô.«ƒaÙÒÏ’À5FOµ'„ˆÆ,,:hÄœ2\.5_x® ×㲟ªCE=Oùñ>._aá%’B¿ó9®ØsŸ‘nÊ0BW²uOäJϵ([Ê +úƒfccn¨‘4gÏj%²Ò»ðâʬñÂZªÝ9)Š äÞË–ó‡ú{Nð'z´²ÔÍL‹á-tn»Ãܳù_Në~ 3²ø³˜å ïBC$Ú©ê‹NÆ ’¢î0ç\ˆÓ«2ìö=Z@Ö‡s¯kéΖ )ð6à!ñ̦‰È‘îŸ%û̳þ5OßZ%.–¸¾Å6XɯZSi¯n`F8Q+ÓÛ^¾2¾Š-$_ºìʼ¬_t|*†™mÒ4Ñ̸B|IXI-1"B8ÇTê†%cKKÆx¨cz0¡+=à ‚.ˆ€oë3zò¥<ñ¾—Kކ mEF2PÈ`ßkгÄä¦}‹Øb¾bÎ3‹I¹qVªEU‡ÙÓæHa8~\Ã7ðŒLm 0Y”Å,¢¥>èyä¨Êè4òâþÕ´°3ýDó  2A •@"EfÑC7ŸŠe£UÂK4“é³XÔñ$Þ‡,˜¦Šf†8€ä&¡ŽÌir7 @çà-9D6üʼ$š@ ®%†dDüd®—V©leS^ah&Ń© O›€M ¥F¤°€ÃNÚ¨WuCDoúøn‘sk‡{nlÙõÌ‹£”À’¤çBј†ÄwÚŒ¿,!ÌßÛ˜{$`rÆùÄÛMýç>¤âµž\4uV¯$Ö[×9ò­ì’Œ(0(Wƒ·YÚ7º?’¥5²µ.£×‡Ž^—µ>™+Ÿ)6z@»‚=yxXʳñe!é.J¶A. oŠäÓˆX µHYL;p¹v±g³•e%Yš/±øÀ9 %V·B­Ö-âyÉm@3°ny Þ™A¾ƒŸ°ÆgúØYÜv²éèÎB0ü¬îäé¹lE.UùÔ.6[xŒ ¡CZGM6„-ûù"ëÚ½ª;)©×ßipÂãÀ(}{p‘”v%%$‰ê÷ 4€Ÿ‡xlˆ.<éfwLflñ@·5Æ} ÑžÈߢï£}2’ZË$rê]Ü9zÆ-à›H™?zh¸ý÷\%*=€èö½]²âÃÒ‹"2¥™#qÄE ûm’>/¡¥©ê™~n $dx¼øŽèšà£Ð>y¯*5(‰0oogò6LIÅ":²hÔ¿DaëäW™Ÿxôâ-³Ò—f¸{’[ÉljßœúZ }žS£Ñr#ð–*ŠmàžNo!ýÁžÚh&‹ÖUÔµÄ/èÅL’£ÐÓ²±:ÄYÌp /d@œƒÄ.$i0ã×ÏsOƒ*·v†ç€©!wqáh ¹3ú…‘ñØ#¦Ú ôˆsVs˜Aù-²@LTæ¹S—)¡4IÁqÚœ–VýM'F¦„Ýi™m\|ù¼ÜcoJŠ’r,¤Ýd€/œùZ}Ã4…‡‘©tŽ!8\o]ÎN?Ûå,/#OæÁ9Ì/²n24< Š9ð}À`jf¼{IZéäÜö§§ø’-ë! ˜–ÿPݺn‰›<ͺ&Ç«K‘š´‘ÜûÒ?n€ˆ™f‡‰ŒªŸ¾dat™ñ‘£ý!íã1ÄY’2§ÞT8‡ß›|(Ñ!anHõçAB6ח秦èð¹`[Ÿe‡ábnG"ùd@%hϱY¢çƒßÐõ¼;¤O “™ÁtOõ)¿z_³ÄÂ|i”m¦Mž‰çCê Ã9<½³¼ryïôÓe¶ˆ}cgÄ5Àœ[ÿÍg“äWæ 4x ç€þ,K‘Y–Â]yÁt-_&ÝvXR_:ﲿÁ\ôÓÁ€Å% HXCˆ sàÅNé!¹äf@DÂY°äŒR¢7›íÙ>DŒ½¼íÚÚ7ˆD}o]k‘þfBggRAA÷ËHV†ÄBç<@Ù qUð«…HqkΚ4‰æ«å!³dˆ|ÞLÃA·WÓãWx›F$Àå‘Ô jà·éYfoŒïCe<`œCSqbˆ+W„ ‰€§7YÏ"»|Yª×Õ½öü“¦‘W—Ù*ÂD…)F"r)b—1®äêç»tJ}/ƒÀþ¦9ÚÛZ¯Fï€K'q‘°Õ-€†W0ãTdz17J°¦ÿª…Wž$^G’·Š0¹­'³ò>"zhâgð¬^}b‹Ô‡3±LyÕàüVº‘š©;â–,[8ÆÜ*! ÍV¡nT]‚¤‚N.üð yè,úMˆ¡—`âç\c Sæ0½`g£u_¾¸vxøt’LtK™ÝÖAç5¶‚lx`ç¹&¾«Ñ#ú3mÍÃ#øÑ[x}Ò¬ÞÑeWôH°ËƒèëÝ|šœ&bÔÑ$…e ލtXRå– $f{Z³]«Î^bÝtÆCçÐ4Cê¸Jǰ§Ài„vbYv*‹Þ½$Þ/.}xÆLiåÙ+c7¹2±#DeaŸ“„Å©MÕM1¥<¸¶×e”8ðçP•ÖÛ3ƒÖt‹5 NAO_UäJ†èîhŸ,€žNêðfàbdXdA ¨l5&@ nrUÒ³1Œ¨g‘æ|n”å"–Ô7úb[ü„-o\Xl]©LÙ€HÜâ‹!­l…”‚‰w–š‡„S"žÂ€ZdfBÌN”E}µ\W@ÿall3Å@íÚM9‰$Œg Yd@ZœkJ,³oD† LñÄÀ*a!“e"zŠzýÆp‡!qV­8¶Ã¯4±îäÍ7Ú8KñuÈ–eb$γLÈᲞš_¬ÍAÝpݘú° 绳y d”º AçuæòrfŠÛ Rä„!í‹ ýÅ75°ÄGlìm_ðP W»¼Œ1¨©…†Ú•¬CŒ;ÏÕ¾akiW2(Î7ë%RíLž¢FMûÆR4Ö!ÎQ¶•xJ(_– ’JžU„ýªQêõÉz…br~k’Ú,«)¦âzH;4™c ß û‹D°Ãö޲&لŤQŽjš‰O¨>±Ï µ³¶¼íK-€5ÅŸä]~Ÿ>ƒ§<®ŸÉfð:¤ {X?À œï3¦*9™Ûh æ%ÝÒ §"¾b[‰À ØŠs0Êc‹I?ký1]>¼Á­·ÈKî ‰$Ëf±dÌäàg™6Ü]ZŒ èZX’’Úº­]@œÈÂÊ-~Ñ¢ÉðˆÒ¦#,"”yzÓuvä¶k\‹Ý = èYfk|"ÏrïÄüƒQ â*‰'YÕ•_Ìw’}Aa¿xìçüöô`IgÒ K@ú†¯OKÔb&:”§U-Þ °BDÖÄ Í(áO aìÔ4ë-è|·Qç$P‹†´¬ÎdÈ`™‚Ö ¾¬‘iœ (t Œ6"R=4@#VKÞ ‚‰à Ô’’%Ó™¶’*ÏÜu¶·—”hÇ90Ÿ¸ñl%ÜK‚†-Zšñ¢†>ã>‹QF•´~ðïJB­õn7;C¦šÅ@#m4kªbßÁÂUšÎ€5È‹0 ,`™II€|‘)F¸ ‰Ë_…/ƒqk[£+gI¢8²›„¦à òËù Ér2’á3ƒ\Ö¸Š;¢„ ´( ØUQ3i’eÌ5û¥A/RÌÍNÐQÆÚ·¦›ajã`õû®bÑ7BØ·QµÉ0p ùcëèùdÕ Ó’­O8ÙFe™©J‡î P€hÑ·^äßÉG3ϹM¯8°iÆÄyRœ-ßesjŸlýj¢_³s|ºðï tÀÝ8‡âŸ8®©°X<ÜË ¼Ål±¥ö9ym«V"²'C.FI„y÷¾úméÓhm3}š|Xœ¾½ÑŠßCº›"ݱã?ñ~ìÇÔ¸|Y°NÊetœíPO€Ú„—ƒ8µSx å_¡ô‚Ð38ØÈ)\€5å¾@GÞÉ^€…NTEPó<](œX,G5” –"of§aÛî»Râx½Þ»iö G˜ä)y CúΖ™$ƒaYv&,ïÌ#ªF8s‘|ÛÆ>º·È7ç7Š1r¶¶²t¦‘ *^4&ôÈö+VއxU’ÍWeV«ôd@wd €dxœƒÙX-Tàï)RbEª¬pskÎT¹5oð †·+¿rÑ$#j+3lVÀ> ƒgPÉ|mEˆjØ(u> ËU"ª£(U™–ÂHJ)ò% 7ؼÜ>§eSŸRœ²É›á`_¹¯/ %Os}BÈdMNñívGã‰|°ãÑ3–uhÐoø þ²ŒÉ²Ú4­ÆÃíˆua¥)4ªÂ®ýR« îd-V‘’rla„À:É@)9'ð‚}X$»J“;€›MHOUšj•e‹7­ŒÀAd$`¬* T»Ö±![ÁV3O+ ?2 BÄÑ’¹ˆÔ_ Ù®K•0E‰É„8à¸Ê =qÒ‹¢ªYùBÌ“[œö[:ü!1qtÀWrZÁ’`óÉ7£ì+ËC`›LÓñ!ZhÉ¢/ÏïŽä*1¯s—8ÎöÐ*&šZü‘ ø¼)‘LÓ’ ŒT…!.bâÌ`Å@òA¼¯m†ëCùÝ«¾JÑ&¥_‘Y5+òI›ÔÔÙКöbc¡’¡Iú¡yCìĶûä™Ú±¦´mú^lÙ4Öó½T¸Ë&S+FÆœ›ïß,Ø~o0ƒd9 ?Dï²=„qŠ ÜžÂÞ2Ì [ëÊÍ#Œ âkÌ*Ê%–9M¼‰ƒL M’0ñ”ŒjUÚ¥" &|kѯ/õx¯«$ÛeK^Ë&ælS%ã¢H樃'ȯ¦°DÞ•ÃRi$rXÎ \M +%QCJëçÙö¶¤U¯Ÿ—ÄÁ⪼G Ê+¥--øœìju%q0ñ Âr齃u^ô]çÝ’&“磴øôEÒàåÐ2¸d¢ä^Øtîóϲ!ˉC„¤¤Í“„–º"ÊJ·U@o¶æAz¹ÁòŤÆÌLl F᪬’£Yãÿ™C_‡M¢c Ü]ª†A±óe'“dt„I&Nyk£®êp¸Þ(…çæð Hìê>”Ý6“yXC·P†y‰§‡a£RÈ@ÁBÚ·•'䣨ì’r™©í¯âL¥Ç„’§ÿúÒÌ»*5ü¸”…£ócq_´×ÑßίB˵ç~ÙC.D8en…è!SqE¢åwR„±§°Z‘Ý×±eð~‰Á’#«•¤<êŒRZj=¼YOIRkFŠdz»l:›bD²TF<`عKÇä! 11/œ4QE+º„/~i°…òKÖMN,x>d­¨­}㬠Å`CL¶†Yì ("ƒ£-éj¶“ã ãV#Æ,J’1@› 6 –+KsåJÖ›c`AºàÊ f4¡HGáù<6€¾¡>kZí"xE%çvb¾:Ü„k- =‘z›YÌZfQxÍòHBŽ0`@ÎÅT R€:rè !CNÇÈH±o¸ö \'ˆ1‰¹bësØ@‘-<ËÑN–V_M,V³åÍ·ÈJ%±Ôö¾©¶ä¶uù3.á¿Z®1_\²Ñ!°ÎÙ$Z€)"ÎëÞŽæ¨äjÔïÚdQ~\©Àt^²ÔàV ¡ldÀL !I€ RhUÌÙjH+OÖ•[ˆÓÑÂßîÀ˜ÅR*LÜ”ª5l5 '0¹fÕ²aSóªŠÐ-*žFAKÁ«’Y䉖*:Z³’YMŠY%Šn™•`žÿ öNÐA±%³]37Ȭtü$û`Ñ£É|´¥ 6*K꣰nr¦lÞ€Œ‘û¡k9–/ÓÖDÝgÀHáVO‘Lu}³1ã˜f±âÉ¢wZý¹ ú\$~´¦| ‹¬Hí€ÊÊižÊ8š¹M¤—–¬VØQ'å:uº3¼2ÄÕA:ÚPÔ"F'—,hc¤ÒKàÕt äáBñ·GOR«¶0|Zâ¸å›”âÎÜYà<©Q2OcðÆ½±8EŸÍ²í8ô® ò‡nòôT ~ ~øA®Ê¤f´›´™=„v¨/÷Q/™:š¸Ìê#RiØ_·*V¸C'¾« $ã1ð—²¥Œ÷ÉÔ Y tH>8gÓÌÜCî¢Ý®Ø¶/VÇh[Qé =ÐØäûgõ—±#Lq¸²áIEå»úSŒüU'MlÃKʱ©LB ƒðî¼¹­úB¶6$%þü­{Lï†`{må4¢F€´Y½—ór€QI YàUhsê&a%ûE§ñu@%°•‹K–Kmq牄Ãs(—@eŸ ŒBPA•C\#[¸GÉ\¶tXx‹ÏcʺÐ)ø ¾?QæˆÓ«¹PC‰ð¦kˆm²:\âà\pÅœ{F yÿ¯ ²Ÿ¿uÉ_ ì ykÒjäG¡ûªÐz"_ÉZzÆA­yšC/š€L :ž-ÕRtÈÒ1r…ELZ¬w)B͘ŽB ³8rLRZ¯»`f×<äþ\[Äòæìw5¶%t¡°¨ö©ä¶Ó%V€vR ±¨±ÝÎÿ¾Xä36¹&XÖŽI¹À)-‰t²óÚ¤Mä“l% (D÷X|¡âþžbîwÅ`òn_L)œoÂ÷ë'Ù¥ØÕ"Ap­"¨Z à—@‘ä0ƒ®-Àý(…°•œDZ!Q#x÷Jm„ºD¥Kó¡Y£ìì*HÙ/ D‚]—©§»üŠ÷×+M&ëÅ®¼œ<R`+¹ŒÖ ¯kà2M1„¼r×ÈmæR¡ð!H¼@Úù0UKÎjåWûØò(—q#ÉôšHù=°¥ÞU8;Œç¥Ÿ©d»n£Îê R¾ãõ¢ÄF¾Á¥ÀÆdIh®³¢e—¨Ö"èŒêÕL‰ª#ÆÎs³ 8Ôà+‚ø¡p;IµrÜ3бgÔWÛšÐe¥Ä¯jÒrk¦M¥ +°¬2‘ÊóX°èIû),u]†¸}†,0`Œœ¯0`äóޤVp-X«5”…OV<ÚNp@{Z#—UëÀà6‡ÂRk— #ªKeÉÍ´,mË…s~V¦&爫´Eˆsu§òïF&Áwbµ ŒŽÓAež„7, G7¸ha53äÓ⾘Öz¶bÚžêYÜôQÄòÎUÀ´èL‘ˆ'…–øÂíÄHú³BY—oŒö X)àÅRÓõ[k¶ò»ÊÞ,€úн·‰Ö,J™–quž¬e\¥ŒïžÖŠà7~ÄkMñ½(RÝË$rD±(”Z¥JÏE¡I  V1ëÌ~kFí x†,$’G@Ô‹¤J¢_ÃÆašF¼Lú{Ž¡:HѸÊdá`ú/ÈfŸ7X"š½4Y°š$•shv H‘‚ñ§bKÂaâŽÒ•åž!ÎÄBv–•+A(Wá¤Hæ p½N+V ú-6ŒnY*qÌGÌG©töÖ¬œsÌT¤²îe¥dÔy!&ƒgüÞfKëÁXX®Çã®"©%›™ÍxEc&¾Tõë™NJˆü,’sÀ„I .ˆ rñ$jFÔz«B7©;ñ8zŠxj‹»Õ‡ßZ'P÷|Ômd+è7­ÓçÕ,‚iÿƽÛ¨ä…ù`[ÖÈÜ€L䷈Ϩö('S*gºÉ,ƒÐW¤ÀQ`ŸâdãDæñ켩úþA´k“jM&-¥Øêk„r‡“òÓP³ ±CôTú<„Ma!ƒØÔnBör»íyõPtîèùíV…l²8Z‚ñK” ‚(€)uˆfSh£HÆ9UŒTo'Õr «\'ˆÕ$³ ™m%jþ—f¯\sÀ²SQËDˆ$VLš@§àà¢ÌZçõ¤mÅVM¹¤)ý¡ceؼ¼ßT ,ʈuAkˆÓ¼8l&“®ƒÁÏ|:À\aøÑèp ® ˆžwv»S’yd`{´‡Ï¨ŠêTÞ*uª*JÏ‹D\ˆ—Ûù âİâQ™QñA3g¿ÔBIO3ÞhɺsõK¤hؾS°ÊdÈkÜÕL'aÐnåGñQf) ÉäE Ô¿^$±T­ÙED(­;ˆËxâf´zI§žˆÄS°YÍ2×ÖØ÷{Š)¶±œ#øa*Š<©D\=À‰1F•€P³Rèq²ß;€ ji¸51yÊAåõˆ§øòH‹IS³ÍÅDÑìÏ—˜Òåý À@Ih…lWøsൔæïƒéØ&é#‹€vãå1Mwot‚J¬P ™7ÂX¡ˆòþ|xñâZ>…Ñéó®YŒ䯉NôžÂ‰oÄa,aZŽ}¯•IY¤‡(Ìú¢&3ù ¥‘Ž ÀAiŽÀ ºÕî“f§´’•wv-a,V&àlVj’Gƒ”¸°O yà6Æ œðÚ/’}ìµþ9è#åãTL(R¥XºxP—y°õ‡îT‰ÖÞîÒ@Êû©94ê@ÒÌTå9Lc› Þ·4Jr• ‘>°áN MœûN—²*oB¸†Ÿ¯¼}l8 šå@^íNHŸ$àcDû­C¶K1Û¦Þº9J·#«˜ÃwÄ$%ɤ•GÖ_úøF¡A´à|dï Yæ Ÿoì$d_öåÝÓõ)–÷¸>½×r+HÀÊ}-·‚ˆ„² hÓc1ö1ž÷ì+, œRûRG£ݘےO„¹Á„sŒ§™f$.HP¤ÛÞ蜩³ËJ¬‰5­R­Ö†"x•{°®àç⢚¹S]»£¹‰‡û}üR’.ó¦V­IoÐ1mK”tlŠ´dñ ‹Š(áEÚ¢¾„ ÷@šBѰ'XÔ}@µ¹j ͪLmB}Ǽi#-YWÊ} znè’˜ÂFÀ÷šð=çkZý·uâ.ø»‚“r¾i­$رçuc·BÑœS^¼N@;øÆÛrŽ à:JS).eÝñHâbéóJ%͇P”œ«e H–de‚upu¢W ÃnUPÊpp¨%:±Ô°”ö4ü“! `ßåejU'Ü/@Û¨>À›#®“5×ð|vÁNkS.L;8оhÉ&»£_§E¿Êú¼ò-Ò¶š‡ä¾JBŸ¥®«8³ÝYºF—N)^!]P™‘EW륳Ê7v~b7,XÍ”{–܈²nV¢y ð:Ρ[û| ·o=!ú¢BÓ?ò¥”Ùæ‰¢â ‚nv^GS·c#ø¤8x–, ¯9]Ý¥NÏ€+ÄRC$¬\Á²-7èGr7|2yÜAŒÅJÈ;L0-C"ŽÎ_ÆÑJDãÓÅð©˜w*vDjƒúHt_±ÌÜH•(CJÇ0¦éìATv5ßTqÃå]¾ëÍÄú ¼\‘B ¡y™U–†>ü«xï¾¥( §G:ds‘ @AžHI˜ÃÅÖéÇÂ@ÔJ 9¹58¦¼¶1³tr›Á†îê b9Òà$µÂ ¬ùÚÀò’¨~$†2Xf6¤ì9hû[s Eב˜¬ÊŠhb6œHajûÁtlÊ ¶’' †¯ËÞÀµž ‰¨kMJÇFckSõ ÑîJxRfÀl©Ä»‹?C'¨×ƒ ØVºõë­újð=… mÚ%û‡ÅÆ8D®ì2‚[ . ÃrSZFô¥¨çÍœ´1¶³t€ºÅˆc1D¿ˆœ©®fuð‹öu{¿ 0(¤Qøà†wÑðÖîÅŸ•þB‡dA¾Ð§0‚p U‰Šl€Ø†DIâ=§Lw§ä‘`l')Êàû0\›ÙS„Zs®%$Q¹’ b/e=VŠ—™f]‡Ì&0|6“%@€"R¤zjÑR#KyyÌ}TÁ E»Ê?Ÿàó…Dõ¡s Z¤ ¸pU­f&¸^—c°ÖRCÂù4L,J ¸‹Y…-Ále›E¹KùnŸ9!ƇhƒÖ&¢x‡¨Ñì‰;Ì«@9j²c²yܽ1LM–¡äÀÅ)€v9go”=­œhî%2dàgÓ¸ 0E ”Úw®%m}«©¿LfèiŠnàõ˜u†PêmÂÈ9€×B7SZI‘£eµ¾]È,¤BÈR‘/ö6ôŠL‘2?PüÔGÄV«ü+b!è)¢IÝ"_€.b~mÖ‡P3Ó~›Jô"`A”‰'@Öâƒ@M&óßʤHÊ  ’2©’‰í~9ÊœbÚÝ/zØ‘s0X!»à "Z{Ÿ´*‹ôßNh=d{IVÏ®†?a/i•t @J °I IΆNM‰gFoÓ E¢3k¸Ü^é8ÂW¦¾¥ ¢¤ ’p1ˆ«ªð”lcïH…ñ1c_f©gé)€°9í 0+,Âdz7xp°I…öFСÔµ7ú®XåMz$Îk “Ì ¹º8Ð ’2Ö"BÔ1¢ègf˜c6|$ ßg“6Ú+ÞKRb:õ²ž}9á²Ò¨~À6)€*)“|Œn´Žd€CvE~¸Xt‰«ï'.É& ”v± ï!-³LQï‡YP¢½g¤Ìapñ¸¼s«CiLÎåMàp0‘GF®Ò¡•@mZü™?\8\&ëÊÑ=À%6U9,ÛL0ýñ Toß‚ÍOò2&]âj²dÉ9˜%azEUq3‹ŒÊà±ÛöM®ê‡ ;!ŠMI¤%"½™Ë³m„,TÔà¬Æ Ë}†cÊ=c¹µ2™Ù v…|s¶Æº:ìPQ:#k|(;¦ñ&‰¢ÇK_SS²6¥*&õ"¿$¡Ò»VŒä«#õQ.Hã-s›"EÍTºñe¶lºu>ƒ •åeéTY–ß\’2%i‹9³¦VŽßM•$)Û¦OËÕ…$A¤ÿ’\hÆI3Ö…M¡ÃkKDpY;}<ÓÁÜ s·¦×&ñýfÅÙ"*e‘Æ-žÀk’+6ɧ—,}áš`Ë↢n.Êδô¬-Á×Qr˜{DÙ“¦ó’ ƒŸn†wJÌ®F±ÓMÿ% î„ÂíIýº(Ž$âý¢+^Š«U¥zåZ®rHF®A÷Š!`\5s‰&ÁòðÕÇ·A¥ì$[só3ÏÀ ¤K@ahž÷Ke^±µ}1_Pà Çp]:êóàªb®(¸ŠHÿY¶‰ Êñ‚ܶgæEDÝßZÝJ£¤´³+ré[룺7WjÊ~³ñ¸ƒ=€5È +ç ð|YpwîK©Ý‚Ö@©ë'%•ÛUik{±U Šz ]Z€úRnR¡ÂÝÊuÜñn=9ä|¤@k|Ñë %¯á<”@b-éæñ"´¥éɬ2¹¢ÊOxpíJSÀ Èl¾ÂàËŒe¡’‹ÁiW#&)úÍŒ×c¥§ä0_ÍLšén½.›ø;KŸ,PWqk* ''ƒAË *7 1«÷©ñiwu2žnãLØdÒl§TÚl À9 `[ 0UÎaY9)HFLjwLÕ‚ÖhãìÑh¤&/5Ÿ‡åúKê#Ikâ@(fR×L{m¯[ïh,SZ½/Ã<úÜy?ar¥Èà‘ˆRüSôZ÷ÍŠß7üÖ]!$$ËÅÔÃ8Ó7‡¸ZÎÏbñ_Q¬s´˜B&rÅU ´Éº°¨–t”uñ$õ'qz(×ò;m,×o#f–B.4ðnÔÈZ3Cf©)ž5y^hò+W©(8ca©)k%á™mXª„&0a¥læIpOÙ±ƒïÃx)ÉI}%®˜¯„Žâ*DŽ»Ÿ¦;&Û˜ñ¬Š'ÄêÚß®æš gøB6xç^æÉî[«,Sô¼ –Õp>ª…œXÇ —@ÿ6¬,uCèzÔóP{““€MRÆrùÇÎí;JŽk,Ñ–º_…€*½Ü㌅v…¶7¾à%qp/>–wcIŠñíÜì,¯"bø-—Â|f%i°¯×ª–œÁiA´"XjJUy»lȪv”ì%UÚr´¨ÊId‰žV®£é0QéKt;V+fà‹ëûrÏ ìYrÎÊ‹¯>ŸbûÌðf¶ÄÛÁÀ Cšýr×J£AÖÌR¥¶î‚,JÛW„¤ØªElt5ñèE%ö ËTÀÊÔDSK&D…ºSøuﯚ©:_LR5É•ÍÐ$=MVÎÓË…œóSm[N„M‚.¼š2Û(Dk•N+0H*ÐX6£6«GºÕ'¯/ ‹ö TÍp à Èôò}A<„qÜòò+t Ø wÀͨѳ”êþ*VmLÊÿm2«šˆcŽw4Ë9dŽ;ä À¯ÔÄÁmf—«ZÏýg´ÄHÊ… Ã*25í3H¥­R›Ê2 Î"Àø$ ëñ‰Ló•’ •Pà--ÌÆñ"šӨĊ¼$:@íà(\²jßK¢Õ$ÍQaÕN¡á,%ä¹ÌÔgQw ¹-4µHxÊý@‡ (€Ë‡ 5uŽÎß1ZȆn^“x‰Zi¾kæ‚‘d‘0ç~[ ñ"U¨Li‘<[m±¹èŸ³•Æ®ë—Z€¤ª›]4ŽM"å‚è*kPS1P5r‘Ø<…×Wˆ¶0­¨Ó·„Ad?ƒÓSËûô¸àªNãØ*nxêÂÐJ‰íÉð ñW„‘l°eoíÓ´[¤Q óé®sÅŠ!J<ûZ¦Évh-•`b„ä·vÏN5Âõ­yœêñíTW›VÏ¥“L–Ê·Èc©™ cE°He0> Oj6ׯÂÏ|i´DÍ;eýÌ^}Æ Y(çöYÒÑKÖ¸áMÙâÙ£½"só0i:KVÌ‘ Ù0¸"[ -Re~L±•aŒNŠabu«ýÍ%g‘€½ m½®DjC'WSXSa’¨ÀŠ©wí7s> ù¡Kdˆp p/H¾KT¹ý9Q64W/5†GeÙpC[ئ€±¬k…!Df$DsGYMÁ*ˆ-Ô3ª )†.º¸éº ‹YÑ[¨Œ1¶dª‘°&s¶©ìHšw`—®Š†¦šÏN±†ò:—•qI8™/,c vž¥ßxw©®£~èZu…ÐnÑ”1#Á±ööØŽiùJ„Ý}Ô A·îĸ·1 #†ÄÉeBJSžB¡Ë@¸,5ÙªŽõ¨2Ö K@‡9~m™H×2Î…/¸„9NRŠƒÕ-H˜¥X¡P§ë–¹ Kè9ì¯@sÌNCöwqc­á|T‚4ñ®Éo"¹HD×m†<_‰l€7¡Y‘®™ œš › šŠ!'ùàVáï´  aÙ4m2Þ ¤I¤~Ú<‚ˆz€(¬ô£¥.ž¹ó‰…HÔ§Î5)zß[LÝýð6¸ô*íûÚlç‹|`,ø0ø$þ¨özµÄ„H;òÊK“`i"^·wœh Ë„{ÜáUkÍ`•A6 Ù±ðs@Æð&©HU ÿ›wñOýzÃd¶Œt}­6dtðÍÅX\º§^Ç=.ï_™ÛJâ_zÊe-3 i¯àY%E5õuˆÒ¬yË'¯¢ pê*d*òØÇ­S@¿yñbêÔ¶“GŒ¢LÑR_µ$ÉÎÉukóNšú²Ü|¶¿ØD6…ð3¢OÉÃüÖ+h³–Ÿ DÚWZLË¥Ï5EH¤Äß—ÑÄÌf(E_VßÉ;_Tn6cŸ`ÄÝ(3‚sÀÀ^iÁªZVâ.”bayEéž`ÑR/Ù2©0¾ÞÖ®=HõEbD!3 ½Žf1JÌLðen™Ô³½z±È¿téϥīI‹Û§eU&ñˆÊe~"¶%í”iЉŠÞšWèŠwâM‰n KöWœÅñr\>Ãe±€»©E¨–ÓAâkd¤<’{5k¸ªM©YÄ£QöR ©òr.hÀÔBC£42o)AtNZ“\n9~ר3èÂ8K EF°Én#u•˜Íͬ2;‹%ßMltô÷gY\V8–Þy`䫎Ž/}óªÁÍk[@§¿¸—£ÝÃàjá—¨=’›Y$‹‹XË’ÇÀ¬·}6%ùJ~Ê6$¸`cja¸óÏ£H30ÍC5¼Ÿ‰Ð´"r,‰Š$cËXB¡”mëBJk4m–|b™]u³I?–™x6{ÖÕ¢§ªµ;ã“Ô5ÌÚ’”+ ÷ ]Í\C¨4Q¹½VH—5Ûe<˜-< ߀1ŸÔ)€êR ÷0kÉ.ÉÔdhJr¹™}8yÜ´]T kÛE&®/vüÒ‚†LXÕYA~ p}ϧ!eS½Ö©4®…Po‹ŸÐá…B”•t@±øhŒïùŽŠÌš v­0ðC9@)£_×\K'ªÚ-ÍnÙ²t@õÀ‹†g{ÿk_‘Uv] 9ÐÌl/6˜˜ x¾˜áƒ¡ÒüEKÝ唼xƒÉã´ :Aš' ™›k(êòd£àòTÉÌ-"3Œ…©4ÓFjÚ(œt± Yƒ"ç Ä`ç:œ€¦!¦‹Z¤ Þå[`«d)1 *µÆ ¬o3hIϘÙ)%JΗ%e‘€§h Šêu‡`Ý %0€x,®¯Ìs¢˜]™ë_yR©é‚Úðáüƒ. -½K³>ÖH&«>[õqçÀt8ÛºR•+d• ¨™*… ~Mü©$•ZÂ*6ÒóÒLY„Ñ‘ñ¥’äGƒÄSõ¦²PUk?v5µÖ°ìä*€—dCÚ„x¸†–‘øÝ–Vló[ybùl‰•Ÿ*³Ë$†ÂÂæ¶2™&ж4-Àétí·ýVõ¾E?k£Èbò×uZ¥ôæx7шMËIª4²}º €º”2¸Íªø$ÅlLפ„Û`x‰á”hþ—Áäܶ·ö;M0ü³žÑŠ÷ñëð¡ƒ^L4í Z;EB@ñT¢õ0§©Ö.}¯×)Ö )32Ìx>E`ªx둞߳ÂÈjÍ{Á˜Ø ‡¹Š5Ùžf"{š&Õ‘¢z'Ó ¯ÍŠ <›Jc´HÏ5™ÿ1£±²ÌCðL­Ó ±WRì:m$¥šÓ¡éÏ[$2yFõÂEEÀÁçñ rTê™G 20ìû[V—', ~5ÛCßwò1‚êYwö•– d|ç$àùÛ¨Öög‰Öà‰¬xP¢(Y‰ 2#Î\W|ͽE!VD^"˜N"’ü&¢þÈ=æ9¤Ò¸iÊÔ‚7§%Iüé¬àP’S[²5ÔNd ÐÃHO‰Î7±n_çÄ'¦‘Ú«E\'B 5’„ñÁ“t*#Cº¦s¨ù]J9åz5‹ 0½&X1=v»l¦.q#]£E WH÷l^¤Ô¥ìgòˆ`õ<ˆ}uÏu'ðH.—ÙH¤0CŒ Ø[+Þ})à`q]g=i)n­opÝ7Ħ#4ÙHè ØX+Ë_›Ý-ÛVe<ÖàÞ–? 3â*á7n$5ÓºzBnRù ]ˆ@U¸ðU¿¤ö¹(|ƙР®Æˆ¾Îr4›¾V¥u5ùìQ@ïU´,Õ;ŒY_òeãŠjõj-äËw²tÃèCSœ» äŸhÆv) 6†¶ñ÷å¹äô.žä`wõ,›Æ‚¶N&èB&¦H’͉£s¸L«EÂN[OXDŒ8¬,ºIM¼ür€§©4´®· ¹)»Ï Ú¦*¥ðƒ80Ú¸R÷ЦˆT Ð úïlSÝ´CàÛa…”â9çk/ð…ÀÙ47ÆîñÃÒw£à¼Y>É b H9tæ¬ï(á9öµ´åÀwލù%¥0äÄ¥$‚uÊÍ9 K`‚ ú÷b‘`¤æôŠbúËL)bÔh8F¹Ä#H£è‡¥õ™Y?¢½ÄÉté‚΃µUï$Ť3Áß–á;.ê^ß^ÿŠJiŸÅ(§…%ц”ÜÀ£À¬ÚbØÜ¾Ì4Ù"…HÆdi+’%R'wä{+j(éÉRÔ’‘,Qa}{Ù†-~tâ Ò,¡9J`uL¯‚ªIð i*ojãŠß²&Ę­mI22ÅGgO‡!_ÁÿÅH޽ÀW@)ÔeÓä¼ýl¨kêÀfKã[k¾¢g@µ©€R¨©¢áïæäÂü©à½àæÒz°Žø14C ¡^P ×T†ÞsñõLq†áôð‹ÔNr»/|[-ŒZÒÂ82?+”?ÞÍ7ú¶ú píäiµS(Ò>1Ÿ,™›gŠH !d„,@g(øa¸ð ÒÙ)éº%Ë3¦Ž^á½pÑJíó¸^öM¯éªÌ ZNH£ØÃ±#ù•ÌA–ygeѶů,¡ÍÿðEÎàOað²|¡JïHc©ÄG/ëü²: ¹k…ªïÜÜé&EØs6-˜£ Š®¬xEf©£9* &@°À‡ c$྿KT/’ ¼n†ålôîŠÏRðöq¹™Ÿ!‚„bK‚û@ÀàNó›ª1EDö”µôÀÖ€!“M©¹þñQl2ûY \ª mû2B€SSëÁ×â3y‚-Û"UAÓ̲ÜXØ{ò;ÓÕk'Ú*ØM‡óa®öåU¤gŽÉÓ$=äºW¹Ï?uñv5\ê¡ÏúfŠ€F-Åà¨åŒCÅU ÊØ£7/å.Z’€?bÌh¼´cî†õ\@h «³Ž”°C 9fƒÏÄ$ƒ«u‰ƒŸ¢$%› ±ÈH`H§ÉhÕ3!BM4®­gM;ª=ôiÃ0FKücøÄ˜jÈ1’ Z#™õz.4n½Õmÿ9¸8º†…‹2”¬S}w4Ì«]§ZZߢÂ/iåx3µ3J\à1|ûÈO£meŒšx ¾-Å…> Z‘¥O†”²Æ"öÝM‰R“LGÛŠ†Ì¬‹,[‘ Dõï§F¦±B_5¨ø0ö âmbÉ*Éá:ãiM³‚K¥À]ËÆô›˜~ñÉò&ìLåòžL²ñÅ6£öjnÁ‹&{ Õ¤v$v“SݤÑë|P–žâS¹]iB zOíéˆ4u0'Ã5v6;7 ÇênE²tJÍetþ¼‚SÕR%®‰,™ë 2u0\n¥Hõ‚D>L1Р졦Ò! £aZ†0¯Á8<Œbß—(œÈï…ÏW­<¼É’BÄü¢æÆ9 ýŽ&A­‡"o‘ßàÀy€=SG,+1tE1­ží‡.1´ìCe­š ëtãä;‚²'Ÿ—ŠÕIÈ¿éøeœ\R§9ùÃÐ2 uˆ†u<aFAèû…å²8_2wÉL±šž–4Ø `ò½ ˜ ˜ ¼ÄsضùÈÏdóõ.;L^‚] @Ý‚,zƒ[qP‡` Ýw$XeÔÀ2*pUê`•ØÊø †äkæLdÓê=b8¢Ð¬‡›/.üsHá"¶Mß¡™ƒäJ笆¨Jœ /2a" i%à @ü­jþD<‹á>Ku U·0a©ÊÓgÌbµkÞC¥zŒI çÎÉÁùt8-ª#/–6XVÜh¦¸•ÍâsYøx¨Bk@»ÿé¼dåjÛÜØdè“} HÀ› š:hy´RE™5T3Ñ86Ò=AÌì8åF‰–ì_0+|Ù ­ÓÅ«Üdù¤XçztlMÇ3Ù‚|-¹„Ò:–­,ä0›‡ð+K­m‘F¶$—º4mš5$O ºˆ][ê–LŽÄæý¶e\™)A"ɾ´ê¡B¸œ 9¢«=¥/øLÐðűùœåóæÊ[”Ü’`D“¥Ð ½Õm¾fâÅó&s}“me²{ \5Q¦‰ªJI•®sš‡àÖuïÕ$oÂìÓ>È_ {~](¥ç7I®”&û $؉úÉ'ccx«9Ï$Î3|ÁÉffðë iXhcù }¹±ÌEl¸™±éFîdÙÖ­È"³f1£2/aQW»¤úR¿ì"ë8QaÔ§‚!Häå¾ò'³fObA ÛáÚ\T‚­4Ø S'³ùÊÍ«€T_’X? qÒŸÙ :ÆèUŒ<ázL_½>iS2ó;„;ú•]ÚÄÃg0¼-­…G³8R£ÏV‚I(o&ˆ2Vžö>[Xnß‹žÌ¥OðºŠÁ—# ýÊÓ®ûÐ…À“T m]ƒ¯cG¢°›rƒ3’K‚&'ëb³òž­B·‚«%¦ Ì’‚¿éê잃É8›¤b¦1£…;Y¨x-ŠfJÏ0¤ ºïʼn¹ý†q-ìºÕ,2N¸„ -“JvgEûý-w®Æ[Ѯܩ{s)äóL‡€nhžˆ“-E$šáò½›P4‡ÉYhXŒ¾hqXù<õK<ÀLO¤˜´Ð(™1côé´¥ÁvðÀõá^¸MN‡µ‹°E,ÆhÍfV;Q!É¥sZTBœ¨i™O„Pp›£“òòjÃ%1rº¨{kލQuJ†.sÑIDÉ$d™Ù¤øY#—ÑþaÅŽ­yù‚Ë3²'‡Mæ!-ÊdŒÊD!MByѲˆ6€ãœïûã…€KcŸsg ؼ„é-â¹Räö¦µe&ô:#æÃÉNn¶ÀN2ÕF“ñS=+8¸‰Æ¨¿³-»Ú*úÚ‚§Æ ^L˜*x0urÊ7GWÒbô‚¡%!‹þ~ÀyIÆš·Øm–vG‚É5rYåìbXÊu%µ..9_‰£kdñκ²ì½×*®]1Y%#[ÕMñÈÝ •Ë[y@ëð¾’b ZØ©˜aÙ_ Çð°LÂX–WÀ©îuEÄø.OÃ`O>hóÓ݈hSÀkA²³Ù Ô5Iǃj p.u™°Æ«y ¦E–ÊÃqh@eˆKˆ‹ 7k ­e’îb´ÐbÒîòh!ÀœÕÅ’aWmij¼MI;`%çÀv Ý­mfý½òðE»Å Ÿ°Ÿ\6Vºæû‰{Rµ"óQW ¸°æDU1Ä^Ád"‚B²p'þ*¯#œf¨9VSs€ðRðRœrÅ.¤ŪU9» o9‡îHd*ñ)¦+1{Š~'ÀhbŸ§äÏZKHÐ- 0Ð-u‹f(hçAÇõbÕç8ÉR£ij£‹•qEŸ¤¼åT¢&o?ëuÓÈà ~X˜ñVÕ(Qô‰'övg)F‡Oè{¢MdÏÓ‰ÕÄ<ŽpoK¥ævù(Ùò½Ñ (âVC«§y³öM é»TûÐ|çXá¬F<„Æ_µD¸Ü–KH™èC̶Mbüa7@c7 Þà‘ÀtÁ,fxÃUeG ÉãÐ="Áá\¢ §…Él A¸ ;@ŠÇ…%%Ò°øb/¤T{R7Iþª¾H:-vÁ§*žˆmÕÒì–tt ÇÔ-ÞYþzC¢+†E˜ÄÄ.®àØ}WPœ,3Ð&zÁ†Þ‡`þsðr¦ô[(|•%Y¿@¨§-z´¸Þ÷ó4KFá0[é5Æ•×r×&ãã¥v¥våqÎ0÷ª…×Í$¼oÑ‘6S)ÓØ¥"¿ï‹ÊfW[ÝFàç0'†y¡“q0I®ÛÁü±çÁßš´¸lsB ü l‹‘Àn…B5¯JåÕ,ÀrU”hV½¼*^e’‘à*…؃ÏÙÞ1u|™AÐ’A¸IåÛ¢pލ/‚e­EœdÙÒ4ŒÖìˆYVȲ(:†ûªÄjóÏ@ŽÉOè![*Àg*Pa*[ª ¶0jIB ÂZHÐðBpÕQ¶8ŸÌœ/._FiúØùUÌ¢,¡ú-5•%˵ð [£# _çÀOT-$9BÈ® …âÍ|:®i. @-KìŠÙ±;ðÖ‹oÀ+ÑÇ].¯µbA‘òoÚ7¿Åü†8¾ë#•2ÑÒî6„h©À®©@†©€p©{=d*XÒ‰ÝRÜöætĬd˜â¨[8F'¯t_ì…¡ISÉ]ºÈ²lÀbiAΡ_jRK¤ò‡KoÈ?çßW~§¢5"´’E¶¬¶¨1œ¼€zPlésû¼ðSÆA\J¬² {Æä0ßK—™ôÍ-qî„QðGÄYóŽgŒ4~p{°CÂ66Un–ði•â3ñ§åßJãx¯‚á@Ï$œOÅvg#Ö¼ê/ +˜¿ˆ€Çß5}¦pã9uÜë%ž<#ü x—Ð’sØ${‹‹‰#‡‹*…AàPµ¤¾=ÕA«À6nÄÕb˜Ã-IB© ™H˜+6AEž±eFYuL k{‹'û+Ÿ1ú,²^×å‚Z Ü–Jâ¨sb²þWd;#÷.®‘or Ó0ú\Ê_›Ž(¬Á;Ñ›µGë2ÉçvŠ”û5án˜<¢Â‡ª3·¾å0H(8¨ª"fOöœ"”BKl±£‹]©…„ÆÈ3‘¿žíÑ_ᛂÿe«9:ÛÒæã;ÛÓ2ÍçÓëÑâZÓ3Ðæì ïDwÆm÷Y¢qk›˜Lù4ÌàhìLc·{:ù²ÀØL†fÇ9ôÇ¥#/;dJUDdmZÙ:8$IÆÀ4o›t”ŠBõVqØ)˜ÁÏDNšwnP™ „B’ådBeU%ÝW(ŸÙÓµíU¯ˆ•Ãá»obGM~b<å2ùYòV-]ÒJ”|øԲ®KÒ_Ò#ªÌÍÔl±hi¬ØW8->^cJ‘¤CmËj®Â'î—nqá-ç¡N–=¶ò;ô[ðC^*3[§<ŽSÅøJR‹,Mj|~Që™_¯^ßÜN ÔŒ'wv±àaDÏ·ñåóÀÏÉ(V Q0‹9xLbBm¤þÉâB\NC”¬}ÊOÄ€â¬ágBwZîXHV`1ÙíSDJ¤ÇêRãšta×I0ŸÅ°\ÿÄ÷á$Ú Õ¨“¯,–Wò•å+©åk%Å‹k&ßÇcøÎÝjÇÎË»Ð}†qGÓê1,»×¤[LÏkÔÂÇ3É­iÓŒo0ì߇([hmâƒÈ,iòÐ÷m„,l†U\´ \޲>¿¶/7Bkܽ~Ó-àjoÜùHfì-¾§æËy/Æ»×|ÙP®'å¾YP@×ífºü®6¯„½ˆ&-€—ßxÞ²6ð\Zf¢kˆŒoÜÕ’ûítÜš Ί/ñÏafïlñ½Åwh=n­„Ó­•ŸN·s®F¿Ô߆O²ã¹÷Çž{`Û˜rv|¹$r­¦ œÌšJÙß»¥&Ë•õX…ézüà0z–ÍðÚ KL8KA—;ÓjŠ©çp•¦ ö¢Ò•7ÅB®9ÇB6ÖŠu{-ô‹E ø‘shN’kîÏ”}8™²*€]œ²š×5e è ç°}¹þ ‘ÀmÂïQŠ~_s"³ôsûï7Ó¯fÆÓ‘Â[ç+q]@À8i•eôª©)^ÇŸËh»£F÷í¹Ð"jmý¨ïÞª„‰®²:À3jÉ'‹*ƽVë~è~õlìôÀÚLjæEõ¡±ƒ»i,PCZm0qÝl¢=ï4…‰·Åe1ˆÙÆ•ä /×1è…sþP>T6sƒ2BÒ{ºÝyw7ïM^ ¹ÐW\¿¯ÎB'ªz1?æïô±=¹•‡ è•HÓÃ#9ȵûÐõÑýýZÑ3² 'Ù·ÈZŨD8¸ºÎäš…pê¼…^ÙuR‰FwÕLV'ì¨üxög &ìC†À×"F¡Îûý›k¼oÿR‘j‡ƒÓšº~Ŧ r•=\<Ñî’ UBJú˜Ø;“üØŠEZYÒ"^líçwúÕÖ[ÌöÍœyÒÝ}I(÷WÑä/¦À~(»QM౨Te7üȃ“ÎÝ÷hI^×IYûPyÈ&E(k¿Py>|Á¾YòDçl68òýžÉéœèÖöÈÖ¥šœÞ ±¡™½Ø8a ‡÷_ôŠ.4¤íe^T6k;·|ž–/ÂÃ"VЇ‹—í  “ÖTåÁ@@ŠhJ¥3·"ž¢ûœ³ò•’WÀkÑœŸ¦{Q`À‹ >übøO|éV¯‘«/›HkꃒÚKÔ^.â¿îWÂÞhUZòÑ¿³M>ÍéðÿϽ \£lÿ¥Èz†ïíG#½KžÛJ<o¥*«GUÞÑl†>¥I&.(‡û&Û£µö i²µ˜÷žTóVÑ9pÃöpá¹Ê¤ê W64¼ln×Û`Öý$N°%R¬­ŸáaXK%U.`>ì—èw®r ´±6~öö¶v“³_«°yX¾léæaù¢Ýµú“LX…'«aûAòÙjúk/ŽÖý)±%nÐÛC eëï[¯ýò‘¬ 1œýì<ñ°wœs,¢kgß­Ùµ•ñ“Gcb€ÍñÑÊŠ·í¼õ²rÜæ^p>BÖ£iyÇšæ6±}ÀEºs ™<Ñ¹Ž¼(ãÔw¸$~•¨8òÄ™Dc¹ž ±ZßZþ¿&mï³J èó|” o4Àqðu» ¨-à8š°ÎÖÑ>×ûæÓ-XìGp6ã)Ÿ¼®†ãŠ ó}=ïÖi+\AŽ® Þmñðn#p­¾Ös}K)l%?”CÌBŽ$ŽÖ_éE’Yecöe²€;Z;P Îg·`ufQì‹4^–u\tU}H„;¡yÉ—|é ôÄžÀ)”±ôšFz­@Õh#¹rFëoÝ×õSn²ç±ß!­BZºÜ×XRbätÏžÚZ9»Ðø¹=G®—Ýêcv)µŒüª¹bm€–h#?³=èÓÞ;ÉÑeÂùÈÛ¸˜1¡tK ¸»8g^F%’·oÞ6¸ŸrØœ @\Òåà\WlÂÑFqŶ’0g¡­«=2ô‹w"€º²†ß¼“uH¯Ý9jÿà8+?b–$Fµ~¨M»h£ÆgÈz û?öøhééÅÅk‰ªq«ÿz÷èœXaÙex`m4©¬{÷‚zI(kÀæhCßkpˆÖåi‰¾0«HÃÏBúEC)퇗.CÝÐÔÕF¿-bP?Rís—ÚÀ×èbÜxÜ0X£ÛÄyÁ»Dƒ‡»oR…Gí±^FŒ U–ƒ @3+q'8ß1d GÃnâˆ/ÙñÚÀ¼”'[t÷ÛÃfÍàáZ¤>׃³î“Rû10@uÇ|8#÷¶p%ÑHÆ|„ 3A<ßšà•Æ|Tw,Y[àhPÛЀ8ÚXåG/¬UV5œ?ª{;ZlâÏ'ÜÅÆ9L¿žÞ!´Iååµ#Í–œ›³”Çd-(FÀÁÀh‰3xÇ¡G¤"¥žÙL¡µH¨w\f¨PÜ»×ý¿h³¹œ Ô‹6›kB4KpjÌËtÄ܆o÷1­¯Õo?hø°|ö'•’F&U›áü\vF»e±Êr³‡C´ÕïÛ³€‹6Gôr\a+ì%ÚõåÌÈh3ØÌ$ú«°.>µ\©¶ ÀIó͇0öË™'Õœ:bwÑjœo+\ó‡ÛmO’~ a´9]$oòÛx†¨†QuÎÇ…Ç›wüø³ @±Àá!(•UÅÅóÓ'ËYZ²úI-×=tºÛ¤Œ„ì¶W³¶EŠlé)^¶ÕðîÌ?í0R/¤GZzB'Î;I“v4º†ø­ÚØnY¤wÛÅÑFñ5$‰Iæ±”‚‡ûzÛ„Õ%ÛëÇ•œ²-X×VºvtÐþ¶%JÏblˆ!Hym+=¬òY¹ÖÖz•å åöñkFºt[ùaÅ l p³Âg¾Aî.ié«jïXêåþ›æäÚ&p•¸¬|ð»)®õn„÷\ñô‰„w±„W¼ŒgÈR$¬-µUž¥Œ‰sàR’E[¨ÂVi°ÈE[ÊP8Ý8© …ÄÒÙRCœ¶´„Ì0ñÄ¥õ{¯ËaC;oX÷©ë®zégåážHßi«ÅøAõYÍ'Ãþˆò„_ùÖ<ÊñˆõbzZ‡WzU–É/5‚Å â§²ºtšÎêùíº.Á‹ÁÕ - ªÕêõË‚fˆâd«¿ÚÀòZ"jx½‹:ƵgúQ£J—ö°8¼."!)@ƒhk<†šÅløÆ5|öžð:®1î]yÁ¾’שíãÆ£ ¤ƒÈ[¾hHšl‹knRt@þk[$-QDÁ„× k³úK½~B[×8ÝAÑg¾OÑ× Ñ;æj_˜vsÑcqb—3}@8´µ^96ŒWU¬k?Ù À ÎaÄÞŽ0v¹ãnCXÕ§IlA\\;=³¡.ÒŽA°m±43'†Žøû÷Ý]°[\м¨Y/â Y\»möQ‹”ÅÕ—$‡¶Ý-@¹r‡IlÓÊÂÚ¾L\h©Í× ¢¡íäf @œƒ÷DŒ¤a.F ­"v?èàÎ.vm*‚ÉÅ.¤ž“bׂº¶³‹] ú̾<åÆÑË‘ÀXF”Ö“Ê¡¶/Xv„>7†iÓd çÐâeÐùЂ‹ØjâåécKÔs¼|áÉý¾ü¦w9¬AÈÏ<+€§h;Lc43ÿŒ¦l+"÷v}M‡M_¯üHàŠÛ>´•Řü¸ëíbÕh¿éŽÂN®*’†¹ÛÏ€ÍÝê/ìK[òA%˜-Œ²Œ¨ÙA#*³š‚mМ†@<Пz÷J)³üþr5œƒSZº}/Æ7ù]"“½paö¡éãTÆÂ9г™Àä†äLLcSNRs)³ŠÅêû†l_Z™þ¸»kq„šF´ µâ;4Œ¹¿5R³FÊÊG{&%ná-íauÎìf" =4䃟³åÒ0ü­6·êŒ 4»œú\‚-™É [ ÀÎ!¢/U™›ú€õÿÎÁØì\°•߯ץíŠ4ÞfbÌ]C’Ò3`M[4“ÍÉ[ìS¸.7‰˜ÚÀÐpç½C\®É9â⮼Ãà )óÝïµ{˜+Í"yoÍCäiN]i÷_ zrvŸnÓTLÂ9<û èFÊg9=9gQžH&î<³§tK<ç+Ò•Ó¼¯×I艉èû§áR\gü©§œŸö2”‘ßß!€vä÷Dsuù´‡YôtÅ43hßÝ¡=åùJD CujÓ+‰æí£”q(éî5Ýob8?•ÿÞ[x«Òž·*x‰ÒŸ}9—{„)‡Š\ÙÐSùé™É¥§úCì?—cÚ+öq'Hœ{€ ç, 0 =9Ø¢é!*ŒpŒ/çPÜR>„µ «½¸hOuù¡Cª±Ñ…¸¾¹à33¯Œ¸I±©Ý»Yí1D!u=1GþÕ\¨éXœ—„Û¿dˆ€FžšÏÒ?·çó{wSgdC'ÊA"LC/n%³e<€c콦?ìÒ!¢› A窕Ó#—#Ф§«E0’ËõñŠk'³Ÿß]‚P)ú5}öÄ(Èôš:%šöüÆÃ»›[%?A|ÐGjOL¦¡ÜÐЄÐÉ`&®3”%IÓ3;6R¤`p\>‚›zФN´+É“ÁPݸžäúéã4yÒe‡I§d‰¥ÅDMO1êÈßïéIÞpCôg¯V즣ølpCô´º÷jQ+JñT\©3„hˆ€òNl#;z¢>bdÂ9cɸ#{â"Ø\°¹Hй/w¦pˆb4ñ­§­Bã¡NEÉžHŒwXgë~c”P#§g¢.NÖÐó«PMƈ”7ßcE,8±5v@ ôœ'%•Dÿ}Ç×wEùH8Ä‚p°õ–•s f¨Ó,lùºß³ù¥xcÿôcuàœƒ÷{W7#t x䊲žû‘È_Þ|㼂sjAÏÅb·:pz¶ðæ$ìž-¼›rc>¬H¤!9¡«Цܢ>j0ȹ\œÑZBiu£X±Ë»¥M{ó-î º+öV‹–OþÜ1óânî,PÐ=ÇQpwA¶DàCí@è¹ÉLWâùáIM½¨]lnÎ5 mö¬=¿y3õâs Íp\‘+¦v‡fÙ#ÐóPvëì‹óÙc0QÕ<÷ŸùFÝ!“ä7m›ávŽBrçÃ;-G­˜spÉLBiÉ EFɯGáͧË2„€b÷,ge‚MçaŠt#ùà™Ã•>Vȹ„O`ô<žÍ1Üy—ÆÍ³iÀ=ç" YG™[ͳu2ѢϰIï M cÈzÓvÞäOãbPŸ²›KØBÈN€=¯˜ê‰‘ó¨er‹ÕtA ¸ÖÝz¤ ÙƒœŸ¥"AþÙÍ=¯‡.2‚IÌŒ]b‘å¶ÃÒÐsÆèÑôÙtB¼šQÏ;ÖrÐdÐ1гp‡ÌÂ;Ö q¾‡æÇÌì p¸Qª çkwÞB{•ån[«q¦XcèÝ$sC_Ü«°—äÜ·Èw7ÌKvÓg5˜Ë¹Š™GˆÒì‘U*ÖäϰÀÎP€ËçB­A‡á½<>—ðHž†äÿü>\ÚBÜm€Ar@/´l¨µ6ÇäSÛ±aW)Wì²èŠáuF=žâþÚN³ÍÞ1L¨Ó`QƦ»Z žEN]Šòõ{qL—xün»òN/¶²Ž|þnëÍÌ——-ºH S™f"ù[Ñ\ñpAÁ½Ä~4@ž7Ú½×  K¨smý÷W4p@— λ׌u _êo/Íó:'zy·1ÅKgèWi¸Â´úÏ\¶.ÓV‡Ùózy£–%”T£F \ç3ÊZñŸQdð„ž³bãÙá·sQ®ô°0³é`<㜠ðÌC|4%£|©ŽÖK(·¼Ä°u¿õàÁI8mZ¶khŽêÎTvWø¹½$á‚IÐYPµ ™)($EÀ1ÇAùŒKNEM0™Óˆ§½qº97ŸêO—ÎëÉïb>=—²%/«!V©ö<pó¥Ý‘{ÜË/Öá‚RUŸwó ¼'øB.ƒ7õJ³(-´L_Îà"–_„yn±Y“Ê kúz•Ö-ÞѾïtDª ¯*/÷:²i•³ßÛÞS6Þpw[În±28Ýà}Èœìȶ?‡É‡*áj›~PÆ­Úw@ ƒ´ @€G¿¸a7è^gö ÇÓwdþwËüïõt«òRH9ÅYMÔ•þ"1–r ¾£ýLLègÕ ñœ{Üûfý ¯æ›ã3fùœã& AG:d4À9 ãwüŸtßÑÃåŽî̲hÝs)zT|áµ „Ù÷ZÞ8y j[nШå& "’ÖâzúBêÎé%ªÂMzÀD—šÉ@ ß ÔŽ,üsŽf2’J0ýsÀW1“Uj­ØA{­/¼¹QüÝRÆŸn‹7B9z Kk–Ö°”5ÁqʘU›•+¦ŠÜ°ztr¯„“k?M¶ªK&~ðøD…þ®%h.‡$<Ò¦3»$ñÏ÷úž%j“·±> #%–2fMåS¢î;NdêˆÂïHÎïõvîGvpdÜ¢u¸=7=º&@z±—QlËÒþ?c4¡‘Ž·Ž„áé'ç,¹5ÒOºat Ìd¶ä=,ã1‡¥ó3V4-f„Íé•%{#Y×É·ÛH{>SÊsô5¸9Â*&i %^›âôµ,^¨³ €ÎDø XçÍB,¤(Ë:×)ßfs £# *[Ý Í$Šnéþ]õ®µ^×x䪺ØÈÍß+©Ä2‡eÇÒë–òÏ' þe1 ×!rUæïïÌ0ôëS®’¼ÿˆÖ#ÉÕˆw!žr©ës°ç/䨺;¿ùì­§©®7e—.jXâ?)xWS 5„Éá/¢tzÁ^`¿µPeÿ)€‰³"Ô*áu¤àe½¥×éHËúl÷@˜µ ½åg8põƒê³ÂuËûïb°ûˆìÈð? do‚º¸€stÑOütE$÷VògÏaœãzÃm/¡ì!t±/´‡¿tÀœÃx(ŸÊ"­\aŸ÷›ªùœyÿ¢,rÿÏ*›Ž #ãœ"sªAoÕMN•­¡ôÒp“C·Ì­çÊzò|ËÞ¸œ"õeÓjTCZf¸[(Ù‹§½Câfo û˜l˜Åƒ¢»µÐ4æ _ ) #Ñ÷(HÌv½O¯xKÿþ8óßÛi¶¯àd§’È¨ï–æÙ…Ô~'±¼þÛJl³Úø}{ëš²J§Gú‘E@Ù©‰a Ð¥…€[zÎÒ0.Þ›ƒËtªií ó0?ªM2Áê2µñNùþ½°Êö7©rK;W‘.·.[\¯b Ç9÷&‹_‘Rm»—¶é½·$sÎu C<¿?Î6à¹ŸÃæAÓm¤kP‡Î|šÙ삃èLÿÄI¦êp%±>‰ƒ=RùyéùþºWxmÛú¹%&Dß)ÄI{‹…ž‡ÅU¢÷²Òý#•äF  7¯ëVŠŽ í•űÀ'¹’bBz Õ…<êÿ(8õdË—aX½;’Œˆ‹+Øß.9¡Côï;&ÑáĤw÷ð÷.í{ä”û =—pWÒpz¿7`țφcé«£E¹˜ð0i¤¥R{nábX¾G"²;‡ÐC€¿úÓ¾ºz'8Xs±„ ú‘eÖa;ì\z‰%HÛクZ€ýÑ-­ŸìFˆîqd4@]ÚTï’’| ®A ’ÁÒ–ØÚ<„ª#¹¿÷š£Ûè•W-'àÌ-]!·¿3ÿy q«U¿3þ¨Q2•~¶vïˇ0…¤þ;è¬÷æØ.å…š{ÚÈ­šGV)UÍžÁ¼—¼ ÿPiEû<¸ @Pˆ×åϼä³châ¡ßgH'zNs™Ä]¾Yú}¸¹¬‹A×Íyô‚_®+ l¸,¨ðÜôsÑæš&”¸žâøì”ÿÖx–?å/å2êÜ"Åÿh‚ À9lœÀ[’ú‘y…“ºE7Ȉ¹b2}Ø"˜qEÕáÒ>œáðÒnÉüº§òÔ¨ý‡<…„ÿspR*æ?qSVä|Ú넹¹=Ö£¥·=ô±É\WžÀKƒ» …gfê´GM ©n.37cì;ÈÚ#+ÉOƒ.3g»þ}4ƒ¶ÿ -í9}xÕîשªÚ‡>ìPùþç );èµÉh§È©#¯þ¨^§ F 3_ÅŠºEsÝऺÔÀ ØÑÇÛPÛã½-ä‹GÁÌ5"­‰„÷’¸˜A}ArÐa^×CEú})þÝV*?¢‘V¾’O¯, ¶:Ü|&C)8m]æAìÄ[Îoú˜OHZgFþŒ²!M{6mÄ?—µÐØÏ‡‡¹ü},Þë Þ2͂ €E³M–Q6€²ÔX†„õ®•Ý)Kx¡å˜,½s ˜ ZÉ⇠R ùy×$ùGªQõ’ú†Å‡ù}”ìíñ ‰l › FÙ/FÜ% ¬OWxÎÇüu€ªaØ»$‡•æÀŽÔþ>ßfõ­P¶@4sŸéž•Žlÿs˜f¿rÇ¿ÑäÐv$Æñ‡ka&MnëT˧F™Ñ6•b)ÎàË÷1M‡‰¹Ïü† W¯jüm~¾•ÚÂ:ô?bÔP ë0ÌJ£$àœ¥¹ýç³[1€žÐg vÉ3R½h{éóÊWÔ¯E_ì¹ðýÚW@èHá·±-E‚Åt_QT®‡_V%äÔ÷YÝâ €>Ãö%Ñ«o”4sLá¸èò“‡Å¨Sî3¨ )ûç@+t·Ž„ÔŽ’¸Gd ²ËÝ39díÕ׳«)}râ‚ÿôòº¦øËƒÿ¤õa[b@óöØKaðO8k˜Ig'_fjÿGÒèäz%jYT@—|¹‹á=³ñŠËŹçì—¿ÁlT%øª¤9D0²üûÉgëgnŠ9ʇtaB'EFB~Ÿ¯ %hn½9þÁY§@…Ui/ÿdcv åC66\‘“+ünÎV¬kUµ#$â9)æ&›ŸN §ˆ#ž/ëÑõãÑͼµÏ_‘»â #mwê®CB}ŸëÞdÏ*FÂ|)K`›D¾BôÑ’°ÌE=P³ç@"Nò6ÃiƒÜÝó=œ6ôˆÏÀŽa*Ô¸0REþáU‘5#I§mÌȾq'á;¶Éæ!¶Ýæó£àp?ôu%ÉR„y S:’âÏ¡pÀë8WK‹dyäR$Y¡HPݹ=æ¿– SÕ¸þ2ôªÓ†¢›¸, è@è+LY@ èë#1³„àœ BÉăìcIó}€ôEŸGD…!e¾kÆ?ŸB^“? fHû¿-Mè À%ÁT|CÝ鯸¾”Žøú ùh)¹%=3%E>d•E›RÕÞ±…K¢ ö¦rÓÝ·ê¯Â¦ºÕ$² snVÄ9¯jáÓ7–ˆÂŽd~ º$MŒ"HþgøÓýbàG«EÌâ|%!yÅC«½-À›#¹›] :Ζ!àtÌZ屈nm4]°0_o<±WîhqÎW<±W·S>ú@pè‹ïл8Ô`}>ßÐG),'©Îî0£Äp Ðע̸K=•ƒ-‡«éH½ï–ÿo©Å7nÒr ôx]°Ó4n5·Äk(Gpvê]k•{Èc>V 1 K`ÌíêbÈíZØ+ñs\Œ$}nçƒIûLf|‹•èõ›F‚E:Ïy‚ÁíŒÍP„¬ôcºñW¤/·ñÒí%¿;]ÎScޝ‰ïWª?E×ø½oZp¯!#ÙaV«’]÷’ŽqíÈýÿU‘ivýÙˆ~ý¼E]‹Ó«÷Ür퉢.R÷;Të耳›™ØEqÌ`¸hÐëV}Ú&vv¦ÍõwmÆ{„Ù™5ñ »CN|¿ÒHh} _ß7Uâztóª‚ÆP‰ùÃŒm®_øÂ>d£N•c3ÖS¦„Á%l/×°ƒiìaFsŽÞpzß¡ótà œƒ¤Òû]",¦<ð”ÐÝl1EÀG§š¸£ƒ¯ ïMçŠÇwºlö§éMÞ‚ 2Q¬N¬•ý] n™Í*§`<̺Wö€ƒsâõ3^z sãKdŠhf‹ß糥船F«·èCÃNoú@€ŽìÿspÑû}?€e:VŠñºn@±NwËVí ­ô[äðwOÚÝ¥ÝÝø=¤]f…ߢ `0ºq(Ù«ðÄ‹*ËÀÜü‹çʰíWÉ‘Ð'‰HaÚþ‡Ê P€Ÿv¤ý[½K‚ÖöÓÇ$æiQ ö/Âv—ÏŠå>Qa$sß\vžˆ÷Y–²Óô›Ëv~ÿkç¡'ŽŠÊ·¤1²À膠ÂħÑp}k\dMáSz-,Íið‡ø]ðú–úŸ|(¿}™_Ð+²LÂLÌÏû5šS}Ó ‚½Û£ºý‘ÍÛHXž°´Úp^¬«·ˆ³ÜLñ}SÑá¯)¹¨oNæaWç,í@8 FŠx«‘¨A‰"ßÎu F £¬Ç—Ýg¤paÁÂ5ò>‘"~€q ýY~#]ÁÏK¢Þžå+zý@Þûõ&è¡âòaˆFzT½€sÀDŸÎò€1Ë(?žÅ'‰¹_ {P–Iž9ù#]8G ¥«KÓ5Pnc¤ò8æ%&G¬8›½*· C+Î9·Ùë‚·fÌÁÂxV°ð_Ãùl,|À1R |ޑܧÏW¥SÆt:KH{ ¡[—ƒ.óñZ,ãÑÏ¢×§«=\g„³ùp'`|xª€vÑ‘ZüŠ.Në;è@JÊ9L1‡T »Ûkë”ÅC;Øc³?·bä˜N3€0€060’¤Ó4ÁZbÔbÿtÜÐf0<ŒÔïÉÖ%Zßw¤þa½h&Ø  tܽìèåÈ&ïµòÊ“šeùp#- é‰l8‡að€Pøp|y^°R¬à †ɳj¨=s;Ñê|E†Ð®G’à±€Ïadi¿îçEï–«ÃçHŒ~ŽDÖ$x¾ÀF"ó@nýHÜŠ;ÀÉÓH«>έI¨lt³=CЉsP.qn¤»Æ¦=ï‚W+¤ÓnIÀ¾â°_kÌH$Û—Fâ\\gÚ•m‰^ìfÈ.‰š ÖZÀH{ùS¥Õ+(œÐ`1û ¾`™`d‹~ÆôŸ‹ÇFå¢#¹ý”‹Î•Z•çG>ø€ßæ‡Ü3€ QJ#K O°öÈW´Ò™ês׉®É 9ò“ÐI¹häì( #Kù¼•(ù’Çî’ßÈù5œO†¯õ؃?l?âùZÀÈåeŸÆ8Ñ«+_2Ï+ Àœz9ˆN1àœà¡slÀ³³YÕÐV#;ûá œï?#„®Œ&²/Q¥2ôG®?dÊ‘Iw%x Ïg쇚vÜF~é2Îaš\3X02WT]bŸÉcc»z Qá…@ͳKžr) ˆçùF«nÜaˆ ùËÊ Ð=2UC÷mÊ[4LJ‹h0faˆ(¼€ñ‚H½FƒAfù)0Ã2×àžÈìÈ-9™ëŠÕÔÍæ72×m÷Êg1ð±AØïœcgyøÆÙù|¿Ê|îò8‚F¾#£ïH¹³û€‚}@p(´,C#"žõ7{¹—h ­ä'PíÜŽÞÏÂ;ËCÍCçlu!å®±!¿}”Íð$È!›Ã¯Ýo×ðàCF;J<#»‘bH`äõSc@ìœ%¢Â¤çëªÀù Œn‘á1¤îc3†Õ ƒYç#úO¬g¢“@ùƒún¼©ïÚ°°¹¹k•úrê« Æœ0þh@Té`‰ Ÿ„¼€‘Ãц[G¹RþYÿ ?°ýB”"…RJ< ¯‡~Jw·¡’>Úã“o¹ù{ơⰾ,|ȱ-ê÷Âq…á&,FñBg4)ß2ðÎÁø6K-ÒÁµþŸS¨s$–•¹…?-ž¹etÔŒ[¾–¢Yˆ£‚VøøîF¡üqd@•Ëz~A Ölz†Û(¯m ¾¼sÎ[íÈþж6°üÎ!̬èÇ¥³!ñÑ3xÛ‡ cÞ(.†ñë2€ÌºÊ^êN¹<9“AœJð-ò¹€T…™÷ÛzÅòšCÀ °Îa¹NzÇUA(ŽRÃ/á€ÙyÀ6ƒkÞ¤?U»àý¹Ã› )›C¾Þ÷_è/iüVpÀk®Íù“,Ž´9s=J mä<޲cSC6 ‘&7J$PÐî~“>¾Ïv"$°".î–‘Š„ 퉔 j|à÷ÝÂ$£¾Ë”Ÿ°ÕQYâÃíðcáGãSàƽFŒ!ŽúÖÆÓŽšª €œhº«@@&€èy7’;ÜĘQ=X€&«>ƒáH~RÄù@,Õ­iu2F€ÈÊYÅMèà¨X›V@Â%8Ïeqë$0°SÎ".²GeyšÅ+)âæ`Ôℇå…Õ%‹™'­×7•Ëì5úÀ ¢îù ¢ÖWiTéQiõXµ|Q_4îYiðßþ€™UÓ_`†Á¨ç P6.‡`ä4ùÐU0è_íéS.4ZĨ:Í€¹óǹ²Cx(gó9Ѭá¢cõÚ0ªc©ˆá«¾ D,/Â<ª'{2ØàÓœ‡ šsxËõ*í õ†ÂB ]ÓÜ'Á £rº&£íc-Œì†¯ Xçláêj¼Â+€“õ£ˆs@Y1ÇþGˆf5êµZÛö=&c!Äu®lϨ@õ*T^,KšŒjä²A3;¨ÌÀˆŒúF¢hf$b ¬ñŽ:_²¬îáÉ–¶‹G²¼ƒñ*sD¯ ³»÷’…WS©ì”FÄ©K(|À¨kD{x Ýè×ÎZ¯8…±'ÐDø _¢VÏÃa Ã5,0ê®þÆh| m¬™p¾W0jÒÏ Ú¹9'"aìÏ€`¸ZúE0Ô9KãO¿s(t¦`áüikÉ=àF@ ˆ€U"Ç 3 ­¿~oì¬#i}EƒØ}>mwð]T{ˤ Fû|rÓ×#j)–S8†Byª½[æ…o>‰ìýÑ+æë‹˜Ÿ2òñGcHôù¬©r>g3dzÕ<$z4Žöìæh‘¦T_ß¹\'3“ÝŽ4bü~ÀM>=èS89’<=Œ\}÷õjïT1›QŽ| ½iÀv{’nǾÁ²œw Šé­†*¾ð–Á¬ÿzÕñÎÜçh¬’PFkIÒsÛº¼À‡Ûzuà$ÉÏß냊SÙÚò¼õ$4`£:*¥H€6(:=eáÌrâúå^HB¤œ7á¢H’©¾åò0Fså†jFiº Q·7²v 2÷¤—àc­›í© —* P®­0‚¡‡|Ìa@].õ\¶ˆš_>7tÃç÷óäOXn°èr8Í8”;~Ph6girm*è =bªÄxç ü§‚sÀ0€upN`Â&éilÑ Ü@ F £9#‰öÅ;Xr<²9¹B£×hÜ+V(¸B[—œQ%Áßæºþˆª€8‡á%ž?¡IŒjI ~”ZbÀ«æ©±Gû}Âæ¡¸y V»È€s¶ºŽRî°èü:hk=©ö~$‰Û¼àÑö.Î.Æ" m@ äñ;ˆEÈåýM¾ƒ¶%wüþÕ6ÐŽ¢·ÐÁÁ`]iå®@Q—“Yâ,=.k0bÑÊW±,Ý•w`pÝ5¯ó± ú’ü®£º_SäeÈÁj×6Àè= $©„æ"1j] tŠVaàŒT³mh¹ª—_I@3=Lkt¸÷’Fƒm Œ™ì€óô°¼¢qE•@i‡ÝSô蟱Ð=:¡mÄÖÓÚ&¯ w̦¶ö_ØvˆApÛvZ¤ÓH$ä³@Ä–Ó«—^zÄ–snå @9 üÑÙ·À¦ÝcFÛ•Î8z³¨í.¨{ÇúõáN Áè|Z-îâéýò8tÉå'jÀ}?Ü:µÑF'‰8Ðí^Í}býáÕÁBFïCU.®Ú~˜õáL€èxÝ^|R”3¸ÇGï‚÷!DÂ\Ñņ†÷:Ÿ]p¤H_Àyl Jb7Ü㊻pa« Ñ)Ä< qŠ¡C}Fû`D¼Î¨¢Öî€ò)~ à œƒT™`9”8Ü™,th }þÓÄÒ¹ßM,pšŒNÁ¯[ èØ$±¼ÝÁG¿ê 0º:\’b·t«Ö€K’BßçºÔ!‰‡ëÕ°‰.AZÒ_þ ¾ttÞ@¢RZg>ÍÑwPÁ«|-À«!x¯CDDÐèî¼€ #‚)k¥²Óz²ªÚ3 $Šr²#á]jA2ÿ/Ÿ´z}Ø Ôv6îR]>öyKqæ H„ÝfPYl[ ´ë,v…“‘޲Ķ1ò+#Œf­7ȶ‰ÐVWÝ™1ÊG/7Î]V¥yc°í¸Ú<0¢D8ŸÈŒµ Œr%ÇÚáLZsSÞ#TØ7švL0ŒZNÜeaPY 0eŒJk¯}c Xà–b}3F¥ ”Î9yÑSå ¯tÝ1k϶׺ڗW¹Äj<1ž<ˆÀqu€ƒCwûˆ …VzŒÀ_€µ­_2*ÆðLOCjüö8½1ú+^Æú‡+3c\K³ÕÈP° (§çà"Æè.òa`Œþ"{à( ƒÀ˜ÂLj¨T ÕŽñ?€ã(»¶O¨´Ë h€1FL µÕ£¡€*ðSh¬:æb ü I³³7ä[7™Ñø,ÝL‰hHñ¸ÂlYÌ_Ô^À0c ’‡a ˜ÏlL.€Ãi‘ˆL½.³®ê½'%´f¬p‹@¬5òÍÚ»‡Öøuš½@ö à 8Q—4³Ï0%ÆIŒý ©Sä]$å¦àÓ‹APÄã i| ÂÎŽ±Ì¼AßåØ2±‹MäOz+Y22cDEgÚcÞœÖ$ïe.ìO½n•qd¿ø¬Û8fò•ìaoY žö€ ó¥©(1<`@^(PC$ÿ’Ýe¾ Mc†]€áëÆ¢ÐÔˆ 0`€:Ñ]*€âvx ÀÎ1šÌ¨§‘#š¡Pm=Ò(ÎxFø‰Ñ»úüLÐöצ¤s fˆpÕó£5 CP`0,М ˆ½riˆQÖ-êÛïô ” 1¯ªœÌa 8ˆÛU¾P~w}pc†%Mré®Q®V•Gg›³µLvÿ"µjQÜ߇•Œ€³½CÖ4· üOƒyü40Ífú‹¢NAQŽ…íBÙÖÀ˜aVE Œ—Ö°-ñLçÒz'y ÀœÃ½ñ)ªY‚þÆ µy$ûloÕyÍúÒoÖ4fž®ïvý࢞5d0À€Ç`Æ 3 J­?ËÝMx ðù¦É[hÌ€ú¨ù„K´Ã”¯CõÓÛKô'*ÙPôSp’Ãù¦¶‘‹ ”µßÇ|2ú Îa¸ùƒ×ÉjÔ+oA‹i3CXQ@ªôú&wÞ\±v "ÌY0æzˆ<Ýo¢ ŸÆ'xјMÁ‰ 0™Ž¹Âü3I´—Åí(ºÃ°8†¦… [¢+Ê ÉGnQ+>Í ¼¥ÝoJl“; i#€Ó iR`&PÞÇ$áqÍ•4ãª%&¦Ë¤NAy%o?QZŒö`»KÙåÄÇ„C#’ÖlO4Øøˆ@ÔÀXéju ˜‘µJ“À§´DÙqyÞçÀ€KK]‚>¥#˜dÎ…íÒÑÊÝíE+[Ô©È9+GÔ)RGÀ \ÍxWA‡4Š«( åᦲÑʳÑDZa†«˜4´ …0€œƒsS„uÜÒ>¤#’Ò|ÑòAº·çþOþ^Ÿ…Tû±ÄûN,’ò–Z¿¸xîÿgõ!J§ÊW€ëA_‹CN°©±Š…}#åÿ¶ÉG×2ùhý/ZCCéŸ_í'YÒß)±­7Šç0L#½pÑ ‰?Î4»‡ý %}IàÒÑY’ ë2ã«?b7 ç>1À$ àœ³2ã—¹Eç{÷í7… Ùo=dÀQ m,¦€æK5N¯!ç#€|qc9÷aTg{âÆÅáá®õs‡àÄnÅ ™üñ;cbȈ0ý?hRX3tÆÎ=§Xê!ܯÜ/ Kpá Ôg,¯' aë­Âr~w(aDt]¿Åð”p#.Ž’×# ùìåʬd°‚Û,N¬[÷Uô·ÌˆÞš#È‚¸æzA–ë ¡ókÉ–™ü½©)lIœÆò˜HÆ|7лK—ôíêÎØœÐnX˜ƒø·ˆô„±/îà ä+vÈ Ùs³Ø¿ò%îñF-Ÿ`ì¾Dâ ôþš¶n]«Ñ¸Çþ…ä·Y z*ÀëwAM2œ‹p{†­r-‰Чˆ·2 "PiD„Û3ªy̨¼¸ö~…'Ü17ökâÁ9'®êžîº&”Þ>ªøà à p[4•5°Î¡Ë»£¯køOþ攦èîY+"€ípçTêI÷[Ð`Ÿ×0”Ä<…a„l¾÷KÐI4v3ÒøÓ|`¨sÅxZTc÷ËÙ?‘Ô4a&°˜7³o@h˜À0ñ‹°»œ³%<ž½pñOäÍUo ,Í+ÀžŒ2 ›¨8Ï Ï3¬óÀü„L¦©N¦þçv3ˆsm†,AF+ì€ c¦'ûh&Že‰ P ƒ‰Ÿ€@‡Þ*p„*KÆ{þ !³UVds ld`È€ItQ“æ©™ÜCKÕ¼=70“‰mu‡ðA!=¿Ç(|´‰*áç‘cÀ —G@8‡ÊQ(˜Õª©óIà® –rq™üÑK$âD=Ï Ì€™ÂËLÔ®1*³yÝj45kJå4ÜŽ˜°eçàÕ<”Ççƒߪâ]EwÛäÜV~6Ö=Å0S Ö½®²l’Á36‡.ŒRxwÄáËF;0pE\N¸"ç 3`IµC®_ß0"³(þLs3w:;ÞåªÝ O­È83ú­¸Béñ‚ ´ê×óðì@Ÿ‡§ØMÀLÀœƒ$¶Iè*ÆÈE¸ætmEÀÂ@/×ò™˜)E¹~ÿÀ¨Oq?#¾øÎèà‡çd&Ë•™‰8ѧd*À@ãò™xã‰a]Ž·4‘°?/RÀ^…Aj&Ö*~k&}"ë»A‹×ãQnŸ@$˜)â¢%n0©Ùo†ã¦9tF3@0 `ÚxÍýa°Òª ù>±Í¶s&Ú×h{þf`¬`fUT9L ßÝÍ8s*ÜB9æCnA¢Ê¹ð« ”µXÍœ, ë’L]pŒni±3ßöéñýQË“M3g®š@!`«çìÓ¸Ó°6¾ó*ÛÚVÎWœ••’W`Tù,š$ £™Ø-©ê ˆð3?q0çœ$ ÏüY”DD)e–™åOÑhf¾"ëÌLZ<Rp4W1Ä|^p6ÓÀ.]ŠÙ1êáœÙã¨ÚýDÂDˆý¹Š‘•½¯õéQe+Íâ7Xfæ´RCœ(dÀòhOŸº©*]&äñºž¯xjKŒ–šH©œÀ(8§2ç”3}k2·Ö·Ô$š@`çqæËEƸ=¼Rl<f¸àhPb-‰è"®gî/yf9 ¯wôjV¤ sÀ[u %q¹,Ö8˜™ãHÝvƒ„Qíçª020³£JO Ì¥¾+#“Ãd„¤™™eNª¡{´óÎÀÌé¾_ èÌ\#ŽØI®ïb ƒgôwÝ€-g*8 x4 ÍLçô­N3˜O FÌ<=üðl^àå&Oæ=.é±M©Gບ9àY6é…û1g&ôFº)‚…­OuSã¼ÊçÈ€¦ÔJ,`âï퇅>G”8‘gE¤šHD›ù‰ØWdÚ•®ßßÝù'oÒy¨=¹ê3sÑKFˆÀ&ÏÊoª+Qfk<œW |h3G4´Àpîwv!cäí±œ„׸J Ðúw´w¸Ì,RA|á,Ùvyú¸³äåœ^b²C^F€×«m†õy›ŽÐ ç!À³D)º"ÃÍ<så=d–@uc2›š&±=Ì»4W0gà’,A5M"æ”à¤[Ó$©ú’-pÁ$Mª¡—ü¢p?ä—"EØš?¥Î'ÅÏ`×pèlû¨Ê€¤sMûErØ9K~Úîvõ¸ÍâÖ>"Ý’ ìf³<Φ}¡Âõ,BøGZ"-,ã ñ˜pFžƒ[ƒ&€ faËÎuÄ‚q!‰RÀÔñ (¬e åw RV‹MHÖ3òô¥P|P‚ù1‘ ©* 5-pD¤"±w°.Ó´…ií °ÝX+…ôÈøŽXœñ4”Fñ%Úuf ¨hF¤EñÆ(]U¬'’fQf¸ŽÛÝOì5 ùeÙwušU•‰Qœï¦…âS¼ê/ >¦êÍÂÂ^¯e–H%àÑö1×P| K~Nð® ·ëDŠÇ”^‰ªvÀ"^i–€Š¦¦¿ÃãÃïÓÀ'ðfñª ö<‹£E3^‰Óz¿X‚ÃrPÖ¾ÙèùŽQUß±û @›£<ŸLˆYHŽ÷SúRcW&!>ÄøÍêƒDº ƒ wâ9Ð2P¸x¼Û,\qÛ-èÓq¤®°0XL …{ ²a €~‹oV%Ò™Á¼¢=C{ãõ‚TRc΋;ëºÀÜÍꡘ³zp­JWäÓ¬w¶§B´š¨0ëžF nÀ1}YözáxJàLšû|¦†*\%jç„ÕibŸO¤³œ¥t+­ý¼5kEX¯Àe¢F¬Ø..ÓÓ¬.BOrûýjVôóÇ£ 4Ò¬/q[õ’ ˆÑž8€ ì#°$3M¹²xoC53ÒtU_½ÄðÈ‹©X÷`¡à ÈN8FgÄ9µ œ„Z _ö¬4h¹ctÒÂR#PmäËnÔ²®¿ÆRHîçP«u é1ë‹E õˆCŽÃwÍY˜`ë³~¶ŽI¾'e8êÝ•;§‡$¢ï'Òø=KµŠôŠBŸ,/÷÷ùÞïüÐY¹Å"ß“è ;1X7«‡HOÀÌJn£¥Ì8`ÕC¤gå —óË/¹ 0^ÏÎì<—I˜‰åÅ ÏžËY=P6ÂÛ9†³ya t©îØð‹]™“«wÖ£»TÅß„fœ'÷mÔ'iVæŒØwsžœÉ.d‡Á¢¯@0ÄÑH‚ö#»€ÏF˜Î ìƒ Pƒ x‚s ×êÂlW`4!}ê:ÝìÀ³E]—âx®Ô7Á®KwþGêZCˆí|™LÍ¿’G‰p³ìéeÈøÓl¯ä ès xÖOà!ížËMfØÙEfsfÃÏ6_'ĽPl±^Aæb;‘×(Lž ÿ&òS/ô|‰‡}Òþ'ò©0ûŽš¡°½f4žqÁù³}lÖmÑ0ȃ XƒÙ¸œÙÐf[~01M÷²D±€U§ŠÇÙöƒ8<+p>Šâ@ 8:´Ú‹ }»ñÓl^ƒ`6’¹mÀ;¸ ³1_DÌB\–nQÈN ïFêDdy'e49öä½Àì¤Ù¤8’;¼(v¯µF]cöPhÔ!–¢ý%¶4oŸ÷[ ÍjÁìù ´™[ç¥Q‚ô\ð@³³ØZ2=ÿ"ÐföüÚLL‹VÈœmž…9d®ùE Í{Ǩvˆ±K5ûáæ‚Ÿaö˃S<Ì|Bž›ý•,,0,`öŽ}%“#ÆéÃq×¹HÇ1áä›Pì&2ýÏÁ“d‘ëBŒÄè‚;/JdN ̶­gFÿ(tArQÝì§Fø¢¡Õ¯FX$£Ïî¼g`Ê@—(ͶkȲƒÔ'—sˆ°†ìJ÷„Ÿí#5mv)ŠFÞÖát‚´9!YÙ7”âÙ£€‘äY½¼Šþ1mDÞê(±.E 8³‡: „Ù÷HTu/Š_|&€æ•0¿õí=Ä–œ="Ó°ù ‚oMƒÍ¹Æ"ÏÄé|9_Jà+O@³¿…Ga÷E­üÎêÅï,€“t&|N$ÎÎnþ$O¹b+ggRM‰!‘"Œp}4‡ 8² c¦» ƒR¤’·GöpVš<>… œ· &  & aç@srž§•>å"áwÕ$õ,BÝÐÁ9ÜDcÀ‰IËÝÈ¡±÷öÃ"0ÇõÖ0ŠýepE_¼tý€ÞWl[ÒçÁ¤±ò¾5ü$ãÊg…uîò‚I™hà Ìá: B"V‰ý>~ˆž˜äs îŒî98( Ñƒ\ÆB/èê«ö!ž£äÊD*ú¼Rßu׋ãŠ6ЛišžJŸÎȸF Tè»§Ð3/ÒÈXîâöÇ æÖ{¯Ð^ }Ћu¤¥×W­Æ\À‘õѤÍц¿Lp£Ý²H—h›V¤9ÈeB‚A<ïO Fôix^.îÁÃ80Täê£÷_H0gLÜ3<¿@$˜«HX“k5„Z3½@ ¯ópjzéM’EƒÕŠñÉ›ƒ+a„„@ƒ Œ‚s`=8ˆXs Ћ0‡2—Ìû“ùÒhó ãeb¤å‡1|ôrIXp÷ßm^Åм°ÄRà-(ù†~ÌAº3×+!˜ý<¬EBñ+ÿ°ÒÜ‘oƒ¨0/–ƒR$††õuçx2·ÔiÕ¼Þ"£4*9þóCÞ.Á9x°3 m’$;uìjDƒW"K¼€ î»s Þ P„ kÆ9ÁŸÈ¸µp>»"QïR9dAWFÂùž÷©qÈ—–“Ÿ ‰‰<þ9CËAšüœ)|²¬Ãr# •[Ö!·›.ÀûÙh˜wÓúQOŽnÍæ™/ËöÀ¬€mS·ŠÁ`©öç@9’õE >Ù†¨ŒÐ¤°®S*€ ÌéyvÈ9äiúW4wzÄ;$ý3àÅn†7cFuŽÊ³/v9­3³–^ÍÏ!añ+5|N)ý¬’Yø Šw=8Ÿ1n…—# l"bΈ@úÑœ5Ðj륄[¦eŠH'Øfæt˃y®L¯ÉPíkï±jݺÖµã­×œ§dvâõ>xX&«©`©`à–O”ˆX®²ãƒ"ˆAfFÁ¦Î\%¾çY¼Eã~è~!âØCšÏŒ÷¶>–'”šÙÅÖ–Ô7y~§¬Ås˜J' &`Î;@ 3"hÒÕØ`—»êŠœëp‡[ÒOêUt¶—[p˜¨&zîöÀœÄ®¥-@ÂaÄDè:¡{®Z†õø„î¹òÅç$ø¨ãLZÛçx­)—‡˜‹NMhÓ AÙ\\B{¤ ÓÅ@Ì9û+ ó~ZP1™—z÷”Æ4Ûú+sÈdõÇ0‡Ìu• 3¢•D·u³ÚN|130§cŒò£·U±øÃ/Šˆ³Óe¹ài0|°Çàø¡³†3@޳†3@kÚÜwðŠÅÁ•èéîoOñÜMüsä™ @O@ ü°ûLJšS ¶ÆßúøÑéy{>30W0ÆÙâ°—D0Ñä^_ô!isW™¶:£ÕŠC¤e"¡8òáĶvë“*”!i;ŒR½YÆ ^b‚@_c±°¥¶'á7S060—ÄèÁLßÛ£V"¿{^&c—ñ i]s=•,$»\ —5þ^: ´€s(¯$è‚ ”> /\|…c§ÏÀRˆû®ºÀ{C›!BnÄ©‘9äà ¨¹^ BÁi›27Üþž`N ,ì €sˆˆð@€g`ó\aš¢ßç-Ž;60]`]`ÊPV>žò‡GߪÎv™û'vU{+ð§@P0°kT %G ñŽ]{Éï_±ÎO–/}=Ÿ†ÍÔ vñn$°5ÐId0a•›À$˜ÀÀk7~Ÿ”RŽÝ‡¤®+R‘æú«@ ׫ÇÜ‚¨.g@’DÛJ¬…»=\´Æ#ßPJC _h®/„sý¡®z=­kxÚ¾˜!?PiÊ9Wɸ͘©6n`[thO`#LfðÈàœ-_C@¬?­5m‡™9ómÏ×lWï¾CöTè8kR§ZÄ÷./ý`Š£F&Ôì‰ÿ ‚óƒ&z0m q¦ñ‚Ëñß'€"æs¦HzÇÆf=o0—G ˜_" ¦á\˳•w2´P´³_1¶Ðh&æm®êW_)ÚbTO´À§Á9úçàÁ’tp©ç’N–µ_·ßòr¹“øé5¥2éð¼Çö;0•‰ ¬s¶š?–¥Bt…3Íp‡ŒÉw;´t˜Ü®*"s“>wã_êÈ9ì×V°¹¹=.ZêI 7°ªíÆ­(s»]M,LW, ‰·Á3Ò EU»D.X¤<ÞÉœtµ‚mhîo=Ãè^&¯]Þ®sÓš†`!Ì­œ&³Åþ}×¢Ÿ€´8gé ùV«‰Qêû;¡MEµh  Ìý€æN@œs¿€‡>g‹_U³€ZâñgÙBêaç².Ï?¢È˜ðÿ +4Kpôã0n|»G¤¸í±j”Z ˆ$è»\È›kͱ<'©ån&ëaió ¦Öçkm´yã±¹[¸r`©nîÒ˜›F¶0ÎcñOƒèR:îB9š@˜ûZñ`B0üÞ(F¨Ó0ŸèÁ¥…ùûk¯‘¼1š;ð)%šà§o¨´jÎÀ ¸+v0|6½‰²@"8‡öTܘ óçÐï^2tù²ÝUÖTíî†ý|fqlx_¶&¬Só ŽÐlŸ½‚£fÏh¨àd,Á©Œûp°ù=\¶LJÛQôS²¹ÜÔË襹§{Á#¬#Áªö9¼ ôí"GŒM/=(—ïüŽö/ÈbI9}‡e=k‰Û$>Gû܇vxàè²Ä ý¹`2QyoˆL‚t•ÿÂ`ϽCÐ$4{˜Ý7GaG/÷…¢¤Ÿeuýz<úA”Õ.]@øÀX=ç ¶QÕ›ˆiŸx7ÆÚ;Xð9Ê=Ðç±j @=Š\°ô$ChtìIššGó/dó¯äªÃ~½Wjrú“Z8†UAòÚK0=¿cI.lÔô‚Ì%˜“³|E­$Dhx¯¤tÈ«FcIà¤ñÀ•Ug°`ÄGͳbŽ]@X¯°°Å~ÕlŽÄQ¿€.ðQàn!lüÜ1¿P¿dà@ÐLßË00 ¿…wó"½¬pºR} m3 kœŸ*—79?ðÒT‡XºR½,ªí“f!ã_ÓŸÔâ…e¿€;àöžªØ0º»é¤ wÕüÀJí²"ñ»÷Rjª&‚¼Wòªðtû¸oÙЕf†—•¸šÚ›Þ´`@ZÉC'ØÀ³€5pÁƬÔQ¡t% n¾Y€,Xæjã*¯<¡´’d’·©t¥°õP‘j4%Þ<ĉÌ+_È笗¤X)`Õ$,ù­ò2ëÇT>nØéo–âù !båµ#³<ˆIÓ™ô¥­ä¾ñ„µVç[£k¤`%†³Ñf¹`T]ÉùÏ‚Çt¥à?ñV þ#QaºÅ>Xi^e4à±Ò$M‹šÆ tlOF}~”“@"®‘uÏÝ ümçSÿ’>Öʸ `êLöÁJ‹§wyr¸x˜BIC¥‹•¢<[f^Õ쳩ûÊÉÒUœÍŸsa,‚ 1ûªº¶ vÄ¢ÁgånÂû-&L+ßuÞ½?Dlµ,¾"××O„¸À%»êüÞ#œYÛCßsàƒqa!öüæëŒ]F .píW1¦­ì 3«a¸`dOÒÞ9lì·[ë…Zð @ î}ö‡ ópÜ•C'*_‰hBbØÞ0CœWv é •þ.ÅÕ=‘ˆÁºWVüŠÀÊåÚÔý“—žŸy.r¶#•/.˜Ÿp†ìÝŽç3^ )>n‹\3¢À…7 q\`eçBôx]©Ë4ðß/®u¥3u±·|(? pç ®ÔÒ'ª¯÷-°W~`Á¾¿>°J°`e¾û•\Bªîñb+k­?¶‰+jå¦b¯}Á²¿%ÜïëEMêCze»[r?ʲ¤ß¿ÅÈ–›¢AÁ_ÃÒJÁÊ œ^GX€=X¨n|Z¾2Eú’I aqY™°7×[w6>Üòà`.$ý÷€¡ï*ǹ€G°òKó´L‡ìþ¡þºëwª]*'O < Ö ç°ø–ƒ'°"Çv. ”…•µbŒýt”å( \ƒ|Ã8ºH5ZH*¼¥bº,gÈ$4l^÷ê.8Î’5O"„†CÒ.Jjy¹t…´òº Ã}Ég¯^9œ=Ô£"•èü„G{Ù¬•×/R‰À VvgÏ97R‰VÞ醌á|´V˽Æú ÅfåýNQœbâÇ^Õ¨Eü S${¾²P  L¢ ç$î¢UŽ“/¶7ÒP¥÷×½cxo ŠƒUˆò©YW¥ÃÎ;.k¿»މÖ·i`½Uaâ¦R•\ð§,È' Š 30%ÈÍ\%›¥uÁã·— ×tÁvdÖGfÞüì))3)«¼Ò ÜŒçœS"fÚ*„›y£Éú Ý<4¸,„·/èáç@”vºUf$½"bg~H'K‰’ÞʼX"n÷©gàÙ$á4qÂjâ¨3•+cç ý£ïcÏw訄°a¦Áò !IuÌáZ"økVp´!`eÑп̑émeK<›Ý:]wÉ4ph.¸0ÒŸW 7Ƈ%da8š[BÈÊd@®¤aB“+¯ß½&®Á9—ï·4 ç€àF ›gn‚îZ0V¹´àf¬ZÏÙ·Ðz´ÖUTëHN²L"c@ ¨JÑÌ$æ1s“X”ø`—"®„ðÂW®s©BÜ¢Áe• —À(X7A¹*á‘"7µi¤ôz×ódiLò_(´ b¦X[ ᚤ˜W8~Ûà;¸ej Ræ|d&à‰¥ŠOm{7ПUê<µ÷'R•^Ù% ‰ù¿3ü~]å4Â’ˆò9P9ƒê¼j ·ü@¼,@p?Z/z“Ò×¢¥ïG@tW¥Eä©*°€ap~ÈC Á‘ÂTÁ9<&ÀÊ"/>_^„·`QPFÀ÷‘6¥Ñ B`*›‰±ý3:aUæÍ´ì[»MD\À§a2Ð9ÐÓ3ÿBÊB>Æ9Ð"ƒLýe0 ¨‡†8”9»xcåC™ËŽ »kWàYÝ ´*Ó¯]u^@(è5²sß3*R#Û£‡zµ˜»‚±²Œ@{Ê, °«±ïúY.èñ‚ªûƮʭO«ÛB‚Ùdæàœ•8¦1y|BŠòÕ¸ì¦e Õi†Ý(­X à(õ#¤Á úµ¦ñ¡íWÖ¾›E%åá£2½Ê¶à ÍEËCÇÀA⨎ѿª°‰oK· ¾ ’@IN«C¶œX,,ˆX ¾ÏÞú6¦Ûw‹çÁŒzw— éç-ñ‚¸0xÔÛý°7ÑʶN°jdŒBØú(½P°T@gmáì‚÷ÔMkäéU· è•õGöc rlo±û")ä€û±iI6x÷‚€Ÿ èZ@,èØç«nÕs»„Zöäö"ÓjÁ{D‹½B¡.F´ÀoWs¥Ò®\.äŒËŽ4œÕ’¥¶.¬¦¥¨1!sµò¦±>d®‚»Bs!šß•r±`ÑX†µŠ§ü*itµ7itþ`µH]Ȉ_í£‘°I–b_@&øÖÐ ~22@h‘ùÞú[D_?ý¸‹&iî0`¬æe©…‰¶(K-æj‹å’ñámJ-±Ò:û‰¥Ù´ ‘xλ®Ž5©¸+@)J„Q1‡àt¸A3ƒÛ?#X]*ØPql/Ç“—©žÝª˜Æ¤™À*¸2JXˆæSGdû9x¼ài wBE:ÅრÒÜÔBnOõT<ílp5§ô4‹;\—?ƒÐÖ­›bæQŠ ñ‘«õ#¾n“ G$ÚnÁƒN ÑËQ«Ëû*вVÀX~¿Ÿ'ÝnPäð]*è¿|‡¥E<Á ç²€! %Å$•äƒxƒs±ìüûFÂv—\]fƒhǪÅ׊lÚ ZºõÇiŠ“ÎÏåf ¾G•ZÏamWþÎô»Õ¤Lè»jË&Õ|Ó«qiN^¾Ü]>áã¯ñ‡Øß"Mƒl/B èÖ^í¢~Ë,,x$¨[ý ^@C8gƒÙ·z!Tì-‹ÈÛÃÆt«/õe¥št¹9³õ… §IUÕfÊVÑ—#÷’y®€+±Ü|MéPŽ>Ì­CöÎÞ{—³¹ùâ )VºŽc0ñÝàužîøu›|°ÅêÑ£n"­©O@>·ºß,@¬žŒ›v»„E8#< Ô$«Hf]0˜,‹Kd_7¾×‡É4ÚzöÍ¢HÁdŒ?ÂÉp–Å¡X`×gÉÔÕ¥ 5ÅÎÁ¹?ðÒ«—ü“‰ZvFÂÕ²+èÌÅü ¬x|IÈ/Rí’„2Òhh>ëì&yM°VpY °"„¶ÖÚwçç*Q6Æh°ú`»¦ËY×Ç;{á1} Ûx·QNË ;lõúhŽ Ž¿»Ðxð‚ `¡:škwmüŪ˗Z¤‚aáçwTëDy<ZKE"E€1ðI¨!¯Þ‡_&÷šÇ[ÁÏÄÒ‹ËçÖkÿ!«à®Dk`ç³Å½I9=dßä4äðgl`ÐG;˜H§Ñ*  ¸Èûz58Älq«( ;ÄÌþ!t¶Éض…äÌ…às/# ÎçXŽp€õymzîX©iÆè#ä’y°„î žœ\‹©Zë‡6ftÔ¸|{׳œ} pØêœ(†5p[Zhìîj]ÊSD07òTXÞpõín(À ,„܈1"}÷LÎø•…~ês«ï•Õ ye-Џ%Ë ½Féüì÷‘¯,Gâ¿FS˜H–d¾-  , , œƒ€Àeb£„åã'ï;—^¬”5’`]4àb&ã4p«ß•x³I_J=2ø×pÏŽü>=p!Ý…« –ÁäﳑÔ+Ã6À²”ó4Z3_9ï+¨˜Ž¤Q8Mƒ‰/,1Õ¤,`  Ñ] 0æƒ, r Ï&±:WªAC¼}ˆYX‘À¶~Q…~!Tnˆl#öÍkú°,†¼‹Æ@ 0ˆÀ YC<ð À¨º ¶€€_•¾“!2ðBæ¾[,îˆñ–,øëû|EWDi®Ñ§Ĝ¹Ö«Çà‚{1Ñ*ßBƒ²ÉGëfd…ÌðS7 Á9L« Ù«“šEì‚úÁÝG@1–ð²ë°âÃð‚:ï´zìÝ¥©¾ÕÇ/z- ôш”tÚÏyçÝ}ÍÀeXZàºðÞÍ•ŸèñEÄ‚â“IsnXÑЬmAB³Æ•ÑÃBá뉰V°¶Åø¨9ŒPû`¿‘ZcÊr¿€ŒrèžTå Uc¸×W(Üpg$1¶´:ûkÜóStÖ1#<“±àQ]CÜ<èë9DQÒÚo í5–æ°—Lð¸Ã²‘Ô¹FÔÕ‘M¢B¿nQ¼k¼Áb®£Q‹Ñæk¸©RPo¯¨?klÓûþþˆl\„¯Ìð\Cú‡Opòýt›…רV°ËNñ|€[/ÖàBnú9,»ÞÃúôû§æ P‚s ÍW€ Î):îÖºaàÍ/÷8ú{£”¨…Ó£éÄ\v 9à.ìó8ƒ5/ü¨ÄXXß3çØV¬ó‡c¸É¯ð }n¤,®I ³E1â¶LÑdlûUb‰~è+’ `J+(å ÁšQ-L$ÆÆAŠJ;5†Ášå–ª%nHlÝìðšå‡ÁkÁ( 4S’‡û¾”°K¿i°¦ÄSvaÍbNV¯¼«ô"ŠgpÁšŒ4öz~²­ IòŽáj³Ëõ=RÀºJkAse. ?Ïê)f4 ©Uxb”>båIp˜,94Á?I op~ÊÖ«¶}ì-ùØMªHù_³}øE'Ü9_€EYù°àÀ€ÓXf 7†a) ˜}E\,”Ðê5¹3ùè¦vý\8äÞ¸Áš½ÅèÕÇ =iR«.¬"‰lÍþ!Y³à6¾à‘,渢›¼‚ÒGNçš´­yž4] ŠÁ½€h°¦«9,D¡ôž¶Á ßXéN :Y¨z`W·èdAŒ¹*ÄÑ™,)€!Xóu¯õàœ#õ…ú³=²xÎïoÎØÀÁ9PqDFК3QYȢǘK]äwS¸ËÞNS×q1©_» Xs™ÝEŸ¤œ¢ª$£bû#¹0©wÍÀv¢Hy4 ûü†IPy$Ñ‘0¶€c°æ£H’¹*C£F}àô%>jŠß ¸ Pk’ ‰cr*#®Ðç»ë¶„kŠZkn« ¥„ƒXW9nÁ&Ù‚¡y­t“ñsÍ=0ÎAºHp-Ú½(Û¶I@ ÛUw;ùzŠFÓçMÊŸÅ+EY™hÞË|0ƒÿQr!ùØ?¨œ  kIø4Ìxçó›Ã~>%¹^ž£°€*0z¸ 5:ç; ê)Ý] lõZáä«eÑ—ö\?h‚@!Ÿ‹Þ"¨`že,}´ãr—¯@*°Fó¨u PÉÂ(­R§{úFàÂ÷O)èçðäškè½xB–Çi2fïS~pÁ90XˆlÈkq`˜5ºÄ½–g.à5¬èŸ ðkúçÌËZþ¹€2³Ö‹þyA–w ÍXHEál¡Û¼ûÏYË9“> ÂýÁüþKSãðb]Œ…årÑt/±§sÑyûåü(í-µe/%°kE©w$Ò!)‹Õ#sãÐ>­ LÉ~­që™Ä‹T†Òi•Znµ€bp²Áé°°àÀ ð¹ó ßÔ ( SƒH++ jH™ú(¾¹–”ch®d,v…Qi˜âBÛ¡íb­ˆ¾§Ua{Z¶¸¥v,O¡E)JšÒ$ƒµß˜£ÂxñÐmIǹ·ã‚=ã^<ÃoÃ9ˆ!‰úl{|Úk{UÉÛ?#§áSpáVÄ…<ÿ†ð‘…xÖÓ8Õ/èkæYb¥—Ð $ƒµc!É`]¸¨Øcá7d O@Ë*J¥ÓðywmÇÈYË×vEI™^“ WeÁB» !¤l—Nþœ—x&ŒÓ´ñ™.s»P³E˜Ú sÿG4ð—à,ä ² ,àð3^ ºr‹°Ñµuûp»lž‡°=Ö¾œ9ø˜ïÊMÉÓpÉÁöÇh4q};IỤ́ƞٌacâÓ´½=°öUó€a¤Á6BÛ»Óm!ÚhívïrÙ?’˜'vŒÝ»ÀgȃàwåI1½ÿ´Þì^8º0zaÖàhUg&Áv$Pö%‚{gâgÅj-ö¶¶¸tÒý‚æ¤Q“`º{¼sŽˆ‚=²õúÇïÃÝw¼]ÚRÒ <©w±”Åhû,tµvHÞXWÀÂä½x+÷.{UÅ~XlÉ)ÏUÔ·€â=œ(3cðƒE­‹Â|Žä¿XÀQå÷€˜ßo:VkH^³]°vÔÖÙ¬g¡£04Ü<xk¯Çâû!N¯m l …ÆÄyã©( ð‘m¾¹µhg^›Û @ ÎaÓö³ÒcÞRûàqìíâáTÁGŒšæLÙF¤µž)JËÚG™ßŒs˜7›hEð ¶D®ÝsµSryc!mHwøyßó#íöæeQ†™ü.än– 7¾ÀNau O2Öä>Á UÃÈ6¼‚‰‡;;\ÃGFÛ±BP„'ÕᇀP¦ë3|~j·kôj›9mâÛxˆ6dë"Á ±:ì…²·ÓUnç5°!4I‹’Ò².˜”6×§SÆàûÓy歷2îŠL#ú±F:oñ“w2£ÞªcMxm· <†ó=X(!`Fà¶èËsy¨6\†þñÆOIBü8›(OãÄG©ù ü‚-Hb-{«vPÔ#OfŽÍÀ8 Á†}i'i¹›iåBh`=ø®ŠnìÜNtYG‘ Žöp1èEÂgªÌÎéIú07lB ]»Rƒ†O±ÙTóÃÿ·Éè$ôguïF6 Þ Z»r©7à vÖŦü½YBœfíì¾¥M6lSæ ËUÊ7r2$hnìÇ ¼‘(}‹‹sõ€…Rhž·VÈXÁ9pË?aý`Òàœ-f ºÐY6á†| å‚‹3"ósgO¤ æXáMŒGWpû¹”yè5ž‚F)‡j_½²¸2nŠØ ^Ç÷W<ßK l`ì\ï^ÒœŸ~Z6° ¶% q Ø€³Ç êŽ#Ü]:ЧCš†ãîFàsϺà~5xÎ~”`g0èÎí*`wYÑÎ …;–ðÏS¶˜‰þÅ9ñmšîqcçn3%q ¢t~zV©pÐìV:rš7Æ*ÁYíc±}¼‰] Öî.Eœ ‰T˜=¬ Á êeî,â4Ôö­1]:ùܨîßáÆù¨ä·J ÀðyÈÔRϧÉé˜TW~’„Ú#èÌy°½ ¦=²¸J;À.Ø7Àë‰ä!ÕÕ6\©ŸÒ B9ÏÈè#é¡áäŸÙË[ÆŒ5¬·d>íLµdûýñ›hë±q9õ$¦rP–±ü00à#0r°àõÍI1ÁŸò’!$mp¤‚ ̇–zcçíÓ áþ iï“›Ä-mV1DÆ °…s½úk\v§ÏC±ìbŒŒÇRÐýÐê;AôÞ鿯ÀG(ÑF(Ò9»ÿçï Á™œr—³6ˆÃ9Ð.„h´~‹Ÿð  ;# S ½Æ’Ú%²DW»zm+ýÎÛ0+ŸC±ßi¸A—¼¶PØw¡ž£õ±]£&¯þÞpà{Jas&wpðIl’±Ñü;2ˆÐ;"%˜éù½ID“’sØ"7(ÏMO.EøJ¹‹ÉÙÛ‚4\àR°éûÜ%²tÀêv¤ªñÖ]®p‚Ò?±Ù7SÙŽxõˆVª±àefýúan SûFîýÆ’?nȨç³o€4ìò¢w$Õô |MÇaï Žø&go)œƒ°¡jû.S𥑥—Z¾K„Ьuº$vÛml,Äz™P60¶É`x׆CÏ/«2Â.ÎlÔ;Ìy|³Üá7ýN¾Þð†lsÒò¿LÙå )ØH»Û%‚Ø6R¢·C€fm AQó„/PFÏWÐçrKÌûWà|+#sýv@ýQcà†»{—ǰ!xÚ-ðv l–„û¸ïšÅÂÒÈP>y1’±ïmZHaHÁFÜå.nm‰ De1”HåîœÓ7ÜUŽz%î°@î„NRáQ"a¡»¬Øê íÉÝñæ`]®šñÔp-§Gå+;E~@[¾¥kJ ôFšÍ9D ª”AàÂGÈ.‘íǘo>Xæâõb(e Á\¼"Òÿץ˜|Ü Ýô5ýTêbpõ±ž º„6rcF0ý½â‡ñK~óK£ÝÚ¿¸Ø ¼‚mê²E‚\‚(æÕÀ­ ´ä%EÁ¶«çýPŸÿ@ÔÛ&è}®GÊ: ˆGËÕòÁ¾*˼7VST<¡·þѲ1NçSÿ†Åa#ù}CòÞ•%6ÐvõÒç6h‚¦õ`#šn 4ÃTK²Útyÿÿûº²lËUùŸ£¸C0hæ?±B öyUë7·Œu¡Ò„Ò2S©f r!Ž6Kq½Ecn›ž±âŧÌ4øºsàF¼\â\ÉV3ðþj')ÓÁTjƒÕ0‘T‹r#UF"ú$ŠîާÞãÁåKwb¼¼$ººÈÖßâ×o‚Ÿ0Û ÍœíPs7y°\N…pE'¾| Ç©—¿î )¸«‡u”4Ò²c6qaÈUŸ3Ÿe×Å,x±q+§2"¬£bo7Ú2˜HÖ‹h„ ¾Ne#h‡ÆþH„ôìÕÍT.ë¨eÌÀP@:´ÛŸŽqTÔ§2!†=?ô~øú ÀMÀ”ó  (ÁÜ E”'¾2ÁÈv詤³V•7¨ðµÕn+Oáhó”Õ!UÉW'i@$" ÷¬¹©r~†ú»=_¨¼©D3ÐkèõÂ'iÚošuÛÈÍ8é ý*&}ƒ^¦?áúu=½¡ÊK𠉦†«—)¦䩜SeÄ:š }í¨ñ©Õ—CqëYsý;²Ç¯_Ætšèyý¦‘Ÿ_ÂËX 2ªk£Ùߢè—3}*Áñé*· jO¦•MåI˜ÕÙypžôᄚÐúS¯¨Ÿ5ÀE•ÀY=F§…f5¯¨s­ÞŸùÇê•u*®Í®ªáSÝŸj{²ÁÆ:¯4´‰äiÂí¦fÄMå;˜šv?•Ž`÷:jž* g5Mm׆Uñ­Äg¤Ækªó’ªg;]Ïâ "†•ÌCD€ã7æ>+B9ˆœÍÚ>§_b:¦©¤«É>;¾£áâüY.= _]i!S]¹«ÐPÉ=+†EÅU¥;MÉfmfÖ*oÄ<„XÅêI8ÄõPÃTxÕîF˜RÙÌ“oîÒtÒ=ÃtŸ X¶©ÔÍk7N% ˜Õy§QÌ%èiÊKW)tâújÛ8)ÏHŽœh®ñ¬†#€•×Rº×©úËêÀn´qÏï*Ô2G+J¥˜ÒL-z|2Éštð³ºS 32ނՄh¤·U?Z5ºOün{~ݬóÇ‚3*›_SÃî³N—‰fAºèF¡[¦3•à`ýûÛáA¦ÎTî…)Îæ€8û–ÛŽŒßVé ¦88W…†Eg„@Šø-•ž`Fð21ÖkH‚t‰ÕتAÙ²m¡)¤ï’Œ[\mW4è•çk'.B÷© «f®t S‰¦Lz—•«DÜsÅ reÂ3.·¤0;Ô0£ë@Ö¦š ¤SŒg*OÂúûŒ%üDò™=@ï}°””`Š9ÖDõ u¦x– K§XÔ}*IÁ”bŠš2LÖ_<ŠP|ÃÿT‚_çœâÑ)7óÞÔ½zNøg¿‹â˜ŒÍIð¨kbõÉ©D,rëXyhªÕ;¥^ñoVnu ' ÇÄhNl7‰öTtØÔŠ_B¢;”{ÝÓyQýÚ”5s}5ùVï´üj •v`ýÛ1lÊ‘w¶C¨龫öBŒéW®5• @³B tá$©D!iŽÜ-_0¬´[®´©lšbYï€cÖáÁCl8‘¼ù»(Ц2Li¾4ü%b 8ü)w0E9N|H•ÊÉ2ðê Ó\;5Ú¤tåTgÜúÛЕt“jì7¶q5lœš"pŽS@[aaDTü6WUÔÕqÁ¨iD*‹ §ØM; ~<•Kæù!Àx›áâëÒ™r»g”[`5: Ò‡4Æ¡‚r®e³¤Ö›zZu°í—RV‚êž$ÚJýîG@ Ì]C¡SÑ ÷{³B¦ òÐÅZ<•N`5d!žÊŽ0•á`6°áLµ—gó0>+ƒ{ è.ŠçÌ|)xSc¡Ó¹¼¦bfgóÙ®ÖLTsañ7›ýð‡…ˆSÓça$8ùm¯“ ”#ë,‡p´K­hª¾¯cˆ‹€L?pL’T^BAY VÅW¡¹Sø§âUWªžÍYuŽÊÐ{˜'zý›cå/ëfI3Y4;ÐUM`#ÚSèMªIKe%où‘0Zƒà&æ˜JO0[¹X`ví¥©q:/¸FëÉY;׫l‰* ‰úJ•a*§Ájà)W®†ÙŠAF”ÄbzÜÉ”æ7Ó·R>‚Ïf/\bqPÖ@? pI–Ù6•—w:`;äÄ^W1»­UÐùY-˜wÍîSÁè?¦æüÏôWõÔõûÃ¥0è“JB`uãõz;íM‘£Z\Ü~7!6‹v¥™\·÷¥xдS]=«Á¶£$ SƒƒSé ¦‚éðúSHtüZ `MÍiäæôºÕ›N¶&>: þ\áÙ@8wo†:‹W3΢{ѳͳuÖiǦVèÜT"#𠜤1ÿ baÕËÌNå˜G÷×»j§õ›}xÂmÝt %e˜­;¢E=kÓ™°{ön蜳Ô`},úí µ—H ¿ßðY%)˜ #¸ºEÏš¹ÕJ¼ÕLÝ—ÐF;³¤¶ÞÝ€nf¹Ô&*omf“/Ÿy’ñÏ7 œóÇ+¦î•Õ4»ê3 (Ìèàuo·Ö­A±¹äŠmК!õ¦ö®’6P0Ô•1»…`‰Äñ žÍÙí£‰ÓÝâà#¨ºÏîÈiå&˜ÈbVoÁÞf—9»Ë¾½£sõ›…|*3åéžX1aîẗìeÚšý¶xÔe»šq¼\ò¬0UËf§oMI¦êÐSqë(œÓê š=›sZÉf7îµ¶I„}”†Ö9¸½!#™ñ­á›«¦¡ HkoeçëƒQçY8\×´´ÀèáIH—Ò ãéÌôyÆ‚hÕÏÙÍFoÊ 5û]fž‡½gªŠ4»Yh(ð”Le+˜½úõ,´ ù¨À›úbVdòÒ„¿Wêƒñ~xf|›‚þé¿t]š.¾MÁ¿/î¶·!Zm¾•æ3 3Ä8p¨š x6<–<•ŒC{®WXt¿¿•AµùwGÞ4iÌ%˜7S ¦úƒ¦r¬¸J²æi¨,;A ºÞ õŸuKDßLŒ•Qi7äï°þ´•†ƒƒå‡ü-èOé€J½ózþFz´…1LMB˜#˜æÆrgwó¦cºy3;¶§Q=¸;y€88ª)Ÿ³›S{'5wà¨ë¢ó1Prv:W¶x]Ðmþ(9ÝD}sEˆ)rèÓÉï‰å!ˆ [ÅI@Xõï…£ºwŸ[Å[S¨› ±€:®)5•v`ö=ØÕWS»ƒd³c9OëµfNñø÷“©u¶’avDm~)¶ PÉnƘ?ÜwMDUº‡ÑMïómkhzÕgd ‡Ôá©ôsX©ƒ©&ùO©ƒ©¨Èy¢p(\êʆƶûa•P©®ôs\Ž}n_ˆ2¼”7°EÉNðzdÈNÀÚa'80–q—Ùf™®bj\F®6¤áDæ}Ô7y¬¨¡P‚‘‹êo«A.°ä‹8‡B{\Ä8¬7ÒZ¦¦øÏ‘= 6tíl”]äý?÷š¦SšOð»L å'X)ó,~@ÆZ IÏÁÆ®ôsl>PýW3ÖXúº^]ÅØ‹mÕ`ÿ•^ÆeÓ3ó'LC3L‡ÌQ¯]]í…Õì.νb”ô`5˜–ðìŠ>œ=Ó2á„› Ýíöªužç°mv³‹tøÎÊ*Ld.ÓnkøË«s³Ûjµ A¨”@åÊçœ.)ÛÕÙ”ö`*“Á¤ßGºˆ8¼ ÀzïõT^Ž4ÞÂ|k$¤‡ð.0™°‚«Ö÷ˆ©|s¸oM+>M')˃@x[Fçü*Íôý7P)ñ­Õ\`ý\·ÖR II VÃùßpš¥6¨EdL{Ê·Ïx“çÀ vÄš*l†±Ãêì“u¾ŽKð4õ#3í$c§ gƒ¥\"Bmê9ç£ *]¡SY &Á¡À)T¦Á¤,s8áôfìòÍü0^vž¯n–Ï„ShÜEÝt ©¯Ì¬“kxŠo,?™Gc`k6O=¶‘—“#Š˜¡"&pÏœ£8þôGQùI“‚s;¶U?ïX‘ZðÁ ÆÏ©¼S‰ ¦Ö _òǃ÷ã§”ƒ:s™5• %ÿP•oš©«ÁÀ)…ã<²xèÃôÅ g¯#3Ö/p.Õ·¦q×Ñâîv¾´»¬÷Tüí<¼è…>/?ó„¨çž$`&hž†£ÿ”báõ;Njv×K’Ú»©ókf Ý*ÝœÙC·ªˆÌS0a›ÒÞÝ*mÐ:à¡[•¦óp¡¦¦‘Ô€^ÿ"²ûmóòM@Zê,dT‡Îôr-ªáþÌžŠæŽëLÍ^G†sví£EÌúxù§Q; Žð"3gµÂ5„O å9ÁýùpO(À¤(€­ß>O·a¥¯Ót‚:ª@Ò†“Ùjqô¯jýœœVƒ9aƒ.…I Jw0§ø$ÕIé„Ns³ðÖJà$±à9 çW_R¾‚¹É 4ãê>àD§ÊÔ¼V¨ã×õè¤ÏÊv0õ£¯q2壴ªO1f²Ã´S OÞZ3Æå¾ÃÍ"+Æ%XÊ¥/Me*XMGÀëà‚ósê„Óˆq¦2:L7ô?Bžöm{Öd‚òLç%øœ-ÔŒi›XS æ´<à]9ê‚mt€—'`"Ìö ã]gÌ«²ÔDrÿlm"ÛVýî«Ñ»Ìl±½IÀÑ?ü;ˆF½øW¦¬Æ§ØÄA’Pò/j%Eú”¡@Û/Nø@zR‰Þ8aM¾©þný1£å‰p÷+á‚þ™)f1êoÃ…ø^¦í€{Ø;ÜÛ3ŒrÓ,RÕY` z.úáµDQFü‰èïrP"úGB‹®; (j÷DÈDùõŸ5О#M3}^Ù 6^V˜Yçj¶_2ºAì·†š°ÎeŒxÙô¿<–íÀ?utõ¹üù(:Z<â9¸Êœ¡G†‰åÑ#Æ¢«~WÉæö\¿Mð]1HÄ’¸è ¿%ÍÕõ³zÂN·½Þª`|™¿Ø@„3Ÿ÷FÒó·_û”ôÑòŠï~0d­*<5¬nk~WqM=,Œ€kè»ü…ÁCfý!§Í‹+0¨9¯ŽžÛ÷¤õ‡±u}^e’[¿!ÅÌPz2>Õ“Ú£Grôîë‰x¦NXÿ¨W¥b‰„ÞÁ}¯g’,*¦B2'ú¦ÊÒsùü;sF ÝyÔÁ ¶‘ã&O$@ÏÅP·³O0g"IïÜÐǶ'rÃkg"CiЙ*¿dßz‚WË+c"V 蓺–õßXS‹ÄXüMÛ°ùt¬C‹é¿ÑSU&B Ø #ÁÚþ´¨Ð+ðžÝçûL¦œlºœKÒÀ“²®9n#›ÆD×+B >íC3ncðÔ½É à ޼sø;7™uxlL{¼á$Ö¹ó‡JI²%5v®DËë»RL(0÷åõ‚ù¸n¯â=ú7¾4rvâá4Þè!õm®áaëOáÕ§8µoÁ3¦‰%[X-ÑAEPÖ=Λ²n\:Câ§êAgP‡ºsk{>\ ]è ÷Æ *„/ÿ0Ð߯±õõø›A³¸WÆ ZçK”ˆ*ÁþàÎŒˆGÊûd~1ý·"Ÿ5§PžÖºqëYlÇqØé¼•o¿ ’ñ°*… »¯† ô»¯mw’Å̯hô (ÕðÚ(|E)ƒ}P/ð€žÈkðëï¼íäĘìE;ë7T’’ˆÛ5+~喝üέùÝUßÞ½k(÷Q2 4äl8›oºµçíøÇÿšÊ®Øm'Æœ5»×|Wˆøo›°¸ØÀhx=p»6:Ó4èüãýntð°p>Ô\=áyal&h‰ÞÞ»Çú-sùŽafÈ›¼™µãòV‡‚þâ÷ѿ̄€–éáý­yü@hüŠwCOÀhäkÞ …ŠèÛõ[ù¢£nS¬Êó&½/ùZ—µS~R]Î>òÕ’õÆÞêÕé»óN6¹@/úYü ©AÕÖsg,½£pkKM‚„‡ QCÙ›˜qE7œ1zÖO„s[|ùÖÙÀ¢ÐÁp¦àE*/âS=5ºéÖqE}Áª{qg d!úÔê*BO¢-›9_¥Ø²Šÿ\yÚ¹3ö‹Þ]ñG6(6¦R àX×¶+ ¢7Ã-=}I•aKþ=æûC^¯`XàZL¯M§ãדGz·©Üú~E¼ì?¥\Ðv˜úØC˜/è’뤎[õ+J¨¢ò'xÉêzºÛ« ÇÌ•ØÃÌ…ýz˜—…dœÍ@¸ôƒ«S q2C\D†äwùlÑo¦'.@ã?!WãnXê\×¶Ýê‡.‘{w#ÖÑó7¡‡ñã–i ° ÉZP_×î X¢|Â@o±– )pK¼ù¹•š`çnl…"_™…Û-‘çøK¡È€Z“ݲ  ©'m —wÈ·/ÀG(·VZ 5Žc{LÉ€{W(1¹~¬xÑ«ò²dâŽÂ³,ŸKØúú²…ÝÎfÀ`\Þ öèi¯¥k']ždÑÌEý…êY©ü‹g›÷ æ±9Ý·Ãdäê›Õ­ÃQXBªŠ»$ñ„j£¢¹Ë!ڎʨðÝû=ÙÞ˜`˜Éômý¸ˆÛ^ =» ž®ß[ŠøCQ3FÎZk{­ O k­ m™Ôù®»-§ÑùlÑߢÒ_;ŒEfX¬zJø° œâ²²ñ_‰ê ±¤)¦ç–—©C]¨þ±†WP¼”ãÇ@4dET3¾¶ŽÎËãÃ1}âfý¡ IÉܬ Gì¥Þr¿pqÀ÷ò¬§ÒÍ{¡!¿&`ü+#.¶ŽÏÇdÙŽÉŸm1Ç$êÜ.Zå…û!ºRG»cÝ6½æù­üNµIm­Ìd½Rn©P‚on“Añ…q+Pr÷ŠUz^á®  ÒMò}M_…°«ß ^è¿?´oôBù+ô¸ÛþnÄjÞ>–&iªiò¯j7/®Jäê 3ôGŸU½â/" 0Ô ¦8ƒºVaH»®2õ׸½ôµ6¬Ðã:hîÊ0 D >S­ô ‰ø–¡ÊÈ¢]'(ZO‰ñ¬Z_M T›ÙÆÈ7Ö#å¹I=ÌúH>ãÛx:-Ð Ÿ«oI°îk· (`éæÇ] Ôªí±ý™±orôçT#^îº/^1ú éuˆ(\Á)…‡˜?¶Õ;Uu{jßo c²vón¯:ÊÇY'éòôÆ\ ÆœV† UJ¨­Õ`‚m §.ÿÆ©ÒkT}ÈE~=M•>IÊô ë¯"^WÐsV!k°ãjÃïwƒ-$ÚÞ"••öÆèÔÞx#‚r@Ãn)»PCÀ?R»B´]FÄë;º4Tz„—L|É%n¹Fú6`Öu(1먕ít|E {ÀžË5D‘LðŒÌâ¦ÞRCc^¼OÀ7*H’îDöÑæÉ䔾ÏвñÛ;+û2ðúœ¸ÊäãÉ¡Ô4KÀ’õ‹¹0N%ÉêŒa#ðdƒõ›Ò­ ³+º†º›«žÑZý7nš#1„°îG(¢g4–üøŽf›¼J¯™6TÿÐ Ðý<ãЖ7„!lR¶¾#ÏÌg××¹„ž´#å ÏÚê:Ö˾Ð]Ô¬&¿PmØÙ¥Ü&ÕÃ!Žq(-  ^p "©×ª£Qs*;ñ’{•+Æ kýQ¤Ê1¿cyúkàDÔnøÙ@¤ÞÓõ˜”Åôæ llÛÞÒwØlžàÜ@ Æ¥qW{¾ÛR9åÛµì%I'Ñ00A~ŠðÀ8â0T^XÇÛ¥¼ï@jÈ5$Ïác<|ŒkW=^†ú8àK&—ÒôägÕÂA)Ûu©ÞüÓ_DóÖìàè /öP£ºâ¸Ò 0´‰Þí¾s_¢ü¥´LÕ=΂²œz»gU%xjŸê °Þ_à »W‚WS®@ê­¯ƒc¯ÇÎçàýØI8P>/ó³MdzÛ'‚A&Ãä¡®Öê¤b̉ E—¿xj*жÁgÕ_-zý>?—‡2Øu ùLa>CPJ€žEÞ”ë_œå`çyœŽ@N‰•¬eñšrc-ƒ…ÇnÍp½v¡™yLß“Õ 9 3>hûr(ðukoà¼ÖS¸ü5ã®z†É¦ª·JØ ZÚ·g,4¬öñ6|žaDuïh+Pç±¾·ÎÔRŠÝYû!'¥Å‡lBP‚ÕrWY«ØzÛã¡hÐwÖB@÷ÚAüë?y:­ †ÕØÒAÆë›°3†×Ù‰ ·‡›¿¶pìäMœ{;œ fa/ÄØqª‰x‘GýíBˆÉĦ߲'*ÊTàP˼i\ÍZ‘àÐl¬ßÔZtb”ùABÒQÔè·AÙ€~— Üuœð{ÿxI{nÁ§q>´Ì¿ø ^Ž˜~dw†ðRƒƒ¹U[¾škc5Ë &׌š¶êú’¥é ¶Æ:Ǥz€¤Á}Ùl]r“¾©ô÷öl°[å¿§« ^ºf)Í]$Å0/,TVJøFØ¢›KO¸Ô>Ï4É'é¹ívÂ4ááS³Uÿ·–q)NÏ­Ó8¬3 ÞM”ÿ#<Ó0[;Y÷z#Ðp 7o*p›“EOhŒ™}‡a–Ön}g‡YHµAèõNaŽ˜’­ë¸$û3;Ûr\O_ô7±²YAûiœC},gÛØÚWën%+ðãälº{¤ª}ã¯ä­í˜i#»†Ô¸'b¼è&êÆ4äf@0ïêà@ÀÊU€q ™§üñæï‰eA4Kå1ÎÖù”“>“°ÍïØ±ëÍ8Tƒ…¼Ñi¤"xHôâÉ0ñGñæFtŠÚÜÝá,YâÙsíué>é­ú{B»{;MÝkp0öÏÜ%=T•AöšïÐzž ½”·¯A˜GáÓ¢Y§‚ê8¬w©?vj‡”éieü©®¿ÓÙóŽX\‡´ê‰ÊFÇRꖭàÃlë.­ZãYsOÑÅo15³¼1Çà(™˜Cʿàô·r$EôÚ‹?îíÛ±úo¼„§´¡vg‹.^8cº%GÓ_š€…Woù:Ÿß¦0îÒ3[Œ‰pŒFÙ§Å€ÅÛF¿ôM½"ôâ«Úd§Á ¾» ã€$´ŸêA¥Ù`¡uAM¿Qå^Ùr÷Âv"œ‚¸âúþëÌbdK´f† VO¸'±ê…H¥SþÇo&ém:V§\ O3?î¼ùÐe÷·úÌþŒlyÅ»\+°?sñ¯Ý!ÛúÍ…xé,O¼t…:ÝâpÕÖojol7€º¸Ý&„’üê0“Þ¬£Ãzè°ðúöPvÈÞnÙúöè—§eU‚[U½]â¹áëÀÚ¯û)q|ì`÷¦À¢Ñ³Ô tKªú"¥Ÿ÷E÷.§øcZŸa‘Ã.8 xúüƒ­T?ØQzJñ³6žyá¬lG]è?ˆsÐu| :d/îdÀ_=ŠÇ<\1{-#Hz߸_®»QCKçÃøØ±Ç)5Ô=\kn]<¥ ü…ÀÓ£6 Rh&] ¤âá2œ:Qg次–GÑ=”ê(¯î!@êÑScXÏçÍQ¶I·™‡ÁB›îŸƒÁ[ÃÂ[ö3??ÊôxÆÀ[“#qmñPñؾãïèñåÊg¢Ç°\8ý7ž=»‘¾¨Äct¨kL⡳w/ þô,¯Ñ~( ðtØ]³×w:7žéjÏÞ,nHûþ¶«=9Çô—B—šÎ¬þ ñ´ûõÄÚ kEf Jµ=õ3Ћñi>O|ùÙ‹/c1¦QHèrŸ¡jÛGzB OvsðˆêïµT‰N„ _/K0³[#l?§Ã”>Ô•z­®Ü÷êšl/WаÌ#’+̇­€ð¢¹1ÓÁšJ’”žŸRÓÑÓ÷yè{^Ñ=ˆ_=ÁêiŠb,ÌD¯ÏêYg¥ÅßÑ7•@À‘¾ËcÉÌý. î#ý¬ÉùLvEâ‹eIG×¼P +cÐXÕtט} ¹æû3'hš1ú=bï&Ž´XmÛivôù^6² ÀE¢)agP5ÇVÄb'ßÍâr \&éóŒ8uY6ÏT’é aØ3/´ð‹f¥¡}Ô‡þ•t¸LpŸg:G§Æ«­ôÊ7õÏD8’ªüúBh¯ŸŒÅ}IóÔσ²jͼz]†¿Aá…Ñw¢Ô€Í¾Nf’tøùð^5ßj‘Úé802H5NNhB ç©ä®'¨ëEˆÔ̬_äFH/|!( L& nºµ5ëlKUô ùºSá]?ÔɞɫçbÙÉQí®íªiû]>¦L Ò;F ‹Æšµ5„<#3#ÇH …”úë´éý~ià*Am§œÝGÝ›h…o-ü¹ùþ~—Ö#¿uV¶þ¡!ˆŠLõÂmVi=!¿%Ùô úƒ¸lÄ6££³8ƒ_Á›Ý¥mõ¾Ês2ÁÀŸEs4}·3_šg¨VNÌ^'êNè_`2^Æ,½ãÄ´O0ó?.µ°NFýƒ‡°f^ƒÙécÿw‚ŒíÏ \›7ÚÙÔ°%éšñ  ™îòA1”诘xäU¸UÃRªRÁŠ×;Àm‰È¨þWÞ·‚ •ã°DÛ{8Ú’‘”œ» õ¾ƒn­ÛÄ%Ç»±ÂŒ”ê uq“OHP‡´› 6z]g:Îh!”uKF[Ñ¢éãGÑa:¼&XƒG¼\Q Ÿ/mèn¯0)6nÙà,IÉvõ¦Ž­§dßyKd·#¾û[©ù2Öë­2ÛÄ·JÐyþ‰Nç|À(·%žRÑë_港%Ômٟ눯‚½.Y4Ž\ãm$Dç M®¾¶‰ëf’©ÿ<EŸ9b“ÕV¾]æãñb©p/K8çÍH‡6÷:û¨Ø~œÛ£íú :Á³ ßR¥1ÿYØCçz¬{Æ$N›è5•¯ŠÎUÐ-i#¬>>Þ,>$zþ›ÇŸÀF[J:Ykœ¿ñ”à êT£çÖsq¶¦ŠÞKH£U6T=d†²z".ýS)N¢%%P~Ô…Bh·ÁSjÁ‰â»’„žc¢Ä­—®õÓ_”ë°‘„ëK¸š‰²ªh¢_,3@Er“-àSÿ.sLöfa‰ðuþˆ»—ãÁN˜íL_ðúõ)/÷уáðrž±ŽÒ+ØóoXv~ÏÑÑÅñ=’“Âqý›ò5ì_¨cjÙÞN i þIiüŽ ŸìyÜ` lÊo°)a§Kä„GØûí ­+Ýip’ºVô8eô…H’ûø,HÉÀ–› ã ¡ÆÌ‘¤¼%ÚÚÄÐÀ\ )¡ûýuè:dyW­MòúÉ*ò'Ö ™«‚Ä) Ì#)3)• 0Áט誟¦|3JÊ#ÿtÃ4¸ gx™²ky û*æd×ß‹«\ú‚“#r>ä¯8rÕ­lµµ(S^¢Œ¤œ(Ú2¿ë—Jc&nQL O¢4Ã`É%›ºR= âä£ð‚åP`_â>ŽÌå6/q a’kt×%Р¤âù^ZV\Æó•ð¤ gCí¾>ÛT>Þ@ò…;é2ÒVÐ~µÉóÜÕ–amG´ˆh¾‹KüUªïŸªp1OpÛ­˜'4¾—aF†TܰӇŽÃ°~Ô6är¯³Xmêñ­á¿yƒI©d¶4ì 4qpœ$pœ$e> “Ñ‚8iFô¥'á2^#£À‹~‘q^OÄý½v²7>#¡*ÊÇtsé”Å ¡zÌ…G³^ñÞ£¼Í:䥭oÛµl³Žöp1K Ñy“w[z4¯Ê§çòy–ݰ}çgMú œŠUI$$ç#b´©Ô§»ˆiiäÈ¢eL9‰1M²ÀÖÄoòÍ¢)~­Š<Ÿ>ÇRé(•Ç0,ØŠl͈®º°Èôƒ†`¸”Ü/Ü¿O˜âb$‰(ñ˜Ê­HÅi+×Hò‡ª¥’xÒÖs(½pî–rXB|ÅÁ}Haó,,ý­8:Úi?{”™Õ[åƒïë”’SóÒêok(œPð’é¯ÞpâE[)dÃŽY tjÑ®-Tx^Q ª“Tº¶Jxb†íŽýˆ!²&F¿36EÁ:ï!¼NV[·&v¼±êkÃ= º•¢×Ãá¾,WˆäùÛ«°d£ÞœÜCdz'Ãü*oÖh*ûìÉÑ©V,5\/›Á9•tˆŠufäìú[ÌÚz@®øoR¢‘Èr¥²GÎèiÅk€Íƒ¾/G‚À^-ÁjŠð‚W.~' tÖ)4ŠÊd;q,£­'þ²½¦êaq݆//[Eœ®Zœn‚©ãQÊ“X!Iùg´ Á{’ª#-+p ¯vH–š8g„„ÏkÔ$×° {„—ÃFYûA“¨~üË“eÁÓ`¾Y¡…zTŠÐ±P ƒR=Å !(THUÉð”@]²Z(VšÂ0>cßDDÓM<ž`¤®–F¥3Ò"SÍìÁt-Éôuå¥X{«7~Gƒä±~DÜæPm¦{®—ÂN.$#Éw ÖDjÒÖø«Œ›þ,®$q™Ôåß3*ªÔ2*vspœ¤Šb8zŒíTªÐ/ª¹4áõ›É Œ †W¨l@xuÙªzîü¾HÁ*̲’æTÃ>¸¸µí´Åunqâ'{GÁ“‰ê{9„î`ìÈêÆWu>¹ï»"`ûÌwØ}§“@Õ’@¿’ö f¹¤É^ӖŇ;4ôÎ^Š©\‡óùTv‹¬6¶&=0XH¥`mî®°ö4F}‹&¨¤j*?éB6)ãïÕ¼a@ó‡ªáúf©üÄó—Ï›°Ý;b“kÔœ|÷®}Ð~²w„W{x'ˆ€º£nügŽô¾Ó¸ P$zò÷IâTæµÛM „÷. € ¸B)(?©'ýtV~ó-WcfÞ¾åê’Q&»Ô´Užð6È#VûÂë•WW“{açQç¡ËmqV³à c˜KLwÍÌ–»Ÿ¬£&LìO•Þ-¨sH¤Ý[%*º¬ÖiÖ]%´ ¢ƒb%I¨¶®ßÊ—™íó<ª$pr#Q@¤EÎ≒3Qòc!ƒÙ/‘eóÃùSéø’@æ)ó F!d\'ÊjQvÚð<¯Y$2Òó0†F!¥PÐÆéCjð)Yã¸×¦H›–ûÓCnäN@õËr1øL<„L&Þ-Iæó(ã@¬’àCJ`8Y-µ4°›¤ìâüÀ•%¨iàiLR.l’UÕÏûÛ)X+¼•ªµÇOk»%óûbêò.x…ÆwóL$%AÑ0Åâ|ýr³°ØðB@zö3g`iI¥Š<ÇÄõ/л—2yØBÍŠŒÂäˆX|Xñrºúobu¶±ùŸqé“H˜Â#?•So~;pC½FU•g}_Px·NÅpR¿Ï`´®š§Úâ“aZ”³²ÝÕÌÓÕóóA¯ÔsÄWôŠ€N*ÿE?b¢$D’Àv’¤¹ƒ ׫BEÀ¿Ôg#ž @6_0âáNÏõ·¿<1Ÿ¼p`¡n4`³½À.93g XÐ$qˆå.ƒæ¯ d'^…c¡c\ gä‰:¢?°îàå¸äž@Êp% 3Iî@tõHý­¹øðž{:ž8ÌÀЋƒ¤FXZ·Ÿ_‚@B°ŠÁ’”ìäéï¼™“2žÜà0¨$™šOµºÑ–p#ÔÁçnÇ5 W¾ùÉžc„šgm—&!ðx‡ Õ-±ÊÛµç Н#nzöDµñöë®fne…Gþx7÷ÉÌéJ‰bºC30nÒfL5jí%7ÔH5ÛdZ±Î’†m ÙÌ]‰ú*/ÝaõIjéè'0Ÿ$¥D9.în9Ê»>‰'v§†UÛ‚ÙÝÃÖ͈E¡ÌÞúýF¶Š­;ü4p ¢¯ÒÓëñE‡=§@ÿHhùgYKüÅÝU`oI͘CÚµšŸþÄ„OªÁ1ØBÔ©éz†íú¨°êXý óÆ ¤]ÃÜOµ¹M¼ùîÖÉÙx×@pF‚²Z‚H'מ+*[u ÎRð¬$°¬_²Ù!u¸òÓÔ¥.þ8.©AknÕ÷dV¹|¥Û"£³I]‡F4Â÷ÃÈ—À{ºÚ3}Ii·©nS#âÐpéôË<)& Ô&«e(,©AЂIeµ{> äØ,µ #¥³¸!Ë p‰¯ )Ø,>‡L¿7}Å'¶ŸfÖ0>”iøF’íô‚Û †ÔZ·¡E-zäñU†Ì¼()/8 ä&«Ý“ºDƒ1Ø ÐóVa–vÏ+§m =OnÍ ä'éx 6.=âÝÚšÁùOøÃéDrþ"ú|TñmÕ`öR¼ó([•h·Bx%°û5x V‘K ö%3`#Y-T æìqò¡Pu wZÄ!šYtHäëþîµÈÉ٫š;ܳuº§Ž°“ÔÌ(i+ïó™R›l¯°=ªÅз¡¿MBóýx1TÈð3~è~3àfJ›%5ŽÌ·¾³èNdÀêá%ÍS”e#‘>=ÔÔ?¶6%ÔióMšYkÀÞvvØëN&@?S‰šhN’—û#B?ONà«c#†ž¾‡³J¡ÝGdjOlÝ“ÒÓ_…*’ \Ê ]¦N‚Â%F(W”'+}Ê{~ãà7šîJB·‚©ÛÁн^ªþ‘ÑZÁTý¢ ‡ÜÕanýƒÃþqƒvH}¹c½åcJúrÙ¤þH±Î.—ö¾¤d/ýhæÑà-ÖÀögt/À£Ïy—ϲWK;ÙþJ$%A / ÓèõØ'Ps¬–»E'³ðßèqånÁÐeHȾìgg³Y68»‹Ë Ÿ¬ÖñfºM†b)©3‘`Ä©DyRi”e¶ù !  w˜wÀJÌiýh»–Æó• è–ä[ ¯çðž¤Ea&íS [ÒzŒm¼GÒ¤ü\‚’a[‹~TXíérüìRÅIžRBâ NZ+é¼eŒàtÚ~¶œ(«¥½×!uA¶‘h¦öÎP3]Ò‘,xNåÓú·³åö[jÕCÝPnÇ« Ùjn€%uKŠnm£x°Ô†ù‰·ƒÔdµòï(o_Ðá›"tOéPìž~ ¼ý Gl(©# Øa`õIoJ„Cµç|³P`ºv}ȾÖµ:¼b9ËÔçY g\ÀÏï9 å®RŸUJ…¢;øÌ=ß*–²Á!È{Òønµqì£ Íuø';t  Ic{.AÇ’†ÉVQ°ÚÃ!ÓŽ :])¦(‘ž8 ØÎ‡ eWź‚˜ ¨¶þ¼S Ò_«?7ÄŠw=90)ù_ Ç”ÒÊ_æîàPI#—üõ°0W†$@|`ÝÑ,»/˜~ 6I#»‰øƒéÍ$¬Á_22oÔLÜ‚*%y j”4´´3iDheÇTfÇ às•H=#Œa¹ C$TUûø`M‰5 °:òôÇ*äH¢¬;óÁ²¬ó!p˜pCŽúðõ$Ь6»J0‚:‰Š[›ËQû@M/¸•ä±7<Kt”Pƒ¶ÊOïÒÀ8~rç@š²ŽãaH•‹‰… ·!{ÙÚ‘TÙÚë¼k*“Çæà•ƒDò¼¨ßýöƒD|Èo¿kEŠÓBµ 1IàDIƒ¥wÒ€9¼ôÎzGœJï$꣇sÒ!D7….âáÄ_Þè/,í6cyEÄEÄKÙ*f·0§6clÎŽÀêi( ë,q°àÆEÙJ\V9¶w¥ì¤;K³æ"ëó6R¡ Â&Uè¾Fº’ßâ ‰–âÜ„dî€rÚ”Õ4ž.±oÿy¥"z‡ß—„PîÀäMâ¾½¬¸{ÇT4¾GÜ‚[ÿí¹¡Ý5Y"Œ;É7ZâoˆŒ)vc¶³Òƒ[¥?^<`‘Éj)ܨLì$Êy2E<Ï%9ëh×e0K8ï4œv ¬MËØÔø¬çâ—°µý@¬Í‰~ ­ÖÚLTŽ4•Î^SHwhRÞ.Á™;…`~|¹c -¼ï¨F8C„U•ÐÍÝ!Ô-ùqj8½^š€ž¶0,ð4ý±@Á²3=$ v6K-gÝ &ÈDÒöü®Ý(, ÷ Aè‰7‚¯§ó çùÜ´£3ŽÎ ™;ÕÓêÅ6\]ƒ%!Ú¥ÚFõÚ‿E—m†»5{½nzò|ë j“Õ¢,–BÂüé“&ïKø<à/3RÖ_xAÝýW‹ü‡ ]%+ ûÇÄY‡À™s‡œ3AÏŸ#Rà©í¦oŠjLý+áÝumæÏÓ 4óÃhx†*ðãW–²ú¹ž0ÿ{«e龜¼>>v¨–\Ÿ )4G`g$Ì<Žƒ n”ÕVŽVfo0>ïYèGéѱµuÃÑ£'â.ôÔÖ<ºt¦Q¼¤¢w ˜fÙuhÐØoˆBVrm_‚¿Y‚&..‘?é4¨Ï$ µ ò·OÁHTölrŽüåΘ]vnïßñLØ îá*4Ëó¹nð)}‘žaÒ-ƒ% E)øþ2èPj Û%»ê1èŽ>çkXåÉ–|¨§H-‰”9—Äu/‚$^ð:-t¶aôZ»eq;J>\(NÁ‹6O…È(‹t—?`Æ\eE8–™ÎŸïc‘ó²\“ý¯¬öuÂX ŠÀÑÜ@7ÅE†fŸ?+ÁCïýF.dåA‘Þ®©ö?$ã1ò3¨IÖñÄÑè¸S\î4Ycff1qã}G7¾Éð²ÁXÐ`¦g0Ï@hÛ®O{mRÔ>¤»y¿Ä4?ŠÞ€}À—cöÜævµùAºÿkךè²Cz5ý¦ÑH€Â_—àiAÖ©*<žþÈtS§Ç EY-AjäI3[0ùž—L˜Ké,ñɧOËh…ßjò<ódgðÕädæÊkƺºcÅÑ€KþÎJTÏetP%‘“cã&K¹pˆº”ÜM6°¯¹ôÔÊHX­Mb")¶k(+¯‰¹†x SLsÊ\Ò (Ô–gü’Ž&Fø BFEVNCl¡¯à•XÖ3<çAŠçÐe°£ärèT[Ý—J›Wã9lQBÝ ò3,KØMòéíù(|%<åHá«ò¯ÓcD®#3BÆ.¡œ\ÎmWœmÌ­s–ä_^cÁ”>É­z2ºac ôëÊJ•¢­\â}§•geAùïÄ,“nT{ÍžáƒCz$‰¢·èK÷0ñí)a;O›À®^>f9乿l(”Þo²s5‚÷oÇ-ôŠç Z’ì˜å—~@Š9!Yn/ueiÑ}hü9óc ÿ2¿eN…g¹ß2ƒ÷(§à·ÌJÚ¥‡Üo™?Îô“!OTã…7@Ð]ì¤øÏÉ¢túoÝž“Oö BwRfås6y'uÈ%>e¶œ®Œ³Þ*Y&éÈR,`ª‡Ò tçoéæKÏ9³M|H>¥WÑï–¹_d,u×8ÑVÚÉžBƼTÜu–8àÙáí·xLV”™Q>Qwº/©¯k`Ÿå’ùq ¼Ï¹ð÷Ø…B:gVB”`®—VC{F¨>g/#Žô^¯€…¨}K3|K–lh F±ÇnMô¢ep›¬Ö|½dBÛæê3¬_ã1€ÐÊ™x” Š”œ!Ñ2Äc&%csËÇ3ÊÏÊ#®•é YQ–];"j®nìRå´µp@_v>² €þ7tܘ17ÅF.£¦*¥¤ÈÍH½MÜÜö¢ƒˆßJýÉú%éÇø»õ¨E­òØ<:FBÎY¢-»KM5…Ù®úB[óøöŒb2Ý-“3Äaî»Ç Óðïž\nd˜˜9‚ ×7Š•O…LŒyëdÜ+Dë¢<+í‰9À!¢ó””9Ç­ˆcàu”&9_bnóÂÂÊÙæcÞ{èT˜C…‚;¿Hg²º5´u³/ùp¢$N ´Ã¡k9s?ñjtØ€Ó¸çKV”ÁrYÌtkOùÑÊûæÔå !˜YU\¯l¯ÕÌšfʧÁ#“Û㥴Ï`DY-Ým’2¦µô‹–|‹·ò¹Smx¯˜pµžâ“Ód\ó@®ÉÌžËÍË•áµÉʲ·˜ê MñO½Ý`°\xŸ-ñ ÌG`îW;ð ì%x þìÑ÷e–m ÛFØF‹ÄGì(ù°£ÜŒýq¸DÛœµß¨ Γ%¾#Pˆ ÷l(X Â^wÓ‰%iC)¢Œ\À\¼†A§¥kû *'ëgÆp-¡2™ÛƒËåñ¡¶Ó:êþEm†Æí€vœˆjÞxS.íž×àËA*”êáçö)ÌO—‹Sfƒâ8å¥ÌUV"çeÌÊxØõ:q—G$ÿXÌàÉš ¬mÎ"©£®4žtñ3ýV`q'¦æÝÉ¥Qí§|7JÞØ<µ$§.ÁSTæcŠ–ùW%Þu'tt†NÏ`‰&>ÓozÒ{¡R.'ÁŽRç†t›$?ôáYiR@¾ ôø[îRWJÈö±eð ¬ãVÆ ErÉó©Ç«ïó;ìgß§Èj7¶µ ïÙð`Ž·;ík@ƒQeiÖæ ;¯Í3¹ir5žÃ’v #äuLO ÍB¤—„"Ά£™úz_29Þ‹k¹\4, p¶Ž!nêÛ;b#­9_òo'=gåC "¦ L¿O¥ÝQ! kæ/šÌš‘šª‹ê.ÔœâOÏÃÄŒºö¼sùu7#šf·€`«ÅÏÅXpýTå©·•AŸÃÒTqU^ +$²‰Çzm=]­\nö&èW2èTÖ/ wÔÌ¿¼žLÚBþÝYE8Š÷ [­’gõ˜'Ç3¨:Cò{Vºm-¶¡ŽŸ·¨íË´ [KMà L[?¬wö8wÆì>M‘>šUÐ*íy^f‹9°»d0¶d®de…ßYCU wƒð¸òzž™@•& 'Y à (RÔ°—lPk⦬7ƒ"%;E +ž4O7È HÉÕ‹ÐIcáÖ[–+3Êc°èÑãî¨:&(ËJÞo½Òœ´À#Ä&Ú,vbÂŽõåá*‡º)x UTïI ÌD,x1•t£ÒyÌuµÒnüƒº°ºÃvvÔ™òG-‰NZ¥I‘Âhá+Î×hjï/÷xƳ¿!pX²8÷S = êŒo[W z‚S&»‚lÝO{ôDõAÄÈ¿À>k\ÂV˜¤éD-8Á¸ÉsƒDlWV>àx]ü'còDx’ïlæø¦â´U§XÏ@Ùæf I$?\•Ø×–zÓÒdp¦äöæ‘ç–nZšÜR ¥‘ív®ã‰È6"Ržˆì–§-9»Kn^§i w¨åÄ•ê}GR&CáQ ®çuÆÃOžé8#g s®/On”Mã¢a&ÑÆf­©ØýUÊyˆaÖQ°R+í¯YL1»Z7½¿Òôï‘!­°ÍÿB_Ù' p)y|èv =ó±²ÜŽ_ƒ3 wÜ‘;81hD”ÔhЮæ¶M%¼T‚\m†Y¡&é¡1,w=áH­F`sÈŠb¥#(íÏW¯Ä5Þd»Þñ½vÑaëð.ýMÿx¼kà2ÉM,ÀØ?éÒoÞ« Þ“ÕÒi•ýBÿál¨g ˜Põ³î/ k€Ê&;¨œw"VÒ¥^>m¦hi0ù ôÚ=qàý:«Aè^X¥¶©îÌ%«•s†ÃüÎöß §5öep¸»@Ò5ȸÆìƒõ zaõ©ÚŽî6+R ò,/)®'—ÖÕ Ò4;e2'§š? þf¸„­éIXa劔7ðXoTßX¤=Ó"lµ|ÍÎþáÅÏçËõîï$·3o£'» nœÏ&‡qJó4Ÿ ýÎN8§²G|01›;«0[À`§ÈUztTpZ˜-Ä’ò) ¶ùl3°áÚ¤³ªqNþ‚¼)mð/’·Î‡[.i÷§ ðMÖ†LHIÿÜÁò®q)I$Êý“ÝÆ…/ÉýìÊ—R‹ •e…Áj©´u˜‰°(2è¡·#Y'Z4Õ{r›,ÅŽùÃÉæí*Z™iO¯MÚ± »Á]uvÖöåp/e¦èR¾iã{螺Š(|{âa¯BŸ‰…èù1PØ“†Çä*Ú³íÝž „TLSÕã㇀=w¤(}ò-g;[Øw[¦÷r\ÄÛFîF Æxò à"!ÊaÉÔË –‘èC ¾kW1+â܃Ooÿ /ÙìÔé*›•Ì$£g-\ˆÑá^ÿapÉÌ!íŪýÈ—ŸîùeÔ‘[J›JÞœ)¹Wžm>MŸ‘‰Ñn-úrärøÛµê ¶ú˜@íõ5¹‘»¸þ6“Üý5ÇŒ´xökûZtB®aV£ÞLyö-p¦äÍ™’»°c|"Þ¦àæZÂ’Ø)Ž~Í9ZȽóÚ½_ôÀ Ô¸ú^$‹®£Ø)‹q§4 ^?E»rïl)Öæz\Œ(OÚ÷§í<oÑyW*BÌ.ôHMçK7ê+ :”ìJûD˜'ЫL*€!kyÀØñbÄi¨D}ÒK•E¥cÑÆäþí/Â’Í|Ôßo?ÙR«œÛƒOÄñYbÆôØêD¾Že'јÈq;Ôvá vZï$wXž\9ƒWòÆó&Žˆ…Úx$x6»o“;Òk™g0ª¬ö²÷ïh¦ZsÏõ(=`Ù|öN°æÜžyx;æä/•Ÿâ<¿^ãÜ!ˆ3`¨×j_E¼ž–¢OÓº¼f¾åOyjï6 Ò 9UH,ÒÚJ(bßãÉv⇌vñä3lk ÄÒõv}Lß+àT)ΩBZ‘À ZH¡‹ä&EIUDÜfCH2”iE]O+ñs^@‚Ê çãàÖ Cñ:8 ˜TVkD r¦37ÛÁ[LÎàn,_(f×çÍ6Q¾|‘,šdû+mŠzÛ¢´)ʬRëeço“,Ï¿@=ë‚Nü¤7eZÑ¥d«¬¾3€8Ⱦ[Ô¬Ñ6ïN¢-k¶Ô©À]]¾Ç·ï: Ï5¸ÆA,dæ.£ü<ž-èQ-¤!`HÙ_âJ !ã¡°ˆ@€å«—‰IÁ€QÑÚÝ»Šþƒ6»'ºÑt²ê “_˜³bß #Fc¯€¦|nì­WÃŒ÷ÐÕ§[!Ú62m[>OÈS´#2uldPoà­éÌwâq¬.P¾G"²,ƒ‹‘óÄ-‹§T×±yÀHHm°Þ»UŽ…°;x{Ž> -(¨yŠÒ¬.ð RB¢ùž-,ZHV¯e>ž Hù$±Ñˆ€µŸ\Dhbò[:¥€ø¤lÚ…¢ˆmñ–ãE{¯ÀoQ¾àäTêñPç!—ò™¾ÄY`Ž°Ê‘NYtG1ÈB NÎ΂}6È“wy^KSZ‹°=Á†B–”&™/9ð’ƒ]ÀËMóåÇš!ëx^ ¦ÇuÁ§’ÃŒh©¢´*¡¨ÀˆxxZý&¦ÕDç%ÍY„õ‚gÒ)ôd©æ$¶pƒQ èP hZ r—W»w´É¿Ìå]à]))à€×ËÍT.u/ÆxKúØ:“. Dwèíâç,i—íÂná қɀòœáaªÐS ›Ú¸æéá D§ºÄI˜uéGê%H½¤ž2¥\®ÂÕ-ÁqzÔNå`â(93FñŠÑˆ-8ä^`Müx*Q ­³ê_m½ÅÑæUªd5ª¥ÌnÓ´¨^‚ãG‚¤ÝN¾2öÖÃMqŒªuÀ½H››à?w–ä&ß½”íÔiß C™W´…¯ÙCæÝù6ãTwóKÐ=Eêìak+× Je’'ïå¦N‘Xް$0ñ Ç9(É*ƒiýך[W¡Çµ‰†ú(ðñ˜)P$•‘EÛÁ­øò–~Ÿb ù®P²ƒð*0‰KòØ^…þà‘ëŽ•Ï I(qŽ Ïó}LãæêcFºŒgŒ!…ȹBˆxÊ»êio¬¨$H¬Ô¸)‚ƒ¥€¹¥€ƒeµåØF1àQ”heí3Nw¼Ï¸í½’[ÏérÙ%ÑÑx™GMmýeã@l1î\‘®•­Øéý±Ì!ÂÀ¹²ÚÊÙðq=a¡€X¦¤wƒÂKì½€–÷WÐ÷=²ÒQÌ®$÷<1ðç‰ðü»¹R— àÒ pÈÖ1é,ÉÓñPû≈•4x³~Å·ÖrÝßô$d+…)i,a9ÝÎEBwÏaþRbx="ÕBO‰Ç}F%Sè>A™¬:1Ôkþcƒ¥Ék¡d¢Âužïî}[`2Â"K~™tÑë¯9¼|\Ñ.¦›•¬}Æ®NQŠŽ_+Z¹Ä‘hnX—<ÚãrÔ°¥”l¹m á¨âõ}JæÓÓ )ÜósrÝ8ÃøÌ)èÆvŠÇž ¨{JNQ¥_;d‚ãdª@*”|§+¥FA‚ã‚g‰*S=f²¸JßGrãF¤Ë-93´ª;eØVX‹ïµ'PgµO ¢îm…’0VŠgWç³Ê6äÒ)Ù(>)MK†¡ÓšöÓ}i\KFmnýÃ2Wªs!&'(PÓ¤5÷%/¤$´èdé¾TLó<3±˜ôPßA‹AÝB†t)Jɶ“NÕòÍQÔy¹4\ýjˆ<öæDZRÙt+%W^ƒA¸éV ˆXJ [)ûÕÝJÏà€î¤Éõó>Câzk¢ò\5*ʰb{ýN€«±¶`ç}Z¸'¯ó€4X =®ÙÓ/¶¬€V¥äæg¼,Oõ„&“ÕŽ$ ’ÉK†lÌ­Ú9¿8‹ä–ÜB‡Õ¼s²„…Z(ÅUr›WT@”þGœehm‰{óø~bµŒ#ˆÖ¡Ç°•@[¼Ëx™ëÖ%‘F眲}*l¼|×riX†9‹Ú¾ÁA$x³dîX038^ˆFÀ«µ8Ù•nhz!x¸×ÂêH]®HZɃ­å¯`ò—ñŒäÁ×ÙØx"0#]öÜxûöcÎÂ÷cèÙ2c ¦bL1øSÀ˜R²|H½8­(‡ë}œlç%Œpo/!¼Sà‡>+°õJp.d-ôWø€Ý£O](å î7ã<ºK¾®“ú%_˜Úõ# õêµBÈꦯ<7JlÓY˜dj=+³Õ_m¶`vªã÷" .Y­ìÃËlágOINÈS0Ëá`M}¼Á1û(‡õÃK…Ú©ñzX4Y6Ö9/ÊÁ‹ÃÌÖ½N™Àâ|î¥dÞÍ‚9€ÏÓEï¶þ8®/ó°—”RøR¸)•¿ú ˬÓ>ÍJ)F9¡`öüÇâò ”Êk,–¯æL¯,eÁs•âEòÀOú’°ÄîPLÚ>•ÂWªü7F[8ˆ©¤àÒ?i0wà‡i0E™X6“á“™8$]'Ÿ¦”«H·.`YYí^¹®E܉Q*ÜQ‰/·ÜÍ~ZÀÿQŠ€ì4°"êöfN%a9™“©KA’Cå=ágUè[s’;&˜¬/þLDE¶J„š7ÅÄDË›V ³×…/à_)àg)…õÎ÷àÀ¨,æT q\^W„‡ÇëæÉ‰ÝƼÇx…BèLur½¾ô¿ g–iW¶ˆï§iÙ2‚;ô’CÉrÜÕ(®Õ>F¶”Ü%ª|¶÷¨ 1I«Y“ˆ&>{"uô£¿‚Tú|ÜQÐe|+kU>eÖ@§ó¼˜ H¬ÔÙ,ÚÚ$ßÎÀ€\[Ç’×éX Õ·b™œÛU¼Î)ò•b¦bQî•7dŽWtkëÊþQ+Ì+úERˆ(³yA¤ƒ æ*\øñ3×ýÙûbˆB¸â[)!Ë®1ØB9]p_4Z©BÎ’ ø×pÒ¶–â<,Øw…é7Hf³úäÈ¢úôºŒ=#CAɰ6”Õrg®˜¨5‡y ­¤f›Çd[G² R ŸJu¬‹¢a‹LuGÇ p%ËjÝìkïH™I«@Ñí .6Ƈ<&€M¬+Žª)¯×²BöÔeõÙØ´ä$ &/øR °)«Õ…7övïÙjj¯õ:Cúfç¥w²—¦H¬N@mfÉïG†“ëª`Vja‹W«ü>|ª45`:õcLgp‡ÿ0ú +ä_ ™ºLÁêaJ*ú››ƒ*Ïë:Ĉ ¼^&å¥fAo+[ôªòÒYñ¼Â@ið"%¹+`e±X‘ Ú|@ h)Uxz÷M·rR‹Û­T@ª…b°t‚`bîÐ:ãN˜gæÒÂl h¼¦^‰@« _8ï/¨rK©^_¡(aË€¨íï]ûÅvïTËÓ)ä›ëSÀFP”·%ª”Ä }…õf´úöTë r©_µ»g1è­Ñµ?¸"×™{$¬& ·*–¥n¶7è7¡¬_h(Ú.tUó<’K²TÛ÷IÕÒ%V5¤«Aq|b¾Ðc‚È¥T—}p‚Ñû Œ¥þøìûS¹s+MJzW*ààWY­Ê z±XН€·¥8"Vo> 3°Xâ9:ŸW£èv7IOeÊj“³<–:ùR¿ì¶¨“çÀ?Õ"U¡.ñœòñ Ûë]”ë 0Y¶§CPÚ{XÇk¾n÷£þÌ}ìWÞ,J ¼Z0|¹`PÜÂ|Ñ•¤L-WØ@ðú¾ %½~#gé çúOŒHÀ ¦ß½…¤DvA°µ(aËÀ_¸•§7°ß”S[–Ëzð$çª+µó)ÎUWjæ…{?€>…PãÁ0² wªœZèT‘x–§Zæò Ë’Z3xí‘bÃÄ”ýiUù S ,Ü/ëvQËj¦C 1Ÿ¿þØŸKÒT8Œºà])²OŸxÚzO‹‹ì¸Ä'¾¢ó“!rCJä7‰^}SH·8×!ôÌ«¦«ó³4©"Á5[ÄÎOêõô ¨ZмõôŠ…s†Ay‚¢\:o]àáóVQä¾_îáô…åëÈû.å¡þA Ø:ñIü,à¦X†å#òîMŸ«å£EÍ|õ°¡4ë«Âó£'ßf#À«}ÅŠ7£Eëx¾n€‚÷( ‹ Dì’rîPêi6Cñ"¿”»eÍýz»3w½Üš”6—‚Ây«mÆûJõÑk'>Pò^xž8¸,?{W÷bcŒÓáM=ÜŽ ’ñð4ѽ*fV…ÙhÃ7€‹•nð‘¬vqçï®% £2Üø^{`õ?ŠŠBz8¶¶lé@L[HÝ2n½ µ^5o„>/ykh6 ®¥A&—Õ¢ÏR³»sIŸëqFÍJl²Àç¢þñ·bBiÈMdd„d>ÉǨŠ[ÚÖ4ÁS@üR€g]-íW¾”Ãç‚."spÄ´–uÎt=ÉÒ–Zd]Jû[þ3°ó«˜4¤?ÌD R˜ÂRƒiImaÒêLÞ%ð4äÕÅÅðf¶L ØPVë*)ØGJ HÐ"“½  êÕ ŠIsÍœ–ó1·Žïæ)*zÿ¾6H¶–åíen7X´1éÏÊŸ}¯“í-iù/›ÒB¶{i%ΖB©š´à~€âc5†r+ }ûq ´Âsß]Ü#«íÇõA/2/ݾV‚'\ÑNVyêß›ÞP(üÛÖí{yKEéoõ¿Ùkp·ÊãèMåÔnˆþµÚ|˜±ýnÌ…–y’sþ³Ñá ùžŒÃ"C¡†)¸R[pÏÒˆl7…' –ã|Ñ,W¡nÖƒ² oF­¤0«Å–?%Ë]:ÎíKUj0ÁšY† N‘ãñ®ÌÛ½P‹ÊãbZ*oµü ü~;¬žŽŠŠpY=Hv=a2e€o„}4/¥ÁÚ:! £)­»w-âPƒ`¼Àr¥'£‡öUÈqY.uo;­[o¶¯kÙ«Ñ!u¦ÒaJ—GëãL‰ËɪÄR{iÁ¦•Àº¯Ê3„÷_㡱RöÎ- («ÝÂ¥0‘;Ϻ˜Bnû©ï¿ ¾õ8÷h°ò®ßèVÑpØ9 Ñ¶ºeHã®I¹ßh›ªuà®L8C_ŸòdW¥9Ÿçú7ú÷òy–6Ù/ÈúK%YéæîE~aúçÞOë/¿YQÆ—k×SIéÞ¬€§œˆ¥Rå¹N_UÀäUÍå-Xö º§°AwCÉl'‚¿Þˆä3“ô¤j&ôƒÚNˆl¯3ÞýeÊWKøF¿Ê£îí¹§Û7£¹Ot”¯ß4ùÝù½‡ }«sf1°†«Ý%ªÔ7â¥ê¥½—ðîn¢Œ3Úb|25<°ËGoí šS€Á¸¹}c(Êô‚"ζ³N:.ÎÚ¥ Ð=D¨&áïRéU4-Àw’'¸öqVnÎÄKt~\~Q–j`$Ïžàžwîðu"$W7ú „B®÷zéîmø(9ÞÏ­î0EÉÕnÔ¢|þ6[¯#F¨£a *Ÿ€·Ýi½ð/‡€Š§ô˜(xé†3:&¨£ç™I €úë5·÷Ew]6†ÕÀoÏ·0Õé86:4¹.ü7ºÛ¶ ™7‰t)¡Ê£n3XT+ÁË èýk¿T;]ç¶#úÍ–Œ€“b¦s ƒóô «¥‹±ÃjìþUo b¤u‚ç$ð#È©aâdö,5¥À¦nÃiÙg ÜÐÖan'Ýæ†BñÝqÝ;»Á`ôÇö1@êL¨oïÌ'Y]t<"zï׈ÝSKï_ IŸéàíŒÎìÎ/½ Ò¡C!s[ÕâåÙÕ;ýVÈ-ðV­¶ÿ)+æ²ÂmtÔ¦ïWÉu!Œk½Ô!–Sqw#²Àß;`Žï lÈÍØqôu˜A¿6¦Ûù`…)ãóå3’éj&âuò¨<à…Y-ÂFjSY‰?ƒöiýz6ñú—ˆÿMÉgpʈîßãFÒ N†9°AjÐN¤¬9•½$¤ÒÈ®‰ªÊòºV•ùE!÷Gœô6ÓsœY,n[ü­b\.«Uã¬)Ô/à)Ó!p†Ú2`­æ—¶³]5ñζ •ßÍuÔ|¿€zà)Nù÷ûOªô·Œb¡yx˜®Î7@L'eÞ•"›!‰@þ‚M5º5^ "Z¿B8c ŠJ7äþ[k° ÐqÔÇ‘ƒU§†Zé€Eþ—Bþ˜Fð'ó^µñ ^Äf›Ðëî«ö –g;T8 !‚„C˜|ÁM|1eˆ§(ú¦ qV®®¡â 0pࢱañ¤4áû(uôñ”>˜æ@:¥2 Œ«Ñ’%)¡°Qu†ë˜Ü0oõ$ûÅYZ¸D#üy×.JgÞ0Pn>¤†%¥Qé‘{¸•‚_¢ß2Pƒ=ìDzr\˜†Ã¤?¼zkWÔwûMªkÀÝk>ߣ<^2~"… Ž)¤ƒÙ»ñaƒ1ÍýÔÓæW„þr|‡ Ä)gÁj®2ö.M5‰œklÐ9åµEkÁZär*IEÊoÇùBý2Y|ÂSíæ%íJaŽçmL.!æŒ>¯¡¾”ÛÁ¡ÅCCQ'â(D1«mÿNÏë×TO£²Jÿà!|ÓÉ#{IÁJ›ž/¤½Tb’·„:®°\n'iCѽuêñ‹fÍœøøÉ"²‰ÿæ™è¹zNz(òö)°¿L”ù±¾*í¢ÞEi¬!iW`²Ì›ˆ@‘Þhs8¢Q„½ OL:fê2fµô0glTð–\[2QÔ¦[jfêÈwÛOmöÈ´=á…|9eB’MI0·¬6s éý¿ | Zó/‹ê%%J`z]71 Iô8ˆÍt2dJ«e&Û„jcBs´"¦– ¾™ïr¯ËjÇ?"ŒqÎûå€ñ9…&ÕøRf„vL{ýÈZÕ­m:(öõïÂwS‡JýB6ÅT!\s m bÏË)â9àŽõd¶@çnÊ&096#L=Þãþß&Ü©_z`Ä2õsÏÁ®ñnhõK·£·*ËŒ¶îè­p×ï.j+ÀTlxBá˜85•ž;ìYQl¥~,¡{6¿³qöß¤äªæ–¶WJEþj«íƒõ×¶Y?w+ šŒûa1? Ð Æ—ÕÎsÆoéÅzkiT2õ+ùí_á¯H™Vx~pRRɬN£ÿn(¯w!`Ìóy’â"«l‹Ìj㔦$¥gü4aÂK59}Î2 Oç[›¡‚Êeµ•³ ­üß‚ÃúqÐEÐN6ß<âô s±W\çéóÚ¹¤~AFý‚?šýe§MÕŠô$"5:ûÀœëGh`ÙKWx ^k¥À{iaHUì%'p®ԪGë×衼SHYÍQË2ù“@¶ÎrÂU‰gôRÌ.àV8†‚ß[X|•Gââã„je©šÙ ‡B”daõ3 €3^Õ#0Z¨E÷8+ÊõJ;>¯ÒñøŽ)¬XÄ{¡„¦c×u äÎÜe „ªj…ßa5½-ÁÉs?=ã¿1fããØé’®_£lD¨¸?÷#¢0…v ëãñWhò°¸H®ÑA¢³þWÐÌÔoŒwCìØô:ðÑ·KD§t¾è-­àf©ßC›ŸŒÈšæz½Ó1i®¯ƒ7=£ëp;£<«­S8[Ï’™è:kCkôÝ¢j²K¬·;"RA-SÓ÷î|éã¯{†Os¯L‹ìM_ëMƪ ™©šµéJ­f¿†ŒkròW0ɬvouÈÑ«Ê03«²€(Ãq*¬05yÌn êÓ `Ò9^¡‚r¦z’ª´¾¥3+Rý–]„ âÇp`º&ˆÄ¥Da¸€:¯‡[¿|xœ³N€í¸¹­žP5Ûnz2noò¯QUyb¤{>µºhŸW˜ßq óÍØ{Æì2L45AÚ­õciWήÇËU±²n.ƽé#2á³bû[‹´þëJŸº ¡*\ÁBSSáíÙ§É!-øÄ–¢>˜%-!G°ÇI¹Ý+¨ÌXX±QoÀÛ`Òk:çq-j]¯#³¾èÚÐRG²V0ÊÔdnê¡üôoùñªt$‡Ø½jÉ,mÁS20)$ñÝ*ÞZÌ~© ¨©)`K+Ã5‰Û/Q5…R¿<žG<•Ù)ꋺ›¬!ŽHØšÀƸÚA¤±Ž·'fTAISS “»… ÑñQ"a¹b¢*`^Úå‚Ü›^jnz©Ù¦'Y(ê¸è¹ì2\˜Ù“곎ûW=»§#kIT%¸Ñ¿îÚ¢ë@ Ÿ¡aÌÝf]{†¥µ\“×c0°•wãí Í΀7 €ðRîVð½€@*ôýü™`1øƒÆ®ZLò2;z"ÚÉg÷ ”—›½þò¤CçăÏÓìÚ‚{]B§=oŽ–ìñè'z‚s‘TàÄiì%v‰3'Ø­ š‰R ò玢Մ8U:®M`jV¡‚wfµü·v*´bAaF0J ¬5ÿ†øq¥-ɳyR…ý¡{}ÞVáŠt˜ÊµtVP†ÌÍŸ6+zjv•Uw·Ñ÷ €²g©7–¾˜ä…š£-a²$òfæ–z’¥™†\«tÓà±oI¹k„(¯Ûµ}óŠﱡ©v†fNæã3~ízí9dM˜!p `ðšÙÉ_4Ûå5ƒ•À&L按Œµ4ñƒð3í@ó×C[CÃÞ/<´•nhcn¸,öX3Ù“1*ÁLB„;?–'ècV›ÿÚÒÈMS5¡'Oå…m4.m]ÏÅ8¿ÐÓu¤#k‹r<55{Ü©z¿ÎbË—/FÙ£¬9ÉT'§á‹=€{æ•­³ê± -Éäˆqxü*éiNg!e3—‰H3è/¦ï{8LUššÕ:L´ Ñ¥YÒ1¨7ûgY®Yé?ߺÍ5ÃbÌÌ`©`·É7á½öDƒq›=5¿f¾º–š)³5[^¢h¤#z QŠù’gª+Á«Ü©™êüøPö‰Ë â%“züÇ|Û½r;׸‡™f¬rßÍxOð>-ní /©×ï8äÔ4?ˆPäî&ðh‹Çmù˜ùí-àùs(/“ÿ³*Ë@ìnß™±lü¤A3Í”ÎÁ” â¡+±2{Á5íÙùþËuÄûÕ‘ÖîÏ-xÉ«õBW—H-C¾ãk‚˜ËG%Ná²ý2ìÃ<œ“¤"˜Uó•05Þº<,ô…‚Œ:ZM ³-špÐm¯‚!83°xýn©î3~öÈÂÌ⃠mÓöót´|߯>Gì‰ÚþŒüò  \ÖIõßÎ4z #W$òlËî*²Ž+–«í¦b8s“Ÿw–Ž& ‰© dn‘Õ¶‚¼xž2XÂÐSñ— ›´¤ËIô)ÏØX¢ÿì4³|÷Ö]„IÂô×–à“»[}æí-"­¾ç@‹ÉT(Õ OÈôòúbˆ`Œ˜F²÷mà¸^¹c‚NFëýÛË#¾„îBk€¼ Ù•ëkjb¶â½#Y0¥XÏÆûñ%  ¹Ó¿\˜—̳‚0»Q-¡¾ë ã$n<ÕCc ñ{Ȥ¶ WHkõ¨ òf€zk=T°¦¬íå©€…%­ÇIH¦a3ºƒ‹µ@×ÿbsüО\E~x¼»ãõÌ›%{ÐÆ®9bêp<ý¹WVHÄš=hScõŠÛ•ºûîëmùÒDŠ±Í Æ’³(P:âN段°}*WTàTx…ò}Êë}‘¹Œ[þåÄ_¿c óä“*õN´yA*µÂÑúSS¸‚½¦®¯Áñ‚ÛçMI¬5ˆ–šyȱâµ"Â[­2Ó²e´îV ‚Êlíùµ×Ó_Tý32kVÁN³Z/ö¦@ч隺ymPNPÿB?•áqL9{_?º¦•ƒdÛAU…Ë ›ZÍæxúò§©e¹Øtuȼ›4ªSÕÍLÃí ¯Â1ǵ7ðC/´}Oz9üZ©Õ2áï±½ç#tS¬×Ðo€k`}®«B‰«f7)°\ĸq¨ çž6°bT°þU’Øäí«ð´T¯Ö[+fjÐrı]U£? š2B=՚ƛwYA]S++’º´VÊÊáaöF"¦ìðòtøÀP„øt ö“ÙîÌÛò7k+Ä+D\ýÚ¦6¿çï.5Øz²rµl‡+—b¨Õ±Ûº¥.µ¬Ú|ˆ47êªÝr+×>¡h¹é…*¸nVÛßb²ŠäˆJ‹lÑýÝ烸ߢ}-ü?‡e¶Áf*$œ8~+}qõà×!¡wˆ£IH^UÕÌkîbþÆ4 š*@•º™ºúp‹<~öR¸î×U{p!Iý«2yd0Ü(‡Ù“ûPûÕ^Á!T÷06Oi¼ÎFY_ºú›ëorƒA”ÎF<†+é¶7ñ&…ÁžñG Ì4•Tõ H×y^$$`(A^L3´6•ú¶ÚøH@•³ªvõÔ‹ úS9Sõ]¤= © ™ÂÁ#ÿÍqNu*›ªùÔUB ¤Aª:ë\›wU°ºíïíMÌ$}Ð#¶¸ÕJ¤Ô%`BàÚvw/~¡âê¤ÏÅ—AC•ä“6Í»aôýŒŠ'øZêq¥áÈéfuçÖž –몘‹{n4Û‚FÙÊÉh“-?ê:÷£4ðíì¯b‚ò£°ÛFÙ`äÛꃱh& ‘GZ½ì,QÝmW[åUý8άêB¤ž¡§{·$Ý+ë§×om“žcx–Ñ©ì“`ÓÕ}oD¼.™%(ð~‚ã¢!ø| üêŽð±{b¡ž ܯ£m4¡ç©sžÝZlá¯uÏoØ.ÇXs~‘]èòE6DöZ(ÛÀÞ¼Pk6Uµþ/ÙøoµÈ Á,ªîZ`+'¶AF¼T ®R‚ß¼65ðÚè6µþ¾}Ï…'Qù9LmH"á cÃõ_t¼»w <µ…ÆõÉñú!‡±6„}[Èa„ìÐCž¢«Â%¯¿¿ãAjy^X=¡1îWtn=û–ZÄÀz»ÿ–ïÑA@ü»¶Ò„Oµ‡MðÉíãÁ>¦ŠGk°3 ˆÌF«]“ò³)Z€wÇÑ‘!÷ø i^4µ¢A +¨ÃT B­MUÕ!±9ÃÕ)ÃÜì =x:jÇ'éfý1k9Ýì•Û‡ÙY=¤‚*§vºQÿÍWèÛïæ ÔôðĽyÐEX„ZQ,Qó¿Ü'úûʳí2¸ßïü €‡w9Óªä0Ð ãBà¤#4uêkVôÒÙÌj“oÃ=?s7ÒoåBl/foNlåÛ*(ñz9•Ìæ}:ï?,|èÃvøÄ ½`n{ÓðÞã<¨SÚt`.¾4Ÿò±k>ºq"¼â^K½ðÉ$ÊÑ-Ÿí‚u¯_¯W÷çFh³s8ùî• ðÃÔ^­„’JäV5?!µ" 'òòªsÚ@Õ µªaBök 佼ޤ'G‹±¿yK9b‹`[ÃåìÏ…’·ç£ð:È¿è²KwÊ7] Õ93OQÕ¼‘+ߊ–5ø0ò½«ˆ"×¾Áx>äŸòÄ ›ÆXpÇæjQ‡¨é-Àf3¯'j¼ïêù¥˜¥C uâŒ5ÆB¢ê¸Æl½&Åvc8©Ÿþ;]ណ¼ƒzÇÀ)£í)ü¬9$›ŠUPº±v Ûé ¬œ®ˆâ£æ€¨vìÁ…É×U ”5«¥bÑáí—àÉ©}~ð ØÐ߈^d©û$Ž‚:ß:8¨z¨-P½ ~gX< ÀY-wþ™ÕH%&‚ÅZÂxBæuÙŠzH=¤tâë0ÛfZ¿R/XV •°.Wóa­âô6U l¼ì±8êÒ eo€Žep+‚muxQ,õ„„Ç•JS5ÉÓ ¬Y-O0r‡ ƒ5xÄY'ê¢sÐÓf°õ¾`ü3'ÍúÑ=F#=|ApZéq[°¾yz[hdÔ:o$£üÔž#][9Äå©:† ìÉ£¯¨©ô=è0ýF|ã|#Ôpëâ a¯KMõؽcâºàÞSÁv£¡µ½1æÈ‡sæÇC3 Fùé/̽±«L¨BÓÍ‹Ø5!Û¾Í*èÁâexL†§ª`£—g¬øÖ{MíæêœËË‚Paý}£>× ¿‚´"V^äÞØr\;Õ™l¦BæQçqKUÕð.×Å@Žî0¹wÈ8M¡e/ñ‚™@é¨ZœgM!íò=°ÚÁy#g±ƒ>ÇÀ£òÎxKȹ!Å(‰Ü—ØþxvfÁB”Aå IøJÂÖ$ˆ Eˆ‘³}(mM;ɤ)rƒ¢€#¤ƒÕ†å 8¼Ë^¦PÒGÈG%U”ä:Í<©¹`‰‡<q‰ >z{ña ÞkÛOt¨ãò-þˆ‡ßþ× 8ìCG!µÔ®P+p{3øHÀF“ÔéȬ_·Úhçùo ×®´Þk–7¬Œ5'ÈsŽR¹!±DÎŒ°R¼H"q@lDœŽKi>¤ö ˆlêàæ­,$½Ež?hklpÑQÆåÕݬô²ß•ÀN¾¥:†43õÔPÅ I8\—Û©ûÇ(æíúG8ïTOÀçÍ?A´ˆ×¼¡ê|Äh:´ÐÓ´èýѤg{F´ähAà­Yí½?OœùýE>·;ù\=6&¦›ôˆ:•æt¡¹…•3KÑêüžõQü´Öï•ß+mVÛœ™#h™L8?©3¹Ô,ǹÎÊv” ØR°©›nl/Epa‡³©¡],±…ñô´w!™á³P&ì»év_Ú‘€ÉN“±´¥ú—×¢U°OsW#ò…pèiêt`¡þØ…%œOѳ:ù}/EæëðϨé/Áv3Íj¡‚¨02]×(ÄÁ¼09Ë4ëàuŸÏÊ–¾ñ É<9‡ ;g-øëFÍ“v0pVKÛØcâPJØ 1 œXÁ‘³ò8qôÆaÄ!‹¦„E‡}xJA€Ši !PA­CÎeª3hë³ôªéQdYqœEÜü›H þ¯ ÛnZ.q_MøúfKîé‡ÍÅ5뼋È!«Z#‚ÀÃU½jd˜;Šòwµ!ØTÛuœ?(i³Ý6XhV ¬¥êºðìW@d¥—[yš@ÃÌžm»Òfç¯Ì³ž·3x>á“Ç!7Ý%Æê"åD€vØeêô’å>|WQT­È³AA®1¥é’üš fGfôþhAQ€¼)SWŸŸMí|žyi¹Ì(ÐÏÔ€‘à¯Ó¨¡÷ÔþCIGß„Õ693Àãw²Õ`MÕ$ß„>ï¥×D‰N´^GÿC°ìP0%ú,ÈÆ{hxözvª—  +ƒïvêOôgé%å¿Hݺd´Oô^@b#‡žfâßí¦Ð6äû|t WR6m±uÖ_EÖvìÞfGÑ(_òxšúÊä‚mQ9“vð²¯%éêNªùÏžÙª›ýÌŽ\â°?±!(!Í1AcÖ!Y½­-á2â©pc5T[Y'Ôûžì{6@l¤‡0ðy†„wñÄ ;³Ù¢¿†ÒëuüÁ,-¾nDfêc^ý+è_¡fš± mk+«µ›ôHƒ (|ÅêCU$¶ÚöGÁã.Ê¡YÞë/ /ÊT“Ì.Á¨tô Á ‘_Ù"}:<ÓÓ<,Ef§%Nižµç1–° ßÕWàH1éäç±…€ª\¾=OíÇL0-Y>¹t?k~AßÌÅ”> bYmº=Çe?©q0¯€˜ ßÉ]Y"î䈃Œ»¾©à^,æÄ;ˆT•7$ ¢‘µî;Ù,ôOt¢U~AkîNæšV1­¡p߃‰Ò”/îJ /g~»‰âÐzüýªCš™Õfë¾›/ç R0Œ3‰;[ | ¹Ç˜~>ùœdQ@(cµŽZ<¬Džfr}¦ìÑWU+†¢Dùg´}’CîNú¡ ¢}›¾aý{pç-ÂNÜxärNd+öhxΨÉÇgxÝý±K ï lB ¨°ÏˆÒB\R¹;¬3å•*£;›¿Ë|Ðîwùæ­#ì5²yüäfÛR&}é/)“>¹rI™À;£ý :â[‚ Ú—Ȗ·ÖÖájÓãŒ0Ó¬ã®z§aDœ?ÔŠØu<¿§;ØuÄ~lí6=Dw‡­«FZ†­õæÿ±­-BT-VÝž{\ȋ囱p+È®ä8"¶û¦*«s*ëÙ¼•Å­rªìg{_(Aºž$²°©Í0Ôuj¼/est7’8è…¿«ú:ͳ—ÆÓ1/êÇÔMŒ$¯oVô`?‰’ËÔ“¸|¾,²FGãCê÷ƒ–D£¯°Ã…-æJ¿mq‘°‡³†4åAÁB I—à›¼•íšiýc Ër/üzoi”\î©wàž’cÞÑ,üNfçÁÅi£T[ìéÞ:ЖR/Aê%©}±þ ©Çº|þÝy;rÀZO]ä;Œ‹HÖõ8H4ÍÉ:6Ê»¢š.#^úk_S]\ê?ãK¯ ùÍXùSç;€èŠ8^V»—ðî®^Ü'àvÁß¶ŽxÆÍzWqŠžýä^Ùþ;a»‡˜ÄuF3ТºÚ¢Ó½Ó¥`i7À%¢$Aj%[=¸Ä+y¶ä³‚”TÉô$½uÞ'ѹ íE07‘½3ý Ÿ +°R¯w&?•×/PðH2fn¦¿¦îºÈQÄ©éQ–ª}fÖ}Ói¹`¢t3Ú>®Jp¼XT¶o’=ñ+ Èbä  ÐOµè¾(eEYo´5í>A“ò°&r¶Æ“ú  Ym>g ¤Ä+¨¦ÇMÖ.”ù{Ü…B)qíפëÎ ŒÞÍ-vî4Ð2Y­Xo*ƒ®õÞ®ÀÞ”_¾uɉ¿Âq!Jf£¹®¬4„R}*¦u:{© ëŽ rÈè…7oN ä³ 3P²ã<Á‹P½3CÊå̲ŒêOïÍÒDáÈxñÕ×êj9ApC² Ù´mÇ>ŠYxî$gÇ_´Sô7œaxoÆ8üú[fòÿî¤kñ¨°Àû…`Éy*XOëÅD_áj „\”&æ¥^[y³ÁW,£ÂÓ§›mûë:·€ôG²q“Ei 'ȇgœÔ?,¿Ê;m©GC°H›m|ÇYRQ#ºA>g‰èxƒ}Û3K6„‰É±ÇËéGu¢Co[htOòåó‚³â¤L0Â,ðÓÑŽS꘭ŸâÁUMþDtÒoÍË/åx#ßG}éªè€8ÏV°ûô¬çëA扇W ÿVx@W\g}®áóÚ~¥¹bª³h/ú®¹C…ÖÞù>ëKþNÅotÿüU³äÎE§Õæ;cCîÌ®U‚³E²¡[:k9VR4ÇÐn±…Áª 5“]’MصŒl• ð!Há‘c©”_ð“(Ì? Øf$C fµÂ‘ëüËM¥ »9Û ²è(nH-šmzDw AŠa [FAº` ¢ÎždÏNÑ âl×õz–€Fò‰j‡ÕÚ> ’¬Ïq1úã¸$³/Y1¥G2&A Ù ¢|8zèvš|o|è;6¿å™¤@ð„ª]wr(Ü¥ÀÔCjf@ž@íjåÆH)?†øXÖñ´ß¬á/³Áª ÛSéô0{#Y«õwéeíß >Dôå)“% õdë;+%’##Ànþò¬ êËË1¤@6# ›æV[ÐÕhH¤:‡ ÕMQ=W:l>±t>°ÙbŽÐ•ñæÌ0úoŒŸ)]%ƒ´]¾ææz–¿eÙ¦UáˆRV˜‘¶·6rXaø!1Ü?±…S)ž‹(à @ÊÁjêgŸÛ›‹d‹"ص®pø…€ÐEŠçói¾G\‚]Ê]yïq³^Ò8$™N_„¯ ϦӢ!c<(ò ðÉÓèaU][DAÐÖí8PW|wé Íü±%QxëÏ—€šV îh8Ù) •½õͤ@æ¡fQ„ÇðA…=›üzþ§.掄;š½]ùÊj‹ãÏm#ÌN:øX×ì¼hŒ9ŠB:¤5³4¶GDSô¸Jsià Z9؃X©J@Fò¼é·™g¥@8á'¥K$¥ñn.H 7†~ùé­ÝÞ‡jjGW¬ê„fïúl»ì©ú"`x‘[>-ÚH¸¦wG 8Yþ#¨ ŰŨcí)ðiþJ1o©LK)!¥]@f#åÊ?Ù ÁV±„¿Xï÷NùÀÕõèã| §ÙXȬìó§|¥Ï…ÐÊŠC\CbÿI(’ú±M?›8žùö‘Õ¼e$ù3ª õòc"ÊZ@#Õ‰ª4(†8W\éHÀ›ôTlŒØ 1UYðÕ¸ Ð"ƒsW®˜õ(ÍJž©»:o¾cжá>÷‹„$QDPÛ𰘦wí— sfé JÏåjÃB„Ù“x¥W cÙÚh ݧˆþ¤"¦–©.uËðÒÈa{á'äï¤Ô“ÑŽ×éI‘(ÖpuqÉK€”‹ŸŠe2|½Â… èW¤º£óèØSº–PØÄÒ¬x ¼VñJ÷z…«ó„îT8¯ÕqE”äÅö„Ç ¥¼Dù]ä°fF£‡!V¥“àiq‘íÐYµj† >à„ƒ…«-^¢cÍg~šŠÏepq?¼µÊò²YWªêõqbV:,ËÁö ¨UV+fð=¯É0XuÆuÌtCjí|•M0¸H5™‡Ôü“C3ìÍä@r±T+„RPYgB*¤iu\ç:‚på *3|º̶òÖ.1(=˸ &qgZEtZé\jÞµ;Õ•¬(­K°@¶ÛR©]îý”0Rû1/˜&ðS Q”§å’ o1‡UâÀñû 4ìd´íó{¾<„ßš£ÖîtNüˆ^yk®Å“˶&•úN»Á›<PR¹™2]Nw Õ·@äDÍÃ1|M^aûšªW_’ £°šk+%dàÞ9ÕM¸tÀvÄÂßž\ Sâ-Ô+•"jÇþîrS¨ÀáèÂdžY.ç2¨»ŽÜ!8PxÍÏÞ:`–ïþÅ=ÈèúñedµýìòG¶ÅËC' pIœÒà@ã mø&‡„#Î#æøÝ»þ)=8•x’e-kÒ."AçÕ5¥?${éÉ艣9±£{†úú-LN²KrºùvÌ/¢ñÏ’Šüþ" †*;³)˜›˜y¤Ð½ÌÖ£|½x\Ȇ•öªøÐ؈5Ø5®Ós» €ÅWKkU2ßc_ø;w;°Ðˆ˜ñ ‘-{LWÖ BPN¬xXÔn¾’ý:B2P‚a°oÕYoÞ(6jŸ;¼bãS1…¢Õ0_WÙ¶ö¤ÒÚKŒHµ0™+F@"#§Ì¾(§X½`À‡ØóEñ>ÖØŽý ù‰e“E`’IØÙâC [vRæ‚Áçè}‰:‘3ïöÖ.òªö`ƒ1Vß=ଆ¸· 䤴à9¢zàÎVøAÐÛð}3=cÒê_[¹4Rç)é‘›ÆÝsönE(GÈPH lʵ—Ÿô)«}~"΄)‚ô/ ¦¨ÀPGs{’äJôó‚Ñò¾3Yhž“ÈOÌ`+ümòí¯"„zú…ºÁ]}6òÐ]°Ý›Â÷¼  ìD¥éhÛÀí³ICVEQ‘@(¦§Xù+Ä@j  à/Ρ×ßrsI‚Sžð˜XV[é%—ù väŠ$g’€bF*»À1,äÄš>2=P)0Ý%²ËÃî’8 9m€€ÏKŒÞ…j|Æ¡-RàÇ®<Ë-ŠÒëÙ¥Rg[7 ÚÇÖÌ@°ÁæŸ*ãÁÃ~iרtlÊ'¨\T.ÒèüWî“¡` «›µ·ˆø€cL¯¸&±z%6 SS"ÛìVù숴.ÒãÝ^8Õg¸?­ù ï:„avјr¹èn@ ¾¥¡ÑœÃö¸Ì»RáWõ¿ËåBØø–i’(ß ÷4ÝËjÇñ×ߦ‚ óqg†H÷À¹Ia›-«Y@#ÍÙ±¥ÁŠm!Ã/3¤î´LÕÌaj¶.ßÕ¬fïy+? e™å«ÂZÜ/¥šhì+O4©ù <(— %íµå7Îs‡²ås}Lê+U”‘å‹¥:…@”ENÍó“Aâñ\Íäž^®^á†zëöW7Ó6x¥17î MO ˜•ç¹k(9ßœ¹œØæáélÇ^EõÈ—û¯…ïF¬#-¡I»þR$zã¯ÏÁÕÀ®½. ©Z*„nÁÒ²ZŠ?P-íUÇ5>ûÙš¥]LÐ(Ú«'̳RIÇ¢zß¼&Y‚ø:òሽÉöÓ›ÐÕ:q:nrVú¯yiÅDóc%Šu £u/¨^D‘0ÑFBpg¤~oGªL ¨\Ȧ9u¶§Eº…zr¿â¥Êáòãùf C«Nü›G‚G£#Vu矧„4ŸÑ¼„¤ôüë—î잣üEÆ%=ób¯¸+Ýrûàܨ§ydÒ’Éí9Ò¶ϬêûÖO ‘½Ðñô}ÿ=ÞšîóóÙÊÙÖÖ† *Ó˜7†¢ $ŽmŽ AyE r¥r¹ ºý<Ž)·ÂÛ—|k…EÎÊà\å @üm.Ë‹¥áãËAü÷úz§Hæ36È“(înd׊þrF)µ{ ‚Å=B©.8–œš¯àw¥jÙs´2ÂFÊr“âŬ×éè˜%µïýÏâרÈékPyRÛî1×hfW:<–JærQ·H‡AÙ­C(0|ù+”Ä%ès,Á–¯´­›õFÏŠÁÞÆ?É  ÇÞ´z¶;䵯֊¦ “Îà`((Xäæ1°\íž°ôzób²{z˜M²…ŠÎ6ã…ÜÔÍi4·=‡¦8×k T]½ó®˜p‡[ʃí¸u;U.qgȽ¾åžºèÆ~5Înµ‘øþYCrmjƒàº!¿gý†}bcÒýLcÚ±¤ƒù}îù…B¿Í7nsóOÇmŸ%ìjævD Žy{È3ÉNñ¼—Ñä] '+TÙwl¬nóÀ²è”ß«Äe×´&È0P]½úë”ñ]/TÊqFDHcu6kt'CZQì²^W;ŽC*m‰»9ÜÍá[UŸàí ‰­×Á…¶èö†|‚‰F†3š XrÖc™Ø{âIQáž8xsÃg¨Môî8Gáó^ —ͳJ”÷zUä1•áüŸ2 óè¥OKÑ„,@Td<9 #óbn aÂÁ•ÕïݶWe­–Ãö!;¯,–ñ–‰2ÊA>"&#ÁÞ¥t!d¿¤Z€¡þ|ƒ»]F‰ wñì0¢°ä{÷LàÌäWèâq-Îr H§ÔmÕ0¢‘KnËPýuOÙìÙ îFï€QbÛ˜£ö£†4çªí/UD-kýˆZXѾÞ[ö¶tÇ¡2Š qûzÀû:̳rx¿ë½õ‰r¸Äí÷s.B$[æçí…2ÑMXIDÒ«D¾Lç?ôhÛ¯µVÙiá¯ìôÞuk É¿¨ÎÈð"ÎØá.3(Ž¥Œ¸ËDÈ[-Êê2çãæÐóYÉÀŽ$ïˆèþbÄP1[.ªÝØ_¶††’ApÐLN燘Õv†5P×[n'“ú=³Í?‹Çã÷ec¼~Zп¬ã{b@Fñ$Ÿ—å.ïŽ!kgÀJ[þ%¯—õÉp¨8ÿšl4X˶¼…Š¿b>Õ##Ì£èü…ŸßkÈ_S£®p^* ²Úƒ,cãëõbôsÞú=HYV‹I‚¬UÉî¢Ñ#=YsN¨˜ ˆƒ‰€Úd¶ƒ‹eÄ4%x hZdºôau&’1°À´ëŠxöÅ-@ºÃgzÕPp\ÈtšIUo›s#L0£”æ5çd&^â 2Š ³Jy›> –o“™Øú® úQ¯÷g›m ’1eœWþ±I ¬.rp˜ø7&Þ´$w7ˆpju-ï!Že˜efžfAîz3÷kÔ*ÓfþÙÖ­Áù}y †3 ûÆ]kB nìZê4ŽÓ­0ø>†¤Ö?¸2H¨è&œ‘Øz[Ò‚X«5±FƒÌ'¦©,.ªøþ¥bN8A‡Ö„èŽ4zŠÖÁɳÞwÚ¢néêì5Äèᬲmçè “Â3½²(j0衳¶ÉÔ$ðîÁ·=Å]‡Sè ‘¨æo©Q°¾>¯!¼‘¸ º%Pñ1Ö5o2™B0õtr¨Ëj¥xÃ4ÍE„ÚÊ|ƒ)ûa¥zÙebÏ$ƒÑ5[\Ú§s¶S…²ÑPxÅ"sÑ`¡¤°o¦ÙaÀ=“¨Ïê.£Éáèw<XaËÊä•ê ÌãמýÒNBR1Œ÷;¦ïi޼ƒÙ݋ֹë“ÃǹԩWÒDZôʯ¤ön‹ûL×·Faùzu¬Œ²/{tÁÈ<¢¤ó‡³ž>)z-æ$ªü/?ÕÙ—Ê øHå*Õ§Ë©?ˆÁô<ás‚_pÔ &Ç|6·(§ež5:ƒß”3rÌ®Q.¶ÃeÅZ]3í  ¨ðwA$8ÖI…~ ’§»Ò”·6o Ý”FÛ‡ôY’Úª™BõâÂãcÑ>"ÌÒÁ8 „½tQÍmJ£­í;(6ö`MA!<©{MN1Ü”XF[t6ñ¶ð“7°´Ï vÀ•pЇö9P ‰Š?–%Á±¨…ŒWÈGßOðh+÷2Ö¹Ò}{Ô3£ HÈò nÅþÍ{‘­#¸ÁÞ^&^m¹ýº$s¨÷2n_)æ@^GÎZ©ÈŒ2.É„ñ/<ç¶È[Þ¾òX›Þö•齬aº7ú¤ö:'uáL©Ï„XJä²v¾w¾VLHÈF.»ö=¢±}A46e¢ÑÖEcÓȹrÆ+u2=Y¸M™ZÐÍ'{΀XÈôtNêÛiÁàî” uëôšÃ YÂq4OKúÅò$ÓC‹ûinÖç"!ÎÑcÄýMN$ÁC<'Qm hÖÖ-ëÏ#{Žƒº_§3ª4ð—´ï Xê¢óÛ01ûc%zÀI¡Œ.®gæv¥³6°Â´ÏRä(‘Bˆ³‘&ÀÜaV+ï"ê)OX}ᙕ˜ïĸ¦ Æ.¿ü^ããZ ’)ˆ9`£|µì䊞Þ>nJ[¼›—TZXí£ÅuD»œøïBãetža™Ìsï³Lf xóé‘Ù†­í›ž±Û>J§é» ôcíÛfh¢‰ŒþïÏ“ˆá½,Wã †°:¬Üž=@§-}ß‘sá @º ³u®HèMúž¨Ö:’ÐVW|Çt§·Z6-¹¯F•V+À²ýKoYÔæ—ÕÂR@2ßS <©‰©UF½Z}C±–0æ)Á±Ð@õÑ’oH+v¹ŸrÒ¾¦TëÚzá(ñ‹âT§ì­uoÊ$µ4¾wºw̤P%©%(dÉbÚ[Aœžå©&’°®™3x'ùKÐ%ÇÁN¸‘ô™hµd9·éï”WiR¥`DÛÑÀ³Ú93ñrçà ³›Á’ŠZÊØÏöØŸ–‚¥óýg>Yí¡ÒÎþÛ%º×̽SlÁƒ GÓ¿ê–ÞÂfŒö mhÔCN½ÞeàPF+VÆ"¤‘50¹ =Úáúê‘=£C¦eƒÿ2ðã ‹ûï òCfµÆTÝä è4šžÏÂmñI|µpFŽ.„øj’ÿB5!P¬4Ï:Ñ“1œF†À[¤ lzÀ.Ñ1fPYÂ0@&æ`5‚w¦åÇj¶!…@BOëáÂñׯ3Ÿã’|×ÆÎœ–Ëa¾jlË )5Bç¾þ8÷^’ËCÔr¹Ó²HdV;B¯~#²-Á¨&cûîvÓèıÊPó²_ñý g½&X†Ý˜£Ý˜½ ¼¦ðØšÛ²µóõ*ˆüŠª¢m„€tÚC"ßÀ ³ÚôótŒƒd‹ö-Fû[vQ$qEáõ#†Ð¼a¢¹ ëMOwŸ-·´ìnPÇrš–aXC¥Ü²ü¨Ü9HFÐì´ì’QÑOCŒy—ålÖ WŸ§SfBoã-!C†xS‹`µýæ¡`ᩉ}ªŸ†àtSî NãÖÓËÊÈ30í~)>†—¶w™Á ÍîPmJ$ó,³Æk/ã¬1'þõÍä }vk1 þcõ®Ñ+à–þö»dçm Ÿi98S<]÷*<>\çʼèvK¼ÕuØÈšÑÆ.ï·L7êoy:ž=®Ï<ãZ4Øòwž$ä9éIãœ`¬HôΗt]>¶?+r²|ÙB¨Vé½á‡à ེF ´÷‚ÀœÇ¹Z”=Rº'ÅlYÑj©Uƒd¤•/ìÖçZÝM½aû ½]×’Q«¬\ÞWã@ÂÃ`×_}0ÏÌUTU!L+;æ BµLGƒ,r45°Ç´âÅ#Ô–­—ŸQv€óLg¤Ü7…wÝ‹¬@⇚~À †=PI_.?Mù[*j<û²ñP­¨Æ™Ä÷O8tTòW f°÷ò,¥ÄóÝÑÏr ¼3ÔZàÑ?ÞåV›V.h/´Y¿¿4ÝRn½3CwùfÁ6«·ÍÅù¦£5ðÐ(’£¦ñ^Ã÷a¾G!eÏSž'aä+hQ*Àép×%‚V D øaš¦Œòžxmqu™DÍÕɶ}©gš0Ô¸ŸzüðX) ·=õað<åÙ ËÌÁq£Õ>µÖ¬ °òšV\éV=>äóœ“,o¼Ó뤻K+ƒÉS^öÐËSzzŒÆÒ_·ôÇÞ™Vzf`åi¥ÿº@®ºÓM h‚ dÇÊî…b¤ê¥kÊ@s±E70ÓØBç²èxþîdâáYž‚â Ds»CK#‘·Y1›Ï¤|F?æÆ®¤44À"H6T@¼NPc/¿Õ ô8¥æT`ƒ–yÆډ²YØ- wØ­L‹ÆÐßRœg !‡Ó9’ö)F©§r¯ÏÇp‹Å¶úåß@\…§´"¶HÒ—yÓU“ôe!œg0AmÓÀ²Z¥˜ðÀ9ìb6’¾4Å4ÏÝ='&b„ ´ŠéQ=£UÌ¡+ Óµ‡×qK—Ô8½Ñ€BXïP8hZuNÛÔ/õ{ïèÿp ¨`Ú!£á´ž<ô+aœ$7Ó=ùg ÕY-Ƴdjæ½›/ÐÚ4ß¡P2áÅáiÀ gýUÉ£­^üÛ• _‚YV/\gä›dUjºƒ.òe‹½ñeà’V+|YøVÏ»ØZ¨Å7V5ƒ"h-ÓQ‹O$¥ótý~úq°/Öhµk˾r=ˆ$Äúc}.¡éÔ8ýöÚâPe Å Ç ùv´š«gâ£Îgxƒ¦<4½?‰¬,ÅUYtn]Ži‘X%‡¹‘XµM7}ÐÓùÝ×bë¡äØZw"V#¨çÈÑ”>æ §Uá3Üì‘L«í6»È<»\]«-,ÈVþRÊ*dZ ¦iÊÔ G‚»DåIGj;1YÞôÇYQÉÁÝ”ŸæUdšýö^x ÓmŠièùö^€¤&J,ðÓÜ˯óÒ ÈUØ©§zEâ*ãíäÙÊîÕ¶¾høð^W5Qµ¬Ö &ûµzó!6¥*Ú°d"XÖÜkàÍ/ÏôÞ÷‘w…ÂØ«Ã,­ŽÈÒªyP!U~ =õŸh1‚›³O<–†ÜÖ”¼üÚ¹côcVŽðŽ ÉÅ"É:ù{2/þ˜ôBÞä73ŒDSÂøÛCPH¤î|ä'·J TvrXS²š#kê¡ùñª ×vµ\kJå»—3¥RÜüjŒhbœ°4À_Ž$qà1ü g ʙۨ5§V?Ÿ°7T3yf¢­†)‘yí“Íßšn£$VÊ͈<¤ŠŒl ¬4­UÇÈ­¿ø¹úŠ¢íðÖ°è¼>ˆÉ'­ä¿'-Rƒ|ÎJh⚔嶂š´g&#Ù$ kl“€¬m•gMßýbÞgX¨E9Ò<ÖÍoþ&$Ukå/±u©JK(÷?EÀú?¾Só$kæÏ½„ý­Y CtH>÷OuVv»Íª¸>þ“nظ$ÖµzoÛº×5³‹asö!–$lMYl,v‚á‚tè^d^÷¶ž`ØÌVašC’õîè¸IÚr8z㯆#*¬øºÓïª}­ÿÁÑcFÒÑ‘¹?þå`¸³Æ Ø)Q?Fs¨œgQ¨œ¾oæõgšb5õS£¿™µ„s¶Âÿ?ÔeÂ9Y¹à `Ís*š^ÒiÏN5kOY&—¯_·¼›ü+ì*°àºg;žÉé•×¹LÜñ¥ÿ^7j3{½¸eÀI%mÛ 3mW3>sô ì”¸½ºC"!fÂé9¾›†¸ïMÂC…v$Óq΢,õî¦âÁk îÙ]n\ÙHj&ƒ"ÍgãÀ\ðzÍaw.}xš|iüí8ò“lÀò<¥}yc˜ñ#,6¸vÚ8¢ßFÊaÆIT¡ñFÛëÊPçྲྀ›‡éDèÚñ»vb÷²Šm]38dkus?ÿàÍ•!çÒª4ŽP½^$¦4mâ—¦_ÏýÃ&†îóžÊ‘ý=°¸Æœã5of_(Í[ ›ã ›#àDm¼œáš ûL™öN™ö;e˜Z³¶ˆ¿¶ÙÁBMÉrPnùž 1V9¸(,V¹ÍG13s]r»œv{&Ž6¦F×ÈÑÒ£Ý;`ïžÎù¦“øE4éè%|À\‡mO¨Ö-¾=í94‚0UK?im'øÒtt¶qs<2?–In!±UM½KQUòœ¿vBî&#|¹Îþ"¶\K]ö¥A¿Ô`_‚Ç œ<íépÆÿ$Ï“a®I6Ÿø°öç™dÌVùÃjÓèàmµ‡3 »o혗KÂ0ñ›.éGuQRSF?‚ùÁjÛ‰'by¸ÂTõ;ID‰¸p 7&Ôpæ¬SPÐÚþ¹\@ÊÓæçê³B ªih{ÖÍ-FmwSbkJ©¸ ’xcä>^æÃ­ƒ%­çú£2‚í¦ÍÂTLçØ¹ðØ?¹ò3Í{BÍí™0@¶›8øÁ˜;/âïæ Ì˜æÿÉùwúì=jÂA»§ÏaÙ±é3sP&<©3Âàå‡q %2êÖø fí>õ#÷ž¥9U6‘'äà,üA—"«Ó7/IXAº¢—3+ÈÌ`½9³ÂëM5ðØ´ù ®ÎG©nMøJæ¶>™Ÿ¢l´•v+×Ð''U B¼<ÍvðaJÃn’yVÎ#ÖÛ¦<óœþßi .B•ýƦÁ_=Mx¾ºÈóÕ£\³7ãŽúQÿÚ‘¦Ì°lÚçb^Ö`QžXö׌óóG¥ìáXi›cçÙ}]Z?r˶´ŸÞoµb6žs Sˆ ð‰3;Ã\ù™RÝã³³ÿ™S9_,Š^) êi3Â|@[´ý¡¡{¹^žrièz@¡|±ðm›1[òRhû[ȽÍè­UÚûL7ý×;ŽÇÀ˜ÜË¢1ŠúN)Ú¢“_&¦ˆ œf›ã×*(˜œéÇcZsƒ ó¡“ËfÆÁŸò¿çI^>Ûâ<}qoµ¬»nŠíß÷DTú÷=@lûÁk¯Öå-¤Zuö?†Æî~Å ¹(ƒÈy\Géçþ}#>n¾ƒ@ çïBîß–¥¶KôÏ3«6ˆr|¶.ú÷—QÊM¼ŸTþ» m¡[é™3ýÛÇ}Îtõ/…ÝQšÖ¡#J¹Káò?P²ÀöÝb¹Nbíòÿ’¯ýäà£ÿc‘cÿõ*ñÿ ì(aͧkµö瘕ð) SâÌ)峌yQþg¢Õ^}‹óŶ:ÂóðEKœ:1Áò…¥0ë;è–KÒýà|~7—þ±ˆGöN€Ì5l ÙKýÐóð¥+èa¢|²:~§ÀŪߕ|äGÕïßæ ÿ‘9?n,ý“²ÒAųÚú×Àlúìý´ököÏK7¬Ç¬ïÈÈ|F¦}ïÈNl)ŒŒ`ÚÿR`ïvW²ž?†¡‰ÃhÏ0´þCÃÛ´Ûcw%'ueíYívòò[5|ÑSуŸ—g]´­š®Ø€x'•¬O4ª+UÏOõ®¿õÛþàKìôô%ª&eGJT$X÷Ïk;öÐ nzý§’„ï’#‡R¦„YúßxèÀMG½ÎãkuÿÆY’<ÿ¹jŒÝ†qa!öÍ_Þ¿ù¥eݘõKÚÓoÑÏÏ\›<ýç¹Ó]ë~˜qŒ†å“Nr.õ7Ó/º–Ìüc HÄìʾcÝl§S}ÑÀ£¶YðNN ~¯©†œ~‚+œŠ“]°Ù¡Y¿Œñ:×i‰~Ñ™S«èÊŃ Mfç*èf´}DnJ¼ü—}]T僧k°q ÛtvüÓþæ¹ÌüÌ]eä‰7oû¤xªþ»x{wDáÀ=¹íÙÁ ÔoúØ¿>çìg÷ð}2=Â|êüaþÜFp<=;2èþá™_öJW§3Vò±’<8°"w%؉q†3DÎyÞSù+o¹½÷t®ï¾°ð“¥]bõ®™÷˺²Nzu=AbÎöO™‰ô)Êœ+ÿXäDÖ¿xú …^}‹ÆÝI zÊþ­o.Jj±[6æ$×dOß—I—ž‘†Œu¸p *®—{÷ä¥?€jÏéJJÑîòa=9ðy»³þn»å‡QÉ©<z(±ÅüOý÷8Ð0Cv ôŒäÇhËEþ–X³n}·×B.&KrÇ¿÷¼dbº9DÏ[ôÿÑÙžy-×È{m¯lßk;¯Ùk·£ÏÎcו’HÄu)è|ë2U Pw@VOPNÓÑr ûpÇ“‚ QÆžLjÕ¸ Bounded Grids. #C x = 26, y = 12, rule = LifeHistory:C40,20 15.A$2A12.A9.2A$A.A11.3A6.A.A$A24.A4$9.A.A$8.A$8.A$8.A2.A$8.3A! golly-2.5-src/Patterns/Life/Bounded-Grids/herringbone-agar-p14.rle0000644000175100001440000000267712156145314021654 00000000000000#CXRLE Pos=-24,-24 #C #C A period 14 agar with herringbone symmetry in a toroidal grid. #C Discovered by Gabriel Nivasch's Random Agar program. #C x = 48, y = 48, rule = B3/S23:T48,48 2b3o3b2o2bo13b3o3b2o2bo$2b2o3b4o5bo6bo2b2o3b4o5bo6bo$2bo13b3o3b2o2bo 13b3o3b2o$o5bo6bo2b2o3b4o5bo6bo2b2o3b3o$6b3o3b2o2bo13b3o3b2o2bo$3bo2b 2o3b4o5bo6bo2b2o3b4o5bo$2b2o2bo13b3o3b2o2bo13b3o$b4o5bo6bo2b2o3b4o5bo 6bo2b2o$10b3o3b2o2bo13b3o3b2o2bo$o6bo2b2o3b4o5bo6bo2b2o3b4o$3o3b2o2bo 13b3o3b2o2bo$2o3b4o5bo6bo2b2o3b4o5bo6bo$o13b3o3b2o2bo13b3o3b2o$4bo6bo 2b2o3b4o5bo6bo2b2o3b4o$4b3o3b2o2bo13b3o3b2o2bo$bo2b2o3b4o5bo6bo2b2o3b 4o5bo$2o2bo13b3o3b2o2bo13b3o$3o5bo6bo2b2o3b4o5bo6bo2b2o3bo$8b3o3b2o2bo 13b3o3b2o2bo$5bo2b2o3b4o5bo6bo2b2o3b4o5bo$o3b2o2bo13b3o3b2o2bo13b2o$3b 4o5bo6bo2b2o3b4o5bo6bo2b2o$12b3o3b2o2bo13b3o3b2o2bo$2bo6bo2b2o3b4o5bo 6bo2b2o3b4o$2b3o3b2o2bo13b3o3b2o2bo$2b2o3b4o5bo6bo2b2o3b4o5bo6bo$2bo 13b3o3b2o2bo13b3o3b2o$o5bo6bo2b2o3b4o5bo6bo2b2o3b3o$6b3o3b2o2bo13b3o3b 2o2bo$3bo2b2o3b4o5bo6bo2b2o3b4o5bo$2b2o2bo13b3o3b2o2bo13b3o$b4o5bo6bo 2b2o3b4o5bo6bo2b2o$10b3o3b2o2bo13b3o3b2o2bo$o6bo2b2o3b4o5bo6bo2b2o3b4o $3o3b2o2bo13b3o3b2o2bo$2o3b4o5bo6bo2b2o3b4o5bo6bo$o13b3o3b2o2bo13b3o3b 2o$4bo6bo2b2o3b4o5bo6bo2b2o3b4o$4b3o3b2o2bo13b3o3b2o2bo$bo2b2o3b4o5bo 6bo2b2o3b4o5bo$2o2bo13b3o3b2o2bo13b3o$3o5bo6bo2b2o3b4o5bo6bo2b2o3bo$8b 3o3b2o2bo13b3o3b2o2bo$5bo2b2o3b4o5bo6bo2b2o3b4o5bo$o3b2o2bo13b3o3b2o2b o13b2o$3b4o5bo6bo2b2o3b4o5bo6bo2b2o$12b3o3b2o2bo13b3o3b2o2bo$2bo6bo2b 2o3b4o5bo6bo2b2o3b4o! golly-2.5-src/Patterns/Life/Bounded-Grids/Klein-bottle.rle0000644000175100001440000000054512156145314020361 00000000000000#CXRLE Pos=-10,-3 #C #C If one pair of opposite edges of a bounded grid are twisted 180 degrees #C (ie. reversed) before being joined then the result is a Klein bottle. #C In this example the twist is on the horizontal edges. #C For more details see Help > Bounded Grids. #C x = 20, y = 6, rule = LifeHistory:K40*,20 16.3A$16.A2.A$16.A$3A13.A$A16.A.A$.A! golly-2.5-src/Patterns/Life/Bounded-Grids/lightspeed-bubble.rle0000644000175100001440000002646312156145314021420 00000000000000#CXRLE Pos=-300,-68 #C #C A "bubble" in a sea of stripes moves at light speed. #C Created by Gabriel Nivasch. #C x = 600, y = 136, rule = B3/S23:T600,136 600o2$600o$379bo$347o2b4ob2ob2ob2ob2ob2ob2ob4o4b220o$348b2o4b2o4b2o4b 2o4b2o4bo$347o3bo5bo5bo5bo5b226o$375bo$347o29b224o$348bo4bo4bo17bo3bo$ 347o3b2o2bobo2bo16b3o3b218o$350bobob5o17bo5bo3bo$352ob5o18b3o3b3o3b 212o$350b2o24bo5bo5bo3bo$57o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o 2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b2o25b3o3b3o3b3o3b 206o$58b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b4o24bo5bo5bo5bo3bo$57o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o6bo22b3o3b3o3b3o3b3o3b200o$353bo22bo5bo5bo5bo5bo3bo$55o321b3o3b3o 3b3o3b3o3b3o3b194o$376bo5bo5bo5bo5bo5bo3bo$53o5b2o299bo16b3o3b3o3b3o3b 3o3b3o3b3o3b188o$56b2o3bo20b2o274bobo15bo5bo5bo5bo5bo5bo5bo3bo$55ob2ob 2obob2o3bo3bo3bo3b3o274bobo15b3o3b3o3b3o3b3o3b3o3b3o3b3o3b182o$61bo4bo bobobobobobob2o294bo5bo5bo5bo5bo5bo5bo5bo3bo$59o6bo3bo3bo3bo2b2obo292b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b176o$64bo15bo2bo259b3o30bo5bo5bo5bo5bo 5bo5bo5bo5bo3bo$57o23bo261bo2bo30b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 170o$80bo264bo30bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o25bo260bo3bo30b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b164o$80bo264bo30bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo3bo$55o25b2o260bobo31b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b158o$80b3o10bo282bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$ 55o25b3o6b2ob3o281b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 152o$80b3ob3o2b2obo2bo231b3o46bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3b o$55o25b3ob3o4bo234bo2bo46b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b146o$80b3ob3o6b3o233bo46bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo3bo$55o25b3ob3o5bob2o229bo3bo46b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b140o$80b3ob3o5b3o234bo46bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo3bo$55o25b3ob3o5b3o231bobo47b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b134o$80b3ob3o289bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o25b3ob3o5b2o282b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b128o$80b3o3bobo 3bo218b3o62bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o 25b3o2b2ob2obo218bo2bo62b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b122o$80b2o3b2o2bo223bo62bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o25bo4b3obo17bo201bo3bo62b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b116o $80bo2bo3b2o19b2o203bo62bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo3bo$55o25bo26b2o201bobo63b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b110o$80b2o294bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o25b3o44bo248b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b104o$80b3o45b2o165b3o78bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo3bo$55o25b2o45b2o165bo2bo78b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b98o$ 80bo2bo213bo78bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo3bo$53o5b2o20bo66bo145bo3bo78b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b92o$56b2o3bo 18bo2bo64b2o147bo78bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo3bo$55ob2ob2obob2o3bo3bo3bo2b2obo63b2o145bobo79b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b86o$61bo4bobobobobobobob2o294bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$59o6bo3bo3bo3bo3b 3o83bo208b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b80o$64bo17b2o84b2o109b3o94bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$ 57o110b2o109bo2bo94b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b74o$281bo94bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 3bo$55o5b2o125bo89bo3bo94b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b68o$58b2o 3bo32bo91b2o91bo94bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$57ob2ob2obob2o3bo3bo3bo3bo3bo3b4o2b2o 88b2o89bobo95b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b62o$63bo4bobobobob obobobobobobobob2o282bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$61o6bo3bo3bo3bo3bo3bo3bo2bo112bo 168b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b56o$66bo25b2o114b2o53b3o 110bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo3bo$57obo33bo3bo110b2o53bo2bo110b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b50o$58bo33bo172bo110bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo $55o37bo134bo33bo3bo110b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b44o$92b2o134b2o35bo110bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo$55o37b3o132b2o33bobo 111b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b44o$92b3o6b2o2bo 270bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo3bo$55o37b3ob3o2b2o2bo141bo128b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b50o$92b3ob3o149b2o126bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo $55o37b3ob3o147bo2bo126b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b56o$ 92b3ob3o147bo2bo126bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$55o37b3o2b2o20b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o16bo126b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b62o$ 92b3o17bo5bo2bo13bobo13bobo13bobo13bobo13bobo13bobo13bobo10bo4bo126bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo3bo$55o37b3o5b2o9b2o23bo15bo15bo15bo15bo15bo15bo10bo4bo127b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b68o$92b3o5b3o7bo10b2o122b2o129bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 3bo$55o37b3o4b2ob2o2b7o263b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b74o$92b3o4bo 3bobo5b2o4bo106b2o150bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo3bo$57o35b3o9bob2o3bo5bo105bobo150b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b80o$58bobobo29b2o16bo114bo150bo5bo5bo5bo5bo5bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$57o3bo31bo2bo21bo 258b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b86o$62bo29bo111b2o170bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$59o2bo8bo21b2o109bobo 170b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b92o$60b5o6bo3bo3bo3bo3bo3bo2bo110bo170bo5bo5bo5b o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$59o8bo4bobo bobobobobobobobob2o282b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b98o$62b2ob2obob2o3bo3bo3bo3bo3b 4o2b2o85b2o190bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo3bo$61ob2o3bo28bo86bobo190b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b104o$64b2o119bo190bo5bo5bo 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$59o317b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 110o$62bo21b2o3bo74b2o210bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo5bo5bo3bo$57o6bo3bo3bo3bo3bo3bo2bo2bo73bobo210b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b116o$59bo4bobo bobobobobobobobo82bo210bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo5bo3bo$53ob2ob2obob2o3bo3bo3bo3bo3bo2bo289b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b122o$54b2o3bo23b3o58b2o 230bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$51o5b2o25b2o 58bobo230b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b128o$83b2o60bo230bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3b o$53o30bo292b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b134o$83bo40b2o250bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$ 53o30bo39bobo250b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b140o$83bo2bo38bo250bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$ 53o30b2o291b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b146o$ 83b3o4bo14bo270bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$53o30b2o3b2ob o12b2o270b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b152o$83bo2bo bo2bo11bobo270bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$53o30bo5bo7b2o4b 2o271b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b158o$83bo3bo8b2obo6b 2o268bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$53o30bo3bo18b2o268b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b164o$83bo3bo6bo281bo5bo5bo5bo5bo5bo5bo5b o5bo5bo3bo$53o30bo3bo4bobo281b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b170o $83bo3bo3bo3bo280bo5bo5bo5bo5bo5bo5bo5bo5bo3bo$53o30bo3bo3bo3bo280b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b176o$83bo3bo3bo284bo5bo5bo5bo5bo5bo5bo5b o3bo$53o30bo3bo6bo281b3o3b3o3b3o3b3o3b3o3b3o3b3o3b182o$83bo3bo3bobo 282bo5bo5bo5bo5bo5bo5bo3bo$53o30bo3bo3b2o283b3o3b3o3b3o3b3o3b3o3b3o3b 188o$83bo292bo5bo5bo5bo5bo5bo3bo$53o30bo2bo289b3o3b3o3b3o3b3o3b3o3b 194o$83b2o291bo5bo5bo5bo5bo3bo$53o30b3o290b3o3b3o3b3o3b3o3b200o$83b3o 290bo5bo5bo5bo3bo$51o5b2o25b2o291b3o3b3o3b3o3b206o$54b2o3bo23b3o290bo 5bo5bo3bo$53ob2ob2obob2o3bo3bo3bo3bo3bo2bo289b3o3b3o3b212o$59bo4bobobo bobobobobobobo293bo5bo3bo$57o6bo3bo3bo3bo3bo3bo2bo2bo286b3o3b218o$62bo 21b2o3bo286bo3bo$55o321b224o$375bo$55o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3bo5b226o$56b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o4b2o4bo$ 55o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o 2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b4ob4o4b220o$379bo! golly-2.5-src/Patterns/Life/Bounded-Grids/pulsars-in-tube.rle0000644000175100001440000000125612156145314021062 00000000000000#CXRLE Pos=-1,-34 #C #C Life in a Tube investigated intermittently by Tony Smith since 1985. #C #C Circumference 17 tube shown rolled out 4 times for aesthetic reasons. #C #C Pulsars was discovered almost immediately after the general principle #C of Life in a Tube was revealed when applying Full Paint's command-L #C Easter Egg to a screen dump which included a MacDraw ruler. This #C particular discovery helped keep the project motivated. x = 2, y = 68, rule = B3/S23:T0,68 bo$bo$bo$bo$bo$bo$bo$bo$2o$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$b o$bo$2o$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$2o$bo$bo$bo$bo $bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$bo$2o$bo$bo$bo$bo$bo$bo$bo$bo! golly-2.5-src/Patterns/Life/Bounded-Grids/sphere.rle0000644000175100001440000000055212156145314017314 00000000000000#CXRLE Pos=-10,-10 #C #C If the adjacent edges of a bounded grid are joined then the #C result is a sphere. Note how the gliders behave differently #C as they pass through the corner cells at a "pole" or "equator". #C For more details see Help > Bounded Grids. #C x = 20, y = 20, rule = LifeHistory:S30 2A16.2A$A.A14.A.A$A18.A13$12.3A$12.A2.A$12.A$12.A$13.A.A! golly-2.5-src/Patterns/Life/Bounded-Grids/torus.rle0000644000175100001440000000047712156145314017210 00000000000000#CXRLE Pos=-2,-2 #C #C If the opposite edges of a bounded grid are joined then the result #C is a torus. If the edge lengths are relatively prime, as in this #C example, then a glider will eventually visit every cell. #C For more details see Help > Bounded Grids. #C x = 3, y = 3, rule = LifeHistory:T31,20 .A$2.A$3A! golly-2.5-src/Patterns/Life/Bounded-Grids/torus-with-shift.rle0000644000175100001440000000037112156145314021265 00000000000000#CXRLE Pos=-2,-2 #C #C A torus can have a shift on the horizontal edges (as in this example) #C or on the vertical edges, but not both. #C For more details see Help > Bounded Grids. #C x = 4, y = 5, rule = LifeHistory:T30+7,20 A.A$3.A$3.A$A2.A$.3A! golly-2.5-src/Patterns/Life/Breeders/0000755000175100001440000000000012156146015014504 500000000000000golly-2.5-src/Patterns/Life/Breeders/breeder.lif0000644000175100001440000003221312156145314016532 00000000000000#Life 1.05 #D Breeder, the classic original by Bill Gosper, early 1970's. #D #D This is the first pattern to demonstrate that quadratic #D growth was possible in the Game of Life. Much better #D results have been achieved since then (see spacefiller.rle). #N #P 6 166 *** ..* .* #P 0 152 ...** ...** . . . ...* ..*** .*...* *.***.* .***** . . . . . . . . . . . . . ....*** ...*...* ..*.....* ..**.*.** . . .....* ....*.* ....*.* .....* . .....** .....** #P 35 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 40 153 *.* ** .* #P 41 183 ** *.* * #P 67 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 88 137 *.* ** .* #P 89 199 ** *.* * #P 99 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 136 121 *.* ** .* #P 137 215 ** *.* * #P 131 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 184 105 *.* ** .* #P 185 231 ** *.* * #P 163 152 ** ** . . . . . . . . . ** *.* .** . . . . . . . . ...** ..*.* ..** . . . . . . . . . ..** ..** #P 195 152 ** ** . . . . . .....* .....*.* .....** .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** .......** .......*.* .......* . . . . . ..** ..** #P 232 89 *.* ** .* #P 233 247 ** *.* * #P 227 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 248 143 * *.* ** #P 250 194 ** *.* * #P 280 73 *.* ** .* #P 281 263 ** *.* * #P 259 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 296 127 * *.* ** #P 298 210 ** *.* * #P 328 57 *.* ** .* #P 329 279 ** *.* * #P 291 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 344 111 * *.* ** #P 346 226 ** *.* * #P 377 295 ** *.* * #P 376 41 *.* ** .* #P 323 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 392 95 * *.* ** #P 370 234 ** *.* * #P 355 152 ** ** . . . . . . . . .** *..* *..* .** . . . . . . . . ...** ..*..* ..*..* ...** . . . . . . . . ..** ..** #P 440 79 * *.* ** #P 418 250 ** *.* * #P 387 152 ** ** . . . . . . . . .** *..* *..* .** #P 389 186 ** ** #P 400 160 .* * *** #P 399 184 .** ** ..* #P 360 222 ** ** #P 341 58 ** ** #P 352 49 *.* ** .* #P 373 58 ** ** #P 394 242 ** *.* * #P 442 258 ** *.* * #P 343 280 ** ** #P 353 287 ** *.* * #P 375 280 ** ** #P 419 152 ** ** . . . . . . . . .** *..* *..* .** #P 421 186 ** ** #P 422 191 * * ..** #P 448 144 .* * *** #P 447 200 .** ** ..* #P 451 152 ** ** . . . . . . . . .** *..* *..* .** #P 453 186 ** ** . . . ** ** #P 483 152 ** ** . . . . . . . . .** *..* *..* .** #P 485 186 ** ** . . . ** ** #P 496 128 .* * *** #P 515 152 ** ** . . . . . . . . .** *..* *..* .** #P 517 186 ** ** . . . ** ** #P 547 152 ** ** . . . . . . . . .** *..* *..* .** #P 549 186 ** ** . . . ** ** #P 579 152 ** ** #P 581 186 ** ** . . . ** ** #P 589 154 * *.* ** #P 589 176 .** ** ..* #P 611 152 ** ** #P 613 186 ** ** . . . ** ** #P 637 138 * *.* ** #P 637 192 .** ** ..* #P 643 147 ** ** . . . ** ** #P 645 186 ** ** . . . ** ** #P 661 130 * *.* ** #P 685 122 * *.* ** #P 685 208 .** ** ..* #P 709 216 .** ** ..* #P 544 112 .* * *** #P 568 104 .* * *** #P 562 109 ** ** #P 594 109 ** ** #P 626 104 ** ** . . . ** ** #P 513 88 ** ** #P 481 88 ** ** #P 449 88 ** ** #P 405 53 ** ** . . . ** ** #P 355 17 ** ** . . . ** ** #P 424 217 ** ** . . . ** ** #P 448 217 ** ** . . . ** ** #P 464 217 ** ** . . . ** ** #P 340 315 ** ** . . . ** ** #P 396 315 ** ** . . . ** ** #P 412 315 ** ** . . . ** ** #P 479 280 ** ** . . . ** ** #P 463 280 ** ** . . . ** ** #P 407 280 ** ** . . . ** ** #P 395 17 ** ** . . . ** ** #P 411 17 ** ** . . . ** ** #P 400 33 *.* ** .* #P 461 53 ** ** . . . ** ** #P 477 53 ** ** . . . ** ** #P 545 83 ** ** . . . ** ** #P 569 83 ** ** . . . ** ** #P 585 83 ** ** . . . ** ** #P 682 104 ** ** . . . ** ** #P 698 104 ** ** . . . ** ** #P 675 147 ** ** . . . ** ** #P 699 147 ** ** . . . ** ** #P 715 147 ** ** . . . ** ** #P 717 186 ** ** . . . ** ** #P 701 186 ** ** . . . ** ** #P 677 186 ** ** . . . ** ** #P 707 230 ** ** . . . ** ** #P 723 230 ** ** . . . ** ** #P 651 230 ** ** . . . ** ** #P 736 138 .....** .****.** .****** ..**** .* *.* *.* ....** ....*.* ......* ....*** . . . ....*** ......* ....*.* ....** *.* *.* .* ..**** .****** .****.** .....** #P 720 140 ...** ..*.* .*..* ......* * .....*.*.* ..*..*.*..* ...**.....*..* ........*.*.*..* .....**.*...*..* . .....**.*...*..* ........*.*.*..* ...**.....*..* ..*..*.*..* .....*.*.* * ......* .*..* ..*.* ...** #P 726 135 .**** ****** ****.** ....** #P 726 162 ....** ****.** ****** .**** #P 705 145 .** *..* *.* .* . . . .* *.* *..* .** #P 701 138 .*** ***** ***.** ...** #P 701 159 ...** ***.** ***** .*** #P 687 146 .** *..*....* .**.....* . . . .**.....* *..*....* .** #P 668 148 ** ** . ** ** #P 661 141 ....** ...*..* **.* .....** *...** ..*.* . . . . . . . ..*.* *...** .....** **.* ...*..* ....** #P 738 177 .......** ...****.** ...****** ....**** ..* ** .*..* ..***.** ........* ........* ....*..** .....** . .....** ....*..** ........* ........* ..***.** .*..* ** ..* ....**** ...****** ...****.** .......** #P 724 178 .*** .* ....* ...* . ......* .....**** ........* ****..*.** *.*.*.*....** .**..*.* . .**..*.* *.*.*.*....** ****..*.** ........* .....**** ......* . ...* ....* .* .*** #P 730 174 .**** ****** ****.** ....** #P 716 130 .** **** **.** ..** #P 730 201 ....** ****.** ****** .**** #P 720 206 ..** **.** **** .** #P 700 166 .* * . .*.* ...* .* ..* #P 705 177 .*** ***** ***.** ...** #P 705 198 ...** ***.** ***** .*** #P 707 184 .** *..* *.* .* . . . .* *.* *..* .** #P 689 185 .** *..* .** . . . .** *..* .** #P 670 187 ** ** . ** ** #P 664 179 ..** ...** .*.* *** *..* *.*** .*..* ..** . . . . . ..** .*..* *.*** *..* *** .*.* ...** ..** #P 661 200 .** ** ..* #P 741 219 ...** .*....* .......* .*.....* ..****** . . . . ...*** .*...** .*.*..** *.....* .***** . .***** *.....* .*.*..** .*...** ...*** . . . . ..****** .*.....* .......* .*....* ...** #P 729 225 ..*..* .***.** **...*.** .*...* .*.*.*.** ..*****.*.* ...*....** .........* . .........* ...*....** ..*****.*.* .*.*.*.** .*...* **...*.** .***.** ..*..* #P 731 219 .****** *.....* ......* *....* .*.* #P 731 243 .*.* *....* ......* *.....* .****** #P 713 228 .** *..* *.* .* . . . .* *.* *..* .** #P 706 222 .***** *....* .....* *...* ..* #P 706 240 ..* *...* .....* *....* .***** #P 696 228 ..**.* .****.** *....** *.* .* . .* *.* *....** .****.** ..**.* #P 680 230 **.** .*** .** . .** .*** **.** #P 676 231 * ** . ** * #P 666 225 .......* ......*.* .........* ....*.** ..*.** ***..** .**..** . . . .**..** ***..** ..*.** ....*.** .........* ......*.* .......* #P 646 224 .***** *....* .....* *...* ..* #P 646 238 ..* *...* .....* *....* .***** #P 721 249 *..* ....* *...* .**** #P 717 94 .**** ****** ****.** ....** . . . . ..** .*..** ***..* *....* ***** . ***** *....* ***..* .*..** ..** . . . . ....** ****.** ****** .**** #P 704 98 ...* ....* ..**** **...*.** .*.*.*.* .*...***..* ..*.*...* ...*....*** . . . ...*....*** ..*.*...* .*...***..* .*.*.*.* **...*.** ..**** ....* ...* #P 706 93 ....** ****.** ****** .**** #P 706 118 .**** ****** ****.** ....** #P 688 102 .** *..* *.* .* . . . .* *.* *..* .** #P 681 96 ...** ***.** ***** .*** #P 681 115 .*** ***** ***.** ...** #P 671 99 ..* ..* . ......* .****.* *..*.** *.* .* . .* *.* *..*.** .****.* ......* . ..* ..* #P 655 103 .*.* ....* **.* ..* . ..* **.* ....* .*.* #P 651 105 * *** . *** * #P 642 100 .....*** ...*..** ..*...*.* *...* *...** * .*...* . .*...* * *...** *...* ..*...*.* ...*..** .....*** #P 696 88 ..** **.** **** .** #P 621 98 ...** ***.** ***** .*** #P 610 74 .....** .****.** .****** ..**** . . ..** .*...* .*....* *.....* .**.*** . . . .**.*** *.....* .*....* .*...* ..** . . ..**** .****** .****.** .....** #P 606 77 .* *..* . . . .* ..* . . . . . ..* .* . . . *..* .* #P 600 71 .**** ****** ****.** ....** #P 600 98 ....** ****.** ****** .**** #P 592 79 .....*** ...***** ..*** .*...* **..*....** *......*** .******** . .******** *......*** **..*....** .*...* ..*** ...***** .....*** #P 590 66 .** **** **.** ..** #P 592 74 *** * .* #P 592 96 .* * *** #P 575 95 ...** ***.** ***** .*** #P 575 74 .*** ***** ***.** ...** #P 575 80 .** .** *..* *.* .* . . . .* *.* *..* .** .** #P 557 82 .** *..* .** . . . .** *..* .**. #P 530 75 ....*.* ...**..* ..***..* .*** .*.*..** **.***.* .*......* ..*....* ....***** ........** ........** . ........** ........** ....***** ..*....* .*......* **.***.* .*.*..** .*** ..***..* ...**..* ....*.* #P 515 76 .*** ***** ***.** ...** #P 496 43 .**** ****** ****.** ....** . . . . ..** .*..** ***..* *....* ***** . ***** *....* ***..* .*..** ..** . . . . ....** ****.** ****** .**** #P 483 47 ...* ....* ..**** **...*.** .*.*.*.* .*...***..* ..*.*...* ...*....*** . . . ...*....*** ..*.*...* .*...***..* .*.*.*.* **...*.** ..**** ....* ...* #P 485 42 ....** ****.** ****** .**** #P 485 67 .**** ****** ****.** ....** #P 467 51 .** *..* *.* .* . . . .* *.* *..* .** #P 460 45 ...** ***.** ***** .*** #P 460 64 .*** ***** ***.** ...** #P 450 48 ..* ..* . ......* .****.* *..*.** *.* .* . .* *.* *..*.** .****.* ......* . ..* ..* #P 434 52 .*.* ....* **.* ..* . ..* **.* ....* .*.* #P 430 54 * *** . *** * #P 421 49 .....*** ...*..** ..*...*.* *...* *...** * .*...* . .*...* * *...** *...* ..*...*.* ...*..** .....*** #P 475 37 ..** **.** **** .** #P 464 71 * *.* ** #P 400 47 ...** ***.** ***** .*** #P 425 8 .****** *.....* ......* *....* ..** . ..** .*.** **.*.* *.**.** *...** ..*** . ..*** *...** *.**.** **.*.* .*.** ..** . ..** *....* ......* *.....* .****** #P 417 14 ..*** *...* * * .*..* ..*.* . ..*.* .*..* * * *...* ..*** #P 414 4 ..** *....* ......* *.....* .****** #P 414 32 .****** *.....* ......* *....* ..** #P 401 15 ..* .*.* * .* . . . .* * .*.* ..* #P 400 5 ..* *.* *.* #P 389 7 ..* *...* .....* *....* .***** #P 389 29 .***** *....* .....* *...* ..* #P 389 15 * .* .* * . . . * .* .* * #P 382 13 ...** ...** ...** **.** .*.* .*** . . . .*** .*.* **.** ...** ...** ...** #P 379 17 ** ** . . . ** ** #P 367 16 .** *..* .** . . . .** *..* .** #P 341 7 .*.* .*.* .*.** ...** *..* .** #P 341 28 .** *..* ...** .*.** .*.* .*.* #P 329 9 ..* *...* .....* *....* .***** #P 329 27 .***** *....* .....* *...* ..* #P 404 0 *..* ....* *...* .**** #P 485 206 ......** ....*....* ..........* ....*.....* .....****** .* .*** *.**..* ..***..* .*****..* .***.*.*** ......**.** .....**.** . . . .....**.** ......**.** .***.*.*** .*****..* ..***..* *.**..* .*** .* .....****** ....*.....* ..........* ....*....* ......** #P 478 206 .****** *.....* ......* *....* ..** #P 478 230 ..** *....* ......* *.....* .****** #P 471 213 ......* .....*** ..*** .*...*...* *..*.*....* *........* .******** . .******** *........* *..*.*....* .*...*...* ..*** .....*** ......* #P 471 208 .** ** ..* #P 471 230 ..* ** .** #P 453 209 .***** *....* .....* *...* ..* . ..** .*..* .*.* ..* . . . ..* .*.* .*..* ..** . ..* *...* .....* *....* .***** #P 436 216 .** *..* .** . . . .** *..* .** #P 417 218 ** ** . ** ** #P 410 209 ....** ...*** .**...* .*...* * ***..** *.*.*** .***.** ...** . . . . . ...** .***.** *.*.*** ***..** * .*...* .**...* ...*** ....** #P 393 211 .***** *....* .....* *...* ..* #P 392 222 ** ** #P 468 236 *..* ....* *...* .**** #P 498 270 .**** ****** ****.** ....** . . . . ..** .*..** ***..* *....* ***** . ***** *....* ***..* .*..** ..** . . . . ....** ****.** ****** .**** #P 485 274 ...* ....* ..**** **...*.** .*.*.*.* .*...***..* ..*.*...* ...*....*** . . . ...*....*** ..*.*...* .*...***..* .*.*.*.* **...*.** ..**** ....* ...* #P 487 269 ....** ****.** ****** .**** #P 487 294 .**** ****** ****.** ....** #P 469 278 .** *..* *.* .* . . . .* *.* *..* .** #P 462 272 ...** ***.** ***** .*** #P 462 291 .*** ***** ***.** ...** #P 452 275 ..* ..* . ......* .****.* *..*.** *.* .* . .* *.* *..*.** .****.* ......* . ..* ..* #P 436 279 .*.* ....* **.* ..* . ..* **.* ....* .*.* #P 432 281 * *** . *** * #P 423 276 .....*** ...*..** ..*...*.* *...* *...** * .*...* . .*...* * *...** *...* ..*...*.* ...*..** .....*** #P 402 289 .*** ***** ***.** ...** #P 477 299 .** **** **.** ..** #P 466 266 ** *.* * #P 425 305 ...**** ..****** ..****.** ......** . . . ...*** .** .*....** **.**..* .......* ....*** . ....*** .......* **.**..* .*....** .** ...*** . . . ......** ..****.** ..****** ...**** #P 417 311 ....* ....** ..*..* *** .** ..*.* ....* . ....* ..*.* .** *** ..*..* ....** ....* #P 416 304 ....** ****.** ****** .**** #P 416 329 .**** ****** ****.** ....** #P 402 313 ..* .** *** . . . . . *** .** ..* #P 391 307 ...** ***.** ***** .*** #P 391 326 .*** ***** ***.** ...** #P 390 314 ** ** #P 390 321 ** ** #P 383 311 ...** ..*..* .....* ** . .*.* ..* . ..* .*.* . ** .....* ..*..* ...** #P 359 307 ...............* .............**.* ............*...* ........****.*.* .......*.*...** .**....*.* **.*..**.** .**.***..**** ...*...**.*.** .........**.** ...........* . ...........* .........**.** ...*...**.*.** .**.***..**** **.*..**.** .**....*.* .......*.*...** ........****.*.* ............*...* .............**.* ...............* #P 353 312 ..* .*.* *...* .*..* .**.** . . . .**.** .*..* *...* .*.* ..* #P 331 309 ...** ***.** ***** .*** #P 331 324 .*** ***** ***.** ...** #P 402 332 .** * #P 406 334 .** **** **.** ..** #P 401 303 ** *.* * golly-2.5-src/Patterns/Life/Breeders/c4-diag-switch-engines.rle0000644000175100001440000000454512156145314021276 00000000000000#C c/4 diagonal switch-engine breeder #C two of Hartmut Holzwart's diagonal c/4 tub-and-beehive puffer #C and a c/2 period 392 backward rake interact to produce #C block-laying switch engines: David Bell, 23 July 2005 x = 152, y = 94, rule = B3/S23 77b2o$77bobo$77bo$80bo$80b2o$80b2o$79b2o$75b2ob2o$75bo4bo$75bob4o$79b 2o$79b2o$79b2o$81bob3o$77bo2bo$76b5o6bo$76bo2b2o5bobo$74bobo10bo$73b3o 4bo$73bo2b2o$77b3o$77b2o10bo$79bo8bobo3bo$77bobo8bobo2bobo$70b2o4b2o 11bo4bo$69b2o5b2obo$71bo4b2ob2obo2b2o$76b3obobo2bobo$67b2o3b2o2b2o7bo 10bo$66b2o3b2o15bo6bobo3bo$68bo2b3o14b2o5bobo2bobo$70b4o14b2o6bo4bo$ 69bobo15b2o$68b2o13b2ob2o$68bobo12bo4bo$67bo15bob4o14bo$68b2o17b2o13bo bo3bo$87b2o13bobo2bobo$87b2o14bo4bo$89bo$85bo2bo4bo$84b5o4bo$84bo2b2o 4bo16bo$82bobo12bo11bobo3bo$81b3o4bo7bobo10bobo2bobo$81bo2b2o11bo12bo 4bo$85b3o$55bobo27b2o$54bo2bo29bo$53b2o30bobo11bo17bo$52bo25b2o4b2o12b obo3bo11bobo3bo$51b4o22b2o5b2obo10bobo2bobo10bobo2bobo$50bo4bo6bo16bo 4b2ob2obo8bo4bo12bo4bo$50bo2bo5b2obo21b3obobo$50bo2bo5bo15b2o3b2o2b2o$ 51bo7bo14b2o3b2o$52b4obo6b2o10bo2b3o24bo17bo$53bo3bo4bo4bo10b4o23bobo 3bo11bobo3bo$54bo6bo15bobo25bobo2bobo10bobo2bobo$54b5o2bo5bo8b2o28bo4b o12bo4bo$61b6o9bobo$54b5o16bo$54bo21b2o$53bo3bo2bo24b2o26bo17bo$11bobo 12b2o24b4obo25bo4bo23bobo3bo11bobo3bo$10bo2bo10bo4bo21bo7bob2o19bo29bo bo2bobo10bobo2bobo$9b2o7bo4bo26bo2bo5bo2bo6bo12bo5bo24bo4bo12bo4bo$8bo 6b2obo4bo5bo20bo2bo5bo2bo4bobo12b6o9b2o$7b6o2bo7b6o21bo4bo4b2o6b2o5bo 20b4o$4b2o7bo3b4o30b4o18bobo19b2ob2o$3bo3b3obo4bo35bo21b2o5bo14b2o22bo 17bo$2bo3bo3b2obo2b2obo2bo30b2o24bobo5bo31bobo3bo11bobo3bo$2bo5b2o3bo 5bo6b2o26bo2bo22b2o5bo31bobo2bobo10bobo2bobo$2b3o3b4obo7bobo2b3o26bobo 27bobo32bo4bo12bo4bo$11bo9bo6bo57b2o$2b3o6bobo7bo6bo5bo73b2o$bo5bo5bo 8bo4bo4bobo3b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b3ob2o27bo2bo3b3o$o3b 2obo3b2o11b2o7b2o3b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b4o2bo27b2o6bo 10bo17bo$o3bo6b3o62bob2o35bo10bobo3bo11bobo3bo$o3b2obo3b2o11b2o7b2o3b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o50bobo2bobo10bobo2bobo$bo5bo5bo 8bo4bo4bobo3b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o34b2o15bo4bo12bo4bo $2b3o6bobo7bo6bo5bo75bo2bo$11bo9bo6bo80b2o$2b3o3b4obo7bobo2b3o78bo$2bo 5b2o3bo5bo6b2o50b2o27bo10b2o14bo$2bo3bo3b2obo2b2obo2bo54b2ob2o25bo4bo 5b2o13bobo3bo$3bo3b3obo4bo61b4o6b2o19b3o21bobo2bobo$4b2o7bo3b4o58b2o6b 2ob3o41bo4bo$7b6o2bo7b6o59b5o$8bo6b2obo4bo5bo59b3o$9b2o7bo4bo95b2o$10b o2bo10bo4bo88b2ob4o$11bobo12b2o91b6o$120b4o! golly-2.5-src/Patterns/Life/Breeders/LWSS-breeder.rle0000644000175100001440000011630712156145314017337 00000000000000#C This is, to my knowledge, the first LWSS breeder created. It is a #C type MSM breeder, consisting of an orthogonal, speed c/2 head that #C lays down Gosper guns in such a way that the glider streams #C collide to form LWSS streams travelling orthogonally to the #C direction of propagation of the head. #C #C The head itself consists of three individual glider breeders that #C lay down Gosper guns using the same method used by Bill Gosper to #C create the first breeder. However, instead of being period 64, #C the rakes used here are extensible - in fact, they are "borrowed" #C from a switch engine breeder*. At any rate, the period of the #C rakes must be rather large compared to the width of the glider #C breeders; otherwise, the gliders from the forward-pointing guns #C will collide with either the middle row of Gosper guns or their #C gliders. I could not find any glider rakes of sufficiently high #C period for this purpose, so I borrowed the rake used in that #C switch engine breeder and extended the period by adding ten-odd #C bi-blocks to the wick. This gave a sufficiently large period for #C the pattern not to destroy itself. An interesting consequence #C of the extensibility of the glider rakes is that, by making the #C appropriate changes to the spacing of the Gosper gun assemblies, #C the period of the whole setup can be altered. However, it is #C currently in just about its most compact form -- further #C shortening of the period may result in self-destruction of the #C type mentioned above. #C #C * This switch engine breeder consists of an orthogonal, speed c/2 #C glider backrake and a diagonal, speed c/4 puffer laying down a #C trail of beehives and blocks. When a glider from the backrake #C collides with this trail, a switch engine is born, propagating #C orthogonally to the puffer and 45 degrees from the rake. #C #C Lucas Brown, 24 January 2008, 4:21 PM PST x = 1640, y = 619, rule = B3/S23 1194b2o$1192bo4bo$1198bo129bo$1192bo5bo129b4o$1193b6o27bo89b2o5bo6b2o$ 1224bo3bo83b4ob2o4b3o7bo$1229bo82b6o7b2ob6o$1224bo4bo5bo2bo74b4o4b4o9b obo$1225b5o9bo80bo3bo4bob7o$1235bo3bo82b3o4bo7b2o$1236b4o77b2obobo3b2o 4b2o4b2o$1316b3obo8bo2bo4b2o$1310bo4b2o2b2o8bobo$1308b2o6bo2bo17b2o$ 414b2o129bobo727b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o4b2o6b2o8bobo4b2o2b2o$ 410b4ob2o128bo2bo725bo2bob2o2b2o2b2o2b2o2b2o2b2o2b2o24bo4b3o2b2o$410b 6o114b6o4bo7b2o725b2o50bo2bo6bob3o$411b4o114bo5bo4bob2o6bo728b2o2b2o2b 2o2b2o2b2o2b2o2b2o24bo4b3o2b2o$445b2o88bo7bo2b6o727b2o2b2o2b2o2b2o2b2o 2b2o2b2o4b2o6b2o8bobo4b2o2b2o$442b3ob2o81bo4bo3b4o3bo7b2o753b2o6bo2bo 17b2o$442b5o8b2o74b2o9bo4bob3o3bo754bo4b2o2b2o8bobo$443b3o7b2ob2o78bo 2bob2o2bob2o3bo3bo675b2o26bo55b3obo8bo2bo4b2o$453b4o82bo5bo3b2o5bo674b 2o27b4o53b2obobo3b2o4b2o4b2o$454b2o73bo5bobo7bob4o3b3o676bo4b2o22b2o 58b3o4bo7b2o$528bo8bo9bo670b4o15b2o26bo54bo3bo4bob7o$523bo4b3o4b3o7bob o6b3o96b2o129bobo430bo3bo17bo4b2o16b4o47b4o4b4o9bobo$190b2o129bobo186b 2o2b2o2b2o2bo22bo5bo5bo91b4ob2o128bo2bo433bo8b4o9b2o21bo45b6o7b2ob6o$ 186b4ob2o128bo2bo185b2o2b2o2b2o2b3o21b2o3bob2o3bo90b6o114b6o4bo7b2o 428bo2bo8b6o10bo4b2o4b2o4bo2b3o44b4ob2o4b3o7bo$186b6o114b6o4bo7b2o219b 3o6bo3bo91b4o114bo5bo4bob2o6bo439b4ob2o13b2o6b2o5b3o49b2o5bo6b2o$187b 4o114bo5bo4bob2o6bo183b2o2b2o2b2o2b3o21b2o3bob2o3bo125b2o88bo7bo2b6o 442b2o15bobo3bobo6bo62b4o$221b2o88bo7bo2b6o182b2o2b2o2b2o2bo22bo5bo5bo 123b3ob2o81bo4bo3b4o3bo7b2o103b2o351bobo3bobobob3o63bo$218b3ob2o81bo4b o3b4o3bo7b2o192bo4b3o4b3o7bobo6b3o124b5o8b2o74b2o9bo4bob3o3bo100bo4bo 359b2o2bo$218b5o8b2o74b2o9bo4bob3o3bo113b3o80bo8bo9bo134b3o7b2ob2o78bo 2bob2o2bob2o3bo3bo105bo129bo226bo3b2o$219b3o7b2ob2o78bo2bob2o2bob2o3bo 3bo144bobo49bo5bobo7bob4o3b3o135b4o82bo5bo3b2o5bo99bo5bo129b4o216b4o4b 4o$229b4o76bobo3bo5bo3b2o5bo112b2o4b3o23bo2bo58bo5bo3b2o5bo136b2o73bo 5bobo7bob4o3b3o100b6o27bo89b2o5bo6b2o215b6o$230b2o76bo4bo7bob4o3b3o 103b2o13bo28b2o54bo2bob2o2bob2o3bo3bo210bo8bo9bo140bo3bo83b4ob2o4b3o7b o213b4ob2o2b4o$302bo5bo4bo9bo111b4o13bo4b3o22bo48b2o9bo4bob3o3bo206bo 4b3o4b3o7bobo6b3o136bo82b6o7b2ob6o217b2o2bo3b2o$301bo6b2o2b2o7bobo6b3o 102b2ob2o8b2o7bo22b4o45bo4bo3b4o3bo7b2o194b2o2b2o2b2o2bo22bo5bo5bo130b o4bo5bo2bo74b4o4b4o9bobo220b2o2bo$232b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b3o6b2o9bo5bo5bo103b2o7bo4bo6bo4b3o 6b2o5bo4bo50bo7bo2b6o197b2o2b2o2b2o2b3o21b2o3bob2o3bo130b5o9bo80bo3bo 4bob7o217bobob3o$233bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o24b2o3bob2o3bo117bo10bo6b2o2b2o5bo2bo44bo5bo4bob2o6bo 194b2o37b3o6bo3bo140bo3bo82b3o4bo7b2o216bo6bo$228bo3bo88b3o6bo3bo111bo 5bo11bo5bo4bo5bo2bo45b6o4bo7b2o195b2o2b2o2b2o2b2o2b3o21b2o3bob2o3bo 141b4o72bobo3bobobo3b2o4b2o4b2o214b2o5b3o$227bo8b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o24b2o3bob2o3bo112b6o17bo4bo 7bo61bo2bo196b2o2b2o2b2o2b2o2bo22bo5bo5bo218bobo3bobo8bo2bo4b2o213b3o 4bo2b3o$228bo3b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o3b3o6b2o9bo5bo5bo137bobo3bob4o62bobo214bo4b3o4b3o7bobo6b3o 218b2o6b2o8bobo220bo10bo$301bo6b2o2b2o7bobo6b3o141bo2bo3bo202b3o80bo8b o9bo223bo4b2o4b2o17b2o220b4o$302bo5bo4bo9bo145b2o9bo235bobo49bo5bobo7b ob4o3b3o188b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o222bo$224b3o26bobo 52bo4bo7bob4o3b3o134bo4bo3b5o203b2o4b3o23bo2bo58bo5bo3b2o5bo187bobo2b 2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o218b2o$224bo28bo2bo52bobo3bo5bo3b2o 5bo140bo201b2o13bo28b2o54bo2bob2o2bob2o3bo3bo184b2o48bo2bo6bob3o215b4o $212b2o11bo4b3o23b2o54bo2bob2o2bob2o3bo3bo134bo5bo2b5o193b4o13bo4b3o 22bo48b2o9bo4bob3o3bo184bo5bo2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o216bo $211b4o15bo27bo48b2o9bo4bob3o3bo136b6o6bo193b2ob2o8b2o7bo22b4o45bo4bo 3b4o3bo7b2o186b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o$211b2ob2o8b 2o5bo4b3o17b4o45bo4bo3b4o3bo7b2o146bo3bo194b2o7bo4bo6bo4b3o6b2o5bo4bo 50bo7bo2b6o193bo25bo4b2o4b2o17b2o$213b2o7bo4bo8bo18bo4bo50bo7bo2b6o 149bob4o208bo10bo6b2o2b2o5bo2bo44bo5bo4bob2o6bo142b2o80b2o6b2o8bobo$ 228bo8bo4b3o4b3o5bo2bo44bo5bo4bob2o6bo148bo7bo201bo5bo11bo5bo4bo5bo2bo 45b6o4bo7b2o142b2o30bo51bobo3bobo8bo2bo4b2o$222bo5bo13bo8bo5bo2bo45b6o 4bo7b2o149bo5bo2bo201b6o17bo4bo7bo61bo2bo143b2o5b2o23b4o48bobo3bobobo 3b2o4b2o4b2o$223b6o14bo5bobo7bo61bo2bo147bob2o5bo2bo225bobo3bob4o62bob o150b2o26b2o58b3o4bo7b2o$253bob4o62bobo148bo6bo4bo228bo2bo3bo200b4o14b o4b2o22bo54bo3bo4bob7o$250bo2bo3bo222b4o224b2o9bo200bo3bo18b2o20b4o47b 4o4b4o9bobo$245b2o9bo225bo223bo4bo3b5o204bo8b4o8bo4b2o6b2o9bo45b6o7b2o b6o$243bo4bo3b5o223b2o230bo207bo2bo8b6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o 7bo$249bo227bo2bo225bo5bo2b5o212b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o$ 243bo5bo2b5o220bobo227b6o6bo216b2o19b3obo6bo62b4o457b2o$244b6o6bo459bo 3bo237b2obobob3o63bo458bo4bo$253bo3bo458bob4o241b2o2bo528bo129bo$253bo b4o455bo7bo238bo3b2o523bo5bo129b4o$251bo7bo454bo5bo2bo230b4o4b4o525b6o 27bo89b2o5bo6b2o$251bo5bo2bo450bob2o5bo2bo229b6o563bo3bo83b4ob2o4b3o7b o$248bob2o5bo2bo450bo6bo4bo229b4ob2o2b4o561bo82b6o7b2ob6o$248bo6bo4bo 458b4o234b2o2bo3b2o555bo4bo5bo2bo74b4o4b4o9bobo$256b4o461bo241b2o2bo 555b5o9bo80bo3bo4bob7o$258bo460b2o240bobob3o565bo3bo82b3o4bo7b2o$256b 2o458bo2bo241bo6bo565b4o72bobo3bobobo3b2o4b2o4b2o$253bo2bo459bobo241b 2o5b3o640bobo3bobo8bo2bo4b2o$253bobo702b3o4bo2b3o638b2o6b2o8bobo$958bo 10bo65bobo567bo4b2o4b2o17b2o$965b4o66b2o550b2o2b2o2b2o2b2o2b2o20bobo4b 2o2b2o$968bo40b2o25bo541b2o3b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o$965b2o 38b4ob2o613bo2bo6bob3o$963b4o38b6o573bo2b2o2b2o2b2o2b2o3b2o21bo4b3o2b 2o$963bo42b4o573b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o$1605bo4b2o4b2o 17b2o$1527b2o80b2o6b2o8bobo$1526b2o30bo51bobo3bobo8bo2bo4b2o$1526b2o5b 2o23b4o48bobo3bobobo3b2o4b2o4b2o$1532b2o26b2o58b3o4bo7b2o$443b2o290b2o 779b4o14bo4b2o22bo54bo3bo4bob7o$443b2o290b2o778bo3bo18b2o20b4o47b4o4b 4o9bobo$1519bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o$1515bo2bo8b6o11b2o6bo2bo 4bo2b3o44b4ob2o4b3o7bo$1527b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o$1531b2o 19b3obo6bo62b4o$1553b2obobob3o63bo$1036bo521b2o2bo$1035b2o519bo3b2o$ 1035bobo511b4o4b4o$444b2o290b2o810b6o$443bo2bo288bo2bo809b4ob2o2b4o$ 443bo2bo288bo2bo813b2o2bo3b2o$444b2o290b2o820b2o2bo$1556bobob3o$1556bo 6bo$1555b2o5b3o$1553b3o4bo2b3o$1553bo10bo$1560b4o$1563bo$1560b2o$446b 2o1110b4o$445bo2bo1109bo$445bo2bo$446b2o9$445b2o290b2o290b2o290b2o$ 445b2o290b2o290b2o290b2o2$1321b2o$1321b2o3$673bo$673b4o629b2o$675b2o 625b4ob2o$678bo623b6o$675b4o614bo9b4o$668bo10bo613b4o$668b3o4bo2b3o 614b2o$670b2o5b3o326bobo289bo$259bo411bo6bo327bo2bo285b4o259bo$259b4o 408bobob3o331b2o277bo10bo258b4o$261b2o410b2o2bo333bo276b3o4bo2b3o259b 2o$264bo402b2o2bo3b2o332b4o277b2o5b3o263bo$261b4o398b4ob2o2b4o325bo6bo 4bo277bo6bo261b4o$254bo10bo397b6o332bob2o5bo2bo277bobob3o255bo10bo$ 254b3o4bo2b3o397b4o4b4o328bo5bo2bo279b2o2bo255b3o4bo2b3o$256b2o5b3o 405bo3b2o327bo7bo274b2o2bo3b2o258b2o5b3o$257bo6bo408b2o2bo328bob4o271b 4ob2o2b4o260bo6bo$257bobob3o404b2obobob3o63bo264bo3bo272b6o267bobob3o$ 259b2o2bo215bobo164b2o19b3obo6bo62b4o252b6o6bo274b4o4b4o262b2o2bo$253b 2o2bo3b2o216bo2bo159b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o251bo5bo2b5o281b o3b2o255b2o2bo3b2o$249b4ob2o2b4o220b2o146bo2bo8b6o11b2o6bo2bo4bo2b3o 44b4ob2o4b3o7bo255bo290b2o2bo250b4ob2o2b4o$249b6o229bo149bo8b4o8bo4b2o 6b2o9bo45b6o7b2ob6o249bo4bo3b5o278b2obobob3o63bo186b6o$250b4o4b4o220b 4o144bo3bo18b2o20b4o47b4o4b4o9bobo248b2o9bo256b2o19b3obo6bo62b4o184b4o 4b4o$257bo3b2o211bo6bo4bo144b4o14bo4b2o22bo54bo3bo4bob7o252bo2bo3bo 251b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o191bo3b2o$259b2o2bo210bob2o5bo2bo 160b2o26b2o58b3o4bo7b2o248bobo3bob4o62bobo173bo2bo8b6o11b2o6bo2bo4bo2b 3o44b4ob2o4b3o7bo191b2o2bo$254b2obobob3o63bo149bo5bo2bo154b2o5b2o23b4o 48bobo3bobobo3b2o4b2o4b2o223b6o17bo4bo7bo61bo2bo176bo8b4o8bo4b2o6b2o9b o45b6o7b2ob6o186b2obobob3o63bo$232b2o19b3obo6bo62b4o146bo7bo155b2o30bo 51bobo3bobo8bo2bo4b2o223bo5bo11bo5bo4bo5bo2bo45b6o4bo7b2o171bo3bo18b2o 20b4o47b4o4b4o9bobo161b2o19b3obo6bo62b4o$228b4ob2o12bo4b2o2b2o5b3o49b 2o5bo6b2o148bob4o157b2o80b2o6b2o8bobo236bo10bo6b2o2b2o5bo2bo44bo5bo4bo b2o6bo171b4o14bo4b2o22bo54bo3bo4bob7o156b4ob2o12bo4b2o2b2o5b3o49b2o5bo 6b2o$216bo2bo8b6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo146bo3bo210bo25bo4b 2o4b2o17b2o214b2o7bo4bo6bo4b3o6b2o5bo4bo50bo7bo2b6o186b2o26b2o58b3o4bo 7b2o143bo2bo8b6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo$220bo8b4o8bo4b2o6b2o 9bo45b6o7b2ob6o137b6o6bo207b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b 2o211b2ob2o8b2o7bo22b4o45bo4bo3b4o3bo7b2o177b2o5b2o23b4o48bobo3bobobo 3b2o4b2o4b2o146bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o$216bo3bo18b2o20b4o47b 4o4b4o9bobo133bo5bo2b5o206bo5bo2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o 210b4o13bo4b3o22bo48b2o9bo4bob3o3bo176b2o30bo51bobo3bobo8bo2bo4b2o143b o3bo18b2o20b4o47b4o4b4o9bobo$217b4o14bo4b2o22bo54bo3bo4bob7o138bo214b 2o48bo2bo6bob3o210b2o13bo28b2o54bo2bob2o2bob2o3bo3bo176b2o80b2o6b2o8bo bo151b4o14bo4b2o22bo54bo3bo4bob7o$233b2o26b2o58b3o4bo7b2o131bo4bo3b5o 210bobo2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o220b2o4b3o23bo2bo58bo5bo3b 2o5bo232bo21bo4b2o4b2o17b2o160b2o26b2o58b3o4bo7b2o$227b2o5b2o23b4o48bo bo3bobobo3b2o4b2o4b2o132b2o9bo211b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o 2b2o253bobo49bo5bobo7bob4o3b3o228b2o3bo2b2o2b2o2b2o2b2o2b2o20bobo4b2o 2b2o153b2o5b2o23b4o48bobo3bobobo3b2o4b2o4b2o$227b2o30bo51bobo3bobo8bo 2bo4b2o138bo2bo3bo236bo4b2o4b2o17b2o222b3o80bo8bo9bo236bo5bo2b2o2b2o2b 2o2b2o3b2o21bo4b3o2b2o152b2o30bo51bobo3bobo8bo2bo4b2o$228b2o80b2o6b2o 8bobo142bobo3bob4o62bobo174b2o6b2o8bobo307bo4b3o4b3o7bobo6b3o228b2o44b o2bo6bob3o152b2o80b2o6b2o8bobo$306bo4b2o4b2o17b2o111b6o17bo4bo7bo61bo 2bo174bobo3bobo8bo2bo4b2o283b2o2b2o2b2o2b2o2bo22bo5bo5bo230bobo2b2o2b 2o2b2o2b2o3b2o21bo4b3o2b2o231bo4b2o4b2o17b2o$240b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o109bo5bo 11bo5bo4bo5bo2bo45b6o4bo7b2o97b4o72bobo3bobobo3b2o4b2o4b2o282b2o2b2o2b 2o2b2o2b3o21b2o3bob2o3bo230b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o210b2o 2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o$240b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o114bo10bo6b2o2b2o5bo2b o44bo5bo4bob2o6bo95bo3bo82b3o4bo7b2o283b2o37b3o6bo3bo252bo4b2o4b2o17b 2o212bo2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o$236b2o88bo2bo6bob3o98b2o7bo4bo 6bo4b3o6b2o5bo4bo50bo7bo2b6o84b5o9bo80bo3bo4bob7o288b2o2b2o2b2o2b3o21b 2o3bob2o3bo256b2o6b2o8bobo260bo2bo6bob3o$235bo2bob2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o97b2ob2o8b2o 7bo22b4o45bo4bo3b4o3bo7b2o80bo4bo5bo2bo74b4o4b4o9bobo289b2o2b2o2b2o2bo 22bo5bo5bo258bobo3bobo8bo2bo4b2o206b2o3b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o 2b2o$236b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o20bobo4b2o2b2o98b4o13bo4b3o22bo48b2o9bo4bob3o3bo84bo82b6o7b 2ob6o305bo4b3o4b3o7bobo6b3o183b4o72bobo3bobobo3b2o4b2o4b2o214b2o2b2o2b 2o2b2o2b2o20bobo4b2o2b2o$306bo4b2o4b2o17b2o100b2o13bo28b2o54bo2bob2o2b ob2o3bo3bo78bo3bo83b4ob2o4b3o7bo310bo8bo9bo191bo3bo82b3o4bo7b2o233bo4b 2o4b2o17b2o$310b2o6b2o8bobo116b2o4b3o23bo2bo58bo5bo3b2o5bo47b6o27bo89b 2o5bo6b2o238b2o73bo5bobo7bob4o3b3o172b5o9bo80bo3bo4bob7o238b2o6b2o8bob o$311bobo3bobo8bo2bo4b2o141bobo49bo5bobo7bob4o3b3o46bo5bo129b4o237b4o 82bo5bo3b2o5bo171bo4bo5bo2bo74b4o4b4o9bobo240bobo3bobo8bo2bo4b2o$235b 4o72bobo3bobobo3b2o4b2o4b2o108b3o80bo8bo9bo61bo129bo230b3o7b2ob2o78bo 2bob2o2bob2o3bo3bo176bo82b6o7b2ob6o167b4o72bobo3bobobo3b2o4b2o4b2o$ 234bo3bo82b3o4bo7b2o187bo4b3o4b3o7bobo6b3o46bo4bo360b5o8b2o74b2o9bo4bo b3o3bo172bo3bo83b4ob2o4b3o7bo166bo3bo82b3o4bo7b2o$224b5o9bo80bo3bo4bob 7o175b2o2b2o2b2o2bo22bo5bo5bo47b2o362b3ob2o81bo4bo3b4o3bo7b2o142b6o27b o89b2o5bo6b2o158b5o9bo80bo3bo4bob7o$223bo4bo5bo2bo74b4o4b4o9bobo176b2o 2b2o2b2o2b3o21b2o3bob2o3bo413b2o88bo7bo2b6o144bo5bo129b4o157bo4bo5bo2b o74b4o4b4o9bobo$228bo82b6o7b2ob6o214b3o6bo3bo379b4o114bo5bo4bob2o6bo 151bo129bo165bo82b6o7b2ob6o$223bo3bo83b4ob2o4b3o7bo179b2o2b2o2b2o2b3o 21b2o3bob2o3bo378b6o114b6o4bo7b2o146bo4bo291bo3bo83b4ob2o4b3o7bo$192b 6o27bo89b2o5bo6b2o181b2o2b2o2b2o2bo22bo5bo5bo379b4ob2o128bo2bo149b2o 262b6o27bo89b2o5bo6b2o$191bo5bo129b4o194bo4b3o4b3o7bobo6b3o384b2o129bo bo413bo5bo129b4o$197bo129bo202bo8bo9bo946bo129bo$191bo4bo259b2o73bo5bo bo7bob4o3b3o931bo4bo$193b2o260b4o82bo5bo3b2o5bo933b2o$445b3o7b2ob2o78b o2bob2o2bob2o3bo3bo$444b5o8b2o74b2o9bo4bob3o3bo$444b3ob2o81bo4bo3b4o3b o7b2o$447b2o88bo7bo2b6o$413b4o114bo5bo4bob2o6bo$412b6o114b6o4bo7b2o$ 412b4ob2o128bo2bo$416b2o129bobo56$410b4o$409b6o115b2o12bobo$409b4ob2o 112bo4bo10bo2bo$413b2o119bo4bo7b2o$442b3o83bo5bo4bob2o6bo$441b5o83b6o 7bo2b6o$441b3ob2o6b2o82b4o3bo7b2o$444b2o6b4o85bo4bob3o3bo$452b2ob2o78b o2bob2o2bob2o3bo3bo$454b2o82bo5bo3b2o5bo$533b2obo7bob4o3b3o$189b6o129b o201bo6bo2bo9bo390b4o547b6o129bo$188bo5bo114b4o11b4o198bobo4bo2bo7bobo 6b3o380b6o115b2o12bobo413bo5bo114b4o11b4o$194bo113b6o5bo6b2o180b2o2b2o 2b2o2bo5b2o6b2o8bo5bo5bo379b4ob2o112bo4bo10bo2bo418bo113b6o5bo6b2o$ 188bo4bo114b4ob2o4b3o7bo178b2o2b2o2b2o2b2o23b2o3bob2o3bo382b2o119bo4bo 7b2o411bo4bo114b4ob2o4b3o7bo$190b2o29b5o86b2o7b2ob6o214b3o6bo3bo411b3o 83bo5bo4bob2o6bo146b6o129bo130b2o29b5o86b2o7b2ob6o$220bo4bo91b4o9bobo 175b2o2b2o2b2o2b2o23b2o3bob2o3bo410b5o83b6o7bo2b6o144bo5bo114b4o11b4o 157bo4bo91b4o9bobo$225bo6b4o80bo3bo4bob7o174b2o2b2o2b2o2bo5b2o6b2o8bo 5bo5bo411b3ob2o6b2o82b4o3bo7b2o147bo113b6o5bo6b2o162bo6b4o80bo3bo4bob 7o$220bo3bo6bo3bo82b3o4bo7b2o191bobo4bo2bo7bobo6b3o415b2o6b4o85bo4bob 3o3bo140bo4bo114b4ob2o4b3o7bo155bo3bo6bo3bo82b3o4bo7b2o$222bo12bo78bob obo3b2o4b2o4b2o108b2o80bo6bo2bo9bo56b6o129bo240b2ob2o78bo2bob2o2bob2o 3bo3bo141b2o29b5o86b2o7b2ob6o157bo12bo78bobobo3b2o4b2o4b2o$231bo2bo79b obo8bo2bo4b2o114b2o25bobo54b2obo7bob4o3b3o46bo5bo114b4o11b4o239b2o82bo 5bo3b2o5bo171bo4bo91b4o9bobo163bo2bo79bobo8bo2bo4b2o$306bobo4bob2o8bob o121bobo24bo2bo58bo5bo3b2o5bo52bo113b6o5bo6b2o318b2obo7bob4o3b3o176bo 6b4o80bo3bo4bob7o237bobo4bob2o8bobo$236bo69b2o6b2o17b2o114bo5b2o22b2o 54bo2bob2o2bob2o3bo3bo46bo4bo114b4ob2o4b3o7bo309bo6bo2bo9bo180bo3bo6bo 3bo82b3o4bo7b2o236b2o6b2o17b2o$232b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o100b2o17bobo23bo 59bo4bob3o3bo49b2o29b5o86b2o7b2ob6o309bobo4bo2bo7bobo6b3o173bo12bo78bo bobo3b2o4b2o4b2o213b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o$231bo5bo2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o23bo4b3o 2b2o97b2ob2o16bo5b2o7b2o7b4o54b4o3bo7b2o80bo4bo91b4o9bobo288b2o2b2o2b 2o2bo5b2o6b2o8bo5bo5bo181bo2bo79bobo8bo2bo4b2o214b2o2b2o2b2o2b2o2b2o 23bo4b3o2b2o$232b2o89bo2bo6bob3o96b4o23bobo4bo4bo4bo4bo45b6o7bo2b6o88b o6b4o80bo3bo4bob7o287b2o2b2o2b2o2b2o23b2o3bob2o3bo255bobo4bob2o8bobo 217b2o41bo2bo6bob3o$235bobo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o98b2o9b6o9bo5bo6bo5bo2bo44bo5bo4bob 2o6bo84bo3bo6bo3bo82b3o4bo7b2o282b2obo36b3o6bo3bo255b2o6b2o17b2o209bo 2bob2o2b2o2b2o2b2o2b2o23bo4b3o2b2o$236b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o109bo5bo15bo6b o5bo2bo50bo4bo7b2o87bo12bo78bobobo3b2o4b2o4b2o280bo2b4o2b2o2b2o2b2o23b 2o3bob2o3bo229b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o209b2o2b2o2b 2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o$224bo81b2o6b2o17b2o116bo15b3o2bobo 7bo45bo4bo10bo2bo97bo2bo79bobo8bo2bo4b2o282b2ob3o2b2o2b2o2bo5b2o6b2o8b o5bo5bo231bo2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o152bo81b2o6b2o17b2o$224bo 81bobo4bob2o8bobo117bo4bo17b2o6bob4o48b2o12bobo173bobo4bob2o8bobo311bo bo4bo2bo7bobo6b3o274bo2bo6bob3o151bo81bobo4bob2o8bobo$225bo4bo25bo57bo bo8bo2bo4b2o112b2o24bo2bo3bo239b2o6b2o17b2o222b2o80bo6bo2bo9bo235b2o3b 2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o153bo4bo25bo57bobo8bo2bo4b2o$229b2o 25b4o54bobobo3b2o4b2o4b2o143bo210b2o2b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bo bo4b2o2b2o226b2o25bobo54b2obo7bob4o3b3o235b2o2b2o2b2o2b2o2bobo4bo6bo8b obo4b2o2b2o158b2o25b4o54bobobo3b2o4b2o4b2o$213bo2bo12bobo4bo21b2o58b3o 4bo7b2o140b5o211bo2b2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o225bobo24bo2bo 58bo5bo3b2o5bo175bo81b2o6b2o17b2o143bo2bo12bobo4bo21b2o58b3o4bo7b2o$ 217bo17b2o24bo54bo3bo4bob7o133b6o264bo2bo6bob3o224bo5b2o22b2o54bo2bob 2o2bob2o3bo3bo175bo81bobo4bob2o8bobo154bo17b2o24bo54bo3bo4bob7o$213bo 3bo17bobo4bo15b4o55b4o9bobo133bo5bo2b5o205b2o3b2o2b2o2b2o2b2o2b2o2b2o 2b2o23bo4b3o2b2o212b2o17bobo23bo59bo4bob3o3bo177bo4bo25bo57bobo8bo2bo 4b2o143bo3bo17bobo4bo15b4o55b4o9bobo$214b4o23b2o6b4o9bo49b2o7b2ob6o 142bo6bo214b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o211b2ob2o16bo5b 2o7b2o7b4o54b4o3bo7b2o182b2o25b4o54bobobo3b2o4b2o4b2o143b4o23b2o6b4o9b o49b2o7b2ob6o$229b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo136bo4bo4bo3bo157b o81b2o6b2o17b2o212b4o23bobo4bo4bo4bo4bo45b6o7bo2b6o169bo2bo12bobo4bo 21b2o58b3o4bo7b2o159b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo$225b4ob2o15b2o 4b2o5b3o45b6o5bo6b2o140b2o6bob4o156bo81bobo4bob2o8bobo220b2o9b6o9bo5bo 6bo5bo2bo44bo5bo4bob2o6bo174bo17b2o24bo54bo3bo4bob7o156b4ob2o15b2o4b2o 5b3o45b6o5bo6b2o$225b6o17b2o2bobo6bo47b4o11b4o146bo7bo156bo4bo25bo57bo bo8bo2bo4b2o223bo5bo15bo6bo5bo2bo50bo4bo7b2o171bo3bo17bobo4bo15b4o55b 4o9bobo157b6o17b2o2bobo6bo47b4o11b4o$226b4o22bobobob3o63bo149bo5bo2bo 159b2o25b4o54bobobo3b2o4b2o4b2o228bo15b3o2bobo7bo45bo4bo10bo2bo173b4o 23b2o6b4o9bo49b2o7b2ob6o161b4o22bobobob3o63bo$248bo7b2o2bo210bob2o5bo 2bo143bo2bo12bobo4bo21b2o58b3o4bo7b2o223bo4bo17b2o6bob4o48b2o12bobo 189b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo183bo7b2o2bo$254bo3b2o211bo6bo4b o147bo17b2o24bo54bo3bo4bob7o226b2o24bo2bo3bo251b4ob2o15b2o4b2o5b3o45b 6o5bo6b2o191bo3b2o$255b4o220b4o144bo3bo17bobo4bo15b4o55b4o9bobo259bo 252b6o17b2o2bobo6bo47b4o11b4o192b4o$250b2o229bo146b4o23b2o6b4o9bo49b2o 7b2ob6o258b5o253b4o22bobobob3o63bo190b2o$246b4ob2o2b4o220b2o162b2o10bo bo4b6o4bo2b3o44b4ob2o4b3o7bo250b6o282bo7b2o2bo250b4ob2o2b4o$246b6o2bo 3b2o216bo2bo159b4ob2o15b2o4b2o5b3o45b6o5bo6b2o251bo5bo2b5o281bo3b2o 251b6o2bo3b2o$247b4o5b2o2bo215bobo160b6o17b2o2bobo6bo47b4o11b4o257bo6b o282b4o253b4o5b2o2bo$254bobob3o379b4o22bobobob3o63bo254bo4bo4bo3bo276b 2o267bobob3o$254bo6bo400bo7b2o2bo320b2o6bob4o271b4ob2o2b4o260bo6bo$ 253b2o5b3o405bo3b2o327bo7bo270b6o2bo3b2o258b2o5b3o$251b3o4bo2b3o405b4o 328bo5bo2bo270b4o5b2o2bo255b3o4bo2b3o$251bo10bo401b2o332bob2o5bo2bo 277bobob3o255bo10bo$258b4o398b4ob2o2b4o325bo6bo4bo277bo6bo261b4o$261bo 398b6o2bo3b2o332b4o277b2o5b3o263bo$258b2o401b4o5b2o2bo333bo276b3o4bo2b 3o259b2o$256b4o408bobob3o331b2o277bo10bo258b4o$256bo411bo6bo327bo2bo 285b4o259bo$667b2o5b3o326bobo289bo$665b3o4bo2b3o614b2o$665bo10bo613b4o $672b4o614bo$675bo627b2o$672b2o625b4ob2o$670b4o625b6o$670bo629b4o3$ 1317b2o$1317b2o2$441b2o290b2o290b2o290b2o$441b2o290b2o290b2o290b2o9$ 442b2o$441bo2bo$441bo2bo1110bo$442b2o1111b4o$1557b2o$1560bo$1557b4o$ 1550bo10bo$1550b3o4bo2b3o$1552b2o5b3o$1553bo6bo$1553bobob3o$440b2o290b 2o812b4o5b2o2bo$439bo2bo288bo2bo810b6o2bo3b2o$439bo2bo288bo2bo810b4ob 2o2b4o$440b2o290b2o815b2o$1032bo521b4o$1030b2o521bo3b2o$1031b2o514bo7b 2o2bo$1525b4o22bobobob3o63bo$1524b6o17b2o2bobo6bo47b4o11b4o$1524b4ob2o 15b2o4b2o5b3o45b6o5bo6b2o$1528b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo$ 1513b4o23b2o6b4o9bo49b2o7b2ob6o$439b2o290b2o779bo3bo17bobo4bo15b4o55b 4o9bobo$439b2o290b2o783bo17b2o24bo54bo3bo4bob7o$1512bo2bo12bobo4bo21b 2o58b3o4bo7b2o$1528b2o25b4o54bobobo3b2o4b2o4b2o$1524bo4bo25bo57bobo8bo 2bo4b2o$1523bo81bobo4bob2o8bobo$1523bo81b2o6b2o17b2o$960bo618b2o2b2o2b 2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o$960b4o42b2o570bo2bob2o2b2o2b2o2b2o 2b2o23bo4b3o2b2o$962b2o38b4ob2o570b2o41bo2bo6bob3o$965bo36b6o23b2o550b 2o2b2o2b2o2b2o2b2o23bo4b3o2b2o$962b4o37b4o23b2o551b2o2b2o2b2o2b2o2bobo 4bo6bo8bobo4b2o2b2o$955bo10bo65bo572b2o6b2o17b2o$250bobo702b3o4bo2b3o 637bobo4bob2o8bobo$250bo2bo459bobo241b2o5b3o563bo2bo79bobo8bo2bo4b2o$ 253b2o458bo2bo241bo6bo555bo12bo78bobobo3b2o4b2o4b2o$255bo460b2o240bobo b3o554bo3bo6bo3bo82b3o4bo7b2o$253b4o461bo232b4o5b2o2bo559bo6b4o80bo3bo 4bob7o$245bo6bo4bo458b4o230b6o2bo3b2o555bo4bo91b4o9bobo$245bob2o5bo2bo 450bo6bo4bo229b4ob2o2b4o526b2o29b5o86b2o7b2ob6o$248bo5bo2bo450bob2o5bo 2bo233b2o531bo4bo114b4ob2o4b3o7bo$248bo7bo454bo5bo2bo238b4o530bo113b6o 5bo6b2o$242b2o6bob4o455bo7bo238bo3b2o523bo5bo114b4o11b4o$240bo4bo4bo3b o450b2o6bob4o233bo7b2o2bo523b6o129bo$246bo6bo449bo4bo4bo3bo212b4o22bob obob3o63bo$240bo5bo2b5o220bobo232bo6bo212b6o17b2o2bobo6bo47b4o11b4o$ 241b6o227bo2bo225bo5bo2b5o212b4ob2o15b2o4b2o5b3o45b6o5bo6b2o$249b5o 223b2o225b6o223b2o10bobo4b6o4bo2b3o44b4ob2o4b3o7bo$253bo225bo232b5o 201b4o23b2o6b4o9bo49b2o7b2ob6o$221b2o24bo2bo3bo222b4o235bo200bo3bo17bo bo4bo15b4o55b4o9bobo$219bo4bo25bob4o48b2o12bobo148bo6bo4bo202b2o24bo2b o3bo203bo17b2o24bo54bo3bo4bob7o$225bo19b2obo7bo45bo4bo10bo2bo147bob2o 5bo2bo200bo4bo17b2o6bob4o48b2o12bobo133bo2bo12bobo4bo21b2o58b3o4bo7b2o $219bo5bo12bo6bo2bo5bo2bo50bo4bo7b2o149bo5bo2bo206bo15b3o2bobo7bo45bo 4bo10bo2bo148b2o25b4o54bobobo3b2o4b2o4b2o$209b2o9b6o12bobo4bo2bo5bo2bo 44bo5bo4bob2o6bo148bo7bo201bo5bo15bo6bo5bo2bo50bo4bo7b2o143bo4bo25bo 57bobo8bo2bo4b2o$208b4o20bo5b2o6b2o4bo4bo45b6o7bo2b6o141b2o6bob4o192b 2o9b6o9bo5bo6bo5bo2bo44bo5bo4bob2o6bo141bo81bobo4bob2o8bobo$208b2ob2o 19bobo18b4o54b4o3bo7b2o136bo4bo4bo3bo192b4o23bobo4bo4bo4bo4bo45b6o7bo 2b6o140bo81b2o6b2o17b2o$210b2o14bo5b2o21bo59bo4bob3o3bo141bo6bo193b2ob 2o16bo5b2o7b2o7b4o54b4o3bo7b2o193b2o2b2o2b2o2b2o2b2o2bobo4bo6bo8bobo4b 2o2b2o$220bo5bobo24b2o54bo2bob2o2bob2o3bo3bo134bo5bo2b5o195b2o17bobo 23bo59bo4bob3o3bo183b2o3b2o2b2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o216bo$ 220bo5b2o22bo2bo50b2o6bo5bo3b2o5bo135b6o215bo5b2o22b2o54bo2bob2o2bob2o 3bo3bo234bo2bo6bob3o215b4o$220bobo27bobo50b3o2bobo7bob4o3b3o143b5o208b obo24bo2bo58bo5bo3b2o5bo188bo2b2o2b2o2b2o2b2o2b2o2b2o23bo4b3o2b2o218b 2o$220b2o81bo6bo9bo156bo208b2o25bobo54b2obo7bob4o3b3o187b2o2b2o2b2o2b 2o2b2o2b2o2bobo4bo6bo8bobo4b2o2b2o222bo$297bo5bo6bo7bobo6b3o115b2o24bo 2bo3bo202b2o80bo6bo2bo9bo226b2o6b2o17b2o220b4o$232b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo112bo 4bo17b2o6bob4o48b2o12bobo218bobo4bo2bo7bobo6b3o217bobo4bob2o8bobo220bo 10bo$232b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o3b2o7b2o11b2o3bob2o3bo117bo15b3o2bobo7bo45bo4bo10bo2bo195b2ob3o2b2o 2b2o2bo5b2o6b2o8bo5bo5bo141bo2bo79bobo8bo2bo4b2o213b3o4bo2b3o$228b2o 88b3o6bo3bo111bo5bo15bo6bo5bo2bo50bo4bo7b2o193bo2b4o2b2o2b2o2b2o23b2o 3bob2o3bo131bo12bo78bobobo3b2o4b2o4b2o214b2o5b3o$228b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o 3bo101b2o9b6o9bo5bo6bo5bo2bo44bo5bo4bob2o6bo193b2obo36b3o6bo3bo129bo3b o6bo3bo82b3o4bo7b2o216bo6bo$228b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo101b4o23bobo4bo4bo4bo 4bo45b6o7bo2b6o196b2o2b2o2b2o2b2o23b2o3bob2o3bo134bo6b4o80bo3bo4bob7o 217bobob3o$297bo5bo6bo7bobo6b3o102b2ob2o16bo5b2o7b2o7b4o54b4o3bo7b2o 193b2o2b2o2b2o2bo5b2o6b2o8bo5bo5bo130bo4bo91b4o9bobo211b4o5b2o2bo$303b o6bo9bo113b2o17bobo23bo59bo4bob3o3bo210bobo4bo2bo7bobo6b3o101b2o29b5o 86b2o7b2ob6o213b6o2bo3b2o$303b3o2bobo7bob4o3b3o117bo5b2o22b2o54bo2bob 2o2bob2o3bo3bo209bo6bo2bo9bo108bo4bo114b4ob2o4b3o7bo213b4ob2o2b4o$228b 2o74b2o6bo5bo3b2o5bo117bobo24bo2bo58bo5bo3b2o5bo216b2obo7bob4o3b3o105b o113b6o5bo6b2o219b2o$226b2ob2o78bo2bob2o2bob2o3bo3bo117b2o25bobo54b2ob o7bob4o3b3o137b2o82bo5bo3b2o5bo99bo5bo114b4o11b4o224b4o$218b2o6b4o85bo 4bob3o3bo113b2o80bo6bo2bo9bo144b2ob2o78bo2bob2o2bob2o3bo3bo100b6o129bo 226bo3b2o$215b3ob2o6b2o82b4o3bo7b2o196bobo4bo2bo7bobo6b3o127b2o6b4o85b o4bob3o3bo465b2o2bo$215b5o83b6o7bo2b6o181b2o2b2o2b2o2bo5b2o6b2o8bo5bo 5bo123b3ob2o6b2o82b4o3bo7b2o436b4o22bobobob3o63bo$216b3o83bo5bo4bob2o 6bo182b2o2b2o2b2o2b2o23b2o3bob2o3bo122b5o83b6o7bo2b6o438b6o21bobo6bo 47b4o11b4o$187b2o119bo4bo7b2o219b3o6bo3bo123b3o83bo5bo4bob2o6bo439b4ob 2o12bobo4bob2o5b3o45b6o5bo6b2o$183b4ob2o112bo4bo10bo2bo184b2o2b2o2b2o 2b2o23b2o3bob2o3bo94b2o119bo4bo7b2o444b2o13b2o6b2o4bo2b3o44b4ob2o4b3o 7bo$183b6o115b2o12bobo185b2o2b2o2b2o2bo5b2o6b2o8bo5bo5bo91b4ob2o112bo 4bo10bo2bo430b4o20bobo4bo6bo9bo49b2o7b2ob6o$184b4o336bobo4bo2bo7bobo6b 3o92b6o115b2o12bobo430bo3bo20b2o18b4o55b4o9bobo$524bo6bo2bo9bo102b4o 567bo8b2o4bobo4bo21bo54bo3bo4bob7o$531b2obo7bob4o3b3o660bo2bo15b2o24b 2o50bo7b3o4bo7b2o$452b2o82bo5bo3b2o5bo673bobo4bo22b4o54bobobo3b2o4b2o 4b2o$450b2ob2o78bo2bob2o2bob2o3bo3bo673b2o28bo53b2o2bobo8bo2bo4b2o$ 442b2o6b4o85bo4bob3o3bo675bo81b2o4b2o8bobo$439b3ob2o6b2o82b4o3bo7b2o 752bobo4b6o17b2o$439b5o83b6o7bo2b6o726b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o 6b4o8bobo4b2o2b2o$440b3o83bo5bo4bob2o6bo726bobo2b2o2b2o2b2o2b2o2b2o2b 2o4bo20bo4b3o2b2o$411b2o119bo4bo7b2o724b2o51bo2bo6bob3o$407b4ob2o112bo 4bo10bo2bo724bo5bo2b2o2b2o2b2o2b2o2b2o2b2o4bo20bo4b3o2b2o$407b6o115b2o 12bobo726b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o3b2o6b4o8bobo4b2o2b2o$408b4o 863bo28bobo4b6o17b2o$1310b2o4b2o8bobo$1232bo2bo75b2o2bobo8bo2bo4b2o$ 1223bo12bo78bobobo3b2o4b2o4b2o$1221bo3bo6bo3bo74bo7b3o4bo7b2o$1226bo6b 4o80bo3bo4bob7o$1221bo4bo91b4o9bobo$1191b2o29b5o86b2o7b2ob6o$1189bo4bo 114b4ob2o4b3o7bo$1195bo113b6o5bo6b2o$1189bo5bo114b4o11b4o$1190b6o129bo $1161b4o$1160b6o115b2o12bobo$1160b4ob2o112bo4bo10bo2bo$1164b2o119bo4bo 7b2o$1193b3o83bo5bo4bob2o6bo$1192b5o83b6o7bo2b6o$1192b3ob2o6b2o82b4o3b o7b2o$1195b2o6b4o85bo4bob3o3bo$1203b2ob2o78bo2bob2o2bob2o3bo3bo$1205b 2o82bo5bo3b2o5bo$1284b2obo7bob4o3b3o$379b2o896bo6bo2bo9bo$377bo4bo894b obo4bo2bo7bobo6b3o$383bo129bo721b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2bo 5b2o6b2o8bo5bo5bo$377bo5bo129b4o718b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o23b2o3bob2o3bo$378b6o27bo89b2o5bo6b2o778b3o6bo3bo$409bo3bo83b4ob2o 4b3o7bo716b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o23b2o3bob2o3bo$414bo 82b6o7b2ob6o716b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2bo5b2o6b2o8bo5bo5bo $409bo4bo5bo2bo74b4o4b4o9bobo755bobo4bo2bo7bobo6b3o$410b5o9bo80bo3bo4b ob7o672b2o80bo6bo2bo9bo$420bo3bo82b3o4bo7b2o676b2o25bobo54b2obo7bob4o 3b3o$421b4o72bobo3bobobo3b2o4b2o4b2o675bobo24bo2bo58bo5bo3b2o5bo$158b 4o335bobo3bobo8bo2bo4b2o94b2o580bo5b2o22b2o54bo2bob2o2bob2o3bo3bo$157b 6o115b2o12bobo201b2o6b2o8bobo99bo4bo565b2o17bobo23bo59bo4bob3o3bo$157b 4ob2o112bo4bo10bo2bo196bo4b2o4b2o17b2o98bo129bo432b2ob2o16bo5b2o7b2o7b 4o54b4o3bo7b2o$161b2o119bo4bo7b2o137b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o91bo5bo129b4o429b4o23bobo4bo4b o4bo4bo45b6o7bo2b6o$190b3o83bo5bo4bob2o6bo135bobo2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o91b6o27bo89b2o5bo6b2o 430b2o9b6o9bo5bo6bo5bo2bo44bo5bo4bob2o6bo$189b5o83b6o7bo2b6o131b2o80bo 2bo6bob3o121bo3bo83b4ob2o4b3o7bo438bo5bo15bo6bo5bo2bo50bo4bo7b2o$189b 3ob2o6b2o82b4o3bo7b2o127bo5bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o3b2o21bo4b3o2b2o127bo82b6o7b2ob6o444bo15b3o2bobo7bo45bo4bo 10bo2bo$192b2o6b4o85bo4bob3o3bo127b2o3bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o123bo4bo5bo2bo74b4o4b4o9bobo 435bo4bo17b2o6bob4o48b2o12bobo$200b2ob2o78bo2bob2o2bob2o3bo3bo130bo57b o4b2o4b2o17b2o125b5o9bo80bo3bo4bob7o102b4o330b2o24bo2bo3bo$202b2o74b2o 6bo5bo3b2o5bo110b2o80b2o6b2o8bobo142bo3bo82b3o4bo7b2o100b6o115b2o12bob o229bo$277b3o2bobo7bob4o3b3o109b2o30bo51bobo3bobo8bo2bo4b2o136b4o72bob o3bobobo3b2o4b2o4b2o99b4ob2o112bo4bo10bo2bo224b5o$277bo6bo9bo118b2o5b 2o23b4o48bobo3bobobo3b2o4b2o4b2o211bobo3bobo8bo2bo4b2o104b2o119bo4bo7b 2o215b6o$271bo5bo6bo7bobo6b3o115b2o26b2o58b3o4bo7b2o211b2o6b2o8bobo 140b3o83bo5bo4bob2o6bo213bo5bo2b5o$238bo3b2o2b2o2b2o2b2o2b2o2b2o2b2o3b obo4bo4bo8bo5bo5bo98b4o14bo4b2o22bo54bo3bo4bob7o208bo4b2o4b2o17b2o132b 5o83b6o7bo2b6o218bo6bo$237bo8b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob 2o3bo96bo3bo18b2o20b4o47b4o4b4o9bobo131b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o131b3ob 2o6b2o82b4o3bo7b2o209bo4bo4bo3bo$238bo3bo49b3o6bo3bo100bo8b4o8bo4b2o6b 2o9bo45b6o7b2ob6o134b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o133b2o6b4o85bo4bob3o3bo210b 2o6bob4o$243bo2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo96bo2bo8b 6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo232bo2bo6bob3o140b2ob2o78bo2bob2o2b ob2o3bo3bo215bo7bo$242b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo 109b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o136b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o143b2o 74b2o6bo5bo3b2o5bo215bo5bo2bo$271bo5bo6bo7bobo6b3o45bobo66b2o19b3obo6b o62b4o135bo2bob2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o219b3o2bobo7bob4o3b3o212bob2o5bo2bo$ 194b2o81bo6bo9bo54b2o89b2obobob3o63bo138bo2bo75bo4b2o4b2o17b2o220bo6bo 9bo221bo6bo4bo$194bobo27bobo50b3o2bobo7bob4o3b3o46bo94b2o2bo202bo2bo 79b2o6b2o8bobo221bo5bo6bo7bobo6b3o220b4o$194bo5b2o22bo2bo50b2o6bo5bo3b 2o5bo139bo3b2o203b2o30bo51bobo3bobo8bo2bo4b2o165b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo221bo$194bo5bobo24b2o54b o2bob2o2bob2o3bo3bo132b4o4b4o204b2o5b2o23b4o48bobo3bobobo3b2o4b2o4b2o 164b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o 3bo218b2o$184b2o14bo5b2o21bo59bo4bob3o3bo132b6o217b2o26b2o58b3o4bo7b2o 235b3o6bo3bo215bo2bo$182b2ob2o19bobo18b4o54b4o3bo7b2o133b4ob2o2b4o194b 4o14bo4b2o22bo54bo3bo4bob7o166b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o3b2o7b2o11b2o3bob2o3bo215bobo$182b4o20bo5b2o6b2o4bo4bo45b6o7bo 2b6o140b2o2bo3b2o192bo3bo18b2o20b4o47b4o4b4o9bobo167b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo$183b2o9b6o12bobo4bo 2bo5bo2bo44bo5bo4bob2o6bo147b2o2bo195bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o 219bo5bo6bo7bobo6b3o$193bo5bo12bo6bo2bo5bo2bo50bo4bo7b2o146bobob3o191b o2bo8b6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo142b2o81bo6bo9bo$199bo19b2obo 7bo45bo4bo10bo2bo147bo6bo202b4ob2o12bo4b2o2b2o5b3o49b2o5bo6b2o144bobo 27bobo50b3o2bobo7bob4o3b3o$193bo4bo25bob4o48b2o12bobo147b2o5b3o205b2o 19b3obo6bo62b4o144bo5b2o22bo2bo50b2o6bo5bo3b2o5bo$195b2o24bo2bo3bo211b 3o4bo2b3o226b2obobob3o63bo147bo5bobo24b2o54bo2bob2o2bob2o3bo3bo$227bo 212bo10bo232b2o2bo201b2o14bo5b2o21bo59bo4bob3o3bo$223b5o219b4o231bo3b 2o200b2ob2o19bobo18b4o54b4o3bo7b2o$215b6o229bo224b4o4b4o201b4o20bo5b2o 6b2o4bo4bo45b6o7bo2b6o$214bo5bo2b5o219b2o225b6o209b2o9b6o12bobo4bo2bo 5bo2bo44bo5bo4bob2o6bo$220bo6bo217b4o225b4ob2o2b4o212bo5bo12bo6bo2bo5b o2bo50bo4bo7b2o$214bo4bo4bo3bo216bo232b2o2bo3b2o217bo19b2obo7bo45bo4bo 10bo2bo$216b2o6bob4o454b2o2bo210bo4bo25bob4o48b2o12bobo458b4o$222bo7bo 451bobob3o212b2o24bo2bo3bo523b6o115b2o12bobo$222bo5bo2bo450bo6bo243bo 524b4ob2o112bo4bo10bo2bo$219bob2o5bo2bo449b2o5b3o238b5o528b2o119bo4bo 7b2o$219bo6bo4bo447b3o4bo2b3o229b6o564b3o83bo5bo4bob2o6bo$227b4o448bo 10bo229bo5bo2b5o556b5o83b6o7bo2b6o$229bo456b4o236bo6bo556b3ob2o6b2o82b 4o3bo7b2o$227b2o460bo230bo4bo4bo3bo558b2o6b4o85bo4bob3o3bo$224bo2bo 458b2o234b2o6bob4o565b2ob2o78bo2bob2o2bob2o3bo3bo$224bobo457b4o240bo7b o566b2o74b2o6bo5bo3b2o5bo$684bo243bo5bo2bo640b3o2bobo7bob4o3b3o$925bob 2o5bo2bo640bo6bo9bo$925bo6bo4bo36b2o596bo5bo6bo7bobo6b3o$933b4o35bo4bo 529b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bob o4bo4bo8bo5bo5bo$935bo42bo528b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo$933b2o37bo5bo614b3o6bo3bo $930bo2bo39b6o528b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo$930bobo574b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo$1572bo5bo6bo 7bobo6b3o$1495b2o81bo6bo9bo$1495bobo27bobo50b3o2bobo7bob4o3b3o$1495bo 5b2o22bo2bo50b2o6bo5bo3b2o5bo$1495bo5bobo24b2o54bo2bob2o2bob2o3bo3bo$ 3b2o290b2o290b2o290b2o604b2o14bo5b2o21bo59bo4bob3o3bo$bo2bo290b2o290b 2o290b2o602b2ob2o19bobo18b4o54b4o3bo7b2o$1483b4o20bo5b2o6b2o4bo4bo45b 6o7bo2b6o$o1483b2o9b6o12bobo4bo2bo5bo2bo44bo5bo4bob2o6bo$1494bo5bo12bo 6bo2bo5bo2bo50bo4bo7b2o$b2o1497bo19b2obo7bo45bo4bo10bo2bo$3bo1490bo4bo 25bob4o48b2o12bobo$1496b2o24bo2bo3bo$1528bo$2o3b2o1517b5o$2o3b2o289b2o 290b2o926b6o$b5o289bo2bo288bo2bo924bo5bo2b5o$2bobo290bo2bo288bo2bo930b o6bo$296b2o290b2o925bo4bo4bo3bo$2b3o1512b2o6bob4o$1523bo7bo$1523bo5bo 2bo$1520bob2o5bo2bo$1520bo6bo4bo$5bo1522b4o$4bobo1523bo$3bo3bo1520b2o$ 4b3o291b2o1225bo2bo$2b2o3b2o288bo2bo1224bobo$297bo2bo$298b2o9$5b2o290b 2o290b2o290b2o290b2o$5b2o290b2o290b2o290b2o290b2o5$1271b2o$640bobo626b o4bo$640bo2bo631bo$643b2o624bo5bo$645bo624b6o$643b4o613bobo$635bo6bo4b o612bo2bo$223bo411bob2o5bo2bo615b2o$223b4o411bo5bo2bo326bo290bo$225b2o 411bo7bo327b4o285b4o258bobo$228bo403b2o6bob4o330b2o277bo6bo4bo257bo2bo $225b4o401bo4bo4bo3bo334bo275bob2o5bo2bo260b2o$218bo10bo406bo6bo332b4o 278bo5bo2bo262bo$218b3o4bo2b3o399bo5bo2b5o325bo10bo277bo7bo261b4o$220b 2o5b3o401b6o332b3o4bo2b3o270b2o6bob4o254bo6bo4bo$221bo6bo410b5o327b2o 5b3o269bo4bo4bo3bo255bob2o5bo2bo$221bobob3o415bo328bo6bo276bo6bo259bo 5bo2bo$223b2o2bo383b2o24bo2bo3bo327bobob3o271bo5bo2b5o259bo7bo$217b2o 2bo3b2o382bo4bo25bob4o48b2o12bobo263b2o2bo272b6o260b2o6bob4o$213b4ob2o 2b4o221bo167bo19b2obo7bo45bo4bo10bo2bo256b2o2bo3b2o281b5o251bo4bo4bo3b o$213b6o228b4o158bo5bo12bo6bo2bo5bo2bo50bo4bo7b2o251b4ob2o2b4o286bo 257bo6bo$214b4o4b4o223b2o148b2o9b6o12bobo4bo2bo5bo2bo44bo5bo4bob2o6bo 250b6o261b2o24bo2bo3bo250bo5bo2b5o$221bo3b2o225bo145b4o20bo5b2o6b2o4bo 4bo45b6o7bo2b6o250b4o4b4o252bo4bo25bob4o48b2o12bobo185b6o$223b2o2bo 221b4o145b2ob2o19bobo18b4o54b4o3bo7b2o254bo3b2o257bo19b2obo7bo45bo4bo 10bo2bo192b5o$213bobo3bobobob3o63bo150bo10bo146b2o14bo5b2o21bo59bo4bob 3o3bo255b2o2bo250bo5bo12bo6bo2bo5bo2bo50bo4bo7b2o195bo$196b2o15bobo3bo bo6bo62b4o147b3o4bo2b3o155bo5bobo24b2o54bo2bob2o2bob2o3bo3bo249b2obobo b3o63bo176b2o9b6o12bobo4bo2bo5bo2bo44bo5bo4bob2o6bo162b2o24bo2bo3bo$ 192b4ob2o13b2o6b2o5b3o49b2o5bo6b2o149b2o5b3o156bo5b2o22bo2bo50b2o6bo5b o3b2o5bo227b2o19b3obo6bo62b4o172b4o20bo5b2o6b2o4bo4bo45b6o7bo2b6o159bo 4bo25bob4o48b2o12bobo$180bo2bo8b6o10bo4b2o4b2o4bo2b3o44b4ob2o4b3o7bo 148bo6bo157bobo27bobo50b3o2bobo7bob4o3b3o223b4ob2o12bo4b2o2b2o5b3o49b 2o5bo6b2o172b2ob2o19bobo18b4o54b4o3bo7b2o162bo19b2obo7bo45bo4bo10bo2bo $184bo8b4o9b2o21bo45b6o7b2ob6o148bobob3o158b2o81bo6bo9bo220bo2bo8b6o 11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo172b2o14bo5b2o21bo59bo4bob3o3bo155bo 5bo12bo6bo2bo5bo2bo50bo4bo7b2o$180bo3bo17bo4b2o16b4o47b4o4b4o9bobo147b 2o2bo235bo5bo6bo7bobo6b3o215bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o182bo5bobo 24b2o54bo2bob2o2bob2o3bo3bo144b2o9b6o12bobo4bo2bo5bo2bo44bo5bo4bob2o6b o$181b4o15b2o26bo54bo3bo4bob7o140b2o2bo3b2o187b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo210bo3bo18b2o20b4o47b4o4b 4o9bobo179bo5b2o22bo2bo50b2o6bo5bo3b2o5bo143b4o20bo5b2o6b2o4bo4bo45b6o 7bo2b6o$196bo4b2o22b2o58b3o4bo7b2o135b4ob2o2b4o188b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo210b4o14bo4b2o22bo 54bo3bo4bob7o178bobo27bobo50b3o2bobo7bob4o3b3o143b2ob2o19bobo18b4o54b 4o3bo7b2o$194b2o27b4o53b2obobo3b2o4b2o4b2o134b6o265b3o6bo3bo226b2o26b 2o58b3o4bo7b2o177b2o81bo6bo9bo154b2o14bo5b2o21bo59bo4bob3o3bo$195b2o 26bo55b3obo8bo2bo4b2o136b4o4b4o188b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo220b2o5b2o23b4o48bobo3bobobo3b2o4b2o 4b2o253bo5bo6bo7bobo6b3o155bo5bobo24b2o54bo2bob2o2bob2o3bo3bo$273bo4b 2o2b2o8bobo150bo3b2o187b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 3bobo4bo4bo8bo5bo5bo221b2o30bo51bobo3bobo8bo2bo4b2o193b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo154bo 5b2o22bo2bo50b2o6bo5bo3b2o5bo$271b2o6bo2bo17b2o50bo94b2o2bo235bo5bo6bo 7bobo6b3o222bo2bo79b2o6b2o8bobo200b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo153bobo27bobo50b3o2bobo 7bob4o3b3o$242b2o2b2o2b2o2b2o2b2o2b2o2b2o4b2o6b2o8bobo4b2o2b2o48b2o89b 2obobob3o63bo177bo6bo9bo231bo2bo75bo4b2o4b2o17b2o275b3o6bo3bo153b2o81b o6bo9bo$242b2o2b2o2b2o2b2o2b2o2b2o2b2o24bo4b3o2b2o47bobo66b2o19b3obo6b o62b4o174b3o2bobo7bob4o3b3o222bo2bob2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o192b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo 230bo5bo6bo7bobo6b3o$238b2o50bo2bo6bob3o111b4ob2o12bo4b2o2b2o5b3o49b2o 5bo6b2o99b2o74b2o6bo5bo3b2o5bo223b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o191b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo166b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo 4bo8bo5bo5bo$237bo2bob2o2b2o2b2o2b2o2b2o2b2o2b2o24bo4b3o2b2o100bo2bo8b 6o11b2o6bo2bo4bo2b3o44b4ob2o4b3o7bo95b2ob2o78bo2bob2o2bob2o3bo3bo321bo 2bo6bob3o251bo5bo6bo7bobo6b3o167b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo$238b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o4b2o6b2o8bobo4b2o2b2o105bo8b4o8bo4b2o6b2o9bo45b6o7b2ob6o 87b2o6b4o85bo4bob3o3bo224b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b3o2b2o258bo6bo9bo262b3o6bo3bo$ 271b2o6bo2bo17b2o102bo3bo18b2o20b4o47b4o4b4o9bobo81b3ob2o6b2o82b4o3bo 7b2o225b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o20bobo4b2o2b2o259b3o2bobo7bob4o3b3o167b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o7b2o11b2o3bob2o3bo $273bo4b2o2b2o8bobo110b4o14bo4b2o22bo54bo3bo4bob7o80b5o83b6o7bo2b6o 306bo4b2o4b2o17b2o185b2o74b2o6bo5bo3b2o5bo167b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3bobo4bo4bo8bo5bo5bo$279b3obo8bo 2bo4b2o119b2o26b2o58b3o4bo7b2o80b3o83bo5bo4bob2o6bo311b2o6b2o8bobo190b 2ob2o78bo2bob2o2bob2o3bo3bo232bo5bo6bo7bobo6b3o$199b4o77b2obobo3b2o4b 2o4b2o112b2o5b2o23b4o48bobo3bobobo3b2o4b2o4b2o50b2o119bo4bo7b2o313bobo 3bobo8bo2bo4b2o175b2o6b4o85bo4bob3o3bo239bo6bo9bo$198bo3bo82b3o4bo7b2o 113b2o30bo51bobo3bobo8bo2bo4b2o47b4ob2o112bo4bo10bo2bo238b4o72bobo3bob obo3b2o4b2o4b2o171b3ob2o6b2o82b4o3bo7b2o240b3o2bobo7bob4o3b3o$188b5o9b o80bo3bo4bob7o115b2o80b2o6b2o8bobo54b6o115b2o12bobo238bo3bo82b3o4bo7b 2o172b5o83b6o7bo2b6o168b2o74b2o6bo5bo3b2o5bo$187bo4bo5bo2bo74b4o4b4o9b obo136bo57bo4b2o4b2o17b2o48b4o361b5o9bo80bo3bo4bob7o174b3o83bo5bo4bob 2o6bo167b2ob2o78bo2bob2o2bob2o3bo3bo$192bo82b6o7b2ob6o135b2o3bo2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b2o2b2o411bo 4bo5bo2bo74b4o4b4o9bobo146b2o119bo4bo7b2o160b2o6b4o85bo4bob3o3bo$187bo 3bo83b4ob2o4b3o7bo134bo5bo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o3b2o21bo4b3o2b2o415bo82b6o7b2ob6o145b4ob2o112bo4bo10bo2bo158b 3ob2o6b2o82b4o3bo7b2o$156b6o27bo89b2o5bo6b2o137b2o80bo2bo6bob3o409bo3b o83b4ob2o4b3o7bo145b6o115b2o12bobo159b5o83b6o7bo2b6o$155bo5bo129b4o 140bobo2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o3b2o21bo4b 3o2b2o379b6o27bo89b2o5bo6b2o148b4o293b3o83bo5bo4bob2o6bo$161bo129bo 144b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o20bobo4b 2o2b2o379bo5bo129b4o416b2o119bo4bo7b2o$155bo4bo333bo4b2o4b2o17b2o386bo 129bo415b4ob2o112bo4bo10bo2bo$157b2o339b2o6b2o8bobo387bo4bo546b6o115b 2o12bobo$499bobo3bobo8bo2bo4b2o382b2o549b4o$423b4o72bobo3bobobo3b2o4b 2o4b2o$422bo3bo82b3o4bo7b2o$412b5o9bo80bo3bo4bob7o$411bo4bo5bo2bo74b4o 4b4o9bobo$416bo82b6o7b2ob6o$411bo3bo83b4ob2o4b3o7bo$380b6o27bo89b2o5bo 6b2o$379bo5bo129b4o$385bo129bo$379bo4bo$381b2o!golly-2.5-src/Patterns/Life/Breeders/p100-H-channel-breeder.rle0000644000175100001440000002105112156145314021011 00000000000000#C p100 c/2 Herschel channel breeder: David Bell, 19 December 1996 #C [See also p100-H-track-puffer.rle in the Puffers folder, which #C could easily be made into a breeder by adding a Herschel factory #C of any desired period to the stationary end of the Herschel track.] x = 647, y = 262, rule = B3/S23 183b6o4b4o$182bo5bo3b6o$188bo3b4oboo$182bo4bo8boo$169b5o10boo$157bo10b o4bo$155bo3bo13bo33boo$160bo7bo3bo30b4oboo6boo$133b5o17bo4bo9bo32b6o5b ooboo$132bo4bo18b5o43b4o6b4o$137bo47boo16bo11boo$132bo3bo48boo9bo6bo$ 134bo61bo$167bo7b4o17bo6boo7b3o$145boo21bo6b5o20booboo5bo3boo$133boo5b oo3boo20bo10bobo9boo9bob5obbobobboo$133boo5boo31boo4boo9boo10bobb3obo 5bo$172bobboo29bo3bobboo$130boo40boobobbo31bo$128bo4bo34boo4boobbo33bo $117b3o14bo32b3o6b3o3bobo$116b5o7bo5bo34bo6boo4boo32boo$116b3oboo7b6o 48bo14boo14booboo$119boo36bobo4bo5boo24bo4bo12b4o$158bo4boo4boo31bo12b oo$163b3obbo27bo5bo$167boo28b6o$122bobo42bo295boo$121bo4bo334bo4bo29b oo$121bo4bo340bo26bo4bo$121boo338bo5bo32bo$462b6o26bo5bo$121boobboo24b oo342b6o$121boobboo20b4oboo$121b3obo21b6o303boo$122bo25b4o300b4oboo17b o54b4o$123bo328b6o17bobo52b6o6boo$453b4o18bobbo51b4oboo4b4o$476boo10b 4o28b3o11boo5booboo$170bo321bo30boo18boo$168bo3bo282boo28bo6bo12boo10b o5b3o$173bo281boo8b3o14bob3o4bo13boo9boobo6bo$168bo4bo309boobo3bo35boo $169b5o309b4o30bobo4bobo6boo$486boo28bo7bobo6bo7boo$510boo5bo4boobo7bo bbo5boo$510boo6b4oboobo7b3o4boo$209b6o309bobo9boo3bo$128bo47boo30bo5bo 5b4o301bo$112boo12boobo45bobbo35bo4bo3bo$111b3o12bobboo32b3o3boo5boo 30bo4bo9bo263b5o50boo$111boobo14bo16boo9bo4bo3bobboo25boo12boo7bobbo 263bo4bo49b4o$112b3o31boo9bo4bo4bo20bo7boo293bo49booboo$113bo12b3o28bo 3bo5bo6bo11b3o17b3o8boo267bo3bo52boo$161boob4o6boo9b3obo14bo4bo6b5o 267bo$127bo33bo3boo6bobo8bo16bo5boo7bo4bo$151boo9bobbo17bobbo5b3o6bo3b o10b3obbo$124b3o24boo9b4o11boo5bobo7boboo4bobbobo9bobboo298boo$125bobb o5b3o40boo6boobo5boboo3bo4bobo9boo284boo12bo4bo$125bo10bo39bo11boo4boo 305b3oboo17bo$123boobo7bobo39bobo8boo11bo251bo48b5o12bo5bo$122boob3obb o3boo38bo3bo274boo47b3o14b6o$124bo4bo68bo21b4o228boo$174bobo20bo21bo3b o265boo$175bo21bo25bo261b4oboo3b6o$219bobbo262b6o3bo5bo$486b4o10bo$ 474boo18bo4bo7boo$471b3oboo19boo7bo4bo$177b3o20b4o255b3o9b5o35bo4bobbo $176b5o18bo3bo254b5o9b3o30bo5bo8bo$176b3oboo21bo230boo22b3oboo42b6o4bo 3bo$179boo18bobbo223boo3b3oboo24boo54b4o$422b4oboobb5o52boo$422b6o4b3o 53boo15b3o$423b4o71b3o$469boo7boo24boboo7boo$448boo21bo5bobb3o21bobo7b obboo$436boo5boo3boo16bobboo12bo9boo9boo3bo3b3obbo$436boo5boo22bo9bo5b o9boo11bob3obbo4bo$475boobo3bo30b5o$99bo375boobobo33boo$100boo360bo8b oo5bobbo4bo$99boo362bo7boo6boo4bo30bobbo$469bo10bo4b3o32bo$427bo32bobo 5bo4bo42bo3bo$428boo30bobo10bo26b4o13b4o$427boo32bo4boo4boo25b6o$466b oo3bo27b4oboo$469b3o31boo$108b3o448b5o$107b5o446bo4bo13b3o$107b3oboo 197b3o250bo13bobbo45b6o$95boo13boo106b5o86b5o137boo98b5obbo3bo14boobbo 28bo14bo5bo5b4o$93bo4bo118bo4bo86b3oboo134bo4bo95bo4bo4bo17bobbo26bo4b o17bo4bo3bo$99bo122bo74boo13boo141bo99bo23bobo32bo15bo9bo$93bo5bo105b 4o8bo3bo73bo4bo148bo5bo94bo3bo42boo8bo5bo11boboo7bobbo$94b6o48b6o50b6o 9bo81bo148b6o96bo44boo9boo$123boo22bo5bo5b4o41b4oboo84bo5bo285bo37boo 8bo$62boo62boo25bo4bo3bo45boo52boo32b6o48b6o231bo21bobbobobb3o4b3o8b3o $61b3o56boo5bo19bo4bo9bo95b4oboo6boo76bo5bo5b4o223bo18bo3bobbobb3obboo 4bo5bo3bo$61boobo32boo9bo10boo6bo21boo7bobbo96b6o5booboo81bo4bo3bo224b 3o10boo3bo9bobboboo5b5o4bo$62b3o32boo9bo7bo9bo17bo114b4o6b4o76bo4bo9bo 227bo9boo4bo10boo3boo4b4oboboo$63bo44bo12bo4bo16b3oboo79boo40boo45boo 9bo22boo7bobbo218boo33bobo7b3oboo3bo$115bo4bo4bo16boobbobo9boo68boo8b 3o14boo60boo9bo232bo18bo4bo4bobo25boo13bobo$115bob3o4bo16boobboobo4boo 3bobo87booboo5bo3bo65bo18b3o8boo199bo3bo19bo6boboo$74bo41booboobboo17b o4bo12bo86bo9b3o5bo3bo65b3o7bo4bo6b5o202bo16boobbobo5boo$75boo43bo4bo 17bo14b3o86bo5bo3bobo4bo4boo64b3o6bo3boo7bo4bo196bo4bo16b3ob5oboboo42b 4o$74boo45b5o22boo83boo3boo8bo6bobbo5bo5boo50boo16bo4boo10b3obbo197b5o 18boo4bobo44bo3bo$125boboo19boo83boo15b5o14boo51boo15bobo3boobo9bobboo 220b3obbooboo47bo$128boo120b4o4bobbo77bobo5bobo9boo41bo233bobbo$107boo 15b5o87bo42boo142boo11bobo$104b3oboo16boo31b4o51bo3bo183boo11bo$104b5o 49bo3bo56bo89boo104bo$105b3o54bo51bo4bo51boo33b3oboo49b4o50bobbo159b6o 33b4o$158bobbo53b5o49booboo32b5o49bo3bo50b3o86bo72bo5bo32bo3bo$269b4o 34b3o54bo139bobo76bo36bo$270boo88bobbo140boo71bo4bo33bobbo$579boo$137b 4o78bobo$136b6o77boo86bo$136b4oboo77bo86bobo29b4o$140boo105b6o54boo29b 6o223boo$246bo5bo85b4oboo219b3oboo$252bo89boo220b5o66boo$246bo4bo307b oo4b3o17bo11boo32b4oboo6boo$248boo306b3oboo23boo9bobbo31b6o5booboo$78b o477b5o22b4o3bo6boo33b4o6b4o$78bobo476b3o7boo13boo6bo26boo24boo$38bo 39boo8bo49bo49bo49bo49bo49bo49bo49bo128boo8b3obboboo31boo8bobo$38b3o 47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o116bo26b3o8b3o8bo20bobbo6bo$ 41bo7bo41bo49bo49bo49bo49bo49bo49bo49bo114bo29bo10bo6bobbo22bo5bo3b3o$ 40boo8boo38boo48boo48boo48boo48boo48boo48boo48boo115bo38bo10bo7bo14bo 4bo3bob3o$49boo521boo9bo19bo3bo7b4o3boo4b3o5bo6boo$572boo8boo14b3o3boo b3o5boobo3boo5bo7b5obo$377bo218booboo4bo3boo3bo3bo20b4o$31bo49bo49bo 49bo49bo49bo49bo46boo216bobbo6boo3bobboboo22bo$29b3o47b3o47b3o47b3o47b 3o47b3o47b3o45boo187b3o29bo8b4o5boo$28bo49bo49bo49bo49bo49bo49bo236b5o 26boo10b3o$3bo11boo11boo48boo48boo48boo48boo48boo48boo235b3oboo26boo 45boo$3b3o9boo358boo154bobo34boo26boo44booboo$3bobo368bobo154boo63bo 45b4o$5bo370bo155bo110boo$$144bobo$bo142boo$obo142bo105bo255bo79boo35b oo$bo247bobo254boo75b4oboo32booboo$40boo48boo158boo254bobo74b6o33b4o$ 40boo11boo35boo11boo48boo48boo379b4o35boo$53bo49bo49bo49bo$54b3o47b3o 29bo17b3o47b3o45boo341boo$56bo49bo29boo18bo49bo46boo329boo7bo4bo$135bo bo114bo329bo4bo11bo$588bo4bo5bo$545boboobo22b6o3bo5bo5b6o$15boo48boo 48boo48boo48boo48boo48boo48boo48boo48boo77bo4boboo19bo5bo4b6o$16bo49bo 49bo49bo49bo49bo49bo49bo49bo49bo77bo4boobbo24bo$13b3o47b3o47b3o47b3o 47b3o47b3o47b3o47b3o47b3o47b3o78bo3b3o3bo17bo4bo39b6o$13bo49bo49bo49bo 49bo49bo49bo49bo49bo49bo81b4obbobo20boo25bo14bo5bo5b4o$552bo46bo4bo17b o4bo3bo$542bo62bo15bo9bo$215boo324bobbo43boo8bo5bo11boboo7bobbo$213bo 4bo321b3o45boo9boo$219bo247boo72boo73boo8bo$199boo12bo5bo243b4oboo71b 4o35bo19bobbobobb3o4b3o8b3o$196b3oboo12b6o212boo29b6o73b3o34bobo16bo3b obbobb3obboo4bo5bo3bo$196b5o231bobo29b4o111bobbo10boo3bo9bobboboo5b5o 4bo$197b3o232bo147boo11boo4bo10boo3boo4b4oboboo$608bobo7b3oboo3bo$577b 3o29boo13bobo$200b3o34boo246bobbo40boo45bo3bo$236b4o192b3o54bo39bobo 44bo3bo$182b5o13bo35booboo49b3o138b5o49bo3bo39bo46bo3bo47b4o$181bo4bo 14boobboo31boo50bobbo137b3oboo49b4o87b3o47bo3bo$186bo16bobo84bo143boo 195bo$161bo19bo3bo19boboo25bo42boo11bo336bobbo$161boo19bo23boo8bo15bo 45boo11bobo273b6o22b5o$160bobo53bo11bo3bobboo40bo186bobo5bobo9boo80bo 5bo4b4o13bo4bo8b4o$181boo20bo20bobb3obo5bo209boo15bobo3boobo9bobboo84b o3b6o17bo7b6o$196bo5b3o9bo8bob5obbobobboo208boo16bo4boo10b3obbo78bo4bo 4b4oboo11bo3bo8b4oboo$195bobo3b4o8bo8booboo5bo3boo222b3o6bo3boo7bo4bo 80boo10boo14bo14boo$195bobobboobb3o7bo10boo7b3o223b3o7bo4bo6b5o$196bo bb3o3boo246bo18b3o8boo$177boo8b3o10b4o3bo17bo216boo9bo$177boo22b3o3bo 17bo11boo203boo9bo22boo7bobbo$202b3obbo18b4o6b4o234bo4bo9bo$205bo19b6o 5booboo239bo4bo3bo128boo$225b4oboo6boo234bo5bo5b4o124b4oboo$151boo76b oo190b6o48b6o133b6o$147b4oboo266bo5bo188b4o$147b6o38boo132b6o95bo$148b 4o6boo29bo4bo129bo5bo89bo4bo$156bo4bo33bo134bo91boo13boo$162bo26bo5bo 128bo4bo104b3oboo196bobbo$156bo5bo27b6o130boo106b5o144b3o54bo$157b6o 272b3o144b5o17boo30bo3bo$582b3oboo16bobo30b4o$585boo17bo$344b3o31boo$ 341boo3bo27b4oboo252bobo$302boo32bo4boo4boo25b6o247b3oboo3bo$303boo30b obo10bo26b4o13b4o216boo10boo4b4oboboo$302bo32bobo5bo4bo42bo3bo216boo8b oo5b5o4bo$344bo10bo4b3o32bo226boo4bo5bo3bo$338bo7boo6boo4bo30bobbo229b 3o8b3o$337bo8boo5bobbo4bo227bo27b3o5boo8bo$350boobobo33boo198boo16boo$ 350boobo3bo30b5o196b3o15boo16boboo7bobbo$311boo5boo22bo9bo5bo9boo11bob 3obbo4bo193b4o39bo9bo$311boo5boo3boo16bobboo12bo9boo9boo3bo3b3obbo192b oobo41bo4bo3bo$323boo21bo5bobb3o21bobo7bobboo231bo5bo5b4o$344boo7boo 24boboo7boo180b6o48b6o$298b4o71b3o195bo5bo$297b6o4b3o53boo15b3o194bo$ 297b4oboobb5o52boo206bo4bo$301boo3b3oboo24boo54b4o177boo13boo$309boo 22b3oboo42b6o4bo3bo189b3oboo$333b5o9b3o30bo5bo8bo189b5o$334b3o9b5o35bo 4bobbo191b3o$346b3oboo19boo7bo4bo$349boo18bo4bo7boo$361b4o10bo$360b6o 3bo5bo$360b4oboo3b6o$364boo$327boo$328boo47b3o14b6o$327bo48b5o12bo5bo$ 376b3oboo17bo$379boo12bo4bo$395boo3$363bo$361bo3bo52boo$366bo49booboo$ 361bo4bo49b4o$362b5o50boo$$400bo$399bobo9boo3bo$385boo6b4oboobo7b3o4b oo$385boo5bo4boobo7bobbo5boo$361boo28bo7bobo6bo7boo$358b4o30bobo4bobo 6boo$358boobo3bo35boo$330boo8b3o14bob3o4bo13boo9boobo6bo$330boo28bo6bo 12boo10bo5b3o$367bo30boo18boo$351boo10b4o28b3o11boo5booboo$328b4o18bo bbo51b4oboo4b4o$327b6o17bobo52b6o6boo$327b4oboo17bo54b4o$331boo$$370b 6o$337b6o26bo5bo$336bo5bo32bo$342bo26bo4bo$336bo4bo29boo$338boo!golly-2.5-src/Patterns/Life/Breeders/p90-rake-factory.rle0000644000175100001440000001245712156145314020137 00000000000000#C p90 gun for p20 space rake #C The gun fires a p20 rake every 90 generations. (The smallest period #C for a p20 rake gun is 86). The rake gun is a stationary breeder. #C Dieter Leithner, 11 Nov 1994 x = 288, y = 129, rule = B3/S23 164bobo$163bo2bo$133b2o27b2o10bo6bo$133b2o4b3o12b2o4b2o3bo8bo5bobo$ 119bo10b2o6b5o11b2o6b2o9bo6b2obo$119bobo7b3o5bo3bobo19bo2bo2b2o9b2ob2o 3b2o$122b2o6b2o6bo3b2o20bobo2bo2b3o5b2obo4b2o$93b2o13b2o12b2o9b2o34b4o 7bobo$67b2o24b2o13b2o12b2o9b2o35b2o9bo$67b2o50bobo$48b2o69bo11bo127bob o$48b2o79bobo125bo3bo$93bo36b2o31bo93bo19bo$66b3o23b3o66b2o87b2o4bo4bo 14b4o$66b3o22bo3bo34bo31b2o86b2o5bo12bo4b2obobo$65bo3bo20bob3obo33b2o 125bo3bo3bob2o5b3obo2bo2b2o$64bo5bo20b5o33bobo37b3o87bobo2bob4o5b2obob o3b2o$65bo3bo40b2o26bo30bo94b2o2b2o6b4o$26b2o38b3o41b2o27bo30bo106bo$ 26b2o109b3o$110bo$109bobo49b2o115b2o$46b5o41bo2b2o12bobo10b2o36bobo 115bobo$26bo18bob3obo15bobo22bobo15bo12b2o10b2o23bo16b2o100b3o$25bobo 18bo3bo15bo2bo21b2o29bo12bobo21b2o8b2o6bobo100b2o$24bo3bo18b3o14bob2o 22b2o45bo31b2o6bo11bo90b2o$25b3o20bo41b2obo13b2obob2o13b2o8b2o48bobo 88bobo$23b2o3b2o37bo23b3o13bo5bo13b2o28bo16b2o9b2o92bo$64b2obo40bo3bo 42b3o16b2o9b2o12b2o$66bo42b3o3bo23b2o13bo10b2o3bo6b2o6b2o12b2o44b2o$ 46bo45b2o3b2o16b2o22bo14b2o9bobo3bo5b3o7bobo55bo30b2o3b2o$46bo13b2o33b o18bobo9b2o9bobo26b5o6b2o10bo47bo5bobo11b2o17b2o3b2o$24bo20bobo5bo6b2o 4b2o3b2o19bo5bo25bo3bo8b2o28b3o4b2o25b2o33bobo4b2o11bobo$24bo19b2ob2o 2bobo13b5o12bobo6b2ob2o25bo5bo44b2o24bo2bo32b2obo16bo15b3o3b3o$24bob3o 14bo5bo2b2o13b2ob2o12b2o8bobo21b2o2b2obo3bo70bo23b2o10b2ob2o14b2o8b2o 5bo5b3o$46bo20b2ob2o13bo9bo22b2o3bo5bo9bobo10bo47bo23b2o10b2obo25b2o6b o5bo$29bo13b2o3b2o18b3o24bo28bo3bo10b2o10b3o46bobo33bobo$26bob2o82bo 13b2o12bo10b3o46bobo34bo$26b2o70bo13bo88bo40bobo$45bo51bobo11bobo35b2o 3b2o86b2o$45bo32bo5b3o10bobo10b2ob2o34b2o3b2o80bo6bo$21b2o3b2o16bo31b 2o6bo13bo10bo5bo24bo57b2o3b2o31bobo37b3o$21b2o3b2o40b2o7b2o6bo26bo25b 2o58bo5bo31b2o38b3o$22b5o7bo33b2o39b2o3b2o23b2o134bo3bo$23bobo9bo10b2o 47b2o3b2o24bo60bo11bo3bo$33b3o10b2o47bobobobo23bo60bobo11b3o41bo29b2o 3b2o$23b3o70b5o10bo13b3o26b2o13b2o15b2obo54b3o$68bo9b2o12b2o3b3o11bo 28bo13bo14bobo14b2ob2o3b2o51bo$66bobo8bobo12bobo3bo11bo29b3o7bo4b3o2b 2o2b2o6bo13b2obo4b2o50b2o$67b2o8bo14bo50bo5b2o6bo2b2obo2bo2bo2bo13bobo $58bo17b2o8b2o54b2o5bobo12b2o6bo8bo5bo$58b3o25b2o24b2o55bobo7bobo$24b 2o6b2o27bo50b2o55b2o9b2o16bo$24b2o6b2o26b2o136bobo59b2o$8b2o65bo122b2o 59b2o$9bo66bo166b2o16bo14b2o$9bobo5bo8bo2bo44b3o18b3o50b2o7b2o44bo39b 2o31b2o$10b2o4bobo10bo64b2ob2o19bo20b2o6bobo6b2o30bo13b3o81b2o$14b2o3b o5b2o3bo2bo15bo44b2ob2o17b2o21b2o8bo8bo30bo11b5o80bo$5b2o7b2o3bo4bobob 2o3b4o13bo11b3o29b5o18b2o68b3o10b2o3b2o61b2o9bo4bobo$5b2o7b2o3bo14b4o 10b3o10bo3bo27b2o3b2o101b5o15bo45b4o7bobo3b2o$16bobo5b2o8bo2bo5b2o127b o28bo3bo13b2o24b3o14bobo2bo2b3o5b2obo$17bo16b4o5b2o15bo5bo98b2obo3b4o 26bobo9bo5b2o12bo12bo13bo2bo2b2o9b2ob2o$33b4o23b2o3b2o92b2o2b2obobo4b 4o26bo9bo15bo4b4o8bo13b2o9bo6b2obo$33bo42bo39bobo10b2o9b3o15bobo2b2obo b2o3bo2bo36b3o13bo5b4o10b2o7b2o3bo8bo5bobo$5bo14b2o23b2o27bobo20b2o17b 2o11bo2bo9bo14b3o8b2o3b4o19bo27b2o9bo2bo9bobo9b2o10bo6bo$5bo15bo22bobo 10bo17b2o40bo3b5o7bo7bo5bo8b3o8b2o3b4o4b2o12bobo6b2o19b2o9b4o8b3o4b2o 5bo2bo$4bobo14bobo5bobo11bo11bobo45bo16bo5bo6bo12b4o7b3o12bo7bobo12b2o 6b2o29b4o8b3o4bo2bo5bobo$3b2ob2o14b2o5bo2bo10bo2bo9b2o45bobo14bo3b2o7b o11b2obobo7bobo21bo51bo12b3o4b2o$2bo5bo23b2o9bo21b2o23bo4b2o6b2o16bo7b o2bo11b3obo2bo7b2o21b2o64bobo$5bo24bo3b2o8bobo5b2o11bo25bo3b2o32b2o14b 2obobo98b2o$2b2o3b2o23b2o11b2o5bobo11b3o20b3o54b4o$29bo2bo8bo12bo13bo 78bo$29bobo10b2o10b2o165bo2bo$3b4o14bo19b2o182bo41b4o$3bo2b2o11bobo81b o2bo86bo2bo24bo3bo40bo3bo12bo2bo$4bob2o3b2o4b2o18b2o68bo41b4o44bo24b4o 13b4o27bo16bo$11b2o4b2o17bo3bo62bo3bo40bo3bo40bo3bo40bo3bo23bo2bo13bo 3bo$5b2o10b2o16bo5bo62b4o44bo18b2o21b4o44bo41b4o$6bo12bobo4bo8bo3bo2bo 105bo2bo19b2o65bo2bo19bo$21bo3bo9bo12bobo119bobo89bo$25b3o2bo5bo3bo3bo 4b2o21bo59bo4b2o83bo4b2o31b3o$2obob2o30b2o3b2obo3bo20bobo24bo4b2o27bob o3b2o9b2o37bo4b2o20bo6bobo3b2o9b2o37bo4b2o$o5bo5bo32bo25b2o21b4o3b2ob 2o24bo3bo12bo2bo33b4o3b2ob2o16bobo5bo3bo12bo2bo33b4o3b2ob2o$bo3bo7bo 31b2o46b5o4bo2bo24bo3bo12bo2bo32b5o4bo2bo17b2o5bo3bo12bo2bo15bo16b5o4b o2bo$2b3o6b3o78bo9bo2bo24bo3bo11b2ob2o31bo9bo2bo24bo3bo11b2ob2o16bo14b o9bo2bo$93b2o8b2o25bo2bo13b2o34b2o8b2o25bo2bo13b2o16b3o15b2o8b2o$94bo 37bo51bo24bo12bo51bo$79bo127bobo$36b2o42bo15b2o5bo2bo79b2o5bo2bo11b2o 41bo24b2o5bo2bo$23bo11b4o13b2o24b3o14b4o8bo34b2o5b4o32b4o8bo34b2o5b4o 9bo22b4o8bo$20b3ob2o9b2ob2o10b2ob2o40b2ob2o3bo3bo32b2ob2o3bo3bo32b2ob 2o3bo3bo32b2ob2o3bo3bo7b3o22b2ob2o3bo3bo$21b3o13b2o11b4o43b2o5b4o32b4o 8bo34b2o5b4o32b4o8bo34b2o5b4o$3b2o16b2o28b2o88b2o5bo2bo79b2o5bo2bo$2bo 2bo240bo$2bo244bo$2bo82b2o158b3o$2bobo11bo68bo$2bobo11b2o49bo18b3o$3bo 11bobo29bo19b2o19bo10bobo139bo$45bobo18bobo28bo3bo140bo$35b2o6b2o12b2o 31b2o5bo19bo122b3o$2o3b2o27bo3bo4b2o12b2o26bo4b2o4bo4bo14b4o$o5bo26bo 5bo3b2o39b2o11bo12bo4b2obobo3b2o$23b2o8bo3bob2o4bobo36bobo10bo3bo3bob 2o5b3obo2bo2b2o110bo$bo3bo2b2o13b2o8bo5bo7bo51bobo2bob4o5b2obobo116bo$ 2b3o4b2o23bo3bo65b2o2b2o6b4o115b3o$8bo26b2o80bo2$231bo$92b2o138bo$91b 2o137b3o$93bo3bobo$5bo46bo44b2o$3b2ob2o44b2o44bo$51bobo$2bo5bo$100bo$ 2b2obob2o90b2o$99bobo$33bo76bo$31b4o6b2o2b2o62bobo$25b2o3bobob2o5b4obo 2bobo46bo8b2o3bo9b2o$25b2o2bo2bob3o5b2obo3bo3bo44b4o5b2o3bo9b2o$30bobo b2o4bo12bo5b2o27b2o9b4o4b2o3bo$31b4o14bo4bo4b2o27b2o9bo2bo6bobo$33bo 19bo39bo5b4o7bo$5b2o42bo3bo39bo4b4o$5b2o42bobo46bo3b!golly-2.5-src/Patterns/Life/Breeders/pi-blink-breeder1.rle0000644000175100001440000002571412156145314020336 00000000000000#C An unusual breeder (quadratic growth) pattern. #C Jason Summers, 5 Sep 2002; from "jslife" collection. x = 741, y = 205, rule = B3/S23 385boo139boo139boo$285bo27bo9bo15bo45boo39bo27bo9bo15bo45boo39bo27bo9b o15bo45boo$151bobbo128b3o27b3o5b3o13b3o84b3o27b3o5b3o13b3o84b3o27b3o5b 3o13b3o$142boo6bo131bo18boo13bo3bo15bo86bo18boo13bo3bo15bo86bo18boo13b o3bo15bo$141booboo4bo3bo127boo17bo13boo3boo14boo49boo34boo17bo13boo3b oo14boo49boo34boo17bo13boo3boo14boo49boo$142b4o4b4o148bo84boo54bo84boo 54bo84boo$143boo156boo53bo43boo40boo53bo43boo40boo53bo43boo$354b3o43bo 94b3o43bo94b3o43bo$267boboo82bo44bobo7boboo82bo44bobo7boboo82bo39boo3b obo$145bo7b3o14boo95boobo59boo8boo11boo43boo8boobo69boo11boo43boo8boob o69boo11boo43boo$144boo9bo13booboo155bobo8boo60boo77boo60boo33b3o41boo 45boo13boo$143boobo6b3o14b4o151bo5bo70boo139boo33b4o89bo12boo$144bobo 3b3o18boo125boo22boobbo112boo131bo7boo84bo5bo$145boo29boo120boo21bo5bo 111boo130bo93bo$167boo6bo6boo85booboo46booboo85booboo77bo3bo16bo37boob oo14boo6boo84boo3bo3bo$181boob4o81bo3bo47b4o3bo81bo3bo76b3obobbo14bo7b o29bo3bo15boo4b3ob3o83boobbobbo$166boo14b6o82b3o49bo4bo83b3o77bobobo 25bo30b3o17bo4boo4bo83bo5bo$142boo22bo16b4o85bobo49b3o86bobo81bo56bobo 19bo4bobo83bobo$141booboo127boo49bo64boo23boo81boo16boo6bo6boo23boo 111boboo$142b4o183boo58boo79boo19bo3bobo16bobbo5bo6boo79boo55bo$143boo 164bo6boo11bobo118bo6boo11bobo22bobo17bobo19boo52bo6boo11bobo55boo7boo $168boo137b3o6boo13bo46boo68b3o6boo13bo44bo18bobbo49b3o6boo13bo46boo 15bobbo$167boo137bo24boo44bobbo55bobo8bo24boo40boboo19boo49bo24boo44bo bbo15boo$169bo136boo45boo23bobo16b3o37boo8boo45boo18boboboo68boo45boo 23bobo$141b4o208boo3bo20bo17bo39bo56boo3bo14bo3boo115boo3bo20bo$140b6o 211bobo38bo99bobo13bo3bo120bobo$139boob4o194boo16bobo120boo16bobo13bob o104boo16bobo$140boo199bo18bo121bo18bo14bo106bo18bo$338b3o19boo117b3o 19boo117b3o19boo$160boo176bo140bo140bo$159boo235boo139boo139boo$161bo 234boo44bo94boo139boo$134b6o12bo287bobo$134bo5b4o7bo289boo$46bobbo84bo 5boboo6bobbo$37boo6bo89bo3bobboo6bobbo5boo$36booboo4bo3bo87bo12b3o6boo 396boo$37b4o4b4o87boo419bobo$38boo95b4o25bo155boo139boo94bo44boo$134b ooboo29b3o149boo139boo139boo$135boo30b5o207bo140bo140bo$40bo7b3o14boo 79b5o15boob3o184boo19b3o117boo19b3o117boo19b3o$39boo9bo13booboo77bo4bo 15boo188bo18bo106bo14bo18bo121bo18bo$38boobo6b3o14b4o77bo12b4o194bobo 16boo104bobo13bobo16boo120bobo16boo$39bobo3b3o18boo79bo3bo6b6o155bo38b obo120bo3bo13bobo138bobo$40boo107bo7boob4o35bo120bo17bo20bo3boo115boo 3bo14bo3boo56bo57bo20bo3boo$62boo13boo79boo38bo119b3o16bobo23boo45boo 68boobobo18boo45boo8boo56bobo23boo45boo$76boob4o115b3o136bobbo44boo24b o49boo19boobo40boo24bo8bobo38boo15bobbo44boo24bo$61boo14b6o255boo46bo 13boo6b3o49bobbo18bo44bo13boo6b3o49bobbo15boo46bo13boo6b3o$37boo22bo 16b4o66bobbo5boo227bobo11boo6bo52boo19bobo17bobo22bobo11boo6bo52boo7b oo55bobo11boo6bo$36booboo106bo8b4o167boo58boo79boo6bo5bobbo16bobo3bo 19boo83bo55boo$37b4o106bo3bo3booboo167boo64bo49boo23boo6bo6boo16boo81b oo24boobo111boo$38boo24boo81b4o5boo233b3o49bobo56bo81bobo25bobo83bobo 4bo19bobo$63boo325bo4bo49b3o30bo25bobobo77b3o19bo5bo83bo4boo4bo17b3o$ 65bo323bo3b4o47bo3bo29bo7bo14bobbob3o76bo3bo17bobbobboo83b3ob3o4boo15b o3bo$152bobo21bobbo213booboo46booboo37bo16bo3bo77booboo18bo3bo3boo84b oo6boo14booboo$36b4o111bo3boo18bo214bo5bo21boo139boo55bo93bo$35b6o108b oobob3o8bo9bo3bo211bobboo22boo139boo48bo5bo84boo7bo$34boob4o108bo4b3o 18b4o135boo70bo5bo62boo139boo12bo89b4o$35boo112bo3bo15boo19boo122boo 60boo8bobo66boo60boo77boo13boo45boo41b3o$56boo92b3o10bo7bo16bo4bo124b oo43boo11boo8boo59boboo8boo43boo11boo69boboo8boo43boo11boo69boboo$55b oo95bo10bobobo3bo15bo129bobo44bo82boobo7bobo44bo82boobo7bobo3boo39bo 82boobo$39bo17bo21bo88b3o16bo5bo123bo43b3o94bo43b3o94bo43b3o$38bo39bo 69bobbo35b6o123boo43bo53boo40boo43bo53boo40boo43bo53boo$29b6obo3bo37b 3o66bo181boo84bo54boo84bo54boo84bo$29bo5bo3b3o105bo3bo177boo65boo3boo 13bo17boo34boo65boo3boo13bo17boo34boo65boo3boo13bo17boo$29bo5bo5bo3bob oboo96b4o24boo220bo3bo13boo18bo102bo3bo13boo18bo102bo3bo13boo18bo$30bo 3bo3boobo3bo5bo4boo117bobo12bo203b3o5b3o27b3o100b3o5b3o27b3o100b3o5b3o 27b3o$32bo5b3o4bo10boo117bo15bo139boo61bo9bo27bo39boo61bo9bo27bo39boo 61bo9bo27bo$31boo14bobbo140bo139boo139boo139boo$30b4o13b3o$29booboo29b 3o$30boo30b5o78b6o$41b5o15boob3o78bo5bo161b4o154b4o154b4o$41bo4bo15boo 81bo21boo144bo3bo153bo3bo153bo3bo$41bo12b4o88bo4bo15bobo143bo157bo157b o$42bo3bo6b6o89boo17bo146bobbo154bobbo154bobbo$44bo7boob4o$53boo97bo 507boo$140boo5boobbo501b6obbo$139boob4o5boboo497bo6boo$140b5o9bobboo 502b3o$52b4o85b3o10bobbobo8boo481boo5bobobbo$51b6o92boobo6bo8boo480bo 4boo4boo$50boob4o94bo5boobo488boo$51boo87b4o14bobboo76bo48bo157bo202b oo$39b5o17b3o76bo3bo13b4o37bo38bo47bo3bo153bo3bo197boob3o$39bo4bo15b5o 75bo19bo11b5o20boo39b3o44bo157bo202bobbobo$29boo8bo19boob3o76bobbo7boo 18bo4bo20boo85bo4bo152bo4bo194boobobobbo$28b4o8bo3bo15boo89boob3o15bo 112b5o153b5o195boobobobboo$27booboo10bo12boo95b5o16bo3bo468boboboo$28b oo25boo96b3o7b6o6bo470boboo3bo$56boo105bo5bo335boo140bobbobbo$42boo7b oo3bo106bo342bo141boobo23boo$32boo7bobbo6boo4bo106bo4bo327b9o69bo27bo 9bo35bobb3o20boo$27b8obo7boo120boo328bob6obb3o64b3o27b3o5b3o30boobobo$ 27bo8bo7bo49bobbo6boo65boo326b4obbobbo63bo18boo13bo3bo33bobooboboboo$ 27bo6bo9boo47bo8bo4bo62b4o5b4o312bobo8boo64boo17bo13boo3boo38b3o24boo$ 28bo23bobo38bo3bo3bo60bo6booboo4b6o311boo95bo84boo$30boo20boo39b4o4bo 5bo52bo3bo5boo5boob4o311bo69boo24boo53bo3b3o37boo$53bo10boo17boo16b6o 52bo18boo311boobbobo66b3oboo74b3obbo4bo35bo$34b4o25b4o15boob3o71bo4bo 326bobbo62boboob3o3boo73bo5bobobbo33bobo$33b6o23booboo16b5o31bo39b5o 324booboboobo60boobobobbobo62boo11boo3boobobo34boo$32boob4o24boo19b3o 31bo369booboboboo68b3o62boo19bo40boo$33boo83b3o49bobo318bobobbo65boob 3o83bobo38boo$169bobbo318bobo3boo63b5o21boo62boo9bobo$60bobo107bobo 319bobboboo62bo11bo14boo73bobo$60boo132bo298boobo23boo37b5o10bo88bobbo $61bo11b3o54b3o20b3o38bo15b3o207bo27bo9bo35bobboo21boo37bo3bo8b3o89bob o$194bo223b3o27b3o5b3o30boobobo3boo60b3o101bobo$35boo380bo18boo13bo3bo 33bobooboboboo62bobo99boo$34booboo243bobbo131boo17bo13boo3boo38boo25b oo39boo114boo$35b4o85bo156bo155bo84boo95boo58boo$36boo84bo3bo154bo3bo 150boo53bo3boo38boo62bo6boo11bobo64boo$121bo57boo100b4o204b3obbobboo 36bo61b3o6boo13bo46boo15bobbo$43bo3bo73bo4bo14b4o25bo7boob4o217boboo 82bo5bobb3o33bobo60bo24boo44bobbo15boo$38b3o5boo73b5o7boo5b6o22bo3bo6b 6o149boo66boobo69boo11boo3boobo36boo61boo45boo23bobo$37b3obo9boo59b4o 16b4o3boob4o21bo12b4o148bo4boboo134boo19bo40boo104boo3bo20bo$36boo8bo 6bo9boo46b6o14booboo4boo25bo4bo15boo150bo155bobo38boo108bobo$37bob8o3b o3bo7booboo43boob4o15boo33b5o15boob3o145boo93boo62boo131boo16bobo$38b 4o7bo3bo9b4o44boo43boo24bo5b5o137b8obb3o90boo73bo122bo18bo$40bo8bo14b oo33b5o17b3o31booboo21b3o5b3o138boo7bobbo61booboo99bo119b3o19boo$99bo 4bo15b5o31b4o21bobbo144boo9boo62bo3bo79bobo17boo118bo$44bobbo41boo8bo 16bobboob3o32boo7boo12bo3bo144bo75b3o79bo3bo16bo5boo170boo$35boo6bo24b oo18b4o8bo3bo9bobo3boo36bo7boo12b4o223bobo76bo4bo15bobbo3boo170boo$34b ooboo4bo3bo19boo18booboo10bo13boo38bo3bo8bo5b3oboobbo141boobb3o76boo 76bo4bo16bo7bo7boo$27boo6b4o4b4o22bo18boo23b5o37bo5bo8boo5b3o145bobbob oo132boo20bo3bo16boobb6o7boo$25bo4bo5boo61bobo11boboboo36bo5bo6b3o6b3o 142booboboobo97bobo13bo6boo11bobo20bobbo15b3o3bobo16boo$24bo74bobo7boo 4bobo37b6o6bobo8boo142boobobo3bo97boo11b3o6boo13bo39b3o21bobbo$24bo5bo 61boo7boo6boo4b3o61boo144bobobo99bo11bo24boo39boo22boo$14b3o7b6o6bo50b 8o7b3o220bobo3bo109boo45boo18boo$13b5o16bo3bo48bo6bo6bobbo96b3o39bo82b obboboo155boo3bo14b3o99boo$12boob3o15bo53bo14boo7bobo87bo40boo83boobo 23boo136bobo15bobo97boo$bbobbo7boo18bo4bo49bo4bo17boo48boo39bo39bobo9b o27bo9bo35bobboo21boo119boo16bobo16bo156bo$bo31b5o52boo20bo47boob4o85b 3o27b3o5b3o30boobobo3bo143bo18bo150boo19b3o$bo3bo15b5o135b6o21bo62bo 18boo13bo3bo33boboobobobo140b3o19boo150bo18bo$b4o16boo3bo67b4o64b4o20b oo63boo17bo13boo3boo38boobo23boo76bo38bo173bobo16boo$22bobbo67b6o88boo 82bo84boo74bobo96boo115bobo$15bo6bobbo5boo59boob4o171boo53bo3b3o37boo 62boo96boo95bo20bo3boo$bb3o3bo5boobb3oboo7boo60boo228b3obbo4bo35bo257b obo23boo45boo$b5obbo9boboboo95bobo42boo70boboo82bo5bobobbo33bobo240boo 15bobbo44boo24bo$oob4obo6bobbobo98boo42b4o69boobo69boo11boo3boobobo34b oo240bobbo15boo46bo13boo6b3o$boo13boo102bo5boo34booboo142boo19bo40boo 237boo64bobo11boo6bo$126bobo34boo31bo7b4o122bobo38boo244boo58boo$126bo 67boo7b6o58boo62boo284boo114boo$9boo84boo98boo5boob4o58boo72bo113boo 96boo77boo99bobo$7bo4bo16bo64booboo76boo26boo33booboo98bo113boo96bobo 75bobo101b3o$6bo22bobo63b4o19bo55bobbo60bo3bo98boo171bo38bo77bobo89b3o 8bo3bo$6bo5bo16boo65boo20bo16boo28boo13b3o9boo45b3o84boo163boo19b3o 116bobbo88bo10b5o$6b6o105bobo14boob4o23boo5bo8bobbo7b4o46bobo79boob3o 8b3o152bo18bo120bobo73boo14bo11bo$119bo15b6o24boo4bo3bo3booboo6booboo 47boo16bobo59b3oboo6boo8boboo10boo115bo16bobo16boo119bobo73boo21b5o$ 98bo3boo15bo16b4o26bo3bo4bo15boo68boo35boo23boob3o5boo6boobobo10boo 115bobo15bobo108boo124b3oboo$97boo4b3o67bo87bo16bo6boo11bobo26boo13boo bobo17boo110b3o14bo3boo104boo60boo62b3o$96boo5bobbo16boo151b3o6boo13bo 44boo17bobbo110boo18boo45boo61boo43boo11boo62bobobboboboo$37bo59boo7bo 15booboo37boo109bo24boo43boo18boo88boo22boo39boo24bo11bo48bobo44bo73b oo3b3oboobo$8b4o25bobo65boo16b4o36b4o4b4o100boo45boo21boobo105bobbo21b 3o39bo13boo6b3o11boo48bo43b3o74boob3o$8bo3bo24boo85boo36booboo4bo3bo 146boo3bo17bo109boo16bobo3b3o15bobbo20bobo11boo6bo13bobo46boo43bo53boo 24boo$8bo154boo6bo154bobo17bobbo112boo7b6obboo16bo3bo20boo95boo84bo$9b obbo35b6o50bobbo64bobbo133boo16bobo16bobo113boo7bo7bo16bo4bo76boo39boo 49boo14boo3boo13bo17boo$48bo5bo40boo6bo162bo43bo18bo142boo3bobbo15bo4b o76bobo90bo15bo3bo13boo18bo$22boo4bo19bo45booboo4bo3bo156bobo40b3o19b oo141boo5bo16bo3bo79b3o85b3o13b3o5b3o27b3o$11boo9boo3bobo19bo4bo40b4o 4b4o66b6o86boo40bo170boo17bobo79bo3bo37boo45bo15bo9bo27bo$10bobbo12bo 3bo20boo43boo75bo5bo185boo112bo99booboo37boo$10bobbo12bo3bo5b4o133bo 191boo112bo73boo$10booboo11bo3bo5bo3bo121boo10bo4bo373boo$12boo13bobbo 5bo124boob3o9boo4b5o262boo$28bo8bobbo121b5o15bo4bo261boo60boo$150b4o9b 3o16bo270boo43boo11boo69boboo$150bo3bo28bo3bo264bobo44bo82boobo$8b4o5b oo131bo21bo12bo266bo43b3o$8bo3bo3booboo130bo18b3o116boo160boo43bo53boo $8bo8b4o132boo14boobb3o7boo18bo85boo173boo84bo$9bobbo5boo137b3o8boo5b oo6boo17boo144bo40boo73boo49boo14boo3boo13bo17boo$150boo3boo3bo6b3obb 5o25bobo120boo19b3o40bobo124bo15bo3bo13boo18bo$149boob3obobbo8bobbobo 152bo18bo43bo123b3o13b3o5b3o27b3o$150b9o10boboo134bobo16bobo16boo119b oo45bo15bo9bo27bo$151b4o18bo132bobbo17bobo136boo$310bo17bo3boo$307bob oo21boo45boo$289boo18boo43boo24bo$155b6o19bo107bobbo17boo44bo13boo6b3o $155bo5bo17bo109boo17boboboo13boo26bobo11boo6bo16bo$155bo23b3o114boo 10boboboo6boo5b3oboo23boo35boo$156bo4bo134boo10boobo8boo6boob3o59bobo 16boo$158boo156b3o8b3oboo79bobo$190bo137boo84b3o$190bo122boo98bo3bo$ 158bobbo28bo123bo98booboo$157bo156bo72boo$157bo3bo38boo185boo$157b4o 37bo4bo79boo$190bo6bo85boo60boo$190bo6bo5bo83boo43boo11boo69boboo$172b oo3b3o17b6o83bobo44bo82boobo$161boo9boobbo3bo105bo43b3o$159boobbo11bo 5bo4bobbo95boo43bo53boo$159bobb3o10bo9bo112boo84bo$159bo4bo10bo5bo3bo 3bo108boo49boo14boo3boo13bo17boo$160b5o11boobo5b4o161bo15bo3bo13boo18b o$162boo183b3o13b3o5b3o27b3o$300boo45bo15bo9bo27bo$158bobbo5boo131boo$ 157bo8b4o$157bo3bo3booboo$157b4o5boo! golly-2.5-src/Patterns/Life/Breeders/pi-blink-breeder2.rle0000644000175100001440000002747512156145314020345 00000000000000#C An unusual breeder (quadratic growth) pattern. #C By Jason Summers and David Bell, 6 Sep 2002; from "jslife" archive. x = 957, y = 237, rule = B3/S23 141b4o5boo$141bo3bo3booboo$141bo8b4o$142bobbo5boo$$146bo$144bobbo3bo 17b4o$143bo7boo16bo3bo$143bo6boo17bo$143boo4boo19bobbo$145bo18bobo$ 147boo14bobbo14b6o$181bo5bo$163b3o15bo$141b4o37bo4bo$141bo3bo38boo$ 141bo27b3o$142bobbo23bo$170bo$$142boo$140bo4bo$139bo$139bo5bo$139b6o 16b3o$161bo$162bo$$135b4o$134b6o8boo$133boob3obo6bobbo$134boo3boo6bobb 4o$36b4o5boo102bobboboo7boo$36bo3bo3booboo88boo6b3o3boo3bo6boo$36bo8b 4o86bo9boo5booboo$37bobbo5boo86bo17b3obbo11bo$134bo3bo18bo9bo3bo$41bo 92b4o9b3o6bo9bo25bobo$39bobbo3bo17b4o78b5o15bo4bo20boo$38bo7boo16bo3bo 76boob3o9boo4b5o22bo$38bo6boo17bo81boo10bo4bo$38boo4boo19bobbo88bo$40b o18bobo95bo5bo$42boo14bobbo14b6o75b6o$76bo5bo$58b3o15bo$36b4o37bo4bo 73bobbo$36bo3bo24b3o11boo66boo6bo$36bo28bo80booboo4bo3bo$37bobbo25bo 80b4o4b4o$148boo$$37boo$35bo4bo109b4o12bobo6boo$34bo37bobo74boobbo11b oob3o3booboo$34bo5bo16b3o12boo74boobbo11b3ob3o4b4o$34b6o17bo15bo75bobb o12booboo6boo$58bo91boo9boo3b3o$161boo4bo19boo$179bo6boob4o$30b4o144bo bo6b6o$29b7o9boo100boo39b4o$28boob3ob3o9booboo94booboo26bo3bo$29boo3b oobo5bo3boboboo94b4o$42bo3boobobobo6boo86boo$32boo9boo3boboobo6boo116b 3o$30bo20b5o$29bo25bo8bo$29bo3bo20bo7bo3bo79b4o$29b4o9b3o6bobbo6bo83b 6o18boo$41b5o6bo8bo4bo77boob4o17boo$40boob3o9boo4b5o79boo23bo$41boo10b o4bo$52bo$52bo5bo$52b6o104bo$139b6o13boobobo$139bo5b4o8bo3bo30bo39bobo $53boo84bo5boboo8bo6bo26bo40boo$51bo4bo83bo3bobboo8bo3booboo6boo17b3o 39bo$50bo91bo15bo5bo7boo$50bo5bo84boo16b3o4bo$40b3o7b6o6bo77b4o17bo6bo $39b5o16bo3bo74booboo21bo7b3o$38boob3o15bo80boo25bo4b5o$28bobbo7boo18b o4bo86b5o15boob3o$27bo19bo11b5o87bo4bo15boo$27bo3bo13b4o102bo12b4o$27b 4o14bobboo102bo3bo6b6o$38bo5boobo106bo7boob4o635bo39bo$36boobo6bo8boo 106boo359b3o275bo40bobo$28b3o10bobbobo8boo189boo40bo235boobo37boo235bo 4bo36b3o$27b5o9bobboo199bobo39boo238bo35booboo239bo35bobbo$26boob4o5bo boo128bobbo6boo62bo41b4obo232b3o35bo242bo37b3o$27boo5boobbo54boo17bobo 54bo8bo4bo60bo3booboo32b6obo231bo5boo30bobo5boo105bo124bobo4boo32bo5b oo$39bo52booboo4boo9boo55bo3bo3bo66bo7bo32bob5o239bo31bo7bo104b3o38bo 85bo3boobbo36bobbo$93b4o3boob4o6bo55b4o4bo5bo67bo34bo99bo11bo25booboo 8bo91b3o38bo104boobbo36bobo87bo5bo34b4o$35boo17bo8bobbo15b5o7boo5b6o 52boo16b6o63boo139bo9b3o35bobbo89bo40bo104boobboo35booboo86boo3bo36bob o$33bo4bo15bobo5bo19bo4bo14b4o52boob3o85b3o144bobbo26bo6b3oboo87b3oboo 37boo101booboo38bo92b3o33boo$32bo21boo6bo3bo15bo76b5o83boo39b4obbo91bo 39boo5b3obbo86boob4o33boobobo100bobobbo36bobo88bo7b3o39bo$32bo5bo23b4o 17bo3bo72b3o84b4o36bob3obbooboo94boobo29boo4boobo89bobboo5boo28boboobb o98bo5boboo31boobo88bobbo5bo30bo9boo$32b6o47bo160bo3bobo4boo3bo24bo5b 6o93bo3bobb3o30boo4boo85bobbo5boo31bo3bo3b3o92boboboobboo30bobo3boboo 84b3o6bo8b3o18b4o6bobo$257bo28bobbo5boboob3o88bo4bo35boo5boo85bobo7bo 38bo94b5obbobo30b4o5boo84bo15bo3bo19boo16bo$246booboo6bo5bo23bobbo5bo 4boo89bo3boo4bo32b3obo103boo19bo13bo4bo87bobo43bobb3o98boo3bo35b3o$ 119bo22bo56bo22bo24b3o8bo3boboo13bo7bobo10bobbo32bo33bo24bobbo4bo23bo 6boo5bobo6bo33bo33bo24boboo18booboo5bo7boo13bo33bo33bo5bo9b3o4bo24bo3b obbobo22bo33bo33bo12bo9bo24boboo28bo33bo$62bo56bo22bo17boo19b3o15bo22b o15b3o17boo4boo13bo19bobb3o13b3o15bo15b3o15bo15b3o10bo3boo4b3o15bo7b3o bo3bo6bo15b3o15bo15b3o15bo15b3o8boo10b3o15bo3bo4boo12bo15b3o15bo15b3o 15bo18bo3bo15b3o10bobo3bo3b3o15bo15b3o15bo15b3o15bo9bobbo9bo15b3o9boo 9b3o15bo15b3o15bo$62bobo54bo22bo16boo38bo22bo24b3o8bo3boboo13bo7bobo 10bobbo32bo33bo24bobbo4bo23bo6boo5bobo6bo33bo33bo24boboo18booboo5bo7b oo13bo33bo33bo5bo9b3o4bo24bo3bobbobo22bo33bo33bo12bo9bo24boboo28bo33bo $34b4o24boo97bo84booboo6bo5bo23bobbo5bo4boo89bo3boo4bo32b3obo103boo19b o13bo4bo87bobo43bobb3o98boo3bo35b3o$34bo3bo218bo28bobbo5boboob3o88bo4b o35boo5boo85bobo7bo38bo94b5obbobo30b4o5boo84bo15bo3bo19boo16bo$34bo25b oo184bo3bobo4boo3bo24bo5b6o93bo3bobb3o30boo4boo85bobbo5boo31bo3bo3b3o 92boboboobboo30bobo3boboo84b3o6bo8b3o18b4o6bobo$35bobbo20bo187b4o36bob 3obbooboo94boobo29boo4boobo89bobboo5boo28boboobbo98bo5boboo31boobo88bo bbo5bo30bo9boo$121boo19boo34b6o63boo39b4obbo91bo39boo5b3obbo86boob4o 33boobobo100bobobbo36bobo88bo7b3o39bo$39boo79boob3o14bo4bo32bo5bo64b3o 144bobbo26bo6b3oboo87b3oboo37boo101booboo38bo92b3o33boo$37b5o71boo6b5o 6bobbo3bo38bo67boo139bo9b3o35bobbo89bo40bo104boobboo35booboo86boo3bo 36bobo$36bo4bobb3obo62bo4bo5b3o6bo7bo5bo21boo10bo4bo66bo34bo99bo11bo 25booboo8bo91b3o38bo104boobbo36bobo87bo5bo34b4o$36bobb3o3bo3boo11b4o 44bo20bo3bo3b6o21boob3o9boo4b5o52bo7bo32bob5o239bo31bo7bo104b3o38bo85b o3boobbo36bobbo$36boobbo7bobo11bo3bo43bo5bo14b4o32b5o15bo4bo51bo3boob oo32b6obo231bo5boo30bobo5boo105bo124bobo4boo32bo5boo$38boo7boobo11bo 37b3o7b6o6bo32b4o9b3o16bo56bo41b4obo232b3o35bo242bo37b3o$48boo13bobbo 32b5o16bo3bo30bo3bo28bo3bo52bobo39boo238bo35booboo239bo35bobbo$48bo49b oob3o15bo35bo34bo55boo40bo235boobo37boo235bo4bo36b3o$88bobbo7boo18bo4b o31bo15bo351b3o275bo40bobo$34b4o5boo42bo31b5o34boo11b3o6boo622bo39bo$ 34bo3bo3booboo40bo3bo70b3o5boobbo5boo$34bo8b4o40b4o14bo49boo3boo3bo5b 3o$35bobbo5boo58b3o47boob3obobbo7boo124b6o132bobbo6boo121boo$24boo67b ooboo5bobboo5boo40b9o134bo5bo130bo8bo4bo52boo64b4o5b4o$15bo7boob4o58b 3o5boo4b3oboo5boo41b4o21bo116bo136bo3bo3bo57booboo4boo48bo6booboo4b6o$ 13bo3bo6b6o31b3o23b5o6bo4booboo72bo106boo10bo4bo130b4o4bo5bo52b4o3boob 4o42bo3bo5boo5boob4o$12bo12b4o32bo24boob4o3boo82b3o103boob3o9boo4b5o 113boo16b6o42b5o7boo5b6o41bo18boo$12bo4bo15boo27bo24boo5bobbo189b5o15b o4bo111boob3o61bo4bo14b4o42bo4bo$12b5o15boob3o56bobo63b6o109b4o9b3o6bo 9bo60bo56b5o61bo65b5o$boo30b5o75bo46bo5bo108bo3bo18bo9bo3bo53bo3bo55b 3o63bo3bo$ooboo29b3o58boo16bobo44bo114bo17b3obbo11bo54bo128bo$b4o19boo 67bo4bo14boo46bo4bo29bo79bo9boo5booboo67bo4bo$bboo16b5oboo8bo55bo70boo 24bo5boo39boo40boo6b3o3boo3bo6boo59b5o$3bo5b3o7bobo4boo9bo54bo5bo89bo 6bobo38bobo51bobboboo7boo224bo56bo22bo56bo22bo56bo22bo21bo34bo22bo21bo 34bo22bo$bo3bo3boobo5bo5boboo8bo55b6o90b3o45bo38boo3boo6bobb4o114b3o 54b3o20b3o38bo15b3o20b3o15bo22bo15b3o20b3o15bo22bo15b3o20b3o15bo22bo 15b3o3bo16b3o15bo22bo15b3o3bo16b3o15bo3b3o16bo15b3o$o5bo5bo5bobo3b3o 136bobbo107boob3obo6bobbo238bo56bo22bo56bo22bo56bo22bo21bo34bo22bo21bo 34bo22bo23boo$o5bo3b3o6bo3boboo135bo112b6o8boo420b3o239bobbo$6obo3bo 10boobo95bo40bo3bo38boo69b4o431bobo240boo$9bo12b3o96bobo38b4o37bo4bo 174boo325bobbo$10bo110boo79bo100bo77bo4bo127b4o70boo$94b4o104bo5bo93bo 77bo66boo64b6o67bo4bo147b4o146boo$94bo3bo68bobo32b6o72b6o16b3o75bo5bo 51bo7boob4o59boob4o66bo152b6o136bo7boob4o$6boo86bo71bo3boob3o104bo5bo 83b3o7b6o6bo43bo3bo6b6o60boo70bo5bo145boob4o134bo3bo6b6o$5boob4o20bo 62bobbo35b6o24boobob4o4boo12bobbo85bo88b5o16bo3bo40bo12b4o49b5o17b3o 49b3o7b6o6bo140boo137bo12b4o$6b6o18boo83b3o16bo5bo23bo4b5o5boo9bo90bo 4bo81boob3o15bo45bo4bo15boo43bo4bo15b5o47b5o16bo3bo126b5o17b3o126bo4bo 15boo$7b4o20boo66bo10bobobo3bo15bo29bo3bo5bo4boo9bo3bo88boo73bobbo7boo 18bo4bo40b5o15boob3o30boo8bo14bo4boob3o46boob3o15bo131bo4bo15b5o125b5o 15boob3o$97b3o10bo7bo16bo4bo24b3o8b5o9b4o163bo19bo11b5o30boo30b5o29b4o 8bo3bo7bo7boo39bobbo7boo18bo4bo116boo8bo19boob3o114boo30b5o$96bo3bo15b oo19boo28bo9boo132bo45bo3bo13b4o44booboo29b3o29booboo10bo10boo45bo31b 5o116b4o8bo3bo15boo116booboo29b3o$96bo4b3o18b4o157boo7b5o13bo46b4o14bo bboo44b4o25bo36boo21bobbo45bo3bo147booboo10bo136b4o25bo$9boo85boobob3o 8bo9bo3bo36bobbo5boo108booboo5bo4bo12b3o55bo5boobo47boo84boobobo45b4o 14bo134boo130boo18boo$8b4o86bo3boo18bo39bo8b4o108b4o5bo73boobo6bo8boo 39bo12b3o6boo54bo3b3o10boo56b3o149b3o112boo20bo12b3o6boo$7booboo28bo 58bobo21bobbo35bo3bo3booboo109boo7bo3bo60b3o10bobbobo8boo37bo3bobboo6b obbo5boo44boo7boboboobo3bo6boo45booboo5bobboo5boo133bo6bobbo6boo78bo 27bo17bo3bobboo6bobbo5boo$8boo28boo9b4o109b4o5boo122bo61b5o9bobboo47bo 5boboo6bobbo46b8obo11bo52b3o5boo4b3oboo5boo129b6o5bo3bo5boo78boo43bo5b oboo6bobbo$39boo7b6o237bo64boob4o5boboo35boo14bo5b4o7bo48bo8bo9b6o48b 5o6bo4booboo131b8o3bo4bo3bo84bobo43bo5b4o7bo$47boob4o40b4o5boo181b3o 68boo5boobbo37boo15b6o12bo47bo6bo10boo52boob4o3boo141bo8boo6bobo131b6o 12bo$20boo26boo44bo3bo3booboo67b4o107b3obo4boo4bo12b3o53bo38bo41bo20b 3o16bo71boo5bobbo141bo6b3o168bo$19bobbo71bo8b4o66b6o105boo9bo3bobo13bo 132boo21bo20boo75bobo143bo5boo167boo$10boo13b3o9boo56bobbo5boo66boob4o 106bob8o3bo3bo11bo50boo17bo64boo21bo115bo128boo21bobo148boo$9boo5bo8bo bbo7b4o133boo111b4o7bo3bo61bo4bo15bobo109b4o70boo16bobo149boo$10boo4bo 3bo3booboo6booboo121b5o17b3o102bo8bo21bo42bo21boo43boo64b6o17bobo12boo 33bo4bo14boo131b4o16bo129boo$11bo3bo4bo15boo123bo4bo15b5o133bo41bo5bo 59boob4o59boob4o17boo13bobo31bo152b6o144boob4o$18bo132boo8bo16bobboob 3o105bobbo23bo42b6o61b6o60boo22bo13bo33bo5bo145boob4o145b6o$150b4o8bo 3bo9bobo3boo99boo6bo138b4o133b6o147boo150b4o69boo$9boo138booboo10bo13b oo102booboo4bo3bo21b3o138bo441bo4b3o36boo$8b4o4b4o130boo23b5o103b4o4b 4o21b5o135boo440boo5bo40bo$7booboo4bo3bo140bobo11boboboo103boo29boob3o 71bo64boo123bo13bo151bobo148boo5bo$8boo6bo144bobo7boo4bobo136boo74bobo 37boo137boo7bo3bo11bobo134b3o12boo124boo$17bobbo133boo7boo6boo4b3o184b 4o24boo37b4o62boo27bobo41b4o5bo16boo124b4o6b5o12bo123b4o$149b8o7b3o 197bo3bo61booboo61booboo25boo41booboo5bo4bo137bo3bo4boob3o135booboo$ 149bo6bo6bobbo197bo25boo39boo39b4o21b4o19bo6bo42boo7b5o138bo9boo139boo 24bo14b4o$149bo14boo7bobo189bobbo20bo14b6o43bo17b6o21boo20bo16boo184bo bbo172bo13b6o$150bo4bo17boo229bo5bo41b3o15boob4o42bobo14boob4o335bo33b oob4o$152boo20bo21boo171boo33bo31bo11bo3boobo8bo6boo48bo15b6o184bo152b o32boo$196bobo168b5o33bo4bo23b4o10bo6bo9boo33bo3boo15bo16b4o31boo95b3o 52b3o148boobbo3bo$156b4o36bo169bo4bobb3obo28boo24bob5o14bo5boo37boo4b 3o64bobo3b3o89bo53bo3bo9bo136bo5bob3obbo13boo$155b6o205bobb3o3bo3boo 11b4o36boo6bo18b4o35boo5bobbo16boo44boobo6b3o12boo73bo52bo4b3o4boo136b oobbobobb5obo11b4o$154boob4o205boobbo7bobo11bo3bo36b3obo3bo16booboo36b oo7bo15booboo43boo9bo11bobo126boobob3o5bobobbo132boo3bo5booboo9booboo$ 155boo211boo7boobo11bo41b3o3bo18boo46boo16b4o44bo7b3o13bo128bo3boo6boo bbo133b3o7bobbo11boo$181bobo194boo13bobbo42bo86boo75bo123bobo$181boo 195bo223boo283boo$182bo249boo72bobbo61boo301boo$364b4o5boo56b4o4b4o54b oo6bo64b4o4b4o140b4o5boo25bo114b4o4b4o$364bo3bo3booboo53booboo4bo3bo 52booboo4bo3bo59booboo4bo3bo139bo3bo3booboo21bo3bo111booboo4bo3bo$157b oo205bo8b4o54boo6bo57b4o4b4o61boo6bo24boo117bo8b4o20bo117boo6bo$156boo boo204bobbo5boo64bobbo54boo79bobbo19boob3o115bobbo5boo21bo4bo121bobbo$ 157b4o442b5o147b5o$158boo29bobo5boo405b3o164boo$189boo5boob4o566bo4bo$ 170boo18bo6b6o413boo150bo111boo$160bo9boo3b3o20b4o405bo7boob4o146bo5bo 32boo69bo4bo$159boo14b3o427bo3bo6b6o136b3o7b6o6bo25boo69bo$158boobo12b o3bo6boo417bo12b4o136b5o16bo3bo25bo68bo5bo$159bobo13b4o5booboo415bo4bo 15boo129boob3o15bo89b3o7b6o6bo$160boo13b3o7b4o415b5o15boob3o116bobbo7b oo18bo4bo83b5o16bo3bo$186boo405boo24bo5b5o115bo31b5o83boob3o15bo$592b ooboo21b3o5b3o116bo3bo20b3o82bobbo7boo18bo4bo$166bobbo423b4o21bobbo 123b4o21bobbo80bo31b5o$157boo6bo428boo7boo12bo3bo134bo16bo80bo3bo15b5o $156booboo4bo3bo425bo7boo12b4o133boobo7bo3b4o81b4o16boo3bo$157b4o4b4o 424bo3bo8bo5b3oboobbo125b3o10bo4bo3bo106bobbo$158boo432bo5bo8boo5b3o 128b5o9bo5bobo3bo96bo6bobbo5boo$592bo5bo6b3o6b3o127boob4o5boboo7bo87b 3o3bo5boobb3oboo7boo$592b6o6bobo8boo128boo5boobbo11bo85b5obbo9boboboo 28boo$616boo139bo10bobbo81boob4obo6bobbobo30boo$769bo84boo13boo35bo$ 753boo$751bo4bo$598boo150bo111boo$597boob4o146bo5bo103bo4bo16bo$598b6o 21bo124b6o20bo82bo22bobo$599b4o20boo151bobo80bo5bo16boo$624boo150boo 81b6o$$630b3o$601boo27bo$600b4o27bo120b4o$599booboo148bo3bo134bo$600b oo39b4o107bo31bo76b4o25bobo$622bo17b6o107bobbo27bobo5b6o63bo3bo23bobbo $621b3o15boob4o138boo6bo5bo62bo28bobo$605bo11bo3boobo15boo124boo4bo19b o69bobbo35b6o$603b4o10bo6bo130boo9boo3bobo19bo4bo102bo5bo$602bob5o14bo 5boo123bobbo12bo3bo20boo69bo6boo26bo$601boo6bo18b4o122bobbo12bo3bo5b4o 80bobbo5boo27bo4bo$602b3obo3bo16booboo122booboo11bo3bo5bo3bo78bo9boo4b o24boo$603b3o3bo18boo126boo13bobbo5bo82bo6boobo4b3o8b4o$608bo163bo8bo bbo78boo4b5o6boo7bo3bo$865bo4b3o3boo11bo$601boo264boo21bobbo$600b4o4b 4o140b4o5boo$599booboo4bo3bo139bo3bo3booboo$600boo6bo143bo8b4o96b4o5b oo$609bobbo140bobbo5boo97bo3bo3booboo$861bo8b4o$862bobbo5boo! golly-2.5-src/Patterns/Life/Breeders/rake-breeder.rle0000644000175100001440000001741112156145314017465 00000000000000#C Rake puffer -- a type-MMM breeder #C Creates a new rake every 60 generations. #C Achim Flammenkamp, 1994 #C From "rake-puff.lif" in Jason Summers' "jslife" pattern collection. x = 398, y = 405, rule = B3/S23 81boo5b4o$79booboo3bo3bo$79b4o8bo$80boo5bobbo$$75boo9bo$73b5o8b3o$73b oo4bo5bo3bo$73boo5b5o4bo$75boo4b4oboboo$78b3oboo3bo$84bobo$$64bo$62boo 24b4o$63boo22bo3bo$70b4o17bo$69bo3bo13bobbo$49bo23bo$47boo20bobbo$48b oo14boo$63b4o$53bo9booboo$53bo11boo$49bobboo4bobo$49bo7bobboo$49bobboo 4bobo$53bo11boo$19bo20boo11bo9booboo$17boo20b4o20b4o$18boo19booboo20b oo$30b3oboo5boo$29boo5bo$28bo7boo$29boo5bo$30b3oboo5boo$39booboo$39b4o $40boo$20bobbo$24bo$20bo3bo$10boo9b4o$9boo5b3o$5b3o6booboo$9boo5b3o$ 10boo9b4o$20bo3bo19bobbo$24bo23bo$20bobbo7boo11bo3bo$33bo11b4o$28bo7b oobb3o$13b3o11bo8boobb3o$13bo14bo7boobb3o$14bo18bo11b4o$31boo11bo3bo$ 48bo80boo5b4o$28b3o13bobbo79booboo3bo3bo$28bo98b4o8bo$29bo23boo73boo5b obbo$51booboo$51b4o16boo$43b3o6boo15booboo53bo7boo$43bo25b4o45b5o7boo 3bobo$44bo25boo46bo18bo$119b3o13b3o$60bo3bo55bo4boo$60boo5b3o55boo$55b oo9bob3o$54bo6bo8boo$3o5b3o3b3o36bo3bo3b8obo38bo26b4o$obbo4bobbobbobbo 36bo3bo7b4o37boo26bo3bo$o7bo5bo43bo8bo40boo8b4o17bo$o7bo5bo102bo3bo13b obbo$bobo5bobo3bobo42bobbo57bo$64bo6boo21bo22bobbo$60bo3bo4booboo18boo 18boo$61b4o4b4o20boo16b4o13b4o$bo68boo29bo9booboo11bo3bo12bobbo$3o98bo 11boo16bo16bo$oboo75bo17bobboo4bobo18bobbo13bo3bo$b3o73boo18bo7bobboo 35b4o$boo75boo17bobboo4bobo$101bo11boo6bo$88boo11bo9booboo6bo18bobo$ 87b4o20b4o5b3o12b3oboo3bo$87booboo20boo18boo4b4oboboo$16b3o59b3oboo5b oo39boo5b5o4bo$15bobbo58boo5bo31bo13boo4bo5bo3bo$18bo57bo7boo31bo12b5o 8b3o$18bo30bo27boo5bo30b3o14boo9bo$15bobo29boo29b3oboo5boo$48boo37boob oo45boo5bobbo$87b4o20bo24b4o8bo$88boo22bo23booboo3bo3bo$110b3o18boo5b oo5b4o$129booboo$45boo28boo28boo10b3o5bo3b4o$45boo28boo28boo7bobb3o3b oobo3boo$114bobo6bo3bo$30b3o5b3o73bobb3o3boobo3boo$30bobbo4bobbo9boo 64b3o5bo3b4o$30bo7bo12bobo42b4o8bobbo17booboo$30bo7bo12bo32bo10bo3bo 12bo18boo$31bobo5bobo41bobo4boo7bo8bo3bo$81boobbo3b4obbobbo10b4o$79boo bo5bo3boo$81boobbo3b4obbobbo$31bo51bobo4boo7bo$30b3o51bo10bo3bo$30bob oo62b4o20b4o$31b3o47boo36bo3bo$31boo48bobo31bo7bo$81bo28b7obbobbo$109b obb3oboo$110b7obbobbo$96boo17bo7bo$46b3o47bobo20bo3bo$45bobbo47bo23b4o $48bo$48bo78boo$45bobo63boo13b4o$111bobo12booboo14boo42boo5b4o$111bo 16boo14b4o39booboo3bo3bo$144booboo38b4o8bo$146boo40boo5bobbo$125bo$ 124b3o59bo$123boboo3bo11bo42boo8boo$123bo6bo10b4o39bo9bobbo$60b3o5b3o 53bo14b5obo39b5o4bobbo$60bobbo4bobbo66bo6boo39b4o3booboo$60bo7bo68bo3b ob3o43bo4boo$60bo7bo69bo3b3o$61bobo5bobo67bo32bobo$173b3o$145boo26b3o 20b4o$136b4o4b4o47bo3bo$61bo73bo3bo4booboo29b4o17bo$60b3o76bo6boo12bo 16bo3bo13bobbo$60boboo71bobbo19boo21bo$61b3o95boo16bobbo$61boo109boo$ 171b4o13b4o$145bo15bo9booboo11bo3bo12bobbo$143boo16bo11boo16bo16bo$ 144boo11bobboo4bobo18bobbo13bo3bo$76b3o78bo7bobboo35b4o$75bobbo78bobb oo4bobo15b3o$78bo82bo11boo$78bo49boobbo15boo11bo9booboo7bobbo14boo$75b obo51bo3bo13b4o20b4o8bobo18bo$131bo15booboo20boo4bo20boo4boo$138b3oboo 5boo28bo18boo6bo$137boo5bo32b3o17boo7bo$136bo7boo52bo3bobbo$137boo5bo 58bo$138b3oboo5boo22bo$147booboo22bo22boo5bobbo$100bo46b4o21b3o21b4o8b o$90b3o5boo48boo46booboo3bo3bo$90bobbo4bobbo89boo5boo5b4o$90bo7bobbo 66bo20booboo$90bo7bo30boo28boo8bo7b3o5bo3b4o$91bobo5bo3bo25boo28boo6b 3o4bobb3o3boobo3boo$104bo69bobo6bo3bo$101boo71bobb3o3boobo3boo$177b3o 5bo3b4o$91bo64b4o8bobbo17booboo$90b3o51bo10bo3bo12bo18boo$90boboo49bob o4boo7bo8bo3bo$91b3o47boobbo3b4obbobbo10b4o$91boo46boobo5bo3boo$141boo bbo3b4obbobbo$143bobo4boo7bo$144bo10bo3bo$156b4o20b4o$106b3o70bo3bo$ 105bobbo66bo7bo$108bo38boo21b7obbobbo$108bo38bobo19bobb3oboo$105bobo 39bo22b7obbobbo$175bo7bo$164bobo12bo3bo$162b4o14b4o$162bobbo$162bo24b oo$186b4o$186booboo14boo40boo5b4o$177boo9boo14b4o37booboo3bo3bo$120b3o 54bobo24booboo36b4o8bo$120bobbo53bo28boo38boo5bobbo$120bo$120bo130boo$ 121bobo70boo39boboo11b5o$193bobbo36bo5bo10bo4bo$188b3o13boo33bo10b3obb o$187bobbo8bo5boo26bo5bo11bobboo$121bo65booboo3bo3bo4boo28bo3bobboo9b oo$120b3o72bo4bo3bo30b3o3boo$120boboo73bo$121b3o$121boo82boo47b4o$196b 4o4b4o16bo28bo3bo$195bo3bo4booboo13boo12b4o17bo$199bo6boo15boo10bo3bo 13bobbo$195bobbo40bo$136b3o96bobbo$135bobbo91boo$138bo70bo19b4o13b4o$ 138bo70bo9bo9booboo11bo3bo12bobbo$135bobo81bo11boo16bo16bo$215bobboo4b obo18bobbo13bo3bo$194bo20bo7bobboo35b4o$192boo21bobboo4bobo$193boo24bo 11boo$206boo11bo9booboo4bo13boo$205b4o20b4o6bo7bo4boo$205booboo20boo5b 3o6b3o13b3o$196b3oboo5boo36bo18bo$150b3o42boo5bo42b5o7boo3bobo$150bobb o40bo7boo29bo20bo7boo$150bo44boo5bo31bo$150bo45b3oboo5boo23b3o$151bobo 51booboo45boo5bobbo$205b4o45b4o8bo$206boo20bo25booboo3bo3bo$229bo19boo 5boo5b4o$151bo75b3o17booboo$150b3o28boo28boo22b3o5bo3b4o$150boboo27boo 28boo19bobb3o3boobo3boo$151b3o78bobo6bo3bo$151boo70bo8bobb3o3boobo3boo $223bo11b3o5bo3b4o$214b4o8bobbo17booboo$202bo10bo3bo12bo18boo$201bobo 4boo7bo8bo3bo$166b3o30boobbo3b4obbobbo10b4o$165bobbo28boobo5bo3boo$ 168bo30boobbo3b4obbobbo$168bo32bobo4boo7bo$165bobo34bo10bo3bo$196boo 16b4o20b4o$196bobo38bo3bo$196bo36bo7bo$228b7obbobbo$227bobb3oboo$228b 7obbobbo$233bo7bo$237bo3bo$238b4o$$226boo17boo$226bobo15b4o$226bo17boo boo14boo$246boo14b4o38bobbo$262booboo41bo6boo$241boo21boo38bo3bo4boob oo$181bo58boo63b4o4b4o$180b3o131boo$180boboo55boo$181b3o77boo$181boo 72b3o3bobo31bobo12b4o$252b3o6boboo28b3oboo11bobboo$252bo9boo29b3ob3o 11bobboo$252b3o7bo31booboo12bobbo$295b3o3boo9boo$196b3o97bo4boo$195bo bbo64boo$198bo55b4o4b4o$198bo54bo3bo4booboo48boo$195bobo59bo6boo17bo 29booboo$253bobbo26bobo11boo14b4o$283boo10booboo14boo$295b4o$296boo$$ 268bobo18b4o14boo$269bo8bo9bo3bo12booboo13boo$279boo11bo12b4o13b4o$ 276b3o5boobbobbo14boo14booboo$253bo21b3o6b3o37boo$253bobo20b3o5boobbo bbo$253boo24boo11bo$278bo9bo3bo4bo14boo$265b4o20b4o5boo11bobbo$264bo3b o28boo7b3o13boo$260bo7bo36bobbo8bo5boo$211bo43b7obbobbo37booboo3bo3bo 4boo$210b3o41bobb3oboo29bo20bo4bo3bo$210boboo41b7obbobbo25boo20bo$211b 3o46bo7bo23boo$211boo51bo3bo54boo$265b4o45b4o4b4o$287bo18bobbo3bo3bo4b ooboo$288boo20bo6bo6boo$287boo17bo3bobbobbo$226b3o12boo28boo23boo9b4o$ 225bobbo12boo28boo22boo5b3o$228bo62b3o6booboo$228bo55bo10boo5b3o$225bo bo54boo12boo9b4o$275boo10boo17bo3bo$273booboo8b4o20bo$261b3o5bo3b4o9b ooboo15bobbo$258bobb3o3boobo3boo12boo$258bobo6bo3bo$258bobb3o3boobo3b oo$261b3o5bo3b4o$273booboo$257bo17boo22boo$256boo26bo12booboo$256bobo 25bo8bo3b4o$288boobbobo3boo$279boo6bobboo3bo$288boobbobo3boo$284bo8bo 3b4o$284bo12booboo$299boo$377boo5bobbo$287bo88b4o8bo$286boo16b4o68boob oo3bo3bo$286bobo14bo3bo70boo5b4o$307bo14b4o$303bobbo14bo3bo48bo$325bo 47boo$300b3o18bobbo47boboo7boo$256b3o41bo71bobo7bobboo$255bobbo40boo 71boo3bo3b3obbo$258bo57boo3boo51bob3obbo4bo$258bo55bo6bobo57b5o$255bob o55bobbo6bo58boo$312boo7b3o$313boo46bobo20bobbo$361boo25bo$362bo3bobbo 14bo3bo$370bo14b4o$315boo5b4o40bo3bo$313booboo3bo3bo20bobo18b4o$313b4o 8bo20boo$314boo5bobbo22bo28bobbo$362boo16bo$360booboo11bo3bo$331bobo 14b3o5bo3b4o13b4o13b4o$331boo12bobb3o3boobo3boo30bo3bo$332bo12bobo6bo 3bo14boo22bo$345bobb3o3boobo3boo9bo20bobbo$348b3o5bo3b4o8bo$316bobo41b ooboo6boo$316bobo19boo22boo24boo3boo$317bo9bo8booboo45bo6bobo$325bobo 4bo3b4o27bo17bobbo6bo$324bobbo5bo3boo26bobo16boo7b3o$324bo6bobbo31boo 17boo$324bobbo5bo3boo$325bobo4bo3b4o$327bo8booboo21bo$286b3o49boo20bob o24boo5b4o$285bobbo72boo16boo4booboo3bo3bo$288bo89b4o3b4o8bo$288bo77bo 11booboo3boo5bobbo$285bobo29boo28boo8bo6boobo3bobbo5boo$317boo28boo6bo bo4b5o4bo3bo$356boo4bobbo4bo4boo$362b5o4bo3bo$344bobbo16boobo3bobbo5b oo$348bo17bo11booboo$331boo11bo3bo9b4o16b4o$333bo11b4o8bo3bo17boo$328b o7boobb3o18bo$327bo8boobb3o14bobbo$328bo7boobb3o$333bo11b4o$331boo11bo 3bo19bobbo$348bo23bo$344bobbo12bo7bo3bo$358b3o3bo4b4o$334b3o21boo5boo$ 334bo22bo6b3o$335bo22boo5boo$358b3o3bo4b4o$360bo7bo3bo$349b3obo18bo$ 349boo17bobbo$$377boo$375booboo$364b3o8b4o16boo$364bo11boo15booboo$ 365bo27b4o$394boo$$382boo$376b3o3boo9bo$376b3o14boo$375bo3bo12boboo$ 375b4o13bobo$376b3o13boo3$384bobbo$388bo6boo$384bo3bo4booboo$385b4o4b 4o$394boo! golly-2.5-src/Patterns/Life/Breeders/slide-breeder.rle0000644000175100001440000020222712156145314017644 00000000000000#C Breeder using slide-gun technology (Slide-o-04b-060 and #C Slide-o-04f-060) from Jason Summers' slide-gun collection. #C Makoto Kohno, 22 Dec 2002. x = 2393, y = 4182, rule = B3/S23 69boo$68boo$67bobo$68b3o$69boo$68boo$68b3o$68bobo$67bobbo$67boboo$68bo $$71b3o$70bobbo$73bo$73bo$70bobo15$68bo17bo$67b3o17boo$66boobo16boo$ 66b3o$66b3o$66b3o$67boo5$71b3o$70bobbo$73bo$73bo$70bobo6$103bo$104boo$ 103boo7$68bo$67b3o$66boobo$66b3o$66b3o$66b3o$67boo5$71b3o$70bobbo46bo$ 73bo47boo$73bo46boo$70bobo15$68bo$67b3o$66boobo$66b3o$66b3o$66b3o$67b oo5$71b3o$70bobbo$73bo$73bo$70bobo12$120b3o$120bobbo$120bo$68bo51bo3bo $67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bobbo $73bo$73bo$70bobo12$120b3o$120bobbo$120bo$68bo51bo3bo$67b3o50bo3bo$66b oobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bobbo$73bo$73bo$70bobo 12$120b3o$120bobbo$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52b obo$66b3o$66b3o$67boo5$71b3o$70bobbo$73bo$73bo$70bobo12$120b3o$120bobb o$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$ 67boo5$71b3o$70bobbo$73bo$73bo$70bobo12$120b3o$120bobbo$120bo$68bo51bo 3bo$67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bo bbo$73bo$73bo$70bobo12$120b3o$120bobbo$120bo$68bo51bo3bo$67b3o50bo3bo$ 66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bobbo197boo$73bo 196boo$73bo195bobo$70bobo197b3o$271boo$270boo$270b3o$270bobo$269bobbo$ 269boboo$270bo$$273b3o$272bobbo$275bo$120b3o152bo$120bobbo148bobo$120b o$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$ 71b3o$70bobbo$73bo196bo17bo$73bo195b3o17boo$70bobo195boobo16boo$268b3o $268b3o$268b3o$269boo5$273b3o48bo$272bobbo49boo$275bo48boo$120b3o152bo $120bobbo148bobo$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52bob o$66b3o236bo$66b3o237boo$67boo236boo5$71b3o$70bobbo$73bo196bo$73bo195b 3o$70bobo195boobo$268b3o$268b3o$268b3o$269boo5$273b3o$272bobbo46bo$ 275bo47boo$120b3o152bo46boo$120bobbo148bobo$120bo$68bo51bo3bo$67b3o50b o3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo5$71b3o$70bobbo$73bo196b o$73bo195b3o$70bobo195boobo$268b3o$268b3o$268b3o$269boo5$273b3o$272bo bbo$275bo$120b3o152bo$120bobbo148bobo$120bo$68bo51bo3bo$67b3o50bo3bo$ 66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo4$322b3o$71b3o248bobbo$70bobb o248bo$73bo196bo51bo3bo$73bo195b3o50bo3bo$70bobo195boobo50bo$268b3o52b obo$268b3o$268b3o$269boo5$273b3o$272bobbo$275bo$120b3o152bo$120bobbo 148bobo$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$ 66b3o$67boo4$322b3o$71b3o248bobbo$70bobbo248bo$73bo196bo51bo3bo$73bo 195b3o50bo3bo$70bobo195boobo50bo$268b3o52bobo$268b3o$268b3o$269boo5$ 273b3o$272bobbo$275bo$275bo$272bobo$$68bo$67b3o$66boobo$66b3o$66b3o$ 66b3o$67boo4$322b3o$71b3o248bobbo$70bobbo248bo$73bo196bo51bo3bo$73bo 195b3o50bo3bo$70bobo195boobo50bo$268b3o52bobo$268b3o$268b3o$269boo5$ 273b3o$272bobbo$275bo$120b3o152bo$120bobbo148bobo$120bo$68bo51bo3bo$ 67b3o50bo3bo$66boobo50bo$66b3o52bobo$66b3o$66b3o$67boo4$322b3o$71b3o 248bobbo$70bobbo248bo$73bo196bo51bo3bo$73bo195b3o50bo3bo$70bobo195boob o50bo$268b3o52bobo$268b3o$268b3o$269boo5$273b3o$272bobbo$275bo$120b3o 152bo$120bobbo148bobo$120bo$68bo51bo3bo$67b3o50bo3bo$66boobo50bo$66b3o 52bobo$66b3o$66b3o$67boo4$322b3o$71b3o248bobbo$70bobbo248bo$73bo196bo 51bo3bo$73bo195b3o50bo3bo$70bobo195boobo50bo$268b3o52bobo$268b3o$268b 3o$269boo$18boo$18boo$$5boo$5boo266b3o$272bobbo$5bo13bo255bo$4bobo10b ooboo98b3o152bo$4bobo33boo78bobbo148bobo$5bo10bo5bo17boo78bo$68bo51bo 3bo$16booboboo30boo12b3o50bo3bo$bbooboboo44boo11boobo50bo$bbo5bo57b3o 52bobo$3bo3bo13bo44b3o$4b3o11bobbo44b3o$21bo45boo$17boo$17bo36bo$17bob o33b3o$18boo18b5o10b3o266b3o$37bob3obo27b3o248bobbo$7bo30bo3bo8boo3boo 12bobbo248bo$8bo9boo3boo14b3o9boo3boo15bo196bo51bo3bo$6b3o9bo5bo15bo 32bo195b3o50bo3bo$11bo58bobo195boobo50bo$11bobo5bo3bo30boo212b3o52bobo $11boo7b3o30bobo212b3o$38bo13boobbo211b3o$b5o32bo14boo214boo$ob3obo8bo 21bobo5bo7boo$bo3bo7bobo20booboobbobo7bo$bb3o9boo19bo5bobboo$3bo19boo 13bo14bo5bo$23bo11boo3boo11bo5bo213b3o193boo$24b3o20bo6bo3bo213bobbo 192boo$26bo20bobo5b3o217bo191bobo$3boo42boo71b3o152bo192b3o$3boo115bo bbo148bobo194boo$120bo347boo$68bo51bo3bo343b3o$35boo30b3o50bo3bo343bob o$36bo29boobo50bo346bobbo$15boo16b3o30b3o52bobo343boboo$15boo16bo32b3o 399bo$30bo24boo9b3o$28bobo24boo10boo402b3o54bo$29boo439bobbo55boo$473b o54boo$473bo$23bo8bo289b3o145bobo$23b3o6bobo8boo26b3o248bobbo$26bo5boo 9boo25bobbo248bo$25boo46bo196bo51bo3bo$73bo195b3o50bo3bo$70bobo195boob o50bo$27b3o238b3o52bobo$27b3o238b3o$26bo3bo237b3o$25bo5bo237boo$26bo3b o14bo$27b3o13bobo$44boo$$273b3o$272bobbo192bo17bo$42bo232bo191b3o17boo $43boo75b3o152bo190boobo16boo$42boo76bobbo148bobo191b3o$25boo93bo345b 3o$26bo41bo51bo3bo341b3o$23b3o13bo27b3o50bo3bo342boo$23bo15bobo24boobo 50bo$27boo11bobo23b3o52bobo$27boo11bobbo22b3o$40bobo17bo5b3o$39bobo3bo 12bobo6boo402b3o$39bo5bo13boo409bobbo52bo$44b3o426bo53boo$473bo52boo$ 58bo263b3o145bobo$44b3o9bobo12b3o248bobbo$45bo11boo11bobbo248bo$45bo 27bo196bo51bo3bo$45bo27bo195b3o50bo3bo$45bo24bobo195boobo50bo$44b3o 221b3o52bobo177bo$268b3o233boo$268b3o232boo$44b3o222boo$45bo$45bo3$ 273b3o$75boo195bobbo192bo$74boo199bo191b3o$76bo43b3o152bo190boobo$120b obbo148bobo191b3o$120bo345b3o$120bo3bo341b3o$120bo3bo342boo$56boo62bo$ 56boo63bobo$95boo$95boo$471b3o$63boo405bobbo46bo$62bobo408bo47boo$55b 3o4boboboo35bo369bo46boo$63bobobo22boo11b3o216b3o145bobo$55bobo7bo5b3o 15boo15bo215bobbo$54b5o6boo3bobbo11bo5bo13boo215bo$53boo3boo5b3o5bo11b 3o182bo51bo3bo$53boo3boo5b3o5bo14bo180b3o50bo3bo$65b3obbobo14boo179boo bo50bo$65boo41bo159b3o52bobo$55boo8bo42bo159b3o$54booboo4bobobo11boo 26bobo158b3o$55bobbo3boboboo11boo25booboo158boo$55bo6bobo35boo3bo5bo$ 58bo4boo35boo6bo$56boo40b3o4boo3boo$90bo7boo$89b3o5bobo173b3o$51boo3b oo30b5o11b3o165bobbo192bo$52b5o5bo8b3o5b3o5boo3boo9boobo168bo191b3o$ 53b3o7boo6bobbo3bo3bo5b5o10boo15b3o152bo190boobo$54bo7boo7bo16b5o11boo 14bobbo148bobo191b3o$71bo5bo5bo5bobbo12bobo12bo345b3o$72bobobboo3boo5b o3bo11bobboo10bo3bo341b3o$93bo26bo3bo342boo$90boobo26bo$77boo13bo28bob o$76bobo$76bo$76boo11boo3boo8b5o362b3o$57bo22bo8bo5bo7bob3obo360bobbo$ 56b3o7boo9bobbo23bo3bo364bo$56b3o8boo11bo9bo3bo10b3o365bo$66bo24b3o12b o215b3o145bobo$54boo3boo261bobbo$54boo3boo14booboboo240bo$270bo51bo3bo $75bo5bo23boo162b3o50bo3bo$59boo44boo161boobo50bo$59bobo14booboo187b3o 52bobo$61boo15bo13boo174b3o$60boo30boo174b3o$60boo207boo$56b3o$$77boo 441b3o$77boo441bobbo$273b3o244bo$56boo3boo209bobbo192bo51bo3bo$275bo 191b3o50bo3bo$57bo3bo58b3o152bo190boobo50bo$58b3o59bobbo148bobo191b3o 52bobo$58b3o59bo345b3o$120bo3bo341b3o$120bo3bo342boo$120bo$121bobo$58b oo$58boo$471b3o$470bobbo$473bo$473bo$322b3o145bobo$322bobbo$322bo$270b o51bo3bo$269b3o50bo3bo$93boo173boobo50bo$71boo20boo173b3o52bobo$71boo 195b3o$141bo126b3o$72bo68bobo125boo$71bobo20bo49boo6boo$66boobbobbo19b obo34boo12boo4bo3bo$50boo14boobo22bo3bo33boo12boo3bo5bo8boo354b3o$51bo 18boo21b3o45bobo4boobo3bo8boo354bobbo$51bobo8bo28boo3boo43bo7bo5bo117b 3o244bo$52boo7boobboo83bo3bo117bobbo192bo51bo3bo$60boo90boo121bo191b3o 50bo3bo$59b3o4boo52b3o19bo132bo190boobo50bo$60boo4boo52bobbo16boo130bo bo191b3o52bobo$34boo15boo8boo29bo27bo20boo323b3o$34boo15boo9bo29bo27bo 3bo341b3o$92bob3o23bo3bo342boo$120bo$97bo23bobo22boo$71bobbo19boboo47b oo10bobo$71bo22boo51bo8bobbo4bo$48b3o19bo4bo66boo11boo5boo307b3o$47bo 3bo17bobobboo66bobo8boo3bo8boo301bobbo$46bo5bo14boobo18boo3boo49bo9boo 10boo304bo$43bobbo3boo37boo3boo46bobbo10bobbo313bo$43bo3boo41b5o7bo42b o11bobo310bobo$43bo23bobbo20bobo9bo31boo5bobo$69boo30b3o23bo6bobo5boo$ 91b3o31boo7bo135bo$43bo82boo5boo134b3o$38boo3bo224boobo$35boo3bobbo19b 3o49boo16boo133b3o$34bo5bo10b3o8bo3bo22bo11bobo10bobo17bo133b3o$35bo3b o13bo7bo5bo20b3o9boo13bo18bobo8boo121b3o$36b3o13bo8booboboo19bo3bo7b3o bo26boo3boo8boo122boo$55boo32bo9b3o27boo11boo10bo4bo$55bobo28bo5bo8bo 29bo9b3o10bo4bobo$56b3o5bo21bo5bo49boo10bo7boo4boo350b3o$57boo4bobo21b o3bo53boobboo11boo4boo350bobbo$54boo7bobo22b3o54boobbobboo8boo109b3o 244bo$34boo18b3o7bo52boo31b4o5bobo110bobbo192bo51bo3bo$34boo57boo21bo bbo31bo7bo115bo191b3o50bo3bo$49boo13boo28boo21boo156bo190boobo50bo$49b oo4boo7boo27bo13bo9bo154bobo191b3o52bobo$55boo48bobo18boo338b3o$103boo 21bobo337b3o$103boo23bo338boo$45b3o55boo23boo$47bo51boo4bobo$45bo45bo 6bobo6bo37boo9boo$45boo43b3o5bo45boo9bobo$44boo44b3o4boo40bo6bo7b3o4b oob3o304b3o$43bobbo91bobo12b3o4bobb4o303bobbo$44bo43boo3boo20boo3boo9b oo3boo3bo12b3o4boo310bo$47booboo36boo3boo36boo3boo3bo13bobo315bo$45b3o boo4boo59bo3bo15boo3bo14boo164b3o145bobo$45b3o6bobo60b3o18bobo181bobbo $53b3o35bo25b3o19bo182bo$53boo35bobo177bo51bo3bo$56boo31boo178b3o50bo 3bo$55b3o31boo129boo46boobo50bo$89b3o128boo46b3o52bobo$90bobo25boo148b 3o$55boo34boo25boo87boo59b3o$55boo150boo60boo3$520b3o$207bo13bo20boo 276bobbo$206bobo11b3o17bobbo29b3o244bo$205bo3bo9b5o48bobbo192bo51bo3bo $206b3o9bobobobo14bo15boo18bo191b3o50bo3bo$204boo3boo7boo3boo30boo18bo 190boobo50bo$240boo30bobo191b3o52bobo$242bo223b3o$221bo244b3o$220bobo 244boo$205bo14boboo15boo3boo$205bo15b3o15boo3boo$205bob3o11bobbo15b5o$ 222b3o16bobo$210bo10bo3bo30bo214b3o$207boboo9bo5bo14b3o11b3o212bobbo$ 207boo6bo5bo3bo28b5o214bo$214bo7b3o28boo3boo213bo$214b3o37b5o63b3o145b obo$202boo3boo45bo3bo63bobbo$202boo3boo3boo41bobo64bo$203b5o4boo31bo 10bo13bo51bo3bo$204bobo39bo22b3o50bo3bo$244b3o21boobo50bo$204b3o33bo 17bo9b3o52bobo$239b3o14booboo7b3o$225boo11b5o25b3o$225bo11boo3boo11bo 5bo7boo$226b3o21boo$223bo4bo21boo3booboboo$205boo14bobo296b3o$205boo 15boo15b3o278bobbo$239b3o31b3o244bo$272bobbo192bo51bo3bo$237boo4bo31bo 191b3o50bo3bo$238bo4bobo29bo190boobo50bo$217boo16b3o5boo27bobo191b3o 52bobo$217boo16bo230b3o$257boo207b3o$257boo208boo4$225bo$225b3o10bo6b oo224b3o$228bo7bobo6boo223bobbo$227boo8boo234bo$473bo$322b3o145bobo$ 322bobbo$230bo4bo86bo$230bo5boo32bo51bo3bo$229bobo3boo32b3o50bo3bo$ 228booboo35boobo50bo$227bo5bo34b3o52bobo$230bo37b3o$227boo3boo34b3o 461bo$269boo462boo$732boo$253bo$251bobo266b3o$252boo266bobbo$227boo44b 3o244bo$228bo43bobbo192bo51bo3bo$225b3o10boo11bo23bo191b3o50bo3bo$225b o12boo9bobo23bo190boobo50bo$229boo3bo6boo7boo20bobo191b3o52bobo$229bob o3bo5b3o222b3o$230b5o6boo223b3o$231b3o4boo227boo$238boo$$247bo$246b3o$ 245booboo18bo202b3o$244b3ob3o15bobo201bobbo$244b3ob3o16boo204bo193boo$ 244b3ob3o222bo192boo$244b3ob3o71b3o145bobo192bobo$245booboo16bo55bobbo 340b3o$246b3o15bobo55bo344boo$247bo17boo55bo3bo339boo$271boo49bo3bo 339b3o$270boo50bo343bobo$272bo50bobo339bobbo$665boboo$666bo$730bo$669b 3o59boo$668bobbo58boo$520b3o148bo$520bobbo147bo$273b3o244bo147bobo$ 272bobbo192bo51bo3bo$275bo191b3o50bo3bo$258boo15bo190boobo50bo$258boo 12bobo191b3o52bobo$286boo9boo167b3o$285boo10boo167b3o$287bo179boo$265b oo$264bobo$264boboboo35bo$265bobobo35b3o$267bo40bo162b3o$257b3o7boo18b o19boo161bobbo$256bo3bo6b3o17b3o183bo$255bo5bo5b3o3b3o14bo182bo192bo 17bo$255bo5bo5b3o3bobbo12boo31b3o145bobo192b3o17boo$258bo8boo4bo48bobb o338boobo16boo$256bo3bo6bo5bo48bo341b3o$257b3o5bobobo4bobo4boo39bo3bo 337b3o$258bo5boboboo11boo18boo7bo11bo3bo337b3o$264bobo33boo7b3o10bo 342boo$265boo35bo5b5o10bobo$255b3o49boo3boo$255b3o31boo3boo$254bo3bo 31b5o3boo424bo$262bobo25booboo4boo6boo360b3o53boo$253boo3boo3boo25boob oo3bo7bo361bobbo52boo$263bo27b3o15bo210b3o148bo$273b3o30bobbo210bobbo 147bo$281b3o22booboo209bo147bobo$272bobbo4bo3bo23boo158bo51bo3bo$273bo boobbo5bo181b3o50bo3bo$280bo3bo8b3o170boobo50bo$275boo4b3o9b3o9boo3boo 154b3o52bobo$280bobbo8bo3bo8boo3boo154b3o$280b3o8bo5bo8b5o155b3o232bo$ 279boboo9bo3bo10bobo157boo233boo$279bobo11b3o405boo$280bo26b3o$267bo$ 259bo7boo$258b3o5bobo8boo3boo187b3o$257b5o15bobobobo186bobbo$256boo3b oo15b5o190bo$257b5o17b3o25boo164bo192bo$257b5o18bo26boo13b3o145bobo 192b3o$258bobbo60bobbo338boobo$258bo3bo31boo26bo341b3o$262bo31boo26bo 3bo337b3o$259boobo59bo3bo337b3o$261bo60bo342boo$323bobo$279boo$258boo 3boo14boo$258bo5bo$669b3o$259bo3bo404bobbo46bo$260b3o257b3o148bo47boo$ 520bobbo147bo46boo$520bo147bobo$468bo51bo3bo$467b3o50bo3bo$466boobo50b o$466b3o52bobo$260boo204b3o$260boo204b3o$467boo5$471b3o$470bobbo$473bo $473bo192bo$295boo25b3o145bobo192b3o$273boo20boo25bobbo338boobo$273boo 47bo341b3o$322bo3bo14boo321b3o$274bo47bo3bo14bobbo319b3o$273bobo46bo 10b5o7bo9bobo307boo$268boobbobbo47bobo6bo5bo6bo7bo3bo$252boo14boobo24b o35bo3boo7bo7bo12boo$253bo18boo21b3o35bo7bobbo7bo4bo8boo$253bobo7bo31b 3o43boo10bo$254boo7bobo87bo3bo311b3o$266boo25boo3boo55bobo310bobbo$ 266boo25boo3boo220b3o148bo$252boo12boo74boo176bobbo147bo$236boo9boo5bo 8bobo76boo176bo147bobo$236boo16bo8bo31boo171bo51bo3bo$246bo6bo41bobo 169b3o50bo3bo$246bo3boo42bobboo167boobo50bo$296boo40bo127b3o52bobo$ 247b3o23bobbo19boo38boo12bo10bo104b3o$273bo23bo39boo10boo9boo104b3o$ 239bo32bo4bo66bo4bobo7boo4boo100boo$238bobo30bobobboo13bo5bo44bobo13b 3o4boobboo$238bobo28boobo18bo5bo43bobo15boo4boobboo$239bo52bo3bo6bo36b obbo16boo$244bo48b3o5bobo37bobo17bo$243bobo23bobbo29boo33boo3bobo126b 3o244b3o$246boo23boo63bobo5bo125bobbo244bobbo$243boo91bo136bo244bo$ 245bobo87boo136bo192bo51bo3bo$246bo75b3o145bobo192b3o50bo3bo$251bo58bo 6boobbobbo10boo327boobo50bo$250bobo58bo4bobobo15bo327b3o52bobo$250bobo 56b3o5bo3bobbo11bobo10bo314b3o$251bo11boo3boo21bo29boboo12boo9b4o312b 3o$257boo6b3o21booboo7boo44boob4o5boo304boo$241b3o13bobo4bo3bo33boo13b oo27b3oboo3bo3bobbo$258b3o4bobo20bo5bo6bo45booboo3bo7bo6boo$239boo3bo 14boo5bo81b5o3bo6bo6boo$237bo6bo11boo30booboboo54bo3b3o7bo$236bo19b3o 100bobbo306b3o$236bo5boo78bo36boo307bobbo$237boo12boo13boo26boo224b3o 148bo$251boo4boo7boo25bobo14boo29boo4bo172bobbo147bo$257boo35bo13bobbo 3boo11boo10boo3boo173bo147bobo$293boo12bo7b3o10bobo11bo3boo120bo51bo3b o$293b3o11bo6bo15bo136b3o50bo3bo$294boo11bo22boo134boobo50bo$292bo8boo 5bobbo154b3o52bobo$300bobo7boo37boo9bo105b3o$300bo47b4o7bobo104b3o$ 299boo16boo3boo19bobobbobb3o5boobo4boo98boo$247boo44bo23bo5bo18bobbobb oo9booboo3boo$246bobboo41b3o38boo6boo9bo6boobo$246boobbo40b5o22bo3bo 10boo4boo3bo8bo5bobo$247boo8boo31boo3boo22b3o19boo10bo6bo$249boobo3bob o32b5o46bobbo125b3o244b3o$250bobobb3o33bo3bo47bobo124bobbo244bobbo$ 255boo35bobo178bo244bo$258boo33bo124boo53bo192bo51bo3bo$257b3o158boo 50bobo192b3o50bo3bo$664boobo50bo$293boo25boo83boo257b3o52bobo$257boo 34boo25boo83boo257b3o$257boo405b3o$665boo$$440boo$440boo$405bo$404b3o 46boo214b3o$404b3o10b5o18bo12boo213bobbo$416bob3obo16b3o229bo$402boo3b oo8bo3bo16bo3bo228bo$402boo3boo9b3o19bo227bobo$419bo17bo5bo11boo11bo$ 437bo5bo23b3o$404boo32bo3bo23boobo$404bobo32b3o24b3o$403bobboo13bo44b 3o$405boo14bo29boo3boo8b3o$405boo7bo5bobo29b5o10boo$406bo7bobobbooboo 28booboo$414boobbo5bo17bo9booboo$400bo5bo14bo31b3o$400bo5bo11boo3boo$ 401bo3bo6bo29bo28b3o244b3o$402b3o5bobo27bobo27bobbo244bobbo$411boo28b oo30bo244bo$473bo192bo51bo3bo$470bobo192b3o50bo3bo$450bo213boobo50bo$ 423boo10boo3boo8bobo3bo207b3o52bobo$423bo26boo3b3o206b3o$424b3o9bo3bo 13b5o205b3o$426bo10b3o13bobobobo205boo$403boo32b3o13boo3boo$403boo$$ 456bo$435boo18bobo211b3o$427bo8bo18bobo210bobbo$415boo8bobo5b3o20bo63b 3o148bo$415boo9boo5bo21boo63bobbo147bo$455boo63bo147bobo$455boo11bo51b o3bo$435bo31b3o50bo3bo$435bobo28boobo50bo$435boo29b3o52bobo$423bo42b3o $423b3o17boo21b3o$426bo16boo22boo$425boo4$442bo28b3o244b3o$440bobo27bo bbo244bobbo$441boo30bo244bo$428bo44bo192bo51bo3bo$427b3o40bobo192b3o 50bo3bo$426b5o233boobo50bo$425boo3boo7bo224b3o52bobo$440boo222b3o$439b oo223b3o$429bo235boo$429bo$$425boo$426bo$423b3o9bo233b3o$423bo9b4o20bo 210bobbo$427boo3boboboo17bobo62b3o148bo$427boobbobbob3o17boo62bobbo 147bo$432boboboo82bo147bobo$433b4o31bo51bo3bo$435bo8b3o8bo11b3o50bo3bo $444b3o6bobo10boobo50bo$445bo8boo10b3o52bobo$445bo20b3o$445bo20b3o467b o$444bobo20boo468boo$936boo$$444bobo$445bo$445bo25b3o244b3o$445bo24bo bbo244bobbo$444b3o26bo244bo$444b3o26bo192bo51bo3bo$470bobo192b3o50bo3b o$664boobo50bo$664b3o52bobo$664b3o$664b3o$665boo$$478boo$477boo$479bo$ 669b3o$456boo210bobbo$456boo62b3o148bo$495boo23bobbo147bo$495boo23bo 147bobo$520bo3bo$463boo55bo3bo$462bobo55bo$462boboboo35bo17bobo$463bob obo35b3o$465bo40bo$453booboboo5boo18bo19boo427bo$465b3o17b3o5boo440boo $453bo5bo5b3o20bo3boo440boo$465b3o19boo5bo$454booboo6boo21b3o$456bo8bo 5b3o15bobo226b3o$463bobobobbobbo5boo8bobo226bobbo$462boboboo5bo5boo9bo 227bo$462bobo8bo26boo164bo51bo3bo$463boo5bobo27boo3boo3boo153b3o50bo3b o$482bo4booboboo170boobo50bo$459bo21bo5bo5bo12bo3bo153b3o52bobo$453b3o 4boo19bo6bo3bo14b3o154b3o$452bo3bobboo28b3o3bo11b3o154b3o$495boo168boo $451bo5bo19boo3boo10bobo$451boo3boo22bo25bo$473boobbo5bo21b3o$473bobo bbooboo21bo3bo$466bobo4bo5bobo24bo162b3o$467boo11bo22bo5bo158bobbo$ 467bo3bo8bo11bo10bo5bo10b3o148bo$471boo19bo11bo3bo11bobbo147bo$470bobo 18bobo11b3o12bo147bobo$490booboo25bo3bo$478bo10bo5bo24bo3bo$477b3o12bo 27bo$476bo3bo8boo3boo25bobo$454boo3boo14bob3obo$455b5o3boo11b5o$455boo boo4boo25bo436bo$455booboo3bo27bo373boo62boo$456b3o31bo14boo357boo62b oo$505boo356bobo$864b3o$492boo224b3o144boo$492boo224bobbo142boo$458b3o 257bo145b3o$458b3o205bo51bo3bo141bobo$457bo3bo203b3o50bo3bo140bobbo$ 456bo5bo14boo185boobo50bo144boboo$457bo3bo15boo185b3o52bobo142bo$458b 3o203b3o$664b3o200b3o$665boo199bobbo$869bo$869bo$866bobo$$669b3o$668bo bbo$520b3o148bo$458boo60bobbo147bo$458boo60bo147bobo$520bo3bo$520bo3bo $520bo$521bobo5$864bo17bo39bo$493boo368b3o17boo38boo$471boo20boo367boo bo16boo38boo$471boo245b3o141b3o$538bo179bobbo140b3o$472bo64bobo178bo 143b3o$471bobo61boo3bo14boo109bo51bo3bo140boo$466boobbobbo56boo3boo3bo 13bobo108b3o50bo3bo$450boo14boobo60boo3boo3bo12b3o4boob3o98boobo50bo$ 451bo18boo65bobo12b3o4bobb4o98b3o52bobo$451bobo5boo77bo6bo7b3o4boo102b 3o$452boo5bobbo31bo48boo9bobo107b3o200b3o$463bo29b3o48boo9boo108boo 199bobbo$463bo28b5o372bo$463bo27boo3boo371bo$434boo15boo6bobbo29b5o 369bobo$434boo15boo6boo31bo3bo$493bobo173b3o$494bo173bobbo$520b3o148bo $438b3o4bo25bobbo45bobbo26bo7bo112bo$437bo3bobbobo24bo20bo27bo28b4o5bo bo107bobo228bo$436bo3boo3b3o22bo4bo14booboo25bo3bo19boobbobboo8boo337b oo$437b3obo5boo20bobobboo23bo20bo3bo19boobboo11boo4boo330boo$438bo7bob o11boo5boobo18bo5bo4bo19bo20boo10bo7boo4boo$441bo5bo12boo36b3o20bobo6b o9b3o10bo4bobo$489booboboo32boo11boo10bo4bo$463boobbobbo58boo4boo7boo$ 469boo33boo28bobo7boo$504bobo27bo$504bobo26boo329bo$503bo359b3o$439bo 5bo15boo3boo34b5o8boo16boo327boobo$438bobo7bo12boo3boo34bo3bo7bobo17bo 183b3o141b3o$438boo5bob3o55bo9bo18bobo7bo173bobbo140b3o$439b3o3boo3bo 12b3o69boo7b4o170bo143b3o$440bobobbo3bo5boo6b3o79b4o7bo109bo51bo3bo 140boo$441bo4b3o6bobo6bo24bo8bo46bobbo6bobo107b3o50bo3bo$456b3o29b3o7b oo14bo18boo10b4o4boo3bo9boo94boobo50bo$457boo28b5o5bobo15bo16boo10b4o 5boo3bo9boo94b3o52bobo$454boo30bobobobo20b3o18bo9bo8boo3bo105b3o$434b oo18b3o29boo3boo62bobo106b3o200b3o$434boo120bo108boo199bobbo46bo$464b oo79bobo321bo47boo$445bo9boo7boo25boo17bo34boo322bo46boo$442bobo10boo 34boo16bobo14boo18bo319bobo$441boobo48bo14bo3boo12bobo$442boo4bo42b3o 14bo3boo14bo12boo126b3o$445b5o39bo18bo3boo3b3o8boo11boo125bobbo$444b3o bbo39b5o5boo8bobo5b3o151bo$443bo3boo41boo6bobo9bo5bo3bo33boo115bo$444b oboo50bo16bo5bo25boboo3b3o111bobo$446boo49boo17bo3bo22bobbo3bo5boobo5b oo$488boo3boo22b3o22boobbo4bo4bobbo5boo$489b5o37boo8boo5b4o4boobo$489b ooboo37boo7b3o7bo3b3o$455boo32booboo47boo11boo$449boo3bobo33b3o49boo$ 449boobb3o87bo$453boo$456boo406bo$455b3o405b3o$616boo244boobo$491boo 25boo96bobbo98b3o141b3o$455boo34boo25boo198bobbo140b3o$455boo146boo15b o97bo143b3o$603boo61bo51bo3bo140boo$618boo45b3o50bo3bo$617bo46boobo50b o$664b3o52bobo$638boo24b3o$614boo3boo17boo24b3o200b3o$614boo3boo44boo 199bobbo$615b5o31boo216bo$616bobo32boo216bo$603bo262bobo$602b3o11b3o 19bo13bo$601b5o30booboo10bobo15b3o$600boo3boo44bobo14bobbo$601b5o29bo 5bo10bo18bo$601bo3bo65bo$602bobo30booboboo26bobo$603bo10bo34booboboo$ 613bo35bo5bo$613b3o20bo13bo3bo$601bo17bo16bobbo11b3o$599booboo14b3o15b o$617b5o17boo275b3o$598bo5bo11boo3boo17bo275bobbo$608boo28bobo275bo$ 598booboboo3boo28boo224bo51bo3bo$863b3o50bo3bo$618b3o29bo211boobo50bo$ 618b3o12boo3boo9bo68b3o141b3o52bobo$633bo5bo9b3o66bobbo140b3o$616bo4b oo23bo71bo143b3o$614bobo4bo12bo3bo5bobo19bo51bo3bo140boo$615boo5b3o10b 3o7boo18b3o50bo3bo$624bo39boobo50bo$601boo49b5o7b3o52bobo$601boo39bo8b ob3obo6b3o$642bobo7bo3bo7b3o200b3o$642boo9b3o9boo199bobbo$633boo19bo 214bo$634bo234bo$613boo16b3o232bobo$613boo16bo$653boo14b3o$653boo13bo bbo$671bo$631bo39bo$629bobo36bobo$621bo8boo$621b3o17boo$624bo16boo$ 623boo$628bo$629boo285b3o$628boo286bobbo$916bo$864bo51bo3bo$863b3o50bo 3bo$862boobo50bo$862b3o52bobo$623boo3boo232b3o$646bo215b3o$624bo3bo15b obo19bo196boo$625b3o17boo18b3o$625b3o36boobo$664b3o$664b3o$623boo39b3o 200b3o$624bo19boo19boo199bobbo$621b3o12bo5bobo224bo$621bo11b4o4boboo 224bo$625boo5b4o6bo223bobo$625boo5bobbo$632b4o33b3o$633b4o31bobbo$636b o34bo$642b3o16bo9bo$641bo3bo13bobo6bobo$641bo3bo14boo$642b3o$$659bo$ 657bobo$658boo256b3o$642b3o271bobbo$641bo3bo270bo$641bo3bo218bo51bo3bo $642b3o218b3o50bo3bo$862boobo50bo$718b3o141b3o52bobo$670boo46bobbo140b 3o$669boo47bo143b3o$671bo46bo3bo140boo$718bo3bo$718bo$719bobo418bo$ 1141boo$867b3o270boo$866bobbo$869bo$654boo213bo$654boo210bobo$654boo 37boo$654bo14b3o21boo$653bobo12bobbo$653bobo5boo8bo13boo$654bo5bobo8bo 12boo$660boboboobbobo15bo14bo$661bobobo35b3o$651boo3boo5bo40bo$651bobo bobo5boo18bo19boo$652b5o6b3o17b3o$653b3o7b3o20bo20bo$654bo8b3o19boo20b o208b3o$663boo41bo209bobbo$663bo252bo$661bobobo11boo9bo175bo51bo3bo$ 660boboboo11boo8bobo13boo3boo153b3o50bo3bo$660bobo6b3o14bo3bo12bo5bo 152boobo50bo$661boo6bobbo14b3o28b3o141b3o52bobo$655bobo11bo7b3o5boo3b oo8boobbo3bo9bobbo140b3o$656boo11bo7b3o19boo4b3o10bo143b3o$656bo13bobo 28bo16bo3bo140boo$718bo3bo$718bo$651b3o21boo3boo9boo26bobo$650bo3bo21b 5o11boo444bo$649bo5bo7bo13b3o11bo175b3o269boo$650bo3bo9boo12bo25bo161b obbo268boo$651b3o9boo7b3o27booboo162bo$651b3o18bo196bo$655bo17bo27bo5b o158bobo$654bobo$654bobo10boo32booboboo$655bo12boo20bo$667bo21b3o$688b 5o$652booboboo16b3o9boo3boo$652bo5bo$653bo3bo17bobo$654b3o3bo13b5o$ 660boo11boo3boo9b3o$659bobo11boo3boo9b3o11boo$703boo211b3o$916bobbo$ 676bo13boo224bo$677boo11boo172bo51bo3bo$863b3o50bo3bo$657bo21bo182boob o50bo$657bo60b3o141b3o52bobo$656bobo16bobbo39bobbo140b3o$655booboo15b oo41bo143b3o$654bo5bo57bo3bo140boo$657bo60bo3bo$654boo3boo57bo$719bobo $1132bo$658bo208b3o263boo$658bo207bobbo262boo$659bo209bo$869bo$866bobo $656boo$656boo10$691boo223b3o$669boo20boo223bobbo$669boo245bo$738bobo 123bo51bo3bo$670bo66bobbo122b3o50bo3bo$669bobo21boo41boo10bo6bo106boob o50bo$664boobbobbo46b3o7boo4boo3bo8bo5bobo105b3o52bobo$648boo14boobo 50bobbo6boo6boo9bo6boobo4boo98b3o$649bo18boo48bo18bobbobboo9booboo3boo 98b3o$649bobo4bo61bo3bo15bobobbobb3o5boobo105boo$650boo3bobo31boo3boo 22bo3bo20b4o7bobo$653boo3bo31b5o23bo25boo9bo$653boo3bo31booboo24bobo$ 653boo3bo31booboo$632boo15boo4bobo33b3o173b3o$632boo15boo5bo80bo3boo 123bobbo256bo$735boo3boo127bo257boo$736boo4bo126bo256boo$866bobo$669bo bbo81boo$669bo84bobbo305boo$646b3o19bo4bo22bo47bo3b3o7bo303boo$645bo3b o17bobobboo16bo3bobo46b5o3bo6bo6boo294bobo$644bo5bo14boobo20b3o3boo45b ooboo3bo7bo6boo295b3o$641bobbo3boo38b5o48b3oboo3bo3bobbo305boo$641bo3b oo40bobobobo48boob4o5boo306boo$641bo20bobbobbo18boo3boo39boo8b4o315b3o $661bobo3boo63bobo9bo317bobo$660bo3bo38bo28bo328bobbo$641bo18b5o39bo 26boo328boboo$636boo3bo17boo3boo36b3o211b3o143bo$633boo3bobbo18b5o48b oo5boobboo5boo183bobbo$632bo5bo10b3o9b3o48bobo6boo3bo5bo183bo148b3o$ 633bo3bo13bo10bo50bo8boboo6bobo6boo121bo51bo3bo143bobbo$634b3o13bo82b 3o5bobo119b3o50bo3bo146bo$653boo80b3o6bo11bobo103boobo50bo150bo$653bob o79bobbobbobbo10bobbo103b3o52bobo144bobo$654b3o79boo6bo9boo10boo94b3o$ 655boo37boo19boo24bobo8boo3bo8boo94b3o$652boo41boo17bobbo23boo11boo5b oo100boo$632boo18b3o30b5o4bo19bo4bo26bo8bobbo4bo$632boo50bob3obo24b6o 23boo10bobo$647boo13boo21bo3bo28boboo23boo$647boo4boo7boo22b3o15bobo 11bobo$653boo32bo16bobbo10boo4boo141b3o$688boo17boo15bobo139bobbo$688b obo14bo3boo15bo13boo127bo$643b3o42bobo16boo17boo11boo128bo$645bo43bo7b oo5bobbo8bo24bo124bobo$643bo52bobo5bobo9bo34boo$643boo51bo18bobo31bo3b o$642boo42booboboobboo17booboo21bo7bo5bo8boo297bo17bo$641bobbo41bo5bo 20bo5bo20bobo4boobo3bo8boo296b3o17boo$642bo44bo3bo24bo12boo12boo3bo5bo 305boobo16boo$645booboo38b3o22boo3boo9boo12boo4bo3bo306b3o$643b3oboo4b oo88boo6boo307b3o$643b3o6bobo85bobo317b3o$651b3o61bo24bo320boo57bo$ 651boo62bo405boo$654boo58bo405boo$653b3o260b3o$916bobbo$689boo25boo 198bo148b3o$653boo34boo25boo146bo51bo3bo143bobbo$653boo208b3o50bo3bo 146bo$862boobo50bo150bo$862b3o52bobo144bobo$862b3o$862b3o$863boo$$814b oo$814boo281bo$1098boo$801boo64b3o227boo$801boo12bo50bobbo$814b3o52bo$ 813bo3bo51bo$815bo50bobo$799boo11bo5bo17boo$812bo5bo17boo$813bo3bo244b o$814b3o32boo210b3o$849boo209boobo$798boo3boo255b3o$799b5o256b3o$799b ooboo256b3o$799booboo9bo22bo13bo210boo$800b3o32b3o11bobo$834b5o9bo3bo$ 813bo19bobobobo9b3o64b3o$813bobo17boo3boo7boo3boo62bobbo$813boo101bo 148b3o$864bo51bo3bo143bobbo46bo$836bo26b3o50bo3bo146bo47boo$805bo29bob o24boobo50bo150bo46boo$799bo3bobo8boo3boo13boobo14bo9b3o52bobo144bobo$ 798b3o3boo28b3o15bo9b3o$797b5o13bo3bo13bobbo11b3obo9b3o$796bobobobo13b 3o14b3o27boo$796boo3boo13b3o13bo3bo10bo$831bo5bo9boobo$832bo3bo5bo6boo $799bo33b3o7bo$798bobo18boo20b3o23b3o$798bobo18bo29boo3boo10bobbo$799b o20b3o21boo3boo3boo13bo$799boo21bo21boo4b5o14bo$799boo50bobo12bobo$ 799boo$820bo30b3o$818bobo241bo$819boo10boo228b3o$832bo227boobo$811boo 16b3o228b3o$811boo16bo4bo225b3o$834bobo14boo207b3o$834boo15boo208boo3$ 916b3o$819bo96bobbo$819b3o17boo75bo148b3o$822bo16boo23bo51bo3bo143bobb o$821boo40b3o50bo3bo146bo$835bo26boobo50bo150bo$825bo7bobo26b3o52bobo 144bobo$825bo8boo26b3o$824bo37b3o$863boo$$821boo3boo4bo$821bo5bo5boo$ 832boo$822bo3bo40b3o$823b3o40bobbo$869bo$869bo$866bobo245b3o$1114bobbo $821boo27bo263bo$822bo25bobo211bo51bo3bo$819b3o12boo13boo210b3o50bo3bo $819bo13bobo224boobo50bo$823boo7bo6boo219b3o52bobo$823boo7bobbo3bobo6b o211b3o$832bo6bobo4bobo211b3o$833bobo11boo212boo$834boo$$841bo74b3o$ 841bo74bobbo$840bobo73bo148b3o$841bo22bo51bo3bo143bobbo$841bo21b3o50bo 3bo146bo$841bo20boobo50bo150bo$841bo20b3o52bobo144bobo$840bobo19b3o$ 841bo20b3o$841bo21boo5$867b3o$866bobbo$869bo$869bo$866bobo245b3o$1114b obbo$1114bo$1062bo51bo3bo$877boo182b3o50bo3bo$852boo22boo182boobo50bo$ 852boo24bo181b3o52bobo226bo$891boo167b3o282boo$891boo167b3o281boo$ 1061boo$852bo6boo$851b3o4bobo$850bo3bo3boboboo35bo$849bob3obo3bobobo 35b3o$850b5o6bo40bo162b3o$861boo18bo19boo161bobbo$861b3o17b3o183bo$ 861b3o20bo182bo$861b3o19boo18b3o158bobo$861boo29boo9b3o$849boobbo7bo 29boo9bo3bo$851bobo5bobobo11boo16bo7bo5bo$853boo3boboboo11boo25bo3bo$ 854boobbobo25bo16b3o$852boboo3boo24b3o7boo$852b3o30b3o8boo$867b3o25bo 4bo$866bobbo5b3o5boo3boo9boo$847boo3boo15bo5b3o5boo3boo9bobo$850bo18bo 4bo3bo$847bo5bo12bobo245b3o$848booboo6bobo11boo3boo8boo224bobbo$849bob o8boo26bobo223bo$850bo9bo29boo170bo51bo3bo$850bo38boo170b3o50bo3bo$ 872boo15boo11bo157boobo50bo$872bobo10b3o13b3o156b3o52bobo$872bo27b5o 155b3o279bo$853bo45bobobobo154b3o280boo$852bobo9bo34boo3boo155boo279b oo$851bo3bo8boo6bo$852b3o8bobo19boo3boo$850boo3boo45bo13b3o$886bo3bo 10bobo12bobbo$887b3o11bobo12bo148b3o$873b3o11b3o12bo13bo3bo143bobbo$ 872bo3bo24boo13bo3bo146bo$856boo13bo5bo23boo13bo150bo$857boo12bo5bo23b oo14bobo144bobo$856bo17bo$872bo3bo11boo$873b3o12boo$874bo3$873boo$855b o17boo$854b3o$853b5o$852boo3boo$1114b3o$1114bobbo$1114bo$854b3o205bo 51bo3bo$854b3o204b3o50bo3bo$1060boobo50bo$1060b3o52bobo$854boo204b3o 273bo$854boo204b3o274boo$1061boo273boo3$916b3o$916bobbo$916bo148b3o$ 916bo3bo143bobbo$916bo3bo146bo$916bo150bo$889boo26bobo144bobo$867boo 20boo$867boo$890bo47bo$868bo20bobo45boo$867bobo19bobo44boo11boo$862boo bbobbo20bo35boo7b3o7bo3b3o$846boo14boobo60boo8boo5b4o4boobo5boo$847bo 18boo69boobbo4bo4bobbo5boo$847bobo6bobo28booboboo44bobbo3bo5boobo$848b oo5bobbo28bo5bo48boboo3b3o$854boo32bo3bo56boo$852boo3bo31b3o222b3o$ 846boo6boo80boo176bobbo$830boo9boo5bo6bobbo77boo176bo$830boo16bo7bobo 6boo195bo51bo3bo$840bo6bo17boo74bo119b3o50bo3bo$840bo3boo94boo118boobo 50bo$940bobo117b3o52bobo$841b3o23bobbo21bo58bo108b3o$859b3o5bo25bo56bo bo107b3o$833bo27bo4bo4bo19b3o35bo9bo8boo3bo107boo267bo$832bobo25bo4bob obboo55boo10b4o5boo3bo9boo366boo$832bobo28boobo61boo10b4o4boo3bo9boo 365boo$833bo82b3o21bobbo6bobo$838bo77bobbo20b4o7bo$837bobo23bobbo19b5o 25bo14boo6b4o122b3o$840boo23boo18bob3obo8bo15bo3bo9bobo6bo124bobbo$ 837boo47bo3bo7bobo15bo3bo9bo136bo$839bobo17b3o25b3o9boo15bo12boo136bo$ 840bo17booboo25bo28bobo144bobo$845bo12booboo22bo25boo16boo$844bobo11b 5o21bobo11boo10bobo17bo$844bobo10boo3boo20bobo12boo10bo18bobo6bo$845bo 39bo12bo8bo23boo4bobo$851boo55bo27bobo17bo$835b3o13bobo52b3o26bobbo16b oo$852b3o27boo3boo47bobo15boo4boobboo$833boo3bo14boo3boo22boo3boo48bob o13b3o4boobboo$831bo6bo11boo31b5o3bo47bo4bobo7boo4boo$830bo19b3o31bobo 4boo39boo10boo9boo$830bo5boo52bobo38boo12bo10bo$831boo12boo13boo22b3o 46bo180b3o$845boo4boo7boo40bo211bobbo$851boo49boo18boo190bo$898boo3boo 17bobo137bo51bo3bo$903b3o18bo12boo122b3o50bo3bo$887bo15boo19boo11boo 121boobo50bo$886bobo6boo5boo156b3o52bobo$885bo3bo4bobo5bo47bobo107b3o$ 886b3o5bo53bo3bo107b3o$884boo3boobboo19bo21boo10bo12boo98boo$841boo70b 3o12bo7bobbo7bo4bo8boo$840bobboo67b5o10bo3boo7bo7bo$840boobbo66boo3boo 9bo5bo6bo7bo3bo$841boo8boo75b5o7bo9bobo$843boobo3bobo83bobbo125b3o$ 844bobobb3o84boo126bobbo$849boo62b3o151bo$852boo59b3o151bo$851b3o210bo bo$$887boo25boo$851boo34boo25boo408bo$851boo472boo$1012boo310boo$1012b oo$$999boo$999boo$$999bo13bo$998bobo10booboo98b3o$998bobo33boo78bobbo$ 999bo10bo5bo17boo78bo$1062bo51bo3bo$1010booboboo30boo12b3o50bo3bo$996b ooboboo44boo11boobo50bo$996bo5bo57b3o52bobo$997bo3bo13bo44b3o$998b3o 11bobbo44b3o$1015bo45boo$1011boo$1011bo36bo$1011bobo33b3o$1012boo18b5o 10b3o$1031bob3obo27b3o$1001bo30bo3bo8boo3boo12bobbo$1002bo9boo3boo14b 3o9boo3boo15bo$1000b3o9bo5bo15bo32bo$1005bo58bobo$1005bobo5bo3bo30boo$ 1005boo7b3o30bobo$1032bo13boobbo$995b5o32bo14boo$994bob3obo8bo21bobo5b o7boo$995bo3bo7bobo20booboobbobo7bo$996b3o9boo19bo5bobboo$997bo19boo 13bo14bo5bo$1017bo11boo3boo11bo5bo264bo$1018b3o20bo6bo3bo266boo$1020bo 20bobo5b3o266boo$997boo42boo71b3o$997boo115bobbo$1114bo$1062bo51bo3bo$ 1029boo30b3o50bo3bo$1030bo29boobo50bo$1009boo16b3o30b3o52bobo$1009boo 16bo32b3o$1024bo24boo9b3o$1022bobo24boo10boo$1023boo3$1017bo8bo$1017b 3o6bobo8boo26b3o$1020bo5boo9boo25bobbo$1019boo46bo$1067bo$1064bobo$ 1021b3o$1021b3o$1020bo3bo$1019bo5bo$1020bo3bo14bo$1021b3o13bobo$1038b oo4$1036bo$1037boo75b3o$1036boo76bobbo$1019boo93bo$1020bo41bo51bo3bo$ 1017b3o13bo27b3o50bo3bo$1017bo15bobo24boobo50bo$1021boo11bobo23b3o52bo bo$1021boo11bobbo22b3o$1034bobo17bo5b3o$1033bobo3bo12bobo6boo$1033bo5b o13boo$1038b3o$$1052bo$1038b3o9bobo12b3o$1039bo11boo11bobbo$1039bo27bo $1039bo27bo$1039bo24bobo$1038b3o3$1038b3o$1039bo$1039bo4$1069boo$1068b oo$1070bo43b3o$1114bobbo$1114bo$1114bo3bo$1114bo3bo$1050boo62bo$1050b oo63bobo$1089boo$1089boo$$1057boo$1056bobo$1049b3o4boboboo35bo$1057bob obo22boo11b3o$1049bobo7bo5b3o15boo15bo$1048b5o6boo3bobbo11bo5bo13boo$ 1047boo3boo5b3o5bo11b3o$1047boo3boo5b3o5bo14bo$1059b3obbobo14boo465bo$ 1059boo41bo446boo$1049boo8bo42bo445boo$1048booboo4bobobo11boo26bobo$ 1049bobbo3boboboo11boo25booboo$1049bo6bobo35boo3bo5bo$1052bo4boo35boo 6bo$1050boo40b3o4boo3boo$1084bo7boo$1083b3o5bobo$1045boo3boo30b5o11b3o $1046b5o5bo8b3o5b3o5boo3boo9boobo$1047b3o7boo6bobbo3bo3bo5b5o10boo15b 3o$1048bo7boo7bo16b5o11boo14bobbo$1065bo5bo5bo5bobbo12bobo12bo$1066bob obboo3boo5bo3bo11bobboo10bo3bo$1087bo26bo3bo$1084boobo26bo$1071boo13bo 28bobo$1070bobo$1070bo$1070boo11boo3boo8b5o$1051bo22bo8bo5bo7bob3obo$ 1050b3o7boo9bobbo23bo3bo$1050b3o8boo11bo9bo3bo10b3o$1060bo24b3o12bo$ 1048boo3boo$1048boo3boo14booboboo$$1069bo5bo23boo$1053boo44boo$1053bob o14booboo471bo$1055boo15bo13boo17b3o439boo$1054boo30boo19bo438boo$ 1054boo50bo$1050b3o$$1071boo$1071boo$$1050boo3boo$$1051bo3bo58b3o$ 1052b3o59bobbo$1052b3o59bo$1114bo3bo$1114bo3bo$1114bo$1115bobo$1052boo $1052boo10$1087boo$1065boo20boo451bo$1065boo474boo$1135bo404boo$1066bo 68bobo$1065bobo20bo49boo6boo$1060boobbobbo19bobo34boo12boo4bo3bo$1044b oo14boobo22bo3bo33boo12boo3bo5bo8boo$1045bo18boo21b3o45bobo4boobo3bo8b oo$1045bobo8bo28boo3boo43bo7bo5bo$1046boo7boobboo83bo3bo$1054boo90boo$ 1053b3o4boo52b3o19bo$1054boo4boo52bobbo16boo$1028boo15boo8boo29bo27bo 20boo$1028boo15boo9bo6boo21bo27bo3bo$1063boo21bob3o23bo3bo$1114bo$ 1091bo23bobo22boo$1032b3o4bo25bobbo19boboo47boo10bobo$1031bo3bobbobo 24bo22boo51bo8bobbo4bo$1030bo3boo3b3o22bo4bo66boo11boo5boo$1031b3obo5b oo20bobobboo66bobo8boo3bo8boo$1032bo7bobo18boobo18boo3boo49bo9boo10boo $1035bo5bo41boo3boo46bobbo10bobbo$1084b5o7bo42bo11bobo$1061bobbo20bobo 9bo31boo5bobo$1063boo30b3o23bo6bobo5boo$1085b3o31boo7bo$1120boo5boo$$ 1033bo5bo17b3o49boo16boo$1032bobo7bo13bo3bo22bo11bobo10bobo17bo$1032b oo5bob3o11bo5bo20b3o9boo13bo18bobo8boo393bo$1033b3o3boo3bo10booboboo 19bo3bo7b3obo26boo3boo8boo394boo$1034bobobbo3bo5boo32bo9b3o27boo11boo 10bo4bo380boo$1035bo4b3o6bobo28bo5bo8bo29bo9b3o10bo4bobo$1050b3o5bo21b o5bo49boo10bo7boo4boo$1051boo4bobo21bo3bo53boobboo11boo4boo$1048boo7bo bo22b3o54boobbobboo8boo$1028boo18b3o7bo52boo31b4o5bobo$1028boo57boo21b obbo31bo7bo$1058boo28boo21boo$1039bo9boo7boo27bo13bo9bo$1036bobo10boo 48bobo18boo$1035boobo58boo21bobo$1036boo4bo54boo23bo$1039b5o53boo23boo $1038b3obbo49boo4bobo$1037bo3boo42bo6bobo6bo37boo9boo$1038boboo42b3o5b o45boo9bobo$1040boo42b3o4boo40bo6bo7b3o4boob3o$1132bobo12b3o4bobb4o$ 1082boo3boo20boo3boo9boo3boo3bo12b3o4boo$1082boo3boo36boo3boo3bo13bobo $1049boo59bo3bo15boo3bo14boo$1043boo3bobo60b3o18bobo$1043boobb3o35bo 25b3o19bo$1047boo35bobo$1050boo31boo$1049b3o31boo$1083b3o$1084bobo25b oo$1049boo34boo25boo$1049boo11$1528bo$1529boo$1528boo34$1522bo$1523boo $1522boo79$1752bo$1753boo$1752boo29$1750bo$1751boo$1750boo28$1744bo$ 1745boo$1744boo30$1738bo$1739boo$1738boo40$1732bo$1733boo$1732boo34$ 1726bo$1727boo$1726boo79$1956bo$1957boo$1956boo29$1954bo$1955boo$1954b oo28$1948bo$1949boo$1948boo30$1942bo$1943boo$1942boo40$1936bo$1937boo$ 1936boo34$1930bo$1931boo$1930boo79$2160bo$2161boo$2160boo29$2158bo$ 2159boo$2158boo28$2152bo$2153boo$2152boo30$2146bo$2147boo$2146boo40$ 2140bo$2141boo$2140boo34$2134bo$2135boo$2134boo71$2358boo$2358boo33$ 2359boo$2359boo13$2358boo$2358boo20$2356bo$2357boo$2356boo6$2355b3o$ 2357bo$2356bo3$2359boo$2359boo13$2358boo$2358boo4$2350bo$2351boo$2350b oo14$2349b3o$2351bo6boo$2350bo6bobbo$2357bobbo$2358boo9$2359boo$2359b oo12$2344bo$2345boo11boo$2164b3o177boo12boo$2166bo$2165bo7$2356boo$ 2355bobbo$2355bobbo$2356boo9$2358boo$2357bobbo$2357bobbo$2358boo9$ 2359boo$2338bo6b3o11boo$2339boo6bo$2338boo6bo$2162b3o$2164bo$2163bo8$ 2358boo$2358boo10$2357boo$2356bobo$2356boo9$2358boo$2358bobo$2359boo 10$2359boo$2359boo6$2151b3o$2153bo$2152bo$$2341b3o$2343bo$2342bo11$ 2324b3o$2326bo$2325bo11$2307b3o$2309bo$2308bo4$2286bo$2285bobo$2285bob o$2286bo56b3o$2145b3o194bobbo$2147bo197bo$2146bo194bo3bo$2290b3o48bo3b o$2292bo52bo$2291bo50bobo8$2285bo$2284b3o$2284boboo$2285b3o$2285b3o$ 2285b3o$2285boo9$1960b3o325b3o$1962bo325bobbo51b3o$1961bo326bo53bobbo$ 2288bo3bo52bo$2288bo3bo48bo3bo$2288bo52bo3bo$2289bobo53bo$2342bobo8$ 2285bo$2284b3o$2284boboo$2285b3o$2285b3o$2285b3o$2285boo5$2235boo$ 2235bobbo$$2222boo15bo$2222boo64b3o$2237boo49bobbo51b3o$2236bo51bo53bo bbo$2288bo3bo52bo$2141b3o113boo29bo3bo48bo3bo$2143bo89boo3boo17boo29bo 52bo3bo$2142bo90boo3boo49bobo53bo$1958b3o273b5o31boo70bobo$1960bo274bo bo32boo$1959bo262bo$2221b3o11b3o19bo13bo$2220b5o30booboo10bobo$2219boo 3boo44bobo$2220b5o29bo5bo10bo$2220bo3bo$2221bobo30booboboo24bo$2222bo 10bo34booboboo9b3o$2124b3o105bo35bo5bo9boboo$2126bo105b3o20bo13bo3bo 11b3o$2125bo94bo17bo16bobbo11b3o12b3o$2218booboo14b3o15bo29b3o$2227bo 8b5o17boo25boo$2217bo5bo4bo6boo3boo17bo$2226b3o28bobo$2217booboboo33b oo$$2237b3o29bo$2237b3o12boo3boo9bo$2252bo5bo9b3o$2240boo$2107b3o130bo 12bo3bo30b3o$2109bo131b3o10b3o31bobbo51b3o$2108bo134bo44bo53bobbo$ 2220boo49b5o12bo3bo52bo$2220boo48bob3obo11bo3bo48bo3bo$2271bo3bo12bo 52bo3bo$2086bo155bo29b3o14bobo53bo$2085bobo155bo8boo19bo68bobo$2085bob o153b3o9bo$2086bo56b3o86boo16b3o$2142bobbo86boo16bo$2145bo108bo17boo$ 2141bo3bo107bo18boo$2090b3o48bo3bo107b3o$2092bo52bo$2091bo50bobo140bo$ 2240bo43b3o$2240b3o17boo22boboo$2243bo16boo23b3o$2242boo41b3o$2285b3o$ 2257bo27boo$2258bo$2085bo170b3o$2084b3o$2084boboo$2085b3o$2085b3o$ 1947b3o135b3o154boo3boo5bobo$1949bo135boo168boo$1948bo294bo3bo7bo32b3o $2244b3o41bobbo51b3o$2244b3o41bo53bobbo$2288bo3bo52bo$2288bo3bo48bo3bo $2242boo44bo52bo3bo$2243bo28bo16bobo53bo$2240b3o12bo17bo68bobo$2088b3o 149bo11b4o15b3o$2088bobbo51b3o98boo5b4o$2088bo53bobbo98boo5bobbo$2088b o3bo52bo105b4o15bo$2088bo3bo48bo3bo106b4o15bo$2088bo52bo3bo109bo13b3o$ 2089bobo53bo115b3o$2142bobo115bo3bo20bo$2260bo3bo19b3o$2261b3o20boboo$ 2285b3o$2285b3o$2285b3o$2285boo$2261b3o$2085bo174bo3bo$2084b3o173bo3bo $2084boboo173b3o$2085b3o$2085b3o$2085b3o$2085boo$2288b3o6boo$2288bobbo 6bo44b3o$2288bo9bobo8bo32bobbo$2288bo3bo6boo8bobo33bo$2288bo3bo19boo6b oo19bo3bo$2288bo8bo14boo4bo3bo18bo3bo$2289bobo4boo14boo3bo5bo21bo8boo$ 2296bobo10bobo4boobo3bo8boo8bobo9boo$1941b3o144b3o218bo7bo5bo8boo$ 1943bo144bobbo51b3o172bo3bo31bo$1942bo145bo53bobbo174boo31bobo$2088bo 3bo52bo164bo42bobbobboo$2088bo3bo48bo3bo162boo47boboo14boo$2088bo52bo 3bo163boo44boo18bo$2089bobo53bo220boo5bobo$2142bobo160boo57bobbo5boo$ 2305boo56bo$2363bo$2319bo43bo$2312boobo3b4o41bobbo6boo15boo$2306boobb oobobo4b4o5boo35boo6boo15boo$1924b3o378bobobbooboboo3bobbo5boo$1926bo 368boo7b3o8boo3b4o$1925bo159bo209boo6b3o8boo3b4o$2084b3o217b3o12bo32bo bbo$2084boboo217bobo47bo$2085b3o173boo43boo43bo4bo32bo$2085b3o173boo 88boobbobo30bobo$2085b3o268boboo5boo21bobo$2085boo220bo57boo22bo$2288b 3o14bobo75boobo$2288bobbo12bobo17bo18b3o10bobbobboo17boobooboo$2288bo 9boo3bobbo16boo17bobbo10boo21b4obobboo$2288bo3bo5boo4bobo15boo4boobboo 11bo32boobbob4o$1907b3o378bo3bo12bobo13b3o4boobboo7bo3bo32boobooboo$ 1909bo378bo18bo4bobo7boo4boo11bo3bo34boboo$1756b3o149bo380bobo20boo9b oo20bo13boo3boo11bo$1758bo554bo10bo17bobo14boo3boo10bobo$1757bo330b3o 169b5o111bobo$2088bobbo51b3o113bob3obo95b3o13bo$1886bo201bo53bobbo114b o3bo45boo49b3o6boo$1885bobo200bo3bo52bo115b3o45boo51bo7boo$1885bobo 200bo3bo48bo3bo116bo43bo4bo$1886bo56b3o142bo52bo3bo158boo$1942bobbo 143bobo53bo159boo62boobo$1945bo196bobo180bo44bobo18boo$1941bo3bo314bo 57boobo3b4o42bo19boo$1890b3o48bo3bo314bo51boobboobobo4b4o31boo7boo4boo $1892bo52bo313bobo5bo43bobobbooboboo3bobbo5boo24boo7boo4boo$1891bo50bo bo313booboobbobo42b3o8boo3b4o5boo33boo$2257bo5bobboo41b3o8boo3b4o$ 2260bo49b3o12bo$2035boo220boo3boo39boo6bobo66boo$2035boo48bo216bobo7b oo66bo$2084b3o215bo78bobo$2022boo60boboo186bo26boo81bo$2022boo61b3o 187bo100bo4bobbo$1885bo199b3o185b3o7boo5boobboo5boo74bo4bo$1884b3o198b 3o194bobo5bobo3bo5bo72bobo6bo$1884boboo197boo196bo6bo4bo6bobo6boo63boo 3boobo$1885b3o169boo232bo11boo6b3o56boo9booboo$1885b3o169boo233bo20boo bo8bo17b3o24boo9bo3bo$1885b3o134bo290bobbo6bobo16bobbo$1885boo134b3o 46boo185bo7boo46boobo5bobo11boo7bo$2021b3o10b5o18bo12boo184b3o7boo17b 3o23b3o7bobbo11boo3bo3bo23boboo$2033bob3obo16b3o196b5o5bo18bobbo23boo 9bobo16bo3bo23bobo$2019boo3boo8bo3bo16bo3bo194boo3boo22boo6bo31bobo19b o24bo$2019boo3boo9b3o19bo226boobobb3o22bo9bo16bobo25boo$2036bo17bo5bo 11boo14b3o193boobb3oboo19boo55boo$2054bo5bo27bobbo51b3o113boo16bo8b5ob oo20boo54boo$2021boo32bo3bo28bo53bobbo115bo15bobo7b5ob3o$2021bobo32b3o 29bo3bo52bo112bo19bobo7b3o3bobo12boo$1888b3o129bobboo13bo49bo3bo48bo3b o112bobbo16bobbo14bo11boo$1754b3o131bobbo51b3o76boo14bo29boo3boo13bo 52bo3bo111booboo16bobo5bo9boo12bo$1756bo131bo53bobbo76boo7bo5bobo29b5o 15bobo53bo112boo7boo8bobo5bobo$1755bo132bo3bo52bo77bo7bobobbooboo28boo boo68bobo121bobo8bo6bo3bo33boo$1888bo3bo48bo3bo85boobbo5bo17bo9booboo 192bo18b3o34bobbo$1888bo52bo3bo71bo5bo14bo31b3o183boo3boobboo16boo3boo 22bo3b3o7bo6boo$1889bobo53bo71bo5bo11boo3boo214boo3boo48b5o3bo6bo6boo$ 1942bobo73bo3bo4boo30bo197b5o37boo9booboo3bo7bo$2019b3o5boo28bobo198bo bo38boo8b3oboo3bo3bobbo$2058boo250boob4o5boo$2258b3o50b4o$2085bo226bo$ 2084b3o$2040boo10boo3boo14bo10boboo$2036bo3bo31b3o10b3o$1885bo151bo3b 3o9bo3bo7boo4b5o9b3o$1884b3o148b3o5bo10b3o8boo3bobobobo8b3o171boo25boo 28boo$1884boboo132boo32b3o13boo3boo8boo172boo25boo28boo$1885b3o132boo$ 1885b3o172bo282b3o15bo$1885b3o171bo13bo268bobbo14bobo$1885boo165boo5b 3o10bobo270bo12boo3bo14boo$2053bo18bobo266bo3bo7boo3boo3bo13bobo$2032b oo16b3o20bo267bo3bo7boo3boo3bo12b3o4boob3o$2032boo16bo21boo271bo14bobo 12b3o4bobb4o$2072boo268bobo16bo6bo7b3o4boo$2072boo14b3o226bo48boo9bobo $2088bobbo51b3o170b3o48boo9boo$2088bo53bobbo169b5o$2051bo36bo3bo52bo 168boo3boo44bo$1888b3o149bo11bo35bo3bo48bo3bo169b5o44boo$1888bobbo51b 3o94b3o7b3o7boo26bo52bo3bo169bo3bo44bobo$1888bo53bobbo97bo16boo27bobo 53bo170bobo$1888bo3bo52bo96boo98bobo172bo41bobo$1888bo3bo48bo3bo413boo $1888bo52bo3bo414bo12bo7bo$1889bobo53bo102bobo264bo56b4o5bobo$1942bobo 104boo262booboo49boobbobboo8boo$2049bo272bo44boobboo11boo4boo$2312bo5b o4bo40boo10bo7boo4boo$2045bo275b3o39b3o10bo4bobo$2044b3o38bo226boobob oo45boo10bo4bo$2043b5o36b3o271boo7boo$2042boo3boo35boboo269bobo7boo$ 2066bo18b3o269bo$1885bo181bo17b3o268boo$1884b3o159bo18b3o17b3o242bo$ 1884boboo158bo38boo241bobo7boo4b3o3bo5boo$1885b3o441boo6bobo4bo5bo6bo$ 1885b3o154boo20bo273bo5b3o10bobo7bo$1885b3o155bo21bo292boo7b4o$1885boo 153b3o9bo10b3o302b4o7bo$1743b3o294bo9b4o258bo8bo46bobbo6bobo$1745bo 298boo3boboboo256b3o7boo17b3o25b4o4boo3bo9boo$1744bo299boobbobbob3o 254b5o5bobo16boobo24b4o5boo3bo9boo$2049boboboo254bobobobo22boobbo3bo 20bo8boo3bo$2050b4o34b3o218boo3boo22b4o4boo30bobo$2052bo8b3o24bobbo51b 3o194bobo3boo31bo$2061b3o24bo53bobbo195boo25bobo$2062bo18bo6bo3bo52bo 168boo17bo6boo26boo$1888b3o171bo19bo5bo3bo48bo3bo168boo16bobo5b3o6boo 13bo4bo$1888bobbo51b3o116bo17b3o5bo52bo3bo170bo14bo3boo12bobo11boo$ 1888bo53bobbo115bobo25bobo53bo168b3o14bo3boo14bo11bobo$1888bo3bo52bo 196bobo167bo18bo3boo3b3o8boo$1888bo3bo48bo3bo133bo232b5o5boo8bobo5b3o$ 1726b3o159bo52bo3bo115bobo16bo232boo6bobo9bo5bo3bo33boo$1728bo160bobo 53bo116bo15b3o240bo16bo5bo25boboo3b3o$1727bo214bobo117bo257boo17bo3bo 22bobbo3bo5boobo5boo$2062bo248boo3boo22b3o22boobbo4bo4bobbo5boo$2061b 3o248b5o37boo8boo5b4o4boobo$2061b3o24bo223booboo37boo7b3o7bo3b3o$2087b oo223booboo47boo11boo$2087bobo223b3o49boo$2366bo$2097boo$1885bo212bo$ 1884b3o211bobo9bo$1884boboo211boo8boo$1709b3o173b3o220boo11boo191boo 25boo$1711bo173b3o219b3o7bo3b3o190boo25boo$1710bo174b3o220boo5b4o4boob o27boo$1885boo222boobbo4bo4bobbo5boo20boo$2110bobbo3bo5boobo5boo$2114b oboo3b3o30bo$1688bo432boo30bobo$1687bobo413bo49bobbobboo$1687bobo398b 3o11boo53boboo14boo$1688bo56b3o340bobbo10bobobbobo33b3o9boo18bo$1744bo bbo340bo18boo33bobbo19bo7bobo$1747bo340bo3bo15bo36bo17bobo7boo$1743bo 3bo140b3o197bo3bo48bo3bo15boo$1692b3o48bo3bo140bobbo51b3o142bo52bo3bo 15boo$1694bo52bo140bo53bobbo143bobo30bo22bo15boo$1693bo50bobo141bo3bo 52bo163boobboo6b4o17bobo18bobo8boo15boo$1888bo3bo48bo3bo158bobobbob4o 5boobobo3boo34bo8boo15boo$1888bo52bo3bo156bo3bo3boboo5b3obobbobboo$ 1889bobo53bo149boo5bo12bo4boobobo$1942bobo150boo4bo4bo14b4o$2102bo19bo 29bobbo22boo3bo$2102bo3bo48bo22bobb4o$2061boo41bobo44bo4bo23b6o$1687bo 373boo88boobbobo21bobbo3bo$1686b3o467boboo5boo12b3o4boo$1686boboo417b oo56boo13bobo$1687b3o417bobo70boo$1687b3o195bo216boo6bo11bobo31bobbo$ 1687b3o194b3o211boobobbobbobbo10bobbo31boo11boo$1687boo195boboo210boo bboo6bo9boo10boo35bobo$1885b3o174bo44bobo8boo3bo8boo35bo$1885b3o173b3o 43boo11boo5boo56boo$1885b3o172b5o47bo8bobbo4bo54bobo$1885boo172bobobob o44boo10bobo54boo4b3o$2059boo3boo45boo67bo3bobbo$2159boo3boo15b6o$ 2161b3o6boo10b4obbo$2062bo97bo3bo5boo11bo3boo$1690b3o368bobo24b3o70bob o$1690bobbo51b3o312boobo24bobbo51b3o16bo$1690bo53bobbo312b3o25bo53bobb o23boobo$1690bo3bo52bo311bobbo25bo3bo35bo16bo24bobo18boo$1552b3o135bo 3bo48bo3bo140b3o168b3o26bo3bo22boobboo6b4o10bo3bo25bo19boo$1554bo135bo 52bo3bo140bobbo51b3o112bo3bo25bo21bobobbob4o5boobobo9bo3bo15boo7boo$ 1553bo137bobo53bo87boo51bo53bobbo111bo5bo25bobo16bo3bo3boboo5b3obobbo bboo8bo15boo7boo8b3o$1744bobo88boo51bo3bo52bo112bo3bo5bo39bo12bo4boobo bo3boo5bobo25boo11boo$1888bo3bo48bo3bo113b3o7bo37bo4bo14b4o48bo3boo$ 1822boo64bo52bo3bo121b3o27bo10bo19bo50boboo$1822boo65bobo53bo149boo6b oo3bo3bo$1942bobo127boo22boo4bobo5bobo66b3o$2072bo29bo76b3o$2072boo27b oo$1822bo13bo20boo210bo3bobo$1687bo133bobo11b3o17bobbo210boboo3bo6boo 16boo$1686b3o131bo3bo9b5o230b3obobo6bobo17bo$1686boboo131b3o9bobobobo 14bo15boo211bo18bobo10bo$1687b3o129boo3boo7boo3boo30boo185bo45boo9bobo 53boo$1687b3o165boo28bo171bo9bo46boobo7boo43boo4boo$1687b3o167bo26b3o 169bobo8boo31boo12booboo6bobo48boo$1687boo147bo47boboo167booboo6bobo 30boo13boobob3o6bo7boo$1835bobo47b3o166bo5bo22bo17bo12bobobbobbobbobbo 7boo31boboo$1820bo14boboo15boo3boo24b3o169bo26bo30bo4boo6bo40bobo$ 1820bo15b3o15boo3boo24b3o166boo3boo21b3o40bobo42bo$1820bob3o11bobbo15b 5o25boo238boo43boo$1837b3o16bobo311boo$1825bo10bo3bo30bo187b3o14boo34b obo55boo$1822boboo9bo5bo14b3o11b3o186boboo12bobo16boo16boo$1822boo6bo 5bo3bo28b5o187boo11bo6boo3bo7bobo16bo$1690b3o136bo7b3o28boo3boo185boo 12bobbobbobbobobo8bo12boo$1690bobbo51b3o81b3o37b5o184bobo13bo6boobbobo 8boo11boo32b3o$1690bo53bobbo69boo3boo45bo3bo182boobbo6boo6bobo8bo55bo bbo$1690bo3bo52bo69boo3boo46bobo193bobo7boo38bo7bo20bo$1690bo3bo48bo3b o70b5o7bo29bo10bo16b3o175bo48b4o5bobo14bo3bo$1690bo52bo3bo71bobo9bo29b o26bobbo51b3o119boo16booboboo20boobbobboo8boo4boo6bo3bo$1691bobo53bo 81b3o27b3o26bo53bobbo137bo5bo20boobboo11boo4boo10bo$1744bobo72b3o33bo 17bo14bo3bo52bo138bo3bo10boo6boo10bo7boo13bobo$1854b3o14booboo12bo3bo 48bo3bo111b5o23b3o11boo5b3o10bo4bobo$1840boo11b5o8bo21bo52bo3bo110bob 3obo44boo10bo4bo$1840bo11boo3boo6bo4bo5bo12bobo53bo111bo3bo48boo$1550b 3o288b3o21b3o74bobo113b3o49boo$1552bo290bo26booboboo182bo$1551bo268boo $1820boo32b3o$1687bo166b3o$1686b3o370boo25boo28boo$1686boboo162boo205b oo25boo28boo$1687b3o163bo$1687b3o142boo11bo4b3o32bo276boo$1687b3o142b oo12bo3bo33b3o275bobbo$1687boo155b3o25boo10boboo266b5o7bo9bobo$1872boo 11b3o265bo5bo6bo7bo3bo$1885b3o229bo35bo3boo7bo7bo12boo$1533b3o315bo33b 3o228b3o35bo7bobbo7bo4bo8boo$1535bo314bo34boo229b3o43boo10bo$1534bo 305bo9b3o321bo3bo$1840b3o17boo252boo3boo44bobo8bobo$1843bo16boo252boo 3boo44boo$1842boo322bo$1690b3o$1690bobbo51b3o368boo25b3o$1690bo53bobbo 368bobo23bobbo$1690bo3bo52bo97bo269bobboo25bo$1690bo3bo48bo3bo97bo14bo 27b3o226boo22bo3bo$1690bo52bo3bo96bobo14bo26bobbo51b3o171boo22bo3bo25b o10bo$1691bobo53bo95booboo11b3o26bo53bobbo172bo26bo24boo9boo$1516b3o 225bobo95bo5bo39bo3bo52bo196bobo20bo4bobo7boo4boo$1518bo326bo42bo3bo 48bo3bo166bo5bo44bobo13b3o4boobboo$1517bo324boo3boo39bo52bo3bo166bo5bo 43bobo15boo4boobboo$1889bobo53bo167bo3bo6bo36bobbo16boo$1857bobo82bobo 169b3o5bobo37bobo17bo$1858boo263boo25bobo5boo3bobo$1495bo362bo268bo22b oo5bobo5bo$1494bobo629bobbo21bo5bo$1494bobo190bo154boo281bo3bo26boo$ 1495bo56b3o131b3o154bo280b3o$1551bobbo131boboo150b3o10boo268boobobobo 7boo16boo$1554bo132b3o150bo12boo268booboo9bobo17bo$1550bo3bo132b3o154b oo3bo6boo17bo9bo239bo12bo18bobo10bo$1499b3o48bo3bo132b3o154bobo3bo5b3o 17bo7b3o225bo45boo9b4o$1501bo52bo132boo156b5o6boo16b3o7boboo222booboo 7boo31bo12boob4o5boo$1500bo50bobo292b3o4boo30b3o235boo29boo11b3oboo3bo 3bobbo$1853boo30b3o221bo5bo6bo31bobo11booboo3bo7bo6boo$1873bo11b3o281b 5o3bo6bo6boo$1862bo11bo10boo222booboboo23bo30bo3b3o7bo$1861b3o8b3o262b obo40bobbo$1860booboo273boo40boo$1859b3ob3o249boo$1859b3ob3o248bobo14b oo35bo$1494bo195b3o166b3ob3o249bo13bobbo16boo15boo$1493b3o194bobbo51b 3o111b3ob3o248boo12bo7b6o7bobo14b3o$1493boboo193bo53bobbo112booboo249b 3o11bo6bo6bo8bo12b3o$1494b3o193bo3bo52bo113b3o251boo11bo7boo4bo8boo11b oo$1494b3o193bo3bo48bo3bo114bo25b3o222bo8boo5bobbo7boo$1494b3o193bo52b o3bo140bobbo51b3o175bobo7boo37boo9bo$1494boo195bobo53bo140bo53bobbo 175bo47b4o7bobo$1744bobo141bo3bo52bo174boo16boo3boo19bobobbobb3o5boobo 4boo$1888bo3bo48bo3bo168bo23bo5bo18bobbobboo9booboo3boo$1888bo52bo3bo 167b3o38boo6boo9bo6boobo$1889bobo5boo46bo166b5o22bo3bo10boo4boo3bo8bo 5bobo$1898bo43bobo166boo3boo22b3o19boo10bo6bo$1894bo3bobo7bobo201b5o 46bobbo$1893boo4boo6bobbo201bo3bo47bobo$1893bobo10boo10bo6bo187bobo$ 1497b3o187bo216boo3bo8bo5bobo187bo$1497bobbo51b3o131b3o217boo9bo6boobo 26boo$1497bo53bobbo131boboo217bobbobboo9booboo3boo20boo$1497bo3bo52bo 132b3o218bobobbobb3o5boobo4boo180boo25boo$1497bo3bo48bo3bo132b3o223b4o 7bobo27bo159boo25boo$1497bo52bo3bo132b3o224boo9bo27bobo$1498bobo53bo 132boo264bobbobboo$1551bobo403boboo14boo$1955boo18bo$1964bo8bobo$1960b oobboo7boo$1965boo$1909bo49boo4b3o$1908boo10boo37boo4boo23boo$1908bobo 9boo42boo8boo13bobbo$1494bo195b3o210boo12boo6bo3boo33bo9boo14bobo$ 1493b3o194bobbo51b3o153bo3bo10b3o5bo3bobo55bo4bo$1493boboo193bo53bobbo 147boo3bo5bo10boo6b5o55b3o$1494b3o193bo3bo52bo147boobboobo3bo13boo4b3o 55bo$1494b3o193bo3bo48bo3bo140b3o9bo5bo13boo30bobbo29boo$1494b3o193bo 52bo3bo140bobbo9bo3bo37b3o9bo$1494boo195bobo53bo113boo25bo14boo37bobbo 5bo4bo20bo$1744bobo114boo25bo3bo52bo5boobbobo18bobo$1888bo3bo48bo3bo 10boboo16bobo$1888bo19bo32bo3bo31bo$1889bobo11bo4b4o33bo37bo$1903bo5b 4o7bo21bobo11bobbo22boo$1862bo35boo9bobbo6bobo34boo24bobo$1860booboo 33boo9b4o4boo3bo9boo48bobo$1908b4o5boo3bo9boo49boo$1497b3o187bo171bo5b o42bo8boo3bo60bo$1497bobbo51b3o131b3o230bobo39b3o25bo$1497bo53bobbo 131boboo169booboboo54bo39bo3bo23bobo$1497bo3bo52bo132b3o269bo5bo22bobo $1497bo3bo48bo3bo132b3o218boo49booboboo23bo$1497bo52bo3bo132b3o170bo 47boo60boo$1498bobo53bo132boo171bobbo106boo$1551bobo306bo101bo18boo$ 1863boo96bobo17bo$1864bo50bo45bobo5boobo$1862bobo38bo10boo10boo34bo7bo bo18boo$1862boo37boo11bobo9boo4b3o36bo7b3o9boo$1902boo5boo12boo6b5o25b oo7boo7bobo$1907bo3bo10b3o5bo3bobo24boo7boo3b5oboo$1857boo3boo42bo5bo 10boo6bo3boo33boo5b3oboo$1494bo195b3o164bo5bo41bobbo3bo13boo49b3o$ 1493b3o194bobbo51b3o122bo41bo13boo50boo$1493boboo193bo53bobbo110bo3bo 5bobo32bo3bo3bo$1494b3o193bo3bo52bo111b3o7boo31boboo3boo$1494b3o193bo 3bo48bo3bo140b3o11bo$1494b3o193bo52bo3bo140bobbo9boo40b3o$1494boo195bo bo53bo140bo53bobbo$1744bobo136bo4bo3bo8boo42bo35bo$1877bo4bobo3bo3bo9b o38bo3bo32boboo$1856b3o19bo4bo4bo13bobo8boo26bo3bo33boo$1348b3o505b3o 9boo6b3o10bobo11boo7bobo30bo24boo$1350bo504bo3bo9boo40b3o12bo15bobo25b oo4boo$1349bo504bo5bo7bo41b3o8boo3b4o46boo$1855bo3bo51b3o8boo3b4o5boo$ 1856b3o53bobobbooboboo3bobbo5boo31boboo$1497b3o187bo225boobboobobo4b4o 38bobo$1497bobbo51b3o131b3o230boobo3b4o40bo$1497bo53bobbo131boboo171bo 64bo43boo$1497bo3bo52bo132b3o171boo43boo62boo$1497bo3bo48bo3bo132b3o 170bobo13bo28boo63boo$1497bo52bo3bo82boo48b3o183b4o17boo11bo4bo$1498bo bo53bo82boo48boo183b4o6bo11bobo13boo$1551bobo318bobbo6bo13bo14boo$ 1331b3o290boo246b4o20boo$1333bo290boo241boo4b4o$1332bo533bobo7bo37bo 10bo$1624bo13bo220bo6bo46boo9boo$1623bobo10booboo217b3o4boo41bo4bobo7b oo4boobboo$1623bobo33boo196b5o21boo3boo16bobo13b3o4boobboo$1624bo10bo 5bo17boo195bobobobo21b5o10boo4bobo15boo4boo$1494bo195b3o163boo3boo21b ooboo10boo3bobbo16boo$1493b3o139booboboo30boo16bobbo51b3o136booboo16bo bo17bo$1493boboo124booboboo44boo16bo53bobbo137b3o18bobo$1494b3o124bo5b o62bo3bo52bo111bo48bo$1494b3o125bo3bo13bo49bo3bo48bo3bo110bobo$1494b3o 126b3o11bobbo49bo52bo3bo110bobo82b3o$1314b3o177boo144bo50bobo53bo111bo 82bobbo$1316bo319boo106bobo112boo84bo$1315bo320bo36bo185boo25boo28boo 23bo3bo$1636bobo33b3o184boo25boo28boo23bo3bo$1637boo18b5o10b3o270bo$ 1656bob3obo279bobo19bo$1293bo332bo30bo3bo8boo3boo287bobo$1292bobo332bo 9boo3boo14b3o9boo3boo240bo49boo6boo$1292bobo330b3o9bo5bo15bo256bobo34b oo12boo4bo3bo$1293bo56b3o144b3o187bo227bo3bo33boo12boo3bo5bo8boo$1349b obbo144bobbo51b3o83bo3bo30boo11b3o227b3o45bobo4boobo3bo8boo$1352bo144b o53bobbo84b3o30bobo11boboo224boo3boo43bo7bo5bo$1348bo3bo144bo3bo52bo 102bo13boobbo11b3o283bo3bo$1297b3o48bo3bo144bo3bo48bo3bo65b5o32bo14boo 13b3o285boo$1299bo52bo144bo52bo3bo64bob3obo30bobo5bo7boo13b3o$1298bo 50bobo146bobo53bo65bo3bo30booboobbobo7bo14boo274boo$1551bobo67b3o30bo 5bobboo250bo47boo$1622bo19boo13bo14bo5bo236bo$1642bo11boo3boo11bo5bo 236bob3o$1643b3o21boo4bo3bo$1645bo21boo5b3o243bo48boo$1622boo17bo275bo boo47boo10bobo$1622boo18bo274boo37bobo11bo8bobbo4bo$1292bo347b3o313boo 7boo11boo5boo$1291b3o200bo195b3o264bo7bobo8boo3bo8boo$1291boboo198b3o 158boo34bobbo51b3o164boo3boo49bo9boo10boo$1292b3o198boboo158bo3bo30bo 53bobbo164boo3boo46bobbo10bobbo$1292b3o199b3o137boo16b3o3bo31bo3bo52bo 165b5o7bo42bo11bobo$1292b3o199b3o137boo16bo5b3o29bo3bo48bo3bo166bobo9b o31boo5bobo$1292boo200b3o177boo14bo52bo3bo176b3o16b3o11bobo5boo$1494b oo178boo15bobo53bo166b3o25bobbo11bo$1744bobo198bo10boo$1941bo3bo$1938b obbo3bo10boo$1642bo269bo24bobo5bo11bo$1642b3o17boo247b3o10bo8bo4bo3bob o12bobo8boo$1645bo10bo5boo246bo3bo9boo5bobo24boo8boo$1644boo11bo254bo 10bobo6boo31boo10bo4bo$1295b3o357b3o251bo5bo48b3o10bo4bobo$1295bobbo 51b3o144b3o187bo221bo5bo49boo10bo7boo4boo$1295bo53bobbo144bobbo51b3o 91b3o37b3o221bo3bo53boobboo11boo4boo$1295bo3bo52bo144bo53bobbo91b3o37b oboo221b3o54boobbobboo8boo$1295bo3bo48bo3bo144bo3bo52bo90bo3bo37b3o 283b4o5bobo$1295bo52bo3bo144bo3bo48bo3bo89bo5bobbobo31b3o226boo43bo12b o7bo$1296bobo53bo144bo52bo3bo90bo3bo4boo31b3o227boo41boo$1349bobo146bo bo53bo91b3o5bo32boo227bo13bo29bobo$1551bobo374bobo18boo$1926boo21bobo 13bobo$1926boo23bo13boo$1926boo23boo13bo$1922boo4bobo$1671bo242bo6bobo 6bo37boo9boo$1672bo240b3o5bo45boo9bobo$1292bo351boo24b3o240b3o4boo40bo 6bo7b3o4boob3o$1291b3o200bo150bo44b3o268bobo12b3o4bobb4o$1291boboo198b 3o146b3o13bo31bobbo51b3o163boo3boo20boo3boo9boo3boo3bo12b3o4boo$1292b 3o198boboo145bo15bobo8bo20bo53bobbo163boo3boo36boo3boo3bo13bobo$1292b 3o199b3o149boo11bobo8bo19bo3bo52bo191bo3bo15boo3bo14boo$1292b3o199b3o 149boo11bobbo5b3o19bo3bo48bo3bo192b3o18bobo$1292boo200b3o162bobo28bo 52bo3bo166bo25b3o19bo$1494boo162bobo3bo26bobo53bo165bobo$1658bo5bo79bo bo165boo$1663b3o246boo$1912b3o$1913bobo25boo$1663b3o248boo25boo$1664bo 21bo$1664bo22bo$1295b3o366bo20b3o$1295bobbo51b3o144b3o164bo$1295bo53bo bbo144bobbo51b3o108b3o$1295bo3bo52bo144bo53bobbo132bo$1295bo3bo48bo3bo 144bo3bo52bo131boo$1295bo52bo3bo144bo3bo48bo3bo108b3o17boo3bo$1296bobo 53bo144bo52bo3bo109bo19b3o$1349bobo146bobo53bo109bo$1551bobo$$1699boo$ 1700bo$1700bobo5bo$1701boo4bobo$1705boo3bo14boo$1292bo412boo3bo13bobo$ 1291b3o200bo195b3o12boo3bo12b3o4boo24boo$1291boboo198b3o194bobbo13bobo 12b3o4bobb4o9b3o8boo$1292b3o198boboo193bo11bo5bo6bo7b3o4boob3o8bobbo$ 1292b3o199b3o193bo3bo6boo10boo9bobo20bo8bo$1292b3o199b3o193bo3bo6bobo 10boo9boo16bo3bo7bobo$1292boo200b3o193bo52bo3bo7bobbobboo$1494boo195bo bo53bo11boboo14boo$1744bobo10boo18bo$1766bobo6bobo$1707boo57bobbo5boo$ 1707boo60boo$1767bo3boo$1720bo48boo$1718bobo45bobbo6boo15boo$1295b3o 408boo9bobo11boo26boo5bobo7boo15boo$1295bobbo51b3o144b3o206b3o7bobbo 11boo26bobo$1295bo53bobbo144bobbo51b3o142boo9boobo5bobo39bo$1295bo3bo 52bo144bo53bobbo142bo5bo4bobbo6bobo$1295bo3bo48bo3bo144bo3bo52bo147bo 5boobo8bo33bobbo$1295bo52bo3bo144bo3bo48bo3bo143bo3bo3b3o48bo$1296bobo 53bo144bo52bo3bo108boo35bo5boo45bo4bo32bo$1349bobo146bobo53bo108boo88b oobbobo30bobo$1551bobo204boboo28bobo$1713bo77bo$1664bo47b4o69boobo$ 1663b3o45boob4o5boo33bobbo21boobooboo$1662bo3bo33boo8b3oboo3bo3bobbo 31boo21b4obobboo$1664bo35boo9booboo3bo7bo6boo44boobbob4o$1661bo5bo44b 5o3bo6bo6boo27b3o14boobooboo$1292bo368bo5bo45bo3b3o7bo34booboo15boboo$ 1291b3o200bo167bo3bo23b3o30bobbo35booboo12bo$1291boboo198b3o167b3o24bo bbo29boo20b3o14b5o11bobo$1292b3o198boboo193bo53bobbo13boo3boo10bobo$ 1292b3o199b3o193bo3bo16bo35bo31bo$1292b3o199b3o193bo3bo14boo32bo3bo24b oo$1292boo200b3o193bo19boo31bo3bo24boo$1494boo170bo24bobo53bo$1715boo 27bobo18boo$1714boo55boobo$1666bo49bo9bo45bobo18boo$1664bobo57bobo46bo 19boo$1665boo45boo9bobo37boo7boo4boo$1712b3o7bobbo11boo24boo7boo4boo$ 1714boobo5bobo11boo33boo$1295b3o416bobbo6bobo$1295bobbo51b3o144b3o159b oo3boo48boobo8bo$1295bo53bobbo144bobbo51b3o118bo31boo5b3o67boo$1295bo 3bo52bo144bo53bobbo105bo3bo9bo29bobo5boo68bo$1295bo3bo48bo3bo144bo3bo 52bo106b3o8b3o21bo7bo78bobo$1295bo52bo3bo144bo3bo48bo3bo106b3o30boo7b oo81bo$1296bobo53bo144bo52bo3bo140boo81bo4bobbo$1349bobo146bobo53bo 104bo11bo13boo16boo74bo4bo$1551bobo104bobo11bo11bobo17bo72bobo6bo$ 1444boo212bobo10bo13bo13boo3bobo6bobo62boo3boobo$1444boo213bo38boo5boo 4bo3bo56boo9booboo$1700bo10bo19bo40boo9bo3bo$1431boo277bo4bo14b4o$ 1431boo12bo210boo3boo48bo12bo4boobobo3boo$1444b3o209bo5bo48bo3bo3boboo 5b3obobbobboo31boboo$1292bo150bo3bo265bobobbob4o5boobobo36bobo$1291b3o 151bo48bo162bo3bobboo21boo29boobboo6b4o38bo$1291boboo134boo11bo5bo17b oo25b3o162b3o4boo18boobbo41bo13b3o24boo$1292b3o147bo5bo17boo25boboo 167bo20booboo54bobbo24boo$1292b3o148bo3bo46b3o178bo10b3o58bo24boo$ 1292b3o149b3o32boo13b3o176b4o19boo45bo3bo$1292boo185boo13b3o175boboboo 18bobo44bo3bo$1428boo3boo59boo175bobbob3o19bo48bo$1429b5o237booboboo 20boo44bobo$1429booboo227bo7b3ob4o37boo$1429booboo9bo22bo13bo178booboo 4bobo4bo37boo10bobo$1430b3o32b3o11bobo186bo46bo8bobbo$1464b5o9bo3bo 175bo5bobboo41boo11boo10boo$1443bo19bobobobo9b3o206bo21bobo8boo3bo8boo $1443bobo17boo3boo7boo3boo174booboboo22b3o11boobboo6bo9boo5boo$1295b3o 145boo241b5o10boobobbobbobbo10bobbo4bo$1295bobbo51b3o144b3o185boo3boo 13boo6bo11bobo$1295bo53bobbo113bo30bobbo51b3o131b5o19bobo$1295bo3bo52b o112bobo29bo53bobbo131bo3bo19boo$1295bo3bo48bo3bo76bo14boo3boo13boobo 14bo14bo3bo52bo132bobo$1295bo52bo3bo75b3o33b3o15bo14bo3bo48bo3bo133bo$ 1296bobo53bo74b5o4boo7bo3bo13bobbo11b3obo14bo52bo3bo$1349bobo74bobobob o3boo8b3o14b3o32bobo53bo$1426boo3boo13b3o13bo3bo10bo73bobo107boo25boo 28boo$1461bo5bo9boobo180boo25boo28boo$1442bo19bo3bo5bo6boo$1429bo13bo 19b3o7bo245bo47bo$1428bobo10b3o5boo20b3o244bobo45boo$1428bobo18bo29boo 3boo232bobo44boo11boo$1429bo20b3o26boo3boo233bo35boo7b3o7bo3b3o$1292bo 136boo21bo19bo7b5o270boo8boo5b4o4boobo5boo$1291b3o135boo40bo9bobo10bo 271boobbo4bo4bobbo5boo$1291boboo134boo40b3o19b3o220booboboo22b3o19bobb o3bo5boobo$1292b3o186b3o9boboo219bo5bo21bobbo23boboo3b3o$1292b3o199b3o 220bo3bo25bo30boo$1292b3o166boo31b3o221b3o22bo3bo$1292boo168bo31b3o 246bo3bo$1441boo16b3o32boo251bo16bobo$1441boo16bo284bobo17boo$1481boo 282bo4bo$1457bo23boo286boo$1458bo310bobo$1456b3o262bo58bo$1722bo56bobo $1449bo270b3o45bo8boo3bo$1295b3o151b3o5bo11boo297b4o5boo3bo9boo$1295bo bbo51b3o99bo3bo12boo26b3o269b4o4boo3bo9boo$1295bo53bobbo98boo3b3o38bo bbo51b3o214bobbo6bobo$1295bo3bo52bo144bo53bobbo214b4o7bo$1295bo3bo48bo 3bo102bo41bo3bo52bo160b5o40boo6b4o$1295bo52bo3bo102bo41bo3bo48bo3bo 159bob3obo8bo29bobo6bo$1296bobo53bo101bo42bo52bo3bo160bo3bo7bobo29bo$ 1349bobo146bobo53bo161b3o9boo19bobo6boo$1551bobo163bo31boo$1451boo3boo 256bo25boo8bo7boo$1451bo5bo14bo240bobo23bobo12bo4bo$1473bo239bobo24bo 12boo4bobo6bo$1452bo3bo14b3o240bo38bobo4boo4bobo$1453b3o309bobo17bo$ 1764bobbo16boo$1292bo418boo3boo47bobo15boo4boobboo$1291b3o200bo216boo 3boo48bobo13b3o4boobboo$1291boboo174bobo21b3o216b5o3bo21bo25bo4bobo7b oo4boo$1292b3o156boo17boo21boboo216bobo4boo19b3o29boo9boo$1292b3o157bo 17bo23b3o222bobo19boobo29bo10bo$1292b3o154b3o12boo28b3o216b3o24boobboo $1292boo155bo13bobo28b3o234bo9b4o$1453boo7bo6boo23boo235boo8b3o7boo$ 1453boo7bobbo3bobo255boo3boo17bobo$1462bo6bobo260b3o18bo$1463bobo21bo 228bo15boo19boo14bo$1464boo22bo226bobo6boo5boo35boo$1486b3o225bo3bo4bo bo5bo36bobo8bobo$1471bo243b3o5bo53bo3bo$1471bo241boo3boobboo19bo21boo 10bo12boo$1295b3o172bobo12bo256b3o12bo7bobbo7bo4bo8boo$1295bobbo51b3o 118bo14bo10b3o241b5o10bo3boo7bo7bo$1295bo53bobbo118bo12b3o10bobbo239b oo3boo9bo5bo6bo7bo3bo$1295bo3bo52bo118bo25bo259b5o7bo9bobo$1295bo3bo 48bo3bo118bo25bo3bo263bobbo$1295bo52bo3bo117bobo24bo3bo263boo$1296bobo 53bo118bo25bo244b3o$1349bobo119bo26bobo241b3o3$1716boo25boo$1716boo25b oo$1500bo$1499boo5boo$1499bobo5bo$1292bo214bobo6boo$1291b3o214boo6bobb o$1291boboo225bo9bobo$1292b3o218bo6bo7bo3bo$1292b3o216boo7bo7bo34boo$ 1292b3o221bobbo7bo4bo8boo20boo$1292boo222boo10bo12boo$1528bo3bo30bo$ 1519bobo8bobo29bobo$1519boo41bobbobboo$1520bo45boboo14boo$1564boo18bo$ 1515bo61bo4bobo$1514boo60bobo3boo$1514bobo58bo3boo$1295b3o277bo3boo$ 1295bobbo51b3o144b3o27boo46bo3boo$1295bo53bobbo144bobbo26bobo22b3o21bo bo4boo15boo$1295bo3bo52bo144bo19bo4boo6bo7boo11bobbo22bo5boo15boo$ 1295bo3bo48bo3bo144bo3bo14bobobbobbobbobbo7boo14bo$1295bo52bo3bo144bo 3bobboo10boobob3o6bo19bo3bo$1296bobo53bo144bo6boo10booboo6bobo20bo3bo$ 1349bobo146bobo15boobo7boo25bo6bobbo22boo3bo$1516bobo32bobo10bo22bobb 4o$1470boo45bo42bo4bo23b6o$1470bobbo86boobbobo21bobbo3bo$1565boboo19b 3o4boo$1474bo43boo69bobo$1518boo69boo$1472boo41boo10bo4bo32bobbobbo$ 1292bo178bo35boo5b3o10bo4bobo30boo3bobo5boo$1291b3o213boo6boo10bo7boo 4boo26bo3bo4bobo$1291boboo223boobboo11boo4boo26b5o4bo$1292b3o173boo3b oo43boobbobboo8boo31boo3boo19boo$1292b3o173boo3boo48b4o5bobo34b5o19bob o$1292b3o174b5o50bo7bo37b3o15boo4b3o$1292boo176bobo98bo17bo3bobbo$ 1517boo71b6o$1470b3o44boo60boo10b4obbo$1521bo57boo11bo3boo$1520boo$ 1520bobo$1578boobo$1533boo44bobo18boo$1474bo58bobo44bo19boo$1295b3o 177bo47bo4boo6bo33boo7boo$1295bobbo51b3o120b3o21b3o9bo12bobobbobbobbo bbo7boo24boo7boo8b3o$1295bo53bobbo116bo27bobbo6boo13boobob3o6bo7boo6b 3o24boo11boo$1295bo3bo52bo115b3o26bo10boo12booboo6bobo15bobbo33bo3boo$ 1295bo3bo48bo3bo114b5o25bo3bo20boobo7boo19bo33boboo$1295bo52bo3bo113b oo3boo24bo3bo10boo8bobo25bo3bo$1296bobo53bo144bo13bobo9bo26bo3bo33b3o$ 1349bobo130bo15bobo10bo42bo33b3o$1470bo9bobo27boo39bobo$1470bo9bobo$ 1479bobo10boo16boo$1466bo14boo8bobo17bo$1465bo14bo11bo18bobo5boo$1466b o45boo3bo3bo57boo$1489bo26bo5bo13boo41boo4boo$1292bo197bo24boobo3bo13b oo47boo$1291b3o194b3o25bo5bo10boo6bo3boo$1291boboo178bo43bo3bo10b3o5bo 3bobo31boboo$1292b3o168boo3boo3boo37boo5boo12boo6b5o32bobo$1292b3o177b obo36boo11bobo9boo4b3o34bo$1292b3o169bo3bo44bo10boo10boo41boo$1292boo 171b3o57bo53boo$1465b3o15boo94boo$1483boo18boo$1486boo15bobo$1468bo17b 3o16bo12boo$1242boo223b3o16boo17boo11boo$1242bobbo220bo3bo5boo5boo$ 1468bo6bobo5boo10bo34bo$1229boo15bo218bo5bo3bo18b3o32bobo$1229boo64b3o 167bo5bobboo18b3o21bo8boo3bo9boo$1244boo49bobbo51b3o113bo3bo47b4o5boo 3bo9boo$1243bo51bo53bobbo114b3o22boo3boo9boo9b4o4boo3bo19b3o$1295bo3bo 52bo139boo3boo9boo9bobbo6bobo19bobbo$1264boo29bo3bo48bo3bo160bo5b4o7bo 23bo$1240boo3boo17boo29bo52bo3bo160bo4b4o28bo3bo$1240boo3boo49bobo53bo 142bo22bo31bo3bo$1241b5o31boo70bobo142bobo57bo$1242bobo32boo214boo56bo bo$1229bo263boo$1228b3o11b3o19bo13bo214b3o$1227b5o30booboo10bobo188boo 24bobo28boo$1226boo3boo44bobo188boo25boo28boo$1227b5o29bo5bo10bo$1227b o3bo340bobo$1228bobo30booboboo24bo278bobbo$1229bo10bo34booboboo9b3o 233boo41boo10bo6bo$1239bo35bo5bo9boboo267boo4boo3bo8bo5bobo$1239b3o20b o13bo3bo11b3o267boo6boo9bo6boobo4boo$1227bo17bo16bobbo11b3o12b3o276bo bbobboo9booboo3boo$1225booboo14b3o15bo29b3o277bobobbobb3o5boobo$1234bo 8b5o17boo25boo229boo3boo47b4o7bobo$1224bo5bo4bo6boo3boo17bo257b5o49boo 9bo$1233b3o28bobo257booboo$1224booboboo33boo258booboo43boo$1525b3o44b 3o$1244b3o29bo297b3o$1244b3o12boo3boo9bo298boo$1259bo5bo9b3o298bo$ 1247boo$1247bo12bo3bo30b3o290boo$1248b3o10b3o31bobbo289bobbo$1250bo44b o234bo21b3o23bo3b3o7bo$1227boo49b5o12bo3bo224bo3bobo20bobbo22b5o3bo6bo 6boo$1227boo48bob3obo11bo3bo223b3o3boo23bo7bobo11booboo3bo7bo6boo$ 1278bo3bo12bo226b5o23bo3bo7boo11b3oboo3bo3bobbo$1249bo29b3o14bobo222bo bobobo22bo3bo8bo12boob4o5boo$1250bo8boo19bo240boo3boo26bo12boo8b4o$ 1248b3o9bo290bobo12bobo9bo$1239boo16b3o277bo28bo$1239boo16bo277boboo 26boo$1261bo17boo255b3o$1260bo18boo254bobo9boo16boo$1260b3o273boo8bobo 17bo$1536boo9bo18bobo6boo$1292bo274b3o5bobo$1247bo43b3o275b3o6bo11bobo $1247b3o17boo22boboo250bo23bobbobbobbo10bobbo$1250bo16boo23b3o248bobo 24boo6bo9boo10boo$1249boo41b3o233boo14boo21bo7bobo8boo3bo8boo$1292b3o 234boo35boo7boo11boo5boo$1264bo27boo225b5o4bo37bobo11bo8bobbo4bo$1265b o252bob3obo53boo10bobo$1263b3o253bo3bo55boo$1520b3o15bobo$1521bo16bobb o16boo$1522boo17boo15bobo$1522bobo14bo3boo15bo12boo$1249boo3boo5bobo 258bobo16boo17boo11boo$1262boo259bo7boo5bobbo8bo$1250bo3bo7bo32b3o232b obo5bobo9bo34boo$1251b3o41bobbo51b3o177bo18bobo31bo3bo$1251b3o41bo53bo bbo167booboboobboo17booboo21bo7bo5bo8boo$1295bo3bo52bo167bo5bo20bo5bo 20bobo4boobo3bo8boo$1295bo3bo48bo3bo168bo3bo24bo12boo12boo3bo5bo$1249b oo44bo52bo3bo169b3o22boo3boo9boo12boo4bo3bo$1250bo28bo16bobo53bo224boo 6boo$1247b3o12bo17bo68bobo222bobo$1247bo11b4o15b3o268bo24bo$1251boo5b 4o287bo$1251boo5bobbo286bo$1258b4o15bo$1259b4o15bo$1262bo13b3o244boo 25boo$1268b3o252boo25boo$1267bo3bo20bo$1267bo3bo19b3o$1268b3o20boboo$ 1292b3o$1292b3o$1292b3o$1292boo$1268b3o$1267bo3bo$1267bo3bo$1268b3o5$ 1295b3o6boo$1295bobbo6bo44b3o$1295bo9bobo8bo32bobbo$1295bo3bo6boo8bobo 33bo$1295bo3bo19boo6boo19bo3bo$1295bo8bo14boo4bo3bo18bo3bo$1296bobo4b oo14boo3bo5bo21bo8boo$1303bobo10bobo4boobo3bo8boo8bobo9boo$1316bo7bo5b o8boo$1325bo3bo31bo$1327boo31bobo$1317bo42bobbobboo$1315boo47boboo14b oo$1316boo44boo18bo$1373boo5bobo$1312boo57bobbo5boo$1312boo56bo$1370bo $1326bo43bo26boo$1319boobo3b4o41bobbo6boo13bobbo$1313boobboobobo4b4o5b oo25boo8boo6boo14bobo$1312bobobbooboboo3bobbo5boo25boo28bo4bo$1302boo 7b3o8boo3b4o61b3o$1302boo6b3o8boo3b4o61bo$1311b3o12bo32bobbo29boo$ 1312bobo47bo$1268boo43boo43bo4bo20bo$1268boo88boobbobo18bobo$1363boboo 16bobo$1314bo69bo$1295b3o14bobo75bo$1295bobbo12bobo17bo18b3o10bobbobb oo18boo$1295bo9boo3bobbo16boo17bobbo10boo24bobo$1295bo3bo5boo4bobo15b oo4boobboo11bo36bobo$1295bo3bo12bobo13b3o4boobboo7bo3bo37boo$1295bo18b o4bobo7boo4boo11bo3bo37bo$1296bobo20boo9boo20bo13boo3boo23bo$1320bo10b o17bobo14boo3boo22bobo$1267b5o123bobo$1266bob3obo95b3o25bo$1267bo3bo 45boo49b3o6boo$1268b3o45boo51bo7boo$1269bo43bo4bo69boo$1311boo75bo$ 1312boo62boobo$1332bo44bobo18boo$1267bo57boobo3b4o42bo7b3o9boo$1267bo 51boobboobobo4b4o31boo7boo7bobo$1266bobo5bo43bobobbooboboo3bobbo5boo 24boo7boo3b5oboo$1265booboobbobo42b3o8boo3b4o5boo33boo5b3oboo$1264bo5b obboo41b3o8boo3b4o48b3o$1267bo49b3o12bo52boo$1264boo3boo39boo6bobo$ 1309bobo7boo$1309bo$1281bo26boo$1282bo$1280b3o7boo5boobboo5boo78bo$ 1289bobo5bobo3bo5bo75boboo$1290bo6bo4bo6bobo6boo66boo$1298bo11boo6b3o 56boo$1299bo20boobo8bo17b3o24boo4boo$1320bobbo6bobo16bobbo30boo$1264bo 7boo46boobo5bobo11boo7bo$1263b3o7boo17b3o23b3o7bobbo11boo3bo3bo23boboo $1262b5o5bo18bobbo23boo9bobo16bo3bo23bobo$1261boo3boo22boo6bo31bobo19b o24bo$1291boobobb3o22bo9bo16bobo25boo$1291boobb3oboo19boo55boo$1266boo 16bo8b5oboo20boo54boo$1268bo15bobo7b5ob3o$1265bo19bobo7b3o3bobo12boo$ 1265bobbo16bobbo14bo11boo$1264booboo16bobo5bo9boo12bo$1265boo7boo8bobo 5bobo$1273bobo8bo6bo3bo33boo$1273bo18b3o34bobbo$1263boo3boobboo16boo3b oo22bo3b3o7bo6boo$1263boo3boo48b5o3bo6bo6boo$1264b5o37boo9booboo3bo7bo $1265bobo38boo8b3oboo3bo3bobbo$1317boob4o5boo$1265b3o50b4o$1319bo5$ 1266boo25boo28boo$1266boo25boo28boo$$1350b3o15bo$1349bobbo14bobo$1352b o12boo3bo14boo$1348bo3bo7boo3boo3bo13bobo$1348bo3bo7boo3boo3bo12b3o4b oob3o$1352bo14bobo12b3o4bobb4o$1349bobo16bo6bo7b3o4boo$1324bo48boo9bob o$1323b3o48boo9boo$1322b5o$1321boo3boo44bo$1322b5o44boo$1322bo3bo44bob o$1323bobo$1324bo41bobo$1366boo$1367bo12bo7bo$1322bo56b4o5bobo$1320boo boo49boobbobboo8boo$1329bo44boobboo11boo4boo$1319bo5bo4bo40boo10bo7boo 4boo$1328b3o39b3o10bo4bobo$1319booboboo45boo10bo4bo$1365boo7boo$1364bo bo7boo$1364bo$1363boo$1337bo$1335bobo7boo4b3o3bo5boo$1336boo6bobo4bo5b o6bo$1345bo5b3o10bobo7bo$1365boo7b4o$1375b4o7bo$1319bo8bo46bobbo6bobo$ 1318b3o7boo17b3o25b4o4boo3bo9boo$1317b5o5bobo16boobo24b4o5boo3bo9boo$ 1316bobobobo22boobbo3bo20bo8boo3bo$1316boo3boo22b4o4boo30bobo$1347bobo 3boo31bo$1348boo25bobo$1321boo17bo6boo26boo$1321boo16bobo5b3o6boo13bo 4bo$1323bo14bo3boo12bobo11boo$1321b3o14bo3boo14bo11bobo$1319bo18bo3boo 3b3o8boo$1319b5o5boo8bobo5b3o$1320boo6bobo9bo5bo3bo33boo$1328bo16bo5bo 25boboo3b3o$1327boo17bo3bo22bobbo3bo5boobo5boo$1318boo3boo22b3o22boobb o4bo4bobbo5boo$1319b5o37boo8boo5b4o4boobo$1319booboo37boo7b3o7bo3b3o$ 1319booboo47boo11boo$1320b3o49boo$1373bo5$1321boo25boo$1321boo25boo! golly-2.5-src/Patterns/Life/Breeders/spacefiller.rle0000644000175100001440000000327012156145314017424 00000000000000#C A small spacefiller. #C Spacefillers are the fastest-growing known pattern in Conway's #C Game of Life (probably the fastest possible). They fill space #C to a density of 1/2, conjectured to be the maximum density, #C and they do it at a speed of c/2 in each of the 4 directions, #C which has been proven to be the maximum possible speed. #C This pattern starts with 200 cells, not the record lowest number #C of starting cells for a spacefiller (at the time of this writing, #C the record is 187). Quadratic-growth patterns that start with #C as few as 26 ON cells are now known, but their growth rate is #C comparatively slow. #C The population of spacefillers are easy to compute. This one's #C equations are: #C [(t+17)^2+511]/4 for t divisible by 4; #C [(t+17)^2+608]/4 for t mod 4 = 1; #C [(t+17)^2+563]/4 for t mod 4 = 2; #C [(t+17)^2+580]/4 for t mod 4 = 3. #C Most spacefillers at this time have p2 stretchers on the left and #C right instead of the flipper stretchers in this pattern. #C Original idea and middle part by Al Hensel; original construction #C and top/bottom stretchers by Hartmut Holzwart; size optimization #C by David Bell, Al Hensel, and Tim Coe. #C This spacefiller by Hartmut Holzwart, 4 Nov 1998. #C From Alan Hensel's "lifebc" pattern collection. x = 49, y = 26, rule = B3/S23 20b3o3b3o$19bobbo3bobbo$4o18bo3bo18b4o$o3bo17bo3bo17bo3bo$o8bo12bo3bo 12bo8bo$bobbobboobbo25bobboobbobbo$6bo5bo7b3o3b3o7bo5bo$6bo5bo8bo5bo8b o5bo$6bo5bo8b7o8bo5bo$bobbobboobbobboo4bo7bo4boobbobboobbobbo$o8bo3boo 4b11o4boo3bo8bo$o3bo9boo17boo9bo3bo$4o11b19o11b4o$16bobo11bobo$19b11o$ 19bo9bo$20b9o$24bo$20b3o3b3o$22bo3bo$$21b3ob3o$21b3ob3o$20bobooboobo$ 20b3o3b3o$21bo5bo! golly-2.5-src/Patterns/Life/Breeders/switch-engine-breeder-MR.rle0000644000175100001440000000301112156145314021612 00000000000000#C 5 beehives and 75 blocks produce a quadratically expanding #C population when hit by a single trigger glider. #C This is a nonstandard "Blockish" construction of Mitchell Riley's #C switch-engine breeder from July 2006, which in its minimal form #C contains just 38 ON cells: #C x = 135, y = 41, rule = B3/S23 #C 131b4o$130bo3bo$134bo$133bo3$130boo$130bobo$132bo$130b3o5$131b4o$ #C 130bo3bo$134bo$133bo9$94b4o$93bo3bo$97bo$96bo8$b4o$o3bo$4bo$3bo! x = 221, y = 173, rule = B3/S23 148boo$148boo3$143boo$143boo3$159boo$159boo$177bo$154boo20bo$154boo9b oo9b3o$165boo$$153boo5boo$153boo5boo$$167boo$159boo6boo$159boo3$171boo 4boo$171boo4boo4$174boo$170boobboo5boo$170boo9boo4$178boo$174boobboo5b oo$174boo9boo$$109boo$109boo$113boo67boo$113boobboo59boobboo$117boo59b oo4$174boo$174boo4$178boo$178boo9$149boo$149boo4$153boo$153boo9$124boo $124boo$$193boo24boo$193boo24boo$128boo$128boo$$184boo$87boo95boo33boo $87boo130boo$$210boo$185boo23boo$91boo92boo$91boo$206boo$206boo5$219b oo$161boo56boo$161boo10boo$173boo35boo$210boo$$161boo41boo$141boo18boo 41boo$141boo4$132boo70boo$132boo70boo$$127boo66boo$127boo66boo$133boo$ 133boo57boo$192boo$$127boo$101boo24boo$101boo$118boo54boo29boo$118boo 54boo29boo$96boo72boo$96boo68boobboo24boo$166boo28boo$114boo31boo13boo $114boo31boo13boo3$151boo$139bo11boo$138bobo$138bobo$129boo8bo$117boo 4boo4boo34boo4boo$117boo4boo40boo4boo$$133boo$121bo11boo$107boo11bobo$ 107boo11bobo$121bo$$111boo$99bo11boo$98bobo$98bobo$99bo4$78boo$78boo3$ 82boo$70bo11boo$69bobo$69bobo$70bo3$9boo$9boo3$13boo$bo11boo$obo$obo$b o!golly-2.5-src/Patterns/Life/Breeders/switch-engine-breeder.rle0000644000175100001440000000363612156145314021313 00000000000000#C A puffer train that creates switch engines. #C This is another type of pattern which grows quadratically. #C Half of a quadrant of the space is filled with blocks. #C Every 80 generations a new block-laying switch engine is created. #C By Helmut Postl, 1997. #C "SwitchEnginePuffer" from Alan Hensel's "lifebc" pattern collection x = 85, y = 164, rule = B3/S23 58boo5b4o$56booboo3bo3bo$56b4o8bo$57boo5bobbo$$52boo9bo$50b5o8b3o$50b oo4bo5bo3bo$50boo5b5o4bo$52boo4b4oboboo$55b3oboo3bo$61bobo$24boo$22boo boo14bo$22b4o13boo24b4o$23boo15boo22bo3bo$18bo28b4o17bo$11boo6boo25bo 3bo13bobbo$7b4oboo12bo23bo$7b6o11boo20bobbo9boo$8b4o13boobboo24b4oboo$ 29bobo23b6o$29bo26b4o5b4o$11bo52bo3bo$9boo30boo25bo$10boo29bobo11bobo 9bo$41bo22boo$54boo$54boo6boo3boo$54bo7bob3oboo$54boo7b6o$64b4o3$54b6o $53bo5bo$59bo$6bo46bo4bo$4bobo48boo$5boo4$58boo$49b4o4b4o$48bo3bo4boob oo$52bo6boo$48bobbo3$56boo$56bobo$56boboo$57boo$57bo$$15b4o$14bo3bo39b oo$18bo38b4o$14bobbo22boo15booboo$39b4o16boo$39booboo$41boo$48b6o$47bo 5bo$53bo4boo$47bo4bo4b4o$49boo6booboo$59boo$17boo$16b4o32bo$16booboo 30b6o$18boo30bo3b8o$51boo8bo$52b3o6bo$53boo5bo$57boo$47b4o$46b6o$46b4o boo$50boo5$26boo$24booboo$24b4o$25boo3$70b4o$69b6o$69b4oboo$73boo$27bo $27boo$26bobo$79b6o$75b4o5bo$63bobo9boobo5bo$63boo10boobbo3bo$64bo16bo $81boo$80b4o$80booboo$82boo$71b6o$70bo5bo$63boo11bo$62b4o4bo4bo$62boob oo5boo7boo$64boo14b4o$80booboo$38b4o17boo21boo$37bo3bo16boo$41bo$37bo bbo16boo$79boo$73b3o3bobo$70b3o6boboo$70bo9boo$70b3o7bo3$48b4o29boo$ 47b6o19b4o4b4o$47b4oboo17bo3bo4booboo$51boo22bo6boo$71bobbo$$53bo$8bo 42bo3bob6o$8boo40b3o3bo5bo$7bobo40bo5bo5bo$38bobo9boboo3bo3bo$38boo11b 3o5bo$39bo19boo$58b4o$26bobo29booboo$26boo32boo$27bo21b6o$48bo5bo$b6o 34boo11bo$o5bo33b4o4bo4bo$6bo33booboo5boo7boo$o4bo25boo9boo14b4o$bboo 27bobo24booboo$16b4o11bo28boo$15bo3bo$19bo$15bobbo29boo$47bobbo$42b3o 13boo$41bobbo8bo5boo$41booboo3bo3bo4boo$49bo4bo3bo$51bo$$59boo$50b4o4b 4o$49bo3bo4booboo$53bo6boo$49bobbo! golly-2.5-src/Patterns/Life/Guns/0000755000175100001440000000000012156146015013665 500000000000000golly-2.5-src/Patterns/Life/Guns/2c5-spaceship-gun-p416.rle0000644000175100001440000021216312156145314020144 00000000000000#C p416 2c/5 spaceship gun: Dave Greene, 11 Apr 2003 #C 64 p416 guns driving 60 Herschel-based glider inserters #C to produce four construction salvos totalling 63 gliders. #C Synthesis of 2c/5 spaceship mostly by Noam Elkies. x = 990, y = 979, rule = B3/S23 864bobo$867bo9boo$863bo4bobboo3bobbo$863boobobboboo3bobobo34boo$867boo 8bobbo22boo10b3o$881bo20bobbo3boobbobbobo$878bobo22bobo3boobboobboo$ 871bo29boobo8boo$871bob3o25b3o$873bobbo24boo$735bo131bo6boo33boo$725b oo8b3o129boo37boo3bo$724bobo11bo5bo117boo9bo32boo5bo$723b3o11boo4bobo 117bo7boo33boo6bo$723boo19bo12b3o103bobo6bobbo13boo22boo$726boo5boo22b 3obo102boo7boo14boo18bo8boo$725b3o5boo23bobobo144bobo8bo$759bobbo143bo bbo6bobo$760boo119bo25boo7boo$725boo7bo6boo128bo8bobo$725boo6boo5b3o 122bo4boo9bo$732boobo5boob3o117bobo3bobo27bo$733bobo6boo3bo12boo103bo 33bobo$734boo6boo3bo11bobo138bo8b3o4bo$725boo16b4o11b3o150bo3bobo$724b obbo30boo150bo5bo$724bobobo23boo7boo$725bob3o22boo6b3o$727b3o12bo101bo 18bo$741bobo100b3o6boo6b3o14boo$742bo17boo85bo5boo5bo17boo$760boo84boo 12boo26b3o$18boo867bobbo11boo$19bo734bo132bo14boo$19bobo205bo524bobo 92boo17bobo21boo3bo$20boo203b3o8boo515boo92boo3boo11bo9bobo11b3obbobo$ 218bo5bo11boo614boo12bobbo8bo14bobbo$204bo12bobo4boo640bobobo3bo4bobb oo10boo18boo$202boobo12bo18bo629bobbo3boobobboboo20boo7b3o$201bo26boo 6bobo455bo121bo51boo8boo24b3o5boboo$200bobobbo22boo5bobbo445boo8b3o 119b3o15bo7bo48b3o4boobbobbobo3bobo$19boo179bobbo30bobbo445bobbo10bo5b o89boo24bo14b3o5b3o53boobboobboo3bobbo$19boo4boo174boo480bo12boo4bobo 12bobo17boo31boo6bo15bo13boo6b3o18bo7bo56boo8boo$25boo187boo4b3o11bobb o445bo19bo12bo20boo30bo6b3o15bobo11boo6bo19boo6boo$212booboo19boo445bo boo5boo23bobbo51bobbo19boo$212bo8bo463boo5boo23bobobo48boo3boo$201boo 9bo4bobobo496bobbo$24boo175boo10bo8bo490bo5boo$20boobboo189b3o11bo6boo 446boo25booboo34boo$19bobo80bo18bo80bo13bobbo6bobo6bobbo445boo21boobb oobbo35boo7boo$19bo12boo68b3o6boo6b3o79bobo5boo10bo4bobo4bobbobo468bo 3bo30bo7bo9bobbo8b4o50boo$18boo11bobo71bo5boo5bo81bobbo5boo26bo469bobb obbo5boo7bo12bobo28bo4bo48boo84boo$31bo72boo12boo79bobbo15bobbo11boboo 464bobo4bobo7bobbo4boobo12bo17bobbo8bo139bo$30boo187bobo12bo449boo16b oo14bo6bo26boo5bobbo11bo3b4obboo124bobo$199bobbo17bo462bobbo15bo15bo5b obobbo22boo5bobo11bo3bobbo3boo124boo$117boo82boo480bobobo23boo5boboobb obbo14bo17bo12b3obboo$112boo3boo565bobbo23boo7boo3boo13bo3bo28b3o$112b oo91bo482bo12bo43bo14boo4boo55boo$32boo171bo479bobo12bobo35boo5boo13b oo3bobo55bo$31bobo171bo495bo17boo17bo8bo17bo38boo3boo13bo$31bo687boo4b oo11bo4bobo18boo39bo3bo13boo86boo$30boo91bo7bo14boo53b3o521bobbo10b3o 3bobbobboo21boo26b3o5b3o92boo4boo$121b3o5b3o14bo24boo571bobboobobbo6b oo12bo27bo9bo92boo$120bo7bo18b3o6boo13bo15bo7bo11b3o17boo496bobbo15b3o 4boo6bobbo12b3o$120boo6boo19bo6boo11bobo15b3o4boo31boo495bobbo5boo10bo 11bobbobo14bo11boo$169boo19bo3boo528bobo6boo26bo23boobboo20bo18bo$137b o51boo3bo530bo18bo12boboo23bobo24b3o6boo6b3o75boo$135bo3bo597boo4bobo 12bo26bo28bo5boo5bo78boobboo$40boo98bo584boo11bo5bo68boo12boo81bobo$ 40boo91boo5boo583boo8b3o43boo4boo109boo12bo$133bo8bo61boo67bo461bo43bo boo4bo110bobo11boo$47boboo82bo4bobo63boo17bo47b3o8boo494bo9b3o23boo84b o$47boobo83b3o3bobbo78bobo12boo25bo5bo11boo497bo8bo23boo3boo79boo$139b obboo79bo13b3o23bobo4boo505boobo38boo$57boo80b3o38boo21boobo5boo23boob o8b3o12bo512boo$58bo35bobo43bo39boo22bobo5boo25bobo5bob3o22boo6b3o438b o3boo$30boo26bobo34boo95boo11bo12b3o10boo5bobbo4bobobo23boo7boo437bobb oo3boo51bo$30bobo26boo34bo95bobbo9boo12b3o18boo5bobbo30boo441bobo4boo 51b3o15bo7bo88boo$32bo108boo49boo4boo4boo14boo25boo31b3o435bo8boobbo 28boo24bo14b3o5b3o86bobo$32boo108bo55bobo3boo9boo6b3o55bobo420boo11boo 5boo3boo6bo7bo15bo13boo6b3o18bo7bo87bo$141bo13boo3boo38bo13boo3bo3bo 43b3o12boo420boo10boobo17boo4b3o15bobo11boo6bo19boo6boo87boo$141boo13b o3bo39boo13booboo3bobo13boo25booboo446bobo17boo3bo19boo$153b3o5b3o26b oo24b4o4bo14boo6boo17bobboo447boo18bo3boo77b3o$51boo5boo93bo9bo27bo12b oo18bo22boo18boo4boo545bobbo$51bo6boo4boo122b3o12bobbo65bobbo6boo536bo 3bo$49bobo12boo109boo11bo14bobo25boo5boobo31boo6bobbo373bo160boobobo$ 32boo15boo30b3o91boobboo23boboo23boo6bobo5b3o5boo23bobobo363boo8b3o66b oo90booboo$32boo47bobbo61bo18bo13bobo23b3o13bo18bo7boo5boo22b3obo364b oo11bo5bo41bo17bobo63boo25b3o67boo$80bo3bo61b3o6boo6b3o14bo25boo12bobo 4boo10boo4boo19bo12b3o366boo10boo4bobo12boo25bobo17b3o62boo95boo$63boo 15b3obbo63bo5boo5bo58bo5bo11boo4b3o17bobo380bo18bo13b3o10b3o12bo19boo 93bo$49boo8boobboo16b4o63boo12boo13boo4b3o42b3o8boo5bobo17bo380bobo6b oo23boobo7bob3o22boo5boo23boo69b5o54boobo$49bobo6bobo117bo4b3o44bo16b oo398boboo5boo25bobo5bobobo23boo5b3o22boo70bobbo54boboo$51bo6bo12boo 102b3o5b3o496bobbo5bobbo7b3o34boo80b3obboo$51boo4boo11bobo5bobo80boo 12bo10b3o488bo5boo7boo7b6o31bobbo70boo7boobb3o$70bo7boo76boo3boo23b3o 459boo26bobo22bo3boo20boo4boo4boo49boo20boo7bo$69boo8bo76boo28b3o459b oo21boobbooboo22bobbobo19boo3bobo55bo30boobo20b3o27boo23bo$671bobo3boo 27boo24bo38boo3boo13bo30b3o17bobb3o27bo23bobo$666bo5b3obbobo3boo7boo 37boo39bo3bo13boo31bo17bob3obo25bobo23bobo$667bo4boo9boo7bobo46boo26b 3o5b3o61bobo29boo23booboo$33boo132bo7bo14boo124bo331boo15b3o15boo8b3o 31boo12bo27bo9bo60bo$34bo36boo92b3o5b3o14bo24boo30bo66b3o8boo320bobbo 32bo10boo11bo18bobbo12b3o19bo18bo55boo$31b3o36bobo91bo7bo18b3o6boo13bo 15bo6boo7bobo21boo34bo5bo11boo320bobo25boo5bobo6boo7boo5bobo15bobobo 14bo11boo6b3o6boo6b3o54bobbo11b3o$31bo38bo93boo6boo19bo6boo11bobo15b3o 6bo6boo22boo20bo12bobo4boo333boboo23boo5boboo5b3o6boo5boo15b3obo23boo bboo9bo5boo5bo57bobbo9bo3bo23boo$69boo142boo19bobbo53boobo12bo18bo322b 3o13bo45bo12b3o24bobo12boo12boo55bo3bo10bobbo12boo10bo$161boo70boo3boo 50bo26boo6bobo322boo12bobo37boo4bobo39bo85bobbo11b3obo10boo4boo4bobo$ 54boo5boo99boo125bobobbo11bo10boo5bobbo337bo17boo7boo11bo5bo36bo90bob oo11bo3bo11bo3boo5boo15boo$54boo5bo99bo127bobbo6boo4b3o15bobbo356boo7b oo8b3o49boo11boo48bo5bobo4bo10boo12bobo10boo28boo$59bobo228boo6bobbob oobbo394bo43b3obo3bo12boo3boo43bobo3boo5bobo23bo11boo$59boo187boo49boo bbobbo3b3o10bobbo418boboo6b3o14boo43boo5bo5boo$55boo125boo62bobbo17bo 38bobo4bo11boo352b3o63boobo8bo123boo$43boo10bobo21boo101boo82bobo12bo 22bo8bo429bob3o121boo9bobo$43boo11bo22boo165bobbo17bo12boboo6boo13boo 5boo300bo62bo5bo52bo132boobboo5bo$224boo21bobbo5boo26bo5boo14bo297boo 8b3o60bo5bo52b3o6bo8bo7bo52bo31boo24bobo3boo$59b3o24boboo134boo22bobo 5boo15bo6bobbobo21bo3bo13boo276bobbo10bo5bo53bo5bo29boo24bo14b3o5b3o 49bo32boo12boo12bo$59b3o24boobo146boo11bo25bo6bobbo5bo17bo14bobbo275bo 12boo4bobo12bobo17boo31boo6bo15bo13boo6b3o18bo7bo48b3o44bobo11boo$59b 3o90bo82bobbo31bo4bo7boo5bobo5boo22bobbobo275bo19bo12bo20boo20b3o7bo6b 3o15bobo11boo6bo19boo6boo97bo24bo$62b3o85b3obo30boo49boo4boo4boo19bo5b o13bobbo5boo26bo276boboo5boo23bobbo51bobbo19boo146boo22b3o$32boo9bo18b 3o84bo3bo32bo55bobo3boo19bobo16bobbo17bo12boboo279boo5boo23bobobo48boo 3boo189b5o$33bo8b3o8boo7b3o4boo77b3obo32bo13boo3boo38bo24boo37bobo12bo 314bobbo244boob3o5boo$33boboo3bo4bo7bo15bobo75boobo34boo13bo3bo39boo 37boo3bobbo9bo7bo317b5o7boo52bo28boo3boo158booboo5bo$34bo5bo4bo5bobo 17bo76b3o46b3o5b3o26boo45bobbo5boo7boo303boo20boo3bo3boo55bobo27bobobb obo159bo8b3o$38boo4bo6boo18boo75boobo45bo9bo27bo12boo50boo302boo19bo3b oo49boo10bobo29bo4bo131boo37bo$39boobbo106b3o79b3o12bobbo17bo12bobbo 340boo35bo17boo11bo29bobbobbo16boo113bobo$42bo107boo30bo18bo17boo11bo 14bobobbo16boo4boo5bobbo353boo5bobo12bobo62b3o17boo115bo$33b3obbobbo 140b3o6boo6b3o17boobboo23bo19boo5boo6bobo352bobbo7bo12bo200boo4boo5boo $32b3o4boo49boo93bo5boo5bo24bobo23boobo12bo18bo319boo32bo6bobbo23boo7b oo21boo164bo5boo$90bo93boo12boo24bo26bo12bobo4boo330bobbo16bobo12bo5bo bobo23boo5boboo21boo6bo157bobo$88bobo174bo5bo11boo318bobobo16boo5boo5b oboobbobbo15bo15bo12boo17bo159boo$47boo22boo15boo131boo4boo43b3o8boo 319bobbo16bo6boo7boo3boo16boo14bo11bobbo16b3o161boo$21bobo23bo23boo 124boo23bo4boobo43bo333bo12bo40bobo4bobo7bobbo3boo4boo49boo129bobo10b oo$9boo9bo27b3o141boo3boo20b3o9bo373bobo12bobo45bobbobbo5boo3bobo55bo 131bo11boo$8bobbo3boobbo4bo25bo141boo25bo8bo56bo335bo17boo27bo3bo12bo 38boo3boo13bo108boo$7bobobo3boobobboboo63boo139boboo52bo353boo4boo21b oobboobbo7boo39bo3bo13boo108boo15b3o$7bobbo8boo22bo9boo33bobo140boo52b o359boo25booboo17boo26b3o5b3o137b3o$6bo32boobboob3o3bobbo34bo261bo321b o5boo12bo27bo9bo111boobo22b3o$7bobo29boo4b4o3bobobo33boo111bo7bo14boo 53b3o66b3o8boo316bobbo12b3o146boboo19b3o$43boo8bob3o143b3o5b3o14bo24b oo90bo5bo10bobbo282boo5boo23bobobo14bo11boo156b3o28boo$55b3o66boo74bo 7bo18b3o6boo13bo15bo7bo11b3o17boo18bobo12bobo4boo12bo280boboo5boo23bo bbo23boobboo156b3o7boo19bo$125bo26bo47boo6boo19bo6boo11bobo15b3o4boo 31boo21bo12bo19bo280bo19bo12bo26bobo25bo18bo126bo17bobo$11bo7boo104bob o3bo19bobo95boo19bo3boo50bobbo23boo5boobo280bo12boo4bobo12bobo24bo26b 3o6boo6b3o111bo14bobo15boo$10bobo6boo105boo3bo20bobo64boo48boo3bo50bob obo23boo5boo282bobbo10bo5bo36bo33bo5boo5bo90boo21bobo14boo4bo6boo$10bo bo59boo79boo62b5o103bobbo316boo8b3o42bobo4boo25boo12boo89bo22bobo19bob o4bobbo$11bo10bo20boo7bo20bo135boo6boobobo103boo5bo321bo43bo3bo3bo129b obo21booboo18bobo5boo$22boo19boo6bobo16b3o88boo44booboo4bo5bo108booboo 25boo335bo3bo5b3o126boo46bo10b3o$21bobo27bobo16bo89bobboobo40bobbo4boo 4bo62boo45bobboobboo21boo334bo3bo8bo24boo160b3o$11bo28boo10bo111bobbo 39bobbo5bobo65boo17bo31bo3bo356bo3bo34boo3boo$11boo27bobo82boo22b4obbo bo3boo4bo40boo6b3o65boo16bobo12boo7boo5bobbobbo357bobo40boo100boo$6bo 33bo52boo5boo23boo4boo16bo3b4o5bob3o7bo41bobo65bo18bo13b3o5bobbo7bobo 4bobo352bo144bo39boo$5bobo4bobbo35boo40boo5bo30boo16bo4boobo3boobo7bob o85boo21bobo6boo23boobo7bo14boo16boo288boo190bobo38bo23bobo$6bo5bobbo 6bo28boo45bobo49bob4obbobboo10boo85boo21boboo5boo25bobo6bo15bo15bobbo 281bo4boboo50bo133boo4boo15boo18b3o27bo9boo$13b3o5bobo27boo4bo40boo43b oo9boo116boo18boo24bobbo3boobo5boo23bobobo280bo6b3o50b3o15bo7bo101boo 4boo21boo18bo19bo5bo4bobboo3bobbo$22bo33bobo35boo47boo9booboo112bobbo 17bo26boo4boo7boo23bobbo274b3o12bo28boo24bo14b3o5b3o99boo67bo5boobobbo boo3bobobo$41bo5boobbo5bo24boo10bobo33boo24boo63boo49boo4boo4boo4b4o8b 3o40bo12bo266boo9boo3bo3bo6bo5bo7bo15bo13boo6b3o18bo7bo143boo9bo12bo9b oo8bobbo$40bobo5b3o31boo11bobboo26boobboo43bo46bo55bobo3boobboob5o6bo 41bobo12bobo263boo8boobbobo5boobbo6boo4b3o15bobo11boo6bo19boo6boo8b3o 99boo30bobbo3b3oboobboo32bo$5boo34bo7bo75bobo24boo22bo44bo13boo3boo38b o7boo6bo6bo22boo17bo290bo5bo15boo3bo19boo56bobbo98bobo29bobobo3b4o4boo 4b3o3b3o16bobo$4bobo89bo3bo24bo12boo12boo20b3o44boo13bo3bo39boo7b3obo 3bo21boo5boo309boobbo17bo3boo80bo87boo8bo30b3obo8boo$4bo91bo4bo22boo 11bobo93b3o5b3o26boo18boobbobo22boo320bo99boo90boobboo3boo30b3o24bo$3b oo27boo23boo39bobobo34bo95bo9bo27bo12boo33boo420boo3bo90bobo61bo$8boo 22boo23bobo39bobobo32boo130b3o12bobbo32bo260bo165bo78boo12bo61bo9boo$ 8boo49bo11boo27bo4bo149boo11bo14bobo25boo5bobo249boo8b3o65boo93b3o79bo bo11boo70boo$59boo11bo19boo7bo3bo110bo18bo19boobboo23boboo23boo5boboo 248boo11bo5bo40bo17boo64boo111bo$54boo16bobo17bo123b3o6boo6b3o23bobo 23b3o13bo280boo4bobo12boo24bobo82boo26boo83boo58boo$54boo17boo15bobo9b oo115bo5boo5bo27bo3bo21boo12bobo4boo280bo13b3o9b3o12bo111boo116boo25b oo$19bobo63bo4boo46boo78boo12boo29boo36bo5bo11boo248boobo5boo23boobo6b ob3o22boo6b3o21boo67bobbo115bo$10bobo9bo61bobo50bobo117boo3boboo42b3o 8boo249bobo5boo25bobo4bobobo23boo7boo21boo69b3o115b3o$9bo8bobbo51bo10b obo50bo120bobb3obbo43bo260bo32bobbo4bobbo6boo22boo12boo79boboobo116bo$ 4boobbo4bo3bobobo49bobbo10bo50boo93boo22b3o5bobobo302boo13bobo4bo12boo 6boo7boo22b3o10bobbo70boo10b3o77boo98bo$4boobobboboo3bobbo20b3o27bobbo 112bo38boo3boo22bo8bobobo301boo13bo4boo4bo25boo4boo17bobo4boo4boo49boo 20boo13bo76bobo96bobo$8boo8boo21b3obo8bo17bo115boo36boo37bobb3o299boo 13b3ob3o4boo29bobbo17boo3bobo55bo35bo79bo4boo5boo68bo15bo$42bobobo3boo bboob3o127boo77boobo319boo6boo29boo23bo38boo3boo13bo33boo79boo4bo5boo 33bo33bobo5b3o$43bobbo3boo4b4o26boo179boo320bo7bo7boo6boo13bo23boo39bo 3bo13boo29boobbo86bobo37bobo33bo5bobbo$44boo8boo30bo180bo328bo8boo6boo 47boo26b3o5b3o42b3o88boo38bo7bo7bo24bo3bo$87b3o100bo46bo7bo14boo308boo 17boboo55boo12bo27bo9bo43bo93boo41b3o5bobo23bobbo$89bo56boo40bobo44b3o 5b3o14bo24boo30bobo249bobbo74bobbo12b3o171bobo10boo28boobbo5bo25bobo6b oo$68b3o75boo41boo43bo7bo18b3o6boo13bo15bo7bo7boo22boo226bobo25boo5boo bo5b3o5boo4bo18bobobo14bo11boo8bo18bo131bo11boo28boob3o39bobo$79b4o9b oo140boo6boo19bo6boo11bobo15b3o4boo8bo22boo227boboo23boo6bobo6boo5boo 6bo15b3obo23boobboo8b3o6boo6b3o127bo45b5o29bo12bo$44boo8boo10bo11bo7b oo3bobbo58boboo126boo19bo3boo261b3o13bo18bo4boo12bobbo3bo12b3o24bobo 15bo5boo5bo96boo15boo14bobo37boo7bo15boo13bobo11boo$43bobbo3boo4b4o6bo 11bo3boobboo3bobobbo56boobo74boo70boo3bo263boo12bobo16boo4b3o11bo5bobo 39bo15boo12boo95bo16boo13bo3bo35bobo23boo13bobo6boo$42bobobo3boobboob 3o6bo12bobboo8bo70boo65bobo354bo17boo5bobo11bo5bo36bo128bobo30bo3bo36b o12bo28bo7boo$41b3obo8bo38boobo67bo33bobo31bo372boo6boo8b3o42b3o4boo 121boo8boobo18bo3bo36boo11bobo$41b3o26b3o22bo68bobo32boo422bo43bob3o3b o14boo116boboo17bo3bo27boo13boo6bobo$64boo70boo27boo32bo118boo67bo278b o3bo5b3o11boo3boo133bobo7boo19bo14boo7bo$63bobo70bobo113boo63bobo17bo 47b3o8boo267bo3bo8bo16boo134bo9bo17bobo48bobo$65bo72bo113boo62b3o17bob o39bo5bo11boo204b3o59b3obo149boo21bobo15boo48bo9bobo$76boo4boo54boo 176boo19bo12b3o11bo12bobo4boo279b3o148boobo7bo14boo4bo61bobbo8bo$54boo 19boo5boo210boo23boo5boo22b3obo7boobo12bo18bo138bo63bo5bo52bo6bo132boo 15b3o7bobo18bobo60bobobo3bo4bobboo$54boo21bo216boo22b3o5boo23bobobo5bo 26boo6bobo127boo8b3o61bo5bo52b3o15bo7bo107boo4boo14boo9bobo18bobo10bo 27b3o20bobbo3boobobboboo$164boo140boo34b3o7bobbo4bobobbo22boo5bobbo 127boo11bo5bo54bo5bo29boo24bo14b3o5b3o105boo22b4o4booboo18bo10bobbo14b o8bob3o21boo8boo$157boo5boo4boo50bobo80bobbo31b6o7boo5bobbo15boo13bobb o140boo4bobo33boo31boo6bo15bo13boo6b3o18bo7bo129b3o38bobbo9b3oboobboo 3bobobo$157bo12boo48b3obo30boo49boo4boo4boo20boo3bo15boo17boo163bo12b 3o19boo20b3o7bo6b3o15bobo11boo6bo19boo6boo172bo10b4o4boo3bobbo$155bobo 61bo3bo32bo55bobo3boo19bobobbo34bo6bo7bobbo127b3o6boo22b3obo52bobbo19b oo236boo8boo$86bobo49boo15boo61bobbo33bo13boo3boo38bo24boo42boo3bo7boo 127boo7boo23bobobo49boo3boo174boo10boo38boo$86bobboo5bo41boo78bobbo33b oo13bo3bo39boo37boo28bo5bobo136boo30bobbo230boobboo7bo11boo26bo$41bo 44b4o5bobo71boo47boo47b3o5b3o26boo46bobo6boo20b5oboobo134b3o31boo53bo 25boo154bobo6bobo9boo23b3o$40bobo3bo33bo7boo6bo68boobboo48bobbo44bo9bo 27bo12boo31b3o7boo25bo137bobo86bobo23bobbo141boo12bo7boo15boo17bo$41bo 4bobo8bo21bobo8bo64boo7bobo53boo80b3o12bobbo18bo11boo36b4o3boo128boo 12b3o60boo10bobo26boo140bobo11boo23boo49bo9boo$46boo8bobo21bo6boboobo 62bobo6bo12boo42bo67boo11bo14bobobo15bobo5boo7boo6bo27bo4bobbo140boob oo41bo17boo11bo22bo3boo24boo48bo68bo51boo5bobboo20boobboob3o3bobbo$57b o28bobo4bo63bo5boo11bobo110boobboo23bob3o15boo5boo6b3o5bobo5boo22bobbo bo140boobbo17boo6bobo12bobo51bo4bo25boo47bo69boo49bobbo3bo3boobboo16b oo4b4o3bobobo$85bobbobboo64boo17bo83bo18bo13bobo24b3o12bo24bobbo5boo 26bo137boo4boo18boo9bo12bo52b3o77b3o87boo27bobbobo3bo7boo20boo8bob3o$ 71boo12bobbo7boo77boo83b3o6boo6b3o14bo39bobo4boo16bobbo17bo12boboo129b oo6bobbo30bobbo23boo7boo21boo178bobo31bo5b4o37b3o$40boo7boo20boo13bobb o6bobo164bo5boo5bo21bo36bo5bo11boo24bobo12bo130bobbo6boo30bobobo17bo5b oo5boboo21boo178bo29boboo42bo$39bobo5boobo35bobbo8bo163boo12boo13boo 49b3o8boo4bobbo17bo144bobobo23boo5b3o4bobbo17bobo11bo12boo189boo30bo 45boo$39bo7b3o37b3o8boo192bo3bob3o43bo16boo163bob3o22boo5boo6boo20bo 11bo11bobbo168boo55boo$38boo8bo44boo194b3o6boobo226b3o12bo19boo19bobb oo13bobbo3boo4boo49boo56bobo59bobo54bo16boo$43boo5bo42boo44boo36boo96b oo12bo8boboo240bobo17b3o19b3obo3b3o8boo3bobo55bo57boo62bo53bo3bo13boo 14boo$43boo5boo88bo35bobo91boo3boo22b3obo239bo17bobo19boboobb3obbo13bo 38boo3boo13bo57bo62boo53boo5boo24boo6bo$48boobbo84b3o36bo93boo91bo197b oo5boo15bobbo5bo12boo39bo3bo13boo68bo106b3o4boo32boo$49b3o85bo37boo 124bo61bo204boo13b3o3bobboo23boo26b3o5b3o79bo88boo20boo35bobo$48bobo 30bo281bo226boo11boo12bo27bo9bo79b3o86bo59bo$80boboo223bo294bobbo12b3o 204b3o16bobbo35boo$55b3o26bo5b4o66boo5boo112bo7bo15b3o51b3o207boo5boo 23bobobo14bo11boo79bo5bobo4bo100bo16b3o35bobo$43boo8bob3o22bobbobo3bo 7boo61boo5bo111b3o5b3o14bo24boo236boboo5boo23bobbo23boobboo19bo18bo40b obo3boo5bobo148boo3boo$39boo4b4o3bobobo25bobbo3bo3boobboo66bobo110bo7b o18b3o6boo13bo15bo7bo9bo21boo180bo19bo12bo26bobo23b3o6boo6b3o40boo5bo 5boo50boo97bobo10bo$39boobboob3o3bobbo27boo5bobboo70boo111boo6boo19bo 6boo11bobo15b3o4boo9bo21boo180bo12boo4bobo12bobo24bo27bo5boo5bo108boo 16boo5boo32bo39bo11bobo$43bo9boo106boo22boo140boo19bo3boo9bo3b3o197bo bbo10bo5bo36bo30boo12boo61bo64bo5boo31bobo8boo25bo15bo$149boo10bobo21b oo160boo3bo14bo194bo5boo8b3o42bobo4boo98boo28boo7boobo24bobo37bo10boo 3bo19bobo$149boo11bo205bo191bobo15bo43bo3bo3bo80bo19boo27bo8boboo25boo 47bo4bobo19bo$192boboo154bo210boo58bo3bo5b3o22boo52bo47bobo41boo49bo$ 165boo25boobo112bo3boo35bobo79bo188bo3bo8bo22boo3boo47b3o45boo41bobo 10boo$165boobo134boo3bo3boo35bobo10boo65b3o8boo177bo3bo37boo139bo11boo 74boo$169bo72bobo51boo4boo4bo41bo11boo17bo40bo5bo11bobbo176bobo165bo9b o37boo23boo27bobo$166bo76boo51boo5bobb3o71bobo12boo11bo12bobo4boo191bo 165bobo21bo23bobo23boo29bo$138boo27boboo4boo23boo41bo62b3o72bo13b3o8b oobo12bo17bobbo181bo161bobo6b3obo8bobo23bo56boo$139bo19boo8boo4bobo23b o136boo21boobo5boo23boobo6bo26boo5bobbo182b3o15bo7bo134booboo4boboo11b oo22boo51boo$139bobo17bo17bo23bobo134boo22bobo5boo25bobo4bobobbo22boo 5bobo160boo24bo14b3o5b3o105boo34boobo40boo46boo$140boo15bobo17boo23boo 146boo11bo32bobbo4bobbo32bo105boo31boo6bo15bo13boo6b3o18bo7bo98boo4boo 32bob3o27boo12boo$152bo4boo183boo5bobbo9boo33boo6boo139boo15boo13bo6b 3o15bobo11boo6bo19boo6boo98boo49boo19bo$151bobo145boo40bobo6boo4boo4b oo22bobobboo47boo121boo16bobbo19boo161boo26bo9bo17bobo$140bo10bobo30bo 115bo42bo12bobo3boo21bo3bob3o28b3o15boo137boo3boo182bo36bobo15boo$138b obbo10bo30bobo10boo101bo13boo3boo38bo20bo6bo6boo27bo345bobo35boo4bo6b oo31bo21b3o$138bobbo40bo3bo9bo102boo13bo3bo39boo20bo6b5oboobboo6boo15b o235boo94boo13boo15boo23bobo4bobbo28boobo20b3obo8bo$139bo42bobb4o5bobo 4boo108b3o5b3o26boo28b3o8b4o4boo6bobbo14boobo4boo225boo94boobboo26boo 23bobo5boo15bobboo8bo25bobobo3boobboob3o$177boo8boo5boo5boo4boo102bo9b o27bo12boo26bo35boobbobbo6boo59bo56boo9boo187bobo51bo10b3o9bo3boobboo 3bobobbo22bobbo3boo4b4o$153boo22boo8b3o17boo137b3o12bobbo24boo14bobbo 22boo6bobbo48boo8b3o47bo7boo8boo64boo109boo12bo63b3o8bo7boo3bobbo25boo 8boo$127boo24bo179boo11bo14bobo25boo5boobo4bobbo5boo22bobbobo48boo11bo 5bo26bo12bobo5bo76boo24b3o82bobo11boo7boo65b4o9boo$115boo10b3o24b3o 147bo18bo9boobboo23boboo23boo6bobo4bobo6boo26bo61boo4bobo12bobo8boobo 12bo18bo89bobbo84bo19bobo$114bobbo3boobbobbobo25bo37boo108b3o6boo6b3o 13bobo23b3o13bo18bo6bo18bo12boboo69bo12bo10bo26boo6bobo21boo65boobo84b oo18bo41boo$115bobo3boobboobboo15bobo45bobo9boo99bo5boo5bo17bo25boo12b obo4boo10boo24bobo12bo51boo7boo23bobbo5bobobbo22boo5bobbo21boo172boo 42bo$113boobo8boo22bo9boo35bo5boobboo98boo12boo57bo5bo11boo6boo17bo65b oobo5boo23bobobo4bobbo30bobbo10boo87bo137b3o$113b3o29bo4bobboo3bobbo 34boo3bobo131boo4b3o42b3o8boo6boo86bo31bobbo5boo44bobbo70boo6bo6bobo 136bo19bo10boobbo5boo$113boo30boobobboboo3bobobo38bo12boo120bo4b3o44bo 104bo13bo18boo23boo14bobbo4boo4boo49boo20boo5bobo4bobo145boo10bo6boobb oo3bo3bobbo$149boo8bobbo37boo11bobo103boo12b3o5b3o146bobbo12bobo4boo 34booboo15boo3bobo55bo22b3o3bobbo3boo76boo56boo10b3o9bo6boo7bo3bobobbo $163bo49bo100boo3boo12bo10b3o144boo20bobo33bo4bo19bo38boo3boo13bo22b3o 3boo75b3o4bobo54bobbo3boobbobbobo20b4o5bo$160bobo49boo100boo28b3o161bo 6bo18boo13bo3b3o17boo39bo3bo13boo21boobboboo75bobbo6bo36boo17bobo3boo bboobboo4b3o3b3o17boobo$117bo7boo143bo73b3o157bo3bo3boboo10boo6boo14b oo4bo3boo21boo26b3o5b3o34b4obo56boo18bo4bo4boo35bo16boobo8boo36bo$116b obo6boo12boo37boo91boo227boo6bobboo13boo26bobobbobbo6boo12bo27bo9bo35b o3bo56bo67b3o13b3o$116bobo20boo38bo84bobo3boo79bo139boo6bo8bo3boo21bo 18boo4boo6bobbo12b3o71boo30bo25bobo19bo5bo43bo13boo$117bo31boo7bo17b3o 86boo58bo7bo15b3o138bobbo6b4o4boo24bobo5boo22bobbobo14bo11boo59bo3b4o 22bobo24boo$127b3o19boo6bobo16bo37boo49bo57b3o5b3o14bo24boo115bobobo 10boobo9boo5boo6bobbo5boo26bo23boobboo59boobooboo22bobo5bo5bo33bo4boo 78b3o14boo$129bo27bobo53bobo106bo7bo18b3o6boo13bo15bo7bo7bo23boo60bobb o13bo9boo5boobo3bobbo17bo12boboo23bobo13bo18bo30bobboo29boo3bobbo34bo 3boo15boo5boo58bo14boo$128bo18bo10bo54bo108boo6boo19bo6boo11bobo15b3o 4boo5boo24boo64bo12bo19bo17boo4bobo12bo26bo14b3o6boo6b3o30bobbo20boo7b o8bo4bo29bo3bo17bo5boo48boo7bo$116b3o27boo51boo5boo4boo50bo13bo92boo 19bo3boo6boo86bobo12bobo18bo3bobbo11bo5bo35b3o20bo5boo5bo34b3o19booboo bbobo15bo29bo20bobo53boo$112bo5bo27bobo50boo5bo58bo10bobo112boo3bo111b o16bobbo5boo8b3o45bo3boo13boo12boo34boo20boboo10boo8bo29boo3boo15boo$ 111bobo4boobo36bo35bobo7bobo56b3o11boo247boo16bo43bo3bo3bo66bo20bo8boo bboobbo5bo9boo22b3o19boo$112bo6b3o6bo28boo36boo7boo381bobobbo4b3o85b3o b3obo8bo3bo4boo4boo10boobo9bo19bobo10boo$120bo6bobo33bo31bo4boo383bobb obo8bo12boo72bo18bo5boo16boboo30bo11boo$128bo25bobbo4bobo23boo10bobo 203boo177bo3bo22boo3boo227bo6bo$147bo6bobbo5bo24boo11bo3bo73bo60boo64b oo17bo99bo59bo31boo140boo47bo38boo3bobo$146bobo5b3o47boo16boo56bo59boo 64boo16bobo12boo84bo60b3o168boboo40bo5bo29bo8boo5bo$111boo34bo55boboo 15boo54b3o125bo18bo13b3o83bo186boo34bo7bo43bobo4b3o26bobo$110bobo89b3o bbo174boo21bobo6boo23boobo138bo130boobboo29bobo9bo41bo15bo19bo$110bo 93bobobo20boboo149boo21boboo5boo25bobo83b3o51b3o15bo7bo82boo24bobo28bo bo5boobo27boo28bobo$109boo27boo23boo40bobobo19boobo161boo36boo6bobbo 114boo24bo14b3o5b3o43bo36boo12boo12bo27booboo4boo8boo19bo30bo$114boo 22boo23bobo11boo27bobb3o181bobbo34bobbo6boo59boo17b3o11bo7bo15bo13boo 6b3o18bo7bo42bobo48bobo11boo46bo17bobo57bo8boo$114boo49bo12bo19boo7boo bo132boo49boo4boo4boo18boo4boo24bo43boo31boo4b3o15bobo11boo6bo19boo6b oo42boo51bo59bobo15boo58boo7bobo$165boo11bobo17bo9boo96boo36bo55bobo3b oo17bobbo19boo8b3o74boo3bo19boo144boo59boo4bo26boo23boo17b3o8bo$160boo 17boo15bobo9bo4bo24boo66b3o34bo13boo3boo38bo22bobbo18bobo11bo5bo68bo3b oo104bo80boo43bobo24bobo8bo14boo19bo3bo4boo$160boo21boo6bo4boo14bobo 24bo67b4o32boo13bo3bo39boo22bobo12boo3b3o11boo4bobo120bo55bo82bo43bobo 10bo13bo8booboo38bo$126boo54bobbo4bobo19bobo24bobo66bobbo43b3o5b3o26b oo47boo3boo19bo12b3o105bobbo53b3o80bobo42bo10bobbo10boo43boo6bo$116boo 7b3o55boo5bobo18booboo24boo67boboo42bo9bo27bo12boo33boo6boo5boo22b3obo 107bo136boo15boo36bobbo15boobbobo33boo4boo$116b3o5boboo50b3o10bo198b3o 12bobbo32bo6b3o5boo23bobobo39boo60bo4bo111boo40boo38bo16boobbo3bo35bo$ 110boobbobbobo3bobo22bobo26b3o111bo85boo11bo14bobo25boo5bobo29b3o7bobb o21bo17bobo63boo111bobo100boobbo31bo3bo$110boobboobboo3bobbo20bo9bobo 132boo83boobboo23boboo23boo5boboo26b6o7boo21bobo17b3o177bo64boo35b3o 27bo5bobo$114boo8boo22bobbo8bo72boo56boo88bobo23b3o13bo24boo20boo3bo 16b3o12bo19boo59b3o115boo21boo41bo9b3o24bo27boboo$148bobobo3bo4bobboo 26boo39bo148bo3bo21boo12bobo4boo17boo19bobobbo15bob3o22boo5boo23boo 177bobo38b3o10bo32boo24bo8boobbo$149bobbo3boobobboboo26bo38bobo5boo 144boo36bo5bo11boo26boo18bobobo23boo5b3o22boo177bo40bo13bo21boo7b3o20b obbobo3boobboo3bo$150boo8boo31b3o18boo15boo6boo4boo47bo84boo3boboo42b 3o8boo40boo4bobbo6boo4boo30boo188boo48bobo25b3o5boboo22bobbo3boo7bo$ 175bo19bo18boo29boo45bobo85bobb3obbo43bo49bobo5boo6bobbobbobbo28bobbo 104bobo118boo9bo22boobbobbobo3bobo25boo9b4o$175bo87bo29boo82b3o5bobobo 58boo31b3o15boo3bo4bo15boo4boo4boo49boo54boo118bobbo3boobbo4bo18boobb oobboo3bobbo$175bo12boo8boo62b3o112bo8bobobo56bobbo18bo11boo22b6o14boo 3bobo55bo56bo117bobobo3boobobboboo22boo8boo$161bobo20b4o4boo3bobbo30b oo28bobboo121bobb3o54bobobo15bobo5boo7boo22boboo18bo38boo3boo13bo106b oo65bobbo8boo$149boo9bo10b3o3b3o4b3oboobboo3bobobo29bobo10boo15b3obo 122boobo56bob3o15boo5boo6b3o4boo16bobo18boo39bo3bo13boo106boo64bo$148b obbo3boobbo4bo24bo8bob3o30bo6boobboo18boo123boo59b3o12bo24bobo15boo29b oo26b3o5b3o167boo16bobo$147bobobo3boobobboboo10bo24b3o30boo4bobo60bobo 84bo74bobo24b3o31boo12bo27bo9bo109boobo54bo62boo8boo$147bobbo8boo14bo 63bo12boo6bo42boo160bo17boo7boo30bobbo12b3o144boboo55b3o55boobboobboo 3bobbo$146bo28bo62boo11bobo5bo43bo179boo4boo7boo23bobobo14bo11boo192bo 55boobbobbobo3bobo$147bobo101bo7b3o227b3o6boo22b3obo23boobboo219boo33b 3o5boboo$250boo257bo12b3o24bobo223boo33boo7b3o$188boo7bo304boo4bobo39b o155boo9boo5boo94boo$166bo21boo6bobo16boo273boo11bo5bo36bo158bobo10bo 5boo$159boo5boo28bobo17bo273boo8b3o49boo151bo12bobo$159boo4bobo29bo15b 3o284bo43b3obo3bo151boo13boo$186boo25bo38boo289boboo6b3o21bo18bo126boo 83boo$186bobo5bo56bobo289boobo8bo21b3o6boo6b3o125bobo10boo32b3o36boo6b oo$186bo5b5o54bo29boo258bob3o34bo5boo5bo129bo11boo25bo6bobbo42boboo$ 192boob3o38boo5boo5boo30bo26bo269boo12boo90boo74bobo4bo3bo44boo$192boo bbo5bo33boo5bo38bobo23bobo21bo210bo142bo31b3o41bo5boo8bo38boo$156bo36b 3o5bobo37bobo39boo24bobo21boo351bobo29b3o48bobo5bobo35b3o$146bo8b3o28b o7bo7bo38boo67boo20boo246boo105boo15boo12b3o49booboo3bo35boboo$145bobo 8boo27bobo49boo341boo3boo117boo9b3o53bobbo33b3o3boo$146bo4boo9bo23bo 38boo10bobo76boo267boo28bo99b3o28boo24boo34bo13bo$154bo6bobo61boo11bo 65bo7boobboo296bo100b3o7boo19bo14boo23boo21bo11bobo$150bo3boo6bo78b3o 16boo40b3obbo4boobbobo295b3o22bobo45boo37bo17bobo13bobo23boo18bo15bo$ 150bo5boo19boo23boo36bo19boo20boo17bob3obobo7bo4boo225bo89boo45bobo37b obo15boo14bo12bo31bobo$152bo24boo23bobo35bo3bo37boo4boo15bo3bo5boobo3b oo225b3o15bo7bo64bo32boo11bo40boo4bo25boo11bobo31bo$145boo5bo5bo45bo 35bobbobo21boboo17boo18b3o3bo180bo30boo24bo14b3o5b3o95bo11boo45bobo29b oo6bobo$144bobo57boo36bobobbo19boobo37boo4bo4bo15bo134boo21bobo7boo6bo 15bo13boo6b3o18bo7bo92bobo58bobo29boo7bo$144bo7bo4bo41boo13boo27bo3bo 53bo11bo4bobo15boo132boo22boo6bo6b3o15bobo11boo6bo19boo6boo41bobo48boo 60bo10b3o75boo$143boo7bobbo43boo14bo19boo10bo66b3obobo14boo168bobbo19b oo90boo123b3o74bobo$148boo3b3o59bobo17bo8b3o40boo25boo187boo3boo70boo 39bo202bo$148boo66boo15bobo14boo31boobboo290boo51bo142bobo46boo$228bo 4boo15bobo29bobo296bo49bo71boo26boo33bobo9bo40boo$227bobo22bo29bo12boo 128bo205b3o69bo28bo32bo8bobbo41boo$186b3o27bo10bobo22boo27boo11bobo37b o80boo8b3o65boo177boo30b3o22b3o28boobbo4bo3bobobo$159bobo24b3obo8boo 13bobbo10bo65bo40boo78boo11bo5bo40bo17bobbo62boo48bo5bobo4bo43boo4boo 32bo22bo19bo10boobobboboo3bobbo$150bobo9bo24bobobo3b4o4boo9bobbo75boo 39boo91boo4bobo12boo11bo12bobo82boo48bobo3boo5bobo41boo81bo14boo8boo$ 149bo8bobbo26bobbo3b3oboobboo10bo218bo13b3o8boobo12bo17bobbo112boo5bo 5boo101boo9bo12bo57boo$144boobbo4bo3bobobo27boo9bo70boo141boobo5boo23b oobo6bo26boo5bobbo21boo156boo5boo40bobbo3b3oboobboo66b3o$144boobobbob oo3bobbo68boo40bo143bobo5boo25bobo4bobobbo6bo15boo5bobo22boo109bo47bo 5boo39bobobo3b4o4boo10b3o53boobo8boo$148boo8boo69bo39bobo144bo26boobo bbobbo4bobbo6bo25bo11boo119boo39boo7bobo43b3obo8boo72bobo3boobboobboo$ 216b3o11b3o19boo15boo24boo118boo26b3o4boo6boo7bo4bo31bobbo82bo16bo19b oo38boobboo4boo43b3o22bo18boo8boo30bobbo3boobbobbobo$218bo13bo19boo40b obo118boo21b5o3bo20bo5bo19boo4boo4boo49boo30bob3o13bo64bobo7boo64bo14b oobobboboo3bobbo30boo10b3o$189boo8boo16bo76bo120boo20b5ob3o25bobo19boo 3bobo55bo32bo3bo12b3o50boo12bo6bobo10boo52bo14boobbo4bo3bobobo41boo$ 188bobbo3boobboobboo20boo8boo56boo141bo3boobobo26boo24bo38boo3boo13bo 32bob3o64bobo11boo6bo11boo35bo36bo8bobbo$189bobo3bobobbobboo16boobobbo boo3bobbo31boo75bobo88boo11boo6boo37boo39bo3bo13boo34boboo65bo15bo51b 3o36bobo9bo$187boobo5b3o22boobbo4bo3bobobo30bobo75boo85bo15boo6bobbo 45boo26b3o5b3o46b3o66boo13bobo49boobbobboo40bobo$187b3o7boo27bo8bobbo 32bo75bo67boo18bo57boo12bo27bo9bo45boboo80bo3bo48bo3bobboo$187boo38bob o9bo31boo141bobbo15b3o22bobbo12bo17bobbo12b3o79b3o81bo3bo49boboo$236bo bo175bobo25boo5boobo4bobbo5boo4boo16bobbobo14bo11boo67boo80bo3bo50boo$ 415boboo23boo6bobo4bobo6boo5boo19bo23boobboo148bo3bo27boo60boo7bo$303b oo111b3o13bo18bo6bo18bo12boboo23bobo14bo18bo105boo12bobo7boo19bo61boo 6bobo$199boo102boo112boo12bobo16boo18boo4bobo12bo26bo15b3o6boo6b3o105b obo12bo9bo17bobo26bo42bobo$199boo24boo205bo17boo6boo11bo5bo59bo5boo5bo 110bo22bobo15boo27bo43bo$225boo26boo55boboo136boo6boo8b3o43boo4boo14b oo12boo109boo22boo4bo30bo9bo32bo$254bo55boobo154bo43boboo4bo169bobo28b obo40boo5bobo$251b3o257bo9b3o166bobo10bo18bo4boo9bo25bobo4bobbo$194bo 56bo262bo8bo13boo152bo10bobbo24boo5bobo30bo3bo$193b3o314boobo23boo3boo 158bobbo25bo6bo32bobbo5bo$192bobboo96boo215boo30boo160bo21bo4bo39b3o5b obo$186bo4b5o78boo5boo10bobo153b3o276boo34bo15bo$185bobo3b4o44bo34boo 5bo13bo355boo36boo30boo23boo15bobo$186bo4b4o7bo27b3o5bobo38bobo13boo 156bo52bo144boo37bo29bobo23boo16bo$192booboboobbobo19bo5bobbo6bo39boo 172bo52b3o15bo7bo154b3o30bo$193bo4bo3bo19bobo4bobbo42boo170bo5bo29boo 24bo14b3o5b3o107boobo41bo31boo$194boobbo24bo39boo10bobo149boo18bo12boo 6bo15bo13boo6b3o18bo7bo106boboo78boo54boo$194b4o30boo33boo11bo3bo33boo 111boo18bo11bo6b3o15bobo11boo6bo19boo6boo147boo5bobboo29boo54bobo$185b oo9bo31bo50boo33bo147bobbo19boo195bobbo3bo3boobboo83bo$184bobo27boo23b oo37boboo30bobo145boo3boo213bobbobo3bo7boo83boo$184bo12bo16boo23bobo 35b3obbo12boo15boo60bo139bobo4bo139boo21bo5b4o83boo$183boo11bobo29bo 12bo37bobobo11boo78boo137bo4boo4bo134bobo17boboo93boo$188boo6bobo28bob o11boo37bobobo83bobo3boo138b3ob3o4boo133bo20bo54b3o$188boo7bo29bobo6b oo14boo27bobb3o82boo79boo66boo6boo49bo81boo64bo8bob3o$228bo7boo15bo19b oo7boobo26boo55bo62bo17boo74bo41bo8bobo123boo15b3oboobboo3bobobo$253bo bo17bo9boo27bobo101bobo12bobo82boo7bo42bobo6boo124bo16b4o4boo3bobbo28b obo$254boo15bobo9bo30bo104bo12bo83b4o48boo123boo9bo19boo8boo28bo$200b oo64bo4boo41boo52bo13bo32bobbo23boo7boo21boo41b3o120boo51boo70bobbo8b oo$199b3o22bobo38bobo101bo10bobo31bobobo23boo5boboo21boo165bo60bo62bob obo3boobobboboo$188boo8boboo21bo41bobo99b3o11boo31bobbo31bo12boo177bob o61bo60bobbo3boobbo4bo$184boobboobboo3bobo24bobbo8boo15b3o10bo148boo 32bo11bobbo177boo15boo41bobbo61boo9bo$184bobobbobboo3bobbo23bobobo3boo bobboboo10b3o176bo4bo5boo5bobbo3boo4boo49boo144boo43b3o72bobo$185b3o 10boo25bobbo3boobbo4bo189boo3bo4bobboo4boo3bobo55bo70bo119b3o$186boo 38boo9bo58boo85bo46bobo7b3obbo9bo38boo3boo13bo67boo119bobbo$238bobo26b oo28bo86bo30boo23bo4bo8boo39bo3bo13boo68boo57boo36bo22bobo$267bo26b3o 85b3o30boo23b5o19boo26b3o5b3o138bobo35bobo21b3o6boo$268b3o23bo74bobo 69boo7boo12bo27bo9bo138bo38bo6b3o6bo14bobo17bo$250bo19bo99boo77bobbo 12b3o76bobo93boo44bobbo5bobo12b3o17bobo$227boo8boo11bo119bo45boo5boo 23bobobo14bo11boo63boo3bo98bobo40bo4bo13boo19bo12b3o$226bobbo3boobobbo boo7bo12boo8boo42boo5boo88boboo5boo23bobbo23boobboo64bo3bobo96bobbo33b o5bo21boo5boo22b3obo$225bobobo3bo4bobboo16b4o4boo3bobbo41boo5bo89bo19b o12bo26bobo72boo96bo3boo33bo4bo20b3o5boo6boo15bobobo$225bobbo8bo8b3o 10b3oboobboo3bobobo45bobo89bo12boo4bobo12bobo24bo171bo31boo7bo15boo22b obo15bobbo$224bo9bobo27bo8bob3o44boo90bobbo10bo5bo36bo70bo135bobo23boo 22bo18boo$225bobo24bo22b3o40boo95boo8b3o42bobo4boo62bo105bobb3o5boo18b o12bo20boo$252bo53boo10bobo104bo43bo3bo3bo63b3o103boo9bo18boo11bobo19b oo$245bo6bo53boo11bo148bo3bo5b3o168b3o7b3o20boo6bobo24boobbo4boo$245b oo76bo143bo3bo8bo168b3o9bo20boo7bo25boobbo4boo19boo$237boo5bobo75b3o 70bo70bo3bo245boo5bobo20bobo$237boo18boo4boo8bo47b3obo70boo69bobo242b oo9bo21b3o$257bobo3boo8bo48bo3bo68boo71bo161boo5boo72bobbo8bo21boo$ 257bo65bo3bo303bo5boo56bo15bobobo23boo7boo$295boo27bob3o302bobo59boobo 15bob3o22boo6b3o$296bo19boo7b3o70bo233boo45bobboo8bo21b3o12bo$233boo 61bobo17bo9bo69bobo141bobo93boo40bo3boobboo3bobobbo31bobo4boo$232bobbo 61boo15bobo80boo141boo93bobo10boo28bo7boo3bobbo34bo5bo11boo$224bo6b6o 31bobo38bo4boo225bo94bo11boo29b4o9boo42b3o8boo$223bobo6bobboo29boobbo 6bo30bobo321bo105bo$224bo10bo4bo27b3o5bobo29bobo$230bo4bo3bobo19bo15bo 18b3o10bo320b3obo$240bo19bobo8bo23b3o108bobo220boboo$230b3o28bo9b3o 133boo220boobo$267b3obboo133bo219bob3o27boo$223boo42boo3boo36boo326boo 19bo$222bobo27boo13bo9boo31bo318bo9bo17bobo$222bo10bo18boo13boobo6bobo 31b3o325bobo15boo$221boo8b4o33b3o8bo33bo326boo4bo6boo$226boobbo3bo34bo 9boo364bobo4bobbo$226boobbobbo40boo30boo8boo327bobo5boo$231b3o40boo26b oobboobboo3bobbo327bo10b3o$302boobbobbobo3bobo340b3o$308b3o5boboo$237b obo68boo7b3o$240bo77boo116bo207boo$226boo8bobbo21b3o173boo206bo$222boo bobboboo3bobobo21b3obo8boo11boo7boo138boo204b3o24b4o9boo$222bo4bobboo 3bobbo23bobobo3b4o4boo8boo6boo344bo19bo5bo7boo3bobbo$226bo9boo25bobbo 3b3oboobboo7bo18boo7bo195bo138boo10bo5bo3boobboo3bobobbo$223bobo38boo 9bo24b3o3boo6bobo193bo127boo10b3o9bo6bobboo8bo$300bo15boo192b3o22bobo 99bobbo3boobbobbobo29boobo$301bo14boo217boo101bobo3boobboobboo4b3o3b3o 18bo$256boo5bobboo268bo99boobo8boo$255bobbo3bo3boobboo364b3o23bo$253bo bbobo3bo7boo167bo196boo24bo$257bo5b4o173boo74bobo143bo9boo$253boboo52b 3ob3o3boo118boo75boo154boo$254bo58b7obo195bo$304bo8boobob3o207bo119boo $260b3o40bobo221bo120boo$259bobbo41bo8b3o211b3o$259bo3bobboo45bobo122b o$258boobobobboo42b4obo123boo64bo5bobo4bo$258booboo32boo13bobboo5boo 116boo65bobo3boo5bobo156b3o6bo$259b3o33boo14b3o6bobo182boo5bo5boo157bo bbo4bobo$312bo9bo320bo26bo6boboo5bo$322boo200bo110bo6b3o24bobo3boo$ 317boo203boo110bobo4bobboo24bo4boo$262boo53boo184bo19boo110bo5b4o6bo 22bobbo$253bo248bo141bobo3bobo22boo$252bobo247b3o139bobbo3bo34boo$253b o15bo374bobbo38bobo$261boo5bobo34boo143bobo192boo28bo12bo$262boo5bo35b 3o143boo181boo23boo13bobo11boo$261bo43boobo8boo132bo181bobo23boo13bobo 6boo$307bobo3boobboobboo310bo12bo28bo7boo$252boo52bobbo3boobbobbobo 309boo11bobo$251bobo53boo10b3o315boo6bobo$251bo67boo316boo7bo$250boo 419bo$255boo413boboo$255boo417bo5b4o$649boo19bobbobo3bo7boo$639boo7b3o 21bobbo3bo3boobboo$639b3o5boboo22boo5bobboo$268bo364boobbobbobo3bobo$ 266boobo363boobboobboo3bobbo$252bobboo8bo371boo8boo$251bo3boobboo3bobo bbo$251bo7boo3bobbo$252b4o9boo$482boboo161boobbo$481b5o166bo160boobboo 164b3o$481boo3bo160bo4bo165boo160b3obbo$484boo163boobo162boobo162b5o$ 484boo164b3oboo159bo6bo158boo$487b4o160b6o165bo165boo$486bo3bo160boo4b o158bo6bo163bobo$485boobboo160b3oboo160boboboo159bo3boobo$481bobbo3bo 158bo6boo157bobo5boo156bobo6bo$481b7o159b7o159b8o158bob7o$$481b7o159b 7o159b8o158bob7o$481bobbo3bo158bo6boo157bobo5boo156bobo6bo$485boobboo 160b3oboo160boboboo159bo3boobo$486bo3bo160boo4bo158bo6bo163bobo$487b4o 160b6o165bo165boo$484boo164b3oboo159bo6bo158boo$484boo163boobo162boobo 162b5o$481boo3bo160bo4bo165boo160b3obbo$481b5o166bo160boobboo164b3o$ 482boboo161boobbo17$451bo62boo$451boo60boo$450bobo62bo$$502b3o$502bo$ 503bo16bo$519boo$519bobo4$452boo$453boo$452bo8$539boo$538boo$519boo4b oo13bo$424b3o91boo5bobo$426bo93bo4bo8boo$425bo108bobo$534bo$$404boo$ 405boo$404bo$533bo$192boo8boo219boo107boo$188b4o4boo3bobbo219boo106bob o$188b3oboobboo3bobobo217bo$193bo8bob3o$204b3o$$200bobo102bo220b3o$ 198boobo101b3o8boo88b3o119bo7b3o$199boboo93bo5bo11boo90bo120bo6bo$192b oo4booboo92bobo4boo101bo129bo$192boo6bo40boo5bobboo28b3o12bo104bo$187b oo9b3o39bobbo3bo3boobboo22bob3o22boo6b3o84boo$188bo9b3o37bobbobo3bo7b oo21bobobo23boo7boo83bobo$188bobo8boo41bo5b4o26bobbo6boo22boo227bo$ 189boo6boboo37boboo37boo7boo22b3o82boo141boo$197bobo39bo48boo4boo17bob o80bobo141bobo$198bo94bobbo17boo65boo15bo$194boo10bo87boo84bobo83boo$ 194bobo8bobo71boo13bo87bo$190bo3bo11bo44boo26boo114boo67bo3bo$189bobo 59boo61boo80boo66bo4bo$190bo65boo55bobbo78bo70bobobo8bo$256bo22b3o5boo 4bo18bobobo150bobobo5b3o$229boo23bobo23boo5boo4bobo15b3obo108bo43bo4bo bbo$229boo23boo21boo14boo3bo12b3o100boo8b3o42bo3bobboo$128bobo146b3o 17bobo114boo11bo5bo$131bo9boo135bobo17bo127boo4bobo12bobo20boobbo$127b o4bobboo3bobbo94bo40boo152bo12bo26bobo$127boobobboboo3bobobo58boo32bob o173boo7boo23bobbo23boobboo69boo39boo$131boo8bobbo58boo33bo4bo10bo158b oobo5boo23bobobo14bo11boo65bo3bobo38bobo$145bo95boo10bobo26b3o131bo31b obbo12b3o77boo3bo40bo$142bobo97boo10bo110boo49bo13bo4bo13boo12bo27bo9b o42bobo35boo$215bo30bo33bo5bo77bobo46bobbo11boob3obbo3boo21boo26b3o5b 3o79boo$213bobo29boboo31bo5bo79bo15b3o29boo13boobo7bobo10boo39bo3bo13b oo69bo$190b3o21boo64bo5bo97bo45bo4bo6bo11bo38boo3boo13bo$131boo57b3obo 8boo44bo55boo76bo49boo5b3o6boo3bobo55bo$131boo58bobobo3b4o4boo40bo32b 3o20boo127bo14boo4boo4boo49boo$126boo64bobbo3b3oboobboo37bobbo164boo 44bobbo$127bo65boo9bo35boo171bobbo44boo$127bobo110boo4boobbo130boo30bo bobo23boo5boo23boo41bo$128boo100boo148bobo31bobbo23boo5boobo21boo37boo 3boboo$230boo14boo134bo35bo12bo19bo60boo4b3o$247b3o32boo131bobo12bobo 18bo61boobboo49boo$145bo107bo26bobbo17bo129bo16bobbo61b3o6boo44bobo6b oo$144bobo104boobo45bobo12bo53bo79boo64bo3bo3boo43bo8bobo$129bo9bobo3b o91bobboo8bo6boo5boo14bobbo12boo3bo12boboo51boo142bobo3booboo53bo$128b obo9boo94bo3boobboo3bobobbo3bo5boo15bobbo5boo3boo21bo49bobo3boo138bo4b 4o$129bo10bo95bo7boo3bobbo5bobo21bobo5boo5bo16bobbobo55boo137bo$237b4o 9boo7boo22bo32bobbo54bo84boo3boo$136b3o124boo52boo142bobbo19boo260boo bbo5boo$136bobo108bo14bobo17boo142boo18bo11bo6b3o15bobo11boo6bo19boo6b oo207boobboo3bo3bobbo$136bo108b3o15bo18boo13boo127boo18bo12boo6bo15bo 13boo6b3o18bo7bo207boo7bo3bobobbo$136bobbo104bo14bo36b3o147bo5bo29boo 24bo14b3o5b3o213b4o5bo25boo9bo$136bo107boo12bobo35bobbo17boo133bo52b3o 15bo7bo225boobo20bobbo3b3oboobboo$135bobbo3boo113bo3bo29boo4boo16bobbo 133bo52bo253bo20bobobo3b4o4boo$134boboo4boo86bo25bo3bo21boo6bobbo485b 3obo8boo$133boobo92bobbo22bo3bo21bobbo6boo22bobbo129b3o58b3o267b3o$ 134bobbo91bobbo10bo10bo3bo22bobobbo22boo5bobbo188bo32boo$134bobo94bo 10bobo10bobo24bo26boo6bobo188bo3bo23boo3boo203boo7bo$130bobo109bobo11b o26boobo12bo18bo189bobbobo8bo13boo208boo6bobo$129bo9bobo101bo4boo35bo 12bobo4boo203bobobbo4b3o218boo11bobo$130bobbo8bo88boo15bobo9boo37bo5bo 11boo148bo43bo3bo3bo222bo12bo28bo7boo$130bobobo3bo4bobboo58boo8boo12bo bo17bo55b3o8boo130boo6boo8b3o45bo3boo14boo12boo191bobo23boo13bobo6boo$ 131bobbo3boobobboboo57bobbo3boo4b4o8bo19boo7bo3bo44bo122bo17boo4bobbo 11bo5bo35b3o21bo5boo5bo193boo7bo15boo13bobo11boo$132boo8boo60bobobo3b oobboob3o7boo27bo4bo152boo12bobo36boo4bobo12bo26bo15b3o6boo6b3o199boo 30bo12bo$203b3obo8bo40bobobo153b3o13bo23bobbo17bo12boboo23bobo14bo18bo 198bobbo40bobo$203b3o50bobobo153boboo23boo5boboo4bobbo5boo26bo23boobb oo229bobo5bo34boo$254bo4bo153bobo25boo5bobo6bobo5boo6boo14bobbobo14bo 11boo229boo5bobo24b3o$207bobo44bo3bo154bobbo32bo8bo13boo17bobbo12b3o 234bo15bo24bo$208boboo202boo15b3o15boo23bo17boo12bo27bo9bo44b3o151bobo 33bo5bobbo$207boobo29boo11bobboo89bo85bo4boo9boo6boo47boo26b3o5b3o43bo 3bo25boo124bo33bobo5boo$165bobo39booboo4boo22boo10bobo40boo5boo43boo 83bo5b3obbobo3boo6boo37boo39bo3bo13boo36bo23boo160bo15bo$166boo41bo6b oo34boo41boo5bo43bobo88bobo3boo17boo7boo24bo38boo3boo13bo33b3o26bo174b obo$166bo42b3o9boo33boo42bobo111boo21boobbooboo21bobbobo19boo3bobo55bo 30bo208bo$209b3o9bo34bobo32bobo6boo112boo26bobo16b3o3bobobo18bobbo4boo 4boo49boo30bobo16b3o$194boo13boo8bobo29boo5bo33boobboo145bo5boo6boo8b oo34bobbo81bo17bo$194boo13boobo6boo30boo5boo32bo3bobo149bobbo4bobbo30b obbo10boo101bo16bo$210bobo84bo115boboo5boo25bobo4bobobbo22boo5bobbo21b oo105boo132boo$211bo201bobo6boo23boobo6bo26boo6bobo21boo105bobo131boo$ 114boo8boo77bo10boo12bo71b3o111bo18bo13b3o8boobo12bo18bo$110b4o4boo3bo bbo75bobo8bobo12b3o69b3o111boo10boo4bobo12boo11bo12bobo82boo221boo$ 110b3oboobboo3bobobo75bo11bo3bo11bo68b3o111boo11bo5bo40bo17boo64boo 221boo$115bo8bob3o89bobo9boo71b3o42boo64boo8b3o65boo251bo24b3o$126b3o 90bo83b3o43boo73bo156bo162boboo$303b3o42bo230boo167bo8boobbo6bo5bo$ 580boo162bobbobo3boobboo3bo5bo5bo$417b3o82boo3boo237bobbo3boo7bo5bo5bo 18b3o$417b3o84bobbo19boo218boo9b4o20bo8bob3o$114boo132boo156bo10b3o49b oo30bo6b3o15bobo11boo6bo19boo6boo192b3o4b3oboobboo3bobobo$114boo47boo 5bobboo73bo157b3o5b3o52boo21boo8boo6bo15bo13boo6b3o18bo7bo173bo25b4o4b oo3bobbo$109boo51bobbo3bo3boobboo26boo39bobo160bo4b3o74bobo31boo24bo 14b3o5b3o174b3o27boo8boo$110bo49bobbobo3bo7boo26boo39boo160boo4b3o76bo 56boo14bo7bo179bo69boo5bobboo$110bobo51bo5b4o469boo108boo68bobbo3bo3b oobboo$111boo47boboo247bo230boo177bobbobo3bo7boo$161bo32bo34boo179bobo 210boo4boo13bo123bo10boo44bo5b4o$196bo32boo15boo72b3o83boobboo49boo9bo 111boo36boo5bobo134bobbo8b3o10boo28boboo$128bo63bobbo21b3o26bobo73bo 83boo11bo40bobbo3b3oboobboo102boo3boo38bo4bo8boo115bo10bobbo7bobobbobb oo3bobbo28bo4bo$127bobo61bo13boo8bob3o28bo72bo97b3o37bobobo3b4o4boo63b o38boo57bobo113bobo5boo3bo9boobboobboo3bobo34bo$112bo15bo36bo7boo17boo 7boo4b4o3bobobo29boo134bo9bo27bo35b3obo8boo66b3o96bo115bobo4bobbo16boo 8boboo$111bobo5boo43bobo6boo17bo8boobboob3o3bobbo136boo28b3o5b3o26boo 35b3o77b3obo206boo4bo6boo28b3o$112bo5bobbo42bobo11boo25bo9boo83boo52bo 17boo13bo3bo39boo106bo3bo8bo25boo12boo143boo9bobo15boo25boo39boo$118bo 8bo37bo12bo122boo49bobo17bo13boo3boo38bo108bo3bo5b3o26bo5boo5bo155bo 17bobo57boo6boo$119b3o3bobo23boo23bobo33bo16boo69bo51boo19bo55bobo34bo 30bo43bob3o3bo26b3o6boo6b3o139bo3bo7boo19bo57bobo10boo$126boo23boo15bo 7boo32b3o16bo142boo49boo4boo34b3o19boo8b3o42b3o4boo25bo18bo41bo97bo4bo 27boo56bobo10bo$167boo40bo17bobo89boo101bobbo38boobbobboo13bobo11bo5bo 36bo92boo99bobobo39boo43bo10bobo$117bo48bobbo39boo16boo20boo5boo62boo 101boo39bo3bobboo12b3o11bo5bobo39bo88bobo99bobobo38boo43boo9boo$116bob o41bo5bobo81bo5boo61bo11boo78boo51boboo17boo12bobbo3bo12b3o24bobo190bo 4bo31boo49bobo$116bobo6boo32bobo5boo81bobo78boo78boo51boo22boo5boo6bo 15b3obo23boobboo187bo3bo32bo9bo40boo3boo$117bo7boo33bo15bo17b3o54boo 234b3o5boo4bo18bobobo14bo11boo224bobo6b3o14boo16bo12boo$175bobo17b3o 10bo35boobo7boo112boo150bobbo12b3o201boobbo11boo19boo5boobbo13boo15bob o10bo$176bo23boo5bobo34boboo6bobo112boo96bo54boo12bo27bo9bo55b3o111bob o10boo25bob4o31bo15bo$151b3o45bobbo4bobo45bo44b3o164bo19boo47boo26b3o 5b3o55bo7b3o104boo37bobo49bobo$151bobbo45boo6bo4boo22boo63bo155bo9bo 18boo13bo23boo39bo3bo13boo44bo6bo102boo41b3o8bo41bo$112b3o35bo45boo15b obo21boo12boo48bo155bobo42boo23bo38boo3boo13bo52bo100bobo51bobo$112b3o bo8boo26boo40bobo17bo33boboo44bo160bo4boo9bo26bobbo17boo3bobo55bo154bo 5boo31b3oboboo8bo$113bobobo3b4o4boo18bo3boo40bo19boo7b3o21bo48boo121b oo3bo40boo5bobo20boo4boo17bobo4boo4boo49boo152boo5boo30bob7o$114bobbo 3b3oboobboo18bo44boo28b3o24bo44bobo101boo19bo3boo40bo6bo12boo7boo22b3o 10bobbo242boo3b3ob3o$115boo9bo24bo10boo60b3o20boobo108boo19bo6boo11bob o15b3o4boo35bo4bo18bobbo6boo22boo12boo109bo$151b3o8boo57b3o23boo44boo 64bo18b3o6boo13bo15bo7bo37boo20bobobo23boo7boo13bo7boo96boo124bo$152b oo67b3o68bobo65b3o8bo5bo24boo53boo28bob3o22boo6b3o12bo8boo96bobo112bo 8b3o52boo$153bo67b3o53boo15bo67bo14boo77bobo30b3o12bo32b3o44bo173boo7b o55boo$276bobo62boo26b3obo82bo46bobo76bo3bo173bo6boo13boo14bo$175bo30b o11bo59bo62boo16bo8boboo83boo47bo17boo11bo46bo3bo170b3o22boo15bo$173b oobo28bobo9bobo6bo64boo66b3o6boobo88boo60boo10bobo47bobo171bo24bobo6b oo3b3o$159bobboo8bo31bo12boo7b3o63boo68bo3bob3o43bo45boo72bobo247bo7b oo18bo23bo$158bo3boobboo3bobobbo27bobbo13boo6bo61bo69boo49b3o8boo110bo 274boo22boobo$158bo7boo3bobbo28boobo14bobo4bobo137bo36bo5bo11boo386boo 7bobboo8bo$159b4o9boo28b3o11boo5bo5bo18bo115bo39bobo4boo119boo3boo210b oo53bo14bo3boobboo3bobobbo$146bobo54booboo8boo5boo21b3o114bobo24b3o12b o127bo3bo19boo191bo29boo22bo14bo7boo3bobbo$146bobo20bo33bobboo37bo113b oobboo23bob3o22boo6b3o20boo24b3o24boo29b3o5b3o15bobo11boo6bo19boo6boo 142bobo27b3o7boo12bo15b4o9boo$147bo19b3o34b3o23boo13boo112boo11bo14bob obo23boo7boo19boo14bo8bob3o24boo17b3o9bo9bo15bo13boo6b3o18bo7bo143boo 27boobo5b3o$124boo8boo30bo26bo11bo24boo140b3o12bobbo30boo24bo8b3oboobb oo3bobobo81boo24bo14b3o5b3o175bobo3bobobbobboo10b3o$123bobbo3boobboobb oo26boo25b3o141bo9bo27bo12boo16b4o11b3o32b4o4boo3bobbo51b3o53boo14bo7b o48boo39boo85bobbo3boobboobboo$124bobo3bobobbobboo56bo140b3o5b3o26boo 21boo6boo3bo11bobo35boo8boo181bobo38bobo71boo12boo8boo12bo11boo$88boo bbo5boo22boobo5b3o18bo42boo128boo13bo3bo39boo10bobo6boo3bo12boo97bo 130bo40bo56boo15boo36bo10b3o10boo$84boobboo3bo3bobbo21b3o7boo17bobbo 106boo62bo13boo3boo38bo10boobo5boob3o112bo163boo62bobo33bo19bo9bobobbo bboo3bobbo$84boo7bo3bobobbo19boo27bobbo10bo94bobo63bo55bobo3boo6boo5b 3o116bo60boo29boo69boo63bo35b3o27boobboobboo3bobo25boo5bobboo$89b4o5bo 54bo10bobo95bo15b3o44boo49boo4boo4boo7bo6boo177boobo22boo3boo71bo61boo 38bo30boo8boboo22bobbo3bo3boobboo$99boobo61bobo113bo94bobbo44boo162bo 8bo12boo177boo41b3o20bobbobo3bo7boo$101bo63bo4boo107bo96boo44bobbo158b o9b3o235boo24bo5b4o$134boo17boo15bobo9boo29boo10boo127bo9boo22b3o5boo 23bobobo97boo16bo43boboo4bo67bo162boo28boboo$134boo16bobo17bo40bo11boo 127boo8boo23boo5boo22b3obo80bo17boo6boo8b3o43boo4boo13boo12boo37boo 105booboo29b3o18bo3boo26bo$139boo11bo19boo7bo3bo25bobo38bobo93boo3bobo 30boo19bo12b3o66bobo12bobo24boo11bo5bo58bo5boo5bo36bobboo105bobo18bo 10b3o17bo5boo31boo$88boo49bo11boo27bo4bo25boo32bo6boo23boo43boo22b4o 36b3o17bobo83bo12bo37boo4bobo12bo26bo14b3o6boo6b3o32boobboo105bobo17bo bo28bo6boo31bo$88boo22boo23bobo39bobobo62bo5boo22bobo43boo21bo4bo25bo 10bobo17bo80bobbo23boo7boo5bo18bo12boboo23bobo13bo18bo33boob3o105bo18b obo28boo37bo3bo$83boo27boo23boo39bobobo95bo66bobb4o23bobo10boo97bobobo 23boo5boboo4bobo6boo26bo23boobboo62boboo121boo4bo24boo8bo34boo5boo$84b o91bo4bo12boo52bo96booboboo23bobo109bobbo6boo23bo7bobbo5boo22bobbobo 14bo11boo63bo122bobo15boo13bo8bobo32b3o4boo$84bobo89bo3bo13boo15boo33b obbo100boo24bo111boo6bobbobb3o17bo8bobbo22boo6bobbo12b3o79bo17boo90bo 9bo17bobo12bobo6bobbo13boo19boo7boo$85boo34bo89bobo33bobo15bo81b3o147b oo23bobbo30bobbo6boo12bo27bo9bo39boo3bo17bobo67boboo17b3o7boo19bo13boo 7boo14boo28bo$120bobo39boo11bobboo33bo34bo16boo106boo3bo126boo16boo6bo bbo16boo4boo21boo26b3o5b3o37boobo21bo69boobo16b3obo27boo56bobbo5bobo$ 121bo3bo11bo24boo10bobo36boo25boo22bobo3boo81boo19bo3boo9bo111bo4bo24b oo17bobbo16boo39bo3bo13boo25boo114bo3bo84b3o6boo$102bo21bo11bobo35boo 64boo29boo31boo6boo19bo6boo11bobo15b3o4boo9bo21boo75boo16bo44b3o17bo 38boo3boo13bo25boo4bo97boo11bo3bo56bo$101bobo20b3o10bo40boo90bo33bo7bo 18b3o6boo13bo15bo7bo9bo21boo47boo26boo12bobbo45boo13boo3bobo55bo28bobb o3boo93boo12bob3o54bobo$86bo10bo4bo26boo47bobo124b3o5b3o14bo24boo91boo 10b3o40bo19boo41boo4boo4boo49boo20boo5b3o4bobo107b3o40bo4b3o8bo19bo$ 85bobo10boo29boo42boo5bo13boo111bo7bo14boo53b3o3b3o53bobbo3boobbobbobo 58bobbo5boo44bobbo70boo13bobbo106bo40bobo3bo29bobo8boo$86bo10boo32bo 41boo5boo12bo253bobo3boobboobboo8boo15boo5boo23bobobo4bobbo32bo11boo 87boo111bo11boo24bo5bo29bo10boo3bo$94bo97bobo194bo56boobo8boo11boo14bo boo5boo23bobbo5bobobbo16bo5boo5bobo22boo187bobo10boo70bo4bobo$92boobo 35b3o58boo195bo56b3o24bo13bo19bo12bo10bo21boo3boo5bobbo21boo188boo88bo $150bo145boo91bo56boo20b3o16bo12boo4bobo12bobo8boobo12bo3boo12bobbo 206boo$91bo31boo4boo19b3o143boo3boo167bo16bobbo10bo5bo26bo12bobo82boo 136boo3bobo$91bo31boo28bo147boo82boo82bo18boo8b3o47bo17bobbo62boo136bo 4bo5boo$91bobbo57boo55boobo171bobbo16bo93bo67boo200bobo3boo5boo$99boo 28boo78boboo171bo18bobo12bobo37boo195boo111boo61boo$90bobboo4boo9bo18b 3o156boo12boo80bo19bo12bo40boo35boobbo5boo148boo174boo$110bo20bo3boo 65boo85bo5boo5bo81boboo5boo23bobbo69boobboo3bo3bobbo297bo35bo14boo$93b oo15bo23b3o65boo82b3o6boo6b3o80boo5boo23bobobo68boo7bo3bobobbo66boo3b oo220b3o36bo13boo$91b3o29boo8boboo149bo18bo113bobbo73b4o5bo54boo16bobb o19boo199bo37b3o$87bo18b3o3b3o4boobboobboo3bobo35boo248boo84boobo33boo 15boo13bo6b3o15bobo11boo6bo19boo6boo118boo30boo15boo$86boboo29bobobbo bboo3bobbo34bo214boo14bo106bo34boo31boo6bo15bo13boo6b3o18bo7bo118bo48b 3o7boo$90bo8boobbo6bo9b3o10boo33bobo214boo6b3o5boo99boo95boo24bo14b3o 5b3o117bobo11boo35boobo5b3o38bo$86bobbobo3boobboo3bo5bo10boo45boo223bo 6bo4bo39bo57bo120boo14bo7bo119boo12bo38bobo3bobobbobboo4b3o3b3o17boobo 33boo9bo$44boo8boo32bobbo3boo7bo5bo19bo262bobo7boboo13boo22bobo3bo49bo 3bo275bobo37bobbo3boobboobboo16bobboo8bo36bobbo3b3oboobboo$40b4o4boo3b obbo32boo9b4o24b3o61boo200boo3bobb3oboo11bobbo22bo3bo11bo33boo5boo272b oobboo39boo8boo12bo6bo3boobboo3bobobbo31bobobo3b4o4boo$40b3oboobboo3bo bobo69bo23boo40bo191boo13bo4bo13bo29b3o8bobo32boo4b3o124bo30boo3bo111b oo6boo59bo6bo7boo3bobbo32b3obo8boo$45bo8bob3o68boo22boo15boo23bobo123b 3o62bobbo31bo41bo37boo126b3o29b3oboboo55boo61bo39bo19bo7b4o9boo33b3o$ 56b3o109bobo23boo123b3o62bobobo23boo5boboo203b3obo22boo4b3o4bo54boo62b obo37b3o$49boo119bo137bo10b3o63bobbo23boo7boo30bo45bobbo124bo3bo8bo12b oo7bo3bo56bo62boo40bo79bobo$49b3o37boo5bobboo11b3o55boo136b3o5b3o70bo 12bo41boo6b3o14boo29b3o125bo3bo5b3o22b3o109boo50boo78b3o$48bobboo35bo bbo3bo3boobboo8b3o10bo184bo4b3o44bo22bobo12bobo4boo33bobo6bobo14boo96b oo16bo43bob3o3bo25bo46b3o62boo4boo123bobboo$48booboo33bobbobo3bo7boo 13boo5bobo182boo4b3o42b3o8boo28bo5bo11boo21bo7boo96bo5boo10bobo5boo8b 3o42b3o4boo13boo12boo42bo70boo20boo51boobbo5boo39boo5boo$44b6o40bo5b4o 17bobbo4bobo64boo160bo5bo11boo35b3o8boo20boo8b3o54bo38bobo3bobo11b3o3b obo11bo5bo36bo21bo5boo5bo44bo16bo57boo15boo36b3o8boobboo3bo3bobbo39bo 5boo$44b3oboobo34boboo28boo6bo4boo18boo40bo119bo25boo12bobo4boo10boo 37bo35boo3boobo42boo8bobo23b3o12bo6bo12boobb3o11boo4bobo39bo14b3o6boo 6b3o57boo56bobo41bo10b3o9boo7bo3bobobbo39bo8boo$39boo8bobbo34bo26boo 15bobo17bo28boo11bobo116bobo23b3o13bo18bo73boo7bo36bo3boo10bo22bob3o 22boo5boo5boo19bo12b3o24bobo13bo18bo57bobo55bo42bobo5boo19b4o5bo42b3o 7bo$40bo8bo63bobo17bo9bo5bobo29bo12boo112boobboo23boboo23boo6bobo79bob o35bobo4bo31bobobo23boo5b3o7boo5boo22b3obo23boobboo143boo42bobo4bobbo 28boobo37boboo5bobo$40bobo7bobo60bo19boo14boo30bobo124boo11bo14bobo25b oo5boobo79b3o36bo37bobbo40b3o5boo23bobobo14bo11boo182boo4bo6boo31bo38b oo7boo$41boo8bo60boo27b3obo36boobboo133b3o12bobbo18bo95boo76boo67boo6b obbo12b3o152boo40bobo15boo$99boo39boboo42boo98bo9bo27bo12boo16bo103boo 106boo31bobbo6boo12bo27bo9bo117bobo29bo9bo17bobo$99boo39boobo142b3o5b 3o26boo20b4o6bo3bo12boo75boo7b3o48boo39boo15boo6boo18boo4boo21boo12bo 13b3o5b3o119bo20boo6b3o7boo19bo58bo$58bo45boo32bob3o23boobo104boo13bo 3bo39boo9boobbo10bo12boo75b3o5boboo48bobo37boo24boo17bobboo15boo21boo 16bo3bo13boo107boo20bo5b3obo27boo12boo42bobo8boo$57bobo44bo61boboo104b o13boo3boo38bo9boobbo8bo86boobbobbobo3bobo52bo20boo16boo42booboo16bo 21bobo14boo3boo13bo129bobo4bo3bo12boo26boo43bo8bobo4bo$42bo5boo8bo18b oo23bobo35bo46boo86bo55bobo3boo5bobbo3boo3b3o84boobboobboo3bobbo51boo 19bobo16b3o4boo35b3o12boo3bobo55bo131boo5bo3bo10bobo21boo59bo3bobo$41b obo4bobo26boo23boo19boo11bo22boo20boo4boo85boo49boo4boo4boo6boo6bo93b oo8boo47boo25b3o17bo3bobbo6boo40bobo4boo4boo49boo138bob3o11bo22bo64bo$ 42bo5bo74boo10bobo21boo20boo141bobbo9boo33boo132boo26boo17bo4boo6bobbo 5boo31b3o10bobbo189b3o35bobo23boo$135boo188boo11bo32bobbo156boo7boo23b obobo4bobbo30boo12boo35bo155bo37boo23boo$86bo52boo172boo22bobo5boo25bo bo156b3o6boo22b3obo5bobobo23boo7boo21boo21bobo126boboo29bo11boo$85bobo 51bobo171boo21boobo5boo23boobo177bo12b3o8bob3o18bo3boo6b3o21boo22b3o 125boobo28bobo10boo$86bo15bo31boo5bo214bo13b3o121bo49boo4bobo24b3o12bo 3bobo148boo70boo49bo$101bobo22boo6boo5boo128boo55boo25bobo12boo121bob oo35boo11bo5bo39bobo3boo77boo68boo47boo18boo52bobo$89bo4b3o5bo24boo53b oo87boo54boo8boo17bo140bo8boobbo21boo8b3o47bo17boo11bo32bo4bo14boo49b oo4boo13bo46boo17bobo37bo10bo4bo32boo$55boo30boo5bobo29bo22boo30bobo 32b3o110bo7boo154bobbobo3boobboo3bo30bo67boo10bobo34boboo63boo5bobo78b o5boo31bobo10boo35boo$55boo31boo4bo16bo38bo30bo36bo276bobbo3boo7bo110b obo30bo3bobo66bo4bo8boo69boo5boo32bo10boo$65bo45b3o36bobo27boo35bo278b oo9b4o112bo32bo3bo81bobo117bo30bo$63bobo48bo36boo589bo117boobo29bobo$ 64boo47boo207boo3bo293bo3boo217bo48boo$97boo97boo104boo19bo3boo281bo9b oo3bo19boo195b3o14bo55b3o$42b3o43boo6boo99boo54boo6boo19bo6boo11bobo 15b3o4boo31boo225boo21bo9boo4b3o15bobo11boo6bo19boo6boo109boo34bo17bo 44bo8bob3o33bobo$42b3obo8boo31boo106bo56bo7bo18b3o6boo13bo15bo7bo31boo 225boo21bo9bo7bo15bo13boo6b3o18bo7bo109bo35boo16bobbo36b3oboobboo3bobo bo22boo9bo$43bobobo3b4o4boo88boo103b3o5b3o14bo24boo337boo24bo14b3o5b3o 46bo61bobo61boo30b4o4boo3bobbo22bobbo3boobbo4bo$44bobbo3b3oboobboo89bo 64boo39bo7bo14boo325b3o3b3o53boo14bo7bo47boo61boo53bobboo4boo34boo8boo 22bobobo3boobobboboo$45boo9bo59b3o12boo4boo11bobo63boo65b3o454bobo134b oo58bobbo8boo$76b3o22bo17bo11bo6bo12boo12boo48bo70bo323bo250boo14boo 57bo$99boobo26bobo6bobo24boo115bo3bo323bo49bo198b3o75bobo$65bobo4bo12b obboo8bo17boo11boo8boobboo100boo25bo8bobobbo323bo48bobo40boo119boo30bo 38boo8boo$53boo9bo7bo11bo3boobboo3bobobbo19boo19boo100boo3boo20b3o4bo bbobo373bo3bo34boo3boo101boo17bo29boboo32b4o4boo3bobbo$52bobbo3boobbo 4bo3bo11bo7boo3bobbo15boo5boo125boo23bo3bo3bo43bo331bo3bo8bo24boo35b3o 58boo8bo18bobo31bo8boobbo18b3oboobboo3bobobo35b3o$15boo34bobobo3boobo bboboo16b4o9boo12boobbobb5o72b3o75boo3bo45b3o8boo322bo3bo5b3o61bo7b3o 49bobo6bobo11boo6boo27bobbobo3boobboo3bo22bo8bob3o34bobbobboo$14b3o10b oo22bobbo8boo9b3o35boobbo3b3o6boo67bo81b3o35bo5bo11bobbo260bo16bo43bo 3bo3bo65bo6bo53bo6boo12bo38bobbo3boo7bo33b3o33bo3bobboo$13bobobbobboo 3bobbo20bo44bo21bo11bobo12boo51bo39boo12boo24bo26bo12bobo4boo274boo5b oo8b3o42bobo4boo25boo12boo31bo48bo22bobo39boo9b4o70b4o8boo$13boobboobb oo3bobo22bobo39b3o22boo11bo6boo4boo10boobboo31bo44bo5boo5bo24bobo23boo bo12bo17bobbo259bobo4bobbo10bo5bo36bo33bo5boo5bo80bo19boobboo25boo99bo 10bo$17boo8boboo61bo38boo5boo11boo3b3o10boo22boo40b3o6boo6b3o17boobboo 23bo26boo5bobbo267bo12boo4bobo12bobo24bo26b3o6boo6b3o77bobboo15boo12b oo15boo17bo90bobo$28b3o61boo56boo4bo5boboo3boboo19bobo40bo18bo17boo11b o14bobobbo14boo6boo5bobo268bo19bo12bo26bobo25bo18bo24b3o51b3o29bobo9b oo23b3o88boo$29boo120boboobb3obobobbobo3bo112b3o12bobbo17boo13bo269bob oo5boo23bobbo23boobboo64boboboo50bo30bo11boo26bo29boo$55bo7boo13bo73b oo3b3o8b5o16boo59bo9bo27bo12boo17bo287boo5boo23bobobo14bo11boo63bobbo 3bo79boo38boo29boo48b3o$54bobo6boo12bobbo28booboo74bobo59b3o5b3o26boo 47boo5boo9boo285bobbo12b3o76boobo70boo23bo53boo45bo$54bobo11boo7bobbo 10bo18bobo51bobboo21bo47boo13bo3bo39boo37boo5boo8boo7bo270boo7boo12bo 27bo9bo43boo70boo4boo16bobo41bo11bo44bobo3bo4bo$17boo7bo28bo12bo10bo 10bobo17bobo26boo23b3o71bo13boo3boo38bo24boo7boo22bo5bobo12bo230boo23b 5o19boo26b3o5b3o45boo74boo15bo3bo38bobbo10bobo23boo18bo4bo10bo$17boo6b obo13boo23bobo21bobo18bo26bobo25bo72bo55bobo3boo19bobobbo15bo18bo12bob oo222boo4boo23bo4bo8boo39bo3bo13boo34bo90bo3bo5booboo18bo10bobbo11boo 23boo22boobbo6bobo$12boo11bobo13boo12boo9boo23bo4boo40bo48boo49boo49b oo4boo4bobbo18bobobo3b3o8bobo6boo26bo203bo17boo19bobo7b3obbo9bo38boo3b oo13bo34b3o89bo9bobo18bobo10bo62b6o6bo$13bo12bo28bobbo20boo15bobo9boo 27boo49boo98bobbo34boo8boo4bobbo5boo22bobbobo186bobo12bobo38boo3bo4bo bboo4boo3bobo55bo34b4o99bobo18bobo74bobbo$13bobo38bo4bo18bobo17bo88bo 95bobo3boo10bobbo30bobbo4bobbo30bobbo189bo12bo39bo4bo5boo5bobbo3boo4b oo49boo20boo11bo3bo90bo8bo14boo4bo42bo33boo$14boo9bo24bobboobooboo17bo 19boo7bo3bo15boobo146boo5boo14bobbo5boo22bobbobo39boo186bobbo23boo7boo 3boo32bo11bobbo70boo12b3o90boboo9boo9bobo15boo29bobo$23b4o22bobobboo5b o15boo27bo4bo15boboo146boo5bo15bobo6boo26bo5bobbo14boo202bobobo23boo5b oboobbobbo31bo12boo85bo73boo17bobo21bo17bobo13bo15bo$23boobbo22bo6bo8b o38bobobo191bo18bo12boboo6boo15booboo200bobbo7bo23bo5bobobo23boo5boboo 21boo71bo75bobo17bo9bo3bo7boo19bo12bobo11bo$22bo4bo3bo30bobbobo36bobob o11boo113boobboo78bobo12bo24bo4bo201boo7boo23bo6bobbo23boo7boo21boo70b o5bo72bo7boboo16bo4bo27boo12bo10bobo$21booboboobbobo23bo9bo35bo4bo12b oo113b4obo9bo38bo11boo17bo37b3o3bo13boo195bo5boo17bobbo7bo12bo112boob 4o73boo6boobo18bobobo47boo3boo32boo$15bo4b4o7bo24bo4bo40bo3bo131bo11bo 37bobo10boo49boo3bo4boo14boo202bo18boo5bobo12bobo82boo25booboo108bobob o45bobo29bobo5boo$14bobo3b4o32bobbo178b3o47bobo52boo6bobbobbobo220b3o 41bo17boo64boo25boo97boo13bo4bo43boo30boo$15bo4b5o32b3o28boo11bobboo 183bo52bobbo6boo4boo18bo187boo74boo90boobb3o93boo14bo3bo43bo32bo$21bo bboo62boo10bobo239bobobbo22boo5bobo186boo167bobo159bobo$22b3o75boo184b oo3boo50bo26boo5bobbo220boo248boobbo11boo28boo50bobo$23bo80boo160boo 19bobbo53boobo12bo17bobbo218bobbo132booboo113bobo10boo29bo6boo33bobo9b o$52boo50bobo3boo62b3o40boo6boo19bo6boo11bobo15b3o6bo11bo18boo20bo12bo bo4boo199boo5boo4bobo16bobobo48boo3boo79bo116boo48boo32bo8bobbo$52boo 45boo5bo4bo64bo40bo7bo18b3o6boo13bo15bo6boo12bo18boo34bo5bo11bobbo183b oboo5boo4boo17bobbo33boo16bobbo19boo172boo81boobbo4bo3bobobo$99boo5boo 3bobo61bo42b3o5b3o14bo24boo29bo5bo61b3o8boo185bo13b3o3bo12bo20boo5bobb o6boo13bo6b3o15bobo11boo6bo19boo6boo122bobo81boobobboboo3bobbo$28boo 82boo106bo7bo15b3o52bo69bo195bo12boo4bobo12bobo17boo5b4o22boo6bo15bo 13boo6b3o18bo7bo8boo106boo4bo5boo39boo20bo18boo8boo$28boo216bo52bo265b obbo10bo5bo40bobbo45boo24bo14b3o5b3o7bo4bo104bo4boo5boo41bo19bo$63bobo 10bo164boo323boo8b3o119b3o15bo7bo117bobo47b3o24bo$54bobo9bo9b3o222b3o 272bo121bo40bo102boo48b3obo8boo22boo$53bo8bobbo13bo129boo29bo3bo459bo 29bobboo141bo12bobobo3b4o4boo4b3o3b3o4b3o10boo$16boo30boobbo4bo3bobobo 12boo30boo97boo3boo23bo4bo458bobo29b3o140b3o13bobbo3b3oboobboo16bobobb obboo3bobbo$16b3o7boo20boobobboboo3bobbo46bo102boo13bo8bobobo459bo3bo 170bo17boo9bo12bo7boobboobboo3bobo$16boobo5b3o24boo8boo34boo11bobo115b 3o5bobobo461bo3bo8bo12boo54boo90boo40bo11boo8boboo22boo9b4o$18bobo3bob obbobboo65bo12boo118bobbo4bo43bo419bo3bo5b3o12boo54bobo56boo53bo19bo 22b3o21bobbo3boo7bo$17bobbo3boobboobboo25bo39bobo63b3o33boo12boo14boo bbo3bo42b3o8boo6boo358bo43bo3bo3bo71bo58bo54b3o41boo19bobbobo3boobboo 3bo$18boo8boo16bo10b3o40boobboo62boo32bo5boo5bo59bo5bo11boo5bobo17bo 322boo6boo8b3o42bobo4boo127bobo11boo44bo65bo8boobbo$47bo8bo39boo6boo 62b3o28b3o6boo6b3o15bobboo20bobo12bobo4boo16b3o17bobo303bo17boo5bobbo 10bo5bo36bo20boo12boo98boo12bo44boo61boboo$45b3o8boo38bo102bo18bo14bob o26bo12bo23boo19bo12b3o274boo12bobo23bo12boo4bobo12bobo24bo17bo5boo5bo 111bobo108bo$94bobo66bob4obo58boobboo23bobbo23boo7boo6boo5boo22b3obo 271b3o13bo24bo19bo12bo26bobo13b3o6boo6b3o104boobboo3boo70boo7bo$42bo 51boo66bob3o62boo11bo14bobobo23boo5boboo5b3o5boo23bobobo269boboo23boo 5boboo4boboo5boo9bo13bobbo23boobboo9bo18bo104boo8bo54b3o13boo6bobo$41b obbo60boo56b3o3bo72b3o12bobbo6boo4boo17bo34boo6bobbo268bobo25boo5bobo 7boo5boo9boboo10bobobo14bo11boo143bobo40bo10b3o9boo11bobo$41bobbo10bo 43boo4boo63bo36bo9bo27bo12boo6bobbobboboo16bo33bobbo6boo269bobbo32bo 25boo4b4o6bobbo12b3o157boo39bobo5boo15bo12bo28bo7boo$43bo10bobo20boo 20boo65bo5boo33b3o5b3o26boo21boo3bobbo16bobbo5boo18boo4boo279boo15b3o 15boo20boo3bo8bo6boo12bo27bo9bo163bobo4bobbo14bobo23boo13bobo6boo$54bo bo20boo15boo71boboo24boo13bo3bo39boo16booboob3o12boo6boo17bobboo302bo 4boo9boo6boo13boobbo6boo21boo26b3o5b3o110boo46boo4bo6boo16boo23boo13bo bo11boo$55bo4boo32bobo67booboobo24bo13boo3boo38bo18bobboobbo39booboo 301bo5b3obbobo3boo6boo10boobo3bo3bo15boo39bo3bo13boo98boo4boo21boo16bo bo15boo53bo12bo$43boo15bobo33bo62boo3boob3o26bo55bobo3boo14bo5bo40b3o 12boo293bobo3boo24bo6bo20bo38boo3boo13bo104boo4boo15boo16bo17bobo22b3o 38bobo$42bobo17bo8b3o22boo60bobo4bobo5boo20boo49boo4boo4boo15bobboo55b obo270boo21boobbooboo23bobo20boo3bobo55bo110bobo22b3o7boo19bo22bo5bo 26bo7boo$42bo19boo10bo82bobo6bo78bobbo27boo15boo6boo31b3o271boo26bobo 25boo4bobo12bobbo3boo6bo48boo109bo24b3o28boo18boboo4bobo22bo4bo$41boo 27bo3bo25boo56bo87boo44bobbo4bobbo30boo301bo5boo6boo18bo13bo13boboo 156boo24b3o41bo6b3o6bo7bo15bo5bo$69bobobbo24bobo65bo66boo23boo5boo23bo bobo4bobobo23boo7boo303bobbo4bobbo31bo12booboboo183b3o37bobo6bo14bobo 9bo4bo$67bobbobo4boo20bo65b4o65boo21boboo5boo23bobbo6bob3o22boo6b3o 268boboo5boo25bobo4bobobo23boo5boboo9boobobo3bobboo176b3o38bo21booboo 7bobo5bobbo$67bo3bo5bo20boo64bo3bo88bo19bo12bo12b3o12bo288bobo6boo23b oobo6bobbo23boo7boo9boo3bo3bobboo142boo32b3o61bobbo8bo6b3o6bo$67bo7bob o86bobbo24boo63bo18bobo12bobo23bobo4boo282bo18bo13b3o11bo12bo30boo3bo bbo146bobo21boo72bo3bo22bobo$68b3o4boo88b3o24boo63bobbo7bobo6bo40bo5bo 11boo270boo10boo4bobo12boo9bobo12bobo27bobbo4bo46boo102bo22bo13bo11boo 45bo27bo$52boo11bo192boo8boo55b3o8boo270boo11bo5bo40bo17boo9bo3bo50boo 102boo21bobo10bobo10boo$52boo10bobo102boo98bo57bo280boo8b3o55bobo7boo 10bobo179boo11boo$64boo103boo447bo58boo210boo$68boo22boobo581bo210bobo 51boo$68bobo21boboo147boo3boo638bo5boo6bo39boo$63boo5bo152boo19bobbo 16boo430boo3boo123boo33boboo22boo5boo5boo49bo$63boo5boo13boo87boo6boo 19bo6boo11bobo15b3o6bo13boo15boo415bobbo19boo102boo34boobo36bobo48boo 12boo$85boo87bo7bo18b3o6boo13bo15bo6boo31boo380boo30bo6b3o15bobo11boo 6bo19boo6boo55bo138boo$175b3o5b3o14bo24boo436boo31boo6bo15bo13boo6b3o 18bo7bo98boo46bo11boo$40bo136bo7bo14boo517boo24bo14b3o5b3o43b3o53boo 44b3o11b3o7boo$40b3o699b3o15bo7bo45bo100bo14boobo5b3o$43bo698bo72bo16b o82boo15bobo3bobobbobboo31bo$42boo787boo98bobbo3boobboobboo29boobo$ 166boo579bo83bobo98boo8boo23b4o5bo$75boo89boo3boo27b3o575boo182boo7bo 3bobobbo$76bo94boo27b3o62b3o411b3o63bob3o23boo3boo156bo25boobboo3bo3bo bbo$76bobo110bo10b3o62bo415bo65boobo8bo13boo105boo29boo23b3o27boobbo5b oo$77boo110b3o5b3o66bo413bo66boboo6b3o120bo16boo14bo25bo$60boo96boo12b oo18bo4b3o44bo459bo43b3obo3bo121bobo17bo12boo25boo$60bo98bo5boo5bo18b oo4b3o42b3o8boo431boo6boo8b3o49boo14boo12boo90boo18bobo$58bobo95b3o6b oo6b3o16boo41bo5bo11boo413bo17boo6boo11bo5bo36bo22bo5boo5bo112boo5bo$ 58boo96bo18bo17boo25boo12bobo4boo10boo6boo390boo12bobo16boo18boo4bobo 39bo15b3o6boo6b3o115boo45b3o$75boo116b3o23b3o13bo18bo6boo17bo371b3o13b o18bo25bo12b3o24bobo14bo18bo114boo6b3o25bo10b3o$76bo7b3o102boo27boboo 23boo6bobo5boo16bobo12boo355boboo23boo6bobo4b3o6boo22b3obo23boobboo 145boobboo3b4o21bobo$41boo20boo11bobo5bo104bobbo9bo14bobo13b3o9boo5boo bo5bo18bo13b3o353bobo25boo5boobo4boo7boo23bobobo14bo11boo120boo17boo 13b4o21bobo$41boo15boo4bo12boo4b3o107bo8b3o12bobbo6boo3boobo24bobo6boo 23boobo352bobbo18bo23boo21bo8bobbo12b3o133bo17bobo8bo3bo20boo4bo$58bob o3bobo100bo9bo12bo4bo9bo12boo6bobb4obbo3bo20boboo5boo25bobo352boo16bo 25b3o21bo9boo12bo27bo9bo96bobo11boo4bo10boboo20bobo15boo$60bo4boobboo 96b3o5b3o13bo3bo8boo21boob5o4boo12boo40bobbo360b4o6bo3bo12boo6bobo20bo bo5boo16boo26b3o5b3o82boo12boo12bo4boo24bo9bo17bobo$60boo7boo84boo13bo 3bo19boo18boo17bobo3bobo11boo35bo5boo360boobbo10bo12boo6boo19boo4bobb oo7boo39bo3bo13boo70boo24bobo29b3o7boo19bo$155bo13boo3boo38bo19boo5boo 18boo26bobo365boobbo8bo44boo4bobboo8bo38boo3boo13bo37boo4boo47boobboo 29b3obo27boo$112b3o41bo55bobo3boo13boo5boo19boo21boobbooboo358boo5bobb o3boo3b3o56boo3bobo55bo37boo5bobo46boo34bo3bo$114bo40boo49boo4boo4boo 13b3o4bo43bobo3boo359boo6boo6bo61boo4boo4boo49boo38bo4bo8boo68boo5bo3b o$41boo27boo41bo91bobbo9boo33boo24bo5b3obbobo3boo353boo33boo6boo18bo 25bobbo102bobo23b3o42bo6bob3o$41bo22boo4boo134boo11bo32bobbo24bo4boo9b oo354bo32bobbo4bobbo15bobo26boo103bo11bo13bobo10b3o29bobo5b3o$39bobo 22boo100bo27boo22bobo5boo25bobo5boo15b3o15boo353bobo5boo25bobo4bobobo 15boo6boo5b3o22boo103boo15bo9bobbo29boo6bo$39boo124b3obb3o21boo21boobo 5boo23boobo5bobbo32bo353boobo5boo23boobo6bob3o22boo5boo23boo100bo3boo 10boobbo13boboo37bo11boo$164b3obo68bo13b3o6bobo25boo5bobo372bo13b3o9b 3o12bo19boo67bo53bo4bo11bobboo9bobbobboo36bobo10boo$152boo9bo4bo67bobo 12boo8boboo23boo5boboo364boo4bobo12boo24bobo17b3o61bobo3bo7b3o44bobbo 15bo10b3o42boo$152boo8boo3bo38bo11boo8bo8bo24b3o13bo372boo11bo5bo40bo 17bobo63bo10b4oboo41bobbo15bo25boboo23boo$56boobo51boo49bo3boo37bobo 10boo7bo35boo12bobo4boo365boo8b3o65boo65bo11boobbo41boo43boobo22bobo$ 56boboo5boo45boo49boo40bobo19b3o48bo5bo11boo363bo148b3o41boo69bo5boo$ 64bobo44bo51b5o38bo78b3o8boo494boo11bobo100boo14boo5boo$49boo13bo222bo 569boo31boo16boo$49boo12boo138boo3bo531bo3boo111bobboobbo25bobo$183boo 19bo3boo9bo519boo3bo19boo91boob4obo26bo62bo$134boo6boo19bo6boo11bobo 15b3o4boo9bo21boo463boo31boo4b3o15bobo11boo6bo19boo6boo44bobbobbo26boo 59b3o$92b3o39bo7bo18b3o6boo13bo15bo7bo9bo21boo463boo17b3o11bo7bo15bo 13boo6b3o18bo7bo48boo87bo$94bo40b3o5b3o14bo24boo575boo24bo14b3o5b3o 138boo$93bo43bo7bo14boo53b3o3b3o507b3o53boo14bo7bo$89bo828boo$39boo48b oo128bo509bo188bo$40bo47bobo128bo509bo49b3o134bobo$40bobo83boo31bo59bo 509bo49b3o39boo93boo$41boo83boo3boo92boo552b3o10bo23boo3boo111boo$131b oo24b3obo62boo556b3o5b3o23boo117bo$147bo8boboo66bo510bo44b3o4bo145bobo $147b3o6boobo567boo8b3o42b3o4boo145boo$82bo35boo12boo16bo3bob3o43bo 524boo11bo5bo68boo12boo87boo$39boo40bobo35bo5boo5bo16boo49b3o8boo6boo 506boo10boo4bobo12boo25bo28bo5boo5bo88bo$40bo39bo35b3o6boo6b3o20bo36bo 5bo11boo4bobbo17bo477bo10bo18bo13b3o23bobo24b3o6boo6b3o83bobo11boo21b oo$27boo11bobo37bo3boo30bo18bo16bo39bobo4boo36bobo12bo463boo8bobo6boo 23boobo23boobboo20bo18bo83boo12bo5boo15boo$28bo12boo36boo3bo66bobo24b 3o12bo23bobbo17bo12boboo460bobo8boboo5boo25bobo14bo11boo135bobo4bobo$ 28bobo51bobbo61boobboo23bob3o22boo6b3o4bobbo5boo26bo505bobbo12b3o144b oobboo5bo$29boobboo47boo63boo11bo14bobobo23boo7boo5bobo5boo22bobbobo 486bo18boo12bo27bo9bo109boo8boo$33boo40bo5boo77b3o12bobbo6boo22boo9bo 32bobbo470boo14bo4b4o24boo26b3o5b3o$75bo4boob3o39bo9bo27bo12boo7boo22b 3o42boo465boo4boo13bobo3booboo13boo39bo3bo13boo$81boobobo38b3o5b3o26b oo21boo4boo17bobo6boo22boo3bo454bo17boo21bo3bo3boo13bo38boo3boo13bo$ 81boo3boo25boo13bo3bo39boo16bobbo17boo6boo22b3oboboo436bobo12bobo37b3o 6boo9boo3bobo55bo97boo28boo$34boo46boobbo26bo13boo3boo38bo18boo42bo7b 3o4bo439bo12bo42boo14boo4boo4boo49boo96boo4boo23bo$28boo4boo41boo4b3o 28bo55bobo3boo13bo44boo8bo3bo3boo430bobbo23boo7boo3boo18b3o12boo9bobbo 152boo23bobo$28boo45bobbo5bo6boo20boo49boo4boo4boo57boo10b3obbobbo429b obobo23boo5boboobbobbo5boo10b3o12bo11boo179boo$74bobbo13boo70bobbo44b oo6boo26bo437bobbo31bo5bobo25boo5bobo22boo$75boo87boo44bobbo4bobbo30bo bbo430boo32bo6boboo23boo5boboo21boo$152boo22b3o5boo4bo18bobobo4bobobbo 22boo5bobbo434boboo25bobbo4b3o13bo$152boo23boo5boo4bobo15b3obo6bo26boo 6bobo433bobboobb3o21boo6boo12bobo82boo106boboo$174boo14boo3bo12b3o9boo bo12bo18bo441boo45bo17boo64boo98boo6boobo$29boo79boo62b3o17bobo25bo12b obo4boo442boobbo5boo6bobo55boo5boo157bobo$28bobo79boo63bobo17bo40bo5bo 11boo430boo3boo11boo64boo158bo14boo$11bo16bo147boo65b3o8boo449bo15boo 46bo160boo13boo$boo8b3o13boo58boo156bo447bo26bobbo$boo11bo5bo66boo598b oo4bobbo22bobobo49bo3boo$13boo4bobo12bobo648boboo5boo23bobbo49boo3bo 19boo$20bo12bo127boo3bo518bo19bo12bo20boo31boo4b3o15bobo11boo6bo19boo 6boo41boo$oo7boo23bobbo103boo19bo3boo14boo501bo12boo4bobo12bobo17boo 31bo7bo15bo13boo6b3o18bo7bo41bobo$oobo5boo23bobobo53boo6boo19bo6boo11b obo15b3o4boo14boo15boo484bobbo10bo5bo89boo24bo14b3o5b3o42bo$3bo15bo15b obbo53bo7bo18b3o6boo13bo15bo7bo31boo485boo8b3o121boo14bo7bo110boo$3bo 14boo16boo55b3o5b3o14bo24boo551bo258bo$obbo7bobo4bobo74bo7bo14boo833bo bo$boo5bobbobbo25boo911boo$10bo3bo26bo41bo739boo29boo$6bobboobboo21boo 3bobo35boobbo739boobo22boo3boo$6booboo25boo4boo34bo5bo112boo8boo618bo 8bo12boo$boo5bo68boobbobo5boo39bo62boobobboboo3bobbo614bo9b3o$obbo74b oo3bo5boo39boo61boobbo4bo3bobobo552boo16bo43boboo4bo121boo$obobo23boo 5boo42b3o47boobo65bo8bobbo534bo17bobbo4boo8b3o43boo4boo13boo12boo91bo$ bobbo23boo5boobo89bobb3o65bobo9bo519bo12bobo24boo11bo5bo58bo5boo5bo90b obo11boo$5bo12bo19bo37boo12boo26bo8bobobo56bo19bobo518boobo12bo17bobbo 16boo4bobo12bo26boo13b3o6boo6b3o73boo12boo12bo$bbobo12bobo18bo38bo5boo 5bo27b3o5bobobo56boo539bo26boo5bobbo5bo18bo12boboo24boo13bo18bo73boo 24bobo$18bo16bobbo35b3o6boo6b3o27bobb3obbo43bo13bobo537bobobbo22boo5bo bo5bobo6boo26bo21bo5boo124boobboo$36boo36bo18bo26boo3boboo42b3o8boo 543bobbo32bo6bobbo5boo10bo11bobbobo14bo10bobo124boo$126boo36bo5bo11boo 13boo529boo41bobbo15b3o4boo6bobbo12b3o9b3o$123bo3bo21boo12bobo4boo25b oo548bobo5boo6boo25bobboobobbo6boo12bo9bob3o13bo9bo$122bobo23b3o13bo 579bo4bo4bobbo5boo6bobbo10b3o3bobbobboo21boo8b4o14b3o5b3o$118boobboo 23boboo23boo5boboo558b3o3bo4bobbo13boo11bo4bobo18boo19bo19bo3bo13boo 63b3obbo20boo$29b3o86boo11bo14bobo25boo5bobo544boo12bobo8booboo26bo8bo 17bo38boo3boo13bo63b3obbob3o11bo4boo4boo$13boo14bobb3o96b3o12bobbo7bo 24bo545bobbo10bobo9boo28boo5boo13boo3bobo55bo63bobbobbob3obboo7boo9boo $13boo14boo4bo60bo9bo27bo12boo6b3o24boo559b5o15boo26bo14boo4boo4boo49b oo60boobbo10boo7b3o$32boboo3bo56b3o5b3o26boo27bo19boo544bobbo12boo16bo bbo5boo13bo3bo26bobbo110bo3bo19boo$34boo3bo44boo13bo3bo39boo17boo18boo 27bo515bobbo5boo22bobbobo4bobbo14bo17bo11boo111b4o6boo$34boo3bo44bo13b oo3boo13boo23bo17boo41bobo3bobo514bobo6boo26bo5bobobbo22boo5bobo22boo 22bo86boo8bo$34bobo48bo33boo20bobo3boo46bo9boo4bo516bo18bo12boboo7bo 26boo5bobbo21boo22bo3b3o80bo$33bobbo47boo15bo16bo16boo4boo4boo45bobo8b o534boo4bobo12bo10boobo12bo17bobbo44bobbo3bo76bobo24boo$34boo64b3o31bo bbo44boo11bo532boo11bo5bo26bo12bobo67bo4bo9boo65bo25bobo$99bobboo31boo 25bo18bobbo543boo8b3o47bo7bo9bobbo9bo38boo3bo8boo44b3o46bo$39boo58bo3b o19boo21boboo5boo4bo20bobo553bo58boo7boo10bobo42bo54bo48boo$21bo17boo 59boobo19boo21bobo6boo4b3o16boobo18boo7boo583boo20bobo37bobboo56bo$6b oo12bobo16boo61boo43bo18bo13b3o18bobbo6bobo605bo38bobbo115bo$5b3o13bo 18bo40boo64boo16bobo12boo22boo7bo645bo115b3o8boo$4boboo23boo6bobo39boo 15bobo34bo11boo17bo36bo9boo601boo3boo145bo5bo11bobbo$3bobo25boo5boobo 55bobbo33bobo10boo59boo608bobbo19boo111bo12bobo4boo$3bobbo91boboo32bob o64boo6bo573boo20b3o7bo6b3o15bobo11boo6bo19boo6boo60boobo12bo17bobbo$ 4boo5bo89bo33bo64bobbo579boo31boo6bo15bo13boo6b3o18bo7bo59bo26boo5bobb o$10bobo26boo60boo98b3obo597bo5bo29boo24bo14b3o5b3o59bobobbo22boo5bobo $9booboobboo21boo91boo3bo67bo597bo5bo54boo14bo7bo61bobbo32bo$10boo3bob o94boo19bo3boo9bo47bobo604bo5bo48boo91boo$4boo3bobobb3o5bo40boo6boo19b o6boo11bobo15b3o4boo9bo21boo23bo762bo3boo22boo$4boo9boo4bo41bo7bo18b3o 6boo13bo15bo7bo9bo21boo24bobbo8boo595b3o48bo3bo95boobob3o22boo$4boo15b 3o15boo23b3o5b3o14bo24boo80bobobo3boobobboboo642bo4bo36boo56bo4b3o7bo$ 5bo32bobbo24bo7bo14boo53b3o3b3o44bobbo3boobbo4bo585boo57bobobo8bo21boo 3boo51boo3bo3bo8boo$4bobo5boo25bobo156boo9bo588bobo58bobobo5b3o21boo 56bobbobb3o10boo$3boobo5boo23boobo107bo61bobo587bo15bo43bo4bobbo90bo 26boo$23bo13b3o108bo657boo8b3o42bo3bobboo81bobbo30bobbo$16boo4bobo12b oo16boo91bo657boo11bo5bo66boo12boo42bobbo5boo22bobbobo$4boo11bo5bo31b oo3boo756boo4bobo12bobo20boobbo26bo5boo5bo43bobo6boo26bo$4boo8b3o43boo 82boo679bo12bo26bobo22b3o6boo6b3o41bo18bo12boboo$14bo129boo17bo641boo 7boo23bobbo23boobboo18bo18bo59bobo12bo$162bobo12bo627boobo5boo23bobobo 14bo11boo79boo17bo$47boo12boo81bo18bo12boboo628bo15bo15bobbo12b3o92boo $48bo5boo5bo81bobo6boo5boo19bo627bo14boo16boo12bo27bo9bo$45b3o6boo6b3o 78bobbo5boo4boo16bobbobo617boo4bobbo7bobo4bobo29boo26b3o5b3o44b3o$45bo 18bo79bobbo12bo17bobbo599bo17bobo4boo5bobbobbo25boo39bo3bo13boo33boo$ 179boo599bobo17b3o12bo3bo26bo38boo3boo13bo29bo3bo$144bobbo618b3o12bo 19boo8bobboobboo21boo3bobo55bo29bo3bo$144boo618bob3o22boo5boo11booboo 25boo4boo4boo49boo29boo18bo18boo$158boo603bobobo23boo5b3o5boo5bo38bobb o80bo18bo18boo$157bobo19boo582bobbo6boo30bobbo44boo94bo5bo$153bo5bo19b oo583boo6bobbo29bobobo23boo5boo23boo82bo$144boo7bo4bo614boo4boo18boo5b obbo23boo5boobo21boo82bo$143bobbo6bo25bo597boobbo17boo9bo12bo19bo$143b obobbo6bo15boo5bobo596booboo25bobo12bobo18bo63boo42b3o$144bo26boo5bobb o582boo12b3o42bo16bobbo63boo$145boobo12bo17bobbo581bobo74boo87bobo$ 147bo12bobo4boo596b3o31boo129boo16boo$161bo5bo11bobbo583boo30bobbo129b o16boo17bo$168b3o8boo582boo7boo23bobobo164bobo$170bo592b3o6boo22b3obo 50boo3boo109bo12b3o$783bo12b3o54bobbo19boo69b3o6boo22b3obo$776boo4bobo 33boo30bo6b3o15bobo11boo6bo19boo6boo20boo7boo23bobobo$764boo11bo5bo34b oo31boo6bo15bo13boo6b3o18bo7bo23boo30bobbo$764boo8b3o97boo24bo14b3o5b 3o23b3o31boo$774bo64b3o57boo14bo7bo24bobo4b3o9boo$841bo106boo4boo3bo7b obo$840bo112boobbobo7bo$954bo5bo22boo$933boo20boobbo23boo$928boo3boo 13boo9bo$844boo82boo17bobbo$826bo17boo101bobobo23boo5b3o$811boo12bobo 16boo102bob3o22boo5boo$810b3o13bo18bo81boo12boo7b3o12bo19boo$809boboo 23boo6bobo81bo5boo5bo22bobo4boo11b3o$808bobo25boo5boobo78b3o6boo6b3o 20bo5bo11bobo$808bobbo113bo18bo27b3o8boo$809boo5bo157bo$815bobo26boo$ 814booboobboo21boo$815boo3bobo$809boo3bobobb3o5bo$809boo9boo4bo$809boo 15b3o15boo$810bo32bobbo$809bobo5boo25bobo$808boobo5boo23boobo$828bo13b 3o$821boo4bobo12boo$809boo11bo5bo$809boo8b3o$819bo! golly-2.5-src/Patterns/Life/Guns/2c5-spaceship-gun-p690.rle0000644000175100001440000007670412156145314020161 00000000000000#C p690 gun for a 2c/5 spaceship. #C Based on a glider synthesis primarily by Noam Elkies. #C Jason Summers, 28 Oct 03 #C (Note: The first gun for this spaceship was built by #C Dave Greene in April 2003 -- see 2c5-spaceship-gun-p416.rle. #C This one was constructed independently.) x = 871, y = 854, rule = B3/S23 21boo$21boo5$844boo$844boo$21b3o$20bo3bo$844bo$19bo5bo817b3o$19boo3boo 816bo3bo$844bo$38b4o799bo5bo$22bo6boo6boobbo14boo783bo5bo$21bobo5boo5b oobbo15boo784bo3bo$21bobo13bobbo802b3o$17bo3bo16boo46boo$14b4o3bo64boo $6boo5b4o4bobbo13boo776boobbobo$6boo5bobbo4bobbo12bobbo768boo4b3obo3bo 12boo$13b4o5boo12boobbo15boo751boo3boo6bo13boo$14b4o19boobbo14boo757bo b5o$17bo20b4o774b3o31boo$86bo742bobo3bobo10bobbo7bo$85b3o728b3o12bo3bo 11bo7boo3bo$51boo32b3o727bob5o5bo11bo7bo6bo5bo$15boo5boo26b4o7boo746b oo3boo6bo3bo3bo5bo3bo6bo7b5o$15boo5boo25bobobo6bobboo11boo5boo3boo719b oo4b3obo3bo3bo11bo8bobbo$49boob3o4b6o11boo5boo3boo726boobbobo8bo3bo14b oo$52boobo5b4o30bo733bobo3bobo$52boobo39boo$16bo5bo63bo3boo4boo8boo10b oo729boo$15b3o3b3o28boobo29bobobboo4b3o7boo10boo728bobbo$14boobbobobb oo27boobo5b4o20bobobboo4boo750bo$14booboobooboo26bobbo4b6o11boo8bo8boo 751bo$17booboo30boo6bobboo11boo17bo665boo85bobo$15bobo3bobo28boo7boo 698boo85bobo$14bobbo3bobbo736boo86bo$17bo3bo740bo$14bobo5bobo66boo668b obo$15bo7bo67boo668bobo82boo3boo$762bo83bo5bo$117b3o$22bo93bo3bo726bo 3bo$21bobo91bo5bo5bobo629boo3boo82b3o10boo$116bo3bo4bo3bo629bobobobo 94bo3bo$19bo5bo91b3o5bo12boo620b5o94bo5bo3boo$22bo94b3o4bo4bo8boo621b 3o95bo3boboobboo$19boo3boo58b3o3b3o32bo623bo12bo96bo5bo$83bobbo3bobbo 31bo3bo617b4o109bo3bo$83boobo3boboo33bobo611boo3boboboo109boo$741boobb obbob3o$19boo3boo720boboboo$15boo5bo724b4o$15boobbo5bo97boo624bo104boo $123boo672boo55boo$21bobo773bo$22bo764boo6bobo$12bo104bo5bo613boo17boo 28bobo5b3o$11boo8bo94b3o3b3o612boo15bobbo18boo7bo6b3o$10boo4boobbobo 25bo67bobooboobo612boo23b3o11boo7bobbobbobbo$oo7b3o4boobbobo25b3o64boo 7boo612bo20bobo3bo19bo6boo$oo8boo4boo3bo29bo63boo7boo611bobo14boo3bobo 3bo20bobo$11boo37boo63b3o5b3o611bobo23boo22boo58b3o3b3o$12bo104b3ob3o 614bo19bo3bo83bobbo3bobbo$18boo3boo27b3o64bobo724boobo3boboo$18boo3boo 27b3o29boo5boo23bobbobobbo$84boo5boo22bobbo3bobbo609boo3boo$20b3o93boo 5boo610bobobobo14boo5boo$20b3o713b5o93boo5boo$21bo28boo3boo680b3o15bo 9bo68boo5boo$51b5o669bo12bo16bo3bobo3bo$52b3o668b4o28bo3bobo3bo$53bo 663boo3boboboo28bobo3bobo$143boo572boobbobbob3o28bo5bo$143boo577bobob oo106b3o3b3o$20boo701b4o107bobbobobbo$20boo703bo107bo3bobo3bo$739bo94b obbobobbo$739bo96bo3bo$834boo5boo$52boo62boo5boo607boo99b3o5b3o3boo5b oo$52boo62boo5boo607boobboo3boo90b3o5b3o3boo5boo$$142b3o$141bo3bo610b oo5boo$140bo5bo609boo5boo$140bo5bo5bo681b3o$143bo6bobo583boo3boo91b3o$ 141bo3bo3bobo11boo668b5o$142b3o3bobbo11boo667boo3boo$143bo5bobo587bo 92boo3boo$150bobo586bo$152bo548boo$701boo$732bo7bo91boo3boo$732boo5boo 91boo3boobboo$148boo582b3o3b3o92b5o3boo$148boo584booboo95b3o$734bo3bo 95b3o$731boo7boo$731boo7boo107bo$79boo620b3o31bobo68boo40b4o$79boo619b o3bo26bobbo3bobbo64boo39boobobo$699bo5bo26b3o3b3o105b3obobbobboo$699b ooboboo141boobobo3boo$142bo5bo545bo153b4o$141b3o3b3o543bobo140bo12bo$ 140boobo3boboo27boo501boo9bo3boo4bo29boo5boo94b3o$178boo501boo9bo3boo 3bobo28boo5boo93b5o$178boo512bo3boo3bobo129bobobobo$143bo3bo30bo514bob o6bo102b3o25boo3boo$143bo3bo29bobo514bo109bo3bo$177bobo623bo5bo$77boo 3boo94bo624booboboo26bo$68bobo8b3o732bo20bobo$68bobbo6bo3bo613boo115bo bo19bobo$59boo10boo6bobo93boo3boo514boo108bo4boo3bo9boo8bo$59boo8bo3b oo5bo94bobobobo623bobo3boo3bo9boo8boo$64boo5boo103b5o624bobo3boo3bo19b oo$63bo4bobbo105b3o626bo6bobo20boo$68bobo107bo12bo622bo$190b4o$189boob obo3boo$141boo5boo38b3obobbobboo497bo5bo$74boo24bobo38boo5boo39boobobo 501b3o3b3o83bo22boo$74boo23bobbo87b4o501bobbooboobbo81bobo6bo14bobbo$ 98boo10boo79bo503b3o5b3o69boo9bo3boo3bobo6b3o$90bo5boo3bo8boo555boo 106boo9bo3boo3bobo5bo3bobo$89bobo6boo5boo560boo117bo3boo4bo6bo3bobo3b oo$75bo5bo6bo3bo6bobbo4bo679bobo14boo$74b3o3b3o6b3o8bobo80boo16boo585b o17bo3bo$73boobbobobboo3boo3boo89boo16boo590booboboo$73booboobooboo26b oo556bo124bo5bo$76booboo29boo555bobo124bo3bo$74bobo3bobo583bo3bo124b3o 6boo5boo$73bobbo3bobbo583b3o$76bo3bo584boo3boo131bo9bo$73bobo5bobo116b 3o600bo3bobo3bo$74bo7bo27b3o86booboo566boo31bo3bobo3bo$110b3o86booboo 566boo32bobo3bobo$109bo3bo85b5o453bobo145bo5bo$198boo3boo451bobbo4bo$ 90boo16boo3boo532boo6boo5boo32boo5boo90boo$90boo118boo435boo4boo3bo9bo 27boo5boo65bo24boo$176b3o3b3o25bobbo441boo11bo100b3o$101boo5boo66bobbo bobbo16b6o7bo6boo433bobbo108bo3bo$100b3o3bo4bo64booboboboo15bo6bo6bo6b oo434bobo107bob3obo$90boo5boboo5bo69boo5boo15bo4boo7bo553b5o$90boo5bo bbo4bo6bo88boo7bobbo455bo$97boboo9bobo97boo456b3o$100b3o559boo3bo3bo$ 74boo5boo18boo97bo461boobbo5bo107bo23boo5boo$74boo5boo95booboo16bobo 464bo5bo102bo4b4o20boo5boo$176bobbobobbo13bo3bo3boo459bo3bo103bo5b4o5b oo$176bobo3bobo13b5o3boo573bobbo5boo$105boo23boo44b3o3b3o12bobobobo 463bo3bo109b4o$105boo23b3o43boo5boo13bo3bo463bo5bo25bo81b4o$120bobo9b oobo5boo33boo5boo481bo5bo23boo82bo$120bo6bo4bobbo5boo28bo4boo5boo13bo 3bo464bo3bo25boo$106bo5bo13bo5boobo29bo3bobo25bobobobo464b3o$105b3o3b 3o7bo4bo3b3o33bo3boo26b5o27boo437bo$105bobooboobo9boo5boo32b3o31bo3bo 27boo473bobo42bo24boo$104boo7boo84bobo503boo40b4o24boo$104boo7boo85bo 505bo32boo5b4o$104b3o5b3o3boo3boo614boo5bobbo$106b3ob3o25boo522bo7bo 75b4o5bo$108bobo8bo3bo14boo520booboo3booboo74b4o4bo$105bobbobobbo6b3o 106b3o518bo$104bobbo3bobbo5b3o504boo34bobobobo$105boo5boo25bo58b3o5b3o 20bobo395boo32bo3bobo3bo66boo$138bobo56booboo3booboo18b5o428bobbooboo bbo66boo$137bo3bo55booboboboboboo17boo3boo428b3o3b3o87b5o$137b5o56bo3b obo3bo18boo3boo429bo5bo87bob3obo$121boo13boo3boo23bo31bobbo3bobbo30boo 388boo79bo47bo3bo6bo5bo$121boo14b5o25bo31b3o3b3o31bobo468bobo46b3o6b3o 3b3o$138b3o24b3o62bo3boo6bo7boo458boo48bo6booboobooboo$139bo89bobobobb obbobbo7boo466bobo45b3o7b3o$229bobobboo6bo419boo5boo47boo$128bo101bo8b obo383boo3boo30boo5boo48bo48bo7bo$126bobo63bo46boo385b5o104booboboo17b oo$118boo4boo64bobo6boo5boo418booboo128boo$118boo4boo65boo6boo5boo21bo 386boo8booboo104bo5bo$105boo5boo10boo102bobo377bo7bobbo7b3o119boo$105b oo5boo12bobo98bo3bo3boo370bo3boo7bo115booboo8boo$128bo98b5o3boo370bo5b o6bo117bo7boo6bo3boo$192bo33bobobobo375b5o7bo124b3o5bo3bobo$190bobo34b o3bo384bobbo126boo6b5o$191boo423boo131boo4b3o$133boo25bo66bo3bo438bo 78boo17boo5boo$133boo25bobo63bobobobo436bo98boo5boo$163boo4boo56b5o 437b3o$163boo4boo24bo31bo3bo390boo$163boo31bo31bobo391boo92boo19bo5boo $160bobo24bo6b3o32bo392boo92boo18b3o4boo$160bo27bo433b3o3b3o76boo3bo6b oo14booboo$186b3o433bobo3bobo76bobo3bo5b3o$134bo5bo8bo472bobbobobbo77b 5o6boo7bo5bobobobo$133b3o3b3o6b3o15boo40bo415booboo80b3o4boo8booboo$ 132bobbooboobbo4b5o14boo39bo508boo17booboo$132b3o5b3o3boo3boo54b3o17b 3o5b3o487bo5bo3booboo$147b5o74booboo3booboo468boo28bo$147bo3bo17bo56b ooboboboboboo468boo16booboboo$148bobo17bo58bo3bobo3bo384boo5boo$149bo 18bo58bobbo3bobbo384booboboboo$228b3o3b3o385bobbobobbo30bo$622b3o3b3o 29bo$149boo13boo3boo489b3o$149boo16bo$164bo5bo$165booboo84boo5boo445bo 26boobo3boboo$155boo9bobo59boo5boo17boo5boo444b3o17boo6bobbo3bobbo$ 155bobo9bo60boo5boo469b5o16boo7b3o3b3o$146b3oboo4b3o8bo494bobo40boo3b oo$146b4obbo4b3o502boo52bo$150boo4b3o504bo51bobo$133boo5boo13bobo556bo boo10boo$133boo5boo13boo45b3o502b3o3booboo10boo$201bobbo502b3o4boboo$ 204bo417boo5boo84bobo$204bo417boo5boo85bo19boo5boo$161boo25boo11bobo 50bo7bo473boo5boo$161boo24bobo$186b3o4boob3o53b3o7b3o$185b3o4bobb4o54b ooboobooboo426bo16bo5boo$177bo8b3o4boo59b3o3b3o426bobo15bo5boo$177bo9b obo65bo5bo415boo10boobo4b3o6b3o$176bobo9boo476boo9boo10booboo3b3o$175b ooboo485b3o21boobo12booboo$174bo5bo384boo98bobboo19bobo13booboo$177bo 132boo253boo99b4o20bo15bobo$174boo3boo13boo114boo356bo26boo3boo5bo$ 162bo5bo25bobo479boo18b5o$161b3o3b3o25b3o478boo19b3o$160boobbobobboo5b o19boo367b3o130bo$159bob4ob4obo4bo19boo367b3o$161b3o3b3o5bo18bobo71bo 7boo286bo3bo136b3o5b3o$160b3o5b3o24bo71boo6bobbo12boo16b3o251bo5bo136b 3o3b3o$266bo8bobboo11boo271bo3bo135bob4ob4obo$177boo88boobo4bobbo30bob o253b3o108bo28boobbobobboo$177boo13boo3boo69b3o6bo30b5o362b3o28b3o3b3o $192boo3boo108boo3boo361b3o29bo5bo$268b3o6bo29boo3boo240bobo140boo$ 194b3o68boboobo4bobbo40boo137boo92bo3bo116boo3boo17boo$183bo10b3o67bo 10bobboo11boo26bobo136boo85boo5bo120boo3boo$183boo10bo68bo3bo6bobbo12b oo17bo3boo6bo7boo213boo4bo4bo128bo$174boobboo4boo79b4o7boo31bobobobbo bbobbo7boo220bo132boo$174boobboo4b3o122bobobboo6bo229bo3bo119bo3boo4b oo8boo$161boo5boo8boo4boo124bo8bobo232bobo118bobobboo4b3o7boo$161boo5b oo13boo134boo354bobobboo4boo$183bo89boo401bo8boo$274bo33b3o147bo226bo 20boo5boo$274bobo7bo23b3o146b3o84boo14boo144boo5boo$275boo7b4o19b5o3b oo139b5o83boo14boo$189boo26bo67b4o5boo10boo3boobboo16boo120bobobobo 212b3o$189boo25boo67bobbo5boo10boo3boo20boo120boo3boo195bo16b3o4boo$ 215boo4boobboo58b4o367boo8bo6bo3bo3boo$214b3o4boobboo57b4o154boobo99bo 99boo8boo4boobbobo4bo5bo$215boo4boo61bo48bo89boo12b3obboobbo3boo6bo85b obo13b3o3b3o76boo7b3o4boobbobo5booboo$205bo10boo88boo3boo19bobo88boo 13boo6bo3boo5bobo83bo3bo12bobbobobbo86boo4boo3bo$204b3o10bo88boo3boo 18bo3bo103b3o3boo10bobo84b3o12bo3bobo3bo86boo15booboo$204b3o100b5o19b 5o104bo3bo13bo3bobo77boo3boo11bobbobobbo88bo14bo5bo$308b3o19boo3boo 120boo3bobbo96bo3bo96boo3boo3bo3bo$202boo3boo99b3o20b5o104bo3bo12boo6b oo6boo85boo5boo94boo3boo4b3o$202boo3boo123b3o104b3o3boo9bobbo3bo3boo4b oo84b3o5b3o104b3o$190bo5bo136bo89boo13boo6bo10boo6boo67bobo22b3o5b3o 95b3o$189b3o3b3o225boo12b3obboobbo15bobbo67bobbo4bo123b3o$188boobbobo bboo6bo138bo97boobo16bobo59boo6boo5boo125bo$187bob4ob4obo4bobo100b3o5b 3o26bobo177boo4boo3bo9bo$189b3o3b3o5boo102b3o5b3o29boo4boo177boo11bo$ 188b3o5b3o4boo13b3o87boo5boo30boo4boo178bobbo$203b3o14bo89bo3bo32boo 185bobo136boo7boo$204bobo12bo88bobbobobbo27bobo326boboo3boobo$205boo 100bo3bobo3bo26bo86bo6bo226boo6bo3bobo3bo$308bobbobobbo113boo6boo225b oo6boobbobobboo$308b3o3b3o112b3o6b3o14bo83boo133b3o3b3o$430boo6boo13b 3o83boo134bo5bo$338boo91bo6bo13bo109booboo$338boo106bo4bobo109bobo$ 253b3o190boo4bo110bobo$255bo52boo5boo128bobo116bo$189boo5boo56bo53boo 5boo15bo5bo$189boo5boo133b3o3b3o110boo222boo5boo$331bobooboobo110boo 222boo5boo$330boo7boo$330boo7boo170boo$330b3o5b3o25boo143boo$332b3ob3o 27boo$334bobo203bo5bo$262bo68bobbobobbo199b3o3b3o$235boo24boo67bobbo3b obbo65boo5boo19boo102bo3bobo3bo$234bobo23b3obo9boo55boo5boo66boo5boo 20boo101bo9bo$233bo6boo17boo13boo158bo104b3o3b3o$224boo7bobbobbobbo17b oo$224boo7bo6boo19bo103b3o283boo5boo$234bobo127bo3bo282boo5boo$235boo 24bo247boo3boo$260boo101bo5bo171booboo$182bo15boo7b3o29b3o5boo10boo13b oo87boo3boo130boo8bo3bo27bobo$180bobo14bobbo4bo4bo11boo15b3o5boo11b3ob o9boo98boo124b3o8b3o24booboobooboo60boo$178boo8boo7bobbo4bo5bo10boo14b o3bo18boo109bo3bo114boo9boobo5b3o24bobbo3bobbo60boo$172boo4boo6bo10bo 3bo8bo26bo5bo18bo103bo4bo5bo8boo35bo67bo5bo4bobbo32bo9bo$172boo4boo9bo 8boo8boo28bo3bo122bobobboobo3bo8boo35boo71bo5boobo32bobbo3bobbo103bo5b o$180bobobbo53b3o123bobo3bo5bo44bobo3boo5boo29boo24bo3bo3b3o36boo5boo 103b3o3b3o$182bobbo12boo8boo62boo57boo5boo26bo5bo3bo29bo7bo13boo5boo 29boo26bo5boo148bobbooboobbo$201bo8bo61boo57boo5boo34boo30boo5boo194bo 40b3o5b3o$186boo7boo8bo5bo10boo141bo40b3o3b3o192booboo$188bo6bo9bo4bo 11boo141bo42booboo$199bo7b3o62b3o133bo3bo93boo5bo92bo5bo$196bobbo72b3o 96boo32boo7boo90boo4bobo$185boo3boo170boo3boobboo32boo7boo95bo3bo90boo boboo$185boo3boo217bobo99bo3bo$186b5o214bobbo3bobbo94b3ob3o101boo$187b obo49boo29boo3boo129b3o3b3o96bo3bo94b4o4boo$239boo30b5o235booboo93b6o 6boo6boo$187b3o82b3o135bo5bo11b3o3b3o26boo3boo42bobo93boboo3bo5b3o5boo $273bo88boo3boo40b3o3b3o9bo3bobo3bo27b3o45bo94bo5bo6boo$260bo147boobbo bobboo7bo3booboo3bo25bo3bo21boo117bo8boo$259bobo146booboobooboo7boboo 5boobo26bobo5boo15bobo7boo116boo$252boo4boboo103bo45booboo12bo7bo29bo 6boo17bo7boo$252boo3booboo103bo43bobo3bobo72b3o$187boo69boboo13bo132bo bbo3bobbo43boo44bo3bo139bo$187boo70bobo14bo134bo3bo45bo3bo11bo30bo3bo 76boo17bo5boo35bo$260bo13b3o87bo7bo35bobo5bobo31boo8bo5bo8bo3boo108boo 8bo8bo5boo20bo14b3o$364boo5boo36bo7bo32boo8bo3boboo6booboboo9b3o85boo 6boo6bo5bo6b3o25b3o$364b3o3b3o61b3o23bo5bo6boo6bo10bo7boo3boobo3boboo 62boo5b3o5bo3boobo33boobo$366booboo63bobo24bo3bo8booboboo9bobo7boo4b3o 3b3o71boo6b6o6booboo23b3o$267boo27bo69bo3bo62bo3bo24boo11bo3boo9boo15b o5bo75boo4b4o7booboo23b3o$267boo26bobo65boo7boo59bo3bo39bo111boo16bobo 25boo$295boobo4boo58boo7boo234bo$295booboo3boo62bobo58boo4b3o87bobo51b oo16booboboo51bo7bo$295boobo44bo19bobbo3bobbo54boo49boo43boo52boo73b4o 3b4o$295bobo46bo19b3o3b3o104bo3bo43bo70bo5bo50bo3bobo3bo$296bo41bo3b3o 131bo5bo157bo13bobbobobbo$283bo52bobo136boobo3bo8boo41bo62booboo4b3o5b 3o23bobo11b3o3b3o$282b3o52boo137bo5bo8boo13boo5boo17boo42boo21bo7b3o3b 3o24boo$281b5o15boo61boo5boo58boo44bo3bo24boo5boo18boo70bob4ob4obo$ 280boo3boo14boo61boo5boo36boo5boo13boo46boo125boobbobobboo12boo$409boo 5boo189b3o3b3o13boo$268bo5bo177boo5boo15bo131bo5bo$267b3o3b3o25b3o148b oo5boo14bobo97boo3boo16boo$266booboobooboo5b3o16b3o170bo3bo97b5o17boo 28bo16boo7boo5boo$265b3o7b3o4b3o190b3o98booboo46bobo13bo4bo5boo5boo$ 431b3o39boo3boo96booboo8boo37bo13bo6bo$267bo7bo154booboo142b3o7bobbo7b o26b3o13bo8bo$283boo14boo3boo124booboo151bo7boo3bo25bo15bo8bo$283boo 15b5o125b5o103bo47bo6bo5bo41bo8bo$301b3o35bo89boo3boo101bo48bo7b5o43bo 6bo$302bo34bobo197b3o47bobbo52bo4bo$289bo48boo82boo123bo41boo16boo5boo 29boo$288bobo129bobbo28b3o3b3o84boo60boo5boo$281boo4boboo128bo7b6o18bo bbo3bobbo84boo$281boo3booboo73bo46boo6bo6bo6bo21bobo173bo3bo10boo$287b oboo74bo45boo6bo7boo4bo21bobo98boo25boo32boo10booboboboo7b5o$267boo5b oo12bobo72b3o54bobbo7boo22bobo17boo71bo7bobbo23boo31b3o9boboo3boobo6bo 4bo5boo$267boo5boo13bo132boo27bobbo3bobbo13boo70bo3boo7bo52boboo5boo3b obbo5bobbo5b3obbo5boo$452bo7bo86bo5bo6bo45boo5bobbo4bobbo3boboo3boobo 7bobboo$548b5o7bo45boo5boboo5boo5booboboboo9boo$303bo60bo191bobbo7b3o 46b3o12bo3bo$296boo4b3o20bo39bo190boo8booboo46boo3bo24boo$296boo3bo3bo 18bobo36b3o87bo112booboo50bobo22bobboo$301booboo18boobo4boo117booboo 91boo17b5o50bobo5boo14b3obbo5boo$301booboo18booboo3boo163bo47bobbo16b oo3boo50bo6boo14bo4bo5boo$324boobo123booboo41bobo145b5o$301booboo18bob o124bo3bo41boo45bo101boo$301booboo19bo42bo83b3o164booboboo$301bo3bo6bo 53bobo90boo84boo72bo5bo$302b3o6b3o46bo6boo90boo86bo21boo5boo5boo35bo3b o$303bo6b5o43bobo214bobbo3bobbo35b3o$309boo3boo13boo28boo215bobbobobbo $329boo213boo3boo28bobo$200boo5boo255bobo77boo3boo16boo8b3ob3o$200boo 5boo163bo90bobbo4bo73b5o17boo6b3o5b3o$311b3o56bobo89boo5boo75bobo26boo 7boo$311b3o57boo81bo5boo3bo8boo82boo15boo7boo$296bo7bo148bobo6boo10boo 70b3o8bobo16bobooboobo$295b4o3b4o23b3o120bo3bo6bobbo89bo6boobboo7b3o3b 3o36boo$295bo3bobo3bo6boo14booboo59bo60b3o8bobo89bobbobbobboboo8bo5bo 37boo$296bobbobobbo7boo14booboo60bo57boo3boo30bo67bo6boo$296b3o3b3o23b 5o58b3o94bobo66bobo$216boo109boo3boo154boo68boo16boo5boo$216boo358boo 5boo$320boo$318bobbo$309boo6bo7b6o194boo25boo$309boo6bo6bo6bo159bo33bo bo24boo$296boo5boo12bo7boo4bo157boo25boobboo6bo$296boo5boo13bobbo7boo 159boo24boobobbobbobbo96boo$199b3o5b3o110boo198boo6bo96boo$199bobboob oobbo244boo39bo29bobo8b3o86boo$200b3o3b3o245boo38bo30boo99bo$201bo5bo 7b3o276b3o39bobo86bobo$214bo3bo105boo23boo184b5o5b3o3b3o71bobo$213bo5b o5bobo96boo14boo7bobbo181boo3boo4bobbobobbo72bo$214bo3bo4bo3bo102b3o6b o4boo7bo6boo172boo3boo3bo3bobo3bo113boo$215b3o5bo105bo3bo5bo6bo6bo6boo 182b4o3b4o113boo$215b3o4bo4bo8boo66boo23booboo6b6o7bo191bo7bo69boo3boo $223bo12boo66boo43bobbo89bobo92bo85bobobobo$200boo21bo3bo101booboo15b oo94bo92boo84b5o$146boo52boo23bobo103bo109bo3bo179b3o42boo$146boo189b oo3boo101bo94bo85bo$338b5o99bobbo196b4o$338booboo100b3o90bobbo93boo6b oobbo14boo$195bobo126bo7bo5booboo193boo95boo5boobbo15boo$148boo45bo3bo 123bobbo3bobbo5b3o299bobbo21boo3boo$185boo12bo127bobo289bobo20boo23b5o $185boo8bo4bo4b3o119bobo97bo191bobbo44booboo$199bo5b3o95b3o21bobo98boo 180boo10boo18boo23booboo$195bo3bo4bo3bo93bo3bo16bobbo3bobbo93boo181boo 8bo3boo15bobbo23b3o$144boo3boo44bobo5bo5bo91bo5bo16b3o3b3o282boo5boo 16boobbo15boo$145b5o54bo3bo75bobobboo11bo3bo33boo272bo4bobbo18boobbo 14boo$145booboo55b3o13bobbo44boo12bo3bob3o4boo5b3o34boo203boo5boo65bob o20b4o$135boo8booboo74bo7b3o34boo13bo6boo3boo5b3o13boo147bobo74boo5boo 118bo$127bo7bobbo7b3o71bo9bo4bo11boo36b5obo27bo148boo201bobo$126bo3boo 7bo80boo8bo5bo10boo39b3o17boo7bobo112bo36bo200boboo10boo$126bo5bo6bo 86bo8bo72bobo6boo114bo235booboo10boo$127b5o7bo83boo8boo53b3o12boo6bo 119b3o102boo132boboo$135bobbo146b5obo10bobbobbobbo223booboo131bobo$ 135boo21boo63boo8boo34boo13bo6boo10boo6bo113bo110b4o132bo193bo$159bo 66bo8bo33boo12bo3bob3o16bobo13boo5boo93bo17bo92boo326bobo$159bobo58boo 8bo5bo47bobobboo17boo14boo5boo91b3o15boo421bobo$147b3o10bobo42boo13bo 9bo4bo207boo419boob3o$141boo4b3o11bo3boo38boo17bo7b3o635bo$141boo3bo3b o14boo54bobbo49boo588boob3o$145bo5bo121b4o289bo297boobo$146booboo122b ooboo285b5o$245bo29boo163bobo119bo5bo$146booboo92bo3bo192boo124boo$ 145bo5bo96bo192bo121bobbo$146bo3bo92bo4bo189bo131boo$147b3o94b5o187bob o129booboo$147b3o113b4o170boo129boobo$262bo3bo296bobbo3bo$157b3o9boo 95bo296b7o$156bo3bo7boo29bo62bobbo$156bo3bo9bo26bobbo362b7o$157b3o25b oo10b5o361bobbo3bo$185boo10b3oboo37boo195boo129boobo$140boo7boo47boobo 38boo194bobo129booboo$140boboo3boobo48boo237bo131boo$140bo3bobo3bo290b o121bobbo$140boobbobobboo6b3o39boo81bobbo154boo124boo$141b3o3b3o6bo3bo 37boobo38b3o26boo15bo153bobo119bo5bo$142bo5bo7bo3bo24boo10b3oboo9boo 26b3o19b3o4boo11bo3bo276b5o$157b3o21bo3boo10b5o10boo25bo3bo17b5o6boo9b 4o279bo297boobo$180boo15bobbo37bo5bo15bobo3bo5b3o589boob3o$180bobo16bo 39bo3bo16boo3bo6boo596bo$240b3o26boo172boo419boob3o$269boo63boo5boo81b 3o15boo421bobo$141boo5boo47boo135boo5boo83bo17bo420bobo$141boo5boo46bo bo15boo13bobo193bo64b4o181boo189bo$195boobo15boo11bo3bo258bo3bo180bobo $184boo10boo29bo203b3o56bo179boo6bo$167boo14booboo9bo22boo4bo4bo201bo 57bobbo174bobbobbobbo7boo$167boo15bobbo32boo5bo48bo155bo39boo196boo6bo 7boo$184bobbo9bo29bo3bo43b3o193boo202bobo$185boo9boo31bobo42b5o194bo 108boo91boo$195boobo15boo57boo3boo70boo229bobbo32boo22boo$185boo9bobo 15boo134boo115boo68boo5boo38bo32bobo20bobo15boo10b3o$184bobbo9boo268bo bo67boo5boo38bo27boo6bo19bo17boo10b3o$167boo15bobbo47boo24bobo203bo 114bobo23boobobbobbobbo19b3o26bo3bo$167boo14booboo47boo24bo3bo9b3o304b obo23boobboo6bo47bo5bo$184boo79bo5boobb3o305bo33bobo49bo3bo$261bo4bo4b oo61bo7bo274boo51b3o$265bo66booboo3booboo4b3o288b3o$261bo3bo9boo71boob oo113bo113boo3boo44boo7bo17boo$261bobo11boo58bobobobo6booboo61boo27b3o 19boo113bo5bo44boo7bobo15boo$333bo3bobo3bo4b5o62boo25bobbo19bobo60boo 111boo$235b3o3b3o89bobbooboobbo3boo3boo60bo30bo82boo51bo3bo$235bobbobo bbo6b3o81b3o3b3o98bo3bo91bo7bo36b3o$234bo3bobo3bo4bo3bo81bo5bo17boo84b o90bobbo3bobbo53boo$234b4o3b4o3bo5bo104bobbo79bobo95bobo47boo7bobo15b oo4b3o$235bo7bo5bo3bo96b6o7bo176bobo47boo7bo17boo3bo3bo$250b3o96bo6bo 6bo6boo168bobo56b3o19bo5bo42boo$250b3o96bo4boo7bo6boo164bobbo3bobbo30b o44bo3bo43boo$334boo14boo7bobbo174b3o3b3o31b4o42b3o$334boo23boo206boo 9b4o41b3o$491boo36bo37boo9bobbo17b3o$251boo238bobo34b3o41bo5b4o17bo17b oo$251boo238bo35b5o40bo4b4o18bobo15boo$330boo187bo6boo3boo44bo8bobo11b oo21boo$306boo5boo13bobbo7boo178bobo5b5o55boo34boo$306boo5boo12bo7boo 4bo180boo3bo3bo55bo$319boo6bo6bo6bo62b3o101boo12boo4bobo$319boo6bo7b6o 65bo101boo12boo5bo$328bobbo73bo113bobo22boo$330boo187bo24boo56boo6boo$ 235boo5boo357bobbo4bobbo$235boo5boo93boo3boo242bo14bobbo4bobbo$338b5o 225boo5boo9b3o12bobbo4bobbo$322boo14booboo206bo18boo5boo12bo12boo6boo$ 322boo14booboo204bobo38bobo24boo5boo$339b3o197bo5boo42bo25boo5boo$538b obo4boo12boo36bo$321b3o47boo164bo3bo3boo12boo35boo$306boo5boo6b3o46bob o164b5o5bobo40boo4bobo$306bobooboobo57bo163boo3boo6bo19bo5bo14boo$307b obobobo223b5o26b3o3b3o$307bobobobo25boo197b3o18boo6boobbobobboo$306bo 7bo4boo3boo13boo198bo19boo6bo3bobo3bo$320b5o242boboo3boobo$321b3o43boo 198boo7boo$322bo43bobo$308booboo22bo32bo$306bobbobobbo19bobo17boo141b oo118booboo$306b3o3b3o19boobo17boo140bobo108boo6bo5bo$307bo5bo20booboo 3boo10bo142bo109boo$334boobo4boo216bo48bo5bo7bo$306boo26bobo26b3o173b oo18b3o6b3o44bobbobobbo$306boo27bo29bo173boo17b5o5b3o44b3o3b3o$364bo 192boo3boo3bo3bo$552bo13bo5bo$551bobo13booboo$277boo5boo13bo251boobo$ 277boo5boo12bobo62b3o88boo83boo10booboo3b3o5booboo$297boboo47bo16bo88b oo83boo10boobo4b3o4bo5bo$291boo3booboo47boo14bo186bobo13bo3bo3boo$291b oo4boboo46bobo202bo15b3o4boo$298bobo267b3o$299bo$312bo$277b3o3b3o25b3o 60boo5boo70b3o122bo34bo5bo$277bobbobobbo7boo15b5o58bobo5bobo68booboo 120bobo32b3o3b3o$276bo3bobo3bo6boo14boo3boo56b3o7b3o67booboo81b3o28b3o 4boboo32bobooboobo$276b4o3b4o85boob3ob3oboo67b5o41boo5boo31bo30b3o3boo boo10boo22booboo$277bo7bo87b5ob5o67boo3boo39bobbo3bobbo31bo36boboo10b oo22booboo$292b3o80bo5bo115bo9bo69bobo34booboo$292b3o16b3o62booboo82b oo32bobbo3bobbo70bo$311b3o149bobbo30booboobooboo59boo3boo$454b6o7bo6b oo25bobo64b5o$453bo6bo6bo6boo24booboo64b3o$290boo3boo14boo62bo5bo71bo 4boo7bo102bo$284bo6b5o15boo61boo5boo71boo7bobbo66boo$283b3o6b3o42boo 34boboo3boobo79boo67boo$282bo3bo6bo42bobo34boboo3boobo150bo$282booboo 19bo31bo3b3o29b3o3b3o115b3o3b3o$282booboo18bobo36bo29b3o3b3o114bo9bo 17bo$305boobo34bo115boo36bo3bobo3bo16boo$282booboo18booboo3boo144boo 37b3o3b3o17bobo85boo5boo$282booboo18boobo4boo184bo5bo64boo40boo5boo$ 277boo3bo3bo18bobo262boo$277boo4b3o20bo$284bo$$246boo5boo184bo$246boo 5boo15bo167bo$269bobo166b3o12bo5bo$268boboo180b3o3b3o$247bo5bo8boo3boo boo109boo68boobo3boboo$246b3o3b3o7boo4boboo109boo37bo54boo$246bobooboo bo14bobo148boo53boo158boo5boo$245boo7boo14bo140boobboo4boo31bo3bo39boo 135boo5boo$245boo7boo27bo127boobboo4b3o30bo3bo39boo$245b3o5b3o6boo18b 3o56boo5boo37boo26boo4boo$247b3ob3o8boo17b5o55boo5boo37boo4b3o24boo10b o$249bobo28boo3boo97boo6b5o23bo10b3o$246bobbobobbo128b3o5bo3bobo33b3o 41b3o14boo$192boo51bobbo3bobbo120bo7boo6bo3boo76booboo13bobbo35boo5boo $192boo52boo5boo119booboo8boo40boo3boo38booboo5b5o7bo34boo5boo$282b3o 102boo40boo3boo38b5o4bo5bo6bo129boo$282b3o88bo5bo93boo3boo3bo3boo7bo 129boo$484bo7bobbo7b3o$373booboboo52bo59boo8booboo$282boo147bobo68boob oo122bo7bo3bo$193bo65boo3boo16boo149boo17boo5boo41b5o121bo8bo3bo$192b 3o147bo5bo84boo17boo5boo16boo22boo3boo120bo$192b3o65bo3bo8boo5bo60bobo 3bobo59boo5boo14b3o$261b3o8b3o3bo3bo57bo3bobo3bo58boo5boo13bobo50bo 149boobo3boboo$190boo3boo64b3o5boboo5bo61bo3bobo3bo80boo50bobo138boo3b oo4b3o3b3o$190boo3boo72bobbo4bo5bo56bo9bo132boobo4boo134bo8bo5bo$269bo boo9boo125b3o3b3o38bobbo23booboo3boo12boo99boo16bo5bo$246boo24b3o66boo 5boo26boo31bobbobobbo37bo27boobo120bo17booboo$193bo6boo8b3o14boo17boo 25boo101boo33booboo39bo3bo23bobo121bobo5boo9bobo$192bobo5boo8bo3bo12b oo199boo25b4o25bo45b3o5b3o67boo5bobo9bo$191boo17bo4bo191bo11bo8boo73b oo24booboo3booboo74b3o8bo$186bobobboo18bo3bo127bo3bo60bo9bo84boo24boob oboboboboo75b3o$184bo3bobb3o40bo5boo99boo67bobobobo113bo3bobo3bo75b3o$ 177boo5bo6b3o17bo3bo16bo3bo3b3o75boo5boo13bo3bobo3boo58bobobobo41bo23b 4o44bobbo3bobbo74bobo24boo$177boo4bo4bo3bobbo14bo4bo20bo5boobo14boo56b oo5boo13bo3bobo64booboo41bobo21boobbo14boo29b3o3b3o75boo25boo$184bo8b oo15bo3bo12boobbo5bo4bobbo14b3o55boo5boo14b3o64bobbo3bobbo37boboo20boo bbo15boo$184bo3bo21b3o14boobboo9boobo5b3o5boboo55b3o3b3o21bobbo57boo5b oo32boo3booboo21bobbo148boo$186bobo51b3o8b3o5b3o56bobo3bobo21boo100boo 4boboo22boo149bobo31boo5boo$240boo8bo3bo5bo57bobbobobbo130bobo173bo14b oo16bobo5bobo$320booboo104bo5bo22bo23boo163bobo15b3o7b3o$249boo3boo 172b3o3b3o44bobbo46boo113b3o4boo10boob3ob3oboo$351boo75bobooboobo27boo 7boo5boobbo15boo29boo112b3o4bobb4o7b5ob5o$343bo5bo3bo76booboo38boo6boo bbo14boo135bo8b3o4boob3o9bo5bo$342bobo3bo5bo75booboo47b4o151bo9bobo19b ooboo$318boo5boo15bobobboobo3bo8boo65booboo201bobo9boo$318booboboboo 16bo4bo5bo8boo162boo106booboo$318bobbobobbo22bo3bo109boo3boo57boo8bo 96bo5bo17boo$318b3o3b3o24boo111b5o55boo6bo5bo98bo20boo8bo5bo$193boo5b oo138boo3boo117booboo47boo5b3o5bo3boobo95boo3boo17boo7boo5boo$193boo5b oo138bo5bo117booboo47boo6boo6b6o121bo6boboo3boobo$251boo212b3o59boo4b 4o121bobo5boboo3boobo$251boo88bo3bo181boo107bo21bobo6b3o3b3o$342b3o72b obo216bo22bo7b3o3b3o$418boo114booboboo94bo$418bo$534bo5bo115boo3boo$ 406boo5boo13boo5boo29boo169boo17bobobobo$209boo195bobooboobo13boo5boo 29boo67booboo97boo18b5o$209boo196bobobobo123bo120b3o$343boo62bobobobo 232bo12bo$325boo16boo61bo7bo229b4o$209bo115boo316boboboo$208bobo427boo bbobbob3o$193bo7bo5bo3bo217bo106boo100boo3boboboo$191booboo3booboo3b5o 196booboo17boo104boo106b4o26boo$206boo3boo117bobo73bobbobobbo14boo152b oo5boo54bo27boo$194bobobobo6b5o117bobbo4bo68b3o3b3o168boo5boo$192bo3bo bo3bo5b3o117boo5boo70bo5bo$192bobbooboobbo6bo73boo5boo28bo5boo3bo8boo 355boo5boo$193b3o3b3o81boo5boo27bobo6boo10boo64boo5boo267bo14boo5boo$ 194bo5bo19bo97bo3bo6bobbo73boo5boo266b4o$220bobo7bobo86b3o8bobo347boob obo$223boo6boo84boo3boo355b3obobbobboo$223boo6bo448boobobo3boo$223boo 388b3o65b4o$193boo25bobo4boo211bobo172bo53bo12bo$193boo25bo6bobo211boo 140bo7bo22bo53b3o$229bo211bo8boo215b5o16boo$229boo219boo129b3o7b3o72bo bobobo15boo$582booboobooboo73boo3boo24bo7bo$188bo394b3o3b3o104bobbo3bo bbo$165boo5boo12bobo263bo131bo5bo109bobo$101boo5boo55boo5boo10boo97boo 5boo159bobo215bo19bo10bobo$101boo5boo68boo4boo96bobbo3bobbo27boo110b6o 14bo215bobo17bobo9bobo$178boo4boo99booboo30boo109bo6bo14b3o212bobo16bo 3bo4bobbo3bobbo$186bobo95bobobobo139bo8bo15bo213bo18b3o6b3o3b3o$188bo 95bobobobo140bo6bo229boo16boo3boo$282bo9bo139b6o201b3o26boo$199bo81bo 11bo345bo28boo$198b3o439bo$181boo14b5o83booboo388bobo$101b3o3b3o7boo 62boo13boo3boobbobo52boo21bobbobobbo385bobbo4bo$100bobbo3bobbo6boo78b 5o6bo50bobo21b3o3b3o291boo91boo5boo$100boobo3boboo86bo3bo6bo49bo6boo 197boo117boo83boo4boo3bo9bo$180b3o15bobo4bobbo49bobbobbobboboo152boobb oo4bobboo24bobbo172boo28boo6boo11bo$180b3o16bo6b3o49bo6boobboo8bo10boo 131booboo6boobo23bo7b5o163boo38bobbo23boo$117bo47bo7bo76boo7bobo16boo 10boo135bobo6bo24bo6bo5bo164bo38bobo23boo$116b3o44booboo3booboo73bobo 8boo16bobo147boo4b3o24bo7boo3bo101bo$115bo3bo78boo49bo212bobbo7bo100b 4o141boo$114bob3obo45bobobobo5boo3boo13boo48boo178boo4b3o27boo107bobob oo140bo$115b5o44bo3bobo3bo4b5o109bo133bobo6bo131boobbobbob3o128bobo6bo bo$164bobbooboobbo5b3o102bo5b4o128booboo6boobo12boo116boo3boboboo129bo bbo5boo$108bo56b3o3b3o7bo102bobo3boboboo127boobboo4bobboo12boo122b4o 121bo11boo$106booboo55bo5bo21bo89bobobbobbob3o8boo269bo12bo109bo9bo3b oo$106booboo16bo65bobo89bo4boboboo9boo281b3o113boo5boo$122bo4b4o62boob o94b4o292b5o111bo4bobbo$105bobobobo10bo5b4o61booboo3boo90bo163b3o126bo bobobo30boo5boo31b3o42bobo$128bobbo5boo54boobo4boo79boo3boo167bo3bo 125boo3boo30boo5boo31bo$106booboo17b4o5boo26boo26bobo36boo5boo41bobobo bo166bo5bo202bo64boo5boo$101boo4b3o17b4o34boo27bo37boo5boo42b5o167bo5b o267boo5boo$101boo5bo18bo156b3o171bo130bo106boo3boo$285bo170bo3bo127bo bo107b3o$135boo5boo313b3o128bobo106bo3bo$135boo5boo14bo299bo130bo108bo bo$97bo59bobo428boo109bo$94b4o58boboo428boo$93b4o53boo3booboo298boo 128boo$86boo5bobbo53boo4boboo298boo260boo7b3o3b3o$86boo5b4o5bo54bobo 125boo412boo19boo6bobbo3bobbo$94b4o4bo55bo126boo412boo27boobo3boboo$ 97bo73bo451boo5boo$135b3o3b3o7boo17b3o449bobbo3bobbo90bo$134bobbo3bobb o6boo16b5o58boo5boo382bobbobobbo90bo$134boobo3boboo23boo3boo57bobooboo bo385bobo93bo$105b5o105b3o15bobobobo384b3ob3o$104bob3obo104bo17bobobob o382b3o5b3o$105bo3bo106bo15bo7bo381boo7boo85boo3boo$106b3o61b3o449boo 7boo88bo$107bo42b3o17b3o450bobooboobo86bo5bo5bo$623b3o3b3o87booboo4boo boo$150bobo41b3o37booboo385bo5bo78boo9bobo5booboo$149b5o17boo23bo35bo bbobobbo468bobo9bo$106boo34bo5boo3boo16boo9bo12bo36b3o3b3o463boo4b3o8b o5bobobobo$106boo32booboo3boo3boo27boo49bo5bo383boo44b3o28b4obbo4b3o$ 140booboo15boo19bobo439boo44bo30b3oboo4b3o15booboo$160bobo76boo429bo 38bobo17b3o4boo$139bobobobo5bo3boo6bo27boo46boo468boo19bo5boo$150bobob obbobbobbo7boo17bobo$140booboo5bobobboo6bo7boo19bo10boo5boo407boo$135b oo4b3o7bo8bobo40boo5boo406bobo8bo129boo5boo$135boo5bo17boo84bo370bo6b oobbobo111boo15boo5boo$245boo361boo7bobbobbobbobobo26boo5boo75bobo$ 191boo51boo4boo356boo7bo6boo3bo27boo5boo74b3o4boo$190bobo50b3o4boobboo 362bobo118b3o4bobb4o$131boo42boo15bo51boo4boobboo363boo110bo8b3o4boob 3o$130bobo8bo34boo56bo10boo379boo3boo98bo9bobo$129bo6boobbobo32bo57b3o 10bo379boo3boo97bobo9boo$120boo7bobbobbobbobobo90b3o391b5o26bo5bo64boo boo$120boo7bo6boo3bo486bobo26b3o3b3o62bo5bo15boo$130bobo98boo3boo418bo bbooboobbo64bo18boo7b3o3b3o$131boo98boo3boo390b3o25bo3bobo3bo61boo3boo 24bobbobobbo$138boo3boo513bobobobo46boo46bo7bo$138boo3boo58boo5boo499b obo$139b5o59bobooboobo22bo420booboo3booboo43bo20bo27bo5bo$140bobo61bob obobo22bobo421bo7bo66bo28booboo$204bobobobo21boo499bo16b3o$140b3o60bo 7bo20boo394boo119booboo$232b3o393boo119booboo$233bobo494boo17b5o$234b oo428bo65boo16boo3boo5bo$205booboo453b3o40bo52bobo$203bobbobobbo450bo 3bo38boo34boo16bobo$140boo22b3o36b3o3b3o449bo5bo37bobo31bobbo15bo3bo$ 140boo24bo3boo32bo5bo450bo5bo70bo7b6o6booboo$165bo3bobo490bo3bo63boo6b o6bo6bo5bo3bo$171bo38boo485boo31boo6bo7boo4bo6b3o$210boo450bo3bo15boo 5boo5boo41bobbo7boo7b3o4boo$661bo5bo14boo5boo7bo42boo23boo$657boobbo5b o14boo5boo$126boo43boo5boo477boo3bo3bo15b3o3b3o$126boo43boo5boo36boo 445b3o16bobo3bobo$215bobo446bo17bobbobobbo79boo$214b3o4boo461booboo72b oo7bobbo$213b3o4bobb4o425bo107bo4boo7bo$205bo8b3o4boob3o420bo4b4o104bo 6bo6bo6boo$126b3o76bo9bobo429bo5b4o104b6o7bo6boo$126b3o75bobo9boo424b oo9bobbo6bo106bobbo$125bo3bo73booboo434boo9b4o5b3o17boo5boo79boo$202bo 5bo443b4o5bo3bo16booboboboo$124boo3boo74bo446bo7bob3obo15bobbobobbo67b oo3boo$202boo3boo452b5o16b3o3b3o68b5o$171b3o3b3o579booboo$170bo3bobo3b o578booboo$169bo3booboo3bo22bo555b3o$169boboo5boobo22bo$171bo7bo23bo 621boo$825boo$$124boo79boo$125bo79boo554boo$122b3o636boo$122bo48b3o 488boo$171bobo488boo$170bo3bo507boo$170bo3bo507boo$$171b3o4boo644b3o$ 178boo643bo3bo$676bo145bo5bo$676boo120bo3boo19bo3bo$672boo3boo111boo4b oobob3o13boo5b3o$182bo494b3o110boo4bo4b3o13boo5b3o$180bobo494boo117bo 3bo$173bo5bobo487boo5boo10bo108b3o29boo$172b3o3bobbo11boo473bobo5bo10b 3o121boo3boo11bobo$171bo3bo3bobo11boo473bo18b3o107b3o10b3o3b3o5boo6bo 7boo$134boo5boo30bo6bobo484boo54boo5boo53boo9bo3bo7b3o7b3obbobbobbobbo 7boo$134boo5boo27bo5bo5bo502boo3boo31boo5boo53boo3boo4bo4b3o4b3o7b3o3b oo6bo$170bo5bo508boo3boo98boo4boobob3o4b3o7b3o8bobo$171bo3bo622bo3boo 6b3o3b3o10boo$172b3o9boo5boo618boo3boo$184boo5boo495bo94boo$687bobo$ 689boo$689boo$688b3o$687bobo92boo3boo$687boo94b5o$82boo638b3o5b3o50boo boo$82boo89boo548b3o3b3o51booboo$173boo546bob4ob4obo50b3o$722boobbobo bboo$133boo7boo579b3o3b3o$133boboo3boobo580bo5bo$39boo41b3o48bo3bobo3b o40boo5boo$39boo41b3o48boobbobobboo40bobooboobo594boo$81bo3bo48b3o3b3o 42bobobobo595bo$135bo5bo43bobobobo596b3o$80boo3boo97bo7bo597bo$39b3o$ 39b3o69boo5boo687boo5boo$38bo3bo68boo5boo687boo5boo$37bo5bo142booboo$ 38bo3bo98boo41bobbobobbo530boo$39b3o99boo41b3o3b3o530boo$185bo5bo616bo 5bo$807b3o3b3o$80boo109boo613boobbobobboo$81bo62boo45boo526bo86booboob ooboo$47boo8b3o14boobb3o55bo5bo3bo569b4o89booboo$47boo8bo3bo12boobbo 56bobo3bo5bo567b4o88bobo3bobo$57bo4bo72bobobboobo3bo8boo550boo5bobbo 87bobbo3bobbo$33boo23bo3bo73bo4bo5bo8boo37bobo510boo5b4o5bo84bo3bo$33b obo77bo3bo24bo3bo46bo3bo518b4o4bo81bobo5bobo$24boobboo6bo21bo3bo50bo3b o26boo47bo525bo87bo7bo$24boobobbobbobbo20bo4bo70boo3boo45b3o4bo4bo8boo $28boo6bo20bo3bo12boo57bo5bo45b3o5bo12boo$33bobo21b3o14boo34boobo3bob oo63bo3bo4bo3bo610bo$33boo76b3o3b3o14bo3bo44bo5bo5bobo529b5o41bo33bobo $112bo5bo16b3o46bo3bo537bob3obo38bobo$185b3o539bo3bo37boo34bo5bo$728b 3o32boo4boo37bo$729bo33boo4boo34boo3boo$771bobo8boo$773bo8bobo$784bo$ 136boo590boo54boo19boo3boo$118boo16boo590boo78bo5boo$118boo619boo22boo 40bo5bobboo$739bobbo18booboo14boo$186boo543b5o7bo17bobbo15boo25bobo$ 186boo542bo5bo6bo17bobbo43bo$121bo608bo3boo7bo18boo53bo$113bo6bobo608b o7bobbo73bobo$112bobo3boo3bo615boo21boo44b3o4boboo$112bobo3boo3bo9boo 626bobbo43b3o3booboo10boo$113bo4boo3bo9boo618boo6bobbo15boo33boboo10b oo$120bobo630boo6booboo14boo34bobo$68bobo3bobo44bo641boo52bo$70bo3bo8b obobboo20booboboo689boo3boo$66bo11bo3bo3bob3o4boo13bo5bo690b5o$65bo3bo 5bo3bo3bo6boo3boo14bo3bo629b3o60b3o$66bo11bo5b5obo21b3o629bo3bo60bo$ 70bo3bo12b3o653bo5bo$68bobo3bobo666bo5bo$87b3o656bo$84b5obo653bo3bo$ 68boo13bo6boo3boo648b3o$68boo12bo3bob3o4boo649bo$83bobobboo$113boo694b oo$113boo630boo62boo$745boo$34bobo14boobo5bo3bo$29bo4bobbo12bobobo4bo 5bo9boo$30boo5boo11bo4bo9bo9boo$25boo8bo3boo9bobobo5bo3boo$25boo10boo 12boobo6b3o$34bobbo$34bobo24b3o$60bo3boo$48boo15bo9boo$48boo9bo5bo9boo $60bo3bo$41bo$40b3o$39b5o$38bobobobo$38boo3boo3$41bo$40bobo$40bobo$41b o$40boo$40boo$40boo! golly-2.5-src/Patterns/Life/Guns/7-in-a-row-Cordership-V-gun.rle0000644000175100001440000025404612156145314021214 00000000000000#C p726 V-gun for seven-engine-in-a-row Cordership: a 21-glider salvo #C meets a 27-glider salvo, following a recipe posted on 7 May 2003. #C The p726 Herschel factories are made from matched pairs of stable #C glider reflectors; they could be replaced by Herschel factories #C of any desired period >726. #C Dave Greene, 30 Jun 2003; Cordership eater from 4 July 2003, #C based on a glider-extraction reaction found by Karel Suhajda. x = 2325, y = 2210, rule = B3/S23 150bo$122b2o24b3o$123bo23bo$112bo10bobo21b2o$110b3o11b2o$94bo14bo$94b 3o12b2o$97bo64b2o$96b2o64b2o3$97b2o$97b2o17b2o$116b2o$167b2o$167b2o4$ 113b2o32b2o$113bo20b2o11b2o$115bo19bo$114b2o16b3o$110b2o20bo$110bo$ 111b3o$113bo3$100b3o$100bo2bo$99bo3bo$99b4o16b2o$100bo18bo$117bobo$ 117b2o$110b2o2bo$105b2o5b2obo$113bobo$198bo$71b2o5b2o90b2o24b3o$72bo5b 2o91bo23bo$72bobo85bo10bobo21b2o$73b2o83b3o11b2o$77b2o63bo14bo$76bobo 63b3o12b2o$77bo67bo64b2o$99b2o43b2o64b2o$76bo14b2o5bobo$76bo14b2o5bo$ 96bobo46b2o$74bo3bo17b2o47b2o17b2o$72b3obob3o11b2o70b2o$67b2o2bo4b2o3b o10bobo120b2o$67bo2bobob2o2b2obo11bo121b2o$69b2ob2o2b2o2bo$70bobob2o2b 2o$70bobobo2bo38bobo$71b2ob4o14b3o22b2o42b2o32b2o$73bo17bobobo13b2o6bo 43bo20b2o11b2o$73bobo13b3o3b3o11b2o52bo19bo$74b2o12bo4bo4bo63b2o16b3o$ 87bob2obo2b2obo23b2o34b2o20bo$87bobob4o2bo24bobo33bo$62bo23b2ob2o4b2o 27bo34b3o$62b3o19bo2bobobo2bo29b2o35bo$65bo18b2o2b2ob4o3b2o$64b2o24bo 8bo19b2o$79b2o9bobo6bobo17bo$79bo11b2o7b2o15bobo$77bobo24b2o6bo4b2o$ 66bo10b2o24bo2bo4bobo53b2o$65bobo5b2o29b2o5bobo53bo$65bobo4bo2bo24b2o 10bo35b2o15bobo$60b2o4bo6b2o24bobo46b2o15b2o$59bobo15b2o7b2o11bo$59bo 17bobo6bobo9b2o$58b2o19bo8bo24b2o$79b2o3b4ob2o2b2o18bo$84bo2bobobo2bo 19b3o2b2o5b2o$54b2o26b2o2b2obob2o23bo3bo5b2o2046bo$55bo25bo2b2o2b2obo 28bobo116bo1934b3o24b2o$55bobo22bob2o2b2obobo29b2o88b2o24b3o1937bo23bo $56b2o22bo3b2o4bo12b2o20b2o85bo23bo1939b2o21bobo10bo$68b2o11b3obob3o 13bobo18bobo74bo10bobo21b2o1961b2o11b3o$68b2o13bo3bo17bo19bo73b3o11b2o 2000bo14bo$101b4ob2o2b2o35b2o34bo14bo2015b2o12b3o$85bo15bo2bobobo2bo 27b2o5bobo34b3o12b2o1961b2o64bo$85bo13b2o4b2ob2o29b2o5bo39bo64b2o1908b 2o64b2o$98bo2b4obobo35bobo38b2o64b2o$85bo11bob2o2bob2obo13b5o17b2o$84b obo10bo4bo4bo12b3obob3o11b2o2084b2o$52b3o30b2o11b3o3b3o8b2o2bo4bo4bo 10bobo43b2o2019b2o17b2o$54bo26b2o17bobobo10bo2bob2obo2b2obo11bo44b2o 17b2o2000b2o$53bo26bobo18b3o13b2obo3b2o2bo76b2o1949b2o$80bo5b2o30bobo 2bo2b2o128b2o1898b2o$78bobo5b2o30bobo4bo14b3o113b2o$78b2o39b2ob4o$101b o19bo17bobobo13b2o$100bobo18bobo13b3obob3o11b2o2017b2o32b2o$100b2o20b 2o12bo5bo3bo55b2o32b2o1938b2o11b2o20bo$104b2o29bobob2o2b2obo23b2o30bo 20b2o11b2o1951bo19bo$104bobo28bob2o2b2o2bo24bobo31bo19bo1965b3o16b2o$ 99b2o5bo3bo23b2o4bo2b2o27bo30b2o16b3o1968bo20b2o$o18bo79b2o5b2o2b3o19b o2bobobo2bo29b2o25b2o20bo1992bo$3o6b2o6b3o93bo18b2o2b2ob4o3b2o51bo 2011b3o$3bo5b2o5bo95b2o24bo8bo19b2o31b3o2008bo$2b2o12b2o109b2o9bobo6bo bo17bo34bo$127bo11b2o7b2o15bobo$60b2o15b2o46bobo32bo4b2o$15b2o42bobo 15b2o35bo10b2o32bobo$10b2o3b2o42bo53bobo5b2o36bobo$10b2o46b2o53bobo4bo 2bo24b2o10bo72bo1970b2o$108b2o4bo6b2o24bobo58b2o23bobo1969bo$107bobo 15b2o7b2o11bo60bo24b2o1970bobo15b2o$107bo17bobo6bobo9b2o41b2o15bobo 1997b2o15b2o$106b2o19bo8bo24b2o26b2o15b2o$20bo106b2o3b4ob2o2b2o18bo$ 18b3o44bo66bo4bobo2bo19b3o$17bo47b3o34b2o26b2o2bo2bob2o23bo$17b2o49bo 34bo25bo2b2o3bobo2105b2o5b2o$46bo20b2o34bobo22bob2o2bob2obo20b2o5b2o 2076b2o5bo$44b3o16b2o39b2o22bo4bo4bo12b2o8bo5b2o2081bobo$43bo19bo52b2o 11b3obob3o13bobo7bobo119bo1851bo114b2o$30b2o11b2o20bo50b2o13b5o17bo8b 2o91b2o24b3o1851b3o24b2o82b2o$30b2o32b2o83b4ob2o2b2o6b2o88bo23bo1857bo 23bo83bobo$149bo2bobobo2bo5bobo77bo10bobo21b2o1855b2o21bobo10bo73bo$ 147b2o2bo4b2o8bo76b3o11b2o1901b2o11b3o11b2o35b2o$146bo2b2o2b2obo31b2o 37bo14bo1933bo10bobo34bobo5b2o$133bo11bob2o2b2obobo23b2o5bobo37b3o12b 2o1931b2o12b3o34bo5b2o$132bobo10bo3bo5bo24b2o5bo42bo64b2o1825b2o64bo3b o33bobo$61b2o70b2o11b3obob3o9b3o18bobo41b2o64b2o1825b2o64b2o2bo34b2o 17b2ob2o$6bo54b2o17b2o47b2o7b3o7bobobo10bobobo17b2o2006b2o36b2o11b3obo b3o$6bo73b2o46bobo7bo22b3o3b3o11b2o2011bo35bobo10bo4bo4bo2b2o$2bo125bo 5b2o3bo9b3o4b2o2bo4bo4bo10bobo46b2o1955b2o4bo37bo11bob2o2b2obobo2bo$2b 3o121bobo5b2o20bo2bob2obo2b2obo11bo47b2o17b2o1917b2o17b2o4b2o49bo2b2o 3bob2o$81b2o43b2o30b2obob4o2bo79b2o1917b2o75b2o2b2obobo$4bobo74bo67bo 9bob2o4b2o13bo117b2o1815b2o112bo15bo4bobo$5b3o60b2o12b3o63bobo8bobobo 2bo15bo117b2o1815b2o111b3o14b4ob2o$7bo43b2o16bo14bo63b2o10b2ob4o2047b 2o13bobobo17bo$6bo44bo14b3o83b2o8bo17bo3bo13b2o2014b2o11b3o3b3o13bobo$ 30b2o20b3o11bo85bobo7bobo13b3obob3o11b2o2026bo3bobo3bo12b2o$31bo22bo 92b2o5bo8b2o12bo4b2o3bo45b3o10b2o32b2o1855b2o32b2o28b2o23bob2o4b2obo$ 28b3o17bo18bo79b2o5b2o20bobob2o2b2obo23b2o23bo9bo20b2o11b2o1855b2o11b 2o20bo27bobo11b3o10bo2b3o4bo$28bo19b3o6b2o6b3o108bob2o2b2o2bo24bobo19b o2bo11bo19bo1881bo19bo29bo27b2o5bob2o23bo$51bo5b2o5bo86bo23b2obob2o2b 2o27bo20b2o11b2o16b3o1883b3o16b2o27b2o16bo12bo2bo3bo2bo19b3o$50b2o12b 2o85b3o19bo2bobobo2bo29b2o19b2o7b2o20bo1887bo20b2o37bo2bo8b2o3b4ob2o2b 2o18bo$154bo18b2o2b2ob4o3b2o44bo2bo6bo1931bo28b2o7b3o9bo8bo24b2o$108b 2o15b2o26b2o24bo8bo19b2o23bo10b3o1925b3o30bo6bo10bobo6bobo9b2o$63b2o 42bobo15b2o41b2o9bobo6bobo17bo26b2o9bo1925bo32bobo4b3o3bo4b2o7b2o11bo$ 58b2o3b2o42bo60bo11b2o7b2o15bobo1997b2o3bo4b2obo25bobo$58b2o46b2o58bob o24b2o6bo4b2o2004b5o29b2o10bo$155bo10b2o24bo2bo4bobo2010b3o3bo30b2o5bo bo$154bobo5b2o29b2o5bobo2014b2o4b2o24bo2bo4bobo$154bobo4bo2bo24b2o10bo 2021bobo24b2o6bo4b2o10b2o$149b2o4bo6b2o24bobo61b2o1911b2o58bo11b2o7b2o 15bobo9bo$68bo79bobo15b2o7b2o11bo63bo1913bo58b2o9bobo6bobo17bo7bobo$ 66b3o44bo34bo17bobo6bobo9b2o44b2o15bobo1913bobo15b2o24b2o24bo8bo19b2o 6b2o$65bo47b3o31b2o19bo8bo24b2o29b2o15b2o1915b2o15b2o25bo18b2o2b2ob4o 3b2o$65b2o49bo51b2o3b4ob2o2b2o18bo6b2o1997b3o19bo2bobo4bo$94bo20b2o56b o2bobobo2bo19b3o2bobo1997bo23b2obob2o2b2o$92b3o16b2o30b2o26b2o4b2ob2o 23bo2bo1867bo156bobo3b2o2bo$91bo19bo32bo11bobo11bo2b4obobo24bob2o1867b 3o24b2o128bobob2o2b2obo$78b2o11b2o20bo30bobo9bobo10bob2o2bob2obo21b2ob o5b2o1866bo23bo102b2o5b2o5b2o12bo4bo4bo$78b2o32b2o31b2o10bo11bo4bo4bo 12b2o9bobo5b2o1865b2o21bobo10bo91b2o5bo5bobo13b3obob3o11b2o$27bobo140b 3o3b3o13bobo6bobobobo117bo1775b2o11b3o94bobo5bo17b2ob2o13b2o$28b2o58b 2o82bobobo17bo6b2o3b2o89b2o24b3o1791bo14bo78b2o4b2ob4o$28bo58bo2bo82b 3o14b4ob2o2b2o9b2o86bo23bo1793b2o12b3o74b2o7bo3bo2bo$87bo2bo65b3o31bo 2bobobo2bo8bobo75bo10bobo21b2o1739b2o64bo77bobo6bobo5b2o$87b5o64bo2b2o 27b2o2b2obob2o11bo74b3o11b2o1762b2o64b2o77bo6b2o4b3o2bo$90b2ob2o14b2o 46b3o27bo2b2o2b2obo34b2o35bo14bo1900b2o26bo2bob2o4b2obo11bo$92bo16b2o 17b2o28bo15bo11bob2o2b2obobo11bo14b2o5bobo35b3o12b2o1899bobo5b2o18b2o 2bo3bobo3bo10bobo$128b2o43bobo10bo3b2o4bo12bo14b2o5bo40bo64b2o1789b2o 57bo5b2o23b3o3b3o11b2o$174b2o11b3obob3o33bobo39b2o64b2o1770b2o17b2o57b obo30bobobo17b2o$170b2o17bo3bo13bo3bo17b2o1878b2o77b2o17b2ob2o9b3o18bo bo$129b2o38bobo33b3obob3o11b2o1831b2o132b2o11b3obob3o8bo14b2o5bo$129bo 39bo5b2o14bo8b2o2bo4b2o3bo10bobo44b2o1784b2o131bobo10bo4bo4bo2b2o18b2o 5bobo$116b2o12b3o34bobo5b2o14bo8bo2bobob2o2b2obo11bo45b2o17b2o1899bo 11bob2o2b2obobo2bo26b2o$99b2o16bo14bo34b2o33b2ob2o2b2o2bo77b2o1912bo2b 2o3bob2o6bo$99bo14b3o73bo12bobob2o2b2o129b2o1862b2o2b2obobo6bobo$78b2o 20b3o11bo74bobo11bobobo2bo131b2o1734b2o32b2o78bo15bo4bobo7b2o$79bo22bo 86b2o13b2ob4o14b3o1850b2o11b2o20bo77b3o14b4ob2o4b2o$76b3o114b2o4b2o5bo 17bobobo13b2o1847bo19bo63b2o13bobobo17bo5bobo$76bo116bobo2bobo5bobo13b 3o3b3o11b2o1848b3o16b2o62b2o11b3o3b3o13bobo5bo5b2o$188b2o5bo2bo8b2o12b o4bo4bo56b2o32b2o1770bo20b2o70bo3bobo3bo12b2o5b2o5b2o79bo18bo$89bo18bo 79b2o5bob2o21bob2obo2b2obo23b2o31bo20b2o11b2o1792bo45b2o23bob2o4b2obo 106b3o6b2o6b3o$89b3o6b2o6b3o83b2obo24bobob4o2bo24bobo32bo19bo1802b3o 45bobo24bo2b3o4bo109bo5b2o5bo$92bo5b2o5bo86bo2bo23b2ob2o4b2o27bo31b2o 16b3o1803bo47bo27b2o5bob2o23bo83b2o12b2o$91b2o12b2o83bobo2b3o19bo2bobo bo2bo29b2o26b2o20bo1852b2o29bo2bo3bo2bo19b3o$190b2o6bo18b2o2b2ob4o3b2o 52bo1900b2o3b4ob2o2b2o18bo25b2o15b2o$149b2o15b2o29b2o24bo8bo19b2o32b3o 1876b2o19bo8bo24b2o24b2o15bobo42b2o$104b2o42bobo15b2o44b2o9bobo6bobo 17bo35bo1877bo11b2o4bobo6bobo9b2o58bo42b2o3b2o$99b2o3b2o42bo63bo11b2o 7b2o15bobo1913bobo7bo7b2o7b2o11bo58b2o46b2o$99b2o46b2o61bobo24b2o6bo4b 2o1854b2o59b2o4bo3bo3bo24bobo$199bo10b2o24bo2bo4bobo1860bo64bobo7bo24b 2o10bo$198bobo5b2o29b2o5bobo1860bobo15b2o45bobo5b2o29b2o5bobo74bo19b3o $198bobo4bo2bo24b2o10bo1862b2o15b2o46bo10b2o24bo2bo4bobo73b2o18bo$193b 2o4bo6b2o24bobo59b2o1888bobo24b2o6bo4b2o10b2o56bobo7bo9bo2bo$109bo82bo bo15b2o7b2o11bo61bo1891bo11b2o7b2o15bobo9bo22bo44b3o8b2o$107b3o44bo37b o17bobo6bobo9b2o42b2o15bobo1891b2o9bobo6bobo17bo7bobo20b3o47bo$106bo 47b3o34b2o19bo8bo24b2o27b2o15b2o1877b2o24bo8bo19b2o6b2o20bo49b2o$106b 2o49bo54b2o3b4ob2o2b2o18bo1900b2o5b2o16bo18b2o2b2ob4o3b2o49b2o20bo$ 135bo20b2o59bo2bobobo2bo19b3o1897b2o5bo14b3o19bo2bobo4bo58b2o16b3o$ 133b3o16b2o33b2o26b2o2b2obob2o23bo128bo1773bobo14bo23b2obob2o2b2o57bo 19bo$132bo19bo35bo25bo2b2o2b2obo125b2o24b3o1658bo114b2o40bobo3b2o2bo 54bo20b2o11b2o$119b2o11b2o20bo33bobo22bob2o2b2obobo21b2o5b2o96bo23bo 1661b3o24b2o82b2o44bobob2o2b2obo53b2o32b2o20b2o$119b2o32b2o34b2o22bo3b 2o4bo12b2o9bo5b2o85bo10bobo21b2o1663bo23bo83bobo30b2o12bo4bo4bo109b2o$ 201b2o11b3obob3o13bobo8bobo88b3o11b2o1685b2o21bobo10bo73bo30bobo13b3ob ob3o11b2o$201b2o13bo3bo17bo9b2o72bo14bo1724b2o11b3o11b2o35b2o52bo17b2o b2o13b2o$191b3o40b4ob2o2b2o7b2o68b3o12b2o1739bo10bobo34bobo5b2o38b2o2b 2ob4o129b2o$193bo24bo15bo2bobobo2bo6bobo71bo64b2o1685b2o12b3o34bo5b2o 38bo2bo3bo2bo128bo2bobobo$192bo25bo13b2o4b2ob2o9bo71b2o64b2o1632b2o64b o3bo33bobo45b2obo5b2o75b2o50b2o2bobo$150b2o79bo2b4obobo32b2o1748b2o64b 2o2bo34b2o17b2ob2o24bo4b3o2bo49b2o4b2o17b2o42b2o5bo5b3o$150b2o17b2o47b o11bob2o2bob2obo24b2o5bobo1819b2o36b2o11b3obob3o22bob2o4b2obo11bo37bo 4b2o61b2o6bo6b2o$169b2o46bobo10bo4bo4bo25b2o5bo51b2o1769bo35bobo10bo4b o4bo2b2o18bo3bobo3bo10bobo35bo76bo$218b2o11b3o3b3o31bobo51b2o17b2o 1743b2o4bo37bo11bob2o2b2obobo2bo19b3o3b3o11b2o36b2o75bo$214b2o17bobobo 11b5o17b2o71b2o1724b2o17b2o4b2o49bo2b2o3bob2o23bobobo17b2o34bo2b2o69bo b2o$170b2o41bobo18b3o10b3obob3o11b2o126b2o1673b2o75b2o2b2obobo25b3o18b obo33bo3bo68bo3b2o$170bo42bo5b2o21b2o2bo4bo4bo10bobo125b2o1622b2o112bo 15bo4bobo26bo14b2o5bo34b3o12b2o56bo2bobo$157b2o12b3o37bobo5b2o21bo2bob 2obo2b2obo11bo1750b2o111b3o14b4ob2o42b2o5bobo34bobo10bo16b2o40b2o2b2o$ 140b2o16bo14bo37b2o31b2obo3b2o2bo1860b2o13bobobo17bo52b2o35b2o11b3o14b o41b2ob2o$140bo14b3o76bo10bobo2bo2b2o1861b2o11b3o3b3o13bobo30bo73bo11b 3o20b2o21bobo$119b2o20b3o11bo77bobo9bobo4bo14b3o71b2o32b2o1751bo3bobo 3bo12b2o30bobo84bo22bo23bo$120bo22bo89b2o11b2ob4o88bo20b2o11b2o1662b2o 32b2o28b2o23bob2o4b2obo44b2o108b3o$117b3o117b2o9bo17bobobo13b2o57bo19b o1675b2o11b2o20bo27bobo24bo2b3o4bo40b2o114bo$117bo119bobo8bobo13b3obob 3o11b2o56b2o16b3o1689bo19bo29bo27b2o5bob2o23bo14bobo$232b2o5bo9b2o12bo 5bo3bo64b2o20bo1692b3o16b2o27b2o29bo2bo3bo2bo19b3o14bo5b2o$133bo18bo 79b2o5b2o21bobob2o2b2obo23b2o39bo1716bo20b2o49b2o3b4ob2o2b2o18bo16b2o 5b2o79bo18bo$133b3o6b2o6b3o109bob2o2b2o2bo24bobo39b3o1735bo28b2o19bo8b o24b2o103b3o6b2o6b3o$136bo5b2o5bo87bo23b2o4bo2b2o27bo41bo1732b3o30bo 17bobo6bobo9b2o121bo5b2o5bo$135b2o12b2o86b3o19bo2bobobo2bo29b2o1773bo 32bobo15b2o7b2o11bo120b2o12b2o$240bo18b2o2b2ob4o3b2o1833b2o4bo32bobo$ 193b2o15b2o27b2o24bo8bo19b2o1817bobo32b2o10bo46b2o15b2o$148b2o42bobo 15b2o42b2o9bobo6bobo17bo1818bobo36b2o5bobo45b2o15bobo42b2o$143b2o3b2o 42bo61bo11b2o7b2o15bobo1819bo10b2o24bo2bo4bobo64bo42b2o3b2o$143b2o46b 2o59bobo32bo4b2o53b2o1776bobo24b2o6bo4b2o10b2o22b2o23b2o46b2o$241bo10b 2o32bobo58bo1719b2o52b2o4bo11b2o7b2o15bobo9bo23bobo$240bobo5b2o36bobo 39b2o15bobo1720bo52bobo3b2o9bobo6bobo17bo7bobo23bo$240bobo4bo2bo24b2o 10bo40b2o15b2o1721bobo15b2o24b2o7bo16bo8bo19b2o6b2o$235b2o4bo6b2o24bob o1792b2o15b2o25bo18b2o2b2ob4o3b2o$153bo80bobo15b2o7b2o11bo1835b3o19bo 2bobo4bo122bo$151b3o44bo35bo17bobo6bobo9b2o1835bo23b2obob2o2b2o75bo44b 3o$150bo47b3o32b2o19bo8bo24b2o136bo1708bobo3b2o2bo72b3o47bo$150b2o49bo 52b2o3b4ob2o2b2o18bo10b2o5b2o90b2o24b3o1708bobob2o2b2obo70bo49b2o$179b o20b2o57bo4bobo2bo19b3o8bo5b2o91bo23bo1568bo115b2o5b2o5b2o12bo4bo4bo 70b2o20bo$177b3o16b2o31b2o26b2o2bo2bob2o23bo8bobo85bo10bobo21b2o1567b 3o113b2o5bo5bobo13b3obob3o11b2o62b2o16b3o$176bo19bo33bo25bo2b2o3bobo 34b2o83b3o11b2o1593bo22bo94bobo5bo17b2ob2o13b2o63bo19bo$163b2o11b2o20b o31bobo22bob2o2bob2obo38b2o63bo14bo1608b2o20b3o11bo82b2o4b2ob4o94bo20b 2o11b2o$163b2o32b2o32b2o22bo4bo4bo12b2o24bobo63b3o12b2o1628bo14b3o76b 2o7bo3bo2bo94b2o32b2o$243b2o11b3obob3o13bobo24bo67bo64b2o1575b2o16bo 14bo60bobo6bobo5b2o$243b2o13b5o17bo46b2o43b2o64b2o1592b2o12b3o61bo6b2o 4b3o2bo$276b4ob2o2b2o32b2o5bobo1650b2o64bo41b2o26bo2bob2o4b2obo11bo$ 276bo2bobobo2bo32b2o5bo1652b2o64b2o40bobo5b2o18b2o2bo3bobo3bo10bobo$ 274b2o2bo4b2o39bobo46b2o1714bo5b2o23b3o3b3o11b2o72bo$194b2o77bo2b2o2b 2obo18b2ob2o17b2o47b2o17b2o1610bobo2b2o78bobo18b3o9bobobo17b2o73bo3b2o $194b2o17b2o45bo11bob2o2b2obobo16b3obob3o11b2o70b2o1610bo2b2o35b2o44b 2o17bobobo9b3o18bobo57b2o7b2o4b2o2b2o$213b2o44bobo2b2o6bo3bo5bo12b2o2b o4bo4bo10bobo120b2o1559bo2b2o2bo13b2o17b2o48b2o11b3o3b3o8bo14b2o5bo57b 2o14b2o$260b2o2bobo6b3obob3o13bo2bobob2o2b2obo11bo121b2o1560b2o2bobo 13b2o66bobo10bo4bo4bo2b2o18b2o5bobo48b2o14b2o5bo$256b2o6bo10bobobo17b 2obo3b2o2bo1665b2o118bo11bob2o2bob2obo2bo26b2o48bo21bo$214b2o39bobo40b obob2o2b2o1666b2o131bo2b4obob2o6bo72b3o2b2o7bo$214bo40bo5b2o13b3o19bob o4bo15bo1772bo13b2o4b2obo6bobo73bo3bo7b2o$201b2o12b3o35bobo5b2o36b2ob 4o14b3o66b2o32b2o1669bo15bo2bobobo7b2o74b3o12b2o$184b2o16bo14bo35b2o 46bo17bobobo13b2o50bo20b2o11b2o1645bo39b4ob2o4b2o80bobo10bo16b2o$184bo 14b3o74bo24bobo13b3o3b3o11b2o52bo19bo1582b2o32b2o38bobo6b2o13bo3bo17bo 5bobo81b2o11b3o14bo$163b2o20b3o11bo75bobo24b2o12bo3bobo3bo63b2o16b3o 1583b2o11b2o20bo39b2o6b2o11b3obob3o13bobo5bo5b2o91bo11b3o20b2o$164bo 22bo87b2o38bob2o4b2obo23b2o34b2o20bo1598bo19bo61bo3b2o4bo12b2o5b2o5b2o 79bo18bo4bo22bo$161b3o115b2o34bo4b3o2bo24bobo33bo1621b3o16b2o35b2o23bo b2o2b2obobo106b3o6b2o6b3o28b3o$161bo117bobo8bo23b2obo5b2o27bo34b3o 1620bo20b2o30bobo24bo2b2o2b2obo109bo5b2o5bo33bo$274b2o5bo8b3o19bo2bo3b o2bo29b2o35bo1642bo30bo27b2o2b2obob2o23bo83b2o12b2o$175bo18bo79b2o5b2o 10bo18b2o2b2ob4o3b2o1701b3o30b2o29bo2bobobo2bo19b3o$175b3o6b2o6b3o97b 2o24bo8bo19b2o1680bo58b2o3b4ob2o2b2o18bo25b2o15b2o$178bo5b2o5bo115b2o 9bobo6bobo17bo1719b2o19bo8bo24b2o24b2o15bobo42b2o$177b2o12b2o114bo11b 2o7b2o15bobo1720bo17bobo6bobo9b2o58bo42b2o3b2o$305bobo32bo4b2o1721bobo 15b2o7b2o11bo58b2o46b2o$235b2o15b2o40bo10b2o32bobo53b2o1672b2o4bo6b2o 24bobo$190b2o42bobo15b2o39bobo5b2o36bobo53bo1678bobo4bo2bo24b2o10bo$ 185b2o3b2o42bo58bobo4bo2bo24b2o10bo35b2o15bobo1626b2o50bobo5b2o29b2o5b obo$185b2o46b2o53b2o4bo6b2o24bobo46b2o15b2o1628bo51bo10b2o24bo2bo4bobo $287bobo15b2o7b2o11bo1695bobo15b2o43bobo24b2o6bo4b2o10b2o66bo$287bo17b obo6bobo9b2o1696b2o15b2o45bo11b2o7b2o15bobo9bo22bo44b3o$286b2o19bo8bo 24b2o1726bo18b2o9bobo6bobo17bo7bobo20b3o47bo$307b2o3b4ob2o2b2o18bo 1726bobo2b2o24bo8bo19b2o5b3o20bo49b2o$195bo116bo4bobo2bo19b3o2b2o5b2o 1711bo2bo3bo18b2o2b2ob4o3b2o24b3o22b2o20bo$193b3o44bo41b2o26b2o2b2obob 2o23bo3bo5b2o54bo1657b2ob3o19bo2bobobo2bo30b2o26b2o16b3o$192bo47b3o40b o25bo2b2o3bobo28bobo58bo57bo1595b2o5bo24b2ob2o4b2o27bo29bo19bo$192b2o 49bo39bobo22bob2o2b2obobo29b2o58b3o27b2o24b3o1595b2o5bob2o22bobob4o2bo 54bo20b2o11b2o8bo$221bo20b2o40b2o22bo4bo4bo12b2o20b2o85bo23bo1603bobob 2o22bob2obo2b2obo53b2o32b2o7b2o$219b3o16b2o56b2o11b3obob3o13bobo18bobo 74bo10bobo21b2o1487bo114b2o13b2o12bo4bo4bo96b3o$218bo19bo57b2o13b2ob2o 17bo19bo73b3o11b2o1510b3o108b2o16bobo13b3o3b3o11b2o86bo2bobo$205b2o11b 2o20bo80b3o5b4ob2o2b2o35b2o34bo14bo1529bo22bo84bobo15bo17bobobo13b2o 86b2obobo$205b2o32b2o82bo5bo2bo3bo2bo27b2o5bobo34b3o12b2o1527b2o20b3o 11bo67bo5bo10b2o2b2ob4o14b3o105b3o$213b3o106bo4b2o5bob2o29b2o5bo39bo 20bo43b2o1495bo14b3o11b2o35b2o13b2o17bo2bobobo2bo$216b2o108bo2b3o4bo 14b3o18bobo38b2o18bo3bo41b2o1495b2o16bo10bobo34bobo5b2o6b2o18b2obob2o 2b2o75b2o$211b2obob2o95bo11bob2o4b2obo13bobobo17b2o58bo1560b2o12b3o34b o5b2o14bo12bob2o2b2o2bo49b2o4b2o17b2o$166bobo42bo2b4o94bobo10bo3bobo3b o12b3o3b3o11b2o61b2o5b2o1500b2o64bo3bo33bobo18b3o11bobob2o2b2obo11bo 37bo4b2o$167b2o42bo4bo96b2o11b3o3b3o8b2o2bo4bo4bo10bobo43b2o14bo8bo 1500b2o64b2o2bo34b2o17bobobo11bo4b2o3bo10bobo35bo$167bo44b4o20b2o71b2o 17bobobo10bo2bob2obo2b2obo11bo44b2o16bobo4bo1571b2o36b2o11b3o3b3o10b3o bob3o11b2o36b2o$214b2o3bobo14b2o17b2o51bobo18b3o13b2obob4o2bo72bo2bo3b 3o1573bo35bobo10bo3bobo3bo2b2o7bo3bo17b2o34bo2b2o$220b2o33b2o51bo5b2o 14bo15bob2o4b2o13bo59b2o2bo50b2o1519b2o4bo37bo11bob2o4b2obo2bo29bobo 33bo3bo$220bo85bobo5b2o30bobobo2bo15bo61b3o50b2o1500b2o17b2o4b2o49bo2b 3o4b2o11bo14b2o5bo34b3o12b2o$306b2o39b2ob4o78bo1553b2o75b2o5bobo12bo 14b2o5bobo34bobo10bo16b2o$256b2o71bo19bo17bo3bo13b2o1548b2o128bo2bo3bo 35b2o35b2o11b3o14bo$256bo71bobo18bobo13b3obob3o11b2o1548b2o128b4ob2o 14bo73bo11b3o20b2o$243b2o12b3o68b2o20b2o12bo4b2o3bo55b2o32b2o1566b2o 13b2ob2o17bo15bobo84bo22bo$226b2o16bo14bo72b2o29bobob2o2b2obo23b2o30bo 20b2o11b2o1566b2o11b3obob3o13bobo16b2o108b3o$226bo3bo10b3o88bobo28bob 2o2b2o2bo24bobo31bo19bo1591bo4bo4bo12b2o13b2o114bo$205b2o20b4o10bo85b 2o5bo3bo23b2obob2o2b2o27bo30b2o16b3o1503b2o32b2o28b2o23bob2o2b2obobo 22b2obobo$206bo40bo79b2o5b2o2b3o19bo2bobobo2bo29b2o25b2o20bo1505b2o11b 2o20bo27bobo24bo2b2o3bobo22b2obo5b2o$203b3o21b4o6b2o6b3o93bo18b2o2b2ob 4o3b2o51bo1540bo19bo29bo27b2o2b2obob2o24bo5b2o79bo18bo$203bo23bo3bo5b 2o5bo95b2o24bo8bo19b2o31b3o1538b3o16b2o27b2o29bo4bobo2bo19b3ob2o84b3o 6b2o6b3o$230b2o12b2o109b2o9bobo6bobo17bo34bo1540bo20b2o49b2o3b4ob2o2b 2o18bo3bo2bo86bo5b2o5bo$355bo11b2o7b2o15bobo1597bo28b2o19bo8bo24b2o2bo bo86b2o12b2o$288b2o15b2o46bobo24b2o6bo4b2o1595b3o30bo17bobo6bobo9b2o 18bo$243b2o42bobo15b2o35bo10b2o24bo2bo4bobo1600bo32bobo15b2o7b2o11bo 45b2o15b2o$238b2o3b2o42bo53bobo5b2o29b2o5bobo1634b2o4bo6b2o24bobo43b2o 15bobo42b2o$238b2o46b2o53bobo4bo2bo24b2o10bo1640bobo4bo2bo24b2o10bo51b o42b2o3b2o$336b2o4bo6b2o24bobo58b2o1591bobo5b2o36bobo50b2o46b2o$189bo 145bobo15b2o7b2o11bo60bo1593bo10b2o32bobo$187bobo145bo17bobo6bobo9b2o 41b2o15bobo1604bobo32bo4b2o10b2o$188b2o144b2o19bo8bo24b2o26b2o15b2o 1547b2o58bo11b2o7b2o15bobo9bo$248bo106b2o3b4ob2o2b2o18bo1594bo58b2o9bo bo6bobo17bo7bobo$246b3o44bo66bo2bobobo2bo19b3o11bo1579bobo15b2o24b2o 24bo8bo19b2o6b2o74bo$245bo47b3o34b2o26b2o4b2ob2o23bo10bo1581b2o15b2o 25bo18b2o2b2ob4o3b2o46bo2bo8bo44b3o$245b2o49bo34bo25bo2b4obobo35b3o 117bo1502b3o19bo2bo3bo2bo49b4o8b3o47bo$274bo20b2o34bobo22bob2o2bob2obo 20b2o5b2o98b2o24b3o1502bo23b2obo5b2o53bo4bo49b2o$272b3o16b2o39b2o22bo 4bo4bo12b2o8bo5b2o99bo23bo1530bo4b3o2bo46b2o2b2o5b2o20bo$271bo19bo52b 2o11b3o3b3o13bobo7bobo93bo10bobo21b2o1529bob2o4b2obo60b2o16b3o$258bobo 10b2o20bo50b2o13bobobo17bo8b2o91b3o11b2o1525b2o5b2o5b2o12bo3bobo3bo49b 2o10bo19bo$257bo2bo31b2o66b3o14b4ob2o2b2o6b2o71bo14bo1428bo112b2o5bo5b obo13b3o3b3o11b2o38b2o7bo20b2o11b2o$257bo2bo116bo2bobobo2bo5bobo71b3o 12b2o1427b3o115bobo5bo17bobobo13b2o34bo2b2o8b2o32b2o$258b2o115b2o2b2ob ob2o8bo75bo64b2o1377bo22bo91b2o4b2ob4o14b3o$374bo2b2o2b2obo31b2o51b2o 64b2o1376b2o20b3o11bo46b3o26b2o7bobo4bo15bo$203bobo155bo11bob2o2b2obob o23b2o5bobo1516bo14b3o46bo26bobo6bobob2o2b2o$204b2o154bobo10bo3b2o4bo 9bo14b2o5bo1518b2o16bo14bo28b3o27bo6b2obo3b2o2bo$204bo57bo26b2o70b2o 11b3obob3o9b3o18bobo54b2o1479b2o12b3o35b2o26bo2bobob2o2b2obo11bo$260bo b3o24b2o17b2o47b2o17bo3bo10bobobo17b2o55b2o17b2o1407b2o64bo32bo5bobo5b 2o18b2o2bo4bo4bo10bobo66b2o$258b4o2bo43b2o36bo9bobo30b3o3b3o11b2o78b2o 1407b2o64b2o29b3o7bo5b2o23b3obob3o11b2o48b2o17b2o$258bo2b3o81b2o9bo5b 2o14bo5b2o2bo3bobo3bo10bobo128b2o1451b3o9bobo30b2ob2o17b2o44b2o$258b2o 3bo81bobo6bobo5b2o14bo5bo2bob2o4b2obo11bo129b2o1452b2o10b2o17b5o30bobo $260b3o46b2o43b2o30b2o4b3o2bo1565b2o45b2o11b3obob3o23b2o5bo$260b3o46bo 67bo9bobo5b2o1547b2o17b2o44bobo10bo4bo4bo2b2o18b2o5bobo40b2o$296b2o12b 3o35b4o24bobo8bo3bo2bo1549b2o64bo11bob2o2bob2obo2bo26b2o41bo$279b2o16b o14bo34b3o2bo23b2o10b2ob4o91b2o32b2o1371b2o128bo2b2o3bob2o6bo61b3o12b 2o$279bo14b3o50bo3bo28b2o8bo17b2ob2o13b2o58bo20b2o11b2o1371b2o129b2o2b o2bobo6bobo60bo14bo16b2o$258b2o20b3o11bo53bo2bo28bobo7bobo13b3obob3o 11b2o60bo19bo1500b3o14bo4bobo7b2o76b3o14bo$259bo22bo65b3o24b2o5bo8b2o 12bo4bo4bo71b2o16b3o1518b4ob2o4b2o82bo11b3o20b2o$209bo46b3o17bo18bo79b 2o5b2o20bobob2o2b2obo23b2o42b2o20bo1487b2o13bobobo17bo5bobo94bo22bo$ 210b2o44bo19b3o6b2o6b3o108bobo3b2o2bo24bobo32bo8bo1429b2o32b2o44b2o11b 3obob3o13bobo5bo5b2o113b3o$209b2o68bo5b2o5bo86bo23b2obob2o2b2o27bo31b 3o8b3o1426b2o11b2o20bo56bo3bo5bo12b2o5b2o5b2o79bo18bo16bo$278b2o12b2o 85b3o19bo2bobo4bo29b2o30bo2bo9bo1439bo19bo33b2o23bob2o2b2obobo106b3o6b 2o6b3o$382bo18b2o2b2ob4o3b2o58b2o1450b3o16b2o31bobo24bo2b2o2b2obo109bo 5b2o5bo$336b2o15b2o26b2o24bo8bo19b2o37bo1453bo20b2o27bo27b2o2bo4b2o23b o83b2o12b2o$291b2o42bobo15b2o41b2o9bobo6bobo17bo35b2o1477bo26b2o29bo2b obobo2bo19b3o$286b2o3b2o42bo60bo11b2o7b2o15bobo35b4o1472b3o53b2o3b4ob 2o2b2o18bo25b2o15b2o$286b2o46b2o58bobo24b2o6bo4b2o37bo2bo1471bo34b2o 19bo8bo24b2o24b2o15bobo42b2o$383bo10b2o24bo2bo4bobo43bo17b2o1490bo17bo bo6bobo9b2o58bo42b2o3b2o$382bobo36b2o5bobo61bo1491bobo15b2o7b2o11bo58b 2o46b2o$382bobo32b2o10bo43bobo14bobo1492b2o4bo6b2o24bobo$377b2o4bo32bo bo54b2o15b2o1498bobo4bo2bo24b2o10bo$296bo79bobo15b2o7b2o11bo1573bobo5b 2o29b2o5bobo$294b3o44bo34bo17bobo6bobo9b2o69bo1454b2o48bo10b2o24bo2bo 4bobo$293bo47b3o31b2o19bo8bo24b2o54bo1455bo59bobo24b2o6bo4b2o10b2o66bo $293b2o49bo51b2o3b4ob2o2b2o18bo142bo1368bobo15b2o42bo11b2o7b2o15bobo9b o22bo44b3o$322bo20b2o56bo2bo3bo2bo19b3o10b2o5b2o92b2o24b3o1369b2o15b2o 42b2o9bobo6bobo17bo7bobo20b3o47bo$320b3o16b2o30b2o26b2o5bob2o23bo11bo 5b2o93bo23bo1412bob2o2b2o24bo8bo19b2o6b2o20bo49b2o$319bo19bo32bo25bo2b 3o4bo36bobo87bo10bobo21b2o1411b2obo3bo18b2o2b2ob4o3b2o49b2o20bo$306b2o 11b2o20bo30bobo22bob2o4b2obo37b2o85b3o11b2o1438b3o19bo2bobo4bo58b2o16b 3o$306b2o32b2o31b2o22bo3bobo3bo12b2o28b2o65bo14bo1478b2obo2bo2b2o57bo 19bo$385b2o11b3o3b3o13bobo26bobo65b3o12b2o1448b2o5b3o20bobo3b2o2bo54bo 20b2o11b2o$385b2o13bobobo17bo27bo69bo64b2o1395b2o5bo2bob2o16bob2obo2b 2obo53b2o32b2o$401b3o14b4ob2o2b2o43b2o45b2o64b2o1400bobo2b2obo3b2o12bo 4bo4bo$402bo15bo4bobo2bo35b2o5bobo1398bo114b2o9bobo13b3obob3o11b2o$ 416b2o2b2obob2o37b2o5bo1400b3o108b2o13bo17b5o13b2o$337b2o76bo2b2o3bobo 22b3o18bobo48b2o1353bo22bo84bobo6b2o2b2ob4o$337b2o17b2o44bo11bob2o2b2o bobo21bobobo17b2o49b2o17b2o1333b2o20b3o11bo73bo7bo2bobobo2bo$356b2o43b obo10bo4bo4bo20b3o3b3o11b2o72b2o1354bo14b3o11b2o35b2o31b2o4bo2b2o75b2o $402b2o11b3obob3o16b2o2bo4bo4bo10bobo122b2o1303b2o16bo10bobo34bobo5b2o 24bob2o2b2o2bo49b2o4b2o17b2o$398b2o17b2ob2o18bo2bob2obo2b2obo11bo123b 2o1320b2o12b3o34bo5b2o14bo9bobob2o2b2obo11bo37bo4b2o$357b2o38bobo42b2o bob4o2bo1405b2o64bo3bo33bobo18b3o9bo5bo3bo10bobo35bo$357bo39bo5b2o38bo b2o4b2o13bo1392b2o64b2o2bo34b2o17bobobo9b3obob3o11b2o36b2o$344b2o12b3o 34bobo5b2o38bobobo2bo15bo1463b2o36b2o11b3o3b3o9bobobo17b2o34bo2b2o$ 327b2o16bo14bo34b2o47b2ob4o85b2o32b2o1359bo35bobo10bo3bobo3bo2b2o26bob o33bo3bo$327bo14b3o73bo27bo17bo3bo13b2o9bo42bo20b2o11b2o1286bo65b2o4bo 37bo11bob2o4b2obo2bo5b3o13b2o5bo34b3o12b2o$306b2o20b3o11bo74bobo26bobo 13b3obob3o11b2o7bobo44bo19bo1299b2o45b2o17b2o4b2o49bo2b3o4b2o23b2o5bob o34bobo10bo16b2o$307bo22bo86b2o28b2o12bo4b2o3bo20b2o43b2o16b3o1302b2o 43b2o75b2o5bobo32b2o35b2o11b3o14bo$304b3o114b2o37bobob2o2b2obo23b2o36b 2o20bo1298b2o3b3o122bo2bo3bo10bo73bo11b3o20b2o$304bo116bobo36bob2o2b2o 2bo24bobo35bo1320b2o4b2o122b4ob2o10bobo84bo22bo$416b2o5bo11bo23b2obob 2o2b2o27bo36b3o1322b2o90b2o13b2ob2o17bo13b2o108b3o$317bo18bo79b2o5b2o 10b3o19bo2bobobo2bo29b2o37bo1322bo91b2o11b3obob3o13bobo9b2o114bo$317b 3o6b2o6b3o101bo18b2o2b2ob4o3b2o1386bo3bobo97bo4bo4bo12b2o3bob2o2bobo$ 320bo5b2o5bo103b2o24bo8bo19b2o1370b2o8b2o32b2o28b2o23bob2o2b2obobo16b 2obo2bo5b2o56b2o$319b2o12b2o117b2o9bobo6bobo17bo1371bo9b2o11b2o20bo27b obo24bo2b2o3bobo20b3o5b2o56bobo20bo18bo$452bo11b2o7b2o15bobo1394bo19bo 29bo27b2o2b2obob2o85bo22b3o6b2o6b3o$377b2o15b2o54bobo24b2o6bo4b2o1396b 3o16b2o27b2o29bo4bobo2bo19b3o87bo5b2o5bo$332b2o42bobo15b2o43bo10b2o24b o2bo4bobo55b2o1346bo20b2o49b2o3b4ob2o2b2o18bo3bob2o82b2o12b2o$327b2o3b 2o42bo61bobo5b2o29b2o5bobo55bo1369bo28b2o9bo9bo8bo24b2o2b2obo$327b2o 46b2o61bobo4bo2bo24b2o10bo37b2o15bobo1366b3o30bo10b2o5bobo6bobo9b2o42b 2o15b2o52bo51bo$433b2o4bo6b2o24bobo48b2o15b2o1367bo32bobo7b2o6b2o7b2o 11bo42b2o15bobo42b2o4bo3bo3bo46bobo$432bobo15b2o7b2o11bo1470b2o4bo6b2o 24bobo59bo42b2o3bo2bobo3b2o45b2o$432bo17bobo6bobo9b2o1475bobo4bo2bo24b 2o10bo48b2o46b2o2b3o2b2o$431b2o19bo8bo24b2o1460bobo5b2o29b2o5bobo100b 2o$337bo114b2o3b4ob2o2b2o18bo1462bo10b2o24bo2bo4bobo$335b3o44bo74bo2bo bobo2bo19b3o4b2o5b2o1457bobo24b2o6bo4b2o10b2o124bo$334bo47b3o42b2o26b 2o4b2ob2o23bo5bo5b2o1399b2o58bo11b2o7b2o15bobo9bo124bo$334b2o49bo42bo 25bo2b4obobo30bobo116bo1288bo58b2o9bobo6bobo17bo7bobo70bo53b3o$363bo 20b2o42bobo22bob2o2bob2obo31b2o88b2o24b3o1288bobo15b2o24b2o24bo8bo19b 2o6b2o26bo44b3o$361b3o16b2o47b2o22bo4bo4bo12b2o22b2o85bo23bo1292b2o15b 2o25bo18b2o2b2ob4o3b2o53b3o47bo$360bo19bo60b2o11b3o3b3o13bobo20bobo74b o10bobo21b2o1332b3o19bo2bo3bo2bo57bo49b2o$347b2o11b2o20bo58b2o13bobobo 17bo21bo73b3o11b2o1355bo23b2obo5b2o55b2o20bo$347b2o32b2o74b3o14b4ob2o 2b2o37b2o34bo14bo1396bo4b3o2bo58b2o16b3o$474bo2bobobo2bo29b2o5bobo34b 3o12b2o1395bob2o4b2obo58bo19bo28b2o$472b2o2b2obob2o31b2o5bo39bo64b2o 1315b2o5b2o5b2o12bo3bobo3bo56bo20b2o11b2o15b2o$428bo42bo2b2o2b2obo16b 3o18bobo38b2o64b2o1315b2o5bo5bobo13b3o3b3o11b2o44b2o32b2o$428b2o28bo 11bob2o2b2obobo15bobobo17b2o1309bo117bobo5bo17bobobo13b2o$427bobo27bob o10bo3b2o4bo14b3o3b3o11b2o1313b3o115b2o4b2ob4o14b3o$378b2o78b2o11b3obo b3o10b2o2bo4bo4bo10bobo43b2o1270bo22bo87b2o7bobo4bo15bo$378b2o17b2o55b 2o17bo3bo12bo2bob2obo2b2obo11bo44b2o17b2o1250b2o20b3o11bo75bobo6bobob 2o2b2o$397b2o54bobo36b2obob4o2bo76b2o1271bo14b3o74bo6b2obo3b2o2bo129bo $453bo5b2o14bo17bob2o4b2o13bo114b2o1220b2o16bo14bo35b2o26bo2bobob2o2b 2obo11bo64b2o49b3o6bo$451bobo5b2o14bo17bobobo2bo15bo114b2o1237b2o12b3o 35bobo5b2o18b2o2bo4bo4bo10bobo44b2o17b2o42b2o5bob2o4bobo$398b2o51b2o 41b2ob4o1316b2o64bo40bo5b2o14bo8b3obob3o11b2o45b2o61b2o7b2o3bobo$398bo 75bo21bo17bo3bo13b2o1283b2o64b2o39bobo18b3o9b2ob2o17b2o109b2o3b2o2b2o$ 385b2o12b3o71bobo20bobo13b3obob3o11b2o1391b2o17bobobo30bobo107b2ob4o$ 368b2o16bo14bo71b2o22b2o12bo4b2o3bo55b2o32b2o1316b2o11b3o3b3o23b2o5bo 39b2o66b2o4bo$368bo14b3o91b2o31bobob2o2b2obo23b2o30bo20b2o11b2o1269b2o 44bobo10bo3bobo3bo2b2o18b2o5bobo38bo66b2o3bo$347b2o20b3o11bo93bobo30bo b2o2b2o2bo24bobo31bo19bo1263b2o17b2o45bo11bob2o4b2obo2bo26b2o35b3o12b 2o58bo$348bo22bo4b2o94b2o5bo5bo23b2obob2o2b2o27bo30b2o16b3o1264b2o77bo 2b3o4b2o6bo58bo14bo16b2o38b2o2bo$345b3o27bobo14bo79b2o5b2o4b3o19bo2bob obo2bo29b2o25b2o20bo1215b2o129b2o5bobo6bobo73b3o14bo39bo2bobo$345bo27b 3o6b2o6b3o95bo18b2o2b2ob4o3b2o51bo1237b2o131bo2bo3bo7b2o75bo11b3o20b2o 18bo3b2o$369b2obo3bo5b2o5bo97b2o24bo8bo19b2o31b3o1367b4ob2o4b2o91bo22b o20b3o$369bob2o2b2o12b2o111b2o9bobo6bobo17bo34bo1334b2o13b2ob2o17bo5bo bo115b3o16bo$502bo11b2o7b2o15bobo1369b2o11b3obob3o13bobo5bo5b2o112bo 17b2o$433b2o15b2o48bobo32bo4b2o1290b2o32b2o56bo4bo4bo12b2o5b2o5b2o79bo 18bo$388b2o42bobo15b2o37bo10b2o32bobo1295b2o11b2o20bo31b2o23bob2o2b2ob obo106b3o6b2o6b3o32b2o$383b2o3b2o42bo55bobo5b2o36bobo1308bo19bo32bobo 24bo2b2o3bobo109bo5b2o5bo36bo$383b2o46b2o55bobo4bo2bo24b2o10bo73bo 1236b3o16b2o31bo27b2o2b2obob2o23bo83b2o12b2o$483b2o4bo6b2o24bobo58b2o 22b2o1239bo20b2o26b2o29bo4bobo2bo19b3o$482bobo15b2o7b2o11bo60bo24b2o 1260bo52b2o3b4ob2o2b2o18bo25b2o15b2o$482bo17bobo6bobo9b2o41b2o15bobo 1283b3o32b2o19bo8bo24b2o24b2o15bobo42b2o$481b2o19bo8bo24b2o26b2o15b2o 1284bo35bo17bobo6bobo9b2o58bo42b2o3b2o$393bo108b2o3b4ob2o2b2o18bo1366b obo15b2o7b2o11bo58b2o46b2o35bo$391b3o44bo68bo2bobobo2bo19b3o1364b2o4bo 6b2o24bobo6bo25b2o105b2o$390bo47b3o36b2o26b2o4b2ob2o23bo1369bobo4bo2bo 24b2o4bobo3bo20b2o107b2o$390b2o49bo36bo25bo2b4obobo146bo1247bobo5b2o 32b2o2bobo21bo99bobo$419bo20b2o36bobo22bob2o2bob2obo20b2o5b2o89b2o24b 3o1248bo10b2o32bobo121b2o$417b3o16b2o41b2o22bo4bo4bo12b2o8bo5b2o90bo 23bo1201b2o59bobo32bo4b2o10b2o66bo38bo$416bo19bo54b2o11b3o3b3o13bobo7b obo84bo10bobo21b2o1201bo61bo11b2o7b2o15bobo9bo22bo44b3o$403b2o11b2o20b o52b2o13bobobo17bo8b2o82b3o11b2o1224bobo15b2o42b2o9bobo6bobo17bo7bobo 20b3o47bo$403b2o32b2o68b3o14b4ob2o2b2o6b2o62bo14bo1241b2o15b2o27b2o24b o8bo19b2o6b2o20bo49b2o$524bo2bobobo2bo5bobo62b3o12b2o1287bo18b2o2b2ob 4o3b2o49b2o20bo$522b2o2b2obob2o8bo66bo64b2o1231b3o19bo2bo3bo2bo58b2o 16b3o$521bo2b2o2b2obo31b2o42b2o64b2o1094bo136bo23b2obo5b2o57bo19bo$ 508bo11bob2o2b2obobo23b2o5bobo1204b3o159bo4b3o2bo54bo20b2o11b2o$507bob o10bo3b2o4bo9bo14b2o5bo1209bo22bo105b2o5b2o21bob2o4b2obo53b2o32b2o$ 434b2o72b2o4bo6b3obob3o9b3o18bobo45b2o1161b2o20b3o11bo93b2o5bo9b2o12bo 3bobo3bo$434b2o17b2o49b2o7b2o8bo3bo10bobobo17b2o46b2o17b2o1163bo14b3o 96bobo8bobo13b3o3b3o11b2o$453b2o48bobo7bobo20b3o3b3o11b2o69b2o1163b2o 16bo14bo45bobo32b2o9bo17bobobo13b2o$503bo5b2o14bo5b2o2bo3bobo3bo10bobo 119b2o1129b2o12b3o43bo4bo27b2o7b2o2b2ob4o14b3o$501bobo5b2o14bo5bo2bob 2o4b2obo11bo120b2o1076b2o64bo46bo4bo27bobo6bo2bobo4bo15bo53b2o$332bo 121b2o45b2o30b2o4b3o2bo1211b2o64b2o49b2o28bo9b2obob2o2b2o65b2o2b2o4b2o $333b2o119bo69bo9bobo5b2o1336b2o32bobo3b2o2bo49b2o4b2o6bo6bo3b2o$332b 2o107b2o12b3o65bobo8bo3bo2bo1327b2o2b2o5bobo5b2o14bo9bobob2o2b2obo11bo 37bo4b2o8b3o2bo$424b2o16bo14bo65b2o10b2ob4o82b2o32b2o1161b2o46b2o2b2o 7bo5b2o14bo10bo4bo4bo10bobo35bo12bo2bo2b3o$424bo14b3o85b2o8bo17b2ob2o 13b2o49bo20b2o11b2o1142b2o17b2o47bob3o7bobo31b3obob3o11b2o36b2o$403b2o 20b3o11bo87bobo7bobo13b3obob3o11b2o51bo19bo1155b2o69bo9b2o17bo3bo11b2o b2o17b2o34bo2b2o7bobo$404bo22bo94b2o5bo8b2o12bo4bo4bo62b2o16b3o1105b2o 119bo14b2o11b3obob3o31bobo33bo3bo7b2o$401b3o19bo18bo79b2o5b2o20bobob2o 2b2obo23b2o33b2o20bo1107b2o133bobo10bo3b2o4bo2b2o21b2o5bo34b3o12b2o$ 401bo21b3o6b2o6b3o108bobo3b2o2bo24bobo32bo1265bo11bob2o2b2obobo2bo21b 2o5bobo34bobo10bo16b2o49bo$426bo5b2o5bo86bo23b2obob2o2b2o27bo33b3o 1136bo138bo2b2o2b2ob2o31b2o35b2o11b3o14bo49bobo$425b2o12b2o85b3o19bo2b obo4bo29b2o34bo1134bobo139b2o2b2obobo10bo73bo11b3o20b2o28b2o$529bo18b 2o2b2ob4o3b2o1195b3o9b2o32b2o96bo2bobobo9bobo84bo22bo$483b2o15b2o26b2o 24bo8bo19b2o1174bo11b2o11b2o20bo79b3o14b4ob2o11b2o108b3o18bo$438b2o42b obo15b2o41b2o9bobo6bobo17bo1200bo19bo65b2o13bobobo17bo9b2o114bo17bo$ 433b2o3b2o42bo60bo11b2o7b2o15bobo28bo1172b3o16b2o64b2o11b3o3b3o13bobo 8bobo132b3o$369bobo61b2o46b2o58bobo24b2o6bo4b2o28b3o1173bo20b2o72bo4bo 4bo12b2o9bo5b2o$348bo21b2o158bo10b2o24bo2bo4bobo32b2o2bo15b2o1177bo47b 2o23bob2o2bob2obo21b2o5b2o79bo18bo$349b2o19bo158bobo5b2o29b2o5bobo52bo 1175b3o47bobo24bo2b4obobo109b3o6b2o6b3o$348b2o179bobo4bo2bo24b2o10bo 38bo11b2obo1175bo49bo27b2o4b2ob2o23bo87bo5b2o5bo$524b2o4bo6b2o24bobo 17b2o36b2o2bo3bo1225b2o29bo2bobobo2bo19b3o86b2o12b2o$443bo79bobo15b2o 7b2o11bo20bo30b2ob2o1261b2o3b4ob2o2b2o18bo$441b3o44bo34bo17bobo6bobo9b 2o17b3o38bobo2bo1232b2o19bo8bo24b2o27b2o15b2o$440bo47b3o31b2o19bo8bo 24b2o2bo34bo3bo4b2o1234bo17bobo6bobo9b2o42b2o15bobo42b2o$440b2o49bo51b 2o3b4ob2o2b2o18bo1283bobo15b2o7b2o11bo61bo42b2o3b2o$469bo20b2o56bo2bo 3bo2bo19b6o5b2o29bo1178b2o61b2o4bo6b2o24bobo59b2o46b2o$467b3o16b2o30b 2o26b2o5bob2o26bo5b2o30bo1178bo66bobo4bo2bo24b2o10bo$466bo19bo32bo25bo 2b3o4bo24bo2bobo35bo81bo1096bobo15b2o47bobo5b2o29b2o5bobo$453b2o11b2o 20bo30bobo9bobo10bob2o4b2obo22b3o3b2o89b2o24b3o1097b2o15b2o48bo10b2o 24bo2bo4bobo$453b2o32b2o31b2o10bo11bo3bobo3bo12b2o8bo10b2o86bo23bo 1178bobo24b2o6bo4b2o10b2o$386bo158b3o3b3o13bobo7b2o8bobo75bo10bobo21b 2o1179bo11b2o7b2o15bobo9bo70bo$387bo75b2o82bobobo17bo18bo74b3o11b2o 1202b2o9bobo6bobo17bo7bobo25bo44b3o$385b3o16bo57bo2bo66bo15b3o14b4ob2o 2b2o34b2o35bo14bo1203b2o24bo8bo19b2o6b2o24b3o47bo$402bobo56b2o68b4o14b o15bo4bobo2bo26b2o5bobo35b3o12b2o1176b2o5b2o18bo18b2o2b2ob4o3b2o52bo 49b2o$403b2o57b2o3bo63bo3bo27b2o2b2obob2o28b2o5bo40bo64b2o1123b2o5bo 16b3o19bo2bobobo2bo57b2o20bo$463bo4bo15b2o46bo2bo26bo2b2o3bobo13b3o18b obo39b2o64b2o1128bobo16bo23b2obob2o2b2o59b2o16b3o$466b3o15b2o17b2o27b 3o14bo11bob2o2b2obobo12bobobo17b2o1121bo114b2o42bob2o2b2o2bo59bo19bo$ 503b2o43bobo10bo4bo4bo11b3o3b3o11b2o1125b3o108b2o46bobob2o2b2obo56bo 20b2o11b2o$549b2o11b3obob3o7b2o2bo4bo4bo10bobo44b2o1081bo22bo84bobo32b 2o12bo4b2o3bo56b2o32b2o$545b2o17b2ob2o9bo2bob2obo2b2obo11bo45b2o17b2o 1061b2o20b3o11bo73bo32bobo13b3obob3o11b2o$370bo133b2o38bobo33b2obob4o 2bo77b2o1082bo14b3o11b2o35b2o54bo17bo3bo13b2o$371bo132bo39bo5b2o29bob 2o4b2o13bo23bo91b2o1031b2o16bo10bobo34bobo5b2o40b2o2b2ob4o$369b3o119b 2o12b3o34bobo5b2o29bobobo2bo15bo21bobo91b2o1048b2o12b3o34bo5b2o40bo2bo bobo2bo15bo$474b2o16bo14bo34b2o38b2ob4o38b2o1088b2o64bo3bo33bobo47b2ob 2o4b2o13bo$474bo14b3o73bo18bo17bo3bo13b2o1095b2o64b2o2bo34b2o17b5o26bo bob4o2bo77b2o$392bo60b2o20b3o11bo74bobo8b2o7bobo13b3obob3o11b2o1166b2o 36b2o11b3obob3o24bob2obo2b2obo11bo45b2o17b2o$390bobo61bo22bo86b2o10bo 8b2o12bo4b2o3bo56b2o32b2o1087bo35bobo10bo4bo4bo2b2o20bo4bo4bo10bobo44b 2o$391b2o58b3o114b2o3b3o22bobob2o2b2obo23b2o31bo20b2o11b2o1080b2o4bo 37bo11bob2o2bob2obo2bo21b3o3b3o11b2o$451bo116bobo2bo24bob2o2b2o2bo24bo bo32bo19bo1074b2o17b2o4b2o49bo2b2o3bob2o25bobobo17b2o$563b2o5bo26b2obo b2o2b2o27bo31b2o16b3o1075b2o75b2o2bo2bobo27b3o18bobo39b2o$464bo18bo79b 2o5b6o19bo2bobobo2bo29b2o26b2o20bo1026b2o111b3o14bo4bobo43b2o5bo40bo$ 464b3o6b2o6b3o92bo18b2o2b2ob4o3b2o52bo1048b2o128b4ob2o44b2o5bobo35b3o 12b2o$467bo5b2o5bo91bo2b2o24bo8bo19b2o32b3o1142b2o13bobobo17bo54b2o35b o14bo16b2o$466b2o12b2o88b3o17b2o9bobo6bobo17bo35bo1142b2o11b3obob3o13b obo32bo74b3o14bo$569bo20bo11b2o7b2o15bobo1190bo3bo5bo12b2o32bobo75bo 11b3o20b2o$385bo138b2o15b2o26b2o17bobo24b2o6bo4b2o1102b2o32b2o28b2o23b ob2o2b2obobo46b2o87bo22bo$386b2o91b2o42bobo15b2o34bo10b2o24bo2bo4bobo 1107b2o11b2o20bo27bobo24bo2b2o2b2obo9bo32b2o115b3o$385b2o87b2o3b2o42bo 52bobo5b2o29b2o5bobo1120bo19bo13bo15bo27b2o2bo4b2o9bo13bo16bobo117bo$ 474b2o46b2o52bobo4bo2bo24b2o10bo1122b3o16b2o12bo14b2o29bo2bobobo2bo5b 3o11b3o16bo5b2o$571b2o4bo6b2o24bobo59b2o1074bo20b2o7bobo39b2o3b4ob2o2b 2o18bo18b2o5b2o56b3o20bo18bo$570bobo15b2o7b2o11bo61bo1097bo28b2o19bo8b o24b2o82bo22b3o6b2o6b3o$570bo17bobo6bobo9b2o42b2o15bobo1094b3o7b2o21bo 17bobo6bobo9b2o98bo24bo5b2o5bo$569b2o19bo8bo24b2o27b2o15b2o1095bo32bob o15b2o7b2o11bo122b2o12b2o$484bo105b2o3b4ob2o2b2o18bo1152b2o22b2o4bo6b 2o24bobo$482b3o44bo65bo2bobobo2bo19b3o1178bobo4bo2bo24b2o10bo48b2o15b 2o51b2o3b2o$481bo47b3o33b2o26b2o4b2ob2o23bo1178bobo5b2o36bobo47b2o15bo bo42b2o4b3o4b2o$481b2o49bo33bo25bo2b4obobo1204bo10b2o32bobo66bo42b2o3b o8b2o$510bo20b2o33bobo22bob2o2bob2obo21b2o5b2o117bo1067bobo32bo4b2o10b 2o49b2o46bobo2b5o$508b3o16b2o38b2o22bo4bo4bo12b2o9bo5b2o89b2o24b3o 1009b2o58bo11b2o7b2o15bobo9bo99bo3b3o$507bo19bo51b2o11b3o3b3o13bobo8bo bo95bo23bo1013bo58b2o9bobo6bobo17bo7bobo$390bobo101b2o11b2o20bo49b2o 13bobobo17bo9b2o84bo10bobo21b2o1012bobo15b2o24b2o24bo8bo19b2o6b2o$391b 2o101b2o32b2o65b3o14b4ob2o2b2o7b2o78b3o11b2o1036b2o15b2o25bo18b2o2b2ob 4o3b2o$391bo220bo2bobobo2bo6bobo62bo14bo1093b3o19bo2bobo4bo124bo$610b 2o2b2obob2o9bo63b3o12b2o1092bo23b2obo2bo2b2o77bo44b3o$609bo2b2o2b2obo 32b2o43bo64b2o1064bobo3b2o2bo74b3o47bo$596bo11bob2o2b2obobo24b2o5bobo 42b2o64b2o1064bob2obo2b2obo72bo49b2o$595bobo10bo3b2o4bo9b3o13b2o5bo 1149b2o5b2o5b2o12bo4bo4bo72b2o20bo$525b2o36bo32b2o11b3obob3o31bobo 1149b2o5bo5bobo13b3obob3o11b2o64b2o16b3o$525b2o17b2o17b2o27b2o17bo3bo 11bobobo17b2o46b2o991bo115bobo5bo17b5o13b2o65bo19bo28b2o$544b2o16bobo 26bobo31b3obob3o11b2o50b2o17b2o972b3o113b2o4b2ob4o96bo20b2o11b2o15b2o$ 591bo5b2o14bo6b2o2bo5bo3bo10bobo68b2o975bo22bo85b2o7bobobo2bo96b2o32b 2o$589bobo5b2o14bo6bo2bobob2o2b2obo11bo120b2o923b2o20b3o11bo73bobo6bo 4bo2b2o$545b2o42b2o31b2ob2o2b2o2bo133b2o944bo14b3o11b2o59bo6b2ob2o2b2o 2bo$545bo66bo10bo4bo2b2o1080b2o16bo10bobo35b2o26bo2bobob2o2b2obo11bo$ 532b2o12b3o62bobo9bobobo2bo1099b2o12b3o33bobo5b2o18b2o2bo5bo3bo10bobo$ 515b2o16bo14bo62b2o11b2ob4o1046b2o64bo3bo34bo5b2o14bo8b3obob3o11b2o$ 515bo14b3o82b2o9bo17b5o13b2o49b2o32b2o928b2o64b2o2bo34bobo18b3o9bobobo 17b2o79b2o50bo7bo$494b2o20b3o11bo84bobo8bobo13b3obob3o11b2o49bo20b2o 11b2o999b2o33b2o17bobobo30bobo59b2o17b2o42b2o5b3o5bobo$495bo22bo91b2o 5bo9b2o12bo4bo4bo63bo19bo1013bo37b2o11b3o3b3o7b3o13b2o5bo59b2o61b2o4b 2o2bo3bobo$492b3o16bo18bo79b2o5b2o21bob2obo2b2obo23b2o37b2o16b3o1007b 2o4bo37bobo10bo3bobo3bo2b2o18b2o5bobo126b2ob2o3b2o$492bo18b3o6b2o6b3o 109bobo3b2o2bo24bobo32b2o20bo990b2o17b2o4b2o37bo11bob2o4b2obo2bo26b2o 126bob2o$514bo5b2o5bo87bo23b2obo2bo2b2o27bo32bo1012b2o75bo2b3o4b2o6bo 79b2o66bo$513b2o12b2o86b3o19bo2bobo4bo29b2o32b3o958b2o127b2o5bobo6bobo 79bo66bo3b2o$618bo18b2o2b2ob4o3b2o60bo958b2o129bo2bo3bo7b2o76b3o12b2o 54b2obo$571b2o15b2o27b2o24bo8bo19b2o1129b4ob2o4b2o80bo14bo16b2o43bo$ 526b2o42bobo15b2o42b2o9bobo6bobo17bo1097b2o13b2ob2o17bo5bobo96b3o14bo 40bo3bo$521b2o3b2o42bo61bo11b2o7b2o15bobo1097b2o11b3obob3o13bobo5bo5b 2o93bo11b3o20b2o19b2ob2o$521b2o46b2o59bobo32bo4b2o1020b2o32b2o54bo4bo 4bo12b2o5b2o5b2o79bo18bo6bo22bo$619bo10b2o32bobo1025b2o11b2o20bo29b2o 23bob2o2b2obobo106b3o6b2o6b3o30b3o17bo$618bobo5b2o36bobo52b2o984bo19bo 30bobo24bo2b2o3bobo109bo5b2o5bo35bo17bo$618bobo4bo2bo24b2o10bo53bo986b 3o16b2o29bo27b2o2b2obob2o23bo83b2o12b2o52bo2bo$613b2o4bo6b2o24bobo45b 2o15bobo988bo20b2o24b2o29bo4bobo2bo19b3o153bo$531bo80bobo15b2o7b2o11bo 47b2o15b2o1011bo50b2o3b4ob2o2b2o18bo25b2o15b2o112bo$529b3o44bo35bo17bo bo6bobo9b2o21b2o1051b3o30b2o19bo8bo24b2o24b2o15bobo42b2o$528bo47b3o32b 2o19bo8bo24b2o4bo2bo1051bo33bo17bobo6bobo9b2o58bo42b2o3b2o$528b2o49bo 52b2o3b4ob2o2b2o18bo5b3o1086bobo15b2o7b2o11bo58b2o46b2o$557bo20b2o57bo 2bobobo2bo19b3o130bo961b2o4bo6b2o24bobo$526bo28b3o16b2o31b2o26b2o2bo4b 2o23b4o5b2o92b2o24b3o966bobo4bo2bo24b2o10bo$554bo19bo33bo25bo2b2o2b2ob o27bo5b2o93bo23bo969bobo5b2o29b2o5bobo147bobo$541b2o11b2o20bo31bobo22b ob2o2b2obobo22b3o2bobo87bo10bobo21b2o969bo10b2o24bo2bo4bobo147b2o$541b 2o32b2o32b2o22bo3bo5bo12b2o8bo2bo3b2o85b3o11b2o944b2o57bobo24b2o6bo4b 2o10b2o66bo64bo$621b2o11b3obob3o13bobo7b2o9b2o65bo14bo961bo59bo11b2o7b 2o15bobo9bo22bo44b3o$621b2o13bobobo17bo17bobo65b3o12b2o960bobo15b2o40b 2o9bobo6bobo17bo7bobo20b3o47bo$654b4ob2o2b2o12bo69bo64b2o908b2o15b2o 25b2o24bo8bo19b2o6b2o20bo49b2o$637b3o14bo4bobo2bo34b2o45b2o64b2o953bo 18b2o2b2ob4o3b2o49b2o20bo$652b2o2bo2bob2o28b2o5bobo1063b3o19bo2bo3bo2b o58b2o16b3o$572b2o77bo2b2o3bobo29b2o5bo1065bo23b2obo5b2o57bo19bo$517bo 54b2o17b2o45bo11bob2o2bob2obo34bobo48b2o1040bo4b3o2bo54bo20b2o11b2o$ 515b3obo71b2o44bobo10bo4bo4bo13b5o17b2o49b2o17b2o993b2o5b2o19bob2o4b2o bo53b2o32b2o$514bo3bo119b2o11b3obob3o12b3obob3o11b2o72b2o880bo112b2o5b o7b2o12bo3bobo3bo166bo$513b3obo116b2o17b5o9b2o2bo4bo4bo10bobo122b2o 829b3o115bobo6bobo13b3o3b3o11b2o153bo$512b2obo76b2o39bobo31bo2bob2obo 2b2obo11bo123b2o832bo22bo91b2o7bo17bobobo13b2o153b3o$513b3o76bo40bo5b 2o28b2obo3b2o2bo969b2o20b3o11bo75b2o9b2ob4o14b3o$513b2obo62b2o12b3o35b obo5b2o29bobo2bo2b2o991bo14b3o73bobo7bobo4bo15bo$515b3o44b2o16bo14bo 35b2o20bo16bobo4bo14b3o976b2o16bo14bo58bo8bobob2o2b2o40b3o32b2o$515b2o 45bo14b3o69b2o20b2ob4o85b2o32b2o889b2o12b3o35b2o29b2obo3b2o2bo39bo9b2o 4b2o17b2o$541b2o20b3o11bo70b2o4b2o17bo17bobobo13b2o52bo20b2o11b2o836b 2o64bo38bobo5b2o19bo2bobob2o2b2obo11bo27bo9bo4b2o116bo$542bo22bo83b2o 3b2o8b2o7bobo13b3obob3o11b2o54bo19bo849b2o64b2o39bo5b2o19b2o2bo4bo4bo 10bobo35bo123bobo$539b3o107b3o5b2o3bo2bo8b2o12bo5bo3bo65b2o16b3o957bob o29b3obob3o11b2o36b2o122b2o$539bo110b3o4bobo2b3o22bobob2o2b2obo23b2o 36b2o20bo960b2o17b5o9b2ob2o17b2o34bo2b2o$651bobo5bo27bob2o2b2o2bo24bob o35bo939b2o45b2o11b3obob3o29bobo33bo3bo$553bo18bo79b2o5b4o23b2o4bo2b2o 27bo36b3o917b2o17b2o44bobo10bo4bo4bo2b2o19b2o5bo34b3o12b2o$553b3o6b2o 6b3o89b3o19bo2bobobo2bo29b2o37bo917b2o64bo11bob2o2bob2obo2bo19b2o5bobo 34bobo10bo16b2o$556bo5b2o5bo87b3o5bo18b2o2b2ob4o3b2o930b2o128bo2b2o3bo b2o29b2o35b2o11b3o14bo$555b2o12b2o85bo2bo4b2o24bo8bo19b2o909b2o129b2o 2bo2bobo8bo73bo11b3o20b2o$656b2o21b2o9bobo6bobo17bo1026b3o14bo4bobo7bo bo84bo22bo$613b2o15b2o47bo11b2o7b2o15bobo922b3o118b4ob2o9b2o108b3o43bo bo$568b2o42bobo15b2o45bobo32bo4b2o921b2ob4o83b2o13bobobo17bo7b2o114bo 43b2o$563b2o3b2o42bo53bo10b2o32bobo55b2o869bo2b2o4bobo32b2o44b2o11b3ob ob3o13bobo6bobo159bo$563b2o46b2o52bobo5b2o32b2o2bobo55bo870b3o7b2o11b 2o20bo56bo3bo5bo12b2o7bo5b2o$665bobo4bo2bo24b2o6b2o2bo37b2o15bobo875bo bo15bo19bo33b2o23bob2o2b2obobo19b2o5b2o79bo18bo$660b2o4bo6b2o24bobo5bo 42b2o15b2o895b3o16b2o31bobo24bo2b2o2b2obo107b3o6b2o6b3o$659bobo15b2o7b 2o11bo966bo20b2o27bo27b2o2bo4b2o23bo85bo5b2o5bo48bo$659bo17bobo6bobo9b 2o988bo26b2o29bo2bobobo2bo19b3o84b2o12b2o45b2o$573bo84b2o19bo8bo24b2o 970b3o53b2o3b4ob2o2b2o18bo149b2o$571b3o44bo60b2o3b4ob2o2b2o18bo971bo 34b2o19bo8bo24b2o25b2o15b2o$570bo47b3o63bo4bobo2bo19b3o4b2o5b2o991bo 17bobo6bobo9b2o40b2o15bobo42b2o$570b2o49bo32b2o26b2o2bo2bob2o23bo5bo5b 2o991bobo15b2o7b2o11bo59bo42b2o3b2o$599bo20b2o33bo25bo2b2o3bobo30bobo 116bo880b2o4bo32bobo57b2o46b2o$539bo57b3o16b2o37bobo22bob2o2bob2obo31b 2o88b2o24b3o885bobo32b2o10bo$537bobo56bo19bo39b2o22bo4bo4bo12b2o22b2o 85bo23bo888bobo36b2o5bobo$538b2o43b2o11b2o20bo49b2o11b3obob3o13bobo20b obo74bo10bobo21b2o838b2o48bo10b2o24bo2bo4bobo$583b2o32b2o49b2o13b5o17b o21bo73b3o11b2o862bo59bobo24b2o6bo4b2o10b2o$701b4ob2o2b2o37b2o34bo14bo 878bobo15b2o42bo11b2o7b2o15bobo9bo68bo$701bo2bobobo2bo29b2o5bobo34b3o 12b2o878b2o15b2o42b2o9bobo6bobo17bo7bobo23bo44b3o$699b2o2bo4b2o31b2o5b o39bo64b2o865bob2o2b2o24bo8bo19b2o6b2o22b3o47bo$698bo2b2o2b2obo37bobo 38b2o64b2o865b2obo3bo18b2o2b2ob4o3b2o50bo49b2o$685bo11bob2o2b2obobo15b 5o17b2o976b3o19bo2bobo4bo55b2o20bo$599bobo12b2o68bobo10bo3bo5bo14b3obo b3o11b2o1004b2obo2bo2b2o57b2o16b3o$597bobobo12b2o17b2o50b2o11b3obob3o 10b2o2bo4bo4bo10bobo28bo14b2o929b2o5b3o20bobo3b2o2bo57bo19bo$595b2o36b 2o46b2o17bobobo12bo2bob2obo2b2obo11bo27b2o15b2o17b2o15b2o893b2o5bo2bob 2o16bob2obo2b2obo54bo20b2o11b2o$597bo82bobo36b2obo3b2o2bo41b2o33b2o15b 3o897bobo2b2obo3b2o12bo4bo4bo54b2o32b2o$680bo5b2o13b3o16bobo2bo2b2o94b o4b2o27b2o748bo115b2o9bobo13b3obob3o11b2o$634b2o42bobo5b2o32bobo4bo14b 3o81b2o2bo27b2o748b3o109b2o13bo17b5o13b2o$634bo43b2o41b2ob4o100b2o781b o22bo85bobo6b2o2b2ob4o164bobo$621b2o12b3o63bo21bo17bobobo13b2o67bo781b 2o20b3o11bo74bo7bo2bobobo2bo164b2o$604b2o16bo14bo62bobo20bobo13b3obob 3o11b2o870bo14b3o49b2o31b2o4bo2b2o157bo5bo$604bo14b3o78b2o22b2o12bo5bo 3bo55b2o32b2o791b2o16bo14bo33bobo5b2o24bob2o2b2o2bo75b2o77b2o$583b2o 20b3o11bo84b2o31bobob2o2b2obo23b2o30bo20b2o11b2o808b2o12b3o35bo5b2o24b obob2o2b2obo11bo37b2o4b2o17b2o78b2o$584bo22bo96bobo30bob2o2b2o2bo24bob o31bo19bo768b2o64bo38bobo30bo5bo3bo10bobo37bo4b2o$581b3o115b2o5bo5bo 23b2o4bo2b2o27bo30b2o16b3o769b2o64b2o38b2o17b2ob2o9b3obob3o11b2o37bo$ 581bo18bo18bo79b2o5b2o4b3o19bo2bobobo2bo29b2o25b2o20bo881b2o11b3obob3o 9bobobo17b2o33b2o$600b3o6b2o6b3o95bo18b2o2b2ob4o3b2o51bo902bobo10bo4bo 4bo2b2o26bobo34bo2b2o$603bo5b2o5bo97b2o24bo8bo19b2o31b3o855b2o43bo11bo b2o2b2obobo2bo5b3o13b2o5bo34bo3bo$602b2o12b2o111b2o9bobo6bobo17bo34bo 836b2o17b2o56bo2b2o3bob2o23b2o5bobo33b3o12b2o$729bo11b2o7b2o15bobo871b 2o76b2o2b2obobo32b2o35bobo10bo16b2o$660b2o15b2o48bobo24b2o6bo4b2o821b 2o113bo15bo4bobo10bo59b2o11b3o14bo$615b2o42bobo15b2o37bo10b2o24bo2bo4b obo826b2o112b3o14b4ob2o10bobo73bo11b3o20b2o$610b2o3b2o42bo55bobo5b2o 29b2o5bobo924b2o13bobobo17bo13b2o85bo22bo$610b2o46b2o55bobo4bo2bo24b2o 10bo925b2o11b3o3b3o13bobo9b2o113b3o$710b2o4bo6b2o24bobo58b2o888bo3bobo 3bo12b2o3bob2o2bobo115bo$709bobo15b2o7b2o11bo60bo799b2o32b2o29b2o23bob 2o4b2obo6bobo7b2obo2bo5b2o5b2o$563bo145bo17bobo6bobo9b2o41b2o15bobo 799b2o11b2o20bo28bobo24bo2b3o4bo7b2o11b3o5b2o4b2o73bo18bo$513bobo48b2o 142b2o19bo8bo24b2o26b2o15b2o813bo19bo30bo27b2o5bob2o6bo28bo72b3o6b2o6b 3o$514b2o47b2o55bo108b2o3b4ob2o2b2o18bo860b3o16b2o28b2o29bo2bo3bo2bo 19b3o87bo5b2o5bo$514bo103b3o44bo68bo4bobo2bo19b3o859bo20b2o50b2o3b4ob 2o2b2o18bo3bob2o82b2o12b2o$617bo47b3o36b2o26b2o2bo2bob2o23bo881bo29b2o 19bo8bo24b2o2b2obo$617b2o49bo36bo25bo2b2o3bobo155bo747b3o31bo17bobo6bo bo9b2o42b2o15b2o$646bo20b2o36bobo22bob2o2bob2obo20b2o5b2o98b2o24b3o 747bo33bobo15b2o7b2o11bo42b2o15bobo42b2o$644b3o16b2o41b2o22bo4bo4bo12b 2o8bo5b2o99bo23bo785b2o4bo6b2o24bobo59bo42b2o3b2o$643bo19bo54b2o11b3ob ob3o13bobo7bobo93bo10bobo21b2o789bobo4bo2bo24b2o10bo48b2o46b2o48bo$ 620b2o8b2o11b2o20bo52b2o13b5o17bo8b2o91b3o11b2o812bobo5b2o36bobo144bo$ 619bobo8b2o32b2o85b4ob2o2b2o6b2o71bo14bo829bo10b2o32bobo144b3o$615bo5b o129bo2bobobo2bo5bobo71b3o12b2o839bobo32bo4b2o10b2o$612b2o2bo132b2o2bo 4b2o8bo75bo64b2o727b2o59bo11b2o7b2o15bobo9bo$611bo5bo130bo2b2o2b2obo 31b2o51b2o64b2o728bo59b2o9bobo6bobo17bo7bobo70bo49bo$610b2ob2o120bo11b ob2o2b2obobo23b2o5bobo847bobo15b2o25b2o24bo8bo19b2o6b2o26bo44b3o47bobo $551bo28bo30b4o3bo115bobo10bo3bo5bo20bo3b2o5bo850b2o15b2o26bo18b2o2b2o b4o3b2o53b3o47bo46b2o$552b2o24bobo31bo4bo43b2o72b2o11b3obob3o9b3o7bobo 8bobo54b2o836b3o19bo2bobo4bo57bo49b2o$529bobo19b2o26b2o33b3o44b2o17b2o 49b2o17bobobo10bobobo7b2o8b2o55b2o17b2o817bo23b2obob2o2b2o55b2o20bo$ 530b2o82bo65b2o48bobo30b3o3b3o11b2o78b2o683bo158bobo3b2o2bo58b2o16b3o$ 530bo199bo5b2o13b3o4b2o2bo4bo4bo10bobo128b2o632b3o156bobob2o2b2obo58bo 19bo$728bobo5b2o20bo2bob2obo2b2obo11bo129b2o635bo22bo104b2o5b2o6b2o12b o4bo4bo56bo20b2o11b2o$681b2o45b2o30b2obob4o2bo778b2o20b3o11bo92b2o5bo 6bobo13b3obob3o11b2o44b2o32b2o$681bo69bo9bob2o4b2o13bo786bo14b3o95bobo 6bo17b2ob2o13b2o$668b2o12b3o65bobo8bobobo2bo15bo786b2o16bo14bo79b2o5b 2ob4o149bobo$651b2o16bo14bo65b2o10b2ob4o91b2o32b2o692b2o12b3o75b2o8bo 3bo2bo149b2o$651bo14b3o85b2o8bo17bo3bo13b2o58bo20b2o11b2o639b2o64bo78b obo7bobo5b2o148bo$630b2o20b3o11bo87bobo7bobo13b3obob3o11b2o60bo19bo 652b2o64b2o78bo7b2o4b3o2bo78b4o$631bo22bo94b2o5bo8b2o12bo4b2o3bo71b2o 16b3o776b2o27bo2bob2o4b2obo11bo63b2ob3o3bo53bo$628b3o19bo18bo79b2o5b2o 20bobob2o2b2obo23b2o42b2o20bo778bobo5b2o19b2o2bo3bobo3bo10bobo44b2o20b ob5o50b2o$628bo21b3o6b2o6b3o108bob2o2b2o2bo24bobo41bo742b2o58bo5b2o13b 3o8b3o3b3o11b2o45b2o20b5ob2o50b2o$568bo84bo5b2o5bo86bo23b2obob2o2b2o 27bo42b3o720b2o17b2o58bobo31bobobo17b2o58bo4bo2b2obo$566bobo16bo66b2o 12b2o85b3o19bo2bobobo2bo29b2o43bo720b2o78b2o17bobobo10b3o18bobo58b2o3b 5o$567b2o17bo169bo18b2o2b2ob4o3b2o739b2o133b2o11b3obob3o9bo14b2o5bo39b 2o17bo5b3o$584b3o123b2o15b2o26b2o24bo8bo19b2o36bo681b2o132bobo10bo3bo 5bo2b2o19b2o5bobo38bo$665b2o42bobo16bo41b2o9bobo6bobo17bo36b3o815bo11b ob2o2b2obobo2bo27b2o35b3o12b2o$660b2o3b2o42bo60bo11b2o7b2o15bobo35b2o 2bo827bo2b2o2b2ob2o7bo58bo14bo16b2o$660b2o46b2o58bobo24b2o6bo4b2o36bo 3bo828b2o2bo4bo7bobo73b3o14bo$757bo10b2o24bo2bo4bobo41bob2o16b2o682b2o 32b2o95bo2bobobo8b2o75bo11b3o20b2o$756bobo36b2o5bobo41b2o18bo683b2o11b 2o20bo62b3o30b4ob2o5b2o91bo22bo$756bobo32b2o10bo60bobo696bo19bo64bo2bo 11b5o17bo6bobo115b3o$552bo175bo22b2o4bo32bobo71b2o698b3o16b2o62bo2b2o 9b3obob3o13bobo6bo5b2o112bo$550bobo117bo53bo3bo21bobo15b2o7b2o11bo67b 4o684bo19bo20b2o57bo2bo10bo4bo4bo12b2o6b2o5b2o79bo18bo$551b2o115b3o44b o9bo2bo21bo17bobo6bobo9b2o67b3obo684bo40bo46b2o10b2o11bob2o2bob2obo 107b3o6b2o6b3o$667bo47b3o7b2ob2o19b2o19bo8bo24b2o53b2o684b3o37b3o46bob o24bo2b2o3bobo110bo5b2o5bo$573bo93b2o49bo7bobo41b2o3b4ob2o2b2o18bo780b o48bo27b2o2bo2bob2o23bo84b2o12b2o$574bo121bo20b2o8bo47bo2bobobo2bo19b 3o10b2o5b2o806b2o29bo4bobo2bo19b3o$572b3o119b3o16b2o30b2o26b2o4b2ob2o 23bo11bo5b2o112bo719b2o3b4ob2o2b2o18bo26b2o15b2o$693bo19bo32bo25bo2b4o bobo36bobo89b2o24b3o698b2o19bo8bo24b2o25b2o15bobo42b2o$680b2o11b2o20bo 30bobo22bob2o2bob2obo37b2o90bo23bo702bo17bobo6bobo9b2o59bo42b2o3b2o$ 680b2o32b2o31b2o22bo4bo4bo12b2o28b2o75bo10bobo21b2o701bobo15b2o7b2o11b o59b2o46b2o$759b2o11b3o3b3o13bobo26bobo73b3o11b2o663b2o60b2o4bo6b2o24b obo$759b2o13bobobo17bo27bo58bo14bo680bo65bobo4bo2bo24b2o10bo$775b3o14b 4ob2o2b2o43b2o35b3o12b2o679bobo15b2o46bobo5b2o29b2o5bobo$792bo2bobobo 2bo35b2o5bobo38bo64b2o627b2o15b2o47bo10b2o24bo2bo4bobo$790b2o2b2obob2o 37b2o5bo39b2o64b2o704bobo24b2o6bo4b2o10b2o67bo$566bobo142b2o76bo2b2o2b 2obo43bobo813bo11b2o7b2o15bobo9bo23bo44b3o$567b2o142b2o17b2o44bo11bob 2o2b2obobo21b2ob2o17b2o814b2o9bobo6bobo17bo7bobo21b3o47bo$567bo162b2o 43bobo10bo3b2o4bo20b3obob3o11b2o45b2o756b2o24bo8bo19b2o6b2o21bo49b2o$ 776b2o11b3obob3o16b2o2bo4bo4bo10bobo44b2o17b2o712b2o5b2o17bo18b2o2b2ob 4o3b2o50b2o20bo$772b2o17bo3bo18bo2bobob2o2b2obo11bo64b2o712b2o5bo15b3o 19bo2bobobo2bo59b2o16b3o$731b2o38bobo42b2obo3b2o2bo128b2o666bobo15bo 23b2o4bo2b2o58bo19bo$731bo39bo5b2o14bo23bobob2o2b2o129b2o551bo114b2o 41bob2o2b2o2bo55bo20b2o11b2o$718b2o12b3o34bobo5b2o14bo23bobo4bo15bo24b o643b3o108b2o45bobob2o2b2obo54b2o32b2o$701b2o16bo14bo34b2o47b2ob4o14b 3o21bobo646bo22bo84bobo31b2o12bo5bo3bo$701bo14b3o73bo27bo17bobobo13b2o 6b2o645b2o20b3o11bo73bo31bobo13b3obob3o11b2o$680b2o20b3o11bo74bobo26bo bo13b3o3b3o11b2o44b2o32b2o594bo14b3o11b2o35b2o53bo17bobobo13b2o$681bo 22bo86b2o28b2o12bo3bobo3bo56bo20b2o11b2o594b2o16bo10bobo34bobo5b2o39b 2o2b2ob4o$678b3o114b2o37bob2o4b2obo23b2o33bo19bo624b2o12b3o34bo5b2o39b o2bobo4bo14b3o$678bo116bobo36bo4b3o2bo24bobo31b2o16b3o572b2o55bo8bo3bo 33bobo18b3o25b2obo2bo2b2o76b2o$572bo217b2o5bo11bo23b2obo5b2o27bo27b2o 20bo574b2o54bo9b2o2bo34b2o17bobobo25bobo3b2o2bo56b2o17b2o$573b2o116bo 18bo79b2o5b2o10b3o19bo2bo3bo2bo29b2o26bo645b2o6bo13b2o36b2o11b3o3b3o 23bob2obo2b2obo11bo43b2o$572b2o117b3o6b2o6b3o101bo18b2o2b2ob4o3b2o53b 3o642b3o20bo35bobo10bo4bo4bo2b2o19bo4bo4bo10bobo$694bo5b2o5bo103b2o24b o8bo19b2o34bo641b2obo13b2o4bo37bo11bob2o2bob2obo2bo20b3obob3o11b2o$ 693b2o12b2o117b2o9bobo6bobo17bo675b4ob2o12b2o4b2o49bo2b4obob2o24b5o17b 2o38b2o$826bo11b2o7b2o15bobo678bobo57bo13b2o4b2obo47bobo38bo$751b2o15b 2o54bobo24b2o6bo4b2o625b2o53bo58bo15bo2bobobo42b2o5bo35b3o12b2o$706b2o 42bobo15b2o43bo10b2o24bo2bo4bobo630b2o128b4ob2o43b2o5bobo33bo14bo16b2o $701b2o3b2o42bo61bobo5b2o29b2o5bobo727b2o13bo3bo17bo53b2o49b3o14bo$ 701b2o46b2o61bobo4bo2bo24b2o10bo48b2o678b2o11b3obob3o13bobo31bo74bo11b 3o20b2o$807b2o4bo6b2o24bobo59bo691bo3b2o4bo12b2o31bobo85bo22bo$806bobo 15b2o7b2o11bo42b2o15bobo602b2o32b2o28b2o23bob2o2b2obobo45b2o109b3o$ 806bo17bobo6bobo9b2o42b2o15b2o603b2o11b2o20bo27bobo24bo2b2o2b2obo41b2o 115bo$805b2o19bo8bo24b2o2b2obo656bo19bo29bo27b2o2b2obob2o23bo15bobo$ 711bo114b2o3b4ob2o2b2o18bo3bob2o657b3o16b2o27b2o29bo2bobobo2bo19b3o15b o5b2o$709b3o44bo74bo4bobo2bo19b3o663bo20b2o49b2o3b4ob2o2b2o18bo17b2o5b 2o79bo18bo$708bo47b3o42b2o26b2o2b2obob2o146bo562bo28b2o19bo8bo25bo104b 3o6b2o6b3o$708b2o49bo42bo25bo2b2o3bobo20b3o5b2o89b2o24b3o559b3o30bo17b obo6bobo9b2o10bo3bo107bo5b2o5bo$737bo20b2o42bobo22bob2o2b2obobo16b2obo 2bo5b2o90bo23bo562bo32bobo15b2o7b2o11bo10bo110b2o12b2o$735b3o16b2o47b 2o22bo4bo4bo12b2o3bob2o2bobo84bo10bobo21b2o595b2o4bo6b2o24bobo9bo$734b o19bo60b2o11b3obob3o13bobo9b2o82b3o11b2o623bobo4bo2bo24b2o3b2o53b2o15b 2o$721b2o11b2o20bo58b2o13b2ob2o17bo13b2o52bo9bo14bo639bobo5b2o29bobo 53b2o15bobo42b2o$721b2o32b2o91b4ob2o2b2o6bobo51bo10b3o12b2o639bo10b2o 25bo74bo42b2o$848bo2bo3bo2bo7bo52b3o11bo64b2o564bobo30bobo24b3o3bo6b2o 10b2o48b2o$846b2o5bob2o31b2o42b2o64b2o539b2o24b2o32bo11b2o7b2o5b2o2bo 5bobo9bo76b2o$845bo2b3o4bo24b2o5bobo650bo24bo33b2o9bobo6bobo5b2obo8bo 7bobo75b2o$832bo11bob2o4b2obo24b2o5bo652bobo15b2o24b2o24bo8bo9bo9b2o6b 2o78bo20b2o$800bo30bobo10bo3bobo3bo9b3o18bobo45b2o606b2o15b2o25bo18b2o 2b2ob4o3b2o129bo$752b2o46b2o30b2o11b3o3b3o9bobobo17b2o46b2o17b2o628b3o 19bo2bobobo2bo123bo8bobo$752b2o17b2o26bobo26b2o17bobobo9b3o3b3o11b2o 69b2o628bo23b2ob2o4b2o76bo44b3o6bobo$771b2o54bobo18b3o5b2o2bo4bo4bo10b obo119b2o602bobob4o2bo73b3o47bo7b4o$827bo5b2o14bo6bo2bob2obo2b2obo11bo 120b2o602bob2obo2b2obo71bo49b2o6b2o2bo$825bobo5b2o23b2obob4o2bo710b2o 5b2o5b2o12bo4bo4bo71b2o20bo36b3o$772b2o51b2o32bob2o4b2o13bo582bo114b2o 5bo5bobo13b3o3b3o11b2o63b2o16b3o35bo$772bo75bo10bobobo2bo15bo582b3o 117bobo5bo17bobobo13b2o64bo19bo$759b2o12b3o71bobo10b2ob4o82b2o32b2o 483bo22bo93b2o4b2ob4o14b3o78bo20b2o11b2o$742b2o16bo14bo71b2o13bo17bo3b o13b2o49bo20b2o11b2o482b2o20b3o11bo77b2o7bobobo2bo95b2o32b2o$742bo14b 3o91b2o9bobo13b3obob3o11b2o51bo19bo516bo14b3o75bobo6bobob2o2b2o$721b2o 20b3o11bo93bobo2b2obo3b2o12bo4b2o3bo62b2o16b3o517b2o16bo14bo60bo6b2ob 2o2b2o2bo182bo$722bo22bo4b2o94b2o5bo2bob2o16bobob2o2b2obo23b2o33b2o20b o536b2o12b3o37b2o26bo2bobob2o2b2obo11bo133bo4b2o27b2o$719b3o27bobo14bo 79b2o5b3o20bob2o2b2o2bo24bobo32bo505b2o64bo40bobo5b2o18b2o2bo4b2o3bo 10bobo131b2o6bo27b2o$719bo27b3o6b2o6b3o108b2obob2o2b2o27bo33b3o502b2o 64b2o41bo5b2o23b3obob3o11b2o135bo5bo$743b2obo3bo5b2o5bo87b3o19bo2bobob o2bo29b2o34bo611bobo30bo3bo17b2o78b2o52b2o3bo$743bob2o2b2o12b2o82b2obo 3bo18b2o2b2ob4o3b2o673b2o17b2ob2o30bobo58b2o17b2o42b2o13bo$847bob2o2b 2o24bo8bo19b2o607b2o47b2o11b3obob3o8bo14b2o5bo58b2o61b2o10bobo$807b2o 15b2o42b2o9bobo6bobo17bo589b2o17b2o46bobo10bo4bo4bo2b2o3bo14b2o5bobo 132b2o$762b2o42bobo15b2o42bo11b2o7b2o15bobo589b2o66bo11bob2o2b2obobo2b o26b2o$757b2o3b2o42bo59bobo24b2o6bo4b2o539b2o130bo2b2o3bob2o6bo78b2o$ 757b2o46b2o48bo10b2o24bo2bo4bobo52b2o490b2o131b2o2b2obobo6bobo78bo$ 854bobo5b2o29b2o5bobo52bo610bo15bo4bobo7b2o75b3o12b2o61b2o$854bobo4bo 2bo24b2o10bo34b2o15bobo609b3o14b4ob2o4b2o79bo14bo16b2o43b2obo30bo$849b 2o4bo6b2o24bobo17b2o26b2o15b2o594b2o13bobobo17bo5bobo95b3o14bo44b3o30b obo$848bobo15b2o7b2o11bo20bo557b2o32b2o46b2o11b3o3b3o13bobo5bo5b2o92bo 11b3o20b2o20b2o34b2o$767bo80bo17bobo6bobo9b2o17b3o558b2o11b2o20bo58bo 3bobo3bo12b2o5b2o5b2o79bo18bo5bo22bo20bo$765b3o44bo34b2o19bo8bo24b2o2b o573bo19bo35b2o23bob2o4b2obo106b3o6b2o6b3o29b3o21bo$764bo47b3o53b2o3b 4ob2o2b2o18bo578b3o16b2o33bobo24bo2b3o4bo109bo5b2o5bo34bo18bo$764b2o 49bo57bo2bobobo2bo19b6o5b2o567bo20b2o29bo27b2o5bob2o23bo83b2o12b2o53b 3o22bo$793bo20b2o27b2o26b2o4b2ob2o26bo5b2o589bo28b2o29bo2bo3bo2bo19b3o 176bo$791b3o16b2o32bo25bo2b4obobo24bo2bobo116bo474b3o55b2o3b4ob2o2b2o 18bo25b2o15b2o135b3o$790bo19bo33bobo22bob2o2bob2obo22b3o3b2o88b2o24b3o 474bo36b2o19bo8bo24b2o24b2o15bobo42b2o$777b2o11b2o20bo32b2o22bo4bo4bo 12b2o8bo10b2o85bo23bo515bo17bobo6bobo9b2o58bo42b2o3b2o$777b2o32b2o44b 2o11b3o3b3o13bobo7b2o8bobo74bo10bobo21b2o514bobo15b2o7b2o11bo58b2o46b 2o$857b2o13bobobo17bo18bo73b3o11b2o538b2o4bo6b2o24bobo$704bo168b3o14b 4ob2o2b2o34b2o27bo6bo14bo559bobo4bo2bo24b2o10bo$705bo184bo2bobobo2bo 26b2o5bobo27bobo4b3o12b2o558bobo5b2o36bobo$703b3o182b2o2b2obob2o28b2o 5bo29b2o8bo64b2o454b2o50bo10b2o32bobo$887bo2b2o2b2obo34bobo38b2o64b2o 455bo61bobo32bo4b2o10b2o66bo76bo$808b2o64bo11bob2o2b2obobo12b2ob2o17b 2o56b2o11bobo490bobo15b2o44bo11b2o7b2o15bobo9bo22bo44b3o72b2o$808b2o 17b2o27bo16bobo10bo3b2o4bo11b3obob3o11b2o78b3o486b2o15b2o44b2o9bobo6bo bo17bo7bobo20b3o47bo72b2o$827b2o26b2o17b2o11b3obob3o7b2o2bo4bo4bo10bob o43b2o18bo11b2o2bo534b2o24bo8bo19b2o6b2o20bo49b2o$749bo105bobo12b2o17b o3bo9bo2bobob2o2b2obo11bo44b2o17bo10b4ob2o535bo18b2o2b2ob4o3b2o49b2o 20bo$749b2o118bobo33b2obo3b2o2bo75bobo3bo7b3o531b2ob3o19bo2bobo4bo58b 2o16b3o$751b2o75b2o39bo5b2o14bo14bobob2o2b2o82bo45b2o494b2obo23b2obob 2o2b2o57bo19bo$753b2o73bo38bobo5b2o14bo14bobo4bo15bo114b2o490b2o5bo24b obo3b2o2bo54bo20b2o11b2o74bobo$752bobo60b2o12b3o35b2o38b2ob4o14b3o605b 2o5bob2o21bobob2o2b2obo53b2o32b2o74b2o$752bobo43b2o16bo14bo32bo25bo18b o17bobobo13b2o594bobob2o8b2o12bo4bo4bo164bo$798bo14b3o48b2o23bobo8b2o 7bobo13b3o3b3o11b2o479bo114b2o11bobo13b3obob3o11b2o$777b2o20b3o11bo51b o23b2o10bo8b2o12bo3bobo3bo55b2o32b2o400b3o108b2o15bo17b2ob2o13b2o$778b o22bo91b2o3b3o22bob2o4b2obo23b2o30bo20b2o11b2o403bo22bo84bobo8b2o2b2ob 4o$720bo54b3o83bobo29bobo2bo24bo4b3o2bo24bobo31bo19bo415b2o20b3o11bo 73bo9bo2bo3bo2bo$721bo53bo86b2o24b2o5bo26b2obo5b2o27bo30b2o16b3o437bo 14b3o11b2o35b2o33b2obo5b2o75b2o$719b3o67bo18bo53bo25b2o5b6o19bo2bo3bo 2bo29b2o25b2o20bo439b2o16bo10bobo34bobo5b2o14bo11bo4b3o2bo49b2o4b2o17b 2o$789b3o6b2o6b3o92bo18b2o2b2ob4o3b2o51bo478b2o12b3o34bo5b2o14bo11bob 2o4b2obo11bo37bo4b2o101bo$792bo5b2o5bo54bo36bo2b2o24bo8bo19b2o31b3o 422b2o64bo3bo33bobo32bo3bobo3bo10bobo35bo107bo$791b2o12b2o53b2ob2o30b 3o17b2o9bobo6bobo17bo34bo422b2o64b2o2bo34b2o17bo3bo11b3o3b3o11b2o36b2o 106b3o$861b3o30bo20bo11b2o7b2o15bobo528b2o36b2o11b3obob3o11bobobo17b2o 34bo2b2o$849b2o11bo3b2o26b2o17bobo24b2o6bo4b2o530bo35bobo10bo3b2o4bo2b 2o7b3o18bobo33bo3bo$804b2o42bobo15b2o34bo10b2o24bo2bo4bobo528b2o4bo37b o11bob2o2b2obobo2bo8bo14b2o5bo34b3o12b2o$799b2o3b2o42bo52bobo5b2o29b2o 5bobo509b2o17b2o4b2o49bo2b2o2b2ob2o25b2o5bobo34bobo10bo16b2o$799b2o46b 2o52bobo4bo2bo24b2o10bo510b2o75b2o2b2obobo34b2o35b2o11b3o14bo$896b2o4b o6b2o24bobo58b2o410b2o128bo2bobobo12bo73bo11b3o20b2o$895bobo15b2o7b2o 11bo60bo411b2o111b3o14b4ob2o12bobo84bo22bo$895bo17bobo6bobo9b2o41b2o 15bobo508b2o13bobobo17bo15b2o108b3o$894b2o19bo8bo24b2o26b2o15b2o509b2o 11b3o3b3o13bobo11b2o114bo$809bo105b2o3b4ob2o2b2o18bo567bo4bo4bo12b2o8b 2obobo168bo$807b3o44bo65bo4bobo2bo19b3o475b2o32b2o28b2o23bob2o2bob2obo 21b2obo5b2o161b2o$806bo47b3o33b2o26b2o2b2obob2o23bo127bo347b2o11b2o20b o27bobo24bo2b4obobo24bo5b2o79bo18bo63b2o$806b2o49bo33bo25bo2b2o3bobo 124b2o24b3o360bo19bo29bo27b2o4b2ob2o23bob2o83b3o6b2o6b3o56bobo$756bo 78bo20b2o33bobo22bob2o2b2obobo20b2o5b2o96bo23bo364b3o16b2o27b2o29bo2bo bobo2bo19b3ob2o86bo5b2o5bo59b2o$757bo75b3o16b2o38b2o22bo4bo4bo12b2o8bo 5b2o85bo10bobo21b2o365bo20b2o49b2o3b4ob2o2b2o18bo91b2o12b2o59bo$755b3o 74bo19bo51b2o11b3obob3o13bobo7bobo88b3o11b2o410bo28b2o19bo8bo24b2o$ 776bo42b2o11b2o20bo49b2o13b2ob2o17bo8b2o6bo65bo14bo423b3o30bo17bobo6bo bo9b2o44b2o15b2o$774bobo42b2o32b2o82b4ob2o2b2o6b2o2bobo63b3o12b2o422bo 32bobo15b2o7b2o11bo44b2o15bobo42b2o$775b2o160bo2bo3bo2bo5bobo2b2o67bo 64b2o403b2o4bo32bobo61bo42b2o3b2o$935b2o5bob2o8bo71b2o64b2o408bobo32b 2o10bo50b2o46b2o$900b2o32bo2b3o4bo31b2o524bobo36b2o5bobo$899b2o20bo11b ob2o4b2obo23b2o5bobo525bo10b2o24bo2bo4bobo$901bo18bobo10bo3bobo3bo24b 2o5bo51b2o485bobo24b2o6bo4b2o10b2o$850b2o69b2o11b3o3b3o30bobo51b2o17b 2o408b2o58bo11b2o7b2o15bobo9bo$850b2o17b2o46b2o17bobobo10b5o17b2o71b2o 409bo58b2o9bobo6bobo17bo7bobo72bo55bo$869b2o45bobo18b3o9b3obob3o11b2o 126b2o358bobo15b2o24b2o24bo8bo19b2o6b2o28bo44b3o51b2o$916bo5b2o14bo5b 2o2bo4bo4bo10bobo125b2o359b2o15b2o25bo18b2o2b2ob4o3b2o55b3o47bo51b2o$ 914bobo5b2o20bo2bob2obo2b2obo11bo528b3o19bo2bobobo2bo59bo49b2o$695bo 48bobo24bo98b2o42b2o30b2obo3b2o2bo541bo23b2obob2o2b2o57b2o20bo$696b2o 47b2o25b2o96bo66bo9bobo2bo2b2o567bob2o2b2o2bo60b2o16b3o$695b2o48bo25b 2o84b2o12b3o62bobo8bobo4bo14b3o71b2o32b2o445bobob2o2b2obo60bo19bo$840b 2o16bo14bo62b2o10b2ob4o88bo20b2o11b2o305bo112b2o5b2o5b2o12bo4b2o3bo58b o20b2o11b2o$840bo14b3o82b2o8bo17bobobo13b2o57bo19bo318b3o110b2o5bo5bob o7bo5b3obob3o11b2o46b2o32b2o$819b2o20b3o11bo84bobo7bobo13b3obob3o11b2o 56b2o16b3o322bo22bo91bobo5bo8b2o7bo3bo13b2o$820bo22bo91b2o5bo8b2o12bo 5bo3bo64b2o20bo323b2o20b3o11bo79b2o4b2ob4o4bobo$817b3o16bo18bo79b2o5b 2o20bobob2o2b2obo23b2o39bo366bo14b3o11b2o60b2o7bobobo2bo15bo$817bo18b 3o6b2o6b3o49bo58bob2o2b2o2bo24bobo39b3o363b2o16bo10bobo59bobo6bob2o4b 2o13bo166bo$839bo5b2o5bo50b2ob2o31bo23b2o4bo2b2o27bo41bo380b2o12b3o58b o6b2obob4o2bo179bobo$838b2o12b2o48b2o2bo32b3o19bo2bobobo2bo29b2o368b2o 64bo3bo34b2o26bo2bob2obo2b2obo11bo66b2o98b2o$903b3o7bo28bo18b2o2b2ob4o 3b2o394b2o64b2o2bo34bobo5b2o18b2o2bo4bo4bo10bobo46b2o17b2o$896b2o6bo6b obo27b2o24bo8bo19b2o417b4o23b2o34bo5b2o14bo8b3o3b3o11b2o47b2o109bo$ 851b2o42bobo13b3o42b2o9bobo6bobo17bo417b2ob2o24bo34bobo18b3o9bobobo17b 2o153bo$761bo84b2o3b2o42bo60bo11b2o7b2o15bobo416b2o2bo2bo15b2o4bo7bobo 26b2o17bobobo9b3o18bobo152b3o$732bobo27bo83b2o46b2o58bobo24b2o6bo4b2o 53b2o363bo3b3o15b2o4b2o7b2o30b2o11b3o3b3o23b2o5bo41b2o$711bo21b2o25b3o 180bo10b2o24bo2bo4bobo40b2o7bo8bo365bo2bo2bo29bo30bobo10bo3bobo3bo2b2o 18b2o5bobo40bo$712b2o19bo42bobo163bobo36b2o5bobo39b2obo7bo5bobo316b2o 51bobo61bo11bob2o4b2obo2bo26b2o37b3o12b2o$711b2o64b2o163bobo32b2o10bo 40bo2bo6bobo4b2o317b2o51b2o75bo2b3o4b2o6bo60bo14bo16b2o$777bo159b2o4bo 32bobo51b3o464b2o5bobo6bobo75b3o14bo$856bo79bobo15b2o7b2o11bo54b2o4bob o3b2o454bo2bo3bo7b2o77bo11b3o20b2o$854b3o44bo34bo17bobo6bobo9b2o60b4ob 2o455b4ob2o4b2o93bo22bo$853bo47b3o31b2o19bo8bo24b2o45bo2b3o343b2o32b2o 44b2o13b2ob2o17bo5bobo117b3o35bo$853b2o49bo51b2o3b4ob2o2b2o18bo10b2o5b 2o29b2o92bo252b2o11b2o20bo44b2o11b3obob3o13bobo5bo5b2o114bo33b2o$882bo 20b2o56bo4bobo2bo19b3o8bo5b2o29bo65b2o24b3o265bo19bo58bo4bo4bo12b2o5b 2o5b2o79bo18bo50b2o$880b3o16b2o30b2o26b2o2bo2bob2o23bo8bobo101bo23bo 269b3o16b2o32b2o23bob2o2b2obobo106b3o6b2o6b3o$879bo19bo32bo25bo2b2o3bo bo34b2o90bo10bobo21b2o270bo20b2o27bobo24bo2b2o3bobo109bo5b2o5bo$866b2o 11b2o20bo30bobo22bob2o2bob2obo38b2o84b3o11b2o315bo27bo27b2o2b2obob2o 23bo83b2o12b2o43bobo$866b2o32b2o31b2o22bo4bo4bo12b2o24bobo68bo14bo328b 3o27b2o29bo4bobo2bo19b3o142b2o$749bo195b2o11b3obob3o13bobo24bo69b3o12b 2o327bo55b2o3b4ob2o2b2o18bo25b2o15b2o102bo$750bo194b2o13b5o17bo46b2o 49bo64b2o309b2o19bo8bo24b2o24b2o15bobo42b2o$748b3o16bo210b4ob2o2b2o32b 2o5bobo48b2o64b2o310bo17bobo6bobo9b2o58bo42b2o3b2o$765bobo210bo2bobobo 2bo32b2o5bo428bobo15b2o7b2o11bo58b2o46b2o$766b2o208b2o2bo4b2o18b3o18bo bo429b2o4bo6b2o24bobo$897b2o76bo2b2o2b2obo18bobobo17b2o52b2o381bobo4bo 2bo24b2o10bo$897b2o17b2o44bo11bob2o2b2obobo16b3o3b3o11b2o56b2o17b2o 313b2o47bobo5b2o29b2o5bobo$916b2o43bobo10bo3bo5bo12b2o2bo4bo4bo10bobo 74b2o314bo39b2o7bo10b2o24bo2bo4bobo$962b2o11b3obob3o13bo2bob2obo2b2obo 11bo21bo104b2o263bobo15b2o20bobo17bobo24b2o6bo4b2o10b2o66bo$958b2o17bo bobo17b2obob4o2bo35bo103b2o264b2o15b2o22bo19bo11b2o7b2o15bobo9bo22bo 44b3o$733bo183b2o38bobo40bob2o4b2o13bo20b3o410b2o18b2o9bobo6bobo17bo7b obo20b3o47bo$734bo182bo39bo5b2o13b3o19bobobo2bo15bo421bobo11bo2b2o24bo 8bo19b2o6b2o20bo49b2o$732b3o169b2o12b3o34bobo5b2o36b2ob4o438b2o11bo3bo 18b2o2b2ob4o3b2o49b2o20bo$887b2o16bo14bo34b2o46bo17bo3bo13b2o55b2o32b 2o314bo13b3o3b2o14bo2bo3bo2bo58b2o16b3o12bo$887bo14b3o73bo24bobo13b3ob ob3o11b2o55bo20b2o11b2o198bo124b2o5bobo2bo16b2obo5b2o57bo19bo10bo2bo$ 755bo110b2o20b3o11bo74bobo24b2o12bo4b2o3bo69bo19bo211b3o122b2o5bob2o 19bo4b3o2bo54bo20b2o14bo$753bobo111bo22bo86b2o38bobob2o2b2obo23b2o43b 2o16b3o215bo22bo103bobobo20bob2o4b2obo53b2o30bo4bo$754b2o108b3o114b2o 34bob2o2b2o2bo24bobo38b2o20bo216b2o20b3o11bo91b2o4bo5b2o12bo3bobo3bo 89b2o$864bo116bobo8bo23b2obob2o2b2o27bo38bo259bo14b3o85b2o7b2o4bobo13b 3o3b3o11b2o$976b2o5bo8b3o19bo2bobobo2bo29b2o38b3o256b2o16bo14bo69bobo 12bo17bobobo13b2o6b2o66b3o$877bo18bo79b2o5b2o10bo18b2o2b2ob4o3b2o66bo 273b2o12b3o70bo7b2o2b2ob4o14b3o21bobo64bo$877b3o6b2o6b3o97b2o24bo8bo 19b2o266b2o64bo50b2o29bo2bobo4bo15bo24bo63bobo$880bo5b2o5bo115b2o9bobo 6bobo17bo267b2o64b2o49bobo5b2o23b2obob2o2b2o75b2o28bo$879b2o12b2o114bo 11b2o7b2o15bobo312b2o72bo5b2o24bobo3b2o2bo49b2o4b2o17b2o23bo3bo$1007bo bo24b2o6bo4b2o311b2ob2o71bobo29bobob2o2b2obo11bo37bo4b2o41bo2bo2b2o$ 748bo188b2o15b2o40bo10b2o24bo2bo4bobo316bo4bo16b2o53b2o17b2ob2o8bo4bo 4bo10bobo35bo49b3ob2obo$749b2o141b2o42bobo15b2o39bobo5b2o29b2o5bobo58b 2o256bo3b3o15b2o57b2o11b3obob3o7b3obob3o11b2o36b2o$748b2o137b2o3b2o42b o58bobo4bo2bo24b2o10bo59bo258b2o4bo72bobo10bo4bo4bo2b2o4b2ob2o17b2o34b o2b2o46b2o2bo$887b2o46b2o53b2o4bo6b2o24bobo51b2o15bobo209b2o51bobo73bo 11bob2o2b2obobo2bo26bobo33bo3bo49bo$989bobo15b2o7b2o11bo53b2o15b2o210b 2o51b2o87bo2b2o3bob2o23b2o5bo34b3o12b2o33b3o$989bo17bobo6bobo9b2o425b 2o2b2obobo24b2o5bobo34bobo10bo16b2o17bo$988b2o19bo8bo24b2o396bo15bo4bo bo32b2o35b2o11b3o14bo$1009b2o3b4ob2o2b2o18bo396b3o14b4ob2o11bo73bo11b 3o20b2o$897bo116bo2bobobo2bo19b3o285b2o32b2o56b2o13bobobo17bo12bobo84b o22bo27bo$895b3o44bo41b2o26b2o4b2ob2o23bo7b2o5b2o269b2o11b2o20bo56b2o 11b3o3b3o13bobo4b2o7b2o108b3o24bobo$894bo47b3o40bo25bo2b4obobo33bo5b2o 282bo19bo70bo3bobo3bo12b2o5bo4b2o114bo18bo5b2o$894b2o49bo39bobo22bob2o 2bob2obo33bobo116bo171b3o16b2o44b2o23bob2o4b2obo20bobobo132bo$923bo20b 2o40b2o22bo4bo4bo12b2o21b2o88b2o24b3o173bo20b2o39bobo24bo2b3o4bo19b2ob o5b2o127b3o$921b3o16b2o56b2o11b3o3b3o13bobo24b2o85bo23bo198bo39bo27b2o 5bob2o16bo2bobo5b2o79bo18bo$920bo19bo57b2o13bobobo17bo23bobo74bo10bobo 21b2o194b3o39b2o29bo2bo3bo2bo14b2o3b3o84b3o6b2o6b3o$753bobo151b2o11b2o 20bo71b3o14b4ob2o2b2o18bo73b3o11b2o217bo67b2o3b4ob2o2b2o18bo3bo36b2o 48bo5b2o5bo$754b2o151b2o32b2o88bo2bobobo2bo40b2o34bo14bo280b2o19bo8bo 24b2o2bo35b3obo45b2o12b2o$754bo274b2o2b2obob2o34b2o5bobo34b3o12b2o280b o17bobo6bobo9b2o18b2o33b4o$1028bo2b2o2b2obo35b2o5bo39bo64b2o227bobo15b 2o7b2o11bo19bo39b2o$1015bo11bob2o2b2obobo19b3o18bobo38b2o64b2o228b2o4b o6b2o24bobo17bobo37bobo42b2o$1014bobo10bo3b2o4bo19bobobo17b2o340bobo4b o2bo24b2o10bo7b2o19b2o18bo42b2o3b2o$1015b2o11b3obob3o18b3o3b3o11b2o 283b2o59bobo5b2o36bobo27bob2o16b2o46b2o$938b2o71b2o17bo3bo15b2o2bo4bo 4bo10bobo43b2o238bo60bo10b2o32bobo27bo3bo$938b2o17b2o21b2o28bobo37bo2b ob2obo2b2obo11bo44b2o17b2o219bobo15b2o52bobo32bo4b2o10b2o10b2o2bo$957b 2o22b2o27bo5b2o14bo19b2obob4o2bo76b2o220b2o15b2o54bo11b2o7b2o15bobo9bo 12b3o$980bo27bobo5b2o14bo20bob2o4b2o13bo114b2o199bo42b2o9bobo6bobo17bo 7bobo13bo$1008b2o43bobobo2bo15bo114b2o200bo26b2o24bo8bo19b2o6b2o71bo$ 958b2o71bo22b2ob4o330b3o27bo18b2o2b2ob4o3b2o55bo44b3o$958bo71bobo23bo 17bo3bo13b2o324b3o19bo2bobo4bo58b3o47bo$945b2o12b3o68b2o24bobo13b3obob 3o11b2o307b2o5b2o8bo23b2obob2o2b2o55bo49b2o$928b2o16bo14bo72b2o21b2o 12bo4b2o3bo55b2o32b2o228b2o5bo34bobo3b2o2bo54b2o20bo$928bo3bo10b3o88bo bo33bobob2o2b2obo23b2o30bo20b2o11b2o116bo116bobo34bobob2o2b2obo57b2o 16b3o$907b2o20b4o10bo85b2o5bo33bob2o2b2o2bo24bobo31bo19bo129b3o114b2o 22b2o12bo4bo4bo58bo19bo$908bo40bo79b2o5b2o7bo23b2obob2o2b2o27bo30b2o 16b3o133bo22bo86b2o25bobo13b3obob3o11b2o44bo20b2o11b2o$905b3o21b4o6b2o 6b3o95b3o19bo2bobobo2bo29b2o25b2o20bo134b2o20b3o11bo74bobo24bo17b2ob2o 13b2o44b2o32b2o$905bo23bo3bo5b2o5bo101bo18b2o2b2ob4o3b2o51bo40bobo134b o14b3o73bo19b2o2b2ob4o$932b2o12b2o99b2o24bo8bo19b2o31b3o37b2o135b2o16b o14bo34b2o41bo2bo3bo2bo$1062b2o9bobo6bobo17bo34bo38bo152b2o12b3o34bobo 5b2o14bo20b2obo5b2o$990b2o15b2o53bo11b2o7b2o15bobo173b2o64bo39bo5b2o 14bo21bo4b3o2bo$945b2o42bobo15b2o51bobo32bo4b2o174b2o64b2o38bobo41bob 2o4b2obo11bo$940b2o3b2o42bo59bo10b2o32bobo286b2o17bo3bo20bo3bobo3bo10b obo63b2o$940b2o46b2o58bobo5b2o36bobo290b2o11b3obob3o19b3o3b3o11b2o39b 2o4b2o17b2o$1048bobo4bo2bo24b2o10bo245b2o43bobo10bo3b2o4bo2b2o16bobobo 17b2o36bo4b2o$1043b2o4bo6b2o24bobo58b2o177b2o17b2o44bo11bob2o2b2obobo 2bo17b3o18bobo34bo$1042bobo15b2o7b2o11bo60bo178b2o76bo2b2o2b2ob2o20bo 14b2o5bo34b2o$1042bo17bobo6bobo9b2o41b2o15bobo127b2o128b2o2b2obobo36b 2o5bobo34bo2b2o$950bo90b2o19bo8bo24b2o26b2o15b2o128b2o130bo2bobobo44b 2o34bo3bo$948b3o44bo66b2o3b4ob2o2b2o18bo289b3o14b4ob2o23bo58b3o12b2o$ 947bo47b3o69bo2bobobo2bo19b3o270b2o13bobobo17bo24bobo59bobo10bo16b2o$ 947b2o49bo38b2o26b2o4b2ob2o23bo125bo144b2o11b3o3b3o13bobo25b2o60b2o11b 3o14bo$976bo20b2o39bo25bo2b4obobo122b2o24b3o65b2o32b2o55bo4bo4bo12b2o 22b2o79bo11b3o20b2o$944bo29b3o16b2o43bobo22bob2o2bob2obo20b2o5b2o94bo 23bo68b2o11b2o20bo30b2o23bob2o2bob2obo34bobo91bo22bo$944b2o27bo19bo45b 2o22bo4bo4bo12b2o8bo5b2o83bo10bobo21b2o80bo19bo31bobo24bo2b4obobo34bo 5b2o110b3o$943bobo14b2o11b2o20bo55b2o11b3o3b3o13bobo7bobo86b3o11b2o 104b3o16b2o30bo27b2o4b2ob2o23bo8b2o5b2o79bo18bo13bo51bobo$960b2o32b2o 55b2o13bobobo17bo8b2o70bo14bo122bo20b2o25b2o29bo2bobobo2bo19b3o96b3o6b 2o6b3o65b2o$1067b3o14b4ob2o2b2o6b2o66b3o12b2o17b2o124bo51b2o3b4ob2o2b 2o18bo102bo5b2o5bo69bo$1084bo2bobobo2bo5bobo69bo30bobo31b2o87b3o31b2o 19bo8bo24b2o100b2o12b2o$1082b2o2b2obob2o8bo69b2o30bo33b2o87bo34bo17bob o6bobo9b2o$1081bo2b2o2b2obo31b2o236bobo15b2o7b2o11bo54b2o15b2o$902bo 165bo11bob2o2b2obobo23b2o5bobo94b3o140b2o4bo6b2o24bobo52b2o15bobo42b2o $903bo87b2o74bobo10bo3b2o4bo9bo14b2o5bo49b2o45bo2bo144bobo4bo2bo24b2o 10bo60bo42b2o3b2o$901b3o34bo52b2o17b2o56b2o11b3obob3o9b3o18bobo49b2o 17b2o25bo148bobo5b2o36bobo59b2o46b2o$937bo72b2o52b2o17bo3bo10bobobo17b 2o69b2o25bo4bo144bo10b2o32bobo$935bobo125bobo30b3o3b3o11b2o105bo18b2o 75b2o58bobo32bo4b2o10b2o$934bo2bo125bo5b2o14bo5b2o2bo3bobo3bo10bobo 123b2o76bo60bo11b2o7b2o15bobo9bo172bo$933b2ob2o73b2o48bobo5b2o14bo5bo 2bob2o4b2obo11bo102bo99bobo15b2o41b2o9bobo6bobo17bo7bobo171bo$934bobo 74bo49b2o30b2o4b3o2bo115bo100b2o15b2o26b2o24bo8bo19b2o6b2o83bo88b3o$ 935bo62b2o12b3o69bo9bobo5b2o117b3o143bo18b2o2b2ob4o3b2o67bo44b3o$981b 2o16bo14bo68bobo8bo3bo2bo86b2o174b3o19bo2bobobo2bo70b3o47bo$981bo14b3o 79b3o2b2o10b2ob4o86bo20b2o153bo23b2obob2o2b2o67bo49b2o51bo$960b2o20b3o 11bo83bo6b2o8bo17b2ob2o13b2o55bo19bo178bob2o2b2o2bo66b2o20bo80bobo$ 961bo22bo94bo7bobo7bobo13b3obob3o11b2o54b2o16b3o150b2o5b2o20bobob2o2b 2obo69b2o16b3o78b2o22bo$958b3o121b2o5bo8b2o12bo4bo4bo62b2o20bo152b2o5b o8b2o12bo4b2o3bo70bo19bo101bobo$958bo24bo18bo79b2o5b2o20bobob2o2b2obo 23b2o37bo179bobo7bobo13b3obob3o11b2o56bo20b2o11b2o88b2o$983b3o6b2o6b3o 108bobo3b2o2bo24bobo37b3o176b2o8bo17bo3bo13b2o56b2o32b2o$986bo5b2o5bo 86bo23b2obob2o2b2o27bo39bo172b2o6b2o2b2ob4o$985b2o12b2o85b3o19bo2bobo 4bo29b2o211bobo5bo2bobobo2bo15bo$1089bo18b2o2b2ob4o3b2o238bo8b2ob2o4b 2o13bo$886bo156b2o15b2o26b2o24bo8bo19b2o194b2o31bobob4o2bo$884bobo111b 2o42bobo15b2o41b2o9bobo6bobo17bo195bobo5b2o23bob2obo2b2obo11bo$885b2o 106b2o3b2o42bo48b2o10bo11b2o7b2o15bobo197bo5b2o24bo4bo4bo10bobo75b2o$ 993b2o46b2o58bobo24b2o6bo4b2o51b2o145bobo18b3o9b3o3b3o11b2o57b2o17b2o 98bobo$1096b2o3b2o24bo2bo4bobo56bo147b2o17bobobo10bobobo17b2o53b2o117b 2o$1096bobo29b2o5bobo37b2o15bobo151b2o11b3o3b3o9b3o18bobo172bo$1096bob 2o24b2o10bo38b2o15b2o151bobo10bo4bo4bo2b2o20b2o5bo$1084b2o9b4o24bobo 220bo11bob2o2bob2obo2bo20b2o5bobo49b2o$935bo67bo79bobo5b2obo2bo3b2o7b 2o11bo235bo2b4obob2o30b2o50bo$936b2o63b3o44bo34bo8bo2bo5bobo6bobo9b2o 222bo13b2o4b2obo9bo70b3o12b2o96bo$935b2o63bo47b3o31b2o9b2o8bo8bo24b2o 207bo15bo2bobobo8bobo69bo14bo16b2o77b2o$1000b2o49bo51b2o3b4ob2o2b2o18b o8b2o5b2o115bo91b4ob2o10b2o85b3o14bo78b2o$1029bo20b2o56bo2bo3bo2bo19b 3o6bo5b2o87b2o24b3o58b2o13bo3bo17bo8b2o91bo11b3o20b2o$956bo70b3o16b2o 30b2o26b2o5bob2o23bo6bobo93bo23bo61b2o11b3obob3o13bobo7bobo103bo22bo$ 957bo68bo19bo32bo25bo2b3o4bo32b2o82bo10bobo21b2o72bo3b2o4bo12b2o8bo5b 2o122b3o$955b3o55b2o11b2o20bo30bobo22bob2o4b2obo36b2o76b3o11b2o70b2o 23bob2o2b2obobo20b2o5b2o79bo18bo25bo$902bo110b2o32b2o31b2o22bo3bobo3bo 12b2o22bobo60bo14bo85bobo24bo2b2o2b2obo108b3o6b2o6b3o$900bobo189b2o11b 3o3b3o13bobo22bo61b3o12b2o84bo27b2o2b2obob2o23bo86bo5b2o5bo$901b2o189b 2o13bobobo17bo44b2o41bo64b2o30b2o29bo2bobobo2bo19b3o85b2o12b2o$1108b3o 14b4ob2o2b2o30b2o5bobo40b2o64b2o56b2o3b4ob2o2b2o18bo163bo$1109bo15bo4b obo2bo15bo14b2o5bo145b2o19bo8bo24b2o26b2o15b2o117bobo$1040b2o3b2o76b2o 2b2obob2o16b3o18bobo146bo17bobo6bobo9b2o41b2o15bobo42b2o72b2o$1030b2o 3b2o2b3o2b3o75bo2b2o3bobo16bobobo17b2o44b2o101bobo15b2o7b2o11bo60bo42b 2o3b2o$952bo76bobo3b5o23b2o44bo11bob2o2b2obobo14b3o3b3o11b2o48b2o17b2o 83b2o4bo32bobo58b2o46b2o$950bobo76bo3bo2bo2bo23b2o43bobo10bo4bo4bo10b 2o2bo3bobo3bo10bobo66b2o88bobo32b2o10bo$951b2o76b2o3bo4b2o3bo2bo61b2o 11b3obob3o11bo2bob2o4b2obo11bo118b2o37bobo36b2o5bobo$1034bo3b5ob4o57b 2o17b2ob2o15b2o4b3o2bo4bo126b2o38bo10b2o24bo2bo4bobo$1033bo7b4ob2o16b 2o38bobo38bobo5b2o5bobo175bobo24b2o6bo4b2o10b2o$1042b2o20bo39bo5b2o33b o3bo2bo7b2o178bo11b2o7b2o15bobo9bo69bo$1051b2o12b3o34bobo5b2o34b2ob4o 187b2o9bobo6bobo17bo7bobo24bo44b3o$1034b2o16bo14bo34b2o44bo17b2ob2o13b 2o47b2o32b2o56b2o24bo8bo19b2o6b2o23b3o47bo$1034bo14b3o73bo22bobo13b3ob ob3o11b2o47bo20b2o11b2o57bo18b2o2b2ob4o3b2o51bo49b2o77bobo$1013b2o20b 3o11bo74bobo22b2o12bo4bo4bo61bo19bo67b3o19bo2bobobo2bo56b2o20bo106b2o$ 1014bo22bo86b2o36bobob2o2b2obo23b2o35b2o16b3o68bo23b2ob2o4b2o58b2o16b 3o99bo5bo$1011b3o114b2o32bobo3b2o2bo24bobo30b2o20bo95bobob4o2bo58bo19b o96b2o$938bo72bo116bobo6bo23b2obob2o2b2o27bo30bo110b2o5bob2obo2b2obo 55bo20b2o11b2o84b2o$936bobo184b2o5bo6b3o19bo2bobo4bo29b2o30b3o101b2o4b obo5bo4bo4bo55b2o32b2o$937b2o18bo66bo18bo79b2o5b2o8bo18b2o2b2ob4o3b2o 58bo100bobo4bo8b3o3b3o11b2o$958bo65b3o6b2o6b3o95b2o24bo8bo19b2o138bo 17bobobo13b2o$956b3o68bo5b2o5bo113b2o9bobo6bobo17bo133b2o2b2ob4o14b3o$ 1026b2o12b2o112bo11b2o7b2o15bobo133bo2bobobo2bo$1152bobo24b2o6bo4b2o 136b2obob2o2b2o$1084b2o15b2o38bo10b2o24bo2bo4bobo142bob2o2b2o2bo76b2o$ 1039b2o42bobo15b2o37bobo36b2o5bobo50b2o90bobob2o2b2obo11bo44b2o17b2o$ 1034b2o3b2o42bo56bobo32b2o10bo51bo92bo4b2o3bo10bobo43b2o$1034b2o46b2o 51b2o4bo32bobo43b2o15bobo93b3obob3o11b2o$1134bobo15b2o7b2o11bo45b2o15b 2o96bo3bo17b2o153bobo$1134bo17bobo6bobo9b2o18b2o162bobo38b2o112b2o$ 1133b2o19bo8bo24b2o2bo2bo141bo14b2o5bo39bo113bo$926bo227b2o3b4ob2o2b2o 18bo3bo2bo141bo14b2o5bobo34b3o12b2o$876bobo48b2o23bobo89bo114bo2bo3bo 2bo19b3ob2o165b2o34bo14bo16b2o$877b2o47b2o25b2o87b3o44bo39b2o26b2o5bob 2o24bo5b2o138bo73b3o14bo$877bo75bo87bo47b3o38bo25bo2b3o4bo22b2obo5b2o 137bobo74bo11b3o20b2o$1041b2o49bo37bobo22bob2o4b2obo22b2obobo117bo25b 2o86bo22bo$1070bo20b2o38b2o22bo3bobo3bo12b2o13b2o89b2o24b3o21b2o114b3o $1068b3o16b2o54b2o11b3o3b3o13bobo16b2o86bo23bo23bobo116bo$1067bo19bo 55b2o13bobobo17bo15bobo75bo10bobo21b2o22bo5b2o$1054b2o11b2o20bo69b3o 14b4ob2o2b2o10bo74b3o11b2o44b2o5b2o79bo18bo76bo$1054b2o32b2o70bo15bo4b obo2bo32b2o35bo14bo148b3o6b2o6b3o75bo$1174b2o2b2obob2o26b2o5bobo35b3o 12b2o150bo5b2o5bo78b3o$1173bo2b2o3bobo12bo14b2o5bo40bo64b2o96b2o12b2o 43bo$1160bo11bob2o2b2obobo11b3o18bobo39b2o64b2o155bobo$1159bobo10bo4bo 4bo11bobobo17b2o143b2o15b2o101b2o24bo$1160b2o11b3obob3o10b3o3b3o11b2o 147b2o15bobo42b2o82bobo$914bo28bo141b2o69b2o17b2ob2o7b2o2bo3bobo3bo10b obo44b2o119bo42b2o3b2o77b2o$915b2o24bobo141b2o17b2o49bobo29bo2bob2o4b 2obo11bo45b2o17b2o100b2o46b2o$892bobo19b2o26b2o14bo145b2o49bo5b2o26b2o 4b3o2bo77b2o$893b2o64b2o192bobo5b2o27bobo5b2o129b2o$893bo64b2o193b2o 35bo3bo2bo131b2o$1105b2o69bo14b2ob4o$1105bo69bobo15bo17b2ob2o13b2o188b o$1092b2o12b3o66b2o16bobo13b3obob3o11b2o143bo44b3o$1075b2o16bo14bo70b 2o13b2o12bo4bo4bo56b2o32b2o61b3o47bo61bobo$1075bo3bo10b3o86bobob2o22bo bob2o2b2obo23b2o31bo20b2o11b2o60bo49b2o61b2o$1054b2o20b4o10bo83b2o5bob 2o22bobo3b2o2bo24bobo32bo19bo73b2o20bo91bo$1055bo38bo79b2o5bo24b2obob 2o2b2o27bo31b2o16b3o78b2o16b3o14bo$1052b3o19b4o6b2o6b3o84b2ob3o19bo2bo bo4bo29b2o26b2o20bo81bo19bo13bo2b2o62bo$1052bo21bo3bo5b2o5bo86bo2bo3bo 18b2o2b2ob4o3b2o52bo101bo20b2o12bo5bo59b2o$1077b2o12b2o85bo2bo2b2o24bo 8bo19b2o32b3o98b2o34bobo2b2o59b2o$931bo247b2o18b2o9bobo6bobo17bo35bo 134bo3b2o$929bobo16bo186b2o15b2o45bo11b2o7b2o15bobo172b3o$930b2o17bo 140b2o42bobo15b2o43bobo32bo4b2o$947b3o135b2o3b2o42bo51bo10b2o32bobo$ 1085b2o46b2o50bobo5b2o36bobo$1185bobo4bo2bo24b2o10bo144b2o$1180b2o4bo 6b2o24bobo59b2o75b2o17b2o$1179bobo15b2o7b2o11bo61bo76b2o$1179bo17bobo 6bobo9b2o42b2o15bobo174bobo$1095bo82b2o19bo8bo24b2o27b2o15b2o175b2o$ 915bo177b3o44bo58b2o3b4ob2o2b2o18bo117bob2o2b2o47b3o42bo5bo$913bobo 176bo47b3o61bo2bo3bo2bo19b3o114b2obo3bo47b3o40b2o$914b2o176b2o49bo30b 2o26b2o5bob2o6bo16bo118b3o12b2o34bo43b2o$1121bo20b2o31bo25bo2b3o4bo7b 2o149bo16b2o$936bo182b3o16b2o35bobo22bob2o4b2obo6bobo12b2o5b2o89b2o24b 3o11b3o14bo$937bo180bo19bo37b2o22bo3bobo3bo12b2o9bo5b2o90bo23bo3bob2o 9bo11b3o20b2o$935b3o167b2o11b2o20bo47b2o11b3o3b3o13bobo8bobo59bo24bo 10bobo21b2o2b2obo21bo22bo$1105b2o32b2o47b2o13bobobo17bo9b2o57b2o23b3o 11b2o74b3o$1204b3o14b4ob2o2b2o7b2o54b2o6bo14bo92bo$1205bo15bo4bobo2bo 6bobo62b3o12b2o$1219b2o2b2obob2o9bo66bo64b2o$1218bo2b2o3bobo32b2o42b2o 64b2o54bobo$1205bo11bob2o2b2obobo9bo14b2o5bobo164b2o$1136b2o66bobo10bo 4bo4bo10bo14b2o5bo167bo$1136b2o17b2o48b2o11b3obob3o31bobo45b2o$929bobo 223b2o44b2o17b2ob2o11bo3bo17b2o46b2o17b2o$930b2o268bobo31b3obob3o11b2o 69b2o$930bo269bo5b2o21b2o2bo4b2o3bo10bobo119b2o$1156b2o40bobo5b2o21bo 2bobob2o2b2obo11bo120b2o$1156bo41b2o31b2ob2o2b2o2bo$1143b2o12b3o61bo 10bobob2o2b2o$1126b2o16bo14bo60bobo9bobobo2bo$1126bo14b3o76b2o11b2ob4o 14b3o65b2o32b2o73bo$1105b2o20b3o11bo82b2o9bo17bobobo13b2o49bo20b2o11b 2o72bo$1106bo22bo94bobo8bobo13b3o3b3o11b2o51bo19bo85b3o$1103b3o113b2o 5bo9b2o12bo4bo4bo62b2o16b3o80bo$1103bo16bo18bo79b2o5b2o21bob2obo2b2obo 23b2o33b2o20bo82bobo$1120b3o6b2o6b3o109bobob4o2bo24bobo32bo104b2o$ 1123bo5b2o5bo87bo23b2ob2o4b2o27bo33b3o$935bo186b2o12b2o86b3o19bo2bobob o2bo29b2o34bo$936b2o289bo18b2o2b2ob4o3b2o$935b2o243b2o15b2o27b2o24bo8b o19b2o$1135b2o42bobo15b2o42b2o9bobo6bobo17bo$1130b2o3b2o42bo61bo11b2o 7b2o15bobo$1130b2o46b2o59bobo24b2o6bo4b2o$1228bo10b2o24bo2bo4bobo52b2o $1227bobo5b2o29b2o5bobo52bo$1227bobo4bo2bo24b2o10bo34b2o15bobo$1222b2o 4bo6b2o24bobo17b2o26b2o15b2o$1140bo80bobo15b2o7b2o11bo20bo$1138b3o44bo 35bo17bobo6bobo9b2o17b3o$1137bo47b3o32b2o19bo8bo24b2o2bo$1137b2o49bo 52b2o3b4ob2o2b2o18bo$1166bo20b2o57bo2bobobo2bo19b6o5b2o$1164b3o16b2o 31b2o26b2o2b2obob2o26bo5b2o$1145bobo15bo19bo33bo25bo2b2o2b2obo24bo2bob o$1140b3o7b2o11b2o20bo31bobo22bob2o2b2obobo22b3o3b2o$1140bo2b2o4bobo 32b2o32b2o22bo3b2o4bo12b2o8bo10b2o$1140b2ob4o83b2o11b3obob3o13bobo7b2o 8bobo51bobo$1142b3o85b2o13bo3bo17bo18bo52b2o$1263b4ob2o2b2o34b2o30bo$ 1247bo15bo2bobobo2bo26b2o5bobo$1247bo13b2o4b2ob2o13bo14b2o5bo$1181b2o 77bo2b4obobo13b3o18bobo$1181b2o17b2o45bo11bob2o2bob2obo12bobobo17b2o$ 1200b2o44bobo10bo4bo4bo11b3o3b3o11b2o$1247b2o11b3o3b3o7b2o2bo3bobo3bo 10bobo$1243b2o17bobobo9bo2bob2o4b2obo11bo$1201b2o27b3o9bobo18b3o12b2o 4b3o2bo$1201bo28bo11bo5b2o29bobo5b2o$1188b2o12b3o26bo8bobo5b2o29bo3bo 2bo$1171b2o16bo14bo31bo3b2o38b2ob4o$1171bo14b3o45bo2bo25bo18bo17b2ob2o 13b2o$1150b2o20b3o11bo46bo4bo23bobo8b2o7bobo13b3obob3o11b2o$1151bo22bo 57bo5bo23b2o10bo8b2o12bo4bo4bo$1148b3o84b2ob2o26b2o3b3o22bobob2o2b2obo 23b2o$1148bo84bob2o29bobo2bo24bobo3b2o2bo24bobo$1233bo2b2o23b2o5bo26b 2obob2o2b2o27bo86bo$1162bo18bo52b3o24b2o5b6o19bo2bobo4bo29b2o83b2o$ 1162b3o6b2o6b3o53bo38bo18b2o2b2ob4o3b2o110b2o$1165bo5b2o5bo91bo2b2o24b o8bo19b2o$1164b2o12b2o88b3o17b2o9bobo6bobo17bo$1267bo20bo11b2o7b2o15bo bo$1115bobo104b2o15b2o26b2o17bobo24b2o6bo4b2o$1084bo31b2o59b2o42bobo 15b2o34bo10b2o24bo2bo4bobo$1082bobo31bo55b2o3b2o42bo52bobo5b2o29b2o5bo bo$1083b2o87b2o46b2o52bobo4bo2bo24b2o10bo$1257b2o10b2o4bo6b2o24bobo$ 1258bo9bobo15b2o7b2o11bo$1258bobo7bo17bobo6bobo9b2o113bo$1259b2o6b2o 19bo8bo24b2o98bobo$1182bo105b2o3b4ob2o2b2o18bo99b2o$1180b3o44bo65bo2bo 3bo2bo19b3o$1179bo47b3o61b2o5bob2o23bo62bo$1179b2o49bo59bo2b3o4bo86bo$ 1208bo20b2o58bob2o4b2obo86b3o22bo$1206b3o16b2o62bo3bobo3bo12b2o97bo$ 1132bo72bo19bo51b2o11b3o3b3o13bobo96b3o$1133bo58b2o11b2o20bo49b2o13bob obo17bo$1131b3o58b2o32b2o65b3o14b4ob2o2b2o$1145bobo146bo15bo4bobo2bo$ 1146b2o160b2o2b2obob2o$1067bo78bo160bo2b2o3bobo$1068bo225bo11bob2o2b2o bobo$1066b3o206b2o16bobo10bo4bo4bo$1223b2o50bobo16b2o11b3obob3o76bo$ 1223b2o17b2o31bo14b2o17b2ob2o76b2o$1242b2o45bobo99b2o$1289bo5b2o$1287b obo5b2o$1243b2o42b2o$1116bobo124bo40b2o24bo$1117b2o111b2o12b3o37b2o23b obo68bobo$1117bo95b2o16bo14bo37b2o23b2o69b2o$1213bo14b3o82b2o66bo$ 1192b2o20b3o11bo54bo29bobo$1138bo54bo22bo64bobo24b2o5bo$1136bobo51b3o 16bo18bo53b2o24b2o5b2o$1083bo53b2o51bo18b3o6b2o6b3o$1084bo127bo5b2o5bo 54b2o$1082b3o126b2o12b2o53bo2b2o$1280bo3bo72bo$1269b2o10b3o2b2o68bo$ 1224b2o42bobo15b2o68b3o$1219b2o3b2o42bo$1133bo85b2o46b2o$1134bo$1132b 3o3$1229bo$1227b3o44bo$1226bo47b3o$1226b2o49bo83bo$1255bo20b2o81b2o$ 1253b3o16b2o86b2o$1252bo19bo80bobo$1119bo119b2o11b2o20bo78b2o$1120bo 118b2o32b2o79bo$1118b3o$1139bo$1137bobo$1138b2o2$1270b2o$1270b2o17b2o 4b2o$1289b2o4bo$1296bo$1295b2o35bo$1290b2o2bo35b2o$1290bo3bo36b2o$ 1277b2o12b3o$1058bo48bobo24bo143bo10bobo$1059b2o47b2o25b2o125b2o11b3o 11b2o$1058b2o48bo25b2o103b2o21bobo10bo$1240bo23bo$1237b3o24b2o$1237bo 3$1334bo$1334bobo$1300bo33b2o$1299bo$1299b3o24bo$1325bo$1124bo200b3o$ 1095bobo27bo$1074bo21b2o25b3o$1075b2o19bo42bobo$1074b2o64b2o$1140bo3$ 1304bo$1302b2o$1303b2o$1272bo$1271bo$1271b3o20bobo$1294b2o$1112bo182bo $1113bo$1111b3o16bo$1128bobo$1129b2o4$1276bo$1274b2o$1096bo178b2o$ 1097bo170bobo$1095b3o170b2o$1269bo2$1118bo$1116bobo$1117b2o4$1247bo$ 1245b2o$1246b2o2$1111bo$1112b2o$1111b2o6$1249bo$1249bobo$1243bo5b2o$ 1242bo$1242b3o3$1116bobo$1117b2o$1117bo103$1397b2o$1397b2o7$1405b2o$ 1405b2o2$1384b2o$1385b2o$1384bo$1391b3o11b3obo$1390bo2bo10bobo6bo$ 1389bo4bo9bobo2b4obo$1389bo5bo8b2o2b2o2bobo$1389b4o2bo10bobo4bo2$1393b o$1394b2o3$1400b2o$1399bo2bo$1400b2o2$1412b2o$1411bo2bo$1405bo4bo$ 1398bo4bo2bo2bo$1397b2o4bo2bo2bo4b2o$1397bobo3bo5bo4bob2o$1398bo5bobo 4b3obo$1397bobo4bobo$1397bobo3$1395b5o$1394bob4o$1393bo$1394b2o$1369bo $1367b2ob2o25b3o$1364b5o$1364bo2bo$1364bo2bo$1365b2o$1359b2o$1359b2o4$ 1375b2o12bo$1374b2ob2o10bo$1374bo2b2ob2o6bo$1367b2o5b4o4b2o5b2obo$ 1367b2o6b2o2b2ob2o5b2ob2o$1357b2o31bobo$1357b2o$1375bo$1373b2ob3o$ 1374b2ob2o$1374b2obobo81b2o$1375bo2b2o81b2o$1375b2obo$1365b2o10b3o$ 1365b2o12b2o$1377bob2o$1377bobo$1378bo$1331bobo135b2o$1331b2o136b2o$ 1332bo$1376b2o$1375bo$1375bo$1375b7o$1350b2o12bo11bo5bo$1349b2o13bo12b 3o2bo73b2o$1349b3o11bo13bo4bo72bo2bo13b2o$1357bo6b2obo10bo2bo74b2o14bo 2bo$1346bo4bob2obobo5b2ob2o9b3o91bo3bo$1345b2o4bo2bo2bo7bobo105b3o$ 1345bobo3bobo84bo$1346bo91b2o$1345bobo89bobo30bobo$1345bobo116b2o3bo3b o$1463bo2bo7b2o$1464b2o3bo5bo$1325bo17b5o121bo6bo$1324bobo15bob4o122b 2o4bo$1324bobo14bo134bo$1325bo16b2o128bo3bo$1472bo3bo$1345b3o125bobo$ 1308b2o163b3o$1308b2o145bobo$1333bo114b2o3b2obo$1332bobo113b5ob2o3b2o$ 1332bobo113bob2obobo3b2o$1333bo115b2o4bob2o2bo$1448b3o5bobobo$1448b3o 7bobo$1316b2o17b2o105b2o$1316b2o16bo2bo103b2o$1328bo4bo108b2o$1326bo2b o2bo110b3o$1326bo2bo2bo4b2o105bobo$1326bo5bo4bob2o103bo2bo$1327bobo4b 3obo108bo$1327bobo115bobo$1423b2o20b3o$1423b2o$1413b2o$1413b2o$1409b3o $1408bo2bo32b2o$1408bo4bo29bo2bo$1407b2ob2obo29b2o72b2o$1407b2obo2bo 17b2o11b5o68b2o$1409b4o18b2o15b2o$1410b3o8b2o22b2o2b2o$1421b2o22bo2b2o $1407bo38b3o$1405b2o40bo$1406b2o$1507b2o16b2o$1430bo77b2o15b2o$1428b2o b2o8b4o62bo$1426bo2bo3bo6b2o4bo$1425bo3bo4bo5b3o4bo$1424b2ob2o5bo7bo5b o$1425bo3bo4bo5b2o73bo$1425b2o3bob2o6b2o2b2o4bo62b2ob2o$1420bobo17bo9b o58b2o2b4o10bo5b2o$1419b2ob2o17bo2bo3bo60b3o11bo2bo6b2o$1420bo2bo18bo 64bo2bo11bo$1421b3o19b2obo60bobo13b2o$1445bo$1375bo$1373b2o5b2o$1374b 2o4b3o36b2o$1379bo2bo35bo2bo98b2o$1379bob2o35b2o99bo2bo$1377bo3bo37b5o 96b2o$1375bo4b2o41b2o$1375bo5bo38b2o2b2o$1377b3obo38bo2b2o$1378bo24bob o15b3o111b3o$1379b3o14b2o3b2obo17bo$1396b5ob2o3b2o109bo10bo5bo3bo$ 1364b2o30bob2obobo3b2o109bo8b2obo5b4o$1364b2o37bob2o2bo119bo9bo$1389bo 6bo7bobobo$1388bobo5bo9bobo109bo$1388bobo6bo120b2o$1380b2o7bo128b2o$ 1380bo14bo$1381bo13bo3bo91b2o$1372b2o22b3o93b2o$1372b2o6b3o108bo25bo$ 1381bo99b2o33bo$1381b2o10bobo85b2o33b2o$1392bo3bo84bobob2o31bo$1397b2o 84bo33b3o$1392bo5bo84bobo31b3o$1392bo6bo83bo3bo$1380b2o11b2o4bo82bo4bo $1380b2o17bo83bo3bo$1395bo3bo83b2o$1395bo3bo$1396bobo111bo$1396b3o109b 2ob3o$1507bo2bob3o$1502bobo6b2ob2o$1487b2o13bobo6bo2b3o$1487b2o12bo5b 7o2b3o$1477b2o22bo2bo5bo3bo2bo$1477b2o16b5obo2bo5b7o$1494b2o6bo7b2o2bo $1493bo2bo4bo10bobo$1493bob3ob2o12bo$1492bo2bo3b2o$1493bo3bobo2$1485b 2o$1485b2o3$1498bo$1496b2o2$1470bo$1448bobo18b3o$1448b2o18b2o2bo21b2o 2bo$1449bo18bo3bo21bo2bo$1468bob2o13bo10bobo3b2o$1468b2o13b2ob3o5b3o5b o$1482bo2bob3o4bo7bo$1477bo8b2ob2o11bo$1477bo8bo2b3o$1482b7o2b3o$1485b o3bo2bo$1468b2o15b7o$1468b2o15b2o2bo$1487bobo$1466bo21bo$1466b2o$1466b 2o$1445bo$1444bobo$1444bobo$1445bo19bo$1464bo$1464b2o$1428b2o36bo$ 1428b2o35b3o$1453bo11b3o$1452bobo$1452bobo$1453bo3$1436b2o$1436b2o7b2o $1445bobo10b3o$1444bo$1445bo2bo3bo5bo3bo$1448bo2bobo5b4o$1446b3o3bo9bo $1447b2o8$1637b2o$1637b2o4$1630b2o$1631b2o$1630bo$1645b2o$1645b2o5$ 1631bo$1631bo$1653b2o$1653b2o7$1640b2o$1639bo2bo$1640b2o2$1656bo$1656b ob2o$1655bobob2o$1654b3o4b2o$1648b2o4b3obo2bo2bo$1647bo2bo4bo2b3o3bo$ 1648b2o14bo$1657b4ob2o$1658bo2bo$1614b2o45bo$1615b2o42b2o$1614bo3$ 1599b3o33bo$1634bo$1599b2o32b2ob4o$1605b2o27bob5o$1605bobo26bo6bo$ 1605b3o27b3o2b3o$1605b2o29bobob2o$1605bo30b2ob2o$1637b3o$1638bo$1628bo b3o$1627bob3obo$1626bo2bo3bo$1630bo$1627bo4bo$1607b2o19b4o$1607b2o$ 1597b2o32bo$1597b2o12bo3b2ob2o10bobo$1609b2o4b2ob2o9bo3bo$1618bo11bobo $1617bo13bo$1616bobo82b2o$1616bobo82b2o$1616bobo$1605b2o$1605b2o$1589b 3o$1588bo3bo2$1593bo115b2o$1588b5o116b2o$1589bo$1621b3o$1621b3o$1603bo b3o13bo$1565bobo34bob3obo4b2ob2o2bo$1565b2o34bo2bo3bo4bo3b4o3b3o57bo 19bob2o$1566bo22b2o14bo7bobob2obo63b2o10b2o5bo2b2o2b3o2bo$1589b2o11bo 4bo13bo61bobo9bo2bo4bo6b2o3bo$1603b4o89b2o5b2o4b2o4bo$1586b2o117bo$ 1585bo2bo17bo100b2o$1585bobo17bobo$1583b2obo17bo3bo$1583b3o19bobo$ 1583b2o21bo97b2o$1703bo2bo$1704b2o$1565bo$1564bobo$1564bobo$1565bo17bo 126bobo$1582bo126b2ob3ob2o$1581b2ob4o113b2o6bo4b4o$1548b2o32bob5o110b 4o5b3o5b2o$1548b2o32bo6bo120bo$1573bo9b3o2b3o97b3o8bobo4bo10b3o$1572bo bo9bobob2o98bo2bo9bo$1572bobo9b2ob2o97b2o3bo7bobo$1564b3o6bo11b3o98b2o bobo6bo$1564bo2bo18bo99b2ob2o8bo3b2o3bo$1563bo3bo120bo11bo$1556b2o5b4o 12bo91b3o10b2o15bob2o$1556b2o6bo14bob2o88b2ob2o8b2o16b3o$1578bobob2o 87b2ob2o27b2o$1572bo4b3o4b2o87b2o$1571bobo3b3obo2bo2bo$1578bo2b3o3bo$ 1564b3o20bo$1580b4ob2o$1581bo2bo78b2o$1584bo78b2o$1582b2o3$1690bo$ 1651bo37b3o$1650b3o$1671b2o9bobo4bo3bo$1671b2o8b5ob2o4bo$1650b3o8b2o 18bo3bo2bobo2bo$1651bo9b2o25bo3$1682bo$1684bo$1681bo$1667b2o11b2ob2o$ 1641bo24bo2bo12bo$1639b2o29bo$1640b2o23b2o2bo11b2o$1680bo$1680bo2bo$ 1678b2obo$1680bo2b3o$1678b2o$1684b2o$1681b2ob2o$1682bobo$1683bo$1665bo $1664b3o2$1657bobo4bo3bo$1609bo46b5ob2o4bo$1607b2o40b2o5bo3bo2bobo2bo$ 1608b2o37b4o12bo2$1647bobo4bo$1649bo$1604b2o41bobo$1604b2o40bo$1629bo 17bo3b2o3bo$1628bobo17bo$1628bobo18bob2o$1629bo20b3o$1651b2o2$1612b2o$ 1612b2o$1637bo$1636bobo$1636bobo$1637bo3$1620b2o$1620b2o$1633bobo$ 1632b2ob3ob2o$1632bo4b4o$1631b3o5b2o$1633bo$1640b3o7$1981bo$1821b2o 157bobo$1821b2o158bo3$1975b2o$1975b2o23b2o$1967b2o31bo$1968bo29bobo$ 1829b2o137bobo27b2o$1829b2o138b2o4b2o$1975b2o2$1807bo201b2o$1807b2o23b obo132b2o40bo$1806bobo10bo11bo3bo131bo39bobo$1817bo2bo9bo5bo132bob2o 34b2o$1815b2o13b3o4bo130b2ob2o$1815b2o14bob2obo152b2o$1815b2o151b2ob2o 16b2o$1817bob2obo146bobo$1819b3o147bobo$1819b2o149bo3$1824b2o$1823bo2b o$1824b2o2$1831bo$1831bo164b2o$1836b3o145bo11b2o$1837bo144b3o$1823bo5b o6b3o119bo22bo$1818bobobobo4b4o4b5o104bo11b3o20b2o$1819bo3bo4bo3b4ob2o 105b3o14bo34b2o$1807b2ob2o7b2o8bo4b2o92bo14bo16b2o34b2o$1810b2o7bobo 15b2o89b3o12b2o$1807b2ob2o7bo2bo108bo58b2o$1809b3o7b2ob2o106b2o59bo$ 1803b3o4b2o179bobo$1810b2o8bo3bo167b2o$1795bo8b2o14bo3bo106b2o$1795b2o 23bo3bo106b2o17b2o$1794b3o24b3o126b2o$1789bobo2bo$1789bobob2o$1789b3o 2$2017b2o$1783b2o162b2o32b2o34bo$1783b2o162bo20b2o11b2o35b3o$1949bo19b o50bo$1948b2o16b3o$1809bo134b2o20bo42b2o$1810bo133bo64b2o$1800bo10bo 133b3o$1799b3o11b2o132bo$1791b2o6bo2bo3bo6b3o$1791b2o9b2o2b3o7bo$1781b 2o19bo4b9o$1781b2o18bo6b7o113b2o$1800b2o8b3o114bobo$1799bobo125bo25b2o $1799bo4bo121b2o25bo50b2o$1799bob2obo129b2o15bobo50bo$1802b2obo128b2o 15b2o52b3o$1803bo203bo$1789b2o12b2o$1789b2o12b2o$1803bo$1758bo43bobo$ 1756b2o45bo$1757b2o4$1800b3o145b2o2b2ob2o$1800bo3bo128b2o13bobo2bobo$ 1784bo16b2obo127bobo16b2o3bo$1785bo146bo19bob2o$1775bo10bo15b3o126b2o 16bo2bobo$1774b3o11b2o12b3o143bobobobo$1774bo2bo3bo6b3o158b2ob2o$1777b 2o2b3o7bo$1771bo5bo4b9o$1766bobobobo3bo6b7o$1767bo3bo13b3o$1767b2o$ 1767bobo$1767bo2bo172b2o$1767b2ob2o171b2o$1749bo$1748bobo17bo3bo$1748b obo17bo3bo$1749bo18bo3bo$1769b3o$1932b2o$1732b2o199bo19b2o$1732b2o199b obo17bo$1757bo176b2o15bobo$1756bobo187bo4b2o$1756bobo186bobo$1757bo 187bobo$1934b2o10bo$1933bobo$1740b2o12bo178bo$1740b2o12bo176bobo$1759b 3o168bobo14b2o158b2o$1760bo170bo15bo159b2o$1752bo6b3o186b3o161bo$1752b 4o4b5o185bo159b3o$1751bo3b4ob2o347bo$1752bo4b2o350b2o$1760b2o325b2o$ 2087b2o6$2099b2o$2099b2o$2113b2o$2113b2o$2117b2o$2117b2o5$2095b2o38b2o 6bo$2094bo2bo33bobo2bo4b3o$2095bobo31b3ob2o5bo$2096bo31bo11b2o$2129b3o b2o$2131bob2o3$2139b2o3b2o$2139b2o3b2o4$2149bo$2148bobo$2149bo$2087bo$ 2087b3o$2090bo$2089bobo$2090bo2$2131b2o$2091b2o19bo18b2o$2091b2o17b3o$ 2109bo$2109b2o3$2114b2o3b2o$2114b2o3b2o$2141b2o$2141bo$2142b3o$2144bo 3$2085b2o$2084bobo$2084bo$2083b2o49b2o$2134bo$2095b2o38b3o$2095b2o40bo 7$2100b2o$2099bobo$2099bo$2098b2o19$1795bo$1793b3o$1767b2o23bo$1768bo 23b2o$1768bobo68bo$1769b2o2b2o37bo25bobo$1773b2o35b3o15bo10bo$1809bo 18b3o5b3o$1796b2o11b2o20bo3bo$1796b2o32b2o3b2o8$1767b2o52b2o$1766bobo 16b2o34b2o$1766bo18bobo45b2o$1765b2o20bo44bo2bo$1781b2o4b2o44b2o4b2o$ 1781bo2bo23b2o3bo25bobo$1783b2o23bo3bobo26bo$1774b2o33bo3b2o26b2o$ 1774b2o20b2o12bo20b2o$1797bo10bob5o17bo$1794b3o11b2o4bo14b3o$1794bo16b 3o15bo$1808b2obo$1808bobo2$1764b2o$1765bo$1765bobo$1766b2o2$2063bo$ 2062bobo$2063bo$1784b2o$1738bo6b2o37bo$1738b3o4bo2bobo31bobo$1741bo5b 2ob3o29b2o$1740b2o11bo$1747b2ob3o$1747b2obo3$1736b2o3b2o$1736b2o3b2o4$ 1732bo$1731bobo30b2o15b2o$1732bo30bobo15b2o$1763bo$1762b2o303b2obo$ 2067b2ob3o$2073bo$2067b2ob3o$2068bobo$1749b2o296b2obo17bobo$1749b2o18b o277b2ob3o16bo$1769b3o281bo$1772bo274b2ob3o$1771b2o275bobo$2048bobo$ 2049bo$1761b2o3b2o$1761b2o3b2o$1739b2o$1740bo$1737b3o$1737bo3$1795b2o$ 1795bobo$1797bo$1746b2o49b2o235b2obo$1747bo286b2ob3o$1744b3o38b2o253bo $1744bo40b2o247b2ob3o$2035bobo$2035bobo$2036bo4$1780b2o$1780bobo$1782b o$1782b2o2$2028b2obo$2028b2ob3o$2034bo$2028b2ob3o$2029bobo$2029bobo$ 2030bo6$2015b2obo$2015b2ob3o$2021bo$2015b2ob3o$2016bobo$2016bobo$2017b o7$1997b2obo$1997b2ob3o$2003bo$1997b2ob3o$1998bobo$1998bobo$1999bo9$ 1972bo$1971bobo$1972bo3$1992b2obo$1992b2ob3o$1998bo$1992b2ob3o$1993bob o$1993bobo$1994bo10$1902bo$1900b3o$1899bo$1899b2o$1845b2o31b2o$1845b2o 32bo$1879bobo$1880bobo$1881bo3b2o$1885b2o2$1863bo$1862bobo39b2o$1862bo 2bo38b2o$1863b2o$1915bo$1852b2o59b3o$1852b2o58bo$1912b2o6$1839b2o$ 1839b2o$1843b2o42b2o$1842bobo41bobo$1842bo43bo$1841b2o42b2o$1854b2o$ 1854b2o35b2o$1891b2o2$1856b2o$1856b2o$1891b2o$1891b2o8$1865bo$1864bobo $1864bobo$1863b2ob2o16b2o$1884b2o$1863b2ob2o$1864bob2o34b2o$1862bo39bo bo$1862b2o40bo$1904b2o2$1870b2o$1864b2o4b2o$1863bobo27b2o$1863bo29bobo $1862b2o31bo$1870b2o23b2o$1870b2o3$1876bo$1875bobo$1876bo! golly-2.5-src/Patterns/Life/Guns/Cordership-gun-p784.rle0000644000175100001440000020303412156145314017705 00000000000000#C p784 six-engine Cordership gun: Dave Greene, 2 May 2003 #C Herschel-based insertion of 37 gliders into three salvos x = 1285, y = 1065, rule = B3/S23 906bo6boo$906b3o4bobbobo$909bo5boob3o$908boo11bo$915boob3o$915boobo3$ 904boo3boo$904boo3boo4$900bo$899bobo$900bo7$917boo$917boo5$939boo$929b oo6boboo$929boo5bo$907boo30bo$908bo26boobo$905b3o27boo$905bo$932bo$ 931bobo$931boo$935boo16bo$935bobo14b3o$914boo14boo5bo6boo5bob3o$915bo 14boo5boo4bobo4bo3bo$864bo6boo39b3o26b3o5bo3bo$864b3o4bobbobo23bo11bo 27bo3bo3b3obo$867bo5boob3o20boo39bobboo4b3o$866boo11bo18boboo36boo10bo $873boob3o18b3obbo35bo7bo$873boobo22bobobo32bobo6bobo$900bobobo31boo3b oobboo$901bobb3o34boo$862boo3boo33boobo$862boo3boo34boo$903bo3bo$906bo bo40bo$907boo41bo$858bo44boo43b3o$857bobo42bobo$858bo43bo5boo$901boo5b oo$935boo$935boobboo$939bobo$940bo$943b3o$875boo60boo3bo$875boo61bo3bo 3bo$935b3o4bobbobo$935bo8bobobbo$945bo3bo$949bo$897boo47b3o31bo$887boo 6boboo79b3o$887boo5bo82bo$865boo30bo53bo25boo$866bo26boobo53bobo9boo$ 863b3o27boo54bo3bo9bo$863bo84bo3bo10bobo$890bo56bo3bo12boo10bo$889bobo 32bo21bo3bo24bobo$889boo56bobo25bobo$893boo16bo10bob3o21bo27bo4boo$ 893bobo14b3o11boobo16bo19boo15bobo$872boo14boo5bo6boo5bob3o10boboo15bo bo17bobo17bo8b3o$822bo6boo42bo14boo5boo4bobo4bo3bo12b3obo13boo18bo19b oo10bo$822b3o4bobbobo35b3o26b3o5bo3bo35boo13boo27bo3bo$825bo5boob3o21b o11bo27bo3bo3b3obo16bo19bobo40bobobbo$824boo11bo19boo39bobboo4b3o21bo 10boo5bo38bobbobo$831boob3o19boboo36boo10bo21bobo9boo5boo37bo3bo$831b oobo20b3obbo35bo7bo26boo55bo$857bobobo12b3o17bobo6bobo21boo60b3o$858bo bobo13bo17boo3boobboo21bobo44boo11bo$820boo3boo32bobb3o10bo23boo25bo5b oo39boo10bobo$820boo3boo33boobo61boo5boo51boo$861boo97boo27boo$861bo3b o92boboo27bobo$864bobo90bo26boo5bo$816bo48boo93bo23boo5boo$815bobo43b oo70b3o20boobo$395boo6bo412bo43bobo70b3o20boo$391bobobbo4b3o456bo5boo 65b3o25bo$389b3oboo5bo458boo5boo68b3o14bo7b3o$388bo11boo491boo41b3o13b obo9bo$389b3oboo498boobboo37b3o13boo9boo$391boboo502bobo56boo$898bo42b o14bobo$833boo66b3o36bobo8boo5bo$399boo3boo427boo60boo3bo40boo8boo5boo $399boo3boo490bo3bo3bo32boo$893b3o4bobbobo30bobo45boo$893bo8bobobbo28b o5boo40bo$903bo3bo27boo5boo38bobo$409bo444b3o50bo74boo$408bobo434boo7b 3o47b3o31bo$409bo435boo7b3o79b3o$823boo26b3o81bo$824bo26b3o55bo25boo$ 821b3o27b3o54bobo9boo74bo$774bo6boo38bo85bo3bo9bo72b3o$774b3o4bobbobo 61bo57bo3bo10bobo69bo$777bo5boob3o58bobo55bo3bo12boo10bo58boo$391boo 383boo11bo57boo33bo21bo3bo24bobo42boo$391boo390boob3o62boo15b3o34bobo 25bobo43bo$783boobo64bobo17bo8bob3o21bo27bo4boo27boo9bobo$830boo14boo 5bo6boo5bo3bo10boobo16bo19boo15bobo26boo10boo10bo$831bo14boo5boo4bobo 4bobobbo10boboo15bobo17bobo17bo8b3o31boo5bobo$772boo3boo49b3o26b3o4bo bbobo13b3obo13boo18bo19boo10bo29bobbo4bobo$369b3o400boo3boo36boo11bo 27bo3bo3bo3bo36boo13boo27bo3bo30boo6bo4boo$369b3o7boo475bobboo3bo20bo 19bobo40bobobbo26boo15bobo$369b3o7boo432bo3bo36boo9b3o21bo10boo5bo38bo bbobo27bobo17bo$372b3o26boo410bo4bo35bo7bo25bobo9boo5boo37bo3bo28bo19b oo$372b3o26bo366bo46bobobo32bobo6bobo25boo55bo31boo$372b3o27b3o362bobo 46bobobo31boo3boobboo22boo60b3o$404bo363bo48bo4bo34boo25bobo44boo11bo$ 377bo440bo3bo61bo5boo39boo10bobo$376bobo504boo5boo51boo$377boo440boobb o94boo27boo$355b3o15boo447bobo91boboo27bobo39boo6boo$354bo17bobo448boo 90bo26boo5bo39boo5boo$354bo3bo5boo6bo5boo14boo423boo97bo23boo5boo47bo$ 354bobbobo4bobo4boo5boo14bo390boo31bobo70b3o20boobo$356bobobbo4b3o26b 3o38boo6bo340boo31bo5boo65b3o20boo$357bo3bo3bo3bo27bo11boo21bobobbo4b 3o372boo5boo65b3o25bo$361bo3boobbo60b3oboo5bo409boo41b3o14bo7b3o$358b 3o9boo36bo3bo16bo11boo364bo43boobboo37b3o13bobo9bo$363bo7bo35bo4bo17b 3oboo371boo46bobo36b3o13boo9boo72booboo$362bobo6bobo32bobobo21boboo 370boobo46bo3bo53boo78bobobobo$363boobboo3boo31bobobo387boo6bobb3o48b oo38bo14bobo60boo16bobbobo$367boo34bo4bo388boo5bobobo44boo3boboo36bobo 8boo5bo61bo19boboo$403bo3bo32boo3boo328boo26bobobo46bobb3obbo36boo8boo 5boo60bobo16boo3bo$440boo3boo329bo24b3obbo44b3o5bobobo31boo82boo13bobo bbobo$402bobboo366b3o26boboo45bo8bobobo23boboobbobo45boo50boobbooboo$ 401bobo369bo29boo56bobb3o21boobobbo5boo40bo$401boo397bo3bo57boobo26b3o 5boo38bobo$405boo43bo348bobo61boo75boo160boo$405bobo41bobo347boo62bo 30b3o205boo$400boo5bo42bo352boo88bo3boboo$400boo5boo394bobo15boo44bo 26bobboobo$373boo407boo14boo5bo6boo5boboo43b3o9boo10bo3bo$369boobboo 408bo14boo5boo4bobo4bo46bob3o9bo10bo63bo$368bobo361bo6boo39b3o26b3o9bo 42bo3bo10bobo9bo60b3o$365bo3bo362b3o4bobbobo35bo27bo3bo4boobo42bo3bo 12boo3boo64bo$365boo368bo5boob3o21bo39bobboo4boo43b3obo17bobo64boo27b oo15boo$364boobo3boo59boo300boo11bo19bobo36boo31boo22b3o18bo51boo42boo 15bobo$363bobb3obbo60boo307boob3o19bo3bo35bo7bo24boobo21bo19b3o3bo6boo 38bo34boo25bo117boo$362bobobo5b3o366boobo22bo3bo32bobo6bobo27bo16bo19b oo5boobbo5bobo9bo16boo9bobo33bo25boo116boo$361bobobo8bo393bo3bo31boo3b oobboo25bo18bobo17bobo5boobo8bo9boo15boo10boo10bo22bobo$359b3obbo45boo 357bo3bo35boo30boboo14boo18bo9bo9boo7boobo30boo5bobo22boo73boo$360bob oo366boo3boo33bobo70boo18boo13boo27bobb3o28bobbo4bobo97boo$329bo31boo 45bo3bo317boo3boo34bo91bobo40bobobo31boo6bo4boo$329b3o30bo45bo4bo6boo 353bo71bo10boo5bo39bobobo28boo15bobo$332bo77bobobo5boo314bo37bobo69bob o9boo5boo36b3obbo28bobo17bo35bo$331boo25bo52bobobo26boo291b4o36boo70b oo55boboo29bo19boo32b3o$346boo9b3o52bo4bo24bo283bo6boo3bo32boo70boo60b oo29boo52bo$346bo9b3obo52bo3bo25b3o279bobo4bobo4bo30bobo69bobo44boo11b o3bo83boo20bo$344bobo10bo3bo83bo280bo4bobbo35bo5boo64bo5boo39boo10bobo 90boo16b3o82boo$333bo10boo12bo3bo51boobbo311bo8bo29boo5boo63boo5boo51b oo92bo19bo82bo$332bobo24bob3o53bobo311bobo69boo70b3o27boo86bo20boo11b oo66b3o$332bobo25b3o22boo31boo313bo69boobboo66b3o27bobo85boo32boo66bo$ 327boo4bo27bo21boboo27boo317boo72bobo65b3o22boo5bo39boo$316bo9bobo15b oo19bo16bo13b3o14bobo318bo73bo41bo21b3o25boo5boo38boo$315boo9bo17bobo 17bobobboo14bo10b3o6boo6bo5boo14boo412bobo20b3o$314boboo7boo19bo18boob oo11boobo11b3o6bobo4boo5boo14bo307boo60boo4b3o34bo3bo19b3o184boo$313b 3obbo27boo13boo7bo10boo16b3o5b3o26b3o39boo6bo256boo61bo4b3o35bo3bo23bo 181boo$315bobobo40bobo36b3o4bo3bo27bo35bobobbo4b3o316b3o5b3o36bo3bo14b o7b3o116boo90boo$316bobobo39bo5boo10bo20b3o4boobbo39bo21b3oboo5bo319bo 10b3o34bo3bo12bobo9bo91boo3boo17boo91bo$317bobb3o36boo5boo9bobo31boo 36b3o19bo11boo329b3o35bobo13boo9boo92bo3boo110bobo15boo$318boobo55boo 25bo7bo35bob3o19b3oboo287bo48b3o36bo18boo79booboo13bo66boo50boo15boo$ 319boo60boo20bobo6bobo32bo3bo22boboo268bo17b3o81bo8bo14bobo77bobobobo 12boo64bobo$319bo3bo11boo44bobo20boobboo3boo31bo3bo294bobo7boo6bob3o 78b3o7bobo8boo5bo60boo16bobbobo14bobboo59bo$322bobo10boo39boo5bo24boo 35b3obo295bobo7boo5bo3bo78bo11boo8boo5boo60bo19boboo13bo3bo58boo$323b oo51boo5boo61b3o33boo3boo244boo11bo14bo3bo53bo25boo6boo81bobo16boo3bo 13b3o12boo$319boo27b3o96bo34boo3boo245bo25b3obo65boo20bobo45boo35boo 13bobobbobo16bobo10bo16bo$318bobo27b3o92bo287b3o27b3o53b3obo9bo20bo5b oo40bo51boobbooboo16boo11b3o7boobobobo$318bo5boo22b3o91bobo286bo30bo 53boboo11bobo17boo5boo38bobo91bo7bobooboo20boo$317boo5boo25b3o21bo66b oo314bo57boobo12boo10bo53boo127bo$351b3o20bobo69boo44bo264bobo31b3o20b ob3o17bo6bobo182b3o$351b3o19bo3bo68bobo42bobo263boo20boo9bo45bo6bobo 184bo$348bo23bo3bo64boo5bo43bo268boo27bo3bo21bo27bo4boo209boo$346b3o7b o14bo3bo65boo5boo311bobo14bo3bo7bobbobo16bo19boo15bobo208boo46boo$345b o9bobo12bo3bo39boo324boo14boo5bo6boo5bo4bo9bobobbo13bobo17bobo17bo60bo 195bobo$345boo9boo13bobo36boobboo274bo6boo42bo14boo5boo4bobo4bobobo12b o3bo13boo18bo19boo7b3o47b3o197bo$352boo18bo36bobo278b3o4bobbobo35b3o 26b3o5bobobo17bo17boo13boo28b3o46bo200boo$351bobo14bo41bo282bo5boob3o 33bo27bo3bobbo4bo15b3o18bobo42b3o46boo$351bo5boo8bobo36bo285boo11bo60b obboobbo3bo21bo10boo5bo39b3o34boo42boo15boo$350boo5boo8boo36bobo4boo 60boo223boob3o20boo26bobo8boo32bobo9boo5boo38b3o35bo42boo15bobo$371boo 31bo3bo3bo61boo223boobo22boobo25boo8bo7bobboo22boo56b3o24boo9bobo32boo 25bo$324boo45bobo29bo3bo5b3o313bo24bo7bobo6bobo21boo87boo10boo10bo22bo 25boo$325bo40boo5bo28bo3bo8bo310bo35boo3boobboo21bobo44boo11bo52bobo 21bobo141boo$325bobo38boo5boo26bo3bo47bo234boo3boo32boboo36boo25bo5boo 26bo12boo10bobo51bobo22boo73boo66boo$326boo74bobo47boo234boo3boo34boo 62boo5boo26boo23boo53bo4boo92boo$370bo32bo47boboo372boobo26boo37boo15b obo175boo$370b3o77b3obbo6boo269bo92bobb3o25bobo35bobo17bo175bo42bobo$ 373bo78bobobo5boo268bobo66boo22bobobo22boo5bo35bo19boo34bo140bo41boobo $372boo79bobobo26boo198bo48boo89bobobo23boo5boo33boo53b3o139boo27bo16b 3o15bo$313bo73boo9boo54bobb3o24bo198bobo43boo68bo3bo18b3obbo120bo171b 3o11boo4bo14b3o$313b3o71bo10boobo53boobo26b3o196bo43bobo68bo4bo18boboo 121boo20bo152bo10bob5o17bo$316bo68bobo14bo53boo29bo240bo5boo65bobobo 18boo3bo122boo16b3o127boo20boo12bo20boo$315boo57bo10boo12bo26bo29bo3bo 266boo5boo66bobobo14bo3bo3b3o121bo19bo126boo33bo3boo26boo$330boo41bobo 5boo17boboo22boo31bobo299boo40bo4bo11bobo9bo118bo20boo11boo68boo52boo 23bo3bobo26bo$330bo42bobo4bobbo18boo21boobo31boo299boobboo37bo3bo11boo 9boo72boo44boo32boo69bo50bobbo23boo3bo25bobo31b3o$328bobo9boo26boo4bo 6boo41bobb3o26boo307bobo42b3o11boo79boo146b3o51boo4boo44boo4boo32b3o$ 317bo10boo10boo25bobo15boo19bo16bobobo10boo15bobo308bo38boobb5o10bobo 226bo37boo20bo44bobbo26bo10b3o$316bobo5boo31bo9bo17bobo17bobo14bobobo 11boobo5boo6bo5boo14boo222boo67bo37bobboboo4boo5bo265bo18bobo45boo27b 3o5b3o$316bobo4bobbo29bobo7boo19bo18boo12b3obbo16bo4bobo4boo5boo14bo 223boo60boo44b5o5boo5boo189boo73bobo16boo34boo42bo4b3o$311boo4bo6boo 29bo3bo27boo13boo17boboo14bo9b3o26b3o283bo3bob3o32boo3boo142booboo58b oo3bo70boo52boo41boo4b3o$310bobo15boo26bo3bo40bobo18boo16boboo4bo3bo 27bo280b3o6boobo30bobo5bo39boo100booboo5boo55bo$310bo17bobo26bo3bo16bo 22bo5boo10bo3bo18boo4boobbo39bo24boo6bo197boo36bo8boboo30bo5boo40bo77b oo3boo17boo7bobboo53b3o169bo$309boo19bo27bo3bo13bo23boo5boo9bobo32boo 36bobo19bobobbo4b3o245b3obo27boo5boo38bobo58booboo15bo3boo19b3o3b3obbo 78boo111bo32bobo$330boo27bobo56boo26bo7bo35bo3bo16b3oboo5bo199bo3bo 123boo58bobobobo12bo22bo3bo5bo4bo28boo49bo59b3o48bobo15bo11boobboo$ 360bo14boo3bo41boo21bobo6bobo32bo3bo16bo11boo189boo6bo4bo46bo32bo86boo 16bobbobo12boo21bo3b3o3b5o28bobo49bobo15boo40boboboo45bobo13b3o11boo 11bo$364bo10bo3bo42bobo21boobboo3boo31bo3bo18b3oboo196boo5bobobo79b3o 87bo19boboo13bobboo16bo10boo30bo52boo15boo40bobobbo46bo13bo27b3o$363bo bo10b3o10boo26boo5bo25boo35bo3bo21boboo174boo26bobobo53bo25bo90bobo16b oo3bo12bo3bo58boo116b3o58boo29bo$364boo51boo5boo62bobo201bo24bo4bo54b oo24boo90boo13bobobbobo14b3o12boo164boo7boo32boo3boo40boo$156boo202boo 25bo3bo88bo8bo199b3o25bo3bo54boobo8boo74bo45boobbooboo15bobo10bo165bo 8boo11boo20bo3bo51boo$157bo161boo38bobo25bo4bo86boo4boo34boo3boo161bo 85bobb3o8bo72b3o70boo11b3o7boobo173bo18b3o5b3o48bo$157bobo159boo38bo5b oo22bobobo85bobobbobbo33boo3boo188bobboo53bobobo10bobo69bo88bo7boboo 23boo105boo5boo35b3o15bo9bo46bobo$158boo198boo5boo23bobobo21bo67boo 229bobo55bobobo12boo10bo58boo122bo106bobboobboo37bo66boo4boo$391bo4bo 92bo225boo33bo20b3obbo24bobo42boo138b3o104boobo107bobbo$392bo3bo17b3ob o68boobo228boo28bobo20boboo25bobo43bo140bo105bo23boo85boo$389bo23boboo 66boo5bo40bo187bobo14b3o9bo3bo20boo27bo4boo27boo9bobo168boo74bo23bo74b oo$387b3o3boobbo15boobo66boo5boo38bobo165boo14boo5bo6boo6b3o10bo3bo16b o3bo15boo15bobo26boo10boo5bobo3boo155boo75boobboo18b3o71boo$386bo9bobo 12bob3o40boo73bo167bo14boo5boo4bobo6b3o11bo3bo14bobo17bobo17bo9bo36boo 5bo146bo86bobbo20bo$157boo151booboo71boo9boo53boobboo192bo6boo37b3o26b 3o5b3o15bo3bo13boo18bo19boo45b3ob3o145boo56boo29boo$157boo4boo144bobob obobb3o72boo18bo37bobo196b3o4bobbobo33bo27bo3bo4b3o16bobo18boo13boo27b 3obo38boo3boo142boo55bobo$163boo144bobobbo3bo12boo59bobo14bo42bo200bo 5boob3o19bo39bobboo4b3o17bo19bobo40boboo28boo15bobo28boo15boo153bo92b oo$308boobo7bo11bo60bo5boo8bobo241boo11bo17b3o36boo33bo10boo5bo40boobo 27bobo17bo28boo15bobo152boo91boo$307bo3boo15boobo59boo5boo8boo37b3o4b oo203boob3o17b3obo35bo7bo25bobo9boo5boo37bob3o28bo19boo19boo25bo$308bo bobbobo14bo81boo33b3o4bo204boobo20bo3bo32bobo6bobo25boo87boo41bo25boo$ 162boo143booboobboo10bo38boo45bobo32b3o5b3o55boo169bo3bo31boo3boobboo 22boo61bo72bobo310boo3boo$158boobboo159boo41bo40boo5bo29b3o10bo55boo 170bob3o35boo25bobo44boo11bo77boo73boo66boo147boo19bo3bo$157bobo163b4o bo37bobo38boo5boo28b3o201boo3boo31b3o63bo5boo39boo10bobo151boo66boo15b o131bobo5bo9b3o5b3o$157bo12boo154b3o38boo75b3o201boo3boo32bo63boo5boo 26bo24boo236bobo132bo5boo8bo9bo$156boo11bobo151boobboo83bo278bo93b3o 27boo232boo133boo3boobo$169bo18bo133bobb3o84b3o77bo197bobo91bob3o26bob o39boo50bo278bobb3o$168boo18b3o60bo18bo50b3obboo87bo275boo90bo3bo22boo 5bo39boo48b3o139boo127bo8bobobo$191bo59b3o6boo6b3o51bobbo88boo25bo48bo b3o6boo141bo42boo70b3o20bo3bo23boo5boo87bo142bo42bobo83b3o5bobobo$190b oo62bo5boo5bo55b3o28bo74boo61boobo5boo140bobo40bobo69bo22b3obo120boo 20bo121bo41boobo85bobb3obbo$187boo64boo12boo55bo29b3o72bo9bob3o48boboo 27boo54boo6bo56bo41bo5boo64bo3bo19b3o125boo16b3o118boo27bo16b3o15bo66b oo3boboo$187bob5o163bo69bobo11boobo48b3obo25bo51bobobbo4b3o97boo5boo 64bobbobo19bo3bo123bo19bo146b3o11boo4bo14b3o70boo$193bo117boo15boo26b oo58bo10boo12boboo79b3o46b3oboo5bo134boo39bobobbo13bo7b3o119bo20boo11b oo136bo10bob5o17bo66bo3bo56boo$188boobo74boo42bobo15boo41boo42bobo24b 3obo20b3o25bo30bo45bo11boo133boobboo36bo3bo12bobo9bo118boo32boo68boo 43boo20boo12bo20boo65bobo24bo32boboo$188booboo68boo3boo42bo25boo33bo 43bobo52bo28bo73b3oboo144bobo39bo12boo9boo72booboo146bo43boo33bo3boo 26boo51boobboo57bo$261boo46boo25bo32bobo9boo27boo4bo27bo21bo3bo27bobo 74boboo145bo37b3o17boo78bobobobo142b3o53boo23bo3bobo26bo52boo27b3obo 32bo$176boo156bobo21bo10boo10boo26bobo15boo19bo16bobobbo28boo227bo38bo 14bobo60boo16bobbobo142bo53bobbo23boo3bo25bobo31b3o37bo8boboo30boobo$ 176boo156boo21bobo49bo17bobo17bobo13bobbobo9bo16boo164boo58boo4bobo36b obo8boo5bo61bo19boboo105boo88boo4boo44boo4boo32b3o37b3o6boobo30boo$ 357bobo38b3o7boo19bo18boo13bo3bo9bobo14bobo86boo3boo71boo59bo3bo3bo36b oo8boo5boo60bobo16boo3bo104boo72boo20bo44bobbo26bo10b3o40bo3bob3o6b3o$ 192boo78bo79boo4bo39b3o28boo13boo17bo12bo3bo5boo6bo5boo14boo65boo3boo 129b3o5bo3bo31boo82boo13bobobbobo42boo136bo18bobo41bo3boo27b3o5b3o42b oo14b3o19bo$192boo76b3o78bobo15boo27b3o42bobo18b3o10bo3bo4bobo4boo5boo 14bo202bo8bo3bo23boboobbobo45boo50boobbooboo17boo3boo17boo136bobo16boo 34boo4bobo35bo4b3o49bo8b3o18bobo$269bo46bo34bo17bobo29b3o39bo5boo10bo 16bo3bo5b3o26b3o209bo3bo22boobobbo5boo40bo78bo3boo156boo52boo5boo34boo 4b3o45bo15b3o15boo5boo$269boo45b3o31boo19bo29b3o38boo5boo9bobo16bo3bo 3bo3bo27bo163bo46bobo27b3o5boo38bobo76bo66boo48boo195bobo14b3o19boobbo $319bo51boo28b3o56boo18bobo4boobbo38b3o60bo88b3o46bo76boo77boo64bobo 49bo145bo22boo21boobboo15b3o19boboo$297bo20boo144boo15bo10boo39bo58bob o78boo6bob3o76b3o124bobboo59bo51bobo15boo92bo32bobo21boobboo17boo36boo 5bo12bo$295b3o16boo90bo11boo44bobo18bo7bo35bo3bo59bo79boo5bo3bo76bo3bo boo120bo3bo58boo52boo15boo91bobo15bo11boobboo26bobo42bo11boo5bo12boo$ 294bo19bo90bobo10boo12bo26boo5bo17bobo6bobo32bobobbo117boo26bo3bo77boo bboobo121b3o12boo209bobo13b3o11boo11bo19bobboo38bobo15boo12boobo$198b oo81boo11boo20bo89boo23boo26boo5boo17boobboo3boo30bobbobo120bo25b3obo 52boo9boo144bobo10bo211bo13bo27b3o8boobo49boo14bo13bobb3o$199bo81boo 32boo85boo26boboo55boo35bo3bo118b3o27b3o51boboo10bo74bo70boo11b3o7boob o211boo29bo7boboobboobbo3bo34boo16b3o3bo8bobobo$175boo22bobo158boo39bo bo25b3obbo91bo122bo30bo51bo14bobo70b3o85bo7boboo23boo135boo32boo3boo 40boo14bobbo4bo32bobo15bo6b3o5bobobo$174bobo23boo158boo39bo5boo22bobob o22boo67b3o146bo31bo10boo14bo12boo10bo58bo123bo136boo11boo20bo3bo51b6o 5bobobo31bo5boo10boo8bobb3obbo$174bo225boo5boo23bobobo87bo150bobo29boo 9boo11boobo24bobo57boo27boo15boo77b3o146bo18b3o5b3o48bo11bobobo29boo5b oo19boo3boboo$173boo258bobb3o18bo3bo61bobo49boo98boo20boo7boboo10bo10b oo26bobo42boo42boo15bobo78bo103boo5boo35b3o15bo9bo46bobobboobo6bo4bo 61boo$434boobo18bo4bo61boo50boo102boo24b3obbo49bo4boo38bo34boo25bo182b obboobboo37bo66boo4boo3boboo7bo3bobboo54bo3bo$312boo117bo3boo18bobobo 67boo150bobo14bo3bo6bobobo16bo19boo15bobo26boo9bobo33bo25boo182boobo 107bobbo26boobboo49bobo$312boo17boo3boo91b3o3bo3bo14bobobo68bobo128boo 14boo5bo6boo5bo4bo7bobobo14bobo17bobo17bo9bo16boo10boo10bo22bobo208bo 23boo85boo21boo8bobo44boobboo$199boo130boo3bo91bo9bobo11bo4bo64boo5bo 129bo14boo5boo4bobo4bobobo10bobb3o12boo18bo19boo7bobo31boo5bobo22boo 73boo133bo23bo74boo44bo45boo9boo$199boo4boo131bo12booboo72boo9boo11bo 3bo65boo5boo22b3o100b3o26b3o5bobobo12boobo17boo13boo27bo3bo29bobbo4bob o97boo105boo27boobboo18b3o71boo47b3o51boo$205boo68boo60boo11bobobobo 78boo58boo55bo103bo27bo3bobbo4bo14boo18bobo40bo3bo31boo6bo4boo199bobo 28bobbo20bo114boo3bo$271boobbobboo52boobbo13bobobbo16boo60bobo14bobboo 35boobboo55bo3bo6boo119bobboobbo3bo15bo3bo10boo5bo39bo3bo28boo15bobo 156boo42bo28boo138bo3bo3bo12bo$272bo3boboo52bo3bo12boobo19bo61bo5boo8b obo37bobo59bobbobo5boo78boo37boo30bobo9boo5boo37bo3bo28bobo17bo35bo 120boo42boo164b3o4bobbobo12bo$192boo78bobobo42boo12b3o12bo3boo16bobo 60boo5boo8boo39bo62bobobbo25boo56boobo35bo7bobboo20boo56bobo29bo19boo 32b3o257boo71bo8bobobbo8b3o$148bobo42bo10boo67booboboo40bo10bobo15bobo bbobo13boo82boo31bo67bo3bo25bo61bo32bobo6bobo19boo61bo29boo52bo260boo 81bo3bo$147boboo41bo7boobboo70bobbo4boo20boboo7b3o11boo15booboobboo50b oo45bobo29b3o4boo64bo26b3o55bo35boo3boobboo19bobo44boo11bo87boo20bo 325bo$129bo15b3o16bo27boo5bobo74boo6boo20boobo7bo90bo40boo5bo28bob3o3b o62b3o29bo56boboo36boo23bo5boo26boo11boo10bobo90boo16b3o320b3o$127b3o 14bo4boo11b3o34bo12boo194bobo38boo5boo26bo3bo5b3o64bo85boo60boo5boo51b oo92bo19bo276boo3boo114bo$126bo17b5obo10bo36boo11bobo195boo72bo3bo8bo 63bobo180bo3bo25boo86bo20boo11boo243boo19bo3bo114bobo$126boo20bo12boo 20boo26bo18bo251b3obo74boo88bo90bo4bo25bobo85boo32boo243bobo5bo9b3o5b 3o111bobo$116boo26boo3bo33boo25boo18b3o250b3o54bo16boo91bobo88bobobo 22boo5bo39boo137bo187bo5boo8bo9bo92boo16booboo$83b3o31bo26bobo3bo23boo 57bo58bo18bo139bo32bo71bobo92boo65bo21bobobo23boo5boo38boo135boo43boo 8boo133boo3boobo110boo$82bo34bobo25bo3boo23bobbo54boo58b3o6boo6b3o139b 3o84bob3o5boo6bo5boo14boo67boo89bo4bo209boo42boo8bo42bobo93bobb3o127b ooboo$82bo3bo31boo4boo44boo4boo51boo64bo5boo5bo87bo57bo85boobo4bobo4b oo5boo14bo67bobo67bob3o17bo3bo184boo79bo41boobo82bo8bobobo93boo34boobo $82bobbobo8bo26bobbo44bo20boo35bob5o58boo12boo86b3o54boo85boboo6b3o26b 3o38boo6bo17bo5boo64boobo23bo181boo78boo27bo16b3o15bo64b3o5bobobo93bob o39bo$84bobobbo4b3o27boo20bo24bobo18bo42bo163bo68boo9b3o59b3obo3bo3bo 27bo34bobobbo4b3o16boo5boo64boboo15bobboo3b3o116boo170b3o11boo4bo14b3o 65bobb3obbo32boo60bo40boo$85bo3bo3bo42boo7boo25boo16bobo37boobo118boo 15boo27boo68bo10b3o67boobbo60b3oboo5bo53boo38b3obo12bobo9bo91boo3boo 17boo173bo10bob5o17bo63boo3boboo32boo60boo$89bo3boo41boo7bobo42boo38b ooboo72boo42bobo15boo42boo51bobo10b3o61bo10boo36b3o18bo11boo52boobboo 51boo9boo92bo3boo169boo20boo12bo20boo69boo35bo$86b3o213boo3boo42bo25b oo34bo41bo10boo14b3o22boo38bo7bo36b3o19b3oboo63bobo35bo18boo79booboo 13bo66boo108boo33bo3boo26boo56bo3bo56boo71boo$91bo63b3o60boo82boo46boo 25bo33bobo9boo29bobo25b3o61bobo6bobo34b3o21boboo64bo40bo14bobo77bobobo bo12boo64bobo117boo23bo3bobo26bo32bo23bobo24bo32boboo22boo47boo4boo$ 90bobo32bo26bobobobo59boo155bobo22bo10boo10boo29bobo25b3o21bo3bo36boo bboo3boo31b3o96bo35bobo8boo5bo60boo16bobbobo14bobboo59bo117bobbo23boo 3bo25bobo52boobboo57bo26boobboo20boo27bobo$91boobboo11bo15bobo24boobo 3bo216boo22bobo5boo40boo4bo49bo4bo40boo36b3o89boo42boo8boo5boo60bo19bo boo13bo3bo58boo117boo4boo44boo4boo31b3obo17boo27b3obo32bo27bobo18bobo 29bo$83bo11boo11b3o13bobo25bobobboo75boo163bobo4bobbo38bobo15boo19bo 16bobobo80b3o32boo3boo51bo3bob3o30boo81bobo16boo3bo13b3o12boo118boo28b oo20bo34boo8bobbo26bo8boboo38bo8boboo30boobo29bo19bo31boo$81b3o27bo13b o24bo5bo77boo77bo80boo4bo6boo29bo9bo17bobo17bobo14bobobo116boo3boo48b 3o6boobo28bobo45boo35boo13bobobbobo16bobo10bo120bo29bo18bobo32bo3bo8b oo27b3o6boobo38b3o6boobo30boo35bo14boo23boo$80bo29boo38boobobbo154b3o 79bobo15boo24b3o7boo19bo18boo12bo4bo79bo92bo8boboo28bo5boo40bo51boobb ooboo16boo11b3o7boobo103b3o30bobo16boo32bo4bo40bo3bob3o42bo3bob3o6b3o 52boo4bobo38boo$80boo40boo3boo20booboobo5boo147bo46bo35bo17bobo22b3obo 27boo13boo16bo3bo79bobo101b3obo25boo5boo38bobo91bo7boboo23boo78bo33boo 50bo4bo39boo49boo14b3o19bo33bo3bo3bo$70boo51bo3bo20boo11boo147boo45b3o 32boo19bo23bo3bo40bobo100boo179boo127bo165boo50bo50bo8b3o18bobo29b3o5b o3bo$71bo48b3o5b3o18bo210bo52boo23bo3bo39bo5boo10bobboo84boo43bo56bo 32bo171b3o164b3o43bo50bo15b3o15boo5boo23bo8bo3bo30bo$71bobo46bo9bo15b 3o35boo5boo145bo20boo78bob3o37boo5boo9bobo87bobo41bobo86b3o173bo176bo 32bobo48bobo14b3o19boobbo33bo3bo28bobo$72boo4boo66bo37boobboobbo143b3o 16boo83b3o56boo83boo5bo42bo60bo25bo352bobo15bo11boobboo22boo21boobboo 15b3o19boboo35bobo30bo$77bobbo107boboo143bo19bo85bo61boo79boo5boo102b oo24boo351bobo13b3o11boo11bo14boobboo17boo36boo5bo12bo24bo$78boo85boo 23bo131boo11boo20bo87bo11boo44bobo51boo135boobo8boo72bo63boo122boo105b o13bo27b3o16bobo42bo11boo5bo12boo$90boo74bo23bo26boo103boo32boo86bobo 10boo39boo5bo47boobboo134bobb3o8bo70b3o63bobo122bo119boo29bo16bobboo 38bobo15boo12boobo$90boo71b3o18boobboo26bobo183boo41boo24bo26boo5boo 45bobo18bo118bobobo10bobo67bo66bo124bobo15boo49boo32boo3boo40boo60boo 14bo13bobb3o$163bo20bobbo28bo185boo37boo110bo19boo116bobobo12boo10bo 56boo191boo15boo49boo11boo20bo3bo51boo3boobbo3bo34boo16b3o3bo8bobobo$ 186boo27boo223bobo26bob3o98bobo93bo20b3obbo17boo5bobo40boo42boo15boo 226bo18b3o5b3o48bo5bobbo4bo32bobo15bo6b3o5bobobo$440bo5boo23boobo74boo 4boo59boo49bobo20boboo17bobbo4bobo41bo42boo15bobo182boo5boo35b3o15bo9b o46bobobb3o5bobobo31bo5boo10boo8bobb3obbo$122boo315boo5boo23boboo72bob oo4bo60boo48bo3bo20boo19boo6bo4boo25boo9bobo32boo25bo182bobboobboo37bo 66boo4boo3bo8bobobo29boo5boo19boo3boboo$122boo229boo117b3obo20boo47bo 9b3o108bo3bo16bo3bo15boo15bobo24boo10boo10bo22bo25boo182boobo107bobbo 18bo4bo61boo$353boo17boo3boo99bobo14boboo50bo8bo109bo3bo14bobo17bobo 17bo9bo30boo5bobo21bobo208bo23boo85boo20bo3bobboo54bo3bo$372boo3bo92bo 3bo7bo11bo50boobo120bo3bo13boo18bo19boo38bobbo4bobo22boo73boo133bo23bo 74boo39boobboo49bobo$76boo3boo296bo13booboo70b3o7bo4bo13bo47boo123bobo 18boo13boo27b3obo28boo6bo4boo92boo134boobboo18b3o71boo33boo8bobo44boo bboo$77bo3bo19boo213boo60boo12bobobobo68bo9bo5bo9boobo16bo80b3o74bo19b obo40boboo26boo15bobo229bobbo20bo117bo45boo9boo$74b3o5b3o15bobo209boo bbobboo52boobbo14bobobbo16boo51boo9bo3boo9boo18b3o78b3o7boo69bo10boo5b o40boobo25bobo17bo229boo143b3o51boo$74bo9bo15bo133boo77bo3boboo52bo3bo 13boobo19bo59boobbo3bo33bo24boo51b3o7boo68bobo9boo5boo37bob3o26bo19boo 34bo332boo3bo$93boo4boo89bobo42bo19boo56bobobo42boo12b3o13bo3boo16bobo 58bobo5bo8bo24boo80b3o26boo47boo85boo53b3o121boo134boo74bo3bo3bo$93boo bo92boboo41bo20boo57booboboo40bo10bobo16bobobbobo13boo59bo5bobo7bobo 38boo7bo3bo53b3o26bo44boo61bo81bo124boo45boo87boo71b3o4bobbobo$97bo8bo 64bo15b3o16bo27boo81bobbo4boo20boboo7b3o11boo16booboobboo73boo5boo8boo 39bo8bo4bo52b3o27b3o40bobo44boo11bo85boo20bo149bobo159bo8bobobbo$94bo 9b3o62b3o14bo4boo11b3o110boo6boo20boobo7bo134boo33bobo10bobobo83bo40bo 5boo39boo10bobo88boo16b3o149bo169bo3bo$95boboo4bo64bo17b5obo10bo242boo 45bobo21bo10boo12bobobo55bo66boo5boo26bo24boo90bo19bo148boo126boo3boo 39bo$97boo4boo63boo20bo12boo20boo220bo40boo5bo20bobo24bo4bo20bo31bobo 99b3o27boo84bo20boo11boo243boo19bo3bo37b3o$40bo117boo26boo3bo33boo220b obo38boo5boo19bobo25bo3bo19b3o31boo98bob3o26bobo37boo44boo32boo54bobo 186bobo15b3o5b3o112bo$39b3o59bo57bo26bobo3bo23boo230boo61boo4bo49bob3o 8b3o15boo101bo3bo22boo5bo37boo134boo189bo5bo9bo9bo111bobo$38b3obo32bo 24bobo22b3o31bobo25bo3boo23bobbo114bo18bo156bobo15boo15boobbo16bo3bo8b o17bobo77b3o20bo3bo23boo5boo173bo189boo3b3o130bobo$39bo3bo30bobo24boo bboo18b3o32boo4boo44boo4boo114b3o6boo6b3o156bo17bobo17bobo14bo3bo9bo3b o5boo6bo5boo14boo55bo22b3obo400bob3o110boo16booboo$40bo3bo28bo3bo27boo 18b3o10bo26bobbo44bo20boo4boo95bo5boo5bo148boo8boo19bo18boo13b3obo10bo bbobo4bobo4boo5boo14bo42boo6bo5bo3bo19b3o182boo69boo136bo8bo3bo111boo$ 41bob3o28bo3bo8bo40b3o5b3o27boo45bobo18bo5boo94boo12boo147boobo27boo 13boo18b3o13bobobbo4b3o26b3o35bobobbo4b3o5bobbobo19bo3bo179boo69boo 136b3o5bo3bo130booboo$42b3o22b3o5bo3bo5b3o40b3o4bo42boo34boo16bobo65bo 134bo67bo40bobo19bo15bo3bo3bo3bo27bo11boo20b3oboo5bo10bobobbo13bo7b3o 8boo104boo273bo3b3obo95boo34boobo$43bo26bo5bo3bo3bo43b3o4boo41boo52boo 67boo91boo15boo22b3o62bo43bo5boo10bo23bo3boobbo60bo11boo10bo3bo12bobo 9bo6b3o80boo3boo17boo147boo123boo4b3o55boo38bobo39bo$47bo18bo3bo6bobo 4boo214boo47boo42bobo15boo25bo62boboo38boo5boo9bobo19b3o9boo36bo3bo18b 3oboo21bo12boo9boo6bobbo60booboo15bo3boo166bo42bobo86bo96bo40boo$46bob o16bobobbo7bo54bo210boo3boo42bo25boo16boo64boo56boo25bo7bo35bo4bo20bob oo18b3o17boo14b3o59bobobobo12bo66boo106bo41boobo81bo25bo33bo3bo35boo$ 40boo5boo14bobbobo13bo49bobo209boo46boo25bo32boo111boo20bobo6bobo32bob obo49bo14bobo13b3o42boo16bobbobo12boo64bobo105boo27bo16b3o15bo62bobo 24boo31bo4bo$40bobboo18bo3bo13bobo49boobboo11bo266bobo32bo54bo11boo44b obo20boobboo3boo31bobobo49bobo8boo5bo59bo19boboo13bobboo59bo136b3o11b oo4bo14b3o56boobboo24boobo29bobobo71boo$41boobo18bo18boobboo21boo14bo 11boo11b3o264boo26boo3bobo9boo42bobo10boo39boo5bo24boo34bo4bo32boo3boo 12boo8boo5boo58bobo16boo3bo12bo3bo58boo139bo10bob5o17bo55boo27bobb3o 27bobobo23boo47boo4boo$42bo5boo14b3o19boo17boobboo12b3o27bo290b3o3boo 10boo43boo23b3o25boo5boo59bo3bo33boo3boo8boo80boo13bobobbobo14b3o12boo 163boo20boo12bo20boo74bo8bobobo27bo4bo24boobboo20boo27bobo$42bo5boo11b o42bobo15bo29boo201bo87b4o56boo26bo148bobo45boo48boobbooboo15bobo10bo 164boo33bo3boo26boo64b3o5bobobo6bo21bo3bo29bobo18bobo29bo$28boo13boo 15bobo19b3o20bo16boo40boo3boo32boo55boo91b3o86bobb3o54bobo26bo3bo91bo bboo48bo5boo40bo74boo11b3o7boobo106boo51boo23bo3bobo26bo68bobb3obbo64b o19bo31boo$28boobo13bo14boo20bo29boo51bo3bo20boo11boo55bo91bo46bo33boo 6bo5bo54bo5boo21bobbobo22bo66bobo50boo5boo38bobo89bo7boboo23boo82bo49b obbo23boo3bo25bobo31b3o33boo3boboo6bob3o18bobboo35bo14boo23boo$32bo8bo 3b3o16boo17bo16b3o4boo4bo48b3o5b3o18bo69b3o88boo45b3o30bobo5boo3bo4boo 49boo5boo23bobobbo20boo65boo48bo49boo125bo43bobo34b3o50boo4boo44boo4b oo32b3o39boo9boobo16bobo31boo4bobo38boo$29bo9b3o6bo15bobo33b3o4bo5bobo 46bo9bo15b3o35boo5boo28bo138bo29bo7bobobo5bobo81bo3bo19boobo68boo43bob o176b3o40boo35bo36boo20bo44bobbo26bo10b3o22bo13bo3bo9boboo16boo5boo26b o3bo3bo$30boboo4bo8boo10boo5bo33b3o5b3o3boo4boo66bo37boobboobbo145bo 20boo28boo8b3o8bo85bo18bobb3o67bobo43bo96boo81bo41bo73bo18bobo23boobo 18boo27b3o5b3o26bo11bobo13b3obo18boobbo23b3o5bo3bo$32boo4boo19boo5boo 29b3o10bo8bobbo107boboo144b3o16boo42b3o8boo78bobb3o18bobobo64boo5bo 139boo198bobo16boo24b4o6boo42bo4b3o11boo11b3o7boobboo37boboo24bo8bo3bo 30bo$97b3o20boo9boo74boo23bo144bo19bo132b3o7bo14bobobo65boo5boo137bo4b oo195boo41bo3bo6boo41boo4b3o11boobboo17boo20bo15boo5bo35bo3bo28bobo$ 36bo54boo4b3o29b3obo74bo23bo83bo47boo11boo20bo129bo9bobo11b3obbo39boo 140bo29boo6bo238b3o74bobo42bo11boo5bo12bo23bobo30bo$35bobo49boobboo36b o3bo71b3o18boobboo82bobo47boo32boo129boo9boo12boboo36boobboo138b3o23bo bo4boboob3o238b3o53bo21bo42bobo15boo12b3o23bo$36boobboo44bobo39b5o72bo 20bobbo39boo44boo219boo17boo36bobo141bo26bobbo9bo149boo90bo19bo32bobo 23b3o38boo14bo13bob3o$29boo9boo45bo42b3o95boo39bo265bobo14bo3bo33bo3bo 142boo24bo3bo7bo5boo145bo109bobo15bo11boobboo18boo3bo37boo16b3o3bo8bo 3bo$29boo52bo166boo15bobo171boo92bo5boo8bobo36boo130boo40bobbo6boo5bob o86bo57bobo15boo90bobo13b3o11boo11bo11bo3bo3bo32bobo15bo6b3o5bo3bo$89b oo29b3o41boo84boo15boo128boo42boo91boo5boo8boo36boobo3boo58bo5bo60bo 32boo6b3o16bo84boo59boo15boo91bo13bo27b3o6b3o4bobbobo31bo5boo10boo8bo 3b3obo$81b3obo3bo30b3o41boo230bobbo155boo31bobb3obbo58boo5boo48boo9bob o31bo25boo84boo29bobo150boo29bo5bo8bobobbo28boo5boo19boo4b3o$80boboo6b 3o301bo4bo108boo45bobo29bobobo5b3o54boo8bo47boo10boo10bo20bobo140boo 100boo32boo3boo40boo15bo3bo63bo$80boobo8bo300b6o15boo3boo88bo40boo5bo 28bobobo8bo36boo25boo70bobo20boo73boo66bo100boo11boo20bo3bo51boo9bo3b oo54bo$78bob3o35boo3boo267boobo18boo3bo89bobo38boo5boo25b3obbo63booboo 4bo72bobo95boo180bo18b3o5b3o48bo7b3o4boobboo49bobo$119bo3bo19boo248bob o25bo88boo73boboo45bo3bo16b4o3bo73bo4boo229boo5boo35b3o15bo9bo46bobo 18bobo44boobboo$80bo35b3o5b3o9bo5bobo213boo34boo24boo132bo31boo46bo4bo 6boobb3obboboobbo3bo58boo15bobo228bobboobboo37bo66boo4boo20bo45boo9boo $3bo112bo9bo8boo5bo211boobbobboo52boobbo12booboo117b3o30bo48bobobo5boo bbo7b4o3bo57bobo17bo33bo195boobo107bobbo29bo52boo$bbobo129boboo3boo 212bo3boboo52bo3bo11bobobobo119bo79bobobo8b3o6b5o4boo53bo19boo30b3o 196bo23boo85boo23boo4bobo$bbobo128b3obbo216bobobo42boo12b3o12bobobbo 16boo101boo25bo54bo4bo10b3o11bo53boo50bo124boo73bo23bo74boo36bo3bo3bo$ booboo16boo111bobobo8bo123boo82booboboo23bo16bo10bobo13boobo19bo43bo 73boo9b3o54bo3bo12bo12b3o102boo20bo102boo74boobboo18b3o71boo33b3o5bo3b o$22boo112bobobo5b3o124bo85bobbo4boo16boboboboo7b3o11boo13bo3boo16bobo 43b3o71bo9b3obo72boobo9bo106boo16b3o178bobbo20bo106bo8bo3bo$booboo131b obb3obbo103boo22bobo83boo6boo17booboobo7bo29bobobbobo13boo47bo68bobo 10bo3bo53boobbo13b3o118bo19bo147boo28boo139bo3bo$bboboo34boo96boobo3b oo101bobo23boo153booboobboo61boo57bo10boo12bo3bo55bobo12b3o116bo20boo 11boo134bobo169bobo$o39bobo96boo107bo265boo41bobo5boo17bob3o55boo131b oo32boo136bo91boo77bo$oo40bo38boo56bo3bo103boo265bo42bobo4bobbo17b3o 22boo28boo91boo214boo90boo154bo$42boo37boobo32bo24bobo367bobo9boo26boo 4bo6boo19bo21boboo10b3o14bobo91boo461bobo$85bo57boobboo352bo10boo10boo 15bo9bobo15boo19bo16bo14b3o6boo6bo5boo14boo533bobo$8boo72bo32bob3o27b oo351bobo5boo30boo9bo17bobo17bobo18bo11b3o6bobo4boo5boo14bo181boo237b oo3boo88boo16booboo$bboo4boo47boo24boboo30boobo8bo143boo98bo18bo107bob o4bobbo28boboo7boo19bo18boo14boobo15b3o5b3o26b3o178boo69boo146boo19bo 3bo89boo$bobo27boo20boobboo26boo30boboo6b3o143boo4boo92b3o6boo6b3o102b oo4bo6boo28b3obbo27boo13boo18boo17b3o4bo3bo27bo115boo132boo146bobo5bo 9b3o5b3o104booboo$bo29bobo18bobo54b3o6b3obo3bo152boo95bo5boo5bo104bobo 15boo26bobobo40bobo37b3o4boobbo39bo79boo3boo17boo282bo5boo8bo9bo68boo 34boobo$oo31bo15bo3bo35bo19b3o14boo247boo12boo103bo17bobo26bobobo39bo 5boo10bo33boo36b3o79bo3boo301boo3boobo85bobo39bo$8boo23boo14boo37bobo 18b3o8bo372boo19bo27bobb3o36boo5boo9bobo25bo7bo35bob3o60booboo11bo66b oo244bobb3o84bo40boo$8boo38boobo3boo25boo5boo15b3o15bo141boo165boo15b oo62boo27boobo55boo25bobo6bobo32bo3bo60bobobobo10boo64bobo106boo126bo 8bobobo85boo$47bobb3obbo26bobboo19b3o14bobo96bobo42bo10boo108boo42bobo 15boo92boo60boo22boobboo3boo31bo3bo44boo16bobbobo12bobboo59bo108bo42bo bo7bo74b3o5bobobo$46bobobo5b3o24boobo19b3o15boobboo21boo68boboo41bo7b oobboo103boo3boo42bo25boo84bo3bo11boo44bobo25boo35b3obo46bo19boboo11bo 3bo58boo109bo41boobo7bo76bobb3obbo121boo$14bo30bobobo8bo12bo12bo5boo 36boo17boobboo50bo15b3o16bo27boo5bobo107boo46boo25bo88bobo10boo39boo5b o63b3o47bobo16boo3bo11b3o12boo155boo27bo16b3o3b3o9bo65boo3boboo73boo 47boo4boo$13bobo27b3obbo21boo12bo5boo11bo42bobo52b3o14bo4boo11b3o34bo 12boo168bobo89boo4bo46boo5boo63bo49boo13bobobbobo14bobo10bo16bo168b3o 11boo4bo14b3o69boo74boobboo20boo27bobo$14bo29boboo21boboo12boo15bobo 38boobbo52bo17b5obo10bo36boo11bobo168boo86boo7boo18b3o93bo68boobbooboo 14boo11b3o7boobobobo62bo107bo10bob5o17bo65bo3bo56boo20bobo18bobo29bo$ 45boo21b3obbo13bo14boo96boo20bo12boo20boo26bo18bo198boo38bobo7bobo17b 3o92bobo105bo7bobooboo20boo40bo40boo43boo20boo12bo20boo64bobo24bo32bob oo21bo19bo31boo$46bo23bobobo8bo3b3o16boo34bo3bobboo39boo26boo3bo33boo 25boo18b3o87bo108boo38bo5boo22b3o92boo141bo41b3o39bo43boo33bo3boo26boo 50boobboo57bo44boo23boo$71bobobo5b3o6bo15bobo32bo4bobbo7b3o31bo26bobo 3bo23boo57bo84b3o147boo5boo25b3o21bo71boo138b3o77b3o53boo23bo3bobo26bo 32bo18boo27b3obo32bo19boo4boo39boo$72bobb3obbo8boo10boo5bo31bobobo5b3o 3bo34bobo25bo3boo23bobbo54boo83bo46bo137b3o20bobo70bobo139bo77bo53bobb o23boo3bo25bobo70bo8boboo30boobo21bo4boobo$73boobo3boo19boo5boo29bobob o8bo3bo3bo31boo4boo44boo4boo51boo86boo45b3o135b3o19bo3bo64boo5bo271boo 4boo44boo4boo31b3obo35b3o6boobo30boo20b3o9bo$74boo61bo4bo13bobbobo8bo 26bobbo44bo20boo35bob5o52bo78bo131bo23bo3bo65boo5boo107bo18bo127boo20b o44bobbo26bo8boboo40bo3bob3o6b3o44bo8bo34bo$74bo3bo54boobbo3bo16bobobb o4b3o25boobo45bobo18bo42bo50bobo56bo20boo129b3o7bo14bo3bo39boo141b3o6b oo6b3o128bo18bobo45boo27b3o6boobo39boo14b3o19bo34boboo29bobo$77bobo49b oobboo24bo3bo3bo29bo12boo34boo16bobo37boobo53boo54b3o16boo132bo9bobo 12bo3bo36boobboo144bo5boo5bo131bobo16boo34boo42bo3bob3o47bo8b3o18bobo 35boo30bo$78boobboo44bobo8boo22bo3boo28bobo10boo52boo38booboo107bo19bo 57booboo71boo9boo13bobo36bobo147boo12boo131boo52boo41boo51bo15b3o15boo 5boo$71boo9boo45bo30b3o34bobo203boo11boo20bo54bobobobo77boo18bo38bo 248boo149bo44bobo14b3o19boobbo$71boo51b3o38bo32bo93boo109boo32boo54bob obbo16boo59bobo14bo38bo91boo15boo143bo145bo21boo21boobboo15b3o19boboo$ 127bo3boo31bobo125boo198boobo19bo60bo5boo8bobo36bobo4boo84boo15bobo42b oo70bo27bobo15boo92bo32bobo20boobboo17boo36boo5bo12bo$123bo3bo3bo33boo bboo11bo308bo3boo16bobo59boo5boo8boo36bo3bo3bo77boo25bo42boo3boo63boo 29boo15boo91bobo15bo11boobboo25bobo42bo11boo5bo12boo$122bobobbo4b3o22b o11boo11b3o123boo182bobobbobo13boo81boo31bo3bo5b3o75bo25boo46boo64boo 138bobo13b3o11boo11bo18bobboo9bo28bobo15boo12boobo$120bobbobo8bo20b3o 27bo122boo181booboobboo49boo45bobobboobo23bo3bo8bo75bobo278bo13bo27b3o 9boo17bobo29boo14bo13bobb3o$120bo3bo29bo29boo364bo40boo5bobboboo22bo3b o86boo292boo29bo8boobboobbo3bo7boo25boo16b3o3bo8bobobo$120bo33boo40boo 3boo32boo197boo114bobo38boo5b3o27bobo191bobo136boo32boo3boo40boo13bobb o4bo32bobo15bo6b3o5bobobo$121b3o20boo51bo3bo20boo11boo197boo17boo3boo 91b3o5boobboo64bo151bo40boo137boo11boo20bo3bo51b5o5bobobo31bo5boo10boo 8bobb3obbo$45bo99bo48b3o5b3o18bo229boo3bo94b3o3b3o10boo22b3o182b3o39bo 150bo18b3o5b3o48bo10bobobo29boo5boo19boo3boboo$44bobo98bobo46bo9bo15b 3o35boo5boo193bo92boo4bo5boboo3boboo16boobo3bo137bo46bo146boo5boo35b3o 15bo9bo46bobobboo7bo4bo61boo$44bobo99boo4boo66bo37boobboobbo109bobo18b oo60boo93boboobb3obobobbobo3bo16boboobboo135b3o45boo146bobboobboo37bo 66boo4boo3boo8bo3bobboo54bo3bo$43booboo16boo85bobbo107boboo111boo14boo bbobboo52boobbo96boo3b3o8b5o37boo9boo108bo197boobo107bobbo25boobboo49b obo$64boo86boo85boo23bo112bo16bo3boboo52bo3bo79bo74bo10boobo106boo20bo 176bo23boo85boo20boo8bobo44boobboo$43booboo116boo74bo23bo26boo101bobob o42boo12b3o80b3o26bobboo39bobo14bo109boo16b3o174bo23bo74boo43bo45boo9b oo$44boboo34boo71bobo6boo71b3o18boobboo26bobo19boo36bo44booboboo23bo 16bo10bobo85bo25b3o30bo10boo12bo26bo86bo19bo145boo27boobboo18b3o71boo 46b3o51boo$42bo39bobo70boo80bo20bobbo28bo22bo37boo45bobbo4boo16bobobob oo7b3o11boo40boo15boo26boo27bo29bobo24boboo22boo83bo20boo11boo132bobo 28bobbo20bo113boo3bo$42boo40bo71bo103boo27boo22bobo34boo46boo6boo17boo boobo7bo54bobo15boo41boo42bobo26boo21boobo82boo32boo134bo28boo137bo3bo 3bo$84boo67bo160boo178bo25boo33bo38boo4bo49bobb3o170bo80boo163b3o4bobb obo$152bobo41boo295boo25bo32bobo9boo26bobo15boo19bo16bobobo171bo174boo 70bo8bobobbo$50boo100bobo41boo320bobo21bo10boo10boo16bo9bo17bobo17bobo 14bobobo172b3o172boo80bo3bo$44boo4boo47boo52bo289boo73boo21bobo38bobo 7boo19bo18boo12b3obbo434bo$43bobo27boo20boobboo342boo96bobo37bo3bo27b oo13boo17boboo432b3o$43bo29bobo18bobo53boo3boo357boo20boo4bo39bo3bo40b obo18boo90boo147bo151boo3boo113bo$42boo31bo19bo55bo3bo19boo136boo198bo bo19bobo15boo28bo3bo39bo5boo10bo3bo66boo3boo17boo146bobo130boo19bo3bo 113bobo$50boo23boo14bo56b3o5b3o15bobo136boo4boo179bo14bo19bo17bobo28bo 3bo37boo5boo9bobo70bo3boo165boo131bobo15b3o5b3o110bobo$50boo38bobo4boo 49bo9bo15bo133boo9boo179b3o31boo19bo29bobo56boo69bo307bo5bo9bo9bo91boo 16booboo$89bo3bo3bo69boo4boo89bobo42bo193bo51boo29bo61boo65boo60boo 109boo133boo3b3o110boo$88bo3bo5b3o66boobo92boboo41bo172bo20boo86bo11b oo44bobo66bobboo52boobbobboo105bo42bobo93bob3o127booboo$56bo30bo3bo8bo 70bo8bo64bo15b3o16bo27boo169b3o16boo89bobo10boo11boo26boo5bo66bo3bo52b oobo3bo107bo41boobo82bo8bo3bo92boo34boobo$55bobo28bo3bo77bo9b3o62b3o 14bo4boo11b3o37boo158bo19bo91boo51boo5boo66b3o12boo42bobobo106boo27bo 16b3o15bo64b3o5bo3bo92bobo39bo$56bo30bobo79boboo4bo64bo17b5obo10bo36b oobboo46bo98boo11boo20bo85boo25bo3bo102bobo10bo16bo23booboboo136b3o11b oo4bo14b3o65bo3b3obo93bo40boo$88bo82boo4boo63boo20bo12boo20boo12bobo 48bobo98boo32boo84bobo25bo4bo102boo11b3o7boobobobo16boo4bobbo142bo10bo b5o17bo63boo4b3o55boo36boo$114bo117boo26boo3bo33boo12bo12boo5bo31boo 177boo39bo5boo22bobobo116bo7bobooboo17boo6boo119boo20boo12bo20boo70bo$ 113b3o59bo57bo26bobo3bo23boo20boo11bobo4b3o171boo36boo38boo5boo23bobob o21bo254boo33bo3boo26boo31bo24bo25bo33bo3bo68boo$112b3obo32bo24bobo22b 3o31bobo25bo3boo23bobbo31bo6b3o9bo161bobbo107bo4bo191bo91boo23bo3bobo 26bo32boo22bobo24boo31bo4bo19boo47boo4boo$113bo3bo30bobo24boobboo18b3o 32boo4boo44boo4boo30boo18b3o86boo72boo109bo3bo17b3obo167boo90bobbo23b oo3bo25bobo31boobo17boobboo24boobo29bobobo21boobboo20boo27bobo$114bo3b o28bo3bo27boo18b3o10bo26bobbo44bo20boo22b4o11bo85boo180bo23boboo170boo 89boo4boo44boo4boo31bobb3o16boo27bobb3o27bobobo26bobo18bobo29bo$115bob 3o28bo3bo8bo40b3o5b3o27boo45bobo18bo22b5o10boo148boo11boo102b3o3boobbo 15boobo245boo20bo44bobboo25bo8bobobo37bo8bobobo27bo4bo28bo19bo31boo$ 116b3o22b3o5bo3bo5b3o40b3o4bo42boo34boo16bobo22boobo8boo151boo8boobbo 4boo3boo90bo9bobo12bob3o247bo18bobo47boo25b3o5bobobo38b3o5bobobo6bo21b o3bo33bo14boo23boo$117bo26bo5bo3bo3bo43b3o4boo32bo8boo52boo35bob5o156b o3bo4boo3bo91boo9boo264bobo16boo34boo12bo29bobb3obbo42bobb3obbo25b3o 32boo4bobo38boo$121bo18bo3bo6bobo4boo21bo61bobo103bo104boo51b3o12bo12b ooboo79boo18bo250boo52boo12boo27boo3boboo42boo3boboo6bob3o14b5obboo28b o3bo3bo$120bobo16bobobbo7bo26boo26bo35boo99boobo106bobo64boo11bobobobo 77bobo14bo320bobo34boo49boo9boobo12boobobbo28b3o5bo3bo$114boo5boo14bo bbobo13bo23boo24bobo32bo102booboo107bo59boobbo13bobobbo16boo60bo5boo8b obo320bo32bo3bo46bo3bo9boboo13b5o5boo22bo8bo3bo30bo$114bobboo18bo3bo 13bobo49boobboo11bo15bobo213boo58bo3bo12boobo19bo60boo5boo8boo353bobo 48bobo13b3obo13boo3boobbo32bo3bo28bobo$115boobo18bo18boobboo21boo14bo 11boo11b3o13bobo89boo3bo165boo12b3o12bo3boo16bobo81boo333bo11boobboo 22boo21boobboo31bo5boboo34bobo30bo$116bo5boo14b3o19boo17boobboo12b3o 27bo13bo90boo4bo148bo16bo10bobo15bobobbobo13boo35boo45bobo330b3o11boo 11bo14boobboo17boo20bo15boo5bo36bo$116bo5boo11bo42bobo15bo29boo109bo 148boboboboo7b3o11boo15booboobboo51bo40boo5bo329bo27b3o16bobo42bo11boo 5bo12bo$102boo13boo15bobo42bo16boo40boo3boo32boo61boo6boo115boo20boob oobo7bo90bobo38boo5boo328boo29bo16bo42bobo15boo12b3o$102boobo13bo14boo 50boo51bo3bo20boo11boo69boo116bo126boo324boo32boo3boo40boo19b3o38boo 14bo13bob3o$106bo8bo3b3o16boo34b3o4boo4bo48b3o5b3o18bo197b3o453boo11b oo20bo3bo51boo3boo3bo37boo16b3o3bo8bo3bo$103bo9b3o6bo15bobo33b3o4bo5bo bo46bo9bo15b3o35boo5boo154bo468bo18b3o5b3o48bo5bo3bo3bo32bobo15bo6b3o 5bo3bo$104boboo4bo8boo10boo5bo33b3o5b3o3boo4boo66bo37boobboobbo580boo 5boo35b3o15bo9bo46bobobb3o4bobbobo31bo5boo10boo8bo3b3obo$106boo4boo19b oo5boo29b3o10bo8bobbo107boboo168bo18bo393bobboobboo37bo66boo4boo3bo8bo bobbo28boo5boo19boo4b3o$171b3o20boo85boo23bo169b3o6boo6b3o84bo309boobo 107bobbo18bo3bo63bo$110bo54boo4b3o32boo74bo23bo48boo122bo5boo5bo87b3o 308bo23boo85boo23bo3boo54bo$109bobo49boobboo39boo71b3o18boobboo50bo 121boo12boo89bo307bo23bo74boo32b3o4boobboo49bobo$110boobboo44bobo116bo 20bobbo52bobo223boo308boobboo18b3o71boo8bo34bobo44boobboo$103boo9boo 45bo140boo27boo24boo177boo15boo42boo295bobbo20bo79bobo35bo45boo9boo$ 103boo52bo172bobo158boo42bobo15boo42bo296boo103boo39bo52boo$163boo73b oo90bo155boo3boo42bo25boo32bobo9boo393bo30boo4bobo$155b3obo3bo74boo89b oo155boo46boo25bo22bo10boo10boo349boo41bobo30bo3bo3bo$154boboo6b3o392b obo21bobo5boo365boo41bobo27b3o5bo3bo$154boobo8bo392boo22bobo4bobbo408b o28bo8bo3bo$152bob3o35boo3boo157boo220boo4bo6boo448bo3bo$193bo3bo19boo 137boo4boo133bo79bobo15boo402boo3boo36bobo$154bo35b3o5b3o9bo5bobo129bo 13boo131b3o79bo17bobo381boo19bo3bo38bo$77bo112bo9bo8boo5bo130bobo144bo 46bo34boo19bo381bobo15b3o5b3o112bo$76bobo129boboo3boo131boo144boo45b3o 53boo382bo15bo9bo111bobo$76bobo128b3obbo331bo436boo3b3o130bobo$75boob oo16boo81boo28bobobo8bo125boo11boo159bo20boo441b3o111boo16booboo$96boo 82boo28bobobo5b3o81bobo42bo7boobboo157b3o16boo434bo10b3o111boo$75boob oo99bo31bobb3obbo83boboo41bo7bobo160bo19bo435b3o5b3o132booboo$76boboo 34boo96boobo3boo64bo15b3o16bo27boo6bo12boo135boo11boo20bo248bo187bo4b 3o96boo34boobo$74bo39bobo96boo68b3o14bo4boo11b3o34boo11bobo135boo32boo 44boo200boo187boo4b3o95bobo39bo$74boo40bo38boo56bo3bo64bo17b5obo10bo 50bo18bo198boo201boo249b3o38bo40boo$116boo37boobo32bo24bobo63boo20bo 12boo20boo26boo18b3o590bo62bo36boo$159bo57boobboo17bo31boo26boo3bo33b oo49bo588bobo24bo32bo3bo$82boo72bo32bob3o27boo16boo32bo26bobo3bo23boo 57boo584boobboo24b3o30bobobbo70boo$76boo4boo47boo24boboo30boobo8bo34bo boo31bobo25bo3boo23bobbo52boo587boo27bob3o27bobbobo23boo47boo4boo$75bo bo27boo20boobboo26boo30boboo6b3o33b3obbo31boo4boo44boo4boo52bob5o144b oo455bo8bo3bo5bo22bo3bo24boobboo20boo27bobo$75bo29bobo18bobo54b3o6b3ob o3bo38bobobo8bo26bobbo44bo20boo42bo144boo17boo3boo431b3o5bo3bo5boo22bo 32bobo18bobo29bo$74boo31bo15bo3bo35bo19b3o14boo38bobobo5b3o27boo45bobo 18bo38boobo165boo3bo15booboo415bo3b3obo5boboo22b3o30bo19bo31boo$82boo 23boo14boo37bobo18b3o8bo46bobb3obbo42boo34boo16bobo38booboo171bo12bobo bobo392bo20boo4b3o5b3obbo18bo54boo23boo$82boo38boobo3boo25boo5boo15b3o 15bo43boobo3boo41boo52boo152boo60boo12bobobbo16boo376bo26bo8bobobo16bo bo31boo4boo39boo$121bobb3obbo26bobboo19b3o14bobo43boo130boo119boobbobb oo52boobbo13boobo19bo375b3o22bo13bobobo15boo5boo26bo4boobo$120bobobo5b 3o24boobo19b3o15boobboo21boo16bo3bo127boo120bo3boboo52bo3bo12bo3boo16b obo399bobo13bobb3o17boobbo23b3o9bo$88bo30bobobo8bo12bo12bo5boo36boo17b oobboo19bobo32bo215bobobo42boo12b3o14bobobbobo13boo373boo21boobboo15b oobo18boboo24bo8bo34bo$87bobo27b3obbo21boo12bo5boo11bo42bobo24boobboo 11bo15bobo108boo105booboboo23bo16bo10bobo15booboobboo388boobboo17boo 20boo14boo5bo35boboo29bobo$88bo29boboo21boboo12boo15bobo38boobbo7boo8b o11boo11b3o13bobo108boo108bobbo4boo16boboboboo7b3o11boo200bo216bobo38b o3bo11boo5bo37boo30bo$119boo21b3obbo13bo14boo49bobbo6b3o27bo13bo219boo 6boo17booboobo7bo213boo218bo42bobo15boo12b3o$120bo23bobobo8bo3b3o16boo 34bo3bobboobb3o6bo29boo489boo221bo39boo14bo14b3o$145bobobo5b3o6bo15bob o32bo4bobbo12boo40boo3boo32boo654boo4bobo34boo16b3o3bo10b3o$146bobb3o bbo8boo10boo5bo31bobobo5b4o51bo3bo20boo11boo655bo3bo3bo32bobo15bo6b3o 5b3o$147boobo3boo19boo5boo29bobobo9bo48b3o5b3o18bo665b3o5bo3bo31bo5boo 10boo8bo4b3o$148boo61bo4bo5b3obbobo46bo9bo15b3o35boo5boo622bo8bo3bo29b oo5boo19boo4b3o$148bo3bo54boobbo3bo5bobbo3boo4boo66bo37boobboobbo632bo 3bo$151bobo49boobboo12boo10bobbo107boboo634bobo4boo54bo$152boobboo44bo bo8boo19boo85boo23bo27boo607bo5boobboo49bobo$145boo9boo45bo42boo74bo 23bo26bobo202boo15boo396bobo44boobboo$145boo51b3o45boo71b3o18boobboo 27bo203bobo15boo397bo45boo9boo$201bo3boo112bo20bobbo28boo203bo25boo 446boo$197bo3bo3bo136boo232boo25bo387boo4boo$196bobobbo4b3o392bobo388b o4boobo$194bobbobo8bo69boo246boo73boo386b3o9bo$194bo3bo79boo246boo198b o262bo8bo$194bo529boo273boboo$195b3o527boo274boo$119bo112boo3boo344bo$ 118bobo112bo3bo19boo324b3o492bo$118bobo109b3o5b3o15bobo132boo193bo490b obo$117booboo16boo90bo9bo15bo90bobo42bo171bo20boo490bobo$138boo109b3o 3boo89boboo41bo170b3o16boo475boo16booboo$117booboo127b3o76bo15b3o16bo 27boo168bo19bo476boo$118boboo34boo91b3o10bo63b3o14bo4boo11b3o174bo9boo 11boo20bo492booboo$116bo39bobo93b3o5b3o62bo17b5obo10bo177boo8boo32boo 456boo34boobo$116boo40bo93b3o4bo65boo20bo12boo20boo148boo3bobo499bobo 39bo$158boo92b3o4boo21boo31boo26boo3bo33boo146b4o505bo40boo$195b3o118b o26bobo3bo23boo154bo4bo175bo327boo$124boo68bo62bo22bo3bo31bobo25bo3boo 23bobbo139boo11bobb4o174bobo$118boo4boo47boo19bo3bo32bo24bobo21bo4bo 31boo4boo44boo4boo103bo35boo11booboboo174boo360boo$117bobo27boo20boobb oo19bobbobo30b3o24boobboo19bobobo8bo26bobbo44bo20boo88boo51boo43boo 442boo47boo4boo$117bo29bobo18bobo25bobobbo27b3obo27boo20bobobo5b3o27b oo45bobo18bo88boo49b3o45boo17boo3boo418boobboo20boo27bobo$116boo31bo 19bo27bo3bo22bo5bo3bo8bo40bo4bobbo42boo34boo16bobo206boo3bo423bobo18bo bo29bo$124boo23boo14bo35bo22boo5bo3bo5b3o41bo3bobboo41boo52boo146boo 66bo422bobboo15bo31boo$124boo38bobo4boo25b3o22boobo5bob3o3bo296bobo64b oo441boo23boo$163bo3bo3bo31bo18bobb3o5b3o4boo44boobbo199bobo46bo59boo bbo421boobbo3bo38boo$162bo3bo5b3o27bobo16bobobo8bo54bobo199boo46boo58b o3bo422bobbo4bo$130bo30bo3bo8bo21boo5boo15bobobo13bo51boobboo11bo183bo 94boo12b3o420b3o5bobobo$129bobo28bo3bo31bobboo17b3obbo13bobo42bo11boo 11b3o260bo16bo10bobo422bo8bobobo30bo$130bo30bobo33boobo18boboo15boobb oo21boo13b3o27bo258boboboboo7b3o11boo113bobo317bo4bo27bobo$162bo35bo5b oo14boo20boo17boobboo12bo29boo237boo20booboobo7bo128boo319bo3bo28bo$ 198bo5boo11bo3bo38bobo16boo40boo3boo32boo187bo164bo$184b3o12boo15bobo 42bo7boo51bo3bo20boo11boo184b3o486boo$184b3o14bo14boo39bo12bo22b3o23b 3o5b3o18bo197bo$184b3o10bo3b3o16boo34bobo4boo5bobo20bo25bo9bo15b3o35b oo5boo$187b3o5b3o6bo15bobo32bo3bo3bo7boo4boo15bo16b3o31bo37boobboobbo 104bo$187b3o4bo8boo10boo5bo31bo3bo5b3o9bobbo30bobbo73boboo106boo$187b 3o4boo19boo5boo29bo3bo8bo10boo31bo3bo49boo23bo106boo$252bo3bo32boo18b oobobo50bo23bo$192bo54boo4bobo33boo18booboo48b3o18boobboo$191bobo49boo bboo5bo55b3o49bo20bobbo$192boobboo44bobo140boo90bo$185boo9boo45bo34bo 35bo163bo$185boo90bobo32b5o4boo153b3o$239boo4boo30bobo33bobbo4boo$237b oboo4bo32bo32b3obboo$236bo9b3o62boobb3o383bobo$239bo8bo26boo3boo29bo 389boo$235boobo37bo3bo19boo9boobo387bo$235boo36b3o5b3o15bobo10b3o$273b o9bo9bo5bo13bo$159bo132bobo3boo212bo$158bobo19bo110bo3bo214bobo$158bob o18boo111bo3bo8bo205boo$157booboo16bob3o110bo3bo5b3o$178boboboo110bo3b o3bo371bo$157booboo17b4o56bo55bobo4boo368boo$158boboo18boo14boo40boo 56bo376boo29bobo$156bo39bobo38boboo59bo403boo$156boo40bo37b3obbo31b3o 23bobo403bo$198boo38bobobo29bo27boobboo$239bobobo28bo3bo27boo$164boo 74bobb3o21boo3bobbobo8bo$158boo4boo47boo26boobo29bobobbo4b3o$157bobo 27boo20boobboo27boo22bo3bo4bo3bo3bo$157bo29bobo18bobo31bo3bo18bo4bo8bo 3boo$156boo31bo15boobbo35bobo16bobobo7b3o$164boo23boo48boo5boo15bobobo 13bo$164boo38bo3bobboo26bobboo17bo4bo13bobo$203bo4bobbo28boobo17bo3bo 15boobboo21boo$202bobobo5b3o26bo5boo36boo17boobboo$170bo30bobobo8bo13b o12bo5boo11bobboo38bobo$169bobo27bo4bo22bobo12boo15bobo42bo$170bo28bo 3bo22bo3bo13bo14boo39bo$227bo3bo8bo3b3o16boo34b3o4boo$201boo25bo3bo5b 3o6bo15bobo32bob3o3bo258bobo$229bo3bo3bo8boo10boo5bo31bo3bo5b3o256boo$ 230bobo4boo19boo5boo29bo3bo8bo256bo$231bo63b3obo$235bo54boo4b3o$234bob o49boobboo5bo$235boobboo44bobo44bo$228boo9boo45bo44boo$228boo70bo29bob oo$281b3o4boo9bobo27b3obbo$281b3o4bo11bo30bobobo8bo313bo$281b3o5b3o40b obobo5b3o312bo$278b3o10bo41bobb3obbo315b3o$278b3o13boo38boobo3boo$278b 3o13boo23boo14boo245bo$286boo31bo15bo3bo243bo$202bo84bo29bobo18bobo 217bo22b3o$201bobo83bobo27boo20boobboo211bobo$201bobo84boo4boo47boo 212boo$200booboo16boo71boo$221boo$200booboo123boo$201boboo34boo45boo 40bo200bo132bo$199bo39bobo44bo39bobo201boo128boo$199boo40bo46boboo34b oo201boo130boo$241boo44booboo$308boo7bo$207boo78booboo16boo7bo308bobo$ 201boo4boo47boo30bobo24bobo308boo$200bobo27boo20boobboo30bobo24bo311bo $200bo29bobo18bobo35bo26bo$199boo31bo19bo113bo205bobo$207boo23boo14bo 324boo$207boo45boo108bob3o204bo$246b3obo3bo111boobo8bo$245boboo6b3o 108boboo6b3o167bo$213bo31boobo8bo109b3obo3bo171boo$212bobo28bob3o127b oo169boo$213bo101boo52bo260bo$245bo69boo9boo45bo255bo$322boobboo44bobo 254b3o$321bobo49boobboo$322bo54boo4b3o$383b3o$318boo4boo19boo5boo29b3o 10bo$316boboo4bo8boo10boo5bo33b3o5b3o$315bo9b3o6bo15bobo33b3o4bo$318bo 8bo3b3o16boo34b3o4boo$314boobo13bo14boo$314boo13boo15bobo42bo$328bo5b oo11bo42bobo$328bo5boo14b3o19boo17boobboo165bo$327boobo18bo18boobboo 21boo163bobo$326bobboo7bo10bo3bo13bobo191boo$326boo5booboo11bobbobo13b o$332bobobboo12bobobbo7bo253bo$297b3o33bo18bo3bo6bobo4boo244boo$266bo 29bo32bo26bo5bo3bo3bo246boo$265bobo28bo3bo27b3o22b3o5bo3bo5b3o$266bo 29bobbobo8bo16bob3o28bo3bo8bo$298bobobbo4b3o15bo3bo28bo3bo27boo$299bo 3bo3bo17bo3bo30bobo24boobboo$260boo41bo3boo15b3obo32bo24bobo$260boo23b oo13b3o22b3o59bo$252boo31bo19bo20bo$253bo29bobo18bobo76boo4boo$253bobo 27boo20boobboo70boboo4bo$254boo4boo47boo69bo9b3o$260boo121bo8bo$379boo bo$294boo83boo4boo$252boo40bo65bo9bo15bo$252bo39bobo65b3o5b3o15bobo$ 254boboo34boo69bo3bo19boo$253booboo104boo3boo$274boo$253booboo16boo$ 254bobo151boo$254bobo151boo$255bo75boo$472boo$329bo3bo115bo20bobbo$ 329bo4bo41boo71b3o18boobboo$331bobobo8bo31boo74bo23bo$332bobobo5b3o19b oo85boo23bo$333bo4bobbo21bobbo107boboo$334bo3bobboo15boo4boo66bo37boo bboobbo$281boo74bobo46bo9bo15b3o35boo5boo$281boo9boo41boobbo17bo48b3o 5b3o18bo141boo$288boobboo44bobo15boo51bo3bo20boo11boo127bobo$287bobo 49boobboo21boo40boo3boo32boo129bo$288bo54boo4boo15bo29boo$284bo64boobo 14b3o27bo13bo$290boo19boo5boo33bo8bo6bo11boo11b3o13bobo$282b3obo3bo8b oo10boo5bo31bo9b3o14boobboo11bo15bobo173bo$281boboo6b3o6bo15bobo32bob oo4bo16bobo32bo174boo$281boobo8bo3b3o16boo35boo4boo16bo207bobo$279bob 3o13bo14boo58b3o$295boo15bobo42bo17bo3boo41boo52boo$281bo12bo5boo11bo 42bobo12bo3bo3bo42boo34boo16bobo$294bo5boo15bo20boo17boobboo7bobobbo4b 3o27boo45bobo18bo$259boo32boobo19b3o15boobboo21boo5bobbobo8bo26bobbo 44bo20boo$292bobboo18b3obo13bobo32bo3bo31boo4boo44boo4boo$228bo28bo3bo 30boo5boo15bo3bo13bo33bo34bobo25bo3boo23bobbo93boo$227bobo27bo4bo35bob o16bo3bo47b3o31bo26bobo3bo23boo94bobo$228bo30bobobo8bo26bo18bob3o6b3o 4boo64boo26boo3bo33boo87bo$260bobobo5b3o22bo23b3o7b3o4bo75boo20bo12boo 20boo98bo$261bo4bobbo24bobo23bo8b3o5b3o72bo17b5obo10bo121boo$222boo38b o3bobboo22bo3bo28b3o10bo73b3o14bo4boo11b3o117bobo$222boo23boo43bo3bo 29b3o28boo56bo11bo3b3o16bo27boo$214boo31bo15boobbo23bo3bo30b3o24boobb oo67boo5boboo41bo$215bo29bobo18bobo21bo3bo57bobo71bobo5bobo42bo$215bob o27boo20boobboo18bobo59bo124boo$216boo4boo47boo19bo56bo$222boo131boo$ 347b3obo3bo$256boo88boboo6b3o$214boo40bo89boobo8bo$214bo39bobo87bob3o$ 216boboo34boo95boo$215booboo106bo9bo9bo5bo$236boo88b3o5b3o15bobo104boo $215booboo16boo91bo3bo19boo105bo$216bobo109boo3boo125bobo$216bobo242b oo$217bo113bo$330bobo41boo$293boo35bobo41boo$293boobo34bo$297bo8bo45b oobbo81boo$294bo9b3o44b3obboo57bo20bobbo$295boboo4bo38boo8boobb3o56b3o 18boobboo$297boo4boo37boo8boobboo60bo23bo126boo6boo17booboobo7bo$243b oo85boo85boo23bo126bobbo4boo16boboboboo7b3o11boo$243boo9boo45bo27bobbo 107boboo63boo57booboboo23bo16bo10bobo$250boobboo44bobo21boo4boo66bo37b oobboobbo61bobo56bobobo42boo12b3o$249bobo49boobboo5bo10bobo46bo9bo15b 3o35boo5boo17boo15boo27bo56bo3boboo52bo3bo$250bo54boo4bobo9bo48b3o5b3o 18bo60boo15bobo37bo44boobbobboo52boobbo$310bo3bo7boo51bo3bo20boo11boo 66bo37boo47boo60boo$245b3o4boo19boo5boo29bo3bo16boo40boo3boo32boo66boo 35bobo110bo$245b3o4bo8boo10boo5bo31bo3bo5b4o6bo29boo260boo3bo$245b3o5b 3o6bo15bobo32bo3bo3bo3bo7b3o27bo241boo17boo3boo$185bo30b3o23b3o10bo3b 3o16boo34bobo4boo12bo11boo11b3o242boo$184bobo29b3o23b3o14bo14boo39bo 27boobboo11bo$185bo30b3o10bo12b3o12boo15bobo42bo22bobo$219b3o5b3o26bo 5boo11bo3bo28boo8bobo22bo131bo$219b3o4bo29bo5boo14boo20boo6bobo8boobb oo14bo133b3o$179boo38b3o4boo27boobo18boboo15boobboo6bo14boo13b3o4boo 41boo52boo28bo44boo$179boo23boo48bobboo17b3obbo13bobo39bob3o3bo42boo 34boo16bobo27boo44boo54boo32boo$171boo31bo19bo29boo5boo15bobobo13bo39b o3bo5b3o27boo45bobo18bo72bo56boo11boo20bo$172bo29bobo18bobo34bobo16bob obo8bo42bo3bo8bo26bobbo44bo20boo141bo19bo$172bobo27boo20boobboo31bo18b obb3o5b3o4boo34b3obo31boo4boo44boo4boo158b3o16boo$173boo4boo47boo26b3o 22boobo5bob3o3bo36b3o31bobo25bo3boo23bobbo160bo20boo$179boo78bo22boo5b o3bo5b3o34bo32bo26bobo3bo23boo184bo$192b3o60bo3bo22bo5bo3bo8bo66boo26b oo3bo33boo125boo45b3o$193bo19boo39bobobbo27b3obo27boo57boo20bo12boo20b oo125bo46bo$171boo20bobbo5boo9bo38bobbobo30b3o24boobboo57bo17b5obo10bo 149b3o$171bo16b3obb4o8bo5bobo38bo3bo32bo24bobo62b3o14bo4boo11b3o148bo$ 173boboo12boobb3o6bobo6boo39bo62bo65bo15b3o16bo27boo6boo$172booboo13b 3o10bo49b3o143boboo41bo7boo173boo$191bo118b3o4boo81bobo42bo181bobo$ 172booboo133b3o4bo126boo108boo46boo25bo$173bobo24boo108b3o5b3o233boo3b oo42bo25boo$173bobo23bobbo104b3o10bo238boo42bobo15boo$174bo25boo105b3o 294boo15boo$193b3o55bo55b3o3boo$250b3o35bo9bo15bo231boo12boo$249b3obo 34b3o5b3o15bobo230bo5boo5bo$250bo3bo8bo27bo3bo19boo150boo75b3o6boo6b3o $251bo3bo5b3o26boo3boo170boo75bo18bo$252bob3o3bo164boo$253b3o4boo164bo $200boo52bo81boo88bobo$200boo9boo45bo77boo89boo96boo6boo20boobo7bo$ 207boobboo44bobo9bo255bobbo4boo20boboo7b3o11boo$206bobo49boobboo4boo 130boo120booboboo40bo10bobo17booboobboo$207bo54boo3boboo106bo20bobbo 119bobobo42boo12b3o16bobobbobo13boo$202b3o61b3obbo32boo71b3o18boobboo 117bo3boboo52bo3bo14bo3boo16bobo$205bo3boo19boo5boo29bobobo8bo22boo74b o23bo115boobbobboo52boobbo15boobo19bo$201bo3bo3bo8boo10boo5bo31bobobo 5b3o10boo85boo23bo119boo9b3o48boo14bobobbo16boo$200bobobbo4b3o6bo15bob o32bobb3obbo12bobbo107boboo181bo14bobobobo$198bobbobo8bo3b3o16boo34boo bo3boo6boo4boo66bo37boobboobbo128bobbo41boo3bo17booboo$198bo3bo13bo14b oo39boo11bobo46bo9bo15b3o35boo5boo129boo23boo17boo3boo$198bo15boo15bob o38bo3bo8bo48b3o5b3o18bo172bo24boo$199b3o11bo5boo11bo42bobo6boo51bo3bo 20boo11boo155b3o$174b3o36bo5boo36boo17boobboo12boo40boo3boo32boo51boo 15boo86b3o$143bo29bo38boobo19boo16boobboo21boo12bo29boo102boo15bobo85b oo$142bobo28bo3bo33bobboo19boobo13bobo40b3o27bo13bo107bo78boo$143bo29b obbobo8bo23boo5boo19bo9boobbo43bo11boo11b3o13bobo106boo23b3o50bobbo83b oo$175bobobbo4b3o29bobo16bo68boobboo11bo15bobo133bo50bobbo35boo46boo$ 176bo3bo3bo33bo18boboo7bo3bobboo47bobo32bo133bo51booboo13boo20bo$137b oo41bo3boo28bo24boo6bo4bobbo45bo3bo48boo171boo14bo19bo$137boo23boo13b 3o66bobobo5b3o42boo50bobbo187b3o16boo$129boo31bo19bo29b3obo28bobobo8bo 41boobo3boo39bo4bobbo47boo140bo20boo$130bo29bobo18bobo27boboo28bo4bo 27boo21bobb3obbo41bobbooboo29boo16bobo34bo126bo$130bobo27boo20boobboo 23boobo28bo3bo24boobboo20bobobo5b3o27boo8bo4boo30bobo18bo32b3o76boo45b 3o55boo$131boo4boo47boo21bob3o57bobo23bobobo8bo26bobbo44bo20boo30bo79b o46bo36boo19bo$137boo106boo25bo22b3obbo31boo4boo44boo4boo46boo79b3o81b o17bobo$211bo55b3o26boboo31bobo25bo3boo23bobbo129bo81bobo15boo$171boo 97bo3boo21boo32bo26bobo3bo23boo214boo4bo$129boo40bo94bo3bo3bo23bo31boo 26boo3bo33boo184boo24bobo$129bo39bobo93bobobbo4b3o62boo20bo12boo20boo 184bobo23bobo$131boboo34boo92bobbobo8bo62bo17b5obo10bo84bo49boo46boo 25bo24bo10boo10boo$130booboo128bo3bo73b3o14bo4boo11b3o81boo48boo3boo 42bo25boo34bobo8bobbo$151boo110bo6boo71bo15b3o16bo27boo51bobo53boo42bo bo15boo44bo$130booboo16boo92bo9bo8b3o4bo89boboo41bo153boo15boo44boo$ 131bobo111b3o5b3o15bobo88bobo42bo200boo8b3o12bo$131bobo114bo3bo19boo 132boo10boo82boo12boo91bo8bo14bobb3o4bobo$132bo75boo37boo3boo164boo83b o5boo5bo89b3o10bo18bo4bobo$500b3o6boo6b3o86bo27b4o4bobbo$206bo3bo289bo 18bo113bobo6b3o$196boo8bo4bo81boo337b3o9bo$196bobo9bobobo8bo71boo338b 3o6b3o6bo$196bo12bobobo5b3o413bo13bobo$210bo4bobbo138boo260boo29boo$ 211bo3bobboo114bo20bobbo124boo6boo20boobo7bo93bobo38boo5boo$158boo101b oo71b3o18boobboo26boo94bobbo4boo20boboo7b3o11boo16booboobboo53bo40boo 5bo$158boo9boo41boobbo44boo74bo23bo26bo44boo45booboboo40bo10bobo16bobo bbobo13boo37boo45bobo$165boobboo44bobo18boo11boo85boo23bo26bobo42boo 44bobobo42boo12b3o13bo3boo16bobo83boo$164bobo49boobboo14bo11bobbo107bo boo26boo88bo3boboo52bo3bo13boobo19bo62boo5boo8boo$165bo54boo4boo9b3o3b oo4boo66bo37boobboobbo114boobbobboo52boobbo14bobobbo16boo62bo5boo8bobo $161bo64boobo9bobbobo46bo9bo15b3o35boo5boo118boo60boo12bobobobo79bobo 14bo$167boo19boo5boo33bo11bo48b3o5b3o18bo224bo13booboo81boo18bo$159b3o bo3bo8boo10boo5bo31bo9b6o51bo3bo20boo11boo204boo3bo94boo9boo13bobo$ 158boboo6b3o6bo15bobo32boboo4bo14boo40boo3boo32boo185boo17boo3boo93bo 9bobo12bo3bo$133bo24boobo8bo3b3o16boo35boo4boobbo10bo29boo236boo118b3o 7bo14bo3bo$101bo54bob3o13bo14boo49b3o9b3o27bo13bo344bo23bo3bo$100bobo 28bob3o36boo15bobo42bo8bo10bo11boo11b3o13bobo346b3o19bo3bo$101bo31boob o8bo12bo12bo5boo11bo42bobo6boo18boobboo11bo15bobo108boo236b3o20bobo$ 133boboo6b3o25bo5boo15bo20boo17boobboo21bobo32bo109boo160boo40boo5boo 25b3o21bo$134b3obo3bo27boobo19b3o15boobboo21boo22bo305boo41bo5boo22b3o $95boo45boo25bobboo18b3obo13bobo177boo96boo32boo87bobo27b3o$95boo23boo 14bo32boo5boo15bo3bo13bo46boo4boo41boo52boo27boo96boo11boo20bo88boo27b 3o$87boo31bo19bo34bobo16bo3bo57boboo4bo42boo34boo16bobo137bo19bo94boo 51boo5boo$88bo29bobo18bobo34bo18bob3o6b3o4boo40bo9b3o27boo45bobo18bo 38booboo95b3o16boo92bobo10boo39boo5bo$88bobo27boo20boobboo26bo23b3o7b 3o4bo44bo8bo26bobbo44bo20boo37boobo98bo20boo85bo3bo11boo44bobo$89boo4b oo47boo25bobo23bo8b3o5b3o37boobo31boo4boo44boo4boo58bo118bo52boo31boo 10bo49boo$95boo73bo3bo28b3o10bo37boo32bobo25bo3boo23bobbo52bob5o68boo 45b3o32boo19bo31boobo10bo44boo$107boo8bo51bo3bo29b3o28boo52bo26bobo3bo 23boo54boo73bo46bo35bo17bobo30bobb3o7b3o26boo5boo9bobo$106b3obo5bo12b oo37bo3bo30b3o24boobboo51boo26boo3bo33boo48boo71b3o79bobo15boo30bobobo 39bo5boo10bo$87boo16bobo3boo7boo7bo37bo3bo57bobo65boo20bo12boo20boo49b o73bo80boo4bo6boo33bobobo40bobo$87bo17bobobboo5bob3o5bobo38bobo59bo66b o17b5obo10bo49boo18b3o160bobo4bobbo30b3obbo27boo13boo18boo$89boboo13b 3o9bo8boo40bo56bo71b3o14bo4boo11b3o47bo18bo138boo22bobo5boo32boboo7boo 19bo18boo14boobo$88booboo13b3o14bo108boo66bo15b3o16bo27boo5boo11bobo 155bobo22bo10boo10boo17boo9bo17bobo17bobo18bo$119bo4bo99b3obo3bo85bob oo41bo7bo12boo82boo46boo25bo33bobo9boo18bo9bobo15boo19bo16bo$88booboo 27bobo100boboo6b3o83bobo42bo6bobo94boo3boo42bo25boo34bo40boo4bo6boo19b o21boboo$89bobo24boo105boobo8bo127boo7boobboo95boo42bobo15boo42boo44bo bo4bobbo17b3o22boo$89bobo23bobbo102bob3o150boo140boo15boo27boo59bobo5b oo17bob3o$90bo25boo110boo133boo200bo60bo10boo12bo3bo$109b3o91bo9bo9bo 5bo132bobo95boo12boo86b3o72bobo10bo3bo$166b3o34b3o5b3o15bobo131bo97bo 5boo5bo87bo76bo9b3obo$166b3o37bo3bo19boo145boo79b3o6boo6b3o161boo9b3o$ 166b3o10bo25boo3boo159boo4boo79bo18bo146boo25bo$169b3o5b3o191boo252bo$ 169b3o4bo442boob3o30bo$169b3o4boo73boo91boo229boo42boobo31boo$116boo 133boo92bo101bo126bobo38boo5bo30boboo$116boo9boo45bo170bobo99b3o124bo 40boo5boboo26b3obbo$123boobboo44bobo139boo29boo102bo63booboobboo50boo 45boboboo28bobobo8bo$122bobo49boobboo5bo106bo20bobbo55boo75boo23boobo 7bo29bobobbobo13boo82boo33bobobo5b3o$123bo54boo4b3o32boo71b3o18boobboo 52bobo100boboo7b3o11boo13bo3boo16bobo60boo5boo8boo38bobb3obbo$119bo63b 3obo31boo74bo23bo51bo116bo10bobo13boobo19bo61bo5boo8bobo38boobo3boo$ 118bobo4boo19boo5boo29bo3bo8bo9boo85boo23bo50boo115boo12b3o12bobobbo 16boo60bobo14bo40boo$117bo3bo3bo8boo10boo5bo31bo3bo5b3o8bobbo107boboo 119boo58bo3bo11bobobobo78boo17b3o35bo3bo$116bo3bo5b3o6bo15bobo32bob3o 3bo6boo4boo66bo37boobboobbo118bo59boobbo12booboo72boo9boo12bo41bobo$ 115bo3bo8bo3b3o16boo34b3o4boo4bobo46bo9bo15b3o35boo5boo116bobo64boo87b o9bobo12bo3bo38boobboo$114bo3bo13bo14boo39bo11bo48b3o5b3o18bo159boo20b oobboo40bo88b3o7bo13bobbobo41boo$115bobo12boo15bobo42bo6boo51bo3bo20b oo11boo71boo94b3obboo33boo3bo92bo3bo19bobobbo66boo5boo$116bo12bo5boo 11bobboo38bobo15boo40boo3boo32boo7bo63boo95boobb3o13boo17boo3boo94b3o 19bo3bo66boo5bo$129bo5boo36boo17boobboo11bo29boo220bobboo14boo117bob3o 22bo71bobo$128boobo17bo3bo15boobboo21boo12b3o27bo13bo45boobo43boo68boo 147boo5boo23bo3bo20b3o72boo$127bobboo17bo4bo13bobo41bo11boo11b3o13bobo 46boboboo39boo68boo107boo39bo5boo22bo3bo92boo$127boo5boo15bobobo13bo 50boobboo11bo15bobo46b3oboo217bobbo38bobo26b3obo93bobo$133bobo16bobobo 7b3o52bobo32bo49boo53booboo161booboo38boo27b3o95bobboo$130bo3bo18bo4bo 8bo3boo47bo122bo15boobo163bo45boo24bo26boo5boo$130boo22bo3bo4bo3bo3bo 44bo125boo20bo84boo32boo41bobbo41bobo10boo39boo5bo63bo3bo$129boobo29bo bobbo4b3o40b3o4boo41boo52boo21bobo13bob5o84boo11boo20bo42bobo42bo11boo 44bobo27boo34bo4bo$128bobb3o21boo3bobbobo8bo39bob3o3bo42boo34boo16bobo 36boo102bo19bo85bo61boo24boobboo3boo31bobobo$127bobobo28bo3bo27boo19bo 3bo5b3o27boo45bobo18bo39boo100b3o16boo53boo87boo27bobo6bobo32bobobo$ 126bobobo29bo27boobboo18bo3bo8bo26bobbo44bo20boo39bo102bo20boo28boo19b o28b3obo37boo5boo9bobo27bo7bo35bo4bo$124b3obbo31b3o23bobo21b3obo31boo 4boo44boo4boo32boo18b3o125bo29bo17bobo27boboo40bo5boo10bo23b3o9boo36bo 3bo$125boboo59bo23b3o31bobo25bo3boo23bobbo33bo18bo124b3o30bobo15boo28b oobo40bobo19bo22bo3boobbo$126boo56bo28bo32bo26bobo3bo23boo22boo11bobo 141bo33boo11bo31bob3o27boo13boo18bobo17bo3bo3bo3bo27bo11boo$127bo55bob o4boo53boo26boo3bo33boo14bo12boo12boo166b3o5boo41boo19bo18boo13bo3bo 15bobobbo4b3o26b3o$182bo3bo3bo64boo20bo12boo20boo14bobo24boo24boo140b 3o6bo32bo9bo17bobo17bobo14bo3bo12bobbobo4bobo4boo5boo14bo$181bo3bo5b3o 61bo17b5obo10bo38boobboo45bobo44boo106boo10boo26bobo15boo15bo3bo16bo3b o11bo3bo5boo6bo5boo14boo$180bo3bo8bo62b3o14bo4boo11b3o39boo47bo44boo 73boo31bobo9boo27boo4bo27boo20bo3bo10bo17bobo$179bo3bo74bo15b3o16bo27b oo179bobo32bo43bobo25boobo20bobo12b3o15boo$180bobo3boo88boboo41bo155b oo25bo32boo42bobo24bobb3o20bo35boo$161bo9bo9bo5bo89bobo42bo155bo25boo 16boo58bo10boo12bobobo57bobo$161b3o5b3o15bobo131boo11boo142bobo15boo 25bo69bobo10bobobo59bo$164bo3bo19boo138boo4boo10b4o129boo15boo22b3o72b o8b3obbo87bo$163boo3boo158boo15boobbo5boo15boo4bo141bo74boo8boboo56b3o 27b3o$344boobbo4boboboo16booboo15boo6boo17booboobo7bo143boo24boo57b3o 26bo$345bobbobboo5bo17bobbo15bobbo4boo16boboboboo7b3o11boo129bo25bo57b 3o26boo$209boo135boo6bo3bo13boo6boo10booboboo23bo16bo10bobo125b3o81b3o 7boo$209boo140bo5bo14bo8bo9bobobo42boo12b3o123bo32bo50b3o7boo$352b4o 17bo6bo10bo3boboo52bo3bo77boo127b3o$273boo54boo23bo18b3o14boobbobboo 52boobbo76bobo38boo5boo27bob3o$250bo20bobbo27boo24bobo40b3o20boo60boo 74bo40boo5bo30boobo8bo$177boo71b3o18boobboo26bo24bo42bobo83bo73boo45bo bo30boboo6b3o$177boo74bo23bo25bobo21boo42bo15boo61boo3bo122boo32b3obo 3bo$165boo85boo23bo26boo66bo14boo42boo17boo3boo18booboobboo73boo5boo8b oo44boo62boo$164bobbo107boboo152boo43bobobbobo13boo59bo5boo8bobo37bo 69boo$159boo4boo66bo37boobboobbo195bo3boo16bobo58bobo14bobboo38bo$158b obo46bo9bo15b3o35boo5boo95b3o98boobo19bo59boo56bobo$158bo48b3o5b3o18bo 240bobobbo16boo51boo9boo11bo3bo37boobboo$157boo51bo3bo20boo11boo127boo 98bobobobo68bo9bobo11bo4bo40boo$167boo40boo3boo32boo127bobo98booboo70b 3o3bo3bo14bobobo66boo5boo$167bo29boo178bobbo19boo32boo119bo3boo10bo7bo bobo65boo5bo$168b3o27bo13bo165boboo18boo11boo20bo122boobo10bo7bo4bo68b obo45bo$170bo11boo11b3o13bobo107boo57bo32bo19bo123bobb3o7b3o8bo3bo68b oo45bobo$178boobboo11bo15bobo107boo91b3o16boo89boo5boo23bobobo89boo50b o$177bobo32bo166bo36bo20boo86bo5boo22bobobo22boo66bobo$174boobbo126boo 71bo59bo86bobo25b3obbo92bo$305boo81boo45b3o49boo37boo26boboo$173bo3bo bboo41boo52boo109bo46bo51boo41boo23boo26boo5boo62boo36boo3boo$172bo4bo bbo42boo34boo16bobo37booboo67b3o137bobo10boo12bo26boo5bo25boo36boobo 34boo3boo$171bobobo5b3o27boo45bobo18bo37boobo70bo138bo11boo44bobo21boo bboo3boo35bo$170bobobo8bo26bobbo44bo20boo41bo265boo21bobo6bobo32bo$ 168bo4bo31boo4boo44boo4boo51bob5o130boo70b3o56boo22boobbo7bo35boboo24b oboo$168bo3bo31bobo25bo3boo23bobbo51boo61bobo71bobo69b3o38boo5boo9bobo 32boo37boo22b3oboo$204bo26bobo3bo23boo56boo58bobo46boo25bo42boo25b3o 39bo5boo10bo21bo3bobboobbo62bo11boo$170boo31boo26boo3bo33boo48bo58b3o 3boo42bo25boo20boo19bo23b3o42bobo18b3o15bo4bobbo3bo27bo35b3oboo5bo$ 213boo20bo12boo20boo25boo18b3o65boo18bobo21bobo15boo29bo17bobo23b3o28b oo13boo17bo17bobobo5b3o26b3o37bobobbo4b3o$213bo17b5obo10bo49bo18bo88b oo22boo15boo29bobo15boo24b3o7boo19bo18boo13bo3bo12bobobo4bobo4boo5boo 14bo44boo6bo$214b3o14bo4boo11b3o33boo11bobo105bo72boo4bo6boo39bo17bobo 17bobo13bobbobo9bo4bo5boo6bo5boo14boo$216bo15b3o16bo27boo5bo12boo71boo 12boo96bobo4bobbo38bobo15boo19bo16bobobbo7bo3bo14bobo$234boboo41bo6bob o84bo5boo5bo97bobo5boo40boo4bo27bo21bo3bo27boo$235bobo42bo6boobboo77b 3o6boo6b3o95bo10boo10boo29bobo52bo9boo20boo$279boo10boo77bo18bo106bobo 9boo29bobo24b3obo20b3o31bobo$498bo41bo10boo12boboo57bo$279boo217boo51b obo11boobo53bo30bo$278bobo202boo68bo9bob3o53b3o27b3o$279bo12boo190bo 68boo65bob3o25bo$286boo4boo187b3o54boo25bo53bo3bo26boo$286boo138booboo bboo46bo57bo78bo3bo5boo8bo$427bobobbobo13boo86b3o78b3obo6boo6bobo$426b o3boo16bobo85bo81b3o16boo$260boo165boobo19bo117b3o48bo$261bo166bobobbo 16boo116b3o$261bobo164bobobobo59boo72b3o10bo$262boo23boo140booboo59bob o38boo5boo28b3o5b3o$286bobo204bo40boo5bo29b3o4bo61boo$286bo205boo45bob o29b3o4boo60boo$285boo252boo$518boo5boo8boo39bo$519bo5boo8bobo37bobo$ 519bobo14bobboo35boobboo$438boo80boo58boo$438boo73boo9boo11bo3bo65boo 5boo$279boo232bo9bobo11bo4bo64boo5bo43bo$279boo233b3o3bo3bo14bobobo68b obo42bobo$516bo3boo18bobobo67boo44bo$263boo254boobo18bo4bo61boo$263boo 253bobb3o18bo3bo61bobo$449boo34boo5boo23bobobo87bo$275booboo148boo19bo 36bo5boo22bobobo22boo68bo34boo3boo$275boobo150bo17bobo36bobo25b3obbo 92bobo33boo3boo$259boo19bo148bobo15boo38boo26boboo55boo35bo3bo$258boo 14bob5o149boo4bo6boo46boo23boo26boo5boo17boobboo3boo31bo3bo$260bo13boo 159bobo4bobbo44bobo10boo12bo26boo5bo17bobo6bobo32bo3bo22boboo$277boo 156bobo5boo46bo11boo44bobo18bo7bo35bo3bo19b3oboo$278bo157bo10boo10boo 88boo26boo36bobo19bo11boo$255boo18b3o169bobo9boo25b3o56boo19boo4boobbo 39bo21b3oboo5bo$256bo18bo173bo36b3o38boo5boo9bobo16boboo4bo3bo27bo35bo bobbo4b3o$243boo11bobo190boo35b3o39bo5boo10bo16bo9b3o26b3o39boo6bo$ 244bo12boo12boo161boo47b3o42bobo18b3o14bo4bobo4boo5boo14bo$244bobo24b oo162bo47b3o28boo13boo17bo13boobo5boo6bo5boo14boo$245boobboo181b3o48b 3o7boo19bo18boo13bo3bo9boo15bobo$249boo181bo61bo17bobo17bobo13bobbobo 26boo$494bobo15boo19bo16bobobbo28boo$270boo223boo4bo27bo21bo3bo27bobo$ 500bobo52bo24bo3bo$250boo248bobo24b3obo20b3o25boo29bo$244boo4boo11boo 180boo54bo10boo12boboo49boobo26b3o$244boo16bobo6boo171bobo38boo5boo18b obo11boobo48bobb3o24bo$261boobo6bobo170bo40boo5bo21bo9bob3o48bobobo26b oo$262boo9bo169boo45bobo21boo60bobobo5boo$263bo3b4obbo216boo7boo25bo 47b3obbo6boo$268bobobo196boo5boo8boo12bo74boboo$270boo198bo5boo8bobo8b 3o76boo$245boo223bobo14bo9bo79bo$244bobo224boo18bo37b3o$244bo219boo9b oo52b3o$243boo219bo9bobo12bob3o35b3o10bo55boo$465b3o3boobbo15boobo37b 3o5b3o55boo$467bo23boboo37b3o4bo$470bo3bo17b3obo35b3o4boo$469bo4bo$ 436boo5boo23bobobo21bo42bo$437bo5boo22bobobo64bobo$437bobo25bo4bo66boo bboo$438boo25bo3bo71boo73bo$442boo51boo5boo64boo5boo38bobo$441bobo10b oo11boo26boo5bo65boo5bo40bo$442bo11boo44bobo70bobo$438bo61boo71boo$ 437bobo56boo71boo$436bo3bo37boo5boo9bobo70bobo34boo3boo$435bo3bo39bo5b oo10bo3bo68bo35boo3boo$434bo3bo40bobo18boo72bo$433bo3bo27boo13boo17bob oo70bobo$434bobo7boo19bo18boo12b3obbo31boo35bo3bo21boboo$435bo9bo17bob o17bobo14bobobo26boobboo3boo31bo3bo18b3oboo$445bobo15boo19bo16bobobo 24bobo6bobo32bo3bo16bo11boo$446boo4bo49bobb3o23bo7bo35bo3bo16b3oboo5bo $451bobo26boo21boobo31boo36bobo19bobobbo4b3o$451bobo24boboo22boo21boo 4boobbo39bo24boo6bo$452bo10boo12bo26bo20boboo4bo3bo16bobo8bo$463bobo 14bo43bo9b3o17boo7b3o$465bo10boobo47bo4bobo4boo5boo7bo6bo$465boo9boo 45boobo5boo6bo5boo14boo$450boo71boo15bobo$451bo89boo$448b3o94boo$448bo 32bo62bobo$480bobo58bo3bo$479bo3bo57boo29bo$480bo3bo8bo46boobo26b3o$ 481bo3bo5b3o45bobb3o24bo$482bo3bo3bo47bobobo26boo$483bobo4boo45bobobo 5boo$484bo50b3obbo6boo$488bo47boboo$487bobo47boo$488boobboo44bo$492boo $519boo5boo$519boo5bo32boo$524bobo32boo$524boo$520boo$520bobo$521bo$ 525bo$524b3o$486boo35b3obo49bo$482boobboo3boo31bo3bo47bobo$481bobo6bob o32bo3bo47bo$482bo7bo35bob3o$489boo36b3o$477b3o4boobbo39bo$477b3o4bo3b o13b3o11bo50boo3boo$477b3o5b3o14bo11b3o50boo3boo$474b3o6bobo4boo5boo4b o9bo$474b3o6boo6bo5boo14boo$474b3o14bobo65boboo$492boo63b3oboo$496boo 58bo11boo$495bobo59b3oboo5bo$492boobbo62bobobbo4b3o$523bo39boo6bo$491b o3bo25b3o$490bo4bo24bo$489bobobo14bo11boo$488bobobo5boo7bobo$486bo4bo 6boo7bobo$486bo3bo17bo$$488boo$511booboo$511booboo$511booboo$517bobo$ 514boo$515bo3bo$515bo$518boo$519bo$514bo4bo$514bo3bo9bo$516boo9bobo$ 528bo4$518boo3boo$518boo3boo3$510boboo$508b3oboo$507bo11boo$508b3oboo 5bo$510bobobbo4b3o$514boo6bo! golly-2.5-src/Patterns/Life/Guns/golly-ticker.rle0000644000175100001440000003641412156145314016727 00000000000000#C GollyTicker-Take4, based on Alan Hensel's Decimal Counter (1994). #C Created by Brice Due Sept 2005, modified by Dave Greene Sept 2006. #C #C Info: The graphic logo displayed by this 'ticker tape gun' was #C designed around the phases of a period 8 oscillator known as #C Kok's Galaxy, found by Jan Kok in 1971. Period 8 means there are #C 8 distinct patterns (called 'phases') which repeat cyclically, #C one phase per Life generation. The 'ticker tape parade' shown here #C is bounded on the left by two columns of these Galaxy patterns. #C At any given moment all 8 phases are present in different places. #C #C The 'O' in 'GOLLY' is represented by one of the 8 phases of Kok's #C Galaxy, while the two 'L's are derived from another phase -- #C divided and rotated. The memory loop technology is borrowed from #C Alan Hensel's Decimal Counter, listed on Dean Hickerson's webpage: #C http://www.radicaleye.com/DRH/dec.counter.html . #C #C P.S. In hash mode at step 8^6, the tape appears to run in reverse! #C And if you are new to Life, you will gain some insight by pondering #C why the Kok's Galaxies at the left appear frozen when running in #C hash mode at step sizes above 8^0 -- or in regular qlife mode at #C step sizes above 10^2. Hint: Life is all about timing. x = 2993, y = 747, rule = B3/S23 2354b4o7b2o$2353bo3bo6bo2bo12b2o$2353bo10bo2b2o11b2o$2354bob2obo4bo2bo $2357b3o6bo2$2357b3o6bo$2356b2obo4bo2bo$2355bo8bo2b2o$2356b2o6bo2bo$ 2357bo7b2o3$2390b2o$2390b2o4$2469b4o7b2o$2384bo5bo77bo3bo6bo2bo12b2o$ 2383b3o3b3o76bo10bo2b2o11b2o$2382bo2b2ob2o2bo76bob2obo4bo2bo$2382bo3bo bo3bo79b3o6bo$2384bobobobo$2472b3o6bo$2381b2ob2o3b2ob2o77b2obo4bo2bo$ 2383bo7bo78bo8bo2b2o$2471b2o6bo2bo$2472bo7b2o3$2390bo114b2o$2389b3o 113b2o$2388bo3bo$2387bo5bo$2387bo5bo$2388bo3bo191b4o7b2o$2499bo5bo77bo 3bo6bo2bo12b2o$2388bo3bo105b3o3b3o76bo10bo2b2o11b2o$2387bo5bo103bo2b2o b2o2bo76bob2obo4bo2bo$2383b2o2bo5bo103bo3bobo3bo79b3o6bo$2383b2o3bo3bo 106bobobobo$2389b3o195b3o6bo$2390bo105b2ob2o3b2ob2o77b2obo4bo2bo$2498b o7bo78bo8bo2b2o$2586b2o6bo2bo$2587bo7b2o3$2505bo114b2o$2504b3o113b2o$ 2503bo3bo$2502bo5bo89bo$2502bo5bo76bo11b2o$2503bo3bo76bo12bobo99b4o7b 2o$2584b3o27bo5bo77bo3bo6bo2bo12b2o$2503bo3bo105b3o3b3o76bo10bo2b2o11b 2o$2502bo5bo103bo2b2ob2o2bo76bob2obo4bo2bo$2447bo50b2o2bo5bo103bo3bobo 3bo79b3o6bo$2446bo51b2o3bo3bo106bobobobo$2446b3o55b3o195b3o6bo$2505bo 105b2ob2o3b2ob2o77b2obo4bo2bo$2613bo7bo78bo8bo2b2o$2701b2o6bo2bo$2609b 2o91bo7b2o$2573bo34b2o$2573bobo34bo$2573b2o45bo114b2o$2619b3o113b2o$ 2474bo143bo3bo$2435bo38b2o141bo5bo$2435bobo35bobo141bo5bo$2435b2o181bo 3bo191b4o7b2o$2729bo5bo77bo3bo6bo2bo12b2o$2618bo3bo105b3o3b3o76bo10bo 2b2o11b2o$2617bo5bo103bo2b2ob2o2bo76bob2obo4bo2bo$2562bo37b2o11b2o2bo 5bo103bo3bobo3bo79b3o6bo$2561bo39b2o10b2o3bo3bo106bobobobo$2561b3o36bo 18b3o195b3o6bo$2620bo105b2ob2o3b2ob2o77b2obo4bo2bo$2728bo7bo78bo8bo2b 2o$2462b2o352b2o6bo2bo$2463b2o352bo7b2o$2462bo225bo$2688bobo$2688b2o 45bo114b2o$2734b3o113b2o$2589bo143bo3bo$2589b2o141bo5bo$2588bobo141bo 5bo$2733bo3bo191b4o7b2o$2844bo5bo77bo3bo6bo2bo12b2o$2451bo281bo3bo105b 3o3b3o76bo10bo2b2o11b2o$2451b2o279bo5bo103bo2b2ob2o2bo76bob2obo4bo2bo$ 2450bobo224bo50b2o2bo5bo103bo3bobo3bo79b3o6bo$2676bo51b2o3bo3bo106bobo bobo$2676b3o55b3o195b3o6bo$2735bo105b2ob2o3b2ob2o77b2obo4bo2bo$2843bo 7bo78bo8bo2b2o$2931b2o6bo2bo$2932bo7b2o3$2850bo114b2o$2401bo37b2o408b 3o113b2o$2400bo39b2o406bo3bo$2400b3o36bo407bo5bo89bo$2847bo5bo88b2o$ 2848bo3bo89bobo$2959bo5bo$2848bo3bo105b3o3b3o$2847bo5bo103bo2b2ob2o2bo $2792bo37b2o11b2o2bo5bo103bo3bobo3bo$2791bo39b2o10b2o3bo3bo106bobobobo $2791b3o36bo18b3o$2428bo421bo105b2ob2o3b2ob2o$2389bo38b2o528bo7bo$ 2389bobo35bobo262b2o$2389b2o302b2o$2692bo2$2965bo$2554b2o408b3o$2555b 2o406bo3bo$2554bo225bo181bo5bo$2780bobo179bo5bo$2780b2o181bo3bo2$2681b o281bo3bo$2681b2o279bo5bo$2680bobo224bo37b2o11b2o2bo5bo$2906bo39b2o10b 2o3bo3bo$2906b3o36bo18b3o$2965bo$2504bo$2504bobo$2504b2o4$2631bo$2630b o303bo$2630b3o301b2o$2933bobo2$2493bo$2492bo303bo$2492b3o301b2o$2795bo bo4$2619bo$2619bobo$2619b2o7$2382bo$2343bo38b2o$2343bobo35bobo$2343b2o 5$2773bo$2773b2o$2772bobo2$2332bo$2331bo$2331b3o$2861bo$2860bo$2860b3o $2497bo$2458bo38b2o$2458bobo35bobo262b2o$2458b2o302b2o$2761bo3$2623b2o $2624b2o$2623bo3$2447bo$2446bo$2446b3o6$2876b2o$2877b2o$2876bo3$2136b 2o$2136b2o4$2562bo37b2o$2561bo39b2o262bo$2561b3o36bo225bo38b2o$2198bo 627bobo35bobo$2198b2o626b2o$2197bobo2$2688bo$2688bobo$2129b3o3b3o550b 2o$2129bo2bobo2bo186b2o$2129b2obobob2o187b2o262bo$2129b2o5b2o186bo225b o38b2o$2251b2o297bobo35bobo$2251b2o297b2o$2186b2o$2187b2o262bo$2131b2o b2o50bo264b2o$2129bo2bobo2bo312bobo224bo$2129bobo3bo3bo3b3o530bo$2129b 3o3bo3bo3bobo530b3o$2137bo2bobo2bo$2139b2ob2o130bo$2274bobo$2274b2o$ 2803bo$2175bo627bobo$2137b2o5b2o29b2o67b3o3b3o550b2o$2137b2obobob2o28b obo67bo2bobo2bo148bo$2137bo2bobo2bo98b2obobob2o147bo303bo$2137b3o3b3o 98b2o5b2o147b3o301b2o$2366b2o335bobo$2366b2o$2263bo37b2o$2262bo39b2o$ 2246b2ob2o11b3o36bo$2244bo2bobo2bo539bo$2244bobo3bo3bo3b3o530bo$2163b 2o79b3o3bo3bo3bobo530b3o$2164b2o86bo2bobo2bo167bo$2156b2o5bo90b2ob2o 130bo38b2o$2156b2o231bobo35bobo262b2o$2389b2o302b2o$2144b2o546bo$2144b 2o144bo$2252b2o5b2o29b2o67b3o3b3o$2252b2obobob2o28bobo67bo2bobo2bo148b o$2252bo2bobo2bo98b2obobob2o147bo$2252b3o3b3o98b2o5b2o147b3o262bo$ 2481b2o297bobo$2481b2o297b2o$2416b2o$2215b2o200b2o$2215b2o144b2ob2o50b o$2359bo2bobo2bo$2359bobo3bo3bo3b3o$2156bo7bo44bo5bo143b3o3bo3bo3bobo$ 2155b4o3b4o42b3o3b3o61bo88bo2bobo2bo$2155bo3bobo3bo42bob2ob2obo54b2o4b 3o89b2ob2o130bo$2156bo2bobo2bo42b2o7b2o53b2o3bo3bo223bobo262bo37b2o$ 2156b3o3b3o42b2o7b2o58b2ob2o223b2o262bo39b2o$2207b3o5b3o41b2o15b2ob2o 487b3o36bo$2209b3ob3o43b2o$2211bobo62b2ob2o86b2o5b2o98b3o3b3o$2208bo2b obo2bo59b2ob2o86b2obobob2o98bo2bobo2bo$2207bo2bo3bo2bo58bo3bo86bo2bobo 2bo98b2obobob2o$2208b2o5b2o60b3o14b2o71b3o3b3o98b2o5b2o$2163b2o113bo 14bo2bo299b2o$2163b2o128bobo300b2o$2294bo236b2o$2330b2o200b2o262bo$ 2299b2o29b2o144b2ob2o50bo264b2o$2298bo2bo172bo2bobo2bo312bobo$2298bobo 173bobo3bo3bo3b3o$2271bo7bo19bo24bo5bo143b3o3bo3bo3bobo$2270b4o3b4o42b 3o3b3o61bo88bo2bobo2bo$17b2o2251bo3bobo3bo23b2o17bob2ob2obo54b2o4b3o 89b2ob2o130bo$16bobo2252bo2bobo2bo23bo2bo15b2o7b2o53b2o3bo3bo223bobo$ 16bo2254b3o3b3o23bobo16b2o7b2o58b2ob2o223b2o$15b2o2198b2o87bo17b3o5b3o 41b2o15b2ob2o$2215b2o107b3ob3o43b2o144bo$2309b2o15bobo62b2ob2o86b2o5b 2o29b2o67b3o3b3o$2308bo2bo11bo2bobo2bo59b2ob2o86b2obobob2o28bobo67bo2b obo2bo148bo37b2o$2308bobo11bo2bo3bo2bo58bo3bo86bo2bobo2bo98b2obobob2o 147bo39b2o$2309bo13b2o5b2o60b3o14b2o71b3o3b3o98b2o5b2o147b3o36bo$2278b 2o113bo14bo2bo299b2o$2278b2o128bobo300b2o$15b2o11b2o2379bo198bo37b2o$ 7b2o7bo10b4o2414b2o160bo39b2o$4bo11bobo7bob2ob2obo2379b2o29b2o144b2ob 2o11b3o36bo$3bobo2b2o7b2o12b2o2bo2377bo2bo172bo2bobo2bo$bobob3o2bo15b 2o2b2o2b3o2376bobo173bobo3bo3bo3b3o$bo2b6o16b4obo2b3o2349bo7bo19bo24bo 5bo143b3o3bo3bo3bobo$4b2ob2o16bo2bo3bo2bo2349b4o3b4o42b3o3b3o61bo88bo 2bobo2bo167bo$3b6o2bo12b3o2bob4o2350bo3bobo3bo23b2o17bob2ob2obo54b2o4b 3o89b2ob2o130bo38b2o$2bo2b3obobo12b3o2b2o2b2o2351bo2bobo2bo23bo2bo15b 2o7b2o53b2o3bo3bo223bobo35bobo$3b2o2bobo15bo2b2o2356b3o3b3o23bobo16b2o 7b2o58b2ob2o223b2o$8bo17bob2ob2obo2295b2o87bo17b3o5b3o41b2o15b2ob2o$4b 2o24b4o2296b2o107b3ob3o43b2o144bo$31b2o2408bobo62b2ob2o86b2o5b2o29b2o 67b3o3b3o$2438bo2bobo2bo59b2ob2o86b2obobob2o28bobo67bo2bobo2bo$2437bo 2bo3bo2bo58bo3bo86bo2bobo2bo98b2obobob2o$2438b2o5b2o60b3o14b2o71b3o3b 3o98b2o5b2o$2393b2o113bo14bo2bo$2393b2o128bobo$2524bo$2560b2o$4bo2bobo 17bo2bobo2496b2o29b2o144b2ob2o$2b2obob3o15b2obob3o2495bo2bo172bo2bobo 2bo$3bo6bo15bo6bo2494bobo173bobo3bo3bo3b3o$2b2o5bo15b2o5bo2468bo7bo19b o24bo5bo143b3o3bo3bo3bobo$2500b4o3b4o42b3o3b3o61bo88bo2bobo2bo$3bo5b2o 6b2o7bo5b2o2466bo3bobo3bo42bob2ob2obo54b2o4b3o89b2ob2o$2bo6bo6bobo6bo 6bo2468bo2bobo2bo42b2o7b2o53b2o3bo3bo$3b3obob2o5bo9b3obob2o2467b3o3b3o 42b2o7b2o58b2ob2o$3bobo2bo6b2o9bobo2bo2413b2o105b3o5b3o41b2o15b2ob2o$ 2445b2o107b3ob3o43b2o$2556bobo62b2ob2o86b2o5b2o$2553bo2bobo2bo59b2ob2o 86b2obobob2o$2552bo2bo3bo2bo58bo3bo86bo2bobo2bo$2553b2o5b2o60b3o14b2o 71b3o3b3o$2508b2o113bo14bo2bo$2508b2o128bobo$15b2o2622bo$16bo2658b2o$ 3b2ob2obo6bobo7b6ob2o2640b2o$2b2o2b2ob2o6b2o7b6ob2o$10bo22b2o$2b2o22b 2o5b2o2581bo7bo44bo5bo$2b2o5b2o15b2o5b2o2580b4o3b4o42b3o3b3o61bo$9b2o 15b2o5b2o2580bo3bobo3bo42bob2ob2obo54b2o4b3o$2bo23b2o2588bo2bobo2bo42b 2o7b2o53b2o3bo3bo$2b2ob2o2b2o15b2ob6o2581b3o3b3o42b2o7b2o58b2ob2o$3bob 2ob2o16b2ob6o2525b2o105b3o5b3o41b2o15b2ob2o$2560b2o107b3ob3o43b2o$ 2671bobo62b2ob2o$2668bo2bobo2bo59b2ob2o$2667bo2bo3bo2bo58bo3bo$2668b2o 5b2o60b3o$2623b2o113bo$2623b2o2$2790b2o$2b6ob2o16bo2bobo2757b2o$2b6ob 2o14b2obob3o$9b2o15bo6bo$2b2o5b2o14b2o5bo2698bo7bo44bo5bo$2b2o5b2o 2719b4o3b4o42b3o3b3o$2b2o5b2o6b2o7bo5b2o2696bo3bobo3bo42bob2ob2obo$2b 2o12bobo6bo6bo2698bo2bobo2bo42b2o7b2o$2b2ob6o5bo9b3obob2o2697b3o3b3o 42b2o7b2o$2b2ob6o4b2o9bobo2bo2643b2o105b3o5b3o$2675b2o107b3ob3o$2786bo bo$2783bo2bobo2bo$2782bo2bo3bo2bo$2783b2o5b2o$2738b2o$2738b2o$15b2o$3b 4o9bo$2bo4bob2o5bobo7b6ob2o$2bo4bo3bo5b2o7b6ob2o$5b2o4bo21b2o$2b2o4bo 2bo14b2o5b2o$bo2bo3bo2bo14b2o5b2o$bo2bo4b2o15b2o5b2o$bo4b2o18b2o$bo3bo 4bo15b2ob6o$2b2obo4bo15b2ob6o2755b2o$6b4o2780b2o6$2814b2o$4b2o2808b2o$ 3b4o$2bob2ob2obo16bo2bobo$7b2o2bo13b2obob3o$2b2o2b2o2b3o13bo6bo$2b4obo 2b3o12b2o5bo$bo2bo3bo2bo$3o2bob4o6b2o7bo5b2o$3o2b2o2b2o5bobo6bo6bo$bo 2b2o10bo9b3obob2o$2bob2ob2obo4b2o9bobo2bo$6b4o2752b2o$7b2o2753b2o$ 2807b2o5b2o$2807bob2ob2obo$2808bobobobo$2808bobobobo$2675b2o130bo7bo$ 3bo2bo8b2o2658b2o78b3o3b3o$7bo8bo2737bo2bo3bo2bo$8b2o6bobo7b6ob2o2719b o3bobo3bo$2bob2o6bo4b2o7b6ob2o2718b2obobobobob2o43b2ob2o$2bo2bo3bo23b 2o2718b2ob2o3b2ob2o41bo2bobo2bo$bo3bob3o16b2o5b2o2719b3o5b3o42b3o3b3o$ o11bo13b2o5b2o2773bo5bo$3b3obo3bo14b2o5b2o$3bo3bo2bo15b2o2786b2o$o6b2o bo15b2ob6o2779b2o$3b2o21b2ob6o$5bo2617b2o137bo$6bo2bo2613b2o136bobo$ 2668b2o5b2o83bo3bo$2667bo2bo3bo2bo82b5o$2668bo2bobo2bo82bobobobo$2671b obo86bo3bo$2560b2o107b3ob3o67b2o$2560b2o105b3o5b3o65b2o15bo3bo$7b2o 2607b3o3b3o42b2o7b2o81bobobobo$8bo18bo2bobo2583bo2bobo2bo42b2o7b2o77b 2o3b5o$3b3o2b2o15b2obob3o2582bo3bobo3bo42bob2ob2obo78b2o3bo3bo$b3obo3b o16bo6bo2581b4o3b4o42b3o3b3o84bobo$bo4bob2o15b2o5bo2583bo7bo44bo5bo86b o$5bobo$3b2obo4bo5b2o7bo5b2o$3bo3bob3o4bobo6bo6bo2642b2o$3b2o2b3o6bo9b 3obob2o2641b2o$4bo10b2o9bobo2bo2607bo$4b2o2502b2o128bobo$2508b2o128bo 2bo94b3o3b3o$2553b2o5b2o77b2o95b3o3b3o$2552bo2bo3bo2bo172bob2o3b2obo$ 2553bo2bobo2bo173bob2o3b2obo$2556bobo177b2o5b2o$7b2o2436b2o107b3ob3o 43b2o131bo5bo$4bo10b2o11b2o2415b2o105b3o5b3o41b2o$3bobo2b2o6bo10b4o 2470b3o3b3o42b2o7b2o$bobob3o2bo5bobo7bob2ob2obo2466bo2bobo2bo42b2o7b2o 53b2o11bo$bo2b6o7b2o12b2o2bo2464bo3bobo3bo42bob2ob2obo54b2o5bo5b2o107b 2ob2o$4b2ob2o17b2o2b2o2b3o2463b4o3b4o42b3o3b3o62b2o2bobo98bo6b2o5bo$3b 6o2bo14b4obo2b3o2464bo7bo44bo5bo62b2o102b2ob2o3bobobob2ob2o$2bo2b3obob o13bo2bo3bo2bo2691b2ob2obobobo3b2ob2o$3b2o2bobo14b3o2bob4o2694bo5b2o6b o2b2o$8bo15b3o2b2o2b2o2525b2o168b2ob2o11bobo$4b2o19bo2b2o2530b2o184bo$ 26bob2ob2obo2489bo$30b4o2359b2o128bobo87b2o$31b2o2360b2o128bo2bo85bobo 114bo5bo$2438b2o5b2o77b2o71b3o3b3o8bo113b2o5b2o$2437bo2bo3bo2bo149bo2b obo2bo11b2o108bob2o3b2obo$2438bo2bobo2bo73b2o75b2obobob2o12b2o107bob2o 3b2obo$2441bobo76b2o75b2o5b2o11bo110b3o3b3o$2330b2o107b3ob3o43b2o237b 3o3b3o$16b2o2312b2o87bo17b3o5b3o41b2o$17bo2368b3o3b3o23bobo16b2o7b2o 309b3o$17bobo2366bo2bobo2bo23bo2bo15b2o7b2o53b2o254bo$18b2o2365bo3bobo 3bo23b2o17bob2ob2obo54b2o5bo90b2ob2o154bo$2385b4o3b4o42b3o3b3o62b2o86b o2bobo2bo$2386bo7bo19bo24bo5bo62b2o79b3o3bo3bo3bobo$2413bobo173bobo3bo 3bo3b3o$2413bo2bo172bo2bobo2bo$2414b2o29b2o144b2ob2o$2445b2o$2409bo$ 2278b2o128bobo87b2o235b2o$2278b2o128bo2bo85bobo235b2o$2323b2o5b2o77b2o 71b3o3b3o8bo89b2o5b2o$2322bo2bo3bo2bo149bo2bobo2bo98b2obobob2o210bobo$ 2323bo2bobo2bo73b2o75b2obobob2o28bobo67bo2bobo2bo211b2o$2326bobo76b2o 75b2o5b2o29b2o67b3o3b3o211bo$2324b3ob3o43b2o144bo$2322b3o5b3o41b2o$ 2271b3o3b3o42b2o7b2o$2271bo2bobo2bo42b2o7b2o53b2o$2270bo3bobo3bo42bob 2ob2obo54b2o5bo90b2ob2o$2270b4o3b4o42b3o3b3o62b2o86bo2bobo2bo$2271bo7b o44bo5bo62b2o79b3o3bo3bo3bobo$2474bobo3bo3bo3b3o289b3o$2474bo2bobo2bo 297bo39bo$2330b2o144b2ob2o11b3o36bo249bo39b2o$2330b2o160bo39b2o286b2o$ 2493bo37b2o$2383b2o211b2o$2278bo103bobo211b2o$2277b3o87b3o3b3o8bo89b2o 5b2o$2276bo3bo86bo2bobo2bo98b2obobob2o$2276b2ob2o86b2obobob2o28bobo67b o2bobo2bo$2276b2ob2o86b2o5b2o29b2o67b3o3b3o$2259b2o144bo386b2o$2259b2o 15b2ob2o511bobo$2276b2ob2o511bo38bobo$2271b2o3bo3bo551b2o$2271b2o4b3o 89b2ob2o458bo$2278bo88bo2bobo2bo$2359b3o3bo3bo3bobo$2359bobo3bo3bo3b3o $2359bo2bobo2bo$2361b2ob2o50bo$2417b2o$2416b2o$2481b2o320b3o$2481b2o 320bo39bo$2252b3o3b3o98b2o5b2o186bo249bo39b2o$2252bo2bobo2bo98b2obobob 2o187b2o286b2o$2252b2obobob2o98bo2bobo2bo186b2o$2252b2o5b2o98b3o3b3o3$ 2389b2o$2389bobo35bobo$2254b2ob2o130bo38b2o$2252bo2bobo2bo167bo386b2o$ 2244b3o3bo3bo3bobo554bobo$2244bobo3bo3bo3b3o266b2o286bo$2244bo2bobo2bo 274bobo35bobo$2246b2ob2o50bo225bo38b2o$2302b2o262bo$2301b2o$2366b2o$ 2366b2o$2244b2o5b2o147b3o$2244b2obobob2o147bo$2244bo2bobo2bo148bo$ 2244b3o3b3o2$2538b3o36bo$2538bo39b2o$2312bobo224bo37b2o$2313b2o$2313bo $2676b3o$2412b2o262bo$2412bobo262bo$2412bo$2838b2o$2838bobo$2251b2o 585bo$2251b2o335bobo$2324bo264b2o$2325b2o262bo$2324b2o$2688b2o$2688bob o$2423b3o36bo225bo$2423bo39b2o$2424bo37b2o3$2600bo$2601b2o$2335bobo 262b2o$2336b2o$2336bo2$2435b2o$2435bobo$2435bo3$2900bobo$2901b2o$2901b o8$2872b3o$2872bo39bo$2873bo39b2o$2912b2o11$2634bobo$2635b2o$2635bo2$ 2734b2o$2734bobo$2469b3o262bo$2469bo$2470bo8$2745b3o$2481b2o262bo$ 2481bobo35bobo224bo$2481bo38b2o$2520bo2$2619b2o$2619bobo$2619bo10$ 2630b3o$2630bo$2631bo3$2768b3o$2768bo$2542bobo224bo$2543b2o444bo$2543b o386b2o56bobo$2930bobo$2642b2o286bo38bobo10b2o2bo5bo$2642bobo325b2o10b 2o5bo$2642bo327bo15b2o3b2o4$2986b2o3b2o$2554bo434bo$2555b2o429bo5bo$ 2554b2o$2941b3o44bobo$2941bo47bo$2653b3o36bo249bo34bobo$2653bo39b2o 282b2o$2654bo37b2o284bo3bo7bo$2981bobo5bobo$2850bo133bo3bo$2849b3o129b o2bo3bo2bo$2843b2o3bo3bo129bobo3bobo$2843b2o2bo5bo130b2ob2o$2847bo5bo 127b2ob2ob2ob2o$2848bo3bo128b2o2bobo2b2o$2982b3o3b3o$2665b2o181bo3bo 130bo5bo$2665bobo179bo5bo$2665bo181bo5bo$2848bo3bo$2849b3o137b2o$2850b o138b2o$2840bo$2838b2o$2839b2o114b2o7b3o$2954bo2bo4bo4bo$2843bo7bo102b o2bo4bo5bo$2735bo105b2ob2o3b2ob2o100bo3bo8bo$2676b3o55b3o218b2o8b2o$ 2676bo51b2o3bo3bo106bobobobo$2677bo50b2o2bo5bo103bo3bobo3bo102b2o8b2o$ 2732bo5bo103bo2b2ob2o2bo105bo8bo$2733bo3bo105b3o3b3o100b2o8bo5bo10b2o$ 2844bo5bo101bo9bo4bo11b2o$2733bo3bo89bobo126bo7b3o$2732bo5bo88b2o124bo 2bo$2732bo5bo89bo$2733bo3bo$2734b3o113b2o$2688b2o45bo114b2o$2688bobo$ 2688bo$2817bo7b2o$2816b2o6bo2bo$2728bo7bo78bo8bo2b2o$2620bo105b2ob2o3b 2ob2o77b2obo4bo2bo$2600bo18b3o195b3o6bo$2601b2o10b2o3bo3bo106bobobobo$ 2600b2o11b2o2bo5bo103bo3bobo3bo79b3o6bo$2617bo5bo103bo2b2ob2o2bo76bob 2obo4bo2bo$2618bo3bo105b3o3b3o76bo10bo2b2o11b2o$2729bo5bo77bo3bo6bo2bo 12b2o$2618bo3bo89bobo99b4o7b2o$2617bo5bo88b2o$2617bo5bo89bo$2618bo3bo$ 2619b3o113b2o$2573b2o45bo114b2o$2573bobo34bo$2573bo34b2o$2609b2o91bo7b 2o$2701b2o6bo2bo$2613bo7bo78bo8bo2b2o$2505bo105b2ob2o3b2ob2o77b2obo4bo 2bo$2504b3o195b3o6bo$2498b2o3bo3bo106bobobobo$2498b2o2bo5bo103bo3bobo 3bo79b3o6bo$2502bo5bo103bo2b2ob2o2bo76bob2obo4bo2bo$2503bo3bo105b3o3b 3o76bo10bo2b2o11b2o$2584b3o27bo5bo77bo3bo6bo2bo12b2o$2503bo3bo76bo12bo bo99b4o7b2o$2502bo5bo76bo11b2o$2502bo5bo89bo$2503bo3bo$2504b3o113b2o$ 2505bo114b2o3$2587bo7b2o$2586b2o6bo2bo$2498bo7bo78bo8bo2b2o$2496b2ob2o 3b2ob2o77b2obo4bo2bo$2587b3o6bo$2499bobobobo$2497bo3bobo3bo79b3o6bo$ 2497bo2b2ob2o2bo76bob2obo4bo2bo$2498b3o3b3o76bo10bo2b2o11b2o$2499bo5bo 77bo3bo6bo2bo12b2o$2584b4o7b2o4$2505b2o$2505b2o3$2472bo7b2o$2471b2o6bo 2bo$2470bo8bo2b2o$2471b2obo4bo2bo$2472b3o6bo2$2472b3o6bo$2469bob2obo4b o2bo$2468bo10bo2b2o11b2o$2468bo3bo6bo2bo12b2o$2469b4o7b2o! golly-2.5-src/Patterns/Life/Guns/gun-p165mwss.rle0000644000175100001440000000342212156145314016507 00000000000000#C p165 MWSS gun based on a three-gliders -> MWSS+glider+LoM reaction #C by Dietrich Leithner. David Bell and Jason Summers, 5/2002. #C From Jason Summers' "jslife" pattern collection. x = 178, y = 218, rule = B3/S23 125b3o$125bobo$125b3o6bo$125b3o5b3o$125b3o$125b3o$125bobo5b3o$125b3o$ 133bobo$133bobo$$133b3o$111boo6boo$110bobbo4bobbo$110bobbo4bobbo11b3o$ 110bobbo4bobbo12bo$111boo6boo$$137bobboo4boobbo$136bo3b3obb3o3bo$137bo bboo4boobbo7$139bo$139b3o4bobobbobo$138bob4obobbobbobboboo$120bobo23bo bobbobo$120boo$121bo$139b3o$139b3o$44b3o93bo$45bo94bo$45bo94bo$44b3o 92bobo$$44b3o$44b3o92bobo$140bo$44b3o93bo$45bo94bo$45bo93b3o$44b3o92b 3o$$51boo6boo$49bo4bobbo4bo$49bo4bobbo4bo$49bo4bobbo4bo4bo$51boo6boo5b 3o8bo$65bobobo6b3o$65bobobo5bobobo$66b3o6bobobo$67bo8b3o$77bo$$67bo$ 66b3o8bo$17bo47bobobo6b3o$16b3o46bobobo5bobobo$15bobobo46b3o6bobobo$ 15bobobo47bo8b3o$16b3o12bo45bo$17bo11boo$30boo$$17bo79b3o$16b3o80bo$ 15bobobo59bo18bo$15bobobo59bobo$16b3o49bo10boo$17bo49boo$67bobo$78b3o$ bbobbo4bobbo64bo$3obb6obb3o63bo$bbobbo4bobbo$$81boo$82boo$81bo$$48bo$ 46boo$47boo$58bobobbobo$54boobobbobbobboboo$58bobobbobo$$22b3o52b3o$$ 21bo3bo50bo3bo$21bo3bo50bo3bo$$22b3o52b3o$88b3o$88b3o$22b3o52b3o9bo$ 89bo$21bo3bo50bo3bo8bo$21bo3bo17bobo30bo3bo7bobo$44boo$22b3o19bo32b3o$ 88bobo$89bo$8bobboboobobbo69bo$8b4oboob4o69bo$8bobboboobobbo68b3o$37b oo6boo41b3o$35bo4bobbo4bo$35bo4bobbo4bo$35bo4bobbo4bo$37boo6boo$$51b3o 66boo$52bo66boo$52bo68bo$51b3o$$51b3o$38bobo10b3o$39boo$39bo11b3o$52bo $52bo$51b3o26$159bo$159b3o4bobobbobo$158bob4obobbobbobboboo$166bobobbo bo3$159b3o$159b3o$160bo$160bo$81bo78bo$79bobo77bobo$80boo$$159bobo$ 160bo$160bo$160bo$159b3o$159b3o23$117b3o$119bo$118bo$100boo6boo$99bobb o4bobbo$99bobbo4bobbo$99bobbo4bobbo$100boo6boo$114b3o$$113bo3bo$113bo 3bo$$114b3o3$114b3o$$113bo3bo$113bo3bo$$114b3o! golly-2.5-src/Patterns/Life/Guns/p690-PT-Cordership-gun.rle0000644000175100001440000001505612156145314020227 00000000000000#C 15-glider construction of a 3-engine Cordership. #C p690 gun shown; minimum repeat rate is 542 generations. #C Construction cleanup reaction found by Jason Summers. #C Paul Tooke, 19 January 2004 x = 517, y = 471, rule = B3/S23 115bo$106bo8b2o$105bobo2b2o4b2o$105bobo2b2o4b3o7b2o$106bo3b2o4b2o8b2o$ 115b2o62b2o$115bo63b2o$23b2o78b2o3b2o$23b2o78b2o3b2o2$105b3o116b2o$24b o80b3o115bobo$23bobo80bo23b2o90bo6b2o$22bo3bo86b2o14b2ob2o6b2o80bo2bo 2bo2bob2o$22b5o86b2o15bo2bo6b2o37bo42bo6b2o2b2o$21b2o3b2o102bo2bo44b3o 31b3o8bobo28b2o$22b5o73bobo28b2o44b5o42b2o28b2o$23b3o74bo3bo71b2o3b2o 29bobo$24bo65b2o12bo9b3ob3o10b2o78b5o$90b2o8bo4bo7bob2ob2obo8bo2bo27b 2o47b2o3b2o$104bo7b2o7b2o7bo2bo6b2o2b2o14b2ob2o6b2o37b2o3b2o$41b2o57bo 3bo8bob2ob2obo7b2ob2o6b2o2b2o15bo2bo6b2o5b3o73bo$31b2o7bobo15b2o40bobo 11b3ob3o9b2o29bo2bo13b3o46b2o2bobo20bo$31b2o6b2obo15b2o102b2o19b2o28bo 6b2o4b3obo3bo12b2o4bobo$40b2o141b2o26b2o7b2o3b2o6bo13b2o3b2ob2o$17b2o 22bo120b2o14b2o6b2o6b2o30bob5o18bo5bo$17bobo141bo2bo12bo2bo5b3o5b2o11b o2bo16b3o24bo$8b3ob2o4b3o20bo102b2o15bo2bo13b2o6b2o17bobo2bo40b2o3b2o$ 8b4o2bo4b3o18b2o102b2o14b2ob2o18b2o12b2o4b2o9bo12b3o33b2o$12b2o4b3o18b 2obo15b2o101b2o20b2o12b2o4b2o6bo14bob5o30bobo$17bobo20bobo15b2o143b2o 8b2o10b2o6bo13b2o5bo3b2o4b3o$17b2o22b2o162bobo18b3obo3bo12b2o4bob3o2bo 4b3o$207bo19b2o2bobo19bob2ob2o4b3o$186b2o66bo8bobo$186b2o75b2o$53b2o$ 54bo$54bobo8b2o119b3o$20b2o5b2o26b2o6bo2bo7bo111b3o70b2o$20b2o5b2o33bo 7b2o3bo177bo5b2o$62bo6bo5bo176b3o$62bo7b5o176bo3bo14bo$63bo2bo117b2o3b 2o60b2ob2o13b3o$65b2o118b5o78b5o$76b2o108b3o63b3o12b2o3b2o$77bo109bo 64b3o13b5o$77bobo8b2o84bo93bo3bo$78b2o7b3o83bobo93bobo$84bob2o9b2o73bo b2o94bo$84bo2bo4bo5bo67b2o3b2ob2o$84bob2o5bo72b2o4bob2o$87b3o3bo3bo75b obo70bo7b2ob2o10b2o$88b2o5bo78bo48b2o19b3o7b2ob2o10b2o$223bo19bo10b2ob 2o$210bo10bobo19b2o7bob2ob2obo$19b2obo3bob2o66b2o111bobo9b2o29b3o3b3o$ 19bo2bo3bo2bo67bo83b2o19b2o3b2o3bo40bo5bo$20b3o3b3o68bobo10bo69bo2bo 18b2o3b2o3bo27b3o$98b2o9b4o67bo7bo18b2o3bo27b3o$108b2obobo3b2o61bo2bo 3bobo19bobo27bo3bo$107b3obo2bo2b2o61b2ob2ob2ob2o19bo27bo5bo$108b2obobo 70bobo52bo3bo$109b4o70b2ob2o52b3o$110bo$130bo$20b2o108b3o119b2o5b2o$ 20b2o111bo118b2o5b2o$132b2o47b3o3b3o$180bo9bo$180bo3bobo3bo$14b2o165b 3o3b3o$14bobo165bo5bo$9b2o6bo223b2o$5b2obo2bo2bo2bo116b3o104b2o$5b2o2b 2o6bo115bo3bo$14bobo8b3o$14b2o116bo5bo$25bobo104b2o3b2o$24b5o$23b2o3b 2o$23b2o3b2o105bo92bo$134bobo89b3o$134bobo88bo$26bo109bo44b2o5b2o35b2o $27b2o107bo44b2o5b2o$133bo2bo86bo$29bo104b2o86b3o$221bo3bo$25bo2bo194b o$25b2o193bo5bo$220bo5bo$221bo3bo$222b3o4$228bo2bo$231bo7b3o23bo$227bo 9bo4bo21bobo$227b2o8bo5bo19bob2o$233bo8bo19b2ob2o10b2o$52b2o14bo7b2o 145b2o5b2o8b2o21bob2o10b2o$51bobo13b2o6bo2bo12b2o130b2o39bobo$50bo6b2o 7bo8bo2b2o11b2o137b2o8b2o23bo$41b2o7bo2bo2bo2bo7b2obo4bo2bo154bo8bo$ 41b2o7bo6b2o9b3o6bo149b2o8bo5bo10b2o$51bobo173bo9bo4bo11b2o$52b2o14b3o 6bo153bo7b3o19b3o$65bob2obo4bo2bo18b2o129bo2bo28b2ob2o$56b3o5bo10bo2b 2o11b2o4bobo160b2ob2o$56b3o5bo3bo6bo2bo12b2o5b3o159b5o$11b2o42bo3bo5b 4o7b2o21b2o158b2o3b2o$10bobo13b3o5b4o12b2o2bo5bo38b2o$9b3o4b2o8bo7b2ob o12b2o3bo3bo37bobo$2o6b3o4bo2bo7b2obo7bo18b3o39bo$2o7b3o4b2o10b2o5b2o$ 10bobo247b2o$11b2o15b2o5b2o58b2o3b2o$16bo9b2obo7bo57b2o3b2o$15bobo5b4o 7b2obo12b2o$14bo3bo4b6o5b4o12b2o45b3o162b2o$14b5o67bo10b3o162b2o$13b2o 3b2o66b2o10bo$14b5o58b2o2b2o4b2o$15b3o38b2o19b2o2b2o4b3o$16bo39b2o23b 2o4b2o$86b2o$86bo4$92b2o$74b2o16b2o$74b2o$15b2o$15b2o2$93bo5bo$92b3o3b 3o$91bo2b2ob2o2bo$91bo3bobo3bo$93bobobobo$72b2obob2o$90b2ob2o3b2ob2o$ 72bo5bo13bo7bo$63b2o$63b2o8b2ob2o$54b2o3bo6b2o7bo$54bobo3bo5b3o$55b5o 6b2o$56b3o4b2o$63b2o4$51b2o16b2o$51b2o16b2o$75b3o$74bo3bo13b2o5b2o$74b 2ob2o13b2o5b2o2$74b2ob2o$76bo$148bo$147bobo$147b2obo$69bo7bo69b2ob2o3b 2o$49b2o3b2o12bo2bo3bo2bo68b2obo4b2o$40bobo8b3o18bobo61b2o9bobo$40bo2b o6bo3bo17bobo60bobo10bo$31b2o10b2o6bobo18bobo60bo$31b2o8bo3b2o5bo15bo 2bo3bo2bo55b2o$36b2o5b2o24b3o3b3o$35bo4bo2bo$40bobo4$46b2o5bo$27b2o17b 2o4b3o$27b2o22b2ob2o2$50bobobobo12b2o5b2o$69b2o5b2o$51b2ob2o61bo$51b2o b2o60bobo$53bo60b2o3bo$114b2o3bo9b2o$28bo85b2o3bo9b2o$27b3o80b2o4bobo$ 26b5o78bobo5bo$25b2o3b2o77bo$20bo87b2o$19bobo$7b2o10b2obo$7b2o10b2ob2o 3b3o15b2obo3bob2o$19b2obo4b3o15bo2bo3bo2bo$19bobo24b3o3b3o$20bo4$22b2o 4b3o$22b2o3bo3bo$27b2ob2o$28bobo15b2o5b2o39bo$46b2o5b2o39b4o196b2o$28b obo64b4o195b2o$27b2ob2o63bo2bo5b2o$27bo3bo63b4o5b2o$28b3o54b2o7b4o$84b obo7bo$84bo206bobo$83b2o204bo4bo$289bo4bo7b2o$293b2o7b2o2$289b2o2b2o$ 289b2o2b2o$21b3o5b3o258bob3o$21bo2b2ob2o2bo261bo$22b3o3b3o261bo$23bo5b o$63bobo224b2o14bo$63bo2bo223bobo12b4o$66b2o237bob2o$64bo3b2o4b2o214bo 16b2o$66b2o6b2o215bobo$55b2o6bo2bo224bo$22b2o5b2o23bobo6bobo220b2o4bo 10b2o$22b2o5b2o23bo230bobo4bo10b3o$53b2o228bobo2bo14b3obo$284bo2bo14b 2ob4o$286bo16b3o2bo$37bo3bo242b2o4b2o12bob2obo$21b2o13bobobobo8b4o235b 2o14b3o$21bobo10b2o2bobo2b2o6bo2b2o6b2o216bobo23b3o$16b2o6bo9b2o7b2o7b o2b2o5b2o215bo3bo21bo2bo$12b2obo2bo2bo2bo9b2o2bobo2b2o7bo2bo228b2o20b 3o$12b2o2b2o6bo11bobobobo10b2o224bo5bo21bo$21bobo13bo3bo237bo6bo$21b2o 30b2o206bo12bo5b2o4bo$52bo2bo204bo11b3o11bo$35b2o15bo2b2o5b2o196b3o9b 5o5bo3bo$35b2o14bo2b2o6b2o207b3o8bo3bo$51b4o209b2o17bobo$267bo15b3o$ 264bo2bo$264bo2bo$27b3o234b3o$26bo3bo232bo$25bo5bo5bobo223bo$26bo3bo4b o3bo$27b3o5bo12b2o210b2o14bo$27b3o4bo4bo8b2o210bobo12b4o$35bo239bob2o$ 35bo3bo212b2o6bo16b2o$37bobo212b2o7bobo$261bo$262bo10b2o$262bo10b3o$ 273b3obo$272b2ob4o71b2o$273b3o2bo71b3o$260b2o12bob2obo72bo$260b2o14b3o 70bob3o$276b3o70b3ob2o$275bo2bo74bo$276b3o70bob2o$277bo71bo3bo$353b2o 3b2o$354bo3b2o$352b3o$352bo2$344bo$343bob2o$343bob2o10b2o$344b2o10bobo $355b2obo4b3o$356b2o$357bo2$343b3o$339b5ob2o$338bo2bo5bo14b2o$338b3ob 5o14bo$344b2o16b2o3$346b2o$346b2o14bo$358b2ob2o$361bo2bo$359bo6bo$359b o2bo3bo$360b4o2b3o$360bo2bo2b2o$338b2o22bo3bo$337b4o20bob3o$335b2ob2o 22b3o$337bo4bo20bo$336bo2b2ob2o$336b2o2bobo2bo$337bo2bobo2bo$338b2o3b 2o$338bo3bo$327b2o13bo$326bobo10b3o$325b2obo4b3o$326b2o$327bo$308b2o$ 308b2o2$332b2o$331bo$332b2o3$316b2o$316b2o14bo$328b2ob2o$331bo2bo$329b o6bo$329bo2bo3bo$330b4o2b3o$330bo2bo2b2o$332bo3bo$331bob3o$332b3o$333b o51$470b2o$470b2o6$457b3o10bobo$459bo10bobo5b2o$458bo9b4o6b2o$461bobo 4b2o$460b4o4b2o$459b2obo$459bo2bo$459bo3bo$460bo$462b2o5$467b2o$466bo 2bo11bo$469bo3bo6b3o$466b5o3bo5b3o$468bo6bo7b3o$469bo3b2o$469b2o2$457b 3o2$451bo5bo3bo43b2o$444b3o4bo6b4o43b2o$446bo14bo$443bo2bo$442bo2bo$ 435b2o7bo$434bob3o$433b2o3bo3bo5b2o$435bob2o2bo6b2o63b2o$431bo81b2o$ 430b2o$420b2o4b2o4bo$420b2o4bo2b2o$427b2o$428bo5$428b2o$428b2o7b2o$ 436bo2bo11bo$439bo3bo6b3o$436b5o3bo5b3o$438bo6bo7b3o$439bo3b2o$439b2o$ 510b2obo$510b2ob3o$516bo$510b2ob3o$511bobo$511bobo$512bo$487b2obo$487b 2ob3o$493bo$487b2ob3o$488bobo$488bobo$489bo6$451b2o$451b2o4$478b2obo$ 478b2ob3o$484bo$459b2o17b2ob3o$459b2o18bobo$479bobo$480bo! golly-2.5-src/Patterns/Life/Guns/pseudo-p34-gun.rle0000644000175100001440000001577512156145314017023 00000000000000#C Pseudo p34 gun based on two p102 Herschel factories. #C Karel Suhajda, 18 Apr 2003 -- from Jason Summers' "guns1j" #C collection, which now contains the smallest known glider gun of #C every period between 14 and 999. A separate "guns2j" collection #C contains a selection of small higher-period guns. #C Construction methods are known for glider guns of all periods above #C the minimum of 14, and also for true period guns above p61 #C -- the period of 'true' guns matches the period of the output, #C unlike pseudo-period guns such as this example. As of this #C writing [September 2006] true guns are unknown for 36 periods. #C It is quite possible that true guns exist for all these periods, #C but current search programs are unable to perform exhaustive #C searches for oscillators at anywhere near the periods neede to #C make direct glider generation possible. #C In general, prime period guns need more space than composite #C numbers, especially multiples of large powers of two or three; #C in the latter case, various doubling and counting mechanisms #C can be used. See p97307852711.rle in the Oscillators folder, #C which is trivial to convert to a prime-period gun. #C P34 traffic-light eater from Jason Summers' "jslife" collection. x = 243, y = 157, rule = B3/S23 185boboo$183b3obobbo9bo$182bo4boboo7b3o$178boobbooboobo8bo24bo$177bob 3o3bobbo8boo22bobo$155boo7bo12bo4boobboboo18bo12bob3o$154bobo7b3o9boob oobobobo4bo3bo12b3o9boo4bo$154bo12bo7bobbobobobbobboobobbobo14bo7bobb 5o$152boob4o7boo8bobo3boobobo3bobbobboboo9boo8bobbo3boo$151bobo4bo16b oobobo3boboboo4bobboboo18boobob3obbo$151boboboobboo8bo4bobboboboobobob o5bobbo15bo8boboboboo$150boobo3boobbo6bobobb3o3bobbobobobo5boo16bobob oobboobobbo$149bo3boboobbooboboobboo4bobbobobboboboo8bo11boobboo7bobob oo$150b3o4bo4boboo9boo4boobbo22boo9boobobo$152boboobob3o14bobo4bobo34b obobo$153bobooboo15bobbobobobboo33bobbo$176boo4bobo36boo$178b4obbo$ 115bo62bobbobo$101boo10b3o66bo40boo5boo$100bobbo8bo45bo63bobo5bo$99bob obo8boo43bobo62bo5bobo$99boboboo53boo61bo3bobboo$97boobobo3bo3bo43boo 64boo3bo$97bobbobboobobbobo41bobo22bo41bo5bo$94boobobobo4bobbobboboo 37bo5boo18boo39bo4bo$94bobboobboboo4bobboboo36boo5boo17boo41bo$95boo3b obbo5bobbo110bobo$97booboobbo4boo$97bo4boo7bo48boo8boo59boo$98b3obo57b o8boo25boo7boo17booboobbo$100bobo59bo8bo23bobo6bobbo14b3obob3obbo$101b o59b4o32bo5bobobo10boobo4bo4b3o$74bo85bo4bo37boboboo5boobbooboboobboob o$12bo47boo10b3o60boo23b5obo34boobobobbo3bobo6bobboo3boboo$11bobo45bo bbo8bo62bobo21boo3bobbo10boo22bobbo3b3o3bo8boobboobobo$9b3obo44bobobo 8boo15boo5boo37bo22bobb3oboboo5boobboo19boobobbobobbo15bo4bobo$8bo4boo 11bo31boboboo25bo5boo35boob4o18boobobobo7bobo23bobboo4boo7boo7b4oboo$ 8b5obbo8b3o29boobo4bo4bo19bobo39bobobobbo21bobboboobboobbo25boo4bobo8b o12bo$6boo6bo8bo32bobboboboo3bobo19boo39boboboobboo19boobobo35bobobobb o8b3o7bobo$5bobboboboboo7boo28boobobboo3bo4boobboo19boo34booboobboobbo 20boboboo7boo24bo4boo11bo7boo$5boobobobobbo37bobboobobboo9boo18bobo33b o3boboobboobo19bobobo8bo26b3obo$8bobboboo6bo14boo16boobbobobo31bo35b3o 4boo3bo20bobbo9b3o25bobo$8boobo3bo4bobo12bobo18b5obbo68boboobob3o22boo 12bo26bo$10boboboo5boobboo8bo20bo4boo4bo65bobo3bo$10bobobo10boobboobb oob4o17b3obo4bo$11bobbo14bobbobobobbo19bobo4b3o68bo$12boo17booboboobb oo18bo31b5obo38bo54boo$32boboobboobbo47b3oboboobo85boo5boo$5boo5boo18b oboboobboobo45bo4bo4b3o35bo47boo$6bo5boo19bo4boo3bo45boboobboboo3bo33b obo64bobo15boo$6bobo25b3obob3o47bobboo3boboo34boo66boo15bo$7boo6bo20bo 3bo50boobbobbobo9bo19boo8boo45boo15bo17bo$11b4o78bo4bobo10boo16bobo8bo bo12boo30boo32boo$10bob5o21bo54b4oboo10boo19bo3boo5bo12bobo23boo$11bo 26bo58bo37boo5boo13bo23boo$95bobo55b4oboo10b3o61boo$37bo57boo56bobbobo bo11bo61bobo$11bo24bobo112boo4boobo10bo25boo3bo33bo$10b3o23boo112bobb 4oboboo35boobooboo13boo12b4oboo$7bobobobobo24boo107boboobboboo3bo34bo 7bo12boo12bobbobobo$6boboo3boobo23bobo106bo4bo4b3o34boo6bo25boo4boobo$ 4b3o3bobo3bo18boo5bo107b3o3boobo37boobboo26bobb4oboboo$3bo3b3o4booboo 16boo5boo24bo42bo40bobobobo38boobboo25boboobboboo$3boobo3b3o4bo50b3o 38b3o41b3o72bo4bo4b3o$4boboobo5bobo7b3o43bo20boo14bo120b3o3b3obbo$4bo 5bobbo3boo8bo26boo14boo11boo6boo15boo86booboo30bobobobbo$bboob4ob4oboo bbo6bo27boo27boo8bo101bobobobo30b3o3boo$bobobobbo5bo3bo83b3o49bo23boo 16bobbobo$bo4bobb4o3boo109bo25bobo23bo19boboo$ooboobboo4b3o25bo6boo48b ooboboboo21boo24boo23bobo16boo3bo$3boboobb4obbo25bobo4boo51bobobbo20b oo21boo28boo13bobobbobo24b3o3bo$3o5bo3bo28boo9boo48bob3o42bobo43boobb ooboo23bo5boo$obb3obob3o40boo13bobobboo24boo20boo27bo5boo73bobb3o$bbo bbobobo57bobboobbo23bo4bo15bobbo25boo5boo74bo3b3o$boo67boobbo24bo20boo 82booboo19bo7bobo$6b3o59boobbobo20boo3bo102bobboobo19bobbo5bo$47boo47b o105bobo4bo21boo5boo$39bobo5boo44b3o6boboo17boo10bobo51boo12bob4oboo$ 7bo32boo51bo6b3oboo17bo12boo51boboo12bo4boboboo$6bobo31bo26bo3boo26bo 24b3o9bo51booboboo9bobbobboboboo$7boo57bobo3bo27b3oboo20bo43boo18boob oo6boobboo3bobo11bo$3boo61boo3bo30bobo64boo10b3o5boobboo6boboobboboobo 12bo$bbobo31boo32bo12boobboo13bobo4boo60bo12bo5bobo5boobo4bo4bo11b3o$ bbo5boo26bobo27b5obo10bo4bo14bo6bo70bobbo5b3o5bobob3obob3o$boo5boo28bo 27bo4boo11b4o8bo10b3o72boo16bo3b5o$34b4oboo26b3o11b3o3bobo4b3o10bo92bo 33boo5boo$34bobbo3bo27boboo4bo3bobbo3boo3bo104boboo32boo5bo$32boo5bobo 28bobo3bobo3bobo8boo103boobbo36bobo$31bobb3o4boo32bobobboboboo19boo94b oo36boo$21boo7boboo4boo3bo31bobboobo3bo5bo12bobo99bo28boo$20boo8bo3bob o3b3o33bobobbob3o4bobo11bo100bobo27bobo$22bo8b3o3boobo34boobobobobbo5b oobbooboobboob4o97boo28bo$5boo5boo19bobobobo35bobbo5boo9boobobbobobobb o84boo7boo$6bo5boo20b3o39boo4bobo15booboo4boo82bo7bobo$6bobo7bo18bo42b 5obo16bobob4obbo40bobo36bobo7bo5boo$7boo6bo62bo4bo17boboobobboobo40boo 36boo7boo5boo5b3o$11boobb3o54bo6b4o19bo4bo4bo40bo60bo20b5o$10bobo21bo 38bo29b3o3b3o95boo6bo17b3obob3o$11bo21bobo24b3o8b3o5boo24bobobo85bo11b o24bo4bo4bo$33boo25bobbo15boo25b3o85bobo12bo21boboobobboobo$11bo25boo 21bobbo130bobo11b4o19bobo3boobbo$11bo25bobo21bobbo128boob3o8bo4bo17boo bobbobboo$32boo5bo20boobbo96bo37bo7b5obo14bobbobo4bo$7bobo3bo18boo5boo 17b3obbo17bobo22bo55boo29boob3o6boobbobobo10boobboobboob4o$6boboobob3o 41boo3bo18boo22bobo53boo30boobo7bobboobobboo5boobboo8bo$4b3o4boo3bo15b oo16boobo3bobboo20bo22boo97boobobboo3bo3bobo12bobo$3bo3boboobboobo14bo bbo15boboo4b3o48boo89boo5bobboboboo4bo14boo$4booboobboobbo3boo10bobobo 73bobo68boo18bo6boobo4bo$5boboboobboo4boobboo5boobobo61bo6boo5bo67bobo 16bobo8boboboo7boo$5bobobobbo10bobo4bo3boboo59boo5boo5boo66bo18boo9bob obo8bo$6boob4o11bo6boobobbo58bobo79boo10bo19bobbo9b3o$8bo21bobbobobob oo147booboo18boo12bo$8bobo10boo7boobobobobbo22boo38boo84bobbo$9boo11bo 8bo6boo22bobbo38bo78bo6boo$19b3o9bob5o23bobobo36bo79bo$19bo9boobo4bo 23boboboo9boo22b4o78b3o$29bobbob3o22boobo4bo4boobboo21bo4bo$31boobo24b obboboboo3bobo24bob5o$56boobobboo3bo4bo13boo10bobo4boo82bo$56bobboobo bboo19boobboo5boo5bobbo70bo9bobo$57boobbobobo8boo14bobo4bobboboboboo 71boo7bobo$59b5obo8bo16bo5b3obobbo73boo9bo$59bo4boboo7b3o19bo3boboo69b oo17boo$60b3obobbo9bo10boo7boobobo70bobo17bobo$62boboo23bo8bobobo70bo 21bo$86b3o9bobbo70boo21boo$86bo12boo$$186bobo$187boo$187bo6$195bo$196b oo$195boo7$203bobo$204boo$204bo$$214b3o$$212bo5bo$212bo5bo$212bo5bo$$ 214b3o! golly-2.5-src/Patterns/Life/Guns/vacuum-cleaner.rle0000644000175100001440000000242712156145314017226 00000000000000#C Double p46 gun found by Dieter Leithner pulls blocks and beehives #C Dean Hickerson, 2/21/97; from Jason Summers' "jslife" collection x = 90, y = 97, rule = B3/S23 boo23boo$boo23bo$24bobo$6bo3boo12boo36boo5boo$oobboobob3o50boo5boo$oo bbo4b3o$4bo3bo$5b3o$44boo$5b3o36boo$4bo3bo$oobbo4b3o25boo$oobboobob3o 25bobo5boo$6bo3boo25boboo4boo$21boo15boo$boo35bo$boo20bo$23bobo12bo23b oo5boo$20bo17boo21bobbo3bobbo$20bo5bo10boboo4boo17booboo$20bo5bo10bobo 5boo16bobobobo$22bo3bo10boo24bobobobo$22bo38bo9bo$22bobbo18boo14bo11bo $22b3o19boo$65bobo$62bo9bo$62bo3bo5boo$32bo31b3o6bo$28boobbo34booboo$ 27bo5bo13boo$26boobbobo14boo$27boo3bo$28b3o34bo7bo$41boo3boo18bobobobo $28b3o9bobbobobbo17bobobobo$27boo3bo6bo9bo15bobooboobo$26boobbobo5boo 9boo14boo5boo$27bo5bo5bo9bo5bo$16boo10boobbo7bobbobobbo5bo$15bobo14bo 8boo3boo6b3o$15bo$14boo$$28bo5bo22boo$26bobo3bobo21b4o$27boo4boo20bobb obo$54bobobboo$53bobo$52boo$43bo8b3o10boo5boo$43bobo7bobo9boo5boo$43b oo9boo$$63boo$39bo5bo16b4o7boo$40bo5bo14bobobo6bobboo11boo$38b3o3b3o7b oo5boob3o4b6o11boo$54boo8boobo5b4o$64boobo$$64boobo$64boobo5b4o$30boo 31bobbo4b6o11boo$29bobo32boo6bobboo11boo$29bo34boo7boo$28boo9boo$40bo 10bo5bo$37b3o9bobo3bobo$37bo12boo4boo$62bo$61bobo$61bobo$62bo5$64boo$ 64boo$$67boo4bo$67boo3bobo$72bobo$73bo5$75boo$75boo$$78boo$78boo$$81b oo$81boo! golly-2.5-src/Patterns/Life/Methuselahs/0000755000175100001440000000000012156146015015233 500000000000000golly-2.5-src/Patterns/Life/Methuselahs/acorn.lif0000644000175100001440000000020012156145314016742 00000000000000#Life 1.05 #D Acorn #D The most vigorously growing 7-cell methuselah pattern. #D Found by Charles Corderman. #P .* ...* **..*** golly-2.5-src/Patterns/Life/Methuselahs/ark1.rle0000644000175100001440000000022412156145314016514 00000000000000# ark1 -- 16 cells, stabilizes at 736692 gens, found by Nick Gotts. x = 32, y = 29, rule = B3/S23 27bo$28bo$29bo$28bo$27bo$29b3o20$oo$bbo$bbo$3b4o! golly-2.5-src/Patterns/Life/Methuselahs/ark2.rle0000644000175100001440000000024112156145314016514 00000000000000# ark2 -- 19 cells, stabilizes at 8120878 gens, found by Nick Gotts. x = 53, y = 44, rule = B3/S23 50b3o28$12bo$12bo$13boo$15bo$15bo$15bo$15bo6$oo$bbo$bbo$3b4o! golly-2.5-src/Patterns/Life/Methuselahs/blom.rle0000644000175100001440000000034412156145314016612 00000000000000#C Blom. Runs for 23314 gens. Initial pop = 13. Final pop = 2740. #C Found by Dean Hickerson, 7 July 2002 #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 12, y = 5, rule = B3/S23 o10bo$b4o6bo$2b2o7bo$10bo$8bobo! golly-2.5-src/Patterns/Life/Methuselahs/iwona.rle0000644000175100001440000000043112156145314016773 00000000000000#C Iwona. #C Runs for 28786 gens. Initial pop = 19. Final pop = 3091. #C Gliders = 47. Found by Andrew Okrasinski, 20 August 2004 #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 20, y = 21, rule = B3/S23 14b3o6$2bo$3b2o$3bo14bo$18bo$18bo$19bo$18b2o$7b2o$8bo5$2o$bo! golly-2.5-src/Patterns/Life/Methuselahs/justyna.rle0000644000175100001440000000044412156145314017357 00000000000000#C Justyna. #C Runs for 26458 gens. Initial pop = 20. Final pop = 3548/3546. #C Gliders = 43. Found by Andrew Okrasinski, 30 May 2004 #C See also http://www.math.ucdavis.edu/~dean/RLE/methuselahs.html x = 22, y = 17, rule = B3/S23 17bo$16bo2bo$17b3o$17bo2bo2$2o16bo$bo16bo$18bo8$19b3o$11b3o! golly-2.5-src/Patterns/Life/Methuselahs/lidka-predecessor.rle0000644000175100001440000000050112156145314021254 00000000000000#C 2-gen predecessor of Lidka. Runs for 29055 gens. #C Initial pop = 13. Final pop = 1625/1623. Gliders = 28. #C Found by David Bell, 15 July 2005 #C Lidka found by Andrzej Okrasinski, 13 July 2005 #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 9, y = 15, rule = B3/S23 bo$obo$bo8$8bo$6bobo$5boobo$$4b3o! golly-2.5-src/Patterns/Life/Methuselahs/natural-LWSS.rle0000644000175100001440000000052512156145314020116 00000000000000#C Runs for 23334 gens. Initial pop = 12. Final pops = 2898/2895 #C May be the longest-lived 12-cell pattern within a 12x12 square. #C Emits a LWSS in gen 13811. #C See also http://www.radicaleye.com/DRH/methuselahs.html #C Found by Tomas G. Rokicki, some time before Feb 21, 2005. x = 8, y = 5, rule = B3/S23 4b3o$3bo$o5bo$b2o2bobo$bobo! golly-2.5-src/Patterns/Life/Methuselahs/rabbits.lif0000644000175100001440000000060012156145314017272 00000000000000#Life 1.05 #D Rabbits #D Another small but vigorously growing population -- #D 9 cells in a 7x3 rectangle; runs for 17331 generations. #D (If you look closely you can see a male and female rabbit!) #D Gens 4760-5165 include a rather rare 16-bit still-life #D called a "scorpion". Andrew Trevorrow discovered Rabbits #D in 1986 using a Methuselah search program. #P *...*** ***..* .* golly-2.5-src/Patterns/Life/Methuselahs/rabbits-relation-17423.rle0000644000175100001440000000050112156145314021573 00000000000000#C Rabbits relative. #C Runs for 17423 gens. Initial pop = 10. Final pop = 1749. #C May be the longest-lived 10-cell pattern within a 10x10 square. #C Found by Tomas G. Rokicki, some time before Feb 21, 2005. #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 6, y = 6, rule = B3/S23 bo$2obo$4b2o$o2bo$o$o! golly-2.5-src/Patterns/Life/Methuselahs/rabbits-relation-17465.rle0000644000175100001440000000050012156145314021600 00000000000000#C Rabbits relative. #C Runs for 17465 gens. Initial pop = 11. Final pop = 1749. #C May be the longest-lived 11-cell pattern within a 11x11 square. #C Found by Tomas G. Rokicki, some time before Feb 21, 2005. #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 6, y = 4, rule = B3/S23 ob3o$o4bo$obobo$bo2bo!golly-2.5-src/Patterns/Life/Methuselahs/temp-pulsars-big-s.rle0000644000175100001440000000075612156145314021323 00000000000000#C Runs for 21035 gens. Initial pop = 32. Final pop = 2570. #C Final census includes a 'big S' (a 14-cell still-life), which forms #C in gen 20040 from a collision between a pi-heptomino and a boat. #C The pattern also produces 2 temporary pulsars, one in gens 10105 to 10153, #C the other in gens 10338 to 10735. Found by Paul Callahan, 1997. #C See also http://www.radicaleye.com/DRH/methuselahs.html x = 8, y = 8, rule = B3/S23 obo3b2o$3ob2o$obobobo$3bo3bo$o2bob2o$obo4bo$3o2b3o$2o3bobo! golly-2.5-src/Patterns/Life/Miscellaneous/0000755000175100001440000000000012156146015015554 500000000000000golly-2.5-src/Patterns/Life/Miscellaneous/blockstacker.rle0000644000175100001440000005222312156145314020654 00000000000000#C Blockstacker #C Builds an infinite line of blocks, growing at the rate of 3c/126. #C Jason Summers, 28-Aug-1999 -- from "jslife" pattern collection x = 531, y = 915, rule = B3/S23 5boo$5boo$$5bo$4bobo$4bobo83boo$5bo84boo$17bo$17bo73bo$bbooboboo7b3o 71bobo$bbo5bo81bobo$3bo3bo83bo$4b3o9b3o60bo$17bo61bo$17bo60b3o7boobob oo$17bo70bo5bo$17bo71bo3bo$16b3o59b3o9b3o$79bo$7bo71bo$8bo7b3o60bo$6b 3o8bo61bo$17bo60b3o$$89bo$15boo61b3o7bo$b5o9boobo60bo8b3o$ob3obo10bo 61bo$bo3bo7b3o$bb3o9boo$3bo76boo37boo$78boboo9b5o22boo$79bo10bob3obo$ 81b3o7bo3bo$3boo76boo9b3o$3boo88bo24b3o$11bo104bobboo$8b4o5bo102bo$7b 4o4boobboo$7bobbo81boo22booboo3bo$7b4o81boo24b3ob4o$bboo4b4o73bo33bobb oobo$bobo7bo67bo5b4o33b3o$bo74boobboo4b4o32b3o$oo16boo3boo61bobbo33boo $18bo5bo61b4o$85b4o4boo$19bo3bo61bo7bobo$20b3o72bo$72boo3boo16boo$72bo 5bo$$73bo3bo$74b3o$120b3o$21boo96bobbo$21boo99bo$40bo81bo$40b3o76bobo$ 43bo$42boo30boo$74boo4$44b3o$$44bobo104bo$43b5o104bo$42boo3boo101b3o$ 42boo3boo6$42boo$43bo$40b3o10boo$40bo4bo7bobbo$44bo3boo7bo16bo$44bo5bo 6bo17boo$45b5o7bo16boo$53bobbo$53boo$72bo$62bo10boo$61bobo8boo$60bo3bo $60bo3bo$60bo3bo52b3o$60bo3bo51bobbo$60bo3bo54bo$60bo3bo50bo3bo$61bobo 51bo3bo$62bo56bo$116bobo3$124bo$123b3o$123boboo$124b3o56bo$124b3o54bob o$124boo56boo10$120b3o$120bobbo$120bo$120bo$121bobo$76boo$76boo$$139b oo$139boo5$140bo$88bo49booboo$87b3o$73boo3boo6booboo46bo5bo$75b3o7b3ob 3o$74bo3bo6b3ob3o45booboboo$75bobo7b3ob3o68boo$76bo8b3ob3o68bo$86boob oo62bo4bobo53bo$87b3o62bobo3boo55bo$88bo62bo3boo56b3o$151bo3boo$73b3o 75bo3boo$79bobo70bobo$73bobo4boo71bo$72b5o3bo76boo$71boo3boo79boo$71b oo3boo$146bobo9bo$145booboo7bobo$74bo12bo56boobb3o6bobo$72boo14boo53b oo3boo8bo365boo$87boo28b3o24boo378boo$71bo45bobbo$92boo23bo37booboboo$ 72bobbo16bobo22bo3bo33bo5bo363bo$74boo17bo23bo3bo34bo3bo278boo83b3o$ 80boo35bo35bo3b3o279boo82bo3bo$80bobo20bo14bobo23bo7boo371bo$83bo20bo 39bo7bobo358bo8bo5bo$80bobbo18b3o334bo72b3o7bo5bo$83bo40bo19bo293b3o 70bobobo7bo3bo$73boo5bobo40b3o17bobo291bo3bo69bobobo8b3o$72bobo5boo40b oobo313bo72b3o$72bo49b3o18b3o290bo5bo8bo61bo$71boo49b3o31bo279bo5bo7b 3o$123boo31bo280bo3bo7bobobo$91b3o49b3o9bobo280b3o8bobobo59bo9bo$90bo 3bo59booboo291b3o59b3o$89bo5bo47bobo7bo5bo291bo59bobobo$90bo3bo49bo11b o354bobobo7bo$91b3o59boo3boo352b3o8bobo$91b3o50bo296bo9bo61bo9boo$144b o101bo203b3o$157bo86bobo202bobobo$157bo87boo194bo7bobobo$92boo26b3o35b o280bobo8b3o71boo3boo$92boo8boo15bobbo317boo9bo64bo$102boo18bo392bo9bo 3bo$122bo32boo358b3o8b3o$119bobo24boo7boo369b3o$146boo286boo3boo$448bo $435bo3bo9bo$436b3o8b3o$101b3o332b3o69bo17boo$100bo3bo395bobo5bobo15b oo$500boo6boo8boo$99bo5bo40b3o352bo8b4o4b3o$81boo16boo3boo39bo3bo361b 4o5boobo$82bo354boo17bo52bobo3bo4bobbo$82bobo7bo51bo5bo286boo15bobo5bo bo49bo5boobo$83boo4b4o51boo3boo16boo276boo8boo6boo53b3o6boo$88b4o75bo 276b3o4b4o8bo54boo7bobo$88bobbo65bo7bobo273boboo5b4o75bo$88b4o4boobboo 55b4o4boo274bobbo4bo3bobo50booboboo16boo$89b4o5bo59b4o279boboo5bo55bo 5bo$92bo65bobbo249bo24boo6b3o60bo3bo$84boo62boobboo4b4o248bobo22bobo7b oo61b3o$84boo65bo5b4o249bobo22bo$157bo253bo22boo16booboboo$164boo286bo 5bo$164boo287bo3bo$84bo18bo350b3o$83b3o9boo6boo$82bo3bo7bobo5bobo$81bo b3obo8bo49bo18bo342boo$82b5o58boo6boo9b3o110bo230boo$145bobo5bobo7bo3b o110bo211bo$153bo8bob3obo107b3o209b3o$163b5o319bo$98bo356boo30boo$87b 3o8bo312b3o41boo$89bo7b3o310bobbo$88bo62bo261bo$151bo8b3o246bo3bo$97b 3o50b3o7bo22boo224bo3bo$98bo62bo21boo228bo70b3o$98bo311bobo70bo3bo$98b o51b3o$98bo52bo330bo5bo$85b3o9b3o51bo116boo136bo75boo3boo$84bo3bo62bo 116boo135b3o$83bo5bo61bo253boboo$83booboboo7b3o50b3o9b3o29b3o209b3o$ 98bo62bo3bo17bo203bo18b3o$98bo61bo5bo15b3o8bo3bo188bo19boo$86bo63b3o7b ooboboo14b5o7bo3bo188b3o98boo$85bobo63bo28boo3boo300bo$85bobo63bo42b3o 59b3o217boo10b3o$86bo76bo105bo205bobo12bo$162bobo90bo3bo8b3o203bo6boo bboo$86boo74bobo17b3o9b3o58bo3bo7b5o202bobbobbobboboo$86boo75bo18b3o 81boo3boo201bo6boo$193bo3bo58b3o216bobo$162boo17bo11bo3bo278boo$70boo 48b3o39boo16bobo225b3o$70boo48bobbo55bo3bo10b3o59b3o9b3o137bobbo56bo$ 120bo59b3o85b3o137bo59bo$120bo57boo3boo4bo65bo3bo148bo58bobo$121bobo 63bobo65bo3bo11bo137bobo56bo$188boo80bobo195bo$70bo185b3o10bo3bo35bo 158bo$68booboo197b3o34bobo158bo$194boo67bo4boo3boo33boo157bobo$67bo5bo 120boobboo63bobo202bo$263boo175bobo25bo$67booboboo7b3o112bobbo240boo$ 81bobo357bo$81b3o112boo59boo$68bo12b3o97boo70boobboo$68bobbo9b3o97boo 259bobo$68bo12b3o103bobo63bobbo185boo$71boo8bobo103bobbo252bo$72bo8b3o 106boo63boo$70bobo115bo3boo76boo$70boo118boo78boo$180boo5bobbo72bobo$ 179bobo5bobo72bobbo$65boo3boo107bo19bo61boo$65bo5bo106boo18b3o58boo3bo 90bo$78bo118b5o59boo92bobo$66bo3bo5bobo5bobo109bobobobo59bobbo5boo82b oo$67b3o7boo6boo109boo3boo60bobo5bobo$85bo167bo19bo$252b3o18boo$199bo 51b5o$198bobo49bobobobo$198bobo49boo3boo$199bo$68boo129boo252boo$68boo 129boo52bo199boo$77boo38b3o79boo51bobo156b3o$76bo3bo36bobbo97bo33bobo 135boo19bobbo$75bo5bo35bo100b3o32bo136boo19bo$75bo3boboo34bo3bo99bo30b oo157bo3bo$75bo5bo4bo30bo3bo98boo30boo86bo70bo3bo$67boo7bo3bo4bobo29bo 115bo18boo87bo69bo$66bobo8boo5bo3bo29bobo113boo103b3o70bobo$66bo18b3o 135boo8boo155bo$65boo16boo3boo250bo49bo60booboboo$124bo215boo47bobo14b o34b3o$123b3o213bobo46booboo12b3o33bobo7bo5bo$122boobo94boo3boo5bo154b o5bo10boobo33b3o$122b3o17boo76boo3boo6bo156bo13b3o34b3o8booboo$122b3o 17boo87b3o135boo16boo3boo10b3o34b3o10bo$123boo97b3o145bo34boo34b3o$ 143bo78b3o145bobo5bo62bobo$142bobo78bo147boo3bobo62b3o$142bobo230bobo$ 143bo230bobbo$86boo287bobo73bo$86boo132boo154bobo70boo4b3o$95boo43boob oboo74bo156bo71boobbo3bo$95boo43bo5bo71b3o12boo137boo$141bo3bo72bo13bo bo137boo79bo5bo$120b3o19b3o18boo57boo7b3o4boo168b3o42boo3boo$119bobbo 40bo58boo6b3o4boobo166bobbo$122bo31boo5bobo67b3o138bo37bo$122bo30b3o5b oo69bobo136b3o36bo31bobo11bo$94b3o22bobo28boboo79boo135bo3bo9boo21bobo 32boo11bobo$150bobbo218bo70bo11bobo$94bobo53boboo215bo5bo7bo73bo$93b5o 55b3o83b3o127bo5bo60boo19bo$92boo3boo55boo83bobo128bo3bo9bobo49boo16bo bbo$74boo16boo3boo61boo77b3o129b3o10boo69boo$75bo84boo77b3o208boo$75bo bo6bo154b3o134boo71bo3bo$76boo4bobo154b3o135boo6b3o60bo5bo$80boo157bob o66boo66bo8b3o60bo3bobbo$80boo157b3o67boo75bo61bo$80boo213bo12bo77bo 62bo3bo3bo$82bobo209bobo89bo63boo3boobo$84bo209bobo88bobo70bo$77boo67b oo147bo162boo$77boo67boo6bo219bo$153boo3boo3boo208b3o9bobo$153bobo217b 3o10bo48boo3boo$77bo81bo3bo222bo50b3o$76bobo68bo12b3o208boo3boo8bo49bo 3bo$75bo3bo9boo55b3o11b3o208boo3boo7b3o49bobo$75b5o9boo54bobobo235b3o 50bo$74boo3boo7boo55bobobo262bo$75b5o9bobo54b3o10bo214bo37bobo$76b3o 10boo56bo10b3o212bobo36boo$77bo12bo66bo3bo210boo63boo$159bo212boo53boo 8boo$81boo64bo8bo5bo209b3o52boo$80bobo8bo54b3o7bo5bo210bobo$82bo7b3o 52bobobo7bo3bo212boo7boo$145bobobo8b3o222boo$146b3o93boo$90b3o54bo94b oo$$90bobo$90bobo334b3o$78b3o345bo3bo$77bo3bo8b3o200bo131bo5bo$254bo 39boo21boo63b3o27boo11booboboo16boo$76bo5bo75boo94bo38boo22boo62bo3bo 25boo35bo$76boo3boo7b3o65boo81b3o9b3o124bo5bo26bo23boo7bobo$91bo148bo 3bo117boo16booboboo11boo37b3o6boo$239bo5bo45bo71bo35boo32bo5boobo$79bo 159booboboo7b3o36boo25boo42bobo7boo23bo29bobo3bo4bobbo$78bobo173bo36b oo71boo6b3o55b4o5boobo$78bobo173bo41b3o70boboo5bo51b3o4b3o$78bo163bo 11bo41bo72bobbo4bo3bobo53boo$78bo162bobo10bo42bo71boboo5b4o45bo17boo$ 78bobbo159bobo9b3o59boo3boo50b3o4b3o45bo17boo$5boo72boo160boo73b5o52b oo52bo$3bobbo233bo75booboo17boo25boo17bo$239b3o11b3o60booboo17bo26boo 17bo$bbo235bo3bo11bo62b3o6bo9bobo45bo$237bob3obo10bo35bo34bobo8boo107b 3o$3boo85boo146b5o4bo41b3o32boboo106b3o8b3o$5bo84bobbo154boo39boboo30b ooboo106bo9bo3bo$17bo229boo5boo34b3o31boboo36b3o41b3o24bo$16bobo75bo 159boo34b3o32bobo36b3o8b3o30bobbo31boo3boo$bboo3boo281boo34bo36bo3bo9b o30bo$bboo3boo83boo241boo39bo31bo$3b5o8b3o72bo224boo17boo25boo3boo40bo bo$4bobo9b3o60bo237b4o111bo9boo$17bo60bobo219bo17boobo109b3o8bobo$4b3o 81boo3boo204b3o128bobobo7bo$88boo3boo204boboo65boo9bo50bobobo$17bo60b 3o8b5o146boo58b3o64bobo8b3o50b3o$16b3o59b3o9bobo147boo58boo67bo7bobobo 50bo9bo$16b3o60bo167bo129bobobo$90b3o154b4o76boo7bo41b3o$8bo239b4o74b oo7b3o31bo9bo52bo$9bo6bobo60bo168bobbo76bo5b5o92b3o$7b3o7bo60b3o167b4o 81boo3boo90bobobo8b3o$3bo74b3o158boo6b4o71bo56bo50bobobo7bo3bo$bb3o 233bobo6bo73bobo54b3o50b3o7bo5bo$b5o82bo149bo18b3o73boo31b3o8bobobo50b o8bo5bo$oo3boo71bobo6bo149boo17bo3bo71bo32bo3bo7bobobo62bo$79bo7b3o 231b3o11bo28bo5bo7b3o61bo3bo$16bo76bo161bo5bo59b3o8bobbo28bo5bo8bo63b 3o$14bobo75b3o160boo3boo60bo9booboo30bo76bo$bb3o10boo74b5o238boo29bo3b o$bb3o85boo3boo269b3o$258bo63bo44bo75boo$22bo57bo176bobo61b3o7boo3boo 105boo$3boo17bo57bobo174bobo61b3o7boo3boo$3boo17bo57boo10b3o162bo74b5o 30boo$8bo83b3o162bo75bobo31boo90boo$7bobo247bobbo60bobo135boo$6boboo 64bo183boo8boo52bo10b3o$5booboo64bo17boo174boo$6boboo64bo17boo$bboo3bo bo78bo223boo$bobo4bo78bobo222boo146bo$bo85boobo26b3o291b3o34bo11bo$oo 35bobo47booboo25bobbo146b3o63boo76bobbo33bo10bobo$18boo3boo13boo47boob o26bo149b3o63boo76bo46booboo$19b5o14bo48bobo3boo22bo3bo144bo3bo140bo3b o32bo8bo5bo$19booboo64bo4bobo21bo3bo190b3o96bo3bo31bobo10bo$19booboo 71bo21bo147boo3boo40b3o96bo45boo3boo$20b3o34bobo35boo21bobo190bo3bo96b obo32b3o$57boo13boo3boo168boo$58bo14b5o170bo61boo3boo142b4o$73booboo 46bo123bobo4bo150bo40b3o8boobbo$73booboo45b3o123b3ob4o76boo70b3o50boob o$74b3o45boobo125booboboo75bo70boobo39bobo$21boo99b3o126bobbob3o36b3o 28bo4bobo70b3o41bo10boo$21boo99b3o127boboboo37bobbo26b4ob3o71b3o52bo$ 40bo82boo128b4o38bo28booboboo74boo41bo$40b3o212bo39bo3bo23b3obobbo117b o$43bo206boo43bo3bo24boobobo129booboboo$42boo30boo174boo43bo29b4o124bo 5bo5bo$74boo174boo44bobo27bo125bo7bo3bo$250bo8booboo66boo120b3o6b3o$ 249bobo6bo3bobo65boo$44b3o202bobo6bo3bobbo24bo39boo$44b3o203bo7bobo4bo 23b3o26booboo8bo$43bo3bo215b3o22boobo25bobo3bo6bobo$120b3o165b3o25bobb o3bo6bobo75b3o$42boo3boo70bobbo124boo3boo34b3o25bo4bobo7bo75bobbo$122b o124bobobobo35boo25b3o91bo32bo$122bo125b5o157bo32bo17boo$119bobo127b3o 3boo71boo3boo72bobo33bo17boo$250bo3bobo71bobobobo117bo$256bo43bo28b5o 117bobo$299b3o23boo3b3o116boo3bo$264bo33boobo23bobo3bo117boo3bo$42boo 220bo33b3o24bo105bo17boo3bo$43bo219bobo33boo128boo13bo6bobo8boo$40b3o 11bo209bo52bo112boo10booboo5bo9bobo$40bo13b4o206bo52bo146bo$44boo9b4o 192b3o10bo51bobo122bo5bo16boo$44boo9bobbo191booboo9bo52bo$49bo5b4o191b ooboo8bobo51bo123booboboo$49bo4b4o192b5o9bo52bo10b3o$54bo194boo3boo8bo 52bo9booboo55boo$61b3o252bobo8booboo55boo$60bo3bo252bo9b5o$60bo3bo252b o8boo3boo$61b3o323bo$250boo134b3o$385bo3bo$387bo55boo$330boo52bo5bo52b oo$61b3o188boo130bo5bo43boo$60bo3bo187boo131bo3bo44boo$60bo3bo321b3o$ 61b3o264boo36boo$328boo37bo$367bobo5boo$368boo5bobbo$379bo$379bo54b3o$ 379bo53bo3bo$375bobbo$97bobo275boo55bo5bo$98boo269boo61boo3boo16boo$ 98bo270boo84bo$249boo194bo7bobo$249boo132bo6b3o52b4o4boo$95bobo285boo 7bo53b4o$96boo269boo13bobo6bo54bobbo$96bo151b3o184bobobboo4b4o$248b3o 175boo7bo3bo5b4o$425boo6boo10bo$427bo5b3o16boo$260b3o103boo3boo61bo17b oo$246boo3boo114b5o3boo$247b5o7bo3bo103booboo4boo$248b3o8bo3bo103boob oo3bo$76boo171bo118b3o82bo$76boo182b3o120bo57boo9b3o$382b3o56bobo7bo3b o$139boo240b5o55bo8bob3obo$139boo119b3o188b5o$370b3o$259bo3bo106b3o$ 250bo8bo3bo105bo3bo$88bo50b3o109boo115bo5bo64bo$87b3o49b3o108boo8b3o 106bo3bo65bo8b3o$75b3o8bobobo47bo3bo227b3o8b5o52b3o7bo$74bo3bo7bobobo 46bo5bo238b3o64bo$73bo5bo7b3o48bo3bo240bo$73bo5bo8bo50b3o296b3o$76bo 167boo3boo9boo38bo138bo$74bo3bo81boo84b3o10booboboo33b3o137bo$75b3o10b o71bo84bo3bo12bobobo32boboo136bo$76bo10b3o61boo5bobo85bobo10bo6bo33b3o 136bo$86bobobo59bobo5boo87bo6bobo4bo3bo34boo136b3o9b3o$86bobobo58bo 104bobobobo188bo3bo$73b3o11b3o59bobbo218boo75bo5bo$73b3o12bo60bo221boo 65b3o7booboboo$72bo3bo73bobo94boo190bo$80bobo68boo94boo190bo$71boo3boo 3boo74boo95bobo5bo188bo$81bo75bobbo92bobbo3bobbo186bobo$252boo6bo189bo bo$136boo23bo88boo3bo3bo3boo186bo$87boo47bobo5boo106boo$87boobboo43bo 6boo14boo85boo5bobbo193boo$91boo52bo12bo86bobo6bobo193boo72boo$90boo 153bo277bobbo$89boo153boo16boo3boo257bo$89boo64boo3boo100bobobobo257bo $74boo79boo3boo101b5o256bobo$74boo76bo3b5o103b3o172boo83bobo$80boo69b oo4bobo105bo55boo115bobbo83bo$80b3o68bobo167boo115bo$82boobo71b3o278bo 74bo$82bobbo352bobo71b3o7boo3boo$82boobo58bo293bobo81bo5bo$73boo5b3o 60b3o293bo$72bobo5boo60booboo365b3o8bo3bo$72bo68b3ob3o8bo108boo184bo 72b3o$71boo18b3o47b3ob3o7bobo107boo144b3o22boo3boo7b3o59bobo$90bo3bo 46b3ob3o6bo3bo115boo135bobbo21bo5bo69bobo$89bo5bo45b3ob3o7b3o116boo43b ooboboo85bo$89booboboo46booboo6boo3boo251bo3bo21bo3bo8b3o59b3o$143b3o 173bo5bo16boo67bo3bo22b3o$144bo197bo68bo38bobo$92bo180b3o44booboo5bo9b obo69bobo35bobo59b3o7bo$91bobo179b3o46bo6bobo8boo171bo8bobo$91bobo178b o3bo50boo3bo117b3o69boo$92bo31bo146bo5bo49boo3bo73bo$123b3o146bo3bo50b oo3bo72b3o119bo$92boo28boobo147b3o53bobo72boobo34bo7b3o73b3o$92boo8boo 18b3o170b3o32bo73b3o33bobo8bo73b5o$102boo18b3o128boo40bobbo40boo63b3o 34boo72bo8boo3boo$123boo30boo97bo40bo43boo64boo107bo10b5o$146boo7boo 97bobo5boo31bo3bo137bo71bo4b3o8bo3bo$146boo107boo5bobo30bo3bo24bo111b 3o70boo15bobo$265bo29bo27boobo108b5o69b3o15bo$262bobbo30bobo24booboo 106boo3boo8bo61boo$101b3o161bo59b3o107b5o10bo56bo$100booboo157bobo170b o3bo8b3o4bo70boo$100booboo157boo26bo145bobo15boo56bo13boo$100b5o41b3o 107boo31b3o38b3o6b3o95bo15b3o56bo7bo$99boo3boo39booboo104bobbo30boobo 38bo7bo3bo109boo58bo7bobo$81boo37b3o22booboo117b3o18b3o40bo5bo5bo64b3o 46bo55bo9boo$82bo36bobbo22b5o103bo10b6o18b3o46booboboo63bobbo26boo84b oo$82bobo4bo32bo21boo3boo112bobb3o20boo35bo83bo26boo13bo70boo$83boo3bo bo31bo44boo85boo10bo4boo53bo83bo33bo7bo67bobo4boo$87boboo28bobo45bo88b o6b3obboob3o63bo69bobo32bobo7bo67bo6bobo$86booboo69bo4bobo100boobbo53b o10boo101boo9bo77bo$87boboo68bobo3boo103boo28bo24bobo112boo64boo3boo 16boo$88bobo68boobo90boo3boo39b3o34boobo100boo64boo3boo$89bo69booboo 89boo3boo38boobo23b3o8boobbo95boo4bobo62b5o$84boo73boobo91b5o3bo35b3o 36b4o94bobo6bo63bobo$84boo17boo54bobo93bobo4boo35boo134bo$103boo55bo 100bobo61b3o106boo16boo3boo49b3o$164boo89b3o77boo3boo110boo3boo$83b3o 59boo17boo159bobo10bo114b5o$83b3o10boo47boo123bo55bo8bo5bo112bobo$95bo bo171b3o64booboo$97bo66b3o101booboo53bo10bobo114b3o$152boo10b3o91bo8b 3ob3o52bo11bo169boo$81boo3boo64bobo102bobo7b3ob3o64bo169boo$82b5o65bo 103bo3bo6b3ob3o216bo$83b3o171b3o7b3ob3o204bo9b3o$84bo77boo3boo86boo3b oo6booboo203boo9bo$88b3o7bo64b5o101b3o183boo20boo8boo$90bo6bobo64b3o 103bo66boo116boo$89bo75bo171boo$151bo7b3o$97b3o50bobo6bo319bo$97b3o60b o22boo293bo5b3o$98bo84boo293b3obbooboo$150b3o330booboo$85b3o62b3o330b 5o$98bo52bo330boo3boo$85bobo9b3o158boo8boo$84b5o8b3o62b3o93boo8boo$83b oo3boo61bo31bo$83boo3boo60b3o9bobo17b3o9b3o$97bobo50b3o8b5o16b3o9b3o$ 98bo61boo3boo28bo$86bo73boo3boo13boo3boo8bo291boo$84boo64bobo27boo3boo 8bo73bo217bo$151bo42bobo59b3o9b3o205boo10b3o$83bo79bo92b3o9b3o204b3o 12bo$164boo16boo73bo214boboo9boo$84bobbo94bobo9bobo60bo8boo3boo199bobb o4bo5bo$86boo78bo14bobboo9bo61bo8boo3boo199boboo5bo$183boo10bo60bobo 216b3o3bo3bo$162bobbo17boo10bo280boo5bo$70boo90boo20bo9b3o72boo$70boo 122b3o59bobo9bobo196b3o$178bo5bo72bo9boobbo194bo3bo$178bo5bo72bo10boo 195bo5bo$179bo3bo6bo66bo10boo$69b3o108b3o5bobo5bobo57b3o9bo195bo7bo$ 69b3o117boo6boo57b3o205bo7bo$68bo3bo124bo70bo5bo$67bo5bo194bo5bo190bo 5bo$68bo3bo9bo179bo6bo3bo192bo3bo$69b3o9b3o170bobo5bobo5b3o194b3o$80b 5o169boo6boo$255bo$$181boo$68bobo110boo$68bobbo118bo$70boobo116bobo$ 80b5o106bobo$70bo10b3o107bobbo75boo$70boboo8bo108bobo76boo$71bo108boo 8bobo6bo62bo$179bobo8bo8bo60bobo$179bo18bobo58bobo$65boo3boo106boo17b ooboo56bobbo$66b5o125bo5bo56bobo$66booboo8bo119bo53bo6bobo8boo$66boob oo6bobo116boo3boo50bo8bo8bobo$67b3o8boo172bobo18bo$251booboo17boo$198b o51bo5bo$198bo54bo$197bo52boo3boo$87boo329bo$68boo17boo327boo35boo$68b oo129boo53bo162boo34boo$76boo121boo53bo$74bobbo140bo36bo134boo$73bo7b oo135b3o169boo28bo$73bo6bobb4o134bo196boo$73bo7boob4o132boo30boo165boo $67boo5bobbo10bo163boo$66bobo7boo8bo303bo$66bo16bo5bo299bobo50bo$65boo 16bo5bo298bo3bo48b3o$84bo3bo300b3o48b5o8b3o$85b3o299boo3boo58bo3bo$ 407b3o41bo5bo$142boo76booboboo182bo42bo3bo$108bo33bobbo223boo37bo44b3o $109boo109bo5bo143bo82b3o$108boo36bo223boboo3boo$221booboo145bo3bo3bo 60b5o$144boo77bo156bo60b3o$143bo229bobbo3bo61bo$86boo286bo5bo74b3o$86b oo132boo153bo3bo70bo3booboo$95boo43boo3boo74bo155boo69boo4booboo$95boo 43boo3boo71b3o11bobo137boo32bo42boo3b5o$141b5o72bo12bobbo3bo132bobbo 15b3o12b3o33boo10boo3boo$142bobo18boo57boo6boo6bo132bo32boobo33boo$ 163bo58boo4boo3bo61b3o73bo32b3o$142b3o8bo7bobo66boo63bobbo72bobo11bo 18b3o$94b3o32b3o19bobo7boo68bobbo60bo75bobo11boo18boo$94b3o32bo19boo 81bobo60bo3bo72bo11bobo70boo$93bo3bo32bo18boo89bo15bobo36bo3bo$149boo 88b3o15boo36bo$92boo3boo13boo37bobo84b5o14bo38bobo70boo3boo$113boo38bo 215bo5bo79boo$74boo36bo47boo293boo$75bo65b3o16boo92bobo33bo79bo3bobboo 70boo$75bobo4bo172boo32b3o79b3o4boo67bobbo$76b3ob4o61boo108bo32boobo 85bo68bo$78booboboo203b3o117b3o35bo$78bobbob3o152b5o45b3o116bobbo35bo$ 79boboboo154b3o47boo94b3o22bo36bobbo5boo$80b4o156bo144bobo22bo38boo5bo bo$82bo302b3o19bobo48bo$77boo17bo56bo220bo10b3o70boo$77boo17bo55boo7bo 138bo71booboo8b3o49b3o$77boo17bo55bobo5b3o136b3o83b3o48bo3bo$77bo81b5o 134boobo69bo5bo7bobo47bo5bo$76bobo79boo3boo133b3o84b3o47bo5bo$76bobo 10b3o55bo11b5o135boo70booboboo60bo$77bo13bo54b3o10b5o272bo3bo$90bo68bo bbo274b3o$158bo3bo275bo$74boo3boo65b3o9bo$74bobobobo77boboo$75b5o66bob o10bo277boo$76b3o3boo62bobo278boo8boo$77bo3bobo343boo$83bo62b3o7boo3b oo211boo$156bo5bo211boo7boo$91bo291boo$91bo54b3o8bo3bo80boo$90bobo54bo 10b3o81boo$91bo335b3o$91bo$78b3o10bo335bobo$77booboo9bo290b3o41b5o$77b ooboo8bobo332boo3boo$77b5o9bo149b3o10bo62boo63bobo40boo3boo16boo$76boo 3boo8bo66boo93bobo61boo62b5o62bo$158boo81bobo136boo3boo52bo6bobo$240b 5o117boo16boo3boo52bobo4boo$239boo3boo7b3o107bo78boo$239boo3boo7b3o 107bobo6bo69boo$77boo175bo109boo4bobo69boo$368boo69bobo$241boo125boo 69bo$240booboo9bo113boo75boo$79boo160bobbo8b3o114bobo72boo$79boo160bo 11b3o116bo57bo$244bo71b5o17boo25boo63bo4bo$242boo71bob3obo16bo26boo67b 3o9bo$253bobo60bo3bo6bo8bobo42bo50boo3bo7bobo$254bo62b3o7boo7boo38bo4b o53boo7bo3bo$237boo3boo74bo3boo4boo35bo9b3o54boboo8b5o$238b5o5bo73boo 4b3o33bobo7bo3boo53bo9boo3boo$239b3o7boo71boo4boo33bo3bo7boo67b5o$240b o7boo77boo34b5o8boobo65b3o$327bo34boo3boo9bo67bo$335boo26b5o$335boo27b 3o74boo$365bo66bo8bobo$431b3o7bo$325booboo39boo$318bo5boo3boo37bobo8bo $240boo16b3o56bobo4b3ob3o39bo7b3o50b3o$240boo75boo4bobobboo6bo$250bo 71b3o3boo5b3o93bobo$249bobo69bobbo10b3o40b3o50bobo$249boobo69bo120b3o$ 249booboo79boo3boo38bobo50b3o8bo3bo$249boobo19bo60boo3boo38bobo$239boo 8bobo18bobo93b3o72bo5bo$238bobo9bo6b3o11boo92bo3bo8b3o50b3o7boo3boo$ 238bo17booboo72boo97bo$237boo17booboo61bo9bobo29bo5bo$256b5o60bobo7boo 31boo3boo7b3o63bo$255boo3boo58bo3bo7boo45bo63bobo$320bo3bo7boo109bobo$ 320bo3bo10b3o29bo77bo$320bo3bo41bobo76bo$320bo3bo41bobo73bobbo$256boo 62bo3bo41bo76boo$321bobo42bo$322bo8boo3boo28bobbo$367boo90boo$258boo 72bo3bo122boo$258boo8boo63b3o$268boo63b3o$$312boo146bo$268bo43boo145bo bo$267bobo188bo3bo$266bo3bo62boo124b3o$266b5o42bo19boo122boo3boo$265b oo3boo40bobo133bo$266b5o40bo3bo131b3o$267b3o41b5o130booboo$268bo41boo 3boo128b3ob3o$247boo62b5o129b3ob3o10bo$248bo63b3o130b3ob3o10bo$248bobo 5boo55bo131b3ob3o6b3obo$249boo5bobo74boo111booboo$257b3o73bo113b3o7bo$ 258b3o63boo5bobo114bo8boobo$257b3o63bobo5boo126boo$256bobo63b3o$256boo 63b3o$250boo70b3o134boo3boo$250boo71bobo133boo3boo$324boo126bo7b5o$ 271boo57boo119bo9bobo$248bo14b3o6boo56boo119b3o$249bo15bo5bo189b3o$ 249bo14bo44boo137boo$308boo6b3o14bo114b3o$310bo5bo15bo111b3oboo$247boo 3boo63bo14bo112boo$250bo$247bo5bobboo203boo$248booboobbobo70boo3boo 126boo$249bobo5bo73bo121boo$250bo73boobbo5bo118bobo$250bo73bobobbooboo 114boo6bo$263b3o58bo5bobo114bobbobbobbo$262bo3bo64bo111b3obboo6bo$261b o5bo63bo111b3o7bobo6boo$252bo63b3o123bo3bo6boo7bobo$251b3o6bo7bo46bo3b o121bo5bo16bo$250bo3bo5bo7bo45bo5bo87b3o31bo3bo17boo$249bob3obo73bo77b obbo32b3o$250b5o6bo5bo45bo7bo6b3o79bo$262bo3bo46bo7bo5bo3bo78bo$263b3o 60bob3obo54boo18bobo$314bo5bo6b5o54bobbo$300bo14bo3bo66bo$299b3o14b3o 67bo$298boobo84bobo$298b3o85bobo$299boo86bo$443boo$443boo$252boo130boo 3boo43boo$252boo130bo5bo43boo$$328boo36boo17bo3bo$328boo37bo18b3o$367b obo6bo$368boo6b4o$377b4o53b3o$377bobbo52booboo$377b4o52booboo$376b4o 53b5o$376bo55boo3boo$369boo84boo$369boo17boo65bo$249boo133bo3boo58bo4b obo$248bobo133boo61bobo3boo$247b3o133bobo61boobo$247boo198booboo$247b oo198boobo$248bobo186bobo7bobo$249bo187bobo8bo$438bo13boo$260b3o113boo 74boo$246boo3boo7b3o114boo$246boo3boo8bo105b5o4bo60boo$261bo104bob3obo 10bo52bobo13b3o$248b3o10bo105bo3bo11bo50bobbobboo10b3o$248b3o9bobo105b 3o11b3o50boo3bobo$249bo119bo70bo$370boo$260bobo107bobo9b3o65boo3boo$ 261bo108bobo10bo67b5o$261bo109bo11bo68b3o$261bo121bo69bo$251bo8b3o120b o55bo7b3o$252boo6b3o105booboboo7b3o53bobo6bo$251boo115bo5bo73bo$369bo 3bo$246b3o121b3o9b3o53b3o$245bo3bo133bo54b3o$244bo5bo132bo55bo$244bo5b o$247bo10bobo189b3o$245bo3bo9boo178bo$246b3o10bo178b3o9bobo$247bo190b 3o8b5o$371boo75boo3boo$265boo104boo75boo3boo$247boo16bobo170bobo$247b oo18bo171bo$253bo21bo175bo$251bobo9bo9bobo176boo$250bobo11boo8boo$249b obbo201bo$250bobo$246boo3bobo196bobbo$245bobo5bo196boo$245bo$244boo16b oo3boo$265bo$262bo5bo$263booboo$264bobo54boo$265bo55boo$265bo5$265boo$ 265boo$274boo$274boo$321b3o$274bo45bo3bo17boo$273bobo43bo5bo16bo$273bo bo44bo3bo6boo7bobo$274bo46b3o7bobo6boo$321b3obboo6bo$325bobbobbobbo$ 271booboboo48boo6bo$271bo5bo53bobo$272bo3bo54boo$253boo18b3o63boo$254b o84boo$254bobo5boo$255boo5b3o$264boobo$264bobbo$264boobo$262b3o57boo 15b3o$262boo57boo6b3o$256boo65bo5bo9bobo$256boo72bo7b5o$278boo57boo3b oo$270boo5bobo57boo3boo$271boo6bo$270bo$337boo$326bo8boobo$325b3o7bo$ 324booboo$263bo59b3ob3o6b3obo$253boo3boo3boo58b3ob3o10bo$262bobo58b3ob 3o10bo$254bo3bo64b3ob3o$255b3o12bo53booboo$255b3o11b3o53b3o$268bobobo 53bo$268bobobo62boo3boo$258bo10b3o65b3o$257b3o10bo65bo3bo$256bo3bo76bo bo$258bo79bo$255bo5bo8bo$255bo5bo7b3o$256bo3bo7bobobo$257b3o8bobobo64b oo$269b3o65boo$270bo7$258boo$258boo! golly-2.5-src/Patterns/Life/Miscellaneous/Calcyman-primer.zip0000644000175100001440000000273212156145314021250 00000000000000PK3%;Calcyman-primer.rleUX “PU¡Jõ-ÝJÃ@…ïy‡c+¨†$‚¨Ð ‰`{!ôÂX×I³¸?avRš·w“x5Ü3ßül[ÔÕ.Š– ½ÄqK„B³Ód-6ŽàG÷MŒ3yb%Ë<Û¶8 ÆH³9g¬âÙíµf\À;)ƒÑ¿Ä1ø»ˆÍi†ñƒ!öÅB ÞNxª I‹èTLR‰¯ž•.©ÄäÂ…ržàF+Ë€Ð-ݤtã…ÎÄèªit×{þ…×ÅÚ*«'—vºûQ§aÔ=ñCúŸjBSU/yvÅu)…ÇbýÎëîyvhn7PK#ƒ£˜é>PK]bA Primer.ruleUX “PŒ“Põ}“ao›0†¿ß¯8u¶In$!©R»6Ú&µk•´ÚÇÉ!Gp6²M»¨ÚŸ!!Z ‹„áxÞ÷ÎçC\Οngø EAà }ïÜXn u•ÚŒ[4UY*m r ÎÊs,k;ʪX’Æ5IÒÜ*=€ï+CµÑˆBä\×N™ˆ².¥ð†¸Äo"Ù6J~4x¶Û÷ Kn-iÉ@É|‹¡‡Öqƒ)7ð1#W‘^ÒT¨Bë-Un›â*âI†BZZ“fH¿*-¦Jïΰוhjd2Q¶8ˆñF½ÊcaøÞJº ¤9%nÞ­gÔMîucœwYøs#r—°‚çØ¸5Mbüñó¸³ÈË*MéPnãâÀàÅ}~~ñæ1ŸlÈFlÌB6a›þi´å -9¡­NhtBKOhëZö­ÅÅ[ÀF;ãóÅ›ïLá^Ú´yï³<&gK–°#–²5 `|ĆÎ×’ç=ó¯ËF°7nÜmú¤†ÓNE£Êغ¶Œ…ýÉÞ;9uØÚ¥¹ÿÆ?ªèAÐÃ&= †=-ŽzXØÃàòúþö~¾p-`0£‡ncwob6O?ˆê£&Ú8ðæ-D´ &͹á5oÓ6jòþPK㽄,KPK ™]bA __MACOSX/UX “P“PõPK]bA__MACOSX/._Primer.ruleUX “PŒ“Põc`cg`b`ðMLVðVˆP€'q%ƒø«˜!Ä5"„/p bH¾ÎÕ1ˆùÑ”0"ÄÅ“ósõ rRõBR+J\ó’óS2óÒ’¡!nºÖ†Æ&F†æ–&PK2_øe«PK3%;#ƒ£˜é> @íCalcyman-primer.rleUX“PU¡JPK]bA㽄,K @¤:Primer.ruleUX“PŒ“PPK ™]bA @ýA¯__MACOSX/UX“P“PPK]bA2_øe« @¤æ__MACOSX/._Primer.ruleUX“PŒ“PPK%Ÿgolly-2.5-src/Patterns/Life/Miscellaneous/Cambrian-Explosion.rle0000644000175100001440000023031112156145314021673 00000000000000#CXRLE Pos=-815,-550 #C Cambrian Explosion #C Based on 'a-plus.lif' from Alan Hensel's 'lifebc' collection. #C Most additional patterns are from 2004-2006, and were selected #C (somewhat at random) from Koenig's Life News weblog. For details #C on individual patterns, see http://pentadecathlon.com/lifeNews . #C Press 'm' in Golly to center the view on the column of spaceships #C of different speeds. A new speed (c/6) has been added. #C To the NE are diagonal spaceships with some new speeds (c/5, c/6). x = 1028, y = 672, rule = B3/S23 781b3o9b3o$491b3o15b3o269bo2bo7bo2bo$490bo3bo13bo3bo268bo13bo$489b2o4b o11bo4b2o267bo13bo$488bobob2ob2o3b3o3b2ob2obobo267bobo2b3o2bobo$487b2o bo4bob2ob3ob2obo4bob2o270bo3bo$486bo4bo3bo4bobo4bo3bo4bo269bo3bo$498bo 5bo23bo250b3o4b5o$486b2o7b2o9b2o7b2o10b3o249bo2bo3bo3bo$517bo9bob2o 247bo3bo$515bo2bo9b3o247b3o3bo$516bo2bob3o4b2o248b2obo2bo$519bobo2bo 257bobo$517bobobo3bo249b3o4bo$516b2obobobo2bo248b2o$515bobobobobob2o 249b7o$257bo256b2obobobobo4bo248b3ob3o$256b3o253b2obobobobob6o253b2o$ 255b2ob2o251bobobobobobobo6bo$254b2obobo250b2obobobobobobo2b5o244b3o$ 253b3o2b3o247b2obobobobobobobobo6bo241bo2bo$254bo6bo245bobobobobobobob obobob6o241bo3bo5bo$255b5obo244b2obobobobobobobobobo8bo243b2o3b3o$256b 4ob2o242bobobobobobobobobobobo2b7o243b2o3bob2o$261bo242b2obobobobobobo bobobobobo8bo241bo5b3o$260bo12b2o227b2obobobobobobobobobobobobo2b7o 243bo3b2o$273b2o226bobobobobobobobobobobobobobobo8bo238b2ob2o$500b2obo bobobobobobobobobobobobo2b9o240bobo$499bobobobobobobobobobobobobobobob o10bo239bo$258bo239b2obobobobobobobobobobobobobobobo2b9o237b3obo$256b 2obo237bobobobobobobobobobobobobobobobobobo10bo$496b2obobobobobobobobo bobobobobobobobob12o225bo8b6o8bo$103bobo153bo235bobobobobobobobobobobo bobobobobobobobo12bo222b3o6bo6bo6b3o$94bob3o4bobo150bo2bo21b2o211b2obo bobobobobobobobobobobobobobobobobo2b11o221b2obo5b10o5bob2o$92b2obo4bo 5bo150bo23b2o210bobobobobobobobobobobobobobobobobobobobobo12bo219b3o5b o10bo5b3o$94b2o4bo2bo2bo385b2obobobobobobobobobobobobobobobobobobobobo b12o220b2o4b14o4b2o$100bo2bo2bo155b2o227bobobobobobobobobobobobobobobo bobobobobobobo14bo223bo14bo$99bo4bo150b3o5b2o225b2obobobobobobobobobob obobobobobobobobobobobo2b13o222b2ob12ob2o$95bo2bo16b2o145b2o225bobobob obobobobobobobobobobobobobobobobobobobobo14bo$96b2o17b2o132b3o10bo225b 2obobobobobobobobobobobobobobobobobobobobobobobo2b13o219bo6b6o6bo$248b o3bo234bobobobobobobobobobobobobobobobobobobobobobobobobobo14bo220bo 12bo$247bo4bo233b2obobobobobobobobobobobobobobobobobobobobobobobobo2b 15o217b2o6b4o6b2o$99bo146bo3bo234bobobobobobobobobobobobobobobobobobob obobobobobobobobo16bo93b3o3b3o120bo4bo$98bobo145bo2bob3o230b2obobobobo bobobobobobobobobobobobobobobobobobobobobobo2b15o46b3o3b3o37bo2bo3bo2b o117b2ob4ob2o$98bobo145bo7bo228bobobobobobobobobobobobobobobobobobobob obobobobobobobobobo16bo43bo2bo3bo2bo39bo3bo120b2o6b2o$99bo148bo3bobo 227b2obobobobobobobobobobobobobobobobobobobobobobobobobobobo2b17o46bo 3bo42bo3bo118bo4b4o4bo$123b2o123bo3bob2o225bobobobobobobobobobobobobob obobobobobobobobobobobobobobo22bo44bo3bo42bo3bo108b3o7b5o4b5o7b3o$123b 2o125b3ob2o224b2obobobobobobobobobobobobobobobobobobobobobobobobo2bob 25o44bo3bo154bo2bo5bo6b4o6bo5bo2bo$85b3o391bobobobobobobobobobobobobob obobobobobobobobobobobo32bo87b3o3b3o108bo5b7o4b7o5bo$478b2obobobobobob obobobobobobobobobobobobobobobo2bob35o40b3o3b3o39bo5bo109bo3bo8b4o8bo 3bo$89b2o16bo369bobobobobobobobobobobobobobobobobobobobobobo42bo39bo5b o40b7o106bobo4b9o4b9o4bobo$91bo14bobo367b2obobobobobobobobobobobobobob obobobobo2bob45o39b7o29bo9bo7bo9bo100b2o9b4o9b2o$85b4obo15bobo141b2o 223bobobobobobobobobobobobobobobobobobobo52bo36bo7bo9bo17b3o8b9o8b3o 99b3ob7o4b7ob3o$85b5o17bo127b3o12b2o222b2obobobobobobobobobobobobobobo bo2bob55o35b10o8b3o16bob2o6bo9bo6b2obo99bo3bo6b4o6bo3bo$234bo3bo12bo 221bobobobobobobobobobobobobobobobo62bo7bo24bo10bo6b2obo17b3o5b13o5b3o 107b4o4b4o$233bo4bo175b3o5b3o5b3o39b2obobobobobobobobobobobobo2bob65o 6b3o22b14o5b3o18b2o5bo13bo5b2o99b2o5bo4b4o4bo5b2o$85bobo144bo3bo14bo 149bo6b3o2bo2bo5bo2bo4bo2bo5bo7bo23bobobobobobobobobobobobobo72bo3b2ob o21bo13bo6b2o23b19o112b4o4b4o$85bobo144bo2bob3o160b3o4bo2bo2bo3bo3bo3b o4bo7b3o5b3o5bo5bo9b2obobobobobobobobobo2bob75o3b3o21b13o2bo2bo26b2o 19b2o108b2o4b4o4b2o$86bo145bo7bo158b2obo7bo4b2obo4bob2o3bo3bo2b2obo4b 2o2bo3b3o3b3o7bobobobobobobobobobo82bob3o20bo13bobobob2o29b13o112bo2b 4o4b4o2bo$79bobo3bobo146bo3bobo8bo5bobo141b3o4bo3bob2ob2ob4ob4ob3o6bo 7b2o2bo2b2o2bobo2b2o5b2obobobobobobo2bob85o2b2o19b14obobobob2o24b5o13b 5o106b3o5b4o5b3o$65bobo7bo2bo2bo4b2o125bo20bo3bob2o7bo7bo142b2o3b2o3b 2o3b2o11b3o3bob3o2b2o2b2o2bobo2bobobobo2bo3bobobobobobobo89bo23bo15bob o2bob2o28b13o101bo8bo4b4o4b4o4bo8bo$52b3o9b2ob2o5bobob2obo4bo125b3o21b 3ob2o7bo4bo2bo146bobo4bo3bo3bo7b3ob2ob2obobobo4bobo2b4obobo2b3o2b2obob obo2bob90o24b15o2bobo6bo140b3o6b6o4b4o4b6o6b3o$51bo2bo10bob2o6bo135b2o b2o37bo2bo150b5o8bo2bo6bo5bo3bo15bo8bobobobo96b2o21bo15bobo3b2o3b2o27b 11o101bob2o4bo6b4o4b4o6bo4b2obo$50bo4bo13bo11b3o126b2obobo196b3o5b2obo 7bo3bo3bo4b21obobob100o20b17o11b3o27bo7bo103b3o3b8o4b4o4b8o3b3o$50bo2b 3o12bo13b2o125b3o2b3o34b3o159bo16bo5bo6bo123bo2bo18bo17b4o2bo4b3o30b3o 106b2o3bo8b4o4b4o8bo3b2o$50bo5bo11bo12b2o127bo6bo202bo10bo8b2o3b121o 22b19o3b2o6b3o29bo3bo110b9o4b4o4b9o$51b7o153b5obo214bo11bo121bo3b2o15b o19bo3b2o5b2o31b3o109bo10b4o4b4o10bo$57bo154b4ob2o224b123o20b21o4b2ob 2o24bo8b2o3b2o8bo97bo2b9o4b4o4b9o2bo$57bo159bo224bo121b2o19bo21b4o3b2o 23b3o6bo2b3o2bo6b3o97bo2b2o6b4o4b4o6b2o2bo$55b2o159bo12b2o210b122obo 19b23o6bobo22b2obo5b3o5b3o5bob2o95b2o6b4o4b4o4b4o6b2o$100bo128b2o209bo 123bo18bo23b4o27b3o5bo4b3o4bo5b3o102bo4b4o4b4o4bo$100b2o337b123o3bo16b 25o32b2o4b6o3b6o4b2o102bob4o4b4o4b4obo$99bobo336bo123bobo16bo25b2o2bo 32bo6b3o6bo107b2o4b4o4b4o4b2o$54bo159bo222b125o3b2o13b27o4bo4b3o24b2ob 5o3b5ob2o104bo3b4o4b4o4b4o3bo$53bobo156b2obo15b2obob2o198bo124bo17bo 27b2o2bo4bo2bo31b3o112b4o4b4o4b4o4b4o$52b2obo174b2obo3bo197b124o2bo16b 29o2b4o3bo25bo6b2o3b2o6bo92b3o6bo5b4o4b4o4b4o5bo6b3o$52b2o12b2o147bo 15bobobobo196bo142bo29b2o7bo28b2obo2b3o2bob2o95bo2bo5b6o4b4o4b4o4b6o5b o2bo$53b3o10b2o144bo2bo16bo200b122obo4b2o13b31o2bob3o3bobo22b2o4b3o3b 3o4b2o92bo6bo7b4o4b4o4b4o7bo6bo$54bob2o155bo218bo119bobobo3bo14bo31bo 43b3o101bo6b8o4b4o4b4o4b8o6bo$53b2o2bo373b116obo12bo12b33o2bo3bo33bo2b o3bo2bo98bobo2bo8b4o4b4o4b4o8bo2bobo$53bobob2o159b2o210bo113bobobo24bo 33b3o3bo37b3o106b10o4b4o4b4o4b10o$54b2ob2o152b3o5b2o208b110obo31b35o3b o37b3o3b3o103bo9b4o4b4o4b4o9bo$54b3ob2o158b2o208bo107bobobo30bo35b5o3b o25bo9b3o9bo94b4o2b6o4b4o4b4o4b6o2b4o$57bo160bo11b4o30bo162b104obo37b 37o4bo2b3o23b3o7bo3bo7b3o94b3o8b4o4b4o4b4o8b3o$74b2o153bob2o32bo160bo 101bobobo36bo37b2o2bob2o2bo21b2obo5bob5obo5bob2o92b2o6b4o4b4o4b4o4b4o 6b2o$40bobo31b2o153bobo31b3o159b98obo43b39o2bobo4b2o21b3o5b3o5b3o5b3o 99bo4b4o4b4o4b4o4bo$39b2ob2o5b2ob2o2b2o6b2o358bo95bobobo42bo39b2ob2ob 2o25b2o4bo3b5o3bo4b2o99bob4o4b4o4b4o4b4obo$40bob2o5b2o4b4o5b2o158bo 198b92obo49b41o2b2ob4o28b6o5b6o102b2o5b4o4b4o4b4o5b2o$44bo6b2ob2o2bo 163bo2b2o195bo89bobobo48bo41bo3bob2o2b2o24bo6b5o6bo100bo3b4o4b4o4b4o4b 4o3bo$43bo10b2ob2o158b2o3bo2b4o192b86obo55b43ob2o33b2ob4o5b4ob2o90bo8b 5o4b4o4b4o4b4o4b5o8bo$43bo12b2o159b2o3bob2obo192bo83bobobo54bo43bo33b 2o7b5o7b2o87b3o6bo5b4o4b4o4b4o4b4o5bo6b3o$225b2obo60bo129b80obo61b45o 2bo31bob3o3bo5bo3b3obo86b2obo5b7o4b4o4b4o4b4o4b7o5bob2o$225bo61bobo 128bo77bobobo60bo45b3o31bo4bobob5obobo4bo86b3o5bo7b4o4b4o4b4o4b4o7bo5b 3o$223bo4bo59b2o127b74obo67b47o3bo30bo2bo3bo7bo3bo2bo87b2o4b9o4b4o4b4o 4b4o4b9o4b2o$72b2o149b3o190bo71bobobo66bo47b5o3bo26bo5b9o5bo93bo9b4o4b 4o4b4o4b4o9bo$72b2o149b2ob3o186b68obo73b49o4bo2b3o25b2o17b2o92b2ob8o4b 4o4b4o4b4o4b8ob2o$66b2o158b3o185bo65bobobo72bo49b2o2bob2o2bo32b5o111b 4o4b4o4b4o4b4o$65bo2bo156bobo185b62obo79b51o2bobo4b2o24b2o5bo5bo5b2o 91bo6b5o4b4o4b4o4b4o4b5o6bo$65bo2bo156b2o185bo59bobobo78bo51b2ob2ob2o 35b5o102bo8b4o4b4o4b4o4b4o8bo$64b5o342b56obo85b53o2b2ob4o23bo8b2o5b2o 8bo88b2o6b4o4b4o4b4o4b4o4b4o6b2o$33b3o25b2ob2o344bo53bobobo84bo53bo3bo b2o2b2o19b3o6bo2b5o2bo6b3o94bo4b4o4b4o4b4o4b4o4bo$63bo345b50obo91b55ob 2o27b2obo5b3o7b3o5bob2o91b2ob4o4b4o4b4o4b4o4b4ob2o$37b2o369bo47bobobo 90bo55bo29b3o5bo4b5o4bo5b3o91b2o5b4o4b4o4b4o4b4o5b2o$39bo367b44obo41b 3o53b57o2bo28b2o4b6o5b6o4b2o90bo4b4o4b4o4b4o4b4o4b4o4bo$33b4obo367bo 41bobobo37bo3bo2bo40bo10bo57b3o33bo6b5o6bo85b3o7b5o4b4o4b4o4b4o4b4o4b 5o7b3o$33b5o367b38obo44b3ob2o3bo38b3o8b59o3bo31b2ob5o5b5ob2o83bo2bo5bo 6b4o4b4o4b4o4b4o4b4o6bo5bo2bo$404bo35bobobo43b2o3bob2ob2o37bob2o6bo59b 5o3bo34b5o94bo5b7o4b4o4b4o4b4o4b4o4b7o5bo$156bobo244b32obo50b2o2bo2bob obobo37b3o5b61o4bo2b3o24bo6b2o5b2o6bo85bo3bo8b4o4b4o4b4o4b4o4b4o8bo3bo $33bobo119bo2bo243bo29bobobo51bo3bobobo3b2o36b2o5bo61b2o2bob2o2bo26b2o bo2b5o2bob2o85bobo4b9o4b4o4b4o4b4o4b4o4b9o4bobo$26bobo4bobo120bobo242b 26obo58b2o5bobobo3bo40b64o2bobo4b2o23b2o4b3o5b3o4b2o87b2o9b4o4b4o4b4o 4b4o4b4o9b2o$17bob3o4bobo5bo137b2o226bo23bobobo56b2obobo8bo41b2o64b2ob 2ob2o35b5o96b3ob7o4b4o4b4o4b4o4b4o4b7ob3o$15b2obo4bo5bo3bobo136bobo 215b3o6b20obo65bobob2o9b2o43b61o2b2ob4o30bo2bo5bo2bo70b3o3b3o13bo3bo6b 4o4b4o4b4o4b4o4b4o6bo3bo$17b2o4bo2bo2bo4b2o122bo13b3o215bo2bo4bo17bobo bo62b2obobobobo48b5o61bo3bob2o2b2o31b5o73bo2bo3bo2bo19b4o5b3o4b4o4b4o 4b3o5b4o$23bo2bo2bo4bo122bob2o11bo2bo214bo6b14obo71bobobobob2o52b61ob 2o37b3o5b3o73bo3bo14b2o5bo4b3o5b4o4b4o4b4o5b3o4bo5b2o$22bo4bo129bob2o 12bo216bo3bobo11bobobo68b2obobobobobob2o111bo32bo9b5o9bo66bo3bo22b3o6b 3o4b4o4b4o4b3o6b3o$18bo2bo134bo3bo12bo7b2o113bo93bo5b7obo77bobobobobob obo52b60o2bo29b3o7bo5bo7b3o65bo3bo20bo4bo5bo2b4o4b4o4b4o2bo5bo4bo$19b 2o136b4o20b2o114bo92bo4b2o3bobobo74b2obobobobobobobob2o50bo58b3o28b2ob o5bob7obo5bob2o91bo2bo5bo2bo3b4o4b4o3bo2bo5bo2bo$157b3o15bo119b3o93bo 3bo54bo19bo7bobobobobobobobobobo54b56o3bo27b3o5b3o7b3o5b3o62b3o3b3o22b o7b4o6b4o6b4o7bo$31b2o139bo222bo53b3o17b3o5b2obobobobobobobobobob2o38b 3o9bo56b5o3bo23b2o4bo3b7o3bo4b2o64bo5bo19b2o4b2obob3o6bo6bo6b3obob2o4b 2o$30bo2bo138bo2bo217b3o44bo7b5o5bo9bo2b2o2b2obobobobobobobobobobobo 39bo2bo9b56o4bo2b3o26b6o7b6o68b7o28b2o4b2o5bo2bo5b2o4b2o$31b2o138b3o 220b2o43b3ob3ob2o3b2o3b3ob3o12bobobobobobobobobobobobob2o36bo7b5o56b2o 2bob2o2bo24bo6b7o6bo66bo7bo31bob2ob5o2b5ob2obo$171b3o264b2o3b3o2bo4bo 2b2o3bob2o2b2o4b2obobobobobobobobobobobobobo37bo6b2obo2b56o2bobo4b2o 24b2ob4o7b4ob2o55bo10b9o10bo21bo8b2o8bo$171bo2bo262b2o5bo3bob2obob2o2b obobob5o6bobobobobobobobobobobobobob2o35bobob2obobo58b2ob2ob2o25b2o7b 7o7b2o52b3o8bo9bo8b3o14b2o4bo2bo3b2o2b2o3bo2bo4b2o$37b2o133bobo146bo 116bo3b2o4b2o6bo4bo4bob2o3bo4bobobobobobobobobobobobobo40b2o4b58o2b2ob 4o24bob3o3bo7bo3b3obo51b2obo7b13o7bob2o17bobo2bo5b2o5bo2bobo$39bo128bo 3b3o11b2o131bobo115b2o8bob2obobo6b2o4bo5b7obo2bobobobobobobobobobob2o 36bo2bo61bo3bob2o2b2o21bo4bobob7obobo4bo51b3o7bo13bo7b3o17bobo2bo4bo2b o4bo2bobo$167bobo15b2obo131b2o113b2obobo6b2o2bo9bo10bo13bobobobobobobo bobobo46b56ob2o30bo2bo3bo9bo3bo2bo52b2o7b15o7b2o24bo4b2o4bo$19bo4bobo 10bo2b4o139bo4bo247bobob2o4bo2b3o19b17obo2bobobobobobobob2o30b3o9bo56b o33bo5b11o5bo59b2o17b2o33b2o2b2o$18bobo2b2o2b2o8bo5bo117b2o15b2o8bo 244b2obobo3bo8b2o17bo23bobobobobobobobo29bo2bo9b56o2bo31b2o19b2o57b2o 2b17o2b2o$18bob4o2bobo9bo4bo117b2o15bobo2b2o2bo237bo7b2o3bo7b2o21b27ob o2bobobobob2o28bo7b5o56b3o39b7o66bo21bo32bo4bo$19bo6bobo10bo2bo124bo 10bob2o243b3o5b3obo3b2o25bo33bobobobobo27bo6b2obo2b56o3bo30b2o5bo7bo5b 2o62b15o36b6o$23bob3o11b3o108bo14b2obobo4b6o247bo3b2o33b37obo2bob2o27b obob2obobo58b5o3bo33b7o66bo21bo32b6o$48bo99b2ob2o13bo4bo2bo4bo247b2o 37bo45bo30b2o4b58o4bo2b3o21bo8b2o7b2o8bo55bo4b13o4bo$46b2o102bo15bo3bo 3bo2bo287b46ob2o28bo2bo61b2o2bob2o2bo19b3o6bo2b7o2bo6b3o55b2o17b2o$47b 2o118bo2bo4b2o287bo46b4o36b56o2bobo4b2o18b2obo5b3o9b3o5bob2o57bo2b9o2b o36bo4bo$122bo44b3o293b44obo3bo2bo22b3o9bo56b2ob2ob2o21b3o5bo4b7o4bo5b 3o58bo11bo$26b2o92b2ob2o26b2o309bo41bobobo4b3o22bo2bo9b56o2b2ob4o21b2o 4b6o7b6o4b2o63b5o$26b2o94bo27bo2bo298bo8b38obo11bob2o22bo7b5o56bo3bob 2o2b2o23bo6b7o6bo67bo5bo$137b2o10b2o3bo275bo20b3o6bo35bobobo10b3o24bo 6b2obo2b56ob2o31b2ob5o7b5ob2o65bob5obo$136bo2bo9bo4bo181b2o91b3o7b2o9b 2obo5b32obo17bo3bo24bobob2obobo58bo41b7o54b3o15b2o7b2o15b3o$123b2o11b 2ob2o8bo3bo274bo2b2o5bo2bo8b3o5bo29bobobo20bo2b3o24b2o4b58o2bo30bo6b2o 7b2o6bo23b3o13b3o3bo2bo13bo3b5o3bo13bo2bo3b3o13b3o$122bo2bo11bo12bo2bo 181bo3bo88b2ob2o4bobobo8b3o3b27obo27b2o2b3o23bo2bo61b3o33b2obo2b7o2bob 2o25bo2bo5b3o4bo2bo2bo4bo11b5o5b5o11bo4bo2bo2bo4b3o5bo2bo$121b2o3bo10b 3o11bo188bo86b3o2bo2b3o2bo10b2o2bo24bobobo31bo34b56o3bo29b2o4b3o7b3o4b 2o25bo5bo2bo2bo3b5o3b5o6bo5b5o5bo6b5o3b5o3bo2bo2bo5bo$112bo8bo4bo19b2o 185bo7bo86b2obo24bob17obo61b3o9bo56b5o3bo33b7o30bo3bo5bo2bo2bo9bobobob 2o4b7o5b7o4b2obobobo9bo2bo2bo5bo3bo$34b2o75b3o7bo3bo20b2o184bo4bo91bo 7b2o17b2o14bobobo37b3o21bo2bo9b56o4bo2b3o28bo2bo7bo2bo30bo2bo2b2ob3o3b 2o3bo3bo3bob2obo7b5o7bob2obo3bo3bo3b2o3b3ob2o2bo2bo$34b2o74bobobo7bo2b o207bobobo4bo86bo3bo4bo20b8obo44b2o2bo20bo7b5o56b2o2bob2o2bo31b7o31bob o2b3ob2obobo3bo4b5obo3bob9o5b9obo3bob5o4bo3bobob2ob3o2bobo167bo$109b3o b3o7bo4bo204bo8bo87bobo20b3o2bo5bobobo44b3o22bo6b2obo2b56o2bobo4b2o28b 3o7b3o33b2o2b3o8bo4b5o14b5o14b5o4bo8b3o2b2o171b3o$127bobo204bo4b2obo 88bo20bo2bo2bobo52bo3bo21bobob2obobo58b2ob2ob2o24bo9b7o9bo28bo3bob2o 13b2o5b9o5b9o5b2o13b2obo3bo59b3o106b3o4b2o$111bob3o13b2o8bo188bo6bob2o b3o112bo4bo53bobo26b2o4b58o2b2ob4o22b3o7bo7bo7b3o27bo23bo12b5o12bo23bo 58bo2b5o101bo2b3o2bob2o$111b5o9bo3bo5bo3bo189bo6b3ob2o92bo20bo86bo2bo 61bo3bob2o2b2o18b2obo5bob9obo5bob2o52b2ob8o5b8ob2o83bo3bobob2o99bo3bob o2bobo$111b2o2b2o11bo2b2o3bo2bo187b3o23b2o78bobo16bobo59b2o35b56ob2o 27b3o5b3o9b3o5b3o63b5o94bo6bo101bo4bobobobob2o$113bob2o14bo4b2ob2o212b 2o70b2o5bo3bo78bobo20b3o9bo56bo30b2o4bo3b9o3bo4b2o57b7o5b7o89bo6bobo 99bo4bobo3b2o$115b2o9bo2b2o6bobo284bo2bo8bo76bo2b3o19bo2bo9b56o2bo32b 6o9b6o68b5o93bobo6b2ob2o95bobo4bo3bob3o$111bobo2bo11bo9bo285bobobo5bob 2o80b2o18bo7b5o56b3o31bo6b9o6bo62b5o5b5o87b2obob3o2b2obobo93b2obob2o9b 2o$110bobo2bo309bo2b3o2bo2b3o74b2o2b3o18bo6b2obo2b56o3bo30b2ob4o9b4ob 2o61bo5b5o5bo85bobobo3bo5bob2o91bobobobo$111bo308b2o11b2ob2o24b2o54bo 20bobob2obobo58b5o3bo23b2o7b9o7b2o58bob5o5b5obo83b2obo8b2obo3bo89b2obo bobob2o$353bo40b2o23bo2bo4b2o4b2o2bo23bo2bo54b2o22b2o4b58o4bo2b3o22bob 3o3bo9bo3b3obo39b3o15b2o6b5o6b2o15b3o63bo3bo5b2o3b2o92bobobobobobobo$ 351bobo41bo24bobo4bo6b3o25bobo56b2o19bo2bo61b2o2bob2o2bo21bo4bobob9obo bo4bo17b3o13b3o3bo2bo13bo3b5o5b5o3bo13bo2bo3b3o13b3o56bobob2o87b2obobo bobobob2o$352b2o7b2o32bobo9bo8b2o3bo13bo22b4obo51bo4bo30b56o2bobo4b2o 21bo2bo3bo11bo3bo2bo16bo2bo5b3o4bo2bo2bo4bo11b5o5b5o5b5o11bo4bo2bo2bo 4b3o5bo2bo40b2ob2o11b2o88b2obobobobobobobobo$126b2o17b2o214b2o33b2o7b 4o8bob2o27b3o7b2ob2o51b3o3bo17b3o9bo56b2ob2ob2o25bo5b13o5bo20bo5bo2bo 2bo3b5o3b5o6bo5b5o5b5o5bo6b5o3b5o3bo2bo2bo5bo57b4o2bo86bobobobobobobob ob2o$144bo2bo195b2o59bob5o8bo27b2o3bo8bo51b2obo4b2o15bo2bo9b56o2b2ob4o 24b2o21b2o16bo3bo5bo2bo2bo9bobobob2o4b7o5b5o5b7o4b2obobobo9bo2bo2bo5bo 3bo57bobo83b2obobobobobobobobobobo$126b2o17bobo188bo5bo2b2o56b2o6bo7bo 26b2o2bobo60b3o5bo16bo7b5o56bo3bob2o2b2o29b9o28bo2bo2b2ob3o3b2o3bo3bo 3bob2obo7b5o5b5o7bob2obo3bo3bo3b2o3b3ob2o2bo2bo57b2o2bo77b3o5b2obobobo bobobobobobob2o$146bo143bo45bo4b3o2bo57b3obo3bo34bo5bo6bo52b3o3b3o16bo 6b2obo2b56ob2o30b2o5bo9bo5b2o17bobo2b3ob2obobo3bo4b5obo3bob9o5b5o5b9ob o3bob5o4bo3bobob2ob3o2bobo54b2o79bo3bo5bobobobobobobobobobobobo$127bob o158b2o10bobo33bo4bo4bo58b3o3bo4bo31b2o2bo5bo55b2o3bo19bobob2obobo58bo 40b9o30b2o2b3o8bo4b5o14b5o5b5o14b5o4bo8b3o2b2o59bobo2bo68b3o3bo5bob2o 3bobobobobobobobobobob2o$128bo160b2o9b2o39b5o64bo4bo3b3o30bo5bo2b2o80b 2o4b58o2bo27bo8b2o9b2o8bo21bo3bob2o13b2o5b9o5b5o5b9o5b2o13b2obo3bo60b 2obob2o67bo3bo2bo5bobo2bobobobobobobobobobobobobo$116b2o10bo109bobo60b o40b2o70bo3bob3o27bo6bo5bo78bo2bo61b3o26b3o6bo2b9o2bo6b3o20bo23bo12b5o 5b5o12bo23bo62b2ob2o60b3o3bo5bobob3obobob3o2bobobobobobobobobobob2o39b 3o5b3o8bo10bo$116b2o121b2o128b2o36bo7bo6b2o34bobo2b2o86b56o3bo24b2obo 5b3o11b3o5bob2o45b2ob8o5b5o5b8ob2o86b2ob2ob2o58bo3bo2bo5bobobobobobo4b obobobobobobobobobobobobo23bo7bo5bo2bo5bo2bo6b3o8b3o$153b2o84bo129b2o 36bo8b5obo14bo11bo8bo3b2o74b3o9bo56b5o3bo19b3o5bo4b9o4bo5b3o56b5o5b5o 156b3o3bo5bobob3obobobo2bob8obo2bobobobobobobobobob2o9bo5bo5b3o5b3o7bo 5bo2bo6bob2o7bob2o$152bo2bo250b2obo8b4o16bo9b2ob2o7b3o8b2o65bo2bo9b56o 4bo2b3o19b2o4b6o9b6o4b2o50b7o5b5o5b7o91b3ob3o50bo3bo2bo5bobobobobobo 20bobobobobobobobobobo7b3o3b3o3bo2b2o4bob2o2bo3bo4bobob2o6b3o8b3o$153b obo249bo3b2o8bo16b3o8bob4o18bobo64bo7b5o56b2o2bob2o2bo23bo6b9o6bo62b5o 5b5o148b3o3bo5bobob3obobobo2bob24obo2bobobobobobob2o5b2o2bobo2b2o2bo2b 2o7bo6b4ob2o2bo3bo3b3o8b2o$154bo186b2o61bobo39bobo24bo64bo6b2obo2b56o 2bobo4b2o22b2ob5o9b5ob2o43b3o10b5o5b5o5b5o10b3o82b4o43bo3bo2bo5bobobob obobo36bobobobobobobo3bo2bobobobo2bobo2b2o2b2o2b3obo3b3ob2obobob2o4b2o bo3b2o$341b2o61bo2bo38bo2bo23b2o64bobob2obobo58b2ob2ob2o33b9o50bo2bo9b o5b5o5b5o5bo9bo2bo82bo38b3o3bo5bobob3obobobo2bob40obo2bobobob2o2b3o2bo bob4o2bobo4bobobob2ob2ob2o2bobobo4b3o3b4o2bo$405b2o40b2o94b2o4b58o2b2o b4o23bo6b2o9b2o6bo44bo5b3o2b5o5b5o5b5o2b3o5bo85bo37bo3bo2bo5bobobobobo bo52bobobobo8bo15bo3bo5bo2bo3bobo3bobo6bo2bo$124b2o416bo2bo61bo3bob2o 2b2o23b2obo2b9o2bob2o47bo4b2obo7b5o5b5o7bob2o4bo116b3o3bo5bobob3obobob o2bob56obobob21o4bo3bo3bo4bo2bobobo3bo4bo2bo$124b2o251b2o142bo10bo18b 56ob2o29b2o4b3o9b3o4b2o41bobo3b2obobob6o5b5o5b6obobob2o3bobo81b2o29bo 3bo2bo5bobobobobobo88bo6bo5bo2bo7bo6b4o$155bobo3b2o214b2o141b3o8b3o16b o56bo40b9o56bo12b5o5b5o12bo89bo5b3o5b3o5b3o3bo5bobob3obobobo2bob89o3b 2o8bo4bo$141bobo7bo2bo2bobo3bo282bo72b2obo7b2obo17b56o2bo4b3o27bo2bo9b o2bo51bobo4b7o5b5o5b7o4bobo86bo2bo3bo3bo3bo3bo3bo3bo2bo5bobobobobobo 95bo11bo6bo$140b2ob2o5bobob2ob5obo262bo8b2o10bo71b3o8b3o16b2o56b3o4bo 2bo30b9o69b5o5b5o101bo2bobo5bobo5bobo5bobob3obobobo2bob99o$141bob2o6bo 6bo2b2o186b2o74b3o6bo2bo7b3o71b3o2bo4bob2o15bo2b56o3bo3bo30b3o9b3o48b 3o10b5o5b5o5b5o10b3o86bobo5bobo5bobo5bobobobobobo51bo53bo$145bo11b3o 189b2o73b2o2bo4bobobo82bo2b2ob3o3bo18bo24bobobo26b2o5bo3bo19bo9b9o9bo 40bo2bo9bo5b5o5b5o5bo9bo2bo83bobobob3obobob3obobob3obobobo2bob48obo7bo b50o$144bo13b2o200bo63bo3bo3b3obo84bo2bo26bo2b17obo11bob21o4bo2bo3bo 18b3o7bo9bo7b3o42bo5b3o2b5o5b5o5b5o2b3o5bo85b2obobobobobobobobobobobob obobo51bobobo7bobobo47bo$144bo12b2o202bo62bobo3bo3bo92b2o2bo19bobo14bo bobo11bobobo19b2obo2bo21b2obo5bob11obo5bob2o41bo4b2obo7b5o5b5o7bob2o4b o13bo10bo8b3o5b3o39b2obobobobobobobobobobobobo2bob48obo23bob44o$132b2o 225b3o23b2o46b2o91bo2bo17bo3bo2b9obo27bob15o6bobo18b3o5b3o11b3o5b3o38b obo3b2obobob6o5b5o5b6obobob2o3bobo9b3o8b3o6bo2bo5bo2bo5bo7bo23bobobobo bobobobobobobobobo51bobobo23bobobo41bo$118bo9bo3b3o250b2o38b2ob2o3b2o 10b2o80bo23bobo6bobobo27bobobo40b2o4bo3b11o3bo4b2o45bo12b5o5b5o12bo14b 2obo7b2obo6bo2bo5bo7b3o5b3o5bo5bo9b2obobobobobobobobobo2bob48obo39bob 38o$118b4o5bobo2bo294bo16bo2bo77b2obo19bo2bob2obo43bob5o34b6o11b6o48bo bo4b7o5b5o5b7o4bobo13b3o8b3o6b2obobo4bo3bo2b2obo4b2o2bo3b3o3b3o7bobobo bobobobobobobo51bobobo39bobobo35bo$118bo3bo5bo3bo2bo307bobobo7bo68bo2b 3o24bobo43bobobo2bo32bo6b11o6bo61b5o5b5o28b2o8b3o3bo3bo2b2ob4o6bo7b2o 2bo2b2o2bobo2b2o5b2obobobobobobo2bob48obo55bob32o$136bo220b2o84bobob2o 7bo66b4o3bo78b2o29b2ob4o11b4ob2o43b3o10b5o5b5o5b5o10b3o14b2o3bob2o4b2o bobob2ob3o3bob3o2b2o2b2o2bobo2bobobobo2bo3bobobobobobobo51bobobo55bobo bo29bo$120b3o10bobo221b2o82b2obo3bo5b3ob2o62bo4b5o75b2ob2o26b2o7b11o7b 2o40bo2bo9bo5b5o5b5o5bo9bo2bo12bo2b4o3b3o4bobobo2b2ob2ob2obobobo4bobo 2b4obobo2b3o2b2obobobo2bob48obo71bob26o$134b2o249bo44bo10bo2bob3o9bobo 60b6o5bo74bo3bo26bob3o3bo11bo3b3obo43bo5b3o2b5o5b5o5b5o2b3o5bo16bo2bo 6bobo3bobo3bo2bo5bo3bo15bo8bobobobo51bobobo71bobobo23bo$383bobo37b2o3b 2ob2o5b2obobobo2bo9bo61bo6b7o76bo27bo4bobob11obobo4bo43bo4b2obo7b5o5b 5o7bob2o4bo18bo2bo4bo3bobobo2bo4bo3bo3bo4b21obobob48obo87bob20o6b3o$ 384b2o7b2o28b2o13bo2bo5b2o70b8o7bo72bo2bo3b3o21bo2bo3bo13bo3bo2bo40bob o3b2obobob6o5b5o5b6obobob2o3bobo17b4o6bo7bo2bo5bo6bo71bobobo87bobobo 17bo4bo2bo$393b2o28bo3bo3bobo5b2o4bobo70bo8b9o71bo3bo2bo2bo21bo5b15o5b o47bo12b5o5b5o12bo40bo4bo8b2o3b65obo103bob14o6bo$421bob3o3bo3bo7b5obo 69b10o9bo76bo25b2o23b2o46bobo4b7o5b5o5b7o4bobo38bo6bo11bo62bobobo103bo bobo11bobo3bo$420bobobo4bo2b2o7bo4bo69bo10b11o70b2ob2o5bo28b11o68b5o5b 5o70b59obo119bob7o5bo$139b2o224b2o53bo2bo6b3o9b4o69b12o11bo69b3ob6o21b 2o5bo11bo5b2o42b3o10b5o5b5o5b5o10b3o51bo56bobobo119bobobo3b2o4bo$142b 2o221b2o54b2o8bo11bo70bo12b13o69bo37b11o49bo2bo9bo5b5o5b5o5bo9bo2bo49b 53obo136bo3bo$139b3ob2o296bo25b2o44b14o13bo69b4o22bo8b2o11b2o8bo41bo5b 3o2b5o5b5o5b5o2b3o5bo51bo50bobobo136bo$143bo297b2o24bobo42bo14b15o72bo 20b3o6bo2b11o2bo6b3o40bo4b2obo7b5o5b5o7bob2o4bo50b47obo144b3o$133b2o4b o3bo257b2o64bo43b16o15bo67b2o5bo16b2obo5b3o13b3o5bob2o36bobo3b2obobob 6o5b5o5b6obobob2o3bobo46bo44bobobo144b2o$135bo3bob2o110bo147b2o107bo 16b17o69bo2b3o15b3o5bo4b11o4bo5b3o42bo12b5o5b5o12bo51b41obo$123b2o6bo 2bo119bo254b18o17bo73b2o15b2o4b6o11b6o4b2o42bobo4b7o5b5o5b7o4bobo40bo 8bo38bobobo139b3o$123b2o5bo12bobo106b3o253bo18b19o69b2o2b2o19bo6b11o6b o61b5o5b5o53b3o6b35obo149bo$143b2o145bo82b2o58b2o72b20o19bo72bo19b2ob 5o11b5ob2o55b5o5b5o5b5o48bob2o4bo32bobobo114b2o32bo$144bo143b2o83b2o 58bo72bo20b21o71b2o26b11o62bo5b5o5b5o5bo48b3o4b28obo113b2o7b3o28b2o$ 289b2o143b3o59b3o6b22o21bo6b3o58b2obob2o15bo6b2o11b2o6bo52bob5o5b5o5b 5obo47b3o2bo26bobobo114b2o4bob4o2b2obo21bo$436bo39b2o17bo2bo5bo22b23o 4bo2bo57b2o2bobo19b2obo2b11o2bob2o54b2o6b5o5b5o6b2o46b3ob23obo121bo12b ob2ob2o$229bo179b2o65bobo19bo4b24o23bo6bo57bo2bo2bob2o13b2o4b3o11b3o4b 2o50bo3b5o5b5o5b5o3bo47b2o20bobobo79b2o6b4o27b2o6b3o4b2o3bobo15bo6b2o$ 230b2o177b2o65bo17bo3bo3bo24b25o5bo56b2o5bob2o22b11o58b5o5b5o5b5o5b5o 47bo2b13obo86bobo4bo5bob2o25bo4bo3b2ob2o5bo6bobo2b2o2b2ob2o3b2o5b3o$ 131b2o96b2o267bo2b26o25bo4bo64bobo18bo2bo11bo2bo53bo5b5o5b5o5b5o5bo45b o13bobobo88bo4bo6b3ob3o25bobo2b2ob5obo3bobob4o2b2obo2b2o3bobo6bo$131b 2o362bobo29b24ob3obo64b2ob2o21b11o53b3ob6o5b5o5b5o5b6ob3o40bo5b4obo53b o39bo6b3o11bo15bo3bo2bobo2bo2bobo2bo3bo2b3o3b3o2bo4bo7b2o4bo$381b2o 121b23o24b2o91b3o11b3o27bo5bo9bo5b2obo7b5o5b5o5b5o7bob2o5bo9bo5bo17bo 4bobobobo53b2o5b6obo24b2o5bo4bobobo4bo5bo3bob2o3b3o6bo11b2o2bo4bo5b3o 11bob4o$32bobo346b2o120bo23b23obo85bo9b11o9bo19b3o3b3o7b3o3b2obo2b6o5b 5o5b5o5b6o2bob2o3b3o7b3o3b3o16bo3bo59bobo4b3ob2ob3ob2o20b2o4bobo3b3o2b o3b2o4bob2o3bo2bo2bo3b2o2b2o18bo5b2o15b2o$31bo360bo108b2ob23o24bo84b3o 7bo11bo7b3o11b3o3bo2b2ob2o2bo4bo3b2o2bobob2o6b5o5b5o5b5o6b2obobo2b2o3b o4bo2b2ob2o2bo3b3o9bo30bobo40b2o7b2o14bo5b2o3b2o3bo5b2o2b5o4bo3bo3bobo $32bo2bo357bo133b22o3bo82b2obo5bob13obo5bob2o10bo2bob3o2bobo2b3o3b4o3b 2o6b5o5b5o5b5o5b5o6b2o3b4o3b3o2bobo2b3obo2bo10bobo18b3o9bo27b2o5b2o3bo b3o4bo11b2o3b2o4b2o2b2o3bo5b2o2bo3b2o5b2o$34bobo354b3o23b2o66b2o13bo4b 22o22bobo83b3o5b3o13b3o5b3o10bo7bo5bo5bo6bo3b4o5b6o5b5o5b6o5b4o3bo6bo 5bo5bo7bo33bo5b2o2bob3ob2o20b2o4bo8b2o5bo3b3ob4o5b2o3b2o2bo17bobo6bo$ 37bo11b3o365b2o66bobo12bo26b22o3b2o82b2o4bo3b13o3bo4b2o11bo19bo2b7o16b 5o5b5o16b7o2bo19bo32bo5b2obo2bobo3bo27bo2b3o4bo4b3o5b3o4b2obo$36b3o 446bo15bo4b21o21bo91b6o13b6o16bo2bo4bo3bo9b2o5b4o6b6o5b5o5b6o6b4o5b2o 9bo3bo4bo2bo30b2o5b4o2bob2ob2obo14b3o5b2o3bo9b2obo4bob2o5b2o$36bo467bo 2bo19b19o2bo15bo12bo61bo6b13o6bo21b2o5b2o3b2o6bo3bo3bob2o7b5o5b5o7b2ob o3bo3bo6b2o3b2o5b2o36bo5bo4bo6b3o5b2ob2ob6ob2o3bo3bo15b2obo6bo87b3o$ 34b2o353b2o118b18o36b3o10b3o60b2ob4o13b4ob2o41bo5bo7b5o5b5o5b5o7bo5bo 61bobobo6bob3ob2o2b2o3bo2b3o3bo6bo26bo89bo$36bo13b3o336b2o116b2o18b17o 2bo16bob2o8b2obo58b2o7b13o7b2o17bo5bo34b5o5b5o34bo5bo37b4o3bob2o5b2ob 2ob3o11bo123bo$34bo2bo12b3o5b2o357bo89b20o17b4o16b3o8b3o59bob3o3bo13bo 3b3obo7b3o6b3o3b3o6bo23b3o5b5o5b3o23bo6b3o3b3o6b3o25b2obobo9bo6bobo3bo 3bo126b2o$22b2o10bobo13b2o6b2o355bobo88bo2bo17b17ob3o16b3o8b3o59bo4bob ob13obobo4bo6bo2bo5b2o2bobo2b2o4b3o6b3o5bo6bo3b5o5b5o3bo6bo5b3o6b3o4b 2o2bobo2b2o5bo2bo28bo25bobo126bo$21bo12bo14bo115bobo248b2o7b2o84b16o 17bobobo15b3o8b3o59bo2bo3bo15bo3bo2bo9bo7bobob3o5b2o2bo5bo2bo3b3o4bo2b 2o5b5o5b2o2bo4b3o3bo2bo5bo2b2o5b3obobo7bo$21bo2bo22b2o2bo25b2o3b4o82bo 128b3o125b2o67b2o9b2o3bo16b18o2bo18b4o2b4o62bo5b17o5bo10bo3b2obob3obob 2o3bo2bo5bo3bo2bo2b2o4bo3b5o5b5o3bo4b2o2bo2bo3bo5bo2bo3b2obob3obob2o3b o181bo6b2o$19b2ob4o22bo3bo9bo9b3obo2bo6bo77bo3bo128bo196bobo14b16o16b 2o22b3o2b3o63b2o25b2o7bobo7bo6bo2b3o2bo2bo3b3o4b2o7b2obo5b5o5bob2o7b2o 4b3o3bo2bo2b3o2bo6bo7bobo168bobo2b2o2b2ob2o3b2o5b3o$18bo29bo2bo10bo13b o2bo2b5o81bo81b2o46bo195bo16b2o14b13o27b3o2b3o71b13o21bo4b3o2bo3b2o6bo 3b2o2b2ob2obo2b2o4b6o5b6o4b2o2bob2ob2o2b2o3bo6b2o3bo2b3o4bo170bobob4o 2b2obo2b2o3bobo6bo$18bo3b3o2bo21b3o7bo16bo2bo85bo2bo80bobo145b2o113bob 13o13bo97b2o5bo13bo5b2o12b2o6bo3bo4bobo3b2o7bo9b3o7b5o7b3o9bo7b2o3bobo 4bo3bo6b2o158bo3bob2o3b2o3b3o2bo4bo7b2o4bo$18bo2bo2bob3o2b3o21b2o6bo 14bo87b3o82bo145b2o113bo14b11o3b2o25bo4bo72b13o20b2o3bo17bo2bo3b2o3b6o 2bob7o5b7obo2b6o3b2o3bo2bo17bo3b2o154bo3bob2o3bo2bo2bo5b3o11bob4o$20b 2o4b3o27b4o15bobo17b2o414bo2b2ob10o12b4o24bobo2bobo60bo8b2o13b2o8bo13b o15bobo3b2o7bobobo12b5o12bobobo7b2o3bobo15bo154b2o3b2o4bo3bo3bobo5b2o 15b2o$22b2obobo32bo3bo11bo18b2o418b2o10b9o2b3o24b2ob6ob2o57b3o6bo2b13o 2bo6b3o28bobo4b2o11bo3b8o5b8o3bo11b2o4bobo163b3ob4o5b2o5b2o42b2o$23b2o bo10b3o21bo371b2o81b11o9b2obo25b2o8b2o56b2obo5b3o15b3o5bob2o36b2obo7bo 11b5o11bo7bob2o168b3o5b3o4b2obo6bo43b2o$26bo10b2o23bobo368b2o82bo9b12o 24bo4b6o4bo54b3o5bo4b13o4bo5b3o52b7o5b7o174b2ob2ob6obob2o5b2o53bobo$ 37bo15b2o8bo163bo275b2o15b7o8b3o25b5o2b2o2b5o55b2o4b6o13b6o4b2o60b5o 178bo2b2o3bo2b3o2bo6bo56b3o4bo$38bo14b2o172b2o274bobo14b2o5b4obo28bo6b 2o2b2o6bo58bo6b13o6bo60b5o5b5o163bobo2b2o2b2ob3o18bo50b2obo2b3ob5o$ 226bobo24b2o150b2o96bo20b2o3b2obo28b7o6b7o57b2ob5o13b5ob2o58bo5b5o5bo 158bobob4o2b2obo2bo3bo3bo58b2ob2o3bo6b2o2bo$252bobo150b2o25b2o93bo31bo 8b2o2b2o8bo63b13o65bob5o5b5obo146bo3bob2o3b2o3b3o2bo4bo6bobo53b2ob2o3b 2o4bo$103b2o149bo272bo31b9o2b2o2b9o54bo6b2o13b2o6bo55b2o6b5o6b2o141bo 3bob2o3bo2bo2bo5b3o62b2ob2o3b2o5b2o2b2ob2o2b2o$92bobo8b2o326bo3bo121bo 10bo4bo10bo55b2obo2b13o2bob2o57bo3b5o5b5o3bo86b2o48b2o3b2o4bo3bo3bobo 5b2o58b2ob2o3b2o5b2o7bo$91bo3bo340bo4b2o114b11o2b2o2b11o52b2o4b3o13b3o 4b2o53b5o5b5o5b5o76b2o7b3o40b3ob4o5b2o5b2o67b2ob2o3b2o5b2o13b2o5bo3b3o $81b3o7bo4bo332bo7bo3b2o112bo12b6o12bo59b13o61bo5b5o5b5o5bo76b2o4bob4o 2b2obo29b3o5b3o4b2obo6bo62b2ob2o3b2o5b2o19b2obo2bo5bo$45b2o29b2o3b4o6b o4bo331bo4bo121b13o6b13o55bo2bo13bo2bo53b3ob6o5b5o5b6ob3o71bo12bob2ob 2o18b2ob2ob6obob2o5b2o69b2ob2o3b2o5b2o28bob2o3bo$46bo28b2o3bo4bo6bo3bo 166b2o164bobobo4bo73b2o39bo14bo4bo14bo57b13o34bo5bo9bo5b2obo7b5o5b5o7b ob2o5bo9bo5bo45b2o6b3o4b2o3bobo15bo2b2o3bo2b3o2bo6bo67b2ob2o3b2o5b2o 30bobo3b2o$28b2o13b3o34b2ob2o7bo2bo167bobo147b2o14bo8bo73bobo38b15o6b 15o54b3o13b3o30b3o3b3o7b3o3b2obo2b6o5b5o5b6o2bob2o3b3o7b3o3b3o46bo4bo 3b2ob2o5bo6bobo2b2o2b2ob3o18bo62b2ob2o3b2o5b2o41bo10b3o$28b2o13bo36b4o 179bo149b2o15bo4b2obo73bo38bo16b6o16bo45bo9b13o9bo16b3o3bo2b2ob2o2bo4b o3b2o2bobob2o6b5o5b5o6b2obobo2b2o3bo4bo2b2ob2o2bo3b3o43bobo2b2ob5obo3b obob4o2b2obo2bo3bo3bo70b2ob2o3b2o5b2o47b2o2b3o5bo$81bo145b2o195bo6bob 2ob3o112b17o6b17o44b3o7bo13bo7b3o15bo2bob3o2bobo2b3o3b4o3b2o6b5o5b5o5b 5o6b2o3b4o3b3o2bobo2b3obo2bo37bo2bobo2bo2bobo2bo3bo2b3o3b3o2bo4bo6bobo 65b2ob2o3b2o5b2o52b2ob3ob2o2bo$76b2o26b3o121b2o195bo6b3ob2o103bo7bo18b 2o2b2o18bo7bo33b2obo5bob15obo5bob2o14bo7bo5bo5bo6bo3b4o5b6o5b6o5b4o3bo 6bo5bo5bo7bo42bo11b2o2bo4bo5b3o74b2ob2o3b2o5b2o55bo10bo$66bo3b2o4b3o 24bo2bo120bo195b3o114b3o6b19o6b19o6b3o32b3o5b3o15b3o5b3o14bo19bo2b7o 16b5o16b7o2bo19bo39b2o2b2o18bo5b2o70b2ob2o3b2o5b2o60bo4b2obobo$66bob2o 2bo6bo22bo4bo193b2o237bob2o3bo20b6o20bo3b2obo33b2o4bo3b15o3bo4b2o16bo 2bo4bo3bo9b2o5b4o6b6o5b6o6b4o5b2o9bo3bo4bo2bo137b2ob2o3b2o5b2o70bob2o$ 27b3o23b2o11bo2b5o2b4o22bo2b3o193bobo237b3o3b21o6b21o3b3o38b6o15b6o26b 2o5b2o3b2o6bo3bo3bob2o7b5o7b2obo3bo3bo6b2o3b2o5b2o138b2ob2o3b2o5b2o73b obo3b2o$26bo27bo15b3o3b3o23bo5bo192bo239b3obo22b6o22bob3o37bo6b15o6bo 45bo5bo7b5o5b5o7bo5bo153b2ob2o3b2o5b2o85b2o$26bo3bo5b2o13b3o15b3o31b7o 311b2o98b2o18b2o2b23o2b2o2b23o2b2o37b2ob4o15b4ob2o23bo5bo34b5o34bo5bo 25b2o99b2ob2o3b2o5b2o89bo$24b2o3b2o5b2o13bo17b2o38bo311b2o98bobo22bo 21b2o2b2o21bo40b2o7b15o7b2o11b3o6b3o3b3o6bo23b3o5b3o23bo6b3o3b3o6b3o 16b2o93b2ob2o3b2o5b2o96b2o$23bo2bobo2bo37bo39bo236b2o101bo71bo26b20o6b 20o42bob3o3bo15bo3b3obo10bo2bo5b2o2bobo2b2o4b3o6b3o5bo6bo3b5o3bo6bo5b 3o6b3o4b2o2bobo2b2o5bo2bo15bo5b2o82b2ob2o3b2o5b2o101b3o$23bo2bobo2b2o 74b2o12b2o223bobo98bobo96b2o20b2o2b2o20b2o40bo4bobob15obobo4bo13bo7bob ob3o5b2o2bo5bo2bo3b3o4bo2b2o5b2o2bo4b3o3bo2bo5bo2b2o5b3obobo7bo18b2o5b 2o76b2ob2o3b2o5b2o106bob2o$25b2ob2o2bo88b2o223bo101b2o96b22o2b2o2b22o 40bo2bo3bo17bo3bo2bo13bo3b2obob3obob2o3bo2bo5bo3bo2bo2b2o4bo3b5o3bo4b 2o2bo2bo3bo5bo2bo3b2obob3obob2o3bo13b2o2bobo4bo73b2ob2o3b2o5b2o110bob 4o$5bo20bo4bo513bo2bo19bo4bo19bo2bo40bo5b19o5bo11bobo7bo6bo2b3o2bo2bo 3b3o4b2o7b2obo5bob2o7b2o4b3o3bo2bo2b3o2bo6bo7bobo8b4ob2o3b2o70b2ob2o3b 2o5b2o113b3o$4b3o22b2ob2o27b2o487b18o2b2o2b18o45b2o27b2o17bo4b3o2bo3b 2o6bo3b2o2b2ob2obo2b2o4b7o4b2o2bob2ob2o2b2o3bo6b2o3bo2b3o4bo13bo10b2o 65b2ob2o3b2o5b2o118b2o$3b3obo20b4o30bo43bo437b2o3bo18b6o18bo3b2o47b15o 24b2o6bo3bo4bobo3b2o7bo9b3o9b3o9bo7b2o3bobo4bo3bo6b2o12bo72b2ob2o3b2o 5b2o127b2ob3o$2bo3bo22b2o28b3o43bobo95bo346b18o6b18o45b2o5bo15bo5b2o 16b2o3bo17bo2bo3b2o3b6o2bob9obo2b6o3b2o3bo2bo17bo3b2o18bo61b2ob2o3b2o 5b2o132b3o3bo$b2o2bo2bo50bo44b2obo94b3o325b2o18b2o16bo4bo16b2o53b15o 28bo15bobo3b2o7bobobo19bobobo7b2o3bobo15bo19b2o58b2ob2o3b2o5b2o138b3o$ 3o2b4o95b2o95b3obo324bobo18bob15o6b15obo52b2o15b2o42bobo4b2o11bo3b11o 3bo11b2o4bobo90b2ob2o3b2o5b2o145bobobo$2bo3bo2bo95b3o21b2o69bo3bo325bo 20bo16b6o16bo51bo2b15o2bo50b2obo7bo17bo7bob2o43b3o48b2ob2o3b2o5b2o152b 4o$2bo6bo96bo22b2o68b2o2bo2bo343bo3b14o6b14o3bo49b3o17b3o65b9o58bo2b2o 42b2ob2o3b2o5b2o160bo$4bo2bo62bo36bo2bo87b3o2b4o344bobo14b2o2b2o14bobo 49bo4b15o4bo133bo39b2ob2o3b2o5b2o163b2o$6b2ob2o58bobo32bo6bo88bo3bo2bo 341b2o3b14o6b14o3b2o47b5o15b5o66b5o97b2ob2o3b2o5b2o165bo2bo$6bo14b2o 47bo33bo6bo88bo6bo346bo14b4o14bo22bo24b4o6b15o6b4o24bo35bo5bo62bo2b3o 23b2ob2o3b2o5b2o181b2o$21b2o44b3o34bo4b3o90bo2bo348bo2b12ob2ob12o2bo 21b3o7bo8bo5b2obob6o15b6obob2o5bo8bo7b3o33bob5obo61b3o2bo18b2ob2o3b2o 5b2o179b3o3bobo$67bo30bo105b2ob2o389bo9b2o2bo5b3o6b3o3bo2bo8b15o8bo2bo 3b3o6b3o5bo2b2o9bo21b2o3bo3b2o61b2o16b2ob2o3b2o5b2o183bo4bo3bo$97b3o 104bo14b2o318b2o12b2o4b11o2b11o4b2o8b3o8bob2o6bob2o4b2o2bo3bo4b6o15b6o 4bo3bo2b2o4b2obo6b2obo8b3o20bo2bo3bo2bo60b2ob2o9b2ob2o3b2o5b2o193b2o$ 5b2o16b2o71b2ob2o118b2o193bo124bobo13bo2bo24bo2bo9b2obo7bo2b4o5b3o2b2o 7bob4o6b15o6b4obo7b2o2b3o5b4o2bo7bob2o18bob2o5b2obo59b2o7b2ob2o3b2o5b 2o193bo5bo$7bo14b5ob3o64b2obobo297b2ob2o6bob2o2b2o122bo14bo4b8o8b8o4bo 8b3o9bobob2o5b3o2bob8o6b2obo17bob2o6b8obo2b3o5b2obobo9b3o18bobo2b3o2bo bo62bobob2o3b2o5b2o28b3o$5b2o14bo5bo2bo47bo15b3o2b3o296b2o8bob5o143b2o 7b2o4b2o7b2o12b3o6b3o3bob4o2b2o3bo9b5ob2o2b17o2b2ob5o9bo3b2o2b4obo3b3o 6b3o17b2obob5obob2o65b2o5b2o36bo$22b2ob5o47bobo15bo6bo100b2o193b2obobo 5bo4b2o140b2o2bob4o10b4obo2b2o11b2o2bo2bo6b2ob2o3b2o2b2o3bob3o11bo15bo 11b3obo3b2o2b2o3b2ob2o6bo2bo2b2o95bo4b2o42bo81bo$23b3o52bo17b5obo102bo 195bobo11bobo138b2obo8b6o8bob2o15bob2o7bobo3b2o8bob2o4bobo6b15o6bobo4b 2obo8b2o3bobo7b2obo22bob2o3bo3b2obo63bo42b2o85b2o$75b3o19b4ob2o99b2o 197b2o153b4o2b2o3b6o3b2o2b4o17b2obo5bo3bo17bo3bo29bo3bo17bo3bo5bob2o 23bobo9bobo107bob2o81bobo5bo$11bo63bo26bo312b3o6b2o132bobo3bo3b2o2b2o 3bo3bobo63b11o69bo11bo12bo188b2o$11b2o88bo125b2o195b2o30bo101b2obo3bo 10bo3bob2o62bo11bo92b2o91bo4bo81bobob2o3bobo$3b3o4bob2o213b2o228bo90b 2o11bo3bo10bo3bo66b11o93bobo90b6o79b2o7bo$10bobo10b2o184bo245b3o90bobo 6bo3b2obo12bob2o3bo60b2o11b2o93bo90b2o2bobo7bo68b2o5bo4bo52bo$10b2o10b 2obo60bo122b2o337bo9b4o2bo3bo4bo3bo2b4o60bo2b11o2bo93bo96bo4bo2bo68b6o 2bo2bo52b2o$22b2obo59bobo113b3o4bob2o352bo3bo4bo3bo65b3o13b3o89bobob2o 80b3o3bo2bo5bo3bo3bo130bobo$24bo61bo108b3o10bobo214b2o137bo12bo64bo4b 11o4bo89bob4o81bo6bo6b2o5bo$83b3o108bo13b2o214bo2bo137bobo6bobo65b5o 11b5o102bo75bo2b2o6b2o2b2o2bo128b3o5b2o$16bo66bo110bo3bo225bo2b2o3b2o 178bo24b4o6b11o6b4o24bo51b2o8bo9b2o72b4ob2obo6bo3bo70bobo51b2ob2ob5ob 2o2b2o$14b3o175b2o3b2o225bob2o4b2o47bo129b3o7bo8bo5b2obob6o11b6obob2o 5bo8bo7b3o50bobo3b3o11bobo68bo4bo6bob2o2bo74b4o45b2ob2o3b2o3b3obo2bo$ 9b2o3bo176bo2bobo2bo221bo2bobo52bobo118bo9b2o2bo5b3o6b3o3bo2bo8b11o8bo 2bo3b3o6b3o5bo2b2o9bo39bo3bo5bo11bo68bobo10bo3b2o77bo40b2ob2o3b2o8bo2b 3o$9b2o3b2o84bo2bo87bo2bobo2b2o220b2o57b2o75b2o40b3o8bob2o6bob2o4b2o2b o3bo4b6o11b6o4bo3bo2b2o4b2obo6b2obo8b3o41b2o18bo67bo5bo5b2o3b3o112b2ob 2o3b2o5b2o6bo5bo$15bo3bo84bo88b2ob2o2bo203b2o14bo136bobo38b2obo7bo2b4o 5b3o2b2o7bob4o6b11o6b4obo7b2o2b3o5b4o2bo7bob2o44bo12bobob2o72bo4bo2bo 80bo2b2o26b2ob2o3b2o5b2o8bo3bo9b2o$16b2obo80bo3bo89bo4bo204b2o9b2o2b2o 136bo40b3o9bobob2o5b3o2bob8o6b2obo13bob2o6b8obo2b3o5b2obobo9b3o41bo16b ob4o61bob3o2bo3bo87bobobo21b2ob2o3b2o5b2o14bo3bo2b2o3bobo$15bo85b4o92b 2ob2o213b2o2bo178b3o6b3o3bob4o2b2o3bo9b5ob2o2b13o2b2ob5o9bo3b2o2b4obo 3b3o6b3o41bo29bo52bo5bobobo2bo2b2o82bo3bo16b2ob2o3b2o5b2o25bob2o4bo$ 14b2ob3o176b4o92b3o114bo6bob2o179b2o2bo2bo6b2ob2o3b2o2b2o3bob3o11bo11b o11b3obo3b2o2b2o3b2ob2o6bo2bo2b2o31bo6b3o10b2o8bo9b2o54bobo10b2o86bo 12b2ob2o3b2o5b2o25bob2ob3o2bo$15b3obo177b2o93bo114b4o6b2o184bob2o7bobo 3b2o8bob2o4bobo6b11o6bobo4b2obo8b2o3bobo7b2obo34b5o3bo12bobo3b3o11bobo 52b2ob2o4b2o4bob2o81b3o7b2ob2o3b2o5b2o19b2o14b3ob2o4b2o$16bo276bo112bo 3bo193b2obo5bo3bo17bo3bo25bo3bo17bo3bo5bob2o29bo4b2o4bo5bo9bo3bo5bo11b o57b2o8bo2bo81bo4b2ob2o3b2o5b2o25b2o16bobo5b2o$16b3o372b3o11b3ob2o238b 7o73b2o3b2o8bo2bo12b2o18bo51bo2bo2bo2bo3bo4bo84b2o3b2o5b2o29bo17b2obo 4bo$17b2o371bo3bo11bo2bo238bo7bo72bobo3bob2o3bo2bo18bo12bobob2o49bobo 4bo2bo92b2o5b2o53b4obo$197bo193b2o14b2o157b2o81b7o77b3o4bobo3bo14bo16b ob4o46bo2bo3bob2obob3o90b2o37b2o4b3o4b2o4bo4bob2o$198bo194b2ob2o168bob o78b2o7b2o75b2o26bo29bo36bo3bo3bo5bo55b2o75bo3b2o2b2o5bo3b2obob2o2bo$ 196bo2bo195b2o169bo79bo2b7o2bo77bo13bo6b3o10b2o8bo9b2o34bo3bo4bo3b2o 51b3o4bo74bo2bob2o5b2o2bo3b3o6bo$199bo445b3o9b3o64b2o6bo3bo12b5o3bo12b obo3b3o11bobo33bo7bob2obo2bo50b2obo2bo73bo4bo7b3ob2o2bo2bobo$196b2o2bo 183bo259bo4b7o4bo63bobo5bo10bo4b2o4bo5bo9bo3bo5bo11bo25b3o4bo2bo12bo 56bo74bo7bo2bob2o3b3o9bo$197bo2b2o166b2ob2o6bob2o2b2o257b5o7b5o63bo6bo 3bo6b2o3b2o8bo2bo12b2o18bo22b5o3bo2bo5bobo58bo4b2o79b2o6b2o8b7o$195bo 3b2o167b2o8bob5o229bo24b4o6b7o6b4o24bo36bo3b4o7bobo3bob2o3bo2bo18bo12b obob2o19bo78b3o2bobo76b3ob2o2b2o3b4obobo5bo$368b2obobo5bo4b2o227b3o7bo 8bo5b2obob6o7b6obob2o5bo8bo7b3o34bo3bo2bobo10b3o4bobo3bo14bo16bob4o18b o2b2ob3o3bo3bo2bo62bo4bo74bo8b4ob2o10bo$195bo2b3o170bobo11bobo33b2o12b o166bo9b2o2bo5b3o6b3o3bo2bo8b7o8bo2bo3b3o6b3o5bo2b2o9bo23bo3bo15b2o26b o43b3obobo2b2obo63b4obobo74bobo7b5o$197bob2o171b2o46bo2bo9b3o139b2o24b 3o8bob2o6bob2o4b2o2bo3bo4b6o7b6o4bo3bo2b2o4b2obo6b2obo8b3o22bobo20bo 13bo6b3o10b2o8bo25bo2bo3bo5b2o34b2o25b2obob2o73bobo7bo2bo$197b2o186b3o 31bobobo8bo142bobo22b2obo7bo2b4o5b3o2b2o7bob4o6b7o6b4obo7b2o2b3o5b4o2b o7bob2o13b3o4bo3bo7b2o6bo3bo12b5o3bo12bobo3b3o27b3o3bo5bo37b2o31b3o69b obo12bo$182b3o234bobob2o7b2o141bo24b3o9bobob2o5b3o2bob8o6b2obo9bob2o6b 8obo2b3o5b2obobo9b3o13bo5b3o10bobo5bo10bo4b2o4bo5bo9bo3bo5bo23b2obo6bo 2bo37bo32bob2o5b3o60bobo$106b2o74b3o7bobo222b2obo3bo175b3o6b3o3bob4o2b 2o3bo9b5ob2o2b9o2b2ob5o9bo3b2o2b4obo3b3o6b3o14bo4bobo2b2o6bo6bo3bo6b2o 3b2o8bo2bo12b2o40bo37bo35bo2bo6bo59bobo$106b3o72bo3bo5bo2bo12b2o208bo 2bob3o5bo57bo112b2o2bo2bo6b2ob2o3b2o2b2o3bob3o11bo7bo11b3obo3b2o2b2o3b 2ob2o6bo2bo2b2o11b2o4b3ob2o13bo3b4o7bobo3bob2o3bo2bo18bo17b3o6b2o7b3o 36bobo33b2o2bo5bo59bobo$106b2obo72b2ob3o4bobo7bo4b2o205b2obobobo2bo4bo bo57bo115bob2o7bobo3b2o8bob2o4bobo6b7o6bobo4b2obo8b2o3bobo7b2obo15bobo 4b2o15bo3bo2bobo10b3o4bobo3bo14bo23b2ob5o6bo2bo38b2o31bo3bo3b2o60bobo$ 110bo13bo57b2o4bo5b2o6bo211bo2bo5b2o5b2o2b2o51b3o116b2obo5bo3bo17bo3bo 21bo3bo17bo3bo5bob2o16bo7bo15bo3bo15b2o26bo19bob2o3bo2bo6b2obo2b2o35b 2o35b2o2bo60bobo$102bo3b2o3bo12bo60bo2bo205bo20b2o4bobo10b2o215b3o64bo 4bobo13bobo20bo13bo6b3o25b2obob2o7b4ob2o34b3o36bo2bo4b2o53bobo$112bo 11bo61b2o204b4o21b5obo226bo3bo63b2o4bobo4b3o4bo3bo7b2o6bo3bo12b5o3bo 21b3o3b2obo2bo3b2obo2b2ob2o35b2ob3o33bobo3bobo52bobo$109bobo279b2o2bo 21bo4bo15bo145b2o65b3o64b4o3bobo3bo5b3o10bobo5bo10bo4b2o4bo5bo24bo4bob 5obo5bo39bo2bo33b2o5bo51bobo$109bo280bob4o22b4o16b3o29bobo111bobo62b2o 3b2o52b3o5b2o4bo3bobo3bo4bobo2b2o6bo6bo3bo6b2o3b2o8bo2bo16bobo5bobo3bo bobo8bo43bo32b3obo53bobo$104bo4bobo13bo259bo4b5o24bo21bo28b2obo110bo 63bo2b3o2bo51bo6b2obo2bobo3bobo4b3ob2o13bo3b4o7bobo3bob2o3bo2bo27bo8bo 6b2o44bo34b3o26bo25bobo$123b2ob2o4b2o81b2o168bo7b2o22bo22b2o31b3o37bo 124b3o7b2o5b2o7b3o42bo2b3ob3o3bobo3bobo4b2o15bo3bo2bobo10b3o4bobo3bo 16bo2bo12b4o51b2o34bo2bo2b2o21b2o23bobo$108b4o20b2o76bo4b2o157b2o16b3o 22b2o51b2o4bo34bobo123bo2bo10b3o10bo2bo43bo11bobo3bobo4bo15bo3bo15b2o 27b2obo11bo56bo6bo27b2obo4b2o19bobo22bobo$108b2o12bobo84bob2o161b2o17b 3o74bob5o35b2o112bo13bo4b6o3b6o4bo49bo9bobo3bobo3bobo13bobo20bo25bobo 11bo2b2obo52b2o4b2o27b2o4bo4b2o39bobo$122bo3bo82bo3bo153b2o24b2o77bo 153b3o11bo3bo6b3o6bo3bo38b2o10bobo7bobo3bobo3bobo4b3o4bo3bo7b2o6bo3bo 23b2o15b4obo57bobo5bo25bo5bobo13b2o23bobo$122b2o2bo9b2o71b2o2bo152b2o 26b2o75bo3b2o152bo7bobo4b2o3b2o3b2o3b2o4bobo34b2o8b2o3bo8bobo3bobo3bob o3bo5b3o10bobo5bo48bobo50bobo11b2o20b5o7bo13b2o22bobo$123b3o9bo73b2ob 2o154bo93b2o6bo3bobo151b2o12b2o7b3o7b2o41bo5b2o10b2o3bobo3bobo3bobo3bo 4bobo2b2o6bo6bo3bo45bobo42b2o8b2o2bobo4bobo11b2o9b2o3b2o7b3o30bobo$ 124bo5bo2bo42b3o27bo3b2o250b2o6b2o3bo8b2o107b2o47b3ob2o9b2ob3o45b2obo 10bobo3bobo3bobo3bobo4b3ob2o13bo3b4o48bo43b2o9bobob2o17b3ob2obo2bo4bob 2o8bo9b2obo16bobo$130bo2b5o38bobo25b2o108b2o167bo2bo106bobo46bo3bob4ob 4obo3bo42b2o4b2o9bo6bobo3bobo3bobo4b2o15bo3bo2bobo43bobo44bo15bo2b2o 12bob2o3bo4b2ob3o10bo11b4o14bobo$130b2ob4o39bobo26b2o106bobo14b3o150b 2obo106bo109bob2o4bo13bo4bobo3bobo3bobo4bo15bo3bo48bo43b2o14b2o4b2o17b o2b2obobo2bo5bo2b2o11b2o3bo13bobo$136b2o38bo4b2o132bo16bo49b2o102bob2o 140bo10b2o9bo9b2o38b4o4bobo12b2o4bobo3bobo3bobo3bobo13bobo46bobobo45bo 19bobo9b3o4bo2b2o6b2o3b2o2bo9bo2bo17bobo$136b3o36b3o3b2o148bo50b2o96b 2o4bobo131b2o8b4o18bo48b2o4b2o16b4o3bobo3bobo3bobo3bobo4b3o4bo3bo44bo 72b3o2b2ob2ob3o3bobo4bo12bo5bo23bobo$117b3o16b3o42bo195b3o80b2o17bobo 3b2o2bo131bo12bo16bobo46b2o2bo10b3o5b2o4bo3bobo3bobo3bobo3bobo3bo5b3o 46bo3bo45bo2bo20b3obo2bo3b3o3bo6bo8b2o2bobo3b2obo3b2o14bobo$112b2o3bob o6bo27bo22b4o196bo83b2o18bo6b2o129bo11b2obo5b2o59bo2bo10bo6b2obo2bobo 3bobo3bobo3bobo3bobo3bo4bobo2b2o2b2o39b2o50b2o5b2o13bobo2bo4bo5bob4ob 2o12b2ob2obobo3b2o13bobo$112b2o2bo3bo3b2ob2o25bo23b2o176b3o19bo81b2o 155b4o10b2o6bo2bo8bobo47bo14bo2b3ob3o3bobo3bobo3bobo3bobo3bobo4b3ob2o 6bobo37b2o53bo5b2o13bo6bobo4b2o6bo10bo8bo5bo13bobo$99bobo14bo2bobo6bo 24bobo22bo177bo259bo4bo8bo7bobobo9bo48bo3bo12bo11bobo3bobo3bobo3bobo3b obo4b2o9bo38bo53bobo4bo22bobo13bo17bo6bo12bobo$98bo25bo3bo25b2o2bo11b 2o185bo244b2o11bob5o6b4o5b3obo60bo18bo9bobo3bobo3bobo3bobo3bobo4bo12bo 35bo54bo2b2o31bo5b3o11bo2bo8b2o12bobo$99bo2bo15b3o4b3o25bo5bo9bo2bo6bo 121b3o93b2o5b2o196bobo10bobo4b2o8bo6bo64b2o4b2o10bobo7bobo3bobo3bobo3b obo3bobo3bobo10b3o91b2o35b4obo11bob2o20bobo$101bobo15bo33bo5bo10b2o5bo bo123bo4b2o88bo5b2o196bo11b2o5bo2bo2bo3b2o5b2o69b2o8b2o3bo8bobo3bobo3b obo3bobo3bobo3bobo100bo42b2o15bo19bobo$104bo48bo4bo12bo4b4o122bo6b2o 25b3o59bobo213bo2bobobob2o3bo2b2o5b2o53b3o4b2obo7bo5b2o10b2o3bobo3bobo 3bobo3bobo3bobo3bobo4b3obobo87bobo39bob2o15b2o17bobo$103b3o51bo13bo3b 4o129bo29bo60b2o213b3obo2bo7b2o62bo6bo3bo10b2obo10bobo3bobo3bobo3bobo 3bobo3bobo3bobo3bo2b2obo86bobo36bo3b3o17bo16bobo$76b3o24bo12bo2bo34b3o 13b2obo4bo158bo65b2o209bo3bob2o72bo5bo4bo6b2o4b2o9bo6bobo3bobo3bobo3bo bo3bobo3bobo4b2o88bobo37b2o21bo16bobo$74b7o6bo13b2o13bo2bo49b2o216b3o 12bobo209b2obobo76bo5b2o6bob2o4bo13bo4bobo3bobo3bobo3bobo3bobo3b2o2bo 2bo2bo84bobo41b2o34bobo$73b9o4bo16bo12b2o55bo213bo15bo23bo187bobobo75b 2ob2o9b4o4bobo12b2o4bobo3bobo3bobo3bobo3bobo5b3ob2o85bobo41bobo33bobo$ 72bo7b3o2b2o14bo2bo47b2ob2o12bob3o199bo14bo38b2o19bobo164bo2bo18b2o69b 2o4b2o16b4o3bobo3bobo3bobo3bobo3bobo4b2o3b2o83bobo77bobo$73b3o6bo3bo2b o11bobo53bo12bo2bo198b2o52bobo19b3o69bo90b2o3b2o10b2o5b2o2bo54bo12b2o 2bo10b3o5b2o4bo3bobo3bobo3bobo3bobo3bobo4bo5bo81bobo45bo$74b2o11b3o11b o50b2o16b3o199bobo67b2o5bo32b2o37bo89bobo14b2o5b2o3bo45b2o2bo3bo2bo10b o2bo10bo6b2obo2bobo3bobo3bobo3bobo3bobo3bobo8bo81bobo45b2o31bo$77bo10b o65b3o244b3o38b2o32bo5b2o35b3o89bo16bo6bo49b2o4bo2bo13bo14bo2b3ob3o3bo bo3bobo3bobo3bobo3bobo3bobo11b2o75bobo45b2o31bobo$78bo18b2o206bo94bobo bo70b3o148bob3o5b4o47b2obo17bo3bo12bo11bobo3bobo3bobo3bobo3bobo3bobo5b 2o3bobo73bobo46b2o31b3ob3o3b2o$79bo17b2o206b2o91b3o3b3o24b2o42bobo147b obobo7bo51bobobobo13bo18bo9bobo3bobo3bobo3bobo3bobo3bobo4bobo2bo74bobo 48bo31b2obo2bo2bobo$304bobo90bo4bo4bo24bo192bo2bo6b2o53b2o19b2o4b2o10b obo7bobo3bobo3bobo3bobo3bobo3bobo11bo70bobo49bo32bo3bo5bo$168b2o127b3o 97bob2o2bob2obo21bo102bo92b2o62b2o24b2o8b2o3bo8bobo3bobo3bobo3bobo3bob o3bobo10b3o67bobo49bo28bo2bob2o5bo$171bo127bo98bo2b4obobo19b4o99b2ob2o 97bo2bo54bo8b3o4b2obo7bo5b2o10b2o3bobo3bobo3bobo3bobo3bobo3bobo78bobo 49bobo26bob3o4b2o2bo$168bo2bo126bo100b2o4b2ob2o17bo4bo100bo11bo88b2o 64bo6bo3bo10b2obo10bobo3bobo3bobo3bobo3bobo3bobo3bobo4b3obobo65bobo52b o26bobo2bo3bo3bo$169b2o230bo2bobobo2bo14bobobobo110bobo2b2o70b2o15b2o 62bo5bo4bo6b2o4b2o9bo6bobo3bobo3bobo3bobo3bobo3bobo3bo2b2obo64bobo52bo $169b2o183b2o45b4ob2o2b2o2b2o10bobo4b2o109b2obo2bo69bobo11b2ob2o64bo5b 2o6bob2o4bo13bo4bobo3bobo3bobo3bobo3bobo3bobo4b2o66bobo53b2o$97b3o58b 2o8bo2bo181b2o50bo8b2o2b2o5b2o4b2o2bo98b2o11b2ob2o62b2o4bo13b2ob2o17b 2o44b2ob2o9b4o4bobo12b2o4bobo3bobo3bobo3bobo3bobo3b2o2bo2bo2bo62bobo 53bobo$94b2obobo58b2o8bo176b2o8bo47bobo12bobo3bo2bobo2bob2o97bo2bo11bo 39b2o23bo2bo18bob2o16bo2bo56b2o4b2o16b4o3bobo3bobo3bobo3bobo3bobo5b3ob 2o63bobo$94bo2bobo69b3o172b2o57b2o14bo3b3o3bo2bo99b2o3bo10b3o38bo13bo 10bobo18bob2o17bobo42bo12b2o2bo10b3o5b2o4bo3bobo3bobo3bobo3bobo3bobo4b 2o3b2o61bobo57bo$83bob2o5b3o95bo155bo16bo60bo2bobob2o31b2o66bo4bo51bob o9bo2bo5b4obo21b2o4b2ob2o4b2o3bo35b2o2bo3bo2bo10bo2bo10bo6b2obo2bobo3b obo3bobo3bobo3bobo3bobo4bo5bo59bobo57b2o21b2o$77b2o4bobo3b2ob2o94b2o 172b2o52b2o7b2obobo13bo18b2o67bo3bo53b2o9bo3bo4b2ob2o17bo2bo2bo4b2ob2o 5bob2o35b2o4bo2bo13bo14bo2b3ob3o3bobo3bobo3bobo3bobo3bobo3bobo8bo59bob o57b2o16b3o4bo$77b2o6b2ob3o2bo8bo86b2o79b2o90bobo52bo8bobobo13bobo17b 2o67bo2bo58b2o3b2o3bo7bo17bo7bo3bo3b2o6bo38b2obo17bo3bo12bo11bobo3bobo 3bobo3bobo3bobo3bobo11b2o53bobo58b2o17b2obo2bo$100bobo166bobo142b3o9bo 2bo14b2o36b2o50bo61bob2obob2o21b3o2bo8b2ob2ob2o7bo40bobobobo13bo18bo9b obo3bobo3bobo3bobo3bobo3bobo5b2o3bobo51bobo60bo22bo$70bo9bo2bo16bo170b o142bo12b2o19bo33bobo111bob2o2b3o20bo3b3o4bo5b5o50b2o19b2o4b2o10bobo7b 2o4bobo3bobo3bobo3bobo3bobo4bobo2bo52bobo61bo18bo4b2o$79bo3bo82b2o279b o36bo65bo45bo20bo13b2o2bo2bobo4bo51b2o24b2o8b2o3bo14bobo3bobo3bobo3bob o3bobo11bo48bobo52b2o7bo19b3o2bobo$66bo7bo8bo82b2o279b3o34b2o3b2o55bo 3bo46b2o19bob2o8bo3bo18bo2b2o2b2o36bo8b3o4b2obo7bo5b2o15b2o4bobo3bobo 3bobo3bobo3bobo10b3o45bobo49b3ob3o5bobo21bo4bo$66bo8bo2bo3b2o378b2o24b o2bo55bo2bo59b3o2bo2bob4obo3bo22b5obob2o45bo6bo3bo10b2obo11b2ob4o4bobo 3bobo3bobo3bobo3bobo56bobo49b2o3bo9bo18b4obobo$65bo4b2o3bo3b2obo282b2o 95b2o23bo2bobo50b2o2b2ob2o58b2obobobo10bo14bo7b2ob2o52bo5bo4bo6b2o4b2o 4b3o3bo3bo7bobo3bobo3bobo3bobo3bobo4b3obobo43bobo46bobo2bo2b2ob2o5bo 20b2obob2o$66bobo6bo289bobo119bob2o2bo49b2o3bobo50bo7bo3b2o4b6o18bo6b 2o3bo2b4o48bo5b2o6bob2o4bo5bo5bobo10bobo3bobo3bobo3bobo3bobo3bo2b2obo 42bobo47b4obo6bo5b2o26b3o$66bob2o295bo119b3o3b2o56bo50b2ob2o4bo3bo5b7o 3bo12b2obo5b2ob3o3bo4b2o42b2ob2o9b4o4bobo5bo5b4o9bobo3bobo3bobo3bobo3b obo4b2o44bobo48bo2bob2o10bobo25bob2o5b3o$484bo3b3o108bob4o5bo2bo12bo 14bo3b2o4b2ob2o9bobo54b2o4b2o11b2ob2o2b2o3b2o4bobo3bobo3bobo3bobo3b2o 2bo2bo2bo40bobo48b2obo3b2o4bo33bo2bo6bo$46b3o22bo226b2o184b4o2bo107bob o10bo15bobo5bo4bobo24bo40bo12b2o2bo16bo6bobobo6b2o4bobo3bobo3bobo5b3ob 2o41bobo47bo2bobo8b2o6bo25b2o2bo5bo$44b7o6bo239bobo188b2o108bo2bo25bo 6b2o4bo2bo23b2o31b2o2bo3bo2bo10bo2bo16bob2obo2bo3bo12bobo3bobo3bobo4b 2o3b2o39bobo47bo4b3ob5o2bo5b2o24bo3bo3b2o$43b9o4bo242bo184b4o2b3o106b 2o27bo12b2o56b2o4bo2bo13bo39b2o4bobo3bobo3bobo4bo5bo37bobo48bo4bo9bo5b 2o29b2o2bo$42bo7b3o2b2o427bo3b2o2bo131b5o3b3o2bo63b2obo17bo3bo31b2ob4o 4bobo3bobo3bobo8bo38b2o50bo3bo3bo2bob2o5b2o30bo2bo4b2o$43b3o6bo3bo2bo 198b3o218b2obobob2o2b2o132b2ob2o5bobobo64bobobobo13bo28b3o3bo3bo7bobo 3bobo3bobo11b2o87b2o9bo7bo31bobo3bobo$44b2o11b3o200bo167bo50bob2obobo 2bo138b2o5bo2bo65b2o19b2o25bo5bobo10bobo3bobo3bobo5b2o3bobo28bo51bo4b 2o2b2o14bo32b2o5bo$47bo10bo65b3o132bo167bobo53bo4b2o134b2ob2o7b2o66b2o 47bo5b4o9bobo3bobo3bobo4bobo2bo28bo2b4o47bo2b3o4bob2o3bo6bo33b3obo$48b o75bo302bobo53bob3o136b4o77bo8b3o4b2obo30b2ob2o2b2o3b2o4bobo3bobo3bobo 11bo29bo2bo44b2obo5b5obob2o6bobo34b3o$49bo75bo228b2o72bo55bo2bo138bo 87bo6bo3bo30bo6bobobo6b2o4bobo3bobo10b3o22b2obo2b2o44b3o2b2ob2ob2ob2o 12bo34bo2bo2b2o$353b2o130b2o228bo5bo4bo29bob2obo2bo3bo12bobo3bobo29b2o 2b2o26b3o20bo4bobo21bo34b2obo4b2o$355bo277bo83bo5b2o51b2o4bobo3bobo4b 3obobo16bobo28b2o3bo18b6o3bobo4b2o12b2o34b2o4bo4b2o$379bo252b4o80b2ob 2o51b2ob4o4bobo3bobo3bo2b2obo13bobo3bo28bo3b2o20b2o7bo16bobo38bo5bobo$ 64b2o312b2o159bo84bo6b2ob2o130b3o3bo3bo7bobo3bobo4b2o16bo9bo24bo5bo24b o3bo53b5o7bo$378bobo157bobo83b2o4b2o83bo50bo5bobo10bobo3b2o2bo2bo2bo 11b2o8bob2o21b2o4b2obo9bo6b3o3bo4bo18bo25b2o9b2o3b2o7b3o$62b2o2bo37b2o 2bo429b2o91b2ob2o71b2o2bo3bo2bo48bo5b4o9bobo5b3ob2o11bob3o10bo20bo6bo 2b2o6b2ob2o2b2ob2o3b5o18b2o25b3ob2obo2bo4bob2o8bo$62bo3b2o39bobo428bo 9bo16bo16bo39bo2b3o3b5o70b2o4bo2bo53b2ob2o2b2o3b2o4bobo4b2o3b2o14bo10b 2o23bo2b2o13bo2b2obo2bob2o12b2o6b2o24bob2o3bo4b2ob3o10bo$106bo16bo415b obo5bo9bo6bo9bo6bo39bobobo4b2o2bo73b2obo58bo6bobobo6b2o5bo5bo7b3ob2o 12bo23b2ob2o9b3o2bo4bo5b2o10bob2o5b2o29bo2b2obobo2bo5bo2b2o$62bob2o57b o415bobo4b2o7b2o6b2o7b2o6b2o39bo2bo5bo79bobobobo53bob2obo2bo3bo17bo25b o27bo18bobobobob3o12bo4bobo22b3o4bo2b2o6b2o3b2o2bo$53bob2o6bo5bo38b2o 13bo413b4o5bo8b2o6bo8b2o6bo5b2o2bo31b2o7bobo77b2o77b2o57b5o19bo2bo18b 3o3bo13b2ob2ob2ob2ob3o3bobo4bo12bo$47b2o4bobo3bo8bo467bobo6b4o13b4o13b 4o3b2o2bo42bo77b2o73b2ob4o6b2o42b2o2b3o2bo25bobo16bo3bo2b2o2b2ob5o3b2o 2bo3b3o3bo6bo8b2o2bobo$47b2o6b2ob2o8b3o38b2o12b2o49bo361bobo5bo5b3o2bo bo3bo5b3o2bobo3bo10b2o39b2ob2o77bo67b3o3bo3bo8bobo38b2obo2b2obo29bo21b o3bobo2bo2b2o3bo3bo4bo5bob4ob2o12b3o$108bo13bo2bo46b2o362b4o4b6o4bo2bo 3b6o4bo2bo3b11o4b2o35b2obo146bo5bobo51bo2bobo3bo43b2o3b2obo4bo2bo15bob o4b2o6bo10bo4b2o$106b2ob2o11bobo6b2o7b3o30b2o364b2obo9bo3bo12bo3bo17bo 3bo185bo5b4o47bo5b5o26b3o14bo2b3obobo3bo19bobo13bo13bo2b2o$109b2o10b2o 7bo2bo6bo393b2o3b2ob10o3b14o3b20o191b2ob2o2b2o3b2o40bo5bo2bo2bo25b3o 54bo5b3o16bo3bo$107bo13bo9b2o8bo391b3obo3bo12bo16bo22bo189bo6bobobo41b o48b3o2bo8b2obo32b4obo11b3o5b2o$124b2o409bob58o3bo35b2o148bob2obo2bo3b o43b3o34b2o5b2o3bobo2bo8bo35b2o22bob2o$124b2o406bo2b2o57b2obobo34bo 207bo34b2o6b4o4b2o4bo3bo33bob2o18b2o5bo$55b2o67b2o390bo14bobo3b57obobo 37b3o205bo33bo21bo3b5o25bo3b3o18bo5bobo$55b2o64b2obo389b2o13b2o2bo66bo 36bo203b2o46b3o10bo2bob2o24b2o25bo2bo$122b3o389b2o13bo2b67o297b2obo2bo 3bo29b2o22b3obo$123bo15b2o373bobo12b3o68bo2b2o2bo279b2o3b2o4bob2o33bob o23bo3bo$138bo2bo387bo2b68o3b2o2bo275b2obo3bo2bo2b2o62b2o4bo$111b2o26b 2o369bob2obobo12bo75b2o274bo8bo4b3o38bo28bo$509bob2ob3o13b76o4b2o266bo 7b2o5bobob2o37b2o26b2o$110bo3bo393b2ob2o95bo3bo49bo16bo198bobobo4bo4b 2o41b2o$115bo393bob2ob3o13b79o52bobo14bobo196bo3bo2bo3bob2obo4b2o35b2o $108bo7bo393bob2obobo7bobo2bo80bo49bobo14bobo200bob3o5b2o5b2o36bo$107b o4bo412bo2bo2b81o3bo46bo16bo196bo2b5ob2o11bo37bo$108bobobo4bo29b2o7b3o 355bobo6b2o86b2obobo45b2o15b2o194bo2bob2o4b2o2bo7bo36bo$108bo8bo28bo2b o6bo357b2o2bob2ob2o6b80obobo46b3o14b3o194bo2b2o6bo3b2o4b2o36bobo$109bo 4b2obo29b2o8bo356b2o3bo7bo2bo86bo252b3o3bo5b2o52bo$110bob2ob3o398bo3b 4o4bob86o44bob2o13bob2o191bo4b3o2b3o3b3o44bo$111b3ob2o403bo3bob4o87bo 2b2o2bo34b2obo13b2obo191bo5bo5b2o2b2o46b2o$89bo65bo363b2o2bo5bob86o3b 2o2bo36bobo14bobo188bo6b2o4b2o2b2o46bobo$88b3o63bobo360bo2bo9b2o91b2o 36bobo14bobo184b2o2b5o2bo6bo3b3o$154bobo358b2o15b91o4b2o31bo16bo187b2o 2bo2b5o3bo4bob2o47bo$88b3o64bo359b2o3bo104bo3bo31bo16bo191bo5bobo2bo3b o49b2o$89b2ob2o421b2o15b94o33b2o15b2o185bo3bo2bo7bo2bo3bo48b2o$91bo58b 2o365bo2bo9b2o96bo25b4ob2o10b4ob2o184b2o11bo2bo5bo49b2o$149bo2bo366b2o 2bo5bob98o3bo21bo2b3o11bo2b3o190b2o7b2o57bo$135bo14b2o368bo3bob4o98b2o bobo4bo20bo16bo187bo11b2o57bo$135b2o379bo3b4o4bob98obobo5bobo5bobo6b3o b3o10b3ob3o186b2o11bo3b3o50bo$134bobo377b2o3bo7bo2bo103bo2b2o6bo13b2o 15b2o185b2o12bo5bo49bobo$89b2o423b2o2bob2ob2o6b102o4bo3bob2o9bo2b3o11b o2b3o186b2o10b2o2bo2bo52bo$66b3o20b2o423bobo6b2o109bo3b3o2b2o9b4o2bo 10b4o2bo180bo3bo12b2ob2o54bo$65bo3bo21bo433bo2bo2b103o3bo4b2obo13bo2bo 13bo2bo178bob3o12bo2b2o54b2o$64bo4bo8b2o9bobo292bo125bob2obobo7bobo2bo 108b5obobo11bobo14bobo178bo17bo2bo54bobo$64bo2bobo7b4ob2o5bo293b2o124b ob2ob3o13b108o3bo20bo16bo181b2o13bobo$64b2obobo6bo3b3ob2o5b2o290bobo 122b2ob2o126b3o13b2obo3bo9b2obo3bo180bo10b2o3bobo56bo$66b2obo2bo4b2obo 2b3o4b3o416bob2ob3o13b108o3bo12bo2b2o12bo2b2o195b2obo59b2o$68b2o2bo8bo 3bo3b2o2bo416bob2obobo7bobo2bo108b5obobo6b2o7bo7b2o7bo188bo3bobo57b2o$ 44bo24b3o9b4obo2b2ob2o431bo2bo2b103o3bo4b2obo9bobob4o9bobob4o186b3o4bo bo57b2o$43b3o15bo21b3o4b3o421bobo6b2o109bo3b3o2b2o220bobo66bo$42b2ob2o 14bo23bo428b2o2bob2ob2o6b102o4bo3bob2o10bo16bo27b2obo161b2obo65bo$41b 2o3bo7b4o3bo452b2o3bo7bo2bo103bo2b2o6bo10bo16bo25bob3o162b3o64bo$42bob obobo5bo3bo44bo412bo3b4o4bob98obobo5bobo5bobo6b3o14b3o25bob2o163b2o64b obo58bo$43b2obo2bo4b2o3bo43bo416bo3bob4o98b2obobo4bo16b2o15b2o24bobo 233bo58b2o$46b2obo7b3o44bo414b2o2bo5bob98o3bo65bobo12b2obo216bo58bobo 5bo$47b2o10b2obo26b2o11b2o413bo2bo9b2o96bo25bo2bob3o9bo2bob3o19b2o12bo b3o55b3o27b3o128b2o65b2o$60b3o26b2o9b4o411b2o15b94o28b4obo11b4obo24b3o 8bob2o55bo3bo25bo3bo126bobo55bobob2o3bobo$61bo37bo2bo412b2o3bo104bo3bo 24bo5b2o9bo5b2o22b3o7bobo56b2o4bo11bo11bo4b2o181b2o7bo$99bo2bo256bo16b o16bo16bo16bo16bo16bo16bo36b2o15b91o4b2o26b7o10b7o24bo7bobo55bobob2ob 2o3b4ob2ob2ob4o3b2ob2obobo126bo51b2o5bo4bo$100b3o255bo9bo6bo9bo6bo9bo 6bo9bo6bo9bo6bo9bo6bo9bo6bo39bo2bo9b2o91b2o30bobo14bobo26b2o8b2o55b2ob o4bob2ob4o7b4ob2obo4bob2o124b2o52b6o2bo2bo$351bo5b2o7b2o6b2o7b2o6b2o7b 2o6b2o7b2o6b2o7b2o6b2o7b2o6b2o7b2o6b2o41b2o2bo5bob86o3b2o2bo31bo16bo 27bo2bo9b3o50bo4bo3bo4bo2b2obobob2o2bo4bo3bo4bo122b2o$350bobo4bo8b2o6b o8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo5b2o36bo3bob4o87bo2b2o2bo 30bob2o13bob2o25bo12b3o62bo4bo7bo4bo134b2o$343bo6bo5b4o13b4o13b4o13b4o 13b4o13b4o13b4o13b4o3b3obo29bo3b4o4bob86o40b3o14b3o25bo2bo11bo50b2o7b 2o6bo7bo6b2o7b2o123bo$97b2o243bobo4bo2bo2bo5b3o2bobo3bo5b3o2bobo3bo5b 3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5bo4b3o26b2o 3bo7bo2bo86bo83b4o9b2o217bo53bobo$97b2o243bo6b3o3b6o4bo2bo3b6o4bo2bo3b 6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b14o3bo22b2o2bob2ob2o 6b80obobo41b2o15b2o26b2o11bo2bo65b2o7b2o138bo54b4o$330bo10bo2bo3bo14bo 3bo12bo3bo12bo3bo12bo3bo12bo3bo12bo3bo12bo3bo17bo4bo3b2o2bo13bobo6b2o 86b2obobo39b2o3bo11b2o3bo21b2o12bo70bo5bo139bobo56bo$329bobo9b3o3b16o 3b14o3b14o3b14o3b14o3b14o3b14o3b23obo3b2o2bo24bo2bo2b81o3bo46bo16bo19b 3o12bo2bo65bo2bo3bo2bo139bo$49b2o271bo5b2o5bo4bo5bo18bo16bo16bo16bo16b o16bo16bo31b2o9bob2obobo7bobo2bo80bo47b2ob2o12b2ob2o18bobo12b4o66bo2bo bo2bo139bo48b3o3bobo4b3o$49b2o270bobo6bo4bo3b160o10bob2ob3o13b79o51bob 2o13bob2o19b2o12b2o71bobo142b2o47b2ob2o2b2o6bo$305b3o7bo5bobo4b2o4bo3b o161bo7b2ob2o95bo3bo36bobo8bobo14bobo19b2o12b2o70bobobobo139bobo52b2o 7bo$305b2o2bob2ob2o5bo6b3o2b2obob164o7bob2ob3o13b76o4b2o32b2o2bo2bo8bo bo14bobo22bo9b3o69b2obobob2o191b2o2bo3b2o$307b3o4bo10bo5bo148bo22bo6bo b2obobo12bo75b2o35b3obo3bo47bo12bobo68bo3bobo3bo139bo55bo2bo$305bo2bob o3bo3bob2o2bo3bo8b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b2o3b3ob3o2b2o 3b2o3b3o2b2o26bo2b68o3b2o2bo36b2o2bo13b2o15b2o21bo10b2o217b2o55bo2bo4b 2o$304bo4bo4bo2bo3bob2o3bobob2ob2o4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo 4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bobob2obobo4bobob2obob2o4bo 13bobo12b3o68bo2b2o2bo43bo2bobo5bo4b3obobo5bo4b3obobo7b3o11b2o69b2ob2o b2ob2o137b2o57bobo3bobo$304bo4bo4bo2bo3bob2o3bobob2ob2o4bo4bo4bo4bo4bo 4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bobob 2obobo4bobob2obob2o4bo13b2o13bo2b67o51b5o3bo4bo3b5o3bo4bo3b5o3bo5b2o 15bo215b2o58b2o5bo$57b2o246bo2bobo3bo3bob2o2bo3bo8b3o2b3o2b3o2b3o2b3o 2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b3o2b 3o2b3o2b3o2b3o2b3o2b2o3b3ob3o2b2o3b2o3b3o2b2o11b2o13b2o2bo66bo51bo6bo 2bo13bo2bo13bo18bo71bo3bo3bo139bo58b3obo$57b2o248b3o4bo10bo5bo148bo22b o12bo14bobo3b57obobo51bo2b6obo3b12obo3b12obo3bo17bo68bo3bo3bo139bo60b 3o26bo$305b2o2bob2ob2o5bo6b3o2b2obob164o30bo2b2o57b2obobo44bobobobo47b 2obo9b3o217bo61bo2bo2b2o21b2o$305b3o7bo5bobo4b2o4bo3bo161bo34bob58o3bo 41b2o2bob4ob47obobo9b2o73b3obo139bobo59b2obo4b2o19bobo$321bobo6bo4bo3b 160o34b3obo3bo12bo16bo22bo44b2ob2obo53bob3o2bo78b2o2b3o140bo60b2o4bo4b 2o$322bo5b2o5bo4bo5bo18bo16bo16bo16bo16bo16bo16bo31b2o33b2o3b2ob10o3b 14o3b20o48bo5b53o3b3obo3bo73bo2bo3b2o138bo65bo5bobo13b2o$329bobo9b3o3b 16o3b14o3b14o3b14o3b14o3b14o3b14o3b23obo3b2o2bo38b2obo9bo3bo12bo3bo17b o3bo43b2o59bo10b2obo13bo2b2o51bob2obo2bo138b2o60b5o7bo13b2o$330bo10bo 2bo3bo14bo3bo12bo3bo12bo3bo12bo3bo12bo3bo12bo3bo12bo3bo17bo4bo3b2o2bo 35b4o4b6o4bo2bo3b6o4bo2bo3b11o4b2o45bo5b65obobo13bo2b3o49b2obo3bobo 137bobo51b2o9b2o3b2o7b3o$342bo6b3o3b6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b6o4b o2bo3b6o4bo2bo3b6o4bo2bo3b6o4bo2bo3b14o3bo44bobo5bo5b3o2bobo3bo5b3o2bo bo3bo10b2o48b2ob2obo66bob3o2bo8bo4bo52bobobob2o190b3ob2obo2bo4bob2o8bo 9b2obo$342bobo4bo2bo2bo5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3b o5b3o2bobo3bo5b3o2bobo3bo5b3o2bobo3bo5bo4b3o48bobo6b4o13b4o13b4o3b2o2b o49b2o2bob66o3b3obo3b5o55b2obo137bo7bo49bob2o3bo4b2ob3o10bo11b4o$343bo 6bo5b4o13b4o13b4o13b4o13b4o13b4o13b4o13b4o3b3obo50b4o5bo8b2o6bo8b2o6bo 5b2o2bo53bobo66bo10bob2o58bo2bo3bo130b2o5b2o54bo2b2obobo2bo5bo2b2o11b 2o3bo$350bobo4bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo8b2o6bo5b2o 55bobo4b2o7b2o6b2o7b2o6b2o65b77o61b2ob2obobo129bobo4b2o48b3o4bo2b2o6b 2o3b2o2bo9bo2bo$351bo5b2o7b2o6b2o7b2o6b2o7b2o6b2o7b2o6b2o7b2o6b2o7b2o 6b2o7b2o6b2o61bobo5bo9bo6bo9bo6bo203b2obo3bo17bo71bo47b2o37b2ob2ob2ob 2ob3o3bobo4bo12bo5bo$358bo9bo6bo9bo6bo9bo6bo9bo6bo9bo6bo9bo6bo9bo6bo 60bo9bo16bo16bo64b77o61b2o22b3o69b3o36bo2bobo3bobo24b2ob2ob2ob5o3b2o2b o3b3o3bo6bo8b2o2bobo3b2obo3b2o$359bo16bo16bo16bo16bo16bo16bo16bo59b2o 104bobo66bo10bob2o56b2o4bo16b2ob3o20b3o9b3o9b3o20b3ob2o33bob3obo3bo13b 2ob2ob2ob5o3b2o2bo2b2o3bo3bo4bo5bob4ob2o12b2ob2obobo3b2o$538bobo99b2o 2bob66o3b3obo3b5o56bo5bo17bo2bob2o4bo4bo7bo3bo7bo3bo7bo3bo7bo4bo4b2obo 2bo34bo2bo3bo2bo2b2o2b2ob5o3b2o2bo2b2o3bo3bo15bobo4b2o6bo10bo8bo5bo$ 539bo99b2ob2obo66bob3o2bo8bo4bo55bo15b2obo4bobob2ob2ob3o5b2o3b2o5b2o3b 2o5b2o3b2o5b3ob2ob2obobo4bob2o33bo2bo4bo3bobo2bo2b2o3bo3bo28bobo13bo 17bo6bo$640bo5b65obobo13bo2b3o53b2ob2o13b2obobo2bobo7b4o3b2obobob2o3b 2obobob2o3b2obobob2o3b4o7bobo2bobob2o36bo2bo2bo3bo2bo48bo5b3o11bo2bo8b 2o$639b2o59bo10b2obo13bo2b2o53b4o15bo8b3obobob2o2b2ob2ob2ob2ob2ob2ob2o b2ob2ob2ob2ob2ob2ob2o2b2obobob3o8bo36b2o7bo56b4obo11bob2o$640bo5b53o3b 3obo3bo73b2o4bo13b2o7b2o12bobo3bobo3bobo3bobo3bobo3bobo3bobo12b2o7b2o 32b2ob2o3b2o62b2o15bo$549b3o87b2ob2obo53bob3o2bo77bo2b2o126b3o3b2obo7b o58bob2o15b2o$192bobo354bo2b3o85b2o2bob4ob47obobo9b2o77bo17b3o15b2ob2o b2ob2ob2ob2ob2ob2ob2ob2ob2ob2ob2ob2o15b3o27b3o2bo4bo2b2o5bo3bo50bo3b3o 17bo$191bo2bo291b2o2b2o57b5o90bobobobo47b2obo9b3o71bo3b2o16bo3bo69bo3b o25b3ob2o6bo3bob2obo3b2o49b2o21bo$190b2o231bo2b2o57b2o65b2o95bo2b6obo 3b12obo3b12obo3bo17bo72bo17b2o4bo11b45o11bo4b2o24bo3b3o4bobobo2bo3bobo bo27b2o23b2o$189bo4bo227bo63bob2o55b2o105bo6bo2bo13bo2bo13bo18bo72b2o 2bo15bobob2ob2o3b3o2b2obo4bo8bo6bo6bo8bo4bob2o2b3o3b2ob2obobo23bobo7b 2o5b5o33b2o21bobo$188b4o2bo164b2obo59bo4bo54bo6bo55bobo102b5o3bo4bo3b 5o3bo4bo3b5o3bo5b2o15bo71b3o14b2obo4bob2ob3obo49bob3ob2obo4bob2o22b3o 4bo2b3obo2bo2bo33bo$187bo171b5o58bob2o56bo62bob2o3bo98bo2bobo5bo4b3obo bo5bo4b3obobo7b3o11b2o73bo3bo11bo4bo3bo4bobo4bo4bobob4obobob2obobob2ob obob4obobo4bo4bobo4bo3bo4bo29b2o2bobo6b2o28b2o27bo$187b3obo2b2o100bo 61bo3b2o55b2ob3o56bo6bo57bo6bobo88b2o2bo13b2o15b2o21bo10b2o72bo3bo23bo 5b2o47b2o5bo34b2o3b2o14bo30bo25b2o$149bo35bo6bobo100b5o59b2o57b6o58b2o bobo59b7obo87b3obo3bo47bo12bobo73bo3bo10b2o7b2o65b2o7b2o22b2o4bob2o67b 2o$146b4o35b8o2bo98bo5bo58b2o56bo4b2o58b2o5bobo152b2o2bo2bo8bobo14bobo 22bo9b3o74bobo116b4o5bo4bo39bo2bo23b2o$146b2o35bo10bobo34b3o61b2o57b4o 60b2ob3o60b8o57b5obo36b2ob2o52bobo8bobo14bobo19b2o12b2o75b2o53b3o60bob o3bo4b5ob3o37b2o5b2o16bo$144bo38b11o2bo34bo2b3o59bo2bo54bo3bo60b2o6bo 103bo16bo4bobo10bo13bo2bo7bo2b2o64bob2o13bob2o19b2o12b2o118b2o9bobo9b 2o20b3o7bob2o13b2o3b2obo6b2obo2bo39bo5b2o15bo$144b4o33bo14bob2o31b5o 55b2o61b2o2b2o61b7o58b6o39bo15bob2obo12b5o10bo3bob3obo4b2o62b2ob2o12b 2ob2o18bobo12b4o97bo10bo7b2o9bobo9b2o22bo6bo3bo13b2o14b2ob2o38bobo4bo 16bo$143bo37b14obobo35b2o54b2ob2o61bo3bo2bo120b2o3bobo10bo14b2o8b4obo 14bobo14b2o4bo8bo9b2o4bobo64bo16bo19b3o12bo2bo98b2o8bobo41b2o7bo7bo4bo 23b3o2bo3b3o38bo2b2o17bobo$142b3o2bo31bo16bobo28b2o62bob2o62b7o59b5o 38b3o15b2obo13bobo12b4o3b2o2b3o17b2o16bo4bo8b3o5b2o3b6o58b2o3bo11b2o3b o21b2o12bo95b2o3b2o9b2o43bob2o4bobo7b2o15bo2bo5bo3b5o45b2o19bo$143b3o 33b18obo28bobo62bo3bo2bo121b2o4bo11bo20bo3bo18bo4bo11bo3b3o11b3ob2o2bo 2bobobo18b2o3b2o3bo3b2o9b2o2b2o4bo13bo54b2o15b2o26b2o11bo2bo91b2o62b2o 2bob3o4bobo17bobo10bo5bo40bo22bo$144bo32bo18bobob2o25bob2o3bo58b7o59b 5o37bob2o15b2obo13b2o3bo9b4o4bo2b2o2bo16bo10b2o4bob3o9b3o2b2obobo2b3ob 2o2bo15b3obo5bo3bo6b2o2b2o2b2ob3ob15o98b4o9b2o89bo5bo61b2o2b2o3bo24bo 11b3o2bo40bobo21b2o$145b3obo27b19o2bo29bo6bobo120bo4bo11b2ob2o17b2obo 2b2o14bo4bo12b2o2bo10bo3bo2bo5bo3bobo12bo4bo3b6o3b2o10bo2bo3bo15bo5bob o4bo2bob2o2b2o4bo6b3o28bo2bo49b3o14b3o25bo2bo11bo86bobo22bo37b2o9b2ob 4ob2o10b2o6bo10b4o44bobo3bo17bobo$145bo2b2o25bo20bobob2o27b7obo57b5o 38b2ob2o13b2o2bo13bo14b2o5b4o3bo16b4o13b4obo8b2o4bob4ob2ob3obo16b2o2bo 5bo10bo3b2o2bo2b2ob15o4b2ob2obobo5bo2b7o4b2ob2ob31o48bob2o13bob2o25bo 12b3o87b2o2b2o5b3o6b2o2bobo36b2o10b7o11bobob3obo12bo44bobo4b2o$146b3o 26b21o2bobo93bo4bo11b2obo18bo3b3o16bo3bo12b2ob2o10b2ob2o3bo4bobo2bo14b 4o5b4o16bo2bo3bobo13bo6b2o3bo3bo2bobobo4bo7b2o2bo4bo20bo7bo6bo12bobo3b o34bo2bo44bo16bo27bo2bo9b3o90bobo7bo7b2ob2o36bo32bo2bo2bo5b7o44bobo4bo bo18bo$148bo24bo24bob2o29b5obo36b2ob2o14bob2o13bo2b3o9b2o6b2ob2o18b4o 14bo3bo9bo2b2o3b4ob4obobo15b2o3b2o2b2o10bo3bo2bo3b2ob15o3bob3o3bobo4bo 2bob5o4b2o4b43ob14obob39o3bo39bobo14bobo26b2o8b2o29b3o27b3o34bo6bo7bo 32b3o4bo31b2o4bo2b3o53bobo25b2o$146bo26b24obobo20bo8bo4bobo10bo13bo2bo 7bo2b2o14b2ob2o13bo2b2obo8bobo4bo3b2obo3bo23b2o8bo9bo2bo2bobo13bo2bo3b 2o3b2o4b2obobo2bo8bobo2bo4bo23bo4bo6bobo12bobobo106bo2bo35b7o10b7o24bo 7bobo27bo2b5o19b5o2bo42b3o35b2o4b3o31bobobobobo3bob2o3bo44bobo4b2o19b 2o$146bobo22bo26bobo19b5o4bob2obo12b5o10bo3bob3obo4b2o14b2o15b2o13bob 2o4b3o3b3obo16b2o3b2o2b2o3bo11b3o3b2ob15o2bo3b2o3b4o5bo2b6o3bo4bob57ob 110o2bo34bo5b2o9bo5b2o22b3o7bobo26bo3bobob2o17b2obobo3bo41bo38bobob3o 16bo14b2o5b2o10bo45b2o5b2o19b2o$145bo25b28obo18bo5bo3bobo14b2o4bo8bo9b 2o4bobo18bobo2bo7b3o9bo5bobo4bo8bob2o3b2obob2o2b3o2bo2bobobo6b3o2b2o 27bo11bobo12bobo177bob2o29b4obo11b4obo24b3o8bob2o24bo6bo21bo6bo42bo36b o22bobo10bo2b2obo5bo4bo43bo35bo$146bobo20bo28bobob2o16b2o7b2o16bo4bo8b 3o5b2o3b6o17bo4bob2obo3b3o4bobo2b2o2b3ob18o3b2obob2ob2o2bobobobob3o2bo 3b2o3b42ob13ob182o29bo2bob3o9bo2bob3o19b2o12bob3o25bo6bobo13bobo6bo86b obo16bo10b2o2bo12bo43b3o2b2o6bo3b2o6bo11bo$146bo22b29o2bo20bo2bo9b2o3b 2o3bo3b2o9b2o2b2o4bo13bo4b2ob2o2bob3o2b2obo5b2o4bo4bo39bo3bo10bobo3bo 244bo69bobo12b2obo22bobo6b2ob2o11b2ob2o6bobo83bob2o26b3o4bo2b2ob2o2b2o 47bo2b2o2bobobo2bo5b2o9bo$148bo18bo30bobob2o12b2o16b3obo5bo3bo6b2o2b2o 2b2ob3ob15o3b2ob3obo4bobo2bob6o3b2o3bob40ob14ob251o25b2o15b2o24bobo37b 2obob2o3b2obobo9bobob2o3b2obob2o36bo47bo27bo6bo5bobo45bo3bo4bo2b2o3bob 2o3bobo8bobo$146b3o18b31o2bobo12b2ob2o5bobo4bo2bob2o2b2o4bo6b3o28bo12b obobo10bobobo312bo2bo20b3o14b3o25bob2o34bobobob2o6bob2o7b2obo6b2obobob o34b3o45bob2o28bo3bo6bo2b2o41b2obo3bo15bo14bo$145bo2b2o15bo34bob2o12bo b2o4b2ob2obobo5bo2b7o4b2ob2ob44ob11ob2ob316o22bo16bo25bob3o32b2o3bo2bo 3b2obo3bo5bo3bob2o3bo2bo3b2o32b2ob2o44bo32bo2bobo4b2ob2o39b3o7bo2bo12b o12bo$145b3obo15b34obobo14bo3bo7bo6bo12bobo3bo379bo2bo16bo16bo27b2obo 31bo3bobo2b2o4b2o13b2o4b2o2bobo3bo81b2o38bo2bo2bo40b2o9b2o9bo2bo12b2o$ 144bo18bo36bobo15b19ob14obob384o99bo11bobob2o5b2obobo11bo33bobobobo2bo 75b4ob2obo3bo33b2o2bo2bo9bo26bobo$143b3o17b38obo452bobob4o9bobob4o45bo 9b2o14b2o11b2o14b2o9bo19b2o3bo3b3o72bobo4bo3bo36b2o2bo2bo$142b3o2bo13b o38bobob2o12b19ob14obob384o15b2o7bo7b2o7bo43b3o22b4o2bo5bo2b4o22b3o18b 2o3bo6bo77b2o40b2o4b2o8bo2bo26bo$143bo17b39o2bo14bo3bo7bo6bo12bobo3bo 379bo2bo15bo2b2o12bo2b2o46b2ob3o25bobo5bobo25b3ob2o26bobo78b2o45b2o11b 2o24b2o$144b4o11bo40bobob2o10bob2o4b2ob2obobo5bo2b7o4b2ob2ob44ob11ob2o b316o21b2obo3bo9b2obo3bo43bo2bob2o4bo4bo9b2o2bo9bo2b2o9bo4bo4b2obo2bo 25bobo36b3o4b3o33bobo34b2o4bo3bobo8b2obo24b2o$144bo14b41o2bobo10b2ob2o 5bobo4bo2bob2o2b2o4bo6b3o28bo12bobobo10bobobo312bo2bo28bo16bo40b2obo4b obob2ob2ob3o8b2o15b2o8b3ob2ob2obobo4bob2o23bo2bo76b3o34b3o2b2obob2obo 6b3o27b2o$146b2o9bo44bob2o10b2o16b3obo5bo3bo6b2o2b2o2b2ob3ob15o3b2ob3o bo4bobo2bob6o3b2o3bob40ob14ob251o29bobo14bobo41b2obobo2bobo7b4o7bobo2b o7bo2bobo7b4o7bobo2bobob2o26bo34bobo4bobo34bo34bo3b3ob2obo2b8o29bo$ 146b4obo5b44obobo16bo2bo9b2o3b2o3bo3b2o9b2o2b2o4bo13bo4b2ob2o2bob3o2b 2obo5b2o4bo4bo39bo3bo10bobo3bo244bo30bo2bo13bo2bo40bo8b3obobob2o2b2o5b 2obob2o7b2obob2o5b2o2b2obobob3o8bo61bobo4bobo68bo6b2o8b2o3bo29bo$149b 2obo2bo46bobo15b2o7b2o16bo4bo8b3o5b2o3b6o17bo4bob2obo3b3o4bobo2b2o2b3o b18o3b2obob2ob2o2bobobobob3o2bo3b2o3b42ob13ob182o29b4o2bo10b4o2bo41b2o 7b2o11bo8b2ob2o7b2ob2o8bo11b2o7b2o18bo120bo5bo6b3o34bo$151b2o2b48obo 14bo5bo3bobo14b2o4bo8bo9b2o4bobo18bobo2bo7b3o9bo5bobo4bo8bob2o3b2obob 2o2b3o2bo2bobobo6b3o2b2o27bo11bobo12bobo177bob2o29bo2b3o11bo2b3o64b2o 5b2ob2ob2o5b2ob2ob2o5b2o39bobo41bo2b2o2bo69b2o3bob2o6bo3b2o29bobo$152b 2o48bobob2o12b5o4bob2obo12b5o10bo3bob3obo4b2o14b2o15b2o13bob2o4b3o3b3o bo16b2o3b2o2b2o3bo11b3o3b2ob15o2bo3b2o3b4o5bo2b6o3bo4bob57ob110o2bo39b 2o15b2o60b2obob2o27b2obob2o35bo3bo39b2obo2bob2o69bob2o2bo6bo37bo$153b 49o2bo16bo8bo4bobo10bo13bo2bo7bo2b2o14b2ob2o13bo2b2obo8bobo4bo3b2obo3b o23b2o8bo9bo2bo2bobo13bo2bo3b2o3b2o4b2obobo2bo8bobo2bo4bo23bo4bo6bobo 12bobobo106bo2bo34b3ob3o10b3ob3o59b2o2bobo5b3ob3o5b3ob3o5bobo2b2o35b3o 40bo8bo62b2o2b2o7bo6b2o35bo$202bobob2o23b5obo36b2ob2o14bob2o13bo2b3o9b 2o6b2ob2o18b4o14bo3bo9bo2b2o3b4ob4obobo15b2o3b2o2b2o10bo3bo2bo3b2ob15o 3bob3o3bobo4bo2bob5o4b2o4b43ob14obob39o3bo43bo16bo60bo2bo2bob2o23b2obo 2bo2bo80bo4bo63bo2bo8b3o3bobo2bob3o29bo$153b49o2bobo87bo4bo11b2obo18bo 3b3o16bo3bo12b2ob2o10b2ob2o3bo4bobo2bo14b4o5b4o16bo2bo3bobo13bo6b2o3bo 3bo2bobobo4bo7b2o2bo4bo20bo7bo6bo12bobo3bo34bo2bo42bo2b3o11bo2b3o59b2o 5bob2o4b3o9b3o4b2obo5b2o32b2o3b2o39b2o4b2o62bob2o2bo5b2ob8o2b3o28bob2o 4b2o$152b2o50bob2o21b7obo57b5o38b2ob2o13b2o2bo13bo14b2o5b4o3bo16b4o13b 4obo8b2o4bob4ob2ob3obo16b2o2bo5bo10bo3b2o2bo2b2ob15o4b2ob2obobo5bo2b7o 4b2ob2ob31o47b4ob2o10b4ob2o52b3o11bobo5bo11bo5bobo11b3o24bo3bobo3bo 109bo2b2obo3bob2o5b2o34b3o5b2o$151b2o2b48obobo21bo6bobo120bo4bo11b2ob 2o17b2obo2b2o14bo4bo12b2o2bo10bo3bo2bo5bo3bobo12bo4bo3b6o3b2o10bo2bo3b o15bo5bobo4bo2bob2o2b2o4bo6b3o28bo2bo52b2o15b2o51bo3bo9b2ob2o4bo11bo4b 2ob2o9bo3bo22b2o3bobo3b2o35bobo4bobo63bo2bobo5b3o2bo2bo36b3o3bo$149b2o bo2bo48bobo20bob2o3bo58b7o59b5o37bob2o15b2obo13b2o3bo9b4o4bo2b2o2bo16b o10b2o4bob3o9b3o2b2obobo2b3ob2o2bo15b3obo5bo3bo6b2o2b2o2b2ob3ob15o58bo 16bo49b2o4bo47bo4b2o20bo5bobo5bo33bo2bo4bo2bo77bo43b2o$146b4obo5b48obo 20bobo62bo3bo2bo121b2o4bo11bo20bo3bo18bo4bo11bo3b3o11b3ob2o2bo2bobobo 18b2o3b2o3bo3b2o9b2o2b2o4bo13bo58bo16bo49bobob2ob2o3b5ob3o2b2o13b2o2b 3ob5o3b2ob2obobo20bob2obobob2obo33b2o10b2o54b4ob3o2b2obo8bo4b2o36b3o$ 146b2o9bo46bobob2o17b2o62bob2o62b7o59b5o38b3o15b2obo13bobo12b4o3b2o2b 3o17b2o16bo4bo8b3o5b2o3b6o63bobo14bobo45b2obo4bob2ob3o8b2o13b2o8b3ob2o bo4bob2o65b2o3bo2bo3b2o60bobo3b2o13b2o$144bo14b45o2bo27b2o54b2ob2o61bo 3bo2bo120b2o3bobo10bo14b2o8b4obo14bobo14b2o4bo8bo9b2o4bobo63bobo14bobo 44bo4bo3bo4bo3b4o3bo15bo3b4o3bo4bo3bo4bo66bo3b2o3bo56b2o4bo2b2o3b2o2bo 3b3ob2o40bo$144b4o11bo44bobob2o21b5o55b2o61b2o2b2o61b7o58b6o39bo15bob 2obo12b5o10bo3bob3obo4b2o62b2obo13b2obo57bo6bo3b3o7bo7b3o3bo6bo29bo12b o34b2o8b2o56bo3bo3b4obo2bo5bobo41b3ob2o$143bo17b43o2bobo22bo2b3o59bo2b o54bo3bo60b2o6bo103bo16bo4bobo10bo13bo2bo7bo2b2o64bob2o13bob2o44b2o7b 2o8bo12b3o12bo8b2o7b2o17bo12bo32bo2bobob2obobo2bo55bobo7bo2bo2b2obo50b 2o$142b3o2bo13bo44bob2o21b3o61b2o57b4o60b2ob3o60b8o57b5obo36b2ob2o153b 3o3b5o3b3o41bobo10bobo31bo2b2o6b2o2bo55bob2o6b2obob2o2bo44bob2obo$143b 3o17b42obobo85bo5bo58b2o56bo4b2o58b2o5bobo169b3o14b3o51bo7bo7bo3b2ob2o 3b2ob2o3bo7bo7bo24bo12bo33bo12bo58bo7b2o52bo$144bo18bo42bobo86b5o59b2o 57b6o58b2obobo59b7obo106b2o15b2o50b3o5b3o5b2o4bobo2bo2bobo4b2o5b3o5b3o 23bo12bo35b2o6b2o59bo10bo4b2o47bo$145b3obo15b42obo87bo61bo3b2o55b2ob3o 56bo6bo57bo6bobo106bo16bo25b2o15bo7b5o3b5o3b5o2bobobobobobo2b5o3b5o3b 5o7bo15bo3b4o3bo37bo6bo72bob3obo39bobo5bo$145bo2b2o15bo40bobob2o147b5o 58bob2o56bo62bob2o3bo108bobo14bobo25bo14b3ob3ob2o3b2ob2o3b2ob2o3b2obob obobobobob2o3b2ob2o3b2ob2o3b2ob3ob3o18b4o40b2o2b2o2b2o69b3o5bo10bo16b 2o6bo3bobo5b2obo$146b3o18b39o2bo150b2obo59bo4bo54bo6bo55bobo113bobo14b obo24bo3bo10b2o3b3o3b2o2bobo2bo2bobo2b2obobobo5bobobob2o2bobo2bo2bobo 2b2o3b3o3b2o13b4o4b4o40b2o70bobo2bo3b2o8bo3b2o2bobo12b2o2bobob2o2bo7bo b3o$148bo18bo38bobob2o210bo63bob2o55b2o115bo16bo18b2o4bob4o9b2o5bo6bo 3bobobobobobobobobob2o3b2obobobobobobobobobo3bo6bo5b2o64b2o69b3o11b2o 3b2o2bo3bo3bo6bo3bo3b2o3bo2b2o5bo2b2o2bo$146bo22b37o2bobo212bo2b2o57b 2o65b2o145bo4bobo11b2o4b2o3b2o2bobobobobobobobobobobobo2bo2bobobobobob obobobobobobo2b2o3b2o4b2o13bo6bo112bo6bo7b2o3b2o9bo2b2o3bo3bobo6bobo 15bo$146bobo20bo38bob2o274b2o2b2o57b5o145bob2obo3b2o9bo21bobobobo3bobo bobobobobobo3bobobobo21bo15b2o2b2o44bo70b2o3bo8bo4bo4bo3b2o3bo4bo13b3o 13bo$145bo25b36obobo338bo2b3o145bobo2bo3bo8b2o23bobo4b2obobobobobobob 2o4bobo23b2o59b2o3bo72b2obo8bo4b2o3bo5bo2b3o2bo3b3obob2o2bo2bo11b2o6bo $146bobo22bo36bobo338b3o146bobo3bo2bo8b2obobo20b2ob2o4bobobobobobobobo 4b2ob2o20bobob2o57bo2b2ob2o71bobo9bobo2bo2bo3bo7bo2bobo2bo3bobo25b2o$ 146bo26b36obo487b2obo2bob3o8bobob2o7b3o10bobo5bobobo5bobobo5bobo10b3o 7b2obobo10bo11bo37b2ob2o82bob5o3b2obo13b2o7bob4o13b4o2bobo$148bo24bo 34bobob2o487bob3o3bo4b2obobo3bo5bo2bo5b5obob4obobobo2bo2bobobob4obob5o 5bo2bo5bo3bobob2o7bo11bo44bo65bo14b2o2b2o3bobo10bo3bo5bob2o2bo15b5o$ 146b3o26b33o2bo487b2obobob2o2bo4b2o3bo12bo4b2obobo3bobo2bobobo5bobobo 2bobo3bobob2o4bo12bo3b2o6bobo9bobo40bobobo65bo35bo2bo6bo2bo19bo3bo$ 145bo2b2o25bo32bobob2o467bo16b2obobo3bob2o3b3obo3b2o4bo3bo3b2obo6b3o2b obobob3obobobo2b3o6bob2o3bo3bo4b2o3bob3o56bo3bo3bo64b3o35bobo33bo$145b 3obo27b31o2bobo467b4o6bobo8bo4b2o2bo2b2o13bo3bo2b2o4bo3bobobobobobobob obobobobobobo3bo4b2o2bo3bo13b2o4bo3bo7bo3bo34b2ob2o94bo21bo3bo$144bo 32bo32bob2o465bob4o4bo7bob2obobo3bo23bo3bobo4bo4b2obobobobobobobobob2o 4bo4bobo3bo23bob6ob6obo92bo26bobo9b2o26bo$143b3o33b30obobo465b2o7bobo 7b2obobo2b2ob2o19bobo6bo9b2obobobo5bobobob2o9bo6bobo19bo7bobo7bo33b3ob 2obo48bobo26b2o11b2o21bobobo$142b3o2bo31bo30bobo70b5o391b2o3b4o6bo7bob o2bo29bo13bobobo2bo2bobobo13bo27bo7bobo7bo32bo3bobo2bo33bo14b2o27bo32b 3ob2o$143bo37b30obo70bo4b2obo388bob2o5b5obo5b2ob2obo27b2o11bo2bobobo5b obobo2bo11b2o25bo17bo32bobo2bobob3o30bobo79b2o$144b4o33bo28bobob2o67bo 5bobo384bo5b3obob2o2bo7bo2bo3b2o25bo2bo11bobobobob3obobobobo11bo2bo25b ob2ob2o3b2ob2obo34b4o2bo4bo6b2o21bobo78bob2o$144bo38b27o2bo71bo4bo384b o5b2o4bobobo6b2o2bo5bo29bo9bobobobobobobobobobobobo9bo86bob2o8b2o18b3o b2o75bo3bo$146b2o35bo26bobob2o70bob3o382bo11b2o9bo2b2o3b2obo22b3o4bo 10b2obobobobobobobobob2o10bo4b3o72b4o2b2obo8bo19bo81b4o$146b4o35b25o2b obo73b3o382bo6bo15b2obo6bob2o20bo2bob5o8b2obobobo5bobobob2o8b5obo2bo 25bo7bo38bo2b3o3bo5b2o22b3ob2o77bo$149bo35bo26bob2o457b6o4b2o14bobob3o 2bo20bo3bobobo13bobobo2bo2bobobo13bobobo3bo18b2obobob2o3b2obobob2o33bo bob4o8bo23bob2o$187b24obobo71b2o173b2o217bo2b2o14bo6bobobo20bobo14bo2b obobo5bobobo2bo14bobo17b3obob3o9b3obob3o29b2o119bob3o$187bo24bobo69b2o 174b4o10bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo 2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo81bo20b2o3bobobobo19bo3bobo11bobobobo b3obobobobo11bobo3bo17bo3bobo5bobo5bobo3bo31bobobo8bo2bo100b2o3bo$189b 24obo69bo2bo171b2ob2o9bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 84bo3bo22b2o2bo2bo18b2o3bo10bobobobobobobobobobobobo10bo3b2o21b2o6bobo 6b2o35bobob3o9b2o5b2o33b2o61bo$189bo22bobob2o66bo175b2o11bo3bo3bo3bo3b o3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo79bo3bo23b4obobo19b2o14b2obobobobobobobobob2o14b2o19b2o9bo bo9b2o33bo5bo10bo5b2o19b3o9bobo57b2o$191b21o2bo70b2o186b4o4b4o4b4o4b4o 4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o79bo4b2o5bo5bo5bo5bobo b2o20b2o14b2obobobo5bobobob2o14b2o19b2ob2o15b2ob2o34b5o9bobo4bo23bo11b o27bo29b2o2b2o$191bo20bobob2o72bo174bo210bo2b3ob2o4b2o4b2o4b2o5bo22bo 19bobobo2bo2bobobo19bo22bo15bo40bo12bo2b2o24bo21bo17b2o30bob3o$193b19o 2bobo70bo177b2ob2o9bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo76bo 3b2ob2ob2ob2ob2ob2ob2ob2ob3obo39bo2bobobo5bobobo2bo112b2o45b2o17bobo 30bo$193bo20bob2o70b2o174bo5bo6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o 6b2o6b2o6b2o6b2o6b2o6b2o78bo28bob2o30b2o7bobobobob3obobobobo7b2o101bo 49bobo$195b18obobo247bo5bo6bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bob o5bobo5bobo5bobo5bobo5bobo5bobo5bobo78b28o28b2o3bobo5bobobobobobobobob obobobo5bobo3b2o25b2o13b2o52bobo99bo3bo$195bo18bobo66b6obo174bo10bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo127bo3b2ob2o2bo3bo8b2obobobo bobobobobob2o8bo3bo2b2ob2o3bo17bobo7bobo55bo104bo$197b18obo66bo6bo171b 2obobo3bo3b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o80b28o18b3o2bob2obo5b4o4b2obobobo5bobobob2o4b4o5bob2obo2b3o14bo3bo b2o3b2obo3bo108b2o43bobobo$197bo16bobob2o63bo6bo170bobobobobo2bo2bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo81bo28bo20b2o5b2o2bobo3bo6bo bobo2bo2bobobo6bo3bobo2b2o5b2o18b5o7b5o109b2o5b2o34b3ob2o$199b15o2bo 67bo161b5o9b2obobobobo5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o5b3o5b3o5b3o78bo3b26o20bo2b5o3bobo3b2o3bo2bobobo5bobobo2bo3b2o3bob o3b5o2bo150b2o38b2o$199bo14bobob2o67b2o157bo4bo7bobobobobobobo7bo7bo7b o7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo76bo3bo45b2obo4bob2o4bo6bobobo bob3obobobobo6bo4b2obo4bob2o189bob2o$201b13o2bobo67bo96b2o61bo11b2obob obobobobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2b obo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo76b o3b26o22bob3ob2o2b3obo5b2obobobobobobobobob2o5bob3o2b2ob3obo19bobo11bo bo153bo3bo$201bo14bob2o64bo2b4o91b3o2bo59bo9bobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobob2o74bo28bo17b5o4bo2bo 5b2o3bobobobobobobobobobobobo3b2o5bo2bo4b5o15bo3bobo3bobo3bo85b2o27b2o 37b4o$203b12obobo64bo4b3o84b4ob2o67b2o3b2obo3bobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobob2o75b28o15bobo3bo3bo3bo 2b3obob4obobobobo5bobobobob4obob3o2bo3bo3bo3bobo12bo3b3o3b3o3bo85b2o 27b2o11b2o26bo$203bo12bobo64bo2b2obo84b4o3bo3bobo63bo4bobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobob2o2b2o115b 2ob2o3bobobobo5bo2bo2bob2o2bobo2bo2bobo2b2obo2bo2bo5bobobobo3b2ob2o18b o3bo126b2o5b2o$205b12obo64b2o4b2o5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo 5bo6b2o75bob2o2bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobob obobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobobobobo 3bo79b28o18bo3b2o2b2o2b5o3bobo6bobo5bobo6bobo3b5o2b2o2b2o3bo18bobo5bob o123b2o32bob3o$205bo10bobob2o63b5ob2obo2b2obo2b2obo2b2obo2b2obo2b2obo 2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o2b2o3b3o72bo4bo3bob2o3bo b2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob 2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o78bo28bo17bobo2bo4b2o2bo2b3o2b8o bob3obob8o2b3o2bo2b2o4bo2bobo20bo5bo84b2o71b2o3bo$207b9o2bo68bo2b3o2b 4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4obo6bo73bo4bo3bob2o3b ob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o3bo3bo b2o3bob2o3bo3bob2o3bob2o3bo3bob2o3bob2o77bo3b26o17b2ob2o2b3o2bo5bo2b2o 9bobobobo9b2o2bo5bo2b3o2b2ob2o20b2ob2o85b2o46b2o27bo$207bo8bobob2o230b ob2o2bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3b obobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo3bobobobobobo3bo77bo3bo 51b2o9bo2b2o2b4obobobobob4o2b2o2bo9b2o30bobo90b2o42bobo22b2o$209b7o2bo bo66bo2b3o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4o2b4obo6bo71b o4bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobob2o2b2o70bo3b26o38bo2bo2bo2bobo5bobo2bo2bo2bo39b2obobob2o87b2o 44bo22b2o2b2o$209bo8bob2o63b5ob2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2ob o2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o2b2o3b3o68b2o3b2obo3bobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob2o74bo 28bo38b2o8bob2o2bo8b2o39bo3bobo3bo132bob2o20bob3o$211b6obobo62b2o4b2o 5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo5bo6b2o70bo9bobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobob2o75b28o48bob3o2b obo44b2o5bobo5b2o128b2ob2o21bo$211bo6bobo62bo2b2obo84b4o3bo3bobo58bo 11b2obobobobobobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2b obo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo2bobo2bo 2bobo154bo4bobob3o41bobo5bobo5bobo$213b6obo62bo4b3o84b4ob2o64bo4bo7bob obobobobobo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo78b28o49b2o 4bo4bo41b2o2b2obobob2o2b2o78b2o73bo3bo$213bo4bobobobo59bo2b4o91b3o2bo 58b5o9b2obobobobo5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o5b3o5b3o79bo28bo50bobobob3o42bo3b2obobob2o3bo78b2o77bo$215b3o2bo3b o61bo96b2o76bobobobobo2bo2bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo80bo3b26o47b3obobobobo44b2o5bobo5b2o153bobobo$215bo2bo5b2o61b2o173b 2obobo3bo3b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o78bo3bo68b2obo2bobobobo46bo15bo151b3ob2o$217bo4b2ob3o2bo53bo180bo 10bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo79bo3b26o43bob2o9bo 46bo4bo3bo4bo156b2o$216bo3bobo3b3obo52bo6bo173bo5bo6bobo5bobo5bobo5bob o5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo5bobo77bo28bo 46b4o3b2obo50bo3bo160bob2o$216b3o6bobo55bo6bo173bo5bo6b2o6b2o6b2o6b2o 6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o6b2o79b28o47bo2bob2o2bo51b 2ob2o158bo3bo$214b2obo6b2obo55b6obo174b2ob2o9bo7bo7bo7bo7bo7bo7bo7bo7b o7bo7bo7bo7bo7bo7bo7bo154bo3b2obo215b4o$213bobob2o4b2ob2ob2obobo230bo 212b28o45b3o7bobob2o45b2o5b2o158bo$213bo2b3o5bo4bo58b2o183b4o4b4o4b4o 4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o4b4o80bo28bob2o41bo2b 4obobob2obo45b2o5b2o$213b2ob2o7b4o3bo2bo51bo172b2o11bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo78bo3b2ob2ob2ob2ob2ob2ob2ob2ob3obo39b2obobo5bobo48bo11bo155bo b3o$215b2o10bo4b2obo54bo168b2ob2o9bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo82bo2b3ob2o4b2o4b2o4b2o5bo39b2obob4ob2obo48bobo7bobo153b2o 3bo$285b2o173b4o10bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2b o4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo78bo4b2o5bo5bo5bo5bobob2o 39bo5bo2bob2ob2o43bobo7bobo157bo$233b2o49bo176b2o214bo3bo23b4obobo38b 6o3bo2bobo210b2o$231bo4bo47bo2bo390bo3bo22b2o2bo2bo43bob3o2bo2bo42bobo b2o3b2obobo152b2o2b2o$230bo53b2o393bo20b2o3bobobobo41b3obo3b2o2b2o43b 3ob2ob2ob3o127b2o25bob3o$230bo5bo49b2o392bo2b2o14bo6bobobo41bo3b2ob2o 50bob3ob3obo24b2ob2o99b2o26bo$230b6o437b6o4b2o14bobob3o2bo43b2o4bobo 49b2o9b2o22bobobobo75bo$288b3o382bo6bo15b2obo6bob2o50bob2o47b5ob5o23bo bobobo75b3o47bo3bo$286bob3o382bo11b2o9bo2b2o3b2obo49bo2bo2bo44bob3o2bo bo2b3obo18b2obo2bob2o74bobo51bo$284bo4bo384bo5b2o4bobobo6b2o2bo5bo48b 3obobo45b3o3b2ob2o3b3o17bobo4bo38b2o5b2o32bo15b2o30bobobo$283bo5bobo 384bo5b3obob2o2bo7bo2bo3b2o42b2o3b2o2b2o48bo2b2o3b2o2bo18bo3bobobob2o 36bo5b2o48b2o28b3ob2o$283bo4b2obo388bob2o5b5obo5b2ob2obo40bo2bo2bo2bob o51b2o7b2o19b3obobobo2bo36bobo57b2o28b2o$283b5o391b2o3b4o6bo7bobo2bo 39bobobob2obo2bo84bo2bo2b2o38b2o57b2o27bob2o$678b2o7bobo7b2obobo2b2ob 2o38bo2bo2bob3ob2o50b2obobob2o20b2o51b2o12b2o66bo3bo$679bob4o4bo7bob2o bobo3bo42b2o7bo50bo3bobo3bo18bo2b3o3b3o41bobo12b2o66b4o$680b4o6bobo8bo 4b2o2bo44b2o3bo51b2obobob2o19bobo9bobo39bo19b2o27b2o33bo$681bo16b2obob o3bob2o45bobob2o48bobob2ob2obobo18bobob2ob2obob2o35bo23b2o27b2o$698b2o bobob2o2bo47bobo49bo3bo5bo3bo19bob2ob2obo123bobobo$701bob3o3bo47bobo 50b2o9b2o20bobo3bobo36b3obo63bo19bobo2bo$698b2obo2bob3o46b3ob2o51bo7bo 23bo5bo36bob2o14b2o5b2o40b2o2bobo4b2o2bobo4b2o3bo$698bobo3bo2bo42b2o3b o2bo2bo48bo11bo64b2obo14b2o5b2o5b2o9b2o26b6o2bo2b3o4bo2bobo$700bobo2bo 3bo40bo2b4obob2o46b2o13b2o17b11o32bob3o29b2o9b2o3bo26b5o2bo6bo$699bob 2obo3b2o41b3o3bo2bo47bo2bo9bo2bo17bo2bobobo2bo51bob3o25bobo23bob2ob2o 3b3o2b3o$699bo4bobo47b3o3bo46bo17bo61bo16b2o3bo25bobo26b2o2b2o5bobo$ 698b2o4bob4o41b2obo2b3o48bo4b2o3b2o4bo14b2o6bo6b2o51b2o28bo30b2o7b2o$ 705bo3bo41b2obo55b2ob2o3b2ob2o16bobo3b5o3bobo47bob2o30b2o29b2o6bo$706b o48b3o56b2ob2o18bobob3o7b3obobo45b2obo$705b2o50bo78bobobobo9bobobobo$ 813b3ob3o16bobobobob2o3b2obobobobo$837bo3bob2obobob2obo3bo$845b2ob2o$ 825b2o8bo10bobo10bo8b2o$824b2o3bo4b2o7b4ob4o7b2o4bo3b2o$823b2o2b2o4bo 3b3o3bo7bo3b3o3bo4b2o2b2o$824bo4b5obo4bo3b3ob3o3bo4bob5o4bo$828bo4bobo 23bobo4bo$825b2o3b2ob2obo7b3ob3o7bob2ob2o3b2o$828b2o4bo25bo4b2o$818b5o 3b2o5bo6b2o2b2o3b2o2b2o6bo5b2o3b5o$818bo4b2obo2bo10b2o2b3ob3o2b2o10bo 2bob2o4bo$818bo6bo18bobobobo18bo6bo$819bo5b2obo17bobo17bob2o5bo$821b2o 2bo3b2o11b4obob4o11b2o3bo2b2o$824bo17b2o3bo3b2o17bo$822b3o20b2ob2o20b 3o$821bo8bo5bo5b3obobob3o5bo5bo8bo$821bo4bobo2b2o4b2o7bobo7b2o4b2o2bob o4bo$821bo3b2o2bob2ob2ob2ob5obobob5ob2ob2ob2obo2b2o3bo$822bo21bobobobo 21bo$823b21o3bo3b21o2$825b21o3b21o$824bo21bobo21bo$823bo3b20ob20o3bo$ 820bobo2bo2bo37bo2bo2bobo$819bo2bobo4b37o4bobo2bo$818b2o10bo33bo10b2o$ 817bo13b33o13bo$816b4o12bo29bo12b4o$815bo4bo12b29o12bo4bo$815bo2bo15bo 25bo15bo2bo$815bo2bo16b25o16bo2bo$816bo19bo21bo19bo$817b4obo14b21o14bo b4o$818bo3bo15bo17bo15bo3bo$819bo19b17o19bo$819bobo18bo13bo18bobo$841b 13o$818b3o21bo9bo21b3o$818b2o23b9o23b2o$818b3o26bo26b3o$844b3ob3o$819b obo23bo3bo23bobo$819bo24bobobobo24bo$818bo3bo21bobobobo21bo3bo$817b4ob o20bo7bo20bob4o$816bo26bo7bo26bo$815bo2bo24bo2bobo2bo24bo2bo$815bo2bo 24b3o3b3o24bo2bo$815bo4bo53bo4bo$816b4o55b4o$817bo59bo$818b2o55b2o$ 819bo2bo49bo2bo$820bobo49bobo! golly-2.5-src/Patterns/Life/Miscellaneous/diagfuse1.rle0000644000175100001440000000365412156145314020061 00000000000000#C Jason Summers, 25 Aug 1999 (minor optimizations made later). #C From "jslife" pattern collection. x = 127, y = 133, rule = B3/S23 56boo$52b4oboo$25b3o24b6o$53b4o$25bo37b4o$62bo3bo$57boo7bo$46bo9b4obbo bbo$28b3o13boo9bo3boo$45boo9b4obbobbo$28b6o8bobbo4boo5boo7bo$33b3o6bob o4bobbo9bo3bo$35bo8bo5b3o10b4o$33bobo7bobo4boo$33boo8bobo$bb3o29boo9b oo7b6o$3boo4bo25bo17bo5bo$bb3o3bobo48bo$8bobo42bo4bo$9bo45boo3$16bo10b obbo$15bobo13bo$14bobbo9bo3bo$15boo11b4o$24bo$23bobo$22bobbo$23boo5$ 28bo60boo$27bobo55b4oboo$26bobbo55b6o$bbobo22boo57b4o$bbo33bo59b4o$bbo 19bobo10bobo57bo3bo$8bobo14bo8bobbo61bo$8bobo14bo9boo29boo15bo7boobbo bbo$8bobo11bobbo39booboo12boo7b3o$10bo12b3o38bo3boo13bobo5boobbobbo$ 10bo52boo4bo15bo13bo$10booboo47b3obbobo7b3o5b3o7bo3bo$11bobboo27bo19bo bboobo7bo4bo13b4o$11b3oboo26bobo18boo11bo5bo$43boo33boo3bo$38b3o40boo 4b6o$40bo7bo37bo5bo$39bo7bobo42bo$46bobbo36bo4bo$47boo39boo$10boo$13b oo$8bobboo47bobbo$8b3obb3o48bo$7bobo5bo44bo3bo$61b4o$$11bo$10boboo46bo $10boboo45bobo54boo$boo8boo45bobbo50b4oboo$b3o12bobo40boo51b6o$b3o11bo 32bobo62b4o$b3o4bo6bo3bo31bo71b4o$oboo3bobo5bo3bo17bo13bo70bo3bo$3o3b ooboo4bo20b3o9bobbo61boo3bo7bo$bo4booboo4bobbo16b3obo9b3o60bo3b4obbobb o$7b3o5b3o16bo4bo56bo15bobb3oboo$8bo24boo3bo56b3o15b7obbobbo$33bo3boo 55b4o11bo8bo7bo$5bobobobo22boo37bo19boo13bobo11bo3bo$4bo7bo21b5o34bobo 18boobboo7bo15b4o$4bo7bo60boo20b5o8boboo$4bobbobobbo83b3o10boo$4b3o3b 3o101b6o$70b3o40bo5bo$72bo46bo$71bo41bo4bo$115boo$37b3o$37bobbo$37bobb o46bobbo$91bo$41bo45bo3bo$34bo3bobbo46b4o$33b3o3boo$$27boo6b3o$27b3o7b o4bobo$27b3o7bo3bo39bobo$27b3o11bo3bo38bo$26boboo11bo3bo38bo$26b3o12bo 39bobbo$27bo5b3o5bobbo37b3o$33b3o5b3o$34bo35bo$69b3o$31bobobobo30boob oo$30bo7bo28b3obboo$30bo7bo29boobboo$30bobbobobbo32b3o$30b3o3b3o32boo 8$71bo$70bobo$69bo3bo$70boboo$72bo$60boo4boo$60b3obbobbo6bobo$60b3obbo bbo5bo$60b3o4boo5bo3bo$59boboo3b3o5bo3bo$59b3o4b3o5bo$60bo4booboo4bobb o$66b3o5b3o$67bo$$64bobobobo$63bo7bo$63bo7bo$63bobbobobbo$63b3o3b3o! golly-2.5-src/Patterns/Life/Miscellaneous/die658.rle0000644000175100001440000000063412156145314017210 00000000000000#C Creator: Lifestat application #C Author : Andrew Okrasinski #C Dies out completely after 658 gens x = 20, y = 20, rule = B3/S23 6bo3bo4bo3bo$bo3bobob3o2bo$obo8bobo$2bo3bo2bo6bo$b2o2bo7bo4b2o $b2o5b2o2bo2b2ob2o$b2o6bo2bo3b2o$2bo2bob2o5bobo$3b2o2b2obo6bo $bo4b2o2bobo5bo$2bo3bobo$bobo3b2ob3o3bo$3bo3bo2b2o2bo$2bo4bo3b o2bo$3bo2bo2bobobob2o2bo$o2bo15bo$b2o4b2obo2bo3b3o$4bo4bo2b4o 2bo$bo4bobo2bo5b2o$o2bo6bo2bo! golly-2.5-src/Patterns/Life/Miscellaneous/elbow-ladders.rle0000644000175100001440000001402712156145314020731 00000000000000#C Left: Single glider Elbow Ladder, based on Dieter Leithner's #C side-shooting pseudoperiod 124 glider gun (improved by Dean H.) #C Scot Ellison, April 1997 [posted 9 May 1997] #C Right: Elbow Ladder based on a p92(104) slide gun from #C Jason Summers. Scot Ellison, 23 Oct 2002 x = 463, y = 206, rule = B3/S23 141boo160boo$141bo162bo$159boo143bobo$128boo29bo145boo7bo$128bo184boo$ 173boo137boo$173bo139boo$300boo37b3o$300bobo38bo$139boo3boo101boo53bo 38bo$142bo104bo52b3o10boo25bo$139bo5bo10boo3boo82bobo64boo$95boo43boob oo12b5o70boo11boo66boo9bo15bo$95bo31b3o11bobo14b3o70bobboo78bo7boo17bo $126bo3bo11bo16bo70b6o64b3o20boo16bo8bo$82boo41bo5bo10bo27booboboo38b oo15b4o47bo18bo36b3o8boo62boo$82bo42bo5bo68bo13bobbo36b3o26boo15bobo 112bo$128bo41bo5bo23boo11boobbo35bo4bo41boo63boo48bobo11bo$126bo3bo83b obbo34bo5bo106bo50boo10boo$127b3o41booboo39bo9bo6b4o17bo109bobo61b3obo $128bo44bo52boobb6o18boo97boo8boo61boo$82bo55bobo19bo54bo9boo4bobboo 69boo45bobbo51boo18boo17b3o$82bo13bo41boo21boo51bobbo14boo20boo48bobo 44boobbo53bo18bo15bo4bo$81bobo11b3o27b3o11bo3b3o14boo51boobbo35bo50bo 47bobbo50boobbo33bo5bo$80booboo9b5o26b3o14bo3bo67bobbo34bo5bo8bo35boo 6bobo15b4o20bo16boo35bobbo17bo20bo$79bo5bo7boo3boo24bo3bo12bo5bo67boo 36bo4bo8boo42boo16boobo36bobboo34bobo16boo18boo$82bo11b5o33bobo6boobob oo106b3o55bo19bo20bo14b6o34boo16boo7bobo$79boo3boo8bo3bo24boo3boo3boo 39b3o153boo20bobbo14b4o53b3obo3boo10boo$95bobo35bo20boo3boo12bo3bo173b oobbo52boo18boo6bo12bo$96bo59b3o122b4o45boo20bobbo52bobo18bo14bo5bo10b o$155bo3bo12bo5bo59bo6boo18bo15bobboo46bo20boo39bo12bobbo33bo4bo11boo$ 156bobo13boo3boo59boo5bobo17boo15bobboo31bo10boobo37b4o20boo10boobbo 35b3o$98bo58bo72bo16bo34bobbo32boo9b4o35b6o11bo23bo$96booboo45boo82boo 15boo34boo84bobboo11boo20boo$146bo223boo51boo$95bo5bo45b3o4boo127boo 74bo64bo$149bo5bo126bobbo73boo55boo4bo3boo$95booboboo24boo24b3o127bobb oo5bo100boo20bobo4bobooboo$77booboboo42bo9b4o12bo110bo17bobboo6boo69b oo18bo7booboo14bo4bo7boobo$77bo5bo47boo7bo33boo88bo16b4o78bobo17boo6bo bbo15boobboo$78bo3bo48bo3boo3bo24boo7bo6bo80b3o83bo16bo25bobbo$79b3o 53bo3bo15bo6bobobboboo8b3o166boo15boo25boo$153boo6boobbo4bo7bo69bo$ 154boo10bo11boo69boo141boo$142boo23bo80boo110bo30bobbo$100boo40bo19bo 198boo28bobbo15bo$100bo28boo9bobo17b3o13bo183boo29booboo14boo$97bo3b3o 27bo8boo17bo14booboo109bobo102boo$59boo34bobo5bo17boo9bo26boo127boo$ 59bo20boo14boo23bo10bo40bo5bo42boobo3boboo56bo52bo5bo63bobo$80bo8boo 41bo89bobbo3bobbo108b3o3b3o62boo$46boo37boobboobboo36bo41booboboo43b3o 3b3o108boobo3boboo23boo37bo$46bo38bobobbobbo35boo5bo78bo23bo135boo$86b 3o47bobo76b3o19b3o134bo$60bo26boo47boo40bo39bo17bo$60bo114bobbo38boo 17boo$59bobo116bo$58booboo83bo27boo$57bo5bo82bobo5boo3boo13bo$43bo5bo 10bo85boo8b3o15bobo$43bo5bo7boo3boo30bo60bo3bo15boo62boo92bo23bo$44bo 3bo45boo60bobo61bo5bo13boo44bo46b3o19b3o$45b3o34boo11boo27boo31bo61b3o 3b3o11bo47bo48bo17bo$81b3o3bo7b3o7boo17bo50boo3boo36boobo3boboo56b3o 47boo17boo42bo$78boboo4b4o5boo8bo53boo14bo5bo217bo$71boo5bobbo4bo4bobb oo63bo111bo125b3o$71bo6boboo5bo3bobbo65b3o13bo3bo91boo$81b3o3boobo71bo 14b3o78boo3bo7boo110bo$82boo23boo134bo14b3oboboo118boo$106bobbo133boo 13b3o4bo117boo21bo$109bo151bo3bo10bo130boo$59booboboo43bo15bo10boo90bo 33b3o3boo7boo127boo$59bo5bo40boobo13boo11bobo15bo73boo38boo6boo110bo$ 60bo3bo42bo16boo10bo17boo71bobo32b3o3bo120boo$61b3o197bo3bo85boo20bo 14boo$24boo129bo102b3o4bo86boo15boobbo$24bo16boo3boo33bo25boo45bobo 101b3oboboo71bo7bo5bo9bo6bo5bo$55bo24bobo24bo19bo25bobbo101boo3bo73bo bbobobbo15boo4boobbobo$11boo29bo3bo9bo11boo9bo3boo8bo9bo21bobo24bobbo 12bo108bo59b3o3b3o22boo3bo$11bo31b3o8b3o11bo10bo3boo5b4o10boo20boo39b oo3boo3boo98boo90b3o$43b3o33bo3boo4b4o10boo50bo11bobo$64boo14bobo6bobb o47bo13boo17bo3bo191b3o$64bo16bo7b4o45b3o33b3o191boo3bo$65b3o22b4o7boo 34bo36b3o190boobbobo$22boo3boo38bo25bo7bobo6bo26boo170bo58bo5bo$25bo 18boo57bo5bo200bo58boobbo32bo$22bo5bo15bo9bo48boo4b3o50boo9bo134b3o62b o21bo10bobbo$23booboo21b3oboobboo57bo41boobboobboo4b3o220boo9bobboo$ 10b3o11bobo22b4o4bo58bobo39bobobbobbo4bo3bo46bo7bo63bo$9bo3bo11bo27boo 61boo41b3o11bo48bobbobobbo64boo$8bo5bo10bo134boo8bo5bo45b3o3b3o63boo 45bo5bo$8bo5bo155bo5bo163b3o3b3o$11bo58bo100bo3bo164bobooboobo$9bo3bo 57bo100b3o124bo42booboo$10b3o56b3o61b5o131boo7boo20boo40booboo41b3o3b 3o$11bo120bob3obo130boboo3boobo19boo41booboo41bobbobobbo$21bobo35bobo 71bo3bo131bo3bobo3bo107bo3bobo3bo$21boo36bo3bo70b3o132boobbobobboo107b 4o3b4o$8b3o11bo3b3o14bo19bo71bo134b3o3b3o109bo7bo$8b3o14bo3bo11b4o14bo 4bo4boo50boo106bo41bo5bo165boo$7bo3bo12bo5bo9boboboo17bo5bo51bo60boo 45boo211boo$24booboboo4boobbobbob3o12bo3bo31bo70boo7boo5bo261bo$6boo3b oo3boo17bo4boboboo13bobo31boo40boo23bo5bobo6bo$16bo24b4o49boo11bo10bob o14bo24b3o3bo9b3o$43bo28bo33bo10bobbo42bo14bo$71boo33b3o7boo44boo113bo $114boo3bo8boo147boo$72bo43boo10bo203bo7bo$23bo5boo40bobo43bobbo212bo 6boo$24boo3bo31bobo6bobbo44bobo61b3o146b3o$23boo5b3o29boo5bobbo38bo69b o3bo$32bo29bo47b3o67bo5bo130bo$9boo21bobo8boo27bo36b5o66booboboo131boo $9bo8boo13boo7b3o26boo89booboboo148boo69bo$14boobobboboo15boboo12bo24b o307boo$14bo4bobbo16bobbo12boo22bo82bo5bo$18bo20boboo13boo21b3o240bo$ 17bo24b3o11b3o27bo17bo58booboo155boo$43boo11boo28bobo13b3o60bo156boo$ 55boo8boo19boo13bo7b5o$55bo9bobo33boo7b3o$67bo43bo55bo$67boo97bobo$ 165bo3bo8boo3boo$76bobo14bobo69b5o11bo$77boo14boo4bo64boo3boo7bo5bo$ 77bo16bo3b3o64b5o9booboo$28bo69b3o65b3o11bobo227b3o$28b4o135bo13bo230b o$12bo16b4o63boo3boo78bo229bo$11bobo5boo8bobbo5boo56bo4bo253bo$9boo3bo 14b4o5bo26bo290bo$4boo3boo3bo4boboboo3b4o31boo289b3o$4bo4boo3bo5boo3bo bbo35boo11bo$11bobo10bo51bo103boo158bo$12bo8bobbo15boo34b3o6boo93bo 160boo$40bobo42bo254boo$41b3o123boo$42boo9bo45boo66bo$25b3o3bo7boo13b oo43bo245bo$27bo4bo6b3o11boo291boo$oo24bo3b3o312boo$bo$bobo8boo26boo$ bboo8bo5bo21bo9bo$9boo6b5oboo24bo$8b3o5bobboo4bo23b3o$9boo5boo8bo29bo$ 12boo4bo7bo29bobo$12bo13bo29boo$25bo8boo26bo$23boo9bobo23boo$36bo24boo 14bo$36boo37b3o300bo$74bo304bo$74boo301b3o$32bo354b3o$32bobo328bo25bo$ 32boo330boo22bo$363boo3$69boo3boo292bo$47bo21bobobobo293boo$46bo23b5o 293boo$46b3o22b3o$53bo18bo$53bobo$53boo$$58boo$58bo$$72boo$72bo$386bo$ 386bobbo$386bobboo$22boo$22bo$32bo$30boo$31boo11$17bo$16bo$16b3o$23bo$ 23bobo$23boo6$12boo$12bo! golly-2.5-src/Patterns/Life/Miscellaneous/fermat-primes.rle0000644000175100001440000006516412156145314020770 00000000000000#C This is a Fermat prime calculator, rigged to self-destruct and stop #C growing if any Fermat primes over 65537 turn up. Since the #C existence of such primes is an unsolved problem in mathematics, #C it is unknown if this pattern grows to infinite population. #C #C The tubs in a row represent the known Fermat primes, starting #C with 5. The other three represent 17, 257, and 65537. A tub gets #C destroyed whenever a Fermat prime is found. In the unlikely event #C that an additional Fermat prime exists, the pond will eventually be #C destroyed, followed by the puffers and breeders. #C #C A number N is tested at about generation 120N - 550, so the tubs #C will be destroyed at about generations: 50; 1,490; 30,290; and #C 7,863,890. #C #C The next-smallest Fermat number that is not known to be composite #C is 2^2^31+1. Therefore, the pond (and the breeders) will survive at #C least 10^640,000,000 generations. So don't expect to see anything #C interesting happen by watching this pattern. Remove the tubs if you #C want to see the destruction. #C #C The careful observer may notice that actually every number of the #C form 2^N+1 is tested for primality, while Fermat numbers are of the #C form 2^(2^N)+1. However, numbers of the form M^N+1 can never be #C prime unless N is a power of 2, so the only primes of the form #C 2^N+1 are in fact the Fermat primes. #C #C The "Primer" and "Caber Tosser" patterns used here are by Dean #C Hickerson. The beehive puffer is by Hartmut Holzwart. #C #C Jason Summers, 7 Jan 2000 x = 838, y = 736, rule = B3/S23 46b3o12b3o$46bobbo10bobbo$46bo16bo$46bo3bo8bo3bo$46bo6b4o6bo$47bobobo bboobbobobo$51bo6bo$51bo6bo$50boboobboobo$50bo3boo3bo$51bo6bo$51boo4b oo$54boo$49bo3bobbo3bo$53bobbo$50b4obb4o$52boobboo$53b4o$52bo4bo$$52bo boobo$51bo6bo$51bo6bo$53b4o$49boobobooboboo$48bobboobooboobbo$47boobb 8obboo$47bo3bobboobbo3bo$46boo5bobbo5boo$46boo3b3obb3o3boo$47bobboobo bboboobbo$48boobob4oboboo$53bobbo$48bo12bo82b3o15b3o$48bo4bobbo4bo81bo 3bo13bo3bo$50boo6boo82boo4bo11bo4boo$44bo5b3o4b3o81bobobooboo3b3o3boob oobobo$43b3o8boo84boobo4boboob3oboobo4boboo$43boboo4bobobbobo75bo4bo4b o3bo4bobo4bo3bo4bo$44b3obboboo4boobo69boob3o15bo5bo$39b3obb3obbo10bo 67boobo3boobboo7boo9boo7boo$38bobbo4bo77b5o4bobboo$41bo9bo6bo61booboob obobo5bobbo$41bo4b3o4b4o7b3o15b3o33boobo3bo3bo8bo$38bobo4b3o15bo3bo13b o3bo28b5o4bo$45b3o14boo4bo11bo4boo23booboobobobo3bo$48bo5boo5boboboob oo3b3o3booboobobo20boobo3bo3bo$48boo3bobbo3boobo4boboob3oboobo4boboo 15b5o4bo$45bobbo5boo3bo4bo3bo4bobo4bo3bo4bo4bo5booboobobobo3bo$48bo22b o5bo15b3obboobo3bo3bo$44bo3bo5boo3boo7boo9boo7boobb3ob3o4bo$44bo3bo4bo bbo34boo5bobo3bo$48bo5boo33bobbo6bo$45bobo42bo$54boo52bo13bo$53bobbo 50b3o11b3o$54boo51boboo4bo5boboo14bo13bo$108b3o3b3o5b3o13b3o11b3o$54b oo52boo3boobbo4boo13boobo5bo4boobo$53bobbo58b3o19b3o5b3o3b3o$54boo82b oo4bobboo3boo$144b3o$54boo$53bobbo64b3o$54boo64bobbo$123bo14b3o$54boo 67bo14bobbo$53bobbo63bobo15bo$54boo56boo24bo$112boo25bobo$54boo92boo$ 53bobbo49bo41boo$54boo49b3o7bo$104boobo5booboo37bo$54boo48b3o6booboo 28bo7b3o$53bobbo48boo6booboo26booboo5boboo$54boo59boo4bo5bo16booboo6b 3o$120b3o3b3o15booboo6boo$54boo63boobo3boboo4bo5bo4boo$53bobbo62b3o5b 3o3b3o3b3o$54boo64boo5boo3boobo3boboo$132b3o5b3o$54boo57boo9bo8boo5boo $53bobbo57boo7b3o$54boo57bo8bo3bo10bo9boo$122bo3bo9b3o7boo$54boo33b3o 11b3o29bo3bo8bo$53bobbo31bobbo10bobbo12boobbo3bo8bo3bo$54boo35bo4b3o6b o13boobo3bo29b3o11b3o$91bo4bobbo5bo12bo3booboo8bo3bobboo12bobbo10bobbo $54boo32bobo4bo3bobbobo18bobo9bo3boboo13bo6b3o4bo$53bobbo38boboboo23bo 10booboo3bo12bo5bobbo4bo$54boo40booboo35bobo18bobobbo3bo4bobo$97b3o37b o23boobobo$54boo34bo70booboo$53bobbo32b3o70b3o$54boo32boobo6bo72bo$88b 3o6boo26bo44b3o$54boo33boo7bo24booboo35bo6boboo$53bobbo38bo27booboo8bo 26boo6b3o$54boo37b4obo18bo6b3o7booboo24bo7boo$94bobbo18b3o15booboo27bo $54boo39b3o18boboo15b3o6bo18bob4o$53bobbo60b3o23b3o18bobbo$54boo49b3o 9b3o22boobo18b3o$70bo13bo19bobbo9boo23b3o$54boo13b3o11b3o21bo34b3o9b3o $53bobbo11boobo5bo4boobo21bo35boo9bobbo$54boo12b3o5b3o3b3o19bobo47bo$ 69boo5boboo3boo69bo$54boo99bobo18b3o11b3o$53bobbo45bo7b3o3b3o56bobbo 10bobbo$54boo47boo5bobbobobbo59bo4b3o6bo$79bo22boo6bo7bo24b3o3b3o7bo 18bo4bobbo5bo$54boo21boo4b3o24bo7bo24bobbobobbo5boo16bobo4bo3bobbobo$ 53bobbo26bobbo24bobobobo25bo7bo6boo22boboboo$54boo24bobbo59bo7bo31boob oo$75bo7bo30bo29bobobobo33b3o$54boo18bo3boo4bobo26b3o8boo51bo$53bobbo 17bo37booboo7bobo20bo28b3o$54boo19bo36booboo8boo9boo8b3o26boobo6bo$85b 3o3b3o19bobo19bobo7booboo25b3o6boo$54boo12bo9bo5bobbo3bobbo19bo20boo8b ooboo26boo7bo$53bobbo10b3o6b3o8bo3bo54bobo33bo$54boo11boboo5bo10bo3bo 55bo32b4obo$68b3o5bobo5bobo5bobo17booboo7boo43bo5bo5bobbo$54boo12boo7b oo28bo3bo5bo5bobbo41b3o3b3o5b3o$53bobbo31b3o17boobbo3bo7boo10boo7boob oo17boobo3boboo14b3o$54boo32b3o16boo4b3o19bobbo5bo5bo3bo12b3o5b3o14bo bbo$88bobo22bobo20boo7bo3bobboo14boo5boo15bo$54boo33bo24bo31b3o4boo37b o$53bobbo32bo24bo31bobo23bo20bobo$54boo19bo71bo23b3o$75boo20bo49bo22bo 3bo$54boo18bobo10bo3bo4b3o71bo3bo$53bobbo30booboo4boboo64bo$54boo32bob o6b3o63b3o4bo3bo11b3o$80bo16boo63boobo4bo3bo11bo$54boo24boo7bo72b3o5b ooboo12bo$53bobbo22bobo7bo73boo6bobo$54boo33bo82bo$112bo68b3o$54boo29b o27boo66bo$53bobbo28boo25boo35bo32bo$54boo28bobo60boo$148boo$54boo26bo 93b3o$53bobbo24b3o6bo85bo$54boo25boboo5boo32boo51bo$82b3o4bobo22boo8bo bo$54boo26b3o29boo9boo9boo48b3o11b3o$53bobbo25boo51bobo8boo23b3o11bobb o10bobbo$54boo79boo9boo23bo16bo4b3o6bo$172bo15bo4bobbo5bo$54boo129bobo 4bo6bobo$53bobbo57bobo7boo71bo$54boo58bobo6bobbo64bo4bo$113bo10boo10b oo7bobo43bo$54boo57b3o19bobbo6bobo39bo5bo$53bobbo52boo3b3obo17boo10bo 37b3o3b3o$54boo53boo6boo27b3o36boobo3b3o$117boo24bob3o3boo20boo10b3o4b oo$54boo49bo37boo6boo20boo11boo5b5o$53bobbo48boo36boo34bo15b3o$54boo 48bobo71b3o$177boobo4bo6bo$54boo100b3o18b3o4b3o5bo$53bobbo99bo20b3o4bo boo6bo7b3o$54boo101bo19b3o5b3o6boo6bobbo$178boo5boo6boo7bo$54boo137bo 8bo$53bobbo125bo20bobo$54boo125b3o$180bo3bo$54boo$53bobbo$54boo104bo 13bo5booboo$113boo5bo38b3o11b3o6bo12b3o$54boo57boo5boobboo33boboo4bo5b oboo18bo$53bobbo62bobobbobo20boo11b3o3b3o5b3o19bo$54boo69boo9boo9boo 11boo3boobbo4boo4bo3bo$135bobo3b3o23b3o9bobobobo$54boo79boo4bo38b5o5b 3o$53bobbo85bo37booboo5bo$54boo125bobo7bo$173b3o5b3o$54boo116bobbo$53b obbo118bo9b3o$54boo119bo9bo$172bobo11bo$54boo108boo$53bobbo107boo23bo$ 54boo132b3o$158bo24boo3boboo$54boo101b3o7bo15b3o3b3o$53bobbo99boobo5b ooboo19b3o$54boo100b3o6booboo19boo$157boo6booboo$54boo111boo$53bobbo$ 54boo$$54boo80boo32b3o$53bobbo80boo31bo$54boo80bo28boo4bo4bo$125boo39b oo7b3o$54boo68bo3bo36bo9boboo$53bobbo56boo8bo5bo7bo38b3o$54boo57boo8bo 3boboo4bobo38boo$123bo5bo3boo12boo21boo$54boo68bo3bo4boo12boo22boo$53b obbo68boo6boo35bo$54boo79bobo$137bo$54boo$53bobbo$54boo$151boo$54boo 96boo$53bobbo94bo$54boo$$54boo$53bobbo$54boo88bo$144boo$54boo87bobo$ 53bobbo$54boo$170boo$54boo114bo$53bobbo111bobo$54boo80boo30boo$137boo$ 54boo80bo$53bobbo68boo$54boo68bo3bo$113boo8bo5bo7bo$54boo57boo8bo3bob oo4bobo$53bobbo66bo5bo3boo12boo10bo$54boo68bo3bo4boo12boo10boo$125boo 6boo23bobo$54boo79bobo$53bobbo80bo$54boo$$54boo$53bobbo94boo$54boo96b oo$151bo$54boo$53bobbo$54boo$$54boo88bo$53bobbo87boo$54boo87bobo$$54b oo$53bobbo113boo$54boo114bo$168bobo$54boo80boo30boo$53bobbo80boo$54boo 80bo$125boo$54boo68bo3bo$53bobbo56boo8bo5bo7bo$54boo57boo8bo3boboo4bob o$123bo5bo3boo12boo10bo$54boo68bo3bo4boo12boo10boo$53bobbo68boo6boo23b obo$54boo79bobo$137bo$54boo$53bobbo$54boo$151boo$54boo96boo$53bobbo94b o$54boo$$54boo$53bobbo$54boo88bo$144boo$54boo87bobo$53bobbo$54boo$170b oo$54boo114bo$53bobbo111bobo$54boo80boo30boo$137boo$54boo80bo$53bobbo 68boo$54boo68bo3bo$113boo8bo5bo7bo$54boo57boo8bo3boboo4bobo$53bobbo66b o5bo3boo12boo10bo$54boo68bo3bo4boo12boo10boo$125boo6boo23bobo$54boo79b obo$53bobbo80bo$54boo$$54boo$53bobbo94boo$54boo96boo$151bo$54boo$53bo bbo$54boo$$54boo88bo$53bobbo87boo$54boo87bobo$$54boo$53bobbo113boo$54b oo114bo$168bobo$54boo80boo30boo$53bobbo80boo$54boo80bo$125boo$54boo68b o3bo$53bobbo56boo8bo5bo7bo$54boo57boo8bo3boboo4bobo$123bo5bo3boo12boo 10bo$54boo68bo3bo4boo12boo10boo$53bobbo68boo6boo23bobo$54boo79bobo$ 137bo$54boo$53bobbo$54boo$151boo$54boo96boo$53bobbo94bo$54boo$$54boo$ 53bobbo$54boo88bo$144boo$54boo87bobo$53bobbo$54boo$170boo$54boo114bo$ 53bobbo111bobo$54boo80boo30boo$137boo$54boo80bo$53bobbo68boo$54boo68bo 3bo$113boo8bo5bo7bo28bo$54boo57boo8bo3boboo4bobo26bobo$53bobbo66bo5bo 3boo12boo10bo5boo$54boo68bo3bo4boo12boo10boo$125boo6boo23bobo$54boo79b obo$53bobbo80bo$54boo$$54boo$53bobbo94boo$54boo96boo$151bo$54boo$53bo bbo151boo$54boo152bobo$208bo$54boo88bo$53bobbo87boo$54boo87bobo$$54boo $53bobbo113boo$54boo114bo$168bobo$54boo80boo30boo$53bobbo80boo$54boo 80bo$125boo$54boo68bo3bo124boo$53bobbo56boo8bo5bo7bo115bobo$54boo57boo 8bo3boboo4bobo115bo$123bo5bo3boo12boo10bo$54boo68bo3bo4boo12boo10boo$ 53bobbo68boo6boo23bobo$54boo79bobo$137bo$54boo$53bobbo$54boo$151boo$ 54boo96boo$53bobbo94bo$54boo$298boo$54boo242bobo$53bobbo241bo$54boo88b o$144boo$54boo87bobo$53bobbo$54boo$170boo$54boo114bo$53bobbo111bobo$ 54boo80boo30boo$137boo$54boo80bo$53bobbo68boo662bobbo$54boo68bo3bo214b oo448bo$113boo8bo5bo7bo205bobo443bo3bo$54boo57boo8bo3boboo4bobo205bo 446b4o13b4o$53bobbo66bo5bo3boo12boo10bo646bo3bo$54boo68bo3bo4boo12boo 10boo649bo$125boo6boo23bobo645bobbo$54boo79bobo646bo$53bobbo80bo644bob o19boo$54boo727boo18b5o$796bob3obbo4bo21bo$54boo738boo3bo3b3obbo21b4o$ 53bobbo94boo626bo14bobo7bobboo23boo$54boo96boo623bobo14boboo7boo28bo$ 151bo613b3o10boo15boo35b4o$54boo708b5o27bo39bo$53bobbo331boo374b3oboo 62bobb3o$54boo155bo176bobo376boo5bo25boo5b4o23b3o$209bobo176bo383bobo 17boo4booboo3bo3bo24bo$54boo88bo65boo561boo16b4o3b4o8bo19bob3o$53bobbo 87boo635bo9booboo3boo5bobbo20boobbo$54boo87bobo622boo11bo11boo36b3o$ 768boo7bobboo4bobo42bo$54boo721bo7bobboo43bo$53bobbo113boo605bobboo4bo bo19boo5b4o12bobo$54boo114bo610bo11boo11booboo3bo3bo15bo$168bobo610bo 9booboo10b4o8bo12bobo$54boo80boo30boo621b4o12boo5bobbo15bo$53bobbo80b oo653boo37bo$54boo80bo665boo9bo17b3o$125boo673b5o8b3o14boobbo$54boo68b o3bo304boo365boo4bo5bo3bo13bob3o$53bobbo56boo8bo5bo7bo295bobo323bo40b oo5b5o4bo18bo$54boo57boo8bo3boboo4bobo295bo323bobo42boo4b4oboboo17b3o$ 123bo5bo3boo12boo10bo598boo45b3oboo3bo17bobb3o$54boo68bo3bo4boo12boo 10boo650bobo22bo$53bobbo68boo6boo23bobo671b4o$54boo79bobo653bo43bo$ 137bo651boo24b4o13boo$54boo734boo22bo3bo9bob4o$53bobbo740b4o17bo9bobo$ 54boo740bo3bo13bobbo9boo$151boo623bo23bo27boo$54boo96boo620boo20bobbo 27bobbo$53bobbo94bo623boo11bobbo39bo$54boo736bo38bo$478boo300bo7bo3bo 36b3o$54boo422bobo263bo33b3o3bo4b4o37bo$53bobbo421bo263bobo33boo5boo 42boo$54boo88bo598boo32bo6b3o41bobo$144boo632boo5boo39bobboo$54boo87bo bo632b3o3bo4b4o34bobo$53bobbo723bo7bo3bo$54boo736bo35boo$788bobbo34bo bbo$54boo769bobbo$53bobbo721boo46b3o$54boo80boo593bo44booboo46bo$137b oo590boo45b4o46boo$54boo80bo593boo22boo5b4o12boo46bobo$53bobbo68boo 625booboo3bo3bo58bobboo$54boo68bo3bo394boo41b4o182b4o8bo59bobo$113boo 8bo5bo7bo385bobo39bo3bo159bo23boo5bobbo$54boo57boo8bo3boboo4bobo385bo 45bo157bobo95boo$53bobbo66bo5bo3boo12boo416bobbo159boo18boo9bo63bobbo$ 54boo68bo3bo4boo12boo430boo165b5o8b3o60bobbo$125boo6boo443b4o164boo4bo 5bo3bo60b3o$54boo79bobo428bo11booboo163boo5b5o4bo61bo$53bobbo80bo426b oobo3bobbo5boo166boo4b4oboboo60boo$54boo506b5o4bo3bo175b3oboo3bo61bobo $562bobbo4bo4boo180bobo60bobboo$54boo506b5o4bo3bo245bobo$53bobbo507boo bo3bobbo5boo104bo50bo$54boo510bo11booboo101boo49boo24b4o57boo$578b4o 103boo49boo22bo3bo17boo5b4o27bobbo$54boo523boo162b4o17bo15booboo3bo3bo 26bobbo$53bobbo151boo358boo17boo153bo3bo13bobbo16b4o8bo27b3o$54boo152b obo357bobo15b4o124bo7bo23bo34boo5bobbo29bo$208bo359bo17booboo14boo105b obo5boo20bobbo74boo$54boo532boo14b4o105boo6boo11bobbo41bo39bobo$53bobb o547booboo129bo39boo8boo27bobboo$54boo527boo21boo109boo15bo3bo38bo9bo bbo27bobo$582boo133b3o4boo9b4o39b5o4bobbo$54boo663bo3boo5b3o46b4o3boob oo28boo$53bobbo524boo136b3o6booboo49bo4boo28bobbo$54boo547boo114bo3boo 5b3o83bobbo$597b3o3bobo111b3o4boo9b4o26bobo49b3o$54boo538b3o6boboo34bo 50bo23bobboo13bo3bo27b3o49bo$53bobbo537bo9boo33boo49boo24bo3bo17bo27b 3o20b4o24boo$54boo538b3o7bo35boo49boo24bo16bobbo50bo3bo23bobo$717b3o 51b4o17bo21bobboo$54boo668boo27bo16bo3bo13bobbo23bobo$53bobbo199bo348b oo92bo22booboo24boo21bo$54boo198bobo339b4o4b4o89bobo22b4o26boo16bobbo 42boo$255boo338bo3bo4booboo89boo23boo37bobbo48bobbo$54boo543bo6boo158b o46bobbo$53bobbo538bobbo139bo23bo3bo47b3o$54boo680boo14boo9b4o48bo$ 737boo12boo5b3o53boo$54boo691b3o6booboo52bobo$53bobbo590boo102boo5b3o 50bobboo$54boo199bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo30b obo103boo9b4o8boo35bobo$255b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o 27b3o27b3o27b3o8bo18b3o28boboo112bo3bo6bo4bo$54boo202bo29bo29bo29bo29b o29bo29bo29bo29bo29bo29bo29bo5boo22bo28b3o116bo12bo33boo$54bobo200boo 28boo28boo28boo28boo28boo28boo28boo28boo28boo28boo28boo6boo20boo28boob o79b4o28bobbo7bo5bo31bobbo$55bobo590boo79b6o39b6o30bobbo$56boo671b4ob oo16boo57b3o$259b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o 122bo48boo15booboo57bo$259b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o 27b3o27b3o120bobo65b4o29b4o24boo$258bo3bo25bo3bo25bo3bo25bo3bo25bo3bo 25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo120boo66boo29bo3bo23bobo$ 778bo7bo21bobboo$257boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3b oo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo129bo79b7obbobbo23bobo$ 590boo28boo28boo28boo9boo17boo22b3o3b3o3b3o3b3o3b3o3b3o5bobb3oboo$590b obo27bobo27bobo27bobo9boo16bobo60b7obbobbo24boo$591boo28boo28boo28boo 28boo65bo7bo21bobbo$782bo3bo20bobbo$261b3o27b3o27b3o27b3o27b3o27b3o27b 3o27b3o27b3o27b3o27b3o219b4o21b3o$258boo28boo28boo28boo28boo28boo28boo 28boo28boo28boo28boo202bobbo43bo$258boo28boo28boo28boo28boo28boo28boo 28boo28boo28boo28boo206bo41boo$257boo28boo28boo28boo28boo28boo28boo28b oo28boo28boo28boo178boo10boo11bo3bo7b6o27bobo$258bobo27bobo27bobo27bob o27bobo27bobo27bobo27bobo27bobo27bobo27bobo177boo11bo11b4o6bo5bo25bobb oo$259boo28boo28boo28boo28boo28boo28boo28boo28boo28boo28boo143b4o29bo 8bo7boobb3o18bo26bobo$693bo9bo3bo37bo8boobb3o12bo4bo$590boo28boo22bo5b oo22bo19boo11bo38bo7boobb3o14boo30boo$259boo3boo23boo3boo23boo3boo23b oo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo 24bobo27bobo20bobo4bobo21bo4bo11b3o5boobbobbo35boo7bo11b4o38bobbo$259b oo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo 23boo3boo23boo3boo23boo3boo25boo28boo20bobo5boo21bo3bobo10boo6b3o41boo 4boo11bo3bobbobbo31bobbo$253bo29bo29bo29bo29bo29bo29bo29bo29bo29bo120b o33bobbo9b3o5boobbobbo12boo5b4o12bo23bo6bo6boo23b3o$251boo8b3o17boo8b 3o17boo8b3o17boo8b3o17boo8b3o17boo8b3o17boo8b3o17boo8b3o17boo8b3o17boo 8b3o27b3o114bobbo10boo13bo9booboo3bo3bo7b3o22bobbo3bo3bo4booboo23bo$ 252boo7b3o18boo7b3o18boo7b3o18boo7b3o18boo7b3o18boo7b3o18boo7b3o18boo 7b3o18boo7b3o18boo7b3o27b3o115boo11boo9bo3bo9b4o8bo6b5o29b4o4b4o23boo$ 262bo29bo29bo29bo29bo29bo29bo29bo29bo29bo29bo130boo9b4o10boo5bobbo7b3o boo5boo30boo23bobo$694bo44boo7boo52bobboo$671boo6b5o40bo22bo55bobo$ 647bo8bo12booboo4bo4bo35bo3bobbo33bobo12b4o$646b3o7bo8bo3b4o10bo14b3o 17boo7bo30b3oboo11bobboo24boo$244bobo27bobo27bobo27bobo27bobo27bobo27b obo27bobo27bobo27bobo68boo53b3obo3b4o8boobbobo3boo6bo3bo17bo18boo6bo 24boo4b3ob3o11bobboo21bobbo$244boo16boo10boo16boo10boo16boo10boo16boo 10boo16boo10boo16boo10boo16boo10boo16boo10boo16boo10boo16boo28boo20bob o5boo28boo19b4obb4o6bobboo3bo12bo18bo20boo4boo25boo4booboo12bobbo21bo bbo$245bo16boo11bo16boo11bo16boo11bo16boo11bo16boo11bo16boo11bo16boo 11bo16boo11bo16boo11bo16boo28boo22bo5boo28boo16bobbo4b4o8boobbobo3boo 32bobo18bo26bo7b3o3boo9boo23b3o$641boboob3o7bo8bo3b4o31bobbo14boo37bo 4boo35bo$641b3obo10bo12booboo128boo$640bobbo6b3o18boo32b3o93bobo$486b 4o4b4o142boobboo4bo75b4o50boo17bobboo$238bo29bo29bo29bo29bo29bo29bo29b o36bo3bo3bo3bo4bobbo136b4o5bo56bobbo13bo3bo32boo14booboo17bobo$236boo 28boo28boo28boo28boo28boo28boo28boo41bo7bo8bo137bo33boo32bo16bo31b4o 13b4o$237boo28boo28boo28boo28boo28boo28boo28boo36bobbo4bobbo5bo3bo134b o34booboo27bo3bo12bobbo32booboo13boo20boo$503b4o133bobo22b3o8b4o16boo 11b4o50boo34bobbo$572boo65boo3bo20bo11boo15booboo99bobbo$563b4o4b4o50b oo13bo3boo20bo27b4o101b3o$484b3o3boo70bo3bo4booboo48b4o17bo49boo103bo$ 477bo5bo3bobboo9boo63bo6boo39bo9booboo12bo3bo153boo$229bobo27bobo27bob o27bobo27bobo27bobo27bobo27bobo36bo3bo5bo11bobboo57bobbo34boo12bo11boo 14bobo38boo113bobo$229boo28boo28boo28boo28boo28boo28boo28boo35b3o9bo 10b3obbo94bobo8bobboo4bobo55b3o3boo9bo101bobboo$230bo29bo29bo29bo29bo 29bo29bo29bo41bo5bo10bo4bo96bo8bo7bobboo24b4o26b3o14boo101bobo$484bob oo11b5o19bobbo36boo45bobboo4bobo24bo3bo25bo3bo12boboo$472bo27boo25bo 35bo7boo41bo11boo22bo25b4o13bobo102boo$463boo8bo49bo3bo35bobbo5boo31b oo7bo9booboo3boo5bobbo3bobbo27b3o13boo101bobbo$460b3oboo5b3o21boo5bobb o18b4o36b3o4boo31bobo17b4o3b4o8bo151bobbo$223bo29bo29bo29bo29bo29bo29b o56b5o29b4o8bo43bo15boo3bo34bo18boo4booboo3bo3bo152b3o$221boo28boo28b oo28boo28boo28boo28boo58b3o30booboo3bo3bo43bo49boo31boo5b4o41bobbo108b o$222boo28boo28boo28boo28boo28boo28boo63bo21boo5boo5b4o43bobo44b3oboo 86bo6boo98boo$468bo9bo8booboo59bo20boo23b5o8boo73bo3bo4booboo96bobo$ 466b3o7bobo4bo3b4o60bo19b4o23b3o8bobo24boo48b4o4b4o95bobboo$475bobbo5b o3boo64boo15booboo35bo15boo3b3o4bo55boo97bobo$475bo6bobbo51bo15b4o16b oo11b4o33boo6b5o4boo$475bobbo5bo3boo46bo16booboo27bo3bo12bobbo18b3o4bo boo6bo153boo$214bobo27bobo27bobo27bobo27bobo27bobo27bobo79bobo4bo3b4o 45b3o16boo32bo16bo8boo8bo4boo9bo151bobbo$214boo28boo28boo28boo28boo28b oo28boo82bo8booboo93bobbo13bo3bo7bobo13boo5bobbo151bobbo$215bo29bo29bo 29bo29bo29bo29bo93boo12boo98b4o9bo13boo6bo154b3o$503bo4bo13bo25boo244b o$509bo11bo15bo8booboo28bo59bobbo150boo$509bo11b3o11bobo4bo3b4o30bo18b obo41bo148bobo$185boo28boo28boo28boo28boo28boo28boo28boo28boo28boo28b oo14bo32bobbo5bo3boo29b3o12b3oboo3bo36bo3bo146bobboo$184bobbo26bobbo 20bo5bobbo20bo5bobbo20bo5bobbo20bo5bobbo20bo5bobbo26bobbo26bobbo27boo 28boo15bobbobobo3boo19bo6bobbo12bo32boo4b4oboboo18b4o13b4o147bobo$184b o29bo21boo6bo21boo6bo21boo6bo21boo6bo21boo6bo29bo29bo77bobb3obo3boo19b obbo5bo3boo6bo3bo28boo5b5o4bo17bo3bo$184bo29bo22boo5bo22boo5bo22boo5bo 22boo5bo22boo5bo29bo29bo27bo50bobobbo26bobo4bo3b4o10bo13bo13boo4bo5bo 3bo21bo165boo$184bobo27bobo27bobo27bobo27bobo27bobo27bobo27bobo27bobo 26bo49boo32bo8booboo4bo4bo14bo12b5o8b3o18bobbo164bobbo$184bobo27bobo 27bobo27bobo27bobo27bobo27bobo27bobo27bobo24b3o94boo6b5o12b3o14boo9bo 187bobbo$185bo29bo29bo29bo29bo29bo29bo29bo29bo364b3o$581b4o10boo5bobbo 185bo$580bo3bo9b4o8bo183boo$182boo3boo10bobo10boo3boo10bobo10boo3boo 10bobo10boo3boo10bobo10boo3boo10bobo10boo3boo10bobo10boo3boo23boo3boo 23boo3boo146boo7bo9booboo3bo3bo182bobo$182bo5bo10boo11bo5bo10boo11bo5b o10boo11bo5bo10boo11bo5bo10boo11bo5bo10boo11bo5bo23bo5bo23bo5bo78bo29b o36b4obbobbo12boo5b4o180bobboo$200bo29bo29bo29bo29bo29bo103boo28boo20b obo5boo20bobo5boo27bo3boo209bobo$183bo3bo25bo3bo25bo3bo25bo3bo25bo3bo 25bo3bo25bo3bo25bo3bo25bo3bo25bobo27bobo20bobo4bobo20bobo4bobo18b3o7b 4obbobbo$184b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o26boo28boo22bo 5boo22bo5boo17booboo8boo7bo204boo$559bo20bo3bo202bobbo$581b4o201bobbo$ 193bo29bo29bo29bo29bo473b3o$191boo28boo28boo28boo28boo475bo$88boo102b oo28boo28boo28boo28boo473boo$89bo696bobo$89bobo5boo89bo29bo29bo29bo29b o29bo29bo29bo29bo150b4o201bobboo$90boo5bobbo85bobo27bobo27bobo27bobo 27bobo27bobo27bobo27bobo27bobo128bo20bo3bo202bobo$81boo18bo9bobo73boo 28boo28boo28boo28boo28boo28boo28boo28boo22boo28boo22bo5boo22bo5boo17b ooboo8boo7bo$81boo18bo7bo3bo337bobo27bobo20bobo4bobo20bobo4bobo18b3o7b 4obbobbo204boo$67bo10boo21bo7bo73bo29bo29bo29bo29bo29bo29bo29bo29bo28b oo28boo20bobo5boo20bobo5boo27bo3boo207bobbo$67bobo7b3o17bobbo7bo4bo8b oo58b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o80bo29bo36b4obbobbo12b oo5b4o178bobbo$70boo6boo17boo10bo12boo57b5o25b5o25b5o25b5o25b5o25b5o 25b5o25b5o25b5o147boo7bo9booboo3bo3bo179b3o$56boo12boo9boo5boo19bo3bo 48bo17boo3boo23boo3boo23boo3boo23boo3boo23boo3boo23boo3boo8bo14boo3boo 8bo14boo3boo8bo14boo3boo151bo3bo9b4o8bo180bo$56boo12boo9boo5bobo9bobo 8bobo46b3o18b5o25b5o25b5o25b5o25b5o25b5o10bo14b5o10bo14b5o10bo14b5o 153b4o10boo5bobbo180boo$67bobo20bo9boo57bo21bo3bo25bo3bo25bo3bo25bo3bo 25bo3bo25bo3bo8b3o14bo3bo8b3o14bo3bo8b3o14bo3bo357bobo$67bo11bo10boo9b o57boo21bobo27bobo27bobo27bobo27bobo27bobo14boo11bobo27bobo27bobo121b oo6b5o12b3o14boo9bo181bobboo$77bobo67bo35bo29bo29bo29bo29bo29bo15boo 12bo29bo29bo24boo51boo32bo8booboo4bo4bo14bo12b5o8b3o180bobo$78boo66bob obooboo294boo50bobobbo26bobo4bo3b4o10bo13bo13boo4bo5bo3bo$147bo3bobobo bo290bo51bobb3obo3boo19bobbo5bo3boo6bo3bo28boo5b5o4bo180boo$151bo4boo 25boo28boo28boo28boo28boo28boo28boo17bo10boo28boo28boo28boo15bobbobobo 3boo19bo6bobbo12bo32boo4b4oboboo178bobbo$152bo30boo28boo28boo28boo28b oo28boo28boo16bobo9boo18bo9boo28boo28boo14bo32bobbo5bo3boo29b3o12b3ob oo3bo179bobbo$106bo46bo227bo29bobo93bo11b3o11bobo4bo3b4o30bo18bobo181b 3o$105boo45boo227boo29boo93bo11bo15bo8booboo28bo204bo$105bobo308bo65bo bbo15bo4bo13bo25boo233boo$414bo3bo67bo14boo98b4o175bobo$95boo21boo264b oo33bo49boo11bo3bo96bobbo13bo3bo173bobboo$96bo21bobo28boo229b4oboo27bo 4bo51bo11b4o47b3o16boo32bo16bo174bobo$96bobo9bo4boo6bo7boo17bobbo4boo 222b6o29b5o46bo7boobb3o53bo16booboo27bo3bo12bobbo$97boo8bobobbobbobbo bbo7boo17bobbo4bobo222b4o80bo8boobb3o54bo15b4o16boo11b4o192boo$107boob ob3o6bo27boo8bo297bo8bo7boobb3o71boo15booboo204bobbo$107booboo6bobo39b o295bo14bo11b4o62bo19b4o204bobbo$107boobo7boo41bo295bo5boo4boo11bo3bo bbobbo56bo20boo206b3o$107bobo35bo16bo301boo20bo6bo6boo46bobo228bo$108b o35bobo16bo293b3o3bo18bobbo3bo3bo4booboo45bo229boo$145bo14b3o293b5o29b 4o4b4o46bo15boo3bo207bobo$159bo296b3oboo37boo21b4o36b3o4boo81b3o120bo bboo$141bo18bo298boo7boo51bo3bo35bobbo5boo79b5o120bobo$140bobo18bo307b oo20bo33bo35bo7boo80b3oboo28boo$141bo20bo305bo20bo4bo3bo22bobbo36boo 91boo20b4o4b4o89boo$163bo317booboo3bo3bo4boo175bo3bo4booboo86bobbo$ 137bo26bo316bobbo8bo5boo178bo6boo86bobbo$136bobo26bo307boo7b3o13boo60b obbo102boobbo4bobbo96b3o$137bo28bo307boo11bobbo73bo6boo91boo5bo104bo$ 167bo305bo14boo70bo3bo4booboo89bo3bo3boo9bo92boo$133bo34bo392b4o4b4o 90boboo14b4o89bobo$132bobo34bo400boo91booboobo6b8obo86bobboo$133bo36bo 329boo164bo8bo9boo86bobo$165boo4bo310boo14booboo168bo3boo4bob3o$165bob obobo3bo305b4o13b4o165bo3bo10b3o89boo$168booboobobo304booboo13boo168bo 9bo92bobbo$175bo307boo156bo33bo95bobbo$640bo32bo3bo7boo85b3o$116bo523b 3o35bo5b4o85bo$117bo555bo4bo5booboo83boo$115b3o9bobbo36bobbo36bobbo36b obbo36bobbo36bobbo36bobbo36bobbo36bobbo36bobbo36bobbo36bobbo36bobbo37b obbo22b5o7boo83bobo$126bo39bo39bo39bo39bo39bo39bo39bo39bo39bo39bo39bo 39bo23b3o19bo116bobboo$126bo3bo35bo3bo35bo3bo35bo3bo35bo3bo35bo3bo35bo 3bo35bo3bo35bo3bo35bo3bo35bo3bo35bo3bo35bo3bo19bobo15bo3bo13bobbo100bo bo$126b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o36b4o 20b3o16b4o17bo$94boo570bo3bo100boo$93bobo534boo12b3o20b4o98bobbo$93bo 536boo12b3o121bobbo$92boo27bobobo115bobobo117bo150b4o111bo13bobo123b3o $513bo3bo12bobbo96boo138bo$121bo123bo115bo3bo151bo16bo104bo20bo4boo 102boo$22boo489bobbo13bo3bo104boo16b4o3booboo99bobo$22boo97bobo119bo 119bobo165b4o94b5o4bobo15b5o4bobbo97bobboo$508bo119bo4bo21bo9bobbo98bo bo$125bo115bo123bo143bo123bo22boo8boo$507b3o118bo3bo11bo12bo110boo$ 121bobo117bo120bobo159bo4boo99bo13boo120bobbo$521b4o3booboo110bobo13b oo5bobbo95bobbo$35boboo94boo368bo16b5o4bobbo125b4o8bo95b3o$14boo14bobb oboboo94bo89boo28boo28boo28boo28boo28boo28boo28boo28boo28boo9bo14bo9bo bbo125booboo3bo3bo12boo82bo$14boo13bo3bobbo97b3o86bo29bo29bo29bo29bo 29bo29bo29bo29bo29bo8b3o15boo8boo117bo10boo5b4o3b4o4b4o80boo$30bo6bobo 96bo87b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o24bo127boo22bo3b o4booboo78bobo$31bo5bo188bo29bo29bo29bo29bo29bo29bo29bo29bo29bo151bobo 26bo6boo77bobboo$29bo493boo5bobbo139bobbo87bobo$29bo12bo479b4o8bo$44b oo456bobbo16booboo3bo3bo119bo16boo92boo$41booboo460bo17boo5b4o119boo 15boo8boo84bo$6boo35bo458bo3bo146bobo14bo3bo5bobbo83bo$6boo36boo457b4o 8bo155bo3bo4bobboo82bo$515boo25b4o125bo4bobbobboo79bobbo$43boo469bobo 14bo9bo3bo113bo13bobo3b4o81boo$532boo11bo113boo102boo$41bo487b3o5boobb obbo113bobo103bobo$42bobo475bo7b3o6b3o143boo79bob4o$39boobbo477bo7b3o 5boobbobbo137b4o82boo$520bo11boo11bo136booboo84bo$531bo9bo3bo12boo107b oo15boo82b4o$542b4o3b4o4b4o104booboo102bo$b3o521bo22bo3bo4booboo103b4o 99bobb3o$3bo16boo496boo5boo25bo6boo105boo102b3o$bo19boo492b3oboo3bobo 21bobbo219bo$3bo16bo494b5o246bob3o$b3o512b3o247boobbo$boo527bo18boo 216b3o$bbo58boboo465boo17bo7boo208bo$b3o52bobboboboo464bobo17bobbo5boo 209bo$o3b3o48bo3bobbo487b3o4boo208bobo$5boo49bo6bobo470bo15boo3bo212bo $5boo50bo5bo472bo230bobo$bbo21bobo28bo12boo466bobo230bo$bbo22boboo3boo 21bo12boo467bo20boo207bo$bbo18boo3boob5o503boo18b4o206b3o$21boo3bobob oobo523booboo204boobbo$20bobboobo4b3o10bo497boo15boo205bob3o$21bobobo 7bo9bobo494booboo226bo$21bobo18bo3bo493b4o226b3o$42bobbo495boo225bobb 3o39bo$42bobbo14boo710bo38bo3bo$42bobo15boo706b4o44bo$13b3o755bo13bobb 3o20bo4bo$13b3o752boo12boobboboobo20b5o$15bo750b4o8bob4o3b3oboo13boo$ 16bobbooboo742bo10b5obobbobob4o6boobb5obo$10b3o3b4o3bo751bo4bo4b4obo3b o5b4o7bo$16boboobobo3b3o216boo528bo6bo4bobbobboo4bo10bo$15bo13bo15bo6b oo192bobo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bobbo3b5o3bo bbob3oboo7b3o$27bo16b3o5boo193bobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobb obbo6bo5boo9b3obbo3bo$29bo14bobbo200boobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobbobbo6bo5boo9b3obbo3bo$27b3o16bo205bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3b o3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bobbo3b5o3bobbob3oboo7b3o$27boo15b3o729bo6bo4bobbobboo 4bo10bo$28bo15b3o728bo4bo4b4obo3bo5b4o7bo$27b3o15bo719bo11b5obobbobob 4o6boobb5obo$26bo3b3o11boo717bo6bo7bob4o3b3oboo13boo$31boo12boo723bo 11boobboboobo20b5o$31boo730bo6bobb3o9bobb3o20bo4bo$28bo735b6o3b3o40bo$ 28bo744boo3boo31bo3bo$28bo747booboo32bo$774b6o$772bo3b3o$776bo$772bo3b o$773b4o! golly-2.5-src/Patterns/Life/Miscellaneous/four-primers.rle.gz0000644000175100001440000004064112156145314021257 00000000000000‹Œ)¢Jfour-primers.rle¬}[d9rÞûûÚ~Ø…gƇw z°$_!¬¯û5«;{º¼5•£ºìxüë}ø}_ÏÉêõ®tgeæ!ƒÁ`Üdþæïÿ×ÿÇÿxúçëóß~[SûæÛ\—_ÿê7úO××§ÓŸ.OÏ÷×ÇçÓõãé|úÏç.ãÝ?Þ¼œ~|ºß>=¾þpwy:=ß_þtùnôCßo¿=…ç—Ó¿¼ž?<_N¿}ýñÇ­ÕÓý÷Ÿ^~÷×hrú§íÓýãù}Ow?Ÿþár~<ý—û÷ܽ>~s §ß_ÿtü°®ÝþùéúáõýåyCçùåérþa ô0ÿt¯§çÏÛãO÷?>Ÿž.?>]ž//÷ß_ÂÖÏß~ºÖLîÇ ÿñþáã«óÝ6òéåÓåôWϯõ»ËåÓýŸ.%ç—SˆËïO/¶t{º||¸¼¹>Î>\>œîàý6þàåzzy}ÂW„ÁaÙU3yýñ§óÓ‡ÓùñÃ6£Ç ¥—í«ÓO÷/Ÿéúúòãë˘ïòñü< ÇÇßµIб×Óç—÷Ÿµ>nÍåãýÓ¶4?žïŸ¾ûî;BùÃår:?<_O~xÿóçÇoÛÓwÿ÷þÇoN?}ºÿiúÃëÃùåò¼4;¿lÇ$ÏB%,ß>¿l-NO¯—oN¯ÏÕ±Jç',ÀûëãÇûï_ŸÎ/GY\~>½ütÝHôððü8gÌå ç<\>:ãüþò“¦ø›0Øæ¿Ÿ7xxýaÃøyãšrú§m×Äe)ìó?ùŽ §lx^ž‰ÊöíÓϧë˧­ë÷÷Ç^Î?7º޾~>}|ºþpút~ø¨Õ`ÃçÓã€1–óþ±Ów§¿ûyãˆÿýú<¨0£øtåî²qîŒblPÿtÙæl÷ôþü¸µ¨~ø´(®¯w—gÁ»\6ÞyÑ#±øéü´½<¿lÏ>^ŸÀtç‡û—Ÿ¿sÂ`òšöûOçÇï7ÆÛ@^‡ø Î~¾ßHüøþgÇp(À‘üÆÐœ¼¸ÑõÙYq[úç1Þã&A§„!°ß_^(uRÇ4ô€µÉnƒÞ¿¿>}ØØìág—¯ô´—¯‡ëO_–¯øµòõ_jhmÈn3Øæø´­è&&ß¿>>û¹>ˆ'æãëãû¡ÎƒþåõþOç‡m¡oVûßýËëáÛ ÌÔ¹ÎJÏ×)@åw†‚N{<~ØVüÃß°ÿý&>×ׇ&m’Ç÷—o†ø†LÞ Ŭ·Ÿ¶Åx¸| ”±Cßßo³¿­ðfh®/2èå¼ Ðýæ çM3?Þ¿P¦4´ËÆ­Ï}J»Ö›LþvýÝßœŠ}·)Žûñe(ßœbù&ÓæãOO— !~Ã7§´5ÌÄååý/ŠÆ ÒÆ"Ÿ“ˆ[apË/ŸŽ æ¦ÿ-‡¥¯×àŽŸh³±Öûa’(€/çû½¯RуÛ6Pw¯/ÓXòŽqÛõ ÉÍÏwÛ <œŸ¾‡‘<¾>_¤Q®˜EÝn¾ikØQxGG…*“ûñáõY|1òú|?Xü"µ«°´é»Àæš ÄÃFÏg™–¡î.RyN^Ÿ¬û—áùœ!HSË?]€ÒGxuç§ûmmžÍxÅoÿùæÌÌâÿpþä‡×÷Ÿæ‡ëáa3m±@š3Ù•—y0 >% ƒ>~ø7d³ÿsúÛSÈkþæôóx·Äå8Û‡¿Kÿþ1ýúW9,wéÂöò./ëÝ5Þ]Â?ïR[íY¨w×¼ý­øúÐ,”»ëï‹=®[ÛÌgøö.ŽÇö´ qûd|Šh÷ë_ïò6æµo‰]aÏ^ðeÈhŒÏè´a—0‘^ÓÀç.Žo#ÞšÖñ₾ =âxÛ1d(ãæ¾µóâŒÕß§ŸÛœM(l¨Ýø­^×­Ù¯•Ö¨FBϽmÁ›èzøÄˆ8ÈSÑo6:&|Èwã[5«\È+ˆ³à¡¾À¤y+ÁÂhFæñh›ÛŽ+RE34öË\,[ŠœQôO£¿è‚ç`ì¼0h¾à› ±ú kQA%v"F6Õª–\ˈµä3€Y ›F¯êŸ6@úZ ^Û>7 ˜ó3b­8›ÖÑ‚<®[§±à|WÒv`Ê$°á† ?§Æ0z7?Sr@uLð»Q²Ñ±T•ôcˆ "mßi)Êöh®×è9úuÀ¹‹›hbR(.À¢CáÊŒ>X£¬U€ßþl¤¹fŸ„ ^êX÷ƒXgã™eë\Çy´\‰L§¢)ï¸g´ªÀÒ°à¹qœø-,“Å_hÅQ÷\ ¢jm¸æƒØ4Ür_ôŽÎ€Ûó†ÆºN0£U1cÆBq¹3W$®Q*caÊÀ;-Ö¯«]‚¢Dl‰Á£1E€4HR­EŒÓbiëÎGX„."‚…ÑÐ5JÑ»¶Ìuwp ša4@'!†(ìty,V¨p¬=æÈ¥.%83PŽÃö¬áØ+ " ØR›%îM^3¸¯b5ê cÕ’ íÂ5*/säÍWM)ô FÓÔÑ<l”øÈ±ÁѦêHœÌF$bW`› _j”T§­Ä…ôj"[÷©)WQ,œ7¡É®ÒÁÚB˜[’‘1¥µŽ¡A‘Þ%^“BÞÅ“1cæ4‚è§Yå­¨• È&EzEsPzZÚ<ä ð©PÝhܼL+\ Ñ“3‰2U‚Ö•&e›¥7qƒ¹‡&%ÜÑÓEè5Ê9iN˜ž$è_ô=H°fê>ç<šC·8õžIR ™k{Ř‘/ͤÁÙ§a˜z'‡"šíД©Ûʾ%ÎÂÙ#7hÞ$ó&Ã8Ž` V°ž”÷¾˜J£öH´íxQƒ‹¢NjåàšaÀ"M J8ë0!Ðñ‹;.ÕÉt)8„WPÌhbMZv÷æàIÉK0x)QsY…q¥' ‡i:Zp|°¤U€pÚ¹]eðŠÀÀø¡'eåàf±mDãVÔbˆ»Y>ŠÃÐ7zjòQÁ6l¹3{Û²©PtàÜ×’°êlìÑ€)gç+—tð½ï´½ï—d Íæ’ÙUvåè n}#¡¬”|tÉ”sÚî ›Ž5”rì\TÉUp|}ˆ­iv…G“’ÁŸØŽæzt8åè ËÁ5x*öIr8k–·“á¶JR6"e GÈð/@ILsÓGãÛr‡TŒ –©àô0Å1r6«›hºÝíD zB¡C#iÀò€©G©ôeE Ü×”±‰„ºÁ!W¸Qã?€ {‡F%®f‚5Íu…xvÁ–s+• Í’ bHµ¤M;ñ¬$]q_uLÕX¾wP¤4c¼uï 8uàjF–níÖFÇ~ˆP“ìoªt«+ù,322­Ý‚\ŒWé,îÝlŒä ÉJ‘Z›;ˆ‘f_µþcü±˜ Ô/ãq¥á\$–mħS Gw a\É–ÅU@äPP9ÑOA–›°k]¤âÅØÝ…w’‹Ð’)i8WÔÇuª@Ì\– É"*]@‹"ìNÌì$­]Ý6Ýuk4{$Á¦î¶Õ™à(O]Nu5IÙ{êdÈÕÏm›g{›žÈ°ù²JÃY¬þ®u@KR9qÑ ˜Ä‚«…¦ ,¦µó°ârʏqÌk¯j ôÙXv|tÏþÁ&Øp2x\›& ú„hŽ $mç…Å®xJrîÆ@ª\4OD2X#!RqïùÖãhʨ¤eŒE!ÏýÍYTš©x¤€^‘è$fMz>D<ƒÁ1« 7uB4s »üjú¤R49È|„t àõ2¶2ÚGtàƒ|E°“3I4å­!^ˆ€¹Ê$q}Ó÷…ÌÕ©¤d–Ý“ò|Y¬CÄu7c²È?°i²¦Ð‹Q f¨…‘ÀȶxpÙéw— ¬ÄÙ*xaŒ#œS#œéJEÄ&ì•~aèÀ¥C™0ñÊ‚ðéÒäUÄmžŒQгÈÃ-´Âü\‹äeÅÜø'k+ÊZ`žZ3ç9âEʇê«‘ª€ %•5¶"¹*úwPvƒ©X¬É¯gZ2ÇAÖ¢ÁèBt(9 ¤è lVdtlÆ#vš‰9ö5oŒ" ͱa°:ˆ“BÖ|/ëêÖIZ>Iè“Ö,d[¡ºBŠÚlK —£ö¡>h^¡± ¥Ñz]§»°­y«†Å‡·\•ÍR2ñ¶Úƒøu¥dmøö‰upM,rнi¨ °­²a[CJ›PˆÄy0o^VNNW V’™Õ¶˜N\Qz”ÔÛ‹¸eÀ*0BLöIå”+¹`ƒ þÆÀ ”t%8­<&Œ.‰0ÌÕz›ÕÖ1ÑýËtâh™‡F+阊 ¢­TòÌà; í™Lc¤i qäc–Š9Ð5U€\gKÜÀžg©šÉÅYöÝ¡Ké„ê³`*¬´¹ùÚMÁ•»6-ã­ããiqó"èÏDAQâ·[’q1–Jõ6á¼`¤¬‰ŠŒ#´×Æ:Bˆ8¢ÁÎÕy#}]öËQñúJç †`¦'“†I*Ë]ÑZšS„áës†p`U¡ß8+Ò0ÃFHgGHü" çGff¬>è ÷‹Ëó­¥Ê˘¶a¥¸!¿-1 8ʼ/~ÁÆÅ–÷­½Ê©Rï“;| ©ºÌäcy 7f)—`Ê–ÀÝ+I¯¼‰Y?:óëÁää%ÏÕ­š\6×Ûc¹E¡¿1e•‘~a~ØdðŒÜYé°P Ÿ3Y¥ÎMW[ÁúGD›€—–õÖVÕ.aЫâ/LÛÖ`8t|k ž¢cÝ•Â^-Ϭ'É€•2B¤4-T§ÃÞ#T h›W f‚rMèiçyZ!ƒ2% \oÏŸ <õz0“‹dDè— Ó´ÓY–ªý̺1¯˜SDoÎ=™ÈAMRMÄÞåS¿¢½ZÈoÎd±„£ÌhQK=FÙÆ5yñÒhÊÆ§{&¤”˜Ê½·b`  °Û´±'@;#N oWbfXG4b‹RÖ ò»‚LHÌmã7Eϵ0Ä aïÁƒíÝö÷a§%TYÒVA¤\Ýe/&ý}AFTÕži'L)›t3€ äÎÈPÃX"©0"¾BbVµžÇüÇ€@¾1¿ðn¬å1-Yâ§çHv6Ûü¢FeyK €Ë™&‚"®KAŒÞdV;å9Úý RÈu 0uVÌiëûRerê Ó[3ñÆ¥ÉàI nGbõ«”Í» Êl}­[ù ìºPî´/\—üè´ðãºG½ƒƒHoqËš½ú+¶ù1PtLÈÏsk®Ü#kCUNýЄ’r¤+p…oEojÛé3þÈ+žCÓÐò(¤oÒ"þ"îƒ=G•§Ñ™ž/˜‚‘Õ'pWHSX{†‡ê©ÀKŽg³$4úÓ#!÷Ù—P­µsØdŒ?Yê/'~V®9yâÀ-û1ÃpkÌZÈ& / e÷*F¶05Ó·fŠ™Àn-[íCQ@iŠ´^ ôå2o.ÌB+‰¼°ím_´KT±×#•%Õà‹²ªG´Í‚¸¢âû‚WYoÖÌU« Š ”X¥óú@”n6–BEèêt‚Mí¿UË-‹;¸TX«FŽÃìªFe®°X ^†¨ò܆†ARÅZÕâcTÛxSβ,6‚«€H’ûÝ2¤Ðã¥f7!‹xUjj^e‘ÁRC? ÔI¤‹2Â[ß§4h+~ÜÖt“8¨ ¿@UB`@„0ä`êJáËñoËÏH;•¥çâ1€ síÉÂ~›pFÕä!ö×fH´T\!Bâ ™,1°Í²‰”Í´ÿSǼ‰h¦O%4>jónçÇ}Õä#ĉJhIõ'Ô 8Ôó#+—ÝGÀL@Ëü„å S ªVËßa^Ò£IɆ$jÑ¿ ú€ ?¯cLJ8½“ñÅ9{ÑÖàKþ”Õew ˜« ÇräÜ<ñ}éDµ£7¨)¾ÒoD–Y,ß2.Š#úŽBaWx=RÀÊbE¡F;!–QÚ¤êS­TúÌö@ů¾-C¡ÓP.Sø 4tò T)ž3J=d ÂÄ£Y3ù†fº¿Ü&gSNNï`¾Uë;$g4Óª“9Rȳ+Òæ¤a¦Ê¤•ãB  û(¨bWÕ^r+Ä•ÈÆ¨68ç‡kek!,j"°¹ûÏ ª34@Ò“¢#zƒÒq›„O„E7¤å˜ãÛ¼ÁÖ0ªxÏZkQÉW«–Av½u¨gªÐîC†€%¬ûâìR¦'y¬êèÖÍ%ñÚÐtû¦ E_,ú×Y+š‡ú mXS:?ìôYÁ)25*&'&,bæëZ>£„K.\)Û¥sŒˆ…AhÞ¼À ЦI«ú›t‚JpR2³ Éö" K™^b©©¾-áaÍ0Œ½Çðh#13­VŒkᢴù©˜×$¿bG‡«Xôx–¬@8‹yMf¬NwÔ0G½)y!q&Yomîú†ˆ{Óm±š?Z-IRtò³Š³P;Ò<´¶Ë$Œê‘«óJ0 `¶g¤«8ØÒ)ÌUË™Ví4i"7‰t¤ç¯:)‹›€Š¤G®JKŠ~5@´‡ÇêÎd´P&TD ¤Q.ûýGØ·FyÐÅ0ážj# ¨jÕÈ.Э‡©©zy=XO erb[L€:î+…)Ü9¨ñºbТr(…Å®ý’޹[,ƒ}u¥Å˜.À,JUsgŠ'Ëú­rÖ(MpˆA;̸Èï 7K/ ¦÷©g-è X§iF˜–;¾¢yûØ‚LK“2ˆÃñ DrŠ;>èLHñ-2RÓÏH~ìÃ2¸ª­Q{FŽ(¾CÙõÜ4i*­â·C?ƒ+s³K¬fŠB1ëŽR—’o“R!{Ê_š47-šl¡¥”˜I26ÇaXú;‡ÝNË»Rþ´#ÒµƒM´¼:ºÙÛõž¤ˆÆèXú°ôl ¶ý´h¿^SóÚ_åb$Ñììl9ýüP%©Õè 1fO[€ée@uX{1Ø€£4xŸG3 Ô¨("œ}gP÷µ}Zã­´,ʇo9`5ºe1ßÚ,¡ÕtÙ×BûŠ…€Àç .VšúËv4¬QÄj‡2áÉ ˆPÐh Jèfô?kòl·qºîÒ!1@MÁ#²XØkŽ_t^¡½fýT“Ĉ==È‘¾•’ÅL'O_醽‹:NE ^+%Œ@_åIn`0‡,ƒR¡q áÆ³Õ°äQ¨¿o½çñ<íâgºu=øå‚߯ú*Qˆ:ÃÇԪߕ0 sHOÅ•ƒ‡±c¨u£]rã€ôX§-&½Ñ6?}·Mɧ7ŸX#/‡rÙm€JÁ5}l‡¡,ëdIrªà©E¿”}+¬£ß07ÉŠé6zå`Eĵ=ˆP<©æ=Ü„0Ï^æzØlë1WhSvabˆDáÒ6 7ié _Ì!gb3ôíÒ¶—IÔõ&¥ñ®×íµiy­<ß'e“w{™]Æ@õ™ÃAŸª½JdœµÞ†v Ø15›QA,]…V¦ +GUì’˜B™Mø:ŒyžãÁŒREgAWf® 'Á>ð ®ô[÷»ëüÚAùv^4 äÉ“ë4˜VÜu‹ôœVþ‘…¦ ýÖ {Þ˜4Ç4MŒ…ß‹Ÿ’¼Qâ— 0¥¼ Ït ûåIPBý’Ãpë.VL&RJ`œ D* Xþ™.N,‰«ž%ãÁìIãfˆø•^˜”1RL‰g;@»ÑlM§íÈ MÕ[÷òÚÀ^<Ñ}qH× 2iFc&ZrÙ;ÅêW󼵪&nð¦+ÒéŠ+$œæ–ï¢bG€KôÊZ*!ÕŤËBSæÁì3ŠXowwFwhˇ“”J®ðv¼Yt[ÜFçö¯ÄCٷٲ"ó0vßà±Mññ(Äe+G‡Çã2wJ ïÊ/Èp1-õ¶²ˆ>"‘˜TØËâ5Ð#«öÚû¤ØW–nÎôб—ÝéûW3Ö¤-ðad,+hDÉŒ¾W2Ãu’ϨòT vô["óª•bŠ¥’IéQ«D^m«l›Ùšl„†:‘§Dâšçc ¯še´„x0 4Az\…ª@¥Ž¶Å}W 4»É ¢©6üt¼¤¡Œ)ÊøvÆÞ³ïžÅ}0gÝÀ ·Y(îZ?6•;Nnk^ÔK}ñzq¿ÅѲôJn• ©Tíï5ƒÞ={²šŸ¤ªQÁÎ3ÙRóm'!°šWƪÜÖ]r–ÌÓ“ãkð·MVdÚ'ˆmHŸ}F—Ã.šÏ ÛÈãË*00KËm—b»D@-bX=¤ÚShjÖDó!¯Â§¨Ü Q[8í¡!'i-@‡,ªÈݱ¡"dØlÔQ¦/ñÞ7-ú¾|ƒº7+w‰ýúÕ2¡„”΂£-3@}4¬†^ßñÚ¼¥ßV¤Ž&6™GÀ½:-`›~ÞÛWpÚq]ã²Ï`Æ2'A·^þt¸C/¤`È‘m1ø.ùShh.#êÑdߟ“ÌýÆ´¬•yìà^ͬ†½QY«“Öäm:+ˆµ·$h…YÙQEo~(8eέi]ëѲÄXwíãÙ!Fk¡SÛ×hfí¸O»#0énþ$â˜æ7£J®³À4u€,œFºÕO#»@BUSÍ&ÀŒ?œ:Q!ïõVÓö mëhAЛHÓ3å$eírôr<×q]¾¿Ü/@¶œ!Ýñyfä1À¥ céM]Iûª!›ÎÇΘÅ$¼4©–§hG$!Gí%ý1:LÝ¡J¿%šo?&™-qRƒÅŽóN°Ì‘-ªIC¥ðFM÷ ÿøMPl™jðmMÕýÖ‚˜ãßàKÅ{YÁ:CS+îëùA#‰!6VšE>@Kë´ Üð8fÍ6IíûЇJCušcWm%ïKñ×dì1«ïš®º.Bb®\ÊBßéÏ€šÇæ^p—½-omÓª?˜ ³³b˜¾_Íl íR‹ ˆÔöYô‚ìÛ W •ιóTŽŽÐUò,`Ö™=‡@9,°'TȸåCåŽG4Í"ÙJR4•ýÎÈ©îC*ÝÜÌÔð蟰›Õu-ÆÝQ S*då#2ú]¾'k‡Ú>„ ˆÍ6P2ÆNsÙƒªëHrçÔ]5!×Ñ“~G–+C«í²"Œ† NïFy³ ‡´îû»Ú[Õ^Xb7 Gún²òˆU[¾mmÌHfž–éʹñœýÛ’ÏÚªqLêö4áã—^Â2æð«mNîKS9ÞÉy­‰›OóL,Hî»R}U×}‰T-”%» µULB1þxD¤7_û§¡)öUӃцêÌm±˜Ô• Ö5¡‹‹ñæ/B|-+Þ¹†·©ùª×¼B"›sÃ0«3ÁX®œ#i5ǰ#³%?›*‘v/~™ Ä:o™#4Ô?4¤*s=Àá}WÕ°m€ÍªHc+0âfó$ñZ\7i'ñ`TÁœr»µ:«¨œÿë^x{ EŒa Ï{! ÆÖnƒy½¹™  ›*Õ–¦ÿŽ‚¡­¹†ú¸ŒlÒaÑÿb6®7(pùXüÞü$ÚÌoÙ a!P[ÿDœ‹¿‘XD<ÇÂÐgTA2÷¾{®š¤™${g59–ÈÏ€lÎ~_½ªUá ê ë¸u´a>lUU[®7û­ê²DZi¦l€å ø/Àùô[9⼯ç—>¢°J߀8‡&ÙÇ Ì—Ÿ[¸ú/¿é€ãG=·ÕÞ–ø»›¯;«|jò½’îùÅ_öòð—÷öÚd¾_Òu)âwYÐ⨞G«;ÞH‘þ[¬–¼ÿ_`ºîˆ»ÕÌMSìeöòTê>O˜v¨aIväf¼Ép%±š{O:Xð2¶¡£“xE¿2X /..Ò9lJvsT3£DÚ•âOßa]¸ËY}û¾Bó‹}ûT7){á7ÊlXÊUa™:ðjÝÚÔ¦Í;QLß6Ë—«¨..Å^BÉ:\P|W`£ !X ­ÕêÂÓ&iB¨è€Ã7øœƒI ýJׄ GW+%“Ê:ä]¾jݯ çйH%‡¢5̓?!…Àaèhêü†œ¬ž îö%!~ÖÙZaSTŽX  ¯:)ù¾¬BÖøf_vq*æ9—Ö|{Ô¹!S5Ã{ªÔ+ÒŽ-Ÿ¨­ø˜r_Y´ñz× “È ‡Ž›ÛYY&û™ÐEsœ‚ÜŠ¡:*Û‘9E¨Ú‡„ϸ ´ì/ºPQ¢²‡ùª»ôà»Ôƒàz°\ØÎ.ž´ÃJÅ‚g“΃Lîqº“äªüçÝ @+ýþ®²Т9×A‡ÊK Z…ÉBåà^侨6ñ—u•µ^7|ÀwÇäSßKT’2Wq„_€–VeÉzÆ€ÿ-RaEäý6GÖv3ìšÖ xŲ¬;9ÔÞA›ÉP“ ÖÉø‚ø}¿ìÖSÛ/i9ü «méì~{‚qÒá6Ý’–y1ðdààVòjõ²@ÈDÛvˆ™äelmr`ªÖFìT*ÖŠï!}Ž•upJ= ”‘cψÍ,`üe£ð®Œ!¯'B=“æÚ|,Œ Zß•¬½“Æ ¢ f{[âGA¯rÑä›Àðú6±êj¿IS$Оåɇݬ䄠Э.ó)Ùk>£Nã)pB&£F ˜÷¹Å^úÑ;¾–‘W½ .3#íâ"Ò8êXÝÕ“‹üû¼×ì`Gœÿ4kbòíï£âî –â<è,òrÇÊõzÍÄ,g%ïJvßMÖÞBÃ7ŒJ“¬,ûŒìsŸ;âtù„ð/o·+vÆ2ÊÍ6«Öç¼=Omÿ䈵F;®wÄhŠâ¶r+1U&Ìõþã±æªBa»-·»Ç奥eoeªtùîfú¦ü>ø->ºDk Z1¯KqÒÌŽÍûÕ•KPê-¯à·’ë«8kçhAd€y•ýCi´Á¿®ªHäÞ,Š(ç4²ö •oŒZ¥ô‘;³‰pŠÔ‚ß°0UÇ:‘§ª’YðÞ˜§eBZeãÀÄd¾jV·Ií¯KÙ¾Hv¶ ¡z­ P\›Õ÷ø®[ŒÇ#R|*¯t+X»Ÿ¹ݤ†J¼Ùˆ{ ¯«3Nˆ…åµÜÔÈTV‡®Ä­P§»-Ø7ŒY >+æ@Ùøfƒ#N‡®®º(„KŠ«ç-[“)›:ÚñD{pϸÓÊøÙMY`Ëæz»‘s$+Eà Ùak¢4O0#td»’²¿9®‡sl!Í=wªvÔ›hšëaw*t;Ó±—ûd·D³~“'ÍfqQDã¤3ª¨¨çÒË*ú©"8Üí´Rv± Q‹y†,Àäªr²©ì&—ýÜO[8ŒjåˆNÿ;-ûµ/]zA¶X_ŽwdŦùóÐç®3_+2Öò’àg·"Ú74ÒÂRuyP)iŸNvNÚŒZ®ZÍBg @âÝ lË4­…é¶jöd.dîŸ r>ò‘W¶©æ7¥ÆÀŽÞ,©Z' rj¹Xm„ÆZwBç¡ ]‹Ö˜R— -vÍàŠX—µˆ@âm¼”×Û¸gY¹oáºJ® ïØ]à‰/ó>:ß•«©æÑÑYI¼ed*oÍßšÏÊÖfE8 !*~~o½½§¾³fô€ØŽs30V8A冒p* ªƒË9:äDDì¢*hÚ¢^ŒžÔɼÐõX‚l„Ô4#ÒaÂNVPžðëæ½`щB‹ëj•FÅEô“@5ÿ½ŸÕâxáRÙ^Ñ7á8~u¸Jq´Õ€Ne cõôª#-N'”9 ØBÉÁˆÑoÏi„%ÌÔ3`å#ʬaÍám&Ûs÷ò %ø’sÂV×PÛ:¶nµCï)A¨»äˆªZÄa žõÉ÷W›§¿<ƒ1 81Wç2íJ²êZoOX´åMu!(ç=­c›†8.¶°~îF 7¥€±dì¨$À¢|~ù~ ,y÷#~À÷¶q®yVâE.pùŠ+-JÄÍ`LI#&/‡ò©N­®š©ø¥Ê6’‡c<îG½žkž0­1Øy‡åæ”G‹ªÉB^›¦¸¡QÿÞòè‹Hý®—Èy­«ÿü9`¶YLŠf ¼n°äþxǺ*SYÛ(G™ŸW4šå­°¤Ãéæ Ç®T–ÓgZ±tN±-ížWÝ¢™S©È‚sô— ­¾f]r l\nŸ•Û~5›d;ÎY-ØŸÇËyë–€‡Š«Uç¦ K2v”°Â3.^ ÒW jå ’^ú‰žn Õe€Ûé•ÒšÿvG7S¯JåP娶ª²™I?îhDZ:8ÃnŽ£®Ui;%ZJÒš¬§Z¬d÷­òvAŸê»`ØÒ‘Ævâ— Im¶.þë³–k¿dånm†ÌßÏøKìq^™ºHÚøP<^?ç9¼õŠ”À<¯mX©_ôfʺ5^EhÛš*|„Zÿ’7U–<€2†U Uu€H»3§»4J²¼bÂ3Õ½(<ìæN"­)3nª27Nè¹(&·ºÇ› [žž×ÓŠ‡°‹VjÝöqï¤gÑiþ⟌pYæP… $hb6!/òê‹HAÙ@9ìÀ&ñDèñtTŒoc&ÎÒð+Ï8Kù\@bN†Ö£R÷˜‡ÍýW*9ÆâørhþP° €«^€“”É÷ã%<¢ì=/GV’ÄE‘]Ò¬ ÖÏôZýió1"¥4¤ÃM]¥€à…9‚~<ÅŒk.YÉdA‘ôÐÞH¯‹Lnƒ”xÚúÈPy×uªø£úŸTá<ž•PW:“åKx—=qSnOXQ‹E‹º\\ÉYâc]BÐ>ª0íUÐ켺ü’ìˆfYGLÊ%ÓÏíï¹`嘛“ÏÅIé@/t¯L'˜ÏD# W¯Bµ³òÅOý—å3yÉlw›çªênÚ‚8P§²KEå²àË*Xþðo…J¨„¢«ª…AwYé°Tì ¢OO-·¹eîñšW…°°FõKÕ„§ŠŽ¡–i`UѨ;Oã¾%¯ºFÓt)æ¡a³py%$5¦Ú#­Ü áoàÚÆ»'‡³ö˜ÛŽZ«™yÐÍ9vÕÙ c U.H:-Íg—4éeÑ k¯Å"u›¦6— ÒuKºW ïÄ^)¿Ä…L Žx;ƒEÒíè:‰P¥¯y¬ÏTƒX½§ï”ÿ3$¥FN§M©ú}(e¸†m-ÙÓ]Ûꣻ–×/¦»6…Ô–ÿáÅ9®Ò˲//ŽŸ3@Ê3rU™¯­ï¿Üf äÒì‰úvö1òà´L!–’«w?Me"«—°Ã¨¶æZ)fm; ›Ä@Rþ£VK-yaõŒ`èÄZäl Iódf(7ZKà¶ùC%Æ;pÈG•yЧÖjçøófT4 ~Ðá_‰9‹‘Õ§ó:ªy¤-ý¿¾Î5WzÃÿGšEŒ”w²ÿõÔû>6Ié¨ÕêO§ `|ÇØÿßów­6" ¡uve÷²~NLºâí»&ÈËê( ìî>¹'ßéu!":Ùà¿óg)}\›‰ˆ½º{r €c€¢tæÀhÆdõKþ rc6³xøÐ|ͼ†§-m;´Êe9ïó}Y;ÍàGÕr”~Û6ñÛ¢Ž'8J®©etãà0žmÍ#}ƒñ@Çlñ~MÓ#\zÜaþõ Ë¾£[zð|Fçò¤QR½RÒâPwÓg 5áŠêÈü8{cò8í×Ûô}´>‡Ö4Ÿ"šz¥¾~Z‰ z"ˆRÿ=†"a¹qêm–.øo)‘'UÂK½ˆD¡¿Î§¥©‚QFó 3idK‚²ˆX ïK&îæ²äá®"öÉù1{„dŒ3­ÃSÿ½`ÏIƒ"!ß©¨%•joç|·þ"uÞólhÜU5ÉŒc©ËÜ ¤9%d!²¢y/O×›Z ,™û‹ë”™¢2Æ Wì½ýîš")vn"ýŠÓz§¼³¸„¦Ð.Ås 'ò’—JšB=2=¨2)nÚÉWl’<lÉßÿÎܤ̊qtñ÷ÿ th_Ô¸}ü3)G ÖŒ{- i…ð¬ÌõÄŠ8PË,¥&a\k>³ü,nëDç+`jÑ…o®Ü\Qy´«íþní Hâ¡&jàMK‹þŒq”ÏD?¤L£;ôgÌ»ÖAlu&µ‚‡m¶ç~oA -¦ UeD“dP!ª ŸSÚÁ¥qöZáÐ_sÉ€ó³¦qÏËMêw»õšõø©ÀºÞëÃúŸ=×ÔÈÃú.êsOý¢ií„åÃéØ ’rIYÍA~Ð"švÄLHÆPŽËFd‰\¤P!1™èôW•-!c:ÑÆLÇ„͉©:à²Å,Úý›ÇLѯâ©ñ­«í¬.uéÊt¾G ³£™Ü @¿åil°åB'™ø¢Ã_­Q:Øq”;¶X™¢-¤áñÔ–]·ˆƒ ðitÝ5ÑÂÜ€ O d Æš8éŠ`ÐÉ"ž3ý¶0»¶—Öòƒ&ó« CȼpÆß)€ÆDa[s lèyDTá„3ª¥ j‰³çêÕ*¤T’ª2:ŠNyœ Â[R­ƒôÛDÍÇü¨o/I7„È™=±…NA/Ÿ˜Ù#Gà¹A7V²GÆâ=Ž1¹¶Á´5/Ý»)Õ•62Ü}¨£›ŠZ—÷qS™D­ïœÃöù¸”lr!! ÖŽÚ2%6A,¦=çÞOXS©dߘüz‘l´zWñúx2ŽdS—”aôëbj…˜´V·E\–°…'Ød…»M&vˆBnµÅd,¾5Á—M# 1ÄDLˆ$‡èi”ú‚o8ä3uNR–µ„ÄÈ^`‘ÒÈ¥kÃæÞ«i ë\BËú~s¦î­R¿Lf· ÔD©Ð5¥ÓÔð£ï¢fѾhþzm4YÑzvMp,ýK¹mô/ö‰^Ødàí¾Á.xHÖa`f$‚Õ‘jqþXþLm­ ÷Ã= ´ª¹D‘é}ÛOK×sx£¡–±uÈq ¸z=ÕjÌœ;öÚ:¢ã`i%ˆùeó*·cË<AÕÂ$!˜£ÝÈ< šÓ-Ü×øšü«§*õv÷¥¯ªñœŽŒÌ2t¡œßàô6Á–\h}º½¹¼Œ‰h<ÃDëíù=ÞIÁÐÒœpl¸4{¸s1Ÿ©/¢¹¢þã}ÉŽ—à¾vŒ/K"T‡·šgÿûïþÚÕœã™Ígolly-2.5-src/Patterns/Life/Miscellaneous/infinity-hotel0.rle0000644000175100001440000000741012156145314021225 00000000000000#C original Infinite Glider Hotel #C David Bell, 9 October 1992 #C "InfinityHotel_old" from Alan Hensel's "lifebc" pattern collection. x = 566, y = 572, rule = B3/S23 13boo$13boo6$13b3o$$13bobo$12b5o$11boo3boo$11boo3boo4$bbo6bo$boo6boo$ 3o6b3o$boo6boo$bbo6bo165$301bo$$297bo7bo$291b3obbo8bo$291b3obbo3boo4bo $289bobboobbo6bobo$289bobo10boobo$289b3o$280boo18bo$280boo$316bo$314b ooboo$$314boo$314bo$316bo3bo$272boo38bo3bo$272boo$306bo$305bobo10bo$ 305bobo7bobo$304bobbo6bo$304bobo8boo$303bo11bobo$264boo37boo10bobo$ 264boo38bo9boboo$313booboo9bo$316b3o$323bo7bo$306bo15bo8bo$272b3o30bob o14bo3boo4bo$305bo16bo6bobo$270bo34bo22boobo$269boo3bo30bo$270bobo53bo 22boo$273b3o28bo$273bo29b3oboo38bo3bo$301boob3o39bo$273boo28bo41bo7bo$ 272boo75bo4bo$273bo70bo4bobobo$272boo32bo37bo8bo$273boo30boboo35boboo 4bo$283bo20booboboo33b3oboobo$276bo3bobbobobbo19bo36boob3o$276b5oboo4b o21boboo4boo12boo$277bobo4bo3bo25boboo8boo4boo$311b4obob3o5boo$284b3o 28bo$285bo$$370bo$368boobo$324boo41bo$318boo4boo40bobbo3bo$318boo45bo 9bo$240boo56b3o64boobboo4bo$239boo124boo$241bo21boo31bo70bo5bo$262bobo 30boo3bo64b3o4bo$252boo7bo13bobo18bobo66boo4bo3boo$252boo7bobbo6boobbo bbo20b3o14boo48b4o$261bo8bobo5boo19bo10boo4boo39bobo13bo3bo$262bobo3bo 3bo3bo3boo4boo22boo45b3o12bo$263boobboob3o5boo6boo11boo57boo11bo7bo$ 270boo3bobbo19boo75bo4bo$275bobo21bo70bo4bobobo$298boo56bo13bo8bo$299b oo55bobo11boboo4bo$261bo94b3o11b3oboobo$261bobo38boo51bo15boob3o$238bo 22boo39boo21bobo27b5o$236bobo85booboo12bo$227bo7bobo86boobo12bobo$226b oo6bobbo11boo72bo17bo$225boo4boobbobo11boo73bo18bo$215boo7b3o4boo3bobo 15bo69bo18boo$215boo8boo4boo5bo14bo87bobbo$226boo25b3o85b3o$227bo107bo 6bo$239bo94b3o$234b4obbo9b4o26b4o84boo$236bob3o8bo3bo25bo3bo50b3o29boo bbo5bo$237bo15bo29bo5b3o39booboo30bobb3o4bo$234bo14bobbo26bobbo6bo43bo 32bo4bo4bo$237bo52bo76b5o$234bo134boo$$227bo$227boo$226bobo$370boo$ 214boo27bo126boo$213bobo26boo$203boo7bo6boo4bo16bobo$203boo7bobbobbobb obbobo26bo$212bo6b3oboboo25bobo$213bobo6booboo14bo8boo3bo9boo84bobo$ 214boo7boboo14b4o5boo3bo9boo83booboo$224bobo15b4o4boo3bo94boobo8boo$ 225bo16bobbo6bobo94bo12boo$242b4o7bo72boo22bo$241b4o80bobo22bo$241bo 82b3o$324boo$324boo$325bobo$326bo27boo$354boo$$323boo3boo$323boo3boo$$ 319b3o3b3o$319bo5b3o$203boo115bo5bo$203boo113bo$318boo$317bobo3$208bo 114b3o$208bo114b3o$195boo12bo112bo3bo$195boo8boboo101boo$204booboo102b oo8boo3boo$205bobo102bo5$187boo114bo$187boo114boo$302bobo$$290boo31boo $289bobo31boo$188boo89boo7bo6boo4bo$187b5o87boo7bobbobbobbobbobo$182bo 4bo4bo32bo62bo6b3oboboo$182bo4b3obbo30booboo61bobo6booboo10boo$182bo5b obboo29b3o65boo7boboo10boo$189boo109bobo$222b3o76bo$216bo6bo$215b3o$ 214bobbo$214boo18bo$215bo18bo$217bo17bo$216bobo12boboo$217bo12booboo$ 199b5o27bobo21boo$182b3oboo15bo51boo$181boboob3o11b3o$180bo4boobo11bob o55boo$179bo8bo13bo56boo$179bobobo4bo70bo$178bo4bo75boo$179bo7bo11boo 57boo$186bo12b3o45boo$181bo3bo13bobo39boo4boo10bo$189b4o48boo14b3o$ 182boo3bo4boo66bobo$186bo4b3o64bo3boo83bo$185bo5bo70bo85bo$192boo152b 3o$183bo4boobboo64b3o$183bo9bo45boo$185bo3bobbo40boo4boo$191bo41boo$ 187boboo$188bo$$273bo$243bo28b3o$231boo5b3obob4o$225boo4boo8boobo25bo 3bo4bobo$225boo12boo4boobo21bo4boob5o$208b3oboo36bo19bobbobobbo3bo$ 207boboob3o33booboboo20bo$206bo4boobo35boobo30boo$205bo8bo37bo32boo$ 205bobobo4bo70bo$204bo4bo75boo$205bo7bo41bo28boo$212bo39b3oboo$207bo3b o38boob3o29bo$254bo28b3o$208boo22bo53bobo$253bo30bo3boo$227boboo22bo 34bo$227bobo6bo16bo$226bo4boo3bo14bobo30b3o$227bo8bo15bo$227bo7bo$240b 3o$231bo9booboo$241boobo9bo38boo$241bobo10boo37boo$241bobo11bo$242boo 8bobo$244bo6bobbo$241bobo7bobo$240bo10bobo$252bo$285boo$242bo3bo38boo$ 238bo3bo$244bo$243boo$$240booboo$242bo$277boo$258bo18boo$267b3o$253bob oo10bobo$253bobo6bobboobbo$252bo4boo3bobb3o$253bo8bobb3o$253bo7bo$$ 257bo144$558bo4bo$556boob4oboo$552bo5bo4bo$551bo$551bo3$549boo3boo$ 550b5o$551b3o$552bo8$552boo$552boo! golly-2.5-src/Patterns/Life/Miscellaneous/infinity-hotel1.rle0000644000175100001440000001454412156145314021234 00000000000000#C Infinite Glider Hotel #C The name is derived from the old mathematical "infinity hotel" #C scenario, where a hotel with an infinite number of rooms always #C has room for more guests by shuffling the old guests around. #C Here two pairs of double Corderships are pulling slowly apart at #C c/12 such that there is an ever-lengthening glider track between #C them. Every 128 generations another glider is injected into the #C glider track, joining the gliders already circulating there. #C Eventually an arbitrarily large number of gliders will be #C traveling around the track. #C The tricky bit to this construction is that even though all the #C previously injected gliders are repeatedly flying through the #C injection point, that point is guaranteed to be empty when it is #C time for the next glider to be injected! #C David Bell, 29 May 2001, based on his original version, 9 Oct 1992. #C From Alan Hensel's "lifebc" pattern collection. x = 274, y = 206, rule = B3/S23 99bo82b3o$87bo11b3o80bobo$85b3o14bo23boo38boo14bobo$69bo14bo16boo23bo 38bobbo9boo4bo$69b3o12boo38bobo38b3o10boo3b3o$72bo47boob3o39boo12bo$ 71boo17bo4bo24boboo42bo13b4o$88boob3obbo3boo19b3o41boobo12boo$89boobo 7bobo15b5o42b4o13bo$72boo16boboobo6bo15b3o43bobobo$72boo18boo6b3o55boo 3booboo13bo$80bo10bo66boo4bo3bo12bobo$79b3o12bo27bo42b3o13b4o$78boobbo 8bobbo27b3o41bo15b3o$82boo9bo88bo$79b3oboo29bobo6boo$80bobboo30bo3boob oo42boo26bo$79b3o6boo30b3o3boo41bobo13bo7boboboo$82boo4bo19boo11bo4bob o21boo17bobo12booboobbooboobbo$82boo6bo16bobo18bo21boo32bo5bobo5bo$89b oo16bo20boo39b4o11bo8bobboo$85boo19boo4boo57bo13bobb3obbo$75bo9bo24bo bbo60boo15b3o$75bobo8b3o21boo47b3o12boo35b3o$75boo11bo30boo$119boo36bo 51bo$156boo3bo20bo25boo3bo$157bobo21bobo12bo12bobo$69boo89b3o18bobo12b o15b3o$68bobo89bo21bo13bo15bo$68bo$67boo91boo32bo17boo$129boo28boo32bo bo15boo$129bo30bo33bo17bo$127bobo29boo50boo$127boo31boo50boo$75b3o92bo $74bobbo42boboo39bo3bobbobobbo63bo$74boobo41b5o39b5oboo4bo46bo15b3o$ 78boo29bo9b4o41bobo4bo3bo46bo14booboo$78boo6boo21b3o110bo3b4o7bo3boo$ 77bobbo3bobbo24bo7b3o48b3o51bo3bo5bobobobo$78boo4boo4boo19boo7b3o49bo 51bo3boo4bobboboo$68boo20bo16boo12bo102b3o7boboo$54boobboo9bo18bobo16b o105boo6boboo10boo$52bobbobbobbo7bobo16boo19bo97boo4boo6b3o$52boobboo bboo8boo36boo97boo13bo$187b3o55b3o$52boob4oboo70boo110bo3bo$51bobboobb oobbo69bo52bo58bo4bo$51b3obboobb3o5boo15bo3bo40bobo51boo3bo56bo3bo$52b obbobbobbo6boo14b3obobbo18bo8bo5bo4boo53bobo38bo16b3obobbo$52b4obb4o 22bobobo19bo3bo4bobo5b3o60b3o14boo18bobo14bo7bo$50boo4boo4boo5bo20bo 17bo3bo3bo8b4o59bo10boo4boo17bobbo14bobo3bo$53boo4boo7bobo19boo16bobo 6boo10bo69boo24boo14boobo3bo$50boobob4oboboo3bobbo13bo3bobo37boo58boo 51boob3o$51bobo6bobo3bobbo18bobo34bo61boo40boo$55bobbo129bo40boo$51b3o 6b3o3bobbo117boo$49boobb3obb3obboo3boo42boo74boo$52bobbobbobbo33boo16b o7boo114bo$50bobo8bobo31bo14b3o4boobobboboo64boo43bobo13bobo$73bo22b3o 11bo6boobbo4bo64boo21bobo19bobo13bobbobbo7bobo$51bo10bo8boo6boo17bo23b o90booboo19bo14boboobobo5booboo$51boo8boo9boo5bo43bobo87boobo41bo6boob o$52boo6boo18b3o129bo37b3o11bo$52b10o20bo130bo36boo13bo$213bo32boo3boo 12bo$246boo$54bo4bo81bobo$56boo84boo80bo$48bo93bo80b3o$48b3o22b4o28b4o 28b4o28b4o$51bo20bo3bo27bo3bo27bo3bo27bo3bo50b3o$32bo17boo24bo31bo31bo 31bo5b3o39booboo$20bo11b3o37bobbo28bobbo28bobbo28bobbo6bo43bo$18b3o14b o143bo$bbo14bo16boo209boo$bb3o12boo42boo182bobboo$5bo16bo30bo7boo183b oo3boo9boo$4boo20bo25b3o186boo4boo4bo8boo$21bobo3bo4b4o15boobbo185boo 6b3o$21bo5boo3bobboo14bo3bo5b3o185b3o$5boo20boo4bobboo13boboo7boo$5boo 5b3o10bo7bobbo14boo6boo$12bobo9booboo5boo23b3o$10bo3bo10bobo26bobo3bob o165boobbo9bobo$10boboobbo37bobbo3boo164b3obbo8booboo8boo$10bo3bo38bo 3bo168bo4bo9boobo9boo$12boo41bobo169boo11bo$18bo33boo187bo$12bo5bobboo 29bo7bo180bo$12bo4bo3bo19boo10bobboboobo$15b3o5bo16bobo10b3o5bo$22boo 16bo20boo$18boo19boo4boo199boo$18bo24bobbo199boo$7bobo9b3o21boo$7boo 12bo30boo$8bo43boo3$bboo$bobo$bo$oo$62boo146b3o$62bo147bo$9bo50bobo 148bo13bo$8b3o49boo27boo132b3o$7boobbo77boo131bo$7bo214boo17bo$7b3o 229b3o11bo$7booboo30bo195bo14b3o$10boboo5boo21b3o50bo142boo16bo14bo$9b oobbo3bobbo24bo6b3o40bo115boo42boo12b3o$11boo4boo4boo19boo8bo41bo11boo 101boo55bo$boo20bo16boo11b3o25boo9boboo9bo4bo157boo$bbo18bobo16bo40boo 8booboo8bobb3o123bo13boo$bbobo16boo19bo49bobo9bobboo90b3o8boobo19boo 11bobo$3boo36boo158bo9bobo18bobo10boobo18boo$200bo11bo33b6o15boo$211b oo9b3o22bo4bo$18boo65b3o123boo8bobobobo21bobbo$16boob3o63b3o6boo115boo 8bo3boboo21boo$16boobobo51boo8bo4boo4boo125boobbobo$20boboo17bo31boo9b oo3boo132bo5bo$40boo15boo28boobbo131bobboboo$24bo16boo14boo31boo121boo 9boboo23boo7b3o$212bobo16boo19bo7bo$114bo97bo18bobo16bo9b3o$9boo47boo 52booboo94boo20bo16boo$5boobboo47bo52b3o103boo8boo4boo19boo5bo$4bobo 38boo12b3o154bobbo7bobbo24bo5b3o$4bo23boo16bo14bo49b3o51b3o48bobbo9boo 21b3o8b3o$3boo23bo14b3o66bo52b3o15b3o30bo35bo10boo$29b3o11bo121b3o17bo 30boo3bo$31bo57boo77b3o13bo32bobboobo$71bo12boo3boo32bo44b3o47b3obbo$ 71bo13boo36bo44b3o99boo$72bo11b3o37bo145bobo$68boboo6bo41boboo49bo98bo $67booboo5boboboobo14bo19booboo48bobo97boo$68bobo7bobbobbo13bobo19bobo 21boo27boo35boo$82bobo13bobo43boo23boo40bo5b3o$99bo68bobo40bobo3bobboo $147boo19bo5boo36boo4b3o$148boo17boo5boo43bo$106boo40bo$106boo40boo$ 90b3oboo51boo37bo44bo$88bo3boboo14boo24boo47boo42b3o21boo8bo$88bo3bobo 14bobbo17boo4boo10bo36bobo40bo24bobbo6bo$86bo7bo14bobo18boo14b3o79boo 19boo4boo5bobo$86bobbob3o16bo38bobo80boo16bo20boo$86bo3bo56bo3boo80bo 16bobo9boo7bo$87bo4bo58bo79bo19boo16bobo$88bo3bo138boo36boo$89b3o55b3o $114bo13boo77boo16boo$113b3o6boo4boo78bo$100boo10boobo6boo84bobo$99boo bo7b3o96boo7boo$96boobobbo4boo3bo51bo52bobo6boo6boo11boboo$95bobobobo 5bo3bo51b3o50boobo6bobo5boo11bo3bobo$94boo3bo7b4o3bo102boo9bo24bo$95b ooboo14bo46bo3bo4bobo29bo15bo3b4obbo22bobo$96b3o15bo46bo4boob5o27boo 20bobobo19bobo$97bo63bobbobobbo3bo27bobo21boo36boo$166bo96boobboo$123b oo50boo50boo38bobo$124boo50boo40boo7bo16boo23bo$124bo17bo33bo37boo4b4o 4b3o14bo23boo$124boo15bobo32boo36boobboob3o6bo11b3o$123boo17bo32boo33b oo6bo23bo$206boobboo$124bo15bo13bo21bo28bobo$122b3o15bo12bobo18b3o29bo $125bobo12bo12bobo21bobo$123bo3boo25bo20bo3boo21boo4boo$127bo51bo20bob oo4bo$199bo9b3o$123b3o35boo12b3o24bo8bo$143b3o15boo35boobo$143bobb3obb o13bo32boo$139boobbo8bo11b4o$138bo5bobo5bo32boo$138bobbooboobbooboo12b obo17boo$138boobobo7bo13bobo$142bo26boo$$154bo$152b3o15bo$152b4o13b3o$ 153bobo12bo3bo4boo$155bo13booboo3boo$168bobobo$154bo13b4o$154boo12bob oo$153b4o13bo$157bo12boo$151b3o3boo10b3o$152bo4boo9bobbo$152bobo14boo$ 152bobo$152b3o! golly-2.5-src/Patterns/Life/Miscellaneous/infinity-hotel2.rle0000644000175100001440000001124212156145314021225 00000000000000#C An improved "infinite glider hotel". #C Every 128 generations, another glider is injected into #C the expanding loop, but there's always room for it. #C Mostly by David Bell, 5/2001; from Jason Summers' "jslife" archive. x = 256, y = 157, rule = B3/S23 99bo66b3o$87bo11b3o64bobo$85b3o14bo23boo37bo3bo$69bo14bo16boo23bo38bo 3bo$69b3o12boo38bobo23boo17bo$72bo7boo38boobboo24boo11boo4bo$71boo7bo 39boo40bo6bo$87bo20bobbo50bo5bo$81boo5bo19bo3bo54boo$72boo14boo17bo4bo 49bo3bo$72boo7boo4boobboo14bo4bo38boo10bobo$87bo3boo14bo3bo39bo$82bo 25bobo31boo6b3o$142boo22b3o$151bo13bo3bo$150bo14bobbo$150boo13boo$88b oo36boo$88bo19boo16bobo41bo$90bo16bobo18bo40bobobboo7boo$89boo16bo13bo 6boo4boo32bo3b4o6b3o$85boo19boo4boo6boo12boo35bo7boboboo$85bo24bobbo5b obbo30boobo9boobo10boo$86b3o21boo7bobo32bo3bo8bobo$75b3o10bo31boo32bo 3bo9bo27bo$74bobbo65bo12bobo37bo$78bo64bo51bobo$74boo66bobo47bobboo$ 69boo3boo3bo59bobboo22bo24bo5bo$68bobo8bo58bo5bo20bobo23bo5bo$68bo8bo 60bo5bo20bobo11b3o10bo4bo$67boo6b3o61bo4bo21bo26bo$75boo52boo9bo53b3o$ 75bo53bo11b3o34bo$78bo48bobo47bobo$74b6o47boo49bo15booboo$73b5o63boob oo47bo$73bo3bo62bo56boo$74b3obo65boo48b3o$74bob3o30bo31b3obbobo$78bo7b oo21b3o34bobo4b3obo$73b3o8bobbo24bo6boo24bo5bo4boboo$84boo4boo19boo5bo bo24bobbobbo4boo$68boo20bo16boo11bo24bobbobbo$54boobboo9bo18bobo16bo8b o30bo4bo$52bobbobbobbo7bobo16boo19bo5bo37bobbo$52boobboobboo8boo36boo 5bobboo34boo$116b3o72boo12bo$52boob4oboo14boo3boo24bo9bo14boo57boo11b 3o$51bobboobboobbo12bobobbobo23boboo22bo38bo31b3obo$51b3obboobb3o5boo 5bo4bo24boo3bo19bobo38bo32bo3bo8bo$52bobbobbobbo6boo5bobbobbo19boo3bo 23boo38bobo32bo3bo5b3o$52b4obb4o14b3o23boobbo3bo56bobboo34bob3o3bo$50b oo4boo4boo5bo29boobo3bo59bo5bo34b3o4boo$53boo4boo7bobo28bo6bo59bo5bo 35bo$50boobob4oboboo3bobbo21bo6bobo65bo4bo10boo27bo$51bobo6bobo3bobbo 23bo6boo4bobo59bo14boo26bobo$55bobbo32b3o13bo61b3o40boobboo$51b3o6b3o 3bobbo146boo$49boobb3obb3obboo3boo42boo17bobo$52bobbobbobbo33boo16bo7b oo9boo35booboo$50bobo8bobo31bo14b3o4boobobboboo5bo35bo$96b3o11bo6boobb o4bo45boo$51bo10bo16boo17bo23bo46b3o3boo40bo$51boo8boo16bo43bobo49boo 39boo$52boo6boo18b3o133bobo$52b10o20bo$$67bo$54bo4bo5boo$56boo8boo133b o$48bo151bo$48b3o34b4o28b4o28b4o47b3o$51bo32bo3bo27bo3bo27bo3bobb3o$ 32bo17boo4boo30bo31bo31bobbo$20bo11b3o20bobo26bobbo28bobbo28bobbo4bo$ 18b3o14bo21bo$bbo14bo16boo$bb3o12boo42boo$5bo8bo46boo170bo$4boo9bo216b oo19bo$14bo6boo209bobo17bobo$20b3o18b3obo15b3o187bo3bo$5boo13boboo16bo 3boboo14boo186bo3bo$5boo12boob4o14boo4bo12boo188bo3bo$20bobo17bob4o13b 3o186bo3bo$21bo38bobo122bo63bobo$61boo121bo65bo$184b3o59bo$245bobo$ 229bo15boo$21boo36boo75boo91b3o17boo$21bo19boo16bobo74boo3b3o88bo16bob o$23bo16bobo18bo77boo48boo22bo17bobboo8boo5bo$22boo16bo13bo6boo81bo40b oobboobboo6bo11b3o15boobobo7boo5boo$18boo19boo4boo5b5o82booboo32boo7b oobbobbobo4b3o14bo19bo$9bo8bo24bobbo4b3oboo119boo13b3o4bo16boo17boo$8b 3o8b3o21boo7bobboo134boo6bo33bobo6boo$8bobbo9bo31b3o85b3o55bo33boo7boo $10boo42bo73boo14bo49b3o36boo$10bo117boo10bo4bo47bo5bo$7boo131bo5bo41b oo6bo3bo23bo17b3o$bboo3b4o129bo5bo40bobbobboo5bo21b3o18boo$bobo4bobbo 129boobbo40boobbo4boboboo4boo15bobo15boo$bo7bo130bobo44boobbo5boo6boo 15bo17b3o$oo139bo38boo6b4o49bobo$7bo54boo77bo37bobo60boo$6bo5bo49bo57b oo57bo$60bobo57boo56boo$5bo5boo47boo95boo$156bobbo42boo36boo$8bo151bo 4bo36bo19boo16bobo$5bobbobboo148bobbobbo36bo16bobo18bo$10bo31bo112boo 4bobbobbo35boo16bo20boo$11boo6boo21b3o8bo99boobo4bo5bo31boo19boo4boo7b o$6bobo8bobbo24bo7boo100bob3o4bobo32bo24bobbo5b3o$7bo9boo4boo19boo6bob o109bobobb3o28b3o21boo8bo$boo20bo16boo74b3o48boo33bo$bbo18bobo16bo73b oo56bo$bbobo16boo19bo5b4o67bo47booboo18bo$3boo36boo4bobb3o61booboo15bo 54b3o$48bo3bo80bobo47boo3boobbo$8b3ob4o32bobbo82bo34b3o10bobo3bo3bo$7b obb3obbo22bo10b3o64b3o53bo9bo5boboo$6bo4bo22boobo3boo76bo26bo21bo4bo7b oo5boo$7bobobb3o19b3o4boo72bo4bo10b3o11bobo20bo5bo68boo$9boboo23boobb oo73bo5bo23bobo20bo5bo68bo$9b3o19boo6b3o15boo56bo5bo24bo22boobbo67bobo $10bo19boo3bo3bo17boo57boobbo47bobo18boobo48boo$31booboo3bobo73bobo51b o18b3oboo$25bo6b4o4bo75bo37bobo12bo17bo$9boo15boo12bo17boo56bo27bo9bo 3bo32b3o$5boobboo14boo31bo84bobo8bo3bo33bo30bo11bo$4bobo38boo12b3o69b oo10boboo9boboo28bo11boo21b3o7bo$4bo23boo16bo14bo66boobobo7bo35boo7bo 11bobbo24bo6bo$3boo23bo14b3o82b3o6b4o3bo32boo9boo8boo4boo19boo4boo$29b 3o11bo84boo7boobbobo38boo20bo16boo8bobo$31bo110bo40bo18bobo16bo8b3o$ 183bobo11boo3boo19bo6bo$146boo13boo21boo13boo21boo7boo$144bobbo14bo31b o5bo30boo$143bo3bo13bo38bo$144b3o22boo20b3obo$160b3o6boo20bobbobo24boo $161bo29booboboboo21bobo$147bobo10boo55bobbobbo$146bo3bo42b3o20bo3b3o 15boo$144boo58bo10boobbobbo15boo$144bo5bo54boo9booboo$143bo6bo53boo11b 4o$143bo4boo11boo27boo47boo$143bo17boo23boobboo47bo$143bo3bo37bobo38b oo12b3o$143bo3bo37bo23boo16bo14bo$144bobo37boo23bo14b3o$144b3o63b3o11b o$212bo! golly-2.5-src/Patterns/Life/Miscellaneous/infinity-hotel3.rle0000644000175100001440000002141012156145314021224 00000000000000#C "Infinite LWSS hotel" #C A new LWSS is added to the loop every 250 generations. #C The old LWSSs reenter the stream at a point 12/25ths of the #C way between the new LWSSs. Unlike earlier patterns of this #C type, this one will not work (for long) if the old spaceships #C re-enter exactly halfway between the new ones. #C Jason Summers, 20 October 2002; c/3 portions by David Bell. #C From "jslife" pattern collection. x = 515, y = 298, rule = B3/S23 196boo141boo$196bobbobo133bobobbo$198boob3o129b3oboo$204bo127bo$198boo b3o129b3oboo$198boobo133boboo3$163boo207boo$164bo207bo$162bo211bo$162b oo209boo$154bo227bo$154b3o223b3o$157bo221bo$156boo10bo210boo$165bo3bo 6bo176boo$165bo4bo4b4o173b3o15boo$165bo3bo3b5obo73bo29bo67b3obo14boo$ 166b3o3bo6boo71bobo27bobo65b3obo$166bobobbo3bob3o73bo29bo67b4o$162b3ob obo3bobobboo173boo$167boo$258boo17boo$233boo23boo17boo23boo$175boo57bo 31booboo31bo57boo$176bo57bobo29bo3bo21bo7bobo57bo$173b3o59boo27bobo3bo bo20bo6boo59b3o$173bo17boo51b3o11boo4boo5boo4boo10bobobbo49boo17bo$ 171bobo18bo50booboo10boo17boo9b3o3bo49bo18bobo$171boo16b3o52bobboo46bo 49b3o16boo$189bo34boo18bo4bo33boo3b5obo16boo34bo$147boo76bo18bobobboo 15booboo12b4o5boo17bo76boo$147bo77bobo19bob3o15bobo15booboo19bobo77bo$ 149boboo18boo53boo5bo13boobbo10boobo5boboo34boo53boo18boobo$148booboo 18bobo59bobo11bo3bo10booboo3booboo10bobo3bo71bobo18booboo$173bo59boo9b 3o3bo34bobb3obo70bo$148booboo20boo74bo12booboo3booboo12boo3boo68boo20b ooboo$149bobo85boo8bo15bobo5bobo14bo9boo7bo77bobo$149bobo68boo14bobbo 7bo15bobo5bobo15bo7bobbo4bobo7boo68bobo$150booboo65boo15boo25bo7bo25b oo6boo7boo65booboo$152bobo88b3o136bobo$152bo31boo165boo31bo$151boo31bo 167bo31boo$182bobo17bo149bobo$181bobo18bo133b3o14bobo$177boo3bo19boo 150bo3boo$177boo157bobo19boo$203b3o31boo59boo36bobo$203boo32boo59boo 36b3o$184boo13boo135boboo$180boobb3obboo5bo3boo11boo107boo7bo6boo17b3o bo$179boo4bobobbo4bobo15boo107boo6b3ob4o18bo3boboo$180boboobo3bo4bo3bo 131boob4o19boo4bo$181boo3bo8bobo33boo71boo26b3o21bob4o$196bo34bobo69bo bo33b3o$233bo69bo35bo$233boo67boo$158boo217boo$158boo217boo$164boo205b oo$164boo56boo89boo56boo$222bobo87bobo$224bo87bo$162boo60boo85boo60boo $162boo5boo40boo111boo40boo5boo$169boo40boo111boo40boo3$209boo115boo$ 209boo115boo11$204bo$205boo$204boo$$328bo$326boo$327boo12$376bo$377bo$ 377boo$378bo$375booboo$331bo42bo3bo$330bobo43boo$332boo42bo$332bo43boo $324bobo4bobo39bobboo$324boboob5o40bo3bo$327boobo47boo$324booboobooboo 42bobbo$324b3o6boo42bo$326bobb4o44boobo$328bo3bo44bobbo3bo$330boo46b3o bbobo$325bo3boo46b3o4boo$323b8o47bo6bo$328bo47boboobbobo$329bobbo46bo bbobo$17bo311bobobo43b3o3b3o$4bo11bobo314bo51boo$3bobo10bobo308bo3bobb o42b3o6boo$bboo12bo312boob3o43boo5bo$4bo321bo4bobbo39bo10bobb3o$bboo 11boo311b6o40bo4bo3b3obobo$bb3o11bobo10bobo293bobbo43boobobobo3bo4bo$ 16boo10booboboo293b3oboo38bobobobbo8bo$bbobbo11bo9bo300b3obbo38bobob3o 6bo$bbobo13bobbo3b7o3bo289bo4boo40booboobo3booboo$bbo19bobo299boo3boob 3o38bo4boobo4bo$3bo15boo3bob7o293bo6boo38bobboboo3boobo$3bobo13bobo3b oo5b4o291bo3boo43bobobobobo$4bo13boo7bobo3bo293boobo44booboboobb3o$3b oo14bobo7bobobbo289boobo48boobboobb3o22bo$20bo10bo292b3o49b5o28booboo$ bbobbo26bobo290boo83bo3bo$bo408bo3bo$oobbo402bo3bo3bo$bb4o399b3o3bobob o$bboboo397bob3o3bo3bo$bbobo405bo3bo$bb3o397bobo6b3o$bboo399b3o4b3o52b o$3boboo397b3o3bo53bobo$6bo4bobbo246bobbo141boo3boo51bobo$6bo3bo124b4o 121bo145b3obbo54bo$4b3o3bo3bo120bo3bo120bo3bo145bo55boo$bboo6b4o121bo 124b4o201bobo$bboobbo129bobbo$5bo460b3o$3boo461b3o$3b3o460bo$84b3o375b o4boo$84boo375bobboobbo$86bo376bob3o$83b3o376b4obo$21bo58boobbobo376b oobo$20bobo56bobobbo293bo84boobo$19boo58bobobb3o292boo85bo$20bobo56bo 6b3o283b4o3boo82boo$20boo56boo6boo261bo23bo4bo83bobbo$23bo48bo5bobo 267bo27bo3bo78boobb3o$19bobbo48bobo11bobbo262bo4bo15bobb3o3bo80bobbo$ 18bo52bo5b3o4bo242bo20booboo4bo13boboobo3bo82boo$17boo51bobbo3bo5boo3b o237bobo19bobobobobboo17b4o$18bo51b3o5bo6boobbo238boo18bobo5bo19b3o$ 18b3o49bo3bo3bobb6o239bobo17b3obooboob3o13boobbo$19bo51b4o11bobbo237b oo16b3o9boo13b3obboo$21bo52boo3boobb3obo237bo16boo3boobo3boo21bo65bo$ 19boo53boo4boobo3boo77bo159bobbo15bo3boo3boobo13bobobbo65bo$19boo49b5o 6b4ob3o76bobo162bo14bo9b5o11bobo71bo4bo$21bo51bo8bo3b3o76bo164boo10boo 3bob3o3bobb3o12boo67booboo4bo$69bobbo91bobbo162bo14b5obo4bo4bo8bo4bo 66bobobobobboo$69boo8b3obboo78b3o161b3o4bo12bobo5bo4bo10b4o66bobo5bo$ 69boo8b3obbo79bo3bo160bo6boo10boboo6bobbo8bob3o65b3obooboob3o$70bo8boo 5bo78b4o158bo8boo20bo10boo68b3o9boo$65bobboobboo10boo10bo71boo158boo5b o14bo6boo10b4o42bo20boo3boobo3boo$63boo4boo6boobbo13bobo70boo158boo7bo 12bo20bobo42boo21bo3boo3boobo$63boo13bo4b3o8boo68b5o151boo5bo7bobo10bo bbobb3o14bobo42boo11b4o6bo9b5o$70bobo5bo3b3obo9bo70bo13bo8boo127b3o15b o11boo3b3o17bo55bo5boo3bob3o3bobb3o$64b3o3boo10bo3bo7boo67bobbo13bobo 7b3obo124boobobbo8bobo11bobo21bobo39b3o10bo5bo5b5obo4bo4bo$64b3obbobbo 6boo3bo9b3o66boo15boo6bo4b3o127bobo8bobo19boo16bo39b3o12bobboo8bobo5bo 4bo$70bo8bobbo3bo55bo20boo15bo5b7oboo121b3o7boo3b4o14boo4boo14bo53bob oob4o7boboo6bobbo$62boo6bo7boobob3o9bobo42boo22bo16bobobo8boo124b7obbo bobo13boobboobbo17boo42b3o6b3o6bo16bo$62bo16bo6b3o6b3o42boo17bobboobb oo13bobobobb7o124boo8bobobo16bo22boo42bobo9b3oboboo7bo6boo$59bobbo6boo bo7b4oboobo53bo14boo4boo14b4o3boo7b3o121boob7o5bo15boo20bo55bo3bobbo8b o$59bo4bo5bobo8boobbo12b3o39bo16boo19bobo8bobo127b3o4bo6boo15boo66b3o 9bo3boo6bobbobb3o$59bo4bo4bob5o5bo5bo10b3o39bobo21bobo11bobo8bobboboo 124bob3o7bobo13bobbo67boo7bo3bo10boo3b3o$60b3obbo3b3obo3boo5bo55bo17b 3o3boo11bo15b3o127boo8bo13bo70bo9bob3o3bo5bobo$61b5o9bo6b4o11boo42bobo 14b3obbobbo10bobo7bo5boo151b5o68boo8b3o4bo13boo$63boboo3boo3bo21boo42b obo20bo12bo7boo158boo70bobo13bobboo6boo4boo$65boo3boboo3boo20bo42b4o 10boo6bo14bo5boo158boo71bo10boo10boobboobbo$62boo9b3o68boo10bo20boo8bo 158b4o78bo5boo8bo$62b3obooboob3o65b3obo8bobbo6boobo10boo6bo160bo3bo79b obb3o8boo$64bo5bobo66b4o10bo4bo5bobo12bo4b3o161b3o78boobb3o8boo$62boo bbobobobo66bo4bo8bo4bo4bob5o14bo162bobbo91bobbo$63bo4booboo67boo12b3o bbo3b3obo3boo10boo164bo76b3o3bo8bo51bo$64bo4bo71bobo11b5o9bo14bo10boo 150bobo76b3ob4o6b5o49boo$72bo65bobbobo13boboo3boo3bo15bobbo5boo152bo 77boo3boboo4boo53boo$71bo65bo21boo3boboo3boo16bo6bo230bob3obboo3boo52b o$136boobb3o13boo9b3o16boo237bobbo11b4o51bo$138bobboo13b3obooboob3o17b obo239b6obbo3bo3bo49b3o$136b3o19bo5bobo18boo238bobboo6bo5b3o51bo$135b 4o17boobbobobobo19bobo237bo3boo5bo3bobbo51boo$50boo82bo3boboobo13bo4b ooboo20bo242bo4b3o5bo52bo$49bobbo80bo3b3obbo15bo4bo262bobbo11bobo48bo bbo$49b3obboo78bo3bo27bo267bobo5bo48bo$49bobbo83bo4bo23bo156b3o102boo 6boo56boo$50boo82boo3b4o179bo103b3o6bo56bobo$48bo85boo64bo122bo104b3o bbobo58boo$48boboo84bo63bo229bobbobo56bobo$48boboo147bobo226bobobboo 58bo$47bob4o145boboo227b3o$47b3obo145boo3bobo223bo$46bobboobbo143bo3bo 3boo222boo$46boo4bo144boobo6bo220b3o$48bo151bo3bo3bo4bo295b3o$46b3o 148b3o5bobo3boo297boo$46b3o147bo3b3oboo5b3o295bo$195b5o3b3o302bobboo$ 47bobo143bo7bobboo55b4o246boo$47boo55bo89bo3b4ob3o54bo3bo243b3o$48bo 54bobb3o85bo3boo64bo243bo$48bobo51boo3boo151bobbo244bo$48bobo53bo3b3o 83b3o311boobo$49bo52b3o4b3o399boo$101b3o6bobo77b4obboo126boo184b3o$ 100bo3bo84boboo131boo184bobo$99bo3bo3b3obo77bobboobboo311boobo$99bobob o3b3o80boo317b4o$99bo3bo3bo214boo40boo144bobboo$100bo3bo217boo40boo5b oo140bo$100bo3bo83boo119boo60boo107bobo26bobbo$101booboo28b5o49b3o119b o172bo10bo$105bo22b3obboobboo48boboo119bobo167bobbobo7bobo14boo$128b3o bbooboboo44boboo123boo56boo110bo3bobo7boo13bo$130bobobobobo43boo3bo 181boo108b4o5boo3bobo13bobo$128boboo3boobobbo38boo6bo186boo105b7obo3b oo15bo$128bo4boboo4bo38b3oboo3boo184boo113bobo19bo$128booboo3bobooboo 40boo4bo110boo56b3o118bo3b7o3bobbo13bobo$129bo6b3obobo38bobb3o114bo54b o4bo125bo9bo11bobbo$126bo8bobbobobo38boob3o114bobo54boboo118booboboo 10boo$126bo4bo3boboboboo43bobbo112boo51b3o125bobo10bobo11b3o$125bobob 3o3bo4bo40b6o148bo18bo143boo11boo$124b3obbo10bo39bobbo4bo131boo12bobo 173bo$129bo5boo43b3oboo134boo14bo161bo12boo$127boo6b3o42bobbo3bo145boo 161bobo10bobo$128boo51bo114boo36bobbo158bobo11bo$129b3o3b3o43bobobo 110boo35boobobo158bo$130bobobbo46bobbo147bo5bo16boo$130bobobboobo47bo 150boo13bo3boo$129bo6bo47b8o141bo4bo12bobo$129boo4b3o46boo3bo143bo3bo 12bobo$129bobobb3o46boo149boobo12bo31boo$130bo3bobbo44bo3bo119boo27boo 12boo31bo$134boboo44b4obbo118boo71bobo$137bo42boo6b3o79bo25boo8bo6boo 65booboo$134bobbo42booboobooboo78bobo23bobbo14boo68bobo$135boo47boboo 81bobo24boo85bobo$136bo3bo40b5oboobo77booboo14b3o70boo20booboo$137boo bbo39bobo4bobo95bo4bo69bo$137boo43bo85booboo12bo5bo69bobo18booboo$138b o42boo86boboo12bobo19boo53boo18boobo$137boo43bobo82bo16boo3b3o15bobo 77bo$136bo3bo42bo83boo14boo5bo18bo76boo$135booboo144boo23boo34bo$136bo 148bob3o53b3o16boo$136boo137boo11bo53bo18bobo$137bo131boo4boo10bo54boo 17bo$138bo129bobo17bo3boo4boo59b3o$268bo25bo3bobo57bo$267boo23boo6bo 57boo$275boo23boo$275boo$$351bobo$281bo65bo3bobo$280bobo70boo$281bo71b o14boo$347bobobo16boo$347b3obobbo$348bo3bo24boo$377bo$378b3o$380bo$ 371boo$372bo$370bo$370boo3$333boboo$331b3oboo$330bo$331b3oboo$333bobo bbo$337boo! golly-2.5-src/Patterns/Life/Miscellaneous/lightspeed.rle0000644000175100001440000000726012156145314020336 00000000000000#C This is a mechanism that could be used for lightspeed #C communication (note the lone glider in the pattern on the #C left). The only catch is that we need a way to create long #C waves of closely spaced gliders. This can be done by using #C many edge-shooting glider guns, but it requires a lot of #C space. The completed device would be shaped like a very #C elongated diamond, with lightspeed communication occurring #C across the short diagonal. #C Jason Summers, 29 Oct 1999; from "jslife" pattern collection. x = 781, y = 364, rule = B3/S23 204boo423boo$203b3o422b3o$203boobo421boobo$204b3o422b3o$205bo424bo78$ 154bo424bo$155boo423boo$154boo423boo3$151bo424bo$152boo423boo$151boo 423boo3$148bo424bo$149boo423boo$148boo423boo3$145bo424bo$146boo423boo$ 145boo423boo3$142bo424bo$143boo423boo$142boo423boo3$139bo424bo$140boo 423boo$139boo423boo3$136bo424bo$137boo423boo$136boo423boo3$133bo424bo$ 134boo423boo$133boo423boo3$130bo424bo$131boo423boo$130boo423boo3$127bo 424bo$128boo423boo$127boo423boo3$124bo424bo$125boo423boo$124boo423boo 3$121bo424bo$122boo423boo$121boo423boo3$118bo424bo$119boo423boo$118boo 423boo3$115bo424bo$116boo423boo$115boo423boo$353boo423boo$352b4o421b4o $112bo238booboo181bo238booboo$113boo237boo184boo237boo$112boo423boo3$ 109bo424bo$110boo423boo$109boo423boo3$106bo424bo$107boo423boo$106boo 423boo3$103bo424bo$104boo423boo$103boo423boo3$100bo424bo$101boo423boo$ 100boo423boo3$97bo424bo$98boo423boo$97boo423boo3$94bo424bo$95boo423boo $94boo423boo3$91bo424bo$92boo423boo$91boo423boo3$88bo424bo$89boo423boo $88boo423boo3$85bo424bo$86boo423boo$85boo423boo3$82bo424bo$83boo423boo $82boo423boo3$79bo424bo$80boo423boo$79boo196b3o224boo196b3o$277bo424bo $278bo424bo$76bo195b3o226bo195b3o$77boo193bo229boo193bo$76boo195bo227b oo195bo$267b3o422b3o$267bo424bo$73bo194bo229bo194bo$74boo186b3o234boo 186b3o$73boo187bo235boo187bo$263bo424bo$257b3o422b3o$70bo186bo237bo 186bo$71boo185bo237boo185bo$70boo180b3o240boo180b3o$252bo424bo$253bo 424bo$67bo179b3o242bo179b3o$68boo177bo245boo177bo$67boo179bo243boo179b o$242b3o422b3o$242bo424bo$64bo178bo245bo178bo$65boo170b3o250boo170b3o$ 64boo171bo251boo171bo$238bo424bo$232b3o422b3o$61bo170bo253bo170bo$62b oo169bo253boo169bo$61boo164b3o256boo164b3o$227bo424bo$228bo424bo$58bo 163b3o258bo163b3o$59boo161bo261boo161bo$58boo163bo259boo163bo$217b3o 422b3o$217bo424bo$55bo162bo261bo162bo$56boo154b3o266boo154b3o$55boo 155bo267boo155bo$213bo424bo$207b3o422b3o$52bo154bo269bo154bo$53boo153b o269boo153bo$52boo148b3o272boo148b3o$202bo424bo$203bo424bo$49bo147b3o 274bo147b3o$50boo145bo277boo145bo$49boo147bo275boo147bo$192b3o422b3o$ 192bo424bo$46bo146bo277bo146bo$47boo138b3o282boo138b3o$46boo139bo283b oo139bo$188bo424bo$182b3o422b3o$43bo138bo285bo138bo$44boo137bo285boo 137bo$43boo132b3o288boo132b3o$177bo424bo$178bo424bo$40bo131b3o290bo 131b3o$41boo129bo293boo129bo$40boo131bo291boo131bo$167b3o422b3o$167bo 424bo$37bo130bo293bo130bo$38boo122b3o298boo122b3o$37boo123bo299boo123b o$163bo424bo$157b3o422b3o$34bo122bo301bo122bo$35boo121bo301boo121bo$ 34boo116b3o304boo116b3o$152bo424bo$153bo424bo$31bo115b3o306bo115b3o$ 32boo113bo309boo113bo$31boo115bo307boo115bo$142b3o422b3o$142bo424bo$ 28bo114bo309bo114bo$29boo106b3o314boo106b3o$28boo107bo315boo107bo$138b o424bo$132b3o422b3o$132bo424bo$133bo424bo$127b3o422b3o$127bo424bo$128b o424bo$122b3o422b3o$122bo424bo$123bo424bo$117b3o422b3o$117bo424bo$118b o424bo$112b3o422b3o$112bo424bo$113bo424bo$107b3o422b3o$107bo424bo$108b o424bo$102b3o422b3o$102bo424bo$103bo424bo$97b3o422b3o$97bo424bo$98bo 424bo$92b3o422b3o$92bo424bo$93bo424bo$87b3o422b3o$87bo424bo$88bo424bo$ 82b3o422b3o$82bo424bo$83bo424bo$77b3o422b3o$77bo424bo$78bo424bo$72b3o 422b3o$30b3o39bo424bo$32bo40bo424bo$31bo20$8b3o422b3o$10bo424bo$9bo 424bo3$6b3o422b3o$3o5bo416b3o5bo$bbo4bo419bo4bo$bo424bo! golly-2.5-src/Patterns/Life/Miscellaneous/loggrow-corder.rle0000644000175100001440000000421212156145314021134 00000000000000#C A Cordership-based object whose population grows logarithmically. #C David Bell, 10 July 2004; from Jason Summers' "jslife" collection. x = 158, y = 168, rule = B3/S23 94bo$86b3o3b4o$86bobo3booboo$86b3obbo$91boo3bo$92b4o$93b3o10boo$106boo 7$114boo$101bo12boo$90boo9b3o$89bobobo7b3o$89bo3boo5bo3bo$90boo8b4o$ 90b3o7boboo3$80bo6boo$79bobo3bo3bo$78bo3bobo3boo$79bobobboboboo$80bo3b obboo$84bo4bo$85bobbo$64bo22bo$56b3o3b4o$56bobo3booboo$56b3obbo$61boo 3bo$62b4o$63b3o10boo$76boo3$78boobo$78bo4bo$78bo5bo$81bobbo$80bobboo$ 71bo7bobbo$60boo9b3o6bobo$59bobobo7b3o$59bo3boo5bo3bo$60boo8b4o6boo$ 60b3o7boboo4boobbo$79boboo$76booboo$76b3o$76bo67boo$76boobbo63boo$32b 5o7bo19boo11b3o$30boo5boo4bobo18boo11boo$30bo7bo4bo$30boo7bo3bobbo28bo $32boo6bo3b3o26b3o$35bo36bobbo$35bo4bo13boo17bobbo53boo9boobbo6boo$36b oobo14boo18bobo54boo8bobob3o4boo$74b3o53bo14bobo$136b3o$134boboo$134bo bboo$134boobo$135boo$51bo3bo6boo71bo$49bobbob3o5boo$52bobobo$40bobo7bo 81bo$34boo4b3obobooboo79bobbo14boboo$34boo6bobboo3bobo3bo90bo4bo$50bob o76bo22bo$38boo91boo8b3o3bo6boo$26b3o8b4o100bobbo3bo7boo$24b7o5boobbo 103bo4bo7bo$23b9o3bob3o102bobo4boo5boo$22bo7b3o3boobo88bo14bo7b5o$23b 3o6bo54b3o39bo$24boo43bo17bo42bo$27bo42bo17bo43boo$28bo39b3o54bo6b3o$ bb5o7bo14bo88boboo3b3o7bo$oo5boo4bobo102b3obo3b9o$o7bo4bo103bobboo5b7o $oo7bo3bobbo100b4o8b3o$bboo6bo3b3o8boo91boo$5bo22bo76bobo$5bo4bo90bo3b obo3boobbo6boo$6boobo14bobbo79booboobob3o4boo$25bo81bo7bobo$101bobobo$ 94boo5b3obobbo$22bo71boo6bo3bo$21boo$20boboo$19boobbo$20boobo$19b3o$ 10bobo14bo53b3o$4boo4b3obobo8boo54bobo18boo14boboo$4boo6bobboo9boo53bo bbo17boo13bo4bo$82bobbo36bo$82b3o26b3o3bo6boo$82bo28bobbo3bo7boo$114bo 4bo7bo$79boo11boo18bobo4boo5boo$78b3o11boo19bo7b5o$12boo63bobboo$12boo 67bo$79b3o$77booboo$75boobo$75bobboo4boobo7b3o$76boo6b4o8boo$83bo3bo5b oo3bo$84b3o7bobobo$75bobo6b3o9boo$75bobbo7bo$73boobbo$73bobbo$73bo5bo$ 74bo4bo$76boboo3$80boo$80boo10b3o$92b4o$91bo3boo$96bobb3o$91booboo3bob o$92b4o3b3o$70bo22bo$69bobbo$68bo4bo$69boobbo3bo$68boobobobbobo$68boo 3bobo3bo$68bo3bo3bobo$69boo6bo3$54boobo7b3o$54b4o8boo$53bo3bo5boo3bo$ 54b3o7bobobo$54b3o9boo$42boo12bo$42boo7$50boo$50boo10b3o$62b4o$61bo3b oo$66bobb3o$61booboo3bobo$62b4o3b3o$63bo! golly-2.5-src/Patterns/Life/Miscellaneous/sawtooth6b.rle0000644000175100001440000000174212156145314020305 00000000000000#C May be the smallest known sawtooth pattern by population. #C The minimum population is 278 (at generation 0, 768, ...) #C David Bell, 5/04; from Jason Summers' "jslife" pattern collection. x = 140, y = 90, rule = B3/S23 122boo$122boo5boo$129boo3$98boo8boo17boo$98boo9bo17boo$109bobo21boo$ 110boo21boo$92boo22b3o$92boo20bo4bo$96boo18boboo$96boo15b3o$112bo3$91b oo$91boo41bo$132b3o$131bo$131boo11$138boo$13boo123boo$13boo3$133boo$ 133boo$26bo110boo$25boo110boo$5boo5bo12bobo68boo21boo$5boo6bobbo79boo 21bobo$17bo3boboo77boo17bo9boo$15boo4bo3bo76boo17boo8boo$25bo$21b3oboo $24boo74boo$21boo77boo5boo$107boo5$16boo$bb3o10bobo$18bo$o3bo5bo3bobbo $4o5bobobbo$o9bo3b3o$14boo$26bo53bo$26bo$27bo50b3obo$23boboo12bo37bob oo$22booboo11boo37boobo$23bobo11boobo34bob3o$38boo$39b3o35bo$48boo23bo $46boboboo20bobo$35boo8bo4boo20boo$35boo9boobbo25boo$53boo21bobo$52b3o 16boo5bo$55boboo4boo6boo5boo$55bobbo4boo$56boo$56boo5$55boo$46boo7boo$ 32b3o10bobo$48bo$30bo3bo5bo3bobbo$30b4o5bobobbo$30bo9bo3b3o$44boo! golly-2.5-src/Patterns/Life/Miscellaneous/tubstretch-c124b.rle0000644000175100001440000001473512156145314021213 00000000000000#C c/124 pseudo tub-stretcher #C Jason Summers, 2-Sep-1999 -- from "jslife" pattern collection x = 346, y = 313, rule = B3/S23 126boo$126bobb3o$127bob3o13$120boo$119bobo$121bo12$98bo$98boo$97bobo$ 104boo$105boo$104bo3$19boo133bo$19boo131bobo$44boo107boo$44boo5$90boo$ 19b3o67bobo$18bo3bo21b3o44bo$17bo5bo19bo3bo$8boo7booboboo$8boo32bo5bo$ 42boo3boo$20bo$8bo10bobo$7b3o9bobo23bo$6bo3bo8boo23boboo$8bo9bo25bo$5b o5bo5b3o24bo3bo$5bo5bo4bo3bo24bobbo$6bo3bo4bob3obo23b5o18bo$7b3o6b5o4b o19b5o18boo$26boo16boo3boo16bobo$25boo18b5o24boo$38bobo5b3o26boo$38boo 7bo26bo$10bo28bo$$180bo$10bo21bobo144bo$8bobo22boo144b3o$9boo22bo$18b oo6boo$18boo6bobo$27b3o16boo$3boo3boo18boo16boo$17bo7boo33boo$4bo3bo9b o6b3o31bobo$5b3o8b3o42bo$5b3o$26boo$3bo11bo10boo4bobboo$bbobo11bo14bo 3boobboo130bo$bbobo10bo15bo7boo129bobo$3bo28b4o11bobo121bo$48boo$19bo 28bo$oo3boo12b3o162bo$o5bo15bo160boo$21boo160bobo24boo$bo3bobboo28bo 17boo151boo$bb3o4boo27boo16boo153bo$8bo28bobo3$48bo$48boo163boo$47bobo 162boo$5bo15boo3boo186bo$3booboo15b3o$22bo3bo$bbo5bo14bobo21boo$24bo 20bo3bo161boo$bbooboboo35bo5bo160boo$43boobo3bo8boo$21boo21bo5bo8boo$ 22bo7boo8boo3bo3bo151boo$19b3o7bobo7bobo5boo151bobo$19bo11bo7bo162bo$ 13boo23boo$bboo8b3o$3bo7bobobbobboo$3o8boobboobboo25bo$o5boo7boo24b3ob oobboo152b3o$6boo33b4o4boo154bo$29bo15boo7boo148bo$27b3o24boo$26bo5bo$ 26boo4b3o$35bo206boo$34boo152bo52boo$5b3o7boo37b3o131boo53bo$4bo3bo5bo bo26b3o8b3o130bobo$16bo26bo9bo3bo$3bo5bo34bo$3boo3boo42boo3boo$16boo 227boo$16bobo17b3o6b3o196boo$8boo6bo4boo3boo7bo3bo7bo198bo$8bobo12b3o 8bo5bo5bo4boo$10bo11bo3bo7booboboo10bobo$9boo12bobo25bo$6bo17bo$6bobbo 30bo$6bo14b3o15boo10bo$21b3o$38boboo129boo$5booboboo25bobboo128bobo$ 37b4o131bo$5bo5bo7boo3boo26b3o$20b5o26bo3bo$6booboo10b3o12boo3boo7bo5b o$8bo13bo16bo10bo5bo$36bo5bo10bo119b3o$37booboo9bo3bo119bo$38bobo11b3o 119bo$39bo13bo$7boo30bo$7boo$53boo219boo$21boo30boo103bo114boo$21boo 135boo115bo$39boo116bobo$39boo$$293boo$277boo14boo$276boo$278bo8$141b oo$140bobo$142bo131b3o$276bo$275bo3$109boo32b3o$109boo34bo131boo$87boo 55bo131bobo$87boo34boo153bo$74bo4bo10boo31boo$72bobo4bo10b3o5boo$64boo 4boo7bo10boo6boo$64boo4boo11boobboo39bo$70boo8boobbobboo39boo$72bobo5b 4o43bobo131boo$74bo7bo17boo47bobo110boo$99bobbo4boo3boo35bo3bo107bo$ 88boo12bo50bo7bo$88boo12bo5bo3bo26boo8bo4bo4b4o146boo$85bo13boobo6b3o 27boo12bo4boboboo144boo$85boo12boo8b3o37bo3bo3bobbob3o8boo135bo$84bobo 62bobo6boboboo9boo$159b4o$72boo26boo59bo$71bobo26boo5boo41bo$61boo7bo 6boo4bo24bo22boo4b3o10bobo$61boo7bobbobbobbobbobo20b3o7boo14bobo3bo12b oo$70bo6b3oboboo20bo8boo16b3o3bo$71bobo6booboo31bo16boo$72boo7boboo45b oo$82bobo9boo34b3o111b3o$83bo10bobo46boo101bo$96bo46boo100bo$96boo33b oo204boo$131boo204boo$113b3o$98boo15bo131boo$98bo15bo22boo107bobo78b3o $88boo6bobo19boo13boobobboboo105bo80bo$87b3o6boo19b3o13bo4bobboo185bo$ 75bo8boboo26boboo19bo14b3o$75bobo6bobbo26bobbo16bobo15bo$76bobo5boboo 10bo15boboo35bo9bo$63boo11bobbo7b3o8boo8boo7b3o5boo35bobo165boo$63boo 11bobo9boo7bobo7bobo8boo5bobo22bobo8boboo66boo96bobo$75bobo24boo3bo19b o22bobbo6booboo10boo55boo97bo$75bo9bo14bobbobboo19boo12boo10boo6boboo 10boo54bo$86boo53boo8bo3boo5bobo$85boo13bobbo34bo7boo5boo8bo$101bobbo 24boo6boo6bo4bobbo$102bobo23bobo6bobo10bobo$90boo11bo26bo183boo$90boo 223boo$102boo210bo$77boo23boo42bo7bo$75bobbo66b4o5bobo$74bo7b3o3bo51b oobbobboo8boo4boo$66boo6bo6bo3b5o20boo9b3o16boobboo11boo4boo$66boo6bo 7bo3booboo9boo8bobbo9bo13boo10bo7boo$75bobbo3bo3boob3o8boo12bo7bo5bo7b 3o10bo4bobo$77boo5b4oboo23bo12b4o6boo10bo4bo59b3o$86b4o24bo11boobobo8b oo74bo61boo$88bo14boo5bobbo11b3obobbo7boo73bo62boo$102bobo5boo14boobob o127boo$102bo24b4o127bo3bo29boo$101boo25bo113boo13bo5bo28boo$217boo23b oo13bo3boboobboo$216bobo14boo3bo6boo10bo5bo3boo17b3o8b3o$218bo14bobo3b o5b3o10bo3bo16bo6bo12bo$234b5o6boo12boo17b3o6bo10bo$235b3o4boo9bobo22b 3o$242boo10boo13boo48boo$254bo14boo5boo3boo34bobbo$276boo3boo17boo14bo 15bobo$201boo67bo28bobo6boo6bo10b3obbo3bo$202boo65bobo29bo6boo6bo19bo$ 201bo66bobbo45bobbobboo7bo4bo4boo$267bobbo8boo38boobbobbobo7bo5boo$ 324b3o5bo3bo$238bo9boo17bobbo61bobo$237bobo7b4o18boo5boo$230boo4boboo 5b3obbobbobo21bo6boo14boo$230boo3booboo9boobbobbo17b3o8boo13boo15bo$ 236boboo6bo9boo16bo9bo15boo14bo$237bobo5bo8bo3boo41bo14b3o$164boo72bo 6bo10boo10bobo29bobo$164boo87bobbo6boo4boo28boobo$144boo107bobo7bobo3b o42boo$142bobbo32boo85bo46boo$129bobo9bo7b5o24boo85boo33boo$129bo3bo7b o6bo5bo16b3o10b3o113boo$119boo12bo7bo7boo3bo10bo5bo14bo$119boo8bo4bo7b obbo7bo9booboo4bo12bo81boo$133bo10boo121bo35bobboo11boo$129bo3bo28bo5b o86bo9bobo17bo11bo4bo3boobboo7bobo$129bobo8bobo12boo48bo49boo8boo18boo 9boo4bo7boo7bo$141boo12bobbo3booboboo18boo13b4o37boo11boo22boo4boo8bob o4b4o$141bo44bobo12b4o16bo20b3o3bo7b3o21boo4b3o$155bobbo29bo5boo5bobbo 8boo5bobo16boboo4b4o5boo22boo4boo45bobo$154bobbo36boo5b4o14bo3boo7boo 5bobbo4bo4bobboo20boo6boo7boo32boo3bobbo$154bobo45b4o3boobobo4bo3boo3b oobboo5boboo5bo3bobbo20bobo6bo8bobo24boobboob3o5boo$155bo49bobbo3boo5b o3boo3boo12b3o3boobo19boo3bo19bo23bobo3bo3bo3bo3boo4boo$209bo10bobo20b oo25bobboboo19boo6boo4boo7bo8bobo5boo6boo$125bo10bo18boo52bobbo8bo48bo 29b3obo5boo7bobbo6boobbobbo$125boo9boo17boo5boo7boo97bo31boobo13bo13bo bo$116boobboo4boo7bobo4bo20bo8boo12boo69bo12boboo27bo18bobo$116boobboo 4b3o13bobo15b3o8bo14boo84boo47boo$120boo4boo15bobo14bo41bo56bo$125boo 16bobbo54bo57bo$125bo17bobo39boboo12b3o67boo39bo$142bobo4boo4bobo27bob o55bo27boo20boo16boo10boo$142bo6bobo4boo28bo11boo41b4o6boobboo35bobo 16bobo9boo$151bo4bo29boo10boo40boboboo5b4obobbobo32bo11boo12boo6bo3boo $151boo33boo47boobbobbob3o5boobo3bo3bo19bo20bo3bo10b3o5bo3bobo$186boo 47boo3boboboo4bo12bo5boo11b4o17bo5bo10boo6b5o$241b4o14bo4bo4boo10boobo bo6bobo6bobbo3bo13boo4b3o$153boo49boo37bo19bo16b3obobbo3bo3bo13bo13boo $153bo28bo10b4o7bobo52bo3bo17boobobo4bo8bo7bo$141boo8bobo17boo8boo5boo 7bo6bo54bobo10boo8b4o4bo4bo3bo4boboo$141boo8boo18boo8bobo4boobboo3bo 73bobo9bo7bo8boo$128bo4bo10boo21bo6boo16boobbo74bo19bo3bo$126bobo4bo 10b3o20bo6b3o93boo21bobo$124boo7bo10boo28boo36boo8bo$118boo4boo11boobb oo20boo6boo7boo30bobbo6bobo$118boo4boo8boobbobboo19bobo6boo7bobo24boo bbo3bo7bobo$126bobo5b4o19boo3bo19bo4bo3bo14b3obboobbo7bobbo3boo$128bo 7bo20boobboo19boobbo4bo4boo5boboo16bobo4boo$186bo4bo4boo5bobbo8b3o4bob o$187b3o13boboo15bo$156boo48b3o$156boobo47boo$159bo$159bo37bo$156bobbo 20boo14boo$130boo9boo14boo20bobo14bobo8bobo$130bobo9boo37bo23bo3bo$ 125boo4b3o7bo6bo44boo10bo12boo$121b4obbo4b3o12bobo17boo24bobbo7bo4bo8b oo$121b3oboo4b3o12bo3boo3boo9bobo28bo7bo$130bobo13bo3boo3boo8b3o4boo4b o18bo7bo3bo$130boo14bo3boo12b3o4bobboobobo17bo9bobo$147bobo15b3o4b3obo 3bo12bobbo$148bo9boo6bobo4boobo3bo12boo$157bobo7boo6boo3bo$157bo19bobo $156boo20bo! golly-2.5-src/Patterns/Life/Miscellaneous/twinprimes.rle0000644000175100001440000001743212156145314020411 00000000000000#C Twin prime generator #C A LWSS escapes past the p240 gun about generation 720n+420 iff #C both 6n-1 and 6n+1 are prime. #C Dean Hickerson, drhickerson@ucdavis.edu 9 September 1994 #C From Jason Summers' "jslife" pattern collection. x = 440, y = 294, rule = B3/S23 412boo$410booboo13boo$410b4o13b4o$411boo14booboo$93b3o11b3o319boo$93bo bbo10bobbo$93bo6b3o4bo16b3o11b3o$93bo5bobbo4bo15bobbo10bobbo$94bo4boob o5bo17bo4b3o6bo285boo$126bo4bobbo5bo284bobbo$125bo5boboo4bo285bobboo$ 424bobboo$99bo8bo315b4o$99bobo5b3o278bo7bo$107boboo14bo8bo254bo7boo$ 100bobbo4b3o13b3o5bobo249bo4bo6boo30boo$101b3o4boo13boobo258b5o29b4o4b 4o$102bo20b3o4bobbo280bo3bo3bo4booboo$124boo4b3o282bo6bo6boo$131bo279b o3bo5bo$412b4o$91b3o313b3o$90bobbo311booboo26boo$93bo46b3o264b3o17b4o 4b4o$93bo46bobbo268b4o10bo3bo4booboo$92bo47bo270bo3bo14bo6boo$106b3o3b 3o25bo274bo13bo$105bobbo3bobbo25bo272bo18bo$108bo3bo6b3o3b3o253bo49bo$ 96b3o9bo3bo5bobbo3bobbo253boo47bobboo$98bo8bo5bo7bo3bo255boo47bo5bo$ 97bo12bo10bo3bo9b3o293bobobboo$110bo9bo5bo8bo295bo3boo$109bobo11bo12bo 296b3o$101b3o19bo$76bo13bo12bo18bobo$75b3o11b3o10bo27b3o303boo$75boboo 4bo5boboo37bo12bo13bo277b4o$76b3o3b3o5b3o38bo10b3o11b3o245bo13boo15boo boo$76boo3boobbo4boo49boobo5bo4boobo244bo13b4o16boo$81bo3bo24b3o28b3o 5b3o3b3o245b3o11booboo$81boboo57boo4bobboo3boo261boo$81boo38b3o24bo3bo $149boobo213bo$75b3o73boo214boo42boo$74bobbo288boo41booboo$77bo78b3o 250b4o$77bo78bobbo246bo3boo$76bo79bo248boo$156bo249bo3boo$102b3o52bo 251b4o$102bobbo303booboo$102bo26b3o279boo$92bo9bo25bobbo227bo$91b3o8bo 28bo226bo$55b3o11b3o19boboo8bo27bo9bo216b3o36b4o$54bobbo10bobbo20b3o 36bo8b3o253bo3bo$57bo4b3o6bo20boo36bo8boobo239boo16bo$57bo4bobbo5bo67b 3o209bo21b4o4b4o14bo$56bo4bo8bo69boo21bo13bo9boo163boo18bo3bo4booboo$ 97bo5bo58b3o11b3o7b4o161boo23bo6boo$96b3o3b3o57boboo4bo5boboo6booboo 184bo$62boo31boobo3boboo4boo18bo5bo26b3o3b3o5b3o8boo189bo$62bo7bo24b3o 5b3o4bobo16b3o3b3o25boo3boobbo4boo198bo$69b3o24boo5boo6boo9boo4boobo3b oboo29bo3bo28bo175bobboo$68boobo49bobo4b3o5b3o29boboo30bo173bo5bo$68b 3o29bo20boo6boo5boo30boo28bo3bo174bobobboo$69boo28b3o97b4o174bo3boo$ 98bo3bo30bo28b3o26bobb3o117bo64b3o$132b3o26bobbo25boobbobo116bo$72bo5b o52bo3bo28bo26bobb3o116b3o$71b3o3b3o18booboo61bo34b4o179boo$53b3o15bob ooboobo20bo62bo34bo3bo178b4o25boo$53bobbo15b3ob3o52booboo66bo133bo27b oo15booboo15b4o4b4o$53bo18boo3boo33bo20bo67bo135boo24b4o16boo15bo3bo4b ooboo$53bo57boo41b3o3b3o16bo29bo126boo25booboo36bo6boo$54bo20bo35bobo 7bo31bobbo3bobbo14b3o29bo154boo36bo$74bobo10bo33boo33bo3bo17b3o25bo3bo 16bo$73bo3bo9boo31bobo33bo3bo19bo26b4o17bo$58boo14bobo9bobo57bo8bo5bo 16bobo43bo3bo128boo49boo$57bobo14b3o68boo11bo19bo46b4o126booboo48bobo$ 59bo85bobo10bo192bo3b4o49boboo$157bobo16bo172boobo3boo51boo$82b3o90boo 92bo79bo3bo55bo$82bobbo89bobo90bo80boobo3boo$82bo66b3o72b3o41b3o80bo3b 4o$82bo65bobbo74bo128booboo50boo$83bo67bo72bobo130boo50b4o$151bo60bo 11boo166boo15booboo$150bo59bobbo177b4o16boo$210bobbo129b4o44booboo$ 211bo5boo8bo114bo3bo46boo$216b4o8bo117bo$216booboo3bo3bo116bo$73boo 143boo5b4o156boo$72bobo308booboo$67b3o4bo304bo3b4o$67bobbo90bo215boobo 3boo$67bo92boo215bo3bo$67bo92bobo10bo13bo189boobo3boo$67bo104b3o11b3o 52bo29bo29bo29bo47bo3b4o$68bo103boboo4bo5boboo51b3o27b3o27b3o27b3o49b ooboo$173b3o3b3o5b3o54bo29bo29bo29bo50boo11boo$173boo3boobbo4boo54boo 28boo28boo28boo19bo39b4oboo$178booboo172bo38b6o$178bobb3o165bo5bo15b4o 20b4o$179boboo167b6o14bo3bo29boo$181bo192bo28b4o$172b3obbo3bo191bo29b ooboo$171bobbo3bobo224boo$174bo4bo221bo$174bo71boo28boo28boo28boo28boo 31bobo$173bo72bobo27bobo27bobo27bobo27bobo32bo$164b3o80boo28boo28boo 28boo28boo36boo$163bobbo236booboo$166bo3b3o230b4o$166bo3bobbo15bo214b oo$166bo3bo17b3o194boo8b4o$166bo3bo16boobo192booboo6b6o$165bo5bo15b3o 135boo52bo3b4o7b4oboo$188boo134b4o46boobbobo3boo12boo$167b3o154booboo 44bobboo3bo$167bobo76boo28boo28boo18boo46boobbobo3boo$167b3o76bobo27bo bo27bobo10bobo57bo3b4o$247boo28boo22boo4boo9bobboo24boo34booboo$301bo 17bobo16b4o4b4o35boo5boo5b4o$145b3o11b3o5b3o156boo9bo3bo4booboo9bo29b ooboo3bo3bo$145bobbo10bobbo5bo155booboo12bo6boo11bo28b4o8bo$145bo6b3o 4bo164b4o12bo15bo4bo29boo8bo$145bo5bobbo4bo140b3o14bo7boo30b5o$146bo4b oobo5bo129b4o5b5o13boo16bo$289bo3bo5b3oboo11bobo12bo3bo62boo$293bo8boo 26bo3bo9bo52bobbo$285bo6bo38bo12b6o42boo3bobbo$152boo6bo88bo29bo7b3o 32bo9boo9bob3o44bo3booboo$152bo6b3o86boo28boo5bo6bo29boo13boo9bo48boo$ 159boboo130bo27bobo13bo37b3o$160b3o126bo3bo83bo$107boo6boo43boo128b4o 53boo27bo$106b4o4b4o228b4o49b4o$106booboo3booboo227booboo33bo13bo3bo$ 108boo6boo7boo47b3o120b4o30boo15boo35bo16bo$123booboo46bobbo118bo3bo 28booboo47bo3bo15bo$123b4o16b3o28bo125bo14b4o10b4o49b4o$124boo16bobbo 28bo9boo8bo104bo14bo3bo11boo$145bo28bo8b4o8bo51bo70bo$145bo29bo7booboo 3bo3bo52bo68bo$120b4o20bo40boo5b4o48bo3bo$116boobbobboo120b4o$117bo3bo bboo114b3o25boo39boo3boo$121bobbo113booboo24b4o36bo6bobo$122boo67bo31b oo15b3o24booboo34bobbo6bo$146boo44boo30boo19b4o20boo34boo7b3o$81b5o58b ooboo44bo29bo20bo3bo5bo51boo$80bo4bo31bo26b4o13b3o29bo54bo6bo6boo$85bo 32bo6boo18boo7bo6bobbo27bo54bo3bo3bo4booboo$84bo29bo3bo4booboo24bobo6b o56b5o29b4o4b4o$108b4o3b4o4b4o26boo6bo55bo4bo38boo45boo5b4o$107bo3bo 12boo36bo31bo27bo83booboo3bo3bo$111bo83bo25bo33bo50b4o8bo$103boobbobbo 65bo14bo3bo11boo45bo3b3o46boo8bo$103b3o71bo14b4o10b4o43bo3bob3o$103boo bbobbo62bo3bo28booboo43bo6boo$111bo62b4o30boo15boo28b5obo$107bo3bo111b ooboo29b4o$108b4o89bobo19b4o31bo$167b4o31boo20boo12boo$166bo3bo31bo36b oo$170bo67bo23boo$162boobbobbo51b3o20boo14booboo$162b3o31bobo20bo3boo 18b4o13b4o$162boobbobbo27boo20bobobboo17booboo13boo$170bo8boo16bo20bo 5bo20boo$166bo3bo5b3oboo37bobboo$167b4o5b5o38bo$177b3o22boo17bo$201b4o 12bo$201booboo12bo6boo$194bobbo5boo9bo3bo4booboo$185boobbo4bo3bo16b4o 4b4o$170boo12bobbobbobbo4boo24boo$169bobo13boobb3obbo3bo$156boo11boo 14b3obbo3bobbo5boo$155bobo31bo11booboo$157bo43b4o$202boo3$200boo$155bo 43b4o$153bobo31bo11booboo$154boo11boo14b3obbo3bobbo5boo$167bobo13boobb 3obbo3bo$168boo12bobbobbobbo4boo24boo$183boobbo4bo3bo16b4o4b4o$192bobb o5boo9bo3bo4booboo$199booboo12bo6boo$199b4o12bo$103bo71b3o22boo17bo$ 103boo60b4o5b5o38bo$102bobo59bo3bo5b3oboo37bobboo$168bo8boo16bo20bo5bo $160boobbobbo27boo20bobobboo$160b3o31bobo20bo3boo$160boobbobbo51b3o$ 168bo$164bo3bo31bo$165b4o31boo20boo$105boo92bobo19b4o$b6o31boo63booboo 113booboo$o5bo28b3oboo58bo3b4o65b4o30boo15boo$6bo28b5o54boobbobo3boo 65bo3bo28booboo$5bo30b3o54bobboo3bo73bo14b4o10b4o$94boobbobo3boo68bo 14bo3bo11boo$99bo3b4o86bo$103booboo84bo$105boo5boo5b4o28boo$80bo29boob oo3bo3bo27bobo$81bo28b4o8bo20boo7bo37bo$76bo4bo29boo8bo20b4o45bo83bo$ 77b5o60booboo44bo84bo$144boo44boo79bo4bo20boo8bo$119bo69bo82b5o19b4o8b o$120bo175booboo3bo3bo$115bo4bo177boo5b4o$107bo6boo3boo$105b3o10bo64b oo5b4o$104bo76booboo3bo3bo107bobo$104boo75b4o8bo97boo6boo3bo$182boo8bo 98bobo5b3oboboo$119b4o170boo4b3o4bo$104bo13bo3bo169bo9bo3bo$105bo16bo 180b3o$101bo3bo15bo181bo$102b4o$307bo$297boo9bo$294b3oboo4bo3bo$294b5o 6b4o$265boo4boo22b3o$265bo3booboo$269b4o16boo$270boo15booboo$287b4o$ 135boo151boo$60bo73b4o$59bobo65bobo4booboo$49boo7boboo74boo15boo132bo$ 48bobo6booboo10boo54bo22booboo94b3o34boo$47bo6b3oboboo11bo54bo22b4o94b 5o32boboo$38bo8bobbobbobbobbobo66bo23boo95b3oboo31bobo$38boo7bo6boo4bo 191boo32boo$48bobo$49boo17boo58bo22bo$69bo58bo22boo128bo$61bobo64bo21b oboo113boo13bo6boo$62boo86bobo113bobo9bo3bo4booboo3boo8bo$62bo64bobo 20boo116bo10b4o4b4o3b4o8bo$288boo4booboo3bo3bo$296boo5b4o$67b3o75bo 126boo$81boo63bo6boo116bobo$81bobo58bo3bo4booboo117bo$83bo41boo16b4o4b 4o146boo$83boo38booboo24boo146booboo$123b4o36boo112boo22bobbo$77boo45b oo36b4o110bobo22bobbo$77bobo82booboo111bo23boo$79bo84boo$62boo15boo76b obo$63boo91bobboo121boo21bo$62bo94bobo121bobo22bo$164boo117bo3bo14bo3b o$162booboo3boo8bo105bo3bo12b4o$162b4o3b4o8bo104bobboo$163boo4booboo3b o3bo109bo$55bo80b5o30boo5b4o105boo$55boo78bo4bo$43bobo8bobo83bo$43bo3b o91bo$33boo12bo10boo117bo$33bo14bo7bobbo118boo$47bo7bo12bo110bo$43bo3b o7bo11boo110bo$43bobo9bo122bo$56bobbo$58boo$180bo$181bo$177bo3bo$161b 4o13b4o$160bo3bo$164bo$163bo! golly-2.5-src/Patterns/Life/Miscellaneous/wicks-DRH-2002.rle0000644000175100001440000013344612156145314020330 00000000000000#C Wicks found on random tori. The first p8 and the p20 have been #C found before; probably some of the others have too. Periods are: #C 3, 4, 6, 7, 8, 9, 10, 12, 16, 20, 21, 24, 26, 29, 32, 38, 40, 56, #C 176, 190, 224, 360, 376, 525, 1056 #C Dean Hickerson, 31 August 2002 x = 1172, y = 450, rule = B3/S23 9b2obo$9bob2o$13b2o125b2o650bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo$13bo125bobo649b3o13b 3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b 3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o$14bo28bo4bo8bo4bo8bo4bo8bo4bo8bo 4bo8bo4bo8bo4bo6b2o66b2o5b2obo228b2obo6b2obo331b3o13b3o13b3o13b3o13b3o 13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o 13b3o13b3o13b3o13b3o$13b2o27b3ob3o7b3ob3o7b3ob3o7b3ob3o7b3ob3o7b3ob3o 7b3ob3o4bobo68bo5bob2o228bob2o6bob2o293bob2o6b2obo$9b2obo28bob4obob4ob ob4obob4obob4obob4obob4obob4obob4obob4obob4obob4obob4obob4ob3o65bo4b2o 4b2o230b2o2b2o4b2o291b2obo6bob2o$9bob2o28b2o6b3ob3o7b3ob3o7b3ob3o7b3ob 3o7b3ob3o7b3ob3o7b3obobo67b2o3bo5bo15b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b 5o9b5o9b5o9b5o9b5o43bo3bo5bo290b2o8b2o25b3o3b3o7b3o3b3o7b3o3b3o7b3o3b 3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o 3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b 3o3b3o7b3o3b3o$13b2o27bo7bo4bo8bo4bo8bo4bo8bo4bo8bo4bo8bo4bo8bo4b2o72b o5bo8b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3b o3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo44bo3b o5bo14b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o33bo8bo$ 13bo25b3o97bobo65b2o3b2o4b2o7bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo 2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo 3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo2bo3bo43b2o2b2o4b2o15bo7bo7bo7b o7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo33bo10bo$14bo24bo100b2o66bo3bo5bo8bo3bo3b3o3bo3bo3b3o3bo3b o3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o3bo3b o3b3o3bo3bo3b3o3bo3bo3b3o3bo3bo3b3o40b2obo4bo5bo290b2o8b2o26bo5bo9bo5b o9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo 5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo$13b2o192bo5b o5bo7b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o9b5o46bob2o5bo5bo 291bob2o6b2obo21bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bo bo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bo bo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo 3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo 3bobo3bo3bobo3bobo3bo3bobo3bobo$9b2obo194b2o3b2o4b2o224b2o8b2o4b2o291b 2obo6bob2o22bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5b o4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo 5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo 4bo5bo$9bob2o199bo5bo225bo9bo5bo16bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo39b2o2b2o4b2o 23bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo$ 207b2o4bo5bo225bo9bo5bo14b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b 3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o5b3o 5b3o5b3o39bo2bo5bo24bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo 5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo 4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo4bo4bo5bo 4bo4bo5bo4bo4bo$208bo3b2o4b2o224b2o8b2o4b2o295bo4bo5bo23bo3bobo3bobo3b o3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bob o3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bob o3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo 3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo3bobo3bo3bobo $207bo6b2obo228b2obo6b2obo297b2o2b2o4b2o28bo5bo9bo5bo9bo5bo9bo5bo9bo5b o9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo 5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo$207b2o5bob2o228bob2o6bob2o293bob 2o6b2obo$753b2obo6bob2o$796b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o 3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b 3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3b3o7b3o3$ 799b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b 3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o$799b3o13b3o13b3o13b3o13b3o 13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o13b3o 13b3o13b3o13b3o$800bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo15bo15bo15bo15bo15bo15bo13$6b2o4b2o213bo6b2obo6b2obo6b2obo 6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2o bo6b2obo6b2obo6b2o$7bo5bo213b4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bo b4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bo$6bo 5bo217bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob 4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o4bob4o$6b2o4b2o215b2obo6b2obo6b 2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo6b2obo 6b2obo6b2obo6b2obo6b2obo$8bob2o36b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o$8b2obo28b2o6bobobobo3bobobobo3bobobobo3bobobobo3bob obobo3bobobobo3bobobobo6b2o$12b2o25bob3o6bobo7bobo7bobo7bobo7bobo7bobo 7bobo6b3obo$13bo24bo2bobo4bobobobo3bobobobo3bobobobo3bobobobo3bobobobo 3bobobobo3bobobobo4bobo2bo326b2obo4b2o19b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o$12bo25b3o 6bo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2b o6b3o326bob2o5bo19b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b 2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o$12b2o28b3o2bobo3bobobobo3bobobob o3bobobobo3bobobobo3bobobobo3bobobobo3bobo2b3o334b2o2bo$37bob2o4bobo7b obo7bobo7bobo7bobo7bobo7bobo7bobo4b2obo329bo3b2o288b2o2bob2o6b2obo$37b 2obobobo2bobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bo bo2bobobob2o330bo19b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o 6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b 2o6b2o4b2o6b2o4b2o6b2o26bo2b2obo6bob2o$12b2o27b2ob2o2b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o2b2ob2o333b2o2b2o15b2o6b2o4b2o6b 2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o 6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o25bo7b2o2b 2o$12b2o437b2obo5bo14b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b 3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o 2b3o6b3o2b3o6b3o2b3o6b3o24b2o7bo2bo$451bob2o4bo13b3o3b4o3b4o3b4o3b4o3b 4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o 3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b3o30bo4bo30bo15b o15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo15bo$449b2o8b2o12b3o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b 4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o 3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b3o22b2o6b2o2b2o28b2o3bo3bo2bo3b2o3bo 3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2b o3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o 3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3b o2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo$449bo 27b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o 2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b3o2b3o6b 3o2b3o27bo4b2o6b2obo24bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o 3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o 3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o 3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o 3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o3bo2b2o$450bo8b2o16b 2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o 6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b 2o26bo6bo6bob2o25bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3b o2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo 3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o 3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3b o2bo3b2o3bo3bo2bo3b2o3bo3bo2bo$449b2o9bo16b2o4b2o6b2o4b2o6b2o4b2o6b2o 4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b 2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o6b2o4b2o26b2o4bo5b2o4b2o32bo15bo 15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo$451b2obo4bo295b2o4bo5bo$451bob2o4b2o288b2o2b2o7bo5bo$473b 2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b 2o12b2o12b2o12b2o12b2o23bo3bo6b2o4b2o$473b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o22bo 3bo9b2obo$749b2o2b2o8bob2o2$37b2ob2o83b2ob2o$37b2obo4bo3bo7bo3bo7bo3bo 7bo3bo7bo3bo7bo3bo7bo3bo4bob2o$40bobo3bobo3bobo3bobo3bobo3bobo3bobo3bo bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo$40bobo3bobo3bobo3bobo3bobo3bobo 3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo101b2o10b2o10b2o10b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$39b2obo3bobo3bobo 3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bob2o100b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$ 43b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o2$42bob2o3b2o bobob2o3b2obobob2o3b2obobob2o3b2obobob2o3b2obobob2o3b2obobob2o3b2obo 102bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8b o2bo8bo2bo8bo2bo8bo2bo$42b2obo3bob2ob2obo3bob2ob2obo3bob2ob2obo3bob2ob 2obo3bob2ob2obo3bob2ob2obo3bob2o102b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o8b4o8b4o8b4o8b4o$228b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o$234b2o10b2o10b2o10b2o10b2o10b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$233b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o$233bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo 2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo3$234b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$234b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b 2o4$799b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o 20b2o20b2o20b2o20b2o$799b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b 2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o2$747b2o4b2obo6b2obo$748bo4bob2o 6bob2o$39bo54bo652bo3b2o4b2o2b2o4b2o$37bobobo4b2o8b2o8b2o8b2o8b2o4bobo bo350b2obo4b2o4b2o284b2o2bo5bo3bo5bo$39bobobo4bo9bo9bo9bo9bobobobo352b ob2o5bo5bo289bo5bo3bo5bo$36b2obob2o2bo4bob2obo4bob2obo4bob2obo4bob2obo 5b2obob2o353b2o2bo5bo285b2o2b2o4b2o2b2o4b2o$39bo5bob2obo4bob2obo4bob2o bo4bob2obo4bob2o5bo356bo3b2o4b2o14b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o 4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o28bo4b2obo4b o5bo17b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b 2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o 14b2o4b2o14b2o4b2o$38b2o13bo9bo9bo9bo10b2o356bo4bob2o16b3o14b3o4b3o14b 3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o 14b3o4b3o27bo5bob2o5bo5bo15bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o 14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo 2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo 2b2o$51b2o8b2o8b2o8b2o368b2o4b2obo19bo12bo10bo12bo10bo12bo10bo12bo10bo 12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo26b2o8b2o2b2o4b2o16b2o 4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o 4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o 4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o4bo4b2o 4bo4b2o4bo4b2o4bo4b2o4bo$447b2obo10b2o15b2o2b3o4b3o2b2o6b2o2b3o4b3o2b 2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o 2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o 32bo3bo5bo27bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo 2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo 2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o14bo2bo2b2o$447bob2o 11bo14b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o 4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b 2o6b2o2b3o4b3o2b2o6b2o2b3o4b3o2b2o23b2o9bo3bo5bo27b2o4b2o14b2o4b2o14b 2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o 14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o14b2o4b2o$445b2o 14bo19bo10bo12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo12bo10bo 12bo10bo12bo10bo12bo26bo8b2o2b2o4b2o$445bo15b2o19b3o4b3o14b3o4b3o14b3o 4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b 3o22bo5b2obo6b2obo$446bo35b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o 14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o4b3o14b3o22b2o4bob2o6bob2o$ 445b2o$447b2obo10b2o$447bob2o10b2o2$226b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o390b2o20b2o20b2o20b2o20b2o20b 2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o$228b2ob2o5b 2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b 2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o385b2o20b2o20b2o20b2o 20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o$228b 2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o 3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b2o3b 2o$226b2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob 2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2ob2o5b2o$231b2o 8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o5$ 44bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo$38bo3b3ob3o3b3ob3o3b3ob 3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3bo$37bobobo7bobo7bobo7bob o7bobo7bobo7bobo7bobo7bobo7bobobo$37bobobo2b3o2bobo2b3o2bobo2b3o2bobo 2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobobo$35b2ob2ob3o3b 3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob2ob2o$34bo 2b2o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b 2o2bo$33bob2ob4o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o 2bobo2b3o2bobo2b3o2bobo2b4ob2obo$33bo10bobo7bobo7bobo7bobo7bobo7bobo7b obo7bobo7bobo10bo$34b2o2b2ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob3o3b3ob 3o3b3ob3o3b3ob3o3b3ob2o2b2o$36bo2bobo7bobo7bobo7bobo7bobo7bobo7bobo7bo bo7bobo7bobo2bo$36b2o95b2o6$449b2obo6b2obo$226bo5bo3bo5bo3bo5bo3bo5bo 3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo 5bo3bo5bo3bo5bo3bo5bo36bob2o6bob2o$225bobo3bobobobo3bobobobo3bobobobo 3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobo bo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobo 39b2o2b2o283b2obo6b2obo4b2o4b2o$225bob2ob2obobob2ob2obobob2ob2obobob2o b2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2o b2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2o b2obobob2ob2obo39bo3bo25b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b 2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o19bob2o6bob2o5bo5bo$228bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo43bo3bo23bobo11bobo11bobo11bobo11bobo11bobo11bobo 11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo23b 2o8b2o2bo5bo$225b4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4o b4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4ob4o39b2o2b2o 23bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bo bo11bobo11bobo11bobo11bobo11bobo11bobo23bo9bo3b2o4b2o24b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o$225bo7bobo7bobo7bobo7bobo7bobo7bob o7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bo35b2ob o6b2obo15b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob 2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o26bo 9bo4bob2o26b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o$92bo132b 2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob 2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob 2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2o35bob2o6bob2o15b2o12b 2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b 2o12b2o12b2o28b2o8b2o4b2obo24bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15b o15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo$91bobo2b2o128bob obobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3b obobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo3bobobobo 3bobobobo3bobobobo3bobobobo34b2o8b2o4b2o20b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o31b2obo6b2obo 10b2o14b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o 6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b 3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o$91bobo2bo 130bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5b o3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo35bo9bo5bo21b2ob2o9b2ob 2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob 2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o9b2ob2o28bob2o6bob2o11bo13bo3bo2bo3b2o3b o3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo 2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b 2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo 3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2b o3b2o3bo3bo2bo3b2o$88b2obob2obo351bo9bo5bo24bobo11bobo11bobo11bobo11bo bo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo 11bobo24b2o8b2o14bo13bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo 3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2b o3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o 3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3b o2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo2bo3b2o3bo3bo$88bo2bo4b2o349b 2o8b2o4b2o24bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo11bobo 11bobo11bobo11bobo11bobo11bobo11bobo11bobo24bo9bo15b2o13b3o6b3o4b3o6b 3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o 6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b 3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o$45bo43bobo3bo2bo350b2obo6b2obo 27b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o25bo9bo30bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo 15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo15bo$44bob2o42b2ob2ob2obo 349bob2o6bob2o277b2o8b2o32b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o$34b2o3b2o4bobo3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3bob2o2bo2bo2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2obo3b2o594b2obo6b2obo10b2o16b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o$33bo2bo2b3obo2bo4b5o3b5o 3b5o3b5o3b5o4bob3o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2ob3o2bo 594bob2o6bob2o10b2o$34b2o4bobo2b3obo7bo7bo7bo7bo7bo55b2o$36b3o3bobob2o b96o$34b2o2b2o2bob2o7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bobob2o$33bo2bo 2b2obobo3b4o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3b5o3bobo$34b2o8b 5ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b2ob2o3b 2ob2o3b2ob2o2b2o2bo$44bo2bo97b2o$45b2o16$226b2o10b2o10b2o10b2o10b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$226b4ob2o5b4ob2o 5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o5b4ob2o 5b4ob2o5b4ob2o5b4ob2o5b4ob2o$225bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo 4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo 3bo4b2obo3bo4b2obo3bo4b2obo3bo4b2obo$225bob2o4bo3bob2o4bo3bob2o4bo3bob 2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3b ob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo3bob2o4bo330b2obo6b2obo6b2obo$226b2o b4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2o b4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o5b2ob4o331bob2o6bob2o6bob2o$45b2o8b2o8b 2o8b2o8b2o8b2o8b2o12b2o12b2o12b2o12b2o68b2o10b2o10b2o10b2o10b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o70bo8bo8bo8bo8bo8bo 8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo30b2o2b 2o8b2o4b2o$45b2o8b2o8b2o8b2o8b2o8b2o8b2o12b2o12b2o12b2o12b2o318b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b 3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o30bo3bo9bo5bo$34b2o136b2o306bo8bo8bo8bo 8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo 34bo3bo9bo5bo14b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o 18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o$34bobo6b4o6b4o6b4o6b4o6b 4o6b4o6b6o8b6o8b6o8b6o8b6o6bobo306b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o 7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b 2o32b2o2b2o8b2o4b2o14bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17b obo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo$ 36bo5bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo6bo6bo6bo6bo6bo6bo6bo6bo6bo 5bo572b2obo6b2obo4bo5bo17bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo 7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo 7b3o9bo7b3o9bo7b3o9bo$36bobobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo 2bobo2bobo2bobo2bobo2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o 2bo2b2o2bo2b2o2bob2ob2o571bob2o6bob2o5bo5bo14b3o9bo7b3o9bo7b3o9bo7b3o 9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o 9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o9bo7b3o$34bo2b2o4bo4bo4bo4bo4bo4bo 4bo4bo4bo4bo4bo4bo4bobo4bobo4bobo4bobo4bobo4bobo4bobo4bobo4bobo4bo5b2o 574b2o2b2o4b2o2b2o4b2o24bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo 17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo17bobo$35b obo2bo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bo 2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo2b2o2bo3bobo 575bo3bo5bo3bo5bo25b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b 2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o18b2o$33bobobobo2bo4bo4bo4bo4bo4b o4bo4bo4bo4bo4bo4bo4bo6bo6bo6bo6bo6bo6bo6bo6bo6bo4bobobo574bo3bo5bo3bo 5bo$33b2obob4o6b4o6b4o6b4o6b4o6b4o6b4o8b6o8b6o8b6o8b6o8b4obob2o303bo8b o8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo 8bo8bo35b2o2b2o4b2o2b2o4b2o$36bo134bo305bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo6bobo30b2obo6b2obo6b2obo$36bob2o10b2o8b 2o8b2o8b2o8b2o8b2o10b2o12b2o12b2o12b2o12b2obo306bo8bo8bo8bo8bo8bo8bo8b o8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo31bob2o6bob 2o6bob2o$37bobo10b2o8b2o8b2o8b2o8b2o8b2o10b2o12b2o12b2o12b2o12bobo277b 2obo6b2obo$448bob2o6bob2o$452b2o2b2o4b2o$452bo3bo5bo14b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b 3o6b3o6b3o6b3o6b3o6b3o$453bo3bo5bo13bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo$452b2o2b2o4b2o13b3o6b3o6b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b 3o6b3o6b3o6b3o$448b2obo6b2obo$448bob2o6bob2o$446b2o14b2o$446bo15bo14b 3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o$447bo15bo13bobo6bobo6bobo6bobo6bo bo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bo bo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo$35b2o3b2o7b2ob2o99bo292b2o 14b2o13b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o$34bo2bobobo6bobobobo97bob o293b2obo6b2obo$34bob2obo4bo4bo4bo97bobo293bob2o6bob2o$33b2obo2bo2bo4b ob2o2b2obo7b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o5b2ob2o$33bo3b3o2bo3bo3b 2o6bo5b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o4bo2bo2bobo319bo8bo8bo8bo8bo 8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo$34b 3o3b2o4bo3b5o3bo7b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obo bo4b2obobo4b2ob4o2bob2o318bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo6bobo 6bobo6bobo6bobo6bobo$35bo2b2o2b2obo13bob2o3b2ob2obo3b2ob2obo3b2ob2obo 3b2ob2obo3b2ob2obo3b2ob2obo3b2ob2obo3b2ob2obo3b2o4bo2bo52b2o5b2obo259b o8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo 8bo8bo8bo$35bo2b2o2b2obo13bo2bob2obo3b2ob2obo3b2ob2obo3b2ob2obo3b2ob2o bo3b2ob2obo3b2ob2obo3b2ob2obo3b2ob2ob2o3b2obo53bo5bob2o$34b3o3b2o4bo3b 5o3bo3bobobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b2obobo4b 2obobo3b3obo53bo10b2o$33bo3b3o2bo3bo3b2o6bo10b2o8b2o8b2o8b2o8b2o8b2o8b 2o8b2o7bo5bobo51b2o9bo$33b2obo2bo2bo4bob2o2b2obo12b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b3o3bobo62bo$34bob2obo4bo4bo4bo95bo2bobobo50b2o9b2o$34bo 2bobobo6bobobobo93bo3b2ob2o52bo5b2obo10bobo2bo3bo2bobo3bobo2bo3bo2bobo 3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo 2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo 2bobo56b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o 7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o7b2o30b2obo4bob2o6b2obo$35b2o 3b2o7b2ob2o94b2o58bo6bob2o10bo3bo5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo3bo 5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo3bo5bo3bo3bo 3bo5bo3bo3bo3bo5bo3bo56bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo 8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo31bob2o4b2obo6bob2o$208b2o3b2o14bobo 2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo 2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo3bobo2bo3bo2bobo 3bobo2bo3bo2bobo3bobo2bo3bo2bobo57b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o 6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b3o6b 3o32b2o6b2o2b2o$213bo269bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8b o8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo8bo32bo8bo2bo22bo23bo23bo23bo23bo23bo 23bo23bo23bo23bo23bo23bo23bo23bo23bo23bo$208b2o4bo536bo6bo4bo20bobo21b obo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo 21bobo21bobo21bobo$209bo3b2o535b2o6b2o2b2o18bo3bo19bo3bo19bo3bo19bo3bo 19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo 19bo3bo19bo3bo$208bo6b2obo527b2obo6b2o6b2obo14bo2bo20bo2bo20bo2bo20bo 2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo 2bo20bo2bo20bo2bo$208b2o5bob2o527bob2o7bo6bob2o15b2o22b2o22b2o22b2o22b 2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o$750b2o4bo5b 2o4b2o25b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b2o22b 2o22b2o22b2o22b2o$750bo5b2o4bo5bo25bo2bo20bo2bo20bo2bo20bo2bo20bo2bo 20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo20bo2bo 20bo2bo$51bob2ob2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b 2obo2b2obo631bo2b2o7bo5bo24bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19b o3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo19bo3bo$ 47bo3b2obobob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o 2bob2o3bo626b2o3bo6b2o4b2o26bobo21bobo21bobo21bobo21bobo21bobo21bobo 21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo21bobo$46bobo73bobo 621b2obo4bo9b2obo29bo23bo23bo23bo23bo23bo23bo23bo23bo23bo23bo23bo23bo 23bo23bo23bo$46bobo2b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o2bo bo621bob2o4b2o8bob2o$44b2o2bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bob o3bobo3bobo3bobo3bobo2b2o$43bo2b3ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5o b3o2bo$39b5o2b2o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b2o2b 5o$38b3ob2o83b2ob3o$39b5o2b2o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b2o2b5o$43bo2b3ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob5ob3o2bo$ 44b2o2bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo 2b2o$46bobo2b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o2bobo106bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo$ 46bobo73bobo102bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3b o3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo$47bo3b2obobob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bo b2o2bob2o2bob2o2bob2o2bob2o3bo103bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7b o7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo$51bob2ob2obo2b2obo2b2obo2b2obo2b 2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo107bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo$227bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo$227bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo$227bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo$231bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo$231bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo30b2obo6b2obo$227bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo26bob2o6bob2o$227bo 7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo7bo 7bo30b2o8b2o$450bo9bo$451bo9bo$450b2o8b2o23bo11bo11bo11bo11bo11bo11bo 11bo11bo11bo11bo11bo11bo11bo11bo11bo$446b2obo6b2obo21bob2obo6bob2obo6b ob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo 6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo$446bob2o6bob2o19bo2b2o3bo3bo 2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo 2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo 2b2o$450b2o2b2o23bobo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo 2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o bo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o$39b 2ob2o133b2ob2o268bo3bo26bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo 2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo 2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo2b2o3bo3bo$3b2obo32bo3bo133bo3bo269bo3bo 24bo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6b ob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo6bob2obo$3bob2o29bo3b2ob ob2o127b2obob2o3bo265b2o2b2o23bo11bo11bo11bo11bo11bo11bo11bo11bo11bo 11bo11bo11bo11bo11bo11bo$b2o30bo2b4o2bobobo127bobobo2b4o2bo258b2obo6b 2obo283bob2o6b2obo6bob2o16b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b 2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o$bo31b3o4bobobo131bobobo4b3o 258bob2o6bob2o283b2obo6bob2o6b2obo15bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo$2bo33bo2b2obobo2bo127b3o2b5o556b2o14b2o2b2o18b3o 7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b 3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o 7b3o7b3o7b3o$b2o32bobob2o4b6obob2obob2obob2obob2obob2obob2obob2obob2ob ob2obob2obob2obo2b3obob2obo2b3obob2obo2b3obob2obo2b3obob2obo2b3obob2ob o2b3ob2o4bo4bo556bo14bo4bo19bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo$3b2obo28b2o3b2o12bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo3b2o6bo3b2o6bo 3b2o6bo3b2o6bo3b2o6bo3b2o10bob4o555bo16bo2bo$3bob2o45bo4bo4bo4bo4bo4bo 4bo4bo4bo4bo4bo4b2o5bo4b2o5bo4b2o5bo4b2o5bo4b2o5bo4b2o572b2o14b2o2b2o$ b2o4b2o26b2o3b2o12bo4bo4bo4bo4bo4bo4bo4bo4bo4bo4bo3b2o6bo3b2o6bo3b2o6b o3b2o6bo3b2o6bo3b2o10bob4o557bob2o6b2obo6bob2o$bo5bo27bobob2o4b6obob2o bob2obob2obob2obob2obob2obob2obob2obob2obob2obob2obo2b3obob2obo2b3obob 2obo2b3obob2obo2b3obob2obo2b3obob2obo2b3ob2o4bo4bo46b2o10b2o10b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o329b2obo6b ob2o6b2obo$2bo5bo27bo2b2obobo2bo127b3o2b5o40bo2bo3b2o3bo2bo3b2o3bo2bo 3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo 3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o333b2o 2b2o14b2o$b2o4b2o24b3o4bobobo131bobobo4b3o37bo2bo8bo2bo8bo2bo8bo2bo8bo 2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo 339bo2bo16bo18bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo$3b2obo26b o2b4o2bobobo127bobobo2b4o2bo37bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2b o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo332bo4bo14bo18b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o 7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b 3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o$3bob2o29bo3b2obob2o127b2obo b2o3bo46bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo 2bo8bo2bo8bo2bo8bo2bo8bo2bo8bo2bo332b2o2b2o14b2o18bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo$39bo3bo133bo3bo44b2o3bo2bo3b2o3bo 2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo 2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo2bo3b2o3bo 2bo328bob2o6b2obo6bob2o21b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b 2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o$39b2ob2o133b2ob2o44b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o 335b2obo6bob2o6b2obo5$488b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o$487bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2b o12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo$488b2o14b2o14b2o14b2o14b2o 14b2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o$36b2o136b2o268b2obo6b2obo$36b 2o136b2o268bob2o6bob2o$36b2o136b2o272b2o2b2o4b2o$36bo138bo272bo3bo5bo 24b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o 6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o$35bobo136bobo272bo3bo5bo23bob o6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bob o6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo$36bobob 3o126b3obobo272b2o2b2o4b2o23b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b 3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o$37b ob4o126b4obo52b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o 8b2o8b2o8b2o8b2o8b2o8b2o25b2obo6b2obo$38bo134bo50bo2b2o2bo2bo2b2o2bo2b o2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2b o2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o2bo2b o2b2o2bo2bo2b2o2bo2bo2b2o2bo2bo2b2o25bob2o6bob2o$224bo6bo2bo6bo2bo6bo 2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo 6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo33b2o2b2o4b2o24b3o4b3o6b3o4b3o6b3o4b3o6b 3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o 6b3o4b3o6b3o$43bo4bo7bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo7bo4bo2bo 4bo2bo4bo55bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo 2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo6bo2bo33bo3bo5bo25b obo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6b obo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo4bobo6bobo$44b4o 3b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o2b6o3b4o4b4o4b4o281bo3bo5b o24b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o 4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o4b3o6b3o$43bo4bo2bo12bo2bo12bo2bo12bo 2bo12bo2bo12bo2bo12bo2bo4bo2bo4bo2bo4bo279b2o2b2o4b2o$444b2obo6b2obo$ 38b4o128b4o270bob2o6bob2o$37bo4bo126bo4bo321b2o14b2o14b2o14b2o14b2o14b 2o14b2o14b2o14b2o14b2o14b2o14b2o14b2o$36bobo3bo126bo3bobo319bo2bo12bo 2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo2bo12bo 2bo12bo2bo$35bobo3bo128bo3bobo319b2o14b2o14b2o14b2o14b2o14b2o14b2o14b 2o14b2o14b2o14b2o14b2o14b2o$35bo140bo$35bo140bo$35bo2bo134bo2bo$36b2o 136b2o563b2o4b2obo6bob2o6b2obo$740bo4bob2o6b2obo6bob2o$739bo3b2o4b2o2b 2o8b2o$739b2o2bo5bo4bo8bo30bo21bo21bo21bo21bo21bo21bo21bo21bo21bo21bo 21bo21bo21bo21bo21bo21bo21bo$744bo5bo2bo10bo28b3o11bobo5b3o11bobo5b3o 11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o 11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o11bobo5b3o 11bobo5b3o$739b2o2b2o4b2o2b2o8b2o28bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo 2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo 11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b2o5bo2bo11b 2o5bo2bo11b2o5bo2bo$740bo2bo5bo5bob2o6b2obo27b2o10bo9b2o10bo9b2o10bo9b 2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo 9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o10bo9b2o$739bo4bo5bo4b2obo6bob2o 26b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o20b2o 20b2o20b2o20b2o20b2o$739b2o2b2o4b2o8b2o2b2o4b2o$446b2o4b2o4b2obo281bo 5bo10bo2bo5bo$227bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobo bo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobo bo5bobobo35bo5bo4bob2o277b2o3bo5bo8bo4bo5bo$226bo5bo3bo5bo3bo5bo3bo5bo 3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo 5bo3bo5bo3bo5bo3bo5bo33bo5bo3b2o4b2o276bo2b2o4b2o8b2o2b2o4b2o$38bo9bo 9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo58bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo 3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo 5bo3bo5bo3bo34b2o4b2o2bo5bo276bo5b2obo6bob2o6b2obo$36b5o5b5o5b5o5b5o5b 5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o57b3o7b3o7b3o7b3o7b3o7b3o7b3o7b 3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o37bob2o5bo5bo16b2o6bo7b 2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b2o6bo7b 2o6bo7b2o6bo7b2o6bo42b2o4bob2o6b2obo6bob2o$35bo5bo3bo5bo3bo5bo3bo5bo3b o5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo51b3o7b3o7b 3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o7b3o 32b2obo4b2o4b2o15bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo 5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo6bo5bo2bo 6bo$34bob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob 2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob 2ob2obo49bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5b o3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo35b2o2bo5bo 16bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo9bo5bo 9bo5bo9bo5bo9bo$34bobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobo48bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo 5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo 35bo3bo5bo15bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6b o2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo5bo6bo2bo$ 34bo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo 2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo 2bo49bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bo bobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bobobo5bo bobo35bo3b2o4b2o16bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo 6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o7bo6b2o$34bo2bobo2bobo2bobo2bob o2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bob o2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bobo2bo279b2o2bo5bo$33bobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo283b o5bo$34b2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2o bobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2obobob2ob2o bobob2o283b2o4b2o$36bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo 3bo5bo3bo5bo3bo5bo3bo5bo3bo5bo3bo281b2o4b2obo$33b3o5b5o5b5o5b5o5b5o5b 5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o5b5o5b3o278b2o4bob2o$33bo9bo9bo9bo9bo9bo 9bo9bo9bo9bo9bo9bo9bo9bo9bo12$225b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b 2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o 4b2o4b2o4b2o4b2o4b2o$41bo15bo15bo15bo15bo15bo15bo15bo15bo55b2o4b2o4b2o 4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b 2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o$38bo3b2o10bo3b2o10bo3b 2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o$37bo4b2o9bo4b2o9bo 4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o$34bo3b3ob2o3bo2bo3b3ob 2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo 2bo3b3ob2o3bo2bo3b3ob2o52b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b 3o9b3o9b3o9b3o9b3o$34b2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo 3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo3b3ob2o3bo2bo53b3o 3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b 3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o$34b2o9bo4b2o9bo 4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o9bo4b2o63bo2b2ob2o4bo2b2ob2o4bo 2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo 2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o$ 34b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o10bo3b2o 60b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4b o2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4bo2b2ob2o4b o2b2ob2o4bo2b2ob2o4bo$33bo15bo15bo15bo15bo15bo15bo15bo15bo62b2o4b3o3b 2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o 3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o3b2o4b3o$230b3o9b3o9b3o9b3o9b 3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o9b3o3$225b2o4b2o4b2o4b2o4b2o 4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b 2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o$225b2o4b2o4b2o4b2o4b2o4b2o4b2o 4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o4b 2o4b2o4b2o4b2o4b2o4b2o4b2o4b2o11$35b2o12b2o12b2o12b2o12b2o12b2o12b2o 12b2o12b2o12b2o$33b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o 4bo7b2o4bo7b2o4bo$33b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b 2o4bo7b2o4bo7b2o4bo$35bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o 3bo7b3o3bo7b3o3bo7b3o$36b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o3bo7b3o 3bo7b3o3bo7b3o3bo7b3o3bo$40b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b 2o4bo7b2o4bo7b2o4bo7b2o4bo$40b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo7b2o4bo 7b2o4bo7b2o4bo7b2o4bo7b2o4bo56b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o$42b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o12b2o59b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o5b2o5b2o5b2o3$225b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o 4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o 4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o$226b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o 6b8o6b8o6b8o6b8o6b8o$228b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b 4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o3b4o$ 233b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o6b8o$232b2ob4ob 2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob 2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o4b2ob4ob2o3$229b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o$229b2o5b2o5b2o5b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o7$3bob2o$3b2obo$7b2o$8bo$7bo$7b2o26b2o10b2o10b2o10b2o10b 2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$5b2o27b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o$6bo26b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b 6o6b6o$5bo33b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o6b6o153bob2o$5b2o 33b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o154b2obo$3b2o36b2o10b2o 10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o10b2o$4bo313b3o$3bo313bo3bo$3b 2o312bo3bo$227bo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob 2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b 2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bobo2b2ob2o2bo$ 227bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo 3bobo3bo7bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bob o3bobo3bobo3bobo3bo$227bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bobo 3bobo3bobo3bobo3bobo3bobo3bo7bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bob o3bobo3bobo3bobo3bobo3bobo3bobo3bobo3bo$228b3o3b3o3b3o3b3o3b3o3b3o3b3o 3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o9b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o2$228b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2o bo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo8b2obo2b2obo2b2obo2b 2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo2b2obo 2b2obo$228bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o 2bob2o2bob2o2bob2o2bob2o2bob2o8bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob 2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o2bob2o6$3b2obo$3bob 2o$b2o4b2o$bo5bo$2bo5bo21b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o$b2o4b2o22bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo$3b2obo23b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o 2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b2o2b 2o2b2o2b2o2b2o2b2o$3bob2o$b2o4b2o$bo5bo$2bo5bo$b2o4b2o$3b2obo$3bob2o2$ 206b2o6b2obo$207bo6bob2o$206bo5b2o$206b2o4bo21bobo7bobo7bobo7bobo7bobo 7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo $32b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o49bo16bo3bob o3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3b obo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo 3bobo3bo$33bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo42b2o4b2o15b3o2bob o2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2b obo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o 2bobo2b3o2bobo2b3o2bobo2b3o$31bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob 2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3b ob2ob2o3bob2ob2o39bo6b2obo12bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo9bo9bo9bo9bo$31b2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o 3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob2o3bob2ob 2o3bob2o36bo7bob2o17bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo 9bo9bo$38bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo9bo37b2o4b2o4b2o9bobo2b 3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo 2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bobo2b3o2bo bo2b3o2bobo2b3o2bobo2b3o2bobo$37b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b2o8b 2o8b2o8b2o8b2o8b2o43bo5bo10bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bob o3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3b obo3bo3bobo3bo3bobo3bo3bobo3bo3bobo3bo3bobo$206b2o5bo5bo9bobo7bobo7bob o7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bobo7bob o7bobo7bobo7bobo$207bo4b2o4b2o$206bo7b2obo$206b2o6bob2o10$2b2obo$2bob 2o$2o4b2o$o5bo23b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o$bo5bo22b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o$2o4b2o$2b2obo$2bo b2o$6b2o20b6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6ob6o b6o$6bo$7bo$6b2o$2b2obo24b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b 2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o$2bob2o24b2o5b2o5b2o5b2o5b2o5b2o 5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o5b2o! golly-2.5-src/Patterns/Life/Oscillators/0000755000175100001440000000000012156146015015247 500000000000000golly-2.5-src/Patterns/Life/Oscillators/billiard-table.rle0000644000175100001440000002722012156145314020546 00000000000000#C A "billiard table" oscillator is defined as any oscillator in #C which the rotor is enclosed within the stator. This definition #C is not exact, because the meaning of "enclosed" is not entirely #C clear. #C Billiard table configurations are generally considered interesting #C for their own sake, but useless for creating larger constructions, #C because they don't expose any sparks to interact with other #C oscillators or spaceships. #C For some time it was thought to be probably impossible to construct #C billiard tables using glider collisions, again because the centers #C are not accessible from outside. However, Dave Buckingham later #C succeeded in producing glider recipes for some billiard tables. #C From Alan Hensel's "lifebc" pattern collection. x = 347, y = 222, rule = B3/S23 57boo$boo3boo14boo15boo16boo$boo3boo14boo15boo$57b4o19bo$boo3boo14b4o 13b4o13bo4bo17bobo103bo$bobobobo13bobobboboo8bobobboboo8bobobooboboo 12bobobo61bo16boboo19bobo17boo$3bobo15bobboboboo8bobboboboo8bobo4boboo 9bobbo3bobbo31boobo22bobo15boobo20bo18boo69boo$bboobo12booboo3bo8boobo bbobo8boobo4bobo11bobobo3bobobo30boboo23bo99boo5boobo15boobbobbo$6boo 10boobo4bo8boobo4bo8booboboobobo12bobbo3bobbo29boo4boo38b3o19b5o14b6o 37bo5boboo15bobboboobo15bobo20bo$7bo14b4o13b4o13bo4bo16bobobo32bo5bo 20b5o10boobobobo17bo5bo12bo6bo35bo10boo14b3o4bo15booboboo15boboboo$6bo 50b4o18bobo34bo5bo16bobo5bobo7boobo3bo16bobobobbo11bobo3boobo34boo9bo 18boboboo17bobobo13bobbobo$6boo16boo15boo37bo34boo4boo16boobo3boboo10b o3boboo13bobobboboo11bo6bo47bo16bo4bo15boobobobobbo11b3obobo$7bo16boo 15boo16boo56boobo21bo3bo13bo3boboo12boobobbobo13b6o36boo9boo16b4o3bobb o6boobobobo3bobobo16b3o$6bo52boo56boboo21bo3bo14b3o17bobbobobo56bo5boo bo23bob4o6boobo3bobobobbo11b3o6bobo$6boo107boo4boo20b3o35bo5bo16boo38b o6boboo18b4o16bobboobobo14bo7boboo$115bo5bo38boboo18b5o17boo38boo3boo 22bobbobb3o11bo3boboo17boo3boo$116bo5bo20boobo13boobo85bo24bobobobbo 12boobo21bobbobo$115boo4boo20boboo37bo59boo4bo24boobobo17boobo17bob3o$ 117boobo62bobo59bo3boo28bo12b5oboboo18bo$117boboo63bo59bo6boobo37bobbo bo23bo$244boo5boboo65boo8$191bo17boo$187bob3o13boobobbo$166booboo16boo 15boboboobo64boo$144boo16boo3boboo19boobbo9bobo4boboo61bobo$bboboo41bo 93boobbo17bobbo20b3ob4o7boobboo3bobo64bo$bboobo22boo16bobo16bobo17bo 53bobbobo16bo4bob3o12boobo16bobo5bobo62bobooboo24boo3boo$oo25bobbo15b oo15b3ob3o14bobo52boo3boo15b5obo3bo12bob7o10bobo3boobboo61boo4bo24bo3b obo$bo24bobbo14boo14bobo7bobo12bo57bo3boo16bobobobo11bo5bobbo9boobo4bo bo66boo20bobboobo3bo$o24boboob3o10bo3b3o10boobo5boboo69bob4obo11b3obb ooboboo10b3obboobo13boboobobo63b3oboo19b4obobooboo$oo20bobbobbo4bobo6b obb3obbobo10bobbobbo13b5o54bo6bo11bo4bo3bo18boboo12bobboboo57booboobo 6bobboo19bobobobbo$bboboo15boboboobbooboboo7boo3booboo10bob3obo12bo5bo 51boobboobbo14boobobobo10b4ob3o17boo61bo3bobobb4obobbo16boo3bobobo$bb oobo16bobbo6bo12boobbo14bo3bo12bob5obo51bobo5b3o12boboboo11bobboo84b3o bbobo5boo17bobo3boboo$6boo17bob4obo12bo3bo15bobo13bobo3bobo51bobb5obbo 12bobo20boo83bobobbo3bobbobo14bobbobobo$7bo18bo4bo14b3o15booboo11boobo 3boboo49boo7bo15boo17b3obo85boobo3bobobb3o13booboobob4o$6bo20b3o18bobo 29bobbooboobbo55b3o35bo87bobboboboobbobo3bo13bo3boboobbo$6boo21boo18b oo31bo5bo57bo125boobbo6bobooboo11bobo3bo$bboboo77b5o189boob3o18boo3boo $bboobo79bo192boo$276bo4boo$276booboobo$280bo$280bobo$281boo6$27boo$ 26bobbo$26b3o$52bo$24b7o19b5o21boo$23bo7bo17bo5bo21bo5boo58boo60boo$ 22boboo3boobo16bobb3obo19bo3bobbo34boobo21boo46boo13bo$19bobbobo5bobo 14b3obobbob3o16bob4o3bo33boboo37booboo18booboboobobbo11bo$18bobobo9bob oo10bo3bo4bo3bo12bobbobo3b3obo30boo4boo19b4o11bobobo19boboobo3boo11bob 3o$18bobobo9bobobo10b3obobbob3o12boboboo3bobbobobbo27bo5bo19bo4bo10bo 3bo26boo13bobobbo$19boobo9bobobo12bob3obbo15bobbobobbo3boobobo27bo5bo 16bobbo3bo8bobobooboo18b4o3bo10boobobboobo$22bobo5bobobbo14bo5bo18bob 3o3bobobbo27boo4boo16booboboboboo5boobo3bobo13boobo7boboo8bobobobobo$ 22boboo3boobo18b5o20bo3b4obo32boobo23boobbo9bobo3bo14bobo3booboobbo8bo boboboboo34boo3boobo17boo44bo$23bo7bo21bo23bobbo3bo33boboo16b4oboo4bo 9boboboboboo10bobbo4bo3bo11bo4bobbo35bo3boboo16bobo43bobo19boobo$24b7o 45boo5bo38boo14bobboo3b3o11bo5bobo10boobb8o13boo3bo36bo8boo14boboboob oo15booboo16bobobo18boboo$83boo37bo21boo15b5o40b3o37boo7bo16bobobobobo 13bobobobo13b3obob3o13boobo$26b3o94bo17b3obbo16bo21b4o13b3o51bo17bo3bo bo13bo5bo10bobo3bobo3bobo8b3obob3o$25bobbo93boo17bo3boo38bobbo13bobboo 39boo7boo17bo3boboboo7boobo5boboo7booboo5booboo7bo4bobobbo$26boo90boob o83bobo39bo3boobo14boobobo3boboboo7bobobboboboobo10bobo3bobo10boboo3bo bobo$118boboo84bo39bo4boboo14boboobobobobo13boobobo14bo7bo11bobo3bobob o$246boo7boo16bobb3obo14bobobo15b7o14boboboboboo$255bo14boobboo3bo14bo bboo33b4oboobobo$246boo8bo13bo5b3o15boo18bobooboobo9bobbo3boobo$145boo 37boo61bo7boo15bo3bo37booboboboo13boo3bo$145bo11booboo22bobo59bo4boobo 16boo65b3o$147bo10boboboboo16boo3bo58boo3boboo83bo$140boob4obo8bobbobo bo3boo11bobboobo$138bobbobo4bo9boobo4bobbo12boboboboo$138boobo3b3o17b 3o13boobbobbo$139bobobo4b3o7b3o21bo5bo$139bo5b3o3bo4bobbo4boboo14bob5o boo$140bob3o3boboo4boo3bobobobbo10boobo6bobo$138bobobobbobbobo9boobobo bo11bobo3b4o$138boo3boo3bobbo12booboo12bobobbo$145b3obboo28booboo$63b oo80bo$61bobbo$4boboo53boo20boo$4boobo21bo33b4o16bo$bboo25b3oboobboo 22boo4bo16bo$bobo28boobobbo21bobboobbo13b3obo204boo$bo24bobboo4bobo18b ooboboo4boboo7bobobbobo113bo45boo3boo3boo33bo$oo24b4ob4obob3o15boobo4b ooboboo7booboboboboo109bobo45bo3boo3boo34b3o4boo19boo$bboobo25bo4bo4bo 17bobboobbo14bo3bobbo109bob3o42bo47bo4bo17bobobo16bobbo$bboboo22boo3bo bboobboo17bo4boo15bo4bo71bobbo14booboo16boo4bo41boo3boo3boo17boo13b3ob oboobo15b3obo18b6o$oo4boo20bo3bo6boboboo15b4o18b4o72b4o15bobobo10boobb o3boobo46bobobobo16bobboboo8bobobobobobboo12bo3bobo23bo$o5bo22b4ob6obo bo20boo76boo4boo6boo17bo3bobo10bo3b4obobooboo37boo5bobo18boboobobo7bo 3bobobbobo12bobbobobo3boo10b9obbo$bo5bo25bo6bobbo18bobbo18boo57bobbobb o5bo3b3o11b4obboboo10bo5bo4bobobo37bo4boobo17boobbobobo6booboboobboobo 12boboo4boobbo10bo8b3o$oo4boo23bobobboobbobo19boo20boo55bo4boo8boo4bo 9bo4bobobo9boboboobbobboo4bo36bo9boo14bobbobo3boboo5bobo7boo10boo9boo 12bo3b4o$bboobo25boo3boo3bo99boo14bobobo11b4obobbo7b3obo3bobo3bob3o37b oo9bo14boobobo3bobbo5bo3b4obobbo11b3o4boo11b3o8bo$bboboo140boo7bobo4b 3o11bob3o7bo4boobbobboobobo49bo18bobobobboo7b3o5boboo9boo9boo9bobb9o$ 141boobobbo7boobobobobbo7boobobobb3o4bobobo4bo5bo41boo8boo17boboboobo 12boobbobo9bobboobboboobo13bo$140bobobobo11bobo3bobo6bobb5obbo5booboob ob4o3bo41bo9bo18boobobbo8b5o3bobo9boo3bobobobbo14b6o$140bo3boo12bobobo bobo8bo5bo11boboo3bobboo40bo9bo23boo9bo5boboo15bobo3bo17bobbo$141b3o 15bo5bo10b5o12bo4boo45boo8boo36b3obo18bob3o$143bo16b5o13bo15b3obo94bo 3bo16bobobo$162bo33bobo98boo15boo$197bo5$211boo$204boo5boo$204bobo$ 207bo3b4obboo$184bo20boobobobobbobbo$146bo3boo11boo18bobo18bobobobobb 3obo$145bobobbo12bo19bobo18bobobobobo3bo$145bobbobo14bo16booboo14boob oobo5b3o$142boob4oboo6boob4obo14bobbobbo13boobo$142bobo12bobobo4bo14b oobboobbo15b3o5b3o$139boobo3bobb3o5bobo3bobo3bo9boo5boboo26boboo$bbob oo36boo96bobobo6bo4boobobo4b4o8bobb5obbo16b3o5bobooboo78boo$bboobo17bo 18boo18boo75bo6b5o6bo5b3o11bobobo6bo15bo3bobobobobo62boo17bobbo$6boo 14bobo37bo17bo59boob3o11bob4o4boobo6bobo3bobboo15bob3obbobobobo29boo5b oboo21bob3o16b5o$7bo13bobobo16b4o17bo15bobo59bobobb3o9bo4b5oboo5boobob o20bobbobboboboboo31bo5boobo19b3o4bo20bo$6bo14bobobo15bo4bo13b3oboboo 11bobo59bobbo3bo10b3obobo9bo7b7o12boobb4o3bo32bo4boo22bo4boobbo12b8obb o$6boo10boobo3boboo9bobbo3bobo11bobbobobobbo6booboboobbo56boo17bobbo 11b3ob3o6bo24bobo29boo4bo22bobooboboobo10bo8b3o$4boo12bobo4boboo8bobob obobobobbo9b3oboboboo6boobobobbobo75boo14bobobb4o21boo5boo34bo21boobob obobbobo8bobb8o$5bo15b4o13bobbobobobobobo5b3o4bobo12bob4obo96bobbo21b oo36boo3boo19bobo3bo3bobboo7boobo7bo$4bo36bobo3bobbo6bobbobobobo12bo6b oo159bo5boboo15bobob3o3bobo12bo4b4o$4boo17boo17bo4bo12bo4bo14b6o160bo 6boobo14boobobo3bobobo12boobbo$bboo19boo18b4o14b4o20bo160boo9boo15bo3b 3oboboo14bobbo$3bo78b3o173bo15boboo3bo15boob4o$bbo42boo16boo17bo163boo 9bo17bo3boo16bobo$bboo41boo16boo182bo9boo17b3o22bo$246bo6boboo21bo21b oo$246boo5boobo7$94boo$45boo7boo39bo19boo5boobo$24bobbo17boo7boo19boo 12boo3bo3bo17bo5boboo12boo13bo$24b4o46bobbo10bobbobob4o16bo4boo4boo9bo bbo12b3o38bo$45b4o3b4o19bobo10boboobo21boo3bo5bo9bobbo11boo3bo16bo19bo bo$22b8o14bo4bobo4bo15b3oboboo7boo4boboboo22bo5bo7boboob3o7bo3boobo14b obo19bo12boo8boo$21bo8bo12bobobbooboobbobo13bo4bobobo5bobb3obo4bo16boo 3boo4boo7bo4bobbobo5b3obobo13boboboboo28bobo6bobo$20bob3o3boobo8bobbob o9bobobbo10bobb3o3bo6boo4boboo19bo3bo5bo9b3oboboboo12boo11bo3bobobo8b oobb5obboo8bo6bo$20bobo6bobo7bobobobobbooboobbobobobo6boobo5b3o9b5obo 19bo5bo5bo5b3o4bobo8b4o5bo7boobo3bo3bo8bobbo5bobbo7boobobboboo$17boobo bo8boboo5bobbobo9bobobbo8bobboobobo11bo4bobbo17boo3boo4boo5bobb5obo8bo 6boobo7bobo3boboboo8bobobbobbobo6bobbob4o4bo$18bobo10bobo9bobobbooboo bbobo11bo4boo14b3oboboo22bo5bo9bo4bo10boobbobbobo7boboboobobobbo6boobo 5boboo5boobbo5boboo$18bobo10bobo10bo4bobo4bo13b3o3bo15bobo20boo4bo5bo 9b4o13bobobobboo7bobo3bobobo6bo3boo3boo3bo10b3o$17boobo8boboboo10b4o3b 4o16booboo16boo21bo3boo4boo26bobobobo11bobobbobo7b4o3bo3b4o4b5o4b5o$ 20bobo6bobo83bo6boobo13boo14boobobo11bobbobo13boo3boo8bo5boo5bo$20bob oo3b3obo13boo7boo59boo5boboo13boo18bo13boobbo11bobbobobobbo8b4obb4o$ 21bo8bo14boo7boo121boo10boobbobobboo7boobbobbobboo$22b8o164bo$$24b4o$ 24bobbo219boo3boboo17bo27bo$248bo3boobo16bobo17bo7bobo$247bo8boo14bobo 3boo11bobo6bobo$247boo8bo11booboboo3bo11bobo5boobboo$256bo13bobo6boboo 5booboboo3bobbobo$82booboo160boo7boo10bobbobob3obobbo6bobo6boboobbo$ 81boboboboboo157bo5boo12boobobo4bobo6bobbobob3obo3bobo$57boo21bo6bobo 157bo7bo15bobobboobboo5boobobo4bobboobo$56bobbo19bob5obobbo53bo17boo 48booboo30boo5bo16bobo3bobo10bobobboo4bo$22boo29bo3bobbo18bo8bobo49bob 5o15bobo4bo19bo3boo16boboboo37boo16boobobobo10bobo3bobobbo$23bobbobbo 4boo14bobb4oboobo15boob3o3b3oboo48boo5bo17bobbobo17bobobbobo13b3obo33b oo3boo20bobobo12boobobob3o$21bo4b6obbo13b3o5bobobbo16bobo8bo53b3obbo 14boobobbobo16bobo4bo12bo4boboo31bo4bo20bobo16bobo$20bob4o6bobo12bo3b 4obbobbo17bobbob5obo50b3o3boo14boboboobobbo12booboboo3boboo8bobboobobb o30bo4bo22boo16bobb3o$20bobobbobbob3obobo10bobo4bobobobb3o15bobo6bo50b o4bobo10boobbo7b3o14bobo4bobobo10boobo3bo3boo26boo3boo38boo4bo$17boobo bobobobbobboboboo10b3oboo3b4obbo14boobobobobo50bobobobobo10bobbo4b3o 16bobbobobobobobo11bo5bobobbo$17bobb4o3boboboobo19b3o3bo21booboo51bobo 4bo12boboo6boo14boobobo4bobboo10boboboboboo$19bo4b4obobobbo13b6o3b3o 75boobobobboo14bo3bobboobbo16bobobboo3bo12booboo$20b4o4boobobo14bo6boo 78boobobo3bobo13boobobo3boo16bobo3bobobo$22bobboo5bo17bob3obbo81boobo bbobo13bobobo22booboboboo$24boob5o17boobo3boo83boboobbo11bo4bo25bobo$ 29bo111bo5boo9bob3obobo23bo$140boo17bobbobboo22boo$160bobo$161bo9$83b ooboo$84bobo$33bobboo45bo3bo$31b3obbo20booboobboo13boobob3oboboo71boo 116boo$25boboobo6bo20bobobbobo13boobo5boboo25boo4boo37bobboboo79boobo 5boobo20bo$25boobobobb5o15boo3bo3boo18bo5bo29bo5bo10booboo22bobbobo80b oboo5boboo22bo$28bobobo20bobboob3obbo14b3o7b3o25bo5bo12bobobo18boob3o bbo84boo7boo16b5o$28bobobb5o16boobo4b3obbo8bobo13bobo22boo4boo11bo4bo 18bo6boboo81bo8bo17bo$25boobobobo5bo16bobo7b3o8boobo5bo5boboo38boobo5b o17bob3obbobo83bo8bo14boo3boo$26bobbobobobobbo14bobbo7bo14bo4bobo4bo 25boo4boo8boobo6bo14boobo3b3obo82boo7boo10boobo5boboboo$26bo5boboboboo 13boobo7boboo8boobo5bo5boboo23bo5bo11bobo5bo12bobo3bobobbo79boobo5boob o13bobo7bobo$27b5obbobo19bo7bobbo8bobo13bobo22bo5bo12boboo3boo12bobobb oob3o80boboo5boboo12bobboo5boobbo$32bobobo16b3o7bobo13b3o7b3o25boo4boo 12bo16boobobo4bo81boo7boo17boobbobo4boo$27b5obboboboo13bobb3o4boboo15b o5bo49b7o10bobobobobobb4o76bo8bo20bo3b5o$27bo6boboobo16bobb3oboobbo11b oobo5boboo25boo4boo19bo10bobbo4boboobbo77bo8bo19bo7bo$28bobb3o23boo3bo 3boo11boobob3oboboo26bo5bo15boo14boboboobo82boo7boo20b7o$27boobbo23bob obbobo20bo3bo29bo5bo16boo15boobobbo84boobo5boobo$55boobbooboo20bobo30b oo4boo36boo85boboo5boboo18b3o$83booboo190bobbo$278boo! golly-2.5-src/Patterns/Life/Oscillators/DRH-oscillators.rle0000644000175100001440000067724112156145314020666 00000000000000#N Stamp collection #C A collection of 650 oscillators of 83 different periods from 1 #C to 40894. #C #C The oscillators included here were found/built by many people over #C many years. I finished putting the collection together in August 1995, #C and have worked on this header file off and on since then. It's still #C incomplete and probably inaccurate, but I've decided to make it public #C anyway; if you find any errors or can fill in any of the blanks, please #C let me know. #C #C Since this collection was built, many new oscillators have been found. #C Most notably, in 1996 David Buckingham showed how to create tracks #C built from still-lifes through which Herschels can move. (See #C http://www.radicaleye.com/lifepage/patterns/bhept/bhept.html #C for Buckingham's description of this, and #C http://www.radicaleye.com/lifepage/patterns/p1/p1.html #C for Paul Callahan's discussion of using such conduits to build a stable #C glider reflector.) Using Herschel tracks, Buckingham obtained glider #C guns of all periods >= 62 and oscillators of all periods >= 61. Further #C work on Herschel tracks has been done by Buckingham, Paul Callahan, #C Dieter Leithner, and me; such tracks now give oscillators of all periods #C >=54, and guns of periods 54, 55, and 56. #C #C In addition, oscillators of several new smaller periods have been found, #C namely 17 (by me), 22 (by Noam Elkies, me, and Jason Summers), 27 (by #C Elkies), 33 (by Elkies and Jason Summers), 37 (by Nicolay Beluchenko), #C 39 (by Elkies), 49 (by Elkies), and 51 (by Beluchenko). (See #C http://www.radicaleye.com/DRH/nbt.html #C for many oscillators of small periods, including the only known p17s #C and the smallest known p22s.) There are 8 periods for which oscillators #C are still unknown as of early 2009: 19, 23, 31, 34, 38, 41, 43, and 53. #C (For period 34, we could use a noninteracting combination of p2 and p17 #C oscillators, but that's considered trivial.) #C #C Some new guns of smaller periods have also been found, namely 22 (by #C David Eppstein, based on Jason Summers's p22 oscillator), 24 and 48 (by #C Elkies) and 50 (by me, based on a p44 gun by Buckingham and a p50 #C oscillator by Elkies). These are shown (among others) at #C http://home.mieweb.com/jason/life/guns/ . #C Also see http://www.radicaleye.com/lifepage/patterns/p24gun/p24gun.html #C for discussion of the p24 gun, and #C http://www.radicaleye.com/DRH/gun44.50.html #C for the p50 gun and Buckingham's p44 gun. #C #C Building this collection would have been impossible without the help #C of many people. In addition to those who found the oscillators, I'd #C like to thank Alan Hensel, Bill Gosper, Robert Wainwright, #C Rich Schroeppel, and Jonathan Cooley for helpful suggestions, and #C Andrew Trevorrow for writing LifeLab, an excellent Macintosh program #C for building and running Life patterns. LifeLab's cross-platform #C successor, Golly, is available as freeware at http://golly.sf.net . #C #O Dean Hickerson, dean.hickerson@yahoo.com #C 2/2/2000; last updated 9/16/2000. URLs corrected #C and list of missing periods updated on 5/8/2009. #C #C ---------------------------------------------------------------------- #C #C Most lines of this header describe particular oscillators. Each entry #C begins with an identifying label, of the form "period.row.column"; #C row and column numbers start at zero. This is followed by the name of #C the oscillator (if any) in quotation marks, the discoverer and date of #C discovery (if known) in brackets, and perhaps a comment about the #C oscillator. For example: #C #C 2.0.0 "blinker" [JHC 3/70] Example of "+c*c" symmetry. This #C often occurs in a group of 4, known as a "traffic light", #C which arises, for example, from a T-tetromino. #C #C This indicates that the leftmost oscillator in the top row of the period 2 #C section is called a "blinker", and was found by John Conway in March 1970. #C The notation "+c*c" indicates the symmetry type of the oscillator, which #C is described later. #C #C Many oscillators were found by the following people or groups, so their #C names are abbreviated in this header: #C #C AF = Achim Flammenkamp #C AWH = Alan Hensel #C DIB = David Bell #C DJB = David Buckingham #C DRH = Dean Hickerson #C HH = Hartmut Holzwart #C JHC = John Conway #C MDN = Mark Niemiec #C NDE = Noam Elkies #C PC = Paul Callahan #C RCS = Rich Schroeppel #C RTW = Robert Wainwright #C RWG = Bill Gosper #C SN = Simon Norton #C JHC group = A group of people working with John Conway in the #C early 1970s, including Conway, S. R. Bourne, #C M. J. T. Guy, and Simon Norton. #C MIT group = A group of people at MIT during the early 1970s, #C including Robert April, Michael Beeler, Bill Gosper, #C Richard Howell, Rici Liknaitzky, Bill Mann, #C Rich Schroeppel, and Michael Speciner. #C #C Also, many of the common oscillators were found independently by many #C people; this is indicated by an asterisk in the name field. #C #C Here are definitions of some terminology and notation used below; for #C a more extensive glossary, see Stephen Silver's Life Lexicon, at #C http://www.argentum.freeserve.co.uk/lex_home.htm #C #C The 'rotor' constists of all cells in an oscillator which change state. #C The 'stator' constists of all cells which are alive in all generations. #C (These terms were introduced by Allan Wechsler in 1994.) #C #C An oscillator whose stator is large is often called a 'billiard table'; #C such oscillators are somewhat easier to find than others, so many are #C included in this collection. #C #C The 'period' of an oscillator (or spaceship) is the smallest positive #C integer P for which generation P of the object is congruent to and in #C the same orientation as generation 0. The 'mod' of an oscillator (or #C spaceship) is the smallest positive integer M for which generation M #C of the object is congruent to generation 0, but not necessarily in the #C same orientation. The quotient q=P/M is always either 1, 2, or 4. To #C specify both P and M, we often write "period P.M" or "period P/q". #C #C There are 43 types of symmetry that an oscillator can have, taking into #C account both the symmetry of a single generation and the change of #C orientation (if any) M generations later. There are 16 types of #C symmetry that a pattern can have in a single generation. Each of these #C is given a one or two character name, as follows: #C #C n no symmetry #C #C -c mirror symmetry across a horizontal axis through cell centers #C -e mirror symmetry across a horizontal axis through cell edges #C #C / mirror symmetry across one diagonal #C #C .c 180 degree rotational symmetry about a cell center #C .e 180 degree rotational symmetry about a cell edge #C .k 180 degree rotational symmetry about a cell corner #C #C +c mirror symmetry across horizontal and vertical axes meeting #C at a cell center #C +e mirror symmetry across horizontal and vertical axes meeting #C at a cell edge #C +k mirror symmetry across horizontal and vertical axes meeting #C at a cell corner #C #C xc mirror symmetry across 2 diagonals meeting at a cell center #C xk mirror symmetry across 2 diagonals meeting at a cell corner #C #C rc 90 degree rotational symmetry about a cell center #C rk 90 degree rotational symmetry about a cell corner #C #C *c 8-fold symmetry about a cell center #C *k 8-fold symmetry about a cell corner #C #C For a period P/1 object, specifying the symmetry of generation 0 tells #C us all there is to know about the oscillator's symmetry. For a period #C P/2 or P/4 object, we also need to know how gen M is related to gen 0. #C For the P/2 case, gen M can be either a mirror image of gen 0, a 180 #C degree rotation of it, or a 90 degree rotation of it if the pattern #C has 180 degree rotational symmetry. For the P/4 case gen M must be a #C 90 degree rotation of gen 0. In any case, if we merge all gens which #C are multiples of M, the resulting pattern will have more symmetry than #C the original oscillator. We describe the complete symmetry class of #C the oscillator by appending the one or two character description of #C the union's symmetry to that of gen 0's symmetry. For example, if #C gen 0 has 180 degree rotational symmetry about a cell center, and #C gen M is obtained by reflecting gen 0 across a diagonal, then the #C union of gens 0 and M is symmetric across both diagonals, so its #C symmetry class is denoted ".cxc". #C #C The 43 possible symmetry types are: #C #C period/mod = 1: nn -c-c -e-e // .c.c .e.e .k.k +c+c #C +e+e +k+k xcxc xkxk rcrc rkrk *c*c *k*k #C #C period/mod = 2: n-c n-e n/ n.c n.e n.k #C -c+c -c+e -e+e -e+k #C /xc /xk #C .c+c .cxc .crc .e+e .k+k .kxk .krk #C +c*c +k*k xc*c xk*k rc*c rk*k #C #C period/mod = 4: nrc nrk #C #C The collection includes examples of all of these with mod=1, and many #C with larger periods. #C #C ---------------------------------------------------------------------- #C Period 1 oscillators are usually called "still-lifes". Programs #C written by MDN and others have counted the still-lifes with N cells #C for small N; the results up to N=20 are shown here: #C #C N 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #C # 2 1 5 4 9 10 25 46 121 240 619 1353 3286 7773 19044 45759 112243 #C #C Those with up to 10 bits are included in the stamp collection. So are #C some larger ones that either occur naturally in random soups, or are #C useful, or exemplify symmetry types. I'm omitting the discoverers and #C dates for most of the small and naturally occurring ones, since they've #C been independently discovered many times. #C #C There are 2 4-bit still lifes: #C 1.0.0 "block" [JHC group 1970] Example of "*k" symmetry. Used #C as an eater in many oscillators, such as 4.1.0, 5.2.4, 6.0.0, #C 8.0.0, 10.1.0, 11.0.1, 12.1.1-2, 18.0.0, 28.0.0, 29.0.1, #C 30.0.0, 32.0.1, 44.0.0, 46.0.0, 56.0.0, 124.0.0, 135.0.0, #C 150.0.0, 188.0.0, 246.0.0, 360.0.0, and 460.0.0. Also used as #C a 'rephaser' in 135.0.0, 150.0.0, and 240.0.0. #C 1.0.1 "tub" [JHC group 1970] Example of "*c" symmetry. Used as an #C eater in 12.2.1, 24.0.0, most p29s, 30.2.0-3, and 47.0.0. #C #C There's 1 5-bit still life: #C 1.0.2 "boat" [JHC group 1970] Example of "/" symmetry. #C #C There are 5 6-bit still lifes: #C 1.0.3 "ship" [JHC group 1970] Example of "xc" symmetry. Used as an #C eater of traffic lights in 24.1.0 and 24.2.0. #C 1.0.4 "barge" [JHC group 1970] Example of "xk" symmetry. #C 1.0.5 "snake" [JHC group 1970] Example of ".k" symmetry. Used in #C 60.4.1 and 15240.0.0 to convert a glider into a boat, which a #C subsequent glider deletes. #C 1.0.6 "beehive" [JHC group 1970] Example of "+e" symmetry. This #C often occurs in a group of 4, known as a "honey farm", which #C arises, for example, from a beehive with an extra cell in one #C of its corners. #C 1.0.7 "aircraft carrier". Example of ".e" symmetry. #C #C There are 4 7-bit still lifes: #C 1.0.8 "long boat" [JHC group 1970] #C 1.0.9 "long snake". Example of ".c" symmetry. #C 1.0.10 "loaf" [JHC group 1970] #C 1.0.11 "eater" or "eater1" (formerly "fishhook") [* 1971] Smallest #C asymmetric still-life. This is a very useful still-life, #C because of its ability to eat gliders (e.g. 30.0.1), beehives #C (30.0.2), and lightweight and middleweight spaceships (46.2.0 #C and 46.3.0), and to modify many other things. The term #C "eater" also applies to other still-lifes (and occasionally #C oscillators) that share this ability; the most useful of these #C are the block (1.0.0), eater2 (1.7.3), and eater3 (1.7.4), but #C many others are sometimes useful, including the tub (1.0.1), #C ship (1.0.3), and snake (1.0.5). #C #C There are 9 8-bit still lifes: #C 1.1.0 "long ship" [JHC group 1970] #C 1.1.1 "long barge" [JHC group 1970] #C 1.1.2 "long long snake" #C 1.1.3 "sinking ship" #C 1.1.4 "pond" [JHC group 1970] #C 1.1.5 "shillelagh" [Charles L. Corderman & Hugh Thompson 1971] #C 1.1.6 "tub with tail" [Charles L. Corderman & Hugh Thompson 1971] #C 1.1.7 "hook with tail" #C 1.1.8 "mango" #C #C There are 10 9-bit still lifes. Only 7 have names: #C 1.2.0 "long long boat" #C 1.2.1 "long^3 snake" #C 1.2.2 "long sinking ship" #C 1.2.3 "hat" [* 1971] Example of "-c" symmetry. #C 1.2.4 "integral sign" #C 1.2.5 "up-boat with tail" #C 1.2.6 "down-boat with tail" #C 1.2.7 "long shillelagh" #C 1.2.8-9 unnamed #C #C There are 25 10-bit still lifes. Only 9 have names: #C 1.3.0 "long long ship" #C 1.3.1 "long long barge" #C 1.3.2 "long^4 snake" #C 1.3.3 "long long sinking ship" #C 1.3.4 "snake siamese snake" #C 1.3.5 "snake siamese aircraft carrier" #C 1.3.6 "aircraft carrier siamese aircraft carrier" #C 1.3.7 "long integral" #C 1.3.8-13 unnamed #C 1.4.0 "beehive with tail" #C 1.4.1 "up-barge with tail" #C 1.4.2 "down-barge with tail" #C 1.4.3-6 unnamed #C 1.4.7 "loop" #C 1.4.8 "block and table" #C 1.4.9 "loaf siamese barge" #C 1.4.10 "bi-boat" or "boat-tie" or "bow tie" #C #C Still lifes 1.5.0-10 and 1.6.0-4 are some larger ones that sometimes #C occur in random soups. #C 1.5.0 "bi-ship" or "half fleet" (A "fleet" consists of 2 of these, #C and arises, for example, from a ship with an extra bit added #C at one end.) #C 1.5.1 "bi-loaf" or "half bakery" #C 1.5.2 "paper clip" #C 1.5.3 "big S" [MIT group 1971] #C 1.5.4 "bi-pond" #C 1.5.5 "boat-ship tie" #C 1.5.6 "pair of tables" #C 1.5.7 "moose antlers" #C 1.5.8 "cis-mirrored R-bee" #C 1.5.9 "block on big table" #C 1.5.10 "twin peaks" #C 1.6.0 "dead spark coil" #C 1.6.1 "beehive on big table" #C 1.6.2 "scorpion" Occurs in gens 4760-5165 of "rabbits", this 9-bit #C methuselah found by Andrew Trevorrow: #C o...ooo #C ooo..o. #C .o..... #C 1.6.3 "fourteener" #C 1.6.4 "bookends" #C #C Still lifes 1.6.5-8 and 1.7.0-2 provide examples of other symmetries. #C 1.6.5 Example of "-e" symmetry #C 1.6.6 "beehive with 2 tails" Example of "-e" symmetry #C 1.6.7 Example of "+c" symmetry #C 1.6.8 "spiral" [RTW 1971] Example of "rc" symmetry #C 1.7.0-1 Examples of "+k" symmetry #C 1.7.2 Example of "rk" symmetry. Heinrich Koenig pointed out that there #C are smaller examples; the smallest are: #C ..oo.o.. ...o.o.. #C ..o.oo.. .oooo.o. #C oo....oo o.....o. #C .o.oo..o .o.oo.oo #C o..oo.o. oo.oo.o. #C oo....oo .o.....o #C ..oo.o.. .o.oooo. #C ..o.oo.. ..o.o... #C #C Still lifes 1.7.3-6 are eaters that are used in various oscillators. #C 1.7.3 "eater2" [DJB ????] See 6.3.2, 6.5.2, and 13.0.0. #C 1.7.4 "eater3" [DJB 6/22/77] See 8.2.1, 18.0.0, 42.0.0, 50.0.1, #C 55.0.0, 246.0.0. #C 1.7.5 "eater4" [DJB ????] See 9.0.4, 11.0.2, 29.0.1-2, 29.3.0-1. #C 1.7.6 unnamed eater [DJB ????] I don't know any oscillators that #C use this. Here it's shown deleting a loaf: #C .........o.... #C ...o....o.o... #C ..o.o...o.ooo. #C .o..o..oo....o #C ..oo..o...ooo. #C ......ooooo... #C ....oo........ #C ...o.o..ooo... #C .ooo.o.o..o... #C o....o.o...... #C .oo.oo.oo..... #C ..o.o......... #C ..o.o......... #C ...o.......... #C #C 1.7.7 [DJB 3/78?] Unnamed eater, used in 6.3.3 and 32.0.0. #C #C The 10 digits: [DRH 5/8/92; "4" changed 3/94] #C #C ---------------------------------------------------------------------- #C #C There are 20 known p2 oscillators with <= 14 cells (in gen 0). #C There's 1 with 3 cells: #C 2.0.0 "blinker" [JHC 3/70] Example of "+c*c" symmetry. This #C often occurs in a group of 4, known as a "traffic light", #C which arises, for example, from a T-tetromino. #C #C There are 3 with 6 cells: #C 2.0.1 "toad" [SN 5/70] Note use as an eater ("killer toads") in, #C for example, 4.9.1, 6.2.5, 46.4.0, and 60.5.0. See discussion #C of toad hasslers at 60.0.0. #C 2.0.2 "beacon" [JHC 3/70] #C 2.0.3 "clock" [SN 5/70] Example of ".kxk" symmetry. #C #C For any N>=8, there's at least one p2 with N cells. Generically these #C are called barber poles (see 2.7.0). For 8<=N<=11 these are the only #C known p2s; the first 3 have names: #C 2.0.4 "bipole". Example of ".cxc" symmetry. #C 2.0.5 "tripole". Example of "/xk" symmetry. #C 2.0.6 "quadpole". Example of ".cxc" symmetry. #C #C There are 4 with 12 cells (including the 6-pole, which isn't shown): #C 2.0.7 #C 2.0.8 "the fox" or "gnome" [DJB 7/77] Smallest asymmetric p2. #C 2.0.9 "flip flops" [MIT group 12/71] Example of "rk*k" symmetry. #C #C There are 2 with 13 cells, the 7-pole and: #C 2.0.10 "by flops" [RTW ????] Example of "-c+e" symmetry. #C #C There are 6 with 14 cells, the 8-pole and: #C 2.1.0 #C 2.1.1 #C 2.1.2 "why not" [DJB 7/77] #C 2.1.3 "eater plug" [RTW 2/73] #C 2.1.4 "test tube baby" #C #C Oscillators 2.0.2 (beacon), 2.1.3 (eater plug), and 2.1.4 (test tube #C baby) are examples of on-off oscillators, in which generation 0 is a #C subset of generation 1. Other examples are shown in 2.1.5 to 2.1.9. #C 2.1.5 "spark coil" [* 1971] #C 2.1.6 "4 boats" #C 2.1.7 "light bulb" [* 1971] #C 2.1.8 variant of light bulb #C 2.1.9 "scrubber" [* 1971] #C #C Oscillators 2.1.8 to 2.5.4 provide examples of the remaining p2/2 #C symmetry types. #C 2.2.0 "quad" [Robert A. Kraus 4/71] Example of "rk*k" symmetry. #C 2.2.1 "cloverleaf" [RTW before 6/72] Example of "xc*c" symmetry. #C 2.2.2 "singular flip flop" [RTW 7/72] Example of "n-e" symmetry. #C 2.2.3 "almosymmetric" [* 1971] Example of "n-e" symmetry. #C #C 2.2.4 Example of "-c+e" symmetry. #C 2.2.5 [DRH 5/20/93] Example of "n-c" symmetry. #C 2.2.6 [DRH 4/23/93] Example of ".c+c" symmetry. #C 2.3.0 [DRH 5/20/93] Example of "n/" symmetry. #C 2.3.1 "Laputa" [RCS 9/23/92] Example of "n.e" symmetry. #C 2.3.2 "blinkers bit pole" [RTW 6/77] Example of "n.e" symmetry. #C 2.3.3 [DRH 5/20/93] Example of "n.k" symmetry. #C 2.3.4 [DRH 5/20/93] Example of "n.k" symmetry. #C 2.3.5 [DRH 4/23/93] Example of ".k+k" symmetry. #C 2.3.6 Example of ".kxk" symmetry. #C 2.4.0 "piston" [* 1971] Example of "-c+c" symmetry. #C 2.4.1 Example of "-c+c" symmetry. #C 2.4.2 [DRH 5/20/93] Example of "n.c" symmetry. #C 2.4.3 "complementary blinker" [AF 7/12/94]. Example of ".c+c" #C symmetry. #C 2.4.4 Example of ".cxc" symmetry. #C 2.4.5 [DRH 4/23/93] Example of "/xc" symmetry. #C 2.4.6 [DRH 4/23/93] Example of ".crc" symmetry. #C 2.5.0 [DRH 4/23/93] Example of "rc*c" symmetry. #C 2.5.1 [AF 7/26/94] Example of "rk*k" symmetry. A muttering moat; #C see 2.12.2. #C 2.5.2 [DRH 4/23/93] Example of "xk*k" symmetry. #C 2.5.3 [DRH 1973] Example of "-e+e" symmetry. Infinitely extensible. #C 2.5.4 [DRH 4/23/93] Example of "-e+e" symmetry. #C 2.5.5 [DRH 4/23/93] Example of "-e+e" symmetry. #C 2.5.6 [DRH 4/23/93] Example of "-e+k" symmetry. #C 2.6.0 Example of ".e+e" symmetry. #C 2.6.1 Example of "+k*k" symmetry. #C 2.6.2 Example of "+k*k" symmetry. #C 2.6.3 Example of ".krk" symmetry. #C 2.6.4 Example of "xk*k" symmetry. #C #C Oscillators 2.7.0 to 2.9.1 are examples of stabilized wicks, which may #C be made arbitrarily long. #C 2.7.0 "barber pole" [MIT group 1970] #C 2.7.1 [RTW <1990] #C 2.7.2 [DRH 1994] #C 2.7.3 [RTW <1990] #C 2.7.4 [bottom end: RTW <1990; top end: DRH 1995] #C 2.7.5 [RTW <1990] #C 2.8.0 [DRH 1994] #C 2.8.1 [AWH 8/25/94] This was discovered as a stabilizer for 4.4.1. #C 2.9.0 [DRH 1994] #C 2.9.1 [DRH 1994] #C #C Oscillators 2.10.0 to 2.12.1 are stabilized agars, which may be #C made arbitrarily large. #C 2.10.0 "venetian blinds" [DRH 9/12/92] This uses diagonal edges for #C the agar. A vertical edge is also known, along with a corner #C joining it to the diagonal edge. It's easy to prove that #C horizontal edges don't exist. #C 2.10.1 [DRH 12/4/94, improved by MDN 12/6/94] #C 2.11.0 "houndstooth agar" [DRH 3/30/94] #C 2.11.1 [agar found by Robert A. Kraus 1971, stabilized by DRH 12/13/94] #C 2.11.2 #C 2.12.0 [agar found by Robert A. Kraus 1971, stabilized by ????] #C 2.12.1 "quilt" or "squaredance" [agar found by Don Woods, 1971, stabilized #C by DRH 3/25/93] #C 2.12.2 "ring of fire" [DRH 9/24/92] A "muttering moat"; i.e. an #C oscillator whose rotor consists of a closed loop of cells, #C each of which touches exactly 2 others. Also see 2.5.1. #C ---------------------------------------------------------------------- #C One other p3 is included as part of 12.4.0. #C #C 3.0.0 "caterer" [DRH 8/4/89] Both this and jam (3.0.1) supply a #C spark which is used, e.g., in 3.4.0-3.4.3, 6.5.2, 12.0.2, #C 12.0.3, 12.1.1, and 21.0.0. Also see the multiple caterer #C used in 12.4.0. #C 3.0.1 "jam" [AF 1988] #C 3.0.2 "2 eaters" [RWG 9/71] #C 3.0.3 "eaters plus" [RTW 7/91] #C 3.0.4 "biting off more than they can chew" [Peter Raynham 7/72] #C 3.0.5 "trice Tongs" [RTW 2/82] #C 3.0.6 "pulse" [DJB#46 7/73] #C 3.0.7 "pulsar 18-22-20" [DJB#47 7/73] Two copies of 3.0.6. #C 3.0.8 [RTW 4/82] #C 3.1.0 [DRH 8/89] volatility = 17/18, which was the maximum known #C for a p3 until 3.8.1 was discovered. #C #C Oscillators 3.1.1 to 3.1.3 all have rotors made of 3 cells in a #C triangle, but with different cycles. #C 3.1.1 "cuphook" or "MIT oscillator" [RCS 10/70] #C 3.1.2 "stillater" [RTW 9/85] #C 3.1.3 "1-2-3" [DJB#4 8/72] #C #C 3.1.4 [AF 8/22/94] Rotor consists of 2 copies of that in 3.1.2. #C 3.1.5 "germ" [DJB#9 9/72] #C 3.1.6 [DJB#7 <=1976] Same rotor as in "2 eaters". #C 3.2.0 "period three" [RTW 6/72] Can be reduced by 4 cells, by #C replacing the snakes by joined L tetrominos. #C 3.2.1 "mini pressure cooker" [RTW before 6/72] #C 3.2.2 "pressure cooker" [MIT group 9/71] #C 3.2.3 "hustler" [RTW 6/71] #C 3.2.4 "loading dock" [DJB#3 9/72] #C 3.2.5 "snake dance" [RTW 5/72] #C 3.2.6 "tubber" [RTW before 6/72] Rotor is confined to 2 parallel #C diagonals. Also see 4.2.4. #C 3.3.0 "diamond ring" [DJB#2 1972] #C 3.3.1 "new five" [DRH 1/90] #C 3.3.2 [DJB#92 7/26/76] #C 3.3.3 [DJB#103 6/3/77] Rotor has symmetry type "-c", but stator #C can't be made symmetric. (The left edge can be made 1 column #C narrower and 1 bit smaller by using a block below the snake.) #C 3.3.4 [DRH 10/89] #C 3.3.5 [DJB#79 6/6/76] (DJB found the smallest form of this, with #C just 1 2x3 rectangle. I don't know who found the wick.) #C #C Oscillators 3.4.0-3 are examples of "catered" oscillators. The #C necessary sparks can be supplied by either a caterer (3.0.0) or a #C jam (3.0.1). #C 3.4.0 [DRH 8/89] #C 3.4.1 [DRH 8/89] #C 3.4.2 [RTW 8/89] #C 3.4.3 "skewed traffic light" [RTW 8/89] #C #C 3.4.4 "double ewe" [RTW before 9/71] #C 3.5.0 "double caterer" [DRH 10/89] #C 3.5.1 "triple caterer" [DRH 10/89] Used in 6.6.0. #C 3.5.2 [DRH 1/90] Smallest known p3 in which a corner of the #C bounding box is active. #C 3.5.3 [AF 7/30/94 (symmetric form)] #C 3.5.4 "surprise" [DJB#10 11/72] #C 3.6.0 [DRH 9/10/89] #C 3.6.1 "bent keys" [DRH 8/89] #C 3.6.2 "short keys" [DRH 8/89] This is the shortest version of the #C left wick in 3.6.4. #C 3.6.3 [AF 7/13/94] #C 3.6.4 [left side by DRH 8/89, right side by Charles Trawick 6/71] #C 2 related wicks. The one on the right is "candelabra". The wick #C can also turn a corner, as shown in 3.7.2. #C 3.7.0 "candlefrobra" [RTW 11/84] Variant of "candelabra" (3.6.4). #C 3.7.1 "cross" [RTW 10/89] Same as 3.11.0. One of the few known #C oscillators in which one phase is a polyomino. Also see #C 3.7.2. #C 3.7.2 [HH 2/26/93] A larger version of 3.7.1, which may be made #C any size. #C 3.7.3 "star" [HH 2/16/93] Another polyomino. #C 3.7.4 [HH 3/5/93] Blocks may be added in any of the 4 corners of #C 3.6.3. #C 3.8.0 [DRH 1994] #C 3.8.1 [DRH 11/27/94] Volatility -> 1 as length increases. No #C finite p3 is known with volatility = 1. (Volatility = number #C of rotor cells divided by total number of cells in rotor and #C stator.) #C 3.9.0 [DRH 9/18/89] #C 3.9.1 "p3 rumbling river" [DRH 11/26/94] The rotor is connected #C and contained in a strip of height 2. #C #C In the next 3 rows, each oscillator in the left column consists of #C 4 quarters, which can be rearranged to form larger closed loops #C (middle column) or chains that aren't closed (right column). See #C 5.8.0-5.8.1 for another example. #C 3.10.0 "pulsar" or "pulsar CP 48-56-72" [JHC 3/70] The first #C known, and most commonly occurring, p3 oscillator. #C 3.10.1 "quasar" [RTW 8/71] #C 3.10.2 [???? before 11/27/94] #C 3.11.0 "cross" [RTW 1989] Same as 3.7.1. #C 3.11.1 [DRH 11/27/94] #C 3.11.2 [DRH 11/27/94] #C 3.12.0 [HH 3/5/93] #C 3.12.1 [DIB 3/7/93] #C 3.12.2 [RWG 9/22/94] #C ---------------------------------------------------------------------- #C Some other p4s are included as parts of oscillators with larger #C periods, namely 124.1.0-1 and 188.0.0-1. #C #C 4.0.0 "mold" [AF 1988] Period 4/2, symmetry type "n/". Supplies #C a 1-bit spark that's used, e.g., in 8.3.4, 16.1.1, several #C p28s, 32.1.1, 36.0.1, 36.0.2, 40.0.1, 52.0.1, 88.0.0, #C 100.0.1, and 200.0.0. #C 4.0.1 "mazing" [DJB#45 12/73] Period 4/2, symmetry type "/xk". #C 4.0.2 "monogram" or "JHC" [DRH 8/11/89] Period 4/2, symmetry type #C "+c*c". Supplies a spark that's used in 12.2.0-12.3.1. #C 4.0.3 [DRH 8/89] Period 4/2, symmetry type "/xk". Supplies a spark #C that's used in 4.13.1 and 4.17.1. #C 4.0.4 [DRH before 4/92] #C 4.0.5 [DRH 9/89] Supplies a spark that's used in 12.1.0. #C 4.0.6 "Achim's p4" [DJB#88 1976, AF 1988] DJB found a larger #C form of this, using the same pieces that occur in siesta #C (5.2.3) and sombreros (6.1.1). AF found the smaller version. #C The rotor consists of 2 copies of that in 4.2.6. #C 4.0.7 [DJB#23 <1973?] #C 4.1.0 "eater/block frob" [DJB#51 <=1976] #C 4.1.1 "confused eaters" [DJB#49 before 1973] Period 4/2, symmetry #C type "n/". #C 4.1.2 "pinwheel" [SN 4/70] Period 4/4, symmetry type "nrk". #C 4.1.3 "clock II" Period 4/4, symmetry type "nrk". #C 4.1.4 [DJB#28 before 1973?] Rotor is p4/2, symmetry type "rk*k". #C 4.1.5 "T-nosed p4" [RTW 1989] #C 4.1.6 [DRH 1994] A narrower but longer T-nosed p4 #C #C Oscillators 4.2.0 to 4.2.3 are examples of "babbling brooks", in which #C the rotor consists of a chain of cells, each one adjacent to only 1 or #C 2 others. At the time the collection was built, these were the only #C known babbling brooks with period > 2. I found another on 8/3/97: #C #C .......o........ #C .....ooo....oo.. #C ....o...oo..o... #C .o..o.oo..o.o... #C o.o.o....oo..oo. #C .oo..oo....o.o.o #C ...o.o..oo.o..o. #C ...o..oo...o.... #C ..oo....ooo..... #C ........o....... #C #C (For p2 examples, see 2.0.2, 2.1.3-5, and 2.1.7-8.) #C 4.2.0 [DJB#13 before 1973] Period 4/2, symmetry type "n/". #C 4.2.1 [DJB#15 <1973] #C 4.2.2 [DJB#104 6/3/77] #C 4.2.3 [DRH 11/10/94] #C #C 4.2.4 "wavefront" [DJB#24 <=1976] Rotor is confined to 2 parallel #C diagonals. Also see 3.2.6. #C 4.2.5 "Gray counter" [???? 1971] Also see 4.15.1. #C 4.2.6 [DRH 8/89] Also see 4.0.6. #C 4.3.0 [DRH 8/89] Period 4/2, symmetry type "n-e". #C 4.3.1 [DRH 8/89] Period 4/2, symmetry type "n-e". #C 4.3.2 [DRH 8/89] Period 4/2, symmetry type "n-c". #C 4.3.3 [DRH 3/90] Period 4/2, symmetry type "n/". #C 4.3.4 [DRH 3/90] Period 4/2, symmetry type "n/". #C 4.3.5 [DRH 3/90] Period 4/2, symmetry type "n/". #C 4.3.6 [DJB#21 <1973] #C 4.4.0 "penny lane" [DJB#123 1972] #C 4.4.1 [AF 8/22/94 (symmetric form), AWH 8/25/94 (using 2.8.1 for #C right half), DRH 11/23/94 (this p2 on right)] Only 3 cells #C are p4; the rest are p1 or p2. #C 4.4.2 [DJB#98 4/28/77] Period 4/2, symmetry type "n-e". #C 4.4.3 [RTW 1989] #C 4.4.4 [DJB#20 <1977] #C 4.5.0 "windmill" [DRH 11/89] #C 4.5.1 [AF 8/23/94 (symmetric form)] #C 4.5.2 [AF 7/17/94 (symmetric form), RWG,AWH 11/20/94] #C 4.5.3 [AF 8/31/94 (symmetric form)] #C 4.5.4 "boss" [DJB#30 1972] #C 4.5.5 [DJB#69 <=1976] #C #C In 4.6.0 to 4.6.5, only 2 cells are p4; the rest are p1 or p2. #C 4.6.0 [DRH 12/10/94] #C 4.6.1 [RTW 11/90] #C 4.6.2 [DRH 12/10/94] #C 4.6.3 [DRH 12/10/94] #C 4.6.4 [DRH 12/10/94] #C 4.6.5 [DRH 12/10/94] #C #C Oscillators 4.7.0 to 4.10.1 are all related. They are based on this #C infinite oscillator, in which a single row of cells is surrounded by #C 2 lines of blocks (or other things): #C #C oo..oo..oo.oo.oo.oo.o..oo #C oo..oo..oo.oo.oo.o.oo..oo #C ......................... #C ......................... #C ......................... #C ......................... #C ... ooooooooooooooooooooooooo ... #C ......................... #C ......................... #C oo.oo.o..oo.oo.oo..oo..oo #C o.oo.oo..oo.oo.oo..oo..oo #C #C This can be made finite in several ways. First, any of 3 small pieces #C can be attached to the ends. The first is shown in row 4.7. (Also #C see 8.0.5.) The others are shown in 4.8.1 to 4.8.3. (A much larger #C end piece is shown in 4.12.2.) Next, the line can be bent to form a #C corner, as in 4.8.4. If it's bent 4 times, it can form an octagon, #C as in 4.9.0 to 4.10.0. #C #C 4.7.0 "lightweight emulator" [RTW 6/80] #C 4.7.1 "middleweight emulator" [RTW 6/80] Supplies a 1-bit spark #C that's used, e.g., in 20.0.0-20.0.2, 24.1.2, 60.5.1, and #C 124.1.0. #C 4.7.2 "heavyweight emulator" [RTW 6/80] Supplies a domino spark #C that's used, e.g., in 8.3.3, 12.0.2, 12.4.0, 32.0.2, 36.1.2, #C and 44.0.0. #C 4.7.3 "overweight emulator" [RTW ????] #C 4.7.4 #C 4.8.0 [AF 7/13/94] May be compressed horizontally by 1 or 2 cells. #C Also see 4.8.1 and 4.8.3-4. #C 4.8.1 [DRH 7/14/94] Half of 4.8.0, supported by 2 clocks. (This #C use of a clock was discovered, in another universe, by DIB.) #C 4.8.2 [DRH 12/6/94] #C 4.8.3 #C 4.8.4 #C 4.9.0 [RTW ????, AF 8/7/94] An octagon of side 2, showing 2 ways to #C stabilize the edge. #C 4.9.1 [DRH 9/89] An octagon of side 3, showing 4 ways to stabilize #C the edge. #C 4.9.2 "octagon IV" [RTW 1/79] An octagon of side 4. The edges #C can also be stabilized using eaters or toads as in 4.9.1. #C This also works if a block is added in the center. #C 4.9.3 [DRH,RTW 9/89, AF 8/7/94] An octagon of side 5, showing 4 ways #C to stabilize the edge. #C 4.10.0 [AF,DRH 1994] A larger octagon. The corners can also be #C stabilized using eaters or toads as in 4.9.1. #C 4.10.1 [DRH 9/16/92] Stabilized p4 agar, made of several parallel #C lines. #C #C 4.10.2 [DRH ????] Period 4/2, symmetry type "+k*k". #C 4.10.3 [RTW before 10/92] The MW emulators (4.7.1) can be replaced by #C molds (4.0.0). #C #C Pattern 4.7.1 (MW emulator) is often useful because of its 1-bit #C spark. But in some applications the object being sparked would #C collide with the rest of the emulator. In such situations the #C oscillators below may be more useful. (Also see the p4 at the top #C of 124.1.0 and the one in 188.0.0.) #C 4.11.0 [DRH 1994] #C 4.11.1 "fountain" [DRH 11/28/94] Supplies a spark that's used in #C 24.1.0-24.2.1, 124.0.0-1, and 124.1.1. It can also be used #C (not shown) to double the period of a period 4N+2 MWSS stream, #C in a manner similar to that used in 60.5.1 to double the #C period of a LWSS stream. #C 4.11.2 [DRH 1994] #C #C 4.11.3 [AWH 2/10/95] #C 4.11.4 [DRH 4/6/92] #C #C Pattern 4.7.2 (HW emulator) has a useful 2-bit spark. But sometimes #C these are better: #C 4.12.0 [DRH >=11/30/94] Supplies a spark that's used in 12.0.3, #C 60.3.1, and 124.1.1. It can also be used (not shown) to #C double the period of a period 4N+2 HWSS stream, in a manner #C similar to that used in 60.5.1 to double the period of a #C LWSS stream. #C 4.12.1 [DIB,DRH 12/12/94] A longer but narrower version of 4.12.0. #C 4.12.2 [DRH 1994] #C #C 4.12.3 [RTW 9/91, DRH 1/14/95] First stabilization (not shown here) #C was found by RTW 9/91. #C #C 4.13.0 "sixty nine" [RTW 10/78] Period 4/4, symmetry type "nrk". #C #C 4.13.1 [RTW 9/89] Period 4/2, symmetry type ".crc". #C 4.13.2 [DRH 1/10/95] Period 4/4, symmetry type "nrc". #C 4.13.3 [DRH 1/10/95] Period 4/4, symmetry type "nrc". #C 4.14.0 [DRH 10/89] 2 related wicks. The one on the left is #C "turning toads"; it's related to the toad hasslers such as #C 60.1.0 - 60.1.4. #C 4.14.1 [DRH 8/89, AF 1994] #C 4.15.0 #C 4.15.1 [???? 1971] #C 4.16.0 [RTW 9/91] #C 4.16.1 [DRH ????, DIB 12/11/94] #C 4.17.0 [RWG 9/17/94 (wick), 11/20/94 (ends)] The repeating part of #C this wick may be attached to itself in 6 different ways. #C 4.17.1 [RTW 9/89] #C ---------------------------------------------------------------------- #C 5.0.0 "fumarole" [DRH 9/3/89] Supplies a domino spark that's used #C in traffic jam oscillators such as 50.0.0, 100.0.1, 110.0.0, #C 200.0.0. (The domino spark in a HW volcano (5.7.1) is more #C usable.) #C 5.0.1 "octagon II" [Sol Goodman & Arthur C. Taber 1971] #C 5.0.2 [AF 7/13/94] Also see 5.0.3. #C 5.0.3 [AWH 11/19/94] Skewed version of 5.0.2. #C 5.0.4 "pseudo barberpole" [AF 8/22/94] #C 5.0.5 [RTW 1/82, DJB#145 8/15/84] #C 5.0.6 [AF 7/27/94] #C 5.1.0 "technician finished product" [DJB#33 1/73] Also see 5.3.3. #C 5.1.1 "mathematician" [DJB#34 1972] #C 5.1.2 "aVerage" [DJB#35 1973] #C 5.1.3 [DJB#160 1/6/87] #C 5.1.4 [DJB#163 2/19/87] #C 5.1.5 [RTW 1/82 (DJB#146)] #C 5.1.6 "pentant" [DJB#85 7/11/76] #C 5.2.0 "toaster" [DRH 4/1/92] Supplies sparks that are used #C in 15.1.1. #C 5.2.1 "middleweight volcano" or "MW volcano" [DRH 4/6/92] Supplies #C sparks that are used in 10.0.3, 10.1.1, 15.1.1, 20.0.0, #C 20.0.2, all known p25s, 50.0.1, 80.0.0, 230.0.0, and 230.0.1. #C 5.2.2 "101" [AF 8/19/94] #C 5.2.3 "siesta" [DJB#57 1973] Also see 4.0.6, 6.1.1-6.1.4, and #C 8.3.0. #C 5.2.4 [DJB#158 2/25/85] #C 5.2.5 [DJB#101 5/22/77] #C 5.3.0 "chemist" [DJB#38 1973] #C 5.3.1 [DJB#84 7/76?] #C 5.3.2 [DJB#44 ????] #C 5.3.3 "pedestle" [DJB#39 1973] Rotor consists of 2 copies of #C the rotor in 5.1.0. #C 5.3.4 [DRH 1994] 2 fumaroles hassle a long barge. Based on 8.3.1. #C A different mechanism is used in 15.1.0. #C 5.4.0 [DJB#151 9/29/84] #C 5.4.1 [DJB#114 6/21/77] Also see 7.1.2 and 11.0.0. #C #C The next 2 are almost "period 5/2" oscillators: In each one, the top #C and bottom halves go through the same cycle, 2 gens out of phase. #C 5.4.2 [DJB#87 7/15/76] #C 5.4.3 [DJB#142 5/21/84] #C #C 5.4.4 [DRH 10/4/89] #C 5.5.0 "pentoad" [RWG 6/77] Also see 5.5.1 and 6.4.0. #C 5.5.1 "multiple pentoads" [RWG & Scott Kim ????] #C 5.5.2 [DJB#93 7/26/76] #C 5.5.3 [DJB#152 9/29/84] Also see 6.4.2. #C 5.5.4 [AF 8/7/94 (symmetric form), AWH 11/19/94] #C 5.6.0 "electric fence" [HH 10/20/92, DRH 11/23/92, 2/21/93] A #C stream of 'ants' moves leftward from the 'source' at the #C right to the 'sink' at the left. HH found a source that #C moves right at c/4, but no moving sink has been found. DRH #C found the stationary sink and later found the stationary #C source. Also see 5.7.0. #C 5.6.1 [DRH ????] There are 6 adjacent columns with only 1 active #C cell each. #C 5.7.0 "another electric fence" [DRH 1/26/95] Also see 5.6.0. #C 5.7.1 "heavyweight volcano" or "HW volcano" [DRH 2/5/95] Supplies #C sparks that are used in 10.0.3, 10.1.1, 30.4.0, 30.5.0, and #C 35.0.0. #C 5.8.0 "harbor" (so-named because gen 3 consists of 4 ships and #C 8 boats) [DJB#122 9/17/78] #C 5.8.1 [DRH 12/2/94] The pieces of harbor (5.8.0) can be #C rearranged in the same way as 3.10.0-3.12.2. #C ---------------------------------------------------------------------- #C Also see the p6 used in 18.0.1. #C #C 6.0.0 "unix" [DJB#48 2/10/76] Produces a 1-bit spark that's used #C in many oscillators. #C 6.0.1 "A for all" [DRH 3/6/93] #C 6.0.2 [AF 7/25/94] #C 6.0.3 "$rats" [DJB#36 1972] #C 6.0.4 "extremely impressive" [DJB#78 8/76] #C 6.0.5 [DJB#100 5/21/77] #C 6.0.6 [DJB#65 <=1976] #C 6.1.0 [AF 8/7/94 (symmetric form)] Note similarity to unix (6.0.0). #C #C The next 4 oscillators are closely related. Also see 4.0.6, 5.2.3, #C and 8.3.0. #C 6.1.1 "sombreros" [DJB#56 1972] #C 6.1.2 [DJB#133 11/16/80] Also see 6.1.1 #C 6.1.3 [DJB#58 <=1976] #C 6.1.4 [DJB#59 <=1976] #C #C 6.2.0 [DRH 8/89] Period 6/2, symmetry type ".e+e". #C 6.2.1 [DRH 8/89] Period 6/2, symmetry type ".e+e". #C 6.2.2 [AF 7/13/94] #C 6.2.3 [DJB#72 <=1976] #C 6.2.4 [DJB#102 6/3/77] #C 6.2.5 [RTW 1989] Also see 6.2.6. #C 6.2.6 [DJB#141 4/25/84] Also see 6.2.5. #C 6.3.0 [DRH 8/89] Period 6/2, symmetry type "n/". #C 6.3.1 [AF 7/26/94] #C 6.3.2 [DJB#132 10/30/80] #C 6.3.3 [DJB#117 9/1/77] #C 6.3.4 [DJB#121 3/4/78] Also see 32.0.0. #C 6.3.5 [DJB#110 6/19/77] #C 6.4.0 [DJB#99 5/12/77] Also see 5.5.0. #C 6.4.1 "trivial p6" [DRH 12/10/94] There are no period 6 cells; #C the left 7 columns are p2; the rest are p3. #C 6.4.2 [DJB#157 10/14/84] Also see 5.5.3. #C 6.4.3 [DRH 9/22/94] #C 6.5.0 "symmetric T-nosed p6" [AF 8/31/94] #C 6.5.1 "T-nosed p6" [AF 9/12/94] Supplies a spark that's used in #C 12.4.1. #C 6.5.2 [DRH 9/89] Period 6/2, symmetry type "-e+e". #C 6.5.3 [RTW 11/16/94] 4 unixes support a simple diagonal wick. #C 6.6.0 [right end:RTW 10/78, middle and left end:DRH 10/89] #C 6.7.0 [NDE 11/21/94] The wick (left end) was found by AF (8/19/94); #C NDE stabilized it; the variations are by DRH (11/22&27/94). #C 6.8.0 [wick by DJB 1973, ends by DRH 1995?] #C ---------------------------------------------------------------------- #C 7.0.0 "burloaferimeter" [DJB#40 1972] Also see 7.0.1. #C 7.0.1 "airforce" [DJB#41 1972] Rotor consists of 2 copies of #C the rotor in burloaferimeter (7.0.0). #C 7.0.2 [DJB#77 <=1976] #C 7.0.3 [DJB#106 6/6/77] Right half can also be turned upside-down #C and shifted up 2 units. #C 7.0.4 [DJB#109 6/19/77] Supplies a domino spark that's used in #C 21.0.0, 105.0.0, and 329.0.0. Also see 26.1.0, where an #C equivalent p7 gets phase-shifted by 2 gens. #C 7.1.0 [DRH 9/22/94] #C 7.1.1 [DRH 10/1/94] #C 7.1.2 [DJB#113 6/21/77] Also see 5.4.1 and 11.0.0. #C 7.1.3 [DJB#135 9/7/81] #C ---------------------------------------------------------------------- #C 8.0.0 "blocker" [RTW ????] Supplies a spark used in 16.0.1, 16.1.1-2, #C 24.1.3, 40.0.1, 72.0.0, and 360.0.0. #C 8.0.1 "Kok's galaxy" [Jan Kok 1971] Supplies a spark used in 56.0.0, #C 120.3.0, 128.0.0, and 856.0.0. #C 8.0.2 "figure 8" or "big beacon" [SN 1970] Supplies sparks used #C in 8.3.1-2, 8.5.0-2, 16.0.2, 24.1.1, 24.2.1, 32.1.1, 40.0.1, #C 40.1.0, 96.0.0, 120.3.0, 128.0.0, and 808.0.0. #C 8.0.3 "smiley" [AF 7/17/94] #C 8.0.4 [AF 7/20/94] Period 8/2, symmetry type ".cxc". #C 8.0.5 [DRH 11/16/94] A p8 variant of the p4 emulators; see #C 4.7.0-4.7.3. #C 8.1.0 "cauldron" or "crucible" [Don Woods, RTW 1971] #C 8.1.1 "Hertz oscillator" [JHC group 1970] #C 8.1.2 "R2D2" [Peter Raynham early 1970s (with a different stator), #C redeiscovered and named by NDE 8/14/94] #C 8.1.3 "pyrotechnecium" [DJB#42 1972] (This was mis-named #C "pyrotechneczum" for many years.) #C 8.1.4 [AF 8/26/94] Supplies a 2-bit spark, which might be usable #C when the one in figure 8 (8.0.2) fails. #C 8.1.5 [DJB#80 6/30/76] #C 8.2.0 [RTW 1989] #C 8.2.1 [DJB#115 6/22/77] #C 8.2.2 "roteightor" [RTW 1972] Also see 8.2.3. #C 8.2.3 "multiple roteightors" [DRH 1/90] A finite agar of any size #C can be constructed in this way. #C 8.2.4 [DJB#105 6/6/77] #C 8.3.0 [DJB#55 <=1976] #C 8.3.1 [RTW 9/84] 2 figure 8s hassle a long barge. Also see 5.3.4. #C A different mechanism is used in 15.1.0. #C 8.3.2 [AF 8/31/94] 4 figure 8s hassle a tub. #C 8.3.3 "p8, type 0 toad flipper" See discussion at 60.0.0. #C 8.3.4 [RTW 9/89] Period 8/2, symmetry type "/xk". #C #C The next 3 are closely related: #C 8.4.0 [DJB#90 7/16/76] #C 8.4.1 [DJB#138 1/23/83] #C 8.4.2 [DJB#94 7/29/76] #C #C 8.4.3 "bottle" [AF 8/7/94] Also see "ship in a bottle", 16.0.1. #C 8.5.0 "tumbling T-tetson" [RTW ????] #C 8.5.1 [DJB ????] "nonstandard type 1 p8 toad sucker" See #C discussion at 60.0.0. #C 8.5.2 [DJB ????] "nonstandard type 2 p8 toad flipper" See #C discussion at 60.0.0. #C ---------------------------------------------------------------------- #C 9.0.0 "worker bee" [DJB#52 1972] #C 9.0.1 multiple worker bees #C 9.0.2 [DJB#43 1972??] #C 9.0.3 [DJB#83 7/10/76] #C 9.0.4 [DJB#155 10/9/84] #C 9.1.0 "snacker" [MDN 1972] #C 9.1.1 multiple snackers #C 9.1.2 [RWG 7/15/94] Based on 15.0.1. #C 9.1.3 [RWG 7/15/94] Based on 15.0.2. #C ---------------------------------------------------------------------- #C 10.0.0 [DJB#76 <=1976] #C 10.0.1 [DJB#161 1/21/86] #C 10.0.2 [DJB#153 9/30/84] #C 10.0.3 [DRH 2/16/95] 2 p5s hassle a blinker. Also see 10.1.1. #C 10.1.0 [DJB#139 5/1/83] #C 10.1.1 [DRH 2/16/95] 4 p5s hassle a blinker. Also see 10.0.3. #C ---------------------------------------------------------------------- #C 11.0.0 [DJB#112 6/20/77] Also see 5.4.1 and 7.1.2. #C 11.0.1 [AF 8/4/94] #C 11.0.2 [DJB#156 10/9/84] #C ---------------------------------------------------------------------- #C 12.0.0 "dinner table" [RTW 1972] Period 12/4, symmetry type "nrc". #C 12.0.1 [DJB#159 1986?] #C 12.0.2 [NDE 1/3/95] Supplies a spark that's used in 24.0.1, #C 48.0.0, 96.0.0, 132.0.0, 144.1.0, and 156.0.0. It should #C also be used in 36.1.2, but an earlier version of the p12 #C was inadvertently used there. Also see 12.4.0. #C 12.0.3 [DRH 1/4/95] A larger version of 12.0.2, with a more #C accessible spark. #C 12.1.0 [AF,AWH,RWG 8/8/94] First found on a 32x32 torus, without #C the outer p4s. #C 12.1.1 "baker's dozen" [RTW 8/89] Earlier versions used sparks #C from p4 and p6 oscillators. #C 12.1.2 [DJB#131 10/26/80] 4 baker's dozens, using only stable #C objects and each other for support. #C #C Oscillators 12.2.0 to 12.3.1 are variations on a p12 wick. #C 12.2.0 #C 12.2.1 [DJB <1980, RTW 1989] Originally supported by MW emulators; #C RTW found that monogram works too. #C 12.3.0 #C 12.3.1 "carnival shuttle" [RTW 9/84] Originally used MW emulators #C at the ends. ???? {see RTW's 11/10/89 ltr} #C 12.4.0 [MDN, DRH >~2/20/95] A wick based on 12.0.2, using a p3 #C multiple caterer. #C 12.4.1 [NDE 6/9/95] #C ---------------------------------------------------------------------- #C 13.0.0 [DJB#96 7/31/76] #C ---------------------------------------------------------------------- #C 14.0.0 "tumbler" [George Collins, Jr. 1970] Period 14/2, symmetry #C type "-c+c". #C ---------------------------------------------------------------------- #C 15.0.0 "pentadecathlon" or "PD" [JHC 1970] Supplies sparks used in #C ???? {mention phase changers} #C 15.0.1 [RTW 10/78] 2 PDs hassle 2 blocks symmetrically. Also see #C 9.1.2. #C 15.0.2 "Jolson" [RTW 11/84] 2 PDs hassle 2 blocks asymmetrically. #C 15.0.3 [DJB 3/73] 4 PDs hassle 4 blocks. #C 15.1.0 [DJB 7/73] 2 PDs hassle a long barge. Note that this is #C not the same mechanism as in 5.3.4 and 8.3.1. #C 15.1.1 "p15 biblock hassler" [DRH 2/21/95] See description #C at 16.1.1. #C 15.1.2 "loaflipflop" [RTW 1990] 4 PDs hassle a loaf. #C ---------------------------------------------------------------------- #C 16.0.0 [AF 7/27/94] Period 16/2, symmetry type "rc*c". #C 16.0.1 "2 pre L hassler" [RTW 7/83] 4 blockers hassle a pair of #C pre-loafs. Period 16/2, symmetry type ".k+k". #C 16.0.2 "sailboat" [RTW 6/84] The 2 p8 oscillators (figure 8 and #C Kok's galaxy) supply sparks which attack the boat in the #C same way, but it's not possible to use 2 copies of either. #C 16.1.0 "ship in a bottle" [RWG 8/7/94] Period 16/2, symmetry #C type "/xk". #C 16.1.1 "p16 biblock hassler" [NDE 2/20/95] 2 1-bit sparks (from #C a blocker (8.0.0) and a mold (4.0.0)) hassle a pair of #C blocks. Sparks can also come from oscillators of period 5 #C (see 15.1.1), 6 (see 18.1.0), 12, 29, 47, or 72 (not shown). #C The biblock creates a 1-bit spark of its own in gen 13, so #C it's possible to build a loop of 4 of them (see 52.0.1). #C Also see 16.1.2 for a symmetric version. #C 16.1.2 "symmetric p16 biblock hassler" [NDE 2/21/95] See #C description at 16.1.1. #C 16.2.0 [AF 8/7/94 (on a 32x32 torus), RWG 8/17/94] #C 16.2.1 [RWG 8/9/94 (ship inside), RWG 8/17/94 (toad hassler)] #C A nonstandard toadflipper; see discussion at 60.0.0. #C ---------------------------------------------------------------------- #C 18.0.0 [DJB before 5/91] Period 18/2, symmetry type "n.e". #C 18.0.1 [DRH 1/1/95] 2-glider shuttle. See comments for 42.0.0. #C 18.1.0 "p18 biblock hassler" [NDE 2/20/95] See description #C at 16.1.1. #C ---------------------------------------------------------------------- #C 20.0.0 [NDE 3/22/95] A period 9+11 traffic light hassler. #C 20.0.1 [NDE 4/2/95] A period 10+10 traffic light hassler. #C 20.0.2 [NDE 6/29/95] Sparks from some p4 and p5 oscillators #C hassle a loaf. #C ---------------------------------------------------------------------- #C 21.0.0 [RTW 2/21/95] A period 10+11 traffic light hassler. #C ---------------------------------------------------------------------- #C 24.0.0 "p24, type 2 toadflipper" [RWG 1994] See discussion at 60.0.0. #C 24.0.1 [NDE 11/20/94] #C 24.1.0 [RWG 11/29/94] #C 24.1.1 [RWG 11/29/94] MDN found (not shown; 11/30/94) that an #C eater can be added at the top left in gen 14 to produce a #C rather inaccessible 1-bit spark. #C 24.1.2 [RWG 11/29/94] #C 24.1.3 [NDE 11/29/94] #C 24.2.0 [RTW 12/10/94] Produces a 2-bit spark that's used in #C 2 p48 toad hasslers (48.0.1-2). Also see 24.2.1. #C 24.2.1 [RWG 12/12/94] A variant of 24.2.0. #C ---------------------------------------------------------------------- #C All known p25 oscillators are based on pushing 2 or more traffic light #C predecessors 3 units in 14 gens and pushing them back in 11 gens. #C No way is known to do this with just one pre-t.l. #C 25.0.0 [NDE 9/23/94 (with toasters instead of eaters), DRH 10/19/94] #C 25.0.1 [NDE 11/5/94] #C 25.1.0 [NDE 11/5/94] #C 25.1.1 [NDE 11/18/94] #C 25.2.0 [NDE 11/18/94] #C ---------------------------------------------------------------------- #C 26.0.0 [DJB#140 1/18/83] #C 26.0.1 #C 26.1.0 [use of p7s in top by RWG 8/24/94; see RWG 10/30/94] #C ---------------------------------------------------------------------- #C All known p28 and p29 oscillators are "pulsar hasslers". Consider a #C pair of hollow 3x3 squares, with 3 empty columns between them: #C ooo...ooo #C o.o...o.o #C ooo...ooo #C After 15 generations, this becomes 4 hollow squares: #C ooo...ooo #C o.o...o.o #C ooo...ooo #C ......... #C ......... #C ......... #C ooo...ooo #C o.o...o.o #C ooo...ooo #C (This goes on to become a p3 "pulsar" in gen 20.) By repeatedly #C suppressing 2 of the hollow squares, we obtain oscillators of #C periods 30 and 60; see 30.2.0-3 and 60.5.0. #C #C It's also possible to suppress 2 of the squares in such a way that #C the other 2 form in gen 14 instead of 15; this leads to oscillators #C with periods 28 and 29. Originally this required 8 pairs of squares #C supporting each other; DJB found the first p28 ("newshuttle", not #C included in this collection) in 1973. Later, several methods were #C found which use either 1, 2, or 4 mutually supporting pairs. #C #C 28.0.0 #C 28.0.1 #C 28.0.2 #C 28.0.3 [RWG 7/31/94] #C 28.1.0 #C 28.1.1 #C 28.1.2 "smaller newshuttle" [DJB#64 8/2/80] #C 28.2.0 #C 28.2.1 #C 28.2.2 #C ---------------------------------------------------------------------- #C 29.0.0 #C 29.0.1 #C 29.0.2 #C 29.1.0 #C 29.1.1 #C 29.1.2 #C 29.2.0 [RWG 7/31/94] #C 29.2.1 "prime" [DJB#127 8/2/80] #C 29.2.2 #C 29.3.0 "p29 PD hassler" [RWG ????, DRH 12/13/94] 2 copies of #C 29.0.1 change the phase of a PD. Supplies a 2-bit spark #C that's used in 58.0.0. Also see 36.1.0 and 54.1.0. #C 29.3.1 #C 29.3.2 #C ---------------------------------------------------------------------- #C 30.0.0 "queen bee" or "p30 shuttle" [RWG 1970] The central #C part (the shuttle) reappears, reflected across a vertical #C line, in 15 gens, but a beehive is also produced, which #C would destroy the shuttle. The beehive can be destroyed #C by a block, as shown here, or by an eater in one of two #C different positions, as in 30.0.2. #C 30.0.1 "p30 glider gun" [RWG 11/70] #C 30.0.2 2 p30 shuttles push a beehive back and forth. This also #C demonstrates the 2 positions of an eater that stabilize #C the shuttle. #C 30.1.0 [NDE 10/30/94] 2 p30 shuttles repeatedly change the phase #C of a blinker. #C 30.1.1 [DIB 9/1/92] 2 p30 shuttles repeatedly reverse a loaf. #C 30.1.2 [RTW ????] 2 p30 shuttles repeatedly convert blocks to #C gliders. Also see 92.3.0. #C 30.2.0 "Eureka" [DJB#130 8/16/80] The simplest pulsar hassler. #C Can also be skewed, by moving one half up 2 units. #C 30.2.1 #C 30.2.2 #C 30.2.3 "pulshuttle V" [RTW 5/85] #C 30.3.0 "hectic" [RTW 9/84] Period 30/2, symmetry type ".crc". #C 30.3.1 "p30 LWSS gun" #C 30.4.0 [DRH 2/14/95] 4 p5s hassle a beehive. Also see 35.0.0. #C 30.4.1 [????] 6 gliders in a 180 gen loop. This use of a queen bee #C as a reflector is called a "buckaroo". #C 30.5.0 "zweiback" [MDN 2/13/95] #C ---------------------------------------------------------------------- #C 32.0.0 "gourmet" [DJB#120 3/4/78] Period 32/4, symmetry type #C "nrk". Also see 6.3.4. #C 32.0.1 "popover" [RTW 8/84] Period 32/4, symmetry type "nrk". #C 32.0.2 "pi portraitor" [RTW 1984 or 1985] Period 32/4, symmetry #C type "nrk" #C 32.1.0 [RTW 5/85] Period 32/2, symmetry type "n.c". Two gourmets #C overlap, sharing a loaf. It's possible to build an #C arbitrarily large agar this way. #C 32.1.1 [NDE 1/26/95] Period 32/2, symmetry type "-c+e". #C ---------------------------------------------------------------------- #C 35.0.0 [DRH 2/14/95] 4 p5s hassle a beehive. Also see 30.4.0. #C ---------------------------------------------------------------------- #C 36.0.0 [NDE 1/29/95] #C 36.0.1 "p36 traffic jam" [RWG 10/14/94] #C 36.0.2 [NDE 11/23/94] 2 copies of 36.0.1 change the phase of a PD. #C Also see 29.3.0 and 54.1.0. #C 36.1.0 "p36, type 0 toadflipper" [????] See discussion at 60.0.0. #C 36.1.1 "p36, type 1 toadsucker" [????] See discussion at 60.0.0. #C 36.1.2 [NDE 11/20/94] Could be made smaller using jams instead of #C T-nosed p4s. #C ---------------------------------------------------------------------- #C 40.0.0 [DJB before 5/91] #C 40.0.1 "p40 traffic jam" [NDE 10/14/94] #C 40.1.0 [DRH 11/4/94] A period 20+20 traffic light hassler. Period #C 40/2, symmetry type "-c+e". This use of a bookend as an #C eater also occurs in 25.0.1-25.2.0. #C ---------------------------------------------------------------------- #C 42.0.0 [RTW 9/84, MDN ??/94] A 2-glider shuttle, using a reaction #C in which an eater3 and sparks from 2 unixes reflect a pair of #C gliders. RTW found a period 66+24n version of this; MDN #C noticed that period 42 could be achieved by rearranging the #C unixes. The unixes can also be replaced by period 5 or 47 #C oscillators, giving periods 50+40n (see 50.0.1) and 282+376n #C (see 282.0.0), or by a larger p6 oscillator, giving period #C 18 (see 18.0.1). Also, by a lucky coincidence, the spacing #C between the gliders allows 2 pairs of gliders to cross using #C rephasers, giving periods 246+24n (see 246.0.0), 230+40n #C (see 230.0.0), and 846+376n (not shown). #C ---------------------------------------------------------------------- #C 44.0.0 [DJB 4/2/92] (OBSOLETE: About 4/29/96, NDE found a simpler #C version: Advance the MW emulators 3 gens and delete the 2 #C blocks closest to them.) #C 44.0.1 "p44 glider gun" [DJB 4/2/92] Large sparks from 2 p44 #C oscillators combine to produce gliders. (OBSOLETE: In 10/96, #C DJB found a p44 gun using only 1 p44 oscillator.) #C ---------------------------------------------------------------------- #C 45.0.0 A p15 PD (15.0.0) and a p9 snacker (9.1.0) interact almost #C trivially. #C ---------------------------------------------------------------------- #C Period 46: The p46 shuttle, known as "twin bees", was discovered in #C 1971 by Bill Gosper. Each end of the shuttle can be stabilized by #C either 1 or 2 blocks, as shown in 46.0.0. If only 1 block is used, #C a large spark is produced which can reflect gliders and spaceships #C in several ways. Two shuttles can be combined in at least 5 ways to #C produce glider guns (46.1.0, 46.1.1, 46.2.0, 46.3.0, and the right #C half of 92.4.0). Also see periods 92, 138, 184, 230, 276, 460, 552, #C 690, and 40894. #C #C 46.0.0 "twin bees" or "p46 shuttle" [RWG 1971] #C 46.0.1 [????, DRH 10/26/94] 2 shuttles push a beehive back and forth #C using 2 different reactions. Also see 92.0.0. #C 46.1.0 [RWG ???? {before 3/92}] A p46 glider gun #C 46.1.1 [RWG ???? {before 12/30/90}] Double-barreled p46 glider gun #C 46.2.0 [PC 6/24/94] A p46 glider gun. This one is useful for #C creating gliders parallel to an existing glider stream, #C as in 46.4.0. #C 46.2.1 [RWG <=1992] p46 LWSS gun, based on a 135 degree glider -> #C LWSS reflection. #C 46.3.0 "newgun" [RWG 1971] The first known p46 gun. #C 46.3.1 [RWG <=1992] p46 MWSS gun, based on a 135 degree glider -> #C MWSS reflection from a pair of p46 shuttles. (This glider + #C pre-block -> MWSS reaction is very useful; see 60.6.0 and #C 120.2.0.) #C 46.4.0 [DJB ????, DRH 12/31/90?] p46 HWSS gun. DJB found the only #C known 3-glider synthesis of a HWSS. #C 46.5.0 [DJB? ????] Pseudo p23 gun. The outputs of 2 p46 guns are #C interleaved to produce a p23 glider stream. (Also see #C 60.6.0.) #C 46.5.1 [PC,DRH 1994] p46 glider gun based on a 90 degree #C reflection that changes 1 glider to 2. Also see 230.1.0. #C 46.6.0 "p46 LWSS loop" [Peter Rott 11/93, PC 1994] Based on a #C 90 degree LWSS reflection. #C ---------------------------------------------------------------------- #C 47.0.0 [DJB#137 12/5/82] #C 47.0.1 [???? before 9/92 (horizontal stacking), RWG before 9/92 (skewed #C vertical stacking)] It's possible to build an arbitrarily #C large agar this way. #C ---------------------------------------------------------------------- #C 48.0.0 [RTW 1995] Sparks from 2 p12s move a pair of beehives. #C 48.0.1 "p48, type 2 toadflipper" [RWG 12/11/94] See discussion at #C 60.0.0. #C 48.0.2 "p48, type 2 toadsucker" [RWG 12/11/94] See discussion at #C 60.0.0. #C ---------------------------------------------------------------------- #C 50.0.0 "p50 traffic jam" [NDE 10/16/94] Period 50/2, symmetry #C type "n-e". #C 50.0.1 [DRH 3/19/92 (using early version of toaster)] 2-glider #C shuttle with period 50+40n. See comments for 42.0.0. #C ---------------------------------------------------------------------- #C 52.0.0 [DJB#119 10/1/77] Period 52/4, symmetry type "nrc". #C 52.0.1 [NDE 2/21/95] Period 52/4, symmetry type "nrk". See #C description at 16.1.1. One can also have two pulses #C traveling around the loop separated by 16, 20, or 24 gens, #C or three pulses separated by 16+16+20. #C #C ---------------------------------------------------------------------- #C 54.0.0 [DJB#62 <=1976] This is based on the twin bees shuttle #C (46.0.0). Also see centinal (100.0.0). #C 54.0.1 #C 54.1.0 [DJB before 5/91] 2 p54 shuttles change the phase of a PD. #C Also see 29.3.0 and 36.1.0. #C ---------------------------------------------------------------------- #C 55.0.0 [DJB#162 1/26/86] #C ---------------------------------------------------------------------- #C 56.0.0 [DJB before 5/91] #C 56.0.1 "nonstandard p56 toadsucker" [RWG 10/25/94] See discussion #C at 60.0.0. #C 56.0.2 "nonstandard p56 toadflipper" [RWG 1994] See discussion at #C 60.0.0. #C ---------------------------------------------------------------------- #C 58.0.0 "p58, type 3 toadsucker" [RWG,MDN 10/25/94 (using larger #C p29s), DRH 12/13/94] See discussion at 60.0.0. #C ---------------------------------------------------------------------- #C 60.0.0 "p60 glider shuttle" [???? <=1971] #C 60.0.1 [AF 7/18/94] 2 p30 shuttles push a blinker up and down. #C #C A "toad hassler" is an oscillator in which a toad is changed by a #C pair of domino sparks above and below it. It either moves 1 unit #C sideways ("toadsucker") or changes its orientation ("toadflipper"). #C Amazingly, there are 5 different positions for the sparks which #C work; I call them "type -1" through "type 4", depending on the #C horizontal distance between the top and bottom sparks. The odd types #C are toadsuckers; the even ones are toadflippers. Given a period N #C oscillator which produces accessible domino sparks once per period, #C the resulting toad hasslers have period 4N if N is odd, 2N if N is #C even. However, there are also some toad hasslers in which the period #C is smaller, either because the sparks occur more than once per period #C (see 58.0.0) or because the interaction with the spark is more #C complicated (see 8.5.1-2, 16.2.1, and 56.0.1-2). Oscillators 60.1.0 #C to 60.1.4 show the 5 standard toad hassler geometries; see 8.3.3, #C 36.1.0-1, 108.0.0-1 for more examples. Toad hassling was apparently #C first discovered by RTW in 6/84, using sparks from PDs and snackers to #C give p60 and p36 oscillators. #C 60.1.0 "p60, type -1 toadsucker" #C 60.1.1 "p60, type 0 toadflipper" #C 60.1.2 "p60, type 1 toadsucker" #C 60.1.3 "p60, type 2 toadflipper" #C 60.1.4 "p60, type 3 toadsucker" #C #C 60.2.0 "p60 glider gun" or "twogun" #C [V. Everett Boyer & Doug Petrie <=1973] #C 60.2.1 "p60 end-to-end glider gun" #C 60.3.0 #C 60.3.1 "overwrought p60" [NDE 2/18/95] 2 modified Eurekas (30.2.0) #C and a p4 2-bit sparker (4.12.0) push a traffic light back #C and forth. #C 60.4.0 "metamorphosis II" [RTW 12/13/94] Illustrates a glider to #C LWSS reflection from a pair of p30 shuttles [found by #C Paul Rendell before 1/20/86, rediscovered by PC 12/9/94], and #C a symmetric collision between 2 LWSSs which makes 2 gliders. #C 60.4.1 This demonstrates a reaction [???? 1971?] in which gliders #C hitting a snake alternately create and destroy a boat. This #C can be used as a memory device (called a "boat-bit"); see #C 15240.0.0. #C 60.5.0 "twirling T-tetsons II" [RTW 1989] Period 60/4, symmetry #C type "nrk". #C 60.5.1 "p60 LWSS gun" [DRH 1/28/91?] A MW emulator deletes half of #C the outputs of a p30 LWSS gun. (There are also oscillators #C which can do the same for MWSS or HWSS streams; see 4.11.1 #C and 4.12.0.) #C 60.6.0 "p60 MWSS gun" This glider + pre-block -> MWSS reaction is #C very useful; see 46.3.1 and 60.6.0. #C 60.7.0 "pseudo p20 glider gun" [DRH 12/19/91] 3 p60 glider streams #C are merged to form a p20 stream. This uses a head-on #C collision between a glider and a pair of gliders to insert #C gliders into an existing glider stream. Using this reaction, #C a pseudo period N gun can be built for any N>=19. More #C complicated methods are known for getting periods 14 to 18. #C (Also see 46.5.0.) #C ---------------------------------------------------------------------- #C 72.0.0 [RTW 7/90] #C ---------------------------------------------------------------------- #C 75.0.0 "glider shuttle III" [RTW 9/84] #C ---------------------------------------------------------------------- #C 80.0.0 [DRH 10/28/94] A p16 (16.2.0) and a MW volcano (5.2.1) #C interact almost trivially. #C ---------------------------------------------------------------------- #C 88.0.0 [DRH 1994] A variant of 44.0.0. #C ---------------------------------------------------------------------- #C 90.0.0 "p90 glider shuttle" #C 90.0.1 [DIB 11/30/93] A glider shuttles between 2 pairs of p30 #C shuttles. At each end it turns into a boat and then back #C into a glider. The spark that turns the glider into a boat #C is symmetric, so this reaction can also be used to shift a #C glider's path by 2 units without reversing its direction. #C Also see 184.0.0 and 276.0.0. #C 90.1.0 "p90 glider gun" [DRH ????] #C ---------------------------------------------------------------------- #C 92.0.0 [RWG 5/28/92] 2 p46 shuttles push a beehive back and forth. #C Also see 46.0.1. #C 92.1.0 [NDE 11/23/94] 2 p46 shuttles push a blinker back and forth. #C 92.2.0 [DRH, NDE 1/15/95] 2 p46 shuttles repeatedly reverse a loaf. #C 92.3.0 [RTW 3/91] 2 p46 shuttles repeatedly convert blocks to #C gliders. Also see 30.1.2. #C 92.4.0 "p92 glider gun" [DRH 1/7/91] Made from 2 overlapping p46 #C guns. #C ---------------------------------------------------------------------- #C 96.0.0 "p96 Hans Leo hassler" [NDE 1/28/95] A p12 sparker #C (12.0.2) changes a traffic light into a B-heptomino; an #C eater and a figure 8 change it back. Also see 132.0.0, #C 144.1.0, and 156.0.0. #C ---------------------------------------------------------------------- #C 100.0.0 [RWG before 9/87] "centinal" Related to 46.0.0 and 54.0.0. RWG #C created a huge (13584x12112) p1100 glider gun from this. #C 100.0.1 "p100 traffic jam" [NDE 10/15/94] #C ---------------------------------------------------------------------- #C 105.0.0 A p15 PD (15.0.0) and a p7 (7.0.4) interact almost trivially. #C ---------------------------------------------------------------------- #C 108.0.0 "p108, type 0 toadflipper" See discussion at 60.0.0. #C 108.0.1 "p108, type 1 toadsucker" [DJB before 5/92] See discussion at #C 60.0.0. #C ---------------------------------------------------------------------- #C 110.0.0 "p110 traffic jam" [RWG 10/17/94] #C ---------------------------------------------------------------------- #C 120.0.0 "p120 glider gun" [DRH 1/13/91] A blocker can convert a #C period 8n+4 glider gun to period 16n+8. #C 120.0.1 [MDN ????] #C 120.1.0 "p120 LWSS gun" [DRH 1/28/91] A blocker can convert a #C period 8n+4 LWSS gun to period 16n+8. #C 120.2.0 "p120 MWSS gun" [????] This glider + pre-block -> MWSS #C reaction is very useful; see 46.3.1 and 60.6.0. #C 120.3.0 "p120 HWSS gun" [DJB ????] #C ---------------------------------------------------------------------- #C This mechanism was known for years before a way was found to make it #C work. A "lumps of muck" predecessor is hassled on the left starting #C around gen 15, causing its left half to disappear. The right half #C is hassled at the top starting around gen 55, causing another LoM #C predecessor to form in gen 62. The process is repeated, rotated 180 #C degrees. #C 124.0.0 [clock+eater+block by DRH ????, 4.11.1 by RWG 11/30/94] #C Smallest known version. #C 124.0.1 [DRH ????] An arbitrarily large agar can be built. #C 124.1.0 [eater3 by DJB? ????, MW emulator by MDN? ????, #C eater+p4 by DRH ????, 4.11.0 by ???? ????] #C 124.1.1 [4.12.0 by RWG 11/30/94, eater+p4 by DRH ????] #C ---------------------------------------------------------------------- #C 128.0.0 [DJB before 11/91] 2 B-heptominoes move around a track of length #C 256 gens formed from p8 oscillators. Also see 808.0.0. #C ---------------------------------------------------------------------- #C 132.0.0 "p132 Hans Leo hassler" [NDE 1995] A p12 sparker (12.0.2) #C changes a traffic light into a B-heptomino; a unix changes #C it back. Also see 96.0.0, 144.1.0, and 156.0.0. #C 132.0.1 [DJB before 8/94] A variant of 44.0.0. #C ---------------------------------------------------------------------- #C 135.0.0 [RWG 1989] A 2-glider shuttle, combining a rephaser and the #C reflections from 75.0.0. Also see 150.0.0. #C ---------------------------------------------------------------------- #C 138.0.0 [RWG ????] Glider loop based on a 'flawed' 180 degree #C glider reflection. The first reflection leaves behind a #C pond, which the next deletes, so gliders must occur in #C pairs. (But see 552.0.0.) The length of the loop may be #C anything of the form 138+184n. #C ---------------------------------------------------------------------- #C 144.0.0 [AF 7/21/94, DIB 8/8/94] Found by AF on a cylinder of #C height 22 (without the outer blocks) and originally #C stabilized using figure 8s. The use of blocks (which #C temporarily become loaves) was found by DIB. #C 144.0.1 "p144 glider gun" [RWG 7/22/94] Uses a spark from 72.0.0 #C to turn a block produced by 144.0.0 into a glider. #C 144.1.0 "p144 Hans Leo hassler" [NDE 1/4/95] A p12 sparker (12.0.2) #C changes a traffic light into a B-heptomino; an eater changes #C it back. Also see 96.0.0, 132.0.0, and 156.0.0. #C ---------------------------------------------------------------------- #C Also see p150 glider gun in 2700.0.0. #C #C 150.0.0 [DRH 1989] A 2-glider shuttle, combining a rephaser and the #C reflections from 90.0.0. Also see 135.0.0. #C 150.0.1 [RTW <=1989] A p150 2-glider shuttle, extensible to period #C 150+120N. Also see 165.0.0. #C ---------------------------------------------------------------------- #C 156.0.0 "p156 Hans Leo hassler" [NDE 1/4/95] A p12 sparker (12.0.2) #C changes a traffic light into a B-heptomino; an eater changes #C it back. Also see 96.0.0, 132.0.0, and 144.1.0. #C ---------------------------------------------------------------------- #C 165.0.0 [RTW <=1989] A p165 2-glider shuttle, extensible to period #C 165+120N. Also see 150.0.1. #C ---------------------------------------------------------------------- #C 184.0.0 [DRH 1/24/92] Glider shuttle based on 180 degree reflection: a #C p46 spark turns the glider into a block; the next spark turns #C it back into a glider. The period can be anything of the #C form 184+92n. Also see 276.0.0 and 90.0.1. #C ---------------------------------------------------------------------- #C 188.0.0 "pseudo p94 gun" [DJB,RCS,PC 7/11/94] A pre-honey farm #C interacts with an eater and a block, emitting a glider, #C creating a traffic light, and forming another pre-honey farm #C 47 gens later; this reaction is called "AK47". The new #C pre-h.f. interacts with another eater and block to recreate #C the original configuration. Unfortunately, the 2 traffic #C lights must be suppressed in order to make the process repeat #C every 94 gens. This reaction was found independently by DJB #C and RCS and was known for years before PC found a period 4 #C oscillator which could suppress the traffic lights. (A true #C p94 gun was built by DRH in 6/90, using 36 AK47s.) #C 188.0.1 "p188 glider gun" [DRH 7/19/94] #C ---------------------------------------------------------------------- #C 200.0.0 "p200 traffic jam" [RWG 10/16/94] (ERROR: This isn't an #C oscillator; it becomes one in gen 60.) #C ---------------------------------------------------------------------- #C 230.0.0 [DRH 3/19/92 (using early version of toaster)] 4-glider #C shuttle with period 230+40n. See comments for 42.0.0. #C 230.0.1 "obnoxious p230" [RWG 5/28/92] Sparks from a p46 shuttle #C interact 3 times with sparks from a p5 MW volcano; one #C interaction makes a temporary blinker; another makes a #C temporary glider. #C 230.1.0 [PC 6/28/94] p230 glider gun based on 2 LWSS reflections from #C p46 oscillators. In one, the LWSS is turned 90 degrees; in #C the other it becomes 2 parallel gliders. Also see 46.5.1. #C ---------------------------------------------------------------------- #C 240.0.0 2-glider shuttle. Uses the same 180 degree reflection as #C 60.0.0, combined with 2 rephasers. #C ---------------------------------------------------------------------- #C 246.0.0 [DRH 11/89 (p270+24n), 4/92 (p246)] 2-glider shuttle with #C period 246+24n. See comments for 42.0.0. #C ---------------------------------------------------------------------- #C 276.0.0 [DRH 1/24/92] Glider shuttle based on the same reflection #C as in 184.0.0. Also see 90.0.1 #C 276.1.0 "4-barrelled p276 glider gun" [DJB before 11/92] #C ---------------------------------------------------------------------- #C 282.0.0 [RWG 9/13/92] 2-glider shuttle. See comments for 42.0.0. #C ---------------------------------------------------------------------- #C 300.0.0 [MDN 10/27/94] Sparks from a pentadecathlon (15.0.0) and a #C centinal (100.0.0) interact to form a temporary block. #C ---------------------------------------------------------------------- #C 329.0.0 A p47 (47.0.0) and a p7 (7.0.4) interact almost trivially. #C ---------------------------------------------------------------------- #C 360.0.0 "p360 2-barelled glider gun" [DJB before 10/92] #C ---------------------------------------------------------------------- #C 400.0.0 "p400 glider loop" [RWG 1987] A glider bounces between 4 #C centinals. By expanding the loop and using more than one #C glider, oscillators of period 100N can be built for any N. #C ---------------------------------------------------------------------- #C 460.0.0 [DJB 1992, DRH 1995] p460 glider gun based on a reaction #C found by DJB which converts 2 gliders to 3 gliders. One #C glider escapes; the others are reflected by p46 shuttles #C to repeat the reaction. Given a period P oscillator which #C can reflect a glider 90 degrees, we can build a gun whose #C period is any multiple of P that's >= 452. (DJB originally #C used this to build a p500 gun, using centinals (100.0.0) to #C reflect the gliders.) #C ---------------------------------------------------------------------- #C 552.0.0 [RWG ????, DRH 1/23/92] Glider loop based on the same #C reflection as in 138.0.0. Here the ponds are deleted by a #C p8 blocker. The period of the loop can be anything of the #C form 138+184n, but the period of the oscillator is 4 times #C that. #C ---------------------------------------------------------------------- #C 690.0.0 [DRH 1/3/91] Sparks from a p46 shuttle interact 6 times with #C sparks from a p15 pentadecathlon; one interaction makes a #C temporary blinker. #C ---------------------------------------------------------------------- #C 808.0.0 "p808 glider gun" [DJB before 11/91] A B-heptomino moves around #C a track made of various eaters and p8 oscillators; it makes #C 4 moves each of durations 64, 65, and 73. Also see 128.0.0. #C (In 1996, DJB found several B-heptomino moves using only #C stable objects to form a track, thereby producing guns of #C all periods >= 62.) #C ---------------------------------------------------------------------- #C 856.0.0 "p856 glider gun" [DJB before 11/91] #C ---------------------------------------------------------------------- #C 2700.0.0 "crystallization and decay oscillator" [DRH 3/27/90] #C Extensible to period 2700+1950N. A p150 gun shoots gliders #C toward a pair of PDs. The first is reflected 180 degrees #C and hits the second, forming a honey farm. Subsequent #C gliders grow a crystal back toward the gun; every 11 #C gliders add another pair of beehives to the crystal. #C Eventually, an eater stops the growth and the crystal #C begins to decay: two successive gliders delete one pair of #C beehives. (This is based on an earlier pattern found and #C lost by RWG, using a p46 gun.) #C ---------------------------------------------------------------------- #C 15240.0.0 "p120-based PRNG" [DRH 3/21/92] Pseudo random number #C generator, based on an earlier pattern by RWG (a larger #C version of 40894.0.0). Produces a sequence of bits b[n], #C represented by gliders, satisfying the recurrence #C b[n] = b[n-1] XOR b[n-7]. The sequence has period 127, #C so the period of the pattern is 120*127. Increasing the #C separation between the NW and SE parts by 15N units #C diagonally changes the 7 above to K=7+N (N >= -4). The #C period of the sequence depends rather erratically on K: #C #C K | 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #C P | 3 7 15 21 63 127 63 73 889 1533 3255 7905 11811 32767 #C #C K | 16 17 18 19 20 21 22 23 #C P | 255 273 253921 413385 761763 5461 4194303 2088705 #C #C K | 24 25 26 27 28 29 #C P | 2097151 10961685 298935 125829105 17895697 402653181 #C #C K | 30 31 32 33 #C P | 10845877 2097151 1023 1057 #C #C Also see 40894.0.0. (In 1996, DRH built a p30-based PRNG.) #C This uses a "boat-bit", a reaction in which gliders hitting #C a snake alternately create and destroy a boat. #C ---------------------------------------------------------------------- #C 40894.0.0 "p46-based PRNG" [RWG ????, DRH 1/10/95] Pseudo random #C LWSS generator. Produces a sequence of bits b[n], #C represented by LWSSs, satisfying the recurrence #C b[n] = b[n-1] EQV b[n-10]. The sequence has period 889, #C so the period of the pattern is 46*889. Moving the bottom #C right gun and the reflector at the right edge 46N units #C farther right changes the 10 above to K=10+4N (N>=0). #C The period of the sequence depends on K as indicated in #C the description of 15240.0.0. x = 3145, y = 396, rule = B3/S23 6b2o5b2o4bo14b2o14b2o5bo5b2o4b2o4b2o15b2o5b2o7b2o4b2o18b2obo128b2o4b2o 111b2o18bob2o42bo11b2o56b2o130bo137bo131bo72b2o3b2o46b2o3b2o128bo195b 2o10b2o27b2o4b2o4b2obo31bo68bo124bo4bo50b2obo6b2obo130bob2o6b2obo25bo 213b2o4b2o113b2o9b2o17b2o9b2o123b3o106b2o12b2o152bo7bo123b2o5b2o174b2o $7bo5b2o3bobo13bobo13bobo3bobo4bo4bo2bo3bo2bo13bobo4bobobo3bo2bo3bobo 17bob2o64bo64bo5bo93b2o3b2o10bo2bo17b2obo41bobo11bo11b2o22b2o18bo2bo 19bob2o32b2o22b2o47bobo136bo130bobo70bo2bobo2bo44bo2bobo2bo44b2obo6b2o bo69bobo192bobo10bobo27bo5bo4bob2o18bo10b5o41bo22b5o10bo109b3o4b3o15bo 4bo27bob2o6bob2o130b2obo6bob2o24bob2o211bobo2bobo114bo9bo19bo9bo225b2o 2b2o2bo14bo2b2o2b2o143bobo5bobo122b2o5b2o174b2o$6bo12bo15bo15b2o4bobo 4bo4b2o6b2o14bobo6b2o4bobo5bo21b2o7bo11bo25b2o13b3o34b3o10b3o13bo5bo 22bo23bobo9bobo32bo2bobo2bo10b2obo14b2o45bobo11bob2o8bo2bo19bobo15bo3b obo19b2obo32b2o22bo20bo9bo17bobo125b2o7bo3bo128bobo66b2o3b2o3b2o3b2o 36b2o3b2o3b2o3b2o40bob2o6bob2o52bo17bobo189b3o14b3o24bo5bo3b2o11b2o8b 2o9b2obo2bo23b2o15b2o13b2o5bo2bob2o9b2o8b2o97bo10bo12b3o4b3o23b2o8b2o 4b2o132b2o8b2o22bob2o213b4o115bo11bo17bo11bo122bo3bo97bo2bo2bobo14bobo 2bo2bo144bo7bo$6b2o50bo4b2o29bo14bo6b2o20bo8bo11bo14b2o9bo13bo13b2o8b 3o40b2o4b2o10bobo7bobo8b2o3b2o7bobob2o6bo2bo15bobo2bob3o6bob2ob2obo13b o2bo12bo14b2o14b2o12b2ob2o9b2obo10bobo16bo2bob2o12b7ob2o22b2o10bo44bo 18bobo7bobo13b2obob2o67b2o55b4obo4b3o8b2o118b2ob2o65bo15bo36bo15bo44b 2o2b2o4b2o50b2o16bo2bo3b2o179b2obo3bo12bo3bob2o20b2o4b2o2bo12b2o7b2o9b o7bo22b2o16b2o11bo2bo3bo7bo9b2o7b2o97b2o8b2o11bo10bo22bo9bo5bo8bo4bo 75b2o13b2o28bo8bo24b2o212bo2b2o2bo113b2o9b2o17b2o9b2o122bo3bo98b2ob3ob 2o12b2ob3ob2o336b2o5b2o$139bo6b2obo8b2obo12bo7b2obo14bo9b2o2bo21bo4bo 7bo18bob2o15bo18bobobo6b2o4bo10bo14bo2bobobobo6b2o7b2o7b4obobobo10bo 13bo4bo11bo2bo12bobo11bobo28bobobo3bo10bo8bo24bo9bobo18b4o18b3obob2o 14bobo7bobo13bob2o4bo65bobo54bobo2b3o2b3o4bob4o118bo2bo2bo60b2obo15bob 2o30b2obo15bob2o41bo3bo5bo46b2o4b2o15bobo4b2o27bo18bo130bo5bob2o12b2ob o5bo20bob2o5bo21b2o2b2o5b2obo2bo36b2o2b2o13b2o5bo2bob2o5b2o2b2o130b2o 8b2o23bo9bo5bo5b2ob4ob2o71bo2bo6bo6bo2bo25bo10bo237bo2b2o2bo116b2obob 2o23b2obob2o72bo156bobobobo14bobobobo337b2o5b2o115bo$6b2o130b2o9b2o6bo 3b2o9bobo6bo2bo12bo2bo8bo12bo4bo7bobo3bo5bo7bo12b2obo11bo2bo6b2o3bo7b 2ob2o10b3o9b3o2b3o8bo17bobobobo8bo5bobobo10b2o12bo4bo10bo4bo9b3ob3o7b 3ob2o11bobo14bo2bo3b3o8bob2o5bo23bo9bobobo16bo4bo16bo2bobobo2bo9b2obob 2o5b2obob2o14b3obo67bo69b3o2bobo119bob6o57bobob2o13b2obobo28bobob2o13b 2obo2bo40bo3bo5bo18bo22b2o2b2o4b3o13bobo33bobo16bobo129bo5bo18bo5bo20b 2obo4b2o33b5o64b5o117bo14bo43b2o8b2o4b2o7bo4bo64b2o6bo10bo10bo6b2o16b 2o8b2o12b2o12b2o211bo2bo113b3ob3o3b3ob3o13b3ob3o3b3ob3o67bo11bo41b3o 93bo4bo9bo10bo9bo4bo140bo5bo306bobo$7bo126b2obo8bo9bobo13b2o7bo15bo11b obobo7bobo3bo5b3o2bo2bo5b4o4bo16b2o8bobobo6bo5bo6bobobo6b2obo2bo6b3o2b 3o18bo8b2o7b2o5bobobo5bo13bob2o8bo4bo9bo6bo10bobo11bobo32bo5bo9bobo5bo bo21b2o8bobobo13bo2bo3bobo16b3obobob2o9bob2o2bo5bo2b2obo14bo21b2o4b2ob o8bo29bob2ob2o28bo25b2o131bo2bobobo5bo56bobo5b3o3b3o5bobo28bobo5b3o3b 3o5bob2o39b2o2b2o4b2o17bobo21b2o2b2o4b2o7bobo4bo34bo3b2o2b2o9bo3b2o 127bo5bob2o12b2obo5bo24b2o4b2obo31bo68bo119bo14bo7bo14bo22b2obo4bo5bo 22bo55b2o6bo10bo10bo6b2o14b2o6b2obo14b2o12b2o219b2o106bo2b2o2bobobo2b 2o2bo11bo2b2o2bobobo2b2o2bo65b3o10bo136bobo2bob3obob3obo8bob3obob3obo 2bobo138b3o3b3o304bo3bo$6bo5b2o6bo6b2o7b2o7b2o4b2o5bo6bobo6b2o58bob2o 8b2o8bo2bo9b2o12bo11b2o2bo8b2o3bo7bo2bo2bo11bo11bo3bo17bo8bo2bo10bobo 6b2o3b2o8bo2bo12bo10bobobobo2bo9bob2ob2obo6bobobob4o14b2obo9bo2bo10bo 6bo10bobo11bob3o12bobo16b5o12bo5b2obo18b2o7b2obo3bob2o9bobobobobobo2bo 10b3o4bobo16b2o7b2o19b3o2b2o15bo4bob2o8b3o7b2o18b2o4bo17b2o9bo25bo12b 2o118b4obo2b2o2b2o54b2o2bo5bobo3bobo5bo2b2o24b2o2bo5bobo3bobo5bo38b2ob o4bo5bo17bo3b2o28b2o9b2o39bo3b2obo2bo8bo3b2o123bo5b2obo3bo12bo3bob2o5b o21bo4bob2o220bo6b2o6bo7bo14bo22bob2o5bo5bo22b2o8bo4bo47bo21bo23bo6bob 2o249b3o105b2o4b3ob3o4b2o11b2o4b3ob3o4b2o77b3o136bo3bo3b2ob2o3bo8bo3b 2ob2o3bo3bo133b3o2b2ob2ob2ob2o2b3o298b5o16b2o$6b2o4bobo4bobo5bobo6bobo 5bo2bo3bobo3bobo5b2obo4bo2bo61b2o5b2o10b2o9bobo9bo2bo15bo10b3o7b2o3bo 11b2o8b2o2bobo18bo10b2o10b2o21b5o13bo2bo6b3obo2bobo10bo2bobo2bo7bo2bo 23b2o5bobo2bobo9bo4bo9b3ob3o7b3obo50bo8bo19bo7bobo4bob2o10bo2bobobobob obo9bo2bobobobo16bo2bo3bo2bo22bo17bo9b2o9bo6bo22b2o19b4obo3bo3bo7b2o 19b2o7bo123b2obobo56bo4b2o4b3o3b3o4b2o4bo22bo4b2o4b3o3b3o4b2o38bob2o5b o5bo5b2o9bo3b2o3b2o23bo10bo40bo3b2o2b2o9bo3b2o121b2obo8b3o14b3o8bob2o 18bo3b2o4b2o15b2o2b2o48b2o2b2o32b2o2b2o112b2o14bo6b2o6bo20b2o4b2o2b2o 4b2o21b2o7b2ob4ob2o46bo2bo13bo2bo23bo5b2o253b2obo65b2o9b2o195b3o98b3ob 3ob3o10b3ob3ob3o144b3o3b3o303b2o3b2o15bobo$13bobo4bobo7bobo6bo4bo2bo5b o4bobo7bo5bo2bo60bo6b3o20bo10bob2o10bo3b2o11bo11b3o12bo9bobobo20b2o44b o18bobo27b2o3b2o11bob2o21bo5b2o4b2o10bo2bo12bobo11bobo16bob2o15bo13b2o b7o19bo11b4o17bobo3bo2bo13bo4bo18b3o3b3o20b2obobobo13b2o8bo9b2o4bobo 19b3ob2o18bobo2b3o2b3o4bob4o17bo4bo123bob2obo2b2obob2o53b5o21b5o22b5o 27bo35b2o2b2o4b2o5b2o9bo3b2o3b2o66b2o8bobo16bobo4b2o89b2o25bo14bobo10b obo14bo17b2o2bo5bo6b2o7b2o16b2o22b2o16b2o7b2o9b2o16b2o7b2o125b2o27bo5b o3bo5bo33bo4bo50b2o13b2o25b2o4bo18bobo235bobo65bo9bo32bo2bobo2bo21bo2b obo2bo70b3o146b5o4bo5bo14bo5bo4b5o128b2o8bo5bo8b2o295b5o11b2o6bo11bobo $6b2o6b2o5bobo7b2o7bo4b2o5bo7bo7b2o5b2o62bo27b2o10bo12bob2o26bo14bo10b 2ob2o133bo2bo19bo25b2o12b2ob2o9b2ob3o32bobo13bobo3bo21b2o32bo4bo17b4o 48b2obobob3o22bo14b2o13b2ob2obo6bo2b2o23b3o2b3o2bobo146b2obob5ob2obo 57bo21bo30bo25b3o35bo3bo5bo18bobo72bobo9bo18bo5bobo34b2o36b2o13bo2bo 23bobo2bo11b2o10b2o11bo2bobo21bo5bo5b2o8b2o15b2o22b2o15b2o8b2o9b2o15b 2o8b2o89bo65bo5bo3bo5bo128b2o7bo16bo18b2o210b3o4bo2bo64bo11bo30bo3b3o 3bo19bo3b3o3bo70bo10b3o39bo3bo89bo4bo36bo4bo126bobo23bobo295b3o8b2obo 2bo2bo2bo10bo2bo4bo$7bo14bo16b2o11b2o6b2o76b2o38b2o12bo194b2o20b2o39bo bo11bobo18bobo14bo14bo2bo22b2o14b2o19b4o40bob2o3b2obo23b2o4bo10b2o8b2o 11b2o16bo3bobo2b4obo2bo17b2o33bobo2bobo188b4o27b4o18b4o27bo39bo3bo5bo 18bo73bo38bo35bo35bo2bo12bobobo22bo2bo40bo2bo20b2o4b2o16bo56bo37bo56bo 4bo37bobo3b3o12b3o27bo14b2o4b2o2b2o4b2o129bo6b2o11b2o2bo4bo10b2obo2bob 2o214b2o65b2o9b2o29bo2b7o2bo17bo2b7o2bo69bo11bo40bo3bo88bo2bo8bo3bo16b o3bo8bo2bo125bo27bo296bo9b2o2b2o6bo9b2o5b2o$6bo127b2obo53b2o79b2o131bo b2o41bobo11bob2o18b2o30b2o24bo14b2o43b2o18b2obo3bob2o25b4o12bo4b2obo 13b2o17b3o2bobo5b2o19bo12b2o18b4ob2ob4o77b2o45b5o2b3o29b2obo6b2obo9bo 2bo27bo2bo18bo2bo27b2o37b2o2b2o4b2o91b2o38b2o12b2obo6b2obo8bobo32bobob o13bo2bo23b2o42b2o17b2o4b2obo168b3o4b3o36bo4bobo12bobo5b3o12b3o3bobo 15b2obo6b2obo130bo9b2obo7b2obo2bob2o10b2o2bo4bo190b2o12bo5bo73b2obob2o 32b2o9b2o17b2o9b2o69bo11bo130bo2bob2o10bo20bo10b2obo2bo121b2o27b2o314b obo8b2o3bo8b2o$6b2o126bob2o134b2o131b2obo42bo11b2obo76bo38b2o20b2o54bo 14bo5bob2o13b2o19bobo2bo3bo2bobo31bo15bobo4bo2bo4bobo45b2o27bo45bo10bo 28bob2o6bob2o128b2obo6b2obo70b2o75bob2o6bob2o9b2o32bo2bo18bo29b3o26b3o 24b2o4bob2o167bo10bo40b3o12b3o5bobo12bobo4bo16bob2o6bob2o130b2o8bob2o 11b2o19bo193bo2bo11bo5bo68b3ob3o3b3ob3o139bo11bo41b3o85bobobo5bo36bo5b obobo264bo5bo52bo5bo135b2o11b2o10b2o$466bo76b2o37b2o77bo13b2o2b2o13b2o 25b2obo3bobo2b3o20b2o23b2ob2obo4bob2ob2o46bo25bobo45b2o3bobo2b2o32b2o 2b2o27b2o3b2o46b2o3b2o45bob2o6bob2o70bobo78b2o2b2o18b3o25bo19bobo30bob o26bobo201b2o8b2o63b3o12b3o212bobo188bo2bobo11bo5bo67bo2b2o2bobobo2b2o 2bo21bo51bo63b3o10bo130bo2bo4bobo34bobo4bo2bo128b2o13b2o119b3o3b3o50b 3o3b3o139bo8bo2bo$13b2o6b2o8b2o9bo8b2o3b2o7bo6b2o5bo386b2o192b2o17bo 13bobo4b2o17bo2bobob2o2bobo3bo14b2obo4bob2o21bobo6bobo49bobo23b2o42bo 7bo2bo36bo3bo13bo4b3o8bo3bo8b3o4bo16bo4b3o8bo3bo8b3o121bo78bo3bo19bobo 26bobo49b3o26b3o628b2o48b2o21bo86b2o4b3ob3o4b2o19bobo51bobo73b3o132b2o 2bo2bo34bo2bo2b2o131b2o13b2o118bo3bobo3bo49bob2ob2obo114bo22b2o10bobo$ 13bobo5bobo7bobo7bobo6bobo3bobo5bobo5bobo3bobo7bo586b2o3bo12bo6bo18b2o 2bo6bob2ob2o14bo10bo18b2obobo6bobob2o47b2o13bobo2bobo45bobo15b2o2b2ob 2o23bo3bo11bobo3bobo5bo9bo5bobo3bobo14bobo3bobo5bo9bo5bobo3b2o116b2o 78bo3bo18b3o309bo14bo386b2o4b2obo6b2obo8bo48bo18bob2o15b3o108bobo49bob o214b2o36b2o271bo9bo51b2ob2o118b2o20b2o$14bobo7bo9bo6bobo6bo6bobo4b2ob o6bo4bobo3bobobo282bo15bo287bo2b2o11b2o7b3o20b2ob3o22b2o6b2o19b2obo10b ob2o51bobo2bobo2bo2bo2bo2bo45bo6b2o8bobo2bobobo21b2o2b2o11bobo3b3o5b2o 7b2o5b3o3bobo14bobo3b3o5b2o7b2o5b3o3b2o195b2o2b2o61b3o6b3o257bo14bo38b 3o12b3o331bo4bob2o6bob2o8bobo21b2o21bobo19bo5bo88bo2bobo2bo25bo53bo62b 3o141b2o52b2o117bo3b2o27b2o112b3o3b3o52b2ob2o117b3o$15bobo7bobo7bo4b2o b2o3bobo8bo7bo5bo7bo3b2o2bo282bo15bo286bo5b2obo18bo21b2o22b3o2b6o2b3o 19bobob4obobo53bo2bo2bo2bo2bobo2bobo53b2ob2o7bobo4bo17b2obo6b2obo8bo 35bo16bo227b2obo6b2obo39b3o6b3o6bobo192b2o72bo6b2o6bo33bo4bobo12bobo5b 3o12b3o307bo3b2o4b2o2b2o4b2o7b2o8bo12b2o12b2o7b2o26bo8bo78bo3b3o3bo 142bo10b3o124b2o2bo2bo50bo2bo2b2o111bobo3bo27bo174b2ob2o117b2o$16bo9b 2o8bo11b2o9b2o6b2o3bo7bo8b2o261b2o17b3o13b3o47bo15bo48bo4bo9b2o156b2o 4bob2o38bo4b2o19bo2bo8bo2bo19bobo6bobo54bobo2bobo13b2o40b5o5bob2obo4b 2ob3o2b2o16bob2o6bob2o289bob2o6bob2o48bobo6b3o5bo3bo36b2o6b2o137bo44b 2o4b2o2bob2o21b2o39bobo3b3o12b3o5bobo12bobo4bo42b2o22b2o22b2o22b2o23b 2o161b2o2bo5bo3bo5bo17b2o26bobo21b2ob2o8bo8bo77bo2b7o2bo141bo11bo125bo bo2bobo24b2o24bobo2bobo20b2o90bo4bobo23bobo297bo$35b2o35b2o6b2o215bo 19b2o15b2o16b2o67bo14bobo13bobo13b2o12b2o5bo11bobo2bobo9bo204b2ob2obo 20b2o10b2o19b2obob4obob2o22b2o4b2obo17b2o23bobo38bo4bo8bo2bo2b2o5bobo 15b2o8b2o4b2o6bo35bo16bo38b2o191b2o2b2o4b2o36bo3bo5b3o14bo3bo35bo2bo4b o2bo81b2o53bobo43bo5bo2b2obo63bo27b3o12b3o3bobo39bo4bo18bo4bo18bo4bo 18bo4bo19bo4bo164bo5bo3bo5bo15b2o29bo21bo21bo77b2o9b2o18b2o61b2o70bo 127b2obob2o23b2o23b2obob2o18b2o2bo97b2o8bo5bo8b2o297bobo$283b2o12b3o 17b2o15b2o84bobo13bobo14bo14bo13bo2bo2bobo7bo2b2o4bobo8bobo206bo55bo2b 3o2b3o2bo23bo4bob2o16bobo25bo37bo2b2o8bobo6bobobobobobo13bo9bo5bo6bobo 3b3o5b2o7b2o5b3o3bobo14bobo3b3o5b2o7b2o5b3o7b2o5b2o184bo3bo5bo10b3o24b o3bo62bo2bo4bo2bo80bobo15b2o37b2o42bo5bo7b2o6bo26bo77bo39bo6bo16bo6bo 16bo6bo16bo6bo17bo6bo158b2o2b2o4b2o2b2o4b2o16b2o2b2o22b3o22b2o2bo3b3o 3b3o25b2ob2o83b2o61b2o126bo2b2o4b2o2bo57bo3b2o3bo44bo3b2o3bo16bo2bobo 89b5o12b3o3b3o163b2o142b2o$284bo15bo51b4o64b2o13b2ob2o25b2obo14b3o3bob o6b3o3bo3bo10b2o4b2o200bobo55bo2b4o2bo24bo3b2o4b2o14bo27b2o33bo2bobo 15b2o2bo2b2ob7o12bo9bo5bo5bobo3bobo5bo9bo5bobo3bobo14bobo3bobo5bo9bo5b obo14bo186bo3bo5bo9bobo51bo3bo26b3o6bo2bo4bo2bo6b3o71bo17b2o81b2o4b2o 7bo5bobo3b3o12b3o3bobo39b2o74bo8bo14bo8bo14bo8bo14bo8bo15bo8bo158bo2bo 5bo3bo5bo71b3o13b3o3b3o7bo12bo69bo203bo3b3o2b3o3bo25b2obo4b2obo6b2obo 8bob2o2b2o50b2o2b2obo11b2obob3ob2o87bo4bo6b3o2b2ob2ob2ob2o2b3o119b2ob 2o33bobo155bobo$284bobo12bo17b4o13b4o13bo4bo13b5o11b5o27b2o13bo7bo9b5o 9bo2b2obo18bo10b4o21bo201b2o54b2obo4bob2o23b2o2bo5bo14b2o61bobobobo3bo 4bo2bobobo2bobobo9bo10b2o8b2o4b2o6bo4b3o8bo3bo8b3o4bo16bo4b3o8bo3bo8b 3o12bobo185b2o2b2o4b2o9b3o24bo3bo21bob3obo25bobo7b2o6b2o7bobo59bo11b3o 100bob2o8bo7bo4bobo12bobo4bo33bo6b2o6bo14b2o51bo8bo14bo8bo14bo8bo14bo 8bo15bo8bo157bo4bo5bo3bo5bo70b3o8bo20bo7bo2b2o70bobo202bo2b2o4b2o2bo 26bob2o4bob2o6bob2o8bobo2bobo3bo42bo3bobo2bobo11bob2obobobo87bo2bo15b 3o3b3o126bobo35b2o155b2o$13b2o7bo7b2o9b2o8b2o3b2o4b2o7b2o3b2o6bo6b2o6b 2o4b2o7b2o169bobo11bo2bo13bobo2bob2o8bobo2bob2o8bobob2obob2o8bob3obo9b ob3obo25bo3b3o9b3o3b3o8bo2bo2bo9b2o4bo10b4o13bo4b2o15b4o93bo2bo161bo2b o4bo2bo28bo5bo28b2o40b2o5bo2bo6bobobo10b2obob4ob3o13b2obo6b2obo23b2o3b 2o46b2o3b2o22b2o182b2obo6b2obo17b2o18bob3obo20bo5bo25b3o24b3o42b2o15b 2o113b2obo8b2o11b3o12b3o38bo14bo7bo6b2o6bo44bo8bo14bo8bo14bo8bo14bo8bo 15bo8bo54bo102b2o2b2o4b2o2b2o4b2o69b2o2bo7bo8bo11bo8b3o70bobo35b3o13b 3o68bo4bo119b2o6b2o2b2o4b2o7b3o2b2o50b2o2b3o23bo82bo2bob2o16bo5bo123b 2ob2ob2ob2o55b3o110b2obob2o14bo$13bobo5bobo6bobo8bobo7bo4bo5bo7bobo3bo bo4bobo5bobo5bobo3bobo6bobo170b2ob2o10bo13bo2bobob2o8bo2bobob2o8bobo4b ob2o8bobobobo9bobobobo24bo2b2o3bobo22bob2ob2obo10bobo12bo3bo13b2o2bo2b o13bo96b4o25b2o7b2o126bo2bo2bo2bo24b2o2b2o4b2o24b2o2b2o37b2o2bo8b2o2bo bo3b2o11bob2o4b2o15bob2o6bob2o94b3o3b3o8b2o176bob2o6bob2o17bobo17bo5bo 19b2obobob2o17b2o40b2o35b2o16b2o73bo7b2o33b2o4b2o69bo14bo7bo14bo45bo6b o16bo6bo16bo6bo16bo6bo17bo6bo55bo106bo5bo3bo5bo17b2o2b2o22b3o21bo12bo 8bo20b3o72bo35bo2b2o9b2o2bo39b2o4bob2o6b2obo7b2ob4ob2o25bo4bo86bo7bo3b o5bo12b2o3bo18bobo2bobo18bo3b2o17b4obob3obo80bobobo5bo143bo2bo3bobo11b 2o43b3o$14bobo5bobo8bo10bo7bo4bo6bo5bo6bobo4bobo6bo7bo5bo8bo113b2o15b 2o41b2o8bobo10b2ob2o3bo8b2obo2bobo8b2obo4bobo10b2obobob2o7b2o5b2o24b2o 4bob2o6b9o7bobo3bobo10bo3bo2bo8bo2bob2o12bobobobo9bo3b3o122b2o7b2o127b 2o4b2o26bo4b2obo25b2o43bobo14bo15bobo4b2o41bo2bo27bo2bo18bo2bo28bobo3b obo8bo210bo16b2obobob2o17bo2b2ob2o2bo15bo2bo38bo2bo47b2o2b2o73b2o6bo2b o12b2o19bo5bo92bo14bo46bo4bo18bo4bo18bo4bo18bo4bo19bo4bo55b3o101b2o3bo 5bo3bo5bo15b2o29bo21b2ob2o17bo7b3o3b3o3bo2b2o41bo47b2o16b2o2bo9bo2b2o 16b2o22bo4b2obo6bob2o9bo4bo25b2ob4ob2o85bo7bo3bo5bo5b5obob2o21b2o2b2o 21b2obob5o10bo3b2ob2o3bo81bo2bo4bobo142bo7bo13bo156bo5bo6bo$15bobo5bob o8bo10bo5b2o3b2o5b2o6bo7bo6bo5bo7bo6bobo6bob2o50b2o11bo13b2o12bo7bo11b o15bobo34b2o14b2o2b2o7b2obo4bo8b2obo4bo8b2obob2obobo9bo2b2ob2o2bo6bo2b obo2bo26bobobo9bo7bo6b2obo3bob2o10b2ob4o9bobobo13bobob2o10b4o2bo35b2o 21b2o31b8o194bo5bob2o26bo43bob2o2b2o25b2o2b2obo42b4o27b4o18b4o28b3o3b 3o10bo208b2o14bo2b2ob2o2bo16b2o7b2o15bobo2bo11b2o8b2o11bo2bobo63b3o60b obo5bo2b2o11b2o18bo5bo73bo14bo68b2o22b2o22b2o22b2o23b2o162bo2b2o4b2o2b 2o4b2o16b2o26bobo68bo40b3o46bo18b3o9b3o18bo22bo3b2o8b2o4b2o40bo4bo86b 2o6b2o2b2o4b2o5bo2bo2bobo22bo4bo22bobo2bo2bo11b3ob3ob3o85b2o2bo2bo11bo 7bo122bo2bo18bobo40b2ob2o123b2o$16b2o6bobo8bobo8bo4bo4bo6bo5bobo6bo6bo 5bo5bobo8bobo6bobo46b2obobo10bobob2o7bo2bo12b3o3b3o9bo19bo35bo18bobo 10b4o13b4o13bo4bo10b2o7b2o7b2obob2o27bo3bo12b4o8bo2bobobo2bo12bo14b2ob obo12bobo15bo37bo2bo21bo2bo2bo4b2o18bo8bo22b4o3b4o160b2o2b2o4b2o19b2o 46b2o4bobo9bo4b2o14bobo48bo21bo30bo40b5o224b2o7b2o43bo14bobo8bobo14bo 64bo17b2o51bo2bo32b2o4b2o13b3o12b3o41bo14bo7bo14bo305bo5b2obo6b2obo9b 2o8bo12b2o12b2o7b2o47bo8b2ob2o43bo30b2o10b3o53b3o19b2o3bo8bo5bo30bo98b 2obo4b2obo4bo5bo11b2obo2bo44bo2bob2o18bo5bo92b2o11bobo5bobo122b2o20b2o 40bo3bo110b2ob2o7b2o$25bo10b2o9bo4bo5bo6bo3b2o7b2o4bo5bo6b2o10bo39bo 16b2obo12bob2obo7b2obob2o12bobo11bob4o8b2ob4ob2o30b3o21bo45b4o30bobobo 29b3o13bo2b2o9bo5bo14bobo16b2o14bo14bo39bobo19bo4b6o2bo18bob3o3b2obo 20bo4bobo4bo163bo5bo20b2o43b2o4b2obo12bo2bo2bo2b2o8bo2b2o43b5o21b5o22b 5o40bo283b2obo8b3o12b3o8bob2o65bobo15b2o34b2o17bo37b2o10bo4bobo12bobo 4bo36bo6b2o6bo7bo14bo44bo25bo21bo25bo24bo57b3o101b2o4bob2o6bob2o8bobo 21b2o21bobo46bo55b2o30b2o10bo57bo23bo10bo5bo30bo97bob2o4bob2o5bo5bo11b obobobo42bobobobo104bo4bo22bo7bo188b3o113bo$46b2o3b2o4b2o5b2o18b2o4b2o 57b3o3bob3o9bo10b2o14bobo2bo9b4ob4o8bo4bo8b2obo4bobo29bo23b2o11b2o15b 2o46bo2bobo2bo29bobo26b5o16b2o32b2o13b2o35b3obob2o16bob4o6bobo18bobo6b obo19bobo2b2ob2o2bobo158b2o3bo5bo34b2o26b3ob4obobo4b2o4b3o2bobo4bo2bo 5b2o46bo4b2o4b3o3b3o4b2o4bo22bo10b3o3b3o28b4o279bo5b2obo3bo10bo3bob2o 5bo51b2o2b2o11b2o36b2o12bo2bo55bo9bobo3b3o12b3o3bobo42b2o14bo6b2o6bo 43bo2bo22bo2bo18bo2bo22bo2bo21bo2bo17bob2o6bob2o25bo130bo48bo46bo3bobo 171b2o2b2o8b2o4b2o28b3o63b2o30b2o12b2o2b2o4b2o9bo3bobobo12bo7b2o7bo12b obobo3bo18bo3bo77b3o4b3o211b2o5bo$148bobo3bobo12bo2bo8bobob2o9bo4bob2o 6bo2bobo2bo7b2obo14bobo2bobo66b2o15b2o16b2o28b2obobob2o30b2o28bo103bo 4bobobo15bobo2bo2bob3obob2o12b2obobo8bob2o13bo2bobo9bobo2bo156bo2b2o4b 2o5b2o27bo26bo7bobobo2bob3o9bo5bobobo53b2o2bo5bobo3bobo5bo2b2o25bo8bob o3bobo28bo2bo283bo5bob2o10b2obo5bo42b2o16b2o48b2o11b2o2bo16bo33b2o2bo 11bo26bo66b2o50bo2bo22bo2bo18bo2bo22bo2bo21bo2bo17b2obo6b2obo25bo129b 2o48b2o52bo171bo4bob2o4bo5bo20b2o12b2o57bobobo29bo13bo3bo5bo10b5obob2o 12b2o5b2o5b2o12b2obob5o20bo78bo10bo210b2o$145b3obo3b3o14b2obo7bobo2bo 10b3obob2o8b2ob2o10bobob4o9bobo4bob2o98b2o31bobo167bo2b3o3bo12b2obobob obo2bo2bobob2o13bobo10bobo13bobobobo2b2ob2o2bobobobo154bo5b2obo8bo25bo bo27b6o2b2obobo6bo10b2obo2bo56bobo5b3o3b3o5bobo26b2o8b3o3b3o78bo236bo 5bo16bo5bo42b2o15b2o63bo2bo14bo2bo32b2o2b2o68bo89bo25bo21bo25bo24bo22b 2o2b2o29bo229bo2bo57b3o111bo5b2obo5bo5bo19b2o12b2o55bobobo32bo13bo3bo 5bo15b2o3bo9b2o14b2o9bo3b2o105b2o8b2o53bo4bo305bo$155bo17bo8bo2bo14bo 13bobo9bobobo4bo10b2ob4ob2o131bobo164b2obo5b3o13bo2b4o3bobob2obo16bobo 10bobo14bo2bobo9bobo2bo38b2obo21bob2o88b2o4bob2o8bobo23b2o30bobob4o7b 2o3bo8bo2bo59bobob2o13b2obobo32b2o22b2o3b2o59bobo33bobo199bo5bob2o10b 2obo5bo59bo65bo16bo2b2o11b2o47b2o42bobo3b3o12b3o27bo162bo3bo29bo213bo 14bobobo55b2o2bo111b2o8b2o2b2o4b2o28b3o60b2o33b2o12b2o2b2o4b2o11b3o2b 2o42b2o2b3o20bobo3bobo135b3o4b3o301b3o$23bo16b2o43b2o6b2o6bo71b2o8b2o 14bo12bobobobo7b2o3b3o14bo139bo166bo2b2obobo17bo4b4obobo2bo15b2obo8bob ob2o16bobo2b2ob2o2bobo45bo3bo11bo3bo111b2o13bobo2bobo36bobo6b2o2b4o7bo 4bo61b2obo15bob2o32bobo12b3o8bo3bo8b3o4bo32b2o9bo3b2o3b2o26bo3bo199b2o bo3bo10bo3bob2o144bo2bo12b2o40bo6b2o6bo36bo4bobo12bobo5b3o12b3o3bobo 37b2o23b2o23b2o23b2o24b2o20bo3bo29b3o212bo14bo2bo45b2o9bo2b2o16b2o104b o2bo5bo31bo97b2obo4b2obo6b2obo12bobo2bobo3bo34bo3bobo2bobo21bo3bo8bobo 2b2o57bo14bo48bo10bo136b2o132b2o15bobo9bo$14b2o6bobo8bo7bo7b2o20bo6b2o 5b2o5bo2bo4bobo96b2o11b2o3b2o14b2o13bobo304bo4b2o20b4o4b2obobo19bobo6b obo20bo4bobo4bo42bo7b2o9b2o7bo111bobo2bobo2bo2bo2bo2bo34b2o2b3obo10bo 5b5o65bo15bo35bo14bobo5bo9bo5bobo3bobo31b2o9bo3b2o3b2o30bo203b3o12b3o 81bo49bo17b2o55bo14bo41b3o12b3o5bobo12bobo4bo36bo4bo19bo4bo19bo4bo19bo 4bo20bo4bo18b2o2b2o242bobo14b2o19b2o4b2obo4b2o4b2o5b2o9b3o18bo16bo57bo 19b2o8bo4bo5bo29bo98bob2o4bob2o6bob2o12bob2o2b2o42b2o2b2obo17bo11bo3bo 3bob3o4b2o50bo14bo48b2o8b2o136b2o132b2o16b2o9b2o$13bo2bo6bobo6bobo6bob o5bo2bo9bo7bobo4bo2bo11bobobo4b2o146b2o305b3o3bo21bo2b2o5bo20bob2o3b3o bo21b4o3b4o44b2ob2o2bo11bo2b2ob2o111bo2bo2bo2bo2bobo2bobo36bo4bobo6bo 79b2o3b2o3b2o3b2o34b2o5b2o7b3o5b2o7b2o5b3o3bobo42bo3b2o21b2o8bo4bo204b obo8bobo84b2o46bo2bo72bo14bo64b3o12b3o40bo6bo17bo6bo17bo6bo17bo6bo18bo 6bo15b2o6bob2o231b2o44bo4bob2o5bo5bo38b3o13b3o53b3o20bo8b2o2b2o4b2o40b o4bo117bo3b2o3bo36bo3b2o3bo17bo3bo5bo3bo3bo6b2o3b2o50bo6b2o6bo153b2o 193bo$14b2obo6bobo4bobobo6bobo5b2obo7bobo5bo2bo5bobo4b4o4bobo7b2o315bo 2bo73b2o59b2ob2o23b2ob5o22bo8bo81bo2b2ob2o3b2ob2o2bo116bobo2bobo13b2o 32bobobo2bobo5bob2o7bo71bo2bobo2bo45b2o38bo44bobo23b2o12bo206b2o8b2o 84b2o33b2o11b2o2bo5bobo201bo8bo15bo8bo15bo8bo15bo8bo16bo8bo15bo6b2obo 24b3o203bo2bo42bo9b2o2bo5bo41bo16bo18b3o9b3o18bo22bo5bob2o6b2obo9bo4bo 25b2ob4ob2o116b2obob2o40b2obob2o19bo11bo5b5obo63b2o53bo14bo91b2o$17bo 8bo5bo2bo8bo8bo4bobo2bo4bo3b2o3b2ob2o3bo2bo5bo8bobo332bo14b2o6b2o19b2o 13b2o92bo25b8o23b2o7b2o47b2o7bobo7b2o111b2o23bobo32b2ob2o2b2o7bo7bobo 71b2o3b2o132bo34bo3bo3b2o35bo2bob2obo2bo11bo2bob2obo2bo262b2o12bo2bo6b 2o66b2o8b2o123bo8bo15bo8bo15bo8bo15bo8bo16bo8bo14bo11b2o23bo204bobobo 41b2o8bo3b2o4b2o10bo45b2o16b2o2bo9bo2b2o16b2o21b2o4b2obo6bob2o7b2ob4ob 2o25bo4bo116bobo2bobo42bobo2bobo21bo3bo12b3o119bo14bo$17b2o7b2o7b2o7b 2o7b2o3b2o3b2o3b2o34bo314bo4bo11bo3bo11bobo6bobo10b2o5bobo35b2o127b2o 7b2o48bo3bo9bo3bo111bobo25bo57bo165bo51bo28bobo4bo2bo34b4ob2ob4o11b4ob 2ob4o277b2o7bo67bo10bo43b3o12b3o62bo8bo15bo8bo15bo8bo15bo8bo16bo8bo14b 2o11bo8b4o11bo205bob3o51bo4bob2o12bobo61bo2b2o9b2o2bo68bo4bo149b2o2bo 2bo42bo2bo2b2o19bobo3bobo32b2obo6b2obo6b2obo8bo5bo14bo5bo40bo6b2o6bo 17b2o4b2o4b2obo6b2obo141bo$287b2o69b2o12bo44b3ob2ob3o25bo10bo10bobo4bo 36bo2bo97b4o89bob2ob2obo116bo27b2o41b2o2bo2bo2b2o133b2o3b3o5b2o7b2o5b 3o3bobo50bo35bobo6bobo26bo2bob2obo2bo3b2ob2o3bo2bob2obo2bo232b2o121b3o 4b3o39bo4bobo12bobo5b3o12b3o40bo6bo17bo6bo17bo6bo17bo6bo18bo6bo13b2o 12bo8b6o218b3o40b2o8b2o4b2obo11bobo62b3o13b3o146bo2b2o4b2o2bo68b2o44b 2o43b3o19bob2o6bob2o6bob2o7bobo3b3o12b3o3bobo46b2o25bo5bo4bob2o6bob2o 130b2o8b2o15b2o$286bobo49b2o18bo12bobo42bo3bo2bo3bo7bo5bo7b2obo10bob2o 9bo3b2obo13b3o2b2o13bo2bo98bo2bo213b2o70bo2b4obo2bo133b2o3bobo5bo9bo5b obo3bobo50bo36bo7bo3bo39b2ob2o247bobo122bo4bo40bobo3b3o12b3o5bobo12bob o4bo36bo4bo19bo4bo19bo4bo19bo4bo20bo4bo15bo12b2o6b8o261bo4b2obo10b2o 11bo226bo3b3o2b3o3bo75b2o13b2o13b2o48b5obo22b2o2b2o4b2o8b2o6bo3b2ob2o 10b2ob2o3bo73bo5bo3b2o8b2o4b2o128b2o7b2o16b2o$283bo2bo33b2o15bobo19bo 12bo14bo29b4o2b4o6b3ob3ob3o5b2obobo2b2o2bobob2o7bob2o5b3o7b2obo6bo12bo b2ob3o385b3o3b4o139b3o8bo3bo8b3o4bo40bo59bo5b2o286bo56b2o111bo27b3o12b 3o3bobo37b2o23b2o23b2o23b2o24b2o16bo9bob2o7b2o6b2o222bo2bo33bo5bob2o 11bo21b3o215bo2b2o4b2o2bo71b2o2bo2bo12b2o12bo2bo2b2o27b2o13bo6b2o21bo 3bo5bo9bo12b3o12b3o39bo5bo14bo5bo11b2o4b2o2bo9bo5bo139b2o2b2o96b2o$13b 2o11b2o6b2o8b2o5b2o7b2o38b2o180bobobo17bo14bo2bo14bo20b2o25b5o42bo3b2o b2o3bo7bobobo2bobobo8b3o5bobo3bo4bo2bobo4bobob2o6bo2bo4bo2bobo165bobo 53bo164bo154b2o3b2o54bobo54bo4bo4b2o286b2o55bobo160bo157b2o8b2obo8b8o 221bo2b2o2bo31b2o2b2o14bo17b2ob7ob2o22b2o61b2o70bo134bo2bo4bobo26bobo 4bo2bo24b2o12bo3bob3o23bo3bo5bo9bo12bo14bo39bobo3b3o12b3o3bobo12bob2o 5bo9bo5bo240bo$13bobo9bo2bo4bo2bo6bo2bo3bo2bo6bobo6b2ob2o3b2o5b2o4bo3b o5b2o8bo3bo168bo2bo15b5o2b2o7bobo2bo2b2o6b2obo17b2o3b2o8b5o7bobo5bobo 24b2obo2bob2o5bob3obob4o8bobobo2bobobo7bo3bobo5b3o5b2obobo4bobo2bo5bob obo3b2obob2o165bo2bo17b3ob3o27b2o159bob2o2b4obob2o204b2o3bo57bo352bo 123b2o216b6o222bo2b2o2bo35bo15b2o16bo3bobobo3bo22b2o61b2o58bo11bo133bo bobo5bo28bo5bobobo38bobo2b2o23b2o2b2o4b2o8b2o68bo3b2ob2o10b2ob2o3bo13b 2obo4b2o8b2o4b2o241b3o$14b2o9bobo5bob2o6bob2o3bo2bo7b2o7bobo4bo7bo3bob obobo13bobobobo170bob2o2b2o5bobo5bo2bo6bo2bo3bo2bo6b2obo2bo2b2o9bo2b3o 2bo6bo5bo6b2obobobob2o24bo8bo6bo15b2obobo2b2o2bobob2o5b3o5b2obo10bo6bo b2o8bo2bo4bobo171bo52bo159b2obob2o2bob2obo133b2o27bo2bo33b2o3b2o3bo9b 2o42bo3bo352b2o115bo6b2o6bo14b2o194b4o225b4o33b2o3bo33b4o3b4o146bo10b 3o133bo2bob2o10bo12bo10b2obo2bo65b2obo6b2obo6b2obo14bo14bo45b3o12b3o 22b2o4b2obo4bo5bo23b2o219bo$16b2o5b2obo5b2obo4b2obo7b2ob2o7b2o5bobo5b 3ob3o4bobobobo4b4o5bobobobo171bo2bo2bo5b2obo2b3obo7b2o2b6o10bobobo2bo 9bo5b2o6bobo3bobo8bo3bo28b3o2b3o9bobobob2obo4b2obo10bob2o7bob2o3bo12b 2o2b3o15bob4obo168bo21bo3bo25b2obo18b3o17bob2ob2obo116bo4bo140bo27b4o 33b2o3b2o3bo9b2o42bobo471bo14bo7bo6b2o6bo414bobo2bobo32bo2b2o35bo5bo 147b3o148bo2bo8bo3bo3b2o3bo3bo8bo2bo68bob2o6bob2o6bob2o13b3o12b3o45bo 14bo24bo4bob2o5bo5bo5b2o15bobo113b2o2b2o$16bobo3bo2bo6bo2bo4bo2bo9bo2b o6bobo3b2ob2o6bobo7b2ob2o4bo4bo3b2obobob2o171b5o9bobo2bob2o26bo2b4o11b o3bo9bo5bo9bobobo30bo2bo10b2ob3obob2o7bo10bo12bo4bobo33bo4bo170bobobo 16bo3bo24bo4bo18b2o17b2obobob2o113b2o2b3obob4o132b3o25bo46bobo528bo14b o7bo14bo210bo2bo4bo2bo192b2o4b2o31bo5b2obo10b2o19bo5bo30bo53bo214bo4bo 13b2o13bo4bo67b2o8b2o4b2o2b2o12bo3b2ob2o10b2ob2o3bo79bo3b2o4b2o2b2o4b 2o5b2o17bo112b2o16b2o24b2obo4bob2o6b2obo6b2obo$17b2o3bobo8b2o6b2o10bo 2bo7bo16bo17b2o2b2o7bo189bo2b2o16b2o11b2o12b2obobo3bo10b5o11bobo27b4ob 2ob4o7bobo2bo11bobo6bobo10bobo5b2o34b3o174b4o14b3ob3o27bo18b2o140bo5bo bobo2bo132bo27b5o43bo552bo14bo126b2o77bo2b3o2b6o2b3o229b2o4bob2o10b2o 13b2o3b2o5b2o3b2o24bobo49bobo74b3o138b5o4bo5bo6bo5bo4b5o68bo9bo5bo3bo 12bobo3b3o12b3o3bobo39bo14bo23b2o2bo5bo3bo5bo23b3o113b2o15b2o24bob2o4b 2obo6bob2o6bob2o$23bo30b2o234bo10b2o20b2o15b2o8bob2obob2o28bo28bo2bo4b o2bo7bo2b2o13b2o6b2o11b2o23b2o19b2o221b2o22bo18b3o3b3o114b6obo144b2o4b 3o3b3o4b2o4bo418b2o5b2o148b2o8b2o90bo58bo2bo78bo3bo2bo4bo2bo266bo2b5ob ob5o2bo23bobo51bobo61b3o10bo146b3ob3ob8ob3ob3o76bo9bo5bo3bo12bo5bo14bo 5bo39b3o12b3o27bo5bo3bo5bo139bo45b2o6b2o2b2o4b2o2b2o4b2o$289bobo48b2o 12bobo15bo61b2o63b2o246b2o14b2o21bo2bobo2bo116bo2bo2bo143bo5bobo3bobo 5bo2b2o419b2o5b2o148bo10bo11b2o8b2o66bobo56bo15bobo62b3o282b3o4b3o4b3o 26bo51bo64bo11bo77b3o61bo3bo3b2ob2o8b2ob2o3bo3bo70b2o8b2o4b2o2b2o74bo 3b2ob2o10b2ob2o3bo21b2o4b2o2b2o4b2o185bo8bo2bo5bo3bo5bo$247bobo40bo63b obo14bobo46bo2bo269b4o17bo3bo25bo19bob2o20b2ob2o120b2ob2o140b2obo5b3o 3b3o5bobo579b3o4b3o12bo10bo56b2o7bob2o44bo11bo10b3o2bo3bo505bo11bo140b obo2bob3obob4o2b4obob3obo2bobo71b2obo6b2obo6b2obo21b2o46bobo3b3o12b3o 3bobo16b2o4b2obo6b2obo188bo6bo4bo5bo3bo5bo$149bob2o14bo16bo16b2o44b2ob o104bo16bo321bobobo14bobobobo23bo4bo17bo147bobo141bo2bob2o13b2obobo 581bo4bo15b3o4b3o56bobo6b2ob2o10b2o30bobo11bo19bo347b2o9b2o33b2o9b2o 17b2o9b2o69bo11bo76bo3bo60bo4bo9bo2bo9bo4bo72bob2o6bob2o6bob2o14bo6b2o 6bo40bo5bo14bo5bo17b2o4bob2o6bob2o24b3o160b2o6b2o2b2o4b2o2b2o4b2o$149b 2obo13bobo14bobo15b2o27b2obo16b3o446bo13bobobobo24bob2o18bo11b2o3b2o 11b2o3b2o111bobo143b2obo15bob2o284b2o7b2o310bo4bo57bo6b3obob2o10b2o20b 2o6b2o15bo2bo2b2o7bo4bo4b2o185bo154bo11bo33bo2b7o2bo17bo2b7o2bo69bo10b 3o75bo3bo67bobobobo6bobobobo117bo14bo112b2o17bo7b2o147b2obo6b2o4bo5bo 3bo5bo$24b2o9bo27b2o25b2o4bo69bobo14bobo31bo12bob2o13b2o4bo442bo6bo3bo 3b2o2bobo2b2o3bo3bo5bo3bo3bo34b2o2bo2bob2o3b2obo2bo2b2o112bo147bo15bo 287bo2b2ob2o2bo16b2o7b2o337b2o7bo2bo2bo2bo2bobo31bo3bo4b2o17b2o2bo2bob o7bo5b2o154b2o4b2obo6bob2o10bobo154bo9bo35bo3b3o3bo19bo3b3o3bo69b3o 158b2ob3ob2o4b2ob3ob2o116bo14bo53b2o57b2o15bobo7b2o147bob2o7bo5bo5bo3b o5bo$13b2o3b2o3bo2bo6b3o10b2o4b2o3b2o3bo2bo6b2o9bo7bo2b3o52b3o2b2o9b2o b2o12b2ob2o12b4o13bobo8b2obo12b2obo2b2o2bo442bo2bo3bob3o2bo4bobo4bo2b 3obo5bob3o3b2o37bobo2b2o3b2o2bobo264b2o3b2o3b2o3b2o288b2obobob2o17bo2b 2ob2o2bo39b2o14b3o8b2o269b2o7bo6b2o4bo31bo5bo3b2o22b3o5bo3bo162bo4bob 2o6b2obo10bobo6bo2bo4bo2bo135b2o9b2o35bo2bobo2bo21bo2bobo2bo161b3o68bo bo2bo2bo2bo2bo2bobo179bo6b2o6bo67b2o155b2o10bo5b2o4b2o2b2o4b2o$13bobob obo4b2o6bo3b2o4b2o2bobo3bobobobo3b4o5bo2bo6b5o5bobo54bo3bo2bo6bobo5bob o6bobo5bobo6bobo4bo11bobobo8bobob4o8bobo4bob2o168bo95b2o4b2o170bobo3bo 3bo3b4o3b4o3bo3bo5bo3bo3bo14b2o3b2o18bo13bo269bo2bobo2bo210b2o16b2o14b 2o16b2o29bobobobo19b2obobob2o40b2o12bo3bo8b2o279bobo31b2o8bo3bob2o4bob o27bobo163bo3b2o4b2o2b2o11b2obob2o3b3o2b6o2b3o302b3o147bo2b2o2b2o2b2o 2b2o2bo119b2o8b2o48bo14bo224bo11b2o4bo5bo3bo5bo$15bobo14bobobobo3bo5bo 5bobo13bob2obo4bo5bo5bobo51b3o3bobo7b2obobobob2o6b2obobobob2o6b2obo3bo 11bobobo7bo7bo7bo3bo3bo3bo129b2o36b3o18b2o23b2obo21b2o23bobo2bobo231b 2o2bo2bob2o299b2o3b2o212bo7b2o7bo16bo7b2o7bo30bo5bo20bobobobo54bo4bo 290b2o31b2o8bo5bo7bo193b2o2bo5bo4bo11bob2o4bo3bo2bo4bo2bo178b2o4b3ob3o 4b2o11b2o4b3ob3o4b2o65b3o10bo147b2o18b2o118bo10bo43bo4bo14bo225bo8b2o 7bo5bo3bo5bo$13bobobobo4b4o5b2obobo4b5o5b2ob2o4b4o4bo4bo5b5o7bobo49bo 6bob2o9bo3bo12bo3bo12bo3bob2o6b2o4b2o6b4obobo9b2obo4bobo33b2o9b2ob2ob 2o32bo27b2o17bo39bo18bo5b2o17b2obo21b3o3b2o18bo2bo18b2obo24bo2bo122bob o3bo3bo3b4o3b4o3bo3bo5bo3bo3bo18bobo2b2o14bo13bo489bobo3bo4bo3bobo16bo bo3bo4bo3bobo31bo3bo21bo5bo54bo3bo335bo3bo207bo5bo2bo16b3obo193bo2b2o 2bobobo2b2o2bo11bo2b2o2bobobo2b2o2bo66bo11bo77b3o208b3o4b3o42bobo244b 2o9bo6b2o4b2o2b2o4b2o$13b2o3b2o3bo4bo8bo7bo16bo2bo3b2o4b2o6bo6b3o2bo 50b3ob2o13bobobo12bo3bo12bo4bobo7bobobo13bob2o9bo2b2o2bob2o30b3obo8bo 3bobo11b2o16b2obobo12bo13bobobo13bo35b3o2bo2b2o13bo3bo2bo16bo4bo19bo4b o2bo18bo4bo17bob2o28bo78b3o39bo2bo3bob3o2bo4bobo4bo2b3obo5bob3o3b2o18b o18bobo2b2o3b2o2bobo489b2o2bo6bo2b2o18b2o2bo6bo2b2o33b3o23bo3bo363bobo 30b2o23bo180b2o2b2o4b2o2b2o15bo198b3ob3o3b3ob3o13b3ob3o3b3ob3o67bo302b o4bo45b2o6b2o8b2o77b2o14b3o8b2o122b2obo4bo9b2obo6b2obo$23b2o2b2o61bo4b 2o51bobo15bobo14b3o14b4o10bobobo10b2obo12bo4b2o33bo2bo2bo8b2obobo12bo 15bobobo2bo10bobo14b3o12bob3o31bobobobobobo12bob4o3bo14bob4ob2o16bob4o bobo18bo4bo15b2o4b2o7b2o18b2o18b2o30b2o66bo6bo3bo3b2o2bobo2b2o3bo3bo5b o3bo3bo34b2o2bo2bob2o3b2obo2bo2b2o35b2o451bo8bo24bo8bo63b3o56bo3bo304b 2o41bo12bo182bo2bo5bo5bob2o12b3o2b2o196b2obob2o23b2obob2o161bo3bo268bo 10bo77b2o12bo3bo8b2o21bobo98bob2o4b2o8bob2o6bob2o$148bobo16bo47bobo11b ob2o13b3o34bo4bob2o14b2o8bobob2o11bo2bob3o9b3obo13bo15bo4bo30bo3bobobo 11bo2bo5b3obo13bo4bobobo12bo2bo6bo2b2o16bo4bo15bo5bo6bo2bo12bob2o6bo 29b2obob2o10bo71bo13bobobobo24bob2o12bo17b2o3b2o11b2o3b2o33bo2bo451bo 8bo24bo8bo37bo84bo4bo303bo43b2o10b3o67b2o13b2o95bo4bo5bo4b2obo15bo196b 2o9b2o17b2o9b2o158bo3bo269b3o4b3o91bo4bo32b2o$149bo33b2obo13b2o14bo31b ob2o30bo2bobobo10b2o2bobo8b3obobo2bo8b3o13bo4b3o10bo4bo8b2obobo2bo27b 2obobobobob2o9bobobo2b2o5bo2bo9b2obo3b2obo11bobobo2bobo2bobobo8b2o7b2o 18bo5bo21bo2bo3bo17bo3bo13bo14bo3bo15b2obo7bob2o31bobobo14bobobobo23bo 4bo11bo530bo8bo24bo8bo27b2o7b3o25bo44b2o12bo3bo346b2o80bo17bo94b2o2b2o 4b2o8b2o10b2obobobo192bo11bo17bo11bo403bo7bo6bo15bo4bo93bo3bo33bo$183b ob2o13b2o47bobo30bo6bo14bobo8b2o4bobobo8bo2bob2o8bobobo3bo8b3obo2bo7b 2obobob2ob2o25bobobo3bo13bo2bo5b2o2bobobo9bo4bobo2b2o10b2o2bo6bo2bo9bo 2b3o22b2o4b2o5bo2bo11bo3bob3o16bo4bo10bo5bo11bo3b2o14bo13bo30b4o17bo3b o25bo14b2obo25b2ob2o495b2o2bo6bo2b2o18b2o2bo6bo2b2o23bobo34b3o7b2o34b 2o14b3o298bo132bo11bo101bo5bo10bo10b2obobob3o191bo9bo19bo9bo160b3o240b obo5bobo6bo4b2o$88b2o15bo177bob2obob2o9bobo2b2o7bo2bo2bo2bo9b2obo2bo 12bob2o9bo5b2o11bo4bobo23bobobobobobo16bob3o5bo2bo10bob4ob3o2bo11bobob 4obo13b2o8bo18b2obo8bo2bo9bo11bo12bobobo13b5o14bobo16b2o9b2o85b2o13b2o 22bo2bobo2bo41b2obo12bo176bo2bobo2bo108bo7bo65bo14bo51bobo3bo4bo3bobo 16bobo3bo4bo3bobo22bobob2o41bobo73bobo274b2o129b2o2b2o5b2o2b2o95b2o3bo 5bo8bo15b2o4bo189b2o9b2o17b2o9b2o403bo7bo5b3o3bo2bo2b2o102bo3bo$65b2o 22bo14bobo179bobo2bo9b2o2bo12bob2o15bobo10bo4bo9bo2bo17b4o26b2o2bo2b3o 18bo3b4obo14bo4bo4b2o11bo2bo4bo19bo3bobo17bob2o9bobo12b3obo3bo12bobobo 32b2o3bo11b3o2b9o2b3o78b2o14bo26b3o3b3o43bobo2b2o6bob4o172b4ob4o107bob o5bobo63bobo3b3o6bobo50bo7b2o7bo16bo7b2o7bo23bobobo4bo33b2obobo74b2o 142b2o9b2o2b2o9b2o15b2o9b2o2b2o9b2o49bobo8bobo242bo2b2o4b2o8b2o16b4o 656bobo4bo2bo99bo4bo$41b2o6b2o13bo2bo2b2o17bob2o11bob3o179bobo8bo3bobo 10bobo19bo12b3obo10bo53bo24bo2bo3bo17b2o2bo15b2o3b3o21bo2bobo16b2o4b2o 8bo13bo3bo2bo11bo4bo34bo3bo11bo2bo11bo2bo30b4o14b3ob3o27bo11b2o78bo4bo 5bobob3o170b2o9b2o106bo7bo14bo7bo42bo4bobo7bo50b2o16b2o14b2o16b2o24bo 35bo4bobobo75bo18b2obo3bob2o115bo9bo4bo9bo17bo9bo4bo9bo50bo3bo143bo5bo 100bo5b2obo6bob2o18bo161b2ob2o494bo5bobobo85b2o12bo3bo$16bo2bo6b2o8b2o 3bobo3bo2bo3b2obo6bobo4bo2bo13b2o2bo10b2o4bo179bo9b2ob2ob2o10b2o34b2o 31b2o33b3o20b2o5bo17b2ob2o23b2o15b2o5bobo17bo5bo20bo6b2obo11bo3bo15b3o b3o18bo11b2o13b2o29bobobo16bo3bo24bo4bo9b2o26b2obobob2o45bo8bobo144b2o 3b2o20b2obobob7obobob2o124bobo5bobo46b3o68bo31bo33bo2bo6b2o6b3o24bo96b o2bo3bo2bo114bo11bo2bo11bo15bo11bo2bo11bo39b2o12bo10b2o238b2o4bob2o6b 2obo19bo159bobobo475bo5bo16b2obo2bo86b2o14b3o$16b4o6bo2bo4bo2bo5bo3b3o 4b2ob3o5bo5bobobo9bo4b2o10bo3b3o7bo269b2o35bo27b2o60bo2b3o3bo19bo5bo7b 2o13b2o60b2o57bo21bo3bo25b2obo10b3o25bob2ob2obo45bo2bo6bo144bo2bobo2bo 19b2obo2b2o2bo2b2o2bob2o125bo7bo117bo2bo28bo2bo34bo6b3o5bobo6b3o6b2o6b o2bo95b3o3b3o115b2o9b2o2b2o9b2o15b2o9b2o2b2o9b2o39b2o8bo4bo7bo2bo50bob o74b3o9b3o134b2o158bo4bo474b3o3b3o15bo2bo142b2o$14b2o4b2o6b2o4b2o6b2ob 2o13bo7b2obo2bo10b5o12b5o8bobobob2o390b2o26b2o4b2o7b2o15bo18b2o60b3o 38bo52bo101b2o139b2o3b2o3b2o3b2o10b2o6b2o11b2o6b2o15b2o3b2o137bo2bo4bo 2bo16bo2bo4bo2bo47bo2bo28bo2bo30bo3bo3bo2b2o6b3o6bobo5b3o6bo83b2o141b 2ob2o10b2ob2o23b2ob2o10b2ob2o57bo7bo55b2o65bo31bo285bob2o2b2o466b3o2b 2ob2ob2ob2o2b3o6bo4bo143b2o$13bobob2obobo6bob2obo9bo2bo6b2ob3o8bo2bo 11b2o4bo10b2o12bob2ob2obo420b2obo27bo2bo114bo2bo17b3ob3o27b2o95b2o4b2o 139bo15bo10bo4b3o15b3o4bo14bo2bobo2bo51bo7bo14b3o3b3o51b3o2b6o2b3o12b 3o2b6o2b3o47bo31bo31bo3bo23b3o6b2o2bo3bo3bo79bobo134b3obo7bob4obo7bob 3o11b3obo7bob4obo7bob3o47bo3bo7bo55bo65bo2bo8bobo5bobo8bo2bo282bobob2o 4bo471b3o3b3o12b5o347b2o6b2o$13bobob2obobo6bob2obo9bo2bo7bobo7bo4bo13b o2b2o10bobo2b3o7bo200bo227bob2o145bobo53bo95b2o4b2o136b2obo15bob2o9bob o2bo15bo2bobo12b2o3b2o3b2o3b2o46bobo5bobo13bobo3bobo53bo2bo4bo2bo5b3o 8bo2bo4bo2bo38b2o16b2o15b2o16b2o24bo5bo34bo3bo81bo133bo2b2o4bo4b2o2b2o 4bo4b2o2bo9bo2b2o4bo4b2o2b2o4bo4b2o2bo46bobo9bo100b2obo6b2obo7bo2bo3bo 4bobo5bobo4bo3bo2bo281bobobo2b2ob2o462b2o8bo5bo8b2o143b2obo10b3o187bo 6bo2bo4bo2bo$14b2o4b2o6b2o4b2o9b2ob2o5bobo7b5o14bobo10b3obobo2bo6b2o 199b2o72b2o597bobob2o13b2obo2bo6b2ob2o19b2ob2o11bo15bo47bo7bo14b3o3b3o 70bobo59bo7b2o7bo17bo7b2o7bo22bo2bo34bo5bo85b2o104b2o10b2o14b2o4b7o8b 7o4b2o9b2o4b7o8b7o4b2o59bo2bo5b2o6b2o81bob2o6bob2o9bo4bo6bo5bo6bo4bo4b o2b2o274bobobo2b2o464bobo23bobo4bo137bob2o10bo190b2o4bo2bo4bo2bo$16b4o 6bo2bo4bo2bo4b3o3bo7bo22bo2bobobo9bo4bobo181b2o5b2o15bo4b2o2bo65b2obob o454b2o141bobo5b3o3b3o5bob2o8bo2bo4b3o3b3o4bo2bo10b2obo15bob2o146b3o 59bobo3bo4bo3bobo17bobo3bo4bo3bobo24bo41bo2bo135bo2bo48bo2bo8bo2bo19bo bobobo8bobobobo21bobobobo8bobobobo67b2o5bobo5bobo40b2o36b2o4b2o2b2o4b 2o12bob2o13b2obo8bobo2bo275bobob2o3b2o316bo144bo27bo3bobo151bo188b2o5b o2bo4bo2bo$16bo2bo6b2o8b2o3bo2bo3bobo16bo11b4ob2o11b2ob2ob2o180bo7bo 15b2o2bo2b3o13b2o2b2o28b2o17bobo37b2o26b2o257bob2ob2obo123b2o139b2o2bo 5bobo3bobo5bo11bob2o4bobo3bobo4b2obo8bo2bob2o13b2obobo208b2o2bo6bo2b2o 19b2o2bo6bo2b2o23bobobo4b3o33bo66b3o5b3o38b4o22bo47b3o2b6o2b3o21bobo 12bobo25bobo12bobo78bo7bo40bobo35bo5bo3bo5bo9bo27bo4bobobo278bobo2b2ob o43b2o270b2o143b2o27b2o3bo349b2o6b2o$41b2o6b2o15bobo14bo14bobo181b2obo 7bob2o9bo2b2o2bo17bobo2bobo18b3obobo21bobo3b2o33bo24bo2bo252bo3bo9bo3b o258bo4b2o4b3o3b3o4b2o10b2obo5b3o3b3o5bob2o7b2obo5b3o3b3o5bobo89b3o3b 3o113bo8bo25bo8bo25bobob2o5bo25b3o4bobobo63b2ob2o3b2ob2o36bo3bo18bo3bo 50b2o6b2o20b3o5b3o4b3o5b3o17b3o5b3o4b3o5b3o74b2o6b2o41bo36bo5bo3bo5bo 8bobo3b3o11b3o3bobo3b2obob2o277bo2bo2bo44bo2bo3b2o263b3obo9b2o$67bo13b obo14bobo181b2obob5obob2o9b3o2bob4o14bo6bo14b2obo6bobo2bob2o12b2o3bo2b o32bo25b3o24b2o18bo22b2ob2o180b2o7bobo7b2o257b5o31bo2bo19bo2bo10bo5bob o3bobo5bo2b2o41b3o3b3o37bobo3bobo113bo8bo25bo8bo25bobo35bo5b2obobo62b 2obobobobob2o19b2o19bo19b4o49bo10bo18bobobo3bobobo2bobobo3bobobo15bobo bo3bobobo2bobobo3bobobo124b2o34b2o4b2o2b2o4b2o38bo3b2o3bo105bo15bo2bo 15bo58bo15bo58b2o3bob2o44b2obo3bo2b2ob2o230bo25b2o13b2o137b2o13b2o$81b 2o16bo186bo2bo2bo18bo5bo10b2ob2o5bob2o9bo2bobo3bo4b4obo2bo10bo2b5o33b 2o50bobo17bobo22bobobo180bo2b2ob2o3b2ob2o2bo262bo24b2o3bobo2b2o17b2o2b obo8b2o4b3o3b3o4b2o4bo40bobo3bobo37b3o3b3o30bo2bo4bo2bo5b3o8bo2bo4bo2b o43bo8bo25bo8bo26b2o7b3o34bobo63bo3bobo3bo20b2o15bo2bo32b2o39b2obo4bob 2o18b2o2b5o2b2o2b2o2b5o2b2o15b2o2b5o2b2o2b2o2b5o2b2o162b2obo4bo5bo42b 2o2b2obo104b3o11b3o2b3o11b3o39bo15bo2b3o11b3o57bo2b3o2bob2obo41bob2o3b 2obobo75bo155b2o25b2o151b2o13b2o$246b2o39b5o14b3o2bob4o11bo2bo2bobobo 2bo9b2obobo13bob2o11b2o40bo21b7o15b2o4bo13b2o4bobo22bo2b2o176b2ob2o2bo 11bo2b2ob2o252b4o27bobobobo27bobo28b5o40b3o3b3o74b3o2b6o2b3o3bobo6b3o 2b6o2b3o38b2o2bo6bo2b2o19b2o2bo6bo2b2o31bo3bo23b3o7b2o64bo2bo3bo2bo73b obo43b2o256bob2o5bo5bo37bo3bobo2bobo107bo9bo8bo9bo42b3o11b3o5bo9bo61b 2o7bob2o40bo4bo3bobobobo2bo70bo5bo136b2o9bob3o25bo$247bo7bo50bo2b2o2bo 15bobobo2bobobo13bo15bo15bob4o31b4obo19bo7bo15bo2b2obo13bo2b2obob2o17b ob2o90bo36bo51bo7b2o9b2o7bo251bo2bo29bobo31bo2b2o24bo129bo2bo4bo2bo5b 3o8bo2bo4bo2bo39bobo3bo4bo3bobo17bobo3bo4bo3bobo29bo5bo21bo3bo73b3o3b 3o76bo52bo246b2o4b2o2b2o4b2o41b2o2b3o107b2o9b2o6b2o9b2o44bo9bo7b2o9b2o 61bob2obobo43bob3o4bo2b2ob5ob2o67bo5b3o134b2o13b2o169b2o27b2o$247bobo 3b3o33bo19b2o2bo2b3o11b2obo2bob2o14b2o13b2o15bobo2bo30bo5bo18bob2o3b2o bo14bobobobo13bobobobobo2bo14bo4b4o85bobo35b3o53bo3bo11bo3bo287b2ob2o 29b2obobo27b4o106bo95bo7b2o7bo17bo7b2o7bo29bobobobo20bo5bo157b2o37bo 12b2o21b3o10b3o27b3o10b3o166bo5bo3bo5bo39bo3b2o186b2o9b2o80bobo3bo44bo bo2bobo3bobobo3b4o59b2o6b2o7bo147b2o25bo145bo27bo$242b2o4b2o2bo35bobo 18bo4b2o2bo15b2o51bo33bob2o4b2o12b2o2bobo5bobo11b2obo2bo2bob2o7b2obo2b obo2bob2o14bo4bo2bo32bo16bob2o33bo18b2o19bo48b2obo21bob2o265b2o3b2o27b 2o3b2o14bo29bo2bo84bo11b3o6bobo93b2o16b2o15b2o16b2o27b2obobob2o19bobob obo138b3o8b2o45b2o34bobo2b2o2b2o2bobo27bobo2b2o2b2o2bobo167bo5bo3bo5bo 8bobo3b3o11b3o3bobo3b2obob5o272b2obo43bob2obo3b2ob2o3bo4bo3b2o58bobo9b o4b2o147bo25b2o145bobo23bobo348bo$201b2o11bo2bo25bo7bobo35bo24b2o105bo bo7bo11bobobo9bob2o8b2obo4b2ob2o7b2obo7bobo14b2o39bobo15b2obo56b2o14b 2o9b2o316bo4b3o8bo3bo8b3o7b3o8bo3bo8b3o4b2o115bobo10bobo7bo175bo2b2ob 2o2bo17b2obobob2o121b2o12bo3bo8b2o51b3o2b3o2bobo17b3o10b3o27b3o10b3o 132b2o6b2o24b2o4b2o2b2o4b2o8bo27bo4bobo2bo2bo274bob4o39b2obo2bobobo6bo 2bobo63bobob2o2bo4bo177b2o13b2o132b2o8bo5bo8b2o161b3o185bo$2b2obo68b2o 6b3o23bo11bo79bobo11bo2bo25bobo5bobo61bo100bob2obo8bobob2o9bobo9bobo 12bo5bo13bo7bobo14b2o4bo35bo34b2ob2o12b5o15b2obo2bo25bo316bobo3bobo5bo 9bo5bobo7bobo5bo9bo5bobo17b2o3b2o98bo11b3o41b3o139b2o7b2o16bo2b2ob2o2b o111bo7b2o12bo4bo51bobo2b3o2b3o4bob4o24b2o41b2o139bo2bo2bo2bo26b2obo6b 2obo14bob2o13b2obo8bo2bo279bo3b2o3b2o38bobob2obobobo5bob4o60bobobo7bo 152bo25b3obo9b2o141b3o3b3o147b2o8b3o8b2obob2o182bobo$2bob2o45b2o9b2o 11bo18b3o9bobo11bobo28bo48bo10b4o2b4o17b2o4b2o6bo163b2obobo8bob2obo8b 2obo9bobobo7b2obobobobob2o7b2obobobobobob2o15b4o53b3o14bobobo12bo5bo 15bob3o24bobo316bobo3b3o5b2o7b2o5b3o7b3o5b2o7b2o5b3o7b3o8bo3bo8b3o4bo 139bobo166b2o7b2o100b2o8b2o9bo11bo3bo52b4obo3bo3bo7b2o21bo6bo35bo6bo 59bobo110bob2o6bob2o9bo4bo6bo5bo6bo4bo4b2o82b2o4b2obo6b2obo179bo7bo40b obo3bobob5obo3b2o3b2o57bo5b3o154b2o25b2o148b3o2b2ob2ob2ob2o2b3o141b2o 8bo3bo5bo5b2o183bo$6b2o24b2o6bo11bo8bobo8bobo6b2o2bo6bo17bo7bo31bobo 44b2ob2o37bo7b3o170bo7bobo16bobo5bobo2b2o7b2obobobobob2o7b2obobobobobo 13b3o2b2o36b5o10b2obobobo13bobobo11bobobo2bo16bo20b3o4b2o318bo72bobo5b o9bo5bobo3bobo36bo7bo14b3o3b3o53bo2bo4bo2bo5b3o8bo2bo4bo2bo227b2o5b2o 21b2o7b2o56b2o4b2o4b2obo7b2o9bo137bo4bo2bo130bo2bo3bo4bobo5bobo4bo3bo 2bo87bo4bob2o6bob2o11b3o3b3o10b3o3b3o66b3o3b3o49bo16bo4bobo42bob2obobo 5bobo7bo57bo2bo25bo120b2o13b2o25bo154b3o3b3o157bo4bo5b2obob2o183bo$6bo 6b3o6b3o8bo7b2o6bobo40bo3bo7b2o13b5o25bobobo14b2o16bo11bobo14b2o22bobo 5b3o171b2o4b2obo16bob2o3b2obo14bobo3bo13bobo3bobo16bo36bobo5bobo7b2obo 3bo10b2obo3bob2o8bobo2bob2o10bo4b4o16bo3bo396b3o5b2o7b2o5b3o3bobo35bob o5bobo13bobo3bobo51b3o2b6o2b3o12b3o2b6o2b3o225b2o5b2o31b2o2b2o17bo3bo 30bo5bo4bob2o18bo47b2o41b2o46b2o5b2o8bo63bob2o2b2obo47bo2bo8bobo5bobo 8bo2bo86bo3b2o4b2o2b2o4b2o9bo2bobo2bo10bo2bobo2bo47b3o3b3o10bo2bobo2bo 48bobo20b2o10b2o31b2obobobo2b2obo2bo4bobo28b2o4bob2o6b2obo9bo28bo120b 2o9bob3o182bo5bo159bo3bo7b3o185bo$7bo13b3o6bo8b2o7bo10bobo8bobo9bo2b2o 5bobo15b2o6bo30bo3bo13bo2bo11b2obobo10bobob2o30b2o4b2o9b2o170bo5bo18bo 7bo15bo2b2obo13bo2b2obob2o12bo2bo36b2obo3bob2o10bo3bob2o7b2obo3bob2o7b 2obo2bobo9bob2o3bo2bo15bo5bo322bo103bo37bo7bo14b3o3b3o26b3o24bo2bo4bo 2bo16bo2bo4bo2bo290bo4bo28bo5bo3b2o4b2o41bo8bo4bo7bo2bo17bo8bo4bo7bo2b o40b2o8bo3b2o5bobo57b2o2bobo6bobo2b2o43bo31bo87b2o2bo5bo3bo5bo9bo9bo3b 2o3bo9bo46bo2bobo2bo9bo9bo48bo33bobo36bo3bob2o7b2o6bo23bo4b2obo6bob2o 9bo3bo2b2o20bo133b2o549bo$6b2o22b2o9bo6b2o8bo10bo24bo2b2o6bo14bobo24b 2o2bo2b2o11bobo2bo10bobo2bo8b2obo13b4o17bo7b3o5bobo38b3o18bo109bob4o 20b7o15b2o4bo13b2o4bobo15bobo39bo3bo13bo3bob2o10bo3bo11bo2bobobo9bo3b 3ob2o17bo3bo122bo199bobo3b3o5b2o7b2o5b3o7b3o5b2o7b2o5b3o129bo4bobo7bo 347bo3bo8b2o18b2o4b2o2bo5bo16b2o35b2o8bo2bo29b2o8bo2bo41b2o10b2o6bob2o 50bo6bo4bo8bo4bo6bo45b3o9b3o101bo5bo3bo5bo24bo58bo9bo98b2obobo59bobo 20bo3b2o8b2o13bo3bo2b3o18b2o133bo51bo5b2o291bo3bo36b2o156bobo$2b2obo 52b2o9b2o12b3o10bo10bobo10bo25bo4bo4bo9b2obob2o9bo2bob2o11bobo9b3o2b3o 15bobo5b3o7bo35b2ob2o18bobob2o32bo17bo16bobo36bo52bobo17bobo12b2o43bo 3bo14b3o14bobobo11bo5bo12b2obobo14b2o4b3o90bo10bo9b2o9bobo198bobo3bobo 5bo9bo5bobo7bobo5bo9bo5bobo38bo89bobo3b3o6bobo32b3o313b3o8b2o20bob2o5b o5bo14bo2bo21b3obo17bo7bo12b3obo17bo8bo45bo2bo6b2ob2o10b2o37bobo9bo10b o9bobo155b2o2b2o4b2o2b2o4b2o7bo11bobo4bo11bo62bo11bo45b5o28bobobo59bob o21b2o3bo8bo14bo5b5o15bo187b3o4b2o124bo7bo157bo4bo36bobo156bo$2bob2o 101bo37bobob2ob2obobo8bo15b2o13b2o13bo6bo10b2o4b2o9b2o4b2o34b2ob2o17bo 2bobo12b2o17b3o16bobo13b3ob3o35b2o24b3o24b2o18bo12bobo44b3o33b2ob2o11b 5o14bobobo13bobo96bobo8bobo8b2o10bo200bo4b3o8bo3bo8b3o7b3o8bo3bo8b3o7b 3o5b2o7b2o5b3o3bobo89bo14bo28bo4bobo7bo279b2o2b2o53b2obo4b2o4b2o15b2o 21bob2o11bo7bobo17bob2o11bo7bobo52bobo8bob2o10b2o38bo7bo2bo10bo2bo7bo 49bo5bo101bo2bo5bo5b2obo9bo4bobo4bo2b2o2bo4bobo4bo43bo11bo2b2o2bo4bobo 4bo44bo4bo30bo63bo25bo10bo13bo2bo3b3o6b3o6bo4bo182b2ob2o128bobo5bobo 146b2o8bo3bo12b2o25bo156bo$2o144bo4bo4bo10b3ob4o10bob2o8bo2bobo9b3o2b 3o11bo7b3o5bobo40bo20bob2obo2bo9bo17bob2o16bobo12bo7bo35bo23bo2bo57b2o 62bob2o48bobob2o14bo99bo10bo165b2o4bo4b2o59b2o3b2o27b2o3b2o17bobo5bo9b o5bobo3bobo59bo7bo64bobo3b3o6bobo268b2o7b2o62b2o4b2obo40b2obo10bo2bo6b o4b3obo9b2obo10bo2bo6bo5b3obo55bobo240bo4bo5bo4bob2o14bobo16bobo48bo4b obo4bo4bo6bobo48bo2bo32b2o85b2o2b2o8b2o14bo5b2o7bobo6bo9b2o310bo7bo 147b2o8b3o14b2o25b2o$o146b2o2bo2b2o15bo2bo7b2obo2bo9bobo13b4o13bobo5b 3o7bo58b2obo3bob3o10bo16b2o17b2ob2o10bobob5obo33bo24b2o106b2obo13b2obo 33bo14b2o17b2o9b2o33bobobo69bo29b3ob3o120bo2bobo3bobo2bo76b2ob2o29b2o 4b3o8bo3bo8b3o4bo59bobo5bobo64bo14bo269b2o8b2o62bo4bob2o17b2o19bob3o4b o6bo2bo10bob2o9bob3o5bo5bo2bo11bob2o48bo9bo52bo5bo18bo5bo45b2o2b2o5b2o 2b2o95b2o2b2o4b2o2b2o4b2o8bo3bobo3bo8bo3bobo3bo49bobo6bo5bo3bobo3bo41b o2bob2o31b3o86bo4bob2o6b2obo8bobobo12b3o8b3o5bobo174bobobobo$bo147bo3b o12bob2o12b2obobo9b2obob2o28b2o9b2o4b2o31b2o22bo2bob4obo10b4o13b2obo2b 3o12bo5bo9bobo3bo3bo33b2o131bob2o49bobo43bo34bobobo11b3ob3o10b3ob3o33b obo2bobo4bobo2b2o5bo3b2o4bo123b3o9b3o44bo2bo29bobo31bo14b2o3b2o75bo7bo 361bo61bo3b2o4b2o14bo2bo26bobo7bo11b2obo18bobo6bo12b2obo38b2o7bo62b3o 3b3o16b3o3b3o46bo11bo101bo5bo3bo5bo9b2o2bobo2b2o8b2o2bobo2b2o45bo3bobo 3bo3b2o3b2o2bobo2b2o40bobobo5bo28b3o27b2ob2o35b2o16bo5b2obo6bob2o7bobo b2o28b2obobo$2o115bo31bobobo12b2ob2o15bo11bobo14b2o18b3o5bobo36b2ob2o 3bo15b2obo5bob3o7bo16bo2bo2bobo11bobobobobo7b2ob2o4bob2o219bo45b3o31bo 3bo4bo3b2o4bo16bo4b2o3bo5b2o2bobo4bobo2b2o3bo2bobo2bo2bo2bobo2bo4b2ob 3ob2o3b2o81b2o4bo4b2o29b2o5b2o47b4o27bobobobo27bobob2o525b2o2bo5bo16b 2o21bo7bo17bob3o12bo8bo17bob3o38b3o7b3o59bobobobobobo14bobobobobobo42b o17bo94b2o3bo5bo3bo5bo8b5ob5o8b5ob5o45b2o2bobo2b2o8b5ob5o41bo2bo4bobo 27b3o27b2obo36b2o16b2o8b2o2b2o4b2o5bobo5b3o23bobobo176b2ob2o$2b2obo47b o16b2ob2o7bo9bob2o8bo10b3o32bobo43bobob2o33b3o7bo37bo2bo2b2ob4ob2o10bo 5bobo2bo8b4o13b2obob2ob3o7bobo3bobo10bo5bo270bo32bobo5b2ob3ob2o3b2o10b 2o3b2ob3ob2o4bo2bobo2bo2bo2bobo2bo3b2o2bobo4bobo2b2o5bo3b2o4bo40b2o9b 2o30bo2bobo3bobo2bo22b2o3bo2b5o2bo52bo24b2o3b2o27b2o2bo29bo2bo498bo5bo 42bo2bo8b2o30bo2bo8b2o50bob2o15b2o51b3ob2ob2ob3o4b3o5b3ob2ob2ob3o42b2o 13b2o96bo2b2o4b2o2b2o4b2o9bo2bobo2bo10bo2bobo2bo46b5ob5o9bo2bobo2bo45b 2o2bo2bo28b2o23b2o6bo64bo2bo5bo7b2o9bo23bo130b2o40b2o4b2ob2o$2bob2o22b 3o7bo12b3o16bo3bo6bobo8b2obo6b3o9bo36bo44b2o2bo10b4o2b4o11bo6b2o4b2o 36b2ob4ob2o2bo2bo10b2o4bo3bo13bob2o10bo2bo3b2o7b2obo3bob2o6b2obo4b2ob 2o299bo3bo4bo3b2o4bo16bo4b2o3bo5b2o2bobo4bobo2bobo33b3ob3o36bo2bo7bo2b o29b3o9b3o21bobo3b2o7b2o3bo2b2o40b5o62bobo27b4o497b2o4b2o16bo24bo2bo7b o4bo8bo18bo2bo7bo4bo8bo38bobo13b3o2bo52bobobobobobo5bobo6bobobobobobo 155bo5b2obo6b2obo12b2o3b2o12b2o3b2o48bo2bobo2bo11b2o3b2o51b2o8b3o19bo 20b2o2b7obo52b2o8bo4bo5bo12bo4bo16bo5bo2bo128b2o39bobo6bo$13b2ob3o5b2o 12bobo9bo7b2o4b2o5b3o6bo2bo17bo12bo2b3o80bobo11bo2bo13bobo5bobo49bo3b 2ob2o15b4o13b2obo2bo8bo5bobo7bo2bobobo2bo7bo3bo3bobo61b2o18bo218bobobo 11b3ob3o10b3ob3o29bo77b3o9b3o32b2o5b2o24bobob2o13bobo2bo40bo4b2o4b3o3b 3o4b2o13b2o4b3o3b3o4b2o8b2o24bo499b2o4b2obo7b2o9bo25b2o42b2o61bo2bo15b 2o54b3o3b3o6b3o7b3o3b3o156b2o4bob2o6bob2o87b2o3b2o78b2o2bo17bobobo17bo b2o7bobo10b3o40bo8b2o2b2o4b2o16bo17b2o4bo174bo231b2o$13bo10bobob2o6bo 14bo6bobo2bobo13bo4b2o6b3o6b6o6b2obo3bo80b2o11bo2bo13bobo7bo56b2o12bo 15bob2o3bob2o9b7o10bo5bo9bob5obobo61bo17b3o23b2o193bobobo72bo10bo34b2o bo6b2obo8b2o3b9o34bo2b5o2bo24bobobo13bobobo42b2o2bo5bobo3bobo5bo13bo5b obo3bobo5bo34b5o495b2o4bob2o7b4obo3bo3bo7b2o122b2o12bo60bo5bo18bo5bo 349bo2b2o17b2obobo15bo4b3o3b2ob2o7b2o2bo39bo5bob2o6b2obo15b2o19bo5bo3b o402b2o$14bo3bo16bob5o6bo2bo8bo2bo16b2o4bo4bo3bo11bo8bo3bo111bo2b2o4b 2o69b5o12bo5bo14bo15b2ob2o11bo7bo60bobo16bo25bobo248bo10b2o8bobo8bobo 33bob2o6bob2o7bobo2bo2b5o2bo4b2o18b2o7b2o7b2o26bo14b2obob2o43bobo5b3o 3b3o5bob2o7b2obo5b3o3b3o5bob2o10b2o4b3o3b3o4b2o4bo417b2o5b2o86bobo2b3o 2b3o4bob4o23bo6bo36bo6bo61bo441b3o22bobo15bob2o4b2ob2o3bo6bo2b2o16b2o 21b2o4b2obo6bob2o15bo26bo3bo402b2o26bo$19bo6bobo7bo10bob2o9bo2bo7b3o8b o2bo5bo3bo7bo3bo8bo3bob2o105b3o3bobo53bo24bo17b2o16bo14bobo13b3ob3o61b 2o16bob5o18b3o25bo223bobo9b2o9bo10bo38b2o2b2o4b2o5bobobobo2b3o2b2o3bo 2bo17bobo26b2o14bo2bo10bo3b2o3bo42bobob2o13b2obo2bo8bobob2o13b2obobo 11bo5bobo3bobo5bo2b2o418b2o5b2o96b3o2b3o2bobo26b2o42b2o57bobo8b2o461b 2o17b2o3bo6bobo7b3o18bo57bo26bo406bo10b2o15b2o8b2o$14b3ob2o5bo12bobo6b o13b2o7bo3bo7bobo7bobo8b2obo10b3o2bo106bo7bo50b2ob2o21bo36b2o14bobo15b obo39b2o18b2o20bobo4bo16bo3bo23bobo223bo71bo3bo5bo7bobobo13bobo2bo2bo 14b3o23bobo14bo7bo8b2o2b2obo42b2obo15bob2o10bobobo15bobobo8b2obo5b3o3b 3o5bobo519b2o36b3o10b3o28b3o10b3o51b2o5b3o2bo272b2o9b2o6b2o9b2o62b2o9b 2o102b2obob2o3b3o29b3o54bo26bo2bo402bobo9b2o16b2o7b2o$25b2o11bo7b2o22b 2ob2o8bo6bobobobo10b3o12bo114b2o49b2ob2o21b2o52bo58bo20bo17b2obo2b2o2b o15bob4o24bo297bo3bo5bo8bo14b2obob5o13bo3bo20b3o16bo3bo2bobo3bo3bobo2b obo45bo15bo14bo2bo15bo2bo9bo2bob2o13b2obobo519bo12b2o23bobo2b2o2b2o2bo bo28bobo2b2o2b2o2bobo51bo10b2o273bo9bo8bo9bo44b2o9b2o7bo9bo61bo41b2obo b2o3b3o31bo74b3o5bo404bob2o21b2o2b2o$90b2o3b2o12bo9b3o165b3o135bobo20b o16bobobobo2bobob2o12bo326b2o2b2o4b2o7b2o13bo2b2o19b3o2bo2bo12b2obo3bo 15bo6bo2bo6b2o2b3o46b2o3b2o3b2o3b2o17b2o3b2o3b2o3b2o14b2obo15bob2o534b o23b3o10b3o28b3o10b3o117bo7bo16bo7bo183b3o11b3o2b3o11b3o42bo9bo5b3o11b 3o57bo40b2o3bo6bobo104bo7bobobo128b3o3b3o$119bo305b2o21b2o15b2o2bo4bob obo11b2o4b2o5b2o15b5o55bo234b2obo4bo5bo7b3o7b3o2b3o3b2obo20bob2o10bo5b ob2o15bo2bo4b2o4bo3b2o54bo2bobo2bo25bo2bobo2bo21bo15bo528b2o207bobo5bo bo4b6o4bobo5bobo182bo15bo2bo15bo39b3o11b3o2bo15bo58bo38bob2o4b2ob2o3bo 103bo4bo2b2obobo127bo2bobo2bo281bo$421b2o20b2o24bo3bob2obo10bo5bo2bob 2o2bo15bo4bo53bobo50bo21b2o159bob2o5bo5bo6b3o7bobo2b3o2b2obobo14b3o2bo 2bo4b3o3bo5bo19bo14b2obob5o49b2o3b2o27b2o3b2o22b2o3b2o3b2o3b2o523b2obo 4bob2o203bo7bo4bobo2bobo4bo7bo56b2o10b2o188bo15bo116bo4b3o3b2ob2o99b2o 4bo9bobo126bo3bobo3bo38b2obo3bob2o216b2o11b5o$422bo21bo18b6o8bo10bobo 7bobob2o17b2obobo27b2o7b2o15bo39b2o8b3o22bo157b2o8b2o4b2o6b3o7b3o2b3o 3b2o2bo14bo3bo8bobo3bo5bob2o14bobobo5bo7bobo2bo2bo116bo2bobo2bo527bo 10bo20b2o2b5o2b2o2b2o2b5o2b2o16b2o2b5o2b2o2b2o2b5o2b2o122b3o6b3o66bo2b o8bo2bo286b5o30bob2o7bobo100bo7b2o6b2o127b4o3b4o38bo2bo3bo2bo216b2o10b o2bob2o5b2o2b2o$422bo21bo17bo8b6o11bobo2bo3bo2bobo18bo2bobo27bo2b2ob2o 2bo35bo20bo7bo24bo158bo9bo5bo8b2o13bo2b2o3bo16b3o9b3o5b2obo3bo13bobob 2o3bo3bo5bo2bo122b2o3b2o529b2o6b2o21bobobo3bobobo2bobobo3bobobo16bobob o3bobobo2bobobo3bobobo40b2obob2o74bo4bo2bo4bo65b3o2b6o2b3o285bo5bo30b 2o2b7obo13b3o85b3o5bo136bo7bo40b3o3b3o228bo7bo9b2o7b2o$62bo56bo302b2o 20b2o15bob2obo3bo16b2obobo7bobo13b2o3b2o2bo29b2obobob2o14b5o17b3o8b2o 8bobo5b2o23b4o156bo9bo5bo8bo14b2obob2o15bobo23b3o14bobo17b2o656b3o2b6o 2b3o19b3o5b3o4b3o5b3o18b3o5b3o4b3o5b3o121bobo4b2o4bobo67b2o6b2o328b2o 6bo9b2ob7ob2o82bo5bo156b2o265bo2bob2o9b2o8b2o$13b2o2b2o10b2ob2o12bo15b obo16bo15b2o3b2o14bobo169bo36b2o89b2o19b2o20bobobo4bo2b2o11bo2b2obo2bo 5bo11bo2bob3o35bobobobo14bo4bo20bo7bo10b2o13bo14b2o4bo106bobobo43b2o8b 2o4b2o6bobobo13bobobo16b2o14bo11bobo13b2o5bo5bo210b2o323b2o5b2o119bo2b o8bo2bo23bobo12bobo26bobo12bobo45bo5bo73bobo2bo4bo2bobo66bo10bo286b2o 5b2o36b2obo10bo3bobobo3bo88bo156b2o221bob2o6bob2o6b2obo21b5o10bo$13bo 2bobo9bob2o2bo11bobo11bo17b2obob2o14bobo2bo10b2o2bo2b2o164b3o36b2o15bo 2b2o32bo35bobo20bo19b2obobo2bobobobo11b2o5b2o4b2o11bobobobobo35bob3obo 13bo2bo22bo6bobo14b3o6b3o13bobob3o34b3ob3o19b3ob3o40bobobo26b3ob3o12b 2obo6b2obo7bobobobo2b3o2b2o3bobo2bo26b2obo3bob2o7b2o18b3ob3ob3o208b2o 323b2o5b2o120b2o10b2o22bobobobo8bobobobo22bobobobo8bobobobo122b2obob3o 2b3obob2o65b2obo4bob2o285bo4bo4bo35b2ob2o10b4o3b4o469b2obo6b2obo6bob2o 23bo$14bo13b2o4bo9bo4bo15b2o10bo3bo3bo10bo5b2o11bo4b2obo163bo20b2o33bo bo2bo11b2ob2o16b3o4bo28bo22bo22bo2b2o2bob2o24bo14bo2bo40b5o11bo2bob2o 22bo3bo2b2o15bo2bo4bo13bo2bo2b2o4bo34bo4b2o3bo5bo3b2o4bo43bo3bo4bo3b2o 2b2o5bo3b2o4bo15bob2o6bob2o7bobo2bo2b5o2bo4bo2b2o26bo9bo26bo3b2ob2o3bo 691b2o4b7o8b7o4b2o10b2o4b7o8b7o4b2o38b2ob2o71bo2bob2o3b2o3b2obo2bo68b 2o289b2o9b2o51bo5bo469b2o8b2o14b2o$17bo11bo3bo10b6o9b2o16bobobobobo10b ob4o15b2ob2o165bo2b3o4b2o10bo15b6o11bo2bobo13bobobo18bo2bobo26b2o22b2o 21bo4bobo22b4obo17bob2o52bobobo4b2o24bo18bo7b2o11bobobo7bobo30b2o3b2ob 3ob2o5b2ob3ob2o3b2o41bobo5b2ob3obo2bo4b2ob3ob2o3b2o34b2o3b9o37b2o5b2o 28b4obob3obo277b2o412bo2b2o4bo4b2o2b2o4bo4b2o2bo10bo2b2o4bo4b2o2b2o4bo 4b2o2bo40bo73b2o3bob2ob2ob2obo3b2o359b2o9b2o51bo5bo470bo9bo14bo$13bobo 2bo9bo4b2o30bo12bo2bo2bo12b2o3b2o11bob2o4bo160b2obobobobobo2bo10bob2o 11bo6bo9bo4b2obobo7bo4bobo14b2obo2bo2bo45b2o26b5obo22bo3bo19bo2bo52bo 2bo3bo2bo2b2o16bo2bo19bo20bo2bo7bobo33bo4b2o3bo5bo3b2o4bo43bo3bo4bo3b 2o2b2o5bo3b2o4bo39b3o9b3o31b3o2b5o2b3o35bo278bobo412b3obo7bob4obo7bob 3o12b3obo7bob4obo7bob3o120bobo6bobo213b2o4b2o52b2o4b2o80b2ob3o7b3ob2o 42b2o3b2o5b2o3b2o463bo9bo16bo$13b2o2b2o9bo2b2obo11b2o13bo18bobo14b2o2b o2bo10b2o2bo2b2o161bobo2bo2bob3o8b3o2bobo11bo3bobo8bo3b2o2bob2o7b2o2b 3obo13bobob2obobo44bobo31bo24b3o21b2o56b2o2bobo4bo2bo14b3o23bo19bobo4b 2obob2o27b3ob3o19b3ob3o40bobobo26b3ob3o36bo2bo7bo2bo31bo2bo7bo2bo24bob 2obobobo210b3o70bo11bobo403b2ob2o10b2ob2o24b2ob2o10b2ob2o125b2obo2b2o 2bob2o77b2o133bobo2bobo52bobo2bobo80bo2bo2bo5bo2bo2bo42bo2b5obob5o2bo 463b2o8b2o14b2o$29b2ob2o12b2o12bo2bobo32bo3b2o14bobo164bo4b4o13b2o4bo 9bobobob2o10b2obobobo12bobo2bobo16b2obo2b2o42bo30b3o23bobo63b3o20bo5bo bobo31b2o7bo19b2o4bo2b2obo100bobobo70b2o9b2o33b2o9b2o25b2obob3ob2o209b 3o55b2o10bo2bo10bo2bo4bo263bo7bo122b2o9b2o2b2o9b2o16b2o9b2o2b2o9b2o45b 2o12b2o60bo2b3o2b3o2bo48b2o27b2o135b4o56b4o83bobo3bo3bo3bobo44b3o4b3o 4b3o272b2o5b2o185bob2o6bob2o6b2obo$60b2o2b2o53bo166b3obo3b4o11b4o9bobo b2o15bobo2bo12bobo4bo13b2o5bobo42b2o30bo25b2o65bo24b2obo2bo10b2o21bo4b o2bo21b2o3b2o267bo2bobo209bo3bo53b3o13bo9b2o5b2o263b4o3b4o121bo11bo2bo 11bo16bo11bo2bo11bo45bo13bo63bo2b4o2bo49b3o162bo2b2o2bo52bo2b2o2bo80b 2obo11bob2o332b2o5b2o185b2obo6b2obo6bob2o$214b2o67b3o2bo3bobo2bo23bo2b obob2obo8bob2o5b2o9b2ob4ob2o12bo4b3obo167bo24b2obo12bobo5b2o11b3o6b3o 21bo5bo268b2o2bo208bo5bo40bo8bob2o12bobo8b2o3bo8b2o258bo3bobo3bo122bo 9bo4bo9bo18bo9bo4bo9bo47b3o11b3o59b2obo4bob2o47bob2o156b2o4bo2b2o2bo 46b2o4bo2b2o2bo79bo2bo4bo3bo4bo2bo44b2o9b2o472b2o8b2o2b2o$213bo2bo25b 2o38bo3b2obo2b2o15b2o10bobo6b2o8b2o2b3o4bo15bo9b2ob2ob5o2bo164bo7bo17b o4bo13bo7bo12bo13b2o18b5o273b2o208bo3bo41bobo6bo2bo5bo6b2o11b2o10b2o 229bo5bo23bo2bobo2bo122b2o9b2o2b2o9b2o16b2o9b2o2b2o9b2o48bo13bo59bo2bo 4bo2bo46bobo157bo2bo5bo2bo47bo2bo5bo2bo82bobobob2o3b2obobobo45bo11bo 473bo9bo2bo$214bobo26bo38b2o2bobo3bo18bo10b2obo2bo14bo3bo2bo14bobo9bob 2obo5b2o164bobob2o2bobo16b5o13b2o8b3o16b2o5bobo506b3o43bobo5bob2o5bo 11bo8bo2bo166b2o69b3o3b3o15b2o5b3o3b3o317bo2bo2bo2bo47bo2bo155bo4bo54b o4bo91bo2b2obo3bob2o2bo47bo9bo389b2o82bo9bo4bo40bobo$13b2o14b2ob2o65bo 19b3o88b2o3bo26bo41bobobob2ob3o12bo16b4ob2o12bo2bobo15b2o15bo2b3o166b 2o2b2o3b2o46bo17bo7bo19bo519b2o11bo2bo7b3o13b2o10bobo165bo2bo67b2obo3b ob2o15bo54bo277b2o4b2o27b2obo6b2obo8b2o155bo6bo52bo6bo94bobo3bobo50b2o 9b2o386bo4bo80b2o8b2o2b2o41b2o$13bo3b2o10b2obo3b2o12b2o13b2o9b2o8bo12b o3b3o10b2o32b2o12bobo14bo5bo23bob2o27b2o40b2o3bo2bobo2bo11b2o14bo2bob 2o11b2o3bo33bobo2bo38bo156bo42b3o8b2o17bobo476bo41b2o11bobo9b2o14b2o 64b2o20b2o89bobo2bo91bobo50bo3bo310bob2o6bob2o34bo130bo6bo52bo6bo92b2o bo5bob2o334bo111bo6bo75bob2o6bob2o6b2obo37bo$14bobobo15bo2bo7b3obobo7b 3o2bobo8bobo6bobobo8bo2bo15bo3bob2o23bobobo11bo3bo12bobo3b2o25bo31b2o 43bobo3b2o28b2o55b2o40bobo36b2o116bobo41bo30bo388b2o86bobo52bobo91bo2b o19b2o63bobo24bo96b2o28b5o22bo307b2o4b2o2b2o4b2o31b3o12b2o116bo4bo4bo 49bo4bo4bo89bob7obo287b2o5b2o11b2o5b2o17bobo110bo8bo74b2obo6b2obo6bob 2o$27b6ob3o40bob2obobobo15bo2b2o10b2ob2o25bo14bo3bo12bo2bo30bo28b3obo 44b2o125bo4b3obo5bo31bo3bo2bo6bo8b2o15b2ob2o2b2o5b2o62bo461bobo85bo3b 2o50bo9bo83bo90bo24b2obo68bo3bo48bo4bo17bo4bo307bo5bo3bo5bo31bo3bo11b 2o117bo2bo5bo50bo2bo5bo17b2o68bobo9bobo135bo149b2o5b2o11bob2ob2obo18b 2o110bo8bo127bo$14b2o2bo7bo2bobo14bobo2bo8bob2o2bo7b2obobo3b2obob2o7b 2o2bo14b2ob2o26bobo13b2o13bo5b3o2bo46bob2obo175bobo2bo4b2o3bobo30bob3o 2b3o3bobo6bobo15bob2o2bobo5bobo3b2o432b2obo6b2obo72bo76b2o9bo3b2o3bo 57b2o81bo86bo4bo2b2o15bo5bo69bo3bo53bo18b5o206b2o9b2o89bo5bo3bo5bo30b 2ob2o131b2o6bo51b2o6bo16bo2bo65b3obo2b2ob2o2bob3o132bobo169bobobobo 131bo8bo110b2o15b2o$16bo2bo6b2o3bob2o10bo4bo8bo5bo11bo2bo5bo16bo2bo7b 2obo3bo57b2o5bobobo10b2o8b3o6bo15b2obobo175bobo2bob2o7bo32bo3b2o3bobo 2bo6bo11b2ob2obo4b2o9b3o2bo432bob2o6bob2o70b2ob4o72b2o9bo3b2o2b2o56b2o 82bob2o20b2o61b2obo2bob2o6bo8bo128bo3bo28b2o200b2o9b2o88b2o4b2o2b2o4b 2o250bo4bo63bo5bo2bobo2bo5bo130bo3bo168bobobobo80b2obo6b2obo6b2obo28bo 6bo111b2o16b2o$18b2o10b2ob2o10b2o3bo8b2o4bo10bobo7b2o10b3o3bo15b2o26bo 16bo21bo2bo10b4obo8bo3b2o20bo3bo170b2ob2obobob2obo4b3o30b2o3bob2obob2o b2o2b2o12bobobob4o2bo4b4o3b2o253b3o181b2o2b2o4b2o41b2o24bobobo2bo84bob o4bobo116b2o4b2o4b2obo9b2o18bob2o65b2o10bo8bo120b2o8bo30bobo302b2obo6b 2obo172b3o3b3o51b3o3b3o10bo6bo63bob2obobo3bobob2obo131bo3bo167bo7bo79b ob2o6bob2o6bob2o29bo4bo125b2o2b2o19b2o$104bo11b3o29bo16bo15bo6b2o11bob o2b3obo4bo24bo3b2o4b2o165bo4bobobo2b2obob2o5b2o3b2o3b2o3b2o3b2o6bob2o 4bo4bo2bo13bo6bo3bobo4bo4bo179bo3b2o72bo182bo3bo5bo13b2o20b2o5b2o8bobo 13bobo7b2o32bobo46bo74bobo48bo5bo4bob2o29bo80bo128b2o42bo302bob2o6bob 2o251bo6bo64b2obobo5bobob2o132bo3bo259b2o2b2o4b2o2b2o4b2o29b2o152b2o$ 146bob2o13bob2o14bo28bo4bob3o2bobo15b2o4b2o3bo165bobobo5bobob2ob2obob 2o3b2o3b2o3b2o3b2o3b2o5bobob2obobo2bob3o11bob3ob2o2b2o3bo3b5ob2o175bob o2bo6b2o249bo3bo5bo5b2o5b2o8bobo10bo14bo14b2o2bo7b2o5b2o24bo124b2o48bo 5bo3b2o4b2o27bo85b3o3b3o4b3o94bo5bo9bo41b2o198b3o7b3o88b2o4b2o2b2o4b2o 174bo59bo15bo4bo69bo7bo136bo3bo259bo3bo5bo3bo5bo6b2o48b2o126b2o$145b2o 15b2o15bob2o22b2o3bo8bob4o21bo3bo101b3o20b2o2b2o2b2o33bo2b2obobob2ob2o 6b2o3b2o3b2o3b2o3b2o3b2ob4o2bobob2ob2o6bo11bo4bobo3b8o2b3o2bo175b2o3bo 5bo6b2o56b2ob2o180b2o2b2o4b2o6bo14bo13bobo13bo2bo9bo4b2o13bo10bobo13bo 2bo57bo63bo48b2o4b2o2bo5bo7b2o13b2o4bo2bo48b3o22b3o3b3o12bo96b3o3b3o 250b3o7b3o88bo5bo3bo5bo31b2ob2o139bo59bo16bo2bo215bo3bo260bo3bo5bo3bo 5bo6bo24bo23bo127bo$149bo16bo11b2o3bo21bo6b3o8b2o25bobob2o119b2o2b2o2b 2o34b2o3bobo2bo5b2o4b2o3b2o3b2o3b2o3b2o3bo3b2o8b2o5b2o12b3obo2b3o8b2o 4b2o177b3obo5bo5bo6b2o46b2o7b2o173b2obo6b2obo8bobo13bo2bo10b2o13bobobo 8b5o13bobo13bo12bobobo48bobo4bobo113bob2o5bo5bo6b2o12bo2bo4b2o48bo38bo 7bo3bo91bo2b2ob2o2bo176b2o173bo5bo3bo5bo30bo3bo11b2o126bo59bo17b2o216b o3bo169b2ob2o29b2o54b2o2b2o4b2o2b2o4b2o6bobo21bobo20bobo102b2o2b2o18bo bo$121bo26b2o15b2o15bobo65bob2obo53bo20b2o19bo3bo65b2obob2obob2o2bo34b o32bobo4bo2bob4o2bo180b2o2bobo2b3obo5bo5bo6b2o39bo9bo173bob2o6bob2o9b 2o13bobobo13b3o3b3o3bo2bo6b2o4bo13b2o10bo2bo8b3o3bo2bo49b2o2b2o3bo9b2o 45bobo26bo2bo23b2obo4b2o4b2o20bo2bo54bo3bo19bo5bo8bo7bo2bobo68bo21b3o 5b3o177bo2b2o2b2o164b2o4b2o2b2o4b2o31b3o12b2o198b3o222bobo168bo2bobo2b o27bobo49b2obo4bo5bo3bo5bo8b2o12bo3b2o3bobo2b2o3bo12b2o90b2o16b2o7b2o 8bob2o$88b2o8b2o13b3o3bo2b2o25b2o15b2o13bo2bo27bo32bob3o34b2obo2bob2o 10b2obo3bob2o10b2obo4bob2o10b2obo5bob2o9b2obo14bob2o30bob2obo2bob2o4bo 29b2obobo31bo8b2obo3b2o101b2o10b2o17b2o37b2o6bo2b3obobo2bobo2b3obo5bo 5bo41b9o172b2o8b2o4b2o11b3o3b3o3bo2bo13bobo3bobo4b2o6bo2b2o5b3o3b3o13b obobo8bobo4b2o50bo3b2o3bo9b2o46b2o12b4o14bo26b2o2bo5bo20b2ob2o54bo2bob o9bo8bo5bo8bo9bobo2bo43b2o22b2o207bobo2bo2bo166b2obo6b2obo34bo157bo65b 2ob2o211bo169b3o3b3o29bo49bob2o5bo5bo3bo5bo20bo14b2o2bobo103b2o15b2o8b 2o$54bo13b2ob2o9bo3bo2bo8bobo3b2o13bo28b3o14b3o14b2o28bo32b2o37bo8bo 10bo9bo10bo10bo10bo11bo9bo20bo36b2o7b2o30bo2b2o84b2ob2o35bo13bo10bo2bo 8bo2bo15bo2bo35bobo5bobo3bobo2b3obobo2bobo2b3obo5bo5b2o214bo9bo5bo12bo bo3bobo4b2o14b3o3b3o12b2obo6bobo3bobo13bo2bo3b3o3b3o60b2o3bo57bo12bo3b o10bo3bo27bo3bo5bo20b2o58bobo2bo7bo8bo5bo19bo3bo33b2o7bobo21b2o207b2ob 3ob2o62b2o3b2o3b2o3b2o88bob2o6bob2o8b2o182bo47bo5bo5bo9bo382bo5bo30b2o 52b2o2b2o4b2o2b2o4b2o20bo2b2obo9b2o3bo120bo$13b2o7b2o6b2o3b2ob2o3b2o8b obob2o8bobob2o8bobo2b2o14bo2bo8b2obo3bo89b2obo33b2o35b2o4b2o12b2o5b2o 12b2o6b2o12b2o7b2o11b2o16b2o76bobo88b2ob2o34bobo11bobo9b3o2b6o2b3o14bo bobo35bobob2o3bo3b2ob2o3bobo2b3obobo2bobo2b3obo3bobo33b9o173bo9bo5bo 11b3o3b3o14b2o17b2o9bo6b3o3b3o5b2o7b2o4bobo68bobo62b2o11bo11b4o26bo3b 2o4b2o81bo3bo7bo38bo33b2o7bo233bobobobo64b5o5b5o110bo2bo144b2ob2o32bo 10b3o33bobo4bo5bo4bo2b2o474bo3bo5bo3bo5bo22b2o10bo3bo2bo142b2o$13bobo 2bo2bobo6bobobob2o2bobobo7bo2bobobo6bo2bo10bo2b3o2b4o8bo109bo3b2o33bo 32b3o2b4o2b3o6b3o2b5o2b3o6b3o2b6o2b3o6b3o2b7o2b3o5b3o2b16o2b3o73b2o 113bo13bo3bo9bo3bo11b2o6b2o17bo2bo37bobobo4b2obo6b2ob2o3bobo2b3obobo2b obo2bo35bo9bo61b2o9bo98b2o8b2o4b2o34bo19bo9b2o20bo13b3o10b2o57bo62bobo 7bo2bo22b2o18b2o2bo5bo13bo10bo61bo12b3o3b3o22b3o43b3o224bo4bo9bo63b3o 7b3o111bobo145bo22bo33b3o23bo3bo3bo5bo5b3o169b2o4b2obo6bob2o194b2o5b2o 84bo3bo5bo3bo5bo22b3o8bo3b3o143b2o$15b4o2bo10bob2o4bobo8bo4bo2bo6b2o3b 2o6bo4b2o2bo2bo9b2obo10bobobobo87bobo36bo33bo2bo6bo2bo6bo2bo7bo2bo6bo 2bo8bo2bo6bo2bo9bo2bo5bo2bo18bo2bo162b9o16bobo13bo3bo7bo3bo11bo10bo15b o43bo7bo5b2obo6b2ob2o3bobo2b3obobob2o33b2o7b2o62bo9bo100b2obo6b2obo26b 2o5b2obo19bob2o28bob2o22bo2bo109bo11bo33bobo22bo5bo11bobo8bobo57b3o4b 3o3b3o303bobo2bob3obob3obo63bo9bo113bob2o144b2o2bo13bo4bo8b3o3b3o4bo4b 3o3bo14b3o9bobo16b3o80bo89bo4bob2o6b2obo194b2o5b2o83b2o2b2o4b2o2b2o4b 2o$13bobo2bo2bobo6bobobob2o2bobobo6bobob2obo10bo2bo6b4o4b2obo10b2o106b o2bo35b2o33b2o8b2o8b2o9b2o8b2o10b2o8b2o5bo5b2o7b2o20b2o162bo4bo4bo14bo 3bo13bo3bo5bo3bo12b2obo4bob2o16bobo39bo2bo5bo6bo5b2obo6b2ob2o3bobobobo bo35b2ob2o64bo10bo100bob2o6bob2o25bo2bo4bo2bob2o13b2obo2bo27b2o2bo4b2o 14bo2bobo45b3o61bobo45bo21b2o4b2o12bo4b2o4bo78bo147bo151bo3bo3b2ob2o3b o50bo35bo101b3o145b3o12bo28bo9b2o3bo23bo7b3o6bo2b2o78bobo87bo3b2o8b2o 286b2obo6b2obo6b2obo24b3o8bo3b3o$13b2o7b2o6b2o3b2ob2o3b2o7b2obobo8b2ob obo11b2o2bobo9b2o2bobo9bo3bob2o87b2o140b3o20b2o2b2o2b2o115bo54b3o3b3o 16bo3bo13bo3bo3bo3bo18b2o18bo44bo15bo6bo5b2obo6b2obo2bo3bo103b4o6b2o 123b2o12bo2bobo6b2obo15bob2o11b2o13bo4b2o4bo2bo17bo45bo3bo49b2o12b2o9b 2o32b2o16b2o4b2obo17bo4bo72bo8bo10b2o91b2o41b2o156b3ob3ob3o50bobo33bob o101b2o27b2o116b3o4bobo3b2o6bob2o10bo8bo3b2o9bo8bo5bo30bo76bo3bo86b2o 2bo10bo286bob2o6bob2o6bob2o23b2o10bo3bo2bo$56bo9b2ob2o10bo2bo3bo10b2o 5bo10bo257b2o2b2o2b2o37b2o18b2o8b2o45bobo55bobobo19bo3bo13bobo5bobo37b 2obo5b2o36bo3bo5bo12bo6bo5b2obo3bo3b3o36bo64b2o4bo3bo125bobo16bo10bo 15bo13bobo13b5o6bobo2bo11bob2o45bo5bo48b2o12b2o9b2o50b2o4bob2o17bo4bo 72bo8bo6b2obo2bob2o56b3o28bobo40bobo148b5o4bo5bo4b2o45bob2o33b2obo129b 2o115b2o2bo3b2obo6b2o3bobo10bo12bo3b3o4bo8bo5bo26b2ob2o77bo3bo90bo8bo 14b2o6b2o309bo2b2obo9b2o3bo$81b2o22b2o6b2o2bo3b3o299bo18bo2bo6b2o43b3o bo80bo3bo13bo7bo19bo17bo8bo2bo3b2o30bo3bo3b2o20bo6bo5b4o38b3o8b2o3b2o 24b2obo4b2o10b2obobob3o3bo4bo121bo14bob2o11b2o3b2o3b2o3b2o13bo13b2o4bo 7bo16bo48bo3bo63b2o6b2o6bo3b2o68bo4bo66bo5bo15b2o2bo4bo47b2o7bo17b2o 13bo190bo4bo14bo2bo2b2o34b2o3b2ob2o33b2ob2o3b2o44bo173b2o2b2o4b2obo7bo 17bo18bo10b3o19bo5bo109bo3bo84b2o2b2o8b2o11bo4bo2bo4bo307bo14b2o2bobo$ 115bo304b3o20b3o10bo39bo4b2obo70bo7bobo18bo22bo2bo14bobo2bo3bo2bo3bo2b o29bo7b2ob2ob2o21bo6bo2bo23b2o3b2o18bobobobo24bob2o5bo10b2obobobo5bo 125b2o5b2o8bo17bo2bobo2bo16b2o5b2o7bo2b2o9b2obo62b3o61bobo7b3o5bo3bobo 69bo2bo66bob2o24bo51b2o7bobo15b2o13b2o107b2ob2o20bo17b2ob2o33bo2bo8bo 3bo4bobo2bobo34b2o4bob2o33b2obo4b2o42bobo174bo3bo4bob2o7b2ob2o6bo4bo 40b3o105bob2ob2o15bo3bo84bo4b2obo6bob2o7bo4bo2bo4bo294b2o12bo3b2o3bobo 2b2o3bo12b2o95b2o$420bo4bo2bo2bo2bo2bo2bo9b7o39bob2o3b2o6b2o61bobo7bo 18bobo21bo2bo14bo2bo4bo5bo2bobo29bo2bo4b2o4b3o3b4o4bobo15b2o23bobobobo 19bo3bo29b2o2bo14bo11b3o128b2o27b2o3b2o24b2o7bobo13bo63b3o61bo10b2o6b 5o68bobo2bobo68bo24bobo58b2o88b2o14b2o12bob2o6b2obo7bo24bo8bo12bo30bo 2bob2o10bo5b2obob2o43bobo33bobo40bo7bobo74b2o98bo3bo3b2o4b2o17bo59b3o 89b2ob2o2b2o15bobo84bo5bob2o6b2obo7bo4bo2bo4bo293bobo21bobo20bobo92b5o $418bobob26o2bo44b2obob2o9bobo59bo3bo26bo24bo16b2o4bo10bo31bo8bo3b2o4b 2obo7bo6bo33bo3bo54bo3b2o10b3o2b2o203bo2bobobo155b2o4b3o69b2o4b2o64bo 2bobo173b2o15b2o12b2obo6bob2o8b2o2bo19bo8bo7bo2b2o30bobobo5bo11bo3b2o 3bo43bo35bo40b2o6bo2bo11b2o56b2obo4bob2o93b2o2b2o2bo5bo13b2o17bo137bo 24bo85b2o2b2o4b2o8b2o7b2o6b2o295bo24bo23bo84b2o5bo4bo14b2o209bo$417bob obo26bobob2o2b3o41bob5o6bo2bob2o37bobobo12bo3bo21bo7bo43bobo4bob2o30bo bobo17b3o3bo3bo4b2o54bobobo5bobobo25bo13bo26bo183b4ob2o156b2o150bo2bo 174b5o23b2o8b2o4b2o7b3o29bo8b3o32bo2bo4bobo13b2o2b2obo57bobo58b2o4b2o 2bobo11b2o56bo10bo102bo5bo11bo2bo16bo144b2o106bo5bo10bo37bo2b2o4b2o2bo 260b2o48b2o83b2o5bo2b3o14b2o207bobo$19bo32b2o2b2o227b2o4b2o57bo17bo48b obobobo2b3o2b3o2b3o2b3o3b2obo3bobo2bob2o30bob2ob2obo5bo4b2obob2obo34b 3o3b3o11bo3bo6bo12bobo5bobo19b2o22bo6bo31bobob2o4bo22bo4b2ob2o26bobobo 5bobobo4b3ob3obob2o3b2obob3o22b2o2b2o9b3obo21bobo186bo311b2o144b2o14b 3o13b4o24bo8bo5bo8b3o7bo8b3o3b3o13b3o35b2o2bo2bo9bo3bobo2bobo56bo51b2o 7b3o4b2o3bobo69b2o6b2o94b2o2b2o2b2o4b2o10bo4bo15bo137b2o5b2o102b2o3bo 5bo8bo37bo3b3o2b3o3bo363b2obo6b2obo6b2obo14b2o2bo214b2o6b2o$18bobo15b 2o14bobo2bo13bo13bo198b2o2b2o2b2o55bobo14bobo3b2ob2o2b2o35b2obo5b2o3b 2o3b2o3b2o3b2obo4b2o2bobobo34b2o5b4o8bo4bo33bo4bo4bo11bo3bo4bobo10bo3b o3bo3bo13b2obo4bob2o19bobo34bobo7bo6bo12bobo5b2o27b3obob2o3b2obob3o4bo 3bobobo5bobobo20b2obo5bo5bob2o4bo3bo10bo6bobo184bobo81b2o374b2o12bo3bo 40bo10bo5bo6b2o2bo7b2o15b3o3b3o3bo2b2o39b2o14b2o2b3o57bo51b2o8b2o4b2o 5bo66b3o2b6o2b3o92bo3bo2bo5bo10bo6bo152b2o110bo2b2o4b2o8b2o37bo2b2o4b 2o2bo364bob2o6bob2o6bob2o16b2o214bo3bo4b2o12b2o$15b2o2bo2b2o11bo2bo17b o13bobo10b5o9bo4bo9b2o6b2o161bo10bo9b2o4b2o29b2ob2o3bobo15bobo2b2ob2o 2b2o3b2o31bobobobo2b3o2b3o2b3o2b3o2b2ob3obo2bo2bo2bo28bo3bobo2bo3bobo 4b2obob4ob2o32b9o13bobo4bobo10bo3bo5bo3bo12bo10bo22bo34b2o5bob2o5bo6bo 15bo28bobobo5bobobo5b2o38bob2o4bo6b2obob2o3b2ob2o6b2ob2o3b2obob2o181b 2o82b2o361b2o5b2o17bo4bo13b4o23b2o8b2o4b2o5bo11bo12bo21bo30b2o15bo3bo 3b2o61bo2bo59b2o77bo2bo8bo2bo91bo3bo4bo5bo9bo6bo10b3o3b3o71b2o68bo102b o5b2obo6bob2o415b2o8b2o4b2o2b2o4b2o27bo3bo197bo5bo3b2o12b2o$15bob2o4bo 10bobobo14bo17bo10bo5bo8bob2o2b2o7bobob2obobo160bo12bo7b2o2b2o2b2o10b 3o11b2o2b2ob2o2b2ob2ob3o10bo16bo32bobobo27bo3bo2b3o2b2o28bo3bobo2b2obo b2ob2o4bobo4bobo54bo4bobo10bo3bo7bo3bo12b2o6b2o19bo2bo41b2o6bob2o5bo6b o67bo3bo23b2o8b2o8bobo6bo10bo3bo4b2obo628b2o5b2o17bo3bo13b5o25bob2o4bo 5bo6b2ob2o20bo8bo8b2ob2o29bo2bo15b2o3b2obob5o55b3o61bo78b2o10b2o92b2o 2b2o2b2o4b2o10bo4bo73bo16bo2bo59b2o2b2ob2o102b2o4bob2o6b2obo415bo9bo5b o3bo5bo15b2o9b2obobob2o195bo3bob2o4bobo$17b3ob2o17bo7b2o5bobo2b2o19bo 2b3o2bo6bob3o14b2o3bo162bobo6bobo7bo10bo22b2o80bobob25obob3o43b2o3b3ob 2obob3obo2b3o3bo33b2ob2o22bo10bo3bo9bo3bo8b3o2b6o2b3o15bobobo40bo4b2ob 2o6bob2o5bo6bo35bo3bo19bobobobo22bo19bobo21bob3o675b2o15b2o12b2obo5bo 5bo30bo8bo37bo2bo2bobo14b2o5bobo2bo2bo131bo180bo5bo12bo2bo16bo56bobo 14bo4bo59b2ob2obo539bo9bo5bo3bo5bo12b2o2bo7bob2o3b2obo194bo5bo7bo$14bo 6b2obo7b2o7bo6bo2bobo5bobo7b5o8b2o3b2o9bo3b2o7bo2b2o3b2obo163b6o9bo12b o5b2o5b2o6bo22b2o9b17o34bo4bo2bo2bo2bo2bo2bo2bo2bobobo4bob2o34bob2ob2o b2o13bobo2bobob2o30b2ob2o34bobo11bobo9bo2bo8bo2bo15bo2bo43b2o2bobo3b2o b2o6bob2o5bo34bobobobo18b2o3b2o23bo8b2o9bo26bo658bo3bo13b2o14b2o16b2o 2b2o4b2o12b2o25bo4b2o31b5obob2o20bo2bo60b3o74bo171b2o2b2o3bo5bo12b2o 17bo55bo3bo12bo6bo603b2o8b2o4b2o2b2o4b2o5b2o5bo2b3o5bo2bo5bo2bo194bo3b o$13bobobo3bobobo5bo8bobo6bo7bo10bo3bobo10b2o13b2o8bobobo2bobobobo178b obo6bobo6b2o5b2o5bo23b2o6bobo17bo33b3o24bobo2b4obo44bo6bobobobo2b2obob obo71bo13bo11b2o10b2o17b2o40bobo3bobob3o2bobo3b2ob2o6bob2o33b2o3b2o8b 3o36b2o9bo29b2o2b3o659bo4bo47bo2bo5bo12bo2bo28bo2bo36b2o3bo19b2o61bo2b o71b3o172bo3bo2b2o4b2o31bo56bobo13bo6bo605b2obo6b2obo4bo5bo6b2o5bo4bo 6bob2o3b2obo196b2o$14bob2o6bo6bobo8bo9bo7bo7bo3bobo10b2o13b2o8bobobo2b obobobo181b6o10bo5bo7bobo20bo6bo21bo35bo25bob2o5bo36b2obobob2o6b2obobo bo3bobobo170bo5bobobo2bobob3o2bobo3b2ob2o3bo48bo39b2obo4bo19b3o11bo 649b2o12bo3bo46bo4bo5bo10bo4bo26bo4bo31b3o2b2o14b2o69bo248bo3bo5b2obo 91bo15bo4bo92bob2ob2o507bob2o6bob2o5bo5bo13b5o7b2obobob2o$16b2ob3o10bo 7b2o6bobo5bobo2bo7b5o8b2o3b2o9bo3b2o7bo2b2o3b2obo104bo58b6o29b7o10b21o 7bo21bo2bo30b2o25bo5b3o38bob2obo2bo7bob2o2b4ob2o172b4obobob3o2bobo2bob ob3o2bobo3bobo87bob2o4b2o22bo5bobobob2o159b2o3b2o480b2o14b3o46b2o2b2o 4b2o9bo6bo24bo6bo29bobo2bobo3bo4bobo2bo2bo2b2o64bo248b2o2b2o4bob2o108b o2bo92b2ob2o2b2o134b2o368b2o4b2o8b2o2b2o4b2o15b2o10bo3bo$15bo4b2obo9bo 14b2o2bobo5b2o19bo2b3o2bo6bob3o14b2o3bo29b2o3bo23b2o25bo16b2obobo54bob o6bobo8bo8bo8bo5bo30bo8b2o19bob2o56b2o5bo40bo4bobo8bo3b2o180bob2o3bo5b ob3o2bobo2bobob3o2bo46b2ob2o64bo4bo3b3obobob2o158bo2bobo2bo540bob2o6b 2obo11bo6bo24bo6bo29bob2o2b2o9b2o2bobo4bo2bo62bobo303bo59bo4b2o57b2o 34bo140bobobo367bo5bo9bo3bo5bo$15b2o2bo2b2o11bobobo16bo14bo10bo5bo8bob 2o2b2o7bobob2obobo27bo2bo2b3o20bo2bo2b2o20b3o15bobo2bo19bo4b2o26bo12bo 7bobo4bobo23bo31b2o2b2ob2ob2o2b2o4bo106b2o4b2o8b2o3bo2bo178bo7bo5bo5bo b3o2bobo2b2o44b2o7b2o65bo3bo4b2o158b2o3b2o3b2o3b2o536b2obo6bob2o12bo4b o26bo4bo31bo3b2o3bo6bo4bo5bobobo46bo35bo58bo216bo8bo59bo55bo6b3o10bob 2o27b2o130bobobo370bo5bo9bo3bo5bo32b2o$18bobo14bo2bo14bo16bobo10b5o9bo 4bo9b2o6b2o27b2obo5bo19b2obo3bo14b2o2b2o3bo14bob2obo19b3o2bo28bo10bo7b obo6bobo9b3o10bobo2b2ob2o2b2ob2ob3o15b2ob2ob2o2b2o4bo129b2o177bob3o3b 2o6bo5bo5bob3o46bo9bo62b2o6b4o127b2o31bo15bo431b2o5b2o123bo2bo28bo2bo 33b2obob2o5bo10b2obo2bo46bobo33bobo56bobobob2o210bo8bo10b3o10bo35bo8b 2ob2o41bobo6b2o10bo3bobo17b2o5b2o131b2o371b2o4b2o8b2o2b2o4b2o30bo4bo$ 19bo16b2o14bo2bobo13bo13bo65bob4obo21bob3o4bo11bobobob2o12b2obo4b3o15b 2o3bobo29b2o2b2o2b2o10bo6bo23bobo3b2ob2o3bobo36bo310bo2bo9b2o6bo5bo3b 2o45b9o63bo10bo120b2o5b2o8bobo17b2obo15bob2o428b2o5b2o124b2o30b2o32bob o2bobo4bo3bo8bo2bo42b2o4bob2o33b2obo4b2o50b2ob2obo210bo32bo48bo40bo3bo 6bo7b2o7bo17b2o513b2obo6b2obo6b2obo31bo6bo194b2o$52b2o2b2o89b3obobo3bo b2o15b3obobo4b3o14b2obo13b2obobobo3bo13bo2b2obob2o29b2o4b2o44bo11bobo 30b2o4bo2b2o303bobo2b2o16b2o6bo2bobo116bo9bo122bo14bo18bo2bob2o13b2obo 2bo625b2o2bo2bo14bo4bo43b2o3b2ob2o33b2ob2o3b2o183b2o57b2ob2o25b3o3b3o 4bo5bo8bo14b5o3b2o7b3o3b3o3bo2b2o40bo3bo8b2o6bo5bobo25bo506bob2o6bob2o 6bob2o30bo8bo184b3o5bobo$146bo2bo2bo3bo2bobo13bo2bo2bo4bo15bobo2bo16bo bo3bo2bo13bo6bo95bo31b2o4bo2b2o72b2o3b2o223b2o29b2o3bo45b9o63bo9b2o 121bobo13bo2bo14b2obo5b3o3b3o5bob2o32b2o596b2o4bo5bo4b5o50bob2o33b2obo 189b2o57bo12bo7b3o3b3o13bo5bo21b2o4bob2o2bo19b3o40bo3bo10bo5bob2obo21b 2o2b2ob2o560bo8bo183bo3bo6bo$145bobo2bo3bob2o4bo11bobo2bo3bo2b2o14bo2b 3ob2o13bo2b2ob3o13b2obob2o2bo132bo32b2o3b2o37bobobobo179b2o6b2o34b2o 79bo9bo196b2o13bobobo16bo5bobo3bobo5bo34bobo600b3ob3ob3o58bobo33bobo 119bo130b2o2bo7bo20bo8bo5bo4b3o3b3o16b2ob3o9bo8b3o12b2o4b2obo6b2obo7bo 3bo45b2ob2obo561bo8bo182bo5bo$146bo10b2ob3o12bo24b2ob2o3bobo12b2o22bob o3b2o133bo32bobobobo39bobo180bo2bo4bo2bo34bobo77b2o7b2o200b3o3b3o3bo2b o16b2o4b3o3b3o4b2o23b2o7b3o7b2o592bo3b2ob2o3bo3bo54bo35bo120bo131b3o8b o11bo8bo34b2o4b2o3bobobo9bo7bo2b2o12bo4bob2o6bob2o8bobo615bo6bo183bo5b o$82b2o63b2ob2ob2o3bo17b2ob2ob2ob2o16bo2bobo16b8o14bo2b3o132bo2bo34bob o41bobo180bobo6bobo117b2ob2o203bobo3bobo4b2o54b2o5b2o6bo3bo6b2o5b2o 585bob3obob3obo2bobo66bo9bo132bobo130b3o20bo8bo10b3o10bo12bobobo3b2o4b 2o7bo12bo10bo9b2o2b2o4b2o7bo617bo4bo$81bobo25bo10bo27bo3bo5bob3o14bo3b o3bo16bobo3bo16bo6bo13b2o4bo134bo35bobo41bobo88b2o3b2o22b2o3b2o22b2o9b 2o19b2o2b3o2b3o2b2o32bo2bo287b3o3b3o61bo13b2ob2o13bo143b2o62b2o3b2o 373bo9bo4bo66b3o7b3o132bo130b2o2bo3b3o3b3o7bo32bo12b3ob2o26b2ob2o10b2o 8bo3bo5bo189bo2b2o4b2o2bo425b2o192bo$57b2o6b2o16bob3o7bo12bobo8bobo26b o3bo6b2o2bo13bo3bo3bo14b2o4b2o20b2o155bobobo33bobo34b2o4bo3bo4b2o80bob o3bobo20bobo3bobo20bobo9bobo17bo6bo2bo6bo31bobo82bo236b2o19b2o16bobo 27bobo143bo9b2o52bobobobo375bobobobo72b5o5b5o131bo129bo57bo13bo2b2obo 4b2o44bo3bo5bo187bo3b3o2b3o3bo617b2o$57bobo4bobo13b2obo2b3o4bobo11bo2b o8b2obo39b2o64b2o154bobob2o26b2o4bo3bo4b2o27bo4bo5bo4bo80bo7bo20bo7bo 20bo13bo17bob2o10b2obo32bo82b3o235bo2b2o13b2o2bo17b2o27b2o132b2o8bobo 9b2o39b2o13bobo13b2o361b2ob3ob2o70b2o3b2o3b2o3b2o130bo129b2ob2o8bo59b 2o3b5o35b2o8b2o2b2o4b2o188bo2b2o4b2o2bo110bo2b2o4b2o2bo36bo2b2o4b2o2bo 444b2o$18bobo13b2ob2o2b2ob2o37bo13bo8bo4b2ob2ob2o2bobo260bobo29bo4bo5b o4bo28b4o7b4o78b2ob2o5b2ob2o14b2ob2o5b2ob2o14b2ob2o11b2ob2o15bobo10bob o336b2o17b2obo13bob2o22b3o3b3o5b3o3b3o136bo2bo6b2o51b2obo10b2ob2o10bob 2o360bo2bo2bobo218bo142bo105bo4b2obo6b2obo20b2o202b2o6b2o79bo3b3o2b3o 3bo34bo3b3o2b3o3bo441bo2b2o$16b3ob3o11b2obo4bob2o8b2o3bob2obo3b2o12bo 9b6o9b2o4b2o3bo2b2o262b2o30b4o7b4o122b2obo3bo3bob2o14b2obo7bob2o14b2ob o13bob2o17b2o8b2o321b2o13bo2bo18bo17bo23bobo3bobo5bobo3bobo128b5o7bo 62bo23bo364b2o2b2o2bo217bobo69b3o63b2o4bo104bo5bob2o6bob2o20b2o33b2o 165bo4bo2bo4bo78bo2b2o4b2o2bo36bo2b2o4b2o2bo443bobo$15bo3bo3bo14bo2bo 12bobobo6bobobo14bo5bo18bo2b2o3bob2o331b2o5b4o11b4o5b2o72bobo3bobo20bo b2o2bobo20bob2o2bobo2b2obo352bobo13b3o19bobo13bobo23b3o3b3o5b3o3b3o 127bo5bo6bo59bo29bo369b2o217bo69bo3bo61bo2bo75b3o30b2o2b2o8b2o4b2o53b 2o165bo4bo2bo4bo585b2o$15b2o2bob3o10b3o6b3o13b2o2b2o20bo4bo3b2o13bobo 2b3obobo296b4o7b4o13b2o5bobo3bo4bo9bo4bo3bobo5b2o65bobo3bobo20bobo3bob o20bobo3bobo3bobo352bo38b2o13b2o174bo3b2o7bo60bob2o21b2obo156bo3bo283b 3o7b3o132bo68bo5bo59bo4bo111bo9bo5bo221bo4bo2bo4bo431bo$13b2o2b3o4b2o 8bo4b2o4bo10bo10bo17bo3bo6bo13b2o3bobo298bo4bo5bo4bo13bo6bo3bo4b2o9b2o 4bo3bo6bo65b2obo3bob2o18b2obo3bob2o18b2obo3bobo3bob2o19b2o8b2o319b2obo 13b3o212bo7bo2bo63b2o6b3o3b3o6b2o158bo3bo16b3o3bo260b3o7b3o201b2obob2o 58bo6bo14bo56bo5bo28b2o3bo9bo5bo222b2o6b2o111b2o320b2o$14bo2b2o3bobo 12bo4bo15bo6bo14b2o5bo5bo15b2obo3b2o2bo295b2o4bo3bo4b2o13bob2o6bo23bo 6b2obo66bo2b3o2bo20bo2b3o23bo2b3o3b3o2bo18bobo10bobo316bo2b2o13bo2bo 155b2o4b2o56b2o73bobo3bobo180b2o3b5o2bobo12b2o524bo6bo14bo56bo5bo29bo 2b2o8b2o4b2o280b2obo4b2o4b2o4b2obo39b2o295bo23b2obo31b2o116b2o3b2o$14b obo3b2o2bo12bo4bo15bo6bo16bo5bo5b2o13bo2b2o3bob2o201b3o53bo7bo36bobo 21bo3bo4bo23bo4bo3bo67bo7bobo18bo26bobo13bobo15bob2o10b2obo315b2o18b2o 16b2o19b2o17b2o27b2o68bobo2bobo27b2o32bo16b3o50b3o3b3o180b2o2b2o3b2o3b o12b2o348b2obo6b2obo163bo4bo14bobo55bo5bo28bo5b2obo6b2obo67bo214bob2o 5bo5bo4bob2o180bo7bo147b3o20bo2b3o30bo117b2o3b2o$13b2o4b3o2b2o8bo4b2o 4bo10bo10bo11bo6bo3bo21bobo3b2o166bo8bo27bo54b2o5b2o36bobo23bobob2obo 23bob2obobo70b3o5b2o19b3o23b2o3b2obobob2o3b2o15bo6bo2bo6bo353bo6b3o3b 3o6bo16bobo27bobo69bo2bo6b2o4b2o8b2o3bo2bo32bobo13bo3bo221b2obo3bob2o 11b2o3bo2bo260b2o9b2o90bob2o6bob2o100bo63bo2bo23b2o58b2o23b2o4bob2o6bo b2o66bobo217b2o2bo5bo3b2o4b2o177bobo5bobo149bo18bobobo30bobo$15b3obo2b 2o10b3o6b3o13b2o2b2o15b2o3bo4bo18bobob3o2bobo165b3o4b3o18b2o35b2o25b2o 5b2o36bobo23bobo2bobobo19bobobo2bobo72bo28bo28bob2ob2obo21b2o2b3o2b3o 2b2o351b2obo6bobo3bobo6bob2o13bo13b2ob2o13bo68bo4bo6bo4bobo8bo3b2o34b 2o7b2o232b3o3b3o13bo3b3o261b2o9b2o88b2o4b2o2b2o4b2o7bo2bo4bo2bo78bobo 63b2o23bo2bo49b3o4bo2bo55bob2ob2o45bo3bo216bo3b2o4b2o2bo5bo179bo7bo 149b2o17bobobo31b2o120b3o$15bo3bo3bo14bo2bo12bobobo6bobobo15bo5bo17b2o bo3b2o2bo168bo2bo22bo6b3o26b2o26bo5bo35bobobobo19bobob2obo2b2o19b2o2bo b2obobo160bobo6bobo325b3o3b3o19bo2b2o5b3o3b3o5b2o2bo12b2o5b2o6bo3bo6b 2o5b2o57bo9bo4bo6bob2obo2bo7bob2o2b4ob2o35b2o5bo5bo222bo5bo383bo5bo3bo 5bo6b3o2b6o2b3o2bo54b2o17bobo87bo4bo54bo4bo53b2ob2o2b2o21bob2obo5bo10b o3bo218bo4bob2o5bo5bo331b2o20b3o2bo154b3o$16b3ob3o11b2obo4bob2o8b2o3bo b2obo3b2o8b6o9bo13b2o2bo3b2o4b2o165b2o2b2o21bobo3bo3bo4b3o88b2o3b2o19b 2o5bo27bo5b2o160bo2bo4bo2bo325bobo3bobo4b2o14b2o4bo13bo4b2o20b2o7b3o7b 2o63bobo8bo4bo5b2obobob2o6b2obobobo3bobobo36bo4b2o3b2o39b3o21b3o177bo 3b3o363bo5bo3bo5bo7bo2bo4bo2bo5bo53bobo17bo4b2o81bo6bo52bo6bo52bo25bob o5bo6b2o8bo3bo218b2o4b2obo4b2o4b2o332bo21bob2o156bo$18bobo13b2ob2o2b2o b2o32bo13bo13bobo2b2ob2ob2o4bo158b2o16b2o14b2o2bo5bo2b3o18b4o26b5o69b 2o25b2o168b2o6b2o16b2o2b2obo11bo15bo274b3o3b3o3bo2bo15b5o13b5o33bobo 70bob3o8b2o14bo6bobobobo2b2obobobo90bo19bo179b2o3bo2bo361b2o4b2o2b2o4b 2o22b3o48b2o6bo21bobo80bo6bo52bo6bo59b2o17bo7b2o7bo6bo3bo151bo63b2obo 10b2o2bo5bo333bobo20b2o$57bobo4bobo13bobo4b3o2bob2o11bob2o8bo2bo160bo 6b2o8bo18bo7bo21bo4bo24bo5bo4b3o285bo2bob2o10bobo13bobo269b2o13bobobo 15bo4b2o9b2o4bo34b2o67bob2o4bo14bob2ob2ob2o13bobo2bobob2o10bo74bo3bo 19bo3bo174b2o3b2o3bo12b2o285b2o61b2obo4bo5bo70b2obo2bo2bo2bo10bo5b2o6b o7b2o71bo4bo54bo4bo53b2o5b2o17bobo3bo10b2o6bobo151bobo62bob2o11bo3bo5b o171bobo17bobo139b2o21bo4bo2b2o$57b2o6b2o13bo7b3obo15bobo8bobo128b2o 31bobo3bo2bo5bobo18bo7bo20bo6bo22bo7bo2b3o285bo7b2o8bobo13bobo212b2o 10b2o42bobo13bo2bo17b2o2bo11bo2b2o96b2o6b2o3b2obo17b2o3b3ob2obob3obo2b 3o3bo13b3o5bo24bo40bobo2bo19bo2bobo145b2o27b5o2bobo12b2o286bo61bob2o5b o5bo69b2o2b2o6bo11bo3bo2bo2bo2bo7b2o63bo2bo5bo2bo47bo2bo5bo2bo54b2o27b 2obo10b3o6bo151bo3bo59b2o14bo3b2o4b2o36bo2bo134bo15bo169bo3b2o2b2o$92b obo14bo10bo28b2o55b4o41bo2bo29b2o2bo4bo3bobo19bo7bo19bo8bo17bo2bo9bo 289b2o6bo7b3ob2o11b2ob3o209bo2bo8bo2bo41bo14bo23bobo11bobo97bobo9b2obo b2o11bo3bobo2b2obob2ob2o4bobo4bobo16bo3bo24bo39bo2bobo23bobo2bo126b2o 15bobo28b3o3bo194b2o105bobo5b2o56b2o2b2o4b2o78bobo10b3o4b2o6bo70bo2b2o 2bo4b2o46bo2b2o2bo4b2o63bo34b2o159bo3bo59bo15b2o2bo5bo35bobo2bobo131bo 4bo7bo4bo168bo7b2o$92b2o52b4obob2o11b4o13b2ob4ob2o11b3o2b3o39bobobo31b o6bob2o18b2o2bo5bo2b3o12b2obo8bob2o12bo2bobo4bo4bo298bo5bo23bo208b3o2b 6o2b3o40b2o5b2o8bobo20bobobo2bobo2bobobo91b2obo2bo6b5obo16bo3bobo2bo3b obo4b2obob4ob2o16b2o3b3o22bo39bo3bo10b2ob2o10bo3bo126b2o17bo228bo2bo 105b2o5bobo55bo3bo5bo79b2o23bobo71bo2b2o2bo52bo2b2o2bo61b2o2b2ob2o195b o3bo60bo19bo5bo35b2o2b2o128bo7bo2bo3bo2bo7bo165b4o$145bob2o2bob2o8b4o 2b4o9bob3o2b3obo10b3o2b3o11b2ob4ob4ob4ob4ob4obo2bo32bo6bo20bobo3bo3bo 4b3o11b2obo8bob2o12bo4bo3bobo3bo289b2o6b2o6b3ob2o11b2ob3o212b2o6b2o50b 2o32b2ob4ob4ob2o91bob2obob2o4bo5bob2ob2obo4b2o8b2o5b4o8bo4bo88bo15bobo 15bo143b3o227bobobo98bo16bo11bobo41bo3bo5bo36bo2bo4bo2bo55b2o74b4o56b 4o64b2ob2obo196bo3bo59b2o18b2o4b2o128b2obo6b2obo6b2obo16bob2o6b3o3b3o 6b2obo159b2o156b2o$146bo4bo10bob2o4b2obo9b3o4b3o9bobo6bobo8bob3o2bobo 2bobo2bobo2bobo2bobo32b2o2bo4bo5b2o14bo6b3o22bo8bo15bo2bobo4bo4bo17b2o bo112b2o155bo2b2obo10bob2o11b2obo213bo10bo85bo9bo93bo4bo8b4o5b2o6bo2bo 4bob2ob2obo5bo4b2obob2obo22bo22b3o3b2o36b3o10bobobobo10b3o174bo44b2o 21b3o128b3obo97bobo13bo2bo10bo2bo4bo35b2o2b2o4b2o34b3o2b6o2b3o127bobo 2bobo52bobo2bobo265bo3bo61b2obo10b2o4b2obo130bob2o6bob2o6bob2o16bo9b3o 3b3o9bo158bo2bo155b2o$61bo88b2o11bo8bo29b2o8b2o9b3o3b3o2b3o3bo4bo4bo 32bobo3bo2bo6bo14b2o32bo6bo18bo2bo9bo17bob2o112bo155bo3bob2o17bo3bo 150bo10bo58b2obo4bob2o85bobo5bobo91b2ob4obob2o4bobo3bo2bobo3bo2b2o12bo b5o6bo2bob2o23bo24bo3bo50b2o3b2o180bo4bo3bo40bo4bo18b3o129b3o89b2o6b2o 19bo9b2o5b2o32b2obo6b2obo38bo2bo4bo2bo129b2o4b2o52b2o4b2o265bo3bo61bob 2o10b2o4bob2o39b2o93b2o8b2o2b2o4b2o13b2o27b2o133b2o23b2o$59bobo221bo6b 2o8b3o18bo3bo23bo4bo23bo7bo2b2o12b2o12b2o16b2o14b3o16b2o16b2o14bo17bo 154b2o6b2o16bobo150bobo8bobo62b2o91b2o5b2o91bobo4bobo4b2ob2obob2o2bobo 3bo11b2obob2o9bobo28bo24bo5b3o232bobo9bo17b6o22bo68bo72bobo96bo3bo4b2o 16bobo8b2o3bo8b2o27bob2o6bob2o342bob2ob2o164bobo125b2o93bo9bo3bo5bo 178b2o$58bo4bo39b3o14b2o160b2o18bo17bo5bo23b4o25bo5bo3bobo11bo13b2o15b o2bo17bo14bo16bobo13bobo13b3obo33bo58b2o43b2o22bo16b2ob2o150bo10bo72bo 183bo3b3o2bob3obob2ob3o3b2o17bob2o3b2o6b2o62bo211b3o19b2o3bo5bo16bo5bo 16bo5bo66b3o75bo60bo5bo27bo5bo3b2o16b2o11b2o10b2o382b2ob2o2b2o164bo 222bo9bo3bo5bo20b2o13b2o104bo$58b5o19b2o36bobo165b2o2b2o26b7o53b5o6bo 12bo29b4o14bobobo14bo15bo11b2obobobob2o8bo2bobo32b2o38b2o79b2o7bo13bo 2bobo2bo127bobobo44bobobo37bo12b2o180b2obobo2bobo13b2ob2ob2obo14bo4b2o bo265b2o17bo7b2o4bo11b6o22bo17b6o33bob2o6b2obo7b2o9bo74bo2bo61b2o3b2o 17b2o8bo3bob2o4bobo7b2o9bo8bo2bo137b3o251bo394b2o8b2o2b2o4b2o20b2o13b 2o104b3o34bo$63bo18b2o18bo2b2o9b3obo168bo2bo58b2o38b2o10b2o12bo14bobo 2bobo8bo3bo2bo12b3obo12b2obo10b2obobobobo7bo2bobobob2o28bob2o14b3o39bo 3bo21b2o17bo3bo13bo6b2o12bobobobobobo126bobobo44bobobo37b2o194bobobob 2o2bobobobo6bo14b2o8b3obo37b2o3b2o4bo219b2o15bobo7b2o4b2o32bo4bo41b3o 13b2obo6bob2o8bo9b2o72bobobo3b2o2bobob2o48b2o3b2o17b2o8bo5bo7bo7bobo6b 2o10bobo136bo3bo257b2o260bo2b2o4b2o2bo36bo2b2o4b2o2bo58b2obo6b2obo6b2o bo146bo32bobo$60b2o53b3o2bob2o162b3o4b3o26b3o26b2o28bo3b2o18b2obo7bobo 12bo8bo7bob2o5bo7bobo2bobo11bobobo2bo10bo3bo2bo6b2obo3bo2bo27b3o2bo13b 3o18bo3bo15bo4bo39bo4bo12bo3b2obo14b2o2bobo2b2o126bo3bo4bo3b2o2b2o5b2o 2b2o5b2o2b2o3bo4bo3bo43b3o2b3o2bobo177bobobo3bobobob2o6b2obobob2o5bo4b o8bobo37bo5bo5b2o234b2o13bobo34b2o44b3o10b2o14b2o6bobo81bo2bo4b2o2bobo b2o49bo3bo29bo3bo18bo7b2o92bo54bo5bo249b2o5b2o259bo3b3o2b3o3bo34bo3b3o 2b3o3bo57bob2o6bob2o6bob2o15b2o27b2o99b2o31bo2bo$38b2o2bo17bobo17b4o 16b2obo2bo13bo165bo8bo26bo2bo54b2o3bo19bob2o7bo2bo2b2o7bo8bo7bo5b2obo 7b2obobobob2o8bo3bobobo9bo4b2o8bobo4b2o30bobobo12b3o18bo4bo13bobobo21b o3bo14bobobo14b2o2bob2o18bobo109b2obo4b2o4b2o6bobo5b2ob3obo2bo3bo2b2o 2bo3bo2bob3ob2o5bobo34bobo2b3o2b3o4bob4o178b2ob4o2b2obo7bo2bob2obo6bo 4bo9bo49b2o7b2o338bo14bo8b2o82b2o10bo88b2o20b2o100bo54b2obob2o249b2o 267bo2b2o4b2o2bo36bo2b2o4b2o2bo62b2o2b2o14b2o9bo4bo9b3o3b3o9bo132bo2bo $38bobobo37bo3bo19bo16bo202b2o60b3o14b2o4b2o9bob2o8bobo2bobo10bo2bo3bo 10bo3bo2bo7b2o3bo2bo11b4o10bob5o33bobobo8b3o23bobobo5b2o4bobobo22bo4bo 12bobobo42bo110bob2o5bo5bo5bo3bo4bo3b2o2b2o5b2o2b2o5b2o2b2o3bo4bo3bo 33b4obo3bo3bo7b2o125b2o58b2o3bo8bobo4bo6bo4bo49bo3bo13bobo337bo16bo98b 2o103bo22b2o9b2o76bobo292bo24bo386bo3bo15bo9bobo3bob2o6b3o3b3o6b2obo$ 23b2o17bo17bo22bobob2o10b2o3bo14bo268bo14bo5bo8b2o14b4o11bobobo14bo4bo 9bo4bo17bo11bo4bo34bo2b3o6b3o24bobobo6bobo4bo25bobobo5b2o2bo4bo158b2o 2bo5bo6bobobo44bobobo33b2o9bo129b2o5b2o8bobo45bo2bo3b2o8b2o4b2o6bo2bo 51b3o16bo287b2o5b2o41b2o14b2o12bo85b2o71bo32b2o19bo2bo7bo2bo76bo292bob o15b2o2b2ob2o387bo3bo15bo8bobo4bo7bo2bo3bo2bo7bo126bobo4bo2bo52b2o222b 2o$22bobo15bo18bo21bobobob2o315bo5bo23bo2bo12bo18b4o11b4o13b5o13b4o36b 2obo7b3o25bo4bobo4bo3bo27bobobo6bobo3bo159bo3b2o4b2o5bobobo44bobobo44b o130bo14bo48b2o27bobo2bobo72b2o282b2o5b2o43bob2o6b2obo14bobo91b2o61bo 2bo30b2o20b3o9b3o76bo57bo233bo3bo15b2ob2obo387b2o2b2o14b2o5b2obob2o7bo 4bo7bo4bo129bo9b2o51bo2bo221b2o$40bo18bo21bo3bo12b2o18b2o283b2o4b2o24b 2o15b3o46bo58b2o3bo33bo3bo2b2o35bo4bobo169bo4bob2o28bo76bo58b2o37b2o 31bobo13bo2bo73b2o4b2o70bo2bo7bo217b2o107b2obo6bob2o13bo94b2o61bo2bo 55b9o79bo56bobo233bo3bo404b2obo6b2obo6b2obo7bob2o4bo6bo15bo125b2o2bo4b o58bo$20bobo15bo18bo21b2o3b2o319b2obo62b2o13b2o15bo17b2o37bo4b2o45b2o 30bo3bo2b2o4b2o160b2o4b2obo26b3o9b3o64bo58b2o5b2o21bo8b2o5b2o25b2o13bo bobo149bo7b2o3bo199b2o15bobo110b2o2b2o18bo100b2o35bo7b3o3b3o3bo43bobo 10bo2b5o2bo78bo56bobo138b2o94bo3bo403bob2o6bob2o6bob2o11b3obo3bobo17bo bo122b2obo2bob2o2b2o54bo$38bo17bo40b2o18bo201b2o2b2o2b2o76bob2o62b2o 13b2o14b2o17b2o42bo34b2o213b2obo10b2o23bo7b3o7b2o60bo65bo20b2obo14bo 22b2o6b3o3b3o3bo2bo149bo6bo5bo199b2o17bo36bo74bo2bo20b2o3b2o78b2ob2o3b 2o4bo2bo33bo2bo5bobo3bobo47b2o11b2o2b3o2b2o77bobo56bo139b2o95bo3bo437b o156b2o7bo54bob2o$18bobo15bo19bo21b2o209b2o6b2o20b2o2b2o2b2o22bo6bo 286b2o168bob2o11bo23b2o7b3o7bo110bo13bobo19bo16bobo21bo2bo5bobo3bobo4b 2o4bo145bo7b5o217b3o35b2o73bo4bo24bobo77b2ob2o3b2o2bo2bobo33bo2bo5b3o 3b3o3bo44bo100bo295bobo439b3o2b2o158bobo54b2o$36bo17bo22bo18b2o18b2o 88b4ob4ob4o70bo6bo14b2o20b2o13b3o6b3o60b2o390b2o14bo28b3o9b3o109b2obo 12b2o19bobo2bo12b2o20bo2bobo5b3o3b3o8b3o138b2o6bo2bo263bobo72b2o2b2o 15b2o9bo93bo36bo17bo2bo143bo57b2o237bo443bo162b2o$16bobo15bo17b2o21bob o128bo2bobo2bobo2bo13bo11b2o3bo3b2o55bo2bobo14bobo2bo11bo12bo54bo2bo2b o390bo15b2o39bo110bo37bo2bo40bo22bo129b2o9bobo8b2o334bob2o6b2obo12bo9b 2o88bob2o55bo2bo37bobo26bo2bo131b2o678b2obobobo6bo7bo440b2o$34bo35b2o 3bo19b2o18bo76b4o8b3o2b3o2b3o2b3o10b3o10b2o2b3o2b2o33b10o12b3o20b3o11b o2b3o2b3o2bo17b2o9b2o24b6o392bo23bobobo44bobobo35bo52bobo2bo20bo13b2o 23bo13bob2o23b2o128b2o9bo251b2o93b2obo6bob2o9b3o86b2o13bo39bo19bo39b2o 12b4o14bo507b2o301b2obobob3o3bobo5bobo197b2o75b2o4bob2o6b2obo4b2o4b2o 4b2obo125b2o$14bobo15bo18bo18bo2b2o91b2o3b2o3b2o14bo2bo8bo16bo8b3ob3o 10b3ob3o34bo10bo14b2o16b2o13b2obo2bo2bo2bob2o15bo2bo7bo2bo49b2o8b2o16b o5b2o17b2o6b2o13bo6b2o286b2o23bobobo44bobobo30b4o3bo4bo6bo38bo2bo20b3o 36b3o14bo165b2o237b3o11b2o116bo88b3o50bo2bo58bo12bo3bo10bo3bo507b2o 305b2o4bo3bo7bo198b2o76bo4b2obo6bob2o5bo5bo4bob2o$13bo18bo16b2o16b2obo 23b2o18b2o29b2ob2o15bo2bobo2bobo2bob2o8b3o2b3o6bo16bo8bo5bo10bo5bo33bo 12bo10b2o3b16o3b2o9bo3bo8bo3bo14b3o2b5o2b3o25b2ob3o18bobo6bobo15bobo4b o2b2o14bobo5bo13bobo5bo289b2obo10b2o7bo3bo4bo3b2o2b2o5b2o2b2o5b2o2b2o 3bo4bo3bo33bo3bo4bo4bo3b4o34b2o10b3o7bo22b3o3b3o7bo405b2o17bo27b3o188b 2obo49bo2bo62b2o11bo11b4o234b2o580b4o189b2o97bo3b2o14b2o2bo5bo3b2o4b2o 124bo$13b2o15bo36b2obob2o18bo52b2obo16b4ob4ob4obo9bo6bo6b3o12b3o7b2o5b 2o8b2o5b2o28bo2bo14bo2bo6bob2o18b2obo7b3o3bob6obo3b3o15b2o5b2o28b2obo 2bo19bo6bo17bobo5bobo17bo2b2obo13bobo2b2obo149b2o2b2o4b2o128bob2o10b2o 8bobo5b2ob3obo2bo3bo2b2o2bo3bo2bob3ob2o5bobo38bo3bobo3bo3bo49bobo7b2o 21bobo3bobo7b2o19b3o17b3o362b2o15bobo27bo192bobo49bo63bobo7bo2bo28b2o 220bo581bo192b2o97b2o3bo14bo3b2o4b2o2bo5bo104b2o3b2o13bobo$30bobobo13b o22bo3bo17bobo17bo34bo31bo9bo6bo8bo12bo8b2o7b2o6b2o7b2o27b2obo3b2ob2ob 2o3bob2o8bo20bo8bo7b8o7bo13bo9bo33bo2b2o13bob2o4b2obo14b2ob2o3b2obo15b ob2o3bo11b2obob2o3bo151bo3bo5bo151bo3bo4bo3b2o2b2o5b2o2b2o5b2o2b2o3bo 4bo3bo34bo7bo4bo47b3o3b3o30b3o3b3o28bobo17bobo3b2o374b2o29bo190bo2bo 103bo11bo39bobo207bo9bobo582bo213bo80bo16bo4bob2o5bo5bo123bobo$30bo2b 2o14bo22b4o14b2obob3o13bobo3bo30bob4ob4ob4o16bob2o6b3o2b3o6b3o12b3o7b 2o5b2o8b2o5b2o31bo3b2ob2ob2o3bo9bo2bo18bo2bo6bo2b3o12b3o2bo13b2obo3bob 2o27bo4b2obobo11b3o10b3o13bo9bob2o10b3o18b2obo157bo3bo5bo152bobobo44bo bobo35b2o5bo7bo44bobo32b2o39b3o17b3o3b2o433bo3bo159b2o104bobo51bo67b2o 137bobo8b2o37bo162b2o10b2o368b2o211b3o76b2o2b2o14b2o4b2obo4b2o4b2o104b o3bo15bo$47b3o43bo4bo14bobo2bo28b2obo2bobo2bobo2bo15b2ob2o8bo2bo8bo16b o8bo5bo10bo5bo32bo14bo9b3o2b16o2b3o5b2obo3bo10bo3bob2o17bo31bobo6bo12b o3bobo4bobo3bo10bo2b3o4b3o2bo9bo3bobo2bo15b2obo2bo151b2o2b2o4b2o151bob obo44bobobo41bo6b2o45b3o7b3o21bobo12b3o485bo3bo221bo3bo28b2o12b2o9b2o 38b2o68bo126b2o7bob2o46b3o160bo2bo8bo2bo559b2o18bo8b2o2bo67bo4bob2o6b 2obo10b2o2bo5bo106b3o$72b2o17bobob3o12b2obobo2bo32b2o3b2o3b2o29b4o8bo 16bo8b3ob3o10b3ob3o32bo14bo12b2o16b2o11bo3b3o6b3o3bo52bo2bo2b2ob2o12b 3o10b3o11b2obo9bo12b3o18b2obo163bob2o8b2ob2o161bo10bo112b2o12bobo6b2o 13bo14bobo6b2o702b2o3b2o27b2o12b2o9b2o95b2o12bo124bobo6b2ob2o45b5o97b 2o60b3o2b6o2b3o559b2obo16b2o3b2o2b2o3bo8bo56bo5b2obo6bob2o11bo3bo5bo 105b3o$46b6o20b2o18b2obo17bo2bo87b3o2b3o2b3o2b3o10b3o10b2o2b3o2b2o26b 2o2bo3b2o4b2o3bo2b2o5b2o22b2o8b2o2b3o6b3o2b2o18b2o36bob2obo15bob2o4b2o bo16bob2o3b2ob2o13bob2o3bo11b2obob2o3bo150b2o4b2obo8b2ob2o160bobo8bobo 55b2o8b2o43bobo12b3o6b2o12b2o5b2o7b3o6b2o426bo5bo35b2o232b2o3b2o41b2o 6b2o6bo3b2o86b2o4bo7bo8b2o113bo6b3obob2o44b2o3b2o96b2o63b2o6b2o565bo 21b2o7bo6b3o56b2o8b2o2b2o14bo3b2o4b2o121b2obob2o$51bo60b2o92bo2bobo2bo bo2bo13bo11b2o3bo3b2o26b2o2bo3b2o4b2o3bo2b2o5bob2obo14bob2obo12b12o21b o36b2o5bo17bo6bo18bobo5bobo16bo2b2obo13bobo2b2obo150bo8b2o7bobo162bo 10bo56bo10bo43bo44b2o29b2o3b3o17b3o386b3o3b3o33b2o5b2obo3bob2o217bo5bo 38bobo7b3o5bo3bobo83b2o5b2o8bo8b2o104b2o7bo2bo2bo2bo2bobo9b2o34b5o161b o10bo564bo26b4o6bo70bo2bo15b2o2bo5bo122bo5bo$47bobo156b4ob4ob4o66bo14b o11bo20bo14b12o21bo43b2o14bobo6bobo15b2o2bo4bobo14bobo5bo13bobo5bo149b o10bo5bobobobo229b10o43b2o6b2o67b2o3bobo17bobo385bo2b2ob2o2bo34bo5b3o 3b3o263bo10b2o6b5o76b2o5b3o5bo2b2o4bo115b2o7bo6b2o4bo10bo2bo32bo3bo80b o80b2obo4bob2o522b3o15b2o19bo2bo36b2o4b2o52b2o8bo4bo19bo5bo122bo3bo$ 49bo232b2o2bo3b2o4b2o3bo2b2o5bo2bobo14bobo2bo8b2o2b3o6b3o2b2o17b3o57b 2o8b2o18b2o5bo15b2o6b2o13bo6b2o148b2o8bo6bobobobo226b3o2b6o2b3o48bobo 71b3o17b3o385b3o5b3o41bo5bo278b2o4b3o77b2o6b2o6b5ob2o126bobo59bo81bo 16b3o44bo21b2o507b2o15bo4bo14bo2bo2b2o15b2o43bo54bo8b2o2b2o18b2o4b2o 123b3o$282b2o2bo3b2o4b2o3bo2b2o5b3o20b3o8bo3b3o6b3o3bo17bo302b2o5b2o3b 2o226bo2bo2b4o2bo2bo49b2o3b3o33b2o3b3o769b2o95b2o4bo133b2o20bo2bo19bo 2b2o4b2o4bo82bo11b2o2bob2o44b3o526bo2bo14b2o3bo15bobo4bo2bo55bobo53bo 5bob2o6b2obo10b2o4b2obo$286bo14bo12b2o16b2o8b2obo3bo10bo3bob2o307b2o 249b2o10b2o55bobo33b2o3bobo49bo418b2o37bo358b2o97b2o4b2obo6b2obo42bo2b o19bo3b3o2b3o3bo2b3o70b2o6b2o10b2o2b2o49bo542b2o21bo5bobobo54b2o54b2o 4b2obo6bob2o10b2o4bob2o106bo5bo$286bo14bo9b2o3b16o3b2o6bo2b3o12b3o2bo 7b2o9b2o266b2o21bo318b3o38b3o22b2o23b2obo417bobo26b2o8b2o457bo4bob2o6b ob2o33bobo6bobo21bo2b2o4b2o2bo3bo71bobo9bo12b2o48b2o23b2o500bo2bo14bo 2bo21b2obo2bo256b3o5bo$16bo38b2o18b2o209bo3b2ob2ob2o3bo9bob2o18b2obo6b o7b8o7bo6bo2bo7bo2bo264bobo20bo9b2o375bo22bo421bo27bo2bo5bob3o11b2o 357bo84bo9b2o2b2o4b2o32b2o7bo40bo70bobob2o2bo4bo86b2o25b2o4b2obo4b2o4b 2o454bo2bo14b2o8b2o12bo2bo259b3o3b3o$15b2o37bo16b2o2bo4bo5bo7bo5bo182b 2obo3b2ob2ob2o3bob2o8bo20bo9b3o3bob6obo3b3o7b3o2b5o2b3o264bo22b2o8b2o 314bobo38bobo14b3o8b3o3b3o5bobo2bo444b3ob2o8b2o10b2o358bo83b2o8bo3bo5b o33bo121bobobo7bo114bo4bob2o5bo5bo455bobo20b2obo2bob2o5bo4bo21b2o$15b 2o40bo13bobobo2b2o2bobo2b2o3b2o2bobo2b2o15b2o163bo2bo14bo2bo6bo2bo18bo 2bo9bo3bo8bo3bo12b2o5b2o35bo11bo79b2o11b2o123b2ob4o336b2o9bo29b2o9bo 13bo4b2o4bobo3bobo5bo2bo60bo386bob2o8b2o128b2o25b2o212b3o94bo3bo5bo41b 2o113bo5b3o115bo3b2o4b2o2bo5bo6b2obo3bob2o440bo21bo4bo2b2o5b5o17b2o2bo 2bo234b2o3b2o$15bo5bo3bobobobo3bobobobo3bobobobo3b2o16bobob3o2bobo2b3o b3o2bobo2b3o4bo5bo4bo2b2o163bo12bo10b3o2b16o2b3o10b2obo2bo2bo2bob2o12b o9bo33bobo9bobo78bo2bo7bo2bo122bobobo2bo337bo5bo2bo31bo5bo2bo18bo2bo3b 3o3b3o6b2o60bobo155b2o229bo10bo47b2o25b2o54bo25bo80b2o217b2o8b2o2b2o4b 2o27bo13b2o111bo2bo26bo95b2o2bo5bo3b2o4b2o5bo2bo3bo2bo466bo29bo2bo4bob o234b2o3b2o14bo$19bobobobo5bobobo5bobobo5bo20b2obo2b2o2bobo2b2o3b2o2bo bo2b2o3b2o2bobo2b2o2bobobo164bo10bo14b2o16b2o14bo2b3o2b3o2bo13b2obo3bo b2o33bobo11b2o12b2o4b2o44bo5bo7b5o3b5o84b2o37bobobo337b3o5bobobo28b3o 5bobobo18bobobo13b2o64bob3o40b2o111b2o267bob2o4b2o4b2o6bo25bo55bobo21b obo80b3o217bo4b2obo4bo5bo28b2o128bo26bo100bo5bo4bob2o8b3o3b3o152bo11bo 14bo11bo241bo6b2o22bobo13bo15bobobo5bo255bo$13b5o5bo4bo4bo4bo4bo4bo4b 6o16bo4bo5bo7bo5bo4b3o2bobo2b3obobo167b10o14bo20bo13bo12bo18bo38bo13bo 12bo2bo2bo2bo43b2o3b2o12bobo22b2obo64bo21b2o12b2o2b2o338bo7bo2bo29bo7b o2bo20bo2bo13bobo60bob2o4bo16b2o4b2o8b2o3bo2bo99bo11b2o240bo26b2obo5bo 5bo6bobo21bobo34b2o20b2o12b2o7b2o67bo15b2obo213bo5bob2o5bo5bo15bobo8bo bo99b2o2b2obo6b2obo7bo3bo26bo95b2o2b2o4b2o4b2obo168bobo9bob4o6b4obo9bo bo207b2obo6b2obo6b2obo8b3o5b2o37bobo15bo2bob2o258b3o$13bo4bo4b6o4b6o4b 6o9bo16b2o29b2o2bobo2b2o2bob2o190b2obo14bob2o14b3o6b3o57b2obo10bobo11b o3b2o3bo14b2o16b2o9b2o3b2o9b4ob4o19bob2o7b2o12b2o6b2o20b2o10bo18b2o2bo 12bo4bo348b2o39b2o25bo14bo52b2o6b2o3b2obo17bo4bobo8bo3b2o100bobo11bo 240b2o23b2o8bo5bo8b2o7b2o12b2o36bo33bo76bobo4b3o8bo2bo12bo200b2o2b2o8b 2o4b2o15bo3bo109bo2bob2o6bob2o7bo3bo5bo19b2o63bo32bo4b2obo10b2o167bo9b obob3o6b3obobo9bo208bob2o6bob2o6bob2o7b3obo44bo19bo2bo$14bobo37bobo51b o5bo4bo170bo6bo53bo6bo62bo13bo8b2o3bo2bo3b2o9bo2bobo15b2o10bo3bo9bo2bo 3bo2bo16b2o4b2o6bo12bo8bo20bo10bob3o15bobobo12b5o248b2o9b2o153bobo8b2o 5b2o50bobo9b2obob2o16bob2obo2bo7bob2o2b4ob2o94bo11bobo225b2o13b2o10b2o 11bo8b2o4b2o18bo49bobo30b2o4bo70bobo16b2obo11bobo106bo96bo9bo5bo6b2o 12bo10b2o96bo7b2o8b2o9bo4b2o17bo42b2o21b3o12b2o16bo5bob2o11bo176bobo 16bobo215b2o4b2o2b2o4b2o2b2o4b2o6bo3bo64bo4bo$16bo8b2o8b2o8b2o9bo61b2o 169b2o6b2o20b2o2b2o2b2o102bo11bo4bo4bo4bo7bobobobo41b2o7b2o16bo5bo7bob o8bobo8bobo16bobo10bobo2bo15bo2bob2o7b2o3bo4bo243bo2bo2b3o2bo2bo20b2o 2bo138b2o51b2obo2bo6b5obo20b2obobob2o6b2obobobo3bobobo100b3obobo226b2o 9bob3o11b2o10bo11bob2o15bo4b2o49b2o7b2o22bo3b2o64b2o3bo2bo7bo2b2o2b3o 14b2obo7b2o96b2o91b2o3bo9bo5bo5b2o8bo4bo7bo2bo96b2o6bo9bo7bo2bo5bo7b3o 6bo4bo37bobo20bo3bo11b2o16b2o2b2o4b2o8bo166b5o7bo18bo7b5o204bo5bo3bo5b o3bo5bo8bo3bo64b5o$25b2o8b2o8b2o272b2o2b2o2b2o89b3o9b3o3bo6bo3bo6bo3bo 8bo2bob3o11b6o9b3o14b3o21bo5bo7b2o8b2o10b2o16b2o8b2obo2b2obo17bob2o6bo 2b3o3b2ob2o190bo50b3o2b5o2b3o16b2o2b2o3bo189bob2obob2o4bo5bob2ob2obo 20bo6bobobobo2b2obobobo91b5o4b4obo4bo2bo232b2o24b2o10b2obo15b2o3bo61bo 22bo68b2o4bobo7bo3bo2b2o15b2ob2o6bobo94bobo92bo2b2o8b2o4b2o19bo7bo109b o9bo8bo14bobo6bo9b2o31bo22b2ob2o33bo5bo9b2o164bo4bo7b2o16b2o7bo4bo204b o5bo3bo5bo3bo5bo8bob3o308b2o$151bo267b2o8b3ob3o8bobo8bobo17bo9bo5bo8bo 3bo12bo3bo19b2o4b2o58bobobobobo17bo9b2obo5b2ob2o3b2o184bobo52b9o19b2o 7bo189bo4bo8b4o5b2o14bob2ob2ob2o13bobo2bobob2o89bo4bo8bo5bo207b3o25bo 27bob2o10b2o17bo57bo4b2o97bobo6bo2bo20b2obob3o6bo187bo5b2obo6b2obo17bo 3bo7bo100b2o6b2o8b2o6bobobo12b3o8b3o5bobo29b2o56b2o3bo5bo173bo2bo10b2o 16b2o10bo2bo202b2o4b2o2b2o4b2o2b2o4b2o9b3o66bo242bo17b5o$151bo293bo4b 2o4bo8b4o3b4o9bob2o54b2obo12b6o16b6o2b6o12bobobobob2o7b2o5bobo12bo14bo 174b2o8bo30b2o21bo9bo23b4o188b2ob4obob2o4bobo3bo2bobo3bo12b2o3b3ob2obo b3obo2b3o3bo91bo2bo16bo4bo203bo55b2obo11bo75b2o3bo22bo77bo8b2o20bobo2b o2bo2bo2bo7b2o95b2o81b2o4bob2o6bob2o17bobo9bo73bo2b2o4b2o2bo14bo2b2obo 6b2obo7bobob2o28b2obobo88bo2b2o4b2o170bo2bob2o10b2o16b2o10b2obo2bo201b 2obo4bo5bo5b2obo12bo66bobo242b3o13bob3obo$151b2o263b3o2b3o7bo2bo10bo4b 2o4bo8bo17b2obobo54bob2o61bo4bo2bo7bobo4b2o13b2o3b2ob2o5bob2o172bo9bo 2bo26b2obo19b2o7b2o214bobo4bobo4b2ob2obob2o2bobo3bo2b2o3bo3bobo2b2obob 2ob2o4bobo4bobo62b2o4b2o4b2obo10bo2bob2o15bobo2b2o157b2o5b2o38bo58b2o 8bo18bo61bo22bo3b2o105bo4b2o6bo7b2o95bobo130bo2bo5b2o61bo3b3o2b3o3bo 12bo3bob2o6bob2o7bobo5b3o23bobobo88bo5b2obo10b2o13b2o144bobobo5bo34bo 5bobobo200bob2o5bo5bo4bob2o80bo245bo14bo3bo$13b2o138bobo80bo3bo5bo6b2o 189bobo8bobo8b3obo2bo10bobo13bo3bo12bo3bo25b2o7b2o8b2o10b2o16b2o11b2o 3bo10bo3b2o20b2ob2o3b3o2bo128bo4bo38bobo8bo2bo29bo243bo3b3o2bob3obob2o b3o3b2o6bo2bo2bo3bobo2bo3bobo4b2obob4ob2o64bo5bo4bob2o9bobobo5bo10b2ob o162b2o5b2o55bo3bo38bo8b2o13b2o3bo82b2o4bo115bobo107bo132b2o5bobo59bo 4b2o4b2o2bo13b2o6b2o2b2o12b2o9bo16b2o5bo32b2o56b2o4bob2o10b2o13b2o145b o2bo4bobo32bobo4bo2bo199b2o4b2o2b2o4b2o2b2o4b2o340b3o$13bo136bo2bobo 75bo4bo3bo4bo2bo2bo3bo36bo24bo24bo76b2o9b3ob3o6bo3bo6bo3bo9bobobobo9bo b2o2b2o9b3o14b3o26bo7bobo8bobo8bobo16bobo12b3o16bo22bo4bo3b2o127b2ob4o b2o37b2o9b2o27bo243b2obobo2bobo13b2ob2ob2obo4bobo7b2o5b4o8bo4bo65bo5bo 9b2o8bo2bo4bobo238bo5bo9b2o25bo24bo4b2o59bo22bo80b2o38b2o98b2o8b2o140b o58bo37bo3bo19bo4bo15b3o3bo2bo32bo22b2ob2o214b2o2bo2bo32bo2bo2b2o202bo 5bo3bo5bo3bo5bo49bo292bo$14bobobo15bo5bobo105b2obo4bo29b2o6bo5bo3bo19b o3bo7bo3bo13bo35bo3bo124b3o7bo3b3o7bo4bo4bo4bo9bobo2bo7b2obob2o2bobo 21b2o7b2o23bo6bo12bo8bo20bo8b3o13b7o27b5o61bo4bo23bo4bo26bo8bo4bo80bob 2o240bobobob2o2bobobobo6bo14bo5bob2ob2obo5bo4b2obob2obo65b2o4b2o8bo12b 2o2bo2bo238bo15b2o25b2o28bo56b2o3bo22b2o7b2o69bo15bo102b2o9b2o8b2o150b 2o56bo3bo26b2o7bo3bo22bo15b5o5bo32bobo20bo3bo11b2o206b2o34b2o208bo5bo 3bo5bo3bo5bo47bobo66bo$18bobobobobobobobobobobo2bo2bobobobobobobo32b2o 31b2o27b2ob2o2b3o24bo3bo2bo2bo4bo3bo4bo9bo4bo3bob2ob2obo3bob2ob2ob4obo 57b2obo5bob2o15b2o3b2o88bo9b2o3bo2bo3b2o11b2o10b2obo7bo7bo3bo9bo2bo3bo 2bo22b2o5b2o12b2o6b2o20b2o7bo2b2o11bo32bo4bo13b2o4bob2o36b2ob4ob2o19b 2ob4ob2o24bo96b2o240bobobo3bobobob2o6b2obobob2o20bob5o6bo2bob2o68bob2o 11bo16b2o7bo2bo2bo225b2o3bo33bob2o10b2o7b2o7b2o12b2o43bo4b2o30bobo57bo 8bobo13bobo10bobo89bobo9b2o217b5o27bo6b2o2b2o19b2o18b3o2bo3bo33b2o21b 3o12b2o451b2o4b2o2b2o4b2o2b2o4b2o48bo$14b2o4bo2bo2bo2bo2bobobo2bobobo 2bo2bo2bo2bo2bo30bo2b3o3b3ob3o3b3ob3o3b3o2bo24b2o2b3o3bo27bo13bo3bo7bo 3bo7bo3bo7bo3bo8b2o60bo5bo5bo15b7o72bo11bo15bo3b2o3bo28bo7b2o5b2o3b2o 9b4ob4o19b2obo63bobo13b2o27b2o2b2o15bo4b2obo38bo4bo23bo4bo25bobo338b2o b4o2b2obo7bo2bob2obo16b2obob2o9bobo74b2obo10b2o23bobo4b2o194b2o14b2o 15b3o34b2obo10b2o6bobo21bobo47bo33bo57b2o7b2o15b2o10b2o81b3ob2o4b3o7bo 6bo211b2o3b2o25bo3b2obo6b2obo15bo20b2o2bo3bo57bo239b2o227b2obo6b2obo6b 2obo116bob3o$19bobobobobobobo2bo2bobobobobobobobobobobo2bo8bo20bob4ob 4ob4ob4ob4ob4obo24bo3b3o2b2o29bob4ob2ob2obo3bob2ob2obo3bob2ob2obo3bo4b o9bo44b9o15b2ob2ob2ob2o95bob2o9bobo12bo2bo2bo2bo28bobo12b2o3b2o12bobo 22bob2o64bo14b2o26bobobo16bo3b2o103bo58b3o27b3o28b3o28b3o193b2o3bo8bob o4bo17bob2o3b2o6b2o79b2o4b2obo26b2o200b2o15b2o73bo25bo36b2o7b2o12b2o 20b2o44b2o11b2o29bo6bo81b4o2bo4b3o12bobo211b5o26b2o2bob2o6bob2o15bo28b o297b2o177b2o48bob2o6bob2o6bob2o48b5o65b2obo202bo17b2o$14bo2bo15bobo5b o15bobo2bo4bobo19b2o31b2o21b3o2b2ob2o35b2o8bo3bo7bo3bo7bo3bo59b2o5b2o 42bo5bo74bo11bo14b2o4b2o30b2o12bo5bo7b5o3b5o125bo2bobobo16b2o3bo103bo 58bobo27bobo28bobo28bobo191bo2bo3b2o8b2o4b2o16bo4b2obo88bo4bob2o241b5o 15b3o55b2o25b2o34bobo21bobo64b3o3bo7b3o9b3o15b3o91b2o4b3o12bo3b2o3b2o 159b2o44b3o60bo25bo2bo120bo21b2o129b2o46b2o153b2o120bo4bo64bob2o201bo 18b2o$16bobo40bobo2bo3bo2bo20bo2bobo2bobo2bobo2bobo2bobo2bo28bo4bob2o 39bo9bo4bo3bo4bo65b2o7b2o16b2o3b2o14b2obobo3bobob2o68bobo10b2o79bo2bo 7bo2bo124b4ob2o21bo104bo5b2o2b2o47b3o27b3o28b3o28b3o191b2o40b3obo90bo 3b2o16b2o227b4o14b2o3bo117bo25bo61bob2o4b4o5b2o29bobo95bobo13bo3b2o3b 2o19b2o138bobo44bo81b3o5bo122b2o9b2o7bobo15b2o112b2o46b2o278bo2bo19bo 44b3obo199b3o$16bo44bobo2bo22b2obo2bobo2bobo2bobo2bobo2bobo2bob2o26bob o2bo56bo3bo70bo9bo10b2o15b2o8bo4b2ob2o4bo13bo54bobo11bobo77b2o11b2o 128bo19b2o2b2o13bo4bo84bo5b2o2b2o5bo371bobo90b2o2bo17b2o7bo4b2o231bo 15b2o104b2o25b2o53b2o5bo2bo4bo4bo2b2o10bo3bo19b2o92b2o14bo3b2o24bobo 139bo124bo7bobobo119b2o10b2o7bo17b2o112b2o46b2o154bo123b2obo2bo15bobo 37b2o$63bobo4b2o17b2obo2bobo2bobo2bobo2bobo2bobo2bob2o26bobo155bo2bo3b obobo3bo2bo5b2obob2ob2ob2ob2obob2o10b2o19bo2bo31bo13bo219bobo20bo4bob 2o7b2ob4ob2o21b2o2b2o26b2o2b2o22bobo15bo372bo96bo16b2o8bo2bo2bo2b2o 208b4o14bo5bo9b2o186b2o5bob2o5bo3bo2bo11bo3bo15b2obo111bobo28bo139b2o 123bo4bo2b2obobo139b3o93b2obo4b2o4b2o4b2obo13bo20bo4bo20bo133bo2b2o16b obo119bo5bobobo15bo36bo2bo6bo179b2o$65bobo25bo5bo3bo5bo3bo5bo33b2o128b 2o2b3o5b3o2b2o7b3ob9ob3o6bo2bo2bo7bo2bo2bo29bobo2bobo263b2o20bo5b2obo 9bo4bo23b2o2b2o26b2o2b2o23bo15bobo36b2o2b5o2b2o17b2o2b5o2b2o18b2o2b5o 2b2o18b2o2b5o2b2o128b2o196b2o17bo6b3o2bobo4bo2bo205b5o14bo3bo208b3o3b 2obo34b3o114bo29b2o250b2o12bo9bobo60b2o173bob2o5bo5bo4bob2o12bobo20bo 2bo20bobo131bo3b2o2b2o7b2o2bo2bo118bobo4bo2bo28b2o213bobo$67bobobo82bo 128bo2bob2o5b2obo2bo10bo4bo4bo10bo2b2o9b2o2bo8b2o2b2o14b3o6b3o283b2o8b 2o97bo5b2o2b2o5bo37bobobo3bobobo17bobobo3bobobo18bobobo3bobobo18bobobo 3bobobo85b2o40bobo192b2o4b2obo12bobo11bo5bobobo191b2o15b2o227b2o23b3o 15b3o396b2o2b2o10b2o6b2o36b2o23b2o177b2o2bo5bo3b2o11b3obobo19b3o2b3o 19bobob3o126bo7b2o7b2obo122bo2bo2b2o17b5o5b2obo2bob2o19bo2bo187b3o$72b o81bo129bobobo7bobobo10b2o9b2o10b2o4bo3bo4b2o8bobo17bo3bob2obo3bo293bo 103b2o2b2o5bo38b3o5b3o19b3o5b3o20b3o5b3o20b3o5b3o85bobo40bo194b2o4bob 2o7b3obobo15b2obo2bo192b2o14b2o668b2obo2b2o11bo45bo202bo3b2o4b2o2bo12b 4obo48bob4o127b4o16b2o121b2o21bo4bo5bo4bo2b2o20bo2bo187b2o$71b2o210b2o b2o9b2ob2o9bo11bo11bob4o3b4obo9bo5b2o13b2obob2obob2o283b2o8bo115bo42bo bo27bobo28bobo28bobo51b2o3b2o31bo40b2ob4o207b4obo4bo2bo8bo2bo881b3o16b o42b3o103b3o98bo4bob2o5bo15bo50bo296bo2bo12bo26bobo184b2o$282bo2bo3b3o b3o3bo2bo9bo9bo12bobo9bobo8b2o12b2o8bo6bo286bo8b2o114bo40bobobobo23bob obobo24bobobobo24bobobobo48bo2bobo2bo28b2ob4o35bobobo2bo211bo5bo8bo4bo 455bobo9b3o431bo42bo21b2o82bo99b2o4b2obo4b2o222b2o136bo2bob2o9bobo28bo 185b3o$283bobob2o7b2obobo9b2o9b2o9b2o2bo2bobobo2bo2b2o13bo6bo9bob4obo 79bo11bo10b2o6bo14bo6b2o151bo5bob2o38bo4bo21b2o3bo2bo3b2o36bobo33b2o4b 7o4b2o11b2o4b7o4b2o12b2o4b7o4b2o12b2o4b7o4b2o12b2obo6b2obo12b2o3b2o3b 2o3b2o23bobobo2bo35bobo221bo4bo4b5o457b2o503b2obo4bob2o77bobo93b2obo 10b2o4b2obo29bo6b2o6bo173b2o79b2o54bobobo5bo236b3o$83b2o2b2o8b2o8b2o 175bo2bobo5bobo2bo33bobo3bobobo3bobo19bobo7b2obob2obob2o57b2o3b2o12bob o9bobo10bo4b3o13bobo5bo152b2o4b2obo36b2ob4ob2o19b5o4b5o37bo34bo2b2o4bo 4b2o2bo11bo2b2o4bo4b2o2bo12bo2b2o4bo4b2o2bo12bo2b2o4bo4b2o2bo12bob2o6b ob2o12bo15bo23bobo7b2o29b2o2bo220bobo2b2o466bo9bo3bo346b2o64b2o76bo10b o78b2o93bob2o11bo4bob2o27bobo6b2o6bobo251bobo55bo2bo4bobo35b2o198bo$ 31bob2ob2o6bo6b2ob2obo25bo2bo2bob2o3bo2bob2o3bo2bob2o4b2o171bobobo38bo 2b3o3bo3b3o2bo14b2ob3o7bo3bo4bo3bo55bobo3bobo11bobo9bobo9bo4bo16bobo3b obo200bo4bo21b2o3bo2bo3b2o23bo4bo8bo35b3obo7bob3o13b3obo7bob3o14b3obo 7bob3o14b3obo7bob3o17b2o2b2o4b2o7b2obo15bob2o18b2o2bo7b2o5b2o21bo4b2o 6b2o209b2obo11bo290b2o25b2o4b2o25b2o117bo3bo346b2o64b2o77b2o6b2o172b2o 14bo3b2o4b2o6bo2bo16b2o14b2o16bo2bo232bo43b2o15b2o2bo2bo35b2o186b2o11b o$31b2obobo3b2obobob2o3bobob2o26bob2obobo2bo2bobobo2bo2bobobo2bobo2bo 166b4o2bo2b4o35b2o2bo2b3o2bo2b2o17b2o10b3obo2bob3o28b2ob2o7b3o14bo5bo 10b3ob2o7b2ob3o7b2o3b2o12b2obob2o2b2o4bo258b2ob4ob2o48b2ob2o25b2ob2o 26b2ob2o26b2ob2o23bo3bo5bo6bo2bob2o13b2obo2bo15bo4b2o13bo22b5o8b2o5b2o 216bobo290bo25bo6bo25bo129bobo479b3o2b6o2b3o169bo15b2o2bo5bo10bo50bo 234b2o4b2o37b2o20b2o224b2o$34bo3bo2bobobobo2bo3bo28b2o2bobo3b2ob2obo3b 2ob2obo3b2ob2obo167bob7obo38b2ob2o3b2ob2o17bo2bo12bob4obo31bob2o40bo 19bo25bob2o9b3o260bo4bo46b2o9b2o17b2o9b2o18b2o9b2o18b2o9b2o20bo3bo5bo 5b2obo5b3o3b3o5bob2o15b5o13bobo20b2o4bo15bo218bo291bobo21bobo6bobo21bo bo119b3o7b2o17bo29bo432bo2bo8bo2bo170bo19bo5bo5bo4bo48bo4bo237bo9b2o2b o$34bo2b3o3bobo3b3o2bo27bo2bo4bo4bo4bo4bo4bo4bo3b2o164bobo9bobo36bo2bo 5bo2bo18b2o49b2o12b2o2b2obo26b3ob2o7b2ob3o7b2o10b2o9b2o6bo93b2o16b2o6b 2o16b2o176bo11bo17bo11bo18bo11bo18bo11bo19b2o2b2o4b2o8bo5bobo3bobo5bo 16b2o4bo13b2o20bo2b2o5b3o8bobo203bo2bo304b2o12b2o7b2o8b2o7b2o12b2o131b o15bo3bo25bo3bo25b2obo6b2obo392b2o10b2o170b2o18b2o4b2o5b2o2bobo46bobo 2b2o234b3o6b2o2b2o3bo279bo$33b2obo5bobobo5bob2o26b2o2b3obob2o2b3obob2o 2b3obob2o2b3o2bo161b3obo2b2ob2o2bob3o31b2obob2o5b2obob2o69bob2o7bo4bob o10b2ob2o13bob2o7b2obo9bobo2bo6bo10bo2bo4b2o93bo7b2o7bo8bo7b2o7bo178bo 9bo19bo9bo20bo9bo20bo9bo16b2obo6b2obo10b2o4b3o3b3o4b2o15bo2b2o5b3o3b3o 24b2obo6bobo8b2o206b2o317bo30bo129bo35bo29bo24bob2o6bob2o192b2o384b2ob o10b2o4b2obo12bob2o42b2obo239bo8b2o7bo3b2o16b2o250b2obobobo$36bo2b2obo 3bob2o2bo31b2o2bob2ob3o2bob2ob3o2bob2ob3o2bobo2bo158bo5bo2bobo2bo5bo 30bobob2ob2ob2ob2obobo65bo3bo2bo14bo7b2o2bobo2b2o35bo2b2o4bobo11b3o99b obo3bo4bo3bobo8bobo3bo4bo3bobo177b2o9b2o17b2o9b2o18b2o9b2o18b2o9b2o15b ob2o6bob2o46b2obo6bobo3bobo27bo6b3o3b3o528b2o4bo20bo4b2o129b2o28bo4bo 24bo4bo22b2o4b2o8b2o22b2o31b2o133bobo383bob2o10b2o4bob2o315b4o5bo16b2o bo248bob2ob2o10b2o$33b2o2b3o2b2ob2o2b3o2b2o26b2ob2o2bobobob2o2bobobob 2o2bobobob2o3bob2o159bob2obobo3bobob2obo33bo4bo3bo4bo70b2obo6bo14b3obo bobobob3o12b2o3b2o11b3o5b2o2b2o15b2o98b2o2bo6bo2b2o10b2o2bo6bo2b2o296b 2o14b2o47bo6b3o3b3o27b2o11bobo368b2o5b2o46b2o5b2o97bo3b2o20b2o3bo129b 2o3b2o25b5o25b5o22bo5bo9bo6b2o15bobo7b2o11b2o7bobo15b2o119bo11bobo713b 3o20bo259b2o4bobo$29b2obob2o3b2ob5ob2o3b2obob2o22bo37bo163b2obobo5bobo b2o34b2obobo3bobob2o68bo11bobo4bo6bo4b2o3b2o4bo10bobo3bobo10bo7bo17b2o bo3bo98bo8bo16bo8bo299bo15bo48b2o54b3o368b2o5b2o46b2o5b2o98bo11bo4bo 11bo136b2o67b2o13bo5bo9bo5b2o17bo7b2o11b2o7bo17b2o104b2o10bo2bo10bo2bo 4bo399bo2bo42bo2bo164b2o93bo22bo260b2o3bo$29b2ob2o4bo11bo4b2ob2o23b2ob obobobobobobobobobobobobobobobobobo167bo7bo43b2ob2o71bobo11bob2o2b2o7b 4o7b4o9b3o7b3o34b2obobob3o96bo8bo16bo8bo300bo15bo646b2ob4ob2o145bo69bo bo11b2o4b2o8b2o22b3o29b3o120b3o13bo9b2o5b2o400b2o46b2o164bobo112bo2bo 259bo$32bo2b2obobo7bobob2o2bo27bob34o42b2o16b2o39b2o6b2o6b2o3bob2o88bo b2obo5bob2obo65b2o30bo7bo11bo3b7o3bo16bo20b2o4bo27b2o16b2o6b2o40bo8bo 16bo8bo124bo174b2o14b2o506b2o5b2o41b2o78bo11bo4bo11bo207bo13b2obo6b2ob o167bo8bob2o12bobo8b2o3bo8b2o110b2o307b2o92b2obo6b2obo6b2obo74bo113b2o $29b2o2b3o2b2ob7ob2o2b3o2b2o22bo2bobobobobobobobobobobobobobobobobo39b 2o3b2o3b2o6b2o3b2o3b2o24bo8bo2bo4bo2bo4bo2bo2b2obo88b2obobo5bobob2o84b 3o9bo9bo10b2o2bo5bo2b2o15bobobob2o16b4o29bo16bo8bo27b2o8b2o2bo6bo2b2o 10b2o2bo6bo2b2o120b3o175b2obo6b2obo508b2o5b2o31b2o7bobo15b2o60bo3b2o 20b2o3bo206b2o12bob2o6bob2o167bobo6bo2bo5bo6b2o11b2o10b2o110b2o307b2o 92bob2o6bob2o6bob2o74b2o90b2o$21b2o2b2obob2o3b2ob13ob2o3b2obob2o2b2o 14b2obo33b3o26b2o3b2o2bo10bo2b2o2bo10bo2b2o3b2o11bo2bobo4bo3b2o2bo3b2o 2bo3bobo5bob2o89bo7bo100b2o7b2o17bo21bob2ob2obo16bo32bobo12bobo8bobo 25bo8bobo3bo4bo3bobo8bobo3bo4bo3bobo118b5o174bob2o6bob2o16bo7bo523b2o 6b2obo15b2o59b2o4bo20bo4b2o119bo103b2o2b2o172bobo5bob2o5bo11bo8bo2bo 99bo4bo30bo4bo385b2o2b2o8b2o4b2o163bo2bo$18bo2bo3b2ob2o4bo19bo4b2ob2o 3bo2bo13bobobobobobobobobobobobobobobobobobo3bo23bo3bobo2bobo2b6o2bobo 2bobo2b6o2bobo2bobo3bo9b4obo2b6o2b6o2b6o2b6obobo225bobo20bo25bo32b2o 12b2o10b2o23bobo8bo7b2o7bo8bo7b2o7bo326bobo5bobo73bo457b2o78bo30bo117b 4o3bob2o96bo3bo29b3o14b2o13b3o96b2o11bo2bo7b3o13b2o10bobo97b2ob4ob2o 26b2ob4ob2o267b2o34b2o78bo3bo9bo5bo164bo309b2o$17bobobo6bo2b2obobo15bo bob2o2bo6bobobo12bob33obo2bo21bo2bobob4obobo6bobob4obobo6bobob4obobo2b o13bobo5bobo5bobo5bobo5bobo6b2o220bo20b2o24b2o37bo4bo20bo4bo14b2o8b2o 16b2o6b2o16b2o326bo7bo31bo7bo33bobo375b3o3b3o23b3o3b3o41bo65b2o12b2o7b 2o8b2o7b2o12b2o96b2o5b4o4bobob2o2b2o91bo3bo11b2o17bo13bo2bo12bo17b2o 79b2o11bobo9b2o14b2o111bo4bo30bo4bo264b2o2bo2bo32bo2bo2b2o74bo3bo9bo5b o20bo142bo55b2o220bo19b3o2bo5bo3bo$16bo2bob2o2b2o2b3o2b2ob15ob2o2b3o2b 2o2b2obo2bo9b2obobobobobobobobobobobobobobobobobob3obo21b2o3bo2b2o2bo 2b2o2b2o2bo2b2o2bo2b2o2b2o2bo2b2o2bo3b2o10b2obobobobo3bobobo3bobobo3bo bobo3bobo5bo304b2ob4ob2o16b2ob4ob2o3bo4bo20b2o2b2o23b2o2b2o369bobo5bob o33bo7bo367bo2bo3bo2bo22bo2bobo2bo106bobo21bobo6bobo21bobo95b2o5bo2bo 3b2obob2o2bobo89b2o2b2o11b2o15bobo14b2o13bobo15b2o91bobo292bo3bo3bo 141bo2bo4bobo32bobo4bo2bo70b2o2b2o8b2o4b2o20b3o140bob2o52bobo9bobo207b 2o14bo3bo9bo5bo$16bob2o4bob2o3b2ob21ob2o3b2obo4b2obo9bo2bo36bo30b2o5b 2o2b2o5b2o5b2o2b2o5b2o17bo5bobo3bobobo3bobobo3bobobo3bobobobob2o307bo 4bo20bo4bo3b2ob4ob2o18b2o2b2o23b2o2b2o72b2o3bo106bo18bo166bo7bo41bobo 366bo3bobo3bo24b2ob2o43bo64bo25bo6bo25bo102b4o3b2o8b3o7b2o75b2obo6b2ob o24b2o31b2o108bo9bo22b2o9b2o247b3o2bobo2b3o138bobobo5bo34bo5bobobo65b 2obo6b2obo4bo5bo24bo31b2o108b2o54bo8bo198bobo8bobo12bobo4bo8bo3bo2bo$ 13b2ob2o3b2ob2o4bo27bo4b2ob2o3b2ob2o7bo2bobobobobobobobobobobobobobobo bobobo24b2o3bo2b2o2bo2b2o2b2o2bo2b2o2bo2b2o2b2o2bo2b2o2bo3b2o9b2o6bobo 5bobo5bobo5bobo5bobo116bo188b2o12b2o10b2o14bo4bo13b2o16b2o8b2o16b2o66b obobobo104bobo16bobo216bo366b2obobobobob2o70b2o63b2o25b2o4b2o25b2o102b 4o3b2o8b3o6b2o75bob2o6bob2o178b2o19bo2bo7bo2bo64b2o2b2obo6bob2o163bo5b obo5bo138bo2bob2o10b2o16b2o10b2obo2bo66bob2o6bob2o5bo5bo22b2o31bo165b 2o2b2o2bo4bo194bo3bo19b2o16bo$13bobo3b2obobo2b2obobo23bobob2o2bobob2o 3bobo8b2ob32ob2o23bo2bobob4obobo6bobob4obobo6bobob4obobo2bo15bobob6o2b 6o2b6o2b6o2bob4o34b2o20b2o24b2o27bo2bo184bobo12bobo8bobo23b2o9bo7b2o7b o10bo16bo41b2o26bobobo106bo16bo585b2ob2o3b2ob2o19bo11bo37b2obo15b2o 212bo12b3o275b2o20b3o9b3o65bo2bob2o6b2obo162bob5obob5obo140bo2bo8bo2bo 16bo2bo8bo2bo73b2o2b2o4b2o2b2o4b2o56b3o166b2obo2bob2o184b2o12bo10b2o7b 2o17bo3bo3bo$15bob2obobo2b3o2b2ob23ob2o2b3o2bobob2obo11bobobobobobobob obobobobobobobobobobo26bo3bobo2bobo2b6o2bobo2bobo2b6o2bobo2bobo3bo16b 2obo5bobo3bo2b2o3bo2b2o3bo4bobo2bo32bo4bo16bo4bo20bo4bo25bo2bo184bo16b o8bo25bobo8bobo3bo4bo3bobo10bobo12bobo39bo4bo23b2obob2o41b5o55bo2bo8b 2o8bo2bo35b2o6bo22bo6b2o507b3o5b3o21bo9bo39bobo15b2o224bobo301b9o67bo 7b2o2b2o36bo2bo126bo5bo3bo5bo54bo86bo4bo34bo4bo74bo3bo5bo3bo5bo59bo 105b2o52b2o9b2o188b2o8bo4bo7bo2bo7b2o18b2o3b2obo$15bobo2b4o3b2ob29ob2o 3b4o2bobo10bo35b2o26b2o3b2o2bo10bo2b2o2bo10bo2b2o3b2o21bob2o2bo2bo4bo 2bo4bo2bo8bo116bobo49bo10bo25b2o32b2o61b2o16b2o6b2o27bo9b2o2bo6bo2b2o 12b2o12b2o39bo6bo21bo3b2o3bo40b3o55bo2bo7bo4bo7bo2bo33bobo6b3o18b3o6bo bo540bobobobo42b2o241b2o288bobo10bo2b5o2bo66b2o6bo4bo34bobo2bobo125bo 2bobobo2bobobo42bo7b2o3b3o85b5o34b5o76bo3bo5bo3bo5bo164b2o52b2o213bo7b o7b2o4bobo23bo$14b2o2bo7bo35bo7bo2b2o8bob2obobobobobobobobobobobobobob obobobo36b2o3b2o3b2o6b2o3b2o3b2o30b2obo3b2o6b2o6b2o45bobo2bobo73bobo 48bobo8bobo24bo6b2o25bo117b2o11bo8bo19b8o42bo8bo19bob2o2b2o44bo57b2o 22b2o34bo11bo16bo11bo540bobobobo575b2o11b2o2b3o2b2o75bo2bo36b2o2b2o 127bob2ob3o3b2o43b3o5b2o6bo4b2o7bo80b2obo16bob2o85b2o2b2o4b2o2b2o4b2o 429bo3bo7bo6bo2bo5bo23b2o7b2o$13bo2bobo4b2obobo31bobob2o4bobo2bo8bo2b 32o2bo40b2o16b2o103b4ob2ob4o11b10o16b10o26b2o47bobo8bobo21b2obo6bo2bo 20bo3bo20b2o3b2o3bo98bo8bo19bob4obo42bo8bo19bobo2bobo3bo153bob2ob2o4b 2o3b2o16b2o3b2o4b2ob2obo536b2ob2o577bo88b2o6b2o2b2o13bo2bo4bo2bo26bo2b o4bo2bo106b2obo45bo8bo11b2o4b2o5b3o72bo9bobo2b2o6b2o2bobo9bo73b2obo6b 2obo6b2obo7b2o212bo209bobo9bo7b2o39bobo$14bobo2b5o2b2ob31ob2o2b5o2bobo 10bobobobobobobobobobobobobobobobobob2obo159bobo4bo2bo4bobo8b2o6b2o16b 2o6b2o17bo8b2o45b3ob2o6b2ob3o19bobob2ob2obob2o2bo17b4obo19bobo2b2o2bob o97bo8bo19b8o42bo8bo20b3o2b2o5b2ob2o21bo6bo72bo6bo38b2obo2bo3bobo12b2o 12bobo3bo2bob2o533bo2bo3bo2bo60b2o5b2o595bo2b2obo6bob2o7b3o2b6o2b3o22b 3o2b6o2b3o105b2ob3o42b3o5b2o23bo8bo65bobo9bo4bo6bo4bo9bobo72bob2o6bob 2o6bob2o8bo211bobo31b2o188bo2bo46bo$15bob3o2b3ob37ob3o2b3obo10b2o35bo 160b2ob2obo4bob2ob2o7b2o8b2o14b2o8b2o15bo2bo4bobo45bo4bo13bo12bo7bo2bo bo2bo2bobobo19bobo21bo6bo2bo93b2o2bo6bo2b2o12b2o12b2o39bo6bo25b2o3bo2b 2ob2o20b2o6b2o74b2o46bo4b2o11bo4bo11b2o4bo539b2o5b2o13b2obo3bob2o12bo 24b2o5b2o500bobo56bo2bo31bo3bob2o6b2obo9bo2bo4bo2bo12b2o12bo2bo4bo2bo 107bo4b4o42bo29b2o5b3o66bo11bo14bo11bo105bobo208bo2bo31bo191b2o46b2o$ 17bobo2bo43bo2bobo14bobobobobobobobobobobobobobobobobobo164bobo6bobo 10bo10bo14bo10bo16bobo4bo48b3o2bo6b2ob3o11b2o2bo3bo2b2o2bobobo3bo2bo 15b2o4b2o15b4ob6obobo92bobo3bo4bo3bobo10bobo12bobo39bo4bo20b5obob2o28b 3o6b3o5bo60b3o10b3o41b2obo30bob2o249bo313bo2bo3bo2bo11bo374b2o31bo127b 2o12b4o44bo30b2o6b2o8b2o31b2o131bob2o4bo41b2o35bo81bo2bo8bo2bo118b2o 207bo2bo33b3o$15bobobo2bobo39bobo2bobobo10b2ob32ob2o160b2obobo6bobob2o 61bo2bo2bob2o48bo2bo6b2obo17bo3bo2b2o2bobobo2bob2o12b2obo2bo5bobo11bo 3bo6bobob2o91bo7b2o7bo10bo16bo41b2o22bo2bo2bobo30b2o6b2o5bobo59bobo2b 2o2b2o2bobo38bo2bo3b2o2b3o16b3o2b2o3bo2bo246bo314b3o3b3o12b3o229b2o 124b2o15bobo7b2o10b2o8b2o15b2o110bo12bo3bo40bo3bo38bo10bo182b2o38bo19b 3o6b2o247bo214bo$15b2o3bob2ob39ob2obo3b2o11bobobobobobobobobobobobobob obobobobo162b2obo10bob2o6bobo8bobo9b2o2b3o6b3o2b2o13bobo2bobob2o54bo 20bo3b4ob2obo3b2ob2o16bobo6b2ob2o11b2o3bo2b2o2b2o93b2o16b2o8b2o16b2o 30b3o36bo2bo31bo6bo5bo2bo2bo2b2o4b2o2bo43b3o10b3o38bo2b3o2bo2bobo4bo6b o4bobo2bo2b3o2bo246b3o565b2o124b2o17bo7b2o10b2o7b2o16b2o114b2o11bo41b 4o30b2o7bo8bo183bo19b2o17bobo17bo3bo252b2o2bo173bo2bo$22b45o17bo35b2o 163bobob4obobo11bo2bo2bo2bo9b3o2bob2o6b2obo2b3o11bobo2bob4o51b4o27bo8b ob2o17bo2bo3bo2bo17bo4bo4bo170bo3bo6bo29b2o46b2o2bo3b3o2b3o3bo98b2o4bo 2b3o7b2o7b3o2bo4b2o133b2o3b2o100b2o7b2o708b3o29b2o2b2o126bobo7bo2bo60b 2o15bo6b2o8b2o180bobo18bo2bo16bob2o15bo5bo16b2o234bo3bo174b2o$83bob2ob obobobobobobobobobobobobobobobobo164bobo6bobo8b2o2b3o2b3o2b2o5bo4b2obo 8bob2o4bo21b2o49bo22bobobo2b2obobobob2ob3ob2o10b2ob2o6bobo12b4ob4obob 3o170bo5bo4bobo32b2o2b2o43bo2b2o4b2o2bo97bo2b3o2bo26bo2b3o2bo44bo7bo 77bo2bobo2bo99b2o2b3o2b2o45b2o300bo63bo25bo114b2o308bo11bo71bobo13bo3b 2obo6bob2o28bo10bo142b2o18bobo2bo16b2o3bobo10bo5bo15bo2bo234bo$84bo2b 32o2bo162b2obob4obob2o9b3o6b3o8b3obo3bo6bo3bob3o22b2o44bob2o6bo2bo14bo bo8b2o3bo4bobo11bobo5bo2bob2o11bo2b2o4bobo183bobo29b5ob2ob3o38bo53b2o 2b5o2b2o2b2o2b5o2b2o32bo2bo3b2o10b2o2b2o10b2o3bo2bo43bobo5bobo31bo7bo 32b2o3b2o3b2o3b2o101b3o42b2obo4bob2o294b2o62bobo23bobo113b2o28b2o278bo bo29b2o52bo13b2o2bob2o6b2obo28bo10bo162bobob2o22b2o10bo5bo14bob2obo$ 22b45o18bobobobobobobobobobobobobobobobobob2obo161bo2b3o2b3o2bo13bo2bo 14bobobo10bobobo24b2o42b3ob2o6bo2b3o12bo10b6o4bobo14b2o4b2o21b2obo2bo 171bo7bobobo29bo12bo36bobo52bobobo3bobobo2bobobo3bobobo35b2obo30bob2o 47bo7bo31bobo5bobo31bo15bo46b2o53b3o42bo10bo294bobo62bo25bo144b2o267b 2o12b2o9b2o15b3o52b2o57bobo8bobo93b2o4b2obo6b2obo47b2obob2o2b2o18b2o 11bo3bo12bo3bobobo234b3o138bo2b2o$15b2o3bob2ob39ob2obo3b2o10b2o35bo 164bo2b4o2bo11bobo6bobo12bo3bo6bo3bo26b2o41bo13bo4bo18bob2o4bo2bo3bo 17bobo21b3ob2o2b2o171bo7bo2bo31b6o2b4o93b3o5b3o4b3o5b3o34bo4b2o5b2o14b 2o5b2o4bo86bo7bo29b2obo15bob2o43bo49b2o49b2o6b2o365bo15bo275b3o29b2o2b 2o105b2o12b2o9b2o14bobo2bo2b2o106bo10bo95bo4bob2o6bob2o7b2o41bo4b2o33b 3o13bo3bobob2o373bo3b2o2b2o$15bobobo2bobo39bobo2bobobo12bobobobobobobo bobobobobobobobobobobo164b2obo4bob2o9b2obob4obob2o10bo2bob2o4b2obo2bo 27b4o38b3ob2o6b2ob3o19b2o6bo2bo21bob4o18bo228bo2bo100bobo12bobo33b2obo 2bo3bobo26bobo3bo2bob2o117bo2bob2o13b2obo2bo33bob2ob2obo5b2o30b3o8bo2b o45b3o2b6o2b3o355b5o2b3o11b3o2b5o155b2o94b2o17bo12b3o13b2o16b2o106b2o 6b2o6bo3b2o5b2o2b2o2b2o106bo10bo94bo3b2o4b2o2b2o4b2o5b2o5b3o33b3o3b2o 47bo6bo376bo7b2o$17bobo2bo43bo2bobo12b2ob32ob2o163bo2bo4bo2bo12b2o4b2o 14b2obo8bob2obo26b4o40bobo8bobo24b4ob3o23bo3bo200bo5bo37b2o6b2o37b3o 55bobobobo8bobobobo31bob2ob2o4b2o3bo3bo10bo3bo3b2o4b2ob2obo117b2obo5b 3o3b3o5bob2o33b2obobobo6bo31b3o8bobo46bo2bo8bo2bo354bo4bo5bo9bo5bo4bo 154b2o94b2o15bobo29b2o15b2o103bobo7b3o5bo3bobo9b2o110bo10bo94b2o2bo5bo 3bo5bo12bo3bo12b2o16b2o3bob2o50bo2b3o210b2o165b4o30b2o$15bob3o2b3ob37o b3o2b3obo11bobobobobobobobobobobobobobobobobobo166bo2bo2bo2bo10b2o4b2o 4b2o12bo2b2o4b2o2bo2bo30b2o38bobo8bobo21b3o4bo27bo204bo3bo38bo2bo2bo2b o37b3o49b2o4b7o8b7o4b2o30bo9bo4bo10bo4bo9bo125bo5bobo3bobo5bo13b2obo6b 2obo15bo8bo28b3o2b2o3bo3bo4b3o37b2obobo10bobob2o207bo95bo5bo15bob2o6bo b2o11bo2bo7b2o9b2o7bo2bo266b2o31bo120bo10b2o6b5o122bo10bo99bo5bo3bo5bo 10bo5bo11bo16bo2bob2obo51bo5b2o208b2o199bobo$14bobo2b5o2b2ob31ob2o2b5o 2bobo9bo35b2o61b3o3b3o95b2o4b2o13b4o2b4o14bo3bo4bo3bobo31b2o6b2o31bo 10bo22bo2bo2bo2b2o23b2o205b3o40b3o2b3o39bo50bo2b2o4bo4b2o2b2o4bo4b2o2b o30bobo6bobobo14bobobo6bobo125b2o4b3o3b3o4b2o13bob2o6bob2o23b2o33b2o3b o48bobobo12bobobo208b2o70bo21b3o3b3o14b2obo6b2obo8bo2bob2o27b2obo2bo 118b2obob2o306b2o4b3o122bobo8bobo93b2o2b2o4b2o2b2o4b2o10bo5bo9bobo17b 2o5bo51bob2obo2bo385b3o22bo$13bo2bobo4b2obobo31bobob2o4bobo2bo7bob2obo bobobobobobobobobobobobobobobobo187bo2bo2bo2bo13b2obobo4bobobob2o30b2o 6bo68b2o3b2obo372b3obo7bob4obo7bob3o32b2o5bobobo16bobobo5b2o164b2o8b2o 55b3o3bo50bo16bo209b2o54b3o3b3o9b2o18b2ob2ob2ob2o11b2o8b2o11bobobo5bo 21bo5bobobo430b2o130bo10bo95bo4b2obo6b2obo12bo5bo9b2o20b3o2bo50b2obo3b 2o212b2o12bo2b2o155b3o22b2o$14b2o2bo7bo35bo7bo2b2o9bo2b32o2bo59bo4bobo 4bo113b3o2b2o2b3o11bo2b2obo4bob2o34b2o8bo346b4ob2ob4o95b2ob2o10b2ob2o 43bo4bo18bo4bo51b3o3b3o109bo9bo22b2o32bo17b2o3b2o30bo2bo14bo2bo262bo2b o3bo2bo7b2o18b3o7b3o11bo9bo12bo2bo4bobo19bobo4bo2bo106b3o9bo5bo438bo 10bo94bo5bob2o6bob2o9b2o2bo3bo32bo6bo47b2o3b3o216bob2o7bo3b2o2b2o116b 2o33b3o17b2o$15bobo2b4o3b2ob29ob2o3b4o2bobo11bobobobobobobobobobobobob obobobobob2obo58bo4bobo4bo113bo2b2o2b2o2bo12bo49b4o3b4o344bo2b2o2b2o2b o37bo53b2o9b2o2b2o9b2o39bo3bo20bo3bo51bobo3bobo32b3o3b3o69bo9bo5bo9b3o 2bobo32bo11b3o2bo2bo2b2o33bo7b3o4bo138b2o6b2o117b2obo3bob2o4bo45bo9bo 16b2o2bo2bo5b3o3b3o5bo2bo2b2o108bo3bo559b2o2b2o4b2o2b2o4b2o6bobo3b3o 30b2obobo3bo49b2o4bo212bo2bo2b2o7bo7b2o115bobo30b3o20bo$15bob2obobo2b 3o2b2ob23ob2o2b3o2bobob2obo10b2o35bo59bo4bobo4bo41b3o3b3o64b2ob4ob2o 12b2ob3o6b3o36b2obo2bo4bo391b3o52bo11bo2bo11bo120b3o3b3o4b2o20b3o3bobo 3bobo3b3o62b2o8b2o5b3o7bobo3bo37bo7bobo3bobo33bo3bo7bobo4bo3bo134b2o6b 2o85bobo42bobo24bo7bo12b2o8b2o20b2o6bobo3bobo6b2o112bo5bo8b2ob2o10b2ob ob2o532bo5bo3bo5bo7bo39bobobo3bo48b2o2b2obob2o209bobo13b4o120bo32b3o 21b3o$13bobo3b2obobo2b2obobo23bobob2o2bobob2o3bobo10bobobobobobobobobo bobobobobobobobobo62b3o3b3o140bo4bo2bo4bo37b5ob2obo116b2o273b3o53bo9bo 4bo9bo42b2o22b2o49b2o13bo2bo26b3o3b3o64b2obo6b2obo10bo6bobo4b3o33bobo 6bobo4bo34bo3bo7bobo4bo3bo229b2o44b2o20bo26bob2o6bob2o24b3o3b3o120b2ob ob2o10bo547b2o3bo5bo3bo5bo5b2o39bob2obo16b2o37b2obobo211bo137b2o32b3o 23bo$13b2ob2o3b2ob2o4bo27bo4b2ob2o3b2ob2o8b2ob32ob2o111bo4bobo4bo62b2o 2b2o2b2o14bobo2bo2bo2bobo40bobob2o116b4o327b2o9b2o2b2o9b2o115bobo13b3o 18b2o23b2o55bob2o6bob2o9bobo14bo29b2o2bo2bo16bo34bo14bo200bo7bo25bo66b 2o25b2obo6b2obo183bo5bo9b3o517bo2b2o4b2o2b2o4b2o28b2o17bo2bo17bo9bo10b 2o16bo2bobo$16bob2o4bob2o3b2ob21ob2o3b2obo4b2obo12bobobobobobobobobobo bobobobobobobobo2bo58b3o7b3o39bo4bobo4bo62bo2bo2bo2bo13b2obobo4bobob2o 39bobo118bo2bobo469bo35bobo23bobo58b2o2b2o13b2o45b2o3b2o17bo31bo2bo14b o2bo135b3o4b3o50b2ob2o3b2ob2o89bobo29b2o8b2o196bo3bo515bo5b2obo6b2obo 30b2o18b2o12b2o5b3o7b2o9bo17bo2bo212b2o$16bo2bob2o2b2o2b3o2b2ob15ob2o 2b3o2b2o2b2obo2bo10bo36bo2bo24b3o3b3o18b3o2bo4bo3bo4bo2b3o33bo4bobo4bo 64b2o2b2o18bo8bo35b2o4bo3b3o37bo76bobo2b2o133bo137bobo194b2obo13b3o17b o27bo58bo3bo79bo3b3o33bo16bo139bo4bo92b2o5b2o86bo9bo14b2o21b2o115bo27b 2ob2o8bo5bo108b2o404b2o4bob2o6bob2o64b2o7bo6b2o7b3o5b2o12b2o213b2o$17b obobo6bo2b2obobo15bobob2o2bo6bobobo10bob3obobobobobobobobobobobobobobo bobobob2o56bo4bo3bo4bo40b3o3b3o90b2o6b2o35bo2bob3o5bo36bo75bobo137bobo 137bo194bo2b2o13bo2bo15b2o27b2o58bo3bo13b2o63bo3b2o32bobobo12bobobo 135b2o6b2o53bobobobo30bob2ob2obo85bo9bo10b2o2bo2bo19bo2bo2b2o109bobo 28bo10b2obob2o91b2o15bobo27b2o149bo333bo7b2o$18bo2bo3b2ob2o4bo19bo4b2o b2o3bo2bo11bo2bob33obo24bo4bobo4bo14bo4bobo4bo3bo4bobo4bo49bo129b2obo 2bob3o36b3o73b2o139bob3o330b2o5b3o3b3o4b2o26b3o3b3o68b2o2b2o13bo8bo44b 3o8bo3b2o2b3o27b2obobo10bobob2o119b2o38b2o35bo3bobo3bo29bobobobo86b2o 8b2o6bo2bo4bobo19bobo4bo2bo106bobo137b2o17bo17b2o7bobo15b2o132bobo97b 2o14bo137b2o$21b2o2b2obob2o3b2ob13ob2o3b2obob2o2b2o15bo3bobobobobobobo bobobobobobobobobobobo24bo4bobo4bo14bo4bo17bo4bo31b3o7b3o3b5o128bob2ob obo76b3o16b3o16b3o135bob2o4bo336bobo3bobo26b3o3bobo3bobo3b3o58b2obo6b 2obo10bo6bobobob2o45b2o8b3o32bo2bo8bo2bo46b2o10b2o61bobo38bobo34bo2b2o b2o2bo11bobo15bobobobo82bob2o6bob2o7bobobo5bo21bo5bobobo105b2o10bo144b 3o17b2o7bo17b2o115b2o18b2o95b2o3b2o8b2o15b2o119bobo478b2o$29b2o2b3o2b 2ob7ob2o2b3o2b2o24b3o33bob2o22bo4bobo4bo14bo4bo2b3o7b3o2bo4bo25b3o2bo 4bo3bo4bobo5bo127bo2bobobo38b3o23bo11b2o18b2o17bobo126b2o6b2o3b2obo 336b3o3b3o32b3o3b3o64bob2o6bob2o9b2o5bob2ob2obo44bo2bo7b3o32b3o2b6o2b 3o45bo2bo8bo2bo60bobob2o3b2o22b2o3b2obobo35b3o3b3o13b2o14bo7bo47bobo 31b2obo6b2obo8bo2bob2o27b2obo2bo105bo10b2o4b3o26bo126b2o12b3o130bo3bo 17b2o10bo89b2o7b2o16b2o119bo484bo28bo$32bo2b2obobo7bobob2o2bo31bobobob obobobobobobobobobobobobobo2bo24b3o3b3o18b3o19b3o32bo4bo3bo4bobo2bobob o127b2o3bo39b3o23bo12b2o16b2o19b2o29b2o4b2obo55b2o29bobo9b2obob2o367b 2o23b2o21b2o4b3o3b3o4b2o43bo52bobo46b2o6b2o48b3o2b6o2b3o61bobobo3b2o 22b2o3bobobo37bo5bo14bo72b2o56bo2bo27bo2bo107b3o10b2o2bo3bo24bobo124bo 2bo138b2o3bo5bo16b2o9b2o99b2o2b2o131b2o479b2o2bobo25b3o$29b2ob2o4bo11b o4b2ob2o26b34obo103bo4bobo4bo3bo4bobo4bobo170b2obob2o20b3o11bo18bo15b 2o34bo4bob2o12b2o18bo21bobo23b2obo2bo6b5obo371bobo23bobo20bo5bobo3bobo 5bo42b2o46b3o4bo46bo10bo50b2o6b2o66bo36bo129bo3bo9b2o5b2o40bo4bo3b2o 11b2o3bo4bo107bo3bo42bobo12b2o110bobo139b2o2b2obo3bo8bo4bobo10b2o11b2o 236bo4bobo460bo2b3obobo22bo$29b2obob2o3b2ob5ob2o3b2obob2o25bobobobobob obobobobobobobobobobobobob2o25b3o3b3o18b3o19b3o25bo4bo19b2o2bo172b2ob 2o38b2o10b2o17bo2bo32bo3b2o4b2o9bo2bo17b3o19bo24bob2obob2o4bo5bob2ob2o bo364bo27bo17b2obo5b3o3b3o5bob2o87b3o51b2obo4bob2o49bo10bo63bo2bo34bo 2bo50b2o76bo12b2o5b2o41b5o4bo11bo4b5o107bob3obo11bo5bo13bo10b2o11bobo 96b3o12bo145bo5bo9bo3bo11b3o7bo3b3o233b2o4b4o461b6o2bo22b2o$33b2o2b3o 2b2ob2o2b3o2b2o29bo37bo22bo4bobo4bo14bo4bo2b3o7b3o2bo4bo23bo4bo2b3o7b 3o179bo7bo19b3o11b2obo12bob2o15bo34b2o2bo5bo9bo2bo16b2o3bo15b2obo24bo 4bo8b4o5b2o366b2o27b2o16bo2bob2o13b2obo2bo85b2o2b3o2b2o50b2o54b2obo4bo b2o66bo34bo53b2o12bo11b2ob2o40b2o3b3o69bobobo7bobobo115b5o4bo7b2o3b2o 7b3o4b2o10bo9b3o80b2o17bo7b2o17b3o130bo3bo5bo2b3o16b2o5b4o4b2obo68b2o 163b4obo463b2ob2o$36bo2b2obo3bob2o2bo29b2obo3b2obobobo2b2obobobo2b2obo bobo2b2ob2o22bo4bobo4bo14bo4bo17bo4bo25b3o194bo2b2ob2o2bo33bo16bo17bo 38bo5bo7bob2ob3o12bo3b2obo14b2obo22b2ob4obob2o4bobo3bo2bobo3bob3o406b 2obo15bob2o87b2o7b2o111b2o67bo3bo5bo7b2o4b2o7bo5bo3bo64bo8bo2bobo2bo 37bo2bo69bo3bobob2o7b2obobo3bo120b2o18bo3bo2b2o10b3o8b2o81b2o15bobo7b 2o17bo17b2o115b2o29b2o2bo4bo4bo2bo5b2o60bo2bo12b2o2b2o215b2o393bo2b6o$ 33b2obo5bobobo5bob2o26bo2bobo2b3ob2obo2b3ob2obo2b3ob2obo2b2o24bo4bobo 4bo14bo4bobo4bo3bo4bobo4bo17bo202bo5bobo5bo12b2o2b3o2b2o8bo16bo9b2o7bo 2bo29b2o2b2o4b2o7bo4bo2bobo10b3obobo17bob2o18bobo4bobo4b2ob2obob2o2bob o3bo413bo15bo90b3o188bo3bo3b2ob2o5b3o2b3o5b2ob2o3bo3bo35b2o5b2o18b3o8b 3o3b3o37bo7bo63bobo2bobo13bobo2bobo118b2o37bo3bo7b2o98b2o27bobo15b2o 147bo2bo3bo5b2obo5b2o60bo2bo11b2o16b2o127bo5b2o2b3o62bobo82b2o308bobob 3o2bo$34bo2b3o3bobo3b3o2bo29bo2b3o2b2obob3o2b2obob3o2b2obob3o2b2o56bo 4bo3bo4bo22b5o3b3o63bo32bo97b2obo2bobo2bob2o12bobo2bo2bobo15b4o18bob2o 4bo17b2o13bo2bo5bo9b3obobob2o17b2o12b2obo21bo3b3o2bob3obob2ob3o3b2o 336bo7bo32bo7bo32b2o3b2o3b2o3b2o92bo172b2o10b2o6bo5bo7b2o4b2o7bo5bo39b 2o5b2o30bo5bo20b2o5b2o9bo2bo3bobo63bo4b2o13b2o4bo139bo5bo11bob3obo7bob o126b2o168bob2o3b3o71b2o13b2o15b2o126bob2obobobob2obo63bo65b2o15bobo 309bobo2b2o$34bo3bo2bobobobo2bo3bo30b2o3bo4bo4bo4bo4bo4bo4bo2bo24b3o3b 3o18b3o2bo4bo3bo4bo2b3o16bo5bobo4bo60bobo28bo3b2o91bob2obob3o3b3obob2o bo9bo7bo9bobo2bo6bo2bobo7bo2bo2b2o5bo16bobo11bo4bo5bo5b3o4bobo13b4o5bo 11bobo2bo2bo13b2obobo2bobo13b2ob2ob2obo332bobo5bobo30bobo5bobo35bo2bob o2bo96bo124b2o45bo2bo8bo2bo2bo2bo34bo2bo102b2o5b2o9b2ob2ob2ob2o228b2o 3b2o7bo4b5o9bo258b2o44b2o45b2o2b2obo6b2obo25bo142bobo3bo3bo5bo62b2o64b 2o17bo310bo$31b2obobo3b2obobob2o3bobob2o28bob2ob2o3bob2ob2o3bob2ob2o3b obo2b2o58b3o7b3o21bobobo2bobo4bo90bob2o25b2o9b2o54b3ob3o13b3ob3o25bo3b o2b4o2bo3bo7bobo11bo2bo13b3o10b2o2b2o4b2o5bo2b5obo13bo6b2obo13b2obobo 3b2o9bobobob2o2bobobobo6bo12b3o122bo11bo192bo7bo32bo7bo37b2o3b2o222b2o 45b3o2b6o2b3o4bo36bo76b2o5b2o41bobo244b2o280bo91bo2bob2o6bob2o168bob5o bob5obo145b3o313b2o$31bob2ob2o6bo6b2ob2obo28bo2bobo2bobobo2bo2bobobo2b o2bobob2obo93bobo4bobo4bo58bo3b2o27bobob2o21bo2bob2o5bo18bo4b2o32bob2o bob3o3b3obob2obo9bo7bo9bobo2bo6bo2bobo8bo13bo16b2o14bo5bo9bo4bo15b2o2b o2bobo15bo7bo9bobobo3bobobob2o6b2obobob2o4b5o120bobo9bobo557b2o6b2o5bo bobo32bobobo69bo4b2o5b2o40b2ob2o224b2o18b2o266b2o12bo8b2o9bo69bo7b2o2b 2o4b2o15bo151bo5bobo5bo$87b2o4b2obo2bo3b2obo2bo3b2obo2bo2bo60b3o3b3o 24bo2b2o66bo5bo27b2o2b2o21b4obo2bo4b3o15b3obo2bo35b2obo2bobo2bob2o12bo bo2bo2bobo15bo2bo30bo13bobo11b2o3bo5bo9b4o18bobobo2b2o14bob6o11b2ob4o 2b2obo7bo2bob2obo4bob3obo120bo11bo557bo10bo3bobob2o32b2obobo69b2o70bo 209bo36b2o3b2o244b2o4bo7bo8b2o7bobo2bobo3bobo58b2o6bo3bo5bo15b2o152b3o 2bobo2b3o$97b2o8b2o8b2o2b2o58bo4bobo4bo31b3o60bobo28bo5bo20bobo2bo2bo 2b2o5bo17b2o2bo35bo5bobo5bo12b2o2b3o2b2o8bo6bo2bo6bo8b2o14bo2bo4b2o2bo bo13bo2b2o4b2o31bobobobo17bo24b2o3bo8bobo4bo2b3o5b3o688b2obo4bob2o3bob o38bobo50bo5bo11b2o72b2o208b3o33b2o3b2o241b2o5b2o8bo13b2o3b2obo3bo2b2o 68bo3bo5bo14bobo8bo144bo3bo3bo103b2obo4bob2o6b2obo$181bo4bobo4bo96b2o 6bo21bob3o4bob2o13b2o16bo14b2o5bob2ob2o31bo2b2ob2o2bo33bo16bo8b2o15bo 6bobo2bo13bo5b2obo13b2o19b2obobo18bob2o18bo2bo3b2o8b2o4bobo3bo3bo3bo 115b5o7b5o560b2o9b2o38b2o50b3o3b3o83b2o211bo273b2o5b3o5bo2b2o4bo14b2o 6bo7bo59b2o6b2o2b2o4b2o23bobo256bob2o4b2obo6bob2o24b3o$181bo4bobo4bo 104bo21bob2o5bob3o18b2o2bo4b3o15bob4obo2bobo33bo7bo19b3o11b2obo12bob2o 25bo6b4o14b2o4bob2o13b2o23bo18b2ob2o18b2o20b2obob3obob4o11b2o4b2obo46b 2o12b2o32bo4bo7bo4bo59bo402b2o4b2o2b2o4b2o181b2obo3bob2o299b2o30b3o20b 2o74b2o33b2o102b2o6b2o6b5ob2o23b2obobo63bo2b2obo6b2obo26b2o260b2o6b2o 2b2o11b2o17bo7b2o$284bo5b2o4b3o29bo5bo17b2o3bob3o19bo2b2o2bo2bo35b2ob 2o38b2o10b2o29bo2bo3b2o131bo3b3o16bo4bob2o42b2obo2bob2o4b2obo2bob2o27b o2bo13bo2bo56b3o403bo5bo3bo5bo20bo84b3o6b3o136b3o3b3o202b2o26bo30b3o 20b2o57b2o15bobo7b2o13b2o7bobo15b2o96b2o4bo21bo8bobo64bo3bob2o6bob2o 288bo8bo2bo12b2o15bobo7b2o$26b2o4b2o149b3o3b3o92bo11b2o17bo14b2o2b2o 12b3obo3bo2b2ob2o13b5obobo2bobo35b2obob2o20b3o11bo18bo27bo2bo137bobobo b2obo10bo3b2o18b2o26b2o2bo4bo4bo4bo2b2o24bo2bob2o13b2obo2bo52bo8bo2b2o 392bo5bo3bo5bo6b2o12b3o12b2o38b2o28bo3b2o2b2o3bo90bo43bo9bo201b2o23b3o 32bo80b2o17bo7b2o13b2o7bo17b2o96b2o25bobo11bo62b2o6b2o2b2o4b2o287bo6bo 4bo28b2o$25bo2bo3b2o27b2o34bo7bo7bo168b3o7b2o2b2o2b3o10b2o3bo4b3obo2bo bob2o16bobo8bo12bobo4bob2obob2o36b3o23bo12b2o16b2o28bobo136b2o2bo2bob 2o10b2o2bo19bobo30bo12bo28bobobo5bo7bo5bobobo42b2o7b2o6bobo2bo54b2o3b 2o331b2o4b2o2b2o4b2o5b2o11bo3bo11b2o38b2o14b2o12bo12bo66bo3bo17bobo43b o3bobo3bo17b2o207bo132b3o31b3o140bo2bo8bo72bo3bo5bo287b2o6b2o2b2o382bo $25bo2bo24b2ob2o4bo3bo30bobo5bobo5bobo166b2o6bob2o4b3o15b2obo9bob2o15b o6b2o5bo13bo2b2o4bo2b2o2bo35b3o23bo11b2o18b2o28bo138bobo2bo19bo13bo4bo b2o30bobo6bobo30bo2bo4bobo5bobo4bo2bo13b2obo6bob2o17bo15bobobo55bobobo bo333bob2o6bob2o20b2ob2o67b2o12b2o10b2o66bo3bo18b2o44b3o3b3o18bobo266b o236bo13bo2bo72b2o7bo3bo5bo282b2obo6b2o6b2obo376b3o$22b2ob4ob6o17b2obo bo3bob3o10b2o2b2o12bo7bo7bo170b2o2b3obobo5b3o12b2obobo2bob3o4bo3b2o11b o10bo18b2obobob2o4bobo73b3o16b3o23b2o142bo2b2o15b2o2b2o12b2o5bo39bo37b 2o2bo2bo5bo2bo2b2o16bob2o6b2obo17bobo12b2obob2o39b2o2bo12bobo12bo2b2o 318b2obo6b2obo108bo2bo2bo2bo138bo5bo21bo88b2o13b2o20b2o13b2o61bo25b2o 34bo238bo89bo6b2o2b2o4b2o282bob2o7bo6bob2o375bo$22bobo4bo6bo19bo6bo12b obo2b2o13b5o3b5o3b5o167b3o26b2o2b2o14bo13b2ob2o2bo3bob3o15bobo2bo3b5o 36b3o80b2o141b2o20bo4b2obo7bo2bo43bobo41b2o7b2o25b2o2b2o22b2o10bo3b2o 3bo38bo2bobo10b2ob2o10bobo2bo125bo7bo188b2o8b2o106b3o4b3o95b2o69b2o86b 3o13b3o18b3o13b3o61b2o23b2o34bo89b2ob2o142b3o12bo2bo72bo3b2obo6b2obo 282b2o10bo5b2o4b2o311b2o60b2o$24bo2bo2bo2bo2bo19bob2o5b4o7bo18bo7bo7bo 172b3o6bo20bo5bo28b3obo3b2o18bo2bob3o44bo245bo5bob2o7b3o41bo5bo44b2o 30bo4bo26b3o8b2o2b2obo38bobobo25bobobo125bobo5bobo188bo9bo211bobo155bo b2o13b2obo16bob2o13b2obo47b2o10b2o134b3o13b2ob2o13b3o116b2o23b2o74b2o 2bob2o6bob2o31bo250bo11b2o4bo5bo52bo21b2o237bo$24b3ob2o2b3ob2o15b2obo 7b2o2bo5b2ob6o14bobo5bobo5bobo176bobo20b3obo5b2obo18b3o4bo2b2o18bobo2b ob4obo39bo82bo162b2o2b2o4b2o48bo5bo45bobo30bo2bo18b2o7bobo4bo3bobo2bob o37b2obob2o23b2obob2o125bo7bo188bo9bo214bo154bobo17bobo14bobo17bobo46b 2o50bo78b2o17bo31bo17b2o101bo134bo10b5o249bo8b2o7bo5bo52b2o9b2o7bobo 15b2o220bobo$22b2o2b2o2b3ob2o2bo14bo2b3o4bo3bo5bo3bo4bo12bo3bo3bo3bo3b o3bo200b2obo4b3obo17bo16b2o11b2ob2obo5b2o121bobo165bo5bo16b3o31bobo43b o2bo2bo30b2o2b2o16bo2bo6b3o8b2o2b3o37bo3b2o3bo19bo3b2o3bo49bo28bo7bo 234b2o8b2o18b2ob2o57bo132b2o153bo2bo15bo2bo14bo2bo15bo2bo99b2o15b2o3b 2o54b2o15bobo31bobo15b2o88b2o12bo122b2o8b2o9b2obo2bo247b2o9bo6b2o4b2o 51b2o10b2o7bo17b2o221b2o8b2o$21bo3bo3bo3bo3bobo14b2o7bo9bo3bobobo9bo5b o3bo3bo3bo3bo3bobobo168bo3b2o27bo5bo16bo5b2o2bo2bo2bobo17bo2b2o119b2o 2bo2bo161b2o3bo5bo14bo2bo32bo43bo33b2obo6bob2o7bo2bo2bobo14bo3b2o40bob 2o2b2o8b3o3b3o8b2o2b2obo47bobo26bobo5bobo195b2o7b2o44b2o11bo3bo11b2o 29b2o12b3o267b2ob2obo13b2o4b3o3b3o4b2o16b2o4b3o3b3o4b2o47bo15bobo33b2o 19bo9b2o63b2o33b2o105b2o4bo7bo122b2o7b2o9bo7bo248b2obo4bo9b2obo74b3o 84b2o48b2o11bo15bo84b2o$16b2o2bobo3bo3bo3bo3bobo15bo2bobo3bobobobo3bo 3bo9bobob2o3bo3bo3bo3bo3bo5bo168bo5bo26b2o2b2o19b3o4bo2bob4o19bo2bob3o 116b2obo166bo2b2o4b2o9bo5b2o29bobo6bobo34b2o10b3o21bob2o6b2obo7b5obob 2o15b2obob5o34bobo2bobo3bo4bobo3bobo4bo3bobo2bobo40bo7bo28bo7bo115b2o 78bo2bo5bo2bo43b2o12b3o12b2o29b2o11bo3bo39b2o224b2o2b2ob2o116bobo14bo 53bo5bo6bo2bo200b2o5b2o8bo132b2o2b2o5b2obo2bo249bob2o4b2o8bob2o162bo 48bo12b3o11b3o$16bo3b3ob3ob3ob3ob2o2b3o13bo34bo4bo3bo3bo3bo3bo3bobobob 2o166bobo29b2obobo22bo5b2obo2bo20b2o4bo120b2o163bo5b2obo9b2obo4bo29bo 12bo30bo6b2obo4b3o19b2o14b2o11b2o3bo14bobo2bo2bo35b3o2b2o8b3o3b3o8b2o 2b3o40bobo159bo72bo5bobobo5bobobo5bo19b2o8b2o20bo57b2ob2o10bo28bobo 231bo21bobo34bobo55bobo5b2o6b2o2bo27b3o21b2ob2o203b2o5b3o5bo2b2o4bo7b 2o7bo5bobo49bo70b5o434bobo21b2o21bobo15bo9bo$17b3o2b2ob3ob3ob3ob3o3bo 13b2o2bobobobo3bobobo7bo4b2obobobo3bo3bo3bo3bo3bo4bo171b2o31b2obo20b2o 9b2o313b2o4bob2o10bobo29b2o2bo4bo4bo4bo2b2o28bo3bo2bo4b3o19bo16bo7b3o 2b2o8b3o6bo2bo44b2o3bo19bo3b2o45bo152bob2ob2obo5b2o64b2o4b3obo7bob3o4b 2o18b2o8b2o94bo29bo171bob2o6b2obo21b2o15b2o19b2o7bobo7b2o16b2o7bobo7b 2o47bo5bobo6b2ob2o26bo3bo21bobo12bo191b2o6b2o6b5ob2o8bobo4bobo5b2o48bo 3bo70bo155b2o4b2o274b2o7b2o12b2o12bo8b2o15b2o9b2o83b3o24b2o$14b3o4bo3b o3bo3bo3bo3bobo37b3o7bo5bo3bo3bo3bo3bo3b2obobo199b2o3bo368b2o29b2obo2b ob2o4b2obo2bob2o28b3obo3bo6b3o17bo14bo7bobo2bobo3bo4bobo7b2o39b5obob2o 23b2obob5o185b2o5b2obobobo6bo64bob2o3b3o11b3o3b2obo121b3o29b2o170b2obo 6bob2o21b2o15b2o5b2o11bo2bo3bo2bobo2bo3bo2bo14bo2bo3bo2bobo2bo3bo2bo 52bobob2o3b2o28bo5bo21bo216b2o4bo16bo5b2o6bo53bo225bobo2bobo185b3o94bo bo26b2o94b2o26bo24b2o$13bo2bobo3bo3bo3bo3bo3bo2bobob2o12bobobo3bobobob o2b2o2bo9bobobo3bo3bo3bo3bo3bo5bo203bo406b2o12b2o29bo11bo5b3o16b2o14b 2o6bob2o2b2o8b3o48bo2bo2bobo25bobo2bo2bo122b3o3b3o54bo12bo8bo62b3o2bo 21bo2b3o134b2o186b2o8b2o49b2o11bobobo13bobobo14bobobo13bobobo53bobobo 33bo5bo21bo11b2o203b2o21b2o61bo4bo55b2o2b2o166b4o187bo17b2o77bo29b2o 94bo24b3o332b2o5b2o$13bo2bobob3ob3ob3ob3ob3o2bobob2o31bo2bo14bo3bo3bo 3bo3bo3bo69bo2bo439b2o146bo3bob3o8b3o18b2obo6bob2o9bo3b2o3bo10b2o49bo 2bo8bo7bo8bo2bo127bobo3bobo46bob2ob2obo20b2o64bobobo19bobobo136bo75b2o 5b2o104bo8bo43bo20bob3o2b2o3b2o2b3obo16bob3o2b2o3b2o2b3obo44b2obob2o5b o38bo10bobo22bo292b5o45b2o7b2o16b2o151bo2b2o2bo185bobo15b2o77b3o22b2o 2b2o95bobo357b2o5b2o$14b3o2bo2b2ob3ob3ob3obobo3bo15bo3bobobobo3bobo2b 2obo13bo3bo3bo3bo3bo3bo70bo2bo435b2o2bo148bo2bo3bo29bob2o6b2obo10b2obo b2o12bobo49b2o8bobo5bobo8b2o128b3o3b3o46b2obobobo88bobobo17bobobo109b 2ob2o24b3o7b2o63b2o5b2o62b2o5b2o32bo10bo42b2ob2o2b2o14b3o11b3o20b3o11b 3o46bo5bo3bo2bo35bo3bo9b2o242bo11b2o68b2o39b2o8b2o15b2o3b2o146bo2b2o2b o186b2o221b2o$17bobobo3bo3bo3bo3bobobobo11b2o22bob2o8bo5bo3bo3bo3bo3bo 3bobobo63b2o2b2o47bo2bo245b2o135bo2bobo148bob2o6bo51bobobo15bo60bo7bo 62b3o28b3o3b3o25bo31bo40bo4b3o15b2o66bo2b3o13b3o2bo57b2o38b2o11bo3bo 26bo7b2o134b2o5b2o32b2o8b2o14bo2bo17b2obo4bob2ob2o24bo33bo57bo3bo7bo 36b3o10bo117b2o125bo9bobo68bobo49bo20b2o148bo2bo18b2o4b2o$16bobobobo3b o3bo3bo3bobobo12bobobobobobo3bobobobobobo9bobob2o3bo3bo3bo3bo3bo5bo62b 3o4b3o45bo2bo180bo64b2o131b2obo2bo2b2o153b2o53bo2bobo6b2o7b2o130bobo 28bobo3bobo24bobo6b3o11b3o6bobo56b3o2bobo67b2obo15bob2o58b2o38b2o12b3o 214bob2o6b2obo14bo16bo3bo33bo2bo30bo2bo56b3o4bo3bo37bo32b2o3b2o90bo 124b3o11bo70bo242bobo2bobo$16bo3bobob3ob3ob3ob2o2bo2b3o6b2obo22b2o11bo 4bo3bo3bo3bo3bo3bobobob2o113b2o2b2o178bobo63b2o131bob2obobobo153bo55b 2o2bo8bo133b3o3b3o28b3o3b3o25bo7bobo11bobo7bo57bobo3bo69b2o17b2o114bo 12b2o201b2obo6bob2o15b2o15b3o34bo2bo30bo2bo67bo16bo53b2o3b2o88bobo209b 2o226b3o14b4o260b3o22b2o2b2o26b3o3b3o$13b2obobo2b3ob3ob3ob3ob3obobo2bo 6bob2o2bobo3bobobobo3bo12b2obobobo3bo3bo3bo3bo3bo4bo114b3o4b3o175bobob o63bo136b3o3bo147bo2bo66b3o134bobo17bo12b2o22bo21b3o11b3o56b2o7bobo4b 3o66bo19bo127bobo204b2o2b2o4b2o7bob2o6bo51bo33bo65bo2bo17b2o40bo11b5o 75bo13b2o149b2o287b3obo10bo2b2o2bo258bo29b2o24bo2bo3bo2bo$13b2obobo2bo 3bo3bo3bo3bo3bobo2bo6bo2bo34bo5bo3bo3bo3bo3bo3b2obobo59b3o6b3o226bo3b 3o60bobo124bo6b4obob3obob2o20b2o191bo136b3o7b3o6bobo10bobo12b3o6bobo 77bo9b3o2bo2bo15bo141b2o73bo205bo2bo5bo8bo2bo3bo45b3o11b3o16b3o11b3o 61bo17b2o19b2o33bobo75b2o164bo289bobobo9bo2b2o2bo258bobo26b2o25b2obo3b ob2o$16bobo3bo3bo3bo3bo3bo4b3o8bo2b2o2bobobobo3bobobo7bo6bobobo3bo3bo 3bo3bo3bo5bo60b2o10b2o222b2ob2o60b3obobo70b2o6b2o44bobo4bo3bo3bo3bobo 4b2o8b2o3bo2bo324b2o12bobo7bo11bo14bobo7bo78b3o7bobo3bobo152b2obo4bob 2o68b2o7bo130b2o5b2o56bo4bo5bo6bo3bob3o43bob3o2b2o3b2o2b3obo12bob3o2b 2o3b2o2b3obo57bobobo36b2o24b3o83b2o166b3o280b3o4bo2bo11bo2bo252b2o7b2o 12b2o12bo8b2o183bo2bo$16bo3b3ob3ob3ob3ob2o2b3o8b3o27b3o12bo3bo3bo3bo3b o3bo34bo2bo23bo2bo12bo2bo36b3o6b3o170bobo3bobo12b2o7b2o14b2o7b2o9b4obo 71b2o6b2o44bob3o3b3o5b3o2bo4bobo8bo3b2o325bobo12b3o18b2o5b2o7b3o89bo6b obo4bo83bo5b3o3b3o5bo49bo10bo78bo129b2o5b2o56b2o2b2o4b2o5bo11bo13b2o 24bobobo13bobobo10bobobo13bobobo55bobob2o27b2o19b2o5b2o4bo3bo5b3o75b2o 2b2o143b2o18bo288b2o20bobo244bobo21b2o21bobo181bo264bo5bo$17b3o2b2ob3o b3ob3ob3o3bo7bo7bobobo3bobobobo2b2o2bo14bo3bo3bo3bo3bo3bo35bo2bo23bo2b o12bo2bo35b2o10b2o169bo2b2o3bo12b3o5b3o14b3o5b3o13bo123bob2o4bo4bob3ob o4bob2obo2bo7bob2o2b4ob2o318bo42b2o39b3o11b3o42bobo96b2o4bobo3bobo4b2o 50b2o6b2o77b3o190bob2o6b2obo10b3obo3bo14b2o24bo2bo3bo2bobo2bo3bo2bo10b o2bo3bo2bobo2bo3bo2bo55bobo7bo4bo10bo7bo19bo6b2o3bo5bo52b2o14b3o38b2o 120b2o283b2o12bo5bo24bo247bo48bo179b2o264b3o3b3o$14b3o4bo3bo3bo3bo3bo 3bobo34bo2bo9bo5bo3bo3bo3bo3bo3bobobo28b2o2b2o21b2o18b2o31bo2bo12bo2bo 141b2o24b2o2bo3b2o7bo15bo8bo15bo126b2o6b2o3b2obo5b5o4b2obobob2o6b2obob obo3bobobo316b2o6b2o67bo7bobo11bobo7bo34b2o15b3o4bo73b2obo3b3o3b3o3bob 2o46b3o2b6o2b3o45b2o220b2obo6bob2o10bo3bo2bo42b2o7bobo7b2o12b2o7bobo7b 2o52bo4b2o6b3o3b3o9b2o5bobo6bobo6bobo11b2obob2o52b2o12bo3bo38bobo7b2o 310b2o24b2o56bo2bo11bo5bo25bo2bo242b2o48b2o175bo6b2obo257b2obo3bob2o$ 13bo2bobo3bo3bo3bo3bo3bo2bobob2o12bo3bobobobo3bobo2b2obo7bobob2o3bo3bo 3bo3bo3bo5bo27b3o4b3o17b3o20b3o29bo2bo12bo2bo46bo6bo6bo32bobo30b2ob4ob 2o2b2ob2o26b2o3bo4b2o2bobobob7obobobobo2bobobobob7obobobo2b2o79bo6bo 33bobo9b2obob2o5b3o12bo6bobobobo2b2obobobo32b2o6b2o282bobo65bobo6b3o 11b3o6bobo56bobobob2o66bo2b3o13b3o2bo45bo2bo8bo2bo45b2o241bo6b2obo51bo bo30bobo62bo11bob2o5bo7b2o7b2o5bo2bo6b2o84bo4bo40bo7b2o99bo210b2o24b2o 55bobobo11bo5bo20bo4bobobo471bo3bo2bo$13bo2bobob3ob3ob3ob3ob3o2bobob2o 8b2o22bob2o8bo4bo3bo3bo3bo3bo3bobobob2o105b2o18b2o37b2o6b2o5b2o5b2o5b 2obo3bo4b2obo4bo3bo2bo31bo2bo2bo2bo2bo2bo27bo2bobo3bo2bo9bobo9bo2bo9bo bo9bo2bo72b2o2b2ob2o2b2ob2o2b2o21b2obo2bo6b5obo16bob2ob2ob2o13bobo2bob ob2o30bo2bo4bo2bo75b2o13b2o190b2o3b3o31b2o3b3o21bo31bo34b2o20bob2ob2ob o65bobobo17bobobo45b2o10b2o292b2o153b3o12b3o4b2o22b2o14bo80bo3bo12b2o 2b2o21b3o107bobo217b2o73bo2bo39bo5bo2bo433b2o36b3obo3bo$14b3o2bo2b2ob 3ob3ob3obobo3bo11bobobobobobo3bobobobobobo8b2obobobo3bo3bo3bo3bo3bo4bo 106b3o20bobo39bobob2obobob2obobob2obo6bo3b2o6bo3b2o4bobob2o27b2ob2o2b 2ob4ob2o25bobo8bo2bobo5b3ob3o5bo2b2o2bo5b3ob3o5bobo2bo72b2o4bo6bo4b2o 20bob2obob2o4bo5bob2ob2obo12b2o3b3ob2obob3obo2b3o3bo33bobo6bobo71b2obo 2bob2o5b2obo2bob2o191bobo7bo23b2o3bobo7bo25b3o3b3o46bo8bo12bo72bobobo 19bobobo352bo47b2o4b3o3b3o4b2o12b2o4b3o3b3o4b2o66b2o27b2o3bo10b2o97b2o 124b2o10b2obo8bobo204bo2bo71bo18b3o22bo6b2o423b2o9b2o33bo11bo258bo3bo$ 17bobobo3bo3bo3bo3bobobobo8b2obo22b2o11bo5bo3bo3bo3bo3bo3b2obobo25b3o 4b3o17b3o20b3o52bo30b2obo2bobo4bobo4bobo4bobobobo4b4obobo4bob4ob2obo 13b2ob4ob2o2b2ob2o42b2o5b3o7b2o2b2o5b2o2b2o8b2o2b2o5b2o2b2o7bo2bo107bo 4bo8b4o5b2o10bo3bobo2b2obob2ob2o4bobo4bobo31b2o2b3o2b3o2b2o30b2o37b2o 2bo4bo5bo4bo2b2o191b3o6bobo27b3o6bobo24bobo3bobo47bo6bobobob2o5b2o70b 3o2bo21bo2b3o107b2o242bo2bo42bo2bo15bo2bo10bo2bo15bo2bo96b2o7bobo3b2o 17bo62bo3bo12b2o123b2o10b2ob2o6bo2bo205b2o73bobo3bo391b2obo6bob2o6b2ob o49b4o4b2o41bo3bob3o261bo3bo$16bobobobo3bo3bo3bo3bobobo10bob2o2bobo3bo bobobo3bo14bobobo3bo3bo3bo3bo3bo5bo29b2o2b2o21b2o18b2o53b2o28bo2bob4o 27b2o5bo4b2o4bo7bobo11bo2bo2bo2bo2bo2bo47b2obo12b2o2b3o2b2o14b2o2b3o2b 2o13bo105b2ob4obob2o4bobo3bo2bobo3bob3obo3bobo2bo3bobo4b2obob4ob2o31bo 6bo2bo6bo25b2obo2bob2o38bo13bo206bo38bo25b3o3b3o46b2o5bob2ob2obo78bob 2o3b3o11b3o3b2obo103b2obo4bob2o283bobo17bobo10bobo17bobo97bo2bo4bo23bo 63bo4bo12bo135b2obo6b2o10b2o201bo75bo32b3o3b3o350bob2o6b2obo6bob2o49b 3ob2o2b2o42bo2bo3bo$16bo3bobob3ob3ob3ob2o2bo2b3o7bo2bo39bo3bo3bo3bo3bo 3bo34bo2bo23bo2bo12bo2bo28b3o53b2obo58b2o11b2ob2o2b2ob4ob2o46bobo59bo 4bo103bobo4bobo4b2ob2obob2o2bobo3bo10b2o5b4o8bo4bo33bob2o10b2obo25b2o 2bo4bo39bobo7bobo57b2o3b2o270bo87b2o4b3obo7bob3o4b2o104bo10bo284bob2o 13b2obo12bob2o13b2obo99bobo4b2o14b2o6b3o48b2o12bo3bo38b3o107bobo5b2o3b o8b2o200b3o61b2ob2o8bo389b2o4b2o2b2o8b2o58bo9b3o34bob2o6bo$13b2obobo2b 3ob3ob3ob3ob3obobo2bo7bo2b2o2bobobobo3bobobo19bo3bo3bo3bo3bo3bo35bo2bo 23bo2bo12bo2bo27b2o58bo71b2o61bo61b2o2bobo65b2o4bo6bo4b2o17bo3b3o2bob 3obob2ob3o3b2o12bob2ob2obo5bo4b2obob2obo34bobo10bobo31bo113bobobobo 131b2o37b2o97b2o88bo5bobobo5bobobo5bo106b2o6b2o28b2o256b3o13b3o14b3o 13b3o47b5o72bo12bo44b2o14b3o40bo7b2o99bo8b2o5b2o110b2o24b2o66b5o60bo 49bo352bo5bo4bo8bo70b2o40b2o$13b2obobo2bo3bo3bo3bo3bo3bobo2bo4b3o37bo 5bo3bo3bo3bo3bo3bobobo59b2o10b2o27bo2bo59b2o132b2o66bob2o63b2o2b2ob2o 2b2ob2o2b2o14b2obobo2bobo13b2ob2ob2obo16bob5o6bo2bob2o37b2o3b2o3b2o34b obo4b3o30b2o4b2o3b2o4b2o42b2o12bobo12b2o120bo38bo194bo2bo5bo2bo110b3o 2b6o2b3o25bobo119bo7bo128b2o13b2o16b2o13b2o47bob3obo8bo59b3o12b3o100bo bo7b2o109bo2bo4bo109b2o24b2o41b2o89b2o2bo3b3o3b3o7bo24bo353bo5bo2bo10b o38b2o26b2o42bo$16bobo3bo3bo3bo3bo3bo4b3o5bo7bobobo3bobobobo2b2o11bobo b2o3bo3bo3bo3bo3bo5bo61b3o6b3o28bo2bo334bo6bo21bobobob2o2bobobobo6bo 12b3o5b2obob2o9bobo47bobo46b3obo28b2o4b2o3b2o4b2o41bo2bo10b2ob2o10bo2b o116b3o36b3o196b2o7b2o111bo2bo8bo2bo27bo354bo3bo7bobo12b2o3b2o12bo27bo 13b5o99b2o120bobo87b2o2b2o4b2o2b2o4b2o13b2o58bo2b2o88b3o20bo8bo15bo 315b2o9b2o24b2o4b2o2b2o8b2o38b2o26b3o37bo2bo263bo$16bo3b3ob3ob3ob3ob2o 2b3o35bo12bo4bo3bo3bo3bo3bo3bobobob2o97b2o366bobobo3bobobob2o6b2obobob 2o4b5o5bob2o3b2o6b2o48b2o43b2o3bobobo27b2o15b2o36bo2bo2bobo25bobo2bo2b o111bo38bo321b2o10b2o28b2o116b3o7b3o225b3o5bo3b2o8b2o3b5o14b2o38b2o3b 2o75bo235bo3bo5bo3bo5bo12bo2bo59b4o87b3o8bo11bo8bo137b2o7b2o183b2o9b2o 26b2obo6bob2o6b2obo63bobo302bobo$17b3o2b2ob3ob3ob3ob3o3bo11bo3bo3bobob obo3bobo2bo9b2obobobo3bo3bo3bo3bo3bo4bo98bobo92bo13bo13bo144bo2bo99b2o b4o2b2obo7bo2bob2obo4bob3obo4bo4b2obo52b2o8b2o37b2o4bo2bo28bo4b2o3b2o 4bo37b5obob2o23b2obob5o26b2o3b2o10b2o3b2o583b2ob2ob2ob2o227bo4b3o12b2o 4b2ob2o13b2o30bo88bobo234bo3bo5bo3bo5bo14b2o57bo5b2o20b5o60b2o2bo7bo 20bo138bo8bo222bob2o6b2obo6bob2o51b2o11b2o189bo111b2ob2o$19bobo3bo3bo 3bo3bobo2b2o9bobobo3bo9bo7b2o10bo5bo3bo3bo3bo3bo3b2obobo60b3o4b3o25bo 72bob2o2bob2o2bob2o6bobo11bobo11bobo4b2o137b2o70b2o6b2o28b2o3bo8bobo4b o2b3o5b3o3b3obo53bobo10bobo42b2o28bobo3b2o3b2o3bobo42b2o3bo19bo3b2o32b obobobo10bobobobo140bo7bo435b3o3b3o232bo17bo3b2ob2o47bo87b2o234b2o2b2o 4b2o2b2o4b2o74b3o3bo20b3o60bo12bo7b3o3b3o143bobo6bobo116bo15bo85b2o4b 2o8b2o2b2o4b2o49b2o201b2o8b2o101bo3bo$20bobo3bo3bo3bo3bo13bo4bo3bo5bo 3bo4b3o2bo8bobobo3bo3bo3bo3bo3bo5bo64b2o2b2o27b2o71b2obo2b2obo2b2obo7b o13bo13bo5bo210b2o6b2o26bo2bo3b2o8b2o4bobo3bo3bo3bo4bobo52bob2o10b2obo 34b2o34b2obo13bob2o37b3o2b2o8b3o3b3o8b2o2b3o13b2o2bo12bobo14bobo12bo2b 2o124bobo5bobo435bo5bo226b2o5b2o21b3o148b2o228bob2o6bob2o19b3o55b5o13b o8bo61b2ob2o25b3o3b3o7bo20b2ob2o102b2o7b2o116b3o11b3o85bo5bo10bo2bo5bo 80b2o157b2o11b3obo5bo2bo99b3ob3o$21bo2b2ob3o2b2o2b2o14b6ob2o5bo2b2o7bo b2o14bo3bo3bo3bo3bo3bo69bo2bo92bo28bo5bo7bo5bo7bo5bo3bo17b2o2b2o2b2o2b 2o2b2o2b2o206b2o20b2obob3obob4o6bo53bo6bo2bo6bo34b2o91bobo2bobo3bo4bob o3bobo4bo3bobo2bobo12bo2bobo10b2ob2o12b2ob2o10bobo2bo125bo7bo366b2o8b 3o14b2o275bo16b2o32bo28bo8b3o88bobo221b2o4b2obo6b2obo19bobo58bo12bobo 12b2o81bo20bo24bo232bo9bo89bo5bo8bo4bo5bo79b2o157b2o10b2o8b2ob3o99bo3b o$22b2ob3o2b2ob3o22bo7b4o5b2obo17bobo5bobo5bobo71bo2bo92b3o6b3o3b3o3b 3o3b11o3b11o3b12obo16b2o2b2o2b2o2b2o2b2o2b2o232bo3b3o65b2o2b3o2b3o2b2o 128bob2o2b2o8b3o3b3o8b2o2b2obo13bobobo42bobobo501b2o8bo3bo12b2o272b3o 16bobo33b2o23b3o9b3o90bo222bo8b2o8b2o17b3o66b2o4b2o11bo2bo80bo8bo11bo 10b3o6bo2b2o232b2o9b2o87b2o4b2o8b2o2b2o4b2o6bob2ob2o36b3o199b2o8b2obo 100bo3bo$23bo2bo2bo2bo2bo16b2o2bobo12bo6bo21bo7bo7bo168bo4bo3bobo3bobo 3bobo11bobo11bobo11bobo67b2o100b2o101bobobob2obo62bobo6bobo74b2o15b2o 38bo3b2o3bo19bo3b2o3bo13b2obob2o40b2obob2o510bo4bo285bo20bo32b2o129b2o 148b2o70bo10bo9bo18b2o66b2o18b2o81bo8bo32b3o335b2obo6bob2o6b2obo7b2ob 2o2b2o36b2o8b2o190bo10bo102bobo4b2o$23bo6bo4bobo14b2o2b2o10b3obo3bobob 2o13b5o3b5o3b5o168bo5bo3bobo3bobo3bobo2b2o3b2o2bobo2b2o3b2o2bobo2b2o3b 2o2bobob2o11b26o25bo2bo100b2o100b2o2bo2bob2o62bo2bo4bo2bo74b2o15b2o39b 2obob2o23b2obob2o13bo3b2o3bo36bo3b2o3bo510bo3bo621bo70b2o8bo9bo19b3o 93b2o82bo7b3o3b3o4bo5bo5b3o198b2o4b2o4b2obo6b2obo111bob2o6b2obo6bob2o 7bo41b2o7b4o4b2o301bo5b2o$24b6ob4ob2o30bo3bo4b2ob2o18bo7bo7bo167bo3bob o3bobo3bobo3bobo3bo3bo3bobo3bo3bo3bobo3bo3bo3bobob2o10bo2bo5bo5bo5bo5b o231bobo2bo67b2o6b2o134bobobo25bobobo13bob2o2b2o8b3o3b3o8b3o3b3o8b2o2b 2obo829b3o57bo232b2o11bobo5b2o71b2o8b2o18bobo93b2o12b2obo6b2obo6b2obo 32b3o32bo5bo4bo2b2o82bob2o112bo5bo4bob2o6bob2o149b2o33b3o6b3ob2o2b2o 186bo$31bo2bo37b2o22bobo5bobo5bobo173bo23bo3bo9bo3bo9bo3bo5bo12bob2obo 3bobo3bobo3bobo3bobo128bo101bo2b2o212bobobo25bobobo13bobo2bobo3bo4bobo 3bobo8bobo3bobo4bo3bobo2bobo509bo3bo7b3o279b2o3b2o19b3o26bo20bo9bo232b o13b2o5bo2bo59b2o38b3o50b2o55bob2o6bob2o6bob2o58bo8bo5bo9bo75b2o3bo2b 2o2b3o12b2o92bo5bo3b2o4b2o2b2o4b2o74bo3bo61b2o5b2o34bobo10bo105b2o4b2o 4b2obo6b2obo6b2obo4b2o4b2o36b2o$26b2o3bo2bo63bo7bo7bo170bo2bobo3bobo3b obo3bobo3bo3bo3bobo3bo3bo3bobo3bo3bo3bobob2o10bo2bo5bo5bo5bo5bo24b2obo 100bobo99b2o215b2obob2o23b2obob2o13b3o2b2o8b3o3b3o8b3o3b3o8b2o2b3o509b o4bo5b2obob2o133b2o34b2o106b2o3b2o18bo3bo20bo5b2o17b2o8bobo219bo9bobo 24bo9bobo47bo91b3o15b2o41b2o2b2o4b2o2b2o4b2o28bo5bo21bo20b2ob2o75b2o3b o6b2o13b2o92b2o4b2o2bo5bo3bo5bo75bo3bo61b2o42b2o117bo5bo4bob2o6bob2o6b ob2o5bo5bo23b2o10b2o13b2o30b2o$26b2o4b2o251b2obobo3bobo3bobo3bobo2b2o 3b2o2bobo2b2o3b2o2bobo2b2o3b2o2bobob2o11b26o27bobo2b2o90b2o2bo2bo315bo 3b2o3bo19bo3b2o3bo16b2o3bo36bo3b2o503b2o8bo3bo5bo5b2o132bobo34bobo129b o5bo17b3o4b2o18bobo6b2ob2o217bobo8b2o25bo7bo3bo46bo9b2o8b2o23b2o40b2o 2bo2bobo10b2o2b2o2b2o37bo3bo5bo3bo5bo29bo5bo21bo10b3o92b2o3b3o110bob2o 5bo5bo3bo5bo148bo153bo5bo3b2o4b2o2b2o4b2o2b2o4b2o2bo5bo24b2o11b3obo9b 2o30b2o$288bobo3bobo3bobo3bobo11bobo11bobo11bobo68bo4bo90b2obo318bob2o 2b2o8b3o3b3o8b2o2b2obo9b5obob2o40b2obob5o497b2o8b3o8b2obob2o132bo38bo 107b3o3b3o14bo3bo9b3o5bo35bo5bo89b2o115b2o7bob2o35bo7bo50b2o8b2o8b2o 22bo2bo39b2o2b2o2b2o10b2o2bo2bobo38bo3bo5bo3bo5bo28bo5bo129bo3bo111b2o bo4b2o4b2o2b2o4b2o10bo5bo123b2o2b2ob2o153b2o4b2o2bo5bo3bo5bo3bo5bo3b2o 4b2o6b2o29b2o$288bo2b3o3b3o3b3o3b11o3b11o3b12obo16b2o2b2o2b2o2b2o2b2o 2b2o31bo98b2o316bobo2bobo3bo4bobo3bobo4bo3bobo2bobo9bo2bo2bobo42bobo2b o2bo520b3o132b2ob4o30b4ob2o105b3o5bo15b3o12bo5b2o37bo92bobo113bobo6b2o b2o23b2o6bo2bo7bo4bo8b2o81b2o44b2o20b3o38b2o2b2o4b2o2b2o4b2o14b2o57b3o 102bo5bo99b2o2bo5bo3bo5bo10b3o3b3o53b2obo3bob2o59b2ob2obo156bob2o5bo5b o3bo5bo3bo5bo4bob2o8b2o30bo$58bob2o4bob2o4bob2o209b2o22bo5bo7bo5bo7bo 5bo3bo17b2o2b2o2b2o2b2o2b2o2b2o31bo2bo3b2o6b2o6b2o30b2o6b2o257bo15bo 79b3o2b2o8b3o3b3o8b2o2b3o15bo2bo8bo7bo8bo7bo8bo2bo578b2o79bobobo2bo30b o2bobobo105bo5bo30bo19bo22b2o3b2o91bo112bo6b3obob2o23b2o6b2o10bo12b2o 63b2o24b2o58b2o35b2obo4bo5bo3bo5bo14bo2bo13b3o38bob3o88bo3bo9bo5bo100b o3bo5bo3bo5bo8b2obo3bob2o53b3o3b3o223b2obo4b2o4b2o2b2o4b2o2b2o4b2o4b2o bo$58b2obo4b2obo4b2obo213b2obo2b2obo2b2obo7bo13bo13bo5bo76bo4bo2bo4bo 2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo2bobo2bob2obo2bob2obo2bo228b2o 13b2o83b2o3bo19bo3b2o20b2o8bobo5bobo6bobo5bobo8b2o127b2o3b2o414b4o27b 2o79bobo7b2o22b2o7bobo163b2o118b2o102b2o7bo2bo2bo2bo2bobo9b2o32bo3bo 73b2o24b2o95bob2o5bo5bo3bo5bo12bobobo53bobobo87b2o3b3o114bo3b2o4b2o2b 2o4b2o73bo5bo228b2o2bo5bo5b2obo6b2obo10b2o$291bob2o2bob2o2bob2o6bobo 11bobo11bobo4b2o75bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4bo2bo4b o2bo4bo2bo4bo2bob2o184bo15bo24b2o13b2o77b5obob2o23b2obob5o25bo7bo8bo7b o137bo2bobo2bo412bo3bo106b2o2bo7b2o5b2o8b2o5b2o7bo2b2o144b3o13b2o223b 2o7bo6b2o4bo10b2o12bo10bobo8bobo173b2o19b2o8b2o4b2o2b2o4b2o11b3obo38b 3o13bo2bo83b2o3bo6b2o3b2o11b2o95b2o2bo5bo3bo5bo310bo3bo5bo4bob2o6bob2o 11bo46bo2bo$58b3o5b3o5b3o30bobo204bo13bo13bo82bo4bo2bo4bo2bo4bo2bo4bo 2bo4bo2bo4bo2bo4bo2bo4bo2bo2bobo2bob2obo2bob2obo2bo187b2o13b2o25bo13bo 78bo2bo2bobo25bobo2bo2bo184b2o3b2o3b2o3b2o412bo14bobo88bo4b2o13bo10bo 13b2o4bo133b2o8b3o35b3o210bobo33bobo9b2o185bobo18bo9bo5bo3bo5bo12b3o 57b2o84b2o3bo2b2o2b3o117bo5bo3bo5bo11bo3bo292bo3b2o4b2o2b2o4b2o8b2o8bo 25b4o22bo19b4o$57bo2bo4bo2bo4bo2bo28bo2bo2bo309b2o4b2o6b2o6b2o6b2o6b2o 6b2o6b2o6b2o6bo209b2o13b2o28b2o5b2o86bo2bo10b2ob2o10bo2bo189bo15bo408b o2bo18bo87b5o13bobo10bobo13b5o115b2o16b2o7bo3bo33b2obo211b2o21bo11bo2b o9bo187bo19bo9bo5bo3bo5bo52bo5bo104bob2o11bo5bo103b2o4b2o2b2o4b2o11bo 3bo292b2o2bo5bo3bo5bo9bo9b2o23bo3bo18bo3bo18bo3bo58b2o$57bo7bo7bo29bo 2bobobo2bo71bo3bo230b4o95bo182bo13bo60bo15bo48b2o12bobo12b2o187b2obo 15bob2o389b3o35bo85b2o4bo13b2o12b2o13bo4b2o113b2o47bo15b2o235bobo11bo 2bo196b2o17b2o8b2o4b2o2b2o4b2o17b3o10bo21bo5bo119bo5bo46b2o51b2o4b2obo 6b2obo315bo5bo3bo5bo9bo37bo19b4o22bo59b2o$59bo7bo7bo25bo2bobobobobo2bo 69bo3bo229bo2bobo90b4obo184b2o5b2o30bo11bo20b2o13b2o60bobobobo198bobob 2o13b2obobo388bo2bo31bo2bo84bo2b2o23b2o23b2o2bo100b3o35b2o3b2o17b2o14b 2o224bobo6bo2bo232b2obo6b2obo6b2obo7b2ob2o20bo21bo5bo162b2o6b2ob2o14b 2o34b2o4bob2o6bob2o314b2o4b2o2b2o4b2o8b2o33bo2bo42bo2bo59bo24b2o$55b2o 6b2o6b2o29bobo2bo2bobobo2bo67bo3bo100b2o21b2o103bobo2b2o90b3obobo222bo 11bo20b2o13b2o60b2o3b2o198bobo5b3o3b3o5bobo388bo35b3o84b2obo7bo5bo8bo 4bo8bo5bo7bob2o100b3o17b2o39b2o16bobo223b2o5bo2bo12bo2bo103bo113bob2o 6bob2o6bob2o7bo9bo5bo8bo190b2o6bo2bo15b2o295b2o67b2o4b2obo6b2obo6b2obo 10b2o6b3o3b3o142bobo$22b2o2b2o18b2o11b2o6b2o6b2o23b3obo5b2o2bobo67b2o 3b2o94b2o2bobo21bobo2b2o97bobo100bobo180bo11bo29b2o7b2o22bo13bo264b2o 2bo5bobo3bobo5bo2b2o386bo18bo2bo103bo6b3o3b3o6bo6bo6b3o3b3o6bo102bo3bo 17bo57bo2b2o221bo22b2o105bo5bo139b2o2bo4bo5bo32b3o172bo2bo143b2o9b2o 156bobo66b2o4bob2o6bob2o6bob2o10b2o5bo2bo3bo2bo143bo$22bobo2bo18bo2b2o 3bo2bo4bo2bo4bo2bo4bo24bo10bob3o64bobo3bobo45bo47bo3bo4bobo2bo2bo2bo2b obo4bo3bo96b2o103bo181bo11bo17b3o29b3o13b2o5b2o200bo7bo20bo7bo28bo4b2o 4b3o3b3o4b2o4bo386bobo14bo107b2o4bobobobobobo4bo8bo4bobobobobobo4b2o 121b3o291bo2bo119bo5b3o138b3o5bo5bo4b3o3b3o195b2o145bo9bo159bo113b2obo 3bob2o69bo73b2o$26bo20bobo2bobo2bo4bo2bo4bo2bo4bo20b4o12bo64b5o5b5o42b o48b3ob5ob13ob5ob3o97b3o101b2o182b2o7b2o19b3o10b2o3b2o10b3o222bobo5bob o18bobo5bobo27b5o21b5o403bo3bo108b3ob2ob2ob3o3bo8bo3b3ob2ob2ob3o106b2o 3b2o13bo18b2o27bo233bo13b2o29bo10bo70b2o6b2o7bo137b3o28b3o10bo123b2o 197b3o11b3o103b2o51b2o169bo5bo5b2o8b2o15b2o$19b2o2bo5b2o15b2obo9b2o6b 2o6b2o3b2o34b4o117bo3bo46bo25bo45bo15bo40bobo100b2o170b3o29b3o12b2o5bo 7bo5b2o17bo11bo198bo7bo20bo7bo32bo21bo378b2o27b4o80bob2o6b2obo16bobobo bobobo4bo8bo4bobobobobobo146bobo27b2o73b2o156b2o42b2o9b2o69bobo9bo4b2o 136b2o2bo6b3o10bo20bo106b2o14b2ob2o19b3o29b2o142bo15bo103b2o186b2o19bo b2o11bo5bo5b2o7b2o16b2o$19bobo3bobo2bo19b2o3b2o6b2o6b2o9bob2o12b3o135b 2o3bo44b2o2b24o2b3o31bo3bo4bobo4bo3bo4bobo4bo3bo31b2o100b2o171b3o10b2o 3b2o10b3o15bo17bo19bo11bo262b4o27b4o372b2o111b2obo6bob2o17b3o3b3o6bo6b o6b3o3b3o147bo28b2o74b2obo15bo126bobo8bobo37bo4bobo7b2o4b2o2b2o60bobob 2o2bo4bo140bo24bo5bo5bo8bo106b2o15bo2bo20bo29bo2bo448b2o14b2o3bo2b2o2b 3o28b2o2b2o$23bo5bo23bo4bo2bo4bo2bo4bo2bobo2bobo16bo16b3o114bobo3bo43b obo5bo4bo4bo4bo4bo5bob2o27b5o4bobo4b5o4bobo4b5o265b2o44b2o5bo7bo5b2o 16bo3bo2bo11bo2bo3bo16b2o7b2o263bo2bo10b2o3b2o10bo2bo424b3o56b2o8b2o4b 2o16bo5bo8bo4bo8bo5bo122b3o6b3o123bo13bobo125bo3bo44bobo13b3o4b2o2b2o 61bobobo7bo140b2ob2o20bo5bo5bo29b2ob2o98bo2bo18b3o29bo2bo15b2o63b2o9b 2o357bo13b2o3bo6b2o3b2o11b2o$16b2o2bo5bo5b2o19bo4bo2bo4bo2bo4bo2bo3b2o 2bo11b4o16bo62b5o5b5o37b5o4b2o42bob2o5bo4bo4bo4bo3b2o4bob2o27bo3bo3b2o b2o3bo3bo3b2ob2o3bo3bo264bobo46bo17bo18bo5bo6bo6bo5bo4b3o29b3o708b2obo b2o8b3o8b2o34bo8bo5bo34b2o138bo3bo7bo55b5o55bo4bo11bo122b2o12bo10b2o 31bobo15b2o4b2o67bo5b3o173bo5bo4b3o3b3o7bo12bo99b2o51b2ob2o14b2o63b2o 9b2o376b2o3b3o$16bobo3bobo3bobo2bo21b2o6b2o6b2o11b2o32b4o28bo3bo20bo3b obo11bobo3bo41bobo38b2obo4b2o3bo4bo4bo4bo5b2obo26b2o2b2ob2o3bo3bo3b2ob 2o3bo3bo3b2ob2o2b2o212b2o46bo44bo3bo2bo11bo2bo3bo20bo4b2obo5bo11b3o10b 2o3b2o10b3o203b8o498b2o5bo5bo3bo8b2o33bo10bo5bo15bo7bo20bo7bo119bo5bo 5bo15bo33bo5bob3obo53bobo4bob2o5b3o4bo7b2o108b2o8bo4bo7bo2bo30bo2bo16b 2o70bo2bo26bo180bo7bo2b2o155b2o295b2o174bo3bo9bo5bo52bo$20bo5bo5bo13b 2o11b2o6b2o6b2o19b3o51bo3bo20bo3b2o13b2o3bo42b5o35b2obo5bo4bo4bo4bo4bo 5bobo25bobo3bobo4b5o4bobo4b5o4bobo3bobo211b2o44b2ob4o40bo5bo13bo5bo29b o21b2o5bo7bo5b2o208bob4obo40bo4b3o21b3o4bo67b2o4b2o346b2obob2o5bo4bo 43b2o8b2o4b2o14bobo5bobo10bo7bobo5bobo118b2obob2o56b2o4bo3bo63b2o4bo7b 2o6bobo121bo7bo35bobo17bo73bo26bo155b3o10bo11bo8b3o101b2o350bobo187bo 5bo15b2o2b2o31b2o$13b2o2bo5bo5bo5b2o9bo2b2o3bo2bo4bo2bo4bo2bo4bo20bo 20b3o27bo3bo20bo3bo15bo3bo86b3o2b24o2b2o26bo5bobo4bo3bo4bobo4bo3bo4bob o5bo206bo10bo38bo3bo2bo46bo13bo36bo22bo17bo81bo5b2o3b2o94b2o20b8o20b2o 17bobo3bobo3bo13bo3bobo3bobo66bobo2bobo27b2o319b3o7bo3bo46bob2o6b2obo 17bo7bo10bo2bo6bo7bo181b2o6b3o57bo12b2o3b5o3b2obobo117bo3bo7bo23bobo5b 2o3bobo86bo3bo26bo143bo24bo20b3o100bo2bo351bo173bo3bo21b2o7b2o16b2o17b obo$13bobo3bobo3bobo3bobo2bo10bobo2bobo2bo4bo2bo4bo2bo4bo16b4o20bo29b 2o3b2o18b2o3bo15bo3b2o31b5o53bo25bo27b2o6bo15bo15bo6b2o35bob2o165bobo 8bobo37bobobo99bo14bo4bo3bo2bo11bo2bo3bo75b3o5bobobobo94bo6b3o3b3o20b 3o3b3o6bo17bobo3b3o3bo13bo3b3o3bobo68bo2bo6b2o4b2o8b2o3bo2bo380b2obo6b ob2o20bo7bo7bo2bo9bo7bo187bo28b2obo6b2obo15b2o17b2ob2o3bobobo118bobo9b o23b2o5bobo5bo86bo3bo5bo19b2o143bo24bo7b3o3b3o3bo2b2o82b2o15bo2bo6b2o 158bo122b2o60b2o170b2o3b3o20b2o8b2o15b2o$17bo5bo5bo5bo10b2obo9b2o6b2o 6b2o3b2o37b5o24bobo3bobo16bobo3bo15bo3bobo25bo3bobo16bo35b3ob5ob13ob5o b3o109b2obo9bo11bo11bo11bo65b2o2b2o47bobo3bo2bo3bobo34b2ob3o91bo8bo4bo 9b2obobo5bo13bo5bo74bo10bobo12bo2b2o76b2obo6bobo3bobo20bobo3bobo6bob2o 15bo35bo68b2o2b2o6bo4bobo8bo3b2o331bo3bo50b2o2b2o4b2o17bobo5bobo8bo9bo bo5bobo121bo93bob2o6bob2o15b5o17bo6bo133bo2bo5b2o13bo5bo98bo4b2o17bo 146bo49bo81b2o14b2ob2o6b2o156bobo123bo227b2o3bo6b2o13b2o15bo$14bo5bo5b o5bo17b2o3b2o6b2o6b2o9bob2o8b5o46b5o5b5o10b5o25b5o22bo3b2o7b5o4bobo33b o3bo4bobo2bo2bo2bo2bobo4bo3bo120bobo9bobo9bobo9bobo65bo3bo7b2ob2o34bob o4bo2bo4bobo32bo2bo88bo5bo13bo5bobob2o9bo13bo71b2o7b2o8b2ob2o10bobo2bo 76bo2b2o5b3o3b3o20b3o3b3o5b2o2bo110bo8b3o2b3o5bob2obo2bo7bob2o2b4ob2o 92b2o230bo4bo50bo2bo5bo19bo7bo20bo7bo108b2o11b2o22b3o35bo5b2o23b2o4b2o 2b2o12b2o5b2ob2o22bo2bo134b2o5bobo17b2o95bo2bo5bo7b3o6bo4bo179bo8b2ob 2o98b2o46bo5bo114b2o120b3o228b2o3bo2b2o2b3o12b2o$13bo2bobo3bobo3bobo3b obo16bo4bo2bo4bo2bo4bo2bobo2bobo13bo20b4o104bo3bo11bobo3b2o34b2o2bobo 21bobo2b2o103b2o3b3o3b2o4bobo9bobo9bobo9bobo4b2o58bo3bo9bobobo34bo5bo 2bo5bo33bob2o11b2o40bo13bo20bo3bo2bo11bo2bo3bo4bo96bo32bobobo78b2o4bo 13b2o12b2o13bo4b2o16bo35bo11b2obo6bob2o32bobo9bo2bo6b2obobob2o6b2obobo bo3bobobo89bo4bo215b2o12bo3bo8b2o39bo4bo5bo36b2o126b2o34bo3bo35b2o3bo 24bo5bo3bo12bobo6bo28bo143bo6bobo107bo14bobo6bo9b2o132b3o3b3o32bo159bo 5bo11b2obo221bo236bob2o$13b2o5bo5bo5bo2b2o16bo4bo2bo4bo2bo4bo2bo3b2o2b o9b3o20bo107b2o3bo12b2o3b2o39b2o21b2o109bo4bo4bo4b2ob2o7b2ob2o7b2ob2o 7b2ob2o4bo58b2o2b2o8bo4bo80b2o3bo11bo35bo5bo13bo5bo18bo17bo105bobo29b 2obob2o79b5o13bobo10bobo13b5o17bobo3b3o3bo13bo3b3o3bobo10bob2o6b2obo 32bob3o16bo3bobo10bo3bo2b2obobobo88bo6bo214b2o14b3o8b2o39b2o2b2o4b2o 19bo5bo8bo4bo8bo5bo121bob2o19bo5bo33b2o5b3o22bo5bo3bo11bobob2o28bo3bo 143b2o6b2o105bobobo12b3o8b3o5bobo172bo3bobo166b3o2b2o2bo3b2o443bo$17bo 5bo5bo25b2o6b2o6b2o11b2o33b3o103bobo3bo13bo2b2o172bo4bo3bo4bo4bo4bobo 4bo4bobo4bo4bobo4bo4bo4bo66b2obo5bo78bo2b3o10bobo35bo3bo2bo11bo2bo3bo 16b2o5bo7bo5b2o104b2o27bo3b2o3bo78bo4b2o13bo10bo13b2o4bo17bobo3bobo3bo 13bo3bobo3bobo14b2o2b2o33bob2o4bo16b2obobo8bo3b4o6bob2o59b2o4b2o4bob2o 11bo8bo165bo5bo105bob2o6b2obo20b3o3b3o6bo6bo6b3o3b3o119bo2b2o19bo5bo 42bo21b2o4b2o2b2o12bobobo12b3o8bobo2bo3bo151bo50b2o13b3o37bobob2o28b2o bobo127b2o6bo22b3o18bo128b2o18b2o11b2o3b2o6bo3b2o88b2o48b2o302b2o58b2o $16bo2bobo3bobo3bobo12b2o11b2o6b2o6b2o19b4o45b5o5b5o10b5o25b5o17b5o18b o2bo3bo169b2o3b5o3b5o3b4ob4o3b4ob4o3b4ob4o3b5o3b3o53b2o2b2o5b2obo6bo 32b3o8b3o31b2obo6b3o3b2o40bo17bo15b3o10b2o3b2o10b3o11bo13bo60bo7bo8b3o 8b3o3b3o8b2o2b2obo78b2o2bo7b2o5b2o8b2o5b2o7bo2b2o19bo4b3o21b3o4bo15bo 4bo25b2o6b2o3b2obo15bo4bo3bob2obob2obo2bob3o2bo63bo5bo4b2obo11bo8bo 164b3o3b3o104b2obo6bob2o19bobobobobobo4bo8bo4bobobobobobo118b4o23bo69b 2obo6b2obo10bo14bobo8bo2bo5bo200bo4bo10b3o38bobo5b3o23bobobo127bo2bo5b o39bo2bo129b2o37b3o3b2o94bo48bo303bobo17bo38bo$16b2o5bo5bo2b2o12bo2b2o 3bo2bo4bo2bo4bo2bo4bo21bo16b4o27bobo3bobo16bobo3bo15bo3bobo43bo3b4o 124bo47b2o5b2o5bobobo7bobobo7bobobo7bobobo5b2o3bo53bo3bo8bobo5bo27b2o 18b2o30bo5bo3bo8bo33b2o5bo7bo5b2o12b3o29b3o4bo5bo13bo5bo40b2o2bo8bobo 5bobo7bobo8bobo3bobo4bo3bobo2bobo80bobo7b2o22b2o7bobo74bo2bo25bobo9b2o bob2o15bob2obo2bo4b2o4bobo4bobo62bo5bo3b2o15bo8bo163b2ob2ob2ob2o135b3o b2ob2ob3o3bo8bo3b3ob2ob2ob3o142bo3bo39bo27bob2o6bob2o9bo2bo3bobo6b3o8b obo3bo2bo206bo51b2o9bo23bo129bobobo4bo20bo5bo11bobobo153bo5bo9bo3bo96b obo21b2o21bobo272b2o5b2o41b2o25b2o10bo2b2o$20bo5bo20bobo2bobo2bo4bo2bo 4bo2bo4bo18b3o16bo32b2o3b2o18b2o3bo15bo3b2o13b2o157b5o44b3o2b5o2b3o3b 3o3b3o3b3o3b3o3b3o3b3o3b3o3b3o2b3obob2o48bo3bo9bob2o3b2o27b2o18b2o27b 3o5bo5bo5b3o28b3o10b2o3b2o10b3o19b2o7b2o16bo3bo2bo11bo2bo3bo40bo2bobo 8bo7bo8b3o8b3o3b3o8b2o2b3o81bobobo2bo30bo2bobobo73b2o2b2o18b2obo2bo6b 5obo20bob2ob3o10b2ob4ob2o63b2o4b2o3bo16bo6bo163b3o7b3o129b2o4bobobobob obo4bo8bo4bobobobobobo4b2o138b3o41b2o29b2o2b2o4b2o7bo5bo2bo25bo201bo5b o57bo4bo16bo5bo2bo128bo2bo25bo5bo11bo2bo154bo5bo111b2o8bo12b2o12b2o7b 2o273b2o5b2o40b3obo9b2o12b2o10bo2bo18bo$19bo2bobo3bobo15b2obo9b2o6b2o 6b2o3b2o35b3o30bo3bo20bo3bo15bo3bo14b2o35b2o119bo2bo8bo33b2obo4bo5bo4b o3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo4bo4bobo49b2o2b2o9bo38b3o8b3o31bo8bo 3bo5bo30b3o29b3o17bo11bo19bo17bo45bobobo50bo3b2o86b2ob4o30b4ob2o23bo2b o10b2o3b2o10bo2bo12b2obo6bob2o13bob2obob2o4bo5bob2ob2obo4b2o6bo4b2o2b 2ob2o3bo3bo4bo67bob2o4bo18bo4bo306bo6b3o3b3o6bo6bo6b3o3b3o6bo111b2o3b 2o21bo41b2o30bo3bo5bo8bo3bo2bobo23bobobo140b6ob2o51b6o61bo17b2o4bo135b o24bo5bo12b2o171bo3bo70b2obo3bob2o25b2o26bobo310b2o17b2o13b2o24bobo11b 2o4bo2bo$19b2o5bo2b2o19b2o3b2o6b2o6b2o9bob2o12b4o48bo3bo20bo3b2o13b2o 3bo22b5o24b2o32bo57bo28bo2bob2o5bobo32bobo5bo3bo5bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo3bo3bo5bo2b2obo65b7o81b2o3b3o6bob2o39b2o7b2o29bo11bo17b2o5bo 7bo5b2o42b2obob2o51b2obob5o82bo38bo25b4o27b4o12bob2o6b2obo13bo4bo8b4o 5b2o6bo2bo6b2ob4o5bo4b2obob2obo67b2obo4b2o19b2o168bo7bo128b2obo7bo5bo 8bo4bo8bo5bo7bob2o111bo99bo3bo5bo7bo3bo28b2obobo139b6ob2o66b3o46b2o19b o5bo3bo128bobo20b2o194b3o3b2o68bo2bo3bo2bo24b2o29bo312bo17b2o39b2o12b 2o3b5o10b2o$23bo29bo4bo2bo4bo2bo4bo2bobo2bobo17bo12b4o31bo3bo20bo3bobo 11bobo3bo14b4o3bobo61b3o43b2o8b3o28b3o8bobo33bobo4b2o3b2o4bobo3bobo3bo bo3bobo3bobo3bobo3bobo3bobo4b2o5bob2o46b2o2b2o16bo80bobo10b3o2bo38bo 11bo53b3o10b2o3b2o10b3o36bo3b2o3bo50bobo2bo2bo82bobo34bobo31bo21bo22b 2o8b2o9b2ob4obob2o4bobo3bo2bobo3bo2b2o6bo3bo3b5o6bo2bob2o72b2o4bob2o7b 2o16b2o295bo2b2o23b2o23b2o2bo108bo5bo95b2o2b2o4b2o7bo28bo6bobo146b2o 67b3o45bo26bo3bo135bo2bo11bo2bo4b3o170b2o13b2o6bo3b2o64b3o3b3o26b2o2b 2o22b3o124b4o169b2o10b2o2bo17bo52bo5b3ob2o9b2o$22bo2bobo25bo4bo2bo4bo 2bo4bo2bo3b2o2bo13b3obo10bo65b5o5b5o19bo3bo2b2o65bob2o5b2ob2o5b2ob2o5b 2ob2o5b2obobo4b2obo31bo4b2o6bo30b2obo4b2o7b2o4bo3bo3bo3bo3bo3bo3bo3bo 3bo3bo3bo4b2o7bobo48bo3bo12b2o33bo5bo2bo5bo34bo11bo3b2o39bo11bo30b2o5b 2o13b3o29b3o34bob2o2b2o8b3o3b3o8b3o8bo7bo8bo2bo88b2o34b2o28b5o21b5o18b o10bo8bobo4bobo4b2ob2obob2o2bobo3bo11b2obob2o9bobo79bo4b2obo8bo7b2o7bo 297b2o4bo13b2o12b2o13bo4b2o110b2ob2o21b2o69b2obo6b2obo9bo2bo22b2ob2o5b 2o140b2o5b2o115bo26bo137bo2b2o2bo9bobobo162bo13b2o12b3o2b2o2bo3b2o250b 2obo4bo168b2o11bo2bo57b2o18b2obo$22b2o2b2o27b2o6b2o6b2o11b2o15bobo2b2o 5bob3o99b2o2bo61b4obobo7bobo7bobo7bobo7bobo7bobob4o25b2obobo3bobo33b2o b2o18bo3bo3bo3bo3bo3bo3bo3bo3bo3bo3bo12b2o2bo46bo3bo13b2o32bobo4bo2bo 4bobo32b2o11b2obo81bo13bo22b2o7b2o46bobo2bobo3bo4bobo3bobo8bobo7bobo5b obo8b2o155bo4b2o4b3o3b3o4b2o4bo19bo8bo9bo3b3o2bob3obob2ob3o3b2o17bob2o 3b2o6b2o79bo9b2o6bobo3bo4bo3bobo299b5o13bobo10bobo13b5o113bobo22b2o47b 2o20bob2o6bob2o10bo6bo17b5o147b2o5b2o115bo26bo2bo134bo2b2o2bo10bob3o 159bobo32b2obo255bo3bo4bo182bobo17bo38bobo19b2o$59b2o6b2o6b2o23bo2bobo bo2bo2bobo100b2o3bo60bo5bobo7bobo7bobo7bobobo5bob2o6bobo5bo27bobo3bo2b o3bobo50b3o3b3o3b3o3b3o3b3o3b3o3b3o16b2o46b2o2b2o47bobo3bo2bo3bobo46bo 2bo43b2o5b2o28b2o13b2o20bo11bo46b3o2b2o8b3o3b3o8b3o8bo7bo167b2o2bo5bob o3bobo5bo2b2o19b2o8b2o5b2obobo2bobo13b2ob2ob2obo14bo4b2obo87b2o9bo7b2o 2bo6bo2b2o300bo4b2o13bo10bo13b2o4bo114bo72bobo41bobobo3b2ob2o17b2o147b 2o5b2o6bo128b3o5bo138b4o14b3o160b2o291bo4b2o185b2o17b2o26b2o10bo2bo$ 56bo7bo7bo29bo2bobobobobo2bo99b2o3bo60b2obo5b3ob3o3b3ob3o3b3ob3o2bobo 2b3o4bo2b3o5bob2o34bobo3bobob2o52bobobo7bobobo7bobobo123bobo8bobo44b3o b2o41bo13bo25b2o13b2o20bo11bo50b2o3bo27b2o182bobo5b3o3b3o5bobo17b2obo 6bob2o8bobobob2o2bobobobo6bo14b2o8b3obo100bo11bo8bo304b2o2bo7b2o5b2o8b 2o5b2o7bo2b2o115bo74bo40bobob2o3b5o3b2o12bo148b2o12bobo125bo7bobobo 134bobo2bobo318b2o2b2o22b3o119bo2bo4b2o200b2o13b2o12b2o10bo2b2o17b2o$ 58bo7bo7bo29bo2bobobo2bo65b5o5b5o20bobo68b2o3bo5bo3bo5bo3bo5bo2bo2bo3b o3b3o3bo3b2o35bo6b2o4bo50b4o3b4ob4o3b4ob4o3b4o121bo10bo44bobobo42b2o 13b2o24bo15bo77b5obob2o29bobo181bobob2o13b2obobo17bob2o6b2obo8bobobo3b obobob2o6b2obobob2o5bo4bo8bobo100b2o10bo8bo306bobo7b2o22b2o7bobo192b2o 39bobo6b2o7bo4b2o155b2ob6o4bo3bo124bo4bo2b2obobo133b2o4b2o18bo2bo295b 2o29bo119bo2bo3bo2bo181b2o17b3obo9b2o25bo19b2obo$55bo2bo4bo2bo4bo2bo 31bo2bo2bo70bobo3bobo24bo75b2ob2o5b2ob2o5b2ob2o5b2ob2o4bobob2o41bobo8b 3o50bo4bo4bobo4bo4bobo4bo4bo126b2o46bo2bo3bo42b2o13b2o63b2o5b2o46bo2bo 2bobo32bo182b2obo15bob2o41b2ob4o2b2obo7bo2bob2obo6bo4bo9bo91b2o4bob2o 12bo8bo306bobobo2bo30bo2bobobo234b2o7bo4b3o5b2obo4bobo146b2ob6o5bo3bo 118b2o4bo9bobo157bo2b2o2bo294b2o26bobo95b2o23b2o4bo2bo181bobo17b2o39b 2o16b3ob2o9b2o$55b3o5b3o5b3o34bobo73b2o3b2o102bobo7bobo7bobo7bobo7bobo 41bobo5b2obo2bo53b2ob2o7b2ob2o7b2ob2o129b2o46b4ob2o43bo15bo60bo13bo48b o2bo10b2ob2o8b2o7b2o184bo15bo51b2o3bo8bobo4bo6bo4bo101b2o4b2obo9b2o2bo 6bo2b2o304b2ob4o30b4ob2o249bo11bo4bo162bo3bo117bo7b2o6b2o158bo2b2o2bo 157b2o7b2o89b2o9b2o15b2o8bo12b2o12b2o7b2o88bo26b2o4bo167b2o11bo2bo18bo 57b5o10b2o$185bo3bo101bobobobo3bobobobo3bobobobo3bobobobo4b2obobo41bo 8bo2bo54bobo9bobo9bobo182bo121b2o13b2o48b2o12bobo10bo193b2o3b2o3b2o3b 2o49bo2bo3b2o8b2o4b2o6bo2bo120bobo3bo4bo3bobo305bo38bo244bobo13bo171bo 3bo117b3o5bo168b4o159bobo6bobo89bo9bo15bobo21b2o21bobo84b3o24bo4bo3bo 167b2o10b2o2bo76bo2bo$54bob2o4bob2o4bob2o111bo3bo101b2o3b2o3b2o3b2o3b 2o3b2o3b2o3b2o8b2o48b5o55bobo9bobo9bobo180bobo121b2o13b2o60bobobobo5b 3o198bo2bobo2bo53b2o27bobo2bobo118bo7b2o7bo159b2o5b2o137bobo34bobo120b 2o123bo15bob2o168bobo120bo5bo166bobo2bobo159bo8bo86b3o11b3o12bo48bo84b o26bo4bob2o183bo79bo$54b2obo4b2obo4b2obo111bo3bo196bo60bo11bo11bo181b 2o122bo15bo60b2o3b2o5bo201b2o3b2o83b2o4b2o117b2o16b2o158b2o5b2o138b2o 34b2o121b2o141b2o169bo127bo166b2o4b2o159b2o7b2o85bo15bo11b2o48b2o111b 4o185b2o! golly-2.5-src/Patterns/Life/Oscillators/extensible-low-period.rle0000644000175100001440000001773312156145314022130 00000000000000#C Some low-period oscillators have been found to be repeatable. #C While this property occurs in some higher period oscillators, #C it usually does not seem quite as remarkable, since those #C extensible oscillators typically depend on some mechanism of #C "bouncing off" of copies of themselves. #C From Alan Hensel's "lifebc" pattern collection. x = 328, y = 205, rule = B3/S23 324boo$231boo26bo64boo$230b4o24bobo63boo$32boo34bo160bobbobo22bobobo 63bo$bboobo25bobo10bo7bo13bobo127boboo28bobobboo22bo3b3o60bobo$bboboo 36bobo5bobo12bo4bo125boobo27bobo24booboo60b3obobo$6boo21bobo14bobo5bo 10b5o25boo97boo30boo25bobo3bobo12boo7boo14boo7boo9b4obo$6bo33boo6bo22b o9bo13bobo95bobo30b3o24bobboo3bo12b3o5b3o14b3o5b3o13bo$7bo19bobo24boo 9booboobobo6bobo16bobo32bo25bo32bo33bobo24boobbo3boo7bo15bo8bo15bo$6b oo33bo24bobo4bobo4bobo13bobbo3bo28bobo23bobo31boo34boo26boo3bo4boobbob obob7obobobobobbobobobob7obobobobboo$bboobo19bobo25bo12bobo6bobobooboo 18bobbo25bo4bo25bo31boobo26boo30bobbobo3bobbo9bobo9bobbo9bobo9bobbo$bb oboo36boo23bo9bo18boo4bobobbo23b5o21b6o31boboo25bobbo27bobo8bobbobo5b 3ob3o5bobboobbo5b3ob3o5bobobbo$oo21bobo26boo25b5o15boo3bobobbo8bo18bob o15bo36boo4boo24bo29boo5b3o7boobboo5boobboo8boobboo5boobboo7bobbo$o21b o19bo35bo4bo13boo7bobobbo4bobo14bo5bo13bobo3boo31bo5bo26bo32boobo12boo bb3obboo14boobb3obboo13bo$bo20boo30bo25bobo16bo8bobobbo3bobbo12boo6bob o7bo9bo31bo5bo17boo7bobbo27bobo59bo4bo$oo38boo38bo29bobobbo17boo8bo5bo bo6bo33boo4boo19boboo4bo17boo10bo61boobbobo$bboobo41bo6boo56bobo4boo 13bo10bobo11boo33boobo17bobbobboo5bo16bobo8boo66boboo$bboboo35bo5bobo 64bobo30bo46boboo17bobo11bobbo13b3o$43bobo5bobo62bobobo95bo13bo16boo$ 43bo7bo69bo109bo13bobo76bobbo$71boo47boo94boo14bobbo4boobbobo77boo$71b oo143boo15bo6bobobbo$234bo6b4o$71b4o160bobbo3boo$70bo3bo22bo138bobbo$ 23boo4boo35boobobo23bobobo137bobo$23bobobbobo8booboo22boobobobo23bobob o136bo$25bobbo10bo3bo25bo3bo20booboboobbo129boo$25bobbo11b3o26boo3boo 21bo5bo129boo$22boob4oboo9bo54boo6bo177bo5bo17bo$23bobobbobo10bo33boo 29bo26b3o21b3o74bo47bo5bo17bo$23bobobbobo9b3o34bo28bo126bobo58bo5bo16b oo$22boobobboboo45bobo27bo26boboo17boobo69boobbobbo45bobo3bobo4bo4bobo 3bobo10bo$23bob4obo48bo53bo25bo68boobo28b3obbooboo3boo5bobobobobobo7bo 3bobobobo5boobboboo$23bobobbobo9b3o37boo26boo23boo3boo13boo3boo72boo 28bobob5ob6obbooboobooboobbobobbobobobooboobb6obobo$22boobobboboo9bo 68bo149boo8bobo3bobobobobobobobobobobobo3bobobobobobo3bobobo$23bobobbo bo10bo39boo3boo52boo9boo108bobob4obobbobobbobobobobobobobooboobo3bobob obobobbobobboo$23bob4obo9b3o40bo3bo23boo148bobobo3bobobo3booboboo3bobo bboboboboboboboboobboo3bobo$22boobobboboo51boboboboo22bo28booboboboo 111bobo3bobbobo4bobbo6bo3boboboboboo3bo4bo4bobo$23bobobbobo54boboboo 30boo23bo116bo4boobbo3bobo3bobo8boobobo7bobobobo3bo$23bobobbobo9b3o39b o3bo27boo5bobo20bobobo127boo5boo12boo8booboobo$22boob4oboo7bo3bo38b4o 30boboobo24bo166bo$23bobobbobo8booboo75boboboo188boo$23bobobbobo53boo 32bobbo$22boobobboboo52boo34bobo$25b4o$25bobbo$26boo4$221boo100boo$ 219bobbo100boo$$324bo$219boobo100bobo$221bobobboo90boobbobbo$222bo4bo 90boobo$223bo98boo$223bobbo3boo6boo6boo30boo6boo$228bo4bobbo4bobbo4bo bbo4bobbo4bobbo4bobbo4bobbo4bobbobbobobboboobobboboobobbo$80booboo143b o4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobboboo $80boobo4bo139bo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbo4bobbobbobo bboboobobboboobobbo$33boo48bobboobo134boo4boo6boo6boo6boo6boo6boo6boo 6boo6bo$32bobbo47bob4o134b4o95bo$31boboo24boo23boo136bobbobo90b4obo$ 31bo26bobo40bobbobobbo111bobobboo90b3obobo$30boobobo65bobbobobbo36boo 72bobo100bobo$31bo3bo21boo24b5o12boobbobobboobo34bo7bo63boo103bo$31bo 23b3o20bo3bobo13b3o4bo5bobo33bobo3b3o63b3o101boo$32b3o43bo3boo21bo6boo 28boo4boobbo67bobo100boo$78bo3bo60bo7bobo67boo100boo$32b3o19b3o20boo3b o15b3o11boo29bobo5bobo$bboobo20b3obbo4bo16boo21bobo3bo18boo9bobo23boo 4boo6bo$bboboo25bo4bo13bobbo19b5o20b3o11bobo24bo7b3o$6boo16bo4bobo4bo 13bobbo58boo25bobo5b3o$6bo17bo4bo19boo83boo4boo9boo$7bo16bo4bobb3o12b 3o48b3o11boo21bo7b3o5bobo$6boo18b3o44b5o23bo10bobo20bobo5b3o7bo$bboobo 62bo3bobo23b3o11bobo15boo4boo9boo4boo$bboboo18b3o19b3o19bo3boo38boo17b o7b3o5bobo$6boo10b3obbo4bo16boo21bo3bo58bobo5b3o7bo$6bo16bo4bo13bobbo 21boo3bo25b3o8boo21boo9boo4boo$7bo8bo4bobo4bo13bobbo20bobo3bo27bo7bobo 24b3o5bobo$6boo8bo4bo19boo20b5o32bo7bobo24b3o7bo$bboobo10bo4bobb3o12b 3o57bobo7boo21bo6boo4boo$bboboo12b3o79bo30bobo5bobo$74bo34boo20bobo7bo $18b3o18b3o23b5o4bo33bobo21bobboo4boo$16bo4bobb3o14boo25bobo3bo33bobo 18b3o3bobo$16bo4bo20bobbo23boo3boo33boo18bo7bo$16bo4bobo4bo13bobbo24bo 3bobo36bo23boo$23bo4bo16boo23bo4b5o29b5o$18b3obbo4bo17b3o21bo38bo$24b 3o84bo118bo$77boo31boo118b3o8boo$24b3o20b3o24b4obo153bo7bo$23bo25boo 22boboobbo114boobo34bo6bobo$23bo3bo46bo4boboo111boboo27bo6bo3bobboo$ 22boobobo22bobo25booboo109boo4boo25b3o9bo$23bo27boo139bo5bo29bo5bobbo 7boo$23boboo166bo5bo27boo6b3o7bo$24bobbo164boo4boo20bo22bobo$25boo167b oobo22b3o20boo$194boboo25bo5b3o$192boo4boo22bo6bobbo5b3o$192bo5bo23bo 3bobbo8bobbo$193bo5bo27bobbo4bobbo$192boo4boo24bobbo8bobbo3bo$194boobo 27b3o5bobbo6bo$194boboo36b3o5bo$221boo20b3o$220bobo22bo$220bo7b3o6boo$ 219boo7bobbo5bo$228bo9b3o$225boobbo3bo6bo$224bobo6bo$224bo7bo$69bo6bo 6bo32bobo104boo8b3o$61boo6boo5boo5boo5boobo3bo4boobo4bo3bobbo117bo$65b oboboobobobooboboboobo6bo3boo6bo3boo4boboboo$57boobobbobo4bobo4bobo4bo bobobo4b4obobo4bob4oboobo$21bo33bobbob4o27boo5bo4boo4bo7bobo$19bobo3b ooboobboo21boobo58boo$20bobobbooboobboo3boo19bo$boo3boo12bo16bo20boo 134boobo$boo3boo186boboo$22b17o153boo4boo$boo3boo11bobo17bo152bo5bo19b oo45boo20boo$bobobobo10bo21bo152bo5bo19bo27boo17bo20bo$3bobo13bo21bobb o147boo4boo19bobo25bo18bobo16bobo$bboobo14boo19boboo149boobo22boo23bob o19boo16boo$6boo13boobboobooboobboo4bo152boboo27bo4bo14boo$7bo17booboo boobboo4bo156boo23boob4oboo3bo4bo28b6obb6o$6bo34bo29bo15bo110bo26bo4bo 3boob4oboo$6boo27boo4bobboo15bo3bo4bobo4bo3bo4bobo4bo3bo51boo48bo20boo 14bo4bo25boo16boo$7bo27boo4bobboo15b5o4bobo4b5o4bobo4b5o36boob4oboobb ooboo47boo19bobo23boo19bobo16bobo$6bo34bo19bo3bo3booboo3bo3bo3booboo3b o3bo36bobbobbobbobbobbo44boobo21bo25bobo18bo20bo$6boo33bo15boobbooboo 3bo3bo3booboo3bo3bo3booboobboo31booboobboob4oboo44boboo20boo27bo17boo 20boo$38bobbo14bobo3bobo4b5o4bobo4b5o4bobo3bobo13boob4oboobbooboo114b oo$40bo15bo5bobo4bo3bo4bobo4bo3bo4bobo5bo13bobbobbobbobbobbo$38bobobo 12boo6bo15bo15bo6boo11booboobboob4oboo$37boboboo72boo$37bobo$38boo14$ 38boo$38bo$36bobo$bboboo30boo24boo3boo118boo5boobo74bo$bboobo26boo28bo bobobo89bo29bo5boboo41bo10bo9boo9bobo$oo31bo30bobo52boo36bobo27bo10boo 38bobo8bobo8boo10bo$bo31bo30bobo28boo8bo6bobbo3bo31bo5bob3o4bo20boo9bo 40bo10bo$o32boo29bobo28bobo6bobo3b3obb3obo30bobo3boo4bobbobo31bo58bo 29b3ob3o$oo26boo27boo4bo3bo4boo23bo6bobbobo3boo3bo32bo7boobobbobo19boo 9boo17b3ob3o33bobobbobo4bobobboo5bo3boo4bo$bboboo23bo27bo4bo5bo4bo23b oobboobooboboobo3boo30b3o4boboobobobooboo19bo5boobo22bo4boo3bo5boobbob o4bobobboo3bobbobobbobbobbobobbo4boob3oboo3boo$bboobo23bo28b4o7b4o26bo bbo4bo4boobo6boo3boo3boo3boo3boo5booboboobbobobo4bo19bo6boboo19boo3boo b3oboo4bobbobobbobbobbobobbo3boobbobo4bobobboo5bo3boo4bo$6boo21boo66b 3obobboboboobobo5boo3boo3boo3boo3boo3boobobooboobobo5bobobo19boo3boo 26bo4boo3bo5boobbobo4bobobbobo33b3ob3o$7bo16boo23boo5b4o11b4o5boo14bo 6booboobobobb4oboo3boo3boo3boo3boo3boo6boobooboboboobbo25bo24b3ob3o29b o$6bo18bo16boo5bobo3bo4bo9bo4bo3bobo5boo7boo5boo8boo3bo3boo3boo3boo3b oo3boo4boo5bobbobo3boo21boo4bo67bo10bo$6boo17bo17bo6bo3bo4boo9boo4bo3b o6bo26bo34bobboobobooboboo24bo3boo45bo10boo8bobo8bobo$bboboo19boo16bob oo6bo23bo6boobo24boboboo29bo4boobobboboobo23bo6boobo40bobo9boo9bo10bo$ bboobo15boo21bo3bo4bo23bo4bo3bo25boobbo30boo7boo29boo5boboo41bo$20bobo 23boboboobo23boboobobo31bobo$20bo25bobobbobobo19bobobobbobo32boo$19boo 23boboboobobboo19boobboboobobo$44boo5bo27bo5boo$51boo25boo9$106boo8boo 18boo$106boo6bobbo18bo$103bo10b3o20b3o$103b7o9bobbobbobbobbobbo4bo$ 109bobb26obobo$101b3obboobobo26bobobo$97boobobbobo3boboo3b3obb3obb3obb 3obbobobobo$98bobobobboo4boboo3boo3boo3boo3boo5boboo$97bobbobbobbob3ob oobb3obb3obb3obb3obbobobobo$97boobb3obbo3bo27bobobo$107b3obob25obobo$ 101boobo4bobobobbobbobbobbobbobbobbo4bo$102bob4obbobo24b3o$101bo5boobo 25bo$102b3o5bo25boo$104bo5boo! golly-2.5-src/Patterns/Life/Oscillators/glider-stream-crystal.rle0000644000175100001440000001070112156145314022111 00000000000000#C High-period oscillator built by David Dauthier, showing #C a common crystal forming on a glider stream. Several adjustable #C high-period guns have been constructed that make use of two #C identical copies of this repeatable growth-and-decay reaction. #C It is also possible to support a single crystal of adjustable #C length, and extract a glider from either end of the reaction. #C See, e.g., p08832.lif in Jason Summers' "guns2j" collection. x = 252, y = 221, rule = B3/S23 90b2o68b2o$90b2o16b2o32b2o16b2o$108b2o32b2o4$89b3o8b2o48b2o8b3o$89b3o 8b2o48b2o8b3o$88bo3bo66bo3bo$108b3o30b3o$27b2o58b2o3b2o6bo6bo3bo28bo3b o6bo6b2o3b2o58b2o$29bo69bobo48bobo69bo$16b2o12bo67bo3bo3bo5bo26bo5bo3b o3bo67bo12b2o$16b2o4bo7bo8b2o57b5o3b2o3b2o26b2o3b2o3b5o57b2o8bo7bo4b2o $13b2o5b2o8bo8b2o56b2o3b2o44b2o3b2o56b2o8bo8b2o5b2o$5b2o5b3o5bo2b2o4bo 57b3o8b5o46b5o8b3o57bo4b2o2bo5b3o5b2o$5b2o6b2o6b5ob2o62b2o6b3o7bo32bo 7b3o6b2o62b2ob5o6b2o6b2o$16b2o4bo68b2o7bo7bob2o28b2obo7bo7b2o68bo4b2o$ 16b2o74b2o14bo34bo14b2o74b2o$90bobo15bo3bo26bo3bo15bobo$90b2o8bo8bo2bo 26bo2bo8bo8b2o$18b2o79bobo7b5o24b5o7bobo79b2o$16bo3bo78bo9b5o24b5o9bo 78bo3bo$10b2o3bo5bo63b2o3b2o16b2o3b2o22b2o3b2o16b2o3b2o63bo5bo3b2o$10b 2o2b2obo3bo2bobo58b2o3b2o17b5o24b5o17b2o3b2o58bobo2bo3bob2o2b2o$15bo5b o3bo71b2o4bo6b3o26b3o6bo4b2o71bo3bo5bo$16bo3bo8b2o56b3o7b2o12bo28bo12b 2o7b3o56b2o8bo3bo$18b2o9b2o56b3o72b3o56b2o9b2o$88bo74bo3$13bo8b2o204b 2o8bo$11bobo6bo2bo204bo2bo6bobo$4b2o4bobo7bo3bo2b2o194b2o2bo3bo7bobo4b 2o$4b2o3bo2bo7bo2b2o2b3o57b2o74b2o57b3o2b2o2bo7bo2bo3b2o$10bobo16b2obo 12bo41b2o21b2o28b2o21b2o41bo12bob2o16bobo$11bobo4b3o8bo2bo5b2o6bo63b2o 28b2o63bo6b2o5bo2bo8b3o4bobo$13bo15b2obo5b2o4b3o158b3o4b2o5bob2o15bo$ 27b3o192b3o$27b2o194b2o$87bobo72bobo$87b2o74b2o$88bo74bo18$65b2o118b2o $64b3o118b3o$64b2obo116bob2o$65b3o116b3o$66bo118bo13$23b2o202b2o$23b3o 200b3o$9bo15b2obo5b2o4b3o166b3o4b2o5bob2o15bo$7bobo4b3o8bo2bo5b2o6bo 166bo6b2o5bo2bo8b3o4bobo$6bobo16b2obo12bo168bo12bob2o16bobo$2o3bo2bo7b o2b2o2b3o200b3o2b2o2bo7bo2bo3b2o$2o4bobo7bo3bo2b2o202b2o2bo3bo7bobo4b 2o$7bobo6bo2bo212bo2bo6bobo$9bo8b2o212b2o8bo4$14b2o9b2o198b2o9b2o$12bo 3bo8b2o198b2o8bo3bo$11bo5bo3bo208bo3bo5bo$6b2o2b2obo3bo2bobo206bobo2bo 3bob2o2b2o$6b2o3bo5bo216bo5bo3b2o$12bo3bo218bo3bo$14b2o220b2o3$12b2o 224b2o$12b2o4bo214bo4b2o$b2o6b2o6b5ob2o202b2ob5o6b2o6b2o$b2o5b3o5bo2b 2o4bo200bo4b2o2bo5b3o5b2o$9b2o5b2o8bo8b2o178b2o8bo8b2o5b2o$12b2o4bo7bo 8b2o178b2o8bo7bo4b2o$12b2o12bo198bo12b2o$25bo40b2o116b2o40bo$23b2o41b 3o114b3o41b2o$65bob2o114b2obo$65b3o116b3o$66bo118bo2$66bo118bo$65b3o 116b3o$65bob2o114b2obo$23b2o41b3o114b3o41b2o$25bo40b2o116b2o40bo$12b2o 12bo198bo12b2o$12b2o4bo7bo8b2o178b2o8bo7bo4b2o$9b2o5b2o8bo8b2o178b2o8b o8b2o5b2o$b2o5b3o5bo2b2o4bo200bo4b2o2bo5b3o5b2o$b2o6b2o6b5ob2o202b2ob 5o6b2o6b2o$12b2o4bo214bo4b2o$12b2o224b2o3$14b2o220b2o$12bo3bo218bo3bo$ 6b2o3bo5bo216bo5bo3b2o$6b2o2b2obo3bo2bobo206bobo2bo3bob2o2b2o$11bo5bo 3bo208bo3bo5bo$12bo3bo8b2o198b2o8bo3bo$14b2o9b2o198b2o9b2o4$9bo8b2o 212b2o8bo$7bobo6bo2bo212bo2bo6bobo$2o4bobo7bo3bo2b2o202b2o2bo3bo7bobo 4b2o$2o3bo2bo7bo2b2o2b3o200b3o2b2o2bo7bo2bo3b2o$6bobo16b2obo12bo168bo 12bob2o16bobo$7bobo4b3o8bo2bo5b2o6bo166bo6b2o5bo2bo8b3o4bobo$9bo15b2ob o5b2o4b3o166b3o4b2o5bob2o15bo$23b3o200b3o$23b2o202b2o13$66bo118bo$65b 3o116b3o$64b2obo116bob2o$64b3o118b3o$65b2o118b2o18$88bo74bo$87b2o74b2o $87bobo72bobo$27b2o194b2o$27b3o192b3o$13bo15b2obo5b2o4b3o158b3o4b2o5bo b2o15bo$11bobo4b3o8bo2bo5b2o6bo63b2o28b2o63bo6b2o5bo2bo8b3o4bobo$10bob o16b2obo12bo41b2o21b2o28b2o21b2o41bo12bob2o16bobo$4b2o3bo2bo7bo2b2o2b 3o57b2o74b2o57b3o2b2o2bo7bo2bo3b2o$4b2o4bobo7bo3bo2b2o194b2o2bo3bo7bob o4b2o$11bobo6bo2bo204bo2bo6bobo$13bo8b2o204b2o8bo3$88bo74bo$18b2o9b2o 56b3o72b3o56b2o9b2o$16bo3bo8b2o56b3o7b2o12bo28bo12b2o7b3o56b2o8bo3bo$ 15bo5bo3bo71b2o4bo6b3o26b3o6bo4b2o71bo3bo5bo$10b2o2b2obo3bo2bobo58b2o 3b2o17b5o24b5o17b2o3b2o58bobo2bo3bob2o2b2o$10b2o3bo5bo63b2o3b2o16b2o3b 2o22b2o3b2o16b2o3b2o63bo5bo3b2o$16bo3bo78bo9b5o24b5o9bo78bo3bo$18b2o 79bobo7b5o24b5o7bobo79b2o$90b2o8bo8bo2bo26bo2bo8bo8b2o$90bobo15bo3bo 26bo3bo15bobo$16b2o74b2o14bo34bo14b2o74b2o$16b2o4bo68b2o7bo7bob2o28b2o bo7bo7b2o68bo4b2o$5b2o6b2o6b5ob2o62b2o6b3o7bo32bo7b3o6b2o62b2ob5o6b2o 6b2o$5b2o5b3o5bo2b2o4bo57b3o8b5o46b5o8b3o57bo4b2o2bo5b3o5b2o$13b2o5b2o 8bo8b2o56b2o3b2o44b2o3b2o56b2o8bo8b2o5b2o$16b2o4bo7bo8b2o57b5o3b2o3b2o 26b2o3b2o3b5o57b2o8bo7bo4b2o$16b2o12bo67bo3bo3bo5bo26bo5bo3bo3bo67bo 12b2o$29bo69bobo48bobo69bo$27b2o58b2o3b2o6bo6bo3bo28bo3bo6bo6b2o3b2o 58b2o$108b3o30b3o$88bo3bo66bo3bo$89b3o8b2o48b2o8b3o$89b3o8b2o48b2o8b3o 4$108b2o32b2o$90b2o16b2o32b2o16b2o$90b2o68b2o! golly-2.5-src/Patterns/Life/Oscillators/low-period.rle0000644000175100001440000004241012156145314017756 00000000000000#C Low-period oscillators. #C Low-period oscillators and high-period oscillators can most easily #C be distinguished by the search techniques used to find them. #C Small periods from 2 to 6 can be found by cell-by-cell search #C algorithms; algorithms that try various random soups on different #C topologies can often discover oscillators in the range 2-16; #C oscillators of higher period are usually found by engineering #C from known parts, such as perturbing a common piece of fluff in #C just such a way that it reappears somewhere else in a useful way. #C These usually have a period of 30 or more. #C Because of the differences in search techniques, there is something #C of a rift of known oscillators between periods 16-30, with only a #C few filled in by low-period or engineered patterns. #C From Alan Hensel's "lifebc" pattern collection. x = 491, y = 249, rule = B3/S23 225booboo13bo$bboobo20bo112boboo82booboo12bobo47boobo67boo54boo3boo3b oo$bboboo11b3o6boo111boobo99bobo47boboo7boo12boo40boobbo56bo3boo3boo$ 6boo18boo9boobo10bo85boo10boo16boo54b9o6booboobooboo41boo4boo6bo12bo 41bobobo55bo$6bo20bo9boboo8b3o84bobo10boo15bobbo12booboo6b3o13b3o10bo 4bo4bo5bo4bo4bo41bo5bo7bobo8bobo18bo23bobboboo52boo3boo3boo$7bo40bo18b o68bo29b4o13boboo26bo9b3o3b3o7b3o3b3o43bo5bo7boo8boo15boo3bo25boboo57b obobobo6booboo$6boo30b3o7bobb3o11bobo67boo12bo14bobobbobo8boo11boobboo bo9bobobo10bobobo11bobobo44boo4boo34bo5boboo21bo55boo5bobo8booboo$bboo bo31bo3bo5boobo3bo14bo67boobo7bobo12bo8bo10boboo6bo4bobo5bo3bobbo78boo bo12b6o15boobobo6bo12boo5bobo56bo4boobo9bobo$bboboo31bo3bo8bo3bo8boo 72boboo7bobbobboo7bo8bo6bo3bobbo13bo5boboo5bo8bo5bo61boboo33booboboob 4o13bobo4boo56bo9boo5bobobobo$oo36bobo9bo3boboo11boo64boo4boo9boboo8bo bobbobo10boobo5bo14bo5boobo8bobbobbo65boo7boo8boo15bobo20bo3boo58boo9b o5bobobobo$o14boo19bobobobo8b3obbo7bo70bo5bo8boo14b4o10bo10bobo4bo9bo bbo3bo9bo3bo66bo7bobo8bobo14bobob3o21bo68bo6boo3boo$bo13bo8bo11boo3boo 13bo9bobo67bo5bo23bobbo8bobo10boboobboo8bobobo10b3o5b3o8bobobo51bo6bo 12bo15bobo3bo13b7o59boo8boo$oo16bo5bobo26b3o10bo68boo4boo24boo9boo28bo 13bo9bo6b3o3b3o48boo5boo12boo16bobboo13bo66bo9bo$bboobo11boo4bobo27bo 83boobo55b3o11b3o25bo4bo4bo43boobo39boo19boo61bo9bo$bboboo19bo111boboo 97booboobooboo43boboo60boo61boo8boo$242bobo$242bobo$243bo$65bobo$63bo bbobbo$64bobobo$49booboo8b3obob3o$49bo3bo12bo$50b3o8b5ob5o80bo11bo$24b oo7boo4boo25bo84bobo9bobo13bo$25bo7bobobbobo21b3obob3o80bobo11boo12bo 42bo5bo10boo4boo$22bobo10bobbo11b3o11bobobo82bo13bo12b3o41boo3boo9bobb obbobbo126boo$21bo13bobbo10bo3bo9bobbobbo80boobo10bobo28boo14boo9boo3b oo9bo3boo3bo125bobo$21boo13boo11booboo11bobo85bo13bo10b3o11bobbobo13b oo10bo3bo8boo3bobbo3boo123bo$163bo27bobobobo37bo4bo4bo4bo83boo16boo17b oob4o102bo4bo$150b3o9b3o3bo5boobb3obboo7bobbob3o9b6o9b3o8bo3bo6bo3bo 84bo7boo7bo17bobobobbo100boob4oboo$151boo8b3ob3o6bobobbobbobo15bo7bo5b o8bo3bo8bobo8bobo85bobo3bo4bo3bobo17bobobo77bo4bo13bo8bo4bo$175bo7bo6b 4o3b4o7boboo25bo4boo4bo87boobbo6bobboo16boobboo44boo5boboo21boob4oboo 11bo$148b3obb3o7bobbo23bo15boobobo25bo4boo4bo90bo8bo18bo4bo46bo5boobo 23bo4bo12bobo$175bo7bo7b3obobbo8bobo13bo3bo8bobo8bobo89bo8bo18b5o46bo 4boo15bo30bo$151boo9b3ob3o5bobobbobbobo8bobobobo7boboobboo9b3o8bo3bo6b o3bo52boo16boo16bo8bo16boo3bo4bo42boo4bo15bo30bo$151b3o7bo3b3o6boobb3o bboo8bobobbo5booboboobbobo19bo4bo4bo4bo53bo16bo14boobbo6bobboo12bobb3o 3booboo45bo15bobo29bo5boobboo$166bo27boo8boobo7bo7bo3bo8boo3bobbo3boo 54bobo12bobo13bobo3bo4bo3bobo11boobo5booboo3boo35boo3boo15bo30bo5boobb oo5bo$150bo11bo15b3o26bo7boo5boo3boo9bo3boo3bo57boo12boo14bo7boo7bo14b o14bo36bo5boboo11bo11boobboo12bobo15bo$150boboo9bobo41bobo12boo3boo9bo bbobbobbo62bo4bo18boo16boo13boo3booboo5boboo32bo6boobo11bo11boobboo13b o15bobo$152bo11bo13b3o27boo12bo5bo10boo4boo61boob4oboo23boobboo25boob oo3b3obbo32boo9boo9bo30bo5boobboo5bo$150bobo10boo14bo130bo4bo25boobboo 27bo4bo3boo45bo8bobo35boobboo5bo$150bobo11bobo12bo125boo12boo13boo16b oo24b5o35boo9bo10bo47bo$151bo13bo138bobo12bobo13bo7boo7bo24bo4bo36bo9b oo9bo47bo$304bo16bo13bobo3bo4bo3bobo23boobboo36bo6boboo23bo4bo29bobo$ bboobo37bo3bo255boo16boo13boobbo6bobboo23bobobo38boo5boobo21boob4oboo 28bo$bboboo15b3o3b3o13bo3bo291bo8bo23bobbobobo72bo4bo16bo4bo8bo$6boo 35bo3bo27boo16boo10boo232bo8bo23b4oboo93boob4oboo$6bo12bo4bobo4bo10boo 3boo14bo10bobbo12boobbo6boobobo232bo8bo27bo97bo4bo$7bo11bo4bobo4bo9bob o3bobo8b4o3bo8bobobbo9bo11boobo231boobbo6bobboo22bobo$6boo11bo4bobo4bo 6b5o5b5o8bo3bo9bo3bo9bobobo10bo230bobo3bo4bo3bobo21boo$bboobo15b3o3b3o 35bo13bo8boo3bo10bobbo93bo10bo122bo7boo7bo$bboboo56bo13bo13b3o12boobo 91bobo8bobo10boo6bo14bo6boo78boo16boo$6boo13b3o3b3o33boo12boo11bo17bo 72boo3boo12bobo8bobo11bo4b3o13bobo5bo$6bo12bo4bobo4bo6b5o5b5o55boo70bo bo3bobo9b3oboo6boob3o8bo4bo16bobo3bobo$7bo11bo4bobo4bo9bobo3bobo105bo 5boo18bo5bo9bo4bo13bo7boo3boo12booboboobboo4bo$6boo11bo4bobo4bo10boo3b oo105bobo4bobboo32b3obbo6boob3o27boboo9b3o$bboobo37bo3bo106bobo5bobo 35bobbo6boobo10boo10boo9boo6bo196boo17boo3bo$bboboo15b3o3b3o13bo3bo 105booboo3boobo17booboo21bo15bobobbo6bo10bobbo4boo193bo4bo15bobobobo$ 43bo3bo10bo11bo14bo68bo9boboo11boobbobobboo15b4o16bobboo4bobo11b3o198b o6bo16bobobo$58b3o9b3o12b3o64bobb3o4b3obbo9b3obobobobob3o13bo16b3o5boo bboo15boo195bo8bo14booboboo$61bo11bo14bo16boobo43boobo9bo10bo4boo3boo 4bo7boboo6bobbo8bo7bo17boobo3bo192bo8bo13bo3boo3bo$60boo10bobboo10bo 17boboo46boboo3booboo10b4o7b4o6b3oboo6bobb3o32boobobob3o190bo8bo12bob oobboo$72bo4bo9bobbo11boobo49bobo5bobo14bo7bo8bo13bo4bo14bo20boo4bo 190bo6bo13bobobbobo3bo$62boo9boobbo12bo12bobob4o43boobbo4bobo13bo9bo8b 3oboo6boob3o14boboboboo16b4o192bo4bo15b3obboo5booboo$62bo13bo11bobboo 9bo7bo46boo5bo14boo7boo10bobo8bobo15bobooboobo16bo197boo21boo3bobboob oo$63b3o11b3o8bo13b4obobo90bobo8bobo15bo25bo186b3o24b5oboboo$65bo13bo 9boo3bo12boboo90bo10bo15boo24boo185bo3bo6bo16bobbobbobo$25bo66boobo8b oobo332bo5bo4bobo20bobbo$24b3o16bobbo48bo8boboo342bobo22boo$22b3ob3o 14bobbo48boo188boo5boobo19boo122bo7bobobo27boobboo$22bo5bo13boobboo 238bo5boboo18bobo22boobbobboo91bo7bobbo24b5oboob3o$21boo5boo10b3o4b3o 235bo4boo4boo16bo24bo7bo126bo12bo$20boo7boo254boo3bo5bo14boobo25boo3b oo93bo5bo28b6obb4o$21boo5boo33b3o10b3o10b3o199bo5bo13boobo22bo5bo5bo 91bo3bo34bobbo$22bo5bo11b3o4b3o235boo3boo4boo16boboo19b6ob6o92b3o32boo 6boo$22b3ob3o13boobboo14bo4bo7bo4bo7bo74boo121bo3bo5bo14boobo26bo3bo 131bobbobbobbo$24b3o16bobbo14bobo3bo6bobo3bo5bo7bo68bo6boo113bo5bo5bo 13bobobbobbo19boo5boo130b3obb3o$25bo17bobbo14bobbobbo4b3obbobbo5b4o4bo 65boobo6bobbo111boo3boo4boo16boobobo3boo14bo7bo$60boo3bo12bo11bo3bo65b oboboobooboboobbo113bo5bo19bo7bo15bo5bo129b4oboob4o$62b3o11boo8boobbob o61bo7bobbobobbobbobobo107boo4bo5bo18bob6o15boo5boo128bobboobboobbo$ 62bo13bo9bobobo61boobbo3bobboobbobobo3bobbo107bo3boo4boo19bo$76bo10boo boo64bo3bobboobbobobobboboo107bo6boobo22boboo$154bo3b4oboobo3booboo 110boo5boboo21booboo$45bo115bo8boboo$20boo3bo3boo13bobo106bobobobboobo boboboob3oboo$20boobb3obboo12bobobo105bobo8boo3bo4bobo$22b3ob3o14bo3bo 105bo10b6o4bobo$22bo5bo12boobbobboo110boboo4bobbo3bo$21boo5boo10bo4bo 4bo109boo6bobbo$20boo7boo8bobobooboobobo111b4ob3o$21boo5boo10bo4bo4bo 109b3o4bo$22bo5bo12boobbobboo19bo20booboo65bobbobbobboo$22b3ob3o14bo3b o21b3o3bob3o6bo4boboo67boo3boobo$20boobb3obboo12bobobo20bobo3bobo8bob oobbo$20boo3bo3boo13bobo18b3obo3b3o10b4obo326boo7boboo35boo12boo$45bo 29bo13boo328bo7boobo31boobobboboo4boobobboboo$418bo6boo16boo17boobbo4b o4bo4bobboo$418boo4bobo16bobo21bo12bo$381boo41bo13bo4boboo21bobo6bobo$ 380bobo35boo3boo12boo5bo30bo$349boo29bo38bo5boobo7bobbo34bobo$349boo 27boob4o33bo6boboo7b3o32bo5bo$344bo10bo21bo3bobbo33boo3boo4boo39bo5bo$ 343bobo8bobo20bobobo41bo5bo16b3o22bobo$287boo4boo26boo19bobo3bobbo3bob o17boob3o37boo4bo5bo14bobbo23bo$288bo5bo27bo18bobo4bobbo4bobo15bobbo 41bo3boo4boo9bo5boo20bobo6bobo$287bo5bo22boob3o20bo5bobbo5bo16boboo11b oo27bo6boobo9boobo4bo20bo12bo$287boo4boo20bobobo52boo3bo11bo28boo5bob oo10bobo20boobbo4bo4bo4bobboo$315bobo53bobb3o10bobo50boo20boobobboboo 4boobobboboo$287boo4boo17boobobo25b3o8b3o14boobo6b3o3boo77boo12boo$boo 3boo65bo214bo5bo17bobo3bo8boo10boo18boo13bo5bo3bo8bo$boo3boo65bo213bo 5bo20boboobbo5bobo10boo18boo10b3o5bo5bo5b3o$29bo42b3o15b3o194boo4boo 19bobbobobo4bo16b3o8b3o14bo8bo3bo5bo$boo3boo10bobo7bobo8boo3boo10bobo 256bobobbo4boo49boo3b3o6boboo$bobobobo13bo18bobobo9b3ob3o27bo5bo192boo 4boo21boo4bo52bobo10b3obbo$3bobo11bobbo6boo3bo7booboo8bo3bo3bo26b7o 193bo5bo23b4ob4o15bo5bobbo5bo17bo11bo3boo$bboobo10bobobo6bo5bo6bobobo 8bobo3bobo9b5o12bo5bo192bo5bo24bobbo4bo14bobo4bobbo4bobo15boo11boobo$ 6boo8bobbo10bobo6boo3boo8booboboo9bob3obo10boo5boo191boo4boo24bo3b3o 16bobo3bobbo3bobo29bobbo$7bo9boo10boo39bobobobo10boo5boo224b3o20bobo8b obo27b3oboo$6bo47b7o8booboboboo245bo20bo10bo27bobobo$6boo46bobbobbo7bo bbooboobbo11b3o85boo3bo4bo3boo128boo25boo29bobbo3bo$7bo60boo7boo99bobb obbobbobbobbo14boo7boo130boo29b4oboo53boo6boo$6bo130boboo34booboboobo 4bobooboboo11boo7boo165bo54bobbo4bobbo$6boo129boobo22bo11bobbobboboboo bobobbobbo38bo9bo136bobo54bobo6bobo$141boo19bobo12bobo3boobboo3bobo13b 4o3b4o15bobo7bobo135boo53boobb3obb3obboo21boo$142bo19bobo13bo3bo6bo3bo 13bo4bobo4bo14bobo7bobo189bo6bobbo6bo16boobobboboo$110bo30bo19booboboo 13bo8bo15bobobbooboobbobo10booboboo5booboboo186boboo10boobo16boobbo4bo $141boo16bo4bobbo12bo10bo11bobbobo9bobobbo7boboobbo5bobboobo187bobo10b obo22bo$86b3o15boobo5boboo22boo17bobb3obo15boo6boo11bobobobobbooboobbo bobobo10boo7boo193boo3boo3boo25bobo4b3o$104bo5bo5bo23bo22boboo36bobbob o9bobobbo11bobbo3bobbo197bobo37b3obo$43bo20boo19bo3bo15booboobooboo23b o22bobbo11boobboo6boobboo11bobobbooboobbobo15b3o3b3o198boo34boo3bobobo $16boobobboboo12boobo3boboo10boobo4boboo10boobo5boboo45boo18bobobobo 11bobbo10bobbo12bo4bobo4bo219boo8boo28boo4bobbo$16bo8bo12bo9bo10bo10bo 10bo11bo13boo3boo23boo15booboboboboo13bobo3bobbo3bobo14b4o3b4o16boboo 3boobo191bobo10bobo33boo$17boo4boo14boo5boo12boo6boo12boo7boo8boo15boo 18bo15boboobobbo14boobobob4oboboboo40boobo3boboo190boboo10boobo25boo$ 14b3obb4obb3o8b3obb5obb3o6b3obb6obb3o6b3obb7obb3o5bobbo3bobobo3bobbo 17bo22bobo18boo6boo17boo7boo217bo6bobbo6bo25boo$14bobbo6bobbo8bobbo7bo bbo6bobbo8bobbo6bobbo9bobbo6b3ob9ob3o18boo22bo21boobboo19boo7boo218boo bb3obb3obboo$15boo8boo10boo9boo8boo10boo8boo5bo5boo10bo4bo4bo67bobbobo 250bobo6bobo$86b3o15boo9boo67boo253bobbo4bobbo$104bo11bo323boo6boo$ 105bo9bo$104boo9boo$285boo5boobo30bo25bo$286bo5boboo19boo9bo25b3o7boo$ 285bo10boo17b4obo3bo3bo7boo17bo6bo$181bo103boo9bo18bobobb3obb3o4bob4o 16boo4bobo107boo13boo$180bobo25bo88bo27b3obb3obbobo22boo104boobobboboo 5boobobboboo$156boo22bobo25bo7bo68boo9boo21boo36boo107boobbo4bo5bo4bo bboo$156bo20booboboo29bobb3o3boo62bo5boobo23bo12boo23boo112bo13bo$43bo 20boo19boo23bo50bo15boboo4bo20bo3bobb3o3bobbo62bo6boboo37bo23boo113bob o7bobo$19bobbo18bo3bo16bo4bo15bo4bo65b6obo19b3obo18b3obob3o4boobobo62b oo3boo32boo27boo86boo9boo$107boo3boo40bo26bo21bo4bo4b4obobobboo65bo28b oobo4boboo21bobo4boo80bobo7bobo15boo4boo3boo4boo$82bobobbobo17b7o41boo boo3boo17b3obboo14booboob3o8boobo61boo4bo27bo10bo21bo6bo83bo7bo17boo4b oo3boo4boo$17b8o14b9o12b10o10b4oboob4o64bobo4bobo19bo21bobo3boobobo4bo 62bo3boo28boo6boo21boo7b3o80boobbobboo17boo15boo$17boo4boo14boo5boo12b oo6boo7bobo4bobbo4bobo12bo5bo42bobo6bo16boobobobo17bobobo4booboboboo 60bo6boobo21b3obb6obb3o29bo83bo23bo4boo3boo4bo$16boo6boo12boo7boo10boo 8boo6booboobo4bobooboo8boobobo3boboboo39bo7boo15boobobob3o14boobob4o6b obo61boo5boboo21bobbo8bobbo110b3o3b3o17bobo3boo3boo3bobo$16bo8bo12bo9b o10bo10bo9bobo6bobo11bo4booboo4bo68boo4bo17bo4b6obbo94boo10boo110bo9bo 15boobo13boboo$77boobobo6boboboo5booboboobooboobooboboo67b4o20bobbobbo 4boo217booboobooboo$15bobo6bobo7boobb3o5b3obboo5bobo8bobo5boobo10boboo 5bobbobbo7bobbobbo67bo22boo233bobo$14bobbo6bobbo6bobboboo5boobobbo7bo bbobbobbo10bobob4obobo9bobboo9boobbo69bo256bobo20boo15boo$14bo12bo7bob obo7bobobo5boobb3obb3obboo7bobo6bobo10boo4bo3bo4boo69boo185b3o69bo21b oo15boo$14bobo8bobo6booboo9booboo6b3o6b3o8boobob4oboboo10bob4o3b4obo 258bo$14boobboobboobboo5bobbo3b3ob3o3bobbo9bobbo12bobb3obb3obbo10bobo 9bobo$11bo5bob4obo5bo3boboboo7boobobo6bobo6bobo10bobb4obbo10boobbobbob obobbobboo254booboo$11b7obobbob7o4bobbobo5bobobbo6boobob4oboboo8boobo 4boboo10bobo3bobobo3bobo252boo7boo$19bobbo18bobobo15boo4boo11bobbo4bo bbo9bobb3o3bo3b3obbo251bo9bo$13booboo6booboo8b4obbobb4o8boo4boo4boo9bo bbobbobbo11boobbobb3obbobboo253b9o$14bobo8bobo10bob7obo11b4obb4o12boo 4boo14booboo3booboo$14bobo8bobo8bobo9bobo9bobbobbobbo34bobbo5bobbo199b obobo51b9o$15bo10bo7b3obobbooboobbob3o6b3obboobb3o30booboboo5booboboo 196bobobo11b3ob3o32bo9bo$33bo5bobbobobbo5bo5bobboobboobbo30bobobooboob ooboobobo196bo3bo4bo3boo4bo35boo7boo$34boboobobo3boboboobo7boob4oboo 33bo4bo3bo4bo199bobo5boob3oboo3boo35booboo$35boobobo5boboboo51boobobo 3boboboo198bo3bo4bo3boo4bo116bo15bo$39bo7bo12boobboobboo38booboo203bob obo11b3ob3o37bo75boo13boo$60bobbobbobbo32boboobo5boboobo197bobobo54b3o 8boo3boo59boo13boo$62boobboo34boobobo5boboboo242boo3boo18bobobobo60bo 13bo$106bo7bo246bobobobo19bo3bo64boo5boo$362bo3bo$137boobo33bobbo204bo bobo5bobobo57bo11bo$137boboo23boo12bo178bobobo5bobobo4b3ob3oboboo3boob ob3o55bo11bo$135boo4boo9boo10boo13boo16boo26boo22booboo101b3oboboo3boo bob3o4bo3bobobo5bobobo58boo7boo$135bo5bo8bobbo19boboo6bo26booboboo7bo 24booboo103bobobo5bobobo5boo64b3o29b3o$136bo5bo30bobbo3bo15bo3bo12bo 11bo3bo157bo3bo52b3o10boo3boo10b3o$135boo4boo7bobbo9b3o6bo3bob3o14bo4b o9bo5bo8bo3boo16b9o106bo3bo19bobobobo56boo5bo7bo5boo$137boobo10bobbo7b o8bo11bo10bobobo12b5o11bobo16bo4bo4bo104bobobobo18boo3boo58bo17bo$137b oboo11bobo6boobbo8b3obo3bo10bobobo28boo3bo15b3o3b3o105boo3boo8b3o68bo 3bobbo11bobbo3bo$135boo4boo10bo7bobo10bo3bobbo9bo4bo30bo3bo17bobobo 123bo69bo5bo13bo5bo$135bo5bo29bo6boobo9bo3bo14b3ob3o15bo220bo13bo$136b o5bo9boo20boo54boo143booboo$114bo20boo4boo9boo6boo14bo16boo177boo7boo$ bboboo81boo6boo16bobo21boobo19boo15bobbo133b3o17bobooboobo29bo9bo$bboo bo60boo18bobo6bobo15bobo21boboo108bobobo61boo17booboboboo30b9o71bo13bo $oo64bobbo16bo10bo11booboobooboo127b3o3b3o58boo131bo5bo13bo5bo$bo16boo 12boo15bobbo14bobo13boobo10boboo8bo4bo4bo126bo4bo4bo58bo18b3o3b3o30b9o 65bo3bobbo11bobbo3bo$o15bo4bo9bobbo9bobbobobbobobbo25boobobobboobbobob oo9b3o3b3o128b9o55boo21bobbobobbo29bo9bo68bo17bo$oo14bo4bo8bo4bo8b14o 11bobo14bobobobbobobo14bobobo195boboo20booboo31boo7boo66boo5bo7bo5boo$ bboboo10bo4bo7bo6bo49bobobobbobobo151booboo60bo60booboo64b3o10boo3boo 10b3o$bboobo11bobbo8bo6bo7b14o13bobo9boobobobboobboboboo148booboo60bo 11boo3boo11boo3boo92b3o29b3o$6boo7bobobbobo7bo4bo8bobbobobbobobbo25boo bo10boboo12bobobo107bo100boobbobboboo3boobobbobboo26bo77boo7boo$7bo7b oo4boo8bobbo14bobbo20boboo9bo10bo13b3o3b3o105b3o102bobobboo3boobbobo 29b3o75bo11bo$6bo25boo52bobo6bobo12bo4bo4bo107bo77boo3boo18bo13bo108bo 11bo$6boo67bobo9boo6boo13booboobooboo57boo15bo31boo9boo66boobbobboboo$ bboboo70boo36bobo41boo22boo10boo42bo71bobobboo14bo13bo110boo5boo$bboob o108bobo37boobobbo16boobobbo9boboo14b3o22bobo72bo18bobobboo3boobbobo 106bo13bo$115bo38bo3bobo17bob3o9b3obbo13b3o15b3o4boo88boobbobboboo3boo bobbobboo101boo13boo$156boobo19bo14bobobo12b3o14bo3bo75bo17boo3boo11b oo3boo101boo13boo$152b4obo16bo4b4o12bobobo8b3o16bo5bo74bo143bo15bo$ 151bo6bo13boboo3bobbo13bobb3o6b3o17bo3bo74boobo25booboo$154bob3o13bo3b 3oboo15boobo7b3o12boo4b3o78boo22bobbobobbo$154boo18boobobo18boo3bo18bo bo82bo26b3o3b3o$55bo21boo76boboo16bobobo18bo4boo17bo84boo$17bobbo34bo 41boo10boo42boboboo14boboboo24bo17boo9boo72boo26booboboboo$35bo39bo4bo 14bo3bo10bo42boo18boo57bo73b3o25bobooboobo$16bo4bo11bo3bo12bobbobobobb o38bo10bobo120b3o$14b3oboob3o26b11o9bobboboboobobo11bobboboboo8boo4boo 116bo$13bo3bobbo3bo7bo5bo31b4oboobboob3o7b3oboobobbo15bo$14b4obb4o6b3o b3ob3o8boboo5boobo14b4o5bo5bo3bobbobo13b4o$29bo3booboo3bo6boboobo3bob oobo9boobo4boboobo6boboo3bo15bo$14boobobboboo5bob3obob4o7bo4bo3bo4bo9b obbo4bobboboo4boobo21boo$14bo8bo6bo18b3obooboob3o11bo3boobboo4bo8bo20b o$15b3obb3o9boboboboobo8bo3bobo3bo9b3obb3obbobob3o8boo19bo$17bobbo10b oob3oboboo6bo3boo3boo3bo7bobb4o4bobbo31boo$13b4oboob4o7bobobbo10b4oboo boob4o8bobobboobobobo$13bobbo4bobbo7bobboo14bo7bo12bo5booboboo123bo$ 31boo15booboboboboboboo13boobobo92bo23boo8b3o$17bobbo27boobobobobobob oo13b4obo91bobo21bobo11bo$52b3ob3o21bo67boobboo3boo15bo22bo8b3obbo20b 3o$54b3o19boo70boboboobbobo35booboo6bo3boboo$74bobbo71bo7bo14b5o17boob o7bo3bobo$73bobbo26bo49bo17bo4bo20boboobbobobboobo14boobo7boboo$70bobb oobobo3boo18bobo13boo33bo16bobbo23bobo3bo7boboo11bo13bo175boobo5boobo$ 70b3o3bobobobbo19bo13bobbo31b3o12bobboboo22boobo3bo6booboo12boo9boo 176boboo5boboo$73boo5b3o31bo3bobo45bobobo4boo20bobb3o8bo12b3obb9obb3o 44boo3boobo11bo15bo96boo7boo14boo5boo$72bo3b3o22b5o6b7oboo45bobbo3bobb obboo15bo11bobo12bobbo11bobbo45bo3boboo10bobo13bobo95bo8bo15bo7bo$72b 3o4boo20bo4bo4bo8bo49boobbobo4bobbo13b3o8boo14boo13boo45bo8boo8bobo13b obo96bo8bo11boobo7boboo$19bo15boo33boo3boboobbo20boobobo3boboo5bo30b5o 19bo5bobobo14bo86boo7bo7b3oboo11boob3o93boo7boo11bobboo5boobbo$18bobo 14boo19boo13bobobbobobo21bobbobo4bobo5bobo27bob3obo21boobobbo47b3o62bo 5bo23bo88boobo5boobo14boo3bo5boo$18bobo34bobo11bobbob3oboboo15boo3boo bbo7bo5boobo26bobobobo21boobo105boo7boo6b3oboo11boob3o89boboo5boboo16b oo3b4o$17booboo30bobboboo10boobobobobobbo12bobbob3o12bo8bo25booboboboo 17bo4bo107bo3boobo10boboo11boobo89boo7boo20bo7bo$15bo7bo11b3obboo9bobo bo3bo12bo6boo12bobobobobo11boob7o25bobbooboobbo16b5o107bo4boboo17bo3bo 96bo8bo22b7o$15b3o3b3o7boobo6bo10bobbo3b3o10b4oboo15bobbo16bobo3bo27b oo7boo128boo7boo16bobo98bo8bo$29bobbobo4boboboo10bo5bo16bo18boboo13bo bbo59bo118bo16booboo96boo7boo23b3o$15b9o5boobobo4bobobbo11b5o11b6o20bo bbo13boo59bobo108boo8bo13bobbobobbo96boobo5boobo19bobbo$15bo7bo8bo6bob oo29bo26boo76bo110bo7boo12bobobobobobo95boboo5boboo21boo$18b4o10boobb 3o19bo14b3o211bo4boobo14boobbobobboo$18bobboo34bobo15bo211boo3boboo18b obo$58bo256bo$37boo$37boo! golly-2.5-src/Patterns/Life/Oscillators/p103079214841.rle0000644000175100001440000001237512156145314017313 00000000000000#C p103079214841 (prime: 4^13*1536-263) oscillator/gun -- #C p1536 base loop, 13 quadruplers, and a 263-step glider advancer. #C Based on previous p97307852711 and p97307852687 oscillators; #C original design by Gabriel Nivasch, 7 August 2003. #C The first three quadruplers are set (an L112 quadrupler, a Fx70 #C quadrupler plus a required F166 dependent conduit to suppress the #C following Herschel's first glider, and another L112 after that), #C so the circuit counts down from 64. Use an 8^2 or 10^2 step size. #C When all circuits are empty, a signal gets through to activate #C the 263-step glider advancer -- after which the circuit counts down #C again, this time from 4^13. #C Dave Greene, 31 Mar 2006; checked and corrected by Tomas Rokicki. x = 297, y = 227, rule = B3/S23 193b2o72b2o$193bo73bo$194bo73bo$182bo10b2o61bo10b2o$182b3o71b3o$185bo 73bo$172bo11b2o60bo11b2o$170b3o71b3o$169bo40bo32bo40bo$169b2o19b2o16b 3o32b2o37b3o$155b2o33b2o15bo21b2o50bo$156bo50b2o21bo50b2o$156bobo71bob o$157b2o72b2o2$176b2o72b2o$176b2o72b2o6$173b2o36b2o34b2o36b2o$77b2o94b o19b2o16bobo33bo19b2o16bobo$77b2o5b2o88b3o15bobo18bo34b3o15bobo18bo$ 84b2o90bo15bo20b2o35bo15bo20b2o$48b2o97bob2o19b2o19b2o4b2o22bob2o19b2o 19b2o4b2o$49bo97b2obo19bo25bobo22b2obo19bo25bobo$36bo11bo14b2o17b2o87b 3o22bo48b3o22bo$36b3o9b2o14bo17b2o89bo21b2o7b2o41bo21b2o7b2o$39bo24bob o21b2o114b2o72b2o$26b2o10b2o25b2o21b2o$27bo$27bobo$13b2o13b2o$13b2o36b 2o$51b2o$195bo18b2o53bo18b2o$7b2o140b2o43bobo17bo8b2o43bobo17bo$7b2o 139bobo44bo16bobo7bobo44bo16bobo$11b2o135bo63b2o8bo63b2o$11b2o134b2o 44b5o23b2o44b5o$192bo4bo68bo4bo$61b2o99b2o27bo2bo41b2o27bo2bo$42b2o18b o28b2o69b2o24bo2bob2o41b2o24bo2bob2o$6b2o34bo16b3o29bo95bobobo5bo63bob obo5bo$6b2o35b3o13bo29bobo77bob2o15bo2bo4bobo44bob2o15bo2bo4bobo$45bo 43b2o78b2obo18b2o2bo2bo44b2obo18b2o2bo2bo$26bo3b2o120b2o42b2o28b2o42b 2o$25bobo3bo120b2o72b2o$25b2o3bo111b2o72b2o$29bo113bo73bo$25b5obo111bo bo71bobo$25bo4b2o112b2o72b2o$26b3o$9bo18bob2o$7b3o19bobo$6bo$6b2o186b 2o16b2o54b2o16b2o$9b2o77b2o104b2o16b2o54b2o16b2o$4b5obo61b2o14b2o$4bo 21b2o45bo22b2o$6bob2o16bobo41b3o23bo51b2o72b2o$5b2ob2o18bo41bo23bobo 50bobo39b2o30bobo39b2o$28b2o64b2o51bo42bo30bo42bo$20b2o124b2o42bobo27b 2o42bobo$20b2o169b2o72b2o$200b2o72b2o$4b2o70bo123b2o72b2o$4b2o70b3o$ 79bo$78b2o83b2o72b2o$163b2o72b2o$154b2o72b2o$153bobo27b2o42bobo27b2o$ 153bo30bo42bo30bo$152b2o30bobo39b2o30bobo$96b2o87b2o72b2o$21b2o73bo$ 21bobo70bobo$23bo70b2o61b2o16b2o54b2o16b2o$23b2o132b2o16b2o54b2o16b2o 2$77b2o$77b2o15b2o$94bobo$5b2o89bo84b2o72b2o$4bobo23bo65b2o82bobo71bob o$4bo23b3o149bo73bo$3b2o22bo151b2o72b2o$11b2o14b2o160b2o72b2o$11b2o64b 2o80b2o28b2o42b2o28b2o$77bo76b2o2bo2bo7bo36b2obo18b2o2bo2bo44b2obo$75b obo73bo2bo4bobo6bobo35bob2o15bo2bo4bobo44bob2o$75b2o73bobobo5bo6b2ob2o 52bobobo5bo$151bo2bob2o9bo2bo28b2o24bo2bob2o41b2o$154bo2bo8bo3bo28b2o 27bo2bo41b2o$155bo4bo9bo58bo4bo$92b2obo60b5o23b2o44b5o$92bob2o79b2o8bo 63b2o$158bo16bobo7bobo44bo16bobo$85b2o70bobo17bo8b2o43bobo17bo$85b2o 71bo18b2o53bo18b2o$10b2o13b2o236b2o18bo$9bobo13b2o237bo17bobo$9bo254bo bo16bo$8b2o255b2o$27bo253b5o$26bobo252bo4bo$27bo47b2o91bo72b2o41bo2bo$ 28b3o45bo81b2o7b2o41bo21b2o7b2o41b2obo2bo$30bo45bobo80bo48b3o22bo47bo 5bobobo$77b2o80bobo22b2obo19bo25bobo44bobo4bo2bo$154b2o4b2o22bob2o19b 2o19b2o4b2o44bo2bo2b2o$136b2o17bo20b2o35bo15bo20b2o29b2o$20b2o115bo17b obo18bo34b3o15bobo18bo$20b2o74bo27bo11bo19b2o16bobo33bo19b2o16bobo$94b 3o27b3o9b2o36b2o34b2o36b2o$93bo33bo$11b2o80b2o19b2o10b2o$11b2o84b2o16b o$46b2o50bo16bobo$46b2o48bo19b2o$96b2o41b2o72b2o$139b2o72b2o50b2o16b2o $12b2o152b2o97b2o16b2o$13bo152b2o26b2o$10b3o3b2o175bobo$10bo4bobo152b 2o21bo50b2o43b2o$15bo83b2o69bo21b2o50bo44bo$14b2o64b2o17b2o70b3o32b2o 37b3o39bobo$13bo66b2o91bo32bo40bo39b2o$13b3o25b2o87b2o75b3o$16bo24bo 88bo16b2o60bo11b2o14b2o38b2o$15b2o25b3o34b2o50b3o14bo73bo15bo38b2o$44b o35bo52bo11b3o71b3o15bo$77b3o12b2o51bo10b2o61bo10b2o5b2o10bo$16b2o19b 2o38bo14bo64bo73bo15b3o$16b2o19b2o54b3o60bo73bo15bo$89b2o4bo60b2o72b2o 14b2o13b2o$89bobo170bo$91b3o127bo39bo31bo$90bo3bob2o123b3o37b2o28b3o$ 90b2o2b2obo126bo65bo$223b2o65b2o4$254b2o$29b2o223b2o$29bo$30b3o260b2o$ 32bo260bobo$295bo$295b2o$162b2o55b2o36b2o$8b2o3b2o103b2o42b2o54bobo16b 2o19bo$9bo2bobo103bo99bo18bobo15b3o25b2o3b2o$8bo3bo106bo97b2o20bo15bo 6bo11b2o7b2o3b2o$8b5o105b2o48b2o63b2o4b2o19b3o11bo$168b2o63bobo23bo15b 3o$6b5o153b2o69bo23b2o16bo$5bo4bo153b2o60b2o7b2o$4bo2bo218b2o$bo2bob2o 135b2o$obobo5bo63b2o39b2o26b2o$bo2bo4bobo9b2o51b2o39b2o52b2o$4b2o2bo2b o9b2o146b2o$9b2o19b2o37b2o$28bo2bo37b2o$28b2o186b2o$33b2o182bo$33bo 111b2o70bobo$31bobo71b2o38bobo70b2o$30bobo72bo41bo$26b2o3bo20bo53b3o 11b2o25b2o$26b2o23bobo54bo11b2o$50bo2bo$8b2o41b2o183b2o$8b2o56bo67b2o 100bo$62b2o2bobo65bo99bobo$62b2o2b2o67b3o96b2o$137bo11b2o$124b2o22bobo 23bo$125bo22bo23b3o$122b3o22b2o22bo$122bo32b2o14b2o$155b2o$75b2o$9b2o 64b2o$8bobo60b2o$8bo62bobo$7b2o64bo$73b2o158b2o$60b2o155b2o14b2o$60b2o 156bo22b2o$215b3o23bo$12b2o3b2obo194bo23bobo$13bo3b2ob3o35b2o109b2o2b 2ob2o61b2o$10b3o10bo34b2o94b2o13bobo2bobo$10bo6b2ob3o130bobo16b2o3bo7b o$18bobo132bo19bob2o6b3o$18bobo131b2o16bo2bobo6bo38bo$19bo149bobobobo 6b2o37b3o$170b2ob2o49bo$202bo20b2o$200b3o16b2o$199bo19bo$186b2o11b2o 20bo$186b2o32b2o6$155b2o60b2o$155b2o60b2o17b2o$161b2o73b2o$161b2o$180b 2o$176b2o2bo2b2o52b2o$159b2o16bo3bob2o52bo$159b2o5b2o9bobobo42b2o12b3o $166b2o10b2obob2o22b2o16bo14bo$181bo2bo4b2o16bo14b3o$181b2o6b2o17b3o 11bo$210bo!golly-2.5-src/Patterns/Life/Oscillators/p138.rle0000644000175100001440000000532112156145314016370 00000000000000#C p138 oscillator discovered as an infinite agar (not shown), but #C actually needing no external support: Gabriel Nivasch, 13 Oct 2002 #C Left: incremental glider construction by Mark Niemiec, 13 Oct 2002 #C Center right: 'instant' construction by Jason Summers, 18 Oct 2002 x = 215, y = 103, rule = B3/S23 152bo33bo$151bobo31bobo$150bo3bo29bo3bo$150bo3bo29bo3bo$149bobboo29bo bboo$150b4o30b4o$151bo33bo$$153boo32boo$152bobbo30bobbo$153boo32boo$ 147bo14bo18bo14bo$140boo4bobo12boboo9boo4bobo12boboo$139bobboobbobo11b oo3bo7bobboobbobo11boo3bo$10bo115bo11bo3boo3bo9bo3boo3bo5bo3boo3bo9bo 3boo3bo$11bo113bobo11bo3boo11bobobboobbo7bo3boo11bobobboobbo$9b3o112bo 3bo11boobo12bobo4boo9boobo12bobo4boo$124bo3bo13bo14bo18bo14bo$123bobb oo22boo32boo$124b4o21bobbo30bobbo$125bo24boo32boo$$127boo24bo33bo$76bo 49bobbo21b4o30b4o$76bobo48boo22boobbo22bo6boobbo$76boo43bo14bo13bo3bo 23bobo3bo3bo$114boo4bobo12boboo11bo3bo23boo4bo3bo11bo$113bobboobbobo 11boo3bo11bobo31bobo11bobo$112bo3boo3bo9bo3boo3bo11bo33bo11bo3bo$55bo 57bo3boo11bobobboobbo58bo3bo$20bo32boo59boobo12bobo4boo41bobo14bobboo$ 21bo32boo60bo14bo17bo30boo16b4o$19b3o102boo16bo7bo30bo17bo$11bobo109bo bbo16boo3b3o$12boo19bo90boo11bo4boo57boo$12bo18bobo104bo61bobbo$32boo 93bo8b3o42bo19boo$56bo68b4o52bobo11bo14bo$56bobo66boobbo51boo5boo4bobo 12boboo$56boo66bo3bo58bobboobbobo11boo3bo$21bobo100bo3bo57bo3boo3bo9bo 3boo3bo$22boo101bobo59bo3boo11bobobboobbo$22bo103bo61boobo12bobo4boo$ 190bo14bo$198boo$197bobbo$198boo$$126bo74bo$125bobo71b4o$124bo3bo70boo bbo$124bo3bo69bo3bo$123bobboo70bo3bo$124b4o71bobo$125bo74bo$$127boo$ 126bobbo$127boo$121bo14bo$114boo4bobo12boboo61bo$113bobboobbobo11boo3b o59bobo$112bo3boo3bo9bo3boo3bo57bo3bo$16b3o39bo54bo3boo11bobobboobbo 58bo3bo$18bo38boo55boobo12bobo4boo5boo51bobboo$17bo8boo29bobo56bo14bo 11bobo52b4o$27boo95boo19bo42b3o8bo$26bo96bobbo61bo$50boo72boo57boo4bo 11boo$50bobo123b3o3boo16bobbo$50bo76bo17bo30bo7bo16boo$125b4o16boo30bo 17bo14bo$125boobbo14bobo41boo4bobo12boboo$124bo3bo58bobboobbobo11boo3b o$124bo3bo11bo33bo11bo3boo3bo9bo3boo3bo$13boo110bobo11bobo31bobo11bo3b oo11bobobboobbo$12bobo111bo11bo3bo4boo23bo3bo11boobo12bobo4boo$14bo 123bo3bo3bobo23bo3bo13bo14bo$53boo82bobboo6bo22bobboo22boo$53bobo82b4o 30b4o21bobbo$53bo9boo74bo33bo24boo$boo60bobo$obo60bo77boo32boo24bo$bbo 16boo119bobbo30bobbo21b4o$14boobbobo120boo32boo22boobbo$15boo3bo48boo 64bo14bo18bo14bo13bo3bo$14bo53boo58boo4bobo12boboo9boo4bobo12boboo11bo 3bo$70bo56bobboobbobo11boo3bo7bobboobbobo11boo3bo11bobo$126bo3boo3bo9b o3boo3bo5bo3boo3bo9bo3boo3bo11bo$127bo3boo11bobobboobbo7bo3boo11bobobb oobbo$67b3o58boobo12bobo4boo9boobo12bobo4boo$67bo62bo14bo18bo14bo$68bo 69boo32boo$137bobbo30bobbo$138boo32boo$$141bo33bo$139b4o30b4o$139boobb o29boobbo$138bo3bo29bo3bo$138bo3bo29bo3bo$139bobo31bobo$140bo33bo! golly-2.5-src/Patterns/Life/Oscillators/p59-glider-loop.py0000644000175100001440000000215712156145314020377 00000000000000# smaller variant of David Bell's p59 glider loop from 2006 May 28 # Author: Dave Greene, 30 May 2006 import golly from glife.base import * from glife.text import * from glife.herschel import * golly.new("p59 track") rule() fast_eater = pattern ("2o$bo2b2o$bobobo$2bo2$4bo$3bobo$4bo$b3o$bo!", -9, -2) # create a list specifying half of a length-6608 Herschel track path = ( hc112, ) + 14 * ( hc77, ) path += path + 12 * ( hc77, ) T = (0, 0, identity) p59_track = pattern(herschel) golly.show("Building p59 Herschel track -- hang on a minute...") for h in 2 * path: p59_track += h (*T) + fast_eater (*T) T = compose (h.transform, T) # add 111 more Herschels to template Herschel track, 59 generations apart for i in range(111): p59_track=p59_track[59] + herschel p59_track +=pattern("o!", -10, 589) # get rid of eater # add 9 gliders in same spot, 59 generations apart for i in range(9): p59_track = (p59_track + pattern("2o$b2o$o!", -16, 595))[59] golly.show("") all = p59_track for i in range(3): all = all(-720, 450, rccw) + p59_track all += make_text ('59') (-142, 596) all.display ("")golly-2.5-src/Patterns/Life/Oscillators/queen-bee-turn.rle0000644000175100001440000001071412156145314020533 00000000000000#C Demonstration of a queen bee shuttle turning reaction #C (p88 oscillator). David I. Bell, 21 March 1996; updated July 2002 #C From Jason Summers' "jslife" pattern collection. x = 155, y = 155, rule = B3/S23 69boo6boo$69boo6boo7$53boo38boo21boo6boo$52bobo38bobo20boo6boo$52bobob oo4bo22bo4boobobo20boo6boo$53bobobobboo24boobbobobo21b3o4b3o$17boo10b oo24bo4boo24boo4bo23bobbobbobbo$16bobbo8bobbo21bobbo4bobo20bobo4bobbo 21boboobboobo$16b3o10b3o24bo4b3o6boobooboo6b3o4bo25boobooboo$19b10o23b o3bo9bo3boo4boo3bo9bo3bo24boo$18bobb6obbo22bo3bo9bo3boobooboo3bo9bo3bo 4boo18boo18boo$18boobb4obboo26bo34bo7bobo38bobo$53bobbo34bobbo4boboboo 32boobobo$55bo36bo7bobobo32bobobo$53bobobo32bobobo7bo36bo$52boboboo32b oobobo5boo8bobb3o8b3obbo8boo$52bobo10boo26bobo4b3o6boo3b3o8b3o3boo6b3o $53boo9b3o26boo5b3o6b3o5bo6bo5b3o6b3o$64boobo32b3o6boo3b3o8b3o3boo6b3o $37boo24boboo33b3o8bobb3o8b3obbo8b3o$37bo26b3o34boo36boo$35bobo26bo14b oo21bo36bo$23bo11boo42bo20bobobo32bobobo$8boo12b3o41boo12b3o16boboboo 32boobobo$8boo11bo3bo13boo7bo3boo6boo4boo3bo10bo16bobo18boo18bobo$21b ooboo13bo6b3o3bobbo3bobo5bobooboobboo22boo18boo18boo$45bo13bo8bo4bobb oo39booboobo$45boo5bobbobboo11b3o42boboo$51bobbo61bobbo$51bobo62b3o7b oo$21booboo26bo73bo$8boo11bo3bo48boo13b3o35b3o$8boo12b3o14boo11boo20bo bo11bo18boo20bo$23bo7b3o4bobbo10boo22bo11bo3bo13bobo14boo$32bo6b3o34b oo10bobbobo8bo3bo11bo4boo$32boo6bo49bobobbo4b3obboo10bobo$34bo28bo27bo 3bo3bo17bobbo$32bobo28bobo6boo21bo3boo17bo$32bobo28boo3boobboobboo14b 3o$68boobbobbobo19bo23boo$38boo34b3o19bobo15bobo4bobo$38bo35boo21boobb oo11boo7bo$39b3o59boo12bo7boo$41bo$18boobb4obboo$18bobb6obbo89boobbo$ 19b10o11boo5boo66boobboo3bo7boo10boo$16b3o10b3o9bo5boo66boo7bo6bobbo8b obbo$16bobbo8bobbo9bobo76b4o7b3obb6obb3o$17boo10boo11boo18bobo69boo6b oo$46boo15boo68bo10bo$45bobo15bo41boo26boobo4boboo$42boobbo58bobo13bo 16boo$9boo10boo82bo15b3o$8bobbo8bobbo17bo3bo78bo$8b3obb6obb3o16bo4bo 77boo$11boo6boo18bobobo$10bo10bo16bobobo40bobo53bo$10boobo4boboo14bo4b o15bobo23boo53b3o$15boo19bo3bo17boo24bo53b3o$58bo58boo$38boo77bobo19bo $92bobo14boo5boobo11bob3obb3obb3obo$92boo15boo6bobo10bobb3obb3obb3obbo 4boo$15bo77bo24bo10boobboo9boobboo3boo$14b3o102boobo7boo3bo7bo3boo$14b 3o12boo77boboo7bo3bo7bo15bo$29bo42bo7bo27bobo10boo13bo5bo$15bo11bobo 42boo5b3o27bo6boo18bo5bo$7bob3obb3obb3obo3boo42bobo4b5o26boo6bo13bo15b o$oo4bobb3obb3obb3obbo52bobobobo25boo3b3o5boo6boo3bo7bo3boo$oo3boobboo 9boobboo5boo7bo3boo31boo3boo25boo3bo7boo5boobboo9boobboo3boo$6boo3bo7b o3boo6boo5b3o3boo84bobb3obb3obb3obbo4boo$7bo15bo13bo88boo3bob3obb3obb 3obo$12bo5bo18boo86bobo11bo$12bo5bo13boo9boboo78bo$7bo15bo7bo3bo7bobo 78boo12b3o$6boo3bo7bo3boo7boboo8bo93b3o$oo3boobboo9boobboo10bo7boo93bo $oo4bobb3obb3obb3obbo10bobo6boo$7bob3obb3obb3obo11boboo5boo34bo$15bo 19bobo41boo$36boo41bobo33bo$14b3o97bobo21boo$14b3o96bo3bo15boobo4boboo $15bo96bo3bo16bo10bo$111bo3bo18boo6boo$30boo78bo3bo16b3obb6obb3o$30bo 80bobo17bobbo8bobbo$31b3o16bo61bo19boo10boo$15boo16bo16boo56bo$10boobo 4boboo27bobo55bobo$10bo10bo85boo$11boo6boo80boo8boo11boo10boo$8b3obb6o bb3o10boobbo20bo40bobo8bobo9bobbo8bobbo$8bobbo8bobbo6boobboo3bo19boo 41bo3boo5bo9b3o10b3o$9boo10boo7boo7bo18bobo45boo5boo11b10o$35b4o86bobb 6obbo$125boobb4obboo$113bo$30boo7bo12boo59b3o$31bo7boo11boobboo58bo$ 31bobo4bobo15bobo22boo19bo12boo$32boo23bo19boobboobboo14boo$77boobbobb obo14bobo16bobo$36bo17boo4boo21b3o34bobo$34bobbo17bo4boobo19boo35bo$ 35bobo10boobb3o9bo49bo6boo$30boo4bo11bo3bo8bo15boo34b3o6bo$30boo14bobo 13boboo12bo22boo10bobbo4b3o7bo$25bo20boo16boo12bobo20bobbo9boo14b3o12b oo$25b3o51boo48bo3bo11boo$28bo72bobbo24booboo$27boo7b3o61bobbo$35bobbo 61bobo$35boobo42b3o11boo4bo6boo$31bobooboo39boobbo4bo8bo13bo$13boo18b oo18boo22boobbooboobo5bobo5boo3b3o6bo13booboo$12bobo18boo18bobo16bo10b o3boo4boo6boo3bo7boo13bo3bo11boo$12boboboo32boobobo16b3o12boo41b3o12b oo$13bobobo32bobobo20bo42boo11bo$15bo36bo21boo14bo26bobo$14boo36boo34b 3o26bo$13b3o8bobb3o8b3obbo8b3o33boobo24boo$13b3o6boo3b3o8b3o3boo6b3o 32boboo$13b3o6b3o5bo6bo5b3o6b3o5boo26b3o9boo$13b3o6boo3b3o8b3o3boo6b3o 4bobo26boo10bobo$14boo8bobb3o8b3obbo8boo5boboboo32boobobo$15bo36bo7bob obo32bobobo$13bobobo32bobobo7bo36bo$12boboboo32boobobo4bobbo34bobbo$ 12bobo38bobo7bo34bo26boobb4obboo$13boo18boo18boo4bo3bo9bo3boobooboo3bo 9bo3bo22bobb6obbo$33boo24bo3bo9bo3boo4boo3bo9bo3bo23b10o$30boobooboo 25bo4b3o6boobooboo6b3o4bo24b3o10b3o$29boboobboobo21bobbo4bobo20bobo4bo bbo21bobbo8bobbo$29bobbobbobbo23bo4boo24boo4bo24boo10boo$29b3o4b3o21bo bobobboo24boobbobobo$29boo6boo20boboboo4bo22bo4boobobo$29boo6boo20bobo 38bobo$29boo6boo21boo38boo7$76boo6boo$76boo6boo! golly-2.5-src/Patterns/Life/Oscillators/traffic-light-hasslers.rle0000644000175100001440000003441112156145314022244 00000000000000#C Traffic-light hasslers. #C There is an unusual proliferation of oscillators engineered this #C way, because there are so many ways to perturb a traffic light in #C such a way that it reappears somewhere nearby. #C Technically, some of these are "pre-pulsar" hasslers, because they #C really hassle pairs of pre-traffic lights that never actually form #C a pair of traffic lights, but if left on their own, would form a #C single pulsar instead. #C From Alan Hensel's "lifebc" pattern collection. x = 514, y = 244, rule = B3/S23 114boobo6boobo30boo111bo7bo220boo$114boboo6boboo21bo8boo5boo103bobo5bo bo219boo$36boo6boo72boobboo4boo17boobo14bo105bo7bo$5boo5boobo20boo6boo 72bo3bo5bo17bo16bobo317bo$6bo5boboo103bo3bo5bo15bobobbo12boo212boo4boo 98bo16b3o$5bo4boo4boo100boobboo4boo15bobbo167boo5boobo6boobo40bobobbob o98bo11boobboboo$5boo3bo5bo19b3o4b3o68boobo6boobo18boo23bo99b3o3b3o37b o5boboo6boboo42bobbo92boo6boo10boobboo$11bo5bo13boo3bobo4bobo3boo63bob oo6boboo41b3o56boo3boobboboo24b3o3bobo3bobo3b3o30bo4boo4boobboo4boo39b oobboo90bobo9bo12boo$5boo3boo4boo13boo3b3o4b3o3boo61boo8boo4boo22b3o3b 3o7bo59boo3boobboobo30b3o3b3o36boo3bo5bo3bo5bo39b3obb3o60boo3boobo6boo bo10boboboobbo4bo$6bo3bo5bo95bo9bo5bo23bobo3bobo7boo71boo19boo23boo33b o5bo3bo5bo40bobbo63bo3boboo6boboo11bobobo7bo$5bo5bo5bo95bo9bo5bo22b3o 3b3o67boo3boo7bo18bobo23bobo26boo3boo4boobboo4boo48bo57bo8boo8boo11bo 5b3o$5boo3boo4boo94boo8boo4boo18boo78bobobobo6bo19bo27bo27bo3bo5bo3bo 5bo48boboo55boo7bo9bo10bobbo26bo$10bo5bo14boo3b3o4b3o3boo63boobo6boobo 19bobo12b3o65bobo8boo17boo27boo25bo5bo5bo3bo5bo51bo64bo9bo12bo26bo$5b oo4bo5bo13boo3bobo4bobo3boo63boboo6boboo19bo14bobo6boo56boobo6boo75boo 3boo4boobboo4boo43bo3bobbobo53boo7boo8boo8bo3bo26bo$6bo3boo4boo18b3o4b 3o100boo5boo7b3o6boo60boo5bo26boo13boo37bo5bo3bo5bo44bo5bobbo54bo3boob o6boobo10bo3bo5bo19boo$5bo6boobo137boo79bo4bo27boo13boo32boo4bo5bo3bo 5bo43bo6boo54bo4boboo6boboo14bo4boo17bo$5boo5boboo217bo5boo76bo3boo4b oobboo4boo26boo78boo7boobboo15bobbo5bo7b3o6bo4bo$36boo6boo187boobboo 21boo27boo25bo6boobo6boobo27bobbo10b3o3b3o67bo3bo18bo14bobo6bo9boo$36b oo6boo111boo3b3o69bo3bo22bo27bo26boo5boboo6boboo26bobobo77boo8bo3bo15b obobo12b3o8b3o5bobo$157boo3bobo68bo3bo23bobo23bobo72b3obo15bo63bo7boo bboo14boboboo28boobobo$162b3o68boobboo23boo23boo73b3o17bo62bo4boobo6b oobo10bobo5b3o23bobobo$271b3o3b3o102bo62boo3boboo6boboo11boo9bo16boo5b o$168bobo94b3o3bobo3bobo3b3o195bo4bo15b3o3bobbo$160boo9bo99b3o3b3o76b oobbo124bo15b5o5bo$161bo5bobbo185bobboo4b3o114boo18b3obbo3bo$158b3o5bo bobo186b5o3bobo12b3o16bobboo78bo20boobbo3bo$158bo7bobbo193bob3o12bobo 16boobbo78bo28bo$167boo102bo7bo100b3o6b3o6b5o79bo25bobbo$270bobo5bobo 76b5o140b3o5bo$271bo7bo76bobboo26bo5bo106bo7bobobo$356boobbo26bo5bo4b 5o97bo4bobboobobo$387bo5bo5boobbo83boo12bo9bobo$399bobboo83boobboo10b oo6boo$389b3o93boobobboo11bo$29boo9boo31boo4bo4boo291bo17boo88b3o16bo$ 28bobbo7bobbo29bobbobo3bobobbo290bo16b3o107bo$28b3o9b3o29b3o9b3o290bo 15boboo$bboobo6boobo10boo3b9o35boo5boo308bobo91boo$bboboo6boboo9bobobb obb5obbo4boo27bobb5obbo29boobo6boobo24bo7bo212b3o3b3o10bobbo90boo$6boo bboo4boo7bobobobobb3obboo3bobbo17boo7boo7boo29boboo6boboo23bobo5bobo 231boo$6bo3bo5bo9bobobo13bobobbobbo12bobo26boo22boobboo4boo22bo7bo208b oo6bo$7bo3bo5bo10bo14boobob5o14b3o23bobo22bo3bo5bo239bobbo5bo$6boobboo 4boo9boo13bobboo19bo3bo20b3o25bo3bo5bo238bobobo4bo$bboobo4bo5bo9b3o7b 3obb3o3boobo15b3obbobbo12boobo3bo23boobboo4boo97boboo6boobo128bobbo$bb oboo5bo5bo8b3o7bobobb3obboobobo19boboo10bo5boboo19boobo6boobo99boobo6b oboo10boobbo38bobboo74bo$oo8boo4boo8b3o7b3obb3o3boobbo14b3obbobbo4b3o 3bo5bo22boboo6boboo97boo8boo4boo8bobboo29bo8boobbo71bobo$o9bo5bo10boo 13bobboo3bo15bo3bo8bobo3bo5boboo17boo14boo96bo8bo5bo10b5o28bo7b5o79bo bbo$bo9bo5bo10bo14booboboo17b3o9b3o5boobo3bo17bo15bo23b3o3b3o64bo10bo 5bo32b3o7bo89b3obb3o$oo8boo4boo8bobobo13bobobo16bobo23b3o19bo15bo22bob o3bobo64boo8boo4boo15bob3o12bobo98boobboo$bboobo6boobo9bobobobobb3obb oo3bobobbo15boo14bo11bobo16boo14boo22b3o3b3o66boboo4bo5bo10b5o3bobo12b 3o3b3o3b3o3b5o79bobbo$bboboo6boboo9bobobbobb5obbo4bobboo26boobo3boboo 7boo18boobo6boobo20boo22bo54boobo5bo5bo8bobboo4b3o31boobbo76bobobbobo$ 26boo3b9o36bo9bo27boboo6boboo19bobo12b3o6bobo57boobboo4boo8boobbo29bo 8bobboo76boo4boo$28b3o9b3o34boo5boo61bo14bobo7bo59bobbo5bo43bo$28bobbo 7bobbo31b3obb5obb3o57boo5boo7b3o66bo4bo5bo42bo$29boo9boo32bobbo7bobbo 64boo76boobboo4boo14b4o28b4o$75boo9boo139boboo6boobo15boboobo26boboobo $227boobo6boboo15boobboo26boobboo$157boo3b3o91boobboo26boobboo$157boo 3bobo7bo83boboobo26boboobo$162b3o6bobo83b4o28b4o$172bo$$160boo$161bo 321bo$158b3o322bo5bo$158bo324bo5b3o$475boo6boo7bo$474bobo9bo4boo$445b oo3boo3boobboo3boo8boboboobbo4bo$371boo4boo67bo3boo3boobboo3boo9bobobo 7bo$371bobobbobo66bo31bo5b3o$373bobbo68boo3boo3boobboo3boo9bobbo26bo$ 372boobboo17boo4boo47bobobobobbobobobo12bo26bo$320boo4boo5boobo34b3obb 3o16bobobbobo42boo5bobo6bobo10bo3bo26bo$321bo5bo5boboo36bobbo5b4o11bo bbo45bo4boobo5boobo10bo3bo5bo19boo$39boo73boobo6boobo192bo5bo4boo4boo 42boboobo9boobboo43bo9boo7boo12bo4boo17bo$40bo8b3o62boboo6boboo192boo 4boo3bo5bo43boobboo8b3obb3o42boo9bo8bo9bobbo5bo7b3o6bo4bo$39bo10boo66b oobboo4boo20bo7bo173bo5bo42boobboo10bobbo5b4o45bo8bo12bo14bobo6bo9boo$ 39b4o6boo67bo3bo5bo20bobo5bobo100bo25bo33boo4boo3boo4boo37bo4boboobo 18boboobo34boo8boo7boo9bobobo12b3o8b3o5bobo$7boobo5boo19boo4bo6bo68bo 3bo5bo20bo7bo100bobo23bobo33bo5bo3bo5bo38bo5b4o19boobboo35bo9bo8bo8bob oboo28boobobo$7boboo6bo15boobobob3o3boo70boobboo4boo130bo25bo33bo5bo5b o5bo17b4o16bo28boobboo34bo9bo8bo9bobo5b3o23bobobo$11boo3bo16boobo3bo6b oboo63boobo4bo5bo136bo15bo38boo4boo3boo4boo16boboobo44boboobo34boo8boo 7boo9boo9bo23bo$11bo4boo18bobo10bo64boboo5bo5bo128b5obb3o11b3obb5o42bo 5bo17boobboo11b3o3b3o25b4o71bo4bo16bo5bobbo$12bo20b3o13bo68boobboo4boo 63bo7bo55bo4bo5bo9bo5bo4bo30boo4boo4bo5bo16boobboo39bo84bo17boo4bo$11b oo3boo14bo26bo58bo3bo5bo63bobo5bobo24boboo6boboo15bobbo7boo9boo7bobbo 30bo5bo3boo4boo16boboobo15bo23bo81boo19bo5bo3bo$7boobo6bo14boobo22bobo 58bo3bo5bo63bo7bo25boobo6boobo12bobboboo27boobobbo26bo5bo6boobo19b4o 16bo22bobo80bo26bo3bo$7boboo5bo11boboo5bob3o8b3o5bobo57boobboo4boo20b 3o3b3o66boo8boo15bobobo5bo21bo5bobobo25boo4boo5boboo39bo23bo81bo26bo$ 5boo9boo10booboboo4bobo8bobo4booboboo50boobo6boobo22bobo3bobo67bo9bo 16bobbo4bobo19bobo4bobbo106bo81bo26bobbo$5bo25bobo5b3o8b3obo5boobo50bo boo6boboo22b3o3b3o66bo9bo20boobbobbo5b3o3b3o5bobbobboo59boobbo147b3o5b o$6bo9boo13bobo22boboo133b3o3b3o23boo8boo24boo6bobo3bobo6boo64bobboo4b 3o138bo7bobobo$5boo10bo14bo26bo133bobo3bobo25boboo6boboo28b3o3b3o73b5o 3bobo12b3o123bo4bobboobobo$7boobo5bo25bo13b3o113bo20b3o3b3o25boobo6boo bo116bob3o12bobo118boo4bo9bobo$7boboo5boo24bo10bobo94bo11b3o6bobo57boo 8boo131b3o6b3o109bo7boo6boo$41boobo6bo3boboo90bobo10bobo7bo59bo9bo18b oo21boo65b5o43bo17bobboo74b3o5bo$44boo3b3oboboboo91bo11b3o66bo9bo14boo bbobbo19bobbobboo59bobboo26bo5bo11bo8bo8boobbo76bo5bo$41bo6bo4boo176b oo8boo10bobbo4bobo19bobo4bobbo56boobbo26bo5bo11bo8bo7b5o83bo$41boo6b4o 174boboo6boboo11bobobo5bo21bo5bobobo86bo5bo14bo5bo$40boo10bo174boobo6b oobo12bobboboo27boobobbo101b3o3b3oboo$40b3o8bo110b3o28bo7bo54bobbo27bo bbo92b3o15boob3o3b3o3b5o$51boo104bo4bobo7bo19bobo5bobo54bo4bo3boo11boo 3bo4bo109bo5bo11boobbo$156bobo3b3o6bobo19bo7bo56b5o4bo11bo4b5o110bo8bo 8bobboo$157bo14bo92bobobo7bobobo117bo8bo$260bo3boboboo7boobobo3bo121bo $259bobobbobo13bobobbobo84b3o19b3o15b4o$260bo4boo13boo4bo124boboobo$ 370bo5bo15bo5bo12boobboo$370bo5bo15bo5bo12boobboo$370bo5bo15bo5bo12bob oobo$412b4o$372b3o19b3o5$374bo21bo$374bo21bo$41boo5boo220boo6boo94bo 21bo$36boo3bo7bo3boo215bobbobbobbo$35bobo4bo5bo4bobo314b3o3b3o13b3o3b 3o$37bob3obo3bob3obo$3boobo5boobo18boobobo3bo3bo3boboboo213boboobboobo 94bo21bo$3boboo5boboo21bo5bobobo5bo211boobbobo6bobobboo89bo21bo$7boo7b oo18bobobbooboboboobbobo203bo6bo4bo8bo4bo6bo82bo21bo$7bo8bo20bo3bobbob obbo3bo138boo63bobo9bo10bo9bobo190bo$8bo8bo15boo8booboo8boo80boo36boo 13bobbo34boboo4boobo17bo7bobbo10bobbo7bo191bo5bo$7boo7boo11boobbo23bo bboo77bo35bobbo12bobobo33boobo4boboo242bo5b3o$3boobo5boobo13bobobo5b3o 7b3o5bobobo52boobo8boboo9bobo32bobobo13bobbo31boo6boo4boo16bo5bo18bo5b o184boo6boo7bo$3boboo5boboo15boboo4bobo7bobo4boobo54boboo8boobo10boo 32bobbo18bo29bobo6bo5bo16b3o3b3o16b3o3b3o82b3o97bobo9bo4boo$boo7boo17b obobo5b3o7b3o5bobobo56boo4boo19b3o25bo19bobo30bo9bo5bo14bobobobobobo 14bobobobobobo150boo5boboo8boboo8boboboobbo4bo$bo8bo18boobbo23bobboo 56bo4bobo19bobo26bobo48boo8boo4boo13b3obooboob3o4b3o5b3obooboob3o79boo bboo18boo45bo5boobo8boobo9bobobo7bo$bbo8bo21boo8booboo8boo61bo3bo21b3o 79boobo4bo5bo15bobobobobobo5bobo6bobobobobobo80b5obo17bobo43bo4boo10b oo15bo5b3o$boo7boo25bo3bobbobobbo3bo64boobboo64b3o6b3o27boboo5bo5bo15b 3o3b3o6b3o7b3o3b3o81boo4bo15boo46boo4bo9bobo14bobbo25bo$3boobo5boobo 20bobobbooboboboobbobo59boobo6boobo42b3o6b3o6bobo34boo4boobboo4boo16bo 5bo18bo5bo81bob5o16b3o50bo10bo16bo28bo$3boboo5boboo21bo5bobobo5bo60bob oo6boboo51bobo6b3o5bo3bo24bo5bo3bo5bo130boo3bo17boo46boo3boo8boo16bo3b obboo20bo$34boobobo3bo3bo3boboboo61boobboo4boo39bo3bo5b3o14bo3bo25bo5b o3bo5bo130bo22boo46bo5boboo6boobo12bo3bobb3o18boo$37bob3obo3bob3obo64b o3bo5bo13b3o24bo3bo51boo4boobboo4boo135bo17boo45bo6boobo6boboo12bo5b5o 15bo$35bobo4bo5bo4bobo63bo3bo5bo12bobo51bo3bo26boobo6boobo133bo3boo15b 3o45boo9boobboo4boo10bobbo3b3o6b3o6bo4bo$36boo3bo7bo3boo63boobboo4boo 12b3o24bo3bo21bob3obo25boboo6boboo17bo7bo16bo7bo81b5obo16boobbo54bobbo 5bo12bo5boo7bobo6bo9boo$41boo5boo64boobo6boobo20boo18bob3obo20bo5bo55b obo5bobo4b6o4bobo5bobo79bo4boo16bobboo43boo9bo4bo5bo9bobobo12b3o8b3o5b obo$114boboo6boboo20bobo17bo5bo19booboboboo55bo7bo4bobobbobo4bo7bo80bo b5o19b3o43bo9boobboo4boo8boboboo28boobobo$150bo16booboboboo17bobbooboo bbo65b3o6b3o75b4o13boobboo19boo43bo6boboo6boobo10bobo5b3o23bobobo$150b oo14bobbooboobbo16boo7boo64bo4bobbo4bo73boboobo37boo43boo5boobo6boboo 11boo9bo23bo$166boo7boo90bobo4boo4bobo72boobboo14b3o21boo80bo4bo16bo5b obbo$267bobobbo4bobbobo72boobboo37b3o84bo17boo4bo$266boobob3obb3oboboo 71boboobo38boo81boo19bo5bo3bo$264bobboboo3boo3boobobbo70b4o36bobo83bo 26bo3bo$264boo3boboobooboobo3boo111boo83bo26bo$269bobo6bobo81b3o117bo 26bobbo$268boobobboobboboo68boobbo147b3o5bo$268bobb3obb3obbo68bobboo5b o5bo133bo7bobobo$270bobb4obbo71b5o4bo5bo16b3o114bo4bobboobobo$bboobo6b oboo49bo5boo3boo191boobo4boboo79bo5bo7b3o21b3o94boo4bo9bobo$bboboo6boo bo47b3o5bobobobo191bobbo4bobbo100bo5bo107bo7boo6boo$6boobboo50bo10bobo 12bobboo177bobbobbobbo71b5o6b3o7bo5bobbo5bo8bo5bo14bobboo74b3o5bo$6bo 4bo41boo7boo8booboo10bobobbo178boo4boo71bobboo17bo5bobbo5bo8bo5bo5bo8b oobbo76bo5bo$7bobbo43bo32bobobo258boobbo17bo5bo17bo5bo5bo7b5o83bo$6boo bboo42bobo29booboboo290b3o22bo$bboobo6boboo39boo27bo3boo3bo280b3o21b3o $bboboo6boobo26bo7bo8b3o8b3o3b3o8boobboobo309b3o3b3o3b5o$oo14boo10boo bbo8bobo5bobo7bobo8bobo3bobo4bo3bobobbobo276bo45boobbo$o16bo10bobbobo 8bo7bo8b3o8b3o3b3o8boobb3o277bo36bo8bobboo$bo14bo12bobobo50bo3boo281bo 36bo$oo14boo10booboboo51boobob5o312bo$bboobo6boboo11bo3boo3bo50bobobbo bbo271b3o3b3o18b3o15b4o$bboboo6boobo10boboobboo8b3o3b3o8b3o8bo7bo8bobb o320boboobo$26bobobbobo3bo4bobo3bobo8bobo7bobo5bobo8boo281bo20bo5bo12b oobboo$27b3obboo8b3o3b3o8b3o8bo7bo283b4o5bo20bo5bo12boobboo$31boo3bo 27boo295boboobo4bo20bo5bo12boboobo$25b5oboboo29bobo116boo84bo5bo85boo bboo45b4o$25bobbobbobo32bo115bobbo83boo3boo85boobboo19b4o4b3o$30bobbo 10booboo8boo7boo114bobobo82boo3boo85boboobo18boboobo$31boo12bobo10bo 124bob3o82bo3bo87b4o5bobbo10boobboo$43bobobobo5b3o101boo24b3o181b3obb 3o8boobboo$43boo3boo5bo57boo3boo4boobo27boobboobboo205boobboo9boboobo$ 113boo3boo4boboo27boobbobbobo119bo86bobbo11b4o5bobbo$122boo4boo31b3o 118bobbo83bobobbobo16b3obb3o$113boo3boobbo5bo32boo19b3o97bobbo83boo4b oo17boobboo$113bobobobo3bo5bo37b3o12bobo5bo72bo7b3o3b3o3bo111bobbo$ 115bobo4boo4boo13bo23bobo12b3obo75bobbo5bobo3bobo113bobobbobo$114boobo 4bo5bo38b3o18bob3o69bobbo5b3o3b3o3bo109boo4boo$118boo3bo5bo11bob3o44b oobo70bo17bobbo$119bobboo4boo13boobo43boboo88bobbo$118bo3bo5bo14boboo 44b3obo68bo19bo$118boo3bo5bo14b3obo18b3o92bobbo$119bobboo4boo20bob3o 12bobo23bo68bobbo$118bo5boobo18bo5bobo12b3o93bo$48boo3boo63boo4boboo 24b3o19boo$47bobbobobbo117b3o$43boo3boo3boo3boo112bobobbobboo91bo3bo$ 43bo15bo112boobboobboo90boo3boo$40boobo15boboo86b3o24boo94boo3boo$39bo boboo13boobobbo84b3obo118bo5bo$39bobo5b3o3b3o5boboo85bobobo$37boobbo5b obo3bobo5bo89bobbo$36bo4boo4b3o3b3o4boo90boo$36b5o27bo$40bo25b3o$34b4o 27bo$34bobbo27boo$$48boo3boo$bboobo8boboo15bo4b3o8bo3bo8b3o$bboboo8boo bo14bobo3bobo5bo9bo5bobo3boo$6boo4boo18bobo3b3o5boo7boo5b3o3boo$6bo4bo bo19bo$7bo3bo$6boobboo21bo38boo83boo7boo$bboobo6boobo16bobo3b3o5boo7b oo5b3o7boo5boo75bobbo5bobbo96boo$bboboo6boboo16bobo3bobo5bo9bo5bobo14b o75boboobo3boboobo95boobo15bo$oo8boo4boo15bo4b3o8bo3bo8b3o12bobo70bo5b obbobobobobbo5bo94bo13bobo$o9bo5bo31boo3boo22boo70bobo5bo3bobo3bo5bobo 85bo4bo11bo$bo9bo5bo48b3o3b3o8boo64bobbob3o3booboo3b3obobbo84bobo4bob oo5b3o4bo7boo$oo8boo4boo16bobbo28bobo3bobo8bo63boobobobo15boboboboo91b oo4bo7boo6bobo$bboobo6boobo18b4o28b3o3b3o10bo60bobobobo19bobobobo83bo 12boo3b5o3boobobo$bboboo6boboo24bo40b5o60bobbo25bobbo48boobo8boboo18b oo17booboo3bobobo$36b5o40bo63boobo9b3o3b3o9boboo47boboo8boobo18b5o17bo 6bo$36bo10b3o3b3o28b4o58bob3obbo4bobo3bobo4bobb3obo46boo4boo4boo15boo 5booboo22bobbo$38bo8bobo3bobo28bobbo25boo3boo4boobo16bobbo4bo5b3o3b3o 5bo4bobbo44bo5bo4bobo14bobo6bo28bo$37boo8b3o3b3o57boo3boo4boboo16boobo boo23booboboo45bo5bo3bo16boboboo28bo3bo$43boo22boo3boo54boo17bobo25bob o47boo4boobboo17bobobo12b3o8bobobbo3bo$42bobo12b3o8bo3bo8b3o4bo24boo3b oo8bo18bobo25bobo49boobo6boobo15bo14bobo8bobbo5bo$42bo14bobo5bo9bo5bob o3bobo23bobobobo9bo18bo27bo50boboo6boboo14bobbo3bobo6b3o8bobo3bobbo$ 41boo5boo7b3o5boo7boo5b3o3bobo25bobo10boo101boobboo4boo12bo5bobbo25bo$ 48boo38bo25boobo6boobo26boo13boo60bo3bo5bo13bo3bobbobo23bobobo$118boo 4boboo26boo13boo61bo3bo5bo12bo3bo28boobobo$88bo30bobboo107boobboo4boo 12bo28bo6bobo$52boo3b3o5boo7boo5b3o3bobo28bo3bo25bo27bo50boobo6boobo 14bobbo22booboo5boo$52boo3bobo5bo9bo5bobo3bobo28boo3bo23bobo25bobo49bo boo6boboo15bo6bo17b5o$57b3o8bo3bo8b3o4bo30bobboo23bobo25bobo76bobobo3b ooboo17boo$67boo3boo44bo5boobo16booboboo23booboboo72boboboo3b5o3boo12b o$118boo4boboo16bobbo4bo5b3o3b3o5bo4bobbo72bobo6boo7bo4boo$55boo27bobb o58bob3obbo4bobo3bobo4bobb3obo75boo7bo4b3o5boobo4bobo$56bo27b4o57boobo 9b3o3b3o9boboo88bo11bo4bo$53b3o25bo64bobbo25bobbo82bobo13bo$53bo27b5o 60bobobobo19bobobobo83bo15boboo$60boo4b3o3b3o4boo4bo61boobobobo15bobob oboo102boo$60bo5bobo3bobo5bobboo64bobbob3o3booboo3b3obobbo$57boobo5b3o 3b3o5bobo66bobo5bo3bobo3bo5bobo$57bobboboo13boobobo67bo5bobbobobobobbo 5bo$59boobo15boboo73boboobo3boboobo$62bo15bo77bobbo5bobbo$62boo3boo3b oo3boo78boo7boo$66bobbobobbo$67boo3boo! golly-2.5-src/Patterns/Life/Oscillators/unique-high-period.rle0000644000175100001440000001304112156145314021376 00000000000000#C Unique High-Period Oscillators #C These represent the known high-period mechanisms circa 1999 #C that do not depend on some engineering technique such as hassling #C (see Oscillators-TrafficLightHasslers) or Herschel conduits #C (see HerschelTrack). #C From Alan Hensel's "lifebc" pattern collection. x = 254, y = 174, rule = B3/S23 152boo$151bobbo$150bobobo$149b3obo58boo16boo$149b3o61bo16bo$129bo11bob o69bobo12bobo$bboobo6boobo76boboo6boobo21b3o14bo36boobo6boobo19boo12b oo$bboboo6boboo76boobo6boboo9boo9bo13bobbo37boboo6boboo$6boobboo4boo 72boo14boo8bo9boo11bobobo3boobboboboo22boo4boobboo4boo14boo18boo$6bo3b o5bo74bo14bo9bobo20bobbo4boobboboboo22bo5bo3bo5bo15bobo10boo4bobo$7bo 3bo5bo25bo46bo16bo9boo21boo10bo27bo5bo3bo5bo15bo10bobo5bo$6boobboo4boo 24bobo45boo14boo39boo30boo4boobboo4boo12bo13boo9bo$bboobo4bo5bo24bo3b oo45boboo6boobo16bo24boo32boobo4bo5bo13b6o8bo5b6o$bboboo5bo5bo12boo9bo 3boo3boo40boobo6boboo16bobo30boo24boboo5bo5bo17bo14bo$6boobboo4boo12b oo9bo3boo3boo44boobboo19bo33boo28boobboo4boo14boo18boo$6bo3bo5bo25bobo 52bobbo21bo39boo21bo3bo5bo15bo20bo$7bo3bo5bo25bo52bo4bo21boo3boo17boob oo3boo4bobbo21bo3bo5bo15bo18bo$6boobboo4boo78boobboo26bobo16booboo3boo bbobbobo20boobboo4boo12b3obbo14bobb3o$bboobo6boobo76boboo6boobo13boo9b o32bo17boobo6boobo14bobb3o8bo5b3obbo$bboboo6boboo76boobo6boboo14bo9boo 27boboo18boboo6boboo15bo12boo8bo$117b3o25boo13bo50boo10bobo5boo$117bo 27b3o65bo10boo4bo$145boobo62boo18boo$147bobo58bobbo20bobbo$146bobbo57b obobobboo12boobbobobo$147boo59bobbobobo12bobobobbo$211bobo16bobo$212b oo16boo5$39boo$39bo$31bobooboobo5boo$31boobobobo6bo70boo25boo57boo48b oo$bboobo6boobo21bo8bo46boboo4boo3boo9bo25bo30boo5boobo6boobo8bo48bo$ bboboo6boboo29boo46boobo4boo3boo9bobo21bobo31bo5boboo6boboo8bobo21boo 21bobo$6boo8boo73boo25boo7boo12boo31bo4boo4boobboo4boo7boo8bo12boo12b oo7boo$6bo9bo28boo45bo8boo3boo21bo44boo3bo5bo3bo5bo17boo26bobo$7bo9bo 11bo9b3obbobo44bo9bobobobo16bo4boo49bo5bo3bo5bo15boo29bo$6boo8boo11b3o 7bobo3bo45boo10bobo18boo3bo44boo3boo4boobboo4boo16boobboo22b3o$bboobo 6boobo16bo6bobo4b3o44boboo5boobo22bo46bo3bo5bo3bo5bo$bboboo6boboo15bob o14bo44boobo9boo66bo5bo5bo3bo5bo$6boobboo19boo64boo8bo20bo45boo3boo4b oobboo4boo$6bo3bo87bo7bo17boo3bo49bo5bo3bo5bo17boobboo22b3o$7bo3bo19b oo64bo8boo16bo4boo43boo4bo5bo3bo5bo15boo29bo$6boobboo19bo8bo56boo8bo 21bo45bo3boo4boobboo4boo16boo26bobo$bboobo6boobo16bo6boboboboo46boboo 9bo11boo7boo12boo31bo6boobo6boobo9boo8bo12boo12boo7boo$bboboo6boboo15b oo5bobooboobo46boobo9boo9bobo21bobo30boo5boboo6boboo8bobo21boo21bobo$ 38bo78bo25bo59bo48bo$37boo77boo25boo57boo48boo13$231boo$231boo$$223boo $224bo12bo$31boo20boo169bobo8boo$30bobbo19boo170boo10boo$30bo205bo$30b o214boo$30boboo20boo92booboobo90bobo$32boo18boboo91boobbooboo91bo$52bo 102bo84boo4booboobo$boo3boo4boobo36bo39boboo8boboo22boo15boo26boo5boob o4boo3boo14boo27bobo3bobboboo$boo3boo4boboo15boo13boo4bobbo36boobo8boo bo22boo15boo5boo20bo5boboo4boo3boo13bobo30bo3bo$10boo4boo13boo12bobbo 4boo35boo10boo50boo19bo10boo22bo30bo3boboo$boo3boobbo5bo28bobbo42bo9bo bo43bo27boo9bo3boo3boo8bobooboo4boo23bo3b4o$bobobobo3bo5bo26booboo41bo 10bo45booboobboo31bobbobobobo8boobobbo3bobo23b3obo$3bobo4boo4boo27boo 43boo8boo17bobbo17boobo4bobooboo20boo9boo4bobo16boobbo25boo3bobo$bboob o4bo5bo75boboo6boobo17bo16bo3bo31bo5boobo5boobo16b5obo23b3obo$6boo3bo 5bo19bo10bo43boobo6boboo18boo15b3o31bo6boboo9boo14bo3b3o23bo3b4o$7bobb oo4boo18bobo8bobo46boobboo4boo10boboo6bo46boo3boo14bo13bo6boo22bo3bob oo$6bo3bo5bo20bo4boo4bo48bobbo5bo11bobbo3bo54bo14bo14boo4b3o24bo3bo$6b oo3bo5bo22bo4bo50bo4bo5bo9bo3bob3o49boo4bo13boo13bo6boo21bobo3bobboboo $7bobboo4boo22bo4bo50boobboo4boo8bo11bo13boo32bo3boo14bo14bo3b3o8b3o 11boo4booboobo$6bo5boobo24bo4bo46boboo6boobo13b3obo3bo14boo31bo6boobo 9bo15b5obo8bobo18bo$6boo4boboo25bobbo47boobo6boboo13bo3bobbo48boo5bob oo9boo14boobbo9bobbo16bobo$39bobobbobo69bo6boobo78boobobbo3bobo7bobo 17boo$39boo4boo72boo84bobooboo4boo7b3o$121bo88bo$122bobbo84bobo$211boo $221bo$219boo10boo$221boo8bobo$220bo12bo$233boo$$225boo$225boo6$46boo 6boo$46boo6boo5$206boo24boo$206boo24boo$bboo3boobboo3boo12boo38boo20bo boo6boobo27bo42boo3boo3boobboo3boo17boo$bboo3boobboo3boo11bobo38bobo 19boobo6boboo26boboo41bo3boo3boobboo3boo16bobbo$29boboboo32boobobo23b oo8boo24boboo40bo37boo$bboo3boobboo3boo12bobobo32bobobo25bo8bo26boo41b oo3boo3boobboo3boo$bbobobobobbobobobo14bo36bo26bo10bo73bobobobobbobobo bo21b3o$4bobo6bobo15bobbo12boo4boo12bobbo25boo8boo14boo12boo38boo5bobo 6bobo23bobo$3boobo5boobo15bo14bobo4bobo14bo23boo6boobo16boo12boo39bo4b oobo5boobo23b3o$7boo7boo13bo3bo9boo8boo9bo3bo24bo6boboo70bo9boo7boo22b oo$8bo8bo13bo3bo10bobo4bobo10bo3bo23bo5boo74boo9bo8bo22b3o$7bo8bo14bo 15boo4boo15bo23boo4bo20bobo62bo8bo23bobo$7boo7boo13bobbo32bobbo21boo7b o18bo18boo35boo8boo7boo22b3o$8bo8bo14bo36bo23bo6boo13boobbo4bo10boobo bboboo32bo9bo8bo$7bo8bo13bobobo3boo22boo3bobobo20bo9boobo9boobobboboo 10boobbo4bo31bo9bo8bo28boo$7boo7boo11boboboo3boo22boo3boobobo19boo8bob oo13boo19bo35boo8boo7boo26bobbo$29bobo38bobo68bobo80boo$30boo38boo134b oo24boo$206boo24boo5$46boo6boo$46boo6boo11$138bo$136b3o$135bo$135boo$ 119boo19boo$120bo19bo$120bobo15bobo$oo4boo6boboo35bo38boobo6boobo15boo 15boo$bo5bo6boobo22bo10b5o36boboo6boboo$o5bo5boo15boo8boo9boobobbo33b oo4boobboo4boo24b3o$oo4boo3bobo15boo7boo9bo7bo32bo5bo3bo5bo25bobo$bbob oo5bo27boobboo5boobobbo34bo5bo3bo5bo24bobo$bboobo4boo39b5o34boo4boobb oo4boo$6boo4boobo37bo38boobo6boobo$7bo4boboo76boboo6boboo$6bo3boo4boo 21boobboo45boo4boobboo4boo$6boobbo5bo12boo7boo16boo32bo5bo3bo5bo$11bo 5bo11boo8boo15boo33bo5bo3bo5bo17boo15boo$10boo4boo22bo49boo4boobboo4b oo16bobo10bo4bobo$6boo4boobo76boobo6boobo18bo12bo6bo$6boo4boboo76boboo 6boboo17boo19boo$128boo$129bo$126b3o$126bo! golly-2.5-src/Patterns/Life/Puffers/0000755000175100001440000000000012156146015014363 500000000000000golly-2.5-src/Patterns/Life/Puffers/c4-diagonal-puffer.rle0000644000175100001440000001652112156145314020364 00000000000000#C Highly non-optimized dirty c/4 diagonal puffer (p4284). #C Used as the basis for c4-sideways-rake.rle (in Rakes folder). #C Notice the interesting effect of "tunneling gliders": #C Each puff cloud releases a pair of forward gliders, which crash #C into the next puff cloud and are re-emitted from the other side #C of the cloud with the same position and timing. It looks as if #C there's a hyperspace bypass tunnel under the junk. This is due to #C the puffer traveling at the same speed as the forward gliders that #C it generates -- it would occur with any puffer that produces #C forward gliders, *unless* the puff cloud producing them is thin #C enough to let previous gliders through to interfere with the #C glider-producing reaction at the front of the cloud. This could #C create higher-period orbits at the back end of the puffer. #C Puffer constructed by Jason Summers, 30 September 2005. x = 897, y = 897, rule = B3/S23 18boo$17boo$19bo$21boo$20bo$$19bobbo$11boo5boo$10boo5bo$12bo4bobo$8bo 5boobbo$7boo5boo$7bobo8bo26b3o$17bobo25bobb3o$10boo6bobo25bobo$10boo7b obo29bo$20boo27bo$bo6boo3bo37bobo$oo5bobbobobo9boo18boobo6bo$obo3boobo 3bobo7bobbo16boo3bobbobbo$4bo9bobo7bobo10b3o4bobbobbo3bo$3bo11boo8bo 11bo6bobbobbo3bo$3bobbo33bo3bo6bobo$19bo17bobbo8boo$18bobo17bobbo6b3o$ 18bobbo9bo7bo5bo3bo23boo$19boo9bobo8boboboobo23boo3bo$29bo13boo29boboo $29boo16bo28b3o$27boo47bo$26bobo15bobbo30b3o$25bo45boobo4boo$26bo44bob oo3bobo$65boo4boboo3b3o$64boo6bo5b3o$65bobo4boo4bobo$65b3o4boobboo$20b oobo41boo6bobo$20bo3bo42bobo3boo3bo$20bo4bo47b4o$22boo45bobo$24bobo44b 4o$71b4o$19bo6boo44boo$18b5o4bobbo$12boo4bo6boo$12bobo11bo$12bo5boboo 6bobo$13boo4bo4bobo$13bobbo6b3o$13bo6booboo$15bobobobbo$$17bo4bo$18b4o 8$495boo$483b3o9bobo$34bo448bobb3o6bo9bo$33b5o446bobo16boobo$33bobboo 451bo4boobbo3boobbo$35boobo448bo6boobboboobbo$489boboobo3b5o$38bobo 457boo$490bobb6o$31b3o6b3o448b7o$26bo4bobb3o4b3o449b3o$25boo5boob5ob3o $25bobo3b3o4booboo$37bobo$27b3o6bobbo$26b3o7bo$28bobob4obbo$30booboo 478boobo7b3o$30b6o477bo3bo6bo$513bo4bo7bo7boo$515boo7bobo4boobo$517bob o4b3obobboo$523bo3boobboo$519boob4oboo$520b7o72$510bo$509boo$509bobo$$ 511b3o$510b3o$512bobo$514b3o$514b3o$517bo$514bobbo$513bo3bo$509booboo 3bo$508boo7bo$510boboobbo$516bo$513bobo$514bo$513bo$512bobo$512bobo$ 511bo$511boo$511boo8$525boobo$525bo3bo$525bo4bo$527boo$529bobo$$524bo 6boo$523b5o4bobbo$517boo4bo6boo$517bobo11bo$517bo5boboo6bobo$518boo4bo 4bobo$518bobbo6b3o$518bo6booboo$520bobobobbo$$522bo4bo$523b4o156$551b 3o$551bo$552bo$554boo$555bo$$552bo$549b4obo$549bo4bo$550bo4boo$552bobb 3o$556boo$553booboo$553boob5o$551boo3boo$550boo4bo113boobo$551boob3o 113bo3bo$546boobb4obbo113bo4bo$545bobboboobooboo85b3o26boo$544boobo95b o30bobo$540boobo3bo3bo4boo78b3o6bo$540bo6bo88bo6bobo23bo6boo$540boboo 3boo88bo4boob4o19b5o4bobbo$547b3o89b4ob5oboo10boo4bo6boo$545boboo91boo 7boobo9bobo11bo$544boobobo112bo5boboo6bobo$545bobbo114boo4bo4bobo$537b oo6bobobo99bo5bo7bobbo6b3o$536boo8bo102bobobob3o5bo6booboo$538bo5bobo 102boobo5bo6bobobobbo$540bobobbo105b8o$539booboobo107b4o10bo4bo$530boo 13bo122b4o$530bobo3bobboo3bo$530bo3bobboo5bo$533boo3bo$533bo$536boo 146bo10boo$538bo144b5o6boo$683bobboo8bo7boo$534b3o16b3o129boobo5boo6b 3obo$526b3o5b3o16bo140boo3boboo$526bo6bobo18bo133bobo6boo$527bo4boo 159b3obo4bo$529b4obo155b3o3bo4bo$530boo159bo7bo$691bo6bo$$694bo17$666b oo$666bobo$666bo$669bo$669boo$669boo$668boo$664booboo$664bo4bo$664bob 4o$668boo$668boo$668boo$670bo$669boo$669bo$670bo15$695boobo$695bo3bo$ 695bo4bo$697boo$699bobo$$694bo6boo$693b5o4bobbo$687boo4bo6boo$687bobo 11bo$687bo5boboo6bobo$688boo4bo4bobo$688bobbo6b3o$688bo6booboo$690bobo bobbo$$692bo4bo$693b4o5$771bo$770boo$770bobo$63boo$63bobo707boo$63bo 709boobb3o$64boo711boobo$64bobbo707bo4bo$64bo709b3o4bo$66bobo705bo5bo 35b3o$70bo690boo12bobobboo34bobb3o$68bobbo688boo28boo25bobo$68bobbo 690bo9b3o15bobo29bo$70b3o691boo6booboo6boo5bo29bo$66b3ob3o691boobboobb ob3o6bobo3boobbo28bobo$62b3oboobb3o694boobobboo8bo11bo19boobo6bo$62bo 7boo696bo4boo11bo3boo3b3o16boo3bobbobbo$63bo6boo693boo3bo15boo4boo4bo 9b3o4bobbobbo3bo$66b5o694boo25b7o9bo6bobbobbo3bo$68boo695bo27b4o14bo3b o6bobo$67boo697booboo37bobbo8boo$67boo699bobo25b3oboo7bobbo6b3o$66bobo 726boobobooboo5bo5bo3bo$65boo728boobbobboobo6boboboobo$65bobo729bo16b oo$64bo753bo$65boo$815bobbo$171bo$159boo9boo$158boo3bo6bobo669bo$160bo boo15b3o648boo9boo$162b3o5bobo4booboo647boo3bo6bobo$79b3o80bo6boobobob o654boboo15b3o$79bo84b3obo6boboo654b3o5bobo4booboo$82bo82boo7bo658bo6b oobobobo$79bobbo82boo5boo661b3obo6boboo$80bobbo83b5o25b3o636boo7bo$81b o115bobb3o633boo5boo$83bobo112bobo637b5o$85boo116bo$86bo114bo$85boo 116bobo$84b3o109boobo6bo$79boobooboo108boo3bobbobbo$79bo3boboo102b3o4b obbobbo3bo$79bob3obbo102bo6bobbobbo3bo196boo$84boo106bo3bo6bobo197bobo $83b3o103bobbo8boo200bo$190bobbo6b3o203bo$191bo5bo3bo192b3o9boo$82b3o 108boboboobo193bo11boo$82b3o110boo198bo9boo$199bo197boo5boo$81boo313b oo4boobbo$81bo114bobbo202b3o$390bo4bo3bobboo$389boo5bobbo$389bobo4boo bbo$393bobo$382b3o7boobo$382bo$384bo7boo$382bobo8bo$381bo5bo3bo3boo$ 380boo4b4obb3o$379bo10boo$379bob7obo$380bo3b3obo$369boo14bobobo$369bob o5boboo$362boo5bo6b5obo$362bobo3boobbo3boboo$362bo11boo3boo21boo$365bo 3boo3boobbobo21bobo$365boo4boo5bo23bo$371b10obo$372b5o3bobo$375bo$375b o$375bo11$843bo$842b5o$842bobboo$844boobo$$847bobo$$840b3o6b3o$835bo4b obb3o4b3o$834boo5boob5ob3o$834bobo3b3o4booboo$846bobo$836b3o6bobbo$ 835b3o7bo$837bobob4obbo$839booboo$839b6o21$887bo$886b5o$886bobboo$888b oobo$$891bobo$$884b3o6b3o$879bo4bobb3o4b3o$878boo5boob5ob3o$878bobo3b 3o4booboo$890bobo$880b3o6bobbo$879b3o7bo$881bobob4obbo$883booboo$883b 6o12$382boo$382bobo$382bo$385bo$385boo$385boo$384boo$380booboo$380bo4b o$380bob4o$384boo$384boo$384boo$386bobb3o$385boo4bo$385bo4bobo$386bo4b oo$390boboo$392boo$389booboo$390boboo$390bobo$391boo4$385b3o$385bobb3o $386bobo45b3o$391bo42bo$389bo37b3o6bo$391bobo33bo6bobo$384boobo6bo33bo 4boob4o$383boo3bobbobbo35b4ob5oboo$377b3o4bobbobbo3bo36boo7boobo$377bo 6bobbobbo3bo$380bo3bo6bobo$377bobbo8boo$378bobbo6b3o$379bo5bo3bo$381bo boboobo$383boo$387bo$$384bobbo3$400boo$399boo$400bobo$400b3o$400boo64b 3o$402bobo61bobb3o$467bobo$404bobo65bo$406b3o61bo$406bo65bobo$405bo59b oobo6bo$400boboobo4bo53boo3bobbobbo$399booboobo52b3o4bobbobbo3bo$399bo bo4bo51bo6bobbobbo3bo$404boo55bo3bo6bobo$404bo3bo49bobbo8boo$403bo3bo 51bobbo6b3o$460bo5bo3bo$403bobbo55boboboobo$402boobo58boo$402bo65bo$ 401boo$401bo63bobbo$402bo54$491bo$490boo$490bobo$$493boo$493boobb3o$ 497boobo$495bo4bo$494b3o4bo$494bo5bo$481boo12bobobboo$480boo$482bo9b3o $484boo6booboo$484boobboobbob3o$487boobobboo$488bo4boo$485boo3bo$485b oo$485bo$486booboo$488bobo$$493b3o$493bo$494bo$496boo$497bo$$494bo$ 491b4obo$491bo4bo$492bo4boo$494bobb3o$498boo$495booboobboo$496boboob3o $496bobobbobbo$497boobboo$503bo$501boo$501boo$503bo$502boo$502bo$503bo 3$497boobo$497bo3bo$497bo4bo$499boo$501bobo$$496bo6boo$495b5o4bobbo$ 489boo4bo6boo$489bobo11bo$489bo5boboo6bobo$490boo4bo4bobo$490bobbo6b3o $490bo6booboo$492bobobobbo$$494bo4bo$495b4o4$512bo$511boo$511bobo$$ 513b3o$512b3o65boo$514bobo62boo3bo$516b3o62boboo$516b3o64b3o$519bo63bo $516bobbo65b3o$515bo3bo58boobo4boo$511booboo3bo58boboo3bobo$510boo7bo 52boo4boboo3b3o$512boboobbo52boo6bo5b3o$518bo53bobo4boo4bobo$515bobo 54b3o4boobboo$516bo55boo6bobo$515bo58bobo3boo3bo$514bobo63b4o$514bobo 59bobo$513bo64b4o$513boo63b4o$513boo64boo26$617boo$616boo3bo$618boboo$ 620b3o$620bo$622b3o$615boobo4boo$615boboo3bobo$609boo4boboo3b3o$608boo 6bo5b3o$609bobo4boo4bobo$609b3o4boobboo$609boo6bobo$611bobo3boo3bo$ 617b4o$613bobo$615b4o$615b4o$616boo! golly-2.5-src/Patterns/Life/Puffers/line-puffer-superstable.rle0000644000175100001440000000605012156145314021554 00000000000000#C Superstable line puffer of width 76. #C A line puffer is the best linear generator of chaos in Life. #C It works by pulling a solid line forward at speed c/2. It is #C amazing that this line isn't destroyed by its own debris. #C Furthermore, this kind of puffer can be widened indefinitely, #C making it exponentially more chaotic, without affecting its #C stability. Some methods of stabilizing the edges are known #C to be slightly unstable, giving the puffer a half-life #C independent of its width, but the edge shown here is believed #C to be completely stable. #C Increasing a line puffer's width linearly tends to increase its #C period exponentially. You will not see this width-76 puffer #C repeat for tens of millions of generations. #C One interesting thing you can do with a line puffer is put some #C asymmetrical debris in its plume. Sometimes the asymmetry is #C temporary, but more often in wide puffers such as this one, #C it turns out to be permanent. #C Tim Coe, May 1996. From Alan Hensel's "lifebc" pattern collection. x = 32, y = 156, rule = B3/S23 18bo$18b4o$5bobo12boo$5bobbo14bo$8boo10b4o$10bo13bo$8b4o8bobb3o$7bo4bo 9b3o$9bobbo10bo$9bobbo5bob3o$11bo6boobbo$5bob4o8b3o$5bo3bo9bo$8bo12bo$ 6bobo10bobo$22bo$7b3o9bobo$8boo11bo$7b3o9bo$19b3o$6bobo9boobbo$8bo9bob 3o$5bo3bo13bo$5bob4o11b3o$11bo8bobb3o$9bobbo11bo$9bobbo7b4o$7bo4bo10bo $8b4o8boo$10bo7b4obbobo$8boo8bo5bobbo$5bobbo7bobo8boo$5bobo8bo12bo$14b obboo8b4o$bboobo9b3o8bo4bo$5bo7bobo12bobbo$bboboo7bo14bobbo$bbo9boo16b o$o7bob3o11bob4o$bo5boboo13bo3bo$bo5boo18bo$bobobboo17bobo$boboboo$bo 24b3o$boboboo20boo$bobobboo5bobo4bobo4boo$bo5booboobobbobbobbob5o$bo5b oo7boo3bo4bo$bobobboo5bo6bo7bo$boboboo6bob5o6bobo$bo8boo17bo$boboboo6b ob5o6bobo$bobobboo5bo6bo7bo$bo5boo7boo3bo4bo$bo5booboobobbobbobbob5o$b obobboo5bobo4bobo4boo$boboboo20boo$bo24b3o$boboboo$bobobboo17bobo$bo5b oo18bo$bobobboboo14bo3bo$bobob3obbo13bob4o$bo8bo19bo$bobob3obbo17bobbo $bobobboboo18bobbo$bo5boo17bo4bo$bobobboo19b4o$boboboo22bo$bo25boo$bob oboo17bobbo$bobobboo16bobo$bo5boo$bobobboboo$bobob3obbo$bo8bo13bobo$bo bob3obbo13bobbo$bobobboboo17boo$bo5boo20bo$bobobboo19b4o$boboboo19bo4b o$bo26bobbo$boboboo21bobbo$bobobboo22bo$bo5boo15bob4o$bobobboboo14bo3b o$bobob3obbo16bo$bo8bo14bobo$bobob3obbo$bobobboboo16b3o$bo5boo18boo$bo bobboo5bobo4bobo4boo$boboboo3boobobbobbobbob5o$bo14boo3bo4bo$boboboo6b o6bo7bo$bobobboo5bob5o6bobo$bo5booboo17bo$bo5boo4bob5o6bobo$bobobboo5b o6bo7bo$boboboo9boo3bo4bo$bo8boobobbobbobbob5o$boboboo6bobo4bobo4boo$b obobboo19boo$bo5boo17b3o$bobobboboo$bobob3obbo14bobo$bo8bo16bo$bobob3o bbo13bo3bo$bobobboboo14bob4o$bo5boo21bo$bobobboo20bobbo$boboboo21bobbo $bo24bo4bo$boboboo20b4o$bobobboo21bo$bo5boo18boo$bo5boboo13bobbo$o7bob 3o11bobo$bbo9boo$bboboo7bo$5bo7bobo$bboobo9b3o$14bobboo$5bobo8bo$5bobb o7bobo$8boo8bo$10bo7b4o$8b4o8boo$7bo4bo10bo$9bobbo7b4o$9bobbo11bo$11bo 8bobb3o$5bob4o11b3o$5bo3bo13bo$8bo9bob3o$6bobo9boobbo$19b3o$7b3o9bo$8b oo11bo$7b3o9bobo$22bo$6bobo10bobo$8bo12bo$5bo3bo9bo$5bob4o8b3o$11bo6b oobbo$9bobbo5bob3o$9bobbo10bo$7bo4bo9b3o$8b4o8bobb3o$10bo13bo$8boo10b 4o$5bobbo14bo$5bobo12boo$18b4o$18bo! golly-2.5-src/Patterns/Life/Puffers/line-puffer-unstable.rle0000644000175100001440000000562712156145314021051 00000000000000#C The asymmetric debris destroys the engine of this #C line puffer after appoximately 9.5 million generations. #C See also line-puffer-superstable.rle. #C Tim Coe, 9 October 1995 x = 17, y = 99, rule = B3/S23 obo$o2bo5bo$3b2o4b4o$5bo5b2o$3b4o7bo$2bo4bo3b4o$4bo2bo7bo$4bo2bo3bo2b 3o$6bo6b3o$ob4o8bo$o3bo4bob3o$3bo5b2o2bo$bobo6b3o$10bo$2b3o7bo$3b2o5bo bo$2b3o8bo$10bobo$bobo8bo$bo2bo5bo$4bo5b3o$2bo2bo5b3o$4b2o5b2o$5bobo2b 2o$5bobob2o$5bo$5bobob2o$2bo2bobo2b2o$4b2o5b2o$2bo2bobo2bob2o$5bobob3o 2bo$2bo2bo8bo$2bo2bobob3o2bo$4b2obo2bob2o$5bo5b2o$5bobo2b2o$5bobob2o$ 5bo$5bobob2o$5bobo2b2o$5bo5b2o$5bobo2bob2o$5bobob3o2bo$5bo8bo$5bobob3o 2bo$5bobo2bob2o$5bo5b2o$5bobo2b2o$5bobob2o$2bo2bo$2bo2bobob2o$2bo2bobo 2b2o$2bo2bo5b2o$2bo2bobo2bob2o$2bo2bobob3o2bo$2bo2bo8bo$2bo2bobob3o2bo $2bo2bobo2bob2o$2bo2bo5b2o$2bo2bobo2b2o$2bo2bobob2o$2bo2bo$2bo2bobob2o $2bo2bobo2b2o$2bo2bo5b2o$2bo2bobo2bob2o$2bo2bobob3o2bo$2bo2bo8bo$2bo2b obob3o2bo$2bo2bobo2bob2o$2bo2bo5b2o$2bo2bobo2b2o$2bo2bobob2o$2bo2bo$5b obob2o$5bobo2b2o$4b2o5b2o$2bo2bo5b3o$4bo5b3o$bo2bo5bo$bobo8bo$10bobo$ 2b3o8bo$3b2o5bobo$2b3o7bo$10bo$bobo6b3o$3bo5b2o2bo$o3bo4bob3o$ob4o8bo$ 6bo6b3o$4bo2bo3bo2b3o$4bo2bo7bo$2bo4bo3b4o$3b4o7bo$5bo5b2o$3b2o4b4o$o 2bo5bo$obo! #C The eventual failure occurs when a particular defect appears #C behind the line puffer. The following snapshot is taken #C approximately 3440 generations before the puffer engine implodes: x = 48, y = 99, rule = B3/S23 32bo$32b4o4bobo$34b2o4bo2bo$37bo5b2o$34b4o7bo$38bo4b4o$34bo2b3o2bo4bo$ 36b3o5bo2bo$37bo6bo2bo$32bob3o9bo$32b2o2bo3bob4o$33b3o4bo3bo$33bo9bo$ 35bo5bobo$33bobo$36bo5b3o$33bobo7b2o$35bo6b3o$33bo$33b3o5bobo$34b3o4bo 2bo$34bobo7bo$35b2o7bo$36bo2b2o2bo$35b2o2b4o$35b2o$35b2o2b4o$36bo2b2o 2bo$34b3o7bo$36bo2b2o3bo$35b2o2b5obo$35b2o7b3o$34bobo2b5obo$35b2o2b2o 3bo$6b2o28bo7bo$6b2o4b2o21b2o2b2o2bo$12b2o7b4o2bobo5b2o2b4o$21b5o3b2o 2b4o$19b2ob2ob2obo2bob4o2b4o$7b2o10b2o9b2ob4o2b2o2bo$7bobo9b2ob2o6b2ob 4o7bo$8bo10bo2bo7b2ob4o2b2o3bo$19bo10b2ob4o2b5obo$18b2obo4b2o2b2ob4o7b 3o$9b3o7b2o6bo2b2ob4o2b5obo$3b2o3bo3bo13bo3b2ob4o2b2o3bo$3bobobo13b2o 3bo3b2ob4o7bo$4b5o2b2o8b3o2b3ob2ob4o2b2o2bo$4bobobobo12bo2b3ob2ob4o2b 4o$3b2ob2ob3o5b2o7b3ob2ob4o$2b3obob2o6b3obo3bob3ob2ob4o2b4o$bobobo14bo 5b3ob2ob4o2b2o2bo$2b5o5b2o4b2o3b2ob3ob2ob4o7bo$o4bo5bo3bo10b3ob2ob4o2b 2o3bo$obo3bo4bo3bo10b3ob2ob4o2b5obo$b2o8bobobo5b2o3b3ob2ob4o7b3o$20bob 2o6b2ob4o2b5obo$19b2obo3bo3b2ob4o2b2o3bo$25b2o3b2ob4o7bo$19bo5b2o3b2ob 4o2b2o2bo$15bo5bo4bo3b2ob4o2b4o$14bo2b6o7b2ob4o$15bo6bo4b2ob2ob4o2b4o$ 2b2o11b4ob3o5b3o2b4o2b2o2bo$2b2o12bo12bo2b5o7bo$17bo2b3o2bo6b5o2b2o3bo $17bo2bobo2b3o4b5o2b5obo$26b3o3b5o7b3o$27bobo2b5o2b5obo$28b2o2b5o2b2o 3bo$29bo2b5o7bo$26b2o4b5o2b2o2bo$26b3obob5o2b4o$6b2o19b3o5b2o$5bo2bo 26b2o2b4o$6b2o28bo2b2o2bo$35b2o7bo$34bobo7bo$34b3o4bo2bo$33b3o5bobo$ 33bo$35bo6b3o$33bobo7b2o$36bo5b3o$33bobo$35bo5bobo$33bo9bo$33b3o4bo3bo $32b2o2bo3bob4o$32bob3o9bo$37bo6bo2bo$36b3o5bo2bo$34bo2b3o2bo4bo$38bo 4b4o$34b4o7bo$37bo5b2o$34b2o4bo2bo$32b4o4bobo$32bo! golly-2.5-src/Patterns/Life/Puffers/p100-H-track-puffer.rle0000644000175100001440000002413512156145314020251 00000000000000#C p100 puffer laying down Herschel tracks -- pairs of Fx77 conduits. #C A single Herschel follows the track, producing gliders. #C Paul Callahan, 14 November 1996; glider recipe by Dean Hickerson. #C [See also p100-H-channel-breeder.rle, in the Breeders folder; this #C puffer could easily be made into a breeder by adding a Herschel #C factory of any desired period to the end of the Herschel track.] x = 1330, y = 247, rule = B3/S23 735b5o$734bo4bo$739bo$734bo3bo$736bo9$69b5o$68bo4bo$73bo$68bo3bo$70bo 2$788b3o$787b5o$787b3ob2o$719bo70b2o$720bo$716bo4bo$719b3o$716b2o4bo 44bo63b2o$718bo3bo43b3o58b4ob2o6b2o$65bo652bo47bo2bo57b6o5b2ob2o$66bo 652b3o46b2o58b4o6b4o$64b3o702b5o15b2o36bo11b2o$771bobo15b2o8b3o25bo$ 122b3o645bo37bo$66bo54b5o642bobo36bobo7bo9b2o7b3o$65bobo53b3ob2o638bob obob2o5b2o27bobo10b2o2b2ob2o5bo3b2o$64b2ob2o55b2o639bo3bob2o5b5o11b2o 12bo7b2o2b3o2bob5o2bobo2b2o$64b2ob2o696b2obo11b2obo10b2o20b2o8bo2b3obo 5bo$63bo3bo711bo2b4o29b2o4bo8bo3bo2b2o$63bo2b3o710bo2b2ob2o30bo3bo12bo $64b2o3bo95b2o650bob3o14bo$65b4o92b4ob2o6b2o603bo2b2o34bob2o$67b2o49bo 26b3obo11b6o5b2ob2o601bo3b2o34b3o19b2o$112b2o4bo25b6o12b4o6b4o603bo2b 2o35bo18b2ob2o$59bobobo19b2o26bo2bo3bo14b2o8bob2ob2o11bo11b2o605b2o3b 2o51b4o$58bo3bobo18b2o25b2ob2o9bo8b2o9bo16bo622bo2bo51b2o$57bo3b2o2bo 45bobo9bo661b2o$58bobo2bobo46bo10bobo19bobobob2obo6b2o7b3o$66bo57bo18b 4o2bo4b2o2b2ob2o5bo3b2o691b2o$63bo2bo11b3ob3o3b2o35b3o10b2o3b3obo7bo3b ob5o2bobo2b2o556bo88b2o40b3ob2o$63bobo11b4obo2bo2b2o36bobo9b2o13b3o4bo 2b3obo5bo555bobo63b5o18b2ob2o39b5o66b2o$64bo11bobo39bobo5bobo26bo8bo3b o2b2o557b2o62bo4bo18b4o35b2o4b3o35b2o26b4ob2o6b2o$85bo30b3o31bo3bo13bo 630bo19b2o33b3ob2o40bo2bo25b6o5b2ob2o$78b3o36b2o2b2o3b3o22bo2bo15bo 434b5o184bo3bo55b5o35b2o5b2o27b4o6b4o$79b2o2b2o32b2o7b2ob2o473bo4bo20b 2o164bo58b3o13b2o17bo3b2o33bo11b2o$122bo3b2o46b2o433bo19bo2bo39b6o193b 2o8b3o6bo7bo16b2o3bo8bo$118bob2o4b2o44b2ob2o420b5o2bo3bo21bobo38bo5bo 5b4o201bo9bo17bo4b2o$70bo49b2o6bo43b4o420bo4bo4bo24bo45bo4bo3bo174b2o 25b3o30bobo5b2o7b3o$68bobo54bo2bo44b2o426bo8bo55bo4bo4bo9bo174b2o24bo 2bo9bo11b3ob2obo2b3ob2ob2o5bo3b2o$69b2o55bobo254b5o208bo3bo8bobo19bo 17b2o14b3o5b2o7bo2bo140b2o48b2o9b2o9b2o12bo2bo4bo6bob5o2bobo2b2o$382bo 4bo210bo10bobo5b2o10b2obo16b2o13b2o2b2o156b2o48b2o22bo11b5o5b2o4bo2b3o bo5bo$387bo62b6o172bob2o6b2o19b2o3b5o2bo8b2o215bo19b2o3b2o8bo3bo2b2o 282b3o$154b2o219b5o2bo3bo36b2o24bo5bo5b4o151b2o12bo7b2o20b3o3bo5bo6b5o 213bo22bo2bo12bo285b5o$129b5o18b2ob2o217bo4bo4bo37bo2bo16bo12bo4bo3bo 164bo32b2obo5bo7bo4bo153bobo57b2obo18b3o15bo283b3ob2o62b4o$128bo4bo18b 4o223bo36b2o5b2o16bo7bo4bo9bo139b2o22b2o3bo9b2o9b2o6bobo14b3o2bo130b2o 21b2o61b2o312b3o7b2o62b6o6b2o$133bo19b2o219bo3bo14b2o9bo7bo3b2o23bo9b 2o7bo2bo140b2o22b2o3bo3b3o3b2o9b2o7b2o2b2obo9bo2b2o127b3ob2o21bo102b2o 123b5o142b5o35b2o33b4ob2o4b4o$128bo3bo243bo16b2o9bo6bobo6bo19b3o186bo 7b3o29bobo9b2o129b5o123b2ob2o121bo4bo18b2o122b3ob2o22b2o9bo2bo36b2o5b 2ob2o$130bo273bo5bobo6bobo15b7o7bo178bo6bo5bo169b3o124b4o127bo17bo2bo 41b6o77b2o5bo14b2o13b2o46b2o$383b2o35b2o14bo2bo3b3o4b2o8b2o170bo5b2o2b obo296b2o116b5o2bo3bo21b2o39bo5bo5b4o75b2o12b2o2b3o9bo19b2o$383b2o24bo bo2bo20bo3bo9bo9bo2bo92b5o70b2o2b2o2b2o2bo415bo4bo4bo23b2o31b2o12bo4bo 3bo75b2o8b3o2bo3b2o8b2o19b2o9bo$348b2o48b2o9b2o2bo8b3o10b2ob2ob2o3bo3b 5o4bo2bo91bo4bo69b2obob2o47b4o376bo27b3o30b2o7bo4bo9bo64b2o25bo2b2o7bo bo30bo2bo$348b2o48b2o14bo6b4o10b2o4b2o8b4o3b2ob2o96bo69b4obo8bo2bo35bo 3bo371bo3bo28b3o15b2o12bobob3o5b2o7bo2bo94bo11bo8bobo19bo6b2o$420b2o2b 2o11bo3b2ob2o8bo4b2o93bo3bo68bobo2b2o9b2obo39bo198b2o35b2o136bo27b6o 15b2o9b8o2bo131bo2bo26bo7b2o$361bo59bob2o18bo112bo70bobo15bo36bo2bo 195b4ob2o32b2ob2o164bo2bo5b2o19bobo3b4obo12bo35b2o48b2o8b2o14b2o4bo4bo 4b2ob3o2b2o4bo6bo2bo5b2o$361bobo58b3o281bo174b6o33b4o166b2o5bobo21bobo b2ob3o7bo3bo2bo33b2o48b2o8b2o12b4o3bo5b2o2b3ob3o2b2o4bobo5b3o4b2o$333b 5o23b2o60bo135bo144bobo175b4o35b2o173b3o22b3ob2o10b2o7bo106bo3bo3bo2bo bobo3bo2bo10bo8b2o3bo$332bo4bo123b4o94bobo143b2o357b2o31b2o4b2o9b2o5b 6o2bo8b2o6bo105b2ob2o6b2o3bo4bobo$337bo122bo3bo94b2o63b6o33b4o397b2o 24bo5b2o3b2ob2o8b2o12bobo8b2o4b2o26b3o76b2o2bo6bo3b2o3b3o$332bo3bo127b o158bo5bo32bo3bo429bo4b2ob2o22bobo13bo27b5o90bo5bo27b2o$334bo125bo2bo 165bo36bo8bo424b2o2b2o23bo11b2o29b3ob2o122b4o$623bo4bo33bo2bo7bo3bo 418b2ob4obo70b2o12bo63bobo44b2ob2o$625b2o51bo338b5o71bo3b3o2bobo82b2o 64b2o47b2o$45bo627bo4bo337bo4bo68bo7bo5bo40b4o39b2o$43bobo356b6o33b4o 229b5o342bo72bo8b3o38bo3bo$44b2o355bo5bo32bo3bo571bo3bo72b2o8bo44bo$ 407bo36bo573bo84b3o38bo2bo94b4o35b2o$401bo4bo33bo2bo660b2o135b6o33b4o$ 403b2o836b4ob2o32b2ob2o$763bobo252bo226b2o35b2o$763b2o253bobo65b6o33b 4o$764bo253b2o65bo5bo32bo3bo$1091bo36bo$1085bo4bo33bo2bo$1087b2o5$286b o$286bobo392bo$286b2o196bo194bobo$484bobo193b2o$484b2o3$1114bo$1112b2o $20bo1092b2o$18bobo$19b2o22bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo 49bo49bo$41b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o 47b3o$40bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo$40b2o48b2o 48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o$688bobo252bo$ 688b2o253bobo$689bo253b2o$o49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49b o49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo$3o47b3o47b3o47b3o47b3o47b3o 47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o 47b3o47b3o$3bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo 49bo49bo49bo49bo49bo49bo49bo$2b2o11b2o35b2o11b2o35b2o11b2o35b2o11b2o 35b2o11b2o35b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o 48b2o48b2o48b2o48b2o48b2o$15b2o48b2o48b2o48b2o48b2o$684b2o$684bobo$ 684bo2$409bo$bo407bobo$bobo405b2o$b3o$3bo23b2o48b2o48b2o48b2o48b2o48b 2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o48b2o$28bo49b o49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo49bo236b 2o$25b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o 47b3o47b3o47b3o47b3o47b3o237bobo$25bo49bo49bo49bo49bo49bo49bo49bo49bo 49bo49bo49bo49bo49bo49bo49bo49bo49bo239bo$414bo$413b2o$413bobo$15b2o 48b2o48b2o48b2o48b2o48b2o48b2o48b2o$15bo49bo49bo49bo49bo49bo49bo49bo$ 16b3o47b3o47b3o47b3o47b3o47b3o47b3o47b3o$18bo49bo49bo49bo49bo25b2o22bo 49bo49bo$243bobo$245bo3$941b2o$940b2o$759b2o181bo$405b2o352bobo$61b2o 341bobo352bo$61bobo342bo$61bo5$1190b2o76b2o$1190bobo73bo4bo33bo2bo$ 1190bo81bo36bo$489bo776bo5bo32bo3bo$488b2o777b6o33b4o$488bobo573b2o35b 2o$178b2o880b4ob2o32b2ob2o$176bo4bo33bo2bo841b6o33b4o$182bo36bo841b4o 35b2o97bo77b2o46bo2bo$176bo5bo32bo3bo49b2o926bo3bo69bo5b4o48bo$177b6o 33b4o48bobo678b5o248bo67bobo3bob4o43bo3bo$270bo677bo4bo243bo4bo68bob2o b2o3b2o43b4o$900b2o51bo167b2o75b5o68bobob3o$898bo4bo33bo2bo7bo3bo41b2o 123b2ob2o143bob2o2b4o$109bo125bo2bo665bo36bo8bo40b3ob2o19b2o61bo39b4o 145b2ob2o34b2o6b2o$107bo3bo127bo658bo5bo32bo3bo49b5o19b2o60b2obo17b3o 19b2o146b2ob2o3b4o26bo3bo4b2o$112bo122bo3bo594b2o63b6o33b4o50b3o22bo 59b2obo16bo2bo138b2o29bo5b3o10b2o14b2o3bo14b3o$107bo4bo123b4o190b2o 402bobo242bo12b3o2bo3bo8bo3bo124b2o34b3o11b2o16bo6bo12bo$108b5o23b2o 60bo230bobo175b4o35b2o186bo241bo13bo4b2o2bo2bo7b2o5b3o154bo28b2o7b2obo 4b2o3bobo$136bobo58b3o231bo174b6o33b4o355b2o48b2o20b3o11bo5bob2ob3ob2o 9bob3o153b2o27bo4bo4bobo9b2o$136bo59bob2o18bo387b4ob2o32b2ob2o181bo70b obo15bo36bo2bo43b2o48b2o9b2o11bo10bo5bo6bobo6bo8b2o173bo8bo7bob2o$195b 2o2b2o11bo3b2ob2o8bo4b2o374b2o35b2o180bo3bo68bobo2b2o9b2obo39bo77b2o 23bo12b2o11b2o10bobo2bo3b8obo120bo42b2o9bo$123b2o48b2o14bo6b4o10b2o4b 2o8b4o3b2ob2o596bo69b4obo8bo2bo35bo3bo77b2o24b2ob2o20b2o3bobo4b2ob2ob 2o6b4o119bo3bo21bo2bo15b2o9bo20b2o7bo2bo$123b2o48b2o9b2o2bo8b3o10b2ob 2ob2o3bo3b5o4bo2bo591bo4bo69b2obob2o47b4o103b2obo31bo5bobo8bo126bo19bo 49bo4bo9bo$158b2o24bobo2bo20bo3bo9bo9bo2bo592b5o70b2o2b2o2b2o2bo131b2o 8b3o5bo25b2o3b3o6bobo129bo4bo4bo13bo5bo50bo4bo3bo$158b2o35b2o14bo2bo3b 3o4b2o8b2o429b2o239bo5b2o2bobo129b2o21b2o166b5o2bo3bo11bo3b3o44bo5bo5b 4o$179bo5bobo6bobo15b7o7bo128bo182b3o124b4o236bo6bo5bo117b2o34b2o5b2o 40b2o129bo9b2ob4o46b6o$151bo16b2o9bo6bobo6bo19b3o135bo3bo179b5o123b2ob 2o234bo7b3o29bobo9b2o75b3ob2o39bo2bo30b2o5b2ob2o123bo4bo10bo2b2o$149bo 3bo14b2o9bo7bo3b2o23bo9b2o7bo2bo119bo19b2o157b3ob2o21bo102b2o210b2o22b 2o3bo3b3o3b2o9b2o7b2o2b2obo9bo2b2o73b5o41b2o27b4ob2o4b4o125b5o11bob2o$ 154bo36b2o5b2o16bo7bo4bo9bo113bo4bo18b4o159b2o21b2o61b2o251b2o22b2o3bo 9b2o9b2o6bobo14b3o2bo74b3o7b2o62b6o6b2o143bo$149bo4bo4bo37bo2bo16bo12b o4bo3bo114b5o18b2ob2o181bobo57b2obo18b3o15bo240bo32b2obo5bo7bo4bo81b3o b2o62b4o$150b5o2bo3bo36b2o24bo5bo5b4o139b2o241bo22bo2bo12bo229b2o12bo 7b2o20b3o3bo5bo6b5o82b5o$162bo62b6o391bo19b2o3b2o8bo3bo2b2o237bob2o6b 2o19b2o3b5o2bo8b2o85b3o$157bo4bo388b2o48b2o22bo11b5o5b2o4bo2b3obo5bo 206bo10bobo5b2o10b2obo16b2o13b2o2b2o$158b5o131b2o55bobo197b2o48b2o9b2o 9b2o12bo2bo4bo6bob5o2bobo2b2o203bo3bo8bobo19bo17b2o14b3o5b2o7bo2bo$ 293bobo54bo2bo44b2o186b2o24bo2bo9bo11b3ob2obo2b3ob2ob2o5bo3b2o209bo8bo 55bo4bo4bo9bo$295bo49b2o6bo43b4o185b2o25b3o30bobo5b2o7b3o205bo4bo4bo 24bo45bo4bo3bo$343bob2o4b2o44b2ob2o211bo9bo17bo4b2o224b5o2bo3bo21bobo 38bo5bo5b4o$347bo3b2o46b2o195b2o8b3o6bo7bo16b2o3bo8bo229bo19bo2bo39b6o $304b2o2b2o32b2o7b2ob2o165bo58b3o13b2o17bo3b2o33bo11b2o211bo4bo20b2o$ 303b3o36b2o2b2o3b3o22bo2bo15bo123bo3bo55b5o35b2o5b2o27b4o6b4o211b5o$ 310bo30b3o31bo3bo13bo130bo19b2o33b3ob2o40bo2bo25b6o5b2ob2o$289bo11bobo 39bobo5bobo26bo8bo3bo2b2o57b2o62bo4bo18b4o35b2o4b3o35b2o26b4ob2o6b2o$ 288bobo11b4obo2bo2b2o36bobo9b2o13b3o4bo2b3obo5bo55bobo63b5o18b2ob2o39b 5o66b2o$288bo2bo11b3ob3o3b2o35b3o10b2o3b3obo7bo3bob5o2bobo2b2o56bo88b 2o40b3ob2o$291bo57bo18b4o2bo4b2o2b2ob2o5bo3b2o191b2o$283bobo2bobo46bo 10bobo19bobobob2obo6b2o7b3o$282bo3b2o2bo45bobo9bo161b2o$283bo3bobo18b 2o25b2ob2o9bo8b2o9bo16bo122bo2bo51b2o$284bobobo19b2o26bo2bo3bo14b2o8bo b2ob2o11bo11b2o105b2o3b2o51b4o$337b2o4bo25b6o12b4o6b4o103bo2b2o35bo18b 2ob2o$292b2o49bo26b3obo11b6o5b2ob2o101bo3b2o34b3o19b2o$290b4o92b4ob2o 6b2o103bo2b2o34bob2o$289b2o3bo95b2o150bob3o14bo$288bo2b3o210bo2b2ob2o 30bo3bo12bo$288bo3bo211bo2b4o29b2o4bo8bo3bo2b2o$289b2ob2o196b2obo11b2o bo10b2o20b2o8bo2b3obo5bo$289b2ob2o55b2o139bo3bob2o5b5o11b2o12bo7b2o2b 3o2bob5o2bobo2b2o$290bobo53b3ob2o138bobobob2o5b2o27bobo10b2o2b2ob2o5bo 3b2o$291bo54b5o142bobo36bobo7bo9b2o7b3o$347b3o145bo37bo$496bobo15b2o8b 3o25bo$289b3o202b5o15b2o36bo11b2o$291bo152b3o46b2o58b4o6b4o$290bo152bo 47bo2bo57b6o5b2ob2o$443bo3bo43b3o58b4ob2o6b2o$441b2o4bo44bo63b2o$444b 3o$441bo4bo$445bo$444bo70b2o$512b3ob2o$512b5o$513b3o2$295bo$293bo3bo$ 298bo$293bo4bo$294b5o9$461bo$459bo3bo$464bo$459bo4bo$460b5o!golly-2.5-src/Patterns/Life/Puffers/pi-fuse-puffer.rle0000644000175100001440000000247112156145314017651 00000000000000#C Pi fuse burning puffer #C A line puffer with puff suppressors correctly aligned to produce #C just two rows of blocks with exactly the right period to be eaten #C by a pi-heptomino repeatedly. But the pi-heptomino can never catch #C up. This is an example of a spaceship that grows while traveling. #C By Dean Hickerson and Al Hensel, May 1994. #C From Alan Hensel's "lifebc" pattern collection. x = 21, y = 87, rule = B3/S23 4bobo$4bobbo5bo$7boo4b4o$9bo5boo$7b4o7bo$6bo4bo3b4o$8bobbo7bo$8bobbo3b obb3o$10bo6b3o$4bob4o8bo$4bo3bo4bob3o$7bo5boobbo$5bobo6b3o$14bo$6b3o7b o$7boo5bobo$6b3o8bo$14bobo$5bobo8bo$5bobbo5bo$8bo5b3o$6bobbo5b3o$8boo 5boo$9bobobboo$9boboboo$9bo$6bobboboboo$8boobobboo$6bobbo5boo$9bobobbo boo$6bobbobob3obbo$oo4bobbo8bo$oo4bobbobob3obbo$6bobbobobboboo$9bo5boo $6bobbobobboo$8booboboo$6bobbo$9boboboo$6bobbobobboo$6bobbo5boo$9bobo bboboo$3o3bobbobob3obbo$bbo5boo8bo$3o3bobbobob3obbo$9bobobboboo$6bobbo 5boo$6bobbobobboo$9boboboo$6bobbo$8booboboo$6bobbobobboo$9bo5boo$6bobb obobboboo$oo4bobbobob3obbo$oo4bobbo8bo$6bobbobob3obbo$9bobobboboo$6bo bbo5boo$8boobobboo$6bobboboboo$9bo$9boboboo$9bobobboo$8boo5boo$6bobbo 5b3o$8bo5b3o$5bobbo5bo$5bobo8bo$14bobo$6b3o8bo$7boo5bobo$6b3o7bo$14bo$ 5bobo6b3o$7bo5boobbo$4bo3bo4bob3o$4bob4o8bo$10bo6b3o$8bobbo3bobb3o$8bo bbo7bo$6bo4bo3b4o$7b4o7bo$9bo5boo$7boo4b4o$4bobbo5bo$4bobo! golly-2.5-src/Patterns/Life/Puffers/puffer-2c5.rle0000644000175100001440000000177012156145314016673 00000000000000#C 2c/5 dirty puffer #C Period 10150 (glide-reflective) #C Jason Summers, 26 Feb 1999 x = 112, y = 75, rule = B3/S23 15bo13bo52bo13bo$14bobo11bobo50bobo11bobo$13booboo9booboo48booboo9boob oo$13boo3bo7bo3boo48boo3bo7bo3boo$14bob4o5b4obo50bob4o5b4obo$14boo3bo 5bo3boo50boo3bo5bo3boo$18b3o3b3o58b3o3b3o$15boobbo5bobboo52boobbo5bobb oo$15b4obb3obb4o52b4obb3obb4o$15bobo3b3o3bobo52bobo3b3o3bobo$13b3obbo 7bobb3o48b3obbo7bobb3o$18bobbobobbo58bobbobobbo$20bo3bo62bo3bo$13boo 15boo48boo15boo$18boobbobboo58boobbobboo$21b3o64b3o6$87bo$86b3o$86bob oo$87b3o$87boo4$4bo5bo90bo5bo$3b3o3b3o88b3o3b3o$bbobbo3bobbo86bobbo3bo bbo$b3o7b3o84b3o7b3o$bbobo5bobo86bobo5bobo$4boo3boo90boo3boo$o4bo3bo4b o82bo4bo3bo4bo$5bo3bo92bo3bo$oo3bo3bo3boo82boo3bo3bo3boo$bbobbo3bobbo 86bobbo3bobbo$4bo5bo90bo5bo25$43bo5bo12bo5bo$42bobo3bobo10bobo3bobo$ 41booboobooboo8booboobooboo$41bobbo3bobbo8bobbo3bobbo$39booboo5booboo 4booboo5booboo$40boo9boo6boo9boo$41boo7boo8boo7boo$42bo7bo10bo7bo$39b oo11boo4boo11boo$40b3o7b3o6b3o7b3o$43bobobobo12bobobobo! golly-2.5-src/Patterns/Life/Puffers/puffer-train.rle0000644000175100001440000000074012156145314017413 00000000000000#C Puffer train #C This was created simply by perturbing the sides of a B-heptomino #C with two LWSS's. A B-heptomino is a naturally occurring object, #C a precursor to the Herschel pattern, which lurches forward at the #C speed c/2 before its own debris usually destroys it. #C -- Not in this case! The LWSS escorts keep the B-heptomino alive. #C From Alan Hensel's "lifebc" pattern collection. x = 5, y = 18, rule = B3/S23 3bo$4bo$o3bo$b4o4$o$boo$bbo$bbo$bo3$3bo$4bo$o3bo$b4o! golly-2.5-src/Patterns/Life/Puffers/zigzag-wickstretcher.rle0000644000175100001440000006625512156145314021200 00000000000000#C zigzag c/2 orthogonal wickstretcher: Jason Summers, 14 Feb 2006 x = 331, y = 1070, rule = B3/S23 44bo13bo$43b3o11b3o$42boobo5bo4boobo$42b3o5b3o3b3o$43boo5boboo3boo$73b o13bo$72b3o11b3o$72boboo4bo5boboo$53bo19b3o3b3o5b3o$51boo4b3o13boo3boo bo5boo$57bobbo$54bobbo$49bo7bo$48bo3boo4bobo17bo$48bo29b3o5b3o$49bo29b o5bobbo$59b3o3b3o11bobbo5bo$42bo9bo5bobbo3bobbo11b3o5bo$41b3o6b3o8bo3b o19bobo$41boboo5bo10bo3bo$42b3o5bobo5bobo5bobo45b3o11b3o$42boo7boo61bo bbo10bobbo$62b3o6bo16bo5bo19bo6b3o4bo$62b3o5b3o14b3o3b3o18bo5bobbo4bo$ 62bobo4boobo13boobo3boboo18bobobbo3bo4bobo$63bo5b3o14b3o5b3o22boobobo$ 63bo6boo15boo5boo23booboo$49bo70b3o$49boo23bobo14bo23bo$48bobo10bo3bo 8boo14b3o21b3o$61booboo10b3o35boboo$62bobo25bobo22b3o$54bo36bo23boo$ 54boo7bo$53bobo7bo$63bo16boo42boo$81boo5b3ob3o29boo$59bo16bo3bo9bobo 14b3o3b3o14b3o$59boo14b3o29bobbobobbo5b3o5bobbo$58bobo14boboo28bo7bo4b o3bo7bo$76b3o6boo3b3o14bo7bo4bo4bo6bo$56bo19b3o7boo20bobobobo10bo3bobo $55b3o6bo11b3o6bo34bo4bo$55boboo5boo10boo33bo12bo$56b3o4bobo44b3o8bobo $56b3o51b3o$56boo146bo13bo$203b3o11b3o$122boo78boobo5bo4boobo$109bo3bo 8bobo77b3o5b3o3b3o$109bo3bo8bo80boo4bobboo3boo$108bobobobo94b3o$110b3o 12b3o$94bo15b3o4boo6bobbo$87bo9bo13bo5b3o5bo$87bo5bo14bo5b4obo5bo3bo 73b3o$98bo8bobo3bobo9bo3bo44b3o11b3o12bobbo$79bo13bo12booboo4bo9bo48bo bbo10bobbo11bo$79boo12bo3bo8boob5obo10bobo45bo6b3o4bo14bo$78bobo13b3o 12bob3oboo15bo13bo27bo5bobbo4bo15bobo$109boo3b3o14b3o11b3o27bobobbo3bo 4bobo21boo$108boo5boo14boboo4bo5boboo32b4o28boo$108boo5boo15b3o3b3o5b 3o34bo11b3o3b3o$109boo4boo15boo3boobbo4boo47bobbobobbo16bo$115bo21bo3b o33bo19bo7bo7bo7b3o$114bo22bobo3bo30b3o18bo7bo5booboo5boboo$174boboo4b 3o11bobobobo6booboo6b3o$138booboo32b3o4boo25booboo6boo$140bo4b3o27boo 5boo15bo10boo$144bobbo31booboo14b3o$147bo32bobo15b3o$147bo33bo$94bo49b obo$94boo71b3o3b3o14b3o$93bobo71bobbobobbo13bobbo4bo3bo10boo$136boo29b o7bo16bo4bo3bo9boo$130bo5boo9bo5bo13bo7bo16bo3bobobobo10bo$103boo24b3o 5b3o6b3o3b3o13bobobobo14bobo6b3o$104bo23boobo6b3o4boobo3boboo42b3o$ 104bo23b3o6b3obo3b3o5b3o15bo27bo7boo$105boo22boo5boo8boo5boo15b3o33boo $103boboo28b3o32b3o12boo21bo$104boo30boo12bo34bobo$137bo11b3o33bo$148b o3bo49boo$169bo3bo27boo$169bo3bo6boo21bo$109bo38booboo15bobobobo5bobo 23bo$109boo27boo10bo19b3o7bo4b3o17b3o$108bobo28boo29b3o12bobbo16boboo$ 138bo32bo13bo20b3o$135bo12bo3bo21boo9bo3bo16b3o$118boo14b3o10bobobobo 19bobbo8bo3bo16boo$117bobo14boboo5boo3b5o21boo9bo$119bo15b3o6boobboob oo33bobo3boo$135b3o5bo5bobo39boo$135b3o11b3o41bo$135boo$$146b3o$148bo$ 145bo3bobbo$124bo20bo3bo3boo$124boo23bobboo12bo$123bobo21bo18bobo3bo$ 149bo16boo5boo$149bo$133boo$132bobo$134bo42boo$176boo$178bo6$139bo$ 139boo$138bobo$223bo13bo$222b3o11b3o$148boo71boobo5bo4boobo$147bobo71b 3o5b3o3b3o$149bo12boo58boo4bobboo3boo$161boo65bo3bo$163bo65boobo$231b oo$$222b3o$222bobbo5bo$222bo7bobo$222bo6bo$223bobo6bo$227boo$227booboo $166b3o60bo82b3o11b3o$166bobbo46bo5bo16bo72bobbo10bobbo$166bo48b3o3b3o 14b3o71bo6b3o4bo$166bo3bo43boobo3boboo13boboo70bo5bobbo4bo$166bo47b3o 5b3o14b3o71bobobbo3bo4bobo$156boo9bobo45boo5boo15boo78b4o$156bo15b3o 11b3o132bo$157bo13bobbo10bobbo30bo$158bo15bo4b3o6bo29b3o92bo$159bo14bo 4bobbo5bo123b3o$158boo11bobo4bo3bobbobo30bobo12boo46b3o11b3o14boboo4b 3o$178boboboo35bo12boo46bobbo10bobbo15b3o4boo$128b3o11b3o34booboo50bo 48bo4b3o6bo15boo5boo$128bobbo10bobbo34b3o100bo4bobbo5bo19booboo$128bo 6b3o4bo30bo106bobo4bo6bobo21bobo$128bo5bobbo4bo29b3o41b3ob3o5boo62bo 12bo5bo7bo$129bobobbo3bo4bobo25boobo6bo36bobo6boo5bo51bo4bo12b3o3b3o$ 135b4o32b3o6boo47bo3b3o50bo17bobooboobo15b3o$137bo34boo7bo50boobo46bo 5bo16b3ob3o15bobbo$178bo39b3o11b3o46b3o3b3o15boo3boo18bo$143bo32b4obo 40boo8b3o45boobo3b3o40bo$142b3o32bobbo40bobbo7b3o45b3o4boo19bo18bobo$ 142boboo32b3o41boo9boo46boo5b5o14bobo$143b3o19b3o3b3o14b3o99b3o13bo3bo $143boo19bobbo3bobbo13bobbo50bo13bo50bobo$167bo3bo16bo52b3o11b3o29bo 19b3o13boo$133boo32bo3bo16bo52boboo4bo5boboo28bo35bobo$133boo29bobo5bo bo14bobo50b3o3b3o5b3o15b3o3b3o6bo7b3o23bo$242boo3boobbo4boo15bobbo3bo bbo5boo6bobbo$126b3o14b3o3b3o16b3o76bo3bo24bo3bo7boo7bo8booboo$125bobb o6b3o4bobbo3bobbo15b3o76boboo25bo3bo7bo8bo8booboo7boo$128bo5bo3bo6bo3b o18bobo76boo24bobo5bobo14bobo5booboo7bobo$128bo4bo5bo5bo3bo19bo12b3o 30bo92bo9bo$125bobo6bo7bobo5bobo16bo12bo30boo6bo33b3o19b3o$135b4o44bo 30boo5bo26bo5bobbo19b3o27b3o$146b3o7boo89bobo7bo18bobobo32boo$146b3o7b o10bo3bo78bo6bo55bobo$146bobo8bo9booboo5b3o67bo6bobo33b3o20bo$147bo10b o9bobo6bo5b3o65boo37bo$147bo11bo18bo3bobbo62booboo22boo3boo9bo$134b3o 21boo9bo15bo64bo25booboo$136bo32bo11bo3bo54bo16bo5bo12booboo33b3o$135b o9bo3bo19b5o7bo3bo53b3o14b3o3b3o13bo6b3o4b3o18bobbo$145booboo21bobbo 10bo33bo13bo4boobo13boobo3boboo19bo5bobbo21bo$131b3o12bobo23boo8bobo 33b3o11b3o3b3o14b3o5b3o20bo7bo17bo3bo$131bobbo4b3o75boobo5bo4boobo4boo 15boo5boo25bo3bo8boo11bo$131bo9bo5bo69b3o5b3o3b3o56bo3bo8bobo7bobo$ 131bo3bo4bo6bo70boo4bobboo3boo26bo33bo8bo$131bo3bo11bo76b3o32b3o16boob oo8bobo$131bo126bo3bo15bobboo$132bobo9boo99boo11bo3bo15bo$143bo4bo97b oo31bobo$142bo6bo68b3o24bo12bo3bo17bo$142boobo3bo68bobbo36bo3bo$146bo bbo14bo53bo39booboo$146bobo14bo54bo31boo7bobo$146boo15b3o53bobo23bo5b oo7bo$228boo14b3o3bo$228boo14boboo$210b3o3b3o26b3o$210bobbobobbo16bo9b 3o40boo$210bo7bo7bo7b3o8b3o40bobo$210bo7bo5booboo5boboo7boo3boo36bo$ 211bobobobo6booboo6b3o12b3o$224booboo6boo16boo7b3o$156boo56bo10boo26b 3o4bob3o$156bo56b3o37bobboboo4bo$157bo54booboo42bo3bo$158bo53booboo40b o$159bo5b3o11b3o31bobo$158boo4bobbo10bobbo32bo39bobbo$167bo4b3o6bo45b oo25bo3bo3bo$167bo4bobbo5bo44boo27b3obboo$164bobo4bo3bobbobo31booboo 11bo25booboo$170bobobboo34bo5bo37bobbo$174bo37bo3bo39boo15boo$170boboo 39b3o6boo49bobo$171b3o6bo19bo12bobo5boo50bo$171b3o5b3o16boo14bo8bo$ 172boo4boobo17boo13bo$171bobo4b3o$171bobbo4boo36boo$171bo44boo45boo$ 175bo42bo43boo$172bobboo5bo5bo32bo42bo$172bobboo4b3o3b3o30b3o$163b3o7b 3o5bobooboobo22boo6boboo$163bobbo6b3o6b3ob3o22boo8b3o$163bo18boo3boo 24bo7b3o$129b3o11b3o17bo57boo$129bobbo10bobbo17bobo18bo72boo$129bo6b3o 4bo40bobo71bobo$129bo5bobbo4bo12boo25bo3bo70bo$130bobobbo3bo4bobo9boo 26bobo$136b4o44b3o$138bo17boo12boo$156bo12bobo$144bo12bo13bo76boo$143b 3o12bo24booboo59boo$143boboo12bo23booboo61bo$144b3o11boo15boo6booboo$ 144boo28bobo8bo11boo$176bo19boo$134boo48b3o11bo$134boo$180boo61boo$ 127b3o14b3o3b3o26bobo61bobo$126bobbo6b3o4bobbo3bobbo27bo61bo$129bo5bo 3bo6bo3bo$129bo4bo5bo5bo3bo$126bobo6bo7bobo5bobo23b3o$136b4o37bobbobb oo$147b3o27bo5boo48boo$147b3o27bo3bo50boo$147bobo27bo56bo$148bo29bobo$ 148bo$135b3o$137bo$136bo9bo3bo$146booboo77boo$132b3o12bobo78bobo$132bo bbo4b3o13boo27bo42bo$132bo9bo5bo7boo25boo$132bo3bo4bo6bo35boo$132bo3bo 11bo7boo$132bo23bo$133bobo9boo10bo60boo$144bo4bo8bo58boo$143bo6bo8bo 59bo$143boobo3bo7boo$147bobbo32bo$147bobo33bobo$147boo34boo$$213boo$ 213bobo$213bo5$203boo$202boo$204bo6$198boo$198bobo$156boo40bo$156boo$$ 156boo$156bo$157bo30boo$158bo28boo48b3o11b3o$159bo29bo46bobbo10bobbo$ 158boo79bo4b3o6bo$239bo4bobbo5bo$236bobo5boboobbobo3$183boo$128b3o11b 3o38bobo52bo8bo$127bobbo10bobbo25bo12bo53b3o5bobo$130bo4b3o6bo23boo38b 3o11b3o11boobo$130bo4bobbo5bo24boo36bobbo10bobbo11b3o4bobbo$127bobo4bo 3bobbobo66bo4b3o6bo12boo4b3o$134b4o72bo4bobbo5bo19bo$135bo37boo32bobo 4bo3bobbobo$165bo6boo39bobobboo10bo5bo$143bo22bo7bo42bo11b3o3b3o$142b 3o19b3o13b3o11b3o16boboo11boobo3boboo14b3o$134b3o4boobo23bo10bobbo10bo bbo12bo4b3o11b3o5b3o14bobbo$135boo4b3o24bobo11bo4b3o6bo11b3o3b3o12boo 5boo15bo$135boo5boo24boo12bo4bobbo5bo10boobo42bo$135booboo39bobo4bo3bo bbobo11b3o23bo20bobo$136bobo29boo16b4o18boo22b3o$137bo7bo5bo16bobo16bo 43bo3bo15bo$144b3o3b3o3boo10bo82bo$126b3o15bobooboobo3boo23bo19bo5bo 40b3o$126bobbo15b3ob3o28b3o17b3o3b3o9boo11booboo12bo$126bo18boo3boo4b oo21boobo16boobo3boboo14b3o6bo$126bo29bo22b3o17b3o5b3o5bo3bo4bobbo$ 127bobo18bo8bo22boo18boo5boo15bo$147bobo8bo60bo4bo6bo3bo7b3o$146bo3bo 8bo30boo12bo15bo4bobobbobobobo6bo$147bobo8boo30boo11b3o11bobbo10b5o8bo $132boo14bo53bo3bo10bobbo10booboo$131bobo14bo24b3o3b3o14b3o19boo12bobo $133bo13bobo22bobbo3bobbo4b3o6bobbo32b3o3b3o$147bobo25bo3bo6bo3bo5bo5b ooboo31bo$148bo26bo3bo5bo5bo4bo7bo34bo$137boo33bobo5bobo7bo6bobo$136bo bo47b4o25b3o$138bo6boo3boo24b3o23bo3bo8bo17b3o$176b3o22bobobobo8bo16bo 5b3o$166boo8bobo23b5o27bo4bobbo$142boo23bo9bo24booboo32bo$141bobo4bo 17bo10bo25bobo4b3o26bo3bo$143bo4bo16bo22b3o12b3o4bo28bo$164bo23bo22bo 28bobo$164boo9bo3bo9bo$147boo26booboo$140b3o3bobo27bobo12b3o11b3o$140b obbo4bo34b3o4bobbo11bo$140bo36bo5bo9bo12bo3b3o$140bo3bo32bo6bo4bo3bo 16bobbo$140bo36bo11bo3bo16bo$141bobo12boo35bo16bo3bo$64b3o11b3o75boo 21boo9bobo17bo7b3o$63bobbo10bobbo95bo4bo29bobo4bo$66bo4b3o6bo75boo17bo 6bo36bo$66bo4bobbo5bo75bo18bo3boboo$63bobo4bo3bobbobo77bo17bobbo16b3o$ 69bobobboo82bo17bobo16bo$73bo85bo17boo17bo$69boboo85boo$70b3o6bo82boo$ 70b3o5b3o80bobo$71boo4boobo82bo$70bobo4b3o$70bobbo4boo$70bo23bo13bo$ 74bo18b3o11b3o$71bobboo5bo5bo5boboo4bo5boboo92b3o$71bobboo4b3o3b3o5b3o 3b3o5b3o92bo$62b3o7b3o5bobooboobo5boo3boobbo4boo56boo36bo$62bobbo6b3o 6b3ob3o11booboo63bo$62bo18boo3boo11bobb3o61bo13b3o$62bo37boboo61bo14bo $63bobo18bo17bo61bo16bo$83bobo12bo3bo4b3o54boo$82bo3bo15bo3bobbo12b3o 11b3o$83bobo16bo6bo12bobbo10bobbo$83b3o13boboo6bo12bo6b3o4bo$69boo27b oo6bobo13bo5bobbo4bo$68bobo52bobobboobo5bobo$70bo32boo$82booboo15bo6b 3o3b3o38boo$82booboo5bo7bo8bobbobobbo38boo30b3o$74boo6booboo4b3o6bo8bo 7bo10bo8bo50bo$73bobo8bo5boobo7bobo5bo7bo10bobo5b3o17boo31bo$75bo14b3o 9bo7bobobobo19boboo16bo$83b3o5boo36bobbo4b3o17bo$113bo16b3o4boo19bo$ 79boo31b3o16bo27bo$78bobo30booboo42boo$80bo31b3o51boo$112b3o51boo$98b oo12b3o5b3o14b3o3b3o$76b3o20boo11bobo4bobbo13bobbo3bobbo$76bobbobboo 14bo13bobo7bo16bo3bo$76bo5boo29bo8bo16bo3bo$76bo3bo38bobo14bobo5bobo 19boo$76bo26boo61boo5b3o$77bobo24boo18bo15b3o30bo5b3o11b3o$103bo20bo 15b3o23boo6bo3bobbo10bobbo$125b3o11bobobo23bo13bo4b3o6bo$127bo38bo14bo 4bobbo5bo$108boo55bo12bobo4bo3bobbobo$94boo13boo53bo20b4o$93bobo12bo 29boo3boo19boo20bo$95bo34b3o6booboo$132bo6booboo36bo$125b3o3bo9bo37b3o $125bobbo49boobo$125bo11boo39b3o$125bo3bo6bobbo39boo$125bo3bo7boo17boo $118boo5bo30boo31boo$119boo5bobo43bo5bo10boo$118bo37boo13b3o3b3o$139bo 16bo13boobo3boboo14b3o$140boo15bo12b3o5b3o5b3o6bobbo$158bo12boo5boo5bo 3bo5bo$109boo48bo24bo5bo4bo$108bobo47boo15bo13bo6bobo$110bo34bo28b3o8b 4o$137bobo6bo$106bo31boo4b3o27bobo$105b3o30boo35bo68bo13bo$104boobo 135b3o11b3o$104b3o136boboo4bo5boboo$104b3o59boo19b3o54b3o3b3o5b3o$105b oo26boo31boo4b3ob3o8bo56boo3boobbo4boo$134boo38bobo11bo60bo3bo$133bo 32boo81boboo$167bo81boo$166bo7b3o5b3o$165bo16bo60b3o$124boo38bo18bo58b obbo$123bobo38boo79bo$125bo119bo$177b3o62bobo$177bo36b3o11b3o$178bo35b obbo10bobbo21boo$181b3o30bo6b3o4bo6b3o3b3o9boo$181bobbo29bo5bobbo4bo5b obbo3bobbo15bo$156boo23bo33bobobbo3bo4bobo5bo3bo9bo7b3o$148boo6boo23bo 3bo33boobobo12bo3bo8b3o5boobo$149boo30bo37booboo10bobo5bobo4b5o4b3o$ 148bo7boo24bobo35b3o30boo4boo$156bo58bo22b3o8b5o$157bo9b3o16bo13bo13b 3o21b3o9b3o$158bo8bo17b3o11b3o12boboo19bobobo8boo$139boo18bo8bo15boobo 5bo4boobo13b3o$138bobo17boo24b3o5b3o3b3o14boo$140bo44boo4bobboo3boo$ 191booboo40boo3boo9bo$190b3obbo11bo5bo10boo11booboo9boo$191boobo11b3o 3b3o9boo11booboo9bobo$192bo13bobooboobo15b3o6bo$185b3o4bo3bo10b3ob3o7b 3o5bobbo$166boo17bobbo3bo14boo3boo6bo3bo7bo14bo$166boo17bo6bo27bo4bo6b o13boo$185bo6boobo14bo14bo3bobo14bobo$166boo18bobo6boo12bobo8bo4bo$ 167bo40bo3bo11bo$166bo23boo17bobo9bobo18bo$165bo26bo16b3o29boo$157boo 5bo14bo5bo8bo7bo38bobo$157boo5boo12b3o3b3o7bo6b3o42bo$158bo18boobo3bob oo3bobo7boboo17boo21b3o$177b3o5b3o4bo9b3o3booboo9bobo19boobo$178boo5b oo15boo4booboo9bo21b3o$208booboo31b3o$129bo13bo12boo24bo27bo34boo$128b 3o11b3o12bo23b3o33boo$128boboo4bo5boboo10bo23bo3bo24b3o5bobo$129b3o3b 3o5b3o10boo59bo$129boo3boobo5boo50boo$156boo22booboo9boo$156bo25bo13bo 15boo$157bo54bobo12bo$134bo23bo53bo13boo$134b3o5b3o14bo20bo3bo5boo5bo 28bobo$135bo5bobbo13boo19bobobobo3boo5b3o$135bobbo5bo35b5o6bo3boobo$ 136b3o5bo35bo3bo10b3o$141bobo36bo3bo10b3o$180bo3bo10b3o$181booboboo8b oo$144b3o3b3o30bobboo14boo$127bo16bobbobobbo13boo34bobo$126b3o15bo7bo 13boo34bo$125boobo15bo7bo$125b3o17bobobobo14boo$126boo39bo$148bo17bo 45bo$130bobo14b3o15bo45boo$130boo14booboo13bo46bobo$132b3o12b3o14boo 50b3o$147b3o65bobbo$147b3o68bo$147bobo27bo36bo3bo$147bobo25boo41bo$ 136boo10bo7boo18boo37bobo$137boo18bo29boo$136bo19bo30bobo$156boo29bo$$ 141boo13boo$142boo12bo$141bo15bo39bo$158bo37boo$147bo11bo36bobo$146boo 10boo$141bo5boo$140b3o3bo$139boobo$139b3o$139b3o$140boo30boo$166boo4bo bo$166boo4bo$129bo13bo$128b3o11b3o11boo8boo$127boobo5bo4boobo12boo8bo$ 127b3o5b3o3b3o12bo9bo15bo$128boo4bobboo3boo21bo15boo$134bo3bo25bo16bob o$135boobo25boo$137boo$$142b3o$142bobbo$142bo13boo$142bo14bo$143bobo 10bo$156boo$133boo$133boo21boo$127bo16bo5bo5bo$126b3o7bo6b3o3b3o5bo$ 126boboo5b3o5bobooboobo6bo$127b3o4b5o5b3ob3o8bo$127boo4boo9boo3boo7boo $134b5o$63b3o11b3o55b3o9bo31b3o11b3o48b3o11b3o$63bobbo10bobbo55boo8bob o29bobbo10bobbo48bobbo10bobbo$63bo6b3o4bo67bo3bo31bo4b3o6bo48bo6b3o4bo $63bo5bobbo4bo69bo18boo13bo4bobbo5bo48bo5bobbo4bo$64bobo6bo4bobo85bo 11bobo5boboobbobo50bobo6bo4bobo$68bo66bo31bo81bo$69bo4bo60boo29boo82bo 4bo$74bo59bobo7b3ob3o104bo$64bo7bo93boo12bo8bo63bo5bo$63b3o5boo59bo12b o3bo17bo11b3o5bobo62b3o3b3o$63boboobb3o59b3o6bo5b3o17bo11boobo70b3o3bo boo$64b3o3bo59boobo6boo23bo12b3o4bobbo64boo4b3o$64boo64b3o6bo3boo5bo 13bo14boo4b3o61b5o5boo$130b3o7bobbobo3bobo12boo20bo62b3o$130b3o12bo3bo bbo$131boo10b4obobbo20bo5bo75bo$143bo3bobobo19b3o3b3o74bo$56b3o3b3o14b 3o61bo5bo20boobo3boboo14b3o44b3o7bo6b3o3b3o$56bobbobobbo13bobbo61bo6bo 5boo12b3o5b3o14bobbo42bobbo6boo5bobbo3bobbo$56bo7bo16bo60bo6bo7bo13boo 5boo15bo48bo7boo7bo3bo$56bo7bo16bo61bo5bo6bo38bo48bo8bo7bo3bo$57bobobo bo14bobo62bo4bo7boo17bo20bobo42bobo14bobo5bobo$74bobo67boo28b3o$60bo 12bobbo79boo15bo3bo15bo68b3o$59b3o14bo79bo16bo3bo15bo68b3o$58booboo10b oo82bo32b3o69bobo$59b3o96bo14bo3bo12bo72bo$59b3o97bo13bo3bo71b3o11bo$ 59b3o96boo13booboo73bo$59bobo8boo102bobo73bo$59bobo8bobo102bo9b3o73bo 3bo$60bo9bo114bo75booboo$74b3o109bo60b3o4b3o5bobo$63bo10bobbo75bobo10b oo79bobbo5bo$63boobo7bo79boo10bo80bo7bo7bo$67bo6bo3bo75bo12bo12b3o64bo 3bo11bo$64boo8bo3bo87boo12bo66bo3bo11bo$74bo106bo65bo$75bobo88boo80bob o$61bo105bo8boo$61b3o102bo10bo76boo10bo$62boo101bo9bo5b3o71b4o7boo$ 164bo11bo4bobbo72boo8bo$164boo15bo76boobo4bobo$56bo5boo117bo3bo74bo5b oo$56bobo5bo116bo78bo5boo$56boo3bobo118bobo$62bo19bo13bo130bo13bo$81b 3o11b3o58boo68b3o11b3o$81boboo4bo5boboo58bo21b3o11b3o30boboo4bo5boboo$ 82b3o3b3o5b3o57bo8b3o10bobbo10bobbo31b3o3b3o5b3o17bo$82boo3boobbo4boo 58boo7bo15bo4b3o6bo31boo3boobbo4boo17bobo$87bo3bo74bo14bo4bobbo5bo36bo 3bo22bobbo$87boboo65boo20bobo5boboobbobo37boboo24bo$87boo67bo75boo$ 157bo$95b3o60bo67b3o$61bo13bo12bo5bobbo61bo20bo8bo35bobbo19bo13bo$60b 3o11b3o10bobo7bo60boo19b3o5bobo38bo18b3o11b3o$59boobo5bo4boobo13bo6bo 80boobo46bo17boobo5bo4boobo$59b3o5b3o3b3o11bo6bobo81b3o4bobbo36bobo18b 3o5b3o3b3o$60boo5boboo3boo15boo86boo4b3o59boo5boboo3boo$88booboo93bo 49boo$90bo75boo68boo$80bo16bo5bo62bo53bo5bo16bo$70bo8b3o14b3o3b3o62bo 51b3o3b3o6bo7b3o12bo$60b3o5b3o7boobo13boobo3boboo60boo4b3o3b3o14b3o21b obooboobo5b3o5boobo10boo4b3o10bo$60bobbo5bo8b3o14b3o5b3o65bobbo3bobbo 13bobbo21b3ob3o5b5o4b3o17bobbo10bo$60bo5bobbo9boo15boo5boo61boo6bo3bo 16bo24boo3boo9boo4boo14bobbo11b3o$60bo5b3o98bo6bo3bo16bo36b5o16bo7bo$ 61bobo36bo65bo4bobo5bobo14bobo24bo9b3o16bo3boo4bobo$99b3o27bo13bo21bo 56bobo8boo17bo$98bo3bo25b3o11b3o19bo10b3o15bo27bo3bo27bo$52b3o3b3o24b oo11bo3bo25boboo4bo5boboo13boo3boo9b3o15bo28bobo38b3o3b3o$52bobbobobbo 16bo8boo41b3o3b3o5b3o12bobbo13b3o12b3o29b3o21bo9bo5bobbo3bobbo$52bo7bo 15b3o6bo12bo3bo26boo3boobbo4boo13bobbo28bo44bo9b3o6b3o8bo3bo$52bo7bo 15boboo18bo3bo31booboo20boo73boo9boboo5bo10bo3bo$53bobobobo17b3o18boob oo31bobb3o35b3o56bobo9b3o5bobo5bobo5bobo$77boo11boo7bobo33boboo17boo 17b3o43booboo20boo7boo$56bo28bo5boo7bo36bo19bo27b3o33booboo12bo27b3o$ 55b3o14bobo9b3o3bo42bo3bo4b3o11bo28bo35booboo4bo6b3o26b3o$55b3o15boo9b oboo49bo3bobbo11boo16bo3bo7bo3b3o30bo5boo6boboo25b3o$70b3o12b3o49bo6bo 28bo5bo9bobbo36bobo6b3o$85b3o46boboo6bo11boo34bo29b3o13b3o$85b3o45boo 6bobo12bo17bo3bo9bo3bo45b3o12bo12b3o$54bo3bo26boo3boo65bo17b3obboboboo bbo3bo45boo13boo11b3o$54bo3bo31b3o45boo18bo20bo6bo5bo33bo25bobo$53bobo bobo7boo24boo7b3o32bo6b3o3b3o6bo13boo3bo6bo3bobo34boo$55b3o8boo25b3o4b ob3o22bo7bo8bobbobobbo5boo12bobbobbo3b3o36boo3bobo36bo3bo$3bo13bo23bo 13b3o10bo24bobboboo4bo21b3o6bo8bo7bo19bobbo3bob3o36b3o4boo29bo5bo5bo 35bo13bo$bb3o11b3o22bobo12bo42bo3bo21boobo7bobo5bo7bo20boo4bobo39b5o 32boo4bo5bo34b3o11b3o$boobo5bo4boobo22boo54bo27b3o9bo7bobobobo25boo43b oboo31bobo44boobo5bo4boobo$b3o5b3o3b3o44boo62boo48boobob3o39boo79b3o5b 3o3b3o$bboo4bobboo3boo43boo31bobbo50bo17boo8boboobboo82bobo36boo4bobb oo3boo$8bo3bo50bo30bo3bo3bo44b3o16bo7b3obobobo80bo3bo43bo3bo$9boobo82b 3obboo44booboo16bo14bo80boo47boobo$11boo81booboo47booboo15boo13bo80bob o49boo$57bo37bobbo48bobo28b3o$16b3o37bobo4bo32boo35boo13bo17boo92bo44b 3o$16bobbo42b3o69boo31bo91b3o43bobbo5bo$16bo45boboo67bo32bo92boboo42bo 7bobo$16bo46b3o80booboo14bo94b3o42bo6bo$17bobo32boo9b3o79bo5bo12bo95b 3obobo39bobo6bo$51boo10boo73boo6bo3bo8boo3boo94boo3bo44boo$7boo44bo85b oo6b3o8bobbo148booboo$7boo9b3o3b3o111bo8bobo8bobbo135b3o3b3o6bo$bo15bo bbo3bobbo120bo10boo136bobbobobbo16bo$3o7bo9bo3bo60b3o11b3o46bo73b3o11b 3o58bo7bo15b3o$oboo5b3o8bo3bo59bobbo10bobbo41boo11boo63bobbo10bobbo58b o7bo15boboo$b3o4b5o4bobo5bobo59bo4b3o6bo42boo11bo9bo56bo4b3o6bo39bo19b obobobo17b3o$boo4boo78bo4bobbo5bo7bo33bo12bo9bo57bo4bobbo5bo39boo42boo $8b5o8b3o60bobo4bo3bobbobo9boo44boo8b3o52bobo4bo3bobbobo39bobo9bo11bo$ 9b3o9b3o67b4o14boo30bo86b4o58bo9b3o$10boo9bobo68bo47b3o13boo71bo58b3o 8booboo$22bo116boobo3boo8bo143b3o$22bo77bo38b3o3b3o9bo65bo76b3o13boo$ 99b3o37b3o16bo63b3o75b3o12boo$9bo27boo52b3o4boobo38boo17bo61boobo75bob o14bo$9boo9bo3bo11boo54boo4b3o57boo61b3o76bobo$8bobo9booboo13bo53boo5b oo121boo77bo$21bobo68booboo38bo13bo24bo13bo122boo$93bobo38b3o11b3o22b 3o11b3o42boo76boo$14bo7bo71bo7bo5bo25boboo4bo5boboo21boboo4bo5boboo24b o5bo10boo78bo$14boo6bo78b3o3b3o25b3o3b3o5b3o6boo6boo6b3o3b3o5b3o23b3o 3b3o$13bobo6bo60b3o15bobooboobo25boo3boobbo4boo8boo5bo7boo3boobbo4boo 23boobo3boboo14b3o52bo$83bobbo15b3ob3o31bo3bo13bo8bo11bo3bo29b3o5b3o5b 3o6bobbo51boo11boo$83bo18boo3boo31bobo3bo19boo11bobo3bo28boo5boo5bo3bo 5bo53bobo10boo$19bo63bo143bo5bo4bo68bo$19boo63bobo18bo35booboo20boo12b ooboo33bo13bo6bobo$18bobo83bobo27b3o6bo23bo14bo4b3o27b3o8b4o$15bo87bo 3bo25bobbo29bo19bobbo111boo5bo$14b3o87bobo29bo5boo21bo23bo27bobo80boo 5b3o$14boboo5bo65boo14bo30bo5b3o19bo24bo28bo83bo4boboo$15b3o3boo3boo 60bobo14bo27bobo6boo15boo3boo20bobo16bobo100b3o$15b3o7bobo62bo13bobo 33b3o15bobbo43boo101b3o$15boo10bo76bobo31bobboo15bobbo44bo23b3o75boo$ 105bo20b3o3b3o3bo4bo15boo17boo9b3o3b3o17b3ob3o8bo$29bo64boo29bobbo3bo bbo4b3o8bo20bo5boo9bobbobobbo19bobo11bo$29boo62bobo32bo3bo8bo8b3o3boo 13b3o5b3o7bo7bo$28bobo64bo6boo3boo19bo3bo16boobo4bo12boobo6b3o6bo7bo$ 125bobo5bobo13b3o4bo13b3o6b3obo6bobobobo20b3o5b3o$150boo4boo13boo5boo 45bo62b3o$99boo28b3o45b3o13bo32bo61bo$98bobo4bo23b3o24boo20boo12b3o94b o$100bo4bo23b3o24bo22bo12b3o$157bo62b3o63boo$145bo12bo61bo64boo$104boo 23b3o12boo13bo61bo65bo$41boo54b3o3bobo23b3o12bobo11boo3boo26bo3bo28b3o $40bobo54bobbo4bo56bobbo14boo9bo3bo28bobbo$42bo54bo64bobbo15boo7bobobo bo27bo$97bo3bo26bo3bo7bo22boo15bo11b3o29bo3bo$44bo52bo29bo5bo5boo51b3o 29bo$44boo52bobo26bo5bo5bobo24boo25bo31bobo$43bobo120bo18boo$124bo42bo 18boo22b3o$125boobbobo3bo30boo17bo24bo62b3o$124boo4bo3boo75bo61bo$134b obo29boo106bo$167bo22boo$166bo24boo78boo$137bo27bo20bo3bo79boo$119boo 15b3o25bo20b3o84bo$56boo60bobo14boobo20boo3boo18boobo$55bobo62bo14b3o 20bobbo22b3o$57bo77b3o20bobbo22b3o$125bo10boo21boo24boo$59bo64boo$59b oo63bobo29boo$58bobo96bo$156bo$156boo100b3o$258bo$156boo101bo$156bo$ 157bo98boo$158bo96boo$159bo97bo$71boo85boo3boo25bobo$70bobo89bobbo24b oo$72bo89bobbo25bo$163boo33bo$74bo121boo$74boo90boo29boo$73bobo90bo$ 167bo$166boo75b3o$243bo$166boo76bo$167bo$166bo74boo$165bo74boo$164bo 77bo$86boo71boo3boo$85bobo70bobbo$87bo70bobbo$159boo$89bo$89boo65boo$ 88bobo66bo$139bo16bo$140boo14boo70b3o$139boo87bo$156boo71bo$132bobo21b o$133boo22bo68boo$133bo24bo66boo$159bo67bo$101boo55boo3boo$100bobo59bo bbo$102bo59bobbo$163boo$104bo$104boo60boo$103bobo60bo$167bo$166boo45b 3o$213bo$166boo46bo$167bo$166bo44boo$165bo44boo$164bo47bo$116boo41boo 3boo9bobo$115bobo40bobbo13boo$117bo40bobbo14bo$159boo22bo$119bo61boo$ 119boo35boo24boo$118bobo36bo$156bo$156boo40b3o$198bo$156boo41bo$156bo$ 157bo38boo$158bo36boo$159bo37bo$131boo25boo3boo$130bobo29bobbo$132bo 29bobbo$163boo$134bo$134boo30boo$133bobo30bo$154bo12bo$155boo9boo15b3o $154boo27bo$166boo16bo$147bobo17bo$148boo16bo14boo$148bo16bo14boo$94bo 13bo55bo17bo$93b3o11b3o36boo11boo3boo$92boobo5bo4boobo35bobo10bobbo47b o13bo$92b3o5b3o3b3o38bo10bobbo46b3o11b3o$93boo5boboo3boo50boo47boboo4b o5boboo$149bo59b3o3b3o5b3o$149boo5boo51boo3boobbo4boo$148bobo6bo22bo 13bo21b3o$103bo52bo22b3o11b3o$101boo4b3o13bo13bo18boo21boboo4bo5boboo$ 107bobbo11b3o11b3o41b3o3b3o5b3o$104bobbo13boobo5bo4boobo17boo22boo3boo bbo4boo12b3o6bo$99bo7bo13b3o5b3o3b3o18bo30b3o17bobbo6bo$98bo3boo4bobo 11boo4bobboo3boo19bo52bo6bo$98bo29bo3bo25bo51bo3bobo$99bo26bo3bobo26bo 47bobo4bobo$109b3o3b3o40boo19b3o6bo25b3o$92bo9bo5bobbo3bobbo8booboo30b oo14bobbo6bo$91b3o6b3o8bo3bo13bo6b3o23bo18bo6bo11b3o3b3o$91boboo5bo10b o3bo20bobbo23bo17bo3bobo11bobbo3bobbo15bo$92b3o5bobo5bobo5bobo10boo5bo 27bo13bobo4bobo14bo3bo17b3o$92boo7boo25b3o5bo28bo19b3o14bo3bo16boobo$ 112b3o14boo6bobo26bo32bobo5bobo13b3o$112b3o15b3o34bo56boo$112b3o15boo bbo31boo5bo5bo16bo6b3o$129bo4bo37b3o3b3o14b3o5b3o$121bo8b3o5bo5bo21boo 4bobooboobo13boobo5bobo$99bo12b3o5b3o8bo5b3o3b3o21bo5b3ob3o14b3o7bo15b obo$99boo11b3o5boboo13bobooboobo20bo6boo3boo15boo7bo14b3o$98bobo20b3o 14b3ob3o20bo53bo$121boo15boo3boo19bo11bo$111bo3bo48boo9bobo24bo3bo$ 104bo5bo5bo24bo18boo12bo3bo12bobo8booboo8bo$104boo4bo5bo23bobo18bo13bo bo12b3o10bobo8boo$103bobo33bo3bo16bo15bo13bo23bobo$127bo13bo17bo16bo 27bo$112bobo12boo29bo16bobo26bo$109bo3bo12bobo28bo17bobo8bo17bo5bo$ 109boo45bo19bo8boo22boo$108bobo27b3ob3o11boo27bobo3bo17bobo$132bo57b3o $106bo19bo5boo5bo3bo12boo32boboo$105b3o17b3o3bobo6b3o13bo34b3o$105bob oo15boobo29bo17b3o13b3o17bo$106b3o15b3o31bo16b5o5bobo3b3o16b3o$106b3ob obo11b3o32bo14b6o4bobo4boo16boobo$106boo3bo12b3o31boo13boo3boo3b3o23b 3o$125boo35boo8bobbobboobobbo15bo8b3o$133boo27bo9bobbobboobobbo14boo9b oo$131boboo8boo18bo9boo4bobo17bobo$132boboo5boobbo18bo11boobobo$133bo bbooboo4boo18bo10bobb3obo$124bo10bobo5boo21bo$124boo14boo25bo7boobo3bo $123bobo40boo7bo6bo$179b3o$166boo11boo$141bo25bo11bo$140bo25bo$135boo bb3o23bo$135b3oboo23bo$136b3o25boo$160boo23bo$161bo22boo$160bo23bobo$ 159bo$158bo$139bo17bo$139boo15bo$138bobo15boo8bobo$166boo$156boo9bo47b o13bo$156bo57b3o11b3o$100bo13bo42bo56boboo4bo5boboo$99b3o11b3o34bobo5b o56b3o3b3o5b3o$98boobo5bo4boobo35boo6bo55boo3boobbo4boo$98b3o5b3o3b3o 36bo6boo60booboo$99boo5boboo3boo47boo6bo49bobb3o$129bo13bo18bo6boo50bo boo$128b3o11b3o18bo5bobo51bo$127boobo5bo4boobo19bo21bo13bo13b3obbo3bo$ 109bo17b3o5b3o3b3o21bo19b3o11b3o11bobbo3bobo$107boo4b3o12boo5boboo3boo 10bo11bo18boboo4bo5boboo13bo4bo$113bobbo37boo11bo18b3o3b3o5b3o13bo$ 110bobbo39bobo10boo18boo3boobbo4boo11bobo$105bo7bo77bo3bo$104bo3boo4bo bo21bo27boo23boboo$104bo31boo4b3o22bo23boo13b3o3b3o$105bo36bobbo20bo 38bobbo3bobbo15bo$115b3o3b3o15bobbo22bo19b3o20bo3bo11boo4b3o$98bo9bo5b obbo3bobbo9bo7bo21bo19bobbo20bo3bo16boobo$97b3o6b3o8bo3bo11bo3boo4bobo 18boo21bo17bobo5bobo13b3o$97boboo5bo10bo3bo11bo26boo25bo42boo$98b3o5bo bo5bobo5bobo9bo26bo22bobo22b3o13boo$98boo7boo51bo48b3o13b3o$118b3o6bo 9bo6bo5bo8bo35boo12bobo11bobbo$118b3o5b3o6b3o5b3o3b3o6bo36boo13bo13boo $117bobobo4boboo5bo7bobooboobo5bo21bo5bo16bo7bo$127b3o5bobo6b3ob3o5bo 21b3o3b3o6bo7b3o$127boo7boo6boo3boo5boo20bobooboobo5b3o5boobo$105bo73b 3ob3o5b5o4b3o5bo3bo9bo$105boo9boo3boo24bo8boo21boo3boo9boo4boo5booboo 8boo$104bobo10booboo24bobo7bo34b5o13bobo9bobo$117booboo23bo3bo7bo24bo 9b3o$119bo26bobo9bo22bobo8boo16bo$110bo23bo11b3o10bo20bo3bo25bo6bo$ 110boo22boo24bo20bobo26bo5boo$109bobo21bobo25bo20bo33bobo$162bo19bo11b o$145booboo13bo17bobo9boo$115bo16bo6bo5booboo14bo16bobo9bobo16bo$115b oo14b3o5boo4booboo15bo16bo28boo$114bobo13boobo4bobo6bo18bo30bo13bobo3b o$130b3o34bo21bo6b3o17b3o$112bo17b3o13b3o17boo11boo3boobboo6boboo15boo bo$111b3o16b3o55bobo6b3o15b3o$111boboo16boo33boo29b3o15b3o$112b3o52bo 29b3o16boo$112b3o51bo15bo14boo$112boo24boobo8boo13bo16bo$125bo12boobbo 7boo12bo$125boo25bo11boo$124bobo14b4o5bobo7boo17bo10bo$144boo3bobbo8bo 16bobo10bo$150boo8bo16bobbo4boo4bo$159bo18bo6boo10bo$158bo26b3o8boo$ 157bo19bobo16bobo$156bo20b3o$145bo10boo20bo$144bobo$143boo11boo$156bo$ 157bo$158bo$140bo18bo25boo$140boo18bo$139bobo19bo$162bo$163bo$164bo17b o$165bo15boo$166bo14bobo$167bo$166boo$$157bobo6boo$158boo7bo$158bo7bo$ 129bo13bo21bo14bo13bo$128b3o11b3o10bo8bo14b3o11b3o$128boboo4bo5boboo9b oo7boo3bobo7boboo4bo5boboo$129b3o3b3o5b3o8bobo3boo7boo9b3o3b3o5b3o$ 129boo3boobbo4boo16bo8bo9boo3boobbo4boo$134bo3bo21bo24bo3bo$134boboo 21bo7bo17boboo$134boo22bo7boo17boo$157bo8bobo$142b3o11bo22b3o$135bo5bo bbo11boo20bobbo$134bobo7bo36bo$137bo6bo11boo23bo$134bo6bobo12bo21bobo$ 138boo17bo$135booboo18bo30boo$137bo21bo29boo$127bo16bo5bo9bo12bo5bo16b o$126b3o14b3o3b3o9bo10b3o3b3o6bo7b3o$125boobo13boobo3boboo9bo9bobooboo bo5b3o5boobo$125b3o14b3o5b3o10bo9b3ob3o5b5o4b3o$126boo15boo5boo12bo8b oo3boo9boo4boo$165bo19b5o$147bo18bo9bo9b3o$146b3o18bo7bobo8boo$166boo 6bo3bo$132boo12bobo26bobo$133boo12bo18boo8bo$132bo34bo8bo11bo$166bo8bo bo9boo$165bo9bobo9bobo$137boo5b3ob3o13bo11bo$132bo5boo6bobo14bo27bo$ 131b3o3bo24bo20bo6b3o$131boboo26bo11boo3boobboo6boboo$132b3o11b3o11bo 21bobo6b3o$132b3o8boo14bo31b3o$132b3o7bobbo12bo32b3o$132boo9boo12bo18b o14boo$156bo19bo$156boo$$156boo15bo10bo$156bo15bobo10bo$157bo13bobbo4b oo4bo$158bo13bo6boo$159bo19b3o$93b3o11b3o50bo10bobo40b3o11b3o$93bobbo 10bobbo40bo9bo9b3o40bobbo10bobbo$93bo6b3o4bo37bo6boo8bo9bo41bo6b3o4bo$ 93bo5bobbo4bo37bo5boo10bo50bo5bobbo4bo$94bobobbo3bo4bobo12bo13bo26bo 21bo13bo14bobobbo3bo4bobo$98boobbobo17b3o11b3o26bo19b3o11b3o17boobbobo $100bo21boboo4bo5boboo26bo18boboo4bo5boboo18bo$101boobo18b3o3b3o5b3o 27bo18b3o3b3o5b3o19boobo$101b3o4bo14boo3boobo5boo27boo11boo5boo3boobo 5boo13bo6b3o$101b3o3b3o104b3o5b3o$107boboo55boo46boboo4boo$108b3o56bo 47b3o4bobo$108boo18bo37bo24bo23boo4bobbo$128b3o5b3o11bo14bo7bo11b3o4b oo30bo$129bo5bobbo10b3o12bo7b3o9bobbo32bo$110bo5bo12bobbo5bo10boboo10b o8boboo11bobbo16bo5bo5boobbo$98boo9b3o3b3o12b3o5bo11b3o9bo10b3o11bo7bo 10b3o3b3o4boobbo$91b3o14boobo3boboo16bobo12b3o8bo11b3o8bobo4boo3bo9bob ooboobo5b3o7b3o$90bobbo4bo3bo5b3o5b3o31b3o7bo12b3o20bo10b3ob3o6b3o6bo bbo$93bo15boo5boo32boo7bo13boo20bo11boo3boo18bo$93bo4bo59bo73bo$90bobo 4bo15bo7bo16bo5bo12bo8bo12bo5bo6bo9bo7bo18bobo$97bobbo11b3o5b3o14b3o3b 3o10bo8bobo10b3o3b3o5b3o6b3o5bobo$97bobbo10bo3bo3boobo13boobo3boboo9b oo7bobbo9bobooboobo7bo5boobo4bo3bo$98boo11bo3bo3b3o14b3o5b3o19boo11b3o b3o6bobo5b3o6bobo$120boo15boo5boo10boo21boo3boo6boo7boo6b3o$111bo3bo 40bo67boo$111bo3bo8bobo14bo15bo24bo41bobo$111booboo8boo14b3o15bo22bobo 40bo$100b3o9bobo11b3o10bo3bo15bo20bo3bo23booboo$102bo10bo46bo21bo25boo boo$101bo59bo33bo12booboo6boo$139booboo18bo31boo14bo8bobo$141bo21bo30b obo22bo$105b3o22boo32bo14b3ob3o23b3o$107bo23boo32bo$106bo19bo3bo8bo3bo 13bo8bo13bo3bo5bo6bo16boo$125b3o10bobobobo11bobo8bo13b3o5boo5b3o15bobo $112bo12boboo10b5o11bobbo7boo21bobo4boboo14bo$110bobbo12b3o11b3o13boo 39b3o$112bo13b3o3booboo4bo24boo29b3o$105b3o3bo14b3o3boob3o29bo29b3o16b 3o$104bobbo18boo4boobboboo3boo21bo30boo12boobbobbo$107bo26boobboobbobb o19bo16b5o24boo5bo$103bo3bo7b3o17bobo4bobbo18bo16boob3o27bo3bo$107bo9b o25boo18bo18b5o31bo$104bobo9bo18bobboo22bo20boo30bobo$135bo4boo19bo22b o$135bo3bobbo17bo$135b3obo19bo$136boob3oboo13bo$137b3o17bo8bo32boo$ 138bo17bo8bobo31bobo$156boo7bobbo30bo$166boo$156boo$156bo$157bo$158bo$ 130b3o26bo$132bo27bo$131bo29bo$162bo$163bo$149bo14bo$150boo13bo$149boo 6bo8bo17boo$156bobo8bo16bobo$155bobbo7boo16bo$156boo$166boo$167bo$166b o$165bo$145b3o16bo$147bo15bo$146bo15bo$161bo$160bo$159bo$158bo$157bo$ 156bo$156boo! CB 1,1,1,1 golly-2.5-src/Patterns/Life/Rakes/0000755000175100001440000000000012156146015014016 500000000000000golly-2.5-src/Patterns/Life/Rakes/2c5-engineless-rake-p185.rle0000644000175100001440000001357612156145314020615 00000000000000#C engineless p185 2c/5 rake: Paul Tooke, 14 December 2004; #C some updates by Jason Summers, 15 December 2004. x = 531, y = 201, rule = B3/S23 392bo$390b2obo$388b3o$387bo2bo$386bo$387bo2bo2bo$388b4obo$390bob3o$ 381bobo8b3o$378bo4bo7b2o$377b3o4bo6bo2b2obo$376bobo12bo2b3o$375b2o2b2o 4bo6b2obo$376b2o2b5o4$342b2o32b2o2b5o$341b3o31b2o2b2o4bo$307bobo15b2o 12bo36bobo$307bobo2bo11b3o11b2obo35b3o4bo$306bo3bob3o8bo2bo2bobo5b2o 39bo4bo7b3o$307b2ob6o7b2o3bo2bo6b2ob3o37bobo6bo2bo$307b2obobo2bo5bo9bo 7bo51bob2o$310bobobo2bo3b8obo10bo49b3o$310bo3bo2bo12bo14bo$311b2o2b2ob 12o12bo3bo42b2o$312b2o3bo14bobo6b2ob2o$318b15obo7bo48b3o$282b3o58b2ob 2o43b3o$280b2ob2o33b15obo55bobo$278b2obobo28b2o3bo14bobo56bo$278b2o3b 2o26b2o2b2ob12o$278b2obob2o25bo3bo2bo12bo$280b3o27bobobo2bo3b8obo$284b o22b2obobo2bo5bo9bo$284b2o21b2ob6o7b2o3bo2bo$283bo4bo17bo3bob3o8bo2bo 2bobo16bo21bobo4bo11b2o$282b2o4bo18bobo2bo11b3o18b2ob2o20bo5b2ob2obo5b o$283b5o19bobo15b2o17bobobo15b2o3bo7bobobo6bo2bo$284bo58b2o3bo7b2o6b2o 3b2o3bobo2bobo6b2o$344bobo2bo5b2ob2ob3o5b2obob4o2b2o5bobobo$345b2obo7b ob2ob2o3b2o3b2ob2o10b2obo38bo$357bo5bobo2bo7bobo10bo38bobo$349b2o7b2o 2bo3b2o10bo3b3o2bob2o37b2o$348bob3o12b2o15b2o3bob2o$309b2o36bo3b3o4b2o 2bo3b2o10bo3b3o2bob2o$308b3o37bobo6bo5bobo2bo7bobo10bo$306bo42bo6bob2o b2o3b2o3b2ob2o10b2obo$305b2obo46b2ob2ob3o5b2obob4o2b2o5bobobo$304b2o 50b2o6b2o3b2o3bobo2bobo6b2o$305b2ob3o53b2o3bo7bobobo6bo2bo$306bo19b2o 42bo5b2ob2obo5bo$308bo16b2o43bobo4bo11b2o$312bo14bo$309bo3bo$308b2ob2o $309bo$274bo35b2ob2o$273b3o$253bo18b2o2bo$251b2obo17bo3bo137b2o2b2o$ 249b3o20bobo141b4o$248bo2bo159b2o6b2o$247bo25b2ob2o133b2obob5o$248bo2b o2bo20bo134bo3b2o$206b2obo13b2o24b4obo156b3o$205b3obo13b2o26bob3o155b 3o$204bo6bo9bo5b2o24b3o20bo$205b2obo2b2o8b3o3b3o22b2o18bo4bo133b5o$ 206b3obo2b2o4b2o5bobo23bo2b2obo13bo137b7o$208bobobo7b8o24bo2b3o19bo 131bo3bo$209b2obob2o12bo24b2obo16b2o135b2o2b3o$209b2obo3bob10o45b2o 127bobo6bo2bo$215bobo12bobo40b2o2bo124bobo$211bo4b17o41b4o121b2obo11b 2o$275b2o121bob2o12bo$211bo4b17o165bo3bo10b2o$215bobo12bobo158bo6bob2o bo8b3o2b2o$209b2obo3bob10o162b5o4b2obo10bo3b2o$209b2obob2o12bo160b2o4b o18bo2bo$208bobobo7b8o162bo4bo18b2o$206b3obo2b2o4b2o5bobo162b2o9b4obo$ 205b2obo2b2o8b3o3b3o161bo10b2o2bo$204bo6bo9bo5b2o158b3o12b2o3bo$205b3o bo13b2o160b2obob2o12bo$206b2obo13b2o160b2o3b2o$385b2obobo$288bobo96b2o b2o65bo$273bobo2b3obo4bo4bobo94b3o63b2o$273bobo2bobobob3o4b3obo88bo71b 2o$272bo3bo5bo3b3o6bo89bo$273b2ob5obo7b6o87b3o$273b2o4bo4bo3bo170bo$ 275b2o8b3o3bobobo162bo$277bo7bob3obobobo14b2o146b3o$279bobo4b2o21b6o 104b2o$279b2o27bo3bo72bo3bo28b6o$280bo27bo4b2o70b2o2b2o26bo3bo$308bo2b o71b2ob2o2bo26bo4b2o$382b2obob2obo26bo2bo$310b2o69bo3bo5bo$310b2o70b3o 34b2o$306b2o2bo72bo7bo27b2o39bobo$306b6o103b2o2bo40b2o$305bo77bo7bo23b 6o40bo$306bo5bo69b3o29bo$306bo5bo68bo3bo5bo23bo5bo$382b2obob2obo24bo5b o$307bobo73b2ob2o2bo$306bo78b2o2b2o25bobo$306bo3b6o69bo3bo25bo$216b3o 87bobobob3obo98bo3b6o$216bo90b3obo103bobobob3obo$217bo93b3o102b3obo$ 311b2o2bo104b3o$420b2o2bo6$493b2o$492b2o$494bo3$502bo$7bo4bo488bobo$6b ob2obobo45bo73bo73bo73bo73bo73bo70b2ob2o$5bo3bo11b2o34bo3bo14b3o52bo3b o14b3o52bo3bo14b3o52bo3bo14b3o52bo3bo14b3o52bo3bo14b3o52bo2bo$5bobo12b ob5o11b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo 18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b2o17b2ob2o20bo$5bo 2b2o6bob2ob3o3bobobo5b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob 3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo 12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o13bo4bo12b2ob3o 15bobo20b5o$2b2ob2o5b4ob2o6bo7bo4b5o13b5o14b2o16bo18b5o13b5o14b2o16bo 18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b2o16bo18b5o13b5o14b 2o16bo18b5o16bo20b2o4bo$bobob2o2b2o6b2ob2o4b3obobo6b3o52bo3bo14b3o52bo 3bo14b3o52bo3bo14b3o52bo3bo14b3o52bo3bo14b3o52bo3bo14b3o39bo4bo$2obo 28bo63bo73bo73bo73bo73bo73bo59b2o$b2ob3o24b2o493bo$5b2o23bobo489b3o$ 30bo114b3o354bo17b2obob2o$5b2o23bobo105bo5b6o6bo59bo283b2o3bo14b2o3b2o $b2ob3o24b2o103b2obo2b2obo3bo5b2o54b3o2b3o281b2o2bo15b2obobo$2obo28bo 90bo2bo8bo11bo7bo57bo218bo67b4obo16b2ob2o$bobob2o2b2o6b2ob2o4b3obobo 90bo2bo3b3o2b2obobo3bob2obo6b3o50b2o3bo211bo4bob3o8bo79b3o$2b2ob2o5b4o b2o6bo7bo88bo4bobo7b2o3bo5b2o6bo52bo2b3ob3o205bobo3bo3bob2o4b2o$5bo2b 2o6bob2ob3o3bobobo79bo11b2o6b2o5bob2obo5b2ob2o2b3o50b3ob6o192b2o6b2o2b 2ob2ob2obobo7bo54b2obo$5bobo12bob5o83b5o8b2o4b3ob2o3bo4b3o4b2obob3o57b 3o192b4o3bo4b2obob3obo2bo9bo51bob2obo$5bo3bo11b2o86b2o4bo9b6o18bobobob o253bo4bobobo10bo5b3o6b2o50bo3bo$6bob2obobo96bo4bo15bo3bo13bo3b2o60b3o 20bo171b2ob2obo8b4o2bo8bo3b2o50bob2o$7bo4bo98b2o12b6o18bobobobo53b3ob 6o18bobo171b8obo4b2o4bo6bob3o54b2obo$111bo11b2o4b3ob2o3bo4b3o4b2obob3o 51bo2b3ob3o17bo3b3o176b3o9bo5b2obo2bo56bobo$107b3o13b2o6b2o5bob2obo5b 2ob2o2b3o50b2o3bo22bob3o177b3o14b2o2bo59bobo$105b2obob2o10bo4bobo7b2o 3bo5b2o6bo56bo24b2o179b3o9bo5b2obo2bo$105b2o3b2o11bo2bo3b3o2b2obobo3bo b2obo6b3o52b3o2b3o192b8obo4b2o4bo6bob3o$105b2obobo12bo2bo8bo11bo7bo60b o17b2obo172b2ob2obo8b4o2bo8bo3b2o$107b2ob2o24b2obo2b2obo3bo5b2o16b2obo 56bobo2bo170bo4bobobo10bo5b3o6b2o$109b3o26bo5b6o6bo15bo2b3o39bo14b2o3b o172b4o3bo4b2obob3obo2bo9bo$145b3o24bo2b2obo38b2o14bobobo173b2o6b2o2b 2ob2ob2obobo7bo$172b2o42bobo15b2ob2o185bobo3bo3bob2o4b2o$173b3o13b2o 46bo188bo4bob3o8bo$133b2o36bob3o12b2o28bo213bo$132bo2bo33b4obo15bo$ 132bobo33bo2bo2bo42bo$133bo33bo46b2ob2o81b2o72b2o$105bo62bo2bo41bobobo 81bo2bo70bo2bo70b2o$103b2o3bo60b3o40b2o3bo81bobo71bobo71bo$103b2o2bo 63b2obo38bobo2bo81bo73bo69b2ob2o$103b4obo64bo40b2obo14b2ob2o207b3obo$ 231bo213b2obo$218b2o10b2ob2o213b2o$100b2obo113bob3o9bo3bo195b2obo13b2o $99bob2obo45b2o64bo3b3o11bo195bo2b3o9b3o$99bo3bo45b3o65bobo10bo199bo2b 2obo9bo$99bob2o44bo70bo9bo201b2o$100b2obo42b2obo77b2ob3o198b3o$103bobo 39b2o79b2o201bob3o$103bobo40b2ob3o75b2obo196b4obo$147bo80bo197bo2bo2bo $149bo80b3o192bo$153bo77b2o193bo2bo$150bo3bo272b3o$149b2ob2o275b2obo$ 150bo37b3o240bo$151b2ob2o31bo2bob2o$187b3o$188b5o$190b2o$189bobo$190bo $188bo$185b4o2bo$184b2ob2o2bo$185b2o2b2o3$191b3o$185b3ob6o$185bo2b3ob 3o$185b2o3bo$189bo$187b3o2b3o$192bo! golly-2.5-src/Patterns/Life/Rakes/2c5-spaceship-rake-p240.rle0000644000175100001440000006735512156145314020434 00000000000000#C p240 c/2 forward rake for a 2c/5 spaceship. #C This is the first rake in which the output travels in the #C same direction as the rake, but at a slower speed. #C Rake constructed by Jason Summers, March 2003. #C Synthesis of 2c/5 spaceship mostly by Noam Elkies. x = 1376, y = 297, rule = B3/S23 1215boo$1199boo13booboo$1198b4o13b4o$944bobbo249booboo14boo$943bo254b oo$943bo3bo$926b4o13b4o$926bo3bo281boo4bo$926bo274boo9boo3b3o7bo$927bo bbo269bobbo12booboo4boo$1199boobbo11b3ob3o4boo$940boo4bo253boobbo11boo b3o$929boo9boo3bobo6bo246b4o12bobo$928bobbo12bo3bo5bobo275bo48b4o$928b obbo12bo3bo5boo274boo7boo24bobbo12bo3bo$928booboo11bo3bo250boo30boo5b oob3o20bo16bo$930boo13bobbo21bo227b4o4b4o29b5o20bo3bo13bobbo$946bo12bo 8bo3bo224booboo4bo3bo3bobbo22b3o21b4o$959bobo5bo230boo6bo6bo23bo48b3o$ 959boo6bo4bo234bobbobbo3bo17boo$926b4o5boo30b5o241b4o9boo8boo32boo14bo bbo$926bo3bo3booboo4boo274b3o5boo39bo18bobo$926bo8b4o3b4o18bo254booboo 6b3o33boo4boo20bo$927bobbo5boo3booboo9bo8bobo252b3o5boo37bo6boo18bo$ 410boo530boo11bo8boo247b4o9boo38bo7boo17b3o$409boob4o532bobo4boobbo 253bo3bo49bobbo3bo$401boo7b6o531boobbo7bo253bo55bo$400booboo6b4o533bob o4boobbo254bobbo81bo5b5o$388boo11b4o537boo11bo276bobbo11bo17bobbo5boo 22bo6bo4bo$386bo15boo537booboo9bo275bo13boo17bo8b4o21b3o4bo$385bo6boo 3boo543b4o285bo3bo10boo16bo3bo3booboo29bo3bo$385bo7bobbo546boo286b4o 29b4o5boo5boo26bo$385b12oboo561boo11bo304booboo8bo$390boobboob3o560b4o 10bobo303b4o3bo4bobo9boo$395bobo561booboo10boo256b3o3bo42boo3bo5bobbo 7bo$396bo563boo269b5obboo45bobbo6bo8boo$386boo412bobbo426boob4obo42boo 3bo5bobbo$385booboo409bo168bo262boo47b4o3bo4bobo14bo$386b4o409bo3bo 160b6o309booboo8bo15bo$369bobbo14boo393b4o13b4o156b8o3bo309boo26b3o$ 368bo413bo3bo172bo8boo281bo$368bo3bo409bo176bo6b3o276boo4bo$368b4o9boo 12boo386bobbo173bo5boo276booboobboo45boo$374b3o5boo10boo566boo281b4ob 3o44booboo$374booboo6b3o8bo399boo4bo359b4o80b4o3boboo41b4o$374b3o5boo 401boo9boo3bobo6bo350b6o83bob5o42boo$368b4o9boo401bobbo12bo3bo5bobo 153b4o183boo5boob4o82booboo46bo5b3o$362bobbobbo3bo17boo26boo364bobbo 12bo3bo5boo138bobbo12bo3bo181b4o5boo88bo46bo3bo3boobo$353boo6bo6bo20b oo25bo4bo362booboo11bo3bo144bo16bo184booboo91booboo45bo5bo5bo$352boob oo4bo3bo3bobbo18bo3b3o17bo370boo13bobbo21bo122bo3bo13bobbo181boo92b5o 46bo5bo3b3o$353b4o4b4o29b5o16bo6bo6boo371bo12bo8bo3bo120b4o292boob3o 46b6obo3bo$354boo37boob3o16b8o8bo383bobo5bo147b3o162b6o104boo58bo$385b oo7boo24boo393boo6bo4bo307bo5b4o110bobbo$363bo20boo41bobbo351b4o5boo 30b5o127boo14bobbo161bo5boboo109bo$94b4o258bo3bo4bo20bo40bobo352bo3bo 3booboo4boo152bo18bobo162bo3bobboo109bo3bo$78bobbo12bo3bo256boo4bo3bo 3booboo42boo364bo8b4o3b4o18bo130boo4boo20bo159bo98b4o13b4o$77bo16bo 259boo5bo8bobbo41booboo49bo313bobbo5boo3booboo9bo8bobo128bo6boo18bo 159boo98bo3bo$77bo3bo13bobbo256boo13b3o7boo34b4o50bo327boo11bo8boo129b o7boo17b3o156b4o97bo$77b4o283bobbo11boo23boo11boo49b3o333bobo4boobbo 136bobbo3bo176booboo98bobbo$365boo14bo20bo5boo393boobbo7bo138bo182boo 125bo$104bo296bo6b3o393bobo4boobbo168bo5b5o154bo93boo19bobo$82bobo18bo 297bo8boo386boo11bo138bobbo5boo22bo6bo4bo123b4o25boo91b5o18boo$81bo3b oob3o12b3o247boo46b8o3bo384booboo9bo137bo8b4o21b3o4bo128bo3bo9bo14bobo 89bo4bobb3obo$79boobob4o4boo258booboo14boo33b6o386b4o147bo3bo3booboo 29bo3bo123bo11boo107bobb3o3bo3boo$79bo4b5o5boo257b4o13b4o36bo55bobo 330boo148b4o5boo5boo26bo126bobbobboo5b3o104boobbo7bobo14bo$79bo3bo5bo 4boo13bo244boo13booboo93boo348boo11bo133booboo20bo135b3o6b3o7bo97boo7b oobo14bobo10bo$80b3o8b5o12bo261boo30boo55bobo5bo348b4o10bobo132b4o3bo 5b3o7bo131bobbobboo5b3o7bo19boo87boo15boo9bo3bo$82bo9boo14b3o290booboo 46boo5bobbo352booboo10boo134boo3boboo3b3obbo4b3o128bo11boo11bo16bo90bo 26bo$118b5o279b4o45boob4o3boo353boo152bo3bo6bobo121boo12bo3bo9bo26bo6b o111bo4bo$78bobbo5boo29bo4bo279boo47b5o6bo302b4o56bo139boo3boboo3b3obb o120b4o4b4o3b4o37bo8bo68b4o5boo25bo4b5o$77bo8b4o24bo3bo266boo66b3o5boo 302b7o4boo47bobo137b4o3bo5b3o122booboo4bo3bo22bo20b8obo68bo3bo3booboo 4boo17bobo$77bo3bo3booboo23bo5bo3bo260b4o70booboo301boob3oboobbobo42b oobboob3o134booboo135boo6bo25boo5boo18boo71bo8b4o3b4o16boo$77b4o5boo5b oo18b3o5bo261booboo11bo11boo352boo3boobbobboo36b12oboo135boo146bobbo 21bobo3boob3o89bobbo5boo3booboo$92booboo12bo274boo5bobbo3boboo9bobo38b 4o318bobbo37bo7bobbo318b5o104boo5boob3o$93b4o3bo8bo280bo3bo4b5o7bo40bo 3bo7boo302boo4bobo38bo6boo3boo317b3o12boo97bo5boo11bo$94boo3bobobboo 283boo4bo4bobbo48bo10boo301bo8bo40bo166boo129boo18bo25booboo94boo7bo 10bobo$98bo3boobbo6boo275bo3bo4b5o49bobbo8bo299bo52boo162booboo119boo 7bo17boo26b4o95bo5boo11boo$94boo3bobobboo278boo5bobbo3boboo4boo357bo3b o213b4o32bo85boo5bobbo17bobo13boo11boo90boo5boob3o$93b4o3bo8bo259bobbo 5boo3booboo11bo6bobo29boo325b4o54bobbo157boo7boo24bobo84boo4b3o32bo 105booboo73b4o$55b4o33booboo12bo258bo8b4o3b4o18bo30boob4obo7bo299boo 67bo162bo7boo24boo86bo3boo15bo17bo6boo3boo94b4o57bobbo12bo3bo$39bobbo 12bo3bo33boo29bo243bo3bo3booboo4boo51b5obbo7bo297bo70bo3bo156bo3bo8bo 7bo123bo17bo7bobbo97boo57bo16bo$38bo16bo67bo244b4o5boo30b5o25b3o3bo 304bo6boo3boo41b4o13b4o156bo5bo7b3o4bo122bobo17b12oboo110b4o39bo3bo13b obbo$38bo3bo13bobbo63b3o275boo6bo4bo36bo298bo7bobbo43bo3bo126boo44bo5b o7bo6b3o99boo20bo23boobboob3o110bo3bo38b4o$38b4o69boo288bobo5bo41bo 298b12oboo40bo114boo13booboo42b6o116b4o18boo28bobo112bo$110booboo273bo 12bo8bo3bo23b4o313boobboob3o41bobbo109b4o13b4o163booboo49bo114bo$111b 4o257boo13bobbo21bo25bo3bo317bobo155booboo14boo165boo15boo24boo125boo 53boo3b3o$51boo13bo45boo256booboo11bo3bo47bo322bo48bo6boo13bo86boo199b ooboo21booboo167boo9boobbo3bo5bo$51boo4bo7bo47bo5b3o248bobbo12bo3bo5b oo41bobbo308boo55bobbo5boo13bobo286b4o22b4o33boo5boo3bo74boo3boobo36b oobbo11bo5bo3bo$40b3o13b3o6b3o43bo3bo3boobo247bobbo12bo3bo5bobo22bobbo 325booboo52bo9boo4bo8boo153b4o131boo24boo33boob4o5bobbo71boob3ob3o36bo bb3o10bo9b3o$40bo18bo50bo5bo5bo53boo193boo9boo3bobo6bo23bo28boo231bobb o65b4o52bo6boobo4b3o106boo14bo23bobbo12bo3bo138boo52b5o9bo72b7o38bo4bo 10bo5bo$40bobo3boo7b5o50bo5bo3b3o52b4o203boo4bo31bo3bo7bo15boo22b4o 205bo70boo53boo4b5o6boo104bobbo11boo23bo16bo141b4o24boo26b3o10bo73b4o 41b5o11boobo36bo$41boo7bo20bo38b6obo3bo52booboo121boo118b4o4bo3b3o15bo 5bobbo12bo3bo204bo3bo48boo73bo4b3o3boo15bo11bo71boo13b3o7boo22bo3bo13b obbo136booboo24bobo33boobo89b4o29boo27bo22bo3bo$70bo48bo38boo15boo107b oo13booboo65bobbo53boo5boo20bo16bo191b4o13b4o48b4o24boo48boo24bobo7bo 3bo68boo5bo8bobbo30b4o155boo5boob3o15bo37bo90bo3bo56bo22bo$70b3o6b5o 73booboo121b4o13b4o64bo57b3o6bo8bo10bo3bo13bobbo187bo3bo63booboo24bobo 73boo7bo52b4o18boo4bo3bo3booboo52b3o140bo5boo41b4o98bo8b6o14bobbo5boo 21b3o20bo4bo$39bobbo5boo29bo4bo73b4o120booboo14boo65bo3bo53boo5boo9boo 9b4o205bo68boo5boob3o15bo84bo4bo31bobbo12bo3bo18bo3bo4bo20bo181boo7bo 8bo31bo3bo98bobbo4bo5bo12bo8b4o43b5o$38bo8b4o28bo36bobbo19bo19boo122b oo83b4o13b4o31b4o4bo3b3o9boo77boo140bobbo70bo5boo58b4o5boo30b5o9bo21bo 16bo29bo20boo24boo14bobbo139bo5boo8bobo30bo110bo18bo3bo3booboo$38bo3bo 3booboo25bo3bo3bo30bo22bo246bo3bo24bobbobbo3bo7bo74boo13booboo163bo47b oo7bo8bo48bo3bo3booboo4boo18bo17bobo19bo3bo13bobbo47boo7boo12bo18bobo 133boo5boob3o12bo30bobbo107bo4bo12b4o5boo5boo$38b4o5boo5boo19bo7bo31bo 3bo18b3o25bo3bo13bobo101bo21bo74bo19boo6bo6bo49boo3b3o28b4o13b4o142boo 19bobo46bo5boo8bobo47bo8b4o3b4o17bobo15boo20b4o34boo37boob3o7boo4boo 20bo113bobbo5boo3booboo19bo145boo29booboo8bo$53booboo12bo4b3o20b4o13b 4o42b3o5boo13boo104bo17boo76bobbo14booboo4bo3bo3bobbo22b3o9boo9boobbo 3bo5bo20booboo14boo141b5o18boo41boo5boob3o12bo47bobbo5boo3booboo17boo 75b4o4b4o29b5o7bo6boo18bo113bo8b4o3b4o37boo158b4o3bo4bobo$54b4o3bo8bo 12boo13bo3bo57b3obo9boo9bo100boobbo3bo14boo94b4o4b4o22boo5b5o6boobbo 11bo5bo3bo22boo158bo4bobb3obo39bobbo5boo3booboo19bo64boo5boob3o84boob oo4bo3bo3bobbo18bo3b3o8bo7boo17b3o111bo3bo3booboo4boo37boob4obo153boo 3bo5bobbo$55boo3bobobboo31bo60boo8bo6bo108bo5bob3obbo107boo30boo5boob 3o6bobb3o10bo9b3o42bo137bobb3o3bo3boo36bo8b4o3b4o90bo5boo60boo13bo8boo 6bo6bo20boo16bobbo3bo132b4o5boo23boo5b5o11b5obboo156bobbo6bo$59bo3boo bbo6boo23bobbo57bob8o3bo3bo106boobbobobb5obo140bo5boo9bo4bo10bo5bo47b 3o136boobbo7bobo14bo21bo3bo3booboo4boo90boo7bo59boo4bo7bo18bobbobbo3bo 11boo4boo5bo11bo171bobo4bo4bo11b3o3bo153boo3bo5bobbo$55boo3bobobboo52b 3o39b4o7bo3bo12bobo93boo3bo5booboo14bo97bo44b5o11boobo33bo11bo3boobo 137boo7boobo14bobo10bo8b4o5boo23boo5b5o64bo5boo49b3o13b3o6b3o22b4o11bo 14bo40bo5b5o131bo6bo175b4o3bo4bobo$54b4o3bo8bo32bo10bobobo3bo40bo8bo 16boo9b3o83b3o7bobbo13boo93b3o3bo45boo27bo19b4o10bo6bo147boo15boo9bo3b o40bobo4bo4bo57boo5boob3o50bo18bo36b3obboo7bo8bo7bobbo5boo22bo6bo4bo 101bobo34bo3bo26bo142booboo8bo$53booboo12bo30b3o10bo7bo67bo8b5o110boo 91b3obo3bo18boo52bo7b5o7bob5o14bo6bo141bo26bo45bo6bo47boo12booboo59bob o3boo7b5o36b3obboo8bo14bo8b4o21b3o4bo105bo3boo34bo12b4o11boo143boo$54b oo44bo3bo15boo5bo39bobbo27boob3o93boo25boo80boo6bo18boo21bobbo5boo21b 3o5bo4bo5boo6bo18boo169bo4bo11bobo34bo3bo42b3o12b4o60boo7bo20bo24b3obb oo7bo15bo3bo3booboo29bo3bo98boobob3o8bo10boo26bo3bo10boo$100bo4b3o19bo bo28boo6bo32boo83boo37boob3o78bob5o14bo6bo19bo8b4o28bo11b3obo3bo18boo 127b4o5boo25bo4b5o11bo3boo34bo43boboo13boo28bo61bo19b4o11bo20b4o5boo5b oo26bo100bo4b3o19bobo25bo16bo$100boobob3o8bo10boo28booboo4bo3bo23bobo 86b4o4b4o25bo3b5o79b4o10bo6bo25bo3bo3booboo29bo3bo7b3o3bo148bo3bo3boob oo4boo17bobo16boobob3o8bo10boo28b4o25b3o32boo10bobo59b3o6b5o6bo3bo11b oo33booboo8bo116bo3bo15boo5bo28bobbo173boo$72boo28bo3boo34bo15b4o4b4o 3b4o17boo86booboo4bo3bo3bobbo15boo5b3o82bo11bo3boobo25b4o5boo5boo21bo 4bo14bo149bo8b4o3b4o16boo17bo4b3o19bobo11bobbo12bo3bo25bo32b4o9boo29bo bbo5boo29bo4bo5bo51b4o3bo4bobo9boo104b3o10bo7bo15bobbo190booboo$60boo 9booboo27bobo34bo3bo14boo12bo3bo10bo6bo5bo81boo6bo6bo20boo105b3o41boob oo8bo9bo47bo5boo116bobbo5boo3booboo11bo23bo3bo15boo5bo12bo16bo61booboo 39bo8b4o28bo11bobbo48boo3bo5bobbo7bo108bo10bobobo3bo14bo195b4o$58bo4bo 8b4o56bo6bo33bo7boo4bobo10boo90bobbobbo3bo7bo116bo43b4o3bo4bobo7b3o11b oo30boo5boob3o128boo5bobbo3boboo22b3o10bo7bo17bo3bo13bobbo58boo41bo3bo 3booboo25bo3bo3bo24bobbo34bobbo6bo8boo122b3o15bo3bo11boo179boo7boo$57b o15boo57bobo4bo4bo29bobbobb4o3bobboo8boo96b4o4bo3b3o92boo65boo3bo5bobb o19b4o4b4o22boo5b5o134bo3bo4b5o22bo10bobobo3bo17b4o87bobo29b4o5boo5boo 19bo6bo25bo34boo3bo5bobbo112bobbo34b4o11bo182bo7boo$49bobbo4bo5bo10bo 23b4o5boo23boo5b5o35boo3bo5boboo110boo5boo12bo78booboo14boo51bobbo6bo 18booboo4bo3bo3bobbo22b3o134boo4bo4bobbo38b3o109bobbo43booboo8bo8b3o 30bo3bo29b4o3bo4bobo14bo97bo44b3obboo7bo175bo3bo8bo$48bo8b6o9bo3bo21bo 3bo3booboo4boo57bobbobb4o3bobboo112b3o6bo9boo80b4o13b4o46boo3bo5bobbo 19boo6bo6bo164bo3bo4b5o18bobbo121boo53b4o3bo4bobo39b4o29booboo8bo15bo 98bo3bo40b3obboo8bo173bo5bo7b3o$48bo3bo18bo5boboo17bo8b4o3b4o55bo7boo 4bobo114boo5boo11boo80boo13booboo45b4o3bo4bobo29bobbobbo3bo7bo146boo5b obbo3boboo19bo54boo13bo50b8o8bo44boo3bo5bobbo49bo22boo26b3o96b4o13b4o 24b3obboo7bo3boo169bo5bo7bo$48b4o19bo5boo20bobbo5boo3booboo11bo7bo35bo 3bo10bo109b4o4bo3b3o109boo46booboo8bo37b4o4bo3b3o9boo132booboo11bo21bo 3bo50boo4bo7bo51bo6bo6boo49bobbo6bo47boobo165bo3bo17b4o11bo7boo170b6o$ 34b4o33b6o37boo5bobbo3boboo5bobo33b4o121bo3bo7bo160boo54boo5boo9boo 102bo30b4o26bo6b4o13b4o23b3o13b3o6b3o49bo60boo3bo5bobbo39b3o10bo163bo 15bobbobbo3bo11boo7bo$33b7o4boo74bo3bo4b5o3boo159bo228b3o6bo8bo104bo 30boo27bobo21bo3bo22bo18bo58bo4bo53b4o3bo4bobo39b5o9bo37boo125bobbobb oo6bo6bo$32boob3oboobbobo73boo4bo4bobbo165bobbo224boo5boo112b3o48boo9b oo22bo26bobo3boo7b5o60boo54booboo8bo40boob4o5bobbo36booboo128booboo4bo 3bo3bobbo22b3o$33boo3boobbobboo73bo3bo4b5o57b4o122bobbo168boo30b4o4bo 3b3o15bo146b4o33bobbo23boo7bo20bo60bo44boo52boo5boo3bo39b4o129b4o4b4o 22boo5b5o$42bobbo68boo5bobbo3boboo59bo3bo120bo171booboo28bo3bo7bo15boo 146booboo89bo58b4o76bo74boo7boo122boo30boo5boob3o$36boo4bobo68booboo 11bo61bo124bo3bo168b4o28bo28boo146boo91b3o6b5o45boo77bo76bo7boo156bo5b oo$34bo8bo70b4o74bo123b4o170boo30bobbo182bo51bobbo5boo29bo4bo42bo67boo 11b3o40bo31bo3bo8bo127bo$33bo21bo59boo77boo295bo48bobbo163bobo49bo8b4o 28bo47b4o63booboo46boo4bo30bo5bo7b3o120b3o3bo$33bo3bo18boo75boo63b3o 121booboo162bo3bobboo41bo106bobo53boobboob3o47bo3bo3booboo25bo3bo3bo 41bo10bo57b4o45booboobboo29bo5bo7bo121b3obo3bo18boo$33b4o18boo75b4o11b o43boo3boo3bo115b3o5boo161bo5boboo41bo3bo103boo48b12oboo47b4o5boo5boo 19bo6bo42b3obbo4b3o58boo47b4ob3o29b6o129boo6bo18boo$17boo87bo24booboo 11bobo40boob3obobbo115b5o6bo160bo5b4o41b4o104bo49bo7bobbo65booboo17b3o 48b3o5boo61bo48b4o3boboo161bob5o14bo6bo$16b4o85bo26boo13boo42b9o115boo b4o3boo161b6o58bo144bo6boo3boo64b4o3bo5b3o57bo6bo60bo3bo50bob5o162b4o 10bo6bo$15booboo11bo73b3o35bobo46b4o120boo5bobbo225bo90bo54bo77boo3bob oo3b3obbo55b3obobo59bo5boboo45booboo167bo11bo3boobo$16boo5bobbo3boboo 109bobbo176bobo214b3o3bo94bobo56boo78bo3bo6bobo8bo46bobboo61bo5boo49bo 185b3o$22bo3bo4b5o100boo68boo331b5obbo7bo87boo132boo3boboo3b3obbo7bo 48boo3bo59b6o47booboo186bo$21boo4bo4bobbo95b8o8bo57b7o124bo165b4obboo 28boob4obo7bo220b4o3bo5b3o10b3o47b4o112b5o165boo$22bo3bo4b5o7boo86bo6b o6boo57boob4obo117boo4bo165bo3boo31boo233booboo187boob3o164booboo14boo $16boo5bobbo3boboo11bo85bo73boo3bo118booboobboo164bo5bobbo263boo76b4o 110boo168b4o13b4o$bobbo5boo3booboo11bo5boo4boo87bo4bo192b4ob3o165bo10b o51bo285boo3bo71b4obboo201boo13booboo$o8b4o3b4o17bobo94boo74boo4boo 113b4o3bo166bobbo5bo49boo171boo112bobboo73bo3boo180b4o35boo$o3bo3boob oo4boo18bo108bo3boo57b3o123boboo168boo4bo51boo169booboo52boo56b3obobob o69bo5bobbo176bo3bo$4o5boo30b5o99bo6bo57boo122booboo167bo230b4o51boob oo53bo6bobo8boo60bo7bo140bo35bo$41bo4bo98bo190bo167bo4bo228boo53b4o52b 3o5boo8boob3o59bobbo3bo139bobo34bobbo$32boo7bo103b5oboo53boo124booboo 166bo290boo52b3obbo4b4o6b5o61boobbo140boo87boo$6boo24bobo7bo3bo104boo 52boob3o120b5o167bo4bo28bobo255bo5b3o45bo12bo6b3o61bo130bo103boo$4bo4b 3o3boo15bo11bo105bobo53b5o119boob3o167b5o30boo253bo3bo3boobo45b4o4b3o 70bo4bo40boo84bo$bboo4b5o6boo129bobbo53b3o121boo205bo253bo5bo5bo45bo6b oobobobo65bo45boob4o62bo17b3o$bbo6boobo4b3o130bobo639bo5bo3b3o47boo3bo 4bobo6bo58bo4bo41b6o61bo$bbo9boo4bo8boo763b6obo3bo13bo34b4obo4boobo6bo 57b5o43b4o64bo$3bobbo5boo13bobo116b5o650bo14bo38b4o4boo6boo$5bo6boo13b o118bo4bo664b3o39bo5bo6bo172bo118boo$146bo56boo118boo118boo118boo118b oo357b3o4bo112bobbo3bo$bobbo142bo3bo50bobbo116bobbo112boobbobbo112boo bbobbo112boobbobbo362bobo112boo3bobo$o148bo52bobbo116bobbo112boobbobbo 112boobbobbo112boobbobbo113boo118boo118boo6bobbo108boo6bobbo$o3bo198b oo118boo118boo118boo118boo114bobo117bobo117bobo6boo109bobo6boo$4o13b4o 775boobobo114boobobo114boobobo114boobobo10bo$17bo3bo178boo118boo118boo 118boo118boo114booboboo113booboboo113booboboo113booboboo9bo$17bo182bo bbo116bobbo116bobbo116bobbo116bobbo116bobbo116bo3bobbo112bo3bobbo112bo 3bobbo4bo$18bobbo179b3o117b3o117b3o117b3o117b3o117b3o117b7o113b7o113b 7o$$18bobbo179b3o117b3o117b3o117b3o117b3o117b3o117b7o113b7o113b7o$17bo 182bobbo116bobbo116bobbo116bobbo116bobbo116bobbo116bo3bobbo112bo3bobbo 112bo3bobbo$17bo3bo178boo118boo118boo118boo114booboboo113booboboo113b ooboboo113booboboo113booboboo$4o13b4o655boobobo114boobobo114boobobo 114boobobo114boobobo$o3bo198boo118boo118boo118boo114bobo117bobo117bobo 117bobo6boo109bobo6boo$o148bo52bobbo112boobbobbo112boobbobbo112boobbo bbo113boo118boo118boo118boo6bobbo108boo6bobbo$bobbo142bo3bo50bobbo112b oobbobbo112boobbobbo112boobbobbo482bobo112boo3bobo$146bo56boo118boo 118boo118boo477b3o4bo112bobbo3bo$5bo6boo13bo118bo4bo664b3o39bo5bo6bo 172bo118boo$3bobbo5boo13bobo116b5o650bo14bo38b4o4boo6boo$bbo9boo4bo8b oo763b6obo3bo13bo34b4obo4boobo6bo57b5o43b4o64bo$bbo6boobo4b3o130bobo 639bo5bo3b3o47boo3bo4bobo6bo58bo4bo41b6o61bo18boo$bboo4b5o6boo129bobbo 89boo50b3o236boo256bo5bo5bo45bo6boobobobo65bo45boob4o62bo17bobo$4bo4b 3o3boo15bo11bo105bobo89boob3o46b5o56b4o176boo111boo143bo3bo3boobo45b4o 4b3o70bo4bo40boo84bo$6boo24bobo7bo3bo104boo90b5o45boob3o40bobbo12bo3bo 174bo112boob3o142bo5b3o45bo12bo6b3o61bo234boo$32boo7bo103b5oboo91boob oo45boo42bo16bo292b5o141boo52b3obbo4b4o6b5o61boobbo229boo$41bo4bo98bo 102bo89bo3bo13bobbo179boo52bobbo52booboo139b4o52b3o5boo8boob3o59bobbo 3bo166bobbo$4o5boo30b5o99bo6bo93booboo47boo38b4o196bobo51bo60bo138boob oo53bo6bobo8boo60bo7bo166bo$o3bo3booboo4boo18bo108bo3boo95boboo46b3o 64bo175bo51bo3bo54booboo137boo56b3obobobo69bo5bobbo166bo3bo20bobbo$o8b 4o3b4o17bobo94boo107b4o3bo47boo4boo57bo228b4o56bob5o192bobboo73bo3boo 170b4o20bo$bobbo5boo3booboo11bo5boo4boo87bo4bo104b4ob3o113b3o282b4o3bo boo27boo164boo3bo71b4obboo147boo43bo3bo$16boo5bobbo3boboo11bo85bo109b ooboobboo43boo3bo43boo4bo298b4ob3o29bo4bo85boo76b4o110boo115bobo25b4o 13b4o$22bo3bo4b5o7boo86bo6bo6boo95boo4bo43boob4obo39booboo3b4o294boob oobboo28bo90booboo187boob3o112bo27bo3bo$21boo4bo4bobbo95b8o8bo100bo44b 7o40bobbo4b5o16bo171bo105boo4bo29bo6bo6boo76b4o3bo5b3o10b3o47b4o112b5o 140bo22boo$22bo3bo4b5o100boo156boo44bobbo9bo14bo172boo35boo73bo29b8o8b o76boo3boboo3b3obbo7bo48boo3bo59b6o47booboo140bobbo20bo$16boo5bobbo3bo boo109bobbo88bobo103boo8boo15b3o169bobo34boo109boo90bo3bo6bobo8bo46bo bboo61bo5boo49bo164bo$15booboo11bo73b3o35bobo82boo5bobbo41b4o67bo227bo 76boo37bobbo77boo3boboo3b3obbo55b3obobo59bo5boboo45booboo162boo$16b4o 85bo26boo13boo78boob4o3boo40b9o91b5o169boo5boo3bo67boo20boo38bobo77b4o 3bo5b3o57bo6bo60bo3bo50bob5o137boo3boo$17boo87bo24booboo11bobo78b5o6bo 38boob3obobbo50bobbo5boo24bo4bo4bo167boob4o5bobbo64boob4obo16bo26boo 88booboo17b3o48b3o5boo61bo48b4o3boboo136bobo6bo$33b4o18boo75b4o11bo81b 3o5boo40boo3boo3bo9bo38bo8b4o22bo5bo173b5o9bo65b5obboo41booboo71b4o5b oo5boo19bo6bo42b3obbo4b3o58boo47b4ob3o29b6o105bo6bobbo17bo$33bo3bo18b oo75boo99booboo47b3o9boo38bo3bo3booboo22b3o4bo3bo169b3o10bo66b3o3bo43b 4o9boo60bo3bo3booboo25bo3bo3bo41bo10bo57b4o45booboobboo29bo5bo7bo96b3o 7boo16bobo$33bo21bo59boo165boo14bobo18boo17b4o5boo5boo26bo179boobo119b oo10bobo59bo8b4o28bo47b4o63booboo46boo4bo30bo5bo7b3o103boo17boo12bo$ 34bo8bo70b4o110b4o48bo22boo13booboo30booboo206bo102boo28bo62bobbo5boo 29bo4bo42bo67boo11b3o40bo31bo3bo8bo136bo3bo$36boo4bobo68booboo11bo98bo 3bo46bo22b4o13b4o31b4o3bo5b3o183b4o76b4o29b4o121b3o6b5o45boo77bo76bo7b oo137bo$42bobbo68boo5bobbo3boboo96bo50bo3bo17booboo14boo33boo3boboo3b 3obbo180bo3bo75bo3bo27booboo121bo58b4o76bo74boo7boo131bo5bo4bo$33boo3b oobbobboo73bo3bo4b5o95bobbo46b4o19boo55bo3bo6bobo180bo79bo32boo5boob3o 56bobbo23boo7bo20bo60bo44boo52boo5boo3bo39b4o90boo12b4o5boo24bobo3b5o$ 32boob3oboobbobo73boo4bo4bobbo77bobbo109bo30boo3boboo3b3obbo181bobbo 76bobbo34bo5boo54bo26bobo3boo7b5o60boo54booboo8bo40boob4o5bobbo36boob oo74boo13booboo10bo3bo3booboo4boo16boo$33b7o4boo74bo3bo4b5o3boo71bo 112b3o28b4o3bo5b3o166bobbo76bobbo51boo7bo53bo3bo22bo18bo58bo4bo53b4o3b o4bobo39b5o9bo37boo75b4o13b4o10bo8b4o3b4o$34b4o33b6o37boo5bobbo3boboo 5bobo70bo3bo11boo33b4o42bo11bo3boobo26booboo26bo150bo79bo56bo5boo37b4o 13b4o23b3o13b3o6b3o49bo60boo3bo5bobbo39b3o10bo113booboo14boo12bobbo5b oo3booboo11bo$48b4o19bo5boo20bobbo5boo3booboo11bo7bo72b4o11bo35bo3bo 39b4o10bo6bo27boo27bo151bo3bo11boo10boo50bo3bo7bo38boo5boob3o38bo3bo 50boo4bo7bo51bo6bo6boo49bobbo6bo47boobo116boo45boo5bobbo3boboo6bo$48bo 3bo18bo5boboo17bo8b4o3b4o98b3obboo7bo30bo7bo34bob5o14bo6bo50b3o149b4o 11bo11boo51b4o4bo3b3o21bobbo5boo3booboo17boo28bo54boo13bo50b8o8bo44boo 3bo5bobbo49bo22boo26b3o117bo3bo4b5o4bobo$48bo8b6o9bo3bo21bo3bo3booboo 4boo99b3obboo8bo3boo25bobbobb7o28boo6bo18boo209b3obboo7bo8bo56boo5boo 11boo7bo8b4o3b4o17bobo28bobbo121boo53b4o3bo4bobo39b4o29booboo8bo15bo 118boo4bo4bobbo4boo$49bobbo4bo5bo10bo23b4o5boo23boo5b5o72b3obboo7bo3b oo31boob3obbo28b3obo3bo18boo39boo167b3obboo8bo64b3o6bo9boo8bo3bo3boob oo4boo18bo50b3o109bobbo43booboo8bo8b3o30bo3bo29b4o3bo4bobo14bo79boo4bo 32bo3bo4b5o$57bo15boo57bobo4bo4bo65b4o11bo10bo25bobbobb7o30b3o3bo59boo boo165b3obboo7bo65boo5boo12bo7b4o5boo30b5o26bo10bobobo3bo17b4o87bobo 29b4o5boo5boo19bo6bo25bo34boo3bo5bobbo82boo9boo3b3o7bo17boo5bobbo3bob oo$58bo4bo8b4o56bo6bo64bobbobbo3bo11boo33bo7bo14bo25bo61b4o159b4o11bo 7boo55b4o4bo3b3o61bo4bo23b3o10bo7bo17bo3bo13bobbo58boo41bo3bo3booboo 25bo3bo3bo24bobbo34bobbo6bo8boo71bobbo12booboo4boo17booboo11bo$60boo9b ooboo27bobo34bo3bo50boo6bo6bo36boo12bo3bo17boo6boo44bo5boo28boo154bobb obbo3bo11boo4boo50bobbobbo3bo7bo54boo7bo27bo3bo15boo5bo12bo16bo61boob oo39bo8b4o28bo11bobbo48boo3bo5bobbo7bo72boobbo11b3ob3o4boo17b4o$72boo 28bo3boo34bo51booboo4bo3bo3bobbo15boo5b3o6b4o4b4o3b4o18bobo17boo30boo 5boob3o26bo5b3o137boo6bo6bo23bo40boo6bo6bo20boo18boo24bobo7bo3bo22bo4b 3o19bobo11bobbo12bo3bo25bo32b4o9boo29bobbo5boo29bo4bo5bo51b4o3bo4bobo 9boo71boobbo11boob3o24boo$100boobob3o8bo10boo66b4o4b4o22boo5b5o4booboo 4bo3bo43b4o4b4o22boo5b5o24bo3bo3boobo135booboo4bo3bo3bobbo22b3o34boob oo4bo3bo3bobbo15boo5b3o9bo4b3o3boo15bo11bo24boobob3o8bo10boo28b4o25b3o 32boo10bobo59b3o6b5o6bo3bo11boo33booboo8bo85b4o12bobo44boo$100bo4b3o 19bobo66boo33bo3boob3o5boo6bo32boo12booboo4bo3bo3bobbo22b3o24bo5bo5bo 136b4o4b4o29b5o34b4o4b4o25bo3b5o6boo4b5o6boo50bo3boo34bo43boboo13boo 28bo61bo19b4o11bo20b4o5boo5boo26bo100bo30b4o$54boo44bo3bo15boo5bo108b oo17bobbo20bo6boob3o10boo6bo6bo53bo5bo3b3o137boo30boo5boob3o35boo37boo b3o6bo6boobo4b3o52bobo34bo3bo42b3o12b4o60boo7bo20bo24b3obboo7bo15bo3bo 3booboo29bo3bo96boo7boo21booboo$53booboo12bo30b3o10bo7bo155boo7b5o19bo bbobbo3bo7bo41b6obo3bo169boo7boo51boo25boo9bo9boo4bo8boo72bo6bo47boo 12booboo59bobo3boo7b5o36b3obboo8bo14bo8b4o21b3o4bo70boo30boo5boob3o19b oo$54b4o3bo8bo32bo10bobobo3bo75bo7b3o16boo51bobo7b3o26b4o4bo3b3o9boo 37bo173bo76boo20bobbo5boo13bobo71bobo4bo4bo57boo5boob3o50bo18bo36b3obb oo7bo8bo7bobbo5boo22bo6bo4bo64b4o4b4o29b5o29bo$55boo3bobobboo52b3o75b oo9bo15boo23boo13b3o56boo5boo9boo180b4o12bobo61b3o7bobbo13boo23bo6boo 13bo39b4o5boo23boo5b5o64bo5boo49b3o13b3o6b3o22b4o11bo14bo40bo5b5o64boo boo4bo3bo3bobbo22b3o29bobo$59bo3boobbo6boo23bobbo93boobo6b3o17bo21bobo 13b4o55b3o6bo8bo44boo134boobbo11boob3o58boo3bo5booboo14bo84bo3bo3boob oo4boo90boo7bo59boo4bo7bo18bobbobbo3bo11boo4boo5bo11bo105boo6bo6bo23bo 29boobboob3o$55boo3bobobboo31bo98bobo3b3o41boobo12bo3bo6bo48boo5boo53b ooboo131boobbo11b3ob3o4boo51boobbobobb5obo34bobbo62bo8b4o3b4o90bo5boo 60boo13bo8boo6bo6bo20boo16bobbo3bo109bobbobbo3bo7bo9boo25b12oboo$54b4o 3bo8bo12boo13bo3bo95boo48boo14b3o6boo42b4o4bo3b3o15bo38b4o132bobbo12b ooboo4boo53bo5bob3obbo34bo67bobbo5boo3booboo19bo64boo5boob3o84booboo4b o3bo3bobbo18bo3b3o8bo7boo17b3o94b4o4bo3b3o8boo24bo7bobbo$53booboo12bo 4b3o20b4o13b4o101boo27bo9boo3b3o6bobo41bo3bo7bo15boo40boo134boo9boo3b 3o7bo53boobbo3bo14boo22bo3bo78boo5boob3o12bo47bobbo5boo3booboo17boo75b 4o4b4o29b5o7bo6boo18bo74bobbo24boo5boo34bo6boo3boo$38b4o5boo5boo19bo7b o31bo3bo18b3o78boo38boo56bo28boo40bo145boo4bo66bo17boo23b4o13b4o68bo5b oo8bobo47bo8b4o3b4o17bobo15boo20b4o34boo37boob3o7boo4boo20bo72bo28b3o 6bo34bo$38bo3bo3booboo25bo3bo3bo30bo22bo81bo97bobbo64bo3bo214bo21bo39b o3bo66boo7bo8bo48bo3bo3booboo4boo18bo17bobo19bo3bo13bobbo47boo7boo12bo 18bobo77bo3bo24boo5boo37boo11boo$38bo8b4o28bo36bobbo19bo55boo22bo27boo 87bobbo45bo5boboo272bo71bo5boo58b4o5boo30b5o9bo21bo16bo29bo20boo24boo 14bobbo60b4o13b4o19b4o4bo3b3o49b4o$39bobbo5boo29bo4bo109booboo14boo31b 4o85bo49bo5boo127boo78boo66bobbo61boo5boob3o15bo84bo4bo31bobbo12bo3bo 18bo3bo4bo20bo103bo3bo35bo3bo7bo50booboo$70b3o6b5o111b4o13b4o29booboo 85bo3bo45b6o128booboo14boo59booboo14boo112booboo24bobo73boo7bo52b4o18b oo4bo3bo3booboo52b3o61bo39bo63boo$70bo48bo76boo13booboo30boo15boo38b4o 28b4o181b4o13b4o59b4o13b4o112b4o24boo48boo24bobo7bo3bo68boo5bo8bobbo 30b4o83bobbo36bobbo184b4o$41boo7bo20bo38b6obo3bo90boo48booboo20bobbo 12bo3bo40bo172boo13booboo60boo13booboo113boo73bo4b3o3boo15bo11bo71boo 13b3o7boo22bo3bo13bobbo123bobbo165b6o$40bobo3boo7b5o50bo5bo3b3o140b4o 19bo16bo44bo188boo78boo133boo53boo4b5o6boo104bobbo11boo23bo16bo82boo4b o37bo49boo110boo5boob4o$40bo18bo50bo5bo5bo141boo20bo3bo13bobbo28b3o3bo 408b4o52bo6boobo4b3o106boo14bo23bobbo12bo3bo67boo9boo3bobo6bo29bo3bo 40b8obo106b4o5boo$40b3o13b3o6b3o43bo3bo3boobo163b4o45b5obbo7bo399boob oo52bo9boo4bo8boo153b4o67bobbo12bo3bo5bobo27b4o41bo8bo105booboo$51boo 4bo7bo47bo5b3o212boob4obo7bo400boo55bobbo5boo13bobo223bobbo12bo3bo5boo 41bo31bo6bo108boo$51boo13bo45boo221boo424bo48bo6boo13bo86boo137booboo 11bo3bo48bo32bo$111b4o186boo3b3o451bobo155booboo14boo45boo74boo13bobbo 21bo14b3o3bo40boo95b6o$110booboo175boo9boobbo3bo5bo34bobbo8bo392boobb oob3o41bobbo109b4o13b4o42bo4bo88bo12bo8bo3bo11b5obbo7bo129bo5b4o$38b4o 69boo175boobbo11bo5bo3bo34bo10boo388b12oboo40bo114boo13booboo41bo21boo 84bobo5bo15boob4obo7bo129bo5boboo14boo$38bo3bo13bobbo63b3o162bobb3o10b o9b3o32bo3bo7boo387bo7bobbo43bo3bo126boo43bo6bo6boo6bobo83boo6bo4bo11b oo144bo3bobboo13bobo$38bo16bo67bo164bo4bo10bo5bo38b4o397bo6boo3boo41b 4o13b4o155b8o8bo5bo52b4o5boo30b5o160bo18boo$39bobbo12bo3bo33boo29bo 164b5o11boobo442bo70bo3bo159boo68bo3bo3booboo4boo54bobbo128boo17b3o$ 55b4o33booboo12bo181boo27bo34booboo393boo67bo170bobbo59bo8b4o3b4o18bo 33bo131b4o17boo$93b4o3bo8bo209bo7b5o18b3o5boo405b4o54bobbo166bobo61bo bbo5boo3booboo9bo8bobo31bo3bo126booboo$94boo3bobobboo181bobbo5boo21b3o 5bo4bo16b5o6bo404bo3bo212boo88boo11bo8boo32b4o128boo$98bo3boobbo6boo 171bo8b4o28bo20boob4o3boo405bo52boo161booboo92bobo4boobbo$94boo3bobobb oo180bo3bo3booboo29bo3bo16boo5bobbo406bo8bo40bo165b4o91boobbo7bo44boob oo103b4o$93b4o3bo8bo176b4o5boo5boo21bo4bo25bobo409boo4bobo38bo6boo3boo 154boo39boo52bobo4boobbo39b3o5boo103bo3bo9bo$92booboo12bo191booboo12bo 5bo449bobbo37bo7bobbo138boo57bobo45boo11bo42b5o6bo102bo11boo22b5o$77b 4o5boo5boo18b3o5bo180b4o3bo8bo5b3o438boo3boobbobboo36b12oboo134b4o56bo 46booboo9bo41boob4o3boo104bobbobboo5b3o19bo4bo$77bo3bo3booboo23bo5bo3b o179boo3bobobboo46bo402boob3oboobbobo42boobboob3o133booboo11bo92b4o52b oo5bobbo109b3o6b3o18bo$77bo8b4o24bo3bo188bo3boobbo6boo37boo402b7o4boo 47bobo136boo5bobbo3boboo91boo60bobo105bobbobboo5b3o7bo12bo3bo$78bobbo 5boo29bo4bo179boo3bobobboo15bo29bobo403b4o56bo143bo3bo4b5o81boo24boo 11bo137bo11boo9boo14bo$118b5o179b4o3bo8bo10bo486boo151boo4bo4bobbo4boo 74b4o22b4o10bobo121boo12bo3bo9bo8bobo$82bo9boo14b3o190booboo12bo10b3o 483booboo10boo138bo3bo4b5o4bobo72booboo21booboo10boo121b4o4b4o3b4o$80b 3o8b5o12bo193boo512b4o10bobo131boo5bobbo3boboo6bo58boo15boo24boo134boo boo4bo3bo$79bo3bo5bo4boo13bo210bobbo493boo11bo118bobbo5boo3booboo11bo 66booboo176boo6bo25bo6boo$79bo4b5o5boo223bo479boo147bo8b4o3b4o79b4o47b o137bobbo20boo5boob3o$79boobob4o4boo225bo3bo474b4o146bo3bo3booboo4boo 16boo63boo44b6o132bo27bobo5b5o$81bo3boob3o12b3o213b4o474booboo9bo136b 4o5boo24bobo3b5o74bo20b8o3bo133bo34b3o32bobbo$82bobo18bo694boo11bo171b o5bo4bo67boo3b3o19bo8boo130boobbo11bo56bo$104bo699bobo4boobbo173bo60b 3o9b3ob5o18bo6b3o130bo5bo9bo10bo46bo3bo$320b3o3bo476boobbo7bo174bo3bo 54boo3bo9b3o8bobo12bo5boo130boobbobo9b3o8boo46b4o$77b4o238b5obboo476bo bo4boobbo143boo17boo12bo55boobbobo9b3o8boo15boo11boo122boo3bo9b3o8bobo $77bo3bo13bobbo219boob4obo471boo11bo8boo128b3o7boo16bobo68bo5bo9bo10bo 27b4o122b3o9b3ob5o$77bo16bo224boo462bobbo5boo3booboo9bo8bobo127bo6bobb o17bo71boobbo11bo36booboo134boo3b3o$78bobbo12bo3bo236bobbo443bo8b4o3b 4o18bo129bobo6bo94bo34b3o12boo142bo$94b4o236bo11boo434bo3bo3booboo4boo 150boo3boo25boo67bo27bobo5b5o22bobo110boo$334bo3bo5bo4bo432b4o5boo30b 5o145boo6bo5boo67bobbo20boo5boob3o22bobbo108b4o69b6o$334b4o5bo471boo6b o4bo144bo6bo6b3o57boo6bo25bo6boo18boo116booboo69bo5bo7bo$343bo5bo465bo bo5bo125bobbo20bo6bo8boo55booboo4bo3bo43b8o8bo107boo15boo54bo5bo7b3o$ 343b6o453bo12bo8bo3bo119bo22boo7b8o3bo55b4o4b4o3b4o37bo6bo6boo124boob oo53bo3bo8bo$786boo13bobbo21bo121bo3bo32b6o57boo12bo3bo10bo7bobo15bo 140b4o55bo7boo$784booboo11bo3bo143b4o13b4o20bo72bo7boo4bobo6boo17bo4bo 135boo55boo7boo$784bobbo12bo3bo5boo153bo3bo93bobbobb4o3bobboo5bo19boo 193b4o$784bobbo12bo3bo5bobo152bo15boo85boo3bo5boboo217booboo$785boo9b oo3bobo6bo155bobbo10booboo78bobbobb4o3bobboo220boo$796boo4bo178b4o9boo 66bo7boo4bobo$982boo10bobo65bo3bo10bo$783bobbo177boo28bo67b4o217boo$ 782bo180b4o315booboo8bo$782bo3bo175booboo113boo201b4o3bo4bobo$782b4o 13b4o160boo5boob3o103booboo11bobo186boo3bo5bobbo9b3o$799bo3bo165bo5boo 103b4o10bobbo190bobbo6bo9bo$799bo168boo7bo103boo11b4o186boo3bo5bobbo 10bo$800bobbo165bo5boo105bo11bo188b4o3bo4bobo$963boo5boob3o104bo3bo 197booboo8bo$948bobbo5boo3booboo17boo93bo5boboo178b4o5boo5boo18b3o5bo$ 947bo8b4o3b4o17bobo92bo5boo180bo3bo3booboo23bo5bo3bo$947bo3bo3booboo4b oo18bo94b6o182bo8b4o24bo3bo$947b4o5boo30b5o275bobbo5boo29bo4bo$988bo4b o101boo211b5o$979boo7bo105booboo173bo9boo14b3o$953boo24bobo7bo3bo101b 4o5boo164b3o8b5o12bo$951bo4b3o3boo15bo11bo104boo5boob4o159bo3bo5bo4boo 13bo$949boo4b5o6boo136b6o159bo4b5o5boo$949bo6boobo4b3o138b4o160boobob 4o4boo$949bo9boo4bo8boo295bo3boob3o12b3o$950bobbo5boo13bobo295bobo18bo $952bo6boo13bo319bo$$948bobbo315b4o$947bo319bo3bo13bobbo$947bo3bo315bo 16bo$947b4o13b4o300bobbo12bo3bo$964bo3bo315b4o$964bo$965bobbo! golly-2.5-src/Patterns/Life/Rakes/basic-rakes.rle0000644000175100001440000000245612156145314016636 00000000000000#C Some common and typical c/2 rakes. #C A rake is any puffer whose debris consists entirely of spaceships. #C Front row: p20 forward and backward rakes, the original kind of #C rake created by perturbing the output of a small puffer with #C light-weight spaceships. #C Next row: p16 forward and backward rakes by Tim Coe, 1996. #C Back row: a p240 forward rake, to show one alternative rake. #C "Rakes.lif" from Alan Hensel's "lifebc" pattern collection. x = 263, y = 79, rule = B3/S23 18boo$16bo4bo$22bo$16bo5bo$17b6o3$33boo$31bo4bo$37bo$31bo5bo213boo8bo$ 32b6o132b6o74b4o8bo$169bo5bo74booboo3bo3bo$159b6o10bo76boo5b4o$107b5o 46bo5bo9bo$106bo4bo52bo$41b6o64bo5b4o42bo$40bo5bo59bo3bo5b6o61boo73bo$ 46bo61bo7b4oboo56b4oboo73boo$40bo4bo74boo58b5o75bo$42boo137b3o76bo$89b o169bo$87booboo28bo$89bo14bo3bo3bo3bo5bo58b4o$104bo3bo3bo3bo6bo56bo3bo 76bo$89bo14bo3bo3bo3bo6bo36bo23bo77bo$87booboo27b5o37bo13boo6bo74bo3bo $89bo65bo5bo9b4oboo64b4o13b4o$156b6o9b6o64bo3bo$bboo116b3o49b4o69bo$o 4bo15b4o24boo57bo10b5o120bo$6bo13bo3bo21b3oboo54bo3bo8b3oboo$o5bo17bo 21b5o60bo10boo$b6o13bobbo23b3o56bo4bo$107b5o25$251boo8bo$169b6o75b4o8b o$168bo5bo75booboo3bo3bo$174bo77boo5b4o$173bo3$182boo74bo$178b4oboo74b oo$179b5o76bo$180b3o77bo$259bo$$180b4o$179bo3bo77bo$183bo78bo$174boo6b o60bo14bo3bo$170b4oboo67bo14b4o$170b6o64bo3bo$171b4o66b4o! golly-2.5-src/Patterns/Life/Rakes/c2-Cordership-rake.rle0000644000175100001440000002106212156145314017770 00000000000000#C p240 c/2 orthogonal rake for Paul Tooke's 3-engine Cordership #C Jason Summers, 19 January 2004 x = 461, y = 424, rule = B3/S23 142boo$126boo13booboo$125b4o13b4o$124booboo14boo$125boo$147bo$146b3o$ 130bo11bo3boobo$128b4o10bo6bo$127bob5o14bo6bo$126boo6bo18boo$127b3obo 3bo18boo$128b3o3bo$133bo$160bo5boo$126boo30boo5boob3o$125b4o4b4o22boo 5b5o$124booboo4bo3bo3bobbo22b3o$125boo6bo6bo$134bobbobbo3bo20bo$140b4o 9boo8boo$146b3o5boo8boo$146booboo6b3o$146b3o5boo$140b4o9boo$140bo3bo$ 140bo$141bobbo$159bobbo$158bo$158bo3bo$100boo56b4o$99b4o68bo$98booboo 68bo$82boo15boo58b3o3bo$81booboo72b5obbo7bo$82b4o71boob4obo7bo$83boo 73boo$103bo$97boo3b3o$85b3o9b3ob5o$84boo3bo9b3o8bobo$83boobbobo9b3o8b oo46b4o$84bo5bo9bo10bo46bo3bo$85boobbo11bo56bo$89bo34b3o32bobbo$87bo 27bobo5b5o$91bobbo20boo5boob3o$82boo6bo25bo6boo$81booboo4bo3bo$82b4o4b 4o3b4o$83boo12bo3bo9bo8bobo$97bo11boo9boo14bo$98bobbobboo5b3o7bo12bo3b o$103b3o6b3o18bo$98bobbobboo5b3o19bo4bo$97bo11boo22b5o$97bo3bo9bo$97b 4o$$115boo$114booboo$115b4o17boo$116boo17b3o$117bo18boo$115bo3bobboo 13bobo$114bo5boboo14boo$114bo5b4o$114b6o$$130boo46bobbo$129booboo43bo$ 130b4o5boo36bo3bo$131boo5boob4o15b4o13b4o$139b6o15bo3bo$140b4o16bo$ 161bobbo$181b3o$165bo10bobobo3bo$163b3o10bo7bo27bobo10bo$162bo3bo15boo 5bo22boo9boo$162bo4b3o19bobo21bo10boo$162boobob3o8bo10boo$164bo3boo34b o$165bobo34bo3bo$194bo6bo$194bobo4bo4bo$160b4o5boo23boo5b5o$160bo3bo3b ooboo4boo$160bo8b4o3b4o$161bobbo5boo3booboo9bo9bo$176boo11bo9bobo$182b obo4boobbo5boo$181boobbo7bo$182bobo4boobbo$176boo11bo$175booboo9bo$ 176b4o$177boo$68boo125boo$66bo4bo122b4o$65bo127booboo$57bobbo4bo5bo68b obbo50boo$56bo8b6o68bo64bo$56bo3bo78bo3bo59bobo$56b4o62b4o13b4o55boobb oob3o6bo$42b4o76bo3bo66b12oboo6bobo$41b7o4boo68bo70bo7bobbo9boo$40boob 3oboobbobo69bobbo66bo6boo3boo$41boo3boobbobboo93bo45bo$50bobbo73boo19b obo45boo$44boo4bobo72b5o18boo$42bo8bo72bo4bobb3obo63boo$41bo82bobb3o3b o3boo60b4o$41bo3bo78boobbo7bobo14bo44booboo$41b4o81boo7boobo14bobo10bo 32boo$25boo109boo15boo9bo3bo$24b4o108bo26bo$23booboo135bo4bo$24boo5boo b3o85b4o5boo25bo4b5o$30bo5boo84bo3bo3booboo4boo17bobo$29boo7bo10bo72bo 8b4o3b4o16boo$30bo5boo9bobbo72bobbo5boo3booboo9bo$24boo5boob3o10boo89b oo11bo11boo$9bobbo5boo3booboo116bobo4boobbo7boo$8bo8b4o3b4o115boobbo7b o18boo$8bo3bo3booboo4boo16boo99bobo4boobbo17boob3o$8b4o5boo24bobo3b5o 84boo11bo22b5o$43bo5bo4bo82booboo9bo23b3o$49bo88b4o$50bo3bo21boo61boo$ 19boo17boo12bo22boob4o73b4o$10b3o7boo16bobo26boo7b6o73bo3bo14boo$10bo 6bobbo17bo27booboo6b4o74bo19boo$10bobo6bo34boo11b4o85bo17bo$11boo3boo 34bo15boo88boo$33boo16bo6bo103b3o$33bo17bo8bo94boo3boo3bo$9bobbo20bo 17b8obo93boob3obobbo$8bo22boo23boo97b9o108bobo10bo$8bo3bo143b4o112boo 9boo$8b4o13b4o118bo22b4o99bo10boo$25bo3bo22boo94boo20bo3bo$25bo25boob oo91boo21bo8b6o$26bobbo22b4o115bobbo4bo5bo$35bobbo14boo124bo$34bo28boo 115bo4bo$34bo3bo7bo15boo118boo$34b4o4bo3b3o15bo$40boo5boo$40b3o6bo8bo$ 40boo5boo9boo$34b4o4bo3b3o9boo$28bobbobbo3bo7bo$19boo6bo6bo$18booboo4b o3bo3bobbo22b3o$19b4o4b4o22boo5b5o$20boo30boo5boob3o$54bo5boo$27bo$22b 3o3bo78boo$21b3obo3bo18boo56bobo$20boo6bo18boo59bo156bo$21bob5o14bo6bo 215bobo$22b4o10bo6bo75bo21bo123boo$24bo11bo3boobo74boo22bo131bo$40b3o 75bobo19b3o131bobo$41bo10b3o219boo$19boo30b5o$18booboo14boo11boob3o$ 19b4o13b4o11boo$20boo13booboo$36boo17boo$54b3o31b4o$55boobboo26b9o$59b oo25boob3obobbo$50boo3bo31boo3boo3bo$49boob4obo36b3o$50b7o33boo$51boo 35bo15bo$87bo15bobo$37b4o46bo3bo13bo$36b7o44b4o13bo$35boob3ob3o$36boo 3boobo$69b4o$39boo28bo3bo$37bo31bo7bo$36bo33bobbobb7o$36bo3bo34boob3o bbo10bo$36b4o30bobbobb7o9b3o$49bo19bo7bo15bobo$48boo5boo12bo3bo$18b4o 26bobo3b4o4b4o3b4o$18bo3bo10bo19booboo4bo3bo22bo$18bo7boo4bobo19boo6bo 25boo5boo$19bobbobb4o3bobboo26bobbo21bobo3boob3o$24boo3bo5boboo56b5o$ 19bobbobb4o3bobboo59b3o$18bo7boo4bobo29boo18bo247bobo10bo$4boo12bo3bo 10bo22boo7bo17boo247boo9boo$3b4o4b4o3b4o17bo15boo5bobbo17bobo241bo5bo 10boo$bbooboo4bo3bo22boo16boo4b3o263boo$3boo6bo26bobo3boo11bo3boo15bo 248boo$12bobbo27boob3o29bo$44b5o27bobo$16boo16bo10b3o7boo20bo$6boo8boo 15boo19b4o18boo$5bobbo5bo3bo14bobo17booboo$4boobbo4bo3bo36boo15boo$5b oobbobbo4bo52booboo$6b4o3bobo13bo41b4o210bobo$28boo42boo212boo$28bobo 255bo$4boo335boo$3b4o334bobo$bbooboo63boo269bo$3boo15boo32boo13booboo$ 19booboo29b4o13b4o$20b4o28booboo14boo$21boo30boo$$325bo$67boo4bo251bob o$56boo9boo3b3o7bo38boo198bo3boo$55bobbo12booboo4boo23boo13booboo197bo 11bo$54boobbo11b3ob3o4boo21b4o13b4o195b3o11bobo$55boobbo11boob3o26boob oo14boo210boo$56b4o12bobo29boo$87bo$85boo7boo$54boo30boo5boob3o17boo 14bo$53b4o4b4o29b5o16bobbo11boo$52booboo4bo3bo3bobbo22b3o8boo13b3o7boo $53boo6bo6bo23bo12boo5bo8bobbo$62bobbobbo3bo11boo4boo14boo4bo3bo3boob oo$68b4o11bo7boo14bo3bo4bo20bo$74b3obboo7bo25bo20boo$74b3obboo8bo46boo 7boo$74b3obboo7bo8bo7boo37boob3o$68b4o11bo11boo7b4o4b4o29b5o133boo38b oo$68bo3bo11boo10boo5booboo4bo3bo3bobbo18bo3b3o135boo38boo$68bo35boo6b o6bo20boo141bo39bo$69bobbo40bobbobbo3bo7bo9boo$19boo66bobbo28b4o4bo3b 3o255b3o$18b4o64bo38boo5boo255bo$17booboo64bo3bo34b3o6bo255bo$boo15boo 66b4o35boo5boo$ooboo92bo21b4o4bo3b3o321boo$b4o90boobo20bo3bo7bo190b3o 129boob4o$bboo83b3o10bo18bo202bo132b6o$26bobo57b5o9bo19bobbo28bo131bo 38bo132b4o$26boo42boo13boob4o5bobbo37bobbo8boo132boo61boo$4b4o3bobo13b o41b4o13boo5boo3bo38bo13boo130bobo61bobo$3boobbobbo4bo52booboo39bo24bo 3bo205bo$bboobbo4bo3bo36boo15boo39boo25b4o$3bobbo5bo3bo14bobo17booboo 50bo4boo37bo$4boo8boo15boo19b4o18boo24boo4bo43bo243b5o$14boo16bo10b3o 7boo20bo23booboobboo30b3o3bo249bo4bo$42b5o27bobo23b4ob3o29b5obbo7bo 241bo$10bobbo27boob3o29bo24b4o3boboo24boob4obo7bo242bo3bo$boo6bo26bobo 3boo11bo3boo15bo28bob5o25boo258bo$ooboo4bo3bo22boo16boo4b3o41booboo$b 4o4b4o3b4o17bo15boo5bobbo17bobo22bo$bboo12bo3bo10bo22boo7bo17boo19boob oo$16bo7boo4bobo29boo18bo18b5o$17bobbobb4o3bobboo59b3o3boob3o$22boo3bo 5boboo56b5o3boo$17bobbobb4o3bobboo26bobbo21bobo3boob3o$16bo7boo4bobo 19boo6bo25boo5boo$16bo3bo10bo19booboo4bo3bo22bo$16b4o26bobo3b4o4b4o3b 4o$46boo5boo12bo3bo$47bo19bo7bo15bobo$34b4o30bobbobb7o9b3o188boo$34bo 3bo34boob3obbo10bo188bobo$34bo33bobbobb7o200bo$35bo31bo7bo$37boo28bo3b o$67b4o$34boo3boobo$33boob3ob3o$34b7o44b4o13bo$35b4o46bo3bo13bo$85bo 15bobo$49boo35bo15bo$48b7o33boo$47boob4obo36b3o$48boo3bo31boo3boo3bo 105boo$57boo25boob3obobbo104bo4bo$53boobboo26b9o104bo$52b3o31b4o100bo bbo4bo5bo$53boo134bo8b6o$40bobbo145bo3bo$39bo9boo138b4o$39bo3bo4boob3o 121b4o$22b4o13b4o6b5o120b7o4boo$22bo3bo23b3o120boob3oboobbobo$22bo93bo bo55boo3boobbobboo$23bobbo89boo65bobbo$43b3o71bo25boo32boo4bobo$27bo 10bobobo3bo97boo29bo8bo$25b3o10bo7bo59bo36bo30bo14boo$24bo3bo15boo5bo 52bobo67bo3bo10bobo$24bo4b3o19bobo51boo67b4o11bo139b3o$24boobob3o8bo 10boo105boo169bo$26bo3boo34bo90b4o169bo$27bobo34bo3bo87booboo9bo23b3o$ 56bo6bo93boo11bo22b5o$56bobo4bo4bo94bobo4boobbo17boob3o64b3o$22b4o5boo 23boo5b5o94boobbo7bo18boo67bo$22bo3bo3booboo4boo122bobo4boobbo88bo$22b o8b4o3b4o115boo11bo8boo106boo$23bobbo5boo3booboo19bo80bobbo5boo3booboo 9bo8bobo105bobo$38boo5boob3o12bo77bo8b4o3b4o18bo107bo$44bo5boo8bobo78b o3bo3booboo4boo$43boo7bo8bo79b4o5boo30b5o$44bo5boo122boo6bo4bo$38boo5b oob3o15bo107bobo5bo56bo$37booboo24bobo92bo12bo8bo3bo42b6obo3bo$38b4o 24boo77boo13bobbo21bo32boo10bo5bo3b3o$39boo102booboo11bo3bo53booboo8bo 5bo5bo$55b4o84bobbo12bo3bo5boo47b4o9bo3bo3boobo$55bo3bo83bobbo12bo3bo 5bobo47boo12bo5b3o$55bo88boo9boo3bobo6bo62boo$56bo98boo4bo69b4o$58boo 170booboo$142bobbo85boo$55boo3boobo77bo$54boob3ob3o77bo3bo$55b7o79b4o 13b4o51boo$56b4o98bo3bo49booboo8bo$70b4o84bo54b4o3bo4bobo$70bo3bo84bo bbo51boo3bo5bobbo$70bo8b6o133bobbo6bo$71bobbo4bo5bo128boo3bo5bobbo8bo$ 79bo133b4o3bo4bobo9boo$80bo4bo126booboo8bo$82boo113b4o5boo5boo26bo$ 197bo3bo3booboo22b3o4bo3bo$197bo8b4o22bo5bo$198bobbo5boo24bo4bo4bo$ 238b5o$210bo$200boo8boo15b3o$199bobbo9bo14bo$199bobbo4b5o16bo$199boob oo3b4o$201boo4bo$222b3o$222bo$223bo$197b4o$197bo3bo13bobbo6boo$197bo 16bo8bo$198bobbo12bo3bo3bo6boo3boo$214b4o4bo7bobbo$222b12oboo$227boobb oob3o$232bobo$233bo$223boo$222booboo$223b4o$224boo43b3o$206boo61bo$ 205b4o61bo$204booboo$205boo5boob3o$211bo5boo$210boo7bo$211bo5boo$205b oo5boob3o9boo$190bobbo5boo3booboo18bobo$189bo8b4o3b4o18bo$189bo3bo3boo boo4boo$189b4o5boo30b5o$222boo6bo4bo$222bobo5bo$209bo12bo8bo3bo$193boo 13bobbo21bo$191booboo11bo3bo$191bobbo12bo3bo5boo$191bobbo12bo3bo5bobo$ 192boo9boo3bobo6bo$203boo4bo24bo$225b6obo3bo$190bobbo31bo5bo3b3o$189bo 35bo5bo5bo$189bo3bo32bo3bo3boobo$189b4o13b4o18bo5b3o$206bo3bo16boo$ 206bo19b4o$207bobbo14booboo$226boo11b3o$239bo$240bo$208boo$207booboo8b o$208b4o3bo4bobo$209boo3bo5bobbo$213bobbo6bo$209boo3bo5bobbo$208b4o3bo 4bobo$207booboo8bo8b3o$192b4o5boo5boo19bo6bo$192bo3bo3booboo25bo3bo3bo $192bo8b4o28bo$193bobbo5boo29bo4bo$224b3o6b5o$224bo$195boo7bo20bo$194b obo3boo7b5o$194bo18bo$194b3o13b3o6b3o$205boo4bo7bo$205boo13bo3$192b4o$ 192bo3bo13bobbo$192bo16bo$193bobbo12bo3bo$209b4o!golly-2.5-src/Patterns/Life/Rakes/c3-forward-rake-p333.rle0000644000175100001440000010503112156145314020020 00000000000000#C Engineless c/3 p333 forward rake #C Assembled by Jason Summers from components by David Bell, 2 Jan 02 x = 2089, y = 1527, rule = B3/S23 1276bob3o$1268bo6bo5bo6boobo$1266b4o4boobboboo3booboboob3o$1265boo3bob oobb4ob5obboo6bo$1264bo3bob4o8bo3bo3bo3boo$1268bo14bo$1269bo4bo$1273bo 8$1291b3oboo$1289boo4boo$1251b3o34bo3bobobbo$1247boboo3bo28b3obb3o$ 1246b3o3b3obb3o22bobob3o$1245bo3bo4b3obobo22bo4bo$1246bo7bo4bo26boo$ 1255boo$1286boo$1285bobbo$1269b3o13bobbo$1268bobbo14boboo$1271bo11boob obo$1271bo14boboboo$1268bobo13boboboboo$1283bobbobobo$1281boo3bobbo$ 1281b3obb5o$1282boobob3o$1285bo$1285bo8$1205booboo$1202boobooboboo$ 1199b4obb3obbob3o$1198bo4bo5b3o4b3o$1199boo8bob3obobobo20boo$1210b4obo bobo19boo$1208bobbo4bobo22bo$1209bo$1217bo$1217bo5$1196booboo$1193boob ooboboo$1190b4obb3obbob3o$1189bo4bo5b3o4b3o$1190boo8bob3obobobo$1201b 4obobobo$1199bobbo4bobo$1200bo$1208bo$1208bo5$1200b3o$1196boboo3bo$ 1195b3o3bobo31boobo$1194bo3bo4boo27boobooboo$1195bo7b3o26bobbobobbo$ 1201bobo22boo4boo5bo$1200boo24booboo$1199bo3bo21bo3boo$1203bo25boo$ 1200boboo66bo$1200bo28boo38b3o$1200b3o26boo37boobo$1228bobbo36b3o$ 1201bo25bobobo37boo$1229bobo$1201boo23booboboboo$1229boboboo$1203bo21b obobobo$1201boo22bo3bobbo$1201bobo21boobboob3o$1225bo$1228boobbo$1191b 3o33bo$1187boboo3bo$1186b3o3b3obb3o$1185bo3bo4b3obobo$1186bo7bo4bo$ 1195boo$1238bo$1230b3o4b4o8b3o$1229bo3boobo3boo8bobooboo$1229bobobbobo bo3bo4boobo4boo$1228boo4bobobbo6bobobo3bobbo$1230boobbobob7obobobo$ 1231bo4bo5bo5bo3bo$1227b3obboobboo4bo6boo$1226b4o4b3o7boobbo4bo$1225bo 3b3o11boo3bo3boo$1230b3o10b3o$1225bobo3boo10boo4b3o$$1198boo$1195boob oo$1195boobobo$1195boobb3o$1195b3obobob3o$1193boo11bo$1200bobbobo$ 1193bobbo36bo$1198bo5boo26b4o$1198boo3bobbo20bo3bo3booboo$1202bo23b4o 5bobboo$1198bo3bo5boo15bo3bo7bobbo$1198bo3bo4bobbo15bobobbo$1200boo5bo bbo19bo$1207b5o$1210booboo$1212bo12boo5b3o9boo$1225boobooboboboo7boob oobo$1224bobobbobobo3bo4boo3bob3o$1224bobbo3boobobo4boboboboo3bo$1223b obb4obobo5b3obob3o3bo$1226boboobobobbooboobbo3bo$1223bo4b4o6boobbobboo $1222b3o9bo4bo5b3o$1220boo3bo6bo6bo3boobboo20b3o$1220b3o3boobbo8boo3b oo23bobbo$1221boo3bo12bo4booboo20bo$1239bo29bo$1270bobo10$1226boobo$ 1223boobooboo$1223bobbobobbo$1217boo4boo5bo$1217booboo$1216bo3boo$ 1220boo$$1220boo$1220boo$1219bobbo$1218bobobo$1220bobo$1217booboboboo$ 1220boboboo$1216bobobobo$1216bo3bobbo$1216boobboob3o$1216bo$1219boobbo $1218bo4$1188boo$1185booboo$1185boobobo$1185boobb3o$1185b3obobob3o$ 1183boo11bo$1190bobbobo$1183bobbo$1188bo5boo$1188boo3bobbo$1192bo$ 1140b3o45bo3bo$1089bo3bo46bo47bo3bo$1087b3oboobobo44bo48boo$1083booboo 6bobbo$1083boobbobbo3bobboobboo$1082bobbo4bobbobbooboboo$1093boo4bo3bo 166bo$1092boobbobbobobo165b3o$1094bo174boboo$1100b3o167b3o$1270boo5$ 1080bo3bo$1078b3oboobobo$1074booboo6bobbo$1074boobbobbo3bobboobboo$ 1073bobbo4bobbobbooboboo$1084boo4bo3bo$1083boobbobbobobo$1085bo$1091b 3o$1277bo$1277boo$1276bobo3$1085boo$1082booboo92b3o$1079b4obbobo31bo 55boboo3bo$1078bo4bo4bo28b3ob3o50b3o3b3obb3o$1079boo7bo27boo6bo48bo3bo 4b3obobo$1088bo22bo3bobbo3boo50bo7bo4bo$1084b3o23b4o69boo$1083bo25bo3b o$1084boboo22bobobbo$1088bo25bo$1084boo$1083bo3bo25boo$1086bo25bobbo$ 1084bo27boobo$1086bo24boboboo$1113bobobo$1085boo23booboboboo$1113bobo$ 1085b3o21boobboboboo$1085bo22bo3boo$1086bo24boo4bo$1108bobobo4bo70bob oo$1076boo34bobbo71boobooboo$1073booboo108bobbobobbo165boo$1070b4obboo 4boo103bo5boo4boo158bobo$1069bo4bo4booboo112booboo160bo$1070boo7boo3bo 111boo3bo$1079boo115boo$$1114boo5b3o9boo61boo$1114boobooboboboo7booboo bo56boo$1100b3o10bobobbobobo3bo4boo3bob3o54bobbo$1099bo3bo9bobbo3boobo bo4boboboboo3bo53bobobo$1098bo13bobb4obobo5b3obob3o3bo54bobo35boobo32b 3o$1091boo6bo4bo10boboobobobbooboobbo3bo55booboboboo29boobooboo30bobbo $1090bo3bo9bo7bo4b4o6boobbobboo56boobobo32bobbobobbo32bo$1089boo9bobbo 7b3o9bo4bo5b3o58bobobobo22boo4boo5bo33bo$1090bo4bo5boo6boo3bo6bo6bo3b oobboo56bobbo3bo22booboo39bobo$1090bo3bo14b3o3boobbo8boo3boo57b3oboobb oo21bo3boo$1091b3o7bo8boo3bo12bo4booboo63bo25boo$1095bo5bo26bo65bobboo 37bo$1082bo11bobo4bo97bo34b3ob3o$1080b4o10boo77b4o11bo44boo6bo$1079boo 3bo84boboobobo8bob3o4boo32bo3bobbo3boo$1078bo5b3o81b3o4bobb3o3boboobob ooboo31b4o$1081bobo4boo77bo3bo6boobobo3bo4bo3bo29bo3bo$1078bob4o4boo 77boo9boobb3obo4b3o4bo28bobobbo$1077b8ob4o77boo8bobobbo7booboo3boo31bo $1077boo86boobo5boobobo8bo3boboboobboo$1082bo5boo26b3o44booboboo4boobo bobobb3o4bobboboob3o$1081bobo3bobbo24bo3boobo39bo11bo4bob4obbobobbobob ooboo$1084bobobbo20b3obb3o3b3o39boboobooboo3bo5boo6bo12b3o237boo$1082b 4o23bobob3o4bo3bo47bo3b4o3bo13bo5bobo3bobo232boo$1082b4o24bo4bo7bo46b oo10bo12boo6boo4bobbo230bo$1084bobbo25boo66bo22boo3bobbo$1204boo4bobo$ 1157boo12bo32boo17b3o9b3o$1110bo5boo11bo24booboboo10b3o3bo32boo9boobob o7boboboo$1109b4o3booboo7b4o19b4obbo4bo4b3o5b4o28boboo7bobo4bo9bo4bobo $1108bo3boobo3boo6bo3bob3o14bo4bo6boo3b3o5bo3bo27b3o7boboo9bo9boobo$ 1108bo4bobobb3o5boobobbo3bo13b3o7bobboobboobbo5bob3o26bo7bo3b4o5bobo5b 4o3bo$1107booboboobo8booboboo3boo24bo3boo7boobobboobbo35bobbo5bo3bo5bo bbo$1108b3o4bob6obobbobbo18bo8bobob3o7boo3bobo3bo33bo11b3o11bo$1107boo bobobbob3o6booboo15boob4o4boobobobobbooboboobobo4boo35b4o15b4o$1105bo bboob3obbo5bo4boo17boobobbo3bobboobo4bobbobo4boboobbo34b4obbooboo3boob oobb4o$1105bo4b7o6boobbo3boo13bobobob3o4b3obboo3bo3booboboo40bo4boboo 3boobo4bo$1105boo4bobbo16boo20boo7b4o12bobbo41bobobo5bobobo$1105bobbo 12bobbo3b4o21bobbobo4b3o12boo$1109bobo10bobo4bo29bobo$1129bo41boo$ 1168booboo$1165b4obboo4boo$1164bo4bo4booboo$1165boo7boo3bo$1174boo5$ 1110bo415b3o$1108b3ob3o413bo$1107boo6bo411bo$1102bo3bobbo3boo$1101b4o$ 1100bo3bo$1101bobobbo$1105bo$$1104boo164bo$1103bobbo162b3o$1103boobo 161boobo$1102boboboo160b3o$1104bobobo90boboo22boobo40boo$1101boobobob oo88boobooboo16boobooboo$1104bobo90bobbobobbo16bobbobobbo$1100boobbobo boo88bo5boo4boo4boo4boo5bo$1099bo3boo102booboo4booboo$1102boo4bo98boo 3bobbo3boo$1099bobobo4bo98boo10boo$1103bobbo$$1179boboo22boobo$1178boo booboo16boobooboo$1072bo104bobbobobbo16bobbobobbo$1070b4o104bo5boo4boo 4boo4boo5bo$1069boo3bo112booboo4booboo$1068bo5b3o110boo3bobbo3boo409bo $1071bobo4boo107boo10boo409boo$1042bo25bob4o4boo529bobo$1041boo24b8ob 4o$1041bobo23boo$1072bo5boo$1071bobo3bobbo$1074bobobbo$1072b4o$1072b4o $1074bobbo17$1144boo$1143bobo547boo$1145bo546bobo$958boo734bo$958bobo$ 958bo$$1752b3ob3o$1749b4obo4boobo$1745bo3boo3boobo3b3o$1744b4o5boobo3b o3bo$1064boo203b3o471bo3bobo3bo9bo$1061booboo203bobbo470bobobobo3bo$ 1058b4obboo4boo197bo474b3o4bobo$1057bo4bo4booboo197bo475bo$1058boo7boo 3bo197bobo$1067boo164b3ob3o$1230b4obo4boobo$1226bo3boo3boobo3b3o$1225b 4o5boobo3bo3bo$1224bo3bobo3bo9bo$1224bobobobo3bo526b3ob3o$1225b3o4bobo 523b4obo4boobo$1226bo527bo3boo3boobo3b3o$1753b4o5boobo3bo3bo$1752bo3bo bo3bo9bo$1752bobobobo3bo$1225bo527b3o4bobo$1223b4o527bo$1223bo3bo$ 1223bo3bo14b3ob3o$875boo198bo148b3o12b4obo4boobo$874boo195b3ob3o147bo 9bo3boo3boobo3b3o$876bo193bo6boo155b4o5boobo3bo3bo$1071boo3bobbo3bo14b oo133bo3bobo3bo9bo507bo$1081b4o13boo133bobobobo3bo516b4o$1081bo3bo148b 3o4bobo515bo3booboo$1079bobbobo150bo487boob3o30bo3bobboo$1080bo10bo 631boo4boo26bo7bobbo$1090bobo629bobbobo3bo25bo$1080boo8bobo636b3obb3o 22boboo$1079bobbo8bo639b3obobo23boo$1079boboo648bo4bo23bobo$1078boobob o33bo614boo24boo$1077bobobo19bo13b3ob3o637b3o$1076booboboboo15bobo11b oo6bo609boo25bobboo$1079bobo27bo3bobbo3boo609bobbo26boo$1076boobobobb oo14boo6b4o133bo485bobbo25bobo$1081boo3bo15boo3bo3bo131b3ob3o480boobo$ 1077bo4boo20boobbobobbo128boo6bo480boboboo23boo$1077bo4bobobo15boboo6b o124bo3bobbo3boo478boobobo$1079bobbo19boo15b3oboo111b4o488boobobobo11b o5bo6bo$1058boo12bo44boo4boo110bo3bo489bobobobbo11bo3bobbo4bo$1055boob oboo10b3o3bo37bo3bobobbo110bobobbo488bobbo3boo4boo6bo3bo3bobo$1052b4o bbo4bo4b3o5b4o31b3obb3o121bo488b5obb3o4boo11bo4bo$1051bo4bo6boo3b3o5bo 3bo29bobob3o613b3oboboo4bo5bo6b3o$1051b3o7bobboobboobbo5bob3o28bo4bo 617bo6b3o6bo5bo13bo$1061bo3boo7boobobboobbo29boo618bo7bo11boo13b4o$ 1050bo8bobob3o7boo3bobo3bo658bo3bo6boo8bo3bo3booboo$791b3o253boob4o4b oobobobobbooboboobobo4boo658bobbo3bo12b4o5bobboo$791bo255boobobbo3bobb oobo4bobbobo4boboobbo660bo5bo10bo3bo7bobbo$792bo254bobobob3o4b3obboo3b o3booboboo682bobobbo$1054boo7b4o12bobbo684bo$1054bobbobo4b3o12boo631bo 11boo5bo$1060bobo647b4o7booboo3b4o$1706b3obo3bo6boo3boboo3bo$1041boo 65boo9boo135boobo10bo434bo3bobboboo5b3obbobo4bo$1039b3obo10b3o48booboo 9booboo129boobooboo8b3o434boo3booboboo8bobooboboo$1035booboo3boobo5bo 3boobb3o42boo3bo7bo3boo129bobbobobbo7boboo438bobbobbob6obo4b3o$1035boo bbobboboobo3boo3b4obobo37b3obbo15bobb3o119boo4boo5bo9b3o438booboo6b3ob obboboboo$1034bobbo6bo3bo5boobo3boo38boobb3o5b3o5b3obboo119booboo18boo 441boo4bo5bobb3oboobbo$1033bo10bo3bobbo5bo3bobb3o34b3o9b3o9b3o118bo3b oo457boo3bobboo6b7o4bo$1036bo6booboobo7bo3boobb3o34bo9bo3bo9bo123boo 457boo16bobbo4boo$1031b3o7boobobo5bo4bobobobo4bo34bobbo15bobbo584b4o3b obbo12bobbo$1030booboboo3bo5bobobb5obboobo40booboo4bo5bo4booboo585bo4b obo10bobo$1029bo3bo3bobboobobobbo4bo3boobobboobobo37b7obob7o589bo$ 1038b3oboobb3o14b3o39bobobo9bobobo639b3o$1036bobbo3b3o4bo12bo698bo3boo $1038bo5boo3bo13bo697bobbo3bo$1055bo702boboo6bo$1053b4o700booboob3o$ 1049booboo3bo3bo694bobboobo3b3o$1049boobbo5b4o705boo$1048bobbo7bo3bo 665boo26bo$1057bobbobo663booboo26boo4b3o$1058bo664b4obboo4boo20b3o3boo $709bo1012bo4bo4booboo22boobboo$708boo476boo535boo7boo3bo21b3o$708bobo 475bobo543boo26bobbo$1186bo574bo$$1729bo$1716b3o8b4o4b3o$1711booboobo 8boo3boboo3bo$1215bo22bo472boo4boboo4bo3bobobobbobo$1211b3ob3o18b3ob3o 467bobbo3bobobo6bobbobo4boo$1210bo6boo16boo6bo473bobobob7obobobboo$ 1211boo3bobbo3bo6bo3bobbo3boo472bo3bo5bo5bo4bo$1221b4o4b4o484boo6bo4b oobboobb3o$1221bo3bobbo3bo481bo4bobboo7b3o4b4o$1219bobbobo4bobobbo479b oo3bo3boo11b3o3bo$1220bo12bo488b3o10b3o$1086bo22bo606b3o4boo10boo3bobo $1082b3ob3o18b3ob3o120boboo22boobo$1081bo6boo16boo6bo118boobooboo16boo booboo$1082boo3bobbo3bo6bo3bobbo3boo118bobbobobbo16bobbobobbo$1092b4o 4b4o129bo5boo4boo4boo4boo5bo$1092bo3bobbo3bo138booboo4booboo$1090bobbo bo4bobobbo136boo3bobbo3boo$1091bo12bo137boo10boo$$1066bo22bo$1062b3ob 3o18b3ob3o$1061bo6boo16boo6bo$625boo435boo3bobbo3bo6bo3bobbo3boo638boo b3o$625bobo444b4o4b4o19boo627boo4boo$625bo426bo3bo15bo3bobbo3bo18boo 627bobbobo3bo$1050b3oboobobo10bobbobo4bobobbo18bo633b3obb3o$1046booboo 6bobbo10bo12bo655b3obobo$1046boobbobbo3bobboobboo674bo4bo$1045bobbo4bo bbobbooboboo675boo$1056boo4bo3bo$1055boobbobbobobo202b3o469boo$1057bo 210bobbo468bobbo$1063b3o205bo468bobbo$1271bo467boobo$1268bobo469bobob oo$1737boobobo$1737boobobobo$1738bobobobbo$1043bo3bo691bobbo3boo$1041b 3oboobobo687b5obb3o$1037booboo6bobbo687b3oboboo$1037boobbobbo3bobboobb oo686bo$1036bobbo4bobbobbooboboo686bo$1047boo4bo3bo$1046boobbobbobobo$ 1048bo$1054b3o716b3o$1772bo3boo14boo$1771bobbo3bo14boo$1768boboo6bo13b o$542boo1223booboob3o$541boo1223bobboobo3b3o$543bo504boo728boo$1045boo boo717bo$1042b4obbobo31bo684boo4b3o$1041bo4bo4bo28b3ob3o680b3o3boo$ 1042boo7bo27boo6bo681boobboo$1051bo22bo3bobbo3boo682b3o$1047b3o23b4o 693bobbo$1046bo25bo3bo694bo$1047boboo22bobobbo$1051bo25bo$1047boo$ 1046bo3bo25boo$1049bo25bobbo$1047bo27boobo$1049bo24boboboo$1076bobobo$ 1048boo23booboboboo$1076bobo$1048b3o21boobboboboo$1048bo22bo3boo$1049b o24boo4bo631b3o$1071bobobo4bo631bo$1039boo34bobbo634bo$1036booboo834b 3o$1033b4obboo4boo830bo$1032bo4bo4booboo829bo$458b3o572boo7boo3bo$458b o583boo$459bo$1077boo5b3o9boo$1064bo12boobooboboboo7booboobo$1063boo 11bobobbobobo3bo4boo3bob3o$1062boobo10bobbo3boobobo4boboboboo3bo$1061b obo11bobb4obobo5b3obob3o3bo166bo475bo$1061boo15boboobobobbooboobbo3bo 169b3o475bo34bo$1075bo4b4o6boobbobboo169boobo474bo34b4o$1066boo6b3o9bo 4bo5b3o168b3o505bo3bo3booboo$1066boo4boo3bo6bo6bo3boobboo168boo504b4o 5bobboo$1063bobo6b3o3boobbo8boo3boo645bobbo27bo3bo7bobbo$1063boo8boo3b o12bo4booboo507booboo130bobo29bobobbo$1063bobo25bo513boobooboboo130bob oo30bo$1045bo17boo537b4obb3obbob3o127bo3bo$1043b4o11bo542bo4bo5b3o4b3o 124bobbo$1042boo3bo10bo543boo8bob3obobobo123b3o$1041bo5b3o563b4obobobo $1044bobo4boo558bobbo4bobo$1041bob4o4boo559bo142bo$1040b8ob4o567bo9bo 123bobo$1040boo578bo8boo123bobo$1045bo5boo26b3o547bobo123bo$1044bobo3b obbo24bo3boobo873bo$1047bobobbo20b3obb3o3b3o872boo$1045b4o23bobob3o4bo 3bo870bobo$330b3ob3o39bo668b4o24bo4bo7bo512booboo$326boboo4bob4o35boo 670bobbo25boo518boobooboboo$325b3o3boboo3boo3bo31bobo1215b4obb3obbob3o 161b3oboo$324bo3bo3boboo5b4o1247bo4bo5b3o4b3o155boo4boo$325bo9bo3bobo 3bo727bo5boo11bo500boo8bob3obobobo153bo3bobobbo$335bo3bobobobo726b4o3b ooboo7b4o509b4obobobo148b3obb3o$335bobo4b3o726bo3boobo3boo6bo3bob3o 503bobbo4bobo148bobob3o$343bo727bo4bobobb3o5boobobbo3bo503bo158bo4bo$ 1070booboboobo8booboboo3boo512bo153boo$1071b3o4bob6obobbobbo517bo$ 1070boobobobbob3o6booboo671boo$1068bobboob3obbo5bo4boo672bobbo$1068bo 4b7o6boobbo3boo668bobbo$1068boo4bobbo16boo669boboo$321b3ob3o740bobbo 12bobbo3b4o630boob3o31boobobo$317boboo4bob4o741bobo10bobo4bo632boo4boo 32boboboo$316b3o3boboo3boo3bo757bo631bobbobo3bo29boboboboo285b3ob3o$ 315bo3bo3boboo5b4o1395b3obb3o23bobbobobo283b4obo4boobo$316bo9bo3bobo3b o1260boob3o130b3obobo20boo3bobbo280bo3boo3boobo3b3o$326bo3bobobobo 1260boo4boo128bo4bo21b3obb5o278b4o5boobo3bo3bo$326bobo4b3o1260bobbobo 3bo128boo25boobob3o278bo3bobo3bo9bo$334bo1268b3obb3o112boboo37bo282bob obobo3bo$1605b3obobo110boobooboo34bo22boo259b3o4bobo$1605bo4bo110bobbo bobbo43b3o10bob3o258bo$1606boo114bo5boo4boo31b3obboo3bo5boboo3booboo$ 1731booboo30bobob4o3boo3boboobobbobboo247boo$1073bo657boo3bo30boo3bob oo5bo3bo6bobbo245bobo$1071b3ob3o653boo30b3obbo3bo5bobbo3bo10bo246bo$ 315boboo751boo6bo683b3obboo3bo7bobooboo6bo$314boobooboo743bo3bobbo3boo 683bo4bobobobo4bo5boboboo7b3o$313bobbobobbo38b3oboo698b4o700boboobb5o bbobo5bo3booboboo265b3ob3o$314bo5boo4boo30boo4boo697bo3bo693boboboobbo boo3bo4bobboboboobbo3bo3bo261b4obo4boobo$323booboo29bo3bobobbo697bobo bbo694b3o14b3obboob3o266bo3boo3boobo3b3o$323boo3bo23b3obb3o708bo697bo 12bo4b3o3bobbo263b4o5boobo3bo3bo$323boo26bobob3o1408bo13bo3boo5bo264bo 3bobo3bo9bo$352bo4bo709boo987bobobobo3bo$323boo30boo709bobbo199b3o318b o135bo11bo318b3o4bobo$323boo741boobo199bobbo313b3ob3o131b4o9b4o50bo11b 4o251bo$322bobbo29boo708boboboo198bo315bo6boo129boo3bo7bo3boo42boo4b3o bo8boboboobo$322bobobo27bobbo709bobobo197bo316boo3bobbo3bo121bobo4bo9b o4bobo39boobooboboobo3b3obbo4b3o$322bobo29bobbo706booboboboo197bobo 323b4o119boo3bo7bo7bo3boo37bo3bo4bo3boboboo6bo3bo$319booboboboo27boboo 708bobo526bo3bo119bo3boo5b3o5boo3bo36bo4b3o4bob3obboo9boo$319boobobo 27boobobo705boobboboboo521bobbobo122boboo4bo3bo4boobo37boo3booboo7bobb obo8boo$322bobobobo26boboboo701bo3boo527bo124boobbo6b3o6bobboo33boobb oobobo3bo8boboboo5boboo$321bobbo3bo24boboboboo704boo4bo652bo5b5o5bo37b 3oboobobbo4b3obboboboboo4booboboo$319b3oboobboo23bobbobobo702bobobo4bo 648bo3bobooboo3booboobo3bo34booboobobobbobobb4obo4bo11bo$328bo21boo3bo bbo707bobbo652boo3bo9bo3boo46bo6boo5bo3boobooboobo$321bobboo24b3obb5o 1366bobboo3boobbo43bo13bo3b4o3bo260bo$326bo24boobob3o1424boo12bo10boo 256b3ob3o$318bo35bo1443bo266boo6bo$316b4o34bo680bo754b3o267bo3bobbo3b oo$312booboo3bo3bo708b4o752bo3boobo262b4o$312boobbo5b4o706boo3bo746b3o bb3o3b3o260bo3bo$311bobbo7bo3bo704bo5b3o743bobob3o4bo3bo260bobobbo$ 320bobbobo708bobo4boo604b3o134bo4bo7bo265bo$321bo709bob4o4boo606bo137b oo$357bo5boo11bo626b3o24b8ob4o605bo$356b4o3booboo7b4o624bo26boo$355bo 3boobo3boo6bo3bob3o621bo30bo5boo662bo3bo$355bo4bobobb3o5boobobbo3bo 650bobo3bobbo658boboboob3o$354booboboobo8booboboo3boo654bobobbo658bobb o6booboo$355b3o4bob6obobbobbo657b4o657boobboobbo3bobbobboo$354boobobo bbob3o6booboo657b4o657booboboobbobbo4bobbo$352bobboob3obbo5bo4boo661bo bbo654bo3bo4boo$352bo4b7o6boobbo3boo1315bobobobbobboo$352boo4bobbo16b oo1224boob3o20b3oboo68bo$352bobbo12bobbo3b4o1225boo4boo16boo4boo60b3o 380boobo$356bobo10bobo4bo1226bobbobo3bo14bo3bobobbo439boobooboo$376bo 1233b3obb3o4b3obb3o446bobbobobbo$323b3o1286b3obobobbobob3o442boo4boo5b o$321boo3bo1285bo4bo4bo4bo442booboo$320bo3bobbo18bo1266boo10boo50boo 390bo3boo$320bo6boobo14boo1329boobo393boo$323b3obooboo12boobo1238bo22b o66boobo53boob3o20b3oboo$320b3o3boboobbo12bobo1234b3ob3o18b3ob3o60b3ob oo3bo49boo4boo16boo4boo$319boo25boo1233bo6boo16boo6bo54bo3bo4bobb3ob3o 44bobbobo3bo14bo3bobobbo$331bo26boo1222boo3bobbo3bo6bo3bobbo3boo54b4o 4b3obboo5bo50b3obb3o4b3obb3o$323b3o4boo26booboo1229b4o4b4o63bo3bo9boob obbo53b3obobobbobob3o$324boo3b3o20boo4boobb4o1226bo3bobbo3bo64bobobbo 4boo4bo56bo4bo4bo4bo$324boobboo22booboo4bo4bo1223bobbobo4bobobbo66bo9b ob3o55boo10boo$327b3o21bo3boo7boo742bo482bo12bo62bo16bo3bo$325bobbo26b oo751boo557b3obbo6bo3bobobbo$327bo779bobo546boo4b5o4bobob3ob3o6boo63b oob3o20b3oboo$921bo731booboo3b3obbo4bobo3boobbo3booboo63boo4boo16boo4b oo$359bo560boo731boo3bo4b5obobo3boo12bo62bobbobo3bo14bo3bobobbo232bo$ 351b3o4b4o8b3o547bobo730bobobbobbo3boo12bobboobobbo70b3obb3o4b3obb3o 238boo$350bo3boobo3boo8bobooboo1278bob4o16boobboobbo74b3obobobbobob3o 240bobo$350bobobbobobo3bo4boobo4boo1300boboo79bo4bo4bo4bo$349boo4bobo bbo6bobobo3bobbo1304bo78boo10boo$351boobbobob7obobobo1282boo23b4o$352b o4bo5bo5bo3bo1278b3obo10b3o10boo$348b3obboobboo4bo6boo655boo241bo377b ooboo3boobo5bo3boobb3o$347b4o4b3o7boobbo4bo649booboo240b3o376boobbobbo boobo3boo3b4obobo$346bo3b3o11boo3bo3boo646b4obboo4boo234boboo374bobbo 6bo3bo5boobo3boo$351b3o10b3o653bo4bo4booboo235b3o373bo10bo3bobbo5bo3bo bb3o358bo22bo$346bobo3boo10boo4b3o648boo7boo3bo234boo377bo6booboobo7bo 3boobb3o353b3ob3o18b3ob3o$1030boo164b3ob3o441b3o7boobobo5bo4bobobobo4b o351bo6boo16boo6bo$1193b4obo4boobo436booboboo3bo5bobobb5obboobo359boo 3bobbo3bo6bo3bobbo3boo$1189bo3boo3boobo3b3o434bo3bo3bobboobobobbo4bo3b oobobboobobo362b4o4b4o$1188b4o5boobo3bo3bo442b3oboobb3o14b3o365bo3bobb o3bo$1187bo3bobo3bo9bo441bobbo3b3o4bo12bo365bobbobo4bobobbo$1187bobobo bo3bo453bo5boo3bo13bo366bo12bo$1188b3o4bobo$1189bo867boboo22boobo$ 2056boobooboo16boobooboo$2055bobbobobbo16bobbobobbo$1672bo383bo5boo4b oo4boo4boo5bo$351b3oboo831bo479b3ob3o390booboo4booboo$349boo4boo829b4o 477bo6boo389boo3bobbo3boo$348bo3bobobbo827bo4bo477boo3bobbo3bo384boo 10boo$343b3obb3o833bo5boo13b3ob3o466b4o$342bobob3o488boo199bo151boo10b 4obo4boobo462bo3bo36boo$343bo4bo488bobo194b3ob3o144b3oboo7bo3boo3boobo 3b3o459bobbobo37booboo210boo$346boo489bo195bo6boo145b3o7b4o5boobo3bo3b o459bo40boboboo210bobo$1034boo3bobbo3bo141bo7bo3bobo3bo9bo500b3obboo 210bo$346boo696b4o13boo133bobobobo3bo506b3obobob3o$345bobbo695bo3bo12b oo134b3o4bobo490b5o10bo11boo$345bobbo693bobbobo150bo514bobobbo$346bob oo693bo678bobbo$343boobobo705bo658boo5bo$346boboboo691boo8bobo641b5o 10bobbo3boo$344boboboboo690bobbo7bobo660bo$343bobbobobo691boboo8bo661b o3bo$341boo3bobbo691boobobo33bo635bo3bo$341b3obb5o689bobobo33b3ob3o 632boo$342boobob3o398bo3bo286booboboboo29boo6bo$345bo400b3oboobobo286b obo18boo7bo3bobbo3boo$345bo396booboo6bobbo282boobobobboo13boo7b4o133bo $742boobbobbo3bobboobboo282boo3bo14bo3bo5bo131b3ob3o$741bobbo4bobbobb ooboboo278bo4boo20bo3bobobbo128boo6bo$752boo4bo3bo277bo4bobobo25bo124b o3bobbo3boo$313b3o435boobbobbobobo279bobbo18boo3bo12b3oboo111b4o$311b oo3bo436bo267boo12bo28bobboo11boo4boo110bo3bo$310bo3bobbo441b3o256boob oboo10b3o3bo23b3o11bo3bobobbo110bobobbo$310bo6boobo694b4obbo4bo4b3o5b 4o31b3obb3o121bo$313b3obooboo692bo4bo6boo3b3o5bo3bo29bobob3o$310b3o3bo boobbo691b3o7bobboobboobbo5bob3o28bo4bo$309boo713bo3boo7boobobboobbo 29boo655b3o$276boo43bo691bo8bobob3o7boo3bobo3bo685bo$276bobo34b3o4boo 417bo3bo266boob4o4boobobobobbooboboobobo4boo684boo$276bo37boo3b3o415b 3oboobobo263boobobbo3bobboobo4bobbobo4boboobbo678boboobboobb3o112boo$ 314boobboo413booboo6bobbo262bobobob3o4b3obboo3bo3booboboo681boobooboo 5bo4boo105boo$317b3o413boobbobbo3bobboobboo264boo7b4o12bobbo678bobboo 3boboo4booboo107bo$315bobbo413bobbo4bobbobbooboboo264bobbobo4b3o12boo 686b4o6boo3bo$317bo425boo4bo3bo269bobo700boboboo8boo$742boobbobbobobo 5bo927b3o38bo$744bo13b3o243boo65boo9boo135boobo467bo34boo18bo$750b3o4b o3bo240b3obo10b3o48booboo9booboo129boobooboo45b3o418boo32boobbo4boobo 3bo3boob3o$758b3o237booboo3boobo5bo3boobb3o42boo3bo7bo3boo129bobbobobb o43bobbo413b3obboobboobo28b3obooboboobooboobob3obbo3b3o$759bo238boobbo bboboobo3boo3b4obobo37b3obbo15bobb3o119boo4boo5bo47bo407boo4bo5booboob oo23bobbo5boboo6bo9bobboboboo$997bobbo6bo3bo5boobo3boo38boobb3o5b3o5b 3obboo119booboo56bo407booboo4boobo3boobbo23bob4obo3b3o3bobobbo3bobobbo bo3bo$996bo10bo3bobbo5bo3bobb3o34b3o9b3o9b3o118bo3boo53bobo407bo3boo6b 4o34b3obboo10bo4boobbobbobo$999bo6booboobo7bo3boobb3o34bo9bo3bo9bo123b oo467boo8boobobo30boo4bo16b5o$994b3o7boobobo5bo4bobobobo4bo34bobbo15bo bbo606bo33boboobo17boo$993booboboo3bo5bobobb5obboobo40booboo4bo5bo4boo boo588bo18boo$992bo3bo3bobboobobobbo4bo3boobobboobobo37b7obob7o588b3ob oo3bo3boboo4bobboo30bobbo$1001b3oboobb3o14b3o39bobobo9bobobo579b3o3bo bb3obobooboobooboboob3o32bobbo$738boboo257bobbo3b3o4bo12bo637boobobobb o9bo6boobo5bobbo$737boobooboo256bo5boo3bo13bo636bo3bobobbobo3bobbobo3b 3o3bob4obo$736bobbobobbo273bo645bobobbobboo4bo10boobb3o$737bo5boo4boo 265b4o648b5o16bo4boo$746booboo261booboo3bo3bo645boo17boboobo$746boo3bo 260boobbo5b4o$393boo351boo263bobbo7bo3bo663bobbo$394boo624bobbobo664bo bbo$393bo627bo$193boo$192boo955bo$194bo905booboo43boo617b3o$1097booboo boboo41bobo616bo$1094b4obb3obbob3o658bo$306bo786bo4bo5b3o4b3o$304b4o 786boo8bob3obobobo$300booboo3bo3bo792b4obobobo$300boobbo5b4o789bobbo4b obo64bo22bo$299bobbo7bo3bo789bo69b3ob3o18b3ob3o$308bobbobo162booboo 245boob3o380bo60bo6boo16boo6bo$309bo164boobobooboo242boo4boo378bo61boo 3bobbo3bo6bo3bobbo3boo$471b3obobb3obb4o238bobbobo3bo449b4o4b4o$467b3o 4b3o5bo4bo244b3obb3o444bo3bobbo3bo$466bobobob3obo8boo247b3obobo441bobb obo4bobobbo$466bobobob4o258bo4bo391b3o49bo12bo$467bobo4bobbo257boo312b o22bo57bo$476bo568b3ob3o18b3ob3o52boo66boboo22boobo$468bo575bo6boo16b oo6bo45boboobboobb3o60boobooboo16boobooboo$468bo576boo3bobbo3bo6bo3bo bbo3boo45boobooboo5bo4boo53bobbobobbo16bobbobobbo$1055b4o4b4o54bobboo 3boboo4booboo54bo5boo4boo4boo4boo5bo$1055bo3bobbo3bo60b4o6boo3bo62boob oo4booboo$1053bobbobo4bobobbo54boboboo8boo66boo3bobbo3boo$1054bo12bo 57bo79boo10boo$485booboo632boo18bo$483boobobooboo536bo22bo68boobbo4boo bo3bo3boob3o$313boob3o161b3obobb3obb4o529b3ob3o18b3ob3o66b3obooboboob ooboobob3obbo3b3o$313boo4boo155b3o4b3o5bo4bo527bo6boo16boo6bo61bobbo5b oboo6bo9bobboboboo$109b3o200bobbobo3bo153bobobob3obo8boo529boo3bobbo3b o6bo3bobbo3boo63bob4obo3b3o3bobobbo3bobobbobo3bo$109bo209b3obb3o148bob obob4o550b4o4b4o78b3obboo10bo4boobbobbobo$110bo210b3obobo148bobo4bobbo 548bo3bobbo3bo78boo4bo16b5o$321bo4bo141b3o14bo547bobbobo4bobobbo77bob oobo17boo$322boo144b3o6bo325boo229bo12bo$477bo324bobo322bobbo10bo12boo $322boo480bo322bobbo4bo3b3o10booboboo$321bobbo139boo7booboo656b4o5b3o 4bo4bobb4o$321bobbo139boo7bobboo655bo3bo5b3o3boo6bo4bo107bo$320boobo 140boo7b3o655b3obo5bobboobboobbo7b3o106b3o$321boboboo13boo16b3oboo381b oboo22boobo354bobboobboboo7boo3bo115boobo$318boobobo16boo14boo4boo380b oobooboo16boobooboo353bo3bobo3boo7b3obobo8bo104b3o$26b3ob3o285boobobob o29bo3bobobbo103b3o272bobbobobbo16bobbobobbo352boo4bobobooboboobbobobo boo4b4oboo102boo$22boboo4bob4o283bobobobbo23b3obb3o110b3o273bo5boo4boo 4boo4boo5bo353bobboobo4bobobbo4boboobbo3bobboboo$21b3o3boboo3boo3bo 280bobbo3boo20bobob3o130b3oboo261booboo4booboo366booboboo3bo3boobb3o4b 3obobobo$20bo3bo3boboo5b4o278b5obb3o3boo16bo4bo128boo4boo261boo3bobbo 3boo364bobbo12b4o7boo$21bo9bo3bobo3bo278b3oboboo4boboobbo14boo128bo3bo bobbo260boo10boo366boo12b3o4bobobbo$31bo3bobobobo282bo7bo3boo24boobo 112b3obb3o665bobo$31bobo4b3o259boo22bo8bobboo21boobooboo110bobob3o$39b o258b3obo10b3o43bobbobobbo110bo4bo238boob3o20b3oboo$294booboo3boobo5bo 3boobb3o31boo4boo5bo114boo239boo4boo16boo4boo$294boobbobboboobo3boo3b 4obobo30booboo363bobbobo3bo14bo3bobobbo$293bobbo6bo3bo5boobo3boo30bo3b oo370b3obb3o4b3obb3o389boobo$292bo10bo3bobbo5bo3bobb3o30boo372b3obobo bbobob3o388boobooboo$295bo6booboobo7bo3boobb3o403bo4bo4bo4bo388bobbobo bbo$290b3o7boobobo5bo4bobobobo4bo403boo10boo383boo4boo5bo$17b3ob3o265b ooboboo3bo5bobobb5obboobo807booboo$13boboo4bob4o261bo3bo3bobboobobobbo 4bo3boobobboobobo760b3o36bo3boo$12b3o3boboo3boo3bo266b3oboobb3o14b3o 22boo737boo3bo39boo$11bo3bo3boboo5b4o263bobbo3b3o4bo12bo762bo3bobbo$ 12bo9bo3bobo3bo264bo5boo3bo13bo762bo6boobo$22bo3bobobobo1055b3obooboo$ 22bobo4b3o318bo11bo135bo387boo197b3o3boboobbo$30bo251b4o11bo50b4o9b4o 131b3ob3o384boo195boo$278boboobobo8bob3o4boo42boo3bo7bo3boo129boo6bo 382bo209bo$277b3o4bobb3o3boboobobooboo39bobo4bo9bo4bobo121bo3bobbo3boo 585b3o4boo$37boo237bo3bo6boobobo3bo4bo3bo37boo3bo7bo7bo3boo119b4o596b oo3b3o$36booboo235boo9boobb3obo4b3o4bo36bo3boo5b3o5boo3bo119bo3bo596b oobboo$35bo3boo235boo8bobobbo7booboo3boo37boboo4bo3bo4boobo122bobobbo 597b3o$35bo3boo233boobo5boobobo8bo3boboboobboo33boobbo6b3o6bobboo124bo 596bobbo$32boobbobo233booboboo4boobobobobb3o4bobboboob3o37bo5b5o5bo 727bo$31bo10boo227bo11bo4bob4obbobobbobobooboo34bo3bobooboo3booboobo3b o$41bobbo227boboobooboo3bo5boo6bo46boo3bo9bo3boo$20bo11bobbo6boo237bo 3b4o3bo13bo43bobboo3boobbo$16b3ob3o11bo244boo10bo12boo$15bo6boo266bo 828bo$16boo3bobbo3bo267b3o800bo18bobbo$26b4o262boboo3bo795bo4bo18bobo$ 26bo3bo260b3o3b3obb3o789bo4boo19bo$24bobbobo260bo3bo4b3obobo789bo$25bo 265bo7bo4bo$300boo799bo$1074bo19bo4b3o18bo$1074boo18bob3obo18bobo$379b o3bo690boboo18b3o19bobbo$377b3oboobobo685bobbo43bo$373booboo6bobbo33b oo648boo6b3oboo$373boobbobbo3bobboobboo27boo643b3obboob3obboo3boo$372b obbo4bobbobbooboboo29bo641bobob3o4bo5b4o$383boo4bo3bo671bo4bo4boobbobo $382boobbobbobobo575b3o96boo9bobbo38bo$384bo68boob3o20b3oboo486bo108bo bboo35boo$6boboo380b3o60boo4boo16boo4boo485bo90bob3o16b4o32boobo$5boob ooboo439bobbobo3bo14bo3bobobbo567bo6bo4boob3oboob3obboo3bo34bobbo$4bo bbobobbo446b3obb3o4b3obb3o572b4o4boobbob4oboboo4b6obo25boob3o6boo144b 3o$5bo5boo4boo442b3obobobbobob3o573boo3boboobb4obo3bobo3bobo5boo25boo 3boobb3oboobb3o138bobbo$14booboo442bo4bo4bo4bo572bo3bob4o9bo8b3ob5o25b 4o5bo4b3obobo137bo$14boo3bo390boo50boo10boo577bo22bobbo3bo30bobobboo4b o4bo138bo$14boo393boboo641bo4bo14booboo34bobbo9boo142bobo$324boob3o20b 3oboo53boboo66bo22bo555bo17bobb3o29boobbo$324boo4boo16boo4boo49bo3boob 3o60b3ob3o18b3ob3o569b4o30b4o16b3obo$323bobbobo3bo14bo3bobobbo44b3ob3o bbo4bo3bo54bo6boo16boo6bo602bo3boobb3oboob3oboo4bo6bo$330b3obb3o4b3obb 3o50bo5boobb3o4b4o54boo3bobbo3bo6bo3bobbo3boo603bob6o4boobob4obobboo4b 4o$332b3obobobbobob3o53bobboboo9bo3bo63b4o4b4o613boo5bobo3bobo3bob4obb oobo3boo$332bo4bo4bo4bo56bo4boo4bobbobo64bo3bobbo3bo613b5ob3o8bo9b4obo 3bo$333boo10boo55b3obo9bo66bobbobo4bobobbo613bo3bobbo22bo$400bo3bo16bo 62bo12bo619booboo14bo4bo$400bobbobo3bo6bobb3o692b3obbo17bo$304boob3o 20b3oboo63boo6b3ob3obobo4b5o4boo683b4o$304boo4boo16boo4boo63booboo3bo bboo3bobo4bobb3o3booboo$303bobbobo3bo14bo3bobobbo62bo12boo3bobob5o4bo 3boo$310b3obb3o4b3obb3o70bobboboobbo12boo3bobbobbobo$312b3obobobbobob 3o74bobboobboo16b4obo$312bo4bo4bo4bo79boobo$313boo10boo78bo$406b4o23b oo$407boo10b3o10bob3o$88b3o322b3obboo3bo5boboo3booboo612bo$90bo321bobo b4o3boo3boboobobbobboo612boo$89bo323boo3boboo5bo3bo6bobbo610bobo$27bo 22bo358b3obbo3bo5bobbo3bo10bo$23b3ob3o18b3ob3o353b3obboo3bo7bobooboo6b o$22bo6boo16boo6bo351bo4bobobobo4bo5boboboo7b3o$23boo3bobbo3bo6bo3bobb o3boo359boboobb5obbobo5bo3booboboo$33b4o4b4o362boboboobboboo3bo4bobbob oboobbo3bo3bo$33bo3bobbo3bo365b3o14b3obboob3o$31bobbobo4bobobbo365bo 12bo4b3o3bobbo$32bo12bo366bo13bo3boo5bo$$bboboo22boobo$boobooboo16boob ooboo$obbobobbo16bobbobobbo$bo5boo4boo4boo4boo5bo383bo$10booboo4booboo 390b3ob3o$10boo3bobbo3boo389boo6bo$10boo10boo384bo3bobbo3boo$407b4o$ 368boo36bo3bo$365booboo37bobobbo$365boobobo40bo$365boobb3o$365b3obobob 3o$363boo11bo$370bobbobo$172bo190bobbo$172boo194bo5boo$171bobo194boo3b obbo$372bo$368bo3bo$368bo3bo897bo$370boo897b3o$1269boboo$1270b3o$1270b oo10$352b3o$355bo$355boo$350b3obboobboobo11boo$344boo4bo5boobooboo10bo bboo$344booboo4boobo3boobbo14bo$343bo3boo6b4o20bo$347boo8boobobo9bo6bo $360bo14bo23b3o$255boo86bo18boo8boobboo20bo$254bobo82b3oboo3bo3boboo4b obboo6bobbobo20boo$256bo74b3o3bobb3obobooboobooboboob3o9b4o15boboobboo bb3o$329boobobobbo9bo6boobo5bobbo6b3o14boobooboo5bo4boo1302bobo$328bo 3bobobbobo3bobbobo3b3o3bob4obo23bobboo3boboo4booboo1301bo$329bobobbobb oo4bo10boobb3o34b4o6boo3bo1300bo$333b5o16bo4boo30boboboo8boo1304bobbo$ 335boo17boboobo33bo1317b3o$390boo18bo$355bobbo30boobbo4boobo3bo3boob3o $355bobbo32b3obooboboobooboobob3obbo3b3o$387bobbo5boboo6bo9bobboboboo$ 388bob4obo3b3o3bobobbo3bobobbobo3bo$393b3obboo10bo4boobbobbobo$393boo 4bo16b5o$394boboobo17boo$$395bobbo$395bobbo10$338boo$339boo$338bo3$ 1269b3o$1268bobbo$1271bo$1271bo$1268bobo51$1113boo155bo$1112boboo153b 3o$1112boboo152boobo$1108bo3boob3o150b3o$1104b3ob3obbo4bo3bo146boo$ 1103bo5boobb3o4b4o$1104bobboboo9bo3bo$1107bo4boo4bobbobo$1105b3obo9bo$ 1103bo3bo16bo$1103bobbobo3bo6bobb3o$1102boo6b3ob3obobo4b5o4boo$1102boo boo3bobboo3bobo4bobb3o3booboo$1102bo12boo3bobob5o4bo3boo$1103bobboboo bbo12boo3bobbobbobo$1084boo19bobboobboo16b4obo$1081booboo24boobo$1078b 4obboo4boo16bo$1077bo4bo4booboo17b4o$1078boo7boo3bo17boo$1087boo4$ 1079boo$1076booboo$1073b4obboo4boo$1072bo4bo4booboo$1073boo7boo3bo11b 6o$1082boo18boboo$1094boo3bobbo$1093bobbo3boo$1093bobbo4bo$1093bobbo5b o$1094boo5boo3$1117boobo$1114boobooboo$1114bobbobobbo$1108boo4boo5bo$ 1108booboo$1107bo3boo$1111boo$$1111boo$1111boo$1110bobbo$1109bobobo$ 1111bobo$1108booboboboo$1111boboboo$1107bobobobo$1107bo3bobbo$1107boo bboob3o$1107bo$1110boobbo154b3o$1109bo159bobbo$1269bo$1269bo$1270bobo 13$1062boob3o$392b3o667boo4boo$391bo669bobbobo3bo$390boo676b3obb3o$ 384boboobboobb3o673b3obobo$383boobooboo5bo4boo667bo4bo$382bobboo3boboo 4booboo656bo3bo7boo$388b4o6boo3bo653b3oboobobo$384boboboo8boo653booboo 6bobbo$386bo666boobbobbo3bobboobboo$383boo18bo648bobbo4bobbobbooboboo$ 382boobbo4boobo3bo3boob3o655boo4bo3bo$384b3obooboboobooboobob3obbo3b3o 646boobbobbobobo$380bobbo5boboo6bo9bobboboboo646bo$381bob4obo3b3o3bobo bbo3bobobbobo3bo651b3o$386b3obboo10bo4boobbobbobo$362b3o21boo4bo16b5o$ 358boboo3bo21boboobo17boo$357b3o3b3obb3o$356bo3bo4b3obobo16bobbo$357bo 7bo4bo17bobbo672boo$366boo693booboo$1058b4obbobo$1057bo4bo4bo$1058boo 7bo$357b3o707bo$353boboo3bo702b3o$352b3o3b3obb3o696bo$351bo3bo4b3obobo 696boboo$352bo7bo4bo701bo$361boo700boo$1062bo3bo$1065bo$1063bo$1065bo $$379b4o681boo$378bob4o$378b3o14b3oboo663b3o203bo$382bobo8boo4boo663bo 204b3o$384bo7bo3bobobbo663bo203boboo$387b3obb3o875b3o$367bobo16bobob3o 662boo213boo$366bobbo17bo4bo659booboo$366bobboo4boo13boo657b4obboo4boo $366b3obbo3bobo670bo4bo4booboo$367b3obo5bo12boo657boo7boo3bo$368booboo bbobo11bobbo665boo$375boo12bobbo$390boboo$387boobobo$390boboboo$388bob oboboo$387bobbobobo$385boo3bobbo$385b3obb5o$386boobob3o$389bo$389bo11$ 1094boo$1094boo3$345bo$341b3ob3o$340bo6boo$341boo3bobbo3bo$351b4o$351b o3bo$349bobbobo$338booboo7bo$335boobooboboo$332b4obb3obbob3o$331bo4bo 5b3o4b3o$332boo8bob3obobobo$343b4obobobo$341bobbo4bobo$342bo$350bo$ 350bo747bo$1096bobo$1097boo3$342b3o924b3o$338boboo3bo922bobbo$337b3o3b obo925bo$336bo3bo4boo924bo$337bo7b3o920bobo$343bobo$342boo$341bo3bo$ 345bo$342boboo$342bo$342b3o$$343bo$$343boo$$345bo$343boo$343bobo3$333b 3o$329boboo3bo$328b3o3b3obb3o$327bo3bo4b3obobo$328bo7bo4bo1369boo$337b oo1371b3o$1710boobo$1711b3o$1712bo10$377bo$377boo$376bobo$$1080boboo 22boobo$1079boobooboo16boobooboo$1078bobbobobbo16bobbobobbo$1079bo5boo 4boo4boo4boo5bo$1088booboo4booboo$1088boo3bobbo3boo$1088boo10boo$391b oobo$388boobooboo$388bobbobobbo1298bo$382boo4boo5bo1299boo$382booboo 883bo424boboo$381bo3boo882b3o421bobbo$385boo881boobo420boo6b3oboo$ 1268b3o415b3obboob3obboo3boo$385boo882boo414bobob3o4bo5b4o$373boo10boo 1299bo4bo4boobbobo$373boo9bobbo1301boo9bobbo$383bobobo1313bobboo$385bo bo1294bob3o16b4o$382booboboboo1283bo6bo4boob3oboob3obboo3bo$385boboboo 1281b4o4boobbob4oboboo4b6obo$381bobobobo1283boo3boboobb4obo3bobo3bobo 5boo$381bo3bobbo1281bo3bob4o9bo8b3ob5o$381boobboob3o69boo1212bo22bobbo 3bo20bo$381bo77bobo1213bo4bo14booboo24b4o$384boobbo72bo1217bo17bobb3o 16bo3bo3booboo$383bo1313b4o17b4o5bobboo$1717bo3bo7bobbo$1718bobobbo$ 358boob3o20b3oboo1332bo$358boo4boo16boo4boo$357bobbobo3bo14bo3bobobbo$ 364b3obb3o4b3obb3o1346bo$366b3obobobbobob3o1347b4o$366bo4bo4bo4bo1342b o3bo3booboo$367boo10boo1342b4o5bobboo$1722bo3bo7bobbo$1723bobobbo$ 1727bo7$1692bo$1688b3ob3o$1687bo6boo$1688boo3bobbo3bo$1698b4o$1698bo3b o$543boo1151bobbobo$544boo1151bo$543bo$1697boo$1696bobbo$1696boboo$ 1695boobobo$1694bobobo$1693booboboboo$1696bobo$1693boobobobboo$1698boo 3bo$1694bo4boo$1694bo4bobobo$1696bobbo$1269b3o$1269bobbo$1269bo$1269bo $1270bobo9$626b3o$628bo$627bo1115boobo$1740boobooboo$1740bobbobobbo$ 1734boo4boo5bo$1734booboo$1733bo3boo$1737boo$1745b3ob3o$1742b4obo4boob o$1738bo3boo3boobo3b3o$1737b4o5boobo3bo3bo$1736bo3bobo3bo9bo$1736bobob obo3bo$1737b3o4bobo$1738bo6$1745bo$1744b4o$1743bo3booboo$1743bo3bobboo $1741bo7bobbo$710bo1030bo$710boo1031boboo$709bobo1033boo$1744bobo$ 1742boo$1734bo8b3o$1733bo3boo4bobboo$1714boo17bo3bo7boo$1714boo17bo6bo 3bobo$1737b4o$1733bo3boboo3boo$1733boo$1744bo$1744bo$1743bobo$1270bo 474bo$1269b3o$1269boboo481bo$1270b3o480b4o$1270boo476bo3bo3booboo$ 1747b4o5bobboo$1746bo3bo7bobbo$1747bobobbo$1751bo5$793boo$792bobo$794b o8$1180bo$1181boo$1180boo7$1693boob3o$1693boo4boo$1692bobbobo3bo$1699b 3obb3o$1701b3obobo$1663b3o35bo4bo$1663bo38boo$1664bo$1702boo$876boo 823bobbo$877boo822bobbo$876bo823boobo$1701boboboo$1698boobobo$1698boob obobo$1699bobobobbo$1700bobbo3boo$1699b5obb3o$1700b3oboboo$1704bo$ 1704bo$$1703bo22bo$1699b3ob3o18b3ob3o$1269b3o426bo6boo16boo6bo$1268bo bbo427boo3bobbo3bo6bo3bobbo3boo$1271bo437b4o4b4o$1271bo437bo3bobbo3bo$ 1268bobo436bobbobo4bobobbo$1708bo12bo3$1581bo$1580boo$1580bobo3$959b3o $961bo$960bo21$1497boo$1497bobo$1497bo$$1043bo$1043boo$1042bobo13$ 1270bo$1269b3o$1268boobo$1268b3o$1269boo3$1375bo$1155bo218bobo$1154b3o 216bo3bo36boo$1153bo3bo216b3o36boo$1154b3o258bo$1153b5o214boo3boo$ 1126boo24boo3boo213boo3boo$1125bobo23bo3bo215boob3obbo$1127bo22boo4bob 3o208boo3bobooboo$1150b5oboboboo16bo161boo9b3o5boo7bo3bo$1152b3obbo4bo 7b3o4b4o8b3o143bobooboo7boobobobooboo7bo4bo3bo$1157bobo9bo3boobo3boo8b obooboo137b3obo3boo4bo3bobobobbobo9b3obbo$1154bob5obo6bobobbobobo3bo4b oobo4boo136bo3boobobobo4boboboo3bobbo6b3o4bo$1158b6o4boo4bobobbo6bobob o3bobbo136bo3b3obob3o5bobob4obbo4boo$1162boo6boobbobob7obobobo147bo3bo bbooboobboboboobo$1171bo4bo5bo5bo3bo146boobbobboo6b4o4bo$1167b3obboobb oo4bo6boo147b3o5bo4bo9b3o$1166b4o4b3o7boobbo4bo143boobboo3bo6bo6bo3boo $1165bo3b3o11boo3bo3boo146boo3boo8bobboo3b3o$1170b3o10b3o151booboo4bo 12bo3boo$1165bobo3boo10boo4b3o154bo4$1346bo$1177bo5boo11bo136b3o8b4o4b 3o$1176b4o3booboo7b4o129booboobo8boo3boboo3bo$1175bo3boobo3boo6bo3bob 3o125boo4boboo4bo3bobobobbobo$1175bo4bobobb3o5boobobbo3bo123bobbo3bobo bo6bobbobo4boo$1174booboboobo8booboboo3boo131bobobob7obobobboo$1175b3o 4bob6obobbobbo134bo3bo5bo5bo4bo$1174boobobobbob3o6booboo136boo6bo4boo bboobb3o$1172bobboob3obbo5bo4boo135bo4bobboo7b3o4b4o$1172bo4b7o6boobbo 3boo131boo3bo3boo11b3o3bo$1172boo4bobbo16boo139b3o10b3o$1172bobbo12bo bbo3b4o134b3o4boo10boo3bobo$1176bobo10bobo4bo$1196bo12$1269b3o$1269bo bbo$1269bo$1269bo$1270bobo14$1382boobo$1144boob3o229boobooboo$1144boo 4boo227bobbobobbo$1143bobbobo3bo220boo4boo5bo$1150b3obb3o205boo8booboo $1152b3obobo204boo7bo3boo$1152bo4bo197b3o18boo$1153boo200bo29bo$1142bo boo210bo26b3ob3o$1141boobooboo233boo6bo$1140bobbobobbo35boo191bo3bobbo 3boo$1141bo5boo4boo30boo189b4o$1150booboo29bo190bo3bo$1150boo3bo220bob obbo$1150boo228bo5$1166boo$1166boo184bo22bo$1152boboo22boobo166b3ob3o 18b3ob3o$1151boobooboo16boobooboo164bo6boo16boo6bo$1150bobbobobbo16bo bbobobbo164boo3bobbo3bo6bo3bobbo3boo$1151bo5boo4boo4boo4boo5bo175b4o4b 4o$1160booboo4booboo184bo3bobbo3bo$1160boo3bobbo3boo182bobbobo4bobobbo $1160boo10boo183bo12bo5$1264bo$1265bo7bo$1263b3o6boo$1272bobo3$1267b3o $1269bo$1268bo!golly-2.5-src/Patterns/Life/Rakes/c4-sideways-rake.rle0000644000175100001440000012735412156145314017533 00000000000000#C p4508+32N c/4 adjustable-period sideways glider rake. #C This rake has an engine convoy at the front, two convoys #C forming lines behind that, and a V-shaped convoy at the back. #C The recipe to create the next rake in the series is: #C - Move the top line convoy orthogonally right by 6 cells. #C - Move the left line convoy orthogonally down by 6 cells. #C - Move the V-shaped convoy diagonally back by 6 cells. #C This will increase the period by 32 generations. #C The modifications can be be made in the opposite direction #C to form the earlier rakes in the series. Moving the convoys #C by 300 cells creates the first rake in the series (period 4508). #C Note that each rake has to be run a few cycles before it becomes #C fully populated and begins to emit gliders. #C David Bell, 14 October 2005 x = 3285, y = 3306, rule = B3/S23 18boo$17boo$19bo$21boo$20bo$$19bobbo$11boo5boo$10boo5bo$12bo4bobo$8bo 5boobbo$7boo5boo$7bobo8bo26b3o$17bobo25bobb3o$10boo6bobo25bobo$10boo7b obo29bo$20boo27bo$bo6boo3bo37bobo$oo5bobbobobo9boo18boobo6bo$obo3boobo 3bobo7bobbo16boo3bobbobbo$4bo9bobo7bobo10b3o4bobbobbo3bo$3bo11boo8bo 11bo6bobbobbo3bo$3bobbo33bo3bo6bobo$19bo17bobbo8boo$18bobo17bobbo6b3o$ 18bobbo9bo7bo5bo3bo23boo$19boo9bobo8boboboobo23boo3bo$29bo13boo29boboo $29boo16bo28b3o$27boo47bo$26bobo15bobbo30b3o$25bo45boobo4boo$26bo44bob oo3bobo$65boo4boboo3b3o$64boo6bo5b3o$65bobo4boo4bobo$65b3o4boobboo$20b oobo41boo6bobo$20bo3bo42bobo3boo3bo$20bo4bo47b4o$22boo45bobo$24bobo44b 4o$71b4o$19bo6boo44boo$18b5o4bobbo$12boo4bo6boo$12bobo11bo$12bo5boboo 6bobo$13boo4bo4bobo$13bobbo6b3o403boo$13bo6booboo403boo$15bobobobbo 399boo5bo$421boo5boo$17bo4bo400bo4bobobboo$18b4o403boo3boob4o$425boo 10bo$437bo$431bo$431bo3bo$430booboo$430bo3boboo$431boob4o$436boobbo$ 437boobo$34bo403bo$33b5o400boo$33bobboo400b3o$35boobo399boobbo$442bobo $38bobo398bo3bobo$439b6o$31b3o6b3o398b3o$26bo4bobb3o4b3o$25boo5boob5ob 3o$25bobo3b3o4booboo$37bobo$27b3o6bobbo$26b3o7bo$28bobob4obbo$30booboo $30b6o15$512bo$500boo9boo$499boo3bo6bobo$501boboo15b3o$453b3o47b3o5bob o4booboo$453bo49bo6boobobobo$456bo48b3obo6boboo$453bobbo49boo7bo$454bo bbo48boo5boo$455bo52b5o$457bobo$459boo$460bo$459boo68boo$458b3o67boo$ 453boobooboo61boo5bo$453bo3boboo60boo5boo$453bob3obbo62bo4bobobboo$ 458boo65boo3boob4o$457b3o65boo10bo$537bo$531bo$456b3o72bo3bo$456b3o71b ooboo$530bo3boboo$455boo74boob4o$455bo80boobbo$537boobo$538bo$538boo$ 538b3o$466boo70boobbo$466bobo73bobo$466bo8b3o61bo3bobo$469bo3booboo61b 6o$469boobo68b3o$472b3o$$469bo3bobo4bo$468boobob3o3b5ob4o$468bo3bo8b3o 4b3o$467boo5bo3bo4bob3o$467bo6bobbobbo6bo$468bo8bo10bo3bo$474boboobo7b o$473boo13bobbo$473bobo13bo$$475bo$473boo$$473boo$473boobobo$476bo3bo$ 473boo5bo$475b5o4$612bo$600boo9boo$599boo3bo6bobo$601boboo15b3o$553b3o 47b3o5bobo4booboo$553bo49bo6boobobobo$556bo48b3obo6boboo$553bobbo49boo 7bo$554bobbo48boo5boo$555bo52b5o$557bobo$559boo$560bo$514boo43boo68boo $513boo3bo39b3o67boo$515boboo34boobooboo61boo5bo$517b3o33bo3boboo60boo 5boo$517bo35bob3obbo62bo4bobobboo$519b3o36boo65boo3boob4o$512boobo4boo 35b3o65boo10bo$512boboo3bobo115bo$506boo4boboo3b3o109bo$505boo6bo5b3o 34b3o72bo3bo$506bobo4boo4bobo34b3o71booboo$506b3o4boobboo111bo3boboo$ 506boo6bobo38boo74boob4o$508bobo3boo3bo35bo80boobbo$514b4o119boobo$ 510bobo125bo$512b4o122boo$512b4o122b3o$513boo51boo70boobbo$566bobo73bo bo$566bo8b3o61bo3bobo$569bo3booboo61b6o$569boobo68b3o$572b3o$$569bo3bo bo4bo$568boobob3o3b5ob4o$568bo3bo8b3o4b3o$567boo5bo3bo4bob3o$567bo6bo bbobbo6bo$568bo8bo10bo3bo$574boboobo7bo$573boo13bobbo$573bobo13bo$$ 575bo$573boo$$573boo$573boobobo$576bo3bo$573boo5bo$575b5o4$712bo$700b oo9boo$699boo3bo6bobo$701boboo15b3o$653b3o47b3o5bobo4booboo$653bo49bo 6boobobobo$656bo48b3obo6boboo$653bobbo49boo7bo$654bobbo48boo5boo$655bo 52b5o$657bobo$659boo$660bo$614boo43boo68boo$613boo3bo39b3o67boo$615bob oo34boobooboo61boo5bo$617b3o33bo3boboo60boo5boo$617bo35bob3obbo62bo4bo bobboo$619b3o36boo65boo3boob4o$612boobo4boo35b3o65boo10bo$612boboo3bob o115bo$606boo4boboo3b3o109bo$605boo6bo5b3o34b3o72bo3bo$606bobo4boo4bob o34b3o71booboo$606b3o4boobboo111bo3boboo$606boo6bobo38boo74boob4o$608b obo3boo3bo35bo80boobbo$614b4o119boobo$610bobo125bo$612b4o122boo$612b4o 122b3o$613boo51boo70boobbo$666bobo73bobo$666bo8b3o61bo3bobo$669bo3boob oo61b6o$669boobo68b3o$672b3o$$669bo3bobo4bo$668boobob3o3b5ob4o$668bo3b o8b3o4b3o$667boo5bo3bo4bob3o$667bo6bobbobbo6bo$668bo8bo10bo3bo$674bob oobo7bo$673boo13bobbo$673bobo13bo$$675bo$673boo$$673boo$673boobobo$ 676bo3bo$673boo5bo$675b5o4$812bo$800boo9boo$799boo3bo6bobo$801boboo15b 3o$753b3o47b3o5bobo4booboo$753bo49bo6boobobobo$756bo48b3obo6boboo$753b obbo49boo7bo$754bobbo48boo5boo$755bo52b5o$757bobo$759boo$760bo$714boo 43boo$713boo3bo39b3o$715boboo34boobooboo$717b3o33bo3boboo$717bo35bob3o bbo$719b3o36boo$712boobo4boo35b3o100boo$712boboo3bobo137boo3bo$706boo 4boboo3b3o112bo26boboo$705boo6bo5b3o34b3o74boo28b3o$706bobo4boo4bobo 34b3o68bo5bobo27bo$706b3o4boobboo107boo37b3o$706boo6bobo38boo69bobo3b oobobo20boobo4boo$708bobo3boo3bo35bo74bo7boo18boboo3bobo$714b4o111bo4b o5boo10boo4boboo3b3o$710bobo116bobbobb6o10boo6bo5b3o$712b4o136bobo4boo 4bobo$712b4o136b3o4boobboo$713boo51boo72bo3boo6boo6bobo$766bobo69boob oob4o6bobo3boo3bo$766bo8b3o61bo8bo11b4o$769bo3booboo62boo6bo7bobo$769b oobo85b4o$772b3o69boo12b4o$859boo$769bo3bobo4bo$768boobob3o3b5ob4o$ 768bo3bo8b3o4b3o$767boo5bo3bo4bob3o85boobo7b3o$767bo6bobbobbo6bo85bo3b o6bo$768bo8bo10bo3bo80bo4bo7bo7boo$774boboobo7bo87boo7bobo4boobo$773b oo13bobbo85bobo4b3obobboo$773bobo13bo93bo3boobboo$879boob4oboo$775bo 104b7o$773boo$$773boo$773boobobo$776bo3bo$773boo5bo$775b5o8$852boo$ 852bobo$852bo$853boo$853bobbo$853bo$855bobo$859bo$857bobbo$814boo41bo bbo$813boo3bo40b3o$815boboo36b3ob3o$817b3o31b3oboobb3o$817bo33bo7boo$ 819b3o30bo6boo$812boobo4boo33b5o$812boboo3bobo35boo$806boo4boboo3b3o 34boo$805boo6bo5b3o34boo$806bobo4boo4bobo33bobo$806b3o4boobboo35boo$ 806boo6bobo37bobo$808bobo3boo3bo33bo$814b4o36boo$810bobo$812b4o$812b4o $813boo10$885boo$884boo3bo$886boboo$888b3o$888bo$890b3o$883boobo4boo$ 883boboo3bobo$877boo4boboo3b3o$876boo6bo5b3o$877bobo4boo4bobo$877b3o4b oobboo$877boo6bobo$879bobo3boo3bo$885b4o$881bobo$883b4o$883b4o$884boo 4$960boo$960bobo$960bo$963bo$963boo3bo$963boobbobo$964boboobbo$964boob ob3o$964bobo3boo$964bo5bo$950b3o17boo$950bo12boo$951bo10boboo$953b3o5b o4bo$954b6oboo3bo$957bo4bo7boobo7b3o$956bobo4boo5bo3bo6bo$955b3o12bo4b o7bo7boo$954bo17boo7bobo4boobo$955bobo16bobo4b3obobboo$956b5o19bo3boo bboo$957boobo15boob4oboo$977b7o5$52bo$51boo$51bobo$$54boo$54boo$$50bob oo$49b4o$49bo3boo4boo$54bobb3obo$61bo$53boo4bo$53boo4b3o$54bo3bobbo$ 54bo5b3o$55boo3b4o$63b5o$65b3oboo$62boobbo3bo$70boo$67booboo$69b3o$68b obo$69bo6$1001bo$1000boo$99boobo7b3o881bo5bobo$99bo3bo6bo882boo$99bo4b o7bo7boo871bobo3boobobo$101boo7bobo4boobo876bo7boo$103bobo4b3obobboo 877bo4bo5boo$109bo3boobboo877bobbobb6o$105boob4oboo$106b7o$1002boobboo $1002bob4o$1002bo4bobo$1010bo$1009b3o44bo$126b3o926boo$126bo9boo871bo 45bobo$127bo6b3obo827b3o$129boobboo831bo42boobo45boo$130bo838bo39boob 4o42boobb3o$134bo831bobbo40bobb4o45boobo$130boo3bo831bobbo40boo47bo4bo $129boboboo5boobboboobo818bo90b3o4bo$129bobobbobooboo3boboobo820bobo 86bo5bo$128bo4boo6bobo6bo821boo72boo12bobobboo$128boo9bo7boobo822bo71b oo$128boo7b3o10bo821boo73bo9b3o$136bo10bobbo820b3o75boo6booboo$134bo4b o10bo815boobooboo75boobboobbob3o$133boobbo10boo816bo3boboo78boobobboo$ 134boo830bob3obbo79bo4boo$134boo835boo33boo42boo3bo$134b3o833b3o32boo 43boo$1007bo42bo$134bobo872boo40booboo$134bobo832b3o36bo44bobo$134bob oobo829b3o$134boobbobo862b3obobbo$135bo5bo826boo33bobbo$135bo832bo37bo bbo$140bo863bo$138bo865b4o$983bo16b3o4bobo$982boo16bobbo$982bobo17bo$ 1001boo3boo$985boo14boo3bobo63boobo7b3o$985boobb3o9b3obbo65bo3bo6bo$ 97bo891boobo13bo65bo4bo7bo7boo$96boo889bo4bo10boboob3o63boo7bobo4boobo $96bobo887b3o4bo11boo5bo12boo49bobo4b3obobboo$986bo5bo11b3o6bo11bobo 54bo3boobboo$98b3o872boo12bobobboo16bobo12bo52boob4oboo$97b3o872boo32b oboo16boo51b7o$99bobo74bo797bo9b3o39bobbo$101b3o71b5o796boo6booboo37bo $101b3o71bobboo796boobboobbob3o39bobo$104bo72boobo798boobobboo45bo$ 101bobbo875bo4boo43bobbo$100bo3bo75bobo794boo3bo47bobbo$96booboo3bo 872boo53b3o$95boo7bo68b3o6b3o792bo50b3ob3o$97boboobbo64bo4bobb3o4b3o 792booboo41b3oboobb3o$103bo63boo5boob5ob3o794bobo41bo7boo$100bobo64bob o3b3o4booboo840bo6boo$101bo77bobo846b5o$100bo68b3o6bobbo848boo$99bobo 66b3o7bo850boo$99bobo68bobob4obbo848boo$98bo73booboo851bobo$98boo11bo 60b6o849boo$98boo10boo915bobo$110bobo913bo70bo10boo$1027boo67b5o6boo$ 113boo981bobboo8bo7boo$113boo983boobo5boo6b3obo$1107boo3boboo$109boboo 988bobo6boo$108b4o925b3o66b3obo4bo$108bo3boo4boo917bo9boo54b3o3bo4bo$ 113bobb3obo917bo6b3obo54bo7bo$120bo919boobboo58bo6bo$112boo4bo922bo$ 112boo4b3o924bo61bo$113bo3bobbo920boo3bo$113bo5b3o918boboboo5boobboboo bo$114boo3b4o917bobobbobooboo3boboobo$122b5o912bo4boo6bobo6bo$124b3ob oo909boo9bo7boobo$121boobbo3bo909boo7b3o10bo$129boo916bo10bobbo$126boo boo914bo4bo10bo$128b3o913boobbo10boo$127bobo915boo$128bo916boo$1045b3o $$1045bobo$1045bobo$1045boboobo$1045boobbobo$1046bo5bo$158boobo7b3o 874bo$158bo3bo6bo881bo$158bo4bo7bo7boo868bo$160boo7bobo4boobo$162bobo 4b3obobboo$168bo3boobboo$164boob4oboo$165b7o6$185b3o$185bo9boo$186bo6b 3obo$188boobboo892bo$189bo895b5o$193bo891bobboo$189boo3bo892boobo$188b oboboo5boobboboobo$188bobobbobooboo3boboobo881bobo$187bo4boo6bobo6bo$ 187boo9bo7boobo873b3o6b3o$187boo7b3o10bo868bo4bobb3o4b3o$195bo10bobbo 867boo5boob5ob3o71boobo$193bo4bo10bo867bobo3b3o4booboo72bo3bo$192boobb o10boo880bobo75bo4bo$193boo884b3o6bobbo77boo$193boo883b3o7bo82bobo$ 193b3o884bobob4obbo$1082booboo79bo6boo$193bobo886b6o77b5o4bobbo$193bob o963boo4bo6boo$193boboobo960bobo11bo$193boobbobo959bo5boboo6bobo$194bo 5bo959boo4bo4bobo$194bo965bobbo6b3o$199bo960bo6booboo4bo10boo$197bo 964bobobobbo5b5o6boo$1175bobboo8bo7boo$1164bo4bo7boobo5boo6b3obo$1165b 4o17boo3boboo$1180bobo6boo$1185b3obo4bo$1182b3o3bo4bo$156bo989b3o34bo 7bo$155boo989bobb3o31bo6bo$155bobo989bobo$1152bo33bo$157b3o990bo$156b 3o993bobo$158bobo74bo909boobo6bo$160b3o71b5o905boo3bobbobbo$160b3o71bo bboo899b3o4bobbobbo3bo$163bo72boobo898bo6bobbobbo3bo$160bobbo977bo3bo 6bobo$159bo3bo75bobo896bobbo8boo$155booboo3bo975bobbo6b3o$154boo7bo68b 3o6b3o896bo5bo3bo$156boboobbo64bo4bobb3o4b3o897boboboobo$162bo63boo5b oob5ob3o899boo$159bobo64bobo3b3o4booboo904bo$160bo77bobo$159bo68b3o6bo bbo904bobbo$158bobo66b3o7bo$158bobo68bobob4obbo$157bo73booboo$157boo 11bo60b6o$157boo10boo$169bobo$$172boo$172boo$$168boboo$167b4o$167bo3b oo4boo$172bobb3obo$179bo$171boo4bo$171boo4b3o$172bo3bobbo$172bo5b3o$ 173boo3b4o$181b5o$183b3oboo$180boobbo3bo$188boo$185booboo$187b3o$186bo bo$187bo8$217boobo7b3o$217bo3bo6bo$217bo4bo7bo7boo$219boo7bobo4boobo$ 221bobo4b3obobboo$227bo3boobboo$223boob4oboo$224b7o6$244b3o$244bo9boo$ 245bo6b3obo$247boobboo$248bo$252bo$248boo3bo$247boboboo5boobboboobo$ 247bobobbobooboo3boboobo$246bo4boo6bobo6bo$246boo9bo7boobo$246boo7b3o 10bo$254bo10bobbo$252bo4bo10bo$251boobbo10boo$252boo$252boo$252b3o$$ 252bobo$252bobo$252boboobo$252boobbobo$253bo5bo$253bo$258bo$256bo7$ 215bo$214boo$214bobo$$216b3o$215b3o$217bobo74bo$219b3o71b5o$219b3o71bo bboo$222bo72boobo$219bobbo$218bo3bo75bobo$214booboo3bo$213boo7bo68b3o 6b3o$215boboobbo64bo4bobb3o4b3o$221bo63boo5boob5ob3o$218bobo64bobo3b3o 4booboo$219bo77bobo$218bo68b3o6bobbo$217bobo66b3o7bo$217bobo68bobob4o bbo$216bo73booboo$216boo11bo60b6o$216boo10boo$228bobo$$231boo$231boo$$ 227boboo$226b4o$226bo3boo4boo$231bobb3obo$238bo$230boo4bo$230boo4b3o$ 231bo3bobbo$231bo5b3o$232boo3b4o$240b5o$242b3oboo$239boobbo3bo$247boo$ 244booboo$246b3o$245bobo$246bo8$276boobo7b3o$276bo3bo6bo$276bo4bo7bo7b oo$278boo7bobo4boobo$280bobo4b3obobboo$286bo3boobboo$282boob4oboo$283b 7o6$303b3o$303bo9boo$304bo6b3obo$306boobboo$307bo$311bo$307boo3bo$306b oboboo5boobboboobo$306bobobbobooboo3boboobo$305bo4boo6bobo6bo$305boo9b o7boobo$305boo7b3o10bo$313bo10bobbo$311bo4bo10bo$310boobbo10boo$311boo $311boo$311b3o$$311bobo$311bobo$311boboobo$311boobbobo$312bo5bo$312bo$ 317bo$315bo7$274bo$273boo$273bobo$$275b3o$274b3o$276bobo74bo$278b3o71b 5o$278b3o71bobboo$281bo72boobo$278bobbo$277bo3bo75bobo$273booboo3bo$ 272boo7bo68b3o6b3o$274boboobbo64bo4bobb3o4b3o$280bo63boo5boob5ob3o$ 277bobo64bobo3b3o4booboo$278bo77bobo$277bo68b3o6bobbo$276bobo66b3o7bo$ 276bobo68bobob4obbo$275bo73booboo$275boo72b6o$275boo4$296boo$295boo$ 297bo$299boo$298bo$$297bobbo$294boobo$293boo4bo$295bobobbo$300bo$297bo bbo$298bobo3bo$298bobo3boo$299boobbobbo$299bo4bobo$304bo$$303boo3bo$ 303boo3bo$304bo$304bo$305boo3$300bo46boo$299b5o31b3o9bobo$299bobboo31b obb3o6bo9bo$301boobo31bobo16boobo$341bo4boobbo3boobbo$304bobo32bo6boo bboboobbo$341boboobo3b5o$297b3o6b3o41boo$292bo4bobb3o4b3o32bobb6o$291b oo5boob5ob3o33b7o$291bobo3b3o4booboo36b3o$303bobo$293b3o6bobbo$292b3o 7bo$294bobob4obbo$296booboo$296b6o6$313b3o$313bo$316bo$313bobbo64bo$ 314bobbo62b5o$315bo64bobboo$317bobo62boobo$319boo$320bo64bobo$319boo$ 318b3o57b3o6b3o$313boobooboo52bo4bobb3o4b3o$313bo3boboo51boo5boob5ob3o $313bob3obbo51bobo3b3o4booboo$318boo64bobo$317b3o54b3o6bobbo$373b3o7bo $375bobob4obbo$316b3o58booboo$316b3o58b6o$$315boo$315bo55$404boo$404bo bo$404bo$407bo$407boo3bo$407boobbobo$408boboobbo$408boobob3o$408bobo3b oo$408bo5bo$394b3o17boo$394bo12boo$395bo10boboo$397b3o5bo4bo$398b6oboo 3bo$401bo4bo$400bobo4boo59boobo7b3o$399b3o66bo3bo6bo$398bo69bo4bo7bo7b oo$399bobo68boo7bobo4boobo$400b5o4b3o60bobo4b3obobboo$401boobo4bo68bo 3boobboo$412bo61boob4oboo20bo$409bobbo62b7o21boo$410bobbo89bobo$411bo$ 413bobo90boo$415boo89boobb3o$416bo93boobo$415boo91bo4bo$414b3o90b3o4bo $409boobooboo90bo5bo$409bo3boboo77boo12bobobboo$409bob3obbo76boo$414b oo79bo9b3o$413b3o81boo6booboo$497boobboobbob3o$500boobobboo$412b3o86bo 4boo$412b3o83boo3bo$498boo$411boo85bo$411bo87booboo$454boo45bobo$453b oo$455bo$457boo$456bo$$455bobbo$452boobo37boo$451boo4bo35bobb3o$453bob obbobb3o29bob4o$458bobbo26boo4bo3bobo$455bobbo3bo25bobboo9bo$456bobo3b o20bo4bo3bo7b3o$456bobobboo19boo5boobo3b7obo$457boobb3o18bobo3bo3boobb o$457bo28bo10bobbo3bo$463boboboboo14bo4bobbo6bo3bo$464boo3b3o13bobbo 11bobbo$465bo6bo$469boobo28bobo$470boo30bo$470boo$470boo$471bo8$513boo $501b3o9bobo$501bobb3o6bo9bo$502bobo16boobo$507bo4boobbo3boobbo$505bo 6boobboboobbo$507boboobo3b5o$516boo$508bobb6o$509b7o$511b3o3$529boo$ 529bobo$529bo8b3o$532bo3booboo$532boobo$535b3o$$532bo3bobo4bo$476bo54b oobob3o3b5ob4o$475boo54bo3bo8b3o4b3o$475bobo52boo5bo3bo4bob3o$530bo6bo bbobbo6bo$478boo51bo8bo10bo3bo$478boobb3o52boboobo7bo$482boobo50boo13b obbo$480bo4bo50bobo13bo$479b3o4bo$479bo5bo52bo$466boo12bobobboo49boo$ 465boo$467bo9b3o56boo$469boo6booboo54boobobo$469boobboobbob3o57bo3bo$ 472boobobboo56boo5bo$473bo4boo58b5o$470boo3bo$470boo$470bo$471booboo$ 473bobo6$497b3o$497bo$500bo$497bobbo$498bobbo$499bo78boo$501bobo73boo 3bo$503boo74boboo$504bo76b3o$503boo76bo$502b3o78b3o$497boobooboo71boob o4boo$497bo3boboo71boboo3bobo$497bob3obbo65boo4boboo3b3o$502boo65boo6b o5b3o$501b3o66bobo4boo4bobo$570b3o4boobboo$570boo6bobo$500b3o69bobo3b oo3bo$500b3o75b4o$574bobo$499boo75b4o$499bo76b4o$577boo$524boo$523boo$ 524bobo$524b3o$524boo$526bobo$$528bobo$530b3o$530bo$529bo609bo$524bob oobo4bo603boo$523booboobo602bo5bobo$523bobo4bo600boo$528boo601bobo3boo bobo$528bo3bo602bo7boo$527bo3bo602bo4bo5boo$1134bobbobb6o$527bobbo$ 526boobo$526bo613boobboo$525boo613bob4o$525bo614bo4bobo$526bo621bo$ 1147b3o$$1147bo$$1147boobo$1147boob4o$1148bobb4o$1149boo4$1109boo$ 1108boo$1110bo99b3o$1112boo96bo$1111bo91b3o6bo$1203bo6bobo$1110bobbo 90bo4boob4o$607boobo496boobo95b4ob5oboo$607bo3bo494boo4bo94boo7boobo$ 607bo4bo495bobobbobb3o$609boo502bobbo$611bobo496bobbo3bo95bobbo$1111bo bo3bo94b5obo$606bo6boo496bobobboo94bo6bo$605b5o4bobbo494boobb3o94boboo 3bo$599boo4bo6boo498bo108bo$599bobo11bo504boboboboo92bobo$599bo5boboo 6bobo501boo3b3o$600boo4bo4bobo506bo6bo91bobbo$600bobbo6b3o511boobo91bo bbo$600bo6booboo513boo93boboobo$602bobobobbo515boo93boobbobo$1125boo 94bo5bo$604bo4bo516bo94bo$605b4o617bo$1224bo3$586b3o$586bobb3o$587bobo $592bo$590bo$592bobo$585boobo6bo$584boo3bobbobbo$578b3o4bobbobbo3bo$ 578bo6bobbobbo3bo$581bo3bo6bobo$578bobbo8boo$579bobbo6b3o$580bo5bo3bo$ 582boboboobo$584boo$588bo3boo$591boo$585bobbo3bobo$592b3o$592boo699boo $594bobo684b3o9bobo$1281bobb3o6bo9bo$596bobo637bo45bobo16boobo$598b3o 634boo50bo4boobbo3boobbo$598bo636bobo47bo6boobboboobbo$597bo689boboobo 3b5o$592boboobo4bo634b3o56boo$591booboobo638b3o49bobb6o$591bobo4bo639b obo48b7o$596boo642b3o48b3o$596bo3bo639b3o$595bo3bo643bo$1240bobbo$595b obbo640bo3bo$594boobo637booboo3bo$594bo639boo7bo$593boo641boboobbo$ 593bo648bo$594bo644bobo$1240bo$1239bo$1238bobo$1238bobo$1135boo100bo$ 1135bobo99boo101bo10boo$1135bo101boo100b5o6boo$1138bo200bobboo8bo7boo$ 1138boo201boobo5boo6b3obo$1138boo210boo3boboo$1137boo205bobo6boo$1133b ooboo110boo99b3obo4bo$1133bo4bo108boo9bo87b3o3bo4bo$1133bob4o4boo104bo 6boobo87bo7bo$1137boo3boobo105boobboobbo87bo6bo$1137boo4bo107b4obbo$ 1137boo4bobo107b3o94bo$1139bobboobo108bo$1138boo110b3oboobo3boobo3boo$ 1138bo4bo3bo102b3obbobo3bo3boob3o$1139bo4bo4boo103bobbo3bo9bo$1145bobo 3boo96boo4bo7bobooboobo$1146bo5b3o94bo9boo8boo$1149b3o105bobo9boo$ 1151bo103b6o8boo$1152bo3bo98bobbo11bo$1151bo103bo$1152bobbo100bo$1153b o102bo$1256bo$$1255b3o$1255boobbo$1259bobo$1256bo3bobo$1195bo60b6o$ 1183boo9boo62b3o$1182boo3bo6bobo$1184boboo15b3o$1186b3o5bobo4booboo$ 1186bo6boobobobo$1188b3obo6boboo$1189boo7bo$1189boo5boo$1191b5o4$1211b o$1210boo$1210bobo7boo$1217boobo$1213boobboo76b3o$1213boobboo76bobb3o$ 1214boo80bobo76b3o$1214b4obo81bo73bo$1213boboboobobb3o4boo67bo68b3o6bo $1212boo9bobb3obooboo66bobo64bo6bobo$1212bobobb3obboo6bo3bo59boobo6bo 64bo4boob4o$1211bo11boo9boo57boo3bobbobbo66b4ob5oboo$1212boo7b3o7boob oo51b3o4bobbobbo3bo67boo7boobo37b3o$1221bobo9b3o51bo6bobbobbo3bo117bo$ 1217b3o12bobo55bo3bo6bobo119bo$1217bo15bo53bobbo8boo77bobbo43boo$1220b o67bobbo6b3o76b5obo42bo3boo$1217bo71bo5bo3bo77bo6bo44boo$1218bobo70bob oboobo79boboo3bo46boo$1218bobo72boo91bo39b6o$1297bo85bobo40bobboobo$ 1217boobo192boo13bo4bo$1217boob4o70bobbo38boo46bobbo25bobo10bo6bo$ 1218bobb4o110boo47bobbo25bo11bo$1219boo115bobo46boboobo25bo7boo3bo$ 1336b3o46boobbobo24boobboobobb3o$1336boo48bo5bo27bo5bo$1338bobo45bo33b obo3bo$1391bo26boboo3bo$1340bobo46bo27booboo$1342b3o72bobbo$1342bo76bo bo$1341bo77bobboo$1336boboobo4bo$1180boo153booboobo$1180bobo152bobo4bo $1180bo159boo33boo$1181boo157bo3bo30bobo$1181bobbo154bo3bo31bo$1181bo 196bo$1183bobo73boobo76bobbo35boo$1187bo71bo3bo74boobo36boo$1185bobbo 70bo4bo73bo34boobboo$1185bobbo72boo74boo33boobboo$1187b3o73bobo71bo35b oboboo$1183b3ob3o148bo34boobbo$1179b3oboobb3o68bo6boo107bob3o$1179bo7b oo68b5o4bobbo100boo5boo$1180bo6boo62boo4bo6boo85b3o15boo$1183b5o63bobo 11bo85bo19bobo$1185boo64bo5boboo6bobo82bo18boo3bo$1184boo66boo4bo4bobo 88boo15bo3boo71bo10boo$1184boo66bobbo6b3o90bo3boo10bo3bobo69b5o6boo$ 1183bobo66bo6booboo94boo11bo75bobboo8bo7boo$1182boo70bobobobbo99boo12b 5o69boobo5boo6b3obo$1182bobo170b6o11booboobb3o19bo56boo3boboo$1181bo 74bo4bo93bobboobo18bo19boo50bobo6boo$1182boo73b4o81boo13bo4bo11bo3bobo boo16bobo54b3obo4bo$1342bobo10bo6bo12bo78b3o3bo4bo$1342bo11bo21boboo 22b3o50bo7bo$1345bo7boo3bo42b3o51bo6bo$1345boobboobobb3o45bobo$1349bo 5bo49b3o50bo$1349bobo3bo49b3o$1347boboo3bo53bo$1346booboo54bobbo$1346b obbo54bo3bo$1348bobo49booboo3bo$1348bobboo46boo7bo$1401boboobbo$1407bo $1404bobo$1405bo$1404bo$1403bobo$1403bobo$1402bo$1402boo273bo10boo$ 1402boo272b5o6boo$1676bobboo8bo7boo$1678boobo5boo6b3obo$1687boo3boboo$ 1681bobo6boo$1413boo271b3obo4bo$1412boo9bo259b3o3bo4bo$1414bo6boobo 259bo7bo$1416boobboobbo259bo6bo$1416b4obbo$1270bo10boo135b3o266bo$ 1269b5o6boo137bo$1269bobboo8bo7boo123b3oboobo3boobo3boo$1271boobo5boo 6b3obo122b3obbobo3bo3boob3o$1205boo73boo3boboo130bobbo3bo9bo$1204boo 68bobo6boo129boo4bo7bobooboobo$1205bobo71b3obo4bo125bo9boo8boo$1205b3o 68b3o3bo4bo16b3o115bobo9boo$1205boo70bo7bo18bo115b6o8boo$1207bobo67bo 6bo20bo114bobbo11bo$1307boo111bo$1209bobo68bo27bo3boo107bo$1211b3o97b oo108bo$1211bo102boo105bo$1210bo97b6o$1205boboobo4bo92bobboobo105b3o$ 1204booboobo84boo13bo4bo104boobbo$1204bobo4bo83bobo10bo6bo108bobo$ 1209boo84bo11bo113bo3bobo$1209bo3bo84bo7boo3bo109b6o$1208bo3bo85boobb oobobb3o112b3o$1302bo5bo$1208bobbo90bobo3bo$1207boobo89boboo3bo$1207bo 91booboo$1206boo91bobbo$1206bo94bobo$1207bo93bobboo6$1255boo$1255bobo 37bo$1255bo38boo$1258bo35bob5o159b3o$1258boo30bo6bo4bo157bobb3o$1258b oo29b4o3bo5bo158bobo$1257boo30bobboo10bo161bo$1253booboo25b3o5bo6boob oobbo158bo$1253bo4bo24bo6bobbo3boobboo3bo159bobo$1253bob4o4boo19bo4b6o 4bobo157boobo6bo71bo$1257boo3boobo20b4oboboo6bobbobo151boo3bobbobbo70b 5o$1257boo4bo23boo12boo3bo145b3o4bobbobbo3bo70bobboo$1257boo4bobo36b3o 147bo6bobbobbo3bo72boobo$1259bobboobo36bo152bo3bo6bobo$1258boo44bo147b obbo8boo79bobo$1258bo4bo3bo36bo148bobbo6b3o122boobo$1259bo4bo4boo183bo 5bo3bo73b3o6b3o38bo3bo$1265bobo3boo183boboboobo69bo4bobb3o4b3o37bo4bo$ 1266bo5b3o183boo72boo5boob5ob3o10b3o26boo$1269b3o190bo69bobo3b3o4boob oo11bo30bobo$1271bo272bobo7b3o6bo$1272bo3bo182bobbo71b3o6bobbo7bo6bobo 23bo6boo$1271bo261b3o7bo11bo4boob4o19b5o4bobbo$1272bobbo259bobob4obbo 11b4ob5oboo10boo4bo6boo$1273bo263booboo16boo7boobo9bobo11bo$1537b6o37b o5boboo6bobo$1581boo4bo4bobo$1567bo5bo7bobbo6b3o$1567bobobob3o5bo6boob oo$1567boobo5bo6bobobobbo$1520boo47b8o$1315bo203boo3bo46b4o10bo4bo$ 1303boo9boo205boboo61b4o$1302boo3bo6bobo206b3o$1304boboo15b3o197bo$ 1306b3o5bobo4booboo199b3o$1306bo6boobobobo197boobo4boo$1308b3obo6boboo 195boboo3bobo74bo10boo$1309boo7bo193boo4boboo3b3o73b5o6boo$1309boo5boo 193boo6bo5b3o73bobboo8bo7boo$1311b5o196bobo4boo4bobo75boobo5boo6b3obo$ 1512b3o4boobboo87boo3boboo$1512boo6bobo83bobo6boo$1514bobo3boo3bo85b3o bo4bo$1331bo188b4o84b3o3bo4bo$1268b3o59boo184bobo90bo7bo$1268bo61bobo 7boo176b4o3boo82bo6bo$1269bo67boobo177b4o3bobo$1271boo60boobboo180boo 4bo86bo$1272bo3boo55boobboo187boo$1275boo57boo190bobbo$1278boo54b4obo 186bo$1272b6o55boboboobobb3o4boo176bobo$1272bobboobo53boo9bobb3obooboo 177bo$1259boo13bo4bo52bobobb3obboo6bo3bo175bobbo$1259bobo10bo6bo51bo 11boo9boo174bobbo$1259bo11bo60boo7b3o7booboo176b3o$1262bo7boo3bo65bobo 9b3o172b3ob3o$1262boobboobobb3o62b3o12bobo169b3oboobb3o$1266bo5bo64bo 15bo170bo7boo$1266bobo3bo67bo184bo6boo$1264boboo3bo65bo190b5o$1263boob oo70bobo189boo$1263bobbo71bobo188boo239b3o$1265bobo261boo239bo$1265bo bboo67boobo187bobo232b3o6bo$1337boob4o183boo234bo6bobo$1338bobb4o182bo bo234bo4boob4o$1339boo185bo239b4ob5oboo$1527boo238boo7boobo3$1773bobbo $1772b5obo$1772bo6bo$1773boboo3bo$1781bo$1778bobo$$1299boo372boo104bo bbo$1298boo372boo105bobbo$1299bobo371bobo104boboobo43b3o$1299b3o371b3o 104boobbobo42bo$1299boo372boo106bo5bo42bo$1301bobo75boobo292bobo103bo 50boo$1379bo3bo402bo46bo3boo$1303bobo73bo4bo292bobo104bo51boo$1305b3o 73boo296b3o157boo$1305bo77bobo293bo153b6o$1304bo373bo154bobboobo$1299b oboobo4bo68bo6boo286boboobo4bo136boo13bo4bo$1298booboobo72b5o4bobbo 282booboobo141bobo10bo6bo$1298bobo4bo65boo4bo6boo286bobo4bo140bo11bo$ 1303boo66bobo11bo291boo33boo109bo7boo3bo$1303bo3bo63bo5boboo6bobo287bo 3bo30bobo108boobboobobb3o$1302bo3bo65boo4bo4bobo290bo3bo31bo114bo5bo$ 1372bobbo6b3o330bo111bobo3bo$1302bobbo66bo6booboo292bobbo35boo108boboo 3bo$1301boobo69bobobobbo232boo59boobo36boo107booboo$1301bo311boo3bo56b o34boobboo108bobbo$1300boo74bo4bo233boboo55boo33boobboo111bobo$1300bo 76b4o236b3o54bo35boboboo110bobboo$1301bo315bo57bo34boobbo$1619b3o89bob 3o$1612boobo4boo85boo5boo$1612boboo3bobo66b3o15boo$1606boo4boboo3b3o 66bo19bobo$1605boo6bo5b3o67bo18boo3bo$1606bobo4boo4bobo69boo15bo3boo 129bo10boo$1606b3o4boobboo73bo3boo10bo3bobo127b5o6boo$1606boo6bobo78b oo11bo133bobboo8bo7boo$1608bobo3boo3bo78boo12b5o127boobo5boo6b3obo$ 1614b4o74b6o11booboobb3o77bo56boo3boboo$1610bobo79bobboobo18bo77boo50b obo6boo$1612b4o63boo13bo4bo11bo3boboboo74bobo54b3obo4bo$1612b4o63bobo 10bo6bo12bo136b3o3bo4bo$1613boo64bo11bo21boboo80b3o50bo7bo$1682bo7boo 3bo100b3o51bo6bo$1682boobboobobb3o103bobo$1686bo5bo107b3o50bo$1686bobo 3bo107b3o$1684boboo3bo111bo$1683booboo112bobbo$1683bobbo112bo3bo$1685b obo107booboo3bo$1685bobboo104boo7bo$1796boboobbo$1802bo$1799bobo$1800b o$1799bo$1798bobo$1798bobo$1797bo$1797boo275bo10boo$1658boo137boo274b 5o6boo$1657boo3bo410bobboo8bo7boo$1659boboo412boobo5boo6b3obo$1661b3o 420boo3boboo$1661bo416bobo6boo$1663b3o142boo273b3obo4bo$1656boobo4boo 141boo9bo261b3o3bo4bo$1656boboo3bobo143bo6boobo261bo7bo$1407bo242boo4b oboo3b3o145boobboobbo261bo6bo$1406b5o238boo6bo5b3o145b4obbo$1406bobboo 239bobo4boo4bobo147b3o268bo$1408boobo238b3o4boobboo151bo$1650boo6bobo 149b3oboobo3boobo3boo$1411bobo238bobo3boo3bo146b3obbobo3bo3boob3o$ 1658b4o152bobbo3bo9bo$1404b3o6b3o238bobo152boo4bo7bobooboobo$1399bo4bo bb3o4b3o239b4o149bo9boo8boo$1398boo5boob5ob3o239b4o157bobo9boo$1398bob o3b3o4booboo241boo156b6o8boo$1410bobo402bobbo11bo$1400b3o6bobbo402bo$ 1399b3o7bo16boo388bo$1401bobob4obbobb3o9bobo387bo$1403booboo6bobb3o6bo 9bo379bo$1403b6o6bobo16boobo$1420bo4boobbo3boobbo377b3o$1418bo6boobbob oobbo379boobbo$1420boboobo3b5o385bobo$1429boo385bo3bobo$1386boo33bobb 6o386b6o$1385boo3bo31b7o389b3o$1387boboo33b3o$1389b3o$1389bo$1391b3o$ 1384boobo4boo$1384boboo3bobo$1378boo4boboo3b3o$1377boo6bo5b3o$1378bobo 4boo4bobo$1378b3o4boobboo$1378boo6bobo$1380bobo3boo3bo$1386b4o$1382bob o$1384b4o$1384b4o467b3o$1385boo468bobb3o$1856bobo$1861bo$1859bo$1388b oo471bobo$1388bobo463boobo6bo$1388bo464boo3bobbobbo$1391bo455b3o4bobbo bbo3bo$1391boo454bo6bobbobbo3bo$1391boo457bo3bo6bobo$1390boo455bobbo8b oo$1386booboo457bobbo6b3o$1386bo4bo457bo5bo3bo$1386bob4o459boboboobo$ 1390boo461boo$1390boo465bo$1390boo$1392bobb3o456bobbo$1391boo4bo$1391b o4bobo$1392bo4boo$1396boboo$1398boo$1395booboo$1396boboo$1396bobo$ 1397boo4$1391b3o$1391bobb3o$1392bobo$1397bo$1395bo$1397bobo$1390boobo 6bo$1389boo3bobbobbo$1383b3o4bobbobbo3bo$1383bo6bobbobbo3bo$1386bo3bo 6bobo$1383bobbo8boo$1384bobbo6b3o$1385bo5bo3bo$1387boboboobo$1389boo$ 1393bo$$1390bobbo3$1406boo$1405boo$1406bobo$1406b3o$1406boo67bo$1408bo bo63b5o$1474bobboo$1410bobo63boobo$1412b3o$1412bo66bobo$1411bo$1406bob oobo4bo55b3o6b3o$1405booboobo55bo4bobb3o4b3o$1405bobo4bo53boo5boob5ob 3o$1410boo54bobo3b3o4booboo$1410bo3bo63bobo$1409bo3bo54b3o6bobbo$1467b 3o7bo$1409bobbo56bobob4obbo$1408boobo59booboo$1408bo62b6o$1407boo$ 1407bo$1408bo$2006bo$2005b5o$2005bobboo$2007boobo$$2010bobo$$2003b3o6b 3o$1998bo4bobb3o4b3o$1997boo5boob5ob3o$1997bobo3b3o4booboo$2009bobo$ 1999b3o6bobbo19bo$1998b3o7bo10boo9boo$2000bobob4obbo7boo3bo6bobo164b3o $2002booboo13boboo15b3o155bo$2002b6o14b3o5bobo4booboo148b3o6bo$2022bo 6boobobobo153bo6bobo$2024b3obo6boboo152bo4boob4o$2025boo7bo19boo137b4o b5oboo$2025boo5boo20bobo137boo7boobo$1985boo40b5o22bo$1984boo3bo67bo$ 1986boboo67boo3bo137bobbo$1512bo475b3o66boobbobo135b5obo$1511b5o472bo 69boboobbo134bo6bo$1511bobboo474b3o65boobob3o134boboo3bo$1513boobo466b oobo4boo65bobo3boo142bo$1983boboo3bobo65bo5bo140bobo$1516bobo458boo4bo boo3b3o51b3o17boo$1976boo6bo5b3o51bo12boo11boo134bobbo44b3o$1509b3o6b 3o456bobo4boo4bobo52bo10boboo9boo135bobbo44bo$1504bo4bobb3o4b3o455b3o 4boobboo57b3o5bo4bo9bobo134boboobo42bo$1503boo5boob5ob3o455boo6bobo60b 6oboo3bo9b3o134boobbobo43boo$1503bobo3b3o4booboo458bobo3boo3bo60bo4bo 13boo136bo5bo43bo3boo$1515bobo467b4o61bobo4boo13bobo133bo52boo$1505b3o 6bobbo463bobo65b3o161bo50boo$1504b3o7bo468b4o3boo56bo25bobo134bo46b6o$ 1506bobob4obbo466b4o3bobo56bobo24b3o179bobboobo$1508booboo471boo4bo59b 5o21bo168boo13bo4bo$1508b6o477boo58boobo20bo169bobo10bo6bo$1991bobbo 75boboobo4bo164bo11bo$1991bo77booboobo172bo7boo3bo$1993bobo73bobo4bo 171boobboobobb3o$1997bo76boo33boo141bo5bo$1995bobbo75bo3bo30bobo140bob o3bo$1995bobbo74bo3bo31bo140boboo3bo$1448bo10boo536b3o44boobbo63bo136b ooboo$1447b5o6boo533b3ob3o43boo4bo23bobbo35boo135bobbo$1447bobboo8bo7b oo519b3oboobb3o44bobo25boobo36boo137bobo$1449boobo5boo6b3obo518bo7boo 40boobb5oboo21bo34boobboo138bobboo$1325boo131boo3boboo523bo6boo39boobb 3o5boobo17boo33boobboo$1324boo126bobo6boo530b5o35boo4boboboo3boo21bo 35boboboo$1325bobo129b3obo4bo528boo36bobo3boobbo3b4obboo17bo34boobbo$ 1325b3o126b3o3bo4bo16b3o509boo37bo6bob3obbo6bo53bob3o$1325boo128bo7bo 18bo511boo40bo6boo59boo5boo$1327bobo125bo6bo20bo509bobo40boo12b3oboo 29b3o15boo$1485boo505boo91bo19bobo$1329bobo126bo27bo3boo500bobo58bo32b o18boo3bo$1331b3o155boo500bo61bo34boo15bo3boo159bo10boo$1331bo160boo 498boo59bo35bo3boo10bo3bobo157b5o6boo$1330bo155b6o600boo11bo163bobboo 8bo7boo$1325boboobo4bo150bobboobo602boo12b5o157boobo5boo6b3obo$1324boo boobo142boo13bo4bo595b6o11booboobb3o107bo56boo3boboo$1324bobo4bo141bob o10bo6bo595bobboobo18bo107boo50bobo6boo$1329boo142bo11bo590boo13bo4bo 11bo3boboboo104bobo54b3obo4bo$1329bo3bo142bo7boo3bo586bobo10bo6bo12bo 166b3o3bo4bo$1328bo3bo143boobboobobb3o587bo11bo21boboo110b3o50bo7bo$ 1480bo5bo592bo7boo3bo130b3o51bo6bo$1328bobbo148bobo3bo592boobboobobb3o 133bobo$1327boobo147boboo3bo597bo5bo137b3o50bo$1327bo149booboo601bobo 3bo137b3o$1326boo149bobbo600boboo3bo141bo$1326bo152bobo598booboo142bo bbo$1327bo151bobboo596bobbo142bo3bo$2082bobo137booboo3bo$2082bobboo 134boo7bo$2223boboobbo$2229bo$2226bobo$2227bo$1473bo752bo$1472boo751bo bo$1472bob5o746bobo$1468bo6bo4bo743bo$1467b4o3bo5bo743boo93bo10boo$ 1467bobboo10bo741boo92b5o6boo$1461b3o5bo6booboobbo834bobboo8bo7boo$ 1461bo6bobbo3boobboo3bo835boobo5boo6b3obo$1462bo4b6o4bobo849boo3boboo$ 1464b4oboboo6bobbobo838bobo6boo$1465boo12boo3bo750boo91b3obo4bo$1480b 3o751boo9bo79b3o3bo4bo$1480bo755bo6boobo79bo7bo$1482bo755boobboobbo79b o6bo$1482bo755b4obbo$2240b3o86bo$2241bo$2237b3oboobo3boobo3boo$2237b3o bbobo3bo3boob3o$2241bobbo3bo9bo$2236boo4bo7bobooboobo$2236bo9boo8boo$ 2244bobo9boo$2242b6o8boo$2242bobbo11bo$2242bo$2243bo$2243bo$2243bo$$ 2242b3o$2242boobbo$2246bobo$2243bo3bobo$2243b6o$2245b3o16$2282b3o$ 2282bobb3o$2283bobo$2288bo$2286bo$2288bobo$1433boo846boobo6bo$1433bobo 844boo3bobbobbo$1433bo840b3o4bobbobbo3bo$1436bo837bo6bobbobbo3bo$1436b oo839bo3bo6bobo$1436boo836bobbo8boo$1435boo838bobbo6b3o$1431booboo840b o5bo3bo$1431bo4bo841boboboobo$1431bob4o4boo837boo$1435boo3boobo840bo$ 1435boo4bo$1435boo4bobo837bobbo$1437bobboobo$1436boo$1436bo4bo3bo$ 1437bo4bo4boo$1443bobo3boo$1444bo5b3o$1447b3o$1449bo$1450bo3bo$1449bo$ 1450bobbo$1451bo7$1493bo$1481boo9boo$1480boo3bo6bobo$1482boboo15b3o$ 1484b3o5bobo4booboo$1484bo6boobobobo$1486b3obo6boboo$1487boo7bo$1487b oo5boo$1489b5o4$1509bo$1508boo$1508bobo7boo$1515boobo$1511boobboo$ 1511boobboo$1512boo$1512b4obo$1511boboboobobb3o4boo$1510boo9bobb3oboob oo$1510bobobb3obboo6bo3bo$1509bo11boo9boo$1510boo7b3o7booboo$1458b3o 58bobo9b3o$1458bo56b3o12bobo$1459bo55bo15bo$1461boo55bo$1462bo3boo47bo $1465boo49bobo$1468boo46bobo$1462b6o$1462bobboobo46boobo$1449boo13bo4b o45boob4o$1449bobo10bo6bo46bobb4o$1449bo11bo55boo$1452bo7boo3bo$1452b oobboobobb3o$1456bo5bo$1456bobo3bo$1454boboo3bo$1453booboo$1453bobbo$ 1455bobo$1455bobboo$$1477boo$1476boo$1477bobo$1477b3o$1477boo$1479bobo 75boobo$1557bo3bo$1481bobo73bo4bo$1483b3o73boo$1483bo77bobo$1482bo$ 1477boboobo4bo68bo6boo$1476booboobo72b5o4bobbo$1476bobo4bo65boo4bo6boo $1481boo66bobo11bo$1481bo3bo63bo5boboo6bobo$1480bo3bo65boo4bo4bobo$ 1550bobbo6b3o$1480bobbo66bo6booboo$1479boobo69bobobobbo901bo$1479bo 980b5o$1478boo74bo4bo900bobboo$1478bo76b4o903boobo$1479bo$2465bobo$$ 2458b3o6b3o$2453bo4bobb3o4b3o$2452boo5boob5ob3o$2452bobo3b3o4booboo$ 2464bobo$2454b3o6bobbo$2453b3o7bo38boo$2455bobob4obbo24b3o9bobo$2457b ooboo28bobb3o6bo9bo$2457b6o28bobo16boobo$2496bo4boobbo3boobbo$2494bo6b oobboboobbo$2496boboobo3b5o$2505boo$2440boo55bobb6o$2439boo3bo53b7o$ 2441boboo55b3o$2443b3o$2443bo$2445b3o$2438boobo4boo$2438boboo3bobo$ 2432boo4boboo3b3o$2431boo6bo5b3o$2432bobo4boo4bobo$2432b3o4boobboo$ 2432boo6bobo$2434bobo3boo3bo$2440b4o$2436bobo$2438b4o$2438b4o$2439boo 19$2514b3o$2514bo$2507b3o6bo$2507bo6bobo$2508bo4boob4o$2510b4ob5oboo$ 2511boo7boobo3$2517bobbo$2516b5obo$2516bo6bo$2517boboo3bo$2525bo$2522b obo$$2315boo206bobbo44b3o$2314boo207bobbo44bo$2315bobo206boboobo42bo$ 2315b3o206boobbobo43boo$2315boo208bo5bo43bo3boo$2317bobo205bo52boo$ 2530bo50boo$2319bobo206bo46b6o$2321b3o251bobboobo$2321bo240boo13bo4bo$ 2320bo241bobo10bo6bo$2315boboobo4bo236bo11bo$2314booboobo244bo7boo3bo$ 2314bobo4bo243boobboobobb3o$2319boo33boo213bo5bo$2319bo3bo30bobo212bob o3bo$2318bo3bo31bo212boboo3bo$2357bo208booboo$2318bobbo35boo207bobbo$ 2317boobo36boo209bobo$2317bo34boobboo210bobboo$2316boo33boobboo$2316bo 35boboboo$2317bo34boobbo$2353bob3o$2349boo5boo$2330b3o15boo$2330bo19bo bo$2331bo18boo3bo$2333boo15bo3boo231bo10boo$2334bo3boo10bo3bobo229b5o 6boo$2337boo11bo235bobboo8bo7boo$2340boo12b5o229boobo5boo6b3obo$2334b 6o11booboobb3o179bo56boo3boboo$2334bobboobo18bo179boo50bobo6boo$2321b oo13bo4bo11bo3boboboo176bobo54b3obo4bo$2321bobo10bo6bo12bo238b3o3bo4bo $2321bo11bo21boboo182b3o50bo7bo$2324bo7boo3bo202b3o51bo6bo$2324boobboo bobb3o205bobo$2328bo5bo209b3o50bo$1655bo672bobo3bo209b3o$1654b5o667bob oo3bo213bo$1654bobboo666booboo214bobbo$1656boobo665bobbo214bo3bo$2327b obo209booboo3bo$1659bobo665bobboo206boo7bo$2540boboobbo$1652b3o6b3o 882bo$1647bo4bobb3o4b3o878bobo$1646boo5boob5ob3o879bo$1646bobo3b3o4boo boo879bo$1658bobo881bobo$1648b3o6bobbo881bobo$1647b3o7bo16boo865bo$ 1649bobob4obbobb3o9bobo864boo93bo10boo$1651booboo6bobb3o6bo9bo856boo 92b5o6boo$1651b6o6bobo16boobo949bobboo8bo7boo$1668bo4boobbo3boobbo951b oobo5boo6b3obo$1666bo6boobboboobbo962boo3boboo$1668boboobo3b5o958bobo 6boo$1677boo873boo91b3obo4bo$1634boo33bobb6o873boo9bo79b3o3bo4bo$1633b oo3bo31b7o876bo6boobo79bo7bo$1635boboo33b3o880boobboobbo79bo6bo$1637b 3o915b4obbo$1637bo919b3o86bo$1639b3o916bo$1632boobo4boo912b3oboobo3boo bo3boo$1632boboo3bobo912b3obbobo3bo3boob3o$1626boo4boboo3b3o916bobbo3b o9bo$1625boo6bo5b3o911boo4bo7bobooboobo$1626bobo4boo4bobo911bo9boo8boo $1626b3o4boobboo922bobo9boo$1626boo6bobo922b6o8boo$1628bobo3boo3bo919b obbo11bo$1634b4o921bo$1630bobo927bo$1632b4o924bo$1632b4o924bo$1633boo$ 2559b3o$2559boobbo$1639bo923bobo$1638boo920bo3bobo$1638bobo919b6o$ 2562b3o$1640b3o$1639b3o$1641bobo$1643b3o$1643b3o$1646bo$1643bobbo$ 1642bo3bo$1638booboo3bo$1637boo7bo$1639boboobbo$1645bo31b3o$1642bobo 32bo$1643bo34bo$1642bo37boo$1641bobo37bo917b3o$1641bobo32bo922bobb3o$ 1640bo34b4o921bobo$1640boo33bobboo925bo$1640boo35bo925bo$1676bobbo925b obo$1673bob6o917boobo6bo$1654boo16b6oboo916boo3bobbobbo$1654bobo15bobb o915b3o4bobbobbo3bo$1654bo19boo915bo6bobbobbo3bo$1657bo17bobboo914bo3b o6bobo$1657boo3bo9bo4boo912bobbo8boo$1657boobbobo9boboboo913bobbo6b3o$ 1658boboobbo10boobobbo911bo5bo3bo$1658boobob3o10bo4bo913boboboobo$ 1658bobo3boo15bo915boo$1658bo5bo11bobo4b3o915bo$1644b3o17boo12boobo$ 1644bo12boo22bo916bobbo$1645bo10boboo$1647b3o5bo4bo$1648b6oboo3bo$ 1651bo4bo$1650bobo4boo$1649b3o$1648bo$1649bobo$1650b5o$1651boobo4$ 1656bo10boo$1655b5o6boo$1655bobboo8bo7boo$1657boobo5boo6b3obo$1503boo 161boo3boboo$1502boo156bobo6boo$1503bobo159b3obo4bo$1503b3o156b3o3bo4b o16b3o$1503boo158bo7bo18bo$1505bobo155bo6bo20bo$1693boo$1507bobo156bo 27bo3boo$1509b3o185boo$1509bo190boo$1508bo185b6o$1503boboobo4bo180bobb oobo$1502booboobo172boo13bo4bo$1502bobo4bo171bobo10bo6bo$1507boo172bo 11bo$1507bo3bo172bo7boo3bo$1506bo3bo173boobboobobb3o$1688bo5bo$1506bo bbo178bobo3bo$1505boobo177boboo3bo$1505bo179booboo$1504boo179bobbo$ 1504bo182bobo$1505bo181bobboo7$1681bo$1680boo$1680bob5o$1676bo6bo4bo$ 1675b4o3bo5bo$1675bobboo10bo$1669b3o5bo6booboobbo$1669bo6bobbo3boobboo 3bo$1670bo4b6o4bobo$1672b4oboboo6bobbobo$1673boo12boo3bo$1688b3o$1688b o$1690bo$1690bo73$1641boo$1641bobo$1641bo$1644bo$1644boo$1644boo$1643b oo$1639booboo$1639bo4bo$1639bob4o4boo$1643boo3boobo$1643boo4bo$1643boo 4bobo$1645bobboobo$1644boo$1644bo4bo3bo$1645bo4bo4boo$1651bobo3boo$ 1652bo5b3o$1655b3o$1657bo$1658bo3bo$1657bo$1658bobbo1188bo$1659bo1189b 5o$2849bobboo$2851boobo$$2854bobo$$2847b3o6b3o$1701bo1140bo4bobb3o4b3o $1689boo9boo1139boo5boob5ob3o$1688boo3bo6bobo1138bobo3b3o4booboo$1690b oboo15b3o1141bobo$1692b3o5bobo4booboo1131b3o6bobbo$1692bo6boobobobo 1135b3o7bo38boo$1694b3obo6boboo1135bobob4obbo24b3o9bobo$1695boo7bo 1141booboo28bobb3o6bo9bo$1695boo5boo1142b6o28bobo16boobo$1697b5o1183bo 4boobbo3boobbo$2883bo6boobboboobbo$2885boboobo3b5o$2894boo$1717bo1111b oo55bobb6o$1716boo1110boo3bo53b7o$1716bobo7boo1102boboo55b3o$1723boobo 1105b3o$1719boobboo1107bo$1719boobboo1109b3o$1720boo1105boobo4boo$ 1720b4obo1101boboo3bobo$1719boboboobobb3o4boo1083boo4boboo3b3o$1718boo 9bobb3obooboo1079boo6bo5b3o$1718bobobb3obboo6bo3bo1080bobo4boo4bobo$ 1664b3o50bo11boo9boo1079b3o4boobboo$1664bo53boo7b3o7booboo1079boo6bobo $1665bo61bobo9b3o1081bobo3boo3bo$1667boo54b3o12bobo1088b4o$1668bo3boo 49bo15bo1085bobo$1671boo53bo1100b4o$1674boo47bo1103b4o$1668b6o50bobo 1101boo$1668bobboobo49bobo1158b3o$1655boo13bo4bo1209bo$1655bobo10bo6bo 47boobo1151b3o6bo$1655bo11bo55boob4o1148bo6bobo$1658bo7boo3bo52bobb4o 1148bo4boob4o$1658boobboobobb3o54boo1154b4ob5oboo$1662bo5bo1213boo7boo bo$1662bobo3bo$1660boboo3bo$1659booboo1224bobbo$1659bobbo1224b5obo$ 1661bobo1223bo6bo$1661bobboo1222boboo3bo$2896bo$2893bobo$$1685boo945b oo260bobbo44b3o$1684boo945boo261bobbo44bo$1685bobo944bobo260boboobo42b o$1685b3o944b3o260boobbobo43boo$1685boo945boo262bo5bo43bo3boo$1687bobo 75boobo865bobo259bo52boo$1765bo3bo1131bo50boo$1689bobo73bo4bo865bobo 260bo46b6o$1691b3o73boo869b3o305bobboobo$1691bo77bobo866bo294boo13bo4b o$1690bo946bo295bobo10bo6bo$1685boboobo4bo68bo6boo859boboobo4bo290bo 11bo$1684booboobo72b5o4bobbo855booboobo298bo7boo3bo$1684bobo4bo65boo4b o6boo859bobo4bo297boobboobobb3o$1689boo66bobo11bo864boo33boo267bo5bo$ 1689bo3bo63bo5boboo6bobo860bo3bo30bobo266bobo3bo$1688bo3bo65boo4bo4bob o863bo3bo31bo266boboo3bo$1758bobbo6b3o903bo262booboo$1688bobbo66bo6boo boo865bobbo35boo261bobbo$1687boobo69bobobobbo866boobo36boo263bobo$ 1687bo946bo34boobboo264bobboo$1686boo74bo4bo865boo33boobboo$1686bo76b 4o866bo35boboboo$1687bo946bo34boobbo$2670bob3o$2666boo5boo$2647b3o15b oo$2647bo19bobo$2648bo18boo3bo$2650boo15bo3boo285bo10boo$2651bo3boo10b o3bobo283b5o6boo$2654boo11bo289bobboo8bo7boo$2657boo12b5o283boobo5boo 6b3obo$2651b6o11booboobb3o233bo56boo3boboo$2651bobboobo18bo233boo50bob o6boo$2638boo13bo4bo11bo3boboboo230bobo54b3obo4bo$2638bobo10bo6bo12bo 292b3o3bo4bo$2638bo11bo21boboo236b3o50bo7bo$2641bo7boo3bo256b3o51bo6bo $2641boobboobobb3o259bobo$2645bo5bo263b3o50bo$2645bobo3bo263b3o$2643bo boo3bo267bo$2642booboo268bobbo$2642bobbo268bo3bo$1936bo10boo695bobo 263booboo3bo$1935b5o6boo696bobboo260boo7bo$1935bobboo8bo7boo953boboobb o$1937boobo5boo6b3obo958bo$1711boo233boo3boboo959bobo$1710boo228bobo6b oo964bo$1711bobo231b3obo4bo959bo$1711b3o228b3o3bo4bo16b3o940bobo$1711b oo230bo7bo18bo942bobo$1713bobo227bo6bo20bo940bo$1973boo937boo79boo$ 1715bobo228bo27bo3boo932boo67b3o9bobo$1717b3o257boo1002bobb3o6bo9bo$ 1717bo262boo1000bobo16boobo$1716bo257b6o1007bo4boobbo3boobbo$1711boboo bo4bo252bobboobo1004bo6boobboboobbo$1710booboobo244boo13bo4bo941boo62b oboobo3b5o$1710bobo4bo243bobo10bo6bo940boo9bo62boo$1715boo244bo11bo 950bo6boobo53bobb6o$1715bo3bo244bo7boo3bo948boobboobbo54b7o$1714bo3bo 245boobboobobb3o949b4obbo58b3o$1968bo5bo953b3o$1714bobbo250bobo3bo954b o$1713boobo249boboo3bo951b3oboobo3boobo3boo$1713bo251booboo955b3obbobo 3bo3boob3o$1712boo251bobbo960bobbo3bo9bo$1712bo254bobo954boo4bo7boboob oobo$1713bo253bobboo952bo9boo8boo$2932bobo9boo$2930b6o8boo$2930bobbo 11bo$2930bo$2931bo$2931bo$1961bo969bo$1960boo$1960bob5o963b3o$1956bo6b o4bo961boobbo$1955b4o3bo5bo965bobo$1955bobboo10bo960bo3bobo$1949b3o5bo 6booboobbo959b6o$1949bo6bobbo3boobboo3bo960b3o$1950bo4b6o4bobo$1952b4o boboo6bobbobo$1953boo12boo3bo$1968b3o$1968bo$1970bo$1970bo9$2970b3o$ 2970bobb3o$2971bobo$2976bo$2974bo$2976bobo$2969boobo6bo$2968boo3bobbo bbo$2962b3o4bobbobbo3bo$2962bo6bobbobbo3bo$2965bo3bo6bobo$2962bobbo8b oo$2963bobbo6b3o$2964bo5bo3bo$2966boboboobo$2968boo$2972bo$$2969bobbo 42$1891bo$1890b5o$1890bobboo$1892boobo$$1895bobo$$1888b3o6b3o$1883bo4b obb3o4b3o$1882boo5boob5ob3o$1882bobo3b3o4booboo$1894bobo$1884b3o6bobbo $1883b3o7bo$1885bobob4obbo$1887booboo$1887b6o5$1870boo$1869boo3bo$ 1871boboo$1873b3o$1873bo$1875b3o$1868boobo4boo$1868boboo3bobo$1862boo 4boboo3b3o$1861boo6bo5b3o$1862bobo4boo4bobo$1862b3o4boobboo$1862boo6bo bo$1864bobo3boo3bo$1870b4o$1866bobo$1868b4o$1868b4o$1869boo20$1875boo$ 1875bobo$1875bo$1876boo$1876bobbo$1876bo$1878bobo$1882bo$1880bobbo$ 1880bobbo$1882b3o$1878b3ob3o$1874b3oboobb3o$1874bo7boo$1875bo6boo$ 1878b5o$1880boo$1879boo40boo$1879boo40bobo$1878bobo40bo$1877boo45bo$ 1877bobo44boo$1876bo47boo$1877boo44boo$1919booboo$1919bo4bo$1919bob4o 4boo$1923boo3boobo$1923boo4bo$1923boo4bobo$1925bobboobo$1924boo$1924bo 4bo3bo$1925bo4bo4boo$1931bobo3boo$1932bo5b3o$1935b3o$1937bo$1938bo3bo$ 1937bo$1938bobbo$1939bo7$1981bo$1969boo9boo$1968boo3bo6bobo$1970boboo 15b3o$1972b3o5bobo4booboo$1972bo6boobobobo$1974b3obo6boboo$1975boo7bo$ 1975boo5boo$1977b5o4$1997bo$1996boo$1996bobo7boo$2003boobo$1999boobboo $1999boobboo$2000boo$2000b4obo$1999boboboobobb3o4boo$1998boo9bobb3oboo boo$1998bobobb3obboo6bo3bo$1944b3o50bo11boo9boo$1944bo53boo7b3o7booboo $1945bo61bobo9b3o$1947boo54b3o12bobo$1948bo3boo49bo15bo$1951boo53bo$ 1954boo47bo$1948b6o50bobo$1948bobboobo49bobo$1935boo13bo4bo$1935bobo 10bo6bo47boobo$1935bo11bo55boob4o$1938bo7boo3bo52bobb4o$1938boobboobo bb3o54boo$1942bo5bo$1942bobo3bo$1940boboo3bo$1939booboo$1939bobbo$ 1941bobo$1941bobboo4$1965boo$1964boo$1965bobo$1965b3o$1965boo$1967bobo 75boobo$2045bo3bo$1969bobo73bo4bo$1971b3o73boo$1971bo77bobo$1970bo$ 1965boboobo4bo68bo6boo$1964booboobo72b5o4bobbo$1964bobo4bo65boo4bo6boo $1969boo66bobo11bo$1969bo3bo63bo5boboo6bobo1219bo$1968bo3bo65boo4bo4bo bo1222b5o$2038bobbo6b3o1223bobboo$1968bobbo66bo6booboo1226boobo$1967b oobo69bobobobbo$1967bo1311bobo$1966boo74bo4bo$1966bo76b4o1225b3o6b3o$ 1967bo1299bo4bobb3o4b3o$3266boo5boob5ob3o$3266bobo3b3o4booboo$3278bobo $3268b3o6bobbo$3267b3o7bo$3269bobob4obbo$3271booboo$3271b6o5$3254boo$ 3253boo3bo$3255boboo$3257b3o$3257bo$3259b3o$3252boobo4boo$3252boboo3bo bo$3246boo4boboo3b3o$2270bo10boo962boo6bo5b3o$2269b5o6boo964bobo4boo4b obo$2269bobboo8bo7boo954b3o4boobboo$2271boobo5boo6b3obo953boo6bobo$ 1991boo287boo3boboo959bobo3boo3bo$1990boo282bobo6boo969b4o$1991bobo 285b3obo4bo961bobo$1991b3o282b3o3bo4bo16b3o945b4o$1991boo284bo7bo18bo 947b4o$1993bobo281bo6bo20bo947boo$2307boo$1995bobo282bo27bo3boo$1997b 3o311boo$1997bo316boo$1996bo311b6o$1991boboobo4bo306bobboobo$1990boob oobo298boo13bo4bo$1990bobo4bo297bobo10bo6bo$1995boo298bo11bo$1995bo3bo 298bo7boo3bo$1994bo3bo299boobboobobb3o$2302bo5bo$1994bobbo304bobo3bo$ 1993boobo303boboo3bo$1993bo305booboo$1992boo305bobbo$1992bo308bobo$ 1993bo307bobboo7$2295bo$2294boo$2294bob5o$2290bo6bo4bo$2289b4o3bo5bo$ 2289bobboo10bo$2283b3o5bo6booboobbo$2283bo6bobbo3boobboo3bo$2284bo4b6o 4bobo$2286b4oboboo6bobbobo$2287boo12boo3bo$2302b3o$2302bo$2304bo$2304b o141$2243bo$2242b5o$2242bobboo$2244boobo$$2247bobo$$2240b3o6b3o$2235bo 4bobb3o4b3o$2234boo5boob5ob3o$2234bobo3b3o4booboo$2246bobo$2236b3o6bo bbo$2235b3o7bo$2237bobob4obbo$2239booboo$2239b6o5$2222boo$2221boo3bo$ 2223boboo$2225b3o$2225bo$2227b3o$2220boobo4boo$2220boboo3bobo$2214boo 4boboo3b3o$2213boo6bo5b3o$2214bobo4boo4bobo$2214b3o4boobboo$2214boo6bo bo$2216bobo3boo3bo$2222b4o$2218bobo$2220b4o$2220b4o$2221boo19$2255boo$ 2227boo26bobo$2227bobo25bo$2227bo30bo$2228boo28boo$2228bobbo26boo$ 2228bo28boo$2230bobo20booboo$2234bo18bo4bo$2232bobbo17bob4o4boo$2232bo bbo21boo3boobo$2234b3o20boo4bo$2230b3ob3o20boo4bobo$2226b3oboobb3o22bo bboobo$2226bo7boo22boo$2227bo6boo22bo4bo3bo$2230b5o24bo4bo4boo$2232boo 31bobo3boo$2231boo33bo5b3o$2231boo36b3o$2230bobo38bo$2229boo41bo3bo$ 2229bobo39bo$2228bo43bobbo$2229boo42bo7$2315bo$2303boo9boo$2302boo3bo 6bobo$2304boboo15b3o$2306b3o5bobo4booboo$2306bo6boobobobo$2308b3obo6bo boo$2309boo7bo$2309boo5boo$2311b5o4$2331bo$2330boo$2330bobo7boo$2337b oobo$2333boobboo$2333boobboo$2334boo$2334b4obo$2333boboboobobb3o4boo$ 2332boo9bobb3obooboo$2332bobobb3obboo6bo3bo$2278b3o50bo11boo9boo$2278b o53boo7b3o7booboo$2279bo61bobo9b3o$2281boo54b3o12bobo$2282bo3boo49bo 15bo$2285boo53bo$2288boo47bo$2282b6o50bobo$2282bobboobo49bobo$2269boo 13bo4bo$2269bobo10bo6bo47boobo$2269bo11bo55boob4o$2272bo7boo3bo52bobb 4o$2272boobboobobb3o54boo$2276bo5bo$2276bobo3bo$2274boboo3bo$2273boob oo$2273bobbo$2275bobo$2275bobboo4$2299boo$2298boo$2299bobo$2299b3o$ 2299boo$2301bobo75boobo$2379bo3bo$2303bobo73bo4bo$2305b3o73boo$2305bo 77bobo$2304bo$2299boboobo4bo68bo6boo$2298booboobo72b5o4bobbo$2298bobo 4bo65boo4bo6boo$2303boo66bobo11bo$2303bo3bo63bo5boboo6bobo$2302bo3bo 65boo4bo4bobo$2372bobbo6b3o$2302bobbo66bo6booboo$2301boobo69bobobobbo$ 2301bo$2300boo74bo4bo$2300bo76b4o$2301bo$2325boo$2325bobo$2325bo$2326b oo$2326bobbo$2326bo$2328bobo$2332bo$2330bobbo$2330bobbo$2332b3o$2328b 3ob3o$2324b3oboobb3o$2324bo7boo$2325bo6boo$2328b5o$2330boo$2329boo$ 2329boo$2328bobo$2327boo$2327bobo$2326bo$2327boo241$2631bo$2630b5o$ 2630bobboo$2632boobo$$2635bobo$$2628b3o6b3o$2623bo4bobb3o4b3o$2622boo 5boob5ob3o$2622bobo3b3o4booboo$2634bobo$2624b3o6bobbo$2623b3o7bo$2625b obob4obbo$2627booboo$2627b6o5$2610boo$2609boo3bo$2611boboo$2613b3o$ 2613bo$2615b3o$2608boobo4boo$2608boboo3bobo$2602boo4boboo3b3o$2601boo 6bo5b3o$2602bobo4boo4bobo$2602b3o4boobboo$2602boo6bobo$2604bobo3boo3bo $2610b4o$2606bobo$2608b4o3boo$2608b4o3bobo$2609boo4bo$2616boo$2616bobb o$2616bo$2618bobo$2622bo$2620bobbo$2620bobbo$2622b3o$2618b3ob3o$2614b 3oboobb3o$2614bo7boo$2615bo6boo$2618b5o$2620boo$2619boo$2619boo$2618bo bo$2617boo$2617bobo$2616bo$2617boo! golly-2.5-src/Patterns/Life/Rakes/c5-adjustable-rake.rle0000644000175100001440000004757712156145314020032 00000000000000#C Adjustable period 165+5N c/5 rake #C This rake is based on a simple period 19800 glider loop #C populated by 120 gliders to make a period 165 rake. #C The loop can be expanded to make any higher period rake. #C To increase the period by 5N: #C 1. Remove the gliders from the loop. #C 2. Move the rightmost forward->backward glider turning convoy #C (labelled "A") right by 15N cells and up by 3N cells. #C 3. Move the entire right/rear section (labelled "B") down by #C 24 cells. #C 4. Move the left-hand glider reflector (labelled "C") left #C by 60N cells and down by 12N cells. #C 5. Repopulate the loop with 120 gliders spaced 165+5N #C generations apart. #C Paul Tooke, 4 January 2005 x = 2468, y = 910, rule = B3/S23 2085bo$2084bobo$2083bo3bo$2081b2o2bo2b2o$2077b2obo9bob2o$2076b o3bobo5bobo3bo$2076bobobobo5bobobobo$2077b2obobo2bo2bobob2o$2079b o3bo3bo3bo$2079bob3o3b3obo$2082b2o3b2o$2082bobobobo$2082bobob obo$2081b2obobob2o$2080bobobobobobo$2079b2obobobobob2o$2078bo 3bobobobo3bo$2079b2obobobobob2o$2083bo3bo2$2082bo5bo$2078bob2o bo3bob2obo$2077bobobo2bobo2bobobo$2082bobobobo$2077bo3b2obobo b2o3bo$2078bo2bob2ob2obo2bo$2079bo2bobobobo2bo$2078bo5bobo5bo 2$2079bo3bo3bo3bo$2080bo2bo3bo2bo$2081b9o$2081bobobobobo$2082b 2o3b2o$2082b2o3b2o2$2079b3o7b3o$2081bo7bo$2078bo3bo5bo3bo$2078b o4bo3bo4bo$2078bo13bo$2078b5o5b5o4$2086b3o$2088bo$2087bo2$2116b o5b2o5b2o5bo$2114bo2b2ob2o2bo3bo2b2ob2o2bo$2112b3o4bobo3bobo3b obo4b3o$2112b2o2bo2b3ob2o3b2ob3o2bo2b2o$2045b2o65b3o2b3o4bo3b o4b3o2b3o$2046b2o23bo7bo33bobo2bo15bo2bobo$2045bo19b2obobob2o 3b2obobob2o28bo23bo$2062b3obob3o9b3obob3o$2062bo3bobo5bobo5bo bo3bo$2066b2o6bobo6b2o$2063b2o9bobo9b2o$2063b2ob2o15b2ob2o$2004b 2o61bo15bo38b2o5b2o5b2o5b2o$2003bobo114bo3bo3bo2bo3bo2bo3bo3b o$2005bo114bo3bobob3o5b3obobo3bo$2071bo5b2o5b2o5bo28bo5b2o2b3o b3o2b2o5bo$2069bo2b2ob2o2bo3bo2b2ob2o2bo26b2ob3o15b3ob2o$2067b 3o4bobo3bobo3bobo4b3o24bo25bo$2067b2o2bo2b3ob2o3b2ob3o2bo2b2o 25bo3bo15bo3bo$2067b3o2b3o4bo3bo4b3o2b3o26bo2bo15bo2bo$1963bo 104bobo2bo15bo2bobo$1963b2o104bo23bo$1962bobo7$1921b3o$1923bo $1922bo6$1880b2o$1881b2o$1880bo2$2083bo5b2o5b2o5bo$2081bo2b2o b2o2bo3bo2b2ob2o2bo$2079b3o4bobo3bobo3bobo4b3o$2079b2o2bo2b3o b2o3b2ob3o2bo2b2o$1839b2o238b3o2b3o4bo3bo4b3o2b3o$1838bobo239b obo2bo15bo2bobo$1840bo240bo23bo3b2o$2109bobo$2109bo4$1798bo320b 2o$1798b2o319b2o171bobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obo$1797bobo491bo105bo2$2291bo105bo$2117b2o206b3o$2064bo50bo2b o9bo3b3o5b3o3bo144bo33b3o69bo$2063b3o50b2o7b2ob5ob2o3b2ob5ob2o 172b2o2bo2b2o$2061b7o55bob2obo5bobobobo5bob2obo139bo26b2obob2o 3b2obob2o30bobobobo25bo$1756b3o301b2o5b2o45b2o6bo3bobo3b5ob5o 3bobo3bo165b2obobob3obobob2o29bo7bo$1758bo297bob2obo5bob2obo41b o2b2o7b3o5b2o3b2o5b3o142bo25bobobobob3obobobobo61bo$1757bo297b obobo9bobobo40bo3bo4bo2bob3o13b3obo2bo166bo2bob2o3b2obo2bo29b o7bo$2055bobobob2o3b2obobobo41b3o7bo23bo141bo27bobo2bo3bo2bob o63bo$2056b2obob2o3b2obob2o250bo5bo34bo7bo$2058bo3b2ob2o3bo220b o29bo2bo3bo2bo65bo$2059b2o2bobo2b2o65b2o5b2o177bobobobobobo32b o2bobo2bo$2063bobo61b4obobobo5bobobob4o139bo31bobobobo67bo$1715b 2o343b2obobob2o57b3obobob2obo3bob2obobob3o169b2obobob2o33bo7b o$1716b2o343bobobobo58bo3bobo13bobo3bo138bo31bobobobo67bo$1715b o345bobobobo59bob3o5b2ob2o5b3obo168b2obobobobob2o31bo7bo$2058b 2obobobobob2o56b2o21b2o139bo27bobobobobobobobo63bo$2058b2obob obobob2o7bo5b2o5b2o5bo28b5o15b5o168b2obobobobob2o31bo7bo$2057b o3bobobobo3bo4bo2b2ob2o2bo3bo2b2ob2o2bo29b2o15b2o142bo32bo3bo 68bo$2058bob2obobob2obo3b3o4bobo3bobo3bobo4b3o$2062bo3bo7b2o2b o2b3ob2o3b2ob3o2bo2b2o188bo31bo5bo67bo$1674b2o398b3o2b3o4bo3b o4b3o2b3o219bobo3bobo$1673bobo384b2o5b2o6bobo2bo15bo2bobo189b o26b3obo2bobo2bob3o62bo$1675bo381b4obo3bob4o4bo23bo41bo7bo167b 3o2bobobobo2b3o$2057b2obo2bobo2bob2o64b2obobob2o3b2obobob2o134b o27b4o2bobo2b4o63bo$2057bobobobobobobobo61b3obob3o9b3obob3o162b o2bobo2bo$2060bo2bobo2bo21b2o5b2o34bo3bobo5bobo5bobo3bo131bo28b o4bobo4bo64bo$2057bob2o2bobo2b2obo10b4obobobo5bobobob4o30b2o6b obo6b2o163bob3obobob3obo$2057b2o2bobobobo2b2o9b3obobob2obo3bo b2obobob3o26b2o9bobo9b2o132bo28b5o3b5o64bo$1633bo428bo3bo14bo 3bobo13bobo3bo26b2ob2o15b2ob2o162b3o5b3o$1633b2o447bob3o5b2ob 2o5b3obo31bo15bo136bo105bo$1632bobo447b2o21b2o215b2obobob2o$2059b 2o3bo3b2o12b5o15b5o184bo29bo2bobobo2bo65bo$2059b2o3bo3b2o15b2o 15b2o220bo3bo$2060bo3bo3bo222bo32bo3bo68bo$2060bo7bo254bo5bo$ 2061b2o3b2o223bo28b2o9b2o64bo$2059b3o5b3o250b2o9b2o$1591b3o465b 2o7b2o221bo27b2o2b2o3b2o2b2o63bo$1593bo464bob2o5b2obo250b2o7b 2o$1592bo468bo5bo223bo26bo2b2obo3bob2o2bo62bo$2056b3o11b3o246b 2o2bo5bo2b2o$2056b2ob3o5b3ob2o218bo105bo$2057b4o7b4o$2058b3o7b 3o220bo105bo2$1550b2o739bo105bo$1551b2o$1550bo740bo105bo2$2291b o105bo$2084b2o211b2o$2083b2o206bo6b2o44bo52bo$2085bo211bo46b3o 17b2o5b2o5b2o5b2o$1509b2o780bo51bo3bo14bo3bo3bo2bo3bo2bo3bo3b o8bo$1508bobo495bo3b3o5b3o3bo282bo3b3o5b3o3bo14b3o4bo14bo3bob ob3o5b3obobo3bo$1510bo492b2ob5ob2o3b2ob5ob2o42b2o5b2o212bo12b 2ob5ob2o3b2ob5ob2o11b3obob2o14bo5b2o2b3ob3o2b2o5bo8bo$2001bob 2obo5bobobobo5bob2obo5b2o25b4obobobo5bobobob4o215bob2obo5bobo bobo5bob2obo9b2o3bo16b2ob3o15b3ob2o$2000bo3bobo3b5ob5o3bobo3b o4b2o24b3obobob2obo3bob2obobob3o203bo9bo3bobo3b5ob5o3bobo3bo30b o25bo8bo$2004b3o5b2o3b2o5b3o7bo2bo23bo3bobo13bobo3bo37b2o129b 2o47b3o5b2o3b2o5b3o35bo3bo15bo3bo$2001bo2bob3o13b3obo2bo4b2ob o2bo21bob3o5b2ob2o5b3obo38bobo127bobo33bo10bo2bob3o13b3obo2bo 33bo2bo15bo2bo10bo$2003bo23bo10bo2bo20b2o21b2o38bo131bo46bo23b o$1468bo569bobo21b5o15b5o204bo105bo$1468b2o580b2o13b2o15b2o45b 2o$1467bobo580b2o75bo2b2o159bo19b2o5b2o5b2o5b2o63bo$2127bo4bo 176bo3bo3bo2bo3bo2bo3bo3bo$2059bo3b3o5b3o3bo49bob4o158bo17bo3b obob3o5b3obobo3bo61bo$2056b2ob5ob2o3b2ob5ob2o46b2o2bo7b2o5b2o 5b2o5b2o53bo93bo5b2o2b3ob3o2b2o5bo$2054bob2obo5bobobobo5bob2o bo45b3o6bo3bo3bo2bo3bo2bo3bo3bo51b2o74bo17b2ob3o15b3ob2o61bo$ 2053bo3bobo3b5ob5o3bobo3bo45bo7bo3bobob3o5b3obobo3bo50bobo92b o25bo$2057b3o5b2o3b2o5b3o14bo3b3o5b3o3bo24bo5b2o2b3ob3o2b2o5b o127bo18bo3bo15bo3bo62bo$1426b3o625bo2bob3o13b3obo2bo8b2ob5ob 2o3b2ob5ob2o21b2ob3o15b3ob2o147bo2bo15bo2bo$1428bo627bo23bo8b ob2obo5bobobobo5bob2obo19bo25bo127bo105bo$1427bo660bo3bobo3b5o b5o3bobo3bo19bo3bo15bo3bo$2092b3o5b2o3b2o5b3o24bo2bo15bo2bo129b o105bo$2089bo2bob3o13b3obo2bo174bobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobo$2091bo23bo57b3o$2175bo$2174bo$1385b2o$1386b2o $1385bo3$2097bo3b3o5b3o3bo$2094b2ob5ob2o3b2ob5ob2o$2092bob2ob o5bobobobo5bob2obo$1344b2o745bo3bobo3b5ob5o3bobo3bo$1343bobo749b 3o5b2o3b2o5b3o$1345bo746bo2bob3o13b3obo2bo$2094bo23bo5$1303bo $1303b2o$1302bobo$2144bo7bo$2138b2obobob2o3b2obobob2o$2135b3o bob3o9b3obob3o$2135bo3bobo5bobo5bobo3bo$2139b2o6bobo6b2o$2136b 2o9bobo9b2o$1261b3o872b2ob2o15b2ob2o$1263bo876bo15bo$1262bo6$ 1220b2o$1221b2o$1220bo4$2319bo$2317b2o$1179b2o1137b2o$1178bob o$1180bo6$1138bo$1138b2o$1137bobo4$2079bo$2080b2o$2079b2o$1096b 3o$1098bo$1097bo6$1055b2o$1056b2o$1055bo6$1014b2o$1013bobo$1015b o6$973bo$973b2o$972bobo7$931b3o$933bo$932bo6$890b2o$891b2o$890b o6$849b2o$848bobo$850bo4$2277bo$2276bo$808bo1467b3o$808b2o1338b 3o2b2o2b2o2b3o$807bobo1338bo5bo2bo5bo$2150b2o3b2o3b2o$2154bo2b o$2151bo8bo$2148b4o2bo2bo2b4o$2153bo4bo$2147b3o12b3o$766b3o1377b o2bo5b2o5bo2bo$768bo1378bo2bo3bo2bo3bo2bo$767bo1381b2obob4obo b2o$2148b3o2b6o2b3o$2149b2o10b2o$2121bo26b3o4b2o4b3o$2122bo29b 2o4b2o$2120b3o24b3o4bo2bo4b3o$725b2o1420bo3bo8bo3bo$726b2o1419b ob2ob3o2b3ob2obo$725bo1421bobo12bobo$2146b2o16b2o$2150bo10bo$ 2150b2o8b2o$2150b2o8b2o$2150bo10bo$684b2o1462b3o10b3o$683bobo 1467bo4bo$685bo1464b2obo4bob2o$2154bo2bo$2150bo3b4o3bo$2150bo bobo2bobobo$2153bo4bo$2151bo8bo$643bo1507bo8bo$643b2o1506bo8b o$642bobo1506bo8bo$2150b2ob2o2b2ob2o$2153bo4bo$2149bobobob2ob obobo$2149bobo2bo2bo2bobo$2149b2o2bo4bo2b2o$2149bob3o4b3obo$601b 3o1546bob2ob2ob2obo$603bo1549bob2obo$602bo1550bo4bo2$2152b3o2b 3o$2148b5ob4ob5o$bobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobo2078bo6bo$o73bo2073bo2b2o6b2o2b o$560b2o$o73bo486b2o1584bo2b2obo4bob2o2bo$560bo1585bob2obobob 2obobob2obo$o37b2o6b2o26bo2075b2o3b2o3b2o$34bob2obo6bob2obo2094b o3b3obo2bob3o3bo$o32bobobo10bobobo21bo2074bo12bo$33b4obo8bob4o $o33bo3b2o2b2o2b2o3bo22bo$34bo3b2obo2bob2o3bo467b2o$o33bo4b3o 2b3o4bo22bo443bobo$36bo3b2o2b2o3bo470bo$o33b2o3bo6bo3b2o22bo$ 39bo6bo$o38bo6bo27bo$35bo4b2o2b2o4bo$o10bobobobo16b3o3b2o2b2o 3b3o22bo$10bo7bo15b2ob3ob4ob3ob2o426bo$o34b3o3bo2bo3b3o23bo403b 2o$10bo24bo4bo4bo4bo426bobo$o34bo14bo23bo$10bo26b2o8b2o2096bo $o35bo12bo24bo2069bobo$10bo24bo14bo2092bo2bo$o34bo14bo23bo2069b 2o89bobo$10bo24bob3o6b3obo2184b2o$o36bo10bo25bo361b3o1797bo$10b o26bo3b4o3bo389bo$o36b2o8b2o25bo362bo$10bo7bo17bobo3b2o3bobo$ o10bobobobo18bo3b2o2b2o3bo24bo$38b2o6b2o$o35b2o10b2o24bo$35bo 14bo$o33b2o14b2o22bo320b2o$396b2o$o36b3o6b3o25bo320bo$38bo8bo $o34b2obo2bo2bo2bob2o23bo$36bobobo4bobobo$o33bo3bobo4bobo3bo22b o$38bo3b2o3bo$o35bo2b2o4b2o2bo24bo279b2o$36bobobo4bobobo303bo bo$o73bo280bo$35bobo10bobo$o36bo10bo25bo$36b2o10b2o$o34bo14bo 23bo$35b4o8b4o$o32bo4bo8bo4bo21bo238bo$33bobobo10bobobo260b2o $o34bob2obo4bob2obo23bo237bobo$38b2obo2bob2o$o40bo2bo29bo2070b o$41bo2bo2099bobo$o37bo2bo2bo2bo26bo2068bo2bo$38bob2o2b2obo2096b 2o$o73bo$37b2o3b2o3b2o222b3o$o73bo198bo$35bo2bo8bo2bo221bo$o34b 2o12b2o23bo$34b2o14b2o$o32bobo2b2o6b2o2bobo21bo$35bo2b2o6b2o2b o$o39bo4bo28bo$34bob2o10b2obo178b2o$o38bo6bo27bo156b2o$35bo2b 2o6b2o2bo179bo$o34bo14bo23bo$40bo4bo$o39b2o2b2o28bo$37bo3bo2b o3bo$o36bo3bo2bo3bo25bo$38bo2bo2bo2bo141b2o$o35bo3bo4bo3bo24b o113bobo$35b5o6b5o139bo$o33b3ob2o6b2ob3o22bo$37b2o8b2o$o36b2o 8b2o25bo$37b2o3b2o3b2o$o40bo2bo29bo$36bo2bo6bo2bo98bo$o35bobo 3b2o3bobo24bo73b2o$38b2obo2bob2o99bobo$o38b2o4b2o27bo$36bob2o 6b2obo2095bo$o39b2o2b2o28bo2069bobo$39bo6bo2096bo2bo$o39bo4bo 28bo2069b2o$39b2o4b2o$o38bobo2bobo27bo31b3o$42b2o64bo$o38b3o2b 3o27bo32bo$39b2o4b2o$o38b8o27bo$40b6o$o40b4o29bo2119bo$2194bo bo$o64b2o7bo2119b2o$66b2o$o64bo8bo2$o20bo7bo44bo$15b2obobob2o 3b2obobob2o26b3o$o11b3obob3o9b3obob3o23bo11bo$12bo3bobo5bobo5b obo3bo24bo$o15b2o6bobo6b2o39bo$13b2o9bobo9b2o$o12b2ob2o15b2ob 2o36bo$17bo15bo$o73bo$104b2o$o73bo28b2o$105bo$o73bo$bobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobo3$2145bo$145b2o1997bobo$145bobo1995bo2bo$145bo1998b2o6$187b o$186b2o1876bobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobo$186bobo1874bo247bo2$2063bo247bo2$2063bo247bo 2$2063bo247bo$227b3o$227bo1835bo247bo$228bo$2063bo247bo2$2063b o117bo129bo$2181bo$2063bo117bo129bo$269b2o1906bo3bo3bo$268b2o 1793bo110bobob2obob2obobo122bo$270bo1902b2obobob3obobob2o$2063b o108bo3bo9bo3bo120bo$2172bobobob2o3b2obobobo$2063bo112b2obo3b ob2o74bobob2o44bo$2173b2obo9bob2o70bo$2063bo81bo30b2o2bobo2b2o 81bo42bo$310b2o1832bobo29bobobobobobo73bo7bo$310bobo1750bo79b o2bo31bobobobo126bo$310bo1833b2o32bobobobo75bo7bo$2063bo114bo bobobo126bo$2175b2obobobobob2o72bo2b2obo$2063bo110bobobobobob obobo122bo$2175bo2bobobobo2bo72bo7bo$2063bo113bo2bobo2bo125bo $352bo1907bo7bo$351b2o1710bo204bo42bo$351bobo1823b3o3b3o74bo$ 2063bo110bo3b2o3b2o3bo72bobob2o44bo$2173b3o4bobo4b3o$2063bo113b o2bobo2bo125bo$2176bobobobobobo$2063bo110bo5bobo5bo122bo$2174b o5bobo5bo$392b3o1668bo111b5o3b5o123bo$392bo1761bo$393bo1669bo 88b2o157bo$2153b2o22bo3bo3bo$2063bo112bob2obob2obo124bo$2177b 3obob3o$2063bo112b2o7b2o124bo$2176b3o5b3o$434b2o1627bo111b2o9b 2o123bo$433b2o$435bo1627bo111bo2bo5bo2bo123bo$2174b2o2b2o3b2o 2b2o$2063bo110b2o2b2o3b2o2b2o122bo$2174bo2bo7bo2bo$2063bo247b o$2145bo$475b2o1586bo80bobo164bo$475bobo1665bo2bo$475bo1587bo 80b2o165bo2$2063bo247bo$2164b3o51b2o5b2o$2063bo102bo43b4obobo bo5bobobob4o76bo$2165bo43b3obobob2obo3bob2obobob3o$517bo1545b o145bo3bobo13bobo3bo75bo$516b2o1692bob3o5b2ob2o5b3obo$516bobo 1544bo146b2o21b2o76bo$2113bo3b3o5b3o3bo29bo5b2o5b2o5bo28b5o15b 5o$2063bo46b2ob5ob2o3b2ob5ob2o24bo2b2ob2o2bo3bo2b2ob2o2bo29b2o 15b2o79bo$2108bob2obo5bobobobo5bob2obo20b3o4bobo3bobo3bobo4b3o $2063bo43bo3bobo3b5ob5o3bobo3bo19b2o2bo2b3ob2o3b2ob3o2bo2b2o125b o$2111b3o5b2o3b2o5b3o23b3o2b3o4bo3bo4b3o2b3o$2063bo44bo2bob3o 13b3obo2bo21bobo2bo15bo2bobo126bo$557b3o1550bo23bo24bo23bo41b o7bo$557bo1505bo155b2obobob2o3b2obobob2o71bo$558bo1657b3obob3o 9b3obob3o$2063bo109b2o5b2o34bo3bobo5bobo5bobo3bo68bo$2165b4ob obobo5bobobob4o4b2o24b2o6bobo6b2o$2063bo100b3obobob2obo3bob2o bobob3o3b2o14b2o5b2o9bobo9b2o69bo$2164bo3bobo13bobo3bo18bo2bo 4b2ob2o15b2ob2o$2063bo101bob3o5b2ob2o5b3obo20b2o9bo15bo73bo$599b 2o1564b2o21b2o20b2o$598b2o1463bo101b5o15b5o16b2obo101bo$600bo 1567b2o15b2o19bo2bo$2063bo143b3o101bo2$2063bo247bo2$2063bo247b o$640b2o$640bobo1420bo247bo$640bo$2063bo247bo2$2063bo247bo2$2063b o247bo$682bo$681b2o1380bo247bo$681bobo$2063bo247bo2$2063bo121b 2o5b2o117bo$2177b4obobobo5bobobob4o$2063bo112b3obobob2obo3bob 2obobob3o108bo$2176bo3bobo13bobo3bo$722b3o1338bo113bob3o5b2ob 2o5b3obo109bo$722bo1454b2o21b2o$723bo1339bo113b5o15b5o109bo$2180b 2o15b2o$2063bo247bo2$2063bo247bo2$764b2o1297bo247bo$763b2o$765b o1297bo247bo2$2063bo247bo2$2063bo158b2o5b2o5b2o5b2o66bo$2220b o3bo3bo2bo3bo2bo3bo3bo$805b2o1256bo156bo3bobob3o5b3obobo3bo64b o$805bobo1412bo5b2o2b3ob3o2b2o5bo$805bo1257bo156b2ob3o15b3ob2o 64bo$2220bo25bo$2063bo157bo3bo15bo3bo65bo$2222bo2bo15bo2bo$2063b o247bo2$847bo1215bo162bo3b3o5b3o3bo66bo$846b2o1375b2ob5ob2o3b 2ob5ob2o$846bobo1214bo157bob2obo5bobobobo5bob2obo61bo$2220bo3b obo3b5ob5o3bobo3bo$2063bo160b3o5b2o3b2o5b3o64bo$2180b2o5b2o32b o2bob3o13b3obo2bo$2063bo108b4obobobo5bobobob4o26bo23bo63bo$2171b 3obobob2obo3bob2obobob3o$2063bo107bo3bobo13bobo3bo113bo$887b3o 1282bob3o5b2ob2o5b3obo$887bo1175bo108b2o21b2o114bo$888bo1283b 5o15b5o$2063bo111b2o15b2o38bo5b2o5b2o5bo58bo$2207b2o21bo2b2ob 2o2bo3bo2b2ob2o2bo$2063bo143b2o12bo6b3o4bobo3bobo3bobo4b3o54b o$2181bo3b3o5b3o3bo21bobo4b2o2bo2b3ob2o3b2ob3o2bo2b2o$2063bo114b 2ob5ob2o3b2ob5ob2o18b3o4b3o2b3o4bo3bo4b3o2b3o54bo$929b2o1245b ob2obo5bobobobo5bob2obo24bobo2bo15bo2bobo$928b2o1133bo111bo3b obo3b5ob5o3bobo3bo24bo23bo56bo$930bo1248b3o5b2o3b2o5b3o$2063b o112bo2bob3o13b3obo2bo106bo$2178bo23bo$2063bo247bo2$2063bo247b o$970b2o$970bobo1090bo247bo$970bo$2063bo247bo2$2063bo247bo2$2063b o247bo$1012bo$1011b2o1050bo247bo$1011bobo$2063bo247bo2$2063bo 247bo2$2063bo247bo$2193bo3b3o5b3o3bo$1052b3o1008bo126b2ob5ob2o 3b2ob5ob2o96bo$1052bo1135bob2obo5bobobobo5bob2obo$1053bo1009b o123bo3bobo3b5ob5o3bobo3bo93bo$2191b3o5b2o3b2o5b3o$2063bo124b o2bob3o13b3obo2bo94bo$2190bo23bo$2063bo247bo2$1094b2o967bo247b o$1093b2o$1095bo967bo247bo2$2063bo247bo2$2063bo247bo2$1135b2o 926bo178bo7bo60bo$1135bobo1098b2obobob2o3b2obobob2o$1135bo927b o169b3obob3o9b3obob3o51bo$2233bo3bobo5bobo5bobo3bo$2063bo173b 2o6bobo6b2o55bo$2234b2o9bobo9b2o$2063bo170b2ob2o15b2ob2o52bo$ 2238bo15bo$1177bo885bo247bo$1176b2o$1176bobo884bo173b2o5b2o5b 2o5b2o51bo$2235bo3bo3bo2bo3bo2bo3bo3bo$2063bo171bo3bobob3o5b3o bobo3bo49bo$2235bo5b2o2b3ob3o2b2o5bo$2063bo171b2ob3o15b3ob2o49b o$2235bo25bo$2063bo124bo3b3o5b3o3bo29bo3bo15bo3bo50bo$1217b3o 965b2ob5ob2o3b2ob5ob2o27bo2bo15bo2bo$1217bo845bo119bob2obo5bo bobobo5bob2obo18bo80bo$1218bo963bo3bobo3b5ob5o3bobo3bo16b2o3b obo$2063bo122b3o5b2o3b2o5b3o19b3o2b2obo74bo$2183bo2bob3o13b3o bo2bo8b2o12bo2bo$2063bo121bo23bo10b2o10bobobo14b2o5b2o51bo$2231b 2ob2o7b4obobobo5bobobob4o$2063bo178b3obobob2obo3bob2obobob3o42b o$1259b2o931b2o5b2o5b2o5b2o27bo3bobo13bobo3bo$1258b2o803bo126b o3bo3bo2bo3bo2bo3bo3bo26bob3o5b2ob2o5b3obo43bo$1260bo929bo3bo bob3o5b3obobo3bo26b2o21b2o$2063bo126bo5b2o2b3ob3o2b2o5bo26b5o 15b5o43bo$2190b2ob3o15b3ob2o29b2o15b2o$2063bo126bo25bo94bo$2191b o3bo15bo3bo$2063bo128bo2bo15bo2bo96bo$1300b2o$1300bobo760bo247b o$1300bo$2063bo247bo2$2063bo247bo2$2063bo247bo$1342bo$1341b2o 720bo247bo$1341bobo$2063bo247bo2$2063bo247bo2$2063bo247bo2$1382b 3o678bo247bo$1382bo821b2o5b2o5b2o5b2o$1383bo679bo138bo3bo3bo2b o3bo2bo3bo3bo82bo$2202bo3bobob3o5b3obobo3bo$2063bo138bo5b2o2b 3ob3o2b2o5bo82bo$2202b2ob3o15b3ob2o$2063bo138bo25bo82bo$2203b o3bo15bo3bo20bo3b3o5b3o3bo$1424b2o637bo140bo2bo15bo2bo18b2ob5o b2o3b2ob5ob2o41bo$1423b2o818bob2obo5bobobobo5bob2obo$1425bo637b o178bo3bobo3b5ob5o3bobo3bo38bo$2246b3o5b2o3b2o5b3o$2063bo179b o2bob3o13b3obo2bo39bo$2245bo23bo$2063bo247bo2$1465b2o596bo247b o$1465bobo$1465bo597bo247bo$2248b2o5b2o$2063bo182bo3bo3bo2bo53b o$2246bo3bobob3o13bo7bo$2063bo182bo5b2o2b3o5b2obobob2o3b2obob ob2o26bo$2246b2ob3o9b3obob3o9b3obob3o$1507bo555bo182bo14bo3bo bo5bobo5bobo3bo23bo$1506b2o739bo3bo13b2o6bobo6b2o$1506bobo554b o184bo2bo10b2o9bobo9b2o24bo$2262b2ob2o15b2ob2o$2063bo202bo15b o28bo2$2063bo247bo$2192b2o5b2o$2063bo120b4obobobo5bobobob4o102b o$1547b3o633b3obobob2obo3bob2obobob3o$1547bo515bo119bo3bobo13b obo3bo15b2o84bo$1548bo635bob3o5b2ob2o5b3obo15bobo$2063bo120b2o 21b2o17bo6b2o76bo$2184b5o15b5o24b2o7bo3b3o5b3o3bo$2063bo123b2o 15b2o6bo26b2ob5ob2o3b2ob5ob2o47bo$2211bo25bob2obo5bobobobo5bo b2obo$2063bo146bo2bo2b2o18bo3bobo3b5ob5o3bobo3bo44bo$1589b2o619b o4bo24b3o5b2o3b2o5b3o$1588b2o473bo146b2o3b3o19bo2bob3o13b3obo 2bo45bo$1590bo621bo26bo23bo$2063bo156b2o89bo$2221bo$2063bo155b o7b2o5b2o5b2o5b2o61bo$2185b2o5b2o31bo3bo3bo2bo3bo2bo3bo3bo$2063b o113b4obobobo5bobobob4o23bo3bobob3o5b3obobo3bo59bo$1630b2o544b 3obobob2obo3bob2obobob3o22bo5b2o2b3ob3o2b2o5bo$1630bobo430bo112b o3bobo13bobo3bo22b2ob3o15b3ob2o59bo$1630bo546bob3o5b2ob2o5b3o bo23bo25bo$2063bo113b2o21b2o24bo3bo15bo3bo60bo$2177b5o15b5o25b o2bo15bo2bo$2063bo116b2o15b2o112bo2$2063bo247bo$1672bo$1671b2o 390bo247bo$1671bobo$2063bo247bo$2219bo5b2o5b2o5bo$2063bo153bo 2b2ob2o2bo3bo2b2ob2o2bo69bo$2215b3o4bobo3bobo3bobo4b3o$2063bo 151b2o2bo2b3ob2o3b2ob3o2bo2b2o67bo$2215b3o2b3o4bo3bo4b3o2b3o$ 1712b3o348bo152bobo2bo15bo2bobo68bo$1712bo504bo23bo$1713bo349b o247bo2$2063bo247bo2$2063bo247bo2$1754b2o307bo247bo$1753b2o$1755b o307bo247bo2$2063bo146b2o99bo$2176bo3b3o5b3o3bo15b2o$2063bo109b 2ob5ob2o3b2ob5ob2o113bo$2171bob2obo5bobobobo5bob2obo$1795b2o266b o106bo3bobo3b5ob5o3bobo3bo110bo154b2o$1795bobo376b3o5b2o3b2o5b 3o268bobo$1795bo267bo107bo2bob3o13b3obo2bo111bo155bo$2173bo23b o$2063bo247bo2$2063bo115b2o5b2o123bo$2171b4obobobo5bobobob4o$ 1837bo225bo106b3obobob2obo3bob2obobob3o114bo113bo$1836b2o332b o3bobo13bobo3bo228b2o$1836bobo224bo107bob3o5b2ob2o5b3obo115bo 112bobo$2171b2o21b2o$2063bo107b5o15b5o28bo5b2o5b2o5bo66bo$2174b 2o15b2o29bo2b2ob2o2bo3bo2b2ob2o2bo$2063bo156b3o4bobo3bobo3bob o4b3o62bo$2220b2o2bo2b3ob2o3b2ob3o2bo2b2o$2063bo136b2o18b3o2b 3o4bo3bo4b3o2b3o62bo$1877b3o341bobo2bo15bo2bobo135b3o$1877bo185b o108bo7bo14b2o25bo23bo64bo73bo$1878bo287b2obobob2o3b2obobob2o 23b2o172bo$2063bo99b3obob3o9b3obob3o5bobo12b2o99bo$2163bo3bob o5bobo5bobo3bo6bo27b2o5b2o$2063bo103b2o6bobo6b2o10bo19b4obobo bo5bobobob4o70bo$2164b2o9bobo9b2o26b3obobob2obo3bob2obobob3o$ 2063bo100b2ob2o15b2ob2o26bo3bobo13bobo3bo69bo$1919b2o247bo15b o31bob3o5b2ob2o5b3obo101b2o$1918b2o143bo152b2o21b2o70bo31b2o$ 1920bo295b5o15b5o101bo$2063bo155b2o15b2o73bo2$2063bo247bo2$2063b o247bo$1960b2o339b2o$1960bobo100bo236bobo8bo$1960bo341bo$2063b o247bo2$2063bo247bo2$2063bo247bo$2002bo257bo$2001b2o60bo196b2o 49bo$2001bobo255bobo$2063bo247bo2$2063bo247bo2$2063bo247bo2$2042b 3o18bo154b3o90bo$2042bo177bo$2043bo19bo155bo91bo2$2063bo247bo 2$2063bo247bo2$2063bo20b2o225bo$2083b2o$2063bo21bo225bo2$2063b o97b2o5b2o5b2o5b2o127bo$2159bo3bo3bo2bo3bo2bo3bo3bo$2063bo95b o3bobob3o5b3obobo3bo125bo$2159bo5b2o2b3ob3o2b2o5bo24bo3b3o5b3o 3bo$2063bo61b2o32b2ob3o15b3ob2o21b2ob5ob2o3b2ob5ob2o79bo$2125b obo31bo25bo19bob2obo5bobobobo5bob2obo$2063bo61bo34bo3bo15bo3b o19bo3bobo3b5ob5o3bobo3bo76bo$2161bo2bo15bo2bo24b3o5b2o3b2o5b 3o$2063bo141bo2bob3o13b3obo2bo77bo$2207bo23bo$2063bo247bo2$2063b o103bo143bo$2166b2o$2063bo102bobo142bo2$2063bo247bo$2207bo3b3o 5b3o3bo$2063bo140b2ob5ob2o3b2ob5ob2o82bo$2202bob2obo5bobobobo 5bob2obo$2063bo122bo14bo3bobo3b5ob5o3bobo3bo79bo$2185bo2bo16b 3o5b2o3b2o5b3o$2063bo122b2o14bo2bob3o13b3obo2bo80bo$2204bo23b o$2063bo247bo2$2063bo126b2ob3obo113bo$2190b2o4b2o$2063bo126b2o 119bo$2192b2o2bo$2063bo130b2o115bo$2170bo7bo$2063bo100b2obobo b2o3b2obobob2o126bo$2161b3obob3o9b3obob3o$2063bo97bo3bobo5bob o5bobo3bo123bo$2165b2o6bobo6b2o$2063bo98b2o9bobo9b2o124bo$2162b 2ob2o15b2ob2o$2063bo102bo15bo128bo2$2063bo247bo2$2063bo247bo2$ 2063bo247bo2$2063bo247bo$2064bobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobo$! golly-2.5-src/Patterns/Life/Rakes/forward-LWSS-rake-p90.rle0000644000175100001440000003627012156145314020233 00000000000000#C A c/3 period 90 forward MWSS rake, shooting a period 90 MWSS stream #C which travels ahead of the puffer. This works by taking a forward #C period 90 LWSS rake, and converting each of the LWSS's into MWSS's #C using two period 90 sideways LWSS rakes. The "hammer" reaction #C converting three LWSS's into a MWSS was found by Dieter Leithner. #C David I. Bell, August 2002 x = 269, y = 475, rule = B3/S23 171bo$90b3o77bobo$90b3o61bo14bo3bo14bo$70b2ob3o13bo3bo13b3ob2o37b3ob3o 13b3o13b3ob3o$70b2o4b2ob2o21b2ob2o4b2o36bo6bob3o21b3obo6bo$69bo2bobo4b 2o7bo5bo7b2o4bobo2bo36b2o3bo5bo6b2o3b2o6bo5bo3b2o$76b2obo2b2o4b2obob2o 4b2o2bob2o51b7o3b2o3b2o3b7o$82bob2o11b2obo55bo2b2o3b2o2b3ob3o2b2o3b2o 2bo$77b3ob2o2bo3bo3bo3bo2b2ob3o51b2obo4b2o9b2o4bob2o$77bo3b3obo4bobo4b ob3o3bo57b4o2b2ob2o2b4o$75b2obob2o4bo2bo3bo2bo4b2obob2o47b2ob4o7b2ob2o 7b4ob2o$74bobo2bo8bobobobo8bo2bobo45bobob2o5b2obob3obob2o5b2obobo$72b 3obo2bo5b2obo2bo2bob2o5bo2bob3o40b2obo10b2obo5bob2o10bob2o$71b2obo9bob obob3obobobo9bob2o39b2obo9bobobo5bobobo9bob2o$70bo3bo9bobo2b2ob2o2bobo 9bo3bo38bobo10bo3bo5bo3bo10bobo$85b3o2bobo2b3o72bobo$86bob2o3b2obo67bo 3b3ob3o3bo$84b2o3bo3bo3b2o65bob5ob5obo$84bobo4bo4bobo65bobo9bobo$86bo 2bobobo2bo69bob2obob2obo$86bob3ob3obo68b2obob3obob2o$86bobo5bobo69bobo b3obobo$83b2obobo2bo2bobob2o63b2obob2o3b2obob2o$83b2obobo2bo2bobob2o 63b2obobo5bobob2o$86bobob3obobo67bobobo5bobobo$85bo2b7o2bo47bo21b2o5b 2o21bo$59bob2ob3o49b3ob2obo14b2ob3ob3o20b7o20b3ob3ob2o$58b2ob2o4b2obo 16bo7bo16bob2o4b2ob2o13b2o4bo2b2ob2o19bo19b2ob2o2bo4b2o$57bo2bobo2bo3b 3o18b3o18b3o3bo2bobo2bo11bo2bob2o3bo2b2o14bobo2bo2bobo14b2o2bo3b2obo2b o$58bo5bo3bo3bo13b3o5b3o13bo3bo3bo5bo24bo2bo5bo6b2obo5bob2o6bo5bo2bo$ 71b2o4b3o5b2ob3ob3ob2o5b3o4b2o41bo2b4o5b2o3bobo3b2o5b4o2bo$71b2o2b2obo 9b3ob3o9bob2o2b2o44bo3bo6b2o5b2o6bo3bo$72b2o4bob2o9bo9b2obo4b2o40b3o2b obob2o5b9o5b2obobo2b3o$77bo2bobo3b2o7b2o3bobo2bo48bo2b2obob2o15b2obob 2o2bo$72b2obo2bobobobo13bobobobo2bob2o45b2obo3bob2o9b2obo3bob2o$76bo8b o11bo8bo56bobob9obobo$83bob13obo64b15o$166b3o5b3o$171bo$171bo$188bo$ 73b3obo106b2obobo$74b2ob2o105b2o4bo$72b3obo2bo103bo2bo3b2obo$68b3ob2o 4bo109bob2ob2o$67bo119b6o2bo$63bo4bo2bo2b3o108bo2bo9b2o$53bob2o6b2o6bo 3b3o5bo15bo63b2o13b2o5bo3bo3bo3bob2o4b3ob2o$52b2ob2ob2o3bob2o2b5o4bo4b 3o11b3o62b2obo11bob2o4b2o2bo2b2ob3ob2o2b2o4b2o$51bo2bobo2bo3bo2bobo3bo 10b4o9b4o62b2ob2o9b2ob2o4bo2bo3b2o5b2obo3bobo2bo$52bo5b2o3b4o6b2obobo 8bo7bo67b2ob2o7b2ob2o9bo5b2o5b3o$61b2obo22b2o5b2o68bobo9bobo19bob3o25b o$33b3o25bo22bob2o7b2obo65bo13bo22b2o24bobo$33b3o25bo21b2obo9bob2o64b 3o9b3o32bo14bo3bo14bo$13b2ob3o13bo3bo13b3ob2o28bob2o7b2obo66b2o9b2o29b 3ob3o13b3o13b3ob3o$13b2o4b2ob2o21b2ob2o4b2o150bo6bob3o21b3obo6bo$12bo 2bobo4b2o7bo5bo7b2o4bobo2bo112b2ob2o33b2o3bo5bo6b2o3b2o6bo5bo3b2o$19b 2obo2b2o4b2obob2o4b2o2bob2o165b7o3b2o3b2o3b7o$25bob2o11b2obo125b2ob2o 39bo2b2o3b2o2b3ob3o2b2o3b2o2bo$20b3ob2o2bo3bo3bo3bo2b2ob3o39bobobobo 74bo3bo40b2obo4b2o9b2o4bob2o$20bo3b3obo4bobo4bob3o3bo38bo2bobo2bo71bo 7bo44b4o2b2ob2o2b4o$18b2obob2o4bo2bo3bo2bo4b2obob2o35bo3bobo3bo69bobo 5bobo35b2ob4o7b2ob2o7b4ob2o$17bobo2bo8bobobobo8bo2bobo34bo9bo68bo3b2ob 2o3bo33bobob2o5b2obob3obob2o5b2obobo$15b3obo2bo5b2obo2bo2bob2o5bo2bob 3o32bo9bo72b2ob2o34b2obo10b2obo5bob2o10bob2o$14b2obo9bobobob3obobobo9b ob2o33bo5bo71b2o2bobo2b2o31b2obo9bobobo5bobobo9bob2o$13bo3bo9bobo2b2ob 2o2bobo9bo3bo30bo9bo71b2o3b2o33bobo10bo3bo5bo3bo10bobo$28b3o2bobo2b3o 46b3o3b3o131bobo$29bob2o3b2obo48bo5bo126bo3b3ob3o3bo$27b2o3bo3bo3b2o 179bob5ob5obo$27bobo4bo4bobo179bobo9bobo$29bo2bobobo2bo183bob2obob2obo $29bob3ob3obo128b2o52b2obob3obob2o$29bobo5bobo53b2o73b2o3b2o48bobob3ob obo$26b2obobo2bo2bobob2o45bobo2b2o78bo46b2obob2o3b2obob2o$26b2obobo2bo 2bobob2o44bo2bo77b2o2bo47b2obobo5bobob2o$29bobob3obobo48bobo2b2o73b2o 3b2o46bobobo5bobobo$28bo2b7o2bo48bo3b2o107bo21b2o5b2o21bo$2bob2ob3o49b 3ob2obo128b2ob3ob3o20b7o20b3ob3ob2o$b2ob2o4b2obo16bo7bo16bob2o4b2ob2o 127b2o4bo2b2ob2o19bo19b2ob2o2bo4b2o$o2bobo2bo3b3o18b3o18b3o3bo2bobo2bo 105b2o18bo2bob2o3bo2b2o14bobo2bo2bobo14b2o2bo3b2obo2bo$bo5bo3bo3bo13b 3o5b3o13bo3bo3bo5bo105b3o30bo2bo5bo6b2obo5bob2o6bo5bo2bo$14b2o4b3o5b2o b3ob3ob2o5b3o4b2o31b2ob2o81bo37bo2b4o5b2o3bobo3b2o5b4o2bo$14b2o2b2obo 9b3ob3o9bob2o2b2o33b4o78b3o2bo37bo3bo6b2o5b2o6bo3bo$15b2o4bob2o9bo9b2o bo4b2o33b2obo79bo4bo32b3o2bobob2o5b9o5b2obobo2b3o$20bo2bobo3b2o7b2o3bo bo2bo39b3ob2o77b3o3bo33bo2b2obob2o15b2obob2o2bo$15b2obo2bobobobo13bobo bobo2bob2o31bo2b2ob3o77b2ob3obo34b2obo3bob2o9b2obo3bob2o$19bo8bo11bo8b o34bo3b2ob2o75bobo2b2ob2o42bobob9obobo$26bob13obo39b3o2b3o2bobo72bo2b 2o4b4o41b15o$87b2o3bob3o70bo2bobobo4b2o42b4o3b4o$81bob2o5bo2bo2bo70b3o 11bo46bo$31b2obob2o43bo7b3o2b2o72bob3o6b3o44b2ob2o$32b5o44bo2bo5b2o2bo 74b3o5b2o32bo12b2o5b2o$30bo7bo9bob3o28bo2b2o5bo118bobob2o9bo5bo$33bobo 11b2ob2o31b3o90b3o30bo4b2o9bob3obo$29bob2obob2obo6bo2bob3o31b2o119bob 2o3bo2bo5b3o7b3o$28b4obobob4o6bo4b2ob3o56bo30bob2o56b2ob2obo10b2o9b2o$ 27bobo9bobo16bo53b3ob3o25b2ob2ob2o52bo2b6o8bobo9bobo$27bobo9bobo7b3o2b o2bo4bo48b2o6bo23bo2bobo2bo48b2o9bo2bo7bo11bo$28bobo7bobo7b3o3bo6b2o6b 2obo33bo3bo2bo3b2o25bo5b2o4b2o31b2ob3o4b2obo3bo3bo3bo8b2o7b2o$31bo5bo 9bo4b5o2b2obo3b2ob2ob2o31b4o44b2ob2o31b2o4b2o2b2ob3ob2o2bo2b2o6bobo9bo bo$27bo2bo7bo2bo11bo3bobo2bo3bo2bobo2bo11bo17bo3bo44b2o2bo17b2o11bo2bo bo3bob2o5b2o3bo2bo6b2o11b2o$27b3o9b3o5bobob2o6b4o3b2o5bo11b6o14bobo2bo 42b2o17b2o2b2o17b3o5b2o5bo$61bob2o19b2o3b3o17bo61b2obo2bo19b3obo22bo7b o$30b2o5b2o25bo20bob2o2b2o79b2o2bo20b2o25b2o5b2o$29b2o7b2o24bo21bo4bo 81b3o49b2obob2o$30bo3bo3bo48b4o135b2ob2o$31b2obob2o49b2o90b2o55bo$25b 2o4b2o3b2o43b3o95bobo20bo3bo20b3o5bob2o$24b3o6bobo19b3ob3o18b2obo97b2o 16bobob2ob3o27b3o$51bob2o4bob4o14bo96bo3b2o16bo2bo6b2ob2o22b4o$50b3o3b ob2o3b2o3bo11b2o92bobo16b2o2b2o2bo3bo2bo2b2o12b2o3b2o3b3o$31b2o3b2o11b o3bo3bob2o5b4o11bo4bo86bo19b2obob2o2bo2bo4bo2bo5bo5b2o3b2o3b2obo$25b3o 3b2o3b2o12bo9bo3bobo3bo15bo2bo82b3obobo13bo3bo4b2o17b2o15bo$25b2o14bob o16bo3bobobobo13b4o2b2o79bo2bobo15bobobo2bo2b2o15b2o$41b2o17bobo4b3o 16b3o2bo80b2o3b3o21bo$42bo25bo14b3o3bobo80bo20b3o$84b2o6bo76b2obo$91b 3o76bo3bo50b2o3b2o$31b2o3b2o50bo82bo3bo49b2o3b2o$31b2o3b2o49b3ob3o77bo 2bo$87b3obo81bo51b2o3b2o$31b2o3b2o187b2o3b2o$31b2o3b2o2$60bo140b2o$58b 4o139b2ob2o19bo$37b2o15b2ob2o3bo3bo128b2o4b2o2b4o15b2o$37bobo14b2o2bo 5b4o127b2ob2o4bo4bo13b2o$38bobo12bo2bo7bo3bo117bo7bo3b2o7b2o13b3o$39bo 22bo2bobo7b3o107b4o9b2o$37bobo23bo7bob2o3bo101bo3bo3b2ob2o31b2o$36b3o 31b3o3b3o2b3o95b4o5bo2b2o32bo4bo2bo$31b2ob2ob2o30bo3bo4b3obobo93bo3bo 7bo2bo31b6o$30b3ob3o33bo7bo4bo95bobo2bo42bo2bo3bo$29bo5bo4bo38b2o102bo 38bo5b2ob3o$32b2o5b3o179b3o$29b2ob2o4bobobo177b2ob2o$37b3ob3o177b3o$ 38bobobo179bo$39b3o$40bo5$217b2o14b2o$44b2o170bo2bo6bo4bo4bo$30bo5b2o 5bo3bo168bo4b2o2b2o4bo5bo$25b3o2bo4bo2bo4bo172bo2b4o2bo5bo5bo$25bo10bo 2b2o2bo4bo166bo3bo3b2o8b4o$30b2o7b2obo3b2o117b2o49bo6bo8bo$26b2o2bo7bo 57b2o67b2o66bo$28b2o10b2o54b2o123b2o9b2o$29b2o8bo181b2o$39bo17bo147bo$ 40bobo10b2obobo145b2ob3o9bobo$40bo12b2o4bo142b3o5bo9bo5bo$36b2o3b3o8bo 2bo3b2obo136b2o7b2o10bo4b2o$34bo3bo3bo14bob2ob2o135b2o4bo19bo3bobo$32b 2o3bo18b6o2bo33bo65bo34b3o4bo19b2ob2o$32bo2b2o17bo2bo9b2o28bobo63b3o 21bo5b3o5b2o3b2o19b2o$31b2o2b2o17bo3bo3bo3bob2o4b3ob2o19bo66bo16b3ob3o 6bo2b3o2b2o2b2o17b3o2b2o$31bob2o19b2o2bo2b2ob3ob2o2b2o4b2o15b2o3bo62b 2ob2o14bo6b2o5b2o6b2ob3o21bo$34bo19bo2bo3b2o5b2obo3bobo2bo14b2o2bo15b 2obo24b2ob3o13b2ob2o16b2o3bo2bob4o3b2o2b2ob2o29b2o$23b2o8b2o23bo5b2o5b 3o25bo12b2ob2ob2o23b2o4b2o11b2ob2o61b2o8b2o$23b2o8b2o32bob3o40bo2bobo 2bo21bo2bobo3bo11bo2bo26bo34b2o$33b2o35b2o23b2o2b2o5b2o4b2o5bo29b3o2b 3o7b3o24bobo$95b6o5b2ob2o40b3obobo6b2o$97bo7bo3b2o40bo4bo$109b2o41b2o$ 118bo22bob2o$116b3ob3o17b2ob2ob2o$78b2o35b2o6bo15bo2bobo2bo34b3o$78bob o29bo3bo2bo3b2o17bo5b2o4b2o30bo$78bo30b4o36b2ob2o29bo$108bo3bo36b2o3bo $109bobo2bo34b2o$113bo$238b2o$23b2o180b2o31b2o$23b2o30b3o107b2o37bobo$ 55bo40b2o67b2o39bo$56bo39b2o$85bo22bo42bob2o22b2obo$81b3ob3o18b3ob3o 37b2ob2ob2o16b2ob2ob2o$80bo6b2o16b2o6bo35bo2bobo2bo16bo2bobo2bo$81b2o 3bo2bo3bo6bo3bo2bo3b2o37bo5b2o4b2o4b2o4b2o5bo$91b4o4b4o56b2ob2o4b2ob2o $91bo3bo2bo3bo56b2o3bo2bo3b2o$89bo2bobo4bobo2bo54b2o10b2o$90bo12bo123b o22bo$8b2ob3o20b3ob2o183b3ob3o18b3ob3o$8b2o4b2o16b2o4b2o182bo6b2o16b2o 6bo$7bo2bobo3bo14bo3bobo2bo182b2o3bo2bo3bo6bo3bo2bo3b2o$14b3o2b3o4b3o 2b3o199b4o4b4o$16b3obobo2bobob3o201bo3bo2bo3bo$16bo4bo4bo4bo199bo2bobo 4bobo2bo$17b2o10b2o201bo12bo29$186b3o$186b3o$166b2ob3o13bo3bo13b3ob2o$ 166b2o4b2ob2o21b2ob2o4b2o$165bo2bobo4b2o7bo5bo7b2o4bobo2bo$172b2obo2b 2o4b2obob2o4b2o2bob2o$178bob2o11b2obo$173b3ob2o2bo3bo3bo3bo2b2ob3o$ 173bo3b3obo4bobo4bob3o3bo$171b2obob2o4bo2bo3bo2bo4b2obob2o$170bobo2bo 8bobobobo8bo2bobo$168b3obo2bo5b2obo2bo2bob2o5bo2bob3o$167b2obo9bobobob 3obobobo9bob2o$166bo3bo9bobo2b2ob2o2bobo9bo3bo$181b3o2bobo2b3o$182bob 2o3b2obo$180b2o3bo3bo3b2o$180bobo4bo4bobo$182bo2bobobo2bo$182bob3ob3ob o$182bobo5bobo$179b2obobo2bo2bobob2o$179b2obobo2bo2bobob2o$182bobob3ob obo$181bo2b7o2bo$155bob2ob3o49b3ob2obo$154b2ob2o4b2obo16bo7bo16bob2o4b 2ob2o$153bo2bobo2bo3b3o18b3o18b3o3bo2bobo2bo$154bo5bo3bo3bo13b3o5b3o 13bo3bo3bo5bo$167b2o4b3o5b2ob3ob3ob2o5b3o4b2o$167b2o2b2obo9b3ob3o9bob 2o2b2o$168b2o4bob2o9bo9b2obo4b2o$173bo2bobo3b2o7b2o3bobo2bo$168b2obo2b obobobo13bobobobo2bob2o$172bo8bo11bo8bo6b2o$179bob13obo12bob2o$208bob 2o$184b7o13bo3b2ob3o$184b7o9b3ob3o2bo4bo3bo$182bo9bo6bo5b2o2b3o4b4o$ 181b2obo5bob2o6bo2bob2o9bo3bo$180bo4bo3bo4bo8bo4b2o4bo2bobo$179bo15bo 5b3obo9bo$180b2obo7bob2o4bo3bo16bo$84bo95b2obo7bob2o4bo2bobo3bo6bo2b3o $83bobo97b2o5b2o6b2o6b3ob3obobo4b5o4b2o$67bo14bo3bo14bo78b2ob2o5b2ob2o 3b2ob2o3bo2b2o3bobo4bo2b3o3b2ob2o$63b3ob3o13b3o13b3ob3o74b2obo7bob2o3b o12b2o3bobob5o4bo3b2o$62bo6bob3o21b3obo6bo75b2obo3bob2o6bo2bob2o2bo12b 2o3bo2bo2bobo$63b2o3bo5bo6b2o3b2o6bo5bo3b2o76b2o3bo3b2o8bo2b2o2b2o16b 4obo$71b7o3b2o3b2o3b7o32b3o51b2o3b2o15b2obo$69bo2b2o3b2o2b3ob3o2b2o3b 2o2bo30bo2bo51bo3bo14bo$70b2obo4b2o9b2o4bob2o31bo55b3o16b4o$76b4o2b2ob 2o2b4o37bo44b2o29b2o$68b2ob4o7b2ob2o7b4ob2o30bobo40b2obo$67bobob2o5b2o bob3obob2o5b2obobo$64b2obo10b2obo5bob2o10bob2o$64b2obo9bobobo5bobobo9b ob2o79b2o$64bobo10bo3bo5bo3bo10bobo79b2o$83bobo$77bo3b3ob3o3bo$77bob5o b5obo89b2o$77bobo9bobo88bo2bo18b2ob2o$79bob2obob2obo90bobo17b2obob2ob 2o$78b2obob3obob2o90bo15b3obo2b3o2b4o$79bobob3obobo40b3o60b3o4b3o5bo4b o$76b2obob2o3b2obob2o36bo2bo59bobobob3obo8b2o$76b2obobo5bobob2o39bo59b obobob4o$77bobobo5bobobo40bo60bobo4bo2bo$58bo21b2o5b2o21bo18bobo49bo5b 2o13bo6b2ob2o$51b2ob3ob3o20b7o20b3ob3ob2o64bo3bo2bo4bo12b2obob2ob2o$ 51b2o4bo2b2ob2o19bo19b2ob2o2bo4b2o63bo5bobo4bo9b3obo2b3o2b4o$50bo2bob 2o3bo2b2o14bobo2bo2bobo14b2o2bo3b2obo2bo68b3o10b3o4b3o5bo4bo$62bo2bo5b o6b2obo5bob2o6bo5bo2bo52b2ob3o34bobobob3obo8b2o$66bo2b4o5b2o3bobo3b2o 5b4o2bo56b2o4b2o14bo17bobobob4o$69bo3bo6b2o5b2o6bo3bo58bo2bobo3bo12b3o 17bobo4bo2bo$64b3o2bobob2o5b9o5b2obobo2b3o60b3o2b3o6b5o7b2o16bo$67bo2b 2obob2o15b2obob2o2bo65b3obobo4b2o3b2o5b2ob2obo4bo12b2obo$69b2obo3bob2o 9b2obo3bob2o67bo4bo6b5o5bob2obobo4bo9b2ob2ob2o$76bobob9obobo75b2o10b3o 7b3o5bo12bo2bobo2bo$77b15o38b3o48bo8b3o5b3o4b2o4b2o5bo$79b4o3b4o40bo2b o56bobo7bo4b2ob2o$80bo7bo41bo60bo2bo4b2o3bo3b2o$79b3ob3ob3o40bo56b3o2b 3o3bo9b2o$79bo2bobobo2bo11bo29bobo53b2o3bobo$97b2obobo84b3obo2bo$97b2o 4bo84b2o2bo2bo$96bo2bo3b2obo76b2o4b4o2bo$101bob2ob2o75b2o4b2o3b2o$100b 6o2bo82bobo$98bo2bo9b2o$76b3o11b3o5bo3bo3bo3bob2o4b3ob2o$76bo15bo5b2o 2bo2b2ob3ob2o2b2o4b2o$78bo11bo7bo2bo3b2o5b2obo3bobo2bo$78b2o9b2o11bo5b 2o5b3o102bo$78b2o9b2o20bob3o14b3o86bobo$77b3o9b3o22b2o13bo2bo70bo14bo 3bo14bo$132bo66b3ob3o13b3o13b3ob3o$82bo3bo45bo32bo23bo8bo6bob3o21b3obo 6bo$82bo3bo42bobo29b3ob3o14b2o5bo9b2o3bo5bo6b2o3b2o6bo5bo3b2o$83bobo 74bo6b2o13b4obobo17b7o3b2o3b2o3b7o$82b2ob2o74b2o3bo2bo3bo7bo3bo19bo2b 2o3b2o2b3ob3o2b2o3b2o2bo$81bobobobo83b4o7b3o4bo16b2obo4b2o9b2o4bob2o$ 171bo3bo6b3o4b2o21b4o2b2ob2o2b4o$80b3o3b3o80bo2bobo9bo4bo14b2ob4o7b2ob 2o7b4ob2o$80bobo3bobo81bo32bobob2o5b2obob3obob2o5b2obobo$81b2o3b2o112b 2obo10b2obo5bob2o10bob2o$80bo2bobo2bo111b2obo9bobobo5bobobo9bob2o$81b 2o3b2o112bobo10bo3bo5bo3bo10bobo$219bobo$130b3o80bo3b3ob3o3bo$90bo39bo 2bo79bob5ob5obo$88b2o40bo82bobo9bobo$88b3o39bo84bob2obob2obo$81b2o3b3o 42bobo80b2obob3obob2o$81b2o3b2o127bobob3obobo$212b2obob2o3b2obob2o$81b 2o3b2o124b2obobo5bobob2o$81b2o3b2o125bobobo5bobobo$194bo21b2o5b2o21bo$ 187b2ob3ob3o20b7o20b3ob3ob2o$88bo98b2o4bo2b2ob2o19bo19b2ob2o2bo4b2o$ 88bo93bo3bo2bob2o3bo2b2o14bobo2bo2bobo14b2o2bo3b2obo2bo$88bo91b2o16bo 2bo5bo6b2obo5bob2o6bo5bo2bo$181b2o19bo2b4o5b2o3bobo3b2o5b4o2bo$83b2ob 2o42b3o72bo3bo6b2o5b2o6bo3bo$83b2ob2o41bo2bo67b3o2bobob2o5b9o5b2obobo 2b3o$85bo5bo40bo70bo2b2obob2o15b2obob2o2bo$90bo41bo72b2obo3bob2o9b2obo 3bob2o$88bobo38bobo80bobob9obobo13b3o$81b3o2b3obo122b15o13bo$80bo4b2o 128b4o3b4o14b2o$81bo2b2o4b2obo126bo13bob2o2b2o2b3o$82b3o6bob2o123b2ob 2o10b2ob2ob2o5bo4b2o$216b2o5b2o7bo2b2o3bob2o4b2ob2o$90bo126bo5bo14b4o 6b2o3bo$90bo126bob3obo10bobob2o8b2o$90bo123b3o7b3o9bo$214b2o9b2o6b2o 18bo$58bob2o151bobo9bobo4b2o2bo4b2obo3bo3b2ob3o$57b2ob2ob2o65b3o81bo 11bo7b3ob2obob2ob2ob2obob3o2bo3b3o$56bo2bobo2bo65bo2bo81b2o7b2o4bo2bo 5bob2o6bo9bo2bobob2o$57bo5b2o4b2o17bo41bo82bobo9bobo3bob4obo3b3o3bobo 2bo3bobo2bobo3bo$66b2ob2o16bobo40bo82b2o11b2o8b3o2b2o10bo4b2o2bo2bobo$ 66b2o3bo14bo2bo41bobo102b2o4bo16b5o$66b2o4b3o11bo129bo7bo12bob2obo17b 2o$73b2o11b3o127b2o5b2o$87b2o128b2obob2o14bo2bo$86bo83bo37bo9b2ob2o15b o2bo$86bobo80bo38bo$78b2ob2o86b3o47b3o$86bo3bo24bo3bo$87bo24bobob2ob3o $88bo2bo19bo2bo6b2ob2o91b2o$106b2o2b2o2bo3bo2bo2b2o91b2o$106b2obob2o2b o2bo4bo2bo3b3o$105bo3bo4b2o13bo2bo$105bobobo2bo2b2o15bo81b2o18b3ob3o$ 114bo17bo80bo2bo14b4obo4b2obo$106b3o20bobo81bobo11bo3b2o3b2obo3b3o$ 214bo11b4o5b2obo3bo3bo$100bo124bo3bobo3bo9bo$97b5o123bobobobo3bo$96bob ob3o123b3o4bobo$96bo3b3o118bo5bo13b3ob3o$101bo3b2o113b3o15b4obo4b2obo$ 97bo3b2o2b2o112b5o10bo3b2o3b2obo3b3o$79b2o18b2o3bo91bo21b2o3b2o8b4o5b 2obo3bo3bo$79b2o33b2o76b3ob3o15bo4b5o8bo3bobo3bo9bo$114b2ob2o72bo6b2o 13b3o4b3o9bobobobo3bo$108b2o4b2o2b4o8b3o59b2o3bo2bo3bo7b5o4bo11b3o4bob o$81bo26b2ob2o4bo4bo7bo2bo68b4o5bo5bo16bo$79b2o18bo7bo3b2o7b2o8bo71bo 3bo3b2o2bo2b2o27b3ob2o$79b3o2b2o12b4o9b2o17bo69bo2bobo3b3obobob3o24b2o 4b2o$78bo5b2o7bo3bo3b2ob2o25bobo67bo8b2o2bo2b2o3b3o18bo3bobo2bo$79bo4b o7b4o5bo2b2o52bobo50bo5bo4b3o5b3o5b3o2b3o$79bo3bo7bo3bo7bo2bo51b2o52b 5o6bob2o3b5o2bobob3o$81bo6b2o2bobo2bo61bo53b3o4b3ob2o2b4o2b2o2bo4bo$ 86bo2bo6bo117bo5b3o4b2o2bob2o6b2o$86bobo131b2o5b2o3bo4$216b2o$216b2o8b o$130b3o$129bo2bo93b3o$132bo$132bo$129bobo31bo26bo$159b3ob3o11b4obo5b 4o$158bo6bob3o7bobo2b2o3b2o3bo$159b2o3bo5bo2b2obo2bo4bo5bob2o$167b2obo 2bobo2b2obo2bo3b3obobo$169b2o2bob2o2bo2bo2bo4bobobob2obo$169b2o3b3o2b 2ob2obo2bobobobob2ob2o20bo$172b3o2bo2bobo3bobobobobobo4bo12bob2o2bobo$ 170bo2bo5bo3bo4bobobobo5b3o9b2obob2o4bo11b3ob2o$172bo17bobobob2o2b4o 10bo18b2o4b2o$192bo5b3o2bo12b3o4bo8bo3bobo2bo$130b3o57bo7bo4bo13b7o3b 3o2b3o$130bo2bo13bo36b2o4bo3b4o2bob2o22bobob3o$130bo16bobo21bob2o8bo2b 2ob2o2bobobob2ob2o23bo4bo$130bo16b2o21b2ob2ob2o4bo3bo2b2obo8bo28b2o$ 131bobo35bo2bobo2bo5b4o13b2o$170bo5b2o4bo2bobo2b2o$179b2obo2bobo2b2o$ 56b2ob3o117b2o4bobo4bo$56b2o4b2o14b2o101bobobobobobo8bo$55bo2bobo3bo 13b2o119b2o$62b3o2b3o129bobo$64b3obobo$64bo4bo13b3o102b2o$65b2o18bo 102bobo$54bob2o26bo103bo$53b2ob2ob2o69b3o$52bo2bobo2bo68bo2bo44b2o$53b o5b2o4b2o65bo43b2o$62b2ob2o65bo45bo$62b2o3bo38b2o21bobo$62b2o41bobo57b 3o$107bo57bo$166bo$155bo$154b2o$154bobo2$64bob2o22b2obo34b3o6bo5b2o$ 63b2ob2ob2o16b2ob2ob2o15b2ob3o14bo4b2o6bobo$62bo2bobo2bo16bo2bobo2bo 14b2o4b2o11bo6b2o5bo$63bo5b2o4b2o4b2o4b2o5bo14bo2bobo3bo$72b2ob2o4b2ob 2o30b3o2b3o8b2o$72b2o3bo2bo3b2o32b3obobo6b2o$72b2o10b2o32bo4bo9bo$119b 2o2$119b2o$118bo2bo$118bo2bo$117b2obo$118bobob2o$115b2obobo$115b2obobo bo$116bobobo2bo$117bo2bo3b2o$116b5o2b3o$117b3obob2o$121bo$121bo! golly-2.5-src/Patterns/Life/Rakes/p270-frothing-puffer-rake.rle0000644000175100001440000002404612156145314021164 00000000000000#C Period 270 forward rake using period tripling of p90 input streams. #C In this rake, the base c/3 ship (found in Jan. 2002 by Paul Tooke) #C cycles between all three possible frothing periods: 21, 12, and 6. #C David Bell, 20 October 2002. x = 249, y = 371, rule = B3/S23 72bo85bo$71b3o83b3o$52boboo14bo3bo14boobo45boboo14bo3bo14boobo$51boob ooboobo10b3o10boboobooboo43boobooboobo10b3o10boboobooboo$50bobboboboob oo8b5o8booboobobobbo41bobbobobooboo8b5o8booboobobobbo$51bo6bo5bo4boo3b oo4bo5bo6bo43bo6bo5bo4boo3boo4bo5bo6bo$59bo3b4obo7bob4o3bo59bo3b4obo7b ob4o3bo$63bo3b3obobob3o3bo67bo3b3obobob3o3bo$58boobobbo3boo5boo3bobbob oo57boobobbo3boo5boo3bobboboo$57bo4bobbobobbooboobbobobbo4bo55bo4bobbo bobbooboobbobobbo4bo$56boobobo6boo5boo6boboboo53boobobo6boo5boo6bobob oo$54boobobo6booboboboboboo6boboboo49boobobo6booboboboboboo6boboboo$ 52boobo9bo3bobbobbo3bo9boboo45boobo9bo3bobbobbo3bo9boboo$51bo3bo9bobob oo3boobobo9bo3bo43bo3bo9boboboo3boobobo9bo3bo$52bobo11bobobo3bobobo11b obo45bobo11bobobo3bobobo11bobo$69bobobobo79bobobobo$66bo11bo73bo11bo$ 64boobo3bobo3boboo69boobo3bobo3boboo$67bo4bo4bo75bo4bo4bo$67bobooboboo bo75bobooboboobo$66boobo5boboo73boobo5boboo$65bobobo5bobobo71bobobo5bo bobo$64boobobob3oboboboo69boobobob3oboboboo$67bobo5bobo75bobo5bobo$64b ooboboo3booboboo69booboboo3booboboo$43boboo24b3o24boobo27boboo24b3o24b oobo$39b3obooboboo18b9o18booboboob3o19b3obooboboo18b9o18booboboob3o$ 38bo6boobb4o15boo5boo15b4obboo6bo17bo6boobb4o15boo5boo15b4obboo6bo$39b oo3bo3bo4bo12boo9boo12bo4bo3bo3boo19boo3bo3bo4bo12boo9boo12bo4bo3bo3b oo$51b3o5boo9bobobo9boo5b3o43b3o5boo9bobobo9boo5b3o$57boboo5bobboo3boo bbo5boobo55boboo5bobboo3boobbo5boobo$54boboo3boo19boo3boobo49boboo3boo 19boo3boobo$53booboobobobo4bob5obo4bobobobooboo47booboobobobo4bob5obo 4bobobobooboo$53boobo4bob3ob11ob3obo4boboo47boobo4bob3ob11ob3obo4boboo $57boobo3bob13obo3boboo55boobo3bob13obo3boboo$64bo15bo69bo15bo$65bo13b o71bo13bo$$68b9o77b9o$$69boo3boo13bo51bo13boo3boo$72bo12b3oboo49boob3o 12bo$67bo9bo6bo5b3o45b3o5bo6bo9bo$67bo9bo7boo7boo39boo7boo7bo9bo$66bo 3bobobo3bo10bo4boo39boo4bo10bo3bobobo3bo$66bo4bobo4bo9bo4b3o39b3o4bo9b o4bobo4bo$65bo4bo3bo4bo7boo3boo5b3o5bo15bo5b3o5boo3boo7bo4bo3bo4bo$65b 5o5b5o5boobboobb3obbo6b3ob3o7b3ob3o6bobb3obboobboo5b5o5b5o$85b3oboo6b oo5boo6bo5bo6boo5boo6boob3o$86booboobboo3b4obobbo3boo7boo3bobbob4o3boo bbooboo$$64b3o11b3o20bo27bo20b3o11b3o$69bo5bo25bobo23bobo25bo5bo$68boo 5boo77boo5boo$66bo3bobobo3bo73bo3bobobo3bo$66bobbo5bobbo73bobbo5bobbo$ 66bo3bobobo3bo73bo3bobobo3bo$67bobo5bobo75bobo5bobo$68boo5boo77boo5boo 3$69boo3boo79boo3boo$69boo3boo79boo3boo$$78bo73bo$78bobo69bobo$78boo 71boo$$69boo3boo79boo3boo$69boo3boo79boo3boo$$69boo3boo79boo3boo$69boo 3boo79boo3boo4$75boo77boo$74boboo75boobo$73boobb3o71b3obboo$73b3ob3o 71b3ob3o$73bobboboo71boobobbo$73bobbobo73bobobbo$73boobobo73boboboo$ 71bobbobobo73bobobobbo$70bobo5boo71boo5bobo$$70b3o8bo67bo8b3o$81bo67bo $81bo67bo$$77b3o71b3o5$45boob3o129b3oboo$45boo4boo125boo4boo$44bobbobo 3bo20bobo77bobo20bo3bobobbo$51b3obb3o3bobo9bobo77bobo9bobo3b3obb3o$53b 3obobobbooboo8bobbo73bobbo8booboobbobob3o$53bo4bo8bobo6b3o73b3o6bobo8b o4bo$54boo7boboo3boo87boo3boobo7boo$64b3obo8boo73boo8bob3o$66boboo7b3o 71b3o7boobo$66bobo10bo71bo10bobo$67bo11boo69boo11bo$79bo71bo$70bo10bo 21booboo15booboo21bo10bo$70bo9bobo18boobobooboo9boobooboboo18bobo9bo$ 69boo4boo3boo16b3obobb3obb4o3b4obb3obbob3o16boo3boo4boo$68boo5boo3bo 13b3o4b3o5bo4bobo4bo5b3o4b3o13bo3boo5boo$68bobobboboo16bobobob3obo8boo 3boo8bob3obobobo16boobobbobo$72bobbo17bobobob4o25b4obobobo17bobbo$72b 3o19bobo4bobbo21bobbo4bobo19b3o$74bo28bo23bo28bo$73bo21bo39bo21bo$70bo bbo21bo39bo21bobbo7$104b3oboo11boob3o$102boo4boo11boo4boo$101bo3bobobb o9bobbobo3bo$96b3obb3o23b3obb3o$95bobob3o27b3obobo$86boo8bo4bo7boo9boo 7bo4bo8boo$86booboo8boo5booboo9booboo5boo8booboo$80boo4boobb4o9b4obbob o7bobobb4o9b4obboo4boo$80booboo4bo4bo7bo4bo4bo5bo4bo4bo7bo4bo4booboo$ 79bo3boo7boo9boo7bo5bo7boo9boo7boo3bo$83boo27bo5bo27boo$108b3o9b3o$ 107bo15bo$108boboo7boobo$112bo5bo$108boo11boo$107bo3bo7bo3bo$110bo9bo$ 108bo13bo$108bo13bo$114b3o$108boo4b3o4boo$113bo3bo$107b3o11b3o$66boo 41bobbo5bobbo41boo$66boo40bo3boo3boo3bo40boo$114bobo$107b3o5bo5b3o$ 107b4obooboboob4o$109bobb7obbo$110b4o3b4o$109b3o7b3o$108bo4bo3bo4bo$ 107bo3bo3bo3bo3bo$65bo46bob3obo46bo$65boo40bob4o5b4obo40boo$64bo42bo4b 3ob3o4bo42bo$65b3o42boo3bo3boo42b3o$66bo46bo3bo46bo$48bo60boobbooboobb oo60bo$44b3ob3o57bobobbooboobbobo57b3ob3o$43bo6boo56bo6bo6bo56boo6bo$ 44boo3bobbo3bo50boo6bo6boo50bo3bobbo3boo$54b4o49bob3obbobobb3obo49b4o$ 54bo3bo52bo7bo52bo3bo$52bobbobo52bobo5bobo52bobobbo$53bo53b3obbob3obo bb3o53bo$41boob3o59boboboboo3boobobobo59b3oboo$41boo4boo32b3o22bobobob oo3boobobobo22b3o32boo4boo$40bobbobo3bo33bo23boob3obobob3oboo23bo33bo 3bobobbo$47b3obb3o27bo25boo3booboo3boo25bo27b3obb3o$49b3obobo54b3obobo b3o54bobob3o$49bo4bo52bo4bobobobo4bo52bo4bo$50boo60bobobobo60boo$66boo 46bobo46boo$66boo36boo8bobo8boo36boo$103bobo7booboo7bobo$105bo19bo$ 113bo3bo$112bo5bo$51boob3o20b3oboo30bo3bo30boob3o20b3oboo$51boo4boo16b oo4boo65boo4boo16boo4boo$50bobbobo3bo14bo3bobobbo63bobbobo3bo14bo3bobo bbo$57b3obb3o4b3obb3o77b3obb3o4b3obb3o$59b3obobobbobob3o81b3obobobbobo b3o$59bo4bo4bo4bo12bo55bo12bo4bo4bo4bo$60boo10boo9b3ob3o51b3ob3o9boo 10boo12bo$82bo6boo49boo6bo33bobo$83boo3bobbo3bo39bo3bobbo3boo18bo14bo 3bo14bo$93b4o37b4o24b3ob3o13b3o13b3ob3o$93bo3bo35bo3bo23bo6bob3o21b3ob o6bo$46b3o42bobbobo37bobobbo22boo3bo5bo6boo3boo6bo5bo3boo$46b3o43bo45b o31b7o3boo3boo3b7o$26boob3o13bo3bo13b3oboo99bobboo3boobb3ob3obboo3boo bbo$26boo4booboo21booboo4boo100boobo4boo9boo4boboo$25bobbobo4boo7bo5bo 7boo4bobobbo105b4obbooboobb4o$32boobobboo4booboboo4boobboboo104boob4o 7booboo7b4oboo$38boboo11boobo109boboboo5boobob3oboboo5boobobo$33b3oboo bbo3bo3bo3bobboob3o101boobo10boobo5boboo10boboo$33bo3b3obo4bobo4bob3o 3bo101boobo9bobobo5bobobo9boboo$31booboboo4bobbo3bobbo4booboboo99bobo 10bo3bo5bo3bo10bobo$30bobobbo8bobobobo8bobbobo117bobo$28b3obobbo5boobo bbobboboo5bobbob3o109bo3b3ob3o3bo$27boobo9bobobob3obobobo9boboo108bob 5ob5obo$26bo3bo9bobobbooboobbobo9bo3bo107bobo9bobo$41b3obbobobb3o124bo booboboobo$42boboo3boobo124boobob3oboboo$40boo3bo3bo3boo123bobob3obobo $40bobo4bo4bobo120booboboo3booboboo$42bobbobobobbo122boobobo5boboboo$ 42bob3ob3obo123bobobo5bobobo$42bobo5bobo104bo21boo5boo21bo$39boobobobb obboboboo94boob3ob3o20b7o20b3ob3oboo$39boobobobbobboboboo94boo4bobboob oo19bo19booboobbo4boo$42bobob3obobo96bobboboo3bobboo14bobobbobbobo14b oobbo3boobobbo$41bobb7obbo107bobbo5bo6boobo5boboo6bo5bobbo$15boboob3o 49b3oboobo85bobb4o5boo3bobo3boo5b4obbo$14booboo4boobo16bo7bo16boboo4b ooboo87bo3bo6boo5boo6bo3bo$13bobbobobbo3b3o18b3o18b3o3bobbobobbo81b3o bboboboo5b9o5boobobobb3o$14bo5bo3bo3bo13b3o5b3o13bo3bo3bo5bo85bobboobo boo15booboboobbo$27boo4b3o5boob3ob3oboo5b3o4boo100boobo3boboo9boobo3bo boo$27boobboobo9b3ob3o9boboobboo107bobob9obobo13b3o$28boo4boboo9bo9boo bo4boo109b15o13bo$33bobbobo3boo7boo3bobobbo116b11o14boo$28boobobbobobo bo13bobobobobboboo130boboobboobb3o$24boo6bo8bo11bo8bo133boobooboo5bo4b oo$23boobo12bob13obo122boo3bo3boo6bobboo3boboo4booboo$23boobo20bo129bo booboboboobo11b4o6boo3bo$21b3oboo3bo16bo128boo11boo6boboboo8boo$16bo3b o4bobb3ob3o10booboo127bobo7bobo9bo$15b4o4b3obboo5bo8bobobobo127boo7boo 7boo18bo$14bo3bo9boobobbo7bobooboboobo59bo5bo60bobo3bobo7boobbo4boobo 3bo3boob3o$15bobobbo4boo4bo12bobobobo61bo5bo58boo9boo7b3oboobobooboob oobob3obbo3b3o$19bo9bob3o8bo9bo59bo5bo58boo9boo3bobbo5boboo6bo9bobbobo boo$14bo16bo3bo5boo9boo123bobooboboboobo4bob4obo3b3o3bobobbo3bobobbobo 3bo$14b3obbo6bo3bobobbo3bo15bo124bo5bo12b3obboo10bo4boobbobbobo$3boo4b 5o4bobob3ob3o6boo3bobo9bobo126bo3bo13boo4bo16b5o$ooboo3b3obbo4bobo3boo bbo3booboo5bo9bo129b3o15boboobo17boo$oo3bo4b5obobo3boo12bo3bobo9bobo$o bobbobbo3boo12bobboobobbo4boo11boo117bo28bobbo$3bob4o16boobboobbo137b 4o26bobbo$25boboo142boboo$30bo11b3o5b3o$26b4o14bo5bo129boo$27boo17b3o 10bo120boo$46b3o9bobo$47bo$177boo$176bobbo$49boo125bobo18b3ob3o$49boo 126bo16b4obo4boobo$190bo3boo3boobo3b3o$189b4o5boobo3bo3bo$28booboo19b oo134bo3bobo3bo9bo$25boobooboboo16bobbo133bobobobo3bo$22b4obb3obbob3o 14bobo122bo5boo4b3o4bobo$21bo4bo5b3o4b3o11bo122boo4bobbo4bo13b3ob3o$ 22boo8bob3obobobo133boo5b3o15b4obo4boobo$33b4obobobo154bo3boo3boobo3b 3o$31bobbo4bobo117bo36b4o5boobo3bo3bo$21booboo6bo122b3ob3o33bo3bobo3bo 9bo$18boobooboboo12bo4b3o106bo6boo14bo17bobobobo3bo$15b4obb3obbob3o9bo 3bo3bo106boo3bobbo3bo7booboo7boo7b3o4bobo$14bo4bo5b3o4b3o8bo5bo115b4o 6booboo6bobbo7bo$15boo8bob3obobobo8bo3bo21b3oboo89bo3bo5booboo6boob5o 15b3oboo$26b4obobobo9b3o4b3o13boo4boo87bobbobo8bo8boobb4o13boo4boo$24b obbo4bobo16bo3bo11bo3bobobbo87bo24b3obboo10bo3bobobbo$25bo15bobo6bo5bo 5b3obb3o118b3obobbo5b3obb3o$17boboo12bo15bo3bo3bo3bobob3o116boo3boo4bo 4bobob3o$16boobooboo9bo10bo4bobbobobbo4bo4bo116b3obo4boo6bo4bo$15bobbo bobbo12boo11bo3bo3bo7boo117boboo16boo$16bo5boo4boo13boobo3bo5bo128boo bbo$25booboo3boobo3bobobo6bo3bo128bobb4o$25boo3bobbobboobobboobbo5b3o 124boo4bo5bo$25boo6bobbobboo5boo131boo5b5o$34bobobbo6bo140b3o4$50boo$ 38boboo8boo$39b3o84bo26bo$40bo81b3ob3o11b4obo5b4o$121bo6bob3o7bobobboo 3boo3bo$122boo3bo5bobboobobbo4bo5boboo$130boobobbobobboobobbo3b3obobo 26b3o$76b3o6booboo13b3oboo23boobboboobbobbobbo4boboboboobo15b3o4boo$ 77boboo3bo3boboo6booboo4boo23boo3b3obbooboobobbobobobobooboo14bobboobb o$74boobo3bobo4bo4bo4boo4bobobbo25b3obbobbobo3bobobobobobo4bo13booboo bboo$73bobobb5o3b3o3b3obboboboo30bobbo5bo3bo4bobobobo5b3o14boboboo12b 3oboo$71b3obobo3boobbobbo3bo4boo36bo17boboboboobb4o14b4o11boo4boo$67b 3obobobobobbo4b3o3bobbo60bo5b3obbo15boo11bo3bobobbo$45b3oboboobo11bo6b obobob3o3bobo3bobbo3bo54bo7bo4bo23b3obb3o$28boboo13boo3bo3bo12booboobo bobobo3bobobobo4bo3bo48boo4bo3b4obboboo22bobob3o$27boobooboo10b4o3bobo 9boo7bobobobo15boo37boboo8bobbooboobbobobobooboo23bo4bo$26bobbobobbo8b oob6o12boobboobbooboo56boobooboo4bo3bobboobo8bo28boo$27bo5boo4boo4bo 20boobobboobo56bobbobobbo5b4o13boo$36booboo21bobb3oboboobb3o4bo50bo5b oo4bobbobobboo$36boo3bo21bobo9b3o3boboo8bo48boobobbobobboo$36boo29bobb obobbo3boboboo6b3ob3o44boo4bobo4bo$66bo10bo3boobbo4boo6bo45bobobobobob o9boo$67bo12bo8bobbo3boo65boo$76boobbobobb3o77bo$75bob4ob4obo$76bobobo bobobobbo62b3o$66b3o83bo$68bo84bo$67bo74bo$78bo62boo$78boo61bobo$77bob o$130boo$89boo39bobo$88bobo39bo$90bo$119boo$100boo16boo$101boo17bo$ 100bo$$111b3o$113bo$112bo20$179boo$178bobo$180bo21$246b3o$248bo$247bo! golly-2.5-src/Patterns/Life/Rakes/spider-rake.rle0000644000175100001440000000726112156145314016657 00000000000000#C p360 Spider Rake #C Nine gliders travel in a figure-8 loop, trapped by c/5 spiders, #C liberating one glider each time. The gliders in the loop collide #C with the prepulsar part of a c/5 spider combo to form a Herschel #C traveling downwards. The Herschel is guided by other spiders, #C producing a glider with the correct parity to form a large period #C spaceship - in this case, p3240, which can be divided by 9 to form #C a p360 spaceship. The Herschel on the left side is then killed, #C but the Herschel on the right side is pushed a little further to #C liberate one more glider before it is killed. #C On the far right side, another c/5 spider-prepulsar spaceship #C reflects the forward gliders, making this a backward rake. #C By David Bell, June 3, 1998 #C From Alan Hensel's "lifebc" pattern collection. x = 500, y = 127, rule = B3/S23 34bo5bo346bo5bo$33bobo3bobo344bobo3bobo$32bo3bobo3bo342bo3bobo3bo$33bo bo3bobo344bobo3bobo$34bo5bo346bo5bo$5boo5boo5boo5boo19boo5boo5boo5boo 288boo5boo5boo5boo19boo5boo5boo5boo$3bo3bo3bobbo3bobbo3bo3bo15bo3bo3bo bbo3bobbo3bo3bo284bo3bo3bobbo3bobbo3bo3bo15bo3bo3bobbo3bobbo3bo3bo$3bo 3bobob3o5b3obobo3bo9boo4bo3bobob3o5b3obobo3bo284bo3bobob3o5b3obobo3bo 4boo9bo3bobob3o5b3obobo3bo$3bo5boobb3ob3obboo5bo8bobbo3bo5boobb3ob3obb oo5bo284bo5boobb3ob3obboo5bo3bobbo8bo5boobb3ob3obboo5bo$3boob3o15b3ob oo9boo4boob3o15b3oboo284boob3o15b3oboo4boo9boob3o15b3oboo$3bo25bo15bo 25bo284bo25bo15bo25bo$4bo3bo15bo3bo17bo3bo15bo3bo286bo3bo15bo3bo17bo3b o15bo3bo$5bobbo15bobbo19bobbo15bobbo288bobbo15bobbo19bobbo15bobbo3$47b oo$47bobo$47bo7$334boo$333bobo$335bo4$55bo7bo300bo7bo$4bo5boo5boo5bo 24booboboboo3booboboboo288booboboboo3booboboboo24bo5boo5boo5bo$bbobboo boobbo3bobbooboobbo19b3obob3o9b3obob3o282b3obob3o9b3obob3o19bobbooboo bbo3bobbooboobbo$3o4bobo3bobo3bobo4b3o17bo3bobo5bobo5bobo3bo64boo216bo 3bobo5bobo5bobo3bo17b3o4bobo3bobo3bobo4b3o$oobbobb3oboo3boob3obbobboo 21boo6bobo6boo68bobo219boo6bobo6boo21boobbobb3oboo3boob3obbobboo$3obb 3o4bo3bo4b3obb3o18boo9bobo9boo65bo218boo9bobo9boo18b3obb3o4bo3bo4b3obb 3o$bobobbo15bobbobo19booboo15booboo284booboo15booboo19bobobbo15bobbobo $bbo23bo24bo15bo292bo15bo24bo23bo5$244boo$243bobo$245bo6$389bo$47bo5b oo5boo5bo159boo131bo5boo5boo5bo8bobo$45bobbooboobbo3bobbooboobbo157bob o128bobbooboobbo3bobbooboobbo6b3o$43b3o4bobo3bobo3bobo4b3o155bo128b3o 4bobo3bobo3bobo4b3o$43boobbobb3oboo3boob3obbobboo284boobbobb3oboo3boob 3obbobboo$43b3obb3o4bo3bo4b3obb3o284b3obb3o4bo3bo4b3obb3o$44bobobbo15b obbobo286bobobbo15bobbobo$45bo23bo288bo23bo3$154boo$153bobo$155bo7$ 317boo$317bobo$317bo7$64boo$63bobo394bo$65bo393bobo$466bo$459b3o3bobo $$11boo5boo445b3o$3b4obobobo5bobobob4o405bo3b3o5b3o3bo$bb3oboboboobo3b oboobobob3o401boob5oboo3boob5oboo$bbo3bobo13bobo3bo17bo5boo5boo5bo361b oboobo5bobobobo5boboobo18bo3b3o5b3o3bo$3bob3o5booboo5b3obo16bobbooboo bbo3bobbooboobbo358bo3bobo3b5ob5o3bobo3bo14boob5oboo3boob5oboo$3boo21b oo14b3o4bobo3bobo3bobo4b3o360b3o5boo3boo5b3o16boboobo5bobobobo5boboobo $3b5o15b5o14boobbobb3oboo3boob3obbobboo357bobbob3o13b3obobbo12bo3bobo 3b5ob5o3bobo3bo$6boo15boo17b3obb3o4bo3bo4b3obb3o339bo7bo11bo23bo18b3o 5boo3boo5b3o$43bobobbo15bobbobo334booboboboo3booboboboo45bobbob3o13b3o bobbo$44bo23bo332b3obob3o9b3obob3o44bo23bo$356boo5boo5boo5boo22bo3bobo 5bobo5bobo3bo$354bo3bo3bobbo3bobbo3bo3bo24boo6bobo6boo$354bo3bobob3o5b 3obobo3bo21boo9bobo9boo$354bo5boobb3ob3obboo5bo21booboo15booboo$354boo b3o15b3oboo25bo15bo$354bo25bo$355bo3bo15bo3bo$356bobbo15bobbo11$360boo 5boo5boo5boo$358bo3bo3bobbo3bobbo3bo3bo$358bo3bobob3o5b3obobo3bo$358bo 5boobb3ob3obboo5bo$358boob3o15b3oboo$358bo25bo$359bo3bo15bo3bo$360bobb o15bobbo28bo7bo$405booboboboo3booboboboo$402b3obob3o9b3obob3o$402bo3bo bo5bobo5bobo3bo$406boo6bobo6boo$403boo9bobo9boo$403booboo15booboo$407b o15bo! golly-2.5-src/Patterns/Life/Signal-Circuitry/0000755000175100001440000000000012156146015016141 500000000000000golly-2.5-src/Patterns/Life/Signal-Circuitry/advancer.rle0000644000175100001440000000226012156145314020351 00000000000000#C p30 glider advancer #6, advances gliders by 60 generations. #C The device uses six copies of David Bell's p30 in-line NOT gate. #C Speed of information transmission within the device: 13/36 = 0.361c #C Dieter Leithner, 27 Dec 1993; from Jason Summers' jslife collection. x = 135, y = 144, rule = B3/S23 38bo$36bobo$37boo14$22bo$20bobo$21boo12$68bo$66bobo$67boo4$bbo$obo$boo 8$52bo$50bobo$51boo18$32bo$30bobo$31boo11$88bo$86bobo$77bo7bobo$76boo 6bobbo11boo$65boo8boo4boobbobo11boo$65boo7b3o4boo3bobo$75boo4boo5bo$ 76boo$77bo10bo$89bo$86boo5boo$86b3o4b3o$79bo7bo7boobo$77bobo15bobbo5b oo$70boo4bobo9b3o4boobo5boo$70boo3bobbo8boobobb3o$76bobo7bo3bobboo$77b obo6bobbo$79bo8boo19boo$109bo6bo$101bo5bobo4b3o$100boo5boo4bo$84boo13b oo12boo$84b3o11b3o$75boo9boobo9boo3boo14boo$75bo5bo4bobbo10boo18boo$ 80bo5boobo11bo$76bo3bo3b3o10bo$78bo5boo9bobo13bo$96boo12b3o8bo8boo$ 109b5o6bobo7bobbo$108boo3boo4bo3bo$120b3o11bo$118boo3boo$104bo27boo$ 105bo4b3o18bo$103b3o4b3o$$109bo9bo8boo3boo$108bobo8bo8boo3boo$107bo3bo 7bob3o5b5o$108b3o19bobo$106boo3boo11bo$121boboo5b3o$121boo3$116boo3boo 8bo$116boo3boo7bobo$117b5o$118bobo$$118b3o8bo$109boo17b3o$109boo16b5o$ 126boo3boo3$119boo$119boo7b3o$128b3o3$129boo$129boo! golly-2.5-src/Patterns/Life/Signal-Circuitry/constructor-memory-loop.rle0000644000175100001440000013254612156145314023443 00000000000000#CXRLE Pos=-30130,-1144 #C Programmable constructor attached to a glider loop containing #C a repeatable recipe for constructing an oblique line of eaters. #C Based on prototype programmable constructor by Paul Chapman -- #C see constructor-memory-tape.rle in the same folder for details. #C The memory-tape version's circuits are separated from each other #C to make the individual components easier to recognize. #C #C In this memory-loop version, as a first step, a long string #C of gliders representing the construction recipe (lower left) #C is loaded into a repeating memory loop of the correct size. #C Gliders in the loop will be duplicated once every 118378 ticks. #C The first glider reaches the duplicator at generation 117892. #C #C The first output glider from the duplicator is the initial '1' bit #C in the following 157-bit recipe: #C 1 001 001 1 1 0001 01 0001 001 01 01 01 001 1 001 1 1 1 1 0001 #C 1 1 0001 1 001 1 001 1 1 1 1 1 0001 01 01 01 01 0001 1 1 1 1 1 #C 1 1 1 1 1 1 1 0001 1 0001 01 001 1 1 001 1 1 1 1 1 1 1 1 1 #C 0001 01 01 01 0001 01 01 01 01 01 001 1 1 1 1 1 1 1 1 1 001 #C [1=INC, 01=DEC, 001=fire BLACK glider, 0001=fire WHITE glider] #C #C However, instead of doing a full INC operation, the initial glider #C is used to unblock the 'ladder' circuit and initialize it with a #C new block ready to be pulled up the ladder. Press 'm' in Golly 1.1 #C to center the view on the temporary eater and block that keep the #C circuit switched off until the memory loop has been fully loaded. #C #C The p754 Collector gun starts right away, but has no effect until #C PULL (0) micro-instructions reach the ladder and produce gliders #C that need to be suppressed. Only TRIGGER (1) micro-instructions #C are allowed to send signals through to the salvo shotguns at the #C 'shoulder'; these manipulate the block at the 'elbow' and produce #C WHITE or BLACK gliders aimed at the construction site (hand). #C #C The first construction interaction at the hand begins at 129200 #C ticks, after which a new eater is constructed at (+8,-12) from #C the previous one, every 118442 ticks -- another Doppler effect. #C #C Dave Greene, 26 May 2004 #C Updated 16 October 2006: smaller memory loop and constructor, #C but a less compact initial pattern (full recipe bitstring shown). x = 31473, y = 31101, rule = B3/S23 28864b2o108b2o108b2o$28842b2o20b2o86b2o20b2o86b2o20b2o$28752b2o89bo 109bo109bo$28730b2o20b2o78bo10bobo96bo10bobo96bo10bobo$28731bo98b3o11b 2o94b3o11b2o94b3o11b2o$28720bo10bobo80bo14bo94bo14bo94bo14bo$28718b3o 11b2o80b3o12b2o93b3o12b2o93b3o12b2o$28702bo14bo99bo109bo109bo$28702b3o 12b2o97b2o108b2o108b2o$28705bo$28704b2o478b2o108b2o108b2o108b2o108b2o 108b2o$28817b2o108b2o108b2o123b2o20b2o86b2o20b2o86b2o20b2o86b2o20b2o 86b2o20b2o86b2o20b2o$28817b2o17b2o89b2o17b2o89b2o17b2o105bo109bo109bo 109bo109bo109bo$28705b2o129b2o108b2o108b2o94bo10bobo96bo10bobo96bo10bo bo96bo10bobo96bo10bobo96bo10bobo$28705b2o17b2o424b3o11b2o94b3o11b2o94b 3o11b2o94b3o11b2o94b3o11b2o94b3o11b2o$28724b2o148b2o108b2o108b2o38bo 14bo94bo14bo94bo14bo94bo14bo94bo14bo94bo14bo$28874b2o108b2o108b2o38b3o 12b2o93b3o12b2o93b3o12b2o93b3o12b2o93b3o12b2o93b3o12b2o$28762b2o373bo 109bo109bo109bo109bo109bo$28762b2o372b2o108b2o108b2o108b2o108b2o108b2o $28833b2o108b2o108b2o$28833bo19b2o88bo19b2o88bo19b2o$28721b2o111b3o15b obo89b3o15bobo89b3o15bobo62b2o108b2o108b2o108b2o108b2o108b2o$28721bo 19b2o93bo15bo93bo15bo93bo15bo64b2o17b2o89b2o17b2o89b2o17b2o89b2o17b2o 89b2o17b2o89b2o17b2o$28722b3o15bobo87b2o19b2o87b2o19b2o87b2o19b2o83b2o 108b2o108b2o108b2o108b2o108b2o$28724bo15bo89bo109bo109bo$28718b2o19b2o 90b3o107b3o107b3o140b2o108b2o108b2o108b2o108b2o108b2o$28718bo114bo109b o109bo140b2o108b2o108b2o108b2o108b2o108b2o$28719b3o$28721bo$29153b2o 108b2o108b2o108b2o108b2o108b2o$29153bo19b2o88bo19b2o88bo19b2o88bo19b2o 88bo19b2o88bo19b2o$29154b3o15bobo89b3o15bobo89b3o15bobo89b3o15bobo89b 3o15bobo89b3o15bobo$28839b2o108b2o108b2o95bo15bo93bo15bo93bo15bo93bo 15bo93bo15bo93bo15bo$28839bo109bo109bo90b2o19b2o87b2o19b2o87b2o19b2o 87b2o19b2o87b2o19b2o87b2o19b2o$28727b2o91b2o15bobo90b2o15bobo90b2o15bo bo90bo109bo109bo109bo109bo109bo$28727bo92b2o15b2o91b2o15b2o91b2o15b2o 92b3o107b3o107b3o107b3o107b3o107b3o$28708b2o15bobo425bo109bo109bo109bo 109bo109bo$28708b2o15b2o3$29814b2o$29792b2o20b2o$29159b2o108b2o108b2o 108b2o108b2o108b2o82bo$29159bo109bo109bo109bo109bo109bo72bo10bobo$ 29140b2o15bobo90b2o15bobo90b2o15bobo90b2o15bobo90b2o15bobo90b2o15bobo 70b3o11b2o$29140b2o15b2o91b2o15b2o91b2o15b2o91b2o15b2o91b2o15b2o91b2o 15b2o55bo14bo$29764b3o12b2o$28819b2o108b2o108b2o726bo$28818bobo107bobo 107bobo725b2o$28707b2o109bo109bo109bo$28706bobo108b2o108b2o108b2o$ 28706bo1060b2o$28705b2o1060b2o17b2o$29786b2o2$29824b2o$29824b2o$29139b 2o108b2o108b2o108b2o108b2o108b2o$29138bobo107bobo107bobo107bobo107bobo 107bobo$28829b2o108b2o108b2o87bo109bo109bo109bo109bo109bo94b2o$28829b 2o108b2o108b2o86b2o108b2o108b2o108b2o108b2o108b2o94bo19b2o$28717b2o 1065b3o15bobo$28717b2o1067bo15bo$29780b2o19b2o$29780bo$29781b3o$28818b 2o108b2o108b2o743bo$28819bo19b2o6b2o80bo19b2o6b2o80bo19b2o6b2o$28706b 2o111bobo17bo7bobo79bobo17bo7bobo79bobo17bo7bobo$28707bo19b2o91b2o15bo bo9bo80b2o15bobo9bo80b2o15bobo9bo79b2o108b2o108b2o108b2o108b2o108b2o$ 28707bobo17bo104bo4b2o10b2o91bo4b2o10b2o91bo4b2o10b2o78b2o108b2o108b2o 108b2o108b2o108b2o$28708b2o15bobo103bobo107bobo107bobo$28720bo4b2o104b obo107bobo107bobo735b2o$28719bobo98b2o10bo97b2o10bo97b2o10bo736bo$ 28719bobo97bobo107bobo107bobo728b2o15bobo$28708b2o10bo98bo109bo109bo 730b2o15b2o$28707bobo108b2o108b2o108b2o98b2o108b2o108b2o108b2o108b2o 108b2o$28707bo125b2o108b2o108b2o84bo19b2o6b2o80bo19b2o6b2o80bo19b2o6b 2o80bo19b2o6b2o80bo19b2o6b2o80bo19b2o6b2o$28706b2o125bo109bo109bo85bob o17bo7bobo79bobo17bo7bobo79bobo17bo7bobo79bobo17bo7bobo79bobo17bo7bobo 79bobo17bo7bobo$28721b2o111b3o107b3o107b3o83b2o15bobo9bo80b2o15bobo9bo 80b2o15bobo9bo80b2o15bobo9bo80b2o15bobo9bo80b2o15bobo9bo$28721bo114bo 109bo109bo95bo4b2o10b2o91bo4b2o10b2o91bo4b2o10b2o91bo4b2o10b2o91bo4b2o 10b2o91bo4b2o10b2o$28722b3o426bobo107bobo107bobo107bobo107bobo107bobo$ 28724bo426bobo107bobo107bobo107bobo107bobo107bobo$29140b2o10bo97b2o10b o97b2o10bo97b2o10bo97b2o10bo97b2o10bo$29139bobo107bobo107bobo107bobo 107bobo107bobo$29139bo109bo109bo109bo109bo109bo$29138b2o108b2o108b2o 108b2o108b2o108b2o$29153b2o108b2o108b2o108b2o108b2o108b2o64b2o$29153bo 109bo109bo109bo109bo109bo64bobo$29154b3o107b3o107b3o107b3o107b3o107b3o 61bo$29156bo109bo109bo109bo109bo109bo60b2o9$29779b2o$29779b2o$28634b2o $28635bo$28632b3o$28632bo2$29768b2o$29769bo19b2o6b2o$29769bobo17bo7bob o$29770b2o15bobo9bo$29782bo4b2o10b2o$29781bobo$29781bobo$29770b2o10bo$ 29769bobo$29769bo$29768b2o$29783b2o$29783bo$29784b3o$29786bo57b2o$ 29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$29794bo14bo$29794b3o 12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$29816b2o2$29854b2o$ 29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$29816bo15bo$29810b2o19b 2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620bobo$28621b2o2b2o37bo$ 28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b2o20bo3bo$28648b2o32b 2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b2o5$28619b2o52b2o$ 28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo44bo2bo$28633b2o4b 2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o56b2o1104b2o$ 28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b3o1113b2o$ 28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$28681bo1127b 2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b2o$29798b2o$ 29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$29812bo4b2o10b2o $29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o1183bo$28614b2o 1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$28629b2o24$29844b 2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$29794bo14bo$ 29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$29816b2o2$ 29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$29816bo15bo$ 29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620bobo$28621b2o 2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b2o20bo3bo$ 28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b2o5$28619b 2o52b2o$28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo44bo2bo$ 28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o56b2o 1104b2o$28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b3o 1113b2o$28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$ 28681bo1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b 2o$29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$ 29812bo4b2o10b2o$29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o 1183bo$28614b2o1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$ 28629b2o24$29844b2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$ 29794bo14bo$29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$ 29816b2o2$29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$ 29816bo15bo$29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620b obo$28621b2o2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b 2o20bo3bo$28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b 2o5$28619b2o52b2o$28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo 44bo2bo$28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o 56b2o1104b2o$28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b 3o1113b2o$28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$ 28681bo1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b 2o$29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$ 29812bo4b2o10b2o$29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o 1183bo$28614b2o1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$ 28629b2o24$29844b2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$ 29794bo14bo$29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$ 29816b2o2$29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$ 29816bo15bo$29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620b obo$28621b2o2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b 2o20bo3bo$28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b 2o5$28619b2o52b2o$28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo 44bo2bo$28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o 56b2o1104b2o$28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b 3o1113b2o$28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$ 28681bo1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b 2o$29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$ 29812bo4b2o10b2o$29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o 1183bo$28614b2o1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$ 28629b2o24$29844b2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$ 29794bo14bo$29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$ 29816b2o2$29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$ 29816bo15bo$29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620b obo$28621b2o2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b 2o20bo3bo$28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo$29800b2o15b 2o5$28619b2o52b2o$28618bobo16b2o34b2o$28618bo18bobo45b2o$28617b2o20bo 44bo2bo$28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o 56b2o1104b2o$28626b2o20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b 3o1113b2o$28646bo34bo2$28615bo$28615b3o$28618bo$28617b2o2$28681b2o$ 28681bo1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b 2o$29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo$29800b2o15bobo9bo$ 29812bo4b2o10b2o$29811bobo$29811bobo$29800b2o10bo$29799bobo$28614b2o 1183bo$28614b2o1182b2o$29813b2o$29813bo$29814b3o$29816bo5$28629b2o$ 28629b2o24$29844b2o$29822b2o20b2o$29823bo$29812bo10bobo$29810b3o11b2o$ 29794bo14bo$29794b3o12b2o$29797bo$29796b2o3$29797b2o$29797b2o17b2o$ 29816b2o2$29854b2o$29854b2o3$29813b2o$29813bo19b2o$29814b3o15bobo$ 29816bo15bo$29810b2o19b2o$29810bo$28619b2o1190b3o$28620bo1192bo$28620b obo$28621b2o2b2o37bo$28625b2o35b3o15bo9bo$28661bo18b3o5b3o$28648b2o11b 2o20bo3bo$28648b2o32b2o3b2o1130b2o$29819bo$29800b2o15bobo1223bo$29800b 2o15b2o1222b3o$31040bo$31040b2o3$28619b2o52b2o$28618bobo16b2o34b2o$ 28618bo18bobo45b2o$28617b2o20bo44bo2bo2359b2o$28633b2o4b2o44b2o4b2o 2354b2o$28633bobo55bobo$28635bo57bo$28626b2o7b2o56b2o1104b2o$28626b2o 20b2o33b2o1113bobo$28649bo34bo1113bo$28646b3o32b3o1113b2o$28646bo34bo 2$28615bo$28615b3o$28618bo$28617b2o$31031b2o$28681b2o2348b2o$28681bo 1127b2o$28682b3o1124b2o$28684bo$28637bo$28635b3o$28634bo$28634b2o$ 29798b2o$29799bo19b2o6b2o$29799bobo17bo7bobo1207b2o$29800b2o15bobo9bo 1207bobo$29812bo4b2o10b2o1208bo$29811bobo1225b2o$29811bobo$29800b2o10b o$29799bobo$28614b2o1183bo$28614b2o1182b2o$29813b2o$29813bo1215b2o$ 29814b3o1212b2o$29816bo$31023bo$31021b3o$31020bo18b2o$31020b2o17b2o$ 28629b2o2418b2o$28629b2o2418bo$31047bobo$31047b2o9$31043b2o$31043bobo$ 31045bo$31045b2o5$30746b2o$30746b2o280b2o$30726bo301b2o$30714bo11b3o 308b2o$30712b3o14bo280b2o25bobo$29844b2o850bo14bo16b2o280b2o27bo$ 29822b2o20b2o850b3o12b2o277bo48b2o$29823bo875bo278bo11b3o$29812bo10bob o872b2o276b3o14bo$29810b3o11b2o1134bo14bo16b2o$29794bo14bo1150b3o12b2o $29794b3o12b2o888b2o262bo$29797bo901b2o17b2o242b2o$29796b2o920b2o2$ 30756b2o205b2o57b2o$29797b2o957b2o205b2o17b2o38b2o4b2o$29797b2o17b2o 1164b2o44b2o$29816b2o$30715b2o303b2o$29854b2o859bo19b2o283b2o$29854b2o 860b3o15bobo290b2o$30718bo15bo288b2o2b2o$30712b2o19b2o244b2o41bobo$ 29813b2o897bo266bo19b2o21bo12b2o$29813bo19b2o878b3o264b3o15bobo20b2o 11bobo$29814b3o15bobo880bo266bo15bo35bo$29816bo15bo1143b2o19b2o34b2o$ 29810b2o19b2o1143bo72b2o$29810bo1166b3o69bo$28619b2o1190b3o1165bo70b3o $28620bo1192bo1238bo$28620bobo2098b2o312b2o$28621b2o2b2o37bo2056bo312b obo$28625b2o35b3o15bo9bo2011b2o15bobo312bo$28661bo18b3o5b3o2011b2o15b 2o312b2o60bo$28648b2o11b2o20bo3bo2002b2o293b2o106b3o$28648b2o32b2o3b2o 1130b2o868bobo293bo106bo$29819bo869bo276b2o15bobo106b2o$29800b2o15bobo 868b2o276b2o15b2o78bo34bo$29800b2o15b2o1135b2o107b3o32b3o$30953bobo 110bo34bo$30953bo89b2o20b2o33b2o$30952b2o89b2o7b2o56b2o$31052bo57bo$ 28619b2o52b2o2375bobo55bobo$28618bobo16b2o34b2o2375b2o4b2o44b2o4b2o$ 28618bo18bobo45b2o2014b2o331b2o20bo44bo2bo$28617b2o20bo44bo2bo2012bobo 332bo18bobo45b2o$28633b2o4b2o44b2o4b2o2007bo334bobo16b2o34b2o$28633bob o55bobo2005b2o335b2o52b2o$28635bo57bo2271b2o$28626b2o7b2o56b2o1104b2o 1163bobo$28626b2o20b2o33b2o1113bobo1163bo$28649bo34bo1113bo1164b2o$ 28646b3o32b3o1113b2o$28646bo34bo2$28615bo2449b2o32b2o3b2o$28615b3o 2093b2o352b2o11b2o20bo3bo$28618bo2092b2o365bo18b3o5b3o$28617b2o2423b2o 35b3o15bo9bo$31038b2o2b2o37bo$28681b2o2292b2o60bobo$28681bo1127b2o 1164b2o60bo23b2o$28682b3o1124b2o1225b2o23bo$28684bo2015b2o360b3o$ 28637bo2063bo19b2o341bo$28635b3o2063bobo17bo$28634bo2067b2o15bobo$ 28634b2o2078bo4b2o243b2o$29798b2o913bobo249bo19b2o$29799bo19b2o6b2o 884bobo249bobo17bo$29799bobo17bo7bobo872b2o10bo251b2o15bobo$29800b2o 15bobo9bo871bobo274bo4b2o$29812bo4b2o10b2o870bo275bobo$29811bobo886b2o 275bobo$29811bobo901b2o249b2o10bo$29800b2o10bo902bo249bobo$29799bobo 914b3o246bo$28614b2o1183bo918bo245b2o$28614b2o1182b2o1179b2o$29813b2o 1164bo$29813bo1166b3o$29814b3o1165bo$29816bo$31146b2o$31146b2o3$28629b 2o$28629b2o$31135b2o$31136bo$31136bobo$31137b2o3$31150b2o$31150bobo$ 31152bo$31152b2o2$30509b2o$30509b2o456bo$30489bo475b3o$30477bo11b3o 472bo$30475b3o14bo471b2o182b2o$30459bo14bo16b2o655bobo$30459b3o12b2o 674bo$30462bo687b2o$30461b2o2$30971b2o$30462b2o507b2o$29844b2o616b2o 17b2o649b2o$29822b2o20b2o635b2o648bobo$29823bo1307bo$29812bo10bobo693b 2o609b2o$29810b3o11b2o693b2o$29794bo14bo$29794b3o12b2o$29797bo680b2o$ 29796b2o680bo19b2o$30479b3o15bobo$30481bo15bo642b2o$29797b2o676b2o19b 2o642b2o$29797b2o17b2o657bo479b2o$29816b2o658b3o476b2o190bo$30478bo 668b3o$29854b2o1294bo$29854b2o1293b2o$31129b2o$31130bo$29813b2o1315bob o$29813bo19b2o649b2o645b2o$29814b3o15bobo649bo588bo$29816bo15bo632b2o 15bobo586b3o$29810b2o19b2o632b2o15b2o586bo74b2o$29810bo642b2o615b2o73b obo$28619b2o1190b3o638bobo600b2o90bo$28620bo1192bo638bo603bo90b2o$ 28620bobo1828b2o603bobo$28621b2o2b2o37bo2392b2o10bo$28625b2o35b3o15bo 9bo2377bobo$28661bo18b3o5b3o2377bobo$28648b2o11b2o20bo3bo2381bo4b2o$ 28648b2o32b2o3b2o1130b2o1236b2o15bobo$29819bo1133b2o101bobo17bo65b2o$ 29800b2o15bobo1133b2o101bo19b2o64bo$29800b2o15b2o645b2o589b2o86b3o$ 30463bobo481bo197bo$30463bo481b3o132b2o$30462b2o480bo135bo$30944b2o 132bobo$28619b2o52b2o2289b2o112b2o46b2o$28618bobo16b2o34b2o2289bo101b 2o57bobo$28618bo18bobo45b2o2275bobo101b2o57bo$28617b2o20bo44bo2bo2274b 2o160b2o$28633b2o4b2o44b2o4b2o$28633bobo55bobo$28635bo57bo2254b2o$ 28626b2o7b2o56b2o1104b2o673b2o471bobo471b2o$28626b2o20b2o33b2o1113bobo 673b2o471bo473b2o$28649bo34bo1113bo1147b2o$28646b3o32b3o1113b2o1335b2o $28646bo34bo2372b2o78b2o$31055bo$28615bo2439bobo83bo$28615b3o1845b2o 591b2o83b3o$28618bo1845bo19b2o658bo$28617b2o1845bobo17bo466b2o190b2o$ 30465b2o15bobo467bo170b2o$28681b2o1794bo4b2o465b3o172bo$28681bo1127b2o 665bobo470bo174bobo$28682b3o1124b2o665bobo646b2o$28684bo1780b2o10bo$ 28637bo1826bobo$28635b3o1826bo674b2o$28634bo1828b2o674bobo$28634b2o 1842b2o462b2o197bo$29798b2o678bo464bo113b2o15b2o65b2o$29799bo19b2o6b2o 650b3o461bobo15b2o94b2o15bobo$29799bobo17bo7bobo651bo462b2o15b2o86b2o 25bo$29800b2o15bobo9bo1220bo25b2o$29812bo4b2o10b2o1219bobo$29811bobo 1237b2o$29811bobo$29800b2o10bo1323b2o$29799bobo1334bo$28614b2o1183bo 1270bo66b3o$28614b2o1182b2o1268b3o68bo$29813b2o225bobo1024bo$29813bo 226b2o1025b2o20bo$29814b3o205bo18bo1031bo15b3o$29816bo193bo11b3o937b2o 107b3o18bo$30008b3o14bo13bo9b2o911bobo105bo20b2o11b2o$29992bo14bo16b2o 12bo10bo914bo105b2o32b2o$29992b3o12b2o29b3o6bobo914b2o$29995bo47b2o2b 2o$28629b2o1363b2o47b2o$28629b2o$30037b2o$29995b2o40b2o907b2o125b2o37b 2o21b2o$29995b2o17b2o929bobo106b2o17b2o36bobo21b2o$30014b2o929bo108b2o 55bo17b2o$30944b2o60bo103b2o17b2o$31004b3o$31003bo49b2o416b2o$31003b2o 49bo76b2o338b2o$30974bo34bo41b3o12b2o56b2o5b2o$30011b2o36b2o923b3o32b 3o39bo14bo16b2o39b2o226bo$30011bo19b2o16bobo925bo34bo54b3o14bo267b3o$ 30012b3o15bobo18bo902b2o20b2o33b2o56bo11b3o20b2o249bo23b2o$30014bo15bo 20b2o901b2o7b2o56b2o58bo22bo249b2o23bo$30008b2o19b2o4b2o926bo57bo83b3o 269bobo$30008bo25bobo924bobo55bobo85bo227bo37b2o2b2o$30009b3o22bo926b 2o4b2o44b2o4b2o288bo9bo15b3o35b2o$30011bo21b2o7b2o901b2o20bo44bo2bo 293b3o5b3o18bo$30042b2o902bo18bobo45b2o94bo202bo3bo20b2o11b2o$30946bob o16b2o34b2o106b3o199b2o3b2o32b2o$30947b2o52b2o109bo23b2o$29992b2o1117b 2o23bo$29991bobo23bo1116bobo$29991bo23b3o1074bo37b2o2b2o$29844b2o144b 2o22bo63bo987bo9bo15b3o35b2o$29822b2o20b2o152b2o14b2o36b2o22b3o987b3o 5b3o18bo$29823bo174b2o52bo22bo993bo3bo20b2o11b2o$29812bo10bobo224bobo 22b2o991b2o3b2o32b2o216b2o52b2o$29810b3o11b2o224b2o11bo912b2o32b2o3b2o 308b2o34b2o16bobo$29794bo14bo253b3o910b2o11b2o20bo3bo297b2o45bobo18bo$ 29794b3o12b2o255bo922bo18b3o5b3o293bo2bo44bo20b2o$29797bo267b2o886b2o 35b3o15bo9bo288b2o4b2o44b2o4b2o$29796b2o1151b2o2b2o37bo313bobo55bobo$ 30948bobo355bo57bo$30079b2o11bo855bo23b2o331b2o56b2o7b2o$29797b2o253b 2o25b2o11b3o852b2o23bo109b2o52b2o177b2o33b2o20b2o$29797b2o17b2o235bo 41bo23b2o852b3o106b2o34b2o16bobo176bo34bo$29816b2o235bobo38b2o23bo855b o94b2o45bobo18bo177b3o32b3o$29997b2o55b2o61bobo949bo2bo44bo20b2o178bo 34bo$29854b2o140bobo114b2o2b2o945b2o4b2o44b2o4b2o199b2o$29854b2o140bo 116b2o948bobo55bobo200bo$29995b2o1066bo57bo199b3o$31062b2o56b2o7b2o 190bo60b2o$29813b2o215b2o1040b2o33b2o20b2o251bo$29813bo19b2o195b2o52b 2o959b2o25bo34bo272bobo$29814b3o15bobo221b2o26b2o959b2o26b3o32b3o269b 2o$29816bo15bo223b2o1017bo34bo$29810b2o19b2o1247b2o$29810bo177b2o45b2o 1044bo$28619b2o1190b3o175bo45b2o1041b3o$28620bo1192bo175bobo15b2o22b2o 1001b2o42bo60b2o221b2o$28620bobo1367b2o15b2o22b2o48b2o36b2o914bo103bo 223bo$28621b2o2b2o37bo1416bo19b2o16bobo913bobo99bobo223bobo$28625b2o 35b3o15bo9bo1391bo17bobo18bo914b2o99b2o225b2o$28661bo18b3o5b3o1346b2o 42b2o17bo20b2o998bo$28648b2o11b2o20bo3bo1349b2o60b2o4b2o1014b3o$28648b 2o32b2o3b2o1130b2o283bobo942b2o73bo$29819bo284bo944bobo71b2o$29800b2o 15bobo283b2o7b2o937bo87b2o$29800b2o15b2o293b2o937b2o86bo$31137bobo11b 2o$31137b2o12bo$31149bobo97bo$30008b2o1135b2o2b2o96b3o$28619b2o52b2o 1333bobo1134b2o99bo$28618bobo16b2o34b2o1335bo1036b2o197b2o117b2o15b2o$ 28618bo18bobo45b2o1323b2o110b2o923bobo129b2o53bo130b2o15bobo$28617b2o 20bo44bo2bo1434bo926bo129b2o53b3o147bo$28633b2o4b2o44b2o4b2o1427bobo 926b2o93b2o91bo146b2o$28633bobo55bobo1426b2o1022b2o4b2o84b2o$28635bo 57bo2456b2o25b2o$28626b2o7b2o56b2o1104b2o1376b2o110b2o$28626b2o20b2o 33b2o1113bobo1363b2o84b2o11bo25bo$28649bo34bo1113bo218b2o1012b2o132bo 57b2o25b2o11b3o21bobo$28646b3o32b3o1113b2o218bo84b2o50b2o874bobo132bob o56bo41bo20b2o$28646bo34bo1316b2o15bobo85bo49bo2bo873bo135b2o56bobo38b 2o39b2o49b2o$29998b2o15b2o86bobo48b2o873b2o131b2o61b2o79b2o5b2o43bo$ 28615bo1488b2o1056b2o149b2o30b2o11bobo$28615b3o2538b2o188bo12b2o$ 28618bo2537bo189bobo$28617b2o2535bobo135b2o17b2o34b2o2b2o$31154b2o137b o17b2o38b2o$28681b2o2572b2o36bobo21b2o$28681bo1127b2o961b2o265b2o186b 2o26b2o37b2o21b2o$28682b3o1124b2o961b2o265b2o134b2o50b2o$28684bo2108bo 381b2o29b2o144b2o$28637bo2153b3o11bo240bo159b2o138b2o4b2o$28635b3o 2152bo14b3o238b3o297b2o$28634bo1362b2o791b2o16bo14bo225bo$28634b2o 1360bobo106b2o700b2o12b3o224b2o145bo56b2o32b2o$29798b2o196bo108b2o14b 2o697bo207b2o164bobo55bo20b2o11b2o$29799bo19b2o6b2o166b2o100b2o22bo 698b2o207bo164b2o54bobo21bo$29799bobo17bo7bobo268bo23b3o65b2o837bobo 171b2o45b2o19b3o44bo$29800b2o15bobo9bo268bobo23bo66bo838b2o104b2o15b2o 48bo67bo44b3o28b2o$29812bo4b2o10b2o268b2o90bobo625b2o151bo162bobo15b2o 46bobo111bo30bobo$29811bobo378b2o16bo589b2o17b2o149b3o162bo65b2o87b2o 23b2o29bo$29811bobo199b2o193b3o589b2o167bo74b2o88b2o32b2o121bo53b2o$ 29800b2o10bo200bobo191bo761b2o73bobo121b2o118b3o$29799bobo213bo191b2o 553b2o190b2o90bo241bo$28614b2o1183bo154bo60b2o100b2o643b2o191bo90b2o 96bo$28614b2o1182b2o154b3o160bo837bobo186b3o$29813b2o142bo157bobo838b 2o10bo178bo$29813bo142b2o157b2o40b2o644b2o162bobo176b2o$29814b3o134bo 34bo161b2o7b2o624b2o19bo162bobo$29816bo132b3o32b3o162bo633bobo15b3o 164bo4b2o$29948bo34bo165bobo633bo15bo154b2o15bobo308bo$29948b2o33b2o 20b2o137b2o4b2o633b2o19b2o147bobo17bo65b2o241b3o35b2o$29938b2o56b2o7b 2o117b2o19bo20b2o639bo147bo19b2o64bo245bo34b2o$29939bo57bo121b2o3bobo 18bobo18bo22b2o613b3o147b2o86b3o232b2o7b2o$28629b2o1308bobo55bobo119bo 6bo19b2o16bobo22b2o613bo239bo233bo$28629b2o1309b2o4b2o44b2o4b2o117bobo 6b2o36b2o813b2o297bobo$29945bo2bo44bo20b2o101b2o860bo299b2o36b2o$ 29946b2o45bobo18bo962bobo198bo138b2o$29958b2o34b2o16bobo962b2o46b2o 112b2o35b3o142b2o$29958b2o52b2o28b2o60b2o859b2o57bobo112b2o34bo145b2o$ 30043bo59bobo71b2o618b2o166b2o57bo150b2o42b2o$30043bobo57bo25b2o46b2o 140bo478bo224b2o194bo$30044b2o56b2o25b2o68b2o118b3o476bobo15b2o399bobo 95b2o$30199bo122bo476b2o15b2o326b2o67b2o2b2o56bo23b2o14b2o$30200b3o 100bo17b2o821b2o67b2o59bobo22bo$30202bo88bo11b3o834b2o133bo14b2o8b3o$ 30107b2o49b2o129b3o14bo833b2o148bo11bo$29944b2o3b2o32b2o123bo49b2o2b2o 109bo14bo16b2o984b3o$29945bo3bo20b2o11b2o58b2o60b3o14b2o38bobo108b3o 12b2o743b2o149b2o107bo$29942b3o5b3o18bo71b2o4b2o54bo16bo16b2o23bo111bo 676b2o78b2o111b2o36b2o$29942bo9bo15b3o35b2o41b2o65bo6b3o14bo23b2o109b 2o677bo191b2o13b2o114b2o$29915bo12bo39bo37b2o2b2o103bobo7bo11b3o44b2o 6b2o760bobo83bo119bobo113bobo$29915b3o8b3o81bobo103bo20bo47bo6bo762b2o 83b3o117bo115bo16b2o$29918bo6bo86bo169b3o8b3o80b2o765bo115b2o10b2o102b 2o17bo$29917b2o6b2o85b2o34b2o132bo12bo80b2o17b2o745b2o128bo118b3o$ 30044b2o2b2o245b2o520b2o203b2o145b3o9b2o36b2o70bo$30043bobo771bobo203b o145bo11bo19b2o16bobo$30043bo12b2o275b2o484bo203bobo153bobo18bobo18bo 62b2o$30042b2o11bobo275b2o484b2o203b2o153b2o19bo20b2o61b2o$29844b2o 209bo1143b2o4b2o$29822b2o20b2o89bo118b2o1148bobo$29823bo109b3o356b2o 744b2o164bo$29812bo10bobo106bo359bo19b2o724bobo162b2o7b2o$29810b3o11b 2o106b2o359b3o15bobo726bo171b2o$29794bo14bo100b2o383bo15bo644b2o15b2o 65b2o$29794b3o12b2o99b2o144b2o231b2o19b2o644b2o15bobo298b2o$29797bo 257bobo231bo658b2o25bo299bo$29796b2o257bo234b3o514b2o140bo25b2o298bobo $30054b2o236bo514b2o140bobo324b2o$30795b2o153b2o$29797b2o995bobo425b2o $29797b2o17b2o104b2o870bo240b2o185bo$29816b2o104b2o869b2o240bo184bobo$ 30969bo66b3o181b2o52b2o$29854b2o442b2o518b2o147b3o68bo236bo$29854b2o 208b2o232bo498b2o19bo147bo295b2o11bobo$30064b2o213b2o15bobo499bo17bobo 147b2o20bo274bo12b2o$30279b2o15b2o500bobo15b2o154bo15b3o272bobo$29813b 2o256bo195b2o530b2o4bo164b3o18bo210b2o60b2o2b2o$29813bo19b2o236b3o192b obo535bobo162bo20b2o11b2o198bo64b2o$29814b3o15bobo239bo191bo537bobo 162b2o32b2o198bobo$29816bo15bo240b2o190b2o538bo10b2o386b2o$29810b2o19b 2o107b2o15bo95b2o104bo9bo646bobo$29810bo129bo16bobo94bo104b3o5b3o27bo 620bo450b2o$28619b2o1190b3o61b2o64b3o13b2o95bobo92b2o11bo3bo30b3o618b 2o443b2o4b2o$28620bo1192bo62bo48b2o16bo111b2o91bobo10b2o3b2o32bo14bo 587b2o458b2o$28620bobo1253bobo45bobo202bo2bo15bo50b2o12b3o588bo167b2o 37b2o21b2o$28621b2o2b2o37bo1212b2o2b2o37bo3bo201bo8bo11b2o63bo588b3o 149b2o17b2o36bobo21b2o$28625b2o35b3o15bo9bo1190b2o35b3o2b2o11bo9bo122b 2o53bo12bo74b2o587bo151b2o55bo17b2o$28661bo18b3o5b3o1226bo18b3o5b3o 122bobo206b2o729b2o17b2o$28648b2o11b2o20bo3bo1216b2o11b2o20bo3bo127bo 50bo16bo137bobo$28648b2o32b2o3b2o1130b2o83b2o32b2o3b2o126b2o53b2o4b2o 77b2o64bo674b2o310b2o$29819bo301bo4b2o4bo7bo51b2o17b2o63b2o675bo76b2o 231bobo$29800b2o15bobo313b3o8b2o46b2o756b3o12b2o56b2o5b2o173b2o15b2o 39bo$29800b2o15b2o295b2o5bo13bo4bo3b2o804bo14bo16b2o39b2o180b2o15bobo 37b2o$30115bo850b3o14bo213b2o25bo$30112b3o7bo16bo828bo11b3o20b2o193bo 25b2o$30112bo867bo22bo194bobo$30015bo20bo29b2o56bo12bo866b3o192b2o$ 28619b2o52b2o1200b2o52b2o83bobo7bo11b3o27bo59bo8bo59b2o809bo$28618bobo 16b2o34b2o1199bobo16b2o34b2o84bo6b3o14bo27b3o59bo2bo42b2o19bo$28618bo 18bobo45b2o1187bo18bobo45b2o61bo16bo16b2o29bo85bo6b2o11bobo15b3o92b2o$ 28617b2o20bo44bo2bo1185b2o20bo44bo2bo60b3o14b2o130b3o6b2o13bo15bo94b2o 928bo$28633b2o4b2o44b2o4b2o1196b2o4b2o44b2o4b2o58bo144bo24b2o19b2o 1016b3o$28633bobo55bobo1195bobo55bobo56b2o144b2o45bo1015bo$28635bo57bo 1197bo57bo246b3o1016b2o$28626b2o7b2o56b2o1104b2o81b2o7b2o56b2o245bo$ 28626b2o20b2o33b2o1113bobo81b2o20b2o33b2o$28649bo34bo1113bo106bo34bo 60b2o25b2o247b2o107bo560bo$28646b3o32b3o1113b2o103b3o32b3o62bo25b2o 248bo19b2o86b3o558b3o$28646bo34bo1220bo34bo64bobo209b2o62bobo17bo90bo 560bo23b2o$29931b2o70b2o185bo23bobo62b2o15bobo71bo17b2o559b2o23bo$ 28615bo1315bo258b3o23bo74bo4b2o60bo11b3o599bobo245b2o$28615b3o1314b3o 107b2o21b2o126bo22b2o72bobo63b3o14bo556bo37b2o2b2o246bo$28618bo1253b2o 60bo81b2o23bobo21b2o125b2o14b2o80bobo47bo14bo16b2o530bo9bo15b3o35b2o 248bobo$28617b2o1254bo142bobo6b2o14bo17b2o147b2o69b2o10bo48b3o12b2o 547b3o5b3o18bo284b2o$29873bobo142bo6bo14b2o17b2o217bobo62bo563bo3bo20b 2o11b2o224b2o$28681b2o1191b2o142b2o3bobo252bo63b2o562b2o3b2o32b2o224b 2o5b2o$28681bo1127b2o212b2o252b2o899b2o24b2o$28682b3o1124b2o250b2o229b 2o909bobo$28684bo1369b2o5b2o229bo50b2o858bo$28637bo1255bo160b2o237b3o 47b2o17b2o783b2o8b2o17b2o24b2o$28635b3o1253b3o401bo66b2o783b2o9bo17b2o 44b2o$28634bo1255bo123b2o1142bobo21b2o39bo$28634b2o1254b2o122bobo383b 2o757b2o21b2o36b3o$29798b2o216bo383b2o518b2o52b2o165b2o77bo$29799bo19b 2o6b2o187b2o902b2o34b2o16bobo164b2o$29799bobo17bo7bobo379b2o697b2o45bo bo18bo168b2o66b2o$29800b2o15bobo9bo379bobo147b2o546bo2bo44bo20b2o167b 2o66b2o$29812bo4b2o10b2o380bo147bo19b2o521b2o4b2o44b2o4b2o$29811bobo 397b2o147b3o15bobo520bobo55bobo$29811bobo184b2o362bo15bo522bo57bo$ 29800b2o10bo184bobo356b2o19b2o521b2o56b2o7b2o171b2o$29799bobo195bo358b o553b2o33b2o20b2o171b2o$28614b2o1183bo70b2o124b2o359b3o550bo34bo$ 28614b2o1182b2o70b2o232bo254bo551b3o32b3o254b2o$29813b2o289b3o806bo34b o255bo$29813bo293bo14bo795b2o265b2o17bobo$29814b3o289b2o12b3o796bo265b o19b2o$29816bo208b2o39bo52bo79b2o715b3o264bobo$30026bo25bo13b3o50b2o 78b2o715bo60b2o204b2o$30006b2o18bobo21b3o16bo295b2o610bo$30006b2o7b2o 10b2o20bo18b2o295bo609bobo246bo$30015bo33b2o67b2o88b2o136b2o15bobo609b 2o245b3o$28629b2o1254b2o126bobo83b2o17b2o88b2o136b2o15b2o594bo187b2o 72bo$28629b2o1254b2o126b2o4b2o78b2o233b2o623b3o186bo72b2o$29997b2o20bo 313bobo626bo182b3o$29998bo18bobo313bo627b2o182bo$29998bobo16b2o313b2o 643b2o181b2o$29999b2o206b2o17bo9bo740bo182bobo$30059b2o146bo18b3o5b3o 27bo710bobo11b2o171bo$30059b2o41b2o99b2o3b3o5b2o11bo3bo30b3o708b2o12bo 172b2o$30082b2o19bo99bobo4bo4bobo10b2o3b2o32bo14bo704bobo192b2o$30082b obo15b3o102bo9bo50b2o12b3o700b2o2b2o177b2o14b2o$30084bo15bo73b2o29b2o 7b2o63bo703b2o182bo22b2o$30072b2o10b2o19b2o66bobo103b2o883b3o23bo10b2o $30072bo33bo66bo4b2o165b2o670b2o145bo23bobo10b2o$30028b2o32b2o9b3o27b 3o66b2o5bo164bobo670b2o169b2o$30028b2o11b2o20bo11bo27bo72b3o99b2o64bo 637b2o168b2o$30041bo21bobo110bo82b2o17b2o63b2o637b2o4b2o162b2o$30005b 2o35b3o19b2o145b2o46b2o727b2o25b2o$30001b2o2b2o37bo136b2o28b2o802b2o 129bo$30000bobo179bo819b2o140b3o23b2o$30000bo23b2o153b3o821bo139bo17b 2o8bo$29999b2o23bo71b2o81bo823bobo72b2o48b2o13b2o16bo9bobo$30025b3o69b o906b2o46bo25bo23bo25bo30bobo10b2o42b2o$30027bo69bobo15b2o145b2o736b2o 50b3o21bobo23b3o21bobo30b2o55b2o$30098b2o15b2o125b2o19bo736b2o53bo20b 2o27bo20b2o$30222bo6b2o11bobo15b3o92b2o637b2o58b2o48b2o38bo$29844b2o 374b3o6b2o13bo15bo94b2o637bo149b3o$29822b2o20b2o373bo24b2o19b2o725bobo 90bo49bo11bo$29823bo395b2o45bo725b2o91b3o47b3o8b2o14bo$29812bo10bobo 437b3o822bo49bo22bobo$29810b3o11b2o437bo823b2o11b2o35b2o23bo$28639b2o 1153bo14bo1203b2o85b2o$28640bo1153b3o12b2o533b2o667b2o29b2o$28640bobo 1154bo547bo19b2o90b2o585b2o$28641b2o2b2o37bo1111b2o483b2o62bobo17bo91b 2o714b2o$28645b2o35b3o15bo9bo1546bo23bobo62b2o15bobo71bo735b2o14b2o$ 28681bo18b3o5b3o1405b2o139b3o23bo74bo4b2o60bo11b3o593bo131b2o22bo$ 28668b2o11b2o20bo3bo1089b2o317bobo141bo22b2o72bobo63b3o14bo591bobo122b 2o7bo23b3o$28668b2o32b2o3b2o1088b2o17b2o300bo140b2o14b2o80bobo47bo14bo 16b2o476b2o113b2o123bobo6bobo23bo$29816b2o300b2o155b2o69b2o10bo48b3o 12b2o493b2o122b2o32b2o48b2o32bo7b2o$30345bobo62bo563b2o15b2o48bo20b2o 11b2o35b2o11b2o23b2o7b2o$29854b2o489bo63b2o562bobo15b2o46bobo21bo49bo 36bo$29854b2o488b2o627bo65b2o19b3o47b3o38b3o$30359b2o611b2o32b2o52bo 49bo42bo$30359bo50b2o494b2o98b2o157b2o$29813b2o545b3o47b2o17b2o476bo 171b2o48b2o35bo$28639b2o52b2o1118bo19b2o290b2o235bo66b2o476bobo72bo97b o20b2o27bo22b2o11bobo$28638bobo16b2o34b2o1119b3o15bobo290bo782b2o72b3o 92b3o21bobo23b3o24bo12b2o$28638bo18bobo45b2o1109bo15bo273b2o15bobo341b 2o516bo91bo25bo23bo26bobo$28637b2o20bo44bo2bo1102b2o19b2o273b2o15b2o 342b2o515b2o117b2o50b2o2b2o$28653b2o4b2o44b2o4b2o1097bo1110b2o236b2o$ 28653bobo55bobo1097b3o462b2o643bobo$28655bo57bo1099bo462bobo147b2o495b o$28646b2o7b2o56b2o1563bo147bo19b2o475b2o$28646b2o20b2o33b2o1573b2o 147b3o15bobo712b2o$28669bo34bo1724bo15bo708b2o4b2o$28666b3o32b3o1719b 2o19b2o708b2o$28666bo34bo1721bo$29819b2o603b3o$28635bo1183bo606bo492b 2o95bo$28635b3o1162b2o15bobo1099bobo55b2o35b3o$28638bo1161b2o15b2o286b 2o814bo55b2o34bo$28637b2o1465bobo814b2o90b2o42b2o96b2o$30104bo161b2o 789bo96bobo$28701b2o1400b2o161b2o787bobo96bo$28701bo1730b2o548b2o67b2o 2b2o96b2o$28702b3o1727bo549b2o67b2o$28704bo1570b2o136b2o15bobo470b2o 73b2o$28657bo1617b2o136b2o15b2o470bobo73b2o$28655b3o1463b2o278b2o499bo $28654bo1466bobo276bobo498b2o119b2o$28654b2o1467bo276bo583b2o36b2o$ 30062bo60b2o274b2o190b2o391b2o13b2o$29799b2o261b3o209b2o17bo9bo273b2o 12b2o405bobo$29798bobo264bo208bo18b3o5b3o27bo246bo419bo$29798bo265b2o 204b2o3b3o5b2o11bo3bo30b3o244bobo416b2o10b2o$29797b2o260bo34bo175bobo 4bo4bobo10b2o3b2o32bo14bo214b2o13b2o429bo$30057b3o32b3o177bo9bo50b2o 12b3o214b2o345b2o94b3o9b2o36b2o$30056bo34bo149b2o29b2o7b2o63bo564b2o 94bo11bo19b2o16bobo$30056b2o33b2o20b2o125bobo103b2o669bobo18bobo18bo$ 30046b2o56b2o7b2o125bo4b2o165b2o144b2o358bo98b2o19bo20b2o$28634b2o 1411bo57bo133b2o5bo164bobo144b2o37b2o319b3o116b2o4b2o$28634b2o1361bo 49bobo55bobo135b3o99b2o64bo150b2o33b2o322bo120bobo$29997b3o48b2o4b2o 44b2o4b2o135bo82b2o17b2o63b2o150b2o356b2o120bo$30000bo23b2o27bo2bo44bo 20b2o154b2o46b2o572b2o139b2o7b2o$29809b2o188b2o23bo29b2o45bobo18bo125b 2o28b2o621bo148b2o$29809b2o211bobo41b2o34b2o16bobo126bo651bobo$29980bo 37b2o2b2o42b2o52b2o124b3o308b2o343b2o$29954bo9bo15b3o35b2o226bo310b2o 38bo246bo$29954b3o5b3o18bo612bobo243b3o$29957bo3bo20b2o11b2o332b2o266b o243bo74b2o$28649b2o38b2o1265b2o3b2o32b2o312b2o19bo510b2o73bobo$28649b 2o39bo1107b2o489bo6b2o11bobo15b3o92b2o402b2o90bo141b2o$28690bobo1106bo 19b2o6b2o458b3o6b2o13bo15bo94b2o403bo90b2o140bo$28691b2o2b2o37bo1064bo bo17bo7bobo456bo24b2o19b2o253b2o238bobo228bobo$28695b2o35b3o15bo9bo 1039b2o15bobo9bo222b2o3b2o32b2o193b2o45bo252bobo239b2o10bo217b2o$ 28731bo18b3o5b3o1051bo4b2o10b2o222bo3bo20b2o11b2o237b3o253bo252bobo$ 28718b2o11b2o20bo3bo1053bobo236b3o5b3o18bo250bo254b2o252bobo$28718b2o 32b2o3b2o1052bobo236bo9bo15b3o35b2o724bo4b2o$29800b2o10bo157b2o52b2o 50bo37b2o2b2o291b2o107bo43b2o262b2o15bobo$29799bobo168b2o34b2o16bobo 91bobo291bo19b2o86b3o42bo261bobo17bo65b2o125b2o$29799bo158b2o45bobo18b o68b2o23bo227b2o62bobo17bo90bo38b3o262bo19b2o64bo127bo$29798b2o157bo2b o44bo20b2o68bo23b2o202bo23bobo62b2o15bobo71bo17b2o38bo263b2o86b3o124bo bo$29813b2o137b2o4b2o44b2o4b2o81b3o228b3o23bo74bo4b2o60bo11b3o70b2o 337bo125b2o$29813bo137bobo55bobo81bo233bo22b2o72bobo63b3o14bo69bobo 271b2o$29814b3o134bo57bo316b2o14b2o80bobo47bo14bo16b2o71bo271bo$28689b 2o52b2o1071bo133b2o56b2o7b2o323b2o69b2o10bo48b3o12b2o88b2o268bobo$ 28688bobo16b2o34b2o1215b2o33b2o20b2o393bobo62bo371b2o46b2o$28688bo18bo bo45b2o1203bo34bo416bo63b2o359b2o57bobo$28687b2o20bo44bo2bo1203b3o32b 3o412b2o424b2o57bo$28703b2o4b2o44b2o4b2o1200bo34bo427b2o467b2o$28703bo bo55bobo15b2o108b2o108b2o108b2o108b2o108b2o108b2o108b2o108b2o765bo50b 2o$28705bo57bo16bo109bo109bo109bo109bo109bo109bo109bo109bo766b3o47b2o 17b2o$28696b2o7b2o56b2o15bobo107bobo107bobo107bobo107bobo107bobo107bob o107bobo107bobo766bo66b2o71b2o$28696b2o20b2o33b2o26b2o2b2o37bo66b2o2b 2o37bo66b2o2b2o37bo66b2o2b2o37bo66b2o2b2o37bo66b2o2b2o37bo66b2o2b2o37b o66b2o2b2o37bo66b2o2b2o37bo864b2o$28719bo34bo30b2o35b3o15bo9bo44b2o35b 3o15bo9bo44b2o35b3o15bo9bo44b2o35b3o15bo9bo44b2o35b3o15bo9bo44b2o35b3o 15bo9bo44b2o35b3o15bo9bo44b2o35b3o15bo9bo44b2o35b3o15bo9bo803b2o507b2o 15b2o$28716b3o32b3o67bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b 3o80bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b3o80bo18b3o5b3o 803b2o27bo479b2o15bobo$28716bo34bo56b2o11b2o20bo3bo70b2o11b2o20bo3bo 70b2o11b2o20bo3bo70b2o11b2o20bo3bo70b2o11b2o20bo3bo70b2o11b2o20bo3bo 70b2o11b2o20bo3bo70b2o11b2o20bo3bo70b2o11b2o20bo3bo833b3o341b2o128b2o 25bo$28808b2o32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o69b2o 32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o69b2o32b2o3b2o614b 2o215bo264b2o78b2o129bo25b2o$28685bo1657bobo147b2o65b2o264bo209bobo$ 28685b3o1657bo147bo19b2o65b2o244bobo83bo124b2o$28688bo1318bo337b2o147b 3o15bobo65bo246b2o83b3o$28687b2o1318b3o486bo15bo65bobo334bo90b2o$ 30010bo479b2o19b2o65b2o334b2o64bo25bo$28751b2o1256b2o479bo403b2o72bo 11b3o21bobo49bo$28751bo1739b3o401bo70b3o14bo20b2o48b3o$28752b3o24b2o 52b2o54b2o52b2o54b2o52b2o54b2o52b2o54b2o52b2o54b2o52b2o54b2o52b2o54b2o 52b2o54b2o52b2o778bo70b2o329bobo52bo14bo16b2o39b2o28bo$28754bo23bobo 16b2o34b2o53bobo16b2o34b2o53bobo16b2o34b2o53bobo16b2o34b2o53bobo16b2o 34b2o53bobo16b2o34b2o53bobo16b2o34b2o53bobo16b2o34b2o53bobo16b2o34b2o 848bobo330b2o52b3o12b2o56b2o5b2o21b2o$28707bo70bo18bobo45b2o41bo18bobo 45b2o41bo18bobo45b2o41bo18bobo45b2o41bo18bobo45b2o41bo18bobo45b2o41bo 18bobo45b2o41bo18bobo45b2o41bo18bobo45b2o836bo389bo76b2o$28705b3o69b2o 20bo44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2bo39b2o20bo 44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2bo39b2o20bo44bo2b o834b2o388b2o$28704bo88b2o4b2o44b2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o44b 2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o 44b2o4b2o50b2o4b2o44b2o4b2o50b2o4b2o44b2o4b2o600b2o575b2o$28704b2o87bo bo55bobo49bobo55bobo49bobo55bobo49bobo55bobo49bobo55bobo49bobo55bobo 49bobo55bobo49bobo55bobo49bobo55bobo599b2o575bobo96b2o17b2o$28795bo57b o51bo57bo51bo57bo51bo57bo51bo57bo51bo57bo51bo57bo51bo57bo51bo57bo765b 2o411bo40b2o55bo17b2o$28786b2o7b2o56b2o41b2o7b2o56b2o41b2o7b2o56b2o41b 2o7b2o56b2o41b2o7b2o56b2o41b2o7b2o56b2o41b2o7b2o56b2o41b2o7b2o56b2o41b 2o7b2o56b2o764bo328b2o15b2o65b2o39b2o17b2o36bobo21b2o$28786b2o20b2o33b 2o51b2o20b2o33b2o51b2o20b2o33b2o51b2o20b2o33b2o51b2o20b2o33b2o51b2o20b 2o33b2o51b2o20b2o33b2o51b2o20b2o33b2o51b2o20b2o33b2o304b2o311b2o136b2o 15bobo328b2o15bobo124b2o37b2o21b2o22b2o$28809bo34bo74bo34bo74bo34bo74b o34bo74bo34bo74bo34bo74bo34bo74bo34bo74bo34bo304b2o311b2o136b2o15b2o 321b2o25bo210bo$28806b3o32b3o72b3o32b3o72b3o32b3o72b3o32b3o72b3o32b3o 72b3o32b3o72b3o32b3o72b3o32b3o72b3o32b3o744b2o97b2o252bo25b2o207bobo$ 28806bo34bo74bo34bo74bo34bo74bo34bo74bo34bo74bo34bo74bo34bo74bo34bo74b o34bo745bobo98bo252bobo232b2o$30467bo97b3o254b2o$28775bo109bo109bo109b o109bo109bo109bo109bo109bo810b2o97bo$28775b3o107b3o107b3o107b3o107b3o 107b3o107b3o107b3o107b3o683b2o17bo9bo536b2o60b2o32b2o37b2o$28684b2o92b o109bo109bo109bo109bo109bo109bo109bo109bo682bo18b3o5b3o27bo508bo61bo 20b2o11b2o36bobo$28684b2o91b2o108b2o108b2o108b2o108b2o108b2o108b2o108b 2o108b2o678b2o3b3o5b2o11bo3bo30b3o440bo66b3o59b3o18bo49bo$30337bobo4bo 4bobo10b2o3b2o32bo14bo422b3o68bo61bo15b3o49b2o$28841b2o108b2o108b2o 108b2o108b2o108b2o108b2o108b2o108b2o291b2o323bo9bo50b2o12b3o421bo127b 2o20bo71b2o$28841bo109bo109bo109bo109bo109bo109bo109bo109bo292b2o292b 2o29b2o7b2o63bo424b2o20bo105bo94bo$28842b3o107b3o107b3o107b3o107b3o 107b3o107b3o107b3o107b3o582bobo103b2o156b2o271bo15b3o104b3o37b2o49b3o$ 28844bo109bo109bo109bo109bo109bo109bo109bo109bo582bo4b2o165b2o90b2o4b 2o263b3o18bo105bo38bo28b2o19bo$28797bo109bo109bo109bo109bo109bo109bo 109bo109bo628b2o5bo164bobo96b2o262bo20b2o11b2o128b3o29bo$28795b3o107b 3o107b3o107b3o107b3o107b3o107b3o107b3o107b3o632b3o99b2o64bo362b2o32b2o 128bo29bobo13b2o$28794bo109bo109bo109bo109bo109bo109bo109bo109bo635bo 82b2o17b2o63b2o556b2o14b2o$28699b2o93b2o108b2o108b2o108b2o108b2o108b2o 108b2o108b2o108b2o669b2o46b2o555b2o$28699b2o1614b2o28b2o229b2o371bobo 23bo$30316bo255b2o2b2o371bo23b3o$30313b3o255bobo374b2o22bo$30313bo257b o12b2o258b2o37b2o21b2o48b2o14b2o$30570b2o11bobo239b2o17b2o36bobo21b2o 48b2o$30396b2o185bo241b2o55bo17b2o139b2o$30376b2o19bo184b2o297b2o17b2o 140bo$30356bo6b2o11bobo15b3o92b2o107b2o442bobo$30354b3o6b2o13bo15bo94b 2o107bo225b2o217b2o$28774b2o108b2o108b2o108b2o108b2o108b2o108b2o108b2o 108b2o697bo24b2o19b2o198b3o223bo76b2o$28774b2o108b2o108b2o108b2o108b2o 108b2o108b2o108b2o108b2o697b2o45bo200bo220b3o12b2o56b2o5b2o130b2o$ 30397b3o184b2o236bo14bo16b2o39b2o121b2o14b2o$30397bo185bobo252b3o14bo 163bo22b2o18bo$30583bo256bo11b3o20b2o139b3o23bo17b3o$30478b2o102b2o60b o207bo22bo140bo23bobo16bo$30479bo19b2o141b3o231b3o161b2o17b2o$30415b2o 62bobo17bo141bo236bo76b2o$30391bo23bobo62b2o15bobo141b2o311bobo$30391b 3o23bo74bo4b2o113bo34bo306bo$28789b2o108b2o108b2o108b2o108b2o108b2o 108b2o108b2o108b2o723bo22b2o72bobo118b3o32b3o303b2o$28789b2o108b2o108b 2o108b2o108b2o108b2o108b2o108b2o108b2o722b2o14b2o80bobo121bo34bo371b2o $30409b2o69b2o10bo99b2o20b2o33b2o372bo$30479bobo110b2o7b2o56b2o362bobo $30479bo121bo57bo364b2o$30478b2o119bobo55bobo311b2o$30493b2o104b2o4b2o 44b2o4b2o312bobo65b2o$30493bo89b2o20bo44bo2bo319bo65b2o$30494b3o87bo 18bobo45b2o320b2o$30496bo87bobo16b2o34b2o$30585b2o52b2o3$30944b2o$ 30410b2o506bo25bo$30410bobo505b3o21bobo18b2o$30412bo508bo20b2o10b2o7b 2o60b2o27b2o$30412b2o506b2o33bo69b2o14b2o11b2o$30614b2o32b2o3b2o12b2o 286bobo59b2o22bo$30614b2o11b2o20bo3bo13b2o232bo48b2o4b2o60bo23b3o$ 30627bo18b3o5b3o223b2o19b3o47bo20b2o44bobo23bo$30591b2o35b3o15bo9bo 223bobo21bo46bobo18bo46b2o$30587b2o2b2o37bo239bo11bo20b2o11b2o34b2o16b obo$30586bobo281b3o9b2o32b2o52b2o$30586bo23b2o44b2o215bo$30585b2o23bo 46bo202b2o10b2o$30400b2o209b3o43bobo201bo155b2o$30400b2o211bo44b2o201b obo154bo$30847b2o13b2o141b2o11bobo$30847b2o36b2o119bo12b2o$30409b2o 260b2o212b2o119bobo$30409b2o260bobo267b2o64b2o2b2o$29623b2o868b2o178bo 167b2o85b2o11b2o68b2o$29623b2o868bo179b2o166b2o86bo$30494b3o348b2o79b 3o35b2o$30496bo348b2o79bo37b2o2b2o$30408b2o17bo9bo530bobo41b2o$30408bo 18b3o5b3o27bo479b2o23bo35b2o4b2o$30404b2o3b3o5b2o11bo3bo30b3o408b2o39b 2o27bo23b2o34b2o$30404bobo4bo4bobo10b2o3b2o32bo14bo185b2o169b2o34bo40b obo23b3o$30406bo9bo50b2o12b3o185bobo168b2o35b3o39bo23bo$30375b2o29b2o 7b2o63bo190bo207bo39b2o$29608b2o764bobo103b2o189b2o$29608b2o764bo4b2o$ 30373b2o5bo626b2o$30377b3o99b2o525bobo$30377bo82b2o17b2o525bo$30412b2o 46b2o191b2o118bo231b2o$30382b2o28b2o238bobo118b3o$30383bo268bo123bo23b 2o$30380b3o268b2o122b2o23bo$30380bo417bobo46b2o$30756bo37b2o2b2o48bo$ 29628b2o833b2o265bo9bo15b3o35b2o49b3o$29628bo814b2o19bo265b3o5b3o18bo 85bo$29629b3o791bo6b2o11bobo15b3o269bo3bo20b2o11b2o160b2o$29631bo789b 3o6b2o13bo15bo270b2o3b2o32b2o96b2o62b2o5b2o$30420bo24b2o19b2o193b2o 172b2o32b2o69b2o$30420b2o45bo193b2o173bo65b2o$30464b3o369bobo15b2o46bo bo$30464bo203bo168b2o15b2o48bo33b2o$30668b3o233b2o32b2o$29611b2o1058bo 223b2o47b2o$29612bo1057b2o223bobo46b2o$29609b3o870b2o166b2o94b2o52b2o 94bo$29609bo848bo23bobo166bo94b2o34b2o16bobo$30458b3o23bo166bobo80b2o 45bobo18bo$29640bo34bo785bo22b2o166b2o79bo2bo44bo20b2o103b2o$29640b3o 32b3o782b2o14b2o116bo133b2o4b2o44b2o4b2o88b2o29b2o$29643bo34bo797b2o 114b3o132bobo55bobo88b2o$29620b2o20b2o33b2o912bo74b2o59bo57bo$29620b2o 7b2o56b2o902b2o73bobo57b2o56b2o7b2o$29629bo57bo888b2o90bo67b2o33b2o20b 2o60b2o$29627bobo55bobo889bo90b2o66bo34bo83bobo$29627b2o4b2o44b2o4b2o 890bobo157b3o32b3o82bo$29611b2o20bo44bo2bo896b2o10bo148bo34bo82b2o58b 2o$29612bo18bobo45b2o908bobo152b2o117b2o53bo$29612bobo16b2o34b2o920bob o153bo117b2o50b3o6b2o$29613b2o52b2o921bo4b2o145b3o122b2o46bo9bo$30578b 2o15bobo144bo60b2o61bobo56bobo$30577bobo17bo65b2o138bo62bo59b2o$30477b 2o98bo19b2o64bo137bobo61b2o68b2o$30477bobo96b2o86b3o134b2o75b2o55b2o$ 30479bo186bo184b2o25b2o$30479b2o120b2o242b2o4b2o$30601bo205b2o36b2o$ 29642b2o32b2o3b2o916bobo204bobo71b2o$29642b2o11b2o20bo3bo917b2o46b2o 134b2o21bo73b2o$29655bo18b3o5b3o902b2o57bobo135bo20b2o111b2o$29619b2o 35b3o15bo9bo902b2o57bo137bobo59b2o71bo$29615b2o2b2o37bo986b2o138b2o59b 2o2b2o67bobo$29614bobo1233bobo67b2o$29614bo1223b2o12bo$29613b2o852b2o 369bobo11b2o$30467b2o371bo$30840b2o$30824b2o$30476b2o177b2o168bo$ 30476b2o97b2o78b2o165b3o$30576bo245bo$30576bobo83bo175b2o76b2o$29647b 2o928b2o83b3o173bobo74bobo$29647bo1017bo120b2o15b2o35bo74bo$29648b3o 824b2o187b2o120b2o15bobo34b2o72b2o$29650bo824bo168b2o159bo118b2o17b2o$ 30471b2o3b3o166bo159b2o117b2o18bo$30471bobo4bo166bobo293b3o$30473bo 172b2o293bo$30442b2o29b2o$30441bobo490b2o$30441bo4b2o212b2o168b2o102b 2o$30399bo40b2o5bo212bobo136bo21b2o7b2o$30397b3o44b3o215bo134b3o22bo$ 30396bo47bo25b2o106b2o15b2o65b2o132bo25bobo$30396b2o53b2o17bobo105b2o 15bobo198b2o19b2o4b2o$30381b2o67bobo19bo97b2o25bo204bo15bo20b2o$30382b o67bo21b2o97bo25b2o201b3o15bobo18bo$30382bobo64b2o120bobo225bo19b2o16b obo84b2o$30383b2o10bo176b2o225b2o36b2o86bo$30394bobo528bobo$30394bobo 260b2o267b2o$30395bo4b2o255bo$30383b2o15bobo188bo66b3o$30382bobo17bo 65b2o119b3o68bo$30382bo19b2o64bo119bo213b2o$30381b2o86b3o116b2o20bo 172b2o17b2o120b2o$30471bo122bo15b3o170b2o140bo$30406b2o184b3o18bo298b 2o11bobo$30406bo184bo20b2o11b2o286bo12b2o$30404bobo184b2o32b2o155b2o 47b2o80bobo$30404b2o46b2o329bo47b2o2b2o77b2o2b2o$30392b2o57bobo326b3o 12b2o38bobo80b2o$30392b2o57bo328bo14bo16b2o23bo$30450b2o344b3o14bo23b 2o$29759bo1038bo11b3o$29759b3o832b2o37b2o21b2o152bo108b2o$29762bo812b 2o17b2o36bobo21b2o255b2o4b2o$29761b2o812b2o55bo17b2o261b2o$29776b2o 853b2o17b2o$29776bo$29774bobo683b2o112b2o$29763bo10b2o604b2o78b2o113bo 76b2o$29762bobo616bo190b3o12b2o56b2o5b2o$29762bobo616bobo83bo104bo14bo 16b2o39b2o267b2o$29757b2o4bo618b2o83b3o118b3o14bo307bobo$29756bobo15b 2o694bo119bo11b3o20b2o286bo$29756bo17bobo692b2o131bo22bo286b2o$29755b 2o19bo672b2o175b3o$29776b2o672bo177bo$30450bobo$30451b2o3$30465b2o$ 29765b2o698bobo$29765b2o700bo$30383b2o15b2o65b2o$30383b2o15bobo$30375b 2o25bo$30376bo25b2o$30376bobo$30377b2o2$30462b2o$29777b2o683bo$29777bo 618bo66b3o$29775bobo616b3o68bo$29775b2o616bo$30393b2o20bo$30399bo15b3o $30397b3o18bo$30396bo20b2o11b2o$30396b2o32b2o6$30399b2o37b2o21b2o$ 29757b2o15b2o604b2o17b2o36bobo21b2o$29756bobo15b2o604b2o55bo17b2o$ 29756bo25b2o652b2o17b2o$29755b2o25bo$29780bobo596b2o$29780b2o598bo76b 2o$30377b3o12b2o56b2o5b2o$30377bo14bo16b2o39b2o$30393b3o14bo$29762bo 632bo11b3o20b2o$29762b3o642bo22bo$29765bo665b3o$29743b2o19b2o667bo$ 29743bo15bo$29741bobo15b3o$29741b2o19bo$29761b2o3$29720b2o$29720b2o2$ 29758b2o$29758b2o17b2o$29777b2o3$29778b2o$29778bo$29765b2o12b3o$29748b 2o16bo14bo$29748bo14b3o$29749b3o11bo$29751bo$29730b2o$29730b2o113$ 29407b2o$29406bobo$29408bo564$28841b3o$28843bo$28842bo563$28276b2o$ 28275bobo$28277bo187$28087b3o$28089bo$28088bo186$27899b2o$27898bobo$ 27900bo752$27145b2o$27144bobo$27146bo375$26768b2o$26767bobo$26769bo 752$26014b2o$26013bobo$26015bo564$25448b3o$25450bo$25449bo375$25071b3o $25073bo$25072bo375$24694b3o$24696bo$24695bo375$24317b3o$24319bo$ 24318bo563$23752b2o$23751bobo$23753bo187$23563b3o$23565bo$23564bo563$ 22998b2o$22997bobo$22999bo187$22809b3o$22811bo$22810bo186$22621b2o$ 22620bobo$22622bo187$22432b3o$22434bo$22433bo186$22244b2o$22243bobo$ 22245bo752$21490b2o$21489bobo$21491bo187$21301b3o$21303bo$21302bo186$ 21113b2o$21112bobo$21114bo752$20359b2o$20358bobo$20360bo187$20170b3o$ 20172bo$20171bo563$19605b2o$19604bobo$19606bo187$19416b3o$19418bo$ 19417bo563$18851b2o$18850bobo$18852bo187$18662b3o$18664bo$18663bo186$ 18474b2o$18473bobo$18475bo187$18285b3o$18287bo$18286bo186$18097b2o$ 18096bobo$18098bo187$17908b3o$17910bo$17909bo752$17154b3o$17156bo$ 17155bo375$16777b3o$16779bo$16778bo375$16400b3o$16402bo$16401bo375$ 16023b3o$16025bo$16024bo375$15646b3o$15648bo$15647bo752$14892b3o$ 14894bo$14893bo186$14704b2o$14703bobo$14705bo187$14515b3o$14517bo$ 14516bo186$14327b2o$14326bobo$14328bo187$14138b3o$14140bo$14139bo186$ 13950b2o$13949bobo$13951bo187$13761b3o$13763bo$13762bo186$13573b2o$ 13572bobo$13574bo187$13384b3o$13386bo$13385bo186$13196b2o$13195bobo$ 13197bo187$13007b3o$13009bo$13008bo186$12819b2o$12818bobo$12820bo187$ 12630b3o$12632bo$12631bo752$11876b3o$11878bo$11877bo186$11688b2o$ 11687bobo$11689bo752$10934b2o$10933bobo$10935bo375$10557b2o$10556bobo$ 10558bo564$9991b3o$9993bo$9992bo186$9803b2o$9802bobo$9804bo187$9614b3o $9616bo$9615bo563$9049b2o$9048bobo$9050bo187$8860b3o$8862bo$8861bo186$ 8672b2o$8671bobo$8673bo187$8483b3o$8485bo$8484bo186$8295b2o$8294bobo$ 8296bo187$8106b3o$8108bo$8107bo186$7918b2o$7917bobo$7919bo187$7729b3o$ 7731bo$7730bo186$7541b2o$7540bobo$7542bo187$7352b3o$7354bo$7353bo752$ 6598b3o$6600bo$6599bo375$6221b3o$6223bo$6222bo375$5844b3o$5846bo$5845b o375$5467b3o$5469bo$5468bo752$4713b3o$4715bo$4714bo375$4336b3o$4338bo$ 4337bo375$3959b3o$3961bo$3960bo375$3582b3o$3584bo$3583bo375$3205b3o$ 3207bo$3206bo375$2828b3o$2830bo$2829bo563$2263b2o$2262bobo$2264bo187$ 2074b3o$2076bo$2075bo186$1886b2o$1885bobo$1887bo187$1697b3o$1699bo$ 1698bo186$1509b2o$1508bobo$1510bo187$1320b3o$1322bo$1321bo186$1132b2o$ 1131bobo$1133bo187$943b3o$945bo$944bo186$755b2o$754bobo$756bo187$566b 3o$568bo$567bo563$b2o$obo$2bo! golly-2.5-src/Patterns/Life/Signal-Circuitry/constructor-memory-tape.rle0000644000175100001440000013236612156145314023423 00000000000000#C Prototype programmable constructor reads a construction #C program from binary bits stored on a diagonal "tape", #C and uses this information to construct an output pattern. #C #C With the right program, and enough empty space available #C around the output pattern, the constructor is capable of #C building (almost) any pattern that can be produced by #C glider collisions -- up to and including a copy of the #C constructor itself, since its five component still lifes #C are all easily glider-constructible. #C #C The program is represented as a string of boats (1s) #C and blocks (0s). Each Emitter cycle, the Emitter in #C the SW fires a salvo to read a program instruction bit #C and move the read head; an Emitter cycle is 850 ticks. #C #C The Collector/Decoder in the centre converts sequences #C of PULL (0) and TRIGGER (1) instructions into TRIGGERi #C instructions, as follows: TRIGGER1=INC, TRIGGER2=DEC, #C TRIGGER3=BLACKDEC, TRIGGER4=WHITEDEC, TRIGGER5=SHUTDOWN #C #C A TRIGGERi instruction takes i Collector cycles to execute; #C a Collector cycle is 754 ticks -- slightly shorter than the #C Emitter cycle because of the Doppler effect of the tape #C being read from the far end. A near-end-first tape read #C would require a Collector cycle longer than the Emitter #C cycle, again proportional to the bit spacing on the tape. #C #C The TRIGGERi instructions cause the Shoulder in the NE #C to emit salvos to manipulate a construction arm in the #C far NE. The arm consists of an Elbow (lower right block) #C and a Hand (upper left block). The Hand is where the #C actual construction is done. #C #C A single glider in the SE starts the constructor. The #C constructor shuts down cleanly when finished; in this #C example, shutdown occurs after 122,221 generations. #C #C Paul Chapman, 24 May 2004 x = 4235, y = 2765, rule = B3/S23 252bo$251bobo$252boo11$264boo$264boo11$276boo$276boo10$288bo$287bobo$ 288boo10$300bo$299bobo$300boo11$312boo$312boo11$324boo$324boo10$336bo$ 335bobo$336boo11$348boo$348boo11$360boo$360boo10$372bo$371bobo$372boo 10$384bo$383bobo$384boo10$396bo$395bobo$396boo11$408boo$408boo11$420b oo$420boo11$432boo$432boo10$444bo$443bobo$444boo11$456boo$456boo10$ 468bo$467bobo$468boo11$480boo$480boo6$oo$oo4$492boo$492boo11$504boo$ 504boo10$516bo$515bobo$516boo10$528bo$527bobo$528boo10$540bo$539bobo$ 540boo10$552bo$551bobo$552boo11$564boo$564boo11$576boo$576boo10$588bo$ 587bobo$588boo11$600boo$600boo10$612bo$611bobo$612boo11$624boo$624boo 10$636bo$635bobo$636boo11$648boo$648boo11$660boo$660boo10$672bo$671bob o$672boo11$684boo$684boo10$696bo$695bobo$696boo11$708boo$708boo10$720b o$719bobo$720boo11$732boo$732boo10$744bo$743bobo$744boo11$756boo$756b oo11$768boo$768boo10$780bo$779bobo$780boo10$792bo$791bobo$792boo11$ 804boo$804boo11$816boo$816boo10$828bo$827bobo$828boo10$840bo$839bobo$ 840boo10$852bo$851bobo$852boo10$864bo$863bobo$864boo10$876bo$875bobo$ 876boo11$888boo$888boo11$900boo$900boo11$912boo$912boo10$924bo$923bobo $924boo10$936bo$935bobo$936boo10$948bo$947bobo$948boo11$960boo$960boo 11$972boo$972boo11$984boo$984boo10$996bo$995bobo$996boo10$1008bo$1007b obo$1008boo11$1020boo$1020boo11$1032boo$1032boo10$1044bo$1043bobo$ 1044boo10$1056bo$1055bobo$1056boo2597bo$3653b3o$3652bo$3652boo6$3659b oo$3659boo$1068boo$1068boo10$3569boo$1080boo2487boo72boo$1080boo2467bo 93boo$3537bo11b3o$3535b3o14bo$3519bo14bo16boo$3519b3o12boo$3522bo$ 3521boo3$3522boo$1092bo2429boo17boo106boo$1091bobo2447boo106bobo$1092b oo2557bo$3579boo70boo$3579boo3$3538boo$3538bo19boo$3539b3o15bobo$3541b o15bo83boo$3535boo19boo83boo$1104bo2430bo$1103bobo2430b3o96bo$1104boo 2432bo94b3o$3632bo18boo$3632boo17boo$3661boo$3661bo$3659bobo$3544boo 113boo$3544bo$3525boo15bobo$3525boo15boo$1116bo2396boo$1115bobo2394bob o$1116boo2394bo$3511boo$$3655boo$3655bobo$3657bo$3657boo3$3524boo$ 1128bo2394bobo$1127bobo2393bo$1128boo2392boo116boo$3640boo$3649boo$ 3649bobo$3651bo$3651boo4$3534boo$1140bo2393boo$1139bobo$1140boo$$3634b oo$3634boo4boo$3523boo115boo$3524bo19boo$3524bobo17bo$3525boo15bobo$ 3537bo4boo95boo$3536bobo96boobboo$1152bo2383bobo95bobo$1151bobo2371boo 10bo96bo12boo$1152boo2370bobo106boo11bobo$3524bo121bo$3523boo120boo$ 3538boo121boo$3538bo122bo$3539b3o120b3o$3541bo122bo$3647boo$3646bobo$ 3646bo538boo$3645boo60bo477boo$1164boo2539b3o$1164boo2538bo$3704boo$ 3675bo34bo$3675b3o32b3o$3678bo34bo$3655boo20boo33boo$3655boo7boo56boo$ 3664bo57bo$3662bobo55bobo$3662boo4boo44boo4boo$3646boo20bo44bobbo$ 1176boo2469bo18bobo45boo$1176boo2469bobo16boo34boo$3648boo52boo8$3677b oo32boo3boo$3677boo11boo20bo3bo$1188boo2500bo18b3o5b3o$1188boo2464boo 35b3o15bo9bo$3650boobboo37bo$3649bobo$3649bo23boo$3648boo23bo$3674b3o$ 3676bo4$1200bo$1199bobo$1200boo9$4233boo$4233boo$1212boo$1212boo10$ 1224bo$1223bobo$1224boo4$3151boo$3151boo$3131bo$3119bo11b3o$3117b3o14b o$3101bo14bo16boo$3101b3o12boo$1236boo1866bo$1236boo1865boo3$3104boo$ 3104boo17boo$3123boo$$3161boo$3161boo$$1248bo$1247bobo1870boo$1248boo 1870bo19boo$3121b3o15bobo$3123bo15bo$3117boo19boo$3117bo$3118b3o$3120b o5$1260boo$1260boo1864boo$3126bo$3107boo15bobo$3107boo15boo$3095boo$ 3094bobo$3094bo$3093boo3$1272bo2542boo$1271bobo2541boo$1272boo3$3106b oo$3105bobo696boo$3105bo699bo$3104boo699bobo$3806boo3$3819boo$1284boo 2533bobo$1284boo2535bo$3821boo$$3116boo$3116boo3$3817boo$3817bobo$ 3819bo$1296bo1808boo712boo$1295bobo1808bo19boo$1296boo1808bobo17bo$ 3107boo15bobo$3119bo4boo$3118bobo680boo$3118bobo679bobo$3107boo10bo 680bo$3106bobo690boo$3106bo$3105boo$3120boo$3120bo$1308boo1811b3o$ 1308boo1813bo$3809boo$3809boo$$3816bo$3816b3o$3819bo$3818boo$3798boo$ 3799bo$3799bobo$1320boo2478boo$1320boo2420bo$3740b3o$3739bo74boo$3739b oo73bobo$3724boo90bo$3725bo90boo$3725bobo$3726boo10bo$3737bobo$3737bob o$3738bo4boo$1332boo2392boo15bobo$1332boo2391bobo17bo65boo$3725bo19boo 64bo$3724boo86b3o$3814bo$3749boo$3749bo$3747bobo$3747boo46boo$3735boo 57bobo$3735boo57bo$1344bo2448boo$1343bobo$1344boo5$3803boo$3723boo78b oo171bo$3724bo251b3o$3724bobo83bo168bo23boo$3725boo83b3o165boo23bo$ 1356bo2456bo187bobo$1355bobo2454boo145bo37boobboo$1356boo2038bo395boo 139bo9bo15b3o35boo$3394b3o396bo139b3o5b3o18bo$3393bo399bobo140bo3bo20b oo11boo$3393boo399boo139boo3boo32boo3$3808boo$3808bobo$3810bo$3400boo 324boo15boo65boo$1368bo2031boo324boo15bobo$1367bobo2348boo25bo203boo 52boo$1368boo2349bo25boo202boo34boo16bobo$3719bobo215boo45bobo18bo$ 3720boo214bobbo44bo20boo$3931boo4boo44boo4boo$3805boo123bobo55bobo$ 3805bo124bo57bo$3739bo66b3o120boo56boo7boo$3737b3o68bo130boo33boo20boo $3736bo202bo34bo$3736boo20bo181b3o32b3o$1380bo2361bo15b3o181bo34bo$ 1379bobo2002boo354b3o18bo185boo$1380boo2002boo353bo20boo11boo173bo$ 3739boo32boo170b3o$3945bo60boo$4006bo$4004bobo$4004boo$$3742boo37boo 21boo$3723boo17boo36bobo21boo$3723boo55bo17boo$1392bo2386boo17boo186b oo$1391bobo2593bo$1392boo2328boo263bobo$3723bo76boo186boo$3720b3o12boo 56boo5boo$3720bo14bo16boo39boo$3736b3o14bo$3738bo11b3o20boo$3750bo22bo $3774b3o$3382boo392bo$3382boo$1404bo$1403bobo1970bo$1404boo1968b3o$ 3373bo615boo15boo$3373boo614boo15bobo$3393boo613bo$3393bo614boo$3391bo bo$3391boo3$3377boo$1416bo1959bobo$1415bobo1958bo604boo$1416boo1957boo 605bo$3969boo11bobo$3970bo12boo$3970bobo$3971boobboo$3975boo$$3380boo$ 3381bo$3378b3o595boo$1428bo1949bo591boo4boo$1427bobo2540boo$1428boo4$ 2813boo556boo$2813boo557bo598boo$2793bo578bobo15boo578bobo$2781bo11b3o 577boo15boo578bo$2779b3o14bo1172boo$2763bo14bo16boo$1440bo1322b3o12boo $1439bobo1324bo$1440boo1323boo3$2766boo$2766boo17boo$2785boo$$2823boo 566boo$2823boo566bobo$3393bo$1452bo1940boo$1451bobo1328boo$1452boo 1328bo19boo$2783b3o15bobo$2785bo15bo$2779boo19boo573boo$2779bo594bobo$ 2780b3o591bo$2782bo590boo60bo$3433b3o$3432bo$3432boo$1464bo1938bo34bo$ 1463bobo1937b3o32b3o$1464boo1322boo616bo34bo$2788bo594boo20boo33boo$ 2769boo15bobo594boo7boo56boo$2769boo15boo604bo57bo$2757boo631bobo55bob o$2756bobo631boo4boo44boo4boo$2756bo617boo20bo44bobbo$2755boo618bo18bo bo45boo$3375bobo16boo34boo$3376boo52boo$1476bo$1475bobo$1476boo$$2203b o$2202bobo563boo$2202boo563bobo$2767bo637boo32boo3boo$2766boo637boo11b oo20bo3bo$3418bo18b3o5b3o$3382boo35b3o15bo9bo$3378boobboo37bo$1488bo 1888bobo$1487bobo1887bo23boo$1488boo1886boo23bo$3402b3o$3404bo$2778boo $2778boo6$2767boo$1500boo1266bo19boo$1500boo1266bobo17bo$2769boo15bobo $2781bo4boo$2780bobo$2780bobo$2769boo10bo$2768bobo$2768bo$2767boo$ 2782boo$2782bo$1512boo1269b3o$1512boo1271bo793bo$3579b3o$3582bo23boo$ 3581boo23bo$3604bobo$3562bo37boobboo$3536bo9bo15b3o35boo$3536b3o5b3o 18bo$3539bo3bo20boo11boo$3538boo3boo32boo$$1524boo$1524boo5$3552boo52b oo$3552boo34boo16bobo$3540boo45bobo18bo$3539bobbo44bo20boo$3534boo4boo 44boo4boo$1536bo1996bobo55bobo$1535bobo1995bo57bo$1536boo1994boo56boo 7boo$3542boo33boo20boo$3542bo34bo$3543b3o32b3o$3545bo34bo$3550boo$ 3551bo$3548b3o$3548bo60boo$3609bo$2177bo1429bobo$1548boo615bo11b3o 1427boo$1548boo613b3o14bo23boo1385bo$2147bo14bo16boo23bo1386b3o$2147b 3o12boo38bobo1389bo$2150bo47boobboo1389boo$2149boo47boo1409boo$3609bo$ 3531boo74bobo11boo$2150boo1379boo74boo12bo$2150boo17boo1448bobo97bo$ 2169boo1444boobboo96b3o$3615boo99bo$1560boo2154boo$1560boo1958boo127b oo53bo$3521bo127boo53b3o$3521bobo90boo91bo$2166boo36boo1316boo90boo4b oo84boo$2166bo19boo16bobo1413boo25boo$2167b3o15bobo18bo1440boo110boo$ 2169bo15bo20boo1327boo97boo84boo11bo25bo$2163boo19boo4boo1343bobo97bo 57boo25boo11b3o21bobo$2163bo25bobo1345bo97bobo56bo41bo20boo$2164b3o22b o1347boo97boo56bobo38boo39boo$2166bo21boo7boo1433boo61boo79boo5boo$ 1572boo623boo1433boo149boo$1572boo2052boo$3626bo$2147boo1475bobo135boo 17boo$2146bobo23bo1360boo89boo137bo17boo$2146bo23b3o1360bobo189boo36bo bo21boo$2145boo22bo63bo1301bo161boo26boo37boo21boo$2153boo14boo36boo 22b3o1301boo108boo50boo$2153boo52bo22bo1414boo29boo$2205bobo22boo1444b oo$2205boo11bo$2218b3o$1584boo635bo1295boo146bo56boo32boo$1584boo634b oo1294bobo145bobo55bo20boo11boo$3516bo147boo54bobo21bo$3515boo156boo 45boo19b3o44bo$2234boo11bo1358boo15boo48bo67bo44b3o$2207boo25boo11b3o 1355bobo15boo46bobo111bo$2208bo41bo23boo1329bo65boo87boo23boo$2208bobo 38boo23bo1329boo32boo121bo$2152boo55boo61bobo1363boo118b3o$2151bobo 114boobboo1484bo$2151bo116boo1255boo87bo$1596bo553boo1373boo87b3o$ 1595bobo2019bo$1596boo587boo1345bo83boo$2185boo52boo1291b3o$2211boo26b oo1294bo$2211boo1321boo218bo$3514boo238b3o35boo$2143boo45boo1323bo241b o34boo$2144bo45boo1323bobo229boo7boo$2144bobo15boo22boo1328boo230bo$ 2145boo15boo22boo48boo36boo1182bo289bobo$2236bo19boo16bobo1179b3o290b oo36boo$2237bo17bobo18bo1178bo74boo116bo138boo$1608boo582boo42boo17bo 20boo1177boo73bobo76boo35b3o142boo$1608boo582boo60boo4boo1178boo90bo 76boo34bo145boo$2259bobo1179bo90boo111boo42boo$2259bo1181bobo245bo$ 2258boo7boo1173boo10bo232bobo95boo$2267boo1184bobo158boo67boobboo56bo 23boo14boo$3453bobo158boo67boo59bobo22bo$3454bo4boo149boo133bo14boo8b 3o$3442boo15bobo148boo148bo11bo$2163boo1276bobo17bo65boo232b3o$2163bob o1275bo19boo64bo126boo107bo$2165bo1274boo86b3o85boo36boo$1620boo543boo 110boo1251bo85boo13boo114boo$1620boo655bo1187boo163bobo113bobo$2275bob o1187bo164bo115bo16boo$2275boo1186bobo163boo10boo102boo17bo$3086boo 375boo46boo129bo118b3o$3086boo363boo57bobo126b3o9boo36boo70bo$3107bo 343boo57bo128bo11bo19boo16bobo$2172boo931b3o11bo389boo138bobo18bobo18b o62boo$2172bo84boo50boo793bo14b3o527boo19bo20boo61boo$2153boo15bobo85b o49bobbo792boo16bo14bo531boo4boo$2153boo15boo86bobo48boo810boo12b3o 536bobo$2259boo873bo539bo$1632boo1500boo537boo7boo$1632boo2048boo$ 3519boo$3133boo304boo78boo223boo$3114boo17boo305bo304bo$3114boo324bobo 83bo218bobo$3441boo83b3o217boo$3076boo451bo$3076boo450boo162boo$3508b oo182bo$2152boo1355bo180bobo$2151bobo106boo855boo390bobo178boo52boo$ 1644boo505bo108boo14boo819boo19bo391boo233bo$1644boo504boo100boo22bo 820bobo15b3o614boo11bobo$2253bo23b3o65boo752bo15bo617bo12boo$2253bobo 23bo66bo752boo19boo402boo207bobo$2254boo90bobo772bo402bobo145boo60boo bboo$2347boo16bo752b3o405bo146bo64boo$2168boo193b3o752bo323boo15boo65b oo145bobo$2168bobo191bo1079boo15bobo212boo$2170bo191boo1070boo25bo$ 2109bo60boo100boo1161bo25boo276boo$2109b3o160bo1162bobo295boo4boo$ 1656bo455bo157bobo1163boo295boo$1655bobo453boo157boo40boo797boo$1656b oo448bo34bo161boo7boo798bo408boo$2031bo72b3o32b3o162bo807bobo15boo389b o$2030bobo70bo34bo165bobo806boo15boo323bo66b3o$2031boo70boo33boo20boo 137boo4boo1146b3o68bo$2093boo56boo7boo117boo19bo20boo1129bo281boo$ 2094bo57bo121boo3bobo18bobo18bo22boo1106boo20bo258bobo$2094bobo55bobo 119bo6bo19boo16bobo22boo1112bo15b3o198boo15boo39bo$2095boo4boo44boo4b oo117bobo6boo36boo1135b3o18bo197boo15bobo37boo$2100bobbo44bo20boo101b oo1181bo20boo11boo176boo25bo$2101boo45bobo18bo1285boo32boo177bo25boo$ 2113boo34boo16bobo1498bobo$1668boo443boo52boo28boo60boo1408boo$1668boo 528bo59bobo71boo$2198bobo57bo25boo46boo$2199boo56boo25boo68boo775boo$ 2354bo776bobo324boo37boo21boo166bo$2355b3o775bo305boo17boo36bobo21boo 164b3o$2357bo775boo304boo55bo17boo169bo$2262boo49boo1180boo17boo169boo $2099boo3boo32boo123bo49boobboo$2100bo3bo20boo11boo58boo60b3o14boo38bo bo1118boo$2097b3o5b3o18bo71boo4boo54bo16bo16boo23bo1119bo76boo$2097bo 9bo15b3o35boo41boo65bo6b3o14bo23boo1115b3o12boo56boo5boo$1680boo388bo 12bo39bo37boobboo103bobo7bo11b3o44boo6boo1087bo14bo16boo39boo$1680boo 388b3o8b3o81bobo103bo20bo47bo6bo1104b3o14bo$2073bo6bo86bo169b3o8b3o 1103bo11b3o20boo199boo$2072boo6boo85boo34boo132bo12bo770boo343bo22bo 200bo$2199boobboo916boo367b3o195bobo$2198bobo908boo381bo195boo$2198bo 12boo895bobo$2197boo11bobo895bo$2210bo896boo565boo$2090bo118boo1462bob o$2088b3o1041boo539bo$2087bo1023boo19bo539boo$1692boo393boo1023bo17bob o559boo$1692boo371boo1045bobo15boo561bo$2065boo144boo900boo4bo570b3o$ 2210bobo905bobo569bo$2210bo907bobo$2209boo908bo10boo551boo$3130bobo 550boo$3132bo$2077boo1053boo$2077boo1038boo$3118bo$3115b3o$1704boo513b oo894bo$1704boo513boo1452boo$2109bo1564bo$2108bobo115bo1447bobo$2108b oo116b3o1446boo$2229bo$2228boo$2095boo111boo$2095bo113bo$2030boo64b3o 110bobo1461boo$2031bo48boo16bo111boo1462bo$2031bobo45bobo1579boo11bobo $1716boo314boobboo37bo3bo1582bo12boo$1716boo318boo35b3obboo11bo9bo122b oo1436bobo$2072bo18b3o5b3o122bobo1436boobboo$2059boo11boo20bo3bo127bo 1440boo$2059boo32boo3boo126boo3$3668boo$3662boo4boo$3662boo$$2170bo20b o29boo$1728boo300boo52boo83bobo7bo11b3o27bo$1728boo299bobo16boo34boo 84bo6b3o14bo27b3o$2029bo18bobo45boo61bo16bo16boo29bo235boo$2028boo20bo 44bobbo60b3o14boo282bobo1200boo$2044boo4boo44boo4boo58bo281boo15bo 1200bobo$2044bobo55bobo56boo281boo91bo1124bo$2046bo57bo432b3o1121boo$ 2037boo7boo56boo331boo101bo$2037boo20boo33boo341boo82bo17boo$2060bo34b o60boo25boo324bo11b3o$2057b3o32b3o62bo25boo322b3o14bo$2057bo34bo64bobo 331bo14bo16boo$1740boo344boo70boo331b3o12boo$1740boo344bo407bo$2087b3o 107boo21boo271boo$2027boo60bo81boo23bobo21boo204bo11boo$2028bo142bobo 6boo14bo17boo209bobo10boo$2028bobo38bo103bo6bo14boo17boo209bobo14boo 50boo$2029boo37bobo102boo3bobo245bo15boo50boo17boo$2068boo108boo333boo $2216boo$2158boo49boo5boo333boo$2048bo109bobo48boo340boo$2046b3o110bo 276boo$1752boo291bo123boo264bobbo$1752boo291boo122bobo264boo72boo$ 2171bo338bo19boo$2171boo338b3o15bobo$2513bo15bo$2507boo19boo$2507bo$ 2508b3o$2153boo355bo$2152bobo$2152bo$2025boo124boo$1764boo259boo232bo$ 1764boo493b3o$2262bo14bo238boo$2261boo12b3o238bo$2180boo39bo52bo222boo 15bobo$2181bo25bo13b3o50boo221boo15boo$2161boo18bobo21b3o16bo260boo$ 2161boo7boo10boo20bo18boo259bobo$2170bo33boo67boo209bo$2040boo126bobo 83boo17boo208boo$2040boo126boo4boo78boo121bo9bo$2152boo20bo202b3o5b3o 27bo$1776boo375bo18bobo192boo11bo3bo30b3o$1776boo375bobo16boo192bobo 10boo3boo32bo14bo$2154boo210bo50boo12b3o$2214boo149boo63bo885bo$2214b oo41boo171boo884b3o$2237boo19bo237boo821bo23boo$2237bobo15b3o237bobo 820boo23bo$2239bo15bo173boo64bo845bobo$2227boo10boo19boo148boo17boo63b oo803bo37boobboo$2227bo33bo100boo46boo861bo9bo15b3o35boo$2183boo32boo 9b3o27b3o71boo28boo909b3o5b3o18bo$2183boo11boo20bo11bo27bo74bo942bo3bo 20boo11boo224boo$1788boo406bo21bobo109b3o942boo3boo32boo224boo5boo$ 1788boo370boo35b3o19boo109bo1216boo$2156boobboo37bo$2155bobo255boo$ 2155bo23boo212boo19bo1101boo8boo17boo$2154boo23bo71boo120bo6boo11bobo 15b3o92boo1008boo9bo17boo$2180b3o69bo118b3o6boo13bo15bo94boo1019bobo 21boo$2182bo69bobo15boo98bo24boo19boo1110boo21boo$2253boo15boo98boo45b o871boo52boo165boo$2414b3o872boo34boo16bobo164boo$2414bo862boo45bobo 18bo168boo$3276bobbo44bo20boo167boo$1800boo693boo107bo666boo4boo44boo 4boo$1800boo694bo19boo86b3o663bobo55bobo$2432boo62bobo17bo90bo662bo57b o$2408bo23bobo62boo15bobo71bo17boo661boo56boo7boo171boo$2408b3o23bo74b o4boo60bo11b3o688boo33boo20boo171boo$2411bo22boo72bobo63b3o14bo687bo 34bo$2410boo14boo80bobo47bo14bo16boo688b3o32b3o$2426boo69boo10bo48b3o 12boo707bo34bo$2013bo257boo223bobo62bo725boo265boo$2012bobo256bobo222b o63boo726bo265bo$2013boo258bo221boo788b3o264bobo$2273boo235boo773bo60b oo204boo$1812boo696bo50boo783bo$1812boo697b3o47boo17boo762bobo$2513bo 66boo762boo$3328bo187boo$2618boo708b3o186bo$2618boo711bo182b3o$2280boo 1048boo182bo$2280bo146boo917boo181boo$2261boo15bobo146bobo147boo767bo 182bobo$2261boo15boo149bo147bo19boo745bobo11boo171bo$2429boo147b3o15bo bo745boo12bo172boo$2580bo15bo759bobo192boo$1824boo748boo19boo755boobb oo177boo14boo$1824boo748bo777boo182bo22boo$2575b3o955b3o23bo$2577bo 808boo145bo23bobo$3386boo169boo$3351boo168boo$3351boo4boo162boo$2417b oo938boo25boo$2417boo965boo129bo$2260boo321boo786boo140b3o23boo$2259bo bo321bo788bo139bo17boo8bo$2259bo166boo136boo15bobo788bobo72boo48boo13b oo16bo9bobo$1836boo420boo166boo136boo15boo790boo46bo25bo23bo25bo30bobo 10boo$1836boo714boo815boo50b3o21bobo23b3o21bobo30boo$2551bobo815boo53b o20boo27bo20boo$2551bo811boo58boo48boo38bo$2550boo811bo149b3o$2276boo 147boo17bo9bo906bobo90bo49bo11bo$2276bobo146bo18b3o5b3o27bo878boo91b3o 47b3o8boo14bo$2278bo142boo3b3o5boo11bo3bo30b3o972bo49bo22bobo$2217bo 60boo141bobo4bo4bobo10boo3boo32bo14bo955boo11boo35boo23bo$2217b3o203bo 9bo50boo12b3o881boo85boo$2220bo171boo29boo7boo63bo884boo29boo$2219boo 170bobo103boo914boo$1848boo364bo34bo141bo4boo165boo977boo$1848boo362b 3o32b3o140boo5bo164bobo977boo14boo$2211bo34bo147b3o99boo64bo839bo131b oo22bo$2211boo33boo20boo124bo82boo17boo63boo838bobo122boo7bo23b3o$ 2060bo140boo56boo7boo159boo46boo922boo123bobo6bobo23bo$2059bobo140bo 57bo138boo28boo979boo32boo48boo32bo7boo$2059bobo140bobo55bobo137bo887b oo53boo15boo48bo20boo11boo35boo11boo23boo7boo$2060bo142boo4boo44boo4b oo134b3o888boo52bobo15boo46bobo21bo49bo36bo$2208bobbo44bo20boo118bo 944bo65boo19b3o47b3o38b3o$2209boo45bobo18bo1063boo32boo52bo49bo42bo$ 2221boo34boo16bobo202boo893boo157boo$2054boo165boo52boo183boo19bo966b oo48boo35bo$2054boo384bo6boo11bobo15b3o92boo702boo72bo97bo20boo27bo22b oo11bobo$2438b3o6boo13bo15bo94boo703bo72b3o92b3o21bobo23b3o24bo12boo$ 2437bo24boo19boo793bobo73bo91bo25bo23bo26bobo$2437boo45bo794boo72boo 117boo50boobboo$2481b3o1044boo$2481bo$3292boo$2207boo3boo32boo314boo 728bobo$2208bo3bo20boo11boo315bo19boo90boo617bo234boo$2199boo4b3o5b3o 18bo264boo62bobo17bo91boo617boo227boo4boo$2199bobo3bo9bo15b3o35boo204b o23bobo62boo15bobo71bo867boo$2200bo30bo37boobboo200b3o23bo74bo4boo60bo 11b3o$2273bobo202bo22boo72bobo63b3o14bo$2250boo23bo201boo14boo80bobo 47bo14bo16boo726bo$2251bo23boo216boo69boo10bo48b3o12boo704boo35b3o$ 2248b3o312bobo62bo661boo54boo34bo$2248bo314bo63boo661bobo89boo42boo96b oo$2562boo728bo133bo96bobo$2577boo713boo130bobo96bo$2577bo50boo721boo 67boobboo96boo$2578b3o47boo17boo702boo67boo$2580bo66boo698boo$3347boo$ 2685boo587boo$2685boo586bobo115boo$3273bo79boo36boo$2494boo776boo79boo 13boo$2494bobo147boo721bobo$2496bo147bo19boo701bo$2496boo147b3o15bobo 700boo10boo$2647bo15bo715bo$2641boo19boo712b3o9boo36boo$2641bo734bo11b o19boo16bobo$2642b3o637boo102bobo18bobo18bo$2644bo637boo102boo19bo20b oo$3406boo4boo$3289bo121bobo$3289b3o119bo$2484boo806bo117boo7boo$2484b oo805boo126boo$2650boo619boo$2650bo621bo$2493boo136boo15bobo621bobo$ 2493boo136boo15boo623boo$2619boo594bo$2618bobo592b3o$2618bo593bo74boo 140boo$2617boo593boo73bobo139bo$2492boo17bo9bo675boo90bo137bobo$2492bo 18b3o5b3o27bo648bo90boo136boo$2488boo3b3o5boo11bo3bo30b3o646bobo$2488b obo4bo4bobo10boo3boo32bo14bo631boo10bo$2490bo9bo50boo12b3o642bobo$ 2459boo29boo7boo63bo645bobo$2458bobo103boo645bo4boo191boo$2458bo4boo 165boo567boo15bobo191bo$2457boo5bo164bobo566bobo17bo65boo124bobo$2461b 3o99boo64bo568bo19boo64bo126boo$2461bo82boo17boo63boo567boo86b3o$2496b oo46boo741bo$2466boo28boo724boo$2467bo754bo$2464b3o753bobo$2464bo755b oo46boo$3208boo57bobo$2547boo659boo57bo$2527boo19bo717boo$2507bo6boo 11bobo15b3o92boo$2505b3o6boo13bo15bo94boo$2504bo24boo19boo860boo15boo$ 2504boo45bo860boo15bobo$2548b3o853boo25bo$2548bo856bo25boo$3276boo127b obo$2629boo107bo457boo78boo128boo$2630bo19boo86b3o456bo$2566boo62bobo 17bo90bo455bobo83bo$2542bo23bobo62boo15bobo71bo17boo456boo83b3o$2542b 3o23bo74bo4boo60bo11b3o561bo138bo$2545bo22boo72bobo63b3o14bo559boo136b 3o$2544boo14boo80bobo47bo14bo16boo539boo155bo$2560boo69boo10bo48b3o12b oo557bo155boo$2630bobo62bo570bobo$2630bo63boo571boo$2629boo$2644boo$ 2644bo50boo584boo$2645b3o47boo17boo565bobo$2647bo66boo567bo143boo$ 3199boo15boo65boo142bo$2752boo445boo15bobo206bobo$2752boo99boo336boo 25bo206boo$2839boo12boo337bo25boo$2561boo277bo351bobo$2561bobo147boo 127bobo350boo216boo$2563bo147bo19boo93boo13boo567bobo$2563boo147b3o15b obo93boo450boo130bo$2714bo15bo547bo130boo$2708boo19boo481bo66b3o147boo $2708bo111boo388b3o68bo148bo$2709b3o108boo37boo348bo217b3o$2711bo112b oo33boo348boo20bo195bo$2824boo389bo15b3o$3213b3o18bo185boo$3212bo20boo 11boo172boo$2551boo659boo32boo$2551boo266boo$2717boo100boo38bo$2717bo 140bobo$2560boo136boo15bobo141bo$2560boo136boo15boo$2686boo527boo37boo 21boo131boo$2685bobo508boo17boo36bobo21boo132bo$2685bo163boo345boo55bo 17boo138bobo$2684boo162bobo401boo17boo139boo$2559boo17bo9bo259bo$2559b o18b3o5b3o27bo230boo346boo$2555boo3b3o5boo11bo3bo30b3o577bo76boo$2555b obo4bo4bobo10boo3boo32bo14bo191boo365b3o12boo56boo5boo$2557bo9bo50boo 12b3o192bo365bo14bo16boo39boo142boo$2526boo29boo7boo63bo192b3o382b3o 14bo184bo$2525bobo103boo191bo386bo11b3o20boo150boo11bobo$2525bo4boo 165boo140boo382bo22bo152bo12boo$2524boo5bo164bobo140bobo405b3o149bobo$ 2528b3o99boo64bo144bo407bo150boobboo$2528bo82boo17boo63boo144boo561boo $2563boo46boo$2533boo28boo$2534bo$2531b3o871boo$2531bo867boo4boo$3399b oo$2614boo215boo$2594boo19bo215boo$2574bo6boo11bobo15b3o92boo$2572b3o 6boo13bo15bo94boo116bo$2571bo24boo19boo204b3o$2571boo45bo203bo577boo$ 2615b3o204boo575bobo$2615bo226boo555bo$2842bo555boo$2696boo142bobo$ 2697bo19boo121boo$2633boo62bobo17bo$2609bo23bobo62boo15bobo$2609b3o23b o74bo4boo109boo$2612bo22boo72bobo113bobo$2611boo14boo80bobo113bo$2627b oo69boo10bo113boo$2697bobo$2697bo$2696boo$2199bo511boo$2199b3o509bo$ 2202bo509b3o$2201boo511bo114boo$2830bo$2219bo607b3o$2217b3o607bo$2026b o189bo88boo$2024b3o189boo87boo321boo$2023bo302bo301bobo$2023boo299b3o 11bo291bo658boo$2008boo184boo19boo106bo14b3o289boo631bo25bo$2009bo184b oo19boo106boo16bo14bo894bo11b3o21bobo$2009bobo328boo12b3o476boo414b3o 14bo20boo$2010boo10bo330bo479boo4boo392bo14bo16boo39boo$2021bobo329boo 484boo392b3o12boo56boo5boo$2021bobo1212bo76boo$2022bo4boo1206boo$2010b oo15bobo322boo$2009bobo17bo303boo17boo484boo452boo17boo$2009bo19boo 302boo283boo214boobboo396boo55bo17boo$2008boo608boo213bobo400boo17boo 36bobo21boo$2295boo536bo12boo407boo37boo21boo$2202boo91boo535boo11bobo $2203bo423boo216bo$2200b3o424boo215boo$2200bo135boo522boo$2019boo295b oo19bo522bo$2019boo295bobo15b3o524b3o388boo32boo$2318bo15bo528bo388bo 20boo11boo$2318boo19boo285boo17bo9bo190boo405b3o18bo$2340bo285bo18b3o 5b3o27bo161bobo407bo15b3o$2337b3o282boo3b3o5boo11bo3bo30b3o159bo403boo 20bo$2206boo129bo284bobo4bo4bobo10boo3boo32bo14bo142boo60bo342bo$1742b oo462boo4boo410bo9bo50boo12b3o202b3o343b3o37boo$1743bo25bo442boo36boo 341boo29boo7boo63bo204bo348bo38bo28boo$1743bobo21b3o480bobo339bobo103b oo203boo383b3o29bo$1744boo20bo240boo243bo339bo4boo275bo34bo378bo29bobo $1766boo240bo243boo337boo5bo275b3o32b3o406boo$2008bobo200boo117boo263b 3o99boo178bo34bo320boo$1786bo222boo196boobboo118bo263bo82boo17boo155b oo20boo33boo319bobo23bo$1676boo106b3o19boo398bobo122bobo15boo279boo46b oo174boo7boo56boo309bo23b3o$1669boo5boo105bo21bobo398bo125boo15boo249b oo28boo231bo57bo309boo22bo$1669boo99boo11boo20bo11bo387boo154boo238bo 259bobo55bobo317boo14boo$1707boo61boo32boo9b3o543bobo234b3o260boo4boo 44boo4boo318boo$1706bobo105bo548bo234bo246boo20bo44bobbo$1671boo17boo 14bo107boo10boo387boo146boo481bo18bobo45boo$1671boo17bo14boo119bo387bo bo464boo163bobo16boo34boo$1665boo21bobo133bobo169boo216bo21boo423boo 19bo164boo52boo$1665boo21boo134boo13boo156bo215boo21bobo402bo6boo11bob o15b3o$1801boo36boo156bobo238bo400b3o6boo13bo15bo637boo$1801boo195boo 238boo398bo24boo19boo615boo14boo$1730boo13boo263boo15boo215boo392boo 45bo616bo22boo$1702boo26boo13boo11boo85boo163boo15bobo214bo437b3o614b 3o23bo$1702boo54bo86boo182bo195boo15bobo105boo330bo616bo23bobo$1759b3o 79boo186boo194boo15boo106bobo970boo$1761bo79boo509bo523boo32boo3boo 321boo$2352boo522boo11boo20bo3bo321bobo$2700boo187bo18b3o5b3o318bo$ 1769boo39boo864bo23bobo150boo35b3o15bo9bo317boo$1732boo34bobo40bo34boo 828b3o23bo146boobboo37bo412boo$1662bo29boo38bobo33bo39b3o35boo175bo 655bo22boo144bobo455bo$1662b3o27bo41bo32boo39bo212b3o654boo14boo152bo 23boo432bobo$1665bo27b3o11boo25boo284bo673boo151boo23bo434boo$1664boo 29bo11boo311boo19boo830b3o378boo$2026bo15bo832bo378bobo$2024b3o15bobo 295boo914bo$1721boo300bo19boo179boo114boo914boo$1721bo301boo198bobo$ 1722b3o498bo$1724bo497boo$1659boo50boo351boo$1660bo51bo126boo223boo 1161boo$1660bobo46b3o127bo511boo848bo25bo$1661boo46bo130b3o183boo302b oo19bo849b3o21bobo18boo$1842bo164boo17boo212boo89bo17bobo343boo507bo 20boo10boo7boo60boo$1753boo252boo231bobo88bobo15boo344bobo505boo33bo 69boo14boo$1675boo69boo5boo62boo423bo89boo4bo358bo540bobo59boo22bo$ 1675bobo68boo69boo32boo328bo60boo93bobo357boo485bo48boo4boo60bo23b3o$ 1677bo106boo65bo154boo173b3o153bobo823boo19b3o47bo20boo44bobo23bo$ 1677boo104bobo46boo15bobo155bo176bo153bo10boo812bobo21bo46bobo18bo46b oo$1657boo89boo17boo14bo48boo15boo153b3o12boo162boo164bobo801bo11bo20b oo11boo34boo16bobo$1657bo90boo17bo14boo220bo14bo16boo140bo34bo137bo 801b3o9boo32boo52boo$1658b3o81boo21bobo23boo227b3o14bo138b3o32b3o137b oo803bo$1660bo81boo21boo23bobo229bo11b3o138bo34bo125boo805boo10boo$ 1791bo242bo140boo33boo20boo103bo806bo155boo$1666boo386boo109boo56boo7b oo100b3o807bobo154bo$1666boo386boo110bo57bo109bo350boo94bo348boo13boo 141boo11bobo$1779boo385bobo55bobo458boo93bobo347boo36boo119bo12boo$ 1779boo29boo355boo4boo44boo4boo553boo386boo119bobo$1810boo360bobbo44bo 20boo981boo64boobboo$2173boo45bobo18bo452boo428boo85boo11boo68boo$ 2185boo34boo16bobo452boo428boo86bo$1831boo352boo52boo887boo79b3o35boo$ 1676boo152bobo1295boo79bo37boobboo$1676bo153bo1420bobo41boo$1674bobo 92boo58boo1397boo23bo35boo4boo$1674boo93bo53boo868boo464boo39boo27bo 23boo34boo$1770b3o50boo868bo429boo34bo40bobo23b3o$1772bo46boo868boo3b 3o426boo35b3o39bo23bo$1819bobo867bobo4bo465bo39boo$1821bo349boo3boo32b oo479bo$1676boo143boo349bo3bo20boo11boo448boo16boo11boo$1676bo131boo 359b3o5b3o18bo460bobo16boo610boo$1674bobo11boo118boo25boo332bo9bo15b3o 35boo424bo4boo623bobo$1674boo12bo146boo4boo352bo37boobboo378bo40boo5bo 623bo$1686bobo46boo104boo394bobo375b3o44b3o391bo231boo$1682boobboo48bo 69boo71boo333boo23bo374bo47bo25boo366b3o$1682boo52bobo67boo71bo335bo 23boo373boo53boo17bobo368bo23boo$1737boo141b3o329b3o384boo67bobo19bo 367boo23bo$1761boo77boo40bo329bo387bo67bo21boo389bobo46boo$1761boo73b oobboo758bobo64boo370bo37boobboo48bo$1681boo152bobo763boo10bo399bo9bo 15b3o35boo49b3o$1681boo4boo146bo12boo762bobo371boo25b3o5b3o18bo85bo$ 1687boo145boo11bobo762bobo371boo28bo3bo20boo11boo160boo$1847bo765bo4b oo395boo3boo32boo96boo62boo5boo$1846boo753boo15bobo497boo32boo69boo$ 1759boo101boo736bobo17bo65boo431bo65boo$1759bo102bo737bo19boo64bo432bo bo15boo46bobo$1760b3o100b3o733boo86b3o285boo143boo15boo48bo33boo$1686b oo74bo102bo823bo286bo210boo32boo$1686bobo159boo774boo350bobo199boo47b oo$1688bo158bobo774bo352boo199bobo46boo$1688boo157bo774bobo404boo52boo 94bo$1846boo774boo46boo357boo34boo16bobo$2610boo57bobo318boo25boo45bob o18bo$2610boo57bo320bobo23bobbo44bo20boo103boo$2668boo322bo18boo4boo 44boo4boo88boo29boo$2992boo16bobo55bobo88boo$3010bo57bo$1763boo1244boo 56boo7boo$1763bo92boo1161boo33boo20boo60boo$1761bobo92boo7boo1152bo34b o83bobo$1761boo102bo1154b3o32b3o82bo$1752boo109bobo812boo308boo32bo34b o82boo58boo$1752boo109boo4boo727boo78boo308bobo36boo117boo53bo$1847boo 20bo19boo708bo390bo37bo117boo50b3o6boo$1848bo18bobo18bobo708bobo83bo 304boo33b3o122boo46bo9bo$1848bobo16boo19bo11bo699boo83b3o337bo60boo61b obo56bobo$1849boo36boo9b3o787bo397bo62bo59boo$1897bo789boo395bobo61boo 68boo$1769boo126boo10boo756boo415boo75boo55boo$1769bo139bo758bo303boo 160boo25boo$1767bobo137bobo758bobo300bobo154boo4boo$1767boo138boo13boo 745boo300bo118boo36boo$1884boo36boo1046boo117bobo71boo$1884boo1180boo 21bo73boo$2683boo382bo20boo111boo$1928boo753bobo381bobo59boo71bo$1928b oo755bo382boo59boobboo67bobo$1855boo67boo675boo15boo65boo446bobo67boo$ 1851boobboo67boo675boo15bobo500boo12bo$1850bobo740boo25bo359boo139bobo 11boo$1771boo77bo254boo487bo25boo358boo141bo$1771bobo75boo42boo210boo 487bobo526boo$1773bo120bo34boo664boo390bo119boo$1773boo116b3o35boo 1056b3o118bo$1744boo17boo126bo788boo308bo114b3o$1744bo18boo915bo308boo 114bo$1745b3o368boo496bo66b3o285boo150boo76boo$1747bo368bo495b3o68bo 286bo150bobo74bobo$2114bobo494bo358bobo96boo15boo35bo74bo$1753boo359b oo495boo20bo337boo96boo15bobo34boo72boo$1753boo242bo619bo15b3o277bo 174bo118boo17boo$1995b3o617b3o18bo274b3o174boo117boo18bo$1969boo23bo 106boo511bo20boo11boo260bo74boo237b3o$1970bo23boo104bobo511boo32boo 260boo73bobo236bo$1922boo46bobo127bo794boo90bo$1922bo48boobboo37bo84b oo795bo90boo228boo$1923b3o49boo35b3o15bo9bo855bobo214boo102boo$1763boo 160bo85bo18b3o5b3o856boo10bo172bo21boo7boo$1763bo72boo160boo11boo20bo 3bo870bobo169b3o22bo$1761bobo65boo5boo62boo96boo32boo3boo578boo37boo 21boo227bobo168bo25bobo$1761boo66boo69boo32boo662boo17boo36bobo21boo 228bo4boo163boo19boo4boo$1867boo65bo168boo493boo55bo17boo222boo15bobo 168bo15bo20boo$1866bobo46boo15bobo167bobo549boo17boo221bobo17bo65boo 99b3o15bobo18bo$1831boo17boo14bo48boo15boo168bo793bo19boo64bo99bo19boo 16bobo84boo$1831boo17bo14boo234boo494boo296boo86b3o96boo36boo86bo$ 1763boo60boo21bobo23boo722bo76boo308bo222bobo$1763bo61boo21boo23bobo 719b3o12boo56boo5boo243boo287boo$1761bobo11boo97bo94boo52boo570bo14bo 16boo39boo250bo$1761boo12bo192bobo16boo34boo586b3o14bo289bobo$1773bobo 192bo18bobo45boo82boo492bo11b3o20boo268boo46boo$1769boobboo87boo103boo 20bo44bobbo81bobo503bo22bo257boo57bobo117boo$1769boo91boo29boo88boo4b oo44boo4boo78bo527b3o254boo57bo100boo17boo120boo$1893boo88bobo55bobo 77boo528bo312boo100boo140bo$1985bo57bo1151boo11bobo$1976boo7boo56boo 1151bo12boo$1768boo144boo60boo20boo33boo1030boo47boo80bobo$1768boo4boo 137bobo83bo34bo1031bo47boobboo77boobboo$1774boo137bo82b3o32b3o1029b3o 12boo38bobo80boo$1822bo29boo58boo82bo34bo368boo661bo14bo16boo23bo$ 1822b3o27bo53boo117boo84boo287boo572boo103b3o14bo23boo$1825bo27b3o50b oo117bo85boo267bo513boo78boo105bo11b3o$1824boo29bo46boo122b3o339bo11b 3o512bo197bo108boo$1902bobo61boo60bo76bo260b3o14bo511bobo83bo214boo4b oo$1773boo129bo62bo135b3o244bo14bo16boo512boo83b3o212boo$1773bobo128b oo61bobo132bo247b3o12boo617bo$1775bo115boo75boo132boo249bo629boo$1775b oo114boo25boo202boo228boo609boo$1918boo4boo196bo841bo$1819boo103boo36b oo156bobo353bo487bobo$1820bo68boo71bobo155boo231boo119b3o488boo230boo$ 1820bobo66boo73bo21boo191bo173boo17boo99bo722bobo$1821boo141boo20bo 192b3o190boo99boo17bo703bo$1923boo59bobo119boo74bo307b3o11bo474boo214b oo$1919boobboo59boo119bobo73boo227boo77bo14b3o472bobo$1835boo81bobo 184bo90boo212boo77boo16bo14bo458bo$1835bobo80bo12boo171boo90bo309boo 12b3o374boo15boo65boo$1837bo79boo11bobo261bobo322bo377boo15bobo$1837b oo91bo252bo10boo173boo148boo368boo25bo$1817boo110boo251bobo184bo19boo 499bo25boo$1817bo127boo235bobo185b3o15bobo499bobo$1818b3o124bo231boo4b o188bo15bo129boo371boo$1820bo125b3o227bobo15boo170boo19boo110boo17boo$ 1948bo160boo65bo17bobo169bo132boo475boo$1826boo103boo177bo64boo19bo 170b3o606bo$1826boo102bobo174b3o86boo171bo91boo178bo268bo66b3o$1930bo 35boo15boo122bo353boo177bobo265b3o68bo$1929boo34bobo15boo186boo468boo 264bo$1965bo206bo734boo20bo$1964boo206bobo327boo409bo15b3o$2125boo46b oo307boo19bo407b3o18bo$2125bobo57boo188boo105bobo15b3o407bo20boo11boo$ 2127bo57boo188bo108bo15bo409boo32boo$2127boo227boo15bobo108boo19boo$ 1939boo415boo15boo131bo$1939boo7boo21bo531b3o$1948bo22b3o529bo$1946bob o25bo$1946boo4boo19boo938boo37boo21boo$1930boo20bo15bo925boo17boo36bob o21boo$1931bo18bobo15b3o146boo775boo55bo17boo$1839boo90bobo16boo19bo 145boo78boo751boo17boo$1839bo92boo36boo225bo298boo$1837bobo271bo83bobo 299bo395boo$1837boo270b3o83boo300bobo15boo377bo76boo$1828boo278bo389b oo15boo374b3o12boo56boo5boo$1828boo278boo245boo170boo362bo14bo16boo39b oo$2128boo224bobo170bobo377b3o14bo$1967boo159bo225bo174bo379bo11b3o20b oo$1967boo17boo138bobo224boo174boo390bo22bo$1986boo138boo817b3o$2947bo $1845boo$1845bo92boo47boo123boo$1843bobo88boobboo47bo123bobo$1843boo 88bobo38boo12b3o120bo$1933bo23boo16bo14bo119boo65boo15boo$1932boo23bo 14b3o201bobo15boo320boo$1958b3o11bo203bo25boo161boo149bobo$1960bo214b oo25bo162boo151bo$2200bobo174boo139boo$2200boo175bobo$2379bo$2115boo 262boo$1847boo267bo$1847bobo263b3o66bo171boo$1849bo263bo68b3o170bo19b oo$1849boo334bo169bobo17bo$1820boo17boo322bo20boo170boo15bobo$1820bo 18boo320b3o15bo188bo4boo131boo$1821b3o336bo18b3o185bobo136boo$1823bo 323boo11boo20bo184bobo$2147boo32boo173boo10bo$1829boo91boo431bobo$ 1829boo92bo25bo405bo$1923bobo21b3o11bo392boo$1924boo20bo14b3o405boo 146boo$1905boo39boo16bo14bo389bo126boo19bo$1898boo5boo56boo12b3o136boo 21boo37boo190b3o124bo17bobo$1898boo76bo139boo21bobo36boo17boo173bo124b obo15boo$1976boo144boo17bo55boo299boo4bo$1839boo281boo17boo360bobo$ 1839bo60boo17boo582bobo$1837bobo60boo17bo55boo221boo304bo10boo$1837boo 55boo21bobo36boo17boo143boo76bo316bobo$1894boo21boo37boo162boo5boo56b oo12b3o315bo$2127boo39boo16bo14bo315boo$2168bo14b3o316boo$2147boo20b3o 11bo319bo$1839boo307bo22bo328b3o$1839bo305b3o352bo$1837bobo11boo72boo 32boo184bo$1837boo12bo73boo11boo20bo$1849bobo86bo18b3o$1845boobboo88b 3o15bo$1845boo94bo20boo$1963bo$1921boo37b3o$1891boo28bo38bo$1844boo46b o29b3o$1844boo4boo40bobo29bo$1850boo41boo$1978boo$1954bo23bobo$1954b3o 23bo$1957bo22boo$1956boo14boo$1849boo121boo$1849bobo$1851bo$1851boo3$ 1894boo$1894boo14boo$1886boo22bo$1887bo23b3o$1887bobo23bo$1888boo$ 1973boo$1973bobo$1975bo$1975boo$1906boo$1906bo$1904bobo$1904boo$1957b oo$1956bobo$1956bo$1955boo5$1984boo$1985bo25bo$1965boo18bobo21b3o$ 1903boo60boo7boo10boo20bo$1887boo14boo69bo33boo$1888bo22boo59bobo$ 1885b3o23bo60boo4boo48bo$1885bo23bobo44boo20bo47b3o19boo$1909boo46bo 18bobo46bo21bobo$1957bobo16boo34boo11boo20bo11bo$1958boo52boo32boo9b3o $2056bo$2056boo10boo$1911boo155bo$1911bo154bobo$1909bobo11boo141boo13b oo$1909boo12bo119boo36boo$1921bobo119boo$1917boobboo64boo$1917boo68boo 11boo85boo452bo$2000bo86boo452b3o$1964boo35b3o79boo459bo$1960boobboo 37bo79boo458boo$1916boo41bobo$1916boo4boo35bo23boo$1922boo34boo23bo27b oo39boo$1984b3o23bobo40bo34boo$1986bo23bo39b3o35boo$2009boo39bo485boo$ 2536boo$$1921boo$1921bobo$1923bo$1923boo231bo$2154b3o$2128boo23bo$ 2129bo23boo$2081boo46bobo$2081bo48boobboo37bo$2082b3o49boo35b3o15bo9bo $2084bo85bo18b3o5b3o$1995boo160boo11boo20bo3bo355boo$1988boo5boo62boo 96boo32boo3boo354boo$1988boo69boo32boo$2026boo65bo$2025bobo46boo15bobo $1990boo33bo48boo15boo$1990boo32boo$1984boo47boo587bo$1984boo46bobo 585b3o$2033bo94boo52boo435bo$2127bobo16boo34boo435boo17bo$2127bo18bobo 45boo350boo88b3o11bo$2021boo103boo20bo44bobbo348bobo87bo14b3o$2021boo 29boo88boo4boo44boo4boo343bo89boo16bo14bo$2052boo88bobo55bobo341boo 106boo12b3o$2144bo57bo462bo$2135boo7boo56boo461boo$2073boo60boo20boo 33boo$2072bobo83bo34bo$2072bo82b3o32b3o471boo$2011boo58boo82bo34bo454b oo17boo$2011bo53boo117boo368boo89boo$2004boo6b3o50boo117bo369boo$2004b o9bo46boo122b3o419boo$2002bobo56bobo61boo60bo373bo45boo$2002boo59bo62b o98boo334b3o$1993boo68boo61bobo96boo317boo18bo$1993boo55boo75boo415boo 17boo83boo$2050boo25boo455boo92boo19bo$2077boo4boo450bo92bobo15b3o$ 2083boo36boo412bobo92bo15bo$2048boo71bobo112boo298boo92boo19boo$2048b oo73bo21boo89bo415bo$2010boo111boo20bo88bobo412b3o$2010bo71boo59bobo 88boo413bo$2008bobo67boobboo59boo$2008boo67bobo$2077bo12boo129boo$ 2076boo11bobo128bobo$2089bo130bo$2088boo129boo319boo100boo$2104boo433b obo101bo$2104bo434bo103bobo15boo$2105b3o430boo104boo15boo$2107bo565boo $2012boo76boo581bobo$2012bobo74bobo131boo450bo$2014bo74bo35boo15boo78b obo450boo$2014boo72boo34bobo15boo78bo$1985boo17boo118bo96boo332boo$ 1985bo18boo117boo430boo$1986b3o557boo$1988bo556bobo$2545bo$1994boo243b oo303boo$1994boo102boo139bobo420boo$2098boo7boo21bo110bo420bobo$2107bo 22b3o108boo421bo$2105bobo25bo530boo$2105boo4boo19boo$2089boo20bo15bo$ 2090bo18bobo15b3o$2004boo84bobo16boo19bo$2004bo86boo36boo430boo$2002bo bo226boo322boo4boo$2002boo227boo322boo$$2225bo426boo$2223b3o426boo$ 2126boo94bo333boo$2004boo120boo17boo75boo332boobboo$2004bo140boo95boo 316bobo$2002bobo11boo224bo305boo12bo$2002boo12bo223bobo305bobo11boo$ 2014bobo80boo47boo92boo308bo112boo$2010boobboo77boobboo47bo152bo250boo 90boo19bo$2010boo80bobo38boo12b3o149b3o232boo107bo17bobo$2092bo23boo 16bo14bo76boo74bo232bo107bobo15boo$2091boo23bo14b3o91bobo73boo229b3o 109boo4bo$2117b3o11bo93bo90boo214bo116bobo$2009boo108bo104boo90bo231b oo99bobo$2009boo4boo297bobo231bobo99bo10boo$2015boo286bo10boo234bo110b obo$2302bobo184bo60boo111bo$2302bobo184b3o171boo$2297boo4bo188bo155boo $2296bobo15boo175boo156bo$2229boo65bo17bobo169bo34bo124b3o$2014boo214b o64boo19bo167b3o32b3o124bo$2014bobo210b3o86boo165bo34bo$2016bo210bo 255boo33boo20boo$2016boo273boo180boo56boo7boo$2292bo181bo57bo$2292bobo 179bobo55bobo$2245boo46boo180boo4boo44boo4boo$2245bobo57boo173bobbo44b o20boo$2247bo57boo174boo45bobo18bo$2247boo244boo34boo16bobo$2493boo52b oo6$2237boo$2237boo78boo$2317bo161boo3boo32boo$2231bo83bobo162bo3bo20b oo11boo$2229b3o83boo160b3o5b3o18bo$2228bo248bo9bo15b3o35boo$2228boo 273bo37boobboo$2248boo295bobo$2248bo273boo23bo$2246bobo274bo23boo$ 2246boo272b3o$2520bo$$2232boo$2231bobo$2231bo$2230boo65boo15boo$2296bo bo15boo$2296bo25boo$2295boo25bo$2320bobo44bo$2320boo43b3o$2339boo23bo$ 2235boo103bo23boo$2236bo103bobo$2233b3o66bo38boobboo37bo$2233bo68b3o 40boo35b3o15bo9bo$2305bo75bo18b3o5b3o$2142boo139bo20boo62boo11boo20bo 3bo$2135boo5boo137b3o15bo68boo32boo3boo$2135boo143bo18b3o$2267boo11boo 20bo$2267boo32boo$2137boo17boo8boo$2137boo17bo9boo265boo$2131boo21bobo 276boo$2131boo21boo$2172boo165boo52boo$2172boo62boo21boo37boo38bobo16b oo34boo$2168boo66boo21bobo36boo17boo19bo18bobo45boo$2168boo72boo17bo 55boo18boo20bo44bobbo36boo$2242boo17boo90boo4boo44boo4boo31bo$2353bobo 55bobo28bobo$2318boo35bo57bo28boo$2173boo65boo76bo27boo7boo56boo$2173b oo65boo5boo56boo12b3o24boo20boo33boo$2247boo39boo16bo14bo47bo34bo24boo $2288bo14b3o60b3o32b3o24bobo$2267boo20b3o11bo62bo34bo26bo$2128boo138bo 22bo103boo30boo$2129bo135b3o127bo$2129bobo133bo130b3o$2130boo204boo60b o$2337bo$2337bobo$2338boo91boo$2166boo187bo74bobo$2166bo186b3o74bo$ 2167b3o182bo76boo$2169bo182boo$2153boo181boo$2152bobo182bo$2152bo171b oo11bobo$2151boo172bo12boo107boo$2131boo192bobo119bobo$2131boo14boo 177boobboo117bo$2123boo22bo182boo117boo$2124bo23b3o$2124bobo23bo145boo $2125boo169boo$2161boo168boo$2161boo162boo4boo$2298boo25boo$2168bo129b oo139boo$2143boo23b3o140boo126boo$2143bo8boo17bo139bo$2141bobo9bo16boo 13boo48boo72bobo121bo$2141boo10bobo30bo25bo23bo25bo46boo120b3o$2154boo 30bobo21b3o23bobo21b3o50boo115bo$2187boo20bo27boo20bo53boo115boo$2170b o38boo48boo58boo129boo$2168b3o149bo129bo$2167bo11bo49bo90bobo125bobo$ 2152bo14boo8b3o47b3o91boo125boo$2151bobo22bo49bo280bo$2152bo23boo35boo 11boo279b3o$2213boo85boo132boo74bo$2269boo29boo131bobo73boo$2269boo 162bo90boo$2140boo290boo90bo$2124boo14boo380bobo$2125bo22boo131bo229bo 10boo$2122b3o23bo7boo122bobo227bobo$2122bo23bobo6bobo123boo227bobo$ 2146boo7bo32boo48boo32boo231boo4bo$2154boo7boo23boo11boo35boo11boo20bo 48boo15boo163bobo15boo$2164bo36bo49bo21bobo46boo15bobo95boo65bo17bobo$ 2161b3o38b3o47b3o19boo65bo96bo64boo19bo$2161bo42bo49bo52boo32boo92b3o 86boo$2148boo157boo126bo$2148bo35boo48boo263boo$2146bobo11boo22bo27boo 20bo97bo167bo$2146boo12bo24b3o23bobo21b3o92b3o167bobo$2158bobo26bo23bo 25bo91bo123boo46boo$2154boobboo50boo117boo122bobo57boo$2154boo299bo57b oo$2455boo3$2153boo$2153boo4boo$2159boo$$2445boo$2298bo146boo78boo$ 2298b3o35boo187bo$2301bo34boo101bo83bobo$2158boo96boo42boo135b3o83boo$ 2158bobo96bo178bo$2160bo96bobo176boo$2160boo96boobboo67boo123boo$2262b oo67boo123bo$2335boo117bobo$2335boo117boo$$2291boo$2291boo36boo109boo$ 2314boo13boo108bobo$2314bobo122bo$2316bo121boo65boo15boo$2304boo10boo 186bobo15boo$2304bo199bo25boo$2256boo36boo9b3o195boo25bo$2255bobo16boo 19bo11bo220bobo$2255bo18bobo15b3o233boo$2254boo20bo15bo$2270boo4boo 165boo$2270bobo171bo$2272bo168b3o66bo$2263boo7boo167bo68b3o533bo$2263b oo248bo531bobo$2491bo20boo531boo$2489b3o15bo$2488bo18b3o$2475boo11boo 20bo$2475boo32boo$$2253boo$2254bo$2254bobo$2255boo$2444boo21boo37boo$ 2444boo21bobo36boo17boo$2450boo17bo55boo$2450boo17boo$2273boo$2273bo 252boo$2271bobo174boo76bo$2271boo175boo5boo56boo12b3o$2455boo39boo16bo 14bo$2496bo14b3o$2475boo20b3o11bo$2476bo22bo$2473b3o$2473bo6$2253boo 15boo$2252bobo15boo$2252bo25boo$2251boo25bo$2276bobo$2276boo4$2258bo$ 2258b3o$2261bo$2260boo4$2876bo$2874b3o$2873bo$2255boo616boo17bo$2256bo 633b3o11bo$2256bobo630bo14b3o$2257boo630boo16bo14bo$2906boo12b3o$2919b o$2271boo646boo$2271bobo$2273bo505boo$2273boo504boo137boo$2253boo504bo 139boo17boo$2253bo493bo11b3o137boo$2254b3o488b3o14bo$2256bo472bo14bo 16boo98boo$2729b3o12boo115boo$2262boo468bo$2262boo467boo$2902boo$2882b oo19bo$2732boo148bobo15b3o$2732boo17boo131bo15bo$2751boo131boo19boo$ 2906bo$2272boo515boo112b3o$2272bo516boo112bo$2270bobo$2270boo$2748boo$ 2748bo19boo$2749b3o15bobo$2751bo15bo128boo$2272boo471boo19boo129bo$ 2272bo78boo392bo151bobo15boo$2270bobo11boo66bo25bo367b3o149boo15boo$ 2270boo12bo67bobo21b3o11bo357bo$2282bobo68boo20bo14b3o$2278boobboo50b oo39boo16bo14bo$2278boo47boo5boo56boo12b3o$2327boo76bo535boo$2405boo 534boo$2754boo$2277boo50boo17boo404bo$2277boo4boo44boo17bo55boo329boo 15bobo$2283boo38boo21bobo36boo17boo329boo15boo200boo$2323boo21boo37boo 567bo$2916boo34bobo$2916bobo33boo$2918bo$2918boo$2282boo$2282bobo69boo 32boo544boo$2284bo69boo11boo20bo528bo15boo$2284boo81bo18b3o529b3o$ 2368b3o15bo534bo30boo$2370bo20boo527boo30bobo$2392bo341boo218bo$2350b oo37b3o341bobo218boo$2320boo28bo38bo343bo172boo$2321bo29b3o378boo172b oo$2321bobo29bo$2322boo619boo$2407boo534bobo$2383bo23bobo535bo$2383b3o 23bo535boo$2386bo22boo506boo$2385boo14boo493boo19bo$2401boo494bo17bobo $2744boo151bobo15boo$2744boo152boo4bo18boo$2756boo145bobo16bobo$2756bo bo144bobo16bo$2758bo145bo10boo4boo$2323boo433boo155bobo$2323boo14boo 576bo$2315boo22bo393boo182boo$2316bo23b3o391bo19boo146boo$2316bobo23bo 391bobo17bo148bo$2317boo416boo15bobo145b3o$2402boo343bo4boo146bo85bo$ 2402bobo341bobo235b3o$2404bo341bobo234bo$2404boo329boo10bo179boo54boo$ 2335boo397bobo190bobo38boo$2335bo398bo193bo40bo$2333bobo397boo234bobo$ 2333boo413boo220boo10bo$2386boo360bo232bobo$2385bobo361b3o229bobo$ 2385bo365bo230bo4boo$2384boo584boo15bobo$2969bobo17bo$2969bo19boo$ 2968boo$$2413boo578boo$2414bo25bo552bo$2394boo18bobo21b3o550bobo$2332b oo60boo7boo10boo20bo553boo$2316boo14boo69bo33boo540boo$2317bo22boo59bo bo575boo$2314b3o23bo60boo4boo48bo$2314bo23bobo44boo20bo47b3o19boo$ 2338boo46bo18bobo46bo21bobo$2386bobo16boo34boo11boo20bo11bo$2387boo52b oo32boo9b3o$2485bo$2485boo10boo$2340boo155bo$2340bo154bobo469boo$2338b obo11boo141boo13boo456bo$2338boo12bo119boo36boo456bobo$2350bobo119boo 495boo$2346boobboo64boo$2346boo68boo11boo85boo$2429bo86boo$2393boo35b 3o79boo$2389boobboo37bo79boo$2345boo41bobo$2345boo4boo35bo23boo467boo$ 2351boo34boo23bo27boo39boo397bobo$2413b3o23bobo40bo34boo362bo$2415bo 23bo39b3o35boo$2438boo39bo$2970boo15boo$2970boo15bobo$2350boo637bo$ 2350bobo636boo$2352bo$2352boo231bo$2583b3o$2557boo23bo$2558bo23boo$ 2510boo46bobo422bo$2510bo48boobboo37bo378b3o$2511b3o49boo35b3o15bo9bo 351bo$2513bo85bo18b3o5b3o351boo19boo$2424boo160boo11boo20bo3bo360bo15b o$2417boo5boo62boo96boo32boo3boo357b3o15bobo$2417boo69boo32boo459bo19b oo$2455boo65bo460boo$2454bobo46boo15bobo$2419boo33bo48boo15boo$2419boo 32boo569boo$2413boo47boo560boo$2413boo46bobo$2462bo94boo52boo373boo$ 2556bobo16boo34boo354boo17boo$2556bo18bobo45boo342boo$2450boo103boo20b o44bobbo$2450boo29boo88boo4boo44boo4boo$2481boo88bobo55bobo334boo$ 2573bo57bo335bo$2564boo7boo56boo331b3o12boo$2502boo60boo20boo33boo341b o14bo16boo$2501bobo83bo34bo357b3o14bo$2501bo82b3o32b3o360bo11b3o$2440b oo58boo82bo34bo374bo$2440bo53boo117boo399boo$2433boo6b3o50boo117bo400b oo$2433bo9bo46boo122b3o$2431bobo56bobo61boo60bo$2431boo59bo62bo$2422b oo68boo61bobo$2422boo55boo75boo$2479boo25boo$2506boo4boo$2512boo36boo$ 2477boo71bobo$2477boo73bo21boo$2439boo111boo20bo$2439bo71boo59bobo$ 2437bobo67boobboo59boo$2437boo67bobo$2506bo12boo$2505boo11bobo$2518bo$ 2517boo$2533boo$2533bo$2534b3o$2536bo$2441boo76boo$2441bobo74bobo$ 2443bo74bo35boo15boo$2443boo72boo34bobo15boo$2414boo17boo118bo$2414bo 18boo117boo$2415b3o$2417bo$$2423boo$2423boo102boo$2527boo7boo21bo$ 2536bo22b3o$2534bobo25bo$2534boo4boo19boo$2518boo20bo15bo$2519bo18bobo 15b3o$2433boo84bobo16boo19bo$2433bo86boo36boo$2431bobo$2431boo4$2555b oo$2433boo120boo17boo$2433bo140boo$2431bobo11boo$2431boo12bo$2443bobo 80boo47boo$2439boobboo77boobboo47bo28boo$2439boo80bobo38boo12b3o25boo$ 2521bo23boo16bo14bo$2520boo23bo14b3o$2546b3o11bo$2438boo108bo$2438boo 4boo169boo$2444boo169bo$2613bobo$2613boo3$2600boo$2443boo154bobo$2443b obo153bo$2445bo152boo$2445boo5$2602boo$2601bobo$2601bo$2600boo3$3001b 3o$3001bo$2618boo382bo$2618bobo$2620bo$2620boo7$2610boo$2610boo$$2604b o$2602b3o$2601bo$2601boo$2621boo$2621bo$2619bobo$2619boo$2678bo$2678b 3o$2605boo74bo$2604bobo73boo$2604bo90boo$2603boo90bo$2693bobo$2682bo 10boo$2681bobo$2681bobo$2676boo4bo$2675bobo15boo$2608boo65bo17bobo$ 2609bo64boo19bo$2606b3o86boo$2606bo$2670boo$2671bo$2671bobo$2624boo46b oo$2624bobo57boo$2626bo57boo$2626boo7$2616boo$2616boo78boo$2696bo$ 2610bo83bobo$2608b3o83boo$2607bo$2607boo$2627boo$2627bo$2625bobo$2625b oo3$2611boo$2610bobo$2610bo$2609boo65boo15boo$2675bobo15boo$2675bo25b oo$2674boo25bo$2699bobo$2699boo$$2614boo$2615bo$2612b3o66bo$2612bo68b 3o$2684bo$2662bo20boo$2660b3o15bo$2659bo18b3o$2646boo11boo20bo$2646boo 32boo6$2615boo21boo37boo$2615boo21bobo36boo17boo$2621boo17bo55boo$ 2621boo17boo$$2697boo$2619boo76bo$2619boo5boo56boo12b3o$2626boo39boo 16bo14bo$2667bo14b3o$2646boo20b3o11bo$2647bo22bo$2644b3o$2644bo!golly-2.5-src/Patterns/Life/Signal-Circuitry/heisenblinker-30.rle0000644000175100001440000000117312156145314021632 00000000000000#C p30 Heisenblinker device: Mike Playle, 26 September 2006 x = 68, y = 74, rule = B3/S23 47bo$45b3o$44bo$44boo5bo$51b3o$54bo$53boo4$39boo3boo$40b5o$40booboo11b o$40booboo10b3o$41b3o10b5o$53boo3boo$o$3o$3bo$bboo51b3o$55b3o$46bo$40b o3bobo11bo$39b3o3boo10bobo$38b5o13bo3bo$37bobobobo13b3o$37boo3boo11boo 3boo$50boo$3b5o3bobo36boo$bbob3obobbo3bo$3bo3bo5boobo$4b3o7bobo$5bo9bo 21boo$6boo4b3o23bo4bo$6bobo3boo21b3o4bo$6bobo3bo22bo6b3o10boo$7bo48bo$ 53b3o$53bo$4booboboo$4bo5bo$5bo3bo25boo$6b3o26bobo$27bo7bo$26boo$26bob o$21boo$21bobo$16boo4b3o$12b4obbo4b3o$7boo3b3oboo4b3o$7boo12bobo7boo$ 21boo8bobo$33bo$33boo17$65boo$65bobo$65bo!golly-2.5-src/Patterns/Life/Signal-Circuitry/heisenburp-30.rle0000644000175100001440000000403412156145314021153 00000000000000#C p30 Heisenburp, a pattern which can detect the passage of a glider #C without affecting the glider's path or timing. #C This pattern "photocopies" three gliders. The original three pass #C through unaffected. #C The name is a reference to the Heisenberg Uncertainty Principle, #C a principle in quantum physics which states that it is physically #C impossible to detect a particle without affecting it in some way. #C Clearly this is not the case in the Life universe! #C By David Bell. From Alan Hensel's "lifebc" pattern collection. x = 139, y = 157, rule = B3/S23 48boo$47bobo$46b3o$46boo$46boo$47bobo$48bo3$45boo3boo$45boo3boo$$47b3o $47b3o$48bo6boo23boo$56bo22bobo$56bobo5bobo11bo6boo$57boo5bobbo10bobbo bbobbo6boo$67boo9bo6boo6b3o$65bo3boo8bobo8boboo15bo$50bo16boo11boo8bo bbo8b3o4bobo$51boo11bobbo8bo13boboo16bobo$50boo12bobo10boo14b3obboobbo 7bobbo3boo$76boo16boobbo3bo7bobo4boo$45b3o51bobbo6bobo$44bo3bo50boo8bo $43bo5bo$43bo5bo$46bo10bobo14boo$43bo4bo9boo14boo7bobo5bo46bo$47bo10bo 25boo5bobo42b3o$46bo37bo6boo42bo$42bo92boo$42bobo$43bo$133bo$77boo5bo 46booboo$78bo4bo$50boo23b3o5b3o44bo5bo$49bobo23bo29boo$40boo3boo4bo10b oo41bo24booboboo$42b3o17bobo29bobo6bobo$41bo3bo18bo28bobbo6boo$42bobo 9boo8boo26boo41bo$43bo10boo28boo4boo3bo36bobbo$84boo6boo41bo$44b3o18bo 27bobbo34boo$44b3o18b3o26bobo34bo$68bo54boo6bobo$67boo19boo23boo8boo7b oo$80bo7boo24bo$42boo3boo32boo31bobo$43b5o32boo33boo15boo3boo$44b3o63b oo20bo5bo$45bo24bo38boo14bo$69b3o39bo8bo4bobo5bo3bo$69b3o47b3o3boo7b3o $107bo10boobbo$67boo3boo31b3o10booboo$67boo3boo30bo16b3o$82bo3bo17boo 13boboo$83boobobo29bobbo$45boo23bo11boobboo33bo$45boo22bobo46bobo$71b oo46bo$71boo$70b3o26boo3boo$69bobo27boo3boo23boo3boo$69boo54boo3b5o$ 101b3o20boo4booboo$101b3o22bo3booboo$102bo28b3o5$129b3o$129b3o$128bo3b o$127bo5bo$128bo3bo$99b3o27b3o$98bo3bo$97bo5bo$97bo5bo$100bo$97bo4bo$ 68b3o30bo$70bo29bo$69bo26bo$96bobo$97bo31boo$129boo3$104boo$103bobo3b oo$94boo3boo4bo3boo5boo$96b3o17bobo$95bo3bo18bo$96bobo9boo8boo$97bo10b oo$$98b3o$98b3o4$96boo3boo$46boo49b5o$45bobo50b3o$47bo51bo8$99boo$99b oo34$boo$obo$bbo! golly-2.5-src/Patterns/Life/Signal-Circuitry/heisenburp-46-natural.rle0000644000175100001440000000065512156145314022633 00000000000000#C Glider Flyby with glider Out of the Blue: #C p92 Conway-Space Natural Heisenburp Duplicator #C Brice Due, 8 January 2005 x = 46, y = 51, rule = B3/S23 8b6o5b4o$8b4o7b2obo$11b2obo7bo$13b2o5b2o2$13b2o5b2o$11b2obo7bo$8b4o7b 2obo12b2o$8b6o5b4o12b2o2$39bo$39bo4$41bo8$36b2o5b2o$35bo2bo3bo2bo$23b 2o11bo2bobo2bo$24b2o13bobo$23bo13b3ob3o$35b3o5b3o$35b2o7b2o$35b2o7b2o$ 36bob2ob2obo$36b3o3b3o$37bo5bo3$36b2o5b2o$36b2o5b2o11$2o$b2o$o! golly-2.5-src/Patterns/Life/Signal-Circuitry/heisenburp-46.rle0000644000175100001440000000422512156145314021164 00000000000000#C Period 46 pure Heisenburp device #C Detects and duplicates a stream of gliders without influencing it, #C even temporarily. The reaction used works for any period >= 35. #C Jason Summers, 29 Jun 1999; from "jslife" collection. x = 213, y = 209, rule = B3/S23 187boo$186booboo$187bobbo$160boo25bobbo4bo$150boo7bobo26boo5b3o$150boo 6boobo36bo$159boo27boo5b3o$160bo26bobbo4bo$187bobbo$160bo25booboo$159b oo18bo7boo$150boo6boobo15bobo$150boo7bobo16boo$160boo8$190bo$191bo$ 189b3o5$186bo$186boo$185bobo10$174boo$175boo$174bo$183boo$184bo$184bob o$185boo12boo$197boobbo$197b6o$197b4o4bo3bo$205b7o$163bo48bo$163boo40b 7o$162bobo32b4o4bo3bo$169b3o3bo21b6o$167b5obbobo20boobbo$171boo3bo22b oo$165boboo3bobbo$163b3oboo3b3o$162bo$163b3oboo3b3o$165boboo3bobbo13b oo$171boo3bo13bo$151boo14b5obbobo$152boo15b3o3bo10b3oboo$151bo34boobb oo$188b4o$184bobboboo$184bo3b3o$188boo$186bobo$186b3o3bo$193bo3bo$188b oo8bo12boo$140bo47bo5boobbo12boo$140boo46bobo5boo$139bobo38bo8boo3b3o$ 179bobo$179boo8boo3b3o$188bobo5boo$188bo5boobbo12boo$165b4o19boo8bo12b oo$141boo21b6o23bo3bo$140boob4o16boob4o22bo$141b6o17boo$142b4o$$131bo 47bo$130b3o45boboobo14bo$129boobo45bo4bo13boo$129b3o47bobo14b3obo9boo$ 129b3o51boo10boo13boo$130boo5b3o43boo11boo$137bo46bo12bo$138bo$197bo$ 196boo$195boo13boo$161boo14b3o16b3obo9boo$161boo12bo3bo17boo$115bo58bo 4bo18bo$114bobo57bo3bo$114bobo$113booboo31boo23bo3bo$149bobo22bo4bo$ 149bo11boo12bo3bo$161boo14b3o$187boo$187bobo$189bo$131bo5boo5boo43boo$ 130b3o4boo5boo$130boboo$113booboo13b3o$93bo18bo5bo12b3o$93boo36boo27b 3o$92bobo16bo7bo40bo$111bobbobobbo41bo$111b3o3b3o$137b3o3b3o$136bobbo 3bobbo$136boobo3boboo4$188boo9boo$172boo15boo8boo$172bobo10b5o$152boo 8b3o7bo12b4o$109bo5bo36boo8bo3bo$108b3o3b3o45bo4bo17b4o$107boobo3boboo 45bo3bo17b5o$123bo65boo8boo$124bo6bo31bo3bo20boo9boo$110bo3bo7b3o5b3o 29bo4bo$110bo3bo14boobo19boo8bo3bo$129b3o20boo8b3o$70bo58b3o7bo$70boo 58boo5boo$69bobo66boo8$119b3o7boo8b3o5b3o$118bo4bo4bobbo7bobbooboobbo$ 58boo57bo5bo4bobbo8b3o3b3o$59boo57bo8bo3bo9bo5bo$58bo60boo$127boboo$ 119boo6bobo$118bo8boo$105boo10bo5bo$105boo11bo4bo$119b3o8boobo6boo5boo $130boob3o4boo5boo$136bo$130boob3o$128bobbobo$128boo21$24bo$24boo$23bo bo10$12boo$13boo$12bo9$bo$boo$obo! golly-2.5-src/Patterns/Life/Signal-Circuitry/Herschel-conduit-stamp-collection.rle0000644000175100001440000014213712156145314025251 00000000000000#C Herschel conduit stamp collection in LifeHistory format, based on #C Karel Suhajda's herschel.lif (came with his Hersrch utility). #C #C F = forward, L = left, R = right, B = back, x = flipped output. #C #C Conduits are labeled with the number of ticks needed to produce #C the output. Numbers in parentheses are the conduit's recovery #C time. "pN" denotes a periodic conduit; oscillators are timed #C to work with the input Herschel. #C #C Ghost output Herschels are used to avoid interference with inputs. #C Ghost input Herschels are used only in conduits that interfere #C with the input before the standard 7-cell Herschel phase. #C In these cases, a reference pattern has been added under the #C label to show an alternate input object. In the case of the #C 'dependent conduit' variants, this is a 3-tick predecessor of #C a Herschel, so if you use this in a periodic conduit, you'll #C also have to rephase the oscillators by 3 ticks to match. #C #C When copying conduits out of the stamp collection, avoid #C selecting the gray cells from the bounding boxes -- these allow #C the stamp collection to be run without gliders from one conduit #C affecting the reactions in other conduits. There are also extra #C gray cells along the boundaries to suppress output Herschels; #C these may cause unexpected behavior if copied to other patterns. #C #C Dave Greene, 19 September 2010 x = 571, y = 760, rule = LifeHistory 52F46.91F42.96F.239F$F50.F46.F89.F42.F94.F.F237.F$F50.F46.F89.F42.F 94.F.F237.F$F50.F46.F89.F42.F94.F.F237.F$F50.F46.F89.F42.F94.F.F237.F $F50.F46.F89.F42.F94.F.F237.F$F7.8D35.F46.F32.8D49.F42.F44.10D40.F.F 111.10D116.F$F7.8D35.F46.F32.8D49.F42.F44.10D40.F.F111.10D116.F$F5.2D 17.2D24.F46.F32.2D6.2D47.F42.F44.2D48.F.F111.2D124.F$F5.2D17.2D24.F 46.F32.2D6.2D47.F42.F44.2D48.F.F111.2D124.F$F5.2D19.2D22.F46.F32.2D6. 2D47.F42.F44.2D48.F.F111.2D124.F$F5.2D19.2D22.F46.F32.2D6.2D47.F42.F 44.2D48.F.F111.2D124.F$F5.2D21.2D20.F46.F32.2D6.2D47.F42.F44.2D48.F.F 111.2D124.F$F5.2D21.2D20.F46.F32.2D6.2D47.F42.F44.2D48.F.F111.2D124.F $F5.2D13.12D4.2D6.2D4.F46.F32.8D6.2D6.2D33.F42.F44.6D44.F.F111.6D4.2D 6.2D106.F$F5.2D13.12D4.2D6.2D4.F46.F32.8D6.2D6.2D33.F42.F44.6D44.F.F 111.6D4.2D6.2D106.F$F5.2D3.6D12.2D8.2D2.2D6.F46.F32.2D6.2D6.2D2.2D35. F42.F44.2D48.F.F111.2D10.2D2.2D108.F$F5.2D3.6D12.2D8.2D2.2D6.F46.F32. 2D6.2D6.2D2.2D35.F42.F44.2D48.F.F111.2D10.2D2.2D108.F$F5.2D7.2D10.2D 12.2D8.F46.F32.2D6.2D8.2D37.F42.F44.2D48.F.F111.2D12.2D110.F$F5.2D7. 2D10.2D12.2D8.F46.F32.2D6.2D8.2D37.F42.F44.2D48.F.F111.2D12.2D110.F$F 5.2D7.2D8.2D12.2D2.2D6.F46.F32.2D6.2D6.2D2.2D35.F42.F44.2D48.F.F111. 2D10.2D2.2D108.F$F5.2D7.2D8.2D12.2D2.2D6.F46.F32.2D6.2D6.2D2.2D35.F 42.F44.2D48.F.F111.2D10.2D2.2D108.F$F7.7D22.2D6.2D4.F46.F32.8D6.2D6. 2D33.F42.F44.2D48.F.F111.2D8.2D6.2D106.F$F7.7D22.2D6.2D4.F46.F32.8D6. 2D6.2D33.F42.F44.2D48.F.F111.2D8.2D6.2D106.F$F50.F46.F89.F42.F94.F.F 237.F$F50.F46.F89.F42.F94.F.F237.F$F50.F46.F89.F42.F94.F.F237.F$F50.F 46.F89.F42.F94.F.F237.F$F50.F46.F89.F42.F94.F.F237.F$52F46.91F42.96F. 239F$F50.F46.F35.F53.F42.F94.F.F77.F69.F89.F$F50.F46.F35.F53.F42.F94. F.F77.F69.F89.F$F50.F46.F2.D4.D4.D.D.D18.F53.F42.F2.D2.D4.D.D81.F.F2. D.D.D2.D.D.D63.F2.D.D.D3.D.D11.D.D42.F2.D2.D.D.D2.D.D74.F$F50.F46.F5. D3.D25.F53.F42.F8.D85.F.F77.F69.F89.F$F50.F46.F2.D9.D22.F53.F42.F2.D 2.D88.F.F5.D6.D64.F5.D3.D3.D9.D3.D41.F2.D2.D9.D73.F$F50.F46.F9.D25.F 53.F42.F8.D52.A32.F.F42.A34.F47.A21.F55.2A32.F$F49.2F46.F2.D4.D4.D.D 20.2F52.F42.F2.D2.D4.D50.3A30.F.F4.D6.D30.3A32.F4.D5.D.D3.D.D5.D.D42. F2.D2.D.D6.D15.2A24.A32.F$F50.F46.F16.D18.F53.F42.F8.D3.D51.A29.F.F 45.A31.F20.D24.A.3A19.F9.D21.A13.2A6.3A33.F$F50.F46.F2.D2.D29.F53.F 42.F2.D2.D57.2A29.F.F3.D6.D33.2A11.2A11.C6.F3.D5.D3.D2.D6.D3.D19.2A.A 8.A9.F2.D12.D15.A.A11.2A6.A35.F$F50.F46.F16.D18.F33.A19.F42.F8.D3.D 81.F.F57.2A9.3C6.F20.D26.A.2A6.3A9.F9.D22.2A55.F$F41.E8.F46.F2.D2.D.D .D2.D.D20.F8.C23.A.A18.F42.F2.D2.D4.D83.F.F3.D6.D57.C.D6.F3.D6.D.D3.D .D5.D.D21.3A.A3.A12.F2.D2.D.D4.D.D74.F$F41.E.E6.F46.F35.F6.D.C23.A.A 18.F42.F94.F.F68.C8.F56.2A11.F89.F$F41.3E6.F46.F35.F6.3C9.2A11.2A.3A 16.F42.F94.F.F77.F16.D33.A18.F89.F$F43.E6.F46.F35.F6.C11.2A17.A15.F 42.F94.F.F77.F54.A14.F82.C6.F$F50.F46.F35.F10.A20.2A.3A16.F42.F94.F.F 77.F16.D24.A11.A.A13.F80.3C6.F$F50.F46.F35.F12.A18.2A.A18.F42.F94.F.F 43.E32.2F41.3A10.2A2.2A9.F63.2A15.C.D6.F$F50.F46.F35.F53.F42.F93.2F.F 43.E.E31.F44.A13.2A9.F32.E30.2A15.C8.F$F39.A3.2A5.F46.F35.F13.A39.F 42.F94.F.F43.3E31.F31.2A10.2A24.F32.E.E54.F$F3.D3.D.D.D2.D.D.D3.D15.A .A3.A5.F46.F3.D3.D4.D.D4.D.D3.D9.F15.A37.F42.F3.D3.D2.D.D4.D.D4.D69.F .F3.D3.D.D.D2.D.D.D3.D22.E31.F3.D3.D4.D8.D3.D6.A36.F3.D5.D.D4.D5.D9. 3E54.F$F37.A.A3.A6.F46.F10.D6.D17.F53.F42.F53.E40.F.F77.F10.D3.D17.A. A21.A12.F7.D6.D3.D15.E54.F$F2.D4.D9.D5.D13.A4.A7.F46.F2.D4.D18.D8.F 53.F42.F2.D4.D5.D2.D3.D4.D27.E.E29.C8.F.F2.D4.D9.D5.D53.F2.D4.D11.D.D 4.D6.2A34.F2.D20.D64.2F$F36.2A5.3A4.F46.F10.D6.D17.F53.F42.F53.3E29.C .D6.F.F77.F10.D3.D43.A10.F7.D6.D3.D70.F$F2.D4.D.D6.D6.D21.A4.F46.F2.D 4.D4.D6.D6.D8.F53.F42.F2.D4.D4.D4.D.D5.D29.E29.3C6.F.F2.D4.D.D6.D6.D 53.F2.D4.D9.D3.D4.D35.C6.F2.D6.D13.D36.2A27.F$F11.D38.F46.F10.D3.D2.D 3.D13.F53.F42.F87.C6.F.F11.D65.F10.D3.D45.3C6.F7.D3.D2.D3.D41.A28.F$F 2.D12.D7.D26.F46.F2.D4.D18.D8.F42.2A9.F42.F2.D4.D5.D2.D3.D4.D68.F.F2. D12.D7.D34.2A17.F2.D4.D9.D.D.D4.D33.C.D6.F2.D20.D17.2A3.2A13.A27.F$F 11.D38.F46.F10.D3.D2.D3.D13.F42.2A9.F42.F94.F.F11.D46.A.A16.F10.D3.D 45.C8.F7.D3.D2.D3.D23.A3.A13.2A27.F$F3.D3.D.D5.D6.D27.F46.F3.D3.D4.D 6.D5.D9.F53.F42.F3.D3.D2.D.D4.D.D4.D69.F.F3.D3.D.D5.D6.D37.A16.F3.D3. D4.D8.D3.D43.F3.D5.D6.D5.D16.3A5.3A39.F$F50.F46.F35.F15.E37.F42.F94.F .F60.2A15.F33.E35.F39.A9.A39.F$F50.F46.F35.F15.E.E35.F42.F78.2A14.F.F 77.F33.E.E33.F89.F$52F46.F35.F15.3E35.F42.F72.2A5.A14.F.F77.F33.3E32. 2F89.F$F50.F46.F35.F17.E35.F42.F72.A.A.3A15.F.F77.F35.E11.2A20.F89.F$ F50.F46.F35.F53.F42.F65.2A7.A.A17.F.F77.F47.A21.F89.F$F50.F46.F35.F 29.2A22.F42.F65.2A7.2A18.F.F77.F48.3A18.F89.F$F50.F46.F35.F29.A23.F 42.F94.F.F77.F50.A18.91F$F49.2F46.F35.F30.3A20.F42.F94.F.79F69.F89.F$ F50.F46.F35.F32.A20.F42.F94.F.F77.F69.F89.F$F50.F46.F35.F53.F42.F94.F .F77.F69.F2.D2.D.D.D3.D.D73.F$F50.F46.F35.F53.F42.F94.F.F2.D.D.D2.D.D .D63.F69.F89.F$F41.E8.F46.F35.F53.F42.96F.F77.F69.F2.D2.D6.D3.D72.F$F 41.E.E6.F46.F35.F53.F42.F94.F.F5.D6.D64.71F89.F$F41.3E6.F46.F35.F53.F 42.F94.F.F42.A34.F69.F2.D2.D.D5.D.D46.A4.2A20.F$F43.E6.F46.91F42.F2.D 2.D4.D.D10.D.D68.F.F4.D6.D30.3A32.F69.F9.D51.A.A2.A.A7.2A11.F$F50.F 46.F35.F53.F42.F8.D85.F.F45.A31.F2.D2.D4.D58.F2.D9.D3.D43.A2.4A9.A12. F$F50.F46.F35.F53.F42.F2.D2.D16.D3.D67.F.F3.D6.D33.2A11.2A11.C6.F8.D 3.D56.F9.D50.A.A4.A6.A.A12.F$F50.F46.F4.D6.D6.D16.F53.F42.F8.D40.A2.A 41.F.F57.2A9.3C6.F2.D2.D63.F2.D2.D.D5.D.D42.3A.2A2.2A6.2A13.F$F39.A3. 2A5.F46.F2.D3.D2.D3.D2.D3.D14.F53.F42.F2.D2.D4.D4.D.D5.D.D27.A40.F.F 3.D6.D57.C.D6.F8.D3.D30.D25.F57.A31.F$F38.A.A3.A5.F46.F35.F53.F42.F8. D3.D6.D34.2A38.F.F68.C8.F2.D2.D4.D30.D27.F54.A2.4A.2A25.F$F38.2A3.A6. F46.F6.D6.D6.D14.F53.F42.F2.D2.D9.D6.D3.D21.A.2A6.A35.F.F77.F12.D32.D 23.F54.3A3.A.2A25.F$F3.D3.D.D.D2.D.D.D3.D19.A7.F46.F4.D6.D6.D16.F53.F 42.F8.D3.D6.D28.A2.A3.A38.F.F77.F2.D2.D37.D25.F57.A31.F$F38.5A.A5.F 46.F35.F53.F42.F2.D2.D4.D4.D.D5.D.D21.A3.A.3A38.F.F77.F12.D33.A22.F 56.2A31.F$F2.D4.D9.D5.D14.A4.2A5.F46.F2.D6.D6.D18.F19.A33.F42.F46.A 11.A2.A32.F.F43.E32.2F2.D2.D2.D.D35.3A20.F89.F$F39.3A8.F46.F35.F10.2A 5.3A7.2A24.F42.F15.D33.3A.A3.A3.3A30.F.F43.E.E31.F49.A19.F89.F$F2.D4. D.D6.D6.D17.A.2A5.F46.F2.D.D.D2.D.D.D2.D.D.D14.F11.A4.A10.A25.F42.F 49.A3.A2.A7.A29.F.F43.3E31.F48.2A19.F3.D3.D2.D.D.D4.D.D3.D63.F$F11.D 30.A.A5.F46.F35.F11.A.A3.A10.A24.F42.F15.D30.A6.2A.A6.2A29.F.F3.D5.D. D2.D.D4.D23.E31.F69.F17.D71.F$F2.D12.D7.D26.F46.F35.F12.A.A3.A8.2A24. F42.F49.2A43.F.F7.D55.2A12.F69.F2.D4.D5.D12.D62.F$F11.D38.F46.F35.F 13.A3.2A17.A6.A9.F42.F51.A42.F.F2.D14.D4.D37.2A2.A2.2A8.F69.F17.D71.F $F3.D3.D.D5.D6.D27.F46.F35.2F33.3A5.A.A8.F42.F52.A2.A38.F.F7.D52.2A.A 3.A9.F69.F2.D4.D4.D6.D6.D55.C6.F$F50.F46.F35.F33.A8.A.A8.F42.F3.D3.D 4.D6.D5.D68.F.F2.D6.D6.D5.D40.A.A.A9.F69.F17.D3.D58.3C6.F$F50.F46.F 35.F33.2A6.2A.3A6.F42.F10.D3.D2.D3.D72.F.F7.D3.D48.2A.A.2A10.F3.D5.D 4.D.D3.D3.D44.F2.D4.D3.D14.D53.C.D6.F$52F46.F35.F47.A5.F42.F2.D4.D18. D67.F.F2.D14.D4.D31.2A4.A2.A13.F7.D3.D57.F17.D3.D58.C8.F$F50.F46.F3.D 5.D4.D.D.D2.D3.D9.F8.C15.2A15.2A.3A6.F42.F14.D2.D3.D72.F.F7.D3.D42.2A 6.2A13.F2.D14.D2.D4.D43.F3.D3.D3.D7.D5.D27.E35.F$F50.F46.F7.D3.D23.F 6.D.C15.2A15.2A.A8.F42.F2.D4.D4.D13.D66.2F.F3.D5.D4.D.D4.D55.F11.D57. F53.E.E33.F$F50.F46.F2.D14.D3.D4.D8.F6.3C44.F42.F17.D3.D72.F.F77.F2.D 6.D6.D3.D4.D7.D35.F53.3E33.F$F50.F46.F11.D23.F6.C46.F42.F2.D4.D2.D15. D67.F.F77.F31.D37.F55.E32.2F$F49.2F46.F2.D6.D6.D4.D4.D8.F10.A42.F42.F 17.D3.D31.E40.F.F77.F2.D4.D9.D2.D4.D9.D33.F89.F$F50.F46.F35.F12.A40.F 42.F3.D3.D2.D.D.D4.D5.D27.E.E29.C8.F.F77.F33.D35.F68.2A19.F$F50.F46.F 2.D4.D7.D5.D4.D8.F46.2A5.F42.F53.3E29.C.D6.F.F.F.F.F.F.F.F.F.F.F.F.F. F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F3.D3.D.D.D2.D. D3.D3.D11.A32.F62.2A4.A.A18.F$F50.F46.F35.F13.A32.A6.F42.F55.E29.3C6. F.F77.F36.3A30.F63.A6.A18.F$F41.E8.F46.F3.D3.D.D.D3.D5.D3.D9.F15.A28. A.A6.F42.F87.C6.F.F77.F39.A29.F60.3A7.2A17.F$F41.E.E6.F46.F35.F44.2A 7.F42.F94.F.F77.F38.2A29.F60.A28.F$F41.3E6.F46.F35.F53.F42.F94.F.F77. F69.F89.F$F43.E6.F46.F35.F53.F42.F94.F.F77.F42.D26.F89.F$F50.F46.F35. F53.F42.F94.F.F42.A34.F69.F89.F$F50.F46.F35.F53.F42.F78.2A14.F.F42.3A 32.F44.D24.F89.F$F50.F46.F35.F53.F42.F72.2A5.A14.F.F45.A31.F40.E28.F 89.F$F50.F46.F35.F53.F42.F72.A.A.3A15.F.F44.2A11.2A11.C6.F40.E.E3.D 22.91F$F33.A.2A13.F46.F35.F12.E40.F42.F65.2A7.A.A17.F.F57.2A9.3C6.F 40.3E26.F89.F$F31.3A.2A13.F46.F35.F12.E.E38.F42.F65.2A7.2A18.F.F68.C. D6.F42.E2.D2.D20.F89.F$F3.D5.D.D2.D3.D11.A19.F46.F35.F12.3E38.F42.F 94.F.F68.C8.F69.F2.D2.D.D.D4.D.D72.F$F7.D23.3A.2A13.F46.F35.F14.E20. 2A16.F42.F94.F.F77.F47.D2.D18.F12.D76.F$F2.D11.D4.D13.2A2.A12.F46.F 35.F35.A17.F42.F94.F.F77.F69.F2.D5.D80.F$F7.D28.2A12.F46.F35.F24.2A 10.A16.F42.F94.F.F77.F41.2A6.D2.D16.F12.D50.2A24.F$F2.D6.D4.D4.D30.F 46.F35.F24.2A2.2A5.2A16.F42.F94.F.F43.E32.2F40.A.A26.F2.D4.D6.D48.2A 24.F$F7.D3.D38.F46.F35.F28.A.A22.F42.96F.F43.E.E31.F40.A10.D2.D14.F 12.D3.D72.F$F2.D11.D4.D30.F46.F35.F30.A22.F42.F94.F.F43.3E31.F39.2A 28.F2.D3.D43.2A37.F$F7.D3.D38.F46.F35.F30.2A21.F42.F94.F.F45.E22.2A7. F37.D15.D2.D12.F12.D3.D17.D16.A37.F$F3.D5.D4.D3.D31.F46.F35.F53.F42.F 2.D2.D2.D.D.D81.F.F67.A.A7.F69.F2.D3.D7.D17.D18.A.A35.F$F50.F46.F35.F 53.F42.F94.F.F60.2A.A3.A9.F35.D2.D16.D2.D10.F36.D15.2A35.F$F50.F46.F 35.F53.F42.F2.D2.D5.D82.F.F60.2A.3A.A9.F69.F34.D54.F$52F46.F35.F53.F 42.F65.2A27.F.F66.A10.F36.D12.2A6.D4.C6.F38.D50.F$F50.F46.F35.F53.F 42.F2.D2.D4.D55.A27.F.F60.2A.2A12.F44.2A3.2A9.3C6.F36.D10.2A40.F$F50. F46.F35.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F42.F 53.A11.A28.F.F54.2A5.A.A13.F44.2A14.C.D6.F39.A7.2A40.F$F50.F46.F35.F 53.F42.F2.D2.D3.D43.3A9.2A27.F.F54.2A5.A.A13.F60.C8.F39.3A47.F$F50.F 46.F35.F53.F42.F56.A37.F.F62.A14.F69.F42.A46.F$F49.2F46.F35.F53.F42.F 2.D2.D3.D33.2A10.2A36.2F.F77.F43.2A24.F3.D5.D6.D5.D18.2A46.F$F50.F46. F35.F53.F42.F44.A49.F.F77.F44.A4.2A18.F7.D3.D2.D3.D70.F$F50.F46.F35.F 53.F42.F44.A.A47.F.F77.F41.3A5.2A17.2F2.D20.D9.2A54.F$F50.F46.F35.F9. 2A8.A33.F42.F45.2A47.F.F77.F41.A27.F7.D3.D6.D15.A54.F$F41.E8.F46.F35. F7.3A.A5.3A7.2A24.F42.F68.2A15.C8.F.F77.F69.F2.D6.D6.D6.D10.A.A37.2A 13.F$F41.E.E6.F46.F35.F6.A4.A4.A10.A25.F42.F68.2A15.C.D6.F.79F69.F11. D23.2A38.A13.F$F41.3E6.F46.F35.F6.2A3.A.A3.A10.A24.F42.F85.3C6.F.F77. F69.F2.D11.D8.D51.A.A11.F$F43.E6.F46.F35.F12.A.A3.A8.2A24.F42.F87.C6. F.F77.F69.F11.D64.A.A10.F$F50.F46.F35.F13.A3.2A17.A6.A9.F42.F3.D5.D.D 2.D.D3.D73.F.F2.D.D.D2.D.D.D13.D49.F69.F3.D3.D.D4.D.D.D3.D54.A3.2A6.F $F50.F46.F35.2F33.3A5.A.A8.F42.F7.D86.F.F77.71F81.2A6.F$F50.F46.F35.F 33.A8.A.A8.F42.F2.D14.D3.D23.E48.F.F5.D6.D12.D.D49.F69.F89.F$F50.F46. F35.F33.2A6.2A.3A6.F42.F7.D37.E.E46.F.F42.A34.F69.F89.F$F34.2A14.F46. F35.F47.A5.F42.F2.D6.D6.D4.D23.3E46.F.F4.D6.D4.D.D4.D3.D14.3A32.F2.D 2.D4.D58.F35.E53.F$F35.A14.F46.F35.F8.C15.2A15.2A.3A6.F42.F7.D3.D35.E 11.2A33.F.F20.D24.A31.F8.D3.D56.F35.E.E31.2A11.C6.F$F3.D5.D.D2.D.D4.D 10.3A15.F46.F35.F6.D.C15.2A15.2A.A8.F42.F2.D14.D3.D37.A34.F.F3.D6.D5. D6.D.D.D16.2A11.2A11.C6.F2.D2.D63.F35.3E31.2A9.3C6.F$F7.D24.A17.F46.F 35.F6.3C44.F42.F7.D3.D48.3A31.F.F20.D36.2A9.3C6.F8.D3.D45.A10.F37.E 42.C.D6.F$F2.D14.D4.D27.F46.F35.F6.C46.F42.F3.D5.D4.D.D3.D41.A31.F.F 3.D6.D5.D.D8.D40.C.D6.F2.D2.D4.D45.3A10.F80.C8.F$F7.D42.F46.F35.F10.A 42.F42.F94.F.F68.C8.F12.D42.A13.F47.2A8.2A30.F$F2.D6.D6.D5.D27.F46.F 35.F12.A40.F42.F94.F.F16.D60.F2.D2.D49.2A12.F47.2A2.2A5.A30.F$F7.D3.D 38.F46.F35.F46.2A5.F42.F94.F.F77.F12.D25.2A19.2A8.F51.A.A.3A31.F$F2.D 14.D4.D27.F46.F35.F13.A32.A6.F42.F94.F.F16.D60.F2.D2.D2.D.D28.A19.2A 8.F53.A.A32.2F$F7.D3.D38.F46.F35.F15.A28.A.A6.F42.F94.F.F43.E32.2F39. A.A27.F53.2A4.2A28.F$F3.D5.D4.D.D4.D28.F46.F35.F44.2A7.F42.96F.F43.E. E31.F40.2A27.F58.A.A4.2A22.F$F50.F46.F35.F53.F42.F94.F.F43.3E31.F61.A 7.F58.A6.2A22.F$F50.F46.F35.F53.F42.F94.F.F3.D3.D.D.D4.D5.D22.E11.D 19.F60.A.A6.F57.2A30.F$52F46.F35.F53.F42.F2.D4.D.D4.D.D77.F.F14.D3.D 36.D21.F61.A7.F89.F$F50.F46.F35.F53.F42.F5.D6.D81.F.F2.D4.D15.D35.D 17.F62.3A4.F89.F$F50.F46.F35.F53.F42.F2.D91.F.F18.D38.D19.F64.A4.F89. F$F50.F46.F35.F53.F42.F5.D6.D40.A40.F.F2.D4.D.D6.D6.D53.F3.D3.D4.D6.D .D3.D43.F89.F$F50.F46.F35.F12.E40.F42.F2.D4.D6.D79.F.F11.D50.D14.F10. D3.D2.D22.E28.F89.F$F50.F46.F35.F12.E.E38.F42.F5.D3.D2.D3.D77.F.F2.D 11.D8.D36.D.D14.F2.D4.D18.D13.E.E26.91F$F50.F46.F35.F12.3E38.F42.F2.D 91.F.F11.D40.3A6.2D14.F10.D3.D2.D22.3E26.F89.F$F49.2F46.F35.F14.E20. 2A16.F42.F5.D3.D2.D3.D48.2A27.F.F3.D3.D.D4.D.D.D3.D42.D11.F2.D4.D4.D 6.D6.D15.E18.2A6.F89.F$F50.F46.F35.F35.A17.F42.F2.D4.D6.D51.A27.F.F 51.A3.A21.F14.D2.D3.D39.2A6.F2.D2.D.D.D2.D.D.D11.D.D58.F$F50.F46.F35. F24.2A10.A16.F42.F65.A28.F.F51.A3.A8.D2.D9.F2.D4.D18.D42.F26.D62.F$F 50.F46.F35.F24.2A2.2A5.2A16.F42.F65.2A27.F.F77.F14.D2.D3.D47.F2.D5.D 6.D73.F$F41.E8.F46.F35.F28.A.A22.F42.F94.F.F51.A3.A10.D2.D7.F3.D3.D2. D.D6.D5.D43.F26.D31.2A29.F$F41.E.E6.F46.F35.F30.A22.F42.F93.2F.F47.2A .A.3A.A.2A17.F69.F2.D4.D6.D4.D.D6.D28.A.A29.F$F41.3E6.F46.F35.F30.2A 21.F42.F3.D3.D2.D2.D.D.D3.D14.E57.F.F48.A.A5.A.A9.D2.D5.F69.F23.D2.D 3.D26.A31.F$F43.E6.F46.F35.F53.F42.F36.E.D55.F.F47.A2.A.A.A.A2.A17.F 53.A15.F2.D3.D6.D5.D35.2A.4A27.F$F50.F46.F35.F53.F42.F2.D4.D2.D2.D8.D 13.3E.2A52.F.F47.2A2.2A.2A2.2A10.D6.F55.A13.F23.D2.D3.D20.2A.A3.A2.A 27.F$F50.F46.F35.F53.F42.F38.E.2A26.2A15.C8.F.F77.F69.F2.D3.D6.D5.D.D 6.D22.2A.A.A5.2A25.F$F50.F46.F35.F53.F42.F2.D4.D2.D2.D.D6.D45.2A15.C. D6.F.F77.F56.A12.F54.A4.3A2.A24.F$F50.F46.F35.F53.F42.F17.D67.3C6.F.F 77.F58.A10.F19.D28.2A4.A.2A4.2A.A23.F$F3.D5.D.D4.D5.D27.F46.F35.F.F.F .F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F.F42.F2.D4.D2.D11.D 64.C6.F.F77.F49.2A11.C6.F48.2A5.A3.A.A3.A23.F$F7.D6.D3.D9.2A.A18.F46. F35.F53.F42.F17.D76.F.F77.F44.2A3.2A9.3C6.F19.D28.2A6.3A3.3A24.F$F2.D 20.D4.A.2A18.F46.F35.F53.F42.F3.D3.D2.D2.D.D5.D72.F.79F44.2A14.C.D6.F 48.A9.A.A.A26.F$F7.D6.D3.D31.F46.F35.F53.F42.F94.F.F77.F60.C8.F47.A.A 9.3A12.2A13.F$F2.D6.D6.D6.D26.F46.F35.F53.F42.F38.2A54.F.F77.F69.F48. A.A.3A5.A14.A13.F$F7.D3.D6.D31.F46.F35.F53.F42.F37.A.A38.2A14.F.F2.D. D.D2.D.D.D9.D.D.D49.F43.2A24.F3.D3.D3.D.D5.D.D3.D23.A.4A20.A.A11.F$F 2.D20.D26.F46.F35.F14.A.2A35.F42.F37.A41.A14.F.F77.F44.A4.2A18.F17.D 32.A25.A.A10.F$F7.D3.D6.D31.F46.F35.F10.2A2.2A2.A34.F42.F36.2A25.2A 11.3A15.F.F5.D6.D10.D53.F41.3A5.2A17.2F2.D4.D2.D3.D11.D50.A3.2A6.F$F 3.D5.D4.D.D5.D27.F46.F35.F9.A.A5.A.A33.F42.F8.2A.D22.D28.2A11.A17.F.F 42.A34.F41.A27.F17.D63.2A6.F$F50.F46.F35.F9.A2.5A.A8.2A24.F42.F7.3A.C AD80.F.F4.D6.D4.D.D4.D.D16.3A32.F69.F2.D4.D3.D.D5.D6.D62.F$F50.F46.F 35.F7.A.A6.A10.A25.F42.F8.2A.3C.2A5.F9.D2.D58.F.F20.D6.D17.A31.F69.F 17.D3.D57.A9.F$52F46.F35.F7.2A3.2A3.A10.A24.F42.F7.3A.2AD.2A32.2A43.F .F3.D6.D5.D27.2A11.2A11.C6.F69.F2.D4.D2.D3.D11.D62.F$98.F35.F12.A.A3. A8.2A24.F42.F7.2A21.D2.D16.A43.F.F20.D6.D29.2A9.3C6.F69.F17.D3.D55.A 4.C6.F$98.F35.F13.A3.2A17.A6.A9.F42.F47.3A44.F.F3.D6.D5.D.D4.D.D42.C. D6.F69.F3.D3.D3.D.D5.D5.D54.3C6.F$98.F35.2F33.3A5.A.A8.F42.F31.D15.A 46.F.F68.C8.71F75.A4.C.D6.F$98.F35.F33.A8.A.A8.F42.F14.D.D42.2A33.F.F 16.D60.F69.F80.C8.F$98.F35.F33.2A6.2A.3A6.F42.F59.A34.F.F77.F69.F89.F $98.F35.F47.A5.F42.F17.D42.3A31.F.F16.D60.F2.D2.D4.D13.D44.F50.E38.F$ 98.F35.F8.C15.2A15.2A.3A6.F42.F62.A31.F.F43.E32.2F8.D3.D9.D3.D42.F50. E.E36.F$98.F35.F6.D.C15.2A15.2A.A8.F42.F7.D.D.D4.D77.F.F43.E.E31.F2.D 2.D63.F50.3E35.2F$98.F35.F6.3C44.F42.F94.F.F43.3E31.F8.D3.D13.D26.A 15.F52.E36.F$98.F35.F6.C46.F42.F17.D76.F.F3.D3.D.D.D2.D.D.D3.D22.E11. D19.F2.D2.D4.D4.D.D6.D44.F89.F$98.F35.F10.A42.F42.F94.F.F55.D21.F12.D 6.D49.F89.F$98.F35.F12.A40.F42.F14.D.D77.F.F2.D4.D6.D8.D35.D17.F2.D2. D9.D6.D46.F89.F$98.F35.F46.2A5.F42.F94.F.F57.D19.F12.D6.D27.A21.F89.F $98.F35.F13.A32.A6.F42.96F.F2.D4.D.D4.D.D6.D53.F2.D2.D2.D.D4.D.D4.D.D .D20.A21.F65.5A19.F$98.F35.F15.A28.A.A6.F42.F94.F.F11.D6.D43.D14.F38. 2A7.A21.F47.5A11.3A.A.3A17.F$98.F35.F44.2A7.F42.F94.F.F2.D20.D36.D.D 14.F15.D23.A29.F45.3A.A.3A8.A4.A4.A16.F$98.F35.F53.F42.F94.F.F11.D6.D 42.2D14.F39.A.A27.F44.A4.A4.A3.2A.A.2A.A2.2A.A16.F$98.F35.F53.F42.F2. D2.D.D.D2.D42.D38.F.F3.D3.D.D4.D.D5.D29.3A10.D11.F15.D24.2A27.F44.A. 2A2.A.2A.A.A.A.A.A3.2A2.A17.F$98.F35.F53.F42.F53.D40.F.F47.2A2.A.A.A 2.2A17.F69.F45.A2.2A3.A.A.2A2.A.A2.A2.2A18.F$98.F35.F53.F42.F2.D5.D3. D44.D7.A28.F.F47.A3.A3.A3.A4.D2.D9.F69.F46.2A2.A2.A.A5.A.A4.A20.F$98. F35.F53.F42.F55.D9.3A26.F.F48.3A2.A2.3A18.F69.F48.A4.A.A6.2A.4A20.F$ 98.F35.F53.F42.F2.D4.D4.D46.D8.A25.F.F66.D2.D7.F3.D3.D4.D6.D.D3.D43.F 48.4A.2A9.A24.F$98.F35.F12.E40.F42.F57.D9.2A25.F.F43.2A.3A4.A4.3A.2A 13.F10.D3.D2.D51.F52.A11.A.A22.F$98.F35.F12.E.E38.F42.F2.D3.D5.D47.A 33.F.F44.A.A2.2A.A.A.2A2.A.A5.D8.F2.D4.D18.D42.F50.A.A12.2A22.F$98.F 35.F12.3E38.F42.F60.3A30.2F.F44.A2.A5.A5.A2.A14.F10.D3.D2.D22.E28.F 50.2A37.F$98.F35.F14.E20.2A16.F42.F2.D3.D5.D50.A30.F.F45.2A13.2A15.F 2.D4.D4.D6.D6.D13.E.E26.F89.F$98.F35.F35.A17.F42.F62.2A30.F.F77.F14.D 2.D3.D18.3E26.F89.F$98.F35.F24.2A10.A16.F42.F94.F.F77.F2.D4.D18.D15.E 26.F89.F$98.F35.F24.2A2.2A5.2A16.F42.F85.C8.F.F77.F14.D2.D3.D47.F89.F $98.F35.F28.A.A22.F42.F59.2A24.C.D6.F.F77.F3.D3.D2.D.D6.D5.D43.F89.F$ 98.F35.F30.A22.F42.F60.A24.3C6.F.F77.F69.91F$98.F35.F30.2A21.F42.F60. A.A24.C6.F.79F69.F$98.F35.F53.F42.F61.2A31.F.F77.F69.F$98.F35.F53.F 42.F3.D4.D6.D4.D.D.D2.D66.F.F77.F69.F$98.F35.F53.F42.F6.D3.D2.D3.D76. F.F2.D.D.D2.D.D.D11.D.D49.F53.A15.F$98.F35.F53.F42.F2.D20.D4.D26.A38. F.F23.D53.F55.A13.F$98.F35.F53.F42.F10.D6.D37.3A36.F.F5.D6.D64.F69.F$ 98.91F42.F2.D5.D6.D6.D5.D29.A35.F.F23.D18.A34.F56.A12.F$231.F57.2A35. F.F4.D6.D4.D.D6.D16.3A32.F58.A10.F$231.F2.D3.D6.D7.D6.D65.F.F20.D2.D 3.D17.A31.F49.2A11.C6.F$231.F94.F.F3.D6.D5.D27.2A11.2A11.C6.F44.2A3. 2A9.3C6.F$231.F3.D2.D.D.D2.D.D.D3.D5.D66.F.F20.D2.D3.D29.2A9.3C6.F44. 2A14.C.D6.F$231.F94.F.F3.D6.D5.D.D6.D42.C.D6.F60.C8.F$231.F94.F.F68.C 8.F69.F$231.F94.F.F16.D60.F43.2A24.F$231.F56.E37.F.F77.F44.A4.2A18.F$ 231.F56.E.E35.F.F16.D60.F41.3A5.2A17.2F$231.F56.3E35.F.F43.E32.2F41.A 27.F$231.F58.E35.F.F43.E.E31.F69.F$231.F94.F.F43.3E31.F69.F$231.F65. 2A27.F.F3.D3.D.D.D6.D3.D22.E11.D19.F69.F$231.F66.A27.F.F55.D21.F69.F$ 231.F63.3A28.F.F2.D4.D8.D.D4.D35.D17.F69.F$231.F63.A30.F.F57.D19.71F$ 231.F94.F.F2.D4.D.D4.D3.D4.D53.F69.F$231.F94.F.F11.D38.2A10.D14.F69.F $231.F94.F.F2.D11.D.D.D4.D26.2A8.D.D14.F2.D2.D4.D58.F$231.F94.F.F11.D 49.2D14.F8.D3.D56.F$231.F94.F.F3.D3.D.D8.D3.D42.D11.F2.D2.D63.F$231. 96F.F50.3A24.F8.D3.D25.2A29.F$231.F94.F.F45.2A2.A.2A11.D2.D9.F2.D2.D 4.D28.A13.2A14.F$231.F94.F.F45.2A2.2A26.F12.D26.A.A11.2A14.F$231.F4.D 4.D4.D.D11.D.D63.F.F49.2A15.D10.F2.D2.D34.2A27.F$231.F2.D3.D5.D13.D 67.F.F77.F12.D56.F$231.F9.D84.F.F77.F2.D2.D2.D.D58.F$231.F6.D5.D13.D 25.2A40.F.F77.F69.F$231.F4.D4.D4.D4.D.D6.D23.A.A39.F.F77.F60.2A7.F$ 231.F12.D3.D6.D2.D3.D23.A39.F.F77.F60.2A7.F$231.F2.D6.D9.D30.4A.2A37. F.79F69.F$231.F12.D3.D6.D2.D3.D19.A4.A.A36.F.F77.F40.E28.F$231.F2.D.D .D2.D4.D4.D.D6.D19.2A2.2A.A.A36.F.F77.F40.E.E26.F$231.F47.A2.2A3.A.2A 35.F.F2.D.D.D2.D.D.D9.D.D.D49.F40.3E26.F$231.F19.D26.A.2A2.2A.A.A2.A 33.F.F77.F3.D5.D.D4.D5.D19.E26.F$231.F46.A4.A4.A2.2A33.F.F5.D6.D13.D 50.F7.D6.D3.D50.F$231.F19.D27.3A.A.3A9.2A27.F.F42.A34.F2.D20.D45.F$ 231.F49.2A.2A12.A27.F.F4.D6.D4.D.D6.D16.3A32.F7.D6.D3.D50.F$231.F65.A 28.F.F20.D24.A31.F2.D6.D13.D45.F$231.F65.2A27.F.F3.D6.D5.D7.D19.2A11. 2A11.C6.F7.D3.D2.D3.D50.F$231.F3.D3.D3.D.D5.D.D3.D68.F.F20.D36.2A9.3C 6.F2.D20.D45.F$231.F17.D75.2F.F3.D6.D5.D.D5.D43.C.D6.F7.D3.D2.D3.D35. A3.A10.F$231.F2.D4.D2.D3.D11.D67.F.F68.C8.F3.D5.D6.D5.D46.F$231.F17.D 76.F.F16.D60.F56.A12.F$231.F2.D4.D3.D.D5.D6.D67.F.F77.F69.F$231.F17.D 3.D46.2A15.C8.F.F16.D60.F54.A3.A10.F$231.F2.D4.D2.D3.D11.D41.2A15.C.D 6.F.F43.E32.2F49.2A11.C6.F$231.F17.D3.D63.3C6.F.F43.E.E31.F44.2A3.2A 9.3C6.F$231.F3.D3.D3.D.D5.D5.D61.C6.F.F43.3E31.F44.2A14.C.D4.F.F$231. F94.F.F3.D3.D.D.D4.D.D3.D22.E11.D19.F60.C8.F$231.F94.F.F14.D40.D21.F 69.F$231.F42.E51.F.F2.D4.D15.D35.D17.F43.2A24.F$231.F42.E.E49.F.F14.D 42.D19.F44.A4.2A18.F$231.F42.3E33.2A14.F.F2.D4.D.D6.D6.D53.F41.3A5.2A 18.F$231.F44.E34.A14.F.F11.D2.D3.D17.2A24.D14.F41.A27.F$231.F76.3A15. F.F2.D20.D13.A22.D.D14.F69.F$231.F76.A17.F.F11.D2.D3.D15.3A8.A15.2D 14.F69.F$231.F94.F.F3.D3.D.D6.D5.D11.A2.3A3.3A2.A16.D11.F69.F$231.F 94.F.F36.A2.A2.A3.3A2.5A21.F69.F$231.F57.5A32.F.F37.A.A.A.2A4.3A.A.3A 6.D2.D9.F69.F$231.F39.5A11.3A.A.3A30.F.F34.3A.A2.A.A.4A4.A4.A18.71F$ 231.F37.3A.A.3A8.A4.A4.A29.F.F34.A3.A.2A.A.A3.4A.2A.2A7.D2.D7.F$231.F 36.A4.A4.A3.2A.A.2A.A2.2A.A29.F.F38.A.A2.A2.A.A.A.A.A22.F$231.F36.A. 2A2.A.2A.A.A.A.A.A3.2A2.A30.F.F37.2A.3A.A2.A2.A.A.A13.D8.F$231.F37.A 2.2A3.A.A.2A2.A.A2.A2.2A31.F.F38.A.A6.4A.2A23.F$231.F38.2A2.A2.A.A5.A .A4.A33.F.F38.A2.6A4.A25.F$231.F40.A4.A.A6.2A.4A33.F.F37.2A4.A2.A2.A. A25.F$231.F40.4A.2A9.A37.F.F49.2A26.F$231.F44.A11.A.A35.F.F77.F$231.F 42.A.A12.2A35.F.F77.F$231.F42.2A50.F.F77.F$231.F94.F.F77.F$231.F94.F. F77.F$231.F94.F.79F$231.F94.F$231.96F11$160F.242F.96F.70F$F158.F.F 240.F.F94.F.F68.F$F158.F.F240.F.F94.F.F68.F$F158.F.F240.F.F94.F.F68.F $F158.F.F240.F.F94.F.F68.F$F158.F.F240.F.F94.F.F68.F$F74.2D82.F.F103. 2D135.F.F41.8D45.F.F22.8D38.F$F74.2D82.F.F103.2D135.F.F41.8D45.F.F22. 8D38.F$F74.2D82.F.F103.2D135.F.F41.2D6.2D43.F.F22.2D6.2D36.F$F74.2D 82.F.F103.2D135.F.F41.2D6.2D43.F.F22.2D6.2D36.F$F74.2D82.F.F103.2D 135.F.F41.2D6.2D43.F.F22.2D6.2D36.F$F74.2D82.F.F103.2D135.F.F41.2D6. 2D43.F.F22.2D6.2D36.F$F74.2D82.F.F103.2D135.F.F41.2D6.2D43.F.F22.2D6. 2D36.F$F74.2D82.F.F103.2D135.F.F41.2D6.2D43.F.F22.2D6.2D36.F$F74.2D 82.F.F103.2D12.2D6.2D113.F.F41.8D45.F.F22.8D6.2D6.2D22.F$F74.2D82.F.F 103.2D12.2D6.2D113.F.F41.8D45.F.F22.8D6.2D6.2D22.F$F74.2D82.F.F103.2D 14.2D2.2D115.F.F41.4D49.F.F22.4D12.2D2.2D24.F$F74.2D82.F.F103.2D14.2D 2.2D115.F.F41.4D49.F.F22.4D12.2D2.2D24.F$F74.2D82.F.F103.2D16.2D117.F .F41.2D2.2D47.F.F22.2D2.2D12.2D26.F$F74.2D82.F.F103.2D16.2D117.F.F41. 2D2.2D47.F.F22.2D2.2D12.2D26.F$F74.2D82.F.F103.2D14.2D2.2D115.F.F41. 2D4.2D45.F.F22.2D4.2D8.2D2.2D24.F$F74.2D82.F.F103.2D14.2D2.2D115.F.F 41.2D4.2D45.F.F22.2D4.2D8.2D2.2D24.F$F74.10D74.F.F103.10D4.2D6.2D113. F.F41.2D6.2D43.F.F22.2D6.2D4.2D6.2D22.F$F74.10D74.F.F103.10D4.2D6.2D 113.F.F41.2D6.2D43.F.F22.2D6.2D4.2D6.2D22.F$F158.F.F240.F.F94.F.F68.F $F158.F.F240.F.F94.F.F68.F$F158.F.F240.F.F94.F.F68.F$F158.F.F240.F.F 94.F.F68.F$F158.F.F240.F.F94.F.F68.F$160F.242F.96F.70F$F69.F66.F21.F. F75.F10.F54.F20.F66.F10.F.F94.F.F68.F$F69.F88.F.F86.F75.F77.F.F94.F.F 68.F$F2.D4.D6.D.D11.D.D38.F88.F.F86.F3.D.D.D2.D.D10.D.D.D47.F77.F.F4. D.D6.D80.F.F4.D6.D6.D49.F$F5.D3.D2.D13.D42.F2.D2.D.D.D4.D.D71.F.F86.F 75.F3.D.D7.D9.D2.D.D.D46.F.F2.D91.F.F2.D3.D2.D3.D2.D3.D47.F$F2.D66.F 12.D75.F.F4.D.D2.D.D.D9.D.D60.F6.D6.D9.D51.F77.F.F11.D.D80.F.F68.F$F 5.D3.D2.D13.D32.A2.A6.F2.D2.D82.F.F2.D53.2A.2A2.2A21.F75.F2.D3.D4.D.D 9.D2.D50.F.F2.D73.2A16.F.F6.D2.D3.D6.D25.2A20.F$F2.D11.D4.D.D6.D30.A 9.F12.D58.D2C14.F.F9.D16.D30.A.A2.A.A3.2CD15.F5.D6.D3.D.D4.D.D21.2CD 25.F59.2CD15.F.F4.D4.D3.D62.2A5.2A9.F.F4.D13.D24.2A2.A20.F$F5.D3.D2.D 3.D6.D2.D3.D27.A4.A5.F2.D2.D.D6.D57.C15.F.F2.D53.A3.2A7.C16.F20.D6.D 20.C26.F3.D.D3.D3.D2.D.D4.D2.D.D31.C16.F.F2.D3.D76.2A9.F.F9.D3.D27.3A .2A6.A14.F$F2.D16.D25.F11.A.A2.2A5.F9.D2.D3.D53.3C15.F.F4.D4.D.D4.D.D 6.D31.2A.A8.3C14.F4.D8.D2.D31.3C24.F20.D9.D29.3C14.F.F9.D.D.D80.F.F2. D13.D23.A10.3A14.F$F5.D3.D2.D3.D6.D2.D3.D24.2A.A10.F2.D85.F.F2.D3.D6. D6.D37.A.A2.A22.F20.D6.D47.F2.D3.D2.D.D.D2.D6.D53.F.F2.D3.D87.F.F9.D 3.D27.3A.2A3.A17.F$F2.D4.D6.D4.D.D6.D40.F9.D2.D3.D71.F.F16.D9.D30.A2. A.A.A21.F4.D5.D.D3.D.D4.D.D20.A28.F20.D9.D46.F.F4.D8.D67.2A11.F.F2.D. D.D4.D4.D.D.D22.A.2A3.2A16.F$F69.F2.D2.D.D6.D73.F.F2.D3.D6.D6.D34.A2. 3A.2A22.F59.A15.F3.D.D7.D2.D.D4.D2.D.D48.F.F81.2A11.F.F68.F$F19.D35.A 2.A10.F88.F.F4.D4.D.D4.D.D4.D.D29.3A28.F16.D28.A11.5A13.F77.F.F87.2A 5.F.F68.F$F57.2A10.F88.F.F58.A27.F43.A12.A5.A12.F16.D60.F.F87.2A5.F.F 68.F$F19.D30.D2C16.F88.F.F16.D40.2A18.A8.F16.D39.A.2A2.A12.F77.F.F94. F.F68.F$F51.C17.F88.F.F76.2A8.F42.A12.2A.A.A.3A.A8.F16.D60.F.F94.F.F 55.2A11.F$F49.3C17.F88.F.F16.D69.F60.A4.2A8.F77.F.F94.F.F55.A12.F$F 69.F88.F.F74.3A2.A6.F59.2A.2A11.F77.F.F67.E26.F.F53.A.A12.F$F3.D3.D6. D6.D3.D43.F88.F.F76.A.A.A5.F4.D3.D4.D6.D5.D30.2A.A.A.5A6.F77.F.F3.D5. D.D2.D3.D48.E.E24.F.F3.D5.D6.D4.D3.D27.2A13.F$F69.F3.D5.D.D4.D5.D65.F .F77.A2.A5.F11.D3.D2.D3.D33.A.A.A8.A5.F3.D5.D.D4.D5.D54.F.F7.D59.3E 24.F.F7.D3.D2.D3.D49.F$F2.D4.D4.D.D4.D.D4.D42.F7.D6.D3.D69.F.F3.D3.D. D.D2.D.D.D3.D55.2A6.F3.D4.D18.D27.2A.2A.4A3.2A5.F7.D6.D3.D58.F.F2.D 11.D4.D49.E24.F.F2.D18.D4.D41.F$F69.F2.D20.D64.F.F56.E29.F15.D2.D3.D 32.A3.A5.A9.F2.D20.D53.F.F7.D86.F.F11.D2.D3.D49.F$F2.D4.D2.D3.D2.D3.D 4.D42.F7.D10.D69.F.F2.D4.D9.D5.D32.E.E27.F3.D4.D4.D13.D27.A7.2A10.F7. D6.D3.D58.F.F2.D6.D4.D4.D74.F.F2.D6.D11.D4.D41.F$F58.2A9.F2.D6.D6.D6. D64.F.F56.3E12.2A13.F18.D3.D32.A7.2A10.F2.D6.D13.D53.F.F7.D3.D82.F.F 14.D3.D49.F$F2.D4.D2.D.D.D2.D.D.D4.D12.E18.A.A8.F7.D3.D58.2A16.F.F2.D 4.D.D6.D6.D34.E11.A2.A2.2A8.F3.D4.D2.D15.D27.A3.A5.A9.F7.D3.D2.D3.D 42.2A14.F.F2.D11.D4.D49.2A.2A20.F.F2.D4.D13.D4.D8.E32.F$F39.E.E18.A8. F2.D11.D8.D46.2A16.F.F11.D58.A.A4.A8.F18.D3.D12.E19.2A.2A.4A3.2A5.F2. D20.D37.2A14.F.F7.D3.D56.A.A.A.A19.F.F14.D3.D16.E.E30.F$F3.D3.D6.D6.D 3.D13.3E18.2A7.F7.D3.D76.F.F2.D12.D7.D47.A5.A.2A5.F4.D3.D2.D.D.D4.D5. D8.E.E18.A.A.A8.A5.F7.D3.D2.D3.D58.F.F3.D5.D4.D3.D49.A.A2.A20.F.F3.D 3.D.D.D4.D4.D3.D9.3E30.F$F41.E27.F3.D5.D4.D.D.D3.D38.2A.A23.F.F11.D 62.2A.A.A6.F35.3E19.2A.A.A.5A6.F3.D5.D6.D5.D45.A.2A5.F.F67.2A.A8.3C 12.F.F37.E30.F$F69.F61.A.2A23.F.F3.D3.D.D5.D6.D51.A2.A2.A5.F37.E21.2A .2A11.F68.2A.A5.F.F66.A3.2A7.C14.F.F54.2A12.F$F69.F79.2A7.F.F71.A4.A 2.2A5.F60.A4.2A8.F77.F.F67.A.A2.A.A3.2CD13.F.F54.2A12.F$F69.F79.A8.F. F71.5A10.F55.2A.A.A.3A.A8.F77.F.F66.2A.2A2.2A19.F.F68.F$F69.F77.A.A8. F.F86.F56.A.2A2.A12.F77.F.F94.F.F68.F$F69.F77.2A9.F.F73.2A.A9.F56.A5. A12.F77.F.F94.F.F68.F$F69.F88.F.F73.A.2A9.F49.2A6.5A13.F77.F.F94.F.F 68.F$F69.F62.A25.F.F86.F49.A9.A15.F77.F.F94.F.F68.F$F69.F62.3A23.F.F 86.F50.3A22.F66.A10.F.F85.F8.F.F68.F$F69.F53.A11.A22.F.F86.F52.A22.F 65.A.A9.F.96F.F68.F$F69.F53.3A8.2A14.A7.F.F86.F75.F66.2A9.F.F94.F.F 32.A.2A32.F$F39.A2.A26.F56.A22.A.A6.F.F86.F75.F14.D43.E18.F.F94.F.F 32.2A.A32.F$F39.A29.F55.2A23.A7.F.88F75.F14.D.D41.E.D16.F.F4.D.D6.D 80.F.F53.2A13.F$F38.A4.A25.F88.F.F72.F13.F75.F15.3D40.3E16.F.F2.D91.F .F41.2A9.A2.A2.2A8.F$F37.A.A2.2A25.F88.F.F86.F75.F15.3D42.E16.F.F11.D .D80.F.F41.2A9.A.A4.A8.F$F35.2A.A30.F88.F.F4.D.D2.D.D.D13.D58.F75.F 77.F.F2.D56.D16.2A16.F.F53.A5.A.2A5.F$F49.2A18.F88.F.F2.D83.F75.F77.F .F4.D4.D3.D62.2A5.2A9.F.F56.2A.A.A6.F$F49.2A2.2A14.F88.F.F9.D15.D.D 58.F75.F77.F.F2.D3.D51.D2.D21.2A9.F.F56.A2.A2.A5.F$F35.A2.A8.2A.A2.2A 14.F88.F.F2.D50.2A.2A2.2A24.F75.F77.F.F9.D.D.D80.F.F53.A4.A2.2A5.F$F 37.2A8.3A19.F54.E20.2A11.F.F4.D4.D.D4.D.D4.D3.D26.A.A2.A.A3.2CD18.F 75.F9.2A6.2A34.2A6.2A14.F.F2.D3.D53.D33.F.F53.5A10.F$F69.F54.E.E18.A. A10.F.F2.D3.D6.D6.D32.A3.2A7.C19.F75.F7.A4.A2.A4.A30.A4.A2.A4.A12.F.F 4.D8.D48.2A17.2A11.F.F68.F$F69.F54.3E20.A10.F.F16.D6.D.D.D26.2A.A8.3C 17.F75.F7.A4.A2.A4.A30.A4.A2.A4.A12.F.F63.A17.2A11.F.F51.7A10.F$F48. 2A19.F56.E11.2A7.2A9.F.F2.D3.D6.D6.D34.A.A2.A25.77F7.A4.A2.A4.A30.A4. A2.A4.A12.F.F63.A.A21.2A5.F.F51.A2.A2.A10.F$F48.2A19.F68.A11.D7.F.F4. D4.D.D4.D.D8.D26.A2.A.A.A24.F57.F17.F9.2A6.2A34.2A6.2A14.F.F64.2A21. 2A5.F.F49.A.A16.F$F69.F69.3A16.F.F52.A2.3A.2A25.F75.F77.F.F68.D25.F.F 49.2A17.F$F69.F71.A7.D2.D5.F.F16.D35.3A20.2A9.F75.F77.F.F94.F.F68.F$F 69.F88.F.F55.A18.A2.A.2A5.F2.D.D.D2.D.D12.D.D48.F77.F.F70.D23.F.F68.F $F69.F81.D2.D3.F.F16.D37.2A17.A.A.A.2A5.F22.D52.F77.F.F67.E26.F.F68.F $F69.F88.F.F75.A.A8.F5.D6.D62.F77.F.F3.D3.D2.D.D.D2.D.D4.D42.E.E2.D 21.F.F68.F$71F83.D4.F.F72.A2.A.A.2A5.F22.D27.2CD22.79F.F67.3E24.F.F 68.F$F49.F19.F88.F.F72.2A3.A.A6.F4.D6.D3.D.D6.D26.C23.F67.F9.F.F2.D4. D2.D9.D4.D43.E4.D19.F.F41.3C24.F$F69.F88.F.F3.D4.D.D4.D5.D54.A3.A5.F 19.D2.D3.D24.3C21.F77.F.F72.D21.F.F43.C24.F$F69.F88.F.F6.D6.D3.D55.A 2.A.2A6.F3.D8.D2.D59.F77.F.F2.D4.D2.D.D6.D5.D50.D17.F.F42.D2C23.F$F2. D2.D4.D58.90F.F2.D19.D49.A.A.A.A7.F19.D2.D3.D22.A25.F2.D2.D.D7.D9.D2. D.D.D44.F.F14.D59.D19.F.F68.F$F8.D3.D56.F61.F26.F.F6.D6.D3.D35.E18.2A 2.A.A7.F3.D5.D.D3.D.D6.D50.F77.F.F2.D4.D12.D4.D52.D15.F.F68.F$F2.D2.D 63.F88.F.F2.D5.D13.D30.E.E20.2A8.F48.A26.F2.D5.D4.D.D9.D2.D48.F.F14.D 61.D17.F.F68.F$F12.D41.D2C12.F88.F.F6.D3.D2.D3.D35.3E12.2A16.F15.D30. A28.F60.2CD14.F.F3.D3.D2.D.D4.D.D4.D69.F.F68.F$F2.D2.D4.D44.C13.F2.D 2.D.D.D4.D.D71.F.F2.D19.D32.E11.A2.A2.2A11.F75.F2.D4.D3.D3.D2.D.D4.D 2.D.D30.C15.F.F79.3C12.F.F68.F$F53.3C13.F12.D75.F.F6.D3.D2.D3.D49.A.A 4.A2.A8.F15.D29.A29.F22.D9.D28.3C13.F.F79.C14.F.F37.F30.F$F2.D2.D2.D 60.F2.D2.D82.F.F3.D4.D6.D5.D46.A5.A.A.A7.F75.F2.D5.D2.D.D.D2.D6.D13. 2A6.2A28.F.F78.2CD13.F.70F$F69.F12.D53.D2C19.F.F71.2A.A2.A8.F61.2A12. F22.D9.D5.A2.A4.A2.A27.F.F94.F$F2.D2.D2.D.D.D56.F2.D2.D.D6.D52.C20.F. F71.A2.A11.F60.A2.A11.F2.D2.D.D7.D2.D.D4.D2.D.D7.A2.A4.A2.A27.F.F94.F $F69.F9.D2.D3.D48.3C20.F.F68.A4.A12.F3.D3.D4.D6.D5.D34.A.A.A10.F38.A 2.A4.A2.A27.F.F94.F$F69.F2.D85.F.F68.5A13.F10.D3.D2.D3.D37.2A.A.A10.F 18.D20.2A6.2A28.F.F94.F$F69.F9.D2.D3.D71.F.F86.F2.D4.D18.D32.A3.A.2A 8.F36.A40.F.F94.F$F69.F2.D2.D.D6.D73.F.F70.2A.A12.F14.D2.D3.D38.2A.A 2.A8.F18.D58.F.F85.F8.F$F69.F88.F.F70.A.2A12.F2.D4.D4.D13.D32.A2.A.A. A.2A5.F77.F.96F$F69.F88.F.F86.F17.D3.D37.2A.A.A.A2.A5.F51.2A24.F.F94. F$F69.F88.F.F86.F2.D4.D2.D15.D11.E21.A6.2A6.F50.A.A24.F.F94.F$F3.D3.D .D.D3.D.D4.D46.F88.F.F86.F17.D3.D16.E.E19.A.5A8.F3.D5.D6.D5.D27.A26.F .F2.D4.D6.D79.F$F69.F88.F.F86.F3.D3.D2.D.D.D4.D5.D12.3E20.A4.A8.F7.D 3.D2.D3.D30.2A26.F.F5.D3.D2.D3.D77.F$F2.D4.D6.D3.D4.D45.F88.F.F86.F 40.E21.4A9.F2.D20.D53.F.F2.D91.F$F69.F88.F.88F63.A11.F7.D3.D2.D3.D36. A21.F.F5.D3.D2.D3.D45.2A30.F$F2.D4.D.D5.D.D5.D45.F3.D5.D.D2.D.D.D3.D 65.F.F74.F11.F61.A13.F2.D6.D13.D30.A.A20.F.F2.D4.D51.2A2.A30.F$F11.D 41.2A14.F7.D80.F.F86.F61.2A12.F11.D2.D3.D35.2A21.F.F9.D2.D3.D40.3A.2A 31.F$F2.D11.D3.D4.D20.2A7.2A14.F2.D11.D8.D64.F.F4.D.D2.D.D.D9.D.D.D 58.F75.F2.D20.D53.F.F2.D53.A37.F$F11.D33.A23.F7.D80.F.F2.D83.F52.2A 21.F11.D2.D3.D29.2A27.F.F9.D2.D3.D36.A2.4A.2A31.F$F3.D3.D.D5.D.D4.D 22.A.A21.F2.D6.D4.D.D6.D64.F.F9.D13.D62.F52.A22.F3.D3.D.D6.D5.D26.A 27.F.F2.D2.D.D6.D38.3A3.A.2A31.F$F40.2A4.2A21.F7.D3.D6.D46.2A14.D6.F. F2.D52.2A.2A2.2A22.F53.3A19.F49.A.A25.F.F56.A37.F$F41.A20.2A5.F2.D20. D41.2A14.2D5.F.F4.D4.D.D4.D.D4.D.D30.A.A2.A.A3.2CD16.F55.A19.F50.2A 25.F.F55.2A26.2A9.F$F41.A.A18.A6.F7.D3.D6.D61.D.D5.F.F2.D3.D6.D6.D6.D 27.A3.2A7.C17.F75.F77.F.F83.A10.F$F42.2A16.A.A6.F3.D5.D4.D.D5.D33.2A. A28.F.F16.D39.2A.A8.3C15.F75.F77.F.F81.A.A10.F$F60.2A7.F56.A.2A17.D 10.F.F2.D3.D6.D6.D6.D29.A.A2.A23.F75.F77.F.F81.2A11.F$F69.F79.D8.F.F 4.D4.D.D4.D.D4.D.D30.A2.A.A.A22.F75.F77.F.F94.F$F69.F75.D12.F.F54.A2. 3A.2A23.F75.F77.F.F94.F$F69.F77.D10.F.F16.D37.3A19.2A8.77F70.2A5.F.F 3.D3.D4.D4.D.D.D3.D68.F$F69.F73.D14.F.F57.A17.A2.A7.F58.F16.F50.E19. 2A5.F.F10.D3.D79.F$F69.F75.D12.F.F16.D39.2A16.A4.A6.F75.F50.E.E24.F.F 2.D4.D12.D5.D58.2A.A5.F$F42.E26.F57.A13.D16.F.F73.A6.A5.F75.F50.3E24. F.F10.D3.D70.A.2A5.F$F42.E.E24.F57.3A13.D14.F.F73.A6.A5.F2.D.D.D2.D.D 10.D.D.D48.F52.E24.F.F2.D4.D11.D6.D67.F$F42.3E24.F48.A11.A8.D18.F.F 74.A4.A6.F75.F67.2A8.F.F10.D3.D37.E25.2A14.F$F44.E24.F48.3A8.2A10.D3. A12.F.F3.D5.D.D4.D5.D52.A2.A7.F5.D6.D12.D49.F67.2A8.F.F2.D4.D10.D7.D 25.E.E23.2A14.F$F69.F51.A15.D6.A.A11.F.F7.D6.D3.D57.2A8.F51.2CD21.F 77.F.F10.D3.D37.3E39.F$F54.2A13.F50.2A17.D5.A12.F.F2.D20.D62.F4.D6.D 3.D.D6.D27.C22.F77.F.F3.D3.D4.D5.D6.D28.E39.F$F54.2A2.2A9.F88.F.F7.D 6.D3.D36.E30.F19.D32.3C20.F77.F.F94.F$F58.A.A8.F88.F.F2.D6.D13.D31.E. E28.F3.D8.D2.D7.D51.F77.F.F94.F$F60.A8.F88.F.F7.D3.D2.D3.D36.3E12.2A 14.F19.D30.A24.F77.F.F61.2A3.2A26.F$F60.2A7.F72.2A14.F.F2.D20.D33.E 11.A2.A2.2A9.F3.D5.D.D3.D.D5.D51.F58.2A17.F.F62.A3.A27.F$F69.F72.A.A 13.F.F7.D3.D2.D3.D50.A.A4.A2.A6.F49.A25.F59.A17.F.F59.3A5.3A24.F$F69. F74.A13.F.F3.D5.D6.D5.D47.A5.A.A.A5.F15.D31.A27.F56.3A18.F.F59.A9.A 24.F$F69.F49.E24.2A12.F.F73.2A.A2.A6.F75.F56.A20.F.F69.A.A22.F$F69.F 49.E.E18.2A16.F.F73.A2.A9.F15.D30.A28.F77.F.F70.2A22.F$F69.F49.3E18.A 17.F.F70.A4.A10.F75.F77.F.F94.F$71F51.E11.2A6.3A14.F.F70.5A11.F62.A 12.F77.F.F94.F$F49.F19.F63.A9.A14.F.F86.F61.A.A11.F77.F.F94.F$F69.F 64.3A21.F.F72.2A.A10.F3.D3.D4.D6.D.D3.D35.A.A11.F77.F.F94.F$F69.F66.A 21.F.F72.A.2A10.F10.D3.D2.D42.2A.A.A9.79F.F94.F$F2.D2.D4.D12.D.D43.F 88.F.F86.F2.D4.D18.D33.A2.2A.A8.F67.F9.F.F77.3C14.F$F8.D3.D56.F88.F.F 86.F14.D2.D43.2A3.A8.F77.F.F77.C16.F$F2.D2.D16.D3.D42.F88.F.F86.F2.D 4.D4.D6.D6.D33.A2.4A.A6.F77.F.F76.2CD15.F$F12.D41.D2C12.F88.F.F86.F 17.D3.D38.2A.A3.A.A5.F2.D2.D.D7.D9.D2.D.D.D44.F.F94.F$F2.D2.D4.D4.D.D 5.D.D29.C13.F88.F.F86.F2.D4.D2.D15.D12.E21.A4.A2.A5.F77.F.F94.F$F19.D 33.3C13.90F.88F17.D3.D17.E.E16.A2.A.2A.A.A6.F2.D5.D4.D.D9.D2.D48.F.F 94.F$F2.D2.D2.D6.D6.D3.D42.F52.F35.F.F53.F32.F3.D3.D2.D.D.D4.D5.D13. 3E16.3A.A3.A.2A5.F60.2CD14.F.F94.F$F19.D49.F88.F.F86.F41.E20.A2.2A2.A 5.F2.D4.D3.D3.D2.D.D4.D2.D.D30.C15.F.F94.F$F2.D2.D2.D.D.D2.D.D5.D.D 43.F88.F.F4.D.D2.D.D.D9.D.D.D58.F58.2A.A.2A2.A7.F22.D9.D28.3C13.F.F 83.F10.F$F69.F2.D4.D.D2.D9.D2.D.D.D58.F.F2.D83.F57.A2.2A.A.2A8.F2.D5. D2.D.D.D2.D6.D13.2A6.2A28.F.96F$F15.D53.F5.D82.F.F9.D16.D59.F58.A6.A 9.F22.D9.D5.A2.A4.A2.A5.A3.A17.F.F94.F$F69.F2.D9.D9.D2.D62.F.F2.D31. 2A.2A2.2A43.F57.2A.2A.A.A.A7.F2.D2.D.D7.D2.D.D4.D2.D.D7.A2.A4.A2.A27. F.F94.F$F15.D53.F5.D51.D2C28.F.F4.D4.D.D4.D.D6.D9.A.A2.A.A3.2CD37.F 53.2A2.A2.A2.2A.A.A6.F38.A2.A4.A2.A7.A19.F.F2.D4.D6.D79.F$F69.F2.D4.D 4.D2.D.D4.D2.D.D30.C29.F.F2.D3.D6.D6.D13.A3.2A7.C38.F53.A4.A.A.A5.A6. F18.D20.2A6.2A28.F.F5.D3.D2.D3.D77.F$F69.F5.D3.D9.D9.D26.3C29.F.F16.D 7.D10.2A.A8.3C36.F54.4A.A2.6A7.F36.A18.A3.A17.F.F2.D91.F$F69.F2.D9.D 2.D6.D65.F.F2.D3.D6.D6.D15.A.A2.A16.2A26.F56.A2.A.A3.A9.F18.D58.F.F5. D3.D2.D3.D45.2A30.F$F3.D5.D.D6.D3.D46.F5.D3.D9.D9.D58.F.F4.D4.D.D4.D. D5.D10.A2.A.A.A16.A4.2A.2A17.F58.2A.2A12.F77.F.F2.D4.D51.2A2.A30.F$F 7.D61.F2.D4.D4.D2.D.D4.D2.D.D60.F.F33.A2.3A.2A17.A.A3.A.A.A16.F75.F 77.F.F9.D2.D3.D40.3A.2A31.F$F2.D13.D.D4.D45.F88.F.F16.D16.3A21.2A2.4A 2.A.A3.A12.F75.F77.F.F2.D53.A37.F$F7.D61.F15.D72.F.F36.A19.A2.2A3.A.A .A3.A.A11.F75.F3.D3.D.D.D2.D.D.D3.D54.F.F9.D2.D3.D36.A2.4A.2A31.F$F2. D6.D4.D3.D4.D45.F64.2A22.F.F16.D18.2A19.A.A2.A4.A5.A.A11.F75.F77.F.F 2.D2.D.D6.D38.3A3.A.2A31.F$F7.D3.D41.2A14.F15.D48.A.A21.F.F55.2A.3A4. 2A4.2A.A.A9.F75.F2.D7.D3.D8.D53.F.F56.A37.F$F2.D11.D.D.D4.D29.2A14.F 66.A21.F.F57.A4.A.A5.A3.2A.A8.77F55.A21.F.F55.2A26.2A9.F$F7.D3.D32.2A 23.F66.2A20.F.F52.2A3.A.2A3.2A3.3A.A3.A8.F58.F16.F2.D6.D4.D.D6.D30.A. A20.F.F83.A10.F$F3.D5.D8.D3.D21.A2.A21.F50.A.2A34.F.F3.D5.D.D2.D.D4.D 35.A4.A.A5.A2.5A.A6.F75.F18.D35.2A21.F.F81.A.A10.F$F40.2A4.2A21.F3.D 5.D6.D5.D27.2A.A34.F.F7.D47.2A.3A4.2A4.2A.A3.A.A5.F75.F2.D5.D14.D53.F .F81.2A11.F$F41.A20.2A5.F7.D3.D2.D3.D69.F.F2.D14.D4.D33.A.A2.A4.A5.A 3.2A2.A5.F2.D.D.D2.D.D11.D.D49.F18.D29.2A27.F.F94.F$F41.A.A18.A6.F2.D 20.D64.F.F7.D26.E21.A2.2A3.A.A.A.A.A.2A.A.A6.F75.F3.D4.D5.D.D5.D26.A 27.F.F94.F$F42.2A16.A.A6.F7.D3.D2.D3.D69.F.F2.D6.D6.D5.D11.E.E20.2A2. 4A2.A.2A2.A3.A.2A5.F5.D6.D9.D3.D48.F49.A.A25.F.F3.D5.D6.D6.D5.D64.F$F 60.2A7.F2.D6.D13.D46.2A6.2A8.F.F7.D3.D22.3E12.2A8.A.A3.A.A3.A.A.A.A2. A5.F51.2CD21.F50.2A25.F.F7.D3.D2.D3.D2.D3.D68.F$F69.F11.D2.D3.D50.A2. A4.A2.A7.F.F2.D14.D4.D13.E11.A2.A2.2A3.A4.2A.A.2A.A.2A2.A7.F4.D6.D3.D .D5.D.D26.C22.F77.F.F2.D27.D54.2A.A5.F$F69.F2.D20.D44.6A2.6A6.F.F7.D 3.D36.A.A4.A2.2A8.A3.A3.2A8.F19.D32.3C20.F77.F.F11.D2.D3.D6.D59.A.2A 5.F$F69.F11.D2.D3.D50.A2.A4.A2.A7.F.F3.D5.D4.D.D4.D27.A5.A.A11.A.A2.A .A9.F3.D8.D2.D6.D3.D48.F77.F.F2.D6.D13.D6.D63.F$F69.F3.D3.D.D6.D5.D 47.2A6.2A8.F.F52.2A.A.A10.2A.4A.A.A7.F19.D30.A24.F77.F.F14.D3.D33.E 25.2A14.F$F69.F82.A5.F.F52.A2.A.2A9.A5.A2.A.A6.F3.D5.D.D3.D.D5.D.D49. F77.F.F2.D4.D13.D8.D21.E.E23.2A14.F$F42.E26.F88.F.F49.A4.A15.2A.A5.A 6.F49.A25.F70.2A5.F.F14.D3.D33.3E39.F$F42.E.E24.F88.F.F49.5A17.A.6A7. F15.D31.A27.F50.E19.2A5.F.F3.D3.D.D.D4.D4.D.D.D3.D24.E39.F$F42.3E24.F 88.F.F71.A4.A9.F75.F50.E.E24.F.F94.F$F44.E24.F10.2A.D26.E47.F.F51.2A. A17.3A11.F15.D30.A28.F50.3E24.F.F67.2A25.F$F69.F9.3A.CAD24.E.D45.F.F 51.A.2A19.2A10.F75.F52.E24.F.F61.2A3.A2.A24.F$F69.F10.2A.3C.2A5.F15. 3E.2A42.F.F86.F75.F67.2A8.F.F62.A3.A.A25.F$F49.2A18.F9.3A.2AD.2A23.E. 2A42.F.F86.F75.F67.2A8.F.F59.3A5.A26.F$F45.2A4.4A14.F9.2A77.F.F86.F3. D3.D4.D6.D5.D49.F77.F.F59.A34.F$F45.2A2.2A.3A14.F88.F.F86.F10.D3.D2.D 3.D39.2A12.F77.F.F71.A22.F$F49.A19.F88.F.F86.F2.D4.D18.D34.A13.F77.F. F94.F$F43.A25.F16.D.D69.F.88F14.D2.D3.D38.2A2.3A8.F77.F.F72.A21.F$F 69.F68.2A18.F.F75.F10.F2.D4.D4.D13.D33.A3.A.3A6.F77.F.F74.A19.F$F69.F 19.D48.2A18.F.F86.F17.D3.D38.2A.A4.A6.F58.2A17.F.F94.F$F69.F88.F.F4.D .D2.D.D.D10.D.D59.F2.D4.D2.D15.D12.E22.A.A10.F59.A17.F.F75.A18.F$F69. F9.D.D.D4.D23.2A44.F.F2.D83.F17.D3.D17.E.E16.A4.A.2A8.F56.3A18.F.F94. F$71F43.A44.F.F9.D13.D3.D58.F3.D3.D2.D.D.D4.D5.D13.3E16.3A.A3.A8.F56. A20.F.F77.3C14.F$F44.F24.F19.D20.3A25.2A18.F.F2.D53.2A.2A2.2A21.F41.E 18.3A2.2A2.A5.F77.F.F77.C16.F$F69.F40.A27.2A18.F.F4.D4.D.D4.D.D5.D.D 30.A.A2.A.A3.2CD15.F65.A9.F77.F.F76.2CD15.F$F69.F16.D.D18.D16.2A32.F. F2.D3.D6.D6.D35.A3.2A7.C16.F64.2A9.F77.F.F94.F$F2.D2.D4.D12.D.D43.F 39.D13.A.A32.F.F16.D6.D3.D29.2A.A8.3C14.F75.F77.F.F94.F$F8.D3.D56.F 35.D17.A34.F.F2.D3.D6.D6.D37.A.A2.A12.2A8.F75.F77.F.F94.F$F2.D2.D16.D 3.D42.F37.D14.2A8.2A24.F.F4.D4.D.D4.D.D5.D.D30.A2.A.A.A11.2A8.F53.2A 20.79F.F94.F$F12.D36.D2C17.F33.D28.A25.F.F55.A2.3A.2A22.F53.A21.F60.F 16.F.F94.F$F2.D2.D4.D4.D.D5.D.D24.C18.F35.D27.3A22.F.F16.D38.3A28.F 54.3A18.F77.F.F83.F10.F$F19.D28.3C18.F65.A22.F.F58.A18.2A7.F56.A18.F 77.F.96F$F2.D2.D2.D6.D6.D3.D42.F88.F.F16.D40.2A16.A.2A7.F75.F4.D6.D6. D58.F.F94.F$F19.D49.F88.F.F75.A10.F75.F2.D3.D2.D3.D2.D3.D56.F.F94.F$F 2.D2.D2.D.D.D2.D.D5.D.D43.F88.F.F75.A10.F75.F77.F.F4.D4.D3.D.D14.D63. F$F69.F88.F.F75.A2.A7.F75.F6.D2.D3.D2.D3.D32.2CD21.F.F2.D3.D87.F$F15. D53.F88.F.F3.D4.D.D6.D3.D54.2A8.F75.F4.D49.C22.F.F9.D2.D3.D11.D.D63.F $F69.90F.F6.D79.77F9.D3.D2.D3.D33.3C20.F.F6.D71.A15.F$F15.D53.F65.F 22.F.F2.D12.D.D4.D63.F60.F14.F2.D74.F.F4.D4.D3.D.D3.D.D4.D3.D45.3A15. F$F69.F88.F.F6.D49.E29.F75.F9.D3.D2.D3.D56.F.F23.D51.A18.F$F69.F88.F. F2.D5.D4.D3.D4.D33.E.E27.F75.F2.D.D.D4.D6.D58.F.F2.D6.D2.D3.D2.D6.D.D .D44.2A17.F$F69.F4.D4.D6.D10.D.D58.F.F6.D3.D45.3E12.2A13.F2.D.D.D2.D. D11.D.D49.F77.F.F23.D70.F$F3.D5.D.D6.D3.D46.F2.D3.D81.F.F2.D10.D.D.D 4.D35.E11.A2.A2.2A8.F75.F77.F.F2.D.D.D2.D3.D.D3.D.D8.D54.2A7.F$F7.D 61.F9.D4.D.D9.D3.D57.F.F6.D3.D59.A.A4.A8.F5.D6.D9.D3.D48.F77.F.F85.A 8.F$F2.D13.D.D4.D45.F6.D45.2A16.D2C15.F.F3.D4.D8.D3.D49.A5.A.2A5.F53. 2CD19.F77.F.F19.D63.A.A8.F$F7.D61.F4.D4.D2.D3.D2.D.D5.D.D18.2A.A2.A. 2A13.C16.F.F74.2A.A.A6.F4.D6.D3.D.D5.D.D28.C20.F77.F.F83.2A9.F$F2.D6. D4.D3.D4.D45.F23.D24.2A2.A4.A11.3C16.F.F74.A2.A2.A5.F19.D34.3C18.F77. F.F19.D74.F$F7.D3.D36.2A19.F2.D6.D2.D.D.D2.D6.D3.D22.A34.F.F71.A4.A2. 2A5.F3.D8.D2.D6.D3.D48.F77.F.F94.F$F2.D11.D.D.D4.D24.2A19.F23.D30.A.A 31.F.F71.5A10.F19.D32.A22.F3.D5.D6.D5.D54.F.F94.F$F7.D3.D27.2A28.F2.D .D.D2.D6.D2.D.D5.D.D58.F.F86.F3.D5.D.D3.D.D5.D.D49.F7.D3.D2.D3.D58.F. F3.D5.D6.D.D3.D.D4.D64.F$F3.D5.D8.D3.D16.A2.A26.F88.F.F73.2A.A9.F51.A 23.F2.D20.D53.F.F7.D3.D2.D44.A34.F$F35.2A4.2A26.F19.D68.F.F73.A.2A9.F 15.D33.A25.F7.D3.D2.D3.D58.F.F2.D18.D3.D4.D28.A34.F$F36.A20.2A10.F88. F.F86.F75.F2.D6.D13.D53.F.F11.D2.D35.2A7.A34.F$F36.A.A18.A11.F19.D68. F.F86.F15.D32.A26.F11.D2.D3.D36.2A20.F.F2.D6.D6.D5.D.D5.D20.A42.F$F 37.2A16.A.A11.F88.F.F86.F75.F2.D20.D31.2A20.F.F14.D3.D32.A.A40.F$F55. 2A12.F88.F.F86.F62.2A11.F11.D2.D3.D58.F.F2.D4.D13.D3.D4.D21.2A40.F$F 69.F88.F.F86.F75.F3.D3.D.D6.D5.D39.A.2A11.F.F14.D3.D75.F$F69.F3.D3.D 2.D.D.D4.D.D3.D62.F.88F3.D3.D4.D6.D5.D34.A3.A10.F62.2A.A11.F.F3.D3.D. D.D4.D5.D.D4.D64.F$F69.F17.D70.F.F75.F10.F10.D3.D2.D3.D38.A4.A9.F77.F .F94.F$F57.2A10.F2.D4.D5.D12.D61.F.F86.F2.D4.D18.D35.A.A.A8.F77.F.F 94.F$F56.A.A10.F17.D23.E46.F.F86.F14.D2.D3.D41.A.A.A7.F46.A.2A27.F.F 85.2A.A5.F$F37.E17.3A11.F2.D4.D4.D6.D6.D14.E.D44.F.F4.D.D2.D.D.D9.D.D 60.F2.D4.D4.D13.D37.A4.A5.F46.2A.A27.F.F85.A.2A5.F$F37.E.E15.2A12.F 17.D3.D19.3E.2A41.F.F2.D83.F17.D3.D43.A3.A5.F77.F.F52.E41.F$F37.3E18. 2A9.F2.D4.D3.D14.D16.E.2A41.F.F9.D16.D59.F2.D4.D2.D15.D14.E33.F77.F.F 52.E.E23.2A14.F$F39.E17.3A9.F17.D3.D66.F.F2.D60.2A3.2CD15.F17.D3.D19. E.E22.2A7.F77.F.F52.3E23.2A14.F$F69.F3.D3.D3.D7.D5.D62.F.F4.D4.D.D4.D .D6.D37.2A4.C16.F3.D3.D2.D.D.D4.D5.D15.3E31.F77.F.F54.E39.F$F69.F88.F .F2.D3.D6.D6.D48.3C14.F43.E31.F77.F.F94.F$F57.2A10.F79.2A7.F.F16.D9.D 59.F75.F77.F.F94.F$F57.2A10.F79.A.A6.F.F2.D3.D6.D6.D46.A18.F75.F77.F. F94.F$F69.F81.A6.F.F4.D4.D.D4.D.D4.D.D60.F75.F77.F.F94.F$F53.D6.A8.F 81.2A5.F.F66.A19.F75.F77.F.F94.F$F51.D17.F43.2A43.F.F16.D47.A21.F75.F 77.F.F94.F$F46.2A7.D13.F10.2A.D30.A43.F.F77.A8.F75.F64.2A11.F.F55.2A 3.A33.F$F47.A5.D15.F9.3A.CAD25.3A44.F.F16.D46.A12.2A8.F75.F64.A.A10.F .F51.A3.2A2.A.2A8.A22.F$F44.3A10.D11.F10.2A.3C.2A5.F16.A46.F.F86.F75. F8.2A.D24.E29.A10.F.F50.A.A10.A30.F$F44.A10.D13.F9.3A.2AD.2A19.D49.F. F74.3A2.A6.F75.F7.3A.CAD22.E.D27.2A9.F.F49.A.A7.A2.A.A7.A21.F$F59.D9. F9.2A29.D47.F.F76.A.A.A5.F75.F8.2A.3C.2A5.F13.3E.2A27.A7.F.F49.A11.A 2.A9.A19.F$F57.D11.F36.D51.F.F3.D3.D2.D.D.D4.D6.D50.A2.A5.F51.A23.F7. 3A.2AD.2A21.E.2A35.F.F48.2A12.2A30.F$F61.D7.F38.D49.F.F17.D3.D56.2A6. F75.F7.2A59.A2.A5.F.F75.A18.F$F59.D9.F16.D.D15.D53.F.F2.D4.D2.D16.D 28.E29.F75.F77.F.F94.F$F63.D5.F36.D51.F.F17.D3.D34.E.E27.F75.F70.A6.F .F77.3C14.F$F61.D.D5.F19.D68.F.F2.D4.D2.D.D14.D28.3E27.F75.F14.D.D60. F.F77.C16.F$F62.2D5.F52.2A.6A27.F.F14.D2.D3.D36.E27.F75.F64.2A11.F.F 76.2CD15.F$F69.F9.D.D.D4.D33.2A.6A27.F.F2.D4.D19.D58.77F17.D46.2A11.F .F94.F$F69.F52.2A34.F.F14.D2.D3.D48.2A14.F63.F11.F77.F.F94.F$F69.F19. D32.2A5.2A27.F.F3.D3.D2.D.D6.D6.D43.A15.F75.F7.D.D.D4.D21.2A37.F.F94. F$70.F52.2A5.2A27.F.F71.3A12.F75.F39.A37.F.F94.F$70.F16.D.D33.2A5.2A 27.F.F73.A12.F2.D.D.D2.D.D11.D.D49.F17.D18.3A25.2A11.F.F94.F$.70F59. 2A27.F.F86.F75.F36.A27.2A11.F.F83.F10.F$70.F52.6A.2A27.F.F86.F5.D6.D 9.D3.D48.F14.D.D16.A16.2A25.F.96F$70.F52.6A.2A27.F.F86.F56.2CD16.F35. A13.A.A25.F.F94.F$70.F88.F.F86.F4.D6.D3.D.D5.D.D31.C17.F31.A17.A27.F. F94.F$70.F88.F.F86.F19.D37.3C15.F33.A14.2A8.2A17.F.F4.D4.D3.D.D12.D.D 63.F$70.F88.F.88F3.D8.D2.D6.D3.D41.A6.F58.A18.F.F2.D3.D19.D67.F$70.F 88.F.F72.F33.D35.A19.F59.3A15.F.F9.D2.D3.D77.F$70.F88.F.F86.F3.D5.D.D 3.D.D5.D.D39.2A8.F61.A15.F.F6.D19.D51.A15.F$70.90F.F86.F54.A10.2A8.F 77.F.F4.D4.D3.D.D3.D.D6.D47.3A15.F$161.F4.D.D2.D.D.D13.D58.F15.D36.A 22.F77.F.F23.D2.D3.D44.A18.F$161.F2.D83.F75.F77.F.F2.D6.D2.D3.D2.D55. 2A17.F$161.F9.D15.D.D58.F15.D35.A13.3A7.F77.F.F23.D2.D3.D63.F$161.F2. D57.2A3.2CD18.F66.2A7.F77.F.F2.D.D.D2.D3.D.D3.D.D6.D56.2A7.F$161.F4.D 4.D.D4.D.D4.D3.D32.2A4.C19.F63.2A10.79F.F85.A8.F$161.F2.D3.D6.D6.D45. 3C17.F63.3A9.F79.F19.D63.A.A8.F$161.F16.D6.D.D.D58.F3.D3.D4.D6.D5.D 38.A.A8.F79.F83.2A9.F$161.F2.D3.D6.D6.D43.A21.F10.D3.D2.D3.D43.2A8.F 79.F19.D74.F$161.F4.D4.D.D4.D.D8.D58.F2.D4.D18.D48.F79.F94.F$161.F63. A11.2A9.F14.D2.D3.D53.F79.F94.F$161.F16.D44.A12.A2.A.2A5.F2.D4.D4.D 13.D48.F79.F3.D5.D4.D.D.D4.D5.D64.F$161.F73.A.A.A.2A5.F17.D3.D53.F79. F7.D3.D9.D3.D33.A34.F$161.F16.D43.A14.A.A8.F2.D4.D2.D15.D17.E30.F79.F 2.D14.D12.D28.A34.F$161.F72.A2.A.A.2A5.F17.D3.D22.E.E28.F79.F11.D9.D 3.D24.2A7.A34.F$161.F72.2A3.A.A6.F3.D3.D2.D.D.D4.D5.D18.3E28.F79.F2.D 6.D6.D13.D20.A42.F$161.F76.A3.A5.F46.E28.F79.F21.D3.D25.A.A40.F$161.F 3.D3.D6.D3.D.D4.D47.A2.A.2A6.F75.F79.F2.D4.D7.D14.D21.2A40.F$161.F72. A.A.A.A7.F75.F79.F21.D3.D68.F$161.F2.D4.D4.D.D2.D3.D4.D26.E18.2A2.A.A 7.F75.F79.F3.D3.D.D.D3.D7.D5.D64.F$161.F53.E.E20.2A8.F75.F79.F94.F$ 161.F2.D4.D2.D3.D3.D.D5.D26.3E30.F75.F79.F94.F$161.F55.E30.F75.F79.F 85.2A.A5.F$161.F2.D4.D2.D.D.D2.D3.D4.D59.F75.F79.F85.A.2A5.F$161.F67. 2A17.F75.F79.F52.E41.F$161.F3.D3.D6.D3.D.D4.D41.A18.F62.2A11.F79.F52. E.E23.2A14.F$161.F68.3A15.F62.A.A10.F79.F52.3E23.2A14.F$161.F70.A15.F 50.2A12.A10.F79.F54.E39.F$161.F86.F50.3A11.2A9.F79.F94.F$161.F86.F44. 2A2.A2.A.A13.A7.F79.F94.F$161.F86.F44.2A2.2A2.2A21.F79.F94.F$161.F86. F48.2A16.A2.A5.F79.F94.F$161.F86.F42.A32.F79.F94.F$161.88F68.A6.F79.F 94.F$161.F74.F11.F75.F79.F59.A2.A31.F$161.F86.F75.F79.F59.A11.A22.F$ 161.F86.F75.F79.F58.A4.A30.F$161.F4.D.D2.D.D.D9.D.D.D58.F75.F79.F57.A .A2.2A8.A21.F$161.F2.D83.F75.F79.F51.2A2.2A.A15.A19.F$161.F9.D13.D62. 77F79.F47.A3.2A41.F$161.F2.D59.2A3.2CD16.F61.F13.F79.F46.A.A26.A18.F$ 161.F4.D4.D.D4.D.D4.D.D36.2A4.C17.F75.F79.F45.A.A7.A2.A35.F$161.F2.D 3.D6.D6.D6.D40.3C15.F75.F79.F45.A11.2A18.3C14.F$161.F16.D69.F2.D.D.D 2.D.D12.D50.F79.F44.2A31.C16.F$161.F2.D3.D6.D6.D6.D38.A19.F22.D3.D48. F79.F76.2CD15.F$161.F4.D4.D.D4.D.D4.D.D60.F5.D6.D62.F79.F94.F$161.F 65.A10.2A8.F22.D3.D27.2CD18.F79.F94.F$161.F16.D46.A11.A2.A7.F4.D6.D3. D.D6.D30.C19.F79.F94.F$161.F74.A4.A6.F19.D6.D28.3C17.F79.F94.F$161.F 16.D45.A10.A6.A5.F3.D8.D2.D59.F79.F94.F$161.F73.A6.A5.F19.D6.D26.A21. F79.F83.F10.F$161.F74.A4.A6.F3.D5.D.D3.D.D4.D.D50.F79.96F$161.F75.A2. A7.F52.A22.F79.F94.F$161.F3.D3.D2.D.D.D4.D5.D50.2A8.F15.D34.A24.F79.F 94.F$161.F17.D3.D64.F75.F79.F4.D4.D3.D.D10.D3.D.D61.F$161.F2.D4.D2.D 15.D28.E30.F15.D33.A13.2A10.F79.F2.D3.D87.F$161.F17.D3.D33.E.E28.F63. 2A10.F79.F9.D2.D3.D9.D2.D3.D60.F$161.F2.D4.D2.D.D13.D28.3E28.F75.F79. F6.D71.A15.F$161.F14.D2.D3.D35.E28.F61.6A8.F79.F4.D4.D3.D.D3.D.D4.D2. D3.D42.3A15.F$161.F2.D4.D18.D59.F3.D3.D4.D6.D.D3.D35.A2.A2.A7.F79.F 23.D51.A18.F$161.F14.D2.D3.D47.2A15.F10.D3.D2.D45.A.2A8.F79.F2.D6.D2. D3.D2.D6.D2.D3.D41.2A17.F$161.F3.D3.D2.D.D6.D5.D43.A16.F2.D4.D18.D35. A.A2.3A5.F79.F23.D70.F$161.F70.3A13.F14.D2.D43.2A.A.A2.A5.F79.F2.D.D. D2.D3.D.D3.D.D4.D3.D.D52.2A7.F$161.F72.A13.F2.D4.D4.D6.D6.D35.A3.A8.F 79.F85.A8.F$161.F86.F17.D3.D41.2A.A.A6.F79.F19.D63.A.A8.F$161.F86.F2. D4.D2.D15.D15.E21.A2.2A6.F79.F83.2A9.F$161.F86.F17.D3.D20.E.E17.A.A 10.F79.F19.D74.F$161.F86.F3.D3.D2.D.D.D4.D5.D16.3E17.2A11.F79.F94.F$ 161.F86.F44.E30.F79.F94.F$161.88F75.F79.F3.D5.D4.D.D.D4.D5.D64.F$161. F69.F16.F75.F79.F7.D3.D9.D3.D33.A34.F$161.F86.F75.F79.F2.D14.D12.D28. A34.F$161.F86.F75.F79.F11.D9.D3.D24.2A7.A34.F$161.F86.F56.2A17.F79.F 2.D6.D6.D13.D20.A42.F$161.F4.D.D2.D.D.D9.D.D.D58.F56.A18.F79.F21.D3.D 25.A.A40.F$161.F2.D83.F57.3A15.F79.F2.D4.D7.D14.D21.2A40.F$161.F9.D 16.D30.2A3.2CD21.F59.A15.F79.F21.D3.D68.F$161.F2.D54.2A4.C22.F75.F79. F3.D3.D.D.D3.D7.D5.D64.F$161.F4.D4.D.D4.D.D6.D37.3C20.F75.F79.F94.F$ 161.F2.D3.D6.D6.D65.F75.F79.F94.F$161.F16.D7.D36.A24.F75.F79.F85.2A.A 5.F$161.F2.D3.D6.D6.D65.F75.F79.F85.A.2A5.F$161.F4.D4.D.D4.D.D5.D35.A 12.A12.77F79.F52.E41.F$161.F58.A13.A.A11.F58.F16.F79.F52.E.E23.2A14.F $161.F16.D55.A.A11.F75.F79.F52.3E23.2A14.F$161.F57.A13.2A.A.A9.F75.F 79.F54.E39.F$161.F16.D57.2A.A8.F2.D.D.D2.D.D12.D6.D43.F79.F94.F$161.F 68.2A2.2A3.A8.F22.D3.D2.D3.D41.F79.F94.F$161.F74.4A.A6.F5.D6.D62.F79. F94.F$161.F71.2A.A3.A.A5.F26.D6.D17.2CD21.F79.F94.F$161.F3.D3.D2.D.D. D6.D3.D46.A.A.2A2.A5.F4.D6.D3.D.D6.D6.D20.C22.F79.F94.F$161.F50.E21.A 4.A.A6.F19.D32.3C20.F79.F94.F$161.F2.D4.D2.D8.D.D4.D23.E.E17.2A.A.A.A .2A5.F3.D8.D2.D6.D6.D45.F79.F94.F$161.F50.3E17.A2.A.A.A2.A5.F19.D30.A 24.F79.F71.A22.F$161.F2.D4.D2.D.D4.D3.D4.D25.E19.A5.A7.F3.D5.D.D3.D.D 4.D.D.D2.D.D.D41.F79.F41.2A14.2A.A.2A30.F$161.F14.D56.2A.A.2A8.F49.A 25.F79.F42.A12.3A.A.A.3A6.A21.F$161.F2.D4.D9.D.D.D4.D37.2A8.A.A9.F15. D31.A27.F79.F39.3A9.2A.A11.A7.A19.F$161.F14.D49.A6.2A.A.A.A7.F75.F79. F39.A7.A3.2A.A.3A.A.4A28.F$161.F3.D3.D2.D.D8.D3.D39.3A3.A2.4A.A6.F15. D30.A21.A6.F79.F46.A.A6.A3.3A13.A18.F$161.F67.3A.A.A5.A6.F66.3A6.F79. F45.A.A9.A.A.A.2A.A27.F$161.F70.A2.6A7.F65.A9.F79.F45.A10.2A.A.A.A.2A 10.3C14.F$161.F67.2A.A.A3.A9.F65.2A8.F79.F44.2A11.A.A2.A14.C16.F$161. F67.A.2A.2A12.F3.D3.D2.D.D5.D5.D50.F79.F57.A2.2A14.2CD15.F$161.F86.F 16.D3.D38.2A14.F79.F56.2A36.F$161.F86.F2.D4.D5.D11.D32.A2.2A12.F79.F 94.F$161.F86.F20.D37.A2.2A.2A9.F79.F94.F$161.F86.F2.D4.D4.D5.D6.D33. 3A2.3A8.F79.F94.F$161.F86.F60.A6.A7.F79.F94.F$161.88F2.D4.D5.D2.D8.D 13.E22.5A8.F79.F83.F10.F$161.F77.F8.F39.E.E20.4A9.F79.96F$161.F86.F3. D3.D2.D.D3.D.D.D3.D14.3E21.A11.F$161.F86.F41.E33.F$161.F4.D.D2.D.D.D 10.D.D59.F64.A10.F$161.F2.D83.F62.4A4.A4.F$161.F9.D13.D3.D58.F61.5A9. F$161.F2.D62.2A3.2CD13.F60.A6.A7.F$161.F4.D4.D.D4.D.D5.D.D38.2A4.C9.A 4.F53.2A6.3A2.3A6.F$161.F2.D3.D6.D6.D50.3C12.F53.A8.2A.2A2.A5.F$161.F 16.D6.D3.D50.2A6.F54.3A8.2A2.A5.F$161.F2.D3.D6.D6.D48.A8.2A6.F56.A10. 2A6.F$161.F4.D4.D.D4.D.D5.D.D59.F75.F$161.F68.A17.F61.2A12.F$161.F16. D49.A12.2A5.F62.A12.F$161.F77.A.2A5.F59.3A13.F$161.F16.D48.A11.A8.F 59.A15.F$161.F77.A8.F75.F$161.F77.A2.A5.F75.F$161.F78.2A6.F75.F$161.F 3.D3.D2.D.D.D4.D5.D60.F75.F$161.F17.D3.D64.F75.F$161.F2.D4.D2.D15.D 31.E27.77F$161.F21.D36.E.E25.F$161.F2.D4.D2.D.D6.D6.D31.3E25.F$161.F 14.D45.E25.F$161.F2.D4.D9.D8.D59.F$161.F14.D57.2A12.F$161.F3.D3.D2.D. D4.D.D.D3.D46.A13.F$161.F73.3A10.F$161.F75.A10.F$161.F86.F$161.F86.F$ 161.F86.F$161.F86.F$161.F86.F$161.88F$161.F68.F17.F$161.F86.F$161.F 86.F$161.F4.D.D2.D.D.D11.D6.D53.F$161.F2.D20.D3.D2.D3.D51.F$161.F9.D 76.F$161.F2.D24.D6.D21.2A3.2CD22.F$161.F4.D4.D.D4.D.D6.D6.D23.2A4.C 23.F$161.F2.D3.D6.D6.D41.3C21.F$161.F16.D6.D6.D55.F$161.F2.D3.D6.D6.D 39.A17.A7.F$161.F4.D4.D.D4.D.D4.D.D.D2.D.D.D41.3A7.F$161.F59.A15.A10. F$161.F16.D40.A17.2A9.F$161.F86.F$161.F16.D39.A29.F$161.F86.F$161.F 72.A13.F$161.F3.D3.D2.D.D.D6.D3.D46.2A.A.A8.F$161.F70.A2.2A.2A8.F$ 161.F2.D4.D2.D8.D.D4.D42.A2.2A3.A8.F$161.F49.E19.A16.F$161.F2.D4.D2.D .D4.D3.D4.D22.E.E18.A2.2A11.F$161.F14.D34.3E19.2A2.2A3.A5.F$161.F2.D 4.D9.D.D.D4.D24.E21.2A2.A8.F$161.F14.D63.A7.F$161.F3.D3.D2.D.D8.D3.D 37.2A5.A3.2A2.A7.F$161.F63.A6.2A.2A2.A8.F$161.F64.3A3.A.A.2A10.F$161. F65.A9.A10.F$161.F63.A3.A18.F$161.F63.4A.A17.F$161.F68.A17.F$161.F65. 3A3.2A13.F$161.F65.A6.A13.F$161.F69.3A14.F$161.F69.A16.F$161.F86.F$ 161.F86.F$161.F86.F$161.F86.F$161.F86.F$161.88F!golly-2.5-src/Patterns/Life/Signal-Circuitry/lightspeed-telegraph.rle0000644000175100001440000041421512156145314022676 00000000000000#C A lightspeed wire that can transmit one bit of information #C every 1440 generations. Unfortunately, it is very large, #C and has an overhead of up to around 8000 generations. #C #C This wire can only achieve light speed in orthogonal directions. #C The speed would degrade to c/2 in diagonal directions. #C #C A signal is represented by the upward-traveling LWSS at the #C lower-right. As a demonstration, it eventually causes the #C nearby HWSS to be shot down. #C #C Jason Summers, February 2003 x = 9108, y = 3469, rule = B3/S23 8199bo$8198boo$8182boo13boo4boobboo$8182b3o11b3o4boobboo$8173boo9boobo 9boo4boo$8173bo5bo4bobbo10boo$8178bo5boobo11bo$8174bo3bo3b3o10bo$8176b o5boo9bobo$8194boo$8205bobbo4bobbo$8185boo16b3obb6obb3o3boo$8185boo18b obbo4bobbo5boo$8151boo47boo20boo$8151boo47bo21bo$8201b3o17bobo$8203bo 17bobo$8176boo8bo20bobo12bo$8176boo6booboo7boo12bo$8197boo7bo3bo$8183b o5bo6bo13bo8boo3boo$8151b3o53bobbo8bobobobo$8150bo3bo28booboboo18b3o9b 5o$8216boo3b3o$8149bo5bo19b3o38bobo3bo$8149boo3boo33boo25bo$8175bobo 10bobo$8174b5o10bo$8152bo20boo3boo8boo$8150boobo19boo3boo8b3o$8153bo 35boo$8149bo3bo33bo$8149bobbo23boo41b3o$8148b5o21booboo39booboo$8148b 5o21bobbo40booboo$8147boo3boo23bo10bo29b5o$8148b5o21bo12b3o27boo3boo$ 8149b3o5bobo15boo9b5o$8150bo7boo25boo3boo$8158bo27b5o$8175boo3boo4bo3b o$8160boo8bo5b5o6bobo31boo$8160boo6boo7b3o8bo$8169boo7bo$$8188boo29boo $8188boo29boo$8150boo55bobo$8150boo14bo43bo$8164bobo17b3o19bo3bo$8165b oo18bo24bo$8177boo6bo21bobbo$8177boo5b3o21b3o$$8184b3o$8184b3o$$8184b 3o$8185bo$8185bo$8184b3o4$8164boo16boo$8164bo17bobo48boo16boo$8153boo 7bobo18bo49boo15bobbo$8153bobo6boo10bo75bo$8148boo6bo16bobo43boo29bo 14boo$8148boo3bobbo15bo3boo41boo29bobo12boo$8148bobo5bo15bo3boo72bobo$ 8153bobo16bo3boo73bo$8153boo8boo8bobo6bo23bobo$8145bo16bobo9bo5booboo 23bo$8144bob4o12bo41bo43boo3boo$8143bobob3o11boo16bo5bo20bo12b3o26bo5b o$8142bobo60bo27b3o$8143bo35booboboo33bobo10bo3bo12bo3bo$8143boo73b5o 8bo5bo12b3o$8143boo72boo3boo8bo3bo$8143boo72boo3boo9b3o27b5o$8197boo 34b3o26bob3obo$8196bobo64bo3bo$8198bo20boo43b3o$8218booboo42bo$8219bo bbo31bo$8182boo35bo15b3o14bobo$8182boo38bo7bo3booboo14boo$8220boo6boo 4booboo28bo$8189b3o37boo3b5o10bo17bo$8178bo12bo41boo3boo8b3o9bo5bobo$ 8173bo4b4o8bo24boo3boo25b5o8bobobbooboo$8173bo5b4o10boo21b5o4boo19boo 3boo7boobbo5bo$8168boo9bobbo9bobo22b3o5boo20b5o15bo$8168boo9b4o8b3o4b oob3o14bo28bo3bo12boo3boo$8178b4o8b3o4bobb4o44bobo$8178bo12b3o4boo47b 3o$8192bobo43boo6boo20bo$8193boo43bo8bo20bo$8239b3obb3o22bo$8233bobo5b obbo$8234boo$8218boo14bo31boo$8218boo46boo$$8245bo$8245bobo$8245boo$$ 8253bo$8251b3o$8250bo$8250boo4$8242bo$8242bobobb3o$8242boo$8247bobo$ 8230bo15b5o$8230bobo12boo3boo$8230boo13boo3boo3$8248bo$8249boo$$8228b oo21bo11bo$8227bobbo31bobo64boo$8228bobbo15bobbo9boo3bo14boo47boo$ 8227boo3bo14boo6boo3boo3bo13bobo$8226boo4bo22boo3boo3bo12b3o4boob3o$ 8226boo4bo29bobo12b3o4bobb4o13boo$8263bo6bo7b3o4boo17boo21boo$8268boo 9bobo$8269boo9boo$$8267bo$8266boo58boo3boo$8230boo34bobo58b5o$8230bobo 94booboo$8230bo30bobo63booboo$8261boo65b3o$8262bo12bo7bo18boo3boo$ 8223boo49b4o5bobo$8223b3o13b3o27boobbobboo8boo4boo9bo3bo$8223b3o13bo 29boobboo11boo4boo10b3o$8222boboo14bo25boo10bo7boo16b3o$8222b3o40b3o 10bo4bobo$8223bo42boo10bo4bo41bo$8260boo7boo54bobo3bo$8259bobo7boo54b oo3b3o$8259bo69b5o$8258boo43bo5bo18bobobobo$8245boo55b3o5bo17boo3boo$ 8238bo6bobo54b3o3b3o$8236bobo6bo12boo$8235bobo21bo40boo3boo14bo9bo$ 8229boo3bobbo21bobo7boo21boo6boo3boo12boo9bobo$8229boo4bobo22boo6bobo 21bo26bobbo7bobo$8236bobo9boo4b3o10bo13bobo6bobo26bo11bo$8238bo9bobo3b o12bobbo6boobbobbo5boo11bo15bo10boo$8250bo4bo11bo8bobo5boo10bo5bobo12b oo3bo7boo$8250boo16bobo3bo3bo3bo3boo8bo4boo12boo3bo9boo$8269boobboob3o 5boo15boo12bobb3o$8276boo3bobbo11bo4b3o11bo$8231bo49bobo11bobo4bobo$ 8230boo71boo$8230bobo62b3o3$8295b3o$$8295bobo$8238boo41boo13bo$8237boo 30b3obbo5bo3bo$8239bo25bo3bo9bo5bo10bo35bo$8263bobo4bo8bo3boboobboo5bo 33bobo$8255boo4boo16bo5bo3boo40boo$8255boo4boo17bo3bo31boo$8261boo18b oo14b3o17bo$8246bo16bobo51bobo5boo$8245boo18bo44boo6boo5b3o$8245bobo 61bobo15boobo$8308bo18bobbo$8308bobbo15boobo$8308bo16b3o$8309bobo5boo 6boo$8310boo5bobo13b4o$8253boo64bo12bo4bo$8252boo65boo11bo3bobo$8254bo 78bo3bobo$8298b3o38bo$8297bo3bo37bo$8296bo5bo33bobbo$8297bo3bo35boo$ 8261bo36b3o$8260boo36b3o$8260bobo3$8298boo$8298boo$$8268boo$8267boo$ 8269bo$8279boo$8277bo3bo$8268bo7bo5bo$8268bobo4boobo3bo8boo$8257boo12b oo3bo5bo8boo$8257boo12boo4bo3bo$8271boo6boo$8268bobo$8268bo4$8247boo 16boo$8247boo16boo$$8233boo44boo$8233boo44boo$$8248bo$8234bo13bo$8233b 3o11bobo$8232bo3bo9booboo$8234bo10bo5bo26b3o$8231bo5bo10bo15b3o$8231bo 5bo7boo3boo11bo3bo10bobo$8232bo3bo25bo5bo8b5o$8233b3o27bo3bo8boo3boo$ 8247b4o13b3o9boo3boo$8246boobbo13b3o$8246boobo$8279boo$8236bo10boo28b ooboo$8247bo29bobbo$8262b3o15bo$8236bo24booboo3bo7bo$8234bobo10boobob oo7booboo4boo6boo$8235boo10bo5bo7b5o3boo$8248bo3bo7boo3boo$8249b3o26b oo3boo$8273bo5b5o$8229boo3boo35boo7b3o$8272boo7bo$8230bo3bo$8231b3o$ 8231b3o18boo6boo$8252bo8bo$8253b3obb3o$8255bobbo$$8232boo17bo28boo$ 8232boo15bobo28boo$8250boo3$8258bo$8256boo$8257boo8bo$8265b3o$8264bo$ 8264boo$$8262bo$8261b3o$8260bo3bo$8262bo$8255bo3bo5bo$8253boo4bo5bo$ 8254boo4bo3bo$8261b3o$8243bo$8241boo$8242boo4$8241bo36bobo$8240bobo30b o4bobbo61boo$8239boo20boo11boo5boo8bo51boo$8240boo19boo6boo8bo3boo5bob o$8269boo10boo6boboo10boo$8278bobbo6booboo10boo13boo$8278bobo8boboo25b oo$8290bobo$8291bo$$8242boo35boo61b3o$8241boo36boo60bo3bo$8243bo96bo5b o$8318b3o19booboboo$8317bo3bo$8252bo$8251boo20bo11b3o9boo17bo5bo20bo$ 8251bobo19bobo9bo9bobbo7bo9boo3boo19bobo$8273boo5bo5bo7bo7boo3bo34bobo $8278b4o12bo6bo5bo35boo$8277boboboo11bo7b5o12bo25bo$8237bobo36bobbob3o 11bobbo18boobo23b3o$8236bo39booboboo14boo21bo22bo3bo$8236bo3bo33b3ob4o 34bo3bo21bob3obo$8236bo36bobo4bo35bobbo18bo4b5o$8236bobbo17boo14bo41b 5o16boo$8236b3o17boo14boo41b5o17boo$8258bo55boo3boo$8252boo61b5o$8245b 3o4boo18boo42b3o5bobo7boo$8244b5o6boo10bo5bo43bo7boo7boo$8243bobo3bo5b 3o8boo5bobo5bo24boo17bo$8243boo3bo6boo9bobo5boo3bobo24bo$8252boo8boo 14bobo17bo5bobo$8252boo8bobo12bobbo16boo5boo$8264bo13bobo15boo46boo$ 8264boo13bobo13b3o11b3o32boo$8242boo37bo4bobo7boo3boo$8242bobo41boo9b oo9bo3bo$8242bo44bo10bo9bo3bo4boo$8317boo$8309b3o$$8337boob3o$8309b3o 25b4obo$8249b3o30bo50bo4boo$8249bo31boo25bo3bo20bo$8250bo30bobo8bobo 13bo3bo20bo$8290bo3bo$8278boo10bo18b3o$8270bo7bobbo7bo4bo8boo$8269bo3b oo7bo7bo12boo$8257boo10bo5bo6bo7bo3bo17boo16boo$8257bobo10b5o7bo9bobo 16bobo17bo$8257bo20bobbo30bo18bobo8boo$8278boo42bo9boo7bo3bo$8320bobo 17bo5bo$8319bobo18bo3boboo$8318bobbo18bo5bo$8319bobo19bo3boo$8264b3o 46bo6bobo8boo9boo$8264bo48bo8bo8bobo16boo$8265bo46bobo18bo12boobboo$ 8311booboo17boo11boobboboo$8310bo5bo34b3o$8313bo$8310boo3boo$8272boo 77boo$8272bobo76boo$8272bo41bo$8314bo$8315bo3$8312boo$8279b3o30boo$ 8279bo$8280bo3$8295bobo$8287b3o5bo3bo$8282boobbobbobo7bo$8280bobbobboo 7bo4bo4boo$8271boo6bo19bo5boo$8271boo6bo10b3obbo3bo$8279bo15bobo$8280b obbo$8282boo4$8261boo16boo$8261boo16boo$$8247boo44boo$8247bobo43boo$ 8248b3o11bo$8249boo10b3o$8249boo9bo3bo$8247bobo9bob3obo13bo13bo$8248bo 11b5o13b3o11bobo$8277b5o9bo3bo$8276bobobobo9b3o$8245boo3boo24boo3boo7b oo3boo$8245boo3boo$$8247b3o11bobboo13bo$8247b3o11bobo14bobo$8248bo11b oo15boobo14bo$8259boo16b3o15bo$8259boobo13bobbo11b3obo$8260b3o13b3o$ 8275bo3bo10bo$8274bo5bo9boobo$8250bo10boo3boo7bo3bo5bo6boo$8251boo11bo 11b3o7bo$8250boo9bo5bo16b3o$8262booboo25boo3boo$8245b3o15bobo26boo3boo $8244bo3bo15bo20bo7b5o$8243bo5bo14bo19bo9bobo$8243bo5bo34b3o$8246bo47b 3o$8244bo3bo17boo6boo$8245b3o18bo8bo$8246bo20b3obb3o$8269bobbo$$8246b oo46boo$8246boo17bo28boo$8266boo$8265boo3$8270bo$8269bo11bo$8269b3o7b 3o$8278bo$8278boo3$8275boo4$8267bo5boo3boo$8266bo6boo3boo$8266b3o$ 8275b3o$8255bo19b3o$8254bo21bo$8254b3o$$8207bobo$8210bo43bo41bo$8206bo 3bo41b5o38bobo59boo$8210bo40b3oboo18boo18boobo7boo49boo$8207bobbo41b5o 18boo6boo10booboo6bobo$8208b3o43bo28boo10boobob3o6bo7boo$8295bobobbobb obbobbo7boo13boo$8296bo4boo6bo22boo$8306bobo48bo$8306boo49bo$8254b3o 99bobo$8254bo38boo60booboo$8255bo37boo38bo20bo5bo$8331booboo21bo$8354b oo3boo$8264boo33bo30bo5bo$8264bobo31boo$8264bo33bobo8bobo18booboboo19b 4o$8287bo19bo3bo43boobbo$8285boo8boo10bo12boo33boobo$8286boo7bobbo7bo 4bo8boo9bo$8299bo7bo23bobbo21boo$8299bo7bo3bo19bo24bo$8299bo9bobo22boo $8288boo5bobbo36bo14bo$8250boo17b3o15bobo5boo36bobo12booboo3booboboo$ 8249b3o17bo17bo45boo12boboboo3bo5bo$8249b3o18bo15boo59bo3boo4bo3bo$ 8249boobo93booboo7b3o$8250b3o15bo59boo3boo10boob3o$8207bobo41bo16bobo 8boo5boo40bo5bo13bo$8210bo60boo6bobo5bo53bo5boo$8206bo3bo46boo12boo6bo 7bobo5bo24boo7bo3bo6b3o4boobo$8210bo46boo12boo15boo5boo23bo9b3o7bobobb o4boo$8207bobbo57bobo5boo18boo13boo5bobo19b3obbo3bobo$8208b3o57bo7bobo 17b3o11b3o5boo21boo7bo$8278bo12boo3boo9boboo13bo14bo7bobbo7boo$8255boo 21boo15boo10bobbo12bobo12bobboo5boo8boo$8254boo39bo11boboo28bo4bo$ 8256bo42bo10b3o31bo$8299bobo9boo10b3o5boo8bobo$8299boo22b3o5boo9bo$ 8324bo$$8263bo$8262boo30boo28bo$8262bobo29bobo26b3o$8294bo28b3o$8305bo $8303b4o$8293bobo6boboboo15bobo$8293bo3bo3bobbob3o8boo5bo$8270boo11boo 12bo4boboboo9boo$8269boo12boo8bo4bo4b4o19boo16boo17bo$8271bo25bo7bo19b obo17bo17boo$8293bo3bo28bo18bobo7boo3booboo$8293bobo40bo9boo7boo$8336b oo14boo6bobo$8331boo4boo12b3o8bo$8278bo52boo4b3o12boo$8277boo48bo3boo 4boo16boo$8277bobo46b3o7boo7boo8boo4bobbo$8325bo3bo6bo8bobo16bo$8324bo b3obo16bo12bo4bo$8325b5o17boo11boobbobo$8365boboo$$8285boo$8223boo59b oo79bobbo$8223b3o60bo78boo$8223b3o$8222boboo$8222b3o$8223bo$8293bo$ 8292boo32boo$8292bobo31boo5$8312bo$8299boobboo6b4o$8294bobobbob4o5boob obo$8292bo3bo3boboo5b3obobbobboo$8285boo5bo12bo4boobobo3boo$8285boo4bo 4bo14b4o$8292bo19bo$8292bo3bo$8294bobo4$8275boo16boo$8275bobbo14boo$$ 8261boo16bo27boo$8261boo43bobo$8277boo14bo11b3o$8276bo15b3o10boo$8291b o3bo9boo$8290bob3obo9bobo$8273boo3boo11b5o11bo$8273boo3boo$8274b5o$ 8275bobo26boo3boo$8262bo41boo3boo$8237bobo21b3o11b3o$8236bo23b5o25boo bbo11b3o$8236bo3bo18boo3boo26bobo11b3o$8236bo23b5o29boo11bo$8236bobbo 20bo3bo30boo$8236b3o22bobo29boboo$8262bo10bo19b3o$8272bo$8272b3o$8260b o17bo9boo3boo10bo$8258booboo14b3o11bo11boo$8267bo8b5o7bo5bo8b3o$8257bo 5bo4bo6boo3boo7booboo6boboo$8266b3o21bobo8boo5b3o$8257booboboo27bo9bo 5bo3bo$8277bo13bo14bo5bo$8277bo28bo5bo$8296bobo10bo$8280boo6boo6boo9bo 3bo$8280bo8bo7bo10b3o$8281b3obb3o20bo$8283bobbo$$8260boo46boo$8260boo 46boo$$8282bo$8283bo$8281b3o$$8295bo$8293b3o$8281bobo8bo$8281boo9boo$ 8282bo4$8250boo$8249b3o$8249b3o$8249boobo37bo$8250b3o36b3o$8251bo26bob o7b5o$8278boo7boo3boo$8279bo8b5o$8288bo3bo$8266bobo20bobo$8266boo22bo$ 8267bo40boo$8265bo41b3o61boo$8265bo23boo13boboo15bo47boo$8265bo23boo6b oo5bobbo8b3o4bobo$8297boo5boboo16bobo4boo$8307b3obboobbo7bobbo3boo13b oo22b3o$8267bo40boobbo3bo7bobo19boo22b3o$8266boo45bobbo6bobo20boo$ 8266bobo44boo8bo23bo$8346bobo$8307boo37bobo19boo3boo$8307boo38bo21b5o$ 8276boo32boo58b3o$8275boo33bobo58bo$8277bo32bo33boo3boo$8344bobobobo$ 8323boo20b5o$8323bobo20b3o$8313bo4boo4b3o7boo11bo$8298bo13boboboobbo4b 3o6boo$8297bo13bo3bob3o4b3o43bo$8282bo14b3o11bo3boboo4bobo42boo$8281b oo28bo3boo6boo44boo$8281bobo18boo8bobo$8301bobo9bo$8301bo46bobo$8300b oo47boo$8291boo56bo20boo3boo$8263bobo16boo6boo80b3o$8266bo13bobbo8bo7b oo69bo3bo$8262bo3bo12bo7boo12bo42b3o25bobo$8266bo4boo6bo6bo14bobo7bo 22boo7bo3bo25bo$8263bobbo4boo6bo22boo7bobo20bo7bo5bo7bo$8264b3o13bobbo 6boo22boo6boo8bobo8bo3bo9boo$8282boo6bobo21boo4bo3bo7boo10b3o9boo$ 8292bo21boo3bo5bo18b3o25boo$8292boo17bobo4boobo3bo12bo33boo$8311bo7bo 5bo11b3o$8320bo3bo11bobobo$8322boo12bobobo4boo$8312bo24b3o5boo$8310boo 26bo$8306boo3boo$8305boo$8307bo30bo$8337b3o21bo$8336bobobo20bo$8321bo 14bobobo20bo$8314boobo3b4o12b3o$8281b3o24boobboobobo4b4o12bo$8281bo25b obobbooboboo3bobbo5boo$8282bo14boo7b3o8boo3b4o5boo$8297boo6b3o8boo3b4o 33boo$8306b3o12bo37bo$8307bobo49bobo4bo$8308boo42bo7b3ob4o$8289boo61bo bo7booboboo$8289bobo63boo5bobbob3o$8289bo65boo6boboboo$8355boo7b4o$ 8352bobo4boo5bo$8352bo6bobo16bo$8361bo12b4obo$8338boo3boo16boo11b3obob o$8296b3o39boo3boo34bobo$8296bo42b5o36bo$8297bo42bobo36boo$8379boo$ 8340b3o36boo3$8304boo$8304bobo$8304bo$8340boo$8340boo4$8311b3o$8311bo 12bo$8312bo8b4o4bo$8308boo10b4o5bo$8308bobo9bobbo9boo$8299b3oboo4b3o8b 4o9boo$8299b4obbo4b3o8b4o$8303boo4b3o12bo$8308bobo$8308boo4$8289boo16b oo$8289boo16boo$$8275boo30bo13boo$8275boo29bobo12boo$8306bobo$8307bo3$ 8304booboboo$8304bo5bo$8275b3o27bo3bo$8274bo3bo8boo3boo12b3o$8289b3o$ 8273bo5bo8bo3bo25boo3boo$8273boo3boo9bobo$8290bo28bo3bo$8320b3o$8276bo 43b3o$8274boobo31bo$8277bo32bo$8273bo3bo13b3o14b3o$8273bobbo8bobo$ 8272b5o8boo4bobo$8272b5o9bo3b5o28bo$8271boo3boo11boo3boo26b3o$8272b5o 12boo3boo7b5o14b3o$8273b3o5bobo18bob3obo6boo$8274bo7boo19bo3bo7boo3boo 3boo$8282bo21b3o13boo3boo$8305bo$$8294boo6boo5bo13bo$8294bo8bo5bobo10b obo$8295b3obb3o6boo13boo$8297bobbo23boo$8323b3o$8274boo46bobo$8274boo 46boo4$8296bobo$8297boo$8297bo11bo$8307b3o$8306bo$8294bo11boo$8294bobo $8294boo4$8303b3o$8302bo3bo$$8301bo5bo$8301boo3boo$8291bo$8291bobo$ 8291boo11bo$8303bobo$8303bobo$8305bo14bo$8305bo12bobo64boo$8279bo22bo bbo11bobo17bo45bobbo$8279boo22boo6boo3bobbo16boo$8279boo30boo4bobo15b oo4boobboo35bo$8279boo37bobo13b3o4boobboo13boo$8279bobo38bo4bobo7boo4b oo17boo21boo$8279bo45boo9boo47bo$8326bo10bo$$8362boo18boo3boo$8288b3o 91boo3boo$8288bo94b5o$8289bo94bobo$$8358boo3boo19b3o$8338bo20b5o$8331b oobo3b4o17booboo$8325boobboobobo4b4o5boo9booboo$8324bobobbooboboo3bobb o5boo10b3o$8294boo27b3o8boo3b4o$8294bobo13bobo9b3o8boo3b4o39bo$8294bo 15boo11b3o12bo42boo$8311bo4boo6bobo54boo$8315bobo7boo60bo$8315bo70b3o$ 8303b3o8boo49bo19b5o$8303bo55bo3bobo18boo3boo$8294bobo7bo53b3o3boo$ 8292bo3bo17boo41b5o$8292bo22bo40bobobobo$8285boo4bo4bo18bobo8boo20boo 6boo3boo23b3o$8285boo5bo23boo7bo22bo37b3o$8292bo3bo7boo18bo12boo7bobo 17bo8boo$8280boo12bobo7bobo17bo7bo4boo7boo11bo4bobo7bobbo$8280boo24bo 17bo8boo5boo16bobobboo9b3o9boo$8306boo17bo4boobbo5b3o8b3o4bobo3bobo7bo bb3o6boo$8326boob5o6boo9b3o5bo4bobbo7booboo$8332bo4boo13bo6boo4bobo7b 5o$8337boo13bo6boo5bo$8287boo63bo6boo10bo$8286boo30b3o3bo26bobo17bo$ 8288bo29bo4bo47bo$8319bo3b3o$8351bobo$8352bo$8352bo$8295bo30bobbo8bo 13bo$8294boo30bo10bobo11b3o$8294bobo25bobbo3boo5bo3boo9b3o$8319b4o3boo bobo4bo3boo3boo40boo$8311boo5b4o14bo3boo3boo40bobo$8311boo5bobbo8boo5b obo32boo13bo$8318b4o16bo34bo$8319b4o50bobo5boo$8302boo18bo44boo5boo5bo bbo$8301boo63bo3bo14bo$8303bo61bo5bo13bo$8365bo3bobbo12bo$8365bo15bobb o$8343bo22bo3bo3bo6boo$8341boo24boo3boobo16boo$8310bo31boo31bo12boobo$ 8309boo64boo11boobbobbo$8309bobo81bobo$8394bo$8352boo3boo$8354b3o36boo $8353bo3bo35boo$8354bobo$8317boo36bo$8316boo$8318bo$$8354boo$8354boo$$ 8325bo$8324boo$8324bobo$8335bo$8334bobo$8323bo8boo3bo$8323b4o5boo3bo9b oo$8313boo9b4o4boo3bo9boo$8313boo9bobbo6bobo$8318bo5b4o7bo$8318bo4b4o$ 8323bo4$8303boo16boo$8303boo16boo$$8289boo44boo$8289boo44boo3$8304bo$ 8289b3o11b3o$8289b3o11b3o$8288bo3bo$8287bo5bo7boo3boo26b3o$8288bo3bo8b oo3boo10boo3boo8bo3bo$8289b3o28b3o$8319bo3bo8bo5bo$8304boo14bobo9boo3b oo$8303bobo15bo$8302boobbo$8288bobo12boo30bo$8288bobbo11boo29boboo$ 8290boobo9bo30bo$8318b3o13bo3bo$8290bo12bo5bo14bobo8bobbo$8290boboo9bo 5bo8bobo4boo8b5o$8291bo5bo6bo3bo8b5o3bo9b5o$8297bobo5b3o8boo3boo11boo 3boo$8297boo17boo3boo12b5o$8285boo3boo37boo5b3o$8286b5o38boo6bo$8286b ooboo8bo$8286booboo6bobo$8287b3o8boo$8308boo6boo$8308bo8bo$8309b3obb3o 5bo$8311bobbo5boo$8321boo$8288boo46boo$8288boo46boo6$8314bo8bo$8312bob o6b3o$8313boo5bo$8320boo$$8307bo$8305boo10b3o$8306boo9b3o$8316bo3bo$ 8315bo5bo$8316bo3bo$8317b3o5$8304bo$8302boo$8303boo$8334boo$8327b3o4b oo63boo$8317boo7b5o6boo10bo49boo$8317boo6bobo3bo5b3o7bobo$8325boo3bo6b oo6boo12boo$8293bobo38boo9boo12boo13boo$8292bo41boo9boo27boo$8292bo3bo 50bobo$8292bo8bo35bo11bo$8292bobbo4boo35bobo$8292b3o5bobo34boo$8398b3o $8397bo3bo$8396bo5bo$8374b3o19bo5bo$8373bo3bo21bo$8342boo9boo17bo5bo 18bo3bo$8342bobo7bobo17booboboo19b3o$8306boo28bo5bo8bo6boobboo35bo$ 8305boo28bobo13bobbobbobboboo$8307bo26boboo13bo6boo15bo668boo$8333boob oo14bobo19bobo23b3o637boobboo$8334boboo15boo19bobo23b3o637boobboboo$ 8316bo5bo7boo3bobo36boo23bo3bo641b3o$8315boo5bobo4bobo4bo36bo19bobo$ 8315bobo4boo5bo42b3o18boo3boo3boo675boo$8328boo41bo3bo18bo650boo31bo3b o$8370bob3obo668boo30bo5bo13boo$8308boo61b5o4bo691boobboobo3bo13boo$ 8308bobo17boo51boo689boo3bo5bo10boo6bo3boo$8303boo4b3o17bo50boo669bo 26bo3bo10b3o5bo3bobo$8299b4obbo4b3o16bobo5bobo22boo686b3o27boo12boo6b 5o$8299b3oboo4b3o18boo3bo3bo22bo686b5o31bobo9boo4b3o$8308bobo7boo15bo 19bo4bobo685bobobobo30boo10boo$8294boo12boo8bobo13bo4bo14b4ob3o686boo 3boo10bo20bo$8294boo24bo14bo12bo4booboboo40boo662bobo$8320boo13bo3bo3b oboo5b3obobbo27bobo10boo661boobbo$8337bobobbob4o5boobobo6b3o20boo674bo bo11bo$8298b3o30bo10boobboo6b4o6bo3bo19bo673bo13bobbo$8298bo31boo23bo 8bo3bo4boo670bo15bo12bo4bo$8299bo30bobo32b3o5boo670b3o5boo6bo3bo8bo3bo $9048bo4bo8bo3bo7boo$9047boo5b3o6bobbo$9048b3o5bo12boo$8335boo712bobo 17boo$8306boo27boo28b3o21bo658bo3bo$8306bobo55bo3bo20bo658b5o$8306bo 32bo9bobo12bo3bo20bo657boo3boo$8348bobbo4bo8b3o680b5o$8334boo11boo5boo 693b3o$8334bobo8boo3bo8boo689bo30boo$8325boobboo6bo9boo10boo719boo10bo bo$8325boobobbobbobbo10bobbo16bo17boo694bo8bobbo4bo$8313b3o13boo6bo11b obo16bo18bo689boo11boo5boo$8313bo20bobo31bo18bobo9bo677bobo8boo3bo8boo $8314bo19boo42bobo7boo8bobo667boobboo6bo9boo10boo$8376bo3bo16bo3boo 665boobobbobbobbo10bobbo$8376bo20bo3boo640bo28boo6bo11bobo$8375bo4bo 16bo3boo638bobo33bobo$8376bo21bobo638boo36boo$8321boo53bo3bo6boo10bo4b oo627boo4boo$8321bobo45bo8bobo6bobo13b4o626boo4boo13b3o$8321bo46b3o18b o12bobobbo633bobo16bobboboobobbo$8368b3o18boo11boobbobo634bo15boobbo4b obboo$8407bobo650bobboboobobbo$8366boo3boo36boo$8366boo3boo35b3o629boo $8407bobo630bo$8328b3o76boo618boo9bobo$8328bo40bo655bo3bo8boo$8329bo 38bobo653bo5bo$8370boo647boobboobo3bo$8370boo647boo3bo5bo$8369b3o653bo 3bo$8368bobo656boo$8336boo30boo$8336bobo$8336bo3$8350bobo$8345boo3bobb o$8338boobboob3o5boo$8337bobo3bo3bo3bo3boo4boo$8327boo7bo8bobo5boo6boo $8327boo7bobbo6boobbobbo$8336bo13bobo$8337bobo$8338boo719bobobbobo$ 9038bo16boobobbobbobboboo$9037bobo12bo6bobobbobo$9035boo3bo11bo$8317b oo16boo698boo3bo11bo$8317boo16boo698boo3bo33boo$9032boo3bobo27b3o4boo$ 8303boo44boo680bobo4bo27b5o6boo10bo$8303boo44boo680bo33bobo3bo5b3o7bob o$8303boo725boo33boo3bo6boo6boo12boo$8304bo12b3o754boo9boo12boo$8303bo bo11b3o754boo9boo$8303bobo10bo3bo766bobo$8304bo30bo13bo696b3o28bo11bo$ 8315boo3boo12b3o10booboo693bo3bo27bobo$8333b5o655boo49bo5bo26boo$8301b oo3boo24boo3boo7bo5bo640bo50booboboo$8301bobobobo677bo5bobo$8302b5o39b ooboboo631bobo4boo$8303b3o13b3o662boobo$8304bo11boo16b3o635boo10booboo 81bo$8316boo16b3o14bo620boo10boobo65bo15bo$8315boo31bobbo632bobo57boo 5b3o15b3obboo$8316bobo14bo17bo633bo59bo4bo8bo14bobo$8317boo13bobo12boo 693b3o5boo7bo14bo$8331bo3bo11bo694bo16bo$8332b3o12bobo$8305bobo9boo3b oo6boo3boo4bo6boo$8306boo9boo3boo15bobo720bo$8306bo4bo28boo720bobo$ 8309boo8b3o26boo3boo690boo3boo10boo17b3o$8310boo7b3o21boo3bo5bo690boo 3boo29bo12bo$8301b3o16bo22boo701b5o31bo8b4o4bo$8300bo3bo44bo3bo693bobo 28boo10b4o5bo$8299bo5bo7bo36b3o725bobo9bobbo9boo$8300bo3bo9boo731b3o 19b3oboo4b3o8b4o9boo$8301b3o9boo7boo6boo737b4obbo4b3o8b4o$8301b3o18bo 8bo710boo29boo4b3o12bo$8323b3obb3o710bobbo33bobo$8325bobbo5bo709bo33b oo$8333bo710bo$8302boo29b3o14boo686bo3bobo$8302boo46boo665b8o12bo3bobo $8996boo19bob4obo12bo4bo$8994bo3bo11bo6b8o13b4o$8993bo5bo10bo$8992bobb o3bo10bo$8999bo32bobo$8337bo652bo3bo3bo28bo4bobbo$8328bo6b3o651boboo3b oo30boo5boo8bo$8329boo3bo654bo33boo8bo3boo5bobo$8328boo5bo652boo33boo 10boo6boboo10boo$8332bobbo610boo84bobbo6booboo10boo$8331bo614bo85bobo 8boboo$8319bo11bobo600bobo7bobo57b3o37bobo$8318bo13bo599bo3bo7boo57bo 3bo21bo5bo9bo$8318b3o611bo95boo4bo$8925boo4bo4bo65bo5bo19boo4b3o$8329b oo3boo589boo5bo69boo3boo$8329bobobobo596bo3bo$8330b5o599bobo$8331b3o$ 8332bo688b3o$9011bo$9002boo5b3o$8316bo686bo4bo16bo4bo$8315bo684b3o5boo 14boo4boo$8315b3o32bo649bo22boo4boo$8350bobo60boo607b3o$8331boo20boo6b oo50boo608b3o$8331boo6boo12boo4bo3bo660bobo$8339boo12boo3bo5bo8boo650b oo$8350bobo4boobo3bo8boo13boo$8350bo7bo5bo23boo613boo3boo41bo$8313boo 44bo3bo640b5o40bobo$8306boo5bobo45boo50bo590booboo27boo9boo$8305b3o5bo 37bo60b3o589booboo27boo9boo12boo$8305b3o41boo61b3o590b3o19boo3bo6boo6b oo12boo$8305boobo41boo37bo637bobo3bo5b3o7bobo$8306b3o80bo20boo3boo583b oo26b5o6boo10bo$8307bo80bobo19boo3boo583bobbo25b3o4boo$8387booboo644b oo$8355boo29bo5bo584b4o$8354boo10bobo20bo23boo561b6o18boboo$8318b3o35b o8bobbo17boo3boo19bobo560b8o12boobbobo$8318bo32boo11boo10boo33boobbo 539boo17boo6boo11bo4bo$8319bo31bobo8boo3bo8boo34boo541bobo10bo6b8o16bo $8354bo9boo5boo14b4o21boo544bo9bo7b6o14bobbo$8351bobbo10bobbo4bo13bobb oo20bo542bobbo9bo8b4o$8328boo24bo11bobo19boboo507boo57bo32bobo$8328bob o13boo5bobo58bo5bo480bo48boo5bobo33bo3bo$8328bo7bo6bobo5boo36boo21bo5b o462bo5boo8bobo47bobo5boo38bo7bo$8334boo7bo46bo22bo3bo461bo3bo3b3o7boo 48bo33boo8bo4bo4b4o$8335boo5boo70b3o466bo5boobo53boo33boo12bo4boboboo 9boo$8878bo5bo4bobbo98bo3bo3bobbob3o8boo$8323bo60booboboo487boo9boobo 69b3o26bobo6boboboo$8318bo4b4o15boo40bo5bo5bo7bo482b3o111b4o$8318bo5b 4o15bo41bo3bo7bo5b3o481boo73bobo38bo$8313boo9bobbo15bobo4bo25boo8b3o6b 3o4boobo555b5o26bo$8313boo9b4o16b3ob4o24bo25bo557boo3boo25bobo$8323b4o 5boo12booboboo14boo5bobo583boo3boo25boo$8308boo13bo8bobo11bobbob3o11bo bbo5boo30bo$8308boo24bo12boboboo11bo49boo$8312bo21boo12b4o12bo15bo33b oo$8311boo30boo5bo5bo7bo14b3o22b4o$8311bobo29bobo9bo9bobbo33bo4boo560b o19boo$8343bo11b3o9boo18boo10b3o558boo5b3o19bobo$8379b3o5boo10bobobobo boo552bo4bo19boboo$8398boobo3boboo549b3o5boo19bo$8379bobo17bo3bo3bo 550bo27bo$8379bobo17b3obo3bo$8319boo28boo50bobobo$8318boo29boo28b3o$ 8320bo675b3o$8361bo49b3o582bo$8360bobo16b3o29bo585bo9bo$8348bobo8boboo 17bo31bo548boo3boo38bobo$8348bobbo6booboo10boo619bobo8boboo$8327bo11b oo10boo6boboo10boo587bo3bo27bobbo6booboo10boo$8326boo11boo8bo3boo5bobo 37boo561b3o19boo10boo6boboo10boo$8326bobo15boo5boo8bo19b3o17bo561b3o 19boo8bo3boo5bobo$8343bo4bobbo49bobo7boo545boo30boo5boo8bo$8348bobo40b o10boo6bobo545boo29bo4bobbo$8389b4o16b3o4boo576bobo$8388boboboo14b3o4b obbo540bo$8387bobbob3o14b3o5bo515bo6bo17bobo$8334boo52boboboo16bobo 439boo78boo6boo11boobbobbo$8333boo47b3o4b4o8boo8boo439bo60boo16b3o6b3o 10boobo$8335bo46b3o6bo9bobo13b4o421boo5boobo60bobbo9bo5boo6boo15boo$ 8381bo3bo17bo12bo4bo419bobo7bo65bo8bo6bo6bo$8403boo11bo3bobo417b3o4bo 69bo8bo$8380boo3boo30bo3bobo407boo6b3o4bobbo67bo33bo$8423bo407boo7b3o 4boo57boo5bobbo34bobo$8342bo80bo417bobo61bobo5boo37bobo7bo$8341boo77bo bbo418boo61bo33boo11bobbo6boo$8341bobo77boo481boo33boo11bobobboo4boo8b oo$8951bobo3boo4b3o7boo$8920b3o28bo5boo4boo$8919booboo38boo$8919booboo 38bo$8919b5o26bo$8349boo31boo534boo3boo24bo$8348boo32boo565b3o$8350bo 3$8937b3o$8357boo9bo558bo$8356b4o7bobo548boo5b3o$8351bobobbobb3o5boobo 548bo4bo14b3o4boo$8350bobbobboo9booboo3boo539b3o5boo12boobo3bobbo$ 8341boo6boo9bo6boobo4boo539bo20boboo4bobbo$8341boo4boo3bo8bo5bobo566b ooboo4bobo$8349boo10bo6bo569boo$8350bobbo585bobbo$8351bobo586bobo$$ 8965bo$8963b4o$8331boo16boo569b5o28bobo6boboboo$8330bobbo15boo568bob3o bo3b3o21bo3bo3bobbob3o8boo$8333bo586bo3bo6bo11boo12bo4boboboo9boo$ 8317boo14bo29boo556b3o6bo12boo8bo4bo4b4o$8317boo12bobo29boo440boo109b oo4bo34bo7bo$8331bobo29boo440bo109bobbo34bo3bo$8332bo15b3o12bo428boo9b obo112bo34bobo$8207bobo138b3o11bobo425bo3bo8boo113bo$8210bo136bo3bo10b obo424bo5bo94boo6boo12bo3bobo$8206bo3bo118boo3boo27bo420boobboobo3bo 93bobbo4bobbo10bo3bobo$8210bo118bo5bo10boo3boo431boo3bo5bo75boo15b6obb 6o9bo4bo$8207bobbo579bo3bo76b3o10bo4bobbo4bobbo11b4o$8208b3o119bo3bo 25boo3boo425boo79boobo6bobo4boo6boo$8331b3o26bobobobo506bobbo7boo$ 8361b5o507boobo33bo$8316b5o25b3o13b3o499boo5b3o35bobo$8315bob3obo28boo 11bo499bobo5boo35bo3boo6boo$8316bo3bo29boo511bo33boo9bo3boboo4bobo$ 8317b3o31boo509boo33boo9bo3bob3o4b3o7boo$8318bo30bobo526b3o28boboboobb o4b3o6boo$8329bo19boo527b3o29bo4boo4b3o$8329bobo545bo3bo38bobo$8329boo 562boo25boo$8316bo27boo3boo9bobo513boo3boo9boo$8316bo17bo9boo3boo9boo 532bo12bo$8315bobo15b3o25bo545bobo$8314booboo13b5o9b3o558boo$8313bo5bo 3boo6boo3boo8b3o$8316bo6boo7b5o10bo16b3o$8313boo3boo12bo3bo26bo3bo$ 8333bobo26bo5bo516bo$8334b3o26bo3bo508boo5b3o14bo$8315bo14bo5boo6boo 18b3o510bo4bo16bo$8315bo15bo4bo8bo18b3o507b3o5boo15b3o$8314bo14b3o5b3o bb3o529bo$8339bobbo$$8207bobo106boo46boo545b3o$8210bo105boo27bobo16boo 545bo$8206bo3bo134boo565bo$8210bo135bo533bo43bo$8207bobbo547boo119b3o 42boo$8208b3o547bo119b5o30bo5boo4boo$8750bo5bobo118boo3boo29bobo3boo4b 3o7boo$8351bo397bobo4boo120b5o18boo11bobobboo4boo8boo$8349b3o397boobo 125bo3bo18boo11bobbo6boo$8348bo388boo10booboo120boo3bobo32bobo7bo$ 8348boo387boo10boobo121bobbobbo32bobo$8749bobo161bo$8342bobo405bo$ 8342boo530boboo$8343bo503bobbo4bobbo10boobbobo$63boo8765bo14b3obb6obb 3o8bo4bo$64bo8265bobo497b4o8bo4bobbo4bobbo14bo$64boboo5boo8255boo499b 4o6bobo26bobbo$65bo7bobo8255bo499bobbo7boo$69bo4b3o8754b4o32boo$67bobb o4b3o6boo8258b5o473boo6b4o32bo$68boo4b3o7boo8257bob3obo471bobo6bo34bo 12boo$73bobo8268bo3bo472bo33boo8bo7bo4boo$73boo8270b3o472boo15bo17boo 8bo8boo5boo6boo$8346bo489b3o27bo4boobbo5b3o5boo$8835bo3bo27boob5o6boo$ 8364boo468bob3obo32bo4boo$74bo8252bobo32bobbo61boo406b5o38boo$75bo 8251boo16boo14bo15bobo47boo$73b3o8252bo16boo6boo6bo10b3obbo3bo483bo$ 8353boo6bo19bo5boo475bo$8325boo35bobbobboo7bo4bo4boo13boo23bo430b3o3b 3o$40boo3bobbo3boo8270boo38boobbobbobo7bo20boo22bobo432bo$40b5o4b5o16b o8255bo42b3o5bo3bo43bo3bo427boo3bo$40boo3bobbo3boo16bobo8304bobo45b5o 427bobobbo$71bobo8328b3o19boo3boo412bo16bo$71bobbo8327b3o20b5o404boo5b 3o17bo3boo$34boo35bobo8288bo63b3o406bo4bo8bo7boobobo$33bobo34bobo3boo 8145boo94bobo39bo65bo404b3o5boo7bo7boobboobobboo$19bo12b3o4boo29bo5bob o8144b3o96bo38b3obb3o463bo16bo11boboobobbo$19b4o8b3o4bobb4o33bo8144b3o 92bo3bo8bo34bo33boo3boo455bobo3bobo$9boo9b4o8b3o4boob3o33boo8142boboo 96bo7boo35bo33b5o305boo149b3o3bobo$9boo9bobbo9bobo8186b3o94bobbo7bobo 46bo22b3o23bo282bo159bo$14bo5b4o10boo8187bo96b3o56boo22bo21boo272bobo 7bobo157bo$14bo4b4o8bo8336bo5boo4boo8boo33b3o269bo3bo7boo127bo$19bo12b o8335bobo3boo4b3o7boo34boo269bo139b3o42boo$30b3o28b3o8276boo27bobobboo 4boo44bo263boo4bo4bo134b5o41bobo$60bo3bo8274boo28bobbo6boo44bobo262boo 5bo137boo3boo30bo4boo4b3o$59bo5bo8275bo27bobo7bo45boo270bo3bo169bobob oobbo4b3o6boo$59bo5bo8292boo8bobo328bobo157boo9bo3bob3o4b3o7boo$62bo 8294bobo8bo35bo431bo22boo9bo3boboo4bobo$60bo3bo8292bo47boo19booboboo 399boobboboo30bo3boo6boo$42boo17bo48boo8235bo8boo46boo426boo4boobbo28b obo$42boo12bo5bobbo45bo8234bo72bo6bo5bo409bobo27bo$56b3o6bo45bobo9boo 8213boo6b3o68boo414bo8boo$37boo7boobbo8bo4bo47boo8bo3bo8210bobo16boo 60boo7booboo400bobo$38boo10boo6boo5b3o53bo5bo8208bo6boo12bo71bo375bobb oboobobbo10boobbobbo$33boobbo13boo14bo53bo3boboobboo8194boo7bobbobbobb o11bobo6bo23boo6boo3boo384bo14boobbo4bobboo9boobo$33boo12bobboo69bo5bo 3boo8194boo7bo6b3o12boo6b4o20bo9b3o8bobo375bobo8bo4bobboboobobbo14boo$ 46boboo72bo3bo8210bobo5b3o19b4o7bo9bobo8bo3bo8boo378boo5bobo$45boo76b oo8213boo6bobo18bobbo6bobo8boo10bobo9bo379boo6boo$47bo8300bo6boo10b4o 4boo3bo20bo26boo362boo30boo$26boo30boo3boo8283boo4boo10b4o5boo3bo47boo 350boo7bobo31bobo$8bo5boo9bobo30bo5bo8291bo9bo8boo3bo13bo384bobo7bo32b o13bobo$6bo3bo3b3o10bo8349bobo13b3o383bo15bo17boo7bobbo6boobbobbo$10bo 5boobo11bo27bo3bo8314bo13b5o4boo16bo358boo14bobo16boo7bo8bobo5boo6boo$ 5bo5bo4bobbo10boo28b3o8304bobo31boo17boo371bo3bo25bobo3bo3bo3bo3boo4b oo$5boo9boobo9boo4boobboo8326boo50boo372b5o26boobboob3o5boo$14b3o11b3o 4boobboo8289b3o35bo423boo3boo32boo3bobbo$14boo13boo4boo29boo8262bo462b 5o38bobo$30boo34boo8263bo31boo429b3o$31bo8331boo52bo377bo$66bo8325b5o 20bo404bo$65bobo8308boo15b3o21bo404bobo$65bobbobboo12bobobbobo8276bob oo3b3o15bo427boo$69boboo8boobobbobbobboboo16bo8224boo25bobbo3bo5boobo$ 67boo16bobobbobo6bo12bobo8223bobo23boobbo4bo4bobbo5boo$99bo11bo3boo 8120bobo98bo14boo8boo5b4o4boobo5boo412bo$99bo11bo3boo8119bo116boo7b3o 7bo3b3o17boo16boo248boo126boo5b3o$76boo33bo3boo8119bo3bo122boo11boo17b obo17bo248bo128bo4bo8bo$76boo4b3o27bobo3boo8116bo127boo30bo18bobo4bo 223bo5boo8bobo89bo35b3o5boo7bo$62bo10boo6b5o9bo17bo4bobo8115bobbo125bo 41bo8boo3bobo220bo3bo3b3o7boo90bobo33bo16bo15boo$62bobo7b3o5bo3bobo8b oo23bo8115b3o162bo5b4o9boboo224bo5boobo96boo67boo$51boo12boo6boo6bo3b oo7bobo23boo8223b3o50boobboo4b4o7booboo219bo5bo4bobbo168b3o$51boo12boo 9boo8267bo62bobbo8boboo219boo9boobo168bo$65boo9boo8268bo61b4o9bobo228b 3o141bo30bo$62bobo8342b4o4boo5bo229boo141b3o$62bo11bo28b3o8301bo7bobo 16boo358b5o41boo$72bobo27bo3bo8310bo12boobboo357bobobobo35bo4boo$73boo 26bo5bo49boo8235boo3boo16boo11boobboboo355boo3boo29boob5o6boo$101boobo boo50bo8194boo39bo5bo34b3o296bo93bo4boobbo5b3o5boo$158bobo5bo8186bobo 378bobo80boo8bo8boo5boo6boo$159boo4bobo8185bo41bo3bo334boo60bo20boo8bo 7bo4boo$164boboo8228b3o36boo353boo5bo29bo12boo$81bo81booboo10boo8255b oo352bobbobbobo30bo$82bo15bo65boboo10boo8612bo3bo32boo$76boobb3o15b3o 5boo57bobo8624bo$75bobo23bo4bo59bo8619bo3bobo$77bo22boo5b3o8250b3o399b obboo4boobbo9bo3bobo$109bo8250bo388bo11bo3b3obb3o3bo8bo4bo$8361bo34boo 316bo33bobo7bo3bobboo4boobbo10b4o$8396boo316bobo31boobo5bobo$89bo8624b oo32booboo5boo$87bobo8658boobo30boo$68b3o17boo10boo3boo8631boo8bobo29b obbo$57bo12bo29boo3boo8261boo367bobo9bo29bo15bobo$52bo4b4o8bo31b5o 8262bobo9boo5bo349bo14b3o16boo6bo10b3obbo3bo$52bo5b4o10boo28bobo8263bo 10b3o3bo3bo346boo14b3o16boo6bo19bo5boo$47boo9bobbo9bobo8290bo11boboo5b o394bobbobboo7bo4bo4boo$47boo9b4o8b3o4boob3o19b3o8259boo10bobbo4bo5bo 391boobbobbobo7bo$57b4o8b3o4bobb4o8272boobboo4boo9boboo9boo303bo92b3o 5bo3bo$57bo12b3o4boo29boo8245boobboo4b3o11b3o312bobo53boo3boo38bobo$ 71bobo33bobbo8248boo4boo13boo312boo55b5o$72boo33bo8256boo386b3o$107bo 8256bo388bo26bo$107bobo3bo8136boo365boo160bo$108bobo3bo12b8o8114b3o 365bo161b3o$109bo4bo12bob4obo19boo8093b3o355boo5boobo$110b4o13b8o6bo 11bo3bo8091boobo92boo16boo241bobo7bo$141bo10bo5bo8091b3o92boo16boo240b 3o4bo146bo14bo3bo$141bo10bo3bobbo8091bo344boo6b3o4bobbo59bo75boo5b3o 13bobobobo$117bobo32bo8178boo44boo217boo7b3o4boo60bobo74bo4bo15bo4bobo $116bobbo4bo28bo3bo3bo8169boo30bo13boo227bobo65boo72b3o5boo15boboobo$ 106bo8boo5boo30boo3boobo8199b3o242boo139bo25bo$105bobo5boo3bo8boo33bo 8198bo3bo418boo$93boo10boobo6boo10boo33boo8199bo420bobo$93boo10booboo 6bobbo84boo8154bo5bo8boo377bo29bo$105boobo8bobo85bo8154bo5bo386b3o$ 105bobo37b3o57bobo7bobo8125booboboo11bo3bo387b3o$106bo9bo5bo21bo3bo57b oo7bo3bo8142b3o433bobo$117bo4boo95bo8111b3o9bo5bo304bo96boo3boo35boo3b obbo$115b3o4boo19bo5bo65bo4bo4boo7633boo468bo3bo39boo3boo273bobo94boo 3boo28boobboob3o5boo$143boo3boo69bo5boo7633boo467bo5bo8booboo26b5o274b oo129bobo3bo3bo3bo3boo4boo$215bo3bo8109booboboo10bo28booboo395boo7bo8b obo5boo6boo$215bobo8147bo9booboo395boo7bobbo6boobbobbo$7863bo21boo489b 3o369boo34bo13bobo$128b3o7731bo22boo445bo415bobbobboo29bobo$140bo7721b o468bobo31bo420boo$140b3o5boo8181bobo29bobo$121bo4bo7bo8bo4bo8182boo 10bo20boo382boboo$120boo4boo6bo7boo5b3o7706boo3boo50boo413bo10boo4b3o 284bo89bo4bo13boobbobo$121boo4boo5bo16bo7709bo53bo413b3o10boobbo3bo 283bobo70bo14boob4oboo11bo4bo$127b3o7728bo5bo43bo4bobo412bo3bo40bo260b oo70b4o6bo7bo4bo17bo$126b3o7730booboo43bobo3boo412bob3obo11bo5bo6boo3b oo8bobo3bo325boobobo4bobo26bobbo$125bobo7732bobo44boobo417b5o12boo3boo 21boo3b3o323b3obobbo4boo$125boo7734bo20booboboo18booboo425boo20bo3bo 13b5o323boobobo29boo$7861bo45boobo426boo21b3o13bobobobo313boo8b5o28b3o $100bo41boo3boo7733bo5bo18bobo450b3o13boo3boo312bobo9bo3bo24boboo15bo$ 100bobo40b5o7760bo786bo14bobo16boo5bobbo8b3o4bobo$103boo9boo27booboo 7735booboo7boo797boo14bobo16boo5boboo16bobo4boo$89boo12boo9boo27booboo 7737bo9boobboo449boo6boo19bo234bo96bo27b3obboobbo7bobbo3boo$89boo12boo 6boo6bo3boo12b3o4b3o7746boobobboo449bo8bo18bobo233bobo123boobbo3bo7bob o$100bobo7b3o5bo3bobo12bo7725bobo27b3o448bobo4b3obb3o19bobo189boo42boo 129bobbo6bobo$100bo10boo6b5o14bo11boo7712boo479boo6bobbo22bo190bo137b oo3boo30boo8bo$114boo4b3o25bobbo7706b3o3bo398bobo79bo32boo177boo9bobo 137bobobobo$114boo7741bo3bo32boo370bo63boo46boo175bo3bo8boo139b5o$171b 4o7681bo5bo19bo11boo366bo3bo63boo46boo174bo5bo149b3o$148boobo18b6o 7680booboboo17boo4b3o377bo91bo190boobboobo3bo150bo25bo$150bobobboo12b 8o7704boobbo3bo373bobbo91bobo188boo3bo5bo176bobo$151bo4bo11boo6boo17b oo8067b3o91boo195bo3bo177boo$152bo16b8o6bo10bobo7662bo8bobo13bo5bo666b oo35bo$152bobbo14b6o7bo9bo7664bobo9bo13boo3boo703bobo120bo$171b4o8bo9b obbo7661bobo8boo494bo228boo112boo5b3o$158bobo32bo57boo7606bo8b3o492b3o 343bo4bo$156bo3bo33bobo5boo48bo7615b3o16bo474bo343b3o5boo$148bo7bo38b oo5bobo47bobo8boo5bo7588boo8bobboo12bobo5bo467boo342bo$147b4o4bo4bo8b oo33bo48boo7b3o3bo3bo7586boo9b3o13bobo4bobo833boo10bo$135boo9boobobo4b o12boo33boo53boboo5bo7602bobb3o11bo823bo15bobbo$135boo8b3obobbo3bo3bo 98bobbo4bo5bo7614bo466bo356bo16boo$146boobobo6bobo26b3o69boboo9boo 7611bobbo4b3o459bobo353bobo$147b4o111b3o7621boo5b3o459boo217bo135boob oo$148bo38bobo73boo7629bo679bobo132bo5bo41bobo$159bo26b5o8152bo15b3o 212boo136bo36b3o5bo3bo$157bobo25boo3boo8151bobo12bo3bo346boo3boo28boo bbobbobo7bo$158boo25boo3boo7702bo448boo12bo5bo378bobbobboo7bo4bo4boo$ 7871bo21b3o461booboboo369boo6bo19bo5boo$7871bo21b3o837boo6bo10b3obbo3b o$7871bo834boo33bo15bobo$8360bo345boo34bobbo$166bo15bo7675bobo32bobo 463bobo382boo$167bo14b3o5boo7666boo34bo464bobo192bo152bo$165b3o8bo8bo 4bo7668bo64boo434bo15bobo175bobo125b6o18bobo$176bo7boo5b3o7679boo50bo 448bo3bo62boo111boo125bo6bo12boobbobbo$176bo16bo7679bo51bobo7bo403b3o 17boo13bo19bo45bobbo220bo15bo8bo11boobo$7864boo5bobo52boo5bobo402bo3bo 16boo6boo4bo4bo14b4o43bo222boo16bo6bo16boo$7864boo5boo6bo51boo410bo23b oo5bo12bo4boobobo3boo37bo221boo4boo3boo7b6o$7861boo16boo50boo12boo390b oobobo31bo3bo3boboo5b3obobbobboo13boo22bobo218b3o8boo$153b3o7704b3o12b oo3boo49boo12boo394bo34bobobbob4o5boobobo18bobbo20bobo219boo6bo3bo23bo $155bo7705boo17b3o50bobo445boobboo6b4o44bo212boo7boo5bo24b4o$144bo9bo 7709boo14boo53bo458bo25bo102boo128bobo8bo5bo23b4o16bo$143bobo38boo3boo 7673boo6boo5boo642bo10bo118bo14bobo16boo5bobbo8boo5bobo$143boobo8bobo 7696bo16bobo5bo538boo18boo3boo70bo5bobo10bobo115boo14bobo16boo5b4o14bo 3boo3boo$131boo10booboo6bobbo27bo3bo7663bob4o12bo407boo99bo36bo20bo5bo 69bobo4boo11boo133bo25b4o3boobobo4bo3boo3boo$131boo10boobo6boo10boo19b 3o7663bobob3o11boo407b3o97boo133boobo180bobbo3boo5bo3boo$143bobo5boo3b o8boo19b3o7662bobo425b3o61boo29bobobbobo57bo3bo58boo10booboo183bo10bob o$144bo8boo5boo30boo7658bo425boboo61bobo28boo38boo3boo19b3o59boo10boob o148boo3boo29bobbo8bo$154bobbo4bo29boo7658boo35b5o384b3o54boo6bo31bo 38boo3boo93bobo149boo3boo$155bobo7694boo34bob3obo384bo55b3o55boo20b5o 95bo$192bo7659boo35bo3bo441b3o48boboo3b3o20bobo249b3o$191bobo17bo6bo 7671b3o441boboo44bobbo3bo5boobo5boo262b3o24bo$191bobbobboo11boo6boo78b oo7591bo442b3o15b3o26boobbo4bo4bobbo5boo10b3o95bo154bo24bo$195boboo10b 3o6b3o16boo60bo8035bo16bo27boo5b4o4boobo115bobo179bo$193boo15boo6boo5b o9bobbo60boboo5boo7578boo463bo25b3o7bo3b3o42bo75boo173b3obobbo$211bo6b o6bo8bo65bo7bobo7578bo490boo11boo43bobo234bo$225bo8bo69bo4b3o7574b3o 483boo7boo55boo226boo5b3o11bo7bo$200bo33bo67bobbo4b3o6boo7565bo484bobo 8bo284bo4bo14bo7bo$198bobo34bobbo5boo57boo4b3o7boo8050bo48bo22bo220b3o 5boo13bobobbobbo$189bo7bobo37boo5bobo61bobo8059boo49bo20b3o219bo28boo 4boo$188boo6bobbo11boo33bo61boo8109b3o19b5o253bobo$177boo8boo4boobbobo 11boo33boo7732boo369bobo4boo55bo24boo3boo223bo28bo$177boo7b3o4boo3bobo 7780bo368bobbo4bo11boo42b3o16bo7b5o222booboo$187boo4boo5bo28b3o7749bob o6bobo356boo7bobo10bo41b5o14boo7bo3bo$188boo38booboo7658bo4bo85boo6bo bbo347boo4boo3bo18bobo9bo20boo6boo3boo12boobo7bobo222bo5bo$189bo38boob oo7656boob4oboo14bo79boo346boo6boo21boo8bobo19bo26boo10bo263boo8bo$ 201bo26b5o7658bo4bo7bo6b4o76bo3boo4boo347bobbo6boo19bo3boo6boo7bobo25b oo235booboboo6bo26bobbo6bobo$202bo24boo3boo7669bobo4boboboo77boo6boo 348bobo6bobo4b3o11bo3boboo4bobo6boo27boo246bo22boobbo3bo7bobo$200b3o 7700boo4bobbob3o73bobbo368bo4bo13bo3bob3o4b3o17b3o25boo235b3o19b3obboo bbo7bobbo3boo$7879boo29boboboo74bobo369boo4bo13boboboobbo4b3o16b3o25b oo247boo5boboo16bobo4boo$208boo7669b3o28b5o8boo458bo4boo4b3o10b3o281b oo5bobbo8b3o4bobo$207boobo7654bo15boobo24bo3bo9bobo467bobo12bo18boo 235boo32boboo15bo$210bo7652bobo4b3o8bobbo5boo16bobo14bo467boo13bo6boo 10boo234bobbo34b3o$206b4o14bo7631boo4bobo16boobo5boo16bobo14boo417bo 62b3o5boo225boo22bo35boo$209bo14b3o5boo7622boo3bobbo7bobboobb3o27bo 433boo35bo259bo4bo20bo$201b3o3b3o17bo4bo7629bobo7bo3bobboo462bobo34bob o24b3o20bo3boo203bo6bo13bo3bobo$200bobbobo4boo14boo5b3o7627bobo6bobbo 504boo25b3o19boo4boo201bo8bo11bo3bobo$200bo5bobo26bo7629bo8boo30boo3b oo464boo50boobb3obo183boo15bo8bo11bo4bo$200boobo3bo7698bobobobo464boo 28b3o20boo44boo142bobo15bo8bo12b4o$202b3o7702b5o496bo22b3o42bo142b3o 17bo6bo$196boo4b3o7703b3o472boo8bo14bo23bo31bobo7bobo141b3o19bo4bo$ 195bobo7685bo25bo441boo30bobbo6bobo11b3o52bo3bo7boo143b3o5bo14boo11bo$ 197bo7683bobo466boo26boobbo3bo7bobo65bo149boo6bobo4bobo23bobo$186bo 7695boo409bobo56bo24b3obboobbo7bobbo3boo52boo4bo4bo144bobo7boo7bo20boo 18boo$185b4o8103bo74boo5boboo16bobo4boo52boo5bo148bo33boo4boo17bo3bo$ 184boobobo6bobo28b5o7671bo388bo3bo70boo5bobbo8b3o4bobo14boo16boo32bo3b o143boo16boo15boo4boo16bo5bo3boo$173boo8b3obobbo3bo3bo27bob3obo7670b3o 5boo379bo81boboo15bo15bobo17bo34bobo160bo25bobo4bo8bo3boboobboo$173boo 9boobobo4bo12boo18bo3bo7674bo4bo380bobbo81b3o30bo18bobo5boo216bo3bo9bo 5bo$185b4o4bo4bo8boo19b3o7674boo5b3o377b3o64bo18boo44bo5boo5bobo219b3o bbo5bo3bo$186bo7bo34bo4boo109boo7567bo121boo320boo63bobo14bo183boo3boo 40boo$194bo3bo34bobbo109bo7532bo10boo145bo320bobo61bo3boo9bobbo186bo$ 196bobo34bo112bobo9boo7529bobbo15bo128bobo8boo372bo3boo12bo183bo5bo$ 233bo113boo8bo3bo7528boo16bo129boo6bobbo372bo3boo9bobo185booboo$233bob o3bo12boo6boo94bo5bo7544bobo135bo7b5o365bobo3boo6boo6bobbo177bobo$234b obo3bo10bobbo4bobbo93bo3boboobboo7538booboo134bo6bo5bo365bo4bobo16bo 178bo$235bo4bo9b6obb6o15boo75bo5bo3boo7493bobo41bo5bo133bo7boo3bo372bo 12bo4bo177bo$236b4o11bobbo4bobbo4bo10b3o76bo3bo7497bo3bo5b3o36bo137bo bbo7bo308boo63boo11boobbobo204bo$252boo6boo5bo7boboo79boo7499bo7bobobb obboo28boo3boo136boo315boo41booboboo34boboo180bo19boobo$267bo7bobbo 7573boo4bo4bo7boobbobbo488bo256boo5b3o6boobboobo3b3o$241bo33boboo7573b oo5bo19bo6boo520bo5bo210bo4bo9boo5bo3bo6bo$240bobo35b3o5boo7571bo3bobb 3o10bo6boo561bobbo169b3o5boo9bo5bo5boo3bo$230boo6boo3bo35boo5bobo7572b obo15bo33boo494booboo35boo171bo18bo11boo4bo$229bobo4boobo3bo9boo33bo 7586bobbo34boo496bo216bo12bobbo13boo$219boo7b3o4b3obo3bo9boo33boo7585b oo497bo252bobo11bobbo10boo$219boo6b3o4bobboobobo28b3o7639bo459boo251bo 3bo11boo$228b3o4boo4bo29b3o7638bobo16boo6boo432bobo251b3o$229bobo38bo 3bo7637bobbobboo9bo4bobbo4bo553bo128boo3boo7boo$230boo7684boboo9bo4bo bbo4bo13bobo451boo83boo141bobo23bobbo8bo$269boo3boo7638boo13bo4bobbo4b o3bo9bobbo450boo83bobo142bo23bo10bobo$244bo7686boo6boo4bobo11boo699bo bbo3boo5bo3boo$242bobo7700boo10bo3boo694b4o3boobobo4bo3boo3boo$243boo 7680bo33boo420boo266boo5b4o14bo3boo3boo$7924b4o28bobbo5boo413boo267boo 5bobbo8boo5bobo$7907boo14boobobo27bobo6bobo414bo9bo229boo32b4o16bo$ 7899bo7bobbo11b3obobbobboo33bo422bobo229bobbo31b4o$266bo7631bo3boo7bo 11boobobo3boo33boo409boo9bobo268bo$251bo14b3o5boo7622bo5bo6bo12b4o450b 3o7bobbo11boo$252bo16bo4bo7624b5o7bo7bo5bo53bo112boo275boo9boobo5bobo 11boo191boo6boo16boboo$250b3o15boo5b3o7629bobbo9bo59bo112bo275bo5bo4bo bbo6bobo202bobbo4bobbo10boobbobo$277bo7629boo9b3o57b3o112bobo6bo271bo 5boobo8bo186boo14bobbo4bobbo10bo4bo$253boo7839boo6boo266bo3bo3b3o198b oo14bobbo4bobbo14bo$252bobbo7841boo4boo201boo64bo5boo196boo18boo6boo 12bobbo$238b3o12boo7693boo3boo142boo4b3o7boo190b3o267b3o$240bo7709b3o 144boo4boo8boo190b3o268boo33bo$239bo7709bo3bo148boo201boobo261boo7boo 29bobo$227bo43bo7678bobo149bo203b3o260bobo7boo28boboo15boo$226boo42b3o 119boo7535b3o19bo355bo261bo33boo3booboo14bobo$225boo4boo5bo30b5o119bo 7532bo18bo622boo16boo15boo4boboo13bo6boobboo$215boo7b3o4boo3bobo29boo 3boo118bobo5bo7523bobo17b3o5boo655bobo13bobbobbobboboo$215boo8boo4boo bbobo11boo18b5o120boo4bobo7523bobo19bo4bo657bo5bo8bo6boo$226boo6bobbo 11boo18bo3bo125boboo7525bo18bo6b3o660bobo7bobo$227bo7bobo32bobo3boo 120booboo10boo7507b6o19bobbo5bo660boo9boo$236bobo32bobbobbo121boboo10b oo7507b5o24bo630booboboo$238bo161bobo7545bo3bo$401bo7548bo631bo5bo$ 274boobo7669bo5bo$276bobobboo10bobbo4bobbo7642bo5bo629booboo22bo$277bo 4bo8b3obb6obb3o14bo7581boo9boo32bo3bo632bo23bo$278bo14bobbo4bobbo4bo8b 4o7581bobo7bobo33b3o657b3o$278bobbo27bo7b4o7577boo6bo8bo5bo669bo$309bo 7bobbo7573boobobbobbobbo13bobo659boo5b3o$283boo32b4o7573boobboo6bo13b oobo4boo653bo4bo8bo$285bo32b4o6boo7573bobo14booboo3boo650b3o5boo7bo16b oo$207boo63boo12bo34bo6bobo7572boo15boobo31boo623bo16bo16bobo$207boo 63boo4bo7bo8boo33bo7589bobo31bobbo627b3o14bo11bo$261boo6boo5boo8bo8boo 17bo15boo7589bo32bo630b3o14bobo$261boo5b3o5bobboo4bo27b3o7638bo629bo3b o13boo$232boo35boo6b5oboo27bo3bo7637bobo3bo622bo5bo$232boo38boo4bo32bo b3obo7637bobo3bo12b8o602bo3bo$272boo38b5o7639bo4bo12bob4obo19boo582b3o 45boo$7957b4o13b8o6bo11bo3bo616b3obbo5bo3bo$286bo7700bobo9bo5bo611bo3b o9bo5bo$287bo7699boo10bo3bobbo608bobo4bo8bo3boboobboo$207b3o75b3o3b3o 7670bobo32bo607boo4boo16bo5bo3boo$206bo3bo79bo7672bobbo4bo28bo3bo3bo 598boo4boo17bo3bo$205bo5bo77bo3boo7658bo8boo5boo30boo3boobo570boo31boo 18boo$205bo5bo19b3o55bobbobo7657bobo5boo3bo8boo33bo36bo533boo33bobo$ 208bo21bo3bo56bo16bo7631boo10boobo6boo10boo33boo33bobo570bo$206bo3bo 18bo5bo49boo3bo17b3o5boo7622boo10booboo6bobbo78boo534bo$207b3o19boobob oo53boboboo16bo4bo7635boobo8bobo587boo6boo16bobo$208bo74boobboboobboo 15boo5b3o7632bobo37b3o324bobo230bo4bobbo4bo9boobbobbo$282bobboboobo28b o7633bo9bo27bo3bo326bo213bobo13bo4bobbo4bo9boobo$232bo48bobo3bobo7674b o353bo3bo212bobbo13bo4bobbo4bo13boo$205b3o23bobo47bobo3b3o149boo7521b 3o25bo5bo325bo211boo18boo6boo$205b3o23bobo46bo159bo7549boo3boo322bobbo 209boo3bo$204bo3bo23boo48bo157bobo7bobo7867b3o211boo33bo$234bo78bo127b oo7bo3bo8073boo5bobbo28b4o$203boo3boo23b3o32boo42b3o139bo8072bobo6bobo 27boboboo14boo$232bo3bo30bobo41b5o134bo4bo4boo8065bo33boobbobbob3o11bo bbo7bo$231bob3obo28b3o4boo4bo30boo3boo137bo5boo7509bo15bo538boo33boo3b oboboo11bo7boo3bo$227bo4b5o20boo6b3o4bobboobobo169bo3bo7514bobo15b3o5b oo570b4o12bo6bo5bo$225boo30boo7b3o4b3obo3bo9boo157bobo7517boo9bo8bo4bo 573bo5bo7bo7b5o$226boo39bobo4boobo3bo9boo22bo7665bo7boo5b3o575bo9bobbo $217boo49boo6boo3bo30boobobboo7661bo16bo566bo8b3o9boo$217bobo58bobo28b obboo4boo8244boboo$216bobbo59bo27bobo8254bo4b3o$217boo89boo8bo8221boo 3boo18boo3boo$206boo9bo99bobo7638boo582b3o20bo4bo$206boo109bobbobboo 10bobboboobobbo7610bobo581bo3bo17boo4b3o$240b3o7boo69boboo9boobbo4bobb oo14bo7584bo11bo29boo3boo546bobo16b4o4boo$213boobb3o19bo3bo6boo67boo 14bobboboobobbo4bo8bobo7584bobo40b5o548bo16b3o3bo$214bo5bo12boo4bo3bo 106bobo5boo7590boo9boo27booboo554bo10bo$214bo4bo13boo5b3o107boo6boo 7576boo12boo9boo27booboo545boo5b3o$214bo4bob3o102boo30boo7576boo12boo 6boo6bo3boo19b3o547bo4bo19boo$215b3o32bo75bobo31bobo7boo7575bobo7b3o5b o3bobo566b3o6bo15bob3o$216boo31bobo61bobo13bo32bo7bobo7574bo10boo6b5o 26boo539bo5bobbo14boboobo$248bo3bo59bobbobboo6bobbo7boo17bo15bo7588boo 4b3o25bobbo544bo19bo$218bo21b3o6b3o51boo6boo5bobo8bo7boo16bobo14boo 7587boo579bo3bo17boo$218bo20bo3bo3boo3boo49boo4boo3bo3bo3bo3bobo25bo3b o8185bo20b3o9bo$218bo20bo3bo67boo5b3oboobboo26b5o7636boobo542bo5bo18b oo8bobo$207boo31b3o69bobbo3boo32boo3boo7637bobobboo10bobbo4bobbo515bo 5bo28boo$208boo58boo43bobo38b5o7639bo4bo8b3obb6obb3o14bo499bo3bo32boo 9boo$207bo60boo85b3o7641bo14bobbo4bobbo4bo8b4o500b3o33bobo7bobo$248bo 107bo7642bobbo26bobo6b4o531bo5bo8bo6boo$220boo17bo8bo80bo7699boo7bobbo 70bo459bobo13bobbobbobboboo$220bo18bo8bob3o74bobo7674boo32b4o71bo451b oo4boboo13bo6boobboo$208bo9bobo18bo88boo7676bo32b4o6boo60b3o451boo3boo boo14bobo$207bobo8boo7bobo23bo14b3o64bo7657boo12bo34bo6bobo486boo31bob oo15boo$205boo3bo16bo3bo18boboo14b3o64boo7656boo4bo7bo8boo33bo283boo 200bobbo31bobo$205boo3bo20bo18boo15bo3bo62bobo13bo7631boo6boo5boo8bo8b oo17bo15boo282b3o202bo32bo$205boo3bo16bo4bo117b3o5boo126boo7494boo5b3o 5bobboo4bo27b3o298b3o202bo$207bobo21bo34boo3boo80bo4bo128bo7502boo6b5o boo27bo3bo296boboo196bo3bobo$202boo4bo10boo6bo3bo13boo3boo100boo5b3o 125bobo8boo5bo7487boo4bo32bob3obo295b3o196bo3bobo$201b4o13bobo6bobo8bo 6boo3boo75boo32bo126boo7b3o3bo3bo7485boo38b5o297bo197bo4bo$200bobbobo 12bo18b3o6b5o7bo68boo165boboo5bo8030b4o$199bobobboo11boo18b3o7bobo9bo 63b3o168bobbo4bo5bo7498bo$198bobo56b3o10b3o52bo168boboo9boo7499bo$197b oo36boo3boo5b3o17boo55bo30bo141b3o7506b3o$197b3o31boobboo3boo25boo85b 3o141boo$198bobo30boo33boo42boo41b5o7659boo$199boo66bobo40boo4bo35bobo bobo7658b3o$238bo29boo37boo6b5oboo29boo3boo7657bobbo9bo$237bobo59boo5b 3o5bobboo4bo7686bo5boboo9b3o5boo$239boo58boo6boo5boo8bo8boo7674b4o6bo 12bo4bo$239boo27boo3boo35boo4bo7bo8boo20bo7652bob3o3b5obbo7boo5b3o$ 192boo44b3o21boo4boo3boo35boo12bo29bo5boo7645boobbo3boo3b4o16bo$191bob o43bobo4b3o6b3o5b3o59bo30bobobbobbo7645b5o5b4o$190b3o37b3o4boo4bo3bo7b o5boobo5b3o48boo32bo3bo7649b3o4bobboo$190boo37bo3bo8bo5bo5bo7b3o5b3o 86bo7654boo3bo$191bobo34bo5bo7booboboo14bo7bo87bobo3bo7650bobo$192bobo bboo11boo16booboboo125bobo3bo9bobboo4boobbo7644bo$193bobbobo12bo45boo 102bo4bo8bo3b3obb3o3bo11bo7586boo42b3o$194b4o13bobo7boo25bo9bo103b4o 10bobboo4boobbo3bo7bobo7584bobo41b5o$195boo7bo7boo6b3o24boo6b3o134bobo 5boboo7583b3o4boo4bo23b3o4boo3boo$204bobo10boboo5bo28bo136boo5booboo 7574boo6b3o4bobboobobo22bo$207boo8bobbo4bo3bobo14boboo20boo96boo30bob oo7574boo7b3o4b3obo3bo9boo11bo$207boo8boboo5b4o15bobboo20boo96bobbo29b obo8boo7574bobo4boobo3bo9boo22bo$207boo11b3o4b3o15b4o5boo98bobo15bo29b o9bobo7574boo6boo3bo30boobobboo$204bobo4boo8boo30bobo96bo3bobb3o10bo6b oo16b3o14bo7584bobo31boo4boo$204bo6bobo39boboboo86boo5bo19bo6boo16b3o 14boo7584bo$213bo30boo3boo3bobobo4boo80boo4bo4bo7boobbobbo7667bo$213b oo32bo8bo6b3o86bo7bobobbobboo7668bobo$244bo5bo4bobbo3boboo86bo3bo5b3o 7673bobbobboo$245booboo5bo6b3o89bobo38boo3boo7640boboo133bo$246bobo6bo 3bo3bo132b5o7639boo135bobo$247bo7bo141b3o7778boo$234bo12bo7bobbo112bo 26bo$233b3o20bo115bo160boo$232booboo17bobobo111b3o161bo$231b3ob3o15bob oboo175bo99boboo5boo$231b3ob3o15bobo179bo99bo7bobo$231b3ob3o9boo5boo 117bo3bo14bo40b3o103bo4b3o$212bo18b3ob3o9boo123bobobobo13b3o5boo135bo bbo4b3o6boo7483bobbo$212bo13boo4booboo135bobo4bo6bo8bo4bo137boo4b3o7b oo7486bo492boo$211bo14boo5b3o137boboobo7bo7boo5b3o139bobo7492bo4bo491b oobboo$234bo142bo8bo16bo139boo7493boobbobo488boobobboo$214b3o149boo 7675boboo486b3o$199boo164bobo$199boo166bo29bo7681boo417boo5bo$210boo 15bo168b3o55bo7588bobbo8boo15b3o4boo416b3o3bo3bo26boo$210bobo12booboo 166b3o56bo7587boo10bobo13b5o6boo10bo390bo8boboo5bo30boo$211boo3boo133b obo32bo66b3o173boo7424bo14bobo3bo5b3o7bobo390bobo6bobbo4bo5bo12bobo5bo $212bo11bo5bo119bobbo3boo28bo6boo3boo228boo7417b3o19boo3bo6boo6boo12b oo367boo11bobo5boboo9boo12boo4booboo$199bo149boo5b3oboobboo19b3o6boo3b oo7646booboo27boo9boo12boo367boo11bobbo7b3o22bo$199bo9bo14booboboo110b oo4boo3bo3bo3bo3bobo278boo7400booboo27boo9boo394bobo9boo26bo5bo$198bob o8boo130boo6boo5bobo8bo7boo252bo15boo7400b5o40bobo390bobo$197booboo6bo bo96bo42bobbobboo6bobbo7boo251b3o7415boo3boo29bo11bo390bo40booboboo$ 196bo5bo20boo79b4o43bobo13bo34boo223bo3bo7450bobo$199bo23bobo77b4o16bo 40bobo29boobbobbo225bo7452boo425boo$196boo3boo21bo71boo5bobbo8boo5bobo 39boo108bo151bo5bo7876bobbo$224boo70boo5b4o14bo3boo3boo143bo150bo5bo 11b3o7866bo$223b3o78b4o3boobobo4bo3boo3boo68boobo69b3o151bo3bo12b3o 7422boo3b3o436bo$201b3o19boo82bobbo3boo5bo3boo75bobobboo13bo4bo200b3o 12bo3bo7395bo24bo4bobbo427b3o6bo21bo$201boboo21bo84bo10bobo78bo4bo11b oob4oboo14bo7598b3o5boo15boobo4bo427bo5bobo4b3o6boo5b3o$203boo106bobbo 8bo80bo17bo4bo7bo6b4o196boo3boo7397bo4bo19bo3bo428boo4boo15bo4bo$202b oo200bobbo26bobo4boboboo7598boo5b3o16bo452b3o5boo$200bobo231boo4bobbob 3o7606bo14bobo441bo10bo$198boobbo22bo184boo29boboboo184bo14b3o5boo 7413bobo441bo$224b3o77bo3b3o99b3o28b5o8boo194bo3b3o7412boo442bo$223b5o 75bo4bo87bo15boobo24bo3bo9bobo37bo149bo5bo5boobo$222boo3boo74b3o3bo84b obo4b3o8bobbo5boo16bobo14bo38bo135bo19bo4bobbo5boo$223b5o159boo4bobo 16boobo5boo16bobo14boo35b3o133bobo11bo12boobo5boo7378boo3boo193bo254bo 26boo3boo$223bo3bo94boo63boo3bobbo7bobboobb3o27bo189boo10bo3bo7b3o 7388bo5bo25b3o166bo253boo4boo19boo3boo$199b5o20bobo90bo4boo69bobo7bo3b obboo230bo11boo7421bo166b3o252bobo3bo$198bob3obo20bo85boob5o6boo67bobo 6bobbo235bobbo7400bo3bo27bo9bo401bo15boo21b3o$199bo3bo106bo4boobbo5b3o 5boo61bo8boo30boo3boo198b3o7402b3o37bobo399bobo37b3o$200b3o106bo8boo5b oo6boo102bobobobo180boo3boo27boo7415bobo8boboo398bo3boo8bo27bo$201bo 23boo82bo7bo4boo114b5o194boo18b4o7414bobbo6booboo10boo375boo9bo3boo5b 4o221boo$225boo82bo12boo115b3o183bo3bo7boo17bobobbo7404boo10boo6boboo 10boo375boo9bo3boo4b4o9boo210bobbo$240bo60boo7bo103bo25bo73bo111b3o27b oobbobo7403boo8bo3boo5bobo399bobo6bobbo9boo79boo129bo$240boo58bobo8boo 19boo78bobo100bo110b3o32bobo7375boo30boo5boo8bo401bo7b4o5bo30bo53boo 129bo$200boo26boo11boo57bo31boo79boo98b3o147boo7372bo3bo28bo4bobbo420b 4o4bo29boo160boo22bobo$200boo25b3o3bo7b3o7boo46boo120boobbo236b3o34bo 7336bo5bo32bobo424bo33boo4boo155bobbo20bobo$217boo5boboo4b4o5boo8boo 36bo123bo6bo13bo189boo35bobo35bobo7329boobboobo3bo10bo481b3o4boobboo 69boo105bo$217boo5bobbo4bo4bobboo46bo39boo3bo78bobo4bo6bo7b3o5boo181bo 35boo3b3o33boo6boo7319boo3bo5bo10bo458b6o6b3o9boo4boobboo44b3o22boo84b o$224boboo5bo3bobbo47b3o37bo3bobo77boboo4bobo4bo9bo4bo179b3o41b3o19boo 12boo4bo3bo7324bo3bo11bo6b8o23boo393boo23bo6bo18boo53b3o$227b3o3boobo 82boo5bobobbo3bo74b3obo4bobobo3bo8boo5b3o176bo4b3o35bo3bo18boo12boo3bo 5bo8boo7315boo19bob4obo23boo393boo22bo8bo18bo52bo3bo105boo18boo3boo$ 228boo87bobbo5boo3b5o73boob3o4bobobbobo18bo183bo34bo5bo28bobo4boobo3bo 8boo7336b8o443bo6bo71bo5bo20bo82bo20bo5bo$304bobo9bo13boo3boo73bobbo 11bo202bo36bo3bo10boo17bo7bo5bo7798b6o73bo3bo20b3o$304bo3bo7bo14b5o75b oo26bo94bo131b3o10bobo26bo3bo7374boo401boo100b3o20bo3bo102bo3bo$241bob o64bo7bo15b3o85bobbo15bo95bo78boo94boo7315boo58bo403bo59bo65bo79boo3b oo19b3o$242boo50boo8bo4bo7bobbo12bo89bo14bobo92b3o78boo4bo60bo18bo 7325bo3bo45boo7bobo403bobo7boo48boo61bo5bo76boo3boo$237bo4bo51boo12bo 10boo116booboo169boo6b5oboo52boo17boo7310boo13bo5bo44bobbo5boo307bo97b oo7boo43boo4boo13boo5bo39bo5bo77b5o$237boo65bo3bo83bobo41bo5bo160boo5b 3o5bobboo4bo53bo17boo7302b3o4boo13bo3boboobboo25bobo15bo313bobo101boo 10bo4bo26boobboo4b3o11b3o3bo3bo38bo3bo79bobo$236bobo65bobo8bobo72bo3bo 5b3o36bo163boo6boo5boo8bo8boo7363b5o6boo10bo5bo3boo23bo3bobb3o10bo313b oo101b3o10bo4bobo24boobboo4boo9boboo5bo18bobo22b3o$227bo88boo16bo55bo 7bobobbobboo28boo3boo171boo4bo7bo8boo55boo7305bobo3bo5b3o10bo3bo29bo 19bo11bo392b3o10boo10bo7boo31boo10bobbo4bo5bo13bobbo104b3o$226bobo87bo 14boo50boo4bo4bo7boobbobbo204boo12bo32bo32boo7305boo3bo6boo12boo24boo 4bo4bo7boobbobbo11b3o390bo3bo12boobboo11boo4boo25bo11boboo9boo15boobo$ 214boo9bo3boo8bo91b3o49boo5bo19bo6boo208bo33b3o5boo6b3o7330boo9bobo29b oo5bo7bobobbobboo12b5o388bo5bo11boobbobboo8boo4boo29bo10b3o152bo$214b oo9bo3boo5b4o34bo57boo56bo3bobb3o10bo6boo206boo37bo4bo7340boo10boo36bo 3bo5b3o16boo3boo387bo5bo16b4o5bobo39bo9boo24bo127bobo$225bo3boo4b4o34b o58bo59bobo15bo33boo108bo108boo5b3o7349b3o37bobo25b5o391bo20bo7bo37bo bbo36boboo18bo105boo$226bobo6bobbo34b3o55bobo72bobbo34boo109bo116bo14b o7336boo64bo3bo389bo3bo63bo41bo$227bo7b4o84bo7boo73boo145b3o87bobo 7379boo64bobo391b3o64bo150bo22bo$236b4o6boo76boo118bo197bo7381bo54bo 12bo281bo111bo66bo61bo88bo20b3o$239bo6bobo74boo118bobo18b6o172bo7437bo 293bobo121bobo87boo3boo20bobo84b3o19b5o$248bo83booboboo104bobbobboo12b o6bo171bobbo49bo7333bo48b3o293boo122boo48bo40b5o21boo81bo24boo3boo$ 248boo6bobo60boo126boboo11bo8bo15bo154b3o49boo7334boo62bo388b3o13bo47b o41booboo8bo94b3o16bo7b5o$257boo60bo5bo6bo5bo106boo16bo6bo6bo9boo174b ooboboo24bobo7309bo9boo11boo61booboo386b3o61b3o10bobbo8bo16booboo6bobo 93b5o14boo7bo3bo$136bobbo88boo27bo53bo5bobo3boo139b6o6bobo3boo4boo 7515bobo7b4o68bo394bo3bo73bo10bobo16b3o8boo92boo3boo12boobo7bobo$139bo 88bobbo78bobo4boo5boo7booboo138boo10b3o172bo5bo37boo7289boo4boboo5b3o bbobbobo62bo4bo5bo392bobo63bobbo3boo5bo3boo3boo35boo3boo91boo10bo$135b o4bo73bobo15bo77boobo21bo117bo27bo6boo84bo132bobo7288boo3booboo9boobbo bbo61b3o392boo3boo3boo60b4o3boobobo4bo3boo3boo22boo108boo$135boobbobo 70bo3bobb3o10bo6boo57boo10booboo16bo121b4o24bo5boo7boo77bo88booboo28bo 4boo6bo7293boboo6bo9boo52boo11booboboo393bo7boo51b4o14bo3boo28boo11bo 3bo92boo$140boboo61boo5bo19bo6boo57boo10boobo16bobo104bo16b4o23bo5bo8b obo74b3o90bo29bobobbobbobbobbo7boo7285bobo5bo8bo3boo50bo421bo51bobbo8b oo5bobo28bobo13b3o76b3o25boo$205boo4bo4bo7boobbobbo78bobo17bobo4boo97b obo5boo8bobbo5boo16bobo14bo185boo10boobob3o6bo7boo7286bo6bo10boo39bo 10bobo275bo145bobo10bo38b4o16bo29boo14b3o76b3o25boo$178boo32bo7bobobbo bboo29bo51bo19bo5bo91boo3boo3bo14b4o5boo16bobo14boo184boo10booboo6bobo 7311bobbo5boo32bobo9boo276bobo144boo9bobo32boo4b4o34boo97b3o$140bobbo bboo29bobo32bo3bo5b3o33bo60boo17b3o88boo3boo3bo4boboboo3b4o25bo175boo 36boobo7boo7312bobo6bobo30boboo287boo155bo3boo29bobo7bo34boo14bo83bo 18boo$140boo34bo13bobo21bobo41b3o57boo20bo93boo3bo5boo3bobbo197b3o4boo 36bobo7333bo24boo3booboo444bo3boo3boo24bo60bo83bo6boo10boo$167boo7bobb o6boobbobbo126bo7booboboo101bobo10bo200b5o6boo34bo7334boo23boo4boboo 444bo3boo3boo23boo60bo17b3o62b3o5boo$167boo7bo8bobo5boo6boo125bo5bo 102bo8bobbo29boo3boo163bobo3bo5b3o7362boo36bobo29boo383boo29bobo36boo 65boo4bo3bo$177bobo3bo3bo3bo3boo4boo28bo97bo3bo145boo3boo163boo3bo6boo 14boo6boo7339boo37bo30bo385bo30bo37boo50boo13boo3bo5bo60b3o20bo3b3o$ 143boo3boo28boobboob3o5boo37bo97b3o261bo63boo16bobbo4bobbo7356bo52b3o 379b3o51bo156b3o19boo4boo$143boo3boo35boo3bobbo36b3o38bobo207b3o111bo 62boo16bobbo4bobbo7357boo52bo379bo8bo43bo89bo7bo40boo39boobboboo23boo$ 190bobo79boo36bo145bo24b3o109b3o80bobbo4bobbo7356boo43b3o395b3o42b3o 87bo7bo40boo17b3o20boo28boo$145b3o124bo35boo147bo24bo194boo6boo7385bo 15bo3bo241bo151b5o5bo54bo139bo22b4o$145b3o155bo5boo6boo136b3o7568b3o 42bo9b3o3bo5bo240bobo148bobobobo4boo7bobo42bobo70bo5bo61bo23bo$146bo 29bo125bo14bobboo7704b3o42b3o7bo5booboboo240boo149boo3boo3bobo8boo41bo 3bo39bo8b3o19bo3bo61b3o$176bobo123b3o13boobo4bo149bo7548bo3bo35bobo14b o423bo6bo36b3o39bo32b3o$164boo10boo61bo82bo3bo149b3o5boo7579boo444bobo 34boo3boo37b3o$140bo16bo6bobo70bobo82bo13boo141bo4bo7539boo3boo35bo23b o421boo156b3o$140b3o5boo7bo6bo73boo4bo73boobo13bobbo139boo5b3o165boo 7421boo12bo397boo11boo208boo30b3o59boo$143bo4bo8bo85bo73bobboo4b3o5bob obo112boo34bo126bo38bobo7420bobboo8bo397bobo8boobbo167bobo39bo29bo3bo 58boo$142boo5b3o91b3o71boo9bo4b3obo112bobo162bo37bo7423boobo9boo396boo 7booboo103boo62b5o38bobo5boo$151bo175bo5b3o116bo28bo131b3o7465bo7bo 399bo7boo54bo51bo17b3o42boo3boo32bo5boo5bobo18bo5bo$479booboo7540b3o 54bo8boo3boo217bo167boo4bo8boo54bo43bo5bobo62boo3boo31bobo14bo17boo3b oo$313boo7713boo47boobo13bobbo216bobo164bobbobbo9booboo47b3obo43bobo3b oo7bobo5bo84bo3boo9bobbo$171b3o139boo4bo158bo5bo7543boo46bobboo11bobbo bo216boo165bobo14boobbo95bobo10bobbo3bobbo83bo3boo12bo$171bo115bo22boo 6b5oboo108bo8boo7584boo45boo18bo385boboo15boo45bo49bobbo8boo6bo51boo 33bo3boo9bobo21bo$145bo26bo113bobo6bo6boo5b3o5bobboo4bo105bobo6bobbo 33booboboo175b3o7364bobo62boboo387b3o62boobo46bobo7boo3bo3bo3boo46boob oo32bobo3boo6boo6bobbo10boobo16boo$144b3o139bobbo3boo7boo6boo5boo8bo 103bobo7bo3bobboo210bo7366boo53bo10bo390boo9boo53boo45bobo10boo58bobbo 33bo4bobo16bo13bo16bobo$143b5o141bo4boo17boo4bo7bo8boo87boo3bobbo7bobb oobb3o210bo7408boo10boo411bobo9boo5bo71bobbo7bo6boo5bobbo55bo43bo12bo 4bo8bo3bo17b3o$142boo3boo38bobo123boo12bo8boo87boo4bobo16boobo5boo173b o7428b3o4boo9bobo411bo10b3o3bo3bo69bo16bobo6bobo58bo40boo11boobbobo7bo bbo19boo37boo3boo$179b3o5bo3bo95b3o36bo105bobo4b3o8bobbo5boo174bo7386b oo3boo21bobo9b5o6boo12boo402bo11boboo5bo15bo21boo3boo28bo4bo12bo67boo 18booboboo34boboo4b5o19boo$174boobbobbobo7bo132boo108bo15boobo32boo 145b3o7386boo3boo21boo9bobo3bo5b3o10bo3bo400boo10bobbo4bo5bo8bobo21boo 3boo27bobobboo11boo16boo3boo113b5o17bobo39bo3bo$172bobbobboo7bo4bo4boo 249b3o34bobbo7545bo16bo9boo3bo6boo10bo5bo202bo191boo4boo9boboo9boo9boo 14bo7b5o26boobo34bobobobo64bo5bo41boo3boo17bo41b3o$144b3o16boo6bo19bo 5boo249boo35bo182boo7354b3o8boo33boo13bo3boboobboo197bobo185boobboo4b 3o11b3o33bo9bobo66b5o40boo3boo59bobbo4b5o60b3o$144b3o16boo6bo10b3obbo 3bo293bo182bobo7353b3o7boo34boo13bo5bo3boo197boo186boobboo4boo13boo33b 3o77b3o42b5o5bo14booboo35boo7b3o5bobo48boo$141bo29bo15bobo295bobo3bo 176bo11bo7344bo60bo3bo400boo59b3o27bobbo37bo44b3o7boo14bo47bo7boo8boo 3boo33bo$107bo5bo8bo17bobo29bobbo310bobo3bo185bobo7406boo402bo92boo83b o7boo71bo9boo3boo25bo5bobo$106bobo3bobo6bobo16boobo30boo311bo4bo172boo 9boo8113boo5boo$107bo3bo3bo6bo5boo10booboo343b4o173boo9boo12boo8070b3o 10boo13boo$112bobo13boo10boobo512boo3bo6boo6boo12boo8070b3o10b3o11b3o 10bo5bo$85bo27bo26bobo11bobboo4boobbo488bobo3bo5b3o7bobo8012boo68bo13b oobo9boo3boo4bo5b3o$84bobo54bo11bo3b3obb3o3bo488b5o6boo10bo7343boo527b oo138boo62bo19bobbo10boo8b3o3b3o$74boo7boboo28bo38bobboo4boobbo490b3o 4boo7357boo248bo278boo68boo59bobo71boo17boobo11bo$73bobo6booboo10boo 15bobo548boo7607bobo346boo60boo70boo9boo5b3o10bo16boo3boo$72bo6b3obob oo10boo10bo3bo3bo6bo8149boo393boo14bo56boo23bobo5boo9bobo16boo3boo$63b oo7bobbobbobbobbobo21bobo3bobo6bobo8543boo71boo23bo19boo$63boo7bo6boo 4bo23bo5bo8bo8641boo$73bobo1636bo1439bo1439bo1439bo1439bo1321bo13bo$ 74boo1389bo118b3o123bo3bo125bo127bo936bo118b3o123bo3bo125bo127bo936bo 118b3o123bo3bo125bo127bo936bo118b3o123bo3bo125bo127bo936bo118b3o123bo 3bo125bo127bo1065bobo10bobo$66boo15boo14boo27b3o27b3o147b3o27b3o27b3o 27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o845b5o4bo110bo6b5o112booboo4bo 4bo111bo4bo4bo4boo119boo3bobo56bo869b5o4bo110bo6b5o112booboo4bo4bo111b o4bo4bo4boo119boo3bobo56bo869b5o4bo110bo6b5o112booboo4bo4bo111bo4bo4bo 4boo119boo3bobo56bo869b5o4bo110bo6b5o112booboo4bo4bo111bo4bo4bo4boo 119boo3bobo56bo869b5o4bo110bo6b5o112booboo4bo4bo111bo4bo4bo4boo119boo 3bobo56bo484b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o147b3o27b3o27b3o27b 3o27b3o27boo11boo13boo$66boo15b3obbo9b4o13boo10b5o13boo10b5o13boo118b oo10b5o13boo10b5o13boo10b5o13boo10b5o13boo10b5o13boo10b5o13boo10b5o13b oo10b5o13boo10b5o13boo10b5o13boo10b5o48boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobbobbo49bo4bo15boo3boo3b oo3boo3boo3boo3boo3boo3b6o4boobobbo70boo3boo3boo3boo3boo3boo3boo3boo3b 6o3bo6bo55boo8bo4boo3boo3boo3boo3boo3boo3boo3boo3bo5bobboo4boo48bo6b3o 7boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obbo50booboo4bo10boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobbobbo49bo4bo15boo3b oo3boo3boo3boo3boo3boo3boo3b6o4boobobbo70boo3boo3boo3boo3boo3boo3boo3b oo3b6o3bo6bo55boo8bo4boo3boo3boo3boo3boo3boo3boo3boo3bo5bobboo4boo48bo 6b3o7boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obbo50booboo4bo10boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobbobbo49bo4bo15b oo3boo3boo3boo3boo3boo3boo3boo3b6o4boobobbo70boo3boo3boo3boo3boo3boo3b oo3boo3b6o3bo6bo55boo8bo4boo3boo3boo3boo3boo3boo3boo3boo3bo5bobboo4boo 48bo6b3o7boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obbo50booboo4bo10b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobbobbo49bo4b o15boo3boo3boo3boo3boo3boo3boo3boo3b6o4boobobbo70boo3boo3boo3boo3boo3b oo3boo3boo3b6o3bo6bo55boo8bo4boo3boo3boo3boo3boo3boo3boo3boo3bo5bobboo 4boo48bo6b3o7boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obbo50booboo4bo 10boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobbobbo 49bo4bo15boo3boo3boo3boo3boo3boo3boo3boo3b6o4boobobbo70boo3boo3boo3boo 3boo3boo3boo3boo3b6o3bo6bo55boo8bo4boo3boo3boo3boo3boo3boo3boo3boo3bo 5bobboo4boo48bo6b3o7boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obbo50b ooboo4bo10boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo13b5o10boo13b5o10boo13b5o10boo13b5o10b oo13b5o10boo13b5o10boo13b5o10boo13b5o145b5o10boo13b5o10boo13b5o10boo 13b5o10boo13b5o10boo13b4o25boo$86b3o9booboo10booboo9b3oboo9b3oboo9b3ob oo9b3oboo114b3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b 3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b3oboo9b 3oboo9b3oboo9b3oboo9b3oboo30bobo13bobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbob obbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo3bobbo5boo5bo3b oo3boo3boo3boo3boo3boo3boo3boo3bo5bobboo4boo3bobbobobbobobbobobbobobbo bobbobobbobobbobo6bobboobboboo4boo3boo3boo3boo3boo3boo3boo3boo3boobboo 4b4obo4b3obbobbobobbobobbobobbobobbobobbobobbobobbobo6bobbo6bo4boo3boo 3boo3boo3boo3boo3boo3boo3boob3o4bobboo6boobbobbobobbobobbobobbobobbobo bbobobbobobbobo6bob3o5boo3boo3boo3boo3boo3boo3boo3boo3boo3b6o4b6o5boo bbobbobobbobobbobobbobobbobobbobobbobobboboo4boobobbo5bo3boo3boo3boo3b oo3boo3boo3boo3boo3b6o3bo5boo3bobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbo3bobbo5boo5bo3boo3boo3boo 3boo3boo3boo3boo3boo3bo5bobboo4boo3bobbobobbobobbobobbobobbobobbobobbo bobbobo6bobboobboboo4boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obo4b3o bbobbobobbobobbobobbobobbobobbobobbobobbobo6bobbo6bo4boo3boo3boo3boo3b oo3boo3boo3boo3boob3o4bobboo6boobbobbobobbobobbobobbobobbobobbobobbobo bbobo6bob3o5boo3boo3boo3boo3boo3boo3boo3boo3boo3b6o4b6o5boobbobbobobbo bobbobobbobobbobobbobobbobobboboo4boobobbo5bo3boo3boo3boo3boo3boo3boo 3boo3boo3b6o3bo5boo3bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbo3bobbo5boo5bo3boo3boo3boo3boo3boo3b oo3boo3boo3bo5bobboo4boo3bobbobobbobobbobobbobobbobobbobobbobobbobo6bo bboobboboo4boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obo4b3obbobbobobb obobbobobbobobbobobbobobbobobbobo6bobbo6bo4boo3boo3boo3boo3boo3boo3boo 3boo3boob3o4bobboo6boobbobbobobbobobbobobbobobbobobbobobbobobbobo6bob 3o5boo3boo3boo3boo3boo3boo3boo3boo3boo3b6o4b6o5boobbobbobobbobobbobobb obobbobobbobobbobobboboo4boobobbo5bo3boo3boo3boo3boo3boo3boo3boo3boo3b 6o3bo5boo3bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbo bobbobobbobobbobobbobobbo3bobbo5boo5bo3boo3boo3boo3boo3boo3boo3boo3boo 3bo5bobboo4boo3bobbobobbobobbobobbobobbobobbobobbobobbobo6bobboobboboo 4boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obo4b3obbobbobobbobobbobobb obobbobobbobobbobobbobo6bobbo6bo4boo3boo3boo3boo3boo3boo3boo3boo3boob 3o4bobboo6boobbobbobobbobobbobobbobobbobobbobobbobobbobo6bob3o5boo3boo 3boo3boo3boo3boo3boo3boo3boo3b6o4b6o5boobbobbobobbobobbobobbobobbobobb obobbobobboboo4boobobbo5bo3boo3boo3boo3boo3boo3boo3boo3boo3b6o3bo5boo 3bobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobb obobbobobbobobbo3bobbo5boo5bo3boo3boo3boo3boo3boo3boo3boo3boo3bo5bobb oo4boo3bobbobobbobobbobobbobobbobobbobobbobobbobo6bobboobboboo4boo3boo 3boo3boo3boo3boo3boo3boo3boobboo4b4obo4b3obbobbobobbobobbobobbobobbobo bbobobbobobbobo6bobbo6bo4boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobboo 6boobbobbobobbobobbobobbobobbobobbobobbobobbobo6bob3o5boo3boo3boo3boo 3boo3boo3boo3boo3boo3b6o4b6o5boobbobbobobbobobbobobbobobbobobbobobbobo bboboo4boobobbo5bo3boo3boo3boo3boo3boo3boo3boo3boo3b6o3bo5boo3bobbobo bbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobo bbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobo bbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobo bbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobo bbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobo bbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobobbobo bbobobbobobbobobbobobbobobbobobbobobbo11boob3o9boob3o9boob3o9boob3o9b oob3o9boob3o9boob3o9boob3o9boob3o9boob3o9boob3o9boob3o9boob3o9boob3o9b oob3o144boob3o9boob3o9boob3o9boob3o9boob3o9boob3o9boob3o9boob3o9boob3o 9booboo10booboo24b3o$85b3o12boo11b4o13boo10b5o13boo10b5o115b5o13boo10b 5o13boo10b5o13boo10b5o13boo10b5o13boo10b5o13boo10b5o13boo10b5o13boo10b 5o13boo10b5o13boo10b5o13boo30bo17boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobboo6boobbobbobobbobobbobobbob obbobobbobobbobobbobo6bob3o5boo3boo3boo3boo3boo3boo3boo3boo3boo3b6o4b 6o5boobbobbobobbobobbobobbobobbobobbobobbobobboboo4boobobbo5bo3boo3boo 3boo3boo3boo3boo3boo3boo3b6o3bo5boo3bobbobobbobobbobobbobobbobobbobobb obobbobobbo3bobbo5boo5bo3boo3boo3boo3boo3boo3boo3boo3boo3bo5bobboo4boo 3bobbobobbobobbobobbobobbobobbobobbobobbobo6bobboobboboo4boo3boo3boo3b oo3boo3boo3boo3boo3boobboo4b4obo4b3obbobbobobbobobbobobbobobbobobbobo bbobobbobo6bobbo6bo4boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boob3o4bobboo6boobbobbobobbobobbobobbobobbobobbobobbobobbobo6bob3o5b oo3boo3boo3boo3boo3boo3boo3boo3boo3b6o4b6o5boobbobbobobbobobbobobbobo bbobobbobobbobobboboo4boobobbo5bo3boo3boo3boo3boo3boo3boo3boo3boo3b6o 3bo5boo3bobbobobbobobbobobbobobbobobbobobbobobbobobbo3bobbo5boo5bo3boo 3boo3boo3boo3boo3boo3boo3boo3bo5bobboo4boo3bobbobobbobobbobobbobobbobo bbobobbobobbobo6bobboobboboo4boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b 4obo4b3obbobbobobbobobbobobbobobbobobbobobbobobbobo6bobbo6bo4boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobboo6boobbobbobobbob obbobobbobobbobobbobobbobobbobo6bob3o5boo3boo3boo3boo3boo3boo3boo3boo 3boo3b6o4b6o5boobbobbobobbobobbobobbobobbobobbobobbobobboboo4boobobbo 5bo3boo3boo3boo3boo3boo3boo3boo3boo3b6o3bo5boo3bobbobobbobobbobobbobo bbobobbobobbobobbobobbo3bobbo5boo5bo3boo3boo3boo3boo3boo3boo3boo3boo3b o5bobboo4boo3bobbobobbobobbobobbobobbobobbobobbobobbobo6bobboobboboo4b oo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obo4b3obbobbobobbobobbobobbob obbobobbobobbobobbobo6bobbo6bo4boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boob3o4bobboo6boobbobbobobbobobbobobbobobbobobbobobbobobbob o6bob3o5boo3boo3boo3boo3boo3boo3boo3boo3boo3b6o4b6o5boobbobbobobbobobb obobbobobbobobbobobbobobboboo4boobobbo5bo3boo3boo3boo3boo3boo3boo3boo 3boo3b6o3bo5boo3bobbobobbobobbobobbobobbobobbobobbobobbobobbo3bobbo5b oo5bo3boo3boo3boo3boo3boo3boo3boo3boo3bo5bobboo4boo3bobbobobbobobbobo bbobobbobobbobobbobobbobo6bobboobboboo4boo3boo3boo3boo3boo3boo3boo3boo 3boobboo4b4obo4b3obbobbobobbobobbobobbobobbobobbobobbobobbobo6bobbo6bo 4boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobboo6boobb obbobobbobobbobobbobobbobobbobobbobobbobo6bob3o5boo3boo3boo3boo3boo3b oo3boo3boo3boo3b6o4b6o5boobbobbobobbobobbobobbobobbobobbobobbobobboboo 4boobobbo5bo3boo3boo3boo3boo3boo3boo3boo3boo3b6o3bo5boo3bobbobobbobobb obobbobobbobobbobobbobobbobobbo3bobbo5boo5bo3boo3boo3boo3boo3boo3boo3b oo3boo3bo5bobboo4boo3bobbobobbobobbobobbobobbobobbobobbobobbobo6bobboo bboboo4boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obo4b3obbobbobobbobo bbobobbobobbobobbobobbobobbobo6bobbo6bo4boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo 3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3b oo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo3boo13boo13b 5o10boo13b5o10boo13b5o10boo13b5o10boo13b5o10boo13b5o10boo13b5o10boo 148boo13b5o10boo13b5o10boo13b5o10boo13b5o10boo13b4o11boo25bobo$114boo 27b3o27b3o117b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o27b3o46bo 813boo8bo4boo3boo3boo3boo3boo3boo3boo3boo3bo5bobboo4boo48bo6b3o7boo3b oo3boo3boo3boo3boo3boo3boo3boobboo4b4obbo50booboo4bo10boo3boo3boo3boo 3boo3boo3boo3boo3boob3o4bobbobbo49bo4bo15boo3boo3boo3boo3boo3boo3boo3b oo3b6o4boobobbo70boo3boo3boo3boo3boo3boo3boo3boo3b6o3bo6bo865boo8bo4b oo3boo3boo3boo3boo3boo3boo3boo3bo5bobboo4boo48bo6b3o7boo3boo3boo3boo3b oo3boo3boo3boo3boobboo4b4obbo50booboo4bo10boo3boo3boo3boo3boo3boo3boo 3boo3boob3o4bobbobbo49bo4bo15boo3boo3boo3boo3boo3boo3boo3boo3b6o4boobo bbo70boo3boo3boo3boo3boo3boo3boo3boo3b6o3bo6bo865boo8bo4boo3boo3boo3b oo3boo3boo3boo3boo3bo5bobboo4boo48bo6b3o7boo3boo3boo3boo3boo3boo3boo3b oo3boobboo4b4obbo50booboo4bo10boo3boo3boo3boo3boo3boo3boo3boo3boob3o4b obbobbo49bo4bo15boo3boo3boo3boo3boo3boo3boo3boo3b6o4boobobbo70boo3boo 3boo3boo3boo3boo3boo3boo3b6o3bo6bo865boo8bo4boo3boo3boo3boo3boo3boo3b oo3boo3bo5bobboo4boo48bo6b3o7boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b 4obbo50booboo4bo10boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobbobbo49bo 4bo15boo3boo3boo3boo3boo3boo3boo3boo3b6o4boobobbo70boo3boo3boo3boo3boo 3boo3boo3boo3b6o3bo6bo865boo8bo4boo3boo3boo3boo3boo3boo3boo3boo3bo5bo bboo4boo48bo6b3o7boo3boo3boo3boo3boo3boo3boo3boo3boobboo4b4obbo50boob oo4bo10boo3boo3boo3boo3boo3boo3boo3boo3boob3o4bobbobbo49bo4bo15boo3boo 3boo3boo3boo3boo3boo3boo3b6o4boobobbo70boo3boo3boo3boo3boo3boo3boo3boo 3b6o3bo6bo473boo20b3o27b3o27b3o27b3o27b3o27b3o27b3o177b3o27b3o27b3o27b 3o27boo39boo$642bobbo865bo4bo4bo4boo119boo3bobo56bo59b5o4bo110bo6b5o 112booboo4bo4bo921bo4bo4bo4boo119boo3bobo56bo59b5o4bo110bo6b5o112boob oo4bo4bo921bo4bo4bo4boo119boo3bobo56bo59b5o4bo110bo6b5o112booboo4bo4bo 921bo4bo4bo4boo119boo3bobo56bo59b5o4bo110bo6b5o112booboo4bo4bo921bo4bo 4bo4boo119boo3bobo56bo59b5o4bo110bo6b5o112booboo4bo4bo474bobo523boo9b oo$185boo455b3o880bo127bo126bo118b3o123bo3bo935bo127bo126bo118b3o123bo 3bo935bo127bo126bo118b3o123bo3bo935bo127bo126bo118b3o123bo3bo935bo127b o126bo118b3o123bo3bo474bo524boo9bobo$107boo4b3o68boo1841bo1439bo1439bo 1439bo1439bo962bo5bo8bo18bo6bo7b3o4boob3o$65b3o7boo30bo5bobbo14boo53bo 17boo8326boo28boo28boo28boo35boo88bobo3b3o6bobo16bobo12b3o4bobb4o$64bo 3bo5bobo19boo7bobo4bo4bo13boo71boo8325booboo25booboo25booboo25booboo 33boo89bo3booboo6bo10boo3boo3bo12b3o4boo$76bo14bo4boo7boo6bo535boo 7881b4o26b4o26b4o26b4o17boo110b3o18boo3boo3bo13bobo$63bo5bo15boob5o6b oo12bobbo532boo7882boo28boo28boo28boo17boo66bobobbobo38bo24boo3bo14boo $63boo3boo14bo4boobbo5b3o12boo64boo23bo443boo7876boo110bo4bo61boobobbo bbobboboo16bo44bobo$83bo8boo5boo30b3o46boo11bo10b3o442bo7878boo109boo 69bobobbobo6bo12bobo18bo25bo$83bo7bo4boo22boo9b3o58boo9bo3bo440bobo 7633boo241bo8boo59bobo38bobo82bobo10bo3boo3boo10b3o$68boo13bo12boo10b oo3boo4boo9bo3bo57bobo10bo276boo164boboo7632bobo249boo57bo3bo32b3o88b oo11bo3boo3boo5bo3booboo6bo$68bobo4boo7bo23bo5bo6bo7bo5bo66bo5bo275bob oo7796bo194boo107boo5bo19bo18bo66boo33bo3boo9bobo3b3o6bobo$70bo3bobo8b oo43bo3bo43boo22bo5bo271bobbobboo7991boo107boo4bo4bo14b4o15bo17bo49boo 4b3o27bobo12bo5bo8bo$69boo3bo34bo3bo17b3o69bo3bo272bobo166boo7944bo12b o4boobobo3boo26boo7bo27bo10boo6b5o27bo$66bo6boo35b3o28boo61b3o274bo 167boo7869bo74bo3bo3boboo5b3obobbobboo26bobo5b3o26bobo7b3o5bo3bobo$66b obbo71boo303bo8054boo17boo75bobobbob4o5boobobo38b5o14boo12boo6boo6bo3b oo$66bo61bo71boo243boo34boo8018boo16bobo5boo45boo26boobboo6b4o38boo3b oo13boo12boo9boo$127boo12bo35boo3boo15boo228boo13boo4boo29boo8044bo46b oo39bo41b5o28boo9boo$127bobo10bobo35b5o18bo123bo103b3o11b3o4boobboo 8069bobo46boo15bo65b5o25bobo$65booboboo68bobbobboo11boo17booboo141bobo 93boo9boobo9boo4boobboo7848boo219boo8b3o37bo13boobo64bobbo26bo11bo28b 3o$144boboo12bo17booboo131boo6boo3bo9boo81bo5bo4bobbo10boo28b3o7826bob o227bo3bo35bobo11bo15booboo47bo3bo36bobo27bo3bo$65bo5bo39boo29boo16bob o9bo6b3o131bobo4boobo3bo9boo86bo5boobo11bo27bo3bo7825bo175bo21bo30bo5b o16boo11b3obobo11bobobbo15bo47bo41boo26bo5bo$111boo38bo9boo8bobo129boo 7b3o4b3obo3bo93bo3bo3b3o10bo180b3o7853b3o18booboo7boo19bo5bo16bo12b4ob o12bobbo4bobo5bobboo16bo31boboo66booboboo$66booboo76boobboo18boobo128b oo6b3o4bobboobobo96bo5boo9bobo30bo5bo145bo7852b5o30boo21bo8boo7bobo16b o14boo5boo7b3o17boo31bo$68bo83boo17booboo27bo108b3o4boo4bo115boo14bo 15boo3boo144bo7852boo3boo15bo5bo6bo21bo10bobbo5boo8bo31bo7b3o16bobo$ 130bo15boo4b3o16boobo27b3o108bobo140bo8021b5o52b4oboo7bo11b4o38bobboo 9b3o$129b3o14boo4boo17bobo28b3o109boo141bo8020bo3bo16booboboo30b4obbo 6bo10b4o44bo10bo34boo3boo46b3o$128b5o18boo7boo10bo70boo51b3o8180bobo 58boo7bo10bobbo30bo9booboo9bo35bo5bo46bo15bo$127bobobobo17bo8bobo37boo 3boo36boo51bo31bo5b3o8143bo64bobbo11b4o29bobo110bo16b3o5boo$68boo57boo 3boo10b3o15bo17b3o17boo3boo90bo5boo13boobbo3bobo5b3obo110bo6b3o23bo 7841boo158boo19boo38boo8boo4b4o27bo3bo58bo3bo46bobo17bo4bo$68boo74bo 17boo116bo21boo14bobboo4boo6bobobo110bo3booboo14boo5b3o7841bobo157bobo 17bobo28bo18bobo7bo28b3o60b3o43b4obbo16boo5b3o$145bo134boo22bo14b5o12b obbo108b3o3booboo15bo4bo7844bo154boo4b3o7boo8bo29bo18bo36boo3boo104bo 4boo25bo$130bo52bo19bo34b3o38bobo55boo132b3o6bo122b3o7872bobbo4b3o6boo 7boo29bo17boo146bo$129bobo51bo18bobo35bo230bo5bobbo124bo7873boo4b3o16b 3o196bobbo$129bobo50b3o19boo33bo79b5o129boo21bo127bo7879bobo18boo$130b o73boo112bobboo6bo125bo19bo3bo8004boo17bo81bo$130boo71b3o112boobbo4boo 124boo22bo7711boo374bo19b3o20bo84b3o29boo3boo$130boo50b3o17bobo47b3o 73boo144bo5bo7707bobo365bo8boo21bo3b3o14bo5boo40boo23bo12bo29boo3boo$ 130boo51bo18boo48bo221bo5bo7707bo343b3o21bo7bobo20boo3boo13boboo4b3o 39boo18bo4b4o8bo31b5o$183bo47boo20bo221bo3bo7707boo155boo158bo27bobo 21bo51bobo6boobo5boo49bo5b4o10boo28bobo$183bo46bobo212b3o28b3o7865bobo 156b3o26b3o67b3o12bobbo5boo44boo9bobbo9bobo$183bo48bo98b3o100bo12bo 7896bo113b6o38b5o25b3o69bo12boobo51boo9b4o8b3o4boob3o13bo5b3o$175boo5b 3o126b3o16bo3bo94bo4b4o8bo136b3o7871bo6bo36boo3boo24b3o68bo3boo6b3o64b 4o8b3o4bobb4o14bo$175boo134bo17bo5bo93bo5b4o10boo134bo7870bo8bo15bo20b 5o25b3o71bobo6boo65bo12b3o4boo16b3o10boo$160boobboo50bobo93bo5boo9bo5b o5bo82boo9bobbo9bobo133bo7872bo6bo6bo9boo19bo3bo25bobo5boo13bo31boo3b oo12bo89bobo33bobbo$160boo3bobo14b3o30bobbo3boo41bo51boo13bo6b3o82boo 9b4o8b3o4boob3o33boo7963b6o7bo4boo4boo8boo9bobo26b3o5boo12b3o30bobobob o4b3o4boo90boo33bo$148boo14bobbo15bo30boo5b3oboobboo34boo43bo8bo10bo3b o3bo95b4o8b3o4bobb4o33bo7977bo10b3o7boo10bo48boboo31b5o5bo133bo$148boo 11bobo3bo15bo22boo4boo3bo3bo3bo3bobo32bobo43bobo18b3o4boo94bo12b3o4boo 29bo5bobo7953bo27bo6boo68b3o34b3o3boobbo132bobo3bo$159boobo3bo39boo6b oo5bobo8bo7boo57boo12boo17bo115bobo34bobo3boo7954b4o24bo5boo70boo12boo 21bo3bobo136bobo3bo$157booboobboo49bobbobboo6bobbo7boo57boo12boo134boo 35bobo7875boo65bo16b4o23bo5bo22boo48boo11boo27bo137bo4bo$157bobo56bobo 13bo80boo21bo134boo13bobbo7874bobo63bobo5boo8bobbo5boo16bobo26boo34bo 12booboo177b4o$157b4o6boo60bobo78bobo5boo16bo104bobbo26bobo12bobo7875b o58boo3boo3bo14b4o5boo16bobo62bo9boboobboo$162bo4bobo5b3o51boo36b3o40b o7bobo14bobo103bo13boo3bobbo3boo3bo12bobo75b3o7857boo3boo3bo4boboboo3b 4o25bo62bobo8b3oboo50boo$159bobbo4bo6bo3bo88bo52bo6boo5booboo101bo4bo 9b5o4b5o16bo79bo7862boo3bo5boo3bobbo90booboo6bobo54bobo$160bo12bo5bo 69boo17bo51boo5boo4bo5bo99bobobboo9boo3bobbo3boo95bo7865bobo10bo93bo5b o62bo$157boobo12bo5bo69bo86bo100boobo7990bo8bobbo29boo3boo60bo27bo$ 155bo3bo80boo5bobo74bo8boo3boo8133boo3boo57boo3boo14boo7b3o21b3o25boo$ 147b3o7boo14bo65b3o5boo75boo79bo8151boo8b3o20booboo24bobo$146bo3bo5bo 16boo52bo8boboo83bobo78b4o29bobbo8034b3o81bo30booboo14bo4boo4b3o7boo$ 145bo5bo21boo52bobo6bobbo92b3o52boo14boobobo30boo7943boo64bo24b3o64b3o 20boo3boo18b5o13boboboobbo4b3o6boo$146bo3bo21boobbo51bobo5boboo10bo80b oobo44bo7bobbo11b3obobbobboo7970bobo64bo24bo65boboo19boo3boo17boo3boo 11bo3bob3o4b3o$147b3o23bobo39boo11bobbo7b3o8boo79boo45bo3boo7bo11boobo bo3boo7970bo64b3o92boo61bo3boboo4bobo$147bobbo23boo39boo11bobo9boo7bob o80boo44bo5bo6bo12b4o135b3o7997boo62bo3boo6boo$148b3o76bobo103bobo43b 5o7bo7bo5bo27b3o109bo7541b4o379bo70bobo21boo31boo8bobo$148boobo75bo9bo 78boo15bobboo49bobbo9bo31bo3bo107bo7541bo4bo378b3o5boo59boobbo20bobo 30bobo9bo$149bobo19boo3boo60boo64bobo10boo68boo9bo32bo5bo7647bobo3bo 381bo4bo84boo25boo5bo$150bo20boo3boo59boo65bobbo8bo81bo3bo28booboboo 7646bobo3bo381boo5b3o82boo30boo$282b3o10boo10boo11boo77bobbo9bo7671bo 396bo82boo$173b3o106bo12boo8bo3boo8bobo79bo12bo7632boo35bo372boo108b3o $147boo3boo19b3o66boo39bo16boo5boo9bo93b4o7631b3o34bobbo316boo50bobbo 15bo116boo$147bobobobo20bo67boo55bo4bobbo10bobbo10b5o75bobbo7617bo15b oobo32boo317bobo50boo14booboo62b5o47boo$148b5o151bobo11bo12bob3obo73b oob3o23bo7590bobo4b3o8bobbo5boo344bo134bob3obo$149b3o77boo88bobo5boo3b o3bo73boobbo16boo5b3o82b3o7498boo4bobo16boobo5boo412bo5bo61bo3bo$150bo 76bobbo89boo5bobo3b3o96bo4bo87bo7498boo3bobbo7bobboobb3o378bo8boo102b 3o19boo3boo$226bo7b3o3bo88bo4bo94b3o5boo85bo7505bobo7bo3bobboo20bo356b obo6bobbo33booboboo63bo$218boo6bo6bo3b5o87boo98bo7601bobo6bobbo24bo8b ooboboo341bobo7bo3bobboo120bo3bo$174boo42boo6bo7bo3booboo9boo163b3o14b 3o7596bo8boo24b3o348boo3bobbo7bobboobb3o120b3o$174boo25boo24bobbo3bo3b oob3o8boo46boo106bo4boo19b3o7640bo5bo335boo4bobo16boobo5boo110b3o$201b oo26boo5b4oboo58bo31boo73bo24bo3bo7988bobo4b3o8bobbo5boo86boo$238b4o 59bobo9bo19boo97bo5bo7622boobboo11booboo345bo15boobo32boo59boo$149boo 89bo61boo8bobo96bobbo18bo3bo7613boo7bo3bobo13bo361b3o34bobbo$149boo75b oo83bo3boo6boo83bobbobboo18b3o7613b3obo10bo376boo35bo$226boo69b3o11bo 3boboo4bobo77boo3bobboobo88b3o7543bo11bo3bo20bo392bo86boo$201b3o93bo 13bo3bob3o4b3o7boo49bo5boo9bobo7boo91bo7544boobb3o5bo3bo10boo5b3o392bo bo3bo80boo$201b3o94bo13boboboobbo4b3o6boo47bo3bo3b3o10bo99bo7547bobboo 4boob4o10bo4bo396bobo3bo$200bo3bo108bo4boo4b3o60bo5boobo11bo7644bobbo 4bo5boo6b3o5boo396bo4bo$226bo96bobo56bo5bo4bobbo10boo7644bobbo5bo3bo8b o406b4o$199boo3boo19b3o95boo57boo9boobo9boo4boobboo33boo7600bo$224bo3b o162b3o11b3o4boobboo33bo$223bob3obo80bo80boo13boo4boo27bobo5bobo7604bo 24bo$224b5o81bobo94boo32bo3bo3boo7604bo24b3o$310boo96bo36bo7634b3o$ 199b3o105boo120boo10bo4bo36b3o$203boo102boo120bobo13bo39bo7592boo3boo$ 203boo194b4o11bobboboobobbo4bo10bo3bo38bo7551bo8bobbo29boo3boo$204boo 107boo8bo74bo4bo10b4oboob4o15bobo7591bobo10bo$202bobo20bobboo83bobbo6b obo71bobo3bo10bobboboobobbo7607boo3bo5boo3bobbo$202boo21bobo80boobbo3b o7bobo69bobo3bo7625boo3boo3bo4boboboo3b4o25bo$208boo14boo81b3obboobbo 7bobbo3boo63bo7631boo3boo3bo14b4o5boo16bobo14boo$207bobbo12boo72boo5bo boo16bobo4boo30bo32bo7638bobo5boo8bobbo5boo16bobo14bo$197boo3boobbo16b oobo70boo5bobbo8b3o4bobo36bobo31bobbo7636bo16b4o23bo5bo8bobo$197boo3b oobboobo14b3o77boboo15bo21boo15boobo31boo7653b4o24bo5boo7boo$213bo93b 3o35bobo14booboo3boo91b3o7586bo27bo6boo$199b3o12bo93boo26boobboo6bo13b oobo4boo93bo7609boo10b3o$199b3o13bo9boo3boo104boobobbobbobbo13bobo99bo 7598b6o6bobo3boo4boo$200bo11bo5bo9bo111boo6bo8bo5bo7698bo6bo6bo9boo 123boo$209boobbobbooboo4bo5bo113bobo7bobo33b3o7667bo8bo15bo125boo$207b 5oboo11booboo114boo9boo32bo3bo7667bo6bo141bo$215bo4bo6bobo159bo5bo 7667b6o$210boo4bo11bo160bo5bo$208bobboo5boo8bo146b3o14bo$200boo7boboo 5bobo43bo112bo12bo3bo$200boo8boo6bobo42b3o98bo11bo16bo49b3o$215boobboo 42boboo98bo15bo7bobbo5bo46bo96bo$214boo48b3o96b3o15bo7bo6b3o45bo96bobo $215bobo9boo5b3o27boo115bo8bo4bo144bo3boo3boo$216boo9boo5bobo150b3o5b oo143bo3boo3boo$234b3o11boo118boo17bo152bo3boo$234b3o11boo5boo110bobo 23bo136boo9bobo$234b3o17bobo112bo22bobo134bobo10bo$234b3o17boboboo131b o3bo133bo$234bobo18bobobo132b3o133boo$234b3o20bo132boo3boo26b3o$256bo bbo165bo$248bo7bo167bo$247b3o6bo3bo88boo9b3o$247b3o6bo7bo84bobbo9bo$ 256bobbo3b3o75b5o7bo7bo5bo$214boo29boo3boo5bo4boobo74bo5bo6bo12b4o 7654bo$214bo30boo3boo3bobobobb3o75bo3boo7bo11boobobo3boo33boo7612bob4o $204bo7bobo39boboboo3boo76bo7bobbo11b3obobbobboo33bo7612bobob3o$204b4o 4boo8boo30bobo92boo14boobobo27bobo6bobo7611bobo$205b4o11bobbo23boo6boo 109b4o28bobbo5boo7613bo$205bobbo10bo7boo18bobo21boo94bo33boo7583bo35b oo$205b4o10bo6bobb4o13bobboo20boo114boo10bo3boo7578b4o4bo30boo$204b4o 11bo7boob4o14boo6bo116boo6boo4bobo11boo7571bo7b4o5bo25bo4boo$204bo8boo 5bobbo10bo13boo6b3o97boo13bo4bobbo4bo3bo9bobbo7571bobo6bobbo9boo19bobo $195bo16bobo7boo8bo16bo9bo98boboo9bo4bobbo4bo13bobo7560boo9bo3boo4b4o 9boo18bo3bo$194bob4o12bo16bo5bo22boo94bobbobboo9bo4bobbo4bo7576boo9bo 3boo5b4o29b3o$193bobob3o11boo16bo5bo7bo5bo104bobo16boo6boo7589bo3boo8b o27boo3boo$192bobo35bo3bo8bo5bo105bo7617bobo$193bo37b3o10bo3bo6bo8bo7b o46bo7654bo28boo$193boo43boo5b3o5bobo7b3o5b3o45bobo33boo7626bobo18boo$ 193boo43boo14boo7boboo3b5o27boo18boo31boo7627boo17bo141bo$193boo43boo 24b3obbobobobo24bo3bo17boo4boo7654bo160boo$239bo24boo3boo3boo18boo3bo 5bo16boo4boo7814bobo$238bobo53boobboobo3bo8bo4bobo$238bobo58bo5bo9bo3b o7703bo508b4o$239bo29boo29bo3bo5bobb3o22bo7655b3o8b3o6boo5b3o507bo4bo$ 200boo67boo31boo33bo11b3o7641b5o17bo4bo510bo3bobo$200boo30boo34bo68b3o 8bo3bo138bo7500boo3bo14b3o5boo510bo3bobo$200boo30boobboo3boo25b3o76bo 5bo137boo7519bo525bo$200bo35bobobobo29bo62boo11bo3bo133boo4boo8boo 8034bo34bobo$199bobo35b5o6b3o7boo8b5o65bo10b3o134boo4b3o7boo8031bobbo 34bo3bo$200bobob3o11boo18b3o6bo3bo5bobo10boo47boobb3o9bo13b3o134boo4b oo8042boo4bo34bo7bo$201bob4o12bo19bo19bo58bo7bo8bo20bo126boo6boo7842bo 205b3o19boo8bo4bo4b4o$202bo16bobo5bobo16bo5bo66boobbobbo8bobbo8boo5b3o 125bobo6bo7496boo25boo3boo312b3o203bo3bo18boo12bo4boboboo9boo$210bo9b oo5bobbo15boo3boo14boo3boo49bo3bo3bo4bobo9bo4bo128bo7506boo27bo315bob oo201bob3obo27bo3bo3bobbob3o8boo$208bobo19boo36b5o58bo5bo7b3o5boo126b oo7505bo26bo5bo313b3o202b5o28bobo6boboboo$207bobo18bo3boo34booboo53bo 18bo7631boo37booboo314b3o245b4o$206bobbo20boo19boo15booboo50bobo7650bo 3bo36bobo315boo248bo$207bobo17bobbo20bobo15b3o79bo7623bo5bo7bo28bo555b o$208bobo8boo6bobo23bo95booboo7611boo8bo3boboo4bobo28bo555bobo$210bo8b obo18bo11boo7711boo8bo5bo3boo12boo33boo538boo$221bo18bo8bo98bo5bo7621b o3bo4boo12boo33bo$205boo14boo17bo8bobbo7724boo6boo38boo5bobo$204boo43b o98booboboo7632bobo34bobo5boo133bo368bo27bo$206bo62boo36boo9boo7669bo 12boo19b3o139b3o368b3o5boo16bo3bo$269boo36bobo7bobo7680bo4bo6boo8b3o 139bo374bo4bo17bo4bo$248booboboo47boo6bo8bo5bo7673bo6bo5bobo8b3o138boo 372boo5b3o14boboboo$219bo21b3o54boobobbobbobbo13bobo7654boo15bo8bo5bo 10bobo520bo$219bo20bo3bo3bo5bo43boobboo6bo13boobo4boo15boo16boo7612boo bboo11bo8bo17boo135bo$219bo19bo5bo61bobo14booboo3boo33bo7611boobobboo 11bo8bo153bobo$249booboo53boo15boobo28boo7bobo7611b3o17bo6bo153bo3bo 35boo$238bo7bo4bo72bobo29boo7boo7633bo4bo149boo4b3o36boo$238bo7bo78bo 33boo7584boo55boo151bo3boo3boo403b3o$345boo12b3o7582bo3bo31boo171bobo 45bo336boo3boo24bo$234boo3bo5bo69bobbo12boo6boo4bobo11boo7567boo13bo5b o30boo171boo45bobo336b5o26bo$234boo4bo3bo70bo14bobbo4bobbo4bo9boo7570b oo13bo3boboobboo227boo11boobbobbo336booboo38bo$218b3obboo16b3o7boo61bo 4bo10bobbo4bobbo14boo7561boo3bo6boo10bo5bo3boo227bo12boobo340booboo38b oo$222bobbo25boo60bobobboo10bobbo4bobbo7577bobo3bo5b3o10bo3bo26bo198b oo3boobo16boo339b3o28bo5boo4boo$207boo9boobbobo86boobo16boo6boo7579b5o 6boo12boo27b3o196bo3bo3bo6boo381bobo3boo4b3o7boo$207boo9b3ob3o7696b3o 4boo10bo32b5o100boo92bo15bobbo332boo33boo11bobobboo4boo8boo$218boobbo 53bo7651boo10bo31bobobobo100boo91bo3bobbo12bo332bo33boo11bobbo6boo$ 220bo55b4o31bobbo7624boo31boo3boo99bo93bo5bo13bo332bobo5boo37bobo7bo$ 216bo43bo16b4o32boo7627boo229bo3bo14bo333boo5bobbo34bobo$205boo8boobbo 39bobo5boo8bobbo5boo7665boboo217boo5boo5bobbo345bo33bo$216bobboo7bo23b oo3boo3bo14b4o5boo10boo146boo7505bobbo223bobo5boo347bo$217b3o7boo3boo 3boo13boo3boo3bo4boboboo3b4o17bobo144bobbo7bo7704b3o17bo356bo15bo6bo$ 218bo8bobo27boo3bo5boo3bobbo22bo143bo7boo3bo7494bobobobo23bo197boo352b obbo15boo6boo15boo$233bo3bo21bobo10bo170bo6bo5bo7494b5o16boo5b3o551boo 16b3o6b3o10boobo$204boo3boo23b3o23bo8bobbo170bo7b5o7517bo4bo573boo6boo 11boobbobbo$205b5o3boo19b3o68boo3boo124boo6bobbo7522b3o5boo178b3o392bo 6bo17bobo$205booboo4boo91b3o125bobo8boo7511bo10bo5b3o179b3o418bo$205b ooboo3bo92bo3bo124bo7523bo15bobo181bo454bobo$206b3o24bo45bo27bobo124b oo7523bo14bo3bo180bo160b3o255boo29bo4bobbo$232b3o45bo27bo7665b5o180bo 159bobbo255boo30boo5boo8bo$231bo3bo42b3o3boo28bo7658boo3boo178bobo161b o260b3o19boo8bo3boo5bobo$233bo48bobbo5bo13boo5b3o7640boo17b5o339bo3bo 260b3o19boo10boo6boboo10boo$230bo5bo45b3o6bo14bo4bo7639boobboo18b3o 344bo259bo3bo27bobbo6booboo10boo$208b3o19bo5bo46bo19b3o5boo7631boo6bo bboo19bo181bobo158bobo292bobo8boboo$208b3o20bo3bo67bo7628bobo10boo5b3o 204bo6boo413boo3boo9b3o26bobo$207bo3bo20b3o52b3o7637bo4bobbo8bo214bo6b oo429b3o17bo9bo$206bo5bo96bo7618boo5boo11boo209bo6boo10bo418boo17bo$ 207bo3bo97bo7613boo8bo3boo8bobo208b3o5bo11bo437b3o$208b3o97bobo7612boo 10boo9bo6boobboo33boo164b3o4bobo10bobb3o9boo403bo$307booboo7620bobbo 10bobbobbobboboo33bo172bobo13bobbo8boo403boo$306bo5bo7619bobo11bo6boo 28bo6bobo173bo13bo3bo426boo$309bo7637bobo33bobo4boo192bo393bo16bo15boo $264boo40boo3boo7635boo36boo196bo8b3o382b3o5boo7bo$262bo3bo5bobb3o 7692boo14boo175boo3boo10bo3bobo6b3o385bo4bo8bo9bobo$233boo26bo5bo9bo3b o7659boo27bobo13boo175bobobobo12bo3bo393boo5b3o14b3o$233boo21boobboobo 3bo8bo4bobo25bo7630b4o11bobboboobobbo4bo11bobo178b5o14bo405bo12b3obo$ 256boo3bo5bo16boo4boo15boo16boo7612bobbobo9boobbo4bobboo15bo181b3o3boo 429boo$262bo3bo17boo4boo33bo7612bobobboo10bobboboobobbo199bo3bobo18boo 3boo$208boo54boo18boo20bo7boo7bobo7611bobo232bo19b5o$208boo71bobo23bob o4bobo6boo7611boo255b3o$281bo11boo14bo5b3o7582bobo33b3o255bo385boo3boo 25boo$291bo4bo7bo11b3o7581bobbo33bobo248b3o389boo3boo25bobo$290bo6bo6b o10b3o7567bo6bo10boo33boo248bo392b5o26bo$273b4o12bo8bo5bo9bobo7567bobo 5bo8bo3boo4boo99bo176bo392bobo38bo$272bo4bo11bo8bo15boo7561boo4boboo6b o9boo6boo99boo91boo514b4o$271bobo3bo11bo8bo7578boo3booboo9boobbobbo 107bobo91boo60b3o412b3o26bobo6boboboo$270bobo3bo13bo6bo7585boboo5b3obb obbobo263booboo440bo3bo3bobbob3o8boo$270bo20bo4bo100bobo7484bobo7b4o 268booboo395boo33boo12bo4boboboo9boo$233boo35bo22boo102bobbo7484bo9boo 33boo3boo193boo34b5o396bo33boo8bo4bo4b4o$233b3o34bobbo126boo6boo7720b oo33boo3boo19b3o373bobo5boo38bo7bo$219bo15boobo32boo125bo3boo4boo7521b o3bo170bo461boo5bobo33bo3bo$217bobo4b3o8bobbo5boo154boo7530b3o169boob oo82bobo384bo32bobo$210boo4bobo16boobo5boo143boo6bobbo7502bo28b3o255b 5o380bobbo18b4o$210boo3bobbo7bobboobb3o152bobo6bobo7504boo5b3ob3o185bo 5bo20bo58boo3boo382bo17b6o14bobbo$216bobo7bo3bobboo153bo7514boo5bo3bob oo21bo189bobo37boo18boo3boo309bobo67bobo17b8o16bo$217bobo6bobbo33boobo boo117boo7521bo3boboo12boo5b3o163booboboo18bo3bo174bo197boo68boo17boo 6boo11bo4bo$219bo8boo7681b3o17bo4bo192b3o174b3o68bo128bo88b8o12boobbob o$263bo5bo7658b3o5boo189boo3boo58bo112boobo67bobo217b6o18boboo$7928bo 175bo62boo21boo113b3o66boo3bo14boo201b4o$248boo14booboo7639bo195bobbo 59boo136b3o61boo3boo3bo13bobo260boo$247bobbo15bo7641boo175bo18bo84bo 116boo61boo3boo3bo12b3o4boob3o215bobbo8boo15b3o4boo$248boo7657bobo23b 3o147bobo21boo267bobo12b3o4bobb4o215boo10bobo13b5o6boo10bo$272bo7809bo bo11boo10bo23bo57bobbo183bo6bo7b3o4boo231bo14bobo3bo5b3o7bobo$263boo5b 3o7660bobo145bobbo11boo8bobo23bo59boo188boo9bobo229b3o19boo3bo6boo6boo 12boo$264bo4bo7662b5o145bobo21boo20b3obo250boo9boo228booboo27boo9boo 12boo$261b3o5boo7660boo3boo139boo4bobo538booboo27boo9boo$261bo7627bo 41boo3boo138bobo6bo41bo496b5o40bobo$7887b4o6boobboo173bo24boo3boo19boo bo492boo3boo29bo11bo$240b3o7643boboboo5b4obobbobo167boo24bo5bo21boo 528bobo$242bo24bo7613boobbobbob3o5boobo3bo3bo24bo475boo247boo$241bo24b 3o7612boo3boboboo4bo12bo5boo16bobo14boo150bo3bo268bobo32boo$266b3o 7618b4o14bo4bo4boo15boo16bo152b3o8bo14boo3boo239boo$7889bo19bo22boo5b oo7bobo178boo3boo240bo269boo3b3o$264boo3boo7634bo3bo22b3o4bobo6boo172b o7b5o485bo16bo7bo4bobbo$222bo8bobbo29boo3boo7634bobo34bo178bo9bobo486b 3o5boo7bo7boobo4bo$221bobo10bo7682b4o7boo4bo4bobbo178b3o499bo4bo8bo10b o3bo$219boo3bo5boo3bobbo7677b6o6bobo11bo188b3o315boo171boo5b3o16bo$ 214boo3boo3bo4boboboo3b4o25bo7630bo16b8o6bo9bobo427bo78bobbo179bo14bob o$214boo3boo3bo14b4o5boo16bobo14boo7612bob4o11boo6boo15boo163boo261boo 42bo39bo194bobo$221bobo5boo8bobbo5boo16bobo14bo7612bobob3o12b8o181boo 262boo40b3o38bo194boo$222bo16b4o23bo5bo8bobo7611bobo18b6o198bo288b5o 31bo3bobo$238b4o24bo5boo7boo7603boo8bo20b4o200boo16bo268boo3boo16boo 11bo3bobo$238bo27bo6boo7582bo29boo7boo47boo173boo9boo6bo291bo12bo4bo 172boo3boo$262bo10b3o7579b4o27bo3b3o3boo48boo183boo5bobo279boo7bobo13b 4o173bo5bo25b3o$249b6o7bo4boo4boo76bo7494boo5b4oboo30boo4boo47bo193bo 280boo7boo6bobo214bo$230boo16bo6bo6bo9boo75bobo7492bobbo3bo3boob3o8boo 21bo246bo220bobo47bo4boo6boo10bo3bo183bo3bo27bo9bo$232boboo11bo8bo15bo 74boo12boo7472boo6bo7bo3booboo9boo268bo220boo48bo6bo5b3o9bo188b3o37bob o$228bobbobboo12bo6bo91boo12boo7472boo6bo6bo3b5o280bo221bo50b5o6boo9bo 4bo212bobo8boboo$228bobo18b6o92boo7494bo7b3o3bo30booboboo138bo104bobo 279boo13bo26boo188bobbo6booboo10boo$229bo112boo5bobo7492bobbo40bo5bo 137b4o103bo240bo39boo8boo3bo3bo22b3o143boo33boo10boo6boboo10boo$191boo 148bobo7bo7494boo41bo3bo137boobobo3boo97bo239bobo28bo18bobo5bobo13boo 9boobo141bo33boo8bo3boo5bobo$191bobbo34boo110bo7548b3o137b3obobbobboo 336bo3boo6boo17bobo17bo23bo5bo4bobbo141boboo3boo30boo5boo8bo$177bobo 15bo33boo109boo7689boobobo317bo12boo9bo3boboo4bobo17boo16boo28bo5boobo 142bo3bo3bo28bo4bobbo$175bo3bobb3o10bo6boo7655boo5bo154boo9b4o316boo 13boo9bo3bob3o4b3o7boo51bo3bo3b3o7boo145bo32bobo$168boo5bo19bo6boo 7654boo5bobo152bobo10bo319boo24boboboobbo4b3o6boo53bo5boo8bobo137bobbo 3bo$168boo4bo4bo7boobbobbo7664boboo5bo151bo97boo172b3o85bo4boo4b3o80bo 138bo5bo$175bo7bobobbobboo28boo3boo7632bo4bobbo28bo121boo97bo17b3o153b obbo94bobo81boo138bo3bo18b8o13b4o$175bo3bo5b3o36bo7636booboo3b4o15boo 5b3o32boo175bobo6bobo173bo97boo16bo29bo177boo19bob4obo12bo4bo$177bobo 41bo5bo7634b3oboob4o16bo4bo36boo174bobbo5boo8boo164bo3bo110bobo28bobo 196b8o12bo3bobo$222booboo7641b3o15b3o5boo34bo179boo13bobo164bo84boo27b o3bo19bobo5boo218bo3bobo$223bobo7642boo16bo221bo3boo10b3o4boo160bobo 49bobo29boo27bo3bo19bobbo230bo$194bo29bo7643bobobo237boo11b3o4bobbobbo 208boo59bo3bo22bo230bo33boo$195bo28bo7642boobboo234bobbo13b3o4booboobo 208bo59bo3bo20b3o227bobbo33bobo$193b3o7668bo3boobbo234bobo7boo6bobo6bo 3bo243boo22bo3bo20boo229boo29boo4b3o12bo$201bo3bo24bo7633boo3boo227boo 16bobo7boo6b5o24boo217bobo21bo3bo4boo11bo3bo256b4obbo4b3o8b4o$200boo4b o14boo5b3o7632bobo4bo229boboo12bo16boo3boo21bobbo7bo209bo11bo12bobo5b oo10bo239b3o19b3oboo4b3o8b4o9boo$199bo6bo15bo4bo7868bobbobboo11boo17b 5o21bo7boo3bo196bo21bobo13bo18bo270bobo9bobbo9boo$199boboo3bo12b3o5boo 7662b3o202bobo36b3o22bo6bo5bo195bo9boo9boo36bobbo235bobo28boo10b4o5bo$ 200boob3o13bo7630boo38bo3bo202bo38bo23bo7b5o189boo5b3o7boo9boo38bo11b oo222b5o31bo8b4o4bo$7849b3o3boobo30bo5bo255b3o7bobbo197bo19boo6boo50b oo221boo3boo29bo12bo$198boo7630boo14boboo5bo3bobbo27bo3bo202boo51boob oo8boo189bo5bobo19b3o7bobo7boo261boo3boo29b3o$197bobo7630boo7boo5bobbo 4bo4bobboo27b3o203boo51booboo198b4o3boo20boo10bo7bobo9b3o8bobb4o$199bo 25bo7613boo5boboo4b4o5boo8boo16b3o14boo240b5o186boo9boobobo14boo5boo 23bo8booboo6bo5boo$224b3o7589boo31b3o3bo7b3o7boo33bo240boo3boo185boo8b 3obobbo12bobo5boo23boo7booboo13bobo$223b5o7588boo32boo11boo32bobo6bobo 443boobobo13bo41b5o9b3o$222bobobobo7633boo31bo3bo6boo445b4o13boo40boo 3boo11bobboo7b3o217bo$181bo8boo30boo3boo7633bo32bo77boo379bo7bo68boboo 227b3o5boo$179bobo6bobbo7694boo6bo4bo73bobo160boo223boo68bobo8bobo220b o4bo$178bobo7bo3bobboo7689bobo6bo72boo6bo7boo150boo12boo209bobo6boo46b o13bo8b5o79bobo136boo5b3o15b3o$172boo3bobbo7bobboobb3o27bo7590b3o11b3o 38bobboboobobbo4bo7bo3bo67bobbobbobbo7boo385bo45boboo19boo3boo78boo 146bo15bo$172boo4bobo16boobo5boo16bobo14boo7573b3o10bo3bo37b4oboob4o 14bobo67b3o6bo394bobo6bo36bo22boo3boo79bo163bo$179bobo4b3o8bobbo5boo 16bobo14bo65bo7507bo3bo8bo5bo36bobboboobobbo82b3o5bobo379bo16boo6b4o$ 181bo15boobo24bo3bo9bobo64bobo7519booboboo129bobo6boo177boo200bo26b4o 7bo24boobo$195b3o28b5o8boo64bo3boo3boo7498boo3boo143bo187boo200b3o24bo bbo6bobo21bobbo21boo242bo$195boo29boboboo73bo3boo3boo7647boo416b4o4boo 3bo20bobo20boobo222booboboo11boo$220bo4bobbob3o72bo3boo7520bo548b4o5b oo3bo9boo32bo70bobo152bo5bo12boo12boo$189bobbo27bo5boboboo63boo9bobo 7521bobo547bo8boo3bo9boo101bo3bo153bo3bo27bobo$189bo17bo4bo7bo6b4o63bo bo10bo7522bobo512bo45bobo45b3obo56boo5bo158b3o28bo11bo$188bo4bo11boob 4oboo14bo64bo7519b3o14boo502bo9bobo44bo50bo56boo4bo4bo195bobo$187bobo bboo13bo4bo80boo7523boo13bo500b3o8boo34bobo32b3o24bo63bo186boo9boo$ 185boobo7629boo12b3o499boboo43boo32bo3bo87bo3bo7boo173boo9boo12boo$ 7819boo10bo3bo499b3o39bo4bo31bo5bo88bobo7bobo128boo33boo3bo6boo6boo12b oo$149boo7666bobo10bob3obo442bo55b3o38boo37bo3bo101bo129bo33bobo3bo5b 3o7bobo$149bobo29boobbobbo7628boo7bo4b5o442b3o54boo39bobo37b3o102boo 128bobo4bo27b5o6boo10bo$136bobo13bo34boo7635boo452boboo134b3o19boo3boo 207boo3bobo27b3o4boo$135bobbobboo6bobbo7boo7663boo452b3o158b3o212boo3b o33boo$126boo6boo5bobo8bo7boo7650boo3boo460b3o58bo49boo47bo3bo211boo3b o$126boo4boo3bo3bo3bo3bobo7660boo3boo460boo58bo43boboo3b3o47bobo212boo 3bo$134boo5b3oboobboo28boo3boo7638bo514b3o37bobbo3bo5boobo20boo23bo 215bobo19bobobbobo16boo$135bobbo3boo35boo3boo7628b3o8boo551boobbo4bo4b obbo5boo13boo240bo16boobobbobbobboboo8boobo$136bobo7675b3o7boo541boo8b oo5b4o4boobo5boo276bobobbobo12boobbobbo$181b3o7631bo543boo6boo7b3o7bo 3b3o311bobo$181b3o7651boo505boo15boo16boo11boo49boo101boo159bo$152boo 28bo7652bo506bobo33boo61boo101bobo193bo$150bo7685b3o80boo421bo36bo164b o159boo10bo23boo$151bo3bo7682bo80boo783boo11bo17boo4boo13boo$153bobo 15bo16bo7727boo6bo3boo785b3o13boobboo4b3o11b3o$171bo7boo5b3o7626boo98b 3o5bo3bobo430bo370boobboo4boo9boboo9boo$171bo8bo4bo7629boo99boo6b5o 429booboo346b3o28boo10bobbo4bo5bo$177b3o5boo7722boo8boo4b3o780bo3bo27b o11boboo5bo$177bo7633bo96bobo8boo436bo5bo391b3o3bo3bo$7811b3o94bo798bo 5bo30boo10boo5bo$7814bo92boo448booboboo200boo141boo3boo30b3o$155b3o 7655bo25bo505boo217bobo$157bo7655bobbo23boo503bobo216bo164b3o$156bo26b o7633bo21boo504bo383b3o$182b3o7629bo3bo910bobobo$181b5o7591boo37bo540b oo345bo24boobobo$139bobo38boo3boo69bo7518bobbo34bo5bo537bobo344b3o5boo 15boobobo$137bo3bo5b3o106boo7555bo5bo537bo349bo4bo18b3o$137bo7bobobbo bboo96boo4boo8boo7545bo3bo543boo342bo6b3o$130boo4bo4bo7boobbobbo94boo 4b3o7boo7506boobo36b3o544bo343bobbo5bo$130boo5bo19bo6boo16b3o14boo50b oo4boo7518bobobboo11boo566b3o194bo23boo124bo14b3o$137bo3bobb3o10bo6boo 16b3o14bo48boo6boo7520bo4bo12bo568bo193bobo22bobo120bo3bo$139bobo15bo 29bo9bobo47bobo6bo7522bo16bobo5boo741boo10boobo21bo124bo$153bobbo29bob o8boo48bo7531bobbo6bo7boo5bobbo739boo10booboo142bo5bo$153boo30boboo57b oo7538b4o18bo750boobo143bo5bo16boo$178bo5booboo7596b4o19bo750bobo4boo 139bo3bo16bobboboo$178bo6boboo7596bobbo19bo45bo505boo198bo5bobo139b3o 18bo9b3o$147b4o10bobboo4boobbo3bo7bobo7596b4o15bobbo47boo473boo28bobo 15boo188bo161b4o5bo12bo$146bo4bo8bo3b3obb3o3bo11bo7598b4o6boo6boo48boo 473bobbo27bo17boo188boo162bo7bo8b4o4bo$145bobo3bo9bobboo4boobbo7614bo 6bobo18bo36bobo472bo406boo10b4o5bo$144bobo3bo7647bo17bobo36boo407b3o 62bo23bobbo247boo130bobo9bobbo9boo$135b3o6bo7653boo16boo38boo405bobbo 62bobo11bo7b3obb3o245bobo85boo33b3oboo4b3o8b4o9boo$106boo29bobbo3bo 7637b3o70bo410bo62bobo11boo5bo8bo244bo88bo33b4obbo4b3o8b4o$108bo27bob oobobbobbo7634bo479bo3bo63bo11bobo5boo6boo18b3o312bobo5bo29boo4b3o12bo $95boo12bo29bo5boo7636bo482bo111b3o313boo3bobo34bobo$95boo4bo7bo8boo 20bo8122bobo82bo28bo3bo316bobo35boo$84boo6boo5boo8bo8boo8207boo3boo13b obo347bobbo13boo$84boo5b3o5bobboo4bo7709b3o10boo494bo5bo3boo7bo3bo25b oo3boo315bobo12bobo26bobbo$92boo6b5oboo29boo3boo7674bobo10boo504boo8b 3o349bobo12bo3boo3bobbo3boo13bo$95boo4bo35bobobobo7674b3o507bo3bo12boo 3boo8b3o338bo16b5o4b5o9bo4bo$95boo41b5o7675b3o33bo474b3o27bo3bo260boo 92boo3bobbo3boo9boobbobo$139b3o7676b3o31b3o503bo5bo10boo247bobo119bob oo$140bo7677b3o30bo506booboboo10bobo246bo$107b3o5bo7695boo5bobo30boo 522bo405bo$107bobbo4boo7694boo5b3o10bo512boo400bobbo29b4o$107boobo4b3o 7677boo33b3o7boo501boo19bo381boo30boboboo14boo$109bobb3obboboo8bo16bo 7647bobobb3o28b3o8boo502bo17boo10bo397boobbobbob3o11bobbo7bo$110boo4bo 4bo7bo7boo5b3o7637boo8bo6bo12bo25bo491bo440boo3boboboo11bo7boo3bo$110b ooboboo4bo7bo8bo4bo7639bobo10b5o12bo14boo3boo495booboo27boboo413b4o12b o6bo5bo$112bo22b3o5boo7637b3o28bo14boo3boo526bobboo385b3o27bo5bo7bo7b 5o$116bo3bo14bo7646boo11bo45boo486bo5bo25b4o279boo104bo3bo31bo9bobbo$ 119bobo7660boo10bo45boo534b3o265bobo102bo5bo30b3o9boo$116bobboboo7660b obo8bobbo11boo3boo17boo7bo4b5o477booboboo39bo3bo264bo104booboboo$113b oobo4bo89boo7571bo9b3o15bo20bobo10bob3obo493bo13boo3boo7bo5bo389b3o$ 112bobobboboo88bobbo7bo7584boobbo5bo19boo10bo3bo493b3o15bo10bo5bo389b 3o$114bo3boo88bo7boo3bo7583bobobbooboo19boo12b3o493b5o11bo5bo10bo391b oo$141bo66bo6bo5bo7559boo3boo17bo5bobo20boo13bo493boo3boo11booboo9bo3b o388b3o$140b3o65bo7b5o7560boo3boo24bo17b3o14boo513bobo11b3o223boo142bo 24bo7bo$98bobo38b5o57boo6bobbo7599bo33bobo514bo13bo222bo3bo141b3o5boo 14b4o5bobo$97bobbo3boo32boo3boo55bobo8boo7570b3o3b3o54bobo514bo230boo 3bo5bo143bo4bo18bo5boo$96boo5b3oboobboo26b5o56bo7582b3o5bo55bo497b3o 246boobboobo3bo58boo82boo5b3o16bo$88boo4boo3bo3bo3bo3bobo25bo3bo55boo 7583bo5bo540boo12b3o29boo220bo5bo58bobo90bo$88boo6boo5bobo8bo7boo16bob o14boo7651bo19boo3boo494boo44boo221bo3bo8boo49bo85b3o23bo$97bobbobboo 6bobbo7boo17bo15bo7651b3o32booboboo751boo9bobo134b3o20b3o$98bobo13bo 32bo7bobo7650bo3bo18bo3bo8bo5bo494boo16boo250bo133bo3bo$111bobo31bobo 7boo7650bob3obo18b3o10bo3bo495boo16boo250boo131bo5bo$111boo30boo7663b 5o19b3o11b3o900bo3bo$136bo6boo7640b3o463bo498b3o$136bo6boo7640b3o462b 3o529boo$104boo14bobboboobobbo4bo8bobo7636bo3bo460boobo113boo414bobo9b oo5bo$106boboo9boobbo4bobboo14bo8101b3o112bobbo316boo96bo10b3o3bo3bo$ 102bobbobboo10bobboboobobbo7651boo3boo42boo415b3o111bo15bobo302bobo91b o11boboo5bo$102bobo7727boo416boo103boo6bo10b3obbo3bo300bo93boo10bobbo 4bo5bo$103bo8251boo6bo19bo5boo343boo33boobboo4boo9boboo9boo$64bo7781b oo516bobbobboo7bo4bo4boo344bo33boobboo4b3o11b3o$63bobo31boo4boo7741boo 518boobbobbobo7bo351bobo5bobo27boo4boo13boo$53boo6boo3bo30boobobboo 8266b3o5bo3bo352boo3bo3bo32boo$52bobo4boobo3bo9boo22bo7709boo567bobo 359bo36bo$42boo7b3o4b3obo3bo9boo7732boo928bo4bo10boo$42boo6b3o4bobboob obo8675bo13bobo$51b3o4boo4bo30boo3boo8262bo339boo35bo3bo10bo4bobboboob obbo11b4o$52bobo41b5o7684boo576bo340bobo36bobo15b4oboob4o10bo4bo$53boo 42b3o7685boo576b3o30boo306bo56bobboboobobbo10bo3bobo$98bo8297boo386bo 3bobo$67bo8722bo$65bobo8722bo32bo$66boo8331bo387bobbo31bobo$8398bo389b oo31boboo15boo$78boo24bo8251bo41bo416boo3booboo14bobo$77bobo15boo5b3o 8251bobo76boo378boo4boboo13bo6boobboo$79bo16bo4bo60bobo8191boo77boo 287boo96bobo13bobbobbobboboo$93b3o5boo59bobbo8228boo3boo323bobo96bo5bo 8bo6boo$93bo71boo6boo8222bo326bo68b3o33bobo7bobo$163bo3boo4boo8219bo5b o34b3o354bo3bo32boo9boo$165boo8228booboo17boo11boobboboo214boo137bo5bo 28boo$154boo6bobbo8183bo46bobo18bo12boobboo215bobo137bo5bo18boo8bobo$ 70b3o80bobo6bobo8183bo48bo8bo8bobo16boo205boo7b3o4boo135bo20b3o9bo$72b o80bo8194b3o46bo6bobo8boo9boo213boo6b3o4bobbo132bo3bo17boo$71bo80boo 8249bobo19bo3boo219b3o4bo135bo19bo$84bobo8315bobbo18bo5bo220bobo7bo 126bo5bobbo14boboobo$57boo26boo10b5o8301bobo18bo3boboo220boo5boobo81b oo42b3o6bo15bob3o$57boo4bo21bo10bob3obo8301bobo17bo5bo231bo81bobo44bo 4bo19boo$54boo6b5oboo27bo3bo8260boo42bo9boo7bo3bo232boo80bo45boo5b3o$ 46boo5b3o5bobboo4bo27b3o8240bo20bobbo30bo18bobo8boo371bo10bo$46boo6boo 5boo8bo8boo17bo15boo8224bobo10b5o7bo9bobo16bobo17bo377bo16b3o3bo$57boo 4bo7bo8boo33bo8225boo10bo5bo6bo7bo3bo17boo16boo376bobo16b4o4boo$57boo 12bo34bo6bobo8237bo3boo7bo7bo12boo402bo3bo17boo4b3o$70bo32b4o6boo8121b 3o115bo7bobbo7bo4bo8boo403b3o20bo4bo$68boo32b4o8130bobbo122boo10bo18b 3o394boo3boo18boo3boo$94bo7bobbo8130bo137bo3bo435bo4b3o$63bobbo27bo7b 4o8130bo3bo93bo41bobo13bo3bo20bo346boo48boboo$63bo14bobbo4bobbo4bo8b4o 8129bo96bo58bo3bo20bo346bobo48bo8b3o9boo$62bo4bo8b3obb6obb3o14bo8130bo bo93b3o27boo52bo346bo59bo9bobbo$61bobobboo10bobbo4bobbo8273boo28b3o 423bo5bo7bo7b5o$59boobo8754b4o12bo6bo5bo$8776boo33boo3boboboo11bo7boo 3bo$23bo8369b3o381bo33boobbobbob3o11bobbo7bo$21bobo32bobbobbo8296bo41b oo374bobo6bobo27boboboo14boo$12bo7bobo32bobo3boo8263bo30boo12bo10bo9bo 3bo4boo375boo5bobbo28b4o$11boo6bobbo11boo18bo3bo8267bobo29boo10boo9boo 9bo3bo19boo366boo33bo$oo8boo4boobbobo11boo11bo6b5o8267boo37bo4bobo7boo 3boo30boo363boo3bo10boo$oo7b3o4boo3bobo23bobo3boo3boo8288boo13bobo13b 3o11b3o20bo11boo354boo11bobo4boo6boo$10boo4boo5bo23boo5b5o8263boo24bo 13bobo15boo46boo355bobbo9bo3bo4bobbo4bo13boo$11boo42b3o8264boo12boo8bo bo12bobbo16boo5boo396bobo13bo4bobbo4bo9boobo$12bo43bo8279boo8boo14bobo 17bo5bobo411bo4bobbo4bo9boobbobbo$8327boo3bo6boo17boo3bobo24bo413boo6b oo16bobo$37bobo8287bobo3bo5b3o15bobo5bo24boo17bo421bo$37b4o75bo8211b5o 6boo16bo43bo7boo456bo$38booboo71bobo8212b3o4boo18boo42b3o5bobo419boo 33bobo$31b3o6bo71boo12boo8087boo119boo61b5o426boo31boo18boo$30booboo6b oo19bo49boo12boo8087bobo180boo3boo452boo4boo17bo3bo$30bobbooboobboo11b oo5b3o49boo8103bo138boo41b5o17boo274boo158boo4boo16bo5bo3boo$31boo4bob o14bo4bo47boo5bobo8100boo125bo4b3o5bo41b5o16boo275b3o165bobo4bo8bo3bob oobboo$38bobo10b3o5boo45bobo7bo8084boo139boo5bo7bobo4bo35bobbo18bo4b5o 256boo9boobo164bo3bo9bo5bo$39bo11bo54bo8093bobo140boo5bo7b3ob4o34bo3bo 21bob3obo255bo5bo4bobbo168b3obbo5bo3bo$39b3o63boo8093bo159booboboo14b oo21bo22bo3bo261bo5boobo132b3o45boo$8199boo159bobbob3o11bobbo18boobo 23b3o258bo3bo3b3o7boo125bo3bo$8236b3o122boboboo11bo7b5o12bo25bo261bo5b oo8bobo123bo5bo$28boo8206bobbo93bobo26b4o12bo6bo5bo35boo280bo124bo3bo 13boo$27bobo8206bo96boo29bo5bo7bo7boo3bo34bobo280boo124b3o14bobo$29bo 8206bo3bo93bo34bo9bobbo7bo9boo3boo19bobo406b3o14bo11bo$54boo3boo8175bo 132b3o9boo17bo5bo20bo402bo16bo16bobo$15boo8220bobo590b3o5boo7bo16boo$ 14bobo38bo3bo8341bo3bo427bo4bo8bo$13b3o4boo4bo29b3o8164bo178b3o19boobo boo401boo5b3o$4boo6b3o4bobboobobo28b3o8163b3o199bo5bo410bo$4boo7b3o4b 3obo3bo9boo33boo8147boboo94b3o102bo3bo429b3o$14bobo4boobo3bo9boo33bo 8149b3o93bobbo6bo34b3o59b3o406bo23bo$15boo6boo3bo35boo5bobo8149b3o96bo 4boo35bo468booboo22bo$25bobo35b3o5boo8150boo93bo3bo5boo35bo9bo$26bo33b oboo8258bo51bobo455bo5bo$60bobbo8255bobo40bobo8boboo25boo$37boo6boo13b oboo8298bobbo6booboo10boo13boo428booboboo$36bobbo4bobbo15b3o8287boo10b oo6boboo10boo478boo9boo$35b6obb6o15boo8279boo6boo8bo3boo5bobo490bobo7b obo$36bobbo4bobbo8297boo11boo5boo8bo51boo432bo5bo8bo6boo$37boo6boo 8310bo4bobbo61boo431bobo13bobbobbobboboo$8331bo30bobo453boo16boo15boo 4boboo13bo6boobboo$8330boo487bo33boo3booboo14bobo$8330bobo486bobo7boo 28boboo15boo$8820boo7boo29bobo$8826boo33bo$8825b3o12boo$63b3o8760boo 11bobo4boo6boo12bobbo$65bo6bo8272b3o481boo9bo4bobbo4bobbo14bo$64bo6bob o8270bo3bo480boo14bobbo4bobbo10bo4bo$70bo3boo3boo8262bo5bo495bobbo4bo bbo10boobbobo$70bo3boo3boo8262bo5bo496boo6boo16boboo$70bo3boo8258bo11b o397bobo$60boo9bobo8259boo9bo3bo393bo3bo163bo$59bobo10bo8260bobo9b3o 387boo5bo129bobbo31b4o$59bo8286bo388boo4bo4bo125boo32b4o16bo$58boo 8682bo156boo5bobbo8boo5bobo$8348boo392bo3bo7boo143boo5b4o14bo3boo3boo$ 8124bobo214b3o4bo395bobo7bobo150b4o3boobobo4bo3boo3boo$8124bobbo215bo 5b3o404bo153bobbo3boo5bo3boo$8109bo6bo10boo213bo8bo404boo132bo23bo10bo bo$8108bobo5bo8bo3boo4boo751bobo23bobbo8bo$8101boo4boboo6bo9boo6boo 738boo3boo7boo$8101boo3booboo9boobbobbo749b3o$8107boboo5b3obbobbobo 749bo3bo11boo$8108bobo7b4o755bobo11bobbo10boo$8109bo9boo195boo46boo 512bo12bobbo13boo$8316boo31bo14boo506bo18bo11boo4bo$8208b3o137boo522b 3o5boo9bo5bo5boo3bo$8207bobbo128bobbo5bobo524bo4bo9boo5bo3bo6bo$8122b oo3bo82bo126b3obb3o529boo5b3o6boobboobo3b3o$8123boo3boo76bo3bo125bo8bo 537bo19boobo$8122bo4boo81bo104b3o18boo6boo559bo$8207bobo105b3o8b3o548b o$8109boo203bo3bo9bo548bo$8107bobbo216bo37bo510bobo$8098boo6bo7b3o3bo 192boo3boo37boo5b3o508booboo$8098boo6bo6bo3b5o235boo4b5o506bo5bo$8106b o7bo3booboo201b3o6b3o26boo3boo508bo$8107bobbo3bo3boob3o200bo7bo3bo7boo 3boo523boo3boo40boo$8109boo5b4oboo196boo4bo5bo5bo7b5o3boo554b3obbo5bo 3bo$8118b4o8boo186bobo10booboboo7booboo4boo6boo541bo3bo9bo5bo$8120bo9b obo187bo24booboo3bo7bo515bo25bobo4bo8bo3boboobboo$8132bo213b3o15bo495b oo16boo15boo4boo16bo5bo3boo$8132boo197bo29bobbo496bo33boo4boo17bo3bo$ 8320bo10boo28booboo495bobo7boo7bo20boo18boo$8132boo229boo497boo6bobo4b obo23bobo$8132bo197boobo535b3o5bo14boo11bo$8122bobo5bobo197boobbo13b3o 517b3o11boo6bo4bo$8121bobbo5boo199b4o13b3o9boo3boo428bo73b3o9bobo5bo6b o$8111bo8boo195b3o27bo3bo8boo3boo427bobo73bobo9bo5bo8bo12b4o$8110bobo 5boo3bo192bo3bo25bo5bo8b5o416boo10boobo73boo15bo8bo11bo4bo$8110boobo6b oo193bo5bo7boo3boo11bo3bo10bobo417boo10booboo89bo8bo11bo3bobo$8098boo 10booboo6bobbo190bo5bo10bo15b3o443boobo91bo6bo13bo3bobo$8098boo10boobo 8bobo193bo10bo5bo26b3o429bobo4boo87bo4bo20bo$8110bobo203bo3bo9booboo 460bo5bobo88boo22bo35boo$8111bo9bo195b3o11bobo469bo109bobbo34b3o$8122b o195bo13bo470boo109boo32boboo15bo$8120b3o85b3o121bo608boo5bobbo8b3o4bo bo$8207bobbo730boo5boboo16bobo4boo$8125b3o82bo106boo44boo564b3o19b3obb oobbo7bobbo3boo$8127bo78bo3bo106boo44boo564bo22boobbo3bo7bobo$8126bo 83bo706booboboo6bo26bobbo6bobo$8207bobo121boo16boo606boo8bo$8112boo 217boo16boo566bo5bo$8112boo4bo$8109boo6b5oboo793booboo$8101boo5b3o5bo bboo4bo794bo28bo$8101boo6boo5boo8bo8boo217bo594bobo$8112boo4bo7bo8boo 216b4o557bo28boo4boo$8112boo12bo225boob4o5boo548b3o5boo13bobobbobbo$ 8125bo215boo8b3oboo3bo3bobbo549bo4bo14bo7bo$8123boo216boo9booboo3bo7bo 6boo539boo5b3o11bo7bo$8353b5o3bo6bo6boo548bo$8354bo3b3o7bo570b3obobbo$ 8364bobbo578bo$8364boo553bo24bo$8918b3o24bo$8352bo565b3o$8350boo$8351b oo563boo3boo$8382boo532boo3boo29bobbo8bo$8382boo568bo10bobo$8948bobbo 3boo5bo3boo$8383bo535bo25b4o3boobobo4bo3boo3boo$8382bobo517boo14bobo 16boo5b4o14bo3boo3boo$8343bobo36bobo452boo64bo14bobo16boo5bobbo8boo5bo bo$8343boo38bo451bo3bo63bobo8bo5bo23b4o16bo$8344bo76boo406boo3bo5bo63b oo7boo5bo24b4o$8421boo406boobboobo3bo71boo6bo27bo$8380booboboo447bo5bo 70b3o10bo$8380bo5bo35bo412bo3bo8boo62boo4boo4bo7b6o$8136boo243bo3bo35b obo413boo9bobo62boo9bo6bo6bo16boo$8134bobbo199bo44b3o18boo11boobbobbo 426bo63bo15bo8bo11boobo$8335boo66bo12boobo430boo79bo6bo12boobbobbo$ 8133bo202boo56boo5bobo16boo510b6o18bobo$8393b3o5boo8bo545bo$8134boo 254boboo17bobo580boo$8136bo253bobbo20boo540boo34bobbo$8390boboo20boo 540boo33bo15bobo$8393b3o18boo567boo6bo10b3obbo3bo$8133boo3boo188bobo 16bo46boo6boo7bobo569boo6bo19bo5boo$8133boo3boo188boo15b4o52bobo7bo 580bobbobboo7bo4bo4boo$8134b5o22bo167bo14boboboo14boo15b3o17bo557boo3b oo28boobbobbobo7bo$8135bobo21b3o177boobbobbob3o11bobbo7bo26boo560bo36b 3o5bo3bo$8158bo180boo3boboboo11bo7boo3bo39bo544bo5bo41bobo$8135b3o20b oo185b4o12bo6bo5bo38bo546booboo$8347bo5bo7bo7b5o39b3o545bobo$8126bobo 27bo165bo29bo9bobbo596bo16boo$8126bobbo25b3o162boo30b3o9boo14bo581bo 15bobbo$8117boo10boo23bo3bo35boo125boo56b3o597boo10bo$8117boo8bo3boo 20bob3obo34boo154boo26booboo573bo$8122boo5boo23b5o35boo154bobo24b3ob3o 572b3o5boo$8114boo5bo4bobbo65bo154bo26b3ob3o575bo4bo$8114boo10bobo65bo bo180b3ob3o15bo5bo552boo5b3o$8176boo11b3obobo149bo31b3ob3o15bo4b3o560b o$8176bo12b4obo118bobo29bobo30booboo4boo10bo3b4o$8114bo53bo5bobo16bo 119boo30boo11boo8bo10b3o5boo13bo584boo$8113b3o51boo5boo6boo130bo43bobb o6bobo9bo21boo3boo578bobo$8112bo3bo49boo14boo169boobbo3bo7bobo35boo 552bo25bo$8075boo37bo50b3o17boo147boo16b3obboobbo7bobbo41boo544b3o$ 8073bobbo34bo5bo48boo3boo12b3o120boo24bo14boboo16bobo42boo543b5o$8111b o5bo49boo16boo121boo11boo9bobo14bobbo8b3o4bobo3boo16bobo8bo554bobobobo $8112bo3bo51bo6boo5boo135bo3bo8boo15boboo15bo5bobo16bo8boboo481boo69b oo3boo30boo8bo$8073boobo36b3o39bo18bobo5boo129boo3bo5bo19boo6b3o21bo 25bobo12bo468bobo106bobbo6bobo$8075bobobboo11boo59bobo17bo138boobboobo 3bo18bobo7boo21boo25bo12bo459boo7b3o4boo96boobbo3bo7bobo$8076bo4bo12bo 60boo16boo143bo5bo18bo40booboboo25bo459boo6b3o4bobbo66bo27b3obboobbo7b obbo3boo$8077bo16bobo5boo215bo3bo18boo49b3o489b3o4bo51boo14bobo16boo5b oboo16bobo4boo$8077bobbo6bo7boo5bobbo47bo167boo61bo5bo4bo490bobo7bo48b o14bobo16boo5bobbo8b3o4bobo$8084b4o18bo45bobo239bo17boo3boo468boo5boob o47bobo9bo3bo24boboo15bo$8083b4o19bo69b3o151bo11boo41booboo25bo481bo 48boo8b5o28b3o$8083bobbo19bo68bobbo151bobo10bo43bo24bo5bo478boo56boobo bo29boo$8083b4o15bobbo46b3o20booboo150boo5boo4bobo5bobo59booboo536b3ob obbo4bo$8084b4o6boo6boo48b3o23boo156boo6boo3bo3bo60bobo538boobobo5bo 27bobbo$8087bo6bobo18bo37bo24b3o157bo10bo19bo19bo25bo540b4o6bo7bo4bo 17bo$8096bo17bobo61bo142bo26bo4bo14b4o16bobo24bo541bo14boob4oboo11bo4b o$8096boo16boo63b3o138bo28bo12bo4boobobo14bo3bo582bo4bo13boobbobo$ 8153bo25boo139b3o26bo3bo3boboo5b3obobbobboo9b5o606boboo$8093bo58b3o5b oo189bobobbob4o5boobobo3boo8boo3boo$8092bobo57b3o4bobbo9boo182boobboo 6b4o15b5o21bo622boo$8092bobbo63bo12boo195bo18b3o21b3o583bobbobboo29bob o$8095bo63bo229bo21bo3bo582boo34bo13bobo$8094boo20b3o33bobo4bobo25boo 221bob3obo608boo7bobbo6boobbobbo$8094boo20bobo34bo5bobo13boo10boo222b 5o609boo7bo8bobo5boo6boo$8090b4o22b3o41bo14bobo857bobo3bo3bo3bo3boo4b oo$8088boo3bo22b3o56bo12bo126bo685boo3boo28boobboob3o5boo$8088bo4bo22b 3o68bobo125bobo683boo3boo35boo3bobbo$8089b3o24b3o38boo3boo23bobo117bo 7boo35boo694bobo$8109boo5bobo38bo5bo13boo9bo117b3o42boo10bobo637b3o$ 8097boo10boo5b3o58boo126boobo44bo8bobbo4bo632b3o$8097boo59bo3bobboo 138b3o40boo11boo5boo18boo614bo29bo$8159b3o4boo17booboboo113b3o40bobo8b oo3bo8boo13boo644bobo$8082boo11bo16bo52bo19bo5bo114boo31boobboo6bo9boo 10boo659boo$8081bobo11boo14bo74bo3bo140boo6boobobbobbobbo10bobbo632bo 25bo$8080b3o11bobo14bo71bo3b3o141boo10boo6bo11bobo47boo583b3o5boo15bob oobo$8080boo100boo164bobo62boo586bo4bo15bo4bobo$8080boo100bobo163boo 650boo5b3o13bobobobo$8081bobo23boo3boo895bo14bo3bo$8082bo9boo16bo51bo 154b3o$8092boo9boobbo5bo46booboo152bo$8103bobobbooboo205bo613boo95b3o$ 8079boo3boo17bo5bobo47bo5bo766b3o94bo$8079boo3boo24bo75bo736boo9boobo 65bo26bo$8110bo48booboboo20bo736bo5bo4bobbo64b3o$8081b3o3b3o95bobo141b oo3boo592bo5boobo63b5o$8081b3o5bo94booboo735bo3bo3b3o7boo56boo3boo38bo bo$8082bo5bo94bo5bo140bo3bo591bo5boo8bobo92b3o5bo3bo$8108bo77bo144b3o 610bo87boobbobbobo7bo$8107b3o73boo3boo141b3o610boo84bobbobboo7bo4bo4b oo$8106bo3bo209b3o663boo14b3o16boo6bo19bo5boo$8105bob3obo208bo666bo14b 3o16boo6bo10b3obbo3bo$8106b5o74bo135bo665bobo9bo29bo15bobo$8083b3o75b oo22bo148boo652boo8bobo29bobbo$8083b3o75boo21bo149bo663boobo30boo$ 8082bo3bo239boo7b3o660booboo5bo$8327boo8bo660boobo6bo$8081boo3boo98boo 138bo671bobo7bo3bobboo4boobbo10b4o$8186boo811bo11bo3b3obb3o3bo8bo4bo$ 9012bobboo4boobbo9bo3bobo$9036bo3bobo$9042bo$8302boo46boo690bo3bo32boo $8108boo192boo46boo687bobbobbobo30bo$8108boo930boo5bo29bo12boo$8325bo bbo6b3o708bo20boo8bo7bo4boo$8323b3obb3o4bo731boo8bo8boo5boo6boo$8083b oo237bo8bo4bo741bo4boobbo5b3o5boo$8083boo237boo6boo711boo3boo29boob5o 6boo$8302bo740bobobobo35bo4boo$8301b3o7boo731b5o41boo$8301b3o8boo731b 3o$8311bo31boo701bo30bo$8299boo3boo37boo731bo$8299boo3boo24boo3boo11b oo3boo721b3o$8312boo16bobobobo13b3o720boo$8311boo18b5o13bo3bo686bo16bo 15boo$8304boo7bo4b5o9b3o3boo10bobo687b3o5boo7bo$8304bobo10bob3obo9bo3b obo11bo627bobo61bo4bo8bo$8306boo10bo3bo16bo637bo3bo60boo5b3o$8305boo 12b3o26b3o619boo5bo73bo$8305boo13bo27b3o619boo4bo4bo$8301b3o14boo657bo $8317bobo657bo3bo7boo81boo$8317bobo659bobo7bobo80bobo$8318bo27boo3boo 638bo80bo$8334b3o10b5o639boo52bo$8301boo3boo25booboo10b3o693b3o$8315b ooboboo11booboo11bo693b5o38bobo$8302bo3bo8bo5bo11b5o704boo3boo32boo3bo bbo$8303b3o10bo3bo11boo3boo704b5o26boobboob3o5boo$8303b3o11b3o723bo3bo 25bobo3bo3bo3bo3boo4boo$9028boo14bobo16boo7bo8bobo5boo6boo$9029bo15bo 17boo7bobbo6boobbobbo$9029bobo7bo32bo13bobo$8333boo695boo7bobo31bobo$ 8303boo44boo691boo30boo$8303boo44boo691boo6bo$9042boo6bo$8317boo16boo 702bobo8bo4bobboboobobbo$8317boo16boo702bo14boobbo4bobboo$9055bobboboo bobbo3$8336boo$8329b3o4boo$8328b5o6boo10bo$8327bobo3bo5b3o7bobo$8327b oo3bo6boo6boo12boo$8336boo9boo12boo$8336boo9boo$8349bobo$8339bo11bo$ 8339bobo$8339boo$9030bo$9029bobo$8368boo647boo10boobo$8368boo647boo10b ooboo$8332bo696boobo$8331bo697bobo4boo$8331b3o696bo5bobo$9038bo$9038b oo$8368b3o36boo650boo6boo$8367booboo35bobo647bo4bobbo4bo$8367booboo36b 3o629bobo14bo4bobbo4bo$8324bo42b5o37boo629bobbo13bo4bobbo4bo$8324bobo 39boo3boo34bobo621boo10boo7b3o4boo6boo$8324boo63boo11boobbobo622boo8bo 3boo$8389bo12bobobbo628boo5boo34bo$8382bo4bobo13b4o628bo4bobbo34b4o$ 8381bobo3boo6bo8boo634bobo34boob4o5boo$8381boobo10boo669boo8b3oboo3bo 3bobbo$8317bo63booboo5boo3boo650bo17boo9booboo3bo7bo6boo$8316bo64boobo 11b3o648bobo28b5o3bo6bo6boo$8316b3o62bobo12boo648bo3bo28bo3b3o7bo$ 8336boo44bo5boo5boo650b3o39bobbo$8336boo30bo18bobo5bo649boo3boo37boo$ 8333boo10bo4bo17bo18bo$8325boo5b3o10bo4bobo15bo17boo689bo$8325boo6boo 10bo7boo4boo714boo$8309bo26boobboo11boo4boo5bo703bo5boo$8309bobo24boo bbobboo8boo11bo702b3o$8309boo30b4o5bobo12b3o699b3oboo$8342bo7bo38bo 682boo$8389bo664bo16boo$8365b3o21bo655boo5b3o17bo3boo$8366bo679bo4bo 16bobbo4boo$8302bo30bobo3bo26bo676b3o5boo15boobboo3b3o$8301bo31boo3boo 26bo676bo30bobo3bo$8301b3o30bo3bobo25bo704bobbo4bo$8365b3o5boo697bo6b 3o$8351boo20boo699boo4boo$8351bobo726bobo$8341bo4boo6bo10b3o$8320boo 18bobobbobbobbobbo11bo6bo26boo646b3o42boo$8294boo24bo19boobob3o6bo11bo 5b3o10bo14boo645bo3bo41bobo$8293bobo14boo6bobo19booboo6bobo6boo9bo3bo 9boo659bo5bo30bo4boo6bo$8309b3o6boo20boobo7boo7bobo10bo10bobo659bo5bo 29bobobbobbobbobbo7boo$8299boo5boboo20boo8bobo19bo7bo5bo672bo20boo10b oobob3o6bo7boo$8294bo4boo5bobbo19bobo9bo20boo6bo5bo23b3o644bo3bo18boo 10booboo6bobo$8293bobo10boboo19bo41bo3bo24b3o640boobb4o31boobo7boo$ 8293bobo13b3o16boo42b3o24bo3bo639boo4bo32bobo$8310boo6bobo77bo5bo678bo $8318boo57boo20bo3bo$8319bo8boo48boo20b3o640b3o$8329bo47bo660boobboboo $8329bobo8boo696boobboo$8310bo19boo7bo57bo644boo$8308boo15boo11bo12boo 43boo$8309boo14bobo10bo7bo4boo43bobo$8325bo12bo8boo5boo$8339bo4boobbo 5b3o5boo11bo$8340boob5o6boo6boo10b3o$8346bo4boo21b3o$8351boo$8372boo3b oo$8338bo33boo3boo20bo$8303bobo31bo60b3o$8303boo34bo57b5o$8304bo30bo 39bo20bobobobo$8335bobo36bobo19boo3boo$8376boo$8295bo44bobbo8bo23boo$ 8293boo45bo10bobo21b3o21bo$8294boo40bobbo3boo5bo3boo18bobo21bobo$8333b 4o3boobobo4bo3boo3boo13boo22bobo$8325boo5b4o14bo3boo3boo38bo$8293bo23b oo6boo5bobbo8boo5bobo45boo$8293boo22boo13b4o16bo46boo$8294boo37b4o62b oo$8294boo40bo$8294bo22b3o$8295bo21b3o$$8306boo$8305boo$8307bo7boo3boo $8316b5o$8317b3o$8318bo6$8309boo$8308boo10boo$8310bo9bo$8321b3o$8323bo $8310boo$8309bobo$8311bo3$8288boo46boo$8288boo46boo$$8311bobbo22bo$ 8309b3obb3o19bobo$8308bo8bo6boo10bobo$8308boo6boo5boo12bo$8325bo$$ 8319bo14booboboo$8295boo20booboo7boo3bo5bo$8294bobo32boo4bo3bo$8285boo 3boo4bo6boo3boo6bo5bo13b3o$8287b3o13bobobobo$8286bo3bo13b5o7booboboo9b o$8287bobo10boo3b3o$8288bo11bobo3bo$8300bo21boo$8289b3o29bobo$8289b3o 30bo$8321boo12bo$8321b3o11bo$8322boo10bobo$8287boo3boo26bo12booboo$ 8288b5o10b3o26bo5bo$8289b3o10booboo28bo$8290bo11booboo25boo3boo$8302b 5o14bo$8301boo3boo12b3o$8319b5o10bo$8318boo3boo9bo$8319b5o9bo$8319bo3b o$8305boo13bobo$8289boo30bo13boo$8289boo44boo$$8303boo16boo$8303boo16b oo4$8321boo$8319bo3bo$8318bo5bo13boo$8313boobboobo3bo13boo$8313boo3bo 5bo10boo6bo3boo$8319bo3bo10b3o5bo3bobo$8321boo12boo6b5o$8326bobo9boo4b 3o$8326boo10boo$8327bo4$8354boo$8320bo33boo$8318boo$8319boo4$8393boo$ 8355bo37bobbo$8311bobo40b3o$8311boo40b5o$8312bo39bobobobo34boboo$8352b oo3boo16boo11boobbobo$8375bo12bo4bo$8364bobo6bobo16bo$8344boo18bobbo5b oo6bo7bobbo$8305bo37boo22boo10bobo$8303boo40bo10boo3bo3bo3boo7bobo$ 8304boo54bo6boo8bobbo$8357bobbo3bobbo10bobo$8323boo33bo5bobo7boo3bobo$ 8322bo50bobo5bo7bo$8321bo12boo37bo15bobo$8311boo8bo7bo4boo36boo15boo$ 8296bobo12boo8bo8boo5boo6boo$8296boo24bo4boobbo5b3o5boo$8297bo25boob5o 6boo$8329bo4boo$8334boo15b3o$8350bo3bo$8321bo27bo5bo$8290bo29bo$8288b oo30b3o25bo7bo$8289boo57bo7bo$8325b3o43bo$8325bo23bo5bo3boo9boboo$ 8326bo9bo13bo3bo4boo9boboo$8335bobo13b3o13boo5boo$8323bobo8boboo28b7ob oboo$8281bobo22boo15bobbo6booboo27bo3bo6bo9boo$8281boo23bo19boo6boboo 28boo3bo3boobo7boo$8282bo14bo6bobo17bo3boo5bobo8boo10b3o5b3o9boo$8296b oo6boo20boo8bo9bobo9b3o7boo5bo3bo$8279bo5boo8boo4boo13boo5bobbo21bo8bo 3bo8boo6bo$8278b3o4boo7b3o4boo12bobo5bobo22boo17b5o5bo$8278boboo13boo 4boo3bo8bo40boo3boo4b5o$8279b3o14boo7bo8boo53boo15b3o$8279b3o15bo7b3o 61boo14booboo$8279boo104booboo$8314boo46boo21b5o$8315bo45bobo16boobboo 3boo$8296bo18bobo7bo37bo16boo$8296bobo17boo7bobo51bo$8296boo30boo6boo 46bo$8313bo14boo4bo3bo24bo18boobo$8312boo14boo3bo5bo45bo$8312bobo10bob o4boobo3bo8boo$8325bo7bo5bo8boo32boboo$8334bo3bo45bobbo$8336boo22b3o 22bobo$8291bo34bo32bo3bo$8290bo33boo32bo5bo$8290b3o32boo31bo5bo$8361bo $8321boo36bo3bo20b3o$8321boo37b3o20bo3bo$8281bo79bo20bo5bo$8281bobo51b o47bo3bo$8281boo45boobo3b4o45b3o$8322boobboobobo4b4o20boo22b3o$8321bob obbooboboo3bobbo5boo13boo$8311boo7b3o8boo3b4o5boo$8303boo6boo6b3o8boo 3b4o$8278b3o22boo15b3o12bo49boo$8321bobo61boo$8322boo$8281boo$8281bobo 20bo$8281bo21bobo$8302bo3bo$8293boo8b3o$8293bobo5boo3boo$8293bo9$8296b oo8boo$8296bobo7bo$8296bo10b3o$8309bo$$8295bo$8295boo$8294bobo$$8274b oo46boo$8272bobbo46boo$$8271bo25bobbo$8295b3obb3o$8272boo20bo8bo19bo$ 8274bo19boo6boo7boo9b3o$8311bobo7bo3bo$8291b3o17bo8bob3obo$8271boo3boo 13b3o27b5o$8271boo3boo12bo3bo$8272b5o3bo8bo5bo8b3o7boo$8273bobo4boo8bo 3bo8bo3bo5bobo$8279bobo9b3o21bo$8273b3o26bo5bo9b3o$8302boo3boo9bo$ 8288bo30bo$8287boo$8287bobo17boo$8276bo30bobo$8275bobo31bo$8274bo3bo 29boo$8275b3o27bo$8273boo3boo25bobbo11b3o$8305bo13bo3bo$8290bo27bo5bo$ 8289b3o26booboboo$8288b5o11booboboo$8287bobobobo$8287boo3boo10bo5bo10b o$8320bobo$8305booboo10bobo$8290bo16bo13bo$8289bobo$8275boo12bobo29boo $8275boo13bo30boo$8289boo$8289boo16boo$8289boo16boo4$8310boo$8309b3o$ 8306boboo15bo$8299boo5bobbo8b3o4bobo$8299boo5boboo16bobo4boo$8309b3obb oobbo7bobbo3boo$8310boobbo3bo7bobo$8315bobbo6bobo$8315boo8bo4$8307bo$ 8307bobo30boo$8307boo31boo5$8300bo$8299bo79boo$8299b3o77boo$8379boo$ 8338booboboo35bo$8379bobo$8338bo5bo16boo11b3obobo$8361bo12b4obo$8292bo 46booboo5bo9bobo16bo$8292bobo46bo6bobo8boo8boo$8292boo52boo3bo16bobo$ 8346boo3bo15bo5bobo$8346boo3bo15bobbo3boo$8348bobo16bo6boo$8300bo5boo 41bo10boo6bobo$8285bo12bo3bo3b3o50bobo7boo$8284bo17bo5boobo8bo38bo$ 8284b3o10bo5bo4bobbo6bobo37boo$8297boo9boobo5bobo11boo$8306b3o7bobbo 11boo$8306boo9bobo$8318bobo16b3o$8310bo9bo17bo22bo$8308boo28bo22bo$ 8309boo26b3o21bo$$8337b3o30bo$8337b3o29bo$$8337b3o5boo$8314boo9boo11bo 6boo$8313boo9bobo11bo$8308bo6bo7b3o11b3o$8292boo13bobo12b3o47boo$8292b o12boo3bo12b3o46boo$8280bobo7bobo12boo3bo13bobo5boo$8280bobbo6boo13boo 3bo14boo5bobo$8271boo10boo10bo6boo3bobo24bo$8271boo8bo3boo6boo6bobo4bo 25boo9bo7boo$8276boo5boo9boo5bo42b3o7boo6boo$8275bo4bobbo16boo41b5o5bo 8boo$8280bobo59boo3boo$8264b3o98bo$8263bobbo17bobo13boo62boo7bo$8266bo 17boo15bo45boo15bobo5b3o$8262bo3bo18bo15bobo5bo39bo21b5o$8266bo35boo5b oo35bo23boo3boo$8263bobo44boo13boo5bo13bobbo21b5o$8310b3o11b3o3bo3bo 10booboo21b5o$8305boo3boo9boboo5bo15boo23bobbo$8309boo10bobbo4bo5bo34b o3bo$8300b3o6bo11boboo9boo34bo$8280bo19bo12bo10b3o17boo3boo19boboo$ 8278boo21bo11bobo9boo17boo3boo20bo$8279boo32boo30b5o$8346bobo$8368boo 3boo$8346b3o19bo5bo$8269bobo35boo$8269boo36boo60bo3bo$8270bo99b3o$ 8319bo$8317b4o$8307bobo6boboboo24boo$8307bo3bo3bobbob3o8boo13boo$8268b o28boo12bo4boboboo9boo$8267boo20boo6boo8bo4bo4b4o$8266bobbo19boo20bo7b o51boo$8267boo38bo3bo59boo$8268bo38bobo3$8270bo$8269boo$8269bobo$8289b 3o$8282bo5bo3bo$8281boo4bo5bo$8281bobo3booboboo$8251bo$8250b3o$8249boo bo37bo$8249b3o37bobo$8249b3o37bobo$8250boo38b3o$8292boo$8292bo$8285bo 7b3o$8284boo9bo$8284bobo4$8278b3o$8260boo18bo27boo$8260boo17bo28boo$$ 8283bobbo$8281b3obb3o$8260bo19bo8bo$8259b3o18boo6boo$8258bo3bo$8257bob 3obo36bo8bo$8258b5o36boo7b3o$8299bobo5b5o$8277b3o26bobobobo$8276bo3bo 25boo3boo$8298bo$8263b3o9bo5bo6boo3boo3boo$8265bo9boo3boo15bobo6boo$ 8264bo24bo3bo12boo$8290b3o12bo$8275boo13b3o12b3o$8274bobo32bo$8274bo 30b5o$8274boo17bo13boo$8278bo13b3o$8261b3o11bobbo12bo3bo$8260bo3bo13bo 14bo10boo3boo$8236b3o20bo5bo24bo5bo8b5o$8236bobbo19booboboo24bo5bo8boo boo$8236bo36booboboo11bo3bo9booboo$8236bo3bo51b3o11b3o$8236bo25bo10bo 5bo$8237bobo21bobo$8261bobo10booboo$8262bo13bo$$8261boo44boo$8261boo 44boo$$8275boo16boo$8275boo16boo4$8297bo$8296boo$8295boo11boo$8285boo 7b3o7bo3b3o$8285boo8boo5b4o4boobo5boo$8296boobbo4bo4bobbo5boo$8297bobb o3bo5boobo$8301boboo3b3o$8308boo3$8294bobo$8294boo$8236b3o56bo30boo$ 8236bobbo85bobbo$8236bo91bo$8236bo3bo87bo$8236bo89bobo$8237bobo48bo37b obo$8286boo39bo$8223bo63boo76boo$8222b3o139bobbo$8222boboo98boo3boo36b o$8223b3o98bo5bo36bo$8223b3o135bo3bobo$8223boo100bo3bo17boo11bo3bobo$ 8279bobo44b3o18bo12bo4bo$8279boo57bo6bobo13b4o$8280bo54b4o6boo10bo$ 8334b4o18bobo$8334bobbo18boobo$8334b4o18booboo$8335b4o17boobo$8273bo 18bo45bo7boo8bobo$8271boo19boo32bo18bobo9bo$8272boo13boo4boo13boo15bob o17bo$8283boobboo4b3o11b3o16boo16boo14b3o$8283boobboo4boo9boboo9boo43b o$8292boo10bobbo4bo5bo42bo$8292bo11boboo5bo$8296bo10b3o3bo3bo6bo$8264b obo29bobo9boo5bo7b3o$8264boo30boo24b5o$8265bo5$8258bo72boo$8256boo43bo bbo8bo8b5o4boo14bo$8257boo42bo10bobo8b3o16boo3bo$8297bobbo3boo5bo3boo 7bo16bobb3o$8278boo14b4o3boobobo4bo3boo24boobobobo9boo$8278bo14b4o14bo 3boo25bobobobbo8boo$8266boo8bobo14bobbo8boo5bobo3boo24bo3bo$8266bobo7b oo3bo11b4o16bo4bobo26bo$8257boobboo6bo11bobo4boo4b4o22bo29boo$8257boob obbobbobbo11boo4bobo7bo22boo24boob3o$8261boo6bo17bo50boo6bo3boo$8266bo bo17boo49bobo6bobbo$8208b3o55boo4bo55boo3boo4bo7b3o$8207bobbo60bo58b3o $8210bo60b3o12boo41bo3bo22booboboo$8206bo3bo40bo35bo42bobo18b3o$8210bo 39b3o34bobo5bo35bo19bo4bo5bo$8207bobo39boobo35boo3bobo56bo$8249b3o40bo bo17bo19b3o22booboo$8249b3o39bobbo16boo19b3o24bo$8250boo40bobo15boo4b oo$8293bobo13b3o4boobboo$8266bo28bo4bobo7boo4boobboo35bo$8266bobo19boo 10boo9boo17boo3boo19bobo$8266boo19boo12bo10bo18b5o19bo3bo$8289bo42b3o 20b5o$8333bo20boo3boo$8257bo97b5o$8256bo99b3o$8256b3o34boo62bo$8293boo $$8306bobo$8304bo3bo$8292boo10bo27boo$8284bo7bobbo7bo4bo8boo13boo$ 8255boo26bo3boo7bo7bo12boo$8254bobbo17boo6bo5bo6bo7bo3bo$8254boo19boo 7b5o7bo9bobo48boo$8255bo36bobbo61boo$8256bo35boo$$8208b3o$8207bobbo$ 8210bo$8206bo3bo45b3o$8210bo45bo$8207bobo47bo$$8268b3o3b5o$8268bo4bob 3obo$8269bo4bo3bo$8275b3o$8276bo3$8278boo$8278bo$8279b3o$8281bo$8271b 3o$8271bo$8272bo3$8246boo15boo29boo$8246boo16boo28boo$8263bo$8269bobbo $8267b3obb3o$8266bo8bo$8246bo19boo6boo$8246bo$8245bobo$8244booboo$ 8243bo5bo3boo31b3o$8246bo6boo31bo7b3o$8243boo3boo4b3o17boo3boo6bo5bo3b o$8255boo7bo9boo3boo11bo5bo$8255bobo5b3o27bo3bo$8248b3o11b5o9b3o3b3o9b 3o$8248boboo9boo3boo8b3o5bo8bobbo$8250boo10b5o10bo5bo9b3o$8249boo11b5o 25boboo$8247bobo12bobbo26bobo$8245boobbo11bo3bo27bo$8261bo$8261boboo$ 8262bo15b3o9boo3boo$8278b3o9bobobobo$8277bo3bo9b5o$8246b5o8boo3boo26b 3o$8245bob3obo7bo5bo10boo3boo10bo$8246bo3bo$8247b3o10bo3bo$8248bo12b3o 4$8247boo44boo$8247boo44boo$$8261boo16boo$8261boo16boo4$8280bobo$8275b o4bobbo$8276boo5boo8bo$8271boo8bo3boo5bobo$8271boo10boo6boboo10boo$ 8280bobbo6booboo10boo$8280bobo8boboo$8292bobo$8283bo9bo$8282bo$8282b3o 6$8275bo$8275bobo$8275boo5$8268bo$8267bo$8267b3o6$8260bo50boo$8260bobo 48boo$8260boo49boo$8312bo$8311bobo$8311bobo$8312bo$8253bo96boo$8252bo 97boo$8252b3o54boo3boo34boo$8309bobobobo35bo$8310b5o35bobo$8311b3o18b oo11b3obobo$8312bo19bo12b4obo$8322bobo5bobo16bo$8245bo75bobbo5boo9bo$ 8245bobo72boo19bobo$8245boo71boo3bo18bobo$8320boo20bobbo$8321bobbo17bo bo$8277bo44bobo6boo8bobo$8276bobo32bo18bobo8bo$8274boo3bo14boo14bobo 17bo$8269boo3boo3bo13bobo15boo16boo$8269boo3boo3bo12b3o4boob3o$8243boo 31bobo12b3o4bobb4o$8243boo32bo6bo7b3o4boo$8282boo9bobo$8283boo9boo12b 3o21bo$8307bo3bo20bo$8281bo24bo5bo19bo6bo$8280boo55boobo$8280bobo22bo 7bo21b3o3bo$8305bo7bo21boobobo$8275bobo$8275boo29bo5bo3boo$8276bo12bo 7bo9bo3bo4boo10boo$8236b3o49b4o5bobo8b3o$8236bobbo43boobbobboo8boo26bo bbo$8236bo27boo17boobboo11boo29bo11boo$8236bo3bo23bo15boo10bo7boo27bo 13boo$8236bo14bo10bobo14b3o10bo4bobo4boo24bo$8237bobo9b4o9boo16boo10bo 4bo6bobo$8243boo3boboboo20boo7boo21bo$8243boobbobbob3o18bobo7boo21boo 37boo$8248boboboo19bo49bo9boo$8249b4o19boo39boo3boo3boo8boo$8251bo70bo bo$8314bo3bo$8260bobo9boo41b3o23boo3boo$8260boo11bo41b3o19boo3b5o$ 8261bo5boo4bobo7bo52boo4booboo$8267bobo4boo4b4o54bo3booboo$8267bo11b4o 16bo18bo24b3o$8252bo26bobbo8boo5bobo16b3o$8250boo27b4o14bo3boo13bo3bo$ 8251boo27b4o3boobobo4bo3boo3boo10bo$8283bobbo3boo5bo3boo3boo7bo5bo$ 8287bo10bobo14bo5bo19b3o$8287bobbo8bo16bo3bo20b3o$8317b3o20bo3bo$8339b o5bo$8340bo3bo$8341b3o$8245bobo$8245boo$8246bo35boo$8236b3o43bobo9boo 5bo$8236bobbo42bo10b3o3bo3bo$8236bo41bo11boboo5bo17boo$8236bo3bo37boo 10bobbo4bo5bo12boo$8236bo32boobboo4boo9boboo9boo$8237bobo21boo6boobboo 4b3o11b3o$8261boo10boo4boo13boo46boo$8278boo62boo$8278bo$$8248boo$ 8247boo$8249bo3$8259booboboo$$8259bo5bo$$8260booboo$8262bo$8251boo$ 8250boo$8252bo$8264boo$8264bo$8256boo7b3o$8255bobo9bo$8257bo5$8232boo 46boo$8232boo46boo$$8255bobbo7boo$8253b3obb3o4boo$8252bo8bo5bo$8252boo 6boo$$8231b3o7boo$8230bo3bo5bobo$8242bo30boo$8229bo5bo37boo3boo3boo$ 8229boo3boo24booboboo$8242boo16bo5bo12bo3bo$8242bobo16bo3bo14b3o$8234b oo6bo4boo3boo8b3o3bo11b3o$8234bobo12b3o16boo$8236bo11bo3bo14bobo$8235b oo12bobo27bo$8232bo17bo27b3o$8232bobbo41bo3bo$8232bo14b3o29bo$8247b3o 26bo5bo$8265bo10bo5bo$8231booboboo27bo11bo3bo$8264bobo11b3o$8231bo5bo 7boo3boo11booboo$8246b5o11bo5bo$8232booboo10b3o15bo$8234bo13bo13boo3b oo3$8264bo$8264bo$8233boo28bo15boo$8233boo44boo$$8247boo16boo$8247boo 16boo4$8267bo$8262bo4b4o$8262bo5b4o7bo$8257boo9bobbo6bobo$8257boo9b4o 4boo3bo9boo$8267b4o5boo3bo9boo$8267bo8boo3bo$8278bobo$8279bo$8268bobo$ 8268boo$8269bo$$8298boo$8298boo$$8262bo$8260boo$8261boo36bo$8298bobo$ 8297bo3bo35boo$8298b3o36boo$8296boo3boo$8338bo$8253bobo81bobo$8253boo 64boo11boobbobbo$8254bo64bo12boobo$8311boo3boobo16boo$8310bo3bo3bo6boo $8309bo15bobbo$8309bo3bobbo12bo$8247bo61bo5bo13bo$8245boo63bo3bo14bo$ 8246boo18bo44boo5boo5bobbo$8263b4o50bobo5boo$8262b4o16bo14b3o17bo$ 8255boo5bobbo8boo5bobo32boo13bo$8255boo5b4o14bo3boo3boo40bobo$8263b4o 3boobobo4bo3boo3boo40boo$8238bobo25bobbo3boo5bo3boo9b3o$8238boo30bo10b obo11b3o$8239bo30bobbo8bo13bo$8296bo$8296bo$8295bobo$8263bo3b3o$8232bo 29bo4bo47bo$8230boo30b3o3bo26bobo17bo$8231boo63bo6boo10bo$8281boo13bo 6boo5bo$8276bo4boo13bo6boo4bobo7b5o$8270boob5o6boo9b3o5bo4bobbo7booboo $8250boo17bo4boobbo5b3o8b3o4bobo3bobo7bobb3o6boo$8224boo24bo17bo8boo5b oo16bobobboo9b3o9boo$8224boo12bobo7bobo17bo7bo4boo7boo11bo4bobo7bobbo$ 8236bo3bo7boo18bo12boo7bobo17bo8boo$8229boo5bo23boo7bo22bo37b3o$8229b oo4bo4bo18bobo8boo20boo6boo3boo23b3o$8236bo22bo40bobobobo$8236bo3bo17b oo41b5o$8238bobo7bo53b3o3boo$8247bo55bo3bobo18boo3boo$8247b3o8boo49bo 19b5o$8259bo70b3o$8259bobo7boo60bo$8255bo4boo6bobo54boo$8238bo15boo11b 3o12bo42boo$8238bobo13bobo9b3o8boo3b4o39bo$8238boo27b3o8boo3b4o$8268bo bobbooboboo3bobbo5boo10b3o$8269boobboobobo4b4o5boo9booboo$8275boobo3b 4o17booboo$8282bo20b5o$8302boo3boo19b3o$$8233bo94bobo$8232bo94b5o$ 8232b3o91boo3boo$8306boo18boo3boo$$8270bo10bo$8223bo45boo9boo47bo$ 8223bobo38bo4bobo7boo4boo17boo21boo$8223boo37bobo13b3o4boobboo13boo$ 8223boo30boo4bobo15boo4boobboo35bo$8223boo22boo6boo3bobbo16boo$8223bo 22bobbo11bobo17bo45bobbo$8249bo12bobo64boo$8249bo14bo$8247bobo$8247bob o$8235boo11bo$8235bobo$8235bo$8245boo3boo$8245bo5bo$$8246bo3bo$8247b3o 4$8238boo$8238bobo$8238bo11boo$8250bo$8251b3o$8241bo11bo$8241boo$8240b obo4$8218boo46boo$8218boo46bobo$8267b3o$8241bobbo23boo$8239b3obb3o6boo 13boo$8238bo8bo5bobo10bobo$8238boo6boo5bo13bo$$8249bo$8226bo21b3o13boo 3boo$8218bo7boo19bo3bo7boo3boo3boo$8217b3o5bobo18bob3obo6boo$8216b5o 12boo3boo7b5o14b3o$8215boo3boo11boo3boo26b3o$8216b5o9bo3b5o28bo$8216b 5o8boo4bobo$8217bobbo8bobo$8217bo3bo13b3o14b3o$8221bo32bo$8218boobo31b o$8220bo43b3o$8264b3o$8234bo28bo3bo$8217boo3boo9bobo$8217bo5bo8bo3bo 25boo3boo$8233b3o$8218bo3bo8boo3boo12b3o$8219b3o27bo3bo$8248bo5bo$ 8248booboboo3$8251bo$8250bobo$8219boo29bobo12boo$8219boo30bo13boo$$ 8233boo16boo$8233boo16boo$$8224bobo$8219bo4bobbo$8220boo5boo8bo$8215b oo8bo3boo5bobo$8215boo10boo6boboo10boo$8224bobbo6booboo10boo$8224bobo 8boboo$8236bobo$8227bo9bo$8226bo$8226b3o$8235boo$8235boo4$8219bo$8219b obo$8219boo53boo$8274boo3$8235b3o36b3o$8212bo21bo3bo17boo11boobboboo$ 8211bo21bo5bo16bo12boobboo$8211b3o20bo3bo6boo7bobo16boo$8235b3o7bobo6b oo8boo$8235b3obboo6bo14b3o$8239bobbobbobbo11boboo$8208b3o29boo6bo11bo bbo6bo$8207bobbo34bobo12boboo6bo$8210bo34boo8boo6b3o3boboo$8206bo3bo 24bo18bobo7boo5b3o$8210bo24bo18bo$8207bobo25bo17boo17boo$$8233bo$8233b o$$8233bo$8232bobo$$8232b3o3$8232b3o$8240boo9bo$8232bobo5boo9boo$8233b o18boo$8252bo$8233bo13b3o7boo8boo$8233bo15bo7bobo7boo$8198boo29boo20bo 6b3o$8198boo29boo9bo8bobbo5bobo$8229boo8b3o6bo3bobbobobbo$8230bo8b3o7b obo3b3oboo$8229bobo17b3o$8229bobo5boo3boo11bo$8230bo6boo3boo10boo3bo8b o$8208b3o43bo12b3o$8207bobbo45bobobbo4b5o$8210bo16boo3boo8boo12bobo3bo bbobobobo$8206bo3bo16bobobobo8bobo12boobbo3boo3boo$8210bo17b5o11boo12b 3o$8196b5o6bobo19b3o11boo$8195bob3obo28bo12boo20boo$8196bo3bo38b3o23b oo$8197b3o64bo$8198bo65b3o$8268bo$8264b5o$8239boo3boo20boo$8196bo30bob o$8196bo30boo11bo3bo$8195bobo5bo24bo12b3o19boo3boo$8194booboobbobo37b 3o20b5o$8193bo5bobboo60booboo$8196bo34b3o30booboo$8193boo3boo30bo3bo 30b3o$8221bo7bo5bo$8219boo9bo3bo6boo$8197bo16b3o3boo9b3o7boo$8197bo16b o16b3o$8198bo16bo$8266boo$8266boo$8195boo4bobboo4boobbo17boo$8195boo3b o3b3obb3o3bo16boo$8201bobboo4boobbo7boo$8222bobo$8222bo11bo$8232bobo$ 8219boo9boo$8212b3o4boo9boo12boo$8211b5o6boo6boo12boo$8210bobo3bo5b3o 7bobo$8210boo3bo6boo10bo$8219boo$8219boo3$8130boo$8128bo4bo$8127bo$ 8127bo5bo$8127b6o16$8143b3o$8143bobbo$8143bo$8143bo$8144bobo! golly-2.5-src/Patterns/Life/Signal-Circuitry/p30-racetrack.rle0000644000175100001440000001111112156145314021120 00000000000000#C A very long period oscillator: 1800 generations. In more humorous #C moments, known as the glider racetrack. Sometimes you're a glider, #C sometimes a spaceship, and sometimes just a hole #C -- David Goodenough #C #C This uses several reactions: #C #C The glider starts travelling SW, and enters a three-glider->LWSS #C synthesis found by David Buckingham. There are two parallel streams #C of gliders moving in opposite directions, a NW P30 and and a SE #C P60. When idling, these fall into eaters, but when *THE* glider #C arrives, a single instance of the synthesis takes place, sending a #C LWSS west. The gun firing SE has to be P60 to let the LWSS escape. #C #C Next, the LWSS hits a glider going NE from another P60 gun, and is #C converted back into a glider going SE. I'm not sure who this #C reaction is due to. #C #C Next, the kickback reaction with a NE stream from a P30 gun is used #C to turn the glider around so it's going NW, and send it back #C through the stream from the P60. As far as the LWSS + glider to #C glider synthesis goes, a P30 gun would be OK. However, since you #C can't get a glider back through a P30 stream without a crash, I #C need a P60 stream to let the glider back through. #C #C Now it goes to a shuttle that turns it NE, and then it hits a #C stream of SE gliders from a P30 gun. When it hits the stream, it #C destroys exactly one glider in the stream, creating a hole. When #C idling, the stream hits another shuttle that turns it NW, and then #C runs into what would be a P30 gun, except that the inbound stream #C keeps it permanently turned off. This is part of the switchable P30 #C LWSS gun found by David I. Bell, AKA an in-line NOT gate for glider #C guns. When the hole arrives, it allows a single glider to escape #C NE, which is promptly turned SE by another shuttle. #C #C The glider then runs into the westbound output of a P120 LWSS gun, #C in a reaction found by Dean Hickerson. It undergoes the same #C glider+LWSS->glider reaction, creating a glider going NE. This is #C then reversed to SW by the "ping" reaction with a PD, and at that #C point it's on its starting path. It continues SW, and once again #C enters the three glider LWSS synthesis, and thus the cycle repeats. #C #C David Goodenough, January 1995 x = 308, y = 176, rule = B3/S23 161boo$162bo$162bobo7bo$163boo5bobo$168boo71b3o$168boo12boo56bo3bo$ 168boo12boo55bo5bo$170bobo$172bo65bo7bo$238bo7bo$$239bo5bo$240bo3bo$ 241b3o4$84bo$83bobo$66boo15boobo$66bobo14booboo3boo$61boo6bo13boobo4b oo$57boobobbobbobbo13bobo$57boobboo6bo8bo5bo$66bobo7bobo$66boo9boo5$ 85bo$86bo$84b3o40boo$127bobo8bo$118b3oboo4b3o6bo7bo$118b4obbo4b3o5boo 5bobo$122boo4b3o7bo4bo3boo3boo$127bobo13bo3boo3boo$93bo33boo14bo3boo$ 91bobo50bobo$92boo51bo$268bo$267bobo$266boboo15boo$131bo117boo9boo3boo boo14bobo$100bo30boo112b4o4boo5boo4boboo13bo6boo$101bo28bobo112b3oboo bboo12bobo13bobbobbobboboo$99b3o148bo17bo5bo8bo6boobboo$274bobo7bobo$ 274boo9boo$175bobbo56bobbo26bobbo$174bo59bo29bo$123boo49bo3bo55bo3bo 25bo3bo$108bo15boo48b4o56b4o26b4o$106bobo14bo155bo$107boo169boo$278bob o$159boobb3obboo81boo7boo$159bobb5obbo81bo9bo9bo$116bo43b9o83b9o10boo$ 116boo5bo33b3o9b3o77b3obb5obb3o6bobo$115bobo5bobo31bobbo7bobbo77bobbo bb3obbobbo$126boo4boo24boo9boo79boo9boo23boo9boo$126boo4boo151boo9bobo $126boo152bo6bo7b3o4boob3o$113boo8bobo126bo26bobo12b3o4bobb4o$112bobo 8bo126b4o6boobboo11boo3bo12b3o4boo$112bo131boo3boboboo5b4obobbobo6boo 3bo13bobo$111boo131boobbobbob3o5boobo3bo3bo4boo3bo14boo$249boboboo4bo 12bo6bobo$250b4o14bo4bo6bo$252bo19bo$268bo3bo$268bobo11$20boo$20boo4$ 19b3o$19b3o$18bo3bo$17bo5bo142bo$18bo3bo101bobo39bobo$19b3o101bobbo39b oo$114boo6boo10bo6bo$114boo4boo3bo8bo5bobo$122boo9bo6boobo$123bobbobb oo9booboo3boo$124bobobbobb3o5boobo4boo$107boo20b4o7bobo$109bo20boo9bo$ 96boo12bo8boo$17boo77boo4bo7bo8boo$18bo74boo5boo8bo$15b3o67boo5b3o5bo bboo4bo13bo$15bo69boo6boo6b5oboo12boo$96boo4bo19boo$96boo$$110bo$111bo $109b3o$114bobo$114boo$115bo3$64bo53bo$62b3o51bobo$61bo55boo$61boo49bo $112b3o$115bo$114boo$$117boo$116boo$118bo3$50boo$51boo$50bo74bo$124boo $124bobo6boo$133bo$134b3o$136bo$99bo$34boo61b3o$34bo61bo35boo$25bo6bob o61boo33boo$22b4o6boo99bo$13bo7b4o68boo$12bobo6bobbo67bobo50boo$11bo3b oo4b4o10boo57bo50bobbo$oo9bo3boo5b4o10boo97bo3b3o7bo6boo$oo9bo3boo8bo 9bo98b5o3bo6bo6boo$12bobo107boo9booboo3bo7bo$13bo108boo8b3oboo3bo3bobb o$22bobo108boob4o5boo$23boo60b3o46b4o$23bo63bo47bo$86bo$27boo$27boo$$ 14boo$13b3o3boobo55boo$3boo5boboo5bo3bobbo50bobo$3boo5bobbo4bo4bobboo 51bo$10boboo4b4o5boo8boo$13b3o3bo7b3o7boo$14boo11boo$26boo$26bo$59boo 9b3o$51bo7bobbo9bo$50bo3boo7bo7bo5bo$50bo5bo6bo12b4o$51b5o7bo11boobobo 3boo$59bobbo11b3obobbobboo$59boo14boobobo$76b4o$77bo! golly-2.5-src/Patterns/Life/Signal-Circuitry/p46racetrack.rle0000644000175100001440000002432012156145314021060 00000000000000#C P46 based glider racetrack -- in reality a P6072 oscillator. #C #C *THE* glider starts about in the center, heading NE. Two 90-degree #C rotations get it going SW, where it enters a "dual kickback" delay. #C This uses two kickbacks with a p92 stream and a p46 stream to #C delay the glider a bit. I had to use a p92 for the second stream, #C since the escaping glider couldn't get out past a p46 stream. #C I guess this is my own invention, since I don't remember seeing #C this idea used anywhere else. The delay can be made as large as you #C want by shifting one of the guns and its corresponding eater. Just #C be careful to keep it in sync. #C #C After another 90 degree turn, it slips through a p46 stream and is #C reflected by a reaction due to Bill Gosper and Dean Hickerson. #C It's the reflection that leaves a pond behind, except a p8 blocker #C deletes the pond. Note that since 8 divides 6072 exactly, this p8 #C has no effect on the total period of the oscillator. #C #C Now it hits the stream, killing a glider, and when the hole gets #C down to a second stream, it allows a single glider to escape. This #C one then falls down a ladder of three 90 degree turns, and enters #C a glider-to-MWSS converter, found by I don't know whom. This seems #C to be based on two guns, one p23 and one p46 gun. #C #C The MWSS makes a long eastward trek, and hits a MWSS-to-glider #C reverse conversion, found by either David Buckingham or Dean #C Hickerson. I plagarised it from the p15 gun from Dean Hickerson, #C but in the comments he attributes part of it to David Buckingham. #C So I don't know who originally came up with this. This has to use #C a P92 gun to seed it, since the reaction takes so long that a p46 #C gun would send another glider in before the reaction was complete, #C causing all sorts of havoc. #C #C After another 90-degree turn, it enters a reaction that converts #C the single glider to a pair. I don't know who found this one. One #C glider hits a p46 stream, creating a hole, while the other passes #C through and does a 90-degree turn. The "hole" hits another stream, #C letting one escape, and now we're back to a pair of gliders, one #C going NW, the other NE. #C #C The next reaction is my own discovery; it's a P23 switchable LWSS #C gun, inspired by David Bell's P30 switchable gun. The NW glider #C turns it on, the NE one turns it off. You can delay these as needed #C to let as many LWSS escape as you want: in this instance it's only #C turned on long enough to allow a single LWSS to escape. #C #C The LWSS gets turned south by another p46 shuttle, and eventually #C gets converted back to a NW glider by yet another p46. The glider #C enters a reaction that reflects by converting to a block, and then #C converting the block. Dean Hickerson found this one. Lastly, it #C gets turned 90 degrees, and is back where it started from. #C #C David Goodenough, February 1995 x = 571, y = 383, rule = B3/S23 490boo12boobbo4boo$490boo12boboo6boobbo$505bo6bo6bo3bo$505b3o4bo11bo 12boo$520boobbo12boo$505b3o4bo9boo$505bo6bo3bo3b3o$490boo12boboo5boo$ 490boo12boobbo4bobbo3b3o$513bo8boo$520boobbo12boo$514boo8bo12boo$478bo 40bo3bo$474boobbo39bo$466boo5bo5bo13boo$466boo4boobbobo14boo$473boo3bo $474b3o24bo$487boo3boo7bobo$474b3o9bobbobobbo6boo$473boo3bo6bo9bo$355b oo5boo102boo4boobbobo5boo9boo$355boo5boo102boo5bo5bo5bo9bo$474boobbo7b obbobobbo$478bo8boo3boo$$496b3o$496bo$490bo6bo$489bo$489b3o$$156bo$ 157bo3bo194bo5bo157bo$148boobboo8bo192bobo3bobo121bo34boo$148boobbo5b oobbo191bo3bobo3bo118boo33bob3o11boo$152bobo5boo21bo3b3o164bo3bobo3bo 119boo15boo19boo10boo$153boo3b3o21bobobb5o3boo157bo9bo135bo7boo11boo$ 182bo3boo3boobboo290boo10bobboo4bobo10bo$153boo3b3o22bobbo3boo163boo5b oo123boo10bobbo5bo$152bobo5boo22b3o3bo106bobbo177bo20bobo19bo$148boobb o5boobbo124b3o7bo180bobo19boo19boo$148boobboo8bo21b3o3bo82boo11bo4bo9b o176boo42boo10boo$157bo3bo21bobbo3boo81boo10bo5bo8boo55bo3bo138boo16bo b3o11boo$156bo25bo3boo3boobboo89bo8bo66boo135bobo18boo$165bo16bobobb5o 3boo90boo8boo54boo3bobo3bo122boo10bobbo17bo$165bobo15bo3b3o168bobo3bo 107bobo12boo10bobboo$165boo120boo8boo62b3o108boo26bo$286bo8bo57bobbo 116bo27boo$273boo10bo5bo8boo53boo$273boo11bo4bo9bo$287b3o7bo169bo9bo$ 297bobbo165bo11boo$466b3o$$464boo11bobo$154bo310bo4b3o$153bo308b3o7bo 10bo$153b3o306bo8bo10boo$51boo429bobo$51boo$77bobobboo381bo$62boo12bo 3bob3o4boo374boo$50boo10boo13bo6boo3boo373bobo21boo$50boobo24b5obo403b obo$53bo27b3o404bo$53bo8bobo3bobo$50bobbo10bo3bo12b3o375boo$51boo7bo 11bo5b5obo57bo315bobo$59bo3bo5bo3bo3bo6boo3boo51bobo315bo33boo$60bo11b o3bo3bob3o4boo51boo280b4o65boo$64bo3bo8bobobboo339boobbo14boo51bo$62bo bo3bobo351boobbo15boo$412boo9bobbo26boo$395boo14booboo8boo28boo$395boo 15bobbo37bo45b3o$412bobbo8boo73bo$413boo8bobbo73bo32bo$240boo180boobbo 15boo89bobboo$131bo109bo171boo8boobbo14boo3b3o67boo13bo5bo$130bo110bob o168bobbo8b4o21bo56bo10boo14bobobboo7boo$130b3o109boo151boo15bobbo32bo 56boo26bo3boo6b5o$395boo14booboo89bobo27b3o6bo4bo14boo$412boo130bobb3o 14boo$442bo92b3o6boobbo$442boo89bo3boo7boo$430bo10bobo67boo4boo14bobo bboo$428bobo80bobo3boo13bo5bo7boo$202boo48bo176boo80bo21bobboo6boobbo$ 202bo48boo280bo10bobb3o14boo$200bobo48bobo182boo106bo4bo14boo$119bo80b oo233bobo107b5o$119bobo69boo244bo79boo28boo$119boo71boo322boo$167bo3bo 16b5o246boo7boo68bo11bo$155boo9bo5bo15b4o247boo6bobboo11boo64bo$155boo 9bo38b3o14boo214bobbo4b6o11boo64b3o$166boo3bo16b4o13bo3bo12boo215boobo 5b4o$168b3o17b5o12bo4bo228boobo79b3o$192boo12bo3bo311bo$168b3o10bobo7b oo70boo92boo80boobo80bo$166boo3bo10boo22bo3bo51boo86b3o4boo80boobo5b4o 59bo$108bo46boo9bo15bo22bo4bo53bo85b3o71b3o9boob3o4b6o11boo45boo8boo$ 107bo47boo9bo5bo32bo3bo12boo125bo3bo72bo9bobobo6bobboo11boo31boo11b3ob o5bobbo$107b3o57bo3bo33b3o14boo125booboo71bo11b4o7boo46boo10boo8boob3o $349bo3bo50bo3bo29boo69boo8boobo$193bo156bobo39boo9bo5bo100bo10bo$192b 3o155bobo39boo15bo$191bobo157bo52bo3boo100bo$188boo10boo203b3o15boo14b oo68boo23boo$190boboo6bobo89boo128boo15boo55boo10boo13boo9bobo$192b3o 7bo72bo16bobo7boo101b3o15b5o68boo11b3obo9boo9bo$192b3o7boo70boo18bo7b oo100bo3boo14b4o82boo$265boo7bobo15b3o57booboo35boo15bo101bo$96bo115b oo41boo7bobo84bo5bo34boo9bo5bo14b4o122b3o14boo$96bobo113boo41boo6boobo 137bo3bo14b5o122bo3bo12boo$96boo166boo84bo7bo63boo15boo96bo12bo4bo$ 265bo26b3o55bobbobobbo64boo14boo79boo15boo12bo3bo$294bo7boo46b3o3b3o 161boo16boo$265bo26bobo7boo229boobboo12bo3bo$264boo26boo256bo4bo$36bo 218boo6boobo283bo3bo12boo$35boo218boo7bobo283b3o14boo$34b3obo9boo154bo bo58boo266boobboo$bbobbo27boo13boo155boo313boo16boo$5bo7b3o18boo49bo 119bo314boo15boo$bo9bo4bo18bo48bo452bo$boo8bo5bo66b3o263boo5boo$7bo8bo 18bo314boo5boo$4boo8boo18boo$33boo13boo$4boo8boo18b3obo9boo$7bo8bo18b oo$boo8bo5bo18bo$bo9bo4bo$5bo7b3o17bo$bbobbo28bo$32b3o38bo$73bobo439b oo$73boo146boo188boo5boo95bobo$221bobo187boo5boo84b3o8bo$223bo282bo$ 223boo280bo3$412bo5bo$411b3o3b3o$45bo364bobbooboobbo$43bobo16bo347bo3b obo3bo$44boo15bo350bobobobo$61b3o164bo297b3o$229bo3bo175booboo3booboo 71boo31bo$220boobboo8bo176bo7bo72bobo32bo$220boobbo5boobbo259bo$224bob o5boo$225boo3b3o$$225boo3b3o185bo$224bobo5boo183b3o$220boobbo5boobbo 12boo167bo3bo$220boobboo8bo12boo166bo5bo$229bo3bo181bo5bo116boo$228bo 187bo3bo117bobo$481b3o54bo18boo7b4o$416bo3bo62bo72bobbo6bo3bo$415bo5bo 60bo41boo29boobbo10bo$411boobbo5bo101b4o7boo20bobbo4boboobo$411boo3bo 3bo101bobobo6bobboo19bo6b3o$417b3o102boob3o4b6o$286bo131bo106boobo5b4o 19bo6b3o$286boo237boobo27bobbo4boboobo$285bobo267boobbo10bo$525boobo 27bobbo6bo3bo$525boobo5b4o19boo7b4o$470boo50boob3o4b6o$469bobo50bobobo 6bobboo$471bo51b4o7boo$166bo357boo$149boo15boo8boo$149boo16boo7boo89b oo$162boobboo99boo4b3o$273b3o$272bo3bo$272booboo$162boobboo104bo3bo$ 149boo16boo7boo95bobo$149boo15boo8boo95bobo182b3o$166bo107bo185bo$459b o4$269booboo$268bo5bo$$267bo7bo$267bobbobobbo$267b3o3b3o171boo$446bobo $448bo32boo5boo$481boo5boo4$129bo$124bo3bo$109boo12bo8boobboo129boo5b oo$109boo12bobboo5bobboo129boo5boo$124boo5bobo$125b3o3boo302b3o$405bo bbo28bo$125b3o3boo275bo7b3o17bo$124boo5bobo270bo9bo4bo$123bobboo5bobb oo266boo8bo5bo18bo41bo7bo$123bo8boobboo272bo8bo18boo40bobo5bobo$124bo 3bo278boo8boo18b3obo9boo30bo3bo$129bo306boo13boo27bobbo3bobbo$407boo8b oo18boo42bobo3bobo$410bo8bo18bo44booboo$404boo8bo5bo59booboobooboo$ 404bo9bo4bo18bo41boobbobobboo$408bo7b3o18boo42b3o3b3o$405bobbo27boo13b oo29bo5bo$437b3obo9boo$438boo$439bo50bo5bo$489b3o3b3o$488boobbobobboo$ 488booboobooboo$491booboo$489bobo3bobo$488bobbo3bobbo$491bo3bo$488bobo 5bobo$489bo7bo9$62bo$57bo3bo359boo5boo$42boo12bo8boobboo350boo5boo$42b oo12bobboo5bobboo$57boo5bobo422boo5boo$58b3o3boo423boo5boo$$58b3o3boo 356bo5bo$57boo5bobo354b3o3b3o$42boo12bobboo5bo353bobbooboobbo$42boo12b o8boo353bo3bobo3bo$57bo3bo360bobobobo$62bo$419booboo3booboo$421bo7bo5$ 428bo$427b3o$426bo3bo$425bo5bo$425bo5bo$426bo3bo$$426bo3bo$425bo5bo$ 361boo58boobbo5bo$361boo58boo3bo3bo$427b3o$428bo8$129bo$124bo3bo$109b oo12bo8boobboo$109boo12bobboo5bobboo223boo5boo$124boo5bobo227bobooboob o$27b3o3bo91b3o3boo229bobobobo$25b5obbobo12boo313bobobobo$24boo3boo3bo 12boo76b3o3boo228bo7bo$19boobobboo3bobbo90boo5bobo$oo12b3obboobbobbo3b 3o90bobboo5bobboo$oo13boo6bo99bo8boobboo$16b3o3boobbo3b3o91bo3bo234boo boo$17bo3bo3boo3bobbo95bo231bobbobobbo$24boo3boo3bo12boo312b3o3b3o$17b o3bo3b5obbobo12boo313bo5bo$16b3o3boo3b3o3bo$oo13boo6bo337boo5boo$oo12b 3obboobbo337boo5boo$19boobo$60b4o$44boo14bobboo6boo$44boo15bobboo5boo$ 36bo24bobbo$37bo24boo$35b3o8bo3bo$45bobobobo10boo$43boobbobobboo7bobbo $43boo7boo7bobboo5boo$43boobbobobboo6bobboo6boo$45bobobobo8b4o$46bo3bo $$40boo$39bobo468boo$41bo6bo461bo$46bobo459bobo$47boo459boo4$18boo32bo bo$16boobbo32boo446boo$16b6o31bo446bobo$16b4o15b3o464bo$28b3obbo4bo11b oo$30bobbo5bo10boo7bo$29bo8bo21bo$16b4o16boo20b3o$3boo11b6o$3boo11boo bbo15boo$18boo18bo$33bo5bo10boo$26boo5bo4bo11boo$35b3o3$55b3o$57bo11b oo$56bo12bo$70b3o$72bo$$39boobo$20boo12b3obboobbo$20boo13boo6bo434boo$ 36b3o3boo3b3o3bo423bobo$37bo3bo3b5obbobo12boo410bo$44boo3boo3bo12boo$ 37bo3bo3boo3bobbo$36b3o3boobbo3b3o$20boo13boo6bo$20boo12b3obboobbobbo 3b3o$39boobobboo3bobbo$44boo3boo3bo12boo417boo$45b5obbobo12boo417boo$ 47b3o3bo$476boo$464booboo7bo$463bo3bobo4bobo$463b3obo6boo$466boo$467b oo$483bo$444bo37bobbo$443boo36b5o10boo$429boo11b3obo33boob3o10boo$429b oo10boo19boo17boboo$442boo11boo7bo17boo$443bo10bobo4boobbo$456bo5bobbo 16boo$443bo19bobo15boboo$442boo19boo15boob3o10boo$429boo10boo38b5o10b oo$429boo11b3obo16boo17bobbo$443boo18bobo17bo$444bo17bobbo$461boobbo$ 464bo9boo$462boo10bobo$476bo$476boo! golly-2.5-src/Patterns/Life/Signal-Circuitry/reflectors2.rle0000644000175100001440000003032712156145314021025 00000000000000#C A selection of 90-degree glider reflectors. #C Note that this is not a complete collection of #C known glider reflectors, and that in many cases #C there are better ways to reflect gliders than this. #C #C The loop on the far right is a demonstration #C of how a herschel loop can reflect gliders. This #C is the only known way to reflect p57, 58, 59, and #C p61 glider streams. It is demonstrated at p60 #C because the other reflectors would be very large. #C #C p33: both by David Bell, May 01 #C p45: by Mark Niemiec, 6 Jan 96 #C p88: by David Bell, 27 Dec 99 #C From Jason Summers' "jslife" pattern collection. x = 583, y = 289, rule = B3/S23 473b8o$473bob4obo$190b3o125bo154b8o$43boo145b3o125b3o$44bo105boo3boo4b oobo25b3o128bo$39bobbo55boo50boo3boo4boboo28b3o124boo115boobo6boobo51b o$bboobo6boboo23b8o52bo59boo4boo26b3o81boobo6boobo43bo102boboo6boboo 49b3o17boo$bboboo6boobo21boo8bo46bobbo52boo3boobbo5bo27b3o81boboo6bob oo41b3o100boo8boo4boo28bobo15bo20bo$6boobboo25bobboboo3bo46b8o48bobobo bo3bo5bo108boo4boobboo4boo38bo103bo9bo5bo24b3o7boo11boo20bo$6bo4bo26b 3ob4oboo43boo8bo49bobo4boo4boo108bo5bo3bo5bo39boo4boo97bo9bo5bo23bobb oo4bobo32boo$7bobbo35bobbo42bobboboo3bo48boobo4bo5bo21b3o86bo5bo3bo5bo 44bo97boo8boo4boo23boob4o46boo$6boobboo26b4o6boo43b3ob4oboo51boo3bo5bo 18bob3o85boo4boobboo4boo34boo6bobo99boobo4bo5bo26b3o47bobo$bboobo6bob oo21bo4bo58bobbo51bobboo4boo17bobobo88boobo6boobo36boo6boo100boboo5bo 5bo14boo60bo$bboboo6boobo21boo3boo49b4o6boo50bo3bo5bo18bobbo4b3o82bob oo6boboo144boo4boobboo4boo14bobo70b3o$oo14boo28bo45bo4bo57boo3bo5bo18b oo88boo4boobboo4boo37bo104bo5bo3bo5bo16bo28bobbo39b3o$o16bo24b4obo44b oo3boo57bobboo4boo14boo7bo5bo78bo5bo3bo5bo36boobo104bo5bo3bo5bo43boobb oboo17bobo17bo$bo14bo25boobobo53bo53bo5boobo16boo7bo5bo79bo5bo3bo5bo 34bo107boo4boobboo4boo42bo4boboo15boobbo17bo$oo14boo20bo5booboboo46b4o bo52boo4boboo16boo7bo5bo78boo4boobboo4boo34boboo106boobo6boobo51boo17b o19bo$bboobo6boboo21bobobboobobobo47boobobo78bo95boobo6boobo25boo10bo 108boboo6boboo44boo4bo38bobo$bboboo6boobo20bobb4o4bobbo42bo5booboboo 74bobo9b3o82boboo6boboo24bobo179booboo$36b3obb3obbobob3o39bobobboobobo bo75boboo131bo$39bo3boobboo4bo37bobb4o4bobbo206boobo4boo7boo132boboo4b 3o66bobo$38bobbo4bobboboo38b3obb3obbobob3o204boobobo3bo7boo132boobo3bo bboo23boo3bo37bo$38boobo4boboobo42bo3boobboo4bo72boo8b3o121bob4o149boo 3bo22bo3bobo36bo$42b4o5bo41bobbo4bobboboo73boo7bo3bo120bo155b3obbo8boo 12bo3bobo35bo$36b4oboobboob3o42boobo4boboobo83bo3bo121b3o154boobbo6bob o13bo4bo34b3o$36bobboboboobobo48b4o5bo83bo3bo124bo7boo9boo134bobbo6bo 12b3o5boo8bo24b3o$91b4oboobboob3o85b3o118boo4boo7boo9bobo132bobbo6boo 12bo17b3o$41bo4bo44bobboboboobobo209bo24bo134bobbo41bo5bo7boo$185b3o 125bobo157b3o41boo4bo7boboo$43boo51bo4bo82bo3bo13b3o109boo10bo195bobo 6bobbo$184bo3bo13bo122boboo203b3o$42bo55boo84bo3bo7boo5bo121bo194boo3b obo4boo$41bobo141b3o8boo128boobo191boob4o$40bobbo53bo230bo193b3obbo$ 41boo53bobo425boo$95bobbo96boobo126boo6boo148bo41bo$96boo86b3o9bobo 126boo6bobo145b3o$197bo137bo144bo$42boo138bo5bo7boo131boo4boo137boo3bo bo$41bobbo137bo5bo7boo14b3o114bo132boo9bobo4bo34boo$41bobo9bo43boo83bo 5bo7boo14bo117b3o130bo11bo40bobboo$42bo9boo42bobbo92boo19bo118bo130bob o16bo33bobobo13boo$52bobo41bobo8boo75b3o4bobbo123boo144boo13bobobo33bo 16bobo$40boo55bo8boo82bobobo124bo147boo10boobbo52bo$108bo80b3obo122b3o 148boo14boo34bo16boo$38bo4bo51boo92b3o124bo152b3o46bobo$466boobbo48bo$ 33bobboboboobobo12b3o32bo4bo261boo104boob3o44b3o$33b4oboobboob3o10bo 54boo68b3o174bobo104boo47bo$39b4o5bo10bo28bobboboboobobo12bobo67b3o36b 3o135bo107bobboo$35boobo4boboobo39b4oboobboob3o10bo69b3o36bo246b3o71bo $35bobbo4bobboboo44b4o5bo82b3o34bo246bo70b3o$36bo3boobboo4bo39boobo4bo boobo82b3o351bo$33b3obb3obbobob3o15boo23bobbo4bobboboo81b3o335boo3bo 10boo$33bobb4o4bobbo16boo25bo3boobboo4bo14bo344boo57b3ob3o$34bobobboob obobo19bo21b3obb3obbobob3o14boo344boo14boo43boo3bo$35bo5booboboo40bobb 4o4bobbo16bobo359bo45boobboo$39boobobo44bobobboobobobo380b3o45boo$39b 4obo45bo5booboboo381bo44boo$43bo50boobobo428boo$34boo3boo53b4obo357bo 69boo$34bo4bo58bo358b3o69bo$35b4o6boo42boo3boo221bo15bo126bo6bo59bo$ 43bobbo42bo4bo222b3o11b3o125bobo6bo57boo$35b3ob4oboo44b4o6boo218bo9bo 129bo4bob3o7boo46bobbo13boo$34bobboboo3bo53bobbo217boo9boo132boobboo7b o47b3o10boobbo$34boo8bo45b3ob4oboo175boo5boobo6boobo161bo5boobboo5bobo 45b3o12bobobo$36b8o45bobboboo3bo177bo5boboo6boboo160bobobo13boo45bobo 16bo$36bobbo49boo8bo176bo4boo4boobboo4boo158bobboo6boo52bo15bo$41bo49b 8o51boo3boo4boboo111boo3bo5bo3bo5bo158boo6bo4bo51boo15boo$40boo49bobbo 55boo3boo4boobo117bo5bo3bo5bo23boo3boo135bo4bo70bo$96bo62boo115boo3boo 4boobboo4boo21bo3bobo3bo135bobo70bo$95boo53boo3boo3bo23bobboboobobbo 81bo3bo5bo3bo5bo26bobo213b3o$150bobobobobbo23boobbo4bobboo79bo5bo5bo3b o5bo20bo4bobo4bo210bo$152bobo4boo23bobboboobobbo80boo3boo4boobboo4boo 21booboobooboo$151boobo6boboo116bo5bo3bo5bo25booboo187bo17bo$155boo4b oobo34bo4boo70boo4bo5bo3bo5bo216b3o14b3o$156bo8boo32bo3boo72bo3boo4boo bboo4boo219bo12boobo$155bo10bo31b3o4bo70bo6boobo6boobo220boo12bo$155b oo8bo110boo5boboo6boboo177boo45boboboobb3o$156bo8boo153boobo3boboo127b oo14boo43boobboobbobo$155bo5boboo33b3o120b3o3b3o129bo59boo3bob4o$155b oo4boobo34bo122bo5bo127b3o60boo3bobb3o$199bo256bo66b3o$199bo323boo$ 199bo283bo40bo$198b3o135b3o142b3o41bo$215boo119bo137b3o3bo$215bobo119b o133b3obo3bobo$198b3o14bo246boo8booboo3bo34boo$199bo263bo8booboo39bobb oo$199bo263bobo8bo7bo33bobobo13boo$464boo13bobobo33bo7bo8bobo$479boobb o39booboo8bo$321b3o3b3o153boo34bo3booboo8boo$321bobbobobbo188bobo3bob 3o$320bo9bo188bo3b3o$474bo41b3o$227bo91bo11bo143bo40bo$226boo91bo4bobo 4bo143boo$226bobo95bobo147b3o$320bo3bobo3bo139b3obbo3boo$320boobbobobb oo139b4obo3boo$bboobo6boobo23boo279b5ob5o139bobobboobboo43boo$bboboo6b oboo23boo280bobbobobbo138b3obboobobo45boo$6boobboo4boo58boo244boo3boo 139bo12boo$6bo3bo5bo59boo387boboo12bo$7bo3bo5bo447b3o14b3o$6boobboo4b oo448bo17bo$bboobo4bo5bo$bboboo5bo5bo301boo9boo125bo$6boobboo4boo302bo 9bo30b3o93b3o$6bo3bo5bo300b3o11b3o27bo98bo70bobo$7bo3bo5bo20b3o276bo 15bo28bo96bo70bo4bo14b3o$6boobboo4boo19bo3bo418boo15boo51bo4bo6boo6bo$ bboobo6boobo20bo5bo33bo384bo15bo52boo6boobbo8bo$bboboo6boboo20bo5bo32b 3o380bo16bobo45boo13bobobo$39bo34b5o378bobobo12b3o45bobo5boobboo5bo$ 37bo3bo31boo3boo377bobboo10b3o47bo7boobboo$38b3o33b5o73boo3boo4boobo 289boo13bobbo46boo7b3obo4bo$39bo34bo3bo73boo3boo4boboo305boo57bo6bobo$ 75bobo83boo68boo5boo232bo59bo6bo$36boo38bo75boo3boobbo69boo5boo230bo 69b3o$37bo4b3o107bobobobo3bo23boo5boo276boo69bo$34b3o5bo33b3o75bobo4b oo23boo5boo275boo$34bo8bo32bo76boobo6boobo302boo44bo$77bo79boo4boboo 301boo45b3o$158bobboo4boo298boobboo45bo$157bo3bo5bo64bo5bo229bo3boo43b oo14boo30b3o$157boo3bo5bo62b3o3b3o229b3ob3o57boo30bo$50boo106bobboo4b oo61boobbobobboo217boo10bo3boo90bo$50bobo31boo71bo5boobo63bo3bobo3bo 218bo$50bo33bobo70boo4boboo63boboo3boobo215b3o70bo$84bo145boo7boo215bo 71b3o$527boobbo$483bo47boo$481b3o44b3oboo$480bo48bobboo$57b3o419bobo 46b3o$57bo33b3o91boo7boo127boo3boo132boo16bo34boo14boo$58bo32bo93boboo 3boobo41b3o36boo5boobo4boo3boo24bobbobobbo132bo52bobboo10boo$92bo92bo 3bobo3bo41b3o37bo5boboo4boo3boo25bobobobo133bobo16bo33bobobo13boo$185b oobbobobboo40bo3bo35bo10boo31b3obobobob3o131boo13bobobo33bo16bobo$186b 3o3b3o40bo5bo34boo9bo3boo3boo21bo4bobobo4bo145boobbo40bo11bo43b3o$187b o5bo42booboo47bobbobobobo21bob3obobob3obo149boo34bo4bobo9boo42bo$200b 3o73boo9boo4bobo27bo5bo188bobo3boo55bo$200bo35booboo36bo5boobo5boobo 25bobobobobobo187bo$201bo33bo5bo34bo6boboo9boo22bo4b3o4bo183b3o$231boo 3bo3bo35boo3boo14bo23b11o7bo134bo41bo$231boo4b3o41bo14bo24boo7boo5b3o 134boo$186boo5boo42b3o36boo4bo13boo38bo135bobb3o$186boo5boo82bo3boo14b o38boo134b4oboo$243b3o30bo6boobo9bo169boo4bobo3boo$243bo32boo5boboo9b oo167b3o$244bo220bobbo6bobo$308bo156boobo7bo4boo41b3o$212boo94b3o19boo bo132boo7bo5bo41bobbo$212bobo96bo15boboob3o147b3o17bo12boo6bobbo$212bo 97boo14b3obo4bo121b3o24bo8boo5b3o12bo6bobbo$325bo4bob3o122b3o34bo4bo 13bobo6bobboo$85bo240b3oboobo124bo35bobo3bo12boo8bobb3o$84bobo240boboo 8b3o116bo36bobo3bo22bo3boo$83bobbo252bo118bo37bo3boo23boobbo3boboo$ 255boo48boo33bo116bobo66b3o4boobo$33bo49bobo169bobo47boo$32bobo47boo 171bo242booboo$31bobbo47boo8bobo362bobo38bo4boo$83bobo8boo214bo147bo 19bo17boo$31bobo60b3o213bobo145bo17bobboo15boobo4bo$bboobo4boobo16boo 51bo10bo214bobo146bo17bobo17boobobboo$bboboo4boboo16boo8bobo40boboo 224bo145b3o39bobbo28bo$6boo6boo15bobo8boo50bo96boo4boo122b3o133b3o70bo bo$6bo7bo27b3o36bobo10bo96bobobbobo120b7o144bo60boo$7bo7bo15bo10bo37bo bbo9bobo97bobbo119booboobobooboo140bobo47b3o$6boo6boo15boboo58boo97bo 4bo119boboo3boobo141boo46b4oboo$bboobo4boobo28bo38bobo10bo89bobbo4b6o 118bobo7bobo149boo32bobo4boobbo$bboboo4boboo15bobo10bo40boo99bobbo5b4o 119bobbobobobobbo149bo20boo11boo7b3o$6boo6boo12bobbo9bobo39boo97booboo boo125booboob3obooboo149bo20bo15bobo$6bo7bo26boo38bobo13bo86bobbo127bo 4bo3bo4bo148boo17b3o$7bo7bo13bobo10bo54boo52boboo6boobo19bobbo5bo122b 3obobobob3o168bo$6boo6boo15boo47bobbo12bobo52boobo6boboo17boobooboo5bo 123bobobobo$bboobo4boobo17boo48bobo13bo51boo8boo4boo17bobbo3bo126bobbo bobbo$bboboo4boboo15bobo13bo36bo14bo52bo8bo5bo18bobbo3bo3bo123boo3boo 193b8o$45boo102bo10bo5bo25b3o324bob4obo$28bobbo12bobo58boo42boo8boo4b oo352b8o$29bobo13bo58bo6boo38boboo4bo5bo$30bo14bo13boo36bo12boo39boobo 5bo5bo$58boo52bo42boobboo4boo$45bo8boo4bo95bobbo5bo$43b3o8boo49bo49bo 4bo5bo$44boo58bobbo47boobboo4boo$107bo43boboo6boobo$49boo44boo8bo45boo bo6boboo205b3o$95boo22boo249bo$46boo19boo50bobo71b3o175bo$67bobo34b3o 12bo72bo3bo$51boo14bo36bobo85bo3bo$41boo8b3o50bobo85bo3bo$41boo8bo52b oo11bo75b3o$116bobo$51bo14bo50bo$51bo13bobo40boo8bo9bo$50bobo12bobbo7b o30bobo8b3o6boo63b3o$50boo23boo30bobo17bobo$51bo13bobo7bobo29b3o80bo5b o$64boo52b3o69bo5bo$64boo52bo71bo5bo$54bo10bobo40bo9bo65bobbo$54boo50b obbo8bo65bobbo4b3o$53bobo9bobbo37bo11bobo61boobooboo$54bo10bobo39b3o 10bo63bobbo15b3o$54bo65bo63bobbo15bo$62boobo54bo61boobooboo14bo$54bo 10bo52b3o63bobbo5b4o125boo5boo56boo5boo$52b3o129bobbo4b6o120boobbo7bo bboo48boobbo7bobboo$53boo8bobo126bo4bo77boo3boobo6boobo23bobbobo7bobo bbo46bobbobo7bobobbo$54bobo8boo51b3o72bobbo79bo3boboo6boboo19boobobobo boo5booboboboboo38booboboboboo5booboboboboo$65boo53bo70bobobbobo76bo8b oobboo4boo17boboobobobo7boboboboobo38boboobobobo7boboboboobo$63bobo54b o70boo4boo76boo7bo3bo5bo23b3o3bo3bo3b3o48b3o3bo3bo3b3o$119bobo163bo3bo 5bo18b4obob3obobob3obob4o40b4obob3obobob3obob4o$62bobbo54bo154boo7boo bboo4boo17bo11bobo11bo38bo11bobo11bo$62bobo211bo3boobo4bo5bo19b3obobob 3o3b3obobob3o40b3obobob3o3b3obobob3o$63bo152boo57bo4boboo5bo5bo20boobo boo7booboboo44booboboo7booboboo$216bobo56boo7boobboo4boo$216bo67bo3bo 5bo$275boo8bo3bo5bo$276bo7boobboo4boo$275bo4boobo6boobo$275boo3boboo6b oboo5$318boo13boo48boo13boo$318boo13boo48boo13boo$318boo13boo48boo13b oo$5boobo6boobo18boo$5boboo6boboo18bobo281boo7boo54boo7boo$9boobboo24b 3o277boobo7boboo50boobo7boboo$9bo3bo24bo3bo$10bo3bo23boobb5o136boo12b oo$9boobboo27boob3o106boobo6boobo15boo12boo120boobo7boboo50boobo7boboo $5boobo6boobo19boobb5o107boboo6boboo29boo122bo9bo54bo9bo$5boboo6boboo 19bo3bo109boo8boo4boo28bo$9boobboo4boo18b3o8b3o99bo9bo5bo13b3o12bobo$ 9bo3bo5bo17bobo10b3obo98bo9bo5bo12boobobboobb3obobo$10bo3bo5bo16boo12b obobo96boo8boo4boo14boobboobb4obo40boo3boo77bo7bo56bo7bo$9boobboo4boo 31bobbo98boobo4bo5bo15boo10bo40bo7bo75b3o5b3o54b3o5b3o$5boobo6boobo26b 3o5boo99boboo5bo5bo70bobo77boobo5boboo52boobo5boboo$5boboo6boboo25bo3b o103boo4boobboo4boo68boo3boo75bo11bo52bo11bo$44bo3bo103bo5bo3bo5bo149b 3o11b3o48b3o11b3o$44bo3bo104bo5bo3bo5bo255bo$45b3o104boo4boobboo4boo 171boo81boo$154boobo6boobo60b3o110bobo80bobo$154boboo6boboo61b3o109bo$ 191boo$190b3o$44b3o144boo45bo5bo71booboboo58booboboo7booboboo$30boo11b o3bo140boo39b3o5bobo3bobo68b3obobob3o54b3obobob3o3b3obobob3o$30bobo10b o3bo148bo31b3o5bo3bobo3bo66bo11bo52bo11bobo11bo$32b3o8bo3bo142b3ob3o7b 3o30bobo3bobo4b3o60bob3obob4obo52b4obob3obobob3obob4o$31bo3boboo5b3o 142b4o5bo5bo33bo5bo5bo63bo3b3o4bo57b3o3bo3bo3b3o$31boobo5bo147bo6boob oo5bo45bo64bobobob3o53boboobobobo7boboboboobo$34bo5bo147bo11bo114boobo bobo55booboboboboo5booboboboboo$31boobo5bo14b3o131booboo6bo115bobobbo 60bobbobo7bobobbo$31bo3boboo16bo134bo5b4o116bobboo62boobbo7bobboo$32b 3o21bo135b3ob3o116boo70boo5boo$30bobo8boobb4obboo139bo$30boo9bobb6obbo 146boo$42b10o144boo44b4o$39b3o10b3o141b3o42bo4bo$39bobbo8bobbo141boo 43bo3bobo$40boo10boo188bo3bobo$64b3o181bo$64bo183bo$65bo153b3o23bobbo 16b3o$219bo26boo17bo$220bo45bo$$192bo10boo$191bob4obboobboo$190bobob3o bboobboboo$73b3o113bobo12b3o$73bo116bo$74bo115boo265boo$190boo12boo 167b3o80boo$190boo12boo167bo84bo$374bo! golly-2.5-src/Patterns/Life/Signal-Circuitry/reflectors.rle0000644000175100001440000001413112156145314020736 00000000000000#C Fast, low-period glider reflectors. These work for any #C period 22 or higher that is a multiple of their period. #C #C Periods 5, 6, 8: Noam Elkies, 16-Sep-1998 #C Period 7: Noam Elkies, 1-Aug-1999 #C Period 15: oscillator by Karel Suhajda, Dec-02. #C P5 reflector later improved by David Eppstein and Noam Elkies. #C #C Note that there are two possible positions for the spark #C in the p6, p7, and p15 versions. #C From Jason Summers' "jslife" pattern collection. x = 420, y = 141, rule = B3/S23 41boboo84boobo75boboo96boobo77boo5boboo$41boobo84boboo75boobo96boboo 78bo5boobo$39boo86boo83boo92boo4boo75bo4boo$40bo86bo85bo92bo5bo76boo4b o$39bo88bo83bo94bo5bo80bo$39boo86boo83boo92boo4boo75boo3boo$41boboo84b oobo77boo96boobo78bo5boboo$41boobo84boboo78bo96boboo77bo6boobo$45boo 80boo4boo75bo95boo4boo75boo9boo$46bo80bo5bo76boo94bo5bo88bo$45bo82bo5b o73boo97bo5bo75boo9bo$45boo80boo4boo74bo96boo4boo76bo9boo$41boboo84boo bo75bo99boobo77bo6boboo$41boobo84boboo75boo98boboo77boo5boobo7$216boo$ 215bobbo$215bobo3bo$216bob6o101b3o$218bo5bo100b3o$216bobb4obo89bo10b3o $127bo88boobobobo90b3o5b3o$46boo79b3o10boo77bobo95bo4b3o$45bobbo81bo8b obbo73booboboo93boo4b3o78boo6boo$40boobboboobo79boo8bobobo73bo5bo93boo 83bobbo4bobbo$40bo3bobbobo88boobobo61bo9bobbobobobbo82bo9boo82bobbo4bo bbo$41b3obo3boo81bo3bo3boboboo59b3o7booboboboboo81b3o8b3o72bo8bobbo4bo bbo$43bo3bobbo80bobobboboobbobbo62bo8bo4bobo81bob3o3boo77b3o7boo6boo$ 44bob4o77boobboo3bo4boboboboo42boo14boo8boboboobo71bo8bo3bo4bobbo78bo$ 46bo80boo9boobobboobbo36boo5b3o21boobo3bo72b3o5bo3bo9bo76boo$34boo11b 3obboo59boo24bobbo3boo36bobbobbo4bo14bo8b4o76bo3b3obo7bo4bo85bobbo$34b o8bob3obbobbo59bobo14bo8bobooboo38bobobbob4oboboo9boboboobboo79boo4b3o 9bo3bo77bo5b3obb3o$37boo5boo3boobo62bo14boo8bo4bo37boob4o4bobobo6boobb oo8b4o82bo13boo52b3o21bobo3bo8bo$36b3o5boo5bob3o55b4oboobboo7bobo9b4o 39bobo4boo3bobo6boo9boobobbo78bo71b3o5bo11boobboo5boo4boo$36b3obboo8bo 4bo54bo4bobobbo21bo40bob4o4b3obooboo14bo82bobo71bo5bobo10boo10bo4bo$ 36bo4boo7booboob3o50boobbobboboo25bo36boboo5boo4bo4bo14bobo76boobboo 72bo4bo3bo$36boo12bobbobo3bo48bobboo3bobo19bo5boo35bobo3boboobb3obob3o 16boo76boo13boo61bo4bobobo$44bo6bo5bobbo46boboobboboobo17bobo42bobbob oobobbobbo3bo112boo59bobo19boo$43bobo5boo3b3obo46bo4bo4bo19boo43boo7b oo118bo16bo67boo$39boobboo5bobb3o4bobo45b3obob3o80bo6boo120bobo66bo$ 39boo10bobobobbooboo47b5o82bo7boo97bo22boo44bobo27bo$50bobbobo3bo144bo 11bo79bo8bo68bo4bobobo20bo4boo5boo$51boobbobobo89boo5boo39bo19boo77boo 5b3o68bo4bo3bo18b3o4boo5bo$52bobobobo59bo30boo5bo39bobo17boo77bobo76bo 5bobo31bobo$52bobobbo60boo34bobo40boo73boo99b3o5bo6bo25boo$53boo57bo4b obo34boo37boo106boo70b3o12boo20boo$49bo61bobo36boo40bobo32boo5boo34bo 3bo26boobboo29bo4boo5boo37bobo20bobo$17boo31bo61boo36bobo39bo5boo27boo 5bo35bo4bo29bobo26bobo4boo5bo32bo29bo$18bo29b3o57boo34bobo4bo39boo5boo 32bobo37bobobo29bobboo24boo9bobo31bobo20bobo$15b3o89bobo34boo86boo39bo bobo10bo57boo33boo20boo12b3o$14bo3b3o86bo5boo30bo82boo44bo4bo8boo13boo bbo3bo30boo33boo25bo6bo5b3o$13bobbobobbo84boo5boo94boo17bobo44bo3bo7bo bo14bobbo4bo29bobo31bobo31bobo5bo$13boboo3bobo185boo19bo71b3o5bobobo8b o20bobboo28bo5boo4b3o18bo3bo4bo$12boobbo4bo127b5o56bo11bo53boobbo20bo 8bobobo5b3o52boo5boo4bo20bobobo4bo$11bobbobb4o126b3obob3o64boo7bo49bob o29bo4bobbo14bobo7bo3bo40bo27bobo$11bobo3bo3b3o101boo19bo4bo4bo64boo6b o50boo30bo3bobboo13boo8bo4bo47bo$8booboboobb3o3bo54boo45bobo17boboobo bboobo77boo7boo31boo57bo10bobobo44boo$8bobo5bo3b3o56bo38boo5bo19bobo3b oobbo71bo3bobbobboboobobbo29bobo9boo24boobbo29bobobo44boo19bobo$11b3ob oobobo52b4o41bo25boobobbobboo52boo16b3obob3obboobo3bobo29bo5boo4bobo 26bobo29bo4bo55bobobo4bo$4boo3boobboobbobo5boo46bob3o42bo21bobbobo4bo 54bobo14bo4bo4boo5boobo29boo5boo4bo29boobboo26bo3bo55bo3bo4bo$bb3obobo bo13bobo48b3o41b4o9bobo7boobboob4o56bo14booboob3o4b4obo78boo59bo4bo10b oo10bobo5bo$bo4bobo17bo42boo47bo4bo8boo14bo55bobboboo9boo6bobo3boo4bob o107boo29boo4boo5boobboo11bo5b3o$oboobooboo59boo13boo32booboobo8bo14bo bo53b4o8boobboo6bobobo4b4oboo82bobo51bo8bo3bobo21b3o$obo3boobo64boo7bo bo30boo3bobbo24boo57boobboobobo9boobob4obobbobo75b3o5boo53b3obb3o5bo$b obbo4b3o4bo50bo6boo7bo31bobboobboboo9boo67b4o8bo14bo4bobbobbo75bo8bo 55bobbo$bboobbo3boo3bobobboo43bobobboo6bo3boo31boobobobo4bo3boobboo66b o3boboo21b3o5boo53boo22bo76boo$4boo3bo6boobbobo43boobbobo3boo3bobboo 32bobbobboobobbobo69boboobobo8boo14boo59bobo98bo$4bo7boo6bo50bo4b3o4bo bbo31boobobo3bo3bo70bobo4bo8bo76bo16bo67boo6boo7b3o$bbobo7boo64boboo3b obo32boboboo75booboboboboo7b3o88boo67bobbo4bobbo8bo$bboo13boo59booboob oobo32bobobo8boo66bobbobobobbo9bo89boo13boo51bobbo4bobbo$17boo42bo17bo bo4bo34bobbo8bo69bo5bo112boobboo51bobbo4bobbo$10b3o48bobo13bobobob3o 36boo10b3o67booboboo110bobo56boo6boo$10b3obo46boo5bobobboobboo3boo52bo 68bobo114bo$11b4o52boboboob3o126boboboboo92boo13bo$8bo56b3o3bo5bobo 122bob4obbo92bo3bo9b3o4boo$8boo54bo3b3obbooboboo122bo5bo94bo4bo7bob3o 3bo$64b3o3bo3bobo126b6obo94bo9bo3bo5b3o$67b4obbobbo128bo3bobo94bobbo4b o3bo8bo$66bo4bobboo132bobbo96boo3b3obo$65bobo3boobo134boo92b3o8b3o$66b obbobobbo229boo9bo$67b3o3bo231boo$70b3o226b3o4boo$37b3o29bo229b3o4bo$ 37bo31boo56bo12boo157b3o5b3o$38bo88b3o9bobbo153b3o10bo$33boo95bo8bobob o152b3o$30bobbobo93boo7boobobo152b3o$29bobobobo100bo3boboboo$28bobobo bboo95bo3boboobbobbo$28bo3bobobbo93bobobbo4boboboboo$25booboobbobobo 10boo78boobboo5boobobboobbo$25bobo4b3obbo5boobboo78boo10bobbo3boo$27bo b3o3boo5bobo67boo25bobooboo$27bobbo5bo6bo68bobo15bo9bo4bo$28bo3bobobbo 12boo62bo15boo9b4o$29b3obooboo7boo4bo58b4oboobboo8bobo11bo$31bo4bo8boo bb3o58bo4bobobbo24bo$32b3obo5boo5b3o56boobbobboboo25boo$35boboo3boo5b oo56bobboo3bobo20bo$34bobbobb3obo8bo52boboobboboobo18bobo$34boobb3o11b oo52bo4bo4bo20boo$41bo65b3obob3o$38b4obo65b5o$37bobbo3bo$37boo3bob3o 102boo5boo$38bobobbo3bo70bo30boo5bo$38boboobobboo70boo34bobo$39bobbo 69bo4bobo34boo$40boo69bobo36boo$112boo36bobo$108boo34bobo4bo$107bobo 34boo$107bo5boo30bo$106boo5boo$$150b5o$148b3obob3o$125boo20bo4bo4bo$ 125bobo18boboobobboobo$125bo20bobo3boobbo$118boo25boobobbobboo$118bo 24bobbobo4bo$120bo11bobo8boobboob4o$119b4o9boo15bo$118bo4bo9bo15bobo$ 118booboobo25boo$116boo3bobbo10boo$115bobboobboboo5boobboo$115boobobob o4bobbobo$118bobbobboobo3bo$118boobobo3bo$120boboboo7boo$120bobobo8bo$ 121bobbo9b3o$122boo12bo! golly-2.5-src/Patterns/Life/Signal-Circuitry/signal-turn.rle0000644000175100001440000000451112156145314021032 00000000000000#C Signal turning/transforming reactions #C Unfortunately, none of these is sufficent to form a closed loop. #C Dean Hickerson #C 1 (top): 24 Aug 1997 #C 2: 29 Jul 1997 #C 3: 24 Jul 1997 #C From Jason Summers' "jslife" pattern collection. x = 68, y = 179, rule = B3/S23 15bobbo37boo$13b6o38bo6bo$9boobo42bo7bobo$9boobobob5o34boo4b3obbo$12bo bo6bo31boobbobbo3bobo$12bobobb5o32bobobbobooboboo$13boobo7bo29bob4obo bbobbo$16bobb6o26boobo6bobobbo$16bobo29boobbobob4obobboo$15boobobb6o 21bo3bobbo3bobo$18bobo6bo22bobo4bobobb4o$18bobobb5o18b4obob5ob3o3bo$ 19boobo7bo14bo3bobo6bo3bo$22bobb6o14boo4b4oboobboobbo$22bobo18boobbobb o3bobo4boboo$21boobobb6o11bobobboboobobobobbo$24bobo6bo10bob4obobboboo bobo$24bobobb5o7boobo6bobo5boo$25boobo7bo5bobob4obobb5o$28bobb6o5bobbo 3bobo6bo$28bobo8boobo4bobobb4o$27boobobb4obbobob5ob3o3bo$30bobo4bobobo 6bo3bo$30bobobboobobb4oboobboobbo$29boobobo3bobo3bobo4boboo$32boboboob oboobobobobbo$32boobobobobobboboobobo$35bobobobboo5boo$35bobobo3bob4o$ 32boobobobb3obbobbo$33bobobo7bo$33bobobb7o$34boo$40b3o$40bobbo$42boo 22$13bobbo$11b6o$7boobo$7boobobob5o$10bobo6bo$10bobobb5o$11boobo7bo$ 14bobb6o$14bobo$13boobobb6o$16bobo6bo$16bobobb5o$17boobo7bo$20bobob5o$ 20bobo$19boobobb6o$22bobo6bo3boo$22bobobb5obbobbo$23boobo7b3obo$26bobb 5o3boboboo$26bobo6bo3bobo$25boobobb6obbobo$28bobo6bobobobo$28bobobb4ob obboobo$29boobo3bobobo3bo$32bobo3bobobooboo$29b3obob4obobbobo$29bo3bo 7bobobbo$33b8obb3o$40bobo$31b7obboboo$30bo7boboobbo$30b6obbo4boo$36bob o$28b6obboboo$27bo6bobo$27b5obbobo$24bo7boboo$24b6obbo$30bobo$22b6obbo boo$21bo6bobo$21b5obbobo$18bo7boboo$18b6obbo$24bobo$16b6obboboo$15bo6b obo$15b5obbobo$20boboo$15b3obbo$15bobbobo$16boboboo$17bo22$6bobbo$4b6o $oobo$oobobob5o$3bobo6bo$3bobobb5o$4boobo7bo$7bobb6o$7bobo8bo3boo$6boo bobb7obbobbo$9bobo7b3obobo$9bobobb5o3boboboboo$10boobo6bo3bobobobo$13b obb6obbobobboo$13bobo6bobobo$12boobobb4obobb5o$15bobo3bobobo4bo$15bobo bo3boboboo$16bobob4obobboo$18bo7bo3bo$18bob6ob3o3bo$17boobo4bobobb4o$ 20bobbo3bobo6bo$20bobob4obobb5o$19boobo6bobo5boo$22bob4obobboboobobo$ 22bobobboboobobobobbo$21boobbobbo3bobo4boboo$23boo4b4oboobboobbo$23bo 3bobo6bo3bo$24b4obob5ob3o3bo$28bobo4bobobb4o$26bo3bobbo3bobo6bo$26boo bbobob4obobb5o$29boobo6bobo5boo$32bob4obobboboobobbo$32bobobboboobobob obboo$31boobbobbo3bobo$33boo4b4oboo$33bo3bobo6bo$34b4obob5obo$38bobo4b obo$36bo3bobbo3boo$36boobbobob3obbo$39boobo5bo$43bob3o$44boo! golly-2.5-src/Patterns/Life/Signal-Circuitry/stargate.rle0000644000175100001440000000715312156145314020406 00000000000000#C Star Gate: the paradox of an apparent warp-speed spaceship tunnel. #C This p60 device allows lightweight spaceships to jump forward in #C the Life universe at the superluminous speed of 15/14 = 1.071c. #C Specifically, LWSSs entering from the left jump by 30 cells along #C their path in 28 generations. The Star Gate implements two copies #C of a reaction in which crashing gliders create a Fast Forward #C Force Field which allows LWSSs to travel by way of a tunnel effect. #C Dieter Leithner, 26 Oct 1996 #C From Alan Hensel's "lifebc" pattern collection. x = 155, y = 133, rule = B3/S23 25boo85boo$24bobo44bobo37bobo$10bo12b3o4boo34bo4bobbo35bo13bobo$5bo4b 4o8b3o4bobb4o31boo5boo8bo16boo7bobbo6boobbobbo$5bo5b4o8b3o4boob3o26boo 8bo3boo5bobo15boo7bo8bobo5boo$oo9bobbo9bobo35boo10boo6boboo25bobo3bo3b o3bo3boo4boo$oo9b4o10boo44bobbo6booboo10boo14boobboob3o5boo6boo$10b4o 8bo48bobo8boboo10boo21boo3bobbo$10bo12bo59bobo20boo16bobo$21b3o50bo9bo 21bo$34boo19boo16bo21boo7bobo$5boo28bo19bo17b3o19b3o6boo4bo$5boo28bobo 6boo7bobo25bo15boobo9bobo$36b3o5bobo6boo24bobo4b3o8bobbo9boo$38b3o6bo 30bobo16boobo$5bo32bobbobbobbo29bobbo7bobboobb3o$4bobo32boo6bo8bo21bob o7bo3bobboo$3bo3bo8b3o25bobo9b3o7bo7boo3bobo6bobbo29boo23boo$3b5o10bo 25boo13bo6bobo4bobo5bo8boo11bo17bobo22bo$bboo3boo8bo40boo6boo5bo28bo 13boo6bo11bobo5bobo$3b5o13bo30boo18boo28b3o7boobobbobbobbo10bobbo5boo$ 4b3o12b3o31bo58boobboo6bo9boo12boo$5bo12bo18bo6bo8bobo65bobo8boo3bo10b oo$18boo18bo6boo7boo21boo42boo11boo12boo$9boo25b3o5boo15boo13b4o11boo 33bo8bobbo10bo$8bobo4bo12boo30booboo10booboo10booboo29boo10bobo9bobo$ 10bo4bo11bobo31b4o11boo13b4o21boo7boo21bobo$29bo32boo28boo22bo32bo$ 106bo7bobo$13boo3boo79boobo3b4o4boo$14b5o4boo68boobboobobo4b4o35boo3b oo$15b3o4bobbo66bobobbooboboo3bobbo35bobobobo$16bo49bo24b3o8boo3b4o6bo bo27b5o$6b3o11bo43bobo15boo6b3o8boo3b4o7boo29b3o$5bo3bo12bo42boo15boo 7b3o12bo11bo30bo$21bo70bobo$4bo5bo82boo$4boo3boo41bo6bo83boo$30b3o20bo 6boo81bo$30bo20b3o5boo50bo21bobo5bobo$7bo23bo77boo22bo3bo3boo$6bobo8b 3o90boo5bo19bo8bobo$6bobo106b4o14bo4bo7boo$6bo10bobo26bobo65boboboo4bo 12bo9bo$6bo9b5o17b3o5bo3bo62bobbob3o5boobo3bo3bo$6bobbo5boo3boo11boobb obbobo7bo42bo19booboboo5b4obobbobo$7boo6boo3boo9bobbobboo7bo4bo41b3o 15b3ob4o6boobboo19b3o$30bo19bo30bo14bo5bobo5bobo4bo31bo3bo$30bo10b3obb o3bo3boo23bobo13boo5boo6bo29bo7bo5bo$18bo11bo15bobo5bobo23boo7boo12bo 5boo27boo9bo3bo$16boo6boo5bobbo21bo33bo48boo9b3o$23bobo7boo21boo32bobo 57b3o$15bo7bo43bo6bo16boo4bobbo26bobbo$22boo44bo6boo19bo14b4o11bo$16bo bbo46b3o5boo20bo3bo10bo3bo10bo3bo$18boo76b4o11bo14b4o20boo$112bobbo34b oo$135boo8bo$135bobbo6bobo$130boobbo3bo7bobo4boo$129b3obboobbo7bobbo3b oo$119boo5boboo16bobo$96bo5bobo14boo5bobbo8b3o4bobo$94bobo6boo21boboo 15bo$95boo6bo25b3o$130boo$$82bo6bo$83bo6boo$17boo28boo28boobb3o5boo$ 15booboo25booboo25booboo$15b4o26b4o26b4o9bo$16boo28boo28boo9boo$87bobo $$128boo$128boo$112boo26boo$111boo27boo$88bo24bo$88b3o$91bo51bo$90boo 36b3o11bo$142bo$128bobo$127b5o$103bo22boo3boo5boo3boo$93bo8boo22boo3b oo8bo$92b3o7bobo33bo5bo$91b5o43booboo$90bobobobo43bobo$90boo3boo44bo$ 127boo12bo$126boo$93bo31bobbobboo$92bobo32bo3bo$91boobo37b3o$91b3o40bo $90bobbo43bobo$90b3o44boo$89bo3bo44bo3b3o$88bo5bo23bo22bo3bo$89bo3bo5b o17boo21bo5bo$90b3o7bo16bobo20booboboo$98b3o$131bo$129boo$130boo$111b oo$110bobo32boo$107bo4bo12boo18bo$88boo15bobo17boo19b3o$89bo16boo40bo$ 86b3o26boo21boo$86bo29bo21bobbo$92boo22bobo9bo3b3o7bo$90bo3bo5bobb3o 11boo8b5o3bo6bo$89bo5bo9bo3bo16booboo3bo7bo$88bobbo3bo8bo4bobo13b3oboo 3bo3bobbo5boo$95bo16boo12boob4o5boo7bobo$86bo3bo3bo17boo13b4o18bo$85bo boo3boo18boo14bo20boo$85bo23bobo4boo$84boo23bo6bobo$118bo$118boo4$17b oo28boo28boo$15booboo25booboo25booboo$15b4o26b4o26b4o$16boo28boo28boo! golly-2.5-src/Patterns/Life/Signal-Circuitry/traffic-lights-extruder.rle0000644000175100001440000016375612156145314023356 00000000000000#C Traffic lights extruder. #C Slowly creates an outward-growing crystal of traffic lights. #C By Jason Summers, 30 Oct 2006. #C Based on an idea by David Bell. x = 3141, y = 2078, rule = B3/S23 2794boo$2793bobbo$2796bo$2796bo$2794bobo$2794bobo$2795bo3$2792boo3boo$ 2792bo5bo$$2793bo3bo$2782boo10b3o$2780bo3bo$2779bo5bo$2774boobboobo3bo $2774boo3bo5bo$2780bo3bo$2782boo$2814bobo$2813bo$2808boobbo4bo$2808boo bobboboo$2812boo$$2818bo$2816b3o$2815bo15boo$2815boo14boo3$2804boo13b 3o$2804boo$2817bo5bo$2817bo5bo$2817bo5bo6b3o$2796boo31bo3bo$2795b3o7bo $2795boobo4booboo7boo11bo5bo$2796b3o17boo10boo3boo$2797bo4bo5bo6bo$$ 2802booboboo19boo$2827bobo$2817boo8bo$2808boo7boo8boo$2807bobo21bo$ 2808bo19bobbo$2807boo22bo$2807b3o$2808boo$2806bo19booboboo$$2826bo5bo $$2807bo19booboo$2806b3o20bo$2805b5o$2782boo20boo3boo$2782boo21b5o$ 2805bo3bo$2806bobo20boo$2807bo21boo$2783bo$2782b3o$2781bo3bo20boo$ 2780bob3obo19boo$2781b5o4$2773bo$2770b4o4bo$2769b4o5bo$2762boo5bobbo$ 2762boo5b4o$2770b4o$2773bo3$2370b3o684boo$2369bo3bo683boo$2368bo5bo$$ 2367bo7bo$2367bo7bo531boo$2907bo$2368bo5bo519boo9bobo$2369bo3bo518bo3b o8boo$2370b3o426boo85boo3bo5bo23boo$2799bobo84boobboobo3bo23boo$2799bo 91bo5bo158b3o$2379b6o507bo3bo158bo3bo$2378bo6bo508boo158bo5bo5bobo$ 2377bo8bo534bo133bo3bo4bo3bo$2378bo6bo534b3o133b3o5bo$2379b6o534bo3bo 132b3o4bo4bo8boo$2918bob3obo139bo12boo$2919b5o140bo3bo$3066bobo$2824b oo211boo$2824b3o209b3o$2818boobbobbobo207bobobbobboo$2818boobboobboo 207boobboobboo$2822boo215boo$$2828bo205bo$2826b3o205b3o$2825bo15boo80b oo95boo15bo$2825boo14boo80bo96boo14boo$2924b3o$2830bo95bo105bo$2814boo 14bo199boobo13boo$2814boo14bo189b3o10bo13boo$3020b3o6bobboo13boo$2826b 3o3b3o184bo3bo4bob5o12bo$3018bo5bo4bo3bobo10bobo$2830bo188bo3bo5bo4bo 11bobo$2830bo3bo185b3o6boo16bo$2830bob3o3boo3boo185bobb4o$2833bobo195b o3b4o$2823boo14bo3bo181bo7boo3bo5boo3boo$2814b3o5bobo15b3o182boo10bo6b obobobo$2813bo3bo6bo15b3o181bobo18b5o$2812bo5bo222boo3b3o$2812bo5bo8b oo205bo6bobo3bo$2827boo10bo194boo5bo$2818bo19b3o$2817boo18bo3bo$2817b oo20bo$2424bo390bobboo16bo5bo180bo$2423bobo390bobo17bo5bo179b3o$2422bo 3bo389boo19bo3bo179b5o$2422bo3bo411b3o179bobobobo17b3o$2422bo3bo445boo 146boo3boo16booboo$2422bo3bo387boo3boo51boo169booboo$2422bo3bo387boo3b oo222b5o5bobo$2422bo3bo596bo18boo3boo7bo$2423bobo390b3o203bobo31bo$ 2424bo391b3o203bobo28bobbo$2817bo55bo149bo30b3o$2873bo148boo$2839boo 31bobo147boo19boo$2432bo4bo401boo30booboo146boo$2430boob4oboo430bo5bo$ 2432bo4bo435bo$2816boo52boo3boo168boo23boo$2778boo36boo227boo23bobo$ 2778boo293bo$3071booboboo$3067b4o3boobo$3065bobbo3boo$3064bobbobb3ob3o $2870boo192boo5boo3bo$2871bo192b3o5b4o$2868b3o193b3o4bo4b3o$2868bo195b 3o4boobbobbo$3064b3o9boo$3064boo$3064bo$3062bobobo$3062boobobo$3065bob o$3065boo17$2477bo631boo$2476bobo628bo3bo$2475bo3bo621boo3bo5bo13boo$ 2475bo3bo621boobboobo3bo13boo$2475bo3bo626bo5bo10boo6bo3boo$2475bo3bo 627bo3bo10b3o5bo3bobo$2475bo3bo629boo12boo6b5o$2475bo3bo634bobo9boo4b 3o$2476bobo635boo10boo$2477bo361boo274bo$2835boo4b4o263bo$2835boobboob 3o263bo$2839bo268bo$2485bo4bo$2483boob4oboo339b3o10bo258b3o$2485bo4bo 341bo10b3o$2833bo8bo15boo239boo9b3o5boo$2842boo13bobbo234boo3bo17boo$ 2857bo236bobo3bobo$2857bo235b3o5boo$2831boo12bo11bobo233boo$2831boo11b oo11bobo236boo$2844bobo11bo236b3o19boo$3117bobo$3117bo11bo$2855boo3boo 233boo30bobo$2855bo5bo233boo17boo9boo$3107b3o4boo9boo12boo$2852boobbo 3bo245b5o6boo6boo12boo$2851boo4b3o224boo19bobo3bo5b3o7bobo$2829boobob oo17bo230bo20boo3bo6boo10bo$3073bobo6bobo29boo$2829bo5bo237bo3bo4boo 30boo$2844boo217boo12bo$2830booboo9boo217boo8bo4bo$2832bo244bo$2856bo 216bo3bo$2854booboo214bobo$2834bo$2833bobo17bo5bo$2832bo3bo123boo$ 2832b5o16booboboo100boo$2831boo3boo$2832b5o$2833b3o$2834bo$2961bo$ 2959booboo$$2958bo5bo$2530bo325boo$2530bo325boo100booboboo$2529bobo 577boo$2530bo427b3o144boobboobboo$2530bo302boo122bo27bo119bobobbobboo$ 2530bo302boo123b3o22b3o120b3o$2530bo451bo124boo$2529bobo432bo17boo131b o$2530bo431boo149b3o$2530bo581bo15boo$3112boo14boo$2980bo126boo$2970b oo7b3o125bobo$2534bobboo4boobbo421boo8b3o119boo4bo$2533bo3b3obb3o3bo 410bo5boo4bo129boo$2534bobboo4boobbo410b3o4boo10boo3boo$2957b5o15boo3b oo$2956boo3boo$2957b5o157boo7bo$2957bo3bo15boo139boo7b3o$2958bobo15bob o122b3o16bo5b5o$2957b3o15boo148boo3boo$2956boo18boo123bobo$2957bo18boo 122b5o5boo$2954b3o22b3o117boo3boo4boo13boo$2954bo144boo3boo18bo$3114b oo11bo$3114boo8bobbo$3104boo18booboo$2975boo3boo122boboo18boo$3107bo$ 2976bo3bo$2977b3o122bob3o16boo3boo$2977b3o122bo20boo3boo$3102bo21b5o$ 3125bobo$$3125b3o$2978boo$2978boo121boo3boo$3103b3o$3102bo3bo$3103bobo $3104bo21boo$3126boo3$3103boo$3103boo$$2583bo$2583bo$2582bobo$2583bo$ 2583bo$2583bo$2583bo$2582bobo$2583bo$2583bo4$2587bobboo4boobbo$2586bo 3b3obb3o3bo$2587bobboo4boobbo32$2636bo$2635bobo3$2635b3o$2635b3o$2636b o3$2636bo$2635b3o$2635b3o3$2635bobo$2636bo$2641bobboboobobbo$2640boobb o4bobboo$2641bobboboobobbo32$2689bo$2688bobo3$2688b3o$2688b3o$2689bo3$ 2689bo$2688b3o$2688b3o3$2688bobo$2689bo$2694bobboboobobbo$2693boobbo4b obboo$2694bobboboobobbo33$2740bo$2739b3o$2738booboo$2737b3ob3o$2737b3o b3o$2737b3ob3o$2737b3ob3o$2738booboo$2739b3o$2740bo4$2747b8o$2747bob4o bo$2747b8o4$2706boo$2705bobbo$27boo73boo77boo77boo88boo27boo56boo77boo 77boo2111bo$27boo73boo77boo77boo87bobbo26boo56boo77boo77boo2111bo$181b oo166bo29boo2325bobo$181bo167bo30bo2325bobo$4boo20b3o50boo77boo20bobo 54boo88boo20bobo27bobo20boo10boo77boo77boo2133bo$4boo20b3o50boo77boo 20bobo53bobbo87boo20bobo27bobo20boo10bobbo75boo77boo20b3o$102bo78bo57b o110bo29bo135bo77b3o$102bo136bo178bo97bo76bo3bo2106boo3boo$101bobo133b obo88bo186bobo74bo5bo2105bo5bo$5bo18boo3boo69booboo53b3o17boo3boo52bob o87bobo17boo3boo23boo3boo17b3o12boo96booboo74bo3bo$4bobo18b5o69bo5bo 52b3o17bobobobo53bo18booboboo62bo3bo16bo5bo23bobobobo17b3o11bo97bo5bo 74b3o2108bo3bo$3bo3bo18b3o73bo54bo3bo17b5o142b5o47b5o17bo3bo111bo55b3o 2131b3o$4b3o20bo71boo3boo50bo5bo17b3o74bo5bo61boo3boo16bo3bo26b3o17bo 5bo28boo3boo72boo3boo51booboo2155bo$bboo3boo70b3o75bo3bo19bo53boo3boo 84b5o18b3o28bo19bo3bo7boo3boo17b3o54b3o75booboo2153b3o$78bo3bo75b3o74b o5bo16booboo64b3o71b3o8boo3boo16bo3bo52bo3bo74b5o2152bo$77bo5bo17b4o 155bo67bo84b5o18bobo52bo5bo17b4o51boo3boo18bobo2130boo$77booboboo16boo bbo131bo3bo173bobo20bo53booboboo16boobbo75bobbo$100boobo133b3o274boobo 74boboo$3bo410b3o155boo2136bo$3bo22bo53bo20boo54bobo167bo74bobo89bo20b oo54b5o19bo2112bobo$3bob3o16boo53bobo19bo55bobbo17bobo148boo16bo33bobo 17bobbo88bobo19bo55bo20boobo2113boo$16boo7boo52bobo9boo66boobo7boo6boo 69boo6bo70b3o8boo6bobo32boo6boo7boboo23boo10b3o52bobo9boo66b3o8boo8bo$ 8bo7boo61boo10boo77boo7bo69boo4boo4b3o64boo9boo6boo33bo7boo34boo4bobo 58boo10boo68bo8boo2119bo13boobboo3boo$5boboo69bo22booboboo51bo96boobbo 3bo64bo72bo29boo4bobo51bo22booboboo51boo2129b3o12boo3b5o$5boo70b3o15bo 5bo5bo51boboo78bo86bobo9bo11bo46boobo15bo14bo3b5o49b3o21bo5bo51boo19b oo3boo2102b5o16booboo$76bo3bo13bo7bo3bo53bo21b3o54bobo17bo5bo63boo8bob o9b3o23b3o9b3o9bo17bo16boo3boo47bo3bo21bo3bo74b5o2102boo3boo8bo6booboo $26boo3boo42bob3obo12b3o6b3o58boo3bo11bo3bo54boo17boo3boo73boboo7b5o 21bo3bo8bobo25b3o16boo3boo46bob3obo21b3o66bo8booboo2103b5o10bo6b3o$oo 3boo10bobo8b3o45b5o4bo78boobbobo9bo5bo152bobo7boo3boo19bo5bo7bo23bo76b 5o4bo68boo3boo11bobo6booboo2103bo3bo8b3o$oo3boo10boo8bo3bo54boo3bo62b oo3boo6booboo9bo3bo50bo86booboboo9b3o8b5o21bo3bo9bobo8boo3boo4b3o14boo 69boo66bobobobo11boo8b3o2105bobo$b5o7bo4bo9bobo54boo4bo63b5o9b4o9b3o 50b3o24bo71b3oboboo8bo3bo22b3o10bo5bo5b5o4b5o12bobbo7bo59boo68b5o2129b 3o$bbobo9bo14bo55boo4bo63booboo10bobbo8b3o49b5o22bobo59bo5bo3bobo4bo 10bobo23b3o10bob4obo4booboo3boo3boo10boobbo5boo131b3o2129boo$12b3o140b ooboo13bo59boo3boo8bo12bobo69bo5bo12bo38b4obbo4booboo20b3oboo138bo 2131bo$bb3o80b3o68b3o14bo60b5o10bo11bo62booboo5b5o56boo6b3o22bobboo3bo 141b3o3b3o2113b3o$234bo3bo8b3o11bo64bo102boo2269bo$29boo58bo14boo77boo 50bobo13bo9bobbo72bo14boo23boo33b3o22bobbo66bo10boo62bo14boo2125bo$29b oo58bo14boo77boo51bo13bobo9boo73bo14boo23boo13b3o17b3o24boo65bobo9boo 62bo14boo2124b3o11boo$89bo161boo84bo169boo73bo2139b5o8bo3bo$2721bobobo bo6bo5bo$bboo14boo57boo14boo61boo14boo61boo14boo72boo14boo45boo14boo6b oo14boo61boo14boo61boo14boo2133boo3boo5boobo3bo8boo$bboo15bo57boo15bo 61boo15bo61boo15bo72boo15bo45bo15boo6boo15bo61boo15bo61boo15bo2146bo5b o8boo$16b3o72b3o76b3o76b3o87b3o47b3o34b3o76b3o76b3o2143boo3bo3bo$16bo 74bo78bo78bo89bo51bo34bo78bo13bo64bo2139bo4bobo5boo$23bobo72boo420bo 70boo2130bobo3bo$22bo75b3o74boo74bobboo88boo39boobbo41boo78bo6b3o70b3o 2129bobobboo$17boobbo4bo65boobbobbobo69boobobboboo69bo3boobboo80boobb oobboo31boobboo3bo36boobobboboo69b3oboobboo69boobbobbobo2129bo$17boobo bboboo65boobboobboo69bo4bobboo69bo7boo80bobobbobboo31boo7bo36bo4bobboo 69b4o4boo69boobboobboo2129boo$21boo73boo77bo75b4o11bobo72b3o42b4o41bo 78boo77boo2133boo$172bobo92boo73boo84bobo2293boo$267bo$$28b3o453bo179b o$27bo3bo182b3o177b3o85bo3bo87b3o85bo3bo2067b3o$26bo5bo4boo174b5o175b 5o89bo85b5o89bo2065b5o$36bobo174b3oboo174b3oboo83bo4bo85b3oboo83bo4bo 2065b3oboo$25bo7bob3o178boo178boo85b5o88boo85b5o2068boo$25bo7bo3bo$35b oo2751bo$26bo5bo2755bo$27bo3bo197boo178boo78boo98boo78boo6bobbo2068boo 37bo$28b3o188b4o5b4o167b4o5b4o20boo54b4o87b4o5b4o20boo54b4o9b4o2054b4o 5b4o20boo$50bobboo163bo3bo5booboo165bo3bo5booboo17booboo53booboo85bo3b o5booboo17booboo53booboo4bo3b4o2053bo3bo5booboo17booboo9b3o3b3o$49bo3b oobboo163bo7boo170bo7boo18b4o56boo90bo7boo18b4o56boo6b4o2060bo7boo18b 4o$49bo7boo159bobbo176bobbo29boo145bobbo29boo2125bobbo29boo15bo$50b4o 2734bo$682bo2105bo$59bo450bobo35bobo131bo$57b3o36b4o33b4o41boo31boo44b o33bo44boo96boo31boo44bo33bo41b4o33b4o52bo$56bo15boo21bo7boo23boo7bo 36boobboobboo23boobboobboo36boobboob3o23b3oboobboo36boobboobboo88boobb oobboo23boobboobboo36bo4bobboo23boobbo4bo36bo7boo23boo7bo$56boo14boo 21bo3boobboo23boobboo3bo36boobbobbobo23bobobbobboo36boo4b4o23b4o4boo 36boobbobbobo88boobbobbobo23bobobbobboo36boobobboboo23boobobboboo36bo 3boobboo23boobboo3bo2146b3o$96bobboo31boobbo43b3o25b3o46boo31boo46b3o 95b3o25b3o46boo31boo41bobboo31boobbo2146bobbo$180boo27boo127boo96boo 27boo2312bo$45boo47bo43bo34bo43bo34bo43bo34bo97bo43bo34bo43bo34bo43bo 2147bo$45boo47b3o39b3o34b3o39b3o34b3o7b3o29b3o34b3o95b3o39b3o34b3o39b 3o34b3o39b3o2144bobo$80boo15bo37bo15boo6boo15bo37bo15boo6boo15bo8bo28b o15boo6boo15bo80boo15bo37bo15boo6boo15bo37bo15boo6boo15bo37bo15boo$80b oo14boo37boo14boo6boo14boo37boo14boo6boo14boo7bo29boo14boo6boo14boo80b oo14boo37boo14boo6boo14boo37boo14boo6boo14boo37boo14boo$62boo7b3o570b oo$62bobo5bo3bo96bo47bo68b3o125bo9b3o46bo38boo112boo14bo$46bo15bo28b3o 13boo15boo45bo14boo15boo14bo19bo25boo15boo4bo55boo69bobo8boobo12boo15b oo14bo39boo4boo15boo60boo15boo9boo13bobo$44booboo7boo11bo5bo31boo15boo 25bo19bo14boo15boo14bo8boo8b3o10bo12bobo15boo5bo41bo12boo69bobo11bo12b oo15boo14bo38bo6boo15boo25bo34boo15boo10b3o11bobo$57boo10boo3boo13bo5b o43boo9b3o7bo76bo3bo9boo10b3o150bo8bobbo120bo14b3o63boo12bo$43bo5bo6bo 32bo5bo29bo13b3o7bo3bo4booboo5b5o48b3o15bo10bobo10boo67boo91bobbo48boo 60bo8bobo12bo3bo62bo$89bo5bo28bobo12bobo6bob3obo12bo5bo12bo49bo5bo20b oo66bo94bo13bo35bobbo58bobo6boobo11bob3obo4b3o7boo$43booboboo19boo53bo bo22b5o3bo5bo3bobo4bo10bobo29bo18bo5bo21bobo34bo111booboboo6b4o11bo31b o3bobo6bo51bobo7bo3bo10b5o4bo3bo5bobo34boo20boo3boo$68bobo19bobo32bo 11bo30b3oboboo8bo3bo28bo9boo3boo3bo3bo23bo34boo7bo8bo10bobo81bo5bo6boo boo10bo31bo4bo6b3o14b3o34bo8boo34bo15bo40bobobobo$58boo8bo11b3o74boobo boo9b3o8b5o28bo5boo3b5o5b3o59bobo5b3o6b3o10boo82bo3bo8boobo28b3o11bo 10b5o5b3o7bo66bo5bo11boo7booboo39b5o$49boo7boo8boo9bo3bo5bobbo5bo8bo 65bobo7boo3boo32boo4booboo49b3o22b5o4b5o4boo3bo3boo7b3o69b3o3bo6b3o38b 3o11boo3boo3bo3bo5bo17bo28bo3bo16boo3boo10boo48boo3b3o$48bobo21bo5bo5b o5bo6boo7b3o13booboboo44boboo7b5o35bo3booboo10boo17boo3boo12bo3bo20boo 3boobboo3boo3boo7bobo5bo3bo74boo5boo9boo3boo13bobo9bo20bo5bo21b3o13boo boboo8bo3bo34bo6bo5bo34bobo3bo$49bo19bobbo6bo3bo13bobo5b5o12bo5bo17b3o 14boo8bobo9b3o23b3o15b3o12boo10bobo3boo3boo22boo14b5o4b5o13bo85bobo19b o15b5o7bo22bo3bo14boo5b5o12bo5bo11bo5b3o52boo3boo16bo$48boo22bo7b3o21b obobobo12bo3bo18bo15bobo9bo11bo16b3o7bo29bo12bo23bo5bo4boo14b5o4b5o20b o5bo87boobbo5bo11boo3boo19boo9b3o15boo4bobobobo12bo3bo18bo15boo19boobo boo12b5o3boo$48b3o29bobbo20boo3boo13b3o3bo16bo15bo38bo3bo5bo47bo3b3o 13boo3boo20bobbo6bobbo20boo3boo87bobobbooboo12boo3boo18bo11bobbo20boo 3boo13b3o3bo16bo14bobo37booboo4boo$49boo30b3o10boo34boo5boo23boo9boo6b oo18bo5bo8boo34boo4bo5b3o28boo9bo3bo6bo3bo9boo96boo4bo5bobo28boo11bo9b 3o10boo34boo5boo25bo8boo27booboo3bo5boo$47bo19booboboo7boobo9boo33bobo 5boo23b3o8boo6bobo18bo3bo9boo34boo5bo5bo29boo9bo14bo9boo96boo11bo29boo 8bobbo9boobo9boo33bobo5boo24boo8boo7boo19b3o10boo$82bobo19boo57boo16bo 21b3o21b3o55boo19boboo8boobo19boo99bo19boo18booboo9bobo19boo54bo21bobo $67bo5bo9bo20boo55bo41bobbo20b3o55bobo19bo12bo19bobo75bo43boboo18boo 11bo20boo54bobbo19bo$103bo100b3o19bo3bo10bo45bo52bo77bo46bo51bo56bo22b oo42b3o$48bo19booboo30b3o98boobo17bo5bo8b3o43boo52boo75bobo97b3o76b3o 41booboo$47b3o20bo9boo3boo20bo40b3o54bobo18bo3bo9b3o40bo20boo3boo6boo 3boo20bo71booboo19bo19bob3o16boo3boo6boo3boo20bo40b3o31boo21b3o18boob oo$46b5o29bobobobo16b5o19bo19bo3bo10bo43bo20b3o32b3o18bobbo17bo5bo6bo 5bo17bobbo70bo5bo17b3o18bo20boo3boo6bobobobo16b5o19bo19bo3bo7booboboo 19bo19b3o18b5o$45boo3boo29b5o19boo20bo18bo5bo8b3o74boo3boo17b3o18bo60b o73bo19bo3bo17bo21b5o8b5o19boo20bo18bo5bo51bo3bo16boo3boo$46b5o31b3o 41bobo17booboboo7b5o18b3o52boo3boo16bo3bo39bo3bo8bo3bo92boo3boo15bob3o bo39bobo10b3o41bobo17booboboo6bo5bo37bo5bo$46bo3bo32bo41booboo29boo3b oo16bo3bo16boo3boo96b3o10b3o116b5o54bo41booboo74bo3bo$47bobo20boo30boo 3boo15bo5bo29b5o38bobobobo50boo3boo15booboboo50booboboo137b3o30boo3boo 15bo5bo29booboo19bo20b3o$48bo21boo31b5o19bo21bo10bo3bo16bo5bo16b5o32bo 177bo97b5o19bo21bo12bo20b3o$103booboo16boo3boo17bobo10bobo17boo3boo17b 3o32bobo39bo5bo50bo5bo73bo39boo3boo51booboo16boo3boo17bobo31b5o39boo 11bo$103booboo40bobo11bo43bo35boo176bo40b3o53booboo40bobo30boo3boo50b 3o$47boo55b3o42bo92boo39booboo52booboo115bo3bo53b3o42bo32b5o51boboo$ 47boo79bo55bo56b3o41bo56bo118bobo78bo53bo3bo52b3o$82boo44bo20boo10boo 20bobo42boo10bobo64boo10boo96boo43bo21boo10boo44bo20boo10boo20bobo42b oo9boo$82boo45bo19boo10boo20bobo42boo10boo65boo10boo96boo65boo10boo45b o19boo10boo21bo43boo$183bo$183bo$105boo19boo55bobbo18boo56boo19boo56b oo96boo19boo56boo19boo56boo19boo$105boo19boo56boo19boo56boo19boo56boo 96boo19boo56boo19boo56boo19boo111$681b3o$681bobbo$681bo$681bo$682bobo 56$653bo$652b3o$652boboo$653b3o$653boo17$2510bo$2510bo$2509b3o3$2509b 3o$2510bo$2510bo$2510bo$2510bo$2509b3o3$2509b3o$2510bo$2510bo$$2495bo bboboobobbo$2494boobbo4bobboo$2495bobboboobobbo3$2491b3o$$2490bo3bo$ 2490bo3bo$$2491b3o37bo$2529b3o$2528bo$2491b3o34boo$$2490bo3bo$2490bo3b o$$2491b3o$2526bo$2525b3o$2477bobboboobobbo35b5o$2477b4oboob4o34bobobo bo$2477bobboboobobbo34boo3boo$$2474bo$2474bo51bo$2473b3o49bobo$2525bob o$2526bo$2473b3o50boo$2474bo51boo$2474bo51boo$2474bo$2474bo$2473b3o3$ 2473b3o$2474bo$2474bo$$2459bobboboobobbo$2458boobbo4bobboo$2459bobbob oobobbo3$2455b3o$$2454bo3bo$2454bo3bo$$2455b3o3$2455b3o$$2454bo3bo$ 2454bo3bo$$2455b3o3$2441bobboboobobbo$2441b4oboob4o$2441bobboboobobbo $$2438bo$2438bo$2437b3o3$2437b3o$2438bo$2438bo$2438bo$2438bo$2437b3o3$ 2437b3o$2438bo124bo$681b3o1754bo122b3o$681bobbo1875bo$681bo1741bobbob oobobbo125boo$681bo1740boobbo4bobboo$682bobo1738bobboboobobbo$2558bo$ 2557b3o$2419b3o134bo3bo$2555bob3obo$2418bo3bo133b5o$2418bo3bo$$2419b3o 3$2419b3o$$2418bo3bo$2418bo3bo$$2419b3o136boo$2558boo$$2405bobboboobo bbo$2405b4oboob4o$2405bobboboobobbo$$2402bo$2402bo$2401b3o3$2401b3o$ 2402bo$2402bo$2402bo$2402bo$2401b3o3$2401b3o$2402bo$2402bo$$2387bobbob oobobbo$2386boobbo4bobboo$2387bobboboobobbo3$2383b3o$$2382bo3bo$2382bo 3bo$$2383b3o3$2383b3o$$2382bo3bo$653bo1728bo3bo$652b3o$652boboo1727b3o $653b3o$653boo$2369bobboboobobbo$2369b4oboob4o$2369bobboboobobbo3$ 2595bo$2593b3o$2592bo$2592boo8$2587boo3boo$2588b5o$2588booboo$2588boob oo$2589b3o6$2590boo$2590boo49$2627bo$2625b3o$2624bo$2624boo7$2621b3o$ 2620bo3bo$2619bo5bo$2619booboboo3$2622bo$2621bobo$2621bobo$2622bo$$ 2622boo$2622boo17$681b3o$681bobbo$681bo$681bo$682bobo28$2659bo$2657b3o $2656bo$2656boo3$2653b3o$2653b3o$2652bo3bo$2651bo5bo$2652bo3bo$2653b3o 10$2654boo$2654boo6$653bo$652b3o$652boboo$653b3o$653boo39$2691bo$2689b 3o$2688bo$2688boo7$2683boo3boo$2686bo$2683bo5bo$2684booboo$2685bobo$ 2686bo$2686bo5$2686boo$2686boo49$2723bo$2721b3o$2720bo$2720boo3$681b3o $681bobbo$681bo$681bo2036bo$682bobo2032b3o$2716b5o$2715bobobobo$2715b oo3boo3$2718bo$2717bobo$2717bobo$2718bo$2718boo$2718boo$2718boo13$638b oo$637bobo$636bo$632booboboo3bo$632boboobo4bo$636bobooboboo$633boo3bo 5bo$633bobbo8boo$634boo9b3o$631b3obbobo6b3o$631bobbobboo6b3o$632boo11b 3o$645boo$645bo$643bobobo$642boboboo$642bobo$643boo5$639boo$639boo3$ 616boo$616boo$639bo$639bo$638bobo$637booboo11bo$636bo5bo9b3o$639bo12bo boo$636boo3boo10b3o$616b3o34boo$615bo3bo2135bo$614bo5bo17b4o2111b3o$ 614booboboo16boobbo2110bo$637boobo2111boo$984boo11boo11boo11boo$617bo 20boo343bobbo9bobbo9bobbo9bobbo$616bobo19bo344bobobbooboboobbobo9bobo bbooboboobbobo1724bo$616bobo9boo351boobbob3o3b3obobboo5boobbob3o3b3obo bboo1721b3o$616boo10boo352bobobobbobobobbobobo7bobobobbobobobbobobo 1721bo3bo$615bo22booboboo336bobboobb3ob3obboobbo5bobboobb3ob3obboobbo 1719bob3obo$614b3o15bo5bo5bo336boo17boo5boo17boo1720b5o$613bo3bo13bo7b o3bo343bobbobobbo17bobbobobbo$612bob3obo12b3o6b3o99bo229bobboo9bo3b3o 3bo15bo3b3o3bo9boobbo$613b5o5b3o115bobo227bobobbobbo5bobb7obbo13bobb7o bbo5bobbobbobo$622bob3o113bo3bo226boboobobobo4boo9boo13boo9boo4bobobob oobo$625boo114bo3bo8bo215boobobbobobo47bobobobboboo$742bo3bo5b3o215bo bboboobo3bo43bo3boboobobbo$743bo3bo3bo220boobo7bo41bo7boboo$622b3o3b3o 113bobo4boo217bo5bo3bobo7bo35bobo3bo5bo$745bo131bobbo88bo4bobo6bo5b3o 33bo6bobo4bo$626bo14boo106bo127b6o86boob3obob3oboo4bobobo24b3o5boob3ob ob3oboo$626bo14boo105bobo123bo8boboo88boobo4bo3b3ob3o23bobo5bo4boboo 1716boo$626bo39boo81boobboo86boo28bobb8oboboboboo70boo6b5o4bo9bobobo 24b3o10bo4b5o1710boo$665bobo85boo86boo28b3o7bobo3boob3o67bobo5bo4bob3o 11b3o3boo15boo17b3obo4bo$614boo14boo32bo209b3oboo3bobbo6bo65b3o6boboob obo14bo4bobo13bobo19boboboobo$614boo15bo28booboboo3bo200boobo5b4obo3b 4o66boo6boobobbo5bob4o12bo13bo12b4obo5bobboboo$628b3o29boboobo4bo147b oo51bobo5bo5bo5bo46boo19boo7bobobobo3bobbo5bo9boo11boo4bo10bobbo3bobob obo$628bo35bobooboboo145boo52boo4bobboobo4bo3bo44boo20bobo5bobobbobo7b obbobo4bo20boo5bo3bo7bobobbobo$661boo3bo5bo191bo3boo3bobboo4bob4obb4o 67bo5booboobboobb5obbo3bo4boo19boo3b3o3b5obboobbooboo$633boo26bobbo8b oo165b3o20bobobobo3b3o6bo4boo81bo10bo4bobo4boo9boo14b3o4bo10bo$629boo 4b4o23boo9b3o163booboo19bobobo9bo5b3o3b3o47bo30bobobo4bo7bo16boo23bo4b obobo$629boobboob3o20b3obbobo6b3o163booboo18boobobo8boobo5boo5bo45b3o 17boo3boo4boob4o4boo45boo4b4oboo$633bo25bobbobboo6b3o163b5o21bobo5b3ob oboo8b3o45bo3bo16boo3boo6bo3bobob3o28bo16b3obobo3bo$660boo11b3o162boo 3boo15bobb3obboo3b3o9booboo5boobo40bo31bobo7bo17b5o4boo17bo7bobo$673b oo144bo39bob3obbobo4boobboo5bo10boboo37bo5bo17b3o7booboo23bo3boboo3boo 23booboo$673bo144b3o38bo4boo4bo8bobo6bo10boo35bo5bo17b3o21b5o10boobobo 15b5o$671bobobo141b5o19boo17b3obo3bo11bo3boobo8boo3bo35bo3bo19bo14boo bbooboo3booboobboo5bo9boobbooboo3booboobboo$643boo25boboboo140bobobobo 16b5o18bobo3bo22boo3boboobo36b3o35bobbo13bobbo5bo9bobbo13bobbo$643boo 25bobo143boo3boo20bo20boo3bobbo4bo13bobo3bobbo76b4obbobbobbobb4o9bo7b 4obbobbobbobb4o$671boo166b3o20bobo3bo6booboo13bobboo103bo3bo$783b3o53b o20b3obo3bo8bo6bo6bob5o79b5obobbobbob5o4bo5boboo3b5obobbobbob5o$620boo 161b3o33bo20boo17bo4boo4bo12b3o5b3o3bo78bo4bob7obo4bo4bo3bobboobbo4bob 7obo4bo1141boo$620boo35bo125b3o32bobo19boo17bob3obbobo13booboo3boo6bo 42bo17bo17b3oboo7boob3o6b3o8b3oboo7boob3o1142boo$658bo121b3o34boobo9b oo28bobb3obboo13b3o4b3o4boo51boo5boo20bobbobooboobobbo21bobbobooboobo bbo$656b3o121b3o34b3o10boo33bobo10bo5bo5boo6bo51boo6boo22bobo3bobo7bo 19bobo3bobo$780b3o33bobbo20boo3boo15boobobo8boo13b3o3bo43bo39bobbo3bo bbo4boo19bobbo3bobbo1146b3o$816b3o21bobobobo16bobobo9boo12bob5o41bobo 20b3o17boo5boo6boo19boo5boo1147b3o$642b3o132bo37bo3bo21b5o17bobobobo 11boo10bobboo42boo19bo3bo$641bo3bo130bobo35bo5bo21b3o19bo3boo12bo8bobo 3bobbo59bo5bo$640bo5bo129boo37bo3bo5bo17bo35b3o9boo3boboobo58bo5bo$ 640bo5bo83boo48boo34b3o7bo45bo6bo16boo3bo48bobo10bo1208boo3boo$643bo 82boobboo48bobo41b3o37boo4boo27boo33boo3boo9bobo8bo3bo1207b5o$618boo3b oo16bo3bo79bobo47boo5bo81boo5boo22boboo51bobo9b3o1209b3o19boo$642b3o 77bo3bo48boo5boo26boo83boobo31boo3bo3bo5bo4bo12bo1211bo19bobo$619bo3bo 19bo78boo86boo118boo4b3o6bo5bo1242bo6boo$620b3o98boobo3boo145boo59b3o 6bo5bo1211bo30bobbobbobboboo$620b3o97bobb3obbo103bo10boo21bo8boo86boo 21bo1176boo29bo6boobboo$644b3o72bobobo5b3o55boo42bobo9boo19boo41boo38b 3o13boo19boo1172boo4boo29bobo$632boo10b3o71bobobo8bo55boo43boo31boo40b oo76boo1167boobboo4b3o29boo$632boo9bo3bo68b3obbo148boo23boobo30b3o 1222boobboo4boo$637bobo77boboo95boo14boo35boo24boboo30b3o4boo14boo 1209boo$637boo3boo3boo69boo18boo76boo15bo37bo27boo27bo3bo3boo15bo1209b o$619bo5bo12bo80bo69boo39b3o46bo16boo3bo48b3o$618b3o5bo109bo3bo89bo48b 3o9boo3boboobo25boo3boo16bo$618b3o3b3o109bo4bo67b3o31bobo18bo3boo12bo 8bobo3bobbo7bo1279b3o$738bobobo65bo3bo19bobboo7boo17bobobobo6boo3boo 10bobboo9b3o42bobboo1230bo3bo$616boo3boo116bobobo63bo5bo17bo3boobboo3b o18bobobo7boo5b3o6bob5o9b3o41bo3boobboo1225bo5bo$616boo3boo70bo46bo4bo 39boo3boo16bo3bo18bo7boo21boobobo9bo6bo6b3o3bo53bo7boo1225booboboo$ 691bobo47bo3bo40b5o18b3o20b4o18bo10bobo16bo5boo6bo6boo3boo19b3o18b4o 18bo$684bo5bobo11boo80booboo18b3o40boo6bobb3obboo20b3o4boo6boo3boo16b oo42boo19boo11boo11boo11boo$619bo12boo49b3o3bobbo11boo36boobbo39booboo 62boo4bob3obbobo11b3o3b3oboo6bo29boo43boo17bobbo9bobbo9bobbo9bobbo 1154bo$618bobo24boo35bo3bo3bobo52bobo39b3o69bo4boo4bo5b3o12b3o3bo29boo 63bobobbooboboobbobo9bobobbooboboobbobo1153bobo$620boo12boo9boo37bo6bo bo52boo112b3obo3bo6bo3bo4bo6bob5o9boo19bobo59boobbob3o3b3obobboo5boobb ob3o3b3obobboo1151bobo$620boo59bo5bo5bo48boo118bobo3bo6bo3bo4bo8bobboo 9bobo19boo60bobobobbobobobbobobo7bobobobbobobobbobobo1153bo$619b3o59bo 5bo53bobo55boo10b3o50boo3bobbobbo3bo4bo6bobo3bobbo5bobboo8boo69bobboo bb3ob3obboobbo5bobboobb3ob3obboobbo$618bobo13boo46bo3bo54bo5boo50boo5b o3booboo47bobo3bo7boo13boo3boboobo6boo9boo69boo17boo5boo17boo1151boo$ 618boo15bo47b3o54boo5boo55boo4booboo45b3obo3bo11bo3boobo8boo3bo6boo19b oo3boo60bobbobobbo17bobbobobbo50boobo101boobo97boobo94boo5boobo90boo5b oboo94boo5boobo92boobo5boo99boobo115boobo101boobo97boobo55boo44boobo 92boo5boobo92boo5boboo90boo5boobo96boobo5boo$632b3o170boo3b5o44bo4boo 4bo8bobo6bo10boo8bo13boo4boo3boo45bobboo9bo3b3o3bo15bo3b3o3bo9boobbo 35boboo101boboo97boboo95bo5boboo91bo5boobo95bo5boboo92boboo6bo99boboo 115boboo101boboo97boboo101boboo93bo5boboo93bo5boobo91bo5boboo96boboo6b o67bobbo19boo11boo$632bo159bo16boo3boo43bob3obbobo4boobboo5bo10boboo 24boo55bobobbobbo5bobb7obbo13bobb7obbo5bobbobbobo38boo97boo99boo4boo 92bo10boo88bo4boo98bo4boo4boo94boo3bo98boo4boo111boo4boo103boo93boo 103boo4boo90bo10boo90bo4boo94bo4boo4boo98boo3bo66b6o18bobbo9bobbo$786b o3bobo67bobb3obboo3b3o9booboo5boobo4bo5bo21b3o46boboobobobo4boo9boo13b oo9boo4boboboboobo38bo98bo100bo5bo93boo9bo89boo4bo98boo3bo5bo95bo4boo 97bo5bo112bo5bo104bo94bo104bo5bo91boo9bo91boo4bo94boo3bo5bo99bo4boo61b oobo8bo15bobo3booboo3bobo$637boo146b3o3boo49bo22bobo5b3oboboo8b3o11bo 5bo21b3o45boobobbobobo47bobobobboboo38bo98bo100bo5bo104bo93bo105bo5bo 95bo103bo5bo112bo5bo104bo94bo104bo5bo102bo95bo101bo5bo99bo62boobobobob 8obbo10boobbobo7bobobboo$633boobobboboo141b5o51boo20boobobo8boobo5boo 5bo11bo3bo6bo16bo46bobboboobo3bo7bo35bo3boboobobbo37boo97boo99boo4boo 92boo9boo88boo3boo98boo3boo4boo94boo3boo97boo4boo111boo4boo103boo93boo 103boo4boo90boo9boo90boo3boo94boo3boo4boo98boo3boo55b3oboo3bobo7b3o11b obobo4bo4bobobo$633bo4bobboo140bobobobo8b3o40boo20bobobo9bo5b3o3b3o13b 3o5bobo65boobo7bo6bo26bobo5bo7boboo35boobo101boobo97boobo95bo5boobo91b o5boboo95bo5boobo92boobo6bo97bo5bo112bo5bo100boobo97boobo101boobo93bo 5boobo93bo5boboo91bo5boobo96boobo6bo54bo4b3obbo3bo3boo13bobboobb7obboo bbo$637bo145boo3boo20boo51bobobobo3b3o6bo4boo25boo63bo5bo3bobo6bobo26b o7bobo3bo5bo33boboo101boboo97boboo94bo6boboo90bo6boobo94bo6boboo92bob oo5bo99bo5bo112bo5bo99boboo97boboo101boboo92bo6boboo92bo6boobo90bo6bob oo96boboo5bo56b3o3boob4obo3boboo10boo5bobobobo5boo$634bobo157bo69bo3b oo3bobboo4bob4obb4o84bo4bobo6bo6bo27bo6bo6bobo4bo36boo97boo4boo99boo 92boo3boo94boo9boo92boo3boo4boo88boo9boo97boo4boo111boo4boo103boo93boo 4boo103boo90boo3boo96boo9boo88boo3boo4boo92boo9boo56bobo3bo5bo4bobbo 19bobo$664bo18boo109bo77boo4bobboobo4bo3bo84boob3obob3oboo6bo23boo9boo b3obob3oboo36bo98bo5bo100bo98bo107bo97bo5bo89bo109bo5bo112bo5bo104bo 94bo5bo104bo96bo109bo93bo5bo93bo66bo8boboobboobboo17b3o5b3o9boobbo$ 655bo8boo17boo101bo7bo76bobo5bo5bo5bo92boobo4bo30boo4boo3bo4boboo43bo 98bo5bo100bo92boo4bo94boo9bo93boo4bo5bo89bo9boo98bo5bo112bo5bo104bo94b o5bo104bo90boo4bo96boo9bo89boo4bo5bo93bo9boo54b5ob4obo4b3o5boo3bo7bobo bo3bobobo5bobbobbobo$654bobobboo4boo8boo108bobo24boo57boobo5b4obo3b4o 39boo44b5o4bo34b3o6bo7bo4b5o36boo97boo4boo99boo93bo3boo95bo9boo93bo3b oo4boo88boo10bo97boo4boo111boo4boo103boo93boo4boo103boo91bo3boo97bo9b oo89bo3boo4boo92boo10bo59boo4bo4bob3o3bobobobo6boobb5obboo4boboboboobo $654bobobboo4b3o7boo108bobo8b3o13boo60b3oboo3bobbo6bo31bobo4boo43bo4bo b3o11bo5boo15bobo3bo12b3obo4bo31boobo101boobo97boobo94bo6boobo90bo6bob oo94bo6boobo92boobo5bo100boobo115boobo101boobo97boobo101boobo92bo6boob o92bo6boboo90bo6boobo96boobo5bo57b5ob3o4booboo6bobobo22bobbobobboboo$ 655bo3boo4boo119bo84b3o7bobo3boob3o33boo49boboobobo14boo3bobo13boboo3b 3o12boboboobo31boboo101boboo97boboo94boo5boboo90boo5boobo94boo5boboo 92boboo5boo99boboo115boboo101boboo97boboo101boboo92boo5boboo92boo5boob o90boo5boboo96boboo5boo55bo5boo4booboboo5booboboo23bobboobobbo$664boo 119boo84bobb8oboboboboo35bo49boobobbo5bob4o4boo6bo13bo9bobb4obo5bobbob oo1657b5o6boobo3bo5bobobbo19b3o3bobob3o$664bo120boo14boo71bo8boboo18b oo14boo54bobobobo3bobbo15boo11boo6boo7bobbo3bobobobo1651boboo5boobbo5b obo4bobboobboboboo17boo5boboo$652boo3boo126boo15bo27bo46b6o22boo15bo 27bo26bobobbobo7bo38bobbo7bobobbobo1651boobo5b3obo6bobbobo4b3o3boobo 16bobbo3bobobbobo$652boo3boo140b3o26boo47bobbo38b3o26boo26booboobboobb 5o31bo3bo7b5obboobbooboo137bo205bo205bo429bo205bo205bo205bo50boo13boo 3b3o8boboboo4bo8b3o4b3obbooboboobboo$799bo29boo88bo29boo28bo10bo13bo8b oo6boo4bo8bo10bo140b3o203b3o203b3o427b3o203b3o203b3o203b3o47bo3boo15bo 10bo4bob3oboo6b3o5boo3boboo$654b3o322bobobo4bo16boo6boo7boo14bo4bobobo 35bo107bo97bo107bo97bo107bo97bo103bo119bo107bo97bo107bo97bo107bo97bo 107bo46boboobo3boo15boo4boo3bobo3bo8bo11bo4b5o$654b3o148b4o116b4o49boo b4o4boo4b3o6boo23b3o4boo4b4oboo34b3o104boo97b3o104boo97b3o104boo97b3o 101b3o117b3o104boo97b3o104boo97b3o104boo97b3o104boo47boo5bobo14bo3bobb oobboobo3bobboo17b3obo4bo$655bo144boo7bo110boo7bo50bo3bobob3o5bo39b3ob obo3bo39bo90bobbo111bo205bo90bobbo111bo103bo119bo205bo205bo205bo154bo 4bo16bo6boo3bobob3obobo11boo6boboboobo$800boobboo3bo110boobboo3bo50bob o7bo45bo7bobo27boo9boo89bo114boo193boo9boo89bo114boo91boo9boo118boo88b oo103boo9boo90b4o110boo88boo114boo90b4o60bobbo3bo14bo3bobbo4boboo4bo4b o8b4o6bobboboo$804boobbo115boobbo50booboo33bo25booboo25b4o97boo204bob ooboo98b4o97boo207b4o114boo106bo99b4o96boobo4bo95boo106bo199boobo4bo 59boobobo7bo9boo4boboboo4boobo3bo8bobboo5bobobobo$993b5o12bo4boo12b5o 35bobooboobo93bo6boobo94bobobbo97booboobboo93bobooboobo93bo6boobo94bob obbo97bobooboobo113bo102boobbobo94bobooboobo94bo3bo4bo95bo102boobbobo 94boob6o94bo3bo4bo59bo4bo8boo3bo10b3o3boobobo4b3o12bobboboobobo$985boo bbooboo3booboobboo5boo3boo3boobbooboo3booboobboo26bobboo101bo3bobbo94b 3oboboo95bo100bobboo101bo3bobbo94b3oboboo94bobboo117boobb3o96bobb3obob o91bobboo99bo4boo97boobb3o96bobb3obobo92boob6o94bo4boo61b3o4bobbo3bo6b o8boobboboboo12b3o3b4o3boobbooboo$985bobbo13bobbo4boo9bobbo13bobbo25b 3obboobboo96b3obo3bo92bo6bo103boo91b3obboobboo96b3obo3bo92bo6bo94b3obb oobboo112bo3bob3o95b6obbo90b3obboobboo94bobbo4boo94bo3bob3o95b6obbo92b oo101bobbo4boo59bo4bo12b3o10bobobbo20boobbobb3obbo$654boo330b4obbobbo bbobb4o17b4obbobbobbobb4o26b3obbob4o93bo11bo92bo5boo95boo5boo91b3obbob 4o93bo11bo92bo5boo93b3obbob4o112boobo4bo96booboo93b3obbob4o94bobbo3bo bbo93boobo4bo96booboo95boo5boo94bobbo3bobbo58boobobo24booboboo15bo5bo 5boobobo$654boo282bo129bobbo3bobbo93bo3bob3o198boo99bobbo3bobbo93bo3bo b3o197bobbo3bobbo113bobo97bobb6o93bobbo3bobbo94boo4bobbo95bobo97bobb6o 94boo5boo95boo4bobbo58bobbo3bo23bobobo5bo16bobboboobboboo$936boo48b5ob obbobbob5o6bo5boo3b5obobbobbob5o28b4obobb3o93bobbo3bo94boo5bo104bo93b 4obobb3o93bobbo3bo94boo5bo96b4obobb3o108bo4boboo95bobob3obbo93b4obobb 3o96boo4bo91bo4boboo95bobob3obbo93boo5boo98boo4bo58bo4bo10boo11bobobob o4bo16bobbobboo3bo$937boo46bo4bob7obo4bo3boo6boobbo4bob7obo4bo27boobb oobb3o93boboo6bo92bo6bo95boobbooboo93boobboobb3o93boboo6bo92bo6bo95boo bboobb3o108b3obo3bo97bobobboo94boobboobb3o93bo4bo3bo91b3obo3bo97bobobb oo101boo95bo4bo3bo56boo5bobo8bo8bo3boo3bo5b3o15bo7bobo$986b3oboo7boob 3o5boo10b3oboo7boob3o33boobbo100boo94boobob3o97booboobo99boobbo100boo 94boobob3o101boobbo111b3obboo98bo104boobbo94bo4boboo94b3obboo98bo99b6o boo95bo4boboo56boboobo3boo9b3o6bo25b3o10booboo$826boo118boo40bobboboob oobobbo21bobbobooboobobbo30bobooboobo100bo98bobbobo10b3o185bobooboobo 100bo98bobbobo96bobooboobo117bo102boo95bobooboobo96b4o103bo102boo95b6o boo96b4o60bo3boo16bo4b3o17boo4b7o4boo$826bobo117bobo42bobo3bobo27bobo 3bobo34b4o100bobbo114bobbo186b4o100bobbo202b4o120boo200b4o206boo369boo 44bobbobbooboboobbobbo$828bo119bo41bobbo3bobbo25bobbo3bobbo34boo222bo 187boo308boo324boo580boobo31bo9boob4o3b4oboo$798boo28boo118boo41boo5b oo27boo5boo259bo1405boboo30bo7b3obbo11bobb3o$799bo492bobo1440b3o4bo3b ooboo7booboo3bo$799bobo1941bobo3boo7boo3bobo$800boo17boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22b oo22boo22boo22boo22boo10boo10boo10boo10boo10boo13boob3o3bo5bo3b3oboo$ 818b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b 4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o20b4o8b4o8b4o8b4o8b4o8b4o13bo5boo 7boo5bo$817booboo19booboo19booboo19booboo19booboo19booboo19booboo19boo boo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19b ooboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo 19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19boob oo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19b ooboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo 19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19boob oo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19b ooboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo19booboo 19booboo7booboo7booboo7booboo7booboo7booboo13bob4o11b4obo$818boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo22boo 22boo22boo22boo22boo22boo22boo10boo10boo10boo10boo10boo16boobbo11bobb oo$2673boo60bo$2673bobo59b3o$1929b3o741bo58bo5bo10bo8boo$1065bo104bo 100bo104bo100bo104bo100bo103bo119bo20bobbo80bo100bo104bo100bo104bo100b o104bo51bo48boo4bobo8bobo7bobo$1065b3o102b3o98b3o102b3o98b3o102b3o98b 3o101b3o117b3o21bo80b3o98b3o102b3o98b3o102b3o98b3o102b3o49b3o29booboo 12bobo3b5o6b3ob3oboobbobboo$1063boo3bo99boo3bo95boo3bo99boo3bo95boo3bo 99boo3bo95boo3bo98boo3bo114boo3bo20bo78boo3bo85b3o7boo3bo99boo3bo95boo 3bo99boo3bo95boo3bo99boo3bo51bo10bo8boo8bobo6bo14b3o7booboo3boboobobo$ 804boo251boo3bo3boobo97bo3boobo88boo3boboboobo97bo3boobo88boo3bo3boobo 89boo6boboboobo88boo3bo3boobo88bobo5boboboobo104boo6boboboobo16bobo73b oo3bo3boobo84bobo6bo3boobo89bobo5boboboobo88boo3bo3boobo97bo3boobo88b oo3boboboobo97bo3boobo44boo3boo9boboobo4bobo6bobbobooboobo22boboboboob o4bo$800boobboo251boo4b3obobo84bo3bo8boo3bobo88boo4bobobobo86bo11b3obo bo88boo3boo3bobo88bob4o4bobobobo88boo4b3obobo97bobobobo103bob4o4bobobo bo92boo4b3obobo83boob5obboo3bobo98bobobobo88boo4b3obobo87b3o7boo3bobo 88boo4bobobobo88bo8boo3bobo26booboo13bobo13bo3boboboobbobboobb3obbobo 3bo18bo3bo4bob3obobobo$799bobo261b3oboboo83booboo8b3obboboo97boboo87b 3obo5b3oboboo92b3obboboo86boo5boo6boboo93b3oboboo85bobobbo9boboo101boo 5boo6boboo87bobo7b3oboboo82boob3o4b3obboboo86bobobbo9boboo93b3oboboo 84boo10b3obboboo97boboo84bobo9b3obboboo26bobobo3boo7bo6b3o15boboobobo 20booboboo3boo4boo5bo3bo3bo$800bo266bo87boboo3boo4bobobo97bobbo91bob3o 8bo96bobobo92boobbo4bobbo100bo87boobo9bobbo107boobbo4bobbo89bobbo11bo 88b3o5bobobo88boobo9bobbo100bo87boo3bo7bobobo97bobbo86boobo10bobobo28b obbob5obo22bobobobbobobobbo6boo4boobo9bobo6bo3boo10booboo$1064boobo87b o6bobo3bobobo98bobo88b3obobbo5boobo96bobobo91b3o8bobo97boobo88bo3bo8bo bo106b3o8bobo89bobbo8boobo88boo6bobobo89bo3bo8bobo97boobo89boobo7bobob o98bobo87boo4bo6bobobo28b3obooboobo12bo5bo3boo4bo3bobbobbo4bob4o4boo3b o6bobbo7boo5bo3bo3bo$795b3o4boo260booboo88bo4bo6booboo86bo9booboo86bo bbo3bo6booboo85boo9booboo100booboo85boo9booboo88b4o7booboo115booboo89b oo9booboo96booboo89b4o7booboo96booboo100booboo96booboo89b5o6booboo30bo 4bobo12bo5bo3bo6boobboobobo4boo9bo3bo5bo3bo7bo4bob3obobobo$795b3o4bo 352bobbo4bo95boo102boo101bo203bobo103bo430bo204b3o202b3obbo40boobo4b3o 6bo3bo5bo3bobbo8boobboo11bobbo3bo3bo4bo8boboboboobo4bo$795b3o5b3o247b 3o99bo102boobo201bobo104bo101bo222bo516b3o201bo3boo40bobboo4b3o5b3o12b o6boobboobobo4boo9bo22booboo3boboobobo$792b3o10bo246boobbo99bobo99bo 106bo96bo107bo324bo721boboo41b5o6boo3booboo3b3o5boo4bo3bobbobbo4bob4o 4boo9bo11b3ob3oboobbobboo$792b3o258boboo102bo97boo3boo99bobo96bobbo4bo 99bobo97boo223bobo616bo104boo51b3o4b3o13bobobobbobobobbo6boo4boobo8bob o3b3obo3bobo7bobo$792b3o260boo7booboo89boo9booboo89boo5booboo89boo9boo boo84bo4bo6booboo89bobo8booboo82bobbo3bo6booboo99booboo104bobo8booboo 100booboo85bo10booboo100booboo85boo9booboo100booboo85b4o7booboo100boob oo28b5o6boo5bo23boboobobo21bobbo4bobobo3bo8boo$1051bo12boobo100bobobo 82bo3bobboo7bobo101boobo83bo6bobo3bobobo91boo9bobo84b3obobbo5boobo101b obo106boo9bobo101boobo86boobo6bobobo102bobo85bobbo8boobo100bobobo85bo 3bo8bobo100bobobo29bobboo4b3o8bo5bo6bo3boboboobbobboobb3obbobo3bobb3ob ooboo$1049boobb3o11bo100bobobo81bo5bo9bobbo104bo83boboo3boo4bobobo101b obbo87bob3o8bo100bobbo116bobbo104bo87boo7bobobo101bobbo85bobbo11bo100b obobo84boobo9bobbo100bobobo30boobo4b3o9boobb5o3boboobo4bobo6bobboboob oobo3boobbo7bobobboo$1051boboo8b3oboboo96b3obboboo79b5o13boboo97b3obob oo79booboo8b3obboboo101boboo83b3obo5b3oboboo100boboo116boboo97b3oboboo 92b3obboboo101boboo83bobo7b3oboboo96b3obboboo82bobobbo9boboo96b3obbob oo28bo4bobo4bobboobboobbooboo4bo8boo8bobo6bo4bobobobbo4bo6bo$1054bo8b 3obobo7bo84boo3boo3bobo7bo86bobobobo7bo84boo4b3obobo7bo72bo3bo8boo3bob o7bo84boo4bobobobo7bo74bo11b3obobo7bo83boo4bobobobo7bo99boo4bobobobo7b o84boo4b3obobo7bo80boo3boo3bobo7bo84boo4bobobobo7bo80boo4b3obobo7bo84b oo3boo3bobo7bo86bobobobo7bo84boo3boo3bobo7bo18b3obooboobo3bob4oboo7bob o20booboo14bobo3b3o3b3o$1062bo3boobo5b3o84boo3bo3boobo5b3o85boboboobo 5b3o84boo3bo3boobo5b3o85bo3boobo5b3o84boo3boboboobo5b3o85bo3boobo5b3o 83boo3boboboobo5b3o99boo3boboboobo5b3o70boo12boo3bo3boobo5b3o80boo3bo 3boobo5b3o84boo3boboboobo5b3o80boo3bo3boobo5b3o84boo3bo3boobo5b3o77bob o5boboboobo5b3o84boo3bo3boobo5b3o18bobbob5obo7boboo5bo4bo34bo8bo$1042b oo19boo3bo5bo72boo19boo3bo5bo68boo19boo3bo5bo72boo19boo3bo5bo68boo19b oo3bo5bo72boo19boo3bo5bo68boo19boo3bo5bo71boo19boo3bo5bo87boo19boo3bo 5bo72bobbo17boo3bo5bo68boo19boo3bo5bo72boo19boo3bo5bo68boo19boo3bo5bo 72boo19boo3bo5bo68boo19boo3bo5bo72boo19boo3bo5bo22bobobo3boo4bo3bo7bo 3bobbo42bob4ob5o$1042boo21b3o6boo71boo21b3o6boo67boo21b3o6boo71boo21b 3o6boo67boo21b3o6boo71boo21b3o6boo67boo21b3o6boo70boo21b3o6boo86boo21b 3o6boo71bobobb3o15b3o6boo67boo21b3o6boo71boo21b3o6boo67boo21b3o6boo71b oo21b3o6boo67boo21b3o6boo71boo21b3o6boo20booboo11bobobo4b3o4boo34boobb oobboobo3boo3bo$1065bo104bo100bo104bo82bo17bo104bo89b4o7bo93bo9bo119bo 82bobbo3bo14bo100bo94bo9bo100bo104bo100bo104bo54bo5bo35bobboobobo5boo 4bo$1457boo212bo4bo98bobo215bo3bo122bo85bobo222bo99b3o142boo7bob4ob5o 30boobo3bob4obobb5o$1260b3o194booboo208bo5bo99boo216b3o22bo73boo24bobo 85boo101bo119bobo98b3o88bo53b6obboobo3boo3bo33boo3bo3bobobbo4bo$1046b oo212bobbo193booboo22bo184b3ob3o341booboo70bobbo22bo3bo187bo118bo3bo 72boo22bo3bo88bo50bo3b3obo5b3o3bo32b3o3bo3bobo6b3o$1045bobbo3b3o17bo 14b3o74bo89b3oboo3bo119bo75bobbo20b3o75b3o105b3o226b3o193boo23b3o188bo 119b3o72bobbo20bo5bo85b3o50boo3bobob4obob6o31bobb8oboboboboo$1045boob oobb3o16b3o12bobbo60bo11bobo9booboboo71b5oboobobbo10boo3boo86bo13b3o 74b3o7bo13b3o74bo3bo21boo3boo70bo4b3o16boo3boo73bo129bo3bo102bo11bo5bo 94boo3boo74bo107bo109bo11boo3boo70bo5boo17bo3bo75bo66boobboo3bo4bo4bo 33bo8boboo$1046bobo6bo14b5o14bo59bobo11boo9bo5bo70booboobboo4bo10bo5bo 85bobo11b5o72boo8bobo94bo12bo7bo5bo69bobo4bobboo13boo3boo72bobo127bo 106bobo91bo99bobo105bobboo105bobo92boobo17b3o75bobo25bo36b3o3bo3bobobb obob3o37b6o$1047b3o4boo13bobobobo13bo59bobo23bo3bo72bobo5bobbo102boob oo9bobobobo73boboo5boo10boo3boo71bo5bo10bobo83bobo3booboo15b5o73bobo 22boo3boo98bo5bo8boo3boo85bobo10booboboo73b3o11bo86bobo22boo3boo75bo3b o106bobo91boobbo95bobo24b3o35bobb8obobo3boo39bobbo$1048b3o3boo13boo3b oo10bobo61bo25b3o74bo7boo13bo3bo81bo3bobbo10boo3boo75boo4bo12boo3boo 72bo4boobo8boo8bo3bo71bo4b5o16bobo75bo125boboo4bo102bo91bobbo8bobo87bo 105bobboo15b5o87bo90bobobobo96bo3bo20b5o37bo8boboo$1049boo102boboo120b 3o82bo4bo94boo104bo19b3o181bo19bo3bo96bo18bo3bo181boo9boo92bo19bo3bo 77boo16bob3obo178bob3o11bo89b5o15boo3boo39b6o$1151boobooboo203bo3bo 201bo120b3o79bobbo18b3o97bo19b3o81bobbo201bobbo18b3o97bo3bo82b3o108bob o87bob5o16b5o40bobbo$1066bo5bo78boobbob4o222bo387bo3bo17b3o117b3o81bob oo201bo3bo17b3o98b3o79b5obo109boo85b3o4boobo14bo3bo$1064bobo4bo5boo73b 4obobboo20boo99boo97bo5boo99boo103boo99boo74bo3bo23boo118boo75boobo24b oo99boo75bo3bo23boo94bo4boo74bob5o22boo99boo73boboo4b3o13bobo3boo$ 1065boo4bobobbobbo74boobooboo18bobbo99boo73bo3bo19bobobbobbo89bobboobb obbo77bo25boo98bobbo74bobbo23boo92bo25boo75bobbo23bobbo96bobbo76bobbo 23boo98bobbo73b3o24bobbo99boo75b5obo16bobbobbo59bobbo$1052boo18bo3bo 79boobo197bo4bo20bo3bo75boo13bobo87bo125bo79bo118bo129bo75boo104bo98b oo24bo179b3obo99b5o82b6o$1047boo3b3o21bo85bo10boo77boo7bo21bo71bobbo3b o24bo70bo4boo14boo87boboo4bo17bo71b5o4bo18bo84bo19bo85bo4boobo25bo72bo 30bo75bobbo107bo19bo71boobbo23bo73bo104bobobobo21bo80bo3bo74boobo8bo$ 1047boo4b3o20bobo3bo78bobo9boo5boobo67bobbo5bobo19bobo69booboo28bobo3b o62boo5boobo20boobo80bo5bo15bobo70booboo3bobo17bobo3bo77bobo17bobo83bo 5bo27bobo70bobo29bobo3bo70b3o20boobo82bobo17bobo70bo3bo23bobo3bo66bobo 28boobo71bobboo22bobo82bobo16boobo49boobobobob8obbo27boo$1047bo6bobo 20bobo3bo77bobo18bobobboo61bo4boobbooboo18bobbobboo65bobo30bobo3bo61bo bo8boo20bobobboo75bo21bobbobboo64boobbo4bobo18bobo3bo76bobo17bobbobboo 84bo27bobbobboo65bobo30bobo3bo70bo23bobobboo77bobo17bobbobboo64boobbo 25bobo3bo65bobo30bobobboo66boboo23bobbobboo77bobo18bobobboo42b3o6bobo 3bo3b3o27boo$1048b3obbooboo20bo4bo78bo20bo4bo61bobboboob5o23boboo66bo 32bo4bo62bo7b3o22bo4bo76bo3bo20boboo67b3o4bo20bo4bo77bo22boboo79bo3bo 32boboo66bo32bo4bo95bo4bo78bo22boboo67bo27bo4bo66bo32bo4bo67boo5bo22bo boo78bo20bo4bo41bo4bobbobo3bo3boo$1048b3o3bobbo21b4o101bo66bo3boob3o 23boo104b4o70bobbo23bo81b3o19boo70b3o27b4o99boo84b3o31boo104b4o73boo 22bo103boo67bo32b4o96bo4bo75bobbo20boo104bo46b5obbob4obo3boboo$1055boo 127bobbo63bobbo210booboo21bobbo168b3ob3o433bobbo20bobbo169bo130bobo4bo bbo73boo127bobbo44bo4boo5boboboobbo4boobo42boo$1252b3o210booboo192bo5b o100b3o228b3o101boo94b3o97bo131boo218b3o35bo3boo3boboobboobboo5boboobo 19bo21boo$1468boo192bo4bo101boo228bo3bo196boo450bobbo34b5ob4obo14bo4bo 18bobo$1283boo182bo21boo170b6o252boo78bo3bobbo118boo525bo48bo8bobboobo booboo16bo3bo$1042boo15boo6boo78boo15boo9bo72boo15boo8boo6boo68boo15b oo6boo74boo15boo6boo8boo68boo15boo8boo72boo15boo8boo75boo15boo6bobo92b oo15boo6bobo7boo68boo9b3obbobo7bo74boo15boo8bo7boo68boo15boo6bobo73boo 15boo6bo79boo15boo8bo73boo15boo10bo75boo15boo5bo20bo39b3o3b3o3bobo6bob obobobo18b3o$1042boo15boo6bobo77boo15boo8boo72boo15boo7bobo76boo15boo 6bobo73boo15boo6bobbo76boo15boo7bobo72boo15boo8boo75bo16boo4bo3bo92boo 15boo4bo3bo77boo13bobbo7b4o71boo15boo8bobo75bo16boo4bo3bo73boo15boo4bo bo79boo15boo8bobo71boo15boo9bobo74boo15boo4bobo20bobo35bo6bo4bobbobobo 4bobobobo16boo3boo$1070bo102boo4boo92b3o4boo99bo101bo100b3o4boo91boo7b o93bo119bo97boo9b4o100boo96bo99bobo110boo97boobo94boo3bo58boobbobo7bo bboo3bobobooboo$1067bobbo101b3o4boo91b3o4bobbo95bobbo101bo99b3o4bobbo 89b3o7bo92bo4bo114bo4bo104bobbo100boo95bo4bo94bobbo110boo97booboo93boo 3bo46booboo18booboob3obbo3bobo41b3o$1070bo102boo98b3o5bo99bo101bo100b 3o5bo91boo101bo119bo108b4o100boo96bo99bobo110boo97boobo94boo3bo47bobo 6bo3bobobo4bobbo13bo$1060boo5bobo95boo7boobboo86boo6bobo94boo5bobo91b oo5bobbo94boo6bobo90boo7boo93boo3bo3bo110boo3bo3bo95boo6b4o89boo7bobo 93boo3bo3bo91boo3bobo97boo7bobo89boo8bobo92boo3bobo47bobbobbobbobo3bob 3o3bobo8boboboo42bobo$1059bobo5boo6bobbo85bobo8bo89bobo7boo93bobo5boo 6bobbo81bobo5boo95bobo7boo89bobo7boo4bobbo84bobo5bobo109bobo5bobo94bob o6bo6bobbo81bobo7bo94bobo5bobo90bobo5bo7bobbo85bobo7bo90bobo9bo92bobo 4bo48b3oboobob3o11bo9boo24bo21b5o$1059bo18bo85bo18boo80bo15b4o85bo18bo 81bo18boo84bo15b4o81bo18bo84bo15b4o100bo15b4o85bo18bo81bo18boo84bo15b 4o81bo18bo85bo18boo80bo15b4o85bo18boo38boboboboo15bo6bo25bo20boo3boo$ 1058boo14bo4bo83boo14boobo81boo14bo4bo83boo14bo4bo79boo14boobo85boo14b o4bo79boo14bo4bo82boo14bo4bo98boo14bo4bo83boo14bo4bo79boo14boobo85boo 14bo4bo79boo14bo4bo83boo14boobo81boo14bo4bo83boo14boobo39boboo3bobo13b obo5bobbo22bob3o16boo3boo$1074boobbobo17boo79boobbobbo21bo71bo3bobo21b o76boobbobo17boo75boobbobbo17boo78bo3bobo21bo72boobbobo20boo75bo3bobo 19bobo91bo3bobo19bobo76boobbobo18boo74boobbobbo18bo78bo3bobo19bobo72b oobbobo18bobo77boobbobbo18bo74bo3bobo20bo77boobbobbo17bo16bo3boo4bo7bo 4bo3bo4bo$1079boboo7bo5bo3bo83bobo20b4o70bo3bobo19boo81boboo7bo5bo3bo 79bobo8bo8bobo78bo3bobo19boo77boboo17bobo76bo3bobo17bobbo92bo3bobo17bo bbo81boboo16b3o78bobo18b4o76bo3bobo17bobbo77boboo14bo3bo82bobo18b4o72b o3bobo19bobo80bobo15bobo16boo7boo6b3o4bobo5boo29bo$1089bobo3bo5bo8boo 73bo20boobobo3boo70bo18boo4boobboo82bobo3bo5bo8boo69bo8bobobboo6bo7boo 74bo18boo4boobboo88b3o4boob3o73bo16boo10boo89bo16boo10boo82bobo9boobo 5boo69bo20b4o5boo74bo16boo10boo86bo12boo73bo20b4o5boo70bo22boo4boo73bo 9bo5bobo11boo13boo5bobobo4bo7boboboo21boboo18boo$1089bobobboobo3bo8boo 93b3obobbobboo70bo17b3o4boobboo82bobobboobo3bo8boo78bobobobbobbobbo7b oo74bo17b3o4boobboo87b3o4bobb4o73bo8bo5boo3bo8boo89bo8bo5boo3bo8boo82b o6bo4bobbo5boo90bobbo5boo74bo8bo5boo3bo8boo78b3o4bo4bo8boo94bobbo5boo 70bo22boo4boo82b3o3bobbo11boo4boo7boo4b3ob3o17bo20boo18booboo$1079bobb o7bo4bo5bo82boo20boobobo72bobbo18boo4boo76bobbo7bo4bo5bo78boo9bo3boo6b o80bobbo18boo4boo72bobbo7bo8b3o4boo74bobbo7bobo6boo5boo91bobbo7bobo6b oo5boo77bobbo12bo5boobo75boo14bo5b4o78bobbo7bobo6boo5boo73bobbo6b3o5bo 86boo14bo5b4o74bobbo22boo78boo7bo3bo3bobo17bo3boo4bo5bobobo12bo3bobo 30boo8bobbo$1079boo15bo3bo83boo21b4o74boo9bo10boo81boo15bo3bo79boo18bo bo82boo9bo10boo77boo9bo9bobo80boo7bo3bo6bobbo4bo91boo7bo3bo6bobbo4bo 76boo9bo4bo3b3o78boo14bo4b4o80boo7bo3bo6bobbo4bo72boo7bo3bo4bo3bo82boo 14bo4b4o76boo20bobo80boo9bo6bobo17boboo3bobo6b3o13bobobooboo28boo11bo$ 1098boo95bo12bo86b3o10bo100boo100boo93b3o10bo87bobo9boo90b3o8bobo106b 3o8bobo94boo5boo100bo93b3o8bobo85bo5bo5bobo103bo101bo90bo5bo5bo18bobob oboo8bo5bobo7bobobobo14boo3boo18bo$1087boo3boo100b3o98b3o100boo3boo94b oo3boo100b3o97booboo98boo3boo113boo3boo304boo3boo95bo3bo305bo5bo21b3ob oobob3o14boo5bobobobobo14boo3boo19boo$1087bo5bo99b5o200bo5bo94boo3boo 199bo5bo631b3o204bo102bo3bo22bobbobbobbobo9boo3bo6boobobooboo14b5o7bo$ 1192bobobobo94boo3boo200b5o99boo3boo97bo325boo3boo508b3o102b3o24bobo6b o10bo14bo4bo16bobo9bo$1088bo3bo99boo3boo94boo3boo99bo3bo97bobo100boo3b oo94boo3boo424b5o306b5o96b5o127booboo17b3o11boboobo26b3o11boo3boo$ 1089b3o308b3o632bo3bo95bob3obo304bob3obo94boo3boo150bo12boobo17b3o22b 5o$1501b3o532b3o97bo3bo306bo3bo96b5o158bobo50b3o$1195bo100bo310bo99bo 328b3o98b3o308b3o97bo3bo159boo51bo$1194bobo98bobo308bobo98bo430bo310bo 99bobo160bo$1194bobo97boo309boo99bo843bo199b3o3b3o$1195bo98boo309boo$ 1195boo97b3o308b3o1130boo14bo$1090boo103boo98bobo103boo99boo102bobo99b oo102boo118boo103boo99boo103boo99boo103boo99boo103boo60bobo18boo14bo$ 1090boo103boo99boo103boo99boo103boo99boo102boo118boo103boo99boo103boo 99boo103boo99boo103boo61boo34bo$2718bo$2749boo14boo$2749bo15boo$2750b 3o$849boo1843bo28bobo26bo$845boobboo1843b4o26boo$844bobo1831bo16b4o5b oo18bo21bo$841bo3bo1831bobo5boo8bobbo5boo36boobboob3o$841boo1827boo3b oo3bo14b4o21boo20boo4b4o$840boobo3boo1821boo3boo3bo4boboboo3b4o22bo25b oo$839bobb3obbo1827boo3bo5boo3bobbo19boo5b3o5bobo$838bobobo5b3o1826bob o10bo23boo7bo6boo$837bobobo8bo1827bo8bobbo39bo$835b3obbo1899boo$836bob oo1873b3o24bobo$837boo1874boo18boo7bo$838bo300boo11boo19bobbo1520bo18b oo15boo7boo$1138bobbo9bobbo18b6o1518bo10boo5b3o$1138bobo3booboo3bobo 15bo8boboo1525bobo3bobo$1136boobbobo7bobobboo10bobb8oboboboboo1504boo 6booboo6bo3boo$1137bobobo4bo4bobobo11b3o7bobo3boob3o1502boo5bo4bo6boo$ 1136bobboobb7obboobbo13boo3bo3bobb3o4bo1508boobbo$1136boo5bobobobo5boo 10boobo3bob4oboo3b3o1511bo$1145bobo19bobbo4bo5bo3bobo$1127bobboo9b3o5b 3o17boobboobboobo8bo$1126bobobbobbo5bobobo3bobobo7bo3boo5b3o4bob4ob5o 1506boo$1126boboobobobo4boobb5obboo6bobobobo3b3obo4bo4boo1511boo$1125b oobobbobobbo22bobobo6booboo4b3ob5o$1125bobboboobbo23booboboo5booboboo 4boo5bo1496bo61bobo$1126b3obobo3b3o6bo12bobbobo5bo3boboo6b5o1494b4o3bo boo55boo$1128boobo5boo5b3o9boobobobboobbo4bobo5bobboo5boobo1486b4o4bob oboobboo49bo$1124bobobbobo3bobbo16boboo3b3o4bobobbo6bob3o5boboo1479boo 5bobbo3booboboobbobo$1124boobbooboboobb3o8boo5bo4boobobo8b3o3boo13boo 1477boo5b4o3boo8b3o$1130boobo3boo3bo4bo5boob3obo4bo10bo15boo3bo1484b4o 3boo8b3o6boo$1124b5o4bo8bo11bo3bobo3boo6bo7boo5boo3boboobo1487bo12b3o 7boo43bobo$1123bo4bob3o12bo5bobbo3boboobboo5bobbo12bobo5boo1500bobo54b oo$1123boboobobo6boo4b3o3boobob3obobo3boo4b3ob3obb3o7bo4bo1502boo55bo$ 1122boobobbo6b4o13bo4boobo4bo5bobobo11bo3bobbo$869boo5boo245bobobobo5b oobbo12boboo4boobobo6b6o5bo5boboboo$870bo5boo245boboboobobbo10boo7bobo boo3b3o8bo3bo5bobo3bo4bo$870bobo249booboobboo3b4o12bo5boobobobboo11bo 5bo4bo4b3o1563bobo$871boo252bobb3obbobboo13bo6bobbobo25bo4bo1565boo$ 875boo248boboboo5bo5bo6b3o6booboboo7bo7boo7boboboo1565bo$874bobo247boo bobboobobbo5bo16bobobo7bo5boobo6bo3bobbo$875bo250bo3boobbobbo4bo16bobo bobo5b3o3bo11bo4bo$871bo254bobo7bo23bo3boo12bo8bobo5boo$1125booboo10b 3o13bo18b3o9boo3boboobo1567bobo$869b3obo258boo4b7o4boo6bo17bo16boo3bo 1568boo$868boboo260bobbobbooboboobbobbo4b3o8bo28boo1569bo$868boobo261b oob4o3b4oboo15bo25boboo$866bob3o259b3obbo11bobb3o12b3o23boobo$1129bo3b ooboo7booboo3bo$868bo261bobo3boo7boo3bobo9bo1608bobo$1129boob3o3bo5bo 3b3oboo9bo9boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo61boo$1130bo5boo7boo5bo8b3o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b 4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o8b4o 8b4o8b4o60bo$1130bob4o11b4obo19booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7booboo7boob oo7booboo7booboo7booboo$1131boobbo11bobboo14bo7boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo 10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo10boo$1160bo5b oo$1158b3o4bobo1549bo$1136boo8bo10bo1559boo$1135bobo7bobo9boo1551bo5bo bo$1131boobbobboob3ob3o29booboo1526b3o$1131boboboobo3booboo13bo10bo6bo bo1505boo8bo10bo$1133bo4boboobobobo12boo8bobooboobobbo1503bobo7bobo9b oo$1132bobobob3obo4bo7bo3bobo8bo3bobobb3o1499boobbobboob3ob3o13bo15boo boo$1132bo3bo3bo5boo6boo1525boboboobo3booboo14boo8bo6bobo$1131booboo 10boo7bo8bo5boboo4boo1503bo4boboobobobo12bobo7bobooboobobbo$1132bo3bo 3bo5boo15bo5boo4b4obo1501bobobob3obo4bo6b3o13bo3bobobb3o$1132bobobob3o bo4bo14b3o4bo9boo1501bo3bo3bo5boo6bobo$1133bo4boboobobobo15bo5bobbo 1508booboo10boo6b3o13boboo4boo$1131boboboobo3booboo17bo4bo9boo1501bo3b o3bo5boo14boo5boo4b4obo$1131boobbobboob3ob3o11bo9boo4b4obo1501bobobob 3obo4bo13b3o5bo9boo$1135bobo7bobo3bob3o3bobo8boboo4boo1503bo4boboobobo bo14boo5bobbo$1136boo8bo3bobobo4bobbo1518boboboobo3booboo22bo9boo$ 1159booboob3obbo3bobobb3o1499boobbobboob3ob3o11bo9boo4b4obo$1148boobbo bo7bobboo3bobooboobobbo1503bobo7bobo3bob3o3bobo8boboo4boo$1147bo6bo4bo bbobobo4bo6bobo1505boo8bo3bobobo4bobbo$1148b3o3b3o3bobo14booboo1527boo boob3obbo3bobobb3o$1157bo8bo1531boobbobo7bobboo3bobooboobobbo$1146b5ob 4obo1539bo6bo4bobbobobo4bo6bobo$1146bo3boo3boboobboobboo1531b3o3b3o3bo bo14booboo$1148bo4boo5boboboobbo1538bo8bo$1147b5obbob4obo3boboo1527b5o b4obo$1146bo4bobbobo3bo3boo1530bo3boo3boboobboobboo$1147b3o6bobo3bo3b 3o1529bo4boo5boboboobbo37boo$1149boobobobob8obbo1528b5obbob4obo3boboo 36bo3bo$1153boobo8bo1530bo4bobbobo3bo3boo23boo13bo5bo3boo40boo$1157b6o 1534b3o6bobo3bo3b3o20boo13bo3boboobboo40bobo$1159bobbo1536boobobobob8o bbo11boo3bo6boo10bo5bo47bo$2703boobo8bo14bobo3bo5b3o10bo3bo48boo$2707b 6o18b5o6boo12boo$2709bobbo19b3o4boo9bobo$2739boo10boo$2751bo5$2758bo$ 2759boo$2747boo9b3o5boo$2747boo10b3o4bo3boo$2760bobobobo3boo$2761boob oo$$2770b3o$2748boo21boo$2747bobo18boo$2737bo11bo18b3o$2737bobo29bobo$ 2740boo9boo17boo$2726boo12boo9boo4b3o$2726boo12boo6boo6b5o$2737bobo7b 3o5bo3bobo$2737bo10boo6bo3boo$2751boo$2751boo9$2777b3o$2776bobbo$2779b o$2779bo$2776bobo$$2783b3o$2782bobbo$2785bo$2749boo34bo$2749b3o30bobo$ 2735bo15boobo5boo$2733bobo4b3o8bobbo5boo27b3o$2726boo4bobo16boobo33bo bbo$2726boo3bobbo7bobboobb3o39bo$2732bobo7bo3bobboo19boo19bo$2733bobo 6bobbo23bobo16bobo$2735bo8boo22b3o$2768boo25b3o$2771boo21bobbo29boo$ 2770b3o24bo28bobo$2753bo43bo18boo7b3o12bo$2751bobo10boo28bobo19boo6b3o 8boo3b4o$2752boo10bobo3boo53b3o8boo3b4o5boo$2747boo17bo3boo54bobobboob oboo3bobbo5boo$2747boo17boo38boo19boobboobobo4b4o$2806bobbo23boobo3b4o $2840bo$2755bo50bobbo$2755boo48bobbo$2754bobo48bobo18bo$2806bo17boo$ 2812boo11boo$2741boo63boo3bobo$2740b3o3boobo56boo3bo10bo6boo$2737boboo 5bo3bobbo56boo10bo6boo$2730boo5bobbo4bo4bobboo61bo5bo$2730boo5boboo4b 4o5boo60bo$2740b3o3bo7b3o7boo50bo$2741boo11boo8boo54bobbo$2753boo63boo bobbo$2753bo67bo$$2835boo$2835bobo$2753bo71bo4boo4b3o$2753boo69boboboo bbo4b3o6boo$2741boo11boo8boo57bo3bob3o4b3o7boo$2740b3o3bo7b3o7boo46boo 9bo3boboo4bobo$2730boo5boboo4b4o5boo56boo9bo3boo6boo$2730boo5bobbo4bo 4bobboo69bobo$2737boboo5bo3bobbo71bo$2740b3o3boobo$2741boo3$2754bobo$ 2755boo$2755bo3$2747boo17boo$2747boo17bo3boo$2752boo10bobo3bobo$2751bo bo10boo5b3o$2753bo18boo$2769boo$2769b3o$$2735bo8boo$2733bobo6bobbo24b oo$2732bobo7bo3bobboo19boo$2726boo3bobbo7bobboobb3o$2726boo4bobo16boob o$2733bobo4b3o8bobbo5boo$2735bo15boobo5boo$2749b3o$2749boo5$2777bo$ 2778bo$2776b3o7$2794bo$2793boo$1048boo1743bobo$1048boobboo$1052bobo$ 1053bo1726b3o$2782bo$1050boo4boo1723bo$1051bo4boobo$1048b3o9bo$1048bo 8bo$1058boboo$1060boo$$2793bo34bo$2792b3o32boo$2750bobo39boboo20boo8b oo11boo$2749bobbo40b3o20boo7b3o7bo3b3o$2739bo8boo10boo31boo31boo5b4o4b oobo5boo$2738bobo5boo3bo8boo65boobbo4bo4bobbo5boo$2726boo10boobo6boo5b oo42bo6boo20bobbo3bo5boobo$2726boo10booboo6bobbo4bo40b3o5boo24boboo3b 3o$2738boobo8bobo17boo26boboo37boo$2738bobo29boo27b3o5bo$2739bo9bo49b oo5bobo$2750bo54bobbo16bobo$2748b3o18b3o32bobbo17boo$2769boo41boo12bo$ 2772boo30bobbo3bobo$2764boo5b3o32boo3bo6b3o8boo$2764bobo3bobo37boo17b oo$2747boo17bo3boo44bo5bo$2747boo9bo7boo48bo5bo$2757b3o56bo6bo$2756boo boo62boo$2757b3o58b3o3bo$2758bo63bo$2823bo$2835bo$2751boo82boo$2739bob o10boo70bo5boo4boo$2734bo4bobbo8bo72bobo3boo4b3o7boo$2735boo5boo11boo 68bobobboo4boo8boo$2730boo8bo3boo8bobo55boo11bobbo6boo$2730boo10boo9bo 6boo50boo11bobo7bo$2739bobbo10bobbobbobboboo58bobo$2739bobo11bo6boobb oo58bo$2754bobo$2755boo4$2756bo$2756bobo$2739bo17bobo4boo$2739boo16bo bbo3boo$2730boobboo4boo15bobo$2730boobboo4b3o13bobo$2734boo4boo7bobo4b o$2739boo9boo$2739bo10bo$$2758bo$2758bo$2758bo$$2760b3o$2755boo$2747b oo6b4o7boo$2747boo9bo7bo3boo$2755bo8bobo3boo$2755bo8boo$$2770b3o$2771b oo$2747boo19boo$2729bo5boo9bobo19b3o$2727bo3bo3b3o10bo20bobo$2731bo5b oobo11bo17boo$2726bo5bo4bobbo10boo$2726boo9boobo9boo4boo$2735b3o11b3o 4boobboo$2735boo13boo4boobboo$2751boo$2752bo5$2777b3o$2776bobbo$2779bo $2779bo$2776bobo$$2783b3o$2782bobbo$2785bo$2785bo$2782bobo$$2789b3o$ 2788bobbo$2791bo$2791bo$2788bobo$$2795b3o$2794bobbo$2797bo$2797bo$ 2794bobo$2826bo$2826b4o$2816boo9b4o7bo$2816boo9bobbo6bobo$2821bo5b4o4b oo3bo9boo$2821bo4b4o5boo3bo9boo$2806boo18bo8boo3bo$2806bobbo27bobo$ 2838bo$2806bobbo17bobo$2805bobbo18boo$2805bobo20bo$2806bo$2812boo$ 2749boo55boo3bobo$2749bobo54boo3bo17boo$2736bobo13bo7boo48boo6b3o8boo$ 2735bobbobboo6bobbo7boo55bo3bo$2726boo6boo5bobo8bo64bo3bo$2726boo4boo 3bo3bo3bo3bobo65bo3bo$2734boo5b3oboobboo19boo46b3o$2735bobbo3boo25bobo $2736bobo29b3o$2768boo54b3o$2771boo51bo12bo$2752bo17b3o52bo8b4o4bo$ 2750bobo68boo10b4o5bo$2751boo11boo55bobo9bobbo9boo$2764bobo3boo44boo4b 3o8b4o9boo$2747boo17bo3boo40b4obbo4b3o8b4o$2747boo5b3o9boo44b3oboo4b3o 12bo$2821bobo$2760b3o58boo$$2754bo3bo$2754b3obo63boo$2753boboobo62bobo $2811boo7b3o12bo$2741boo68boo6b3o8boo3b4o$2740bobo77b3o8boo3b4o5boo$ 2739bo6boo4bo68bobobbooboboo3bobbo5boo$2730boo7bobbobbobbobbobo68boobb oobobo4b4o$2730boo7bo6b3oboboo74boobo3b4o$2740bobo6booboo10boo69bo$ 2741boo7boboo10boo$2751bobo$2752bo68bo$2819boo$2820boo3$2809boo17boo$ 2805boo3bo17boo$2805boo3bobo$2805boo4boo$2805bo19boo$2804bobo18boo$ 2804boboo$2813bo$2813bobo14bobbo8bo$2805boo6boo15bo10bobo$2805boo19bo bbo3boo5bo3boo$2823b4o3boobobo4bo3boo3boo$2822b4o14bo3boo3boo$2815boo 5bobbo8boo5bobo$2815boo5b4o16bo$2823b4o$2826bo8$2822bo$2787boo33boo$ 2788boo23boobboo4boo13boo$2787bo25boobboo4b3o11b3o$2817boo4boo9boboo9b oo$2809boo11boo10bobbo4bo5bo$2803boo4bobo10bo11boboo5bo$2803boo4bo16bo 10b3o3bo3bo$2826bobo9boo5bo$2826boo$2802boboo$2802bobo18boo$2803bo19b oo$2803boo4boo$2803boo3bobo$2803boo3bo17boo$2807boo17boo$2816boo$2753b oo60boo$2752bo3bo60bo$2736boo13bo5bo3boo$2736boo13bo3boboobboo$2727boo 3bo6boo10bo5bo$2727bobo3bo5b3o10bo3bo$2728b5o6boo12boo16boo51bo10bo$ 2729b3o4boo9bobo21boo50boo9boo$2736boo10boo68bo4bobo7boo4boo$2748bo67b obo13b3o4boobboo$2770boo43bobo15boo4boobboo$2770boobo35boo3bobbo16boo$ 2773bo35boo4bobo17bo$2765boo6bo42bobo$2755b3o7bobobbobbo44bo$2748boo9b oo6bo3boo$2748boo5b4o8boo$2762bo$2762bo57boo$2762bo56bobo$2809boo7b3o 12bo$2758b3o48boo6b3o8boo3b4o$2818b3o8boo3b4o5boo$2819bobobbooboboo3bo bbo5boo$2739boo79boobboobobo4b4o$2737bo3bo5bobb3o73boobo3b4o$2736bo5bo 9bo3bo76bo$2731boobboobo3bo8bo4bobo$2731boo3bo5bo16boo60boo$2737bo3bo 17boo4boo54boo$2739boo18boo4boo$2756bobo$2756bo61bo$2816bobboo$2807boo 6bo4bo5boo$2803boo3bo6booboo6boo$2803boo3bobo$2809boo10bo$2821bo$2802b 3o$2802boo$2805boo$2804b3o21bobbo8bo$2803bobo22bo10bobo$2803boo19bobbo 3boo5bo3boo$2821b4o3boobobo4bo3boo3boo$2820b4o14bo3boo3boo$2813boo5bo bbo8boo5bobo$2813boo5b4o16bo$2821b4o$2824bo4$2822bo$2821bobo$2809boo 10boobo7boo$2809boo10booboo6bobo$2821boobob3o6bo7boo$2821bobobbobbobbo bbo7boo$2822bo4boo6bo$2832bobo$2832boo$$2777b3o39bobo$2776bobbo39boo$ 2779bo40bo$2779bo$2776bobo$$2783b3o21boo17boo$2782bobbo17boo3bo17boo$ 2785bo17boo3bobo$2785bo23boo9bo$2764bobo15bobo35bobboo$2764bobbo34b3o 8bo9boo$2755boo10boo20b3o10boo8bo$2755boo8bo3boo5bo11bobbo13boo5b3o$ 2760boo5boo6bobo13bo12b3o29bobo$2759bo4bobbo6bo3bo12bo11bobo25boo3bobb o$2764bobo8b3o10bobo12boo19boobboob3o5boo$2773boo3boo43bobo3bo3bo3bo3b oo4boo$2795b3o24bo8bobo5boo6boo$2794bobbo15boo7bobbo6boobbobbo$2797bo 15boo7bo13bobo$2797bo25bobo$2794bobo27boo4$2818boo$2818b3o$2775boo32b oo9boobo8bo$2775boo32bo5bo4bobbo6bobo$2814bo5boobo5bobo11boo$2810bo3bo 3b3o7bobbo11boo$2812bo5boo9bobo$2830bobo$2822bo9bo$2820boo$2821boo4$ 2771bo$2769bobo$2761boo4boo38boo4bobo10boo$2761boo4boo34boo3bo4boo11b oo$2767boo34boo3bobo3bo$2769bobo37boo$2771bo$2802b3o$2782bo19boo$2781b 3o21boo$2780b5o19b3o29bo$2779boo3boo17bobo30boo$2780b5o18boo20bo5boo4b oo$2780bo3bo40bobo3boo4b3o7boo$2781bobo42bobobboo4boo8boo$2782bo30boo 11bobbo6boo$2813boo11bobo7bo$2825bobo$2781boo42bo$2781boo3$2817boo$ 2815bo3bo$2809boo3bo5bo13boo$2809boobboobo3bo13boo$2814bo5bo10boo6bo3b oo$2815bo3bo10b3o5bo3bobo$2817boo12boo6b5o$2822bobo9boo4b3o$2780bo41b oo10boo$2779bobo6bo34bo$2767boo9bo3boo3bobo$2767boo9bo3boo3bobo$2778bo 3boo4bo$2779bobo$2780bo35bo$2785booboboo22boo$2785bo5bo15boo5b3o9boo$ 2786bo3bo12boo3bo4b3o10boo$2787b3o13boo3bobobobo$2809booboo$$2802b3o$ 2802boo21boo$2805boo18bobo$2804b3o18bo11bo$2803bobo29bobo$2787boo14boo 17boo9boo$2787boo26b3o4boo9boo12boo$2814b5o6boo6boo12boo$2813bobo3bo5b 3o7bobo$2813boo3bo6boo10bo$2822boo$2822boo6$2782bo$2782boo$2773boobboo 4boo$2773boobboo4b3o$2777boo4boo$2782boo10bo$2782bo10b3o$2793b3o$$ 2791boo3boo$2791boo3boo3$2794bo$2793bobo$2795boo$2795boo$2794b3o$2793b obo$2793boo!golly-2.5-src/Patterns/Life/Signal-Circuitry/Turing-Machine-3-state.rle0000644000175100001440000027454412156145314022676 00000000000000#C 3-state, 3-symbol Turing machine: Paul Rendell, 3 February 2000 #C http://rendell.server.org.uk/gol/tm.htm x = 1714, y = 1647, rule = B3/S23 247boo$248bo$248bobo$249boo6$257boo$256boo$258bo5$265bo$264boo$264bobo 6$272boo$271boo$273bo5$280bo$279boo$279bobo6$287boo$286boo$288bo3$244b oo$242bobbo$241bo15bobo35bo$233boo6bo10b3obbo3bo32boo$233boo6bo19bo32b obo$242bobbobboo7bo4bo4boo$244boobbobbobo7bo5boo$249b3o5bo3bo$257bobo $$302boo34boo$242bo58boo36bo$241bo61bo35bobo9bo$241b3o96boo8bobo$349bo 3boo6boo$349bo3boboo4bobo$349bo3bob3o4b3o$272boo36bo39boboboobbo4b3o$ 272bo36boo40bo4boo4b3o$234bo34boobo36bobo49bobo6boo$234bobo34bo89boo7b obo$234boo31bo104bo$269bo102boo$268bo$$317boo$227bo88boo$226bo91bo$ 226b3o31boo$259bobo13boo19boo$261bo14bo19bo58bo$276bobo8boo5bobo57boo$ 277boo8boo5boo29bo21bo6bobo$103bo180boo38boo19b3o$103b3o113bo63b3o38bo bo17bo27bo$106bo112bobo62boo58boo26b3o$105boo112boo31b3o32boo8b3o75bo$ 254bo32boo9bo56bo18boo$108bo144bo44bo54b3o6boo$258bobbo4bobbo27b3o42bo 9bo8boo$256b3obb6obb3o60boo7b3o8boo9bo$212bo45bobbo4bobbo27b3o31boo8b 3o$211bo85b3o33bo$211b3o31boo92boo3boo3b3o$115bo128bobo26bo23b3o39boo 3boo3b3o$114boo130bo25b3o23bo49bo3bo17bo5b3o$114bobo154bobobo22bo58bo 11boo4bo3bo$271bobobo21b3o39boo6boo3boo3b3o9bobobbo5bo$272b3o63bobo19b o14bo3bo$204bo68bo63boo20boo15b3o$204bobo131boo36b3o$204boo31b3o98boo 22bo$122boo115bo33bo67b3o3b3o11b3o$121boo115bo33b3o76boo7bo3bo14boo$ 123bo147bobobo75boo6bob3obo6boo5bo$271bobobo76boo6b5o6bobo6b3o$197bo 74b3o75bobo20bo8bo$196bo76bo50bo12boo3boo6boo$196b3o31boo92bo$130bo98b obo13boo19boo55b3o12bo3bo$129boo100bo14bo19bo72b3o3boo3boo$129bobo114b obo8boo5bobo24b3o45b3o3boo3boo$247boo8boo5boo26bo30b3o31bo6b3o$254boo 36bo31bo22b3o8boo6bo$189bo63b3o35b3o30bo12boo8b3o7boo6bo$189bobo62boo 68bo13bo9bo$189boo31b3o32boo8b3o21b3o30bo10b3o$137boo85bo32boo9bo22b3o 29b3o9bo22b3o$136boo85bo44bo89b3o$138bo89bobbo4bobbo27b3o21b3o51boo5bo 4bo3bo5boo$226b3obb6obb3o50bo30b3o20bo4bo4bo5bo3boo$182bo45bobbo4bobbo 27b3o22bo31bo18b3o5b3o3bo3bo6bo$181bo85b3o21b3o30bo18bo14b3o$183bo31b oo$145bo33bo34bobo26bo23b3o58bobboboobobbo$144boo32boboo34bo25b3o23bo 58boobbo4bobboo$144bobo31bo62bobobo22bo59bobboboobobbo35bo$177boo62bob obo21b3o74bo29boo$242b3o64bobo32bobo27bobo$243bo65bobbo31boo$121bo190b oo47boo$121b3o83b3o100bo3boo45bo$124bo27boo55bo33bo68boo48b3o$123boo 26boo22boo31bo33b3o57boo5bobbo6boo43bo$153bo21bo65bobobo55bobo5bobo7bo bo15bo44boo$163boo8bobo65bobobo55bo19bo14bo44boo$161bo3bo7boo67b3o55b oo19boo13b3o44bo$152bo7bo5bo76bo50bo$125b3o24bobo4boobo3bo33boo92bo$ 124bo3bo26boo3bo5bo32bobo13boo19boo55b3o$141boo12boo4bo3bo25boo8bo14bo 19bo$123bo5bo11boo12boo6boo26bo24bobo8boo5bobo24b3o126bo34boo$123boo3b oo22bobo28boo3boobo25boo8boo5boo26bo30b3o33bo59boo35bo$152bo29bo3bo3bo 33boo36bo31bo34bobo57bobo34bobo8bo$166boo13bo41b3o35b3o30bo34boo96boo 8bobo$128boo36boo13bo3bobbo35boo68bo143bobo7bo$128bobo38boo10bo5bo4b3o 32boo8b3o21b3o30bo143bobbo6boo$130bo10boo26b3o10bo3bo7bo32boo9bo22b3o 29b3o142bobobboo4boo$129boo9boo27boo12boo8bo44bo120boo76bobo3boo4b3o$ 126bo15bo16boo5boo9bobo18bobbo4bobbo27b3o21b3o58bo36bo37boo38bo5boo4b oo$126bobbo28bobo5boo10boo16b3obb6obb3o50bo30b3o25bo35bobo36boo50boo7b oo$126bo31bo19bo19bobbo4bobbo27b3o22bo31bo26b3o33boo39bo49bo8bobo$157b oo78b3o21b3o30bo59boo79boo22bo$185boo5bo160bobo78bo24boo$125booboboo 17bo16boo16bobo5b4o17bo23b3o58bobboboobobbo45bo$148boo17bo18bo6b4o15b 3o23bo58boobbo4bobboo125bo$125bo5bo16bobo16bobo5bobo15bobbo14bobobo22b o59bobboboobobbo95bo$168boo5bobbo14b4o14bobobo21b3o74bo89boo28boo$126b ooboo47boo12b4o4boo10b3o64bobo32bobo87bobo$128bo47bo3boo10bo7bobo10bo 65bobbo31boo$178boo22bo79boo62b3o13boo19boo$175bobbo8boo13boo76bo3boo 62bo14bo19bo$130boo24boo17bobo8boo25bo68boo63bo15bobo8boo5bobo58boo$ 130bo24boo23bo7bo23b3o57boo5bobbo6boo73boo7bobo5boo51bo6boo$131b3o23bo 21bo31bobobo55bobo5bobo7bobo15bo64b3o37boo18b3o8bo$133bo45b3o29bobobo 55bo19bo14bo64b3o37boo18bo27bo$212b3o55boo19boo13b3o63b3o9b3o26bo17boo 26b3o$213bo50bo74boo32bobo86bo$195bo68bo73bobo33boo7bo3bo54bo18boo$ 164bo29boo67b3o74bo5boo6boo27bo3bo52b3o7bo$163boo29bobo148bobbo4bobbo 82bo9boo$163bobo6bo58b3o110b6obb6o26b3o33bo8bo9boo8bobo$151boo19bobo 57bo30b3o33bo45bobbo4bobbo62boo7b3o$152bo19boo58bo31bo34bobo44boo6boo 63bobo5b5o$152bobo8bo67b3o30bo34boo83b3o39bobobobo$153boo8bobo98bo66b 3o92boo3boo3b3o$164bobo35boo27b3o30bo68bo26bo22bo3bo47booboo$164bobbo 33boo28b3o29b3o66bo26b3o21bo3bo47booboo4bo12boobboo3boo$164bobo36bo 154b5o63boo7b5o4b3o9boo5b3o$163bobo4boo59b3o58bo91b3o39boo6boo3boo6bo 10bo3bo3bo$163bo6bobo59bo30b3o25bo133bo20boo15bobo$172bo59bo31bo26b3o 131b3o36bo$172boo57b3o30bo59boo103bo6boo$210bo112bobo99b5o5b5o8b3o$ 209boo57bobboboobobbo45bo101boo6bo12b3o15boo$209bobo55boobbo4bobboo77b 5o74b3o7bo3bo14bo$268bobboboobobbo79b3o77bo18b3o6b3o$284bo75bo63boo3b oo6boo7boo3boo7bo8bo$249bobo32bobo138b5o7boo20bo$249bobbo31boo125bo13b ooboo$252boo62b3o13boo19boo55b3o12booboo$217boo31bo3boo62bo14bo19bo24b 3o28bobobo12b3o3boo3boo$216boo34boo63bo15bobo8boo5bobo55bobobo18bobobo bo$218bo23boo5bobbo6boo73boo7bobo5boo24bo3bo28b3o20b5o5bobo5boo$241bob o5bobo7bobo15bo64b3o32bo3bo29bo22b3o7boo4bobo$241bo19bo14bo64b3o80boo 9bo8bo7bo$240boo19boo13b3o63b3o9b3o21b3o44bo$309boo32bobo65bo10b3o$ 225bo82bobo33boo7bo3bo52b3o9bo23bo$224boo84bo5boo6boo27bo3bo20b3o28bob obo31bobo$224bobo88bobbo4bobbo82bobobo18boo5bo4bo3bo6bo$314b6obb6o26b 3o20bo3bo28b3o20bo5bobo3b3o6boo$269bo45bobbo4bobbo50bo3bo29bo18b3o6boo bboo3boo4bobo$269bobo44boo6boo104bo$269boo83b3o21b3o$266boo33b3o111bo bbo4bobbo$232boo31bobo35bo26bo22bo3bo55b3obb6obb3o$231boo32bo36bo26b3o 21bo3bo57bobbo4bobbo5bo$233bo30boo62b5o98bo30boo$354b3o39boo33b3o27boo $396boo65bo$208bo190boo47boo$208b3o83boo103b3o46bo$211bo28bo52bobo103b oo48b3o$210boo27boo21boo31bo93boo5boo8boo43bo$239bobo20bo65b5o55bobo5b oo8bobo15bo45bo$250bo9bobo66b3o56bo19bo15bobo42boo$249bobo8boo68bo56b oo19boo14boo43bobo$238bo8boo3bo$233bo4b4o5boo3bo128bo$212b3o18bo5b4o4b oo3bo33b3o13boo19boo55b3o$211bo3bo12boo9bobbo6bobo26boo8bo14bo19bo24b 3o28bobobo$210bo5bo11boo9b4o7bo27bo8bo15bobo8boo5bobo55bobobo33bo94boo $210booboboo21b4o29bo4bobo25boo7bobo5boo24bo3bo28b3o33bo60boo34bo$238b o31bobo3boo34b3o32bo3bo29bo34b3o57boo35bobo6bobo$253boo14bo3boo36b3o 164bo35boo6bo3bo$216bo36bobo13bo3boo37b3o9b3o21b3o175bo7bo$215boo37b3o 12bo3boo4boo32bobo65bo140bo4bo4b4o$229bo25b3o12bobo5bobo33boo7bo3bo52b 3o143bo4boboboo$214boboo10boo24b3o7bo6bo8bo5boo6boo27bo3bo20b3o28bobob o62boo74bo3bo3bobbob3o$213bobboo10bobo15boo5bobo9boo18bobbo4bobbo82bob obo25bo36bo38bo36bobo6boboboo$213b4o28bobo5boo9boo18b6obb6o26b3o20bo3b o28b3o26bobo32bobo37boo46b4o8boo$245bo39bobbo4bobbo50bo3bo29bo27boo33b oo38bobo47bo9bobo$244boo40boo6boo227bo22bo$212boo3boo53bo5boo44b3o21b 3o89b3o79boo22boo$215bo37boo16bobo4b3o104bobbo4bobbo45bo$212bo5bo17boo 16bo19bo5boobo16bo22bo3bo55b3obb6obb3o42bo80bobo$213booboo17boo17bobo 5boo7boo7bobbo15b3o21bo3bo57bobbo4bobbo5bo118boo$214bobo20bo17boo5boo 16boobo14b5o98bo90boo29bo$215bo49boo11b3o6boo35b3o39boo33b3o87boo$215b o49b3o10boo7bobo76boo125bo$265boo22bo79boo62boo14boo19boo$262boo11bo 13boo78b3o60bobo15bo19bo$217boo25bo17boo10boo93boo63bo15bobo9bo5bobo 59bo$217bo25boo22bo6bobo82boo5boo8boo73boo8boo5boo51bo7boo$218b3o22bob o21bobo28b5o55bobo5boo8bobo15bo65boo38bo18b3o7bobo$220bo46boo30b3o56bo 19bo15bobo62b3o37boo17bo27bo$300bo56boo19boo14boo64boo3boo32bobo16boo 26b3o$461boo8b3o75bo$351bo73b3o34bo7bo3bo54bo18boo$282boo66b3o74bo6bo 6bo28bo3bo52b3o$251boo7bo20boo35b3o28bobobo72bo6boo6boo28b3o52bo10boo$ 250boo7bo23bo65bobobo33bo44b3o6b3o82boo8boo$238boo12bo6b3o55bo3bo28b3o 33bo46boo6boo64boo7bo21bo$239bo77bo3bo29bo34b3o45bo6bo64boo7b3o$239bob o6bobo257bo5b5o$240boo6bo3bo65b3o97boo51b3o39boo3boo3b3o22booboboo$ 252bo37bo60bo65bobo50bo3bo$248bo4bo35boo59b3o66bo27bo22bo3bo48bobo5bo 13bobbo5bo$252bo36bobo26b3o28bobobo92b3o22b3o39boo7b5o4b3o10boo$248bo 3bo4boo90bobobo25bo65booboo62bo8boo3boo6bo9bobobbooboo$248bobo6bobo57b o3bo28b3o26bobo62b3ob3o64bo5boo3boo5boo16bo$259bo57bo3bo29bo27boo63b3o b3o61bobbo$259boo183b3ob3o61booboo$318b3o89b3o31b3ob3o63boo7boo$297boo 56bobbo4bobbo45bo32booboo72booboo8b3o15boo$296boo55b3obb6obb3o42bo34b 3o74bobbo7booboo14bo$298bo56bobbo4bobbo5bo74bo63boo3boo5bo10booboo6boo 7b3o$371bo139boo3boo8bo7b5o5bobo9bo$336boo33b3o138b5o7boo7boo3boo6bo$ 336boo175bobo$339boo62boo14boo19boo56bo$305bo33b3o60bobo15bo19bo56b3o 13b3o3boo3boo$304boo33boo63bo15bobo9bo5bobo24b3o28b5o19b5o5bo$304bobo 22boo5boo8boo73boo8boo5boo24bo3bo52b3o7boo$328bobo5boo8bobo15bo65boo 32bo3bo53bo7boo5b3o$328bo19bo15bobo62b3o33b3o43boo26bo$327boo19boo14b oo64boo3boo75bo25bo$431boo8b3o65b3o$395b3o34bo7bo3bo64bo$312boo83bo6bo 6bo28bo3bo51b5o26bo5bo$311boo83bo6boo6boo28b3o21b3o29b3o19boo5bo4boob oo$313bo43bo44b3o6b3o50bo3bo29bo21bo5b3o13boo$356bo46boo6boo51bo3bo48b 3o10bo5bo4boo$84boo270b3o45bo6bo53b3o49bo25bo$85bo417boo6boo17booboboo $85bobo6bo23boo233boo33boo51b3o58bobbo4bobbo$86boo4bobo23bo201bo31bobo 32bobo50bo3bo56b6obb6o$90boo18boo3boobo200boo31bo36bo27bo22bo3bo57bobb o4bobbo5bo$90boo17bo3bo3bo201bobo29boo63b3o22b3o59boo6boo6bobo28bo$90b oo16bo306booboo63boo34boo28boo$92bobo4bo8bo3bobbo298b3ob3o62bobo63bobo $94bo3bo9bo5bo180bo118b3ob3o63b3o48boo$98b3obbo5bo3bo181b3o116b3ob3o 64b3o47bo$110boo186bo81b3o31b3ob3o63b3o49b3o$297boo28boo20boo31bo32boo boo56boo5bobo7boo17bo25bo$102bo223boo21bo31bo34b3o56bobo5boo8bobo15bo$ 101boo225bo9bo8bobo67bo57bo19bo15b3o43boo$101bobo232bobo8boo125boo19b oo59boo$82bo235bo5boo9bobo220bo$82b3o231bo3bo3b3o7bobbo$85bo234bo5boob o5bobo35boo14boo19boo56bo$84boo213b3o13bo5bo4bobbo6bobo26boo5bobo15bo 19bo56b3o$298bo3bo12boo9boobo8bo26bo8bo15bobo9bo5bobo24b3o28b5o33bo94b oo$109boo186bo5bo20b3o30bo5bobo25boo8boo5boo24bo3bo65bobo58bo34bo$86b 3o19boo187bo5bo20boo31bobo3boo35boo32bo3bo65boo58boo34bobo5bobo$86b3o 21bo229bo17bobo38b3o33b3o126bobo34boo5bobbo$85bo3bo213bo36boo16bobbo 38boo3boo204boo8bo$84bo5bo211boo32boo3boo15bobo40boo8b3o195bo3boo5bobo $85bo3bo212boo37b3o13bobo5b3o34bo7bo3bo196boo6boboo$86b3o211bobboo11b oo23boo7bobo4bo9bo6bo6bo28bo3bo51b5o26bo35boo73bobbo6booboo$117bo183bo bo11boo16boo5boo9boo13bo6boo6boo28b3o21b3o29b3o26bo36bo74bobo8boboo$ 116boo183boo14bo14bobo5bo10bo20b3o6b3o50bo3bo29bo27b3o32bobo38boo46bob o8boo125boo$116bobo213bo40boo6boo51bo3bo92boo38boo38bo9bo9bobo125bo$ 331boo41bo6bo53b3o135bo36bo22bo125bobo7bo$299boo3boo59boo106boo6boo44b oo81b3o20boo125boo4b4o$299boo3boo34boo17boo4bobbo42b3o58bobbo4bobbo42b obo236b4o16bo$324bo16bo16boobo7bo40bo3bo56b6obb6o43bo81bo154bobbo8boo 5bobo$89boo210b3o19boo16bobo5boo10bo7bo17bo22bo3bo57bobbo4bobbo5bo119b oo154b4o14bo3boo$89bo34boo175b3o19bobo16boo5bobo8bo8bo16b3o22b3o59boo 6boo6bobo88bo28bobo154b4o3boobobo4bo3boo$90b3o30boo177bo47b3o12bobbo5b oo9booboo63boo34boo88boo188bobbo3boo5bo3boo$92bo32bo225b3o11boo7bobo7b 3ob3o62bobo123bobo191bo10bobo3boo$350b3o23bo7b3ob3o63b3o79boo19boo214b obbo8bo4bobo$349bobo24boo6b3ob3o64b3o61b3o15bo19bo234bo$304boo43boo4bo 6boo20b3ob3o63b3o64bo15bobo10bo4bobo234boo$304bo26boo21bo6boo22booboo 56boo5bobo7boo17bo37bo17boo9b4ob3o51bo8boo$132bo172b3o22boo22b3o6bo22b 3o56bobo5boo8bobo15bo66booboboo51b3o7boo$131boo174bo24bo54bo57bo19bo 15b3o63b3obobbo32boo16bo12bo14bo$131bobo310boo19boo81boobobo32boo17boo 26b3o$549b4o35bo47bo$512boo9b4o23bo7b3o55bo18boo135boo$370bo67bo72bobo 8b6o29bo3bo52b3o154boo$339bo7bo21boo66b3o73bo7b8o27bo5bo50bo11bo147bo$ 338boo7bobo19bobo33b3o28b5o33bo45boo6boo83boo9boo$139boo184boo11bobo6b oo55bo3bo65bobo44b8o26bo7bo31bo28bobo$138boo186bo77bo3bo65boo46b6o27bo 7bo30boo7bo$140bo185bobo5bobo68b3o115b4o67bobo5b3o30boo3boo150bo$327b oo5bobbo218bo5bo38b5o32bo141bo11b3o$337boo165b3o50bo3bo38boo3boo3b3o 22bo5bo137boo14bo$335bo3boo36boo127bo51b3o40b5o3bo3bo4bo17booboo134bo 3bobo12boo$337boo37boo58b5o26bo37bo27b3o65b5o12b3o11boo3bobo133b3o$ 147bo186bobbo6boo32bo26b3o29b3o26bo66bobo65bobbo3bo5bo6bo9boo5bo133bo$ 146boo186bobo7bobo57bo3bo29bo27b3o64b3o64bo3bo3boo3boo5boo11bo4bo133b oo$146bobo197bo57bo3bo124b3o64bo195b3o$346boo57b3o125b3o64boboo191boob oo$106boo335boo6boo44boo34b3o65bo9bo175boo6booboo$106boo277bo56bobbo4b obbo42bobo34bobo73boobo9b3o15boo144boo7b5o$384boo55b6obb6o43bo34b3o76b o27bo147bo5boo3boo$384bobo55bobbo4bobbo5bo138boo3boo3bo3bo9bobo16b3o 123boo3boo3bo$154boo287boo6boo6bobo136bo5bo3bobbo9b5o5b3o9bo123boo3boo 3b3o$153boo268boo34boo146b5o8boo3boo6bo146bo$105b3o47bo267bobo173bo3bo 3b5o8boo3boo5bo136b3o7boo$105b3o316b3o79boo19boo71b3o3boo3boo156b3o23b o$104bo3bo316b3o61b3o15bo19bo57bo21b5o158bo23boo$392boo30b3o64bo15bobo 10bo4bobo56b3o21b3o5bobo175bobo$103boo3boo8bo272boo23boo5bobo7boo17bo 37bo17boo9b4ob3o25b3o28booboo21bo7boo5bo174boo$117bobo42bo230bo21bobo 5boo8bobo15bo66booboboo26bo3bo26b3ob3o28bo7bo173bo$116bo3bo40boo252bo 19bo15b3o63b3obobbo25bo5bo25b3ob3o9boo23bobbo152boo3boo14b3o$116bo3bo 40bobo250boo19boo81boobobo58b3ob3o10bo23bobo156bo19bo$116bo3bo398b4o 26bo7bo24b3ob3o7b3o173bo6bo5bo$103b3o10bo3bo361boo9b4o23bo7b3o18bo7bo 25booboo8bo176boo5booboo$107boo7bo3bo37boo240bo80bobo8b6o29bo3bo52b3o 27bo5bo151boo7bobo3boo$107boo7bo3bo37bo240boo82bo7b8o27bo5bo17bo5bo28b o20boo6bobo3bo161bo3bobo$108boo7bobo36bobo240bobo42bo45boo6boo51bo3bo 51bo6boo3bobo8bo136b3o12bo5bo$106bobo9bo37boo11boo273bobo44b8o26bo7bo 18b3o49b3o11booboo6boo135bo3bo$106boo60boo274boo46b6o27bo7bo70bo12bo5b o5bobo133bo5bo$170bo322b4o94bo6bo21bo144bo5bo5bo$440boo84bo5bo57boo6b oo17boo3boo144bo7bo$101boo3boo331bobo32b3o50bo3bo57b3o6b3o6bo158bo3bo 5b3o6bo$101boo3boo299boo30bo36bo51b3o59boo6boo6bo162bo14boo$113bo12boo 278boo30boo35bo27b3o85bo6bo7b3o156bobbo15bobo$103b3o8boo11bo49bo230bo 94bobo64bo66boo126bo$103b3o7boo12bobo6bo7bo31boo325b3o64boo64boo128bo$ 104bo23boo4bobo5b4o30bobo203bo120b3o60boo3boo49boo14bo124b3o$132boo8b oobbobboo231b3o118b3o65b3o48bo140bo5bo6boo3boo$132boo10b3obboo234bo81b oo34b3o65boo50b3o143bobo5b5o$132boo11bo6boo230boo29bo20boo28bobo34bobo 57boo5boo8boo17bo25bo143boo6booboo10boo$134bobo15b3o259boo20bo31bo34b 3o56bobo5bo9bobo16bobo175booboo9boo$120bobo6bo6bo4bobo8boo260bobo8bobo 6bobo125bo19bo16boo44bo132b3o12bo$104boo15boo7bo11boo5boo7boo24boo237b o3bo6boo125boo19boo60boo$104boo15bo6b3o14bo3boo7bobo22boo226boo10bo 220bobo$113bo29bobo14bo24bo225bobbo7bo4bo334bo$112boo30bo15boo241b5o7b o7bo52boo19boo262bo14boo$111boo4boo283bo5bo6bo7bo3bo24boo5b3o15bo19bo 57bo36bo168b3o13bo22bo$110b3o4boo267b3o5bobboo3bo3boo7bo9bobo24bo8bo 15bobo10bo4bobo56b3o34bo182b3o22boo$111boo4boo3bo262bo3bo13bo7bobbo27b obo5bobo7bo17boo9b4ob3o25b3o28booboo33b3o180bo24bobo$103boo7boo7b3o13b o54bo191bo5bo20boo29bo3bo3boo36booboboo26bo3bo26b3ob3o93boo125boo$102b obo8bo6bo3bo12boo52boo192bo3bo36bo19bo40b3obobbo25bo5bo25b3ob3o92boo 126bobo$102bo16bob3obo10bobo52bobo192b3o35b4o14bo4bo40boobobo58b3ob3o 94bo113bo12b3o$101boo17b5o261bobbo33boboboo4bo12bo42b4o26bo7bo24b3ob3o 195bo9b4o3boo8b3o6boo$387b3o32bobbob3o5boobo3bo3bo5boo9b4o23bo7b3o18bo 7bo25booboo196bobo6b4o3boo8b3o7boo$387boobo13bo17booboboo5b4obobbobo6b obo8b6o29bo3bo52b3o27bo35boo132boo7bobbo3booboboobbobo25boo$388bobo12b oo15b3ob4o6boobboo13bo7b8o27bo5bo17bo5bo28bo28bobo33bo142b4o4boboboobb oo25boo$112bo276bo13bobo13bobo4bo33boo6boo51bo3bo58boo32bobo39bo97boo 4b4o3boboo33bo$109b4o4bo11boo68boo218bo41b8o26bo7bo18b3o93boo39boo96bo bo7bo$101boo5b4o5bo12boo66boo218boo42b6o27bo7bo155bobo95bo$101boo5bobb o17bo70bo185boo3boo59boo9b4o94bo6bo178bo8boo$108b4o274bobobobo34boo23b obo41bo5bo57boo6boo43b3o130bo34bo$109b4o274b5o36bo16bobo7bo41bo3bo57b 3o6b3o6bo37bo130b3o33boo31bo$112bo275b3o20boo15bobo5bo7boboboobbobbo 42b3o59boo6boo6bo37bo166boo31boo$389bo20boo17boo5boo6bobo8bo17b3o85bo 6bo7b3o235bobo$122bo84bo204bo24boo13bobo6boo10bobo64bo126boo$122boo82b oo229b3o12boo7bobo9b3o64boo124boo$110bobo8bobo82bobo223boo3boo24bo9b3o 60boo3boo80boo19boo22bo106boo$110bo3bo321boo25boo8b3o65b3o62boo16bo19b o94bo34bobo$114bo10boo264boo43bo5bo7bo22b3o65boo62bobo16bobo10bo4bobo 94bobo34bo$110bo4bo7bobbo264bo27bo22bobo4boo22bobo57boo5boo8boo17bo37b o17boo9bobo3boo51bo43boo81boo$114bo7bo269b3o23boo22boo5bobo21b3o56bobo 5bo9bobo16bobo64boobo53b3o125boo$102boo6bo3bo7bo271bo23bobo111bo19bo 16boo65booboo34bo16bo130bo$101bobo6bobo9bo91boo315boo19boo82boobo34boo 16boo$101bo21bobbo5boo79boo421bobo35bobo$100boo23boo5bobo80bo421bo8bo 85bo34b3o$134bo300bo162b3o44bobo83bo37bo$134boo298bo22boo66bo36bo37bo 7b8o28bo3bo82b3o34bo61bo$426boo6b3o19boo66b3o34bo37bo8bob4obo28bo3bo 180boo$412boo11boo31bo33b3o28booboo33b3o44b8o28bo3bo180bobo$222bo190bo 13bo63bo3bo26b3ob3o115bo3bo33boo$221boo190bobo5boo67bo5bo25b3ob3o92bo 22bo3bo32boo$221bobo190boo5boo99b3ob3o92bo22bo3bo34bo4b5o67boo$424boo 63bo7bo24b3ob3o62boo52bobo39bob3obo30bo34bobo$424b3o38bo23bo7bo25boob oo62bobo28bo24bo41bo3bo31bobo34bo$424boo38boo58b3o27bo37bo27bobo66b3o 32boo111boo$421boo8boo31bobo23bo5bo28bo28bobo133bo125bo19boo$421boo8bo bo57bo3bo58boo64b3o65boo124b3o21bo$229boo202bo58b3o192bobo123bo$228boo 203boo252bobo123boo$230bo300bo6bo81b3o65bo28bo$530boo6boo43b3o130bo$ 472boo55b3o6b3o6bo37bo34bobo93b3o87bo38bo$471boo57boo6boo6bo37bo36bo 63booboboo113bo38boo$473bo57bo6bo7b3o136bo5bo113b3o36bobo$237bo272bo 110bo64bo3bo119b3o$236boo272boo109bo65b3o79bo39bo3bo$236bobo267boo3boo 80boo19boo129boo19b4o$511b3o62boo16bo19bo94bo34bobo10bo7b4o39bo5bo$ 480bo30boo62bobo16bobo10bo4bobo56b3o35bobo34bo9bobo6bobbo39boo3boo$ 479boo22boo5boo8boo17bo37bo17boo9bobo3boo26bo30bobo35boo44bo3boo4b4o 83boo$479bobo20bobo5bo9bobo16bobo64boobo29bobo29b3o81bo3boo5b4o6boo73b oo$502bo19bo16boo65booboo27bo3bo28b3o11boo68bo3boo8bo6bobo74bo$244boo 255boo19boo82boobo28bo3bo28b3o12bo59boo8bobo19bo$243boo361bobo29bo3bo 28b3o9b3o59bobo9bo20boo69boo$245bo361bo8bo21bo3bo28bobo9bo18bo34b3o5bo 20bobo39boo39bo$568b3o44bobo20bo3bo28b3o27bo37bo4boo21boo40bo31bo5bobo $487boo43bo37bo7b8o28bo3bo19bo3bo58b3o34bo28bo38b3o32bobo3boo11bo$486b oo43bo37bo8bob4obo28bo3bo20bobo164bo17bo17bobo14boo$488bo42b3o44b8o28b o3bo21bo183boo16bobbo13bobo$252bo361bo3bo61b4o136boo3boo15bobo$251boo 338bo22bo3bo60b6o140b3o13bobo$251bobo273boo62bo22bo3bo59b8o44boo42bo 50boo7bobo4bo$526bobo32boo52bobo59boo6boo7bo34bobo43boo40boo5boo9boo$ 495bo30bo33bobo28bo24bo61b8o8bobo34bo42boo40bobo5bo10bo$494boo29boo35b o27bobo86b6o9boo120bo50boo$494bobo159bo23b4o131boo49boo$590b3o61b4o 210bo$259boo208bo183boboboo$258boo209b3o180bobbob3o182bo$260bo211bo 117b3o59booboboo28bo155boo$471boo50boo28b3o94b3ob4o9boo17bo155boo$502b oo19bo31bo34bobo56bobo4bo10bobo16b3o94boo90bo$501boo10bobo5bobo30bo36b o57bo19bo113bo90boo$503bo8bobbo5boo125boo19boo94bo18b3o87bobo$267bo 230boo11boo78bo173b3o18bo$266boo230bobo8boo3bo76bo176bo$266bobo224boo 6bo9boo50boo19boo129boo50boo80bobo$481boo6boobobbobbobbo10bobbo23boo5b oo16bo19bo94bo34bobo133boo$480b6o3boobboo6bo11bobo23bo5bobo16bobo10bo 4bobo56b3o35bobo34bo133bo$471boo3boo4boboo12bobo27bobo6bobo7bo17boo9bo bo3boo26bo30bobo35boo201boo$473b3o22boo28bobbo5boo37boobo29bobo29b3o 126bo110boo$472bo3bo36bo6bo10boo43booboo27bo3bo28b3o126bo112bo$274boo 197bobo36bobo5bo8bo3boo41boobo28bo3bo28b3o125bobo$273boo199bo36boboo6b o9boo43bobo29bo3bo28b3o124booboo84bo$275bo234booboo9boobbobbo45bo8bo 21bo3bo28bobo28bo34b3o57bo5bo84boo$475b3o33boboo5b3obbobbobo7b3o44bobo 20bo3bo28b3o27bo37bo60bo86boo$475b3o13boo14boo3bobo7b4o14bo7b8o28bo3bo 19bo3bo58b3o34bo58boo3boo116bo$490boo14bobo4bo9boo14bo8bob4obo28bo3bo 20bobo277boo$492bo13bo41b8o28bo3bo21bo244boo32bobo$282bo222boo77bo3bo 61b4o201bo$281boo190boo3boo58boo21bo22bo3bo60b6o187bo10bobo$281bobo 190b5o35boo15bo4bo3bo20bo22bo3bo59b8o44boo139bobo9boo$475b3o37bo16bobb o5bo43bobo59boo6boo7bo34bobo65boo62boo7boboo$476bo22bo15bobo4bo8b5obo 3bo19bo24bo61b8o8bobo34bo66bo61bobo6booboo$498boo16b3ob4o11bo5bo18bobo 86b6o9boo99b3o61bo6b3oboboo53boo$498bobo17booboboo11bo3bo7boo76bo23b4o 111bo63bobbobbobbobbobo52boo$518bobbob3o12boo8bobo9b3o61b4o201bo6boo4b o55bo$289boo228boboboo25bo72boboboo193boo6bobo26boo$288boo230b4o6bo19b oo70bobbob3o191bobo7boo26boo11bo$290bo187boo42bo6bo30b3o59booboboo28bo 163bo51boo$478bo50b3o5boo81b3ob4o9boo17bo163boo21bobo3bo9bo12boo$479b 3o24boo28boo22bobo56bobo4bo10bobo16b3o185boo3boo7bobo44bo$481bo23boo 31bo22bo57bo19bo204bo3bobo7bobbo42boo$507bo110boo19boo54bobboo159bobbo 41bobo$297bo263bo132bo3boobboo119boo$296boo263bo132bo7boo120bo34bobbo$ 296bobo223bo162boo8b4o125bobo6bo7bo17boo18bobo$522bobo20bo103bo34bobo 138boo4bobo5b4o37boo$514bo7boo20boo65b3o35bobo34bo142boo8boobbobboo32b o$499boo12boo29bobo33bo30bobo35boo178boo11boobboo64boo$500bo12bobo63bo bo29b3o215boo7bo10boo6boo52boo$500bobo5boo68bo3bo28b3o217bobo4bo10b3o 5boo54bo$304boo195boo5bobo67bo3bo28b3o219bo4bo10boo$303boo204b3o66bo3b o28b3o232boo39bo$305bo204b3o65bo3bo28bobo28bo34b3o166boo40boo$509b3o 40boo24bo3bo28b3o27bo37bo207boo$508bobo7boo31boo25bo3bo58b3o34bo241bo$ 508boo8bobo32bo25bobo337boo$520bo59bo304boo32bobo$312bo207boo98b4o261b o$311boo306b6o247bo10bobo$311bobo304b8o44boo199bobo9boo$560bo56boo6boo 7bo34bobo189boo7boboo$559boo57b8o8bobo34bo188bobo6booboo12boo$559bobo 57b6o9boo223bo6b3oboboo13boo38boo$596bo23b4o226boo7bobbobbobbobbobo12b o39boo$594b4o252boo7bo6boo4bo55bo$319boo272boboboo261bobo26boo$318boo 272bobbob3o261boo25bobbo10bo$320bo271booboboo28bo260bo14boo$567boo21b 3ob4o9boo17bo246bobo12bo13boo$566boo21bobo4bo10bobo16b3o245boo12boboo 43bo$568bo20bo19bo60bobo201bo15boo42boo$588boo19boo58bo207boo55bobo$ 327bo336boobbo4bo179boo22boo$326boo336boobobboboo180bo34boo$326bobo 266boo58boo11boo184bobo6bo7bo17boo18bobo$575bo19bo23bo34bobo125boo71b oo4bobo5b4o37boo$574boo10boo5bobo23bobo34bo123bo3bo74boo8boobbobboo32b o$574bobo9boo5boo24boo158bo5bo13boo58boo11boobboo64boo9boo$569boo12boo 193bobbo3bo13boo58boo7bo10boo6boo52boo9bobo$567bo3bo10b3o200bo10boo63b obo4bo10b3o5boo47bo6bo7b3o4boob3o$334boo230bo5bo10boo30boo159bo3bo3bo 10b3o65bo4bo10boo54bobo12b3o4bobb4o$333boo230bobbo3bo13boo28bo158boboo 3boo12boo78boo55boo3bo12b3o4boo$335bo236bo13boo25b3o31b3o125bo11bobo9b oo5boo68boo55boo3bo13bobo$563bo3bo3bo41bo35bo124boo11boo10boo5bobo124b oo3bo14boo$562boboo3boo37bo39bo139bo19bo121boo3bobo$562bo44bobo198boo 119bobo4bo$561boo27boo14bo3boo3boo298boo12bo$342bo247bobo13bo3boo3boo 298bo12boo$341boo248b3o12bo3boo290bo10bobo$341bobo248b3o12bobo30boo 139bo119bobo9boo$591b3o7bo6bo30bobo137boo110boo7boboo21boo$583boo5bobo 9boo37bo138boo108bobo6booboo21bo$582bobo5boo9boo14boo270bo6b3oboboo22b 3o$582bo33bobbo260boo7bobbobbobbobbobo24bo$581boo36bo260boo7bo6boo4bo$ 349boo268bo270bobo26boo$348boo266boobo271boo24bobbo$350bo265boo154bobo $578boo192boo129bobo3bo7bobbo$579bo193bo130boo3boo7bobbo$579bobo6bo7bo 20boo203boo80bo3bobo8bobo$580boo4bobo5b4o19boo20b4o132boo46bo96bo$357b o226boo8boobbobboo31boo7bo132bo46bobo7bo49boo$356boo226boo11boobboo31b oobboo3bo132bobo10bo34boo7b4o47bo34boo$356bobo225boo7bo10boo19boo11boo bbo123bo10boo9b4o42b4o46bobo6bo7bo17boo$586bobo4bo10b3o17bobo137boo21b oob4o5boo33bobbo5boo40boo4bobo5b4o$588bo4bo10boo20bo138boo19b3oboo3bo 3bobbo31b4o5boo44boo8boobbobboo$601boo8boo174booboo3bo7bo29b4o52boo11b oobboo$601boo8bobo174b5o3bo6bo29bo55boo7bo10boo6boo$613bo175bo3b3o7bo 87bobo4bo10b3o5boo$364boo247boo156boo26bobbo5boo83bo4bo10boo$363boo 406boo26boo7bobo95boo$365bo251b3o190bo27boo66boo$619bo152bo14bo22boo 27bo$618bo152bobo11boo52bobo5boo$770bobbo11b3o52boo5boo$769bobbo10b3o 64boo10bo$372bo410boo22boo41b3o7bobo$371boo396bobbo34bo42boo6boo$371bo bo236boo139bo19boo16boo9bo4bobo39boo9boo$609bobo137boo37b4o7bobo3boo 40boo9boo$611bo138boo31bobobbobb3o5boobo57bobo7boo$782bobbobboo9booboo 46bo11bo7bobo$773boo6boo9bo6boobo47bobo19bo$773boo4boo3bo8bo5bobo48boo 20boo$379boo400boo10bo6bo$378boo277boo123bobbo$380bo221b3o52bo84bobo 38bobo85boo$604bo41bobo6bobo84boo127bo$603bo42bobbo5boo86bo99bo14bo10b obo$649boo191bo13b4o9boo$647bo3boo92boo95b3o10boboboo$387bo261boo95bo 107bobbob3o$386boo250boo6bobbo96bobo10bo94booboboo$386bobo206boo40bobo 6bobo87bo10boo9b4o90b3ob4o$594bobo40bo96boo21boob4o5boo80bobo4bo$596bo 39boo97boo19b3oboo3bo3bobbo78bo$757booboo3bo7bo76boo$758b5o3bo6bo6boo 53boo$759bo3b3o7bo6boo30boo22bo$394boo345boo26bobbo40bo19b3o$393boo 346boo26boo42bobo10bo6bo$395bo74bo116b3o224boo9b4o30bo$470b3o116bo161b oo4bo66boobobo27boo$473bo114bo153boo6boo3boo66b3obobbo27boo$472boo266b oboo8bo3boo66booboboo4boo$740bo84b4ob3o3bo$402bo337bo36boo38bobo6bo4bo bobbobo5boo$401boo337bobbo33bo40boo13bo3boo5bobbo$401bobo70b3o103boo 159boo16boo9bo4bobo40bo14boo13bo$473booboo101bobo176b4o7bobo3boo71bo$ 473booboo103bo171bobobbobb3o5boobo36boo37bo$473b5o170boo40boo60bobbobb oo9booboo34bobo33bobbo6boo11boo$472boo3boo169bo41bo52boo6boo9bo6boobo 37bo33boo8bobo11bo$614boo23boo5bobo33boo3boobo52boo4boo3bo8bo5bobo53bo 30bo11bobo7bo$409boo204bo22b3o5boo33bo3bo3bo61boo10bo6bo55boo28boo11b oo7b4o$408boo68bo136bobo8bo8boboo26boo13bo71bobbo69boo52b4o$410bo66bob oo91b3o41boo8bobo6bobbo26boo13bo3bobbo24bobo38bobo123bobbo$477bo11boo 83bo52bobo5boboo29boo10bo5bo25boo157bo7b4o$488boo83bo53bobbo7b3o27b3o 10bo3bo27bo87b3o68boo4b4o4boo$477boobo9bo136bobo9boo27boo12boo119bo67b oo5bo7bobo$475bobbo147bobo29boo5boo9bobo36boo85bo85bo$417bo57bobo148bo 9bo20bobo5boo10boo37bo115bobo53boo$416boo219boo18bo19bo38bobo10bo74bo 28boo$416bobo146boo69boo18boo59boo9b4o72b3o26bo$497bo66bobo85bo38bo13b oo7bo12boob4o5boo66bo38bo41bo$496boo68bo56boo26b4o10boo24b4o11bo6boo 11b3oboo3bo3bobbo63boo36b3o15b3o13bobo5b3o$476b3o17bobo56boo67bo25boob obo10bo25b4o7b3o7bobo11booboo3bo7bo99bo20bo14boo4bo$475bo3bo75bo68bobo 8bo13b3obobbo9bobo5boo16bobbo7bo24b5o3bo6bo6boo91boo18bo15bo5boo$474bo 5bo65boo5bobo69boo8bobo12booboboo10boo5boo16b4o33bo3b3o7bo6boo$424boo 49bo3bo64bobbo5boo81bobo12b4ob3o18boo12b4o4boo10boo26bobbo65b3o26bo44b 3o$423boo51b3o52bobo9bo92bobbo12bo4bobo17b3o11bo7bobo9bobbo24boo66boob oo24bo45b3o$425bo50b3o52bo3bo7bo13b3o76bobo20bo17boo22bo105booboo24b3o $504boo29bo7bo15bo75bobo21boo13boo25boo8bobbo12bo69bo9b5o43boo$479boo 22boo26bo4bo7bobbo10bo76bo38boo34bobbo11boo59b3o8bo8boo3boo41bobo$479b o25bo29bo10boo162bobo12b3o60bo7bobo57bo23boo3boo$480b3o40boo6bo3bo175b o11b3o61bo9bo42b3o38b5o$432bo49bo39bobo6bobo8bobo178boo22boo21bo26bo 11boo28bo3bo38b3o$431boo89bo20boo21boo57bo85boo34bo20b3o26bo9b5o17bo8b o5bo38bo$431bobo87boo20bo6boo14bo58b3o83boo16boo9bo4bobo19bo29bo13bo 17bobo6bo5bo$512bo36bobo7bo4bobo61bo99b4o7bobo3boo20boo27bobo8b3o19boo 10bo$511boo17boo19bo6bobo3boo61boo94bobobbobb3o5boobo36boo16bo9bo31bo 3bo3b3o$511bobo17bo26boobo160bobbobboo9booboo34bobo16bo10boo6bo25bo6bo 17bo59bobo$531bobo8bo15booboo150boo6boo9bo6boobo37bo27boo6b3o19bobbo6b o18bobo49b3o5bo3bo$532boo8bobo13boobo151boo4boo3bo8bo5bobo77bo18bo28b oo11boo32boobbobbobo7bo$439boo102bobo12bobo69bo90boo10bo6bo77boo19bo 41bo30bobbobboo7bo4bo$438boo103bobbo12bo70bo91bobbo82boo3boo21b3o39b3o 30bo19bo$440bo102bobo4boo77bobo91bobo82bobobobo21bo41bo32bo10b3obbo3bo 3boo$519boo21bobo4boo77booboo163boo3bobo5b5o26boo69bo15bobo5bobo$518b oo22bo8bo75bo5bo129b5o3b3o22boo3boo7b3o26bobo18bo44boo5bobbo21bo$520bo 109bo131bob3obo4bo28bo8bo29bo17bo36b3o5bobo7boo21boo$543bo83boo3boo 129bo3bo4bo86b3o36bo5bo$447bo94bo221b3o130bo5boo$446boo94b3o220bo84boo $446bobo109bo63boo60boo145bo18bo$527bo29boo63bo62bo133b5o8boo5boo7bobo $526boo29bobo49bo10bobo62bobo8bo65boo54bob3obo6b3o5boo7boo$526bobo79bo bo9boo10boo52boo8bobo64bo6bo39boo7bo3bo11bo6boo8bo36boo$606boo3bo20bo 66boo59b3o6boo39boo8b3o12bo6b3o7bobo33bobo$515boo18bo70boo3bo21b3o63b oo59bo8bobo29bo19bo20boo8boo36bo$454boo60bo18bobo68boo3bo23bo63boo98b 4o28boo6boo$453boo61bobo8boo6boo66boo3bobo85bobo4boo93boboboo19boo5bob o6boo$455bo61boo7bo3bo34boo35bobo4bo86bo6bobo91bobbob3o18bo6bo$525bo5b o32boo36bo102bo92boboboo20b3obboo$525bo3boboo33bo34boo102boo85b3o4b4o 8boo13bo18bo$525bo5bo245boo13b3o6bo9bobo30bo36b3o$526bo3bo3boo240boo 13bo3bo17bo30b3o36bo$462bo64boo5bobo241bo34boo67bo$461boo73bo253boo3b oo$461bobo72boo35bo239boo$572boo239bo$572bobo220boo5boo7bobo195boo$ 785bo7bo4bo3b3o6boo24bo36boo134bo$784boo12bo5boobo29bobo33bobo134bobo 7bo22boo$784bobo5bo6bo4bobbo29boo36bo135boo7bobo20bo$469boo321bobo9boo bo215boo6boo8bobo$468boo332b3o218boo4bo3bo7boo$470bo109boo46boo48boo 122boo8bo210boo3bo5bo$579boo47boo47bobo130b3o9bo197bobo4boobo3bo$581bo 49boo38boo3b3o130bo12b3o5bo189bo7bo5bo$631b3o28boo7boobb3o114boo15boo 14bo3bo36b3o160bo3bo$631boo28bobo5b3o4b3o39boo71boo31boo3b3o36bo162boo $477bo143boo5boo8boo20b3o4b4o6bobo5boo30bobo73bo73bo153bo$476boo142bob o5boo8bobo18b3o5bo3bo6boo5bobo28bo6boobboo99bo190boo$476bobo109bo31bo 19bo19b3o4b4o16bo28bobbobbobboboo99bo191boo$587boo30boo19boo11boo6bobo 5boo16boo27bo6boo102bo$587bobo62bobo7boo44boo7bobo$652bo54bobo8boo80bo 58boo$651boo35bo18bo91boo3boo3boo13boo3boo4bo22bobo$688b3o15boo91bobo 22bo5bo5boo22bo$484boo190b3o12bo113bo3bo25boo175bobo$483boo191bo13boo 114b3o16bo3bo182boo$485bo109boo72bo7bo128b3o17b3o184bo$594boo71b3o$ 596bo69bo$666boo5bo131bo45b3o$673b3o45bo82b3o46bo$492bo183bo7boo35b3o 79bo3bo21boo21bo11boo140bo$491boo151boo29boo7bobo5b3o29bo37boo41bo23bo 34bo139boo$491bobo109bo40bo18b3o10b3o5bo6bo3bo27boo37bo39bo5bo21b3o21b o7bobo140boo$602boo6boo23boo5bobo32bobo10bo5bo63bobo39bo5bo23bo19bobo 7boo$602bobo6bo22bobo5boo19bobo10bo3bo9bo5bo63boo41bo3bo42boo123bo$ 611bobo5bobo11bo28b5o9b5o123b3o43boo123b3o$612boo5bobbo10bobbo24boo3b oo7boo3boo8bo159boo126bo$622boo9bo27boo3boo8b5o9boo153boo5bobo122boo$ 499boo119bo3boo8bobo40b3o10boo34bo117bobo7bo142bobo$498boo122boo11boo 41bo10boobbo31b3o116bo152boo$500bo109boo7bobbo8bo31boo25bobo17bo13b5o 114boo153bo$609boo8bobo10boo28booboo24boo17b3o10boo3boo$611bo19boo30bo bbo46bo93boo$663bo15bo32boo93bo$666bo9boo10boo3boo113b3o169bo$507bo 156boo10b3o9boo3boo30b3o82bo168b3o9bo$506boo169boo299b5o6boo$506bobo 109bo58bo12b3o21b3o9bo250boo3boo6boo$617boo19bobo18boo3boo10bobo11b3o 20booboo7b3obo248b5o$617bobo19boo19b5o11boo13bo21booboo7bo4bo247bo3bo$ 639bo21b3o6bo42b5o12bo248bobo$662bo49boo3boo10bo250bo$672boo3booboboo$ 514boo172boo500boo$513boo162bo5bo5bo28bo259bo211boo$515bo109boo19bo39b 3o5boo21boboo28bo226booboo$624boo21boo29booboo3bo7boo21bo10b3o17bobo$ 626bo19boo32bo46bo3bo15bo3boo222bo5bo$659boo42bo13boobo5bo5bo14bo3boo$ 660bo42b3o9bobbo8bo3bo15bo3boo222booboboo$522bo134b3o46bo8bobo10b3o6b oo9bobo3boo$521boo134bo47boo21b3o5bobo10bo4bobo$521bobo109bo27bobo15b oo12b3o10b3o27bo19bo$632boo19bobo5boo7boobbo4boo26bobo16boo7boo19boo$ 632bobo19boo6bo3boobboo3bo17bobo10bo3bo16bo459boo3boo$654bo11boo7bo16b 5o9b5o5b3o5b3o$671b4o16boo3boo7boo3boo3bo3bo4bo250boo211bo3bo$691boo3b oo8b5o3bo5bo255bo212b3o$529boo176b3o5bo3bo253b3o213b3o$528boo178bo7b3o 254bo$530bo109boo19bo31boo21b3o$639boo21boo28booboo$641bo19boo30bobbo 22boo170bo$693bo15bo9bo171b3o$696bo9boo12b3o171bo293bo5bo$537bo156boo 10b3o13bo170boo292b3o5bo$536boo169boo478b3o3b3o$536bobo109bo58bo$647b oo19bobo18boo3boo10bobo476boo3boo$647bobo19boo19b5o5bo5boo477boo3boo$ 669bo21b3o7boo$692bo7boo187bo3boo3boo$707booboboo173b3o3bobobobo302bo$ 544boo340bo7b5o301bobo$543boo155bo6bo5bo172boo7b3o303boo$545bo109boo 19bo21boo24boo170bo288boo$654boo21boo20boo7booboo11boo460bo$656bo19boo 32bo472b3o$689boo42bo443boo4bo$690bo42b3o442bo30bo$552bo134b3o46bo144b ooboboo290bobo29bo$551boo134bo47boo144bo5bo291boo27b3o$551bobo109bo33b obo9boo12b3o10b3o143bo3bo6bobo$662boo36bo8boo26bobo143b3o7boo$662bobo 31bo4bobboo17bobo10bo3bo153bo$696boobobboboo16b5o9b5o429boo$700boo19b oo3boo7boo3boo424b4o4boo$721boo3boo8b5o156b3o266b3oboobboo41bo$559boo 176b3o156bo3bo260boo8bo43bobo$558boo178bo156bo5bo259boo53boo$560bo109b oo51boo171bo3bo283bo$669boo51booboo170b3o282b3o$671bo51bobbo170b3o281b o$723bo15bo421bo19boo$726bo9boo162boo258b3o61bo$567bo156boo10b3o161bo 258bo3bo61bo$566boo169boo145boo3boo10b3o254bob3obo58b3o$566bobo109bo 58bo146boo3boo12bo255b5o$677boo19bobo18boo3boo10bobo146b5o193boo21boo$ 677bobo19boo19b5o11boo148bobo195bo21boo70b3o$699bo21b3o6bo353bobo6bo4b o10boo66bo3bo$722bo163b3o196boo4bobo4bo10b3o88b3o$732boo3booboboo345b oo7bo10boo53b3o9bo5bo17bo31bo$574boo513boo11boobboo7boo49bo9boo3boo18b o28bobo$573boo162bo5bo345boo8boobbobboo7bobo47bo65boo$575bo109boo19bo 182boo200bobo5b4o14bo$684boo21boo29booboo74boo70bo203bo7bo15boo57boo$ 686bo19boo32bo77bo71b3o282bobo$719boo97bobo6bo64bo195boo85bo32boo$720b o98boo4bobo56bo204bo85boo31bobo28bo$582bo134b3o81bo22bobo55b3o204bobo 8boo6bobo68bo28bo31bo$581boo134bo83bobo19bobbo54bo208boo6bobbo7boo51b 3o11bobbo58b3o$581bobo109bo45boo43bo17bobo19bobo54boo214bo11bo51bo3bo 13bo$692boo33b4o8boo43boo16bobbo19bobo8boo259bo62bo5bo$692bobo31bo7boo 44boo3boo15bobo22bo8bobo258bo62booboboo$726bo3boobboo49b3o13bobo3boo 29bo259bobbo5boo65booboboo19boo$727bobboo53boo7bobo4bo5bobo28boo260boo 5bobo86boobboobboo$777boo5boo9boo12bo286bo12bo6bo57bo5bo15boobbobbobo 41bo$589boo185bobo5bo10bo13boo61bo221bobo12boo6boo72boo9b3o40bobo$588b oo186bo93b3o213boo7boo19boo57booboo11boo9boo42boo$590bo109boo19boo52b oo92bo8b3o187bo18boo76boo10bo36bo$699boo20bobo145boo6bo3bo184b3o17bo 22bo55bo46b3o$701bo21bo152bo5bo182bo41b3o56b3o42bo$723boo77bo74bo3bo 183boo39bo61bo22bo19boo10boo$803boo73b3o225boo82b3o9boo19bobo28bo$597b o204boo11boo61b3o181bo113boo11bo3bo7bobo19bo31bo$596boo190boo24bobo 245bo16bo96boo10bob3obo8bo49b3o$596bobo109bo80bo23b3o51bo195bo15boo 108b5o$707boo80bobo9bo10b3o51b3o209bobo$707bobo8bobo69boo8bobo10b3o49b 5o248bo80boo7b3o$716bo3bo78bo3boo9bobo5boo40boo3boo9b3o177boo3boo51boo 79bobo5bo3bo$704boo10bo82bo3boo10boo5bobo25bo24bo3booboo176bo5bo50bobo 79bo30b3o$704bobbo7bo4bo78bo3boo19bo25bobo20boo4booboo310b3o9bo5bo17bo 31bo$604boo102bo7bo83bobo21boo25bobo20boo3b5o177bo3bo28bo51bo49bo9boo 3boo18bo28bobo$596bo6boo103bo7bo3bo6boo72bo49bobbo11b3o9boo3boo177b3o 6boo19boo8b5o36bobb3o46bo65boo$594b3o8bo102bo9bobo6bobo121bobo12b3o 203boo19boo6bob3obo33b3o5bo$593bo103boo5bobbo21bo109boo9bobo3boo213bo 30bo3bo33bo7boo56boo$593boo101bobo5boo23boo107bobo9bo5bobo244b3o4boo 28boo63bobo$696bo141bo19bo245bo6boo92bo32boo$695boo140boo19boo200boo 48bo94boo31bobo28bo$612bo448bo39boo106bo28bo31bo$611boo270boo173b3o3bo 20bobo14bo29bo59b3o11bobbo58b3o$611bobo269bo174bo5boo19boo12b3o30bobo bb3o10b3o38bo3bo13bo$870bo13b3o176bobo20bo12bo32boo15bo3bo36bo5bo$869b 3o14bo216bo33bobo8bo5bo35booboboo$588booboboo273b5o230boo31b5o7boobob oo49booboboo19bo$867boo3boo228bobo30boo3boo84boobboob3o9b3o$588bo5bo 540boo3boo62bo5bo15boo4b4o3b3o3bo31bo$619boo458bo71bo69boo7boo9bo4bo 28bobo$589booboo24boo249bo186boo19boo36bo34bobo52booboo11boo17bo35boo$ 591bo28bo248bo172bo14boo19boo35b3o32bobo42boo10bo36bo$1040b3o13bo61bo 32boo42bo46b3o$872boo165bo55boo20boo34bo42b3o42bo$588boo282bo166boo55b oo37boo15b3o43bo22bo19boo10boo$589bo283b3o219bo40bo14bo3bo64b3o30bobo 28bo$586b3o38bo247bo244bo12b3o14bob3obo49boo11bo3bo29bo31bo$586bo39boo 421bo20bobo46bobo11bo12bo4b5o50boo10bob3obo54bo3b3o$626bobo420boo19boo 46bo3bo21boo73b5o53b3o$1048bobo20bo47b3o23boo129bo$1034boo3boo47bo28b oo3boo114b3o35boo$1034bobobobo47boo147bo3bo$1035b5o47bobo170b3o$1036b 3o125boo58b3o9bo5bo17bo31bo$634boo401bo26bo99boo60bo9boo3boo18bo28bobo $633boo418bo8boo73bobo85bo65boo$635bo417b3o7boo72boo16boo114boo3boo$ 1056bo81bo16bo9bo70boo33bobobobo$1055boo99b3o5b3o68bobo34b5o$1117boo 39bo4bo3bo67bo32boo3b3o$1034boo82bo46bo69boo31bobo3bo24bo$642bo392bo 79b3o13boo29bo5bo70bo28bo31bo$641boo389b3o22b3o55bo14bobo29bo5bo53b3o 11bobbo58b3o$641bobo388bo24b3o5bo64bo32bo3bo53bo3bo13bo$1043b3o10bo3bo bbobo63boo33b3o53bo5bo$1043bo20boo7bo146booboboo$1044bo10boo3boo11boo 12boo145booboboo$1072bobo12bo20boo$1078boo5bobo20bo125bo5bo30b3o33bo$ 649boo426bobo5boo11boo6bobo161booboo30bobo$648boo426b3o17bobbo6boo127b ooboo30booboo31boo$650bo400boo22b3o17bo129boo10bo32b5o$1051bobo22b3o 16bo6bo64boo56bo43boo3boo$1051bo16boo7bobo15bo7boo14bo47bo58b3o$1060b oo5bobo8boo9boo5bobbo6boo11b3o46b3o57bo5boo$1060bo6bo20bobo7boo6bobo 13bo47bo64bo78bo$657bo403b3obboo20bo17bo14boo109b3o80bo$656boo405bo23b oo143bo80b3o$656bobo$1058b3o63bo144boo$1058bo63booboo143bo$1059bo207b 3o26boo$1113b3o5bo5bo139bo28bo$1113bo173bo6bobo25bo$664boo448bo6boobob oo159bobo4boo24bobo$663boo623bobo30boo$665bo400boo89bo130bobbo$895bo 170bobo22bo65b3o128bobo$893b3o170bo22boo69bo24bo91boo8bobo$892bo197boo 29boo30bo5boo24b3o88bobo8bo$875boo15boo227bobo27b3o34bo87bo19boo31bo$ 672bo201boo245bo28bo11bo24boo86boo19bobo31bo$671boo203bo249boo22boo9bo bo132bo31b3o$671bobo188boo262bo33bo3bo$862bo5b3o202b3o51b3o31b3o$851b oo7bobo7bo202bo8bobo44bo29boo3boo195boo$851boo7boo7bo191boo11bo7boo 278bo$838bo4bo10boo27bo178bo20bo278bobo9boo$751bo84bobo4bo10b3o25boo3b oo3boo168bobo7bo41boo29boo3boo151b3o31bo25boo8bo3bo$679boo70b3o80boo7b o10boo26bobo178boo7bobo40boo28bo5bo151bo31bobo34bo5bo$678boo74bo79boo 11boobboo35bo3bo182boo37bo49bo23b5o111bo31boo34bo3bobbo$680bo72boo79b oo8boobbobboo8boo26b3o183boo69bo3bo13bo22bob3obo178bo$830boo4bobo5b4o 12bobo26b3o183boo70b3o10b3obo23bo3bo180bo3bo3bo$798bo30bobo6bo7bo15bo 209bobo5boo107b3o176bo5boo3boobo$796b3o30bo242bo7bobo76bo30bo175bobo 13bo12bo$795bo32boo58bo193bo24bo51boobo181bo22boo13boo11b3o$687bo107b oo64bo25b3o192boo23boo52boo166boo14bo52bo$686boo67b3o5bo73boo14bobo4bo bo23bo3bo215bobo163bobo54boo12b3o12boo37boo$686bobo65bo3bo4b3o72bo15b oobboo3bo24bo155bobo18bo126bo79boo85boo$753bo5bo6bo71bobo7boo4bo3boo3b o21bo5bo142boo6b3ob3o14bobo85bo9boo3boo24bo80bo84bo$753booboboo5boo49b oo21boo6b3o8boo3bo21bo5bo142bo6bo7bo11boo18boo66bobo9boo3boo17bo5bobo 181bo$817bo26boboo12bobo8boo13bo3bo109boo21bobo6bobo6boo5boo5boo4boo 17bo3bo65boobbo7b5o18bobobbooboo63boo116bo$800bo16bobo6bobo15bobbo7boo 4bo9bobo13b3o111bo19bo3bo6boo21boo4boo16bo5bo67bo9bobo19boobbo5bo63bo 69b3o26bo15b3o$645bo16bobo91bo43b3o15boo6bobbo14boboo5bo19bo127bobo9bo 7bo16b3o22bobo4bo8bo3bobbo12boo45bo6b3o36bo66bobo67b3o20bo3b4o37boo3b oo$644bobo13b3ob3o27boo59bobo32boo3boo6bo25boo16b3o4bobo16boo127boo8b 4o4bo4bo12b3o24bo3bo9bo20boo43b3o15b3o23boo3boo64boo4bo61bo3bo17bobobb oboboo36boo3boo$627boo14bo3boo10bo7bo25boo60bobo9b3o32boo23bo3boo15boo 5bo155boobobo4bo15bo3bo8b3o16b3obbo5bo3bo3bo10bo44b5o115boo76boo7boobo bbob3o$627bobo13bo3boo3boo5boo5boo27bo59boo9bo3bo20bo3bo23bobo7boo179b 3obobbo3bo3bo10bo5bo38boo3boobo41boo10boo3boo8bo106boo60boo3boo6bo3bo 10boboboo38b3o$628b3o12bo3boo3boo100bo37b3o26bo4bobbo5boo174boobobo6bo bo11bo3bo8bobo36bo41boo11b5o10bo18bo160bo5bo10b4o8boo29b3o$34boo6bo 586b3o12bobo23bo82b3o9bo5bo20b3o25boo4bobo6bobo24boo148b4o22b3o8b5o35b oo53bo3bo8b3o17bo101bo58bobbo3bo12bo9bobo12bo16bo$34bo5b3o585b3o7bo6bo 11bo12bo81bo3bo8boo3boo65bo23boo27boo121bo34boo3boo68bo21bobo18boo9b3o 99b3o63bo24bo10bobo$24bo7bobo4bo580boo5bobo9boo14booboo91bob3obo79boo 8bo15bo26bo133bo23boo3boo37bo28b3o22bo19bo22boo76b3o12bo43boo8bo3bo3bo 25boo10boo$22bobo7boo5boo578bobo5boo9boo62bo49b5o4bo85bobo41b3o128bobo 37bo29boo26bo11bo34b3o20bo76bo13boo43bobo6boboo3boo5bobo$12boo6boo597b o34bo5bo5boo3boo28boo59boo4bo78boo31bo12bo129boo37bobo26bobo26boo9bobo 35bo17b3o78bo57bo8bo13boo5b3o20boo$11bo3bo4boo596boo47b5o29bobo57boo4b obo58bo51b3o168bo10boo7boo6boo49bo3bo11boo39bo146boo14bo5bo22bo$10bo5b o3boo632booboboo7b3o76boo18bobo21bo5bo5b5o3boo16bo53bo166bobo11bo5bobb o4bobbo49b3o12boo7boo93bo106bo9bo9bobo18bo$10bo3boboo4bobo644bo77bo20b o21b3o5bo3bob3obo3boo13b3o40bo11boo168boo10boo3b6obb6o46boo3boo15boo4b 4o9bo78b4o73bo39bobo8boo11bo5boo$10bo5bo7bo688boo24bo5bobo42b3o3b3o4bo 3bo3bo57boo174boo5boo10boo4bobbo4bobbo69boobboob3o9bobo75boobobo100bob o8boboo22bo5boo$bboo7bo3bo21bo607bobo66bo24bobo3boo57b3o33bo28bobo159b o12bobo4b3o17boo6boo74bo14boo75b3obobbo20boo77bobbo6booboo20b3o$bobo8b oo22b3o607boo52boo12bobo5bo17bobo45boo3boo10bo33bo192bo10bo71boo3boo 126boobobo21bobo5b3o57bo13boo6boboo32b3o$bo21bo11b5o587bobboboobobbo7b o8boo42bobo7boo4boo5boo16bobbo44boo3boo44b3o188b3o10bobbo4bo63bo5bo 117boo8b4o3boo17bo6bo3bo54boo12bo3boo5bobo31bo3bo$oo22boo8boo3boo586b 4oboob4o60bo8boo13boo15bobo8boo12bo277bo90bo103bobo9bo5bobo22bo5bo39b 3o12boo13boo8bo31bo5bo$11bo11boo602bobboboobobbo23boo34boo10bo12b3o13b obo10bo11b3o39boo4boo230bobo69bo3bo13bo103bo19bo22bo5bo38bo3bo16boo5bo bbo41bo5bo$11b3o648boo54boo3boo7bobo4bo9b3o12b3o31bobo5bobo4bo70b3o 158boo70b3o10b3obo102boo19boo65bo5bo14bobo5bobo45bo$14bo650boo55boo9b oo14bo48boo6bo6bobo5bo55boo4bo3bo135boo256bo43bo5bo14bo53bo3bo$13boo 21b3o626b3o54bo10bo28boo3boo30bo14boo3bobo54boo4bo5bo134bo105bo151boo 18boo25bo16boo54bo$36b3o612boo12boo95boo3boo19boo28bobo57bo3bo5bo123bo 8bobo6bo8bo37bo51boobo148boo19boo22bo3bo71bobbo$16bo634boo9boo53bo71bo 27bobbo64bo126b4o5boo7b3o4bobo37boo52boo147boobbo16bo27bo4bobo68bo$15b obo9bobobbo6bo622boo52boo68b3o29bobo20boo40bo3bo125b4o16bo4boo36bobo 202bobo41bobbo5boo68bo$14bo3bo13bo5bobo675bobo67bo32bobo19bobo40b3o 126bobbo15boo248boo41bo9bo69b3o$15b3o13boo4bo3bo698bo51bo8b3o9b3o5bo 21bo41bo127b4o104bo9boo3boo188bo80bo$13boo3boo8bobobo5b3o700boo47boo8b o3bo8bo29boo159boo6b4o18b3o82bobo9boo3boo17bo167b3o$31bo4boo3boo697boo 20boo27boo6bo5bo8bo20b3o49boo114bobo6bo21b3o83boo10b5o18bobo121boo3boo 8bo28bo$31bobo729bo36bo3bo30bo44b3o4bo115bo29bo3bo8bo86bobo19boo122boo 3boo8boo$31boo727b3o38b3o32bo45bo5b3o111boo28bo5bo8bo21boo45bo176bobo 32bo$724boo34bo40b3o77bo8bo142bo3bo7b3o22boo43b3o15b3o145b3o42boo$19b oo702boo309b3o32bo44b5o162b3o43boo$20boo703bo73boo20boo4boo22bobo165bo 81boo10boo3boo162bo$19bo727bobo50bo20bobo4bo14b3o5bo3bo163b3o79boo11b 5o29bo$748boo9bo23boo12b3o21bo6bobo7boobbobbobo7bo166bo91bo3bo28bo$ 748bo8b3o24bo12bo10b8o13boo5bobbobboo7bo4bo16boo146boo70bo21bobo18boo 9b3o$41boo713bo24b3o24bob4obo19bo19bo16bobo179bo7bo28b3o22bo19bo142boo $41bo690bo23boo23bo26b8o19bo10b3obbo3bo3boo13bo177bobo7boo26bo11bo34b 3o140bo38bobo$29bobo10b3o686boo102bo15bobo5bobo191boo6bobo11boo13boo9b obo35bo137b3o39boo$32bo11bo686bobo102bobbo21bo213bo24bo3bo11boo159bo 42bo$18bo13bo795b3o7boo21boo86bo115bobo5bobo25b3o12boo7boo$17b3o9bobbo 715bo79bo120boo70boo3boo36bobbo5boo24boo3boo15boobboobboo9bo$16b5o9b3o 714bo5b3o73bo114boo4boo13boo54boo3boo9b3o23boo56bobobbobboo9bobo$15boo 3boo648bo76b3obbooboo61boo21bo23b3o72boobboo4b3o11b3o70b3o21boo3bo55b 3o15boo$668bobo81booboo62bo21boo24bo72boobboo4boo9boboo58b3o3b3o4bo3bo 22boo20boo3boo31boo188bo$669boo13bo39boo13boo11b5o62bobo8bo5boo4boo22b o82boo10bobbo58b3o5bo3bo5bo14boo6bobbo17bo5bo219boo$19bo662b3o40bo12b oo11boo3boo62boo8bobo3boo4b3o104bo11boboo59bo5bo5bo3bo14bobo7bobo36bo 207boo$19bo661bo43bobo5bo6bo90bobobboo4boo109bo10b3o5boo24boo37b3o15bo 30bo3bo13bo$681boo43boo5boo55bo40bobbo6boo7boo86boo15bo9boo5bobo24bo 54boo31b3o10b3obo$15boo717boo51b4o10boo28bobo7bo8bobo85boo11bobbo19bo 21b3o$16bo467bobo21boo224b3o49b4o11boo27bobo19bo5boo90bo23boo20bo102bo 171boo$13b3o468bo3bo19bo220boo3boo50bobbo40bo21boo3bobo90bo148boobo 169boo$13bo474bo7bo9bobo224boo8boo41b4o69bo77b3o11bo73b3o73boo168bo32b obo$31bobo450bo4bo4b4o8boo225bo9bobo5boo34b4o125bo20boo86b3o276boo$30b o457bo4boboboo246bo6bo37bo23bobboo4boobbo88b3o21boo4bo77bo3bo276bo$30b o445boo6bo3bo3bobbob3o245boobb3o61bo3b3obb3o3bo90bo19b3o3bo89boo9boo 43bo9boo3boo$30bobbo441bobo6bobo6boboboo250bo55b3o6bobboo4boobbo90boo 18bobo4b3o10bobbo8bo52boo3boo6bo9boo41bobo9boo3boo$30b3o442bo18b4o307b o132boo18bo10bobo61b3o54boobbo7b5o157bo$474boo20bo309bo43b3o101bobbo3b oo5bo3boo3boo54bo59bo9bobo158boo$485bo21bo275b3o66bo77bo20b4o3boobobo 4bo3boo3boo107bo6b3o167bobo32bo$485bobo17b3o274bo3bo64bo78b3o17b4o14bo 3boo111b3o15b3o190boo$55bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobb o26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo6boo17bo374b oo52bo16bobbo8boo5bobo112b5o208boo$39b4o11bo14b4o11bo14b4o11bo14b4o11b o14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o 11bo14b4o11bo14b4o11bo14b4o11bo30bo275bo5bo46boo43bo41bo10boo16b4o16bo 112boo3boo8bo$39bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo 10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo 10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo10bo3bo 10bo3bo10bo3bo23bobbo275boo3boo6b5o14boo19bo35boo5bobo40b3o21boo5b4o 129b5o10bo18bo$39bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o 11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b4o11bo14b 4o11bo14b4o12bo10bo291bob3obo13bobo9boo5bobo34bobo5boo40b5o19bobo8bo 73boo54bo3bo8b3o17bo$40bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo 26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26bobbo25boo9bo3bo 289bo3bo14bo10b3o5boo9boo10bo12b3o47boo3boo18bo84bo14booboboo35bobo18b oo9b3o$489bobo10bo292b3o11bo11boboo17bobo10b4o8b3o72boo85b3o54bo19bo$ 499bo5bo290bo12boo10bobbo19bo11b4o8b3o160bo11bo5bo57b3o179bobo$484bo 14bo5bo154boo138boobboo4boo9boboo31bobbo9bobo237bo179boo$105boo377boo 14bo3bo156boo123boo5boo5boobboo4b3o11b3o29b4o10boo48b3o121booboo37boo 202bo$105boo376bobo15b3o156bo125bo7bo9boo4boo13boo20boo6b4o8bo52b3o56b o66bo39boo8bo$97boo688b3ob3o15boo35bobo6bo12bo110boo110b3oboobboo9bo$ 98bo398boo148boo140bobo17bo36bo19b3o50bo54boo4boo13boo94b4o4boo9bobo$ 98bobo6bobo360boo24boo147bobbo186b3o7boo71bobo49boobboo4b3o11b3o98boo 13boo$99boo4bo3bo359b3o3boobo19bo137boo6bo7b3o3bo178bo79bo3bo48boobboo 4boo9boboo48boo238bo$95boo8bo360boboo5bo3bobbo153boo6bo6bo3b5o176bo81b 3o58boo10bobbo49bo236boo$95bo8bo4bo356bobbo4bo4bobboo160bo7bo3booboo9b oo244boo3boo4bo51bo11boboo46b3o238boo$57bo3boo24boo3boobo9bo360boboo4b 4o5boo160bobbo3bo3boob3o8boo253bobo55bo10b3o5boo37bo24bo37boo$55b3o4bo 23bo3bo3bo10bo3bo7boo342boo6b3o3bo7b3o161boo5b4oboo214bo50boo40boo13bo bo9boo5bobo61b3o34bobo$54bo7bobo5boo13bo21bobo7bobo340bobo7boo11boo 171b4o213bobo92boo13boo19bo64bo33bo$54boo7boo5boo13bo3bobbo26bo340bo 21boo7boo7bo157bo169boo44boo92boo34boo62boo32boo123boo12boo$73boo10bo 5bo4b3o6bo13boo338boo21bo8bobo5b3o325bobo122boo14bo128bo129boo13boo$ 73b3o10bo3bo7bo7boo385bo5b3o327bo122bobo12bobo127b3o141bo32bobo$60bo 12boo12boo8bo7boo386boo439bo17bo14boboo129bo173boo$60b3o7boo9bobo413b oo3boo431bo163bo127b3o45bo$63bo6boo10boo413boo3boo378bo33boo15b3o163bo bbo125boo$62boo18bo800bo33bo50boo18bobbo8bo67booboboo28bo121boo$881b3o 30b3o51boo18bo10bobo28bobo35bo5bo25bo3bo120b3o6bo$89boo5bo723b3o91bo 69bobbo3boo5bo3boo3boo21bobbo35bo3bo28bo123bobo5boo76boo$70boo16bobo5b 4o722bo136b3o19b4o3boobobo4bo3boo3boo6bo6bo10boo35b3o26bo5bo121boo4bob o32bo43bo$71bo18bo6b4o720bo137bo20b4o14bo3boo10bobo5bo8bo3boo62bo5bo 160boo33boo7bobo$71bobo5bobo15bobbo24bo371boo443bo17bo19bobbo8boo5bobo 11boboo6bo9boo65bo3bo162boo32bobbo5boo$62boo3boo3boo5bobbo14b4o22b3o 372bo441bobo25bo11b4o16bo11booboo9boobbobbo5boo60b3o14bo168bobo15bo$ 62boo3boo13boo12b4o4boo16bo372b3o392bo50boo25bobo3boo5b4o28boboo5b3obb obbobo6bobo74b3o166bo3bobb3o10bo$80bo3boo10bo7bobo15boo371bo392bobo77b oo3bobo8bo24boo3bobo7b4o13bo73bo169bo19bo$64b3o15boo22bo706boo74boo82b o34bobo4bo9boo14boobbo69boo167bo4bo7boobbobbo$64b3o12bobbo8boo13boo 704bobo152boo3boo34bo36b3o25boo194b3o13bo7bobobbobboo$65bo13bobo8boo 23bo698bo152bobo37boo39bo24bo185bobo8bo9boo3bo3bo5b3o$84bo7bo21bo834bo 17bo79boo25b3o182boo9bo8bobo5bobo$83bo30b3o833bo82bo42bo183bo8b3o7bo$ 83b3o33b3o775bo50b3o58bo24boo242boo$118bo3bo775bo110boo22boo75boo3boo 152b3o32bo$896b3o105boo4boo13boo72bo13bo155b3o33bo$67bo31bo17bo5bo681b 3o192boobboo4b3o11b3o71b3o5boobbo5bo186b3o$68boo28boo17boo3boo683bo 192boobboo4boo9boboo72bo3bo4bobobbooboo137bo15b3o$67boo29bobo705bo202b oo10bobbo71bob3obo3bo5bobo136boo17bo$76bo880bo51bo11boboo22boo3boo43b 5o11bo138boo16bo$62b3o11bobo876bobo55bo10b3o5boo6bobo70bo155b3o$61bo3b o10boo20bo806bo50boo40boo15bo9boo5bobo6boo5bo3bo$60bo5bo31bobo802bobo 91bobo11bobbo19bo6bo7b3o224boo6boo26bo$60bo5bo32bobo15boo114boo563boo 104boo90b3o11bo23boo13b3o145boo12boo61bo4bobbo4bo22bobo$63bo10bobo22bo bbo15bo115bo562bobo182boo12boo12bo100bo85boo13boo60bo4bobbo4bo23boo$ 61bo3bo9boo22bobo13b3o116bobo4bo25boo530bo182bobo14boo10bo98b3o98bo32b obo27bo4bobbo4bo$64bo4boo4bo11boo9bobo4boo8bo119boo3bobo24bo696bo17bo 15b3o108bo3bo130boo13bo16boo6boo$60bobbo4bobo15bobo9bo6bobo130boo3bo 14boo5bobo697bo40bo30boo69bob3obo81boboo45bo13b3o$60bo9bo15bo20bo130b oo3bo13bobo5boo645bo50b3o39bo31bo63boo6b5o82bobo63bo$61bo23boo20boo 129boo3bo12b3o654bo5boo77boo5b3o10bobbo8bo4bobo63bo95bo63boo56bo$58b3o 179bobo12b3o653b3o6bo77boo18bo10bobo3boo65b3o92boo5bo115bo$58bo182bo6b o7b3o531b3o127bobo8bo21boo59bobbo3boo5bo3boo70bo92boo5boo112b3o$246boo 9bobo532bo128boo7boo21bo35b3o19b4o3boobobo4bo3boo163boo4bobo32bo$247b oo9boo531bo137boo11boo7bobo35bo20b4o14bo3boo202boo$61b3o104boo758b3o7b o3b3o6boo19bo17bo19bobbo8boo5bobo205boo24b3o$63bo42bo61boo759boo5b4o4b oobo22bobo37b4o16bo13boo3boo$62bo42bobo80bo731bo9boobbo4bo4bobbo23boo 31boo5b4o82bo165bobo$36bo149b3o729bobo10bobbo3bo5boobo55bobo8bo30bo3bo 47b3o8boo152b5o60bo$36b3o129b3o14bo597boo134boo14boboo3b3o58bo42b3o51b o8bo34bo116boo3boo57bobo$39bo49bobo13b3o60b3o14boo52bobo540bobo157boo 53boo3boo42b3o50boo5b3o33b3o94b3o19boo3boo58boo$38boo50boo13b3o131boo 543bo143bo68bobo106bo34bo87bobo8bo$54boo34bo15bo133bo687bo50bo17bo143b oo86boo9bo$53bobo100b3o770bo50bo63boo93b3o88bo8b3o$55bo110boo3boo755b oo48b3o64bo92bobo$106bo48bo3bo7b5o754b4o112b3o92bo3bo97b3o92bo$105b3o 47bo3bo8b3o9boo3boo739bo115bo56boo3boo31b5o97b3o19boo72bo$38boo3boo22b oo36b3o61bo10bo5bo46bo541b3o321boo3boo30boo3boo119bo70b3o$38boo3boo22b obo86b3o30boo40boo544bo93bo132b3o93b5o13bo18b5o81bo15b3o17b3o$62boo6bo 14bo95bo3bo4bo41boo542bo92b3o132bo96bobo12b3o19b3o80boo17bo18bo$40b3o 3b3o9boobobbobbobbo14b3o17bobo74b3o5bobo8boo20boo636boo5bo118bo17bo 109bo23bo82boo16bo57bobbo4bobbo$40b3o5bo9boobboo6bo17bo17bo49b3o32boo 7bo22bo637bo6boo63boo50bobo113b3o11boo122b3o54b3obb6obb3o$41bo5bo19bob o8b3o6boo110bo12boo7bobo12boo615boo3boobo71bobo50boo44bo265bobbo4bobbo 6bo$67boo86bo3bo39bo7bo4boo7boo14bo614bo3bo3bo74bo94b3o213boo6boo58b3o 25bo$78bobo28bo45bo3bo8bo30bo8boo5boo17b3o531boo66boo13bo83boo92bo137b oo12boo61bo4bobbo4bo55bo26bobo27boo$77b5o8bo16bobo56boo32bo4boobbo5b3o 6bobo7bo515bo5boo9bobo66boo13bo3bobbo153boo15boo136bobo12boo60bo4bobbo 4bo55boo26boo28bo$76boo3boo5booboo15boo46b3o8boo32boob5o6boo7boo522bo 3bo3b3o10bo69boo10bo5bo154bobo30bo53bo68b3o10bo32bobo27bo4bobbo4bo15bo bbo4bobbo86bobo5bo$58boo16boo3boo103bo20bo4boo11bo526bo5boobo11bo65b3o 10bo3bo137bo17bo32b3o50bobo68boo43boo13bo16boo6boo15b3obb6obb3o85boo3b 4o$42b3o14bo27bo5bo90bobo25boo533bo5bo4bobbo10boo65boo12boo11bo128bo 52bo49bobo3b3o29boo28boo47bo13b3o41bobbo4bobbo91boboboo$42b3o14bobo6bo 37bo78boo560boo9boobo9boo4boo50boo5boo9bobo15b3o125b3o51boo50bo4bo7b3o 22bo28b3o63bo142bobbob3o$41bo3bo14boo4bobo18booboboo11bobo48bobo40bo 207bo133bo133bo80b3o11b3o4boobboo45bobo5boo10boo14b5o236bo5bo3bo18b3o 94boo116bo26boboboo$64boo50bo39boboo8boo3boo6bo16bo208b3o131b3o131b3o 78boo13boo4boobboo45bo19bo14boo3boo240bo5bo17bo39bo133boo3boo35bo26b4o 8boo$40boo3boo17boo51bo39bo3bo8b3o7b3o15b3o17bo191bo133bo133bo93boo53b oo35b5o155booboboo19bo19boo24boo3boo8bo3bo51boo5boo132bo5bo33b3o20bo7b o9bobo$64boo27boo10b3o7b3o41boo8bo3bo5b5o32boo191boo132boo132boo94bo 64bo25bo3bo150b3o27b3o19bo24bobobobo9b3o52boo4bobo32bo162boo18bo12bo$ 66bobo23bobo10b3o52bo9bobo5boo3boo8bo23boo619b3o24bobo151bo4bo5bo17bo 3bo18bobo9bo13b5o9bobbo91boo101bo3bo56bobo18boo11b3o$68bo24bo12bo64bo 7b5o10bo646bo24bo135bo17bo26bob3obo18boo8b4o12b3o10b3o93boo24b3o74b3o 67bo26bo$61boo17bo11boo85bo3bo8b3o645boo13bo144bobo22booboo18b5o28boob obo12bo10boboo74bo192bo24boo$61boo17bo11b3o85bobo24boo647boo143boo24bo 52b3obobbo22bobo76bo43bobo143b3o$80bo12boo11bo72b3o23booboo645boo11bo 212boobobo24bo75b3o42b5o120bo$91bo13b3o16bo45boo6boo25b4o657booboo211b 4o3boo140boo3boo117bobo$40boo19bo43b3o14bobo45boo7bo17bo8boo561boo90bo 163bo57bo5bobo117b3o19boo3boo118boo5boo$41bo18bobo60boo31bo5bobo11b3o 6boo10boo570bobo88bo4bo5bo152bobo64bo9boo5boo3boo84bobo8bo102boo49boo 6bo35b3o$38b3o18bo3bo8b3o80bobbo3bobbo10bo8boo9bobo572bo71bo7boo7b3o 146bo13bo3bo63boo8bo6bobobobo84boo9bo102bo29boo18bo7bobo33bo3bo$38bo 20b5o10bo17bo12bobo50bo6boo21boo12boo16bo550boo69b3o7boo11booboboo138b o12b5o74b3o4b5o86bo8b3o102b3o27bo25bo3boo12bo$58boo3boo8bo17b3o12bo47b oo3bo3bo3boo19b3o10bo3bo14b3o618b5o5bo156b3o11boo3boo47bo27bo5b3o177b oo6boo16bo27bobo9bo13bo3boo10bobo17bo5bo$59b5o26b5o70boo21boo10bo5bo 16bo616boo3boo176b5o19boo25b3o34bo97b3o77bobbo4bobbo44boo8b4o11bo3boo 11boo17boo3boo$60b3o26boo3boo35bo30bobbo5boo5boo5boo13bo3bobbo14boo 312b3o485b3o21bo24bo85bo49b3o19boo56bobbo4bobbo27bo25boobobo11bobo3boo $61bo28b5o37bo29bobo6bobo3bobo5boo13bo89boo110b3o265b3o352bo19b3o25boo 84boo14boo55bo56bobbo4bobbo25b3o24b3obobboboo8bo4bobo$90bo3bo35b3o40bo 3bo23bo3bo3bo49bo30bo110bo3bo129bo3bo131bo173boo198bo112bobo14b3o15bo 15b3o17b3o58boo6boo25bo28boobobobbobo14bo29bo$65boo24bobo56boo3boo16b ooboo24boo3boobo48boo19bobo5bobo110bo3bo129bo3bo131bo175bo10bobo308boo bbobbobo12boo17bo18bo74b3o18boo28b4o3bo16boo27boboo$64bobo8bo16bo57bob obobo53bo47bobo11b3o5bo3bo3boo112b3o265b3o171bo12bo7boo150bo95boo54boo bboobboo12b3o16bo57bobbo4bobbo43b3o30bo38bo12bo$66bo7b3o49boo23b5o54b oo55boobbobbobo7bo251b3o305bobbo9bo8bo148bobo95bo59boo8boo4b3o17b3o54b 3obb6obb3o21bo3bo15boo63boo6bo11bo3bo$126bo25b3o110bobbobboo7bo4bo384b 3o170booboo9bobbobb3o150boo53bo42b3o65bobo3bobo77bobbo4bobbo6bo16bo3bo 14bobo63bo5b3o12bobbo$92boo20bo9bobo26bo12bo97bo19bo385b3o171boo11b3o 3bo206b3o43bo43bo20b3o4bo27boo6boo58b3o69bo13boo8bo5bobo20b5o$74b3o15b oo19bobo8boo13bo25b4o95bo10b3obbo3bo251b3o488boo41b3o78boo7b3o18boo4b oo25bo4bobbo4bo55bo20b3o47boo14bobbo6bobo3boo21b5o$103boo7boboo21bo26b oobobo3boo89bo15bobo119b3o265b3o354bo124boo9bo5boo10boo31bo4bobbo4bo 55boo70boo8boobbo3bo7bobo24boo3boo$74bobo25bobo6booboo22bobbo21b3obobb obboo76boo5boo5bobbo132bo3bo129bo3bo131bo170boo3boo179b3o37boo3boo76bo 10boo5bobo10bobo29bo4bobbo4bo15bobbo4bobbo109b3obboobbo7bobbo24b5o$74b obo24bo6b3oboboo25bo22boobobo82boo3bobo7boo132bo3bo129bo3bo131bo170boo 3boo175bo5bo37boo3boo94bo13bo15bo16boo6boo15b3obb6obb3o47b3o54boboo16b obo26b3o$62b3o36bobbobbobbobbobo24bo24b4o82bo5bo144b3o265b3o170b5o177b o173b3o41bobbo4bobbo60boo44bobbo8b3o4bobo28bo$61bo3bo8b3o24bo6boo4bo 26b3o22bo89boo278b3o305bobo176b3o139bo36bo100bo3bo8boo43boboo15bo12boo $94boo6bobo38bo1020b3o13boo3boo14boo100bo3bo7bo40boo6b3o26bo$60bo5bo 26bobo7boo739b3o297bo18bo3bo7boo3boo3boo91boo3boo62bobo5bobo7boo15boo 7bobo$60boo3boo7b3o16bo1050boo16bob3obo6boo101bo5bo19b3o40boo6bo26b3o 6boo$75bo16boo150bo823boo73bobo17b5o14b3o163bo5boo12bo15boobo$244boo 610bobo210bo112b3o94bo3bo82bobo4b3o8bobbo$63bo35bo143bobo596boo15bo 172bo33b3o114bo19b3o74b3o82bobo16boobo25boo$62bobo32bobo743bo15bo170bo bo33bo283b3o11bobbo7bobboobb3o28bo$62bobo24boo4boo601boo140b3o13bobbo 171boo170bobo144b3o12bobo7bo3bobboo30b3o$62bo26boo4boo11boo588bobo139b o16b3o308b3o31b5o134bo9bo9boo3bobo6bobbo37bo$62bo32boo11boo590bo435boo 32bo30boo3boo131boo10bo8bobo5bo8boo$62bobbo31bobo600boo435boo30bo31boo 3boo132boo9bo8bo$63boo34bo23boo100boo9boo12boo114boo131bobo130bobo501b o43b3o13bo86boo65bobo6boo$114b3o6bo101bobo9boo11bo115boo4b3o123bobbo4b o123bo3bo404bo140b3o11b3o86bo$114bo9b3o99b3o7bo6bo4bobo101bo10boo6b5o 112bo8boo5boo116bo7bo409bo138bo3bo9bo90b3o13boo84bo$115bo10bo100b3o12b obo3boo102bobo7b3o5bo3bobo110bobo5boo3bo8boo110b4o4bo4bo8boo393b3o152b oo65boo6boo16bo14boo47bobo31bobo$226b3o12bo3boo108boo6boo6bo3boo110boo bo6boo10boo109boobobo4bo12boo533boo3boo74bobbo4bobbo29bo50bo33boo$218b oo5bobo13bo3boo94boo12boo9boo107boo10booboo6bobbo107boo8b3obobbo3bo3bo 494bo71boo56bobbo4bobbo61bobo16bo$130bobo84bobo5boo14bo3boo94boo12boo 9boo107boo10boobo8bobo107boo9boobobo6bobo494boo35b3o33bo56bobbo4bobbo 61boo17bo$122b3o5bo3bo82bo24bobo107bobo132bobo131b4o503bobo34bo3bo29b 3o58boo6boo63bo16b3o$103boo3boo7boobbobbobo7bo5boo74boo25bo108bo11bo 123bo9bo123bo235bobo303bo5bo28bo74b3o73b3o$105b3o7bobbobboo7bo4bo4boo 220bobo134bo133bo223bo189bo116booboboo67bobbo4bobbo43bo99bo$104bo3bo5b o19bo228boo132b3o131bobo223bo187bobo188b3obb6obb3o21bo3bo15boo61bobbob oobobbo26bo$105bobo6bo10b3obbo3bo497boo223bobbo185boo190bobbo4bobbo6bo 16bo3bo14bobo61b4oboob4o24b3o$106bo7bo15bobo724b3o318boo9b5o60b3o69bo 29bobboboobobbo$115bobbo1002boo56bo8bob3obo58bo20b3o47boo14bo$117boo 1003boo52b3o10bo3bo59boo70boo13b3o$371bo749bo47boo5bo13b3o20bobbo4bobb o118bo$105boo265bo133bo133bo413bo114bo21bo19b3obb6obb3o47b3o65boo$105b oo263b3o131bobo134bo413bo114b3o40bobbo4bobbo60boo114bo$97boo282boo122b oo8boo122b3o7boo402b3o116bo100bo3bo8boo111bobo$98bo282bobo131bobo131bo bo621bo3bo7bo114boo$98bobo7bobo272bo133bo133bo462bo74bo58boo3boo62bobo $99boo6bobbo272boo132boo132boo461boo73bo58bo5bo19b3o40boo25b3o$95boo9b oo1005bobo72bobo5bo121bo24booboo$95bo8boo3bo237boo30bo101boo30bo101boo 239bobo328booboobbobo52bo3bo89booboo$61boo25bo4bobo10boo240bo28bobo 102bo31bo101bo31bo210bo202bo123bo5bobboo53b3o90b5o60bo$62bo24bobo3boo 12bobbo6boo229bobo6bo20boo102boboo5boo19b3o101bobo6boo19bobo210bo200bo bo126bo130b3o19boo3boo60bo$62bobo5boo14bo3boo16bobo6bobo220bo8boo6boo 115bo8bo7bobo114bo8boo6boo20boo207bobbo201boo123boo3boo127b3o84b3o$63b oo5bobo13bo3boo27bo218b3o11boo4boo112b3o12bo4b3o111b3o19boo227b3o451bo 9bo$71b3o12bo3boo4boo6bobo12boo216bo14boo4b3o110bo13bobbo4b3o109bo15bo 6b3o475boo201boo10bo$72b3o12bobo5bobo7boo230boo13boo4boo111boo13boo4b 3o19bo90boo14bo6boo462bo14boo94bo106boo9bo$60bo10b3o7bo6bo8bo7bo251boo 8boo114bo7bobo7boo11boo109boo8boo453b3o13bo97bo48boo65bobo$60b3o7bobo 9boo273bo9bobo113boo6boo8bobo9bobo109boo8bobo431bo19bo112b3o48bo$63bo 6boo9boo286bo16boo94bobo18bo16boo115bo16boo414bo18boo95boo66b3o13boo 70boo72bo$62boo305boo15bo116boo15bo116boo15bo413b3o116bo42boo6boo16bo 14boo47bobo20bo70bobo$387b3o131b3o131b3o526b3o42bobbo4bobbo29bo50bo18b 3o72boo$89bo5boo15bo276bo102bo30bo133bo441bo84bo44bobbo4bobbo61bobo16b o18bo$70boo16bobo4b3o15boo217booboboo154bo147bo457boo128bobbo4bobbo61b oo17bo57bobboboobobbo$71bo19bo5boobo11boo377b3o12boo94b3o5bo30boo455bo bo110bo18boo6boo63bo16b3o55boobbo4bobboo$71bobo5boo7boo7bobbo24bo206bo 5bo127boo3boobboo30boo92bo3bo4boo28bobo215bobo223boo3boo118bobo32b3o 73b3o56bobboboobobbo6bo$62boo3boo3boo5boo16boobo22b3o342b3o5boo28bo93b o5bobbobo245bo219bo6bo5bo119boo51bo131b3o25bo$62bobobobo13boo11b3o6boo 16bo210booboo46boo81bo3bo3bo42boo81bo3bo46boo203bo217bobo25bo139bo3bo 15boo61bobboboobobbo56bo29bo26boo$63b5o14b3o10boo7bobo15boo211bo48bo 83bobo47bo83b3o47bo204bobbo215boo7bo3bo11b3o139bo3bo14bobo61b4oboob4o 56boo26b3o27bo$64b3o15boo22bo265bo9bobo84bo36bo9bobo83b3o36bo8bobo204b 3o226b3o11bo195bo29bobboboobobbo16bobboboobobbo86bobo6bo$65bo13boo11bo 13boo240boo21bobo8boo98boo16bo3b4o8boo98boo23boo7boo439boo7boo142b3o 47boo14bo42boobbo4bobboo86boo6boo$79boo10boo22bo233bo20boboo109bo14bob obboboboo108bo18boo4boo448boo124bo76boo13b3o41bobboboobobbo90boo4boo$ 84bo6bobo21bobo214boo15bobo4bo12booboo92boo15boboo3boo7boobobbob3o90b oo15bobo5boo9boo4b3o446bo127bo14bo78bo142boo4b3o$84bobo28boo216bo16boo 3bobo12boboo93bo16bo3bo3bo10boboboo92bo16boo5bobo8boo4boo440bo132b3o 14b3o7b3o65boo142boo4boo$84boo244b3o20boo3bo12bobo90b3o6b3o17bo10b4o 90b3o27bo12boo440bo153bo17boo132boo3boo35bo29boo7boo$119b3o208bo22boo 3bo13bo91bo8bo12bobbo3bo12bo91bo26bobbo12bo441boo151boo5bo3bo8boo131b oo3boo33bobo20boo7bo8bobo$118bo3bo230boo3bo115bo12bo5bo134bo454bobo 157bo3bo7bo134b5o35boo21boo17bo12bo$66bobo48bo5bo231bobo130bo3bo132bob o455boo5boo195bobo101bobo58bo19boo11b3o$67boo48booboboo232bo133boo5bob o125boo5bo5boo450bobo146bo4b3o40boo25b3o171bo$67bo9bo293boo124boo5b3o 123boo6bobo449bo4boo3boo124bo12bo48bo24booboo73b3o68bo24boo$76bo294bob o124bo5bo126boo5bo217bobo238b3o124bobo11bobo72booboo142bobo$76b3o292bo 11bo97boo22bo9bo133bo209bo215bobo3boo3boo8bo3bo124boo10booboo6bo64b5o 120bo22boo$62b3o31bobo282bobo97bobo30bobo130b4o208bo215boo4bobobobo9bo bo136bo5bo5boo40b3o19boo3boo120bo5bo$61bo3bo30bo3bo267boo9boo12boo86bo 20bobo8boboo10boo108bobo6boboboo9boo193bobbo216bo5b5o11bo140bo7bobo5bo 34b3o144b3o5boo42b3o$60bo5bo7bo25bo16boo114boo133boo9boo12boo107bobbo 6booboo10boo108bo3bo3bobbob3o8boo194b3o223b3o150boo3boo10b3o25bo9bo 102boo48bobo5boo$61bo3bo9boo19bo4bo16bo115bo100boo34boo6boo88boo20bo 13boo6boboo86boo36bo4boboboo432bo10b3o154bo26boo10bo102bo29boo25bo3bo 33bobo$62b3o9boo24bo14b3o116bobo5bo24boo67bo34b3o7bobo86bo18boo12bo3b oo5bobo87bo32bo4bo4b4o410bo33b3o135bo18boo19b3o4boo9bo103b3o27bo24bo5b o12bo18b5o$62b3o22boo7bo3bo4boo8bo119boo3bobo24bo68bobo10bo21boo10bo 86bobo9bo7boo13boo8bo88bobo8boo24bo7bo411b3o170bo15b3o20bo16bobo78boo 6boo16bo27bobo8bo13bo3bobbo12bo16boo3boo$68b3o15bobo7bobo6bobo131bobo 17bo5bobo69boo9b4o9boo5boo101boo8boo12boo5bobbo99boo7bobo12boo6bo3bo 422bo167b3o14bobo22bo94bo4bobbo4bo43boo7boo13bo17b3o16boo3boo$60boo8bo 15bo20bo130bobbo16boo5boo80boobobo7bobo5boo110boo4boo6bobo5bobo108b3o 4boo6bobo6bobo423boobbo172boo6bo3bo59boo55bo4bobbo4bo26bo24boo4boboo7b o3bo3bo$61bo7bo15boo20boo130bobo15boo87b3obobbo6bo118b3o4boo6bo117b3o 4bobbo5bo440bo16boo5boo3boo141boo5b5o37bobo20bo55bo4bobbo4bo24b3o23b3o 4bob3o7boo3boobo$58b3o179bobo13b3o88boobobo6boo119boo4boo5boo118b3o4bo 6boo438b3o16bo7b5o141bo6boo3boo37bo18b3o58boo6boo25bo27boo4bo19bo29boo $58bo22bobo158bo4bobo7boo3boo84b4o3boo124boo6boo123bobo7bo462b3o5b3o 150b5o38bo18bo95boo27boo23boo26booboo$82boo163boo9boo89bo5bobo124bo6bo bo123boo5boobo463bo6bo152b3o39bo57bobboboobobbo24b3o48bo51bobbo$82bo 165bo10bo97bo133bo133bo604bobo17bo39b3o55boobbo4bobboo24bo17bo64boo6bo 13bo$61boo105boo187boo132boo132boo231bobo369boo3b3o32boo18b3o56bobbob oobobbo6bo18bo82bo5bobo10bo$60bobo105boo687bo205boo3boo161bo13boo24bo 93b3o17b3o62bobbo8bo4bobo6boo11boo$62bo43bo81bo668bo208bo9bo158bobo7bo bo20b3o25bobboboobobbo56bo70bobo12bo10bobo3boo$36bo68b3o78b3o668bobbo 202bo5bo4bobo157b5o6bo22bo27b4oboob4o56boo19b3o47boo9bobbo3boo5bo3boo$ 36b3o50bo79bo15bo55bo615b3o204booboo6boo16boo138boo3boo22bo33bobboboob obbo16bobboboobobbo49b3o48bo6b4o3boobobo4bo3boo23boo3boo$39bo50boo76bo bo14boo52boo824bobo26bo138boo3boo20b3o17bo42boobbo4bobboo60bo44b4o14bo 3boo24b5o$38boo49boo14b3o59bo3bo68boo824bo24b3o130bo34bo20b3o41bobbob oobobbo49b3o9boo43bobbo8boo5bobo27b3o$167b5o894bo24bo121bo8boo35boo22b o102bo9bobo43b4o16bo11boo16bo$53b3o49bobo58boo3boo1040b3o7boo57boo102b o50boo4b4o27bo$55bo49bobo48b3o8b5o911bo132bo142boo3boo19b3o41bo6bobo7b o17bo7bobo$54bo100bo3bo8b3o897boo14bo130boo30b3o109boo3boo61boo7bo27b 4o4boo$105b3o47bo3bo9bo10booboboo881bo13b3o153boo6bo3bo109b5o63boo5boo 11bo16b4o$38boo3boo21boo88b3o21bo5bo45bobo834b3o166bo122bobo83bobo5boo 8bobbo$38bobobobo19bo3bo112bo3bo3boo41boo837bo167b3o3bo5bo32b3o102boo 41bo12boo3bo14b4o25boo$39b5o19bo5bo15bo19b3o74b3o5bo42bo983b3o21bo3boo 3boo5bo25booboo73b3o26boo40bo12boo3bo4boboboo3b4o26bo$40b3o3boo10boobb oobo3bo15b3o18bo63bo19bobo9bo20boo631bobo358b3o5bo30b3o24booboo101bo 55boo3bo5boo3bobbo30b3o$41bo3bobo10boo3bo5bo18bo78boo22boo8bobo19bo 635bo356bo3bobbobo29b5o23b5o144bo9boo3bobo10bo36bo$47bo16bo3bo18boo67b 3o8b3o30bo3boo6boo7bobo12boo621bo231bo132boo28boo3boo21boo3boo131bobo 8bobo7bobo4bo8bobbo$66boo10b3o74bo3bo8boo30bo3boboo4bobo6boo14bo618bo bbo229bobo123boo3boo33b5o160boo19bo$77bo3bo73bo3bo8bo31bo3bob3o4b3o10b o7b3o620b3o230boo163bo3bo104boo55bo9b3o6boo$90bo65b3o8bobo31boboboobbo 4b3o7boo8bo1010boo9bobo105bo17bo$76bo5bo7bo9bo66boo16bo16bo4boo4b3o9b oo1019bo10bo107b3o14boo83bo$58boo16boo3boo6bobo8boo84bo25bobo1017bo10b 3o95boo6boo16bo13bobo47b3o34bo$59bo28booboo6bobo82b3o25boo1019bo9bo95b o4bobbo4bo113b3o$42b3o14bobo7bo17bo5bo74booboboo923bo132b3o21bo26boo 55bo4bobbo4bo61bo16bobo$41booboo14boo4b4o20bo15bo92bo899bo153booboo25b o55bo4bobbo4bo59boo18bo$41booboo19b4o18boo3boo11b3o8bo44bo6bo5bo24bobo 895b3o120boo40bo17b3o58boo6boo62boo$41b5o19bobbo45bobo35bo6boo38boo16b obo1000bo31bo5bo4bo16bo151bo$40boo3boo18b4o4boobboo36boo35bobo5boo7boo boo5b5o33boo1002b3o37b3o55bobboboobobbo24b3o16boo56bo$66b4o5bo16b3o10b 3o44boo17bo6bob3obo8bo24bo1004bo28booboboo59boobbo4bobboo24bo18boo59b oo3bobbo3boo25bo$25boo42bo22boboo83bo3bo7bobo664bobo379bo78bobboboobo bbo6bo18bo17bo61b5o4b5o23bobo$25bo35boo31boo9bobo72b3o9boo11boo650bo 380bobo94b3o17b3o78boo3bobbo3boo24boo$13boo8bobo35boo17boo11boo10bobo 73bo22b4o649bo248bo132boo93bo70bobo13bo$13boo8boo55boo9bobo29bo80boob oo648bobbo243bobo227boo19b3o47boo14b3o$16boo71boobbo11b3o16bo45boo6boo 26boo649b3o245boo163bo23bobboboobobbo49b3o48bo17bo$16b3o21boo80b3o45b oo7bo589boo497bobo22boobbo4bobboo60bo55boo$16boo23bo19bo100boo12b3o6b oo9boo571bobo497boo23bobboboobobbo49b3o9boo113bo$6boo5boo23b3o5bo13b3o 9boo31b3o54boo12bo8bobo9boo572bo475bo108bo9bobo114bo$5bobo5boo23bo5b3o 12bo3bo7bobo32bo47b5o6boo19b3o7bo6bo16bo550boo475bo5boo100bo124b3o$5bo 37bo14bob3obo8bo78bo6bo5b3o19b3o12bobo15b3o890bo132b3o5boo73boo3boo19b 3o41bo25b3o$4boo37boo14b5o26b5o57bo4boo6boo19b3o12bo3boo16bo890bo214b oo3boo61boo26b3o$89bob3obo35bo30boo7boo5boo5bobo13bo3boo15boo446b3o 439b3o162bo52b5o63boo24bo3bo$90bo3bo34bobo30boo7bobo3bobo5boo14bo3boo 83boo244b3o739bo52bobo$91b3o36boo41bo3bo24bobo3boo80bo111b3o130bo3bo 129bo3bo602b3o80boo41bo20boo3boo$75bo16bo57boo3boo16booboo25bo4bobo47b oo19bobo6bobo110bo3bo129bo3bo129bo3bo657b3o26boo40bo87bo$64b3o8bo75b5o 54bo48boo13boo3bobbo5boo110bo5bo129b3o317bobo500bo128bobo$38boo3boo21b o7b3o49boo24b3o55boo46bo8boobboob3o5boo386b3o186bo233boo307bo86boo$41b o23bo60bo26bo112bobo3bo3bo3bo3boo113bo7bo451bo234bo19bo115boo158bobo8b obo$38bo5bo47boo22bo7bobo11bo27bo98bo8bobo5boo115bo7bo448bobbo234bobo 5boo10boo115bo158boo$39booboo30b3o15boo20bobo7boo13bo25bobo97bobbo6boo bbobbo387b3o184b3o235boo5boo9bobo115bobo7bo43bo48boo55bo9b3o$40bobo32b o28boo6boo23b3o25boobo4boo90bo13bobo118bo5bo129b3o566boo12boo111boo4b 4o3boboo34bobo48bo17bo$41bo33bo27bo3bo4boo51booboo3boo76bo6boo6bobo 132bo3bo129bo3bo129bo3bo431b3o10bo3bo114b4o4boboboobboo29boo49b3o14boo 69boo72bo$41bo33bo26bo5bo3boo26boo23boobo82boo4bobo7boo133b3o130bo3bo 129bo3bo431boo10bo5bo113bobbo3booboboobbobo55boo6boo16bo13bobo47b3o20b o73bo$75bo26bo3boboo4bobo23bo24bobo82bobo4bo278b3o563boo13bo3bobbo112b 4o3boo8b3o52bo4bobbo4bo98b3o72b3o$62b3o9b3o25bo5bo7bo24b3o22bo89boo 412b3o429boo13bo120b4o3boo8b3o51bo4bobbo4bo61bo16bobo17bo$61bo3bo28boo 7bo3bo35bo974bo3bo3bo114bo12b3o52bo4bobbo4bo59boo18bo56bobboo4boobbo$ 39bo6b3o11bo5bo26bobo8boo1013boo3boobo125bobo6boo28bo18boo6boo62boo73b o3b3obb3o3bo$38b3o5bo13booboboo7b3o16bo21bo1011bo125boo7bobo28bo108bo 56bobboo4boobbo5bo$37bo3bo5bo27bo16boo22boo1009boo135bo26b3o31b3o16boo 56bo73b3o$36bob3obo32bo39boo126boo1019boo60bo18boo59boo3bobbo3boo55bo 29bo26boo$37b5o21bo36bo143boo612bobo465bo17bo61b5o4b5o55boo26bobo27bo$ 62bobo32b4o142bo613bo467b3o78boo3bobbo3boo14bobboo4boobbo56boo27boboo 5boo$62bobo24boo5b4o12boo584boo157bo517bobo13bo41bo3b3obb3o3bo85bo7bob o$54boo7bo25boo5bobbo13boo583bobo156bobbo464b3o47boo14b3o40bobboo4boo bbo90bo4b3o$54bobo39b4o12bo587bo156b3o440bo14bo9b3o48bo17bo141bobbo4b 3o$54bo8boo32b4o599boo596bobo14b3o19bo55boo142boo4b3o$63boo35bo22boo 100bo10bo13boo114boo132boo131bobo663boo17bo6b3o9boo173bo21bo7bobo6boo$ 115boo6bo101boo9boo12bo114bobo132boo4b3o123bobbo4bo676boo7bo9bobo131b oo3boo36bo20boo6boo7bobo$115bobo6b3o94boo3boo7bobo4bo5bobo100bo12b3o4b oo113bo10boo6b5o112bo8boo5boo686bo144b5o35b3o19bobo17bo12bo$41boo72bo 10bo99b3o13bobo3boo96bo4b4o8b3o4bobb4o109bobo7b3o5bo3bobo110bobo5boo3b o8boo680b3o41bo25b3o73booboo77boo11b3o$41bo184boo15bobo100bo5b4o8b3o4b oob3o112boo6boo6bo3boo110boobo6boo10boo675bo46boo26b3o73booboo93bo$42b 3o16b3o154boo5boo16bobbo94boo9bobbo9bobo107boo12boo9boo107boo10booboo 6bobbo671bo10booboo45boo24bo3bo73b3o68bo24boo$44bo16bo41booboboo19bobo 85bobo5bo17bobo95boo9b4o10boo107boo12boo9boo107boo10boobo8bobo672bo 235bo$62bo61boo3bobbo84bo24bobo106b4o8bo122bobo132bobo682b3o8bo5bo5boo 41bo20boo3boo142b3o$103bo5bo7boobboob3o5boo6boo74boo24bo108bo12bo121bo 11bo123bo9bo697boo40bo147bo5boo$116bobo3bo3bo3bo3boo4boo220b3o131bobo 134bo222bobo458booboboo5bo6bo181bobo6boo41b3o$104booboo6bo8bobo5boo 363boo132b3o225bo474b3o35bo102boo42boo5bo5boo35booboo$106bo8bobbo6boo bbobbo726bo473bo26bobo8bobo101bo29boo24bobo35booboo$69boo20boo22bo13bo bo724bobbo473boo25boo114b3o27bo23bo38b5o$69bobo19bo24bobo738b3o455bo 45bo9b3o104bo27bobo7boo12bobbo17bo16boo3boo$57boo10bo11bo7bobo25boo 1194bobo6bo7bo120bobboboobobbo44boo6bobo12bo18bobo$58bo20bobo7boo280bo 133bo808boo6boo6bo62boo56b4oboob4o27bo23b3o5bo8bobo5boo9boo$58bobo5boo 9boo26boo262bobo134bo133bo680bobo47b3o20bo56bobboboobobbo25b3o22b3o5bo bobo6boo5bobo29boo$59boo5boo9boo26boo263boo132b3o131bobo750b3o93bo26b 3o4b4o16bo27b5o$69boo6boo18boo282boo132boo122boo8boo677boo3boo36bobo 17bo74b3o18boo26bobo23boo30bo$69b3o7bobo16bo282bobo131bobo131bobo677b 5o20bo17bo56bobboo4boobbo23b3o47boo51b3o$69boo10bo16bobo8boo272bo133bo 133bo660bo17b3o95bo3b3obb3o3bo23bo82boo6bo10bo$66boo31boo8boo272boo 132boo132boo657boo4b3o12bo19boo19bo56bobboo4boobbo5bo18bo82bo8bo10boo$ 66boo27boo9boo6bo263bo932boobbooboo5b3o24bo19bo73b3o18bo74boo3boobo6b 3o10boo$95bo9b3o6bo232boo30bo101boo30bo101boo30bo667booboo5bo23b3o24b oo3bobbo3boo55bo20bobo48bo12b3obbo5bo3bo3bo$61boo24bo5bobo10boo240bo 28b3o102bo28bobo102bo31bo209bobo454b5o6bo22bo26b5o4b5o55boo68boo9bo3bo 9bo$62bo24bobo3boo14boo6boo229bobo5bo125bobo6bo20boo102boboo5boo19b3o 208bo456boo3boo22bo32boo3bobbo3boo14bobboo4boobbo98boo6bobo4bo8bo3bobb o22boo3boo$62bobo5bo17bobo18boo6bobo220bo8boo3b4o116bo8boo6boo115bo8bo 7bobo229bo483b3o17bo41bo3b3obb3o3bo47bobo9boo42boo16bo5bo23bobobobo$ 63boo5boo16bobbo12bo14bo218b3o12boboboo113b3o11boo4boo112b3o12bo4b3o 228bobbo479bo20b3o40bobboo4boobbo49bo11boo41boo17bo3bo25b5o$71boo15bob o14boo12boo216bo14bobbob3o111bo14boo4b3o110bo13bobbo4b3o227b3o434bo8bo bo34boo22bo102bo10bo43boo18boo11boo15b3o$71b3o13bobo5b3o6boo231boo14bo boboo112boo13boo4boo111boo13boo4b3o665b3o6boo58boo102bo50boo4bobo28bo 17bo$60bo5boo3boo7bobo4bo9bo256b4o9boo122boo8boo10boo110bobo7boo660bo 6bo23b3o135b3o48bobo6bo19bo6bobo$60b3o7boo9boo13bo259bo10bobo112boo7bo 9bobo10boo109boo8bobo658boo142boo3boo19b3o39bobo6bo28bobo4boo$63bo6bo 10bo287bo16boo95boo18bo9bo6boo115bo16boo663boo7bobo110b5o62boo6boo11b oo18boo$62boo305boo15bo95bo20boo15bo116boo15bo664bo7b5o33b3o73booboo 25bo37bo17bo3bo17boo$387b3o131b3o131b3o641bo20b3o3boo3boo5bo26b3o73boo boo25boo53bo5bo16boo24boo$66bo28boo14bobo218boo3boo50bo102bo30bo102bo 30bo640b3o21bo3boo3boo4b3o24bo3bo73b3o25bobo52bobbo3bo8bo4bobo26bo$66b o3boo17boo4bobbo13boo221bo130booboboo17bobo134bo669bo3bo4bo29b5o191bo 9bo3bo29b3o$71bo16boobo7bo12bo219bo5bo152boo13bo118b3o12boo654bob3obo 4bo27boo3boo21boo3boo153bo3bo3bo5bobb3o35bo$71bobo5boo10bo7bo25bo207b ooboo128bo5bobbo30boo92boo3boo34boo654b5o3b3o194bo9b3o7boboo3boo$62boo 3boo3boo5bobo8bo8bo23b3o208bobo3boo133boo28bobo94b3o35bo215bobo641boo 10bobo7bo$63b5o12b3o12bobbo5boo16bo212bo5boo41boo81booboobbobo41boo81b o3bo46boo205bo585boo54boo9b3o6boo$64b3o14b3o11boo7bobo15boo211bo4bo43b o84bo48bo83bobo47bo206bo466boo9b3o105bo17boo47b3o$65bo14b3o23bo267bo7b obo114bo6bo9bobo84bo36bo9bobo203bobbo467bo9b3o106b3o15boo46b3o$79bobo 24boo8bo231boo22bobo7boo98boo16bo4bobo8boo98boo20b4o8boo205b3o464b3o 121bo14bo48b3o34bo$79boo4bo29bo233bo20boo111bo14b3o3boboo109bo19bobob oo671bo9bo11bo84bobboboobobbo79bobo32bobo$84bo30b3o214boo15bobo5bo12b oo94boo15bobo4bo12booboo92boo15boboo3boo10bobbob3o668bobo20bobo25boo 56b4oboob4o79b3o33boo$84b3o246bo16boo3bobo12boo95bo16boo3bobo12boboo 93bo16bo3bo3bo10boboboo670boo19bo3bo25bo56bobboboobobbo60bobo$330b3o 21bobo15bobo89b3o7boo11boo3bo12bobo90b3o26bo10b4o659boo32b3o23b3o129b oo$330bo22bobbo17bo89bo9bobo10boo3bo13bo91bo21bobbo3bo12bo660bo31boo3b oo4bo16bo74b3o17bo37bo$66bo52b3o232bobo117bo12boo3bo128bo5bo674b3o37bo bo54bobboo4boobbo23b3o17boo$67boo49bo3bo232bobo131bobo7bo122bo3bo677bo 38boo53bo3b3obb3o3bo23bo17bobo62bobobbobo28bo$66boo32bo7bo8bo5bo233bo 132bo6boo125boo5bobo687bo77bobboo4boobbo5bo18bo78boobobbobbobboboo25bo $77bo21boo7bobo6bo5bo374boo5boo124boo5b3o681bo93b3o18bo82bobobbobo27b 3o$77bobo19bobo6boo10bo250b3o131bobo124bo5bo681b3o92bo20bobo48bo14bo$ 77boo39bo3bo248bo12bo120bo11bo121bo9bo208bobo554boo68boo15b3o$95bobo 23bo226boo22bo8b4o96b3o31bobo130bobo206bo493bo22bobboo4boobbo98boo17bo $60boo3boo28bobbo18bobbo227bobo17boo10b4o9boo86bo20boo9boo12boo107bobo 8boboo10boo194bo494bo20bo3b3obb3o3bo47bobo9boo54boo$62b3o8bobo22boo17b o115boo113bo19bobo9bobbo9boo87bo19boo9boo12boo107bobbo6booboo10boo194b obbo489b3o21bobboo4boobbo49bo11boo$61bo3bo8boo20bo3boo16bo115bo100boo 32b3o8b4o5bo79boo19bobo12boo6boo88boo34boo6boboo206b3o577bo10bo115bo$ 62bobo9bo23boo15b3o116bobo5bobo22boo67bo33b3o8b4o4bo80bo19boo13b3o7bob o86bo32bo3boo5bobo678bo5boo100bo69bo54bobo$63bo23boo6bobbo6boo8bo119b oo3bo3bo22bo68bobo10bo19b3o12bo85bobo10bo7bo13boo10bo86bobo9bo22boo8bo 677bobo5boo99b3o67b3o54boo$68boo16bobo6bobo7bobo132bo19bo4bobo69boo9bo bo10boo5bobo100boo9b4o9boo5boo101boo8boo12boo5bobbo688boo80boo3boo19b 3o39bobo24bo3bo$60boo5bobo16bo20bo131bo4bo14b4ob3o81boobo8bobo5boo111b oobobo7bobo5boo110boo4boo6bobo5bobo772b5o62boo24bob3obo$61bo7bo15boo 20boo131bo12bo4booboboo83booboo7bo119b3obobbo6bo118b3o4boo6bo730bo51b ooboo25bo37bo25b5o$58b3o20bo158bo3bo3boboo5b3obobbo83boobo7boo120boobo bo6boo119boo4boo5boo728bobo51booboo25boo$58bo23boo158bobobbob4o5boobob o84bobo4boo125b4o3boo124boo6boo733boo52b3o25bobo128bo$81boo164boobboo 6b4o86bo5bobo125bo5bobo124bo6bobo946bo$260bo96bo133bo133bo944b3o$168b oo187boo132boo132boo684boo159bo9b3o$60b3o43bo61boo686bobo453bo157boo 10bobo$62bo43bo81bo670bo452bobo6bo7bo36bo48boo54boo9b3o$36bo24bo43b3o 78b3o670bo453boo4bobo5b4o36bo47bo17boo47b3o$36b3o49bobo94bo54bobo613bo bbo457boo8boobbobboo29b3o48b3o15boo46b3o19boo$39bo49boo78bo16bo53boo 615b3o457boo11boobboo82bo14bo48b3o20bo73bo$38boo49bo15b3o60b3o12bobbo 54bo1075boo7bo10boo52bobboboobobbo79bobo17b3o72bobo$106bo60bo3bo10bo 1136bobo4bo10b3o51b4oboob4o79b3o17bo75boo$42bo10boo51bo59bob3obo8bo3bo 1135bo4bo10boo52bobboboobobbo60bobo78bo4bo$42bo9bobo51bo60b5o11bo1150b oo7boo118boo77boob4oboo$54bo51bo49b3o21bo5bo1147boo7bobo28bo31b3o17bo 37bo79bo4bo9bo$96bo8b3o47bo3bo20bo5bo47bo1110bo26bobo31b3o17boo129b3o$ 38boo3boo21bo30boo55bo5bo20bo3bo46boo1111boo26boo32bo17bobo62bobobbobo 58bo29bo26boo$39b5o21bobo28boo84b3o4boo42boo1172bo78boobobbobbobboboo 54boo29bo26bo$40b3o20boo3bo16bo19b3o45bo7bo28bo1216bo82bobobbobo21bo4b o60b3o26bobo6boo$41bo16boo3boo3bo16b3o18bo46bo7bo6bobboo17bobo8bo21boo 1181bobo48bo14bo44boob4oboo88boo6boo$45b3o10boo3boo3bo19bo17bo61bobo 20boo8bobo19bo634bobo594boo15b3o44bo4bo101boo$47bo17bobo19boo65bo5bo6b oo33bobo7bo8bobo12boo619bo523bo14bo59boo17bo143bo6b3o$46bo19bo41bo46bo 3bo6boo17bo16bobbo6boo7boo14bo619bo524bo13b3o7bobo9boo54boo143bo6boo$ 78b3o25bobo47b3o7boobo32bobobboo4boo10bobo6b3o620bobbo519b3o16bo7bo11b oo194b3o5boo7boo$77bo3bo25boo58b3o31bobo3boo4b3o9boo7bo622b3o538boo7bo 10bo175bo21boo5boo7bobo$76bo5bo7bo94bo15bo5boo4boo11bo1180bo69bo73boo 3boo34bobo20bo18bo12bo$58boo16booboboo6b3o7boo82bobo26boo1187bo4b3o67b 3o114boo39boo11b3o$59bo29b3o8boo66boo3boo9boo26bo1187bobo3b3o39bobo24b o3bo72bo3bo93bo$42b3o14bobo7boo28bo6bo64bo28bo1198bo3bo44boo24bob3obo 72b3o93boo$60boo6b3o16boo3boo12bo61bo5bo24bo1189bo10b3o8bo37bo25b5o73b 3o69bo$42bobo20boboo5bo12boo3boo11b3o52bobo6booboo25b3o17bo1167bobo8b oo3boo6boo195bo14bobo$41b5o19bobbo4bo3bobo80boo8bobo5boo3boo32boo1169b oo20bobo188bo6boo14boo25b3o$40boo3boo18boboo5b4o83bo9bo20bo25boo1197bo 184bo4bobo41b3o$40boo3boo21b3o4b3o14boo11b3o63bo7bo3bo9bo1221b3o138boo 42b3o10boo35bo3bo$69boo21bobo11bo73b3o8b3o1220bo27bo9b3o101bo29boo23bo bbo$61boo16bo14boo10bo73b3o673bobo555boo24boo10bobo102b3o27bo22bo38boo 3boo$61boo14boobo12boo11bo98boo652bo536bo44boo9b3o104bo27bobo7boo11bo 21bo$77b5o11boo11bo16bo30bo48booboo651bo537bo5boo47b3o76boo3bobbo3boo 43boo7boo11bo22bo$77b3obo7b3o13b3o13bobo21bo6boo16boo6boo23b4o649bobbo 535b3o6boo46b3o19boo55b5o4b5o26bo22boo15bobbo5boo9b3o$40boo38bo41boo 21bobo5boo15boo7bo24boo563boo86b3o543bo48b3o20bo55boo3bobbo3boo24b3o 21b3o6bobo8boo5bobo$41bo103boo15boo12b3o6bo10bo572bobo680bobo17b3o73bo 19bo25boo6boboo16bo30b3o$18bo19b3o19b3o42b3o54bobo11bo8boo9boo573bo 637boo3boo36b3o17bo75bo19boo27boo4b3o16boo26boo$18b3o17bo21b3o8b3o32bo 50boo4b3o15boo3boo7bobo4bo17bo550boo636bobobobo98bo4bo77boo51boo$21bo 37bo3bo9bo15boo3boo10bo46bobbobbo4b3o19b3o13bobo15b3o1174b3o10b5o97boo b4oboo26bo82boo16boo$20boo50bo57bo21bobooboo4b3o20boo15bobo17bo1167bob o3b3o6boo3b3o18boo80bo4bo9bo17bobo81bo8bo9bobo$58boo3boo25bo3bo36bo19b o3bo6bobo6boo5boo5boo16bobbo15boo1167boo3bo3bo5bobo3bo20bo93b3o81boo9b oo5bobo6bobo10boo$91b3o35b3o19b5o6boo7bobo3bobo5bo17bobo464b3o719bo13b o23b3o27bobobbobo58bo20b3o61bobo7bobo5boo8boo$91b3o56boo3boo16bo3bo24b obo3boo193bo132b3o130bo3bo721boo3boo28bo25boobobbobbobboboo54boo68bobo 6bo5bo8bo$151b5o17booboo24bo5bobo47bo20boo121bobo130bo3bo129bo3bo750bo 35bobobbobo21bo4bo65bo35boo6bobo13bobbo27boo3boo$23bo40boo9bo76b3o55bo 47boo14bo4boo120bo3bo128bo5bo129b3o749b3o17bo44boob4oboo50b3o10boo35bo 5boboo13bo30boo3boo$22b3o38bobo8b3o49boo25bo56boo45bobo8boob5o6boo117b o3bo452bobo560bo20b3o44bo4bo64bobo40booboo14bobo$21b5o39bo7bobobo48bo 140bo4boobbo5b3o116bo3bo127bo7bo315bo517bo9bo35boo22bo101bobo53boboo 15boo12boo15b3o$20bobobobo46bobobo14boo23bo6bobo11bo25bo101bo8boo5boo 117bo3bo127bo7bo315bo517b3o5boo59boo102bo50boo3bobo29bo16b3o$20boo3boo 47b3o15boo20b4o6boo10bobo25bobo99bo7bo4boo7boo111bo3bo451bobbo517bo5b oo23b3o186bobo4bo23bo4bobo17bo$65bo9bo29bo7b4o20boo28boo4boo91bo12boo 7bobo110bo3bo128bo5bo129b3o184b3o517boo29booboo135bo41bo7bo29bobo3boo$ 104bobo6bobbo50boo4boo83boo7bo22bo111bobo130bo3bo129bo3bo726boo6booboo 34bo73boo3boo20bo39boo7boo12boo15boobo$23bo79bo3boo4b4o23boo25boo81boo 5bobo8boo20boo111bo132b3o130bo3bo706bo19bo7b5o6bo26b3o103boo35boo20bob o14booboo$22bobo50bo27bo3boo5b4o22bo23bobo84boo4bo412b3o706bobo19b3o3b oo3boo4b3o24bo3bo72bo3bo26boo59bo13boobo24boo$21boobo49b3o26bo3boo8bo 23b3o20bo85bo5boo1120bo3bo20bo13b5o22bob3obo72b3o26bo58bobbo13bobo25bo $21b3o38b3o8bobobo16boo8bobo36bo1234b5o33bobobobo22b5o73b3o88bo8bo5bo 27b3o$20bobbo37bo3bo7bobobo15bobo9bo1271boo3boo4bo27boo3boo171bo9boo5b obo7bobo35bo$20b3o37bo5bo7b3o16bo21bo1262b5o3bobo204b3o7bobo5boo9boo$ 19bo3bo36bo5bo8bo16boo1285b3o5boo192bobo8booboo6bo$18bo5bo38bo53bo125b o1136bo38bo106boo17bo35boo8b3ob3o4boo$19bo3bo5bo31bo3bo34boo15bo125boo 1162boo9bobo105bo18boo35bo8b3ob3o$20b3o7bo31b3o34b3o140bobo611bobo549b o8boobo106b3o14bobo44b3ob3o$28b3o32bo25boo5boboo598boo159bo545b3o9b3o 109bo61b3ob3o32bo$89boo5bobbo9bo588bobo158bo535bo9bo10bobbo81boo3bobbo 3boo77booboo34bo$96boboo8boo590bo155bobbo536bo19b3o25boo55b5o4b5o78b3o 33b3o$63boo34b3o598boo155b3o534b3o18bo3bo25bo55boo3bobbo3boo60bo18bo$ 63boo35boo21boo99bo25boo115bo132boo132boo746boo30bo5bo21b3o73bo54boo$ 123bo98b4o6boobboo12bo115boo131bobo132boo4b3o739bo32bo3bo5bo16bo75bo 18boo35boo$37bo77b3o6b3o94boboboo5b4obobbobo5bobo93bo5boo13boo4boo112b o12b3o4boo113bo10boo6b5o739b3o30b3o7bo57bo4bo48boo$18boo15bobo77bo10bo 93bobbob3o5boobo3bo3bo3boo92bo3bo3b3o11b3o4boobboo103bo4b4o8b3o4bobb4o 109bobo7b3o5bo3bobo740bo38b3o55boob4oboo26bo18bo63b8o$19bo16boo78bo 103booboboo4bo12bo101bo5boobo9boo4boobboo103bo5b4o8b3o4boob3o112boo6b oo6bo3boo839bo4bo9bo17bobo81bob4obo29bo$16b3o84boo3boo108b3ob4o14bo4bo 95bo5bo4bobbo10boo107boo9bobbo9bobo107boo12boo9boo767bo93b3o101b8o27bo bo$16bo89bo22boo86bobo4bo19bo96boo9boobo11bo107boo9b4o10boo107boo12boo 9boo765bobo92bo20b3o63bo53boo$103bo5bo14bo4boo86bo22bo3bo105b3o10bo 121b4o8bo122bobo779boo92boo68bobo14b3o$104booboo9boob5o6boo6boo74boo 22bobo107boo9bobo121bo12bo121bo11bo826bo4bo65bo35boo18bo$44bo60bobo9bo 4boobbo5b3o5boo220boo132b3o131bobo800bo23boob4oboo50b3o10boo35bo17boo$ 45bo60bo9bo8boo5boo497boo225bobo570bobo25bo4bo64bobo$43b3o60bo9bo7bo4b oo726bo574boo83bobo68bo56bo$73boo6boo33bo12boo726bo552bo5boo100bo68bob o56bo$53bo19bo7boo34bo739bobbo550bo4boo168bo3bo53b3o$51bo3bo7boo6bobo 44boo250bo486b3o549b3o106bo41bo25b5o$51bo3bo7boo6boo298bo133bo133bo 851boo3boo20bo39boo25boo3boo$53boo5boo43boo262b3o131bobo134bo799bo81b oo35boo25b5o$59b3o6bo36boo397boo132b3o800bo50bo3bo26boo62b3o$60boo6bo 13bo298boo132boo132boo788b3o51b3o26bo65bo$46bo16boo5b3o7booboo296bobo 131bobo131bobo841b3o157bo$45bobo15boo5boo311bo133bo133bo912bo86bobo$ 38bo7bo25bo6bo5bo297boo132boo132boo739boo169b3o86boo$37bobo338bo133bo 880bo157bobo8booboo$38bo12b3o25booboboo261boo27bobo102boo30bo101boo30b o745bobo4bo9boo84boo17bo35boo8b3ob3o$51bobbo293bo28boo103bo28b3o102bo 28bobo746boo3bobo7b4o35bo47bo18boo35bo8b3ob3o$51bo10bo285bobo5bo125bob o5bo125bobo6bo20boo208bobo539boboo5b3obbobbobo28bobo48b3o14bobo44b3ob 3o17boo$44b3o4bo3bo6bobo13boo260bo8boo4bobo116bo8boo3b4o116bo8boo6boo 232bo537booboo9boobbobbo28boo50bo61b3ob3o18bo73bo$45bo5bo10boo14bobo 257b3o13boboo114b3o12boboboo113b3o11boo4boo231bo538boboo6bo9boo51boo3b obbo3boo77booboo16b3o75bo$38b3o4bo6bobobboo20bo257bo15booboo113bo14bo bbob3o111bo14boo4b3o227bobbo539bobo5bo8bo3boo49b5o4b5o78b3o17bo41b6o 28b3o$39bo39boo256boo15boboo113boo14boboboo112boo13boo4boo229b3o540bo 6bo10boo51boo3bobbo3boo60bo18bo59bo6bo$39bo29bo8b3o274bobo9boo119b4o9b oo122boo8boo10boo766bobbo5boo62bo54boo78bo8bo$35boo5boo16bobo5bobo7boo 276bo10bobo120bo10bobo121bo9bobo10boo765bobo6bobo28bo32bo18boo35boo78b o6bo8bo$37bo22bobo4bo3boo8bo287bo16boo115bo16boo115bo9bo6boo770bo29bo 51boo115b6o7b3o$61bo5bo3boo296boo15bo116boo15bo116boo15bo771boo26b3o 31bo18bo63b8o58bo$46bo20bo3boo314b3o131b3o131b3o829bobo81bob4obo21b6o 31boo29bo$45bobo20bobo261boo3boo50bo76boo3boo50bo133bo913b8o20bo6bo59b obo$38bo7bo10bo11bo10bo251boo3boo130bo130booboboo880b3o63bo44bo8bo59b oo$37bobo17b3o19b3o384bo5bo1063bobo14b3o43bo6bo$38bo12b3o6bo17b5o251b 3o34bo95booboo33boo93bo5bo870bo22bo35boo18bo43b6o$50bobbo5boo11bo4boo 3boo250b3o34boo95bobo35boo955bo13b3o7b3o10boo35bo17boo$53bo6b3o7booboo 3b5o252bo34bobo11boo83bo35bo12boo81booboo46boo82boo120bobo600bobo16bo 18bobo$53bo7bobo14bo3bo301bo84bo48bo84bo48bo84bo119bo604boo15boo6bobo 68bo116bo$50bobo7bo3bo4bo5bo3bobo293bo6bobo123bo7bobo121bo9bobo84bobo 6bo110bo630bo68bobo116bo$60b5o15bo267boo22b4o6boo98boo22bobo7boo98boo 21bobo8boo86boo6boo109bobbo620b3o72bo3bo72b5o36b3o$59boo3boo3booboboo 273bo21b4o108bo20boo111bo20boboo99boo4boo108b3o621b3o4bo41bo25b5o71bob 3obo$60b5o267boo15bobo5bobo11bobbo91boo15bobo5bo12boo94boo15bobo4bo12b ooboo99boo4b3o730bo3bo3bo39boo25boo3boo71bo3bo$44boo15b3o15boo252bo16b oo3bo3bo11b4o92bo16boo3bobo12boo95bo16boo3bobo12boboo99boo4boo721bo8bo 5bo6boo35boo25b5o73b3o$44boo16bo16boo249b3o22bo16b4o88b3o21bobo15bobo 89b3o7boo11boo3bo12bobo104boo8boo713bo8bo3bo8boo62b3o75bo$330bo23bo4bo 15bo88bo22bobbo17bo89bo9bobo10boo3bo13bo105bo9bobo710b3o9b3o8bo65bo$ 355bo10bo121bobo117bo12boo3bo131bo739bo184bo$355bo3bo4boo123bobo6bobo 122bobo132boo736b3o35bo102boo42bobo$63bo293bobo5boo124bo6boo124bo870bo 37b3o101bo44boo$60boo437bo139boo854boo24bobo8booboo101b3o$43b3o5b3o6b 3o8boo299boo131b3o131bobo843bo35boo8b3ob3o102bo$51bobbo6boo8boo299bobo 9boo119bo12bo120bo11bo826bo6boo35bo8b3ob3o77bobobbobo$43bobo5bo9bo310b o10b3o96boo22bo8b4o130bobo204bobo617bobo5bobo44b3ob3o17boo54boobobbobb obboboo25bo$42b5o4bo8bobo305bo11boboo9boo87bobo17boo10b4o9boo107boo9b oo12boo196bo617boo52b3ob3o18bo58bobobbobo27b3o37bo$41boo3boo4bobo5boo 306boo10bobbo4bo5bo87bo19bobo9bobbo9boo107boo9boo12boo196bo672booboo 16b3o93bo41bo$41boo3boo287boo27boo3boo9boboo5bo79boo32b3o8b4o5bo79boo 19bobo12boo6boo207bobbo630boo3boo36b3o17bo41b6o48boo38b3o$336bo32b3o 11b3o3bo3bo76bo33b3o8b4o4bo80bo19boo13b3o7bobo205b3o619bo10boo3boo37bo 59bo6bo$61booboboo268bobo8bo21boo13boo5bo78bobo10bo19b3o12bo85bobo10bo 7bo13boo10bo826b3o112bo8bo60boo$46boo289boo8bobo11boo5boo101boo9bobo 10boo5bobo100boo9b4o9boo5boo168bo666bo3bo3bo4b3o3b3o18boo79bo6bo8bo17b 3o32boo$46boboo11bo5bo282boo8bobo5bo113boobo8bobo5boo111boobobo7bobo5b oo166b3o664boo3bob3obo3bo5b3o19bo80b6o7b3o17bobo$49bo300boo8bo121boob oo7bo119b3obobbo6bo174bo668boo3b5o5bo5bo17b3o27b8o58bo20b3o$62booboo 283boo7boo121boobo7boo120boobobo6boo174boo706bo29bob4obo21b6o31boo19b 3o32b3o32bo$44bob3o8bo6bo282bobo5boo125bobo4boo125b4o3boo880bo35b8o20b o6bo51b3o10boo20b3o30bobo$44bo11boo289bo7bobo125bo5bobo125bo5bobo877b 3o17bo44bo8bo50b3o11boo53boo$44bo11bobo298bo133bo133bo876bo20b3o43bo6b o51bobo10bo$66boo289boo132boo132boo829bo45boo22bo43b6o52b3o$66bo733b3o 653b3o5bobo23b3o32boo134boo3boo$67b3o729bo3bo54bobo598bo4boo24b3o169b 5o$69bo787bo600boo5bo23bo3bo34bo134b3o39bo$43boo3boo748bo5bo52bo623boo 17bo26bobo104bo29bo41bo$45b3o16boo9boo621bo99boo3boo52bobbo599b3o18bo 6boo3boo4b3o24bo3bo72b5o26boo68b3o$44bo3bo14boo9bobo619b3o158b3o600b3o 19b3o14b3o24b5o71bob3obo24bobo$45bobo10bo6bo7b3o4boob3o609bo788bo40boo 3boo71bo3bo$46bo10bobo12b3o4bobb4o609boo104bo695boo3boo22b5o73b3o$50b oo3boo3bo12b3o4boo718boboo665bo27boo3boo23b3o75bo$50boo3boo3bo13bobo 723bo657boo3boo5bo57bo181boo$55boo3bo14boo723bo3bo654b5o4b3o192bo46bo$ 46boo9bobo741bobbo655b3o36boo106boo17boo33boo48b3o$46boo10bo742b5o655b o26boo9bobo105bo19boo33boo49bo$801b5o683bo8bobboo105b3o15bo$800boo3boo 679b3o11boo108bo$801b5o680bo13boo83bobobbobo$692b3o99bobo5b3o51bobo 618bo23bo23boo54boobobbobbobboboo$691bo3bo98boo7bo55bo615bobo48bo58bob obbobo70boo3boo$690bo5bo98bo63bo603boo11boo17bo5bo21b3o93bo34bobo8b3o$ 691bo3bo160bobbo603bo31bo5bo21bo41b6o48boo33boo8bo3bo$692b3o162b3o604b 3o29bo3bo6bo56bo6bo46bobo34bo9bobo$692b3o771bo30b3o5bobo55bo8bo93bo$ 1506boo56bo6bo8bo17b3o$779boo7bo695bo80b6o7b3o17bobo$690boo86bobo5boo 17boo678bo91bo20b3o$691bo86bo8boo16bo677b3o54b6o31boo19b3o47bo16boo$ 688b3o86boo27b3o730bo6bo51b3o10boo33boo17boo$688bo119bo705bo23bo8bo50b 3o11boo33boo$1515bo23bo6bo51bobo10bo$1513b3o24b6o52b3o$1497boo$779bobo 76bobo631bo4boo$779boo76bo632bobo$780bo76bo633boo111bo34bobo$857bobbo 712b5o26boo33boo$857b3o662bo49bob3obo24bobo34bo$782bo737bobo50bo3bo$ 756boo22b3o738boo51b3o$756bobo14bo5bo795bo$758bo12boo6boo692boo$758boo 12boo700bo158bo$1474bobo4bo95boo17boo33boo$1475b3ob4o6boobboo34bo47bo 19boo33boo$777bo699booboboo5b4obobbobo30bo47b3o15bo$776b3o698bobbob3o 5boobo3bo3bo26b3o49bo$776b3o699boboboo4bo12bo53bobobbobo$856bobo620b4o 14bo4bo48boobobbobbobboboo$774boo3boo78bo621bo19bo53bobobbobo$774boo3b oo78bo637bo3bo3boo82bo34bobo$751bo104bobbo637bobo5bobo81boo33boo$751b 3o103b3o647bo29bo50bobo34bo$754bo9bo12boo728boo26bobo$753bo9b3o10bobo 757boo30b3o$753bobbo5boobo9boobbo788bobo$757bo4b3o11boo790b3o$754bo3bo 4boo11boo790b3o47bo$756bo19bo781bo9b3o10boo33boo$753bo5bo784bo13b3o7b 3o11boo33boo$753bo5bo16bo5bo762bo15bo6bobo10bo$754bo3bo17bo5bo760b3o 14bo7b3o$755b3o12bo6bo3bo778bobbo$770bobo5b3o77bobo703bo$760boo8boo85b o703bo3bo$761boo94bo705bo10bo34bobo$760bo96bobbo699bo5bo7boo33boo$421b oo5bo19boo105boo5bo19boo105boo5bo18bobo139b3o692bo7bo5bo6bobo34bo$421b oo5b3o16bobo105boo5b3o17boo105boo5b3o15bobbo48boo782bobo8bo3bo$431bo 14b3o12bo103bo13boo10bo4bo102bo13boo10bo6bo33bobo782boo9b3o14bo$430boo 5boo6b3o8boo3b4o99boo5boo5b3o10bo4bobo99boo5boo4boo3bo8bo5bobo32bo14b oo794b3o$437boo7b3o8boo3b4o105boo6boo10bo7boo104boo6boo9bo6boobo46bo 794bo$447bobobbooboboo3bobbo5boo109boobboo11boo4boo107bobbobboo9booboo 22bo23b3o791boo25bo$448boobboobobo4b4o5boo109boobbobboo8boo4boo81b3o 24bobobbobb3o5boobo22b3o24bo781boo33boo$420b3o31boobo3b4o89b3o30b4o5bo bo89b3o29b4o7bobo3boo18b3o799bo7boo33boo$461bo91booboo30bo7bo90bo3bo9b o19boo9bo4bobo820bo5bo$420bobo130booboo9bo132b3o36bo15boo3boo11b3o782b 3o$419b5o9bo119b5o8b3o117boo3boo6b5o35boo14boo3boo11bo$418boo3boo7b3o 12bo104boo3boo6b5o128bobobobo69bo23boo56bobo701bo10boo3boo$418boo3boo 6b5o9boo117boo3boo8bobo116boo3boo9bo83bo60bo699bobo12bo$430boo3boo9boo 131boo131boo11boo37boo21boo7bobo60bo698bo3bo4boobbo5bo$431b5o144bo132b oo8bo4bo36bo16bo4boo7boo58bobbo698b5o4bobobbooboo17boo$421bo9bo3bo153b 6o106bo20bo6bo35bobo8boob5o6boo65b3o692bobobboo3boo3bo5bobo19bo$422boo 8bobo20bo4bo95boo8b3o19bo6bo104bobo18bo8bo29boo4boo7bo4boobbo5b3o759b oo4b5o11bo17b3o$433bo19boob4oboo103b3o18bo8bo103bobo18bo8bo29bo13bo8b oo5boo761bo5b3o12bo17bo$424bobbo27bo4bo102bo24bo6bo101bo3bo19bo8bo30b 3o10bo7bo4boo771bo25bo$424bobbobo132bobo8bo15b6o101b5o21bo6bo33bo10bo 12boo795b3o$420bo9boo130boobo5boo122boobobo11bo10bo4bo46bo807bo$423bo 6boo6bo123booboo5boo120b3obobbo10bobo10boo49boo759bo34bo10boo$420boo8b oo6bo123boobo129boobobo11boo823b3o6bo24b3o$427bobo8bo123bobo131b4o840b o3boo24bo3bo$427bo135bo133bo841bo5boo22bob3obo5bo$1539bobbo19boo6b5o6b o$858bobo682bo18bo17bobo$571bo285bo683bobo19b3o13booboo$571bobo283bo 684bo22bo12bo5bo$571boo284bobbo720bo$857b3o718boo3boo$1539boo3boo5bo$ 418boo132boo132boo851bobobobo3bobo$419bo133bo133bo852b5o5boo27b4o$419b obo8bo122bobo131boboo850b3o25boo8bobboo$420boo8bobo121boo132bo853bo27b o9boboo$430boo125boo133bo874b3o$423b3o131bobo130bo876bo13boo$423bo133b o133bo866bo23bo$424bo1134bo$1544boo11b3o$856bobo685bo31booboboo$859bo 685b3o28bo5bo5bo$698boo159bo687bo29bo3bo7bo$431boo131b3o131bobo155bobb o718b3o6b3o$431bobo130bo133bo158b3o$431bo133bo1000bo$1564bobo$1565boo$ 501boo132boo132boo$501bo133bo133bo826bo$489bo9bobo70boo48bo10bobo69b3o 48boo9bobo824bobo$398bobo86bobo9boo32bobo36bobo46bobo9boo34bo35bo48bo 3bo8boo809boo15boo$398bobbo84bobo44bo3bo34bo46boo3bo44bobo34bo46bo5bo 813bo4boo$401boo82bobbo23bo24bo81boo3bo21bo23bobo5bo73bobbo3bo20bo793b o$399bo3boo5bo75bobo23b3o18bo4bo4b3o73boo3bo21b3o21bobbo3b3o79bo20b3o 789b3o$401boo6bobo70boo3bobo6bo18bo21bo5b3o70boo3bobo6bo18bo20bobo3bo 3bo69bo3bo3bo24bo74bobo$391boo5bobbo6bo3bo68bobo5bo6bobo15boo9boo6bo3b o4bo3bo68bobo4bo6bo18bo10boo8bobo6bo70boboo3boo24boo73bo745bo$390bobo 5bobo8b3o69bo14boo26bobo6bobo5bo5bo67bo13b3o16bobbo6bobo8bo5bo5bo31boo 34bo107bo746bo$390bo16boo3boo32boo32boo34b3o5bo17bo3bo67boo36bo5bo16bo 5bo31bobo32boo107bobbo741b3o$389boo55bobo67b3o4boo18b3o104bobo4boo17bo 3bo32bo71boo70b3o$446bo192bo11bo25b3o92boo780boo$505boo131boo131boo 782bo$489bo14boo132bobo132bo781bobo5bo10bo$488bo17bo7boo3boo101bo25boo 3boo101bo25boo3boo767boo5boo9boo$488b3o24b5o102bobo23bobobobo100bo26b oo3boo775boo7bobo4bo30bo$437bo6bo15bo6bo9bo38b3o51boo6boo13boo6boo8bo 10boo25b5o91bo9b3o806b3o13bobo26bobo$436boo6boo7b3o3boo6boo8b3o17bo19b o51bobbo4bobbo11bobbo4bobbo7b3o17bo18b3o50bobbo4bobbo11bobbo4bobbo7b3o 17bo18b3o772boo3boo15bobo26boo$407boo26b3o6b3o6bo4b3o6b3o10bo16b3o41b oo25b6obb6o9b6obb6o9bo16b3o17bo5boo16boo24b3obb6obb3o7b3obb6obb3o8bo 16b3o12bo3b3o4boo770boo16bobbo$408bo27boo6boo8bo4boo6boo10boo19bo12bo 28bo26bobbo4bobbo11bobbo4bobbo9boo19bo11boo9boo17bo26bobbo4bobbo11bobb o4bobbo9boo19bo10boo4bo5boo49bo720bo17bobo$405b3o29bo6bo15bo6bo31boo 11boo25b3o28boo6boo13boo6boo30boo10boo26b3o91boo10bobo60b4o734bobo3boo $405bo106bobo24bo107bo25bo169b4o9bobo721bo5bobo$486bo356bobbo5boo5bo 728bo29bo$487boo228bo32bo86bo5b4o5boo5bo728boo29bo$448bo37boo31boo61b oo32bo36boo62boo31bo36boo48bo4b4o10bobbo757b3o$448boo32bo36bo63boo30b 3o35bo62bobo30bobo17b3o15bo54bo14b3o$447bobo31b3o36b3o59bo32b3o17b3o 16b3o71bo19booboo15bo3bo15b3o$461bo18b5o16b3o18bo71boo38bo3bo17bo70boo 18bo5bo24boo10bo35bo$460boo17bobobobo14bo3bo4boo7bo74boo18boo3boo13bo 5bo3b3o6bo74bobo20bo16bo5bo3bobo6bo37b3o$434boo24bobo16boo3boo13bo5bo bbobo5b3o49bo26bo17boo3boo13booboboo5bo4b3o48bo7bo37boo3boo13boo3boo5b o4b3o36bo6b5o17boo$433b3o3boobo50bobo3bo5bo4bo4bo49b4o3boboo68bo4bo49b obo5b4o72bo39boo4bob3obo16bo773bo$423boo5boboo5bo3bobbo47boo6bo12boo 40boo5b4o4boboboobboo67boo40boo4boo8boobbobboo46bobo18boo45bo3bo6bo8bo bo771bobo$423boo5bobbo4bo4bobboo34bo11bo5bo3bo23bo28boo5bobbo3booboboo bbobo53bo54boo4boo11boobboo47boo66b3o7boo7boo773boo$430boboo4b4o5boo 32bobo17b3o22b3o35b4o3boo8b3o32boo18bo60boo7bo10boo44bo6boo9bo50bo3boo 4boo$433b3o3bo7b3o33bo18bo10bo11bo39b4o3boo8b3o17bo34bo9bo51bobo4bo10b 3o49bobbo7bobo53boo4b3o$434boo11boo19boo9bobbo19bo10bo11boo41bo12b3o 17boo32boo8booboo51bo4bo10boo52boo6bo3bo52boo4boo$446boo7boo10boo10bo 19booboo8bobo65bobo6boo10bobo9boo22bo76boo7boo22boo22bo8b3o33b3o22boo 15bobo$446bo8bobo11bo10bo17bo5bo6booboo64boo7bobo22bo14bo5boo7bo5bo63b oo7bobo22bo29boo3boo33bo22bo15bo$457bo19b3o18bo11bo5bo74bo19b3o14bo96b o19b3o14bo54bo31boo6bo775boo$338boo52boo63boo18bo21boo12bo77boo18bo16b 3o13booboboo74boo18bo16bobo84boo6bobbo772bobo$338boo50bobbo116boo3boo 245boo93b3o775bo$377bobo9bo7b5o118boo3boo216bo23bo867boo$377bo3bo7bo6b o5bo46bo26bo43boo3boo56boo24boo22bo9boo73boo22boo22b3o8boo$381bo7bo7b oo3bo45bobo24boo22bo9b3o9b5o46boo7bo3bo22boo22b3o8bobo61boo9bobo21bobo 20b5o6boo31boo$367boo8bo4bo7bobbo7bo44boo3bo23bobo10bo9b3o7boobo10bobo 46bobbo5bo5bo23bo20b5o8bo62boo12bo42bobobobo7bo29bobo$367boo12bo10boo 43bo8boo3bo35bo9b5o6boo61boboo4boobo3bo34bo8boo3boo7boo67bo4bobbo33bo 8boo3boo39bo21boo16bo$377bo3bo37b4o14boo7boo3bo35b3o6boo3boo6boo11b3o 45booboo4boo5bo34bobo19b3o75bo32bo77bobo5boo7b3o$377bobo8bobo27b6o13b oo9bobo46b5o8bobo38bo6bo11boo7boo4bo35boo20boo39boo6boo17b3o4bobo33b3o 75bo6boo8b3o$389boo26b8o20bo3bo47bo3bo8bobboo35boo6boo12bo6bo3boo47bo 13bo36bobbo4bobbo16boo5boo121bo$371boo16bo26boo6boo9b3o6bobo51bobo48b 3o6b3o17bobo36bo14bo49b6obb6o15boo37boo95boo3boo$337b3o29bobbo7boo20bo 14b8o10b3o6bobo36boo14b3o48boo6boo18bobo35boo65bobbo4bobbo17bobo34boo 96boo3boo$336bo3bo27bo7boo4bo17b3o15b6o12bo8bo36boo17boo48bo6bo20bo36b obo16boo47boo6boo7boo10bo37bo17boo8bo21b3o52bobo$335bo5bo18boo6bo6bo6b o16bo19b4o9boo50bo16bo24bo39b3o66bo9bo54bobo66bo8b3o22bo55bo$336bo3bo 19boo6bo7b6o17boo30bobo68b3o22bo40bo67b3o5b3o55bo67b3o4b5o20bo44boo10b o$337b3o29bobbo60bo8booboboo55bo4b5o11b3o39bo8boo3boo55bo4b5o62boo3boo 55bo3boo3boo53bo9bobo7bobbo$337b3o3boo26boo20bo48bo5bo5booboboo47bob3o bo6bo54bo5bo28boo29boo3boo61boo3boo28b3o87bobo7boo10b3o$344bo47bo50bo 3bo28b3o12boo9bo6bo3bo6b3o87bobo23bo6b5o63b5o8b3o20bo10bo10bo64bo3bo7b oo$344bobo5boo24boo3boo7b3o49b3o7bo5bo17bo11b4o7bobo6b3o6b5o53bo3bo6b oo3boo17bo10boobboo6b4o4bo3bo64bobo8bo3bo18bo10boo9boo8bo55bo3bo7boo$ 345boo5bobbo23b5o31bo8boo51bo7bobobbobb3o5boobo6bo6boo3boo23bo8bobbo 17b3o9b3o25bobobbob4o5boobobo4bobo35boo38bo5bo23bo4bobo7boo3boo4bo15b oo38bo3bo10b3o$356bo9bobo10booboo29bobo6bobbo29booboo24bobbobboo9boob oo41bobo10bo28bo3bo22bo3bo3boboo5b3obobbo4b3o32bo3bo5bobb3o16b3o8bo3bo 22bobo13b3o24bobo38bo3bo$335b3o18bo7bo3bo10booboo22boo4bobo7bo3bobboo 26bo25boo9bo6boobo8boo19bo5boo3boo3bo5boo3bobbo25bobo23bo12bo4booboboo 6boo25boo3bo5bo9bo3bo24b3o22bobo15boo12boo12bo38bo3bo$334booboo3bo13bo 7bo15b3o13b3o7boo3bobbo7bobboobb3o49boo3bo8bo5bobo3boo4bo6bo11bobo5boo 3boo3bo4boboboo3b4o23bo23bo4bo14b4ob3o4bo26boobboobo3bo8bo4bobo22b3o 21bobbo16boo5boo4bo52bo3bo$334booboo4boo7bobbo7bo4bo26bo3bo12bobo16boo bo5boo41boo10bo6bo4bobo4b3o3bo12boo10boo3bo14b4o5boo40bo19bo4bobo4b3o 28bo5bo16boo4boo28boo9bobo17bo5bobo4b3o50bobo$334b5o3boo8boo10bo20bo8b o5bo12bobo4b3o8bobbo5boo5boo20boo6boo5bobbo21bo6bo30bobo5boo8bobbo5boo 5boo20b3o5boo3bo3bo22bo6bo29bo3bo17boo4boo5boo20bobo5boo3bobo24bo6bo 51bo8boo3boo$333boo3boo24bo3bo6boo8bobo6bo5bo14bo15boobo12bo20bobo5bob o6bobo21boo12boo23bo16b4o12bo23bo4bobo5bobo22boo37boo18boo11bo23bo4bob o5bo24boo$355bobo8bobo6bobo7boo10bo31b3o16b3o5boo12bo5bo46bo40b4o14b3o 5boo12bo5bo88bobo14b3o5boo18bo101bo3bo$355boo20bo17bo3bo29boo19bo5boo 17boo47b3o37bo19bo5boo17boo88bo18bo5boo17boo41b3o58b3o8bobo$356bo20boo 17b3o127bo14bo246bo12boo44b3o7bo$397bo144bo244bo13bo55bo$334boo13bobo 188b3o256bobo55bobbo$350boo25bobbo215boo132b3o66boo56b3o$350bo12b4o14b o10b5o64b3o131bobo134bo$362bo3bo10bo3bo9bo4bo66bo133bo133bo116boo$336b oo28bo11b4o14bo65bo316boo67boo$336boo16boo6bobbo25bo3bo382bobo$342boo 9bobo37bo155bo230bo$342b3o10bo31b3o157bobo$333boo9boobo11bo19bo14bo5b 3o145boo173boo$333bo5bo4bobbo10boo18bobo4bo5bobobo4bo42boo9boo112boo7b oo9b3o120boo9bobo39bobo$338bo5boobo9boo4boobboo10bo5bo5bobbo6bo41bobo 7bobo112bo8bobbo9bo120b3o10bo38bobbo3boo$334bo3bo3b3o11b3o4boobboo16bo 5bo54bo8bo5bo72boo23boo5bobo12bo7bo5bo117boobo11bo33boo5b3oboobboo103b oo$336bo5boo13boo4boo22b3o53bobbo13bobo72bo22bobo5boo13bo12b4o115bobbo 10boo31boo3bo3bo3bo3bobo76bobo24bo$358boo86bo13boobo71bobo6bo12b3o21bo 11boobobo114boobo9boo3boo29boo5bobo8bo78bo23bobo5boo23boo$359bo25b3o 48boo5bobo14booboo71boo6b4o8b3o11boo5bobbo11b3obobbo104boo5b3o11b3o28b oo5bobbobboo6bobbo78bo24boo5boo23bo$383bo5bo18boo25bobo5boo15boobo81b 4o8b3o9bobo5boo14booboboo103bobo5boo13boo27bobo6bobo13bo75bobbo34boo 10bo7bobo$377bo5bo5bobbo15bobo24bo24bobo3boo77bobbo9bobo8bo24b4ob3o 101bo23boo5boo19bo21bobo6boo69b3o34b3o7bobo7boo$376bobo4bo5bobobo14bo 25boo25bo4bobo76b4o10boo7boo25bo4bobo99boo24bo5bobo17boo21boo7bobo105b oo6boo$377bo14bo75bo75b4o54bo133bo51bo102boo9boo$385b3o80boo74bo57boo 132boo50boo101boo9boo$904bobo10bo$894bo11bo8b3o$883bobbo7bobo17bo$415b 3o449b4o11bo11boo18boo$415bo451bo3bo10bo3bo12bo$416bo450bo14b4o12boo$ 868bobbo26bobo$$895bo$423bobbo8bo140bo318boo12boo3boo$423bo10bobo137b 3o317bobo12bo5bo$419bobbo3boo5bo3boo134bo$416b4o3boobobo4bo3boo134boo 331boobbo3bo$415b4o14bo3boo466boo4b3o$415bobbo8boo5bobo3boo437bo7bo19b o$415b4o16bo4bobo434bobo5b4o$410boo4b4o22bo432boo8boobbobboo$409bobo7b o22boo431boo11boobboo$409bo465boo7bo10boo$408boo161bo299boo4bobo4bo10b 3o$570b3o297bobo6bo4bo10boo13bo$569b5o296bo21boo7boo5booboo$568boo3boo 294boo21boo7bobo$903bo3bo5bo$903boo$572bo334booboboo$572bo$$568boo$ 569bo$566b3o$566bo$907boo$908bo$905b3o$905bo! Date: Thu Mar 2, 2000 2:16am Subject: A Turing Machine A Turing Machine in Conyway's Game Life I put this pattern together mainly using patterns that I created in the 1980's. The basic design has a Universal Turing Machine in mind so design expands easily to 16 states and 8 symbols. I have a design for a Universal Turing Machine which fits in that size. This is the first fully working Turing machine so I made it small, just 3 states and 3 symbols. It takes 11040 generations for one cycle. Turing Machine Program The program I chose is one that duplicates a pattern of 1's. With 2 1's on the tape to the right of the reading position it takes 16 cycles to stop with 4 1's on the tape. This takes over one hour on my computer. The numbers for each state transition are State,Symbol,Direction State \Input Symbol 0 Symbol 1 Symbol 2 0 Find next 1 2,0,R 1,2,R 0,2,L 1 Write 2*2 0,2,L - 1,2,R 2 Convert 2 to 1 Halt - 2,1,R A P240 gun has been placed to insert the instruction "Next State = 0, Symbol = 0, Direction = R" when the blocking glider is deleted. This starts up the Turing Machine. I have put an extra fanout in the addressing of the finite state machine to give a trace of the operation. Paul Rendell 02/03/00 golly-2.5-src/Patterns/Life/Signal-Circuitry/Unit-Life-Cell-512x512.rle0000644000175100001440000003307112156145314022170 00000000000000#C Width-512 Unit Life Cell, rebuilt from David Bell's original #C width-500 version to better match Golly's qlife/hlife algorithm. #C Very minor changes to circuitry; period is still 5760 generations. #C The original version, with some background info, can be found at #C http://radicaleye.com/lifepage/patterns/unitcell/ucdesc.html. #C From David Bell's original pattern notes: #C Here are some approximate generation numbers for important events #C which occur during the 5760 generations which make up one #C generation. Some of these events only occur if the Cell is LIVE. #C 0: Current state glider starts from pair of long boats #C 400: Current state glider arrives at fanout device #C 600: Output gliders escape from the fanout device #C 900: Missing LWSS turned into boat to hold Cell's current state #C 1800: First glider arrives at the glider detector to be turned #C into a block #C 4000: Last glider arrives at the glider detector to be turned #C into a block, and the high period glider guns fire #C 4700: Stream of 10 gliders starts sweep through glider detector #C to count the number of blocks in the detector #C 5200: Gliders from stream react in the Life Logic circuit to #C calculate the new current state glider #C 5700: New current state glider arrives back at the pair of long #C boats #C Dave Greene, 17 September 2005 x = 511, y = 511, rule = B3/S23 oo507boo$obo505bobo$bobo503bobo$bbo505bo6$130bo$128b3o$127bo63boo$127b oo62bo$125b3o50bo10bobo103boo$124bobo50bobo9boo104bo$124bobo48boo3bo 106bo5bobo$125bo44boo3boo3bo105b4o3boo$170boo3boo3bo104boobobo$177bobo 94boo8b3obobbo$122booboboo49bo95boo9boobobo$122bo5bo157b4o$123bo3bo 159bo$124b3o$$383boo$383boo5$125boo$125boo3$382b3o$381bo3bo$380bo5bo 83boo$380bo5bo83boo$383bo$381bo3bo$366boo14b3o$366boo15bo$$380boo$381b o$378b3o$366b3o9bo$366b3o$365bo3bo99b5o$402bobo63bob3obo$364boo3boo23b 3o5bo3bo62bo3bo$389boobbobbobo7bo63b3o$387bobbobboo7bo4bo4boo57bo$386b o8bo10bo5boo$386bo11boobbo3bo$386bo9bo5bobo$380boo5bobbo5boo75bo$379bo bo7boo3bobo76bo$379bo14b3o69bo5bobo$369boo7boo86bobobbooboo$369bo96boo bbo5bo$370b3o100bo$24bo347bo97boo3boo$24b3o386boo21boo$27bo373b3obbo5b o3bo19boo$26boo369bo3bo9bo5bo3boo$395bobo4bo8bo3boboobboo$30bo362boo 16bo5bo$30bo362boo17bo3bo$29bo203bo159boo18boo$231bobo37bo30bo86boo4bo bo$223boo4boo40b3o28b3o83bobo6bo$26boo3boo190boo4boo43bo30bo82bo78bo8b o$26bo5bo196boo31boo9boo29boo81boo45booboboo25boo7b3o$231bobo8boo18boo 200bo3bo5b5o$27bo3bo201bo8bobo189bo5bo22boboo6bobobobo$28b3o213bo61b3o 147boo5bobo7boo3boo$226bo17boo60b3o126booboo15bobo$225bobo77bo3bo127bo 17bo$215boo6boo3bo44booboboo174boo8boo7boo$214bobo4boobo3bo44bo5bo24b oo3boo133bo19boo7boo$26boo185b3o4b3obo3bo45bo3bo150boo12bo28bo$27bo 176boo6b3o4bobboobobo8boo37b3o144b3o4boo12b3o6boo18b3o$24b3o177boo7b3o 4boo4bo9bobo182b5o6boo18boo22bo$24bo189bobo21bo20boo3boo154bobo3bo5b3o 37b5o$215boo21boo180boo3bo6boo7b3o30boo$260bo3bo147boo15boo$229bo31b3o 149bo15boo$227bobo31b3o149bobo7bo47boo3boo$228boo44bo34boo103boo7bobo 46b5o$36bo236bo35bo116boo4boo18bo19booboo$36b3o184boo48b3o34b3o95boo 16boo4boo17b3o18booboo$39bo98boo82bobo87bo95boo16boo22b5o18b3o$38boo 99bo72bo11bo198bobo23bobobobo$139bobo9bo60bobo45bo162bo25boo3boo$140b oo8boo49boo12boo9boo31b3o$149boo4boo44boo12boo9boo31b3o14b5o$148b3o4b oobboo54boo6boo42boo6bob3obo$149boo4boobboo51bobo7b3o32boo3boo3boo7bo 3bo127b3o62boo$150boo60bo10boo32boo3boo13b3o127booboo61boo$151bo74boo 5boo43bo128booboo18boo22boo$226boo5bobo171b5o17bobo22bo$40b3o192bo8bo 29bo5boo124boo3boo17bo24b3o$39bo3bo191boo5bobo27bobo5bo159bo16bo$38bo 5bo181bo16boo28boo6b3o156boo$39bo3bo182bobo33boo19bo151boo4boo$40b3o 166boo18boo31bo147bo24boo4b3o7boo$40b3o164bo3bo17boo32b3o144bo20bo3boo 4boo8boo$206bo5bo16boo34bo145bo18b3o7boo$201boobboobo3bo8bo4bobo4boo 168boo24bo3bo6bo$201boo3bo5bo9bo3bo6bobo165bobbo5bo13boobbob3obo$40boo 165bo3bo5bobb3o12bo164bo9bo13boo3b5o$40boo73bo93boo24boo155boo6bo13boo $114bobo275boo6bo12bobo8bo$115bobo283bobbo9bo8bobo$116bobo104boo178boo 18bobo$117boo103bobo199bo$224bo4bo29bo29bo$227bobo27bobo27bobo$120b3o 105boo28boo28boo131booboboo$122bo85bobo210bo5bo$121bo85bobbo3boo206bo 3bo$198boo6boo5b3oboobboo200b3o4boo$125boo71boo4boo3bo3bo3bo3bobo206b oo$125bobo78boo5bobo8bo$126bobo78bobbobboo6bobbo$127bobo78bobo13bo$ 128bo92bobo6boo$221boo7bobo193boo$232bo148bo4bo39bo$232boo145boob4oboo 38b3o$222bobo156bo4bo42bo$221bobbo19bo29bo29bo$211bo8boo20bobo27bobo 27bobo$210bobo5boo3bo19boo28boo28boo$210boobo6boo$198boo10booboo6bobbo 5boo$198boo10boobo8bobo5bobo154bo$210bobo19bo102boo48bobo$211bo20boo 102bo46boo$336bobo6bo37boo$163boo57boo113boo4bobo37boo$163boo57boo118b obo34boo4bobo$160boo10bo4bo163bobbo11boo20bobo6bo$148bobo8b3o10bo4bobo 162bobo11boo20bo$148bo3bo7boo10bo7boo13boo146bobo31boo16boo3boo$132bo 19bo10boobboo11boo14bo148bo49boo3boo$130b4o14bo4bo9boobbobboo8boo14bob o5boo9b3o11bo29bo29bo29bo76b5o19boo$129boboboo4bo12bo15b4o5bobo4boo11b oo5bobbo9bo9bobo27bobo27bobo27bobo77bobo21bo$124boobbobbob3o5boobo3bo 3bo16bo7bo6bobo21bo7bo5bo5boo28boo28boo28boo101bobo6bo$124boo3boboboo 5b4obobbobo35bo21bo12b4o172b3o22boo4bobo$130b4o6boobboo40boo20bo11boob obo200boo18boo$132bo36boo9boo22bobbo11b3obobbo199boo17bo3bo$25boo6boo 125bobo5bobbobb3obbobbo21boo14booboboo199boo16bo5bo$24bobbo4bobbo124b oo6b3obb5obb3o38b4ob3o166boo31bobo4bo8bo3boboobboo$24bobbo4bobbo125bo 9b9o42bo4bobo166bo33bo3bo9bo5bo3boo$24bobbo4bobbo134bo9bo48bo163b3o38b 3obbo5bo3bo$25boo6boo115bobo17boo7boo48boo162bo52boo$151boo$151bo$$ 162b4o26b4o26b4o26b4o26b4o26b4o26b4o26b4o26b4o$161bo3bo25bo3bo25bo3bo 25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo21boo$136boo27bo29bo29bo29bo 29bo29bo29bo29bo29bo21boo$137bo23bobbo26bobbo26bobbo26bobbo26bobbo26bo bbo26bobbo26bobbo26bobbo$137bobo4bo8bobbo285bo$138boo3bobo10bo282b4o$ 141boo3bo5boo3bobbo57boo206boo10b4o9boo$37boo102boo3bo4boboboo3b4o54bo 207bobo9bobbo9boo$38bo102boo3bo14b4o5boo35boo7bobo198b3oboo4b3o8b4o5bo $35b3o56boo47bobo5boo8bobbo5boo35b3o6boo4b3o27b3o27b3o27b3o102b4obbo4b 3o8b4o4bo$35bo56bo3bo47bo16b4o28bo15boobo11bo29bo29bo29bo106boo4b3o12b o$91bo5bo13boo47b4o27bobo4b3o8bobbo10bo29bo29bo29bo112bobo$86boobboobo 3bo13boo47bo29bobo16boobo213boo$86boo3bo5bo10boo74boo3bobbo7bobboobb3o $92bo3bo10b3o74boo4bobo7bo3bobboo$94boo12boo81bobo6bobbo$99bobo9boo5b oo73bo8boo$99boo10boo5bobo$100bo19bo$120boo5$196boo9b3o11boo14b3o27b3o 27b3o$105boo9bo71bo7bobbo9bo11bo17bo29bo29bo$104b4o7bobo69bo3boo7bo7bo 5bo4bobo16bo29bo29bo$99bobobbobb3o5boobo68bo5bo6bo12b4ob3o$98bobbobboo 9booboo3boo63b5o7bo11booboboo$97boo9bo6boobo4boo71bobbo11b3obobbo$95b oo3bo8bo5bobo78boo14boobobo$67bo16bobo10boo10bo6bo96b4o$62b3oboobboo 12boo5boo5bobbo112bo$62b4o4boo13bo4bobo6bobo119boo$66boo22bo130bo$89b oo119bobo6bobo$208bo3bo6boo$200bo7bo$199b4o4bo4bo$198boobobo4bo13b3o 27b3o27b3o$160bo26boo8b3obobbo3bo3bo11bo29bo29bo$158b3o26boo9boobobo6b obo10bo29bo29bo$157bo41b4o$157boo41bo$23bo187bo$19boobboob3o34boo144bo bo$19boo4b4o26bo7bobo3bobo138boo$23boo30b3o5bo5boo84bo$13boo15b3o25bo 11bo82booboo56boo$13boo17bo24boo131boo22boo$31bo120bo5bo32bo$36bo154bo bo6bobo21boo47boo$34b3o115booboboo33boo5bobbo3boo16bo48b3o$33bo50bo 104bo8boo5b3oboobboo7bobo$33boo49b3o100b3o6boo3bo3bo3bo3bobo6boo13b3o 27b3o5b3o$12b3o72bo98bo11boo5bobo8bo22bo29bo5boboo$11booboo50bo19boo 98boo11bobbobboo6bobbo21bo29bo6b4o$11booboo50b3o131bobo13bo25boo$11b5o 4boo47bo113b3o27bobo27bo$10boo3boo22bobboboobobbo17boo113b3o27boo28bob o5bobo$20bobbo15b4oboob4o27boo8b3o27boo104boo18boo3bo3bo5b3o$24bo5b3o 6bobboboobobbo27bobo6booboo26bo35boo68bo24bo7bobobbobboo$16bo5bo6bo3bo 44bo8booboo24bobo35boo34boo25bo4bobo23bo4bo7boobbobbo15boo9boo183boo$ 15boboo9bo5bo52b5o24boo23bo39boo3boo3bo24bobo3boo25bo19bo13boo9bobo 183bo$15bo12bo5bo51boo3boo46b3o40b5o4bobo5boo15boobo29bo3bobb3o10bo8bo 6bo7b3o171bo10bobo$79boo57bo44b3o6boo5bobo14booboo30bobo15bo7bobo12b3o 170b4o9boo$15boobo9bo41b3o5bobo58bo44bo17bo13boobo45bobbo6boo3bo12b3o 163boo3boboboo$13bobbo11boo39bo3bo6bo5bo49bobbo59bobbo13bobo46boo8boo 3bo13bobo5boo155boobbobbob3o$13bobo12boo38bo5bo9boobo47bo66bo8bo5bo57b oo3bo14boo5bobo159boboboo$27boobbo36bo5bo12bo20boo24bo3bo60bobo7bobo 10b3o52bobo24bo160b4o$28bobo76bobo26bo62boo9boo12bo53bo25boo161bo$29b oo43bo9boboo21bo23bo5bo83bo$73boo11bobbo43bo5bo$14b3o56boo12bobo44bo3b o$13bo3bo8boo3boo38bobboo59b3o45boo$12bo5bo7boo3boo39bobo108boo32boo 116bo$13bo3bo54boo36boo105boo116b3o$14b3o11b3o69b3o7bobo41boo182bo$14b 3o11b3o55b3o13bo8b3o40bo49bo22boo108boo$29bo40boo3boo8bo3bo11bo10b3o 32bo4bobo49bobo20bo$70boo3boo7bo5bo20b3o32b4ob3o39boo12boo9boo5bobo$ 85bo3bo13boo5bobo32booboboo41boo12boo9boo5boo$15boo55b3o11b3o13bobo5b oo32b3obobbo55boo6boo$15boo55b3o11b3o13bo42boobobo53bobo7b3o$73bo19boo 6boo43b4o12bo41bo10boo120boo3boo$28boo54boo6bobo24b3o25bo12b3o55boo 120bo$28boo55bo8bo23bo3bo36bo58boo117bo5bo$82b3o74boo30boo145booboo$ 70boo10bo34bo5bo67bo147bobo$71bo45boo3boo57boo6bobo148bo9bobo$68b3o 109b3o6boo149bo8bobbo$68bo108boboo167boo$85b3o82boo5bobbo165boo3bo82bo $87bo82boo5boboo167boo82b3o$76bo9bo10boo81b3o166bobbo5boo71bo$75bobo 19bo19boo35boo3boo20boo167bobo5bobo70boo$63boo10boobo8bobo5bobo20bo 241bo47bo$63boo10booboo6bobbo5boo18b3o14bo22bo3bo42boo19boo135boo44b3o $75boobo6boo28bo16b4o20b3o16boo26bo19bo128bo52bo$75bobo5boo3bo44b4o19b 3o16bo27bobo5bo9bobo126b3o52boo22bo$76bo8boo46bobbo27bobo6bobo28boo5b oo8boo126bo77booboo35boo19boo$86bobbo43b4o25bo3bo6boo37boo135boo117bo 19bo$87bobo34boo6b4o26bo49b3o211bo5bo35bobo7boo6bobo$123bobo6bo28bo4bo 40boo3boo133bo121boo7boo6boo$123bo17bo20bo48boo133bobo77booboboo42boo$ 122boo15booboo18bo3bo16bo27bo133bo3bo124b3o6bo$164bobo14b3o161b5o125b oo6bo$138bo5bo35bo163boo3boo49boo3boo71boo$180boo163b5o51b5o72boo$138b ooboboo201b3o52booboo$347bo53booboo$402b3o21boo$427bo$424b3o$424bo$ 400boo$138boo261bo$139bo36b5o163boo52b3o$136b3o16boo18bob3obo163bo52bo $136bo17bo3bo17bo3bo15boo144b3o$153bo5bo17b3o16bo145bo$153bo3boboo17bo 6bo8bobo$153bo5bo23bobo8boo50boo20boo$145boo7bo3bobb3o18bobo62bo20bo$ 144bobo8boo4b3o17bobbo62bobo6boo8bobo$144bo37bobo63boo6bobbo6boo$143b oo38bobo18bo55bo$185bo16b3o48bo6bo$159boo3boo35bo49boo7bo$160b5o36boo 53bobbo$161b3o92boo$162bo$$199bo$198b3o$198b3o$$159boo35boo3boo$160bo 35boo3boo$157b3o16bo$157bo18bobo38boo$177bobo19boo16bo$177bobbo17bo7b oo7bobo$177bobo20boo4bobbo5boo$166boo8bobo21b3o7bo$165bobo8bo6bo18bo7b o$103boo60bo16b3o17bo7bo$103bobo8bo49boo15bo3bo20bobbo$98boo4b3o6bo7bo 58bob3obo19boo$94b4obbo4b3o5boo5bobo58b5o$94b3oboo4b3o7bo4bo3boo$103bo bo13bo3boo$103boo14bo3boo$120bobo3boo$121bo4bobo84boo$128bo82bobbo$ 128boo66bo7bo5bo7b5o$194b4o5boo5bo6bo5bo$107bo72boo11boboboo4boo5bo7b oo3bo$107boo53bo18bo10bobbob3o11bobbo7bo$95bobo8bobo53b3o13b3o11boobob oo14boo$95bo3bo65bo12bo11b3ob4o$85boo12bo10boo52boo23bobo4bo$85boo8bo 4bo7bobbo77bo25bo$99bo7bo80boo25b3o$95bo3bo7bo110bo$95bobo9bo83bo17boo 6boo$108bobbo5boo72b3o15bobo$28bo81boo5bobo74bo14bo$28b3o88bo73boo$31b o87boo45b3o$30boo133bo3bo$164bo5bo$165bo3bo25b3o$166b3o25booboo17b3o$ 166b3o25booboo17bo19boo$194b5o18bo18boo$14bo15boo3boo156boo3boo$14b3o 13bo5bo127boo$17bo147bo$16boo13bo3bo126b3o46boo23bo$32b3o127bo48boo11b oo9b3o$224bobo7bo3bo$224bo8bob3obo$234b5o$198boo$198bo$26bo172b3o66bo 5boo$16boo3boo3boo7bo165bo64bo3bo3b3o$25bobo5booboo193b3o36bo5boobo$ 17bo3bo209bo33bo5bo4bobbo$18b3o11bo5bo193bo32boo9boobo$18b3o253b3o7boo $32booboboo235boo8bobo$286bo$21bo264boo$20b3o249boo$19bo3bo248bo$21bo 211b3o28bo5bobo$18bo5bo207bo3bo26bobo4boo$18bo5bo206bo5bo24bo3boo$19bo 3bo207booboboo24bo3boo$20b3o11boo226bo3boo$34boo217boo8bobo$252bobo9bo $252bo$251boo$231boo$232bo$229b3o$229bo$21boo21boo$21boo22bo$45bobo8bo 267boo$46boo5b4o4bo262boo$52b4o5bo259boo6bo$52bobbo9boo209bo36boo5b3o 6bo$52b4o9boo204bo4b4o33boo6boo$53b4o214bo5b4o43boo6boo$56bo209boo9bo bbo43boo6bobo$266boo9b4o53bo49boo$276b4o5boo47boo48boo$276bo8bobo$287b o$287boo98bo$386bo$386bo3$382boo3boo$385bo$382bo5bo$383booboo$384bobo$ 385bo8bo$77bo307bo6bobo$76bobo312bobo11boo$76boobo4boo304bobbo11boo$ 76booboo3boo305bobo$76boobo312bobo$65boo9bobo315bo16bo$64bobo10bo306bo 24b3o$64bo318bobo22bo$63boo319boo22boo$101bo$101b3o301b3o$104bo300b3o$ 103boo299bo3bo$403bo5bobboo$375boo27bo3bo3boo$375boo28b3o$106bo271boo$ 105b3o270b3o5boo$105b3o270boo6boo$368boo5boo$73boo28boo3boo257bobo5boo 35b3o$73boo28boo3boo257bo14boo27booboo$366boo12bo3bo11bo14booboo$60boo 32bobo277boo3bo5bo9bobo13b5o$60boo11b3o16bo3bo277boobboobo3bo10boo12b oo3boo$73b3o9boo5bo286bo5bo20boo$85boo4bo4bo283bo3bo21boo$92bo8bo280b oo42bo$92bo3bo4bo323bobo$71boo3boobbo13bobo328boobo4boo$72b5o3b3o342b ooboo3boo$73b3o7bo23boo316boobo$74bo7boo23boo281b3o32bobo$57booboboo 325bo3bo32bo$412bo$57bo5bo324bo5bo16bobo$388boo3boo17boo$58booboo$60bo 52boo$73bo39bobo275bo26boo$71boo35boo4b3o273bobo25bobo$72boo8boo3boo 15b4obbo4b3o272bobo25bo$84b3o17b3oboo4b3o275bo12boo5bo$83bo3bo25bobo6b oo268bo11b3o3bo3bo$84bobo26boo7bobo264bobbo8boboo5bo$57b3o25bo18bo19bo 170bo94boo9bobbo4bo5bo$56bo3bo12boo3boo15bo7bobo18boo167b3o105boboo9b oo$65boo8b3o16bobo4boo3bo9boo174bo103boo6b3o11bo$55bo5bo3boo7bo3bo15b oo5boo3bo9boo174boo101bobo7boo11b3o$55boo3boo13bobo6boo15boo3bo288bo 25bo$76bo7boo17bobo288boo24boo$100bo3bo$70bobo5boo19bobo$71boo5bo20bob o$71bo7b3o18bo186boo3boo15bo$60boo19bo205boo3boo13b3o$60bo245bo114boo$ 61b3o33booboboo185b3o14boo109boobboo$63bo33bo5bo185b3o125boo$98bo3bo 187bo$99b3o$67bobboo15bo364boo$66bo3boobboo11boo331boo18b3obbo5bo3bo$ 66bo7boo6boo4boo331boo13bo3bo9bo5bo3boo$67b4o11boo4b3o205boo112bo9bo 13bobo4bo8bo3boboobboo$82boo4boo197b3o6bobo111bobo19boo16bo5bo$79boo6b oo7boo4boo183b3o6bo4boo3boo90boo11bobo9boo7boo17bo3bo$78bobo6bo8bobo3b o183bo3bo12b3o92boo11bobbo7b3o7boo18boo$78bo19bo4b3o196bo3bo104bobo5bo boo5boo4bobo$77boo19boo5bo179boo3boo11bobo104bobo6bobbo4bobbo5bo$304bo 105bo8boboo5boo$422b3o$301b3o119boo$301b3o4$205bo84boo7boo3boo$204b4o 82bo9b5o$203boobobo82b3o7b3o$192boo8b3obobbo83bo8bo$192boo9boobobo$ 204b4o3boo$205bo5bobo$213bo$213boo3$301boo$301boo22$bbo505bo$bobo503bo bo$obo505bobo$oo507boo! golly-2.5-src/Patterns/Life/Signal-Circuitry/Unit-Life-Deep-Cell.rle0000644000175100001440000003764312156145314022127 00000000000000#C Deep Cell by Jared James Prince. A slight modification of David #C Bell's Unit Cell -- see Unit-Life-Cell-512x512.rle in the same #C folder. For the original pattern and some background, see #C http://radicaleye.com/lifepage/patterns/unitcell/ucdesc.html. ) #C #C The Deep Cell runs two Life universes instead of one. The two #C universes (referred to as A0 and B0) do not interact with each #C other. The ON/OFF state of A0 is found every 7680 ticks and is #C indicated by the presence or absence of a glider between the #C 6 boats in the upper left quadrant. The state of B0 is indicated #C the same way but offset by 3840 ticks -- thus the state readout #C occurs every n*7680 for A0 and n*7680+3840 for B0. #C #C This version is set with A0 initially ON (indicated by glider in #C boats) and B0 in a pre-start ON state (indicated by 3 blocks in #C the vertical chamber in the lower left quadrant) so B0 will be #C officially ON in 3840 rounds. To start A0 OFF, delete the glider. #C To start B0 OFF, delete the 3 blocks. #C #C An infinite tiling of Deep Cells allows for an infinite hierarchy #C as follows: Set universe A0 to generate an arbitrary Life pattern. #C Set universe B0 to generate another layer of Deep Cells. This #C new layer has two universes, called A1 and B1. Set universe A1 #C to generate an arbitrary Life pattern. Set universe B1 to generate #C another layer of Deep Cells. This new layer has two universes, #C called A2 and B2. Set universe A2 to generate an arbitrary Life #C pattern. Set universe B2 to generate another layer of Deep Cells. #C This new layer has two universes, called A3 and B3... #C #C Written in 1998 but couldn't be tested properly, forgotten, then #C remembered and tested in 2004. x = 499, y = 516, rule = B3/S23 49boo$49boo4$48b3o$48b3o$47bo3bo$46bo5bo$47bo3bo10boo$48b3o11boo5$47bo bo13bo$47bobbo12bo$oo47boobo9bobo432boo$obo58booboo430bobo$bobo45bo10b o5bo428bobo$bbo46boboo10bo432bo$50bo9boo3boo3$44boo3boo10b4o$45b5o11bo bboo$45booboo7bobooboboo$45booboo6bobbo$35boo9b3o8bobo3boo126boo$35bo bbo25bo126bo$181boo6bobo103boo$39bo141boo6boo104bo$44boo12booboboo71bo 41boo97bo5boo8bobo$37boo6bo12bo5bo69b3o33boo5b3o6bo88bo3bo3b3o7boo$36b o5b3o14bo3bo69bo36boo6boo6bo92bo5boobo$42bo17b3o70boo46boo91bo5bo4bobb o$181boo91boo9boobo$33boo3boo243b3o$33boo3boo243boo$34b5o$35bobo$58boo 71bo251boo$35b3o21bo70b3o250boo$56b3o70b5o$56bo71bobobobo$128boo3boo 246bo$382bo$33boo347bo$34bo96bo$31b3o96bobo$31bo98bobo247boo3boo$131bo 251bo$19boo110boo247bo5bo$20bo110boo248booboo$20bobo8boo98boo249bobo$ 21boo8boo350bo$5boo21boo6bo3boo341bo$5boo20b3o5bo3bobo324boo82boo$28b oo6b5o325boo82boo$6bo24boo4b3o$5bobo23boo347boo81boo$5bobo373bo81bobbo $6bo371b3o68b3o$378bo70b3o15bo$448bo3bo$3booboboo437bo5bo11boo$3bo5bo 356b3o32bo46bo3bo11bo$4bo3bo356bo3bo31boo46b3o$5b3o356bo5bo19bo5boo4b oo$364booboboo19bobo3boo4b3o7boo47boo3boo$23boo366bobobboo4boo8boo47b oo3boo$23boo366bobbo6boo59b5o$367bo23bobo7bo46bobo12bobo$366bobo11boo 8bobo55bobbo$366bobo10bobo8bo59boobo9b3o$3boo362b3o9bo16boo$4bo364boo 7boo16bobo51bo$b3o18b3o344bo26bo53boboo$bo19booboo344b3o78bo$21booboo 346bo$21b5o384bobo23boo23bo$20boo3boo378boo3bobbo22boo7boo3boo8bo$398b oobboob3o5boo6boo23b5o9b3o$397bobo3bo3bo3bo3boo4boo23booboo15bo$5boo 389bo8bobo5boo21b3o7booboo14b3o$5boo23bo365bobbo6boobbobbo22b3o8b3o14b 5o$30b3o201boo160bo13bobo50boo3boo$33bo199bobo35bo30bo86boo6bobo$32boo 189boo7bo6boo30b3o28b3o83bobo7boo$25boo196boo7bobbobbobbo32bo30bo82bo 45boo3boo4boo18bo$25bo206bo6b3o20boo9boo29boo81boo46b5o6bo18bo$26b3o 204bobo5b3o18boo172b3o4b3o13boo$28bo205boo6bobo192bo5bo15boo7boo$35bo 123boo83bo17bo13bo186boo3bo$6bo27b3o123bo68boo13boo15bobo10booboo184b oo4b3o$5b3o26b3o123boboo5boo58boo30bobo182bo24bo$4b5o152bo7bobo43bo10b oo34bo10bo5bo26b3o136bo$3boo3boo22boo3boo126bo4b3o7boo33bobo7b3o77bo3b o135b3o$4b5o23boo3boo124bobbo4b3o6boo36boo6boo45booboboo24bo5bo117bo$ 4bo3bo155boo4b3o31boo12boo9boo5boo21booboboo38booboboo116bobo22boo$5bo bo161bobo32boo12boo9boo5bobo20bo5bo160boboo22boo$6bo162boo44bobo20bo 21bo3bo13bo141boo3booboo$215bo22boo21b3o11bobbo28bo112boo4boboo11b3o$ 3boo273bo27bobo103boo13bobo$4bo27boo194boo44boo30bobo104bo14bo$b3o29bo 194boo44bo32b3o103bobo5boo$bo28b3o241bobo32boo103boo5bobo$30bo244boo 32bo114bo7boo$310b3o95boo11bobbo7boo$234bo29bo47bo95boo14bo$184bo25boo 9boo12bo29bo9boo3boo139bobo25boo3boo$182b3o25bobo7bobo10b3o27b3o9bo5bo 139boo$155bobo23bo19boobboo6bo8bo5bo221bo3bo$42bo110bo3bo23boo18boobo bbobbobbo13bobo46bo3bo170b3o$42b3o108bo51boo6bo13boobo46b3o171b3o$45bo 106bo4bo8boo42bobo14booboo$44boo107bo12boo42boo15boobo27b5o$147boo4bo 3bo69bobo3boo22bob3obo165boo23boo$47bo98bobo6bobo70bo4bobo22bo3bo145b 3o18boo23bo$46bobo97bo88bo23b3o18boo125bo3bo43b3o$45bo3bo81boo12boo88b oo23bo19bo125bo5bo29bo14bo$45b5o81boo91boo55b3o122bo5bo26b4o4bo$44boo 3boo125boo3boo41bobo35boo19bo125bo28b4o5bo$45b5o161bobo13bo34bo144bo3b o26bobbo9boo$46b3o128bo3bo28bobbobboo6bobbo21bo13b3o13bo128b3o27b4o9b oo$47bo130b3o28boo5bobo8bo22bo14bo14bo128bo29b4o$178b3o20boo4boo3bo3bo 3bo3bobo6boo13b3o27b3o123bo37bo$201boo6boo5b3oboobboo7bobo168bobo17boo 4b3o$210bobbo3boo16bo169bobo16boo3bo3bo$54boo96bo58bobo21boo155boo11bo bbo$54boo72booboboo17b3o237boo11bobo6boo12bo5bo$155bo23boo44boo177bobo 7boo12boo3boo$128bo5bo19boo23boo44boo177bo$424bo$46boo81booboo23bo63b oo199booboo4bo$46boo83bo24bobo61bobo207bobo$155bo3bo62bo198bo5bobbobo$ 155b5o51bo220bo$154boo3boo13bo35b4o207booboboo4bo$51booboboo75boo20b5o 13bobo22boo9boobobo6bobo10bo29bo29bo134bobbo$133bo22b3o13bobo23boo8b3o bobbo3bo3bo11bo29bo29bo134boo$38boo11bo5bo76b3o20bo14boo3bo31boobobo4b o13b3o27b3o27b3o$38boo96bo39bobo31b4o4bo4bo$52booboo118bobo33bo7bo$54b o120boo3bo38bo3bo6boo$172bo6bobo39bobo6bobo146boo6boo37boo$173bo4bobo 51bo145bobbo4bobbo36bo$39bo125boo4b3o4boo52boo143b6obb6o36b3o$39bo16b oo106bobo58bo152bobbo4bobbo39bo$38bobo15bo106bobo58b4o151boo6boo$37boo boo15b3o66bo29boo6bo3boo37boo14boobobo$36bo5bo16bo65bobo28boo9bobo37bo bbo11b3obobbo168boo$39bo84bo3boo36bobo30b5o7bo11booboboo168bobo$36boo 3boo81bo3boo3boo32bo3boo25bo5bo6bo12b4ob3o167bo$124bo3boo3boo35bobo25b o3boo7bo7bo5bo4bobo16bo29bo29bo78boo$114boo9bobo41bobo27bo7bobbo9bo11b o17bo29bo29bo24boo50bobo$113bobo10bo43bo36boo9b3o11boo14b3o27b3o27b3o 25bo49bo6boo$113bo222bobo8boo37bobbobbobbo$112boo51bo171boo7bobo37bo6b oobb3o$164bobo178b3o4boo25boo6bobo7b3o$36boo126boobo7boo167b3o4bobb4o 20bobo7boo6bo3bo$37bo109bo16booboo6bobo167b3o4boob3o20bo16bo5bo$34b3o 110boo15boobob3o6bo16boo149bobo28boo17bo3bo$34bo100boo11boo14bobobbobb obbobbo17bo150boo48b3o$134b3o3bo7b3o14bo4boo6bo17bobo5bo8boo205boo$ 131boboo4b4o5boo25bobo6boo11boo3bobo6bobbo206bo$124boo5bobbo4bo4bobboo 26boo7bobo14bobo7bo3bobboo201bobo7boo$124boo5boboo5bo3bobbo38bo13bobbo 7bobboobb3o201boo6bobo$134b3o3boobo18bobo21boo13bobo16boobo205bo13bobo $135boo25boo5boo9boo20bobo4b3o8bobbo10bo29bo29bo29bo104bobbo6boobbobbo $71boo90bo4bobbo7bobbo21bo15boobo11bo29bo29bo29bo103bo8bobo5boo$23bobb oo4boobbo34boo95b3o9b3o35b3o6boo4b3o27b3o27b3o27b3o69boo33bobo3bo3bo3b o3boo4boo$22bo3b3obb3o3bo110bobo20b9o38boo7bobo166bo34boobboob3o5boo6b oo$23bobboo4boobbo112boo19bobb5obbo48bo163b3o42boo3bobbo$149bo20boobb 3obboo48boo162bo49bobo3$172bobbo26bobbo26bobbo26bobbo26bobbo26bobbo26b obbo26bobbo26bobbo$158b4o14bo29bo29bo29bo29bo29bo29bo29bo29bo$157bo3bo 10bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo25bo3bo$136boo 23bo11b4o26b4o26b4o26b4o26b4o26b4o26b4o26b4o26b4o$70b3o64bo20bobo$69bo 3bo63bobo7boo294boo$68bo5bo63boo7boo4bo277b3obbo5bo3bo$69bo3bo70boo6b 5oboo58boo160bo46bo3bo9bo5bo3boo$37boo31b3o70b3o5bobboo4bo57bo161b3o 42bobo4bo8bo3boboobboo$38bo31b3o71boo5boo8bo8boo34bo9bobo164bo33boo4b oo16bo5bo$35b3o58bobo48boo4bo7bo8boo33bobo8boo164boo33boo4boo17bo3bo$ 35bo59bobbo48boo12bo33boo6boo3bo214boo18boo$73boo19boo10bo6bo46bo33bob o4boobo3bo216bobo$73bo12boo4boo3bo8bo5bobo43boo33b3o4b3obo3bo218bo$74b 3o9boo6boo9bo6boobo68boo6b3o4bobboobobo$76bo18bobbobboo9booboo67boo7b 3o4boo4bo$96bobobbobb3o5boobo78bobo$101b4o7bobo3boo75boo$102boo9bo4bob o$120bo88bo3boo28boo28boo28boo78b5o$120boo85bobobbobo27bobo27bobo27bob o77bob3obo$208boo4bo29bo29bo29bo78bo3bo5bo$95bo3boo283b3o5bobo$93boo3b oo285bo5boboo$94boo4bo289booboo$196bo8boo14boo168boboo$112boo80bobo6bo bbo14bo170bobo8boo$112bobbo71boo4bobo7bo3bobboo7bobo171bo9bobo$102bo3b 3o7bo70boo3bobbo7bobboobb3o6boo184bo$101b5o3bo6bo6boo68bobo16boobo189b oo$100booboo3bo7bo6boo69bobo4b3o8bobbo$68boo29b3oboo3bo3bobbo80bo15boo bo$68b3o29boob4o5boo96b3o$62boobbobbobo19boo8b4o105boo$62boobboobboo 18bobo9bo118boo5boo28boo28boo$66boo22bo130bo5bobo27bobo27bobo$89boo 122bo5bobo7bo29bo29bo$80bo131boo5boo$78boo110bo5boo13boo$79boo107bo3bo 3b3o11b3o$192bo5boobo9boo3boo$57b3o100bo26bo5bo4bobbo10boo$57bo100b3o 26boo9boobo11bo$36boo20bo98bo38b3o10bo$21boo12bobo119boo37boo9bobo$20b 3o14bo170boo$19bobobbobboo125bo$19boobboobboo26bo98bo$23boo30b3o97bo$ 13boo43bo154boo28boo28boo$13boo42boo131boo20bobo27bobo27bobo$152boo3b oo32bo22bo29bo29bo$36bo28bo86bo5bo32bobo9bo20boo$34b3o26boo127boo8b4o 18bo$33bo30boo18bo68bo3bo31bo11boobobo6bobo6bobo$33boo49b3o67b3o30b3o 10b3obobbo3bo3bo6boo$72b3o12bo98bo14boobobo4bo$66bo5bo13boo98boo14b4o 4bo4bo49b3o11bo$21boo43b3o4bo129bo7bo30boo23bo10boo$12b3o5bobo19b6o21b o141bo3bo27bo22bo11bobo$11bo3bo6bo18bo6bo19boo143bobo27bobo8bo$10bo5bo 11boo3boo5bo8bo68boo104boo18boo7boo$10bo5bo14bo9bo6bo69bo35boo68bo27b oo4boo5bo$24boobbo5bo7b6o67boobo35boo34boo21boo7bobo26b3o4boo3bobo21bo 7bo184boo$16bo7bobobbooboo47boo5b3o26bo23bo49bo21bobbo5boo4boo22boo4b oobbobo21b4o5bobo182bo$15boo7bo5bobo48boo4bo3bo21bo25b3o49bobo5bobo15b o9bobo23boo6bobbo16boobbobboo8boo169bobo6bobo$15boo14bo36boo3boo11bo5b o22bo22bo53boo3bo3bobb3o10bo11bo24bo7bobo16boobboo11boo169bo3bo4boo$ 13bobboo13bo39bo14bo5bo21bo23boo41boo3boo9bo19bo45bobo12boo10bo7boo 159boo12bo$14bobo51bo5bobboo104b3o10bo4bo7boobbobbo48bo11b3o10bo4bobo 4boo155boo8bo4bo$14boo53booboobbobo7bo95bo3bo10bo7bobobbobboo63boo10bo 4bo6bobo168bo$70bobo5bo7boo95bobo11bo3bo5b3o71boo21bo164bo3bo$29bo41bo 14boo96bo14bobo79boo21boo163bobo$12boo3boo9b3o40bo13boobbo16boo$12boo 3boo8bo3bo54bobo16bobo28bo$26bob3obo54boo18bo27b3o$14b3o10b5o102b5o44b oo$14b3o56bo59boo3boo43boo150bo$15bo56b3o9boo3boo23bo220b3o$71bo3bo8b oo3boo22bobo38boo182bo$70bob3obo35bo3boo36bo47boo9boo12boo108boo$71b5o 10b3o9b3o11bo3boo17b3o4boo8bobo47bobo7bobo12bo110b3o$86b3o11bo11bo3boo 17b3obbo3bo7boo39boobboo6bo8bo5bo4bobo111bobo$87bo11bo3boo8bobo4bo18bo 5bo47boobobbobbobbo13bobo3boo111bo3bo$15boo85bobo9bo4bobo16boobo3bo51b oo6bo13boobo115b5o$15boo85bo15bo3bo16bo5bo56bobo14booboo113boo3boo$ 101boo15b5o17bo3bo17bo39boo15boobo115b5o$28boo54boo31boo3boo18boo16b3o 56bobo117b3o$28boo55bo5boo25b5o36bo60bo119bo$82b3o5bobo26b3o37boo30boo $70boo10bo9bo27bo70bo$71bo107bo9bobo161bo$68b3o108boo8boo161b4o$68bo 88bo16boo4boo169boobobo$156b3o11boobboo4b3o167b3obobbo76bo$156b3o11boo bboo4boo169booboboo74b3o$72boo9b3o11boo80boo171b4ob3o71bo$64bo7bobbo9b o11bo19boo35boo3boo18bo173bo4bobo70boo$63bo3boo7bo7bo5bo4bobo20bo35boo 3boo199bo47bo$63bo5bo6bo12b4ob3o18b3o15boo67boo19boo135boo44b3o$64b5o 7bo11booboboo20bo16bobo40boo26bo19bo128bo52bo$72bobbo11b3obobbo36b3o4b o18boo16bo27bobo8bo6bobo126b3o52boo$72boo14boobobo36b3o4bobo16bo7boo7b obo28boo8bobo4boo126bo117boo19boo$89b4o38b3o24boo4bobbo5boo40bobo131b oo52bo64bo19bo$90bo33boo6bobo4boobo15b3o7bo46bobbo183b3o24bo38boboo3b oo9bobo$123bobo7boo5bobo17bo7bo46bobo183bo3bo22b3o38bo3bo3bo8boo$123bo 16boo18bo7bo45bobo186bo23b5o46bo$122boo40bobbo15bo30bo185bo5bo19boo3b oo38bobbo3bo$164boo15b3o162b3o51bo5bo65bo5bo$138boo3boo11boo22bo220bo 3bo67bo3bo$138bo5bo11boo22boo164bobo53b3o25bo44boo$345b5o80bo$139bo3bo 200boo3boo$140b3o35bo165boo3boo75boo$178bo248bo$177bobo244b3o$176boob oo243bo$175bo5bo218boo$138boo38bo222bo$139bo35boo3boo162boo52b3o$136b 3o14bo191bo52bo$136bo14bobo42boo144b3o$149boo45bo145bo$149boo6boo3bo 15bobo4boo7bobo$149boo10bobo14boobo3b3o6boo50boo20boo$145boo4bobo9bo 14boobo5boobo56bo20bo$144bobo6bo8bo17b3o4bobbo56bobo6bo9bobo$144bo42b oobo57boo4bobo9boo$143boo40b3o16bo48bobo$185boo15b3o47bobbo$201bo51bob o$202bo51bobo211boo$199bobbo53bo212bo$159boo3boo32bo270bobo9bo$161b3o 33bo3bo268boo8bobo$160bo3bo34bo279bo3boo$161bobo32bo5bo276bo3boo$162bo 33bo5bo276bo3boo$197bo3bo278bobo$159boo22boo13b3o280bo$160bo22boo$157b 3o15boo307b3o$111boo44bo16b3o40boo265b3o$109bobbo58boboo42bo265bo3bo$ 108bo7b3o3bo48bobbo4b3o28bo4bobo264bo5bo$100boo6bo6bo3b5o47boboo5boboo 25b4ob3o266bo3bo$100boo6bo7bo3booboo41boo6b3o3boboo24booboboo269b3o$ 109bobbo3bo3boob3o39bobo7boo4bobo23b3obobbo$111boo5b4oboo40bo42boobobo $120b4o8boo30boo43b4o$117bo4bo9bobo75bo$117boo15bo45boo3boo11boo$116bo bo15boo47bo14boo$180bo5bo$181booboo301boo$182bobo302bo$101bo7bo73bo20b oo8bo273b3o$99bobo5b4o72bo20bobbo6bobo273bo$91boo4boo8boobbobboo83boo bbo3bo7bobo$91boo4boo11boobboo82b3obboboo8bobbo3boo$97boo7bo10boo61boo 13boboo4b3o9bobo4boo$99bobo4bo10b3o42bo18bo13bobbo15bobo$101bo4bo10boo 43b3o13b3o14boboo7bo7bo$114boo7boo40bo12bo11boo6b3o4b3o$34bo79boo7bobo 38boo23bobo7boo5boo$34b3o88bo63bo14bo10bo$37bo87boo61boo15bo9b3o$36boo 180bo$166b3o22bo25boo$39bo125booboo21b3o$38bobo124booboo24bo16boo$37bo 3bo123b5o23boo16bobo$38b3o123boo3boo40bo$20bo15boo3boo$20b3o$23bo$22b oo$42bo193boo$43bo151b3o20b3o15boo$41boo151bo3bo19bo$41boo121boo27bo5b o19bo$165bo27bo5bo$22booboboo133b3o31bo14boo$22bo5bo133bo31bo3bo12boo$ 23bo3bo167b3o$24b3o3bo165bo29boo7b3o$30boo194bobo5bo3bo$29bobo9bo156b oo26bo$40b3o155bo34bo5bo$39b5o155b3o31boo3boo37bo$38boo3boo156bo74boo$ 275boo4boo$233boo30boo7b3o4boo$27bo204bobo30boo8boo4boo$27bo12b3o189bo 43boo6boo$26bobo11b3o189boo43bo6bobo$25booboo206bo49bo$24bo5bo202bobbo 49boo$27bo12boo194bo35boo$24boo3boo9boo230bo$260boo8bobo$231booboboo 22boo8boo$26bo236boo$26bo204bo5bo25b3o$25bo237boo$232booboo16boo5boo$ 234bo17bobo5boo$27boo21boo200bo$27boo22bo199boo$51bobo7bobo167boo$52b oo7bo3bo166bo$65bo163b3o$61bo4bo4boo156bo$65bo5boo$61bo3bo$61bobo257b oo$319bo3bo$318bo5bo$274boo37boobboobo3bo$272bo3bo36boo3bo5bo$271bo5bo 41bo3bo8boo$266boobboobo3bo43boo9bobo$266boo3bo5bo56bo49boo$272bo3bo8b oo47boo48boo$274boo9bobo$287bo$287boo96bo$384bobo$383bo3bo$383b5o$382b oo3boo$78bo304b5o$77bobo304b3o$75boo3bo9boo293bo$75boo3bo9boo$75boo3bo $71boo4bobo316boo$70bobo5bo316bobo$70bo323b3o4boob3o$69boo322b3o4bobb 4o$107bo286b3o4boo$107b3o285bobo$110bo285boo13bo$109boo298b3o$383boo 23bo$383boo23boo3$112bo$111b3o292bo$110b5o290b3o4boo$79boo28bobobobo 258bo30b3o4boo$79boo28boo3boo257bobo$372boboo27boo3boo$66boo33bobo267b ooboo10boo15boo3boo$66boo12bo19bobbo268boboo10boo$79bobo9boo6boo267boo 3bobo$78bo3bo8boo4boo3bo3bo3boo255bobo4bo31bo$64bo13b5o16boo6bo259bo 16bobo18bobo$65bo11boo3boo16bobbo3bobbo255boo15bobbo9bo7boo$65bo12b5o 3bo14bobo5bo264boo6boo12bo7boo6b3o$79b3o4b3o285boo4boo3bo10bo7b3o4bo3b o$80bo8bo22b3o267boo21bobobbo5bo$63boo3boo18boo293bobbo19boobbo5bo$66b o317bobo26bo8boo$63bo5bo341bo10bobbo$64booboo12bo319boo9b4oboo7bo6boo$ 65bobo10boo320boo11b4obbo6bo6boo$66bo11b3o321bo14boo7bo$66bo12boo38bo 302bobbo$79bo8booboboo24boo301boo$78bobo33boo4boo290b3o$78boo8bo5bo15b oobboo4b3o289bo$110boobboo4boo266boo3boo18bo8boo$89booboo25boo7boo260b 3o30bo$69bo9booboboo5bo27bo8bobo258bo3bo29bobo8bo$111bo18bo259bobo31b oo8bobo$63b3o13bo5bo14boo7bobo18boo259bo43bobo7bo$62bo3bo4boo27boo6bob o11boo311bobbo6boo$61bo5bo3boo7booboo22bobbo11boo283bo27bobobboo4boo$ 61booboboo14bo7boo16bobo295bobo25bobo3boo4b3o7boo$90boo17bobo278boo13b o3boo23bo5boo4boo8boo$76bo34bo183bo94boo13bo3boo3boo29boo$77boo5boo20b o186b3o109bo3boo3boo29bo$76boo6bo20b3o184bo103boo8bobo24bo$85b3o16bo3b o183boo101bobo9bo24bo$66boo19bo18bo288bo31b3obb3o$66bo36bo5bo284boo31b o$67b3o33bo5bo318bo$69bo34bo3bo313boo$105b3o314boo$78bobo228bo133bobo$ 77bo14bo196b3o15b3o125b3o5bo3bo$72boobbo4bo8b4o194bo3bo13bo113boo8boo bbobbobo7bo5boo$72boobobboboo7boboboo192bo5bo12boo112boo6bobbobboo7bo 4bo4boo$76boo10bobbob3o191bo5bo133bo19bo$89boboboo332bo10b3obbo3bo$85b oo3b4o8boo4boo177bo139bo15bobo$84bobo5bo9bobo3bo178boo14b3o115boo5bobb o$84bo19bo4b3o175boo3b4o124bobo7boo$83boo19boo5bo174boobbobbo9bobo114b o$287bobo4bo7b5o112boo$288boo11boo3boo$301boo3boo$$285boo3boo$285boo3b oo9boo$299boobo$206boo79b3o9bo$204bo3bo78b3o$203bo5bo78bo11b3obo$198b oobboobo3bo94bo$198boo3bo5bo94bo$204bo3bo8boo$206boo9bobo70boo$219bo 70bo$219boo70b3o$293bo5boo3boo$301b3o$300bo3bo$301bobo$302bo4$301boo$ 301boo10$bbo493bo$bobo491bobo$obo493bobo$oo495boo! golly-2.5-src/Patterns/Life/Spaceships/0000755000175100001440000000000012156146015015053 500000000000000golly-2.5-src/Patterns/Life/Spaceships/2c5-orthogonal.rle0000644000175100001440000004264212156145314020253 00000000000000#C Smallest known 2c/5 spaceships. All are p5 and orthogonal. #C Minimum populations: 30, 44, 51, 51, 57, 58, 58, 59, 59, 59, #C 60, 60, 61, 64, 66, 69, 70, 72, 72, 72, 75, 75, 76, 76, 78, 78, #C 79, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, #C 87, 87, 87, 87, 88, 88, 88, 91, 91, 91, 92, 92, #C 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, #C 94, 94, 94, 94, 94, 94, 94, 94, 95, 96, 97, 97, 97, #C 98, 98, 98, 98, 98, 98. #C Spaceships found by: Paul Tooke, Dean Hickerson, Hartmut Holzwart, #C Tim Coe, Stephen Silver, Jason Summers (and small tagalongs by #C David Bell and Robert Wainwright). #C 2c5.rle from Stephen Silver's 12 Jan 2004 'ships' collection. x = 882, y = 581, rule = B3/S23 714bo$712boo3bo$700bo3bo7boobbo$700boobboo6b4obo$698booboobbo$697boobo boobo$696bo3bo5bo6bo$697b3o11boo3bo$698bo7bobboobobobo$708bo$698bo7bob boobobobo$697b3o11boo3bo$696bo3bo5bo6bo$697booboboobo$698booboobbo$ 700boobboo6b4obo$700bo3bo7boobbo$712boo3bo$714bo10$706bo3bo$706bo3bo$ 705bobo$704b3obboo$$707boo$707boo$706bo$703bo$702bobb4o$702bobb4o$702b oo4$700boo$700bobb4o$700bobb4o$701bo$704bo$705boo$705boo$$702b3obboo$ 703bobo$704bo3bo$704bo3bo3$702boobboo$701booboobbo$702b4obbo$705bo$ 707bo$706bobo$707boo$705b5o$704b3o$704bobboboo$705b3o11$702bo3bo$702bo 3bo$701bobo$700b3obboo$$703boo$703boo$702bo$699bo$698bobb4o$698bobb4o$ 698boo4$700boo$700bobb4o$700bobb4o$701bo$704bo$705boo$705boo$$702b3obb oo$703bobo$704bo3bo$704bo3bo3$702boobboo$701booboobbo$702b4obbo$705bo$ 707bo$706bobo$707boo$705b5o$704b3o26b3o$704bobboboo21bobboboo$705b3o 24b3o$733b5o$735boo$734bobo$735bo$733bo$730b4obbo$729booboobbo$730boob boo3$704bo3bo23bo3bo$704bo3bo23bo3bo$703bobo25bobo$702b3obboo21b3obboo $$705boo26boo$705boo26boo$704bo27bo$701bo27bo$700bobb4o21bobb4o6boo$ 700bobb4o21bobb4o5bobbo$700boo26boo10boo$741boo3$700boo29boobb5o$700bo bb4o23boobboo4bo$700bobb4o24bobo$701bo30b3o4bo$704bo28bo4bo$705boo29bo bo$705boo$$702b3obboo$703bobo$704bo3bo$704bo3bo3$702boobboo$701booboob bo24b3o$702b4obbo23bobboboo$705bo26b3o$707bo25b5o$706bobo26boo$707boo 25bobo$705b5o25bo$704b3o26bo$704bobboboo19b4obbo$705b3o21booboobbo$ 730boobboo3$732bo3bo$732bo3bo$731bobo$730b3obboo$$733boo$733boo$732bo$ 729bo$728bobb4o4boo$728bobb4o3bobbo$728boo8boo$706bo32boo$705b4o$704bo bboo$704bo5bo18boobb5o$704bo4bo18boobboo4bo$705bo23bobo$706bobo21b3o4b o$706boo23bo4bo$607bo3bo91boboo27bobo$607bo3bo89boo3bo$606bobo92bo6bo$ 605b3obboo89b7o$$608boo$608boo42bo3bo$607bo44bo3bo42b7o$604bo46bobo45b o6bo$603bobb4o40b3obboo42boo3bo$603bobb4o91boboo$603boo48boo49boo$653b oo49bobo$652bo50bo$603bo45bo52bo4bo142boo$602b4o42bobb4o47bo5bo137boob 3o$601bobboo42bobb4o47bobboo138boobo$601bo5bo40boo53b4o24bo114boboboob boo6booboo4b3o$601bo4bo97bo25b5obo3boo105booboo5b4oboo6bo4bo$602bo126b o5boo3boo108bobboo6boboob3o3bobo$603bobo44bobo77boo4bo3bo109bobo12bob 5o$603boo45bobo47boo29bobbo3boo3bo106bo3bo11boo$600boboo43boobo49bobb 4o19boo16bo106boboobobo$598boo3bo42boboo50bobb4o18booboo10bo111bo4bo6b o5bo$598bo6bo40bo3bo50bo24boboo11b3o120bo5bo$598b7o41boboobo52bo22bo3b obbo128bo$647boobo54boo21b7o129b6o$608bo96boo157boobbo$602bo7bo117b7o 133boo$601b3o46b4obo46b3obboo18bo3bobbo133boo$600bo3bo5bo39boobbo48bob o20boboo11b3o$537boobbo6bo52booboboobo40boo3bo48bo3bo16booboo10bo125bo bbo$536b3obboobbobobo52booboobbo42bo51bo3bo17boo16bo121bo4boo$535bo7b 4obbo3bo50boobboo46bo74bobbo3boo3bo122bo3bo$536boob5o3boo3boo50bo3bo 121boo4bo3bo126b6o$537boo10b3o105bo71bo5boo3boo126boo$539boo11bo74bo3b o22booboo71b5obo3boo$544bo4boo9bo66bo3bo21bobobo73bo96boo$541bo7bo3bo 5boo65bobo23boo3bo169b6o$542b3o4bo3bo4boobo63b3obboo21bobobbo167bo3bo$ 550bobo101boobo168bo4boo$111bobo446bo67boo58bo137bobbo20bo3bo$108bo4bo 436bobo75boo28boo27bobo16bo143bo3bo$107b3o4bo434bo53bo3bo19bo29bob3o 24bo3b3o12b4o119boo19bobo$106bobo440bo3b6o44bo3bo16bo31bo3b3o24bob3o 12bobboo119boo18b3obboo$105boobboo4bo374bo17bo40bobobob3obo20b3o19bobo 18bobb4o27bobo28boo14bo5bo113boobbo$106boobb5o374b4o15bo3booboboo31b3o bo24bobboboo15b3obboo15bobb4o28bo45bo4bo114b6o21boo$488bobboo14bo4bobo bbo36b3o22b3o41boo59boobo17bo117bo27boo$488bo5bo13boob3o3bo36boobbo21b 5o19boo77bobobbo17bobo115bo5bo19bo$116boo370bo4bo14boobo5bo64boo20boo 24boo50boo3bo18boo93boobo19bo5bo16bo$105boo8boo372bo23bobobo63bobo19bo 79bobobo15boboo25boobboo62b3obo41bobb4o$90bo3bo10bobb4o3bobbo371bobo 17boo6bobo61bo17bo25boobboo52booboo12boo3bo24boo66bo6bo10boo7boo18bobb 4o$90bo3bo10bobb4o4boo372boo21bobo10boo52bo18bobb4o19boo60bo13bo6bo23b oboo64boobobboo5bobb3o7b3o17boo$89bobo14bo380boboo23b4o3boo3boo49b4obb o15bobb4o20boboo71b7o20bo6bo65b3obobboobbo$88b3obboo14bo24bo350boo3bo 23bo6b3o52booboobbo15boo21bo6bo56bo41bo14bo59bobobo5bobbobobbo3bo$110b oo20boo3bo347bo6bo21b4o3boo3boo49boobboo39bo59bo44bo6bobboo3bo61boobob oo3boobbo3b3obo$91boo17boo20boobbo144bo203b7o21bobo10boo93bo58boo3bo 42boobobo3boo3bo3bo57boobo3bo8booboobo21boob4o$91boo39b4obo142boo58bob o18boobb3ob3o138boo6bobo82bo18booboboo51boobbo14b7o22boo5bo4b4o3bo62bo 37bo3bo4bo$48bobo39bo16b3obboo166bobo4boo48bo4bo17boo151bobobo61bo3bo 18b4o16boo5boo49b4obo13bo6bo23b11o4boo59bo4bo36bobobo4bo6booboo5boobo$ 45bo4bo36bo20bobo167bo7bob3obobobo39b3o4bo17boboobb3obbo114bobo18boobo 5bo61bo3bo17bobboo18b4o31bo3bo35boo3bo144boobo4boobboobbobo4booboo$44b 3o4bo34bobb4o16bo3bo15boobo143boo8b3o3bobobo38bobo19bo6bo3b3obbo60bo 49bo4bo18boob3o3bo60bobo20bo5bo19bobo29bo3bo37boboo25b11o4boo105bo3b3o boo4bobo3b3obo$43bobo40bobb4o16bo3bo14boboobo140boo4bo4bo3bo44boobboo 4bo12bo14bobo57boo3bo12bo32b3o4bo16bo4bobobbo59b3obboo17bo4bo22bo28bob o16boobo23boo22boo5bo4b4o3bo104bobobobboobobobbob3o$42boobboo4bo33boo 40bo3bo141boob5obo7b6o13boobb3ob3o14boobb5o12bo6bo8b3o57boobbo13bo3boo boboo21bobo23bo3booboboo83bo24bobo27b3obboo12boboobo22bobo21boobobo3bo o3bo3bo106boob3obo8bo$43boobb5o76boboo141bo3bo5bo3b3o6bo12boo46boobobo 9bo54boo3b4obo11bo4bobobbo21boobboo4bo16bo71boo21bobo18b4o48bo3bo22bo 23bo6bobboo3bo110b3obb3o$129boobo141bobobbobobob3o4b3obo13boboobb3obbo 35boo5bobo57boobo22boob3o3bo22boobb5o89boo21boo17boo5boo29boo14boboo 22bo4bo20bo14bo17b3o$132bobo139bobobb3obo4bo4bobo10bo6bo3b3obbo36b8o 56boboboo21boobo5bo119bo20boboo18booboboo31boo15boobo21bo5bo19bo6bo24b obboboo$86boo44bobo154bobo14bo14bobo11boobb5o75boboobbo4bobo22bobobo 94bo21bo21boo3bo17bo37bo20bobo19bobboo25boboo24b3o$42boo42bobb4o212bo 15b3o10boobboo4bo14b8o50boo4bobboob4o19boo6bobo90b4o18bobb4o16bo6bo16b o33bo23bobo20b4o24boo28b5o18bobo$42bobb4o37bobb4o213booboboo8bo13bobo 19boo5bobo50bo4bo3boo3bo23bobo11bo9boo71bobboo18bobb4o16b7o17bo6bo25bo bb4o42bo27boobboo25boo16bo4bo$42bobb4o38bo42boo29bo144boo5boo21b3o4bo 13boobobo54b5o7boo25b4o3boo3bobbo7bobb4o66bo5bo16boo49boboo25bobb4o13b ooboo82bobo15b3o4bo$43bo46bo39bobb4o22boo3bo143b4o25bo4bo13bo6bo66bo 25bo6b3obbo10bobb4o66bo4bo50bo16boo28boo17bo88bo15bobo$46bo44boo37bobb 4o22boobbo147bobo26bobo14bo98b4o3boo4bobo8bo72bo48bo7bo15boobboo41boob oo26boo55bo16boobboo4bo$47boo42boo19bobo16bo27b4obo148bo43bo6bo90bobo 25bo70bobbo43b3o70bo3bo25bobb4o47b4obbo14boobb5o$47boo60bo4bo19bo176bo bo47boboo52b7o28boo6bobo21boo67bo3bo20boobb5o13bo3bo5bo45bo20bo26bobb 4o46booboobbo36boobo43boob4o$70boobboo12b3obboo13b3o4bo19boo140bobbo 27b4o26b7o15boo55bo6bo30bobobo24boo70bo20boobboo4bo13booboboobo45bobo 15bo31bo52boobboo36b3obo43bo3bo4bo$44b3obboo18boo18bobo15bobo25boo19bo obo50bobbo16bo46bo3bo24boo5boo23bo6bo15boobboo50boo3bo27boobo5bo46boob bo6bo33boo25bobo21booboobbo44bo3b3o10bo36bo90bo6bo10boo7boo20bobobo4bo 6booboo5boobo$45bobo22boboo16bo3bo11boobboo4bo38boboobo49bo3bo15bo3boo boboo12boo21bo3boo24booboboo25boo3bo75boboo27boob3o3bo21b3obboo17b3obb oobbobobo32bobboo23b3o4bo17boobboo45bob3o10boob3o33boo68boobb5o12boobo bboo5bobb3o7b3o20boobo4boobboobbobo4booboo$27bobo16bo3bo15bo6bo16bo3bo 12boobb5o16b3obboo16bo3bo49bo3boo14bo4bobobbo12b3o22boo26bo34boboo78bo o25bo4bobobbo22bobo19bo7b4obbo3bo28boo27bo4bo18bo3bo47boo11boo38boo67b oobboo4bo12b3obobboobbo39bo3b3oboo4bobo3b3obo$6bo17bo4bo16bo3bo15bo66b obo19boboo51boo18boob3o3bo11bo3b3o19booboo11bo12bo36boo45bo31bobo25bo 3booboboo22bo3bo17boob5o3boo3boo31bo28bobo84boobo64bo3bo17boobboo13bob o21bobobo5bobbobobbo3bo26bobobobboobobobbob3o$5bobo15b3o4bo34bo68bo3bo 17boobo50booboo15boobo5bo12boobbobo5bo15boobo8boo12bo6bo29bobo43boo30b o28bo32bo3bo18boo10b3o31boo98boobo15bo34b3obboo25bo3bo16boo19b3o4bo16b ooboboo3boobbo3b3obo26boob3obo8bo$4bo3b3o11bobo41booboboo44boo15bo3bo 20bobo11boobo36boobo18bobobo13bobboboo4b3o16boobbo4bobo15boboo28bo46bo bo4boo22bo4bo82boo11bo29bobbo96bobobbo16b3o31bobo27bobo20boboo17bo4bo 17boobo3bo8booboobo26b3obb3o$5bob3o11boobboo4bo34boo5boo29boo10boo41bo bo10b3obo39boobbo11boo6bobo13booboobbobbo17bobo3bo18boo30bo4bo40bo7bob 3obobobo14bo5bo86bo4boo32b5o93boo3bo18boo32bo3bo23b3obboo13bo6bo20bobo 23bo$6boo14boobb5o37b4o32bobb4o5bobbo51bo6bo10boo7boo17bobo4bo10bobo 19bo3bobbo16b5ob3o20boobboo25bo5bo37boo8b3o3bobobo14bobboo85bo7bo3bo 30bobbo94bobobo52bo3bo43bo32bo16bo4bo$71bobo30bobb4o6boo35booboo13boob obboo5bobb3o7b3o13b5ob5o11b4o18b3o3bo16bobbo56bobboo37boo4bo4bo3bo22b 4o86b3o4bo3bo31b3o95booboo82boo14bo6bo26bobo$bboobo67bo31bo47bo19b3obo bboobbo29bobbo18bo22bo21b5ob3o52b4o37boob5obo7b6o16bo96bobo32boo99bo 83boo15boobobo26bobbo17bo5bo35boo$bobobbo64bobo34bo43booboo18bobobo5bo bbobobbo3bo16b5ob5o11b4o19bo24bobo3bo52bo38bo3bo5bo3b3o6bo332bo17boo5b obo23bobo17bo5bo35bobb4o$oo3bo16boobb5o37b4o37boo42bo3bo18booboboo3boo bbo3b3obo18bobo4bo10bobo20b3o3bo18boobbo4bobo88bobobbobobob3o4b3obo 110bo5bo31bo52bo3bo42bo80bo22b8o23bo18bo42bobb4o$bobobo15boobboo4bo34b oo5boo34boo45bo19boobo3bo8booboobo17boobbo11boo6bobo14bo3bobbo15boobo 8boo89bobobb3obo4bo4bobo111bo5bo30bo53bo3bo22bo15bo83bobb4o43bobo22b6o 37bo$bbooboo15bobo41booboboo79bo29bo30boobo18bobobo16booboobbobbo10boo boo11bo104bobo9bo79bo24bo36bo3bo23b3o23bobo23boo3bo10boo3bo80bobb4o17b 8o15bo4bo22boobbo41bo$5bo17b3o4bo34bo40b3obboo37bo27bo4bo26booboo15boo bo5bo13bobboboo4b3o10boo129bobo78b4o23b6o29boo3bo22bobboboo19b3obboo 20boobbo11boobbo81boo20boo5bobo14b3o4bo25boo41boo$24bo4bo19bobo14bo40b obo39boob3o55boo18boob3o3bo12boobbobo5bo11bo3boo126bo79bobboo23boobbo 31boo25b3o45boo3b4obo10b4obo26b3o73boobobo17bobo31boo41boo$27bobo16bo 4bo14bo6bo15bo3bo14bo3bo35boo59bo3boo14bo4bobobbo11bo3b3o19bo3bo126b3o 77bo5bo25boo31bobbo23b5o23boo14boobo51bobboboo69bo6bo15boobboo4bo$45b 3o4bo17boboo15bo3bo14bo3bo36boobo57bo3bo15bo3booboboo11b3o22bobbo154bo 30bo21bo4bo26boo34bo25boo24boo13boboboo50b3o20bo31bo21bo22boobb5o23bob bo38b3obboo$44bobo22boo17bobo59bo59bobbo16bo22boo52bo3bo121boo3bo25boo 3bo19bo64bo26bobo23bo11boboobbo4bobo12boobo31b5o16b4o28b4o19bo6bo47bo 4boo36bobo$43boobboo4bo16boobboo11b3obboo58b3o152boobboo44boobbo6bo64b oobbo26boobbo21bobo25bobbo27bo32bo21bo12boo4bobboob4o11boboobo32boo16b obboo27bobboo23boboo47bo3bo39bo3bo$44boobb5o81boobboo13boo150booboobbo 20bo22b3obboobbobobo58boo3b4obo20boo3b4obo20boo26bo4boo23bobo29bo22bob b4o7bo4bo3boo3bo12bo3bo32bobo16bo5bo25bo5bo20boo51b6o37bo3bo$90boo41bo o169booboboobo20bo3booboboo11bo7b4obbo3bo51boobo27boobo27boboo27bo3bo 24bo3b3o23b4obbo19bobb4o7b5o7boo13boboo34bo17bo4bo26bo4bo22boobboo13bo obb5o25boo$90boo42boboo148b3o14bo3bo5bo18bo4bobobbo13boob5o3boo3boo50b oboboo25boboboo24boo3bo28b6o23bob3o23booboobbo19boo25bo6bo7boobo31bo 20bo31bo44boobboo4bo$89bo40bo6bo147bo18b3o26boob3o3bo14boo10b3o48boboo bbo4bobo17boboobbo4bobo20bo6bo27boo27boo26boobboo52bobo10bobo26b4obbo 18bobo29bobo42bobo$41boo43bo43bo157bo16bo7bo19boobo5bo16boo11bo45boo4b obboob4o15boo4bobboob4o20b7o143bo12bobo25booboobbo18boo30boo44b3o4bo$ 41bobb4o37bobb4o37bo6bo146boo26bo26bobobo21bo4boo47bo4bo3boo3bo16bo4bo 3boo3bo81boobo54bo13b7o11b3o39boobboo16boboo28boboo46bo4bo$41bobb4o37b obb4o38boobobo145boo33bo18boo6bobo15bo7bo3bo44b5o7boo17b5o7boo81bobobb o29bo3bo18b4o11bo6bo72boo3bo26boo3bo8bo40bobo$42bo42boo27bo3bo11boo5bo bo140boob5o15b5o7boo21bobo21b3o4bo3bo57bo30bo6bo17bobo53boo3bo30bo3bo 17bobboo11boo3bo74bo6bo24bo6bo5bo$45bo68bo3bo13b8o139bo7bo4bo10bo4bo3b oo3bo21b4o3boo22bobo84bo9bobo14bo4bo54bobobo29bobo20bo5bo11boboo74b7o 25b7o5boo$46boo65bobo164b3obboobo3boo9boo4bobboob4o20bo6b3o102bo7bo7bo 15b3o4bo54booboo27b3obboo17bo4bo15boo55boobboo57boo$46boo64b3obboo13b 8o141boobbo4bo3bo10boboobbo4bobo20b4o3boo22bobo43b7o27b3o14b3o12bobo 63bo53bo19bobo53boo59bo3bo104boob4o$87boo41boo5bobo150boobbo14boboboo 23bobo28bo46bo6bo25bo3bo5bo21boobboo4bo88boo21bobo15bo57boboo50bo7bo 106bo3bo4bo$43b3obboo37bobb4o21boo13boobobo158bo15boobo21boo6bobo23bo 3b6o37boo3bo28booboboobo23boobb5o89boo21boo15bo4bo49bo6bo16b7o26b3o 113bobobo4bo6booboo5boobo$44bobo40bobb4o21boo12bo6bo157bo18boo3b4obo 14bobobo26bobobob3obo38boboo29booboobbo46boobbo6bo62bo20boboo16bo5bo 48bo23bo6bo24bo3bo5bo107boobo4boobboobbobo4booboo$45bo3bo38bo25bo15bo 159boobbo23boobbo10boobo5bo27b3obo46boo30boobboo45b3obboobbobobo58bo 21boo3bo16bobboo49bo24boo3bo27booboboobo111bo3b3oboo4bobo3b3obo$45bo3b o41bo19bo18bo6bo143boobbo4bo3bo23boo3bo9boob3o3bo31b3o44bobo29bo3bo45b o7b4obbo3bo53bobb4o16bo6bo15b4o50booboboo19boboo28booboobbo77bo33bobob obboobobobbob3o$92boo16bobb4o17boboo142b3obboobo3boo26bo11bo4bobobbo 31boobbo41bo60boo21boob5o3boo3boo53bobb4o16b7o17bo31bo3bo16boo5boo20bo o29boobboo76bobo33boob3obo8bo$92boo16bobb4o16boo144bo7bo4bo40bo3boobob oo75bo4bo56bobb4o17boo10b3o55boo77bo3bo18b4o23bobo28bo3bo76bo3b3o30b3o bb3o$110boo22boobboo140boob5o45bo85bo5bo55bobb4o19boo11bo85bo46bobo24b obo20bo113bob3o$89b3obboo185boo136bobboo58bo29bo4boo81bo7bo43b3obboo 23bo19bo4bo110boo$90bobo190boo135b4o61bo23bo7bo3bo77b3o78bobo19bo5bo$ 91bo3bo15bo176bo132bo64boo22b3o4bo3bo54boobb5o13bo3bo5bo46boo20b4o21bo bboo107boobo38boo$91bo3bo14bobo172bo200boo30bobo54boobboo4bo13booboboo bo47boo18boo5boo19b4o106bobobbo37bobb4o$109bo3b3o170b3o287bobo21booboo bbo46bo20booboboo22bo107boo3bo38bobb4o$110bob3o368b3obboo27bo5bo20bo 32b3o4bo17boobboo27bo15bo22bo138bobobo39bo$111boo371bobo30bo5bo19boo 18bo14bo4bo18bo3bo26boo3bo11bobb4o18bo138booboo41bo$485bo3bo26bo26bobo 4boo11boo16bobo49boobbo12bobb4o18bo6bo17boo115bo43boo$107boobo374bo3bo 27b6o18bo7bob3oboboboobboo63boo3b4obo11boo27boboo17bobb4o101bobbo49boo $106bobobbo405boobbo17boo8b3o3boboboobbo61boobo49boo20bobb4o27bo3bo69b o3bo3bo$105boo3bo410boo14boo4bo4bo3bo12bo58boboboo27boo20boobboo16bo 32bo3bo68bo3boo45b3obboo$106bobobo410boo14boob5obo7b5o3b3o55boboobbo4b obo70bo28bobo72boo49bobo$107booboo424bo3bo5bo3b3o6boo4bo52boo4bobboob 4o19boobboo46boo25b3obboo69booboo47bo3bo$110bo408bobbo14bobobbobobob3o 4b3obo58bo4bo3boo3bo19boo51boo104boobo45bo3bo$519bo4boo11bobobb3obo4bo 4bobo59b5o7boo21boboo78boo77boobbo$519bo3bo28bobo48bo3bo23bo6bo10bo6bo 45b3obboo26boo78bobo4bo$520b6o77bo3bo28bobo10bo53bobo28bo77b5ob5o$521b oo79bobo31bo11bo6bo48bo3bo22bo80bobbo$601b3obboo8b7o13b3o10boobobo49bo 3bo21bobb4o75b5ob5o$616bo6bo25boo5bobo71bobb4o78bobo4bo$604boo10boo3bo 29b8o71boo82boobbo$604boo12boboo189boobo$603bo17boo28b8o149booboo$600b o20bobo25boo5bobo75bo73boo$599bobb4o14bo28boobobo78b4o70bo3boo37bo$ 599bobb4o13bo4bo23bo6bo76bobboo71bo3bo36boo$599boo18bo5bo23bo82bo5bo 69bobbo37bobo4boo$619bobboo25bo6bo75bo4bo109bo7bob3obobobo$620b4o29bob oo45bo30bo111boo8b3o3bobobo4bo3boboobobo$603bo17bo30boo47b4o29bobo106b oo4bo4bo3bo10bo4bo4bobo$602b4o47boobboo41bobboo29boo107boob5obo7b6o3bo bboobobobo$601bobboo94bo5bo24boboo107bo3bo5bo3b3o6bo3boo9bo$601bo5bo 92bo4bo23boo3bo8bo99bobobbobobob3o4b3obo7bob3obbo$601bo4bo94bo27bo6bo 5bo100bobobb3obo4bo4bobo8bo$602bo99bobo24b7o5boo115bobo12bo$603bobo96b oo38boo$603boo94boboo36bo3bo$600boboo93boo3bo30bo7bo$598boo3bo93bo6bo 27b3o$598bo6bo91b7o27bo3bo5bo$598b7o127booboboobo$733booboobbo$606bo 128boobboo$600bo7bo90b7o29bo3bo$599b3o97bo6bo$598bo3bo5bo90boo3bo163bo $599booboboobo93boboo161boo3bo$600booboobbo96boo160boobbo$602boobboo 96bobo154boo3b4obo$602bo3bo96bo154boobo$702bo4bo149boboboo$702bo5bo 144boboobbo4bobo$702bobboo144boo4bobboob4o$703b4o144bo4bo3boo3bo$704bo 33bo3bo108b5o7boo$738bo3bo121bo$737bobo$704boo30b3obboo121bo$704bobb4o 140b5o7boo$704bobb4o28boo110bo4bo3boo3bo$705bo33boo110boo4bobboob4o$ 708bo29bo114boboobbo4bobo$709boo24bo121boboboo$709boo23bobb4o117boobo$ 734bobb4o120boo3b4obo$706b3obboo21boo130boobbo$707bobo156boo3bo$708bo 3bo155bo$708bo3bo21bo$733b4o$732bobboo$732bo5bo$732bo4bo$733bo$734bobo $734boo$731boboo$729boo3bo6bo$704bo24bo6bo3bo$703b4o22b7o3boo$702bobbo o33boo$702bo5bo28bo3bo$702bo4bo23bo7bo$703bo26b3o$704bobo22bo3bo5bo$ 704boo24booboboobo$701boboo26booboobbo$699boo3bo28boobboo$699bo6bo26bo 3bo$699b7o4$699b7o$699bo6bo$699boo3bo$701boboo$704boo$704bobo$703bo30b o3bo$702bo4bo26bo3bo$702bo5bo24bobo$702bobboo25b3obboo$703b4o$704bo30b oo$735boo$734bo$700boo29bo$700bobb4o23bobb4o$700bobb4o23bobb4o$701bo 28boo$704bo$705boo$705boo27bo$733b4o$702b3obboo23bobboo$703bobo26bo5bo $704bo3bo23bo4bo$704bo3bo24bo$734bobo$734boo$731boboo$729boo3bo6bo$ 729bo6bo3bo$729b7o3boo$740boo$737bo3bo$731bo7bo$704bo25b3o$703b4o22bo 3bo5bo$702bobboo23booboboobo$702bo5bo22booboobbo$702bo4bo25boobboo$ 703bo29bo3bo$704bobo$704boo$701boboo$699boo3bo$699bo6bo$699b7o4$699b7o $699bo6bo$699boo3bo$701boboo$704boo$704bobo$703bo$702bo4bo$702bo5bo$ 702bobboo$703b4o$704bo3$704boo$704bobb4o$704bobb4o$705bo$708bo$709boo$ 709boo$$706b3obboo$707bobo$708bo3bo$708bo3bo9$695boobo$694b3obo$693bo 6bo10boo7boo$694boobobboo5bobb3o7b3o$695b3obobboobbo$697bobobo5bobbobo bbo3bo$698booboboo3boobbo3b3obo$698boobo3bo8booboobo$704bo$700bo4bo3$ 697boo$697bobb4o$697bobb4o$698bo$701bo$702boo$702boo$$699b3obboo$700bo bo$701bo3bo$701bo3bo6$712boo$711b6o$710bo3bo$710bo4boo$710bobbo$$712bo o$712boo$708boobbo$708b6o$707bo$708bo5bo$708bo5bo$$709bo$707boo3bo$ 707boobbo$707b4obo3$704boobo$703boboobo$703bo3bo$703boboo$704boobo$ 707bobo$707bobo3$705boo$705bobb4o$705bobb4o$706bo$709bo$710boo$710boo$ $707b3obboo$708bobo$709bo3bo$709bo3bo9$706boobb3ob3o$705boo$706boboobb 3obbo$702bo6bo3b3obbo$702bo14bobo$701bo15b3o$702booboboo8bo$702boo5boo $704b4o$707bobo$709bo$707bobo$704b4o$702boo5boo$702booboboo8bo$701bo 15b3o$702bo14bobo$702bo6bo3b3obbo$706boboobb3obbo$705boo$706boobb3ob3o ! golly-2.5-src/Patterns/Life/Spaceships/adjustable-Corder-lineship.rle0000644000175100001440000003163112156145314022647 00000000000000#C Adjustable-period growing/shrinking Corder-based c/12 lineship #C Nicolay Beluchenko, 17 July 2005; optimization by David Bell. #C This example is period 6144, with a minimum population of 4620. #C Moving the back Cordership forwards or backwards by multiples of #C 88 cells adjusts the period by multiples of 1152 generations. x = 894, y = 809, rule = B3/S23 367bo$$371bo$$363b3obo$363b3obo$364bo8boo$365bo3b3oboo$366bo6bo$367bob obobo$368bo15boo$384boo7$392boo$392boo$374b3o$372bo3boo$366b3o3bobobb oo$371bo5bo$372bobboo$372bo$357bo$356bobo$$356bobbo3bob3o$358bo4bo$ 359boboobobo$360boo3bo$361bo5$338boobbo$341bobo$340bo$350boo$342boo5bo bbo$350boo$343boo$342bo$340booboo$343boo$341bo$358boo$357bobbo$358boo 8$336b3o$$340boo$342bo$336b4obo$336b5o$314bo$314bo$314bo21bobo13bo$ 317boo17bobo13b3o$317boo12boo4bo14boo$312bo3b3o11boo4bobo10boobbobo$ 313b3o15bo5boo10b3o$314bo15b3o4bo$313boo15b3o19boo$313b3o16bo18boboo$ 315bo14bobbo17bo3boo$313bo16b3o22boo$315bo15bo20bo$313b3o37bobbo$353b 3o5$328bobo$328bobbo$328bobbo$328bo3bo$318boo9bobo$318boo10bo6$284b3o$ 283bobbo39boo$282bo4bo38boo$282bobb3o$282bo5bo$283b7o$289bo26boobo$ 289bo25b3obo6bobo$287boo12boo11bo4bobo4bo$301boo12boo6bobo3bo$316bo3bo bbobboo$319boboo3bo$286bo31bobo19bo$285bobo30bobo18bo$284boobo51b3o$ 284boo$285b3o21boo$286bo16bo5boo$287bobbo11bobo$273b3o8bo6bo9boo$284bo 6bo$271bo5bo6bo3bo31b3o$271b7o10bobo31bo$273bo14bo32bo$273bo3bo11bo$ 272bo$249bobo21bo27bo$248bo25bo4bo$249bobbo21bo4bo21bo$251bobo19boobob o$254bo11b3o3bobo$253b3o17bo$253bo$235bo15boo$235bo5b3o9bo13b3o$234bob o3boobbo6bobbo12b3o$235bo3bo5bo5bobo13boo$235bo3bo11bo14bo21b3o$240bo bboo19boobbo21bo31bo$241boo22bo3bo19bo32bobo$212bo52bobbo53boo$211bobo 5bo46b3o$217booboo$211b3obbo3boo$217booboo102bo$217b4o102bo$231boo18b oo70b3o$231boo18boo3$234bo$234b3o$229bo3bo3boo$228bo5bo3bo$229bo8bo20b oo$234boboo21boo$224b3o8bo$214b4o4b4oboo$214boboboo4boobbo$215boo9b3o 6boo$217bo3bobo10bobbo26bo$234bobbo26bo$234bobo27bo8bo$231b4o36bobo$ 231bobboo29b3obbo3bo$232b3o31bob5o$219boo12bo38bo$219boo46boo15boo$ 230bobo51boo$232bo$229bo76bo$228boo76bobo$228bo3bo73boo$229b3o$196boo$ 186bo3boo4b3o93boo$186boboobbo6bo75bo16boo14bo$186bobb5obb4o74b4o29bo$ 190b3o3b3o73b5obo28b3o$189b3o74b3obbo6boo$189boo17boo60bo3bob3o$189bo 18boo61bobobboo3$256b3o$265bo$258boo5b3o$258b4o4bo$216boo40boob3oboo$ 216boo45bobo$195bo8boobbo$194bobbo5b3obboo$188b3obbo3bo6boobb3o$188b3o bbo4bo5boobboo$192bo3boo$196boo42bobo$193boo45b3o$189bobo48boo$180bob 3o4bobo58boo$178boobo4bo5bo56bobbo$180boo4bobbobbo50bo6boo$186bobbobbo 48bobo$185bo4bo50b3o46bo$181bobbo59bo45bobo$182boo56b5o45boo$$258boo$ 257bobbo$143bo114boo32bo$126b3o8bo5bo147bo$125bo3bo6bo7bo146b3o$126boo 9b4obboo$128booboo9b3o43bo$130boo11bobo42bo$144bo7boo18b3o13bo$144bo7b oo34bo$170bo5bo10boo47b3o$170b7o12bo46bobo$172bo14bo48bobo$172bo3bo59b o4boo$153boo16bo24boo37b3o3boo$152bobboo15bo23boo43bo$151boo3bo3boo11b o4bo35bo22b4o$151boobobo3boo11bo4bo35bo23boo$149b3obboo16boobobo35bobo 22bo$148b3o20bobo40boobbo11boo$132boo13boo23bo40bo5bo9bobbo6bo$132boo 9boobboo64bo5bo10boo5bobo$213bo4bo12bo4b4o$137boo4boobbo69bo13bo3b4o$ 135boobo6b3o66b3o13boobo4bo$120bo12bo5bo89boo$119b3o11bob4o94bo$118bo 14bo3boo59bobo11booboo12bob3o27bo$119booboo11boo61bobo16bo12bobbo28boo 10bo$120b3oboo40b3o28bobbo11boo16b3o28boo11bobo$122b4o40bobo29boo4boo 8b3o57boo$165bo3bo28boo3b3o$165bo3bo$165bo$165bo4boo17bo38boo46bo$165b o6bo14boo42bo43bo$166bo5bo15boo38bobbo43b3o$166boo61boo37bo$168bo3bo 56boo37boo$116b3o31b3o6bo9bobo46boo8bobbo35bobo$116b3o13boo17boo3boobo 58boo8bo49boo$117bo14boo16boo5bobo69b3o46bobo$118boo35b3obo121bo$119bo 38boo122bo$118bo47boo115bo$166boo116bo$283boo$226boo$116boo22boo84boo 58boo$116boo22boo144bobo$117bo54bo116bo$117bo53bobo74bo41bo$116bobo53b o75boo41bo$115bo120bo10bobo42bo$116bobboo39bo3boo70boo34b3o16boo$117bo 3bo32boboo3boboobo68bobo34b3o$119boo31boobo3bobo4boo105bo20boo$119bo 35bobobb3obboo107boo18bobo$110b3o43bo4boo112bo21bo$109bo3bo141boo17bo 14boo7bo$108bo4bo142boo31boo8bo$107bo3bo143bo44bo$107bobbob3o184boo$ 107bo7bo156boo$109bo3bobo42boo112boo28boo$109bo3boboo41boo113bo28bobo$ 111b3oboo56bo99bo15bo15bo$171boo43bo55bobo15boo5boo7bo$172boo42boo53bo 16bobo6boo8bo$204bo10bobo54bobboo11bo19bo$204boo67bo3bo10bo18boo$203bo bo69boo12boo$96bo32bo145bo34boo$92b5o7boo21boo181bobo$92bo3bobo4b3o22b oo153bo3bo25bo$92b3o3b3o3b3o41b3o72boo58bo4bo25bo$98boobb3o42bo3bo10bo 61boo40bo15boo4bo26bo$98bo49boo15boo56bo41bobo15bobbo29bo$95b3o12boo 38booboo128bobbo28boo$95boo13boo40boo111bobbo15bobo$267boo20b3o26boo$ 268bo22bo26bobo$290bo30bo$184bo137bo$116bo67boo137bo$115bobo54bo10bobo 138bo$116bo55boo91boo56boo$115bo55bobo93bo$110bob4o149boo59boo$95bo3b 3obo6boo4bo209bobo93boo$94bobo3bobobo5bo3boboo211bo78bo9bo3b3o$94bob7o boo5b3obo75boo71boo64bo77b4o5bobobbo$95b3oboo3bo87boo70boo65bo76bo3bo 5bo3bobbo$101b3o87bo140bo93bo$102bo228boo77b3o10bobo$249bobo6bobo163b oo7boo$248bo9bobo73boo97boo$249bobbo6bo74bobo$102boo147b3o83bo$102boo 48bo119boo64bo$152boo118boo65bo$151bobo186bo93boo$339boo93boo$65bo175b o191bobbo4boo$64b3o46bo126bobo99boo89boboo4boo$63booboo43boo229bobo85b 3o$62boobobo23boobbo16boo126bobbo101bo85boo$61b3obb3o25bobo62boo81boo 36boo64bo66boo9boobbo$62bo6bo23bo66boo81bo36boo65bo65boo8bo4boo$63b5ob o89bo188bo75boboboo$64b4oboo24boo250boo77boo$69bo347b3o$68bo12boo13boo 252boo64boo$81boo12bo144boo108bobo48bobo11boobo$93booboo144bo25boobbo 80bo46booboo11boo$96boo22bo119boo29bobo80bo46boboo12bo$66bo27bo25boo 148bo84bo49bo$64boobo51bobo234bo47bo$243boo27boo81boo47bo$67bo155boo 167boo$64bobbo21boo131bo50boo83boo18bo9bo3b3o$65bo23boo131bobbo46bo85b obo17b4o5bobobbo$220boob4o11bo17bo13booboo86bo16bo3bo5bo3bobbo$70boo 55boo90bo18bobo15bo16boo87bo33bo$63b3o5boo55boo89bo3b3obbo9bobo17bo5bo 6bo91bo16b3o10bobo$70boo55bo80bo10bobbobbob3o3bobo21bo6bobo97bo29boo$ 57b3o10bo137bo12boo4b3o4bo21bo3bobbo99boo$56bo3bo149bo5bo6boobobo28bo bboboboo$55bo4bo148bo6bobo5boobo14bo19boboo100boo$54bo3bo149bo3bobbo 11bo12b4o122bobo$54bobbob3o147bobboboboo21bo3bo125bo$54bo7bo151boboo 21bobbo127bo28boo$56bo3bobo177b3o128bo30boo$56bo3boboo120b3o185bo26b3o boo$35bo22b3oboo129bo55boo120boo30bo$33booboo148boo5b3o53boo142boo4bo 3bo$186b4o4bo179boo19bo3boboo$36boo148boob3oboo64b4o111bobo6boo6bobbo$ 37bo153bobo64bo3bo114bo5boo5bo12bobo$31bo3bo59boo108boo18boo35bo115bo 24boo$35bo3bo56boo107boo18boo31bobbo117bo24bo$95bo284bo$214boo163boo$ 33bo20b3o148bo10bo$34b3o16b5o3boo140b3o3bo4boo166boo$52bo7b3obo138boo 4boo104b4o63bobo6boo$57bo6b3o136boobbo3bo102bo3bo66bo5boo$34b3o20boboo 3boo139bob4o22boo83bo67bo$60b5o130boo10b3o23boo79bobbo69bo$34bo26b3o 134bo189bo$62bo125bo4boo4boo186boo$43bo144bo3boo6bo$42bobo143bobb3obb oobbo115bobo71boo$27bo14bobo151boobo9b3o95bob3o4bobo52b4o15bobo$23b4ob oo5boo6bo165bo95boobo4bo5bo50bo3bo18bo$22boob3oboo175boboo97boo4bobbo bbo54bo19bo$23bob3obo6bo163boo4b3o104bobbobbo50bobbo21bo$24bo3b4o4boo 14boo153bo104bo4bo78bo$27boob3o18b3o254bobbo16boo67bo$28b5o18bo3bo137b oo8bo105boo17boo68bo$4bo24bo20bo5bo136boo5bobbo195bo$oobobo7bo36bo5bo 145boo196bo$obbooboobbooboo35boboobo147bo177boo18bo$o5bobo5bo10bo26bo 152bo174bobo19bo$boobbo8bo9bobo23bo152b3o176bo20bo$5bobb3obbo35bob4o 149bo199bo$5b3o18boo21b5o282boo55bo9boo$23b3o25bo284boo54bobo$323bobo bboo62bobo$309bo4bobo6bobboobbo62bo$308bobobboobboo7boobbo$308bob4obbo bo5boobbobo$21bo287bo6bobo$20b3o290bob3o$19b3obo$18bo4bo279bo8bo$8bobb o10bo276b5o7boo$11b3o3boo6bobo271bo3bobo4b3o$3boo3boob4o10boo272b3o3b 3o3b3o35boo$3boo9boo10bo252bo25boobb3o36bobo$279bo5b3o17bo44bo$278bobo 3boobbo13b3o$10bo268bo3bo5bo12boo$279bo3bo$284bobboo$285boo$11boo$11b oo$$282bo29boo$281bobo26bo3bo$281bobo25bo5bo$282bo28bobboobboo$314boo bboboo$321bo$313boo4b3o$314boo$270bo19bo48b3o$267b4o18bobo133bo$289bob o45bo5bo80bobo$290bo46b7o12bo67bobo$339bo17boo66bo$270bobo66bo3bo13boo $271bo66bo17boobo75bo$243boobbo21boo68bo18b3o73bobo$246bobo20bobbo67bo 4bo11boboo73bobbo$245bo16bo5booboo67bo4bo11boo48b3o25boo$262bo76boobob o12bo6boo40bo$247boo13bo75bobo23boo39bo4boo$339bo64bo3bo15b3o$248boo 12boo140bobbo4bo4boo$247bo13bobbo139bo3bo3bo4b3obo$245booboo11bobo141b oobob3o$248boo10boo146bo$246bo13bo148b4o20boo6bo$263boo146boo11boboo5b oo5bobo$263boo28b3o58b3o15bo51bobbo12bobo$263boo28bobo60bo10boboboboo 49b3o14bo$260boobo29b3o59bobbo8bob3oboo58bo$261b3o45boo22bo10bobo9boob oo6bo5boo58bo4bo12bo$262bo45bobboo20bo10bob4o7bo11b4o59bobobbobo10bobo $295boo11booboo20bo11b3obboob3obobbo9boo60bobobo3bo9bobbo$293booboo14b o17bob3obo11bobobb4o3bo70bo4b3obboo8boo$293boobboo10boo19bob5o13bobo7b o75bobo3bo$250boo40boo3boo11bo7boo14bobo13bob4o4bo74boo$250boo41boobb oo19boo11boo19boobbo3boo13bo57bo4boobo$294bobo34boo16bobbo5bobo13b3o 36boo13bo$332bo26bo13boobo36boo3b3o6bo$332boo15bo23b3o25bo16bobo5bobbo $333bo3boo11boo22boo24boo16bobbo4bobbo$310b3o20bo65b5o14b3o6boo$307b3o bo19boboo63bo21bo$258boo48booboo10bo8bo64boo5bo14bo$258boo48booboo9bob o71b3oboo16bobo33bo$310bo11bobboo70boboboobboo11boo17b3o8bo5bo$321b3o bbo71bobbobboo13bo16bo3bo6bo7bo11bo$298boo14b4o6b3o50b3o20boo35boo9b4o bboo10bobo$298boo14boob3o56bo25boobo33booboo9b3o10bobbo$287bo14b3o7bo bbobboo55bo4boo23bo35boo11bobo10boo$286bobo13bo4bo4b3o3bo55bo3bo15b3o 58bo7boo$285bo3bo16bobobbobbobbo56bobbo4bo4boo66bo7boo$286bobo13bobbo 5bobo60bo3bo3bo4b3obo$287bo19boo3boo61boobob3o$303bobbo24b3o44bo$287b 4o13b3o72b4o$286bo4bo89boo11boboo66boo$263b3o22bo51bo53bobbo65bobboo$ 263bobo19bo3bobbo46bo54b3o65boo3bo3boo$263b3o19bob3obo48bo121boobobo3b oo$279boo5b3obo169b3obboo$278bobboo176b3o$265boo11booboo160boo13boo$ 263booboo14bo160boo9boobboo$263boobboo10boo$262boo3boo11bo167boo4boobb o$263boobboo177boobo6b3o$264bobo116boo46bo12bo5bo$383boo45b3o11bob4o$ 429bo14bo3boo$347b3o80booboo11boo$280b3o148b3oboo$277b3obo151b4o$278b ooboo$278booboo141bo$280bo110boo14b3o8bo5bo$391boo13bo3bo6bo7bo$268boo 137boo9b4obboo$268boo139booboo9b3o$411boo11bobo$425bo$425bo4$276boo$ 276boo155boo$430boobbo$435bo$429bo4bo$429bo$434bo$413boo16bo$413boo19b o$$432b3o5$421boo$421boo$$319bo$315b4oboo5b3o$314boob3oboo4b3o75b3o$ 315bob3obo7boo74bobbo$316bo3b4o4boo78bo$319boob3o80boo15boo$320b5o13b oo64bobo15boo$321bo16boo65bobb3o$406boobbo$406bo3bo$407bobo10bobo$409b o12bo$406bobbo16bo$359bo46bo13b3o7boo$346boo10b3o60boo7boo$334b3ob3o5b oo9boobo44boobbo11boo$326bo6b4obobbo15b3o46b3o13boo$323boo4bobbobo23b oo63bo$318boo5boo3bo10bo$318boo7boboo3b3o84bo$335boobboo78bobo$322bo 95bo$321boboo92boo$309b5o6bo3bo91b3o$307boo5boo3bobboo75bo17bobbo$307b o7bo3bobo76b3o10bo6boo$307boo7bo5bo75bobbo6bobbo$289bo7bo11boo6bo80b3o 6bo3bo9boo$288b3o5bobo13bo85b3o7bobo11boo$287boob4obbobbo12bo4bo79bob oobo7bo10bo$288b3obbo19boobo81bobb3o$289bobboobbo101b4oboo$293boobobo 100bob3o$297bo103b3o$402boo3$292bo105boo$291bobo104boobo$291bobo104b4o $292bo107bo4$393boo3b4o$279bo20bo87b3obobbo6bo7boo$277booboo17bobo90bo bbobb5o7boo$279bo19bobo90bobbo$300bo93bo$391bobo$280boo47bo62bo$279bo bbo44bobo$255bobo20boo3bo44boo$254bobbo20bo4bo67bo66boo$255bobo20bo3bo 67b3o65boo$271boo6bobbo66boobo$271bobo6bo68b3o$257bo13b3o76boo$256bob oo11bobbo133bobo$256boboo12bo134bo3bo$255bo3bo12bo38b3o6bo57bo28bo4bo$ 256b4o52boo3boobo57bo28bo4bo$256b3o15bo36boo5bobo57bob3o12b4o9bo3bo$ 271bo44b3obo59b3o10bobo12bobbo$271bobbo44boo60bo9bo3b3o$270b3o58boo48b oo7b3o$270b3o58boo49bo6bo4b3o$270bobbo92b3o13boo6bob4o$271bobo92b3o23b o$271b3o93bo11booboo8bobo$368boo10b3o10bo$369bo10bo$260boo106bo$260boo 77boo$339boo42bo$321bo3boo56bo$315boboo3boboobo38boo15bo$313boobo3bobo 4boo37boo$316bobobb3obboo39bo17bo$317bo4boo43bo16bobo$268boo96bobo16bo $268boo95bo$305bo46boo12bobboo$304bobo5bo39bobo12bo3bo$310booboo37bo 16boo$304b3obbo3boo54bo$310booboo82bo$310b4o82bo$396b3o$$281b3o6bo49bo $282boo3boobo49bo7bo$281boo5bobo49bo5b3o22boo$286b3obo48boo3bobo24boo$ 289boo54bobbo$301boo41bobboo$301boo56boo$359boo$368boo$368bobo$300boob 3o62bo10boo$298bo7boo71boo$298bo5booboo$299boo4b3o83bo$304bobo60boo21b obo$291bo3boo7bo62boo21bobo$285boboo3boboobo50boo3boo36bo$283boobo3bob o4boo43bo3b4o3bobo$286bobobb3obboo7boo35boboobbobbo3bo30boo$287bo4boo 10bobbo34boboo4bo3boo29bobbo$305boo39bo3bo35boo$305boo44bo$301boobo$ 301bobbo$302b3o27b3o6bo42boo$289boo42boo3boobo42bobo$289boo41boo5bobo 42bo$300boo35b3obo$300b3o37boo$301bo$298booboo$298booboo$300bo$$315b3o $315bobo$315bobo17b4o$315bo4boo13bo4bo$314b3o3boo12bo5bo$320bo18bo$ 299bo16b4o15bobbo20bo$317boo16bo23boo$295bo7bo13bo16booboo19bobo$295bo 8bobb3o26bo$294bo4boo3bobb3o8bo$295bobo6bobboobbo4bobo$295boboo10bobo 3b4o$309b3o3b3o$275b3o22bo16bo$273b7o6bo$272b9o4bo$271bo7b3obboo$272b 3o6bo3bobbo41b3o$273boo11b3o42bobo$276bo10bo42bobbo$277bo38boo12bobbo$ 278bo37boo12bobo$330bobbo$331boo$332bo$293boo$$291boobbo$291bo3boo27b oo$324boo$291boboo$282boboo6bo5bo$276boo4bobo3bo8bo$276boo6booboo8b3o 7$284boo$284boo82$867b3o$866bobbo$865bo4bo$865bobb3o$865bo5bo$866b7o$ 872bo$872bo$870boo12boo$884boo3$869bo$868bobo$867boobo$867boo$868b3o 21boo$869bo22boo$870bobbo$867bo6bo$867bo6bo$867bo4b3o$861bo$860b3o$ 859booboo$858boobobo$857b3obb3o$858bo6bo$859b5obo$860b4oboo$837b3o25bo $836bobbo24bo$835bo4bo$835bobb3o$835bo5bo$836b7o$842bo$842bo$840boo12b oo$854boo3$839bo17bo$838bobo15bobbobo$837boobo14bobb5o$837boo17bobo3bo $838b3o16bo$839bo$840bobbo$837bo6bo$837bo6bo$837bo4b3o13bo$857bo$854b 3obo$854boo3$848b3oboo$842boo3b4o$842boo3bo5bo$851bobo$849boobo$851b3o $848boobbo$849bobbo$852bo$849bobbo$850boo! CB 1,1,1,1golly-2.5-src/Patterns/Life/Spaceships/c3-orthogonal.rle0000644000175100001440000003401512156145314020162 00000000000000#C Smallest known c/3 spaceships. All are p3 and orthogonal. #C Min populations: 25, 25, 26, 29, 30, 34, 35, 36, 36, 37, 38, 38, #C 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 41, 41, #C 43, 44, 44, 44, 44, 44, 44, 44, 45, 45, 46, 46, 46, #C 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, #C 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, #C 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, #C 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, #C 53, 53, 53, 53, 53, 53, 53. #C Spaceships found by Dean Hickerson, Stephen Silver, Jason Summers, #C David Bell, David Eppstein. #C c3.rle from Stephen Silver's 12 Jan 2004 'ships' collection. x = 387, y = 462, rule = B3/S23 288bo$279boo6bobo$286bo$277boobbo3bobboobobobboo$276bo6b5o5bobbo$275bo o4boo6bo5bobo$276bo4boo3boo$276b3o4bobboo$277bo$279bo$277boo$277boo$ 279bo3$288bo$279boo6bobo$286bo8bobo$277boobbo3bobboobobobbo$276bo6b5o 5bobboo$275boo4boo6bo$276bo4boo3boo$276b3o4bobboo$277bo$279bo$277boo$ 277boo$279bo3$288bo$279boo6bobo$286bo6bobboo$277boobbo3bobboobobobbo$ 276bo6b5o7bobo$275boo4boo6bo$276bo4boo3boo$276b3o4bobboo$277bo$279bo$ 277boo$277boo$279bo3$288bo$279boo6bobo5bobo$286bo6bobbo$277boobbo3bobb oobobobboo$276bo6b5o$275boo4boo6bo$276bo4boo3boo$276b3o4bobboo$277bo$ 279bo35bo$277boo34boo$277boo34boo$279bo$302bo11b3o$301bobo10b3o$300boo $301bobo3bo3b3o$289bo11boo3bo4b3o$285booboo14bobo$284bo3bo11bobbo3boob bo$284bo3bo10bo$283bo3bobbobo5boo9boo$281b3obobo3bobo4bobo$278bobboo3b oo3bo5boo$277bobo3boo$276bobbo3bo4bo9bo$277bobo3boobbo10bobo$278bobboo bobo11bobo$281boo16bo$283boo$284bo4$302bo$301bobo5boo$289bo10boo$287bo o12bobo3boobbo$287boo12boo3bo$289bo14bobo4b3o$287bo12bobbo3bo3b3o$254b o32bobo9bo81bo$253bobo31bobo8boo14b3o63bobo$253bobo32bo9bobo13b3o63bob o$253bo32boo9boo81bo$287bo25boo$252boo29bo3b3o8bo14boo64boo$253bobo3bo 21boo5bo9bobo14bo64bobo$253boobboo22boo7bo7bobo78bobo$254bo4boo22bo4bo o9bo79b3o$255bo25bo6boo$257b6o17b3o97bobo$257bo22bo4b3o18bo73boo$258b 3obo16boo4b3o16boo75bo$258boobo18bo23boo75bobo$260bobbo17boobbo20bo74b oo$263bo40bo74b3o$264bo18boo18b3o72bobo$263bobo37bo74bobo$263bobo36boo 74bo$263bo39bo75bo$265bo23bo14bobbo34bo36bobo$263boo23bobo17bo32bobo 36bo$263boo23bobo14boo33boo37boo$265bo16bo5bo17bobo32bo$280boo5boo17bo o32bobo35bobbo$280boo5bobo19bo30bo36bo$282bo22bobbo30bo36boo$280bo5b3o 15bo23boo9bobo34bobo$277bobbo5b3o14boo34bobo33boo$277bobboo22bobo19boo bbo6b4o$178bo98bo6boo18boo19bo10bobo37bo$177bobo98b3o3boo21bo16boo4b3o 3bobo37bobo$177bobo99bo23bobbo18bo4boo4bo39bobo$177bo101booboboo16bo 22b3o4bo44bo$259bo21bo3bo15boo23bo6b3o$138bo37boo80bobo25boobo12bo25bo $136boo39bobo78bobo25bobo13b3o21boo$136boo38bobo79bo44bo22boo30bo$138b o37bo128bo22bo27boo$136bo40bo79boo44boo51boo$135b3o36bobbo80bobo42boo 53bo20bo$135bo38b3obo79boo25bo19bo50bo21bobo$134boo38bo84bo24bobo69bob o18boo$135bo39b4o81bobbo20bobo69bobo20bo$136bobbo33bo90bo19bo72bo19boo $172bo4boo82boo92boo20b3o$137boo32boobboo84bobo19boo71bo$138bo32bobo3b o82boo22bobo48bo20b3o18bobbo$137bobo30boo68bo20bo22boo48bobo20bo19bobo $137bo101bo22bobbo19bo47boo24bo17bo$136bo34bo66boo26bo19bobbo15bo22bo 5bobo20boo19bo$136bobo32bobo66bobo20boo25bo12boo22bobo4boo21boo19bobo$ 106bo29bobo32bobo64b3obbo20bobo20boo14boo21boo9bo41bo$105bobo29b4o31bo 65boobbo21boo22bobo14bo21bobo3bobbo18boo21boo$105bobo31bobo91bo33bo20b oo13bo23boo3bo22bobo$105bo33bobo89bobb3oboo23bobbo24bo10b3o25bobo22boo 20bobbo$138bo92bobo5bo22bo24bobbo11bo23bobbo3bobbo18bo20bo$104boo19bo 12boo90bo9boobo17boo23bo14boo22bo11bo18bo18boo$105bobo16bobo11bobo90b 3o6bobo18bobo21boo15bo21boo8boo20bobo17bo$105boo16boo14bo94bobo23boo 24bobo14bobbo17bobo7bobo20bo18b3o$106bo17bo107b3obbo48boo19bo15boo8boo 21boo19bo$107bobbo12bobo106boo27bo27bo14boo28bobo42bo$111bo11bo52bo58b o25bobo21bobbo15bobo17bo10bo19bobbo18boo$108boo14bo50bobo54boobbo24bob o20bo18boo19bobo27bo22boo$109bobo9bobbo50bobo55bobbo25bo20boo19bo19bob o26boo$109boo10b3obo49bo58bo49bo20bobbo16bo27bobo19boo$112bo8bo162b3o 22bo42boo21bobo$108bobbo10b4o10boo36boo109bo20boo67boo$107bo12bo54bobo 109bo19bobo43bo21bo$106boo11bo4boo8boobbo35bobo108boo20boo44bobo20bo$ 107bo10boobboo9bo41bobbo81bo24boo23bo42bobo20bobo$107b3o8bobo3bo7boo4b 3o33boboo81bobo25bo18bobbo44bo22bo$108bo8boo14bo4b3o34bobboo79bobo43bo 70boo$110bo22b3o38boo67bo15bo44boo27bo43bobo$108boo8bo15bo6b3o30bo67bo bo60bo19bo6bobo43bo$108boo8bobo15bo4b3o30boo65boo15boo45b3o16bo7b3o$ 110bo7bobo13boo38b4o64bobo14bobo25bo18bo16boo7bob4o$119bo14boo6bobo33b o63boo15boo24boo21bo16bo9bobo$136bo5boo72bo14b3o11bo14bo24boo19boo17bo o4boo$143bo30bo40bobo12bo10bobbo16bobbo22bo18boo17boobboobbo$143bobo 27boo39boo12boo4bo5bo24bo19bo22bo17bob3o3bo$143bobo28bo40bobo10b3o3bob obboo21boo20b3o41bobo29bo$144bo29b3o38boo17bo6bo21bobo18bo41b3o5bo24bo bo17bo$175bo42bo10bobo3b5o23boo18boo41b3obboobo23boo18bobo$108bo11bo 56bo36bobbo11boo6boo27bo17bo14bo32bo3bo16bo5bobo15boo$94bo11boo10boo 55boo36bo16bo7bo23bobbo19bobbo8boo33bo3bo15bobo4boo18bo$93bobo10boo10b oo55boo35boo16bobo28bo27bo7boo33bobo16boo9bo14boo$93bobo12bo11bo56bo 35bobo14bobo27boo24boo11bo33bo18bobo3bobbo15b3o$93bo12bo11bo94boo16bo 29bobo22bobo8bo6b3o3bo41boo3bo$105b3o9b3o96bo44boo22boo9b3o4bo5bobbo6b o35bobo19bobbo$92boo11bo11bo94bobbo48bo21bo9bo4boo4bobo3bobobobobo29bo bbo3bobbo15bobo$93bobo8boo10boo93bo48bobbo23bobbo4boo4b3o3bo3bo5boboo 29bo11bo14bo$93boo10bo11bo13b3o3bo72boo47bo31bo4bo10bobobobbo34boo8boo 17bo$73boo19bo11bobbo8bobbo8bo5bobbo6bo64bobo44boo28boo7boobbo6bo3bo 37bo8bobo16bobo$95bobbo11bo11bo5boo4bobo3bobobobobo62boo45bobo28bobo 58b3o5boo19bo$71boobbo23bo7boo10boo7b3o3bo3bo5boboo66bo42boo30boo8boo 29bo20bo7bobo16boo$70bo25boo10bobo9bobo11bobobobbo51bobo14bobbo78bo36b oo22bo6bo$5bo63boo4b3o19bobo8boo10boo7bobo3bo3bo53bo15bo48bo29bobbo35b 5o19boo24bobbo$4bobo63bo4b3o19boo12bo11bo5boo44bo4bo8b4o15boo24boo22bo bo26bo38bo6bo17boo23bo$3boo65b3o27bo6bobbo8bobbo7bo42boo3boo9b4obbo13b o48bobo25boo38bobobboo20bo21boo$4bobo64bo6b3o15bobbo6bo11bo11bobo40boo 3boo12bo16b3o20boobbo22bo26bobo37bo5bo43bo$4boo67bo4b3o14bo9boo10boo 11bobo42bo12b3o5booboo9bo20bo53boo40bo5bobbo39b3o$7bo63boo21boo9bobo 10bo12bo41bo5b3o6booboo4bo14bo17boo4b3o88bobo7bo39bo$3bobbo56bo7boo4bo o15bobo7boo12b3o49bobbo5b3o8boobbo6bo8boo19bo4b3o47bo41bo5boo43bo$bbo 59bobo8bo3boo14boo24bo50bobboo16boo8bo8boo19b3o52bobo38boo5bobo40boo$b oo58boo16bo25bo15bo48bo6boo19b3o11bo19bo6b3o44bobo39bobobboo42boo$bobo 22bo10bo24bobo29bo10bobo11boo50b3o3boo13bobobbo36bo4b3o45bo11bo29bo4bo $oo22boo9boo25boo30bobo8bobo11boo51bo19bo3bo35boo63boo36bobbo35b3o$24b oo9boo12bo15bo28bobo9bo14bo50booboboo13bobobo35boo4boo57boo40bo34b3o$b o10bo13bo10bo10bobo10bobbo30bo78bo3bo14bo3bo36bo3b3o22bo35bo36boo20bo$ bobo7bobo10bo10bo11boo11bo118boobo79bobo32bo6b3o3bo26bo19bobo15bobo$bo bo6boo11b3o8b3o13bo8boo118bobo59b3o17boo33b3o4bo5bobbo24b3o17boo16boo$ bbo8bobo9bo10bo11bo3bo9bobo68b3o3bo103b3o19bo24bo7bo4boo4bobo3bo5bo18b o18bo18bo$11boo9boo9boo8bobbo13boo68bo5bobbo121boo23boo7boo4b3o3bo3bo 5bobobo18bo17bobo15bobo$14bo10bo10bo5bobobb4o12bo10bo53boo4bobo3bo5bo 93boo19b3o22boo8bo10bobobobbooboboo17boo18bobo15bobo$10bobbo7bobbo7bob bo5bobbo14bobbo10bobo10bo10bo10bo19b3o3bo3bo5bobobo7bo4bo78boo46bo8boo bbo6bo3bo25boo16b4o17bo$9bo10bo10bo10bobobb4o7bo13boo11bobo8bobo8bobo 24bobobobbooboboo7bobobobbo79bo18bobbo21bo53bo14bobo$8boo9boo9boo11bob bo10boo14bobo8boo9boo9boo21bobo3bo3bo15bobobo3bo33bo63bobo21b3o11boo 54bobo$9bo9bobo9bo14bo3bo6bobo13boo11bo10bo10bo20boo24bo3bobboo32bobo 62bo23bo69bo$9b3o6boo11b3o16bo5boo18bo7boo9boo9boo10bo11bo23boo6bo32bo o65bo21boo70bo$10bo21bo14boo23bobbo8b3o8b3o8b3o7boo12bobo21bobo5bo8b3o 7bo14bobo12boo49bobo20bo70bobo$12bo6bo14bo13bobo6bo13bo44boo12bobo31bo 6boobbobooboo14boo9boobobbo49bo22bobbo67b4o$10boo7bobo10boo15bo7bobo 10boo12bobbo7bobbo7bobbo8bo12bo21b3o6boo9b3o4bo18bo6bo3boo50boo26bo51b o15bobbo17bo$10boo7bobo10boo23bobo11bobo10bobo8bobo8bobo7bo36b3o6boo7b obbobo3bo14bobbo6bo8b3o70boo51boo17bobo15boo$4bo7bo7bo13bo23bo12boo11b o10bo10bo8b3o46bo5bo4bo4bo13bo11bo3b5o3bo3boo37bobbo23bobo49boo17bo17b oo$bboo70bo10bo10bo10bo7bo40b3o11bo4bo4bo12boo13bobo4bobboboo13boo23bo 27boo70bo18bo$bboo66bobbo11bobo8bobo8bobo4boo40b3o12bobbobo3bo13bobo9b 3o3bo9bo10boo3bo20boo30bo37bo11b3o16bobo14bo$4bo64bo16bo10bo10bo6bo57b 3o4bo13boo10b3o3bobbo17boobobo21bobo24bobbo37bobo10b3o17bo15bobo$bbo 65boo15boo9boo9boo7bobbo35boo14boobbobooboo15bo15bo24bo21boo24bo40boo 31boo15bobo$b3o65bo50bo34boo14b3o7bo11bobbo17bo19b3o26bo21boo23bo17bob o3bo3b3o37bo$bo67b3o12bobbo7bobbo7bobbo7boo38bo34bo19bobbo17bo25bobbo 23bobo19boo18boo3bo4b3o18bobbo13boo$oo68bo12bo10bo11bo10bobo71boo19bo 19b3o23bo27boo20boo21bobo24bo18bo$bbo69bo9boo9boo10bo10boo13b3o3bo54bo bo17bobo16bobbobo20boo30bo20bo16bobbo3boobbo18boo18b3o$bobo66boo10bobo 9bo10b3o9bo12bo5bobbo52boo19bo44bo26bobbo19bo17bo30bobo18bo$bobo66boo 9boo11b3o21bobbo6boo4bobo3boboboboo47bo35b3obobo20b3o23bo23bobo14boo9b oo18boo22bo$bo70bo22bo10bobo13bo5b3o3bo3bo5bobobo42bobbo35bo3b3o22bo 23boo23bobo15bo51boo$3bo78bo14bo8boo11boo13bobobobbo4bo43bo40bo4bo24bo 21bobo23bo16b3o28bo20boo$boo79bobo10boo10bo12bo8bobo3bo3bo49boo40bo27b oo21boo23boo18bo29bobo$boo79bobo10boo10bobo10b3o6boo58bobo41boo24boo 47bo20bo27bobo16boo$3bo79bo13bo9bobo11bo8bo57boo40boo29bo21bo24b3o16bo o29bo17bobo$108bo14bo6bobo49bo28boo18bo51bobo23bo17boo47boo$121boo7bob o45booboo6bo17boobobbo17b3o49bobo25bo17bo46bo$121boo8bo45bo3bo7bobo14b o3boo20bo51bo24boo66bo$123bo53bo3bo7bobo13bo8b3o5bo11bo74boo66bobo$ 176bo3bo9bo15bo3b5o3boboo10boo144bo$174b3obobo27bobo4bobbo3boo8boo73bo o68boo$171bobboo3boo25b3o3bo21bo72bobo55bo$104bo65bobo3boo28b3o3bobbo 68bo21boobo19bo34bobo9bobbo$103bobo63bobbo3bo4bo31bo69bobo20bo21bobo5b oo26bobo8bo$103bobo64bobo3boobbo33bo68bobo20boo19boo35bo9boo$103bo13bo 53bobboobobo32bobbo44bo22bo22booboo17bobo3boobbo24boo10bo$116bobo55boo 36bo45boo68boo3bo29bobo9b3o$102boo12bobo12b3o3bo38boo34bobo43boo22boo 24boo21bobo4b3o35bo$103bobo10bo13bo5bobbo37bo35bo46bo22bobo22bobo16bob bo3bo3b3o21b3o13bo$103boo23boo4bobo3bo117bo24boo22boo17bo35b3o11boo$ 104bo10boo11b3o3bo3bo5boboo110bobo23bo40boo14b3o32boo$105bobbo7bobo15b obobobboobobobo86bo22bo26bobbo19bo17bo14b3o14boboo16bo$109bo6boo11bobo 3bo3bo6bo87bobo22bobo27bo18bobo15b3o28bo3bo$106boo9bo11boo102boo24bobo 24boo20bobo16bo12boo14boo$106bobo9bobbo8bo104bo50bobo20bo19bo10boo14bo 4boo$105boo23bobo100boo24b3o23boo40boo13bo12b5obo$106bo12boo9bobo42bo 57b3o23boobo23bo40boo29bobobo$107bobbo9bo10bo41boo86boobo22bobbo38bo 24bo$111bo7bobo51boo58bobbo54bo62bobboo13bo4bo$108boo9bo55bo57bobo52bo o63bob4o11boo3boo$109bo8bo54bo59bo26boobo25bobo61boo15boo3boo$109b3o6b obo52bobo58bo25bobo26boo81bo$110bo7bobo52bo60bobo22bo32bo61bo15bo5b3o$ 112bo6b4o51bobo58bo21boo29bobbo62bobo10bobbo5b3o$110boo9bobo50bobo57bo o21bobo27bo11bo54bobo10bobboo$110boo9bobo51b4o107boo9boo56bo11bo6boo$ 112bo7bo14bo4bo36bobo53bobbo19b3o28bo9boo69b3o3boo$120boo12bobobobbo 35bobo52bo23bobo28b3o9bo39bo29bo$120bobo11bobobo3bo34bo53boo24bobo28bo 8bo6b3o3bo27bobo28booboboo3b3o$121bo12bo3bobboo35bo53bobo21boo32bo5b3o 4bo5bobbo24boo32bo3bo$133boo6bo36bobo51boo54boo6bo4boo4bobo3boboboboo 17bobo35boo4bo$133bobo5bo37bo55bo21bo30boo5boo4b3o3bo3bo5bobobo16boo 36boboob3o$143bo34boo51bobbo22bobo30bo5bo10bobobobbo4bo21bo40boo$132b 3o6boo87bo26bobo37boobbo6bo3bo24bobbo$132bobo6boo34bobbo48boo27bo77bo$ 133bobo7bo32bo52bobo67boo34boo$132boo41boo51boo106bo$175bobo113bo44b3o $133bo40boo53bo59boo46bo$133bobo93bobo57boo48bo$133bobo39bo53bobo59bo 45boo36bo$134bo40bobo52bo58bo47boo35bobo$175bobo110b3o82bobbo$176bo 111bo46boo37bo$257bo4bo24boo46bobo37boo$256bobobobbo26bo43boobo$256bob obo3bo21bobbo44bo42bo$256bo3bobboo20bo13bo34boo38bo$255boo6bo20boo11bo o35booboo34boboboo$140bo114bobo5bo21bobo9boo73boo6bo$139bobo123bo19boo 12bo36boo35bobbobbo$138boo114b3o6boo23bo8bo6b3o3bo25bobo34boo$139bobo 35bo76b3o6boo19bobbo8b3o4bo5bobbo22boo37bo3bo$139boo35bobo86bo17bo12bo 4boo4bobo3bo61bobbo$142bo32boo74b3o28boo11boo4b3o3bo3bo5boboo15bo40bo$ 138bobbo34bo74bobo29bobo10bo10bobobobboobobobo14bobo38boo$137bo37bobo 105boo12boobbo6bo3bo6bo16bobo$136boo37bo74b3o33bo50bo41b3o$137bo36bo 75boo30bobbo13boo78bo$137b3o34bobo75bo28bo97bobo$138bo35bobo73boo28boo 95b4o$140bo34b4o72bobo26bobo93bobo$138boo37bobo72bo26boo95bobo$138boo 37bobo195bo$177bo102bo94bobo$136boo40bo101bobo92bo$136bobo39bobo99bobo 94bo$136boo41bo101bo33bo59boo$136bo41boo133boo60boo$137bo175boo62bo$ 137bobo37bobbo134bo$138bo37bo136bo$137boo36boo78bo4bo19bo31b3o$138bobo 34bobo76bobobobbo17bobb3o5bobo19bo72bo$139bo34boo78bobobo3bo15boo4bobo bobbo19boo71bobo$254bo3bobboo19bobo3bobboo21bo68boo$175bo77boo6bo16boo boo27bobbo71bo$175bobo75bobo5bo16b3o28bo73boo$175bobo85bo14b4obo24boo 73b3o$176bo75b3o6boo15boobobo25bobo$252b3o6boo46boo72bobbo$263bo14boob bo29bo70bobo$249b3o27bo28bobbo71bo$249b3o27bo3bobo21bo76bo$283boobo19b oo75bo$250bobo27boo25bobo70bobbo$250boo28boo25boo69boobo$251bo30bo27bo 67b3obo$251bobo52bobbo67bo$251bobo51bo71b6o$252bo51boo69bo$305bo68bo4b oo$280bo24b3o65boobboo$279bobb3o21bo66bobo3bo$278boo4bobobobboo15bo63b oo$282bobo3bobbo14boo$278booboo7bobo13boo65bo$278b3o27bo64bobo$278b4ob o89bobo$278boobobo90bo$254bo4bo$253bobobobbo17boobbo$253bobobo3bo17bo$ 253bo3bobboo17bo3bobo$252boo6bo22boobo$252bobo5bo19boo$262bo17boo27bo$ 251b3o6boo20bo24boo$251b3o6boo45boo$262bo46bo$254b3o50bo$254b3o50bobo$ 280bo9bobo14bo$255bobo21bobb3o3bobbo16bobo$255boo21boo4bobobobboo15bob o$256bo25bobo$256bobo19booboo25b3o$256bobo19b3o27boobo$257bo20b4obo26b oobo$278boobobo$$278boobbo26boobo$279bo29bobo$279bo3bobo22bo$283boobo 19boo$280boo24bobo$280boo$282bo22b3o$305b3o$$308b3o$308b3o$280bo$279bo bb3o3bobboo14boo$278boo4bobobobbo15boo$282bobo5bobo16bo$278booboo$278b 3o$278b4obo$278boobobo$$278boobbo$279bo$279bo3bobo$283boobo$280boo30bo $280boo28boo$282bo27boo$312bo$310bo$309b3o$283bo25bo$281boo25boo$281bo o26bo$283bo26bobbo$281bo32bo$281bobo27boo$281bo29bobo$282bobo25boo$ 282bobo24bo3bo$312bo$282b3o23bobo$282boobo21b3o$284boobo19bo$306boo$ 309bo$284boo19bobbo$283boo19bo$284bo18boo$281bobboo17bobo$281bobbo17bo o$281bo$282b3o18bo$283bo19bobo$283boobbo15bobo$286bobo15bo$284bo3bo$ 284bo$284bobo$285bo4$286bo$285bobo$284boo$286bo$284boo$284b3o$$284bobb o$284bobo$284bo$285bo$285bobo$286b4o$287bobbo$288bobo$288bo$289bo$289b obo$290bo$289boo$$288bobbo$287bo$286boo$286bobo$285boo$$286bo$286bobo$ 286bobo$287bo5$292bo$283bo7bobo$282bobo5bobbo$281boo8bo$282bo9boo$281b obo$281bo5bo6boboo$280bo5bobb3obbo$280bobobboo4bobo3bo$280bo8bobo4bo$ 281b5ob3o$283boo$284bo! golly-2.5-src/Patterns/Life/Spaceships/c4-diagonal.rle0000644000175100001440000001424512156145314017570 00000000000000#C Smallest known diagonal spaceships. All are p4 and c/4. #C Minimum populations: 5, 25, 27, 32, 36, 39, 43, 48, 49, 49, #C 50, 50, 51, 51, 53, 55, 55, 56, 57, 57, 58, 59, 60, 60, 60, 60, #C 61, 62, 63, 64, 66, 66, 67, 67, 68, 69, 69, 69. #C Spaceships found by: Jason Summers, Hartmut Holzwart, Richard Guy, #C Tim Coe, Dean Hickerson, Stephen Silver (and 7-bit tagalong #C by Robert Wainwright). #C diag.rle from Stephen Silver's 12 Jan 2004 'ships' collection. x = 476, y = 400, rule = B3/S23 3o$o$bo8bo$9boo$9bobo$$12boo$12boo$$3bo6boo$bboo5bobbo$bbobo3boobo7b3o $6bo12bo$5bo14bo$5bobbo13boo$21boo$$20bo$12b3o5bobbo$12bo7bo$13bobb5ob o$15bo$16boo$26boo$25boo$27bo$29bo4b3o$29b3o4boo$30b3obobo$37bo$30bobo $29boobo$30bo$28boobo7b3o$31bo7bo9boo$29boo9bo6b3obo$42boobboo$43bo$ 47bo$43boo3bo$42boboboo$42bobobboboo7boo$41bo4boo10bobo$41boo15bo$41bo o12boobo$55bo4bo$55boboo6b3o$60b3o4boo$61b3obobo$68bo$61bobo$60boobo$ 61bo$59boobo8b3o$62bo8bo9boo$60boo10bo6b3obo$74boobboo$75bo$79bo5bo$ 75boo3bo3boo$74boboboo4bobo8boo$74bobobboboobo10bobo$73bo4boo5bo9bo$ 73boo23bo$73boo22bobo$97bobo$97bo$84b3o10bo$84bo9b4o$85bo6bo$87boobboo 4bo$88bo$92bo$88boo3bo$87boboboo$87bobobboboo$86bo4boo16bo10boo$86boo 20b5o6boo$86boo20bobboo8bo7boo$110boobo5boo6b3obo7boo$119boo3boboo10bo o$113bobo6boo15bobbo$118b3obo4bo11boobo$98b3o14b3o3bo4bo12boo3bo$98bo 17bo7bo$99bo16bo6bo18boboboo$101boo37bobo3bo$102bo16bo11bo8b3obbo$93b 3o34b5o6boo$93bo10boo24bobboobboo$94bo5booboobbo30boo$96b3oboo30boobb 4o$97b3o3boo3bo$99bo3b3obo26bobo$99bo3boobboo29bo$100b5o31boo$136bo$ 106bo$104boo$$114b3o$114bo9boo$115bo6b3obo$117boobboo$118bo$122bo5bo$ 118boo3bo3boo$117boboboo4bobo$117bobobboboobo18b3o$116bo4boo5bo17bo$ 116boo29bo$116boo17bo13boo$121bobo10boo14bo6boo$120b4o10bobo15boo3bobb o$120bo15bo15b5o$137bo15boo5b3o$134boboo15bo3bo4boboo$135bo17bo9bo$ 151boobbo5boo$136boo13bo10bo10b3o28boo$136boo24bo10bo30bobo$136bo15bob o21bo27bo$137boo15bobbo16bobbo29bo$154boob3o15bobo28bobo$137b3o16bo15b oobobobo26bobo$137bobbo14bo11b3obbooboo29bo$138bo16bo11bobboo3b4obo12b 3o10bo$140boo26bo3bo3b3o14bo9b4o$142bo27bo6boo3bo11bo6bo$143boo27b3o3b oo16boobboo4bo$148bo24bobo3boboo14bo$144bob4o24boo25bo$146bobbobbo24bo 19boo3bo$151bobo23boo17boboboo$196bobobboboo$152booboo38bo4boo$152boo 3bo37boo$154boo39boo$157boo41bobo$199b4o$199bo$$181boo$181bobo$181bo 54boo$184bo50boobo$183bobo14bo10boo23bo$183bobo13b5o6boo24bobbo$183bo 15bobboo8bo7boo14bo3bo$170b3o10bo17boobo5boo6b3obo13bobbo$170bo9b4o26b oo3boboo$171bo6bo25bobo6boo$173boobboo4bo25b3obo4bo12boobobb3o$174bo 31b3o3bo4bo13boboobbobb3o$178bo5bo22bo7bo15boboo6boo$174boo3bo3boo22bo 6bo17bo$173boboboo4bobo46boo$173bobobboboobo26bo12boobbo4boo$172bo4boo 5bo37boo4bobboo$172boo34b3o13boobobb3o$172boo33boobbo14boobbo$209bo23b o$230bobbo$231bo$219b3o10bo$219bo$213b3o6bo$213bo6bobbo$214bo6boboo$ 216boo3boboo$217bo3bobo$221boboo12boo$211b3o3boo6bo10boo$211bobboobbob 3obo12bobo$212bobbobboobo15boobo$214boobooboobo14boboo$220bobbo8boo4bo bbo$219boobbo7boo3boo4b3o$233bob3o7bo$239bo$234bo3bo5bobo$235bobbobboo bo$239bobooboo62boo$237bobboobbobbo59boobo$237bo9bo60bo$239b3o66bo3bo$ 243b3obo60bo3bo$247bo60bo3boo$312b3o$255boo52boboo$255bobo47boo4boo$ 255bo48boo$258bo47bobboo$258bobo36boobbo6bobbo$258bobbo3b3o28boo4bo4bo bbo$260boobbobboo29boobo3bobobobo$264bo5boo28bobobo6boo$264boo4b3o28bo o5bo$261b3o9bo9b3o15boobboo5bo$260bobbo6bobbo9bo18bo8bo$260bo8bo14bo$ 260boo7bo13b3o$261bo6bobbo11b3oboo$266boo4bo$262boobo6boo$262boo4bo16b oo$263bo5boo14boo6boo$264boo4bo17boo3bobbo$288b5o$289boo5b3o$289bo3bo 4boboo$289bo9bo$287boobbo5boo$287bo10bo$298bo$273boo13bobo$273bobo14bo bbo$273bo16boob3o$276bo15bo$275bobo13bo$275bobo13bo$275bo$262b3o10bo$ 262bo9b4o$263bo6bo$265boobboo4bo$266bo$270bo36boo$266boo3bo35bobo$265b oboboo36bo$264bobbobboboo36bo$265bo3boo38bobo$256boo7bo43bobo$256bobo 3b4o20bo10boo10bo$256bo3bo24b5o6boo11bo$259boo4bo19bobboo8bo7b4o$259bo 3bo23boobo5boo6bo$296boo3boboo4bo$290bobo6boo$295b3obo4bo$247bo44b3o3b o4bo$246boo45bo7bo$246bobo44bo6bo18boo$319bobo$248boboo44bo22bo$247boo 73bo$247boo5bo66bobo$249boboboo66bobo$251bobobo65bo$249bo58b3o10bo$ 249bo58bo9b4o$236boo10bo60bo6bo$235boo3boo6b3obo58boobboo4bo$237bob3o 4boo3b3o58bo$242boboobo68bo5bo$239bo7bo64boo3bo3boo$239bobboo4bo62bobo boo4bobo$247boo62bobobboboobo$242boo4bo61bo4boo5bo$241boo67boo$243bo 66boo$315bobo$314b4o$314bo3$330b3o$330bobb3o$331bobo$336bo$334bo$336bo bo$339bo$336bobbo$336bobbo$336bobbo$340boo$337bobboo$341bobo$338boo$ 338bo4bobo$339bo5bo$346bo$339boo6bo$339bobo5bobo$$349boo$349bo$348boo$ 349boo$$351bo$350bobboo$351boboo$355bo$353bobo$353bo$354bobo$356bo10bo o$367bobo$367bo$370bo$369bobo$369bo3boo$369bo3b3o$360b3o6bo$360bo12bob o16boo$361bobb4obbooboo16boo$363bo5bo5bo3bo12bobo$364bo4bo5b3obo12boob o$380bo12boboo$365booboo5boo10boo4bobbo$365boobbo7bo8boo3boo5boo$366bo boboobo14bob3o7boo$371bobo20bo3boboo$371bobbo14bo3bo3bobboob3o$390bobb o6bo$370boo20boo11bo$372bo20bo7boobo$393boo6bo$393boobbobbo19boo$396bo o22bobo$397bobboo18bo$395boo26bo$396bo25bobo$373boobo19bo25bobo$373bo 3bo44bo$373bo4bo30b3o10bo$375boo32bo9b4o$369b3o5bobo30bo6bo$369bo10bo 31boobboo4bo$372bo5bo34bo$369bobbo6boboo34bo5bo$370bobbo6b4o29boo3bo3b oo$371bo3bo8bo27boboboo4bobo$373bobbo7boo25bobbobboboobo$374bobbo4boo 3bo24bo3boo5bo$376boo4boobobo15boo7bo$376boobboobboobo15bobo3b4o$377bo bboo21bo3bo55bo$378boobbo23boo4bo48boobo$379boboo23bo3bo48boo3bo$458bo 3boo$380b3o74bo4boobo$392boo62bobboob3obo$391boobo61bo$392bo65bobo3boo $392bo3bo37boo19boo3bobo$392bo3bo37bobo18bo3bo3boo$392bo3boo36bo21bobb oobbobbo$396b3o38bo21boo3bo8bo$393boboo39bobo26bobo3bobobo$389boo4boo 39bobo28boob3obbo$388boo23bo10boo10bo30boo4boo$390bobboo17b5o6boo11bo 31boboo$381boobbo6bobbo16bobboo8bo7b4o$380boo4bo4bobbo5boo12boobo5boo 6bo34bobo$382boobo3bobobobo3boo22boo3boboo4bo29bo$384bobobo6boo3bo16bo bo6boo38b3o$385boo5bo6boo21b3obo4bo35bobo$385boobboo5bo22b3o3bo4bo$ 386bo8bo24bo7bo19b3o$420bo6bo20bo9boo$449bo6b3obo$423bo27boobboo$452bo $421b3o32bo$420boobbo27boo3bo$422bo28boboboo$450bobbobboboo$451bo3boo$ 438b3o10bo$438bo9b4o$439bo6bo$441boobboo4bo$442bo$446bo$442boo3bo$441b oboboo$441bobobboboo$440bo4boo$425boobo11boo$425bo3bo10boo$425bo4bo$ 427boo$421boo6bobo$421bobo8bo$421bo8bo$422boo7bobboo$422bobbo3b4oboobo o$422bo6bo3boobboo$424bobo$425b3o4b5o$432bo4bo$427boo5bobbo$427boobobo $427booboboo$428bo4bo$428bo$429bobo! golly-2.5-src/Patterns/Life/Spaceships/c4-orthogonal.rle0000644000175100001440000006275312156145314020175 00000000000000#C Smallest known c/4 orthogonal spaceships. All are p4. #C Minimum populations: #C 46, 47, 47, 51, 51, 51, 53, 53, 61, 66, 67, 67, 67, #C 69, 69, 69, 69, 69, 69, 69, 70, 70, 71, 71, 71, 71, 71, 71, #C 72, 72, 72, 72, 72, 73, 73, 74, 75, 77, 78, 80, 82, 82, #C 83, 83, 83, 83, 83, 83, 86, 86, 87, 87, 87, #C 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 89, 89, 89, 89, #C 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, #C 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, #C 92, 92, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96, 96, 96, #C 97, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 98, 99, 99, 99, 99. #C Spaceships found by: Jason Summers, Stephen Silver, Tim Coe, #C Hartmut Holzwart, and one of the tagalongs by Dean Hickerson. #C c4orthog.rle from Stephen Silver's 12 Jan 2004 'ships' collection. x = 1123, y = 527, rule = B3/S23 779bo$770boo5boo$769bobbo6bo$767bobboo$765boo3boo7b3oboo$767bobbo5boo 3bo$770bobobbo6bo$774boobo$774bo3b3o$791bobo$774bo3b3o9b3obo$774boobo 11boo$770bobobbo6bo3bo3bo$767bobbo5boo3bo4bobbo$765boo3boo7b3oboobo3bo $767bobboo15b3o$769bobbo6bo9boo$770boo5boo$779bo8$791bobo$779bo10b3obo $770boo5boo10boo$769bobbo6bo6bo3bo$767bobboo14bobbo$765boo3boo7b3oboob o3bo$767bobbo5boo3bo5b3o$770bobobbo6bo6boo$774boobo$774bo3b3o$$774bo3b 3o$774boobo$770bobobbo6bo$767bobbo5boo3bo$765boo3boo7b3oboo$767bobboo$ 769bobbo6bo$770boo5boo$779bo8$784bobo6bo$784bo7bobo$784bo7bo$786bo3boo $772bobo4boo9boobobo$772bo7bobbobboo3bobbo$772bobb3o5bo4boo$733bo40bo 5bobbo$723bobboo4b4obo29boo10boo$722bobbobbobboobb3obboo24b3o3boo$723b o5bo3bo5bo27boobo4bo$724b3obbo4boo34bo4bo$724bo3boo$725bobobobo38b6o$ 726boobbo43boobbobo$726bo5bo35bobboo5booboo$726b3obbo34boo3bobooboo$ 768bo3boo3bo5bobo$726b3obbo41bo6booboboobo$726bo5bo44boo9bo$726boobbo$ 725bobobobo$724bo3boo$724b3obbo4boo$723bo5bo3bo5bo$722bobbobbobboobb3o bboo$723bobboo4b4obo$733bo6$772bobo4boo$772bo7bobbo$652bo119bobb3o5bo 4boo$650boo3bo118bo5bobbobboo3bobbo$652bobboo110boo10boo9boobobo$637bo bo4boo9boo109b3o3boo12bo3boo$637bo7bobbo6bo111boobo4bo8bo7bo$637bobb3o 5bo5boo114bo4bo8bo7bobo$639bo5bobbobboobbo128bobo6bo$632boo10boo5b3o 79bo36b6o$631b3o3boo84bobboo4b4obo36boobbobo$632boobo4bo81bobbobbobboo bb3obboo26bobboo5booboo$635bo4bo82bo5bo3bo5bo26boo3bobooboo$724b3obbo 4boo32bo3boo3bo5bobo$635b6o83bo3boo43bo6booboboobo$639boobbobo79bobobo bo45boo9bo$633bobboo5booboo78boobbo$631boo3bobooboo83bo5bo$633bo3boo3b o5bobo75b3obbo$638bo6booboboobo$642boo9bo72b3obbo$726bo5bo$726boobbo$ 725bobobobo$724bo3boo$724b3obbo4boo$723bo5bo3bo$722bobbobbobboobb3o46b obo6bo$652bo70bobboo4b4obobboo42bo7bobo$650boo3bo77bo5bo44bo7bo$652bob boo129bo3boo$637bobo4boo9boo115bobo4boo9boobobo$637bo7bobbo6bo116bo7bo bbobboo3bobbo$637bobb3o5bo5boo116bobb3o5bo4boo$264boo373bo5bobbobboobb o118bo5bobbo$264boo366boo10boo5b3o113boo10boo$264bo366b3o3boo127b3o3bo o$261bobbo367boobo4bo126boobo4bo$258bo4bo371bo4bo129bo4bo$254boobboob 3obo$253bobbo6boo370b6o129b6o$246b4obo387boobbobo128boobbobo$246bobb4o bo378bobboo5booboo120bobboo5booboo$631boo3bobooboo10bo112boo3bobooboo 10bo$246b3o384bo3boo3bo5boboobo79bo5bo28bo3boo3bo5boboobo$638bo6boobob o72bobboo4b4obobboo31bo6boobobo$246bobb4obo387boo78bobbobbobboobb3o39b oo$246b4obo15bo455bo5bo3bo$253bobbo7boobo456b3obbo4boo$254boobbooboobo 459bo3boo$258bo466bobobobo$261boboo461boobbo$262boo462bo5bo$263bo3bo 458b3obbo$264bobbo$265bobo458b3obbo$726bo5bo$637bobo4boo5b3o72boobbo$ 637bo7bobbobboobbo69bobobobo$637bobb3o5bo5boo68bo3boo$639bo5bobbo6bo 68b3obbo4boo36bobo4boo$632boo10boo9boo66bo5bo3bo38bo7bobbo269boo$631b 3o3boo13bobboo65bobbobbobboobb3o34bobb3o5bo4boo258bo3bo4boo$632boobo4b o9boo3bo67bobboo4b4obobboo32bo5bobbobboo3bobbo231boo18boo4boo3bo$635bo 4bo11bo80bo5bo27boo10boo9boobobo229b3obbobboboo11bo3boo4bo$766b3o3boo 12bo3boo234bo3bobb4o9bo3boobboboo$635b6o126boobo4bo8bo7bo234bobbo5bobo 8boo3bo$254bo384boobbobo124bo4bo8bo7bobo231boo3booboobbobo3boobbo3b3ob obo$193boo6bo50boo3bo375bobboo5booboo136bobo6bo231boo3bo3boo4boboboobo 10boobo$184bo3b3obb3o58bobboo372boo3bobooboo127b6o255b4o8bobobo13bo$ 182boobo4bobboobobo5bo52boo374bo3boo3bo5bobo123boobbobo241boo3bo14bo4b 3o23b3o$179boboboo3boo5b3o7bo51bo279bo100bo6booboboobo114bobboo5booboo 239bo48boo3bo$179bo7bo3b3obo3b5obo50boo264bo9bo8bo100boo9bo112boo3bobo oboo10bo236bo43bo$179bo4booboo4bo4boo4b3obobo46bo263boboo7bo9bo225bo3b oo3bo5boboobo234bobo41boo3bo3bo$181boobobo11bo9bobo45bo260b5o3boo4bobb 7obo230bo6boobobo237boo3boo39bobbo3bo$185boo23bo43b3o259b3obo3b3o3bo3b obo4b3obobo229boo246bobo43boo$186b4o67bo33bo225booboo4bo5bo12bobo524bo 3bo$188bo64bo3boo23boo5boo231bo9b4o11bo524bo3bo$257boo22bobbo6bo228bob ob4obobboobo536b3o$254boobo21bobboo233boo5boobbo6bo$254booboo18boo3boo 7b3oboo221bobobboobo8bobboo141bo3bo386b3o$255bo3bo19bobbo5boo3bo225bo 5bo10boobo140boboobo138bo247bo3bo$252boobobo24bobobbo6bo385bobo13bobo 104boo15boo3boboo243bo3bo$253bo3bo28boobo347bobo4boo5b3o27bo10b3obobo 104b3o13bo8bobbo239boo$193boo6bo51bo32bo3b3o344bo7bobbobboobbo23boo7b 4obo4bo30b3o68bobboo10boobbobb3o6bo237bobbo3bo$184bo3b3obb3o58bobo380b obb3o5bo5boo23boo7bo4bo23boo6bo5boo19bo43b5o4bo8boobbo3bobbobbobbo235b oo3bo3bo$182boobo4bobboobobo5bo52bo28bo3b3o346bo5bobbo6bo27boboo5bo23b obbo3boobbobo3boo15boo3bo39b3obo6bob3o6bo9boo240bo$179boboboo3boo5b3o 7bo50b3o27boobo342boo10boo9boo25boo5boo22booboo8boo8boo14bobboo39boobo o8boo8boo250boo3bo$179bo7bo3b3obo3b5obo4bo71bobobbo6bo336b3o3boo13bobb oo55b3obo6bob3o6bo9boo9boo42bobbo3boobbobo3boo255b3o$179bo4booboo4bo4b oo4b3obobo45bo22bobbo5boo3bo338boobo4bo9boo3bo26boobo27b5o4bo8boobbo3b obbobbobbo6bo44boo6bo5boo222bo$181boobobo11bo9bobo42bobbo4boo14boo3boo 7b3oboo338bo4bo11bo29boobo31bobboo10boobbobb3o6bo5boo56b3o4boo208bobbo o3bobo9bo$185boo66boobboo5bo14bobboo400bo35b3o13bo8bobbobboobbo63b3obo obo202boobbo3bo3booboboobo24bo$186b4o63bo6bo4bo15bobbo6bo343b6o40bobbo o34boo15boo3boboo5b3o64boo6bo202bo3b3o8bobo27bobbo$188bo71b4obo16boo5b oo246boo100boobbobo36b3o56bo80bo210boo39bobbo$264b3obobo20bo230bo9bo7b o92bobboo5booboo169bo6boo208bo7boo31bo$268bobo250boboo7bo8bo89boo3bobo oboo10bo27bo103bobboo25boo7bo210b7o$270bo246b5o3boo4bobb6obo91bo3boo3b o5boboobo27boo102bobb3o26bo7bo283bo4bo$516b3obo3b3o3bo3bobo3b3obobo91b o6boobobo29bobboo95boo3bo4bo244bobboo4boo28b3o31bo3b5o$517booboo4bo5bo 11bobo95boo38bobo89bo5bob3o250bo4boobboo26boo3bo29bo4b5o$522bo9b4o10bo 131boo3bo88boo3bo3b4o249boo4boo5b3o20bo33bo3bo8bo4bo$520bobob4obobboob o143b3o92bobboo3bo252bo4boobboo22boo3bo3bo19b4oboboboo3bo5bobb3o$517bo o5boobbo6bo144boo95boo256bobboo4boo24bobbo3bo19bobb4o5b3o5bobboo$190bo 3bo323bobobboobo8bobboo143bo93bo294boo30b6o$189boboobo324bo5bo10boobo 141bobobbobo87boo257b7o31bo3bo19b3o$189bobo490bo5bo3bo84bo256bo7boo29b o3bo26b6o$190bo63bo25bo404boob3obo83bo224bobo4boo5b3o15boo38b3o21bobb 4o5b3o5bobboo$188boo14bo47boo3bo21bobo403bo6bo36b3o42b3o224bo7bobbobbo obbo9bo3b3o8bobo50b4oboboboo3bo5bobb3o$188boo7boboboobo49bobboo20bobo 401bo6b3o24boo6bo5boo44bo223bobb3o5bo5boo9boobbo3bo3booboboobo23b3o28b o3bo8bo4bo$192b3o4bobo55boo20bo9boo30bo361boo6bo24bobbo3boobbobo3boo 38bo3boo224bo5bobbo6bo9bobboo3bobo9bo23bo3bo29bo4b5o$191boo64bo22bo4bo obboo30boo6bo353bo29booboo8boo8boo39boo213boo3bo10boo9boo17bo34bo3bo 30bo3b5o$197boo57boo21bo4b3o5b3o26bo6b3o381b3obo6bob3o6bo9boo5b3o20boo bo213b3ob3obobobo12bobboo51boo35bo4bo$60bo3bo126b6o60bo21b4ob3obboo32b o6bo382b5o4bo8boobbo3bobbobbobbobboobbo18booboo213boo5bo4bo9boo3bo50bo bbo3bo$59boboobo126bo64bo22bo3bo5boo32boob3obo236bo66bobboo9booboo64bo bboo10boobbobb3o6bo5boo19bo3bo217boo4bo12bo51boo3bo3bo$59bobo129b6o57b 3o23b3o34bo8bo3bo234boobbo64boobbo8bo3boo67b3o13bo8bobbo6bo16boobobo 138boo79b3o70bo$60bo136boo58bo57boo3bo3bobo237boo68bo3b3o4boo4bo68boo 15boo3boboo9boo16bo3bo130bo6b3o79b3o72boo3bo$58boo131boo60bo3boo21b3o 34bobboo316boobobboo95bo10bobboo16bo134boobboobbo80boo4bo70b3o$58boo 132b3o4bobo55boo20bo3bo5boo29boo203bo3bo28bo3b7o70bo9bo3boo95boo3bo18b obo131bobbo5bo74boo5bo4bo$62boboo99boo21boo7boboboobo49boobo21b4ob3obb oo29bo203boboobo28boo10boo68boo3bobo4boobo96bo24bo133bo4boo73b3ob3obob obo$61boo93bo3b3obb3o20boo14bo49booboo20bo4b3o5b3o24boo203bobo31bobboo 3b3oboo69bo3bobo3bobo122b3o137boo74boo3bo10boo$154boobo4bobboobobo4bo 14bo64bo3bo20bo4boobboo29bo161bo42bo35boob3o76bo3bo5bo257b3o9b3o77bo5b obbo25bo$61boobo86boboboo3boo5b3o6bo12bobo60boobobo21bo9boo28bo161bobo 3bo13boo20boo37boo6bo72bo3bo5bo122bo43bo7bo81bo3bobb3oboobo76bobb3o5bo 16bobboo3bobo$61boobo86bo7bo3b3obo3b4obo12boboobo58bo3bo21bobo35b3o 158bobo6boo7bo3bo4boo16boo11boo25b5oboobo68bo3bobo3bobo27bo3bo87bobbo 4boo22bo12boo7bo82boo7boo80bo7bobbo16boobbo3bo3boobobo62bo4bo$63bo87bo 4booboo4bo4boo3b3obobo8bo3bo58bo25bobo38bo154bobbo4bobooboobobboo4boo 3bo21bobb3obo35bobo67boo3bobo4boobo24boboobo12bo74boobboo5bo19bobo13bo 6boo80boo3boob3obo79bobo4boo19bo3b3o8boboobo58bo3b5o$60bobboo13bo74boo bobo11bo8bobo72bobo23bo35bo3boo151boo3boo4boo5bo4bo3boo4bo19b3obboobbo bbo24b5oboobo42bo23bo9bo3boo25bobo13bobo74bo6bo4bo18bobo18bo82bo5boo4b o112boo14bo57bo4b5o$61b3o12boo17bobo59boo22bo75bo62boo153bobboo4boo8bo 3boobboboo23bobobbo4bo22boo6bo43bobo21boobobboo35bo10b3obobo81b4obo18b o9boo5boo6bo79boo3boob3obo112bo7boo60bo3bo8bo4bo$78bo10boobboobbo60b4o 94b3o58boobo156bobbo14boo3bo25boob4obb4o22boob3o38boo6boo19bo3b3o4boo 4bo27boo7b4obo90b3obobo14bo4boobboo6b3oboobo80boo7boo114b7o55b4obobobo o3bo5bobb3o$60bo19b5o3b3o6bo62bo62bobo4boo85booboo156boo6bobo3boobbo3b 3obobo19bo31bobboo3b3oboo31bo3bo7bo18boobbo8bo3boo26boo7bo4bo94bobo13b o4b3o5b3obboo86bo3bobb3oboobo148boo5bobo14bobb4o5b3o5bobboo$60boo19bo 4bo4bobo129bo7bobbo21bo61bo3bo165boboboobo10boobo16boob4obb4o19boo10bo o31bo3boo6bo18bobboo9booboo30boboo5bo97bo13b4ob3obboo95b3o9b3o109bobbo o4boo17bo3bo4b3obboboobo21b6o$59bobboo17bo4bob3obbo129bobb3o5bo18bobbo 4boo52boobobo170bobobo13bo19bobobbo4bo18bo3b7o30booboobobbobo71boo5boo 113bo3bo5boo100boo117bo4boobboo16boboobo5b3obboo4boo11b3o$17boo42bobo 17bo4bo6boo130bo5bobbo18boobboo5bo51bo3bo169bo4b3o28b3obboobbobbo59b4o bbo5boobboo189b3o103bo4boo116boo4boo5b3o12bobo12boboobo21b6o12bo$16b3o 20bo17boo3bo17boobo3b3o3b3o94bo3bo23boo10boo21bo6bo4bo50bo61bobo67bo 13bo64bobb3obo29boo32bobbo9bobo68boobo222bobbo5bo51bo5boo58bo4boobboo 17bo16bobo14bobb4o5b3o5bobb3o$17bo20bo19b3o21bo4b3o99boboobo22b3o3boo 35b4obo4bo46bobo17bo39bobbo65boo13bobo59boo11boo27boobbo28bobo7bobbobo bo66boobo119b3o100boobboobbo50boobboobboo58bobboo4boo15boo9boo23b4obob oboo3bo5bobboo$18booboo15boo19boo23boobboo99bobo26boobo4bo37b3obobo49b o16boobboo33bo3bo45bobo4boo13bo12bobo59boo42bo31bobbobbobbobboobbo68bo 37boo80bo3bo5boo92bo6b3o51boboo5b3o80boo9boo30bo3bo8bo$23bo5bo6bo25bo 22boo78boo23bo30bo4bo41bobo48b3o15bobbo34boo49bo7bobbo12bo10bo63bo72bo bo7bobbobobo65bobboo35bobbo79b4ob3obboo100boo53boobboo58b7o23boboo3bo 34bo4b5o$18boo7bobob3o6bo19bobo44bobo46bo3b3obb3o20boo14bo135bo33boboo 17boo29bobb3o5bo11bo74bobo71bobbo9bobo68b3o33bobbobbo79bo4b3o5b3o149bo 5boo57bo7boo20boo4bo37bo3b5o$6b3o10bo6bobo4b3oboobo20bo43boo3boo42boob o4bobboobobo4bo12boo7boboboobo16b6o92bo51bo23b3o11bo18bo5bobbo11bobo9b obo60boboobo68b4obbo5boobboo102boobo83bo4boobboo139boo76boo35bo38bo4bo $4boo3bo10bobbo9boo70bobo43boboboo3boo5b3o6bo15b3o4bobo23boobbobo84bob bo20b3o24boobbooboobo16boboboo6boobo7boo3bo10boo14boboboob3o66bo3bo69b ooboobobbobo70bo36bobboo7bo3boo68bo9boo138bo74bo3b3o8bobo23bo$bbo18bob oboboo78bo43bo7bo3b3obo3b4obo4bo9boo26bobboo5booboo54b3o25boobboo19bo 24bobbo7boobo9booboobo7bobo9b3ob3obobobo24boo3bobobo140bo3boo6bo65boo 40bobb5obbo17bo52bobo142boobobbo3boboo3b5obo56boobbo3bo3booboboobo14bo o4bo$oo3bo3bo10boo3bo78bo46bo4booboo4bo4boo3b3obobo15boo18boo3bobooboo 47boo6bo5boo24bo23boo17b4obo15bo8b4o7boobo13boo5bo4bo20bo4bo6bo140bo3b o7bo64bobboo40b4obobbobo13boo53bobo47b3o90bo4bo6bo6b5o5bo52bobboo3bobo 9bo15boboo3bo$bbobbo3bo12bo81boo3bo23boobo16boobobo11bo8bobo9b6o22bo3b oo3bo5bobo38bobbo3boobbobo3boo45b3o17bobb4obo21bobbo8bo3boo15boo4bo17b obobo4b4obbo143boo6boo67bobo41boobboobobobbo6bobob3obo51bo36boo6bo5boo 89bo8boo3bobbob9obboo59bo22boo9boo$4boo106boo15b3obob3o19boo32bo32bo6b ooboboobo32booboo8boo8boo41booboo46bobo9bobboo16b3o21bo3bo163bobo61boo 3bo46bo3bo3bobbobbo4boo6bo83bobbo3boobbobo3boo87boboboo8bobo8bobo41bo 44boo9boo$5bo3bo97boo3bo12bobo10bo3boo14b4o29b6o31boo9bo31b3obo6bob3o 6bo9boo35bo18b3o28bobbobo26b3o21bobobo4b4obbo153bo23boo38b3o48bo3boobo 3boobbo3bo3boboobo26bobboo48booboo8boo8boo87boo5bobo4boboo46boo3bo43bo 16bobo$5bo3bo98bobo4boo6boo4boo5bo3b4o16bo36boo73b5o4bo8boobbo3bobbobb obbo30bo50bobo9bobboo16boo4bo21bo4bo6bo175bo41boo49bobbobb3o3bo12bobo 26bobb3o46b3obo6bob3o6bo9boo81boo3b4o5boo48bobboo41bobo12boboobo$5b3o 100b7obo8boboobbo4b3obo50boo11bo71bobboo10boobbobb3o6bo30boo19bobb4obo 21bobbo8bo3boo10boo5bo4bo23boo3bobobo174boo3bobo5boo31bo53bo8b4o7b3o 20boo3bo4bo47b5o4bo8boobbo3bobbobbobbo83bo8bo34bobo4boo9boo41boboobo5b 3obboo4boo$107bo23bo4bo55b3o4boboobo74b3o13bo8bobbo33boo16b4obo15bo8b 4o7boobo12b3ob3obobobo20boboboob3o66boboboo106boo4bobo3bobo4bo24bobobb obo49b4oboobbo11bo14bo5bob3o57bobboo10boobbobb3o6bo4boo79bobboobo35bo 7bobbo6bo43bo3bo4b3obboboobo$5b3o77bo22b7obo8boboobbo4b3obo47boo7bobob o77boo15boo3boboo32bobobo24bobbo7boobo9booboobo7bobo10boo3bo10boo14bob o9bobo61bobo112bo8boboobobo25bo5bo3bo79boo3bo3b4o60b3o13bo8bobbobboo3b obbo74boo4bo35bobb3o5bo5boo53boo5bobo$5bo3bo41bobo29boo3bo19bobo4boo6b oo4boo5bo3b4o44boo110bo35boo4bo24boobbooboobo16boboboo6boobo18bo5bobbo 11bo74bo3bo104boboo5bo3bobo5bobo28boob3obo81bobboo3bo62boo15boo3boboo 9boobobo117bo5bobbobboobbo$5bo3bo41bo33bobboo17boo3bo12bobo10bo3boo46b o146bobbo30bo23b3o11bo16bobb3o5bo12bo10bo61b3o6bo100bo4bobobobobo3bo 34bo6bo84boo87bo9bo3boo17bobbo89boo3bo10boo5b3o91bo4bo$4boo45bobobbobb o28boo22boo15b3obob3o35boo14bobo76bobo66boo35boboo17boo29bo7bobbo10bo 12bobo59bobo3boobboo98bobooboo7bobo33bo6b3o84bo96bo7bo16bo7boobbobbo 76b3ob3obobobo104bo3b5o$bbobbo3bo7boo35bo33bo15boo3bo23boobo36boo14bob oobo69b3obobo104boo49bobo4boo11boo13bobo58b3obobboo5b3o144boo6bo84boo 96bo7bobo14bobbob3o3bobobo4bo72boo5bo4bo33bo68bo4b5o$oo3bo3bo6b3o36bob oobo26boo15bo68bo16bo3bo65b4obo4bo68bobbo33bo3bo67bo13bo63bobboo5bobo 94bobooboo7bobo33bo93bo96bobo6bo14boboobobbo3bo6bobo8boo67boo4bo25bobb oo3bobo64bo3bo8bo$bbo14bo15boo21b3obo27bo18bo62bobbo79bo6bo4bo74b3o34b obbo149bo8boo31boo6bobo50bo4bobobobobo3bo125bo120bobbooboob3obbob3o5bo 3bobb3o4bo61b3o29boobbo3bo3boobobo50b4oboboboo3bo5bobboo$4boo3bo8boobo o10b3oboobo14bo4bobboboo20bo17bobo59bo4bo80boobboo5bo75bo37bobo104bo3b o44bo3bo33boo5b3obo49boboo5bo3bobo5bobo117b3o120bobbobo7boobo4bobbobbo 4boboobbo61b3o29bo3b3o8boboobo47bobb4o5b3o5bobb3o$6b3o14bo5bob3o6bo11b o3boo3bob4o18b3o17boo3boo51boobboob3obo78bobbo4boo221boboobo40b4o38bo 5boo60bo8boboobobo120bo118b4o4bo5boobboboobbobbooboo4bobo62boo4bo29boo 14bo54b6o12bo$18boo7bobo6bo15boobbobboboo4bo20bo18bobo52bobbo6boo82bo 80b4o143bobo42bo39bobbobbo3bo57boo4bobo3bobo4bo116bo3boo115bo6bobbo9b 3obb3ob3o66boo5bo4bo29bo7boo23bo29b3o$19bo6bobo9boo12bo8boo4bobboo12bo 3boo65b4obo175b3obbo3boo138bo44b4o32bo4bo3bobbo58boo3bobo5boo76bo48boo 113boo7bo21boo66b3ob3obobobo31b7o24bobo16bo18b6o12bo$20bobbo14bo18boo 3boo3bobb3o15boo65bobb4obo92b3o78boo4boo3bobbo131boo10b3o36bo3bo23boob boob3obobo3bo58bo88bobo44boobo116bo7boo65bo5boo15boo3bo10boo56bobbo3bo o7boobo11bobb4o5b3o5bobb3o$21boboboboo10bo32bo12boobo134bobo4boo25bo 89boobobo130boo45bo8boo20bobbo6boo3b3o60boo86bobbo3boo6boo30booboo188b oobboobboo26bo5bobbo22bobboo4boo20bob5o3booboobo14b4oboboboo3bo5bobboo $20boo3bo59booboo65b3o32bo3bo28bo7bobbo21boo60bo3bo20bo3boo138boo3boob boo28bobboo5bobo15b4obo18boo147bob5o3boob3obo30bo3bo74b3o17bobo6bo85bo boo5b3o20bobb3o5bo22bo4boobboo22bo7bo27bo3bo8bo$22bo63bo3bo98boboobo 28bobb3o5bo20b3o59boboobo18bo7bo136boobobob4o25b3obobboo5b3o15bobb4obo 166bo7bo4bo29boobobo64boo6bo5boo16bo7bobo86boobboo24bo7bobbo21boo4boo 5b3o17boo10boboo24bo4b5o$83boobobo66bobb4obo25bobo33bo5bobbo19booboo 58bobo21bo7bobo139bobo29bobo3boobboo159bo5boo26boo10bobbo29bo3bo63bobb o3boobbobo3boo14bo7bo86bo5boo24bobo4boo25bo4boobboo18bobbo12boo26bo3b 5o$84bo3bo66b4obo29bo27boo10boo24bo61bo22bobo6bo135boo4b3obbo25b3o6bo 21b3o135boobboobboo23bobbo14bo29bo64booboo8boo8boo13bo3boo73boo78bobbo o4boo16boo6bo10bo3bo23bo4bo$84bo77bobbo6boo14boo27b3o3boo29bo27bo33boo 168bo4boboobobo25bo3bo165boboo5b3o17boo6bo11boo29bobo45bobo12b3obo6bob 3o6bo9boo9boobobo68bo109bobbobbo11bobbo$85bobo75boobboob3obo13boo7bobo bo16boobo4bo27boo25bobo10b3o19boo168boo4b3obbo27bobo26bobb4obo133boobb oo23bobbobbo11boo32bo40b3obobo13b5o4bo8boobbo3bobbobbobbobboo3bobbo64b oobobbo3boboo3b5obo62b7o24b4o13bobo$88bo78bo4bo19b3o4boboobo16bo4bo30b oo19bobo6bo5bo3boo21boboo167bobo31boboboo23b4obo44bo81boo6bo5boo25b4o 45b3o35b4obo4bo17bobboo10boobbobb3o6bo4boo67bo4bo6bo6b5o63bo7boo$87b3o 80bobbo17boo11bo48bobobo17bobbo4bobobboo14bo14boo165boobobob4o64bobbo 6boo29bobbo71bo3b3obb3o118bo6bo4bo25b3o13bo8bobbo73bo8boo3bobbob9o58bo o14bo$51bobo119bo23boo22b6o25boo4bo14boo3boo7bobobboo5boboobo182boo3bo obboo64boobboob3obo33boboo4boboo4bobboo47boobo4bobboobobo4bo79bo30boob boo5bo26boo15boo3boboo76boboboo8bobo8bobobboo50bo3b3o8boboobo16b4o13bo bo$51bo35bo85boo16b6o28boobbobo21bobbo18bobboo3b3obob3o4boobobo17boobo 160boo81bo4bo29boob3obbobboobobo5bobb3o43boboboo3boo5b3o6bo29b4o42bobb o4boo24bobbo4boo49bo83boo5bobo4boboo8bo52boobbo3bo3boobobo17bobbobbo 11bobbo$51bobobbobbo24bobbo85boo16bo27bobboo5booboo19boo22bobbo3bobo5b 3o24boobo160boo10b3o71bobbo27bobo9bo5bo4bo4bo43bo7bo3b3obo3b4obo27bobb obbo11boo28boobboo5bo25bo141boo3b4o5boo61bobboo3bobo22boo6bo10bo3bo$ 54bo29boobboo101b6o20boo3bobooboo10bo38boo3booboo33bo163bo86bo22boobbo 7boo3b3o4b4o49bo4booboo4bo4boo3b3obobo20boo6bo11boo28bo6bo4bo171bo8bo 71bo25bobbo12boo$55boboobo23bo112boo20bo3boo3bo5boboobo15bobbo25bobbo 4b3o23bobboo161bobo85boo20bobobbo13bo5b4o16boo33boobobo11bo8bobo22bobb o14bo36b4obo4bo19b3o146bobboobo101boo10boboo$56b3obo130boo11bo19bo6boo bobo19b3o26b3o3b3o25b3o162boboobo82boo21bobo16bo4boo17bo39boo22bo25boo 10bobbo40b3obobo20bo147boo4bo36bobo6bo56bo7bo$55bo4bobboboo125b3o4bobo obo23boo26bo29boo3bo193bo3bo100bobb3obo17boo20boo3bobo5boo27b4o46bo7bo 4bo45bobo19boo190bo7bobo53bob5o3booboobo$52bo3boo3bob4o121boo7bobobo 116bo271bobo44boo4bobo3bobo4bo24bo45bob5o3boob3obo64b3o96bo93bo7bo55bo bbo3boo7boobo$52boobbobboboo4bo4bo115boo63b4o61boo270bo49bo8boboobobo 70bobbo3boo6boo64booboo94bobo94bo3boo56bobo16bo21b3obboo$52bo8boo4bobb 3o117bo61b3obbo59bobboo269bo41boboo5bo3bobo5bobo70bobo80bo96bobbo3boo 6boo84boobobo53bo39bobobbobboo$57boo3boo3bobboo117bobo61boo64bobo5boob o206bo53bo41bo4bobobobobo3bo77bo79bo98bob5o3boob3obo73boo4boo3bobbo91b oboo7boobo$189boboobo120boo3bo5bo3bo191bo9bo8bo47bo43bobooboo7bobo158b oo99bo7bo4bo74b3obbo3boo95b3o3bo9bo$190bo3bo121b3o6bo3bo191boboo7bo9bo 45boo221boo95boo10bobbo74b4o105b4oboobbobbo$317boo4b3o191b5o3boo4bobb 7obo4bo43bo41bobooboo7bobo157bobobo93bobbo14bo179b3obbobobo3bo$320bob 4obbo187b3obo3b3o3bo3bobo4b3obobo39boo3bo40bo4bobobobobo3bo5bo149boo4b o90boo6bo11boo76bo101bobobobo3boo4bo$318bobobo194booboo4bo5bo12bobo38b obobbo41boboo5bo3bobo5bobo150bobbo94bobbobbo11boo76b3o57bo41bo11b3obo$ 319bo3b3obo194bo9b4o50boobo50bo8boboobobo37bo5boo105boo98b4o149bobo39b obboo$270bo54boo193bobob4obobboobo46bobo52boo4bobo3bobo40boobboobboo 298bobbo32bo23bobo40bo11b3obo$268bobo246boo5boobbo6bo46bo54boo3bobo5bo o42boboo5b3o103bobbo186bo28boo6boo22bo9boo8bo22bobobobo3boo4bo$264b3ob obo247bobobboobo8bobboo42bobo53bo57boobboo108b3o94b4o13bobo72bo3bo23bo bbo5bo24bo4boobboo7boo22b3obbobobo3bo$190bo3bo65b4obo253bo5bo10boobo 99boo45boo6bo5boo108bo94bobbobbo11bobbo72boboo21bobbobbo6bo22bo4b3o5b 3obo10bobo16b4oboobbobbo$189boboobo58bo6bo4bo411bo3b3obb3o214boo6bo10b o3bo72bo24boobo10b3o19b4ob3obboo5bobbobobobbobbo12b3o3bo9bo$189bobo13b obo45boobboo5bo410boobo4bobboobobo4bo110b4o94bobbo12boo76boo23bobboo5b o4bobo18bo3bo5boo8bobobobo3bo13boboo7boobo$190bo10b3obobo45bobbo4boo 409boboboo3boo5b3o6bo81bo26b3obbo3boo91boo10boboo76boboo25bobboobo25b 3o15boo3bobbo19bobobbobboo$188boo7b4obo4bo48bo25bo389bo7bo3b3obo3b4obo 4bo33bo42boo6bo19boo4boo3bobbo87bo7bo79b3oboo28b4oboo44boo23b3obboo$ 188boo7bo4bo78bobo10b3o375bo4booboo4bo4boo3b3obobo24boo5boo43bo6b3o28b oobobo84bob5o3booboobo73boobboo29boobboo23b3o19boo$192boboo5bo54b3o19b obo6bo5bo3boo375boobobo11bo8bobo23bobbo6bo44bo6bo24bo3boo88bobbo3boo7b oobo133bo3bo5boo12bo$191boo5boo57bo17bobbo4bobobboo388boo44bobboo15boo 35boob3obo22bo7bo87bobo16bo71boo32boobboo22b4ob3obboo$256boo15boo3boo 7bobobboo5bobo377b4o39boo3boo7b3oboo5bo27bo8bo3bo22bo7bobo86bo90bo31b 4oboo22bo4b3o5b3o$191boobo60b3o17bobboo3b3obob3o4booboboobo376bo42bobb o5boo3bo4bo4bo24boo3bo3bobo26bobo6bo180bobo25bobboobo25bo4boobboo$191b oobo59booboo18bobbo3bobo5b3o9bo422bobobbo6bo3b4obo4bo21bobboo220boobo 20bobboo5bo4bobo18bo9boo$193bo62bo21boo3booboo316bo126boobo12b3obobo 24boo221bo22boobo10b3o4boo13bobo$190bobboo59bo29bobbo4b3o242boo63bobbo 22bo10boo90bo3b3o13bobo24bo220bobo22bobbobbo6bo5boo3bobbo8bobo$191b3o 60boo29b3o3b3o228bo9bo7bo66boboo4boboo4bobb3o9bo138boo218bobboo25bobbo 5bo10boobobo8bo$257boo27boo3bo229boboo7bo8bo59boob3obbobboobobo5bobboo 9boo3bobo5boo79bo3b3o40bo218bo3bo3boo21boo6boo5bo3boo$190bo62bobobo 259b5o3boo4bobb6obo4bo53bobo9bo5bo4bo13boo4bobo3bobo79boobo42bo219bobo 5b3oboobo23bo4bo7bo$190boo60boo4bo257b3obo3b3o3bo3bobo3b3obobo48boobbo 7boo3b3o4b4o17bo8boboobobo70bobobbo6bo35b3o226boo6bo28bo7bobo$189bobbo o59bobbo260booboo4bo5bo11bobo47bobobbo13bo5b4o10boboo5bo3bobo5bobo67bo bbo5boo3bo39bo229bo32bobo6bo$191bobo59boo267bo9b4o59bobo16bo4boo12bo4b obobobobo3bo5bo65boo3boo7b3oboo32bo3boo223bo6boo49bo$187boo3bo327bobob 4obobboobo54bobb3obo17boo16bobooboo7bobo74bobboo49boo221boo7bo49bobo$ 188b3o64bobbo258boo5boobbo6bo54bobo133bobbo6bo38boobo224bo7bo48bobo$ 189boo65b3o259bobobboobo8bobboo50bo42bobooboo7bobo77boo5boo39booboo 280bo9boo$192bo63bo262bo5bo10boobo51bo41bo4bobobobobo3bo5bo79bo39bo3bo 280bo4boobboo$190bobo398bo41boboo5bo3bobo5bobo116boobobo45bo235bo4b3o 5b3o$191bo61b4o332bo50bo8boboobobo117bo3bo43bobo235b4ob3obboo$252b3obb o330boo47boo4bobo3bobo122bo43b3obobo235bo3bo5boo$253boo336bo45boo3bobo 5boo123bobo36b4obo241b3o$587boo3bo45bo139bo28bo6bo4bo$586bobobbo47boo 136b3o27boobboo5bo218bobo21b3o$586boobo217bobbo4boo218boo3boo18bo3bo5b oo8bo$582bobo192bo32bo224bobo22b4ob3obboo7boo$190bo3bo387bo191bobbo4bo o253bo22bo4b3o5b3obo10bobo$189boboobo12bo374bobo189boobboo5bo24b3o221b o26bo4boobboo5bobbobobobbobbo$189bobo13bobo566bo6bo4bo24bo222boo3bo20b o9boo8bobobobo3bo$190bo10b3obobo528bo44b4obo4bo18boo228bo19bobo16boo3b obbo$188boo7b4obo524boo5boo49b3obobo17b3o225booboo18bobo19boo$188boo7b o4bo523bobbo6bo52bobo16booboo225boboo19bo21boo$192boboo5bo53bo3bo464bo bboo15boo64bo226boobo43bo$191boo5boo54boboobo462boo3boo7b3oboo5bo60bo 231bo$254bobo467bobbo5boo3bo4bo4bo59boo226bobbo$191boobo60bo471bobobbo 6bo3b4obo62boo223bobboo$191boobo58boo476boobo12b3obobo53bobobo225boo$ 193bo59boo476bo3b3o13bobo52boo4bo$190bobboo62boboo492bo53bobbo$191b3o 62boo378bo94bo3b3o69boo226b3o$635bobo93boobo303bobo$190bo65boobo375bob o89bobobbo6bo69bobbo221bobbobo$190boo64boobo375bo9boo77bobbo5boo3bo71b 3o220bo3bo$189bobboo64bo377bo4boobboo75boo3boo7b3oboo68bo223bo$191bobo 61bobboo375bo4b3o5b3o73bobboo306boo32bo6b3o$187boo3bo63b3o376b4ob3obbo o79bobbo6bo70b4o225b3o30bo8boo$188b3o444bo3bo5boo80boo5boo70b3obbo3boo 219b3o17booboo5bobob3obobo3boo$189boo64bo380b3o13bo83bo70boo4boo3bobbo 233b3o8b3o3b3o8boo$192bo62boo395boobboo121bo37boobobo233boobobbobooboo 3b3o6bo9boo$190bobo61bobboo377b3o13bobbo123boo6bo25bo3boo245bo13boobbo 3bobbobbobbo$191bo64bobo376bo3bo5boo8bo123bo6b3o22bo7bo215b3o22booboo 5bo8boobbobb3o6bo$252boo3bo377b4ob3obboo134bo6bo22bo7bobo211boo3bo23bo o4bobo12bo8bobbo$253b3o379bo4b3o5b3o4b3o123boob3obo22bobo6bo210bo30bob oboo16boo3boboo$254boo380bo4boobboo5bo3bo118bo8bo3bo240boo3bo3bo19bobo obobboobo18bo$257bo377bo9boo5bobo118boo3bo3bobo246bobbo3bo19bo3bobbobo o$255bobobbobo372bobo15bo121bobboo253boo23boboobo$256bo5bo3bo368bobo 140boo254bo3bo$259boob3obo369bo141bo255bo3bo$259bo6bo486bo23boo255b3o$ 257bo6b3o469bo14bobo24bo$257boo6bo461boo5boo11b3obobo23bo256b3o$257bo 468bobbo6bo6b4obo26b3o256bo3bo$724bobboo14bo4bo29bo255bo3bo$722boo3boo 7b3oboo5bo26bo3boo253boo$724bobbo5boo3bo5boo32boo251bobbo3bo$727bobobb o6bo35boobo250boo3bo3bo$731boobo40booboo251bo$731bo3b3o38bo3bo252boo3b o$773boobobo256b3o$636bo15bo78bo3b3o36bo3bo$635bobo14boobboo73boobo39b o$635bobo14bobbo71bobobbo6bo35bobo$635bo9boo8bo68bobbo5boo3bo39bo$636b o4boobboo75boo3boo7b3oboo35b3o$635bo4b3o5b3o4b3o66bobboo$635b4ob3obboo 5bo3bo69bobbo6bo40bo$635bo3bo5boo5bobo72boo5boo38bobbo4boo$636b3o14bo 82bo37boobboo5bo$774bo6bo4bo$636b3o142b4obo$635bo3bo5boo138b3obobo$ 635b4ob3obboo142bobo$635bo4b3o5b3o140bo$636bo4boobboo$635bo9boo$635bob o$635bobo$636bo$$736bo14bobo$727boo5boo11b3obobo$726bobbo6bo6b4obo4bo$ 724bobboo14bo4bo$722boo3boo7b3oboo5bo$724bobbo5boo3bo5boo$727bobobbo6b o$731boobo55bo$731bo3b3o47bobb3o$785bobboo$731bo3b3o42boo3bo$731boobo 39bo5bob3o$727bobobbo6bo32boo3bo3b4o$724bobbo5boo3bo35bobboo3bo$722boo 3boo7b3oboo35boo$724bobboo48bo$726bobbo6bo39boo$727boo5boo41bo$736bo 39bo$774b3o$777bo$773bo3boo$777boo$774boobo$774booboo$775bo3bo$772boob obo$773bo3bo$773bo$774bobo$777bo$776b3o$$743boo6bobo22bo$743boo5b3obo 18bobbo4boo$743bo5boo22boobboo5bo$740bobbobbo3bo22bo6bo4bo$737bo4bo3bo bbo30b4obo$733boobboob3obobo3bo33b3obobo$732bobbo6boo3b3o38bobo$725b4o bo18boo39bo$725bobb4obo$$725b3o$$725bobb4obo$725b4obo15bo$732bobbo7boo bo$733boobbooboobo$737bo$740boboo$741boo$742bo3bo$743bobbo$744bobo43bo $785bobb3o$785bobboo$780boo3bo$774bo5bob3o$772boo3bo3b4o$774bobboo3bo$ 777boo$777bo$776boo$777bo$776bo$774b3o$777bo$773bo3boo$777boo$774boobo $774booboo$775bo3bo$772boobobo$773bo3bo$773bo$774bobo$777bo$776b3o$$ 776bo$773bobbo4boo$773boobboo5bo$773bo6bo4bo$780b4obo4bo$784b3obobo$ 788bobo13$775bo3bo$774boboobo$774bobo13bobo$775bo10b3obobo$773boo7b4ob o4bo$773boo7bo4bo$777boboo5bo$776boo5boo$$776boobo$776boobo$778bo$775b obboo$776b3o$$775bo$775boo$774bobboo$776bobo5boobo$772boo3bo5bo3bo$ 773b3o6bo3bo$774boo4b3o$777bob4obbo$775bobobo$776bo3b3obo$782boo11$ 775bo3bo$774boboobo12bo$774bobo13bobo$775bo10b3obobo$773boo7b4obo$773b oo7bo4bo$777boboo5bo$776boo5boo$$776boobo$776boobo$778bo$775bobboo$ 776b3o$$775bo$775boo$774bobboo$776bobo5boobo$772boo3bo5bo3bo$773b3o6bo 3bo$774boo4b3o$777bob4obbo$775bobobo$776bo3b3obo$782boo! golly-2.5-src/Patterns/Life/Spaceships/Corder-lineship.rle0000644000175100001440000004602712156145314020540 00000000000000#C Optimized version of Jason Summers' p96 c/12 diagonal lineship. #C A p768 version was also constructed. David Bell, 24 June 2005 x = 675, y = 653, rule = B3/S23 617bo$618boboobobo$612b3o3b4o3bo$618bobbooboo$617bo$615b3o$615b3o17boo $635boo7$643boo$643boo$631b4o$635bo$617bobooboo7bo4bo$616b5obboo7boobo $616bobb3obo10bo$622bo3$606bo3boobboobo$606bo3boo4boboo$606bo3boobboob oo$610boo$608bobbo$608bobo$609bo9$612booboo$613bobo$600bo12boo$599b3o 10boobo$598booboo12boo4bo$599b3o10booboo4bo$600bo$600bobo20boo$600b4o 19boo$603bo$$599booboo$598bo5bo$599bo3bo$592b3o5bo$591bo3bo$590bo4bo 29boo$589bo3bo30bobbo$589bobbob3o27bobbo$589bo7bo26bobbo$591bo3bobo27b oo$570bo20bo3boboo$569b3o21b3oboo31bo$568booboo58bo$567boobobo58bo$ 566b3obb3o$567bo6bo41bo$568b5obo40bo$569b4oboo39b3o$574bo$573bo12boo$ 586boo3$571bo$569boobo15booboboo$587boobo3bo$572bo15bobobobo$569bobbo 16bo$570bo$$575boo$568b3o5boo$575boo$575bo11b4o$586boboo$586bobo$$581b o$579bobboo$574boo3bobb4o$574boo3boboobo$582boobo$582bo$580bo4bo$580b 3o$580boob3o$528bo54b3o$527boboo51bobo15bo$531bo50boo15bo$525bo3bobbo 66b3o$441bo81bo9bo11b3o$441bo7bo73bo4boobboo$441bo5b3o82boo46bo$440boo 3bobo77bo5bo31b3o8bo5bo$446bobbo76bo4b3o28bo3bo6bo7bo$445bobboo77bo4b oo12b3o5boo7boo9b4obboo$460boo67b4o12booboo4boo9booboo9b3o$460boo82bob oboo17boo11bobo$544bo3bo32bo$545bobbo32bo$518bo26b3o$518bo$518bo8bo14b o$525bobo13bobo18boo12bo$468boo49b3obbo3bo12bobbo17boo12boo$468boo50bo b5o15boo31bobo$449boo3boo70bo$443bo3b4o3bobo64boo15boo$443boboobbobbo 3bo81boo$443boboo4bo3boo$447bo3bo$452bo78bo$501b3o26bobo$522b3o5bobo$ 433b3o6bo62boo15b3o6bo$434boo3boobo64bo12bo4boo$414bo18boo5bobo58b4obo 13bobo3bo$412booboo21b3obo58b5o13boo3b3o$412booboo24boo76boo3bo$412boo 108bo21bo39bo$414boobo68bo14bobo14bo3bo21boo37bo$415bobbo63boobobo7bo 5bobo14bobo22bobo37b3o$415bobbo63bobbooboobbooboo5bo$416boo64bo5bobo5b o4bobo$483boobbo8bo5boo$487bobb3obbo6bo$487b3o$414bo45bobo109bo$413bob o44bobobo7bo97boo$413bobo43bobboobo4b3o98boo$414bo45boo3boboboobo44bo$ 460boo3boob5o10b3o29booboo$464boboo3boo10bobo29b3oboo$463bobo16booboo 15boo12b5o$482boo18boo13b3o$422bo21bobo71bo$421bobo21boo$421bobo21bo 39bo$399booboo18bo62bo$399boo30bo$399boobobo28bo45b3o$402bobo25bo3bo 43bo3bo27boo$403boo27b4o41bo4bo27boo$433bo33boobo5bo3boo3bo$391bobo36b oboo29bo3b6o11bo$377bobo7bobbobbo36boboo28bo5bo4bobboo6b3o$376booboo5b oboboobo36bobo29bo11bo$377boboo6bo42boo31bo9bo$381bo11b3o72bo$380bo13b oo72bobbo$380bo12boo75bo$568bo$567bo$470boo95b3o$470boo3$401b3o$399boo bbo$398bo3bo153bo$393bo5bobbo151boo$392bobo4bobo153boo$382boo17bo$382b oo18bo$402bobo$402boo$$476bobo$477boo$477bo$390boo$390boo12$552bo$551b o$551b3o6$540bo$538boo$489boo48boo$479bo3boo4b3o$479boboobbo6bo$479bo bb5obb4o$483b3o3b3o$482b3o$482boo17boo5bobo$482bo18boo6boo$509bo6$509b oo$359b5o7bo137boo$357boo5boo4bobo115bo8boobbo$357bo7bo4bo116bobbo5b3o bboo$357boo7bo3bobbo107b3obbo3bo6boobb3o$359boo6bo3b3o107b3obbo4bo5boo bboo$362bo122bo3boo$362bo4bo13boo106boo$363boobo14boo103boo48bo$482bob o50bo$473bob3o4bobo50b3o$471boobo4bo5bo$473boo4bobbobbo$479bobbobbo$ 478bo4bo$378bo3bo6boo67bo15bobbo$376bobbob3o5boo66bobo15boo47bo$379bob obo72booboo61boo$367bobo7bo79bobbo62boo$361boo4b3obobooboo81b3o$361boo 6bobboo3bobo3bo75bobo$377bobo80boo$365boo93boo60bo$353b3o8b4o136b3o14b o$351b7o5boobbo138bo14b3o$350b9o3bob3o69bo68bo$349bo7b3o3boobo68boo20b 3o$298bo51b3o6bo74b5o18boo$351boo80bo24bobbo$302bo51bo77boo5bo12boo5bo bo$355bo75b3oboo8bobo3b3o$294b3obo57bo75boboboobboo3bob6oboo$294b3obo 134bobbobboo5bobo4bobbo$295bo8boo106b3o20boo11bobbobo$296bo3b3oboo105b o25boobo8b3obo$297bo6bo105bo4boo23bo13bobobbo3bo$298bobobobo104bo3bo 15b3o27bobbo$299bo15boo92bobbo4bo4boo36bo$315boo92bo3bo3bo4b3obo$361b oo47boobob3o54b3o$346bo14boo50bo60bo45bo$346bo67b4o40boo13bo45bo$345bo bo68boo11boboo25boo59b3o$346boobbo78bobbo35boo$345bo5bo77b3o36bob3o$ 323boo20bo5bo116boobbo$323boo20bo4bo118b3o$305b3o41bo19boo99bo$303bo3b oo37b3o20boo137bo$297b3o3bobobboo156boo38boo$302bo5bo157boo39boo$303bo bboo36booboo$303bo45bo$288bo55boo72boo$287bobo56b3o69boo86bo$505bo$ 287bobbo3bob3o206b3o$289bo4bo41bo$290boboobobo38bo7bo$268b3o20boo3bo 39bo5b3o$269bo22bo42boo3bobo$269bobbo68bobbo81boo$269bobbo67bobboo81b oo$270bobo39bo$312bo$314bo5bo$313bo6bobo$312bo3bobbo$269bo43bobboboboo $268bobo47boboo37bo$269bo62boo25bobo$269bo62boo25boo$504bo$342bo160bo$ 299bo32bo10bo88b3o68b3o$300bo29bobo3boo4bo89bobo$277bo20b3o28bo5b3o94b obo14boo$276bobo51bob3o3bo93bo4boo9bobbo$276bobo52bo5bo93b3o3boo10b3o 16bo$255boo7boo11bo55boobbo99bo12boo15b3o$255b3o6b3obboo50boo3bo8bo97b 4o13bo15booboo21bo$255boobobo26bo31b3o4boo106boo12boboo15b3o20boo$258b oo26boo26b3obo8boo105bo13b4o16bo15boo5boo$237bo48bobo29bobobb5o9bo110b obobo15bobo13b3o$286boo31bo3b3o10boo97bo13booboo3boo9b4o12b3o$233bo7bo 44boo145bobo12bo3bo4boo12bo12bo$233bo8bobb3o85bobbo95b4o13b3o33bo4bo$ 232bo4boo3bobb3o37bo47bobbo95b3o15bo16booboo17bo$233bobo6bobboobbo34b 3o46b3o98bo31bo5bo16b3o$233boboo10bobo33boboo180bo3bo$247b3o70boo100bo 26boo17bo15bo$238bo44boo35boo8boo86boobobo7bo13bobo36bobo52bo$329b3o 86bobbooboobbooboo12bobo17boo17boo52b3o$329b3o86bo5bobo5bo32boo70boobb o$330bobo86boobbo8bo11b4o88boobboo$330bobo71b3o16bobb3obbo13bo91boo$ 330b3o70bobbo16b3o15boo95b5o$253b3o146bo4bo33boo99boo$252boobboo144bo bb3o132bobbo$252boobboo144bo5bo132boo12boo$253boboo146b7o24bo120boo$ 253boo88bo65bo23bobo$245boo6boo88bobo63bo23bobo$237boo8b3o8bobo82boo 62boo25bo17b3o$237boo5b3oboo8boo194bo33bo50b3o$259bo193bo33bo51bobo$ 331bo50boo21bo81b3o49bo$332bo49b3o19b3o132bobbo20boo$330b3o49boobo17bo 3boo131bobo20boo$386bo17booboo132b3o$378bo3boo3bo16booboo134boo$245boo 141bo5bo6boo134b3o4boo$245boo138bobo5bo4b3o75bo66boo$359bo25bo6b3o3boo bboo70boo148bo$308bo49boboo18bo4bobo5boo3boboboo71boo54b3o89b3o$308bo 53bo31boobbo131bobbo88bobobo$308bo47bo3bobbo20b4o7booboo129bo4bo86b3ob 3o12bo$311boo41bo9bo11b3o5boo10b3o130bobb3o104bobo$311boo12boo27bo4boo bboo109bo54bo5bo87bob3o13boo$306bo3b3o11boo37boo55b3o50bo56b7o86b5o9bo 3bo$307b3o15bo30bo5bo59bo50b3o60bo86boobboo11bobboo$308bo15b3o30bo4b3o 56bo114bo36bo51boboo14bo$307boo15b3o31bo4boo12b3o25boo9bo51bo65boo36bo bo52boo9bobboo$307b3o16bo33b4o12booboo24boo8bobbo49bobo100bo3bo13b3o 31bobobbo11bo7boo$309bo14bobbo47boboboo33bo4bo48boo101bo3bo8bo37bobobb o20boo$307bo16b3o48bo3bo34bo5bo150bobob3o4boob3o35bo$309bo15bo50bobbo 33booboo93bo60boobobbo5boboo$307b3o66b3o37boobo90boo64bobo8bo$342bo72b oobbo89b5o62boo11bobbo5boo$340bobo72b4o89bo80b3o6boo38boo$341boo70b3ob o89boo5bo6boo$413boo91b3oboo8bobbo114boo$507boboboobboo4boo133bo$322bo bo183bobbobboo83bo39bobo9bo3bobo$322bobbo39boo143boo86boo40bo10b5oboo$ 322bobbo39boo145boobo82boboboo24boo10booboo7bo4bo$322bo3bo145bo42bo83b 3obooboo8b3o9b3oboo8boo9boobo$323bobo145bo126bo3boobboo23bobbo8boo10bo $324bo38bo107b3o55boo67bo3bo11bo5bo11b3ob5obobo3bo$364bo163bobbo66bobb o12b7o13bo3bobb3o4bo$309b3o6bo43b3o164boo47boo13boo4bo16bo17bobboobbo bbo$308bo4bo3bobo258boo13boo21bo3bo14boo3b3obo$308bo4boo3bo11bo42boo 208boo30bo18boo6b3o$308bo6bo13boboo40boo207boboo30bo16boo$309b3obobbob o14bo126bo105bo15bo8b3o23bo4bo10boobo$313b5o9bo3bobbo123boo78bo26b3o 15bobbo5boo23bo4bo12bo$318bo6bo9bo11b3o109boo79bo23booboo17bo29boobobo $287bo7bo29bo4boobboo201bo25boo3bo15boo29bobo$286b3o5bobo37boo228bobob obo12bo32bo$285boob4obbobbo29bo5bo173b3o28bo26boobobbo$286b3obbo36bo4b 3o122bo47bo3bo28boo27boobo$287bobboobbo34bo4boo12b3o5boo99bo48bo3bo32b o25boo$291boobobo34b4o12booboo4boo99b3o46bo3bo31bobo$295bo10boo38bobob oo189bo3bo13b3o48bo$306boo38bo3bo101bo54booboo29bo3bo8bo54bobo5bo$347b obbo9boo90bobo53bobbo29bobob3o4boob3o57booboo8boo$347b3o10boo90boo31bo 23bobo30boobobbo5boboo51b3obbo3boo8boo$307b3o45boo3bo123b3o23boo34bobo 8bo57booboo$307b3o44b4oboo122booboo19bo3bo34boo11bobbo52b4o$313b3o39bo bobbo123b3o14bo4bobobobo46b3o$311bo3bo58bo110bo14b3o4bo$309booboboo43b oboo9bobo110bobo11bo3bo$166bobo122bo17bo32bo18bo11boo110b4o9boobb3o$ 152bobo7bobbobbo121b4o6boo8boo24boo3b3o144bo10bo3bo25bobo104boo$151boo boo5boboboobo120bo4bo4b3oboo31boo3bobbo4b3o147bobbo27boo104boo$152bob oo6bo125boo10boob3o4bo12boo16b3obobbooboo131booboo11bobo27bo$156bo11b 3o118boboboo4b3oboo3b4o11b3o15boobbobboobbo130bo5bo$155bo13boo119b3o6b oo7boobbo10boobo15boo6boo132bo3bo$155bo12boo7boo112bo15bo4bo14bo12bo3b o111bo28bo$177boo127booboboo6bo3boo3bo126bo166b3o$305b4o20bo11bo53bo 59b3o42boboo44boo70b4oboo$305b4o17bobo11bobbo52bo102b5o44boo59bo5bobo 4boobbo$308boo16bo13b4o50b3o102b4o94bo11boo4boo7b3o$294boo13boo10bo4bo bo12bo254bobo9boobo7bobo$178boo114boo12bo191b3o92bo3bo10b3o$177bobbo 144b4o171b3o92bo3bo10boo$177bobbo4boo117b3o18boo117bo56bo93bobob3o5b4o $175bob4o4boo255boo45boo105boobobbo5boo$174bobbo124bo4bo135boo44boo65b oo42bobo5bo$174bobo125bo17b3o233boo42boo$157boo9bo3boo132boo11bobbo 250b3o$157boo8bo135booboo10bo4bo249b3o14boo$169boobbo131bo12bobb3o118b o129bo3bo7bobo4boo$162bo6b4o145bo5bo11boo103bo131boob3o5bobbobb3o$160b 3o156b7o10boo103b3o129boo4bo4bobob6o$159bo3bo161bo171boo77bobbo9bobboo $144booboo10bobbo162bo110bo60boo78boo11b3o$144boo13bobbo160boo111bobo 152bo$144boobobo10boo274boo107bobbo$134bo12bobo394bo$132booboo11boo 394bo3bo$132booboo185bo21boo198b4o$132boo187bobo20boo60bo192bobo$134b oobo182boobo80bobo211bo$135bobbo181boo83boo163bo28bobo15bo$135bobbo 182b3o245boo46b3o$136boo111b3o70bo182bobbo60bobo$248bo74bobbo177bo51bo bo$247bo4boo73bo176bo3bo38bob3o4bobo20boo$143boo101bo3bo15b3o58bo176b 4o37boobo4bo5bo19boo$142bobbo100bobbo4bo4boo58bo5b3o112bo106boo4bobbo bbo$134b3o6boo101bo3bo3bo4b3obo47bo6bobo118bo113bobbobbo39boo$247boobo b3o52boobobo4bo109bo11b3o110bo4bo$134bobo113bo56bobbooboo113bo119bobbo 16boo$135bo115b4o20boo30bo5bobo4bo105b3o36bobbo80boo17boo$136bo116boo 11boboo5boo31boobbo8bo142bo$136boo128bobbo42bobb3obbo143bo3bo118boo$ 133boboobo12boo113b3o43b3o149b4o119boo$133b4oboo10bobbo121bo152bo$134b 5o12boo122bo4bo145boo$136boo136bobobbobo138b3o4boo157bo$274bobobo3bo 32boo105bo153boo7boo$273bo4b3obboo29bobbo103bo9boo142bobbo6bobo$278bob o3bo8b3o19boo114bo144boo$126b3o6bo141boo14bobo136bo128b3o4b3o$127boo3b oobo139bo4boobo9bobo121boo14bo133bobbo$126boo5bobo119boo13bo22bo4boo 111bo4bobo15bo132bo3bo$131b3obo119boo3b3o6bo22b3o3boo111boo5bo16bo124b o3boboobobo$134boo107bo16bobo5bobbo26bo30bo80bobo23bo129booboo$242boo 16bobbo4bobbo22b4o12boo17bobo105bo123bobo3b3o14boo$104bo136b5o14b3o6b oo24boo13boo17boo107bo123bo20bobbo$104bo7bo127bo21bo32bo143bo144boo$ 104bo5b3o126boo5bo14bo44boo132bo107b3o$103boo3bobo127b3oboo16bobo33bo 8bobbo132bo$109bobbo126boboboobboo11boo32bobo9bobo133bo109bo39bo$108bo bboo127bobbobboo13bo31b4o10bo135bo104bo3boo37bobo8bo$123boo117boo49b3o 92b3o36b3o14bo105bobo38bobo7bo$123boo119boobo47bo94bo35bobbo15bo101b3o 42bo8b3o$247bo141bo39bo16bo102bo46b3o$403boo24bo17bo76bo62boo7b4o$122b o10boo267bobo21bobo19bo75bo23boo36bobbo5b3obbo$122bo3bobo256boo17bo44b o74bob3o20boo36boo7bobbo$120booboboobbo249bo4bobo63bo75b3o20bo46boo$ 121b6obbo110bo138boo5bo64bo75bo13b3o5boo41bo4bobo$122bo5boo109bobo136b obo71bo74boo19boo40b5o3bo$125bobo110booboo55boo153bo74bo61b3oboobboo$ 112boo3boo6bo113bobbo12boo41boo154bo55bo6boo9boo13bo46boo4boo$106bo3b 4o3bobo121b3o11boo198bo53bobo3bo3bo22boo47bobobobo$106boboobbobbo3bo 121bobo212bo51bo3bobo3boo5booboo11b3o48bo$106boboo4bo3boo7boo113boo 213bo51bobobboboboo6b3o12bo22boo$110bo3bo12boo113boo214bo51bo3bobboo7b o12bo23bobo$115bo11boo330bo54bo4bo19bo3boo20bo$138bobo21bo193b3o101bo 54bobbo24boo$123boobbo10bobobo7bo12boo141boo50bo102bo32bo22bo22bo$124b 3o10bobboobo4b3o11boo76bo22boo41boo49bo104bo23b3o3b4o45bobbo$125bo12b oo3boboboobo90bo21boo106boo90bo22bobo3booboo44b3o$111boo25boo3boob5o 90boo127bobo91bo21b3obbo$111boo7bobo19boboo3boo89b3o110boo17bo92bo25b oo3bo$123bo17bobo16boo185bo4bobo111bo25b4o$123bo36boo135bo49boo5bo112b o25b3o10boo18boo$123bo117b3o52b3o14bo32bobo119bo37boo18boo$120booboo 114bo4bo50booboo13bobo153bo$121bobo115boo3bo51b3o14boo155bo$122bo118b 4o52bo173bo36boobo$237bobo57bobo172bo35bo4bo$228bob3o4bobo57b4o172bo 34bo5bo$168boo56boobo4bo5bo59bo173bo36bobbo$158bobbo6boo58boo4bobbobbo 234bo34bobboo19boo$145boobo6boobobboo71bobbobbo55booboo23b3o149bo24bo 7bobbo21boo$141bo3b6o4boobo4bo69bo4bo56bo5bo24bo150bo12boo9b3o6bobo$ 140bo5bo4bo3boo72bobbo63bo3bo24bo152bo10bobobo7b3o$140bo11bo4bo4boo50b oo14boo65bo41boo138bo9bo3boo5bo3bo$141bo9bo5booboo42bo3boo4b3o121bobo 139bo9boo8b4o6boo$146bo57boboobbo6bo103boo17bo140bo8b3o7boboo4boobbo$ 143bobbobbo54bobb5obb4o97bo4bobo159bo26boboo$134bo8boo3bo59b3o3b3o98b oo5bo160bo22booboo$130boobobo5boobo62b3o18bo85bobo58bo43b3o49bo12bo21b 3o$130bobbooboobbo66boo18bobo144b3o41bobbo41b3o3b4o12bo20bo$130bo5bobo 4bo63bo18booboo142booboo43bo41bobo3booboo12bo19boobbo$131boobbo8bo84bo 144b3o14bo29bo41b3obbo18bo6boo11b3o$135bobb3obbo84boo19bo125bo14b3o25b obo47boo3bo14bo5boo11boo$135b3o90boo19bobo123bobo11bo3bo75b4o16bo$249b oo124b4o9boobb3o75b3o10boo5bo14bo$226bo3bo147bo10bo3bo89boo6bo11b3o$ 194bo32bo3bo157bobbo99bo9bobbo$195boo31bo145booboo11bobo6boo92bo9bobbo $194boo27b3o5bo141bo5bo19boo93bo9bobo$213bo8bobbo3bo77boo65bo3bo116bo 8b3o$212bobbo5bo7b3o74bobo66bo120bo$206b3obbo3bo5bobbo64boo17bo188bo$ 140boo64b3obbo4bo4bobo59bo4bobo99boboo97boo5bo$140bobo67bo3boo67boo5bo 98b5o84bo12boo6bo$124b3o87boo66bobo104b4o74boo9b3o19bo$140bobo68boo12b ob3o174boo60bobobo7b3o20bo$128boo10bo85b4o160b3o14bo58bo3boo5bo3bo20bo $130bo96boo161b3o9bo4bo59boo8b4o22bo$124b4obo261bo4boo4bo5bo58b3o7bob oo23bo$124b5o85boo163boo14b3o4bo3boo97bo$148boo64boo163boobboo9b4o6bob oo98bo$148boo217b3o13boo7boobb3obo56bo6boo41bo$124bobo239bo3bo12boobb oo3boobobboo56bobo3bo3bo41bo$124bobo239bo3bo16boboboo6bo55bo3bobo3boo 42bo$125bo240bo3bo15bobbobbobbo60bobobboboboo43bo$124bobo99bo48boo67bo 42bo5b3o61bo3bobboo45bo$125boo99bo47bobo66boo22booboo13bo75bo4bo45bo$ 125bo131boo17bo65b5o21bobbo13bobo74bobbo47bo$251bo4bobo82bo19bo7bobo 13b3o76bo49bo$114bo110boo24boo5bo81boo5bo13bo8boo143bo$114bo33bo4bo96b obo86b3oboo8bobo5bo5bo3bo144bo$114bo8bo23bo6bo69b3o113boboboobboo3bobo 10bobobobo144bo$121bobo24bo4bo187bobbobboo5bo12bo150bo$115b3obbo3bo 218boo174bo$116bob5o110bo111boobo171bo$122bo110bobo112bo12b3o157bo$ 117boo114boo124boobbo97bo60bo$360b3o96bobbo60bo$226bo112b3o11bo7bo49b 3o48boo60bo$227boo109bobbo10bobo55bobbo32bo13boboobbo58bo$118boo106boo 109bo4bo9bobo58bo32bo14b3o3bo58bo$119boo19bo102boo92bobb3o10bo59bo32bo b3o11bobobbo59bo$138boo102bobo92bo5bo66bobo35b3o11bobboo61bo83bo$96bo 42boo103bo93b7o104bo9booboobo63bo82bo5b3o$95boboo120bo124bo104boo7b4o 9boo57bo80bobo3boobbo$99bo27bo91boo96bo26bo105bo7bobo10boo58bo80bo3bo 5bo$93bo3bobbo9boo14bobbo88bobo95b3o23boo17bo88boo80bo79bo3bo$91bo9bo 6b3o14bo3bo185boobbo40bobo170bo83bobboo$91bo4boobboo4b5o3boo10boo3bo 182boobboo40bobo84booboo82bo83boo11boo$100boo4boo6boo13bobo183boo44bo 86b3o84bo95boo$93bo5bo7bo18boo3bo184b5o127bo87bo$94bo4b3o23bo3bo190boo 215bo$95bo4boo7b3o14bobbo188bobbo216bo$97b4o10bo15bo191boo12boo138boo 64bo$111bo10boo209boo138boo65bo$118bo3boo349bobo65bo$118b3o351boob3o 64bo96boo$117boboo90boo123boo138boo65bo81bo13boo$120boo88bobo104b3o15b o139bobbo65bo70boo9boo$121boo89bo104bobo15b3ob3o25bo29bo78bobo66bo68bo b3o8boo$121b3o63bo129bo17b3obbo25bobo29boo25bobo48boo68bo67bo3bo10bo$ 117boobb3o63boo128bobbo18bo25bo3bo13b3o11boo17bob3o4bobo13b3o22bo80bo 67boobo5b5o$117b3ob3o62bobo129bobo44bo3bo8bo35boobo4bo5bo36bo82bo67bo 10bo$118booboo196b3o43bobob3o4boob3o34boo4bobbobbo16bo19b3o81bo$102boo 14b5o198boo43boobobbo5boboo40bobbobbo12bo3boo103bo$102boo16bo194b3o4b oo46bobo8bo39bo4bo16bobo105bo60bo$321boo14boo31boo11bobbo5boo23bobbo 19b3o109bo51b3o3b4o$336bo46b3o6boo24boo22bo110bo50bobo3booboo$333boobb oo215bo49b3obbo$333boo106boo112bo53boo3bo$442boo112bo53b4o$393bo48bo 114bo53b3o$110boo219bo60boo48boo114bo23bo$110boo12bo54boo140boo3b7o59b oboboo43boo116bo22bo5b3o49bo$122boo54bobo140boo3bo4boo60b3obooboo158bo 20bobo3boobbo47boo$70bo52boo55bo146boboo61bo3boobboo3boo154bo20bo3bo5b o45b5o$69b3o83bo175bo60bo3bo7boo26bobobboo123bo19bo3bo50bo19bo$68boob oo82boo171bobbo60bobbo10bo11bo4bobo6bobboobbo123bo23bobboo44boo5bo13bo $67boobobo81bobo171bobbo40boo13boo4bo23bobobboobboo7boobbo124bo23boo 11boo32b3oboo8bobo5bo$66b3obb3o254b3o41boo13boo28bob4obbobo5boobbobo 125bo35boo33boboboobboo3bobo$67bo6bo254boo46boo39bo6bobo138bo70bobbobb oo5bo$68b5obo254boo45boboo42bob3o140bo71boo$69b4oboo23b3o227boo29bo15b o8b3o180bo35bo36boobo20boo$74bo23bo3bo256b3o15bobbo5boo181bo33b5o36bo 12b3o5boo$73bo12boo11boo257booboo17bo189bo32bobb3o46boobbo$86boo13boob oo251boo3bo15boo46bo144bo26boo8boo46b3o$103boo253bobobobo12bo47bobo 144bo32bobbo48bo$359boobobbo59bobo126bo18bo21bo9b3o56b3o3bo$71bo290boo bo60bo126bobo18bo10boo9boo7boo57boboob3o$69boobo74boo188bo25boo210bo8b ob3o8boo64boo3bobb3o$146bobo187bobo214bobbo3bob3o11bo7bo3bo10bo68boboo boo$72bo75bo186bo3bo13b3o38b3o24boo132bo4bo16bo7boobo5b5o6boo63bobboo$ 69bobbo21boo27bo211bo3bo8bo45b3o14boo7boo134boboobobo14bo7bo10bo6bobbo 59booboo$70bo23boo27boo210bobob3o4boob3o41bo3bo7bobo4boo8bo11bo15bo 106boo3bo16bo23booboo$122bobo211boobobbo5boboo42boob3o5bobbobb3o19bobo 13bo108bo15boo4bo21bobo40boo4bo$75boo263bobo8bo42boo4bo4bobob6o18bobo 13b3o122boo5bo19boo42boo3bobo6boo$68b3o5boo262boo11bobbo40bobbo9bobboo 19bo147bo18bo3bo26boo15booboo4b3o$75boo276b3o42boo11b3o6boo161bo18bobb o25bo17boobbo4bobbo$62b3o10bo336bo7boo162bo4boo11b3o26bobbo15boboo5boo $61bo3bo519bo3boo38boob4o14bobo$60bo4bo520bo14bo26bo22boo$59bo3bo378bo 144bo13bo26bo3b3obbo12bobo$59bobbob3o355bo18bobo138boo4bo9boo28bobbobb ob3o11bobo$59bo7bo352boobbo16bobo121bo16boo5bo8boo10bo19boo4b3o11boo$ 61bo3bobo352bo4bo16bo9bo112b3o22bo7bobbo7boo21boobobo$61bo3boboo46boo 304boobbobboo21bobo103bo6bo3bo22bo7b3o6b5o20boobo$63b3oboo45bobo305bob oobboo21bobo103bo3b3o4bo23bo7bo6bo19bo8bo$116bo303b4o13boo13bo104bo3b 3oboboo24bobo10boo5bo13bo$342boo76b3o13boo123boo3bo27boo9b3oboo8bobo5b o$342boo56boo13boo21bo8boo157boboboobboo3bobo$400boo13boo29bobbo97bo 59bobbobboo5bo$405bo41boo98bo61boo$404boboo4bo134bo8bo54boobo$43bo20bo bo321bo15bobbo4bobbo138bobo57bo12b3o$42b3o22bo319bobo15boboo5boo132b3o bbo3bo67boobbo$41booboo17bobbo319bo3bo15boo141bob5o70b3o$42b3o17bobo 285boo34bo3bo13bobo148bo71bo$43bo17bobbo285boo34bobob3o12bo144boo$43bo bo16boo323boobobbo$43b4o344bobo$46bo12boo330boo$24bo3boobboobo23boo22b oo289bo$24bo3boo4boboo4booboo35bobo288bobo5bo148b3o$24bo3boobbooboo4bo 5bo36bo294booboo44boo121b3o$28boo12bo3bo326b3obbo3boo43bobo104boo15b3o 61boo$26bobbo13bo335booboo45bo106bo12bo4boo59boo$26bobo350b4o147b4obo 13bobo3bo$5bo21bo30boboo468b5o13boo3b3o$6boboobobo43b5o486boo3bo$3o3b 4o3bo43b4o294b3o193bo21bo$6bobbooboo501bo14bobo14bo3bo21boo$5bo52b3o 292bo5bo151boobobo7bo5bobo14bobo22bobo$3b3o52b3o292b7o151bobbooboobboo boo5bo91boo$3b3o37boo14bo295bo155bo5bobo5bo4bobo90boo$24b3o16boo310bo 3bo17boo133boobbo8bo5boo$23bobbo327bo21bo139bobb3obbo6bo$23bo309bo21bo 14bo3bo141b3o$23bobbo305b3o21bo4bo8bob3obbo111bobo$23bobbo304bobobo20b o4bo8boobo115bobobo7bo$25b3o302b3ob3o12bo5boobobo11bo4bo18boo90bobboob o4b3o$24bobo321bobo3bobo15bo4bo17bobo91boo3boboboobo44bo$24bo26boo279b ob3o13boo3bo16bo24bo91boo3boob5o10b3o29booboo$26bo24boo279b5o9bo3bo21b o3bo116boboo3boo10bobo29b3oboo$20b3o4boo303boobboo11bobboo19b3o116bobo 16booboo15boo12b5o$19boboo6bo304boboo14bo158boo18boo13b3o$5bobooboo7bo boo5boo306boo9bobboo195bo$4b5obboo7b3obo3bo303bobobbo11bo27boo$4bobb3o bo8boo5bo303bobobbo40boo8bobo124bo$10bo12bobboo304bo56bo124bo$23boobo 3boo354boboo$25bo361bo5boo113b3o$392b3o112bo3bo27boo$347boo43b3o111bo 4bo27boo$11boo377boboo102boobo5bo3boo3bo$11boo334boo41bobo99bo3b6o11bo $391bo99bo5bo4bobboo6b3o$22bo325bobo140bo11bo$22bo326bo142bo9bo$23bo 313boo10bo147bo$337boo158bobbo$22boo475bo$20bobbobo$20bo4bo$20bo478boo $21b3o475boo$$345boo$345boo! CB 1,1,1,1 golly-2.5-src/Patterns/Life/Spaceships/Cordership-boat-burner.rle0000644000175100001440000002132212156145314022020 00000000000000#C diagonal period 576 c/12 spaceship in which a glider consumes #C boats laid down by Cordership puffers: David Bell, 29 Feb 2004 x = 619, y = 638, rule = B3/S23 115bo$115bo$117bo5bo$116bo6bobo$115bo3bobbo$116bobboboboo$121boboo$ 135boo$135boo6$123bo$122bobo18boo$122bobbo17boo$123boo$$90bo11bobo14b oo21bo$89boo10bobbo14boo20boo$88boboo10bobo35boboo$88bobboo47bobboo$ 86b4ob3o17boo25b4ob3o5boo$85bobbobobboo9bo5bobbo23bobbobobboo4boo$86bo bobob3o8boboo4boo15bo9bobobob3o$87boob3obo8boboo20bo11boob3obo$87b4obb obo6bo3bo32b4obbobo$90bo3bo8b4o35bo3bo$90bo3bo8b3o36bo3bo$90bobbo48bo bbo$117boo3boo$106bo13bo$106bo9boob3oboo$106bo9b3obob3o$91boo50boo$ 108bo35boo$107bobo32b5o$108bo33b6o$143boobbo$96boo47b3o$95bobbo45bo$ 88b3o4bobboo44bobo$94bobboo43boobbo$94b4o31bo13b3o$128bobo$127bo3bo7bo $127bo3bo5booboo11boo$127bobob3o6bo12boo$128boobobbo4b3o$94boo36bobo$ 94boo36boo4$161boo$156boo3boo$155boboo$102boo50boobobo$102boo50bobbob oo$123bo34boo$122bobo26bo3b4o$93bobo25booboo24bo$84bob3o4bobo25boo27b 3o$82boobo4bo5bo30boo$84boo4bobbobbo24b3obbo$90bobbobbo13boo13boboo$ 89bo4bo15boo11bobbo$85bobbo16boo19bo$86boo17boo17boo$$124bo$122booboo$ 119bobo3bo$118bob3o$118bobo3bo$113boo$113boo$100bobobboo$86bo4bobo6bo bboobbo$85bobobboobboo7boobbo$85bob4obbobo5boobbobo$86bo6bobo$90bob3o 193b3o$297bo$80bo8bo200boo5b3o$76b5o7boo200b4o4bo$76bo3bobo4b3o200boob 3oboo$76b3o3b3o3b3o204bobo$82boobb3o220boo$82bo226boo$79b3o$63bobo13b oo$54bob3o4bobo69bo$52boobo4bo5bo67bo$54boo4bobbobbo67b3o$60bobbobbo 230bo$59bo4bo12bo218bobo18boo$55bobbo16booboo216bobbo17boo$56boo17boob oo217boo$76bo$79bo196bobo14boo$77boo184b3o10b3o14boo20b3o$78bo183bo13b oo36bo$262bo3bo47bo3bo$76bo183boo3boo18boo25boo3boo6boo$73bo185bobbobo bbo11bo4bobbo13bo9bobbobobbo5boo$72b3o184bobbobobboo8bobo5boo15bo8bobb obobboo$71boobo3bobo180booboobbo8b3o20bobo10booboobbo$56bo4bobo6boo6b oo182bo4bo12bo33bo4bo$55bobobboobboo3boo8bo185booboo6b5o36booboo$55bob 4obbobo5bo192b4o48b4o$56bo6bobo199boo50boo$60bob3o12bo213boo3boo$78bo 212bobbobbo$279b3o8boob3oboo$75bobbo186bo25bo5bo19bo$266bo51bo$63boo 164bo35bo16bo33bobbo$63boo160boobobo7bo42bobo35bo$225bobbooboobbooboo 42bo33boobbo$225bo5bobo5bo77bobboo$226boobbo8bo30boo43bo3boo$74boo154b obb3obbo24bo5bobbo$74bobo153b3o15boo13bo5bobbo42bobb3o$75bo43bo128boo 13bo4booboo44boboo$118bo150boo46boo$118b3o181b3o$302b3o7bobo$73bo227bo 3bo5bobbo12boo$74bo227boob3o4bobo7bo4boo$74bo7boo218boo4bo5boo6bo$82bo bo171boo10boo35bobbo$83bo161bo3boo5boo10boo36boo$93b3o137bobbo6booboob oo$63b3o27bo142b3o3bo7bo$94bo133boo3boob4o3bo6boo$67bo160boo9boo4boobb oo84boo$63bo3boo12bo163boobboo79bo4boo$65bobo13boo7boo237boboo$62b3o 16bobo6bobo138b3obo40boo51bo3bo$64bo26bo130bo9boo42boo51boobbo$80boo 136b4oboo4boobo96booboo$63boo16boo134boob3oboo3b3o64b3o27bo3boo$64boo 14bobbo134bob3obo42boo27bobo25boo$64bo15b3o5boo129bo3b4o4boo24bo3boo4b 3o26bobo26boo$64boo22boo132boob3o29boboobbo6bo25bo4boo$63boo33boo123b 5o29bobb5obb4o24b3o3boo$98bobo98bo24bo36b3o3b3o14boo15bo$99bo95boobobo 7bo51b3o21boo11b4o$195bobbooboobbooboo50boo17boo17boo$195bo5bobo5bo10b o39bo18boo17bo$196boobbo8bo9bobo$79boo119bobb3obbo90bo$78bobbo14boo 102b3o18boo74bobo$78bobboo9bobboboo119b3o75b4o$79bo3bo8bo5boo192b3ob3o $57bo13boo5bobbo10bobob3o4bo188boo4bo$57bo11boboobob4oboboo11boo4bo 184boo$57bo11b4o3b4obo3bo10boo4b3o182boo$60boo8bobboobbobb4obo130bo49b o8boobbo$60boo13bo4bobo132b3o47bobbo5b3obboo$55bo3b3o16b3o133b3obo40b 3obbo3bo6boobb3o$56b3o18bobo133bo4bo40b3obbo4bo5boobboo$57bo25bobo117b obbo10bo45bo3boo$33b3o20boo26bo121b3o3boo6bobo44boo$56b3o139boo3boob4o 10boo42boo$37bo20bo139boo9boo10bo38bobo$33bo3boo12bo4bo194bob3o4bobo$ 35bobo13boo5bo33b3o154boobo4bo5bo$32b3o16bobobb3o33bobo110bo45boo4bobb obbo$34bo57bobo14boo146bobbobbo$50boo40bo4boo9bobbo144bo4bo$33boo16boo 38b3o3boo10b3o140bobbo$34boo14bobbo43bo12boo94boo29boo14boo$34bo15b3o 40b4o13bo95boo19bo3boo4b3o70bo$34boo58boo12boboo115boboobbo6bo67boo$ 33boo59bo13b4o115bobb5obb4o68boo$108bobobo118b3o3b3o$95bo13booboo3boo 111b3o18bo$93bobo12bo3bo4boo111boo18bobo$92b4o13b3o118bo18booboo$92b3o 15bo141bo$49boo43bo156boo$48b3o200boo$48bobbo56boo$49b3o55bobbo105boo 31bo3bo$38boo9b3o54bo109bobo31bo3bo$38boo65bobbo108bo33bo$105bo23bo 116b3o5bo$105b3o21bo106bo8bobbo3bo$86bo10bobo135bobbo5bo7b3o$85bobo8bo bbo129b3obbo3bo5bobbo$84booboo7bobb4o126b3obbo4bo4bobo$84boo10bob5o4b 3o123bo3boo$46boo42boo5b3obo7bo127boo$46boo36b3obbo18bo125boo12bob3o$ 88boboo157b4o$86bobbo40boo118boo$62b3o24bo40bobo$62bobo22boo42bo105boo $23bo38bobo14boo156boo$22boboo36bo4boo9bobbo5bo$26bo34b3o3boo10b3o3boo boo58boo$20bo3bobbo39bo12boobbo3bo59bobo$18bo9bo11b3o20b4o13bo3bo64bo 98boo$18bo4boobboo35boo12boboo3bobo50boo108bobo$27boo35bo13b4o56bobo 108bo44bo$20bo5bo51bobobo56bo152boo$21bo4b3o36bo13booboo49boo158boo$ 22bo4boo12b3o5boo12bobo12bo3bo49boo114boo$24b4o12booboo4boo11b4o13b3o 52bo$39boboboo17b3o15bo166b3o$39bo3bo20bo191boo$40bobbo102boo108bobo$ 40b3o103bobo108bo$147bo120boo$19bo57b3o187boo$19bo5b3o29boo19bobo188bo $18bobo3boobbo28boo18bobbo$19bo3bo5bo47bobbo$19bo3bo8bo34boo8bobo$24bo bboo3bo34boo8bobbo$25boo5bo3bo41boo$35bobo41bo$36bo112boo$23bo41boo81b oo$22bobo40boo83bo$22bobo$23bo51boo195boo$75boo195bobo$3bo269bo$4o27b 3o250boo$34bo248boo$33bo39bo51boo137boo19bo$18boo52bo53boo136bobo$3bob o12boo11bobo40bo50bo139bo$4bo55bobo$bboo10boo17bo26bobobo6bobo$bbobbo 7bobbo17bo24bobboobo4b3o$booboo8bobo14b3o26boo3boboboobo$15bo44boo3boo b5o$46bo17boboo3boo$45b3o15bobo$44boobbo$43boobboo$44boo$45b5o$49boo$ 47bobbo$48boo43boo$6boo86boo100boo$6boo85bo102bobo$23bo173bo$22boboo 19b3o$26bo18bobbo$20bo3bobbo17booboo$18bo9bo17bobo$18bo4boobboo6boobo 3boo$14boo11boo5bo4bo3bo$14boo4bo5bo7bo5booboo$21bo4b3o5bo4bo3bo$22bo 4boo6bo3bobbo$24b4o8booboo$38bo$$61boo$22boo38boo$22boo37bo323bobo$46b oo336bo$46boo8b3o326bobbo$56b4o327bobo$55bobboboo328bo11b3o$55bobooboo 327b3o$55bo4bo328bo$57bobbo326boo$57b3o329bo13b3o$54boo331bobbo12b3o5b oo$54boo331bobo13boo6boo$387bo14bo$400boobbo$401bo3bo9bo$312boo87bobbo 10bo$312bobo87b3o7bo$313bo94boo6bo$409b4o$202bobo208bo3bo$201bo195bo 16bo$202bobbo190bobo16bobo$204bobo184boobbooboo4b3o9bo$207bo11b3o169b oobb5o4b4o$206b3o190bo3boobboo$206bo170b3o17bo6boobo$204boo175bo15b3o 4b3o$206bo13b3o158boo14b3o5bo$204bobbo12b3o5boo151bobbo$204bobo13boo6b oo152bobo$204bo14bo162bo$217boobbo133bobo23boo11boobo$218bo3bo9bo11boo 108bo25bobo12boo$218bobbo10bo11bobo108bobbo23boo$219b3o7bo15bo111bobo 19boo$225boo6bo126bo11b3o6bo$226b4o129b3o$230bo3bo124bo$214bo16bo125b oo$213bobo16bobo124bo13b3o$208boobbooboo4b3o9bo123bobbo12b3o$208boobb 5o4b4o132bobo13boo$216bo3boobboo131bo14bo$194b3o17bo6boobo145boobbo$ 198bo15b3o4b3o147bo3bo$198boo14b3o5bo148bobbo$198bobbo170b3o$199bobo$ 199bo$172bobo23boo11boobo54boo$171bo25bobo12boo54bobo$172bobbo23boo68b o$174bobo19boo163boo$177bo11b3o6bo162boo$176b3o$176bo77boo$174boo68bo 3boo4b3o$176bo13b3o51boboobbo6bo$174bobbo12b3o51bobb5obb4o$174bobo13b oo56b3o3b3o$174bo14bo57b3o119boo$187boobbo55boo17boo101boo$188bo3bo54b o18boo$188bobbo168boo$189b3o168bobo$361bo3$381boo$274boo105boo$178boo 94boo$178boo73bo8boobbo$252bobbo5b3obboo111bo$246b3obbo3bo6boobb3o109b 3o$246b3obbo4bo5boobboo109b4o$250bo3boo124bobo$254boo124boo$251boo126b obo$186boo59bobo125booboo$186boo50bob3o4bobo126b3o$236boobo4bo5bo41boo 83bo5bo$238boo4bobbobbo41bobo88bo$181b3o60bobbobbo42bo$180bo62bo4bo$ 180bo3bo54bobbo$178boo3boo39boo14boo140bo$177bobbobobbo28bo3boo4b3o$ 177bobbobobboo27boboobbo6bo51bo$179booboobbo27bobb5obb4o50boo7boo$180b o4bo32b3o3b3o51bobo6bobo$183booboo29b3o18bo49bo$182b4o31boo18bobo$183b oo13boo17bo18booboo$198boo39bo$238boo$238boo$183bo111boo$184bo51bo3bo 54bobo19boo$183bo53bo3bo54bo19bobo$238bo78bo$206boo25b3o5bo$206boo15bo 8bobbo3bo$222bobbo5bo7b3o$181bo16boo16b3obbo3bo5bobbo60bo$181bo34b3obb o4bo4bobo60boo7boo$170bobo8bo3bo34bo3boo68bobo6bobo$170b3o11bobo37boo 78bo$170boo13bo35boo12bob3o$214boo20b4o$214boo21boo$173bo$171bobo50boo 182boo$171b3o50boo68bo113bobo$174bo119boo113bo$170b5o118bobo$154b3o$ 163bo58boo$156boo5b3o14boo40boo12bo$156b4o4bo14bobbo53bo$156boob3oboo 15boo$161bobo$235boo$$214b3o17b3o$214bobo$175boo37bobo$175boo37bo4boo$ 213b3o3boo$171boo46bo42bo77boo$170bobbo41b4o43boo76bobo$165boo4bobo42b oo43bobo77bo$168bo3bo43bo$158bo4boo4boo252bo$158bo3boo6bo46bo204bobo$ 158bobb3obboobbo10b3o9b3o16bobbobo204boo$166boobo10bo12b3o14b3ob4o$ 180bo3bo7bo3bo7bobo4bob4o$178boo3boo8boob3o5bobbobb3o3bo$177bobbobobbo 7boo4bo4bobob6o$177bobbobobboo9bobbo9bobboo$179booboobbo10boo11b3o$ 163boo15bo4bo25bo$163boo18booboo$182b4o$183boo45bo$230boo133boo$229bob o132bobo$365bo$$171boo$171boo$195boo$195boo7$203boo251boo$203boo251bob o$457bo15$388boo$388bobo$389bo$$471bo$470bobo$470boo11$413boo$412bobo$ 413bo12$504boo$504bobo$505bo15$436boo$436bobo$437bo$$519bo$518bobo$ 518boo11$461boo$460bobo$461bo12$552boo$552bobo$553bo15$484boo$484bobo$ 485bo$$567bo$566bobo$566boo11$509boo$508bobo$509bo12$600boo$600bobo$ 601bo15$532boo$532bobo$533bo$$615bo$614bobo$614boo$$616b3o$616bo$617bo 7$557boo$556bobo$557bo29$580boo$580bobo$581bo! golly-2.5-src/Patterns/Life/Spaceships/Cordership-LWSS-freeze-tag.rle0000644000175100001440000004307512156145314022430 00000000000000#C eight p384 c/12 forward rakes playing Freeze Tag with an LWSS #C to produce a p384 spaceship: David Bell, 5 June 2005 #C (adapted from a previous version from 29 February 2004) x = 642, y = 598, rule = B3/S23 7bo$6boo$6bobo$bb3o$bbobbo$bbo$bbo$3bobo20$33boo$33bobo$33bo4$26bo$25b oo$25bobo8$39bo$38boo$38bobo$15boo$14boo$16bo10$314b3o$314b3o$$314bob oo$314bo3bo$316b3o$71bo259boo$70boo259boo$70bobo$$315bo$314bobo$315bo$ 314boo$314boo23boo$315bo23boo$313boboo$58boo254boboobo9boo$57boo255bo 4bo$59bo257bobo3$308bo19boo$307bobo17bobo$307bobo16b4obo$51b3o253bobbo 15bob6o$51bo174bo7bo73bobo14boob7o$52bo172b3o5bobo75bo14b3o3bobo$224b oob4obbobbo73boo$225b3obbo79bo$68boo156bobboobbo$67boo161boobobo$69bo 164bo10boo$97boo146boo61bo$97bobo207bobo$97bo211bo$309bo$309bo$$90bo 219bo$89boo162boo51boob3o$89bobo138bo22boo53b3oboo$229b4o6boo59bo9bobo $228bo4bo4b3oboo65boo$227boo10boob3o51bo7bo4b3o$228boboboo4b3oboo52bo 8bobb3o$229b3o6boo55bo4boo3bobb3o8boo$230bo65bobo6bobboobbo6boo$296bob oo10bobo$103bo114b3o6bo82b3o$102boo113bo4bo3bobo72bo$102bobo112bo4boo 3bo$79boo136bo6bo$78boo138b3obobbobo$80bo141b5o100boo$227bo99boo$$321b o$319boobo$317booboboo33boo$289bo29bo37b3o$288b3o24bobo39boobo$287bobo bo69bo13bo$286b3ob3o22boo36bo3boo3bo12bo$224bo75boo6bo54bo11bo$224bo 63bob3o6bo7bo52bobo$224boo62b5o6bo3bo3bo52bo$227bo60boobboo5bo3bo51bo 4bobo13bo$211bo13booboo35b3o22boboo5bo74booboo4boo$208b4o13boobbo34bo 3bo23boo6b3o56b4o20boo$135bo88bo4bo34bo3bo19bobobbo65boo12bobo$134boo 87boobobo35bo3bo12b3o3bobobbo80bo3bo$134bobo82boo3boboo5boo46b3o4bo84b oobbo9boo$211bobo7bobo9boo30booboo9boo4bo88b3o9bo$212bo53bobbo9b3obobo 89bo5bobbo$210boo55bobo10boo3bo95bobb5o$210bobbo54boo10b5o96boob4o$ 209booboo51bo3bo12bo104boo$264bobobobo116b3o$265bo102b3o16b3o$363boo3b obo6bo$122boo111boo126boobbo3bo3booboo$121boo112bobo42boobbo65bobo14bo bbobo6bo$123bo110boobo111bo25bo3bo$235boboo41bo3bo65bobbo15b3o4b3o$ 235b6o39bo71bobo15bo$236b3oboo39bobo71bo$237bobbo113b3o$178boobo55b3o 41b3o70bo12bobbo$115b3o59b3obo6bobo12b3o64boo80boo13bobbo$115bo60bo4bo bo4bo38bo42boo31bo50bo12boo$116bo60boo6bobo3bo15boo18bobo22boo49bobo 46bobbo$178bo3bobbobboo19bo17boo26boo4bo41boo47bobo$181boboo3bo14b4obo 43boob4o3bo89bo$132boo46bobo20b5o41b5o4b4o$131boo47bobo69b3o6bo86bo$ 133bo119bo93b3o$161boo40bobo46b3o23boo66booboo$161bobo39bobo53bo12boo 4boo65boobobo$161bo42bo54bo12boo70b3obb3o$203bobo139bo6bo10boo$204boo 140b5obo10boo$204bo142b4oboo$154bo43boo152bo$153boo30bo9bob4o150bo$ 153bobo24bo3b5o5boobo3boo$179bobo7boo4bobbooboo77boo$179bo7boboo5b6o 78boo$180bo8boo6bo72bo78bo21boo$181bo3b4o79boobo75boobo20boo$186b3o65b oboobo9boboo140b3o$253bo4b3o10bo78bo62bobo$254bo5bo86bobbo61bo3bo$167b o20bo66bo3bo88bo63bo3bo$166boo19bobo66bobo153bo17boo$166bobo18bobo58bo 104boo57bo4boo11boo$124bo18boo43bo54bobbobobbo3bo98boo56bo6bo$123bobo 16boo99bo4boob5o90bo6boo58bo5bo$144bo98bo3bo4bobo83bo6boo6bo59boo$123b obbo207b4oboo74bo3bo$125boo118b3o85boob3oboo74bobo10boo$126bo69bo25boo 22bo87bob3obo89bo$140boo53bobo13bo13boo4bo55bo47bo3b4o4boo80b3o6boo$ 140boo53bobo13bobo8boob4o3bo54bobo48boob3o69b3o22boo$196bo14boo6b5o4b 4o55boo50b5o68bo3bo13bo$222b3o6bo83bo24bo72bobbo14bo$123boo98bo87boobo bo7bo90boo13boo$125bo96b3o86bobbooboobbooboo$124boo103bo13bo67bo5bobo 5bo10bo$123b3o15bo62bo24bo14bo67boobbo8bo9bobo88bobo$123boo16boo5boo 53bobo36bobbo70bobb3obbo100b4o$122b3obo14boo5boo53bobo39bo70b3o18boo 85bobboo$123bo3bo10boo64bo9bo27boo90b3o70bo15b3o$125bobbo10bo73bobo27b o162bobo16b3o$125b3o12bo58bo13bobo27b4o4boo152booboo9bo$126boo70boo14b o29bo112bo47booboo6bo3bo9bo$198bobo43bobobbo105boo47b3o9bo13boo$209boo 33bo4bo82bo23boo46b3o3bo8bo9bobo$134boobboo68bobbo28bobbo3bo83b3o70b3o 4bo5bo$117bo15b3obbo70boo27boobobo3boo81b3obo70boo5bo$117bo16boobbo85b oboobo9boobobboo82bo4bo70b3o$117bo16booboo84bo4b3o9bob3o74bobbo10bo72b oo$118boo16bo4bo82bo5bo10bo80b3o3boo6bobo68boo$118b3o20boo82bo3bo11b3o b3obbo63boo3boob4o10boo$118boo20bobo83bobo14bob5o64boo9boo10bo$186boo 57booboo157bo$94bo90boo219b3o$93bobo91bo112bo20bo83bo3bo$230boo67bobo 107boo$93bobbo20bo43boo67boo14bo51booboo105boo$95boo21bo42bobo77bo3bob o50booboo$96bo20bo44bo78bo3bobo49b3o22boo$110boo185b3o3bo12boo4boo83bo bo59bo$110boo67b3o58booboo52b3o4bo11boo80bob3o4bobo58bobo$179bo91bo26b oo5bo90boobo4bo5bo7boo$116bo63bo59boo29bobo24b3o97boo4bobbobbo7boo48bo bbo$93boo20b3o121bo3boo26boo26boo103bobbobbo59boo$95bo18boobbo50boo68b o3bo56boo101bo4bo62bo$94boo17boo46b3o5bobo24boo42bobo72boo82bobbo82boo $93b3o15b3o47bo8bo24boo44bo158boo83boo$93boo16boo49bo34bo102bo14b3o6b oo$92b3obo14boo112boo22boo48b3o13bobo6boo$93bo3bo11bobo113bobo21bobo 46bo3bo123boo40boo$68b3o24bobbo11boo113bo24bo51boo13bo108boo42bo$66b7o 6bo15b3o14bo188boo13boo151boo$65b9o4bo17boo12bobbo148boo204b3o15bo$64b o7b3obboo34bo148bobo203boo16boo5boo$65b3o6bo3bobbo28b3o45b3o57bo43bo 48boobo26bo125b3obo14boo5boo$66boo11b3o78bo56boo92bo3bo23boo73bobobboo 47bo3bo10boo$69bo10bo27bo50bo57bobo89bo4bo25boo72bobboobbo48bobbo10bo$ 70bo18boo15bobo184bo15bo4bo74bo15bo11boobbo48b3o12bo$71bo17boo17bo182b ooboo15boo73b4o13bobbo8boobbobo49boo$98boo5bobo204bo$98boo5bo188boo20b oo80bob6o$105bobo187bo19bobo79bobb3obbo73boobboo$106boo181bo3bo23bo71b obo9bob3o56bo15b3obbo$293bo3bo92bo8boobboo57bo16boobbo$231bo38bo91boo bbo21boo10boo60bo16booboo$89b3o5boo131boo37bobo93bobo20bobbo8boo61boo 16bo4bo$86boobobo5boo131bobo35booboo18bo72bo16bo5booboo71b3o20boo$86bo bbobo14boo99boo59booboo19b3o86bo81boo20bobo$75boboo5b3o19boo98boo59b3o 96boo13bo$69boo4bobo3booboo122bo58b3o3bo12boo$69boo6boob3obbo40b3o138b 3o4bo11boo4bo74boo12boo$128bo139boo5bo14bobbo72bo13bobbo$62bo9bobbo51b o140b3o18bo3bo70booboo11bobo79bo$71bo3bo123bo69boo96boo10boo80bobo$58b o7bo8bo107booboo6boboobboo68boo20boo71bo13bo81bobbo$58bo8bobbo3boo107b oo8bob5o85boobb4o89boo$57bo4boo3bo3boobo108boobobo5bo4boo181boo$45b3o 10bobo6bo118bobo11bobo67bo14b3o94boo76bobbo$44bo13boboo125boo80b3o13bo bo91boobo77boob3o$44bo3bo151b3o6boo57bo3bo107b3o79boobbo$42boo3boo14bo 145boo61boo13bo93bo81bobbo$41bobbobobbo221boo13boo175bobo$41bobbobobb oo235boo$43booboobbo159bo193bo50bo$44bo4bo159b3o73boo82boo33bobo44boob obo7bo$47booboo157boobo72b3o81boo33boo45bobbooboobbooboo7boo$46b4o44b 3o186b3o39bo125bo5bobo5bo7boo$47boo47bo120boo64bo39boo27bo99boobbo8bo$ 95bo120bobbo104boo25bobo5bo96bobb3obbo$217boo55boo6b3o72booboo94b3o$ 44booboo154boboo4boo61boo6bo68b3obbo3boo$22boobbo17booboo153bo3bo75b3o 72booboo$25bobo15booboo155bo153b4o16boo$24bo16bo3bo159b3o163boo4boo 102boo$41bo165b4o160boo108boo$26boo12bo4bo143b3o16bobo14boo$33bo5boobb obo143b3o16bobo13bobbo22boo$o26boo3bobo4b3o148bo34boo22boo31boo$o25bo 5bo3bo8bo145boo58bo30boo187bo3boo$ob3o19booboo4bo7boboo147bo106boo168b oobooboo37b3o$bb3o22boo6bo3boboo148bo41bo64boo168bo7bo37bobbo$3bo13b3o 5bo10bo3boo190bobo65bo78boo61b3o24bo6boo39bo$3boo34bo22b3o167bobo58boo 84boo61bobo15bo10boobboo37boo15boo$4bo59bo102bo65bo59bobo68b3o75b3o9b oo3bobo9boobboo36bobo15boo$4boo13bo43bo103bo21boo52b3o48bo59b4o4b4oboo 86bo3boboo51bobb3o$18boo147bo21boo37boo13bo110boboboo4boobbo92boo52boo bbo$booboo11b3o26boo122boo18bo36bobbo13bo110boo9b3o75boo12b3o54bo3bo$ bb3o12bo28boo7boo113boo12boo42boo127bo3bobo78booboo7boob4o55bobo10bobo $bbo12bo38boobboo105bo3b3o11b3o4boo228bo21boobboo7bo62bo12bo$15bo3boo 33boob3o106b3o15boo4bo69boo156booboo18boo3boo7bobo57bobbo16bo$19boo32b oobo110bo15boo6b3o65boo40boo42bo74bo21boobboo8bo58bo13b3o7boo$16bo37bo b4o106boo15b3o5bobbo66bo39bobo41bo5b3o81boo6bobo84boo7boo$17bobbo34bo 4bo87bobo15b3o16bo6boo14b3o78boo11bo41bobo3boobbo79bobbo76boobbo11boo$ 17b3o37booboo86bobobo7bo7bo14bo8bo17bo78bobo53bo3bo5bo65boo11booboo76b 3o13boo$147bobboobo4b3o5bo16boo24bo79bo55bo3bo70bobbo11bo96bo$148boo3b oboboobo7bo15bo165bobboo33bo30boo3bo10b3o$148boo3boob5o5b3o182boo35bob o28bo4bo105bo$152boboo3boo161bo65boo29bo3bo104bobo$6boo143bobo128bo26b o11bobo5bo90bobbo103bo$6boo118boobo151boo24boo18booboo89bo104boo$125b 3obo6bobo142bobo24boo11b3obbo3boo193b3o$124bo4bobo4bo190booboo105bo70b o17bobbo$125boo6bobo3bo41bobo62boo79b4o102bo3bo69b3o10bo6boo$126bo3bo bbobboo11bo31bobbo51bo3boo4b3o92boo91bobbo69bobbo6bobbo$129boboo3bo11b 3o30bobbo51boboobbo6bo91boo91booboo68b3o6bo3bo9boo$128bobo17bobbo15boo 12bo3bo50bobb5obb4o185bobo69b3o7bobo11boo$14boo112bobo16bo4bo14boo13bo bo55b3o3b3o187bo69boboobo7bo10bo$14boo132bo34bo55b3o102bo162bobb3o$ 239boo17boo35bo48b3o77boo32bo48b4oboo$148bobbo87bo18boo34boo43bo3bo3b oo75boo32bobo47bob3o$149bobo142bobo41bo5bo3bo109boo50b3o$339bo8bo58bo 7bo95boo$145bo198boboo58b3o5bobo$144b3o28boo157b3o8bo59boob4obbobbo$ 143booboo27boo147b4o4b4oboo67b3obbo95boo$133bo8boobo5bo172boboboo4boo bbo68bobboobbo92boobo$128bo3b5o4boo6boo115boo57boo9b3o6boo64boobobo15b oo73b4o$127bobo7boobboo7boo113bobbo58bo3bobo10bobbo67bo10boo4boo75bo 65bobo$127bo7boboo127boo76bobbo78boo138bob3o4bobo$128bo8boo113bo6bo84b obo217boobo4bo5bo$129bo3b4o114b3o4b3o80b4o221boo4bobbobbo$134b3o114b3o 3boobbo79bobboo156boo3b4o61bobbobbo$250booboobbo3bo80b3o152b3obobbo6bo 7boo50bo4bo$251b3o3boboo68boo12bo157bobbobb5o7boo46bobbo16boo$251b3o3b oo15boo53boo170bobbo63boo17boo$135boo136bobbo63bobo91boo67bo$135boo 102bo34boo66bo4boo62bo22boo64bobo$239bo99bo7bobo22bo37b4o6boo79bo$239b o98boo7bo24bobo34bo4bo4b3oboo$236bob3obo39bo55bo3bo29boo34boo10boob3o$ 236bob5o38bobo55b3o67boboboo4b3oboo102boo$240bobo38bobo126b3o6boo106b oo66boo$237boo43bo128bo183boo$237boo47boo294bobobboo$238bo38boo6bobboo 109b3o6bo159bo4bobo6bobboobbo$213b3o22boo36bobbo9bo108bo4bo3bobo107bob o47bobobboobboo7boobbo$217bo21bo3boo32boo6booboo108bo4boo3bo107bo3bo 46bob4obbobo5boobbobo$217boo13bo6bo47boo109bo6bo81bo28bo4bo46bo6bobo$ 217bobbo11bo4boboo40bobo5bo109b3obobbobo78bo28bo4bo50bob3o$218bobo11bo 5bo41bobbo4bobo112b5o79bob3o12b4o9bo3bo$218bo61bo3bo3bo25boo92bo33bo 46b3o10bobo12bobbo41bo8bo$207bo9boo14bo47bobooboo25boo62bo7bo56bobo45b o9bo3b3o51b5o7boo$199b3o3b4o7bobo13bobo46b3obo29bo47boo11b3o5bobo55boo 46boo7b3o56bo3bobo4b3o$199bobo3booboo8boo11bo54bo76bobo9boob4obbobbo 103bo6bo4b3o52b3o3b3o3b3o$199b3obbo10boo14bobbo19bo101boo5bo12b3obbo 109boo6bob4o59boobb3o$204boo3bo7bo12boobo20boo100bobo18bobboobbo78b3o 35bo62bo$205b4o20b3o21bobo38bo62bo23boobobo80bo20booboo8bobo57b3o$206b 3o21booboo59bo90bo10boo69boo13bo6b3o10bo58boo$177bo52bobboo59bo101boo 69bobbo11bo6bo$177bo5b3o45b3o64bo12bo156bobo11bo$176bobo3boobbo45bo61b 3obbo10boo156bo$177bo3bo5bo105bo4bo11bo86b3o67boo14bo$177bo3bo111bo3bo 99b3o66bobo13bobo$182bobboo107b3o27boo77b3o62boo11bo$183boo11boo18boo 93b3o9boo76bo3bo59boo14bobbo$196boo18boo91boob3o10bo73booboboo61bo12b oobo$293bobo13boobbo39boo26bo17bo79b3o70bo13b3o$293bobo13booboo4boo33b obo24b4o6boo8boo78booboo67bo13b3o$199bo93bobo14bobo4bobbo32bo25bo4bo4b 3oboo85bobboo67bo14boo$198b5o90bobo15bo6boo58boo10boob3o4bo80b3o65bob 3obo10b3o$198bobb3o90boo83boboboo4b3oboo3b4o80bo66bob5o10bo$193boo8boo 175b3o6boo7boobbo150bobo$200bobbo20boo120bo34bo15bo4bo147boo$190bo9b3o 21boo119boo49booboboo103bo43boo23boo$180boo9boo7boo143bobo47b4o106bo 45bo23boo$179bob3o8boo114b3o15boo67b4o71boo33b3o43boo$179bo3bo10bo112b o3boo12bobbo69boo70boo80bo3boo$180boobo5b5o6boo124boo56boo13boo151bo$ 181bo10bo6bobbo104bo76boo12bo54bo90boo4boboo$198booboo105bo3bo88boo50b o7bo89bo$197bobo109b3o82b3o4bobo49bo5b3o81bo3bo$196boo97boo104bo50boo 3bobo88bo$196bo3bo95bobbo4bo54bo32bo4bo28bo31bobbo79bo7bo$197bobbo92bo bb3obobbobo28boo22boo32bo33bobo28bobboo16boo60bo4bo30bobbo$184boo11b3o 93bobbo4b4o28bobbo21bobo35boo28boo44boo4boo61bobobo4bo25b4o$184boo107b obbo37boo57booboo74boo48bo18bo8bo25bobbo$196bo99bo6bo91bo125boo19bo4b oobo$196bo75bo22boobo221boboo19boboob3o$193boo76bobo29bo38bo177bobboo 19b3oboo$193boo106boo38bobo174b4ob3o95bo$193bobbo74bobbo3bob3o58bobo 173bobbobobboo80boo7boobbobo$194b3o76bo4bo63bo175bobobob3o80b3o6b4o3bo $195bo78boboobobo43b3o152boo37boob3obo80boobobo7bo$275boo3bo46bo9boo 141boo37b4obbobo39bo42boo10boboo$276bo49bo9bobbo121boo3boo54bo3bo39bo 55bobo$337boo78boo36bo3b4o3bobo53bo3bo39b3o54bo8boo$417bobo35boboobbo bbo3bo53bobbo12boo92boo$417bo37boboo4bo3boo69boo$255bo155boo46bo3bo$ 253booboo18boo133bobo50bo$255bo156bo130booboo$270bo5bo246boo13boo3b3ob o$268b3o3b3o168b3o6bo83bob3o4bo84boo$256boo10boo4b3o169boo3boobo83bobo 3bobo83b3oboo4boo$255bobbo11b4o171boo5bobo84bobbobobo83boboboo4boo$ 231bobo20boo3bo12bo177b3obo35bo49boo86boobo$230bobbo20bo4bo13bo179boo 34bo38boo91boo3bo$231bobo20bo3bo13b3o69bobo142b3o35bobbo81boo5bo3bobo$ 247boo6bobbo13bobo18b3o47bobbo76bo96b3o4bobboo8bo71boo6boobob3o$247bob o6bo15boo21bo48bobo76bo7bo94bobboo9boo78bo3b4o$233bo13b3o44bo65boo61bo 5b3o94b4o9bobbo75bo$232boboo11bobbo109bobo59boo3bobo110bobo74bobo$232b oboo12bo97bo13b3o65bobbo108boo74bo$231bo3bo12bo27boo67boboo11bobbo63bo bboo168bobo6bobo4bo$232b4o40boo6boo59boboo12bo16boo62boo88bo66bo9bobo 4bobo$232b3o15bo36boo55bo3bo12bo7boo6boo63boo89boo65bobbo6bo6bo$247bo 36bo3boo55b4o19bobbo7bo122bobo21boobbobbo68b3o$247bobbo34boboobo54b3o 15bo5boo130bo24boobbobbo$246b3o40b3o68bo80bo10boo48bobbo28bo$246b3o42b o68bobbo77bo3bobo56bobo26b4o$246bobbo40boo67b3o77booboboobbo58bo11b3o 9bobbobo$247bobo109b3o78b6obbo57b3o21boo4boo$247b3o109bobbo78bo5boo57b o28bo$360bobo14boo65bobo57boo$360b3o13bobbo51boo3boo6bo61bo13b3o$236b oo139boo46bo3b4o3bobo65bobbo12b3o5boo21bo$236boo187boboobbobbo3bo65bob o13boo6boo20bo$425boboo4bo3boo7boo56bo14bo30b3o59boo$429bo3bo12boo69b oobbo75bo14boo$346bo87bo11boo70bo3bo9bo62booboo$346bo70boo99bobbo10bo 65boo$346bo8bo29boo30bobo22boobbo72b3o7bo65b3o$353bobo28bobbo29bo25b3o 79boo6bo63bo3bo$244boo101b3obbo3bo28boo57bo81b4o66bo3bo$244boo102bob5o 75boo98bo3bo62b3obo$327bo26bo75boo7bobo72bo16bo67boo19boo$326bobo20boo 42bo16bo31bo70bobo16bobo63bobo19boo$325booboo62bobo14boo31bo31bo33boo bbooboo4b3o9bo65bo$326bobbo62bobo14bobo30bo5b3o22bo34boobb5o4b4o73boo$ 328b3o62bo45booboo4bo24b3o40bo3boobboo71b3o$328bobo109bobo6bo44b3o17bo 6boobo72boboo$329boo57boo51bo56bo15b3o4b3o72b5o$329boo56bobbo107boo14b 3o5bo$373b3o12boo108bobbo$375bo123bobo$305bo68bo124bo87bo$304boo20b3o 71b3o20bo48bobo23boo11boobo72bo5b3o$303b5o18boo71bobbo19boo25boo20bo 25bobo12boo72bobo3boobbo$302bo24bobbo67bo4bo18bobo24bobo20bobbo23boo 86bo3bo5bo$301boo5bo12boo5bobo67bobb3o46bo23bobo19boo89bo3bo$300b3oboo 8bobo3b3o75bo5bo72bo11b3o6bo93bobboo$301boboboobboo3bob6oboo74b7o70b3o 114boo$302bobbobboo5bobo4bobbo79bo70bo87bo$281b3o20boo11bobbobo82bo68b oo87bobo5bo$280bo25boobo8b3obo80boo12boo45b3o9bo13b3o76booboo$279bo4b oo23bo13bobobbo3bo84boo45bo9bobbo12b3o70b3obbo3boo$278bo3bo15b3o27bobb o133bo8bobo13boo77booboo$278bobbo4bo4boo36bo144bo14bo45bo33b4o$278bo3b o3bo4b3obo106bo84boobbo42bo48boo24bobo$279boobob3o54b3o57bobo84bo3bo 41b3o46boo24boo$282bo60bo56boobo84bobbo118bo$283b4o40boo13bo57boo87b3o $285boo11boboo25boo72b3o21boo159bo$298bobbo35boo63bo21bobbo158b3o$298b 3o36bob3o61bobbo18boo154bo3bo3boo$337boobbo58bo6bo172bo5bo3bo$338b3o 59bo6bo173bo8bo$339bo60bo4b3o13bo56boo106boboo$420bo57boo96b3o8bo$335b oo80bo3bo144b4o4b4oboo$335boo73b3o3bobo14boo131boboboo4boobbo$417bo14b obbo131boo9b3o6boo$409bobbo20boo134bo3bobo10bobbo$287boo121bo175bobbo$ 287boo297bobo$486boo95b4o$486boo95bobboo$584b3o$396b3o42boo106bo21boo 12bo$395bo3bo10bo29bobbo104bobo20boo$396boo15boo26boo104bo3bo30bobo$ 295boo101booboo35boo108bobo33bo$295boo103boo35bobo109bo14b3o14bo$378b oobo57bo9bo113bo3bo12boo$377b3obo6bobo57bobo58b3o37b4o10b3obbo11bo3bo$ 376bo4bobo4bo59bobo58bo38bo4bo9bo3bo13b3o$377boo6bobo3bo57bo60bo39bo 13b3o$378bo3bobbobboo157bo3bobbo9boo7boo$361b3o17boboo3bo55boo59boo40b ob3obo19boo$361b3o16bobo60bobbo58bobo11bo28b3obo$362bo17bobo61boo60bo 11bo74bobo$363boo153b3o72boo$364bo201bo27bo$363bo199b5o$448bo32boo79bo $339bo107boo7bo24bobo94bo$337booboo104bobob3obbobo23bo31boo48bo3bo9bob oo$361boo43boo37b3o3boo3bo56bobo48b3o12b3o$340boo19boo42bobo38boboboob obo58bo55boo4b3o3bo$341bo20bo44bo39booboo101boo14bobbo4b5o$335bo3bo15b oo18boo71bob5obo96boo3bo9bo5bo5bo$339bo3bo11boo18boo75b4o11boo73bo14b oo8bobboo$361boo104boo72b3o13bo4bo3booboob3o$540booboo16boo3bobbo$337b o23boo178b3o17bobobboboo$338b3o18boboo179bo18boo4boo$359b4o179bobo14bo bo$356bobboo181b4o13b3o$338b3o13bobo26boo134bo25bo14bo$338b3o13bobo26b oo71bo18boo41bobo$338booboo12bo98b3o17bobbo9bo29bo3bo19booboo$342bo12b oo94b5obo17boo9boo30bobo19bo5bo$340b3o14bo92bobo5bo27bobo30bo14b3o4bo 3bo$355boo92bobboo8bo70bo3bo4bo$354bobo93b4o9bo55b4o10b3obbo$354bobo 94boo15bo49bo4bo9bo3bo$356bo102b4o5boo50bo13b3o$352bobo104b3o4bobboo 12boo32bo3bobbo9boo$352bo108bo6bo13bobbo31bob3obo$351bobo129boo33b3obo $343boo6boo$343boo5bo$351boo95bo42bo44bo40bobo$352bo93booboo39b3o40b5o 39boo$448bo40bobobo38bo45bo$489bo3bo$487boo5boo37bo3bo$449boo35bo4bo4b o37b3o$351boo70b3o22bobbo33b3obbobobb3o$351boo69bo24boo3bo33bo4bo4bo 26boo$421bo4boo19bo4bo34boo5boo3bo23boo$420bo3bo15b3o4bo3bo37bo3bo4bob o$420bobbo4bo4boo13bobbo37bobobo4bobo$408bo11bo3bo3bo4b3obo11bo40b3o6b o$408bo12boobob3o62bo$408bo8bo6bo69boo$415bobo7b4o64bobbo4b3o$409b3obb o3bo8boo11boboo50boo5b3o27boo$410bob5o23bobbo58bo28boo$416bo23b3o18boo 40boo$385bo25boo47bobo41bo$384bobo75bo40bo14boo$518boo22boo$384bobbo3b ob3o146bobo$386bo4bo151bo$387boboobobo106boo$388boo3bo107boo$389bo15b oo18boo75bo$405boo18boo75bo15bo$501bobo15boo5boo$414bo85bo16bobo5bobbo 21boo$405boo7boo85bobboo11bo8boo22bobo$404b3o8bo86bo3bo11boo31bo$403bo bbob3o3bo89boo14bo$404b3obboo93bo13b3o40bobo$405b3oboo22boo82boboo40b oo$396bo36boo84boo41bo$396b3o117bo17boo$388bo6bo3bo116bo16bobbo8boo11b oo$388bo3b3o4bo7bo106boo18boo9bobo10bobo$388bo3b3oboboo5b5o104bobo28bo 13bo$392boo3bo7boob3o103bobo$405boobbo105bo$406b3o$400bo6bo96bo$400boo 98boobobo36boo$401bo98bobbooboobb3o28bobbo$393boo6bo98bo5bobo4bo28boo$ 393boo4bobo99boobbo8bo$402bo102bobb3obbo$403bo76b3o6bo15b3o42bo$397boo 5bo74bo4bo3bobo45boo11bobo$400bo4bo73bo4boo3bo47boo10bobo$402bobo74bo 6bo49bo13bo$480b3obobbobo$484b5o56boo$489bo54bobbo$463bo81boo$463bo$ 463bo$467bo$463b3obbo$462bo4bo$462bo3bo$463b3o11bobbo$439b3o35bobbo$ 482bo$443boo17bobo12b4obo21boo$445bo10b3o3bobo12boobobo22boo$439b4obo 11bo5bobo39bo$439b5o18bobo$463boo$456bobbo$439bobo14boboo$439bobo14bo bbo$440bo15bobo25boo9bo$439bobo14b3o25boo8b3o$440boo51bobobo$440bo52bo bobo$494b3o$495bo$$500bo$455bo44bo$453booboo$453b3oboo$454b5o$444boo9b 3o$444boo10bo7$452boo$452boo!golly-2.5-src/Patterns/Life/Spaceships/corderships.rle0000644000175100001440000001012112156145314020020 00000000000000#C Five small Corderships. #C Corderships are c/12 diagonal spaceships built from switch engines. #C The trick in constructing a Cordership is to arrange the switch #C engines in such a way that they clean up each others' debris. #C Front: A single-row, 7-engine Cordership. #C Middle: Two 6-engine constructions and a symmetric 8-engine. #C Back: The classic 7-engine Cordership, shown with classic #C rear-end glider collisions. #C All five of these Corderships were constructed by Dean Hickerson, #C who named them after the discoverer of the switch engine, #C Charles Corderman. #C From Alan Hensel's "lifebc" pattern collection. x = 244, y = 255, rule = B3/S23 95bo$78b3o8bo5bo$77bo3bo6bo7bo$78boo9b4obboo$80booboo9b3o$82boo11bobo$ 96bo7boo$96bo7boo3$88bo$87bobo$87bobo$74b3o11bo$75bo36boo$75bobbo33boo $75bobbo$76bobo$96bo$95bobo$95bobo$96bo$$75boo129bo$53bobo18boo116bobo 6bobb4o$52bo19b3o116bo9bob4o$53bobbo135bobbo6b3o3boo$55bobo14boo120b3o 9bobboo$58bo148boboo$57b3o148bo8boo$57bo159boo$39bo15boo$39bo5b3o9bo 13b3o$38bobo3boobbo6bobbo12b3o$39bo3bo5bo5bobo13boo117bo$39bo3bo11bo 14bo21b3o94b3o$44bobboo19boobbo21bo93boobbo$45boo22bo3bo19bo93boobboo 32boo$69bobbo115boo35boo$70b3o116b5o$193boo5bo$191bobbo5bo$192boo6bo3b o$203bobo$55boo147bo$55boo$42boo$42boo138bo$41boobo123bobo6bobb4o$28bo bo13bo122bo9bob4o33booboo$27bo16boob3o118bobbo6b3o3boo30boo$28bobbo12b oboobo120b3o9bobboo29boobobo$30bobo9boo3boo14boo118boboo32bobo$33bo8b oo19boo119bo4boo29boo$32b3o4bob3o9boo134boo$32bo6bo13boo$30boo$32bo$ 30bobbo175bo$30bobo176bo7bo$30bo178bo5b3o$208boo3bobo11bo$54bobo157bo bbo8bo$54bobbo131b3o21bobboo10bo$183bo3bobboo$22b3o30bobo115boo9bobob oo$23bo31b3o115boo5b5o9boo27boo4bo$23bobbo29bobo122boobb3o6boo26bobo$ 23bobbo30boobo161bobboobbo$24bobo31b3o160bo7bo$221bobb3o3bo$48bo172bob o3bobo$48bobo157b3o11bobbobbo$48boo131boo9booboo6boboobboo13b3o$181boo 9boo8bob7o$23boo167boobobo5bo32boo$195bobo38boo$196boo$b3o8boo$o3bo6bo bbo$boo9boo$3booboo181boo$5boo182boo$$131bo87boo$126bobbobobbo3bo80boo $20boo104bo4boob5o$19bobbo103bo3bo4bobo$20boo$128b3o$129bo18boo$148boo 3$26boo$7boo15bo3boboo$7boo15bo3boboo$24bo3boo106bo$25b3o107bobo18boo$ 25b3o88bo18bobbo17boo$116bo19boo$116bo$120bo11boo$15boo15bo83b3obbo10b oo$15boo15bobo80bo4bo$32boo81bo3bo$116b3o$125boo$122booboo$115bobo$ 115bobo30bobo6bobo$23boo90bobo29bo9bobo$23boo90bobo30bobbo6bo$116boo 32b3o$105boo3b4o$100b3obobbo6bo$104bobbobb5o$104bobbo$106bo$103bobo33b o$104bo33bobo$109bo$109bo28bobbo$140boo$108boo31bo$86b3o19boo$$90bo75b o$86bo3boo74boo$88bobo47boo27bo$85b3o52bo25bo$87bo15boo33boo$103boo$ 86boo$87boo10boo$87bo10bobbo$87boo10bobo$86boo12bo20bobo6bobo$120bo9bo bo22boobo$121bobbo6bo24boo$123b3o6$112bo$91boo18bobo$91boo$111bobbo$ 113boo$114bo3$139bo$99boo38boo$99boo10boo27bo$113bo25bo$111boo6$49b3o$ 48bo3bo75boobo$47bo3boo76boo$48bo$49b4o$51boboo138bobo$51bobbo137bo$ 52boo12boo125bobbo$66boo127bobo$198bo11b3o$197b3o$50bo146bo$49bobo143b oo$49bobo145bo13b3o$50bo129bo14bobbo12b3o5boo$74boo103bobo13bobo13boo 6boo$74boo119bo14bo$179bobbo3bob3o17boobbo$181bo4bo22bo3bo26bo$58bo 123boboobobo19bobbo27bobo$57bobo123boo3bo21b3o27boo$57bobo124bo$35b3o 20bo168boo$34bo3bo43boo143boo$35boo45boo$24b3o10booboo26bobbo119bo$23b o3bo11boo27bobbo119bo5b3o$22bo3boo39bo122bobo3boobbo$23bo46bo120bo3bo 5bo$24b4o37boo124bo3bo$26boboo35booboo126bobboo25bo8boo$26bobbo36boo5b obo91bobo27boo26bobo7boo$27boo43bo93bo58bobo$73bobbo90bobbo54bobbo$75b obo91bobo54bobo$34boo42bo93bo56bo$26bo6bobbo40b3o91b3o54boo$26bo7boo 41bo93bo56bo$25bobo47boo92boo$26bo50bo93bo$26boo36bo10bobbo90bobbo31bo $26b3o34bobo9bobo91bobo31boboo$75bo93bo36boo$24bo4boo11boo19bobbo134bo 6bo$24bo5bo10bobbo20boo133bo3b4o$24bo5bo11boo22bo134bo4bo$29bo3$207b3o $63boo141bo3bo$65bo13bo17b3o107boo$29boo32boo14bo17b3obbo70boo34booboo $29boo48bo16boo3boo70boo36boo$101bo$94bo$48bobo13boo27b4o103bo$47bo16b oo26bo4bo101bobo$48bobbo41b4obo100bobo$50bobo34bo10bo100bobbo$37boo14b o10bo22bo9boo82boo17bobo$37boo13b3o8boo22bo93boo20bo$52bo12bo29bobbo 103boo37b3o$50boo43bobbo103bo38bo$52bo13b3o26b3o144bo$50bobbo12b3o4b3o $50bobo13boo$50bo14bo29bo$45boo16boobbo27bo93boo29boo$45boo17bo3bo26bo 93boo28boo$64bobbo153bo$65b3o$$81b3o15$218bo$217boo$217bobo! golly-2.5-src/Patterns/Life/Spaceships/diagonal.rle0000644000175100001440000000554312156145314017265 00000000000000#C Sample c/4, c/5 and c/6 diagonal spaceships #C Tiny one in front: the glider. #C Top right: Hartmut Holzwart's 'Orion', simplified by Jason Summers, #C followed by 'Canada goose' by Jason Summers. #C Middle: sample c/4 grammar by Hartmut Holzwart. #C Bottom left: 'Swan' by Tim Coe. #C Bottom, left to right: #C an asymmetrical c/5 spaceship by Nicolay Beluchenko, 11 Jul 2006; #C a symmetrical c/5 spaceship found by Jason Summers, 9 Jan 2005; #C and the original large c/5 found by Jason Summers. #C Far right: 'Seal', found by Nicolay Beluchenko, 18 Sep 2005. #C From Alan Hensel's "lifebc" pattern collection. x = 114, y = 92, rule = B3/S23 67b2o17b3o$66b2o18bo9b2o$68bo18bo6b3obo$70bo4b3o11b2o2b2o$70b3o4b2o11b o$71b3obobo16bo$78bo11b2o3bo$71bobo15bobob2o$70b2obo15bobo2bob2o$71bo 16bo4b2o$69b2obo15b2o$21b2o49bo15b2o$21bobo46b2o$21bo4$49b2o$48b2o$50b o$46bo6bo28b2o$45b2o4b2o7bo20b3ob3o$45bobo7bo3b4o20bo3b2o$49bo4b2o2bo 2b2o17b2ob2o2bo2bobo$49bo7b2o4b2obo13bo6bob4o$41b2o5bo7bob2o4bobo19b2o bo2bo$40b2o9bo3b3o6bo2bo12bo4b2o3bob2o$42bo7b2o2bo2bo22b2o8bobo2bo$38b o6bo7b2o8b2o15bo2b5ob3o4bo$37b2o4b2o7bob2o9bo15bo9bo4bo$37bobo7bo3b3o 27b2obo2bo3bo3bo$41bo4b2o2bo2bo28bo9b2o$41bo7b2o38b2o2b2o4bo$33b2o5bo 7bob2o30bo3b2obo4b3o2bo$32b2o9bo3b3o33b2obob5o5bob2o$34bo7b2o2bo2bo37b 2ob2ob2ob2o2b3o$30bo6bo7b2o50bobo4bo$29b2o4b2o7bob2o40b2o4bobo3b6o$29b obo7bo3b3o47bo7b2o$33bo4b2o2bo2bo47bo3bo$33bo7b2o32b2o16bo4bo3b3o6bo$ 25b2o5bo7bob2o23b2o4b2obobo15b5o3b2ob2o2b2ob2o$24b2o9bo3b3o24b3o4b4o 20b2obo2bob2o2bo$26bo7b2o2bo2bo23b2o6b2o5bo15b2o5bo4bo2b3o$22bo6bo7b2o 25b2o2b2o3bo2bo2bo15b3obobobobo$21b2o4b2o7bob2o23b2o5bo7bo2b2o19bo2bo$ 21bobo7bo3b3o25b2obo3b4o24bobo$25bo4b2o2bo2bo28bo3b2o2b2obo21bo$25bo7b 2o32b3o4bobo$24bo7bob2o32b2o3b2o2bo23b3o$27bo3b3o34bo5bo26b3o$26b2o2bo 2bo29b4obo2bo2bo3bo$29b2o32b3o3b5o2b7obo15b2o$28bob2o30bobo4bo10bo2b2o 15b2o$27b3o32b3obo3bo3bo5b3o18bo$26bo2bo22b2o15bobo2bo7b2o$25b2o24bo2b o8bo3bo5b2o8b2o2bobo$26b2o23bobo12bo7bo8b3obob3o$26b2o23bo13bo8b3o6bo 4bo$28bo3bo19b2obo11bo6bobo5bobo$28b3obo22b2obo8bo6bob2o3bo4bo$33bo19b o2bo2bobo13bob4o3bo5bo2bo$28b2o25b2ob2o2bo11b2o2b2obobo3bob3o$30bo22bo 3b3o2bo16bo6bo2b3o3b3o$43b3o7bo4bo23bo2bo6b2o$2obo7b3o28bo3bo8bo3bo18b 2o4bo2bo10b2o$o3bo6bo30bobobobob2o4bo23bo13bo3bo$o4bo7bo7b2o20bo11bo2b 5o15b2o4b2o8bo$2b2o7bobo4b2obo24b2obo2bobo7bo16bo3b3o8bobobobo$4bobo4b 3obo2b2o27b3o3bo6bo2b2o14bo4b2o8bo5b2o$10bo3b2o2b2o18bo11bo35bo8bo2b3o $6b2ob4ob2o21b2o8bob3o2bo5b3o20bo2bo8bo8bo$7b7o22bo11b3obobo33b4o8b2o 3bo$35bobob2o13bobobo26bo6b2o6b2o3bo$34b2ob5o6bo5bo3bo26bo4bo12bo$33bo 8bo6b2o3b2o2bo26bo15bo$33bo6bob2o12bo30b2obobo7bo2bo$33bo5b2obo13bo30b o4bo9b3o$34b3o5bo47b3ob2o2bo3bo3bob2o$34bo2bo4b4obo43bo2b2obo5bo3bo2bo $37bo5bo2bo52b2o2bo3bo$38bo4b2obo49bob2ob2obo2b2o3bo$44bob2o45bo5bo3bo 7bobo$45b2o47b2o12b2o3bo$43bo2bo53bo7b2o$43b3obo3bo49b3o3b2o2bo$49b2ob o47bo2bob3o$44bo4bo2bo47bo4b2o$44b2o3bo51bo$104bo2bo$46bo56bo$47b2o55b 2o! golly-2.5-src/Patterns/Life/Spaceships/orthogonal.rle0000644000175100001440000000465712156145314017670 00000000000000#C Small Orthogonal Spaceships, speeds c/2, 2c/5, c/3, 2c/7, c/4, #C c/5, and c/6. #C c/2: LWSS, MWSS, HWSS (lightweight spaceship, middleweight #C spaceship, heavyweight spaceship), Shick engine, and unnamed p2 #C spaceship which is used in line puffers. #C 2c/5: smallest example, by Paul Tooke. #C c/3: smallest c/3, turtle by Dean Hickerson, and dart by David Bell. #C 2c/7: weekender, found Jan. 12, 2000 by David Eppstein. #C c/4: smallest orthogonal c/4, by Tim Coe. #C c/5: Spiders by David Bell, pushing pre-pulsars in various forms. #C c/6: "Dragon", by Paul Tooke, April 2000. #C From Alan Hensel's "lifebc" pattern collection. x = 194, y = 76, rule = B3/S23 126boo$122boobobboboo24bo12bo$85bo36boo6boo11bo12bo12bo8bo11bo$84b3o 35bobo4bobo10bobo10bobo10bobo7bo11bo$30b3o3b3o9b3o15b3o14booboo36boobb oo11bo3bo10bo12bo7bobo9bobo$19b3o8bobbobobbo8bo3bo13bo3bo53boobooboo 11b3o11bo12bo$10b3o5bobbo8bo7bo7boo4bo11bo4boo11bobobobobbo33bobbo28bo 3b4o3bo7bo3bo7bo3bo$b3o5bobbo8bo8bo7bo6bobobooboo3b3o3booboobobo9boo3b o3b3o17bo12bo6bo9boo3boo14b4o11bob6ob6obo$obbo8bo4bo3bo9bobobobo6boobo 4boboob3oboobo4boboo8boo3bo6bo9boob3ob3o10bo6bo7bo3bobo3bo8b4o4b4o6bo 7bobo7bo$3bo4bo3bo4bo3bo21bo4bo3bo4bobo4bo3bo4bo17bobo9boo4bobbooboo 20boo3bobo3boo25bo7bobo7bo$3bo8bo8bo12bo20bo5bo27bobo10bobboboo3bobboo 6b8o5bo5bobo5bo8bo6bo8bo17bo$obo6bobo6bobo12b3o7boo7boo9boo7boo16bobbo 20bobbo4boo6boo5bobooboboboobo10boobboo10bobooboo3booboobo$33b3o57bo 12$99bo35bo5bo$98b3o33b3o3b3o$51bo5bo35bo$50b3o3b3o33b3o$$9bo3b3o90boo 5boo5boo5boo19boo5boo5boo5boo6b3o3bo$6boob5oboo87bo3bo3bobbo3bobbo3bo 3bo15bo3bo3bobbo3bobbo3bo3bo3boob5oboo$4boboobo5bobo4boo5boo5boo5boo 19boo5boo5boo5boo17bo3bobob3o5b3obobo3bo15bo3bobob3o5b3obobo3bobbobo5b oboobo$3bo3bobo3b5obbo3bo3bobbo3bobbo3bo3bo15bo3bo3bobbo3bobbo3bo3bo 15bo5boobb3ob3obboo5bo15bo5boobb3ob3obboo5bobb5o3bobo3bo$7b3o5boo3bo3b obob3o5b3obobo3bo3b3o9bo3bobob3o5b3obobo3bo15boob3o15b3oboo15boob3o15b 3oboo3boo5b3o$4bobbob3o8bo5boobb3ob3obboo5bo4bo10bo5boobb3ob3obboo5bo 15bo25bo15bo25bo8b3obobbo$6bo13boob3o15b3oboo15boob3o15b3oboo16bo3bo 15bo3bo17bo3bo15bo3bo14bo$20bo25bo15bo25bo17bobbo15bobbo19bobbo15bobbo $21bo3bo15bo3bo17bo3bo15bo3bo$22bobbo15bobbo19bobbo15bobbo9$93bo6bo$ 92bobo4bobo$92bobo4bobo$93bo6bo$$92b3o4b3o$92b4obb4o$95bobbo$92b3oboob 3o$92boo6boo$91boo8boo$$90bo12bo$88bobbo10bobbo$88bobbo10bobbo$$91b3o 6b3o$91bo10bo$93bo6bo$91b3o6b3o$$94boboobo$95bobbo$91boboobooboobo$91b 3o6b3o$$91bobo6bobo$91bobo6bobo$89b3ob3obb3ob3o! golly-2.5-src/Patterns/Life/Spaceships/short-thin-race.rle0000644000175100001440000001260012156145314020506 00000000000000#C From thin,rle (left side of pattern): #C This table shows the minimum possible width of those types of #C orthogonal spaceship for which this has been determined. #C The width is measured over all time, so that, for example, #C the width of a LWSS is counted as 5 even though each individual #C phase has width 4. #C For each type I also give the minimum length for a spaceship of #C minimal width. The length here is defined as the length of the #C union of n successive generations (where n is the period), the #C starting generation being chosen to minimise this figure. #C (For the p5 c/5 case, note that 89 is the shortest known, but #C may possibly not be the shortest possible. Also note that a #C variant can be obtained by reversing the front 5 rows.) #C #C | minimum | #C type | width | minimum length for this width #C --------+---------+------------------------------------ #C p2 c/2 | 21 | 12 (Hartmut Holzwart, 1992 Jul 3) #C p3 c/3 | 12 | 13 (turtle, Dean Hickerson, c.1990) #C p4 c/2 | 5 | 6 (LWSS, John Conway, 1970) #C p4 c/4 | 10 | 44 (Stephen Silver, 1999 Mar 2) #C p5 2c/5 | 10 | 31 (Stephen Silver, 1999 Mar 2) #C p5 c/5 | 11 | 89 (Paul Tooke, 2001 Mar 12) #C #C From short.rle (center of pattern): #C This table shows the minimum possible length of those types #C of orthogonal spaceship for which this has been determined. #C For each type I also give the minimum width for a spaceship #C of minimal length. #C #C | minimum | #C type | length | minimum width for this length #C --------+---------+------------------------------------- #C p2 c/2 | 8 | 31 (Dean Hickerson, 1989 Jul 28) #C p3 c/3 | 5 | 16 (Dean Hickerson, 1989 Aug) #C p4 c/4 | 8 | 26 (Tim Coe, 1995 Aug 6) #C p4 c/2 | 6 | 5 (LWSS, John Conway, 1970) #C p5 c/5 | 8 | 31 (spider, David Bell, 1997 Apr 14) #C #C From race.rle (right side of pattern): #C This shows the smallest known spaceships moving at the seven #C orthogonal speeds so far achieved -- not counting the 17c/45 #C Caterpillar, which is far too big to include in the lineup. #C #C Minimum populations: #C c/2 9 (LWSS - John Conway, 1970) #C 2c/5 30 (Paul Tooke, 7 Dec 2000) #C c/3 25 (Dean Hickerson, Aug 1989) #C 2c/7 36 (weekender - David Eppstein, 12 Jan 2000) #C c/4 46 (Tim Coe, May 1996) #C c/5 58 (spider - David Bell, 14 Apr 1997) #C c/6 102 (dragon - Paul Tooke, 23 Apr 2000) #C 17c/45 11880063 (Caterpillar - Gabriel Nivasch, 31 Dec 2004; #C contributions by David Bell and Jason Summers. #C It would be fairly straightforward to produce #C versions of the Caterpillar with slightly #C smaller minimum populations, but significant #C reductions would require a lot of redesigning.) #C #C Patterns and comments from Stephen Silver's 12 Jan 2004 'ships.zip' x = 404, y = 90, rule = B3/S23 95bo$4boboo23b3o30boo27booboo29bo3bo38bo17bo$3booboo24bo27b3oboob3o26b oo28b3ob3o36b3o15b3o$bbo5bo50bo10bo22boo30booboboboo33boob3o13b3oboo$ bbobobobo25bo25boboobboobo25b5o24boo7boo33bobboboo4bo4boobobbo$33boobo 27boo30bo3bo24bo7bo31boobo4bobobooboobobo4boboo$3booboo25boob4o21bobb oobbo25b5oboo22boo7boo30boobobobbobo7bobobboboboo$34bo3boo21bob4obo26b oo4bo20boobobo3boboboo28bo8b3obobob3o8bo$3b4o26b3o3bo22bo4bo27booboo 23bobobooboobobo28boo7boo9boo7boo$bbo3bobbo22bobo3bo57boobbo19boobobbo bobobobboboo$bb3o3bobo20bo3bobbo22bob4obo31bo19booboboobobobooboboo$4b 3o25boboboboo20b10o28boobo18bobbo4bobo4bobbo$6booboo24boobo21boob4oboo 30boo17boobbobooboboboobobboo$35booboo57bo$6b3o27boboo57boo$7boo26boo bbo58boo$5bobobbo87boo79bo$4bo5bo24b4o56b3o74boob3ob3o$3bo30bobboo59b oo72boo4bobbooboo$3bobb4o24bobobbo55b3o73bobboboo3bobboo$bb3o29bobbo 61bo83bobbo$bbo4b3o24b3oboo59bo$boo4b3o23boobo63bo$3b3oboobo21bo4bo60b o$3bobo3bo23b3o62bo$bbo30b3o62bobo$6bo27bob3o59bo$bbobobobo24bo61b3obo $3b3obbo23boob3o59bo$bboobo27bobo59boo$5boobo23bobbo$3o3bobo23bobbo 131bo41bo20bo33boobo18bo12bo16bo11bo26bo7bo26b3o4b3o$oobo31bo131bo7b3o 11b3o16b3o18b3o29booboboob3o14bo12bo16bo11bo20booboboboo3booboboboo20b 3o4b3o$bobbo27bo133bobo4boo5b3o24boobo17bo3bo25b4obboo6bo12bobo10bobo 14bobo9bobo16b3obob3o9b3obob3o$o5boo25b3o137b5ob5o4bobbo15b3o18booboo 24bo4bo3bo3boo14bo12bo46bo3bobo5bobo5bobo3bo$oobobo29bo135bobobbobbo3b o5bo18boo26bo21boo26bo12bo14bo3bo7bo3bo19boo6bobo6boo$3b3obbo28bo129b 6o3bobboo4b6o36b4obobbobo49bo3b4o3bo15bob6ob6obo16boo9bobo9boo17b5obb 5o$5bobo27bo132boo6bobobboo3bo41bobbobbo3bo52b4o18bo7bobo7bo15booboo 15booboo21bobbo$5bo31bo140bo6bo48boobo49b4o4b4o14bo7bobo7bo19bo15bo23b obboobbo$3bobo28b3o198boo76bo17bo58boo6boo$bboboo28boo199boo52bo6bo17b obooboo3booboobo58bo10bo$bbobo29boo200bo53boobboo92bo12bo$bbo3bo28bo$ 6boo27bo350b3o12b3o$8boo377b3o10b3o$4b6o379bo10bo$6boo167bo7bo205b3o6b 3o$4bobo162booboboboo3booboboboo202bo4bo$4bo3bo157b3obob3o9b3obob3o 197bo8bo$8bo157bo3bobo5bobo5bobo3bo196bobbo4bobbo$5boo163boo6bobo6boo 199bobbo6bobbo$3b3obo159boo9bobo9boo202boo$bbobbo161booboo15booboo196b obbobobbobobbo$3boo166bo15bo206boo$389b3o6b3o$5bo384bo8bo$4bobo383bo8b o$7bo380bo3bo4bo3bo$7bo380bo3bo4bo3bo$7bo379bobbobbobbobbobbo$3boobbo$ bbobboboboo$bboobbooboo$3bobboo$6b3o$3boobboo$4booboo$5b3o4$b7o$oobobo boo$ooboboboo$bobobobo$bobobobo$bo5bo$3bobo$3bobo$5b3o$bboobo$9bo$bb5o bbo$8boo$$3oboobboo$oo4b4o$bo5boo$bo$bbo! golly-2.5-src/Patterns/Life/Spaceships/smallest-low-period.rle0000644000175100001440000002644512156145314021416 00000000000000#C Shows spaceships of all periods < 32 for which examples are known. #C Minimum populations are listed below, each spaceship having been #C chosen to minimize this minimum population. (Often there are #C small variations of the given spaceship that have the same #C minimum population.) #C #C Spaceships are arranged in period order, reading right then down. #C Gaps between spaceships do not correlate with gaps in the known #C spaceship periods -- the extra space just prevents fast higher- #C period spaceships from crashing into slow lower-period ones. #C #C Period Min population #C ------ -------------- #C p2 64 #C p3 25 #C p4 5 #C p5 30 #C p6 72 #C p7 36 #C p8 31 #C p9 55 #C p10 102 #C p12 39 #C p14 174 #C p15 132 #C p16 28 #C p18 138 #C p20 42 #C p21 279 #C p22 584 #C p24 50 #C p25 165 #C p26 187 #C p27 381 #C p28 185 #C p30 128 #C #C p2: Dean Hickerson, 28 Jul 1989. One of the first p2 spaceships. #C p3: Dean Hickerson, Aug 1989. One of the first known p3 spaceships. #C A p3 spaceship found later by David Bell has the same minimum #C pixel count, but a larger maximum one (see c3-orthogonal.rle). #C p4: Richard Guy, 1970. The first known spaceship. #C p5: Paul Tooke, 7 Dec 2000. #C p6: The first p6 spaceship was found by David Bell on 12 Jul 1992, #C and travelled at c/2. This smaller c/3 one was found by #C Jason Summers on 22 Oct 2000. #C p7: David Eppstein's weekender, 12 Jan 2000. This is the only #C known basic p7 spaceship. Travels at 2c/7. #C p8: Jason Summers, 29 Oct 2000. #C p9: David Bell found the first p9 spaceship in May 1992, by #C deleting the back part of one of his p3 spaceships. #C The smaller one shown here was found by Paul Tooke, 2001 Jun 7. #C p10: The first known p10 spaceship was found by David Bell #C on 5 May 2000, based on a p5 2c/5 ship found by Paul Tooke #C earlier that year. The p10 ship shown here is a smaller one #C found by Paul Tooke on 31 Jan 2002, except that I have #C replaced the front part with something slightly smaller. #C p12: There is a tie here between two very different c/2 spaceships. #C Not shown is the Schick engine (Paul Schick, 1972) which, #C however, can be seen in the p24 example below. The one #C actually shown is by Mark Niemiec, March 1997. It's a #C Coe ship (see p16 below) perturbed by a MWSS. #C p14: Paul Tooke found the first p14 spaceship, 19 Dec 2001. #C The one shown here is a much smaller one (with the same #C p14 part) that he found on 2002 Jan 28, except that I've #C changed the p2 spaceship at the front to save a few more cells. #C p15: The first p15 spaceship was found by David Bell in Dec 1993, #C and travelled at c/3. The 2c/5 one here was built by Stephen #C Silver on 18 Feb 2002, using components found by Paul Tooke. #C p16: Coe ship (Tim Coe, 26 Oct 1995). Coe found this by #C dismembering a p4 spaceship he had just found. #C p18: This p18 spaceship by Jason Summers, 2 Dec 2000, is the result #C of welding his p6 spaceship to a p9 spaceship by David Bell. #C Like all known p18 spaceships, it is trivial in the sense that #C it has no p18 part, merely disjoint p6 and p9 parts. #C p20: Mark Niemiec, 21 Oct 1997. #C p21: Paul Tooke found the first p21 spaceship on 14 Jan 2002. #C In the version shown here I have replaced the front part with #C two small p3 spaceships to get a smaller population. #C p22: The first p22 spaceship was built by David Bell on 9 May 2001, #C based on a p66 puffer by Paul Tooke and a reaction found by #C Jason Summers. The version shown here is from 25 Jan 2002. #C p24: A simple derivative of the Schick engine. #C p25: The first p25 spaceship was found by Paul Tooke on 8 Feb 2002. #C The one shown here is a much smaller one he found later the #C same month. #C p26: David Bell's 30 Apr 2001 version of Paul Tooke's p78 puffer. #C p27: First known p27 spaceship. Found by Paul Tooke in Oct 2002. #C p28: Stephen Silver, 28 Jan 2002, based on Paul Tooke's p14 ship. #C p30: This is a prepulsar pulled by two spiders, found by David Bell #C on 30 May 1998. The variant obtained by moving one side #C forward two spaces has the same minimum population. (This #C variant was noticed by Alan Hensel.) #C small_p.rle from Stephen Silver's 12 Jan 2004 'ships' collection. x = 318, y = 203, rule = B3/S23 16b3o15b3o150b3o7b3o$15bo3bo13bo3bo45boboo47bo48boboo3bo5bo3boobo$14bo o4bo11bo4boo40b3obooboboo43b3o46b3o3bobo5bobo3b3o$13bobobooboo3b3o3boo boobobo38bo6boobb4o39bo3bo44bo3bo4boo3boo4bo3bo$12boobo4boboob3oboobo 4boboo38boo3bo3bo4bo38booboo45bo6bobooboobo6bo$11bo4bo3bo4bobo4bo3bo4b o49boo19bo27bo47bo3bobo3bo$23bo5bo81boo18b4obobbobo46bobbo3bobbo$11boo 7boo9boo7boo69bobo18bobbobbo3bo$138boobo48boo3boo$139boo49bobobobo$ 139boo50booboo$140bo51bobo$189booboboboo$189bobo3bobo5$220b3o15b3o$ 219bo3bo13bo3bo$218boo4bo11bo4boo53b3o$217bobobooboo3b3o3booboobobo51b obbo$216boobo4boboob3oboobo4boboo45bo11b3o$215bo4bo3bo4bobo4bo3bo4bo 43boo5boo4bobbo$128bo7bo90bo5bo53boobo3boboo12bo$127b3o5b3o77boo7boo9b oo7boo43bobboobboo5boo5boo$95b3o3b3o23bobbo3bobbo108bo16b3o26boobboo5b oobo3boboo$20bo12bo57boboo3bobo3boobo20booboboboo107bobo15bo3bo23bo12b oobboobbo$20bo12bo29b3o24b3o3bobobobo3b3o15bo3booboboboo3bo101boo17bo 4boo19boobo12boobboo$19bobo10bobo28bobbo4b3o15bo3bo4bobo4bo3bo13bobo5b obo5bobo101bobobobbo3b3o3booboobobo41bo$20bo12bo29bo6bobbo16bo7bobo7bo 13booboo3booboo3booboo97boobo3b3oboob3oboobo4boboo30boo8boboo$20bo12bo 29bo3bo5bo23bobobo21bo7bobo7bo19bo78boobbobobo5bobo4bo3bo4bo28boo$21bo 3b4o3bo31bo4bo3bo23bobobo21bo7bobo7bo18b3o3b3o71boo7bobbo5bo39bobbo$ 25b4o35bo3bo4bo49bobbo3booboo3bobbo18boboobbobbo68boobboboo5bo8boo7boo 19bo7b4o7bo$21b4o4b4o30boboboo3bo26bo24bo15bo13b3o4b3obbo72bobboboo43b 3o16b3o$63bo6bo27bobo27b3o3b3o16bobbo4b3obbo71bobobobo3b3o37booboo14bo oboo$23bo6bo65boo3boo23boobo5boboo17bo4boo4bobo72bo3b3o49bobbo$24boobb oo35boobo27bobobobo26bo5bo16bo3bo4bo79boo3boobo34bobbobobobo5boo5bobob obobbo$67bo28boo3boo26boo3boo20bo84bobobobo35b3o3bo3boo10boo3bo3b3o$ 130booboo18bobo5b3o79bobo36bo6bo3boo10boo3bo6bo$242bobbobo34bobo30bobo $127bo3bobo3bo106b3o37bobo26bobo$282bobbo28bobbo$129bobobobo146bo34bo$ 129bobobobo$130booboo$130bo3bo$244boo$245boo5$244boo$245boo$245boo$ 271b3o$270bo3bo$221b3o45bo4boo$220bo3bo32b3obb3o3booboobobo$219boo4bo 30bo3bob3oboobo4boboo$218bobobooboo3b3obb3o17bo6bobo4bo3bo4bo$217boobo 4boboob3obo3bo16bo3boo5bo$183b3o11b3o16bo4bo3bo4bobo6bo17bo10boo7boo$ 182bo3boobo6bo3boobo24bo5boo3bo14bobo$182bobo3b3o5bobo3b3o11boo7boo10b o15boobob3o$181boo4bo3bo3boo4bo3bo32bobo11bobobo3bo$180b3o7bo3b3o7bo 29b3oboboo9boobo$182bobo11bobo35bo3bobobo7bo3bo5boo$184boo12boo40boboo $92bo7bo81bo3bo9bo3bo32boo5bo3bo5booboo$88boobobo5boboboo77bo13bo$3bo 4b3o77boo4bo3bo4boo77boobo10boobo40booboo6bo3b3o$bb3obbobbo77boo4bo3bo 4boo80bo13bo51bo5bo$bboboo4bo79boo9boo80b3o11b3o37b3o3bo$3b4o3bo68boob 3oboo3bob3ob3obo3boob3o7b3o29b3o4bo4b3o72bo5bo8boo3boo$3boo5bo68boo4bo 4bo11bo4bo3bo5bo3boobo24bobbo3b3obbobbo19bo13bo53boo12bo$7bobbo67bobbo boo24bobo5bobo3b3o26bo3boboo4bo26bo44boo3boo10bo8boob3o$8boo83b3ob3o 11boo3boo4bo3bo21bo3bo4b4o3bo19boo4bobo4boo42boo10boo5boobo3boo$9bo83b 7o10bobooboobo6bo22bo3bo4b4o3bo24bo3bo47bo7b4o7bo4bobboo$8bo82boo7boo 7bo3bobo3bo32bo4boo5bo18bo6b3o6bo15bo17bo6boo6booboboo4boobo5bo$8bo 100bobbo3bobbo29bobo5bo3bobo20boo11boo15b3o15b3o7b4obbobo6boobo7boo$ 91bobbobobobbo81bobobboo3boobbobo12boob3o13b3oboo3booboboobo9bo7bobobo o$111boo3boo70boo3boo18bobboboo4bo4boobobbobo6bobobbo5booboboo3boobobo $111bobobobo65bobo3b5o3bobo10boobo4bobobooboobobo4boboo7bo8boobo5bo3bo boboo$112booboo66bobbobbobobobbobbo10boobobobbobo7bobobbobobobo15bobbo bo7bo3boo$113bobo67bobb3o5b3obbo10bo8b3obobob3o7boboo13boobo6boo3bob3o $110booboboboo72bo17boo7boo9boo6bo3bobbo3b3o5boobo13boo$110bobo3bobo 72bo53b6o3boo4bo$185bo3bo3bo3bo39booboo13boobbo$184booboo5booboo57bo$ 188booboboo39b3o3bo14bo3boo$184bo3b7o3bo35bo5bo20bo8b3o$184bobo9bobo 61bo5b5obbo$184boo3b5o3boo34boo6boo22boobobo3bo$187bo3bo3bo45boo24bo6b o$185bob3obob3obo44bo20bobo6bo$185boobo5boboo26bo17boo7boo9booboo6bobo $184bobobbo3bobbobo24b3oboo9b4o9booboo5boboboobb3oboboo$184bo6bo6bo23b oo3boboo6booboboo6bo3boo4boobo5bo3bobobo$183bobbo3b3o3bobbo21boobbo4b 5obbobo11boo3bobbo3boboo8boboo$183bob3o3bo3b3obo22bo5boboboboobo13boob oo7boo3boo5bo3bo$185bobbo5bobbo23boo6bo3bobobo16boo3boobobo$184b3oboob oboob3o20boobobo10boboo23boo11booboo$183boobobob3oboboboo20boboboo8bob boo20bobb4o$182bo3bo4bo4bo3bo16boobobo3bo32bobo$182bobobo3bobo3bobobo 16boo3bo26bo11bobboo$186bo3bobo3bo20b3obo3boo11boo8bobo13bo$183boo5bob o5boo16boo30boo13bobo$184b5obobob5o35boo$188bobobobo41bo$188bobobobo 42bo3boboo$189bo3bo40bo3bobbooboo$235bo3boo4bo$236bo4boo$245bo$239bo4b oo$236b3obbobo$235bo5boo$240boo$47bo19bo$46b3o17b3o$45bo3bo15bo3bo118b 3o11b3o$45booboo15booboo117bo17bo$41bo31bo114bobb3ob3ob3obbo$40bobobbo b4o13b4obobbobo115bobbobobobobbo$39bo3bobbobbo15bobbobbo3bo116boobobob oo$40boboo27boobo77bo17bo21bobbobobbo$41boo8bo11bo8boo77b3o15b3o23bobo 52b3o15b3o$3o3b3o32boo9boo7boo9boo76boo4b3o5b3o4boo19bobbobobbo48bo3bo 13bo3bo$obbobobbo32bo12bo5bo12bo74boobobb3obbo3bobb3obboboo18bobobobo 48boo4bo11bo4boo$o7bo42bobboo3boobbo85bobobbobo3bobo3bobobbobo19bobobo bo47bobobooboo3b3o3booboobobo$o7bo43boobbobobboo83boobobobobo4bobo4bob oboboboo13booboboboboboo43boobo4boboob3oboobo4boboo$bobobobo138boo3bob o4bo5bo4bobo3boo13booboboboboboo42bo4bo3bo4bobo4bo3bo4bo$52boobbobobbo o83b3obo3bo4bobobo4bo3bob3o10b3o3bobobobo3b3o51bo5bo$4bo46bo3bo3bo3bo 81boo9booboboboboo9boo8bo5booboboboo5bo38boo7boo9boo7boo$3b3o45bo11bo 93bo7bo21boboobbobobobobboobo19b3o16bo$3b3o45bobo7bobo90boobo7boboo21b ooboboboboboo21bo3bo15bobo$52bo9bo92bo11bo22booboboboboboo20boo4bo17bo o$53bo7bo90boobo11boboo20bobobobobobo20bobobooboo3b3o3bobbobobo$52bobo 5bobo89boo15boo22bobobobo21boobo4boboob3oboob3o3boboo$11b3o38bobbo3bob bo89bobobob3ob3obobobo18bobobobobobobobo16bo4bo3bo4bobo5bobobobboo$10b obbo38bobo5bobo88boo3bo3bobo3bo3boo16b3obooboboboob3o27bo5bobbo7boo$ 13bo37booboo3booboo87bobbo3bobobobo3bobbo16b5obbobobb5o15boo7boo8bo5bo obobboo$9bo3bo37bobobo3bobobo90boo4bobo4boo23booboboboo44boobobbo$9bo 3bo42bobo91boo4bo3bobo3bo4boo15boo5bobo5boo35b3o3bobobobo$13bo41booboo 94boboobo3boboobo18bobbo4bobo4bobbo36b3o3bo$10bobo43bobo96bobobobobobo bo20bobobbobobobobbobo36boboo3boo$57bo99bobo3bobo21booboo9booboo37bobo bobo$7b3o147bobo3bobo21boobobobb3obboboboo39bobo$4b3obbo149booboo81bob o$5b5o145bo11bo19boo3b3o3b3o3boo38boo7b3o$154bo13bo17bo19bo39bo6bobbo$ 155bobo7bobo17boo3boo4bo4boo3boo45bo$188b3o11b3o42boo4bo3bo$50bo137bo 15bo39bobboo4bo3bo$49b3o133boobobo11boboboo36bob3o4bo$48booboo132boobo boboo5booboboboo46bobo$188boboboo5boobobo$44bobbobobobo133bobob3o5b3ob obo$43b3o3bo3boo$42bo6bo3boo134b3o9b3o$42bobo144b3obobobobob3o$44bobo 143b5obob5o$42bobbo149bobo$42bo152b3o$192bobo3bobo$$190boob3ob3oboo$ 190bo11bo$189bobbo7bobbo$189bo4bo3bo4bo$194bo3bo$188b6o5b6o$187boo7bo 7boo$195bobo$195b3o$$208bo$207b4o$202bo3bo3booboo$201b4o5bobboo$200bo 3bo7bobbo$201bobobbo$195b3o7bo$193boo$193bo4bo$193bo4bo$194bo3bo$196bo $128bo5bo$127b3o3b3o4$99boo5boo5boo5boo19boo5boo5boo5boo$97bo3bo3bobbo 3bobbo3bo3bo15bo3bo3bobbo3bobbo3bo3bo$97bo3bobob3o5b3obobo3bo15bo3bobo b3o5b3obobo3bo$97bo5boobb3ob3obboo5bo15bo5boobb3ob3obboo5bo$97boob3o 15b3oboo15boob3o15b3oboo$97bo25bo15bo25bo$98bo3bo15bo3bo17bo3bo15bo3bo $99bobbo15bobbo19bobbo15bobbo! golly-2.5-src/Patterns/Life/Spaceships/spaceship-types.rle0000644000175100001440000001307612156145314020630 00000000000000#C A period p spaceship which displaces itself (m,n) during its #C period, where m >= n, is said to be of type (m,n)/p. It can be #C shown that p >= 2m+2n. The number of possible types of spaceship #C of period p is therefore [k(k+4)/4], where k = [p/2]. #C (Here, [x] denotes the floor of x, i.e., the greatest integer #C not exceeding x.) Note, however, that no-one has ever proved #C that all these "possible" types really are possible, so the #C above formula may only be an upper bound. #C The following table shows the mininum number of cells for #C spaceships of all types with period < 9. Those marked [*] are #C known to be best possible. #C #C (1,0)/2 64 cells Dean Hickerson 28 Jul 1989 #C (1,0)/3 25 cells [*] Dean Hickerson Aug 1989 #C (1,0)/4 46 cells Tim Coe May 1996 #C (1,1)/4 5 cells [*] Richard Guy 1970 #C (2,0)/4 9 cells [*] John Conway 1970 #C (1,0)/5 58 cells David Bell 14 Apr 1997 #C (1,1)/5 67 cells Nicolay Beluchenko 11 Jul 2006 #C (2,0)/5 30 cells Paul Tooke 7 Dec 2000 #C (1,0)/6 102 cells Paul Tooke 23 Apr 2000 #C (1,1)/6 170 cells Nicolay Beluchenko 18 Sep 2005 #C (2,0)/6 72 cells Jason Summers 22 Oct 2000 #C (2,1)/6 (no known example) #C (3,0)/6 97 cells Hartmut Holzwart 1995 #C (1,0)/7 (no known example) #C (1,1)/7 (no known example) #C (2,0)/7 36 cells David Eppstein 12 Jan 2000 #C (2,1)/7 (no known example) #C (3,0)/7 (no known example) #C (1,0)/8 (no known example) #C (1,1)/8 (no known example) #C (2,0)/8 466 cells Jason Summers 4 Oct 2000 #C (2,1)/8 (no known example) #C (2,2)/8 117 cells Jason Summers 2 Dec 2000 #C (3,0)/8 (no known example) #C (3,1)/8 (no known example) #C (4,0)/8 31 cells Jason Summers 29 Oct 2000 #C #C Updated from types.rle in Stephen Silver's 12 Jan 2004 'ships.zip'. x = 312, y = 222, rule = B3/S23 242b5o$242bo4bo$242bo$243bo4bo$245bo$246b2o2bo$244bo2bo3bo$242bo7bo$ 241bo5bo2bo$241bo3b2o$241b4o2b2o31$139bobo$138bo2bo$137b2o$136bo4bo$ 135b5obo$132b2o$131bo3b3o$130bo3bo$130bo5bo$130b3o3bo$136b2obo$130b3o 6bo$129bo$128bo3bo$128bo5bo$127bob6o$126b3o$127bob6o$128bo5bo$128bo3bo $129bo$130b3o6bo$136b2obo$130b3o3bo$130bo5bo$130bo3bo$131bo3b3o$132b2o $135b5obo$136bo4bo$137b2o$138bo2bo$139bobo21$252bo$131bo118b2ob2obo$ 130bobo111bobobobobo3bo6b3o$129b2o110b2obobo2b2obo5bo4b2o15bo18b2o$ 130bo110bo3bo8b3obo2bo4bo3bo9bo4b2o11bo$129bobo38bo59bobo7bobob3o9bobo 2bo2bobobo2bo7bo4bo12b2o3bo$129bo38b2ob2o45bo5b2o5bo9b2o3bo9bo2bo3bo2b obo2bo4b2o2b2o2bobo3bob2o3b2o$92bo35bo41bo2bobo32bobo6bo2b2o2bob3obobo 8b2obob2o8bo2bo10bo2b2o2b5o3b5o4b2o2bo4bob2o$89b2ob2o34bobo2b2o40bo32b o4bo4bo3bobob2o3b2o7bobo2bo12bo11bobobobo4bobo3bobo5bo6bobo$88bobobo 35bo3bo7b2o33bobo30bob8o6bo4b2obo8bo2b2o25bo6b3obobo6b2ob2o3b3ob3obo2b 2o$87b2o3bo36b3o4b2o2bo34bo2bo32bo5bo3b2o2bo4bobo8b2o29b6o2bo3bo2bo13b o2b2ob2obo$88bobo2bo37b2obobobo2bo31b2o3bo27b2o14bob3o5b2o44b3o6bo2bo 9bo7b2o$89b2obo39b2o3b4o32b2o28bo2b2o7b2o16bo7b2o29b6o2bo3bo2bo13bo2b 2ob2obo$58bo2bo111b2o28bo2bo16b5o2bo2bo7bo2b2o25bo6b3obobo6b2ob2o3b3ob 3obo2b2o$57bo35b2o37b2o3b4o32b2o3bo23bo20bo6bo2bo6bobo2bo12bo11bobobob o4bobo3bobo5bo6bobo$57bo3bo30bob3o34b2obobobo2bo33bo2bo24bo2bo16b5o2bo 2bo7b2obob2o8bo2bo10bo2b2o2b5o3b5o4b2o2bo4bob2o$57b4o30bo3b3o31b3o4b2o 2bo34bobo25bo2b2o7b2o16bo7b2o3bo9bo2bo3bo2bobo2bo4b2o2b2o2bobo3bob2o3b 2o$92bobo33bo3bo7b2o33bo30b2o14bob3o5b2o6bobob3o9bobo2bo2bobobo2bo7bo 4bo12b2o3bo$93bo34bobo2b2o35bo2bobo35bo5bo3b2o2bo4bobo8bo3bo8b3obo2bo 4bo3bo9bo4b2o11bo$128bo39b2ob2o35bob8o6bo4b2obo8b2obobo2b2obo5bo4b2o 15bo18b2o$129bo40bo37bo4bo4bo3bobob2o3b2o11bobobobobo3bo6b3o$129bobo 76bobo6bo2b2o2bob3obobo17b2ob2obo$130bo87bo5b2o5bo20bo$129b2o99bobo$ 130bobo$131bo15$5bobo$4bo2bo$3b2o86b2o$2bo88bo2b2o$b4o86bo2b2o$o4bo84b o$o2bo55b3o28b4obo38bo$o2bo53b2o3bo30bob2o37b2o14bo$bo28bo24bo34b3o39b ob2o5bobo4b2o$2b4obo21bobo21b2o3bo3bo28bo35bo3bo3b3o2bo4bo$3bo3bo21bob o23bo2bo3bo27b2o30b2o3bo2bo6bobo5b3o2bo$4bo24bo27b2o30bo32b2o3bob2o6bo 3bobobo$4bobo51bo3bo27bo31b2o3bo10bobo7b2o$28b2o28bo3bo27bo36b2o14bo6b o$3b3o23bobo26b3o31b3o34bo12bobo$3b2o23bobo98bo12bobo$3b3o22b3o27b3o 31b3o32b2o14bo6bo$58bo3bo27bo31b2o3bo10bobo7b2o$4bobo22bobo26bo3bo27bo 31b2o3bob2o6bo3bobobo$4bo24b2o26b2o30bo32b2o3bo2bo6bobo5b3o2bo$3bo3bo 22bo24bo2bo3bo27b2o35bo3bo3b3o2bo4bo$2b4obo22bobo20b2o3bo3bo28bo40bob 2o5bobo4b2o$bo28bobo22bo34b3o41b2o14bo$o2bo27bo25b2o3bo30bob2o37bo$o2b o55b3o28b4obo$o4bo84bo$b4o86bo2b2o$2bo88bo2b2o$3b2o86b2o$4bo2bo$5bobo 24$143bobo$143bobo$142bo2bo$143bo$143b2o$145bo97bo$243b2o$103b2o38b2o$ 102bo36bo3b2ob2o96b3o$103bo34b2o2bo101b3o$103b3o33bo2b5o4b2o108bo$108b o28bob2ob2o3bo3b2o107bo$96bo2bo2bo5bo27b2ob2o5bo4b2ob3o88b3o14bo$97b5o 5bo28b2obo4bo3bo5b2o90b2o8b3o3bo$96bo3bobo2bo28b2o2bo7bo2bo91bob3o2bo 5bo6bo$96bob2o2bob2o30bo5b3o3bo92bo3bob2o9b2o$59bo33bo2b3o2b2o34b2o2bo b4o94b2ob2ob2o7bo$57b2o33b5o33b2o3bobobo3bob2o99b3o5bo3bo$58b2o31bo37b o2bo2bo7bo2bo100b2o6bo2bo$90b2ob2o39b2obobo3bo104bo6b3o$90b2o2bo33bo4b 2o2bo2b3o104b2o$87b2o2bo6bo26b5o3bo2bo108bobo$88bob2o4b2o28bo3b3o3b2o 105bo$89bo5bo29b2ob3o3bob2o104bo2bo$90b2o3bo30b2o2bo3b3o2bo101bo2bo$ 91bo3b2o27bo11b2obo104bo8b7o$92b3o28b5o2bobo2bobo103bo10b2ob4ob2o$123b o3b2obo4b2o104b3o12bo3b2o2b2o$123bo4bobo119bobo4b3obo2b2o$125bo4bobo3b o111b2o7bobo4b2obo$122b4o4bo5bo109bo4bo7bo7b2o$122b2o8b2obo110bo3bo6bo $123bobo3bob2o113b2obo7b3o$125b2ob3o! golly-2.5-src/Patterns/Life/Still-Lifes/0000755000175100001440000000000012156146015015100 500000000000000golly-2.5-src/Patterns/Life/Still-Lifes/1998-eater-stamp-collection.rle0000644000175100001440000003240112156145314022510 00000000000000#C Collection of 88 glider eaters #C These take between 4 and 25 gens to recover. #C A few of these have been known for many years: 4.0 is 'eater'; #C 5.0 is 'eater2'; 6.0 and 6.1 are variations of 'eater3'. #C 10.0 and 11.3 produce a 1-bit spark, which can be useful. #C Dean Hickerson, ~ December 1998 #C http://www.radicaleye.com/DRH/glider.eaters.html x = 241, y = 350, rule = B3/S23 9b2o4b2o$10bo5bo$9bo5bo$9b2o4b2o6bo11bo$11bob2o9bo11bo2b2o$11b2obo7b3o 9b3obobo$15b2o22bo$16bo8b2o$15bo9bo11b5o$15b2o9b3o9bo2bo$28bo7bo$36b2o $15b2o$15b2o6$11bob2o$11b2obo29b2o$9b2o12bo17bo3bo$10bo13bo17bo2bob2o$ 9bo12b3o15b3ob2obo$9b2o15b2obo15bobo$11bob2o11b2ob3o12bo2b2o$11b2obo 17bo5bo2bo2b2o2bo$15b2o9b2ob3o6b4o4b2o$16bo10bobo12b4o$15bo11bobo10bob o2bo$15b2o11bo11b2o$11bob2o$11b2obo5$118b2o$11b2obo8bo13bo21b2o6bo8b2o 9b2o17bo8bo3bo$11bob2o9bo13bo16b2o2bo8bo2b2obo2bo9b2o10bo4b3o9bo2bob2o $9b2o11b3o11b3o16bobobo6b3obobob2o24bo2bo10b3ob2obo$9bo16b2o30bo12bo2b o23b3obobo14bobo$10bo15b2o11b2obo31bo10bo3bo13bo14bo2b2o$9b2o28b2ob3o 7bo3bo16b2obo9bobobo21bo2bo2b2obo$11b2obo10bob3o15bo7bobobo12bobo2bobo 6b3o2bo22b4o5bo$11bob2o10b2o3bo8b2ob3o6b3o2bo13b2o2bo2bo12b3o8b2o13b4o b2o$9b2o4b2o11b2o10bobo14b3o15b2o15bo8b2o11b2o4bo$9bo5bo8bob2o12bobo 16bo54bo2b2obo$10bo5bo7b2obo13bo74b2obo$9b2o4b2o$11b2obo$11bob2o6$11bo b2o$11b2obo$15b2o5bo24b2o9bo23b2o$16bo5b3o16bo5bo10b3o15bo5bo$15bo9bo 4bo11bob2obo3b2o8bo4bo10bob2obo$15b2o7b2o3bobo8b3o2bob2obobo7b2o3bobo 7b3o2bob2o$13b2o14bobo13bo2bobo14bobo12bo4bo$14bo13b2o2b2o12b2o2b2o12b 2ob2o12b2ob2o$13bo9bo3bo2bobo14bobo9bo3bo4bo13bobo$13b2o9bo2bob2obobo 7b2o3bobo10bo2bob2o10b2o3bobo$11b2o9b3ob2obo3b2o8bo4bo9b3ob2obo12bo4bo $12bo16bo10b3o22bo9b3o$11bo17b2o9bo24b2o8bo$11b2o6$11b2obo8bo26b2o14bo 18bo$11bob2o9bo25bo8bo4b3o11bo4b3o$9b2o4b2o5b3o26bo8bo2bo15bo2bo$9bo5b o10b2o22b2o6b3obobo12b3obobo$10bo5bo8bo2bo2b2o16bo13bo18bo$9b2o4b2o8bo bo4bo2bo9b2o2b3o$11b2obo11bo5bobobo8b2o5bo14b2o5b2o$11bob2o14b2obo2bo 15b2o8b2o5bo5bo5b2o$15b2o12bo2bo28b2o2b3o7b3o2b2o$15bo10bo4bo11bo3bo 17bo11bo$16bo9b5o13bobobo17b2o7b2o$15b2o25b3o2bo19bo7bo$11b2obo13bo19b 3o15bo9bo$11bob2o12bobo20bo15b2o7b2o$28bo6$6b2o4b2obo98bo$7bo4bob2o47b o16bo13bo20bo26b2o19b2o$6bo3b2o4b2o6bo17bo21bob2ob2o10bob2ob2o7bo6b2o 9b3o20bo5bo14bo5bo$6b2o2bo5bo8bob2ob2o11bo2b2ob2obo9b3o2bob2o8b3o2bob 2o5b3o6bobo12b2o18bob2obo3b2o10bob2obo$11bo5bo5b3o2bob2o9b3o3bobob2o5b 2o7bo16bo12b2o5bo11bo2bo2b2ob2o8b3o2bob2obobo8b3o2bob2o$6b2o2b2o4b2o 10bo18bo10bobo4bobo14bobo11bo2bo4bob2o8bobo4bob2o13bo2bobo15bo4bo$7bo 2bo5bo9bobo15b2obo12bo4b2o15b2o12bobo2b2obobo10bo5bo17b2o2b2o15b2ob2o$ 6bo4bo5bo8b2o17bob2o11b2o35bo4bobobo13b2obo18bobo18bobo$6b2o2b2o4b2o 19b2o3b3o55bobob2o12bo2bob2o10bob2o3bobo11bob2o3bobo$10bo5bo20b2o2bo 18b2o3b2o15b2o16b2o12b2o2b3o12b3ob2o4bo10b3ob2o4bo$6b2o3bo5bo8b2o13bob 2o15bo4b2o11b2o2b2o13bo16bo17bo20bo$7bo2b2o4b2o8b2o14bo2bo12bobo16bobo 17b5o13b6o12b3ob2o15b3ob2o$6bo5b2obo28b2o12b2o17bo23bo18bo14bobo18bobo $6b2o4bob2o60b2o19b2o18b3o15bobo18bobo$97b2o18bo18bo20bo6$66bo30b2o$ 12b2o2b2o5bo6b2o15bo11bo4b3o10b2o18bobo$13bo3bo5b3o4bo9bo4b3o12bo2bo 13bobo13bo5bo$12bo3bo9bo4bo9bo2bo13b3obobo8bo5bo14bo4bob2o$12b2o2b2o7b 2o3b2o7b3obobo17bo10bo4bob2o9b3ob2obobo$44bo10bo16b3ob2obobo15bobobo$ 12b2o2b2o12b2o17bo5b3o19bobobo6b2o7bo2bo$13bo3bo8b2o3bo15b3o8bo2b2o14b o2bo7bobo4bobo$12bo3bo9b2o2bo11b2o2bo10bo3b2o12bobo12bo4b2o$12b2o2b2o 13b3o8b2o3bo9b2o16b2o13b2o$33bo12b2o$12b2o2b2o6bo3bo28b2o3b2o26b2o3b2o $13bo3bo7bobobo11b2o3b2o9bo4bo12b2o13bo4b2o$12bo3bo6b3o2bo13bo4bo7bobo 5b3o9b2o11bobo$12b2o2b2o11b3o7b3o5bobo5b2o8bo22b2o$31bo7bo8b2o5$47bo$ 8b2o2b2obo32bob2ob2o$9bo2bob2o30b3o2bob2o10b2o13bo$8bo7b2o16bo16bo13bo bo13bob2ob2obo$8b2o6bo7bo7b3o14bobo9bo5bo11b3o2bobob2o$17bo7bo5bo17b2o 11bo4bob2o13bobo$8b2o6b2o5b3o2b2o2bo27b3ob2obobo15b2o$9bo2b2obo11bo2b 3o32bobobobo5b2o$8bo3bob2o10bobo4b2o14b2o14bobo2b2o5bo2bob2o$8b2o6b2o 8bobob2obo9bob2o2b2o9bo2bobobo11b2obo5b2ob2o$16bo7b3obobo2bo7b3ob2o13b 4ob2o13bobo6bobo$8b2o7bo5bo3bobo2bo7bo39bob3o3bo2bo$9bo6b2o5b2o2bo2b2o 9b3ob2o13b2o19bo3bo2bobo$8bo3b2obo10b2o15bobo14b2o20b3obobob2o118bo$8b 2o2bob2o27bobo38bob2o115bo4b3o$44bo159bo2bo$181bo20b3obobo$174bo4b3o 25bo$175bo2bo20bo$156bo16b3obobo19b3o$109bo39bo4b3o21bo23bo2b2o$109b3o 21bo16bo2bo47bo3b2o$6b2o2b2o4b2o32bo19bo30bo10bo21bob2ob2o7b3obobo16b 2o28b2o$7bo3bo5bo11b2o18bobo11bo4b3o23bo4b3o9bo2b2o16b3o2bob2o12bo16bo 2bo2b2o4b2o$6bo3bo5bo12bobo15bo2bo2bo10bo2bo27bo2bo8b2obob2obo2b2o17bo 20bo11bobo3b2o3bobo17b2o3b2obo$6b2o2b2o4b2o13bo15b2obob2o8b3obobo24b3o bobo8bobo7bo16bobo18b3o10b2ob2o7bo19bo4b2ob3o$12bob2o8bo5b2ob2o15bo3b 2o11bo7bo11bo10bo9bo2bob2o4bo7b2o6b2o14b2o2bo24b2o20bo9bo$6b2o4b2obo9b o5bo2bo12b2obob2o2bo17bobo9bobo20bobob2o3b2o7bobo21b2o3bo12b2ob2o3b2o 24bo2b2ob3o$7bo8b2o5b3o2b3o2bo9b2o2b2obo2bobo18bobo9bobo21bo18bo25b2o 13bobo4b2ob2o22bo2bobo$6bo10bo9bo3b2o10b2o6b2o2b2o8b2o6b2o2b2o5b2o2b2o 6b2o20b2o9b2o4b2o9b2o22bo3bo5bobo22b2o$6b2o8bo10b4o21bobo10b2o2b2obo2b obo7bobo2bob2o2b2o16b2o3bo11bo3b2o9bobob2o3b2o14b4o2b2o3bo$16b2o12bo 21bobo14b2obob2o2bo5bo2b2obob2o20b2o2bo8b4obo15bob2o4bo21bobob2o$6b2o 19b2obobo8bo3bo7bo18bo3b2o7b2o3bo28b3o5bo2bob5o10bo7bo17b2o2bo2b2o2bo$ 7bo20bo2b2o9bobobo22b2obob2o11b2obob2o27bo9bo4bo10bob2obo2b2o16b2o2b2o 4b2o$6bo9b2o8bobo11b3o2bo23bo2bo2bo11bo2bo2bo18bo3bo15b4o12bo2b2o$6b2o 8b2o8b2o18b3o22bobo15bobo21bobobo31bo$48bo23bo17bo20b3o2bo17b2o14b3o$ 117b3o14b2o16bo$119bo4$153b2o$130bo22bobo$6b2o4bob2o48b2o20bo28bo15bob 2ob2o11bo5bo$7bo4b2obo8bo40bo2b2o9bo4b3o21bo4b3o13b3o2bob2o12bo4bob2o$ 6bo3b2o13bo15bo3b2ob2o15bobobo10bo2bo25bo2bo21bo13b3ob2obobo$6b2o3bo 11b3o6b2o8bo3bob2o14b2obo10b3obobo6b2o7b2o5b3obobo18bobo18bobobo$10bo 16b2obo2bo6b3o3bo20bo15bo7bo9bo10bo19b2o19bo2bo$6b2o2b2o14bobob3o11b3o 17b2obobob2o19bo7bo20b2o2bo25bobo$7bo4bob2o10bobo14bo6b2o8b2o2b2obob2o bo18b2o7b2o19bo2bobo16b2o6b2o$6bo5b2obo8b3ob2ob2o10b6o2bo8b2o6bo12b2o 6bo13bo6b2o10bobo2bo4b2o9bobo$6b2o8b2o5bo4bo3bo13bo2b2o19b2o9b2o2b2obo b2obo5bob2obob2o2b2o9b2obo3bo3b2o11bo$17bo6b3obo3bobo8b2o3bo22bo13b2ob obob2o5b2obobob2o17b3obo15b2o4b2o$6b2o8bo10bo5b2o9bobobo9bo3bo7bo17bo 15bo22bob5o13bo3b2o$7bo8b2o8bo15bobob2o11bobobo6b2o13b2obo15bob2o20bo 4bo9b4obo$6bo5bob2o10b2o14b2o13b3o2bo23bobobo11bobobo22b4o10bo2bob5o$ 6b2o4b2obo47b3o20bo2b2o11b2o2bo40bo4bo$65bo19b2o19b2o23b2o16bo$131b2o 15b2o7$192b2o$34bob2o17bo34bo15b2o18bo30bo34bobo$6b2o4b2obo18b2obo10bo 4b3o27bo4b3o14bobo11bo4b3o23bo4b3o30bo5bo$7bo4bob2o14b2o17bo2bo31bo2bo 16bo2bob2o9bo2bo27bo2bo13b2o19bo4bob2o$6bo3b2o19bo2b3o3b2o5b3obobo28b 3obobo15bobobo2bo6b3obobo6b2o9b2o5b3obobo12bobo16b3ob2obobo$6b2o2bo20b obobobobobo10bo10bo9bo13bo15b2obo3bobo10bo7bo11bo10bo9bo5bo21bobobo$ 11bo18b2obo3bobo21b3o9b3o30bo2b2obo19bo9bo22bo4bob2o18bo2bo$6b2o2b2o 21bo2b2ob2o19bo15bo26b2obobo2bo19b2o9b2o19b3ob2obob2o16bobo$7bo4b2obo 14b2obobo2bo11b2o6bo2bo13bo2bo6b2o12b2o2b2obob3o10b2o6bo15bo6b2o14bobo 19b2o$6bo5bob2o10b2o2b2obob2obo11b2o2b2obob2obo11bob2obob2o2b2o12b2o6b o13b2o2b2obob3o9b3obob2o2b2o14bobo12bo$6b2o2b2o4b2o8b2o6bo2bo16b2obobo 2bo11bo2bobob2o26b2o14b2obobo2bo7bo2bobob2o13bo2bobo2b2o6b2obobo$10bo 5bo19bo20bo2b2ob2o7b2ob2o2bo30bo17bo2b2obo5bob2o2bo16b4o2bobo8bobo2bo 4b2o$6b2o3bo5bo19b3o14b2obo3bobo9bobo3bob2o14bo3bo7bo15b2obo3bobo5bobo 3bob2o17bobobo7bo2bo3bo3b2o$7bo2b2o4b2o6bo3bo10bo15bobobobobobo5bobobo bobobo16bobobo6b2o15bobobo2bo7bo2bobobo16bobob2o8b2o2b3obo$6bo5b2obo9b obobo25bo2b3o3b2o5b2o3b3o2bo14b3o2bo24bo2bob2o9b2obo2bo16b2o18bob5o$6b 2o4bob2o7b3o2bo25b2o25b2o19b3o22bobo15bobo38bo4bo$29b3o26b2obo13bob2o 25bo23b2o15b2o41bo$31bo26bob2o13b2obo108b2o7$28bobo28bo30bo18b2o23bo 28bo$27bob2o21bo4b3o23bo4b3o13bobo2b2o16bo4b3o21bo4b3o15bo28bo13b2o$ 27bo3b2o20bo2bo27bo2bo15bob2o21bo2bo25bo2bo11bo4b3o21bo4b3o14bo$8b2o2b ob2o9b2ob2o3bo17b3obobo24b3obobo14bo3b4o15b3obobo6b2o7b2o5b3obobo11bo 2bo25bo2bo12bo2bo$9bo2b2obo10bobob3o23bo7bo11bo10bo13b2ob2o5bo19bo7bo 9bo10bo10b3obobo4b2o11b2o3b3obobo11b5o$8bo7b2o6bo5bo32bobo9bobo24bobob 5o29bo7bo27bo4bobo11bobo7bo$8b2o7bo5bob5o6bo26bobo9bobo22bo5bo32b2o7b 2o31bo15bo22bo$16bo7bo10bobo16b2o6b2o2b2o5b2o2b2o6b2o12bob5o3b2o18b2o 6bo13bo6b2o20b2o15b2o20bobo3b2o$8b2o6b2o8bob2o3bo2bo2bo14b2o2b2obo2bob o7bobo2bob2o2b2o13bo9bo2b2o14b2o2b2obob2obo5bob2obob2o2b2o14b2o6b2o11b 2o6b2o14b2o5bo$9bo4b2o9b2ob2o3b2obob2o18b2obob2o2bo5bo2b2obob2o19bob2o 4bobobo18b2obobob2o5b2obobob2o18b2o2b4o2bo9bo2b4o2b2o19bobob2o$8bo6bo 20bo3b2o19bo3b2o7b2o3bo21b2ob2o3b2obo23bo15bo25bo4bo2bo5bo2bo4bo21b3ob obo$8b2o4bo18b2obob2o2bo7b2ob2o3b2obob2o11b2obob2o3b2ob2o21bo12b2ob2o 3b2obo15bob2o3b2ob2o15b3obob2o5b2obob3o21bo4bobo$14b2o13b2o2b2obo2bobo 9bob2o3bo2bo2bo11bo2bo2bo3b2obo19b2obobob2o8bob2o4bobobo11bobobo4b2obo 18bobo11bobo19b2o2b4o2bo$8b2o2b2o15b2o6b2o2b2o6bo10bobo15bobo10bo13b2o 2b2obob2obo6bo9bo2b2o11b2o2bo9bo11b2o5bob2o5b2obo5b2o14b2o6b2o$9bo3bo 24bobo7bob5o6bo17bo6b5obo12b2o6bo9bob5o3b2o19b2o3b5obo10bobo3b2ob2o5b 2ob2o3bobo20b2o$8bo3bo25bobo8bo5bo29bo5bo23b2o7bo5bo27bo5bo12bo23bo22b o$8b2o2b2o13bo3bo7bo11bobob3o25b3obobo26bo9bobob5o19b5obobo52bo3bo4bob o$28bobobo17b2ob2o3bo23bo3b2ob2o12bo3bo7bo9b2ob2o5bo17bo5b2ob2o11b5o 19b5o12bobobo4b2o$26b3o2bo20bo3b2o25b2o3bo15bobobo6b2o10bo3b4o19b4o3bo 13bo2bo21bo2bo10b3o2bo$32b3o17bob2o29b2obo13b3o2bo19bob2o27b2obo18bo 17bo21b3o$34bo18bobo29bobo20b3o17bobo2b2o19b2o2bobo18b2o17b2o22bo$110b o22b2o19b2o8$29b2o29bo30bo8b2o2b2o27bo28bo$23bo5bo2b2obo17bo4b3o23bo4b 3o9bo2bo2b2obo15bo4b3o21bo4b3o$23b3o4bobob2o18bo2bo27bo2bo11bo4bobob2o 16bo2bo25bo2bo$6b2o4b2obo10bo2b2o21b3obobo24b3obobo10b2o2b2o19b3obobo 6b2o7b2o5b3obobo$7bo4bob2o9bo5bo25bo7bo11bo10bo17bo23bo7bo9bo10bo$6bo 3b2o4b2o6bob5o6bo26bobo9bobo21b6o3b2o28bo7bo$6b2o2bo5bo7bo11bobo25bobo 9bobo20bo10bo2b2o23b2o7b2o$11bo5bo7b3ob2o3bo2bo2bo14b2o6b2o2b2o5b2o2b 2o6b2o12b3ob2o4bobobo13b2o6bo13bo6b2o$6b2o2b2o4b2o9bob2o3b2obob2o14b2o 2b2obo2bobo7bobo2bob2o2b2o14bob2o3b2obo15b2o2b2obob2obo5bob2obob2o2b2o $7bo4b2obo21bo3b2o16b2obob2o2bo5bo2b2obob2o28bo19b2obobob2o5b2obobob2o $6bo5bob2o18b2obob2o2bo18bo3b2o7b2o3bo28b2obobob2o17bo15bo$6b2o2b2o4b 2o12b2o2b2obo2bobo6bo2bob2o3b2obob2o11b2obob2o3b2obo2bo11b2o2b2obob2ob o7bob2o3b2obo15bob2o3b2obo$10bo5bo13b2o6b2o2b2o5b4ob2o3bo2bo2bo11bo2bo 2bo3b2ob4o11b2o6bo9b3ob2o4bobobo11bobobo4b2ob3o$6b2o3bo5bo21bobo19bobo 15bobo33b2o5bo10bo2b2o11b2o2bo10bo$7bo2b2o4b2o21bobo9b5o6bo17bo6b5o24b o6b6o3b2o19b2o3b6o$6bo5b2obo12bo3bo7bo9bo5bo29bo5bo10bo3bo7bo13bo27bo$ 6b2o4bob2o13bobobo16b2o2b2o31b2o2b2o11bobobo6b2o6b2o2b2o29b2o2b2o$27b 3o2bo22bobob2o21b2obobo14b3o2bo15bo4bobob2o19b2obobo4bo$33b3o18bo2b2ob o21bob2o2bo19b3o13bo2bo2b2obo19bob2o2bo2bo$35bo18b2o31b2o21bo12b2o2b2o 29b2o2b2o9$26b2o35bo30bo95bo28bo$26bo2bo26bo4b3o23bo4b3o13b2o32bo30bo 9bo4b3o21bo4b3o6b2o$27b3o4b2o21bo2bo27bo2bo15bo2bo24bo4b3o23bo4b3o10bo 2bo25bo2bo8bo2bo2b2o$30b2o2bo20b3obobo24b3obobo13bob2obob2obo19bo2bo 27bo2bo11b3obobo4b2o11b2o3b3obobo8b2o2bobo$23b2o2b3o2bobo25bo7bo11bo 10bo14bo2bobobob2o17b3obobo24b3obobo15bo4bobo11bobo7bo11b2o$6b2o4b2obo 7bo2bo2bobobo33bobo9bobo25bo2b2o27bo7bo11bo10bo21bo15bo19bo$7bo4bob2o 8bob2o2b2o35bobo9bobo22b3o5bo33bobo9bobo30b2o15b2o15b2obo2bo$6bo3b2o4b 2o5b2obo5bo25b2o6b2o2b2o5b2o2b2o6b2o13bo2b5o6bo27bobo9bobo24b2o6b2o11b 2o6b2o9bo2bobobo3b2o$6b2o2bo5bo10b5o6bo19b2o2b2obo2bobo7bobo2bob2o2b2o 14bo11bobo17b2o6b2o2b2o5b2o2b2o6b2o15b2o2b4o2bo9bo2b4o2b2o11b2ob2o5bo$ 11bo5bo19bobo22b2obob2o2bo5bo2b2obob2o19b3ob2o3bo2bo2bo15b2o2b2obo2bob o7bobo2bob2o2b2o19bo4bobo7bobo4bo23bobob2o$6b2o2b2o4b2o7b4ob2o3bo2bo2b o23bo3b2o7b2o3bo24bob2o3b2obob2o19b2obob2o2bo5bo2b2obob2o24b3obobo7bob ob3o22b3obobo$7bo4b2obo9bo2bob2o3b2obob2o10bo2bob2o3b2obob2o11b2obob2o 3b2obo2bo21bo3b2o20bo3b2o7b2o3bo29bobob2o5b2obobo23bo4bobo$6bo5bob2o 22bo3b2o8b4ob2o3bo2bo2bo11bo2bo2bo3b2ob4o18b2obob2o2bo9bob2o3b2obob2o 11b2obob2o3b2obo11b2ob2o5bo11bo5b2ob2o11b2o2b4o2bo$6b2o8b2o17b2obob2o 2bo19bobo15bobo26b2o2b2obo2bobo8b3ob2o3bo2bo2bo11bo2bo2bo3b2ob3o7bo2bo bobo3b2o11b2o3bobobo2bo9b2o6b2o$16bo14b2o2b2obo2bobo10b5o6bo17bo6b5o 16b2o6b2o2b2o6bo11bobo15bobo11bo6b2obo2bo23bo2bob2o15b2o$6b2o9bo13b2o 6b2o2b2o5b2obo5bo29bo5bob2o21bobo7bo2b5o6bo17bo6b5o2bo8bo29bo19bo$7bo 8b2o22bobo8bob2o2b2o31b2o2b2obo22bobo7b3o5bo29bo5b3o8b2o27b2o10bo3bo4b obo$6bo5b2obo24bobo7bo2bo2bobobo27bobobo2bo2bo10bo3bo7bo11bo2b2o31b2o 2bo9b2o2bobo21bobo2b2o9bobobo4b2o$6b2o4bob2o13bo3bo7bo8b2o2b3o2bobo25b obo2b3o2b2o11bobobo17bo2bobobob2o21b2obobobo2bo7bo2bo2b2o21b2o2bo2bo6b 3o2bo$30bobobo22b2o2bo25bo2b2o16b3o2bo18bob2obob2obo21bob2obob2obo8b2o 31b2o13b3o$28b3o2bo20b3o4b2o23b2o4b3o19b3o16bo2bo33bo2bo59bo$34b3o16bo 2bo35bo2bo20bo17b2o35b2o$36bo16b2o39b2o6$71b2o17b2o$2b2obo6b2obo16b2o 17b2o17bo2bo15bo2bo$2bob2o6bob2o9bo5bobo10bo5bobo10bo5bo2bobo7bo5bo2bo bo$6b2o2b2o4b2o8bo4bo13bo4bo13bo4bob2o2bo7bo4bob2o2bo$6bo3bo5bo7b3o2b 3o11b3o2b3o11b3o2b3o3b2o6b3o2b3o3b2o$7bo3bo5bo10bo3b2o13bo3b2o13bo3b3o 12bo3b3o$6b2o2b2o4b2o10b4o2bo12b4o2bo12b4o2bo12b4o2bo$2b2obo4bo5bo15b 3o16b3o16b2o17b2o$2bob2o5bo5bo10b4o15b4o15b4o2b3o10b4o2b3o$2o8b2o4b2o 10bo3b5o5b2o3bo3b5o10bo3b2o2bo5b2o3bo3b2o2bo$o9bo5bo6b2obobob2o4bo5bo 2bobob2o4bo5b2obobob2o2b2o6bo2bobob2o2b2o$bo9bo5bo5bob2obobo2bo9b3obob o2bo8bob2obobo2bo9b3obobo2bo$2o8b2o4b2o9bo4b2o14bo2b2o12bo4b2o14bo2b2o $2b2obo6b2obo11bob3o13b3o17bob3o13b3o$2bob2o6bob2o12bo2bo13bo20bo2bo 13bo$29b2o36b2o7$26bo$27bob2ob2obo$2b2obo6bob2o9b3o2bobob2o$2bob2o6b2o bo14bobo$6b2o2b2o19b2o$6bo4bo11b2o$7bo2bo12bo2bob2o$6b2o2b2o13b2obo$2b 2obo6bob2o10bobo5b2obo$2bob2o6b2obo9bo2b3o3bob2o$2o14b2o8b2o3bo$o16bo 10b4o$bo14bo11bo$2o14b2o8bobob2o$2b2obo6bob2o10b2o2bo$2bob2o6b2obo14bo bo$31b2o! Check for inclusion of Karel's eater variants -- 2003-02-14: x = 7, y = 10 3b2o$3bobo$5bo$5b2o$2b2obo$3bobo$3bob2o$2obo$o2bo$b2o! .*......** ..*..**..* ***...*.*. ......*.** ...**.*... ...*..*... ....**.... golly-2.5-src/Patterns/Life/Still-Lifes/eaters-misc.rle0000644000175100001440000000171512156145314017745 00000000000000#C Some examples of eater-like objects consuming #C things that aren't gliders or spaceships. #C Pattern from Jason Summers' "jslife" archive. x = 99, y = 49, rule = B3/S23 36bo5boo$4bo32bo5bo17bo14bo$3bobo31bo5boboo8bo4bobo14b3o$3bobo9boo16bo 3bo4boobbo7bobo3bob3o13bo8boobbobbooboo$4bo10boo17b3obbo4boo7bobbobboo 4bo22boboo3boboo$39b5o10boobbo3b3o12bobo9bo5bo$4boo11boobo16boo4bo14b 5o14boobo11boobo$4boo11boob3o15bobboo13boo22bo10bobbo$23bo14bobo14bobo bb3o17boo8boboo$17boob3o10bobbobobo12b3obobobbo27bo$18bobo12b4oboo12bo 4bobo29boo$18bobo16bo15boobooboo$19bo15bobo16bobo$35boo17bobo$55bo8$ 27bo52b3o$26bobo15bo22bo$3o22bobbo11boboo9bo$3o10b3o10boo13bo25boo13b ooboboo$54b3o11boo9boboboboobo$3boo11boo10boo12boo34boboobo$3bo12bo11b o14bo12bo11bo9bo3boo$4b3o10b3o9b3o10bo12bobo9bobo9boo$6bo12bo11bo10boo 12bo11boo11boobo$81boboo10$67bo$33boobboo12boo14bo$35b3o9boboo16bo10bo 6bo$48bo29bo6bo$38bo12bo11b3obboo8bobboobbo$38b3o9bobo14bobo10bobbo$ 41bo9bo15boo12boo$40boo! golly-2.5-src/Patterns/Life/Still-Lifes/eaters.rle0000644000175100001440000000472212156145314017015 00000000000000#C Still lifes that eat gliders. #C Most of the unusual ones were found by Dean Hickerson. #C Pattern from Jason Summers' "jslife" archive. x = 126, y = 135, rule = B3/S23 107bo$7bo23bo25bo20bo29bo$8bo23bo25bo20bo26b3o$6b3o21b3o23b3o18b3o$$ 64boo19boo25bo$11boo22boobbooboo17boobbo16boobbo26bo$11bobo21bobobbob oo17boboo17boboo25b3o$13bo23boobo22bo20bo$13boo22bobboboo19bo20bo$39b ooboo13boobboo19boo29boo$57bobbo20bo32bo$59boo18b3o31bo$78bo34boo$78b oo9$bo$bbo$3o$$4bo$5bo101bo$3b3o102bo$106b3o$7bo$8bo23bo77bo$6b3o24bo 25bo24bo26bo$31b3o26bo24bo23b3o$10bo47b3o22b3o$11bo28boo24boo24boo20b oo$9b3o23boobobbo21boobbo21boobbo19bobbobboo$35booboo23boobo19boobbobo 20bobo4bobbo$14boobo48boboboo14boobobboo20bo5bobobo$14boob3o15booboo 23booboboobo17bobo25boobobbo$20bo15boboo23bobbo22bobo25bobbo$14boob3o 14bo30boo23bo23bo4bo$15bobo16boo78b5o$15bobo$16bo25b3o71bo$42bo72bobo$ 43bo72bo14$3bo24bo21bo23bo20bo$4boo23boo20boo22boo19boo$3boo23boo20boo 22boo19boo$$11bo24bo21bo23bo20bo19bo$11bobo22bobo19bobo21bobo18bobo17b obo$11boo23boo20boo22boo19boo18boo$$115boo$4boo109bobbo$4boo3bo19boo3b o16boo3bo18boo3bo15boo3bo15boobbo$8bobo18bo3bobo15bo3bobo17bo3bobo14bo 3bobo15bobobo$9bobo18bo3bobo15bo3boo18bo3boo15bo3boo15bobboo$11bo19bo 4bo16bo23bo20bo18boo$11boo15b3o5boo13bob5o17bob5o14bob5o$28bo22boo4bo 16bobo3bo14bobo4bo$54b3o17bobbo4bo12bobob3o$51boobo20boo4boo13boobo$ 51bobo11$30boo$7bo17bo4bobo58bo$8bo17bo5bo13bo18bo26bo6boo$6b3obbooboo 8b3o5boboo11bo17b3o22b3obboobobbo15boo$12boboo13boobobo10b3o3boo15bo4b oo21boboboo10bo4bobo$12bo17bobobo17bo14boo3bobbo20bobo14bo5bobbo$10bob o17bobbo18boboo16bobobo20boo12b3o5bobobo$bbo7boo16bobo18booboobo9bo5b oobobbo11boo25boobobbo$3bo24boo20bo15bo3bo4boo12bobboboo21bobo$b3o44bo bo13b3o3boboobo15boobo22boboo$10boo36boo19boobobbo16bobo5boobo8bobbobo $10boo16boo43boo17bob3o3boboo8b4obbob3o$28boo63bo3bo18bobobobbo$94b4o 14boobboo4boo$92bobo17boo$90b3oboboo$26b3o60bo4bobo$26bo63b3obobobo$ 27bo64boo3boo12$5bo17bo19bo19bo22bo22bo$3bobo15bobo17bobo17bobo20bobo 5boo13bobo$4boo16boo18boo18boo21boo4bobo14boo$13boo16boo18boo18boo18bo $8boobobbo11boobobbo13boobobbo13boobobbo16b3obbo21boo$7bobob3o11bobob 3o8bo4bobob3o13bobob3o16bo3b3o16boobobbo$4bobbobo15bobo11bobo3bobo17bo bo19bob3o18bobob3o$4b4ob3o11b3ob5o8bobb3obooboo11b3obooboo15bo4bo12boo 3bobo$8bo3bo9bo3bo4bo9boo4bo3bo10bo4bo3bo16boboobo11bobbobob3o$6bobobb oo9boobbobo15boobo3bobo8boo3boboo15bobobobbo12b4obo3bo$6boo19boo16bob oo3boo14bo16boboo3bo18bobboo$43bo25boo14bo3b3o16bobo$43boo25bo13boo3bo 18boo$70bobo$71boo! golly-2.5-src/Patterns/Life/Still-Lifes/random.rle0000644000175100001440000001667512156145314017024 00000000000000#C Random-looking still life, created by Gabriel Nivasch. x = 98, y = 98, rule = B3/S23 2obob2o3b2ob2o2bob2o3b2o3b2o2bo5bo8b2o2b2obob2ob2o3b2ob2o3b2o5b2ob2obo 3b2ob2obo$ob2obo5bobo2bob2o3bo2bobobo2b3o3b3o5bo2bo2bob2obobo4b2obobo 3bo2b2o2bobob2o2bobobob2o$6bo4bo2bobo4bo2bobobo7bo5bobo2bo2bobo5bobobo 6bo3bo3bob2o2bo3b3obobo$b6o5b2obobob2ob2obo2bo4b2obo2b4ob3ob3obob2ob2o bob6obobo2b3o4b2ob2o4bobob3o$o12bo3b2obobo2bobob2o2bob2obo8bo3b2o2bobo 2bo6bobob2obo2b3o4bob2o2bobo3bo$b2ob2obobobobo2bo3bobo2bobo2bo7bob2ob 4o2bo3bobobobo2b3obo2bo4bo2bo2b4o4bobo2b2o$2bobob2ob2obo3bo3bobob2o2bo 2b6ob2obobo3b3ob2o2bobob3o2bob2obob3o4b2o3bob2obob2obo$2bobo7bobobob2o 3bo2b2o8bo7b3o3bo2b3obo4bobo4b2o3b4o2bo3bobobo4bo$b2obob6ob2o2bo6b2o2b 6o2bob6o4bo2bo5b4obobob2o4bo6bo2bobobobob3ob2obo$o3bobo4bo3bobo8bobo5b obobo5b4ob2ob4o4bobobobob5ob4obob2o2bobobo4bob2o$b4o2b2o3bobo2bobo4b2o 2bobobobobo3bo2bo3bo2bo5b3o3bo2bo7bo3bobo3bobobo3b3o$5bobo3b2obobob2o 5bobob3obobob3obo2bo3bobob4o2b2o2b2obob4o2bob2o2bo3bobo2b3o3b4o$b5o2bo 5bobo7bo2bo5bobo2bo2bob2o2b2obobo3bo8bobo3bobo2bobob2obo2b2o2bobo4bo$o 5bobo2b4ob6o2bobo2b3obob2o3b2o2bobo2bobo2bobob6obobo2b2ob2obobo2bob3o 2bo3b3o$4o2bobobo11bobo2b2obo2bo3b3o2bobo2bo3bob2ob2o5bobob2o5bo2bob2o 5bob4o3bo$4bobobobo2b8obob3o5bob3o2bob2ob3o3bobo6b3obobo3b4obo3bo2b6o 5bob2o$2o2bobobobobo3bo3bobo4b2obob2o3bobo3bo3b4o3b5o2bobo2b3o3bo2b3o 2bo7b5obo$obobo2bobobob2o3bobo2b2obo2b2o4bobob4o2bo5b4o3bobo2bo5b2o2b 2o3b2ob7o6bo$2bo2bobobobobob4o2bobo3bo3b4obobo4b3ob2obo5bobobobo3b2obo b2o2b2o2bobo7bob2ob2o$bobobobobobobobo3bobobob2ob3o5bo3b2o4bobob2o2b3o bobobobo2bobo3bobob2o3b2ob6obo2bo$2bo2bo2bo2bobobo2b2obob2obo4b4ob4o2b 3o3bo4bo4bobobob2obobo3bo2bo6bobo8bo$3b3o5bobobobo3bo4bob2o4bo6bo3b4ob 3ob5obo2bo3bob3obo3bobo3bo4b6o$6b5obo2bobo3bob2obobob3o2bob3obobo6bo2b o6bo3b2obo4bo3b2ob3ob6o$b4o5bobob2obob3obo2bo6b2o3bobobob5o2bobo2b2obo b3o2bo2b2o4bo6bo7bob2o$bo2bob2o4bobo3bo5bobo2b4o2b2o4bo2bo3bob2obobobo bobo2bo2b2ob2o3bob4obob5ob2obo2b2o$2bobobo5bo2b2obo2b2obobobo3bobo2b3o bobo2bobo2bobobobobobobo9bobobo3bobobo2bo7b2o$3b2o2bo5bobob2obo2b2obob o2bo2bobo2bobobob2obobo2bobob2obo2b11obobobo3bo4bob2obo$o4b3o4b2obo4b 2o4bobobo3bo2bobobobo2bo2b2ob2obo4bobo4bo7bobob5o2bobobob6o$5o10bob2o 3b4obobob3ob2obobobobobo4bo3bob2o2bo2bo4b2ob4o2bo5b3obobo6bo$4bob2o4b 4obob3o3bobobo5bo2bobobobob2o3bo3bobo4b7ob2o4bobo2b3o3bobob4o$3obo2bo 3bo5bo4b3o2bobob3obob2obobobobo2bob2ob2o2b4o11b3o2bobo3b3o2bo5bo$o2bob 2o4bob5ob2o3bobo2bobo2b2obo2bobobo2b3obo4b2o4bob2o2b5o3b2o2b3o4b2ob5o$ bobo5b2obo6bob3o2bobo3bo5b2o2bobo6bob2o3b2o2bobo2bo2bo2bobo2b2o3b4o3bo $2obob2o2bo2bo2b3o8bob3ob6o2b3o2b4ob2obob3o2bobo2b3o5bob3o2b3o3bob2o2b o$3bobobobob2obo3b9o4bo5bobo3bobo2bobo8b2ob3o9bo3bobo2b2obo2bob2o2bo$ 3bobobobo4b4o9b3obobobobo2bo2bo2bobo2b8o6b5o6b3o2bobobobobo3b3o$b2obo 2bobob2o5bo2b2o2bo3bobob2obobobo3b2obobobo7bob4o5bob4o3bobo3bobo2bobo$ bo2bob2ob2ob2ob2obo2bo2bob3o2bo4bobob2o3bobobo2b8obo3b2o2b2obo3bobo2bo 3bob2obobob2o$2bobobo9bob2obob2o4b2ob4obobo2bo2bobobo12b2o3bo4bo2b2ob 2ob2ob2o4bobobo$b2obo2b5ob2obo2bobo4b2o2bobo4bobobo2b2obob4ob4ob2obob 2ob5o3bo2bo2bo5b3o2bobo$2bobo7b2o2b3o2b4obo3bobo2b3obob3o3bo4bobo2bobo 2bo2bo10b2o2bo2b5o2b3ob2o$2bobobobobo4bo3b2o3bobo2b2obobo3bobo3b2o2b4o 3bobo2bobobo2b7o7b3o5bo4bo$b2o2bob2ob4obo2bo2b2obobobo2bobob2obo3bobo 7b4ob4o2bob2obo4b8o5b2obo2b2o2bo$o2bobo8b2obobobo2bobobobo2bobo2b5o2b 6obo8bobo2bo3bo9bob2o2bo2bobo2b2obo$b2obobob5o4bobobo2bobobo2b3obobo5b obo4bo3b2ob2o2bob2obo2b10obobobobo2bob2obo2bo$4bobobo4b4o2bob2obobob3o 5bobob2obo2b2o3b3obobobobo2bobobo10b2obobob2obo2bobobo$b2obobo2b3o5b2o 5bobo4bob2obob2obobo4bo6bo3bobobo2bobo2b3ob3o4bobo4bobo2bob2o$o2bo2b3o 3b4obo6bobob4obo2bo5bob4o2bob2obobo2bo2bobo2bobo2bobo2b3obo2b4obo3bo$b o2b2o3b3o3bobobob2obobobo5b3ob3obobo3b4obobob3o3bobobo2b2o3bobo2bob2ob o3bo3b2ob2o$2b2o3b2o4bobobob2obobobo2b5o3bo2bobo2b3o5bobo4b4obobobo5bo b2obo2bobobo6bob2o$5b2o2b6obobo3bobob2obo4b2obobo2b3o3b6obob2obo4bobob 5obo2bob2obobob2o5bo$2b3o2bobo6bo2bob2obo4bob2o3b2obobo3b2o9bobo2b4o2b 2o4bob3o5bobo3bo3b2o$bo3bobobob4ob3o3bobob2obobob2o3b2obob2o2b5ob3o3b 2o3bobo3b2obo4b5obob3obo3bob2o$bobo2bo2bobo2b2o3b2o3bob2ob2o2bob2o4b2o bobo4bobo2b3o2bobo2bob2obobob2obo3bobo3bo2bo2bob2o$2ob2obobo3bo4bo3b4o 8bobob4o3bo2b2o2bobobo3bobobobobo4bo2bo2bobo4b2obo3bobo$6bob5ob2ob4o4b 9obobo2bob2obobobobobo2bobo2bobobobob2obobo2b2ob4obobob3o2bo$2ob2o2bo 6bobo5b3o4bo4bo3bobobo2bo3bobob4obobobo2b2obobo2bob2o6bobobo4b2ob2o$bo bo4b6o2bob4o4bo4b2obob3obo2b3obobobo5bo2bobobo3bo2bobo2bob4obobob5o2bo 2bo$o2bobo7bobobo5bob2o5bo2bo4b3o3bobo3b5o3bobo2bobob3o2bobobo2bobobo 5bo2bobo$2obob7o3bo3b5obo6bo3b4o3b2obobob2o5b3o2b4obo4b2o2bo2bobobobob 2o2bob2ob2o$bob2o7b3ob3obo5bo3bob4o3bobo2bobobobo2b3o4b2o6b4o4b2obobob obobobobobo$o5bob2o2bo3bo5b4obobobo4b2obob3o2bobo3b2o2b3obo2bob3o4b4o 2bobob2obo3bobobo$4ob2obo7bob4obo3bobo3b2obobo5b2obobo6bo2bo2b2obo2b3o bo3bobobo4b4o3bob2o$3bobo2bo2bo3b2obo8bob4obobobob4o3bob4obobobo4bobob o2bobo2b2obo2b4o4b2obobo$2obo2bobobobobo6b2o2b2obo3bobobobobo3bob2o5b 2obob2o3bo2bob2o2bobo2bobobo4bo2bob2obo$obobobobobobob2ob5o4bobob2o3bo 2bo2bob2obo2b3o3bobo3b2obobobo3bobo2bobobob3obobo4b2o$2bobobobobobo2bo bo5bo2bo2bo2b3o3b3o3bo3b2o2b2obobob2obobobobo2b2o2b3obo2bo2bobob4obo2b o$2bobobobobob2obo2b6o3bobobo9b2obo6bo2bobobobobobobobobo2b2o4b2obobo 2bo4bobob2o$b2ob2obo2bobo2b3o2bo7bo2b4o2bobo2bobob4obobo2bobobobobob2o bobo4bobo3bobobo2b2o3bobo$bo5bobo2bobo3bo3b2o2bobobo3b4ob3o2bobo2bobob 3o2bo2bo2bo4bob6obob2obobob2o2b4o2bo$2b6ob2obo2bobo3b2o2bobobob2o5bo5b obobo2b2o3b2obobobo2b3obo7bobo2bobo3b2o4b3o$11bob3ob2o5b2obo2bo2b4obob obobo2bob2o3bo4bobo2b2o2bobob5obo2bobo2bobo3bobo$4ob5obo13bob2obobo4bo b2ob2obobo2bob2ob4obob2o2b2o2bobo3bo2bobobob2ob4ob2ob2o$o2bobo3bo2b4ob 2o6bo2bobob4obo7bob2obo2bo6bo2bobo2b2o2bobo2bobobobo7bo3bobo$5bobo2b2o 3bobo2bo2bob2obo2bo4bo2b2ob4obo2bobo2b3obobobo2bo5bob4obobobob5o3b2o$ 4bobob2o2bo2bo2bob4o2bo2bobob2o5bobo4bobobob2o2bobobob2obob5o5bo2bobob o4b3o2b2o$3bo2bobo2bobob2obo5bo3b2ob2o2b5o2bob2obobobo3bobobob2o3bobo 5b3obobo2bo3b2obo2bo2bo$3b4obob2obo4b5o2b3o6bo4bobobo2bobobo2b3obo2bo 3b3obo2b3o3b2obobob4o2bobob2o$o7bo2bobob3o5b2o4b6ob2obobobobo2bo2b2o3b ob2o2b2o4bobo4bo3b2obo6bo2bo$4ob4o2bobobo2b5o3b3obo5b2obo2b2obobobobo 2bo2bo2b2o2b4o2b5ob2o3bobob3ob2obo$3bobo3b2o2bo2bo6b3o6b3o4bo4bobo2bo 2bob2obobo2bo5b2o6bob3o2bobo2bo3b2o$2obo3bo2bobob2ob4obo2bob5o2bob2ob 5o2bobobobo2bobobobob5o3bob2obo3bob2o2bobob2o2bo$obo2bob2o3bo3bo3bobo 3bo5bo2bobo5bobobobobobo4bob2obo4b4obo2bo3bo3b3o2bobobobo$3b3o3b3ob2ob o2bo3b3o2b3o2b2o2bob3obobobobo2bob3obo5b4o5bo2b2o3b3o3bobobobo2bo$6bob o4bo2bobob3o3b2o3b2o2b2obo2bobobobo2bobo4bobob2obo3bob3ob2o3bobo3b2o2b obob2obo$b4obob4obob2obobo2bobo2b2o4bo3bobo2bobob2obob4o3b2obo4b2obo2b o2b4o3b2obob2obobo2b2o$o4bo5bobobo2bobo2bobobo2b5ob2obob3obo3bo6b3o3bo bo3bobobo2bo4b3obobo2bobobobo$4obob4o2bobob2o2b3ob2o2bo5bobo2bo4b3o2b 4obo3bobo2b4o2bob2obob2o3bobob2obobobo2b2o$3bobobo2bob2o2bo2b2o9b4obob o4b3o3b2o3bob5obobo6bo4bobob2obobo3bo2bo2bobo$2obobo2bo2bo2bobobo2bob 7o3bob2ob4o2bobo3bo2bo7bo2bob5ob4obo3bobobobo3bob2o2bo$o2bo2bob2obo2bo bob2obobo6b2obo4bo3bo3b3o2bob6obo2b2obo4bo5b3obo3bobobobo2bob2o$bob4o 4b4obo4bobob4obobob3obob2ob3o3b3o6bob2obo2bob2obob4o3bob4obob2obo3bo$ 2o5b4o5bob3obo2bo2bo3bo4bobo3bo2b3o3b5obo4bob2obo2bobo4bobo5b2o4b2o2bo $2b4obo2bob2obo2bo3bobo3bobo2b3obo2b2obobo3b2o6b2ob2obo4bobo3b4obobob 2o4b3o2bob2o$2bo2bo2bobobo3b2o4bo2b4ob3o3bob2o2bo2b2o2bob5o4bo2b6ob4o 3bobobobob4o3bobo$6bobobobob2o4b2obobo7bo2bo3bobobo2bobobo2bo5bobo6bo 4bo4bobobobo3bobo2bob2o$5b2obobo2bo2bobo2bobobob2ob3o2b2o3bobob2o2bobo 5bobobobobob2obob3o5bobobo2bo2bobobo2b2o$9b2o4b2ob2o4b2ob2obo10bo7bo5b 2ob2o3b2obob2obo6b2ob2o2b2o3b2ob2o! golly-2.5-src/Patterns/Life/Still-Lifes/ss-eaters.rle0000644000175100001440000000110712156145314017432 00000000000000#C Spaceship eaters. #C Eater+tub MWSS eater by Dean Hickerson, 4-May-1997. #C Stable HWSS eater by Dean Hickerson, 24-Apr-1999. #C Pattern from Jason Summers' "jslife" archive. x = 89, y = 34, rule = B3/S23 80bo$79bobo$80bo$$78b5o$15boo30boo29bo4bo$15bo31bo32boobo$13bobo29bobo 33boboboobo$13boo30boo33bobboboboo$b4o27b5o29b6o9b3o$o3bo26bo4bo28bo5b o12bo$4bo31bo34bo11bobo$obbo27bo3bo29bo4bo11bobbo$33bo33boo12bo3boo$ 82b3o$84bo7$12boo$12boo$46bo34b3o$45bobo32b3o$b4o8boo17b5o9bo19b6o$o3b o8boo16bo4bo28bo5bo$4bo31bo34bo$obbo27bo3bo29bo4bo9b3o$33bo10boo21boo 12b3o$44bo$45b3o$47bo! golly-2.5-src/Patterns/Life/Still-Lifes/stripey.rle0000644000175100001440000000266112156145314017231 00000000000000#C Stripey still life, created by Gabriel Nivasch. x = 66, y = 65, rule = B3/S23 bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo$b64o 2$b64o$o24bo39bo$b23o3b38o$24b3o$b20o2bo3b38o$o20bo2bo2bo37bo$b20ob2o 6b35o$20bo5bo2bo$b19o2b5o2b36o$o19b2o43bo$b17obo2b43o$10bo6bobobo$b8o 3b3o4bob44o$o7bobobo2bo3bo45bo$b7o2b2o2b2o2b2o3b42o$8b2o12bo$b7o2b13o 2b40o$o7b2o15bo39bo$b7o2b15o3b37o$9bo17bo$b7ob2o2b15ob2ob33o$o6bobo2bo 11bo3bobobo32bo$b6o3bobo2b8o3bo3bo2b3o2b2ob24o$7b3o2bobo8b7obobo2bo2bo bo$b6o3b3ob9o6bobo4b2o4b2o2b19o$o6b2o15bobo2bob2o10bo2bo18bo$b5obob16o b4o3bo6b3o4b18o$5bobo22b2o2bob2obo2bobo$b4o2b22o3b3ob2ob3o2b21o$o4b2o 22b3o10b2o21bo$b4o2b22o3b10o2bo2b2ob15o$5bo24b2o10bobo3bobo$b5ob23o3b 8obob2o2bo2b14o$o5b2o23b2o6bobobo2bobo16bo$b4o4b22o2b4o4bobo2bob4ob12o $5b3obo21bo5bo3bob2obo4bobo$b4o2bo2b20o2b5o3b2o2bob3o2bo2b11o$o4bobo 22b2o4bobo3bobo4bobo13bo$b5ob23o2b3obob2ob2o2b2obobob13o$31bo2bobo5bo 3bobo3bo$b30obobob2ob2o4bo2bobo3b3ob7o$o31bobo2bobo4bo3bob4o2bobo6bo$b 32ob3o4bobob3obo4bobo2b6o$40b2obobo3bob2obobo$b22ob11o9bo4b2obobob9o$o 21bobo10bo11b2o4b2o10bo$b21o4b10o2b2o3bo4bo6b10o$22b4o3bo9bo2bobobo4b 3obo$b21o3bobo4b7o3bobob2o2bo2bo2b9o$o21bo2bob2o2bo11b2o4bobobo11bo$b 21o2b2obo3bob2o2b2o6b5obob12o$29bobobobo2bo6bo5bo$b30o2bob2o10b4ob13o$ o32bobo5bob4o3bo14bo$b33o2bo4b2o4bo3b14o$34bobo7b3obo$b34ob2o3b3o4b17o $o37bobo2bob2o18bo$b38ob2o2bob19o2$b64o$bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo! golly-2.5-src/Patterns/Life/Syntheses/0000755000175100001440000000000012156146015014736 500000000000000golly-2.5-src/Patterns/Life/Syntheses/109-still-lifes.rle0000644000175100001440000001754012156145314020130 00000000000000#C A collection of 109 still life syntheses by David Buckingham. #C (Collection assembled by Dean Hickerson, 11 February 1993) x = 246, y = 279, rule = B3/S23 20bobo30bobo12bobo61bo26b2o2b2o$20b2o32b2o13b2o3bo19bo8bo29bo24bobob2o $21bo19bo12bo14bo2b2o20bobo7bo26b3o26bo3bo$14bo26bobo29b2o19b2o6b3o$ 15bo22b2ob2o8bo$13b3o21bobo9bobo43bo16bo$39bo10b2o4b2o8bo6bo19b3o16bob o33b3o12bo$10b3o5b2o23b2o12b2o7b2o4bobo17bo19b2o36bo11b2o$12bo5bobo22b obo10bo3b2o3bobo4b2obo16b2o22b2o31bo12bobo$11bo8bo24bo14bobo12bo12b2o 26bobo$20b2o23b2o13bo14b2o10bobo5b2o19bo21bo$89bo5bobo5b3o22bo7b2o$95b o9bo20b2o9b2o$26bo77bo22b2o$24bobo18bobo83bo17bo$25b2o3bobo13b2o76b3o 4b3o15bobo$30b2o14bo48bo16bobo11bo7bo14b2o$31bo20bo41bo17b2o11bo7b2o 11bo$50bobo10bobo28b3o16bo33b2o$6bobo21b3o18b2o3bo7b2o3bo76b2o$7b2o21b o23b2o8bo2b2o19bo18bobo7bo3bo$7bo23bo23b2o11b2o19bo18b2o8bobo16bo$44bo 14b2o26b3o9bo8bo7b3ob3o13b2o$6b3o35b2o14b2o35b2o37bobo$8bo34bobo13bo8b o24bobo2b2o14b2o$7bo10bobo46bobo24b2o17bobo15bo$18b2o28b3o16b2obo23bo 8bo11bo16b2o6bo$19bo28bo21bo31b2o27b2o5b2o$49bo20b2o30bobo34b2o2$134b 2o3bo$121bo11bobo2b2o$3o89bo27bo14bo2bobo$2bo43bo46b2o8bo16b3o75bo$bo 43b2o36bo8b2o7bobo93bo$45bobo34bo19b2o27bobo63b3o$62bo19b3o47b2o$12b2o 10b2o37bo46bobo19bo12bo$11bobo11b2o34b3o47b2o30b2o17b2o$13bo10bo64b2o 5b3o12bo32b2o16bobo$89bobo4bo10b3o52bo$90bo6bo11bo26bo$obo105bo28bo$b 2o92b2o19bo18b3o$bo92bobo18b2o$44bo42b2o7bo18bobo15b2o6bobo$42bobo3bo 4bobo32b2o20b3o19bobo6b2o27bo3bo$43b2ob2o5b2o19bo12bo22bo23bo7bo28b2ob obo$15b2o2b2o26b2o5bo18bobo35bo58b2o2b2o$14bobob2o47b2o3bobobo$16bo3bo 7bo39b2o3bo2bo12bo41bo$29b2o18b3o15bo8b2o9bobo42b2o6bobo$28b2o21bo36b 2o3b2o36b2o8b2o$50bo18b3o20bobo46bo28bobo$30bo38bo24bo9bo44bo21b2o$30b 2o18bo3b2o14bo25b3o6bo27bo14bo22bo$29bobo18b2o2bobo39bo6b3o28b2o5bobo 4b3o14bobo$20b2o12b2o13bobo2bo17b3o22bo9bo25b2o6b2o22b2o$20bobo11bobo 22b2o11bo34bobo32bo23bo$20bo15bo23b2o11bo33b2o3b2o$36b2o21bo52bobo28b 2o$112bo30bobo$143bo2$95bo$94bo46b2o$94b3o18bo24bobo$113bobo26bo48bo3b o$4bo46bobo34bo25b2o73bobob2o$4bobo45b2o3bo31bo27bobo23b2o45b2o2b2o$4b 2o46bo2b2o9bobo18b3o27b2o24bobo$21bo34b2o4bo3b2o6bo23bobo9bo7bo24bo$bo 13b3o2bo14bo27b2o2bo6bobo21b2o11b2o66bobo$b2o14bo2b3o11bobo25b2o10b2o 23bo4b2o4b2o2b2o64b2o$obo13bo16bobo6bo13bo47bobo6bobo2b2o30bobo27bo$ 33b2o6b2o12bobo6bo32b2o5bo10bo2bobo6b2o22b2o$23b2o16bobo11b2obo5b2o30b 2o23bobo2b2o23bo$b2o2b2o16bobo32bo4bobo7bo24bo23b2o4bo$obob2o19bo10b2o 20b2o12b2o76b3o26bo$2bo3bo18b2o8bobo6bo27bobo77bo19bo7b2o$37bo5b2o106b o21b2o4b2o$43bobo56b2o19b2o43b2o2b2o$101b2o21b2o41b2o21bobo$40b3o60bo 19bo3b2o40bo20b2o$42bo83b2o63bo$41bo86bo69bo$91bobo37b3o63b2o$10bo65bo 15b2o39bo51b2o10bobo$bo6b2o42bo21bobo15bo39bo52bobo$2b2o5b2o39bobo22b 2o48b3o57bo$b2o34bo13b2o56b3o15bo$35b2o37bo36bo2bo11bo21bobo37b3o3bo$ 2bo3b2o28b2o15bo19b2o35bo3bobo31b2o38bo4b2o$2b2o2bobo40bo3bobo17bobo 38b2o4bo28bo39bo3bobo$bobo2bo20bobo20bo2b2o64bo$13bo14b2o3b2o13b3o45bo 22b3o$11b2o11b2o2bo3bo2bo35bo24b2o17b3o$12b2o9bobo6bobobo18bobo13b2o 22bobo3bo13bo70b2o$4b2o19bo7bo2bo10b2o6b2o13bobo26b2o10b2o3bo68b2o$3bo bo4bo25b2o9bobo6bo25bo6b2o9b2o8bobo46bo27bo$5bo3b2o36bo33bo6bobo21bo 44b2o$9bobo45b2o22b3o6bo45bobo19b2o6bo$56bo2bo12b2o63b2o25b2o18bo$57b 2o14b2o62bo27b2o18b2o$72bo35bo75b2o$109bo$54bo52b3o$22bo31bobo30bobo$ 20bobo31b2o23bo8b2o$21b2o56b2o7bo8bo83bo$51bo26bobo15b2o16bo17bo49bo 24bo$49b2o41b2o2bobo14bo17bo48b3o22b2o$50b2o41b2o18b3o15b3o72b2o$92bo 18bo75bobo$103bo5bobo18bo7bobo31bobo12b2o$102b2o6b2o17b2o8b2o32b2o13bo $102bobo18bo5bobo7bo33bo$110b2o11b2o29bo4bo41b3o$109bobo10bobo30b2obo 37b2o5bo7bo$111bo42b2o2b3o34b2o5bo6bobo$65bobo82bo46bo12b2o$66b2o81b2o 35b2o15b2o$66bo20bobo59bobo33b2o16bobo6bo$72bo15b2o97bo15bo7bo$72bobo 13bo69b2o8bo42b3o$72b2o84bobo6b2o20bo$64bo93bo8bobo18b2o7bo$63bo11bo 112bobo5b2o$63b3o9bobo12bobo103bobo$61bo13b2o14b2o114b2o$59bobo29bo 116b2o$55b2o3b2o123bobo19bo$54bobo35b3o90b2o26bo$56bo37bo4b2o47b3o35bo 27bo$26bo3bo62bo4b2o48bo63b3o3bo$27b2obobo67bo48bo19bo30bo15b2o$26b2o 2b2o138b2o29bo15b2o$71b2o96b2o28b3o$72b2o20bo37bo10bobo11bobo$71bo15bo bo5bo15bo18b2o11b2o12b2o$88b2o3b3o16b2o8bo8b2o11bo6b2o5bo61b2o$88bo14b o7b2o7b2o29bobo66bobo8bo$103bobo15b2o17bo11bo3bo63bo8b2o$103b2o36bo13b o74b2o$139b3o13b3o56bo$135b3o37bo31bobo3bo$41bobo15bobo75bo38b2o30b2o 3b3o7b3o$42b2o3bo12b2o3bo41bo20b2o6bo9bobo4bo21b2o2bo28bo14bo$42bo2b2o 9bo3bo2b2o40b2o21bobo15b2o6bo24bobo28b2o12bo$46b2o6bobo7b2o40b2o16b2o 2bo18bo4b3o24b2o8bo20bobo$55b2o68b2o61b2o20bo$124bo28bo34bobo$46bo17bo 76bobo9b2o$37b3o5bobo15bobo76b2o8bobo$2bo36bo5b2obo5b2o7b2obo75bo29b2o $2b2o34bo9bo4bobo10bo95b2o7b2o$bobo44b2o5bo10b2o95b2o8bo8b2o39bobo$98b obo41b2o18bo18b2o41b2o$98b2o41bobo39bo40bo$3bo95bo43bo$bobo17bo202b2o$ 2b2o18bo43bo31b2o123bobo5bo$20b3o4bo39bo2bo26bobo32bo17bobo33bo3bo34bo 3b2o$25bobo37b3o2bo28bo33bo17b2o31bobob2o40b2o$6b2o18b2o15bo26bo60b3o 17bo33b2o2b2o5bo$5bobobo34b2o56b2o90bobo$7bobobo13bo17b2o2b3o15bo5b2o 29bobo90b2o$9b2o13b2o39b2o3b2o30bo$24bobo13b3o21bobo5bo99bo$42bo6b2o 121b2o$41bo7bobo67bo51bobo$49bo67b2o84b2o$118b2o25b2o57b2o$145bobo18b 2o35bo23bo$145bo19b2o58b2o$167bo58b2o$139bobo$7bobo72bobo55b2o20b2o7b 2o$7b2o47bo25b2o8b3o3bo19bo3bobo15bo21bobo5bobo19b3o$8bo45bobo26bo10bo 2b2o20b2ob2o38bo9bo19bo$55b2o36bo3bobo18b2o3bo16b2o51bo$139b2o19b2o$ 57bo30b2o13bo3bobo11b2o18bo17bobo$5b2o5bo16bobo25bobo7b2o18bobo14bo2b 2o13b2o37bo$4b2o4b2o17b2o18b2o6b2o7bobo20bo12b3o3bo12bo$b2o3bo4b2o17bo 19b2o16bo2b2o$obo28bo17bo20b2o6b3o44bo13bo23bo4bo$2bo27b2o40bo5bo47b2o 11bobo19b2o6bo$30bobo19bo26bo45b2o12b2o21b2o3b3o49bobo$9b2o41b2o120bo 8bobo34b2o$10b2o39bobo95bo9bo12b2o4bo4b2o35bo$9bo140bo9bo12b2o3bobo3bo $129b2o7bo9b3o7b3o17b2o40b2o$128bobo6b2o3b2o75bobo$130bo6bobo2bobo10b 3o15b2o5b2o39bo$70bo38bo32bo14bo10b3o2bobo4bobo10bo$68bobo37bo47bo13bo 2bo6bo12b2o$40b3o26b2o37b3o58bo22bobo44bo$40bo111b2o86bo$21b3o17bo29bo 12bobo12bo5bobo45b2o83b3o$23bo47bobo11b2o10bobo6b2o44bo$22bo40b2o6b2o 12bo7b2o3b2o6bo102bo17b2o13bo$44bo19b2o26bobo115bo12b2ob2o15bo$43b2o 18bo16bo3b2o8bo3bo10b3o38bobo17bo3bo29bo3b3o13b2o2bo12b3o$43bobo34b2o 2bobo11b2o9bo17bobo20b2o16b2o5bo26bobo13bobo2bo$79bobo2bo12bobo10bo16b 2o22bo6b2o9b2o2b3o8bo18b2o6bobo4b2o$70b2o56bo6b2o20bobo22bobo26b2o6bo$ o15b2o31bo20bobo61bo2bo20bo24b2o14b2o11bo$b2o14b2obobo19bobo2b2o21bo 64bobo49bo12b2o3bo$2o2bobo9bo3b2o13bobo5b2o3b2o16b2o68bo48b2o8bo3bo5b 2o8b3o19b3o$4b2o15bo13b2o6bo21b2o119b2o6b2o8bobo8bo23bo$5bo30bo25b2o3b o80b2o44bobo19bo21bo$20b3o23b2o13bobo61b2o22b2o2b2o15b2o$bo7b2o9bo25bo bo14bo62b2o2b2o16bo3bobo16b2o$2o7bobo9bo25bo77bo3bobo22bo15bo$obo6bo 40b2o79bo12b2o10b3o8bo$51b2o2bo46bo8bo21b3o8bobo9bo9b2o5b3o29bobo11bo$ 50bo3bo45bobo9bo20bo10bo12bo8bobo6bo30b2o5bobo4bo5bo5bo$31b3o20b3o40b 2o2b2o7b3o21bo39bo31bo6b2o3b3o3bobo4bo$31bo66b2o114bo10b2o4b3o$32bo37b o26bo14bo90b3o15bo$39bobo26bobo31bo9b2o85b3obo17b2o$40b2o8bo18b2o30bob o7bobo87bo2bo5b3o7bobo$4bobo33bo9bobo49bobo95bo9bo$5b2o43b2o19bo31bobo 9bo95bo$5bo26bo38bobo30bo9bobo113b3o11b2o$25bobo2b2o31b2o6b2o42bobo 112bo12b2o$26b2o3b2o31b2o50bobo112bo13bo$26bo36bo53b2o$79bobo$29b2o35b o6bo6b2o119bo8b2o32bo$29bobo9bo6bobo15b2o4bo7bo118b2o9bo32bo$30bo8bobo 7b2o14bobo4b3o125b2o9b3o29b3o$34bo5b2o7bo163bo$34bobo150bo13bo5bo$31bo 2b2o9bo141bobo10b2o3b2o11b2o$30b2o13b2o107bo32b2o11bobo3b2o9b2o$b2o9bo 17bobo11bobo2b2o23b2o43bo35bo57b3o3bo$obo10bo34b2o23b2o43bo34b3o42bo 16bo$2bo8b3o36bo24bo42b3o65bobo7bobo15bo$7b3o176b2o9b2o4b2o$9bo16b2o 159bo14b2o$8bo17bobo19bobo153bo$26bo21b2o146bo$49bo146b2o$195bobo$83bo bo$78b2o3b2o$79b2o3bo$78bo61bo$96bobo39bobo$9bo73b3o10b2o41b2o$9b2o72b o13bo$8bobo73bo$58bo37b3o26bo$49bo6b2o38bo29b2o$47bobo7b2o38bo27b2o$ 48b2o10b2o$54bo5bobo21b2o16bo$53bo6bo23bobo15bobo35bo$10bo33b2o7b3o28b o17b2o34bobo3bo$8bobo32bobo48bobo38b2o2b2o2b2o$9b2o34bo49b2o37bobo6bob o$95bo40bo$11b3o68bobo3bo17bo56bobo$13bo69b2ob2o17bo57b2o20b2o$3o9bo 70bo3b2o16b3o56bo20bobo2b2o$2bo182bo3b2o$bo97bo63b2o26bo$86b2o12b2o61b obo15b2o$37bo47b2o12b2o62bo17bobo15bobo$20b3o13b2o49bo33b2o58bo17b2o$ 22bo13bobo81b2o78bo$21bo58bo17b2o3bo18bo22bo$80b2o17b2ob2o40b2o53b2o$ 79bobo16bo3bobo39bobo52bobo$37bo150bo10bo$36b2o150b2o$36bobo148bobo! golly-2.5-src/Patterns/Life/Syntheses/29-still-lifes.rle0000644000175100001440000001523612156145314020051 00000000000000#C Most of these 29 glider syntheses were found by running #C random patterns with various types of symmetry on tori. #C Occasionally an unusual still life shows up in such experiments, #C and sometimes it's possible to deduce a glider synthesis. #C Dean Hickerson, 30 May 1993 x = 229, y = 229, rule = B3/S23 o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo3$o22bo9bo3bo46bo32bo18bo13bo21bo16bo38bo$22bo15b o61bobo31bobo34bo20bobo$17bo4b3o11b3o62b2o32b2o34b3o19b2o23bo$o14bobo 15bo23bo26bo16bo15bo32bo14bo23bo3bo24bobo7bo$16b2o37bobo13bobo71bo17bo bo52b2o$56b2o13b2o38bobo31bobo16b2o$o32bo38bo3bobo5bo26b2o4bo27b2o3bo 38bo38bo$12bo9bo53b2o34bo$10bobo9bobo52bo123bo$o10b2o9b2o9bo50bo32bo 32bo19bo18bo9bobo26bo$7b2o17b2o141bo30b2o$6bobo17bobo140b3o43bo$o7bo 17bo6bo6bo43bo12bobo12bobo2bo32bo34bo3bo25bobo10bo$40b2o46bo9b2o12b2o 65b3o2b2o29b2o$39bobo3bo43b2o7bo14bo67bo2bobo$o2bo2bo2bo2bo2bo2bo2bo2b o2bo2bo2bo11b2o13b2o22bo3b2o17bo9bo32bo9bo19bo8bo32b2o4bo$44bobo13bobo 43bo47bobo2bo62bobo$60bo45b3o31b2o13b2o2b3o60bo$o29bo48b3o2bo32bo21bo 2bo7bo4bo33bo38bo$79bo59bobo27b3o$80bo59bo30bo$o29bo53bo32bo15bo16bo 19bo18bo38bo$19bo111bobo$18bo113b2o$o17b3o9bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo7b2o23bo32bo38bo9b3o26bo$93b2o80b2o24bo$ 4bo87bo82bobo16b3o3bo$o4bo24bo21bo31bo32bo13b3o16bo24bo13bo6bo31bo$3b 3o45bo69bo11bo33b3o25bo$51b3o67b2o9bo36bo$o29bo53bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bobo27bo17bo20bo17b3o18bo$75bo131bo$74bo133bo$o29bo43b 3o7bo32bo32bo38bo38bo$97bobo$97b2o9bo$o29bo53bo13bo9bobo6bo2bo2bo2bo2b o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo$104bo3b2o$103bo$o4bo24bo47bo2bo2bo18b3o 26bo26bo61bo6bo$6bo5bo77bo130bobo$4b3o5bo22bo55bo129b2o$o11bo17bo2bobo 42bo10b3o40bo2bo23bo68bo$34b2o100b2o$135b2o18bo$o29bo47bo34bo18bo20b2o 4bo68bo$112b2o40b2o$49bo62bobo$o29bo18bobo26bo53bo12bo13bo68bo$49b2o 92bobo65bo$144b2o19bo44bo$o29bo47bo53bo18b2o6bo3bobo44b3o15bo$83bo31bo 29bo4b2o12b2o$49b3o31b2o29b2o29b2o5bo$o7b2o20bo18bo28bo3bobo22b3o4bobo 15bo11bobo8b2o2bo68bo$9b2o39bo56bo46b2o$8bo99bo47bo$o29bo11b2o34bo14b 3o36bo26bo68bo$43b2o50bo52b2o$42bo51bo54b2o$o29bo47bo53bo15bo10bo68bo$ 24b2o$24bobo$o23bo5bo47bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo26bo68bo$56b2o$56bobo$o29bo25bo21bo46bo6bo26bo68bo$124bo$124b 3o$o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo53bo2bo2bo2bo2bo2bo2bo2bo2bo2bo68bo3$o21bobo17bo3bo31bo53b o10bo15bo68bo$22b2o13bo7bobo95bobo$23bo11b2o8bobo14bo80b2o$o35b2o4bo3b o15bobo13bo53bo26bo68bo$62b2o73bo$138b2o$o41bo7bo27bo53bo4b2o20bo68bo$ 50bobo161bo$31bo18b2o110bo49b2o$o28b2o11bo11b2o22bo53bo26bo3b2o48b2o 13bo$30b2o21b2o107b2o$46bo8bo$o37bo3bo2bobo30bo53bo26bo43b3o22bo$37bo 7bobo155bo$37b3o6bo157bo$o41bo35bo17b3o3b2o28bo26bo68bo$74b2o22bo2b2o$ 73b2o22bo5bo49b2o53b2o$o41bo32bo2bo53bo20bobo3bo48bobo17bo$153bo54bo$ 139b2o2b2o$o41bo35bo53bo7b2obobo13bo68bo$139bo3bo2$o41bo35bo48b2o3bo 14b2o10bo68bo$3b3o68b2o51bobo16b2o$5bo67b2o52bo20bo$o3bo37bo32bo2bo12b 2o39bo26bo68bo$8bo81bobo$8b2o82bo$o6bobo28bo3bo35bo53bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo68bo$37b2o$37bobo$o32b2o7bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo53bo26bo68bo$32b2o117bobo$34bo116b2o$o41bo9bo22bo56bo8bo10bo6bo 68bo$53b2o84b3o$52b2o84bo3b2o$o41bo32bo56bo5bobobobo2b3o9bo2bo2bo2bo2b o2bo2bo2bo2bo2bo2bo38bo$139b2obobo2bo$10b2o49bo81bo4bo$o8bobo30bo19bo 12bo56bo26bo22bobo4bo38bo$11bo48b3o119b2o$183bo$o33b2o6bo20b2o10bo26bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo8bo20bo38bo$ 34bobo25bo2bo13bo87bo$34bo28bobo13b2o86b3o$o41bo21bo10bo2bobo21bo38bo 47bo38bo2$153bo56b2o$o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo38bo12bo34bo19b 2o17bo$152b3o56bo2$o44bo89bobo3bo47bo13b3o22bo$11bo123b2o35bo30bo$12bo 123bo34b2o31bo$o9b3o32bo95bo10b2o17bobo15bo31b2o5bo$145b2o4bobo27b2o 38bobo$144bobo6bo26b2o39bo$o33bo10bo95bo4bo35bo6bo38bo$6bo28bo$4bobo 26b3o$o4b2o38bo14bobo69bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo$61b2o$34b2o25bo49b o$o23bo8b2o4b2o4bo64bo21bo41bo3b3o8bo9bo13bo14bo$25bo9bo3bobo68b3o67bo 3bo12bobo13bobo$23b3o13bo139bo2b2o14b2o13b2o$o29bo14bo86bo2bo38bo8b2o 4bo38bo$29b2o105b2o$29bobo103b2o18b3o37b3o17b3o$o44bo86bo22bo18bo14bo 7bo8bo8bo12bo$156bo39bo9bo9bo$17bo49bo5bo21bo5bo47bo28b3o25bo$o14bobo 27bo22bo2b2o23bo2b2o31bo16b2o23bo5bo8bo38bo$16b2o48b3o3b2o20b3o3b2o46b obo28bo4bo$138b2o43b2o$o44bo86bo6b2o33bo8bobo3bo38bo$138bo$19b2o64b2o 3b3o20b2o3b3o$o17b2o4bo2bo2bo2bo2bo2bo2bo2bo40b2o2bo23b2o2bo13bo41bo2b o2bo2bo2bo2bo38bo$20bo64bo5bo21bo5bo2$o10bo3bo8bo15bo4bo86bo53bo41bo$ 9bobo2b2o23bo$10b2o2bobo22b3o$o23bo20bo86bo53bo41bo2$74b3o$o14b3o6bo 20bo30bo55bo53bo41bo$15bo17b2o40bo49bo46b2o$16bo17bo2bo86b2o45b2o$o23b o9bobobo6bo78bobo5bo40bo12bo3b2o29b2o5bo$32bobobobo150bobo29bobo$32b2o 3bo153bo29bo$o2bo2bo2bo2bo2bo2bo2bo2bo5b2o13bo86bo2bo2bo2bo2bo2bo2bo2b o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo41bo$27bo3bo$27b4o$o8bobo12bo20bo86b o14bo26bo11bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo$10b2o17b2o19bo 104b2o7b2o$10bo17bo2bo18b2o103b2o7b2o$o23bo4b2o14bo3bobo80bo14bo26bo 53bo$180bo43bo$151bo17bo11b2o39b2o$o23bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo14bo4bo15bo5bo5b2o41b2o3bo$150b3o15b3o2$o53bo9bobo35bo44bo7bo 9bo8bo53bo$65b2o88bo9bo$65bo89bo9bo13bobo41bobo$o53bo47bo44bo26bo5b2o 41b2o3bo$69bo110bo43bo$19bobo48b2o$o19b2o32bo14b2o31bo10bobo31bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo53bo$20bo93b2o$114bo26bo$o53bo47bo36b2o33bo53bo$ 38bo52bo48b2o$39bo52bo64bo$o36b3o14bo35b3o9bo53bo8bo8bo53bo$6bo52bo49b o29bo16b3o4b2o$4bobo50bobo47bobo29bobo22b2o$o4b2o31b2o14bo3b2o31b2o9bo 5b2o29b2o33bo53bo$28bo8b2o4b2o36bo8b2o4b2o72bo$29bo9bo3bobo36bo9bo3bob o70bo$o26b3o13bo10bo25b3o13bo5bo66b3o2bo53bo$34bo52bo40bo19bo$33b2o51b 2o41bo17bo45bo17bo$o32bobo18bo31bobo13bo24b3o17b3o24bo19bo15bo17bo$ 192b3o15b3o2$o20bo32bo19bo27bo71bo53bo$19bobo50bobo120b2o11b2o$20b2o 51b2o119bobo11bobo$o53bo47bo71bo21bo11bo19bo2$49bo$o22b2o23b2o4bo21b2o 24bo71bo9b2o33b2o7bo$22b2o24bobo24b2o106bobo33bobo$24bo52bo45b3o25b3o 5b2o24bo33bo$o53bo47bo22bo25bo7bobo12bo53bo$15bo3bo48bo3bo51bo27bo6bo$ 13bobo2b2o46bobo2b2o$o13b2o2bobo33bo12b2o2bobo28bo2b3o66bo53bo$107bo$ 106bo$o53bo47bo33b2o29b2o5bo6b2o39b2o4bo$19b3o50b3o36b2o22bobo29bobo 10bobo39bobo$19bo52bo39b2o23bo29bo14bo39bo$o19bo33bo18bo28bo8bo62bo53b o3$o2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo! golly-2.5-src/Patterns/Life/Syntheses/blockish-and-blockic-seeds.rle0000644000175100001440000002262412156145314022434 00000000000000#C Upper left: Blockic 10-glider seed for a p256 oscillator -- #C gliders that must be exactly synchronized are marked off in pairs. #C Lower left: Blockish 1-glider eater2 seed (pure Blockic except #C for pinwheel quadruplicators for gliders): 29 Jan 2004, #C eater2 variant synthesis due to Mark Niemiec. #C Middle: early version of Blockic turner table, used in the #C eater2 recipe. Delay for each turner is shown in Snakial font. #C First column is turners that do not change the glider square color #C Second column is similar, but for color-changing turners. #C Right side is an 'unclustered Blockic 1-glider starseed' -- #C blocks are separated from each other by at least two empty cells. #C Dave Greene, 24 Aug 2004; star synthesis found by Jason Summers. x = 691, y = 391, rule = B3/S23 302boo83boo$302boo83boo20$114boo$114boo3$109boo$96boo11boo$96boo46boo$ 144boo3$139boo245boo$92boo45boo245boo$92boo$$109boo$109boo5boo$116boo 26boo96boboo76boboo$144boo96boobo76boobo$246boo78boo$85boo7boo18boo 131bo10boo67bo15boo$85boo7boo18boo23boo105bo11boo66bo16boobboo$120boo 17boo95boobo6boo68boobo6boo19boobboo4bo$120boo114boboo4boo17boo11bo39b oboo4boo25boo4bo$79boo164bo10booboobboo60bo$79boo17boo144bo11booboo63b o19boo$83boo13boo4boo138boo78boo18boo$83boo19boo136boo78boo$131boo110b o79bo$131boo109bo79bo$143bobo96boo78boo$78boo20boo39bo5bo$78boo5boo13b oo24boo$85boo39boo12bo3boobbo120b3o83b3o$143boo124bo85bo$140bo4bobbo 121bo85bo$81boo7boo471boo$81boo7boo49bo5bo415boo$143bobo3$77boo34boo 270boo62boo$77boo25boo7boo270boo62boo113boo$104boo388boo68boo$494boo$ 70boo46boo324boo23boo$70boo46boo5boo317boo23boo$101boo22boo195boobo$ 101boo5boo80bo131boboo20boo155boo$108boo216boo18boo119boo34boo53boo$ 66boo120bo3bo133bo13boo125boo89boo108boo4boo$66boo52boo205bo12boo88boo 236boo4boo$120boo64bo7bo131boo8boo19bo72boo$124boo190boobobboobo10boo bboo15bo108boo34boo$124boo58bo4boo5bo119boboobboboo14boobboo120boo34b oo$83boo104bobo134boo16boo152boo$83boo101bobbo4bo131bo171boo$89boo27b oo207bo102boo$89boo27boo68bo3bo133boo102boo17boo$322boobo123boo214boo$ 190bo131boboo113boo224boo$87boo350boo$87boo5boo404boo$94boo92boo165b3o 142boo$187boo166bo194boo128boo$189bo166bo193boo128boo$554boo$300boo 252boobboo$300boo256boo95boo$468boo185boo10boo15boo$448boo3boo13boo 197boo15boo$448boo3boo42boo$173bobobobobo203boo110boo$385boo268boo$ 167bo5bo7bo473boo$176boo357boo$165bo3bo3bobbobobbo284boo67boo$176bo 145boobo140boo63boo$163bo7bobo7bo140boboo201boobboo$326boo199boo$161bo 4b3o4bobobobobo144bo$166bo160bo162boo$163bo3bo3bo154boo21boo3boobo132b oo$314boobo4boobo23boo3boobo125boo$165bo3bo144boboo4boboo157boo14boo$ 320boo147boo28boo$167bo152bo148boo178boo21boo$321bo327boo21boobboo$ 320boo334boo18boo$322boobo314boo14boo22boo$322boboo314boo38boo$131bo$ 130boo$130bobo222b3o$350boo3bo$350boo4bo$$300boo$300boo$$118bobobobobo $$118bo7bo467boo$121b3o259boo209boo46boo$118bobbo4bo256boo257boo$122bo $118bo7bo371boo$242boobo76boobo172boo$118bobobobobo115boboo22boo6bo45b oboo$240boo4boo20boo50boo4boo$240bo5bo73bo5bo317boo$241bo5bo73bo5bo20b oo294boo$240boo4boo11boo59boo4boo20boo3boobbo$240bo5bo12boo59bo5bo26b oobbo$241bo5bo73bo5bo262boo3boo85boo$240boo4boo72boo4boo262boo3boo85b oo$240bo5bo73bo5bo$241bo5bo73bo5bo279boo45boo$240boo4boo21b3o48boo4boo 169boo3boo103boo10boo33boo14boo$242boobo23bo52boobo171boo3boo115boo20b oo27boo$242boboo24bo51boboo17boo296boo20boo$164bobo95boo79boo318boo$ 162bo5bo4boo87boo321boo5boo13boo63boo$173bobo179b3o227boo5boo13boo63b oo3boo$161bo3boobbo3bo181bo321boo$164boo190bo$161bo4bobbo6bo359boo4boo $174bo361boo4boo$162bo5bo9bo$164bobo9bo$494boo$178boo302boo10boo90boo$ 178bobo301boo33boo44boo10boo9boo$178bo120boo216boo44boo10boo$299boo 291boo$381boo111boo37boo57boo$381boo111boo37boo$246boo74boboo$247bo28b o45boobo16boo173boo53boo$246bo17boo60boo14boo173boo44boo7boo$246boo16b oo61bo235boo$326bo199boo$246boo78boo12booboo12bo168boo$247bo7boo67boo 14booboo3boo7bo$246bo8boo68bo22boo$246boo15boo59bo$263boo59boo281boo$ 246boo74boo283boo38boo$247bo21b3o51bo323boo$246bo8boo12bo52bo$246boo7b oo13bo51boo278boo$602boo44boo$648boo$355b3o$355bo$356bo293boo$650boo5$ 422boo116boo$416boo4boo116boo$416boo166boo$381boo201boo$297boo82boo 194boo$297boo237boo39boo14boo$242boobo71boobboo3boo101boo16boo87boo55b oo$242boboo72bobboo3boo101boo16boo$246boo69bo284boo$246bo70boobboo3boo 18boo254boo57boo$155boo90bo73bobobobo18boo98boo147boo64boo$155boo89boo 69boo4bobo31bo88boo147boo14boo$242boobo72bo3boobo31bo253boo$242boboo 21boo7bo40bo8boo331boo$240boo25boo48boo8bo116boo213boo$153boo85bo85bo 117boo$153boo86bo16boo57boo7boo$240boo16boo58bo8bo330boo16boo$153boo 87boobo71bo8bo12boo317boo16boo$153boo87boboo71boo7boo11boo$344boo$344b oo$258boo95b3o331boo$258boo9b3o83bo327boo4boo$269bo86bo326boo$42boo 226bo$42boo566boo$148boo444boo14boo$148boo444boo$49boo404boo144boo$49b oo10boo392boo144boo$61boo4boo32boo43booboo$67boo10boo20boo43booboo$79b oo376boo$49boo246boo40boo116boo$49boo45boo52boo145boo40boo37boo215boo$ 67boo27boo52boo84boo4boobo72boobo4boo22boo26boo215boo$41boo3boo19boo 75boo91bo4boboo72boboo5bo22boo106boo$24boo15boo3boo96boo90bo9boo74boo bbo31bo99boo$12boo10boo210boo8bo75bo3boo30bo214boo29boo$12boo233bo18b oo55bo15boo232boo29boo$236boo8boo14boobboo54boobboo11boo255boo$237bo4b oobo16boo12bo41boobo5bo268boo$24boo210bo5boboo12boo58boboo4bo$24boo 210boobboo16boo56boo8boo249boo$240bo75bo260boo25boo$52boo103boo16boob oo56boo3bo75bo8boo276boo$52boo10boo87boobboo16booboo57bobboo74boo9bo 261boo$64boo87boo28boo51bo5boobo72boobo4bo262boo$183boo51boo4boboo72bo boo4boo28b3o252boo$356bo254boo$43boo3boobboo303bo226boo$10boo3boo26boo 3boobboo91boo122b3o312boo$10boo3boo128boo122bo353boo$104boo164bo340boo 10boo$104boo505boo$$180boo392boo$116boo62boo392boo$31boo3boo66boo10boo 51boo174boo$31boo3boo66boo63boo174boo$428boo149boo$77boo349boo3boo63b oo79boo$44boo31boo101boo251boo63boo$11boo31boo134boo150boo108boo$11boo 49boo268boo4boo102boo20boo$62boo22boo147boo5boobo66boobo6boobo12boo38b oo55boo27boo20boo115boo3boo$86boo148bo5boboo15boo49boboo6boboo52boo55b oo14boo33boo10boo103boo3boo$235bo10boo13boo53boobboo4boo30bo92boo45boo $67boo166boo9bo69bo3bo5bo31bo$67boo178bo69bo3bo5bo95boo85boo3boo$32boo 201boo9boo68boobboo4boo95boo85boo3boo$32boo202bo5boobo11boo17bo35boobo 4bo5bo$14boo3boo214bo6boboo11boo53boboo5bo5bo199boo$14boo3boo214boo9b oo68boobboo4boo133boo64boo$83boo161bo69bo3bo5bo134boo$83boo150boo10bo 69bo3bo5bo$236bo9boo68boobboo4boo$45boo188bo6boobo66boobo6boobo205boo 74boo$45boo8booboo175boo5boboo66boboo6boboo30b3o172boo74boo$55booboo 35boo259bo$95boo260bo105boo$269b3o191boo46boo$54boo213bo241boo$54boo 126boo86bo$15boo69boo94boo$15boo69boo18boo$106boo441boo$549boo$187boo$ 87boo98boo$87boo455boo$119boo423boo$119boo65booboo$44boo140booboo$44b oo64boo313boo38boo$110boo200boobo6boobo99boo22boo14boo$126boo57boo125b oboo6boboo103boo18boo$125bobbo56boo129boo8boo30bo70boobboo21boo230b3o$ 31boo43boo48boo188bo9bo31bo15boo57boo21boo178boo50bo$31boo4boo37boo 239bo9bo46boo230boo28boo51bo$37boo277boo8boo15booboo258boo14boo$312boo bo6boobo17booboo274boo$312boboo6boboo12boo275boo$116bo199boobboo16boo 275boo$115bobo198bo3bo$82boo31bobo199bo3bo256boo$82boo32bo4boo11bo181b oobboo252boobboo$121boo10bobo176boobo6boobo248boo63boo$133bobo176boboo 6boboo30b3o211boo67boo$134bo221bo213boo$357bo92boo$81boo205boo160boo$ 81boo205boo318boo$46boo560boo42boo3boo$46boo75boo48boo3boo241boo15boo 197boo13boo3boo$122bobbo47boo3boo241boo15boo10boo185boo$123boo6boo317b oo95boo$130bobbo413boobboo$131boo418boo$425boo128boo$52boo6boo363boo 128boo$52boo6boo543boo$66boo16boo47boo470boo$66boo16boo10boo35boo7bo 523boo$70boo24boo16boo25bobo204boo90boo224boo$66boobboo41bobbo24bobo 167boo3boo4boobo22boo90boo214boo$5boo44boo9boobboo46boo26bo34boo132boo 3boo4boboo330boo17boo$5boo3boo39boo9boo20boo38boo51boo141boo36bo316boo $10boo72boo38boo185boo3boobbo37bo248boo$311bobobobo3bo21boo29boo231boo $313bobo4boo21boo29boo227boo34boo$104bo61boo144boobo6boobo277boo34boo$ 103bobo60boo148boo4boboo349boo$82boo19bobo49boo160bobboo4boo13booboo 85boo4boo236boo$82boobboo16bo17bo11boo19boo75boo3boo3boboo70bo3bo5bo 14booboo85boo4boo108boo89boo$oo84boo33bobo9bobbo95boo3boo3boobo70boo3b o5bo219boo53boo34boo$oo88boo29bobo10boo110boo69bobboo4boo274boo$90boo 21boo7bo109boo3boo8bo12boo54bo5boobo19boo$113boo42boo73bobobobo7bo13b oo54boo4boboo19boo9b3o277boo23boo$157boo75bobo9boo108bo279boo23boo$ 233boobo7boo111bo253boo$237boo6bo30bo264boo68boo$111boo125bo5bo296boo 113boo$110bobbo123bo6boo410boo$111boo124boo3boo$124boo3boo12boo93bo4bo 11boo$124boo3boo12boo92bo4bo8boobboo$237boo3boo7boo289boo$542boo3$269b 3o$269bo$270bo75boo$38boo306boo$38boo271boo3boo4boobo$311boo3boo4boboo $128boo9boo3boo174boo4boo30bo$50boo76boo9boo3boo165boo3boobbo5bo31bo$ 38boo10boo259bobobobo3bo5bo45boo$38boo273bobo4boo4boo45boo$60boo250boo bo6boobo15boo$60boo254boo4boboo15boo$54boo261bo8boo$18boo34boo260bo9bo $18boobboo26boo66boo3boo191boo9bo12boo$22boobboo22boobboo62boo3boo192b o8boo12boo$26boo26boobboo256bo5boobo$58boo256boo4boboo30b3o$19boo106b oo227bo$19boo106boo228bo3$64boo73boo$64boo61boo10boo$70boo55boo$70boo$ 119boo$119boo$66booboo214boo$66booboo214boo3$68boo$68boo279boo$232boob o6boobo66boobo6boobo10booboo8boo$232boboo6boboo16boo10boo36boboo6boboo 10booboo$193b3o34boo4boobboo20boo10boo34boo8boo4boo30bo$193bo36bo5bo3b o69bo9bo5bo31bo$194bo36bo5bo3bo69bo9bo5bo12boo$230boo4boobboo68boo8boo 4boo12boo$232boobo6boobo66boobo4bo5bo$232boboo6boboo25boo39boboo5bo5bo $236boobboo4boo14boo7boo43boobboo4boo$236bo3bo5bo15boo52bo3bo5bo$237bo 3bo5bo69bo3bo5bo$56boo178boobboo4boo37bo30boobboo4boo$56boo174boobo6b oobo66boobo6boobo$232boboo6boboo66boboo6boboo30b3o$356bo$55boo300bo$ 55boo$$59boo$54boo3boo$54boo$278b3o$278bo$279bo!golly-2.5-src/Patterns/Life/Syntheses/life-integer-constructions.rle0000644000175100001440000007011512156145314022654 00000000000000#C Collection of small objects generated from integers written #C in a five-cell-high 'font' suggested by Eric Angelini. #C For a more complex construction, see Scripts/life-integer-gun30.py. #C See http://www.radicaleye.com/DRH/digits.html for details. #C #C This pattern contains numeric predecessors of various still-lifes, #C oscillators, the "familiar fours" (and some less familiar ones), #C and the 4 common spaceships. The numbers with at most 6 digits #C are probably minimal; the larger ones probably aren't. #C #C Names of the less common objects are taken from #C Andrzej Okrasinski's Game of Life Statistics. #C #C blinker (p2) 29 #C block 70 #C tub 3906 #C boat 24 #C beehive 163 #C ship 516 #C barge 243 #C toad (p2) 8696 #C beacon (p2) 3671 #C aircraft carrier 186176 #C snake 341957652114 #C loaf 60 #C long boat 587 #C eater 1084557 #C long snake 6065270247413614 #C #C pond 36 #C mango 857 #C long barge 127515 #C long ship 154235114 #C tub with tail 2557376 #C canoe 52104106503114 #C shillelagh 157796 #C hook with tail 112108350204 #C bipole (p2) 7020200455 #C long shillelagh 8330423935 #C very long boat 4476 #C hat 249681 #C up boat with tail 18019138 #C down boat with tail 19333076503 #C tub with long tail 1599435990114 #C #C integral sign 1135274716 #C tub with nine 187597582 #C very long ship 31808650070114 #C boat tie 7200647110228 #C block and table 41275676414 #C beehive with tail 10846421 #C up barge with tail 55540559353 #C down barge with tail 1552921912246414 #C claw with tail 91254643267 #C cis shillelagh 111410294065111068 #C loop 3317286570681 #C unnamed 11-bit still-life 761314714 #C elevener 1858705011164 #C unnamed 11-bit still-life 21590971031 #C eater siamese snake 147432532023 #C #C trans loaf with tail 149059473114 #C trans long boat with tail 6733116821185776 #C ship boat tie 1125100561957 #C cis boat and table 18710583610 #C pair of tables 33108318 #C ship tie 141225452 #C trans legs and block 11317113569 #C eater siamese eater 410754245114 #C cis block and long hook 1006382171456 #C unnamed 12-bit still-life 127745053 #C beehive with bend tail 7961412233308125408 #C cis snorkel loop 16635966646711066148 #C unnamed 13-bit still-life 38923541681 #C beehive at loaf 277305174681 #C half bakery 76109 #C #C cis loaf at loaf 189422808541 #C paper clip 324637 #C big S 14172002 #C hat siamese hat 1130132 #C racetrack II siamese hat 22798258254132 #C fourteener 23144355435681 #C cis mirrored R-bee 380718 #C trans rotated R-bee 4104645072 #C cis rotated R-bee 7621392111674 #C bookends 18030383 #C cis hook and R-bee 113021797020694 #C pond and table 604123154231147 #C block and dock 141247457341871 #C beehive and cap 410173645421961 #C dock siamese carrier 14644309288681 #C #C unnamed 14-bit still-life 13673415404000183 #C cis boat and dock 6581004399314 #C bi-pond 141207310 #C moose antlers 7686328 #C cis mirrored long hook 113183 #C beehive and dock 340412204591456712 #C cis mirrored R-loaf 410813883110 #C scorpion 1803712066986301 #C twin peaks 66695034197110359 #C unnamed 18-bit still-life 1893303515 #C cis mirrored R-mango 4110080033111 #C cis rotated R-mango 669019610699 #C dead spark coil 4108303132 #C trans rotated C 6587961971 #C unnamed 18-bit still-life 13554271714 #C #C pond and dock 182530867166 #C cis long hook and dock 122915233114 #C unnamed 19-bit still-life 7161006176 #C cis mirrored dock 25410808131018 #C unnamed 21-bit still-life 46725681 #C long worm and blocks 13801006728751 #C cis mirrored worm 6308383830114 #C cis mirrored long dock 630800000080010 ( Nicolay Beluchenko ) #C unnamed 26-bit still-life 180303033818720 #C unnamed 28-bit still-life 180010010081 #C unnamed 38-bit still-life 70310003114 #C #C traffic light 1 #C blockade 67 #C honey farm 78 #C fleet 7108 #C bakery 1672 #C land of lakes 1635661 #C 4 eaters 11300 #C #C pulsar (p3) 0 #C pentadecathlon (p15) 1445481003304129144171771 #C queen bee shuttle (p30) 1983263225470666662666647618 #C twin bees shuttle (p46) 397301133310 #C twin bees shuttle (p46) 331101301133310 #C (last three found jointly with Nicolay Beluchenko) #C #C glider 90 #C LWSS 3207 #C MWSS 94174 #C HWSS 185598100297311043114 #C #C Dean Hickerson, 26 March 2007 x = 736, y = 428, rule = B3/S23 b3o12b3ob3o60b2o13b3ob3o46b2o15bobob3ob3ob3ob3obobob3obob3o33b2o13bobo bob3ob3ob3ob3obobob3ob3obobobobo37bo16bob3ob3obobob3ob3ob3ob3ob3ob3obo bobo25bo16bob3ob3ob3ob3obobobob3obobob3obobob3ob3ob3obob3ob3o15b2o13bo b3ob3ob3ob3ob3ob3ob3ob3obob3ob3o43b3o14bo$18bobobo59bo2bo14bobo48bo16b obo3bobo5bo3bobobo3bobobo34bo2bo12bobobobobobobobo3bobobobo3bo3bobobob obo36bobo15bobobobobobobo3bo3bobobobobobobobo3bobobo24bobo15bo3bobo5bo 3bobobobobo3bobobobobobobobobobobobobobobo3bo14bo2bo12bobobo3bobo5bobo bobobobo5bobobo3bo62bo$16b3ob3o59bo2bo12b3ob3o47b3o13bobob3ob3ob3o3bob 3o3bobob3o32bobo13bob3ob3obobob3ob3ob3o3bob3obobob3o35bo2bo15bob3ob3ob 3ob3ob3ob3obobob3ob3ob3obo24bobo15bob3ob3o3bob3ob3obob3ob3obobob3obobo bobobobobob3ob3o14bo2bo12bob3ob3ob3ob3obobob3ob3o3bobob3ob3o41bo5bo12b o$16bo5bo60b2o15bobobo50bo12bobo3bo3bobo5bo3bo3bobobobo33bo14bo3bo3bob obo3bo3bo3bo3bo3bobobo3bo36b2ob2o13bobobo3bo3bobo3bo3bobobobobobo3bo3b obo25bob2o13bo3bobobo3bo3bo3bobo3bo3bobobo3bobobobobobobobobobo3bo15b 2o13bobobobo5bo3bobobobobobobo3bobobobobobo41bo5bo12bo$16b3ob3o75b3ob 3o49b2o12bobob3ob3ob3o3bo3bo3bobob3o30b3o15bo3bob3ob3ob3ob3o3bo3bob3ob obo3bo38bo2bo12bob3ob3o3bob3ob3ob3ob3ob3ob3o3bobo27bobo12bob3ob3o3bob 3o3bobob3o3bob3o3bob3ob3ob3obob3ob3o30bob3ob3ob3ob3ob3ob3ob3o3bobob3ob 3o41bo5bo12bo$231bo96bobo82bo2bo86b4o$329bo84b2o86bo4bo98b3o$502b2o2b 2o8$665b3ob3o$665bobobobo$665b3obobo$667bobobo$665b3ob3o2$601b2o$601b 2o2b2o$605b2o7$2b2o12b3ob3o59b2o14b3ob3ob3o42bo16bob3ob3ob3ob3ob3ob3ob 3ob3o34b2o12b3ob3ob3ob3obobob3ob3ob3obobob3ob3ob3ob3ob3o24b2o14b3ob3ob obob3ob3ob3o47bo14b3ob3ob3obob3ob3obobob3ob3ob3ob3obobobo26b2o2b2o12bo b3ob3ob3obob3ob3ob3ob3obobobobo64b3ob3o$2b2o14bobobo58bo2bo13bobobo5bo 41bobo15bobobo3bobo3bobo3bobo3bobo3bo33bobo12bo5bo3bo3bobobobo3bobo3bo bobobobobo5bo3bobo25bo2bo15bo3bobobobo5bo3bo46bobo13bo3bo3bobobobobobo bobobo3bobobobobo3bobobobo26bo4bo12bo3bo3bobobobobo5bo3bo3bobobobobo 64bo5bo$18bobobo59bo2bo12b3ob3o3bo42bobo14bob3o3bob3ob3o3bob3ob3ob3o 32bobo13b3o3bob3ob3obobob3ob3ob3obobob3ob3o3bo3bob3o23b2obo13b3ob3ob3o b3ob3o3bo47b2o13b3ob3ob3obobobobobob3ob3ob3ob3ob3obob3o27b4o13bob3ob3o b3obob3ob3ob3ob3obobob3o64b3o3bo$18bobobo60b2o13bobo3bo3bo44bo14bobobo 3bo3bo3bo3bo3bobobobo33bobo14bobo3bo3bo3bobobobobobobobo3bobobobo3bo3b o3bobobo24bob2o14bobo5bobobo3bo3bo62bobo3bobobobobobobobo3bo3bo3bo3bo 3bobo3bo44bobo3bo5bobo3bobo5bo3bobobo3bo64bobo3bo$18bob3o75b3ob3o3bo 44bobo12bob3o3bob3ob3o3bob3ob3ob3o31bo16b3o3bob3ob3obobob3ob3ob3obobob 3ob3o3bo3bob3o24bo2bo12b3ob3o3bob3ob3o3bo45b4o13b3ob3ob3obob3ob3o3bob 3ob3ob3ob3obo3bo27b4o13bob3ob3ob3obob3ob3ob3ob3obobo3bo64b3o3bo$154b2o 75b2o96b2o80bo4bo85bo3bo$411b2o2b2o85b2o5$605b2o$605b2o2b2o$609b2o2$ 665b3ob3ob3ob3o$667bo3bobobo3bo$665b3ob3obobo3bo$667bobo3bobo3bo$665b 3ob3ob3o3bo7$604bo$603bobo$603bobo$604bo$2bo13b3ob3ob3ob3o53bo13bob3ob 3ob3obob3o34b2o15b3obob3ob3ob3ob3ob3ob3ob3ob3ob3obobobobo14b2o16bobob 3ob3obob3ob3ob3ob3obob3ob3ob3o37b2o13bobobobob3ob3ob3ob3ob3o37b2o5b2o 12b3ob3ob3ob3ob3ob3ob3o47b2o15b3obob3obob3ob3ob3obob3ob3o70b3ob3o$bobo 14bobobobobobo54bobo12bo3bo3bobo3bobo36bobo16bobobobobobobobobo3bo3bob obobo3bobobobobobobo14bobo15bobo3bobo3bobobobobobo3bo3bobobobo5bo36bo 2bo12bobobobo3bo3bobobobobo3bo37bo7bo14bobo3bobobo5bo3bobobo47b2o17bob obo3bobobobobobo3bo3bobo48b2o7b2o15bobobo$2bo13b3ob3obobob3o51bobo13bo b3o3bob3obob3o35bobo13b3obob3obobob3ob3ob3obobobobo3bobobobobob3o15b2o 15bobob3ob3obobobobobob3ob3obob3ob3o3bo36bob2o12bob3obo3bob3obobobobob 3o38b3ob3o15bob3ob3ob3ob3ob3ob3o51bo14bobob3obobobobobob3obo3bob3o45bo 2bo5bo2bo14bob3o$18bo3bobobobobo50bobo14bobo5bo3bobo3bo36bobo14bobobob obobobobobobo3bobobobobo3bobobobobo3bo17b2o13bobobo5bobobobobobo3bobob obo3bo3bo3bo33b2obo15bo3bobo3bobo3bobobobobo42bobo17bobobobobobobo3bob o3bobo47b5o14bobobobobobobobobobobobo3bobobo46b2o7b2o15bobobo$16b3ob3o b3ob3o51bo15bob3o3bob3obob3o37b2o12b3obob3ob3ob3ob3ob3ob3ob3o3bob3obob o3bo17bobo12bobob3ob3obob3ob3ob3ob3obob3ob3o3bo33bo2bo15bo3bobo3bob3ob 3ob3ob3o41bo18bob3ob3ob3ob3ob3ob3o46bo19bobob3obob3ob3ob3obo3bob3o72bo b3o$235bo90b2o174bobob2o96bo$503b2ob2o95bobo$603bobo$604bo7$665b3obobo bob3obobo$665bobobobobo3bobobo$665b3ob3obo3bob3o$667bo3bobo3bo3bo$665b 3o3bobo3bo3bo11$2bo13b3obobo59b2o14bob3obobob3ob3ob3obobobobo24bo16b3o b3ob3ob3ob3obobob3obobob3ob3ob3ob3o20b2o12bob3ob3obob3ob3ob3ob3ob3obob 3o42bo15bobob3ob3obob3ob3o46b2o16bobobobob3ob3ob3ob3obob3o44b2o2b2o12b 3ob3obobobob3ob3ob3ob3obob3obob3obob3o38b2o16b3obob3ob3o$bobo14bobobo 59bobo13bobo3bobo3bo3bobo3bobobobo23bobo17bo3bobobobobobo3bobo3bobobob obo3bo3bobobo17bo2bo13bobobo3bobobobobo3bobo3bobo3bobobo40b5o13bobo3bo bobobo3bo3bo45bo2bo15bobobobo3bobobo3bo3bobobobo44bo4bo14bobo3bobobobo bobobobobobobobo3bobobobobobobo38bobo17bobobobobobo$b2o13b3ob3o60bobo 12bob3ob3ob3ob3ob3obobob3o24b2o17bob3obobobobob3ob3o3bobobobobob3ob3ob 3o16bobobo13bob3o3bobobobob3ob3ob3ob3obobobo39bo5bo12bobob3obobobob3ob 3o45bo2bo15bob3obob3obobo3bob3obobobo45b4o13b3ob3ob3obobobob3obobob3ob ob3obobobobob3o39b2o17bobobobob3o$16bo5bo61b2o12bo3bo3bobo5bo3bobobo3b o26b2o15bobo3bobobobobobo3bo3bobobobobobo3bo3bobo17b2ob2o12bobobo3bobo bobo3bobobo3bobobobobobo40b5o13bobo3bobobobo3bobo48b2ob2o13bo3bobobo3b obo3bo3bobobobo62bo5bo3bobobobobobobobobobobo3bobobobobobobo41b2o15bob obobobobo$16b3o3bo75bob3o3bob3ob3ob3obobo3bo26bobo14bob3ob3ob3ob3o3bo 3bobobob3ob3ob3ob3o34bob3o3bobob3ob3ob3ob3ob3obob3o42bo15bobob3ob3obob 3ob3o48bo2bo12bo3bobob3ob3o3bob3obob3o45b4o13b3ob3o3bobob3ob3ob3ob3obo b3obob3obob3o34b2o5bobo14bobob3ob3o$154bo258bo2bo85bo4bo93bobo5b2o$ 414b2o86b2o2b2o94b2o$604b2o$604bobo$605b2o6$665bob3ob3ob3ob3ob3obob3ob 3ob3ob3ob3ob3obobob3obobob3obobobobo$665bobobobo3bo3bobobobobobobobobo 3bobobo3bo3bobobobobobobo3bobobobobo$665bob3ob3ob3ob3ob3obobobobobob3o b3o3bob3obobobobob3ob3obobob3o$665bobobo3bo3bo3bobobobobobobobobo5bo3b o3bobobobobo3bo3bobobo3bo$665bob3ob3ob3ob3ob3obob3ob3ob3ob3o3bob3obobo b3o3bob3obobo3bo11$b2o13bob3ob3o57bo15b3ob3ob3ob3ob3ob3ob3o27bo2bo12bo bobob3ob3ob3ob3ob3ob3obobobobobo26bo2bo12b3ob3obob3ob3ob3obob3o52bo15b 3ob3ob3ob3ob3ob3ob3ob3ob3ob3obobobob3ob3o15b2o15bobob3obob3ob3o59b2o 13bobob3ob3ob3ob3ob3ob3obo56b2o16bob3ob3ob3o$o2bo12bobo5bo56bobo16bobo 3bo5bo3bo3bobo29b4o12bobobo3bo3bobo3bo5bobo3bobobobobo26b4o14bo3bobobo bobobo3bobobobo50b5o15bo3bo3bobobobobo3bobo3bobo3bobo3bobobo3bo3bo15bo 3bo12bobo3bobobobo3bo59bobo12bobobo5bo3bobo3bo3bobobo55bo2bo15bobo5bo 3bo$b2o13bob3ob3o57bobo13b3ob3ob3o3bob3o3bob3o43b3obob3o3bob3ob3o3bob 3ob3obob3o42b3ob3obobobob3ob3obob3o49bo5bo12b3ob3o3bob3ob3ob3ob3ob3ob 3ob3ob3obob3ob3o16b4o12bobob3obob3ob3o61bo12b3ob3o3bob3ob3ob3ob3obo55b obo16bob3o3bob3o$16bobobo3bo59bo13bo5bo3bo3bo3bo3bobobo29b2o14bobobo5b o3bobobo3bobobo3bobo3bo26b4o14bo3bobobobobobo3bobobobo50bob3o13bo3bo5b o3bobobobo5bobobobo5bo3bobo3bobo34bobo3bobobobo3bo57b4o15bobobo3bobo5b obobobobobo53b2obo3bo13bobobo3bobo$16bob3ob3o59b2o12b3ob3ob3o3bob3o3bo b3o29b2o14bobob3o3bob3ob3o3bob3o3bobo3bo26bo2bo12b3ob3obob3ob3ob3obob 3o51b2o15b3ob3o3bob3ob3ob3ob3ob3ob3ob3o3bobob3ob3o16b4o12bobob3obob3ob 3o57bo18bob3o3bob3ob3ob3ob3obo52bo2bo3bobo12bob3o3bob3o$412bo3bo83b2ob ob2o94bobo3bo2bo$412b2o86bo2bob2o95bo3bob2o$501b2o102bobo$604bo2bo$ 605b2o21$2b2o12b3obob3o59b2o12b3ob3obob3obobobob3ob3ob3ob3ob3obobobobo 9b2o12bob3ob3obobob3obobob3obo40b2o12bobobobob3ob3ob3obobob3ob3o48b2o 14b3ob3obobobobobob3ob3ob3obobob3ob3ob3ob3obo16b2o2b2o12b3obobob3obobo bob3ob3ob3obobob3ob3obobobob3ob3ob3obob3o8b2ob2o13bob3ob3ob3obob3ob3ob 3ob3ob3ob3ob3ob3obo36b2o16bob3ob3ob3ob3ob3obo$bobo12bo3bobo62bo12bo5bo bobobobobobobobobo3bo3bobo3bobobobobo9bo13bobobobobobobobo3bobo3bobo 39bobo12bobobobo3bo3bobo3bobobo5bo48bobo15bo3bobobobobobo3bobo3bo3bobo 3bobo3bo3bobobo16bo4bo14bobobobobobobobo3bo3bobobobobobo3bobobobobobo 3bo5bobo3bo8b2ob2o13bo3bobobobobobobobobobobo5bo3bobobo3bobo3bo35bo2bo 15bobo5bobo3bo3bo3bo$b2o13b3obob3o59bo13b3ob3obobobob3obobobob3ob3obob ob3obobob3o6b2obo13bobobob3ob3ob3ob3ob3obo39b2o13bob3obob3ob3ob3ob3ob 3ob3o50bo13b3ob3obob3ob3ob3ob3ob3ob3ob3ob3ob3ob3obo17b4o13b3ob3obobob 3obob3ob3obobob3ob3ob3obob3ob3ob3o3bobob3o26bob3ob3obobobobobobobob3o 3bob3ob3o3bob3obo35bo2bo15bob3ob3ob3ob3ob3obo$18bobobobo56bobo16bobo3b obobo3bobobobobobo3bobobo3bobobo3bo5bo2bo14bobobobobo3bobobo3bobo3bo 37b2o15bo3bobobo3bo5bo3bo3bobo52b2o12bo5bobo3bo3bo3bo3bo3bo3bo3bo3bobo bobobobo36bo3bobobo3bobobo3bo3bobo3bo3bo3bobo3bo3bobobo3bobobo10b5o13b o3bobobobobobobobobobobobo3bobo3bobo3bo3bobo36b2ob2o13bobobo3bo3bobobo bobobo$16b3obob3o56b2o15b3ob3obob3o3bobob3ob3ob3ob3ob3obobo3bo6b2o15bo b3ob3o3bob3o3bob3obo36bobo15bo3bobob3ob3ob3o3bob3ob3o47b2obo13b3ob3obo 3bo3bob3ob3ob3o3bob3ob3ob3ob3obo19b2o13b3o3bob3o3bobob3ob3ob3o3bob3ob 3obo3bob3ob3o3bobob3o7bo5bo12bob3ob3ob3obob3ob3ob3o3bob3ob3o3bob3obo 38bo2bo12bob3ob3ob3ob3ob3obo$231b2o94bo2bo82bo2bo84bobo2b2o99bo2bo$ 328b2o84b2o86b2o104b2o$598b2o$597bo2bo$597bo2bo$598b2ob2o$600bo2bo$ 600bo2bo$601b2o17$2bo13b3obobob3o56b2o13bob3ob3ob3ob3ob3o31b2o16b3ob3o b3obobob3ob3ob3ob3ob3ob3ob3o21b2ob2o12bobob3obob3obobob3ob3ob3ob3o47b 2o13b3ob3ob3ob3obob3o49bo14bobobob3ob3obob3ob3ob3ob3obobob3o35b2o15b3o b3ob3ob3ob3ob3ob3ob3ob3ob3obobobobo32bo7bo15bobob3ob3ob3o$bobo14bobobo 3bo57bo13bobo5bo3bobobobo34bo16bo3bo3bo3bobobobobo3bo3bobo3bobo5bo22bo b2o12bobo3bobo3bobobo3bobo3bo3bobo46bo2bo14bobobobobo3bobobobo48bobo 13bobobobobobobobo3bobobobobo3bobobobobo34bobo15bo5bobobobobo3bobobo3b obobo3bobobobobobobo30b3o7b3o13bobo3bobobobobo$obo13b3ob3ob3o56bo14bob 3o3bo3bob3ob3o32bobo14b3ob3ob3ob3obobob3ob3ob3ob3ob3ob3o22bo15bobob3ob o3bobobob3ob3ob3ob3o47b3o12b3ob3obobo3bobob3o48bo2bo12b3obobobob3obob 3ob3ob3ob3obobobobo34bo4bo12b3ob3obobob3ob3ob3ob3ob3ob3obobobobob3o29b o13bo12bobob3obobobobo$bo14bo5bo3bo56bobo12bo3bo3bo3bo3bobobo33bobo15b o3bo3bo3bobobo3bo3bo3bo3bo3bo3bo23b3o12bobo3bobo3bobobo3bo3bobobo3bo 64bobobobobo3bobobobo49b3o14bobobobobobobo3bobobobobo3bobobobobo35b5o 12bobo3bobobobobo3bobobo3bobobo3bobobobobo3bo29b2o11b2o12bobo3bobobobo bo$16b3o3bob3o57b2o12bob3o3bo3bob3ob3o34bobo12b3ob3ob3o3bob3ob3ob3ob3o b3ob3ob3o25bo12bobob3obo3bobobob3ob3ob3ob3o47b3o12b3ob3ob3o3bobob3o66b obob3ob3obob3ob3ob3ob3obobob3o52b3ob3ob3ob3ob3ob3ob3ob3ob3ob3obobo3bo 56bobob3ob3ob3o$154bo173bo2bo82b3o86b5o$329b2o82bo2bo85bo4bo$413bobo 86bobo$414bo88b2o3$596b2o11b2o$596bo13bo$597b3o7b3o$599bo7bo16$2bo13b 3ob3ob3ob3o53b2o12bobob3obob3ob3ob3ob3ob3ob3ob3obobo13bo15bob3ob3ob3ob 3ob3obob3obob3ob3obobob3obobobobobo13bo12bobobob3ob3ob3obobob3obobob3o bobobobo36bo17bobobob3obobob3obobob3ob3ob3ob3o33b2o13bob3ob3ob3ob3obob 3ob3ob3ob3ob3ob3ob3ob3ob3obo15b2o3b2o12b3ob3ob3ob3ob3ob3ob3ob3ob3ob3ob 3ob3ob3obob3o$o2bo12bobobo3bobobo55bo13bobo3bobobobobobo3bobo3bobo3bob obobobo12bobo14bobo3bo5bobobo3bobobobobo3bo3bobobobo3bobobobobo11b3o 12bobobobobo3bobo3bobo3bobobobo3bobobobo35bobo16bobobobobobobobo3bobob o3bobo3bo3bo32bo2bo12bobobobobo3bo3bobo3bobobobo3bo3bobobobobo5bobobob o15bobobobo12bo5bobobobobobobobobobobobobobobobobobobobobobobobobobo$o 2bo12b3ob3ob3ob3o50b2obo13bobob3obobobob3ob3ob3obobob3obobob3o11bobobo 13bob3ob3ob3ob3ob3obob3obob3ob3ob3ob3ob3obob3o10bo15b3obobobo3bob3ob3o b3ob3ob3obobob3o35bobo16b3obobobob3ob3ob3ob3obobo3bob3o32b3o13bob3obob ob3o3bobob3obobob3ob3ob3ob3ob3ob3obobobo17bobo14b3ob3obobob3obobobobob obobobobobobobob3obobobobobobobo$bo14bobobobo3bobobo50bobo14bobobo3bob obobobo3bo3bobobobo3bobo3bo12bo2bo13bo3bo3bobo5bobo3bo3bobobo3bo5bobob o3bobo3bo10b2o16bobobobo3bo3bo3bobo5bo3bobobo3bo36b2ob2o15bobobobo3bob obo3bo3bobobo3bobo32b2o16bobobobobo3bo3bobobo3bobobobobobo3bobobobobo 3bobobobo16b2ob2o13bobo3bobobobobobobobobobobobobobobobobobobobobobobo bobobo$16b3ob3ob3ob3o67bobob3obob3ob3ob3ob3ob3ob3ob3o3bo15b2o12bob3ob 3ob3ob3ob3obob3obob3ob3o3bob3o3bobo3bo11bo16bobob3o3bob3o3bob3o3bob3ob obo3bo39bobo14bobob3o3bob3o3bob3ob3o3bob3o31bob2o13bob3ob3ob3o3bobob3o b3ob3ob3ob3ob3ob3ob3ob3obo17bobo14b3ob3ob3ob3ob3ob3ob3ob3ob3ob3ob3ob3o b3obob3o$234bobo92bobo80bo2bo85bobobobo$235b2o93bo82b2o86b2o3b2o19$ 600bo5bo$600bo5bo$600b2o3b2o2$596b3o2b2ob2o2b3o$2o14b3ob3ob3obo52b2o 15b3ob3ob3ob3ob3ob3ob3obobob3ob3o17b2o12b3obob3ob3obobob3obobob3ob3ob 3ob3o23b2o15bob3ob3ob3ob3ob3ob3obob3obobobob3ob3o35b2o13b3ob3ob3obob3o b3ob3obobobob3ob3obobo26bo15b3ob3ob3ob3ob3ob3ob3obobobob3ob3obobob3ob 3ob3ob3o10b2o4b2o12bob3ob3ob3ob3ob3ob3ob3ob3ob3obob3ob3ob3ob3o23bobobo bobobo14b3o$o17bobo5bobo52bo18bobobo3bobobo3bobobobobobobobo3bo18bobo 12bobobo3bobo3bobobo3bobo3bo3bobo5bo23bo3bo12bobobobobobo5bobobo3bobo 3bobobobobo3bo36bo2bo14bobo5bobo3bobobo3bobobobobo5bobobo26b3o13bo3bo 3bo3bobobo3bobo3bobobobobobo3bobobobobo3bobo3bobo10bo3bo2bo12bobobobob o3bobobo3bobobo3bo3bobobobobobo3bo3bobobo25b2o3b2o16bobo$3bo12b3ob3o3b obo53bobo15bobobob3obobob3obobobobob3ob3ob3o16bo14b3obob3ob3ob3ob3ob3o b3ob3ob3o3bo24b4o12bobobobobob3ob3ob3ob3obo3bobob3ob3ob3o34b3o15bob3ob 3obob3ob3ob3obobobob3o3bob3o29bo12b3ob3ob3ob3ob3obobob3ob3obob3o3bobob obobob3ob3ob3o11b6o13bob3obobob3obobob3obobob3ob3ob3obob3o3bob3obobo 48bobo$2b2o14bobobo3bobo56bo14bobobobo3bobobo3bobobobo3bo3bo3bo17bo15b obobo5bo3bobobo3bo3bobo3bobo3bo40bobobobobobobo3bobobobo3bo3bobo3bo3bo bobo52bobobobo3bo3bo3bobo3bobobobobo3bo3bo26b3o13bobobobobobo3bo3bobob o3bo3bobo3bo3bobobobobo3bo3bo3bo30bobobobobo3bobobo3bobobo3bo3bobobobo bobo3bobo3bobo25b2o3b2o16bobo$16b3ob3o3bobo55b2o14bob3ob3ob3ob3ob3ob3o 3bob3ob3o14b3o14b3obob3ob3o3bob3o3bob3ob3ob3o3bo24b2o14bob3ob3ob3ob3ob 3ob3obo3bobo3bob3ob3o34b3o15bob3ob3obob3ob3ob3obobobob3o3bo3bo25bo16b 3ob3ob3ob3ob3ob3ob3o3bobob3o3bobobob3ob3ob3ob3o11b6o13bob3ob3ob3ob3ob 3ob3ob3ob3ob3obob3o3bob3ob3o23bobobobobobo14b3o$151bo81b2o92bo2bo82b3o 84bo3bo2bo88b3o2b2ob2o2b3o$328b2o86bo83b2o4b2o$413b3o184b2o3b2o$413bo 186bo5bo$600bo5bo16$609bo$608bobo3$608b3o$2b2o12bob3ob3obob3ob3o49b2o 12b3ob3ob3ob3obobob3ob3ob3ob3ob3o16b2o13bobobobobobob3ob3ob3obobob3ob 3ob3obobobob3ob3ob3o5b2o17bob3ob3ob3obobob3ob3ob3ob3o46b2o14bob3ob3ob 3ob3ob3ob3ob3o37bo18bob3ob3ob3ob3ob3ob3ob3obob3o37b2o3b2o12bob3ob3ob3o bob3ob3obob3ob3ob3obo49b3o12bobobobobob3obobob3obob3ob3ob3ob3ob3obobob ob3ob3obobobobobobob3obob3ob3obo$o2bo12bobobobo3bo3bobo50bobo12bobo3bo 3bobobobobo3bo3bobobo3bobo18bobo12bobobobobobobobo3bobobobobobobobo3bo 3bobobobobobo3bobo5bobo16bo3bo3bo3bobobobo3bobobo5bo46bo2bo12bobobobob o3bobobo3bobobo3bo36bobo17bobobobobo3bo3bobobo3bobo3bobo39bobobobo12bo bobobobobobobobobobobobobobobobobobobo50bo13bobobobobobo3bobobobobobob obobo3bo3bobobobobobo3bobobobobobobobobo3bobo3bo3bobo$2o14bob3ob3obo3b ob3o48bo14b3ob3ob3obobob3ob3ob3ob3ob3ob3o18bo12bobobob3obobobob3ob3ob 3obobob3ob3obobobobobob3ob3o7bo16bob3o3bo3bob3ob3obobob3ob3o47b3o12bob 3obobob3obobob3ob3ob3o36bo2bob2o13bob3ob3ob3ob3obobob3ob3obob3o39bobo 14bob3obobobobobobobobobobobobobobob3obo64bob3ob3ob3ob3ob3obobobobobob 3ob3obobob3obob3ob3obob3ob3obo3bobo3bo3bobo$16bobobobobobo3bobobo49bo 13bobo3bo3bobobo3bobo5bo3bo3bo3bo17bo13bobobo3bobobobobo5bo3bobobobobo 3bobobobobobobobobobo7b3o14bobo5bo3bo3bo3bobobo3bo3bo62bobobobobo3bobo bo3bobobo3bo37bobobobo12bobobo3bo3bo3bobobo3bo3bobo3bo39bobo14bobobobo bobobobobobobobobobobobobobobobo64bo3bo3bo3bo3bobobobobobobobo3bo3bobo bo3bobobo5bobo3bo3bobo3bobo3bo3bobo$16bob3ob3obo3bob3o50bo12b3ob3ob3ob 3o3bob3ob3ob3ob3ob3o14bobo14bobobo3bobob3ob3ob3o3bob3ob3ob3obobobob3ob 3ob3o10bo13bob3o3bo3bo3bob3ob3ob3ob3o47b3o12bob3ob3ob3ob3ob3ob3ob3o38b 2o3bo12bob3ob3ob3ob3ob3ob3ob3obob3o38b2ob2o13bob3ob3ob3obob3ob3obob3ob 3ob3obo50bo13bo3bo3bob3o3bob3obob3ob3ob3ob3ob3o3bobob3ob3obo3bo3bobo3b obo3bo3bobo$84b2o65b2o81bobo91bo2bo81b3o87bobo102b3o$235bo92b2o83bo89b obo102b3o$501bobobobo$501b2o3b2o$608bobo$609bo20$2b2o12b3obobobob3ob3o b3ob3ob3ob3obobobobo27bo13bobobobob3ob3o38b2ob2o12b3ob3obob3ob3ob3ob3o b3ob3ob3ob3ob3obo18b2o14b3ob3ob3obobobobob3ob3ob3ob3ob3ob3ob3obob3ob3o bobob3ob3o8bo3b2o12bobob3ob3ob3obob3ob3ob3ob3ob3ob3ob3ob3obobo17b2o13b obobobob3ob3ob3ob3ob3ob3ob3obobobo30bobobobo13b3ob3ob3obob3ob3ob3ob3ob obobobo41bobo22bob3ob3ob3ob3ob3ob3ob3ob3ob3obobob3ob3ob3ob3ob3ob3ob3ob 3ob3ob3ob3ob3obobob3ob3obob3o$2bo15bobobobobobobo5bobo3bo5bobobobobo 26bobo12bobobobo3bobo41bobo15bo3bobo3bo3bobobobo3bo5bobobobo3bobobo17b o2bo15bobobobo3bobobobo3bo3bo3bo3bo3bobobobobobo3bobo3bobobobobobo7bob obobo12bobo3bobobo3bobo3bobobo3bobobo3bobobobo3bobobobo16bo2bo12bobobo bobobobobobobobobobobo3bo3bobobobo29bob2ob2obo14bobobo3bobobobobobobob o3bobobobobo39bo3bo22bobobobobo3bo3bobo5bo3bo3bobo3bobo3bobobobo3bo3bo 3bo3bo5bobo3bo3bo3bo3bobo3bobo3bobobo$3bo12b3ob3obob3ob3o3bob3ob3ob3ob obob3o25bobo13b3ob3o3bob3o39bo2bo12b3ob3obo3bob3ob3ob3ob3o3bobobob3ob 3obo18b2obo14bob3ob3obob3obob3ob3ob3ob3ob3obobob3obob3ob3ob3obobob3o7b obobo14bobob3obobob3obo3bob3o3bobobob3obobob3ob3ob3o15bo2bo13b3obobobo bobobob3obobobobob3ob3obobobo29bo7bo14bobobob3obobobobobobobob3obobob 3o32b2o5bo26bob3ob3ob3ob3ob3ob3ob3ob3ob3ob3o3bobobob3ob3ob3ob3ob3ob3ob 3ob3ob3ob3ob3o3bob3obob3o$2b2o14bo3bobo3bo3bo3bobobo3bobo3bobo3bo24bob o16bo3bo3bobobo40b2o15bo3bobo3bobo3bobobobo3bo3bobobobobobobobo21bo14b o3bobobobo3bobobo3bo5bo3bo3bobobobobobobo5bo3bobobobobo8b2ob2o13bobo3b obobobo3bo3bo3bo3bobobobo3bobobobo3bo3bo15b3o16bobobobobobobobobobobob obo3bo3bobobobo30b7o15bobobo3bobobobobobobobo3bobobo3bo32b2o4bo4bo8b2o 12bo3bobobo3bobo3bobo3bobo3bo5bo3bo3bobobobobobobobobobobobobobo3bobob obobobobobo3bo3bobobobobobo$16b3o3bobob3ob3o3bob3ob3ob3obobo3bo24b2o 17bo3bo3bob3o55b3ob3obo3bob3ob3ob3ob3o3bob3ob3ob3obo18b3o15bob3ob3obo 3bobob3ob3ob3ob3ob3ob3ob3obob3ob3o3bob3ob3o26bobob3ob3ob3obo3bob3o3bob 3ob3ob3ob3ob3o3bo34bobobob3ob3ob3ob3ob3ob3ob3obobobo52bob3ob3obob3ob3o b3ob3obobo3bo39bo12b2o12bob3ob3ob3ob3ob3ob3ob3ob3ob3o3bo3bob3ob3ob3ob 3ob3ob3ob3ob3ob3ob3ob3o3bo3bob3obob3o$233bo178b3o85b7o89bo3bo$412bo2bo 83bo7bo90bobo$413bo2bo82bob2ob2obo$414b2o84bobobobo20$582b2o2b2o4bo2b 2o12b2o$582b2ob2o6b2obo12b2o$2bo13b3ob3o59bo15b3obobob3ob3ob3obo35bo 13b3ob3obob3obobobob3obobobo38b2o12bob3ob3ob3ob3ob3ob3ob3ob3obobob3ob 3obobob3ob3ob3obobobob3o9b2o13b3ob3obobobob3ob3obob3obobob3ob3obobobob ob3o14bo19b3ob3ob3ob3obob3ob3obob3ob3ob3ob3o114bobo6bo27b3ob3ob3ob3ob 3obobob3ob3ob3obob3o$bobo12bo3bobo59b3o15bobobobobobo3bobobo34bobo14bo bo3bo3bobobobo3bobobobo36bo2bo12bobo3bo5bobo3bobobo3bo3bo3bobobo5bobob obobobo3bo3bobobobobo5b2obo2bo12bo3bobobobobo3bo3bobobo3bobo3bo3bobobo bobo3bo13bobo18bo3bo3bobobobobobobobo3bobobobo3bobobobo115b2o4b3o29bob obo3bo3bobobobobo3bo3bo3bobobobo$o2bo12b3obobo62bo12b3ob3ob3ob3ob3obo 33bo2bo14bob3obob3obob3o3bobob3o35bob2o13bob3ob3ob3ob3ob3ob3ob3ob3ob3o b3o3bobobobobob3ob3obob3ob3o6bobo2bo12b3obobob3obob3ob3obob3ob3ob3ob3o bobob3o3bo13bo2bob2o14b3ob3ob3obobobob3ob3obobobob3ob3ob3o151b3ob3o3bo b3obobobobob3ob3ob3obobobo$b2o13bobobobo59b3o13bo5bo3bobobobobobo33bob o15bobobobo3bobo3bo3bobo3bo35bo16bobobobobo3bo3bo3bobobobobobobo3bobob o3bobobobobobobobobobo3bobobo6bo2b2o13bobobobo3bobobo5bobo3bo3bobo5bob obo3bo3bo14bobobobo13bobobobo3bobobobo3bobobobobobobobo3bo3bo115b2o4b 3o29bo3bo3bo3bobobobobo3bo3bo3bobobobo$16b3ob3o59bo15b3o3bob3ob3ob3obo 32b2ob2o14bob3obob3obo3bo3bobo3bo36b3o13bob3ob3ob3ob3ob3ob3ob3ob3o3bob 3o3bobobob3ob3ob3obo3bob3o5b2o17b3ob3o3bobob3ob3obob3o3bob3ob3obobo3bo 3bo15b2obo2bo12b3ob3ob3ob3obob3ob3obob3ob3ob3ob3o114bobo6bo27b3ob3o3bo b3ob3obobob3ob3ob3obob3o$235bo178bobo168b2o6b2obo12b2o$415bo170b2o4bo 2b2o12b2o22$582b2o2b2o4bo2b2o12b2o$582b2ob2o6b2obo12b2o$2b2o12b3ob3ob 3o54b2o15bob3ob3obob3obob3ob3o31b2o12bob3ob3ob3ob3ob3ob3ob3obobobob3ob obo23b2o13b3ob3ob3ob3ob3ob3obobobob3ob3obo42b2o12bobobobob3obobob3obob ob3ob3ob3obobobob3ob3obo17b2ob2o12bobobob3ob3ob3ob3ob3obob3ob3o122bobo 6bo27b3ob3obobob3obob3ob3obobob3ob3ob3obob3o$bobo12bo3bobo3bo55bo15bob obobobobobobobo3bobobo32bo12bobobobo3bobo3bobobobo3bobobobobobo3bobo 23bobo14bobobobobo3bo3bobo3bobobobo3bobobo38b2obobo12bobobobo3bobobo3b obobobo5bo3bobobobobobo3bobo17bo3bo12bobobobobobobo3bobobo3bobo3bo3bo 123b2o4b3o29bo3bobobobobobo3bobobobobo3bo3bo3bobobobo$obo13b3ob3o3bo 55bobo13bob3obobobob3obob3ob3o29b3o13bob3ob3ob3o3bobobob3obobobobobob 3ob3o25bo12b3ob3ob3ob3ob3ob3ob3obob3ob3obo38b2obo14bob3obob3ob3o3bob3o b3o3bob3ob3obob3o3bobo18b3o13b3obobobob3ob3obobob3obob3ob3o159b3ob3obo bobobobob3obobobobob3ob3ob3obobobo$bo16bobobo3bo56bobo12bobobobobobo3b obo3bobobo29bo15bobobo3bobobo3bobobo3bobobobobobobobo3bo21b4o15bobobo 3bobo5bo3bo3bobobobobobobo41bo14bo3bobobo5bo3bo3bo3bo3bo3bo3bobobobo3b obo36bobobobobobo3bobobo3bobo3bobo125b2o4b3o29bo3bobobobobobo3bobobobo bo3bo3bo3bobobobo$16b3ob3o3bo57b2o12bob3ob3obob3obob3ob3o27bobo15bob3o b3ob3o3bob3ob3ob3obobobob3o3bo21bo16b3ob3ob3ob3ob3ob3o3bobob3ob3obo41b obo12bo3bobob3o3bo3bo3bob3o3bob3o3bobob3o3bobo18b3o15bobob3ob3ob3ob3ob 3obob3ob3o122bobo6bo27b3ob3obobob3obob3ob3obobob3ob3ob3obob3o$150b2o 81bo96b2o80bo3bo165b2ob2o6b2obo12b2o$232b2o178b2ob2o165b2o2b2o4bo2b2o 12b2o24$o15bob3ob3obobob3ob3ob3o44bo12bob3ob3ob3ob3ob3ob3ob3ob3ob3ob3o 11b2o2b2o12b3obob3ob3ob3ob3ob3obob3ob3obo30bo13b3ob3ob3ob3ob3ob3obob3o bobob3ob3obo37b2o13bobobob3obob3ob3ob3obobob3obobob3obob3ob3obo15b2o 17b3ob3ob3ob3ob3ob3obob3ob3obo$3o13bobobobobobobobo3bo5bo42b3o12bobobo 3bo3bo3bobobo3bobo3bo3bobo3bo11bobo2bo14bobobo3bobobobobobo3bobobobo3b obo29bobo14bo3bo3bo3bobobobo3bo3bobobobo3bobobo36bo2bo12bobobobobobo3b o3bobo3bobobo3bobo3bobobobobo3bo15bobo16bo3bo3bobo3bobobobo3bobobo3bob o$3bo12bobobob3ob3ob3ob3o3bo41bo15bob3ob3ob3ob3obobo3bob3ob3obobob3o 13bobo13b3obob3ob3obobob3o3bobobobob3obo28bo2bo12b3o3bo3bob3obobob3obo 3bob3ob3ob3obo36b4o12b3obobobobo3bob3ob3ob3ob3ob3ob3obob3ob3obo17bo2b 2o12b3ob3ob3o3bob3ob3obob3o3bobo$2b2o12bobobobobo3bo3bo3bo3bo40bobo14b o3bo3bo3bo3bobobo3bobobo3bobobo3bo13b2o14bo3bo3bo3bobobo3bo3bobobobo3b obo27bob2o13bo5bo3bo3bobobo3bobo3bo3bobobobobobo54bobobobobo3bo3bobobo 3bo3bo3bobo3bo3bobobobo15bobobobo12bobo3bobobo3bo3bobobobo3bo3bobo$16b ob3ob3o3bob3ob3o3bo41b2o14bob3ob3ob3ob3ob3o3bob3ob3ob3ob3o29b3obob3ob 3ob3ob3o3bobob3ob3obo26bobo15b3o3bo3bob3ob3ob3obo3bo3bob3ob3obo36b2o 16bobob3obo3bob3ob3o3bob3o3bob3obob3ob3obo15b2o2bo14b3ob3ob3o3bob3ob3o bob3o3bobo$231bobo93bo2bo83bobo$232bo95b2o85b2o24$b2o13b3ob3ob3ob3ob3o b3ob3ob3obobob3obobobob3ob3obobobo6bo16bob3ob3ob3obobob3ob3ob3ob3ob3ob obobobo11b2o12bobobob3obobob3ob3ob3ob3ob3ob3ob3ob3o22bo13b3ob3obob3ob 3o60b2o2b2o12bobobob3obobobobob3ob3ob3ob3ob3ob3ob3ob3obo20bo13bob3ob3o b3obobob3ob3obob3obobobo$bo14bo3bobobo3bo5bo3bobobo3bobobo3bobobobo3bo bo3bobobo5bobo15bobo3bobobobobobo3bobo3bobobobobobobobobobo10bobo12bob obo3bobobo3bo3bobo5bo3bobobo3bo3bo21bobo14bobo3bobobobobo60bobo2bo12bo bobobo3bobobobo3bobobobobo3bobobobobobo3bobobo19bobo12bo3bobo3bo3bobo 3bo3bobo3bobobobo$2bo13b3obobob3ob3ob3o3bobobob3ob3o3bob3obob3ob3obob 3o6bo2b2o12bob3ob3ob3ob3ob3ob3ob3ob3obobobobob3o10bo14bob3o3bob3ob3ob 3ob3ob3ob3obobob3ob3o20bo2bo14bob3obobobob3o62b2o14bob3ob3ob3ob3ob3obo bob3ob3ob3ob3ob3ob3obo18bo2bo12bob3ob3ob3ob3ob3o3bobo3bobob3o$3bo12bob obobobobo3bobo5bobobobo5bo3bo3bobo3bobobobo3bo7b2obo12bo3bo3bo3bo3bo3b o3bo3bo3bobobobobo3bo9b2o14bo3bo3bo3bo3bobo5bo3bobo3bobobo5bo19bob2o 15bobobobobobo3bo62bo15bo3bobobo3bo3bo3bobobo3bobo3bobobobobobobobobo 14b2o2bobo13bo3bo3bo3bo3bobo5bobo3bobo3bo$2b2o12b3ob3ob3ob3ob3o3bob3ob 3o3bo3bo3bobob3ob3obo3bo23bob3ob3ob3o3bob3ob3ob3ob3ob3obobo3bo9bo15bo 3bo3bo3bob3ob3ob3ob3ob3ob3ob3ob3o18bobo17bob3obob3ob3o60bobo15bo3bob3o 3bo3bob3ob3ob3ob3ob3ob3ob3ob3obo14bobob2o14bob3ob3ob3o3bob3o3bobo3bobo 3bo$153bo76bo2bo92b2o83bo$152b2o77b2o176bobo$409b2o!golly-2.5-src/Patterns/Life/Syntheses/make-harbor.rle0000644000175100001440000000140512156145314017553 00000000000000#C Synthesis of p5 oscillator from 34 gliders. #C Jason Summers, 30 Nov 2004; pattern from Summers' "jslife" archive. x = 209, y = 209, rule = B3/S23 35bo$36bo$34b3o16$46bo$44bobo$45boo3$53bo$54boo$53boo9$206bo$206bobo$ 206boo8$189bo$188bo$188b3o5$74bo$72bobo$73boo108bobo$183boo$184bo17$ 156bo$155bo$155b3o4$56bo$54bobo54bo$55boo52boo$110boo3$89bo$87bobo4bob o$88boo5boo$95bo4$71bo$69bobo32bo$70boo33boo$104boo$116bo$114boo$115b oo$$106bo$104bobo$105boo$114bo$114bobo$114boo$97bo13bo$98bo11bo$96b3o 11b3o$$92bo$85boo5boo$84bobo4bobo$86bo3$93b3o17b3o$95bo17bo$67bo26bo 19bo$67boo6boo$66bobo5bobo$76bo3$74boo$75boo$74bo9$51b3o$53bo$52bo17$ 24bo$24boo$23bobo108boo$134bobo$134bo5$18b3o$20bo$19bo8$boo$obo$bbo9$ 154boo$153boo$155bo3$162boo$162bobo$162bo16$172b3o$172bo$173bo! golly-2.5-src/Patterns/Life/Syntheses/make-lightbulb.rle0000644000175100001440000000144212156145314020253 00000000000000#C Synthesis of Light Bulb from 11 gliders (cheapest #C stabilization), or 16 gliders (stabilized by bookend) #C Mark D. Niemiec, 17 December 2004 #C Based on a naturally occuring Light Bulb discovered in ash by #C Andrzej Okrasinski, and with predecessors refined by H. Koenig, #C Dave Greene, and Karel Suhajda circa 31 August 2004. #C Pattern from Jason Summers' "jslife" archive. x = 71, y = 30, rule = B3/S23 17bobo35bobo7bo$17boo36boo8bobo$18bo37bo8boo$6bo37bo24bo$4bobo35bobo 23bo$5boo36boo16bobo4b3o$61boo$62bo$18bobo35bobo$18boo36boo$19bo37bo$$ 6bobo35bobo$6boo9bo26boo9bo$7bo9bobo25bo9bobo$o16boo19bo16boo$boo36boo $oo36boo$65b3o$65bo$13bo37bo14bo$6bo6boo29bo6boo$6boo4bobo29boo4bobo$ 5bobo35bobo$67b3o$67bo$15bobo35bobo12bo$6bo3b3obboo27bo3b3obboo$6boo4b o3bo27boo4bo3bo$5bobo3bo31bobo3bo! golly-2.5-src/Patterns/Life/Syntheses/make-osc-p3.rle0000644000175100001440000001223112156145314017401 00000000000000#C Some glider syntheses of p3 oscillators: #C 3-1. "cis skewed poles", Stephen Silver and Mark D. Niemiec, 1/00 #C 3-2. "cross", Jason Summers, 8/04 #C 3-3. "short keys", JS, 8/04 #C 3-4. JS, 9/04 #C 3-5. "bent keys", JS, 9/04 #C 3-6. "asymmetric keys", MDN, 1/00 #C 3-7. "star", JS, 8/04 #C 3-8. JS, 8/04 #C 3-9. "diamond ring" with nonstandard stator. JS, 8/04 #C Pattern from Jason Summers' "jslife" archive. x = 271, y = 186, rule = B3/S23 obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbo3$o41bo19bo24bo47bo89bo$4bobobo7bo43bobo28bobobo7bob obo31bobobo7bobobo$61boo10bo$o7bo7bo25bo29bo14bo7bo7bo19bo11bo7bo7bo 73bo$72b3o46boo$4bobobobbobobbo29bo44bobobobbobobbobobo14boo15bobobobb obobbobobo$o41bo4boo38bo47bo89bo$8bo7bo29boo3bo18bo24bo11bo35bo7bo3bo$ 52boo16bobo134bo$o3bobobo7bo25bo8boo17boo9bobo3bo3bobobo7bobobo27bo3bo bobo7bobobo49boo18bo$30bo50boo32bo90boo$29bo52bo26bobobbo$o28b3o10bo 21bobo20bo21boo3b3o18bo89bo$16bo48boo43bo11bo85bobo7bo$14bobo48bo55bo 33bo52boo8bobo$o14boo25bo27bobo14bo18bo14b3o11bo20boo51bo3bobobboo5bo$ 70boo35boo46boo56boo$71bo34boo91bobo12bo$o27bo13bo3bobobo7bobobo24bo 47bo63boo24bo$28bobo169bo$8bo19boo5bo14bo11bo55boo$o8boo22boo7bo44bo 29boo16bo89bo$8boo24boo10bobobobbobobbobobo11boo43bo41bo$75boo82bobo$o 41bo7bo11bo11bo12bo23bo23bo6bobo15boo63bo$11bo20bo78boo30boo$11boo3boo 4bo8boo13bobobo7bobobo47bobo30bo$o9bobo4boobboo8bobo8bo44bo8boo19bo12b oo3bo89bo$16bo4bobo46bo24bobo18boo12bobo$70boo25bo18bobo11bo$o41bo26bo bo15bo47bo29bo59bo$166boo$165boo$obbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbo89bo$$169bobo$o41bo44bo47bo34boo53bo$4bo bobo7bobobo25bobobo7bo3bo107bo$$o7bo11bo21bo7bo7bo3bo24bo47bo89bo$173b o$4bobobobbobobbobobo25bobobobbobobbobobo111boo$o41bo44bo47bo37boo50bo $8bo7bo33bo11bo$178bo$o3bobobo7bobobo21bo3bobobo11bo24bo47bo40boo47bo$ 177boo$$o41bo44bo47bo31b3o55bo$169bo$18bobo41bobo103bo$o17boo22bo20boo 22bo47bo89bo$19bo43bo106boo$27bo22bo20bo97bobo$o25bo15bo8boo15bobbobo 13bo47bo35bo53bo$15bobo8b3o21boo14bobobboo$16boo3bo45boo$o15bo5bo19bo 13bo30bo47bo89bo$10bo9b3o34boo$8bobo45boo$o8boo20bo10bo22bo21bo47bo89b o$29boo35bo$30boo32b3o$o34boo5bo44bo47bo89bo$12boo20boo$11bobo14bo7bo$ o4bo7bo14bobo11bo44bo47bo63boo24bo$6boo20boo168boo$5boo135boo56bo$o9b oo30bo44bo47bo5bobo81bo$11boo63boo65bo$10bo20boo19boo22bobo$o30bobo8bo 10boo21bo10bo47bo89bo$19b3o9bo20bo87bo$19bo5bo114boo$o19bo3boo16bo32bo 11bo47bo3bobo83bo$13b3o8bobo25bo21boo$15bo36boo20bobo$o13bo27bo8bobo 33bo47bo78boo9bo$22bo38bo147bo3boo$22boo31boo4boo145boo5bo$o20bobo18bo 13boobbobo16bo7bo47bo72bobo14bo$55bo22boo62boo4boo$78bobo60bobo3bobo$o 41bo44bo47bo7bo5bo75bo3$obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbo47bobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo5$o bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$o89bo 89bo89bo$19bobobo7bobobo58bobobo7bobobo73bobobo7bobobo$157bo$o22bo11bo 54bo7bo7bo3bo45bo23bo7bo7bo3bo69bo$156b3o$19bobobobbobo6bo58bobobobbob obbobobo73bobobobbobobbobobo$o12bo76bo89bo89bo$14boo7bo11bo62bo7bo3bo 5bo71bo11bo48bo$13boo102bo130bo$o18bobobo11bo54bo3bobobo7bobobo4b3o62b o3bobobo7bobobo42bo4b3o19bo$243bobo$80bobo119bobo38boo$o79boo8bo89bo 22boo65bo$81bo121bo$$o24bo64bo89bo89bo$26bo$24b3o$o89bo89bo89bo$99bo 94bo65bo$97bobo68bo26boo43bo19bobo$o89bo7boo43bobo22bobo9bo13boo44bobo 17boo8bo$71bo71boo23boo70boo$71bobo70bo$o70boo17bo89bo54bo23bo10bo$ 233boo23bo$35bo91bobo20bo83boo22b3o$o32bobo6bo47bo37boo18boo30bo67bo 21bo$34boo4bobo85bo20boo96bo$41boo204b3o$o89bo89bo29bo59bo$61bo146bobo $60bo55bo34bo57boo$o59b3o27bo26boo30boo29bo89bo$47bo68boo32boo62bobo 13b3o$48bo166boo13bo$o45b3o41bo49bo39bo34bo15bo38bo$138boo$60bo71bo6b oo76bo$o58bo30bo42bo46bo36bobo50bo$37boo20b3o69b3o83boo10boo$36bobo 189boo$o37bo51bo89bo49bo39bo$133bo$52bo80bobo86bo$o51bobo35bo42boo45bo 42boo45bo$29b3o20boo168boo10boo$31bo201bobo$o29bo59bo64boo23bo54bo34bo $154boo$42b3o111bo64bo15bo$o41bo47bo89bo41bo13boo32bo$43bo176b3o13bobo $28b3o119bo$o29bo59bo31boo20bo4boo29bo61boo26bo$29bo93boo18boo4bobo90b obo$122bo20bobo96bo$o47boo40bo89bo22b3o64bo$48bobo4boo148bo$48bo6bobo 70bo75bo$o54bo34bo12boo23boo50bo11b3o22boo51bo$102bobo22bobo43boo19bo 23boo$18boo84bo68bobo17bo23bo$o16bobo70bo82bo6bo89bo$19bo191boo$191boo 17bobo44boo$o89bo89bo9bobo19bo43boo12bo$192bo65bo$$o63b3o23bo89bo89bo$ 64bo$65bo$o89bo89bo89bo$9bo145b3o91bo$9boo144bo92boo$o7bobo79bo65bo23b o27boo38bobo19bo$207bobo$202b3o4bo$o75boo12bo23b3o63bo23bo65bo$75boo 39bo86bo$77bo37bo$o89bo89bo89bo3$o89bo89bo89bo3$obbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbo! golly-2.5-src/Patterns/Life/Syntheses/make-osc-p4.rle0000644000175100001440000001752412156145314017414 00000000000000#C Some glider syntheses of p4 oscillators: #C 4-1. unnamed p4, Noam Elkies and Mark Niemiec, 4/00 #C 4-2. Jason Summers, 8/04 #C 4-3. JS, 8/04 #C 4-4. JS, 9/04 #C 4-5. JS with MDN, 8/04 #C 4-6. JS/MDN, 8/04 (same as 4-2, with a different stator) #C 4-7. JS with MDN, 8/04 #C 4-8. JS, 8/04 #C 4-9. JS, 10/04 #C 4-10. JS, 8/04 #C Pattern from Jason Summers' "jslife" archive. x = 331, y = 345, rule = B3/S23 213bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobb obbobbobbobbobbobbo3$213bo67bo15bo$229bo3bo7bobobo33boo$280boo$213bo7b obo5bo3bo7bo55bo$222boo$222bo6bobobobbobobbobobo46bo$213bo76boo5bo$ 233bo11bo45boo$$213bo19bo7bobobo51bo3$213bo83bo$$216bobo$213bo3boo78bo $217bo$254bobo$obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbo41boo40bo$255bo$268bobo$o53bo50bo77bo29bo26bo27b oo27bo$4bo3bo7bo41bo3bo7bobobo47bo3bo7bobobo48bo3bo7bo3bo37boo13bobo 10bo$240boo14boo$o3bo3bo7bo37bo3bo3bo11bo30bo16bo3bo11bo44bo3bo3bo7bo 3bo9bo43bo14bobo22bo$111bo67bo56bo17bo17boo$4bobobobbobobbo41bobobobbo bobbobobo37bo9bobobobbobobbobobo39bo8bobobobbobobbobobo33boo13boo11bob o5bo$o53bo50bo4b3o65b3obbo29bo22boo15boo10boo30bo$8bo7bo45bo7bo55bo11b o52bo11bo38bo23bo$45bo197boo$o7bo7bo27bo9bo7bo7bobobo30bo20bo7bobobo 44bo7bo11bo9bo28boo53bo$44b3o$14bo26bo79bo47bo$o14bo23boo13bo27bo22bo 13bobo47bobo11bo29bo83bo$5bo7b3o24boo41bo36boo47boo$3bobo40bo29bo4b3o$ o3boo39bo8bo22bo27bo77bo29bo55bo27bo$45b3o27b3o13bo146bo29boo$90bo148b oo27bobo7bo$o40bo12bo15bo19b3o12bo77bo29bo19boo3boo36boo19bo$40bo30bo 162boo36boo3boo$23bo16b3o26b3o69bo44bo46bo7bobo27boo$o23boo9bo18bo26bo 23bo31bo4boo39bo3boo10bo13bo28boo29bo23bo$23boo10bobo8bo16bo15bobo53bo bo3boo43boo11bobo40bo$35boo8bo15bobo16boo54boo61boo$o44b3o6bo7boo7bo 22bo10bo23bo53bo23bo5bo83bo$72bo15bo5bobo33boo27bobo43boo$28bo41b3o15b obo3boo33boo28boo31bo3bobo7boo$o26bo5bo20bo33boo15bo54bo22bo9bo3boo14b o83bo$27b3o3bobo155b3o3bo70boo$33boo100bo131boo$o41bo11bo43bo6bo27bobo 47bo29bo31bo23bo27bo$42bobo13boo38bobo33boo109boo10boo15boo$42boo13bob o38boo106b3o29bo5bobo11boo13boo$o10boo41bo4bo6b3o36bo54bo22bo22bo6bo 24boo17bo17bo21bo$10bobo55bo23bo36boo28boo46bo29bobo14bo$12bo54bo23bo 38boo27bobo92boo14boo$o19boo32bo36b3o6bo4bo23bo9boo14bo27bo29bo28bo10b obo13boo26bo$19bobo3b3o32boo38bobo35bobo13bo87boo27bo$21bo5bo31bobo38b oo38bo13b3o50b3o31bobo$o25bo27bo6bo43bo77bo23bo5bo42bo40bo$190boo16bo 46boo$7b3o179bobo63bobo$o8bo8boo34bo15boo33bo43b3o31bo7bo21bo80bobbo$ 8bo8bobo10boo32boo3bobo15b3o59bo143boo$19bo9boo32bobo5bo15bo62bo142bob o$o11b3o16bo22bo10bo22bo7boo7bo77bo29bo83bo$14bo63boo16bobo$13bo64bobo 15bo23boo47boo$o53bo23bo26bo13bobo47bobo11bo29bo83bo$7b3o78b3o30bo47bo $9bo39boo37bo67bo$o7bo40bobobbo12b3o19bo15bo49boo26bo29bo5boo76bo$13b oo24b3o7bo19bo85bobo62boo$14boo23bo28bo13b3o134bo69bo$o12bo26bo13bo27b o22bo4b3o65b3obbo29bo74boo7bo$8b3o65b3o4bo28bo46b3o16bo109bobo$10bo65b o34bo47bo19bo50boo$o8bo44bo22bo27bo54bo22bo29bo17boo64bo$230bo$$obbobb obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbo4$obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbo3$o110bo90bo31bo95bo$4bo3bo7bobobo107bo3bo7bobobo57bobo33bo3bo7bobo bo$202boo$o3bo3bo7bo94bo16bo3bo11bo89bo3bo3bo7bo3bo75bo$$4bobobobbobo bbobobo107bobobobbobo6bo76bo16bobobobbobobbobobo$o110bo109bobo10bo95bo $8bo7bo3bo48bo62bo11bo76boo19bo7bo3bo$69bobo48bo204bo$o7bo7bobobo48boo 40bo9bo10bo11bo59bo29bo7bo7bobobo70bobobbo$119b3o82bobo4bo113boo$43bo 160boo3boo98bo$o43boo65bo98boo22bo74bobo18bo$43boo264boo$$o110bo122bo 95bo3$o110bo122bo95bo$$124bobo$o110bo13boo107bo95bo$125bo$$o110bo122bo 95bo$124bo$68bo56bo$o67bobo40bo3bo7b3o108bo95bo$68boo46bo$114b3o$o110b o122bo95bo3$o72boo36bo122bo95bo$73bobo133bo43bobo22bobo$73bo133boo45b oo22boo$o110bo96boo24bo19bo24bo50bo$$277bo$o110bo122bo41bo53bo$30bo 245b3o$29bo$o28b3o79bo82bo5bo33bo95bo$194bobobbo$4bo189boo3b3o$o4bo17b o87bo122bo95bo$3b3o18bo157bobo$22b3o77bobo77boo$o101boo7bo46bobo22bo 50bo95bo$103bo55boo92bobo24bo12bo$159bo12bobo79boo23bo13bobo$o110bo60b oo60bo10bobo6bo24b3obbobo6boo35bo$68bobo102bo72boo36boo$68boo176bo29b 3o6bo$o49b3obboo12bo41bo122bo41bo53bo$52boboo129boo64bo25bo$51bo4bo 117b3o7boo65boo$o110bo62bo11bo47bo15bobo77bo$175bo$$o110bo60boo60bo95b o$173boo81bo$172bo84bo18b3o$o54bo4bo50bo122bo20b3o18bo53bo$56boobo217b o$42bo12boobb3o$o41boo67bo47boo73bo95bo$41bobo116boo$159bo121bobo$o 110bo122bo46boo47bo$8bo146b3o98bo25bo$8boo147bo99bo$o6bobo77b3o21bo44b o17boo58bo13bo6b3o29bo42bo$87bo18b3o65bobo71boo36boo$88bo17bo67bo64boo 6bobobb3o24bo6bobo$o106bo3bo122bo3bobo13bo23boo50bo$240bo12bo24bobo$ 80b3o$o81bo28bo81b3o38bo95bo$81bo66boo34bo8bo$149boo32boo9bo$o110bo36b o34bobo48bo95bo3$o37bo72bo122bo95bo$36bobo216b3o$37boo218bo$o110bo85b oo35bo21bo73bo$197bobo29b3o$197bo31bo24bo24bo$o110bo108b3o7bo3bo19boo 22boo50bo$42boo168boo6bo32bobo22bobo$41bobo167boo8bo$o42bo67bo101bo20b o95bo$$220bo$o110bo95b3o9boo13bo95bo$207bo11bobo$208bo78b3o$o110bo122b o52bo42bo$288bo$$o110bo122bo95bo3$o110bo22boo98bo95bo$67boo66boo3boo$ 66boo66bo4bobo82b3o$o67bo42bo29bo82bo9bo95bo$225bo$41boo80boo$o39bobo 68bo10bobo109bo95bo$42bo81bo192bo$297boo17boo$o110bo122bo61boo18bobo 11bo$142boo154bo$141bobo$o110bo31bo90bo95bo3$obbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbo4$obbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$o74bo152bo$5bo 3bo7bobobo84bo3bo8bo3bobobo58bobo$186boo$o4bo3bo7bo3bo53bo30bo3bo8bo3b o3bo59bo40bo$$5bobobobbobobbobobo36bo47bobobobbobo3bo3bo3bo27bo$o57bob o14bo77bobo72bo$9bo11bo36boo40bobo7bo8bo3bo3bo26boo$101boo$o8bo7bobobo 29bo23bo15bo9bo8bo8bo3bobobo100bo$49boo9bo31bo84bo$50boo6boo30b3o83bo 45bobo$o5bo52boo14bo100b3o43boo4bo$7boo92bo121bo$6boo55bobo36boo$o62b oo10bo25boo125bo$64bo$28bobo66bo$o28boo44bo22boo128bo$29bo67boo$$o63bo 10bo152bo$12bo51bobo144bo$13bo50boo143boo$o10b3o45bobo13bo134boo16bo$ 29bo29boo$30bo29bo143bobo$o27b3o44bo128boo22bo$205bo$$o74bo126bo25bo$ 200boo$201boo$o74bo115bo36bo$190boo$190bobo$o74bo152bo3$o74bo152bo3$o 74bo152bo3$o74bo152bo$155bo$155bobo$o74bo79boo15bo55bo$35boo134bo$35bo bo133b3o$o34bo39bo152bo$41bo$40boo109bobo$o39bobo7boo23bo75boo75bo$50b obo99bo$50bo91b3o$o20boo52bo68bo14bo68bo$20bobo120bo13boo$22bo135boo$o 74bo152bo3$o74bo152bo$144boo$145boo13bo$o74bo68bo14bo68bo$159b3o$151bo $o74bo75boo75bo$150bobo$$o74bo152bo$130b3o$132bo$o74bo55bo15boo79bo$ 146bobo$3boo64boo77bo$o3boo62boo5bo152bo$3bo66bo$$o74bo152bo3$obbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo 152bo3$75bo152bo$111bobo$112boo$75bo36bo115bo$101boo$102boo$75bo25bo 126bo$$98bo$75bo22boo128bo$97bobo$$75bo16boo134bo$93boo$92bo$75bo152bo $$205boo$75bo128boo22bo$206bo$$75bo125boo25bo$200boo$80bo121bo$75bo4b oo43b3o100bo$79bobo45bo83b3o$126bo84bo$75bo126bo9bo15bo$201boo$148boo 51bobo$75bo72bobo77bo$148bo$$75bo40bo111bo$116boo$115bobo$75bo152bo3$ 75bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbo! golly-2.5-src/Patterns/Life/Syntheses/make-osc-p5-plus.rle0000644000175100001440000002175112156145314020373 00000000000000#C 5-1. "fumarole", Stephen Silver, 2/00 #C 5-2. Jason Summers, 11/04 #C 5-3. JS, 4/05 #C 6-1. Mark D. Niemiec/Jason Summers, 2/04 #C 6-2. JS, 8/04 #C 6-3, JS, 9/04 #C 7-1. unnamed p7, MDN/JS, 9/00 #C 8-1. "Coe's p8", MDN, 4/00 #C 8-2. "galaxy", JS, 9/03 #C 8-3. JS with MDN, 8/04 #C 15-1. MDN, 12/02 #C 16-1. "Achim's p16", JS, 10/04 #C 18-1. MDN, 3/02 #C 22-1. JS,2/01 #C 24-1. JS, 1/04 #C 138-1. JS, 10/02 #C Pattern from Jason Summers' "jslife" archive. x = 343, y = 232, rule = B3/S23 obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbo3$o20bo53bo74bo74bo49bo6bo$4bobobo7bo8bobobo7bobobo14bo42bo54bob obo7bo43bo18bobobo7bobobo27boo$56bobo33bo4bobo110bobo37bobo21boo$o3bo 11bo4bo3bo15bo14boo17bo17bo4boo50bo3bo11bo43boo13bo3bo15bo5boo29bo$45b o45b3o45bo111bo$4bobobobbobobbo8bobobobbobobbobobo4boo37bo53bobo12bobo bobbobobbo62bobobobbobobbobobo14bo$o20bo23boo4bo23bo10bo52boo9bo74bo 32bobo21bo$8bo7bo12bo7bo13bobo30b3o67bo3bo7bo62bo3bo7bo17boobbobo$51b oo210boo6bo$o3bobobo7bo4bo3bobobo7bobobo4bo28bo74bo3bobobo7bo58bo3bobo bo7bobobo18bo5bo11bo$44bobo47bo34bo47bobo12bo14bobo60b3o$45boo48boo32b obo10bo25bo9boo13bo13boo$o20bo53bo18boo33boo11bobo5bo15bobo9bo12b3o14b o16bo31bo24bo$142boo23boo89boo9boo$134bobo83bo36boo9boo$o14bobo3bo49bo 3bo15bo42boo14bo63bo5bobobbo44bo11bo$15boo53bo21bo42bo76boo6boo$16bo 53b3o17b3o51bo68boo40b3o$o20bo53bo67bo6bo74bo31bo5bo18bo$48bobo92b3o 110bo6boo$4bo10bo16boo15boo15bo51bo143bobobboo$o4boo6boo6bo9bobo15bo 15bo9bo41bo32bo27bo13bo32bo41bobo12bo$4boo8boo17bo31b3o49b3o59bo13bo 73bo$79bobobo7bobobo81b3o11b3o82bo$o20bo53bo74bo35bo38bo49boo5bo$50b3o 26bo15bo91boo63boo21bobo$52bo15bo117boo65boo$o20bo22b3o4bo10b3obboo6bo 3bobobobbobobbobobo6bo47bo51bobo20bo26bo29bo$46bo15bo4bobo30bobo7bo7bo 49bo33boo$6bobobbobo31bo17bo19bo11bo5boo8bo4boo51bo33bo$o6boobboo8bo 53bo33b3o5boo31bo16b3o24bo11bo18bobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbo$7bo4bo22b3o41bobobo7bobobo97bo12bobo$37bo155b3o10boo4bobo $o20bo14bo38bo74bo61boo11bo116bo$213bo$120bo108bobobo7bobobo56bo$o20bo 19boo32bo43boo29bo74bo74boo40bo$3b3o8b3o23bobo76bobobboo54bo48bo15bo 55boo$5bo8bo27bo81bobo53boo$o3bo10bo5bo53bo48bo25bo28bobo43bo3bobobobb obobbobobo17bo78bo$51b3o210boo$53bo131boo42bo3bo11bo17boo$o20bo30bo22b o74bo33bobo38bo116bo$186bo42bobobo7bobobo$107b3o192bobo$obbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo33bo40b o74bo76boo38bo$108bo194bo$81b3o87bo45boo$75bo7bo66bo20boo44bobo5bo116b o$82bo51b3o33bobo34boo8bo$91bo42bo72bobo$75bo15boo42bo14bo56bo17bo116b o$90bobo206bo13bo$83boo189bo23bo14bobo$75bo6bobo11boo33boo17bo74bo46bo bo23b3o12boo27bo$84bo10bobo32boo141boo$97bo34bo$75bo74bo60boo12bo116bo $206bo3boo56bo24bobo$140b3o18boo42boo5bo56boo22boo$75bo10boo52bo9bo11b oo41bobo17bo42boo24bo47bo$85bobo53bo19bo141bo$87bo45b3o104bobo59bo19bo $75bo51boo4bo16bo74bo15boo59b3o15boo20bo$127bobo4bo19boo72bo12bo79boo 6bobo$127bo25bobo73boo98boo$75bo74bo4bo69bobboo100bo11bo$299bo11bo$ 260bobo34boo12bobo$75bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobb obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbo35boo35boo11boo29bo$261bo$266bo$obbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbo131bo30bo10bo39bo34bo$257bo7b3o37boo$30bo224b3o 48boo$o30boo60bo131bo116bo$30boo45bo$27bo49bobo$o24bobo49boo14bo131bo 116bo$26boo288boo$315boo$o9bobo80bo131bo91bo24bo$11boo72bo$11bo73bobo$ o84boo6bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo11bo24bo 91bo$251boo$250boo$o3bobobo7bo76bo47bo29bo41bo11bo116bo$97bobobo7bo35b obobo7bobobo13bobobo7bobobo16bobo$8bo7bo22bo168boo$o39boo51bo3bo3bo7bo 31bo3bo3bo11bo9bo3bo3bo11bo17bo3bo11bo116bo$8bobbobobbo22boo219boo48b 3o$97bobobobbobobbo35bobobobbobobbobobo13bobobobbobobbobobo69boo37b3o 7bo$o7bo7bo76bo47bo29bo41bo11bo34bo39bo10bo30bo$31bobo13bo49bo3bo7bo 35bo3bo7bo17bo3bo11bo109bo$8bo7bo15boo11boo259bo$o31bo13boo45bo3bobobo 7bo31bo3bobobo7bobobo9bo3bobobo7bobobo16bo4bo11bo29boo11boo35boo35bo$ 207bo46bobo12boo34bobo$207b3o46bo11bo$o92bo3bobo41bo29bo41bo11bo11bo 100boobbo$45bo52boo137boo98boo$46bo51bo81bo55bobo6boo79bo12bo$o43b3o 46bo24bobo20bo29bo9bo31bo11bo20boo15b3o59boo15bo$118boo59b3o63bo19bo 59bobo$119bo76bo67bo$o92bo47bo29bo22boo17bo11bo47bo24boo42bo$100bo29bo 64boo76boo22boo$39bobo56bobo27boo29bo112bobo24bo$o39boo14bo36bo5boo28b oo10bo15boo12bo41bo11bo116bo$35boo3bo15bobo94bo4boo$34bobo15bo3boo93bo bo22bo116boo$o35bo14boo40bo35bo11bo10boo17bobbobo36bo11bo27boo12b3o23b obo46bo$51bobo75bobo26bo16boo75bobo14bo23bo$118bobo8boo27bobo93bo13bo$ o92bo24boo21bo16boo5bo5bo16boo23bo11bo116bo$119bo30bo13bo22bobo5b3o$ 103bo40bobo4bo12b3o22bo5bo$o45b3o44bo7bobo37bo3boobb3o19bo24bo16bo11bo 116bo$46bo55boo41bo62boo$47bo144boo14bobo53bo$o92bo47bo25bo3bo19boo15b o4bo11bo38boo76bo$161b3obboo25bo69bobo$146b3o12bo4bobo$o44boo13bo32bo 17b3o27bo6bo13bo8bo41bo11bo116bo$46boo11boo52bo33bo5boo33boo113boo$45b o13bobo37boo11bo39bobo34boo111boo$o92bo4bobo40bo12bo16bo16bo24bo11bo 78bo37bo$100bo58boo42b3o$52boo63b3o39bobo41bo61boo$o50boo40bo23bo23bo 11boo4bo11bo32bo8bo11bo40boo74bo$53bo64bo35boo109bo$103b3o47bo$o92bo 11bo35bo29bo3b3o35bo11bo116bo$104bo72bo$176bo$o5boo85bo10bo36bo29bo41b o11bobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobb obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo$5bobo73bo22boo16b oo$7bo72boo21bobo16bobo$o79bobo10bo28bo9boo7bo29bo41bo$132bobo$65boo 65bo42bo$o13boo49bobo25bo47bo29bo3boo36bo$13bobo49bo31b3o7bo66bobo$15b o45boo36bo7boo$o59boo31bo4bo7bobo32bo29bo41bo$62bo$$obbobbobbobbobbobb obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$obbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$o38bo56bo78bo19bo38bo 56bo38bo$4bo3bobobo7bo22bo3bobobo7bo40bo3bobobo7bo56boo24bobobobbobobo 7bo19bobobobbo3bo7bo37bo3bobobobbobobo7bo$174boo$o3bo3bo11bo18bo3bo3bo 11bo36bo3bo3bo3bo7bo78bo7bo6bo7bo15bo7bobbo3bo7bo33bo3bo7bobbo3bo7bo 11bo$76bo$4bo3bobobobbobobbo22bo3bobobobbobobbo15bo24bo3bobobobbobobbo 39bo42bobobobbobobobbobobbo19bobobobbobobobbobobbo37bo3bobobobbobobobb obobbo$o38bo35b3o18bo60bo37bo38bo44bo11bo38bo$4bo7bo7bo22bo3bo3bo7bo 40bo3bo3bo7bo38b3o41bo6bo11bo19bo10bo7bo20bo16bo7bobbo3bo7bo$278b3o$o 3bo3bobobo7bo18bo3bo3bobobo7bo36bo3bo3bobobo7bo75bobbo3bobobobbobobo7b o15bo3bobobo6bo7bo33bo3bo3bobobobbobobo7bo11bo$191bo$191b3o$o38bo56bo 98bo38bo56bo38bo$6bobo272bobo$7boo272boo32bo$o6bo31bo56bo36bo61bo38bo 47bo8bo23bobo12bo$30bobo101bo153bo26boo$30boo100b3o139bo11boo$o30bo3bo 3bo56bo98bo38bo24bo14bobo10boobbo38bo$34bo37bo53bobo9bo118bobo14boo$ 34b3o6bo17bo8bobo54boo8bo68bo5bobo43boo57bobo$o38bobobo18bo8boo23bo30b o9b3o55bo8bobo6boo19bo56bo16bo8boo11bo$5bo36boo16b3o142boo6bo15bo71bo 7bo8bo$3bobo69bo65bo86bo73boo3b3o$o3boo33bo35bobo18bo6bobo35bobo51bo 32b3o3bo56bo4bo4boo27bo$56b3o16boo27boo35boo154bo$58bo45bo145bo44b3o 20bo$o15bo22bo17bo38bo54bo11bo31bo38bo16bo39bo26bobo9bo$7bo7bo6bo122b oo4bobo7boo86b3o66boo$5bobo7b3o4bobo120bobo3boo9boo$o5boo14boo15bo56bo 48bo49bo14b3o13bo7bo56bo38bo$212bo11boo$211bo13boo76boo$o38bo37bo18bo 98bo24bo13bo35bo20bo10bobo25bo$76bo65boo76bobo47bobo6bo24bo20b3o$58boo 16b3o62boo77boo48boo6bo46bo$o38bo17bobo36bo46bo16bo34bo38bo43b3o10bo 28boo4bo3bo$25boo32bo98boo48boo103b3o3boo$9bobo13bobo44b3o16boo66boo7b o38bobo94bo8bo7bo$o9boo13bo13bo22boo8bo18bobobbo71bobo24bo13bo24bo39b 3o14bo12boo8bo15bo$10bo51bobo8bo17bo76boo33boo13bo55bo28bobo$62bo141b oo11bo57bo8boo$o31boo5bo56bo98bo7bo13b3o14bo48boo6bo38bo$16boo14bobo 213b3o34bo$17boo7b3o3bo96boo13boo104bo55boo$o15bo9bo12bo56bo33boo13boo bboo37bo6bo38bo14bo41bo13bobo22bo$27bo101bo14bo5boo35boo78bo39bo$149bo 37bobo48boo26boo$o9boo23boobbo56bo98bo3b3o32bobbobo26bobo22bo38bo$4boo 5boo22bobo163bo37bo14bo$3bobo4bo24bo164bo15bo6boo19boo8boo$o4bo33bo56b o68boo28bo19boo6bobo8bo10boo6bobo35bo38bo$14boo144boo3bobo47bobo5bo20b o$15boo126boo15bobobbo$o13bo24bo17b3o36bo47boo14bo34bo38bo56bo38bo$11b o47bo83bo$11boo45bo$o9bobo26bo56bo62boo34bo38bo56bo38bo$35boo122bobo$ 34boo105b3o15bo$o35bobbo56bobb3o41bo51bo38bo56bo38bo$101bo40bo$100bo$o bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbo98bobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbo$135b3o$135bo$96bo39bo58bo3$96bo20boo76bo$ 118boo$117bo$96bo98bo3$96bobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo! golly-2.5-src/Patterns/Life/Syntheses/make-p11.rle0000644000175100001440000000346412156145314016706 00000000000000#C "Achim's p11" oscillator synthesized from 96 gliders #C Mark Niemiec, 2/2000; pattern from Jason Summers' "jslife" archive x = 266, y = 266, rule = B3/S23 245bobo$8bo236boo$9boo235bo$8boo$233bo$231boo$232boo15bo$14bo232boo$ 15boo231boo12bobo$14boo246boo$230bo32bo$229bo6bo$13bo13bo201b3o4bobo$ 14boo12boo206boo13bobo$13boo12boo222boo3bobo$252bo3boo$6bobo248bo$7boo $o6bo$boo$oo41bo$41bobo$42boo$48bo$49bo$47b3o$$12bo238bobo$13bo237boo$ 11b3o238bo3$4bobo$5boo$5bo6bo215bo$10bobo193bo19boo$11boo191boo21boo$ 34bobo168boo$35boo$35bo$45bo$43bobo198bo$44boo197bo$224bo18b3o$59bo 163bo$60boo161b3o$59boo$240bo$240bobo$240boo10$35bobo181bobo$36boo181b oo$36bo183bo$183bobo$183boo$50bo9bo123bo$48bobo10boo$49boo9boo16$72bo$ 73boo4bo$72boo6bo$78b3o13$182bo$182bobo$182boo10$93bo$91bobo$92boo3$ 179bo$179bobo$179boo$154bo$125bobo25bo6bo$126boo25b3obboo$119bo6bo32b oo$120bo$118b3obbo$124boo$123boo6$137boo$137bobo$137bo$$129boo$128bobo $130bo4$150b3o$126boo22bo$127boo22bo$126bo4$123bo$123boo$122bobo$152b oo$152bobo$152bo4$112b3o$114bo33bo$113bo33boo6boo$147bobo5bobo$155bo4$ 109b3o$111bo$110bo35boo$146bobo35bo$146bo36boo$183bobo$$70bo59bo$70boo 58boo$69bobo22b3o32bobo$77bo18bo$77boo16bo$76bobo$168boo$168bobo$168bo 3$76boo$75bobo$77bo16boo$95boo$94bo78boo$172boo$174bo8$56bo$56boo$55bo bo5$45bo183bo$45boo181boo$44bobo181bobo$$64boo$65boo$64bo$$178boo$178b obo$178bo$$24boo$23bobo$25bo$205boo$40b3o161boo$42bo163bo$20b3o18bo$ 22bo197boo$21bo198bobo$220bo$230bo$229boo$59boo168bobo$37boo21boo191b oo$38boo19bo193bobo$37bo215bo6bo$259boo$259bobo3$13bo238b3o$13boo237bo $12bobo238bo$$216b3o$216bo$217bo$222boo$222bobo$222bo41boo$263boo$258b o6bo$257boo$8bo248bobo$8boo3bo$7bobo3boo222boo12boo$12bobo13boo206boo 12boo$27bobo4b3o201bo13bo$29bo6bo$bbo32bo$bboo246boo$bobo12boo231boo$ 17boo232bo$16bo15boo$33boo$32bo$256boo$19bo235boo$19boo236bo$18bobo! golly-2.5-src/Patterns/Life/Syntheses/make-p18.rle0000644000175100001440000000171612156145314016713 00000000000000#C Glider synthesis of p18 oscillator. #C Mark Niemiec, 10/2002; pattern from Jason Summers' "jslife" archive x = 229, y = 229, rule = B3/S23 207bo$207bobo$207boo$9bo$10boo$9boo4$3bobo$4boo$4bo8$227bo$226bo$226b 3o28$36bo$37boo$36boo$$39bo$40boo$39boo3$53bo$54boo$53boo5$142bo$45bo 95bo$43bobo95b3o$44boo4$52bo$53boo$52boo16$104bobo$105boo$105bo$96bobo $97boo$92bo4bo$93bo$91b3o17$102b3o$104bo$103bo6$137boo$136boo$113boo 23bo$112bobo$114bo3$96boo$95bobo$97bo5$140boo$91b3o45boo$93bo47bo$92bo $$137boo$137bobo$68b3o66bo$70bo$69bo$$146bo$145boo$145bobo$150boo$150b obo$150bo$87boo$86bobo68b3o$88bo68bo$81b3o74bo$83bo$82bo$$147bo$146boo $45bo100bobo$45boo$44bobo7$165boo$46b3o115boo$48bo117bo$47bo$$162boo$ 162bobo$27b3o132bo$29bo$28bo$$176boo$45b3o127boo$47bo129bo$46bo$$173b oo$173bobo$173bo11$196bo$182bo12boo$181boo12bobo$181bobo4$3o36boo$bbo 37boo143b3o$bo37bo145bo$186bo11bo$197boo$197bobo5$224bo$223boo$29boo 192bobo$28bobo$30bo$$218boo$217boo$219bo$20boo$19bobo$21bo! golly-2.5-src/Patterns/Life/Syntheses/make-p33.rle0000644000175100001440000000237112156145314016706 00000000000000#C Synthesis of p33 oscillator from 68 gliders. #C By Jason Summers and Mark Niemiec, February 2001. #C Pattern from Jason Summers' "jslife" archive. x = 149, y = 149, rule = B3/S23 32bo$33boo79bo$32boo78boo$113boo$$41bo$42bo$40b3o$$30bobo60bobo$31boo 11bobo46boo19bobo$31bo13boo47bo13bo5boo$45bo60boo7bo$107boo4$29bo$30b oo85bo$29boo84boo$116boo3$30bo$31bo84bo$29b3o83bo$115b3o3$123bo5bobo$ 34bo88bobo3boo8bo$18bobo5bo8boo86boo5bo6boo$10bo8boo3bobo7boo102boo6bo bo$11boo6bo5boo119boo$bobo6boo104bobo28bo$bboo112boo$bbo114bo4$11bobo 127bo$12boo127bobo$12bo128boo$$64bo73bo$65boo24bo44boo$64boo25bobo43b oo$91boo3$77bo$78boo$77boo$9bo$10boo$9boo35bo36bo$47bo34bo$45b3o34b3o 7$57bo44bobo$55bobo44boo$56boo45bo3$51bo$51boo$50bobo6$96bobo$96boo$ 97bo3$45bo45boo$45boo44bobo$44bobo44bo7$64b3o34b3o$66bo34bo$65bo36bo 35boo$137boo$139bo$70boo$69boo$71bo3$56boo$10boo43bobo25boo$11boo44bo 24boo$10bo73bo$$6boo128bo$5bobo127boo$7bo127bobo4$31bo114bo$31boo112b oo$bo28bobo104boo6bobo$boo119boo5bo6boo$obo6boo102boo7bobo3boo8bo$10b oo6bo5boo86boo8bo5bobo$9bo8boo3bobo88bo$17bobo5bo3$31b3o$33bo83b3o$32b o84bo$118bo3$31boo$32boo84boo$31bo85boo$119bo4$40boo$33bo7boo60bo$33b oo5bo13bo47boo13bo$32bobo19boo46bobo11boo$53bobo60bobo$$106b3o$106bo$ 107bo$$34boo$35boo78boo$34bo79boo$116bo! golly-2.5-src/Patterns/Life/Syntheses/oscillator-syntheses.rle0000644000175100001440000000434612156145314021570 00000000000000#C Glider syntheses for ten oscillators. #C Pentadecathlon, tumbler, mold, figure 8, unix, mazing, #C A for All, washing machine, octagon II, cloverleaf. #C From Alan Hensel's "lifebc" pattern collection x = 187, y = 79, rule = B3/S23 obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo3$o17bo38bo20bo20bo26b o23bo35bo$67bo36bo$63bo3bobo35bo29bo44bo$o17bo38bo6bobboo9bo5bo14bo3b 3o20bo9boo12bo29bobo3bo$62b3o20bo26bo22boo43boo$10bo72b3o26bobo$o7bobo 7bo38bo7bobo10bo20bo12boo12bo23bo35bo$9boo20bobo7bobo21boo15bo$27boo3b oo7boo3boo18bo15boo$o9b3o5bo9boobbo9bobboo10bo20bobbobo15bo18bo7bo23bo 35bo$10bo16bo19bo21bo47bo$11bo57bobo45b3o$o5bobo9bo4boo25boo5bo11boo7b o14boo4bo26bo8b3o8bo3bo35bo$7boo15boo7boo5boo7boo42bobo12bobo26bo7boo$ 7bo15bo8bobo5bobo8bo41bo15boo25bo8bobo$o17bo15bo5bo16bo20bo20bo9bo16bo 23bo35bo$137b3o$68bo19b3o13bo3boo27bo$o17bo38bo9boo9bo9bo10bo4boobbobo 9boo4bo3b3o5bo11bo35bo$67bobo19bo13bobobbo11bobo9bo21bo13bo$120bo10bo 23boo10bo$o17bo38bo20bo20bo26bo23bo3boo11b3o16bo3$obbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo5bo29bo $157bo$155b3o$o47bo47bo53bo35bo$114bo46bo$112bobo45bo$o18bo28bo47bo16b oo35bo9b3o23bo$17bobo43bo$18boo18bo25bo52b3o$o36bo10bo13b3o31bo20bo32b o35bo$37b3o78bo$$o47bo47bo53bo35bo$78bo$78bobo22bo$o47bo29boo16bo7bo 45bo35bo$55bo46b3o$39bobo11bobo$o34bo4boo6bo5boo40bo53bo9b3o23bo$35boo 3bo65boo52bo$34bobo69bobo52bo$o18b3o18b3o5bo47bo9bo43bo35bo$14b3obbo8b obo11bo18bo93b3o$16bo3bo8boo10bo20boo93bo$o14bo13bo18bo12boo33bo53bo5b o29bo$$28boo50boo$o27bobo17bo30boo15bo53bo3boo11b3o16bo$28bo52bo73boo 10bo$154bo13bo$o47bo47bo53bo35bo$7bo14b3o119b3o$7boo13bo64boo55bo$o5bo bo14bo24bo38bobo6bo48bo4bo35bo$87bo$37b3o23boo$o36bo10bo13bobo31bo53bo 35bo$18boo18bo25bo$17bobo$o18bo28bo47bo53bo35bo$$78b3o$o47bo29bo17bo 53bo35bo$79bo$180boo$o47bo47bo53bo29bobo3bo$129boo49bo$129bobo$o47bo 47bo32bo20bo35bo3$obbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo! golly-2.5-src/Patterns/Life/Syntheses/slow-salvo-eater-recipes.rle0000644000175100001440000000326512156145314022225 00000000000000#C Four results from Paul Chapman's 'Glue' search program: #C asynchronous slow-salvo glider constructions of four orientations #C of a fishhook eater. [A mirror image provides recipes for the other #C four orientations.] Salvos contain 13, 13, 15 and 18 gliders. #C Paul Chapman, 30 December 2003 x = 1361, y = 1434, rule = B3/S23 150bo$151bo$149b3o11$189bo$190bo$188b3o53$234bo$235bo$233b3o19$1359bo$ 1358bo$1358b3o20$1320bo$277bo1041bo$278bo1040b3o$276b3o37$1279bo$1278b o$1278b3o$319bo$317bobo$318boo43$373bo$371bobo$372boo9$1238bo$1237bo$ 1237b3o21$1197bo$1196bo$1196b3o7$418bo$416bobo$417boo41$458bo$456bobo$ 457boo696bo$1154bo$1154b3o37$499bo$497bobo$498boo$1112bo$1111bo$1111b 3o38$534bo$532bobo$533boo4$1073bo$1072bo$1072b3o26$1034bo$1034bobo$ 1034boo8$572bo$570bobo$571boo34$979bo$979bobo$979boo9$632bo$630bobo$ 631boo35$928bo$928bobo$928boo9$676bo$674bobo$675boo30$892bo$892bobo$ 892boo9$712bo$710bobo$711boo35$846bo$846bobo$846boo9$758bo$756bobo$ 757boo24$814boo$814boo10$789boo$789boo9$809boo$809boo$786boo$786boo31$ 749b3o$751bo$750bo90boo$841bobo$841bo42$701b3o$703bo$702bo$$882boo$ 882bobo$882bo30$658b3o$660bo$659bo12$925boo$925bobo$925bo35$610b3o$ 612bo$611bo7$980boo$980bobo$980bo27$564b3o455b3o$566bo455bo$565bo457bo 37$1050boo$1050bobo$1050bo14$516b3o$518bo$517bo27$1089b3o$1089bo$1090b o11$483boo$482bobo$484bo25$1129b3o$1129bo$1130bo16$434boo$433bobo$435b o13$1169b3o$1169bo$1170bo27$390boo$389bobo$391bo25$1213b3o$1213bo$ 1214bo15$336boo$335bobo$337bo6$1254b3o$1254bo$1255bo30$1299b3o$1299bo$ 1300bo$$310boo$309bobo$311bo43$272boo$271bobo$273bo$1338b3o$1338bo$ 1339bo40$228boo$227bobo$229bo43$163boo$162bobo$164bo42$118boo$117bobo$ 119bo41$74boo$73bobo$75bo40$47boo$46bobo$48bo40$boo$obo$bbo! golly-2.5-src/Patterns/Life/Syntheses/two-glider-collisions.rle0000644000175100001440000001400612156145314021615 00000000000000#C the 71 distinct 2-glider collisions, grouped by what they produce #C Thirteen preblocks (3-cell patterns that become blocks in one tick) #C have been added to keep active patterns from getting out of hand: #C see GLIDER, B, PI, TL+GLIDER, and 2-GLIDER MESS. #C PI=pi-heptomino; B=B-heptomino; TL=traffic light; HF=honeyfarm; #C LOM='lumps of muck': Jason Summers, 29 January 2005 x = 379, y = 369, rule = B3/S23 154bo36bo18bo$58bo18bo19bo16bo19bo18bo19bo16bo18bo36bo$57bo18bo19bo16b o19bo19b3o16bo17b3o16b3o15bo17bo$57b3o16b3o17b3o14b3o17b3o36b3o51bo18b 3o$226b3o4$190bo$58b3o17b3o89bo18boo55bo$58bo19bo20bo17bo20bo13boo15b oo18bobo14boo20bo16boo$59bo19bo18boo16boo19boo13bobo14bobo34bobo18boo 16bobo$98bobo15bobo18bobo12bo53bo20bobo$bo4bo3bobo3bobobobbo3bo3bo3bo 4bo4bobo$$bobobbobbo3bo4bo4bo3bo3bo3bobobbobbo$$bobbobobbo3bo4bo4bobob o3bo3bobbobobbobbobo$$bo4bobbo3bo4bo4bo3bo3bo3bo4bobbo4bo266bo$269bo 22bo21bo62bo$bo4bo3bobo5bo4bo3bo3bo3bo4bo4bobo182bo15bo21bo22bo22b3o 18bo22bo17bo$229bo15bo22b3o20b3o40bo22bo18b3o$86bo16bo17bo16bo16bo15bo 17bo16bo22b3o13b3o86b3o20b3o$66bo18bo16bo17bo16bo16bo15bo17bo16bo$65bo 19b3o14b3o15b3o14b3o14b3o13b3o15b3o14b3o$65b3o4$224b3o15b3o59boo$76b3o 16b3o16b3o15b3o15b3o14b3o16b3o15b3o19bo17bo11boo23boo20bobo20boo40boo$ 54b3o21bo18bo18bo17bo17bo16bo18bo17bo18bo17bo13boo23boo21bo21boo12boo 26boo$56bo20bo18bo18bo17bo17bo16bo18bo17bo50bo24bo44bo15boo24bo$55bo 285bo23$106bo157bo$74bo30bo157bo38bo$bbobo4bo6bo3bo4bobbo3bobbobobobbo bo28bo15bo15b3o119bobobobbo28b3o14bo20bo$46bo26b3o12bo190bo21b3o$bbo3b obbo6bo3bobobbobbobbo3bo6bo45b3o138bo4bo44b3o$46bo$bbobo4bo6bo3bobbobo bbobo4bobobobbobo184bo4bo$$bbo3bobbo6bo3bo4bobbobbo3bo6bobbo183bo4bo$ 305b3o$bbobo4bobobobbo3bo4bobbo3bobbobobobbo3bo61boo119bo4bobobo44bo 21bo$108bobo146boo23boo22bo$66boo21boo17bo149boo22bobo$65bobo21bobo 165bo$67bo21bo17$84bo15bo39bo153bo24bo19bo$bobo4bo7bobo4bobo3bo3bo28bo 20bo15bo39bo88bo3bobbobobo20bo16bo15bo24bo19bo$61bo21b3o13b3o15bo21b3o 17bo99bo16bo16b3o22b3o17b3o$bo3bobbo6bo3bobbo3bobbobbo28b3o52bo41bo69b o3bobbo23b3o14b3o$116b3o39b3o$bobo4bo6bo3bobbo6bobo196bobobobbobobo$$b o3bobbo6bo3bobbo3bobbobbo195bo3bobbo$$bobo4bobobo3bobo4bobo3bo3bo85b3o 106bo3bobbo$54b3o62bo17boo16bo103bo35boo35boo$56bo21boo15boo23bo16bobo 14boo102boo16boo17bobo11boo22boo$55bo23boo15boo39bo16bobo101bobo15bobo 16bo14boo20bo$78bo16bo180bo32bo6$73boo19boo$74bo20bo152boo$249bo7$64bo 233bo$63bo20bo194bo17bo$63b3o17bo166bo27bo18b3o$bbobo3bo6bo3bobo4bobob obbobo47b3o143bobo17bo28b3o$37bo211b3o$o7bo6bo3bo3bobbo6bo195bo3bo$37b o275boo$obbobobbo6bo3bo3bobbobobobbobo193bobo82bo$256boo$o4bobbo6bo3bo 3bobbo6bobbo192bo3bo23bo$80bo$bbobo3bobobobbo3bobo4bobobobbo3bo20boo 19boo148bobo18bo42boo$57bobo19bobo167boo13boo26bobo$59bo189bobo13boo 27bo$264bo14$252boo24boo$253bo25bo$258bo15bo$257bo15bo26bo$61bo195b3o 13b3o23bo$obo5bobo5bo4bobobo34bo167bobo4bo63b3o$60b3o169bo45bo24b3o$o 3bobbo3bo3bobo5bo204bo6bo41boo24bo$232bo44bobo24bo$obo4bo3bobbo3bo4bo 204bobo4bo19boo37boo$254bobo38bo$o3bobbo3bobbobobo4bo204bo6bo20bo$$obo 5bobo3bo3bo4bo204bo6bo$$53boo$54boo$53bo18$3bo3bo3bo3bo3bobbobobo30bo 169bo6bobo3bo5bo18bo$56bo207bo$3bo3bo3bo3bo3bobbo33b3o168bo5bo3bobbobo bobo17b3o$$3bobobo3bo3bo3bobbobobo200bo5bo3bobbobbobbo$$3bo3bo3bo4bobo 3bo204bo5bo3bobbo5bo$$3bo3bo3bo5bo4bobobo32b3o165bobobobbobo3bo5bo$59b o203bo$60bo201boo$262bobo17$67bo$66bo$4bo6bobo5bo4bobobo37b3o157bobobo bbobobo4bo4bobo4bobo4bobo5bobo3bobo$251bo13bo13bo17bo$4bo5bo3bo3bobo3b o203bo4bo7bobo3bo6bo3bobbo6bo3bobbo20bo$251bo13bo13bo16b3o$4bo5bo3bobb o3bobbobobo199bo4bobobobbo3bobbobo4bo3bobbobo4bo3bobbobo$$4bo5bo3bobbo bobobbo203bo4bo6bobobobbobbo3bo3bobbobbo3bo3bobbo$$4bobobobbobo3bo3bo bbo203bo4bobobobbo3bobbo3bobbobo4bo3bo3bobo3bo$58boo239bo$57bobo238boo $59bo238bobo16$59bo$58bo$58b3o264bo$3bobobo4bo4bobobobbobobobbobo193bo 3bo4bobbobobobbobobobbobo5bobo3bo3bo4bo4bo4bo4bobo3bobobo22bo$35bo221b o66b3o$3bo7bobo5bo4bo6bo195bo3bobobbo4bo4bo6bo6bo3bobbo3bo3bobo3bobobb obbo7bo$35bo221bo$3bobobobbo3bo4bo4bobobobbobo193bo3bobbobo4bo4bobobo bbobo4bo6bobobobbo3bobbobbobobbobbobobbobobo$57bo$3bo6bobobo4bo4bo6bo bbo21boo169bo3bo4bo4bo4bo6bobbo3bo3bobbo3bobbobobobbo4bobbo4bobbo26b3o $56bobo265bo$3bobobobbo3bo4bo4bobobobbo3bo191bo3bo4bo4bo4bobobobbo3bo 3bobo3bo3bobbo3bobbo4bo4bobo3bobobo23bo11$305boo$306bo9$55bo16bo237bo$ bbobo5bobo3bo4bobbobo27bo16bo155bobobobbo14bobo3bo6bo3bobo4bobobobbobo 26bo$6bo47b3o14b3o210bo24b3o$bbo6bo3bobbobobbobbo3bo200bo4bo7bo4bo7bo 6bo3bo3bobbo6bo$6bo277bo$bbobo4bo3bobbobbobobbo3bo200bo4bo5bobobobbobb obobbo6bo3bo3bobbobobobbobo$$bbo6bo3bobbo4bobbo3bo200bo4bo7bo4bo4bobbo 6bo3bo3bobbo6bobbo26b3o$310bo$bbo7bobo3bo4bobbobo46bo155bo4bobobo10bob o3bobobobbo3bobo4bobobobbo3bo26bo$50boo20boo$51boo19bobo$50bo19$bbobo 5bo7bobo4bo7bobo4bobo3bo3bo$$bbo3bo3bo7bo3bobbo6bo3bobbo3bobbobbo28bo 239bo$77bo239bo$bbobo5bobbobobbobo4bo6bo3bobbo6bobo28b3o237b3o$229bobo 4bobo3bobobo3bobo3bo5bo3bo3bo4bo3bobo$bbo3bo3bo7bo3bobbo6bo3bobbo3bobb obbo$228bo3bobbo3bo4bo4bo3bobbobobobo3bo3bobobbobbo3bo$bbobo5bo7bobo4b obobo3bobo4bobo3bo3bo$228bo3bobbo8bo4bo3bobbobbobbo3bo3bobbobobbo3bo$ 77b3o$77bo150bo3bobbo3bo4bo4bo3bobbo5bo3bo3bo4bobbo3bo$78bo$229bobo4bo bo5bo5bobo3bo5bo3bo3bo4bo3bobo26boo$307bobo$309bo7$276boo37boo$277bo 38bo6$112bo13bo$bbo6bobo5bo4bobobo9bobo4bo6bo3bo4bobbo3bobbobobobbobo 32bo13bo$80bo30b3o11b3o$bbo5bo3bo3bobo3bo8bo4bo3bobbo6bo3bobobbobbobbo 3bo6bo$80bo$bbo5bo3bobbo3bobbobobobbobobobbobo4bo6bo3bobbobobbobo4bobo bobbobo$$bbo5bo3bobbobobobbo8bo4bo3bobbo6bo3bo4bobbobbo3bo6bobbo$$bbob obobbobo3bo3bobbo13bobo4bobobobbo3bo4bobbo3bobbobobobbo3bo$107boo21boo 195bo$107bobo20bobo193bo$107bo22bo98bobobo9bobo3bo6bo3bobo4bobobobbobo 7bo5bobbobobo3bobo3bobo16b3o$278bo$233bo7bo7bo6bo3bo3bobbo6bo9bobobobo bbo6bo5bo$278bo$229bobobobbobobbobbobobbo6bo3bo3bobbobobobbobo7bobbobb obbobobo3bobo3bobo$$229bo11bo4bobbo6bo3bo3bobbo6bobbo6bo5bobbo10bo5bo$ 324bo$229bobobo9bobo3bobobobbo3bobo4bobobobbo3bo5bo5bobbobobo3bobo3bob o13boo$323bobo7$69bo$68bo$46bo21b3o34bo$3bo5bo3bo3bobo4bobo18bo58bo$ 45b3o56b3o$3bobobobo3bobbo6bo3bo$$3bobbobbo3bo3bobo3bo$$3bo5bo3bo6bobb o3bo19b3o$47bo24boo17b3o177boo32boo$3bo5bo3bo3bobo4bobo21bo23bobo18bo 178bo33bo$72bo19bo! golly-2.5-src/Patterns/Life-Like/0000755000175100001440000000000012156146015013633 500000000000000golly-2.5-src/Patterns/Life-Like/Morley/0000755000175100001440000000000012156146015015102 500000000000000golly-2.5-src/Patterns/Life-Like/Morley/breeder2.rle0000644000175100001440000001075112156145314017225 00000000000000#C An unusual breeder. #C By Stephen Morley -- http://www.safalra.com/special/b368s245/ x = 337, y = 95, rule = S245/B368 161boo$160b4o10boo$161bobbo8b4o$161bo3bo6bobbo$100boo62bo6bo3bo$99b4o 49boo9bo8bo62boo$100bobbo10boo35b4o6bob3o7bo9boo49b4o$100bo3bo8b4o33bo bbo6boobo7b3obo6b4o35boo10bobbo$103bo8bobbo33bo3bo7boo10boboo6bobbo33b 4o8bo3bo$91boo9bo8bo3bo34bo8boobboo9boo7bo3bo33bobbo8bo$53boo35b4o6bob 3o7bo38bo8b4o8boobboo8bo34bo3bo8bo9boo$52b4o33bobbo6boobo10bo9boo24b3o bo5bo4bo8b4o8bo38bo7b3obo6b4o35boo$51bobbo33bo3bo7boo9b3obo6b4o25boboo 6boo9bo4bo5bob3o24boo9bo10boboo6bobbo33b4o$50bo3bo34bo8boobboo9boboo6b obbo25boo6b4o10boo6boobo25b4o6bob3o9boo7bo3bo33bobbo$51bo38bo8b4o11boo 7bo3bo22boobboo17b4o6boo25bobbo6boobo9boobboo8bo34bo3bo$52bo9boo24b3ob o5bo4bo8boobboo8bo24b4o26boobboo22bo3bo7boo11b4o8bo38bo$50b3obo6b4o25b oboo6boo11b4o8bo24bo4bo26b4o24bo8boobboo8bo4bo5bob3o24boo9bo$52boboo6b obbo25boo6b4o9bo4bo5bob3o24boo6bobbo17bo4bo24bo8b4o11boo6boobo25b4o6bo b3o$53boo7bo3bo22boobboo19boo6boobo25b4o6boo10bobbo6boo24b3obo5bo4bo9b 4o6boo25bobbo6boobo$51boobboo8bo24b4o19b4o6boo36boo11boo6b4o25boboo6b oo19boobboo22bo3bo7boo$52b4o8bo24bo4bo4b4o18boobboo47boo36boo6b4o19b4o 24bo8boobboo$51bo4bo5bob3o24boo7boo20b4o84boobboo18b4o4bo4bo24bo8b4o$ 53boo6boobo25b4o27bo4bo24bobbo56b4o20boo7boo24b3obo5bo4bo$52b4o6boo36b oo11bobbo6boo18boo7boo28bobbo24bo4bo27b4o25boboo6boo$60boobboo48boo6b 4o16b4o6boo29boo7boo18boo6bobbo11boo36boo6b4o$61b4o25b4o20boo25bobbo 38boo6b4o16b4o6boo48boobboo$52b4o4bo4bo25boo47bo3bo47bobbo25boo20b4o 25b4o$53boo7boo18boo57bo50bo3bo47boo25bo4bo4b4o$61b4o16b4o6boo7boo20bo bbo16bo52bo57boo18boo7boo$53boo25bobbo16boo21boo7boo6b3obo49bo16bobbo 20boo7boo6b4o16b4o$79bo3bo39boo6b4o7boboo46bob3o6boo7boo21boo16bobbo 25boo$61b4o15bo51bobbo7boo46boobo7b4o6boo39bo3bo$62boo17bo50bo3bo4boo bboo45boo7bobbo51bo15b4o$71boo6b3obo51bo6b4o44boobboo4bo3bo50bo17boo$ 53boo7boo6b4o7boboo49bo6bo4bo44b4o6bo51bob3o6boo$53boo16bobbo7boo9bo 38bob3o6boo45bo4bo6bo49boobo7b4o6boo7boo$71bo3bo4boobboo5bo39boobo7b4o 46boo6b3obo38bo9boo7bobbo16boo$74bo6b4o5b3o39boo57b4o7boboo39bo5boobb oo4bo3bo$73bo6bo4bo5boo37boobboo67boo39b3o5b4o6bo$3bobbo64bob3o6boo5bo bobo37b4o66boobboo37boo5bo4bo6bo$bbobobobbobo58boobo7b4o3bob5o35bo4bo 6bobbo56b4o37bobobo5boo6b3obo64bobbo$bo3b3oboobbobbo44bo9boo16boobbo 38boo9boo46bobbo6bo4bo35b5obo3b4o7boboo58bobobbobobo$oo6boboboobboobo 4boo37bo5boobboo15bo40b4o8boo47boo9boo38bobboo16boo9bo44bobbobboob3o3b o$4obb3oboboobboobo4boo36b3o5b4o7b4o107boo8b4o40bo15boobboo5bo37boo4bo boobboobobo6boo$bo5boboobbobbo45boo5bo4bo7boo168b4o7b4o5b3o36boo4boboo bboobob3obb4o$9bobo49bobobo5boo180boo7bo4bo5boo45bobbobboobo5bo$60b5ob o3b4o8boo47bobbo129boo5bobobo49bobo$61bobboo66boo68bobbo47boo8b4o3bob 5o$64bo67boo69boo66boobbo$14bobo19bo33b4o129boo67bo$6bo5boboobbobbo9bo 3b3o33boo190b4o33bo19bobo$5b4obb3oboboobboobo8boobo45boo180boo33b3o3bo 9bobbobboobo5bo$5boo6boboboobboobo7b5o34boo9boo169boo45boboo8boboobboo bob3obb4o$6bo3b3oboobbobbo11bobb3o214boo9boo34b5o7boboobboobobo6boo$7b obobobbobo18bobo260b3obbo11bobbobboob3o3bo$8bobbo24bo262bobo18bobobbob obo$142boo156bo24bobbo$71boo68bob3o47boo$32bobo36boo66bo4bo46b3obo68b oo$24bo5boboobbobbo17bobboo78boobbo47bo4bo66boo36bobo$23b4obb3oboboobb oobo4boo8b3obo76bob4o48bobboo78boobbo17bobbobboobo5bo$23boo6boboboobb oobo4boo8boobboo16b6o52boboo4bo47b4obo76bob3o8boo4boboobboobob3obb4o$ 24bo3b3oboobbobbo17boboboo16bobboo52bob6o47bo4boobo52b6o16boobboo8boo 4boboobboobobo6boo$25bobobobbobo22bobobo17b3obo53b3obboo49b6obo52boobb o16boobobo17bobbobboob3o3bo$26bobbo27b5o14boboo4bo51b4o53boobb3o53bob 3o17bobobo22bobobbobobo$60bobo13boob6o45boo5boo58b4o51bo4boobo14b5o27b obbo$61bo16bobboo47boo66boo5boo45b6oboo13bobo$60booboo11bo53boboo71boo 47boobbo16bo$32bobbo28bo10boo53b4o69boobo53bo11booboo$31bobobobbobo28b 3o131b4o53boo10bo28bobbo$30bo3b3oboobbobbo24boo193b3o28bobobbobobo$29b oo6boboboobboobo4boo16bo193boo24bobbobboob3o3bo$29b4obb3oboboobboobo4b oo10b3o197bo16boo4boboobboobobo6boo$30bo5boboobbobbo19boo202b3o10boo4b oboobboobob3obb4o$38bobo24bo204boo19bobbobboobo5bo$271bo24bobo$$14bobb o24bo$13bobobobbobo18bobo250bo24bobbo$12bo3b3oboobbobbo11bobb3o248bobo 18bobobbobobo$11boo6boboboobboobo7b5o249b3obbo11bobbobboob3o3bo$11b4o bb3oboboobboobo8boobo251b5o7boboobboobobo6boo$12bo5boboobbobbo9bo3b3o 250boboo8boboobboobob3obb4o$20bobo19bo250b3o3bo9bobbobboobo5bo$294bo 19bobo3$15bobo$7bo5boboobbobbo296bobo$6b4obb3oboboobboobo4boo282bobbo bboobo5bo$6boo6boboboobboobo4boo273boo4boboobboobob3obb4o$7bo3b3oboobb obbo282boo4boboobboobobo6boo$8bobobobbobo296bobbobboob3o3bo$9bobbo306b obobbobobo$324bobbo! golly-2.5-src/Patterns/Life-Like/Morley/enterprise-gun.rle0000644000175100001440000003712212156145314020503 00000000000000#C An almost-state-of-the-art enterprise gun. #C The dotted sections can be moved away from each other to create #C space for the construction of enterprise salvos. #C By Stephen Morley -- http://www.safalra.com/special/b368s245/ x = 509, y = 559, rule = B368/S245 obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobo$$o311bo$$o145b4o162bo$132b4o10b4o$o 121boo8b4o176bo$118b3ob4o$o118bobo3bo186bo$119boo4boo$o117boo4b3o185bo $120bo3b3o$o117boo4b3o71b4o110bo$119boo4boo71b4o10b4o$o118bobo3bo86b4o 96bo$118b3ob4o96b4o3bo$o121boo98b3o3boo82bo$198boo20b3obob3o$o196bobbo 11boo6b3obo3boo82bo$198boo11bobbo4b4o4bo$o196bobbo11boo6b3obo3boo82bo$ 197bobbo10bobbo5b3obob3o$o196bobbo10bobbo7b3o3boo82bo$197bobbo10bobbo 7b4o3bo$o196bobbo10bobbo97bo$197bobbo10bobbo$o196bobbo10bobbo97bo$198b oo11bobbo$o197boo12boo98bo$198boo12boo$o196bobbo11boo98bo$211bobbo$o 311bo$$o311bo$$o145bo4bo160bo$132bo4bo8b6o$o131b6o10boo162bo$134boo$o 311bo$$o311bo$197b4o$o196b4o10b4o97bo$211b4o$o311bo$$o311bo$124boo$o 123boo186bo$124boo$o123boo186bo$$o311bo$$o311bo$222boo$o221boo88bo$ 222boo$o221boo88bo$$o311bo$$o311bo$$o311bo$147bo$o133b4o7b5o162bo$134b 4o7b5o$o142b9o160bo$143boo5boo$o142b4ob4o160bo$143bo7bo$o144bo3bo162bo $145bobobo$o143b3ob3o59b4o98bo$143booboboboo46b5o7b4o$o195b9o107bo$ 196bobb3obbo$o194boo7boo72b4o30bo$125boo68boo7boo72b4o10b4o$o124boo70b o5bo88b4o16bo$125boo69bobobobobo97b4o3bo$o124boo69b4ob4o97b3o3boobbo$ 196bobbobobbo95b3obob3o$o299b3obo3boobbo$299b4o4bo$o299b3obo3boobbo$ 300b3obob3o$o220boo79b3o3boobbo$219b6o77b4o3bo$o219bobbo88bo$$o218b6o 87bo$219boboobo$o220boo89bo$220bobbo$o123b4o39bo3bo49boo89bo$124bobbo 39bo3bo$o121bobboobbo37bo3bo140bo$122bobboobbo$o121bo6bo182bo$125boo 93b4o53b4o$o219bobbo52boboobo9b4o17bo$121bo8bo89bobbo52b6o8boboobo$o 120boboboobobo88boboobo51b6o8b6o16bo$220bobbo54boo10b6o$o277boo12boo 18bo$292boo$o277boo32bo$278boo12boo$o125boo149bobbo11boo18bo$126boo73b 3o74boo11bobbo$o125boo73boo75boo12boo18bo$126boo73bo76boo12boo$o291boo 18bo$$o311bo$$o219boo90bo$220boo$o219boo90bo$220boo$o311bo$302boo$o 301boo8bo$302boo$o301boo8bo$$o151bobobo155bo$102bo47b4o3bo$o89bobo3boo 4boo36bo9bobooboo155bo$90bobb5ob3obbo9b4o22boo7boo4boo$o82b4o3bobb5ob 3obbo9b4o22b3o5boobo4boo154bo$83b4o3bobo3boo4boo44booboobbo$o101bo45b oobo4boo154bo$149boo4boo$o149bobooboo155bo$150b4o3bo$o151bobobo155bo$$ o311bo$$o289b4o18bo$103bo174b5o7b4o$o90bobo3boo4boo42b4o125b9o27bo$91b obb5ob3obbo9b4o28b4o125bobb3obbo$o83b4o3bobb5ob3obbo9b4o156boo7boo26bo $84b4o3bobo3boo4boo170boo7boo$o102bo173bo5bo28bo$276bobobobobo$o275b4o b4o27bo$276bobbobobbo$o56boo106bo10bobbo13boo117bo$57boo105bobobbo6bob oo13boo$o56boo71boo31bo3bobo7boboo12boo117bo$57boo29b7o35boo31bo3bobo 7boboo12boo106boo$o85boo7boo33boo32bobobbo6boboo121boo9bo$86b3o5b3o33b oo33bo10bobbo121boo$o86bobbobobbo205boo9bo$88bobobobo$o88bobobo218bo$ 87b4ob4o131b3o$o86bobbobobbo11bobbo116boo83bo$107bobo117bo$o107bo138bo 3bo60bo$109boo136bo3bo$o246bo3bo60bo$$o62bo47boo199bo$56bobboboo48b3o bboo$o53b7obbo46bobobobo195bo$54bo5bob3o9b4o32bo4boo$o42b4o7bo5bob3o9b 4o32bobbooboo194bo$43b4o7b7obbo46bo4bo185boo$o55bobboboo47bobbooboo 182b4o8bo$63bo46bo4boo183b4o$o109bobobobo183bobbo8bo$111b3obboo181b6o$ o110boo126boo58bo4bo7bo$239b3o55b10o$o238boboo55bobboobbo6bo$240b3o$o 63bo247bo$57bobboboo$o54b7obbo42b4o201bo$55bo5bob3o9b4o28b4o$o43b4o7bo 5bob3o9b4o221boo10bo$44b4o7b7obbo235boo$o56bobboboo236boo10bo$64bo235b oo$o311bo$$o137b3o12boo157bo$50b3o69boo13bo3bo11boo$o48b5o36boo30boo 12bo4bo11boo157bo$47b3o3b3o34boo30boo12bo4bo11boo$o46bobb3obbo34boo30b oo13bo3bo90bobobo75bo$46b3obbobb3o33boo46b3o48bobo3boo33b4o3bo$o46boo 5boo132boobbobbobo32bobooboo75bo$46bo9bo131b5obbobbo30boo4boo$o47boobo boo108b4o21b5obbobbo29boobo4boo74bo$46bob3ob3obo106b4o21boobbobbobo30b ooboobbo$o46bobbobobbo133bobo3boo31boobo4boo74bo$229boo4boo$o229boboob oo75bo13bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobo$230b4o3bo$o 231bobobo75bo13bo117bo$15boobo$o15bobo53bobobo235bo13bo102bobbobobbo6b o$16bobbo50b4o3bo350bob3ob3obo$o14bobobo8boo40bobooboo235bo13bo103boob oboo7bo$15booboo8boboobb4o31boo4boo113bobo3boo9boo219bo9bo$obb4o8boobo 9boboobb4o30boobo4boo111boobbobbobo7b4o17b4o81bo13bo18bo83boo5boo6bo$ 3b4o11boo8boo38booboobbo113b5obbobbo8boo17b4o115bo46boo33b3obbobb3o$o 15b5o47boobo4boo86b4o21b5obbobbo8bo103bo13bo18bo15boo30boo34bobb3obbo 6bo$16boboobo47boo4boo87b4o21boobbobbobo131boo11boobo14boo30boo34b3o3b 3o$o15b5obo47bobooboo113bobo3boo114bo13bo3boo11boobo14boo30boo36b5o8bo $17b3obo48b4o3bo252boo13bo15boo69b3o$o18boboo49bobobo188boo45bo13bo3b oo14bo97bo$20bo246bo77bo77bo$o263bo3bo4boo37bo13bo95bobo19bo$242boo16b oboobbo6boo148bobo$o209boo30boo16bo3bobobboobboo37bo13bo96bobo4bobbo 10bo$168b7o35boo30boo16bo3bobobboobboo145bobboo5boobo3b4o$o28boo36b4o 95boo7boo33boo30boo16boboobbo45bo13bo79b4o7b3obbooboobboobboobb4o3bo$ 29boboobb4o28b4o95b3o5b3o33boo52bo3bo105b4o28b4o7b3obbooboobboobboo$o 3b4o9bo11boboobb4o128bobbobobbo91bo44bo13bo47b4o42bobboo5boobo10bo$4b 4o10boo9boo137bobobobo90boo156bobo4bobbo$o17bobo148bobobo138bo13bo96bo bo18bo$21bo145b4ob4o246bobo$o18boo77b4o65bobbobobbo136bo13bo96bo20bo$ 95boob3obo$o92bobboboobobbo8boo197bo13bo45boo70bo$82boo10b3o3bobbobo7b oo252boobb3o50bo$o49boo30boo8bo5bo5b3o6boo197bo13bo41bobobobo48bobo18b o$8b7o35boo30boo8bo5bo5b3o6boo253boo4bo49bobo$o5boo7boo33boo30boo10b3o 3bobbobo52bo32boo119bo13bo40booboobbo49bobo4bobbo9bo$6b3o5b3o33boo41bo bboboobobbo53bo32b3obboo171bo4bo46bobboo5boobo3b4o$o6bobbobobbo79boob 3obo56bobo28bobobobo115bo13bo40booboobbo32b4o7b3obbooboobboobboobb4obb o$8bobobobo83b4o58boo28bo4boo171boo4bo32b4o7b3obbooboobboobboo$o8bobob o109b4o33boo28bobbooboo114bo13bo41bobobobo46bobboo5boobo9bo$7b4ob4o 107b4o32bobo28bo4bo171boobb3o50bobo4bobbo$o6bobbobobbo142bo31bobbooboo 114bo13bo45boo50bobo17bo$158bo31bo4boo226bobo$o189bobobobo115bo13bo97b o19bo$191b3obboo$o190boo119bo13bo117bo$$o311bo13bobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobo$$o158bo152bo$159bo$o159bobo24b4o121bo$ 161boo24b4o$o123b4o33boo149bo$124b4o32bobo$o158bo152bo$159bo$o216boo 93bo$215bob3o$o216boo4bo9boo77bo$130b3o69boo10b5oboo3boo6boo$o128b5o 36boo30boo11bo6bobobbo5boo77bo$127b3o3b3o34boo30boo11bo6bobobbo5boo$o 126bobb3obbo34boo30boo10b5oboo3boo85bo$126b3obbobb3o33boo45boo4bo$o 126boo5boo79bob3o92bo$126bo9bo80boo$o127booboboo177bo$126bob3ob3obo$o 126bobbobobbo176bo$$o311bo$$o120bobo188bo$120bo$o114bo4bo31bobobo155bo $116bobboo4bobo22b4o3bo$o112bobbobob3o4b3o20bobooboo155bo$114bobobboob o4bobbo18boo4boo$o82b4o27bobobboobo4bobbo17boobo4boo154bo$83b4o26bobbo bob3o4b3o18booboobbo$o115bobboo4bobo20boobo4boo110bobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobo$115bo4bo28boo4boo$o119bo29bobooboo111bo43bo195bo$121bobo 26b4o3bo$o151bobobo111bo43bo180bobbobobbo6bo$492bob3ob3obo$o121bobo 143bo43bo181booboboo7bo$121bo370bo9bo$o115bo4bo146bo43bo96bo83boo5boo 6bo$117bobboo4bobo281bo46boo33b3obbobb3o$o113bobbobob3o4b3o16b4o117bo 43bo96bo15boo30boo34bobb3obbo6bo$115bobobboobo4bobbo15b4o243boo11boobo 14boo30boo34b3o3b3o$o83b4o27bobobboobo4bobbo136bo43bo81boo11boobo14boo 30boo36b5o8bo$84b4o26bobbobob3o4b3o263boo13bo15boo69b3o$o116bobboo4bob o139bo43bo81boo14bo97bo$116bo4bo287bo77bo$o120bo146bo43bo173bobo19bo$ 122bobo42boo318bobo$o168bo23boo73bo43bo174bobo4bobbo10bo$162b4obbo24b oo289bobboo5boobo3b4o$o129boo30booboboboo22boo73bo43bo157b4o7b3obboob oobboobboobb4o3bo$88b7o35boo30booboboboo22boo243b4o28b4o7b3obbooboobb oobboo$o85boo7boo33boo30b4obbo99bo43bo125b4o42bobboo5boobo10bo$86b3o5b 3o33boo37bo317bobo4bobbo$o86bobbobobbo71boo99bo43bo174bobo18bo$88bobob obo391bobo$o88bobobo174bo43bo174bo20bo$87b4ob4o$o86bobbobobbo172bo43bo 123boo70bo$431boobb3o50bo$obobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobo3bobo3bobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobob obobobobobobobobobobobobobobobobobobobobobobobobobobobobo119bobobobo 48bobo18bo$432boo4bo49bobo$o231bo35bo162booboobbo49bobo4bobbo9bo$7bobb obobbo417bo4bo46bobboo5boobo3b4o$o6b4ob4o216bo35bo162booboobbo32b4o7b 3obbooboobboobboobb4obbo$9bobobo418boo4bo32b4o7b3obbooboobboobboo$o7bo bobobo217bo35bo163bobobobo46bobboo5boobo9bo$7bobbobobbo415boobb3o50bob o4bobbo$o5b3o5b3o33boo48b4o128bo35bo91boo74boo50bobo17bo$6boo7boo33boo 30boo10bobo4boobo255boo125bobo$o7b7o35boo30boo9bobobobboo3bo7boo117bo 35bo91boo126bo19bo$50boo30boo9bobobobboo3bo7boo245boo$o81boo10bobo4boo bo8boo117bo35bo239bo$13bo86b4o9boo$o17bo213bo35bo239bo$18b4o$o18b3o 210bo35bo239bo$16b4obboob3o$o3b4o7booboobo5boo203bo35bo239bo$4b4o6boob obbo7boo5b4o$o13boobobbo7boo5b4o28b4o161bo35bo239bo$15booboobo5boo38b 4o$o15b4obboob3o204bo35bo89b4o146bo$15bobob3o335boobboo$o17b4o210bo35b o88b6o145bo$18bo339bobbo$o231bo35bo239bo$72bobobo$o16bo52b4o3bo154bo 35bo239bo$17b4o49bobooboo$o13bobob3o48boo4boo155bo35bo239bo$15b4obboob 3o41boobo4boo339bo$obb4o7booboobo5boo40booboobbo156bo35bo148bo90bo$3b 4o6boobobbo7boo5b4o30boobo4boo339bo$o12boobobbo7boo5b4o31boo4boo155bo 35bo239bo$14booboobo5boo42bobooboo340bo$o14b4obboob3o43b4o3bo154bo35bo 148bo90bo$14bobob3o51bobobo340bo$o16b4o211bo35bo239bo$17bo341boo$o231b o35bo90boo147bo$359boo$o231bo35bo90boo147bo$47bobbobobbo$o45bob3ob3obo 175bo35bo239bo$48booboboo$o45bo9bo175bo35bo108bobbobobbo122bo$47boo5b oo82bo238b4ob4o$o45b3obbobb3o33boo45bobo92bo35bo51boo55bobobobobo122bo $47bobb3obbo34boo30boo14bobo179boo56bo5bo$o46b3o3b3o34boo30boo12boobo 13boo77bo35bo51boo54boo7boo5bobbo112bo$49b5o36boo30boo12boobo13boo165b oo54boo7boo5bobo$o49b3o69boo14bobo12boo77bo35bo108bobb3obbo7bo114bo$ 137bobo13boo222b9o8boo$o137bo93bo35bo50boo47b4o7b5o124bo$318bobbo46b4o $o231bo35bo49bobbo143boo41bo$318bobbo143boobo$o43b4o11boboo169bo35bo 48b6o107bobobo28bo3boboo37bo$44b4o9boobbobo11b4o238b6o106bo3b4o24b3obb obboo$o56boobbobo11b4o28b4o121bo35bo48b6o107booboobo22boobobboboboboo 35bo$59boboo44b4o206b6o107boo4boo21boboo3bobobobo$o231bo35bo48b6o106b oo4boboo20boboo3bobobobo27b4o4bo$318bobbo109bobbooboo20boobobboboboboo 27b4o$o231bo35bo49b4o107boo4boboo22b3obbobboo37bo$318b4o108boo4boo25bo 3boboo$o231bo35bo49b4o108booboobo28boobo39bo$111boo206boo108bo3b4o28b oo$o110b3obboo114bo35bo161bobobo73bo$110bobobobo$o109bo4boo115bo35bo 195boo42bo$110bobbooboo240boo104boobo$o42b4o11boboo48bo4bo116bo35bo89b oo102bo3boboo38bo$43b4o9boobbobo11b4o32bobbooboo240boo100b3obbobboo$o 55boobbobo11b4o32bo4boo115bo35bo89boo76b4o18boobobboboboboo36bo$58bob oo48bobobobo319b4o18boboo3bobobobo$o110b3obboo114bo35bo189boboo3bobobo bo27b4o5bo$111boo345boobobboboboboo27b4o$o231bo35bo191b3obbobboo38bo$ 106b3o210boo84bo56bo3boboo$o105boo124bo35bo50boo83bo59boobo40bo$106bo 212boo82b3obo56boo$o231bo35bo50boo39boo30boo10bobbo100bo$87bobbobobbo 264b3o29boo10bobo10boo4boo$o86b4ob4o128b4o4bo35bo91boboo28boo10b3o9b3o 4boo30boo51bo$89bobobo130boobo133b3o28boo10b3o9b3o4boo30boo35b7o$o87bo bobobo131boo4bo35bo68booboboboo21b4o33bobo10boo4boo30boo33boo7boo7bo$ 87bobbobobbo71bo58boo110b3ob3o22b4o10b4o19bobbo47boo33b3o5b3o$o85b3o5b 3o33boo35bo6bo57bo35bo11boo57bobobo37b4o18b3obo83bobbobobbo8bo$86boo7b oo33boo33bobo6boobo102boo57bo3bo60bo87bobobobo$o87b7o35boo32boo7boobb oo14boo37bo35bo11boo55bo7bo59bo87bobobo10bo$130boo32boo7boobboo14boo 85boo55b4ob4o145b4ob4o$o164bobo6boobo15boo37bo35bo68boo5boo145bobbobo bbo8bo$167bo6bo18boo142b9o$o99bobo64bo64bo35bo59b4o7b5o164bo$98bob4o 224b4o7b5o$o96bob3obo128bo35bo72bo166bo$93boobbooboboobo261b4o$o83b4o 5bobbobb3obboo126bo35bo10boo100b4o123bo$84b4o4b3ob6obboo9b4o159b4o$o 91b3ob6obboo9b4o28b4o81bo35bo98b4o137bo$93bobbobb3obboo41b4o125b3obb3o 80b10o7b4o$o92boobbooboboobo126bo35bo7b8o79bobo6bobo3b10o120bo$97bob3o bo173b6o81b3o4b3o3bobo6bobo$o97bob4o128bo35bo9b4o81booboobbooboo3b3o4b 3o120bo$100bobo173b3obb3o82bo4bo5booboobbooboo$o231bo35bo7b8o84boo10bo 4bo122bo$152bobobo119bob4obo98boo$o98bobo48b4o3bo74bo35bo9b4o70bo3b4o 148bo$97bob4o47bobooboo195boo3b3o7b4o$o95bob3obo36boo8boo4boo75bo35bo 84b3obob3o5b4o10b4o123bo$92boobbooboboobo34boo7boobo4boo160boo32boo3bo b3o4boobboo9b4o$o82b4o5bobbobb3obboo32boobo7booboobbo76bo35bo49boo34bo 4b4o5boo10boobboo122bo$83b4o4b3ob6obboo9b4o19b4o7boobo4boo160boo32boo 3bob3o20boo$o90b3ob6obboo9b4o31boo4boo75bo35bo49boo33b3obob3o146bo$92b obbobb3obboo45bobooboo195boo3b3o$o91boobbooboboobo45b4o3bo74bo35bo83bo 3b4o148bo$96bob3obo49bobobo209b4o$o96bob4o129bo35bo97b4o10b4o124bo$99b obo177boo99b4o$o231bo35bo10boo227bo$279boo$o231bo35bo10boo227bo$$o219b oo10bo35bo239bo$220boo$o219boo10bo35bo28bobbobobbo202bo$220boo75b4ob4o 21b4o$o231bo35bo28bobobobobo19bob4obo8b4o163bo$298bo5bo20bobobbobo6bob 4obo$o127boo102bo35bo27boo7boo18b3obb3o6bobobbobo161bo$128boo166boo7b oo19b6o7b3obb3o$o127boo71bo30bo35bo28bobb3obbo21b4o9b6o162bo$128boo71b oo94b9o35b4o$o200b3o28bo35bo19b4o7b5o204bo$288b4o$o126boo103bo35bo239b o$125b6o$o125b4o102bo35bo239bo$126bobbo$o123bobobbobo100bo35bo239bo$ 124b3obb3o89boo119bo$o122b4obb4o86boboobo7bo35bo72bobo164bo$124b3obb3o 87boobboo119bo$o123bobobbobo87boboobo7bo35bo71boboo164bo$170bo50boo 117bo$o124b6o38bobo49boo9bo35bo239bo$125b6o36booboo144boo$o125bobbo37b obboo60bo35bo43b3ob4o188bo$126bobbo39bobo141bobo3bo$o126boo41bo61bo35b o44boo4boo187bo$278boo32boo4b3o$o220boo9bo35bo9boo34bo3b3o187bo$220b4o 54boo32boo4b3o$o231bo35bo9boo33boo4boo187bo$220b4o89bobo3bo$o231bo35bo 43b3ob4o188bo$316boo8b4o$o231bo35bo19boo36b4o10b4o164bo$288boo12boo36b 4o$o231bo35bo33boo204bo$127boo158b4o$o126boo67bobbobobbo27bo35bo17bob oobo9b4o203bo$127boo67b4ob4o82b4o9boboobo$o126boo67bobobobobo27bo35bo 16bob4obo8b4o203bo$197bo5bo83b4o8bob4obo$o194boo7boo26bo35bo18b4o10b4o 203bo$195boo7boo82boo11b4o$o144bobbobobbo42bobb3obbo27bo35bo33boo204bo $145b4ob4o42b9o$o144bobobobobo44b5o7b4o18bo35bo239bo$146bo5bo57b4o$o 143boo7boo77bo35bo239bo$144boo7boo$o144bobb3obbo78bo35bo239bo$145b9o$o 135b4o7b5o80bo35bo239bo$136b4o$o231bo35bo239bo$$o231bo35bo239bo$$o231b o35bo239bo$$o231bo35bo239bo$$o231bo35bo239bo$222boo$o221boo8bo35bo3bo 3b4o228bo$222boo48boo3b3o$o221boo8bo35bo4b3obob3o226bo$272boo3bob3o$o 231bo35bo5bo4b4o225bo$126boo144boo3bob3o$o125boo104bo35bo4b3obob3o226b o$126boo144boo3b3o$o125boo104bo35bo3bo3b4o228bo$286b4o$o231bo35bo17b4o 10b4o204bo$300b4o$o231bo35bo239bo$$o210b4o17bo35bobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobo$197b4o10b4o$o196b4o31bo$$o231bo$$o134bobbo93bo$136boo11bobb o$o133bo4bo10boo80bo$134b6o8bo4bo$o132bobobbobo7b6o58boo18bo$133boo4b oo6bobobbobo43boo12boo$o132bob4obo6boo4boo43boo10bo4bo16bo$136boo9bob 4obo41bo4bo7boo4boo$o149boo43boo4boo5bobbobbobbo14bo$194bobbobbobbo3bo 10bo$o192bo10bo4boobooboo15bo$195boobooboo5boobboobboo$o193boobboobboo 4boboboobobo14bo$194boboboobobo5boo4boo$o194boo4boo6bo6bo15bo$150boo 43bo6bo7boobboo$o148bo46boobboo20b4o3bobbo$149bobbo57boboobo6b3o3boo$o 147boo46boboobo9b4o5b3obob3o3bo$150bo46b4o9bo4bo4b3obo3boo$o195bo4bo 10boo5b4o4bo4bo$198boo20b3obo3boo$o119bo3b4o92b3obob3o3bo$120boo3b3o 94b3o3boo$o120b3obob3o92b4o3bobbo$120boo3bob3o82b4o$o121bo4b4o67b4o10b 4o16bo$120boo3bob3o68b4o$o120b3obob3o102bo$120boo3b3o$o119bo3b4o104bo$ 134b4o$o133b4o10b4o80bo$148b4o$o231bo$$obobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo bobobobobobobobobobobobobobobobobobobobobobobobobobobobobobobo! golly-2.5-src/Patterns/Life-Like/Morley/growing-ship.rle0000644000175100001440000000552412156145314020152 00000000000000#C A growing ship. #C By Stephen Morley -- http://www.safalra.com/special/b368s245/ x = 196, y = 247, rule = B368/S245 66boo60boo$25b4o36b4o58b4o36b4o$26boo38bobbo56bobbo38boo$24boobo38bo3b o54bo3bo38boboo$16boo5boo44bo5b4o38b4o5bo44boo5boo$15b4o5bo43bo7boo40b oo7bo43bo5b4o$7boo7bobbo3bobbo39bob3o3boobo6b4o3boo10boo3b4o6boboo3b3o bo39bobbo3bobbo7boo$4obb4o6bo3bo3bobboo36boobo4boo10boo3b4o8b4o3boo10b oo4boboo36boobbo3bo3bo6b4obb4o$boobbobbo10bo6boo38boo6bo10bobobobbo10b obbobobo10bo6boo38boo6bo10bobbobboo$bobo4bo4boo3bo5boboobo34boobboo3bo bbob4obboo6bo10bo6boobb4obobbo3boobboo34boboobo5bo3boo4bo4bobo$9boboo bboob3o3b6o35b4o5bo3bobbobobo24bobobobbo3bo5b4o35b6o3b3oboobboobo$7bo 3boobboobo6bobbo28boo5bo4bo3boo10bo24bo10boo3bo4bo5boo28bobbo6boboobb oo3bo$9bo8bobo13b4o11boo5b4o6boo7bo44bo7boo6b4o5boo11b4o13bobo8bo$18bo 7boo7boo5b4obb4o5bobbo4b4o6bo44bo6b4o4bobbo5b4obb4o5boo7boo7bo$17b3o5b 4o4boobo6boo4bobbo3bo4bo13bo44bo13bo4bo3bobbo4boo6boboo4b4o5b3o$17bobo 6boo3boobobbo3boobo4bo3bobbobob3o10bo3bo40bo3bo10b3obobobbo3bo4boboo3b obboboo3boo6bobo$16bo3bo5boo4boo4boboo10bobbob3obo3b4o3bobbobbo38bobbo bbo3b4o3bob3obobbo10boobo4boo4boo5bo3bo$15booboboo4boo3bo3booboboboo6b oobobobo7b4o3boo3boo38boo3boo3b4o7boboboboo6booboboboo3bo3boo4booboboo $15boo3boo4boo5boobobbobobo6bo8bo5b4o4bo3bo40bo3bo4b4o5bo8bo6bobobobbo boo5boo4boo3boo$17b3o6boo9bobobo9bo3bo9b4o5b3o42b3o5b4o9bo3bo9bobobo9b oo6b3o$17b3o5bobbo37boo7bo44bo7boo37bobbo5b3o$25b4o36bobbo6bo44bo6bobb o36b4o$66boo60boo7$25boo142boo$25boo39b3o58b3o39boo$23boobo39boobo56bo boo39boboo$23b4o40b3o56b3o40b4o$68boo56boo9$28bo35boo64boo35bo$28boo 34boo64boo34boo$26b4o34boboo60boobo34b4o$27boo35b4o60b4o35boo10$62bo 70bo$30b3o28boo70boo28b3o$30boo29b4o66b4o29boo$30bo31boo68boo31bo10$ 34bo126bo$35bo22b3o74b3o22bo$32bobo24boo74boo24bobo$33bo26bo74bo26bo 10$37boo17bo82bo17boo$36bo18bo84bo18bo$35bobo18bobo78bobo18bobo$35bobb o18bo80bo18bobbo9$40bo114bo$40bo11boo88boo11bo$41bo12bo86bo12bo$37boob oo11bobo84bobo11booboo$39boo11bobbo84bobbo11boo9$50bo94bo$42b3o5bo94bo 5b3o$41boboo4bo96bo4boobo$41b3o5booboo88booboo5b3o$41boo7boo92boo7boo 9$46boo100boo$45bobbo98bobbo$46boo100boo7$49bobbo$49bobo96boo$50bo96bo bbo$51boo95boo4$60b4o$60boboo$60boo$60boo$46boo100boo$45bobbo98bobbo$ 46boo28b4o68boo$76boboo$76boo$76boo3$92b4o$92boboo$46boo44boo54boo$45b obbo43boo53bobbo$46boo100boo$$108b4o$108boboo$108boo$108boo3$46boo76b 4o20boo$45bobbo75boboo19bobbo$46boo76boo22boo$124boo3$140b4o$140boboo$ 140boo$140boo$46boo$45bobbo$46boo89bo$136bobo$139bo$138bo3$121bo$120bo bo$46boo75bo$45bobbo73bo$46boo$$105bo$104bobo$107bo$106bo3$46boo41bo$ 45bobbo39bobo$46boo43bo$90bo3$73bo$72bobo$75bo$74bo$46boo$45bobbo$46b oo9bo$56bobo$59bo$58bo3$54boo$53b3o$52boobo$52b3o3$70boo$69b3o$68boobo $68b3o3$86boo$85b3o$84boobo$84b3o3$102boo$101b3o$100boobo$100b3o3$118b oo$117b3o$116boobo$116b3o3$134boo$133b3o$132boobo12boo$132b3o12bobbo$ 148boo3$144bo$144boo$144b3o! golly-2.5-src/Patterns/Life-Like/alt-wicks.py0000644000175100001440000000322012156145314016021 00000000000000# Based on alt_wicks.py from PLife (http://plife.sourceforge.net/). from glife import * rule ("B3/S135") head_a_c3 = pattern (""" 23bo6bo$5bo3b2o2bobobo4b2o2b6ob2obobo$3b2o2bo6bobobo3bob3o2b2obo2b obobo$2b2o4bobo2bo2bobobob3o4bo$4bo2bo2bo2b3obo11bo$2obo8b3ob2o2b o2b2obo$4bo2bo2bo2b3obo11bo$2b2o4bobo2bo2bobobob3o4bo$3b2o2bo6bo bobo3bob3o2b2obo2bobobo$5bo3b2o2bobobo4b2o2b6ob2obobo$23bo6bo! """, -5, 39, rccw) tail_a_c5 = pattern (""" 5bobo$6bo$4bo3bo$5bobo$4bo3bo$o11bo$3bo5bo$2obo5bob2o$bo9bo2$2bo7b o$3bo5bo$2bo7bo!""", -6, 0) head_b_c5 = pattern (""" 2bobo3bobo$bo3bobo3bo$2bobo3bobo$b2ob2ob2ob2o$2b3o3b3o$2b3o3b3o$3b 2o3b2o$2b4ob4o$bo9bo$4bo3bo$5bobo$2obo5bob2o$2o2bo3bo2b2o$bobo5b obo$2b2obobob2o2$6bo$2bobo3bobo$2b2o2bo2b2o$3b2o3b2o!""", -6, 0) converter_bc_c5 = pattern (""" 6bobo$6bobo2$4b3ob3o$4bo5bo$4b2o3b2o$4bobobobo$3bo2bobo2bo$5bo3bo $4bobobobo$bo3b2ob2o3bo$2bo3bobo3bo$b2o3bobo3b2o$3bob2ob2obo$2b2o 7b2o2$4bo5bo$4bo5bo$ob2obo3bob2obo$o13bo2$3b2o5b2o$5bo3bo2$4b3ob 3o$2b5ob5o3$2bo3bobo3bo$3bobo3bobo$2bo3bobo3bo!""", -7, 0) tail_c_c5 = pattern (""" 2bo9bo$bobobo3bobobo$4b3ob3o$6bobo$3b2ob3ob2o$3bo2bobo2bo$3bobo3b obo$2bo2b5o2bo$bo2b7o2bo$bo3bobobo3bo$6obob6o$2o11b2o$2b3obobob3o $b2obobobobob2o$5bo3bo$4b3ob3o$3b3o3b3o$5bo3bo$5b2ob2o$obobo5bob obo$bobo3bo3bobo$bo2bo5bo2bo$5bo3bo$6bobo$5bo3bo!""", -7, 0) A = head_a_c3 + tail_a_c5 (0, -13) B = (head_b_c5[84] + converter_bc_c5 (0, -31)) [100] + tail_c_c5 (0, -56) ### (A (-25, 0) + B (24, 0)).save ("alt_wicks.lif", ### """Wickstretching in B3/S135 rule. ### Growing ship with c/3 head and c/5 tail. ### Extensible ship with two types of wicks inside.""") (A (-25, 0) + B (24, 0)).display("alt-wicks") golly-2.5-src/Patterns/Life-Like/coral.rle0000644000175100001440000000053412156145314015362 00000000000000#C "Coral": this rule produces patterns with a surprisingly slow #C rate of expansion and an interesting coral-like texture. #C From MCell 4.20 by Mirek Wojtowicz-- rule author unknown. x = 17, y = 17, rule = B3/S45678 bb13o$b15o$bo13boo$oo13boo$oo13boo$oo13boo$oo13boo$oo13boo$oo13boo$oo 13boo$oo13boo$oo13boo$oo13boo$oo13boo$oo13boo$b15o$3b11o! golly-2.5-src/Patterns/Life-Like/Day-and-Night-gun-and-antigun.rle0000644000175100001440000001044612156145314021603 00000000000000#C This is a period 256 rocket gun which demonstrates the symmetry of #C the Day/Night rules, and how a signal can be sent across the border #C between day and night regions. Here a period 256 anti-gun destroys #C every other rocket from a normal period 128 rocket gun. Based on a #C reaction by Dean Hickerson. David I. Bell, May 1997 x = 240, y = 224, rule = B3678/S34678 7boo25boo$7boo25boo$6b4o23b4o$6b3obo21bob3o$5b4obo21bob4o$5b5o23b5o$4b 6o23b6o$4b5obo21bob5o$3b6obo21bob6o$3b7o23b7o$bb8o23b8o$bb7obo21bob7o$ b9o23b9o$b9o23b9o$bb8o23b8o$bb8o23b8o$3b7o23b7o$3b7o23b7o$b8obo21bob8o $b8obo21bob8o$10o23b10o$b3obobobobobobo11bobobobobobob4o$b3obobobobobo bo11bobobobobobob3o28bobbo$bb8o23b9o26b8o$bb7obo21bob10o24b8o$4b5obo 21bob12o20b12o$4b5obo21bob12o20b12o$6b3obo21bob14o16b5o6b5o$6b4o23b15o 16b16o$7boo25b16o16b3o6b3o$7boo12bo11b17o19b6o$20b3o10boobbo4bo4bo$19b 5o14b4ob4o22b6o$18bob3obo$20b3o$18b7o$20b3o32bobo$21bo119booboo$13bobo 4b3o4bobo31b3ob3o54bo11bo6b6o$12bobbo3b5o3bobbo29boob4o54boboboo5b5o3b ob4obo$11b6ob7ob6o28bob7obo50b8o3b7obb8o$10b23o25boob9o52b28o$11b6ob7o b6o26boboob5o53b8o3b7obb8o$12bobbo3b5o3bobbo28bob7o53boboboo5b5o3bob4o bo$13bobo4b3o4bobo28b3ob5o55bo11bo6b6o$21bo36boob5obo73booboo$20b3o36b oobboobobo$18b7o37b3o$20b3o$18bob3obo$19b5o14b4ob4o137bobbobbobboo$20b 3o10boobbo4bo4bo134b15o$7boo12bo11b17o132b17o$7boo25b16o131b20o$6b4o 23b15o134b21o9boo$6b3obo21bob14o134b23o7boo$4b5obo21bob12o135b26o4b4o$ 4b5obo21bob12o136b27obboboo$bb7obo21bob10o138b29o$bb8o23b9o139b22obb6o b5o$b3obobobobobobo11bobobobobobob3o140b21o4boobobooboo$b3obobobobobob o11bobobobobobob4o139b22o7bo$10o23b10o138b23o3booboo$b8obo21bob8o140b 23obboobo$b8obo21bob8o140b22o6boo$3b7o23b7o141b23o6boo$3b7o23b7o142b 24o$bb8o23b8o141b26o$bb8o23b8o140b29o$b9o23b9o140b30o$b9o23b9o140b32o$ bb7obo21bob7o140b35o$bb8o23b8o141b36o$3b7o23b7o142b36o$3b6obo21bob6o 141b38o$4b5obo21bob5o143b36o$4b6o23b6o143b36o$5b5o23b5o143b27obb9o$5b 4obo21bob4o144b26obb8o$6b3obo21bob3o145b25o4b7o$6b4o23b4o144b25obo3b8o $7boo25boo146b24obo5b5o$7boo25boo146b24obo7b3o$181b25obo7b4o$182b24obo 6b4o$182b24obo6b4o$181b25obo5b6o$182b24obo5b5o$182b24obo3b7o$181b26o4b 8o$182b26obb8o$182b26obb8o$181b38o$182b36o$182b36o$181b38o$182b36o$ 182b36o$181b38o$182b36o$182b36o$181b38o$182b36o$182b36o$181b38o$182b 36o$182b36o$181b38o$182b36o$182b36o$181b38o$182b36o$182b36o$181b38o$ 182b36o$182b36o$181b38o$182b36o$182b36o$181b38o$182b36o$182b36o$181b 38o$182b36o$182b36o$181b38o$182b36o$182b36o$181b38o$182b36o$182b36o$ 181b38o$182b36o$182b36o$181b38o$182b36o$182b36o$181b38o$182b36o$182b 36o$181b38o$182b10obbobb21o$182b9obo3bob20o$181b11o5b22o$182b9o7b20o$ 182b8obo5bob19o$181b10o7b21o$182b8o9b19o$182b8o9b19o$181b11ob3ob22o$ 182b36o$182b36o$181b38o$182b36o$152bobbobbobbobbobbobbobbobbobbobb36o bbobbobbobbobbobboo$150b89o$150b89o$149b91o$150b44ob44o$150b43o3b43o$ 149b33obb8o5b8obb33o$150b32obb7o7b7obb32o$150b30o5b5o9b5o5b30o$149b31o 4bob6o5b6obo4b31o$150b28o6bob4obo5bob4obo6b28o$150b28o7b5obo5bob5o7b 28o$149b28o4bobobob3o9b3obobobo4b28o$150b23obboo4bobobob4o7b4obobobo4b oobb23o$150b15obb4o10boboboboobo7boboobobobo10b4obb15o$149b14o6boo14b 8obob8o14boo6b14o$150b11o23bob4obbooboobb4obo23b11o$150b9o25bob17obo 25b9o$149b8o28b6o7b6o28b8o$150b5o29b9o3b9o29b5o$150b3o31b6obo5bob6o31b 3o$149b4o32b8o3b8o32b4o$150b5ob6ob4obb10o3bobb5obbo3bobb5obbo3b10obb4o b6ob5o$150b6o6bo4boo10b12o7b12o10boo4bo6b6o$149b42o7b42o$150b89o$150b 43obob43o$149b31ob27ob31o$150b28obbob25obobb28o$150b27obbobb25obbobb 27o$149b22ob9ob25ob9ob22o$150b18obb11obb11ob11obb11obb18o$150b18obobbo b9obb7o5b7obb9obobbob18o$149b19o5b7o5bob5o5b5obo5b7o5b19o$150b20ob10o 3bob5o7b5obo3b10ob20o$150b18o5b7o5bob5o5b5obo5b7o5b18o$149b19obobbob9o bb7o5b7obb9obobbob19o$150b18obb11obb11ob11obb11obb18o$150b21ob9ob25ob 9ob21o$149b28obbobb25obbobb28o$150b28obbob25obobb28o$150b30ob27ob30o$ 149b44obob44o$150b89o$150b41o7b41o$149b7o6bo4boo10b12o7b12o10boo4bo6b 7o$150b5ob6ob4obb10o3b8obbo3bobb8o3b10obb4ob6ob5o$150b3o31b9o3b9o31b3o $149b4o31b6obo5bob6o31b4o$150b5o27b11o3b11o27b5o$150b7o23b11obbobobb 11o23b7o$149b10o21b14ob14o21b10o$150b11o17b15o3b15o17b11o$150b13o6boo 7b33o7boo6b13o$149b16obb4o5b37o5b4obb16o$150b23ob41ob23o$150b43o3b43o$ 149b91o$150b41o7b41o$150b41o7b41o$149b45ob45o$150b42o5b42o$150b44ob44o $149b44o3b44o$150b44ob44o$150b89o$149b91o$150b89o$150b89o$152bobbobbo bbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbobbo bbobbobbo! golly-2.5-src/Patterns/Life-Like/ice-nine.rle0000644000175100001440000000040412156145314015745 00000000000000#CXRLE Pos=-2,-9 #C #C A 3-cell pattern runs chaotically, with average density about 25%, #C until about gen 435175. Then an iceball forms, which slowly grows, #C filling the torus completely in gen 435374. #C x = 3, y = 2, rule = B25678/S5678:T20,20 2o$2bo! golly-2.5-src/Patterns/Life-Like/p168-knightship.rle0000644000175100001440000000014612156145314017125 00000000000000#C p168 knightship found by David Eppstein x = 7, y = 4, rule = B013568/S01 bo4bo$b2ob3o$2o3bo$2bobo! golly-2.5-src/Patterns/Life-Like/persian-rugs.lif0000644000175100001440000000010412156145314016662 00000000000000#Life 1.05 #R B234 #D The easy way to create Persian rugs. #P ** ** golly-2.5-src/Patterns/Life-Like/replicator.rle0000644000175100001440000000022712156145314016425 00000000000000#C All patterns in this rule replicate. x = 13, y = 6, rule = B1357/S1357 b2o3bo2bo2bo$o2bo2bobo3bo$o2bo2b2o4bo$o2bo2bobo3bo$o2bo2bo2bo$b2o3bo2b o2bo! golly-2.5-src/Patterns/Life-Like/spiral-growth.rle0000644000175100001440000000123312156145314017061 00000000000000#C Spiral growth with 1, 2, 3, 4, 5, 6, 8, and 12 plows; for details, #C see http://www.radicaleye.com/DRH/B34568S15678.html . #C The spirals crash in generation 2005 and eventually stabilize #C into a large irregular p2 octagon. Dean Hickerson, 2 June 2006. x = 217, y = 240, rule = B34568/S15678 213bobo$213bo2bo$211bo2bo$212bobo2$129bo$128bo2bo$131bo$129b3o$128bo3b o5$56bo2b2o$57bobo$57b3o$60bo7$2bobo$obobo$2o$b2o70$28b6o$28b4o$28bo3b 2o$28bo2bo$30b2obo100b4o$137b3o$134b2o2b2o$134b3o$136b4o104$15b2obo2b 2o$15b2obob3o$16b2o2bo$21b2o$15b2o$17bo2b2o$15b3obob2o$15b2o2bob2o16$ 156b4obobo$159bo3bo$156bo3bo2bo$158bo3b2o$156b2o3bo$156bo2bo3bo$156bo 3bo$156bobob4o! golly-2.5-src/Patterns/Life-Like/white-whale.rle0000644000175100001440000000053412156145314016500 00000000000000#C White Whale - an oscillator with a very long period (160,000,346). #D Discovered by Andrew Trevorrow. x = 19, y = 29, rule = B345/S5 8b2o2$6b6o2$4b7ob2o2$2b14o$2o15bo$2bo7b5obo$2o15b2o$2b2o3b5o2b3o$2o15b 2o$2bob7o3b3o$2o15b2o$2b13obo$2o15b2o$2b4o2b3ob5o$2o15b2o$2b5ob4o4bo$ 2o15b2o$2b6o2b2o3b2o$2o15bo$2bo2b4o2b5o$2o$2b2ob5o2b2o2$4b2ob5o2$6b4o! golly-2.5-src/Patterns/Loops/0000755000175100001440000000000012156146015013166 500000000000000golly-2.5-src/Patterns/Loops/Byl-Loop.rle0000644000175100001440000000102012156145314015241 00000000000000# Byl Loop # # J. Byl. "Self-Reproduction in small cellular automata." # Physica D, Vol. 34, pages 295-299, 1989. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 4, y = 4, rule = Byl-Loop .2B$BCAB$BCDB$.BE! golly-2.5-src/Patterns/Loops/Chou-Reggia-Loop-1.rle0000644000175100001440000000113512156145314016752 00000000000000# Chou-Reggia Loop 1 # # J. A. Reggia, S.L.Armentrout, H.-H. Chou, and Y. Peng. # ``Simple systems that exhibit self-directed replication.'' # Science, Vol. 259, pages 1282-1287, February 1993. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 4, y = 2, rule = Chou-Reggia-1 2A$CD2A! golly-2.5-src/Patterns/Loops/Chou-Reggia-Loop-2.rle0000644000175100001440000000113412156145314016752 00000000000000# Chou-Reggia Loop 2 # # J. A. Reggia, S.L.Armentrout, H.-H. Chou, and Y. Peng. # ``Simple systems that exhibit self-directed replication.'' # Science, Vol. 259, pages 1282-1287, February 1993. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 3, y = 2, rule = Chou-Reggia-2 2A$CDA! golly-2.5-src/Patterns/Loops/Evoloop-finite.rle0000644000175100001440000000635712156145314016525 00000000000000# A modification of Evoloop created to make it work within a finite # area. Extend or restrict the area of state 9 cells to change the # range of action. # # In a finite area the evolving properties are more easily seen since # only the most successful loops can survive the overcrowding. Smaller # loops rapidly outcompete the larger ones. # x = 628, y = 533, rule = Evoloop-finite 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $261I15B352I$260IBGIAGIAGIAGI4AB351I$260IBA13BAB351I$260IBIB11IBAB 351I$260IBGB11IBAB351I$260IBAB11IBAB351I$260IBIB11IBAB351I$260IBGB11I BAB351I$260IBAB11IBAB351I$260IBIB11IBAB351I$260IBGB11IBGB351I$260IBAB 11IBIB351I$260IBIB11IBAB351I$260IBGB11IBGB351I$260IBA13BIB351I$260IBI GAIGAIGAIDAIDAB351I$261I14BE352I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I $628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$628I$ 628I$628I$628I$628I$628I$628I$628I$628I$628I! golly-2.5-src/Patterns/Loops/Evoloop.rle0000644000175100001440000000151712156145314015242 00000000000000# Evoloop # # Hiroki Sayama "Toward the Realization of an Evolving Ecosystem on # Cellular Automata", Proceedings of the Fourth International # Symposium on Artificial Life and Robotics (AROB 4th '99), # M. Sugisaka and H. Tanaka, eds., pp.254-257, Beppu, Oita, Japan, 1999. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), SDSR (1998), # Tempesti (1999), Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 17, y = 17, rule = Evoloop .15B$BG.AG.AG.AG.4AB$BA13BAB$B.B11.BAB$BGB11.BAB$BAB11.BAB$B.B11.BAB$ BGB11.BAB$BAB11.BAB$B.B11.BAB$BGB11.BGB$BAB11.B.B$B.B11.BAB$BGB11.BGB $BA13B.B$B.GA.GA.GA.DA.DAB$.14BE! golly-2.5-src/Patterns/Loops/Langtons-Loops.rle0000644000175100001440000000114112156145314016467 00000000000000# Langton's Loops # # C.G.Langton. "Self-reproduction in cellular automata." # Physica D, Vol. 10, pages 135-144, 1984. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 15, y = 10, rule = Langtons-Loops .8B$BAG.AD.ADB$B.6B.B$BGB4.BAB$BAB4.BAB$B.B4.BAB$BGB4.BAB$BA6BA5B$B.G A.GA.G5AB$.13B! golly-2.5-src/Patterns/Loops/Perrier-Loop.rle0000644000175100001440000000353112156145314016134 00000000000000#CXRLE Pos=0,0 # Perrier loop # # J.-Y. Perrier, M. Sipper, and J. Zahnd # "Toward a viable, self-reproducing universal computer" # Physica D, vol. 97, pp. 335-352, 1996 # # After replicating the loop and the program and data stacks, Perrier's loop # then executes its program, sending commands and data along the sheath between # the two stacks. # # Here are the important states: # # state in the paper description # ----- ------------ --------------------------- # 14 7 advance (used inside the loop) # 15 4 turn left (used inside the loop) # 3 A the start of the program # 4 P program instruction: print 0 # 5 P program instruction: print 1 # 6 P program instruction: move data head down # 7 P program instruction: move data head up # 8 P program instruction: if (see paper for details) # 9 P,J program instruction: jump (sign 0) # 10 P,J program instruction: jump (sign 1) # 11,12 D 0,1 data (initial sequence in this example: 1001000) # # Thanks to Gianluca Tempesti for the transition table and the pattern. # # The program in this example is just a demo of some of the commands. Firstly it # does: move down, print 1, move down, print 1, move down. Then it checks the # value of the data tape at the current point. If 1 then it repeats from the # start. If false it moves the data head up 8 places. The last two of these # require the tape to be extended, shuffling all the entries down in turn. # x = 15, y = 31, rule = Perrier .8B$BAN.AO.AOB$B.6B.B$BNB4.BAB$BAB4.BAB$B.B4.BAB$BNB4.BAB$BA6BA5B$B.N A.NA.N5AB$BC12B$BFB4.BLB$BEB4.BKB$BFB4.BKB$BEB4.BLB$BFB4.BKB$BHB4.BKB $BIB4.BKB$BJB5.B$BJB$BJB$BJB$BJB$BGB$BGB$BGB$BGB$BGB$BGB$BGB$BGB$.B! golly-2.5-src/Patterns/Loops/Perrier-Parenthesis-Checker.rle0000644000175100001440000001207512156145314021055 00000000000000#CXRLE Pos=-11,-2 # # Parenthesis Checker - in Perrier's self-reproducing loop # # See Perrier-Loop.rle for a simpler example, and for an explanation # of the states used in the program. # # This is an implementation of the 64 instruction program listed in # the appendix of Perrier's paper. The numbers on the left # correspond to the program instructions in the paper. The program # checks that a string has matching parentheses. In this example # the string "(()())" is encoded in the data tape. After many # timesteps the program halts (the program head drops off the end) # and the value under the data head is '1', indicating that the # expression is well-formed, and the parentheses do indeed match. # # (Here we've disabled the self-reproduction part of the loop's # function simply to avoid distracting us from the computation part. # To re-enable, set (19,6) to state 1, (10,8) to state 2, and # (14,8) to state 0.) # # The data tape is encoded with '(' = 10 and ')'=11. The rest of the # tape should contain zeros. (In Perrier's loop, the tape can be # expanded as required, and contains zeros by default, so here we # don't have to worry about the trailing zeros for example but you # can put them in if you want.) # # In our example, "(()())" = 101011101111 # # Caveat: the data head must be positioned just before (above) the # first parenthesis, else the result may be incorrect. In Perrier's # loop, the data head always starts at the top of the tape provided, # so our tape contains an initial '0': 0101011101111 # # There's a slight error in the paper, where it says that the final # result will be written in the uppermost data slot. This is not # always the case. The final position of the data head indicates # where the final result is stored. # # Enter your own sequence of brackets for checking. # # Contact: tim.hutton@gmail.com # x = 34, y = 376, rule = Perrier 20.8B$19.BAN.AO.AOB$19.B.6B.B$19.BNB4.BAB$19.BAB4.BAB$19.B.B4.BAB$19. BNB4.BAB$19.BA6BA5B$6.B12.B.NA.NA.N2AB2AB$5.B.B11.BC12B$5.B.B4.3B4.BD pA3.pABKB$5.B.B11.BFB4.BLB$6.B12.BHB4.BKB$19.BJB4.BLB$19.BJB4.BKB$19. BJB4.BLB$19.BJB4.BLB$19.BJB4.BLB$19.BJB4.BKB$19.BJB4.BLB$5.2B12.BJB4. BLB$7.B11.BJB4.BLB$6.B5.3B4.BFB4.BLB$7.B11.BHB5.B$5.2B12.BIB$19.BJB$ 5.3B11.BJB$5.B13.BJB$6.B5.3B4.BGB$7.B11.BGB$5.2B12.BGB$19.BGB$19.BHB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.B JB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19. BJB$19.BEB$19.BHB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$2.B2.2B12.B JB$.2B4.B11.BJB$2.B3.B5.3B4.BFB$2.B2.B13.BHB$2.B2.3B11.BJB$19.BJB$12. 3B4.BEB$19.BHB$19.BIB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$.B2.2B13.BJB$2B.B15.BJB$. B.3B6.3B4.BGB$.B.B.B13.BDB$.B.3B13.BGB$19.BGB$19.BGB$19.BHB$19.BJB$2B 2.2B13.BJB$2.B3.B12.BEB$.B3.B6.3B4.BDB$B5.B12.BFB$3B.2B13.BHB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BFB$19.BHB$2B4.2B11.BJB$2.B2.B2.B10.BJB$.B4.2B5.3B3.BEB$B4.B2.B 10.BHB$3B3.2B11.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$2.2B3.B11.BJB$4.B.B.B10.BJB$3.B2.B.B4.3B3.BGB$ 4.B.B.B10.BGB$2.2B3.B11.BGB$19.BGB$19.BHB$19.BIB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BEB$19.BHB$19.BI B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.B JB$19.BJB$3.2B3.3B8.BJB$5.B4.B8.BJB$4.B4.B3.3B3.BFB$5.B2.B10.BHB$3.2B 3.B10.BJB$19.BJB$19.BJB$3.2B4.2B8.BJB$5.B2.B.B8.BJB$4.B3.3B2.3B3.BGB$ 5.B4.B8.BDB$3.2B5.B8.BFB$19.BEB$19.BHB$19.BIB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.B JB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$6.B4.B7.BJB$4.B.B 2.B.B7.BJB$4.3B2.3B2.3B2.BGB$6.B4.B7.BGB$6.B4.B7.BGB$19.BGB$19.BHB$ 19.BIB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$19.BJB$19.BJB$5.B3.2B8.BJB$3.B.B2.B.B8.BJB$3.3B2.3B3.3B2.BDB $5.B4.B8.BFB$5.B4.B8.BHB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$3.3B.2B10.BJB$3.B5.B9.BJB$3.2B3.B4.4B2.BFB$5.B.B 11.BHB$3.2B2.3B9.BJB$19.BJB$13.4B2.BEB$19.BHB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$3.3B3.2B8.BJB$3.B4.B10.BJB$3.2B3.3B2.4B2.BGB$5.B 2.B.B8.BGB$3.3B2.3B8.BGB$19.BGB$19.BHB$19.BIB$19.BJB$19.BJB$19.BJB$ 19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BEB$19.BHB$19.BIB $19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJB$19.BJ B$19.BJB$3.2B2.2B10.BJB$2.B6.B9.BJB$2.3B3.B4.3B3.BDB$2.B.B4.B10.B$2. 3B2.2B! golly-2.5-src/Patterns/Loops/SDSR-Loop.rle0000644000175100001440000000145212156145314015277 00000000000000# SDSR Loop # # Hiroki Sayama. "Introduction of Structural Dissolution into # Langton's Self-Reproducing Loop." Artificial Life VI: Proceedings # of the Sixth International Conference on Artificial Life, C. Adami, # R. K. Belew, H. Kitano, and C. E. Taylor, eds., pp.114-122, # Los Angeles, California, 1998, MIT Press. # # transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java # credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 15, y = 10, rule = SDSR-Loop .8B$BAG.AD.ADB$B.6B.B$BGB4.BAB$BAB4.BAB$B.B4.BAB$BGB4.BAB$BA6BA5B$B.G A.GA.G5AB$.13B! golly-2.5-src/Patterns/Loops/Tempesti-Loop.rle0000644000175100001440000000505312156145314016317 00000000000000# Tempesti's self-replicating loops. # # G. Tempesti. # # "A New Self-Reproducing Cellular Automaton Capable of Construction and # Computation". Advances in Artificial Life, Proc. 3rd European Conference on # Artificial Life, Granada, Spain, June 4-6, 1995, Lecture Notes in Artificial # Intelligence, 929, Springer Verlag, Berlin, 1995, pp. 555-563. # # Implemented from Tempesti's thesis: # http://lslwww.epfl.ch/pages/embryonics/thesis/ # # This loop first constructs a skeleton of the right size, before # allowing the loop instructions to flow into the new copy. The loop # then opens a gate into its interior and writes the letters "LSL" # using a constructing arm, in a similar way to von Neumann's CA. # LSL are the initials of the Logic Systems Laboratory. # # The rules are not rotationally symmetric, so the letters are always # written the right way up, even though the loops are created in # different orientations. # # State Function # ------------------------loop function------ # 0 background # 1 sheath # 2 control # 3 construction # 4 destruction # ----------------------------programmable--- # 5 NOP (no operation) # 6 advance # 7 turn left # 8 turn right # 9 write an empty space # ------------------------------------------- # # In the initial configuration, the control states (2) are found in each # corner. These determine that size of the loop that is to be written. States # 5-9 contain the program that is to be executed by the construction arm, these # are not used for the loop replication. To see this, overwrite them all with # state 5 - the loop will replicate but won't write anything. # # The program contained in the loop is the following: # (read clockwise from the bottom-right corner) # 7275 - initiation sequence, opens a gate in the top-left of the loop # Advance 11,turn left,advance 2,write an empty space,advance 4 (the control # state gets converted to an advance), turn left, advance 2, turn left, # advance 2, turn right, advance 4, turn right, advance 3, write an empty # space, advance 2, turn right, advance 7, turn left, advance 2. # 55 - close the gate # # Loops history at a glance: # Langton (1984), Byl (1989), Chou-Reggia (1993), Tempesti (1995), SDSR (1998), # Evoloop (1999) ... there are more... # Ancestors: JvN29 (1948), Codd (1968) # x = 22, y = 22, rule = Tempesti 19.A$.BFH7FG2F6EB$AI18AE$.FA16.AE$.FA16.AE$.FA16.AE$.HA16.AE$.FA16.AE $.FA16.AE$.FA16.AE$.FA16.AE$.HA16.AE$.FA16.AE$.FA16.AE$.GA16.AE$.FA 16.AE$.FA16.AE$.GA16.AE$.FA16.AE$.F18AGA$.BFI2FG11FEGB$2.A! golly-2.5-src/Patterns/Margolus/0000755000175100001440000000000012156146015013663 500000000000000golly-2.5-src/Patterns/Margolus/BBM.rle0000644000175100001440000001213412156145314014711 00000000000000#CXRLE Pos=1,0 # Billiard Ball Machine # # A Margolus-neighborhood implementation of a rule by Edward Fredkin. # Signals and logic gates are simulated by 'billiard balls' that bounce # off walls and each other. # # E. Fredkin, T. Toffoli, "Conservative logic", International Journal of # Theoretical Physics, 21:3-4, 219-253 (1982) # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # neighborhood:Margolus # n_states:2 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 1,0,0,0 : 0,0,0,1 # balls travel # 0,1,1,0 : 1,0,0,1 # balls collide head-on # x = 88, y = 74, rule = BBM-Margolus-emulated 88D$CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCD$2D84B2D$CDABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABCD$2D84B2D$CDABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABCD$2D84B2D$CDABABABABABABABABABABABABABABABABABABADCBABABABAB ABABABABABABABABABABABABABABABABABABCD$2D37B2D45B2D$CDABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB CD$2D84B2D$CDABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABCD$2D84B2D$CDABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABCD$2D84B2D$CD ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABCD$2D84B2D$CDABABABABABADCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCBABABABABABCD$2D11B62D11B2D$CDABABABA BABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABADCBAB ABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CD ABABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABA BADCBABABABABABCD$2D11B2D58B2D11B2D$CDCBABABABABADCBABABABABABABABABA BABABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D28BD 29B2D11B2D$CDABCBABABABADCBABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABADCBABABABABABCD$2D11B2D30BD27B2D11B2D$CDABABABABABADCB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABADCBABABABABA BCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABABABABABA BABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABA BABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABADCBAB ABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CD ABABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABA BADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABA BABABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D 11B2D$CDABABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABA BABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABA BABABABABABABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B 2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABABABABABABABABABAB ADABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBAB ABABABABABABABABABABABABABABABABABABADABABABABABABABABADCBABABABABABC D$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABABABABABABA BABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABA BADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABADCBABAB ABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDAB ABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABA DCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABABABABABA BABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D58B2D11B 2D$CDABABABABABADCBABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABADCBABABABABABCD$2D11B2D58B2D11B2D$CDABABABABABADCBABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABADCBABABABABABCD$2D11B2D 58B2D11B2D$CDABABABABABADCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCBABABABABABCD$2D11B62D11B2D$CDABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCD$2D 84B2D$CDABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABCD$2D84B2D$CDABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABCD$2D84B2D$CDABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABCD$88D$CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD! golly-2.5-src/Patterns/Margolus/CrittersCircle.rle0000644000175100001440000014156512156145314017245 00000000000000#CXRLE Pos=-150,-150 Gen=0 # Starting from a random-filled square in the Critters rule # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # http://zvold.blogspot.com/2010/03/margolus-neighborhood-in-cellular.html # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # neighborhood:Margolus # n_states:2 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,0 : 1,1,1,1 # 0 cells: state reversal # 0,0,0,1 : 1,1,1,0 # 1 cell: state reversal # 0,1,1,1 : 0,0,0,1 # 3 cells: 180-degree rotation plus state reversal # 1,1,1,1 : 0,0,0,0 # 4 cells: state reversal # x = 300, y = 300, rule = CrittersMargolus_emulated:T300,300 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$120B3D2B5DB3D2B2D 2B4D3B2DB3DB4D5BDBDBD7BD5BD2BD2B3D2BD107B$BABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABADABADCBCBCDABABABADCBCDCBCDCDCDABADCDCBABCBCD ABCDCBADABADCBCDABCBCBCBADADABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 119BD2B2D4B2D3B3D2B4DBDBDB2D2B2D3BD4B2D4B3D3BD2B2D2B4DB2DB2D110B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABCBCDCBABABADABADCBCDABA DABADADCDCBABCBABCBADABCBABCDCDADADADABADADABABCDCBABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$120B3D2BDB2DB2DB2D2B3D3BD4BDBDB6D4B2DB2DB2D2BD3B 4DB3DB3DBDBD108B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCD ABCBADCBABCDADCBCBCBCBABABCDCDADCDADCBCDABCDCBADADADADCBCDADABABCDADC DABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$119B2D3BDB5D2B3D2BDB2DB3DBD BDBD4BD5B4DB3D2BDB2DB3D4B4D2BD109B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABADCBADADCDABCDCBADADCDADCDABADABABADCBCDABABCDCDABADA DABABCBCDADABCDCBCDABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$122BDBDB 2DB2DBD2B3DB2D3B3D4B2DB2D3BD3B3D2B2D3BD2BDBDB5DBD4BD108B$BABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABCDCDCDCBCBCBCDADABCDCDCDADCDA BADCBCBCDADADABABABCBADABCBABADADCBCBCBABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABA$119BDB9D3BD2BD7B5D6BD2BD4B2DBD4B2DB3D5B2DB2D2B2D109B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABCBCDABADCDCBADADCDCDAD CDABCBADCDABADADADABADABCDCBADABCBCDCDADCBCDCDADCBCBABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABA$119B2DB2DB2DBDB2D2B3D3B4D2BD2B3D2BDB2DB3DBD2B2D 2B2DB2D2BDB2D3B3DBD3BD107B$BABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABADABABADABCBCBCDCDCBABCDABCDABCDCDADCBABCDCBADADCBCBCBCBCBABA DADCBCDCDCDABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABA$119B3D2BD2BD2BDB 2DBDBDBDB2D5BD2BDBDBDBD4BDBDBD3BDB2D3BD3BDB3DBDBDB2D107B$BABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABADADADABABADCDABADABADADADABADC DCDCDCBCDADCDADCBABABCBCBCDCBCBABADCDABADCBABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABA$121BDB2DBDB2DB2D3B2D3BDBDB4DBDB2D4B6DB2DBD2B2D5BDB4DBD 114B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABADADCBCBCBCDAD ADCBCDCDABCBCDADADADADABCDABABABCBADABCDABADADCBABCBCDCBCBCDABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$119BD2B2DBD2BDB4DBDB3DB5DBD4B8DBDBD2B4D B3D2BDB2DB2DB6DB2D107B$BABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABCDABCBABABCBADADABABABCDADCBADADABCDCBCDCBABADABABCBADCBCDCDADADA DABCDABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABA$119BDB4DBDBD2BDBDBD4B 2D2B6D2B4D3B2DBDB3DBD2B2D2BDBD3BD4BD2BD110B$BABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABCBCBADABCDCBCDADCBABCDCDCDABCDABCDADCBCBCDCD CDADCBCBCBCDCDCBCDCDADCBADCBADABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 124B3DBDB2DBD2BDBDBDBD4BDB4D3BDB3D3BD4B3D3B9DBDB2D111B$BABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABADCDCBADCDCBCDADCBABADCBCBCBADABA DABCBABCBCDADCDADCBABCBCDADADCBCDADCBCDCBABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABA$119BDB3DBDBDB4D3BD6B2DB6DB5D4B2DBDB3DBDBDB3DB3DB5DBDB2D 107B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABCBABADCDADABCB CDABABCDCBCBADCBCDCBCBADADABCDABCDABCBADCBADABADADABCBCDCBABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$120B2DB3D2BDBD2B3D4B3DB2D3BD2B4D4B2DBDB D3B2DB3D2BDB2D2BDB3DB3D108B$BABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABCBABABADCBABCBCBCDABADABADCDABADCBADABADCBCBADABABCDCBCBADCD CBCDCDABABCBADABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABA$121B4DB5DBD3BDBD B4D2BD2B3D8BD2B2DBD2BD3B3D3B5DBDBD2BDBD107B$BABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABCBADADADCBABCBCDCDCBCBADADABADABCDCBADCDAD ADCDCBABABCDADABABCBCBCDCDCDADABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 119BDBDBD2B2D3B3D3BD3B3DBDBD2B2DBD2BD3B3D6B2DBD7BD2B2DBDB2DB2D107B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABADADADCDABCDADADC DADCBABCDABABCBADADABCDCBCDABCBABABCBADABADCBCDCDCDCDABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABA$119BD2B2D4BD2BD7BDB2D2B2DB3DBD3B2D2BD2BDB3D3BD B2D2BDB2DBD2BDB2D3BD107B$BABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABCBADABABCDCBCBABABCDCBCBCDABCDADCDCBCDADADCBCDABADCDCBADCDCDADA DCDCBADADADABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABA$119B2D6B2D5BD4BDB3D B3DB6DB2D4BDBDB8DB2D4B2D2BDBDB3D108B$BABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABCDADABCDADCBADADCDABADCBCBCDCDCDABCDCBCBABCDCDABADC DABADCBCDADABCBADABCBCBABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$119B4D 2B3DB2DB5DBD3BDBD5B2DB9D3B6DBDB2DB5DB6D2BD108B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABCBCBABCBABCDABABCBCBABABABCDCDCDADCDCBADA BCBCBABCBABCBABABABCBABABADCDADCBABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$121BD3BD2B2DB2D8BD4BDB2D3B3DBDBDBDB2D2BDBD2BD2BDBDB3DBDBDBD2B3D 107B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABADCDCDABCBCBAD ABCDADCDCBABABABCDADABABADCDADCDCDCBCDCBCDCDCBCBCDABADADADCBABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$120BDBDBD5BD3BDB8D2B2DBDB3DBDBDB3DB3D3B D5B7D2BDB5DBD107B$BABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABC DADABADCBCDCBADCDABCDABADADADABCBCDCBABCBABABABCBABABCBCBADABABABABAB CBCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABA$119B3DB5DBDB3D2B2DBD2BD4BD 4B2DBD2B3D4B6D2B3D3BD4B3DB2D110B$BABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABADCBABCBABCBCBCDADADCDCDADCDCDABCDABCBCDABCDCDABCDABCDC BCDABCBCDCBADCBADADABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$120BDBDBD2B DBD2BDBDBDBD2B3D3B3D4BD2BDB2D2BD3BDBDB6D2B3D3BDBDB3D108B$BABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABCDCDADABABABCDCBCBABABADCDABABC BCDCDCBABABCDCBCDCBCBADCDADCBADCDCDADCBADCBABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABA$120B2D2BD2BDB4DBD3BDB2D4BD4B5DB3DBD2BDBDB2D5BDBD2B2DB2D 3BD2BD108B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABADADADAD CDABABCBADCBABCBCBADADCBCBCDABADCBCDCBADABADCBCBABADCDCDADCDCBADCBABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$119B2D3B2DBD2B3D2B2DB7D2B2DB2DBDB 4DB7DBDB3DB4D2B2D2B3DBDBD109B$BABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABCDCDCDABABCBABADCBABCDADABADCDCDCDADCDABCDCBABCDABADCDCBCB ADCBCBCDADCBCBABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABA$119B4D7B3D2BDB DBD2B2DBDBDB2DB2D2B3D2B4DBD3B2D3BDBD2B4D4B2D110B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABCBCBCBCDCBCDCBCDCBCDABABABCDADCDCDCBCDA DCDABABCBABCDCDADCDADADCDCDABABCDABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABA$122BDB4D2B3DBDBDB2D2B3D5BDB2DB4D2B2D3B2D2BDB3D4B2DB2D2B3DB2D108B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABCBABABADABCBADABAD CBCBCBABCDABCBADCDCDCDADADCBCDABABCDABCDABCBABCDABADCBCDABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABA$121B2D2BDBDBD2BD5B6DB8DBDB3D5BD3B3DB2D2BD3B DBD2BD3B2D109B$BABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCBAB ADADCBABCBCDCDABABCBABABCDCDABABCBCDCDABCBADADCBCBCDADCBCDADCDCDCDCBC BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABA$120BD3B3D4BD3B2DBD2BDB2D5B2DB D2BD5BD5B2D2B2DBDBD2BDB8D110B$BABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABADADCDCBABCBCBABABCBABCDCDCDABABABADADABADABCDADABCBADADCD ADCBADCBCBADCDCDABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABA$122BDBD8B7DB3D BDBD2B2D3BD4B6DB3DBD2BDBD3B2DBDBD4BD109B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABADCBADABADCDCDCDCBADCDCBCDABCDCBCDABCBADABCDA DCBADABCBADADABCBCBADCBABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 120BD2BD2B3D4B4D3BD2B2D2BD3B3DBDBDB2D4B2D2B5DB4D2B2D2B2DBD2BD108B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABCBCDCDCBCBADABABADADCD CBADABABCBCBCBABCDCBCDADADABCDABABABADCDCDCBCBCBADADABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABA$120B3D2BD3BD4B2DBDBD5B3DB2DB2DBD3BD3BDB4D2BDB3D 2BD2BDBD3B3DB2D107B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BCDCBCDABCDCBCDCBCDABABCBCDCDCDCDADCDABCDCBABCDADCDCBADCBCBCDABADCDCD CBCBCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$120BDBDB3D2BDBD2BDBD2BDB 3D2B4DBD2BDB3D3BD8B3D3B3D3B2DBD2BDB2D107B$BABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABCDCBCDCBABADADCBABCBCDCBCDADABCBCBCDABCDADCDCB CBADCDADCBADADADADADADABCDADABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 120BD4BD3BDB2D4BDBDB3DBDBDBD4BD2B3D4BD4B2DBDB4DB2DBDBDBDB2DBD108B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABADADCBABABCDABCDADADAB ABCBCBABABABCBABCBABADCBCDCBCBABADABCBCBCBABABCBADCDABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABA$121BDBDB3D6B2D2BDB2D4B4D3BD2BDB2DBDBD4B2D2B5DB 4D2B2D2BDB2D108B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB CBCDADCBADADABCDCDADCBADADCBADADCBCBADADCBABCBADCBCBADABCDADCDADABCBC DADABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$120BDBD4B3DBD3BD5B4DBDBDB2D 3BD3BD2BD3B3D2B2DB3DB3DB8DB2D107B$BABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABCDABCDCBCDABCDCBABABABADCBCBADABADABCDCDCBADCBCBADADAB CBADABADCBABADCBCBCBABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$122B4D2B2D BDBDB2DB2DB4D6B3DB4DBDBDB2DBDBDBDBD4BD3BDBD4BD110B$BABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$300B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$300B$B ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$300B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABA! golly-2.5-src/Patterns/Margolus/CrittersOscillators.rle0000644000175100001440000000521612156145314020332 00000000000000#CXRLE Pos=-25,-25 # Some oscillators in the Critters rule # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # http://zvold.blogspot.com/2010/03/margolus-neighborhood-in-cellular.html # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # neighborhood:Margolus # n_states:2 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,0 : 1,1,1,1 # 0 cells: state reversal # 0,0,0,1 : 1,1,1,0 # 1 cell: state reversal # 0,1,1,1 : 0,0,0,1 # 3 cells: 180-degree rotation plus state reversal # 1,1,1,1 : 0,0,0,0 # 4 cells: state reversal # x = 50, y = 50, rule = CrittersMargolus_emulated:T50,50 ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABAB ABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABAB ABABABABABABABABABABAB$16B2D32B$ABABABABABABABABABABABABABABABABABABA BABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABAB ABABABADCBABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABAB ABABABABABABABABABABABABAB$34B10D6B$ABABABABABABABABABABABABABABABABA BABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABA BAB$9B2D2B2D35B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABAB ABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABCDABCDABABABAB ABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABAB ABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 39B3D8B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABAB ABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABAB ABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABAB ABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABCDCBABAB AB$10B2D2B2D2B2D30B$ABABABABABABABABABABABABABABABABABABABABABABABABA B$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABAB ABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABAB ABABABABABABABABABABABABABAB$50B! golly-2.5-src/Patterns/Margolus/DLA.rle0000644000175100001440000015337412156145314014725 00000000000000#CXRLE Pos=1,0 # Diffusion Limited Aggregation # # Particles move around at random until they encounter a stuck particle, # when they themselves become stuck. A familiar fractal growth pattern # emerges, as seen in many natural processes. # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using states 1 and 2. Next select-all # and run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # # Diffusion Limited Aggregation, in a Margolus neighborhood CA # # n_states:3 # neighborhood:Margolus # symmetries:rotate4reflect # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # # 0: vacuum # # 1: gas particle # # 2: stuck particle # # # random gas-like rules: # 1,0,0,0 : 0,0,0,1 # a diagonally-travelling particle keeps going # 1,1,0,0 : 1,1,0,0 # two particles collide # 0,1,1,0 : 1,0,0,1 # two particles collide head-on # 1,1,1,0 : 1,1,0,1 # three particles pass through each other # # # plus aggregation rules: (these seem to suffice) # 1,0,2,0 : 2,0,2,0 # 1,0,2,2 : 2,0,2,2 # x = 313, y = 236, rule = DLA-Margolus-emulated D4BD15BD2BD2BD3B2D9BD5BD2BD2B4D3BD3BD16B2D12BD12BD4BD11BD24BD28BD2BD 2B2D12BD8BD9BD5BD4B2D3BD3B2DBD6B2D2B3D2BD2BDBD4BDBD6BD15BD4BD2BD3BD7B $ABCBABABABABABABABABABABABABABCBABABCBABABABABABABABABABABABABABABAB ABADABABADABABABABABABABABABCBCBABCBABABABABABABABCBABABABCBADABCBADA BADCBABABABABABABABABADADABADADABABADABABABABCBABABABADABABADABABABAB ABABABABABABABABABADABABCBABABABABABABABABCDABABABABABADABADABABABABC BADABABABABABABABABABABABABABCBCBABCBA$7B2D3BD11BDB2D5B2D9BD14B2D5BDB D10BD11BD5BD3B2D3BD3B2D3BD3BD3BD5BD13BD7B2DBD3BDB2D3BD21BD9BDBD2BD4BD 2BD7BD5BD2BD11B2DBD9BD3B2D3BD12B2DB2D12BD2BD18B$ABABADABABCBABADCBCBC BADABCBABADABCBABABABABABABCBABABADABABABABADABABABABABABABABABABABAB ABABABABABABCBABABABABCBADABADABADADABABABCDABABCBABCBABADADABABABABA BABABABABADCBABABABADABABABADABABABABABABABABABABABABABABADADABABABAD ABABADABABABADABADABABABABABABADABABABCDABABABCBABABADABABCBABABADCDA BABABABADABABABA$8BD7BD8BD5BD9BDBD22B4D2BD3BD5BDBD23BDB3D2BD6BD7BD4BD 2BD2BD27BD12BD18BD3BD5BD4BD5BD4BD9BD4BD21BD24BD3BDBD4BDBD3BD3BD2B$ABA BABCBABABABABABABCDABABABADABABABCBABABABABCBADABABABCBABCBABABABCBAB ABABABABABCBABABABABABABABABABADADABADABABABABABABABABABCBABABADADCBA DABABCBABABABABABABABABABABABABABABABABCBADABABABCDABABCBADABABCBABAB ABABABCBCDABABABABADABABABABABABABABCBABADABABABABADABABABADABABABABA BCBCBABADABABABABABABADABABABADABA$BD3BD5BDBDBD2BD2B2D3B2D5BD7B2D9BD 6BD13BD3B2D9B4D4B2D24B2D11BD8BD4BD2BD2BD7BD6BDBD2BD10BDBD8BD35BD8BD2B 2D6BD7BDBD3BD5BD5BD9BD3BD4BDB3D3BDB2D3B$ADABABABABABABABABABCBABABABA BABCDABABADABABABABABABABCBABABCBADABABABABABABABABABABCBABABCBADABAD ADABABABABABADABABABABADABABABABABABADCBADABABABABABABCBABABADCBABADA BADCBABABABCBCBABABABABCBABABABABABABABABCDABABCBABADCBABADABABABCBCB ABABABCBABABADADADABABABABCBABABADABABABCBADABABADABABABABABABABABABA BABABABA$3BD9BD5BD6B2D18BD8BD11BD10BD18B2D17BD2BDB2D8BD18BD11BD5BD3BD 2BD6BDBD5B2D4BD6BD3BD5BD13BD8BD8B2DBD4BDBD10B3D4BD9BD4BD3B3D5BD3BD8B$ ABABCBABCBABABABABABADABABABABABABCBCDABADABABADABADADABABADABABABABA BABABABABABABADABCBABABABABABABABCBABABCBABADABABABABABABABABABCBABAB ABADABABABADABABABABADABCBABABABCBCDABABABABCBABABABABABABCBABABABADA BABABCBABADABABABCBABABABABABADABABABADABABABABCBCBADABABABADABCBABAB CBABABABABABADADABABABABABABABABADABA$4BD25BD6BD15BD13BD5BD2B2D3B2DBD 17B2D7BD2BDB2D20BD12BD2BD5B2D12BD9BD4BD25BD13BD11B4D6BD2BD15BD13BD12B D4BDBD8B$ABABABABABABADABABADABABABABCBABADABABADABADABADABABABABABAB ABADCBABABABADABADADABABABABABABABABABABABABABABABCDABABABABABCBABABA BABABABABABCBABABABABADABABCBCBABABADABABABABABABABABCBABABABCBABABAB ADABADADABADCBABABCBABABABABABABABABABABABABABABABADABABABABABABABABA BADABABABABABABADABABABADABABABABABABABABABABA$D4B2D4BD24BD6BD4BD8BD 8BD15BDB2DB3D4BD32B2D7BD2BD3B2D10BD17BD12BD2BD3BD4BD15BD4BD8BD3BDBDB 2D2BDBD5BDBD2BD2B3D3B3D3B2D4BD3BD10BD21BDB$ABABABABABABABABABADADADAB ABABABABCBABABABABABABABABABABABADABCBABABABABADABABCBABABCBABADABADA BADCBABABADABADABABCDABABABABABABCBABCDABABABABCDABABABABABADCDABADAD CBABABABABABABABABABABADABABADABABADADADABABABCBABABABABCDABABABCBCBA BABABCBADABABABABABABABABCDABADABABABABCBABABABABABABABABCBABABCDABCB ABCBADABABA$2BD8BD2BD20BD18BD10BD9BD2BD2BD7BD9BD14BD2BD8BD2BD5BD3BD5B D18BD3BD6BD28BD29BD2BDB2D13BD8BD7BD4BDBD20BDBD8BD2B$ABADCBABABCBABABA DABABABADABABABCBCBABABABABADABABABABABABABABADCBABABCBABABCBABCBADAB ABCBABABABABABABABADCBABABABCBCBADABABABABABABABABABABABABABABABADABA BABABABADADCDABABABCBABABCBADABABABABABADABABABCBADADADABABABABABABAB ADABABADCBABABABABABABABABABABABADABCBCBABABABABCBABABABABABABABCBABA BABABADABABABCBADABA$BD2BD2BD8BD5BD11BD3B2D16BD6BD4BD3BDBD3BD3BD2BD7B D2B2D2BD3BD24BDBD12BD14BD11B2D2BDBD4BD13BDBD6BD5BD12B2D3BDBDBD3B2DBD 6BD5BD4B2D3BD25B2D9BD6BD5B$ABABABABABABADABABABCDABCBABABCDABCBABADCB ABABABABABABABABABABCBABABABADABADCDADABABADABCBABCBCBCBADABABABABABA BCBABABADABABADCBABABCBABADABABABABABABABABCBABABCBABADABABABABABABCB ABABABABABABCBABABABCBABABABADABABADCBCBABCBCBABABABABCDABABABABABCBA BABABABABABABABABABABABABABABABADABADABABABABCBABABCBCDABCBABADA$9B2D 5BD5B4D7B2DBD22BD5BD14BD11B2D12BD4BD24BD5BD5BD2BD9BD4BD9BD11BD12BD2BD 12BD3BD2BD12BD2BD2BD2B3DBD2BDBD8BD8BDBDBD5BD10B2DB2D4B2DBD2BD2BD$ABAD ABADCBABCBABABABABABADABABABABABCBABABABABABADABABABCBABABCBADABABCBA BABABABABABABCBABCBABABABABABABCBABABADABABCDABCBABABADABABADABABABAB ABABABABABABABADABABABABADADABADADCBABABABABCBABABABADABABADABABCBCBA BABABADABABABABABABABADADABABCBABABABABCBABABABABABABADCBABABABCBADAD ABABABADABABABADABABCBABABABABABA$9BD5B2DBD13BDBD5BD3BD5BD39BD9BD8BD 13BD2BD3BD8BD6B2D12B2D2B2D10BDB2D3BD13BD6BDBD3BD21BD9B2D6BD11BD16BD2B D3BD8BD11BD3BDB$ADABADABABABADABABABCBADABABABABABABABABABABABABABABA BADABABABCBADABABABABABABABADCBCBABABABCBCBABABABABABABABABABABABABCB ADABABCBABCBABABADABABABADABCBABABABABABABABABADCBABABABABABABCBABABA BCBABABABABABABABCBABABABABCBABABABCDABABABADABABADCBABABCBADABABABAB ABABABABABABABABABADABABABADABABCBADABADABABABABADABA$4BD6BD4BD5BDB2D 3BD2BD3BDBDBD5BD3BDB2D8BD2BD3BD8BDB3D11BD42BD7BD8B2D4BD3B2D12BD4BD2BD 2BD2BD3BD7BD6BD2BD17B3D18B2D6BD14B2D2BD3BD11BD4BD9BDB$ABABABABADABABA BABABCDCBABADABABABABABABABABABCBCBABCBCDADABABABABABABCBABABADADCBAB ABCDADABABABADABABADABABABADABADABADADABABABADABADABABCBADADABCBABABA DABABADABCBABABABABABCBABABABABABABCBABADABABABABABABABABABADABCBABAB ABABABADABABABABABABABABABABCBABADABABABABABADABABADADABABABABABABADA BCBABABABABABABABCBABA$BD5BD6BD11B2D6BD3B2D4BD2BDBD2BD4BD6BDBD4BD3B2D BDBD4BDBD3B2DB3D8B2D17BDBD41BDBD8BD4BDBD13BD16BD2BDBDBD2BD5BD5BD3BD8B 3D2BD17BD17BD5BD7BDBD3B$ADABABABADCBABADABABABABABABABABABABCBABABCDC BABABABABADABABABCBABABABABABABADABABADABABABCDADABABADABABABABABADAB ABADABABABABABABABABABABADABCBADABCBABABABABABABABABABCDABABABABABABA DABABABABABABABABABABABABABADADCBABABABABABABABABABABCBADABABCBCBABAB ABABABABABCBABABABABABABCDABCBABABABABABCBABABABABABABCBABCBA$8BD3BD 3BD2BD2BD4BD2BD4BDBD5BD5BD2B2DB2D10BDB2D2BDBD6BD9BD11BDBD6BDB2DBD11BD 2BD3BD3BD10BD14BD3B2D13BD3BD3BD4BD13BD6BD5BD5BD2BD13BD3BD11B2D15BD4BD 3BD2BD4BD4BD4BD3B$ABABABABABABABABABABABABABCBABABABABCDABCBCBABABABA BABABABABABABADABABABABABADABABABABABABCBCBABABABABCBABABABABCBCBADAB ABABABABCBABABADCBADABABABADADABCBABABADABADABABABABABABABABABABABABA BCBABABABABABABABABCBCBADABADCBABABABABABADABABADABABCBABCBABABABABAB ABABCBABADCDABABABABABABABABABABABADABABABABABABABABABA$D3BD7BD11BD7B D2BD5BD12BD5BDBD19BD2BDBDBD5BD4BD2BD21BD10BDB2D5BD3BDBD2B3D12BD16BD 15BD16B3D12BD6B2D5BDBD3BD20BD4BD19BD3BDB2D5B$ABABABCBABABABCBABCBABAB ABABABABABCBABABABABADABADABCBABABABABCBABABCBABABCBABABADCBABADABADA BCBABABABABADABABABABABABABCBADADABCBADCBABCBABCBABABABABABABABABABAB ABABABABADCBADCDABABABABABCBABADADADABABABABABABCBCBABABABABABABABABC BADABABABABABABABABABABABABABABCBABCBABABCBABABABABADABABABABABABABCB ADABABABABABA$11B2D6BD14BD9B2D9B2D4BD12BD5BD3BD9BDBD4BD19BD2BD3BD11BD 2BD4BD10BD2BD4BD2BD21BD14BD5BD21BDBD6BD5BD5BD12BD4BD2BD2BD6BD5BDBDBDB D13B$CBABABABCBABABABCBABCBABABCBABABADABABABABABABABCBADABABABCBABAB ABABADABABABABABABADABABABABABABCBCBABABADCBABABABABADABABABABABABABA DABCBADABABADABADABCBCBCBABADCBABABABADABABABABABABCBABABABABABABADAB ABABABABABADABCBABABABADABABABABABABABABABABCBABABADCBABABABABABABABC BADABABABABABABCBADABABABABCBABCBABABABABA$2BD13BD20BD5BDB2D4BDBD2BD 3BD7BD7BD2B2D2BD2BD5B2D5BD8B2D2BD13BD8BDB2D2BD4BDBD2BD4BD3BD16BD4BDB 2D6BD5BD2B2D2B3D8BD3BD4BD5BDBD7BD7BD19B2D4BDBD7BD5BD2BD18B$ABABABADAB ADABADABABABABCBABABABABABABABCBABABABADABABCDADADCBABABADABABABABABA BADADABABADABABABCBCDADABABABABCBABCBABABABCBABABABABABABABABABABCBAB ADABABABABADCBABABABABABADABABCBABABABABABABABABABABABADADABABABCBABA BABABABABABABABABABABABABABABABABABABABABABABCBABABABABABABABABABABAB ABABADABCDABABCBABABABABABA$D10BD6BD5BDBD18BD3BD5BD11BD20BDBD2BD8B2D 2BD3BD6BD2BDBDBD3BDB5D2BD3BD3BD5BDB2DBD5BD18BD8BD2B2D24BD6BD4B2D13BD 12BD6BD14BD17BD4BD6BDB$ABABABABADABADABABABABADABABABABABABABCBCBABCB ABABCBABABCBABADABCBABCBADABCBABABADABCBABABABABABABABADADABABADCBABA BABABABCBADABCBABABCBABADABABADADABABABADABABADABABABABADCBABABADABAB ABABABCBCBABABADABABABABABABABABABABADADADADABADCBABCBABABADABABABCBA DABABABABABABABABABABABABABCBABABADABABABABADABABABABABCBADA$BD8BD11B DBD28BD2B2DBDBD10B2D11BD25B2D3BD6BD3BD6BD8BD5BD3BD3BD2BD10BDBD4B3D6BD 12BD3BD4B2D8BD15B3D3BD13BD9BDBD2BD3BD7BDB2D9BD4BDBD10B$CBABABADABCBAB ABCBABABADABABCBABABCBCBABABADABABABABABADCBABABCBABADABCBCBABABADABA BABABABABCBABABCDABCBABADABABABABADABADCBCBCDCBABABABABABADABCBABABAB ABABABCBCBABADABABCBABCBABADABABCBCBADADCDADABABABABABABABABABABABABA BCBADABABABADABABADABCDABABCBABABADCBABCBABABABCBABCBABABADADABCBADAB ABADABCBABABCBADABABABA$5BD3BD3BD4B2D4BD4BD2BD2BD2BD4BD15BD2BD2BD6B3D 4BD3BD3BD8BDBD9BD2BD7BD5BD11BD8BD12BD4BD6BD10BD24BD4BD2BD6BD3BD2BD5B 3D4BD3BD3BDBD3BD2BD3BD5BD4BD19BD7BD7BD2B$CBADABCBABABABCBABCDABABABAD ABABCDABABABABABABABABCDABCBABABABABABABABABABCBABADABABABABABABCBABA BABABABABABABABADABABABABABCBABABABABABADABCDADCBABABABABABCBABADABAB CDABABABABABABABABABADABABCBCDABABABCBABABCBABABABABABABABABABABABADA BABABABABCBABCBABABABABADABABCBABABABABADCBCBADADABCBABCBADABABCBABAB ABABADADA$2BD7BD3BD11BDB3D3BD10BD8BD15BD2BD4BD8BD4BD6BD12BD3BDBD2B2D 18BD13BD13BD12B2D4B2D6BD4BD29BD4BD7BD4BD4BD3BD13BD20BD4BD7BD6B$ABADAB ABCBABABABABABABABABABABABABABCBCDABABABABCBABABABABABABABABABADABABA DABCBABABADCBCBABABCBCBABCBABADABADABABABABABABABABABCBABADABABADABCB CBABADABABABCBABABABABCBABABABABABABABABABABCBABABABABABABABABABABABA BABABADABABABABABABABABABABABABABCBADABABABABABCBABABABABABADABABABAB ABCBABABADCBABABABABABCBABABABC$7B3D2BD10BD30BD5B2D9BDB2D5B2D7BDBD9BD 52BD3BD9BDBDBD29BD2BD2BDBD3BD13BDB2DBD8BD4BD14BD5BD9BDBD3BD20BDBD3B2D $ABABABCBABABABCBABABCBABABABADABCBADABADABABABABADABABABABABADABABAD ABABABADABABABCBABABCBABABABABADABABABABABABABABADCDADABABABADCBADADA BABABADABABABABABADABABABCBABABABADCDABABCBADABABABABABABABCBABABABAB ABABADCBABABADABABABABABABABABABABCBABABABABADABABABCBABCBABABABABABA BCBADADABABABABABABABABCDCBCBABABABABC$2D4BDBD4BD11B2D2BD15BDB2D4BD2B 2D2BD10BD11BD2BD4BDBD2B3D3BD2B2D11BD23BDB2D7BD8B3D16BD3BD3B2D6B2D2BDB D11BD2BD9BDB2D8B2D2BDBD15BD13BD6BD20BD2BDBD3B$CDABABADCDABABABADABABA BABABABABADABABABABABADABABABABABABABABABABCBABABADABABABABABABABABCB ABABABABABCBABABCBABABABABABCBABABABABADABABABABABADABABABABCBABABABA BABABABABABADABABABABABABCBADCDABABABABABABABABABABABCDABABABABCBABAB ABCBCBABABABABABADABABCBCBADABABABABABABCDCDADABABABABABABABABABABABA BCBABABABABABA$D4BD2B2D12BD2BDBD4BD7BD2BD3BD5BD11BD5BD16BD2BD2BD11BDB D5BD12BD19BD6BD6BD5BD7B2D2BD14B2D3BD6B2D13BD4BD3BDBD6BDBD11BD10BD2BD 8BDBD10BD9BD2B2D4BDB2DB$ADABABABCBABCBABADCBCBABABABADABABADADADABABA DABADABADABABABADADABABABCBCBABABABADABABABABCBABABABCDABABABABCBABCB ABABABABABCBABABCBADABCBABABABABABABABABABABABABABCDABABABCBCBABADADA DCBABABABABABABABABABABABABABABCDABABABABABABABABADABABABABABABABABAB ABABABABADABABABABABABCBABABADABADADCBCDABABADADCDCDABCDCBABA$7B2D2BD BD4BD14BD7BD11BD2BD3BD10BD8BD13BD6B3D26BD4BD3B2D8BDBD19BD6BD8BD4BD2BD 2BD13BD24B2D8BD20BD4BD2BD9B2D5BD4B2D4BD8B$ABABABABABADABABABABABADADA BABABABABABABABABABCBABABADABABCDABCBABABABABABABABCBABABABADABABABCD ABADABCBCBABABABABADCBABABABABABABABCBCBADCDABADABCBABABABABADABABCBA BABABABABABABABCBABABABABADADABABCBABABABABABABABABABABABCBABABABABCB ABCBADABABABADABABABCBABABABADABCBABABABABABABABABABABABABABABABADABA BCDABABABA$2D8BD2BD4BDBD7BD21BD10BD2BD4BD11BD3BD6B2D2B3D4BDBD6BD5BD9B D6BD5BD4BDBD2BD2BD11B2D9BD4BDBD9BD6BD2BD2BD2BDBD11BDB2D10BD3BD7BD2BD 16BD4BD2BD34B$ADABABCBCBCBABABABABABABABABABABADCBADABABABADABABABABA BABCDABABABABABABADABABCBADABADABABABABABABABABADABABADABABABADABCBAB ABABABABABABABABABADABADADABCBABABABCBCBABABABADABABABABABABABABABCBC BABABABABADABABCDABABABCBADCBABABABABCBABABABADADABABABABABABABABABAB ABABABABABCDABADABABABABABABABABABABABABABABADCBABC$4BDBDBD7BD7BD2BD 4BDBD9B4D5B2D9BD5B3DBD2BD9BD26BDB2D8BD8BD5B2D2BDB2D11BD2BD16BD9BD5BD 37BD3BD2B2D9BD3BD11BDB2D4BD12BD3BD5BD2BD10B$ABABABABCDABABADCBABCBCBA BABABABABABABABABADABABCDABABABABABCBCBABABABABCBABABABABABABABABABAB ABCBABABABABCBABABCBABABCBABABCBADCBADADABABABABADABABABABADABABABABA BADADCBABABABABABABADADABADABCBABABABABABABCBABADABCBABABABABCBABABAB ABABABABADADABABABABCBADABADABABABCBABCBABCBABABABABABABABABCBABADABA BABABABCBABA$2B2D7BDBD4BDBDBDBD2BDBD10BD6BDBDBD2BD9BD14BD11BD3BD10BD 5BD11BD3BD19BD8BD9BD5BD10BD4BD8BD3BD2BD4BD4BD5BD5BD8BD16B2D19BD2BD8BD 2BD3BD7BDBD8BD$ABABABABABABABABABCBABCBCBADABABABCBABABCBABABADABABAB ABABABADABABABCBABABABABADABADABCBABABABABABABABCBABADABABCDABADABABA BABABABABABABABABABCBCBABCDABABABABABABABCBADABADADABABCBABABABABCBAB ABABABABABABADABABABABCBCBCBABABCBABABABADABABABABABADABCBABABABABABA BABABCDABADABABABABABABABABABABADABABABADABABABABADA$BD6BD9BD3BD11BD 9BD2BD14BD11BD10BD2BD10BD9BD6BD12BDBDBDBD11BD9BDBD5BD13BD5BD5BD5B3D 10BD6BDBD8BD17BD9BD2BD2BD19BD5BD2BD5BD5BD9B$CBABABABABABCBABABABADABA BABADABADABABABABABABABCDABABABABADABABABCBABADABABCBABABABABABABADAB ABABABCBABABABABADADABADCBABABABABABADABABCBCBCBABABABADADABABCBABABA BCBADADCBADCBABABABABABCBABABADABABABADABABABABABABABABABABABABCBABCB ABABABADADABABABABABCBABABCBADABABABABADABABCBABCDABABABABABABCBABCBA DABABCBABABC$5BD6BD14BD3BD11BD6BD4BD3BDBD3BD6BD2BD10BD2BD6BD14BD6BD6B 2D3BD7BD4BD4BDBD12BD4BDBD9BD16BDBD3BD5BD25BD3BD5BD2BD11BD2BD3BD11BDBD 3BD3BD16BD6B$ABCBABADCBABABABABABABADABABABABABABABABABABABADABABCBAB ABADCBABABCBABABADABABCDABABABADABCBABABCDABABABABABCDABABABABABABABC BADCBABCDABADABABABABABCBCBABADABCBABABADABABABADCBABCBCBADABCBABABCB ADABABADADABABABADABABABCBABABADABCBABABABABABABCBCBABABABABABABABABA DADABABCBABABABABABABABADABABABABCBABABABABADABABA$4B2D6BD18B2D3BD26B D5BD14BDBD3BD2BD7BD2BD6BD11BD7BDBD12BD9B2D3BD6B2D3BDB2D16BD2BD14B2D 24BD3BD3BD14B2DBD7BD7BD7BD2BD19BD2B$ABABABABABABCDABABABABABABABABCBC BABABABABCBADABABABABADCBABADABABCBABADABABCBABADCBABABABABABABABABAB ABABADADABABABADABABABCDABABABADABABABABABABABADABABABABABADABADABABA BABABCBABABABABABABADABABABCBABABABCBADCBCBABABABABCBABABABABCBCBABAB ABABABABABCBADABABABABABCBABABADCBABCBABABABCBCBADABABCBABCBCBABCBADA BCBC$6B2DB2D7BDBD8BD6B2D4BD3BD4BD7BD3B2DBD4BD12BD2BD7BDBD14B2D10B2D4B D6B2D5BD2B2D9BD5B2D6BD2BD3BD4BDB2D14B2D4BD17BD7BD4BD2BD11BD7BD2BD5BD 4BD12BD14BD2BD5B$ADABABABABABABABABABABABADABABABABABABABABADABABABAD CBABABABABABABABABABABCDABABCBCBADABABABABABABADCBADABABADABABABABCBA BABABABADCDCBADCBABABABABADABABCBCBABCDABCBABABABABABABABABCBABABCBAB ABCDABABABABABABADABCBCBADABABADABABABABABABABABABABABABCBABADABADABA BCBCBABABCBABABCBCBABABABABABABADABABABABADADADABCBABA$4BD3BD8B2D3BD 6B2D16BD15BD4BD6B2DBDB2D4B2D21BD6BD18BD9BD3BD2B2D5B3D6BD8BDB2D6BD5BD 5BD6BD5BDBD18BD4BD7BD7BD3BDBD4BD2BD10B2D6BD2BD5BD6BD9B$ABABABADABABAD ABABCBCBABABABABABABABABABCBABADABABABABADABADABABADABABABABABCBABABA BABABADCDABABABABADCBABABABABABADABABABABABABABCBABCDABABABABADABADAB ADABABABADABABADABADCBABABABABABABABCDABABADABABABABABABABABABCBCBADA BABABCBABABABABABABABADABABABCBABABABABABABABABCBABCBABABABABCBABABAB ABADCDABADABABABABABABA$12BDBD4BD4BDBD4BD2B3D2B2DBD8BDBD3BD6BD11BD8B 2D2BD10BDBD6BD7BDBD12BD21BD6BD5B2DBDBDBD2BD3BD2B2DBD11B2D4BD21B2D10BD 6BD4BD17BD17BD9B3D3BDB2D6B$CBCBABABABABABADABABABABADABABCBCBABABABAB ABABABABABABABCBCBADABABCBABABABABABABCBABADADADCBABCBADABABADABADABA BABABABCBABABABADADABABABADABABCBABCBABABABABCDABABCBABABABABABABABCB ABABABABABABABABABABABCBABABABABABABADABABABABABABADABCBABABABCBABABA DABABADADABABADABADABABCBABABABABABABABABABABABCBABABABABABABABA$2BD 2BD10BD3BD6BDBD6BD2BD6BD18BD5BDBD3BD21BDBD7BD2BD5BD10BD10BD10BD16BD 13BD8BD33BD2BD7BD5B2D5BD33BD6B2D2BD3BD2BD5BDBD3B$ABABABABABABCBABCBAD ADCBABABABABCDABABABABABABABABCBABABABABABCBABABABADABABABABABABABADA BABABABCBABADABABABABABABADADABABABABABABABABABABABCBABABABABABABABAB CDADABABABABABCBABABABCBABABABABABABADCBABABABCBADABABABCBABABABADABA BABCBABABABABABABCBABABABCBCBADADCBABADABABABABABABABABCBADABABABABAB ABABABABABADABABA$4BD8BD15BD27BD2B3D5BD29BD9BD14BD6BDBD3BD4BD12BDBD9B 2D3BD9BDBDBD8BD2BD6BD4BD10BD4B4D5BDBD16BD4BD3BD3BD2BD13BD2B2D17BD7B$A BCBABABABABABABABABABABABABADADADABABABABABABADADADABCBABABABABABABAB ADADABABABABABABABABCBABABABABABABABCBABCBABABABABABABABABABABCBABABA BABCBABCBABABABADCBABABABABABABADABABABABCBCBABABABADADCBABCBCBABABAB ADABABABABCBABABABCDABABCBABABCBADABABABABABCBABABCBCDABABABABCBCDABC BCBABABABADABABABABABADABABABABABADA$6BDBD6BD33BD3BD7BD10BD3BD3BD18BD 13B2D15BDBD3B2D5BD3BD3BD11B2D5B2D14BDBD9BD13BD6BDBD6BD6BDBD17BD9BD5BD 8BD3BD5B2D5BD8BD6B$ADADABABABADABABCBABABCBABABABABCBABCBABABABABABCB CBABABABABABABADABABABCBCBABABABABABABABABABABABABCBABABABCBABABABABA BCBABABABABABADABABCBABADCBABCBADABCBCDADABABADABABADABABADADABABABAB ABABABABADABCBADABABABABABABADABADABABABABABABABADABCBABABADABADCBABA BABABABADABABABCBADABABABABABCDABABABABADABABADABCBABABC$3BD4BD6B2D6B D13BD2B2D2B2D4BD4BD8BD25BD4BD6BD6BD13BD10BD3BD5BD2BDBDBD10BD7BD6BD15B D2BDBD2BD2BDBD8BD7B2D11BD3BD2BD3BDBD8BD13B2DBDBD8BD9BD6BD5B2D2B$ABABA BABADABADABABABADABABABABCDABCBABABCBABADABABABABABABABABABCBABABCBAB CBABABCBABABABABABADCBCDADABABABABCBABCDABABABABABADCBABCBADADABABABA BCDABABABADABABABADABABABADABABABABADABABABADCBABABCBABABABABABCBABAB ABADABABCDABADABCBABCBADABABABABABADABABABCBADABABABABCBABABABABABCBA BABCBADABCBABCBADABABABABABABABA$3BD2B2D2BD5B2D2BD46BD4BD2BDBD6BD10BD 14BDBD17BD4BDBD5BD4BDBD9BD5BD14BD2BD2BDBD3BDBD4BDBD15BD4BDBD22BD4BD5B D3BD4BD4BD3BD3BD12BD9BD8B$ABADABABADCBABABABCBCBABABADCBABABABABABABA BABABABADABABABADABABABADADCDABCBABABABABABABABADABCBADADABABABADABAB ADCBADCBABADABABABABCBABABCBADABCDADABABABADCBCDABABABADABABABABABADA BABABABCBABABADABABABCBADABABABABCBCBABABABCBABABABABABABABABABABABAB ADCBABABADCBADABABADADABABABABABADABADABABABCDADADABABADABABABA$2B2DB D2BD17BD19BD2BD8BD4BD4BDB2DB2D5BDBDBD3BD18B3D6B2D4BDBD10BD10BD2BDBD 24BD6BD9BD3BD19BD4BD9BD14BD6BD10BD3BD23BD2BD16B$CBCBABCBABABABABABABA BCBABABABABABABABABADABABABCBCBABABABADABABABADABABABABABADADABABABAB ABCBABABCBABABABABABABABABABABCDABABABABADABADABABABABABABABABABABABA BABABABABABABADABABABCBABABADABABADABABADCBABABABCBCBABABABABADABADAB ABCBABCBCBABABABABABCBABABABADABABABABADABABABABABABCBADABABABABADCBA BADABADABABABABA$8BD6BDB2D11B2D4BD6BD4BD18B4DBDBDBD4BD5BD9B2D3BD8BD2B D4BD26BD4BD6BD10B2D5BD3BD2BD8BD4BD6BD2BD21BD18BD10BD18BD3BD4BD8B2D12B D2B$ABABABABABADABABABABABADCBADCBCBADABCBABADABABABABABABABABABABCBA BABABABADABCDABABADABABABABCBCBADABABABADABCBCBABABABABABABABABABABAB ABADABABABCDABCBABABABABABABABABABCBABADADABABABABABABCBABABADABCBABA BABABCBABABABABADABABADABCDABABABABCBADABABABABABABABABABABCBABABCBAB ABABABABABABABABABCBCDABABABCBABABABABABA$BD9BD7BD9BD28BD10BD3BDBD10B D14BD11BDB2D10BD6BD6BD13BD6BD6B2D17BD7BD2BD13BD12BD4BD3BD6BD4B2D10BD 2BD4B2D6BD3BD7BD6B2D7BD9B$ABABABABABABABABCBABABABABABABABABABCBABABA BABABABCDABABCBADCBADABABABADABABCBABABADCBABABABABADABCBABABABCBABAB ABABCBABADABABABABABABABABABABABCBABABCBABABCBADABCBABABABABABABABADA BABADABABABCBABABADABABADABABABABCBCBABABABABADADABADADABABABABABABAB ABABADABABABABCBADABABABABCBABABABABABABABABABABCBCDADABADABABA$BD3BD 8B2D6BD5BD7BD3BD8BDBD5BD8B2D16BDBD2BD29BD5BD18BD9B2D22BD2BD2BD12BDBD 7BD14B2D7B2D7BD19BD10BD7BD5BDBDBD10BD3BD6BDB$ABABABABABABABCBABABABAD ABABCBABABCBABABABABABADCBABCBABABCBABABADADABABABABCBABABABABABABABA BADABABABCBABABABABABABABABABABABABCBABABABCBABABABABABADABADABABABCB ABABABADABCBABCBCBABCBABADABABCBADABADCBABADADCBABABABABCBABCBABABABA BCBADABABABABABABCBADABABABCDCDABABABABCDABABABABABABABABABCDABABABAB ABABABABABABA$3BD5BD17BD18BD5BD2BD6BD10BD8B2D2BD3BD16BD14BD2BD4BDBD2B DBDBD4BD5B2D10BD15BD2BDBD2BD6B2DB2D9BD4B2D5BD4B2D8BD8BD3B2D6BD3BDBD 10BDBD5BDBD7BD8BD6BDBD4B$ABABABABABABADABADADABCBABABABABCBCBABABABCB ABABABADABABCBABABADABABABCBABABABCBABABABCBABABCDCBABABCBABCBABABABA BABABABABABABABCBABCBADABABABABABCBABABABABABCBABABABABABABABABCBABAB ABABADCBABABADABCBABABABABABABCBADABABCBABABABABABABABABABABABABABABA BADABABABCBABABABABABABABABABABABABABADADABABADABABADABABABABA$BD7B2D 5B2DBD4BD5BD9BD6BD11BD3BD15BD3BD16BD3BDB2D8BD9BD9BD8BD5BDBD9BDBD9BD2B D2BDB4D3BD4BD3BD9BD2BDBD5BD21BD7BDBD14BD4BDBD4BD12BDBD11BD6B$CBABABAB ABABABABABABABABADADCBADCBABABABABADABCBABABABABABABABABADABABABABABA DABABABABADABABABABABABABABABABABADCBCBABABABABABADADADABABABABABABAB CBABABADABCDADADABABABABCBCBADABABABABADABABABABABCBCBABABABABADADABA DABABABADCBABABABABABABABCDABABABCDABABCBABABABABADABABABABCDABABADAB ABCBCDABABABCDABABABABABABABA$B2D12B2D8BD14BD2BD5BDBD5BD6BD2BD28BD29B D2BD12BD19BD8BD4BD18BD7B2D2BD7B2D13BD4BD6BD4BDBD12BD4BD4BD14BDBD3BD2B D7BDB2DB2DBD$ABABABABABADCDABABABABABABABCBABABADABCBABCBABCBCBABABAB ADADADCBABABABABABABABABABCBABCBABADABADABABABABABABABABCBADABABABADA BABABABABABABABADADCBABABCBABABABABABABABABABABABADABCBABABABABADADAB ABABCBCBABABABCBCBABABCBCBABABCBABABABADCDABABABADABABABABADABABCBCBA BCBCBCBABABABCDABCBABADABCBABABCBABABABABADABABCBA$6B2D6BD15BD26BDBD 4BD19BD3B2D6BD12B2DB2DBDBD16BD8B2D7BDB2D13B2DBD2BD6B2D3BD4BD20BD17BD 4BD24BD6B2D20BD7BD4B2D4BD2BD$ABABCBCBABABABABABABCBABABABCBABABABABCB ABADABABABABABADABADABABADCBADADCBADABABABABABABCBABCDABCBABABABCBADA BABCBABABCBABABABABABABABADCBABADABABABABABABABABABABABABABABABABABAD ABABABABABCDABADABADCBABABABABABABABABABABABADABABABCBCBABABABABABABA DABCBABABADADABABCBABABABABABCDABABABABABABABABABADABABCBABABABABA$ 14BD3BD5BD15BD15BDBDB2D2BD14BDB3DBD5BD5BD2BD7B2D17BD16BD2BD7BDBD13BD 16BD12B2D6BD5BD4BD2BDBDBD5BD3BD6BDBD4BD6BD10BD2BD2BDBD4BDBD12BD15B$AB ABABABABABABABABADABCBABABABCBABABCDADABABADABABABABCBABCBABCBABABABA BABABABCBCBABADADABABCBCBABABADABCBABABCBABABCBADABADABADABABABABABAD ABABABABADABABABABCBABABABADABABABABABCBABABABABCDABABABABADABABABCBA BABABCBABABABABABADABABABABABABABABABABABABADABADABABADABABCBABABABAB ABABABABABABABCBABABABABABABABABADA$15BD11BD4BD15BD2BD4BD2BD6B3D5B3D 10BD6B2D2BD4BDBD3BDBD6BD6BD5BDBD6BD5BDB2D3BDBD8BD9BD4BD5BD16BD6BD11BD 2BD8BD11BD8BD5BD3BD12BD19B2D2BD5BD2BD2B$ABABABABCBABABABABABABABABABC DADABADCDABABABCBABABABADABABABADABABABABABABABABCBADCBABABABABABABAB ABABABABCBABCBCBABABABADABABCBABABABABABABCBCBCBADABCBABABABABABABADA BABABABABCBABABADABABCDABABABABABABABABABABABABABABABABABABCBABCBABAB ABABCBABCBABABADABADABABABCBCBABABABABADABCBABABCBABABABABADABABABABA BABABABA$BD3BD9BD5BDBDBD4BD11BD6BD4BD15B2D17B2D14BD2BDB2D13BD2BD6BD3B D4BD8BDBD3BD7BD7B2DB2D10BD8BD4BD4BD15B2D10BD2BD3BD12BD2BD2B2DBDBD4BD 14BD6BD6BD3BD2BD3B$CBABADADABADABCBABABCDABABABABABADABADCDABCBCDCDAB CBABCBCBABABABADCBCBABABCBCBABABCBABABABABADABABADADADADCBABABABABCBC BABABADABCBABABABABCBABABCBABABABABABABABCBABADCBABADCBABCBABADABABAB ADABCBABABADABABABABABABADCBABABABABCBABABADABABABABABABABABABCBCBABA BCBCBABABADABABCBADADABABABABABADABADABABCBABABADADABABA$5BD11BD5BD6B D3BD11BD2BDB2DBD16BD5BD17BD9BD4B2D4BD7BD7BD6BD14BD21BD10BD7BD2B2D3BD 5BD16BD4BD3BD6BD4BD2BD4B2D9B2D2BDBD2BD7BD8BD3BD11BD4B$ABABCDCDABADABA BABABABCBABABABCBABABADABABCBABABABCBCBCBABABABADABCBCBCBCBADABABABAB ABCBABABABCBCBABABABADABABABABABABABCBABABABABABADCBABABABABADABCBABA BCDABABABABCDABCBABABABABABABABABABADABABABABABABABABABADABABABABABAB CBABABABADABABABABABABABADCBCBCBABADABABADABADABABCBCBADCDABCBABABABA BADABABABABABABABABABA$3B2D7BDBD5BD5B2D25BDBD21BD18BD3BD5BD20BD2BD5BD 2BDBD7BD30BD4BD16BD2BD7B2D5B2D4BD5BDB2D10BD3BD9BD9BD21BD4BD6BD8B$ABCB CBABCDABABABABABABABABABABADABABABABABABADABABABABABABABADABADCDCBABC BABABABABABABABABABCBABADABADCBABABADABABABABCBABCBABABCBCBADABABADAB ABABABABABABCBABABABADADABADABCDABABABABADABABABABABABABABABABABCBABA BABCBABCBABCBABABADABADABABABCBABADCBABABABABABABABABCBABABADADABABAB ADABCBABCBABABABABADABABABCBADABA$8BD3B2D4BD5BD18B2DBD10BD12BDBD6BD8B D6BD6BD7B2D18BD10BD2BD8BD13BD6B2D6BD3B2D17BD2B2DBD6BD24BD5BD22BD2BD8B D13BD9BD4B$ABABCBABCBABABABCBABABCBCBCBABCBABABABABABABABABABADABABAB ABABABABABABABABABABABABABADABABABABABCBCBABABABABADABABABABABABABABA BABABABABABABABABABABABABABABABABADABABABABADABABADABABADABABCBABABCB ABCBCBABABABABABABADABABABABABABABADABADABABABABABABABABADABABABCBABA BABABABABABABABABCBADABADCDABABABABADABADCBADABA$6BD6BD2BD45BD9BD6BD 6BD3BD7BD12BD22BDBDBD5B2D7BD2BD24BD13B2D4BD3BD13BD8BD11BD2BD7BD16BD4B DBD14BD2BD3BD2BD6B2D4B$CBCBABCBADABCBCBCBCBCBABADABABABABADABABABCBAB ABABADABABABABCBADABABABABCBABABABABCBABADCDABABCBADABABABABABABCBABA BABABABCDADADCBABABABABCBABABABABCBABCDCBABABABABABABADADABABCBABABAD ABCBABABABABCBCDABABABADABADABABABABABADABABABABABADABABADCBABABABABA BABABABABABABABABABABCBCBCBADABABABADCBABABABABABABCBABCBABA$13BD4BD 4BD11BD2BD3BDBDBD11BD12BD5BDBD5BD4BD8BD4BD2BD2BD3BD10BD3BD3B2D10BD6BD 6BD8B3DBD4B2D4BD12BD10BD4BD7BD7BDBD3BD8BDBD5BDBD11BDB2D2BD8BD5BD7B2DB D11BD3B$ABABABCBABADADABCBABABABABABADABABABABADADCBABADABABABABADABA DABABCBABCBABABABABABABCBABABADABABABABABABCDABADABCBABABABABCBABABAD ABCBABABABABABCBABABABABADABABABABADABABABABABABABABABABCBABCBABADABA BABCBCDCBABABABABABABABABABABADABABABABABCBADCBCBADCBABABADABABABABAB ABABABADADABADCDCBABABABABABABCDCBADABABABCBA$13BD2BD4BD2BD2BD5BD5BD 4BD4BD12BD19B2D4BDBD16BDBD5BD5B2D9B2D2BD8BD2BD3B2D8BD5BD9B2D3B2D21BDB 2D13BDBD10BDBD2BD3BDBD3BD2B2D3BD5BD5BD24BD3BD12B$ABCDABABABABCBCBABAB ABADABADABABCBABABABADCBCBABADABABABCBABABABABABABABABABABABABABABABC BCBABABABABABABABCBABABABABCBABABABABABABABCBABABABCBABABABABADADABAD ADABCBCBADABABCBABABABABABABCBADABABABCBABABABABABADABABADADABABABCBA BABABABABABABADABABABCBABABABABABABADABABABABABABADADABABABADABADABCB ABABABABABABADABA$3BD14BD5BD10BD18BD7BD8BD13BD2BD9BD4BD3BD3B3D4BD15BD 4BD2BDBD5B2D4BD28BD4BDBD11B2D11BD8BD7BD2B2D8BD17BD2BD3BD8BDBD2BD3BD 14BD6BD$ABADABABABADABABABADABABADCBABABABADABCBABCBABABABCBABADADADA BADABADADABCBABABABABABADABABABCBABADABABCBABCBABABADCDABCBABABABABAB ABCBABABABABADABADCBCBABABABABABABABABCBADABABABABABABCDABABABABABABA BABABABCDABADCBABABABABABABABCBABABABABABCBABABABADADABABADABABABABAB ABABADABABABABABABABABABCBABADABADCBADABCBCBA$23BDBD2BDBD3BD8BD5B2D5B D2B2D2BD3B2D3BD15BD10BDBD11B2DB2D6BD2BD6BD5B2D5BD2BD3BD9BDB2DBDBDBD3B D7BD4BD5BD6BD9BD20BD8BD7BDBD16BD9BD12BD2B2DBD3BD4B2D3B$ABABADABABABAD ABCBABCBABABABABADCBADABABCBADABABABABABABCBABADCBABABABABABADADADABA DABABABABABADABADABABABADABABABABCBABABABABABABABABABABABABCBCBABADAB ABABABABABABABABABABADCDADABABABABCBCBABABABADABABADABABABABCDABABADC DABCBABABCBABABABABABCBABABABABADADABABABABABABCBABABABCDABCBABADABAB CBCBABCBCBABABABABABABA$10BD8B2D4BD2BD6BD3BD7BD4BD7BD13BD4BD16BD39BD 12BD8BD5BD6BDBD18BD12BD3BD6B2D25BD5BD5BD2BD19B2D11BD5BD4BDBD2BD5B$ABA BABABABABABABABABADABABABABABABABCBABABABABABABABABABABABABABADABABAB ABABABABABCDABABABABCBABABABADABABABADCBABABABABADCBABABABABCBCDABCBA BABABABABABABADABABCDABABCBCBABABABABABABABABABABCBCBABABABABABABABAB CBABADCBABABABABABABABCBABABABABABABABABABABABABABABABCBCBABABABABABA DCDABABABABABABABABABADADADABABABA$10BD2BD4BDBD4BD3B2D2BD10BD9BD7BD2B D8BD13BDBDBD2BD28BD15BD5BD2B2D10BDBDBD15BD2BDBD2B3D2BD10BD9BD6B2D7BD 2BD9BD5BD8BDBD14BD14BD7BD6BDB2D3B$ABABABABABABABABCDABABCBABABCBABABC BADADABABABABABADABABABADABABADABABABABADABABCBABCBABABABADABABABABAB ABABADABADABCDABABABABABABABABABADADCBADABABABABABABABCDABAFCBCBABABA DABABABADABABABABABABADABABABCBCBADABCBABABABABABABCBABABABABABABABAB ABABABABABADADABABABABADCBCBCBABADABABABCBCBABABCBABABADABABABABABABA BA$BDB3D7BD8BD5B2D3BD5BD4BD2BD4BD5BD5BD2BD2B2D3BD19BD3BD3BD5BD2BD14BD 15BDBD6B3D3BD4BDBD13BD6BD14BDBD7BD6B2D5BD5BD2BD5BD3BD5BD14B2D8BDBD30B 3D2B$CBABABABABABABABABCBABADABCBABADABCBCBADABABADADABABABABABCBABAB CBCBABCBABABCBABABABABCBADABABABABABABABABABABABABABABABABABCDADABCBA BADABABABABABABABCBADABABABADABCBCDABABABABABCBCBABABABABCBABABADABCB ABABADABABCBABABABABABADABABABABABABABABABCBABABABCBADABABCBADABABABA BADABABCBABABABABABCBABCBCBABABABABABABADA$7B2D15BD7BD3BD21B2D8BD14BD 10BD17BD8BD4BD4BD6BD5BDBD2BD7BD4BD12B2D3BD9BD6B2D4BD8B2DBD3BD5BD3B2D 7BD18BD9B2D9BD10B2D2BD19B$CBABABABABCDCBCBCBABABABADCBADABABABCBCBABA BABABABADABADABABABABABABCBADABABCBCBABABCBCBABABCBADABABABABABCBABAB ADABCBCDABABABCBABABCBABABABABABABABABABABCBABABABCBABABADABADABABABC BABABABABABABABADABABCBABABABABABADCBABABCBABABCBABABCBABCBABABADABAB CBABABCDABABABABABABABABADABCBABCBABABABABADABABADCBCBABADCBCBA$D3BD 4BD8BD3BDBD9BD19BD2BD2BD10BD3B2D9BD9B2D2BD5BD8BD3BD7BD5B2D4BD5BDBD9BD 7BD6BDBD9BD19BDBD2BD5BD6BD3BDBD6BDBD8BD13BD2BD2BDBD6BD2BD24BD9B$ABABC BCBADABABABABABABADABABCDABADABABABABABABABABABABABABABABABABADABABAB ABABABCBABABABABCBABABABABADABABABABABABADABABABABABABCBABABABCBCBABA BABABABABABABABABABCDCBCBABABABABABABABABADABCDABABCBCBCDABADABABABAB ABADADABABABABABABABCDABABABABABADCBABABABABABABABABCBABADABABABABABC BABABABCBADABCBABABCBABCBABCBABA$10BD7BD10BD4BD4BD5BD2BDB2D3BD8BD20BD 5BDBD10BD7BD4BD9BD6BD3BD3BD4BD11BD2BD2BD4BDBD7BD12B2D5BDBD8BD15BD6BD 5BD6BDBD2BD18B2DBDB2D7BDBD3BD2BD9BD6BDB$CBABABABABADABADABABABCBABABA BABCBABABCBADABABABABABABABABCBADABABABCBCDCBABABABCBCBABABABCBABABAB ABABABABADABABCDABCBABABABCBABABABABABABABABADABABADABCDABADABABABABA BABABABABCBABABABCBCBABADABCBABABABABABCBABCBABABCBABABABABCDCBCDABAB ADABABABABABADABABCBABABABABABADCDABABADCBCBABABABABADABABABABABABADA BABABCBA$BD3BD10BD5BD8BD11BD2BD2BD4BD18BD2B2D8BD3BD2BD10BD9B2D4BD4B2D 21BD2BD16BD2BDBD9BD9B2D21BD13BD10BD32BD5BD3BD9BD3BD3B2D7B2D$ABABABABA BADCBCBCBABABABABABABABABCBABABABADADABABADABABADABABABABCBABABABABAB ABADABCBABABABABCBABCBCBABABABABABABABABABABABABABABABABCDADABABABCBA DABABABABCBABABABADABABABABCBABABABABCDABCBABABABABABABABADABABADABAD ABCBABABABABABABABABABADABADABABCBADABABADABABABCBABCBABABCBABABADCDA BADABABCBADABABADADABABABCDA$6B2D4BD3BD4BD2BD8BD2BD2B2D5BDBD4BD15BD3B DBD10BD3BD21BDBD9BD4BD4BD9BD19BD27BDBD9BD7BD6BD2BD2BD9BD5BD4BDBD3BD3B D24BD9BD8BD12B$ABABCBCBABABABABABABABABABABABABABCBADABCBADABCBABADCB ADABABABABABADABABABCBCBABABABADABABABABABABABABCBABABABABABADABABABA BCBABABABABABABADABABCBABCBABABCBABADABABABABABABABABABABADADABADABAB ABABABABABABCBABABCBABABADABABABABABABCBADABABABABABABABABABABABABABA BABABABABABABABABADABABABCBABABABABABCBCBABABABCBABA$5B2D22BD8B2D2BD 2BD4B2DB2D15BD3BD3BD26B2D10BD8BD2BD7BD3BD14BD7BD9BD12BD3B3DBD9BDBD2BD BD3BD13BD2BD2BDB2D10B2D2B2D8BD9BD7BD5BD3BDBD4BD5B2D2B2D2B$ABABABABABC BABABABABABABABABABABABABADADCBABABCBABABADABCBABCBCBABADABABABABABAB ABABABABABCBCDABABADADCBABABABABADABABABADABABABCBADABABABABABABABABA BABABABABADCBABABABABABABABABABABABABABABABCBADCBCBCBABABCBABABABABAB ABADCBABABABABABABABADCBABABABABADCDCBCDABABADABCBADCDABABABABABABABA BABABABABABABABADABABABABA$BD13B2D13BD6BDBD7B2D4BD4BD2BD14BD5B3D8BD 10BD6BD3B2D17BDBD2BD2BD8BD5BD10B2D3B3D10BD5BD3BD10BD10BDBD2BD10BD10B 2D8B2DBD3BD5BD7BD6BDBD9B2D6BD8BD$ABABABABABADCBADABABABADADCBABCBABAB ABABABABABABCBCBABADABABADABABABABABCBCBADABABABCBABABABABADABADABADA DABABABABABADABABABABABABCBABABABADABABABABABABABABCBABABABABABADABAD ABABCDABCBABABABABABABCBABABADCBABABABABABABABABABCBADABCBABABABABADA BABCBABABABADABABABABABCDABABABABABABADABABCBABABABABCBABABADADABABAB A$5BD2BD24B2D6BD14BDB2D6BD6BDB2D11BD8BD11BD6BD9BDBDBD16BD15BDBD13BD8B 2D12B3D2B2D3BD5BD2B2D8BDBD2BD2B2D24BDBD22BD2BD6BD9BD2B$ABCBABABABADAB ABADABADABABABABABABABABADABADABCBCBABABABABABABABABABCBADABABABCDABA BABABABABABABCBABCBABCBABABCBADABABABCBABABCBABABABADADCDCBABABABCBAD ABADABABABABABCBABABCBABADCBABABABABABADABABABABCBABCBABABABADABCBABA BADABCDCBCDABCBABABABCBABADABCBABABABABABABABABADABADABABABADCDABADAB ABABADCBABABCBABABABADA$19BD10BD6BD3BD4BD8BD2BD6BD27BDB2D2BD5BD4BD28B D4BD2BD4BD8B4D3BD8BD12BD28BD2B2D4BD3BDBD8BD10BD2BD2BDB2D7B2DBD8BD3BDB D6BD3BD8B2D2B$ABABABABABABABABABCBABABABABADADABABABABADADABABADABABA DABABABABABADADABABABABABABCBABCBABCBABABABABABABABADABADCDABABCBABAB ABABADABABABABCBABABABABCDABABABABADABABABABABADCDADABABCBABABABABABA BABABABABADABCBABABCBCBABADABABABABABCBABABABABABABABADCBADCDCBADABAD ABABABABABABABABCBABABABABABADABABADABABCBABABABABA$D2B2DB2D13B2D3BD 6BD3BD2BD6BD5BD9BD3BD9BD2BD5BDBD14BDBDBD2BD3BD10BD3BD3BD7B2D2BDB2D15B D2BDBD11BD4BD7B2D5BD6BD29BD3B2D15BD15B2D2BD7BD13BD5BD4BD$ADCBABABABAB ABADADABCBABCBABCBABABABABABCBABABADABADABABADABADABADABABABADCBADABC BADABADABABABABABABABADABABABABADADABADADCBCBABADABCBABABABABCBABABCB ADABABABABABABABADADABABADABABCBABABABABABABABABABADABABABABABADABCBC BCDABCBABABABABABCBABABABABABABABABABABABABABCBADABADABABCDABABABCBAB ABCDABABADABABCBCBABABABA$BD3BDB2D6BD6BDBDBD4B2D3B2D9BD3BD7BDBD2BD3BD 3BD7BD2BDBDBD2B3D6BD3BD7BDBDBDBD3B2D21BDBD3BD15BD3BD10BD19BD11BD2BD7B D14BD8BD3BD6BD29BD4BDBD3BD12B$ABCBADCBABCBABABABABABADCBABABABABCDABA DABABABABABABABABABADADCBABABABABABABADABABABABABABABABABADCBABABABAB ABABABABCBABABABABCBCDABABABABABABABADADCBABABABABABABADABADABCDABABA BABABABABADABABABCBABABADABABABABCBCBABABABABABABCDABABABABABABABABAB ABABABABABABADCDABABABABABABADABABABADABCDCBABABABABADABCBABABCBABC$ 6BD5BD12BD10BD2BD7BD3BD2BDBD4BD2B2DBD13BD12B3DBD6B2DBD11B2DBD3BDBD2BD 3BD18B2D5BD3BD8BDBD2BD4BD2BD8BD4B2D8BD2BD3BD10BD18BD9BD10BD3BD2BD5BD 2BD10B2D11BD2B$ABABABABABABADABABADABABABABCBABABABABABABABABABABADAB ABABABABABABABABABABABABABCDABABABABABABABABABABADABABABABCBABABABADA BABABABABABABABABABABABABABABABABABABABABCBABABABCBABADCBABABABABCBAD ABABADABABABADABABADABABCBABABCBABABABCBCBABABCDABABCBABADABCBABABABA BABABCBABABABABABABADABCBABABADABABABABABABABABABABA$BD2BD4BD2BD2B3D 4BD11BD3B2D7BD5BD3B2D3BD6BD5BD4BD15BD3BD9BD6BD10BDBD13B2D7BDB2D13BD2B D9B2D2BD4BDBD10BD2BD10BD3BD3BD8BDBD4BD4BD8BD2BDBD3BDBD7BD3BD19BD7BD2B DB$ABADABCBABADABCBABCBABABABADABABABABABABABABABADADABCBABABABADABAB ADABABABABCBCBCBADABABABABADABCBADABABABABABABABABABABABABABABABABCBA BABABABABABABCBABABABABADABCBABABABABCBABABADABABABABCBABABABABADABCD ABABABABABABABABABABABCBADABABADABABABADABCDABADABABABABABADCDABABABA BADABABABABABABABCBCDABADABCBCBCBABADABC$BD9BD3BD7BDBD5BDBD7BD2BD6BD 5BDBD9BDBD5BDBDBD3BD5BD2BD2BD3BD7BD3BD10BD6BD6BD9B2D2B3D8BD2BDBDBD4BD 3BD12BDBD12BDBD7BD12BD8BD11B2DBDBD18BD14BD13BD2BD3BDB$ABABABABABADCBA BCBABABABCBCDABABCBABABCBABABABABCBCBABABABABCBABABABABABABABABABABAB CBADADCDABABABCBABABABABADADABABABABADCBABADADADADABABABABADABABABABA BABABABABABABABABABADABABABABADABABABABADABABABABABABABCBADCDABABABAB ABABABABABABABABABCDABABADABABABCBABCDABABABABABABABABADABABABABCBABC BABABABABABCBABABCBCBA$9B3D10BD7BD6BD19BD5BD3BD4BD2BDBD3B2DBD4BD6BD6B D2BD13BD6BD10BD14BD4B4DBD12BD19BD4BD15B3D2BD2BD11BD7BD2BD6BD3B2D29BD 6B2D14B$ABABABABABABABABCBABABABABCBADABABABABCBCBADABABABCBADABABCBA BABCBABABADABCBABABABABABCBABABABABADCBABABABABABADCBABABADABCBABABAB ABABADABABABABABABADABABABCDABABCBABABABABABABADABCBADABADABABABABABC BABABABABABABABABABABABADCBCBABABABABCBABABABABADADABCBABADABADADABAB ABADABCBABABABABADABABADCBABADABABABABABCBABA$9BD3BD16B2D6BD14BD2B3D 6BD8B2D4BD15BD2BD5BDBD2BD3BD3B2D4B2D13B2DBD7BD2BD9BD11B2D5BD22BD8BD 11BD6B2D10B2D7BDBD6BD9BD4BD3BD4BD4BD2BD16BD$ADABABABABABCBABCBABABABC DABABABABCBCBABADABABABABABABABCBABABABABADABABABABABABCDABABABABABAB ABABABABABABABABABABABABABABABABABCBCBABABABABABABABABCBABABCBCBABCBA BCBABABABCBABABABABADCBCBABABABABABABABABABADCBCDADABABABABADABADCBAB ABADABABABABABABADCBCDABADABABABABABABABADABABABABABCBABABABABABABABA BABABCDABADA$7B2D2B2DB3D16BD26BD9BD9B2D12BD11BD3B2D22BD2BD14BD6B2D3BD 5BD2B2D13BD8BD4BD5BD5BD2BDBD9BD5BD23BD4BDBD3BD15B2D2BD12BD2BD2BD2BD$A BABADABCBABABABABABABABADABABABCDADABABABABABABABABABABABABABADADABAB ABCBABABABABABABADCBCBCBABABABCBCBCBABCBABADABABABADABABCBABABADCBABA BADABABABABCBABABABABABABABABABABABCBABABABABABCBABABABABABABABADCBAB CDABABCBABCBABADABADABABABCBABABABABCBABADCBCBABCBABABABABCBABABABABA BABABABABABADABABADABABABABABABABABA$5BD2BDBD4BD2BD3BD15BD9BD5BD6BDBD 8B2D4BD11BD5BD2BD9BDBD5BD10BD3BD11BD5B2D6BD4BD6BDBD6BD11BD2BD7BD8BD6B D5BD8BD4BD10BD2B2D3BD23BD4BD2BD8B2D4BD3BD4B$ABABABCBABCBABABABABABABC BCBABADABCBABABCBABCDABABABCBCBABABABABCBCBABABADABABCBABABABABADADAB ABABABCBABCBABABABABADABCDABADCBADABABABABABABCBABADADABCBABADABABABA BABCBADCBABCBADABABABABABABABADADABABABABCBABABABABADABABABABADABABAB CBCBABABABABABABABABABABABABABABABABABABADADABABABCBABABABABABADABABA BABABABABABA$4BD2BD4BD5BD35BD6BD5BDBD9BDBD2BD6B2D5BD5BD5B2D9BD5BDB2D 3BD11BD3BDBDBD4B3D15BD2BD5BDBD4BD14B2D2BD2BDBDB2D2BD10BD3BD4BD3BD11BD 5BDBDB2D9BD5B2D4BDBD6BDBD9B$ABABABADADADCBABABABABABABABABADABABABABA DCBCBABCDCBABABADABABABABABABABABABADABCBADCBABABABCBADABADABABABCBAB ADABABADCBABABABABCBCBADABABADABABABABABABABCBABABABABADCBABABABABABA BCBABABABABADABABCBABABABADABABADABCBCBABABCBCBABABABABADABADABABCDAB ABABCDABABABABCBADABABABABABABCDABABABABABABABCBABABABABADCBADABA$2BD 3BD9BDBD4BD7BDBD13B2D9B2D7BD2BD15BD3BD2BD7BD3BDBD8BDBD6BDBD10BD6BD13B D4BD3BD10B2D6B2DBD3BD5B2D7BD9BD11BD19B3D3BD2BD13BD6BD2BD2BD6BD3BD7BD 6B$CBADABADABCBABABABABABABABCDADABCBABABABADABABABCBADABABABABABABAD ADABABCBABABABABCBABABABCBABABABCBCDABABABABABABABABABADABABABABABABA BADABABABCBCBABABCBABADABABABABCBABABABCBABABABADADABCBABABADCBABABAB CBABABABABABABABABABABABABABABADABABABABABABADABABABCBABABABCBABCBABA DABADABADABABCBCBADABABABABABABABABCBABA$3BDBD3B2D3BDBD4BD5BD6BD3BDBD 7BD8BD2BD2BDBD4BD4B2D3BD11B2D4BD12B3DBD3BD2BD5BD4BD3BD2BD2BD6BD5BD3BD 3BD5BD5BD2BD2B2D2BD3BDBD7BD9BD8BD11BD3BD2BD5BDB2D2BDB2D8BDBD2BD4BD6B 2D3BD4BD5B2D16B$CBABADABABABABABCBCDABABABADABABABCDABABABABABABABABA BCBABABADABABADABABABCDABADCBABABABABABCBADABABABABABABABABABABADCBAB ABABABABABABADABABADADABABADABABABABABCBCBABADABABABADABCBADABADABABA BABABABCBABABADABCBABABADABABCBABABABABADABABABABABCBABABABCBABABCBAB CBABABABABABABABABABABABABADABABABABABABABABABABADABA$4BDBD2BD4BD4BD 2BD7BD3BDBD12BD2BD4BD5BD7BD19BD24BD8B2D6B4D4BDBD4BD7BD6B2D21BD3BDB2D 2BD2BD3BD15BD10BD9BD7BD6BD4BD3BD9BD3BD3BD11BD18B$ABCBABABABABCBCBADAD ABABABABADABABCDABABCBABABCBABABABCDABABABABABABADABABABCBABADCBABABA BABABADADABABABABCDADCBABABABABABABABABABABCBABABABABABABABABCBCBABAB CDABABABADABABABABABABABABABADCBABABCBABADCBABABADABABABADABABABCBABA BABABADABABCDABCBABADCBABABABABABABABABCDADABABABABABCDABABABABABABAB CBABABABABABABADC$12BD2B2D3BD7BD36BD4BD25BD3BD7BDBD11BD2BD9BD6BD7BD9B D2BD7BD7BDBD6B2D6BD2B2DBD9BD3BD3BD9B3D5BD5BDBDBDBD5BD5BDBD3BD5BDBD5BD 6B2D7BD13BD$CBABADABABABABADABABABABADADABCBABCBADADABABADCBABABABABA BABCBADABCBABABABCBADCBABCBABABADABABABABABABADABCBABABABABABADABADAB ABABABADABCDABCBABADADABABADABABABABABABABABABCBADADADABABADABCBABABC BABABABCBABADABABCBABABCBADABABCBCBADABCBABABABABABABCBABCBABADABABAB ABABABABABABCBABABABABCBABCBABABABABADABCDABABABA$5BD2BDBD11BD10BD7B 2D7B2D11BD11BD3BD12BD3BD3BD6BDBDB2D7BD9BD10BD4BD10B2D4BD4BD5B3D2BD31B DBD3BD10BD10BD5B2D19BDBD3BD5BD3BD6BD8BD12BDB$ADCBABABCBABABABABABABCB ADABABABABABABABABADABABABABABABABABABCBABABABABABCBCDCBABABABABADABC BABABABCDABCDABADABABABADADABABABABADABCBABADABABABABABABCDABABCDABAB ABADABABABABABCBABABABADABABADCBABABADABADABABABCDADCDABCBABCDABABABA BABABCBCDABABABABABABABABADABABABABABCBABABADABADABABABABABABABABABAB CBABABADABABA$26B2D4BD8B2D5B2D2BD2BD5BD7BD4BD13BD8BD9B2D7BD2BDBD4B2D 7BD7BD9BDBD8BD4BD3BD8BD5BD11BDBD6BDBD36BDBD2B2D3BD5BD21B2D12BD4BDB2DB D2B$ABABABCDABADABABABABABABABABABCDABABABABABABABABABABCBABABABABCBA BCBABABABABABADABCDABABABABABABABCBABCBABABCBADABABABABABABABABABABCB ADABABABABABABCBABABABADABABABABABCBABABABABABABADABABCDABADABABABABA BABCBABABABABADCBABABABABABABABADABCBABADABABCBABABADCBCBABABCDABABCB ABADABABABABABADABABCDABABABADABABABABABA$9BD4BD8B2D10BD11B3D19BDBD 17BD8B2D9BDBD3BDBD4BD13B2D5BDBDB2D9BD3BD14BD12BD13BDBD8BD12BDBD6BDBD 3BD15BD12BD2BD6BD3BD12BD3B2D3BD2BDB$ABCBABABABCBABADABABCBABABABADABA BABABABABABABABCBCBABABADABADADADADABABADABABABADABABABABABABABABABAB ABCBABADABABABABABCBABADABADABADADABABABCBABABABABCBABABABABABADCDADA BABABABCBADABABABABABABCBABABADABABCBCBCBABCBCBCBADABADABABABABABABAB ABCBABADABADABABABABABABCBABCBABADABCBADABADABABABABCDABABABABABABCBA BABA$2BD5BD2BDBD3BD15BD27BD6BD2BD6BD8B2D5BD4BD8BD3BDBD5BDBD4BD3BD17BD 6BD3BD3BD4BD5BD6BDBDBD4BD10BD3BD6BD7BD3BD4BD2B2D7BD4BD8B2DB2D10BDBD 18BDBDBD11BD4B$CBADABABABABABABABABCBABABABABABABABABABADABABABABABCD ABABABCBCBABADABABABABABABABCBCBABABABABABABABABABCBADABABABABADADADA BADABABABADABCBCBABABCBABCBABABABCBABCBABABABABCBABABADADABADABABABAB CBABCBCBCBABCDCBABABABADABCBADABABABABABADADABABADABADABABABABABABABA BADABABABABADCBABABABABABADABABABADABABABABADABABCBA$D5BD11BD11BD2BD 8BD4B2DBD3BDBD16BDB2D6BD3BD20BD3BD4BD10BD5BD2BD7BD5BD2BDBD7BD4BD5BD5B D2BD5BD20BD15BD2BD11B2D3BD16BD4B2D2BD6BDBD8BD6BD8B2D4B$ABABCDABABABAB ABADADADABABABADABABADCBABCBABABCBABABABABCBABCBABCDABABABABABABADADA BABABABABCBABABABABABABABABABABABABADABABABABABADABABABABABABABABABAD ABABABADABCBABABADABABABADABABADABABABABABADABABABABABCBABABABABCBABA BABABADABCBABCBCBCBABABADABCBABCDABCBABABCBADADADABADCBADABADABABABAB ABABABCBABABCBABABABADC$4BD12BDBDBD5BD22BD7BD11B2DBD5BDBD7BD18BD3BDBD 3BD5BD4BD3BD10BD6BD6BD12B2D14BD7B2D15BD4BD2BD2BD2BD7B2D8BD11BD5BD15BD B3D5BD2BD15BDBD2BD$CBABABCDCBABABABABABADABADCBABABADABCBABADABABABAB CBABABADCBABABCBABADADABABABABABABABABADABADADABADABABABABABADABABABA BCDABABABABABABABABABABABADABCBABABABABABABABABCBABABABABABABABABABAB ABCBABCBADCBADADADCDABABABADABABCBADABABCBABABADABABADCBABCBABCBABABA BABCBABABCBADABABCBADABABADABABABADABADABADADABABABABADC$7BD6BD9BD2BD 2BD3BD21BD6BD4BD4BD14B2D12BD2BD2BD7BD8B3D4B2D5BD20BD6BD9B2D17BDB2DBDB D2B3DBD3BD27BD2BDBD4BD5BD12BD21BD7BD11B$CBADABABABABABABABADABABABADC BABABCBABABABABCBADABABABABABCBCBABABABADABADABABABABABABABABABABABAB ABABABABABCBADABABCBABCBABABADCBABCBABABABABADABCBABADCBABABADADABABC BABABCBABCBABABABADABADCBABABADABCBABCBABADABABABABABABABADCBABADABAB ABCBCBABABABCDABADABABABABADADABABCBCBABABADABABABABADADABABABCBCDADA BCBADABA$D11BD3BD8BDBD3BD4B2D3B2D2BD10BD3BD6BDB2D10BDBD12BD5BD4BD13BD 13BD10BD20B4DBD17BD9BD5BD11BD4B2D4BD10BD10B2DBD16BD12BD5BD8BD2BD8BDB$ ABABABADABABABABADABABABABABABABABABABABCBADABADCBABABABABABABABABADA BADABABCBADABABABCBADCBABCBABADABABABABABABABABCBABADABCBCDABABABCBAB ABADABABABABABABABABABABABADADABABADADABCBADABABABCBABADABABCBABABABA DABADCBCBABABABCBABABCBABADCBABABABABABABABCBABADCBABADCBABCDABCBABAB ABABABADABABABABABADABCDABABABABABCBA$6BD14BD3BD4BD4BD14BD5B2D3BD22BD 15BD5BD3BD7B2D8B3DBDBDBD8BD2BD3BD2BD8BDBD31BD19BD7B2DBD7BD3BD12B2DB2D 6BD3BD11BD4BD3BD5BD5BD7BD2B$ABADABADABABCBABABABABCBABABABABABABABABA BABABCBABABABABABABABABABABCBABADABABADABABABABABABABABABADABABABABAB ABCDABCBABCDABCBABABABABABCBADABABABADADADCBABABABABABABABABCBABABABA BABABABABABCBABABABABABADCBABABABCBABABABABCBABABCBABCBCBCBCBABABABAB ABADABABCBABADABABADABABADADABABABABADADABABABABADABADCBABABADCDA$14B D5B2D13BD12B2D3BD3BDBD4BD5BD3BD8BD23BD12B2DB2D13BD6BD10B2DBDBD5BDBD 13BD8BD10B3D2BD3B2D3BD5B2D4BD25BD15BD4BDB2D11BD6BDBD12B$ABABABABABABA BABABCDCBCBADCBADABABADABABABABABABABCBABCBABABADABABABADABABABABCBAB ADCBABABABABABABABABABADABABADABABABABABABADABABABABCDADABCBABABABABA BABABADABADABADCBABABABABADABABCDCBCBABABABABABABABABADABCBABABABABAB CBABCBABABABCDABABADABABABABABCBABABCBABCBABABADABABABABABCBABABABABA BADCBABABABCBABABABADABC$14BD3BD4BD5B2D44BD8BD3BD7BD2BD2BDBD8BD3B2D2B 2D10BDBDBD2BD3BDB2D16BD3BD3BDBD5BD2BD3BD7BD2BD39BD6BDBD3BD2BD6BD9BDBD 6BD6BDBD12BD10B$CBCBABCBABABABADABCBABABABCBCBABABCBCBABABABABABADCBA BABABABABABABABCDABABABCBCBCBABABABCBABCBABCBABABABCBABCBABADABABADAB ABABABABABADADABCBADABABABABADADADABABABADABABABABADABCBABABCBADABADA BABABABABABCBABADADABABCBABABABABABABABABABABABADABABABABABABABABABAB ABABADABABABABCBABABABABABABABABABABABABABABCBABABABA$8B2D8BD3BDBD7BD 5BD5BDBD9BD4BD2BD4B2DBDBD15BD2BDBD16BD23BD9BD12BD4BDBD3BD8B2D5BD5BD6B D4BD7BD4BD4BD5BD6B3DBD6BDBD5BD7BD9BD2B2D9BD7BDBD12BD3B$ABABABABABADAD CDABABABABABABCBABABABABABABADADCBABABABABABABCBADABABABCBABABABABABA BABABABADABADABABABCBABABABABABCDABABABABABABABCBABABABABADABADADABAB ADABADABCDABABABABABABABADABADABADADABABABABABABABCBABABABABABCBABCBA BABABABABABCDABABABABADABCBABABABABABADADABCBCBADABABABCDABCBABABABAB ABABCBABABABABABABABADA$31BD14BDBD8BD3BDB2D4B2DB2D12BD20BD3BD3BD3BD7B D4B2D4BD5B3D9B3DB2D4BDBD8B2D7BD6BD3BD3BD3BD5B3D3BD14BDBD6BD3BD12BD11B DBD2BD6BD3BD9BD7BD3BD4B$ABABCBABABABABABADCBABCBABADCBABABABABABABADA BABABABABABADABABABABADABADABADABABABABABADCBABADCBABCDABABABCBCBABAB ABABADABCBABABADABABABABCBABABABADABABCBABABABABABADABABCDABABABABABC BCBABADADABABCBADABCBABABABABABABCBABABABABADCBADABABABCBABABABABCBAB ABABADCDABABADCBADABABCBABADCBABABABABABADABABABABABABCBABABA$3B2D15B 3D10B2D2B2D14BD9BD6BD2BD2B2D20B2DBD2BD8B2DBD25BD12BD3BD8BDB2D4BD4BD 10B5D3B2D2BD44BDBD5BD2BD5BD3BD2BD7BD13BD16BD$ABABABABADABCBABCBABABCB ABADADABABABABABADABADABCBABABABCBABABABABABABABABABABABADABABABABABA BADABABABABCBABABCBCBADABABABABABABABABABABABABCBABABABADABCBCBABABAB ABABABABABABABCBABABABABADABABABABABABABADADABABABABCBADADCBABABABADA BADCBADABABABABABABABABABABCBADABCBADABABABADCBABCDABABABABCBABABABAD ABABABADABABA$D8BDBDB2DBD5BDB2D4BD10BD23BD18B3D8BD2BD3BD2BD9BD2BD3BD 10BD16BD3BD3BD14BD6BD2BD9BDB2D2B2D11B2D11BD4BD2B3D30BD8B3D3BD4BD5BD2B DBDBDBD5BD5B$ABABADCBADADABABABCDABCBADADABABABABCBABABADABABADABCBAB ADABABCBABCBABABABCBABADABABCBABADABABABABADADCDABABABABADABADABCBCBA BABABABABCDABABABCBABABABCBABABCBABABABABABABABABABABABABCBABABCDCBAB ADABABABCBADCBCBADABCBABADABADABABABCBABABABCBABABABADABABABABADABABA DABCBCBABADABABABADABCBABABABABCBABADABABABCBADABA$2B2D3BD9BD6BD12B2D 2BD10BD8BDB2D2BD2BD3BD2B2D2B2DBD2BDBD3BD5BD28B2D9BD31BD5BD3BD22BD18BD 5BD5BDBD2BD2BD5BD5BDBD11BDBDB2D2BDB2D16BD4BD2BD7B$CDCBABABADABABCBABA DADCBCBABABABABABABABABADABCBCBABABABADCBADABABABABABABABABABABABABAB CDABCDABADABCBABCDABABABABCBADABABABABCBABABABABCBABABCBABCBABABABABC BABABCDABCDABCBABCBABABABABABABADCBABABABABCBABABADADABABCBADABABADAB ABABABABABABABCBABADABABABABABABABADABABABABABADABADABABCBABABABABABC BABCBCBCBABABABCBC$2BD7BD13BD9BD16B2D3BD7B2DBD2BD6BD2BD9BD5BD17BD7BD 2BD7BD14BD9BD8BDBD4BD10BDB2D7BD4BD2BD13B2D20BD9BD5BD5BD15BD8B2D7BDBD 3BDB2D6BD$ABCBABCDADCBABABCBCBCBABABABCBADCBABABADABABADABADABABABABA BABABABABABABABABADABABCBABCBABABABABABCBABCBADABABABABADCBABABADABAB ABCBCBABADABABABABABCBABABABADABABABADABABABABABABABABADABCBABABCBADA BABABABADABABABABCBCBABABCBABABABABADABABABABABABABCDABABABABABABABAB ABABABABCBABADABABABCBCBABABABABABABABCBABADABA$7BD3BD9BD3BDB2D4BDBDB 2D8BD6BD6B2D18BD11B2DBDB2D2BD11BD2BDB2D9BDBD5BD10BD7BD5BDBD7BD5B2D6BD 2BD7BD13BD8BD16BD3BD2BD6BD6BD5BDBD6BD3BD5BD6BD5BD8BD6B$ABABCBABADADAB ADABCBABABADABADABABABABABABABABABABABABCBABABABABABABCBCBABABABCBADA BABABADABABADABADCBABABABCBABABADABCBABABADABABABABCBCBABABABABADCBAB ABABABADABADABABCBABABABADCBABADABABCDABABABABABABCBABABCBCBABABABABA DABABABABADABABABABABCBABABABABABABABABABABABCBABABABABABABABABCBADAD CDABADABABABABCBABABABA$BD5BD7B2D4BD13BD7BD3BD11BD11BDBD10BD9BD7BD7BD 5BD15BD5BD9B2D7B2D6BD3BD5BD9B2D2B2D6BD14BD8B3D43BD6BD4BD3BD15BD12BD$A BABABABABABABABABABCBABABABABABABABABABABADABABABCBABABABABABCBABCBAB ABABABABABADABADABABABABABABABABCBABABABABABABCDABABABABABABABCBADABA BABABADABABADADABABABCBABABABABABABADABABABABABABABCDABABABCBABADCBCB ABABABADABADABABABABCBCBCBADABABCBCBABABABABABABABABCDABADABABABABABA DCDABABABADABABCBABABABABABABCBADADA$D2BD15BDBD7B2DBD5B2D12BD5B2D2BD 4BD3BDBD4BD3BD4BD13BD19BD2BD2BD5BD13BDB2DBD4B2D8BD6BD9BD3B3D3BD15BD2B D5B2D22BD10BD8BD6BD5BDB2DBD2BD4BD8BD7BDBD4B$ABABABABABABABABADABABCBA BCBCDABABABADABABADABABADABABABCBABABABCBCBABABCBADABCDCBCBABABABADAB ABCBCBABABADABABABABABABABCBABADCDABADABABABABABABCBABABABABCBCDADCBA BABABABABABABCBADADABCBABABABABABCBCBADABABABABABABABABABABABABABABAD ADABABCBABABCBABABABABCBABABABABABABABABABABCBABABABABABABABADCBABADA BABCBABABABA$BD3B2D5B3D4BD4BD9BD2BD23B2D31BD20B2D2BDBD3BDBDBD11BD10BD 7BD4BD6BD12BD3BD25BD2BD3BD3BD13BD28BDBD2BD9BDB2D11BDBD9BDB$ABCBABABAD ADCBABCBABABADABCDABABCBABABABABCBABABABABABCBABABADCBABABABABABABADA BABCBABADCBADABABABABCBCBABABABABADABABADABCBABABABCBABADADCDABABABAB ADCBABABADABABADABABABABABABADABABABABABADABABABABCBCBABABCBABCBABABA BABABABCBABABABADABABABABABCBABABADABABCBCBABABABABABABABABCBCBCBABAB ABABCDADADCBABABABABABCBABA$4BDBD6BD18BD4BD2BD9BD5BDBD6BDB2D6BD6B2D2B D5B2D7B2D11B2D2B2D5BD5BD6BD5BD10BD12BDBD10BD2BD14B3D18BD3BD3BD3B2D7BD 24BD16BD7B2D9BD10B$ABABABABABABCDADABABABABADCDABABABABCBABADCBADABAB ABABABABABADABABABABCBABABCBABABCBABCDABABABCBADCBABABABABABABCBABABA BADABABABCBCBCDABADABABABABABABABADABADABABABABABABCBADABABABABABADAB ABABABABADCBABABCBABABADADABCBABABABADABABADADABCBABABABABCDADABABABA BADABADABABADABABABABABABABABABABABABABCBCBCBABABABADABA$17BD7BD2BD9B D2BD9BD4BD6B2D3BD8BD7BD2BD18BD11BDBD19BD3BD9BD3BD3BD8BD4BD2B2D8B2D11B D6BD2B2D5BD9B2D3BD2BD6BD16BD2B2D9BD14BD3BD2BD8BD5B$ADABCBABADABABABCD ABADABABABABABABABCBADCBABABCBABABADADABADABABABABABADABABABCDCDADABA BABABABADABABCDABABADABABABABADABABADABADABABABABABADABABCBABABABABAB ABABCBABABABCBADABADCBABCBCBADABABABABABADABCBABABABABABABABABABABABA BABABABABCBABABABABADABABABABABCDADCDABADCBABABABABADABCBABABADABABAB ADCBABCBABABABCBABA$12BD4BD7BD2BD26BD7BD12BD5BD6BDBD4BD11BD3BD6BD23BD 5BD4B2D7B2D2BD34BDBD4B2DBD28BD10BD9BD10B2D5BD5BD9BD3BDBD6B2D2B$ABABAB ABABABABABADADCDADCDABABABCDABABABABADABABABADABCBABABABABABABABABABA BCBCBABCBABABABABABABABABABCBADABABABABABABABABCBABABABABABADABCBABAB CBADABABABCBABABABABABABCBABCDABADABABABABABABABABABABCBABABABCBABABA BABABABABABABABABABABADADABADADABABCBABADADCBABADABABABABABADCBABCDAB ABABABABABABABADABADADADABABABA$6B2D3BD7BD6BD13BD2BD4BDBD10BD6B2D9BD 2BD5BDBD11BD2BD11B3D3BD6BD3BD5BD5BD2BD7BD17BD7BD12BD5BD4BDBD3BD2BD7BD 5BD2B2D10BD15BD2BD4BDBDBD9B2D14B2D5BD6B$CBCBADABABABCBABCBABABADABADA DADCBABABCBABABCBADABABABABADADCBADADABABABCBABCDABABABABABADABCBADAB ABCBABABABABABABABABABABABABABABABABABCBABABCBABABABABABABABABADABCBA BABCBABABABABCBABABABABADCDABABABCBABABCBABCBABCBABABCBADCBABABABABAD ADABADABABADABADABABABABABABABABABABABABABABABCBABABABABABABCBABABABA BCBCBABA$BD3BDBD5BD4BD2B2D4BD5BD15BD7BD12BDBD9BDBDB2D4BD3BD7BD5BD12BD 2BD2BD4BD6BD6BD2BD4B2D2BD3BD5BD4BD10BD8BD6B2D24BD6BD4BD6BD14BD5BD5BD 24BDBD6BD4B$ABABADABCBABCBABABABABABADADABADABABABABABCDABABABCBABCDC BABCBABABABABADADABABABABABABCBCBABABABABADABABABCBABABABCBADABCBABAB ABCBABABABADADABABABABABABABABABADABADABABADADABABABABABABABABADABABA BABCBABABABABADABABABABABCBABABABADADCBABABABCBABABABABABADADABABABAB ABABABABABABABABABADABABABCBABABABABADABABABABABA$20B2D13BD6BD10BD8B 2D7BDBD4BD5BD2BD8BD8B3DBD6BD5B3D4BDBD18BDBD3BD11BD2BD17BD13BD11BD9BD 12BD11BD14BD17B2D2B3D10B2D5BD5B$ABCBABABCBABABABABCBABABABABCBABABADC DABCBABADCBABABABABABADABABABABCBCBABCBABABABABABABABADABABABADCBABCB ADCBCBCBABABABABCBCBADADABABCBCBABADCBADABABABABABABCBADABABABABABABA BCBCBADABCBABABABADABABABABABABABABABABABABABCDCBABABABABABABABABABAB ABABABCBCBABABABABADADADABADABABABCBADABABCBABABABADADADABABABABABABA $3BD4BD2BD21BDBD5BD2BDBD2BDBD3BD14BD21BD11BD7BD5B2D2BD2B2D6B2D14BD16B D7B2D4B3D6BD5BD7BD13BD4BD2BD4BD2BD5BD2BD7BDB2D9BD12BD9BD8BD4BD11BD$AB ABABABADABABABABABABADABADCBABABABCDABABABABCBADABABABABABABABABADABA BADABCBADADABADABCDABCBABABCBCBABABADABABABADADADABABABABABADABCBABAD ABABABABABABABCBCBABABABABABABABABABABADADABADCBABCBADABADABCDABCBABA BCBABADABABADABABABABADABADABCBABCDCBCBABABABABABCBABABABABABABABABCB CDABABABCBABCBABADABADABABABABABCBA$3B3DBD20BD6BD9BD3BD13BD5BDBD3BD 20B2D2BD15BD4BD22B2D3BD6BD2BD8BD27BDB2D13BD2BD12BD5BD3BD3BD4BD16BD7BD 5BD3BD12BD12BD2BD$ABABABABABADCBABCBCBABCDABABABABABCBADABABABCBABABA BABABABABABABABABABABABABADABCBABCBABCDABABABABABABABABABABABABABABAB ADABADABABABABADABABABABABABABCBABABABABABABCBCBABABABABABCBABABABABA BABABABABCBABABABABABABABABABABABABABCBABABABABADABABABABADABCBABCBAB ADABABABCBABABADCBADABADABABADABADABABABABABABADABADABA$11BD3BDBD15BD 2B2D6BD6BD8BD17B2D7B2DBDBD11BD15BDBDB2DBD2BD2BD13BD13BD3BD5BD14BD5B2D BD5BD5BD5BD6BD5BD5BD4BD7BD5BD4BD15BD8BD11BD3BD2BD3BD6BDB$ABADABABADCB ABABADCBABABABABABABABCBABABADABABABABABABABABABCBABCBABABABABABABCBC DADCBABABABABABABABABABABABABABADADADCBABCBABABABCDABABABABCBABABABAB ABCBCBABABABABABABADABADADABABABABABADABCBABABABABABADABCDABABABABCBA BADABCBABABABABABABABCBCBABABABABABADCBABABCBABCBABADABABABABABABABAB ADABABABABABCBCBABABABABA$3BD2BD11BD5BDBD19BD2BD22BDBD2BD5BD7BD7B2DB 3D5B2D2BD15BD6BD15B2D10BDBDBD2BD4BD5BD5BD8BDBD16BD9BD10BD5BD14BD11BD 3BD3BD12BDBD3BD6BD4BDBD$ABABABADABABABABABADABABADABABABADADABABADABA BABABABABABCBADABABABABABCDABABCBABABADCDABADABABCDABADABABADADABCBAB CBABADABABABABADADABABCBABABCBCBABCBADABCDADABABABABCBABCBABABABCDABA BABABABABADABABADABABABABABABABABABABADABABABABABABABADABABCBABABABCB ABADABABABABCDADABABABABABABCBABABABABABABABABABCBABABABABADA$D3BD4BD BD7BD15BD6BDBD12BD12BD4B2D7B2D7BD10BD10BD2BD6BD2BD8BD19BD18BD5BD7BD2B D4BD4BD3BD10BDBD6BDBD11BD6B2D13BD5BD2BD2BD2BD10BD5BD2B2D2BD7BDBD$ABAB ABABCBABABCBCBADABADCBABADABABADABABABABABABADABABADCBABABADCBABABCBA BABABABABABABADCBCBABABABABABABABABADABADABABABABABABCBABABCBADADABAB ABABABABABABABCBABADABABCBABABABABCBABABCBADABADABABABABCBABCBABABCBA BABABABCBCBADCBABABABABABABADABABABABABADADABCBABABABCDABABABABABABAB ABADADABABCBABABABABABABABABABABA$B2D11BD3BD9B2D8BD9BD4BD3BDBD6BD11BD 17BD5BD17BD6BDBD14BD9B2D3BD5BD8BDBD2BD7BD2BD2BD8BD7BD2BD4BD5BDBD6BD 20BD16BDBD3B2DBDBD4BD4BDBD2BD7BD2BD3BD$ABCBCBABABABABADABABABABABABAB ADCBABADABABABADABABCBABABADABABABADABABCBABABABABABABABABABCDABADABA BABABABCBABABABABABABABABABABADADABABABCDABABABABABABCBCBABABADABABAB CBABABABABABABABADABABADABABCDABADABABCBABABCBABABCBABABABADABABADABA BABABABABADABCBABABABABABABABADABADABABABABABADABABABCBABCBABABABABAB ABABABA$BD5BD5BD14BD2B2D9BD4BD2BDB2D17BD20BD2BDBD3BD6B3DB2D4BDB2D6B2D 2BD9BD4B2D4BD5BD5BD13B2DBD2BD14B2DBD2BD14BD14BD7BD2BD6BD11B2D6B2D2BDB D7BD6BD13BD3B$CDCBABABABABCBABADABABABABABABCBCDADABCBCBABABABABCDCBA DABABABCBADABABABCBABADABABABABABABABADCBABADADABABABABCDCBADABCDABAB ABABADABCBABCBCBABABABCDCBABABABABADABCBABCBCBABCBABCBCBADABABABADABC BADCBABADABADABABABABCBCBADCDCBABABABABCDABABABABCDABCBABADABABABADAB CBADABADABCBABABCBABABADABABADABABABABABABABABABABC! golly-2.5-src/Patterns/Margolus/HPP_large.rle0000644000175100001440000010340612156145314016115 00000000000000#CXRLE Pos=-100,-100 # HPP Gas implemented in the Margolus neighborhood, as described in: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:2 # neighborhood:Margolus # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 1,0,0,0 : 0,0,0,1 # one particle moves to the opposite corner # 1,1,0,0 : 0,0,1,1 # two particles pass through each other # 1,0,0,1 : 0,1,1,0 # two particles collide head-on # 1,1,1,0 : 0,1,1,1 # three particles pass through each other # x = 200, y = 200, rule = HPPMargolus_emulated:T200,200 4BDBDB2DBDBD2BD3B3DB2D3BDB4D3BD2B2D7BD3BD4BD4B5D2BD4BD3BD4BDB3D6B3D3B 2DBD3BDB2D2B10D2BD2B6D2BDBD2B7D2B2DB2DB2D2B2D2B3D4B4DB4D8BD2B3D4B$BCD CDCDCBCDCDCDABABCDADABCBADCDCDCBCBADCDCBABABCDADCBABABCDCDABCDCDADADA DCBCBCBADCDCDCDABCBCDABCBCDADADABCDADADCBCDCBCDABADCBABADADADCDADABCB ADABABCDABCDCBCBABCBCBCBCDCBABABCDCDADCDCBABADADADABABCBADC$2BDB3DBD 2BD2BDB3DB4DBDBD3B2D4B4DB2DBDB3DBDB2DB2D5B2DBD2BD2B5D2BD2B4D2B2D2BDBD 2B3D2B4DBDBD2BDBDB3DBD2BD2B5D4BD2B3D5BDB2D7B2DB3D2BD2B2DBD2B3D3B3DB2D 5B2D2B2D2BD$BCDCBABCDCBABCDCBABABABCDABADABADCDADADCBCBCDCBADCBADADAD CDCBCBCBCBABABCBADADCBCBCBABCDABCDABADABABCDCDABCDABCBADADADCDCBCDADA DCDCDCBABCDCBABCDADADABCDABCDCBCDADABADADCBCBCDADCBABCBCDADABCDABCBAD CBABA$D5BD4B3DB2DB4D3B4DBD2BDBDBDB2D3BDBD2BD2B2D3B2D2B3D2B4DBD2B2DBDB DBD5B4DB3D2BD4BDBDB10D3B2D3B2D2B2D3B6DBDBDB4D2B3D3BD7BD2BD2BD2BD7B2D 5BD7BDB2D$BCDADABADADABCBADCBADCBADCDCBABADADADCDADCBADCBCBADADADCDAD CBCDABADCBCBADCDCDCBADCDABABCBCBADABADCDADCDABCBADCDADCDABADCBABABCDC DABABADCDCBADCDCDADABABADCBCBCDABCDCBABADCDCDABCDADADCBCBABABADCBADCD ABA$BD3BD2B4DB2D3BD2B6DBD2B4DBD3B5DB3D2B6D2BD2BDBDB12DBDB2D3BDBD2BD2B 3DB3D3BD3B4DBDBDBDB2DB2DB5D2BDB3DBDB2DBD4BD3BD3BDB4DB7DB3D2BDB2D5BD2B 2DBD2BDBDB2D$BADADABCDCDABCBABADADCBABCDCBADABABCBCBCDABABADCBADCBADA DCBABCBABABADCDADADABABADABADADADCBCBABCBADABADCBCBCBCDCBCDCBCDCDCDAB CDCDCDABABADABABADCDCBADCDCBCBCBCDADADADCDCDADABCDADABCDCDCDCBCBCBCDA DADADA$BDB2DB2DBD2BD2BD5BDBD2BDBD2B2DB2DB2DBDB2DBDBD3B3D2BDB2DB4D2B3D 2BDBDB6DB3DBD2BDB2D3BD3B2D2BD2B2D2BDBD3B2DBD2B3D6B4DBD2B2DB3D2B3D3BD 6B2D2B4D3BDB9D2BD3BDBDB2DB2DB$DCDADADCBCBCDCBCBABCDCDADABADCDCDADABAB CBCDCBCBADCBADABADCDCBADCBABCDCBABADCDABCBABADADABCDABCBCDCDCDABADADC BCBADADABADADABADCBADABADCBCDADADABABABCBABABABCBABCDCDCDCBABCBCDADCD CBCDCBCDCDCBABADCDABADC$2BD3BDBDBDBD2B4D3B2DB2DB4DB3D2BD2B4DB3D2B2D2B DB3DBDBDB3D2BD6B4D3BD2B3DB4D3B4D3BD3B7DBD2BD2BDB2DB2DBD2B3DB3DBD3BD3B 6D2B4D2BDB4DBD3BDB4D3B5DBD3B3D3B$DADCDCDCBCDADADABADCDABCDCDCBCDADCDA DABCDCBADCDCBABCDCDCBCBCDADCDCBCBCDABCDABABADABABCDADADCBCDABCDCDABAB ADCDCBCDABCBCBABCDCDCDCBCBADABCDCBABADABADADCDCBCDCDCBCBADABABCDABABC BCBCBCBCDCDCBABADCBABCDCBA$2D3BD2B2D2B2D3B4DBDB2D2B4DB3D2B2DB3D2B2DB 2D2BDB2D7BD2B4DB2DBDBD2B2DBD2B4DB3D2B2DB2DB2D3BDB4DB2DBDB4D2BDB6D3B3D 2BD2B2D2BD2B3D4B3DB2DB3D2BDBD4B7D2B3D3B2D3B2DB$DABABADADADABADADCBADA BCDADCBCBCDCDABCDCBABABCDCBCDADCDCDABABADABABADABCDCDCBCDADCBCDCDABAB ABABCDCBABCDCBCBABABABABABCBCBABADADADADADADCDABADADABADABCBCBADADCDA BADADCDCDADABABCBADADCDCBCBABADCDCDABCDC$DBD2BDBDB2D2BD2BDBD3B3DB2D3B 4D2B2D5BDB2D3B10D3BD2BDBDBDBD2BDBD2BD3B2DB4D2BD3BD4BD2BDB5D3B2D2B2DB 3D2BDBDB2DB2DBDBD2B4DBDBDB2DB2D2BD3B2DBD2B8DBDB3DB2DBDBDB3D2B2D2B$DAD ABCBCBCDCDADADCBADCBABABABCBABCBCBADCDADCDABCDABADCBADCBCBCBCBADCDCDC BCBADCBCBABCDCDCBABCBABADCDCDADCBCDCBABADABCDCDCDCBABCDABADABADCBCBAD CBCBCBADADADADABABADABABCDABABADADCBABABADABCBABCBCDCDCDCBC$B3DB2DB3D 4B3DB2DBD3B2D2B7DB2DB2DBD2B2D2B3D3BD6B2DB5D2BDB4D4B2D2BD2B5D3BDB3D3BD 4BD2B2DBDB2DB3D3B2DB2DBDBD3BDBDB3D3BDB2DBD2B2DBDB2D3B2D4B3DB2D2BDB5DB 2D3BD2BD$BCBCDABCBABCBABCBCDABADADCDCBCBCDABADCBCBADABCBABADADADABADA BCBABCDABCDCBABCDABABCBCBCBADABADADADCBCBABCDCDADCBCDCBABADADCBCBABCD CBADADCDCBCDADADCDCBADCBCDCBABCBCDCDADABADABABCBCDABABCBADABCDABADABC BC$2B3D6B4D4BDB2D2BDB2DBDB2D4B3D2B2DB2D2B2D3BD3BDB2D3B2D2BD4BD2BDB3D 3BDBD3BDBDB2DBDBD2B5D3B3D2B2DBDB2D2BD3B2D7B6D3B4DBDB4DBD2BDB3DB2DB2D 4B3DBDB2DB2D2BDB2DB2DBD$DCDCBCBCBCDCBADABCDCBADCDCDCDCBCBCBCDCBABCDAB ABCDCDABCBCBADCBCDCBABCBADABADCDCBCBABADCDADABCBABCDCBCDCDCDADABABADC BABCBADCDADABABABCDCDCDABCBADCBCDABABCBCBCDABADCBADADCDCDADABABABABCD ADABCDABADADCDADA$DBD3B2D3B4D2BDBDBD4B2DB3DB3DB3D5BD2BD2B5DBDB5D2B2DB 2DBD6BD5BD2BDBD9B4D4B10D3B5D2BD2B7DB2D3B2DBD3B4DB5D4BDBD2B2DBD2BD3BD 2BD2B4DBD2BD2BD2B$BABABABABADADADADCBCBABCBABABCBCBABCDCBCBCDADCBABCB ABCDCDABCBCBABCDADCBABCDABABADABCBABABCDCBADABCDABADCDCBCBABCDADABABC BCBADABCBADCDABCDCDCDCDADABADCBCDABCBABCBABCDCBABCDABADABCDCDADCDCDAD ABADCBADCBA$2DB2DB2DB2D2B3D2B7D2BDBDBD2B2DB4DBDB4D5BD7B4DBDBD2B3D2B2D B3D5B2D3B3D2B5D3BDB3D3B2DB2D3BDB2D2B2DB2DBDBD3B2D3B3D3BDB3D2B5DB2D2B 5D3BD3B2D2BDB3D3BDB2D2BD2B$DCBCBCDABCDABABCBABCDADCBABADCBADCBCBCDADA BCBCBADCDCDADABCDADCBCDABABABADABADADADABCDCDCBCDCDADCDADADCBCBCBCDCD ADCDADCDADCDABCBCBCBABABADCDCDCDCDCDCBABCBABADABCBABABCBCDABCBABCDCDA DABADCBADABCBCDCDCDC$DBD3B2D2B2D4B2DB2D2BDB3DBDBDB2D2B2DBDB3DB4DB2D5B DBDBDB2D2BD3B4D2B2DBD2BD4B2D5B2D2B4D5BD3B2DB3DB3DB3D3BDB2D4BDBD2B2D 15BD2B2DBDB2DB2D2B2DBD3BD2BD6B2D3BDBD$BCBCBABADCDCDCDABABCBABCDABCBCD ADABCBABCBADABCDADABCBADABCDABCDCBADADABCDADCBCDADABCBADCBCBCBADCDABA DABCBABABCBABCBCDABCDADCDABCBADCDCDCDABABCDADCBABABCBADCDABABADADCDAB CDADCBABADADCDADCBABCBABADADCBC$BDB3DBDB2DB2D2BD3B3DBDB4DBDB2DB2D2BDB 3DBD3BD2B3D2BD3BD3BD3BDBDB2D3B2D5B3DB4DBD3BD2B2DB2DBD3B4D2B2D2BD2B3D 4BD4BD3B5D2B2DBD2BDBDBDB7D2BDBD4BD7BD2BDB2D4B2DBDB$BCDABADABCBCBCBCBA DADABADCBCDCDCBCDABADCBADCDADCBABADABCBCDABADADADADCBABABCBCBCBCDCBAD ABABABCDABADCBCDABABABCBABADABCBABCDADCBADCDCDCBCDCBABABCDADCDADCBCBC BCDADCDCDABADCDCBADABCDCDABABCBABADABCBABADA$2BDBD5BDB2D3BDBD8BDB6D3B D2B6D2BDB3D4B4DB2D4BD4B7DB4DBD2B4DB4DBD3BDB2DB2D3B3DBD2B2DB4D3BDB2D2B D4BDBD4B5D3BD3B2DBDBDB2DBD3B5D5BD2BDBDB2D3BDB$DCDCDABABABABABCDCDCBAD CBABCBADADABABCBCBABCBCDCBCDCDCDCBCDCDCDCBADCDCBADCBABADCDCDABADCBABC BCDCDADCDCBCBABCBABABABCDABABCBADABCDCBCDCBABABCBADABCDADADABCBADCBAB CBADADABADCDADABADCBABCDADABABADADADABC$3DBDB2D3BDB2D4BDB2D2BDB2DBDBD BDB2D4B2D2BDBDB2D2BD4BDBDBD2B3D4B2D2BDBD2B2DBDB2D2BD2B2D2BDB4DB3DB2D 2B3DBDB3D2BDB4D3BDBDB3D2B3D2B4D2B3DB3DB4D2BDB4DBDBDBDB2DBD6BDB2D3B2DB $BADADCBABADADCBADADADADCDADCDCBADCDADADADADABCDCDCBCDCDCBADADADABCDA DCBADABADABADCBCBCDCDABCBABABCBCBABADABCDCBABADADCDABCBCBCBADCBCBADAD ABADCBADABADCBABCDCDCBCDABADADCBCDABABABABADCDCDABCBCDADADCBCBC$5DBD 2B2DB2DB6D3B2D4B3DBD2B3D4BDBD3BD2B2D3B3DB7DB4D2B2D2BD2BDBD2B2DBDB3DBD B3DBDB4D2BDBD5B6D6B3DB2DBD2B3D3B2DBDBDB5D2B5D3B3DBDB4DBD12B2D2BDBD$DC DADABADCDABCBCDCDABADCDABCBCBCBABCDCBABADCBABCBABCBCBCDABCDCDCDCDCBAD ADABCDCBABABADCDABCDCBCDCBCDCBCDADABCDABCDCDCDCDABABCDADCDCBABCBADABC DCDABADADCDCBCBCDADABCDADABCDABADCBCBADADABABCDCDCBCBABADCBA$BDBDB2D 3BD2BD2BD7BD2BDB3DB3D3B3D2B2DBD2BDB3DBD3B3D2B2D2B2D3BDB2DB6DB5D2BDB7D B2DBDBDBD2B2D2B2D2B2D4BD2BDB2D3B3D2B8D2B2DBDBDB2D2B3D2B3DBDBD3B4D4B7D B5DB$DABADADADADABABCBADCDCBADADADABADABCBADADADCDADCDADCBADADCBCBCBA BCBCDCBABCDADCDCDCBADADCDADABABCBCDABCBCDABCDADCDABABADABABCBCDCBCDAD CBCBCDADABADADABADADABCDABADADCBABABCDABADABADADCDADADADCBCDCDCBADA$B DB2D3B2D5BDBDB6D3BDBDB4D2B3D5B2DBDB2DBDB4D3BD2B9DBD2BD4B5D2BD4BDBDB3D 3B2D2BD3BDBD6BD2BDBD2BDBD2BDBD3BD4B2D3BD6BDBDB2D3B2D2B3DBD2B4D2BDB2DB 3D3B2DBD$DADCBABABCBADADCDCBADABABADCDCDABADABADCDADADABABCBCBADABADC BABCBCDCBADABADABABCBADCBCDADADADCDCDCDABADADCDCDADADCDCDCDABABABABCB ADCBCDABCDADCDCDCBCDABADCDABCBCBABABADABCDABCBABCBCDCDCDCDABCDCDABADA DA$DB2D2B2D2BDB4D5B4D2B4DBDBDB3D2BD4BD2BD3BDB3D3B3DB2DBD2BD2BD2BDBDBD 2BDBDBDB4D2B2DB2DBDB2DBDBD2B2D3B2D3BD2B2D2B2DBD2BD3B5D2B3D8B3DB2D3B2D BDB2D6B2D4BD4BD3B3D2BD$DABADCDCBABABADCDADADCBADADADADCBABCBCBADABADC BADABADADADCDADABCDCBCDCDCDABADADCBCDADCDADCDCBCBCDCDABABADCDCDABADCB CDCDCDADADCBCBADABCBABADABCBADABCDCBCBCDCDADCDCBADCBCDADADABCDCBCBADA BCDCDABABADADCDC$2B2D4B2D2BD2B2D2B2DB4DBDB2D3BD2BDB3D2BD2B2DB2DBD3BDB DBD2BD2BDBDB3D3BD2BD5BDBD2B3DBD4B2D3BD3B2D2B2DB4D2BDB4D2BDBDBDB2DB4D 2BDBDB2DBD3B2D5B2D3BDB3D4BDB3D3B5DB5D2B2D$DCDABCDCDADADABCBCBADABCDCD CBADCDADABCBABCDADADADADABCDCDCDCDCBADCDADADCBABADABCBADABADCDCBADCBA DCDCBADCDABADADCDCBCDADCBABCDADCDCDADCBCDADADADABCBCBCBCDABABCBADABCD CDADADCDCDCBABABADADCDABADCBCBABCBC$D2B2DBDB3D4B2DB2D2B2DB2DB2D3B3DBD B3DB5DB3DBD2B2D2BD4BDBDBDBDB2DBDB2DBD3B5DBDB3DBDBD4B2DBD2BDBDBD2BD5B 2DBDBDBDBD4B2D2BD5B2D2BD2BDBDBDB2DBDBDB3DBDB4D2B3DBD2B2D2B2DB2DBDB2D$ BABCDADCDADABCBCBCDCDCDCBADCBADCDABADABABABCDABADCDCBABABCDABADCBADAB ADADCDCDCBCDADCBABABCBADADADABCDCDCBADADCDCDCBABCDADCDADCDABCDCBCBABC DABCDCBCBCBCDCBCBADADCBCBADADCDABCBCDCDCDCDADCDCDCBABCDADADCDC$2D2BD 2B2DBDB3D2BDB3DB2D4B8D3B3D4B3DB2DBD2B2DBDB3D5B2DB2D4BDB5DBD2B5DB2DBDB 2D2BDB2D4B8D5BDB7D2BD2B4D2BD3BDBD2BDBD4B4DBDBDB3D2B2D2BDB2D3B2D2B5DB 3D$DCBADCDCDCBABCDCBADCDABADABCBCDABABADCDCDABADADCDCBADADADCDABADCDA DCBCDADCBABABCBABCBCDABABCBADCBCDCBCDADCBCBADABCBADCDADABADCDABABADCD ADCBADCDADCBCBCDCDCDCDCBCDADADABADADCBADCDCDABABCBABCDABABADCDADA$DB 2D2B4D2BDB2DB3DB2DB2D2BDBDBD3BD3B3DBDB2D2B2DBD3BD4B3D3BDB2DB3DB8DBD2B D2B2D9BDB2DB2D2BDB3DB2D3BDB3D4B4DB2D2BDBD2BD3BDB4D2B2DB2D2BD2B2D9BDB 4D2B3D2BD2BD4B$DABABCBADCBABCBCDCDCDADCDADADADADCDABCDCDABADADADCBABC BADCBADADCBCDCBABCBCBCBCDABCDADCBCDCDCDADCBCBABCDCDADCDCBCBCDABCBCDCB ADCBABCBCBCDCBADCBADADABCBABCBCBABCBCDCBADABADABCDABABADADADCDCBADADA DADCBABC$DBD3BD2B2DB2DBDBD2B13DB2D2BDB2D2BDBDBD2BD2B4DBDBD2B3DBDB2D2B 2D2BD3BD2B2DBD4B2D2BDBDB2D2BDBDBD2B2DBD3BDBDB3DBD5B2D2B4D2B2D2B2D3B6D BD3BDB4DBDB3D3B2DBDBD2B5D2B3DB3D$DCBABABCBADCBCBCDCBABCDCBCDCBADADCDC BADABABCBCDADCBADABABABCDADCDCDABABCDCBADCBADCBCDADCBABCBADADCBADCBAB ADCDCBABABCDCBCBADCDCBABCBCBADABABADCDCDABCDABCDABABABCDADABADCDCBADA BABCDCBABABCDCBADADADCDCBC$BDB2D3B2D5BDBD6BDBD2B2DB5D4B2D2B3DB5D2BD3B 5D2B5DB2D2BDB3DBDBDBDBDB2D3BDBD3BDBDBD5BD2B2DB5D2B4DBD2B3D3B2D2BD2BDB D3B2DBD2BDB2DB4DB2DBD9BDB2D2BDB3D3B2D2BD$BADCBCDADCDADCBCBADCBCBABCBA DADCDABABCDABADABADCDABADADCBABCDABABCBCDABABADABADADCDADCBCBABCBABAB ADCBCBCDADCDABADADABCDABABADADCDCBABABCDCDADADABCDADADABCDCBCDCBABABC BADADABADADCDCBCBCDABCDCDADADABABC$2D2BD4BDB2DBDBDBDB2DB3D2BDB2D3BDBD 2BDBDB2DB2DBD2BD3B3DB2D4BDB5D2BD7BDBDB2D2B2DBDBDBD2B2D3BDBDB4DB3D2B2D B2DBD4BDBDBD3BD2B2DB2D2BD2B2DBD5BDBDBD3B2D3BD4B3DBD5B2DB3DB2DB$DABABA BCBADCDADADABADCBCDCBCDCBABABABABCBCDCBABCDCDABCDADCBADCBADADABADCBAD CDADCBADCDCDCDADCDCBCBCBCBCDCBCBCDABADADADABADADADADCDCDCDADCBABADCDC BCDABCBADADADADCBABADCBCBADCBCDCBCDADCBADADCDCDABADCDCBC$2B2DB2D4BD5B 3DB4D5BD4B2D5BD3B2D4B4DB2DB3DBDB5DBDB3DB5DB3DBD2BDB2DB5DB2DB2D2B2DBDB 2DBD6BD2BD5BD2BDB2D3B5D3BD3B2D5BD2B4DBDB3DB2DBDBDB3DB6DBD4BD$BCBCDCDA DABCBADCBADCBCDCDCBABADCBADCDADCDCBCBADCBCDCBABABADCBCDCBCDCBCBADCDCB CDADADADADABABCBADCDCDCBABABCBCBADADABADABADABCDCBCBABCBABADADCDCBADC DCBABADCDABADADABCDCBCDADCBABCBABCBCBABCDCDCBADCBADABA$B2DB2DBDB2D2BD BD2B5DBD5BD2BD2BDBDBDB4D2BD2BD3B2DB3DBD3B5D2BDB2DBD2B3DBDB2D4B9DB2DBD BDB3DB3D7BDB2DBDBDB3DBD3BDB3DB4DBD4BD2BD4BDB2D2B2D2B3DB3DBDB2D3B3DBDB 2D2B$BADCDADCBCDABADABCBCBADABCDCDABCDABADCDABCBABCBCBADCBABCBABABABA DABABCDCBCDADABABCBABADCDADCDCDADCBADABADABABADCBABCDCBADCBCDCBCDCDAD ABABABADADCDCDCDABABCBCDADCBCBABCDCDCDADCDCDADCBCDCBCDCDADADCBCDCDC$D BD2B2DBDB7DB3DB2DBD2BDBDB4DB3D3B2D3BDBDB2DB2D3B2D4B2D4BD4B3D6BDB2DB3D 7B4D2BD2B3D2B2DBD3BDBDBD5B4DB2D2BD2BD4B2D2BDBDBD2BDBD2BDB6D2B8DBD2BDB 2DB4DBD2B$BCDADCBCBABCDADABADADADCDADABADABCBCDADADCDABABABADADADCBCB ABCDABCDABCDABABABADCBABABCDCDABADCBCBCDADABCBABCDCDADABCBABADCDADABA DCDCBCBABADABCBCBCBCDABCBCDCDCBADADCBCDABCDADCDCDCBABADCBCDCDCBADCDCD CDC$2DBD2BDB2D3B7DB2DBDB3DB2DB3D5B2D2BD5B2DB2D3BDBDBD3BD3BD2B2DB2DBDB D2B2DB2D2BD3B3DB2D3BD4BDB4DB4DBDB6D3BDB5D2BDB5D2BDBD2BD2B2DB2D8B2DBD 3BDB5D2BD3B3D4BD$DCBADCBCBCBCDCDCBABCDCBADCDABABCDADADCDCBADABADADCBA BADCBCDABCDCBCDCDCDADADCDADABCBABCBABCDCDABADCBCBADCDABADCDADCBCDCDAB ADCBADCBCDCDABABCBABCBCDCDCDCBABADCDCBCBADCBABCDABCDADABABABCBCDADCBC DADADABCBA$D2BD2BDBD2BD3BDBD2BDBDB2DB2D2B2D4BDB2DBD3B9DBDBD2BD2B2DB2D B2D2B5D3BD3B3D4B5DBD2B2D3B4DB10D2BDB3DBD3BDBDBDB2D2B2DB4DB2DBD4BDBD3B D2B4DB3D3BDBD4B3DB7DBD$BADABCBABABADABCBADADADADABCBABCBCDCDCBABADADC DCDADCBCDADABCDADADCBADABCBADABCBADCDADCDCDABCDCDABCBCDABCBABADCBADCD ABCDCBCBCDCDADCBABCBADCDABADCDABABABCDCBADADCDADCBCDCDCBADADADADADCDC DCDCBABCDCBCDCDA$D3BD2B5DBD3B2D7B2DB2DB7DBDB6D2BDBDBD3BD2BD6B4D3BD2B 2D2B3DB2DBDBDBDBDBDB2DB3D3BDB3DBD2BD3BD3B3D3BDBD2B2DB3DBDBDB2DB3D6BDB 2D2BDB5D2BD2BDBD3B4D4B2DB5DB$BADCDCDCBCDCDADABCBADCBCDCBCBCBCDABABABA BADCBCBCDABCBCBABCDADABCBCBABADCBADCDADCDADABADADCDABCBCBCBABCDCBABCD ADCBABADADADCBABCBCBCDABCDABABABABABCDADABCBCDABCBCDCBCBADCBCDADADCDA DADABABCBADCDCBCDCDCDA$D2BDB2DB3DB3DBDB2D4BDBDBD2BDBDB2DB2DB2D2BDBD3B 2DBDB2D4BDB3D3BD4BDBD2B2DBDBD2B3DB2DBD2B4DBD4B2DBDBD3BD2BDB3D2BDBD2B 6D2B2D11BD4BDB3DBDB3DBD4BDB2DBDB2DBD2BDB3D3BDBDB$DABABADADADADABABCDA DCDCBABABCBCBCDCBCBADCDADADABCBADCBABABABCDCBABABCDABCBCBCBABCDCDCDAD CBCBADCDCBABCBCBCBCDCBABCBADCBABABABADABCDCBCBCDCDADCBABABCBADADABADA BCDCBADADCDCBCDADADCDCDCDABABCDCDCBADABCBC$2B2DBD2B4DBD3B3D3BD2B2D4B 2DB2D2B3DB2D3BD3BDBDBD6B9DB4D2BD3BDBD2BDB3DBDB2D4B2DB2DBD2B5DBD6B3DB 2DBD3BDBD4BD2BD3B2DBD4BD3BDB2D2B2DBDB3DBD2BDB3DBD4B2D2B2D2B2D$BABCBCB ABABCBCBCDADCBCBCDABABADABCDADCDABABABCBABABABCBABADCDCBCBABCBCBADCDC DCDCBADCBABADADCDCBCBCBABABCBCDABABCDABCBADABCBADCBABABCDABABADCBADAB CBCDABCBABABCDCBCBCBCBABADCDCDADCBADCBADADCBABCDCDABCBC$2B3DB2D2B2DBD B2DB3DBDBDBDB3D2B3DB2D5BD2BD5B3D4BDB3DB2DB2DB2DB2DBD2B2D3B6DBDB6D2BDB D2BDBDB2DB4DBD2BDBDB2D2BD2BD5B2DB3D2B2DBDB2DB2DB2D2BD6B2D3BD3B2DBDBD 4B2D4B5D$BADCBCDCDABADADCDCBCDABADADCDADCBABCBABCBADCBCDADADCDADCDABC BCBABCDCBABABCBCBCBCBABABADADABADADCDCDABADADCDABCDADCDADABABCBCBCBAD CBADCBCDCDADADABCBABADCBABCBCDCDADABADABCDCBCBABABCBCDADABCDABCDCBCBC BC$BD4BD2B5D2BD3BDBDBDBDBDBD2B3D2B4D2B5DB2DB2DBDBDB2DBD2BDBD2B2D3B4D 7BD3BD2B7D2B2D2B2DB2DB2DBD4BD5BD2B2D2B7DB3DBD3BD2B2DBD3BD3B2DBDB2DB2D B3DB3D2BDBD6B2DBDB2D$DABADCDADABCBADCBADCDABADCBABADCBCBABCDADADCBABC BABABCDCBADABABCBCDCDCBADCDADCDABCDCDCBADADCDCDADABADCDABCBCDABADABAD CBCDCDCDCDCDCBADABCBABCDADADABCBCBABCBADCBADCBABADABCBADCBABADCBABCBC BABCDCBCDCDABA$3B2D2B2DB3D2B3DBD2BD2BD2BDBD5B2D2BDB2DBD2B3D2B5D2B4D3B 2DBDB3D5BD3B4DBD3BDB3DBD2B2D3B3D3B2DB2DB4D4B2D2B2D3B4DB2D3BD5BDBD4B2D 4BDB6D2B2DB3DB2DB5DB4DBDBDB$DCDCBABADABCBCBABABABADADADCDADCBCDABADAD ADABADADADCBADCBCDCDCBCBABADCDADCDADCBCDADADCBCDCDABCDADCDCDABADABADA BABADADCBCBCBABADCDABCBCBADADCDABCBCDCBABABABCDABCDADCBCBADCDADABCBCB CDCDADABABCBADCBADCDC$5BDBDB3DBDBDB2D2B2D3B2D2B3D3BDB2DBD6B2DBDB4DB2D 6BDB3DBDBDBDB3DBDBDBD2B2D2B5DBD8B3DB3DB2DBDB3DBDB2D2B2DB4DBDBD3B3D2BD 2BDB3DBDBDBDBD5BD2BDB3DBD3BD3B6D6B$BABADADADABCBCDADABABADABCBCBADCDA DADADCBCBADADCBABABCBCBADABCDABADABCBABADABCDCBCBADCBCBADABADCDADADAB ABADADCBABCBADCDCBCBADABADABABCDCBABCBADCDABADCBCBADCBCBADABCDCDABADA BCBCBCBCDABABCBCBCDCBCBABADC$3BDB3DBDB7DBDBDBD2B2D5B2DBDBD3BD3B2DB6DB D2B4D2BDB2DB4DBD2BDBD2B2DB5DBD2BD6B2DB2D3BDBDBD2BDB4DBD2BDBD2BD2BD3BD 4BD2B2DB2DBDBDB3D2B2D2BDBD2BDBD2B2DB2DB4D3BD2B3D4BD$BABABCBABCBCBCBCB CDCDCBADCBABABCDCBCDCDCDADCDADCBADCDCDABCBCDABCDCBABADABCDCDADADADCDA BCBABADCDABADABADCDABCBCDCBADABCBADCBCDADADCDADCDCDABCBADADCBABABCBCD ABABCBCDADABCBABABABADABCBCDADABCBADCDABADABC$BDB4DBDB3DB5D2BD2B3DB3D BD6B3DBDBD3B4DB3D2BDBD3B2D2B5DB3D2B2DBD2B2DBDBDB5D2BD3B2DBDB2DB5D2B2D 3B3D2B2D2B2D3BD2BD2B2D6BDBD4B4DB5DBDB2D2B3D3BD2BD2BD2BD2B2D2BDB$BADAB CBCBABADADCBCDCBABADABCBADABCBCBADADCDABCDABCDCBCDADCDABADCDCBABABADA DABCDCBCBCBCBCDABABCBCBADCDCDABCBCDCBADCBCDCBABADADCBADADCBADCDABCDCD CDABCDABADCDCDABCDADABCBABCBCDCDADABADCDABCBCDADADCBABADA$B4DBD2BDBDB 2DB4DBDBDB4DB2DB6D3BD2B2D9BDB6D3BD3B3D5B2DB2D2BD2BD3B2DB3D2BDBD3BDBD 2BD2B4DBD2B3D2BDB8DB3DB3DBDBDBD3B4DB2DB2D3BD3BDB4D3B2D2B2D6BD2B2D2B$D CDABADABCBCBCDCDADABABCBCBCDABABCDCDCDCDABCBCDABADCBADADCDABCDCDABCDC BCDCDABCDABADABCDCDCDCDABCDABADADCDADABCBABCDABCBCBADCDADCDABABADADCD CDCDADABADCDABABCDCBABADADCDCBABCBADCBCDCDABCBABCBADABADCBADA$3B3DBDB 3DBDB3D4B4D2B2D3B3DB3D4B6DBD3BD2B4D6BDB5DB5DBD3BD5B2DBDBD3BDBDB4DBDB 5DB3DB2D2B2DBDB3D7BDB4D3BD2B4DBD2B4DBD5BDB2DB5DBD3B2D2BD3BD4B$DCBCBAD ADCDCDADADCDADABADABCDCBCBCBABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABCBABADADCBABADCBADCDCBCDCBCBCD ADADADABCBCBCDCDADCDADCDCDCBABABADABABCDCDCBCBCDCBCDADC$7D2B4D4B3DB2D B2DBDBD2BD83B2DBDBDB4D9BD3B3D5B2DBD3BDBDBDB2DB2DB2D2BDB9DB2DBDBD3BD3B 4D$BCDABABCBADABCBADCBCDABADCBCBADABCBABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABADCDCBABCBCBCBABADCD CBADADCBCBCBADABCBCDCBABABCBCBCDADADCDABCDADCBADCDADCDABABCBCBCBA$3DB 4D5BDBDB3DB2D4B3DBD83B2D5BD3B4D2BD2B3D2BDBD2BDBDB2D3BDBDB2D2BDB2D2BD 4B3DB2D3BDB3D3B3DB2D3BD$DCBCBCDABCBADCDCBCDCBCDADADCBCBABCBABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BCDABADCBCBABABCDADADCBCDCDCDCDADCBABABCDCBCBABABABCDCDCDCDADCDADADCB CBADCDADCBADADADA$6D3B4D4B2D2B3DBDB2D86B5DB2D2BDBD2BD3BD2B4DB2D2B2D3B DBDBDBDB3DBDB2DB2DB3D2BDBDB4DBDB2DB6DBDBD$BABCBABCDCDABADCBABADADCBCD ADCDCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABCBCDADADADCBADABCDCDABCBCDCBCBCBABCDADCBABADCBADAD CDCBCBADABCBCBADABCDCBCDADADABCBADC$B4D2B7DB3D3B6D3BD86BDBD2BD3B3D3BD BDB3DB2DB5DBD7BD2B3DB2D2BDBDBD3BD3B2D4B4DBD3BDBD2B$BADADADABABCDABCDC DCDADCDABCBADCBCBABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABCDABADABCBCBABCBCBCDADCDADADABADCDABCDC DADCBCDABCBCDCDADADCBADADABCBADCDABCBCDADCDC$2B3D2BDB3D2BDBD2BDBD3B2D 2B4D84BD2BDB2DBDB2DBD2B3D2B2D4B5DBD2BD2BD3B4D4B3DBDBDB4DB5D6BD2BDBD2B $BADCDADABADCDADADCDABABABABCBCDCDCBABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABADABCBCDCDCDCDCDADCD CDCBADCDABABADABADCBABCBCBCBADCBCDABCDCDADCDCBCDADCBCDADCDCDADA$5B2DB DBD2B2D2BDBD3BDB3DB5D82B2D3B2DBDB2D3B5D2BDB2DBD2BDBDB2DB2D3B4DB7DBD2B 2DBD14BD4BDBD$DABADCBABADCBCDCDCDADABADCDADABCBABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCDABABC DCBCDADCDCDCBCBCDCBCDADABABCBABCBCBCBCBCBADADCDADCDCBADCDCBABCBCBABAD CDADADA$BDBD2B8D2B4D4B2D5B2D82BD2B2D2B3D2B4D3BDBDB2DBDBDBD3BDB2D2BD3B 3DBDB2D3BD3B3D3BDBD2B2DBD2B2D2B3D2B$DADADABCDADCBCDADCDCDCDADCDABABCB CBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABCBCBABADABCDADCBADCDABCDADABCDABABCDCDCDCDABCBCBADADCBCB CDCDCDCDCBADCDCDCDABABCBADABA$D3BD8BD5BD2BDBDBDB2DB3D82B2DBDB6DBD2BDB 2DB3DBD3B4D3B2D4B4DBD4BD2B2DBD2B2DB2D2B3DB2DB2D4B4D$BCDCBCDCBCDADABCB CBCDCDABABADADABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABCBCDABADCBCBCDABADCDCDCDCDADCDADABABCBCD ABABADCBADCDADCBCDCDADABCBCBCDADADCDADADABABA$3BDB2D2BD3BD2BDBD5B2DB 2DBDB2D81BDBDB4D2B3D4B4D2BD2BDB2DBD2BDB2D4B2D2B2DB2DB7D2B2D3B2D3BD2B 2D2B2D4BD$DABCBCBABABCDCBABCDCBCBCDABCBCDCDCBABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABCBCBCDABABCDC BABABCDCBCBADCDABABCBADCBCBCDCBCBABABCBCDCDCDABCBADCBABCBCDADADCBABCD CBA$BDB5D2BDB2DBDB2DBDBD4B3D2BD85BDB2D5B6D3BD5BDBD3BDB2DBDB2D2BD4B2DB 2DB2D3BD3BDBDB3D3BDB2DB3DB2D$BCDCBADCBADADCBCBADABADADADADCBADABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABADCDABADADABABADABABABCBABABCBABADCDADCDABCDADADCDADCBADADCBABA DCBCBADADCDADCDADCDCDC$DB2D4BDB7DBDB2DB2D2BD3BDBD82BD2BDBDBDBD5BDBDBD 4B2D2B3D3BD2BDB2DB4DBD2B7D2B2D4B2DB2D2B6DBD4B$DABADABADABADCDADCDCDCD CDCDCBADABCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABCBCBABCDCBABADCBCDABADABCBABCBCBABCBABCDABABCB CBABADADADCDABCBADABCDCBCBADADCBCBABADC$2B2DB2D2BD3BD3BD2BD3BDBD2B2D 87BD3B3D2B4D3BDB7D2B2DBDB2D2B3D3BDB3D2BDBDBDBDB2D2B2DBD2B2DB2DB2DBD2B DBD$BCBCDCDADCDADABABCDCDADADCBCBCDCBCBABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABCBABADCBADABCDCBCDC BCDADABCDCDABCDADABADCBCBCBABCDADADADCDADCBABCDCBCDABADABCBCDABCBC$2B D2BD5B6D2B2DB2D2BD2BD85BD4BD2B2DBD2B3DBD4B2D4BDB4D2B3DBD5BD2B2DBDB4D 2BDB3D2B4D6B3D2B2D$BCDCDABABABCBABCBADABCDABABADCBCDCBABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCDAD ABABADABABCBCDADCBADCBADABADCBCDADCDABABADCDCBCDCDADCDADABABCDABADABC BCDADCBABCBA$DBD3B2DBDB3DB2DBDBDB4DB2D4BD81BD2B2DB2D2BD4B2DBD2B2DB4DB 2D3B4D3B2D3BDB2DB3DBDB3D2B2DB2DBD3BD3B3DBDB2DB$DCBCBADCBADCBCBCDCDABC DCBADADABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABADCBCBADADADABCDABCBCBADCDCBCBABCDCBCBCDCDCBA DCDCDCDADADCBABCDCBABADCDCDCBCDABABCDCDA$BD2B7D2B4D4BDB2DBD3B4D81BD2B 2D4B2DB2DB5D2BD2BD2BDB2DBDB2D4BD3B2D3B4DB2DB2DB2D7BD3B5DB2DBDB$BABADA BCBABCDABABCDADCDCDADABABADCBABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABCDCDADCBCBCBCDADCDADCBCBCDA BABADABCBADABADCDADCDABCBABCDABCDCBCDABCBCBCBADABABCBCBA$DB2DB3D2BD2B 3D6B2DBD2BDBD85BD3B2D2B3DB4D2B2DBDB2DBD4BDB4DBDBDB2D2B2DBD4B2D4B2DBD 3B4DB4DB2D3B2D$BCBCDADABADADCBCBCDCBCDCDABCBABADABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCDCBADCD CBABABCBCBABCBADABCDCDADCBABCDCDCBCDCBCBABCBABABCDCDCDCBCBADADCBABCDC DABCBCBC$3BDB2DB4DB4D4BD5B3D2B2D81BD3BD4BD2BDB2D4B2DBD2BD2B5DB2D3BDB 4DB4DB4DB2DB2D3B4DB2D2B2D2BD2B4D$DADCBABABCDADCBABADCDABABCBCBADCDABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABCBCDABCBADABCDCBADADCDCDABCDCDABADADADADABADADCDADADADADADA DADCDCBCBABADADADCBABABADC$5B3D2BDBDBD3B4DBD2BDBDB2D83BDB3D2BDB5DB2DB D3BDBDB2DB2DB2DB2D5BDBD2BD2B5DB3DBD2B3D2BDB4D2B5DB2DB$BABABCDCBCDCBAD ADABADCBABADCDCBADABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABCDCDABCBCDCBCBABCDCBABCDABADABABADCDCD ABCDADABABABCDABCDCBABCBCDCBCDABABCBADCDABADCBC$DB3D5BDBDB2D3B2D2BDB 2D3BD2BD81B3DB2DB7D3BDBDBDBDBD3BDB2D3BDBD2BDB2DBDBD4B2DBD2B5D3BD2BDBD BDBDBD3BDBD$BCBCBCDCBCBADCBCDCDABADABADABCDCDCBABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCBCBCBABCBC BADCDCBABCBADABCBADCBCBCBABCBCBCBABCBCBADCBADCBABADCBCDADADADCDCBCDCB CDCDA$2BD2B4D3BD2BD3B3D2BD3BD3B2D83BD4BDB2DB2D2BDBDB8DBD2BD2BDBDB2DB 2D3BDBDBDBD2BD3BD3BDBD5B2DBD2B4D3B$BCDCDCBCDCBADADABCDADADABADADCBCBC BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABCDCDABADABCBCBABABCDADCDABABADCBCDABADCDABADABABCDADCDA DADABCBADCBADADADCDABADCDCBA$DBD2BD4B2D2BDBD2B2D2BD2BD2BD85BDB2DB2DBD B2DBD2B2D2B2D3B2DBDBDBDBD2BD2BD6BD3B3D7BDB6D3BD2B2D3B2DB2D$DCBABADCBA DCBABCBCDADADABABCDCDABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABCBABABABABCBADADADADCDCDCBABCDABC BABCDADCBABCBCDCBCDABABCBCDADABADCDCBADADADCDCDCDCBC$4D4B2D2BD2BD3BDB 3D2BD4BD85B2D2BDBDBDBD3B2D2B4DBD3B2D6B3D2B3DB3DB2DB2D2B2DBDBD3BD4BD8B 2DB2D$DADCBCDCDCDABCDABADCDADCDADCDADABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABCBCBADCBCDCDCBA BCDADCBCDABCDCBABADADABADADCBCBCBADCDCBADABABABCBADCBCBABADADCDCDCBA$ 3DBD7BD3BD3B2DB3DB3D3BD84B2DB2DBD2BDB2D3B3DB2D2B2DB3DBDB2D3BDB2DB4DB 2DBDB5D4B5D2BDB3D2BD2B2DB$BABCDCBADCDABCDABADCDCBADADABABCDABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABCDABCBCBCBCDCBCBCBABABADADABADCBCBABABADCDCBCDCBCBADCDCDCDCDABAB ABADADCDCDABCDCDADC$2DBDBDB2DB7D6B4D3B3D83B2DB2DB4DB6D3BD2B2DBDB4DBDB 3DBDBDBDB3D3BDBD2BDBDB3DBDBDBDBD3B2D2BDB4D$DABABCBCBCDCDADADCDADADCBA DCBCBCDCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABADADABABABABCBABADCDADCDCDADABCBCBABCDABCBCBCDABC BABABADADCBADABCDCDADABADCDCBABCBCDC$2DB6DBD2B2D5B2D2BD2B3D2B2D81BD3B 9DB5DB4D2B3DB2D2BD4B6D2B3D2BDBDBD2B7D3B2DB3DB3D2BDB2D$DCDABADADADCBCD ADCBABCDABCDCDCDABCBABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABCBCBCBADCBADADCBADCBADADCBADCDABADADAD ABADABCDADADADCBABABCDCBABCDCDABABADADCBCDCBCDC$3B2DBDBD2BD2BDB2DB3D 7BD2BD82BD2BD2B4D2BDB4D2BD4BDBD2BDB3D2BDB2D6BD4BD2B2D5B2D3BDBD4BDB3D 4B2D$BCDCDABCBADCDCBADCBADABCDCBCBCDABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABADCBADCBCDCBCBAD CBADCBCDABCBABCDADCDADCBADABCDCBADCBCBADCBCBCBABABCDCBCDCBCDCDCDCDC$B DBD3BDBD2B3DB2DBD2B3DBDBDBD86B2D5BD4BDB2DB4D2BD2B2DBDBDBDB3DBDB2D2BD 3BDBD2B4D4B2DBDB3D2B2D2BD2B3DB$DABCDABABADCBADCDCDCDCDCBABABCBCDABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABCDCDABCDABADABCDCBCDCDCDADABCDADCDCDABADADADADABADADABCDCBABC DCDCBCBCBCDADCDCBCDABCDA$3BD2BDB2DBD2BD2BDB2D9BDBD84B3D4B2D5B3DBD2B4D 2B4D2B10DB3D3BD2BDB2DBDB2D2B2DBDBD2B2D5B4D$DADCBCBADCBCBCBABCDADABADA BCDADCDABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABCBCBADCDCDABCDCBADCDADADADABCDCDADABABCBABCBADCDA BCDADABADCDCDCDABCDADCDCDADADADCDCBC$2B6D3BDBDBDBDBD2BD4B3DB3D81B3D2B DBD5B3D3B2D2B4DBDB2DB2D3BD6B2D7BDB2D2BD3BDB7D4B3D4BD$DADABABCDCBCBCBA BCDADCDADCBADABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABCBABADCBABCBCBCBADADADCDADADADABABABADC BCDCBADCDCDADCBCDABADADCBCDCBCBABABCDADCBADADC$DB3D4B3D2B3D3B4D2B7D 82B4DBD2B2D2B2DBDB3DBDBDBDBDB3D2B3DBD4B5D3BDB4D3BDBD5BD2B2D5BDBD3BD$B ABADCBADADABCBABADADCDABCDADCBCDCBABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABCDABABCDCDCDCDCDADCDCDCB ABADADABCBADABCDADCDCDCBABABCBCBABCDADABABABCDADADADABADADCBA$D2B2DBD 2BDBD2B8DB2D2BDB3DBD84B3D2B4DBDBD2BD2B3D3B4D4BD3BD3B3D2B3D6BD4B2D2BDB 2D2BDBDBD2B2DB2DB$BADCDADABADCDABABABCBADADCBADCDADABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABADADC DADCDADABADCBABCBADABADCBCBCDADADCDCBCDABCDADABADCBADCDCBCBCBCBABCDAD CDABCBABADA$B4D3B3D2B3D2B2D3BD2BDB3DB2D82BD4BDBD2B4DBD2BD4B3DB2D2BD2B DB4D2B6D3BDBDB2DB5D4BDBDB3D3BDBD2B2D$DABCBADCDCDADCDCBCDCBCBABCBABABA DABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABCBCBCDCBABCBABADABCBCDABABCDABADABABADABCBCBCDCDABABCBA BADCBCBABABADADCDADCDABABCDABA$BDB4DBD3BD3B7D3B2DB2DB2D84B2DBDB2DB3DB 2D4B5D4BD2BDBDBDB3D5B3D3B3DBD2BD2B4D6BDB2D3B2DB2D$DABCDABADABADCDADCB CDABABADCDCDADCBABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABCDABCBABABABCDCDABADADABCBADABCBADABABAB CDCDCBADADCDCBCBCDCDCDCBADCDABCDCDCBCBCBCBA$BD2B2DBDB5DBDB3DB2DBD2B2D 2BD83BDBD2B2DBDBD2BDBD2BD4B2D3BD4BDBDB2D2BDB4DB3D3B4D5B2DBD2BDBD3B4DB D2BDB$DCBADADCDABADCBCBADABABADADABCBADCBABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABCDCDCBADCDADC DADCBADABABABCBABABADABABADCDCBADADADCDADABCDADCDADCBADABABABCDCBADC$ DB2DBDBD3BD4B3D2B3DBD5B3D82B3D7BDBDB4D4B6D4B3D2BD3BD2B2D3BDB5D4BDB2D 2BD3B2DB5D5BD$DADCDABCDCBADCBADABCBCDCBABCBCBCDCBABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABCBABADC DADADABCDCBABABCBADADCBCDABCDADABADCBCBABCDCDCBADADADCDABADABABCDCBCB ADCDCDC$DB2DBDB2D2B3D2BDB3DB3D3BDBD86B4DB2D7BD3BD2BDB5DB7D2BD2B2D2BDB D4B3D3BD10BD2BD2BDBDB2D2B$DCBABABADCDADABCDCBADADCDABCDABCBCBABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABCDCBCDABABCDCBCBCBABCBCBABABCDCDADCBCBCBADADCDCDCDCDADABCDCDADADAD CBCDADCBADADABADABC$2D6B2D2BDB2D2BDB2DBDBD3BD3BD89B3D5BD2BD2BD5B2D2B 6DBD3B2D2B3DBD3BD2B2D2B3D2BDB3DBD2BD2BDBDBDB$DCBADCBCBADABADADABADCDC BCDADABADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABCDADABADADADCDADCBCBCBCBCDCBADCDABADABABCDABCDC DADCDCBABCBABABADCDADCDABABABADADADCBC$B3D3B2DBD3B3DB3DBD2BD3BDBDBD 82BDBD7B2D2B2DBDB5DB2DB2D2BD2BD5BD3BD2BD6B4DBD2BDB2DB5DBD4BDBD2B$DCDA DCBADCDCBADCBABABABCDCDADCBADCBABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABCDCDCBCBCBABADABCDABCDCBA DABABADABCDABADCBADADCDCBCDADADADCDABCDCDABABCDCBCDABABADA$2B4DBDB3D 3B3D3BDB3D2B2D2BD85BDB2DB2D2B2D5B3DB3DBD9B4D2BDB2DBDB2D2BDB3D2B3DB4DB 3D3BDB5DBD$DCDABCBCDABADCBCDCBCDADABADADCDCDCBABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABADABADCBCDAD ADCBABADCBCBCBCBADABCDABCBCBABADADADCBCDABCBCBADABABABCBABADADCDCDCBC BADA$2D4B5DBDBDBDB2DBDBD2BDBDB3D82BDB5D2B2D4BD2B2D2B2D2BDB4DB2D2B3DB 8DBD7B3DBD2B3DB3D4B3DBDBDBD$DADABABCBADCDCDCBADABADABCBCDADABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABCDCDCBCBABABCBABCDABCBCDABADCDCDADABCBCDCDADCBCDADCDCDADCBCDABAB ADADADADCDABADADADADA$6D2BD2B3D3BD4BDB5D2B2D87BDBD2B2D2BDB4D11B2DB6D 2BDBD2BD2BD2B2DBD2BD3B2D2B2D2B2D2BD4BD3BD$BADCBCDABCBCDCDCDCDABADCBAB ADADCBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABCBCDABABCBCDABADCBABABCDCDCDCDCBABABABABABABCD ABABCBADADABABABCDCDCBCBADCDCDABCDC$DBDB3DBDBD3B4D2BD2B2D2BD3BD2B2D3B D2B2DBD2BD3BDBD2BD2B2D2B3DB2D2B5D2BDB3DB8DB2DB2D2BDB5D4B2DB3D6BDBDB4D 2B4DB2DBDB3DB3D3B3DB4DB3D2B2D3B3D5B3DBDBDB4DBDBDB2D$DABADADCDADABADAD ABCDCBCBADABADCBCBABCBCBCBABADADADADADCBCDCDCDCBCDCBADADCBCDCDADABCDA BADADCBADABABADABCDABADCDABCDABCBABCBADCDADCBCDABABCBCBCDABCBABADADAB CDABABCBABCBABADCDABCBCDCBABCDADADCBADCBABADC$2DBDB2D3B2DB2D2B2DB3D2B 2DB2D2B5DB3DB2D4B2D4B3DBDBDBD2B8DBDB2D3BDBDBDB3DB3DB2DB3D2BDB4DBD3B2D BD3B2DBDB2DBD2B2D2BDBD2B3D2BD2B2DB4D4BDBD3BDBDBD3BDBDBD3B3D6B2DB2D3BD $BCDADCDABADCDCDCBCDADCDABABABCDADCBADADADABADADABCBADCDCDCBABADCDCBA DABADCDADADADCDADADABABCDABADABCDABCBADCDADCBABCDABADCDCBABABCDCDCDCD CDCBABADABADABCDCDABABADABCBABABCBCBCDCBCBCDABCBCBABCDADCBABADC$6DBDB DBDB5DBDB2DB5D2BD3BD5BDB3DBDB4DBD7BD2B4DB2DBDBD2B4DBD3BDB5DB3D5BD4B2D BDB6DB2DBD7BDBDB2D2BD2BDBDBD2BDB2DB5DBDBDBDBDBD2B2DB3DB3D2BDB4D2B2DBD BD3B$BADABABCBABADCDABCBABADADADCBADCBADADCBABCBCBADCBABADCBCBABABCBC BABABCBADCBCDCBCDABCDCBCDCBCBADADABABCBCBCBADCDABCBCBADADADCBCBABCDCD ABABCDABADCDADADCDCDCBADADCBCBCBCDABABCDCBCDADCDCBCBADABCDADABABADC$B D2BD4B4DBD2BD2B2DB2D4B3D2BDBDB2D4BDBD3BDBD2B4DBD4BDBDBDB3D4B3DB3DB3D 4BDB2D2B3D3B4DBD3B4DBDBDB4D2BDB4D4B4DBD5B3D2B3DBD2B4DB3DBD5B2D2B2D5BD 3BDB2DB2DB$BCBADCDADCBABADADCBCBCDCBABADADABABCDCBABADCDADABABCDCDCBC DCDCDADCDCBCBADADABCDCDADABCDADADCBADABABCDADCBCDCBADCBCDADCBADCBCDCB ADABCDABCDCBCBCBADABABABCBABADCBADCDCDABADADADCDADADABADABCBABCBABCDC DCBC$4B3DBD3BD2BD3BDB4D2B2D3BDBD2BD2BDBD3B2D2BD2BDB3DBDBD2B2DBDBDB2DB D3BDB3D3BDBDB3DBD2BDBDB2D3BD2BDB2DB2DB2D7B3D5B2DB2D6B4D2B7D6BD4B10D2B D4BD5B7DB$DABCBCBADCDADCBCDABADADADCBADADCBABCDADADCBCBCBCBCDABCDADAB CBCDABADCDADABCDCDCBCBCDABADABCBABCBCBCBADCBABCBCDCDCBCDCBCDCBCDCDABC BCBADCBCDADCDABADCBCDADADCBCBABCBCBCBCBABABABCDADCDABCDADABABCBCDCBAD CBA$BDBD3B2DBDB10D2B3D5BD2BD5BDBD6B3DB2D2BD5B2D2BD4B2D2B3D2BDBD2B2D2B DB2DBDBDB3DB4D3BD3B2D3B3DB2D3BDB4DBD3BD4B5DBD7B2D2BD5BD4BD3B3D7BD4B2D 2BDBD$DCBCDADABCDADABCDCDCDCBABADCDADADADCBABCDADCDCBABABADABABCBCBCB ABADCDABADCBCDABCDCDABCBADCDCBCDCBABADADABABCBCBADADCDCBABADADABABABA DADADABCDABCDCBCBADADCBABCBABCBCDABCDCBCDCBCDADADABCBABCBADCBADCDADA$ D3B3D2BDBDB2DBDB3D3BDB2DB3DBD6B2D3BD2B5D7B2D2BD2BDB2D3B2D4BDBD4BD2BDB 2D2BDB2D5B5D2B3D2B2D3B3DB4DB3D2B2DBDBD7B2D2BDB3D2B3D2BD2BDB6DBDBD4BDB DBD2B2D6BD$DADABADCBADABCBCDABCDADABADADABCDCBABCDCBCDADCBCBABCBABABA DABABCBABABABCBCDADCBCDADCBCBADCDABCBCBCDADCDCDADCBCBCDCBCBCBABABCBCD CBCBCDADADADADABCBADCBCBCDABCDABADCBADCBADADABCBCDCBCDCDCBCBADCBABCBA BCBA$D3BDB3D3B2D2B2D2BDBD3BDB4DBDB2DB3DBD2BD5B3D3BD2BDB3DB3DBDB3D4B2D B2D3B4D2B2DB2D5BD2BD5B3DBD2BD3BDBDBDB4DBD3B2D7B3D5BD3BD3B2DBD2BD2B2D 2B5DBDB2D3B3D2BD3B2D$BCDADCBADCBABABABABABABCDCBADCDCDCDCBABCBABADABC DABCDABCDCBABCDADCBCDCDADABABCDABABCDCBADADABCDCDCBCDABCBCDCBCBADCDAB ABCDCDCDCBABADABABCBADCBABCDADABADCDCDCBCDADADCBADCDCDADABADCDADCBCBC BADCDABCDADCBC$2BDBD2B2DB2DB2DB3D3BDB3DB2DB2DB2D2BD2B3DB3DB2D3BD2B3D 3BDBDB2DB2DBDB2D2BDBDB2D4BD2BD10BD4BD2B4D2BDBD3B3D3B2DBD3BD6B3D2B10DB 6D3B2D2B2D3B8DBD2BD4BD5B$BCDABADCDABCDADCDCBADCDADCBCBADCBCDCDCBCBCDC DCDABCBCDABCBCDADABCBABABCBCBCDABCDCBCDCBADADABCDCDCBADADCDCDADCDABCB CDADABCBABCDCDABADCBCDABADABCDCBABCDCBADCBCDCBCDABABCDCBCDABCBCDADADC BCDADCDADADABADCBC$DBD3BDB4D2B2DB3DBDB3D3BD3BD3B2D3BDBDB2DBD3B2DBD2BD 3BD4B3DBDBDB4D2B2D3B4D10B2DB2D6B3D4B4D4BD2B2D2BDBDB4DBDB2D2B2DB2D4BDB DB3D2BD2B5DBD8B2DBDB2D2BD3B2D$DADADABABABCBADCBCDABCDCBADCDADCDCDABAD CDCDABCDABABCDCBCBCDABADABADCBABADADABCDABABABABABCBABADADCBCDCBCBABC BABABCBCBADCDCBCBCDADABCBADABCBABCBCDABADABCBADADADADCDADADABABABABCD ADADCBADCBCBABADADADADA$D4B4DB5DB2D2B5D2BD4BD2BDB2DB2DB2D3B7D2BD2BD2B 2DB2DB2D3B3DBD2BD5BD4BDB2D3B2DB2DBD2B2DB3DB2D3BD2B2D2B7D2BD3BD4BD2BDB 2DB6DBDB2D2B4D2BDBD4B3D3BDBDBDB3DB4DB$DCBCDCDCBCDABADCBABCBABABCBADCB CDABADCDABCDABCBCBCBCDCBCDCBADABABCDADCDABCDADADABABADABCDCBABCDABABA DADADCBCBCBCDCDCDCDADCDADCDADABCBCBCBABADCBADABCBABADADABCDCDCDCDCDAB CDADCDCDABCBADADCBADADADADABCDC$3D2B2DBD2B3D5BDBDBDB2DBD2BDBD2BDB7DB 2DB2D5B3DBDBD4B3DB4DB4D3B4D3BD3B3D2B3D2BDBDBD6BDBD4BDB2D3BD3B7DBD2B9D 2BDBD4BD2BD7BD3B9DB5DBDBD4B$BCDCBABCDADCBCBADCDABCDCDADCBADCBCBCDADAD ADCDCBABADABABCBCDADCDABCDABCBADADADADABCDABCBCDADCDCBADADADCDADCDABC BABABADCDCDABCBADADADCBCDCDCDCBADCBCBCDABCDADADCDCBCDABCDABCDCDADCBAB CBCBABCDABABCDCDABCDA$2D8BDBDB4DBD2B2DB3D2BD2BD2BD2BD3BDB2DB2D2BDBDBD 2BDBD3B3DB2D4B2DB2DB8DBDBDB4D3BDB2D2BD3B2D2B2DB4DB4DB2DBD2B4D2B4D5BDB 4D3B2D5B2DBD2B2D2B2DB3DB5D2BDB5D2B2D$DCDADADCBCBADCDADADADCBCDABABABA BADCDADADABABCDABADADABCDCBADADCDADABCDADADCBCDCDCDADCBADCDABABCBADCD CBADADCDABCBABCBADCDCBCDADCBABCBABADCBCBABCBABCBABABABABCDCBCBABCDADA DCDABCDCDCDABCBCDCDABCBADCDADC$B3DBD5BDBDB5D6B2DBD2BD2B3DBD3BDB4D6BD 2B3D2B2D3B2DBDB3DBDBD3B3DB2DBD3BD2B6DB2DB2DBD4B3D3BD5BDBD2B2DBDBD9B3D 2BDBD5B4D3B2D3B2DBDBDBDBDBD2B3D2BD4B2DBD$BADABCBABCBADCDCBCDCBCDABCDC BABCBCDCDABCDADCDABCBCDCDABCBCDCBCBADABCBCDCDADADADABCDADCBCDABABABAB ABADADCDCBCBADABABABABABCBABABABCBCBADADCBCBCBCDCBABCBCDCDABABADABCBA BADADABCDCDADABCBABCBCBCDABABCDCBC$D2B5D2BDB2D6BDB2D2BDBD7BDB3DBD3B2D 2B2DB5DB2D2B2DBD2B2D2BD3BD3BD5BD2B2DB2DB4DBD3BDB8DB2DBDB3DBDB5D2BD2B 2DBD7BD3BD3B2DB6DBD3B2DBD4BD2BDB3D3BD3BD2BDB2D$DADABADCDCDABABADCBCBA DCDABCDABADABABABCDADCBCDCDADCDCBABCDABCDADCDCBCDCBABCDCDABCDADCBABAB ADABADCDCBCDCDABCBCDCDCBADADABCBCBABCDADABCDABCBABCBADADCDABCBABADADC DCBCDCBADADABCDABCDCDABABCDADCBADCDCDADA$3D4B7D3BDBD2B5D2B4D2B7DB4DBD 2B2D5BD4B3DB5D2BD2B2DBDBDBDB2D3B2D3BD7BD3B2D2BDB2DBD2B4DBD5BD5B2D2BDB DB3DB2DBDB2DB2DB2D2BD4B2D3B3DBD4BD2B2D3B2DBDB2DBD$BADCDCBCDCDCBCBCBCB CDCBABCBCBADADCDCBABCBCDABCBABCDABCBCDABADADADCBADABCBADCDABABADCBCDC BADCDADADADADADCDCBCDCBABCBCDCDABCDABABADCBABCDCBCDCBABABCBABCBCDABAD CBADADADCDABCBCBADABCBCDABCBADCBADABADCBABA! golly-2.5-src/Patterns/Margolus/HPP.rle0000644000175100001440000000274612156145314014750 00000000000000#CXRLE Pos=-10,-10 # HPP Gas implemented in the Margolus neighborhood, as described in: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:2 # neighborhood:Margolus # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 1,0,0,0 : 0,0,0,1 # one particle moves to the opposite corner # 1,1,0,0 : 0,0,1,1 # two particles pass through each other # 1,0,0,1 : 0,1,1,0 # two particles collide head-on # 1,1,1,0 : 0,1,1,1 # three particles pass through each other # x = 20, y = 20, rule = HPPMargolus_emulated:T20,20 20B$BABABABABABABABABABA$20B$BABABABABABABABABABA$12BD7B$BABABABABABA BCBABABA$20B$BABABABABABABABABABA$20B$BABABABABABABABABABA$20B$BABABA BABABABABABABA$20B$BABABABABABABABABABA$20B$BABABABABABABABABABA$20B$ BABABABABABABABABABA$20B$BABABABABABABABABABA! golly-2.5-src/Patterns/Margolus/Sand.rle0000644000175100001440000007403312156145314015204 00000000000000# A simple simulation of sand particles using the Margolus neighborhood # - inspired by MCell's version. # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using states 1, 2 and 3. Next # select-all and run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:4 # neighborhood:Margolus # symmetries:reflect_horizontal # # # The Margolus transition a,b,c,d : e,f,g,h means: # # a b --> e f # # c d g h # # # 0 : air # # 1 : sand # # 2 : wood # # 3 : magical source of sand # # var a={0,1,2,3} # var b={0,1,2,3} # # 1,1,0,0 : 0,0,1,1 # a pair of sand particles falls # 1,a,0,b : 0,a,1,b # otherwise, sand falls next to a static column # 1,0,a,0 : 0,0,a,1 # otherwise, it can topple # 3,a,0,b : 3,a,1,b # sand can appear from the magical source # x = 204, y = 273, rule = Sand-Margolus-emulated BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$94BH109B$BABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$ BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$84BF119B$BABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABA$84B2F118B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABA$85B2F117B$BABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABAB ABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABA$88B2F12B2F100B$BABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BEFEFEFEBABAFEFABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABA$95B6F103B$BABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABAB ABABABABABA$154BF49B$BABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABA BABABABABABABABABA$154BF49B$BABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABAB ABABABABABABABABABABABABA$154BF49B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABA BABABABABABABABABABABABABABABABA$153BF50B$BABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABAB ABABABABABABABABABABABABABABABABABABABA$153BF50B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABA BABABABABABABABABABABABABABABABABABABABABABABA$153BF50B$BABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB AFABABABABABABABABABABABABABABABABABABABABABABABABABA$89BF62BF51B$BAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABEBABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABAFABABABABABABABABABABABABABABABABABABABABABABABABABA$90BF 61BF51B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABAB ABABA$91BF60BF51B$BABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABABAB ABABABABABABABA$92BF58BF52B$BABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABA BABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABABAB ABABABABABABABABABABABABA$93BF55BF54B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABA BABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$94BF53BF55B$BABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABEBABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABAB ABABABABABABABABABABABABABABABABABABABABABABA$96BF48B2F57B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABEBABABABABABABABABABABABABABABABABABABABABABABAFABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABA$98BF45BF59B$ BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABABABA BABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 100BF40B2F61B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABAFEBABABABABABABABABABABA BABABABABABABAFEFABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$102B2F30B4F66B$BABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFEFABAB ABABABABABABABABABABEFEBABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABA$107B2F14B8F73B$BABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABEFEFEFEFEFEFEFABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABAB ABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABA$55BF148B$BABABABABABABABABA BABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABA$55BF148B$BABABABABAB ABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABA$55BF148B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$55BF 148B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$55BF148B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABAF ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABA$56BF147B$BABABABABABABABABABABABABABABABABABABABABABABABABA BABABAFABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABA$56BF147B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$57BF146B$BABABABABABABABABABABABABABABABABABA BABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABA$58BF145B$BABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABEFABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABA$60BF143B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$61BF142B$BABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABA$62BF101BF39B$BABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABEBABABABABABABABABABABABABABABABABABABABA$64BF 98BF40B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABAB ABABA$66BF96BF40B$BABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABAB ABABABABABABABA$67B2F93BF41B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABAFABABABABABABABA BABABABABABABABABABABABABA$69BF91BF42B$BABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABAFABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFABABABA BABABABABABABABABABABABABABABABABABA$71BF88BF43B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABAFABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BEBABABABABABABABABABABABABABABABABABABABABABA$72BF85BF45B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABEBABABABABABABABABABABABABABABABABABABABABABABA$74BF80B2F47B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABABABA$ 76BF76BF50B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABAFABABABABABABABABABABABABABABABABABABABABAB ABABABABA$77B2F70B3F52B$BABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABAFEFABABABABABABABABABABABABABABABABAB ABABABABABABABABABABA$80BF63B2F58B$BABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABEFABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABA$83B3F54B3F61B$BABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFEBAB ABABABABABABABABABABABABABABABABABABABABABABABABEBABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABA$88B4F44B3F65B$BABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABAFEFEBABABABABABABABABABABABABABABABABABABAFEBABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABA$96B17F14B7F 70B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABEFEFEFEFEFEFEFABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB A$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$204B $BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABA$204B$BABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABA! golly-2.5-src/Patterns/Margolus/Sand-Test.rle0000644000175100001440000000376012156145314016120 00000000000000#CXRLE Pos=-6,-12 # A simple simulation of sand particles using the Margolus neighborhood # - inspired by MCell's version. # # Note that with the Sand-Margolus-emulated rule, only two of the blocks # of sand collapse. Now change rule (Control | Set Rule...) to # Sand-square4cyclic_emulated, and note that all four blocks of sand # collapse. # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. In the Margolus nhood, # odd-numbered cells are those in the top-left corner of each 2x2 block. # In the square4_cyclic neighborhood (if you've changed the rule to # Sand-square4cyclic_emulated), on odd-numbered generations it is the even- # numbered cells that are in the top-left corner of each block. On even # generations the pattern is the same as in the Margolus neighborhood. # # These background states means that you can't just scribble on the pattern. # Either carefully maintain the appropriate odd-and-even pattern, or use the # helper scripts provided: a) First run export.py in Scripts/Python/Margolus. # b) Draw, using states 1, 2 and 3. c) Select-all and run import.py. You can # now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:4 # neighborhood:Margolus # (or square4_cyclic) # symmetries:reflect_horizontal # # # The Margolus transition a,b,c,d : e,f,g,h means: # # a b --> e f # # c d g h # # # 0 : air # # 1 : sand # # 2 : wood # # 3 : magical source of sand # # var a={0,1,2,3} # var b={0,1,2,3} # # 1,1,0,0 : 0,0,1,1 # a pair of sand particles falls # 1,a,0,b : 0,a,1,b # otherwise, sand falls next to a static column # 1,0,a,0 : 0,0,a,1 # otherwise, it can topple # 3,a,0,b : 3,a,1,b # sand can appear from the magical source x = 15, y = 14, rule = Sand-Margolus-emulated 15B$BABABABABABABAB$15B$BABADCBABCDABAB$4B2D3B2D4B$BAFEFEFEFEFEFAB$ 15B$BABABABABABABAB$4B2D3B2D4B$BABADCBABCDABAB$2B11F2B$BABABABABABABA B$15B$BABABABABABABAB! golly-2.5-src/Patterns/Margolus/TMGas_largeWithHole.rle0000644000175100001440000036264712156145314020123 00000000000000#CXRLE Pos=-212,-214 Gen=0 # Toffoli-Margolus gas, from: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using states 1, 2 and 3. Next # select-all and run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # # original Margolus states: # # 0 : background # # 1 : wall # # 2 : gas particle in an even step of the simulation # # 3 : gas particle in an odd step of the simulation # # neighborhood:Margolus # n_states:4 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,2 : 0,0,3,0 # even step: rotate clockwise # 0,0,0,3 : 0,2,0,0 # odd step: rotate anti-clockwise # 0,0,1,2 : 0,0,1,3 # contains a wall: no movement # 0,0,1,3 : 0,0,1,2 # contains a wall: no movement # 0,0,2,1 : 0,0,3,1 # contains a wall: no movement # 0,0,2,2 : 3,0,3,0 # even step: rotate clockwise # 0,0,3,1 : 0,0,2,1 # contains a wall: no movement # 0,0,3,3 : 0,2,0,2 # odd step: rotate anti-clockwise # 0,1,1,2 : 0,1,1,3 # contains a wall: no movement # 0,1,1,3 : 0,1,1,2 # contains a wall: no movement # 0,1,2,0 : 0,1,3,0 # contains a wall: no movement # 0,1,2,1 : 0,1,3,1 # contains a wall: no movement # 0,1,2,2 : 0,1,3,3 # contains a wall: no movement # 0,1,3,0 : 0,1,2,0 # contains a wall: no movement # 0,1,3,1 : 0,1,2,1 # contains a wall: no movement # 0,1,3,3 : 0,1,2,2 # contains a wall: no movement # 0,2,1,1 : 0,3,1,1 # contains a wall: no movement # 0,2,1,2 : 0,3,1,3 # contains a wall: no movement # 0,2,2,0 : 0,3,3,0 # two or four particles collide: no movement # 0,2,2,1 : 0,3,3,1 # contains a wall: no movement # 0,2,2,2 : 3,0,3,3 # even step: rotate clockwise # 0,3,1,1 : 0,2,1,1 # contains a wall: no movement # 0,3,1,3 : 0,2,1,2 # contains a wall: no movement # 0,3,3,0 : 0,2,2,0 # two or four particles collide: no movement # 0,3,3,1 : 0,2,2,1 # contains a wall: no movement # 0,3,3,3 : 2,2,0,2 # odd step: rotate anti-clockwise # 1,1,1,2 : 1,1,1,3 # contains a wall: no movement # 1,1,1,3 : 1,1,1,2 # contains a wall: no movement # 1,1,2,2 : 1,1,3,3 # contains a wall: no movement # 1,1,3,3 : 1,1,2,2 # contains a wall: no movement # 1,2,2,1 : 1,3,3,1 # contains a wall: no movement # 1,2,2,2 : 1,3,3,3 # contains a wall: no movement # 1,3,3,1 : 1,2,2,1 # contains a wall: no movement # 1,3,3,3 : 1,2,2,2 # contains a wall: no movement # 2,2,2,2 : 3,3,3,3 # two or four particles collide: no movement # 3,3,3,3 : 2,2,2,2 # two or four particles collide: no movement # x = 370, y = 432, rule = TMGasMargolus_emulated 370B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABA$370B$BABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$370B$BA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABA$370B$BABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABA$370B$BABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABA$370B$BABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABA$370B$BABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABA$370B$BABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABA$370B$BABABABABABABABABADCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCBABABABABABABABA BA$18BDBF2BF4B2F3BF3BFBF6BF2B2FBF3BF10BF4BF4BF7B3FBF3BF9B2FBF2BF2BF7B F3BF9BF2B3F2BFBF3BF6BF5B3F4BF5B3FB3F2B3F2BFB6F2B3FBF7BF5BF2BF5BFBFBF 8B2F6BF3BF4BF3B2F2BF2BF2B2FB2FB2F4BFB2F2BF2BF3BFBF3BF6B2F5BF4BFBF2BF 2BF4BFBF2B2F2BF2BF2B3FBD18B$BABABABABABABABABADABABEBABABAFAFEBABABAF ABABAFABABABEBABABABAFABAFABABABAFABABABAFEBABABABEFABABEBABABABABABA BAFEFABEFABABEFEBEFABEBEBABABABABABABABABABAFABABABEBABABABABABEBABAF EFEFAFABEFAFABABEBABEFABEBABAFABAFAFABAFABABAFEFEBAFEBEBABAFAFABABABA BABABAFEBABABAFABEFAFABABAFABABABABAFAFEBEBABABEBEBABABABABAFEBEBEBAB AFAFAFABABABEBEBABEFABABABABABAFABCBABABABABABABABABA$18BD5BF4BF5BF2B FBF9BF5BF8BF3BF17BF14BF5BFBF5BF2BFBF6BF7B2F7B2F3B2F2B2FB4FBF2BF4BFBF 3BF3B2FBFB2F3B2F2BF9BF3BF5B4FBF4BF3B2FBFBF3BF2B2F2BF7B3F4BF3B2F2BFB2F 2BF3B2F2BF4BF8BFBFBF2BF3BF2BFB4FB2FBF3B2F4BF3BF4B8F3BFBD18B$BABABABAB ABABABABADEBAFABABEBAFABABAFEFABEFABABABABEBABABEBEBEBABABEBAFEBABAFE BEBEBABEFABABABEBEBABABABEBABEBEBEBEBABEFABAFABABABABEBABABEBABAFABAB AFEBAFAFABABAFEFEFABABABABABEFEBABEFEBEBABAFABEFAFAFEFABEBABEFEBABABA BEBEBAFAFAFEBABABEFAFEBEFEBAFEFAFABABABAFAFEFEBAFABABEBABABEBABEBABAB AFABABABABAFABAFEBABABABEBABABABABEBABEBAFABABABABABABEFABAFEBABABCBA BABABABABABABABA$18BD2BF2BF2BF5BFB2F2BF2B2F8B2F15BF2BFBF4B2FBF3BF7BF 2BF2B2FBFBF2BF3BF4BF6BFBF3BFBFBF5B2FBFBF2BF4BF2B3FBF2BF2B2F2B2F2BF4B 2FB2FBF2BF3BFBFB3F4BF4B2F3BFBF13BF6BFBF4B3F8BF3BFB2F2BF5BFBF9B4F3BF3B F11BFB2F5B2F4BF3BF10BFBF5B3F5BD18B$BABABABABABABABABADEBEBABABABABABA BABEBEBABAFABEBAFABEBEBABABABEFAFABABABABABEBABEBABAFAFEBABABEFAFABEB AFABAFAFABABEBEBEBAFABABEBABABAFABABEBEBABABABAFABABABABABEBEBABABEBE BEFEFABABABABEFEBEFABABEFABEBABEBABABEBAFEBEBABABAFABABEBABABABAFABEF AFAFAFAFEBABEBEBEBAFEBEBABEBABABABABEBAFAFABABAFABABAFAFAFABABEBABAFE BAFABABEBAFABAFABEBEBABABEBAFAFABABABABEBCBABABABABABABABABA$18BDF4BF 2BF2B2F2BFB2F4BF3BF4BFBFBF8BF4BF5BF11BF2BF5BF4BF3BFBF11BF2BF3BF3BF8B 3F5BF2BFBFBF2BF2B3FBF9BF4BF6BF8BFBFB2F5B2F2BFBF2BF5B2FBF3BFB2FB2F5B2F 7BF7BF2BF2BF3B3F2BFBF11B2F3BF10BF3B2FB4FBFBF11BF5BFBF5BF6BFBD18B$BABA BABABABABABABADABABABABABAFABAFAFABABEFEBEFAFEFAFABEBAFABEBAFAFABAFAB ABABAFEBEBABEFAFABEBABAFABEBABABEBEBAFAFEBAFABEFABABEFABEFEBEBEBEFABA BAFABEBABABEBAFEFEFABABABABABEBEBABABEBABABABABABABABABEFABEBABABAFAF EFAFEBEFABAFEBABAFEBABABAFABABABEFABAFABABABABABABABABABABEBABABABABA FAFABABABABEBABABEBABABABABEBEBABABABABABEBEFEBABABAFAFABAFABEBEFEFEF ABCBABABABABABABABABA$18BDBF9BF2BF3B2FBF3BF4BF2B3F4BF6BF8BF6BF3BFB2FB FBF4BF6BF9BF13BFBF2B3F4BF3BFBF3B3F5BFBF5BF4BF2BF5BF4BF2B2F6BF7B2F4B3F BF8BFBF4B2FBF4BFBF2BF2BF2BF5BF3BFBF4BFBF2BF4BFBFBF13B2F2B2FBF5BF3BF6B 3F2B2FB2F4BF2B3FBFB2F7BD18B$BABABABABABABABABADEBABAFABEFABAFEBAFEBEF ABEBAFABABEBEBEBABABEBABABEBABEBABABEBABEBABABABEBABABABABEBABAFAFABA FEBABEBEBAFABABEBABABABAFABABABEBABAFABAFEBEBABABEBABABABAFABEFABABEB AFABABEBABABEBAFABABABAFABABABAFEBAFABABABABABEBEBABEBABAFAFEFABEBAFA BEBEBAFEBEBABAFEBAFAFEBAFABABAFAFAFABABABABEBAFEBABABABEFEFABABABEFEB ABABEBEBABABABAFAFABABAFABAFAFEFAFCBABABABABABABABABA$18BD2BFBF3BF2BF 2BF2BF3B2F6B2F5B3F9BF3BF14B3F2B3F2BF10B2FB2F4BFBF7B2F2BF2B2F3BF4BF2BF BF7BF3BF2BF5BF6BF3BF2B3F6BF2B2FBF2BF4BFBF3B3F3BF6BFB3FBF11BF7BF2BF3BF BF6BFB2F2BF2BFBF4B2F5BF8BF2BFB2F3BF4BF5BF3BFB2F4BF5BF12BD18B$BABABABA BABABABABADEBABAFEFABABEBABAFABABEBABAFABABEBABEBEFAFAFABABABABEFEBAF EBABEBAFAFEBEFEBABABEBABABEFABEFABABABABAFEBEFEBEBAFABEBEBAFABEBEBAFA BABABEFEBABEFAFAFEBABABEBABABEBAFAFEBEBABABEBABABAFEBABABABABABABABAF ABAFABEBEBABABABEBABABEFABEFEFEFABEBABABEFEBEFABABEFABEBABEBABAFABABE BABEBEBABAFAFAFEBEBEBEBAFABAFABABEFAFABABEFEBABABABAFABAFABABABAFABCB ABABABABABABABABA$18BD2BF2B2F4BFB2F8BF4BFBFB2F5BF8BF4B2F2BF4B2F8BFBFB 2FBFB2FBF9BF8BFB2FBFBF6BF3B2F2BFB2FBF4BF2BFBFBF2B3F2BF3BFBFBFBF2BFBFB F3BF5B2FBF3B2FB3FBF3BF2BF2BF3B3FBF14BFBF7BF2BF2B2F5B3F2B2F5B3F2BF3B2F BF2BFBF2BF3BFBF6BFB4F2BFB3F5BFBFBFBF5BF3BF2BF2BD18B$BABABABABABABABAB ADEBABEBABEBABEBEBAFABEBABAFAFAFAFAFABABEBEBABABABEBABEBEFABABABEBAFE BEBEBAFAFAFABABAFABABABEFABEFABEFEBEBABABABEFAFABABABABEBEBAFEFABABAB ABEBAFEFEFABABEBAFABABABABEBABABABAFABABAFAFEBAFAFAFAFABEBEBEBABAFABA BABEBEBABABAFABABAFEBAFEBABEFAFEBABEBABABABEBEBABABABABABAFABEBEFEBAB ABEBABABABEBEBABABABABABEBAFAFABAFABEBABEFEBEBAFABEBAFABABCBABABABABA BABABABA$18BDF7BF3BFBF10BF2BF2BF7B4F3B2F3B2F2B2F3B2F5B2F6B3F7BF2B2FBF B2F7BFBF2B3FBF3BFBFBFBF5BFBF3B3F2BF3B2FB2F5B2F3BF4B2F2BF2BF8B4F7BF2B 2FBF2BF5B2F2BF2BF6BF3B2F5BF6B2F10BFBF2BFBF7BFB2F4BF2BF6B3F3B2F2B2F7BF 7BF2BF5BFBF7BFBF2BD18B$BABABABABABABABABADEBABEBEFABEFEFABEBABAFABABA BAFEBABEBABEBAFAFABABAFEBABEBEBEBABABEBABEFEFABAFABEFABABAFABABABABAB ABABABABAFABABABABABAFABAFABEBABABABABEBEBABAFEBAFABAFAFEFAFABEBEFABA BABEFABAFAFABEFEFEBAFEBEBAFAFAFAFEBABABEBEBABEFEBEFAFEBAFABABABABABEF AFABABABABEBABABABEBABABEBABEFABAFEBABEFABABAFEFABABABABABABABABABABE FABEFABABEBABAFABAFABAFABABABCBABABABABABABABABA$18BDBF8BF5BF2B5F3BF 7BF2B3F3BF2BF5BF4BF2BF3BFBFB2F4BF8BF6BF10BF4B2F8BF5B2FBF3B3F3BF2BF7B 2F3B2F6BF3BFBF2BFB2F6B2F3B2F2B2F2BF2BF5B2F2BFBF5BF3B2F7BF10B2F4BFBF3B F2BFBF2BFB4F4B2FBFB2F3BF2BF6BF6BF3BF4BFBF4B2FBF2B2FBF4BF5BFBD18B$BABA BABABABABABABADABABABEFABABEFABAFEBEFABAFAFAFEBABEFABEBABEBABEFABEBAF AFABAFEFEBABEBABABABEFEBABEFEBAFABAFABEBABABABAFABEFABEFAFEBAFEBABABA BABEBAFAFEFEBAFAFEFEFAFEFABEBEBABABEBEBABABAFABAFABAFABAFAFABABABEFAB ABABEFABABABEBABEBAFABEFAFABEBEFABABABABABEBABEBAFEFAFABABABEFEFABABE BEBAFEBABABABEBABAFABAFAFABEBEBEBABABABABABEBEBAFABABABEBAFABEFABAFAB AFCBABABABABABABABABA$18BD2FBF3BF4B3F4B3FBF9BF3BF2BF11B2FBFBF2BFBF6B 2F3BFBF3BF5B2F4BF4BF4BF5BF4BFBF5BF8BFBFBF4BFBF2BF2B2F2BF13BF6BFBF15B 3FBF3BFB2F3BF2BF8B3F5BF6BF2BFBF3BF5BF8BF2BF3BF4BF7BF5B2F3BF13BF2BF2BF 2BF2B2FBF6BF2B2FBF2BD18B$BABABABABABABABABADABABABAFABEFABAFABEBAFEFA BABAFEBABEBAFEFEBEBEBAFABABEFABABEFAFEBABEBEBEFEBAFABABABABAFEBABABAB ABABABEFAFABABEFEFABEFABABEFABEFAFABABABEBABABABABABABAFAFEFEBABAFEBE FABABAFEBAFAFABAFABAFABABABABAFEBEBEBEBAFABABABABABABEBEFABABAFABEBEB ABABAFABAFABABABAFAFEBABEBABEBABEBEBABEBABABEBEFABABABABEFABABEBABAFE BABABAFABABABABEBABEFEFABAFABAFCBABABABABABABABABA$18BD3BFBF2BF3B2F8B F3BF14B2F6BF5BF2BF3BF2BF2BF2B2F2BF2BF2BFBF4BF4BF3BFBFBF4BF11BF11BF8B 2FBFBFBFB2F2B2F5B3FB2F5BFBF4BF3BFBF7BF2BFBF4BF6BFBF9BF3BF2BF3B2F2BF2B F2BF2BFB2F2B2F2B5FBF10BF3BFBF4BFBF5BF3BFB2FB2F2BFBFBFBF9B3F10BD18B$BA BABABABABABABABADABAFABAFEBABABABAFEBAFEBABABABAFAFAFEBEFABAFABEFABAB EBABAFAFABAFABABAFABEBABABABABABABAFABABABABEBAFABEFABAFEBABEBAFABABA FABEBABAFEBAFEFEBABABABABABAFEBEBABEBABAFEFABEBAFAFABAFABAFEBABAFEBEF ABAFEBAFABAFEBAFABAFEBABEBABEBABABABABEBAFAFAFEBABEBABABEBABAFABAFABA BEBABEBABEBAFEBAFABAFAFABABABAFEBEFABABABEFABEBEBABABEFABABABEFAFEBAB ABABCBABABABABABABABABA$18BD3FB2F6B3F4BF3BF2BF2BFBFBFBF2B2F5BFBFBFB3F B2FBF3B2F5BF5BF8BF5BF14BF2BF3BF7BFBF11BF4B2F4B3F3BFB2F3BFB2F2BFBFBF2B F3B2F3BFBF4BF2BF4B3F3B2F5BFBF3BF3B2FB2F11B3F2B3F4BFBF10BF2BF6BF3BF5BF 3BF9BFB3F2B2FBF8BF2B2FBFBF4BF6BD18B$BABABABABABABABABADABEFABABABEFAB ABABABABABABEBEBEBEFEBABABEBEBABABABABEBEBEBEBABABEFEBEFABEBABAFABABA BABAFEBAFEFABEBEBABAFAFABABEBEBABABABEBEBEBAFAFABAFABABABABABABABAFEF ABABABABEBAFABABEFEBEFAFABABABABEBABABABABABEBEBEBABEBAFABABABABABEBE FABAFABABABABEBEBABABABEBAFABAFEBAFABEFABEBABAFAFABABABABAFABABAFAFAB AFAFEBAFABEBEFEFABEFABABEBABABABABAFABABABCBABABABABABABABABA$18BDFBF 3B4FBF4BF2B2F3BF2BFBF6BFBFBF2BFB3F2BFBF2BF4BFBFBF2B2FBF5BF2B3FB2FBF3B F8B2F2B2FBF3B3F3B3F4BFB2F5BFBF4BF3BF8B2FBFBFBF5BF2BFBF13BF2BF6BFB2F3B F5BF4BFBF3BFBFBFB2F3BF7B2F2BF4B5F4BF6BF6BFBF3BF4BF3B2F12BFB5FBFBF2BF 8B2F6BF3BD18B$BABABABABABABABABADABABAFEBABEFABABEBABAFABEBABABABABAB EBAFABEFAFEFAFAFEBEBEBABEBAFAFABEBABABAFAFABAFABABAFEFEBAFAFEBAFAFAFA BEFEBEBAFEBAFABABEFABABABABEBABAFEBABABABABABAFABAFEBABEBAFAFEFEBEFAB EFAFEBEFABAFEBABABEBABEBEBABEBABABEBAFABEFABABEBEBABABAFABABEBAFAFAFA FEBAFEBAFAFAFAFAFEFABABAFABEBABABAFEFEFABEBAFABAFABABEBEBABABEFABAFAB ABEBABABEFAFAFABABEBCBABABABABABABABABA$18BD3BF2BFB3FB2F6BF7BF3B2F3BF B2F6BFBF2B2FBFBF6BF3BF3BF2BF3B2FBF4B2FBF3BF4BF16BF2BFBFB2F6BF5B2FB2F 10BF2BFBF2BF3BF2BF4BF2BF8B2F2BF4BF5BF8BFBF2B3F6BF3BFBF3BFBFB2FBFBFBF 3BF6BFB3FBF2B2F2BF4B2FBF5BF4B2F5BFBFBF6BF3BF3BF2B2F4BF6B3FBD18B$BABAB ABABABABABABADEFAFABEBAFABABABABEBEFAFABEBAFABEFABEBABAFABABEBABAFABA BABAFABABABEBEBABABAFEBEBABAFABEBABABEBABABABEBABABEBABEFABABABABABAB EBABEBAFEBABABAFEFABABAFEFEBABABAFABAFEFABEBABABABABABEBABABEBABAFABE BABAFEBABAFEBABEBEBAFEBABABAFAFEBABEBAFABABEBEBEBABEFEBABABEFABEBABAB ABEBEBABEBEBAFABAFABEBABEFEBABABAFEFEBEFEBABABABEFEBAFABEBABEBEBABEFE BCBABABABABABABABABA$18BDB4F7BF2BFBF4BF6BFBF8BF2B2FBF2BFBF6B2F2B2FBF 5BF2BF9B2FBFBF4BF9BF4BF4B3F9BF3BF3BF4B4F6BF5BF3BF4BF2BFBF4BF10BF4BF2B 2F7BFBFB2F2B2F3BF3BFB5F2BF2BF12BFBF7B2FB2F2B2FBF2B2F7BF4B3FBFBF2BFB6F BF3BFBF3BF2B2FBFBF2BFB2F3B2FBFBD18B$BABABABABABABABABADABABABAFEBAFEB AFABAFEBEBEFAFABEBABAFABEBABEBAFABEBABABABABEBABABABABAFEBAFABAFABABA BABABEFEBABEBAFABABEFEFABEBABABAFEBABAFABEBAFABAFAFEFABAFAFEBEBEFEBAB EBABABABEBAFAFABEBABEBABAFEBEBABEBABAFABAFEFABABEBEBAFABABAFABABABEBA BABABABABEBAFABABABABABABAFEBABAFABABEFABABABAFAFABABABABABEFEFABEBAB ABABEFAFEBAFABABABEBABEFEBEBABABABABEBABAFCBABABABABABABABABA$18BDFBF 2BFBF3BF4BF8BFB3F8B2F3BF5BF2BF7BF6BFBF9BFBF5B2F6BF3BF7BF7BF2BF2BF2BF 2BF9B2F2B2FBF4B2F7BF4BF3BF5BFBFB3F4BF2BF2BF4B2F2BF4B2F14BF3BF2BF12BF 4BFBF2B2F3BFBFB3FB3F10BFBF5B5F2B3F2BF6BF5BF2B2F6BF3B3F5BD18B$BABABABA BABABABABADAFEFABABEBABEBABEBEBEFABAFABABABABABABABAFEFABEFEFEBABABAF EBABABEBAFEBAFABABEBABABEBEBABAFABABAFABABAFEFABAFABAFEBAFEBABABABEBE BABAFABAFEBABAFAFEFEBEFEBAFABEBABABAFABABEBEFEBABABABABEBEBEBEBABABAB ABEBABABABAFABABAFABEBABEBEBABEFABABEBABEFABABABABABABABABEBAFEBABABA BABAFABABABAFEBEFEBABABABAFAFABEBABAFAFABABABABEBEFABABABAFEFEBEBEFCB ABABABABABABABABA$18BD2BF5B2F4BFB2FBFB2F2B2FB4F8B4F8BF3B2F6BFBF3BF4BF B2FB2F2BF2B2F2BF3BF5BF3BF2BF5BFBF5BF10B3F7BF2B2F2BF2BF2B2FB3F2BF3B3F 3BFBFBF5BF4B2FBF5B2F11B2F5BFB2F2B2F18B2F5BFBF2BF4BF2B3F2BF2BFBF2BF4B 2FBFBFB4F7BF5B3F2BFBF4B2F2BFBF4BFBFD18B$BABABABABABABABABADABAFAFEFAF AFABEBABABAFEFABABABABABAFEFEBEBEBABAFABABAFABAFAFEBABABABEFEBAFEBABA BABAFABEBABAFABAFEBAFEBABABABAFABEBAFAFABABABABEBABABEBABABABABEBAFEB ABABEFEFAFABEFEBAFABABAFABABEBABEBAFABABAFEFEBEBABABABEFABABABAFEBABE FABAFABEBEBABABEBEBABABEFAFABEBABABABEBABABEBEFABABEFABABABAFABAFAFAF EBAFABABAFAFABABABAFABAFEBABABABABABEFEBABEFABCBABABABABABABABABA$18B DF3BF2BF3B2F2BFBF5BFBFBFBF2BF13BFB3F2BF2BFBF5B2F4B2F5BF13BF4BFBFBF7BF 3B2F3B2FB2FBF10BF5BF3B2F8BF9BFB2FB4F3BF3BF2BF4B3F2BF5B2FBF3BF2BF5BFBF 4B2FB4F2BF3BF3B3F5B2F2BF4BFBF2BF3BF3BF3BF9BFB2F8BF2BF2BFBFBF5BF4BF5BF 2BF2BF3BD18B$BABABABABABABABABADABAFABABEFABEBABEBABABEBEFABAFABEBABE FABEBEFAFEBABAFAFAFEBABABEBAFABABABABABEBABAFEFAFABABABABABABABABABAB ABAFABEBAFABABABAFAFABABABABEBEBABEBEBABEBABEBEBAFAFABEFABABABEBEBABA BEBAFABABABABAFABABABEBABEBEBABABABABAFABABEBABABAFAFEFABEBEBABABAFAB EBEBAFABAFEBEFEBABAFABEBABEFEFEBEBABAFABAFAFABABABAFAFABAFABABAFABEBA FEFEBABAFAFEBABAFABCBABABABABABABABABA$18BD2BFBF4B2F5BFB2FB3F3BF7BF 11BFBF5BF2BFBF2BF2B2FBF2BFBFBF2BF14BF4B2F4BF2BFBF3BFBF4B2F2B2F24B2FBF 5BF7BF2BF5BF5B2F2B2FBF11BFB2F6B2FB2F9BFBF3B2FBF6BF11BFB3F3BFB2FBF2BF 2B2F2BF5BFB2F2BF6B2FB2F4B2FBF2BFBF3B3FBFBF2BF5BD18B$BABABABABABABABAB ADAFABEBEFAFABEBEBABAFABEBAFEBAFAFAFAFABABABABABABAFAFEFAFEBEBEFABABA FEBEFABABABABEBEBAFABAFABABABAFAFABAFEFABABEBAFABEBAFEBABAFABABEBEBAB EBEBAFAFAFABEFABAFAFABEFEBABAFAFABAFABEFABEBABABEFABABEBEBABABEBABABA BABABAFABABAFABABEBABABEBABABABABEBABABEBAFEBAFAFABABEFABEFABEBABEBAB EBEBEBABEBAFABABABABEBABEBEBEBABABABEFABAFABABABEBAFEBABEBCBABABABABA BABABABA$18BDBFB2FBF4BF3BF3B4F6B2F3B3F2B2F2BF9BFBF3BF2BF3B3F4BF6BF3BF 2BFB2F3BF2BF3BFBF2BF3BF8B2FBFBFBFBFBFBF4B2F3BF17BF7BF3BF3BF8BFBF9BF2B F9BFBFBF2BF3BF2BF2BF4B2F18BFBFB2F5B2FBF8BF9BF3BFBF7B3F8BF6BF3BFBFBF6B D18B$BABABABABABABABABADABABAFABAFABABABABEBEBEBABABABABABEFABEBABABA BAFABEBABEBABABAFABEBEBABABABEFABABEBEBEBABAFABAFABEBABABAFABABAFABAB AFEFEFABABEBABEBABEBAFAFABAFABABABABABABABAFABEBABEFABEBABABABABEBABA FABABEBEFEBABAFABABAFAFEBABABEBAFABAFABEFEBABABABABAFAFABAFEBABEBABAB ABABEBEBAFABABEBAFABABABABABABEBAFABABABEBABAFAFABAFAFABABAFAFAFEFAFE FEBABAFABABCBABABABABABABABABA$18BD2FBFBF4BF3B2F5BF3B2F6B2F9B2F9BF3BF 2BF8BF2BFB2FBFB2F2BF2BF7B2F8BFBFBF4BF2BFBF2BF8B2FBF2BFB2F6B4F3BF2BF2B 2F2BF2BFB2FBFB2F9BFB3F3BF4BF2BF2BF3BF6B2F3BF2B2F7BFB2FBFBF2BF4BFBF3BF 5BF3BF2BFBFBFBF4BFB2F3BF2BF3BF4BF6B2F2BF3BF3BF15BD18B$BABABABABABABAB ABADABABABEBEFAFABABAFABABABAFABAFEBABEBABEBABEBABABABABEBABABAFAFABA BABABABABABABABABAFABABABEFABEBEFEBEBABAFABABEFABAFEBABABABAFABAFEBAF ABABABAFABAFABAFAFAFABEBEBAFEBABAFABEFABABEBABABABABEBAFEBABABEBEBAFA BAFEFEFABEFABEFABEBAFEBAFEBEFEBABABABABABABABABABABEFEBABABABABAFEBAB ABEFEBEBAFABABEBEBABABABABABEBAFEBABABEBAFABABAFEBAFEBABAFEBCBABABABA BABABABABA$18BD2BF5BF4BFBF8BF2B2FBFB2F6BFBFB3F2BF2BF12BF9BF5BF2BF2BFB F7BF5BF7BF6BF4B2FB2F7BF13BF3BF4BF2BF4BFB2FBF5BF3B3F2B2F4BF5BF5B5F5B2F 2B2F2BFBF4BFBF9BF3BFBF6BF4B3F7BF3BFBF2BFB3F4BFBF8BFBFBF4BF3B3F3BFB2FB 2F3B2F3BD18B$BABABABABABABABABADEBABABEBEBABAFAFAFEFAFABABEBABEBABAFA FABABABEBABABAFEBAFEBABEBABABAFABEBABABEFAFEBEBEFEBABABABABEBEBAFAFEB ABABEBABABAFEBAFABAFABABABABEBEFEFEBAFABABABAFABABABAFAFABABEFEBEBEBE BABABABAFABAFABEBABAFAFABAFABAFAFEFEBABAFABAFABEBABABEBABEBABEFABAFAB ABABEBEBABABAFABABAFAFABAFEBABABABABABABEBABABAFABABAFABEBABABEFEFABA FAFABAFEFEFABABAFEBCBABABABABABABABABA$18BD3BF6B2FBFBFBFBF6BF12BFBF3B 5F6BFBFBFB2F3BF2BFBF5B2F2B2F6BF3BFBFBFBF2BF5BF4BF7BF3BF6B2F5B2F11BFBF 8BF5BF5BF8BF7B2F6B4F6BF4B4F8B2F5BFBFBF6BF2BF4BFBF4BF4BF4B2FB2F2B2F2BF 2B3FBF2BFBF2BFBF2B2FBF3BF7B2F2B2FBF7BD18B$BABABABABABABABABADABABAFAF ABABAFABAFEFEFAFAFABABABABEBEBABAFABABABABAFEBABABAFAFAFABABEBABEFABE FEBABEFABABABEBABABEBABEBABEFABAFABABEFAFABAFABABAFEBABABAFAFEBEBEBAF ABEFAFAFEFEBABEFEBEFAFABABEFABABABEBEBABABABABABABEBABABABAFEBAFEBEBE FEFABEBEBEFABEFABEBABABEBABABABABEBABABEBAFEFEBABABEBABEFAFABABEBABAB AFEBABEBEBABEBABABEBEBABEBABEBEFABEBABABAFEFAFEBCBABABABABABABABABA$ 18BD7B2FBFBF3BF7BF12BF2BFBF2BFB2FBFB2FB7F10BFBF5BFB2FBF3BF3BF2BFBFBFB 2F4B2F2BFBF3B2F21B2FB2F5BF5B2F4BFB2F3B2FBF8BF4BF3BF5BFB2F7BF3BF6B2F8B F8BFBFBF7BF3BF3BF3BFB2F2BF2B2FBF8BFBFB2F10BFBF2B3F2B2FB2F7B2F6BF2BD 18B$BABABABABABABABABADABAFEBABABABABAFABABABABAFEBEBABAFAFEBABABEFAB ABAFABAFEBEBEFABABABABABABAFAFABAFABABEBABEBABABABABAFEFABEFABABAFABA BEBABABEBAFEBABABABAFABABAFABAFEFABABEBABABABABABABEBEFABABEBEBABABAB EBABEBABAFABABABAFABAFABABAFEBABAFAFAFAFAFABABAFABEBAFABABABABABEBEBA BAFABABABABEBEBABEBEBABABABEBAFEBABAFABABAFABABABABABEBAFABAFABABABAB AFEFEBABEBCBABABABABABABABABA$18BD9BFBFBF7BF5BF11BFB2F10BF4BF6BFBF5BF 5B2F4BFBFBF7B2FBF5BF2BF5B3F2BF2BF7B2F16BF6B3FBF14BF2BF12BF2BF2BF4BF2B F9BF2BF2BFB5F2BF7B2F3B3FBFBF14BFBF2BF3BF3BFBF2BF7B2F5BF2BFBF4BF3BF3BF B2F2B3FBF6BD18B$BABABABABABABABABADABAFEFABABABEBABAFAFABABAFABABABAF EFABEBABAFAFEBAFABAFABABABABABABEBAFEBABABEFABABABEFABEFAFABEBEBEBABA FEFABEBABABAFEBABEFABABABABABAFAFEBEBABAFABEBEBABABABEBABEBABEFABABAB EFEBAFEBAFABABEFEBABEBAFABABEBABEBABAFABABABEFABABABABABAFABEFEBABABA BABAFEBAFABABEBABABAFABAFAFABABEBABAFAFABABAFEFAFABEBABABEBABABABABAB AFAFAFABABEBABABABEBAFCBABABABABABABABABA$18BD2BFBF2BF3BF2B2FBFBF11B 3F11BF9BFBFB3F4BF7BF6BF4B2F3BF4B2F2BF4B2F6B3F3B3F3B2FBF6BF2BF2B3F3B3F 3BF2BF10BFBF5BFBFB2F3BF4B2F9BF12B2F2B3F5BF2BF3BFBF2B3F13BF2BF6BF4B2F 3B3F6BFB2FBF12BFBF2BF3BFBF2BFBFBF2BF3BF6BD18B$BABABABABABABABABADEBAB ABABABEFABEFABABAFABAFEBEBAFEBABABEFEBABEBAFEBABEFEBEBABEBABEFEBAFABA BABABABAFABEBEBABAFABABEFABAFAFEBEFAFAFABABEBAFABAFAFEBEBABABAFABEBAF AFAFAFEBEBEFABAFABABABEBEFAFAFAFABABABEBEFAFABAFEFAFEBABEBABABABABEFE BABAFAFABABABAFAFEBABAFABEBEBAFEBABABAFEBABEFEFEBABAFABAFEBEFAFAFABAF AFABABAFABAFABEBAFABABEBAFEFABAFEFAFABABAFEBABEBEBAFCBABABABABABABABA BA$18BD2B2F3B2F4B2F6BF4B2F3BF8BF8BF3BF2BF4B2F4BF6BFB2F11BF3B2F3BF2BFB F2B3FB2FB3F10B2FB2F4B2F2BFB3F2B3F2BF2BF5BF2B2F4BF7B2F5B2F6BF2B2FBFBF 3BF10BF6BF13BF5BF11BFBFBF3B2F2BF6BF6BF4BFBF2BFB2FBF2B2F4BFBFB2F6BFB2F 2B2F8BD18B$BABABABABABABABABADEBEBAFEBABEFEBABABEBAFABABAFAFEFABABEFA BEFABAFAFEBABEFABEFEBABEBABABEBAFEBABEBEBEBAFEBABAFABAFAFAFABABABAFAB EBEBABEFEFABAFABABEFAFABAFEBABABEFAFAFABABABABAFABABABAFABABABABEFEFA FEFAFAFABABABABABAFAFEFEBABAFABAFABEBABEBEFABAFABABABAFABABABAFABEBAB ABAFEBAFEBABEBAFABABABABAFABABEFAFABABAFABABABAFAFABAFABAFABABABABABA BABEBABABEBABABEBCBABABABABABABABABA$18BDFB2F9B2FBF2BFBF9B2F2B2F2BF2B F4BF6B2F7BF11B2F3BF5BFBFBFBF8B2F4BF9BF3BF4B3F2BFBF11BF3B2F5B2F2BFBF4B FBF3BFBFBF2B2F2BF4BFBF5B2F7BF3BFBFB4F7B3FBF3BF9BFBF2BFB2F2BF3BF5BF2BF 4BF2B2F3B2FBF3BF4BFB3F4BF10BF5BF11BFBD18B$BABABABABABABABABADAFAFEFAB ABABAFABABABABABABAFEBABABEFEBEBAFABABEBABABABABABABAFABAFAFABEFEBABA BABABEBABABAFABABABABEBAFEFEFEBEBABABABEBEBAFABABABAFAFABABAFAFABAFEB EBEBABAFABAFEBAFABABEBABEBAFEFAFABEFABABABABABABAFABEBABEBAFAFABABAFE BABEFABEBABAFAFAFAFABEBABEBABEBEBAFABABAFAFEBAFABEFEBAFAFABABABABABEB EFAFAFEFABEFABEFEBEBABABEBAFABABEBEFEBEBABABEBABCBABABABABABABABABA$ 18BD4BF5B2F5B2F5BFBF3BF3B2F5BF2B2FBFBF7B2F2BFBF3BFB2F7B3F5BFB3F7BF9BF 5BF9BF5BF6BFBFB3F7BFBF3BF2BF4B2FBF3B2F5BF10BFBF2BFB3F4BF3BF2BF3BF12B 2F3B2F7BFB4FB2FBF5BF2BFBF4BF2BF5BFBFB2FB4FBFBF6BF3BFBFBF3B3F3B2FBF8BF 3BD18B$BABABABABABABABABADAFABABEBABABABABAFAFABABABABEFABAFAFABEFAFA FAFABABABABAFAFAFAFABEBEBEBABABEBABEFAFEBEBAFEBABABABABEBAFEBABEBABAB ABABABABABABAFEFABABEFAFABAFEBABAFABEBAFEBABAFABEBAFABEBABEBEBABABEBA BABEBAFAFAFAFABEFABABEBEBAFAFABABABEFABAFEBAFEFABAFEBABEBABABAFEBABAB AFAFABAFEFAFEBEFABAFAFAFAFAFEFEFEBABABABAFEBABAFABABAFAFEBAFABABEFABA BAFEBABEBABABCBABABABABABABABABA$18BD5B2FBFBFBF5B2F4B3F2BF6B2F6B2FBF 2B3F2B2F2BF5B3F3BFBF12BF6BFB4F2B2F6B3F4BFBF9BF7BF2BFBF3BFBF4BF3BF12BF 2BF2BF2BF2BFBF4BFBF3BF3B2F3B2F3BFBFBFBF3BFBF7BFBFBF2BF4B2FBFB3F2BF2BF 2BF2BFBFBF5BF3BF11BF4BF6B3F2BF2BF2B2FBFBFBF4BF11BD18B$BABABABABABABAB ABADEFABEBABEBEBABAFAFABABABEBABABABAFABEBABABEBEFABABABAFABEBEFEFAFE FEBABAFEFABAFABABEBABABAFEBEBABABABAFABAFABEFABEFAFAFABABAFABEFAFABAB ABABEFABEBABABEBAFEBAFAFEBAFABEBABABABABABABEFAFABAFAFABEBEBAFAFABEBA FAFEFEBAFABEBABEBEFAFABEFABABEFAFEFABAFAFABEBEFAFEBEBABABEBABAFEBABAF ABABABEBAFABABAFAFABABABABAFABAFABABABEFEBAFEFABAFABEBABEBABCBABABABA BABABABABA$18BD2BF2BFBF6BFBF13B2F3BF4BF2BFB2FB2FBFB2F2BF6BF4BFB2F19BF 7BF5BF6B3FB3F2B2FBF9BF6BF9B2F2BFB2FB2F10BF5B2F2BF6BF2B2F2BF5B4F2BF5BF BFBF2BF6BFBF2BFBFBFB2F3B2F2B2F3BF12BF8B2F4BF5BF5B2F4BFBF3BFBF3BF2BFB 3F5BF2BFB2FD18B$BABABABABABABABABADABABEBEFEFEBABAFEBABABABABEBABAFAF EFABABABAFEFABEFEFEBABABABABABEBABEFAFEBABAFEBEFAFAFAFAFABEBABABEBEBA FEFABABEFABABAFAFABABABABEBEBAFEBEBABEBABABEBEFEBAFABABABABEFABAFABAB EBABABABABEBAFEFEBABAFABEBABABAFEBABABAFEBABABABABABABAFAFAFEBABABABA BAFABABEBAFEBAFAFAFEBABABABABABAFABABEFAFABABABABAFAFABEBEBABAFABEBEB ABEBAFAFABEFEBEBEBEFAFCBABABABABABABABABA$18BDF4BFBF16BFB2F8BF5BFB3F 5BF2BF2BFBF4BF6B2F2BF3BF3BFB2F5BF2BF4BFB2FBFB2FBF2BF4BF2BF2BF16BFBFBF 6BF4BFB6F2BF3B2F2BF5BF5B3F5BF4B2F3BF4B2FB3FBF4BF2BFBF2B3FBF5B3F4B4FBF 7B2F2BF17BF6BF2BFBFBFBF2BF2BF5B3F5BF2BFBFB2F2BFBD18B$BABABABABABABABA BADABEBAFABEBAFEFAFABABABABAFAFEBABEBEBABABABABABABABEBEFABEBEBEBABAB ABEBAFABABABABABABABEBAFEBEBABABABEBABABABABEBAFAFAFABABEBEFEBAFEBABA FABAFABABEFEBABABABEBEBAFEBEBABEBEBAFABABEBAFAFEBABABEFAFAFEBABEBAFAB ABEFAFABABEBEBABEFEBABEBABEBABEFABAFABEFABAFEBEBEBABAFABABEFABABABAFE BEBABAFAFEFABAFAFABAFEBABEFEFAFAFAFABABEBEBEFABEBAFABEBEBAFCBABABABAB ABABABABA$18BD2BFB2FBF2BFBFBFB2FB4FBF4BFBF8BF2BF5BFBF2BFBFBFBF3B2F2BF 6BF9BF2BF2BF4BF5BF3B3FB3F4BFBF4B4F3B3F5B2F2B2F9B2FB2FBFBFBF4B2F2BF2B 2F4BFBFBF11B3F2BF4BF2B3F7B3F14BFBFBF4B2FBF4BF3BF2B2FBFBF5BFBF3BF3BF2B 3F3BFBF4BF4BFB5F2B2F6BF2BFBFBFB2FD18B$BABABABABABABABABADAFAFEBABEFEB EBAFEBEBABAFAFABABABEFABABABAFABAFABABABABEBABABEBABEFABABABABEFABAFE BABABEBABABABABABABEFABABABABABABEBAFEBABEBABEBEBABABABEBABAFABABABAB ABEBAFABAFABABABAFAFEBABAFABABABEFABEFABEBABABAFABAFABABAFABAFABAFABA FEBEFABEFAFEBABAFABAFABABAFAFABABEBABEBABAFEBAFABAFABAFEBEFABABAFEFAB AFABABEFEBABEBABABEFEFAFABABEBABABABABAFEBABCBABABABABABABABABA$18BD 6B2F6BF2BF2BF2BF8BFB3F2BF3BF5BF6BF2BF7B2F2B3F2BF5B2F5B2FB2F6BFBFBF2BF B2F10BFBF2B2F7BFBFB2F4BF3BF5BF4BFBF2BF8BF4BFBFBFB3FBF10BF2BFBF5BFBF 18B2FBFB2FB2F7B2F2BFBF2BF8BF2BF2B2FB2F8BF8B2F2BF2BFBF5B2F2B3F4BFBFB4F 3BD18B$BABABABABABABABABADABABABAFEBABAFABABAFABABABEFABAFABABAFABABA FABABEBABEFABABEBAFAFABAFEBABABABEBAFABEFEBABABABABABAFEBABABABABABEB ABEFAFAFEFEBAFAFABABABABABEBABABABEBABABABABABAFABABEBABABABEBABABABE FAFABABAFABAFABEFABAFABEFABEBABABAFABEBAFAFEBEBAFABABAFABABABABAFABEF EFEBABABEBEBEFABABEFEFABABABABEBEFABABABEBABAFAFAFABEBEBABEBEBAFEBABA BEBAFABABABABCBABABABABABABABABA$18BDBF10B2F3BF2BF3BF4BFBF18B2FB3F3B 4F4B2FBF3B2FBFB4F4BF8BF9B2F7BF4BFBF2BF4BF6BF2BFBF3BF2B2F4BFB2FBFBF3B 3F3B2F3B2F2BF3BFBFBF2B4FBF11B4F4BF7BF5BF14BF2B2F3BF3BF6BFBFBF6BF4BF6B 2F2BF2B2F4B2F2B2F2B3F4BFB3FB3F3BF3BD18B$BABABABABABABABABADABAFABABAF ABABAFABABEBEBEBABEBABEFEBABAFAFEBEBAFEFEFEFABAFABABABEFAFABABEBABAFA BAFAFEBABABABABABABABABABABAFABEBABABABAFABABEFEBABABAFAFEBEBABAFABAF ABABEBABAFEFAFABAFABAFEBAFABEBAFABABAFABABABABEFEBEFEBABABABABAFEBAFA BABEBABEBABEFABABABABEBABABABAFAFABABABABABEBABABABABABEBABABEBEFABAB EFEBABABABEBEBABABABABABABABABABABABABABAFABAFCBABABABABABABABABA$18B DBFBF6BFB2F5B2FB2FB3F4BF5BF2BF2BFB2FBF5BF8B2F3BF2BF2BF2B2F3BFBF10BF2B F3BF4B2F2BF4BFBFB2FB2F3BF4BF14B2F5B2F6BF5B3F2B3FB2F4BF6B2F10B3F3BF3BF 2BFBF11BFBF3BF5BF10BF13B3FBF2B2F4BFB2FBF14B2FBFB2F7BF2BFB2F5B2FB2FD 18B$BABABABABABABABABADABEBABABAFABEBEBABAFAFAFABAFABAFABABABABABABEB ABABAFEBEFABAFEFABEBEBABAFEBAFABABABEBABEBABEBEFABEBEBABAFAFABABABABE BEFABEFAFABABABEFAFEBABABEBABABEBABEBABABABEBABEFAFABABABABABABAFAFAB EBEFABEBABABABAFAFEBAFAFABABABAFAFEFABABABEFABEFAFEBABABAFAFABABABABE BABAFABAFABAFAFABABABAFAFEFABABEFEFAFEBAFABAFEBAFAFEBAFABAFABEBABEBAB ABABEBABABCBABABABABABABABABA$18BDFBF11BF2B3F5BF8BFBF4BF3B2F4B4FBFBF 9BF2BF6BF14BF7B2FBF2BF3B2F7BF5BFBF9B3F2BF2BF4BFBFBF8BF7BF4B3F6BFBF4BF 2BFBF20B3F2BF4BF3BF4B2FBF4BFBFBF3BF4BFBF2B2F5BF2BF5B2F2B2F5BFBF2BF3BF 3BF3BF3BF4B2F3BF4B4FBD18B$BABABABABABABABABADEBABABABABABAFABABAFABEF ABAFAFEBEBABEBEBAFABAFEFAFAFABABABEBABAFABAFAFEBAFABAFABABABABABAFEBA FABABABAFABABABABAFEBEBEFEFAFEBABAFABABABABABABEFABABAFABAFABABAFEBAB ABABABABEBAFEBEFABABAFAFABABEBAFEBABEBEBEFEFABABABABAFEFEBABABABAFABE BABABABEBABAFAFEFABABABAFEBABEBAFABABABEFABABAFAFEFEBAFEBEFEBABABAFEF EBEBAFABAFAFEBABAFABABEBAFEBEBAFCBABABABABABABABABA$18BDBF4BF2BFB2F3B 3F8BFB2F7BF8BF2BF6BF2BF4BF5B2F4B2FB2FBF6BF2BF3BF9BF8BF2B3F3BF4BFB3F7B 4F2BF2B2F4BFBFBFBF2BFBF3B2F2B2F4BFBF3B2F2B2F2BF4B2FB2F7BF5BFBF5BF4BF 3BFBF4BFBF3B3F6BF2B2F4BF5B2F2BF5BF4BFBF2B2F6BF10BF6BF3BF6BFBD18B$BABA BABABABABABABADEBAFEFEFAFABABABABABEBABEBABEFAFABABEBABABABAFEFABEFAB ABABABEFAFABABABABEBABABEBABEBABABAFABAFEBEFEBABABABABAFAFABABEBAFABA BABABEFEBABABAFABEBABABEBEBABAFABAFABABAFABEBEBEFABAFABABAFABAFEBABEB AFEBABEFAFEBABABEBABEBEBAFAFABAFEBAFABABEFEBEBAFABAFABABEFEBABAFABEBA FEFABABAFEBAFAFABABAFEBABABABEFEBAFABABEFABABEFEBEFAFAFEBABEBEFAFABEB ABCBABABABABABABABABA$18BDF4BF3BF2B2F4BF3BF3BF3BFBF8BF3BF2BF2BF2BF3BF 3BFBF7BFBF4BF3BF3B2F10BF3BFB4FB2F4B2FB2F5BF2BF3BF4BFBF2BF2BFBF6BF4BF 5B2F2BFBF10BF2B2FBFBF6B2F2BF5B2FBF3B2F2BF2BFB2F2B2F2BFBF2B2F2BF7BF6BF 3BF2BFBF3B2F3BF2B5F11BF3BF3BF2BF2BF2BFBF15BFB2FD18B$BABABABABABABABAB ADABABABABABABABAFABABABABABABEBAFABEBABEBEBAFAFEBEBAFABABAFABABAFABA BABAFAFEBABEBABABABEBABEFEBABAFEBABABEBABABAFEBEBABABAFABABEBEBEFAFEB EBAFAFEBABEBABABABABAFABAFEBABABABABAFABABABABABAFABEBABABABABEFEBEBA FABEBABAFAFEBABABABABAFABEBABABEBAFABAFABABAFAFABEBABABABABABEBABAFAB AFEBAFABABEFABABABAFABEBAFABABAFEBABABABABABABEBEFABAFABAFCBABABABABA BABABABA$18BD5BF12B2F3B3FBFBFBF6BF5B3F5B2FB2F3BFBF3BF2B3F3BF7BF3BF5BF 2BF6BF3B2F6BF7BFBF5BF4BF5B2FB2F2BFBF2BF10BF4BF3BF6B2F5BF3B2FBF5BF7B2F 2B3F4BFBF2BF2BF2BFBF3BFB2F2B3F2BFBF2BF3B2FB2F3BFBFBF3BF5BF3B2F2B3F3BF 7BF3BF3BF5B2FBFBFBF6BF2BD18B$BABABABABABABABABADEFABABEFEFABABAFABABA BABEFEBAFABABAFABEBEBABABEBABEFABABAFABABAFEBEBAFABABEBABABEBEBABAFEB ABAFABEBEFABEFABAFABAFEBAFEBAFABABABEFABABABEBEBABABABABEBABAFAFAFABA BABABAFEBABABABABEFEBEBAFAFAFABABABABEBAFABAFABABEBEFABAFAFEBABAFAFAB ABEBABABEBABABABEBAFABEBEFABAFABABABEFABEFAFABEBABABEFABABABABAFAFABA BEBEFAFABEBABABABABABEBABABEBABEBAFCBABABABABABABABABA$18BDBF3BF3BF5B F3BF3B2F4B2FBF2BFBF3BF6B2FBF8BF15BFBFB2F6BF5BFB2F3BFBFBF2B2F4BFBF3B3F 2B2F2B2F2BFBF2BFBF2BF3BF3BF2BF12BF3BF3BF6BF7B2FBF5BF4BFBF2BF7B2FB2FBF 2B2F6BF2BFB2FBFBF2BF3BFBF2B3F4B3FB2F5BF5B2F2BF5BF3BF7BF2BF4B3F7BF3B2F BF2BFBD18B$BABABABABABABABABADAFABABABEBABABABEFEBABAFABABABABEBABAFA BEBABABEBEFABABAFABEBABEBAFEFAFAFEFEBABEBEFEBABABABEFABABABABEBEBAFEB ABABABABABEBABABABEBEFABEFEFAFAFEBABABAFEFABABAFAFEBABABEBABABABAFAFE FABEBABABABABAFEFAFABEBEBABEBABEBABABABEBEBEFEBEBAFAFABAFABEFEFEBABAF ABEBEBABABEFABEBABAFABABABABABABAFAFEBAFAFABABABAFABABAFABEBEBEBABEBA BAFABEFEBAFAFEBEBCBABABABABABABABABA$18BDBFB2FB2F2BF2BFBF3BF5BF7B2F3B F3BFBF4BF3BF2BF2BF3BFBF4B2F4BF2BF3BF2BFBF2BF2BF2BFBF4BF7B4F2B2F2B2F2B F2BF2B2F6BF2BF3B5F2BF3B2FB2F2BF3B2FB2F4B2FBF8BF4BF3B5FBFBF2B2F2BF2BF 3BF2BFBFB2F4BF8BF2BF4B3FB2F5B3F2BF5BF2BF11BF2BF2BF5BF3BF6B2F3B2FB2F3B F2BF4BD18B$BABABABABABABABABADABEBABABABEBABABAFAFAFABABABEBAFABAFEBA FEBABEBEBABEBABABABAFEBABABABAFEBABABABABEBAFEBABABAFABABABAFABAFABAB AFEBABABAFEBEBEFAFEBEBEBABAFEFABABEBABABEBABEBABEBABAFEBABAFABEBAFABA BABABEFABABABEFABABABABAFEBABABAFABAFAFEFABABEBABABABAFABEBABAFEFAFAB EBABEBEBEBABAFABAFABABAFABEFABEBEBABABABABABABABABEFEBEFEBABABEBABABA BABABABAFEBABABEBCBABABABABABABABABA$18BD7BF4B3F6B2FBFB2F2BF3BF7BF10B FBF2BF6B2F5B2F3BF3BF4BF4BF3BF2B2F2BF3BF2BF5BF3BF3B3F2BF10B2FB2F2B2F 12BFBF3BFBF2B2F2BF5B2FBF3BF4BF3B2FBFBFBF4B3F2B3F5BF8BF2BF2B2F2BF3BF2B F3BF9BF14B2F3BF6B2F3B2F9BF4B2F11BF3BF2BFBD18B$BABABABABABABABABADEBAB ABABABEFEBABABABABABABEBEBAFAFAFEFEBEBAFABAFEBAFABEBAFEBABAFEBABAFEBA BAFEBEFAFABEFAFABABEBABABAFABABAFABEBAFABEBEBABEFABABEBAFABAFAFEFABAB ABABABEFABABAFEBAFEBABAFAFABABABEFABEFEFABABABABAFABABAFEFEBABABABABA BEFAFABAFAFAFABABEBABEBABEFEBAFABABABABEBABAFABABAFABABABABAFABABABAB EBABEBEBABAFABAFEFEFABEBABABEBABABABAFABEBEBAFAFEBABCBABABABABABABABA BA$18BD2B2F5BF2BF4BFB2F4BF8BFB2F2BF3B4FBFB3FBF7BF2BFBF5BF7BF8BF6BF11B F3BF2BF2BF11BF3BF5BF2BF6BF2BFB2FBF5BF3BFBF2BFB3F3BF3BFBF3BF2B2F7B2F3B F3BF2BF2B2F15BFBF2B2F2B2F2BF3B4FBFBF3B2FBF2B2F9B2F6B4FBF4B2FBFBFB2F2B FBF3BFBF3B2F7BD18B$BABABABABABABABABADAFABEBABABABAFABABEBABABEFAFABA FABEBABABAFABEBABABAFAFABEBAFABABEBABEBEFABABABABABABEBABEFAFEBAFABAB ABEFAFABABABABAFEBAFEBAFAFABEBEFABABEFEBAFEFABABABAFAFABABABEFABABABA FABAFABEFAFAFEFEBABABEFEBAFAFABABEBABABAFABEBEFABABABABABABABEFEBABAF ABABEFAFEBAFABEBEBEBEBABEBABABABEBEFABAFEBABABEBABABEFEFABABEBAFABABA FABABABEFABABABAFEBABAFABCBABABABABABABABABA$18BD7B2F3BF3BF2BFBF2BF5B F8BF5BF2BFBF4BF3BF2BF4BF4BF3BF2BF10BFBF6B4F3BF8B4F2BFBF3BF3B2FBF3BF3B F2B2F8BF4B2FB3F4BF3B2FBF5BF12BF2B2F3B2F10B3FB2F3B2F16BF6BF6BFB3F4BFB 2F10BF10B2F2BF2B3FB3FBF4B2FBF3BF2B2F3B2FBF2BD18B$BABABABABABABABABADA BABABABABABABABEBABAFAFABEFABABABABABABABABAFABABABABABABEBABABEBAFAB EBABEBABEBAFEFEFAFABABEFABABABABEBABAFABABEFAFEBABABABABAFAFEFABAFAFE BEFABABAFABEFEFEBABABEBEBAFEFEBABAFEFABABEBABEFABAFABEFABAFAFAFABABAF EFAFEBABABABABEFABAFABEBABABAFEFEFEBAFABEFABABAFEFAFABEBAFABABABEFAFA BEBABAFABABABEBABABABABABAFAFAFEBABABEBABAFABEBABABABABCBABABABABABAB ABABA$18BDF2BF2BFBF2BF11B2FB2F3BF5BF3BF8B4F4BF6BF2BF2BF10BF9B2F2BF4BF 2BF8BFBFBF3BFBF4BFBF3BF2B3FB2FBF2BF2BF3BF4BF4B2FB5F2B2FBF4B3F5B2FBFBF 4BF4BF2B2F2B2F7BFB3FBF9BF7BF3B2FBF8BF2B2F7BF4BF6BFBF2B2F13B3F3BF4BFB 4F8BFBD18B$BABABABABABABABABADABABAFAFAFABABABEBEFAFABABAFABEFABABABA BABABABABAFEBABAFABAFABABAFAFABAFABEBABABABEBEBAFEBABEBABAFAFEFABAFAB EBEBEBEFABAFABAFABABABABABEBEFEBAFABABABAFABABEBAFABABABAFEBEBABABABA BABABABAFABAFABEBABABABAFAFAFEBEBAFEFAFEBAFAFABAFEBABAFABEBABAFEBABAB ABABEBEBAFABABABABABABABEFAFEBABAFEBABABABABAFEBAFABAFEBABAFABABABEBA FABEBABABABABABAFCBABABABABABABABABA$18BD5BF3BFBF3B2F4BFBFBF2BF4BFBF 5B2F3BF6BF2BFBFBF5BF2B2FBFBF5BFB2F5BF5B2F4BF2B2FBF23BFBF14BF2BF6BF2BF BF3BF2B2F6B2F2B2F7BF6B2F3BF5B2F2BF2BF9BF3B2F9BFB2FBF4BFB2FB2F4BF4BF3B 3FBF3BF6B2F2BF6BF4B3FB2F2B4F11BFBFBF2BD18B$BABABABABABABABABADAFABEBA FABABEBABAFAFAFABEBABEBEFABABABEBABABEBAFABABABABAFAFEBEBABABEFABABEF AFABABAFABABEBAFAFAFABABABABABEBAFAFABAFAFEBABABABABABABABEBABEFABABA FEBAFABAFEBEBABABEBABAFAFEFABABAFABABAFEBEBABAFABAFABEFEBABAFABABABAF AFEFAFABEFABABAFABEFEBABEFABEBEBABABAFABAFEBEBAFEBABEBABEBEBABABEFEFE BEBABABABAFABEBEFEFABAFABEBABABABABAFEFAFABEBABABCBABABABABABABABABA$ 18BD5BF2B2FB2F3B3F7BFB2F3BF7B2F3BF3B3F4BFBF2BF5BF2BF6BF3BF2BFBF3BF9B 3FBFBF5B2F17BF12B4F5BF3BFBF4BF2BF3B3F5B2FB2F2BF7B2F9BF8BF6BF6BFBF7BF 5BF2BF2BFB6F2BFB3F13BF3B2F6BFBFBF2BFBF2BFBF5BF6B2FBF2BF7BD18B$BABABAB ABABABABABADABEBABABABEBABABAFEFABABABAFAFEFABAFABAFAFEBABABABAFABABE BEBABEBEBAFEFABABABEBAFAFEFABAFAFAFEBABABAFEBAFEFABAFABABAFABABAFABAF AFABAFEBABABABAFAFABEBABAFABABABAFEFAFAFEFEFABEBABABABAFABAFABAFEBABA BABAFAFEFABAFAFAFEFABAFAFAFABABEFABEBEBEBABABEBABABEFABEBAFABAFEBAFAB EBABABEBEBAFABAFABABABABABAFAFABABEFEBABAFAFABEFABABABAFEFEBEFEBEBAFC BABABABABABABABABA$18BDBF2BF9BFBF4B2F2BFBFB2F8BF13B2F3BFB4F3B2F3BF4BF BFBF4BF9BF2BFBF5BFBFBF6BFB2FBFB3F11BFBFBF2BF2BF2BF3BF2BF7BF9BF2BF3BFB 2FBF3BF4BF3BF3BF4BFB2F5BFB3F3BF8BFBF2BF4B2FBF4B2F9B2FBFB3F4BF6BF5BF3B F4BF7B2F2BFB5F13BD18B$BABABABABABABABABADEBAFEFABEFEBABAFABABABAFEBAB EBEBABAFABABABABABABABABABAFABAFEFABEBABABABABAFEBABABAFABABEFEBABAFE BABEFABAFAFEBAFABABAFAFEBAFEFAFEBEBAFAFABABABEBEFABAFEBAFABABABABAFAB ABEBAFAFABABEBABAFAFAFABABABABABAFAFAFAFABAFABABABABABEBABABAFAFABABA BABABABEFABABAFABABABEBABABABABEBEBABEBABABEBEBABAFABEFABABAFAFABAFAB ABEBABAFABAFEBABAFABEFABABABCBABABABABABABABABA$18BD4BFBF5BFBFBFBF3BF 2BFBF2BF3B3F6BF2BF8BF5BF2BF4BF5B2F2BF2BF6BF13B2F6BF5BFB2FBF7B2F8BF2BF 4BFB3F2BF4B3F2BF4B2F2BF2B2F2BF4BFBFB2F2BF12BF4BF14B2FB2F5BFBF6BFBFB2F 3BFBF31BF4BFBFBF2B6FBF3BFBF6B2FB2F2BF3BD18B$BABABABABABABABABADABAFAF EFABABABEFEBEFABAFABEBAFEBEBAFABEBABAFEBAFABEBEBABEBEBABABABABABEBABA FABABEBEBABAFABABEBAFABABABABABABEBABEFABEBEBEBEFEBEFABEBABABEBABEBAF AFAFEFEBABAFABABEBEBABABABEFABABABEFEBABAFAFAFAFAFABABABABABEBEFABABA BABAFABEBABEFABABEFABAFABABAFEBEFABEBAFABAFEBABABEBAFABABABABABEBABAB ABABABABABEFABABAFAFABEBABEFAFAFAFABEBAFABAFEFAFAFCBABABABABABABABABA $18BD4BF5B4F2BF2BFBF2BF14BF5BF6BF2BF5BFBF23BFBF2BF8BF3BF4B2F2BFBF2BFB FBF2B2FBF3BFBF5BFBF4BFBFBF11BF10BF2BFBF5BFB2F3BF8BF5BFBFB3F3BFBF3BF5B F5BF2BF7BF5BF6BFB2F3BFBF3BF2BFB2F2BF4BFBF5BF2BFBF3B3F8B3F4BF4B2FB2FD 18B$BABABABABABABABABADABEBABABABEBAFAFABEBAFABAFABAFAFEBAFABABEBABAF ABABEBABABABABAFABABABEFAFEBEBABABABABABABABEBABABABAFEBAFEBABEBABAFA BABAFAFABEBABABEBEBEBABEBEFABABEBEFABABABEBEBEBABAFABABABEBABAFABEBAB ABABEBABABABABEBAFEBEBEBAFEBABAFEFEFAFABABEBAFABABEBAFEFABEBAFAFEFABA FAFAFAFAFEFAFABABABAFABEBAFEBABEBABABAFEBEBABAFEBABABABABABAFABAFAFEB AFAFAFEBABCBABABABABABABABABA$18BD5FBF3B3F3BF7B2F6BF2BFBF11BFBFBFB2F 3BF2BFBF2BF2B4F5BF2BFBFBF7BF4BF10BF8B4F11B2F2BFBF4BF2BF7B3FBF2BF4BF5B F2BF2BF3BF2BFBF2BFB2F2BF2BF4BF2B2F4B3F8B3F5B2F8BF3BFBF2BF2B2F6B4F4BF 4BF4B2FBF2BFBF2B2F3BFBFBF3B2FBF6BF5BFB2F5BD18B$BABABABABABABABABADABA BAFEBABAFABAFABAFEBEFABEBEBABEBABEBABABEBAFABEFAFAFAFAFAFABABAFEBEFEB EBABEFAFEBABEBABAFAFAFABABABABABABEBABABAFEBABAFAFAFABEFABAFABABEFEBE BABABEBABABABABEBABABAFABABABEBEFEBEBEBABABABABABEFEBABABEBABEFAFABAB EBEBABABEBAFEBABABABEFABAFEBAFEFEBEBEBAFABABABABABAFAFABAFABEBABABABA BABAFEBEBABABAFEBEFABABEBABABABABABEBEBABEBABABAFAFAFCBABABABABABABAB ABA$18BDF3BF6BFBF2B2F5BFB3FBF2B2F3BF2BFB3F2BF4BF7BFBFBF7B2F3B2F2B2F3B FBFBF5BF2BF4BFBF2BF3B2F14BF2BFBFBF2BF2BFB2FBF2BF7BF2B2F7B2F4BF2BFB2FB F2BF7BFBF3BF11BF2BFBF2BF7BFBFBFBF5BF12BF4BFBF3BF2BF12B2F5BF3BFBF6BF4B 5F2BFBF4BF7B2F2BD18B$BABABABABABABABABADABABABABAFAFABABEBEBAFAFEBABE BABEBAFEBEFABABABABABABEBABAFEBABABAFEBABAFEBAFAFEBAFEBAFAFABABABABAF EBEBABEBEBAFABAFEFABEFAFEBAFEFABABEBABABABAFEBABAFEBAFABAFAFABABAFEFE BABABEFABABAFABABAFABEBAFABEBABEFEFABEBEBAFABABAFEBABABABAFABABAFABEB ABABAFABABABEBABABAFAFAFAFABEBABEFEBABEBABAFEFABEFEBABABABABABABABABA BABAFAFABEBABEBEBABABAFABEBCBABABABABABABABABA$18BDF7BF4BF7BFBF4BF5BF 2BF5BF8BFBF2BF6BF3BF6BF4BF4BFBFBF2B3F2BF5BF4BF4BFB2F2BFBF2BFBF5BF3BFB 3F5B8F6B2FBF9BF2B2F2BF10BF5BFBFB2F3B3F3BF2B2F3BFBF4BFB4F7BFBF4BF4B2F 5B2F2BF6BF2BF2B2FBF2BFBF6BF3BF3BF15B3F4BF5B2F2BD18B$BABABABABABABABAB ADAFAFABEBABEBAFABAFEBABABABABEBAFEBEBAFABEBEBEBABEBAFAFAFABEBEBAFEBA FEBABAFAFABABEBABABAFABABEBABABABAFABEFABABABEBAFABEFAFABABABEBABABEB ABEBABABEFEBAFABAFABEBEBABAFABEFABABEFEBEBABABAFABEBEBAFABEBABABABABA BABABEBAFEFAFEBABAFEBABEFABABAFABEBAFABABABABEBABABABAFEFAFEBABEBAFAF ABABABABABAFAFABEBAFEBABEBABAFEBABAFAFABABABEBAFEBABAFABAFCBABABABABA BABABABA$18BDBFBF9BFBF6B2F3B2F4B2F2BF5B2FBF2BF6BFBF2BF7BFBF3BF4B6F2B 2F4BF2B2F3B3FB2F5BFBF3BF2BF2BFBF8B2FBFBF8BF5B3FBFBFBFBF3BF2B2FBF2BFB 2FBFBF2BF5BF5B3F9BF3BF6BF4BF4BF2BF3BF5BF7BF4BF4BF4BF12BFB2F7B3FBF3BF 11B2F5B3F6B2FD18B$BABABABABABABABABADABABABABAFEBEBABEFABABABABABABAB AFEBEFABABEBAFEBEBEBAFABABAFABABABABABABABEBABABABABEFABEBEBABAFEBABA BABAFABEFABEBABAFEBABABABABEFEFABABABAFABABABABABABABEBABABEBAFAFEBAF EBAFEBAFABEBABAFABEBABEBAFABAFEBAFAFAFABABABABAFEBEBAFABABEBABABEFABA BABABEBAFAFABABABEFEBAFABABEBAFABAFAFABAFABEBABABAFABAFABABEBABABABEB ABEFEBABEBABEFABEFABEFAFCBABABABABABABABABA$18BD7B2F11BF5B2FB2FBF12BF 7B2F22BF4BFB2FBFBF8BF17B3F7BFB2F7BF3BF6B2FBF7B3F3BF5BF4B2F5BF4BF2BFBF 3BFBF2B3F6B2F5BF8BFBFBF5BF3BF9BF2B2F3BF3BFBF5BFBFBFBF14BF6BF5BFB2F5BF BF2BF4B2F2B2FBFD18B$BABABABABABABABABADABABEBEBAFAFAFABABABABEBEBEBAF EFABEFABABABABABABEBAFEBABABAFEBABAFABABAFABEBABEFABEBABABEBABABEBEFE FEFABAFABABEBABAFABABABAFABAFEFEBABABABABEBABEBAFABEBABABAFEBABEBEBAF EBAFEBABAFABEBEBEFABABEFABEBAFEFEBABABAFAFABAFEFEFAFABEFEBABAFAFAFABA FEBEBABABEBABABABABAFEBAFABEBABABABABABEBABABEBAFAFEFEFABAFABABAFABAB ABABABEFAFABABEBAFABABAFEBCBABABABABABABABABA$18BD12BF6BF6BFBF3BFB2F 5BF15BF3BF8BF17B3F9BF3BFBFBF3BF3BF3BF3BF2BF7B2F2BFBF5B2F2BF4BFBF2B3F 2BF2BF22BFBF8BF2BFBF6BF10BFBF5BF2B2F8BF3BF3BFBF11BF3BF8BF4BF3BF2BF8B 2F2BF3BFB2F2BF3BFBF6BFBD18B$BABABABABABABABABADABAFABAFAFABEBABABABAB AFABEBABABEBABABAFABEBEBABAFABABABABABAFABABABABEBABABABEFAFEBEBABABE BAFABABEBAFAFABABEFABEFEBABABABAFABABABAFEBABEBEBABEBABABABEFABABEBAF ABABABABABABEBEFABABABABABABABEFABABEBABABABABABABEBEFABABEBAFEBABABA BEFABABABABABEBAFABABEFABEBABEBAFEBABABABAFABABABABEFAFABEBAFABAFEBAF ABABABAFABAFEBEBABABABEFABAFEFABEBCBABABABABABABABABA$18BDF2BF6BF2BF 5BFBF3BF3BF3B2F7B4F3BF2BF7BFB3F2B4F6BFBF4BFBFBF2BF4BF4BFBF4BF3BF3BF2B F4BF11BF2B2F2B2F4BF13BFBF4BFBF3B2F4BFBF10BF3BF2BF4B2F2BFB2F3BFBF2B2F 3B2F6BF3BFB2F3BF7B2F5BFBF2BF3B2F5BF2BFBF7B2F4BF6BF2B2F4BF2BF3BF2BF2B 2FBFBFD18B$BABABABABABABABABADABAFABABEBABABABABEFEBEBEFAFABABAFEFABA BAFAFABABABEFABEBABEBEBABAFEBABABEFAFABEFEBAFABAFABEFEBABABABABAFABEB AFEFAFABABAFABABEBABEFEBEFABEBABABABAFEBEBAFABABAFABABAFEBAFABAFAFABA BAFEFEBAFABAFEBABABABABABAFABEFEBAFABABEFEBEBEBEFEFEBAFABABABAFABABAB ABABABABEBABABEFAFEFAFABABABABEBEBABABABEBAFABEBABABABABABABEBABABABA FAFEFABABAFEFABEBCBABABABABABABABABA$18BD4BF3BFB2F5BF3BF3BF7BF5BFB2F 9BFBFB2F6BF2B2FBFBF7BF3BFBF13BFB3F5BF4B5F2BF2BF9BF2BFBF2BF2BF2BF2BF2B F5BF2BF3BF5BF3BF2BF3BF2B2FBFBFBF10BF7BF5BFBF5BFBF5B3F7BF11BF7B2F5BFBF 6B6F3BF4BF11BFB2F10BFB2F6BD18B$BABABABABABABABABADEBAFABABAFABABAFABA FAFABABAFEBAFABEBABABABEBABABEBABABAFABEBAFEBEBEBABAFEFEBAFEBABAFEBAF ABABABAFABAFAFEBABEFAFAFABEBEBEBABEBAFABABEBEBABAFEBABAFABAFABABAFEBA FEBABEBEFAFEBEFABABABAFEFEBABABABABEBEFEBAFAFABEFAFAFABABEBAFEFAFABAB ABABABEFABAFAFAFEBABABABABABABABABAFEFABABABABABABABAFEBAFABABABEFEFA BABABAFAFAFAFAFABABAFEFABEBABABAFABABCBABABABABABABABABA$18BD2BF4B2F 5B2FBF5BF2BF6BF2B3FBF5BFB3F5B2F7BF4BF7BF2BF8BF4BF2BF10BF10BFB2FBF9BFB 3F2B2F2BF2B2F4B2F2BFBF6B2FB3F3BFBF3B2F2B2F2B2FBF2BF5B2F5BF2BF4BFB2F2B FB2FBF2BF3BF2BF3BF2BFBFBF4B3F2BF5BF6BF4BF13BFB2FBF5BFBF2BF4B3F3BFBFBF 5BF2BD18B$BABABABABABABABABADAFEBEBABEBEFABEBEBAFABEBEBABABABEFEBEBAB ABABABABEFABABABAFABABAFEFABEBEBEBABAFEBAFEBABABEBABEBEFABEBABEBEBABA BABABABAFABABABABABABAFEFAFAFEFAFABABAFABAFABABABEBAFEFABABABAFEBABAB ABABEBEBABABABABABABEFABABABAFEFEFEBABABABABAFAFAFAFABEBEBEBAFABEBAFE FEBABABEFEBAFAFABABAFEBEBABEBAFEBABEBEFAFABEBAFEBABEBEFEFABABEBABEBEB ABEBABEBABAFABABCBABABABABABABABABA$18BDF2B2FB2FBFBFBF2BF15BF2BF4BF 10BFBF10BF2B2FBFBF9BF11BF7BF7BF4BF3BF12BF2BFB2F2B2FBF2B2F3BFB3FBF4B2F 9BF6B2FBF2BF6BF3B2F3BFBFBF9BF5B2F6BFB2F3BF2B2FB2F6BF2BF3BF11B2FBF4BFB FBF3BF8B3FBFBFBF11B2F6BF3BFB2FD18B$BABABABABABABABABADABAFABABABABABA BAFEFABABEBABABAFABABAFABAFEFABEBEBABABEBABEBABABABAFEBABEBABEFAFABAB AFEFEBABABAFABAFAFABABEBEBAFABEBABABEBABABEBABABAFEBEBEBABABABABABAFE BEBABABABEFEFAFEBABABEFABABEBABABABAFABABABABEBAFABABABAFABABABEBABEB EFAFABEBABABABABEBAFABEBABABABABEBABABABAFEBEFABABAFABEBABEFEFABABAFA BAFAFABABABAFEBEBABAFABAFABEBAFAFEFABEBEBCBABABABABABABABABA$18BD9BF 5BF8BF5B2F5BF2B2FB2F3BFBF4BFB3F2BFB3F4BF9B2FBF10BFBFBF4BFBFBF6BF6BF3B F6B2F5BFBF2BFB2F5BF3BFBF3BFBF5BF6B2F3BFBF3BF2BF5B2FB2F7B3F3BF3BF3BFBF 2BF3BFBFBF10BF2BFBF2BF3B2F6B2F2BFBFBF3B3F2BF11BF4B3F2BF3BFBF8B2FBF3BF BD18B$BABABABABABABABABADEBABABAFABABAFABABAFABABABEFEBAFABAFABABAFAB ABAFABEFEFABABEBEBEBAFAFEBEBABEBABEBAFABABABABABAFEBAFABABABABEFAFABA BABABAFEBAFABEBABABEBEFEBEFABABEBAFAFABABABABEBAFABABABABEFEBEBABABAB ABABABEBABABABABABAFABAFAFABEFABEFAFEBEBEFABABABABAFEFEBABEFEBABABABA BEFABAFABABAFABAFEBABABEBAFEBEBEBEBEBEFEFABABABABABEBABEBEFEBABEBABAB ABABABEFAFEBCBABABABABABABABABA$18BDBF12B5F5BFBF2BF4B2F3BF3BF2BF7BFB 6F6BF2BF2BF6B2F2BF3BFB2F2B2FBF3BF6BFBF3B2F5B2F9BF2BFBF3BFBF2BF7BF2BF 5BF2B3FBF9BF4BF3BF16BFB3FB2F13BF2B3F5BFBF3BF3BF2BFB3F3BFBF4BFBF7BF6B 2F10BF5BFB3FBF3BF19BD18B$BABABABABABABABABADAFAFABAFAFABEFABEBABABABA BABABAFAFABABAFEBABEBABAFABABEBEBABAFAFABEFABEBABABABAFEFABABAFEBABAB ABABAFEBAFABEBABAFABABEBABEBAFABAFABAFEBABABABEBABABAFAFABABEBABEBAFA FABAFEBEBABABAFAFEFABABEBABABABABEBAFABABAFEBAFABAFEBABEBEBAFABEBABEB EFABEBAFABABAFEBEBEBABAFEBAFABABABABABABABABABAFAFABEBABEFABABABAFABA BEBABABABEFABAFABABAFEBABABABEBCBABABABABABABABABA$18BDF5B2F4BFBFBFBF 2B3F2BF3BFBF3BF5BF2B2F2BF5BFBF3B2F5BFBF11BF3B2F5BF6BF3BF2BFBFBF3B2F 14B2F6BFB2F2BFB3F5BF4B4F5BF5B2F7BF14B2F3BFBFBF3BF3BF8B2FB3F4B4F9BF5B 2F7BF6BF8BFB2FBF4B2F18BFBF15BF4BD18B$BABABABABABABABABADAFAFABEBABABE BABABAFABABAFABABEFABABAFABABABAFABABEBAFABABABABABABEBAFABABABABABAB EBABABEFABAFABABEFAFABEFABABABABEFAFABABABEBABABEBABABEBABEFAFAFAFEBE FEBEBABEBABEBABEFABABEFABABABAFABABAFEBABAFABABAFAFEBABEBABABEBAFEBEB ABABABAFEFEFEBEBABEBAFAFAFABABEBEBAFAFABABEBABABAFABEBABAFAFABABABABA BEBABAFEBAFEBABABEBAFABABEFABAFABABABAFEBEBCBABABABABABABABABA$18BDFB 2F4BF4BFBF2BF6BF4BF6B2FBF2B2F4BFBF2BF3B2F4BF14BF4B5F2B2FB2FBFBF2BF4BF 3BFBF11B2F2BF4B2FBF5BF7B2FBF5B2FBF9B2F6BF5BFB2F2BF2BF3BFB2F2BF9BF2BF 8BF3BF3B2FBFBF3BF3B2F6B2F3BF2B2F2BF4BF6BF2BFB2F4BF3BF2B2FBF5B2F4BFB5F B3FBF3BFBD18B$BABABABABABABABABADABABABABABAFAFEBABABEBABABAFEBABABAB ABABAFABABEFEBABABABABABABABABABABABAFEBAFABABABEFEBABAFAFEBEBABAFABA BABABEFABABABEFEBABABABABEBEBEBAFEFAFABEBAFABEBAFABEFABABEBABEBEBABAB ABAFAFABABABABABABABABABAFABEFAFAFABAFABEFABEBAFABAFABEBEFABAFAFAFAFA FABAFABEBAFEBEBABAFABABABABEBABABABAFABAFABABEBAFABAFEBEBABABAFEBABAB EBABAFAFABEBABABABABCBABABABABABABABABA$18BDBFBFBF6BF5BF5BF7BF4BF20BF 2BF3BF5B2F2BFBF5B2FBF4BF3BFBFB2FBFB2F2BFBFBFB2FBF2B2FBF7BF2B2F6B2F4BF BF3B2F3BFBFBF3BFBFBF3BFBF6B4FBF4BF18BF3BFB2F2BF14BF2BF2B3F3BFBF6BF4BF 15B3F4BF2BFBF4BF2BF2BFB3FBFBF8BF8BF2BD18B$BABABABABABABABABADABEBABAF ABABAFABAFABAFABEFABEBABAFABABABABABABAFABABABEFABEBAFEBABAFABABABABE BAFAFABABAFABEBABABEBEBABABEBEBAFEBAFEBABAFABEBAFABABABABEBEBEBABABAB EBABABABABEBABABEFABEBEBABABABABAFAFABAFABABABABABABEBABABEBABAFEBEFA BAFABABABABEBEBAFAFEBABEBEBAFABEFABABABABABAFABABAFABAFAFEBABABABABEB EBAFABABABEBEBEBABABEBABEBABEBABABABABAFEFEBABABCBABABABABABABABABA$ 18BD2F2BFBF5B2F4BF3BFBF3BFBFB3FBF6BFBFBFBF4BF2BFBF5BFBFBFBF7B2F2BFBF 2BFBF4BFB2F8BFBFB3F6B2F2BF2BF5BF6BF5BF2BF2BF6BF9B3F3BF2BF10B2F3BF11BF 10B4F2B2F3BF7BF8BFBF3B2FB2FB2FB2FBF4BF3BF5BF5B2F6BF2B2F3BF2B4F2BF14BF 2BF4BD18B$BABABABABABABABABADEBABABABABABABABAFABAFABABAFEBABABEBAFAB ABEFAFABABABABEBABABABAFEBAFABAFEBABEBABABAFABEBAFABEBEFABABAFEBEBABA BAFEBABEBAFEBEFABAFABABEBABAFABABEFABABABABAFABAFEBEFABABAFEBABABEBAB AFABABAFABEBEFAFAFAFEBABEFABABABEBABEFAFABEBEBEBAFEFABEFEBAFAFAFEBABA BABAFEBAFEBABEBABABEBABAFABEBABABABEBABAFAFABABAFABABABABABEFEBAFABAB ABABABEBABEBAFABCBABABABABABABABABA$18BDF4BFBF4BF4BF5BF4B2F7BFBFB3F3B 2F6BF2BF6B2F2BFBF3BF2BF8B2F7BF6B2F7BF8B2F2B2F5BF2BF2BF3B2F7BF6BF3BF2B F4BFBF2BF3BFBFBF2BFB2FBF3B2F3B2F4BF3BF3BF3B2F7BF3BF7BF3B2F2BFBF11BF2B F3B2F2BF8BF12BFB2FB2FB2FBF7BF3B3FBF6BF2BFD18B$BABABABABABABABABADABEF ABABABEBAFABABABABAFEBABEBAFEBAFABEFABABABABABAFAFEBABAFEBAFABEBABABA BABABAFAFAFABEBABEFABABAFABEBABABABEFEFABABEBAFAFABEBEBABEBEBABABABEB AFAFEFEBEBAFABABABABAFABABEBEBAFEBEBEBEBAFABABEBEBEFABABEBABAFAFEFEFA BABEBABABAFABABABABEBEBABABABABABAFABABEBAFAFAFAFAFABEBABABEBEFABAFAF ABEFAFABAFABEBAFABABABAFABAFAFABABAFABABABAFEBABAFABCBABABABABABABABA BA$18BD3BF9BFBF2BF4BF3BF2BF7B2FB2FBF6BF2BFB4F3BF4BFBF4BF10BF3B3FBF2B 3F3B2F13BF7B2F3B2F5BF8BFBF4BF7B2F5BFB2FB3F4BFBF2BF2BFBF4BF2B2FBF4BF3B F7BF4BFB2FBFBF2BF2BF3BF2BF3BF3B3F6B6F20BF2BFB2F5BF4B3F5B2F3B2F2BF4B3F 3BD18B$BABABABABABABABABADABAFEBABABABEBABEBABEBABABABEFEBAFAFAFEFAFA BABEBAFAFEBABAFABEFAFABABAFAFABABABABABABABEBAFABABAFAFABABAFABABAFAB EFAFEBABEBAFAFEBABABAFAFABEBABAFABEBABABABEBABABEBABABEBEBEFABAFABABA BABEBAFEBABAFABABABEBABABABABABABABABEBABABABABABAFEBAFABEBABEBABEFAB ABABABABABEBAFAFABABAFAFEBEBABABEFABAFAFAFEBAFABEBABAFABEFEFABAFABABA BABABEFABEBABCBABABABABABABABABA$18BDFB2FB2F8BF2BF17BF9BFBF2B2FBFB3F 5BFBF2BF3BFB2F9B2F3BF6BF9BF10BF2BFBF5BF9BFB2F9B2F3BFBF8BF4BF2B3F5BF 22B2FB2F2BF8BF2BF5B2F3BF9BF2BF8B2F2BF12B2F4B2FBFBF2BF4BF4BF2BF22BF4BD 18B$BABABABABABABABABADAFABABABABEBABEBEBEFABABABABABABEBABEBABABABEB ABAFABABABAFABABABEBABABABABAFAFABEFABEFABEBABABABABABABABABEFABEBABA FABAFABAFEBABABABEBABEBABABABABAFEFABABABAFEBEBABEBAFABAFEFABABABABAF EBABEFABEFAFABEBEBABABAFABABABEBABABABAFABABEFEFABAFABAFABAFAFAFABABA BABEBEBABEBAFAFAFABAFEBABAFEBEFEBABEBAFEFABAFABABABABABABEBABABEFABAB ABEBEFABEBCBABABABABABABABABA$18BD2FBFBF8B2FBF8BFBFBF7BFBF5BFBFB2F2BF 3BF3BFBF7BF24B4F6BF2B2FB3FBF12BF4BF7BF4BF2BFBF6BFBF3B2FB3F6B2F5BF4BF 3BF11BF4B5F2BF2BF6BF2BF7B2FBFBF6BFB2F3BFBFB2F4BF2BF5BFBF6BF6B2F10B2F 8BFBFB2F5BF2BF2BD18B$BABABABABABABABABADAFAFAFEBABEFABABABAFEBEFAFEBA BABEBAFEBABABABABAFEFEBEFEBABABABABABABEBABABABABEBABEBEBABABAFAFAFAB ABABABABABEBABABEFEBAFABEFABEBAFEFAFABABABABABABABEBABABEBABEBAFEFEBE BABABEBEFABABEBABABABAFABEFEBAFAFEBEBEBAFABABAFEBABABABABEFABABABABAB ABABEBABABABABEFABAFEBEBABAFABAFABEFAFABABEFABABABABABAFABEBABAFEBABA BAFAFAFABABABABABEFABABEBABCBABABABABABABABABA$18BD8BFBF8B2FB3F5BF9BF BF2BFBF2BFBF3BFBFBFB2F4BF3BF3BFBF12B2F3BF3BF7B2F5BF4BF4BF5BFB2F2B3F2B 2F5BF2BF2BF6BF2BFB2F4BFBFBFB2F13BF2BF4BF3B2FB2F4BFBF5BF3BFB2F2BF2BF2B FBF2B3FB3F4B3FB2F2BF3BF9B2F5BF6B2FBF3BF3BF3BFBF3BF3B2FB2F4B3F4BD18B$B ABABABABABABABABADAFEBABEFEBEBEFABEBEBABEBABEFABABABABABEBABEFABEFABA BEFABABAFEBABAFAFABEBABEBEBEBABABABABABEBEBAFAFABABABEFABABABEBABAFAF ABAFAFAFABABABABAFEFABABEBABABABEBABEBABABABAFEBABABABABAFEBEBABAFEBA BABAFABABABAFEBAFEBABABAFAFABEBABABAFEBABABABAFABEBEFABAFABABABEBABAB AFAFAFEBAFABABEFEFABABABABEFABEFABABAFABEBAFEBABAFABEBAFEBAFABEBEFABA BEBABCBABABABABABABABABA$18BD10BF2BF5BF6BFB2F12BF5B2FBF4BF2BF4B3F3B2F 5BF13BF5BF3BF2B2F3BF2B2F10BF9B2F6B2F6B2F8BFBF12BF6B4F4BFBF4BFB2F6BF4B F2BF9B2F7BF13B4F5BFBF7B2FBF3BF3B3F3B3F2BF3BF3BF4B2F6BF2BF2BF4BF6BF3BD 18B$BABABABABABABABABADABABABABEFAFEFABAFAFAFEBABABABABEFABEBEBABAFAB EFABAFABABABABABEBABEBABABABABEBABABABAFABEBEBEBABABABEFEBABEBABABABA BAFAFABEBABABEFAFABEFABAFAFABEFEBABABEBABAFABABEBABABABAFABEBABABEBAB AFEBABEBABAFABABEBEBEBABEFABEFEBABABAFABEBABEBABAFABAFEBEBABAFABAFAFA BABAFABABABABABEBABABAFEBABAFABABAFEBEBABEBAFEFAFAFEBABEBABABAFEFABAB AFABABAFAFCBABABABABABABABABA$18BD6B2FBF9B3F9BFBFBF6BF5BF2BFBF2B2F2BF 8BF7BFBF2BF3BF2B2F2BF6B2F12BF9B2F5B2F3B2FB2F2BF2BF14BFBF3BF6B2F6B3FBF 4BF5BF3BF3BF2BF3BFBF8BF3BF3BF5BF3BFB3F3BF2BFBF2B2F2BF2BF9BF4BF2B2F4BF 6BF2BF4B2F4BF11BFBF8BD18B$BABABABABABABABABADABAFAFABABABEFABABEBABAB EBABABABEFABAFABEFAFEBEBAFABABABAFABABEFABABABAFABABABEBABABABABEBAFA FABABAFEBEBAFABABABEBABEBABEFABAFABABABABEBAFABEBABABABAFABAFABAFEBEB ABEBABABAFEBABAFABEBEBABAFAFABABABEBABABABEBABABABEBAFABABABEBABAFEFA FAFAFEBABEBAFABAFABEBABABABEBEBABEFABABABABEBABABEBAFABABAFABABAFAFAF AFEBAFABAFEFEFABEBABABEBEBABAFABCBABABABABABABABABA$18BD10BFB2F7BF6B 3F7B2F2BFBF3BF2BF4BFBFBFBF4BF5BFBF6BFB2FB3FBF4BF4BF4B2FBF2B2F3BF8BFBF 7B2F7B2F11BF3B3F4BFBFBF5BFBF11BF8B2FBFBF7BF5BFBFBF6BF7B2F5BFBF2B2FB2F BF2BF4B2F2BF4BF2BF5BF2B2FBF3BF6BF3BF6B2F7BFBF4BF2BFD18B$BABABABABABAB ABABADABABABEBABEFABABABABEBEBAFAFABABABEFABEBABEBEBEBEBEBABEBABAFABA FEBABABEFAFABABABABABABABEBAFEBABABEBEBABAFAFABEBAFABABABAFAFABEBABAF ABABABABEFEBABAFEBABABAFABABABABABABAFAFAFABABABABABAFEBEBABABABABAFE FABEBABABEBEFAFEFABABEBEBEBABABEFAFEFABAFABAFEBABEBEBABEBABEBEBAFABEB AFAFAFABABEBEBAFEBABEFEFABABABAFABABEBABEBEFEBABEBEBABABABAFABCBABABA BABABABABABA$18BDF5BF3BFBFBF6BFBF5BF2BF3BF3BF2BF3BF4BF8BF15BF2BFB3F5B F3BFB2F13BF2B3F4B2F4BF3B3F7BF3BF3BF2B2F5BF3B2F3BF2BFBF7BFBF2B2FBF11BF 3B2F2BFBF3BF4B2FBF21BF2BF3B2F3BFBF2BF2B2F3BF5BF19B3F7BFB3F3BFBF6BF4BF B2FD18B$BABABABABABABABABADABAFEBABAFABEFEBEBABABABEFABABEBEBAFABEBAF ABEBABABABEBABAFABABAFABABAFABEBABABABEFABABEBABABABEBEBAFABABABABEBE BABEFAFABEBEBABAFEFABABEBEBEBAFEBABAFAFABAFEBABABABABABABAFABAFAFAFAB ABABABABABABABABEBABABAFABEBAFAFABABABABABABAFABABAFABABAFABABABEFEBA BEBABABEFAFAFEBABABABEFABABEBEBABABABABAFAFABABABAFAFABEFEFABAFABEBAF ABAFEBAFABABAFCBABABABABABABABABA$18BD2F2BFBF3BF2B2F3BF2BFBF2B3FBF3BF 3BF2BF10B2F9BFB3FBFBFBFBFBF5B2FBF6B2F5B2FBFB2F3B2F6BFBF6BF2BF2BF4BF4B FBF3BFBF2B2FBF7BF3BF3BF3BFBF3BF4BF7BF3BFBF5B3F4BF2BFBF3BF3BFB2F7BF5BF 5BF3BFBFBF2BF8BFBF6BF3BF3BF3BF2BF3BFBFBF2BF3BF5B2FBFBFBF7BFD18B$BABAB ABABABABABABADEBEBAFABABABEBEFABABABEBABAFAFEFEBEBABAFABABEFABABABABA BABEBAFAFAFAFAFABAFABEFEBAFABEFABEFABEBEFEBEBABEBEBABAFEFEBAFEBEFAFAB EFABABABAFEFAFEBEFABABAFAFEFAFABABABABABABAFABEBABAFABAFEBABAFABABEFA BABABEBABABABABAFEBAFABABAFEBABAFABEBABAFAFABAFEBABABABEFABABEBEFABEB EBEBEFEBABAFABEBEBAFAFABABAFABEBEBEBAFABAFABEBEBEBAFAFAFABABABABAFEBA FCBABABABABABABABABA$18BD3F4B3FBF3BF7BF5B2F2BF3BF2BF8BF3BF2BF4BF5BF4B F2B2F3BF2BF2BF8BF4BF5B2F3BF4B2F23BF5BF2BF3BF5BF3BF2B2F27B4F4B3F2BFBF 8BF3BFBF10B2F10BF5BF2BF4BFBF4BF2B2F2B3F12BF2BF2BFBFBF15BF3B4F6BD18B$B ABABABABABABABABADABABEBAFEFABABABAFAFEFABABABAFABAFEBAFABEBABAFAFAFA BEBEFABEBABAFAFEBABABEBABABEFABABABABEBABEBEBABEBAFABEBEBEBAFABAFEBAB ABABAFAFABABABABABEBEFEFAFAFAFABEFAFABAFEBABAFABABABAFABABEFAFABABABA BABABABABABABAFAFABEBAFABAFEFEBAFAFABABAFEBEFABABABABAFABABEBAFAFAFAF ABABABAFABABEBABEBABABEBEBABABEFABEBABAFABEFABEFABABEBEBEBAFAFEBAFABA FAFABCBABABABABABABABABA$18BD8BF3BF12B2F10BF2BF8BFB2F4BF8BF2B2F2B4F3B F5BF6BF13BF6BFBF4BF8BFBF2BF4BF3BFBF2BF5BF2B2F4BF3BF2B2FB2F4BF2BF3BFBF B2FBF4B3F10BF7BF5B2FBF6BF8B2F7BF4BF5BF10BF2BF12BFB2F3BF8BF4BFBF4B2F6B 3FBD18B$BABABABABABABABABADABEBAFABABABABABABAFABABABAFAFEBABEFABABAB ABEBEBABABAFABEFABEFEBABEFAFABABEBEBABABABEBABAFABABABABABEBEBEBAFABE BAFABABABABEFABEBABAFABAFABABEBABABAFABABABEBAFABABABAFEBABEFEBEBABAB AFAFAFABAFEBEFABABABABEFAFABAFABABEBAFAFABEFABABABABAFABABABABAFEBABA BABABEFABABEFABEBABABEBEBABABAFAFEFAFABEFEFABEBABABEBABABABEBEBABABAF EBABABAFABAFEFCBABABABABABABABABA$18BDBF4BF2BF14BFBF2BF2BF5BF3BF4BF6B 2F7B2F3BF4BF4BF3BFB2F2B3F2BF5BF5BF3B2F2BF2BF2BF4BF2BF3BF3BFBFB2F3BF2B FBF3B2F6BFBF2BF8B2F3B2F4B2F7BFBF5B2FBF4BFB2FBF5B3FBF2B2F2BF5BF2BF3BFB F5BFB3FBF3B3F4BF6BF3BF6BFBF2B2F3BF2B2F4BF6B2F6BFBFBF2BFBD18B$BABABABA BABABABABADABEBAFABEFABABEBABABABABABABABABEBABAFEBABAFABABABABABABAB ABABEFAFABABABABEBAFABABAFABABAFABABABEBEBABABABAFEFABABABABABABABABE BEBABAFABABABABABAFEBABAFABAFABABEBEBEBABABAFABEFAFAFABABABABABABABEB AFABEBABEBAFABAFAFAFABEBAFEFEBABEFABEBABEFABABEBABEBABABABABABABABEFA FABEBEBEBABABEFABEBABABAFEBABABABABABAFEFABEFEFAFABABAFABEBABABABAFCB ABABABABABABABABA$18BD2B3FBF8BF2BF3BF7BF4BF2B2F10BFB2F5BF3BF4BF2BF2BF 13BF8BF3B2F5BF6BFBF6B2F4BF11BF2BF12BF4BFBFB3F4BF6BFBFBF2BF8B3FBF3BF7B F3BFBFBF3BF3BF2BF3BF4BF2BF5BFBF2B2F2B2F4BFBF14BF3BFB2FBF14BFBF5B3F8BF 6BD18B$BABABABABABABABABADABABEBABEFABABAFABABEBABEBEBABEFABABEBAFABA BABABABABABABABAFABAFABABEBEBAFEBABABAFAFAFAFEBAFABAFABABEBABAFEBABEF ABAFABEBAFEBAFABABABABEBABABABAFAFABAFAFABABABEBAFABEBAFABEBEBABABEBE BABABABABEFABEFAFEBEFABEBAFEBABAFABAFEBABEBAFAFABABABABABAFAFAFABAFAB ABEBABEBABAFABABEFEBABABABABABABEBABABAFABABABABAFAFEBABEBABABABEBABE FABABABAFEFABCBABABABABABABABABA$18BDB3FBF3BFBFBF2BF5BFBF7BF4BF10B2F 3BF6B2F3BF2B5F3BF2BF2BF3BFBF5BFB2F2BF4BF3BF5BF6BFB2F11BF12BF3BFBF3BFB 2F6BF2BFBFB2FBF6BF2B2FBF8BF7BF2BF10B2F2BFB2F2B2F10B3F2BFB2F4BF4BF3BF 2BF2BF3BF5B2FBF4BF3BF4BF3BF5BF9BF10BD18B$BABABABABABABABABADABAFABABA FEBABABABABABABEFABAFABAFABABAFEFABEBEBAFEBABABABAFEFEBABABABABAFABEB ABEBABABABEBAFABAFABEBABEBABAFABABAFABABABABABABEBAFAFAFABABABEBAFAFA BEFAFABAFABABABABABEBABAFEBEBAFEBEBABABABABABABABABEBABAFABABEBABAFAB AFABEBEBABABAFEBEFABABEBABAFEBABEBAFABABABABABAFABABEBABABABABEBABABE FEBAFAFEFEBABABAFEBABABAFABAFABAFABEFAFABEBABABCBABABABABABABABABA$ 18BDBFBF3B2F2BFBF3BF22B2F2BFB2F3BF5BF4BFB2F10B2F2BF4BF3B2F4B3F7BF3B3F 8BF8BFBF9BF4BF2B2F4B2FB2FB2F6BFB2F9BFBF2BF4BF3BF4BF8B2F5B2F2B2F3BF3B 2F3BFB2F7BF5BF11B4F2B2F9BF4BFBFB2FBF2B3FB2F3B3F2B2F4BF9B2F4BD18B$BABA BABABABABABABADABAFAFEFABAFEBABEFABAFABEBABABABABEBAFABEBABEFABABABAF EBABEBABEFABAFABABEBAFABABAFABABEBAFAFEBABAFEBABAFABABAFEBABABABAFABA BABAFEBABABAFABABEFEBAFAFABAFEBABAFABABEFAFAFABABEBAFABEFEBABABABABAB AFEBABEBABABAFABAFABEBAFABAFABABEBEBABAFABEBABABABABABABEBEBABAFEBEFA BABEBAFABEBABEBABABABEBAFABABEBABABEBAFABABAFABABABAFAFEFAFABABABAFAB AFCBABABABABABABABABA$18BDBF2BF3BFBF4B2F2BF11BF2B4F13B2F7BFB2F5BF4BF 6BF3BF3B2F3BF2BF2BF4BF6BF5BFBF4BF3BFBF7BF5BF7BF6BFBF3B3F2BF4BF2BF2B2F 4BFB4F4BF7BF3B3F5BFBF2BF2B2F5BF3BFB2F6BFB3FBF4BF6B2F4BF3B2F2B2F8BF3BF 5BF3B2F2BFBFBF8BF9B2FD18B$BABABABABABABABABADABEBABABABABEBEBEBEBABAB ABABABABABEBABEFEFABEBAFABAFEBEBAFABEFABABABABEBABEFEFAFEFEFAFABEBABA BABEBABABABABABABAFABAFABABEFABEBEFAFABABAFEFAFABABABAFABABABAFAFEBAB AFEBABEBABEBEBEBABABABABAFAFAFABEBABEBABEBABEBABEBABABEFABEBABAFABABA BABAFAFEFABEBABEBABAFABABABEBAFEBABABABEBABAFABAFEBEFEBEBEBAFABABEFAB ABABEBABABABABAFABABAFABEBABABEBCBABABABABABABABABA$18BDF4BF4BF2B2F2B FBF2BFB2F2BF2B2FBF7BFBFBFBF3BFBF4BF10B2F2BF8BF2BF5BF4BF2BF7B3F9BF3BFB FBFBFB4F5BF4B3F6B2F3B2FBF7BF7BF2BF2BFBF3BF4BFB2F2BF4BF3BF2BF2BF6BF5BF 3BF3BF2B2FBFB3F2BFBF2B2F3BF3BF2B2FBFB2F2BF7B2FB2F2BFBF3B2FBF9BF11BF4B F2BFD18B$BABABABABABABABABADEBEBEBEFABABAFABABABABABABABEBABAFABABABE BABABABAFAFAFEFAFAFEBABEBABABEBAFABEBEBABABEBABABABABABABABABAFEBEFEF ABEBEFABAFEBABAFABEBABAFEBEFEBABABAFABAFAFABABEFABABAFABAFABAFABABABA BABEFAFABAFABABEBABEFEBABABABABEFABEBABABAFABEFAFABABEBAFABABAFABAFAF EBABEBABAFABAFABABABEBEBEBAFABABAFABABABAFAFAFABEBAFABEBEBEBABEFEBEFA BEBEFABAFEBAFABCBABABABABABABABABA$18BD3F16BF8B2F6B4FBFBF7BFB2F2BF5BF 3BFBFBF2BF3BF2BFBF4BFBF2BF4BF4B3F3BFBF2BF6BF5BFBF3BF2BF9B3FBFBF3B2F2B F3BF2BFBFBFBF19BFB2FBF3B2FBF4BF5B2F3B3F6BF10BF11BFB2FBFB3F3B2F7BFBF5B F2B2FBF4BF3BFBF2B2FB2F3B3F9B3FBF2B2FD18B$BABABABABABABABABADEBABAFABA BABAFABAFABABEFABABABABAFABABAFABABABABABABABEBEBABAFAFABAFABEFABABEB EBAFABEBABEBABABABABAFABAFABAFABABABABABABABEBAFEBABABEBAFABABABEBAFA FABEBEBAFAFEBABABABABABABAFEBABABABAFEBABABABEFAFABABAFABAFAFABABABAF EBABABEFABABAFEBABABABAFABEFABEFABEBABAFAFEFEFAFAFAFAFAFABABAFABABAFA BAFEFABABABABABAFABABABAFEBABAFEBABABAFEBABEFABCBABABABABABABABABA$ 18BDBF8B3F7B2F2BF3BFBF2B3F5BF4BF6BF10BF3BF4BFBFBF4BF9BF2BFB2F3BF4BFBF 2BF2BFBFBF4BFBF4BF3BF2BF2BF4B2F3BF3BF17BF8BFBF6BFB3F3B2F6BFB2F10BF5BF 14B2F3B2F2BFB2F2B2FBF9BF10BFBF5BF4B3F7B2F10BF11BFBFBD18B$BABABABABABA BABABADABEBABAFEBABABABABABABAFAFEBAFEBABABABEBEBABAFAFABABEFABEBABAF ABABABABEBABABAFABABAFEFABABEBEBABEBAFEBABABEBAFABABABABABEBABEBABABE BABEBABABABEBABEBABABEBEBEFABABEBABABEFEFABABAFABEBABEBABABAFEBABEFEB ABEBAFEBABAFAFAFABEBEBEBAFABABABABABEBEFEFABEBEBAFABABEBABEBEBEBABABA BABABEBABEBABABABAFABABEBABEBABABABEBEBAFABAFABEBABAFABABEBAFAFCBABAB ABABABABABABA$18BD3BF10BFBF5B3FBF3BF6B2FBF7BF3BFB2F4BF3BF7BF8BF3BF7BF 3BF6BFB3F4BFBF2B2F2B2F3BF5B2F3BF2B2F5B3F4BF5BFBF2BF3BF2B2F2BF4BF3BF6B F12BF2BF4BF5B2F4BFBF3B2F3BF6BFBFBF2B2F10BF13BF3BF3BF2B4F3B2FBFBF16BF 3BF6BF3BD18B$BABABABABABABABABADEBABAFEFEBAFABEFEBABABABEBABEBEFABABA BAFABAFABAFAFABABEBABABAFABAFEFEBEBAFEBABABABABAFAFEBABABABAFAFAFABAB AFABAFABAFABABABEFAFEBEBABABABAFAFEBEBABEBEBEFEBAFEFEFABABEBABABEFAFE BAFEFABABABAFABAFAFAFABABABABEBEBEBABABEBAFABAFABABABABABAFEBEBABAFAB AFABABABABABABAFABABABABEFABABABEBABABABABABABEBEBABEBABABAFEFEBEBEBE BEBABABABABEFABABEFCBABABABABABABABABA$18BDF17B2F11BF3BF7BF11B2FBF2BF 6BF6BF7BF3BF2B3F2B2F6BF2BFBF5BF6BF2B2FB2F9BFBF4BF2B3F3BFB2F4BF2BFBF4B F3BF4B3F2B2FBF2B2F4BF8BF3BF2BF2BF2B2F4B2F4BF3B2F3BFB2F4BF5BF3BF16BF5B F2BF6BF2B3F6BFB5F2B2FBF4BF2BF2BF4BD18B$BABABABABABABABABADEBEBABABABA FEBAFABABEFEBABABABAFEBAFEBEFAFEFEBABAFABEBEBABAFAFABABEBEBABABABABAB EBABABEBEFEBAFEBAFAFABABAFEBABABEBABABABEBEBABEBABEBABABAFABAFEBABABA BAFAFEBEBEBEBABEBABAFABABABAFAFEFEBEBEBAFEFEFEFABABABABEBABABEFABABEB ABABAFABEBABABAFEBABAFABABAFAFEBABABABABAFABEBAFABABEBEBEBABEBEBABABA FABAFAFABABABABEBEBAFEBABABEBEBABAFEBAFABEBEBCBABABABABABABABABA$18BD 6BF5B2F3BF5BFBFBF5B2F9B2FBF10B3F3BF8BF3BFBF5BF3BFBF2B2F3BF4BF25BF3BFB 2F4BF2BF3BF8BF11B2F6BF2BF3BF2BF6BFBF5BF2BF14BFBFBF5BF2BF2B5FBF5BF6B2F 2BF2B3F7B2F2BF2B2F14B3F5BF5BFB3FBF2BFBF3B3F4BD18B$BABABABABABABABABAD AFABEBABEBAFABABABABAFABEBAFAFABABABABABABABAFABABEBABEBABAFEBABABEBA BEBABABABABABAFABEBEBABABAFEBABABABEBAFEBEBAFABABABABEBEBABABAFABEBAB ABABAFABABABABAFAFAFABEFEFABEFEFABABABABABABEBABEBAFEBABABABABABABEBE BAFABABAFABEFABABABABEBAFABEBAFAFABABABABABABABABEBEBEFAFABABABEBABAF EBEFEBABABABABABABABABAFABABABABAFABABAFEBAFABEBEBABEBAFCBABABABABABA BABABA$18BD4BFBF3BF2B2FBF4B2F3B4FB4F7BF4BF2BFB2FBF5BF7BF2BF5BF3BFB2F 6B2F2BF5B2F6B2F7BF3BF6BF3BF3BF4B2FB2F3BFB2F4BF2BF9BF8BF2BF2BF4BFB5F7B F13BF2BF2BFB2F3BF5BF2BF4BF6BF12BF8BF4BF5BF6BF2BFBF3B2FBF3B2F7BF3B4F2B F2BD18B$BABABABABABABABABADEBEBAFABEBABEBABABAFABEBABEBEBABEBABEFEBAB AFAFABAFABEBABABEBABABEBABABEBEFABABEBABEFABEFEBABABABABABEBABABABEFA BABABABAFEFEFEBEBABEBABEBEBEBABABEFAFEFABAFAFABEBABEBABABAFABAFABEBEB EFAFABEBEBAFABABAFABABAFAFAFABABABAFABABABABABABABEBAFABABAFAFEBABABA BABABEFABAFABABEBABABABEBABAFABABABABABABABEBABEFABABEBABEBABABABEBEB ABEFABABABEBAFCBABABABABABABABABA$18BD3BFBF6B2F5BF3BFB2F2BF3BF10BF2B 2F4BF3BF11BF11B2F2BF12BF3BF11BF10BFBFBF8B2F2B2F12B2FBF3BFBF3BF2BF2BF 13BF4BF3BF3BF7BF6B3F3B3F4BFBFBF8BF6BF8B2F5BF3BF4BFBF10BFB2F2BF6B2F8B 2F3B2FBF4BF4BF2BD18B$BABABABABABABABABADABABAFEBABAFEBABEBABAFABEBAFA BEFABABAFABAFABABABABABEFABABAFABABABABABAFAFAFEBABABABAFABAFEBABEBAF EFABAFABABEBABEBABABABABAFAFEFABABABABABABABABABAFABABABABABABABAFAFA BABABEBABEBABAFEBEBABABABAFAFEBABEBABEFABABABABABABABEBEBAFEBABAFABAB ABABAFAFAFEBEFAFABEFABABEBEBEBAFEBABABEFAFABABABABABEBABEBAFABABABAFA BAFEBEBABABABAFABABEBEBEFAFCBABABABABABABABABA$18BD3B3F2BF2BFBF2B2FBF 3B3F9BF3BF6BF8B2F7BF8BF8BF4BF4B2FB2FBF4BF7BF2BF3BFBF5B2F6BF2BF22BF4BF 2BF2BFB5FBF10BFBF6B2F2BF4B2F4B2FBF2BFBF3BF2BFB3F5BF7BFBFBF3B2FB2FB2FB FB2F4B2FBFBF4B2F2B2F9BF3BFBF8BFB2F6BF4B2F3BD18B$BABABABABABABABABADAB AFABABEBABEFABABABABAFABEBAFAFEBEBEBABEFEFAFABEBABABABAFABEBABEBEBAFA FABABEFEBEBABEBABABABABABEBABAFABABABABABEBABABAFAFAFABEFEBEBEBABABAB ABABABABABAFEBABABAFABAFABEBABABABABABEFAFAFEBEBABABABABABEBABEBAFABA BABABABABEFABABEBEBEFAFAFAFEFAFAFEFEFABABEFABABAFABAFEBABABEBABABAFAF ABABABABEBEBEBABEBABEBABABABABEBEBABABABEBAFAFABAFABEBCBABABABABABABA BABA$18BD5B2F5B2F2BF4BFBFBF5BFBF2BF3B2F2B3FBF3BF5B2F3BF2B2F9BFB2FBF2B F2B2FBFBF12BF7B2F6BF2BFBF2BF3BF4BF17BF3B2F16BF7BF2B4F2BF20B2F4B3FBF2B FBF6B2F3BFBFB4F5BFBF8BF4BF5BFBF3BF3BFBF9B2F2BF3BF4B2F3BF5BFBF2B2FD18B $BABABABABABABABABADEFEBAFAFEBAFAFABEBABEBABAFABAFEBABEBABABABEFABEFA FEFABABAFEBEBABEBAFEBABABABABEFEFAFABAFAFABABEBABABEBABABAFEBEBEBABAB EBEBABABEFEFEFABAFABABAFABABEBAFABABABABABAFABABABEBABAFABEBABABABABA FEBABEBABABABEFAFABABAFABAFAFEBEBABABAFABABABABABABABABABABEBEFEFABAF EFAFEBAFEBEBABEBABABAFABAFABEBAFAFABABAFABEBEBAFABEBABABAFAFABAFEBABE BAFEBEFCBABABABABABABABABA$18BD5BF2BFB2FBF8BF2BF3BFB2F2BF2BF7BF3BFB3F 3BF6BF4BFBF4BF3B2F3BF3B2F5BFBFB3FBFBF4BF5B2F8BF2B2F6B3FBF3BFBF7BF9B2F 4B3F3BFBF18BF8B4F9B2F2BFBF7BF8BF3BFB2F2BF5B3F2BFB2FBFBF4B2F6BF7BF3BF 5BF5B2F8B3FBFBFBF3BD18B$BABABABABABABABABADABEFABABEFAFEFABABABEBABAB AFABABEBABAFABABABABABABAFEBEBABEBABABABABABAFABAFEBABABABAFEBABABEBA BABABAFABEBABEBEBEBEFABABABAFAFEBABEFABABEBABEFEFABAFAFABABABABABABAB ABABABABEFABAFABABABABABABEFEBABEBABABABABEBABABAFEBABAFABABAFABAFEBA BABEFABABABABABEBABABEBABEBEFABABABEBEBABABABAFABAFEFEBABABEFAFAFEFEB ABABAFEBEBABABABABABAFABABABABCBABABABABABABABABA$18BD3B2F2BF2B3F18BF 6BF5BF6B2F4B2F5BFB2F2BFBF4BFB3F4B2F2BF6BFBF3BFBF9BF3BFBF2BF9BF2BFBF9B F5B2F10BF8BF5BF8B2F10B4F4BF2BF6B3F8BF3BF8BF2BF4BF5BF7BF3BFB2FBF4BF3B 2F7BF5B2F6B3FB2F7B2FBFB2F3BFD18B$BABABABABABABABABADABABEFABAFABEFAFE FABEBAFABEFABAFABEBABABABABABABABABEBABABABABAFABABABEBEFEBABABABAFAB ABABAFABEBAFEBABEFAFAFEBABABEBABABABAFEFABABEBEBEBAFABAFEFABABEBABAFA BAFABABABEBAFABEBEBABAFABABEBEFEBAFEBABEBAFABEBABABABABABABABAFABABAB EBABEBEBEFABEBABAFAFABABABABABEBABEFAFAFAFABABABAFABABEBABEBABAFAFEBE BABABABABEBABABABABEBEBABABAFABABAFABABCBABABABABABABABABA$18BDB3F5B 2FBFBF3BFBF8BFBF19BF3BFB3F4BF3BF2BF12B4F11BF2BF2BF8BF2BFBFBFBF5BF2BFB F3BF2BF12BF2BF5BF2BF5BF2B2FB4F3BF9BF6B4FBF2BF3B2F4BF3BF3BF3B2F2B3F3BF 6B3F3BF4BF4BF3BF2BF13B2FB3FBF2BF3B2F3BFBFBF8BFBF9BFBD18B$BABABABABABA BABABADABEBAFEFAFABABEBABABEBABABABAFABEBABABEBAFABABEBEBABABABAFABAB ABAFABABAFAFABEBABABABEFAFEBAFAFEBABABABABABAFAFABABABABAFABAFAFAFABE BAFEBAFABABABABABABEBABABABABABAFABABABAFABABEBEBAFABABAFABEBEBEBEBAB EFEBEBAFAFAFEBABABEBABEBEBEBAFEFEBEBEBAFEBABABEBEBEFAFABABABABABAFABA FABEBABEBABEBABAFABAFEBABAFEBEFEFEBEBABABABEFEBAFEBABABABEFABEBCBABAB ABABABABABABA$18BDF5B3F3BF6BF9BFBF4BFBF2BFB2F8BF3BFBF10BFBFB4F2BF3BF 2BF3BF5B2FBF3BF7BF4B2F16BF4B2FB2F5B2FBF2BF18B2F4BF11BF2B2F7B4F3B4FBF 3BFBF7B3FB2F3BFBF8BF4BF8B2F2B3F9BFBFBF4BF21BF4BF2B2FBF2B3FB2FD18B$BAB ABABABABABABABADEBABABEBABAFEBAFEBABAFABABAFAFABABAFAFAFABABEBABABABE BAFEBABABABEBEBAFEBEBABABEBABEFABEBEFABEBABEBABABABEBAFABABABEFEBABAB EBABABEBABAFABAFABAFEBEBAFABEBAFABABABABAFABABEFEBAFAFAFABABAFEBABEBA FABABABABABABABEFEBAFAFAFABABABAFEBEBABEBAFAFABABEBEBABABABEBAFEBEBEF ABABABABEBABAFEBEBABABEBABABABAFAFEFAFABABABABAFABEBAFABABABABABEFABA BAFCBABABABABABABABABA$18BD12BF2BF5BF3BFB3F3BFBF5BF4BFBF2B3F5BF5BF2B 3F2B2FBF2BF6B3F8BFBFBF3BF2BF4BFBFBF2B2FBFB2F5B3F2B2F3BFBFBF3BF7BF3B2F 4BF4BFB2F5BF2BF2BF4BFBF7B3F4BF2BF6BF4B4FBF3B2F14BF2BF7BF3BF3BF2B2F9BF 18B2F15B2FB2FB3F2BFBD18B$BABABABABABABABABADEBEBABABEBABABEFAFEBEFAFA BABABAFAFAFABABABAFEBABEFABABEBAFABABABABAFABABABABEBABABEBABEBABEBEB EBAFABABEBAFAFABEBABABABAFABABABEFABAFABAFAFABABEBABAFEBABABABEBAFABA BEBABEBAFAFAFABAFEBEBEBABABABABABABABABEFABABAFABEBABABABEBABAFABAFAB ABABEBABABABEFEBABABEBABABEFABABABAFABABABEFEBAFABEBABEFAFABABABABAFA BEBABABEBEBABAFABAFABEBAFABAFABCBABABABABABABABABA$18BD5BF2BF3BF8BF3B F18B4F2BFBF6BFBFBF6B3FBFBF4BFB3FB2FBFBF3BF2BFBF2BF2B2F6BF3B4F3BF2BF6B F4BFBF2BF2BFBF9BF4BFBFBF4BF2BF3BF4BF2BF4BFBF10B2F10B3F6BF2BF4BF6B2F3B 2F3BF9BFB3F12BF2BFB2FBF2BFBF2BFB2FBF4BF2BF4BF2B2F2B2F5B2FBD18B$BABABA BABABABABABADABEBAFEFAFABAFABABABABABABABABEBABAFEFAFABEBAFEFAFABABAB EFABABABABAFEBABABABEBABABABEBABABABABABABABABABABABABEBABABABEBABABA BEFABAFEFAFEBAFABABAFEBAFABABEFABABABEFAFABABABABAFABEBABABABABEBAFAB EBEBABEBABAFAFAFEFABABABEBABABAFAFEFABABABABABABEBABABAFABEBAFABABAFA FEBAFEFEBABABAFAFAFABABABABAFABEBAFAFABEFABABABABABEBEFAFABAFABAFAFAB CBABABABABABABABABA$18BDFBFBFB2F11B3F14BF5B3F2BFBF9BF4B3F6BF2BF3BFBF 2BF4BF4BF4B5FBF3BF2BF2BF3BF6B2F2B2F10B2FBF9BF6BFB3FBF3BF15B2F3BF8BF2B 2FBF3BF2BF12BF4BF2BF5B2F3BFB4F3BF2B2FBFBF5BF9BF3B4F20B3F3BF7BF8BD18B$ BABABABABABABABABADABEBEFEBABEBABABAFABABABABABAFAFABEFABABABABABAFAB EBABAFABABAFABABEBEFABAFABABEBEFABABABEFABABABABEBAFABAFABEBEBAFEFABE FABABABABABABAFAFABABABAFABAFABEBABABABABAFABEBAFAFABABEBABABABABABAB ABEFABABAFABABABABEBABABABABAFAFABABEFEBABABEBEBEFABABABEBABEBABABABE BABABABAFABEBABAFAFABABABABEBEFAFABAFABABABABABABEFABAFABABABABAFAFAB ABABEFCBABABABABABABABABA$18BDF6BF2BF2BF2BF2BF4BF6BFBFBF3BF5BF2BF8BF 4BF3BF9BF8B2FBF3BF3BF16BF5BF7BFBF4B2FBF11BF8B2F4B3F12BFB3F3B2F3B2FBF 5BFB2F4BFBFBFBFB3F6B2F5BF3BF2BFBF10BF2B3F4BF3B3FBF2BFBFBF7BF6BF3B2F2B FBFBF2BFBFBF2BF3BF2BF2B2FBF2BFD18B$BABABABABABABABABADABABEBAFEBABABA BEBAFEBABAFABABEBABABABAFEBABABABAFEBABABAFEBABABEBABABEBABABABAFABEF ABEBEBABABABABEFABABEBABAFEBEBAFABABAFEBABABABABAFEBAFABABABAFAFABEBA BABABEBAFAFABABAFABEBABAFABEBABABAFABABEBEFAFABAFABABABEFABAFABEBEBAB ABABABABABAFEBEBABABAFABAFABABABEBEBEBEBABAFABAFAFABEBABABEBABABABEBA FAFAFABABABABABABABAFABEBABABABEBAFABAFAFCBABABABABABABABABA$18BD2BFB FBF14BF4BF2B2F6BF2BF3BFBF6BF19BFBF3BFBFBF3BF9BFB3F2BF7BF3BFBF2BFBF2BF 14B2F2BF5B2F3BF4BF2B3F4BF8BF8BF7B2F2BF3BF4BF2BF3B2F4BFBF3BF2B2FBF2B2F BFBFBFBF2B2F2BF5BF10BF6B2FBF5BF3BFB2F13BFBF9BF4BF3BF2BD18B$BABABABABA BABABABADAFABABABABEBEBABEFABABAFEBABABABEBABAFEBABABABABABABAFABABAB ABABAFEBABEFABABAFABEBABABEBABABABABABABABABABABEBAFABEBEFABEFEBEFABE BABABABEBAFAFABAFAFABEBABEBABAFEBABEBEBAFAFAFEBEFABAFAFABAFEBABEBABAB ABABABABABEBEBABABAFABAFABABAFABABAFAFABABABABABABABEBABABEBABABAFABA FEBAFABAFEFAFEBABABEBAFABABEBABAFABAFAFAFAFEBABABABAFABABAFABABABCBAB ABABABABABABABA$18BDF7B2FBFB3F2BF6BF9BF3BFBFBF2BFBF3BF5B2F4BF2B2F8BF 6BF8BF2B2FBF7BF12BFBF3B2F13BF2BF7B2FBF4BF6B2F2B2F3B4F6B2F3B2FB3F5BFB 2F28BF19BF8BF2B2F3BF10BF4BF2B2F4BF2BF2B2FBFBF4BF13BF3B2FD18B$BABABABA BABABABABADABEBABABABEFEBABEBABABABEBAFAFAFAFABAFEFEBEBABAFABEBABABAB ABABABABEFABAFABABABEBEBABEBABABEBAFABEBEBABEBAFABABEBAFABABEBABABEBA BEFAFABABEBEBABABABABEBEFABABAFABABABEBABABABAFAFABAFAFABAFEBABEBEBEB AFEBABABEBABABAFAFAFABABEBABEBEBABABABABEBABEFEFAFABABABABEBABEBAFEBA BEBEBAFABABEBAFABAFABABABABABAFAFEFEBABEBABEBABAFAFABABEBABABABABABCB ABABABABABABABABA$18BDB2FBF10BFBF11B3FBF18BF7BF2BFBF4BF2B4F8B3F2BFBFB F8BFBF3BFBF22BF5BFBF3BF3BF5BF11BF5BF2BF6BF10BF29B2F6BFBF8BF3BF2BF9BF 6BFB2F2BF6BFBF5B2F12B2F7BF4BF5BF2BF5BD18B$BABABABABABABABABADABAFAFEF EBABAFAFABABEBEFABABABEBAFABABABABABABAFABEFABABABABEBEBABABEFAFABAFA BABABEFAFEBABABEFAFAFABAFAFABABEBEBABABABEBEBAFABAFABEFABABABABEFABAF AFEFABABEBEBEFABABABAFABABAFABAFABABABABABABABABAFABEFABABABABAFAFEFE FABEBEBEFEBABAFABABABABABABABABAFAFAFEBABAFAFABABABABEBAFABABABABAFAB EBEFEBEBABAFABAFABABEBEBABABABEBABABABAFEBEFEFEBCBABABABABABABABABA$ 18BDB3F5B4FBF8BFBF6BF7BF2B2F3BFB2F2BF4BF5BF2BF4B2F2BF2B3F3BF3BF3BF7BF BF2BF2BF2B2F8BF11BF4B2F2BFBF3BF2BFBF3BFBF7BF4BF4BF5BF11B2F14BF11BF2BF 2BF2BFBF4BFBFB2F3BF2BFB2F4BF8BF5B2F2B2F3BF4BF2B2F2B3F8BF3BFBF2BF3BF3B F5BFD18B$BABABABABABABABABADABAFEBABAFABAFAFABABAFABEBAFEBAFABABABABA BEFABABAFABABAFABABEBEBEBABEFEFEFAFEBABABABEFAFEBEBEBEBABEBABABEBABEB AFABABEBEFABEBABABABABABABAFABEBAFABABABEFABABABEBABABABEBAFABABABAFA BABEBEBEBABAFAFAFABAFABEBEBAFEBAFAFEBABEBEFABABABEFAFABABEBEBABEBABAB ABEBEFAFABABEFABABABEBABEBAFABABABEFAFEFABEFABEBAFABABEBABABABEBEFABA BABABAFABABABEBCBABABABABABABABABA$18BDFB2FB2FBFBF2B3F2B2F2B2F5BF16BF 3B2F4BF4BF4BF5BF7BF4BFB2F4BF7BF9BF4B2F2BF9BF2BF5BF3BF3B2F3B6F3BF7B2F 2BFBFBF4BFB3FB3FB3F10B2F9BFBF10B2F2BF3BFBF3B2FB2F7BF3BF2BF6BF5BFBF3BF BF4BF4BF4BF2B2F17BF5BFBF3BD18B$BABABABABABABABABADABABAFAFABABABAFABA BABABAFABABAFABAFEBEBABEBABABAFEBABABAFABABEBAFABAFABABABABABABEBEFAB ABABABABABAFABAFABABABEBEBEBEBABABAFABABAFABABAFABABABAFEFEBEBAFABABA BABEBAFABABEBAFABAFEBEBAFABAFABABAFABABABABABAFABABABABEBABEBABEBABAF EFAFEFABEBABABEBAFEBEFABABAFEBAFEBABEBEBABEBABEBABAFABEFEFEBABABABEBA BEBABEBEBABABEBABABABABABABABABABABABCBABABABABABABABABA$18BDF6BF6BF 12B2F2BFBF2B2F6BF4B2FBF2B2F3BF2BF2BFB2F4BF4BF2BF6BF5B3F8BF6BF4B3FBF5B 2F4B3F12BF5BF2BF4BF2BF5BF19BF4B2F5B3F8BF7BF9BF2B2F2BFBFBFB2F2BF3B2F2B 2FB3FBF5BF4B2F5B2F11BF2BF5B2F2B3F5BFBF5BF2BF3BD18B$BABABABABABABABABA DABABABEFAFEBABEFEBEBABEFAFEFEBEFABABAFABABABEFABABABABABABEBABAFABAB ABEBAFABEBEBABABABEBABEFABAFABEBABAFABABAFABAFABABEFAFABAFEBEFEBAFAFA BABEBABABABEBABABABABABABAFAFABEBABEBABABEBABABABABAFABEBAFABAFAFAFEB EBABABABABEBABEBABAFABABABEBABABABABAFABABABAFAFABABEFEBABABABABEBEFE BAFABAFAFAFABABEBAFAFABABEBABABABABABABABABABEBEBAFABEBABCBABABABABAB ABABABA$18BD5BF4B3FBF2BF7B2F2BF5BF3BFBFBF2B2F3B2F7BF4BF3BF3BF2B3F5BF 2BFBF5BFBF2BF3BFB2F5BF2BFB3F4B2F2BF11BFBF3BF3B2F5B3FB2F2B2F5B3FBF12BF 14BFBFBF3B2FBF2BF6B2FBFBF3BF3BFB6F5B2FBFB2FB2F5B3F11BF8BF10BF2BFB3F5B F4BFBF5BF3BFD18B$BABABABABABABABABADEBEBABEBABEBEBABABABABEBAFABAFABE BABAFABABEBABABABEBABEBABABEBABAFEBAFAFEFAFABAFABEBEBAFABABABEBABABAB ABABABABABAFABAFAFAFEFEBABEBEBABABEBABABABEBABABABABEFABABABABAFAFABE BEBEBEFEFAFABABABABAFABAFEBABEBAFEFABABABEBEBEBABAFEFABAFABAFEBABEBEB EFAFABABAFEFEBABABAFABEBEBAFEBABAFAFABABABABABABABEBABABAFABEFEBAFEBA BABABABAFABABAFABABABAFCBABABABABABABABABA$18BD3B2FBF2BFBF2BF5BF8BF4B 2F2BF6BF6BFBFBFBFB3FB5F2B2FB2F4BF6BF3BF4B2F6B2FBF2BF2B2F7B3F10B2F9BF 6BF2B2F4B4FBF2BF6BFBFBF7BF7BF2B3F3B3F3BF2B2F7B2F2B3F3B2F7BF7BF4BF7BF 3B2F5BF2BFB2F10BF3BF2BFBF2B2F12BFBFBFBFBF3BFBD18B$BABABABABABABABABAD EBABAFAFABEBABAFABEFABAFABABEBEFAFAFEBEBEFABAFEBABABAFAFAFABEFABEBEFA FABEBABAFABABABEBABABABEBABABABABABABABEBABAFEBABEBABAFABEBABABAFABAB ABABAFAFEBABEBABABAFEBEBEBEBABABABAFABABEBEBABABABEBAFABABEBABEBABABE BEBABAFABABABEBEFAFABABABABEFABABEBABABAFABABAFEBAFABABAFEFEBEFEBEBEF ABABABEBABEBABAFEBEBABEFAFABAFEBEBABABABABABEFABABEFABABCBABABABABABA BABABA$18BDF2BF4B2F2BFB2F3BF4BF6B4F4B2F11BF2B2F2BFBF8BFBF6BFBF4BFBF6B F2BF7BF2BF6BFBFBF2BF3BF9B3F9BFB3F2BF4BF4BFB4FBF3BF5B3F2BF3BF4BF3BF2BF 2BF2BF2BFBF20BF8BF7B2F2BF4B2FB2F5BF4BF12BF3BF5B2FB2FB2FB2FBF3BF15BD 18B$BABABABABABABABABADABEFABAFABAFAFAFABABABABABEFABABABAFABABEBAFAB ABEBEFAFABAFABEFEBABABAFABABEFABAFABEBABABEFAFABABEBEBABEBABABABABEFA FAFABABABABEFEBEBABEBABAFABEBAFABABABABABEFAFABABABABAFEBEBEBABEBAFEB ABEBEFABEBABABEBABEBABABABABEFABABABEFABABABAFEBABABAFEBEBABABAFABABA BABEBABABEFAFEBABABABEBABABAFABEBEBABAFABABABABABEBABABABABABABEBABEB ABABEBABABCBABABABABABABABABA$18BD6B2F4BF3B2FBF6BF2BFBFBF3BFBFBFBF2BF 4BFB2FBF2BFBF4B2F2BF2B2F3BF7B3F3BF9B2FB2FB2F2BF14B4F5BF4BF2BF2BF3BF9B F2B4F5BFB2FBF4BF2BFB2FBF5B2FB2F10BF2BF10B2F4B2F4B3F4BF18B2F6BFBF2BF9B F4BFBF3BF9BF3BF5BFB2F2BF4BF2BD18B$BABABABABABABABABADABEBEFAFAFABABAB EBEBABEBABABEBEBAFABABEBABEBEBABEBABABAFABABAFAFEFABABABABEBEBABABEBE FEFEFEBABEBABABEBEFAFABAFABAFABABEBABABABAFEFAFABEBABEBABAFABABAFABAB EFABABEBAFEBABABEBEBAFABABAFABEFEBABABAFABEFABABABEBABABAFEBABEBEBABA BAFABEBAFABEBABAFABAFEBABAFEBEFEBABEBABABABABABEFABEFABEBEFAFEFABEFEB ABABAFEBABEBABABEBEBABEBAFEBABABABEBEBEBCBABABABABABABABABA$18BD3B2F 3BF11BFBF4BFBF7BF6BFBF5B2F6BF4BF2BFBF10BF3BF2BF15B3F4BFBF2BFB3FBFBF3B FB2F3BF3BF2B2F4BF2BF2BF13B2F6BF8BFBF2B3F2B2F3BF6B2F8BF8BF5BFBF2BF2BF 4BF3B2F11B3F7BF4BF2BF7BF9BF5BFB2F2BF4B2FBF2B2F2B3F2B2FD18B$BABABABABA BABABABADEBABAFABAFABABAFAFABABABABABABABABAFEBAFABEBABABABABAFEBEBAF AFABAFABAFABABEBABAFABEBAFABEBABABAFABABAFABEFABAFABAFEBAFEBEBABEBABA BEBABABAFABABAFAFABEBABEFABABEBABABAFEBABEFABABABEBABEBEBEBEBABEBAFAB ABABABEFABABABABABAFEBABAFABABABABABAFAFABABAFEBAFAFEBABAFEBABEBEBABA BABEFABABABABABAFEBABAFABAFABABABABABABABABABEBAFABEBEFABABABAFABCBAB ABABABABABABABA$18BD4BFBF5BF2BFBFB2F5B2F6BF4BF2B2F8B4F2B4FBF2B2F4B2F 3BF6BF7BF4BF4BF5BFBF2BF9BFBF3BF2BF4BF2BF2BF3B3F4BF6BF2BF5B2F4BF6BFB3F BFBFBF11B2F4BF3BF5B3F3B2F4B2F3BF4B2F2BF8B3F2BF6BFBF6BF2BF7BF3BFBF4BF 3BFBF9BF6B2FB2F3BFBD18B$BABABABABABABABABADAFEFABAFAFABEFAFABEBEBEBAB ABABAFABEFABABEBABAFEBABABEBABEBEBEBEBABABAFABEBABABABABEBABABEBABEBE FABABABEBABAFABABEBEBEBABABEFABABABABAFABEBABEBABABABEBEBEBABEFABAFAB AFABAFAFABEFABAFEFABABABABABABABAFABABABABABABABEFEBABEFEBABABABABABE FEBABABAFABABABABABABEBABEBAFEBABEBABEBEBAFEFABAFEBAFABABEBABEFEBAFAB AFAFABEBAFEBABABABEBABABAFABABCBABABABABABABABABA$18BDF4BF8BFBF19BFBF 2B2F5BFB2FB2F3BF3BF3BF9BF5BF2BF5BF6BF6B2F3BF4B2F7BF5BF2BFBFBF2B2F11BF 2BFBFBFB2F6BF2B2F2BF2BFB2F3B2F8BF7BF3BF3BFBF5BFBF3BFB3F5BFBF7BF3BF7BF 2BF16BF3BF5B2F4B2F2B2F5BF5BF9BF3BF4BFD18B$BABABABABABABABABADAFABEBAB ABEBABABEBEBABEBABEBABAFABAFABAFABEFABABABEBABABEBAFABABABABABAFABEFA BABABABABEBAFABABABABEBABABAFABEBABABEBABEBEBABABEBEFEFABEBEBABEBEFAB ABAFABEBABEFAFABABAFABABEBAFABAFEBEBEFABEBABABAFABEBEBAFAFABABEBABABA BAFABAFEBABABABAFEBEFABAFABABEBABABABABABEBEFAFEBABABABAFAFABEFEBABAB AFAFABABABABEBEBABABAFEBAFEBEBEBAFABABEBAFABABABCBABABABABABABABABA$ 18BDB3FBF10BFBF2B2F3BF7BFBF5BF2B3F3BF13BF3B4F2BF3BFBFB2F2BF9BF16BF2B 2F4BF3BFBFBF8BF4BF9BF3BF4BF3B2FBFB2FBF2BF3BF5BFBF2BF3BFBF3BF2B5FBFB2F 3B2F3BF2B2F6BF2BF2BF7BF3BF2BF5BF7BFB3F4BF2BF10B2FBF2B3FBFB2F12BF6BF4B D18B$BABABABABABABABABADABABABABEFABAFABAFEBABABAFEBAFEFABABEBABABABE BAFABABABABABEBABABABEBEBABABABABEBEBABABAFABABEFABABEBABABABEBABABAB EBABABABABEBABABABEBEBABEFABABABABAFAFAFEBABABAFABEBABAFEBABABABABEBE BABABABEBABABAFEBEBABABABEFAFABABEBABEFABABABAFABABABABABABABABEBABAF ABEBAFEBEFAFEBEBEBABAFAFEFAFAFEBABABAFAFEBABEBEFAFAFEFABEBABABEBEBEBA BABABAFAFEBCBABABABABABABABABA$18BDF3BF4BFB2F6BF7BF6BFBF2BFBFBF7BFB2F 3BFBFBFBF2B2FB2F3B2F4B2F4BF8B2F5BF7BFBF4BFBFBF2BF2BF3BF2BF2BF2BF2BFBF BFB2F4BFBF3BFBF3B2FBF2BF6BF6BF3B2F3B5F2BFBFB2FBFBF3B3F2BF5B2F3BFBF7B 2FBFBFBF5BF3BFBF7BF6BF3B2FBF2BFB3F4B2F5B2F3B2F2BF2BF7BF8BD18B$BABABAB ABABABABABADEBABEBABAFAFABABABABAFEBABABEFAFABABEBAFEBAFABEBABABABAFA BEFEBAFABABABEFABABEFABEBAFAFAFABEBAFAFEBABEBAFABAFAFABEFEBABEBEBABAF ABEBABABABEBABAFABAFABAFAFABABABAFABABABAFABABABABEBABABABABABEFABABA BEBAFABABEBABAFEBEBABEBABABEBABAFABEFABEFABABABEBAFAFEFABABAFABABEBAB EBAFABEFABABABABAFEBEFAFEBEFABABABEFEBABABABEBAFABEBABEBEFEBABAFEBAFC BABABABABABABABABA$18BD3BFBF4BF2BF2B4FBF7BF2BF2BF2BF2BF5B2F2BFBF3BF5B FBF8BF3BF3BFBFBF15BFBF4BF5BF7B2F3BFB3F12BFBF3BF5BF6BF3BF12BFBF6BF6B2F 7BF2BF12B2F4BF3BF4BF12B2F14BF2BFB2F5BF8BF3BF4BF2B2F4BF2BF3BFBF3BF6BF 4BFBD18B$BABABABABABABABABADABABEBABEBEBABEFEBABEBAFEBABEFABEBAFABABA BABAFABABABABABABEBABABAFAFABAFABEBABABEFABABABAFAFEBEBEBAFEBEBAFAFAB ABABAFAFEBABEBABEBAFEFABEFABABABEBABABEFABABABABEBEBABABAFEBEBABEFABA FEBABABEFEFABABAFABABABAFABABABABEBABEBEBAFABAFEBEBEFEFAFABABEFAFABAB EBABABAFABAFEBAFAFABABABABEBABABABAFABABABAFAFEBABABEBABABABAFAFEBABA BABABABABABABABCBABABABABABABABABA$18BDBF2BF2B4F6BFBF4BF4B2FBF2BFBF2B 3F2B2F8BF3BF12B2F3BF4B2FB2F2BF98BF2BF4BF3B2F2BF4BF2BF2BF3BFBF2B3F7BFB F2B4FB2F13B2F13B2FBF2B2FB2F9BF7BF2B2F7BF3BF3BFBFBF5BD18B$BABABABABABA BABABADEBEBEFABABABABABAFABABEBABABEFABABABABABEBEBABEBAFABABAFABAFEB ABEBABAFAFABEBABEFAFABABAFABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABABEBABAB EBABABABAFAFABABABABAFABEBABABABAFEBEFABAFABABABABAFABAFEBABEFAFAFABE FABAFABEBEBABABEBABAFEBABEFEBABEBABABABEBAFABABEBABABEBAFABEBABCBABAB ABABABABABABA$18BD2BF2BF3B2F2BF3B2F10BF23B2F4B2FBF7BF5B2F2BF7B2F97BF 4BF3B2F5BF7BF6BFBF2BFBF3BF4BF6BF3B2FBF3BFBFBF4B2FB2F4B2F2BF2BF3B2F3BF 3B3F2B2FBF6BF2B2F3B4F2B3F8BFBD18B$BABABABABABABABABADEFAFEBABAFABABEB EBAFEBEBAFABAFABEBAFEFEBEBEFABAFABABABABABABABEBEBABAFAFAFEBEBABEBEBA BABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABEBABEBEBEFABAFABABEBEBAFEBABABA FABEBABEFABAFABAFEBAFEBABABEBAFEFABAFEFEBAFABABABEBABEBABABABABABABAB ABABEBABABEBABABABABABABAFAFEFABAFABAFAFCBABABABABABABABABA$18BDBF2BF 7BF2BF5BF2BF7B2FBF5B2F3BF2BF3B2F5BF3B2F3B3F2BFBF4B3F106BF15BFB2FB2F2B FBF7BF14BF2BF5BF5BF3BF4B2F3B2FB4FBF8B3F4BF4B2F2B2FBF13BF10BFBD18B$BAB ABABABABABABABADEFABAFABAFAFABABABEBEBEBAFABAFABABABABEBAFAFABAFABABA BABAFABABAFAFABEBABEBEBABEBABAFABABEBABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFE FABAFABABABAFEBABABEBEFEBABAFABABABABAFABAFEBABABAFAFEBABABABEFEBABAB EBABABEBEBEBABABEBEBEBEBABAFEBABAFABABEFEBAFAFEFABEFABABABABABABABAFA BAFCBABABABABABABABABA$18BDB2F2B2FBF15BF2B2FBF23BF3BF2BF9BF4BF3BF2BF 2BF2BF101BF6BFB2FBF6B2F3B2F13BFBF10BF2BFBF3BF4BF5BF2B3FBF2BF5BFBF6BFB 2FB3F2B2F4B2F2BF10B2F3BF5BFBD18B$BABABABABABABABABADABABAFABEBAFABEBA BABABABEBEBABAFABEBABABABAFABABAFABEBEFABEBEBEBABABAFEBEFABAFABABABEB ABAFEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABEFABEBABABAFABABEFABEBABABAFAF ABABABABABEBABEBABAFABABAFABAFAFABABEBABEBABEBEBABAFAFAFAFEFAFEBEFABA BABEBABABEFABABABABABAFAFEBAFAFABABABABCBABABABABABABABABA$18BDF3BF2B 2FBF2B3F2BF2B2F4B2FBF9B3F15B2F2BF5B2F11BF2BF102BF2BF2BF3BF5BF2BF10B2F BF16BF2B3F2BFBF2BF4B2FBFBF2B2F6BF3B2FBFBF7BFBFBFBF5B2FB3F4BFBF3BF4B2F BF2BFBF2BD18B$BABABABABABABABABADAFABAFEFABABABAFAFABEBAFEBABAFABAFAB EBEFAFEBAFABAFABEBEBABEBAFAFABABABAFABABEBABABABABABAFABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABAFEBAFABEFABABABEBABABABABAFAFABEBAFEFABABEFAFABEBABEBABE FABEFEBEBABAFABEBEBABEFEFEBAFAFABABEFEBEBEBABABABABAFAFABAFABABABABAF ABABABEBABABABEFEFABCBABABABABABABABABA$18BD16BF2BF3BF4BF6BF10B2F2B2F BF8BF2B2F9BF117BF2B4F8BF6BF2BF5BF10BF3BFBFBF5BF4BF2B2F5B2F3B2F7BF7BFB F3BF4BF8BFBFB2F5BF2BF2BF2B2FBFBD18B$BABABABABABABABABADABAFAFEBABABEB ABAFABEBAFABABAFEFABAFABABABAFAFEBABEBABAFEBABABABABEBABABEBABABABABA BABABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABEBAFABABAFABABABABABABEBAFABEFA BABABABAFABEFABABABABABABAFAFABEFABABEFABABABABABABEBEBABEBABEBAFABEB EBABABABEBEBEBABABABABAFABABEBEFABABABABEBCBABABABABABABABABA$18BDF3B F6B2F2BFB5F6B2FB2F6BFBFBF11B2FBF7B2F3B2F3B2FB5F4B3F101BF5BF6BF5BFB2FB F7BF3B2FBFBF4BFBF3BF2BF4B2F11B2F3BF5B2F10BFBFB3F4BFBF10BF7BFB2F7BFD 18B$BABABABABABABABABADABAFABAFEFABEFABEBABABABABAFAFAFEFEBABEFABEFAB ABAFAFABABABEBAFABEBEFABAFAFEFABABABEBEBABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABEBABEFABAFABABAFAFABEBABABEBABEFAFEBEBABAFAFABABABEBAFABABAFAFAFA BABEBABAFABEBABABABABABEFABABEBABEBABAFABEBEBEBABAFABEFEBABEFABEBEBAB ABABAFEBAFCBABABABABABABABABA$18BD2BF2BFB2F3BF6BFB2F2BF7BF2BF2B2FBFB 2F3BF5BF13BFBFBF11BF103BFB2F10B3F10BF5B2F4BF3BF2BF6BFBF2BFB2F3BF2BF4B F6BF3BFB3F2BFBFBF3BFBF2B2F3BF3BF11BF5BFBF3B3FB2FD18B$BABABABABABABABA BADEFABABABABABABABABEBABAFABABEBAFAFABEBAFAFEBABABABABEBABEFABAFEBAB AFABEBAFABEFEBABABEFEBAFEBABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABEBAFABAFABEFAB EBEBABABEBEBAFABABEBABAFABABABAFEBABAFAFEFABABABAFABAFABABABABEFABEBE BEFABABEBEBABABABAFEBABAFAFABEFABABABEBABABEBEFEFEBAFAFABAFCBABABABAB ABABABABA$18BD3BF31BFB2F6BF2BF2B2F4BFB3F10BF3BF10BFBF98BF2BF4BF2BF3BF 2B2FBF8BFB2F2BF3BF6BF8BFBF2B2F3BF4BF10BFBF6BF2BFBF8BF6BF5BFBF3B3FB2F 4B2F2BFBF3BD18B$BABABABABABABABABADAFEBAFEBEBABAFABABEBABABAFAFABAFAB ABEBAFAFAFEFEBAFABAFAFABAFEBABABEBABAFAFABABAFAFABABEBABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABEBAFABAFAFABABABAFABEBABABABABABEBEBAFEBAFABABABABEBA FABABABABEBABEBABABABAFABABAFEFABAFABABEFEFABABEFABABABABEBABAFABAFEB EBABABABAFABABEBEBABEFCBABABABABABABABABA$18BD3BF2BF2BF4BFBF3BFB2FBF 9BF8BF4BF3BF9BF2BF3BF3B3FBF4BF4B3F99BF10BF4B2F6BFB3F2B2FBF2BF3BF6B2F 2BF6BF15B2F3BFBFBF6BF4B6F2B3F4BF2BF3B2F2BF5BFBF10BFD18B$BABABABABABAB ABABADEBABABAFABAFEBABABABABABABABEBABAFABABABABAFAFEBABEFABEBABABEBA BABABABEBEBABAFAFABEFABAFABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABAFABEBAFAFEBEBA BEBABAFABABABAFAFABABEBABAFABAFEBEBABABAFABABAFABEBEBEBAFAFAFABABABAB ABABAFEBEFAFABEFAFABEFABAFABABABABEBABABEFAFEBABABAFABABABABABCBABABA BABABABABABA$18BDFBFBF4BFB2F3BF4BF5B2FBF4BF5BF2BF7BF6BF2BFBFBF6BFBF2B F6BFBFBF98B2F9BF3B2FBF2BFBF14BF7BF13BFBF2BF7B2F7BF3BF3BF5BF8B3F4BFB2F BF4B3F3BF2BFBF2B2FBFBF2BD18B$BABABABABABABABABADABAFAFEBEBAFEBABABABA BABABABABABABABABEFABAFABABABABABEBABAFABEBEBEFABABABABEBABAFEBEBABAB EBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABAFEBEBABABEBAFAFAFABABEBABABABABEBABABABAB ABEBAFAFEBABAFABABABAFEBAFABAFABABABABABABEBABABABABEFAFABABABEFABABA BEBABEBEFEBABABABAFAFEBABEBAFABEFABCBABABABABABABABABA$18BD2F3BF3BF6B F3BF2BFB3F3B4FB2FBF5BF4B5F2B2FB2F6BF9B4F4B2F100B2F3BFBF2BFBF4B7F11B3F 2BFBFB2F2BF4B2F7BF2B2F2B3F9BF6B2F8BF2BFBF3BF6BF9B2FBFBF10BFBFBD18B$BA BABABABABABABABADABABAFEBABABABAFABABEBEBABAFEFEFABEBABABABABEBABABAF EBABABEBABABEBABABAFAFEBABAFEBABABABAFABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAF AFABABEBABEBEBABABABAFAFAFEFAFAFABABABABABEFEBABEBABAFABABABABABEFABA BABABABAFAFABABAFAFABEBABABABABABABAFEBEBEFABAFAFABABEFABABABAFEBEBEF AFAFCBABABABABABABABABA$18BDBF12BF3BF2BF3BF10BFBF4BFBF3BFBF2B3FBF9BFB 2FBF4BF6B3FBF97BFBFBF6BF4BF2B2FBF3BF5BF8B2F2BF2BF6B2F2B2F2BFBFB2FB2F 2BF6BF2BFBFB2F8BF3BF4B3F7BF7BF5B3F2B3F5BFD18B$BABABABABABABABABADEBAB ABABABABAFABEBEBEBABEBAFEFAFABABEFABABABEBEBABABABAFABABAFABEFAFEBABA BABEFABAFABEBABEBABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABEBEBABEBABABAFABABA BEFEBABABAFABABEBAFEBEFEBABABABEFEBABEFEFEBABABAFEBABABAFABEFABAFEBAF ABEBAFABEFAFAFABABAFABABAFABAFEBABAFABABABAFABEFEFEBCBABABABABABABABA BA$18BD5BF2BF15B2FBFBF3BFBF7BF2B2F4BF3B3FBF4B2FB4FBF2BF3BF6B2FBF100BF 5BF2B4F6BFBF7BFBF2BFBF5BF9BF4BFB4F3BFBF2B2FBFBF3BF5BF3BF2BF3BF2B3F2BF 2B2F3BFBF7B4F9BF4BD18B$BABABABABABABABABADAFEFEBABABABABABEBABEFABABE BABABEBABABEBABAFABABABEBAFABEBABEBEFABABEFABABABEBAFEBABEBEBABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABAFABABABABAFABABABABABABAFEFAFABABAFAB AFABABEFEBABAFAFABABAFABEFABEBAFAFAFABEBAFABEBEBEBEBAFABAFABABEBEBABA FABABABABABABABEBEBABAFAFABABCBABABABABABABABABA$18BD7BF6BF7BFBFBF2BF 8BF6B2F2BF2B3F2BF11BF3BFBFBF3B2FBF3BF98BF3BF8BFBF6BFB2F6BF4B2F5BF9B3F 8B3FBF2B3FB2FBF2B2F8BF9BF6B4F4BF6B2F6BF3BF2BF4BFD18B$BABABABABABABABA BADAFABABEBABAFABEBABABABEFAFABABAFAFABABAFABAFEBABABABABABABABEFABAF EBEFABABABAFEBEBABABABABEBABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABAFABAFABAFABAB ABABEFAFABABABABEBAFEFEBEBABABABAFAFABAFABABABABABABABAFAFAFEBEBAFAFA BABABABAFABABEBEFABEBEBEBEBABABAFABAFABABABEBEBABABEBEFABABCBABABABAB ABABABABA$18BDFB3F5BF3BFBFBF2BFBF10BFBFBF2BF11BF2B2FBFBF6BF2BF4BF4B2F BF103B2F5BF2BFBF3BF2BF3BF2BFBFBF6BF10B2FB3FBFBF4BF2BF9BF7B2F5BF5B2F3B FBFBF2B2FBF2B2F4B2F9BFBF4B3F3BD18B$BABABABABABABABABADABABABEFAFABABA BAFABABABAFEFEBAFABEBABAFAFABABABABAFABABABABABEBABABABEFAFABEFABABAB EBABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABAFABABEBABAFAFEBAFABAFEFEBEFABABEFAB AFABABEFAFEBABABABEBEBABEFEBEFAFEBEBEBEFABEBABABEBEFABEBAFABABABABABA FABABABABAFEBAFABEFEBABABEBEFEFEBEBEFEBABCBABABABABABABABABA$18BD2FBF 2B2FB3F2B2F8B2F5BF2BFBF3BFB2F2B5F9BF3B2F2BF5BF3BF5BFBFBF105BF4B2F11BF B2F3BF4BFBF2BFB2FBFB2F3B3FB5F3BF3B2F3BF3BF3BF2B2F4B2F3BFB2F12BF5BFBF 4BF3BF3BF6BFBFBD18B$BABABABABABABABABADABAFEBABABABABABABEBAFABEBABEB EBABABABEBEBABAFEBEBEBABABAFAFABEBEBABEBABABEBAFABABEBABABAFEBABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABEBEBEFABAFEBABEBABAFABAFEBEBABEFABEBEFABEBEBEBAFA BABAFAFEFAFABABABABEFABABEBEBABEBABABAFABABABABEBEBABAFABEBABABABABAF ABEBAFABEFABABAFEBAFABEFABCBABABABABABABABABA$18BD2BFBF5BF3B2FB2F3BF 2B2F3B2F2BF6BFBF7BF9BF3BF2B2F10BF4BF102BFB2F8BF3BF3BF3BF4B2F3BF12BF8B FBFB3F3BFBF3BFB2F4BFBF2BF4BF4BF6BFBF8BF2BF3B2F4BFB2F2BF4BF6BD18B$BABA BABABABABABABADABABABABAFAFABABAFEBEBEFABAFABAFABEBABABEFABEBEFAFEBAF AFABEBABABABABEBAFAFEFEFEBABEFABABEBABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAFABAF ABABABABABABABABABEFABEBABABABABABABAFAFEBEBEBABABAFABABABEFAFAFABABA FABAFABEBABAFAFABABABABAFAFABAFAFAFAFEFABEBAFAFABEBABABABAFEBABABEBAB AFCBABABABABABABABABA$18BD3BFBFBF3B2F3BFBFBF4BFBF2B2F3BF8BF3BF9BF9B2F 12BF7BF96B2FB2F3BF3BFB3FB2F24B2F2B2F9BF9BFB2F2BF6BF3BF7BF2B2F7B2F3B2F 4BF4B3FB2F2BFBFBFBF8BD18B$BABABABABABABABABADEBABEFABEBABABABEBEBABAB EFABEBABABABEFABEFAFABABABEBEBABAFABAFAFABABABEBEFABABAFABABAFABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABAFABABABABABABABABABEBABABEFABEBAFAFA FAFAFABABAFAFABAFEFABEBAFAFEFABABEBABEBABABABEBAFABABEBEBEBABABABABAB EBABAFEFAFABABABEBAFABEBABABEBABCBABABABABABABABABA$18BDBF4BFB2F2BFBF 2BF8B3F4BF2B4F3B2FBFBF3BF4B2F7BF4BFB3F4BF6BF101BF3BF3BF3B2FB2FB2F5BFB 2F4BF2B2F3BF16BFB2F2B2FB2F6BF6BF2BFB2FBF8BF8BF2B5F3BF3B3F10BF2B2F2BD 18B$BABABABABABABABABADABAFEBAFAFABABABABABABABEBABEBABAFABAFABABEBAF ABEBEBABABAFAFABABABABAFEFAFEBABEBAFABABABEBEBABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABAFAFABABEFABEFEBABABAFAFEBEBABEBEBABEFABEBAFEFABABEBABABABABAFEBEBA BABABAFABABABAFAFAFEBABABABAFEFAFABABEFABAFEBABABABABABABABABABAFABAB EFEFAFABABCBABABABABABABABABA$18BDBFBFBF2BF3BFBF3BF6BF16BF5BF3BF2BF7B 2F2BFBFB2F4BF4B2F4B2F101BF3B2F5BF8B3F2BFBF5BF4BF2B3F9BF7BF7BF9BFBF2B 2F3BF2BF5BF6B3FBF2BF2BF7BF6BF3BF3BF2BD18B$BABABABABABABABABADEBABABAB ABABABAFABABEFEFABAFABEBAFABEFABABEFAFAFABABEBABEBEBABABEBEFEBEBABABE BABABEBEBEBEBEBABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABEFEBABAFABEFAFABAFEBEBABE BEFAFABAFABEFABABEBABAFAFABABABABABEBABAFAFAFEBABABABEBABAFAFABABEFAB ABAFEBABAFABABABAFEBABABAFABABEBEBABEBEBABEBABABCBABABABABABABABABA$ 18BDB2FBFBF2B2F2BF3BF2BF3B3F7BF3B3FB2F2B2F4B3F3BF2BF2BF6B2F8B2F2B2F3B F108BF5BFBF10BF2BF2BFBF7BF4B2F3BF7BFBF5BFBFBF4BF3BFBF5B2F7BF5BF3B3F6B 3FB2F7BF9BD18B$BABABABABABABABABADAFABAFEBAFABABABABEBABEBABABAFABEFE BABABAFABABABEBABAFABEBAFABAFAFABEFEBABABEFABEBABABABABEBABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABEFAFAFAFEFABAFABAFEBABEFABEFABABEBAFAFABABEBEBAB EBAFABABAFABEFAFEBABABAFEBEFEBABEFAFEBABEBABEFABAFABABABABABABABABEBA BABAFABABABABEBABEBABCBABABABABABABABABA$18BD2BF4BF3BF2BFBF7BF2BFB2F 4BF3BF6BF7BFBFBF3B2F2BF2B3F2BF2BF6BFBFB2F97BF2BFB2F2B2FBFBFBF2BFBF4BF B2F24BFBF6BF2BF2B2F3BF13B2F2BF3BFBFBF4BF5BF10BFB2F3BF2BFBF4BF3BFBD18B $BABABABABABABABABADEFEBABAFEBEBEFEFEBAFAFABEBEBABEBABEBABABABAFEFABA BEBEBEBABAFAFABEBABABAFAFABEFABABAFABABEBABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA FAFABAFABAFABABEBAFAFABABABEBEBABAFEBABABAFEBAFAFAFABEBABEBABEBEFABAB ABABABABABABEBABABEBEBEBEBAFABABEBABABABAFABEBABEBABAFEFABABABABAFEBA FEBEFEBCBABABABABABABABABA$18BD4B3F3BF3BF7B2F2BFB2F8BF4BF2BF3BF2BF4B 2F2BFB2F13B3F4B3F104BF2BFBFBF2BFBFBF2BF3BF11B2FB3FBFBF3B2F4BFB2F2BF5B F3B2FBF8BFB2FBF4BF3BF2BF3BFBF2B2FB2F7BF2B2F2BF11BFBD18B$BABABABABABAB ABABADABABEBABABABABAFABABEBABABEFABABAFABABABABEBABABABAFABABABABABA BAFAFEBEBABABEFABABEBEFAFABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBEBABEBEBA BAFABABEFAFAFEBABAFEFAFABAFAFAFABAFEBABABABAFEBAFEBAFEBABEBEBABABABAF EFEFABEBAFEBABABEBAFAFEFEBABABABABABABEBABAFEBAFABABABABAFEFEBCBABABA BABABABABABA$18BD4B3FBF5BF3BF4BF4BF2BF3BF3BF4BFBFBF4B2F4BF3BF5B4F9B2F 6BF98B2F2BF3BFB2FBFBF3B2F4BF4BF11B2F2BFBFB2F2B3F9BF2B2F3BF3BF7BF2B2F 2BFBF8BF3B2F3BF2B4F4BFBF2BF5BF4BF2BD18B$BABABABABABABABABADABABEBABAB ABABEBABAFABAFEFAFEBAFABABABABABAFAFABABEFEBABEBABABEBABABAFEBEBAFEBE FABAFABEBABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABAFABABABAFABAFABABABAFEBABABAFA FEBEBABABABAFABAFABABABEFABABABABABEBABEBAFABABEBAFEBAFEFABABAFEBABAB AFEBABEBABEBABABABABABEBABABABABAFAFABABEBABAFCBABABABABABABABABA$18B D2BFBF5BF3BFBF7BFBFB3F9BF2BF8B2F6BF2BF2BF6B2F8BF3BF100BFB2F11BF6BF2BF 14BF2BF9BFBFBFBF5BFBF2BF3BFBF3BFBFB2F2BFB3F4BFBF6BFBF9BFBF3BFBFBF4BF 8BFBD18B$BABABABABABABABABADEFAFEBABABABABABEBAFABEBAFEBABEBEBABABABA FABABABABABABABABABABABEFABEBABABEBABABEFAFABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABAFABEBAFABABEBABABABAFABABEBAFABABABAFAFABABABABABABABAFABABAB ABABABABABABABABEBAFABEBABABAFABAFABABABABAFABEBABABEBABABABABEFABEBA BEFABEFEBABABAFCBABABABABABABABABA$18BD2BF3BFB2FBFBFB3FBF2BF2BFB2F2BF 6B2F3B2FBFBF3B2FBF2BF3BFBF5B2FBF2B2F6BFBF2BF100BF7BF2BF7BF3B2F3BF10BF 2B2F4BFBF5BF2BF6BF2BF5BF5BFBF2BF8BF3B2F7BF3BF8BF3BF2BF3B3F2BF4BD18B$B ABABABABABABABABADAFEBABEBABABEBABEBABABABABEBEBABEBEFABABABABABAFABA BAFABABEBABABABEBEFABAFABABABAFAFAFAFEBABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABE BEBEBAFEBABEBABAFABABABEBABAFEFEFABABABEBAFEBABABEFABAFAFABABABABABAB AFEBEBABABABEBABABABEBABABABAFABABABAFABABABAFAFAFABABEBAFAFABABAFEBA BABABCBABABABABABABABABA$18BD3BF5B3F8BF3BF12BFBF2BF5BF5BF3BF15BFBFBFB FBFBF104BF4BF3BF3BF6BF3BF4BF2BF3BF2BF2BFB3FBF9BFBFBF4BF22BF2BF4B4F5BF 2BF6BF2BF5B2F6BFBF3BFBFD18B$BABABABABABABABABADEBEFABAFAFABABABABABAB AFABABEBAFAFABEFAFEBABAFABABEBABEBEFABABABEBABAFEBABEFABEFABAFAFABABE BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABAFABABABAFAFEBEBABABABABEBEBAFABABABEBEBA BEBAFAFABABEBABEFEBEBABEBABAFAFEFAFAFABAFABEFABABEBABAFAFABABABABABAB EBABEFEBEBAFABABAFABEBABABABABEFEBCBABABABABABABABABA$18BD9BF7B3FBFBF 2BF6B2FBFB2FBF5B5F11BF4B2F5BF7BF4B3F109BF3BFBF3BFBFB2F3BF7BFBF10B3F8B FB3F2BF6BF3BFB2F4BF3BF7BF2B3F3B2FBFBF2BF4BF4BF3B2F6BF3BD18B$BABABABAB ABABABABADAFABAFAFAFABEFEFABABABABABAFAFABABAFEFABABABABABEFEBEBAFABA BABEFEBABABEBEBEBAFABAFEBABEBABEBABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBEBABEBA BABABEBAFABABAFABABABABABABABAFAFABABEBAFAFABEBAFABAFAFABABABAFEBEBAF ABAFABABEBABAFEBABAFABABEFABABAFABEFABABABABAFAFEFABABABEFEBABABABCBA BABABABABABABABA$18BDB4F5BFBFBF2BF8BF4BFB2FBF6BF3B2F2BFB3F2BF11BFBF5B F2BF2B2F121BF5BF2BFBFB2F2B2FBFBF2B2F4BF2BF4B2F8BF3BFB3F2B2F4B2F2BF3B 2F11BF4BF6BF2BFB2FB2FBF14BD18B$BABABABABABABABABADEBABABEBEBABABEBABA BABABAFEBEBEBAFAFABEBABEFEBEBEBABABABABABEBAFAFABABEBEBEBABAFABAFAFEF ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABAFABEBAFABABAFEBABABEBABABEBAFEBAFABAB EBAFEBABABABAFABABABABABABEBABABABAFEBEBEFEFEBAFEBABABABABABABEBAFABE BABEFABABAFABABEBABEFABEBAFEFABABABEBCBABABABABABABABABA$18BD4BF5B3F 3BF4BF2BF2BFB3F4BF6BFBF3BF2BF2BF2BF11B3F8B2F4BF100BFBF3BFBF2BFB2F3BF 4BF2B2F11BFBF3BF5B3F6B2F7B2F4BFB3F5BF3BF2BFBF2BFBF13BFBFBF3B2F10BF3B 2F2BFBFD18B$BABABABABABABABABADAFAFABABABAFEBEBABABABEBABABABABABABEF EBABAFEFABAFABEBABEFABABEBABEBABABAFABABEFAFEBABEBABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABAFEBABABABABABEBABAFEBABEBABABEFABABABEBEFABAFAFEBABABABE BAFABEBABABABEBABABABAFEBABABABEFEBAFABAFEFABABAFAFABAFABABAFABABABEB ABABABEBABEBABAFABCBABABABABABABABABA$18BDBF8BF3B5F2BF2BF2BFBFBFBFB2F 5BF7BF5BF7B2F3BF2B2F2B2F8B2F2BF98BF5BF3B2F6B3F4BF2BF5B2F5BF4BF2B5F5B 2F2BF3BF8BF2B2F3BF4BFBFBF4BF5BF13BF4BF2BF5BFBF6BFBD18B$BABABABABABABA BABADEFEBEFAFEBABEBAFEBABEBABAFAFAFAFAFABABAFABABAFABABABEBEBABEBABAB EBABEFABABAFABABABAFABAFEBABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBABAFABEF ABEBABABABABABABEBABEBAFABABEFAFABABABAFABABABEBEBABABEBABAFAFABAFAFA BABABABABEFABEBEBABABAFAFABABABABABABABABAFABABABABABABEBEBABCBABABAB ABABABABABA$18BDBF11BF11B2F4B3F4BF3BF4BF2BF2BFBF7B2F8BF2B2F5BF103B3F 5BF3BF2BF9BF4B3FBF10BFBFBF2BF6B2FB4F2BF5BF2B2FBF2BF4BFB3F9BF9BFBF3B2F B2F2BF2BFB2F2B3F7BFD18B$BABABABABABABABABADABAFEFABABABAFABABABAFABAF EBEBABEBABEBABAFABABABABABABABEBAFABAFABABABABABEBABABABEFEBEFEBABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABEBEFABABABABAFABABABABEBEBEBEFABEBEBABABAFABA BABABEBABABABEBABABABEBABAFEFAFABABEBAFEFABABABAFABABABABABABABEBAFAF ABABABABABEBABEBABABABABEBEBAFCBABABABABABABABABA$18BDBFBF5B2F2BF2B2F 4BF5BF2B2FBF2B2FBF5BF3BF5BFBF9BF2BF5BF4B3FBF102BF2BF7BFBF6BFBF4BF3BF 6BF4BF2B2F4BF5BF2BFB2F4BFB2FB2F5BF2BF10BFBF2BF2BFBF10B2F3BF9B3F3BF3B 2FD18B$BABABABABABABABABADEFAFABABAFABABABEBABABABAFAFABAFABEFABABAFE BABABABEBEBAFABABABEFABABABABAFABAFABABEBAFABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABEFEFABABABEBABABABABABABABEBABABABAFEBEBEBABEBAFEBABABABABABAB EFEBEBEFABAFEBAFABEBABAFABABEBEBABEBEBABEBEBAFEBAFABABEBEBABAFAFABABE FABABAFEBABABCBABABABABABABABABA$18BDBF4BF8BF6BF2BF2BFBF5BFBF8B3F3BF 2BFBF2B3F7BFBF2BFB2F4BF2BF99BF11BF5BF3BF7BFBF5BFB3F2B5FBF3BF3B2F3BFBF BF5BF9B2F3BFBF4BFB2F2BF3BFB3F2BF3BFB2F2B2F5B3F2B2F4BF3BD18B$BABABABAB ABABABABADABABABABABABEBAFAFABAFAFEFABAFEBEFEFEBABABABAFEBABEFABABABE BAFABABABABABABEBABEBEBABEBABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBEFA BAFEBABABABEFABABABEBABAFABABABABABABABABEBAFAFABAFEBABABEFABEBABABAF AFAFAFAFABAFABABABABABAFABABABABAFAFAFEBABABABABABEBAFABEFABAFEBABCBA BABABABABABABABA$18BDBFBF2BFB2FBF2BF4BFBF9B2F10BFB2F5BFBF3BFBFBF6BF2B FBFBFBF7B3FBF102BF2BF2B2F3B2F3BF7B2F4BFB5FBF3BF3BF6B3FB3F4B2F10BFBF2B F5BFBFBF5BF6BF7BFBFB2F2BF7B2FBF6BFD18B$BABABABABABABABABADEBABAFABEBA BABABABABABAFABEBABABAFABABAFEBAFABABAFEBEBABEBABEBABAFABEBABEBABABAF AFABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABEBABAFABABABEBEFEBAFEBABEBEBAF EBAFAFAFEFABAFABABABAFABAFABEBEBABABEBEBABAFEBABABAFABABEBABEBABABAFA BABABEBABABABABEBABABABAFABABABABABABABAFABAFCBABABABABABABABABA$18BD FBF4BF17BF3BFBFBF5BF5BF12BF3BF2BF4BF6BFB3F2BF2BF2BF98BFBF3B5F7B3F5BF 2B4FBF6BFB2FBFBF4BFB2FBFBFBF2BF5BF3BF7B2FB4F4B2FB2F2B3FB2F2B2F20B2F2B F4BFBFD18B$BABABABABABABABABADEFAFEBABEFAFAFABABAFABABAFABAFAFEBAFABE BEBABEBEBABEBABEBABABEBEBEBAFEBEFABABABAFABABABABEBABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABAFABABABEBABABABEBABEBABAFEBEFABEFAFEFABABAFAFABAFABABABAB ABABABEBABABEBAFABABABEBABABABEBABABABABEFEFEBEBEFEBEFABEFABEBABABABA BEBABABABABABAFABCBABABABABABABABABA$18BD2BF7B2FBF4B2F3BF6B2FBFBF4BF 4BF2BF3B3FBFBF2BFBF3BF2BFBF5BFBFB2F2BF109B2FBF2BF6BF7BF2BF2BF10BF3BF 4B2F4BF2BF2BF9BF5BF5BF4BFBF2B4FBF2BF5BFBF2BF2B2FBF3BFB2FBF8BFBD18B$BA BABABABABABABABADEFABABABABAFABEBEBABEBEFABAFEBAFABABABABAFAFEFABABAB EBAFEFEBABABABABABABAFABAFABABEBABAFAFABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEF EBAFEBEBABAFEFABABABABEFABEBABABABABABEFEFABAFABABABABABABEBAFABAFABA BEBEBABEBEFABEBAFEFABEBABEBABABABABEFABABABEBABABABAFAFEFAFEBABABABAB EFEFCBABABABABABABABABA$18BDFB2F3BF4BF6BF2BFBF11B2F4BFBF3B3F3BF2BF4BF 6B2F5B2F2BF2BFBFBF100BF4BFBF2B3F2B2F4B6F2BFB2FBFBF2BF2BF3BF3BF3B3FB6F 3BF7BF6B2FB3FB2F2BF2BF3B3F4B2F5BF2BF3BFBF3B3F2BF7BF3BD18B$BABABABABAB ABABABADAFAFABAFABAFAFABAFABEFABABEBABABAFEBABEBABABABAFABABABABABEFA FAFABABABABABABEFEBABEBEBABABEBABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABEBAFEBEBABA BEBEBABAFEFABABABABABABABABABABEFEBEFABAFAFAFABABEFABABABABAFAFABEBEB AFABAFAFABABABABEBABABABEBABABAFAFABABAFABABABEBEFABABABAFABABABCBABA BABABABABABABA$18BD2BFBF11B3F4B3F2B2F3B5FB2F2BFB2FBF3B2F2BF5BF2BF8BFB FBF4BFBF3B2F98BF6BF6BF5BFBF3BFBFBF5B3F2BF11BFBF11B2F8BF2BF3B3F4BF11BF BFBF2B3F2BFBF3BF2BF3B2F2BF4BF2B2FBD18B$BABABABABABABABABADABEBABABABA BABABAFAFEFABABEBABEBABABEFAFABABABABABEBEBAFAFABABABABABABEBABABABAB ABABEFABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABEFABABABEBABABABABABAFEBEFAB ABEFEBEBABABABABEBABEBABABABABABABEBAFABABABABEBABAFABABAFABAFABEBEBA BABAFABABAFEBABABABABAFABABEBABEBABEBABABEBEFCBABABABABABABABABA$18BD 3BFB3F2BF8BF5B2F9BF5B5F5BF2BFBF4B3FBF3BF5BF3BF3BF3BF99BF3B3FBFBF2B4F 2BFBFBF2BF4B2FBF5BFB4FBF4B2F3B2F3B3FBFBF3BF4BF3BFBF2B2FB2F3B3F6B4F5BF 9BF7BFBF2BFBF6BD18B$BABABABABABABABABADEBEFEBABABABABAFAFAFEBABEBAFEF AFEBABEFEBAFABEBABAFABEBEFABEBAFABABAFAFAFABEFABABEBEBEBABAFABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABAFEBEBAFAFAFABABAFEBABABEBAFABABEBEBEBABEBABABABE FABABABABEBABABABABABEBABABAFAFABAFABAFABEBEBABABABEBABEFEBABABABEBEB ABEBABEBABABEFABABAFABABAFCBABABABABABABABABA$18BD4BFBF2B2F2BFBFBF2BF 6B2FBF5B2FBFBFBF3BF2B2F7B2F2B2F7B2F3B2F9BF98BF2BF5BFBF4B3F3BFBF2BF4BF BF3BF6BF2BF4BF6BF10B2FB3FBF4BF3BF3BFBF2BF2BF2BF2BF2BF4BFBF3BF4BF2BF3B F4BF3BF2BFBD18B$BABABABABABABABABADEBABAFABABABEBABABABEBABABABEBABAB ABABEFEBABABAFEBABAFAFABABEBABABABABABABABEFEBAFAFABABABEBABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABAFEBABEBABABAFABABABABEBEBAFABABABABABABABAFABAFEBAFA FAFAFABABABABABEBAFABABAFEFEBAFABABEFEFAFABAFEFEBABAFAFEFAFEBABAFEFAB EBAFEBABABABAFAFEBABABCBABABABABABABABABA$18BDBF2BF3BFBF2BFBFBF3B2FBF 4BFBF2BF2BF3B2F7BF5B2F4BF3BF2BFBF5B3FBF105BFB2F3B2F3BF5BF2BFBF6B2F2BF 4BF2BF3B2F2BFBF3BF5BFB2F5BF3BF3BF3B3FB2F3BF7BF2BF3BF5BF5BF5BF3BF7BFBF 5BD18B$BABABABABABABABABADABABABABABABEBABEFEBAFEBEBAFABEFEFABABABAFA FEFEBEFAFAFABEBABAFABABABABABEFEBEBAFAFABABEBEBABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABAFEBAFABABEBAFABEBEBABABAFEFEFEFAFABEBABABAFABABAFEFABAFAFABEFAB ABABAFAFAFEBABABAFEBAFEBABABABABABEFABABEFAFABABEBABEFABABEBABEBABAFA BABEFABABEFAFCBABABABABABABABABA$18BDBFBF2B2F3BFB2F2BF2BF2BFBF2BFBF2B 2F3B2F10BF3B2FB3F3BF7B3FBF3BFBF108B2FBF6B3F5BF3BF3BFBF5B3F7BF3BFBF3BF 2BF2B2FBFBF5BF4B2F3BF3BFBF5BF2BF15BFBFBF14BFBFBF6BD18B$BABABABABABABA BABADEFAFAFEBABABEBABEBEFEBABEBABABABABABABABABEBABEBAFABEBABEBABABAB EBAFAFABABEBABEBABEBEFABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABAFAFABABABABABEB ABABAFAFABABAFAFEBABABAFAFAFAFABABABEBABAFEBABABEBEFEFABABAFABAFAFEBE BABABABEBABAFEBABABABAFAFABAFABABABAFEFAFABEBABABABAFABAFABEFCBABABAB ABABABABABA$18BD8BFBF3BF2BFBF2BF2BFBFBF2B3FBF9B2F2B2F4B2F3BF10BF2BF2B 2F8BF99B2FBF3BF2B2F6BFB2F3BF2BFBFBFB2F2BF7BF4BFB2F3BF3B2FBF5BF13BFB2F 5BF3BF2BFB2FBF7B2F5BFB2F2BFBF4BF4B2F3BD18B$BABABABABABABABABADABABABA BEBABABABAFABABABEFABABABABABEFABABEFABABABEFAFAFAFABAFABABABABABABAB ABEFABABABEBABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABEBABABAFABAFABAFABEFABEBAB ABEBABEFEBEFAFEBAFEBAFEFABAFABAFEFABABEBABABAFEBEFAFEFABAFABAFABEFABA BEBEFEBEBABABAFEFEBABAFABEBABAFABABAFABABABABABABCBABABABABABABABABA$ 18BDF10BF3BF3B3F3B2F3B4F6BFBFB2FB2FBF4B5F12BF7BF7BF98BF4BF4B3F6BF2BF 3BF9BFBF8BF2BFBFBF4BFB2F5B2F3BF7BF5B2FBFB2F4BF4BFBF10B3FB2F6B2FBFBF 11BD18B$BABABABABABABABABADABABABEFEBEBAFABABAFAFEBABEBABAFAFABAFEBEF AFABABEBEFEFAFAFEBABAFAFABEBABEBAFEBABEBEBABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABEBEBABABABAFABEBAFABAFEBABAFEBABABABEFABAFEBEBAFABABABAFABA BABABABABABEBEFAFABEBEFABEBAFAFEBABABEBABAFABEBABEBABEFABEBABABABAFEF ABAFEBEBABABABCBABABABABABABABABA$18BDB2F3BF2BF6BF9B2F6BF4B2FBF4BF3BF 3BFBF2B2FBF6BFB2F3B2FB2F3BF4BF2BF4B2F3BF2BF4B2F11B3F4BFBF2BF4BFBF2B2F 8B2F3BF3BFBF2BF5BFBF4BFBF4BF6B2FBF6BFBF2BFBFBFBF2BF6BF7BF2BF4B2F13B3F 4BF6B4F6BF2BF4B2F11BF2B2FB2F2B2F4BFBF3B2F4BD18B$BABABABABABABABABADAB AFEFAFAFAFABABABABABABAFABAFEBABABEBAFEFAFEFEBABABABABEBAFEBABAFEBAFA BEBABABAFABEBAFABABABABEBABABEBEBABEBABEBABABABEBEBEBAFABABABABEFEBAF EFABEFEBEBEBABEBABABEBABAFEBABABAFABAFABABAFABAFAFEBAFEBAFAFEBEFEFABA BEBABABAFABABABEFEFAFABABAFABAFABABEBABABABABEFEBABABEBEBAFAFABABABAB AFABABABEBEBABABAFEBAFAFEBAFAFABABAFAFAFABABABABEBABEBCBABABABABABABA BABA$18BD6BFBF3B3F8BF2B2F4B2F4B3F2BF3BF3BF2BF3BFBF3BF2BFBF3B4F7BF2BF 2BF2BFBF3BF2BF9BF10BFBFB3F2BF16BF4B2FBFB2F2BF6BF9BF5BF3BF2BF22BF2BFB 2F2B2F7BF7BF5BF2BFBFBF8B2FBF3B2FBFB3F11BFBF6BF4BF5B2F8B2F6BF2BFD18B$B ABABABABABABABABADAFAFEBAFABABAFEBAFAFABAFAFABEBEFAFABABEBABEBEBABABA BABEFABAFABABEFEBABEFABABABEBABEBABAFABEBABABABABABABEBABAFABEBAFAFAB EBEBAFABABABABABABAFAFABABABABEBABABEBABAFABABAFABABAFABAFEBEBEFABAFE BABABAFEBAFAFABAFABABABEFABAFEBAFABABEBABABEFAFABAFABABAFAFEBEFAFABEB ABABABABABABAFAFEBEBEFEFABEFABABABEBEFABEBABABABABEBAFABEBAFEFEBABAFA BEBABCBABABABABABABABABA$18BDFB2F9BF3B5F3BFB2F4B3F2B2F8BFBF3BF2BF2BF 3BF4BFB3F6BFBF10BF12B2F4BF3B3F3BFBF14BFBF4BF6B2F3BF3BF3BF4BFBF2BF3BF 2BF4BFBFBF7BFBFBF3BFBF3BF4BF2B2F3BF11BF2BFBF2BFBFBFBF3B2F5BF2BF2BFBF 6B2FBF3BFBF4BFBFB2F2BF2BF9BF3BFBF3BF5BFBD18B$BABABABABABABABABADABABA BABAFABEBAFABAFABEBABABABEBEBABEBABEFEFABAFABEFABABABAFABABAFABEBABAB AFEBABABAFABEFABABABAFABEBABEFEFABABABEFABABAFABABEBABABEBABABEBABEFE BABAFEBABABEFABABABEBABAFABABAFABABABEBEFABABABABAFEBABABABEBEBAFAFEF EBABAFABAFAFAFAFABABABABAFEBABEBABAFAFABEFABABABABEBABEBAFABEBEBABAFA BEFAFABABEBABAFAFABAFEFEFABEBABABAFEBEBABAFEFABEFAFCBABABABABABABABAB A$18BD4BF2BFBF6BF2BFBF4B2FB3F2BF2BFBF3BF5B2FB2FB2F2B2FBF2B2F3BF6BF5B 4F3BF6BF4BF5B2F4B3FBFB4F2BF9BFBF7BF2BF4BFBF2B2F5BF2BF2BF2B2F2BF3BF2B 2F2BF3B2F2BFB2F2BF5B2F13B2F4BF2B2F3BF4BF9BF4BF2BF2BF10BF7B2F7BFBFBF3B F4BF2B2F7BF13BD18B$BABABABABABABABABADEFAFABABEBAFAFAFABAFABEBAFAFABA FABAFABAFABABABABABAFEBABEFABEBABABEBABABABEFABABEFABABEBABEBEBABEBAB AFEBABAFABEBABABEBABEBABABABAFAFABAFEFAFABABABEBABABEBABAFEBAFABABAFA BAFABEBABEBABABAFABABABABEBEFEBABAFAFABEFAFAFABABEFAFAFABABABEBABABEF ABABABAFEFABAFABABEBABEBEBABAFABAFEBAFABEBABABABEFABEBAFAFEBABAFAFABA BEBABEFAFAFABEBAFEBAFABAFCBABABABABABABABABA$18BD3BFBF2B2FBFBF6BF3BF 5BFBF5BF8B2F4BF4B3F4BF2B2F3BF3B4F2BF3B2FB2F2BFB6F6B2F6BF4B3F2BF2BF2BF BF4B2FB2FB3FBF5BFBF2BFBFBF4B2F9BF3BF6BF2BF3B2F2B2FBFBF7BF6BF5BF3B2F8B FB3FB2F3BF2B2FBF3B3F6BF3BFBF6BFBF2BF2B2F2BF10BFB2F3BF4BF3B4F3BFD18B$B ABABABABABABABABADEBEBAFEBEBEFABEBEBABEBABABAFABEBABABEBABEFEBABEFAFE BABEFEFAFEFEBABABAFABABEBEBABABEFEFEBABEFABABABABABEBEFABEFEBABABEBAF ABEBABABAFABEFAFAFABABABABEFABAFEFAFABAFEBABABEBABABABABAFABABAFEBAFA BAFABAFABEBABABEBABEFABAFEBABAFEBEBAFAFABABAFABABAFABEBABABEBABAFABEB EBAFAFEBAFAFABABEBEBABEBAFAFABEBABEBABABABABABEBEBABEBABEFABEBABABEBA BEFABCBABABABABABABABABA$18BD6B3F2BF6BF11BF4BFBF12B3F3BFB2FBFBF2BF7BF BF5BFBF3BF2BF2B2F2B2F6BF6B2F4BFBF4BF6BFB2FBF3BF4BF7BF2BFBF3BF5B2FB2FB 2F4BF3BFB3FBF6BF5B2F3BF5BF2BFBF3B2FBF7BF6BF2BFB2FBF3BFB2F9BF2BFBF2BF 2B2FBF3B4F3BF2BF3BF2BFBFB4F6BF4B4F6BD18B$BABABABABABABABABADABAFABABA BEBABEFABAFABABEBABABAFABEFABABAFABAFEBABABAFEBAFABEBAFABAFABAFEBABAF ABABEFABEFAFABABEBABEBAFABEBABABAFAFEBAFEFEFABAFABABEBEBABABAFAFAFABA BAFABEBEBAFAFAFAFEBABABABABABABAFEFABEBABEBEFABABABABABABABABABAFABAF ABABABEBABEFABABAFEBAFABABEFABABABEBAFEBEFAFABABEBABAFABABABABABABABA BABAFABABEBABAFEBEBAFABEBEBEBABAFEBAFABABABEFAFCBABABABABABABABABA$ 18BDFBFBF6B2F4BF2BF4B2F6B2F2BF6BF4BFBFBF2B2F4BFBF5B2FB2F2BF3BF5BF3B2F 2BF3B3FBF5BF4B2FBFBF4BF4B2F4B3F2BF2BF7BFBF5BF3BFBF3B2F7BF2B4FBF9BFBF 5BF3BF5BF7B2FBF2B2F4B2FBFBF3B2F4B2F5BFBF2BF3BF2BF3BF7BF2BF2BFBF2BF2BF B2F2B2F2B2FB2F2B2FBFB2F6BFBFBFB2FD18B$BABABABABABABABABADABEBABABABAF AFABABABEBAFABAFEBAFEBABABEFEBEBAFABAFABEFEBEBABABEBEFAFAFABEBABAFABE BABABEBABABABEFEBEBABAFAFEBABABEBAFAFABEBEBABABABABABABEFABEBABABEBAB ABABABABAFABABEBEFAFEBAFABABAFEBABEFABABABABEBABABEFABEBABABEBEBABABE BEBABABABABEBABAFABABABEBABAFABAFEBABABAFABABABABABEBABEBABAFABABABAF ABABEFABEBABAFEFAFABABAFABEBEBABABAFABABABAFCBABABABABABABABABA$18BDF 6BF5BF3B2FBFB3FBF2B2F4B2F4BF2BF5B2F3BF5B4F2B2FBF8BF6BF4BF2BF2BF2BF21B 2F2BF4BFB2FB2FBFBFBF2B2F4BF13B2F5BF4B3FBF5B2F6BF5BF2B6F4B2FBF5B2F2BF 3BF5B3FB2F3B4F2BF5BF2BF6BF2BFBFBF5BFB2F5BF2BF3BF2BF8BF7BF2BF4BF2B2FBD 18B$BABABABABABABABABADEBABABABABABABABAFEBABABEBABEBABAFABEBABEBEBEB ABABEBABEBAFABABAFABEBABEBAFABABABAFEBAFAFEBABABABABEBABEBAFEBABEFABE FABEBABEBABAFEBEBABAFEBEBAFAFABEBABAFEBEBABAFABABAFAFEBABEFABEBABAFEB ABEBEFAFAFAFABABEBABEBABEBEBABABABABABEBABEBABEBABEBAFEBABABEFABEBABE BABEBABAFABABABABAFABABABEFABABABABABABEBABABABABABAFAFAFEBAFEBABABEB ABEBEBABABCBABABABABABABABABA$18BD3F5BF2BF2B2FB2FBFBF9B2F4B2F6B3FBF8B F4B2FBF3B4F6BFBFBF2BF4BF9BFB2F5B3F2BF2B5FBF4B2F2BF10BF2BF4B2F2BF4B3F 9B3FB2F2B2F3BFB2F8BFBFBFBF4BF2BF9BF6B2F3B3FBF3BF6BF5B3FBFBFB2FBFB2F3B F2BFBFBF2BF7BF3BFBFB2FBFBF4B2F11BFBF2BFBFD18B$BABABABABABABABABADABEB ABABABEBAFABABABABEBABABABABEBABEBABAFABABAFABEBAFEFABABEBABEBABABABA BABEFEBEBABAFABABEFABABEBAFABABEBABABABEBABABAFABABAFABAFABEFABEBEFEB ABAFAFABABABABEFABABABAFABABABAFABEBABABEFAFEBABABEBABAFEBAFABABABABE BEBAFEBABABABEBEFABAFEBEBABEFABABABABAFEFABAFAFABABAFABABABAFABABABAB ABEBEBABEFABABABABABABAFEFABABEBAFAFABAFEFABABABEFEFCBABABABABABABABA BA$18BD4BFBF4BF8BF3BF2BF2BF2BF3BF3BF5BFBF6B4F6BF4BF2BF4B3F2BF8BF3BF 17BFBF2BF7BF5BF2BF9BF10B2F4BFBFB3F2B2F2BF3BFB2F3BF11BFBFBFBF6BF3BF7B 3F2BFB4F7B4FBF3BFBFBF3B2FBF2BF3BF3BFBF3BFBF4BF6BF2BF7BF3BF4B2F3B2F4BF 4B2FD18B$BABABABABABABABABADAFABABABABEFAFABEBABEFABAFABAFABABAFAFABA FAFABAFABAFEFAFABAFEBABEBEBAFABABEBABABABEBEFABAFEBABABEBABEBEBEFABEF EBABABEBABABABABEBEFAFABABEBAFABEFABABABABABABEBABABEBEBAFABEFAFEBABA BABABABEFABEBAFAFABABABABEBAFEFEBABEBABABAFAFEBEFABABEBEBABABAFEBABAB ABABEFEBAFAFABEBEBABABEBABEBEBABAFAFABAFEBABAFAFABEBABABABAFABEBABABA BAFABEFEFABABABCBABABABABABABABABA$18BDBF3BF6BFBFB2FBFBF5BFB2FB3F11B 2F10BF4BF4B4F2B2F3B3F6B3F3BF12BFB3F4BFBF2BF6BFBF4BFB2F2BFBFBF2BF3B3F 8B3FBF9BFBF8B5FB2F3BF4BF3BFB2F14BF2BF2BF4B2F2B4F5BF3B3FBFBF2B2F8B2F2B FBF4BFBFBF3BF5BF2BFBF2BF3BFB2F5B2F3BFBF2BF2BD18B$BABABABABABABABABADA BABABEFEFABEFABEBABEFAFABABEBAFABAFEBEBABABABAFAFABEBEBEFABEBABAFABAF ABABABAFEBEBAFAFAFABABEBABAFABEBABEFEBABABABEBEFABAFABABABAFABABABABE FABEBABABABABABEBABAFABABABABABABABEBABABEFEBABABAFABEBABABEBAFABABEB ABABABABABAFABEFEBABABABABAFABEFABAFEBEBAFEBABEBABABABAFEBEBEFABABAFA BABABABAFABABEBABABABABEFAFABABABABAFEFEFEFEFABEFEBAFEFCBABABABABABAB ABABA$18BD5BF14B2FBF6BF2BF9B3F5BF3BF2B3F2BF3BF4BFBFBFBFB2FBF2BF3BF2B 2FBF3B2F2BFBF14B2FBFBFB2FBF5B2F3BF2BFBFBFBF5BF9B2F4B2FBF2B2F2B2F3BF2B FBF5B2F4B3F5BF3BFB2F4BF2BF6BF7BFBFB2F2B2F2BF3BF7B3F2B2F3B2F2BF4BF6BF 2BF2BF2BFB2F2BF5BF3BF2B2FBF5BFBD18B$BABABABABABABABABADABABAFABEFEFAB ABABABABEBEFABEFEBABABABABABABABEBABABABEBEBABEBAFAFEBABABEBABEBABAFA BAFABEFEBABABEBEBABABEBABABABEBABAFABABABABAFABEFABABEBEBEBAFABABAFAB AFABEBABABABEBABABEBEFAFEFABABEFABABABEBABABEFABEFEBEBABAFAFABABABABE FABEBAFABEBABABEBABABABEBAFEBABABAFABABABABEBABABAFABAFEBABABABABABAF ABEBABAFEFAFABEBEBABEBAFABEBEBABEBABABABABCBABABABABABABABABA$18BD3BF 4B2F8BF3BF5BF3BF8B2F2B3FB2FBF6BF2BF6BF2B3FBF7BFBF3BFBF6B2FBF2BF2BF3BF B3F2BF3BF2BF9BFB6F2B2F2BF5BF6BF6BF6BF2BF6BFBFB2F14BF9BF5BF2BF3BF2BF4B F2B2FB2F3BF6BF3BFBFBF8BFBF4BF12B4FBF3B2F2BFB2FBF3BF2BF2BF10BD18B$BABA BABABABABABABADABABEFABABEFABAFAFAFABAFABAFABABABABABEBEBEBAFABABABAB ABABABABABABAFABAFABEBAFEBEBABEBAFABEBABAFABABABEBABAFAFABABEBEBABEBA FABAFABEBAFABABABABEFABABAFABEBABABABEFABABEFABABABEBEFEBEFABABABEFAB EBEFEBABABAFEFAFABEBAFABABAFABEFABABAFABABEFAFAFEFEBAFABAFABAFABABABA BAFABAFABEFABABABEBEBEBEBEBAFABABAFEBABEBAFAFABAFAFABABABAFABEBABABAB ABCBABABABABABABABABA$18BD7B4FBF3B4F4BF2B3FBFBF3BF3B2FBF9BFBFBF5BF2BF B2F2BF5BF2BF3BF2BF5BF6BF4BF5B2F15BF3BF4B4FBF2BF7BFBF2B2FBFBF3BF2B2F6B F2B2F4B2FB3F11B3F2B2F2B2F2BF2BF3BF4BFBFB2F5B2F2BFBF8B2F2BF2BF5B2FBF4B 2FBF2BFBF2BF3BF3BF2BF6BF3B2F8BF3B2F2BFBFD18B$BABABABABABABABABADAFEBA FAFABEBAFEFABEBAFEFEBEBEBABEBAFABABABABEBABEBABABABAFEBEBEBEBEBABABEB ABAFABAFABAFABABABABABEBAFAFABEBAFEBAFEBAFABABABABABABABABABABEBABABA BEBAFEBAFEFABEBEBABABEBEBABAFEBEFABABABAFABAFABEBABABABABABEFEBEBAFAF AFEBAFABABEFEBABABABEBEBABAFEBABAFABEFEBAFAFABABABABEBAFAFABABEBAFABA FAFABABABAFEFEBEFABAFAFABEBABABEBABABAFABEBABABABABCBABABABABABABABAB A$18BD4BFB2F2BF2B2F3BF16BF6BF4BF2BF3BF4BFBF2BF6BFB2FBF2B2F2B3F5BF13B 2F2BF2BF3BFB3F2B4FBF2BF3BF3B2F5B3F3B2F3B5F2BF2BF5BF3B2F2BF3BF5B4F2B2F 2BF2BF9BF8B2FBF4BF2BF3BF3BFBF5B3F6B2F2BF2B2F2BF5B3F3B2F3B2F8B2F3BF10B 2F4BFBF4BFBF3BD18B$BABABABABABABABABADABABABAFABABABAFAFABAFABAFABAFA BAFAFEBEFABEBABABABABEBAFABABABEFAFABEBEBABEBABABABEFABABAFABEBABABAB AFABABAFABEBABABEFAFAFABABAFAFEBABEBABABABAFABAFABAFABAFEBABAFABAFABA FABEFEBABABABABABAFEFEBABAFEBABABAFABEBABABEFEBABEFEBAFABABEBEBABEBAB AFABAFAFABABEFABABEBAFAFABABAFABAFABABEBEFEBABABABABABAFEBABABEFEBABE BEBEBABABABABABABABEFAFEFCBABABABABABABABABA$18BD2BF2B3FB2F4BFB3FBF 13BF2BFBF5BF2B2F6B3F5BFBF2B2FBF5B3F2BFBFBF4BF3B2F7BF2BF2BF4B2F10BF2BF 5B2F2BFBF9B2FBF2BF2BF8BF3BFB3FBF7BF6BF3BF2BF8BF3BFBFBF2BF6BF4BF11BF2B FB2F2B4FBF7B3F7BF4B2F7BF5BF4BF2BFBF6BFBF4B2FBF4BD18B$BABABABABABABABA BADABABEBABABAFEFABABAFABAFABEFABAFABEFEBABEFEFEBABABEBAFEFABABAFABAB ABABEFEBABABABEFEBABEBEBABABAFEBABABAFAFAFAFABABAFABABABEBEBEBABABAFA FABEBABABEBEBEBABABAFABABABABEBABABABABAFAFAFABEFABEBABAFEBABABEBABAF AFEBAFEBEFABABABEBABABEFABABEFEBAFEBABEBABAFEFEBEBAFABAFEBABABEBABEBE BABABEBABABEFABABABEBABAFABAFABEBABAFEBABEFABABABABABABABAFCBABABABAB ABABABABA$18BD2F4BFBFBFB2F2BF4BF4BF15BF7BF3BF3BFBFBF2BFBFBFBF8BFBF4BF BF5BFBFBF4BF3BFBF10BF5BF5B6FBFBF3BF2BF2BF4BF2BF3BF2BF4B3FB4FBF8BF4B2F 5BF3BF2BFB3F9B2F4BF2BF2BF5BFB2F9B2F5B3FBFBFBF4BF2BF4BF4B4F4BFBF2BF9B 2FBF5BF5BF6BD18B$BABABABABABABABABADEBABABABEBEBEBABABABABABAFEBAFABA BABABEBEBAFABEBABABAFABEBAFEBABABABAFABABEFEBABABAFAFABAFABABEFEBEBAB AFABABAFEFABABABABEBABEBABABABABEBEFAFEBEFEBEFAFEBABABABABEBABEBEFEBA BABABEBABAFABABABAFEBABEBAFEBEFEBEBEBABABABEFEFABEBABABEBEBABABABABAB ABABABABAFABAFEBEBEBABAFEBABABEFEBABABABABAFABABABABAFABABEBABAFABABA BEBEFABABEBEBAFEFABABABCBABABABABABABABABA$18BD3B3F4BF3B2FBFB2FBF4BFB FB3FBF4B2F2B3F3BF2B2FBFBF4B2FB2F2BF10BF2BF11BF4B2FBFBF6BF2BFB2F3B2F8B 2F5BF4BF2BFBF2BFBF3BFBFBFBFBFBFBF2B2F2BF3B2F4B3FB2FBF3BFB2F6B2F4BFBF 4B2FB3FB2F3BFBF2B2F3BFB2FBF2BF4BF3B3F6BF2BF4BFBFBF7BFBF6BFBF8BF9BF3BF 2BFBF2BD18B$BABABABABABABABABADABABABEBABEBABAFAFABEBAFABEFABABAFABAB EBAFABEBABAFAFEBABAFEFEBEFEFABEFABAFABABABABAFAFEBABABABEFEFAFABAFEBA FEBEBAFAFABABEBAFABABAFABEBAFABABABEBABABEBABABEBABABABABABABAFABABAF ABABABABABAFEBABEFABEBAFABAFEBEBEBABABEBABABEBAFABABABABAFABEBABEBABA BABABABEFABABABAFABAFABEFAFEBAFAFEBEFAFAFABABABAFEFABABEBABABEBABEBAB EBABEBABABAFABABAFCBABABABABABABABABA$18BD2B4F3BFBF3B2F2BFB3F3BF4BFBF 2BF4B4F5B2F3B3F7B2F5BF5BFB2F4BF2BF7BF3BF3BF2B5FB2FBF3BF3B3F3BFBF7B2F 2BF8BF4BF3B2F4BF4B2F11BF2BF10B2FB2F2BF2BFB2FBF12BF3BF3BF4BF11B2FBF2BF 2BF4BFBF4BF2B4FB2F6BF4B2F4B2F3BF6B2F8BFBF4BD18B$BABABABABABABABABADAB ABEFABEBABEBABABABABABABAFABABEFEFABABABABABEFABAFABABABABABABABEBABE FEBABABEFABABAFAFEFEBABABEBEBABAFAFABABABEFEBABEFABABABAFABEBABAFABAB ABEBAFEBAFABABEBEBEBABABAFEBABABABABAFAFABEBABABABAFABAFEBAFABEFEFEBE FEBABEBAFABEBABABEBEBEBABAFABAFEFABABABABEBABABEBAFEFABABAFEBEBEBABEB EBABABABABEBAFAFAFEFABAFEBABABABAFAFEBAFABEFABABABEBEFCBABABABABABABA BABA$18BD2BF2BF2B2F2BF5BF2BF3BF2BF3BF9BFB3F2BF14BF2B2F2BFBFBFBF5BF3BF BF6BFBFBF4BF4BF2BF7BFBF7BF8BF3BFB2F5BF4B2F2B3F6BFB2FBF4B3F4BF2B2F14BF 4B4FBF2B3F5BFBF3B2FBF4B2F3BF4BF13B2F3BF4BFBFBF2BF5B2F2BF5BF3BF6BF2BF 3B2FBF5BF4BFD18B$BABABABABABABABABADAFABABABEFABAFABEFABABAFABABABAFA BABEFEBEBABEBABEBEBAFEBEBABEBABEBAFABAFABABABEBABABABABEFABEBABEFEBAB ABEFAFAFABAFABEFABABEBABABABABABABEFAFAFABAFABEFEBABABABEBEBABABAFAFA BEBAFABABABABABAFABABABEBAFAFABABEBEFABAFABABEFEBABABABABAFABEBEBAFAB AFEBABABABAFABABAFABEFEBABEBABEFEBABAFABEBEBABABABEBEFABABEBAFABAFEBA BAFEBAFEFABABEBABABABABCBABABABABABABABABA$18BD3BFB2F6B4FB2F4B2F2B2F 9BF2BFB2F6B3F7BFBF4B2F4BF12BFBF10B4F7BF8BF4BFBF5BF2BF2BFB2F4BF3B2F2BF 6BF9BF9BF2BF3B2F2BFB2F2B2F2BF7BF5B2F2BFB4F6BF2BFBF6BF2B2FBF4BF2BFBF3B F8BF2B2F3BFB3FB3F14B2FBF2BF3B2F3B2FBFBFBF3BD18B$BABABABABABABABABADAF AFAFAFABABABAFEBEBAFABABABEFABABAFAFAFABAFAFEBABABEBABABABAFAFAFABAFA BAFAFEFABABAFEBABAFABABABEFABEFABABABABABABEFABEBEBEBABABAFEBABAFEBAB ABABAFEBEBAFEBABABAFABABABABABEBAFABABEBAFABEFABAFAFEFABABEBABABABABA BABEBABAFEFABABABABEBABEFEBABABEBEFAFABAFAFAFABABABABABEBABABABEBAFAF EFAFABEBABABABABABABABABABEBEFEFABABABAFABABEBAFABABABCBABABABABABABA BABA$18BD12B3FBFBF4BF3B2FBF2B2FBF5BFBF3BF5B2F2BF4B2FBFB2F7BF12BF5BF7B F8BF3BF6B2F5BFBF2BFBF2BFB2F2BF2BF3BF2BFBF2BF2BF11BFBF2BFBF3BF2BF4BF3B F2B4FBF4BFBFBF9BFBF2B4F7B2F2BF11BFBF4BF5BF2BF4BF5B2F10BF6BFBF3BF2BF4B 2F2B3FB2F2BFD18B$BABABABABABABABABADABABABAFABABAFAFABAFEBEBABAFABABA BAFABABAFAFAFABABEBABEFABABABABEBABABAFAFABAFAFABEFABABABABEBABABABEB AFAFAFABABABABAFABABEBABEBABAFAFEBABABAFABABABEBABAFAFABABABABABAFABE BABEBEBEBABABAFEBAFABABABABABABEBABAFAFEBABABABABABEFABAFAFABEFABABEB EFABABABABABAFEBEBABEBAFABABEFEFEFABABABABABABABEBABABABEFABABAFABAFA BABABEBEFABAFABAFABAFAFCBABABABABABABABABA$18BD7B2F7B3FBFBF6BFBF2B3FB F3BFB2F2BF3BF3BF4BF2B4FBF7BFBF2BFB3FBF4BF3B2F2BF6BF2BF8B2FB3F5BFBFBF 3BF2BF2BFBF6BFBF2BF6B3F3BF3B2F3B2F3BF5B4F4B2F2BF4B4FB2F3BF4BFBFB2F2BF BF2B3F6BF3BF4BF4B2F7B2F4BFBF2B2F4BF2BFBFBFBF2BF2BFBFBF2B2FB2F5BF5BF3B FBFBD18B$BABABABABABABABABADABABABAFABAFEBABABAFABEBEBABEFEBABABAFEBE BABABABABABABEBABAFAFABEBABABAFEBABAFABABABABAFABEFABABABAFABEFABABAB EBAFABABEBABABABABEFEFAFAFABABAFABEBAFABABABABEBEBEBABABABABEBAFEBABA BEBABABAFEBAFAFAFEBABABEBABABABABABABABEBAFEBEBABEBABEFEBAFEFABAFABAB AFAFEFEFABAFABABABEBABEBAFAFABABABEBEFABAFEBEBAFABAFAFABAFEBABABABABA BAFEBEBABABEBABCBABABABABABABABABA$18BD3BFB2FB3F4BF4BFBFB4F4BF5B2F8BF BF4BF2BFBF2B2F2BF9B2F5BF3B4F2BFBFBF3BF5BF4BF2BF4BF13B2F5B2F2BF2B6F9BF BF3BFBFBF2B2FBF10BF8BF8BF2BF9BF13BF2BFBF3B5F2BF4BF7B2F5B2F4BFB3FB2F 11BFB3FBFBFBF3B4F4B2FBFBFBFB2F2BD18B$BABABABABABABABABADEBAFAFAFEBABA BEBABAFABABEBEBABEBAFABEBABAFABABABAFEBABABABABABAFABABABABEFAFEBABAB ABABABAFABAFABABAFABABABEFEBEFABABEBEBAFABABAFABABEBEBABAFABEBABABEBE FAFABEFABABEBABABAFABABEFABABABEBABABABAFAFABAFEBEFAFEBABAFABABABABAB ABAFABEBABABABABAFABABABEFABABABABAFABABEBABEBABAFABAFABABEBABEBABABA BAFEBABEBABAFABEBEFABEBAFEBABABAFABEBABABABCBABABABABABABABABA$18BDFB F6BF3B2FBF5B2FBFBF9BFB2FBFBF4BF3B3F12B2FBF2B2F3B3FBFBF3BF9B2F7B3F2BF 4BFB2F4BF4BF2BF3BFB2F10B2FBF2BF3BF3BF3BFBF8BF8BF2BF2B2F3BF5BF6BF5BFB 2F8BF5B2FB2F4BF2BF8BF6BF6BF6BF5BF3B2F6B2F3BFBF4BF2BFBF3BF2BF4BF3BFD 18B$BABABABABABABABABADEFAFABABABEBABABABABABABABEBABABAFAFEBABABEBAB ABABAFEBAFABABABEFABEBEBABABABABEBEBABABABABABABABEFABABABABAFABEBABE BAFABABABEBAFAFABABEFEBEBABABABAFABEBAFEBABEBABABEFAFABABAFABEBEBEFEF EBEBAFAFABABABAFEBAFEBEBABABABEBABABABABABAFEBAFABABEFABABABABEBABEBA BEFABEFABEBEBAFABABEBABEBABAFABAFABEBEBABEBABABABABEBEBABAFABABAFEFAB AFABEFAFAFCBABABABABABABABABA$18BD3BF2BF2B2F2BF6BF2BFB3F4BF3BF2BF6BFB FBF3B2F5BF2B2FBF3BFB3F5BF3B3F3BF9BFBF9B2F18BF3BF5BF4B2F2BF9B2FBFBF3BF 3BFBF7BF4B3F2B2F3BF2BF2B2F22B2F5B2F8B4F3BF3B2F12B2FBFBFBF2BF9BF2BF6BF B2F13BF4BF2BF2BFBD18B$BABABABABABABABABADEBABABABABABABABABABABABEBAB AFAFAFABEBAFAFEBABEBEBABABEBABEFEBEFABAFEFABABAFABABABAFEBABEFABABEFA BEFAFABABABABAFEBAFABABEBABABABABABABABABABABAFABABAFABABEBABABEBEBEB ABABAFABABAFAFEFEBAFEFEBABABEBEBEBEBEBEBEBEFABABABAFABAFABEBEBAFABAFE BABABABAFABABEBABEBEBABABABABABAFABAFEBEBABEFAFABABAFEFABEBABABAFABEB ABAFAFABABEBEBEBABAFABEFAFABCBABABABABABABABABA$18BD6B2F3BF2BFBFB2F2B FBF8B3F5BF6BF3B2F4BF5BF5BF7BF5BFBFBF4BF2B2F4BF3B3F12BF6BF2B2FBFBF6BF 2BF3BF14BF2B3FBF4B2F3BF3BF5B2F2B2F15BF3B2FBF4BF11B2F2BF2BF2B2F2B2F3B 2F2B2F5BF2BF4B3F6B2F3BF2BFBFBF5BF3BFBF4B2F5BF3B2FBFBF2BD18B$BABABABAB ABABABABADABEFABEBABABABEBEFABABEBEFAFABABEBABEBABABABAFEBAFABAFEBABA BAFABABAFEBABAFEBEBEBABEBABAFABABAFABABAFEBEFAFEBEBABABEBABEBABAFEBAB EBABABABEBAFAFABAFABEFABABEFABABABEFAFABABABABAFABEFABABEBABEFAFABABA BAFABEBEFABAFAFEFABAFEFEBEBEFAFAFEBABABABABABABABABABEBEFABAFABEBAFAB EBEBEBEFEFABABAFABAFEBAFABEFEBABEBAFEBABABABAFEBEBEFEFABAFEBEFEBEBCBA BABABABABABABABA$18BDFB2F5BF6B2F8B2F2B4FBF4BF2BF3BFBFB2F2B2FBF2BFBF8B FBF3BF2BF7BF2BFBF2BFBFBF2B2FB2F6BF2B2F7BF2B2FBF2B2FB4F8BF2BF2BF3BF6BF BF2BFB4F3B2F2BF4BFBF3B3FBFBF2B2F2B2FBFBF9B2F2B4F2B4FB2F3BF7BF5B2F3B2F 2BF9BF5BFBF2BF2BF2BF5BF5BF3BF6B2F2BFB2FB2FB2FD18B$BABABABABABABABABAD ABABABABAFEBABEBAFABAFAFAFABEBAFEBAFABABAFEBABEBABEBABABABAFEBAFEBAFE BABEBABABABEFABEFEFEBABABAFABABABAFEBEBABEFAFEBABEBABAFABABABABEBAFEB ABABAFABEBAFEBABAFEFABABABEBABEFAFABABABEBAFABABEBEBAFABABABAFABAFABA FABABAFABAFABEFAFEBEBABAFABEBABEBABAFABAFAFEBABABEBABABABABABEFEFABEB ABABABABABEBABABABEBABAFEBABEFAFAFABABEBABEBABABABABABABCBABABABABABA BABABA$18BD2F9BF3BF2BF8BF7BF3BF11BFB2FBFBF4BF3BF5BF2BF2BF5BF5B2F3B2FB F3BF3BFBFB2F11BF6B2F6BF2B3F2B2F6BFBF4BFBFB3F3BF2BF2B3F14BFB2FBFBF2BFB F8BFBF3B2F2BF2BF5BFBF2B3F5B3FBF3BF2BF4B2FB2F6BF2B2F10BF2BFBF6BF5B5F4B 2FBF3BF5BFBD18B$BABABABABABABABABADABABABABABAFEFEBAFABABEBEBAFEBAFAB ABABAFEFABEBABABABEBABABEFAFEBEBEBABAFEBEBABABAFEBAFABEBABEBABABEFABE FABABABEBEFEBABAFEBEBABABAFAFEBABABAFABABAFEFAFABAFAFABABABABAFABABEB ABABAFAFAFAFAFAFABEBEFABAFEBAFABABEBEBABABABABAFEBEBABABABABABAFABEBE BABEBABABABEBABABAFABABABEFEFEFABABABEBAFAFEBAFABAFABABEBAFABABEBEFEB EBEBAFABAFABEBABEBABEFCBABABABABABABABABA$18BD12BF2B2F10BF2BF7BF5BFBF 2B2FBF3BF3BF8BF4BF2B4FB2F2BF4BF2BF7BF7BFBF2B2F3BFB3F12BFB2F3BF4BF4BF 5BF2B2F7B3F3BFBF2B2F8BF2BF2B3F9BF4B2FBFBF4BF4BFBFBF3BF14BF2BF2BF3BFB 3F9BFBF3B3F5BF4BFBFBFBF5BF2B2F3BFBF6B2F2BFBD18B$BABABABABABABABABADAF ABEBEBABAFABEBABABEFABABABABEFABAFAFEBEBABABEBEBEBAFAFABAFABABAFEBAFA BEBAFABABEBAFABEBABEBEBAFEBABABABABAFEFAFABEFABAFABABEBABEBABEBEFABAB ABABAFEBABABABABEFABAFAFABABABEBEFABABABEBABABAFABAFABABEBABAFAFAFABA BABABEBABABABEBABAFABABEFEBABEBABEBABABAFAFABABEFEBABAFABEBABABEBABAB EBAFABABEFABEBEBEBAFABABAFABAFABABABEBABEBABAFABEFABABCBABABABABABABA BABA$18BDF3BFBF7B2F9B2F7BF2BF2BF2BF8B2F6BFBF6BF2B2F2B2F10B2F13BF2B2F 2BF2BFBFBF14BF9BF2BF7BF2B3F6B2F2BF12BF7BF5BFBF3BFBF2BF3B3FBF4B2F4BF4B F3BF13B2FB2F3B3F2BF2B3FBF4BF2BF3B3F2B2F7BF4BF2B3FBF9BF3BF4BF5BD18B$BA BABABABABABABABADEBABABEFABABABABAFAFEBABAFABAFABAFAFABABEBABEBABEBEB EBAFABABABEBEBAFEBABABABAFEBEFEBAFAFABABABABABABEFEBABABEBABABABEBABA BEBABABEFAFEBABAFABAFABABABEFEBEBABABEBABABAFEFABEFEFABAFEBAFABEBABAB ABEBEFABABABAFABEBEBABEBEBABEFABABEFEFABEBAFABABABABABEFAFEBAFEBEBAFE BABEFABAFABABABAFAFEBABEBEFABAFEBABAFABEFEFABEFAFABABABABEFEBABAFAFAB ABEBCBABABABABABABABABA$18BDBF4BF2B2F3B6FBF3B3F5BF2BFBF13B2FBFB2FBF5B 2F2BF5BFBFBFBF3BF5BFBF2BF3BF3B2F2BF14BF4BFBF2B2F3BF2B3F2BFB2FBF4B2F4B 3F13BFBFBFBF3BF7BF2BFB2FB5FBF4BF11BF3BFBFBF8BF3BF2BF2BF2BFBF9BF2BF2BF 13B2F2B2F2BF9BF2BF9BF3B2F5BD18B$BABABABABABABABABADABABABABABABEBEBAB EBABEFABEBAFABEBAFEFEBABABABAFAFEBAFAFAFAFABEBAFAFAFEBABEBEFABEBABABA BABABAFABEBABEFEBEBEFABABEBABEBEBABABABABAFAFABABABEFABABABEBABAFEBAB ABABAFABABAFAFABABABAFABABAFABAFAFAFEBABEBABAFEBABAFABABEBEBEBABABAFE BABEFEBABABEFABABABAFAFEFEFEFABABEFABABAFABABABABEFABABEBEBABABEBABAB AFAFABABEBAFEBABABABEFABEBEFABABEBABABCBABABABABABABABABA$18BDFB2F7BF 3B3F4BF5BF10BFBF2BF2BF9BFBF6B2F2B2F3BF14BF3B2FB2FB3FBF3BF2BF6BF2BF3BF 3BFBFB2F5BF7B2F5B2F2BF2BF2BF3B2F6BF6B2F3B2F5BF2BF3B2F6BFB2FB3F10B2F2B 3F2BF2BFB2F8B2F7BF4BF3BF10B2FB3FBF3BF2BF2B2F7BF3BFBFB3F4B2F4BF2BD18B$ BABABABABABABABABADCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD CDCDCDCBABABABABABABABABA$370B$BABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABA$370B$BABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABA$370B$BABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABA$370B$BABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABA$370B$BABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABA$370B$BABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABA$370B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABA$370B$BABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA$ 370B$BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABA$370B$BABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA BABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABAB ABABABABABABABABABABABABABABABABABABABABABABABABABABABABABABA! golly-2.5-src/Patterns/Margolus/TMGas.rle0000644000175100001440000001003212156145314015257 00000000000000#CXRLE Pos=-18,-14 Gen=0 # Toffoli-Margolus gas, from: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using states 1, 2 and 3. Next # select-all and run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # # original Margolus states: # # 0 : background # # 1 : wall # # 2 : gas particle in an even step of the simulation # # 3 : gas particle in an odd step of the simulation # # neighborhood:Margolus # n_states:4 # symmetries:rotate4 # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,2 : 0,0,3,0 # even step: rotate clockwise # 0,0,0,3 : 0,2,0,0 # odd step: rotate anti-clockwise # 0,0,1,2 : 0,0,1,3 # contains a wall: no movement # 0,0,1,3 : 0,0,1,2 # contains a wall: no movement # 0,0,2,1 : 0,0,3,1 # contains a wall: no movement # 0,0,2,2 : 3,0,3,0 # even step: rotate clockwise # 0,0,3,1 : 0,0,2,1 # contains a wall: no movement # 0,0,3,3 : 0,2,0,2 # odd step: rotate anti-clockwise # 0,1,1,2 : 0,1,1,3 # contains a wall: no movement # 0,1,1,3 : 0,1,1,2 # contains a wall: no movement # 0,1,2,0 : 0,1,3,0 # contains a wall: no movement # 0,1,2,1 : 0,1,3,1 # contains a wall: no movement # 0,1,2,2 : 0,1,3,3 # contains a wall: no movement # 0,1,3,0 : 0,1,2,0 # contains a wall: no movement # 0,1,3,1 : 0,1,2,1 # contains a wall: no movement # 0,1,3,3 : 0,1,2,2 # contains a wall: no movement # 0,2,1,1 : 0,3,1,1 # contains a wall: no movement # 0,2,1,2 : 0,3,1,3 # contains a wall: no movement # 0,2,2,0 : 0,3,3,0 # two or four particles collide: no movement # 0,2,2,1 : 0,3,3,1 # contains a wall: no movement # 0,2,2,2 : 3,0,3,3 # even step: rotate clockwise # 0,3,1,1 : 0,2,1,1 # contains a wall: no movement # 0,3,1,3 : 0,2,1,2 # contains a wall: no movement # 0,3,3,0 : 0,2,2,0 # two or four particles collide: no movement # 0,3,3,1 : 0,2,2,1 # contains a wall: no movement # 0,3,3,3 : 2,2,0,2 # odd step: rotate anti-clockwise # 1,1,1,2 : 1,1,1,3 # contains a wall: no movement # 1,1,1,3 : 1,1,1,2 # contains a wall: no movement # 1,1,2,2 : 1,1,3,3 # contains a wall: no movement # 1,1,3,3 : 1,1,2,2 # contains a wall: no movement # 1,2,2,1 : 1,3,3,1 # contains a wall: no movement # 1,2,2,2 : 1,3,3,3 # contains a wall: no movement # 1,3,3,1 : 1,2,2,1 # contains a wall: no movement # 1,3,3,3 : 1,2,2,2 # contains a wall: no movement # 2,2,2,2 : 3,3,3,3 # two or four particles collide: no movement # 3,3,3,3 : 2,2,2,2 # two or four particles collide: no movement # x = 40, y = 38, rule = TMGasMargolus_emulated 40B$BABABABABABABABABABABABABABABABABABABABA$40B$BABABCDCDCDCDCDCDCDC DCDCDCDCDCDCDCDABABA$5BD28BD5B$BABABCBABABABABABABABABABABABABABADABA BA$5BD28BD5B$BABABCBABABABABABABABABABABABABABADABABA$5BD28BD5B$BABAB CBABABABABABABABABABABABABABADABABA$5BD28BD5B$BABABCBABABABABABABABAB ABABABABABADABABA$5BD28BD5B$BABABCBABABABABABABABABABABABABABADABABA$ 5BD6BF3B2F3B3F10BD5B$BABABCBABABABEBABABEBEBEBABABABABADABABA$5BD5B2F BF2B2F2BF12BD5B$BABABCBABAFAFEFABAFEFABABABABABABADABABA$5BD4B2FBF2BF 2BF3BF10BD5B$BABABCBABABABEBEFEBABEBEBABABABABADABABA$5BD3BF4BFB3F4BF 10BD5B$BABABCBABABEFEBABABABAFABABABABABADABABA$5BD3BFB2F5BFB2F12BD5B $BABABCBABEBAFABEBABEBEBEBABABABABADABABA$5BD7BF2BF5BF11BD5B$BABABCBA BEBEBABABABABEFABABABABABADABABA$5BD5BFB2F4B2F13BD5B$BABABCBABABABABA FABABABEBABABABABADABABA$5BD28BD5B$BABABCBABABABABABABABABABABABABABA DABABA$5BD28BD5B$BABABCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDABABA$40B$BABABAB ABABABABABABABABABABABABABABABABA$40B$BABABABABABABABABABABABABABABAB ABABABABA$40B$BABABABABABABABABABABABABABABABABABABABA! golly-2.5-src/Patterns/Margolus/TripATron_BlockAligned.rle0000644000175100001440000000470712156145314020600 00000000000000#CXRLE Pos=-25,-25 # Trip-a-Tron, from: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # With a Margolus-block-aligned pattern, the behaviour of the CA is # different. # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:2 # neighborhood:Margolus # symmetries:none # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,0 : 1,1,1,1 # 1,1,1,1 : 0,0,0,0 x = 50, y = 50, rule = TripATronMargolus_emulated:T50,50 ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABAB ABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABAB ABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABAB ABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$A BABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABA BABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABCDABABABABA BABABABABABABABABABAB$18B2D30B$ABABABABABABABABABABABABABABABABABABAB ABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABAB ABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABAB ABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABCD ABABABABABAB$36B2D12B$ABABABABABCDCDCDABABABABABABABABABABABABABABABA BAB$10B6D34B$ABABABABABCDCDCDABABABABABABABABABABABABABABABABAB$10B6D 34B$ABABABABABCDCDCDABABABABABABABABABABABABABABABABAB$10B6D34B$ABABA BABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABA BABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABA BABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABA BAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABAB ABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABAB ABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABAB ABABABABABABABAB$50B! golly-2.5-src/Patterns/Margolus/TripATron.rle0000644000175100001440000000465112156145314016200 00000000000000#CXRLE Pos=-25,-25 # Trip-a-Tron, from: # # T. Toffoli, N. Margolus "Cellular Automata Machines: A New # Environment for Modeling", MIT Press (1987) # # Compare with the pattern generated by Turmites/ComputerArt.rle # # At the time of writing, Golly does not support the Margolus neighborhood, # so we are emulating it by using some extra states. The odd-numbered cells # are those in the top-left corner of the 2x2 block to be updated. # Configurations must have the correct pattern of states to work correctly # - you can't just scribble on the pattern! First run export.py in # Scripts/Python/Margolus. Then draw, using state 1. Next select-all and # run import.py. You can now continue running the CA. # # Rule tree produced by RuleTableToTree.py from the Margolus rule table: # # n_states:2 # neighborhood:Margolus # symmetries:none # # # The Margolus transition a,b,c,d : e,f,g,h means: # # # # a b becomes e f # # c d g h # # 0,0,0,0 : 1,1,1,1 # 1,1,1,1 : 0,0,0,0 x = 50, y = 50, rule = TripATronMargolus_emulated:T50,50 ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABAB ABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABAB ABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABAB ABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$A BABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABA BABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABCDABABABABA BABABABABABABABABABAB$18B2D30B$ABABABABABABABABABCDABABABABABABABABAB ABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$ 50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABAB ABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABAB ABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABCD ABABABABABAB$36B2D12B$ABABABABABABABABABABABABABABABABABABABABABABABA BAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABAB ABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABAB ABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABAB ABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABAB AB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABA BABABABABABABABABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABA BABABABABABABABABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABA BABABABABABABAB$50B$ABABABABABABABABABABABABABABABABABABABABABABABABA B$50B! golly-2.5-src/Patterns/Other-Rules/0000755000175100001440000000000012156146015014243 500000000000000golly-2.5-src/Patterns/Other-Rules/Ed-rep.rle0000644000175100001440000000535112156145314016010 00000000000000# A replicating photo of Ed Fredkin - run until 49 generations. # # In 1970, Terry Winograd generalized Fredkin's parity rule (B1357/S1357) # (also known as Replicator) to an N-state version, with the parity rule # replaced by modulo-N. He proved that if N is prime then the resulting # CA will have the replicating properties of the parity rule (for which # N=2). # # As with the parity rule, the effect works with many different # neighborhoods, such as Moore, von Neumann, hexagonal, even in 3D. Here # we're using the von Neumann neighborhood so there are four copies made. # The script FredkinModN-gen.py in Scripts/Python enables you to explore # the rules for different N and different neighborhoods. # # In this demo we've used N=7 and imported a 6-color photo of Ed # Fredkin to use as an example pattern. At 49 generations four copies are # visible, as at higher powers of 7: 343, 2401, etc. # # At some intermediate generations (e.g. 196) multiple copies are seen # with color-inversions and other effects. # # Winograd, T. (1970) A simple algorithm for self-replication # A. I. Memo 197, Project MAC. MIT. http://hdl.handle.net/1721.1/5843 # # Contact: tim.hutton@gmail.com x = 49, y = 49, rule = Ed-rep ABA2B2ADE17F4E11D4B4A$2A2B2AB23FE10D2B3AB2A$4B2AD24F3E7DB4AB2A$3B3AE 24F3E7DB7A$3B2AB25F7E3DCB6A$3B2AC3FE17F6E2D2BC3DCB4ABA$3B2AC3FE19F4D 5B2DED2B3A2B$2B3AD12FE9FD3B4A3BD2EDB4AB$2B2ABE2F3E7FE5F3EDBA2BA4B3CDE D3B2AB$BC2ABD3FE7F2E5F3DB2D2BC5D2C2DC3B3A$2BA2BD10FE2D3F2E6DC10D3C3B 2A$2BA2BC7F6DEF3E5DC3D2E7DBCD3BA$2BA2BC3F2DC3BC3DEFE5DC3DE2FE4D2EDBCD 2CBA$BCA3BEFDB3AB3D5E3D3BC3DB7AB2DCD2C2B$BCA3BDFD2B2C7D4ED4BDB6A4BC5D CB$BCB2ABCF3D2E7DE3FD5B3AB2C11D2B$B2C3ABF8E5D3FE4B2DCDEFE6DE4D2B$ABCB 3A2FDF2E3FE2D2B3FD3BD2E3D2E2DB2D3E2DEDB$A3B3AEF3E2FDBA3BD3FEC8BC5D4E 4DB$2ABCB2AEF2EFC6ABE3FD2B10D3E7DEC$CABC2BAEF2E4A2B2CE4FE4D3E2FE4FEDE 3D3ED$DABC2BADFEDAD3FEB2D4FE2DBD3EFEF7E3D4E$BA2BCBAD2FBD3FD2B2D4F2E5D EF6E6DE2DE$6BAC2FD2E2DBC2E5F2DED3BD3F4E5D2E2DE$D3BC2BD2F2E4DE7F3EFC2A BD2F4E5D3EDE$DA2BC2BD3F5E8FE2DEF2B2A13DEDE$C3B2DCB11FD5F3DF2DB2AB13DE $2C2BCEDC10F2D5F3D2F6B11D2E$C2BCB2E2D9FBD4F3DB2D6B9DC3D$2B3C2E2C8FDB 2FE2FE2DB2DBD4B9DC3D$B2C2B2EDBE6FDBA2FE2F4DB3A4BC8D2C2D$3BABC2EDE4F2E DAB5F3DB3A7BD2BC7D$A3B2AEF3E2FE3DAB8DBA6BC2B2DBDE6D$3B3AB7E2DBA3DBABD 2BA6BDC2B2CBCE3DB2D$B3AB2C7E2D2BFD2E2DC6BC2DCD4BCDE6D$CBC2BECBCD5EDBD F2D2E2D3C8DB2AB9D$ECECBC3ACDF3EDBD6EDC7D3B3AB9D$CB4C2A3CF2E2DA2D2E2D 2F3ED4B5AB2C5DC2D$2B2CECBCECBEFEDCB5EFE2D2BABDB5ACD3C4DC2D$2B4CB2CBAE FE2DBDED2FE4BDB6ABC8DCB2D$10BABFE7D3BC2DB4ABCB3C6D2CB2D$2B2A8B4E4DB8A CD4BDBC2DC4DBC2D$B2AC5BCD2EF3E2DBDECBA3BC5D3B8DBC2D$BABC5BCE2CFEDE2DB D2FEDED3F2DBC2BCD2C5DBC2D$C2BC3BC2BCAB2ED2E3DE2F2E5D4CB3C3DCDCBC2D$EB A2B6C2BD5E2D6E2DB2CDC3BC6D3B2C$B4A4B5C6ED5E8DC9DC2B2C$2AB2A3B3C9ED3E 10DB9DC2B2C$2B3CE2CE4C2BDF3ED4E19DC2B2C! golly-2.5-src/Patterns/Other-Rules/golly-ants.rle0000644000175100001440000000303712156145314016764 00000000000000#C Two ants write "golly" in a period 34,332 oscillator. #C Alan Tennant and Dean Hickerson, Oct 2009. x = 97, y = 56, rule = Langtons-Ant 68.2A$67.A2.A$66.A4.A$65.A6.A$7.2A4.3A8.3A37.A8.A$6.A2.2A.A10.A3.A35. A10.A$5.A7.A10.A3.A2.2A29.A12.A$5.A.4A3.9A2.A2.A3.2A27.A14.A$6.A4.A. 5A.A2.A.3A2.A2.A27.A16.A$2.2A4.A2.2A5.A.2A.A.A.3A.2A.3A22.A18.A$.A4. 3A3.A4.A3.2A.A2.A3.4A.2A20.A20.A$A4.6A.2A.A.2A2.A.A3.4A2.A.3A19.A22.A $A.2A4.3A.A3.2A.A2.3A.2A2.A.2A.A4.A15.A24.A$.A2.A3.A3.A.2A.2A.2A.4A2. A.3A2.3A2.A13.A26.A$3.2A3.A4.A.2A6.A3.A2.2A.5A3.A12.A28.A$3.2A3.A7.A 2.2A.A4.2A.A3.A.A2.A.A11.A30.A$3.2A3.A4.A.2A5.7A2.4A.A2.A.A10.A32.A$ 3.A2.A.A4.A.2A5.A.2A.2A2.2A.3A2.A.A9.A34.A$3.4A3.A3.2A.3A2.2A2.A4.A. 2A.2A2.2A8.A36.A$8.3A2.H2.3A.A.4A3.A.A.3A4.2A7.A38.A$8.A4.A.A.2A2.2A 2.A5.A2.A.3A.2A6.A40.A$4.5A3.3A.A4.A3.A2.3A2.A2.3A.2A5.A42.A$3.A3.2A 4.2A.2A4.A.A4.A7.A3.A4.A44.A$2.A4.3A.3A3.2A.A.A.2A3.A.3A3.5A3.A46.A$ 2.A3.3A3.A.A.2A.6A2.3A2.A2.2A.2A.A2.A48.A$2.A4.2A3.7A.2A2.6A3.A3.2A.A 2.A50.A$2.A2.A.A3.3A.A2.A2.A2.A.3A.A.A5.3A.A52.A$2.A2.4A.A2.2A2.A4.A. 4A3.A.A2.A5.A53.A$2.A6.3A.A2.A.3A.A3.4A4.3A.2A.A54.A$3.A4.A.3A2.A.A. 4A2.6A.2A.A2.3A54.A$4.4A4.A.A.3A2.2A2.2A3.A.A3.A.A.A.A51.A$11.A4.3A2. A.2A4.A.2A2.2A2.4A.A48.A$11.A6.A.A5.3A.A2.3A4.A2.A.A46.A$12.A4.A2.A.A 4.A2.2A.A.A.A8.A44.A$13.4A4.2A.A.A.A4.5A9.A42.A$22.4A2.A.3A2.2A11.A 40.A$25.A.A2.2A.F2.A12.A38.A$24.4A.3A4.A13.A36.A$24.A3.A3.A.3A14.A34. A$25.A10.A15.A32.A$26.A4.2A2.A17.A30.A$27.4A2.2A19.A28.A$55.A26.A$56. A24.A$57.A22.A$58.A20.A$59.A18.A$60.A16.A$61.A14.A$62.A12.A$63.A10.A$ 64.A8.A$65.A6.A$66.A4.A$67.A2.A$68.2A! golly-2.5-src/Patterns/Other-Rules/HPP-demo.rle0000644000175100001440000020173012156145314016244 00000000000000# HPP Lattice gas # # J. Hardy, O. de Pazzis, and Y. Pomeau (1973) J. Math. Phys. 14, 470. # # The earliest lattice gas model. Later made obsolete by the FHP gas on # a hexagonal lattice, which has better physical properties. # # Gas particles bounce around inside a box (for a simpler example, see # HPP-demo-small.rle). An area of high density has been created, this # spreads out in a circular wave and reflects off the walls. # # In 1986, Norman Margolus ran an almost identical pattern on his # purpose-built CA machines, CAM-6. It ran at 60 frames per second. # N. Margolus, T. Toffoli, and G. Vichniac. # "Cellular-Automata Supercomputers for Fluid-Dynamics Modeling" # Physical Review Letters 56(16), 1986. # http://people.csail.mit.edu/nhm/ # # States following http://pages.cs.wisc.edu/~wylie/doc/PhD_thesis.pdf # # Each cell can contain up to 4 particles, each moving in one of the four directions. # Outgoing directions SENW map onto 4 bits, so W=0001=1, SEW=1101=13, etc. # Next state is simply the collected inputs, in most cases. # The exceptions are 5 (EW) and 10 (NS) which get swapped (bounce on collision). # # To make the gas useful in Golly's infinite area, I've added reflecting boundary # states, 16-31. These work in the same way as gas particles (collecting inputs) # but reverse their direction. Contact: Tim Hutton # # Sink boundary: (or you can vent to the outside but this way is neater) # 32 # Source boundary: (haven't really worked out how to use this well yet) # 33 # x = 256, y = 256, rule = HPP 256P$PBG.NB.ONCFJGFONLCG2N2ECB2LOBOIMO2CJ.MFCKIBCKFICMDHNAKEAGOCAINLA MIEIGFALKI2CADNFIHBHFOBD.OFMCEKAJBDCGNENFNMBKECBOABAIJBFOABAMLGOIDBLD ECEIKHMLK.HMLBABDJBDGOA.DJ.FKHL.GFH2KOEOI.AHEMNDH.FDMICOJHID.KHICGM.D HGBNGCJKI.EBNJKENAOHCGE.IGIKN.A2JAOCMGCNE2OFHDNDOAKEDP$PLAMEGCEJCGL.K EDBKE2DNKD2ILODHNECKD2GNGCDCHFMLJ2DFGCJMHL2.DEBEJ2GFEIADGKL.OLCNGCNMK DGEB.HA2.BOKDFMCJCMBA.B.2AKNI2K2LNDAHKMCIJNBC2JNDBFGLCFIDMCOCBDN.ME.L IKBLIAEC2.GIDLILNGCL2GCA2FMEAMELNFJNONMICAB.JMAMGKJGEFBJIKIEFODBHGAGC HEBG2KODF.CF.EKNOL.LF2KAOFBGLOKF.EP$P.AJFJHFKD.ACOC2BCGAM2AGIAMOMDIKF HFLMFAJAOMJDL2JAFIMCKBCHGODLABLDJCFOKCHFMFKEBFEL2OHNCGFIABKICBHDAJEON OCJAFAICOGEFMJBEODLOKFBDHEGLOHIBKLEOELHFNOK2ABKO.HBN2HCAEGC.IMH.IKOJL OHKBNIF2HNFLMOGBE.BMHE2NKE2JKMCMIGLKJI.NBLEIN.OACBEH.ONFLO.AIG.E.CHA. KCDICECJGLDIOJGP$PJG.JB2HEOKCGBONCDBDKIGJF2B2IFNMCOIBL.E.ODEM2IEFOIK. E.GNMEBNOICDHDIONOKLGBF2NIBCKNB2DOED2H2DFJKIADAFAOKNM.IEL.IOFMOEC2B.D CI.IOJFHNGIH.COBJ2GONGLHLADC2M2GFDJGK.FCDALGOEI.MIM2NIKJL2FMOGMIN.CDN BFKOFIFIMELAN2JDM2KE2.LF2GENKMDHNJCNBI.CON2GIE.AM2EB2LAOBAKBGC2BIP$PL JK.JIOJAIAN.NFMOK2NFLBENMEDGIOJA2MGDMDI.GOFIF2JF2OEADHF.NEOLFGECMBLCN KCGOACMK.LABMO3JNEDKJCOHBCBMHEDIGIMABDAIGONCLFCH.DJMIOALJI2BIGE.FH.BN OJIKM.3LHGNJK2OAJGMI2AJLIBGAIN.2LENKHKEAGCG.ECK.2BMNFIA2.FMDGCALBDBHI ELH2ADMFJAEBAICOIFDIOMBKLF2H2F.BAN.FGFJ2EF2BP$PI.FILBA2NKELB2LDLG2BGE AM.B.O.N2KEGEFECLEFKMLGNKALCKJE.AEBNMKJ2LOHFKFBDLB2HDEKHJGIKLOLNA.OEJ ENJHDMKFJO.J2CB.NEFIF.MBLMDHOI.K2GADJFLJOJ.LEBFBIDGCEFGHAEAEKNAMHDK.C LHOJMKMEGHEACEIFHEMLADNAMGCLAGBHAO.2JIH3OICKJIGM2GLHDLCMFKGEIKHDMDGBO HLFOAIDNIBGB2A2NGOBNHFDFP$P.IEBIHOCLEG.ILJANHBJADCGIADO.JHMLNGJFGICIE MJKBKFHCAIFIJLJKH.GDELO.OJGC2DENANBELGBNIOE.BJHALFDB.OHOJDC.EL2HFCMAE BO2EN.DC.BGJLBLH3LODIBKJH2I2KG.MO.HLAD2C2J2NKOLKLOLOM.A2CMNJFC2BFBHG 2BKECODHAMEIOLMIMDEAH2LJONGBA.JDOMIJFBOJCHLMCNLMFAFKDA.KLJ2GFJCOABDJK DAOL.P$PGBDBDMJKI2JNMOBFGMGLOKGMFJBDLDMNKLBHKO2J2OHKFL2BK.AOMBMOIBLEM LHEOJNMFBKJKAD2GAKNDJEBDADEGDNJCM2IFM2COH3INJHONKEGIF2NMLGKGNKFEGKD.M CNEAEICNMJMOBANA.LFD2.AOLAIJKDNAF.GDHMLBABL.JC2MALGOIM2BMKE.DKLFKFACD MOKA2EGK2FMGIDIC2NCLKBOECG2ED2NBFIJCBFELFLMG2DKIH2EI2BP$PIAECH.LDCIBK CEML2AGJGMKJMEIM2KDEAIEMKEMEDAFJKCBKBDGDNICK.F.JKI.OHBGNA.CELEMND2MDN BOBEAKGDAKBICLFJ.H2BOI.GNENKNDKNCGJFHEMFALOLJB.CBIFEMGJ2G2NLHBN3IJOH. AHMCLO2FLC2E2JFJNCDJNMNMBLOLDG3NINLIGOHBDGKJDJBICLFKABDJD3LEIMJOHOHOC GON.NADLDHJFLA2JH2EAILCG2AJDF.FCP$P3IA.A2JLNGENKL.JK.EKFLOGMKJ2GICKCJ EBG.HEHKLE.GHICNMOACAIBJF.2COEJA.GDNHGJN.EJAOMDBKEKJ.LCEFAKMLOAFKEKLC G2MFNOBOJIFHOJGHC.LA2BAI.AEHLJDIBEA2O.OMI.M2BCDHEDL.EJOFKOCHDCOHEI.AB .I2OD2FNOLNK2.F.NKDF.JADE2CMKAJEA2CONHM.MNEJD.OFKBOHDIGENGOJIHKDEBAGJ IO2CFMKODBEAP$PHOM.AKLHJMLJA.JNJCJHFGEJKLEFHCILHKMDCFGFENHJNHEBKAEJIL IALFDILIME.AD2OJ2OLBFDHJ.NK.NBNKONM2NIMLHEGEIOH2MHIKIJLOMGBANA2M.IADI FGCANJHNFBGACIJEHCOAKGOKMAODNIH.ENFI.LO.NCGOKGI2DJC2FK.CBDCG2NIKBAOFL GDEOKDCFLJMIJKAO.KALMAGNCB2O2CHA.BIMFMDAGLNDBK2NOE.DBOGMI.NFDIP$POAKH 3MG2JKDJFELDOCDGBKMFJ2KMNEKIO3DGAIFL.N.FM.LBHNONGKJHDEKMCJB2GLOGKOJ.M NKANIGDFDIFJ2BGCBFJB2JCAOHI.GHA.HD.LK2CIFGBLNGFK2F2L2IMLEKIEKGNACO.NH CK2NDA2BDM.NCLOEG.DEHJBKFO2KBABIHJGKJAI2CDINEFCGHGL3GFCIHLAFCBFKIDAIB OGBLG2FEINOHMGBOAINIJA2IHJCGME2MG2ODMHFBP$PDNJKHLEKL.INOBLHDJINONB3MD IDJDEOG2ICFOLDOLB.AG.OFADJIMHGCBOMJIFLEKDMGNKJCNEMNOAI.FL.NJNKJAMOJCG F2GMC2IJM2K.IK2J.KOBEGEGH.IGINHFEKD.DOALGNKHOKAIACJAOHLCMBDICEHJCMKJM 2CAI.2CMOCBMEIAOEG2LO2DIMB2NDJGILCFKHMBAHB.BGMAFEFKHNK.FBDFHF2NHBG.GC BAME3M.NKJIOIN2IDCBP$PJ.MLJHBKEH.G2INIKCHJOBHJIFCFEMJDIO2GDCIDMAOEO2. M.I.DOEJDMIALAO.E2LCINIBNOECNLOMGKA.KIOABEIGLBIEADLOJMIL2CJDLH2A.K.GO J2BHBAFIJ.OHGBLIFBDOJDOJNHJAKOANFNMHCBKBHBIOHEFJKBDA2B.FG2ACHDOKDGIHN GHEC.N.AFBLGAFC.BFE2MJ2HMBLAL2OLFANONBDCNLNIEOJC2IEOFBIJLCIEGKCBNOE.N P$PCAIFBKFDCJM2NLBI2B2MLIN.2B.DE.LHJOHAO2DL2BLCAMKNFHKANGNMKMKAIMHKMI 2CF.OJKJABIJGJIKCJ2GINMLJGMGINKGAKCLAFJC.I2KCLJ2I3CLOKDAKBGL3JHLGOGKN FHGK2BMHLI.OAGOGKH.A.EJBJKCAF2LBG.JMNGFIBGCFIGC.2HEJFDKIMKNIGCK.HLAG. FC3AN2DHDNJC.FCM2JHLBAJK2IF2GK.2B3GNLGOEJEGOAMP$P2AEK2C2KLDEMJFOM.FBK E.OJMJHIJDIGNCJDBIFEC.BELKLBJDJH2KBFAOHI2FMJCEFI3ELMDBKNIOFEBKM3JHGEN GJ.HGOBGAFJLAKDIBMIGE.BAKAMKIOLHKGOC2GL.HNFDHJDKOFNOJELNI2EBM.MHEK.CD IOGNHBKBMOG.NOFHJD.CKMGHNAFMJGBJ.KELCMOLO2ID2LBE.JILD2J2.LNOMOKNDOIKA M2O2EHIF.CH.ENFJDKEKC2.IEP$PFMAIKHFKECHLCHLJOBHKJ2ICFNLENIBOC2GOIFAHJ BEK.IA2HIJEOJHIHCGEOF2GIAHAHOIBMLEAHJOJMFNL.BDEBNMNA2BK2MIC2JEJEHG2LM LO.D.DCHIJFK.MDF2GLILNCIEDFAJNIBDLDILBHFHCJFJMJKOHLCAHGCOFDNENICOLGOI 2EO2HMHG2MGBIEKOALOCGEONGEAKFACGKHEDALHKBG2LNL2JBOEMEJG2K2FOAEHNAO2M. GIH2OFP$PDONIEC2FNE2BAO.HMLHCMLHIE.AMOKBNEIMFLELMCBIMCOAGKMNIEJHFN.KH BDJAOENOAMAGK2MHECMBECENDHEA.KNE2MIEFJNELH2FJ.OI.2CGEBFGL2IJH.2LKOKDJ OANIKML2KLHJLI2BEHIAJELJCBDB2I2HDKBAHIN2.LIECMCL.ACGICAKBFALGCL.BOCEN HKNHF2GM.2HLMGBKDIANLMOMDFB.NFAMAOCKB2LNLJ2HG3HMFIKJ3LP$PB2FOFCN.FIJH B.EDKL.DEMENK2BMAOAHNKNBGDJOAMIFBMNIFJDMIDHAE2MGEBODMABJFCOJGKMHL2GBA KOCKI.LBMFGED.CLBGLBE.O2MADMGBLJBL.GCEOAFMEJMGNDCIBFGJCHAGFBKFJFCNMGI M2FIA.OCOCDHECDHNJIFEAIOEHDNBG.EOIKICLDLOH.CGEOF2GACNC2GJBHCGHAFAILOL GJHJKIJKNC2FHMKGOL2OBGDKLIBAEJIJEDMP$POEHNBNENIMJIEKLO2DOIEN2KJIABFKN FG2LHLHAMFBCLKFMELCE2.DKJIGFJEA.L2O.2BC3FOAFAE2FKCBI2LJHOJ.LM2AM.LKNI EDIOCEOBKNAHD.O2FAOAOCAOKDHCJHFMCFGFEOKG2ADKEMOFINKLAM.ONEOEMHIEHCMDE HOLDKODLKIDBLAOBOMHCHLI2CEOJ.JAFMBJM.DEFGMLJAODOLDOIK2CFMFLK2H.FCIODB IFJGJECDGC2IBCDP$PNFMGKGONML2BAJ.2CHI.LIMHLFKLKEF.IF2KMDLEANLKIAMLOIL IN2GHOIJ.L.CN2MFE.2M.H2KLAJ2.JILOENDALKACNEJAB.A2BA.MD.DAKFLDEJOL2G.H OLMN2O2D.F2D2OHONJKE.EHIK2MBH2.LF.FENBDEB.GEMBDECACJH2JD.ANFDOBDMGJ.L GOHNBAMEAEGCMHI2ACAN2KH2BDKCDCFEIO.MENHNM.BHLOBEDMNI.NBL2DNOM.MDCP$PK EHBJOFCGB.3B.2KDFAHB2MDAGN2FDEBKNL2HLDOEHAKLCE.OMC2LOMFHKDJDNG.NMC.DG BCFIFK.LAJEJLD2INK.D2.JMGH2IKAJOJGNEBIL.NEA2NMJ2AJIJACJBCNI2NKBMOC.I. DI2NJIDGDFAK2JMJDJOBACN.MJLN2.AMNIBHLCAGNOMJNDJBI2GMELGMNACHNCBLJ.MJ. HAI2CAODHAFEOGEHI2JLHAFGIEBIHFEGCBIJBMFKIFD.EP$PCDGLDIEAEMH2CODCFJDJG CMDLK.HAMAFGDKO2CLHJLDK.OANFNI2C.JNB2JK2BC2OCKCBIN2DBL.HOJKFKLADJCLIA 2BKFNMH.2ANBGNIHDH.CNJC2L.AEOBDC2GNEDB.DNOFHGD3.BLGELEOI2DLAKLJHCHGLF HAEHE.NDJHIONCINFMHKNBCFHAKDHEHLKIGKOLC.BKIFJANJBHANBFEGKNJN.NFKMOIKL KDN2AGIBJI2.FDEFHB2AFCBHAP$PDFMCKIAMGFAEFLDMFLJAJOADNBDCANCMJLMJAJOAE B2NIOKANMLNOLINIFGM.H.LBLCKOM2IDAB.M.AGONBHNABOLGL.HLH.ENBCBICINOB2LC NDCNGAOICLHCEDCKOFCO2DL2IGJNAGKOG.BFGFDM.ILBGDBKCNMCLMEKDIFBLBFACMAGF 2HLOBLKI2EAOIKGOHDK.CGKIBJKD.FK.IAHJNKMAGBNM.NFJEM2CGKCOGEBKCGL2DLKFC H2MG.DP$PODKN2GFE2H.M2ICKHFBKOMOGHCO.INHBGCBC2DMOH2NLEFHOGJON2J.E.KOC FCJDALIHFEOIJ2KJMINF2LBLGEOHBEFCH.HLOAGHO2JE.ABEJMG.DOJF.CE.NA2IOHJLC .NMCM2F2IOCEB2GKJBLMGN.GBKCNGNFHKECLI2GLJLM.GNFEJLF2D2HDEAOGICGANCKHE JFDLMKLA2F2AMDNCMILHLAHA2KGLFIM.MHFNMDOL2IL2IBEKCMEFLEIOP$PJDJMBLNIM. OJCMF2HELD.EILD.L.AEB2MHOIOACDG2EFICLBGNFMLFNJLGBABLBGEMADBLANIEIJELF DACOILJG.JAM2EABJEFGFBJLGK2.LMDJBCGONAIEHKJGJOJIL.O2MIAGHDFC2NJ.KM.JO NE2BJFH.ODIAFOAKHEG.LMHKJMBJKEBOEAIBOC.CBO.GIJEBH2COEJFA2MAMKDNAHCFJO JLNMAGFC.CG.DHKI.CEBFHCNCMBABE2OHBF.IP$P2NC.ON.KNA2FGOEOEG2N.HGEBEAOJ OJE2AJGOFCLEMFGNDNBK2EDCDMCF.HEFOFOHMA.ME.GMN2GBOMONEFG.CKOLDGKODMNEF DELDLBCB4AFECBNH2LAFOICNAKIJIOJ.E2MLMNOAL.NMG2OGHD2BCBG.HFHC.ILH2LDGL ABKB.2GAHJIJAFBDIDOEJGIHCGEKBK.JM.ELKNCLILC2KGOAI.LNIGJBMFCGHEMJKCHAD OHKBNIABODFKCJNIP$POEFEGIGBDLJAK2HKNCMHJFNCFNFOFDIGCKH2E.J2LA.GJ.G2.J 2LD.BDGLAGN2CEGHJCE.M2CGFJEJLDKCHFHNBKBFLJF2NFCMA.CHGLK.BCHDCDOJBNJAJ CK2OHICD2GJLHECBJNCNAN2.KNKICMDKI2HBK2NCEFCECK.ANCAIMGOKN.NBOLIDA2OMK BCIHFMBJHNI.BMDB2JNGFAMO2FMCJABGF3ANJCAJ3HF2EKEOL.DKH2NJGALMDHIMP$POB EBHG.HLJEOKIFOCE2CFBK2GJF2LGONEHOEDKDECI.LBKO2HOGE2MEKFKDCBINILGANB2K IBHCMHCN.AJBCMGHDFO.EMBOA2.CODGOD.ANL2.JBMC2F.IKFOIEMHDJKNKJ2BHLENEB. G2ECD.DBCMCE2DO2EDL2AHMHBILONEHL2MBNDCELNHKHKDJFOFH.2MHANJDBL.CDJDINH KFAGIA.GILDLDLBAM.LGMEB2KMGFKNKMIHDC.CFINOAOHP$PIEFM.LBJGJDIELBNOANLM ALBHLJ2KOJADBLHNKBFGAOJDIN.3DJ2MIMBA.EFJ2HOMNMEO.OFBIEHEHCBMIAEG2FICE .MKLEF.NGJ2FOHJE.2GHENMLMGE.KA2IBE.EIAKF2J2ML.BH.K2IF.LBENILFDBOAM.DK GMDODA.O.2INJBJ3NFGLKD2BH2.LCEFNIBN.CK2CJBKL.IBDI.JB.O.AKH.FIJ.IGOFBF MDLHIFAGEOBMDFLIAEJFCIGOP$P2CBEFLFOIDCAKBKJAFCGKO.JHMCNDK2LCJBAEFENKN KJAEONDI2.2A.JGAEOLMLDJGAD.2FKNAFJFOJOBDL2CHFMOJDOMLAHGDNB.IO.LMIOB.H M3GKBC2BCOLCDOCFCK2NMDNKFINEMG2KA2HOEDNBIDCOGOLJABODCEJ.OBGCKAGKLO.DM 2FOL2E.NBCMOKIAHMCJEHIJ.LBFDMG.FGAJBDFAOHKI2ALEDCEGKINMLDABLGOBG2FIOH LN.OP$PHM.IJI.HFN2DCDGNHKH.BANOFOJB2DIDCB.ELOGK2L.2ANB2OHDGIOGL.CBEJL OB2KGNAJH.DOLK.KFJC.O2DB2KFCAJNJNLOBAICOEMBAOH.2NDOI2MKNKJAJLCBJCNG2N HMDIGAFEMCBJB2HMBLMLMBCOEDBGCNCFDA.LJCGI2LFJ.AMLGA2DIDLDIFI2JKHFIJOIG FDGJEALMLNMOA.FMFA2.LNCBE2MEKHEL.DBKBJN.K.GEJABCJGBGHGP$PKHEBD2IFAFBJ FCGNJHEAKLGECL2BNDAGBNIA.A.OLBJHILGFHEFC2NOFKMN2CBLMEMHCK2GKJOJKDANKH GNIMGAID.ONAKJHIOJLK.F.LOENGHGNIMBKNONGJIKBHEILBMCEHGAGNIFH.AELHOHBJ 2HEB2KACBOI2C2B.OH.G.GIOIFKFOKFBDFCILNFCKCODB2HCNBGNAHNKF.FLJMFNIAHDI .L.JGOGLIDJBLACHLALCKDGCMFD2O2DIDBOLP$PHBLFJC2BO2AFKHB2EBENCNK2HEM.AC HGCFO3ENAMAIEME2DMFCFBKLHMADNKNHFGLAI2EDHLO2NBGLIKGEI.DKEHCMFNHIJNILO NLIA.EAHKA.AINIANENLFLBHA.NDBHJHKEJF2.OKJ2KI.CMIJOHMCBEFCIHOKNCAIK2L 2KGMACA.2I2.JC.MKBO.NH.2DF2HKILCKB2JNHGHJFDKLGCBI.BJDBLFBJINKEJGLBNB. COEDHIOA.NBMD.HONP$PLFNLEKCABFIGEKOGJIL2FLKD.JEMKBOCONDNKCBF.GHAIDGHM .O2GJGFCDCB.BHNHDOJNBF.IMDLFOLEAMGM2FCJALICGCEFBLNKJDNEIFLNJHJHCMOKHE MANCIHFOGME2D.KFHENHLDBHCLGJ.M2.OBKMBF.BEF.DHOFJL2BODABMJLIJKN2BAIEJO HNKHAEKJKMHJNEMCJAE.LIFHN.ELHIKIJNJNLGKIMOB2GHIKJBCHGECNK2NIBKDJDIBP$ PEHMJB2MBCL.ADHNMNB2DKDMLG.3O.HDGCED2JCFENIFJ2GFMJKAFLGMOMIMELMFKLFIG CDLCL2NOGKIJNDBHN.HNENEGAE3MCFCLKHA.J3BIK2GDCGONOCDLFJLJL2C2HCG.JBDOA JNJBJKBL2KIM.O2CO.KGNHMFGFIANLNDGJGKIMJBIMHNMBDE2CIENMGCN.KECEM.ONDJD NEOMAFJCMFLJC.DFMIGAKCOEDF2HGKDI2M2DHGOF.HLB.P$PHON2IF.DHCD.LIJKEGOIO MBIGIJH.K2.BDNEMJDHDKNBLMCBIDF2IDND.HLADJMAE2H2DOJEMGJCECFNILBD2JCHNE .OEIFKELDAGALHOJ.CDFLJADMBEL2CGECHEHAHEAECIJN.HLDLIEL2BM2NHDIDJFOLGJC DAEOJKENAO2MG.JF.NCFOBA.HNL.FJKGMFIOEODEIGDJNGOJKACENKBCIE2LH2CIAFGED IHJ2AJCME2KIFGHFME.MNIDHOIP$P3OCLOC.AOLDFBHBAEFLO.F2HJKMLBDOFDEAFENIC JFKGBH3EMO.N.IEINDFN.A.EIO.CFNHBCKLEBHKABNEGELIKC.OH2O2L.ECEDFBO.BIOI .EKMI2NCEHM2FL2BOGOGEB.BC2N2EKDCLKAMEL2OGAJKGHGNDLFKMDOLDBEDJIHJKACIF 2LM2EG.JOHGFBHJDNC2.K2DMOJMGKOMKAJA2MJF2MED2AOLA2EJKCFLEABGBCDI.KEFH. G2CIDP$PBJCM2IECMOB.EN2BGBDLKDBLDN.OKHDBDMCNGAGJBMLGMHBNH2KLOCFOGFEKJ NOEC.HOBC.MGHJOGOAJBHLO2MHJ2NLFNKHEJFMDGEL2MCD.NHI2EC2OJKBJOMIFNDN3JE OILIEJH.AOF2DH2FNB2HDGI.ILFGD2LHJCLDJLFEDED.O.LKMGJD2HICAEBHEFGOADOCB JHLGALHIJMIC.HK.AJ.FNCDCI2.2KL.HCFEKDAKGKDFO.H2OK.AMBJP$PJCOK.NGFAOID GKNFNOMAOJKEOHCHDBH.FGA2GLCN2OCBHFHNH2JOEJAIJIG.ODMOIEDCHKE2BDHMDOJ. 2BN.HFNMJCI2EJNGN2A.A.JMBHLB2IDMONB2NG2CDGKLNAKN2BJKLNOLKGNCJONIBJANL HNGBGFHELAJAJAEDIOACOKGI.GEDBEADLODLBIHJ2DCB2KB2GC.JNBAJNLJOFCMGCA.A. ACFJ2HONJD.MAJMND.N.DKMCD.2LALEIAEMBP$PD2GCH.GHDLJLG2FI2HODOIDMABAMEG N3B.JFBAECHLCHE2ILKJLOGNJLO.KNEHLO.KF.KC2GMKE2DCLAJALNMHJKD.FODJFOLCN I.G2F.KJL.ALB2NCMAHKE.KHBKNLJGOLFEBLHI2LOHNHLOGOEDJGIEFHG2DHKAJNIHL. 2FDHELHMHIGKEKLHNBOMGK2J2AFNFBKADHCFBD2CDLDLBMLBDKGJ2.NEA.LODKC2KNCBL GCMDJ.NGNMEIEIEGOP$PGHNALHOBHENMEBJNF2KIHOJ2HM.MJINEJBH2.F.LI.G.BICKN 2K.AGLFEGNOIKLKDJLGAOLMBDFOMKDHBMBCFOFEGON2I2MIGJANICBIDLEI.KLNBAC.FI .MCFOG2CJKO2KMBNFDEACMCBM.BH2DCBMD.FCE.EMALOLBEKIABMIDADMELHGNHDKMOIO EOHCJGLHNHC2AENMOMANANBGMK.LCMFAEG2KGDGONAEAIJHG.I.NLCB2FMGFBHLODCMP$ PCKBGODF2MDNH.FCELFKBFHICLOJBN2FJHDF2NCGEB.DNIH3BJBJBDLMCOD.CJEDKHGKL 2NACGCKFELG.IK.DNC.IDNE2GD.IKJNFIOCKBGIF2IKECJE2JINI2BDN.FEK.OEN.ADG 2KAL.MICGKCN.2MG.LHKDEOAOKEMHC2EJBLNIMOMAIKLD.MHCLACDGOHB2JGNLMO.BA2B LN2D2J.GC2LOI3C2.EIEF2JFEOEMK.JHFDLMNL.DKENGFIEP$PMFEGDAFBEIDNDK.OB.G AOB2GLNINCB2EBADOICLKFOELHMFOJHKHGHMNFDKCFKHDNCLEDLEFJENDMDIOBNMELDHC GL.CDNOHE.C.IEGI2FOMFHCBFNIOCADCJ.FCI.LFIMFKOILNBCLO2I2BNACG2JEHAIBEH BLIGJHNOEFEKIMCJCBENLM.MO2BNOL.INMJHN2F2GE.NL.EGKDAEMCFLI.LBOFAMCBFNB .KFLODEDG2.MLJ2KB2NJMN2GJHGMP$PCFONLOMK.NMG.GEIFLGIGJBCNLJBOAGM.IHJEM KD2.EAMCO.BEALCDHC.C2GECNDFDBNHNJKOAMA2BIK2GNH2JCALHCD2CALOFMK.EJ3DB. M3FCGOFLDGEDEL2EOAEODBKLIELCMNGHCLN2.JDLGHIFHJCGAICEDMJHDKGAHBGDE2GJM ODKGNHEFIKBFGIB.BHMKD2BCMFMHJ3I2J3FHKJOALAEGM3.H2F.L.GHDFDJ.NCK.O2BAL MBNMP$PAFLBMA2HJGJMHGDKNLILEIGAMGJFAECDBNDLIBKGJ2KOADCBFDINKGJEDKJMHM 2JGHAMHJLINJFICFJIEH2EIGMANFLMBGIGDEOKNOCI2.OFNKJDCLAHC2.IBCMLBMFMN2J IGEFONAFJIHF2LGAKOFIEJCBFCAONKBHNMI2HDCNOAJLGIBK.2IHA2EDB3ELJFDFJA2KF LH2BMGLNMINAID.F.IMKCIGIFIKGI2NODACM.JLG.2ENDM.FLNM.FP$P.NHMIKBLCOC.H ECB.JDL.EAHGMAN.K2NDHJILA2BLOMDIN2MICDNKE2IGINGJ2M.JM2HMOHKEKMOMEOKH 2KDC.2MDE.DKJIJGEKIBENGFKL2BLHOBIBCEKACBNKANIL2HOJO2JCGLBNFGKG2NG.E.E DB.DG.OJIEMFKB.3DLJLAFALMBHGEL.IHKAHCF3.CKHCIMHJMOMGD.H2G2BKJ.EGM2GOF IFBEABABHBODMAIOEMOFJHMOLGCOKANLCP$PGKMEJFEDIHGAMGLNJFJIAOM2N2LDMD2OG JHAHDIHGJKDABLNKMJEC2AFMJMJIFKLINDCFEOJ.2E.CNKMBODHNKHDO2KHFAFEKFEBE 2KLB2KDBHOGJAENANDIHLJMLCEHKCGOCHG2FEF.GHMN3ONGODJAK.BGACEBH2BIHNGO2I CHG2NHNOJLKOLB.OKFI.GNJK2.BC.IMBOECNBIKNO.GNHIKEHEHOHBMIODIHCJOANLODJ DA3NEHJFGJKEAP$PH2FNBAMKG2KOKINFADG.HEOK2MKHGH2B.KDIFJBJDJINDLEMJDGL 2KBIEC.JC.AI.GID.JDJEDFLNIMCMECNIKE2GIMDNKA2IKBOBHE2C.AFB2HNLIFHJLCEO MKNM.O.AJ.FB.JIKDFB2.M2BGBDLBH.EMHNOEKD.JCEMNICBO2NOLBGIN2IFIG.NMNDHE BGCNJBIMBEONILAM2G2JMNLBDBHOAHFHA2LGIOCMGNDBJ2AD.INJOHEKNLN.C2HIP$PLM NFKCMBNM2EOHCDGLABDA2.AKM.JKGO.ONAJMLJ2.LFMACONDHFEIG.IOMIFIEDMABFKFB O.DCK2BEF.ALIJIMAIKJOFNLFAHLNDFLO.HGCBL2A.2MBAENLDAF.EAIKDCAIANIEIMO. OBLKDOA.DBMNMAI.LGKNIEIJLEDNGKDJDAMIBCLI.LBGIL.HODNOI2CKNDMHCKL.IK2HA O.DN.ACOMOBKG.LGAKAJEGDE2NGN2JHKHDNJODM2JDF.LP$PHOJCNGKAIH2NKNAJCL2HJ LCN3KBNOCNLEOBLNEMDIDCMEFCGJA.JDJO.OAJB.LKDLJKLBMAOMBCELDKBMJHAMAC.HA FJIDBCHIHABJCHKMGHOGAOBFHL2GOMGLJOJCNANCE.CGJOBNLMHO.M.MEJOLD2B2D.L2. FKCINANGANHCNGCLFKDKOHLME2CACBNBECEALHGAJLAIKMHMENLELFDL2.GEKMD4CKOAF CIG2FMFAOCJBELNMFMBGE2MP$PJI2.D.EJFCHDNHNLB.DBL2E2BKLOFGLEBNC.I2ELNIK 2GINJOD2HDABMGAN.OMCILIFLJLEFHMCAELC.L.DHEA2HIKJDHOAOIEN2GKIDOE.MKDHJ HE2.LCIB.MJFLCEDMF.OFEFOFKEHAOH2GIKIAFOHDGFHIODHJAG2DOGH2GCKD.GONK.DL ABJAHAIDO.MIMDKHDEF.HMILFDONIH.BKFDKFJEBJKLCMDMJHAFND2A.LNAENDFBONHCH LKFCP$PCOAKG2HDKHALNEILMKDH.MFKGOA.MDMKCMFBOMGKHOKG.DIMGL2NJKHNJDBLHL 2FEACH.FIEO2NF.AEALDFIGBIMOELFBGJBHLMNCKHLG2MENFD.G2IBFNCDJGDHEGJGCD. 2CLMBOI.HBONHBLHMCA.K2FIM.EOMDALDK.MDAMAK.2EOCB.KAEAGJKAJAJ.IOLJKJHDG DJMFEMJ2IHO2AEMAFO2CFIOBEHBHOJAMDCE2.NOJEHBHJDOHFOMF2CP$PONAFKJ2.OF.H FO.LEIAHDOJGOAFOJMOBGDBJLEL.F.OBJFMDIGEJMBGFJCLHAMLECLKOA2NGHFNOIG.K 3GBEOD.JELICNJOEMGACABJE2I.FOLEK2JDKINMLNGJKIBAKBENAD.NENEOH2OGFBDL2. M2JMJFOBLACIFGKHLBJBN.HG2FDKMFBGIKCHGDLGOJMN2GAMADL2ILKENCECAFNKONI.C DFNBIJIOAM2H2OG2NLCLKC2OCKIAO.JBCIJP$PCFMOENFLCI2EAOMALCL2NMAON2DJDF 2HNGLI2G.CDBJEDNCI.AHAH.ABOAIGEJMLCNJEDF2EJO2KODAEKDLOHNB.E.CL2GD.AHJ BGAHC2OC2DG.ABNHDMJGIMAEMCDMNDHLGNMBFLNKFBFCMEH.GCGBKHCDHFHNO.K2JDA2O 3FGBKJFHKHFJEIBCKOKFICMGNEKFICHEKB.LEC2I3JC.NM.ML2BIJGJKFDLOJ.K2OME2G OBNBOLEDNFJG2JLP$PONL2H.GEDKMJGLEHAJCELB.KOEJMJFJ2B.K2BGK.HDAKAF.2OL. F3ONKEFC.JLOHONGKE2LANAJOICIJLHNMNAKOADJGEGOGF2HMFK.JMADOE.2MJNJIOCKH .BDKJBDOCMNGACD.OENEOHOBHNMFMHIO.DFHMEH.JBLHKGKLANFG3MGKDKACKHCDLEIOD .2J2HIA2DKFJAGKNE2NJGDAEMJIKIJGLH2EJGJ2FCGHIELENANMLICNI2EOHJONP$PHJC .EJNBCIFKEIODGFKAJNEGI2DHIBKBOJH.GNLEDLC.L.NAMBDCMD2.2H2AGDC.K.IF.FOE GK2DINOB.2NFEHC2JBCGH2M.BDE.B.BJHCAKFALHDINLMGFHDGCMDADIE.HMO2IHLFCEC BJCGCK.ILJ2.L.OH.JF2OANILHKJFMEG.JODJ.FKNBOHKO2HIMH3DKAF.3KINCMLEJGBC K.EMKB2FCHBKL.AMAFEN.NFANBANFLAJGN2OJEHFGLP$PFNAFMC3M.ME2GCOKAINE.2OA DLHIM2COD.NKEDGIAHDKGKMCDL2AKLO2NFI2DOAOMHJLGODIJCBI.BNL2FLNCHGO.FB2O NFDLNILGDNBEGFMGIH.D.IAIH2BGEGFDMGO.2HE2FLILKDHA2KIHMIHOGHJODF.HA.A.E 2CHACAMDONBO2JOFB.HFBIFE.HEFH2NGKDBNALKFHLKIMDMINHEMNKID.CB2K2GEHGODN JLD.ML.HJCBJAHGKB2HM2GP$PCIA3GOCAMOFOGDKL.EILEFL2KCK.IEBJNID3F2NILMNA FL2DINM2DHKGIHKOKECHLNFDEDCINEHMKNFDFAJANFGBOM.M.KCJCIEDGLHJFJKBFNKH. GKDBHLH2EJMLMKDK2FJKIOLFODIAJG.ALDEB.DKJGHFA.JKFCFHKAD2GHBMOHE2COEOKD ANON.B.OLBGDG.FGMLNCKGFMH2B2GHLJKL.GIC.EBIGCNHGJOJBJ2HGM.NFBCGNMDJI2B CP$P.FE.HFMLB.AFG2F.MOFHFM2KNJLANB.K.B2JOGAOEN.GJMHDNKMLKMJEMJIADFNG. MNDEFOMIMNOAEKLIOCJBFCLHDFAM2HOFAO.ILIMOCAMCJF.OKCGAEKGJGJE.IMDJNMFO. NFK2BDOGODEKGEBING2MHJEGCLAODGF2ENBKJOAI2CFKGOELGDBJL.IAMCKFHAE.AJL.K N2BJMLIAJD.EAOG.CJOLKOIHBNMIMKIOBFB2.AK2GADFKGEBMG.P$PAF.GI2MCMNJ2CIC EILAHDFDBOJI.MAEHEIMJM.DFJEGAJCKCDMFJKMFG2KAFGCIG3JLHL.FMEDKNJKNGIJOH NABEIN.C2MKEBJ2AIOBMNOKHMAONHAIC2JIMLGANO2JGIDICNKCH.DBLGNJAI2JNMFNJB JCIA.M2ADCDKF.IKNJGKHNMGFH.AKAN.KEKDCEHJBEDELHJEJMFELMFIDKF.OCJ.KEFDA ON.OAIFBDN2KCLKOELEBNGHOAJE2DO.P$PBAEDAKMEIDKADFDFCHL2OJ.OE.2LHCAHCHI HMJCMFM.FCOIAKID.K2MGNOKHDIK.ADNADOKFIG3KHCEK.BMCOG2AOA.OJEJLCBGLJMBN IECDCKNCGFOBN2.NALOBKIDNMJKCFLM2OMHE.J2FEMNFIFECG2ONI2.IEI2ND2.EIBFAF OMAONOJELHNHL2IANEAEBANH.BCH2LCFMJC.H2LMDNEGBJNGN.M.A2DLNKFBFHEDCNLOB F2CNAC.HBHDP$P.EBKNEKOKAKFHO.H2CKD.MIKGBLNEFENEME.2LONMHKLHBLAMNIKJMN AHCDINC.FNAG.2FDBHMEMNJ.FBHFKGBGMCJEACKNDG.GCIAEONMB.HFAFHAOELNIGDGD. MEOMKMFH2JFMELINHB2D2FJNOKBAM2NG2OJOL2GNDAKO.DOLMODJKBMBIL2IDAMNDCA2. ELMO2NIK2B2GMNBHLOAODJLGOABDBMIBDHFKHKLMFNDBJHIKAIF2DICB.LDIGP$PDI2LF BGLNANMFINJIGKAJDKCDNOABKADBNJFAONAIOAEOCANIANJKJFAFMJL.NOFAJFIGFAK2H ANEM.G2BI.ON.EDIMDINKAHCLKFKG2NGCNLMDL.KAOIGA2EGCHKFIDGAGCMBC.M.GNOFA 2LCDHKB.JIBDLC.OJDEMA.JILMLIHCEGOEG.MCAH.HAHLKCHDFCGL2NCNLHMNFBKOJFID 2ML.FKCMIBFBCMCDINF.LOJBCGOECOBEKCEH.HLI2OP$PFGMAMJ.2GMFIFKHOCADKC2J. 2KOFLBNFLBCHDL.LOH.KBF2OFO.DFLFBLFBOAGFNKC2BMDMGMFDGAFAHKIEGDGCNALCEA HLMDOFJGODG2CAKCBGJMB.HM.OKFGMGJKCGKENABDK2.CACDABDNHLN2HKGJCG.LMDJMJ FAH.FKBFA2.BLKLBDB.KH.2ANEHJG.DLJBIJEBOCMICG.GBC2GBLBG2J2FLNDOBIDFAJO C2DLNMCGJANB.HFNCILFJGJP$PEBNJMFBMNHMHC2EGDJ2DL2HBHIHJBELOFMDLHDG2NCK AFNMGCDMCFNJHNB3HGJDJOFH.K.JINEDEDFEKBF.NCLFINCIM.GIDBJG2DKCAFKCGOK2N KNCENFLAC2BOACEJDLMFCHDHN.NKBNMNCJMFLOMBFNGDKI2A2DBDJG.LAJHM3.FLFDL.J IGAM3GK3BODEAHIEOBEOJLELJ.BOHJGKDHEIANBJIBHDCDEOGFCGJAL.LDBILAEIAGEGN P$PAJMLDBND.LMN2BK.KN.HB.IJOIOLGA2E2HC.IFGAFIFLOJFHLKEID2C3O.NJMLN.LJ DBEMBEMJHILEGOJBECBMFN.AILIGKDGADMG2IADECLGKLBCMHLDMKMD2.CIKABKNKIHJF GIKOKJOD.IOMEB.ABCKHI.IMNJOHCGNCLFEBDMBKENEB.EDOMCO.C2MIJK.CO.HGOGH2I LOAEDK.J2BAKFKFAGALMLEKJDKHB2HBEHGNDOCGIFKOBGHEHNP$PF2EIJBMACFLOFHFBL KNBKIKIMEIJH.JIECHKHKGMGILELEFLJGF.N.IECKCHK.JLFDIAMK3BKFA2HIKLKFLHEI OFO.2MCLNH2LDAGK.HGBALCLM2FJGHBHLAEAIBCI.NKB.NDBN.NHMG2EINLENBGEAMJFA B.2LOG.HCAFCFBG.MCHID2KLJEHMLH.D2KGMDGMACBLMFJGIJ2HEA.EFNMG2CHNFKJGHB OAFE2KDGJCGKJELCNDEJHIKNIF2OMP$PDMAHCIMODJAGF2H2D.EINIOLBJDNDFGHEKNF. NMIKFCN2OGOICNHMNCOICF.DIEBOLMCGMOCAHLN.FDGACBDLOCIMDEG.HDNLC2JGLFHLH M.HGOH.2OIDGDEAHMKCMIBMIMHCMFGE.H.EAFICBL2GADCN2LJGHGICIFNCHLAGLELB.O C2DNOJBO.INDNGOIJCLEN.2BOLGDCADNJOF.IBJDNKNBNHMLGAFABDHFDCLMHFE.DCE.J DAHELBIAOAP$POCF.KHINOL.DABMLDLFIGAMOBNJHBGIONE2BFD2NDMIGJOKGMFMFKCA 2.F.DKMGE.KME2CI.BKELODKHKIJOMCAGIM.JG2OC2NE2DE.2LCDOH2LIBIABJGHNLH.F KMGCNINKINBEAE2ALNM.HCINOADJHLA2OIJCGABAOGOMINI.FDE2L2BCGFKFOHCMCO.DE BHIEALOF.NILCGK2LDJKLDNJNGJNFJGNJHLDLDLEHEIFI.NJI2D.CILDB2FIBP$P2ANL 2KAFOKLFGJKE.DA2DN.IHBFDNKJDFKMBMHACNK.OAGHFJMNMJMEFKLKFMO.BJNHDIAEOG HI3NOEHIBKFABIKNICG.CEOKDEOGKJINFI2EFNIGHL3JN2LJ.K2ICBLGLAK3CGNAFNAIG NKJICIOKJHO.GMHCDG.DFJCANAF.ADMI.AMJGKEKJ2GHG.JBMCAHJCKEBCIHIGKEAE2NC NHDHKLGAO2GDAHKNMFIBMAN.EBNB.NKAMA.GDHLDP$POJK2AGNMHJAOJHNJ2.OCHMHG2J BFLOKJELMHGOKOJEBMAMF.A.LKMG.JI2MGNGLNB.2LDEBCFHIMHJLCNCJ.AFBKCMKF2IM C.LEBFDNBGDODMDAJINGEGJCOFGE.JKHDENDOFAJMFLIHFMGECBDKO2L.2DE2OBAKLMBC F.2F2BGFOCNCBGKMLEFCHOGJBOAJHFJFHBCML2HAHMDBCF.IGDGN2FJB2DBLCOGLAJLJA .ADOEFINMHIHE.NIHIGJKP$PJKF2ODADJMNOGMJ2I2LOEMNDJBLE.HLHFH.FBNGHLILCE HEOE2MI2KMLNDCIOHA2NECOAMOAHIH2OAMGMEJEBACI2BJBKILK.LA.KMG2JGLBA2CHJB KGEKBKNBJHD2MDLKJHDH2KJCLNML2KNEK3HC.GMKNHF.JIOEBCLNMBFLDMIKCALHKLHC. HFGIKNJEGOFE2.ABOFONDHBH.2KCL3JH.JODFKJLADABD.GHAKIMBKIFNIJ.GDKHGLC2L P$PHC.CMELKF.H2.NOGNFECFKNBMNF.JBHMNCHAIFLKBMHJBENEHNGKACFGKIBFNBHEAL A2HDAGJLMKEDMBLK.MHCMBMIOMBILKBFKJKGEI2HEJAFJAFDEGKGKEBOJDJEAEHO2.FBO EC2N2MHM.2HOAJHDMOHDK2OIFOBOFMAIFAGF2LOF.CH2OFIBNA.2LIA.HNONHKNDJNCKN EAKOCDMHNILGBHJLFMCDCFGH.BL.KNJNJFDKHJO2F.G2OLAGM.P$P.2DJOIOKNCADLDCM KBAGFBLFAGFAMGKOMGKG.J.BGBJI2OHNDHNGIJGIJKFG2HEDIJBGMBH.ICMJIEBEJCBOF MGAHCBEMN3LF.DFJAFMHKGOBALBLBA.DJ.2M2JFDINL.HN2EM.BKG.HGOKFBGDADN2FLI N2.2DFDM2IGADIMCHO.OJOFDAJ.LJHE.NKBFE2KDHKLEDEMEJIHFLNBIDG.DN.EODHJB. 2I2JDHKHKLBHFLDHCOJHAODHDHJBJGP$PL2DBCFOLNMEJKL.MCACJK2JBIOFEOIGLCD.L HEO.HKJLMCDNKCDKMBLEFLGFMKOEK2ECJE.EJGKHFHFB.LOEMHLGJCBFH2KMBELM.OECG C.BJAHOKNIAKGLHEGKEJLEJIKIO.CALGOFIOMKD2AEBABOACIGFAJDFJEJKGBKFIB.OBF KCGFOBMCFOHIFEKAMCGMNJFIGJLHAGN.AECJAFM2LIOIOGL.LNGFEM.K.2F.D2FCD.EMH OHFGKACMNDIP$PBMKIAGBHJNLHNGEJLALDGDEODJLIHNKBNDMCMCB2FHKD2CADOF.NA2B .FLKCHGAFLGHFJKCMHILDNJEDB.DKNEF2JMJH.JMDIMO3HAC3AD.CGJDCEODNIHEHDA2D HF2JMGLKLJCB2EDEIJMFCO2JKGFBIFJFN.E2G2L2KHCKEAECO2G2CI2KCBJHIEJNOBFJ 2D.EHCAIBKJDJCJGEHNGMDMD2KFACGHLEODJE2O.CBMNDLOEFLKBLMHDFB2FP$PMFEOAK FB.INAOFJDJFLBEDB2.CIKI2OMKHNAEMJ.NLDFC2B3CLHIBCJBL.JLMGELHAMKBFJLNMJ DMKGJNCNA2IKHEMEKONDKIM2GA2NLO.MBEGAFJNE2.MCILHDJGDGIOHLN2EDNABH2ED2A KLIHIA.INICLN.MN2IOGAKJDHIGBMBN.C.NIJLFCOCDEBLNHODGL2JD2I.DGM.CGL.CGD BJOFN2.DAIGBJEKCJIG.HENH.DB.GC2HLF2JCHF.P$PJBKBMCIL2MKDMDKFIB.EJOEMHD BNALBOAOHDIAFAGINFLEBD.JH2ELIGDCINKFAHIGKAMBL2MJG2EGKGHDNKCMF2MKGF2GN LM.EBGAO.N2EJCDKHJEODILKIA.OIGIMAE.DLJDONOICNBCOAMFL.BH2KGLI3MHEOIO2A 2G.A2NJ.LDF2NAMIKF2INIELHJ.INFNOFJDJ2.JDJBHF3.JGBDIOBFDGK2O2BMHEMGKOE DGEFLD2CEMHONMLBIAFP$PIHDEL.FNMAFONCGD.FOMB2DNF2JIAHM2AKALBKEOEHJ.CLF AMDJABFB.BI2EJLDNKMGDNBJKIGKD.NGI.KBHBIBF.LEGAIO.HB2.FLOJFEMAEIKGOB2E BIDJADANBILJLOC2.IJOAD2KMELO2DOGI.ELC2AIHM3.LG.IDOIELOFHCDANJIFINLIG 2NCKJG.HFNC.GIBJMC.IA.ICKA2NKEOLIGABDLH.LNB.3MOFLFHOICHGAOM2DBHM2DGDP $PEIGFDNC2AGLMDEI2GJEBC2JCJ.HDIOCKEC2GO.MF.KD.IG.HL2IECNGJHG3B.MBGIH. J.M2FAGD.HK2HMANBFOAFKECKCH.AB.JGCJAMFBKIGDB2OBGI2CN.J.IFNLEDIJEDLMN 2MK2JE3I2EOGBCMNAFH2D.L2FKIJ2KO2DBICLF2BFDEMNH.I.DA.IJGLKLABHCJKCMADL DECEIOC.E2IKEFOGCK.H.BHDICFCBGJBN.FBOE.L.2J2O.DBP$PK2MNLEN.OCNHAJAKA 2ECG2K2JBO.BKNDIOMHKEGKI2BCADICFMLMFHADFO.EFJ.KD.LDABAJD2M.MNOH2GKIFA 2EFHCG.LFG2KDGCB.J.HAOICEF2EC.JCONJLO2EOIF.OCMINGCIBFEOCLMNILNJFGKI.C KJO2K.GFEAODMFLILDBLABLILBEIJ2BCGA2OJMIB.NEHIG.NDGJDHI2DKIONOJAJKEDBN EG2NBMAICFBOJFM4FHBFDAMIMLNEP$P2GCBI.IOCEBJIAJNODJKNJHCLOFNBJMJAOMCGB K.IHDEIDEBFLHOGHFBGJCLOLGNKFAJNF2J2H2OGKIFHCMLOHDHBM2LEKFOKF.ECKCIKNB H.DAJBOBLJMK.2ELD2HANGH2EMGDFLMG2OH.2CFJMNLJDJMHGBFJGADKLEIGAOD2CJFEL NKEJFJFMGEFINAI.BJAJALBOCEO2EFNOI.JCGDNB.CLIL.KFAEG.E.LDCE.EHDNLEHCH 2DCEJNBFEKP$PELJALEFEG2IM.MHLGHJGONBNHEH.AOKLIAK2AFH.KCNIH.DNHNFKIOIA EKEJGMEFMIBGNJOECOKL2FH2DO.EMOBCEHKA2OFDACH2CLND2HEMBO2BHDBAMLO.I2GEA 2BHN2BAEIDAHABDHIOJAHMJKOBG.FEFCBEL.2IKBGNALBC.MCBAOILFBEMBMAEOBEOGJA KGH2CA.OIAFNMFHFNHNKGEG.CAJLCEDNIMN2MFOKHMN.LNJAD.CLB.JNF2OCP$PCEFOFN IONAJN2CANLNHIJAOIOKEBJHOJIANJLF2ONJFLJNKBJEKAHALHBA3I.EOBCLJOHAOAE2G OCDOLFAC2JDLGOEC3GFNDMD2NCEKBOHIBMDJGAHDICBGHLM.HD2BD.JEGK2H2DFICHDAF DFOG.MIJE.KFNHO2.IAM3HKAMC.MEOCBKOICEFM2CDADGKMLBOAIOB.LDOBM.G2ILBCMB NHBNEHCJDHJIHFLJDM.LH.LDMEILGDKENDECBDP$PKJEDGMJ2CAODOECHDCOKECNGKFNG H2.IOCIKDHDBDGKMCOMEJODL2G2HOBJALNEN.KL2BDLGCNMO.JDKMDOFAGKECIMALM.EF CBCD2LNABKNKLBGBMHGAN2IJMCMKOGBKELNGKDJIEKHNCLJ2LGNDF2D2JMOBNG2BIEB.D FANMIJ2NBMHCJBILA.LI2NKJKAD.FEBA2JME.NMGOM2CFBKG.MG3HNCDHBOEMDA2.EBJC BONMDFIFH.JKCMGJCAP$PKOJAIBIAFHLKMAIBDLJKCJ2D2CME.2GBENAMA2KNM.GINMEC IGFO.ILFNDFLGMELMFK.2BJFCLMCHFJLDNJ.NDJBFGEO2.LHAJ2IHOID.B2IGIMKBNDF 2CLOFNJGDIGAJIBLGJBALK.NLIEHMGL.EKBOEAFDAGOJEG.EDL2OJGLIMAJMFOGN2OHO 2LIBA.ELHOGDA.LMGCI2OMKN2AKEANMAHE2CKD2.CG2HFCHDBOAOBDB2IK.NJGCBDAKHB NP$PDLNIAFDOLNHGHL2OINDNKLIB.KOBLDABMJBMKLAIONOMIGFNKB.MJCNBD.JK.CBEB 2IGJEIGLG.MDKCMAKNBH2CKJ2N.JMHLNF.NIALHA.DIOAOHB2HDH.JFOLHENOKHEMEJ.L JLF.AGABLOFIDM2NO3HMOG2KFEFGDLH2GBFA2N.NIE.MAHAENFNLCOEADJ.AO2NMEDAHG NEFJCBHBE.K.3GI2CBHDLKMFIGCIANJBLDFLEK2OJKOFCH.GJP$PNFEC.GFAECGJOACGC DOALCOEKLBODFGLKDFJNOLE.BCO.JLFDJOBEOCHANDNLMJIO2J.KJAK3IGCI.KDCIG.JN JOHLDFGNHDGCD.AOJCHN.KJKMNKJCA2LEKJNEK2MELGL.DKEFGLBLJEBDK.B.J2DHIEFB 2DF2ICA2NELNBDLENEL.DM.IANABKFAKM.MDMG2CFKAHIJ.IGLEAECKFO.BCFD2MLE2LA CI2FCNCGDA2LCKHO2DEMF.ONFKA.GP$PIEAB2MNAB.2NAC2MGHIFGOEGDMCM.EC2LHAMC F2LAICKGCKLHGHFBOE.EGACMHLF2OG.HMKONABIGHJL2CNCM.2A2.GCJB2H2FAKBIB.CI AEIOE.ILAMHFHCOANFHNIAMOF.HDLMIG.HG.IHBE2NFAEHN2OBIGEMJFEL.INBOGKG2IC ID.HEFDCKMBIH2DFEAFHKDEBHLOF2DC.KBHFBDCEN.NCKDKBDGJCJK.KM2FCGOAJBODOH DHAFHAFBJKP$PODM3CKLOIG.MAFAENAKMD2ICEIJIHGAHEMAFB.CNLJBNEAIELFBIHNBN LAFJD2ACONHLAIKLFOJIDFKOJADAMOJ2MA3.IOF.CID.KJDAECOFEBNEGF.GFI.IC2F2N CG2LHABKCDBG.JOMAJC.AMFALBEKIBNMIA2ONAGLBHJ.ALFL.LBDGB2O2J2M3AGENIGJB ELOMJGJNDCJFAO.HCIHBAK2JEFIF2CNCIHABF.AKEBOIODAJHEOAHCBADP$P2D.H2.HBH AGHBMIDJKINLMEMDNFCHOFCFEGEIEMFDCNDBJALJFHCDJIHCMCNFDHBJHMEBMNKEGIE.A ONAD2LOMBDJF.FHGJAH2M.GJN.G.CMEGK2N.GF.NLNB2NDBFH2KJOGB2IO.EMABENDJBA BOEMGLJDKDCNJCHFMAFCEDO.FHBNJB2HGANFIGCAONC.GD2.JNFHLMAG.MA.CENMA.HIH JHKMJOGCNBE.3KH.GLIC.DBALHAIEMNO.M.KMP$POICNONGEOJKCAHC2EIBACOAMN2BDA F2DEAKG2NDNJNIJ2KI.EDB2AGLEO2GMJMNLCNBLHOKEINCMIOFAKL.DJGAHDJCFAJMOJD CJDNIFNDLK2L2HAGNHENFN.ALEMOJBHOELIJE2CDO.JHFIB2CBKLCADGDK.FB.NACEGMA NL.HFEAIO2KG2CINC.BD2.DKIJGKAIKOD2FEGEN.L2NK2COIHJL3HBGEOGOLAKBH2FC2I BLEDILCOLHEOAJCAIP$PHFC.GEOELHDJD.IFAIGCBNJGJCKAOAMEJDADJGDOIBNCGL.HK I.I.GKGL.BLGI2MJFA.GLNGDNDOIAIODLOCFOAHLGBMDHLJ.EDBGI2ONK.OHELNOGAOBK LCAECDNFODFJ.OGJCEODJKDF2LOAM.O2DLFLNCK2BOHLMCOJH.CHE2NCKCN2ANIM.LND 2NLALJGBNKGBEKNE2HKDNGJHL2AMIBA.GMAOBNLGEFEHOG2A2GMHACFKONKBEAFKFDHJP $P.IKEGKAJLK2BMFMALBDMCDJNEOKHDCHI.LG.NJAIDEFOACOKBJKADJGBNKMBJOIEIHF 2CJ2IDA2CJFADNFA2.EOEKEIA2NGHLODMNDHAIBNGJKNOAIF2DE2AHLFAMCFGKHDHFGHO GD2GEFGF.BLGJ.C2.HCF.GLGI2FG.EILHEHCJK2BMDEJOADGEMCJNKGO2HN2CHEHEIM.G AKNIMK2MFAG2NJHJACK.LBNLFOCMIKLGAHCLGMIHAIH2BOC2DP$POBKGFEFILOAIAICFA BN.KCFAH2JMHB.KF2KIEFGF2BO2DILFHDFKACL.C.AKNFHJGOE.BKDACO2CJ2ENAEHDCD OEMAOEIEJANLHAK.HFJOKANMLNOLINIFGM.H.LBLCKOM2IDAB.M.AGONBHNABOLGL.HLH .ENBCBICINOD.H2DN.OA.FDFOIJLHM2JKLJC2GKDMJ.GAOJFJE2BHB2IMGHIHIGCBL.AB JDGFENGLEHDN2KCLCHEBDH.I2MHGH.P$PE2JH.GEBNHBFK2H2OGAC.LKBEJ.LAGLFNA2M HGA.KL2E2.MHENK2ALOJMIDHO.B.EOBFC.ODAODABJBNHCHMBACOHLF2HCLOLDMDAJKCL FHOGJON2J.E.KOCFCJDALIHFEOIJ2KJMINF2LBLGEOHBEFCH.HLOAGHO2JE.A2HELAOJO GHCLFEGFMA2NIAHKNOLM.NJDHCMBFHIKHGNFMAODKBL.AMHEODOGNDNBMJDJDN.OIDNHE JKFDKILCABIP$PJ2EAK2LCM.E2HDMENMEIGEOFEIDGADAH2F2BKMFDLBCDOA.COGACD2E G.C.JE.IGCAOCEAM.BDCJEHADCIGC3.C.LKMJCKH2NKCI2LNFCLBGNFMLFNJLGBABLBGE MADBLANIEIJELFDACOILJG.JAM2EABJEFGFBJLGK.DKNHLCEBJHO.M2L.DJCA.GMAHMAJ KLCEOAJGHK.A2INCFCFKNLHNHMEOMLFOEBDFNMBNFJIENEOGENOFMLABJKACP$PBMFIDC NCENC3L.LJDC.OAMONCGJLFLHMO.ONAKFNGILICBN.BIDNDNACE.IEFGKOLAMC2HO4D2A E.2JHJOJNDIDECB.OHCFGNCGENIDNBK2EDCDMCF.HEFOFOHMA.ME.GMN2GBOMONEFG.CK OLDGKODMNEFDELDLBCB.ON.C.2AMN.A.KLHMO2IJ.OHJADILNCGFLJK2NCNCIAFM.EOBF .HANK.EAECELDF2HDHOHOL2BIA2KHKAIGAKJKBP$PFHIML.NG.H.IH2JC2IMAI.AGFMLM OGIFKCLJG.HKDKNMKL2BMHMDNLJHCAIBJBHJC3LABF.NGJ.BLC.BD3CM2FIOALEA3J2B. GKIFB.G2.J2LD.BDGLAGN2CEGHJCE.M2CGFJEJLDKCHFHNBKBFLJF2NFCMA.CHGLK.J2E BGEC.BNEFOCJACFN2GN2.J.A2KJIKCACODO.JE.MKFCDEDGA2M2K.BLOF2DBIALJFOKBJ DKAOEOKN2JDBEJL.P$PAMCKEACGBKNJCLBLBCNHDIHJIDOCEME2CHMOBKEOH2A2LF.MFM L.FINH.IMAK.EGFBE.GIO2LAMJBDFH2AOJCBHANMLMLEOH2.EKC2HJ2KO2HOGE2MEKFKD CBINILGANB2KIBHCMHCN.AJBCMGHDFO.EMBOA2.CODGOD.AEKEKC.3ODKOIJDB.ALC.DN CEMGAFEDOGHIFC.A2OGA.ICDGKBKGKLJMICLKHFMIFJN3LA.LMOIAF2DMJLABN.AP$PNG LMJC2GMAKGODFGBKGKANEO2AEMN.CFHAKOKONLOGHFOILIE2.JAC.GOHKFJDFMCLHF.C. GDIO.NBFGLGOM.MLHJLB.ECLMKOJK2CM2DIN.3DJ2MIMBA.EFJ2HOMNMEO.OFBIEHEHCB MIAEG2FICE.MKLEF.NGJ2FOHJB2GMGA2O2IDCGKBDHBCK.JFHEH2ENELGDFBJAJEHLI2J MFBNGLKL2IHG.JHGC.KCDGIBNMCNKGKHEK2OJLAFAMCLP$PBNDEG.KCENHL2ND2FHIMBD KCNAG2HEIBKF.M2A.DFDKHCIFEBA2BELKMJ.GJCDAFK.DNIEDLJND.BNH2.LJFEO.FID 2IOA2F.CAD.ACFKEONDI2.2A.JGAEOLMLDJGAD.2FKNAFJFOJOBDL2CHFMOJDOMLAHGDN B.IO.LMOAGK2IENCDKNODHG.OD.GEKGK.LACMBJHMLENJNAHMBCOKMHDFKFOHNBGAM.BN AGLEMCHFOINMKDIN.EGDBKG.MIP$PCM.2J2ML.BCALBMI.CFOKHKEHB.HINKAHIDCKEND IHD2IED.DNGCIOHAGMH.HKGLKGMFOELFG3FBG.DMJDNKLOIGDNGECMGOMKIKAB.2NB2OH DGIOGL.CBEJLOB2KGNAJH.DOLK.KFJC.O2DB2KFCAJNJNLOBAICOEMBAFENGELMOCHFCG 2JBLCOJDKOHCB2ENIML2AH.BG2IEKNMD.DMKMFGCBKEB.JEMFBM.HACOHIBMLKHOFHEJE ODEO.HP$PFDH2BAJBLBAFMNMEBAGDCHBGNLHGNAMGDAEKBKNENEJFKIHKLF.2EGCBJDKH IJFNMLNKGHOBJHKJ3OFBJL.LJH.GJ.K2AK2.O2BMOGMHLGFHEFC2NOFKMN2CBLMEMHCK 2GKJOJKDANKHGNIMGAID.ONAKJHIOJLK.F.LOFBJAD2NK2FGOHACOBEFKNHNIKNM.BAIG ENBDEFIGLA2EAFGCBJM2HD.NOI.IAGDNLKGBMLM2AD.ICOIKH2CEJFJ.P$PG2JBGABFBI GEM.BGEDAKGEKJD.ID.N.G.KFCMAJOK2NA.AFBHIDNFGDNDGDMBMGHN.AENGBAM2DHLEB EF.DJOFLH.OIMHGMKOAHMFOFI.E2DMFCFBKLHMADNKNHFGLAI2EDHLO2NBGLIKGEI.DKE HCMFNHIJNILONLIA.ECLKLEBJODKIOICA.GKNICNHBLJEAJOFAKCLBEGKNFNJONOFEGJA EDLNJOMOFHFCIHA.KJENLCOJF2LCEDKJKIDKJP$PKLGLBKEJCGLGHJLOID.FIDAJBDCMI .DGOMAJ3.GLNBOFAJMDFE.M.EKJNCFOLDL2CO.KNOLKIN2GHLAIMFHGIAGH2F2AGHCIK. OC2OFKDGHM.O2GJGFCDCB.BHNHDOJNBF.IMDLFOLEAMGM2FCJALICGCEFBLNKJDNEIFGD JF.EF.FDEHEDGOJA2IDMOENLEJGI.GNKGACJ2DMEG2ABLI.LFMNGIE2FGJEL.K.ND.MNL ONMAENEIDI2BMEDJIP$PJBEJD2EMBJGLFJKLJLHIJEKMEKFJCJGM.2JE.AOMCDBNO2AHM DGFLF.MCBCOHICACKH2GKDKABK2FBK.NGHFEBNBLFMANEI2MGLNJM.HF2GFMJKAFLGMOM IMELMFKLFIGCDLCL2NOGKIJNDBHN.HNENEGAE3MCFCLKHA2.HFCM.2OEFJHFIN2OLDFMO ELOIOMHNG2OJHFELKGLCHGF2OI2HKCNIC2OAL.EBGFEAONFGDONCNMC2NFA.B.EIKOP$P ALGIAHMLIOADB.IACNBGDOFMLDKNDEOKN2MNCFLAHONG2I2JGLI2B.D.JCLKFGHOEKIMO ALBO.BGHMCBOHKEMDKCHANGNFNDJKOI.A.CAMCBIDF2IDND.HLADJMAE2H2DOJEMGJCEC FNILBD2JCHNE.OEIFKELDAGALHOJBI.DFKINJ.MDBACGJ.O2BOJEDO2ILIJHIAMGCLBA 2FDB2LBAKDCHDCEOICLN2CBEJH.BHLK.2DFGMKEDKLAJAHCKP$PECD.GJM2DJEMHKMC.H E2DMIEDBCDFCAFNBJNGFAFG.HBNOHICACDGMGJBIEOJILBGL.CAJDIBGJDFDKBK.AO.I 2.OHAOLIJA2CHMEIGHABH3EMO.N.IEINDFN.A.EIO.CFNHBCKLEBHKABNEGELIKC.OH2O 2L.ECEDFBODBMFJNMEJB2OHLM2.MGICHMKBDKNCNAEKMHGNED2.LCJMCNON.HI.OHA2JM 2HMAKELHKMGHJBEDADHNOAHEDGMC.P$PHINOG2LCIG.NJHKCEJDNLOIOG.2EBG2M2GF3K ICBKCEDFMHM.ODOJGMIKB2NECGM.MBAKF.2ONDGIKLHMJ.MACLEOE.KDEMLMILBO.2NHB NH2KLOCFOGFEKJNOEC.HOBC.MGHJOGOAJBHLO2MHJ2NLFNKHEJFMDGEL2MCOJBHAJ2B.K OCFHGKJEJK3MEGIADIJCG.MODLI2B.OMBGFAILNMOID.GBK.INILCGIN.DIEBGDEBDAIJ BLGDHLFLP$PIDCID.KFBMLOLNONEMCHLF2.IEOGCGIAEBGCLEF2JK3NIBAFBEJH.IMOH. EMAFAH2LIKOMNL.2CJEJ.EJHOCBJHIFABIH2BLOIGLGDAGFHNH2JOEJAIJIG.ODMOIEDC HKE2BDHMDOJ.2BN.HFNMJCI2EJNGN2A.A.JMBHFCOADA.CGLKDABGNBABCFBNGOD2KCOM AGBMHKIANLCNKJAMOB.GMGEIFKOMJDBELILMNIBI.LOELI.HGHFHLMOFAP$PACGFJ2HLH CBACNHB.FIKNEKLD2MHEFKMNEO2G2JDOCKEGM.CIHIAEG2.JMFLD.DHDONEHLFM2B2OAB GJEGJ.NMDM.KCNLBDE2OGCLJCDLE2ILKJLOGNJLO.KNEHLO.KF.KC2GMKE2DCLAJALNMH JKD.FODJFOLCNI.G2F.LGHMOAM2IFLFKONOI2FJLBIHIEHFKEMAOKEAJGMOGFKHI2GAOD CIHJL.F.CEBD.CGE2.CLOLMBC.OJIHOLEHCNDKP$PBHFGKJEJKBEGCALMGACDAGJAENOL HJFOAMJKL2MCKBCBOLICHJIGNAMDAEGN2EF2COMAFDCJLFI2G2.CHJNCHANMKEJNEHEFK 2C2B.EBOICKN2K.AGLFEGNOIKLKDJLGAOLMBDFOMKDHBMBCFOFEGON2I2MIGJANICBIDL .EAKFOK2EDMKJEKLNEGOF.JMDADBHE2AJHKNF.HLHKOFLNL.FKDLIKMI.A2ICMFBFCHEA H.IKBIK2NB.F.2JBIGIP$PAKMODM2DEBDNEMAKIL.FOFEHOKO2HDCFKHGBNOMFEAIL2EJ FCMANMGCG2HDIHF2AJCFJGMEG.MNFJMOFMDJABDIMGDIHINIEFCMBEHMGMH3BJBJBDLMC OD.CJEDKHGKL2NACGCKFELG.IK.DNC.IDNE2GD.IKJNFIOCKBFDHFGEOGBH2FG2IAIMKA E.OCDGAOM2HOD.HEDIO.JH.OGCDI2ELDJFB.MEJGDBAFGO.EHK.IBNMNOBHNMC.HEMGFP $P2IHCEA2BJCFO2.KHMNIFNLFNMCDAJEAOGAMJDIHONLEDKGMNOGMOM.IHEMLO.EJL.2O MO2G.GDNH.OEHLIDBG2IGDHONEKNKD2EOM.LDGMFOJHKHGHMNFDKCFKHDNCLEDLEFJEND MDIOBNMELDHCGL.CDNOHE.C.IEGI2FIJCMODCG2E2.IE.FDIK2DJF3JCDAJNC3H.DLDLK ANG.NL4M.GLJNANDJBGBE2KB2HIGACMDJHI2N.BEFEOLHP$P.GHKLICLEACLEOHAO.MK. HJLNGCHAGHBHJ2IFHKEJOLKOBG2LHEJG.AL2MJHL2CEFNF.D2AH2MEC2GJBOKGFB.BLGC .CAL.IMEAIMNOH.CO.BEALCDHC.C2GECNDFDBNHNJKOAMA2BIK2GNH2JCALHCD2CALOFM K.EJ3DCGCHFHEGMOMDLAFECLJKDEOKEHBLEBF2BNMDGBNLEOEFHF.E2ALDLFANDGC.OHI EC2GJCMCHKAMBCIGJL.DABNEKP$PDOKOLAJIDCBCNH.FJAILKIHMAEH2.DJHLKB.HGFG 2IMOIDGBLFM.AGAFGCBKHMJMGOGMNEKOFEGI2JIM.OLBGDHMGKDLM2BGLBO2DKLFBDCBF DINKGJEDKJMHM2JGHAMHJLINJFICFJIEH2EIGMANFLMBGIGDEOKNOCI2.G2BF.AJFB.OA HAHFG.2CIMAMLOFEDFDBNE.G.HFENHM.FCLHJDHOGI.LIEFOH2J2LOL2BDG2J2HJBGECI ADB2AOKP$PGMHLKAJ2H.3FKAOIO2KJBMAMKAKBOIOLBIHNEDFGEH.ICDELMCGAEFLHOJA NKMNFMLOGDIJO2DCN2EGMIDAKJLBDLMHDFLGBDO.J.BFBN2MICDNKE2IGINGJ2M.JM2HM OHKEKMOMEOKH2KDC.2MDE.DKJIJGEKIBENGFKFK.BMFI2EHEOHG2O2DIED.LAD.ML2GIC ANMCMBD2JOKANEADMCJKAKEHGLCJKBNLCNKBG2CD.KEOMALN2E.CGLALP$PMG.BGMKCDO CJDJFCGK.CHGFOE.DJEJBA2I.DNEBDCE.A.CKMHMEMDCGCKEIBOHKIJDLELBH.2CHCGMF M2H2DAGCML2E2IAFO2GEMIGKHCBLNKMJEC2AFMJMJIFKLINDCFEOJ.2E.CNKMBODHNKHD O2KHFAFEKFEBE2KLBKFLJAEJG.MNCGBMHL2CNEMDOM2H.HJL.HJGFNOMKCLGC2FLIHEF. N.MCFJLHOLKOJKECHNAOKCMKBGJEBKCFIDOKFP$PEMFI.LFELHOCNJ2KNAHDGNKEIDKBD KDOCBLHCLIMC2MF.GANJAFM2FJMIBNKDJCJLDOH2JMCAFE.HGAHEO2FGNMNKBFJLEGLHK .MNMBOKLEMJDGL2KBIEC.JC.AI.GID.JDJEDFLNIMCMECNIKE2GIMDNKA2IKBOBHE2C.A ECIKJIDBCDCOAK.NOKGFBKGOAMAHIBGCJCEHF.MOGDIFICECNBGOKEOHM2GCGKOJ2CJI 2ENF.LECL2DMHJ.MKOEP$P2NHDHEACNEB.KIHGHGICIDLCK.FLOAOLF.EKMCA.LDOCDGC ACEDIDLFLIACFLKD.OFIFNJ2HNAGCJ.MIDH.CABOEJ2CEM2OJCMO.CJNFGACONDHFEIG. IOMIFIEDMABFKFBO.DCK2BEF.ALIJIMAIKJOFNLFAHLNDFLO.HG.INLFLGHDAHAHLMLEB IHBGAGALBHKC2.GJ.AONKHIMK2HEJFOMGLHD.HF.2LIHCLI.EI2L2KIEJMFHOFINOHBLJ P$PN.CNKHFNFBOFODC2MIGDGNOCHKC2GKDKNGOGFDMHIALA.MK2C2KBEBHOMDLGABOMBE MEF2L.2G2DEF.MGAHOFIOCFO.AOFKN2AIFOL.BNEFCGJA.JDJO.OAJB.LKDLJKLBMAOMB CELDKBMJHAMAC.HAFJIDBCHIHABJCHKF.JOG.OKABOM.ADIGFNGH.ENFD2.ABMCGDHLAE OI2MKBMOHKHELMGNFOJKMFCGNM.A2COGNGIF.DGIDFCNHNHOEGP$PDGIK2DFNOKOEHGI 2HAJDLIEDJNAL.2DNO.C2LNMNFNEKLFEMCDLGLKLJGBHNGMEOMFOLJ2HIOIEOHBNKFEGA G.JOGIAMEACOLNDANHCOHINJOD2HDABMGAN.OMCILIFLJLEFHMCAELC.L.DHEA2HIKJDH OAOIEN2GKIDOE.2KCJCH.DOBAEKMDN.IEAL2HNGIBFOG2F.CJODG.DNENIJCEJEI2EOFC 2KG2CELAG.LAO.ALMJO3CHJ2FDODLEOP$PIOMAHABDNBNG2NFHNFG2CIBG.HMHKOAEBH. DKH2IOKJ2EILICJBMOJGKFO.AIBNMADHA2N2L3OKNLE3.GCLDN.LIEOCIJCFOLHA2HLID IMGL2NJKHNJDBLHL2FEACH.FIEO2NF.AEALDFIGBIMOELFBGJBHLMNCKHLGMHBEMJKALF AEBHN2GFIE.OJOEHAOB2KIGEHI.KL2KOFCBCEM2.O2DIBKOJMO.LMLDOCDLFMD2HCF2KL GFENKOAFMDP$PNBLCNAFDKBLEOINBDNAOGCKBJEJMHABI.EJDM.K.MAHA.IFJO2E2BIA 2IGFJIBI.N2FNOFCHGJLNANFLCFOCA.NOGLJFEFNHENLBAKEFAFMDIGEJMBGFJCLHAMLE CLKOA2NGHFNOIG.K3GBEOD.JELICNJOEMGACABJEIHALEDHA.OAONGNEDBDFI2BOGAHDJ 2NHIOLFHFAC2LGEKFO2DNCLG.FGHKBNHABEJIGLGBOMOCJOGNM2NK.FHI.FMP$PJENFBL FBFCFOJNJIDBN2HEGBNM2DNCADJFOMAGDHAEKJIJIDGJ2CEBEFKICMHJBJHBJ.MN.HDEL GEKEFJIH2GNLDAIOL2BA.NFEKCNCMDNCI.AHAH.ABOAIGEJMLCNJEDF2EJO2KODAEKDLO HNB.E.CL2GD.AHJBGAHC2OAD.BA.OLIBHNLFBCMNKNEJDADKAK2FOKFJBF2AN2F.IEKIB DJMNIMOKCBNKNF2DCICDOIB.MEIHN2DHNLMFOAIGAP$P2OAH2IFECKLAILBOGJNLDIA2I KMHIL2EAKNEFA2HL.OIBFMAJB2MHFBJIJE.HEJB.JOLAEJCB2COLHNMOKNLMCH2OJOIBO 2LE2FNML.EBF.2OL.F3ONKEFC.JLOHONGKE2LANAJOICIJLHNMNAKOADJGEGOGF2HMFK. JMABAJCMNMOMLHAIBNF2DJGFLIMNGF3EFGBJOBAIKBFINMECJLNANALDKCHN2AHOBAH2A D2CLIF2OCAIGFI.MJOCDP$PJBA.H2IHGNKGDN.LKBGA.OK2CJABHMCAGOLJDGKCLEO2MA IJO3IKBHNOHO.MOANJLDF.FA.FAMNBIJKAGKHINBCMBMEJKGLHGECECGNO.NAMBDCMD2. 2H2AGDC.K.IF.FOEGK2DINOB.2NFEHC2JBCGH2M.BDE.B.BJHC2LGB2LOB.2FEGCAMFKF E2CMK2LNF.ILDCDLDAOHOIJCGECMHMCAFELOCFIJCEKJKICKBELINIMJOCLH2FB.C2JIE P$PMIBOCDNMJDAMKLCKAIC2EIL.OL2CBGBJAIMKNKJMHJHMAOHFIDMNBAKFCBCJNBNH.G 2BFHCMCDMNE.G2ILMFHMK2FGJ2B.DNICKMA.I2JGKMCDL2AKLO2NFI2DOAOMHJLGODIJC BI.BNL2FLNCHGO.FB2ONFDLNILGDNBECGOH.H2IEFOGNFIB.3CNLM.MJL2CNHILABFKLC GCNBLABKLFGOHENBABLC.D2JFLCFLOFBDJLN2IFIDAKNM.3FP$PENMNKNADHICHG2DAFI GDADE2LI.2FILNABIEDM3CJLNC2OJKHBJLMBOMC.CMBDIEFCIAM2EKIMEJNHJNFMNLDM. MOGFLKCBFOED.MCGLAFL2DINM2DHKGIHKOKECHLNFDEDCINEHMKNFDFAJANFGBOM.M.KC JCIEDGLH2JN2JDOAGCHNCKANKCJOAJDOAFJ2HLIDNFLB2LHMO.2JODJEAJHONEJ.JKLKO KJBNC2EFNI2FCOAGFC2JODLENKINP$PN.EJOEHB2A.H2ALGJGMGECDKDGHLBINFANLJOC GCFE2.JAJ2COME.GELIFLFHFIK2BDLKD2EAHGLIDE2NHBJC.BEAIAJKJHMNHEHODJ2NMH DNKMLKMJEMJIADFNG.MNDEFOMIMNOAEKLIOCJBFCLHDFAM2HOFAO.ILIMO2CBMCGHIKEK FAKL.IAMDFG.D.JD.DMK2FBA2BJIN2OFMIKIJ2BDCDMBCNF2KAIEIDLOE.MNBF.BNKMLH LIOJAEOEDP$PGFLGI3ONJO2LGLG.NBIBN.NJLJNHALGNCGIGNEIKG.G.HMALG3FJFNDAE 2N2KFLMJOMIJDLOIFKBHLMIAMJM.LFGKJKLE.H.FJ2CLJNCKCDMFJKMFG2KAFGCIG3JLH L.FMEDKNJKNGIJOHNABEIN.C2MKEBJ2AIOBMN2DI2GNBJHNMEKFKFIGBDICDFICM2CBHK 2ECBOCGBIO2IG.B.HEL2F2MHLKCJBIDGLKNHJ.2LE2AIOBINKACBCKDOP$POKJDM.B.EJ .MJNK.JENGKNMAHNC3AJHMOBOJEJMHGCLCONEMBIOCLAN.ECKF2HE.GK.OEALGMA2MICO G.DJLHC.HEAFG2LABKNLGALJDOIAKID.K2MGNOKHDIK.ADNADOKFIG3KHCEK.BMCOG2AO A.OJEJLCBGLJMBNIKCH3KENIDCJAGCDIOEADINANBGJNJM.A.LI.FE2BID2C.LOCKABGH L.H.BHEF2IOCHKNILBD.JICFJDELAJHEAJP$PKCIECFMJKMEFHF.KIBGDKHBHJ2CGEK2N BMOB.2HMGKBABHCBG2NFAGL2.CI2LMJ.CNAENGI2K.DEKLNGFAIDC2JECNAJGDMJ2BFGK .AOLBLAMNIKJMNAHCDINC.FNAG.2FDBHMEMNJ.FBHFKGBGMCJEACKNDG.GCIAEONMJAGJ .E.K2AM.ADHNMBDNKEDEDLGFK2JL2DANLOAKAKJEMDFNDAIHOABAGBD2CGHMG2CED.AFO K3OJNHNGNJNO2DP$PGLKANEJNIMG.HEHDOJILOJBLGMIGHCFBFIMEMCNIECHNEJLADGEO J.HOAGFG.FLIGMDFCF2LGKBC2HB.AKMC2GKDIKAKI2EGB2CLHMNAMCANIANJKJFAFMJL. NOFAJFIGFAK2HANEM.G2BI.ON.EDIMDINKAHCLKFKG2NGFCDJ2EHIGDCNJCIDJLKOJFBH 3D.AJCJH2DCECJ2LAHJFMOALNAEOKMDJK.MFAOMBNE.LJMAM2DBGEIBNL.DCHIDP$PBFE OBCHLF2E2DJF.EBHM2FKAKND.KOHEDADHLFK.GJCHOCOJL2FOFCL.BFDKENCHFKHNKIJ. GIFIJN2JOBJEK.LA2L2EBHACM2IBHIFLIF2OFO.DFLFBLFBOAGFNKC2BMDMGMFDGAFAHK IEGDGCNALCEAHLMDOFJGODG2CGDIHFLJFJKCBHBCM.FAEOLBLENBNCHJ2MJFA2CIADBML HI2.DCDJADGACEKOJHFAGLGKFEMHOCBICJEGB2EOJLHKP$PNFJH.INAHIHGBLMKLNAG.D JBFB2HDAOCBA.N2IHFKAB.MBOIDF.FAFHDFOJDB.OA.AMLDJEILIBKFOC.BFGN2ANCGOA GNOIBH.HI.LG.BNMGCDMCFNJHNB3HGJDJOFH.K.JINEDEDFEKBF.NCLFINCIM.GIDBJG 2DKCAFEKLAK2HLGLBMAIDEFDLOMDBH2.KHDHDEKBACAF2CD3FBN2JCKFEFL2CDMLFODLA DHBIE2HFHACLNJLNCLJOACDGP$P2KMK.I.2BLEMLMDNE2JKJHDHA.CEO2NJHJLMOGDOIB IAM.IC2GONMAEJC.FJMOFLJMIMCIJKFKDJEIFNBLBAHEJNOBOC.NHEIOAEOFA.DJFHLKE ID2C3O.NJMLN.LJDBEMBEMJHILEGOJBECBMFN.AILIGKDGADMG2IADAIEFNOAMBC.BDGB 3OHGB.LGE.NBKGDGIBDMN2JBDK2JEIAKIC.EGAM.2CB.FG.EOHAKJE2MNJIELN.2OK.DJ LJKP$PCMCMFLOCFOHEKAOFIFNFJHLFDFNAKLB2MEODMCGKGCECBJFEDJ2KEMBGHNLC.GI KJFBDL2EJLJI2BDLH.LOJBD.GCGL.HIODJOGFD2NLOEFLJGF.N.IECKCHK.JLFDIAMK3B KFA2HIKLKFLHEIOFO.2MCLNH2LDAGK.HG2KOJNGJL.FMEBMIJIMF2LG2L.IOEKBGCAHLE NG.EJABD2.BFGJ.LDGEGMOBJ2OG.EMNDIFJO2BGBIF2JLKGHFMKLP$PADKLMF2GOKICEL 2DKFMFBACGKCGMAKIBGCNOBOIAM2G.LNMGODGJFENA.2JLJ2FEKIJC2AICMDH2OGAO.LN FNED.D.BEG.KFAOND2JDGAOGOICNHMNCOICF.DIEBOLMCGMOCAHLN.FDGACBDLOCIMDEG .HDNLC2JGLFHLHBD.BCEJFLNMHDMAI2FACLFNIEGHKNMKAMHKOJHIN.ONJO2LHKEFCAG 2BMKNLMCMGC.CMDOC2DJBOMD.H2KGMELHJP$PELJKNBEJ.M2BEGBKJFB.EIMEALDCKGAC I2MIH2DGNK2MCLALKCDFEI.HAEKCEOHCHFG2NMFAJNOBHFEGD.LNFMINLAHGMONCJBDIM O2CMOKGMFMFKCA2.F.DKMGE.KME2CI.BKELODKHKIJOMCAGIM.JG2OC2NE2DE.2LCIOCL H.CEJBDGAFGON.JK2BENCKJL.CMKFLI.AMGO4GLELILDIG2BGOC.FBKCFLDJLGAJLHKJ. HDJACLCMF2KHIP$PENDA.IA.NLC.JBD.NF2.NKHGINHOGC2JD3KDOCINMNEAFIAHLM.O. GAOIFBM2NGOML.OLIGLNEBJBADIFCNLBH2BNCLKONANGONHM.GCGHFJMNMJMEFKLKFMO. BJNHDIAEOGHI3NOEHIBKFABIKNICG.CEOKDEOGKJINLFIKN.DAKBIAOCBLDCDELEMACJB .NO.EJLCMFKBKLO2AICBJH2IMOLHCNMODI3MFEBJFC.KFMJ.NF2BJKHAHNFHP$PKAJKGK BG.JEGHMLE2DJFENF2OKI.BDKBMONKMEDL.HME.LFAICLDIE2JDIG2LJEGAE.BKBM.3FK HGADCHNCDFNHB2KINCLJH.IECON.OMF.A.LKMG.JI2MGNGLNB.2LDEBCFHIMHJLCNCJ.A FBKCMKF2IMC.LEBFDNBGDALDIDGODFDLKGFIKGNDJOFOAOK2FJI.FMDNMG.2I.NDOLHJM GC.2J.LFJH2LBKNHKNFEBJOIBMGACMDEDA2HAHJKP$PIHKODGNECILEIOM2NGCAJEBEMD MIA.OJHMOK2J2GEDGECGFKNOEF3AHBM.DCDHGC.HLFB2EAKI2FDOKIMAKOAEAJNIJ.ACB D.GJGMGC2HEOE2MI2KMLNDCIOHA2NECOAMOAHIH2OAMGMEJEBACI2BJBKILK.LA.KMG2J GHAOCFHAICOHKBM2BK.AFAID.2AOBJGHKJEIOCE.J2AJ2CBJHNF2GCEJANEHJ2.E2OGFA CNJFJOKDA2FBMCO.JEIHP$P.BNFD2.OAHLGIOHGABKN.GLFBL.BFAMEK2INIDNGIJDILH NOCFK.HBN2FHMDFMAHJFLMBL2MB2MFGM2JMOD2GJOBNDLAIC.FAKE2ANJDLENEHNGKACF GKIBFNBHEALA2HDAGJLMKEDMBLK.MHCMBMIOMBILKBFKJKGEI2HDEAOB2ABCNCO2BKHD. AJBIAK2NMCA.CAMH2GBMH2CNLAECJCIH.G.D.M2DILHBGKAKODAN.LKIKBKJGEJG2FBGF .P$PFIELKEKBLG.F2NFCKBNKG.DJKHNJNE.JLE2NHBDEKJO.EJNA.KCIKCDJBACLMLFGB MBJLHEIEN.C.AGKO2AMF2OB.LEGJ2OMGKDOJGIAFOHNDHNGIJGIJKFG2HEDIJBGMBH.IC MJIEBEJCBOFMGAHCBEMN3LF.DFJAFMHDAFDOLG2CIDKALGCANECJMGOAMOHINI.IKMO.F LB.FGBJEKMABFLO.L2.ODLECLO.IG.GAOJKEDKEBCLKCH2CB2CP$PDJNBODG.FONJLM2O N.D2JHEHJKFDFCALIKCMJBIGJ.EKNG.OAK.IFK.BKDG2F.HKJAKIBEFLIGFGAOGDEJE2B 3EDBILNMKCMIMEDJNMICDNKCDKMBLEFLGFMKOEK2ECJE.EJGKHFHFB.LOEMHLGJCBFH2K MBELM.OECGCOGCGBEBIGKAMDBACGJKGE2DJGNLEF.F.NFKAFMHB2HOE.BDHDJK2BNFNDB KGLBM2J2LH2BMLI.CDNKLJK2MFKEMDP$PJOK.MAOLGKOFIJICEODJAHBJM3GKJ.NE2KNE DLOD2MCMFHMLOEBC.EGLBDAJK2.JH2GCBE2BCLIAL.HEHJONDBDNLMHAIC.C.CMBG.NMC ADOF.NA2B.FLKCHGAFLGHFJKCMHILDNJEDB.DKNEF2JMJH.JMDIMO3HAC2A.LNFLGFOKC 2IL2CFM.BKDGBKACD2CH.2C.IL2FKMKFBCOELHCDGJOD2OENCL.KM2NIKBMNONFKHMBEO JMK3COFBP$PMIE.2NHNHDCM2A2MIB.KOEJ.MELKEBALNOCKIOAHKFLGCJKF.FBIKEHIHG OMGED2MFEKG.M3NAB.GJABNEIJKNM2KOFMJHJLB.GKBJI.2B3CLHIBCJBL.JLMGELHAMK BFJLNMJDMKGJNCNA2IKHEMEKONDKIM2GA2NLOJLKNHI2OEC.CGJ2.MKAFC.ABGOLHOG.E IKA2HONDHANIGOEH.BLCMJNMJOKCDL2O2IF.NEAC2IKBJO2EDKMF.AKGP$P.DGBIBIJAH OJOE.HDBDCFOHKEKH2.GEBG.2KDIGLODNGBNHLMOE2BNJMLADHNCGJ2GCJMG.IBIOH2ME F.EAGAGOIND2NIFDKCJF2MLOAHEBD.JH2ELIGDCINKFAHIGKAMBL2MJG2EGKGHDNKCMF 2MKGF2GNLM.EBGAO.NEB.LGOJBLHLC.HJMAMNIGDO2HMBHG.CHLJHCJMGIAG.HALI.GFG 2B2NFODA.INLGLAB.BIHEDBMJHGDGCBHFHFBOKP$P.DA.FJD.B2KELID3ACM.IL.DJDKF OHDODILHOLALG2MFKBOHLKNOLOG2EBDINCA.JCOLGDHF.BILGL2AHJC2MB2D2AFGDLOHL OCAKEOCLFAMDJABFB.BI2EJLDNKMGDNBJKIGKD.NGI.KBHBIBF.LEGAIO.HB2.FLOJFED MJEOG2NBJIBCGJHLAIBKE2.INDJKHLENECHGEC.LI.2DJLJM.AFMDAJMBHLAENHOC.AFN LE2AE2FDAGBNLDOMOJP$PCEM3K2AN2DNHALEHMDBANGAIHBEO.NJG2BCHD2EFB2F2DNCA FG.OHJGANO2CLJCKAJDLGO2MG.LDKFNL.HC.FKA.CAGNLJNKOMB2EGFHG.HL2IECNGJHG 3B.MBGIH.J.M2FAGD.HK2HMANBFOAFKECKCH.AB.JGCJAMFGALO.MGNIOGAOFKCBFOMEH EJFCAHGICGLCDIJB.HMOEMODAFIMEJLMGNBAEG2B2KOINKLMFNIA2MAGBOMK2ODKGFP$P MCBJCMB.NIJM2O.IFO.G.BH2LGBAHFHKDC.EOGDNHCBGMHENFILA2OLGJC.G.LCMCNDMO G.I2MJEHJEGBIED.GNALI2F.ALFANMLGNOEADICFMLMFHADFO.EFJ.KD.LDABAJD2M.MN OH2GKIFA2EFHCG.LFG2KDGCB.J.H.KAIMOHOBFCJGDBDIF.IHMLDOGA.NEKFDHEAEHNAB KM.HBM2DF.DHDCEAK2C2L2GECIANDF2.FLBDBGD.KBCFABFP$PMAK.C2DN2H.2KBD2ADL K2MADNCMOEBGFKEBDMKFCKMO2H2FDLCEBCKNKGMJNGCHIHCJHMCLBFDJMJLELJDLMLCIO BHA2DLGNM2EMBGENBDEBFLHOGHFBGJCLOLGNKFAJNF2J2H2OGKIFHCMLOHDHBM2LEKFOK F.ECKCIKNHFHN2CFJ2M2HM3KCE2BI2EHNFCEB2OAEBN2OAJIJ2CANDJ.MJFOHDIADGI.L BM.EMCI2ODEFH.FAHNIEGH3ACBP$PICFAH2K.JEGHNJOJB.J.FEIFA.LCAJCDLG.NCHMO BEO.EL2JGBM.EH.MD2MHIJBGEAFLND2H2FDAOCJFALFNCJKOJOBLAEKDHANCGIBKH.DNH NFKIOIAEKEJGMEFMIBGNJOECOKL2FH2DO.EMOBCEHKA2OFDACH2CLND2H2ECLA2HKIGJG FG.MFMJEIJBNFDJ3NACEC2BNBI2MFBIK.B.DHKD.OLHLMKG.F2GKJMCNEFOMGFCNJNF2A .IKHDIP$PJBO2CAGHEBGAIDFGCDGJGFHODEOGNOIMIFKB3GM2KD.OFIC.CNHO2IEMHEIB JHINOHG2OIEJOLJM2JOLJDLELDKNA2GACJBFIDMGBKNANKBJEKAHALHBA3I.EOBCLJOHA OAE2GOCDOLFAC2JDLGOEC3GFNDMD2NCEKBODCJABOHALEGKFGJCHN.DLADIH2JFJIHBJL C.MJN2OLNDMFJFCHGHFMCLFNA.IAJABFLCJD.2J.MHDJBNILNKHGAP$PND.OLNELG.CKI .BEMEK2BGA.FKIKH2KONHJGHBMBHLKDMBGCOCNE.LIHJEFLCM.OM3BGNGFBN2IFKJEHF. MEAOGNCGMABFELENCEKEABOMEJODL2G2HOBJALNEN.KL2BDLGCNMO.JDKMDOFAGKECIMA LM.EFCBCD2LNABC2EGF.INHCJGLMDBOHFJ2HAGELNKAB2AMEHCOJNIE.CG2DJFOKH2L.F BILDMI.BLB.FEBKIC.DMCGCMIA2CILCBNP$PLFDKH.HEB.2JHILDNBKOIK2FBCDNONDHL IHKAJFIJAMBCOLHF2K2DMOGDLOHFCF2OJGFD.GNAFJAIFM.FKO.3ACLIFBDNKCJFMKNMI GIMECIGFO.ILFNDFLGMELMFK.2BJFCLMCHFJLDNJ.NDJBFGEO2.LHAJ2IHOID.BDOKMKM IEBHE2IKOC.2JGAIJOLBAHB2IJC2BALCICJNFMGKGLFDMAGAJIHIAHGFLC.CH.IECBEKL AJIOFHB.ODJBAP$PL.CICNDI2DJKINADEIKIAJHCEMAOJN2ODJCJ2GDBONEC.CNJAFCHN MK2JA.AOLCINCDCDN.LGAB.2FDKCGCLAKAEAMIBJKMBCBIN.AEKIGFNKB.MJCNBD.JK.C BEB2IGJEIGLG.MDKCMAKNBH2CKJ2N.JMHLNF.NIALHA.GDOACMH.IHOKMJB2FEBKAJDHE NLGKDFKGLH2.KLECDH.JFEJN2CAFKL.DHGNJ2N3AEADH.EJONLCLHKEMOLJMFCP$PGJ3K BHDNIMHDJEFOBENA.LCIKHNMOHI2BMIBOFNG.KFILAHOBLBCNOBGLAB3L2KEFOAMD2HEA MLEJKN.NELBLDFOCL.2GBIBHCEIKOHJLFDJOBEOCHANDNLMJIO2J.KJAK3IGCI.KDCIG. JNJOHLDFGNHDGCD.AOJCH2MKBCKCFEBMAJNEBDKJIJ.JC.LG.JNGNEM2BE.NOKCJL.FBL CDG.DOGKIGFNMKMHNKBKHMD2MNBEDBLOF2ODLIL.P$PA.CJAMHALELCALCAL.IOKGKDMB FBEDFJGKICDBFEFKMO2IDKBLAFGAJIFGBEDBHEMKDMC2O.BGCANMBID.INDKHCBL2JCMC IBGINLF.JHCKLHGHFBOE.EGACMHLF2OG.HMKONABIGHJL2CNCM.2A2.GCJB2H2FAKBIB. CIFOK2AJ2GEGHBAKM.F.CELBEJHICOJCEGBDOJAEN.MFHFNBEM.F.CBAGKFNKIJEOFHIO ECDHGKMFCFLIGB2DEBFENP$PG.L2IANHJCIC.NCFEIDJAOBMJGEI2FD2HEFDLMFKCOLAI HBDNFKD.H.KIHLBNOHJGH.JNKLGNMI2HONJGDEIHEK2HFOB2DC2LNGKFBEO.EAIELFBIH NBNLAFJD2ACONHLAIKLFOJIDFKOJADAMOJ2MA3.IOF.CID.KJDADKAMDGH2ENC.DNDEMO 2.EICOKOJLNOHNJO.NIONGLFEJIMCBKJMF.AO2DMA2O2LKIGBIDBNI2EKFHKEFGKJBGBO NP$PIJFKMBJALAEO2GA.BLALCOBM.NLNKHFNCJEOKFINIEKFNL.NANGE.LBND.CHAG2MA DHBAN2KNCFENMCNDM2HKLFALAFDJDMEOJCOKCNDLJALJFHCDJIHCMCNFDHBJHMEBMNKEG IE.AONAD2LOMBDJF.FHGJAH2M.GJN.G.BEG.O2NM2CFGMDHJEOEBNJGOCDLHIMFOKALIO GICNDE.GABH.JNHLKCMKLEOKMHLFKHMOHDKAJNHCADBFM2IMDHFP$PFBH.KCBEBFGON2G IEABAEHLJ.GMLFBOHEB2OJN.LIFK2HLEBCGNBMIMCGNFD2LBAHK.MLOKNMLHFEGDEABEK JI.BHFMDIKJLBHECENINJKI.EDB2AGLEO2GMJMNLCNBLHOKEINCMIOFAKL.DJGAHDJCFA JMOJDCJDNIFNDG2L2AH.IKBCNJE.CHDAOBNKCGKDNCENHOEHMDL2NKDM2IL.GMFG2DJGC NADEKCMODJOCJKFAEKC.NBJOKIBCIOCGP$POGLEI.L.AG2KLAIC.G2OCA2BLCIEH2GND. ELGH.NEGHIGAMFGOKNJCFIFGEGFEJLALIMANEBGOJIAGHBO.CACIMG.IMHIANDE.AIKNB EDGCNCG.MODGBCAD.OEJBHEGJD.2L2BNG2JH.JCDKEBKLGOGDLKLCK.LEBAKILCMIDJG 2LODFIGHOHBMJDCLMCOHGEAEIMHLGMHJL.GDJHFNKDHIHALAJ.EGOM2NDL.FOBODGMF.A BCGEHDKE2GMCEOP$PF2M.JGHKDMAFC2NBDLF.EKGIMIGJ2DBHEKAJKG.LNCLOLJBJI.GE .LCMB2ANOHMOCBOEA2MEFDFNAFNHDJBF.ECILC2FJANINMEIMH2LGIFIJILNOFHF.HJHK NKNKHNCLB2OGOFEG.N.OCDKNDKDGFLAFB.FC.E2OEL.BJEIEG.KOKH2CJGKDNOHMGFMLI FIJEOJIFHKJEA.O.AMBDC.MC3NHB.NLAJFNFL2MJMKLEAD.HEBIFECMKD.AJACNP$P.O. OAODMEC2HGEIBGNJDJC.FONENFKFMLB.K.GCADHOJ2OAGBCBMJMHD.ADNJ.BFBIJKECNL KADC2NJNJAJ2LOKCN.CFMIEMBLBMAJBEBDAMJL.ALJFJD2.JKLMGEGO.EBNJHNMK.EJG. CL.3AMEADM.OCFEGOKOLA2J2C.GCLDLBJNONLK.JKL.NDKOGNJGFLIMOEIEAIHCE2ODGC H.EOCMAI.DCDAJODMCMF2MIFDBKBENCGI.HDHE.CEBIP$PBKILFAFMKJMJLCMHFKDKBI. 2H.NH.NJAKNJHKJEKFNMD.GNAOCOGMB2FEMDKGCLF2EHMAH.KBOBEINMKHN2DBF.MCMNA 2FLHI.CEHMGEDLNMJNJL.IMJMGAENE.EAILFKGHBJCOJ.O.C2F.BFCANLEDFAM2.JBE2L 2O2EBCOLIB2LICFLJEJDCI.KIJB2ALO.JGH2AC.INEGHIJHAKE2G2ACHIFM2GEDLFCHIC HCJLHDELBG.ONLFAOCNHNFBIP$PBGJF.IFHL.LHJMOBMNBADLDBO2FLMHLEJOANJKJ2EG HEC2AHFOIJHI2.LKFGK.2FJBJLJLJDJOGDI2EB2OHINACD.IJMAGILDCHBCNOGBMCAHEC DANJGF2C2FOHFO2NMCJK2.AKEB.MJHACB.K2NFB.DFM2KLKIEALFLGLJKECIFHBH2BLIA NM2G2OMK2NHL.HEAFHGKDODOGML2OMCGDLCHIF2G.KDFMKJ.O.IOKOCGMBDB2HLGHF2H. AKCBOP$PL2GM.BEOGLEKM2O.GO2JNHAMHAHFI.CFMJKBDAMJAHOFKCGIBAHC2BOLBLAOE GEIJKBHOLFM.KCN.K.OF2KDGHFB2J2EONGJGO2AIGHCAFC.DCKML2C2FGL2ABJ.F.2OH 2IBLDIOHNMJBHBDBNKECGIEIHNA.2LBEIBNJ.BKME.GFJL2HFMKFH.MKL2KCDGLCNC.BI EACEFDCEIHGBH.OGDMBGCDGC.AIOG.FHBGHNE.EKMNCDK.2IGHBED2MNP$PELK.2LJABG HMKAJFGAHBLE.FBFAHFKN.KBLAL.IJAMEOGLMJKINBDKAFHGMKIDNBGDNKBNEJNJ2AMLD ILGLO2CFMELENJILBMCIC2BL.LGEABKLFNFMJMJHFBGOAKAL2EJMBEOLMI2DKBFEKJOGF OFHMOMLF2NKGOBEAIAHGACHNKCJGNB.HIGEK2L3.ICFHBIMHLEBNFGJCLKAND2BKNCE2A CELNDN2.BHNMNAIHJEBDNHEBMIOIDA.ALKGFP$PO4BHFD2MDJAGJ2LAJKJCOHFGJCHFCM FKFND.INAJKM.NOJEKFC2OIFBNHNBHF.FIGKFEMEJKICGECLF.M.2ELIEABELMCLAFAGH NMCJ.DNLCB2OA.B.ONIJLOK2AMGBFDGCNJG.DJA.NJLIG.D.JKJINOG2FHJHFLBMDAFIF O2FODIOKNEMHAM.MJNGBICKILCKLAEGEOJHCODKBDKHBGMCFHDOCGN.NEKAI2MKEMOFNH FMLHIB2DM.JILEDP$P.HNHEDFGDFDGC2K2GJEGOJAMIHNKCA2JCMLB2NA.IHNCDNEJAEL E2HADGMBHGJGOIBIHGCD2ONCN.IMNGNOJDEC2LKBOF2JDAMHKAIFGMC2L2KMGD.CHKJLK LF.CO2MIBLHLKCDAGCGELJGOHO2EALCGJ.BIKCBFLHIELIOEOLHKCI2D2EHLKMONC2.CA N.AMJMCMAB.DBOMJEJAGH.CF.2CHC2JEDMCDBLIHJDIH.EHBA2G2NG2N.MHF2NHFNP$PC GH.EHJIFJCNCDOKDHEBAMBFEDK2HACDFOKML.M.IGJ.F.IDG2C.D.N.FLIBCBCDFCOGNB O2MANF.2MFGDJLMBKJO.NJGKND.JMJDGEOCMBLJEGNKD.EABLDAFMCM2OLHFBNIEOCA.G FK2OMEIGAFDBM2N2LIFMID2NKLOGDLIOABD2GJLAHDBAE2KOFH2BJAK2CADEMCLHJMCHJ OA.AI.HEOEJED2EGKM.MOMO2MGFN2ELILKHIENC.CKLNLAP$P2GDHIO2.JI.MHLAGCELM GFMHEDCA2NJCFHEABODCFDB2EGLDLJ2DBKELDGEM2F2HMGJCOFG.KDGN.DFKG2NDOHJKO FLHKBAKEBO.KFBKNMKLDN2OGDOMHK2GHBJLJAGOAMGHBO2AGIHENEDCALE2KEBGFGIGML NLBOBALMFBE2CJ2BDHJOFCIGFOHFN2EJFMBHMCFMCLMLMAHDOFMKEFH2IEHBLILDBCOHE NBOGFHOICFEHCBHCN2BILNDJAKMP$PHN.M.GBFL2IBFKHNENMH2NCKDCENAGEACDFM33O NA2L2JKN.HO.GMAHCBG.CI3EGLANEBD3EGF2GJAHAIGFOGDAO2EDFDMKGOLM.KLIBK.KA .DMEFHDHABECEF2KLDGBGJCBHGJGIOBAEDOKM.A2.EANLBIF3JBM.IMLIOMNK2OECHDFH CN3DMBDNH.LIN2FGDIDEMHKNKIMJMGNGKFNLIAHFJCHP$PGFIAINBGFIDKMEGK2EGM.EA KCDO.DLHDOK.I33OAMLNA2NIG.BF.HADF2HMAJFCMGIGCJCOKAJFAK2O.K2FHENJNDMEF GM.2CKDLMHGIKNCIK2BICMEAEGMLIFIHBOAK.OGHKL2CK4BAMCJDGJBHDB2CFA.JEIKNB EGBFJCGLBGHM.2GBFBHCAC2KC2JLKHMK.LBENEFKMHAKOF.K.C.HCGEOCENJHP$PCGB.M N3MBK.OKON.G2BK2HMCGD.BONOJ.KN33OKEHDJM2ANGOLDKJ2DGKMJIO.IDEDIFE2NA.D HN.J.KFGBJ.BJ.CLOFNEBKBAMAIOG.2CFIDN2CBJFKGME2DNDBGMCGIJDCIFAEKFAIGIL HD2EONLEJGMCENCNI.L2FCBKFMHLBOGCJK2LIHCKCNMJ.HLGAGMNGLDI.3MBI.NIM.CJ 2I.NLD2G.B.P$PJA2HDGN2LMAMK.OD.CJKCAHCJOL.GMBMHFOA33ONI.HLGDCHA.MKIHE NILH.GKN2.NELCB.OJMKOHLBAIDOKAGJKDIA2DLOBGKCLFHNCNLEIEDCJGAOEJ2DLJGMA NGHGB2DFNLC.2JCM2BFDCOMJFAGJIBDCOFKMO.GJIGBEO.IKIOIEIHOE.BAFGHBO.M.NF AHJDN.I.ICI2FKAEDHFIELNEFOMO3DP$PJAJ.KBKDMGCENCFGKEDKJMN.AOK2DGOLDLDF 33OM.FDKENHD2GDGD.IAF2BMACMHEDKCBLA2.CF2LAFLK2FCOKIJC2GMENA2.NLGJ.LDM O2BABIMF.LJ.OFLFDJCGBADA2HDB.2HMNF3IONENJC2OAMKMJDJIAJ2GOLGDOIOBIADGJ K2AOBDNMOKDJELEIG2CKHI.NIJK.FAMB2F2.OCHCALNGMBLJFP$PBAOJHCDCHJGKDL.DG IGNDCMOKGNOH.FIEICL33ODGF.GB2CDBKOCIHDEN.MHO2IBHGI2ELBC2FLCJCBNIBFG.H INEDFDL.G.EKBGM.OJABAIDBDHCIG2.ELHDI2GBACKONLHMDF2D.IJKDELJGL.EHJONKB AMHLOEKE.GOHMJMAN.2FLJLFAMJINGOKJ.IB.ACMH2M2KEKACBDOLHEMBMCGENCDKJLJO P$P.KHLDFODGNM2INEDLGAOC2NJL.JNFBEOKGHI33OFCKDGJENIHGLK.E.LKGN3KGD2HE LNHDHM2LIHMFJFK.FCLNCBJC2ND.HIJA2KHMDMJOJEJH.OLH.MI2AGIHMOCHNBGFB.BC. ABLB.ELKLEDBC2OGBCKDOKHE.ACFBOCAFJAE2BDEADBJKNJGFOBK2I.BHONJHCEOGDBJ 2CMADBAHOFHLND.O.GOEP$PNECNKJIMHDBKFDKHAIHGNDKJFGFGFBDFAJDN33OEFMENLF BD2MFKJEHGDAMADAD.CKGHGKMNDCM2KMN.DOIEK.H.IHKGJI.2GE2AKDNLNIN2KGDICKJ .MHMED2H.FECAM2LBI2EGJKDJ2LKIOG2EMANH2IALMFAJM.B2.HMIHEGENDNGBLEBIAGN ML2.HBJ.LGOHF.NMNLFHMNADEMO2JDOHADADGEIEP$PKCLJMKH.IHFLGFMNIHNHEDA.OC N2HCL.O2KG33OLIODO.KIAOKIHFICFNF.KH.ENFLBLONFDOHM.DBFCK2AKHO.HLJ2DCOJ .KCLIBMEM.DEL.CLAC2FAIHI.IMDAJMHIGNJOLOEDJKEB2MLKEMFO2NJFADMJEFNLMFIA EHL2GD.NGC2JAMN.LN2OACAL.AHM2DH.IHJBNFHBLDLOBJ.BFNCBEGBFHINIP$PKCH2JG BMAEJFJAGO.FHKNJ2IEBKFOK3ELBG33OLNGKHKJG2AJNDGIOINCDBJALOLBLBIO2LJ2. 2BK.IGKEIA2FHNHBH.I.NCGLAN2GKLBDIMBKMO.FAOGNECMFNKMNALC.L.AIHKDMHCLKC DM.M.HOHKBDBCIODLNIDCICN2DLOLEMCLELHOK.NGABANMDHIMBNDJHAOK.HEICG2NKIK .OBAFOFCDHGP$PJBHCBCHAKOB.GHDIEMDGJ2CJOLCMFGJE.DKA33OBDHNCL.DBIKHOBED BMENMDLBOBIMKCLKBNBNAGCB2JIKI.2JF.EKDEJKE.J.OF2M.IGDMECKMGEJCDMLEDAB. FNBGAKB2FMKEIBMEJBLBEHMOICDOM2GJI.2JI2LADJGIH2CN2IHCJLEN.DHBN.OJAD2IK NJ2BIAJEK2LA.K2.DLGCE.KLNGC2EONP$PNHKA.EFGLDHDAGLAGLKNJKIKG.DKBNLEGAF B33OLJ2OKMFILDFNMKMBOCNBDJGBM.KF.KOHGJAIMCFK2JIB2O.HG.2FNHNAMN.ACHCIE MECKHJCAKEIBD.FJIODMCBHFNGEA2KEMEKMKIMBDCKMLB.ABDOIKHOCL.E.LKDE.LGHNF KANHDOFJHK2.F2BNAKEHBFIHIG2ODKOFCAO2IH2EFH2IDI2ENENP$PLKCIMOBAHJ.AJCJ MG.JBKJIDKIALOHLAEFDF33O2J3MCFGDAKFOCK2EIBKOLBEICKM2GB.2OGBM2LEAKMHEO MDENJAF.M2NDJ2KBF.LNIBAOAOHKI2HAHDKEAO2BIEANCOMJ3G.HJIBHFMHDFJ.E.ED. 2LHNKNCOCM.DHNEHF.GML2OCIJKHKGIBCLNHEDEJGNAJLCIEJHDIOIOEGKHMEILAIBJBG MP$PAMCOM.BKEN2OENIOCIACBEAOBJOFLIK2BOMC33OHMOHJDKLKMKGOMDEIBDJG2I2NL GNEOFIADGH.L2JLHJLC2MIDEICECJKI2DJOMBKNK2D2HNAJG.KMHFHJDKE.JIDIJNL2OD E.H.INICIGJ2BOACB.OBGLICELDLCANOIDHAEIOCANECNLENDHFLD.F.LMDHKLBCEJFLG DCOHKEI2GOGCIKGINMNHDP$PIHNBNANGIHAKCD2MLBMIC2LKEJECFAMD2.CL33ODACLNB IJML.EJLELJHJNHM.LHIOHFEJLM.MFJHIMBCIG2.CMC2DOHOBN.CKMFAMCMOKMID.KJLH GLGLFOJKFAL2HIBHCIBNMOIJDCJLAGABAGLGAHGKELGLNFOHALBMKAME2.M.IOLMI.O2M C2EDN2DCIDKHLEMD2OBOJCJCMKIMAFBMAF.LDEHLEP$PFLCBEB.MO.CJHJEIMLFAJ2H.C AHDMDHDEHJH33OIAKF2JAI.JBM.ICGLEA.G2KGCBCHFHNGFON.2HDOHN2.LINEIBI.BAC MIGLAKEJGC2KL2.EIOIMFONIDOMK.ONMHLMBOAMOG2M2.CHOKFDAGFCEMNGBCBNFDADF. MAHAOEFLHC.OCKI.NH2JGEDF.AFN2GOIBM2BLNJHCH.MLFADALAGLMLCLJ.2EP$PBOACE NFOJCGOMJMAL.FMJGFBMOJCEBO.LBIA33OLJ.ONBM2K.LCABDIAFE2JFBECICAB2IAHIE I2DNMFDLAOJHGCBFIKNKGMCHG.AOFCEOBECKG2KDJMHIBMAEBN.BA2FINBCEKH2NIOKBL 2AHABELBFNIDEIHNOMBIEJHBH.FDJECABFE2NIGLDH2DCABFDFNE.NHLDJHBCMJ2AFBEN .JB2.2IJDOJ.P$PN.KNKOCMDENLNOJ2M2DHMBNEMIMANOKBH.OE33ONDFB2KCMIOCBKLD N.KG3IJDIECKBODH.JIKBNMOJHJOB2GHO2G2MLN2LGOMNEHBAHGMEOFCJ.HKJF2.NFCM. L.MDIJBCACGHMHBCMABKH.OHODLIOK4AMC2M.ANJ2CGICBCFHINHCOFG.M.MJ2G.CE2KF IBC2FOBFKJ.LAMOLNFKLDHINE.IJAP$PAF2AOL.EFDHLEOLCEO2JNBMBDKL.2J.IEDJE 33OGDJHDN2EIKD2MN.IOFOLANAELHKF.AFLKE2JFBAMC2FG.MB2F2IFIAOJDGKJNCF2MN OBCHADIFDHAHGFO.2HKDG.HM.OEHIGCDMNC.KLIACBJNCONIL2OJBAMLIOBKIACF2KF.L .NODJMAKLAJA2.L2GBFLAMBONBDMOML2CFENDEMLOK.EMOIKHIP$PGOAD2GLAIFDGFHJC HEGMFDJELHMCGLDG2OAN33OLOHMBODFMKGBLDJNJDG2MA.IKJ.DKD.IN.KDLEOJGDIOBD GDG.OE.KIFNCGL2KBMAM.2COELIAMOLFJDH2ENADNGENLGALA2.D.IJDCAMFEICBIFKAM EFIOJDKFDCFJOHIOFCNBFDB2GDIJCDBNHMECBHECNECIOKGO2.FKD2MFDBJGJOD2IOF.B LP$PDGOLF2B2AD3MCBJLN2CLHIG.KLK2NDNMKMD34OCOKCHKCIK.A2NDEODCEGAGM2ELE .HKOBN2DKNEMFAIGNKANE2GBIAMJNOJAFBHIDF2.IKCIEKG2LCNLNOGOKCEGNLKIJCBJD AIK.I2ANLNEHLGOEMAOKJKBADF2ILK.DFAJHGDEBKLDKGKMHFIGC.OMFDJEBD2AINENBE NGCD2KOIJCEC3GMLM.P$PDGNGFOFJAOLGOFC2IBGJGCLHAOJLJNFNAK.H33OHM2HCAGJK .KHO.A2ENDJ2KAHDNINJ.CG3BA.OHNBMK.GDOMNBLHDIM2JDOBLDEOIJNFA.IMAOCOIML KLM.GB.MEBEHFIGIGHJKCONIHAGEOA.H2LH2KNAGE.EFLJIDGLIONJCGFOEHKDNHONIDK .FLBJE.LFANHBIFDHENDM.IKJKE2LO2FI.N2.P$PJMKOBDAOGM2OG2O.IBMAF2DHJ2OCJ DGDBIFH33OINLMD2AFEGECGH2MIJDCFGHAHENE.FDG2.CAC2.FBDFCI2CB.LELKE2OBDI LIFEBAHNAI2HN2BMD2IAGIN.IE.HCOGELMNKAHFE2LJG2K2JKOMBL2A.G2EGIGDBM.JIO .MJFMEDBAOIAILD3J.KBADFCJMKIAMDCECOMIAMCMBCNGIAHBAFBODCDP$PEI2.2N.BNF HGNIDL.JB.DMEBNMNEOLGAB2OD33OL2HANMI2M2K.BIKJFE.EJOKLEBNKNEAKBLAKFKOF C2NCBCHCLHALAOCLHG.MFAOIFIBGEFMB.AMEAODGKINFHKIHKLMDELEON2AFO.JMBLAKF BDK.MDFDF2CIMFIHOGCAKBHNOGH.I.LN2CBHJEN.KMJDEIEMINBEOH2M.ONKBEKACO.H 2E.DKJKJP$PIOFJGCNFIODKCFMDFL.EDGLIAEFCAMAH2ODA33OGIEKBDGHELKICGNJHFN L.GEMILDFBF.GIGEHC2LMBFH.LBEFHMC2G2DCNOKOEGHDAGC.ECM.FOFBDNKGO2DOKF. 3NI2KHNBO.KCFEMHLMLFDB2DCIENJBA2DCFALMFNIHLB2.2AF2HOIDMDLBODCLNFBKAOK DNJFJLJFAODBHNMGNG.2CD.JDFCOP$PB2MGADBEKDKMN.F2.IH.JICMN.2ALIKNCJ2C 33ODCLAFACHN.GJLOKOCABHIKJGM2FBL2MCBKDNO2H.NOFMI.NIHCMG.2IOEJK2JIDF.B 2L2GNKEKAOFBA2EG.2ANB.NEFHGMIGJ.AENGNKF.ILDA2KOFAHGKIEJO.2BDJNMB2IKB 2.HJFMHIGIMDM.OFKOEONJKIN.2OKJDFBCL2GJB.MDC2GEGBE2JP$PNMIMODE.N2AFDCM KD2CGEFODEI2G.B2F2JEA34ODIJHKADOAEGIDKMJ2LMEFMK2E.I.LIMIDGE2GFEFNMDFN AIABJFKCIKJCGCJOKGFLO.M.H2.DJEFOBNAOMHBACMHM.2MCEJAINOEDOHC.2OHBNHKIK EL.JDLMHND2CGDJHNHBNGLO.BHBGNLFL2H.BD.OC.MHF.LH2OJBMJEFHK2DHCBMHLH2NM .P$PLEGIGMGFGJOELMNBDMBLBNFA3IO.DNM2G2L33OAKNALCMHABM2BHMJE2NDJBJFJ.L FNLDBMLBOMHNFMGNBCKOKHC2IM.2KCEKBDANOALOKC.DCNANC2FNJDNDGH.ODOCFOENK 2BFDOEO.FBDNFGHJEC3NCEDFNDIDGNLJFDCJ2ICBAMGNCLMKH.CH.FLKNH.BAEIHG.MKH M3DJADOLINBCFA2.EFKP$PNGBKNFM2.F2.MCGEGFDKDGAL.2HELOFKEKM34OAFH.HKI.M IOAMJANLFDHBDF.MGEFILNLD2BONAJHENODIEBHM.KLODEIEIMLEN2DMLBC2KFE2NLCOB .NONKHBN2MO2NGAEOBAD.OHGLADLFKCMDKIODFNDEJ.IGCFCBHJ.IBJLIOHBFHEMHNLEO KEADA.KIJ2EHKMOKCNOLAIAFHBKMCNM2.IB.FJP$PBCKNKLMALJANHL.MEB3MCGLE2.KG ALOE2HK33OKNK.LNA2GKDIKHEDNGIDOMH2JDNGC.K.OE.OKDCBJ2BJEC2BNOKENCDOGFA .M3OMJNHF2HAEAMOBNEOF.DAL.KNDNCOALGE2DOFO2FGNK.JAGKMGFBOM.FAN.JLNCFI. A.GN.DBND.KHAENICBKCOHKBDANDAMOB.NLNOINHBMNHNI.CI.NFMEKGP$PNHBOMK2CK 2NMIGBCOCL2B2C.EJMACMDL.CIF33ONKEOFLACIOBGC.G2I2FMGOLDODH2OCDAOF.CH2J 2O2HJEDABNJEI.FOHDIGANAONKOGABJCIEHI.OBGHK2GIHJGL2IDBOF.NA2IMO.BFCH.G ALC.BADBICM.NBJKMHFALFODLF2.GHFOKA2B2EILHCAEBNGHKEBEFOMJCMHMIHGIHLF.M KA.MN.NJP$PDFNGENDKHJ2BGI2EGDKNBAEBLJB2GCJDHMEF33OEALAGD2LJFBIDKNMANJ MKOD.DIKJLGKIFMAKMEGEMOBNBLMJ2DJKGEAIKEFLJKL.OEANGMA.NGHLFJA2GOBKIAD 2IJ.2AIJDCG.FGFAGMFLED2FBHLCNFLNJ.OEI.FJFHAGFEIFLGOCMCI2OIAM2GO2FELID LH2.J2B2MHGL2MJ.OFLKIE2OGFNI.P$PHLEGFCKJBN.ACBEABK.KBIGIFD2G.OMEGDBL 33OIMEOACGAIDEDNMNBMD.B.EJBLKMHCF.LHMAHIHE.MKE2NMOLJBAKCAB.A2EK2DJ.BJ LO2KOMHDLB.DKFIKENDJ.AIBNKA3OGDGNHLEG3F.BLID3FBMLAIH2.HALHLB.MLFKBDNF AMFNFDODLIM.IFEDEL2IFAF2HMOJNCNFBIEKAO.LEDKLF2GP$PKOIDFIKHLGL2MHEINDC GEC.I2DEMC2HANFHNBFBH2DLOKMBDO.JAHIFGKLI2JNJCKFGEMKGFLIGLEBKOACIME.FH MDEFOG.JEMAB.H3DJMNEJLA.NEDMKAHG.CDANLJK2OFLHNIDJGCLACMJ2LFDOJKO.NDMJ DIBMLDHIGFLFEBLKH2OILKODJLKO.IJC.HGLDCKIMNMBJM.BNIGDJNDFCJK.DK2CIBICH MFCJ.CDAGLGJANHLGIGJMC2.HMBP$PJKAMOHB2CFLNKMHL2BFIAFB2AMGED2LHIA.ILEK IJ2MLNJCGKNGNB2FLIGJKOKNICM.GNAGMIABDHJFLGJHGLFEJFIHDO.L2DHL2KAJFMNCM NJGDLMHJHDBIBKGNGMGKMGCFGBGBFKMBIA3INBKDJCLBIKGBLEAHDCLJKE2HKDKGACMCL NCJMJCIMO3.AKIB.HLHDJ.EA2HI2CHDLOHDBH2G2CABOBD2ACEHF.KCGJKECJGDOIFNHI FNIEGJP$P3.G2NFK.J2KFBIGC2MH.NHFBMFLAFI2CEHIGBHD2HGEM2FMFCJL2B.A.JK.C IGNBFI.BJGLJAOEMOLADOGCIKCOJFBJE.I2CNG.IJINKA2IHF.LFJGEF3DNMKIHCDNLBF JGCNAI2LH.KLNEL3FJDGBAOLCNGEJ.GHK.IMDL2.JBL.ALDOCMKNHC2O2MADINICMJI.J FCBDCGMBLNFCFHJGJID.DBOC.D2JH2FANEIFC2AENHI2LGMD.H2OLP$POBCNKN.GILIMN HEH.EJHGABEONDAMIGMBAMGIG.KC.CMNB.K.B2LOJNGK2BF2LCN.CILBO.CL.ANMHIJEA GOJLBFDEHDBECE.BC.KAHDFGFLCKDBCD.LAEGLGNFGD2NOI.2IFKAFEBILI.BLDKEAHFM BMHMLHNAJAD2J2NLNGLF2AEBIEAOEBGFH2.A.IMGJLGB.CJGLKJEHM3HEOFJLIMCHJNCL ILIAHNBKADHJMIMOBCALJ2BE2LJDELF2HP$PJOC2BANGH.L.OKIBLNJ.LK.HENEINMDI 2AO2JNOJHGMFKBCIHLDIKGMKNM.MIDCMEB.KHDFOIHEGCLKONEODBHLOANOAICKD.HKBA KMKHIEHM2O2ACHLI2EFJAFMD2MJAILHEHG3ECHICL2OAHGHEJGKBDAFOIDNHDGEC2AOIJ DNEBGA.KMLNDGNFHEBGBNLAFMIEGHLG2NDMCGKCFNAHBFKGONBC2AJD.GOBMHMLOJ2HLI LGEOKNJNLINH2EP$PJ.L2FKELJOKO2EH2KDIHCHGFOJMNI.NHFOIBNJGOHKNDLJLOBEDI LIBGBC.NFECIO2J.2EBG.D2FNEMF.B.ANEFJFBLMHAGECBLI2BDFMBHDNLBCKNIB2ANDN LI2F.CGAK.GBOAONDJM2ODLD.HNHDJIODJLEIDNHABMLNILBLHLBAINAFODJA.HCDHNE 2GJMBLI2ED2HCIJBLI.G.DF.MAKDCBKG.DHOMEI.HAFIJMDCFGH2J2KG.IBLCNCNGP$PD IKF2IAIJHIBKHBO2EADNAGKOBHDAHLOIBEKEIGAIAJCDOMGEOGHFHKL2MOAN.HCGNCBLB GO.MFDBGEADC.MILBNBGDH.ENOEAFNMKGODLJD2BNAG.NHGCBOGOKL.K2JIMOLMOHGIE. DMGLKG2F2BNAEOJO2FLKIMKGKGHONCL.FOB2EKLJFKAJ.JCI2OEJOGMCLC2J2MJIGC2KH LGACA.IB.MEOGCHNCKECFAIA.C2NHBEMKNL2B2FIEOIBMLP$PMDGLOLFBJFIHM2GNMKNC 2LAHJAMFOCBGLAGLMFGF.DI2NLGMJHMCEBOMIECHBIJ.BIKJLFKJKA2C2HMBOE.H2NMGK BHL.EOJOGLMH.2EA2DNMAI2GDLFIFL2BDMFJF2MO.O.GLBD2JBGCOBIJHAGBOJOJNO2F. GNEK2AKAIOCGCNGOA2JKGFIFCJCMGAJHGBHDOCLG3.E.MKEJOIKGN.NEFEGFBIFIGEM.H OMC2FBAI.OJ2DFJNJHNCKELHICP$P.MENBNDOIGIO.HIMO2KGFNMGDABAFHAN.NDLELKD MGAHCKMBGEAJANLED2INJDCMDNI2KAM2OFJIFIFCDKD.FMCJFE2GAFL2H2KB2ACMOCHED CNIHM.JLAD2.LJGAINHB.H.MFNLNEMG2HAEB.E.LGE3OM2EAHMNEDFLBHKBKLD2KFBLNC AFNCLC2JILAIC.ODNBFNCE.GND2FKCBHFLDBJBOEKCKMDICJGHMGLEFHM.BDAMIJIOFEA G2NI2OP$PMGFAKHGIG2HF.OINOAIF2OHAEIDAEA.MF.IEMJE2LGELEBNG2BCBNFAJGKOC KBI2.AGFHFH.MGEFDAIC2HMBON.H2MNGOCOCGOCEFIOEHBN.H.M.OFCE.F.CACHJFINMO A.JOJKDCMOIJAOMDKDMFBEAG.GMONILHAIDK.KF.2N.AGMCH2JLACLI2LDCMHCJ2DKMBD HBEHADHFLNBAGB.MCGDC.LMADG.LFH.2CMIANKAKDIELC.DEKFON2.DIP$PCBMGINJDEH 2BMJDEFNCFBC2JGBJINBI.B2KI2EO2HFCEJNMOBHKHJF2GBFCD2NKEN.IBEKEN.NELEA 2KCEIOADBMG.J.OEALFEKE.EGKOEODJFODKOCLHOHKNDNCNME2NEFDFOI.ODLFBEIMNEM .D2GFLIE.D.F3EDNFMJMLICLENLFEGACOHEGIDG2NKCGJCN.CF2JHK.FJOGL.F2KCHE.M DFDOFNJKME2.CFD.AGFDKA.COMAEHOGDIFNGAP$PADO2DANHKHGH.FEKFOFHFONK2AGDK HLAKGJ2BD.MNJEALGIJNKOAE2BJCAFA.LDO.HLHJ2A2HN2GIOAG2HADFBMA.FKBLO2IKB LELGDLBLKANILEDJMNDBH.GBKBKOMCLJLEDEOFGAIENO.G2EDCOIOIJNJMNIAGNJOIDMD EICDGJGN.NAMIF2D2IBKFMGMDMABOEBKDA.IOMJHLCM2FNEHOEFIDCGDBMEI.DHAC3DNL IKIO2.2NIFJINOHMJP$POEH.OMOGKHCBE2DGBNCD.JBNGEBJNAFHEJAFICN.JOJGCOJLN LFENFLKIEOILJFNI2MCEINAEDOLNDLOAJDFCK2GH2.OBECDAKNG.NICNIEDEJ.KHGLHAI .CHDAFOF.JBKIJ2LGKCEJAFEJFLIBDG.J.NIAGOG2HDN2FCINBAIEJCGEMEFLBILNOLFB LNLEB2F2KEOLDMIDIOLAMFJGIDGH.2KIBEDFHNCGMHJHIMLGBGKLDGMIOCLMACKHEMLP$ PKDGFB2HGDKCKGJCLDGB2ADFDNJFNLHBKFBK2ALD2G2A2NDLHOHDODEN2MI2.B.ABFDKJ OG.BD.OAJKGLFBMJBAFBNACEHJOAM.IAKNA2HC2AJFJHJEA2EK.H.JHCA2L.DONDIBMAG LHKIDIDCDMIMKELD.ON2OAELIOJGDKLOAIDCOMIOHJLECFJNBCLGHFM.2E.FAJBLIHJL 2ECOMIOFMGJEGOFDMNL.FEKIJK2HMKLCHODGJAJOFM.AEOGCHP$PG.NOJIMIACIBNFJLH JHBI2KC.FOEFG.E.BNKG2MEMCDC2JANGEMCHLNAINLKEIBMNA2BAIM.GDBCAFEHLA.2HN LDOJLH2AON2.2IH.FCIJLAHBEA2FGOBHB2GELDEFMOBOMALKDGEMNFNONH2B.KC3NLH.M NOLJ2.IMGCKOHC.J2.MIBKNBAENMHJKBMDL.2DOEIKBAEONILKHL.HDF2KDNCLCO.NOAK OHIAJLGK2JDEBOCBDJF2KD.E2GHCGP$PJABELHL3OEDBHDEKF.EMLMAKC2GE.DNLGO2CM B.EMLKA2CGK2H.OHLNHFLBELFGH.KJDOMOK.HGNHOK.DO2KEB.KFC.NKFCKAH2MEHFC2F MK2HNBNDIJAML.OANGKGMJD.J2GMKEJ.2N2F2MBKNFA2NCEFAMGE2GCNEJGIFBKJCFHC 2BANJFAFA2JNGAIMLF2KFBHJOHBCAM.FKAH2AKHFNDNIOE.HDBN2GC.MGNDJMFED2M.LN .KICDFIL.MP$PDJLBCMFMFDB.MFBIAEFO2GJ.BCFNEBNJAI2BDHLGJKMFGEIGF.NB.NAI AIOJGJGBAOF.KH2DOFNIBEMFLHMHJMO3CJIGHCGMKBC2OHFG.HKMAOIEMEHMOEAMIDIOM .BKOHFJIJFLHDF.ADBOG.E.ECBDKICNKG2FMJIBDFNCONBJNOECGDL.LBA.KO2EHDBAGF AJFBIFBKMINLAHDAB.JHAIM.LECKACMBMF.IEBODEJOHMOEFIMKNIKIMDOLP$PGAJ2IG 2NKMC2.MLOKNBMGNFLOI.OLELOFE2LM.KGEDOMECOMAEBLAMGEJ2E.IGOGOFN2GDK2AHA D.BLADFMNMKJM.HGHAEIC3KNOFCOI2GKFGO2JMDON2MKCLJI2FAGDAGFACLDHMDAL4MOK EHN2COBOACAMHDNOFHO2JNGKCIEC2.GHCHNADB.K2CHGJLGDBHG.ANBMFEHDGAH2LKHLF M.OHCBODFH2I4GHNGFBDIFB.2IDOFCDAHGIEP$PE.OIHDAG.EIGJCNF.OL2NIBIBCNJMK EICF2DFHBDIOGK2.GDKG.OCNJMLCN.GF2.OA.MBMDKGMEJDKEJAMDJKI2GIM3DEIGJIOL IOAI.BIMDFEMLKHAKHDCOJLO2NHOBEKAKAGDKDAMKGLOFIGIBA.LMHAIKMB.HIC.AJ2LI JLKGJHGJCGOHMDLOGFIMHLOEDB2HOHIMFGCFLAGI.F.EDC.IGKGEDGID2CHIJKMGAGBKJ .NFMC.O2.KJAFLNMP$PIMOF2NEBEHF.JIO.NAMBGNEHB3FJKEIFCFGIFNHLOJ.K2.AGA 2HIHEJAMGDHBF.FCINM.AONMFGHCAEFLMEO.BMIMHNOMFHNM.HIANFHDCGDJCLHNEDH.C GLCENCM2GHMGBMEMJBEHCJGDKDCAMGKLEKMI.CLGILNAGL.BAHGNOGAG.K.DGHCLJC.GD 2KIJ2NBHCBGIO2KBLME2OGA2.JHNJOHGB2EF2DIM2B2KANMGLN2LECDEBND2EAE2CFP$P LAHB2IFG.EN2IHDCDOBOHODKNOACM2OKJBH.OJKEG2COEGOHO2DABK2M2IMNHLNBAIDBG AKO.2L2GCMGFK.MG2HMFLBOHANCBLJIG.GDGALNFOLDEMDL2GFIOIMA.ENGJMBEJNEGHB IBFDM.DCGCNMO2N.LI2NOF.JKHOFAN2MNFJCKNGMKJ.GDHLH2NFBKJ2NOJCNKCKMNAIJ. CNOING2MJKM2OMHOCKEFBGOBMKGDNHEBF.GCNFEOELNEGFKP$PBMFJKLMLNGKACBO.GDO MJI.GI.CMBI2HJAB3NDCA2NG2KNBKHI2JKCALIE.CEGBOI2FENHA.FLH.IKEMBON.2LJ. FJCHGHMEOFDKNIAHGHKCNBOG2ECBGCGHABLCAHLIEBLONOKALGH.NMCBNLKMDGFLEBHNB CM.HLALOK2D.BEFHLIDLD3MALFOMELNGHCLBHGFKN2MJICBJIC.CGC.DH2CHNFOMCFEKM BOLOCJAG.NLOLFJICEKO2NK.2KP$PAIDOJ2.FNCIEF.LN2MKODGLECLDHOKIFEKMN.BML EMKIAGIJEM.LEBDNBHCKA2O2AFOLJ2KEC2IECABM2FJHIJIOGDOAHEGMONBDEHE2MLHAE 2GBDOCAJMLCMGM2CK.H.FMGDEGBIEJLEGHIEGKD.BLMJFEDNI.LHOB3EOBFBNKBAFJHBG NO2NAFKOGAHC.ABD.AHBEK2G.KDABKMJ.BMOJG2KOF.2CJELCBKGED.EGFB.KAONDBGAK HA2D2NP$PGIEFBFGFHKGNGOA.OBCFJFIKHODOJDAHOMBAKIHLGLEKDCB2DJAN2J2ICMKL JDMGALEDGKGIAMLGHELFDFGK2BLENKDOKCBCKJMDNIMCKCBMOCGEOMFJ2IGM2LIMKOLBH FLGH.A.CEILKGHAOI.M2EHKGANFGFO.FOGOAOKBNIAOHE2D.AOHEJLBG.H2N2HFEOMC.A K.LEH.MKBKO.K.GMKOHIEFNIOAIF.DF.ECIM2AHOM.IMDINLGNA.IEFLP$PLNBHJIJIKO AKFCADAONGBH.NBNDGMGIAM2F2BMHFHDN.CEA.OG.EBFIBDCJDKCNAHOL.BDAHMADFCEI LCB2KLC2FOCAEIFKBEHEGCBIJFEBMIKEGFBNADOHGJEGJFLNJOJAC.LEIFIJNC2LMBENA FD2L.EJ.DLHLFGJGIABGOJ.NJ2GBE.DANIOMHAIDBLIG2JABEGCL2FA.JNJGLIKE2I.I 3OH2DKODCKCJALG2NJABE3KFHDMOIGDMFHACP$PLGKMJBJA2EKLGDO2DNCD2HKHJGOAKA CMBFNOJF.ENEDNENGHILCHJLICEDBACAKGHDNHDBAOLHFK.DC.JILMCFLOHG2CMIELMIK NEIEJOGFLFLFLOLOKEHOJCEIAOMJB2GKIDFKL.DHCGB.DNLNOLCBHOBLHCKAMC.NJFG.F BJOJNOGBD2FMDFJAJA.BN.MFAI2OKIBAFILM2DFBAGIFLOEL2J2M2C2JG2.M2DIHBIH.K IOBONFC2J.ECLJGFDP$PALGFDICIFL.BCI.GFKIA2HKEAGLOHED2EFJFIG.LHJ2IECGEO JIJEMKEIEO.OHD.GIKGHINMELA.MEGENBNOLDCOK3ODHIDGI.LEKOJINFKNKG2EIC2OKC DLKDNEFMCDHGBDLH2EBKJCGFOC2IMOKDLJLJ.AENLEBMA2OBNFCOKALHDHME.HMFCHEF 2MILHAMCM2CG2DKECD.JLEABJCIOM2FECABJIE.OFADJKCKE.BDJBAKIHDNOBHJOMHGP$ PDFA.LAD.JLAFOGKNFMEHEFE2CBEGLHLIMLOCFNIK2DIHM2LFCAL.JHGHB.HN2.KMOFOL OCJDGJBLO2E.BH.IMLMJK2EGECOJHA2IDGIGMHALCJDAFEGFMDONJA.2MCJNLJIHE.DKJ AFDCFKGKJLM.DGOJIMIONBC.JGAKABLINABHJGKABOKNCHFKCFC.OMJ2DJAGNLG.LK2C 2OLGCOIGKMNMHEAMFKI2G2ONG.D.LEAEILOHEJLE2KDMLNIOCP$PIBCJDFBHJLCGAB2MF M.ANAMBGLODNGCDCBK.FCLBHOHBEFCIJCMGILM2CFHKINGOAFN2JDHIM.ONJGDCG2FLJC FHEMEHDCDGCLFBH.COJEBDAC2LOININ.MKADAHM2NMKBDKOENKGBL2CM.BHN2LAGHDNE. NIK2NEADGN2AELAIACFOBKAGECHEDBFBCICD2OLAHDIOE2ADHBDA.MJBNC.2BLBLA.KFG .H2MEBDIBOABNHEFB3CLNM.ACDEJMP$PJ.A.BCBLD2HMDNL2NHKA4FIAF.2FH2CMDNILF IHKD2MOBLBJMEHAOCAMHEHCDA.FG.MNF2OLBIGHDAOK.GHNJCI.EG2.JNCABKOADIABKN KA.DAKNLJHGBE2ACHG2JEAJL.JCGF2KILAONICAKLM3DFGIOG3.HOMDAIGNEFJIGMNCJK D2CJOAI.NMCNCINMDAIAHIONE2FEGM.OEAHKJ2O2HOAIACFCDJCDNGOD.EJG.GCA.MAKF GAIKHDP$PBEHCNJINJEJHIKFMDGFOKHGFD2EALHKNME2NL2GHJBKGCLCGJBGCGJ.MJFMN MBKHN.CFDLEOIFCAICMILEMDHKCLBA2HLFKCMK2MAF2COCIAHJCB.L2KFJLCKBMCFEAOA FDAIEIGHMHJI.BLDGNHOFAGLBNBDKM2EGNHAECMGCLAGANJNBJ.G2LNBMBAMAEBNDGBHM L.O.OIDOEAFAL.JOEJMOI3LJCDIJ.CL.HAIGLEJFILCMOEJC2EJGKMKP$PFLIH.KFOHLE KFD2FI.EMODKIC.OM2IHJMNEALOAJ2CFOKEJO.HKHEJ2LM2ABEAKJNAHOGHDMEMG.NDMC IHLO2DOCM.JNKABLOHJHMEOLO2GKJNH2.I.GINHC.MJMEBDL.GKMCIJDM.LMKFBJGECKJ 2.K2EALHCGF.MOG2MOLCB.C.MIOAEF.B.IENBK.2BFELD2K2E2IO.FHJ2ECEG2AK2CDGM DNEMKACBEIAD.H2G2BMEALKJAIBA2.I2NFAGP$PBM2KBHJMLC2KLON2DHMEHCDCNIE.HE ODLE2.AFAOB2AGHBAGOM.DNLIFOJNDBEHGODJ2I3.JCNHOJEBFHEFIJE.FAIEKIC.LBEN FOHMNHJK2JCGMKF.K.KDEJ2F2EMLDC.HMOJEG.ALCEJEIFLMCFODEBKGOIMDK2MNLFLKC LOIDHFGLDH.JGANJAKGEHKCEHOKCICKDADCB2.HFKMCIFCOMB2NCEFGAMJM2EMHLNHGLJ E2KNENIJDAONCJKFP$PCIFAKHE.NHAOFGLFAHJMGKDLMH2DLBEMA2IG2FAIGFH2MOMBKB .IEOEG2DKFEHDKOBKBEM.IJOCMDGOJLDBCF2LALOKBJABOHC2FLHB3JE2HIKAHE.G2CJH A.IK.HCIH.DBN.CMC.EIKCE2G.DIOCA.EJNAKDJIAC.GIOGEIK.BGH2JDJIJ.MI.LBHDN OHIHLGONAOIDKHGINGCKNAJHBIMBCFAHB.AIMOFHDKAJNLJIBABINML2N2JCEFJHOP$PN BMIJ4K.NLIOGMABDF.DHGBDOMIHM2CM.JD.OK.LIBFBONCBEIECEHMAEHELJIKMIOCDFE BO2NA.NGEMEGKHK2HBODHCEFEDALCJLGCGNM2C2JEH.J.JCMDI2MI2MBCFGKMOHI.JMJN B.FKO2LICOLM.ENOMFO.K.AC2LK.CKOLFLGMEG.OIAMFENLEKGMI.OK.D.LDCFNLC2BKF ONMKABLHNJCMLAK.DGC.G.KIEJFGCJLOBOJCMF.FJ.NHP$PIOHC.GKCNGAIGLK.HAI.J 2EONMEGDIED.AMFHL2DHBGHNLMDCK.FH2A2KICOD.HEOJEDICFLNEGOG2ENFCFDLJILOL 2.NKCNBA2DJOHGHMD2IHNHAEBJKA2CAI2AMFDCK2DHL2IG2AHJDKNDH2MCKAMCGDL2DNI AKDNJHNOAOKIEAHBHGKNLFGHJMCHEIBKOG2BANFKIBIJLCGEHGCHKBKHNL.DNKAEKIBJH OJAIL2JIGCNAEHK2GJN.DCOIMOP$PKEMH2FLGMHNOE3G2L.IG2NCILFKJCHK2AJM.OFEN ENLBNBNINCKLG2F2B.2MLHEHJIADLMHGLEJCLFHKDG2LM2JDEIFGANJB.OCENJM.ONL2K DNFGBDJAMCBA2BHFMHENCL2.MKGLMCJLEMCJDKEMGOCLHCJMKINL.EACMJ.L2C2H.HEHI FDJIGCBGLELDOJLOE.JBDBLEIEKHLNCDA2BMDN.MLC.CMFJ.KH.FOKBKGIBHFL2BM.ALF IFLANJP$PJNIDENBCGFNFKFCEJCIAL2NHCBEBMJCMIG.DHNGOHEAKABOBLMH2CB.KGIO. 2LDCFCGBLFOC2MOEJA2DFL.ALOLHJ.JLE.DLNHFGBFNL2OMIJNDMFI2ONCNCJNGJF2OBC BJLA2GMBHOHKGKDNOGALGMGAD.CH2AFHOHIDON.EGMOBM.DIL2IA2NECO2DIEFKFEMHOD GM2IJDNOF.KJCFJIJCOEJDHKNBDLCM.2AGFIMKDMGLJGKF2BDBNBODIOP$P.EA.CHBHJK GEFBFLC2DMHFHNKNLFBC.MAEIDAEMO.ACKHCBOELDB2IAKI.2HMLJMIEMHBFNIBACBI.M DFAOJG2K.H2JE2JADKHKIFOADHEG2C2IBM.OM.EMJKAFKDHCNKNEBHFOLGIG.DNDAKJFJ IGFGCJMAFEKGK2H.FENO2JOHKOKLBEH.CMJAJMJOMED.L3COHJ2HDHCBLO2.KDLAF.JBC GKIBE2I.LOINI2MADM2EI.DEFNCGLNAOBM2AP$PKMCIAB2H2CLK.MOAB.A.CLIBJI.EHB DENJBKGHFOIAEKMOEMJIFLG2.2OM2AB2IKOFEBGNKBIFDFEIGADANOJABGDB2CMI2ABFD NJKAFA2IGEDIO2MNKFADFHDN2OLKGMKJC2BIJAJICKJKMDNG2OKENF2D2MEKEANKLOIJM FALALINGL.OHDCOKCJKAEHACDLBEBHOGC2GI.ODOAOFNKALFDMIMIJMLHBH3JONIBDONL I.IMDOIFEILJK.MKP$POAOBM.EL.DGLGF2HL.FMAM2OCAIEIFHGEIDCMO2EMGDAFDLJME HLIDLIKID2.OBDEGBOCANLDIEAOEJCIAGKNHE.FLMEMIC.M3CFEFLGIF.J2DHJEMLDNJO AFBAC.JOHOMDHDONCFDBIDGMCKAHMNO2KIBMELANFINEOJBI2CBLCGLJBLNOFJI2MH.2J M3AOK2L2O.HBDJ.JB2H2DHGM.BHMOEMEBC.DLGBGMFOB.D.IOHKAMG2LANIKO2CLP$PHA IELKAJNMGEL.KJCNEG2JIF.OANKDIGHKB2E.BFO.JLCJGAIGH2BJIK2.FBIJDBODCGHLH LABOHGI.B.CKOKHKOFLJ.IJ.KGJBONFDHDCK.JNKLG2IKOACHBMEOJNKLJ2HLGNHEICAD KOCMALBEMGOGLEKLMJFKHGICMNLNGFDEB.LAEBCJEJMIDIBMLD.KLJE2BCE.KFEABOH.C OEMANFOBOEAEHGNLAGHCFDFEIEIJ.JLFKLMAN2.BCGEFIP$PKDC.EJEDOKIKO2EKBNCF 3M2EADANIJHBMECDCDIHNMLKDLEOKOF.LIAFJEIL3B.AHKMKILDKOJ.IA.ICNDMA.NG.A JD2EGBLHNG.CBGIEDEDFMBCBGAOMJBL.KBLAOMLNAHCOIGFMCGBNINDBCDBJ.GH.ON2.N IOMIMIFJFANFOKGB.2KCDHO2E.LNGJFO.JBNI.2HAFG.3GHBCDEGAGKHIFIKNAIECJBMI MHKFKED.LDOGL2MGMOMLILBDP$PFNAOHA2LMKNLMIJ.C.CDEMJ2BF2BAM3BJFN2L2EFDK LGLKDMEBNGMNOKLMNJHCOKJLDHJEFHANEHKOA.OIKEGACNK.MGL.JHODKJEHMNLEMHA.D LCJLHEBFGFOJMOEOEH2NM2ACNJB2JEABENGJNMLKAF2KJEAICJH2A2NB.EACNFIOBCG2. DKCHDBLFICOBAEOA.M2CAJDKGMBH2K.EKOJMG.GCJ.AFGFGHFGFH.JM.HIDGCOKLANCDL KJDKP$PCO.2AOAOBDGIL2M.IJCIDF2D2BMFI.BLGNAN2M2HOGI3HMIN.A.FGCKDLJODNJ DB.IHOJKNAGOJHIMDBACAEKOMNHLCHCEOAK.DKB2GNMJMHC2HGOGIJDBE2DLO2GBGBMGI KCHKMAKHAJEAENFNKDJHBNEGOJBHGEJLBMECFG.KJBIHKDKOKO2HANCIKOKABFDFL.LBK BLDAFKJOHDEBH.DH2FCAODM2NLFNKFA2FLI.DL.MELIJIFNMBKCAOP$256P! golly-2.5-src/Patterns/Other-Rules/HPP-demo-small.rle0000644000175100001440000000261012156145314017346 00000000000000# HPP Lattice gas # # J. Hardy, O. de Pazzis, and Y. Pomeau (1973) J. Math. Phys. 14, 470. # # The earliest lattice gas model. Later made obsolete by the FHP gas on # a hexagonal lattice, which has better physical properties. # # In this simple demo, four gas particles bounce around inside a box. # They pass through each other unless meeting head-on, in which case they # collide and the particles leave at right angles to their initial # directions. Although it seems trivial, this is sufficient to simulate # fluid dynamics - see HPP-demo.rle. # # States following http://pages.cs.wisc.edu/~wylie/doc/PhD_thesis.pdf # # Each cell can contain up to 4 particles, each moving in one of the four directions. # Outgoing directions SENW map onto 4 bits, so W=0001=1, SEW=1101=13, etc. # Next state is simply the collected inputs, in most cases. # The exceptions are 5 (EW) and 10 (NS) which get swapped (bounce on collision). # # To make the gas useful in Golly's infinite area, I've added reflecting boundary # states, 16-31. These work in the same way as gas particles (collecting inputs) # but reverse their direction. Contact: Tim Hutton # # Sink boundary: (or you can vent to the outside but this way is neater) # 32 # Source boundary: (haven't really worked out how to use this well yet) # 33 # x = 14, y = 10, rule = HPP 14P$P12.P$P12.P$P8.A3.P$P12.P$P12.P$P3.M8.P$P12.P$P12.P$14P! golly-2.5-src/Patterns/Other-Rules/Langtons-Ant.rle0000644000175100001440000000112612156145314017175 00000000000000# Emulation of Langton's Ant using a von Neumann CA # # http://en.wikipedia.org/wiki/Langton's_ant # # extra states are used to code the ant's current direction: # # -----------------------------empty squares--------------------- # 0 : white # 1 : black # ----------------------------------------------ant is here------ # 2 : ant is facing north on a white square # 3 : east, white # 4 : south, white # 5 : west, white # 6 : north, black # 7 : east, black # 8 : south, black # 9 : west, black # --------------------------------------------------------------- # x = 1, y = 1, rule = Langtons-Ant E! golly-2.5-src/Patterns/Other-Rules/life-on-the-edge.rle0000644000175100001440000000143012156145314017677 00000000000000# In 2007 Franklin T. Adams-Watters described a CA in which all the action # occurs on the edges of a square grid. Each edge can be on or off and has # six neighbors, three at each end. An edge is on in the next generation # iff exactly two of the edges in its seven edge neighborhood (including # the edge itself) are on. # # The LifeOnTheEdge rule has 3 live states with suitable icons that allow # any pattern of edges to be created. # # This pattern shows a still life, some oscillators, a few spaceships and # a couple of puffers. # x = 53, y = 23, rule = LifeOnTheEdge 12.2A15.CA17.A$28.BAC17.B$47.A.A$47.CABA$48.BC4$2.A10.A$.3A8.2C14.C3B A$B2.B7.BC14.BA2B.C$.B2AC$3.A4$48.B$48.CA$12.2CA16.CA15.CA$11.C2.BA 13.AB.C15.B$11.C2.BA12.B2.A12.B2ABAC.AC$11.B2AC15.2B15.BAC$12.2B14.B. B17.B! golly-2.5-src/Patterns/Other-Rules/life-on-the-slope.rle0000644000175100001440000000175412156145314020126 00000000000000# In 2007 Franklin T. Adams-Watters described a CA in which all the action # occurs on the edges of a square grid. Each edge can be on or off and has # six neighbors, three at each end. An edge is on in the next generation # iff exactly two of the edges in its seven edge neighborhood (including # the edge itself) are on. # # LifeOnTheSlope has exactly the same behavior as LifeOnTheEdge, except # that patterns are rotated by 45 degrees. There are only 2 live states # (with icons \ and /), so it's a lot easier to enter patterns and they # run quite a bit faster. # # This pattern shows a still life, some oscillators, a few spaceships and # a couple of puffers. # x = 58, y = 63, rule = LifeOnTheSlope AB.B$2.B$A2.B17.B$B2.A18.B$.B$B.BA6$11.ABAB$11.BABA7$37.ABA$.BABA32.B .B$BA2.BA32.BA$A4.B$B4.A$AB2.AB$.ABAB2$27.ABA$27.B2.A$29.A.A$30.A.A$ 32.B$31.BA6$18.AB37.B$21.ABA30.B2.A$16.A6.B29.BA$19.AB.BA30.B.B$18.A. A33.A.A$54.BAB11$34.A7.A$34.B5.BA$35.B3.BAB$37.A.AB$36.AB$36.B.BA$36. ABA$40.B$41.BA! golly-2.5-src/Patterns/Patersons-Worms/0000755000175100001440000000000012156146015015155 500000000000000golly-2.5-src/Patterns/Patersons-Worms/worm-1040512.rle0000644000175100001440000000045312156145314017402 00000000000000#C One of Paterson's worms #C Implemented in Golly by Dean Hickerson, 11/30/2008 #C Pattern #055 #C Sven Kahrkling's notation 1040512 #C Gardner's notation 1a2c3cbaa4b #C Finishes after 569804 steps (1139608 gens in Golly), almost filling #C a regular hexagon. x = 1, y = 1, rule = Worm-1040512 A! golly-2.5-src/Patterns/Patersons-Worms/worm-1042015.rle0000644000175100001440000000050312156145314017376 00000000000000#C One of Paterson's worms #C Implemented in Golly by Dean Hickerson, 11/30/2008 #C Pattern #061 #C Sven Kahrkling's notation 1042015 #C Gardner's notation 1a2c3caca4a #C Final outcome unknown. According to Tomas Rokicki, it doesn't finish #C within 1.3*10^18 steps. #C Very chaotic. x = 1, y = 1, rule = Worm-1042015 A! golly-2.5-src/Patterns/Patersons-Worms/worm-1042020.rle0000644000175100001440000000043312156145314017374 00000000000000#C One of Paterson's worms #C Implemented in Golly by Dean Hickerson, 11/30/2008 #C Pattern #062a #C Sven Kahrkling's notation 1042020 #C Gardner's notation 1a2c3aaca4a #C Finishes after 57,493,855,205,939 steps, as determined by Tomas Rokicki. x = 1, y = 1, rule = Worm-1042020 A! golly-2.5-src/Patterns/Patersons-Worms/worm-1252121.rle0000644000175100001440000000426712156145314017412 00000000000000#C One of Paterson's worms #C Implemented in Golly by Dean Hickerson, 11/30/2008 #C Pattern #155 #C Sven Kahrkling's notation 1252121 #C Gardner's notation 1a2d3cbcc4b #C #C This almost certainly runs forever, repeatedly forming almost solid #C hexagons at certain times, as described below. (Here all times and #C distances are in terms of the Golly implementation. Divide by 2 to get #C measurements in terms of the original worm.) #C #C The worm forms a hexagon, whose horizontal sides have length 2^(3n+2)-2, #C completing the boundary at a point P in the middle of one side, in #C generation a(n). Then it wanders around inside for a while and leaves at #C the corner that's 210 degrees clockwise from P, in generation b(n). #C #C Next it builds a new hexagon, whose horizontal sides have length #C 2^(3n+3)-2, completing the boundary in the middle of the side that's 120 #C degrees clockwise from P, in generation c(n). Again it wanders inside, #C this time emerging in the middle of the side that's 60 degrees clockwise #C from P, in generation d(n). #C #C Next it builds a hexagon, with horizontal sides of length 2^(3n+5)-2, #C completing the boundary in the middle of the side that's 60 degrees #C clockwise from P, in generation a(n+1). Then the process repeats. #C #C The uneaten parts of the hexagons have a fractal structure, which can #C be viewed by changing the rule to "worm-complement" and running for #C one generation. #C #C Here are the formulas for a(n), ..., d(n) (for n>=1): #C #C a(n) = 9 2^(6n+3) - 261 n 2^(3n-1) - (197 2^(3n+1) + 5)/7 #C #C b(n) = a(n) + (45n + 13) 2^(3n-1) #C = 9 2^(6n+3) - 27 n 2^(3n+2) - (697 2^(3n-1) + 5)/7 #C #C c(n) = 9 2^(6n+5) - 9 n 2^(3n+5) - (2769 2^(3n-1) + 5)/7 #C #C d(n) = c(n) + (27n - 2) 2^(3n+1) + 12 #C = 9 2^(6n+5) - 117 n 2^(3n+1) - (2825 2^(3n-1) - 79)/7 #C #C (The hexagon at time a(1) doesn't quite fit the pattern.) #C #C Here are the first few values: #C #C n a(n) b(n) c(n) d(n) #C 1 3113 3345 14545 14957 #C 2 274605 277901 1130125 1136793 #C 3 18645101 18682989 74953837 75034745 #C 4 1205590893 1205986157 4826309485 4827177849 #C x = 1, y = 1, rule = Worm-1252121 A! golly-2.5-src/Patterns/Patersons-Worms/worm-1525115.rle0000644000175100001440000000425212156145314017412 00000000000000#C One of Paterson's worms #C Implemented in Golly by Dean Hickerson, 11/30/2008 #C Pattern #322 #C Sven Kahrkling's notation 1525115 #C Gardner's notation 1a2b3cbcc4a #C #C This almost certainly runs forever, repeatedly forming almost solid #C hexagons at certain times, as described below. (Here all times and #C distances are in terms of the Golly implementation. Divide by 2 to get #C measurements in terms of the original worm.) #C #C The worm forms a hexagon, whose horizontal sides have length 2^(3n+1)-2, #C completing the boundary at a point P in the middle of one side, in #C generation A(n). Then it wanders around inside for a while and leaves at #C the corner that's 210 degrees clockwise from P, in generation B(n). #C #C Next it builds a new hexagon, whose horizontal sides have length #C 2^(3n+2)-2, completing the boundary in the middle of the side that's 120 #C degrees clockwise from P, in generation C(n). Again it wanders inside, #C this time emerging in the middle of the side that's 60 degrees clockwise #C from P, in generation D(n). #C #C Next it builds a hexagon, with horizontal sides of length 2^(3n+4)-2, #C completing the boundary in the middle of the side that's 60 degrees #C clockwise from P, in generation A(n+1). Then the process repeats. #C #C The uneaten parts of the hexagons have a fractal structure, which can #C be viewed by changing the rule to "worm-complement" and running for #C one generation. #C #C Here are the formulas for A(n), ..., D(n) (for n>=1): #C #C A(n) = 9 2^(6n+1) - 261 n 2^(3n-2) - (179 2^(3n-2) + 13)/7 #C #C B(n) = A(n) + (45n - 2) 2^(3n-2) #C = 9 2^(6n+1) - 27 n 2^(3n+1) - (193 2^(3n-2) + 13)/7 #C #C C(n) = 9 2^(6n+3) - 9 n 2^(3n+4) - (1425 2^(3n-2) + 13)/7 #C #C D(n) = C(n) + (27n - 11) 2^(3n) + 12 #C = 9 2^(6n+3) - 117 n 2^(3n) - (1733 2^(3n-2) - 71)/7 #C #C (The hexagon at time A(1) doesn't quite fit the pattern.) #C #C Here are the first few values: #C #C n A(n) B(n) C(n) D(n) #C 1 577 663 3047 3187 #C 2 64965 66373 273221 275985 #C 3 4615093 4632117 18627125 18662977 #C 4 300894645 301076917 1205391797 1205789121 #C x = 1, y = 1, rule = Worm-1525115 A! golly-2.5-src/Patterns/Turmites/0000755000175100001440000000000012156146015013706 500000000000000golly-2.5-src/Patterns/Turmites/AlienCounter.rle0000644000175100001440000000220512156145314016722 00000000000000# A 3-state 2-color absolute-movement turmite (2D Turing machine) discovered by # Tim J. Hutton # # Appears to be counting, but in some clever alien way we haven't understood. If # you work it out, please let us know! Adam Goucher suggested that some of the # time it is counting in base-phi (the golden ratio), if that makes any sense to # you. # # http://code.google.com/p/ruletablerepository/wiki/TwoDimensionalTuringMachines # http://en.wikipedia.org/wiki/Turmite # # Specification string: # {{{0,'N',2},{1,'S',1}},{{0,'E',0},{0,'S',0}},{{1,'W',1},{1,'N',2}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to move: 'N' = North, etc. # - new internal state of the turmite # # For example, the triple {0,'N',2} says: # - set the color of the square to 0 # - move North # - adopt state 2 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py x = 1, y = 1, rule = AbsoluteTurmite_0N21S10E00S01W11N2 B! golly-2.5-src/Patterns/Turmites/ComputerArt.rle0000644000175100001440000000175112156145314016604 00000000000000# Computer Art - a 2-state 2-color Turmite discovered by Ed Pegg, Jr. # # The turmite works on a painting within an ever-expanding frame. Compare with # the pattern made by Margolus/TripATron.rle # # http://en.wikipedia.org/wiki/Turmite # http://demonstrations.wolfram.com/Turmites/ # http://www.mathpuzzle.com/26Mar03.html # # Specification string: {{{1, 8, 0}, {1, 2, 1}}, {{0, 2, 0}, {0, 8, 1}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple of integers. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to turn: 1=noturn, 2=right, 4=u-turn, 8=left # - new internal state of the turmite # # For example, the triple {1,2,1} says: # - set the color of the square to 1 # - turn right (2) # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/Turmite-gen.py # x = 1, y = 1, rule = Turmite_180121020081 B! golly-2.5-src/Patterns/Turmites/Extinction.rle0000644000175100001440000000241012156145314016454 00000000000000# A 3-state 3-color Turmite discovered by Ed Pegg, Jr. # # Ed Pegg, Jr. suggested two extensions of the turmite idea: that turmites # can turn in more than one direction, thus multiplying, and that when two or # more turmites land on the same square they annihilate each other. In certain # rare cases, such as this one, a population of turmites grows and then goes # extinct. # # http://en.wikipedia.org/wiki/Turmite # http://demonstrations.wolfram.com/Turmites/ # http://www.mathpuzzle.com/26Mar03.html # # Specification string: {{{1, 2, 0}, {2, 8, 2}, {2, 1, 1}}, # {{1, 1, 2}, {1, 1, 1}, {1, 8, 1}}, {{2, 10, 0}, {2, 8, 1}, {2, 8, 2}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple of integers. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to turn: 1=noturn, 2=right, 4=u-turn, 8=left # - new internal state of the turmite # # For example, the triple {2,10,0} says: # - set the color of the square to 2 # - turn left (8) *and* right (2) (8+2=10) # - adopt state 0 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/Turmite-gen.py # x = 1, y = 1, rule = Turmite_1202822111121111812a0281282 C! golly-2.5-src/Patterns/Turmites/FibonacciSpiral.rle0000644000175100001440000000155612156145314017372 00000000000000# Fibonacci Spiral - a 2-state 2-color Turmite discovered by Ed Pegg, Jr. # # http://en.wikipedia.org/wiki/Turmite # http://demonstrations.wolfram.com/Turmites/ # http://www.mathpuzzle.com/26Mar03.html # # Specification string: {{{1, 8, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 1, 0}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple of integers. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to turn: 1=noturn, 2=right, 4=u-turn, 8=left # - new internal state of the turmite # # For example, the triple {1,8,1} says: # - set the color of the square to 1 # - turn left (8) # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/Turmite-gen.py # x = 1, y = 1, rule = Turmite_181181121010 B! golly-2.5-src/Patterns/Turmites/Highway2074575.rle0000644000175100001440000000247412156145314016520 00000000000000# A 4-state 2-color absolute-movement turmite (2D Turing machine) discovered by # Stephen Wolfram # # Wolfram devotes a page to this 2D Turing machine and describes it as: "one # example where the behavior seems in many respects completely random." If you # let it run for long enough, you can see that the pattern is periodic, with # period 2,074,575 and dx=3953, dy=1912. # # http://www.wolframscience.com/nksonline/page-185 # http://www.wolframscience.com/nksonline/page-186 # http://code.google.com/p/ruletablerepository/wiki/TwoDimensionalTuringMachines # http://en.wikipedia.org/wiki/Turmite # # Specification string: {{{1,'N',1},{0,'S',1}},{{1,'S',3},{0,'N',2}}, # {{1,'W',0},{1,'N',1}},{{1,'S',2},{0,'E',1}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to move: 'N' = North, etc. # - new internal state of the turmite # # For example, the triple {1,'N',1} says: # - set the color of the square to 1 # - move North # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py x = 1, y = 1, rule = AbsoluteTurmite_1N10S11S30N21W01N11S20E1 B! golly-2.5-src/Patterns/Turmites/LangtonsAnt_LLRR.rle0000644000175100001440000000150112156145314017413 00000000000000# An extension of Langton's Ant to multiple colors. This example has the # specification "LLRR", meaning that on the four colors 0, 1, 2 and 3, the # ant turns left, left, right and right, respectively. # # The color of the square is always changed to the next color in order, in # a cyclical fashion: 0 -> 1 -> 2 -> 3 -> 0 # # The LLRR ant makes a symmetrical cardioid shape as it grows. The behavior # of these ants was investigated in a 1995 paper: # # Gale, D.; J. Propp, S. Sutherland, S.Troubetzkoy (1995). # "Further Travels with My Ant". # Mathematical Entertainments column, Mathematical Intelligencer 17: 48–56. # http://www.math.sunysb.edu/cgi-bin/preprint.pl?ims95-1. # # The rule tree was generated by this script: # Scripts/Python/Rule-Generators/Langtons-Ant-gen.py # x = 1, y = 1, rule = LangtonsAnt_LLRR G! golly-2.5-src/Patterns/Turmites/Perfectionist.rle0000644000175100001440000000206112156145314017150 00000000000000# A 3-state 2-color absolute-movement turmite (2D Turing machine) discovered by # Tim J. Hutton # # Seemingly random for 15.5 million timesteps before making a highway. One of # the very few 3-state 2-color 2D Turing machines to exhibit interesting # behavior. # # http://code.google.com/p/ruletablerepository/wiki/TwoDimensionalTuringMachines # http://en.wikipedia.org/wiki/Turmite # # Specification string: # {{{0,'S',1},{1,'W',1}},{{1,'E',2},{1,'S',2}},{{1,'W',0},{0,'N',0}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to move: 'N' = North, etc. # - new internal state of the turmite # # For example, the triple {0,'S',1} says: # - set the color of the square to 0 # - move South # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py # x = 1, y = 1, rule = AbsoluteTurmite_0S11W11E21S21W00N0 B! golly-2.5-src/Patterns/Turmites/TriangularAnt_period92.rle0000644000175100001440000000126112156145314020623 00000000000000# Langton's Ant on a triangular grid. # # This turmite has the same instructions as the normal Langton's Ant: turn right # on 0, left on 1 - but works on a triangular grid instead of a square one. # # Unlike the square grid ant, some patterns on the triangular grid cause the ant # to follow a bounded trajectory. This pattern has period 92, and is from this # webpage: # http://www.ing-mat.udec.cl/~anahi/langton/general.html # (Although they call it a hexagonal grid after the graph joining the cells, # rather than the shape of the cells themselves.) # # Rule generated by Scripts/Python/Rule-Generators/TriTurmite-gen.py # x = 5, y = 5, rule = TriTurmite_120010 2.A$3.H$H.M.A$.A$2.H! golly-2.5-src/Patterns/Turmites/TriangularLangtonsAnt.rle0000644000175100001440000000102712156145314020614 00000000000000# Langton's Ant on a triangular grid. # # This turmite has the same instructions as the normal Langton's Ant: turn right # on 0, left on 1 - but works on a triangular grid instead of a square one, and # so the resulting behaviour is different. As with some of the n-color Ants, # the resulting pattern is symmetrical and growth appears unbounded - presumably # the same proof of this as in the square grid case applies. # # Rule generated by Scripts/Python/Rule-Generators/TriTurmite-gen.py # x = 1, y = 1, rule = TriTurmite_120010 B! golly-2.5-src/Patterns/Turmites/WormTrails.rle0000644000175100001440000000171112156145314016436 00000000000000# Worm Trails - a 2-state 2-color Turmite discovered by Ed Pegg, Jr. # # After building happily for 4 million timesteps the turmite gets stuck in # a short cycle. # # http://en.wikipedia.org/wiki/Turmite # http://demonstrations.wolfram.com/Turmites/ # http://www.mathpuzzle.com/26Mar03.html # # Specification string: {{{1, 2, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 2, 0}}} # # This string is a curly-bracketed table of n_states rows and n_colors columns, # where each entry is a triple of integers. The elements of each triple are: # - new color of the square # - direction(s) for the turmite to turn: 1=noturn, 2=right, 4=u-turn, 8=left # - new internal state of the turmite # # For example, the triple {1,2,1} says: # - set the color of the square to 1 # - turn right (2) # - adopt state 1 and move forward one square # # To generate Turmites like this one, run this script: # Scripts/Python/Rule-Generators/Turmite-gen.py # x = 1, y = 1, rule = Turmite_121181121020 B! golly-2.5-src/Patterns/WireWorld/0000755000175100001440000000000012156146015014010 500000000000000golly-2.5-src/Patterns/WireWorld/circuit.mcl0000644000175100001440000000351512156145314016074 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 80x80 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D The cellular automaton WireWorld is attributed to Brian Silverman and #D was included in his program PHANTOM FISH TANK. #D A. K. Dewdney publicized WireWorld in his "Computer Recreations" #D column (Scientific American, January, 1990). #D #D Cells in WireWorld have one of four possible states: background (0), #D electron head (1), electron tail (2), and wire (3). #D #D The rules for updating cells are: #D #D - background (0) always remains background. #D - electron head (1) always changes to electron tail. #D - electron tail (2) always changes to wire. #D - wire (3) changes to electron head if one or two of its neighbours are electron heads. #D #D These simple rules allow fairly complicated logic circuits to be #D constructed. #L .49C$C49.C$C49.C$C49.C$C49.C$C49.C$C9.C23.C15.C$C8.C.C.CC.CC15.C.C.CC. #L CC8.C$C8.C..CC.C.4C12.C..CC.C.4C5.C$C8.C3.CC.CC3.C.3C7.C3.CC.CC3.C.3C$ #L C6.CC8.C4.C3.7C8.C4.C$C12.CC..C.CC.C14.CC..C.CC.C$C6.7C.CC.C.CC9.7C.CC #L .C.CC$C5.C6.CC4.CC9.C6.CC4.CC$C5.C23.C$C5.C23.C$C5.C23.C$C6.19C5.19C$C #L 25.C23.C$C25.C23.C$C25.C23.C$C9.C15.C7.C15.C$C8.C.C.CC.CC8.C6.C.C.CC. #L CC8.C$C8.C..CC.C.4C5.C6.C..CC.C.4C5.C$C8.C3.CC.CC3.C.3C7.C3.CC.CC3.C. #L 3C$C6.CC8.C4.C3.7C8.C4.C$C12.CC..C.CC.C14.CC..C.CC.C$C6.7C.CC.C.CC9.7C #L .CC.C.CC$C5.C6.CC4.CC9.C6.CC4.CC$C5.C23.C$C5.C23.C$C5.C23.C$C6.19C5. #L 19C$C25.C23.C$C25.C23.C$C25.C23.C$C9.C15.C7.C15.C$C8.C.C.CC.CC8.C6.C.C #L .CC.CC8.C$C8.C..CC.C.4C5.C6.C..CC.C.4C5.C$C8.C3.CC.CC3.C.3C7.C3.CC.CC #L 3.C.3C$C6.CC8.C4.C3.7C8.C4.C$C.CC9.CC..C.CC.C14.CC..C.CC.C$.CC.10C.CC. #L C.CC9.7C.CC.C.CC$..CC9.CC4.CC9.C6.CC4.CC$30.C$30.C$30.C$30.C$30.C$30.C #L $30.C$.3C.25C$C3.C$C3.C$C3.C$.CBA golly-2.5-src/Patterns/WireWorld/clocks.mcl0000644000175100001440000000254112156145314015706 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D Clocks #D #D To establish a clock it is only necessary to set up a ring whose #D circumference has the desired period, draw the signal off at some #D point, and insert an electron. Diodes can be used to protect the clock, #D and to ensure a particular direction of circulation. More elaborate #D clocks can be constructed by spacing out several electrons within #D the same circumference. #D #D WireWorld inherits the basic three-cell loop from the Zhabotinsky reactions, #D yielding all kinds of period-3 clocks. That is also the closest spacing that #D two electrons can have, but it is entirely too fast and dense for most applications. #D #D Loops yielding period six or even longer lead to more conservative constructions. #D Period six allows the inclusion of ultrafast period three subassemblies. #D #D A clock seems to be the only way to create the boolean constant TRUE; #D once again it is worth emphasizing that the constant only appears at intervals #D and propagates with a finite velocity. #D #D Harold V. McIntosh #L 7.A13C$7.B6$7.C$6.B.13C$7.A5$5.3C$4.C3.C$4.C3.13C$4.C3.C$5.CBA5$4.4C$ #L 3.C4.C$3.C4.13C$3.C4.C$4.CCBA5$.7C$C7.C$C7.13C$C7.C$.5CBA golly-2.5-src/Patterns/WireWorld/flip-flop.mcl0000644000175100001440000000161612156145314016322 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D The following is a negative going edge-triggered flip flop. #D #D Using this circuit, you can construct counters, dividers and #D things- though the Transit time does pose a bit of a problem... #D #D Transit: 21 (measured from entry of entry of a 'missing' electron) #D IBI: 5 #D Size: 16x13 #D #D The right pattern is a flip flop that toggles with every electron sent in. #D #D Transit: 14 #D IBI: 5 #D Size: 11x13 #D #D Ian Woollard, March 1990 #L ..C18.C$..C18.C$..C18.C$..C18.C$..C3.3C12.C3.3C$..C.3C.CC11.C.3C.CC$3. #L C..C.C.C11.C..C.C.C$..3C.3C.C10.3C.3C.C$..C.C..C..C10.C.C..C..C$.CC.3C #L ..C10.CC.3C..C$C.3C3.C10.C.3C3.C$C6.C11.C6.C$.6C13.6C$6.C.C16.A$7.3C$ #L 4.3C.C.C$3.C6.C$4.7C$10.A golly-2.5-src/Patterns/WireWorld/gate-AND.mcl0000644000175100001440000000151012156145314015743 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D AND #D #D A little ingenuity produces the following AND gate; #D the signals enter at the top corners, their AND exits #D at the bottom right hand corner. #D #D This literal construction shows too many cells; the circuit #D can be rearranged into other forms. #D #D Harold V. McIntosh #L 14.A5C$20.C$10.A5C5.3C$16.C.C.C3.C$17.3C4.C$18.C.C.C.C$21.3C$22.C.10C #L 11$4.A5C19.6C$10.C24.C$6C5.3C11.A5C5.3C$6.C.C.C3.C16.C.C.C3.C$7.3C4.C #L 17.3C4.C$8.C.C.C.C18.C.C.C.C$11.3C22.3C$12.C.10C13.C.10C6$4.CA4C19.A5C #L $10.C24.C$A5C5.3C11.CA4C5.3C$6.C.C.C3.C16.C.C.C3.C$7.3C4.C17.3C4.C$8.C #L .C.C.C18.C.C.C.C$11.3C22.3C$12.C.10C13.C.10C golly-2.5-src/Patterns/WireWorld/gate-NOT.mcl0000644000175100001440000000077112156145314016011 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D NOT (clocked, has to be) #D #D A correctly timed signal from left (shown) will cancel the signal that #D would otherwise leave at right. #D #D Harold V. McIntosh #L 3CBACCBACCBACCBAC$18.C$17.3C$18.C$17.C.11C$16.C$15.B.C$16.A7$6CBA6CBA #L CC$18.C$17.3C$18.C$17.C.11C$15.CC$14.C..C$14.C..C$15.BA golly-2.5-src/Patterns/WireWorld/gate-OR.mcl0000644000175100001440000000140212156145314015661 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D OR #D #D A 'T'' can be used as an OR gate for a pair of signals; #D the main concern is that one signal should not encroach #D upon the territory of the other when the second is absent. #D #D The signals arrive along the arms of the 'T',' the composite #D departs along the stem. It is essential that the stem rise one #D cell above the crossbar, thereby isolating the incoming signals; #D a barrier lurks beneath it all. #D #D Harold V. McIntosh #L .A$.C$.C$.C$.C$12C$.C$.C$.C$.C$.C3$.C$.C$.C$.C$.C$12C$.C$.C$.C$.C$.A3$ #L .A$.C$.C$.C$.C$12C$.C$.C$.C$.C$.A golly-2.5-src/Patterns/WireWorld/gate-XOR.mcl0000644000175100001440000000140512156145314016014 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D XOR (EXCLUSIVE OR) #D #D A signal from top or bottom (not both) will cause a signal to leave at right. #D No signal will pass through from top to bottom or vice versa. #D #D As a circuit element it is not much used in design, but it has a theoretical #D importance with respect to minimal collections of gates from which all #D others can be derived. For example, NANDs by themselves are sufficient #D for the purpose. #D #D Harold V. McIntosh #L .A$.C$.C$.C$4C$C.10C$4C$.C$.C$.C$.C3$.C$.C$.C$.C$4C$C.10C$4C$.C$.C$.C$ #L .A3$.A$.C$.C$.C$4C$C.10C$4C$.C$.C$.C$.A golly-2.5-src/Patterns/WireWorld/Langtons-ant.zip0000644000175100001440000000677512156145314017041 00000000000000PKäNÍ:°¬F߉ ÍLangtons-ant.mcUT Üê2Jör‡JUxöP]XËn#ɼó+ ØÃî M׳»|3|µ/¶=6À•Zbc(r@¶–½#"«šÔb$Mw=2#_‘Uý¯¿…»ŸÞÎÇãwž†Ÿw?üÝýº\æ_Ï—ãË¸–ë}Ä}Û¯ë|9¹ëòþqܯóÕýuz[ϧ¯îϧÕ-'·wo—åÅ_]þ›·Çðó|<^Ÿ(ïóìëúíO_¾Ün·§Ã¼\ç§ÛõËÑÄ<Ö÷£{=_Ü˼î—ãÕOîp¾¹eu·óåëâ„«Éx߯‡‘=ÝÎÇ×Ëþýéùüþ¥aºÑ]àûù2»ýoçõ3fÂÚ,íöáq9=?^æ³éË7÷º!áx>½¹Û²0z\Öc×çËòmuëa¿RÒu^¯îãæOËóŒý˺ìî÷e¾¹ëŽîûùÃö¿Ïn=»—3Õ]×ýeuoói¾ì×åôFA°ÕÝöëó¢g÷úqºcÝŸà læÄí|z™/Wºœ¯‡ýõp\^ õí|Ð÷_Üò*•°é2ï¯3× é:£”0ý'rì$?/x>!#ÖýWHq¯Ä=?CËUž¤FûX,O˜¼^ö/óûþòÕ–·Ãmÿ]–U;.[Ýüò6w Ê“Ÿö¯ð¸†‚R~†aóÂøóÓλÁEþîþòŸßÅöÚ,Þõ4´§Øž‚K.ã¹´YJéëâ&yäÉUç‡&ztÞkÔK_×ïcI+½þdNø“¤½ãÍÎO<Ùü@, ÝððÄ•Á»‚é ÖC{uæÅ]œ/.¤Í&/ã_ÙÔш0Qpä6Ü}MatrFª‹¾I«Z‚ø)zÆ~jëG!òæVÂõôBéƒâé;™1q¼RæÈ壹*b¸ºQqVÂ×35×6ì9S ÅEÂOr)»Tèˆ..Á®QÊC3Üœ<µbM•Ø.¯?ƒÇ#­4ŸñÇËt{Fܰ=ã?ü ¯Ìñ=’æHçh¦ Â@ca¨’ŽO2/Ý£@gL"ÞØÃgï2b_]I†T©${˜²ì‘|ì/®Œ®@›baðÍo{ÍPË–dñ-´ õˆüön nŒ}ÊÐ*t^¡ðJºÒÜbX¸9»±¸qtã¤/\ל?}D‹¯Rb°˜LX„wˆ¤å¥º1¹±º)íûˆ/BŸÝ”·¸XíXPP ­:§ÑMS³/x׋¶’è6§™ó{V'çû¨UJ “TD “«YY´â®#«;¹©º Ç M'¼¡ ‘„ƒKiÌÞhV¡•/UîÇnH¦ü@?Ò¿|N¾á%Sµ²0ý0Z O¢ ,smhÉìþàø$ð~ÀN©‡:º+¢ñDÙŒôL*’]fò57ÀÏ9VR³05&ĨÅrÏ´+xÜ×ÝØé9 ¬ÒB§%ØB)pœV'²XbЩhJÔ#­õ@!khg ñÑ×y§Ä€ê)SsÓêÁe>Œ\NDܼ& r ö2™úz`Gþí Ó Á©½_ »ÚM@aµ]`bhÚdŒ”ÓeDhŠÛ\Üà#ÕO]>ë*Þç¨-oo…«ûÊÄ îH|â/:U‡$´˜ÞÍ|Ê›†@-Û[¥¤M Iø®!<Øê³´l˜qù¾1ró½¼¶JtÆ-'‰È-犒rÜ2kPbÙJ±g†'kefïyNÙ‚SX¨¦” nQƒo`ÁϾlîð™}2 b(®÷u«vՇحK`YÚ¢Úž(aC¾{p¤=‘ƒi=¸’ÙØåõ]zôz·'ý[z¦:(Óƒ3ý8±®—a6ž½Ó“JšÐy̓ýDöÄäL€u~us"²võ¼ukê%Éq˜Ç"[HZê7»dÔ8˜1¹¶NÜÕÈHºd•ìkôé7 ¬;P–8¸ÔW>'e@îq€ê µ‘ \0€$@¢·vþÁ»ØÕ؇èHÄœ¯<Q úeήu‘n3˜Õíœ$ ÝÒ |$ 5ŠëÈØŽ$¥!3š§ãynƒûÝ‚@îól8àó0p’0Õ¼º+w¹ód‡Ïso‡#ÓdR¹Á3EéhÀÅéiT›³f§À2¨ÕÌC¤’KØbYF–¬ÛX–®%í6’¥Ôý˜ÁªGÆ pØïšL“¼UäoÓ$ÏάЂØWîŠÍ& ¨4‹•Çjä!Ôˆ›Èˆ†æû*l“З²0Ëã>ð¥*I¸×h’dXÂã ˆ5Ä  ÎÑmÝåÖ;º©R%ó;r¹¡¶h9£–X>D>[D'nÐ¥JÂr!L¸!âÁ‚nÈ%o ÷ºÈ.®„@ToˆŒV´ó}g¢ÜÒî¡õ†ÄÜÜÒ#–ˆ=,q’ý„#ÿ¡¯Zpî5 „ì{¬´b²}Ÿš+÷mÝ5d–UêaP@âî?¬ÐtÃi0è:dšI ì\AüÄÒÇš,­º©fP±J‹K‡-§È¡õàœJìnÕ”Í5œ7‡w<Äöì¡ÀŠZOÈú[䤡9ˆ®ÖÙÀÒº6›…ƒõKë‰>Z.e³žxÑ›‰ oh4§ñ€¢*–ÄCóÔ ¢a’Pm„1™-#åY"´À.EÄ› —0W‹ŠáÚõøøŽK’ùKÉX;É¿ŒjÚp a0Y†‹»¦`¾›èÃBÿ¼8bíÄËœ03±i-ý<ÊvÙh7-Q>dC9kx&“>±µFJž(•:ù,»Ì¿Ý»ÒýÛ}@9àÅPC÷·<l§Ù§5É2ż+í¾¡d˳˜xÐì˜8€CU61Ó¨Ï,–ä`ÒÍbŽ˜ºÅ’LºY,Éù))~jxwš‹"u‘y#¹‘Mdí²¤GZ]±Ìa~у#¡¾Šãä^†6í"±•ßdW½Ô®•Yo£Ê$N 7ØÙæôaeÚœ]UK+ h%?¡ü¢NWºŒš­Ö×îi‡µ8YW‰“Jg*š· lÐ=tèRÛi'N¹ïäŽ*l5(™ÜH:à­Ævn‰ ©ÉÒŽ,ÅŠa¾jc>vZ«ôZ¬"ŸÊ v5ÎdJà°ˆ”4YD™-É Úp´”Š­›AòŽßjõñlhî8R ‡9¨øZ}ô¬Ñ¸ÕrXBpÆ^/Êø`lmù©5­:ªå‰6–F íSìƒçiH Q‘£ì’ù9!d Œ•3),âT@ÏÉó:‹²áçT+½˜y9wÿPKe; —JVMinit.pyUT ¯q‡Jqr‡JUxöP]‘Ýn£@ …ïy «½(‘º+ õú«­ä€V†1› ôéë¨\ ÇÇŸ}xœ$ôÂP¡/Š{Ð…­@[ &P¿Ô€±›S9g“?'6ÉX"¨ÜÄ‹Äs‡vÀØûë@&4#/TÃdÞ"%4Ž}ÑÿU²û²ÚmÏ›]y—ýÝþîñƒÒ.3QÔ99Í@ÐJ¤’-ª•î ÐÊ#L{Ä3gBeZ¿)m F¹ÐZ/Y©Ð%™&GÓgëTþ«ž?¸‡Óú„×¾_uþëuãºf¿ßÄûÁàfú©nnš¯#«—í—ðÉ« ²¯ÖÿwŸ Ç$K\ƒ#[§ãÈÆ|?4å©›Ã[ïxîàH­Œ>$tüþ~…=ì‡ï)PkI¢B{m=NL2çÜWK‘%m‹9¢RÙn±å6e½+>PKäNÍ:°¬F߉ Í ¤Langtons-ant.mcUTÜê2JUxPKe; —JVM ¤Ë init.pyUT¯q‡JUxPKŒ[ golly-2.5-src/Patterns/WireWorld/memory-cell.mcl0000644000175100001440000000214612156145314016656 00000000000000#MCell 4.00 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 60x60 #SPEED 100 #WRAP 0 #CCOLORS 4 #PALETTE 8 colors #D The wire on the left is the SET input, the wire on top the CLEAR input, #D and the wire on the right is the output. The inputs and outputs are #D supposed to be pulsed at 6-cycle intervals. #D #D Initially there are no electrons in the loop. At a tick which we'll number #D 0, an electron enters the device as shown in the top picture. #D Some cycles later, it leaves the output, and a duplicate rounds the bottom of #D the loop for another cycle, so that the memory will continue outputing #D the pulse. #D #D But, if at this time (or any multiple of 6 cycles afterwards) a pulse #D arrives in the CLEAR input, then two cycles later, the pulse in the loop #D will go away, and pulses will stop coming out the output. #D #D Mike Frank, March 1990 #L 8.C$8.C$7.3C$8.C$7.C.C$7.C.C$BA7C.14C$7.C6$8.B$8.A$8.C$8.C$8.C$8.C$8.C #L $8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$8.C$7.3C$8.C$7.C.C$7. #L C.C$BA7C.14C$7.C golly-2.5-src/Patterns/WireWorld/NickGardner.mcl0000644000175100001440000004203512156145314016621 00000000000000#MCell 4.20 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 400x200 #SPEED 20 #WRAP 0 #D 8-bit multiplier by Nick Gardner, Aug 2002. #D (see http://www.maa.org/editorial/mathgames/mathgames_05_24_04.html) #D #D C15 to C0 consist of 16 half-adders each made of an AND gate and an XOR gate. #D When set to one, a C-bit is represented by a looping electron. #D #D The bits of A7-A0 shift rightwards across the pattern. The bits of B7-B0 arrive #D in procession to meet the A bits at the AND gates just below the half adders. #D If the B bit is one the A bits proceed up to the half adders, otherwise they #D are cancelled. #D #D An unset C-loop will be set if an A bit arrives. A set C-loop will become unset #D and will throw a carry leftwards to the next C-loop. #D #D C-loops are 15 generations long. The B-bits arrive 105 generations apart. #D This is the minimum to ensure carrying bits in the half-adders don't collide #D with the next presentation of A-bits. #D #D The product can usually be seen after about 1000 generations, but to get rid #D of all superfluous electrons run the pattern for exactly 1661 generations. #D #D The AND gate in the C15 loop isn't necessary but has been left in to preserve #D the flashing effect of the C-loops. #L 21.3C.C.3C217.3C.3C$21.C3.C.C219.C3.C.C$21.C3.C.3C217.C3.C.C$21.C3.C3. #L C217.C3.C.C$21.3C.C.3C217.3C.3C3$23.5C10.5C10.5C10.5C10.5C10.5C10.5C #L 10.5C10.5C10.5C10.5C10.5C10.5C10.5C10.5C10.5C$22.C5.C8.C5.C8.C5.C8.C5. #L C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C #L 5.C$22.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C8.C5. #L C8.C5.C8.C5.C8.C5.C8.C5.C8.C5.C$22.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C #L 9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C9.C4.C$23.C.4C9. #L C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C9.C.4C #L 9.C.4C9.C.4C9.C.4C$24.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC #L 6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC #L 6.3C.C..CC6.3C.C..CC6.3C.C..CC6.3C.C..CC$23.C.4C.C..C4.C.4C.C..C4.C.4C #L .C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C.. #L C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C.4C.C..C4.C #L .4C.C..C$20.3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C #L ..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C #L .C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C..3C4.C..C.C$19.C3.C #L .C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C #L .C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C #L .C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C.C..CC..C.C3.C #L .C..CC..C$19.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4. #L 3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C4.3C5.C.C #L 4.3C5.C.C4.3C5.C$19.C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C #L .C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC.. #L C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C #L ..CC..C.C.C.C.C..CC..C.C.C.C.C..CC..C.C.C.C.C..CC$20.3C5.CC5.3C5.CC5. #L 3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC #L 5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC5.3C5.CC$21.C8.C3.C.C..CC4.C3.C.C..CC #L 4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C.. #L CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C..CC4.C3.C.C #L ..CC4.C3.C.C..CC4.C$31.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C #L 4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C #L ..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C.C4.C..C4.C$32.C..3C3.C3.3C..3C #L 3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C #L 3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C..3C3.C3.3C #L ..3C3.C3.C$34.C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C #L .C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC #L 3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C.C..C4.CC3.C$33.C4.C5.C3.C4.C5. #L C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C #L 5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C3.C4.C5.C$32.C4.C..3C.C..C4.C.. #L 3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C #L ..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C4.C..3C.C..C #L 4.C..3C.C..C4.C..3C.C$31.C..C..C.C3.C..C..C..C.C3.C..C..C..C.C3.C..C.. #L C..C.C3.C..C..C..C.C3.C..C..C..C.C3.C..C..C..C.C3.C..C..C..C.C3.C..C5. #L C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C #L 3.C$31.C.C.C.C.C..3C.C.C.C.C.C..3C.C.C.C.C.C..3C.C.C.C.C.C..3C.C.C.C.C #L .C..3C.C.C.C.C.C..3C.C.C.C.C.C..3C.C.C.C.C.C..3C.C5.C.C..3C.C5.C.C..3C #L .C5.C.C..3C.C5.C.C..3C.C5.C.C..3C.C5.C.C..3C.C5.C.C..3C$31.C.C.C.C.C3. #L C..C.C.C.C.C3.C..C.C.C.C.C3.C..C.C.C.C.C3.C..C.C.C.C.C3.C..C.C.C.C.C3. #L C..C.C.C.C.C3.C..C.C.C.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C #L 3.C..C5.C.C3.C..C5.C.C3.C..C5.C.C3.C$3C.3C5.3C.3C5.C6.C.C.C..C.C.C3.C. #L C.C..C.C.C3.C.C.C..C.C.C3.C.C.C..C.C.C3.C.C.C..C.C.C3.C.C.C..C.C.C3.C. #L C.C..C.C.C3.C.C.C..C.C.C3.C6.C.C.C3.C6.C.C.C3.C6.C.C.C3.C6.C.C.C3.C6.C #L .C.C3.C6.C.C.C3.C6.C.C.C$C.C3.C5.C.C.C.C6.C4.C..C.C5.C3.C..C.C5.C3.C.. #L C.C5.C3.C..C.C5.C3.C..C.C5.C3.C..C.C5.C3.C..C.C5.C3.C..C.C5.C3.C10.C3. #L C10.C3.C10.C3.C10.C3.C10.C3.C10.C3.C10.C$3C3.C.3C.3C.C.C.7C..C..C3.CCA #L .3C.C..C3.CCA.3C.C..C3.CCA.3C.C..C3.CCA.3C.C..C3.CCA.3C.C..C3.CCA.3C.C #L ..C3.CCA.3C.C..C3.CCA.3C.C10.3C.C10.3C.C10.3C.C10.3C.C10.3C.C10.3C.C #L 10.3C$C.C3.C5.C.C.C.C6.C3.C.C9.C..C.C9.C..C.C9.C..C.C9.C..C.C9.C..C.C #L 9.C..C.C9.C..C.C9.C..C11.C..C11.C..C11.C..C11.C..C11.C..C11.C..C11.C$C #L .C3.C5.C.C.3C5.C3.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C.. #L C.C3.7C..C.C3.7C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C10.C #L .C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C.C12.C$28.C..8C..C.C..8C..C.C..8C..C.C..8C..C. #L C..8C..C.C..8C..C.C..8C..C.C..8C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12. #L C.C12.C$28.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C12.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C$28.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C.C10.C.C.C10.C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C #L .C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C10.C.C.C10.C.C.C10.C. #L C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C12.C.C12.C.C12.C.C12.C.C12.C. #L C12.C.C12.C$28.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C10.C.C. #L C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C$28.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C #L .C12.C$28.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C12.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C$28.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C.C10.C.C.C10.C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C #L 3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C #L .C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..C9.C.C..C9.C.C..C9.C. #L C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C12.C.C12.C.C12.C.C12.C.C12.C. #L C12.C.C12.C$28.C.C..5C3.C.C.C..5C3.C.C.C..5C3.C.C.C..5C3.C.C.C..5C3.C. #L C.C..5C3.C.C.C..5C3.C.C.C..5C3.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C #L 12.C$28.C.C.C5.C..C.C.C.C5.C..C.C.C.C5.C..C.C.C.C5.C..C.C.C.C5.C..C.C. #L C.C5.C..C.C.C.C5.C..C.C.C.C5.C..C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C. #L C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C.. #L C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C #L .C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C #L ..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C. #L C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C12.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C. #L C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12.C.C12. #L C.C12.C.C12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C #L .C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12.C.C12.C.C12.C.C12.C #L .C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C.. #L C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C #L 6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C12.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C.. #L 4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C12. #L C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C. #L C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C #L ..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C #L .C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C12.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C #L .C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C12. #L C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C.C.C6.C. #L C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12.C.C12.C #L .C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C #L .C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C.C.C.C. #L C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C.. #L 4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C #L .C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C6.C.C.C.C.C6.C.C.C. #L C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C12. #L C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C.C.C #L ..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C #L ..C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C.C6.C.C.C.C.C6.C #L .C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C.C.C6.C.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C.C..4C..C.C.C.C..4C..C.C. #L C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C..4C..C.C.C.C.. #L 4C..C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..C5.C.C.C.C..C #L 5.C.C.C.C..C5.C.C.C.C..C5.C.C.C.C..C5.C.C.C.C..C5.C.C.C.C..C5.C.C.C.C #L ..C5.C.C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..6C..C.C.C.. #L 6C..C.C.C..6C..C.C.C..6C..C.C.C..6C..C.C.C..6C..C.C.C..6C..C.C.C..6C.. #L C.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..C6.C..C.C..C6.C..C #L .C..C6.C..C.C..C6.C..C.C..C6.C..C.C..C6.C..C.C..C6.C..C.C..C6.C..C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C.C12.C$28.C..C5.C3.C.C..C5.C3.C.C..C #L 5.C3.C.C..C5.C3.C.C..C5.C3.C.C..C5.C3.C.C..C5.C3.C.C..C5.C3.C.C12.C.C #L 12.C.C12.C.C12.C.C12.C.C12.C.C12.C$29.C.C4.C4.C..C.C4.C4.C..C.C4.C4.C #L ..C.C4.C4.C..C.C4.C4.C..C.C4.C4.C..C.C4.C4.C..C.C4.C4.C..C11.C..C11.C #L ..C11.C..C11.C..C11.C..C11.C..C11.C$30.C4.C4.3C..3C..C4.3C..3C..C4.3C #L ..3C..C4.3C..3C..C4.3C..3C..C4.3C..3C..C4.3C..3C..C4.3C..C9.3C..C9.3C #L ..C9.3C..C9.3C..C9.3C..C9.3C..C10.C$34.C6.C.C..C..C6.C.C..C..C6.C.C..C #L ..C6.C.C..C..C6.C.C..C..C6.C.C..C..C6.C.C..C..C6.C.C..C9.C.C..C9.C.C.. #L C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C$34.C..CC.C3.C.C..C..CC.C3.C.C..C #L ..CC.C3.C.C..C..CC.C3.C.C..C..CC.C3.C.C..C..CC.C3.C.C..C..CC.C3.C.C..C #L ..CC.C3.C.C5.CC.C3.C.C5.CC.C3.C.C5.CC.C3.C.C5.CC.C3.C.C5.CC.C3.C.C5.CC #L .C3.C.C9.C$35.3C.C3.3C..5C.C3.3C..5C.C3.3C..5C.C3.3C..5C.C3.3C..5C.C3. #L 3C..5C.C3.3C..5C.C3.3C4.3C.C3.3C4.3C.C3.3C4.3C.C3.3C4.3C.C3.3C4.3C.C3. #L 3C4.3C.C3.3C10.C$37.CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C. #L C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C. #L C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C.C..C..CC3.C.C #L 11.C$41.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C #L 7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C4.C.C7.C14.C$40.C.C..C3.4C..C.C..C #L 3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C #L ..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C.C..C3.4C..C #L .C13.C$40.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C #L 8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C.C8.C.3C13.C$41.C..C..6C3.C..C.. #L 6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C.. #L 6C3.C..C..6C3.C..C..6C3.C..C..6C3.C..C..6C3.C14.C$41.C.C..C9.C.C..C9.C #L .C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C9.C.C..C #L 9.C.C..C9.C.C..C9.C14.C$41.C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C #L ..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3.7C..C.C3. #L 7C..C14.C$41.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C #L .C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C14.C$41.C.C..8C..C.C.. #L 8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C.C..8C..C14.C$41.C.C.C10.C.C.C10.C.C.C10.C.C. #L C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C. #L C.C10.C14.C$41.C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C #L .C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C14.C$ #L 41.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C14.C$41.C.C..8C..C.C..8C..C.C.. #L 8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C #L ..8C..C.C..8C..C.C..8C..C14.C$41.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C #L 10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C #L 14.C$41.C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C #L ..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C.C..8C..C14.C$41.C.C #L 10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C.C10.C.C #L .C10.C.C.C10.C.C.C10.C.C.C10.C.C14.C$41.C.C5.5C..C.C5.5C..C.C5.5C..C.C #L 5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C.C5.5C..C #L .C5.5C..C.C5.5C..C14.C$41.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C #L 4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C.C4.C7.C14.C$41. #L C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4. #L C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C..C4.3C4.C14.C$40.C #L 4.C6.C4.C..C6.C..C4.C6.C4.C..C6.C..C4.C6.C4.C..C6.C..C4.C6.C4.C..C6.C #L ..C4.C6.C4.C..C6.C..C4.C6.C4.C..C6.C..C4.C6.C4.C12.C$39.C6.6C6.C..6C.. #L C6.6C6.C..6C..C6.6C6.C..6C..C6.6C6.C..6C..C6.6C6.C..6C..C6.6C6.C..6C.. #L C6.6C6.C10.C$38.C20.C8.C20.C8.C20.C8.C20.C8.C20.C8.C20.C8.C20.C8.C$35. #L 3C22.3C..3C22.3C..3C22.3C..3C22.3C..3C22.3C..3C22.3C..3C22.3C..3C$34.C #L 28.CC28.CC28.CC28.CC28.CC28.CC28.CC$34.C28.C30.C28.C30.C28.C30.C28.C$ #L 35.13C..13C32.13C..13C32.13C..13C32.13C..13C$48.CC58.CC58.CC58.CC$49.C #L 58.C60.C58.C$50.28C..28C62.28C..28C$78.CC118.CC$79.C118.C$80.58C..58C$ #L 138.CC60.C5.CC..3C5.CC..3C$138.C60.C6.C.C3.C5.C.C.C.C$135.A.C5.A7.A7.A #L 7.A7.A7.A7.A6.7C.CC4.C.3C.CC..C.C$134.3C4.4C4.4C4.4C4.4C4.4C4.4C4.CC8. #L C6.C.C3.C5.C.C.C.C$135.C4.C..C4.C..C4.C..C4.C..C4.C..C4.C..C4.C11.C5. #L CC4.C5.CC..3C$135.C..C..C.C..C..C.C..C..C.C..C..C.C..C..C.C..C..C.C..C #L ..C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C$135.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$135.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$136.C3.C3.C3.C3.C3.C3.C3.C #L 3.C3.C3.C3.C3.C3.C golly-2.5-src/Patterns/WireWorld/NylesHeise.mcl0000644000175100001440000001202212156145314016473 00000000000000#MCell 4.20 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 400x200 #WRAP 0 #CCOLORS 4 #D Design by Nyles Heise (nylesheise@yahoo.com). Previous multipliers #D by Nick Gardner and Karl Scherer. #D #D This is 32-bit by 32-bit binary muliplier producing a 64 bit product. #D Two versions are given. The compact version is crammed into the #D minimum area I could get to (you may be able to do better). The #D expanded version has the component separated and labeled, to give a #D better view of what's going on. #D #D A is the multiplicand, 252 cells. B is the multiplier, 124 cells. #D C is the product, 256 cells in the expanded version. FA is a single #D full adder. Gate is used to gate the bits of A into FA when the #D corresponding bit of B was on. Also turns off the B bit after it #D has been used. Clock tells Gate when to look at B. It's a fill-empty #D ring counter, 128 cells and a period of 252 cycles. #D The first partial result appears in the expanded verion in C after #D 205 cycles, next in another 256, and so on. Final product in a total #D of 8141 cycles. 8116 is the compact verion, some bits always in the FA. #D #D The design uses 4-tick logic elements. 6-tick takes 50% more space for #D the loops and 50% more overall time. All the normal logic elements #D are available in 4-tick (OR, XOR, AND, INVERT, R-S LATCH, T LATCH). #D The 4-tick INVERTER is shown bottom left. Note it takes less area than #D 6-tick. #D #L .C3.C..C3.C.CC3.C3.C..3C$C.C.C.C.CC.CC.C.C.C.C.C.C..C$C3.C.C.C.C.C.CC #L ..C.C.C4.C$C.C.C.C.C3.C.C3.3C.C.C..C$.C3.C..C3.C.C3.C.C..C3.C4$4.23C.C #L .C3.C.4C.10C.42C$3.C23.3C.A4C4.C10.C42.C$4.21C3.C.B3.C.C..3C..C3.3C.. #L 41C$25.C.C5.C3.C..C..A.C.C4.C$4.21C..C4.C..CC..4CAB3.3C..32CBACCBACCB$ #L 3.C23.C3.C..C3.C.C4.A5.C42.A$4.17C3.C..C..C3.C3.C3.CC..CC.A..ABCCABCCA #L BCCABCCABCCABCCABCCABCCABCCABCC..C$21.C.C.C.3C4.C4.C.C..C3.CAB41.A.C$ #L 4.17C..C.C..C3.C..C4.3C.C.C..A.CAB.CABCCABCCABCCABCCABCCABCCABCCABCCAB #L ..B.B$3.C19.C.C..7C4.C.A3.4C5.C35.C.C.A$4.17C..C.C.C4.C3.A3.B5.C6.B..A #L CCBACCBACCBACCBACCBACCBACCBACCBAC..C.C$21.C.C.C.C.C.CC.CB.C.3C..CC7.A. #L B36.A.C$4.17C..C..5C..CC.C3.C..B.C.BC..B.C..CCABCCABCCABCCABCCABCC4.CB #L ACCBACCB..B$3.C19.C3.A.C.C..3C4.CA3.A..ABBC25.A..C12.A$4.16C3.C3.B4.C #L ..C13.B.B.BACCBACCBACCBACCBACCBACCB4.ABCCABCCAB..C$20.C..C..C.A4.C.C5. #L ACCBA3C43.C.C$4.16C..CC3.C..3C..C4.B9.BACCBA3CBACCBACCBACCBACCBAC3.C3. #L BACCBAC..B$3.C17.C.CC4.C5.C3.C4.CCBACC28.C.C.A.C9.A$4.15C..C3.C..3C.C. #L 3C.C..CAA7.CABCCABCCABCCABCCABCCABCC..4B3.CABCCAB..C$19.C.C..3C..C.3C. #L C..A.C..B6.C25.A..C..A9.C.C$4.15C..C.C.C.CC.C.C..B.CACC.C.C6.BACCBACCB #L ACCBACCBACCBACC..B3C.C..BACCBAC..B$3.C17.C.C10.A.C.A.CC3.C29.B3.C..C.C #L 9.A$4.17C3.10C.C6.ABC.ABCCABCCABCCABCCABCCABCCABCCA5.AB3.CABCCABCC10$ #L 85.23C$84.C23.C$84.C..21C$84.C.C$84.C..31C$3C.C3.C.CC3.C..C3.C.CC..3C. #L CC50.C33.C$C4.C.C..C.C.C.C.CC..C.C.C.C3.C.C49.C..31C$CC4.C3.CC..C.C.C. #L C.C.C.C.CC..C.C49.C.C$C4.C.C..C3.3C.C..CC.C.C.C3.C.C49.C..BACCBACCBACC #L BACCBACCBACCBACCBAC$3C.C3.C.C3.C.C.C3.C.CC..3C.CC50.C33.C$84.C..CABCCA #L BCCABCCABCCABCCABCCABCCAB$84.C.C$84.C..BACCBACCBACCBACCBACCBACCBACCBAC #L $84.C33.C$85.3CABCCABCCABCCABCCABCCABCCABCCAB$87.C$87.C5.C3.C5.3C..C$ #L 87.C4.C.C.C.C6.C..C$55.3C..C10.CC3.C..3C.3C.C4.C.C.C.C.CC..CC..C$55.C #L 3.C.C8.C4.C.C..C..C3.C4.3C.C.C6.C..C$18.C3.C5.C3.3C20.CC..C.C8.C.CC.C. #L C..C..CC..C4.C.C..C5.3C.3C$17.C.C.C.C4.C5.C20.C3.3C8.C.C..3C..C..C3.C$ #L 17.C3.C.C.CC.3C..CC20.C3.C.C9.CC..C.C..C..3C.C$17.C.C.C.C4.C.C3.C52.C$ #L 18.C3.C5.3C.3C21.C.C3.C.12C.10C$52.6C.A4C12.C$4.31C16.C4.C.B3.C.C10.3C #L ..C11.CC..3C..C6.C$3.C47.C3.C5.C3.C10.C..A.C10.C.C3.C..C5.C.C$4.31C16. #L C3.C4.C..CC10.4CAB11.CC3.CC..C..CC.C.C$35.16C4.C3.C..C11.C.C4.A10.C.C #L 3.C..C5.C.C$4.31C17.C..C..C3.C11.C3.CC..CC.A6.CC..3C.3C5.C$3.C47.C.C. #L 3C4.C12.C.C..C3.CAB$4.31C16.C.C..C3.C..C12.3C.C.C..A.CAB.CABCCABCCABCC #L ABCCABCCABCCABCC$35.C15.C.C..7C12.C.A3.4C5.C29.A$4.31C16.C.C.C4.C3.A #L 11.B5.C6.B3.CCBACCBACCBACCBACCBACCBACCB$3.C47.C.C.C.C.CC.CB.C9.3C..CC #L 7.A..A$4.31C16.C..5C..CC.C11.C..B.C.BC..B.C3.BCCABCCABCCABCCABCCABCCAB #L CC$35.C15.C3.A.C.C..3C12.CA3.A..ABBC31.A$4.31C16.C3.B4.C..C21.B.B.B3. #L CCBACCBACCBACCBACCBACCBACCB$3.C47.C..C.A4.C.C13.ACCBA3C4.A..A$4.48C3.C #L ..3C..C12.B12.C.B$51.CC4.C5.C11.C14.C$53.C..3C.C.3C9.C$52.3C..C.3C.C #L 10.A$51.C.C.CC.C.C..B.BACCBA3CAC$51.C10.A.C9.A.C$52.10C.C12.C$76.C16.C #L ..C4.C3.C..C..C$76.C15.C.C.C3.C.C.C.C.C.C$.C..C3.C4.3C.C3.C.C.C.3C.CC #L ..3C.3C.CC31.C15.C3.C3.C.C.C3.CC$C.C.CC..C5.C..CC..C.C.C.C3.C.C..C..C #L 3.C.C30.C15.C.C.C3.C.C.C.C.C.C$C.C.C.C.C5.C..C.C.C.C.C.CC..CC3.C..CC.. #L CC31.C16.C..3C..C3.C..C..C$3C.C..CC5.C..C..CC.C.C.C3.C.C..C..C3.C.C30. #L C$C.C.C3.C4.3C.C3.C..C..3C.C.C..C..3C.C.C30.C11.CBACCBACCBACCBACCBA3CB #L ACCBA3.A$76.C5.ACCBAC28.C.C.B$10.C65.C..ABB7.ABCCABCCABCCABCCABCCABCCA #L ..4C$9.A.C64.C.C..C6.C25.B..C..B$9.B.B8.A56.CC.C.C6.CBACCBACCBACCBACCB #L ACCBAC..4C.A$9.C.A6.CB.C56.CA3.A29.C3.A..C$9.C..7C.C59.BCC.BCCABCCABCC #L ABCCABCCABCCABCCAB5.BC$9.C.C6.3C$9.C.C7.C$9.C.C8.12C$10.C golly-2.5-src/Patterns/WireWorld/primes.mc0000644000175100001440000022606012156145314015557 00000000000000[M2] (golly 2.0) #C #C Copyright 1992, 2008 David Moore and Mark Owen #C (http://www.quinapalus.com/wi-index.html) #C #C A WireWorld computer designed by David Moore and Mark Owen, with the #C help of many others. The program stored in this configuration is #C due to Michael Fryers and computes prime numbers. Results are #C displayed in decimal in large 7-segment pattterns. For details #C on the technology behind this computer, visit the site above. #C #R WireWorld 1 0 3 3 0 2 0 0 0 1 3 0 0 0 2 4 0 0 0 3 1 0 0 0 3 2 0 0 0 5 1 3 3 0 0 1 3 0 0 3 2 0 0 7 8 2 5 8 7 7 3 0 6 9 10 1 3 3 3 3 2 0 0 12 12 1 0 0 3 3 2 14 14 7 7 3 13 13 15 15 4 0 0 11 16 5 0 0 4 17 1 0 3 0 3 2 0 0 0 19 3 0 0 0 20 1 3 3 0 3 2 1 5 5 22 2 1 5 0 19 1 3 0 3 0 2 25 12 25 12 3 2 23 24 26 2 0 19 0 19 3 0 28 0 28 3 28 26 28 26 4 21 27 29 30 2 8 0 19 8 2 22 22 0 8 2 19 25 19 25 1 3 0 3 3 2 35 0 12 19 3 32 33 34 36 2 12 12 14 14 2 7 7 12 12 3 38 38 39 39 2 12 19 12 19 3 34 41 34 41 2 12 12 12 12 3 43 43 43 43 4 37 40 42 44 2 0 19 0 0 2 25 12 8 22 3 28 26 46 47 4 29 30 29 48 2 19 25 19 8 1 0 3 0 0 1 3 0 0 0 2 12 51 52 5 3 34 41 50 53 3 43 43 39 39 4 42 44 54 55 5 31 45 49 56 6 0 18 0 57 4 0 0 16 16 2 0 0 35 0 2 14 8 7 7 2 0 0 8 0 3 60 0 61 62 4 0 0 63 0 5 0 0 59 64 4 40 40 44 44 2 12 22 14 52 2 52 5 5 22 2 52 5 12 19 3 67 68 69 26 2 35 0 12 0 3 32 0 34 71 3 41 26 41 26 2 12 0 12 0 3 34 74 34 74 4 70 72 73 75 4 44 44 55 55 2 7 19 35 0 3 41 26 78 47 2 12 0 52 0 3 34 74 50 80 4 73 75 79 81 5 66 76 77 82 6 65 0 83 0 2 0 14 19 5 2 14 14 14 14 2 19 19 19 51 1 3 3 3 0 2 12 88 5 5 3 85 86 87 89 2 19 5 19 19 2 19 19 19 19 3 91 26 92 26 4 29 90 29 93 1 0 0 3 0 1 0 3 3 3 2 52 95 96 5 2 7 95 8 5 3 97 10 98 33 3 15 15 38 38 3 34 36 34 41 3 39 39 43 43 4 99 100 101 102 3 92 26 92 26 4 29 104 29 104 4 42 44 42 44 5 94 103 105 106 2 0 51 0 0 3 0 28 0 108 2 19 19 51 95 2 95 51 51 95 2 95 22 19 0 3 110 47 111 112 2 95 8 51 95 3 108 114 0 108 4 109 113 0 115 2 19 52 25 5 3 50 53 117 10 3 39 39 15 15 2 51 95 8 51 2 22 22 95 8 3 120 121 114 120 2 7 7 7 7 2 7 7 7 95 3 38 38 123 124 4 118 119 122 125 2 95 8 96 95 2 51 19 7 7 3 108 127 46 128 2 5 7 22 52 2 95 25 25 51 2 0 7 14 95 2 8 0 19 0 3 130 131 132 133 2 0 5 35 25 3 0 0 6 135 2 5 19 22 22 2 51 95 0 25 2 22 96 0 0 2 8 51 5 35 3 137 138 139 140 4 129 134 136 141 5 116 126 0 142 6 0 107 0 143 4 100 100 102 102 2 0 95 8 14 2 52 95 5 5 3 61 146 67 147 2 25 0 51 8 2 0 0 14 0 2 7 14 8 5 3 149 150 151 114 3 69 26 41 26 2 35 19 12 19 3 34 154 34 41 4 148 152 153 155 4 44 44 44 44 4 73 42 73 42 5 145 156 157 158 3 0 0 62 0 2 19 0 19 0 3 161 0 161 0 4 160 0 162 0 4 162 0 162 0 5 163 0 164 0 2 7 7 0 0 3 38 38 166 166 4 119 119 167 167 2 0 22 8 0 3 78 47 61 169 2 12 19 52 1 2 19 52 25 1 2 1 5 5 52 3 50 171 172 173 2 52 25 1 5 2 52 1 1 5 2 5 52 52 1 3 67 175 176 177 2 25 25 52 25 2 25 0 25 0 2 52 0 0 0 3 179 180 173 181 4 170 174 178 182 2 1 8 88 19 2 51 7 0 0 2 95 5 25 19 3 184 0 185 186 2 1 8 25 22 2 5 1 52 5 2 7 52 5 7 2 0 25 95 25 3 188 189 190 191 2 25 1 25 25 2 95 0 25 0 2 25 8 25 19 3 0 193 194 195 2 19 51 1 7 2 88 0 5 95 2 25 96 35 1 3 197 198 161 199 4 187 192 196 200 2 1 5 0 25 2 0 25 0 25 3 177 202 161 203 3 181 0 0 0 2 1 0 0 0 3 161 203 206 203 4 204 205 207 0 5 168 183 201 208 3 161 0 181 0 4 210 0 0 0 5 211 0 0 0 6 159 165 209 212 7 58 84 144 213 2 0 5 5 52 3 0 6 6 215 2 5 35 5 25 3 0 0 0 217 2 0 22 5 22 2 22 0 96 8 2 25 0 35 0 2 0 5 0 5 3 219 220 221 222 4 0 216 218 223 5 0 0 0 224 3 0 6 0 219 2 0 0 52 0 2 5 5 22 22 3 0 0 227 228 2 52 7 0 0 2 52 8 0 22 3 217 221 230 231 4 0 226 229 232 2 25 35 7 52 3 215 234 220 6 2 0 0 8 5 2 5 25 52 7 2 22 22 22 96 3 236 237 238 62 2 35 35 25 35 2 5 52 22 0 2 7 52 0 0 3 222 240 241 242 2 5 0 0 0 2 8 5 22 22 2 52 7 52 0 3 244 217 245 246 4 235 239 243 247 2 0 5 35 35 3 249 139 234 236 2 8 0 5 35 2 5 22 25 0 2 35 0 52 8 3 251 252 237 253 3 6 238 240 0 2 35 0 35 0 3 62 219 217 256 4 250 254 255 257 2 96 8 0 5 3 259 135 215 234 3 139 251 236 237 2 22 52 96 8 2 35 25 25 35 3 262 6 222 263 3 238 62 0 217 4 260 261 264 265 5 233 248 258 266 2 0 5 0 0 3 268 234 0 0 4 0 136 0 269 3 228 246 139 251 2 5 52 22 52 2 5 22 35 0 3 231 272 273 259 3 253 215 219 262 4 271 274 239 275 2 0 7 0 0 3 0 217 0 277 3 221 222 231 241 2 0 22 0 0 3 280 259 0 268 4 278 279 0 281 5 270 276 0 282 3 242 245 135 139 3 246 231 251 252 3 234 236 6 238 3 237 253 62 219 4 284 285 286 287 3 272 242 259 135 3 245 230 139 251 4 289 290 235 239 3 240 0 242 245 3 217 256 230 231 3 135 139 234 236 3 251 273 237 253 4 292 293 294 295 3 222 263 241 242 2 52 7 0 95 3 0 217 245 298 2 22 51 51 95 2 1 95 25 19 2 51 88 19 19 3 139 300 301 302 4 297 299 260 303 5 288 291 296 304 6 225 267 283 305 2 25 19 19 51 3 253 307 219 262 2 19 51 95 25 2 95 0 51 95 2 25 51 51 95 2 95 25 25 8 3 309 310 311 312 2 8 19 22 22 3 263 110 242 314 4 308 313 279 315 2 5 7 19 51 2 95 25 88 0 2 1 7 19 0 3 317 318 319 0 2 0 0 95 0 2 25 0 8 0 3 120 321 203 322 4 320 0 323 0 3 273 259 253 215 4 325 294 223 255 2 95 25 25 19 3 140 327 237 253 2 25 0 19 0 3 0 0 329 0 2 25 0 35 1 3 62 219 217 331 2 22 0 96 22 2 0 51 95 51 2 95 8 88 0 3 333 310 334 335 4 328 330 332 336 5 316 324 326 337 2 0 0 0 51 1 0 2 0 0 2 0 0 0 340 3 0 0 339 341 4 0 0 0 342 2 0 0 5 0 3 0 0 301 344 2 96 95 1 95 2 22 52 19 0 2 35 8 25 51 2 19 0 1 0 3 346 347 348 349 4 345 0 350 0 2 0 0 0 95 3 0 0 0 352 1 0 3 1 1 2 0 0 0 354 1 0 3 1 3 2 0 1 356 95 1 0 2 3 2 2 0 358 1 340 1 1 3 0 0 2 19 95 360 51 3 355 357 359 361 1 3 3 1 0 1 0 2 3 0 1 1 0 1 3 2 51 363 364 365 2 96 96 356 19 3 0 366 367 321 2 25 0 88 95 2 0 51 0 364 2 0 96 0 356 2 96 95 19 95 3 369 370 371 372 4 353 362 368 373 5 0 343 351 374 3 231 241 252 259 3 242 245 249 139 2 22 52 96 22 3 253 215 219 378 3 234 301 310 346 4 376 377 379 380 2 52 25 0 96 2 95 1 8 35 3 298 382 300 383 2 19 19 95 22 2 19 0 52 25 2 95 19 8 19 2 0 96 0 19 3 385 386 387 388 1 0 3 2 2 1 0 0 2 0 2 25 25 390 391 3 302 203 347 392 2 51 1 51 88 1 0 0 0 2 2 0 395 5 52 1 1 0 0 0 2 0 8 395 397 3 394 396 398 181 4 384 389 393 399 3 331 334 382 385 1 0 1 0 0 2 25 402 25 0 3 335 348 386 403 3 383 387 203 394 1 0 1 0 2 2 0 96 0 406 2 95 5 395 397 3 407 408 215 181 4 401 404 405 409 2 19 5 5 52 1 1 1 2 0 2 412 395 8 52 2 397 0 0 0 3 349 411 413 414 4 415 205 205 0 5 381 400 410 416 2 25 51 25 0 1 1 0 0 2 2 88 0 419 0 2 95 5 5 52 2 52 0 0 358 3 418 420 421 422 2 95 364 88 88 1 0 3 1 0 1 0 2 3 3 2 0 425 426 0 2 35 88 0 0 3 339 424 427 428 2 0 358 0 340 3 414 430 0 0 2 19 95 7 51 1 0 0 1 0 2 0 0 433 425 2 0 51 0 51 1 1 2 1 0 1 2 0 3 0 1 1 0 1 2 2 436 437 438 88 3 432 434 435 439 4 423 429 431 440 2 51 95 51 88 2 95 0 96 358 2 425 35 95 0 3 185 442 443 444 2 364 51 88 0 2 7 51 0 51 2 88 95 0 96 2 0 425 358 0 3 446 447 448 449 1 0 2 0 2 1 3 2 0 0 2 96 451 51 452 1 2 2 3 0 1 3 0 3 2 2 340 454 1 455 3 453 310 321 456 2 0 96 425 51 2 451 95 452 51 1 1 3 1 0 2 460 0 460 95 2 0 340 0 1 3 458 459 461 462 4 445 450 457 463 2 96 354 96 451 1 1 2 0 0 2 51 466 0 0 3 465 321 467 442 2 0 354 0 358 2 356 95 19 95 1 3 0 1 0 2 1 340 471 0 2 360 51 0 51 3 469 470 472 473 2 51 35 0 0 3 0 475 0 0 2 436 95 0 96 2 0 364 96 0 2 0 96 0 51 2 19 433 7 340 3 477 478 479 480 4 468 474 476 481 5 441 464 0 482 6 338 375 417 483 3 0 238 0 0 2 52 0 8 0 1 0 1 3 0 2 25 0 35 487 3 486 219 217 488 2 52 0 1 7 2 8 35 25 25 3 277 490 0 491 4 485 489 0 492 2 0 51 391 402 2 95 8 412 0 3 333 310 494 495 1 0 1 0 3 2 19 497 95 22 1 3 0 2 0 2 19 0 52 499 2 52 25 7 5 2 0 390 8 19 3 498 500 501 502 2 88 5 8 52 2 391 395 5 52 3 418 504 505 414 4 496 350 503 506 2 25 0 25 19 2 51 52 0 0 3 0 508 0 509 4 0 510 0 0 2 14 402 0 25 1 1 0 3 3 2 390 5 5 513 2 0 8 0 0 2 0 25 8 51 3 512 514 515 516 3 181 0 9 0 3 0 515 0 0 2 0 19 8 51 3 520 321 515 120 4 517 518 519 521 5 493 507 511 522 4 0 519 0 0 5 0 524 0 0 6 0 523 0 525 2 25 25 96 95 2 0 419 5 52 2 19 5 395 397 3 527 528 529 181 3 414 0 0 0 4 530 531 205 0 3 0 0 321 0 4 0 0 533 0 5 532 0 534 0 3 0 435 0 0 4 0 536 0 0 5 0 537 0 0 2 51 7 7 7 3 539 123 0 0 3 123 123 0 0 4 540 541 0 0 4 541 541 0 0 5 542 543 0 0 5 543 543 0 0 6 535 538 544 545 7 306 484 526 546 8 0 214 0 547 1 2 1 0 0 2 0 0 5 549 2 0 0 452 425 3 0 0 550 551 4 0 0 0 552 2 0 0 0 358 1 1 3 1 3 1 2 1 2 1 2 0 0 555 556 1 0 1 2 0 1 0 0 3 2 2 558 559 549 452 1 0 0 1 3 1 0 0 2 1 2 561 562 360 549 3 554 557 560 563 1 3 2 3 2 2 0 0 565 555 2 0 0 556 565 2 559 561 452 360 2 562 559 549 452 3 566 567 568 569 4 0 0 564 570 5 0 0 553 571 3 557 566 563 568 2 0 0 433 0 2 425 391 360 549 3 567 574 569 575 4 0 0 573 576 5 0 0 577 534 1 0 0 0 1 2 0 395 579 52 1 1 0 2 0 2 0 5 0 581 1 2 0 0 0 1 3 3 1 1 2 583 390 0 584 3 0 580 582 585 2 397 364 558 581 2 95 51 412 391 1 0 3 0 1 1 0 2 0 3 2 589 471 590 437 1 0 3 0 2 1 2 2 3 3 2 584 592 593 589 3 587 588 591 594 2 0 471 0 437 1 1 1 2 2 2 0 593 0 597 2 0 581 0 471 2 0 584 0 593 3 596 598 599 600 2 406 581 589 471 2 597 590 584 406 2 590 437 406 581 2 593 589 597 590 3 602 603 604 605 4 586 595 601 606 1 2 1 2 0 2 608 565 402 559 2 555 556 561 562 2 391 340 471 12 2 360 549 12 12 3 609 610 611 612 2 565 555 559 561 2 556 565 562 559 2 452 360 12 12 2 549 452 12 12 3 614 615 616 617 2 437 12 581 12 2 471 12 437 12 3 619 43 620 43 4 613 618 621 44 2 0 437 0 581 2 0 597 0 584 3 623 624 596 598 2 584 406 593 589 3 591 626 602 603 2 0 597 0 51 3 599 600 623 628 1 0 2 1 0 2 589 471 630 437 2 584 406 454 425 3 604 605 631 632 4 625 627 629 633 2 581 12 471 12 3 635 43 619 43 2 581 7 0 96 3 620 43 637 39 4 636 44 638 55 5 607 622 634 639 3 610 614 612 616 2 460 608 425 0 2 0 354 25 593 3 615 642 617 643 2 25 597 25 584 2 25 593 25 597 3 43 645 43 646 4 641 644 44 647 2 0 558 425 471 2 391 0 363 433 3 649 650 604 605 2 433 0 437 0 3 0 0 652 0 2 581 0 471 0 2 437 0 581 0 3 654 0 655 0 4 651 653 627 656 2 25 584 25 593 3 43 658 43 645 2 52 584 95 340 3 43 646 39 660 4 44 659 55 661 3 604 605 591 626 2 471 0 437 0 3 664 0 654 0 2 590 437 487 581 2 593 589 412 364 3 602 603 666 667 2 471 0 0 0 3 655 0 669 0 4 663 665 668 670 5 648 657 662 671 6 572 578 640 672 2 0 0 364 360 3 0 0 0 674 2 0 0 5 556 1 2 0 0 1 2 0 395 677 452 1 1 0 0 3 2 679 562 360 549 3 0 676 678 680 4 0 0 675 681 4 0 0 570 573 5 0 0 682 683 2 0 364 406 0 3 0 0 0 685 2 589 0 590 0 2 406 0 589 0 3 0 687 0 688 4 0 686 0 689 2 590 0 406 0 3 0 691 0 687 3 0 688 0 691 4 0 692 0 693 5 0 690 0 694 2 0 558 425 395 1 2 0 0 3 1 1 1 0 2 2 5 697 698 406 2 395 499 589 471 2 584 589 593 590 3 696 699 700 701 1 3 2 0 2 2 0 703 419 0 1 1 3 0 3 2 705 556 679 562 1 3 0 2 2 2 471 707 437 584 2 0 549 19 12 3 704 706 708 709 2 597 406 584 589 2 593 590 597 406 3 604 711 591 712 2 581 593 471 597 2 19 12 19 12 2 437 584 581 593 3 714 715 716 715 4 702 710 713 717 4 618 641 44 44 3 602 701 604 711 2 471 597 437 584 3 721 715 714 715 1 3 0 0 1 2 406 581 0 723 1 2 2 0 3 2 584 589 725 590 3 591 712 724 726 2 471 597 677 52 2 51 7 5 12 3 716 715 728 729 4 720 722 727 730 5 718 719 731 77 6 0 684 695 732 2 579 559 437 14 2 581 12 471 52 3 596 734 599 735 2 561 558 14 14 2 5 0 25 1 2 12 7 433 425 2 8 51 433 433 3 737 738 739 740 2 437 426 581 597 2 471 584 437 593 3 623 742 596 743 3 604 712 591 701 4 736 741 744 745 2 1 14 7 7 2 88 12 51 14 3 747 15 748 38 2 95 51 581 12 3 750 39 620 43 4 749 100 751 102 2 581 597 471 584 2 437 593 581 597 3 599 753 623 754 3 602 711 604 712 3 596 743 599 753 3 591 701 602 711 4 755 756 757 758 3 620 43 635 43 4 636 44 760 44 5 746 752 759 761 2 1 95 7 7 2 88 88 1 0 3 15 763 38 764 2 0 426 25 597 3 39 766 43 658 4 100 765 102 767 2 5 589 14 95 1 2 3 0 0 1 0 0 1 2 2 0 0 770 771 2 5 51 433 425 2 8 14 433 433 3 769 772 773 774 2 402 391 8 51 3 321 0 776 574 2 95 25 581 25 2 471 25 437 25 3 778 655 779 664 4 775 777 745 780 4 44 647 44 659 2 581 25 471 25 2 437 25 581 25 3 783 654 784 655 3 779 664 783 654 4 756 785 758 786 5 768 781 782 787 2 437 593 419 402 2 0 723 0 0 2 0 723 697 0 3 623 789 790 791 2 590 437 558 581 2 593 590 412 558 2 51 471 437 590 2 363 0 0 630 3 793 794 795 796 2 0 419 0 0 3 0 798 0 0 2 402 391 723 51 2 419 340 433 723 2 0 697 0 0 2 340 95 419 402 3 800 801 802 803 4 792 797 799 804 1 0 3 2 3 2 437 7 0 806 1 1 2 1 2 1 3 1 3 1 2 7 7 808 809 1 0 0 2 3 1 3 1 0 0 2 487 811 812 770 1 0 0 3 1 2 771 814 466 812 3 807 810 813 815 1 2 3 2 3 2 7 7 817 808 2 7 7 809 817 2 811 771 770 466 2 814 811 812 770 3 818 819 820 821 1 3 1 3 0 2 823 817 402 811 2 808 809 771 814 2 697 51 391 466 2 466 812 812 770 3 824 825 826 827 2 817 808 811 771 2 809 817 814 811 2 770 466 419 0 2 812 770 0 0 3 829 830 831 832 4 816 822 828 833 2 0 723 0 5 2 0 581 0 51 3 0 835 0 836 2 0 0 0 96 3 0 0 0 838 4 0 837 0 839 1 2 0 2 3 2 51 433 841 340 2 487 697 454 19 2 583 25 7 723 2 51 7 811 0 3 842 843 844 845 2 589 5 0 725 2 466 95 583 25 2 7 723 0 590 3 847 848 652 849 2 95 25 363 25 2 365 88 0 0 3 339 851 478 852 2 8 0 589 0 2 0 19 0 589 2 95 697 96 96 2 0 590 0 19 3 854 855 856 857 4 846 850 853 858 5 805 834 840 859 3 810 818 815 820 2 52 593 433 402 2 630 95 466 812 3 819 862 821 863 2 466 812 0 0 2 770 466 0 0 3 825 829 865 866 2 436 823 630 5 2 812 770 0 579 2 395 397 52 558 3 830 868 869 870 4 861 864 867 871 2 51 471 391 590 2 363 5 5 52 3 793 794 873 874 2 437 25 5 52 2 52 425 364 0 3 876 655 877 0 2 589 406 583 425 2 19 406 19 589 2 364 5 5 52 2 52 364 558 0 3 879 880 881 882 4 875 878 883 0 2 0 5 0 19 2 549 95 340 454 2 0 425 0 437 2 7 0 364 679 3 885 886 887 888 2 561 583 0 364 2 425 5 5 52 3 890 891 688 180 2 5 52 589 579 2 25 725 7 52 2 340 95 0 25 2 437 19 25 19 3 893 894 895 896 2 583 0 14 0 2 5 35 14 52 3 898 180 899 181 4 889 892 897 900 2 52 425 590 0 3 902 0 688 0 3 691 0 687 0 4 903 0 904 0 5 872 884 901 905 6 762 788 860 906 2 589 0 590 590 2 406 406 589 589 3 0 908 0 909 2 590 590 406 406 2 589 589 590 590 3 0 911 0 912 4 0 910 0 913 3 0 909 0 911 3 0 912 0 909 4 0 915 0 916 5 0 914 0 917 2 561 562 5 14 2 559 397 14 96 2 19 12 51 579 2 88 7 579 723 3 919 920 921 922 2 95 5 5 7 2 8 14 7 7 2 95 22 579 0 2 22 12 8 14 3 924 925 926 927 2 5 437 406 581 3 929 712 591 701 1 2 0 3 3 2 437 931 581 597 2 0 7 19 12 3 932 933 743 715 4 923 928 930 934 3 753 715 754 715 3 743 715 753 715 4 756 936 758 937 5 935 145 938 157 2 590 590 406 402 2 51 433 0 340 3 0 940 0 941 4 0 942 0 0 5 0 943 0 0 2 590 437 391 419 2 593 590 698 406 2 51 433 95 590 1 3 3 0 1 2 948 589 0 437 3 945 946 947 949 2 437 593 419 397 2 51 7 395 809 2 52 5 579 770 2 419 814 466 812 3 951 952 953 954 2 402 391 0 51 2 419 402 433 723 2 340 95 0 402 3 956 957 0 958 1 2 3 0 3 2 391 960 51 433 1 1 2 0 2 2 962 809 419 814 2 697 340 391 419 2 95 812 402 770 3 961 963 964 965 4 950 955 959 966 2 770 466 466 812 2 812 770 391 0 3 829 830 968 969 4 822 861 970 867 2 51 433 0 358 2 723 5 95 725 2 406 340 0 7 2 19 0 7 771 3 972 973 974 975 2 0 5 0 948 2 0 0 5 35 1 2 1 0 1 2 5 979 25 0 3 0 977 978 980 4 0 976 0 981 2 471 487 340 454 2 7 723 95 590 3 848 983 984 108 2 697 0 19 0 2 0 364 0 25 2 7 433 0 437 2 579 7 590 5 3 986 987 988 989 2 19 51 22 0 2 95 0 471 0 2 340 95 35 25 3 991 992 259 993 2 0 25 0 471 2 1 19 471 425 2 0 437 0 25 2 697 590 19 19 3 995 996 997 998 4 985 990 994 999 5 967 971 982 1000 6 918 939 944 1001 7 673 733 907 1002 1 2 0 2 1 2 0 0 555 1004 3 567 1005 569 563 1 3 0 0 2 2 1007 0 452 679 3 0 0 1008 0 4 0 0 1006 1009 5 0 0 1010 0 3 0 0 0 6 4 0 0 0 1012 5 0 0 0 1013 2 360 583 12 12 3 615 610 617 1015 2 703 397 52 579 2 395 419 948 589 2 579 471 590 437 3 1017 1018 1019 712 4 1016 1020 44 720 2 0 0 723 0 1 3 0 1 1 2 437 1023 581 593 3 1022 0 1024 0 3 721 0 714 0 4 1025 0 1026 0 3 591 712 602 701 2 7 7 12 35 3 43 43 39 1029 2 589 471 0 697 3 604 711 1031 946 4 44 1028 1030 1032 3 716 0 721 0 2 437 584 679 583 3 714 0 1035 0 4 1034 0 1036 0 5 1021 1027 1033 1037 2 0 0 0 579 2 5 583 581 0 2 390 589 584 590 3 1039 870 1040 1041 2 593 406 597 589 2 584 590 593 406 3 664 1043 654 1044 4 0 1042 0 1045 2 597 589 584 590 3 655 1047 664 1043 2 597 589 51 630 3 654 1044 655 1049 4 0 1048 0 1050 5 0 1046 0 1051 6 1011 1014 1038 1052 2 0 0 549 452 2 0 558 425 549 3 0 0 1054 1055 2 0 0 358 555 3 1057 567 568 569 4 0 0 1056 1058 3 567 557 569 563 4 0 0 573 1060 5 0 0 1059 1061 2 0 0 565 433 2 559 425 452 360 2 391 0 549 95 3 1063 0 1064 1065 4 0 0 1066 0 5 0 0 1067 0 2 364 95 581 412 2 51 608 391 402 2 592 391 589 471 3 1069 1070 743 1071 2 340 360 12 12 3 614 615 1073 617 3 753 604 754 591 4 1072 1074 1075 44 3 615 610 617 612 4 641 1077 44 44 3 743 602 753 604 2 471 584 437 454 2 406 581 425 0 3 754 591 1080 1081 2 7 7 96 12 3 43 43 1083 39 4 1079 44 1082 1084 5 1076 1078 1085 77 2 565 460 559 425 2 608 0 0 425 2 452 0 12 25 2 354 590 593 406 3 1087 1088 1089 1090 2 558 391 471 363 2 589 433 590 437 3 1092 574 754 1093 2 12 25 12 25 3 1095 1047 1095 1043 4 1091 1094 1096 1079 3 1095 1044 1095 1047 3 754 591 743 602 2 7 52 12 95 2 584 590 340 487 3 1095 1043 1100 1101 2 437 593 581 412 2 589 471 364 0 3 753 604 1103 1104 4 1098 1099 1102 1105 5 1097 0 1106 0 6 1062 1068 1086 1107 2 8 0 7 8 2 95 471 14 340 2 22 52 52 579 2 95 7 579 723 3 1109 1110 1111 1112 2 7 52 12 12 3 39 1114 43 43 4 100 1113 1115 930 2 0 0 723 811 2 14 95 579 51 2 419 0 95 723 3 1117 0 1118 1119 2 19 590 19 406 2 19 589 19 590 3 932 1121 743 1122 4 1120 0 1123 0 4 44 756 44 758 3 753 880 754 1121 3 743 1122 753 880 4 1126 0 1127 0 5 1116 1124 1125 1128 2 471 579 437 437 2 559 561 14 14 2 581 581 471 471 2 12 12 52 433 3 1130 1131 1132 1133 2 437 437 581 581 2 426 590 597 406 2 471 471 437 437 3 1135 1136 1137 701 4 0 1134 0 1138 3 1132 711 1135 712 3 1137 701 1132 711 4 0 1140 0 1141 5 0 1139 0 1142 1 3 0 3 1 2 7 7 808 1144 3 819 1145 821 815 2 590 437 0 419 2 697 0 770 419 3 1147 946 1148 949 2 466 52 0 425 3 830 825 832 1150 2 960 397 583 364 2 471 581 579 52 2 558 5 395 397 2 583 1 1 395 3 1152 1153 1154 1155 4 1146 1149 1151 1156 2 19 590 1 406 2 579 52 583 0 3 951 1158 176 1159 2 25 581 25 471 2 5 583 397 0 3 1161 0 1162 0 4 1160 0 1163 0 2 679 579 725 583 2 364 579 5 583 2 52 0 549 95 2 581 19 471 19 3 1165 1166 1167 1168 2 52 1 1 0 2 579 52 437 0 3 1170 1171 0 654 2 340 454 7 5 2 0 19 95 19 2 0 25 0 35 2 96 1 1 0 3 1173 1174 1175 1176 3 0 655 0 664 4 1169 1172 1177 1178 5 1157 1164 1179 0 2 437 437 581 419 2 593 590 402 558 2 723 0 0 697 2 723 51 0 437 3 1181 1182 1183 1184 2 419 402 0 723 3 0 1186 0 0 4 0 1185 0 1187 5 0 1188 0 0 6 1129 1143 1180 1189 2 558 5 14 25 2 0 1 1 7 2 7 8 425 433 2 51 88 433 51 3 1191 1192 1193 1194 2 590 95 406 581 3 754 1196 743 591 2 51 7 12 12 3 1198 39 43 43 4 1195 100 1197 1199 3 753 602 754 604 3 743 591 753 602 4 1201 44 1202 44 5 1200 145 1203 157 2 14 1 7 7 2 95 5 7 14 2 12 88 14 1 2 88 5 0 433 3 1205 1206 1207 1208 2 589 0 95 770 2 0 0 771 95 2 51 8 425 433 2 14 402 433 8 3 1210 1211 1212 1213 2 7 0 12 25 3 1215 1136 1095 701 4 1209 1214 1216 1197 2 391 0 51 433 3 0 0 1218 0 2 25 437 25 581 2 25 471 25 437 3 1220 0 1221 0 4 1219 0 1222 0 3 1095 711 1095 712 3 1095 701 1095 711 4 1224 1201 1225 1202 3 1161 0 1220 0 3 1221 0 1161 0 4 1227 0 1228 0 5 1217 1223 1226 1229 2 590 437 558 0 2 471 363 590 0 2 0 487 630 812 3 1103 1231 1232 1233 2 7 7 806 808 3 1235 819 820 821 2 391 419 51 433 2 340 823 723 402 2 697 340 0 419 2 95 697 402 391 3 1237 1238 1239 1240 2 51 466 466 812 2 812 770 770 419 3 829 830 1242 1243 4 1234 1236 1241 1244 3 819 810 821 815 3 830 825 832 865 4 861 1246 867 1247 2 723 51 5 841 2 581 583 51 7 3 0 1249 0 1250 2 433 487 340 454 2 697 589 19 0 2 25 51 723 811 3 1252 1253 1254 988 2 0 0 96 96 3 0 0 0 1256 2 0 95 51 363 2 25 8 25 589 2 364 365 0 0 3 1258 1259 1260 448 4 1251 1255 1257 1261 2 5 466 725 583 2 723 0 590 0 3 1263 194 277 1264 2 5 549 19 340 2 95 561 454 0 2 425 7 437 364 2 0 406 679 589 3 1266 1267 1268 1269 2 19 5 589 589 2 697 0 96 0 2 590 340 19 0 3 0 1271 1272 1273 2 52 25 579 7 2 725 583 52 14 2 95 437 25 25 2 19 5 19 14 3 1275 1276 1277 1278 4 1265 1270 1274 1279 5 1245 1248 1262 1280 2 7 52 817 433 2 811 630 770 466 2 95 51 812 391 3 1282 1182 1283 1284 2 590 437 558 5 2 471 363 590 5 2 5 52 52 364 3 1103 1286 1287 1288 2 817 436 811 630 2 823 589 5 583 2 770 395 579 52 2 397 364 558 5 3 1290 1291 1292 1293 2 406 19 425 19 2 5 52 52 558 2 364 0 0 0 3 1295 688 1296 1297 4 1285 1289 1294 1298 2 25 437 52 581 2 425 0 0 0 3 1300 0 1301 0 4 1302 0 0 0 2 583 425 364 5 2 5 52 52 590 2 0 406 0 589 3 1304 1305 203 1306 3 1301 0 0 0 2 0 590 0 406 2 35 52 52 0 2 0 589 0 590 3 203 1309 1310 1311 4 1307 1308 1312 0 5 1299 1303 1313 0 6 1204 1230 1281 1314 7 1053 1108 1190 1315 2 0 356 364 51 2 51 88 425 35 3 352 1317 1318 369 2 96 358 96 451 1 1 0 1 0 2 95 425 454 1321 2 51 452 0 0 3 0 1320 1322 1323 2 0 96 0 96 2 51 95 340 454 2 425 51 1321 0 3 321 1325 1326 1327 4 0 1319 1324 1328 2 0 0 95 364 2 0 51 0 425 2 88 25 35 88 3 432 1330 1331 1332 2 356 19 51 7 2 95 589 51 95 3 1334 1335 321 1318 2 358 95 451 95 2 95 0 0 0 2 452 51 0 340 2 95 425 454 460 3 1337 1338 1339 1340 3 1320 321 1323 1326 4 1333 1336 1341 1342 2 455 460 0 0 2 95 0 354 356 2 0 0 95 1 2 358 19 340 360 3 1344 1345 1346 1347 2 1 455 0 0 2 460 95 0 354 3 1349 1350 310 359 2 363 25 365 88 3 1352 321 0 367 2 88 0 88 95 2 95 0 95 0 3 366 1354 1355 371 4 1348 1351 1353 1356 2 0 1 356 0 3 1358 1344 361 1346 2 1 455 95 0 3 1345 1360 1347 310 2 96 0 19 95 3 370 1352 1362 0 3 321 366 367 321 4 1359 1361 1363 1364 5 1329 1343 1357 1365 2 0 471 437 697 2 471 8 590 0 2 88 19 88 95 2 0 8 723 589 3 1367 1368 1369 1370 2 425 8 437 948 2 19 5 51 95 2 7 583 471 0 3 62 1372 1373 1374 2 358 0 451 95 3 1325 1376 1327 1339 2 437 25 8 51 2 697 0 95 8 2 95 471 454 1321 2 19 589 19 340 3 1378 1379 1380 1381 4 1371 1375 1377 1382 2 406 0 52 0 3 1384 0 0 0 4 1385 0 533 0 3 1350 1358 359 361 2 95 8 96 96 2 96 19 51 7 3 1344 1388 1346 1389 2 0 51 0 1 3 369 1391 1325 372 3 1332 321 0 367 4 1387 1390 1392 1393 2 19 0 0 471 2 95 590 51 95 2 0 0 25 0 3 1395 0 1396 1397 2 8 0 0 25 3 0 0 885 1399 2 25 5 88 25 2 0 0 14 8 2 0 8 0 22 3 366 1401 1402 1403 2 0 5 8 5 2 35 51 8 0 2 51 96 52 19 2 1 95 0 8 3 1405 1406 1407 1408 4 1398 1400 1404 1409 5 1383 1386 1394 1410 3 424 185 428 443 2 425 35 0 0 3 442 446 1413 448 2 0 0 95 425 2 454 1321 455 460 3 1415 453 1416 321 2 1321 0 460 95 3 310 458 456 1418 4 1412 1414 1417 1419 2 95 364 88 25 3 447 1421 449 428 2 95 0 96 96 2 1 35 0 0 3 185 442 1423 1424 3 459 1346 1391 1332 3 1389 310 321 456 4 1422 1425 1426 1427 2 354 356 358 19 2 95 1 363 25 2 340 360 0 0 3 0 1429 1430 1431 2 1 51 25 0 3 1355 1325 442 1433 3 852 1423 1346 1389 2 1 35 95 0 3 1436 448 310 1317 4 1432 1434 1435 1437 3 1362 0 447 1430 2 340 360 5 0 2 19 0 5 35 3 1429 1402 1440 1441 2 19 14 7 19 3 478 852 1443 1399 2 25 8 8 51 2 5 8 96 1 2 22 52 25 25 3 1445 1446 1447 161 4 1439 1442 1444 1448 5 1420 1428 1438 1449 2 0 425 358 95 3 1433 447 448 1451 2 51 7 5 0 3 1421 1453 428 1445 2 451 14 452 19 2 460 5 460 25 3 458 1455 1456 1405 2 88 19 25 395 3 1399 1447 1406 1458 4 1452 1454 1457 1459 2 25 25 51 88 3 1441 1461 1446 191 2 25 19 19 19 2 0 22 0 402 2 5 35 0 25 2 0 1 1 0 3 1463 1464 1465 1466 2 8 52 22 52 2 19 0 707 0 2 51 1 558 0 3 161 1468 1469 1470 2 0 558 1 0 3 1472 0 0 0 4 1462 1467 1471 1473 3 1403 1407 1461 1463 2 25 0 52 0 2 0 698 0 51 2 397 558 1 0 3 1408 1476 1477 1478 2 5 35 0 581 3 191 1480 1468 1466 2 0 1 558 0 3 1482 0 0 0 4 1475 1479 1481 1483 2 25 1 1 0 3 1485 0 0 0 4 1486 0 0 0 5 1460 1474 1484 1487 6 1366 1411 1450 1488 2 0 0 0 52 3 0 0 0 1490 2 0 5 0 725 2 579 52 979 0 3 0 222 1492 1493 4 0 0 1491 1494 2 88 0 25 0 3 1496 0 1476 0 2 0 5 0 579 3 0 6 1498 263 4 533 0 1497 1499 2 0 0 579 1023 2 0 0 5 5 1 2 0 2 0 2 5 1503 52 549 3 0 1501 1502 1504 1 0 1 2 1 2 1506 8 0 579 3 273 1507 253 215 2 948 22 979 96 2 5 35 579 25 3 1509 62 0 1510 2 0 948 5 979 3 1512 220 256 1498 4 1505 1508 1511 1513 5 0 1495 1500 1514 3 0 1502 1039 238 2 579 25 583 7 2 0 22 579 22 3 1517 253 62 1518 2 35 1503 25 841 2 7 583 0 0 2 8 579 725 979 3 1520 0 1521 1522 2 841 5 841 0 2 583 8 0 725 3 217 1524 230 1525 4 1516 1519 1523 1526 2 0 579 5 583 3 1528 234 220 1039 2 0 471 8 590 2 589 589 340 95 2 52 25 8 51 3 1530 1531 238 1532 2 579 52 979 52 3 222 1520 1534 1521 3 0 217 1522 230 4 1529 1533 1535 1536 2 0 5 1023 25 2 22 1506 0 0 2 1503 35 549 52 3 1538 1539 1540 236 2 8 0 579 1023 3 1542 252 1504 253 3 6 1509 240 0 3 486 1512 1510 221 4 1541 1543 1544 1545 2 0 5 1023 35 3 1507 1547 215 1540 3 1539 1542 236 1504 3 220 6 1498 263 3 1509 62 0 217 4 1548 1549 1550 1551 5 1527 1537 1546 1552 2 52 0 391 0 2 0 5 0 22 2 0 0 5 841 2 579 22 437 0 3 1554 1555 1556 1557 2 5 583 22 52 2 0 579 35 841 3 1559 242 259 1560 2 5 1503 0 770 2 35 0 52 723 1 3 1 0 1 2 0 1564 0 1564 3 1562 1563 0 1565 2 0 5 579 52 2 25 841 7 583 2 725 0 806 8 3 1567 1568 1569 6 4 1558 1561 1566 1570 2 583 7 52 0 3 245 1572 139 251 2 579 22 1503 0 3 231 1559 1574 259 2 0 0 8 579 2 725 979 22 1506 3 1576 237 1577 486 2 841 0 583 8 2 0 725 5 22 2 979 0 1506 8 3 1579 1567 1580 1581 4 1573 1575 1578 1582 2 1144 471 25 841 2 812 583 0 0 3 222 1584 0 1585 4 0 1586 0 0 2 579 1023 5 1503 2 8 5 22 948 2 52 549 0 0 3 0 1588 1589 1590 2 0 579 0 5 2 52 8 0 948 3 256 1592 1593 241 1 0 1 3 1 2 22 1595 0 0 2 697 0 5 35 2 5 25 0 7 3 1596 1597 0 1598 2 1144 0 52 697 3 980 259 1600 215 4 1591 1594 1599 1601 5 1571 1583 1587 1602 2 0 579 35 1503 3 242 245 1604 139 3 1572 231 251 1574 3 1568 1576 6 1577 3 237 1579 62 219 4 1605 1606 1607 1608 2 5 583 22 0 3 1610 242 259 135 2 52 95 22 51 3 1576 237 1577 1612 4 1611 290 235 1613 2 1023 35 1503 35 2 549 52 0 0 3 1615 0 1616 245 3 217 221 230 1593 2 35 1 52 25 3 251 980 1517 1619 4 1617 1618 250 1620 2 1023 25 1503 35 2 549 52 95 0 3 1592 1622 241 1623 2 0 0 1 95 2 25 19 96 95 2 19 19 22 52 3 1625 442 1626 1627 2 96 22 0 51 2 51 95 95 8 2 95 51 19 19 2 88 0 19 0 3 1629 1630 1631 1632 2 1 95 35 8 2 25 51 25 51 2 1 0 88 5 3 1634 161 1635 1636 4 1624 1628 1633 1637 5 1609 1614 1621 1638 6 1515 1553 1603 1639 2 88 88 35 88 2 358 426 358 19 3 1641 574 0 1642 2 0 0 14 419 2 0 8 0 698 3 1318 1401 1644 1645 2 340 7 0 5 2 0 51 0 19 3 0 1647 0 1648 1 1 0 3 0 2 25 1650 51 88 2 96 1 19 51 2 19 0 52 1 3 9 1651 1652 1653 4 1643 1646 1649 1654 2 51 96 397 19 3 1405 1406 1656 1408 2 88 19 25 5 2 19 0 35 0 2 25 1 558 0 3 1658 1659 1476 1660 2 25 19 592 19 2 0 22 0 51 2 395 707 95 25 3 1662 1663 1664 1472 3 1170 0 0 0 4 1657 1661 1665 1666 3 0 46 0 0 2 0 14 7 0 2 95 419 19 0 2 51 95 0 51 3 1669 1670 0 1671 4 1668 1672 0 0 1 0 1 3 3 2 499 1 1674 95 2 19 0 95 7 3 1675 0 1676 9 3 1671 1174 0 1671 3 0 0 123 123 4 1677 0 1678 1679 5 1655 1667 1673 1680 2 402 558 1 0 3 1682 0 0 0 4 1683 0 0 0 4 0 0 1679 1679 5 1684 0 1685 1685 6 1681 1686 545 545 2 0 22 0 22 2 22 52 96 723 3 1688 1689 0 222 4 0 1690 0 0 5 0 1691 1685 1685 2 841 437 1503 35 2 0 0 487 391 3 1039 238 1693 1694 2 0 95 22 51 2 0 96 95 1 2 51 95 402 412 2 8 35 0 25 3 1696 1697 1698 1699 2 770 52 0 1 2 0 19 7 95 2 0 8 0 25 2 35 52 25 7 3 1701 1702 1703 1704 2 497 19 22 52 2 0 25 499 25 2 25 0 5 8 2 390 391 19 5 3 1706 1707 1708 1709 4 1695 1700 1705 1710 2 95 22 95 19 2 8 19 51 1 2 0 19 0 395 3 1712 382 1713 1714 2 25 0 95 5 2 419 397 52 0 2 5 52 397 0 3 1716 1717 1718 0 2 51 88 0 8 2 5 52 52 0 2 395 397 52 0 3 1720 1721 1722 0 4 1715 1719 1723 0 2 0 25 0 8 2 5 14 52 0 3 1725 1726 0 0 2 402 390 25 5 2 5 52 513 0 2 8 0 0 8 3 1728 1729 1730 1730 2 8 0 0 7 3 0 1732 123 123 4 1727 1731 1679 1733 3 123 123 123 123 4 0 0 1735 1735 5 1711 1724 1734 1736 6 1692 1737 545 545 7 1489 1640 1687 1738 2 51 95 437 51 2 0 579 95 590 2 51 95 433 471 2 25 1 8 589 3 1740 1741 1742 1743 2 7 95 51 363 2 581 0 0 0 2 452 0 0 0 3 1745 1746 1747 0 2 1503 590 841 51 2 19 340 95 8 2 589 0 979 0 3 1749 1750 1525 1751 2 25 471 25 697 3 310 0 1753 0 4 1744 1748 1752 1754 2 1506 8 0 5 3 252 1756 253 215 2 51 95 35 25 2 25 0 589 0 2 0 437 8 19 3 1758 1759 234 1760 3 219 220 256 1498 3 6 1509 263 1625 4 1757 1761 1762 1763 2 0 1 0 25 3 0 0 0 1765 2 95 0 19 5 3 0 0 1767 0 3 1696 1697 442 1699 3 1712 181 1713 0 4 1766 1768 1769 1770 5 1755 0 1764 1771 3 0 0 0 1331 2 0 0 51 0 2 0 95 340 454 3 0 0 1774 1775 4 0 1773 1776 1377 3 0 0 0 1346 3 0 0 0 371 4 0 1778 1779 1363 2 0 0 354 356 3 1781 1360 1347 310 3 321 366 367 1355 4 1782 1387 1783 373 5 0 1777 1780 1784 2 579 22 841 0 3 231 1610 1786 1629 2 7 52 95 0 3 1788 1626 1630 1634 2 841 1 583 25 3 1790 1631 1697 1712 2 52 25 0 390 2 25 0 391 395 3 1632 1635 1792 1793 4 1787 1789 1791 1794 2 0 25 25 25 2 96 95 19 5 3 1627 1796 161 1797 2 51 88 0 419 2 0 0 358 426 3 1799 0 1721 1800 2 8 52 397 0 3 1636 1722 1802 0 2 358 19 340 7 3 0 1804 0 0 4 1798 1801 1803 1805 2 402 412 0 8 3 1699 1713 1796 1807 2 0 19 0 5 3 1809 1721 1722 0 2 96 95 406 395 3 1811 1718 1721 0 4 1808 1810 1812 0 5 1795 1806 1813 0 2 0 95 51 88 3 1815 446 1413 448 3 447 424 1451 428 2 95 0 51 433 2 51 436 51 438 2 437 0 88 95 3 1818 458 1819 1820 2 454 460 455 460 3 459 1415 462 1822 4 1816 1817 1821 1823 3 185 442 443 1413 3 458 459 1418 462 4 1825 450 457 1826 3 0 1325 0 108 2 354 0 451 95 2 466 51 0 51 2 95 1 88 471 3 1829 0 1830 1831 2 35 436 0 0 3 108 1833 0 0 4 1828 1832 0 1834 2 51 95 51 363 3 1429 1355 1431 1836 2 1 340 25 0 3 469 470 1838 473 2 433 0 340 95 3 1423 1260 1389 1840 2 0 1 96 95 2 0 96 1 51 3 448 1842 1843 432 4 1837 1839 1841 1844 5 1824 1827 1835 1845 6 1772 1785 1814 1846 3 1330 1334 1332 321 3 310 1317 1318 369 2 95 95 95 0 2 425 51 460 0 3 1850 1325 1326 1851 4 1848 1849 1324 1852 2 589 0 95 437 3 432 1854 1331 1641 2 471 471 697 590 2 19 0 95 723 2 8 19 589 51 3 1856 1730 1857 1858 3 1376 0 1339 1322 2 0 437 95 8 3 1320 1861 1323 1326 4 1855 1859 1860 1862 2 363 88 365 88 3 1864 321 0 367 3 366 369 321 371 4 1348 1351 1865 1866 3 357 1344 361 1346 3 1345 1349 1347 310 2 51 88 1 35 2 96 96 96 19 3 321 1870 1871 1355 4 1868 1869 1363 1872 5 1853 1863 1867 1873 2 8 406 948 52 2 5 7 95 471 2 583 0 0 0 3 887 1875 1876 1877 2 25 697 51 95 2 471 19 1321 19 2 589 0 340 95 3 1879 62 1880 1881 4 1878 0 1882 0 2 460 95 0 96 2 8 19 96 0 3 1884 1885 1843 432 2 0 0 471 0 2 590 0 95 25 3 1887 0 1888 0 2 96 0 19 14 3 369 370 371 1890 2 5 0 25 8 2 8 51 22 52 3 1352 1892 62 1893 4 1886 1889 1891 1894 2 5 8 19 0 2 0 0 25 95 3 0 0 1896 1897 2 5 35 5 8 2 51 88 0 25 2 96 1 19 0 2 95 25 8 52 3 1899 1900 1901 1902 4 1898 0 1903 0 5 1883 0 1895 1904 2 364 51 25 0 3 442 1906 1413 448 3 310 1843 1870 369 4 1412 1907 1417 1908 2 95 1 88 25 2 0 1 96 0 3 447 1910 1911 428 3 432 1415 462 1822 2 14 8 19 0 3 453 1914 1892 1899 4 1912 445 1913 1915 3 0 1871 1910 185 2 1 340 25 5 3 321 469 1836 1918 3 428 1423 1330 1334 2 88 25 0 8 2 0 22 25 25 3 1260 1921 1914 1922 4 1917 1919 1920 1923 2 356 0 19 14 2 360 19 0 5 2 0 25 35 51 3 1925 62 1926 1927 2 25 25 88 19 3 1893 1901 1929 161 2 8 5 51 96 2 8 0 1 95 2 52 19 25 19 3 1931 1932 1933 1403 2 25 5 25 0 2 35 0 581 558 2 52 0 52 1 3 1935 1936 1937 206 4 1928 1930 1934 1938 5 1909 1916 1924 1939 2 364 51 25 5 2 7 19 0 5 3 1941 1942 1921 1931 3 1927 1929 1932 1935 2 19 19 395 707 3 1922 1933 1900 1945 2 0 51 0 558 3 1403 1937 1947 206 4 1943 1944 1946 1948 2 22 52 402 391 2 35 0 25 1 2 1 0 0 5 3 161 1950 1951 1952 3 0 228 135 139 2 558 0 0 0 3 1955 268 0 0 3 234 236 0 238 4 1953 1954 1956 1957 2 0 25 0 1 2 698 397 51 1 3 1902 1959 1960 1955 3 206 0 0 0 4 1961 1962 1962 0 5 1949 1958 1963 0 6 1874 1905 1940 1964 5 0 0 1736 1736 2 51 88 51 35 3 0 1967 0 0 2 88 0 88 433 2 0 358 0 358 2 426 0 19 14 3 1969 1331 1970 1971 2 0 340 0 0 2 7 0 5 7 2 51 96 7 19 3 1973 1974 2 1975 4 1968 1972 0 1976 2 14 14 0 0 3 515 1978 0 0 4 0 1979 1735 1735 5 0 1977 1736 1980 2 7 7 7 1 2 0 25 0 51 2 0 0 7 7 3 1982 123 1983 1984 3 123 123 1984 1984 4 1985 1986 0 0 2 0 0 35 7 3 123 123 9 1988 2 19 5 1 19 3 123 1982 321 1990 3 0 230 0 0 2 88 7 25 5 2 25 5 25 25 3 1993 249 1994 234 4 1989 1991 1992 1995 2 0 1 1 5 3 0 1997 1997 1721 4 0 0 0 1998 2 5 7 52 340 3 0 1466 1997 2000 2 8 7 22 52 2 95 0 454 590 2 425 95 5 35 3 108 2002 2003 2004 1 0 2 0 1 2 0 2006 0 22 2 5 8 0 8 3 1721 2007 0 2008 2 19 52 52 5 2 5 8 52 1 2 14 52 0 0 2 340 454 2006 19 3 2010 2011 2012 2013 4 2001 2005 2009 2014 5 1987 1996 1999 2015 6 1966 1981 545 2016 2 0 0 419 0 2 8 51 698 397 3 1332 1892 2018 2019 2 1650 25 88 592 2 1 19 51 52 2 0 395 1 95 3 516 2021 2022 2023 2 22 52 51 1 2 707 0 25 1 3 161 2025 2026 1955 4 2020 1903 2024 2027 2 19 19 5 35 2 0 402 0 1 2 0 25 0 558 3 2029 2030 2031 206 3 1955 0 0 0 4 2032 2033 1962 0 2 419 499 0 1674 2 95 19 51 95 3 310 2035 108 2036 2 1 0 95 0 3 2038 0 62 0 2 8 51 95 8 2 7 8 7 95 3 123 2040 2041 120 3 114 62 2040 114 4 2037 2039 2042 2043 4 0 0 160 0 5 2028 2034 2044 2045 2 35 14 14 35 2 52 51 0 5 3 2040 114 2047 2048 2 8 51 95 25 2 95 25 52 25 2 25 25 25 25 3 120 2050 2051 2052 2 52 52 0 0 2 8 52 5 35 2 19 14 5 52 3 2054 2055 60 2056 2 0 25 14 52 2 25 25 52 8 3 2058 2052 253 2059 4 2049 2053 2057 2060 2 95 25 25 25 3 2062 0 2052 0 2 25 8 51 95 3 2052 0 2064 1397 4 2063 0 2065 0 2 25 7 51 8 2 52 35 7 5 3 217 256 2067 2068 3 885 2047 249 2054 2 0 22 0 425 2 52 5 95 25 2 590 5 52 5 3 2071 2072 2073 1406 3 234 60 2002 217 4 2069 2070 2074 2075 2 52 25 0 25 2 8 0 14 52 3 2077 180 2055 2078 3 2056 253 256 885 3 1984 1984 2047 166 4 2079 0 2080 2081 5 2061 2066 2076 2082 2 0 0 1 7 3 0 0 0 2084 3 0 0 1984 1984 4 0 0 2085 2086 3 0 0 0 1997 3 1984 1984 166 166 2 0 1 7 5 3 2090 1721 242 0 4 0 2088 2089 2091 2 5 7 52 5 3 1997 2093 1721 28 2 7 7 7 452 2 5 7 0 7 3 123 2095 2096 123 2 5 7 0 452 2 466 7 360 7 3 2096 123 2098 2099 4 2094 2097 29 2100 5 0 2087 2092 2101 6 2046 0 2083 2102 7 1847 1965 2017 2103 8 1003 1316 1739 2104 2 0 1 51 95 3 0 2106 0 92 2 5 52 19 0 3 2108 0 161 0 3 0 92 0 92 2 0 0 0 14 2 19 0 19 19 3 161 2111 161 2112 4 2107 2109 2110 2113 2 22 52 8 14 3 1730 2115 0 1730 2 0 0 14 14 2 14 14 0 5 2 51 14 8 0 3 2117 321 2118 2119 3 0 0 1978 62 4 0 2116 2120 2121 3 161 92 161 92 4 2110 2123 2110 2123 2 88 0 25 95 2 1 823 35 562 3 108 2125 6 2126 2 0 0 391 0 2 52 0 14 14 2 0 0 562 14 3 2128 515 2129 2130 2 579 811 8 14 3 596 2132 995 2132 2 14 814 562 14 2 811 14 14 562 3 2134 2135 2134 2135 4 2127 2131 2133 2136 5 2114 2122 2124 2137 2 51 1 0 0 3 161 92 161 2139 4 2110 2140 2110 162 3 997 2132 596 2132 3 995 2132 997 2132 2 14 14 562 14 2 14 14 14 562 3 2134 2135 2144 2145 4 2142 2136 2143 2146 3 0 92 0 161 3 0 161 0 161 3 0 0 2117 2117 4 2148 210 2149 2150 2 814 811 0 0 3 596 2132 515 2152 2 14 814 0 0 2 811 14 0 0 3 2144 2145 2154 2155 2 5 0 14 14 3 0 0 2157 2117 4 2153 2156 2150 2158 5 2141 2147 2151 2159 6 0 2138 0 2160 2 5 52 52 340 2 1 0 454 590 3 2162 2163 2007 2010 3 2004 2067 2011 2071 2 8 8 0 8 3 2166 2012 0 1730 3 2013 2073 2115 2162 4 2164 2165 2167 2168 3 2068 249 2072 234 3 2054 0 60 0 3 1406 2002 2163 2004 2 0 8 0 51 3 2173 321 0 1671 4 2170 2171 2172 2174 2 0 677 14 562 3 62 0 2176 86 2 0 2006 95 22 2 1 52 14 562 3 1730 2178 2144 2179 2 814 811 14 14 2 14 814 14 562 2 14 814 14 14 3 2181 2182 2181 2183 3 2135 2181 2135 2181 4 2177 2180 2184 2185 2 19 52 52 0 2 0 52 0 0 3 2187 2188 2117 0 2 583 0 14 562 3 2134 2190 2134 2135 3 2117 2130 2181 2134 4 2189 0 2191 2192 5 2169 2175 2186 2193 3 2096 123 2096 123 4 29 2195 29 2195 2 51 95 0 19 3 1671 321 0 2197 2 0 0 14 562 2 0 1 0 22 2 52 0 0 5 3 2199 2200 2135 2201 2 95 0 52 0 2 7 8 8 19 3 2203 0 2204 0 4 2198 0 2202 2205 5 534 2196 2206 2196 3 2181 2183 2181 2183 4 2208 2185 2208 2185 3 2181 2134 2181 2134 3 2144 2145 2144 2145 4 2146 2210 2211 2208 3 2181 2183 2152 2154 3 2135 2181 2155 2152 2 0 19 14 14 3 0 0 2215 2117 4 2213 2214 2150 2216 3 2181 2134 2152 2154 2 0 0 14 559 3 0 0 2219 357 2 0 14 1 5 2 95 0 1 7 2 0 8 0 5 2 5 96 35 51 3 2221 2222 2223 2224 4 2156 2218 2220 2225 5 2209 2212 2217 2226 2 52 19 0 19 3 2135 2228 2135 2228 3 92 0 92 0 4 2229 2230 2229 2230 2 52 19 5 19 2 811 14 0 95 2 22 8 0 19 3 2135 2232 2233 2234 2 1 22 51 52 2 52 96 7 0 3 9 28 2236 2237 2 19 19 51 1 2 14 14 5 95 3 2239 0 2240 1984 4 2235 2230 2238 2241 2 0 19 5 19 3 0 28 9 2243 4 29 2195 2244 2195 5 2231 2196 2242 2245 6 2194 2207 2227 2246 2 19 51 0 8 3 268 92 0 2248 2 0 14 51 14 2 14 14 14 95 3 2250 86 2251 1978 3 108 310 0 108 4 2249 2252 0 2253 3 86 86 1978 1978 2 812 770 7 549 2 95 5 51 95 3 268 2256 2257 123 2 7 812 7 7 2 770 7 549 7 3 2259 2260 123 123 4 2255 2255 2258 2261 3 108 166 0 0 3 166 166 0 0 4 2263 2264 0 0 5 2254 2262 0 2265 6 0 2266 0 0 2 812 770 7 7 2 7 7 7 549 3 2268 2259 123 2269 2 770 7 7 7 2 7 812 549 7 3 2271 2268 2268 2272 4 2255 2255 2270 2273 2 14 1 14 95 2 14 1 0 0 3 86 2275 1978 2276 2 0 5 0 96 2 52 14 96 14 1 0 0 1 1 2 51 14 0 2280 2 51 14 1023 0 3 2278 2279 2281 2282 2 770 7 7 549 2 7 7 7 22 3 2259 2271 2284 2285 2 812 841 95 0 2 426 402 8 814 2 0 0 549 7 2 5 562 52 0 3 2287 2288 2289 2290 4 2277 2283 2286 2291 3 310 0 108 310 3 0 108 0 0 4 2264 2293 0 2294 4 0 0 2293 0 5 2274 2292 2295 2296 2 14 95 5 51 2 0 2280 14 841 2 22 8 14 0 2 0 583 8 841 3 2298 2299 2300 2301 2 1023 51 426 0 2 8 0 52 723 2 0 1 412 698 3 2303 310 2304 2305 2 811 7 811 1 2 583 583 812 770 2 14 14 0 95 2 562 14 0 0 3 2307 2308 2309 2310 2 770 88 1 0 2 14 1506 0 402 2 95 0 19 0 3 1721 2312 2313 2314 4 2302 2306 2311 2315 2 0 5 5 96 2 22 52 95 0 2 22 14 0 19 3 2317 2318 2319 1708 2 7 7 51 0 2 51 0 7 7 3 2321 166 2322 1984 2 0 395 0 0 1 3 0 1 2 2 707 19 2325 19 2 811 19 513 19 3 2324 2326 6 2327 4 2320 2323 2328 2195 3 339 1765 0 28 2 51 96 406 51 2 14 5 5 35 3 2002 181 2331 2332 2 5 452 0 7 2 433 471 0 590 2 5 8 2006 589 3 2334 2335 2336 855 4 2330 2333 29 2337 2 0 5 0 354 2 8 96 433 19 1 0 2 2 3 2 814 2341 497 5 2 19 19 35 19 3 2339 2340 2342 2343 2 19 0 592 0 2 497 0 19 0 3 2345 1463 2346 92 4 2344 2195 2347 2195 5 2316 2329 2338 2348 4 2294 2293 0 2294 5 0 2350 0 0 2 19 590 19 19 3 2352 857 92 1311 2 95 0 51 96 3 310 0 108 2354 2 0 19 433 19 3 2228 855 2356 857 4 29 2353 2355 2357 2 592 0 497 0 3 2359 92 2345 92 3 2346 92 2359 92 4 2360 2195 2361 2195 2 589 51 590 677 2 19 0 88 471 3 0 2363 0 2364 2 590 19 19 19 2 52 19 0 363 2 0 19 471 589 3 2366 1311 2367 2368 2 0 1 0 8 2 8 19 5 22 3 2370 1833 0 2371 2 364 365 25 0 2 436 364 5 52 2 948 579 1595 697 3 2373 2374 2375 181 4 2365 2369 2372 2376 3 2345 92 2346 92 4 2378 2195 2360 2195 5 2358 2362 2377 2379 6 2297 2349 2351 2380 7 2161 2247 2267 2381 3 0 1671 0 0 2 8 0 0 723 2 0 590 95 51 3 321 2384 1671 2385 2 51 14 0 0 3 0 2387 0 0 4 2383 2386 0 2388 2 592 0 14 397 3 2346 92 2390 92 2 5 7 0 466 3 2096 123 2392 123 2 14 0 0 8 3 2394 92 28 92 2 360 7 466 7 3 2334 2396 2096 123 4 2391 2393 2395 2397 2 25 0 1 0 3 2111 0 173 2399 4 0 0 3 2400 2 19 0 0 7 3 28 92 28 2402 3 2096 123 123 123 3 0 166 0 0 4 2403 2404 2405 2264 5 2389 2398 2401 2406 2 1 395 5 1650 2 52 0 14 841 3 2 173 2408 2409 4 0 3 3 2410 2 1 5 395 52 2 52 1 0 499 3 2 2408 2412 2413 4 0 3 3 2414 2 1650 14 1 579 3 2 2412 173 2416 2 579 583 22 452 1 1 1 0 0 2 841 2419 583 561 2 52 8 841 5 3 2413 2418 2420 2421 2 499 22 2419 52 2 561 841 0 583 3 2409 2423 2418 2424 2 452 0 8 88 2 583 5 35 22 2 5 35 5 52 2 35 0 25 95 3 2426 2427 2428 2429 4 2417 2422 2425 2430 5 0 2411 2415 2431 2 499 0 397 0 3 2409 2433 2418 2424 3 2416 2420 2423 2426 2 88 35 35 35 2 52 25 52 1 3 2421 2436 2427 2437 4 2414 2434 2435 2438 2 95 0 88 0 3 0 0 2440 0 4 0 0 2441 0 2 22 52 0 7 3 2424 2428 2436 2443 2 7 0 0 0 2 1 88 0 52 3 2429 2445 2446 166 2 95 0 88 7 3 2437 2448 2445 181 2 0 0 7 466 2 0 22 0 7 3 2450 1984 2451 0 4 2444 2447 2449 2452 2 0 25 0 52 2 7 7 8 0 3 181 2454 2455 166 3 0 0 166 166 2 7 0 466 7 3 2458 1984 0 0 3 1984 1984 0 352 4 2456 2457 2459 2460 5 2439 2442 2453 2461 6 0 2407 2432 2462 4 0 3 3 2417 4 2414 2425 2435 2438 5 0 2464 2411 2465 2 1 395 5 1503 2 1 5 579 52 2 52 487 0 25 3 2 2467 2468 2469 4 0 3 3 2470 2 1503 14 487 5 3 2 2468 173 2472 4 0 3 3 2473 2 1 579 5 1503 2 52 0 14 438 3 2 173 2475 2476 2 438 7 397 559 2 25 725 7 583 2 549 0 8 88 3 2472 2478 2479 2480 2 5 397 725 549 2 583 8 365 5 3 2469 2482 2478 2483 2 559 365 0 397 3 2485 2428 2436 2443 4 2477 2481 2484 2486 5 0 2471 2474 2487 2 52 0 14 35 2 5 52 948 452 3 2489 2423 2490 2424 4 2417 2422 2491 2430 2 433 0 436 7 3 2437 2493 2445 181 3 2450 1984 2454 1476 4 2444 2447 2494 2495 2 88 841 35 841 2 397 5 35 22 1 2 0 1 0 2 52 2499 52 1 3 2483 2497 2498 2500 3 2443 2446 2448 2450 2 35 0 25 433 2 1 436 0 52 3 2503 2445 2504 166 2 7 7 25 35 2 7 466 0 0 3 181 2454 2506 2507 4 2501 2502 2505 2508 2 466 7 25 8 2 52 7 466 7 3 166 2510 1984 2511 3 2507 166 2450 1984 2 22 0 7 0 2 466 7 0 0 3 2514 0 166 2515 2 7 8 0 51 3 0 0 2507 2517 4 2512 2513 2516 2518 5 2492 2496 2509 2519 6 0 2466 2488 2520 4 2410 2435 2422 2444 2 0 88 0 51 2 7 7 35 0 3 181 2523 2524 2507 4 2438 2502 2505 2525 3 2443 2446 2493 1984 2 7 7 12 0 2 7 0 7 7 3 166 2528 1984 2529 4 2430 2449 2527 2530 3 1984 1984 1663 0 3 2529 2450 0 0 2 7 7 52 0 2 0 0 8 7 3 2534 2507 1984 2535 4 2532 2533 2513 2536 5 2522 2526 2531 2537 2 51 0 466 7 3 166 2524 1984 2539 3 166 166 2450 1984 3 0 0 166 2515 4 2540 2541 2542 2518 2 0 0 466 7 3 2515 166 2544 2535 2 7 7 14 14 2 0 95 7 7 3 2517 2546 1984 2547 2 466 7 14 562 3 0 2387 2549 2546 2 14 562 0 95 2 7 7 562 14 2 7 7 14 562 3 2310 2551 2552 2553 4 2545 2548 2550 2554 3 1984 2544 0 0 2 0 0 8 466 3 2557 1984 2387 2310 3 2517 2549 1984 2544 2 7 466 14 14 3 2560 2546 2450 1984 4 2556 2558 2559 2561 2 14 562 0 0 3 2544 1984 2563 1978 3 1984 2547 1978 2309 3 2549 2546 2544 1984 3 2546 2546 1984 2547 4 2564 2565 2566 2567 5 2543 2555 2562 2568 2 0 12 0 51 2 466 7 25 14 3 181 2570 2571 166 3 2511 1984 0 0 3 1984 1984 0 0 4 2572 2457 2573 2574 3 0 2387 2549 2560 3 2535 1984 2387 1978 3 1984 1984 1978 1978 4 2518 2576 2577 2578 3 2517 2546 1984 1984 3 2310 2563 2552 2553 4 2545 2580 2550 2581 3 2560 2552 2450 1984 3 2549 2560 1984 2450 3 1978 2310 2560 2546 2 7 466 14 96 3 2563 1978 2553 2586 4 2583 2584 2585 2587 5 2575 2579 2582 2588 3 1978 2563 2546 2546 3 1978 1978 2560 2552 3 1984 2544 2310 2563 3 2450 1984 1978 2310 4 2590 2591 2592 2593 2 466 7 14 14 3 1978 1978 2595 2546 3 2310 2309 2546 2553 2 0 95 7 8 2 14 14 0 579 2 95 5 390 558 3 1984 2598 2599 2600 4 2596 2597 2564 2601 3 2552 2595 1984 2544 3 1978 2563 2546 2595 2 14 96 0 0 2 7 466 14 95 2 8 5 5 22 3 2605 2118 2606 2607 4 2603 2561 2604 2608 2 7 7 14 95 2 0 0 466 8 2 5 96 5 51 3 2595 2610 2611 2612 2 51 14 8 5 2 1 0 14 96 2 14 22 0 95 3 2607 2614 2615 2616 2 95 5 96 1 2 22 8 0 14 2 96 0 0 7 3 2618 2619 2614 2620 2 5 0 22 8 2 7 88 1 88 2 95 1 88 22 3 2622 2623 2624 1815 4 2613 2617 2621 2625 5 2594 2602 2609 2626 6 2538 2569 2589 2627 7 0 2463 2521 2628 8 0 2382 0 2629 9 548 2105 0 2630 2 0 0 0 364 2 0 0 360 677 3 0 0 2632 2633 4 0 0 0 2634 5 0 0 0 2635 2 395 679 452 360 3 6 567 2637 569 4 0 0 2638 573 2 0 0 1004 0 2 562 1007 549 452 3 566 2640 568 2641 4 0 0 1060 2642 5 0 0 2639 2643 2 0 0 0 425 2 0 0 0 406 2 364 5 0 19 3 0 2645 2646 2647 2 558 5 5 22 3 2649 32 26 34 3 1311 28 1306 28 3 26 34 26 34 4 2648 2650 2651 2652 3 1309 28 1311 28 3 1306 28 1309 46 3 26 34 47 50 4 2654 2652 2655 2656 5 0 2653 0 2657 2 703 705 0 679 3 2659 615 36 617 3 41 43 41 43 4 2660 641 2661 44 2 556 703 562 52 2 583 579 12 590 3 614 2663 616 2664 2 12 406 12 589 2 12 590 12 406 3 43 2666 43 2667 4 1077 2665 44 2668 2 12 51 52 579 3 41 43 2670 818 3 43 43 819 810 4 2661 44 2671 2672 2 12 589 12 590 3 43 2674 43 2666 3 43 43 818 819 2 7 589 841 0 3 43 2667 810 2677 4 44 2675 2676 2678 5 2662 2669 2673 2679 6 2636 2644 2658 2680 2 0 0 679 0 3 0 0 2682 0 4 0 0 2683 0 5 0 0 2684 0 2 397 395 579 948 2 419 0 589 723 2 471 593 437 597 3 2686 2687 2688 604 2 1023 0 593 0 3 0 0 2690 0 2 581 584 471 593 2 437 597 581 584 3 2692 591 2693 602 2 597 0 584 0 2 593 0 597 0 3 2695 0 2696 0 4 2689 2691 2694 2697 3 2688 604 2692 591 2 584 0 593 0 3 2700 0 2695 0 2 471 593 697 698 2 590 437 406 679 3 2693 602 2702 2703 2 584 0 583 0 3 2696 0 2705 0 4 2699 2701 2704 2706 5 2698 0 2707 0 6 2685 0 2708 0 3 1311 85 1306 87 3 86 97 89 98 3 1309 91 1311 92 4 2710 2711 2712 2652 3 1306 92 1309 92 3 1311 92 1306 92 4 2714 2652 2715 2652 5 0 2713 0 2716 2 395 723 466 812 2 962 1564 0 723 3 2718 820 2719 829 3 821 815 830 825 2 770 466 12 12 3 36 2722 41 43 2 812 770 12 12 2 466 812 12 12 3 2724 2725 43 43 4 2720 2721 2723 2726 3 820 821 829 830 2 811 419 770 466 2 817 962 811 397 3 815 2729 825 2730 3 2722 2724 43 43 2 583 5 12 406 3 2725 2733 43 2674 4 2728 2731 2732 2734 4 2661 44 2661 44 4 44 2668 44 2675 5 2727 2735 2736 2737 2 433 51 340 95 3 1309 110 108 2739 2 19 52 25 579 3 47 50 112 2741 2 0 402 0 0 3 0 2743 0 0 2 391 8 51 433 2 95 8 402 391 3 2745 120 1973 2746 4 2740 2742 2744 2747 2 0 406 0 0 3 0 108 0 2749 4 0 2750 0 1012 5 0 2748 0 2751 2 12 51 52 395 2 5 419 770 466 3 2753 819 2754 821 2 960 962 95 419 3 2756 830 120 2268 2 466 812 7 95 3 825 829 2758 866 4 2755 861 2757 2759 2 7 590 1144 0 2 814 697 812 770 3 818 2761 820 2762 2 809 960 814 583 2 52 558 425 395 3 829 2764 866 2765 4 1246 2763 1247 2766 2 433 8 358 95 2 340 19 7 7 2 0 7 771 95 3 2768 130 2769 2770 3 131 184 133 185 2 5 19 948 22 2 979 96 0 0 3 0 2773 135 2774 3 138 0 140 194 4 2771 2772 2775 2776 2 364 679 25 725 2 95 579 25 590 2 7 52 5 549 3 0 2778 2779 2780 2 579 364 583 5 2 579 52 583 364 2 0 581 95 471 3 2782 2783 2784 688 2 25 1 25 471 2 19 340 425 7 2 25 697 25 19 2 590 0 19 0 3 2786 2787 2788 2789 2 454 0 579 95 2 437 354 35 364 3 2791 691 2792 1301 4 2781 2785 2790 2793 5 2760 2767 2777 2794 6 2717 2738 2752 2795 2 0 95 723 811 2 471 0 340 723 2 52 95 579 579 2 466 814 723 579 3 2797 2798 2799 2800 2 0 0 811 0 3 2802 0 1237 1022 3 754 604 743 591 2 931 590 597 406 3 2805 691 701 687 4 2801 2803 2804 2806 3 711 688 712 691 3 701 687 711 688 4 1201 2808 1202 2809 5 2807 0 2810 0 2 437 593 419 698 2 590 437 406 419 2 0 948 419 0 2 589 52 437 364 3 2812 2813 2814 2815 2 593 590 397 558 2 425 579 5 583 3 2817 691 2818 181 2 397 471 364 579 2 581 581 52 471 2 5 583 397 558 2 364 5 395 397 3 2820 2821 2822 2823 3 654 0 1877 0 4 2816 2819 2824 2825 2 425 579 0 437 3 2827 181 599 0 3 623 0 596 0 4 2828 0 2829 0 5 2826 0 2830 0 6 2811 0 2831 0 7 2681 2709 2796 2832 3 0 0 0 227 4 0 0 0 2834 3 6 1528 1518 220 2 5 579 725 979 3 0 217 2837 230 2 1503 0 841 0 2 583 8 0 22 3 2839 222 2840 241 4 0 2836 2838 2841 3 1039 1547 215 1540 3 0 219 217 221 2 948 0 1595 697 2 35 35 25 1144 3 2845 6 222 2846 4 1012 2843 2844 2847 3 1539 251 236 237 3 252 259 253 215 3 219 262 256 1498 4 2849 2850 265 2851 5 2835 2842 2848 2852 3 240 244 242 245 2 52 8 0 725 3 217 221 246 2855 4 286 287 2854 2856 2 25 589 19 340 2 589 51 95 437 2 25 51 51 433 3 2858 2859 262 2860 2 579 7 590 51 2 95 25 471 723 2 1 452 589 0 3 1840 2862 2863 2864 3 222 1520 1493 1521 2 590 590 51 95 2 340 95 8 51 2 8 589 725 979 3 2867 2868 2869 596 4 2861 2865 2866 2870 3 1542 273 1504 253 3 6 1509 263 0 3 62 1512 1510 221 4 294 2872 2873 2874 3 1507 1538 215 1540 2 8 51 579 1023 3 1539 2877 236 1504 3 220 6 1498 240 4 2876 2878 2879 1511 5 2857 2871 2875 2880 3 246 231 251 273 3 215 234 262 6 4 2882 289 287 2883 2 697 5 22 22 2 723 0 5 841 3 2885 246 139 2886 3 231 1559 1557 259 2 5 1503 52 770 3 236 2889 238 62 2 0 1564 5 1564 3 1563 1567 2891 1569 4 2887 2888 2890 2892 3 217 221 277 231 3 0 280 0 0 3 259 135 268 234 4 2894 243 2895 2896 3 0 217 245 230 3 256 222 231 241 4 2898 2899 261 325 5 2884 2893 2897 2900 2 583 7 0 0 3 2902 231 251 1574 3 237 1579 62 1580 4 1605 2903 1607 2904 3 1610 242 259 1560 2 583 7 0 95 3 245 2907 139 300 2 979 52 1506 22 3 1567 1568 2909 310 3 301 302 346 347 4 2906 2908 2910 2911 3 1584 0 1585 1589 2 52 549 0 95 3 1588 331 2914 382 3 135 1596 234 301 1 2 3 0 2 2 2917 51 402 95 2 95 1 419 707 3 2918 2919 302 203 4 2913 2915 2916 2920 3 334 335 385 386 3 348 349 403 413 2 95 19 679 19 3 2924 407 394 215 3 408 181 181 0 4 2922 2923 2925 2926 5 2905 2912 2921 2927 6 2853 2881 2901 2928 2 95 581 363 0 3 2930 0 0 0 2 471 0 697 0 3 321 0 2932 0 4 2931 0 2933 0 2 95 25 25 589 2 437 0 19 0 3 2935 0 253 2936 3 0 0 0 301 3 1512 333 331 334 3 310 346 335 348 4 2937 2938 2939 2940 3 0 0 344 0 3 347 0 349 0 4 2942 0 2943 0 5 2934 0 2941 2944 3 382 385 383 387 3 386 418 388 421 3 203 394 392 398 3 396 414 181 0 4 2946 2947 2948 2949 3 420 0 181 0 4 2951 0 0 0 3 411 181 414 0 4 2953 0 0 0 5 2950 2952 2954 0 6 2945 0 2955 0 3 238 486 0 217 3 219 333 331 334 3 0 277 0 0 3 490 385 491 501 4 2957 2958 2959 2960 2 8 14 0 0 2 0 25 1 5 3 2962 512 0 2963 3 1997 1721 1721 0 4 0 2964 2088 2965 5 0 2961 0 2966 3 347 527 349 529 3 386 418 502 505 3 504 181 414 0 4 2940 2968 2969 2970 3 528 414 181 0 4 2972 0 0 0 3 514 181 1721 0 4 2974 0 0 0 5 2971 2973 2975 0 3 0 0 1984 2090 4 0 2088 2977 2965 4 2965 0 0 0 2 7 7 360 7 2 7 52 452 360 3 2980 2981 123 123 3 1984 1984 123 123 2 7 466 452 360 3 123 123 2984 2095 3 123 123 2099 2984 4 2982 2983 2985 2986 2 0 0 452 360 3 1984 2988 123 123 3 123 123 2095 2099 2 7 7 452 360 3 123 123 2991 2095 4 2983 2989 2990 2992 5 2978 2979 2987 2993 2 0 0 7 452 3 1984 2995 123 123 3 123 123 2980 2991 3 123 123 2095 2980 4 2983 2996 2997 2998 2 52 0 7 7 3 2682 0 3000 1984 4 3001 2086 2992 2997 5 0 0 2999 3002 6 2967 2976 2994 3003 4 2086 2086 2998 2992 3 486 0 486 0 4 2086 160 2997 3006 5 0 0 3005 3007 6 0 0 3008 0 7 2929 2956 3004 3009 8 2833 0 3010 0 4 1735 1735 1735 1735 2 7 466 7 7 3 123 123 3013 123 4 1735 3014 1735 1735 5 3012 3015 3012 3012 2 466 7 7 7 3 123 123 3017 123 3 123 123 123 3017 4 3018 3019 1735 1735 5 3012 3012 3020 3012 5 3012 3012 3012 3012 3 123 123 123 3013 4 3023 1735 1735 1735 4 1735 3023 1735 1735 4 1735 3019 1735 1735 3 123 123 3017 3013 4 1735 3027 1735 1735 5 3024 3025 3026 3028 6 3016 3021 3022 3029 3 123 3017 123 123 3 3013 123 123 123 4 3031 3032 1735 1735 3 3017 3013 123 123 4 3034 3006 1735 3006 4 1735 3006 1735 3006 5 3033 3035 3012 3036 4 3019 3014 1735 1735 4 3018 3006 1735 3006 5 3012 3036 3038 3039 6 3037 0 3040 0 3 166 166 1984 1984 4 3042 3042 1735 1735 3 166 166 2322 1984 4 3044 3042 1735 1735 5 3043 3045 3012 3012 2 7 7 466 7 3 123 123 123 3047 4 3042 3044 1735 3048 3 166 166 2544 1984 2 7 7 7 466 3 3051 123 123 123 3 123 3051 3047 3051 4 3042 3050 3052 3053 3 123 3047 123 123 3 123 123 123 3051 4 1735 3055 3056 3055 3 123 123 3051 123 3 123 3051 123 123 4 3058 3059 1735 3053 5 3049 3054 3057 3060 4 1735 1735 1735 3058 5 3012 3012 3012 3062 3 123 3051 3047 123 4 3059 3048 3064 3048 3 123 123 3047 123 4 3052 3066 3052 1735 3 3047 123 123 3051 3 3047 123 123 123 4 3068 1735 3069 1735 5 3065 3067 3070 3012 6 3046 3061 3063 3071 3 166 166 2322 2544 3 123 3047 123 3047 3 3051 123 3051 123 4 3073 2541 3074 3075 3 166 166 2544 2450 3 181 0 62 0 2 452 360 7 466 3 3047 3079 3047 123 4 3077 3078 3080 3006 4 3074 3058 3055 1735 5 3076 3081 3082 3036 5 3012 3036 3012 3036 6 3083 0 3084 0 7 3030 3041 3072 3085 2 7 452 7 7 3 3079 3087 123 123 3 2396 3079 123 123 4 1735 1735 3088 3089 3 3087 2396 123 123 2 452 360 7 7 3 3092 3087 123 123 4 1735 3052 3091 3093 2 360 7 7 14 3 123 123 3087 3095 2 95 5 25 8 2 25 0 471 1 3 166 3097 0 3098 4 1735 3096 2264 3099 2 452 360 14 14 2 7 452 14 14 3 123 123 3101 3102 2 360 7 14 14 3 123 123 3104 3101 4 3103 3105 2255 2255 5 3090 3094 3100 3106 2 360 7 7 7 3 3108 3092 123 123 3 3087 3108 123 123 4 1735 1735 3109 3110 3 3092 3087 3051 123 3 2396 123 123 123 4 1735 3056 3112 3113 3 123 123 3102 3104 3 123 123 2546 3102 4 3115 3116 2255 2255 2 397 0 14 14 3 2455 166 3118 2117 2 0 0 14 95 3 166 166 2117 3120 2 14 1 14 14 3 86 3122 1978 1978 4 3119 3121 2255 3123 5 3111 3114 3117 3124 2 0 19 0 51 3 0 20 0 3126 2 0 0 7 95 2 437 25 25 25 2 0 25 7 0 3 3128 3129 3130 779 2 0 5 5 14 2 7 52 1 7 3 3132 240 1399 3133 4 3127 3131 0 3134 2 8 8 51 51 3 1897 1397 3136 181 2 25 0 7 7 3 0 0 3138 1984 4 3137 0 3139 2086 3 0 0 166 2517 2 51 452 7 7 3 1983 3142 2595 2586 2 51 96 0 0 3 2557 1984 3144 1978 3 2544 2450 1978 1978 4 3141 3143 3145 3146 3 3108 3092 2546 2595 3 123 123 2560 2546 3 2450 1984 1978 1978 4 3148 3149 2592 3150 5 3135 3140 3147 3151 4 0 0 2086 2086 2 0 0 5 95 2 51 52 7 7 2 14 14 5 14 3 3154 0 3155 3156 2 14 0 95 8 3 0 0 3158 344 4 0 0 3157 3159 3 123 123 2546 2546 3 1984 1984 2563 1978 2 562 14 0 5 3 1984 9 3163 2618 4 3161 3161 3162 3164 2 52 0 7 8 3 123 3166 2610 2607 2 96 14 96 0 2 0 8 8 5 3 3168 2619 3169 2620 3 2612 2615 2619 2622 2 8 1 1 0 2 22 51 88 5 3 2616 3172 2623 3173 4 3167 3170 3171 3174 5 3153 3160 3165 3175 6 3107 3125 3152 3176 3 3087 3108 3087 3108 3 3092 123 3051 123 4 3048 3058 3178 3179 3 3047 3051 3047 3079 4 3066 3006 3181 3006 2 452 360 0 0 3 3183 166 0 0 3 0 0 181 0 4 2264 3184 3185 0 4 2264 205 0 0 5 3180 3182 3186 3187 3 2622 2117 2624 1815 3 2117 2117 0 344 2 88 88 95 51 2 5 52 96 1 2 88 19 52 1 2 51 5 7 52 3 3191 3192 3193 3194 2 1 7 88 0 2 52 88 1 5 2 52 1 88 5 2 5 52 52 5 3 3196 3197 3198 3199 4 3189 3190 3195 3200 3 0 0 1730 0 2 95 0 52 5 2 8 0 52 0 3 3203 3204 1721 0 4 3202 0 3205 0 5 0 0 3201 3206 6 3188 0 3207 0 3 2560 2552 1984 1984 3 2546 2546 2544 1984 3 2563 1978 2549 2546 4 3209 3210 2585 3211 3 2546 2546 1984 1984 3 1978 1978 2546 2546 3 1978 2118 2610 2607 4 3213 3213 3214 3215 3 1984 2450 1978 1978 3 2546 2552 1984 1984 3 2546 2610 9 2612 4 3150 3217 3218 3219 2 562 14 0 579 3 1984 2611 3221 2600 2 579 390 5 51 2 558 0 14 96 3 3223 3224 2619 2622 3 2620 2624 3172 3191 4 3222 3225 2617 3226 5 3212 3216 3220 3227 2 51 96 19 51 3 1815 3229 3192 3196 2 1 88 5 52 3 3173 3193 3229 3231 3 3194 3198 1997 3199 4 3226 3230 3232 3233 3 3231 1997 3197 3199 4 3174 3195 3230 3235 3 3199 1721 1721 0 4 3200 3237 3237 0 5 2626 3234 3236 3238 3 1978 2599 2606 2607 3 2600 2619 2614 2620 4 3240 3241 3171 3174 4 2625 3232 3195 3200 4 3235 3237 3237 0 5 3242 3243 3234 3244 4 3233 3237 3237 0 5 3246 0 0 0 6 3228 3239 3245 3247 5 3244 0 0 0 6 3249 0 0 0 7 3177 3208 3248 3250 8 3086 0 3251 0 9 3011 0 3252 0 2 25 14 1 5 3 2 173 173 3254 4 0 3 3 3255 2 1 5 5 25 3 2 173 3257 2489 4 0 3 3 3258 2 52 1 0 25 3 2 3257 173 3260 2 25 22 7 52 2 5 52 22 7 2 14 35 0 52 3 2489 3262 3263 3264 2 35 7 52 14 2 7 0 8 88 3 3254 3266 3262 3267 2 52 8 35 5 2 52 5 35 22 3 3269 2436 3270 2437 4 3261 3265 3268 3271 5 0 3256 3259 3272 4 0 3 3 3261 3 3260 3263 3266 3269 3 3264 2428 2436 2443 4 3258 3268 3275 3276 5 0 3274 3256 3277 3 3267 3270 2428 2429 4 3255 3275 3265 3279 2 0 35 0 51 2 51 25 51 52 3 2450 1984 3281 3282 4 3276 2447 2494 3283 3 2443 2446 2448 1984 2 7 7 35 19 2 7 7 95 0 3 181 3281 3286 3287 4 3271 3285 2447 3288 3 166 3286 1984 2322 3 3287 166 3000 1984 2 51 25 51 0 3 3292 0 166 166 4 3290 3291 3293 3141 5 3280 3284 3289 3294 6 0 3273 3278 3295 5 0 3259 3274 3280 2 466 7 88 19 2 7 466 95 0 3 181 2523 3298 3299 4 3271 3285 2505 3300 2 35 0 25 0 3 3267 3270 2428 3302 2 7 5 1 52 2 95 14 96 95 3 2437 2448 3304 3305 2 22 52 0 52 2 95 1 88 88 2 0 1 406 579 3 3307 1997 3308 3309 2 395 561 52 95 2 1 0 5 8 2 19 19 1023 19 2 19 5 0 22 3 3311 3312 3313 3314 4 3303 3306 3310 3315 2 0 88 8 51 2 19 52 0 52 3 1984 1984 3317 3318 3 2322 3000 0 0 2 0 7 14 14 2 0 0 7 96 2 8 14 95 0 3 3321 166 3322 3323 2 14 7 0 7 3 166 166 1978 3325 4 3319 3320 3324 3326 5 3277 3301 3316 3327 6 0 3297 3273 3328 2 51 51 7 7 3 166 3286 1984 3330 4 3279 2449 3285 3331 2 19 0 51 0 3 1984 1984 2523 3333 4 3276 2447 2449 3334 2 7 7 88 5 3 181 3281 3336 3287 2 19 25 0 52 3 3338 0 166 166 3 3330 3000 0 0 4 3337 3339 3340 2460 5 3272 3332 3335 3341 2 51 25 0 52 3 1984 1984 3281 3343 2 7 7 25 0 3 3345 166 3000 1984 3 2534 166 1984 2535 4 3344 3340 3346 3347 4 2574 2577 2580 3213 2 7 7 14 96 3 0 2387 2546 3350 3 2535 1984 3144 1978 4 3141 3351 3352 2578 3 2605 1978 2546 2546 4 3214 3354 2578 2578 5 3348 3349 3353 3355 2 7 7 88 51 3 166 3357 1984 3330 2 7 8 0 0 2 5 5 698 2419 3 3282 0 3359 3360 2 7 7 581 0 3 0 0 3362 2517 4 3358 3291 3361 3363 3 166 166 1984 2535 3 0 2387 2546 2546 4 3365 2548 3366 3214 2 0 5 7 52 2 703 22 0 0 3 3368 3369 0 0 2 52 0 8 466 3 3371 1984 2387 2310 3 3359 123 123 123 4 3370 3372 3373 1735 3 2544 2450 2563 1978 3 1984 1984 2310 2563 4 3375 3376 1735 1735 5 3364 3367 3374 3377 4 3213 3213 3214 3214 2 7 7 7 8 3 3013 123 123 3380 2 7 466 7 8 3 123 3382 1730 3223 4 2593 3375 3381 3383 3 2607 2614 3224 2616 4 3222 3171 3385 3226 5 3379 3216 3384 3386 6 3342 3356 3378 3387 7 0 3296 3329 3388 8 0 0 0 3389 4 0 3 3 2477 3 2 2475 2468 2469 4 0 3 3 3392 3 2476 2479 2482 2485 3 2480 2498 2428 2429 4 2473 2484 3394 3395 5 0 3391 3393 3396 3 2 173 3257 2476 4 0 3 3 3398 3 2 2475 173 2469 3 3254 2478 2479 2480 3 2483 2436 2498 2437 4 3400 3394 3401 3402 5 0 2474 3399 3403 2 0 8 0 7 2 7 7 8 51 3 181 3405 3406 3299 4 3402 3285 2505 3407 2 7 7 8 19 3 166 3409 1984 2529 4 3395 2449 2527 3410 3 1984 1984 3405 3282 2 7 51 7 7 2 52 0 7 466 3 3413 3414 0 0 3 3287 166 3414 1984 3 2534 166 2544 2535 4 3412 3415 3416 3417 5 2487 3408 3411 3418 6 0 3397 3404 3419 3 3267 3270 2428 2503 4 3255 3275 3265 3421 5 0 3259 3274 3422 3 2443 2504 2448 1984 2 7 7 22 51 3 166 3425 1984 3413 4 3421 2449 3424 3426 3 2450 1984 2451 3292 4 3276 2447 2494 3428 2 7 7 22 19 3 181 2451 3430 3287 3 3282 0 166 166 3 2458 3414 0 0 3 1984 2544 0 352 4 3431 3432 3433 3434 5 3272 3427 3429 3435 6 0 3278 3423 3436 2 5 397 22 7 2 35 7 52 559 2 52 8 365 5 3 3260 3438 3439 3440 3 3267 2498 2428 2429 4 3255 3441 3265 3442 3 1984 1984 3405 3343 4 2486 2447 2449 3444 2 7 7 22 5 3 181 3405 3446 3287 4 3271 3285 2447 3447 3 166 3409 1984 3413 4 3449 3346 3339 3141 5 3443 3445 3448 3450 2 466 7 8 19 3 181 3405 3452 3287 3 3318 0 166 166 3 3413 3000 0 0 4 3453 3454 3455 2574 4 3141 3366 2577 2578 4 3365 2580 3366 3214 5 3456 3457 3458 3379 3 1984 1984 2451 3333 2 7 51 466 7 3 3461 3000 0 0 3 3299 166 3414 1984 2 466 7 52 0 3 3464 2507 1984 2557 4 3460 3462 3463 3465 3 2517 2549 1984 1984 4 2574 2577 3467 3209 3 0 2387 2549 3350 3 2535 1984 3144 2310 4 2518 3469 3470 3375 4 2590 3354 2592 2593 5 3466 3468 3471 3472 3 1984 1984 2310 1978 3 2549 2560 1984 1984 3 2546 2549 1984 1984 4 2578 3474 3475 3476 3 2549 2606 9 3223 4 2578 2578 3209 3478 4 3214 3214 3375 3222 4 3215 2621 3171 3174 5 3477 3479 3480 3481 6 3451 3459 3473 3482 7 0 3420 3437 3483 4 3392 3394 2481 3402 2 52 7 7 7 3 166 2506 1984 3486 4 3395 2449 2527 3487 2 12 0 51 0 3 2450 1984 2454 3489 4 2486 2505 2494 3490 2 466 7 25 12 3 181 2454 3492 166 2 22 0 51 0 3 3494 0 166 166 4 3493 3495 2573 2460 5 3485 3488 3491 3496 2 88 0 51 0 3 2450 1984 2454 3498 2 52 51 7 7 3 3500 2450 0 0 3 3464 2507 2544 2557 4 3499 3501 2541 3502 3 2517 2553 1984 1984 4 2556 2558 3504 3218 3 0 2387 2595 2586 4 3141 3506 3352 2578 3 2310 2563 2546 2546 3 2605 1978 2560 2552 4 3508 3509 2592 2593 5 3503 3505 3507 3510 2 466 7 8 5 3 166 3512 1984 3413 3 3299 166 3000 1984 3 3333 0 166 2515 4 3513 3514 3515 2518 3 2515 166 1984 2535 3 1978 2309 2552 2553 4 3517 2548 2550 3518 4 2556 2558 3467 3209 5 3516 3519 3520 2568 3 2553 2546 1984 1984 3 1978 1978 2553 2546 4 3218 3522 3214 3523 3 2552 2595 1984 1984 4 3525 3213 3214 3215 3 2546 2610 9 3223 4 2578 3146 2583 3527 3 1984 2611 2599 2600 4 3529 3225 3385 3226 5 3524 3526 3528 3530 6 3497 3511 3521 3531 3 1984 1984 1978 2563 3 2595 3350 2544 1984 4 2564 3533 3534 3213 3 2450 1984 2605 1978 3 2553 2610 2611 3223 4 3536 3217 2583 3537 3 1978 1978 2549 2546 3 2310 2563 2552 2546 3 1984 9 3221 2600 4 3539 3540 2564 3541 3 1978 2599 2610 2607 4 3543 3241 3171 3174 5 3535 3538 3542 3544 4 3541 3225 3385 3226 5 3546 3236 3243 3246 3 2549 2610 2611 2612 4 3548 2617 2621 2625 2 0 1 1 579 3 3194 3198 3550 3199 4 3226 3230 3232 3551 2 5 583 52 395 3 3231 3550 3197 3553 4 3174 3195 3230 3554 2 579 52 583 5 3 3196 3197 3198 3556 3 3553 1718 1721 0 3 3199 1722 1718 0 4 3557 3558 3559 0 5 3549 3552 3555 3560 2 5 583 52 5 3 3231 3550 3197 3562 3 3556 1721 1721 0 4 3563 3237 3564 0 5 3565 0 0 0 6 3545 3547 3561 3566 4 3214 3214 2578 2578 3 2310 2551 2546 2546 3 1984 2598 2118 2618 4 3214 3569 2578 3570 4 3219 2617 2621 2625 5 3568 3571 3216 3572 3 1978 3221 2610 2607 4 3574 3241 3171 3174 4 2625 3232 3195 3557 3 3556 1721 1722 0 4 3554 3559 3577 0 5 3575 3576 3552 3578 3 1984 9 2118 2618 4 3580 3171 3385 3226 4 3551 3577 3558 0 5 3581 3555 3576 3582 5 3560 0 0 0 6 3573 3579 3583 3584 5 3582 0 0 0 6 3586 0 0 0 7 3532 3567 3585 3587 3 181 2451 3430 3345 4 3271 3424 2447 3589 2 7 7 35 5 3 166 3591 1984 3330 4 3279 2449 3285 3592 3 1984 1984 2451 3338 4 3594 3455 3291 3347 5 3277 3590 3593 3595 2 466 7 22 19 3 166 3597 1984 3413 3 3343 0 166 166 4 3598 3514 3599 3141 3 2515 2507 1984 2535 3 2517 2549 1984 2547 3 1978 2309 2546 2546 4 3601 3602 3366 3603 4 2578 2565 3213 2567 5 3600 3604 3349 3605 2 7 7 35 51 3 181 3281 3607 3287 3 3333 0 166 166 2 51 51 466 7 3 3610 3414 0 0 4 3608 3609 3611 2556 4 3141 3366 2558 3375 3 1978 1978 2546 3350 4 3213 3213 3214 3614 5 3612 3613 3458 3615 4 3214 3214 2592 2593 3 1978 2551 2546 2553 2 0 391 466 8 3 1984 3619 2118 2618 4 3214 3618 3375 3620 3 2605 2118 2610 2607 4 3213 3213 3214 3622 5 3617 3621 3623 3572 6 3596 3606 3616 3624 3 2553 2560 1984 2450 3 1978 1978 2560 2546 3 1978 1978 2546 2560 4 3209 3626 3627 3628 3 2552 2549 1984 1984 3 1978 1978 2546 2595 4 3630 2583 3631 3215 3 2546 2606 9 2612 4 3150 2578 2561 3633 3 1984 2611 2118 2618 4 3635 3171 2617 3226 5 3629 3632 3634 3636 4 3478 3385 2621 2625 5 3638 3234 3236 3238 5 3544 3243 3234 3244 2 5 25 52 25 3 3199 3641 1721 203 4 3233 3237 3642 0 3 0 203 0 203 4 3644 0 3644 0 5 3643 0 3645 0 6 3637 3639 3640 3646 3 2546 3350 1984 1984 4 2578 2578 3648 3213 3 1984 1984 2605 1978 4 3650 2578 3213 3219 4 3214 3214 2578 3580 5 3649 3651 3652 3481 4 3580 3171 2617 3226 3 3196 3197 3198 1721 4 2625 3232 3195 3655 2 5 52 52 395 3 3194 3198 1997 3657 2 395 52 397 0 3 3199 3659 1721 0 2 0 497 0 19 2 0 592 0 497 3 1721 3661 0 3662 4 3658 3660 3663 0 5 3654 3236 3656 3664 3 3194 3198 1997 1721 4 3226 3230 3232 3666 3 3231 1997 3197 1721 4 3174 3195 3230 3668 3 1721 0 0 0 4 3655 3670 3670 0 5 3572 3667 3669 3671 2 5 52 52 14 3 3673 2117 203 20 3 2108 28 161 28 4 3668 3674 3670 3675 2 0 19 14 95 2 95 0 19 19 2 95 19 19 19 3 2117 3677 3678 3679 3 92 92 92 92 4 3680 0 3681 0 3 161 28 2112 3679 4 0 3683 0 3681 4 3681 0 3681 0 5 3676 3682 3684 3685 6 3653 3665 3672 3686 5 3238 0 0 0 2 0 12 0 0 3 0 0 3689 108 4 3644 0 3644 3690 2 0 0 1 0 2 0 0 5 14 2 88 7 51 0 3 3692 3693 3694 2962 2 0 0 771 14 3 3696 2117 1978 1978 4 0 0 3695 3697 5 3645 0 3691 3698 2 0 95 0 25 3 3700 0 352 0 2 0 96 0 0 2 0 14 0 96 3 3702 0 3703 0 4 3644 3701 3644 3704 3 352 0 280 0 2 0 14 0 8 3 3707 0 352 0 4 3644 3706 3644 3708 5 3705 0 3709 0 6 3688 3699 0 3710 7 3625 3647 3687 3711 3 3199 1722 1721 0 4 3235 3713 3237 0 5 3714 0 0 0 6 3715 0 0 0 3 2117 2117 1978 1978 4 0 0 3717 3717 5 0 0 3718 3718 3 2117 0 1978 181 4 0 0 3720 0 5 0 0 3721 0 6 3719 3722 0 0 7 3716 0 3723 0 8 3484 3588 3712 3724 3 0 0 6 2117 3 2223 86 515 1978 4 3726 2150 3727 2255 2 96 1 51 51 3 86 227 1978 3729 2 8 7 22 8 3 0 215 3731 181 4 2150 2150 3730 3732 5 0 0 3728 3733 6 0 0 0 3734 3 2 173 173 181 4 0 3 3 3736 3 0 0 3693 2117 2 0 0 14 88 2 0 0 14 1 3 0 0 3739 3740 3 277 215 215 181 4 3738 3741 205 3742 2 52 5 0 19 2 95 5 1 19 2 1 51 0 0 3 3744 3745 46 3746 2 5 0 19 51 2 14 0 95 5 2 1 5 0 0 2 1 19 0 19 3 3748 3749 3750 3751 4 3736 205 3747 3752 5 0 3737 3743 3753 3 181 3262 0 0 2 8 0 19 5 3 0 215 215 3756 4 3736 3755 205 3757 3 2443 2446 3693 2117 2 0 0 14 35 2 5 14 35 0 3 166 166 3760 3761 4 3279 2494 3759 3762 3 0 215 215 181 2 0 22 0 19 3 181 3765 344 885 2 19 0 52 8 2 0 0 88 35 2 35 25 19 0 3 3767 3768 0 3769 2 25 7 52 0 3 3771 242 1730 0 4 3764 3766 3770 3772 2 52 0 5 19 2 22 52 0 14 2 51 1 14 14 3 3774 1767 3775 3776 2 5 35 52 52 2 96 0 8 1 3 3778 3779 2117 1984 3 2387 310 0 108 2 5 14 25 0 3 3782 1984 0 0 4 3777 3780 3781 3783 5 3758 3763 3773 3784 6 0 3278 3754 3785 3 6 1984 28 2096 3 28 2096 6 123 4 3787 2983 3788 1735 3 1984 1984 123 3380 2 0 19 7 52 3 3791 0 166 166 2 7 52 7 7 2 7 8 7 52 3 123 3793 123 3794 2 95 14 88 14 2 52 25 52 25 3 3796 3761 0 3797 4 3790 3792 3795 3798 2 7 7 5 7 3 0 3800 0 277 3 123 123 166 166 4 3801 3802 0 0 3 123 3794 166 3359 3 0 1325 1397 2248 3 180 0 180 222 4 3804 3805 0 3806 5 3789 3799 3803 3807 2 0 19 0 96 3 180 28 1730 3809 2 8 19 0 52 3 0 3811 0 0 4 0 3810 0 3812 5 0 3813 0 0 6 0 3808 0 3814 2 0 0 5 88 2 7 8 5 8 2 52 7 14 0 3 0 3816 3817 3818 2 19 0 1 95 2 88 52 88 0 2 0 25 0 96 2 88 7 95 0 3 3820 3821 3822 3823 2 52 0 0 14 2 0 8 14 14 2 19 0 19 51 3 3825 3826 3827 2251 2 95 95 51 88 3 3122 2117 3829 86 4 3819 3824 3828 3830 2 88 95 88 95 2 52 51 0 0 3 3832 3832 3833 3833 2 1 95 25 25 2 88 51 88 95 2 51 51 0 0 3 3835 3836 3837 2054 2 95 0 96 14 2 19 0 52 0 3 2117 321 3839 3840 4 3834 3838 3841 0 2 96 95 19 14 2 0 1 14 8 2 0 5 0 51 3 3843 3844 2445 3845 2 5 95 25 51 2 22 7 14 14 2 88 5 52 5 3 344 3847 3848 3849 2 8 0 5 7 2 35 5 8 19 2 7 7 0 19 3 3851 1984 3852 3853 2 95 51 0 14 3 3128 242 3855 2314 4 3846 3850 3854 3856 2 35 5 25 25 2 88 35 35 25 3 349 0 3858 3859 3 0 0 3322 321 2 96 95 51 14 2 51 95 14 1 3 3862 3863 0 0 2 19 51 22 7 2 51 96 22 51 2 51 14 0 5 3 3865 3866 0 3867 4 3860 3861 3864 3868 5 3831 3842 3857 3869 2 96 22 19 96 2 1 96 0 19 3 3871 3872 203 0 2 22 1 96 0 3 3874 0 2962 1978 2 0 0 8 14 3 203 0 515 3876 3 2096 123 2117 2117 4 3873 3875 3877 3878 2 14 95 0 1 2 5 0 5 95 3 0 0 3880 3881 2 0 0 0 395 3 0 3883 0 2743 2 5 5 22 8 2 0 0 96 1 3 2529 3885 2117 3886 2 14 14 95 0 2 1 8 0 51 3 3888 1978 3889 321 4 3882 3884 3887 3890 2 0 8 51 19 3 6 2117 3892 0 2 95 1 51 95 2 7 8 0 22 2 35 35 35 96 3 3894 3895 3896 1774 2 7 22 52 0 2 52 0 7 0 2 7 7 0 51 3 3898 3899 3900 166 4 0 3893 3897 3901 2 51 19 14 52 3 2117 3903 0 0 2 14 35 0 0 3 0 6 2962 3905 3 2117 2117 1978 2118 4 3904 2383 3906 3907 5 3879 3891 3902 3908 2 25 25 0 25 3 161 2052 1676 3910 2 19 5 19 0 2 35 0 25 51 2 88 22 0 22 3 3912 3913 2067 3914 2 0 1 0 51 2 7 7 8 7 3 539 3413 3916 3917 2 7 52 8 5 2 7 52 466 7 3 3919 3920 490 3087 4 3911 3915 3918 3921 2 630 7 88 0 2 1 8 51 95 2 19 5 52 22 2 14 2006 19 52 3 3923 3924 3925 3926 2 5 22 1506 14 2 8 5 14 22 3 236 1983 3928 3929 2 0 51 7 466 2 88 19 0 0 3 3931 3932 3108 3092 2 402 0 7 419 2 19 0 5 7 2 19 51 52 0 3 3934 3935 3793 3936 4 3927 3930 3933 3937 2 22 52 51 14 3 0 3939 0 0 3 1476 0 0 0 4 3940 3941 0 0 2 1 7 51 7 3 0 0 3943 123 3 2084 1984 185 166 4 0 3944 0 3945 5 3922 3938 3942 3946 2 52 8 95 0 2 1 7 8 35 2 51 95 8 52 2 0 8 5 52 3 3948 3949 3950 3951 2 7 7 95 95 2 1 88 0 0 3 3953 166 3954 3800 2 95 25 88 22 2 0 7 5 7 2 88 88 0 51 3 3956 3957 3958 3840 3 123 3204 0 0 4 3952 3955 3959 3960 3 166 166 123 123 2 95 5 0 19 3 166 3359 123 3963 2 0 88 0 25 3 0 0 3965 166 3 6 2215 242 0 4 3962 3964 3966 3967 3 0 181 123 123 4 3969 1679 2089 2089 2 7 0 7 14 3 203 6 3971 1721 2 7 7 88 7 3 1726 1978 1765 3973 2 7 95 0 25 3 3130 0 3975 0 2 8 14 5 14 2 25 0 8 14 3 203 3977 203 3978 4 3972 3974 3976 3979 5 3961 3968 3970 3980 6 3870 3909 3947 3981 7 3735 3786 3815 3982 2 7 0 0 1 2 95 88 0 52 3 2429 3984 3985 1391 2 0 51 7 7 3 1984 3987 0 0 4 3276 3986 2449 3988 2 433 5 436 52 2 14 7 0 1 3 2443 2446 3990 3991 2 52 1 0 340 2 7 88 679 51 2 7 96 0 51 2 7 25 22 52 3 3993 3994 3995 3996 4 3271 3992 2505 3997 2 7 7 0 5 2 7 52 95 19 3 166 3999 123 4000 2 5 7 7 25 3 123 124 4002 111 2 8 35 52 52 2 51 22 419 395 2 364 679 51 52 2 14 703 14 14 3 4004 4005 4006 4007 2 22 52 5 8 2 0 51 5 88 2 52 5 14 52 2 52 7 0 19 3 4009 4010 4011 4012 4 4001 4003 4008 4013 5 3280 3989 3998 4014 2 25 579 19 7 2 96 95 51 51 2 22 52 52 7 3 2012 4016 4017 4018 2 697 51 96 14 2 1 52 14 7 2 51 0 812 770 2 0 487 7 51 3 4020 4021 4022 4023 2 88 19 51 0 3 123 123 0 4025 3 123 3380 1476 108 4 4019 4024 4026 4027 2 51 1 8 1 2 697 0 52 19 3 3413 4029 4030 2257 2 95 7 51 7 3 190 3987 4032 123 4 4031 1735 4033 1735 3 166 166 3880 2535 2 8 5 1 51 3 4036 2546 539 1984 2 1 0 22 0 2 88 5 51 52 3 4038 2387 4039 2546 4 4035 4037 4040 3214 3 1978 1978 2546 2552 4 3213 3213 4042 3523 5 4028 4034 4041 4043 2 14 5 5 22 2 419 0 52 0 3 2450 4045 3916 4046 2 0 7 7 7 2 0 5 0 25 3 1984 4048 0 4049 2 7 436 0 8 2 14 14 0 14 3 4051 3287 4052 1659 2 8 630 0 0 3 2534 4054 0 0 4 4047 4050 4053 4055 2 814 558 433 51 2 8 0 7 96 3 123 1984 4057 4058 2 51 14 14 5 3 2535 1984 4060 3888 2 460 8 0 22 2 7 51 52 811 2 0 25 51 88 2 88 1503 0 2917 3 4062 4063 4064 4065 2 0 25 95 51 2 51 7 8 0 2 88 812 52 1 2 583 0 7 7 3 4067 4068 4069 4070 4 4059 4061 4066 4071 2 96 0 8 0 2 0 8 7 22 3 1424 4073 1984 4074 3 1896 1984 161 0 2 0 5 7 22 2 5 1 8 96 3 4077 4078 0 108 3 349 0 0 0 4 4075 4076 4079 4080 2 5 52 25 0 3 386 0 4082 0 2 360 0 0 0 3 4084 0 0 0 2 25 0 25 52 2 5 14 8 14 3 4086 4087 3138 62 2 771 14 14 14 3 4089 86 0 0 4 4083 4085 4088 4090 5 4056 4072 4081 4091 3 123 1984 1978 1978 2 7 7 5 562 2 25 0 0 0 3 4094 3350 4095 0 3 2546 2546 0 0 4 4093 2578 4096 4097 2 5 96 0 51 3 2546 2610 0 4099 4 2578 2578 4097 4100 3 86 86 0 0 4 0 0 4102 4102 3 86 86 2117 2117 4 0 0 4104 4104 5 4098 4101 4103 4105 6 4015 4044 4092 4106 3 3047 123 2095 2980 3 123 123 123 2095 2 8 5 96 1 3 123 3380 3092 4110 4 4108 4109 1735 4111 3 2310 1978 2546 2546 4 3213 3213 4113 3215 5 3012 4112 4114 3572 2 7 95 7 5 2 7 7 425 8 3 123 4116 4117 2607 3 4110 2619 2614 2620 2 0 96 5 51 3 4120 2615 2619 2622 4 4118 4119 4121 3174 4 3668 3670 3670 0 5 4122 3656 3667 4123 2 52 88 1 0 2 5 0 25 25 3 3231 1466 4125 4126 4 3174 3195 3230 4127 3 0 2623 108 0 3 86 227 2117 150 2 52 88 1 95 2 22 52 0 8 3 185 4131 0 4132 4 4129 3232 4130 4133 2 52 1 88 0 2 5 0 52 25 3 3194 4135 1997 4136 2 25 25 8 51 3 6 4138 108 1496 2 5 52 25 5 2 19 22 22 96 2 25 51 52 0 3 4140 4141 4142 310 2 0 19 8 22 2 19 0 88 25 3 4144 220 4145 1466 4 4137 4139 4143 4146 5 3654 4128 4134 4147 3 28 0 28 0 4 3655 3670 4149 0 2 0 19 8 19 3 4151 0 92 0 2 19 19 0 52 3 4153 0 0 0 4 4152 0 4154 0 5 4150 0 4155 0 6 4115 4124 4148 4156 3 486 0 206 0 3 1978 1978 0 0 4 4158 0 4159 4159 3 885 181 46 62 3 2394 515 0 1730 3 62 0 515 62 4 4161 0 4162 4163 3 1984 9 0 435 2 5 0 22 7 2 1 0 88 0 3 4166 1984 4167 0 3 2117 2117 86 86 3 1476 0 86 86 4 4165 4168 4169 4170 3 1984 321 0 1730 3 1730 515 0 1730 2 14 95 14 1 3 0 0 86 4174 3 133 28 161 28 4 4172 4173 4175 4176 5 4160 4164 4171 4177 2 51 14 0 14 3 0 2111 0 4179 2 0 51 14 14 3 2117 4181 86 86 3 0 2387 0 2 3 1978 1978 1984 1984 4 4180 4182 4183 4184 3 86 86 86 4174 2 35 7 52 7 2 1 7 88 95 3 4187 4188 1984 3130 4 4186 4102 4184 4189 2 0 8 0 19 3 62 203 4191 203 3 3943 123 3943 123 3 28 1391 28 1391 4 4192 4193 4194 1735 2 7 5 7 22 2 5 95 8 96 3 124 166 4196 4197 2 7 95 7 0 3 4199 435 4199 0 4 1735 4198 1735 4200 5 4185 4190 4195 4201 2 22 8 0 0 2 14 0 0 25 3 62 0 4203 4204 3 3368 2012 0 6 3 6 1721 1721 0 4 4205 1012 4206 4207 2 5 7 52 0 3 0 0 4209 166 3 161 28 2445 46 3 0 0 0 215 4 4210 4211 0 4212 2 14 52 14 14 3 4052 4214 2529 1984 3 2117 1466 1984 1984 4 4215 4216 4104 4104 3 166 166 1984 1669 3 166 181 1978 1978 2 14 0 14 52 3 86 4220 2117 150 4 4218 4219 4221 0 5 4208 4213 4217 4222 2 0 51 95 0 3 3126 4224 236 161 2 88 22 22 22 3 4226 3000 181 0 2 0 0 7 14 3 4228 150 0 277 4 4225 2264 4227 4229 2 7 95 0 19 3 4231 0 28 0 2 7 95 0 51 3 0 0 4233 321 4 2264 4232 4234 4149 2 95 0 51 7 3 4236 1984 0 0 4 2121 0 2959 4237 2 35 0 0 22 3 0 4239 0 46 2 0 0 22 0 3 108 310 4241 108 2 35 95 0 25 3 3128 0 108 4243 3 138 0 1983 1984 4 4240 4242 4244 4245 5 4230 4235 4238 4246 6 4178 4202 4223 4247 2 95 8 1 0 3 2251 4249 1466 0 2 0 0 96 8 3 3876 4251 0 509 3 0 1466 1466 2243 4 4250 4252 0 4253 2 0 14 1 0 2 0 14 0 35 3 4255 3122 1466 4256 2 35 88 14 14 2 0 95 52 25 3 4258 86 4259 3097 2 0 35 0 0 2 7 19 52 19 2 8 19 8 19 3 0 4261 4262 4263 2 52 8 0 0 2 52 14 0 0 2 8 5 8 19 2 8 19 19 19 3 4265 4266 4267 4268 4 4257 4260 4264 4269 2 7 1 1 14 2 14 1 95 0 3 166 4271 4272 3693 2 51 14 14 14 3 321 2029 4274 4214 2 25 5 25 8 2 35 0 35 14 3 161 4276 217 4277 2 14 14 14 0 2 5 52 1 95 2 0 0 95 19 3 4279 3885 4280 4281 4 4273 4275 4278 4282 3 166 277 2117 2117 3 2188 230 0 352 2 0 0 35 1 3 86 4286 2394 1476 3 4095 0 0 0 4 4284 4285 4287 4288 5 4254 4270 4283 4289 3 86 86 1338 0 2 8 0 8 0 3 181 0 4292 0 4 4291 4102 4293 0 3 86 4220 0 0 4 4295 0 0 0 2 51 0 0 0 3 4297 268 3883 486 3 2096 2268 0 0 3 2743 206 0 0 3 0 0 0 2111 4 4298 4299 4300 4301 3 123 123 0 2111 2 0 0 14 7 3 123 123 4304 1984 2 19 0 51 14 3 0 4306 2117 2117 2 0 579 14 0 2 770 95 7 0 2 0 25 1 0 3 4308 4309 4310 0 4 4303 4305 4307 4311 5 4294 4296 4302 4312 2 25 7 51 95 3 4314 181 108 2222 2 88 22 14 1 2 0 51 8 0 3 2370 4316 1984 4317 2 0 96 0 1 2 95 1 95 25 2 25 19 25 19 3 4319 4320 203 4321 2 7 8 0 25 2 0 8 5 95 2 19 0 406 0 2 25 96 25 19 3 4323 4324 4325 4326 4 4315 4318 4322 4327 2 52 96 0 96 2 95 96 19 19 2 7 5 0 0 2 35 0 8 14 3 4329 4330 4331 4332 2 22 95 96 51 2 0 0 8 35 2 8 0 14 7 2 25 52 88 7 3 4334 4335 4336 4337 2 95 5 0 22 2 7 8 52 0 3 1397 0 4339 4340 2 7 95 8 51 2 0 0 95 95 3 0 0 4342 4343 4 4333 4338 4341 4344 2 0 25 5 35 2 25 19 51 52 2 95 25 51 51 3 4346 4347 4348 123 2 19 19 19 0 2 51 22 7 433 2 452 51 95 1 3 4350 4351 3486 4352 3 0 2096 1984 4224 2 7 7 1 8 2 88 19 8 1 3 4355 3987 4356 0 4 4349 4353 4354 4357 2 7 25 51 88 2 25 14 51 25 2 0 22 7 52 3 4359 4360 2529 4361 2 95 25 88 5 2 1 88 35 14 2 52 25 0 51 2 52 0 812 391 3 4363 4364 4365 4366 3 123 123 2250 86 3 123 2529 86 86 4 4362 4367 4368 4369 5 4328 4345 4358 4370 2 8 35 25 52 2 5 7 8 0 3 0 0 4372 4373 2 51 95 52 25 2 7 88 0 51 3 0 4375 166 4376 2 8 96 0 96 2 96 95 14 25 2 51 14 0 51 3 4378 4379 2248 4380 2 7 7 96 14 2 7 7 5 0 3 227 1490 4382 4383 4 4374 4377 4381 4384 2 5 0 52 0 3 1490 0 4386 0 3 227 1490 0 0 4 4387 4388 2457 2457 2 95 95 1 88 2 8 0 1 0 2 25 5 1 22 2 19 0 7 25 3 4390 4391 4392 4393 2 51 14 1 0 2 22 7 0 0 2 51 7 1 7 3 4395 4396 4397 123 2 25 22 0 0 2 14 96 14 14 3 4399 2443 86 4400 2 25 1 0 8 3 4402 2546 86 86 4 4394 4398 4401 4403 2 7 7 1 7 3 4405 123 421 4405 2 7 8 8 0 3 123 3794 123 4407 2 52 19 14 52 2 5 7 19 0 2 1 0 0 19 3 4409 4410 86 4411 3 166 2445 86 86 4 4406 4408 4412 4413 5 4385 4389 4404 4414 6 4290 4313 4371 4415 7 4107 4157 4248 4416 2 0 5 0 8 3 0 0 0 4418 4 0 4419 0 0 3 0 0 86 86 3 0 0 86 1131 3 0 244 0 0 4 4421 4422 0 4423 5 0 0 4420 4424 6 0 4425 0 0 4 0 0 3 2086 2 0 14 7 25 2 95 0 88 1 3 0 108 4428 4429 2 14 95 25 88 3 166 166 2535 4431 2 52 471 590 19 3 3765 4433 0 3260 2 22 52 19 19 2 406 0 19 0 3 347 4435 4436 2188 4 4430 4432 4434 4437 2 0 0 1 8 3 166 166 4439 4428 2 0 95 8 7 3 166 166 4429 4441 2 25 22 19 19 2 52 22 0 19 2 1 19 25 19 3 4443 4444 4445 0 2 52 25 19 19 3 4447 347 3260 161 4 4440 4442 4446 4448 5 4427 3153 4438 4449 3 203 0 203 0 3 203 3782 203 180 3 203 0 3130 0 2 25 0 51 7 3 203 180 203 4454 4 4451 4452 4453 4455 3 166 166 4431 4439 3 166 166 4428 4429 3 4435 4443 2188 4445 3 4444 4447 0 3260 4 4457 4458 4459 4460 2 0 25 8 7 2 14 433 25 436 3 3975 0 4462 4463 2 1 7 25 0 2 0 0 364 679 2 25 14 7 25 3 1725 4465 4466 4467 3 347 4435 161 2188 2 25 698 19 19 2 397 22 0 19 2 630 19 25 19 3 4470 4471 4472 0 4 4464 4468 4469 4473 5 3153 4456 4461 4474 4 2294 205 0 0 3 509 0 0 0 3 108 181 0 0 4 4477 4478 0 0 5 4476 4479 0 0 3 0 509 0 0 4 4481 2294 0 0 4 205 4477 0 0 5 4482 4483 0 0 6 4450 4475 4480 4484 7 4426 4485 0 0 4 4159 4159 2086 2086 3 1978 2012 0 0 4 4488 0 2086 2086 3 166 166 4429 2535 4 4490 4457 4448 4459 4 4458 4432 4460 4469 5 4487 4489 4491 4492 4 0 0 2086 533 3 0 4261 0 0 2 14 14 0 19 3 4496 0 46 1397 3 0 185 0 0 4 4495 4497 0 4498 2 0 0 1 52 3 166 166 4500 0 2 25 52 19 0 3 4502 0 4445 0 4 4501 0 4503 0 5 4494 4499 4504 0 4 4478 4481 0 0 5 4506 4476 0 0 4 4477 0 0 0 5 4508 0 0 0 6 4493 4505 4507 4509 3 0 1730 0 108 3 0 2 1978 206 4 4511 4512 2264 2264 3 236 3693 4226 3000 3 2117 2117 1984 1669 4 4514 4515 205 0 5 4513 4516 0 0 2 0 14 14 14 3 2117 4518 1978 1978 4 4519 2255 0 0 3 86 2129 1978 1978 4 4521 2255 0 0 5 4520 4522 0 0 6 4517 4523 0 0 7 4510 4524 0 0 8 3983 4417 4486 4525 4 3666 3670 3670 0 5 4527 0 0 0 4 0 3681 0 3681 5 4529 3685 4529 3685 2 19 19 19 589 3 92 92 4531 92 3 2352 92 1122 92 4 4532 0 4533 0 3 4531 92 2352 92 3 1122 92 4531 92 4 4535 0 4536 0 5 4529 4534 4529 4537 6 4528 4530 0 4538 2 0 14 0 19 3 3689 0 4540 0 3 2111 0 3689 0 4 3644 4541 3644 4542 2 0 14 0 22 3 4544 0 352 0 2 0 25 0 0 2 12 0 0 0 3 4546 4547 3700 194 4 3644 4545 3644 4548 5 4543 0 4549 0 2 96 0 0 0 3 352 321 4546 4551 2 14 0 96 0 3 3700 4553 352 321 4 3644 4552 3644 4554 2 22 0 0 0 2 14 0 8 0 3 4546 4556 3700 4557 3 0 203 2 206 4 3644 4558 4559 0 5 4555 0 4560 0 6 0 4550 0 4561 3 123 123 3128 0 3 1983 2117 0 0 3 321 0 1671 4255 4 4563 541 4564 4565 3 3204 0 0 0 3 0 0 4236 1984 3 0 0 4052 86 4 541 4567 4568 4569 5 0 0 4566 4570 4 4533 0 4535 0 3 0 0 86 3122 2 19 19 1 19 2 0 19 14 52 3 4574 92 4575 92 4 0 3681 4573 4576 2 2006 589 19 590 2 19 19 2006 589 3 4578 4153 4579 0 3 2352 0 4578 0 4 4580 0 4581 0 5 4529 4572 4577 4582 4 0 0 4234 0 3 227 0 0 4049 2 1 0 25 0 3 4586 0 181 0 2 0 0 19 7 2 5 25 52 0 3 4588 4589 161 0 4 4585 4587 4590 0 2 88 14 0 0 2 0 25 25 1 3 1765 4592 4593 1669 2 1 0 5 7 3 2314 0 4595 1984 2 1 19 95 19 3 195 4049 4597 161 4 4594 4596 4598 205 2 19 0 7 0 3 161 0 4600 0 4 4601 0 0 0 5 4584 4591 4599 4602 3 0 92 0 2188 4 0 2110 0 4604 2 19 19 340 425 3 4606 0 0 0 3 0 2 2 206 3 0 2 166 2445 4 4607 4608 4609 1962 5 4605 4610 0 0 6 4571 4583 4603 4611 4 0 4608 4608 1962 4 1962 0 0 0 5 0 4613 4613 4614 5 4614 0 0 0 6 4615 4616 4616 0 7 4539 4562 4612 4617 2 1 19 14 52 3 4619 161 1978 181 4 4620 0 0 0 5 4621 0 0 0 6 4622 0 0 0 7 4623 0 0 0 8 4618 0 4624 0 9 3390 3725 4526 4625 6 3688 0 0 0 7 4627 0 0 0 8 4628 0 0 0 9 4629 0 0 0 10 2631 3253 4626 4630 11 0 0 0 4631 golly-2.5-src/Patterns/WireWorld/unary-multiplier.mcl0000644000175100001440000003344512156145314017761 00000000000000#MCell 4.20 #GAME Rules table #GOLLY WireWorld #RULE 1,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,3,3,3,3,3,3,3,3,3, #RULE 0,3,1,1,3,3,3,3,3,3 #BOARD 200x200 #WRAP 0 #CCOLORS 4 #PALETTE 2_2_1 #D #D A Unary Multiplier Wrapped in a Turing Machine Inside WireWorld #D by Nyles Heise, March 12, 2004 #D nylesheise@yahoo.com #D #D First of all, my thanks to #D #D A.K.Dewdney for introducing me to WireWorld with his Scientific American #D article in 1990 and for writing "The New Turing Omnibus", #D from which I took many ideas for the design. #D #D Karl Scherer for his great work in WireWorld design. Karl's web site #D (http://karl.kiwi.gen.nz) has a voluminous amount of devices #D from basic elements to complex multipliers. Some of these #D devices have been used here. Karl and I have also recently #D cooperated is coming up with some more-compact versions of #D the 4-cycle logic I devised in 1990. The free game page, #D (http://www.zillions-of-games.com/games/index.html), to the #D Zillions of Games (http://www.zillions-of-games.com/) #D contains a downloadable, operational file that allows you #D to watch WireWorld in aciton. #D #D This is a WireWorld implementation of a Turing Machine, M, that multiplies two #D unary numbers. I set out to do the exact multipler found in Mr. Dewdney's #D "The New Turing Omnibus", however, backed off to a design the requirs less #D logic. The design I came up with takes 9 States, plus halt, but only #D 2 Symbols. It is basically a nested pair of move loops, as found in the #D Turing_Machine download to Zillions. #D (http://www.zillions-of-games.com/games/index.html) #D #D The logic is set up to do the multiply 5 * 4 = 20. The Turing #D algorithm that's implemented starts with the first number, a "Blank", the second #D number and finally another "Blank". The blanks extend to infinity in both #D directions. #D #D ... B B 1 1 1 1 1 B 1 1 1 1 B B ... #D #D After the machine halts, the tape contains the product along with the initial #D numbers and blanks for demarcation. #D #D ... B B 1 1 1 1 1 B 1 1 1 1 B 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 B B ... #D #D Strictly speaking, the output of M should be only the number 20, however, I've #D chosen to leave the input numbers as well since this eased the design of the #D control mechanism logic. #D #D #D -----Quintuple notation #D #D I'm using the quintuple notation to describe the Turing Machine program as #D found on page 207 and following in "The New Turing Omnibus" by A. K. Dewdney. Each #D quintuple gives the next state, new symbol to be written, and tape direction #D as a function of the present state and the symbol on the tape at the location #D of the Read/Write Head. Let Q be the state and S be the symbol. Then each #D quintile is of the form #D #D {present Q, present S, next Q, next S, direction} #D #D The state comes from the following set #D #D PO Pick up the UIT, outer loop #D PI Pick up the UIT, inner loop #D CO Carry the UIT, outer loop #D CI Carry the UIT, inner loop #D CIT Carry the UIT, inner loop, about to write a 1 #D LO Move to the left, outer loop #D LOT Move to the left, outer loop, about to go right #D LI Move to the left, inner loop #D LIT Move to the left, inner loop, about to go right #D #D The symbol comes from the alphabet #D #D B Blank #D 1 A UIT #D #D The tape motion comes from the set #D #D Left #D Right #D Stop #D #D #D -----Unary Multiplier Quintuple Specification #D #D Only quintuples that change state or write to the tape are listed. #D #D PO 1 C0 B Right #D CO B PI B Right #D PI 1 CI B Right #D CI B CIT B Right #D CIT B LI 1 Left #D LI B LIT B Left #D LIT B PI 1 Right #D PI B LO B Left #D LO B LOT B Left #D LOT B PO 1 Right #D PO B Halt #D #D #D -----Description of the Control Mechanism #D #D The control mechanism contains the random logic to generate the next state for #D Q and S. It is essentially a clocked, sequential state machine with 5 latches, #D 4 for Q and 1 for S. The latches for Q and S are found within the control #D mechanism. There are 9 states (plus halt), that are represented by 4 latches, #D L, I, T, and P. #D #D PO L=0 I=0 T=0 P=1 #D CO L=0 I=0 T=0 P=0 #D PI L=0 I=1 T=0 P=1 #D CI L=0 I=1 T=0 P=0 #D CIT L=0 I=1 T=1 P=0 #D LO L=1 I=0 T=0 P=0 #D LOT L=1 I=0 T=1 P=0 #D LI L=1 I=1 T=0 P=0 #D LIT L=1 I=1 T=1 P=0 #D #D There are 2 symbols that are represented by a single latch, S. #D #D B S=0 #D 1 S=1 #D #D #D -----Random Logic Equations #D #D Triggered latches are used for Q. A triggered latch has one input. The latch #D keeps its value if the input is 0. It is flipped if the input is 1. #D #D L_trigger = (~S) ^ (P + T) #D I_trigger = (~S) ^ ( P + ~(L + I) ) #D T_trigger = (~S) ^ ( (P ^ ~I) + ~( P + ~(L + I) ) #D P_trigger = P + (~S) ^ ( (L ^ T) + ~(L + I) ) #D #D A clocked D latch is used for S. #D #D S_next = T + S ^ ~P #D #D #D -----Machine Advancement #D #D The tape is simulated as a loop with electrons passing around the control #D mechanism. This is basically the concept developed by Karl Scherer which he #D used to design his very ingenious binary multiplier. #D There are only two symbols, B and 1, so each symbol on the tape #D requires only one WireWorld bit, however, the location of the R/W head must #D be maintained. This is accomplished by having a clock position for each #D tape location. A second WireWorld bit is used for this purpose. Since the #D implementation uses 4-tick logic, each tape location can be represented with #D 8 WireWorld cells. Identically one clock is present on the tape when it #D leaves the control mechanism. #D #D As the tape passes the control mechanism the clock and symbol under the R/W #D head are removed and a new clock inserted in anticipation for a right move. #D The new values for Q are clocked into the latches. If a left move is indicated #D the clock is inserted onto the tape and the previously inserted clock removed. #D The new symbol in written on the tape. And finally the symbol under the moved #d R/W head is written. #D #D #D -----Description of the WireWorld Layout #D #D The control mechanism contains the State Q latches, the S latch, and the random #D logic to generate the next states for Q and S. It modifies the clock and data at #D the appropriate places on the tape. #D #D The tape is simulated as a loop that continually moves around the control #D mechanism. The Turing tape extends to infinity in both, but it is truncated #D here to 320 cells. This is the minimum length possible with the present #D implementation. This equates to 40 tape locations. #D #D The minimum length required to do a multiply is 8 times the sum of the two numbers #D + the product + 3. 5 times 4 could be done with 256 WireWorld cells. Larger #D multiplies can be done by merely extending the loop after it leaves the control #D mechanism by 8 cells per tape location. #D #D The portion of the logic at the very bottom is not actually required to do the #D multiply, but included to aid in viewing. The two numbers and the clock are #D loaded into the multiplier from this extension during the first few cycles of #D operation. After 640 ticks the tape returns with the first Turing step taken. #D The viewing data is then blocked from reentering the machine. #D #D The entire multiply takes 606 advancements of the tape. Including the first 320 #D ticks for loading, this is a total of 194240 ticks. #D #D The control logic detects when the operation is complete and simply removes the #D clock from the tape. With no clock, the tape continues to move without future #D modification. #D #D #D -----Description of the WireWorld devices #D #D The design uses 4-tick devices - ORs, ANDs, LATCHES, etc. 4-tick logic was my #D invention in 1990, at which time I devised the method that allows data to be #D spaced at a distance of 4 cells. Recently several better configurations of some #D of these devices have been laid out by myself and Karl Scherer. #D #D I use a clocked, vectored approach for storing and moving data. The 4 Q latches #D are contained in one 16-cell latch. The data leaving the latches have 4 phases, #D repeating every 16 ticks. The Q latch contains L, I, T, and P. #D #D Q = {L: I: T: P}. #D #D The S latch contain only one bit and is 4 cells in length. #D #D S = {S} #D #D The tape contains a symbol and a clock, 8 cells per tape location. The symbol #D comes first. #D #D Tape = {S: Clock} #D #D The vectored approach enables the logic to be implemented more easily than the #D one-bit-per-latch method. Normal crossing of wires in not required. As a matter #D of fact, there are no 3-XOR cross devices in the design. #D #D #D -----Viewing tips #D #D Non-functional extensions have been appended to the shift register latches for #D easier viewing. The period of the machine is 320. I believe the following #D settings provide best viewing #D #D CTRL g Grid off #D ALT CTRL c Black background (color 0), white electron head (color 1), #D dark blue electron tail and wire (colors 2 and 3) #D The .mcl file sets the 2_2_1 Palette, the closest I could find. #D ALT CTRL n Run for 194240 cycles #D Redraw the universe every 320 cycles #D n Runs to completion #D #D #D -----Enjoy #D #L 31.C.C.C..C..C..CC..C.C3.C3.C.C.C.C3.3C.3C.CC..C3.3C.3C.CC$31.C.C.CC.C #L .C.C.C.C.C.C3.CC.CC.C.C.C4.C3.C..C.C.C4.C..C3.C.C$31.C.C.C.CC.3C.CC3.C #L 4.C.C.C.C.C.C4.C3.C..CC..C4.C..CC..CC$31.C.C.C..C.C.C.C.C..C4.C3.C.C.C #L .C4.C3.C..C3.C4.C..C3.C.C$32.C..C..C.C.C.C.C..C4.C3.C..C..3C..C..3C.C #L 3.3C.3C.3C.C.C5$..11C3.92C3.3C.3C3.6C$.C11.C.C92.C.C3.C3.C.C6.C$C6.3C. #L C.4C16.C5.59C7.CC..3C.3C..C.C6.C$C..B..A3.BCC..C..CC.C.C5.C..A.C.A.C #L 59.C5.C..C..C3.C3.C.C6.C$C.C.A..BCA.C.C..CC..3C.C3.C.C..B.BAC3.3C.7C. #L 3C.12C.4C.CC.10C5.BC3.C.C.4C.C3.3C5.C7.C$C..C9.CC4.C.C..C..C..C..A..A #L 3.C3.C7.C3.C12.C4.C..C10.C3.A..A3.3C..C..C6.C3.3C..CC..C$C..C.C..5C..C #L .CC4.3C.C..C.5C..C5.C6.C.C.C5.A6.C.C..C..C4.CC.B..C.C.C..B..C.C..4C8.C #L 3.C..C..B.C$C3.4C8.C..C3.C.4C.C..C.C..C3.C..C7.3C5.C.B..C3.6C.C3.CC.A. #L C..3C3.C.C4.CC.A.C8.C3.CCA..A.C$C4.C.C.4C..3C.C..C.BC.C..C..C.C.C3.A.C #L .C8.C6.C.C.C.C.C.C..A3.3C.4C..C.C.C..C.C3.C.CC.B..7C7.BC..C$C3.C3.C4.C #L ..C..C3.A4.CC3.C.C.C3.B.B.C.C5.3C5.B.C.C.C.C3.C.B.C5.C3.C4.B..A.C3.C6. #L C8.5C..B..C$C..C7.C..CC..C10.C.CC3.CC.C.C.A..CCA.A..C.CC4.A.C.C.C.C3.B #L .C.C.C3.C..3C3.A..B.C..3C5.3C.CC.CC5.C..A.C$C.3C..C..C.C4.3C..ABCCA3.C #L ..C.C..CCA..C.C.C.B.C..AC.C.C.C.A.C.C.C3.A.C..7C..C.C3.CC..C.C.C.C3.C #L 3.C..C3.C3.C..C.C$C..C..C.C.C.C.C.CA.A.C5.B.3C.C.C.C.C.B.C.C3.C.C.B.C #L ..3C..B.A.C.C3.C.A.C.C3.B..C..C7.C.C4.C..C.C.C.3C.C.A3.C.C.C$C.C.C.C.C #L .C..3C.AB..B5.C..A..C.B.C3.C.C.C3.C.B..C..C.C.B.C.B.C.C3.C.B.C4.C.A.C #L 3.7C..C3.C.C..3C3.C3.BA.C.C.C.C$C.C.C.C.C.C.C.C..A.C.A5.CCB4.A3.C..C.B #L .C3.A.A5.C4.A..C.C.C3.C.C.C4.C.C.C12.C3.C.C3.C..CC3.A.A3C..C.C$C.C.C.C #L .C.C.C5.C3.3CBA4.3C5.C..A3.C.B..C4.C9.C..C3.B.C.C4.C.C.C..A10.3C3.3C.. #L C5.3C.C.C.C.C$.C..C.C.C.C.C..CC3.C5.A3.C..C.C.B..C5.C.C.B..CC.C10.C.C #L 4.A..C4.A.B.C.C.B19.C7.C4.C.C.C$3.C..C.C.C.C.C..C.C.CC..3C3.C..CCA.C.. #L C..C.C.C.A.C..C9.C.C.C7.C4.B.A.C..CC..C..BCCABCC4.3C7.C.C..C..C.C$..C #L 3.C..C..C..C.C.C3.C..C3.3C..C.C4.4C3.C..C.5C5.3C3.4C3.C4.C.C.C.C.5CA7. #L C..C4.C4.3C..C3.C.C$..C.C.C6.C.C.C.C..4C.3C.C3.C8.C7.C..C3.C3.C.C.C6.C #L ..C4.A.C.C.3C..C..CCBACBA..C4.C.A4.C..C4.C.C$3.3C..CCB..C.C.C.C.C.C.C #L 6.C.4C7.CC6.CC4.C3.C3.C.C.3C4.C4.B..C..C..3C10.C5.B..C.C3.C.C.C..C$4.C #L ..C3.A..C3.C..C4.C3.CC3.C..C8.C10.3C..C..5C6.3C6.C3.C..C3.CC6.C4.6C5. #L 3C3.C$..CC..C.ABC5.C5.4C3.C4.C4.A..B5.C10.C.C.C3.C.C8.C.C.CC..C..C.CC. #L C.C..C5.C5.C..C.CC..C.C4.C$.C3.C6.6C12.4C4.3BC.A5.10C3.C.3C3.8C3.C..C. #L C.C6.3C..C4.C3.4C3.C.C.C6.C$.C..3C..C.C4.B.6C13.C.C..C37.3C..C.C6.C.C. #L C..4C3.C.A.CC..C.C.7C$..C..C..C.C6.A6.C12.C.C41.C12.C3.C10.B.CC.CC3.C$ #L 3.CC.CC..C5.3C6.12C3.41C14.3C18.C$..C7.C.CC3.C..C94.C$..C8.C..6C.B20. #L 73C$..C7.3C4.C..A20.C$3.6C..C29.C$..C6.CC30.C$..C8.106C.5C.CC$..C38.C #L 75.C5.C..C$..C107.CBA.C.C..C..3C.C$..C106.A3.3C..3C..C..C$..C107.BCC.C #L .CC.C.C..C.C$..C117.C.CC..C$..C..3C.C.C.3C3.3C..C..CC..3C12.C..C3.CC.. #L C.C..C..CC..3C.3C5.CC12.C30.C$..C3.C..C.C.C6.C..C.C.C.C.C13.C.C.C3.C.C #L .C.C.C.C.C.C.C4.C6.C.C.CC8.C3.CC..C22.C$..C3.C..3C.CC5.C..3C.CC..CC12. #L 3C.C3.CC..3C.3C.CC..CC3.C6.CC6.C5.C7.C22.C$..C3.C..C.C.C6.C..C.C.C3.C #L 13.C.C.C3.C3.C.C.C.C.C.C.C4.C6.C.C.CC8.C3.CC..C22.C$..C3.C..C.C.3C4.C #L ..C.C.C3.3C11.C.C.3C.C3.C.C.C.C.CC..3C..C6.CC11.3C29.C$..C123.C$..C3.A #L 3.A3.A3.A3.A3.C3.A3.A3.A3.A3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C3.C3.C3.C3.C3.C3.C$3.C.B.C.B.C.B.C.B.C.B.C.C.C.B.C.B.C.B.C.B.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C$3.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$3.B.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C. #L C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C.C$4.A3.C3.C3.C3.C3.C3. #L C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C5$.C..3C4.3C7.C$C.C..C6.C3.CC..C.C$3C..C6.C7.C.C$C.C..C6.C3.CC..C.C #L $C.C..C6.C8.C3$6.C3.C3.C3.C3.C7.C3.C3.C3.C$..C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C$6.C3.C3.C3.C3.C7.C3.C3.C3.C3$.C..3C4.3C7.C..3C.C3.CC..C3.3C6.CC.. #L CC..3C..C3.C..3C.3C.3C$C.C..C6.C3.CC3.C..C.C.C5.C.C3.C.C..CC4.C3.C.C.C #L 3.C.C3.C3.C.C3.C$3C..C6.C8.C..3C.3C..C..3C.C.C7.C3.C..C.C4.C4.3C.C.C3. #L C$C.C..C6.C3.CC3.C4.C..C..C4.C..C.C..CC4.C.C3.C.C3.C.C3.C.C.C.C3.C$C.C #L ..C6.C7.3C.3C..C..3C..C..3C6.CC..3C.3C..C3.C..3C.3C3.C3$6.C3.C3.C3.C3. #L C7.C3.C3.C3.C7.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C$..C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C #L 3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C$6.C3.C3.C3.C3.C7.C3.C3.C3.C7.C3.C3.C #L 3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C3.C golly-2.5-src/Rules/0000755000175100001440000000000012156146015011364 500000000000000golly-2.5-src/Rules/TableGenerators/0000755000175100001440000000000012156146015014445 500000000000000golly-2.5-src/Rules/TableGenerators/make-ruletable.cpp0000644000175100001440000005647412156145314020004 00000000000000 /*** / This file is part of Golly, a Game of Life Simulator. Copyright (C) 2008 Andrew Trevorrow and Tomas Rokicki. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Web site: http://sourceforge.net/projects/golly Authors: rokicki@gmail.com andrew@trevorrow.com / ***/ #include #include #include #include #include #include #include #include #include using namespace std; /* Makes a rule-table for your transition function. To compile: g++ -O5 -o make-ruletable make-ruletable.cpp or in Microsoft Visual Studio, add to an empty CLR project. To use: 1) fill slowcalc with your own transition function. 2) set the parameters in main() at the bottom. 3) execute the program from the command line (no options taken) For a 32-state 5-neighbourhood rule it took 16mins on a 2.2GHz machine. For a 4-state 9-neighbourhood rule it took 4s. The merging is very simple - if a transition is compatible with the first rule, then merge the transition into the rule. If not, try the next rule. If there are no more rules, add a new rule containing just the transition. === Worked example: === Transitions: 1,0,0->3 1,2,0->3 2,0,0->3 2,2,0->1 Start. First transition taken as first rule: rule 1: 1,0,0->3 Next transition - is it compatible with rule 1? i.e. is 1,[0,2],0->3 valid for all permutations? Yes. rule 1 now: 1,[0,2],0->3 Next transition - is it compatible with rule 1? i.e. is [1,2],[0,2],0->3 valid for all permutations? no - because 2,2,0 ->1, not ->3. so add the transition as a new rule: rule 1 still: 1,[0,2],0 -> 3 rule 2 now : 2,0,0->3 Next transition - is it compatible with rule 1? no - output is different. Is it compatible with rule 2? no - output is different. Final output: 1,[0,2],0 -> 3 2,0,0 -> 3 2,2,0 -> 1 Written with variables: var a={0,2} 1,a,0,3 2,0,0,3 2,2,0,1 =============== In the function produce_rule_table, the state space is exhaustively traversed. If your transition function consists of transition rules already then you can optimise by running through the transitions instead. You might also want to turn off the optimisation in rule::can_merge, to see if it gives you better compression. Also note: I feel sure there are better ways to compress rule tables than this... Contact: Tim Hutton */ // some typedefs and compile-time constants typedef unsigned short state; enum TSymm { none, rotate4, rotate8, reflect, rotate4reflect, rotate8reflect }; static const string symmetry_strings[] = {"none","rotate4","rotate8","reflect","rotate4reflect","rotate8reflect"}; // fill in this function with your desired transition rules // (for von Neumann neighbourhoods, just ignore the nw,se,sw,ne inputs) state slowcalc(state nw,state n,state ne,state w,state c,state e,state sw,state s,state se) { // wireworld: switch (c) { case 0: return 0 ; case 1: return 2 ; case 2: return 3 ; case 3: if ((((1+(nw==1)+(n==1)+(ne==1)+(w==1)+(e==1)+(sw==1)+ (s==1)+(se==1))) | 1) == 3) return 1 ; else return 3 ; default: return 0 ; // should throw an error here } } vector rotate_inputs(const vector& inputs,int rot) { vector rotinp(inputs); rotate_copy(inputs.begin()+1,inputs.begin()+1+rot,inputs.end(),rotinp.begin()+1); return rotinp; } vector reflect_inputs(const vector& inputs,int neighbourhood_size) { vector refinp(inputs); if(neighbourhood_size==5) // CNESW { refinp[2]=inputs[4]; // swap E and W refinp[4]=inputs[2]; } else // neighbourhood_size==9 (C,N,NE,E,SE,S,SW,W,NW) { refinp[2]=inputs[8]; refinp[8]=inputs[2]; refinp[3]=inputs[7]; refinp[7]=inputs[3]; refinp[4]=inputs[6]; refinp[6]=inputs[4]; // swap all E and W } return refinp; } // simple rule structure, e.g. 1,2,[4,5],8,2 -> 0 class rule { public: set inputs[9]; // c,n,ne,e,se,s,sw,w,nw or c,n,e,s,w state ns; // new state int n_inputs; // 5: von Neumann; 9: Moore TSymm symm; public: // constructors rule(const rule& r) : ns(r.ns),n_inputs(r.n_inputs),symm(r.symm) { for(int i=0;i& inputs,int n_inputs,state ns1,TSymm symm1) : ns(ns1),n_inputs(n_inputs),symm(symm1) { merge(inputs); } // if we merge the rule and the supplied transition, will the rule remain true for all cases? bool can_merge(const vector& test_inputs,state ns1) const { if(ns1!=ns) return false; // can't merge if the outputs are different // If you are running through your own transitions, or for small state spaces, // you might want to turn off this optimisation, to get better compression. // On JvN29 it doesn't make any difference but on Nobili32 it does. const bool forbid_multiple_input_differences = true; if(forbid_multiple_input_differences) { // optimisation: we skip this rule if more than 2 entries are different, we // assume we will have considered the relevant one-change rules before this. int n_different=0; for(int i=0;i1) return false; // just check the new permutations for(int i=0;i& new_inputs) { for(int i=0;i& test_inputs) const { int n_rotations,rotation_skip; bool do_reflect; switch(symm) { default: case none: n_rotations=1; rotation_skip=1; do_reflect=false; break; case rotate4: if(n_inputs==5) { n_rotations=4; rotation_skip=1; do_reflect=false; } else { n_rotations=4; rotation_skip=2; do_reflect=false; } break; case rotate8: n_rotations=8; rotation_skip=1; do_reflect=false; break; case reflect: n_rotations=1; rotation_skip=1; do_reflect=true; break; case rotate4reflect: if(n_inputs==5) { n_rotations=4; rotation_skip=1; do_reflect=true; } else { n_rotations=4; rotation_skip=2; do_reflect=true; } break; case rotate8reflect: n_rotations=8; rotation_skip=1; do_reflect=true; break; } for(int iRot=0;iRot& test_inputs) const { for(int i=0;i::const_iterator c_it,n_it,ne_it,e_it,se_it,s_it,sw_it,w_it,nw_it; if(n_inputs==9) { for(c_it = inputs[0].begin();c_it!=inputs[0].end();c_it++) for(n_it = inputs[1].begin();n_it!=inputs[1].end();n_it++) for(ne_it = inputs[2].begin();ne_it!=inputs[2].end();ne_it++) for(e_it = inputs[3].begin();e_it!=inputs[3].end();e_it++) for(se_it = inputs[4].begin();se_it!=inputs[4].end();se_it++) for(s_it = inputs[5].begin();s_it!=inputs[5].end();s_it++) for(sw_it = inputs[6].begin();sw_it!=inputs[6].end();sw_it++) for(w_it = inputs[7].begin();w_it!=inputs[7].end();w_it++) for(nw_it = inputs[8].begin();nw_it!=inputs[8].end();nw_it++) if(slowcalc(*nw_it,*n_it,*ne_it,*w_it,*c_it,*e_it,*sw_it,*s_it,*se_it)!=ns) return false; } else { for(c_it = inputs[0].begin();c_it!=inputs[0].end();c_it++) for(n_it = inputs[1].begin();n_it!=inputs[1].end();n_it++) for(e_it = inputs[2].begin();e_it!=inputs[2].end();e_it++) for(s_it = inputs[3].begin();s_it!=inputs[3].end();s_it++) for(w_it = inputs[4].begin();w_it!=inputs[4].end();w_it++) if(slowcalc(0,*n_it,0,*w_it,*c_it,*e_it,0,*s_it,0)!=ns) return false; } return true; } }; // makes a unique variable name for a given value string get_variable_name(unsigned int iVar) { const char VARS[52]={'a','b','c','d','e','f','g','h','i','j', 'k','l','m','n','o','p','q','r','s','t','u','v','w','x', 'y','z','A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; ostringstream oss; if(iVar<52) oss << VARS[iVar]; else if(iVar<52*52) oss << VARS[(iVar-(iVar%52))/52 - 1] << VARS[iVar%52]; else oss << "!"; // we have a 52*52 limit ("should be enough for anyone") return oss.str(); } void print_rules(const vector& rules,ostream& out) { // first collect all variables (makes reading easier) map< string , set > vars; ostringstream rules_out; for(vector::const_iterator r_it=rules.begin();r_it!=rules.end();r_it++) { vector variables_used; for(int i=0;in_inputs;i++) { // if more than one state for this input, we need a variable if(r_it->inputs[i].size()>1) { string var; // is there a variable that matches these inputs, and that we haven't used? bool found_unused_var=false; for(map >::const_iterator v_it=vars.begin();v_it!=vars.end();v_it++) { if(v_it->second==r_it->inputs[i] && find(variables_used.begin(),variables_used.end(),v_it->first)==variables_used.end()) { found_unused_var = true; var = v_it->first; break; } } if(!found_unused_var) { // we need to make a new one for this set of inputs var = get_variable_name(vars.size()); // add it to the list of made variables vars[var] = r_it->inputs[i]; // print it out << "var " << var << "={"; set::const_iterator it=r_it->inputs[i].begin(); while(true) { out << (int)*it; it++; if(it!=r_it->inputs[i].end()) out << ","; else break; } out << "}\n"; } // add the variable to the list of used ones variables_used.push_back(var); rules_out << var << ","; } else { // just a state, output it rules_out << (int)*r_it->inputs[i].begin() << ","; } } rules_out << (int)r_it->ns << endl; } out << rules_out.str(); } void produce_rule_table(vector& rules,int N,int nhood_size,TSymm symm,bool remove_stasis) { int n_rotations,rotation_skip; bool do_reflect; switch(symm) { default: case none: n_rotations=1; rotation_skip=1; do_reflect=false; break; case rotate4: if(nhood_size==5) { n_rotations=4; rotation_skip=1; do_reflect=false; } else { n_rotations=4; rotation_skip=2; do_reflect=false; } break; case rotate8: n_rotations=8; rotation_skip=1; do_reflect=false; break; case reflect: n_rotations=1; rotation_skip=1; do_reflect=true; break; case rotate4reflect: if(nhood_size==5) { n_rotations=4; rotation_skip=1; do_reflect=true; } else { n_rotations=4; rotation_skip=2; do_reflect=true; } break; case rotate8reflect: n_rotations=8; rotation_skip=1; do_reflect=true; break; } state c,n,ne,nw,sw,s,se,e,w,ns; vector::iterator it; bool merged; for(c=0;c inputs(9); inputs[0]=c; for(n=0;n inputs(5); inputs[0]=c; for(n=0;n& rules,const vector& inputs) { for(vector::const_iterator it=rules.begin();it!=rules.end();it++) if(it->matches(inputs)) return it->ns; return inputs[0]; // default: no change } bool is_correct(const vector&rules,int N,int neighbourhood_size) { // exhaustive check state c,n,ne,nw,sw,s,se,e,w; if(neighbourhood_size==9) { vector inputs(9); for(c=0;c inputs(5); for(c=0;c rules; time_t t1,t2; time(&t1); produce_rule_table(rules,N_STATES,nhood_size,symmetry,remove_stasis_transitions); time(&t2); int n_secs = (int)difftime(t2,t1); cout << "\nProcessing took: " << n_secs << " seconds." << endl; { ofstream out(output_filename.c_str()); out << "# rules: " << rules.size() << "\n#"; out << "\n# Golly rule-table format.\n# Each rule: C,"; if(nhood_size==5) out << "N,E,S,W"; else out << "N,NE,E,SE,S,SW,W,NW"; out << ",C'"; out << "\n# N.B. Where the same variable appears multiple times in a transition,\n# it takes the same value each time.\n#"; if(remove_stasis_transitions) out << "\n# Default for transitions not listed: no change\n#"; else out << "\n# All transitions should be included below, including no-change ones.\n#"; out << "\nn_states:" << N_STATES; out << "\nneighborhood:" << ((nhood_size==5)?("vonNeumann"):("Moore")); out << "\nsymmetries:" << symmetry_strings[symmetry] << "\n"; print_rules(rules,out); } cout << rules.size() << " rules written." << endl; // optional: run through the entire state space, checking that new_slowcalc matches slowcalc cout << "Verifying is correct (can abort if you're confident)..."; cout.flush(); if(is_correct(rules,N_STATES,nhood_size)) cout << "yes." << endl; else cout << "no! Either there's a bug in the code, or the transition function does not have the symmetry you selected." << endl; } golly-2.5-src/Rules/TreeGenerators/0000755000175100001440000000000012156146015014315 500000000000000golly-2.5-src/Rules/TreeGenerators/LifeOnTheEdge.cpp0000644000175100001440000000303412156145314017344 00000000000000#include #include #include #include using namespace std ; /** * Set the state count, neighbor count, and put your function here. */ const int numStates = 4 ; const int numNeighbors = 8 ; /** 0: (nothing set) 1: | 2: - 3: |- */ /* order for nine neighbors is nw, ne, sw, se, n, w, e, s, c */ int f(int *a) { int on0 = a[8] - (a[8] >> 1) ; // # bits set int on1 = (a[2] >> 1) + (a[4] & 1) + (a[5] >> 1) + (a[7] & 1) + (a[7] >> 1) + on0 ; int on2 = (a[1] & 1) + (a[4] & 1) + (a[5] >> 1) + (a[6] & 1) + (a[6] >> 1) + on0 ; return (on1 == 2) + 2 * (on2 == 2) ; } const int numParams = numNeighbors + 1 ; map world ; vector r ; int nodeSeq, params[9] ; int getNode(const string &n) { map::iterator it = world.find(n) ; if (it != world.end()) return it->second ; world[n] = nodeSeq ; r.push_back(n) ; return nodeSeq++ ; } int recur(int at) { if (at == 0) { return f(params) ; } else { char buf[256*10] ; sprintf(buf, "%d", at) ; for (int i=0; i #include #include #include using namespace std ; /** * Set the state count, neighbor count, and put your function here. */ const int numStates = 3 ; const int numNeighbors = 8 ; /** 0: (nothing set) 1: \ 2: / */ /* order for nine neighbors is nw, ne, sw, se, n, w, e, s, c */ int f(int *a) { int on1 = (a[0] & 1) + (a[3] & 1) + (a[4] >> 1) + (a[5] >> 1) + (a[6] >> 1) + (a[7] >> 1) + (a[8] & 1) ; int on2 = (a[1] >> 1) + (a[2] >> 1) + (a[4] & 1) + (a[5] & 1) + (a[6] & 1) + (a[7] & 1) + (a[8] >> 1) ; if (on1 == 2) if (on2 == 2) return 0 ; else return 1 ; else if (on2 == 2) return 2 ; else return 0 ; } const int numParams = numNeighbors + 1 ; map world ; vector r ; int nodeSeq, params[9] ; int getNode(const string &n) { map::iterator it = world.find(n) ; if (it != world.end()) return it->second ; world[n] = nodeSeq ; r.push_back(n) ; return nodeSeq++ ; } int recur(int at) { if (at == 0) { return f(params) ; } else { char buf[256*10] ; sprintf(buf, "%d", at) ; for (int i=0; i // for strlen #include #include #include #include using namespace std ; /** * Set the state count, neighbor count, and put your function here. */ const int numStates = 2 ; const int numNeighbors = 8 ; /* order for nine neighbors is nw, ne, sw, se, n, w, e, s, c */ /* order for five neighbors is n, w, e, s, c */ int f(int *a) { int n = a[0] + a[1] + a[2] + a[3] + a[4] + a[5] + a[6] + a[7] ; if (n == 2 && a[8]) return 1 ; if (n == 3) return 1 ; return 0 ; } const int numParams = numNeighbors + 1 ; map world ; vector r ; int nodeSeq, params[9] ; int getNode(const string &n) { map::iterator it = world.find(n) ; if (it != world.end()) return it->second ; world[n] = nodeSeq ; r.push_back(n) ; return nodeSeq++ ; } int recur(int at) { if (at == 0) { return f(params) ; } else { char buf[256*10] ; sprintf(buf, "%d", at) ; for (int i=0; i world = new HashMap() ; ArrayList r = new ArrayList() ; int[] params = new int[numParams] ; int nodeSeq = 0 ; int getNode(String n) { Integer found = world.get(n) ; if (found == null) { found = nodeSeq++ ; r.add(n) ; world.put(n, found) ; } return found ; } int recur(int at) { if (at == 0) return f(params) ; String n = "" + at ; for (int i=0; i @TABLE n_states:8 neighborhood:vonNeumann symmetries:rotate4 var a={4,5} var b={2,3} var c={2,3} var d={4,5,6,7} var e={4,5,6} var f={0,1} var g={1,2} var h={0,1,2} var i={1,2,6} var j={1,6} var k={4,5} var l={4,6,7} var m={1,2,3} var n={6,7} var o={1,2,7} var p={0,2,3} # Almost all configurations with neighborhoods in [0-3] are stable # These are the exceptions (Codd's `short table', page 66) 0,1,2,1,2,1 # Path self-repair 3,0,0,0,2,2 # Path self-repair 3,0,1,0,2,2 # Gate control 3,0,1,0,3,0 # Gate control 2,1,2,3,2,3 # Gate control 3,1,2,3,2,2 # Gate control 0,0,2,1,3,1 # Path end self-repair 0,1,2,3,2,6 # Echo generation 0,1,2,2,2,7 # Echo generation # The long table 0,0,2,7,2,1 # j 0,0,3,6,3,1 # i 0,1,1,2,d,1 # fi = fan-in 0,1,1,e,2,1 # fi 0,1,2,1,d,1 # fi 0,1,2,2,d,1 # p = signal propagation 0,1,2,3,5,1 # p 0,1,2,4,2,1 # p 0,1,2,4,4,1 # fo = fan-out 0,1,2,5,b,1 # p (was fi) 0,1,2,5,5,1 # fo 0,1,2,6,2,1 # p 0,1,2,6,6,1 # fo 0,1,2,7,b,1 # p 0,1,2,7,7,1 # fo 0,1,3,2,4,1 # p 0,1,3,d,2,1 # pg - propagation at gate (subordinate path) 0,1,3,7,3,1 # t7 = transforming to 07 0,1,4,2,2,1 # p 0,1,4,2,4,1 # fo 0,1,4,3,2,1 # p 0,1,4,4,2,1 # fo 0,1,5,2,b,1 # p 0,1,5,2,5,1 # fo 0,1,5,3,2,1 # p 0,1,5,5,2,1 # fo 0,1,6,2,2,1 # p 0,1,6,2,6,1 # fo 0,1,6,6,2,1 # fo 0,1,7,2,2,1 # p 0,1,7,2,7,1 # fo 0,1,7,7,2,1 # fo 0,0,0,f,6,2 # k 0,0,0,2,5,2 # xl = extend left 0,0,0,2,6,2 # sh = sheathing 0,0,0,4,2,2 # xr = extend right 0,0,0,6,1,2 # k 0,0,0,6,2,2 # sh 0,0,0,6,6,2 # sh 0,0,1,0,6,2 # sh 0,0,1,1,6,2 # k 0,0,1,2,6,2 # sh 0,0,1,6,1,2 # k 0,0,1,6,2,2 # sh 0,0,1,6,6,2 # sh 0,0,2,0,6,2 # g = gate control 0,0,2,2,6,2 # sh 0,0,2,6,g,2 # sh 0,0,6,1,1,2 # k 0,0,6,2,1,2 # sh 0,0,6,2,2,2 # sh 0,0,6,2,6,2 # sh 0,0,6,6,1,2 # sh 0,1,1,1,6,2 # k 0,1,1,6,6,2 # sh 0,2,2,2,6,2 # sh 0,2,2,6,6,2 # sh 0,0,0,0,7,3 # k 0,0,0,1,5,3 # i 0,0,0,5,1,3 # i 0,0,1,0,7,3 # e 0,0,2,0,7,3 # g 1,0,0,0,4,0 # e 1,0,0,1,4,0 # e 1,0,0,4,1,0 # e 1,0,1,0,4,0 # e 1,0,1,1,4,0 # e 1,0,1,4,1,0 # e 1,0,4,1,1,0 # e 1,1,1,1,4,0 # e 1,0,0,3,6,2 # i 1,0,0,6,3,2 # i # error in codd.r: 10107[23] # s = sense 1,0,1,0,7,2 # s = sense 1,0,0,0,7,3 # s 1,0,0,2,4,4 # xr 1,0,b,4,c,4 # pe = path end 1,1,1,2,4,4 # fo 1,1,g,4,2,4 # fo,p 1,1,2,g,4,4 # fo,p 1,1,2,4,3,4 # pg 1,1,2,7,7,4 # fi 1,1,4,2,2,4 # p 1,1,7,2,7,4 # fi 1,1,7,7,2,4 # fi 1,2,b,2,4,4 # pe 1,2,b,4,3,4 # pe 1,2,2,4,4,4 # c = collision 1,2,3,2,4,4 # pe 1,b,3,3,4,4 # pe 1,2,4,2,2,4 # c 1,2,4,3,3,4 # pe 1,0,0,5,2,5 # xl 1,0,1,0,5,5 # i 1,0,b,5,c,5 # pe 1,1,1,2,5,5 # fo 1,1,g,5,2,5 # fo,p 1,1,2,g,5,5 # fo,p 1,1,2,4,4,5 # fi 1,1,2,5,3,5 # pg 1,1,4,2,4,5 # fi 1,1,4,4,2,5 # fi 1,1,5,2,2,5 # p 1,2,2,b,5,5 # pe 1,2,2,5,3,5 # pe 1,2,2,5,5,5 # c 1,2,3,b,5,5 # pe 1,2,3,5,3,5 # pe 1,2,5,2,5,5 # c 1,2,5,3,3,5 # pe 1,3,3,3,5,5 # pe 1,0,0,h,6,6 # sh 1,0,0,6,i,6 # sh 1,0,1,h,6,6 # sh 1,0,1,6,i,6 # sh 1,0,2,2,6,6 # pe 1,0,2,6,1,6 # sh 1,0,b,6,c,6 # pe 1,0,6,0,6,6 # sh 1,0,6,1,j,6 # sh 1,0,6,2,g,6 # sh,pe 1,0,6,2,6,6 # c 1,0,6,0,6,6 # sh 1,0,6,1,j,6 # sh 1,0,6,2,i,6 # sh,pe,c 1,0,6,6,1,6 # sh 1,1,1,1,5,6 # i 1,1,1,2,6,6 # fo 1,1,1,6,2,6 # fo 1,1,2,1,6,6 # fo 1,1,2,2,6,6 # p 1,1,2,5,5,6 # fi 1,1,2,6,2,6 # p 1,1,2,6,3,6 # pg 1,1,2,6,6,6 # fi 1,1,5,2,5,6 # fi 1,1,5,5,2,6 # fi 1,1,6,2,2,6 # p 1,1,6,2,6,6 # fi 1,1,6,6,2,6 # fi 1,2,2,b,6,6 # pe 1,2,2,6,3,6 # pe 1,2,2,6,6,6 # c 1,2,3,b,6,6 # pe 1,2,3,6,3,6 # pe 1,2,6,2,6,6 # c 1,2,6,3,3,6 # pe 1,3,3,3,6,6 # pe 1,0,2,7,b,7 # pe 1,0,3,7,b,7 # pe 1,1,1,2,7,7 # fo 1,1,1,7,2,7 # fo 1,1,2,g,7,7 # fo,p 1,1,2,7,b,7 # p,pg 1,1,3,e,3,7 # t7 1,1,3,7,3,7 # t7 1,1,7,2,2,7 # p 1,2,2,b,7,7 # pe 1,2,2,7,3,7 # pe 1,2,2,7,7,7 # c 1,2,3,b,7,7 # pe 1,2,3,7,3,7 # pe 1,2,7,2,7,7 # c 1,2,7,3,3,7 # pe 1,3,3,3,7,7 # pe 2,0,h,0,6,0 # k,k,g 2,0,0,f,7,1 # s,x 2,0,0,7,1,1 # x = extend 2,0,1,0,7,1 # s 2,0,1,1,7,1 # x 2,0,1,7,1,1 # x 2,0,7,1,1,1 # x 2,1,1,1,7,1 # x 2,0,0,2,5,3 # qm = cell q change of state 2,0,0,4,2,3 # pm = cell p change of state 2,0,1,4,2,3 # pm (was missing in codd.r) 2,0,2,0,7,3 # g 2,0,2,5,1,3 # qm 2,0,3,0,n,3 # g 2,2,3,2,d,3 # g (was missing in codd.r) 3,0,0,2,n,0 # r,m 3,0,0,6,2,0 # r 3,0,0,7,2,0 # m 3,0,1,6,2,0 # pm 3,0,1,7,2,0 # m 3,0,2,6,1,0 # qm 3,0,2,7,1,0 # m 3,0,0,0,6,1 # s 3,0,0,2,5,1 # qm 3,0,0,4,2,1 # pm 3,2,3,2,d,2 # g 3,0,1,0,6,4 # e 3,0,1,0,7,7 # j 4,0,0,0,1,0 # e 4,0,0,1,2,0 # fi 4,0,0,2,1,0 # fi 4,0,1,0,2,0 # fi 4,0,1,1,2,0 # fo 4,0,1,2,1,0 # fo 4,0,1,2,2,0 # p 4,0,2,1,1,0 # fo 4,0,2,1,2,0 # p 4,0,2,2,1,0 # p 4,0,3,1,2,0 # pg 4,0,0,0,2,1 # xr 4,0,0,2,2,1 # c 4,0,2,0,2,1 # pe 4,0,2,2,2,1 # pe 4,0,2,2,3,1 # pe 4,0,2,3,2,1 # pe 4,0,2,3,3,1 # pe 4,0,3,2,2,1 # pe 4,0,3,2,3,1 # pe 4,0,3,3,2,1 # pe 4,0,3,3,3,1 # pe 5,0,0,0,1,0 # i 5,0,0,1,2,0 # fi 5,0,0,2,1,0 # fi 5,0,1,0,2,0 # fi 5,0,1,1,2,0 # fo 5,0,1,2,1,0 # fo 5,0,1,2,2,0 # p 5,0,2,1,1,0 # fo 5,0,2,1,2,0 # p 5,0,2,2,1,0 # p 5,0,3,1,2,0 # pg 5,0,0,0,2,1 # xl 5,0,0,2,2,1 # c 5,0,2,p,b,1 # pe 5,0,3,b,c,1 # pe (was missing in codd.r) 6,0,0,0,1,0 # sh 6,0,0,1,1,0 # sh 6,0,0,1,2,0 # fi 6,0,0,2,1,0 # fi 6,0,1,0,1,0 # sh 6,0,1,0,2,0 # fi 6,0,1,1,1,0 # i 6,0,1,1,2,0 # fo 6,0,1,2,1,0 # fo 6,0,1,2,2,0 # p 6,0,2,1,1,0 # fo 6,0,2,1,2,0 # p 6,0,2,2,1,0 # p 6,0,2,2,3,0 # pe 6,0,2,3,2,0 # pe 6,0,2,3,3,0 # pe 6,0,3,1,2,0 # pg 6,0,3,2,2,0 # pe 6,0,3,2,3,0 # pe 6,0,3,3,2,0 # pe 6,0,3,3,3,0 # pe 6,1,2,3,2,0 # s 6,0,0,0,0,1 # sh 6,0,0,0,2,1 # sh 6,0,0,2,2,1 # c 6,0,2,0,2,1 # pe 6,0,2,2,2,1 # sh 7,0,0,0,1,0 # j 7,0,1,1,2,0 # fo 7,0,1,2,1,0 # fo 7,0,1,2,2,0 # p 7,0,2,1,1,0 # fo 7,0,2,1,2,0 # p 7,0,2,2,1,0 # p 7,0,2,2,3,0 # pe 7,0,2,3,2,0 # pe 7,0,2,3,3,0 # pe 7,0,3,1,2,0 # pg 7,0,3,1,3,0 # pe 7,0,3,2,2,0 # pe 7,0,3,2,3,0 # pe 7,0,3,3,2,0 # pe 7,0,3,3,3,0 # pe 7,1,2,2,2,0 # s 7,0,0,0,2,1 # pe 7,0,0,2,2,1 # c 7,0,2,0,2,1 # pe 7,0,2,2,2,1 # x # End of Codd's original ruleset # TJH added some extra cases for collisions between sheathing-signals: # (see top of file) # for 2-way collisions: 0,0,6,6,2,2 # sh 0,6,6,0,2,2 # sh (reflected form of above) # for 3-way collisions: 1,6,6,6,0,6 # sh @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 golly-2.5-src/Rules/Codd.rule0000644000175100001440000002016112156145314013047 00000000000000@RULE Codd Codd's cellular automaton. Codd, E.F., _Cellular_Automata_, Academic Press 1968 (ACM Monograph #3). Originally distributed with XLife as codd.r. Several corrections have been made. Stasis transitions have been taken out. Tim Hutton @TABLE n_states:8 neighborhood:vonNeumann symmetries:rotate4 var a={4,5} var b={2,3} var c={2,3} var d={4,5,6,7} var e={4,5,6} var f={0,1} var g={1,2} var h={0,1,2} var i={1,2,6} var j={1,6} var k={4,5} var l={4,6,7} var m={1,2,3} var n={6,7} var o={1,2,7} var p={0,2,3} # Almost all configurations with neighborhoods in [0-3] are stable # These are the exceptions (Codd's `short table', page 66) 0,1,2,1,2,1 # Path self-repair 3,0,0,0,2,2 # Path self-repair 3,0,1,0,2,2 # Gate control 3,0,1,0,3,0 # Gate control 2,1,2,3,2,3 # Gate control 3,1,2,3,2,2 # Gate control 0,0,2,1,3,1 # Path end self-repair 0,1,2,3,2,6 # Echo generation 0,1,2,2,2,7 # Echo generation # The long table 0,0,2,7,2,1 # j 0,0,3,6,3,1 # i 0,1,1,2,d,1 # fi = fan-in 0,1,1,e,2,1 # fi 0,1,2,1,d,1 # fi 0,1,2,2,d,1 # p = signal propagation 0,1,2,3,5,1 # p 0,1,2,4,2,1 # p 0,1,2,4,4,1 # fo = fan-out 0,1,2,5,b,1 # p (was fi) 0,1,2,5,5,1 # fo 0,1,2,6,2,1 # p 0,1,2,6,6,1 # fo 0,1,2,7,b,1 # p 0,1,2,7,7,1 # fo 0,1,3,2,4,1 # p 0,1,3,d,2,1 # pg - propagation at gate (subordibate path) 0,1,3,7,3,1 # t7 = transforming to 07 0,1,4,2,2,1 # p 0,1,4,2,4,1 # fo 0,1,4,3,2,1 # p 0,1,4,4,2,1 # fo 0,1,5,2,b,1 # p 0,1,5,2,5,1 # fo 0,1,5,3,2,1 # p 0,1,5,5,2,1 # fo 0,1,6,2,2,1 # p 0,1,6,2,6,1 # fo 0,1,6,6,2,1 # fo 0,1,7,2,2,1 # p 0,1,7,2,7,1 # fo 0,1,7,7,2,1 # fo 0,0,0,f,6,2 # k 0,0,0,2,5,2 # xl = extend left 0,0,0,2,6,2 # sh = sheathing 0,0,0,4,2,2 # xr = extend right 0,0,0,6,1,2 # k 0,0,0,6,2,2 # sh 0,0,0,6,6,2 # sh 0,0,1,0,6,2 # sh 0,0,1,1,6,2 # k 0,0,1,2,6,2 # sh 0,0,1,6,1,2 # k 0,0,1,6,2,2 # sh 0,0,1,6,6,2 # sh 0,0,2,0,6,2 # g = gate control 0,0,2,2,6,2 # sh 0,0,2,6,g,2 # sh 0,0,6,1,1,2 # k 0,0,6,2,1,2 # sh 0,0,6,2,2,2 # sh 0,0,6,2,6,2 # sh 0,0,6,6,1,2 # sh 0,1,1,1,6,2 # k 0,1,1,6,6,2 # sh 0,2,2,2,6,2 # sh 0,2,2,6,6,2 # sh 0,0,0,0,7,3 # k 0,0,0,1,5,3 # i 0,0,0,5,1,3 # i 0,0,1,0,7,3 # e 0,0,2,0,7,3 # g 1,0,0,0,4,0 # e 1,0,0,1,4,0 # e 1,0,0,4,1,0 # e 1,0,1,0,4,0 # e 1,0,1,1,4,0 # e 1,0,1,4,1,0 # e 1,0,4,1,1,0 # e 1,1,1,1,4,0 # e 1,0,0,3,6,2 # i 1,0,0,6,3,2 # i # error in codd.r: 10107[23] # s = sense 1,0,1,0,7,2 # s = sense 1,0,0,0,7,3 # s 1,0,0,2,4,4 # xr 1,0,b,4,c,4 # pe = path end 1,1,1,2,4,4 # fo 1,1,g,4,2,4 # fo,p 1,1,2,g,4,4 # fo,p 1,1,2,4,3,4 # pg 1,1,2,7,7,4 # fi 1,1,4,2,2,4 # p 1,1,7,2,7,4 # fi 1,1,7,7,2,4 # fi 1,2,b,2,4,4 # pe 1,2,b,4,3,4 # pe 1,2,2,4,4,4 # c = collision 1,2,3,2,4,4 # pe 1,b,3,3,4,4 # pe 1,2,4,2,2,4 # c 1,2,4,3,3,4 # pe 1,0,0,5,2,5 # xl 1,0,1,0,5,5 # i 1,0,b,5,c,5 # pe 1,1,1,2,5,5 # fo 1,1,g,5,2,5 # fo,p 1,1,2,g,5,5 # fo,p 1,1,2,4,4,5 # fi 1,1,2,5,3,5 # pg 1,1,4,2,4,5 # fi 1,1,4,4,2,5 # fi 1,1,5,2,2,5 # p 1,2,2,b,5,5 # pe 1,2,2,5,3,5 # pe 1,2,2,5,5,5 # c 1,2,3,b,5,5 # pe 1,2,3,5,3,5 # pe 1,2,5,2,5,5 # c 1,2,5,3,3,5 # pe 1,3,3,3,5,5 # pe 1,0,0,h,6,6 # sh 1,0,0,6,i,6 # sh 1,0,1,h,6,6 # sh 1,0,1,6,i,6 # sh 1,0,2,2,6,6 # pe 1,0,2,6,1,6 # sh 1,0,b,6,c,6 # pe 1,0,6,0,6,6 # sh 1,0,6,1,j,6 # sh 1,0,6,2,g,6 # sh,pe 1,0,6,2,6,6 # c 1,0,6,0,6,6 # sh 1,0,6,1,j,6 # sh 1,0,6,2,i,6 # sh,pe,c 1,0,6,6,1,6 # sh 1,1,1,1,5,6 # i 1,1,1,2,6,6 # fo 1,1,1,6,2,6 # fo 1,1,2,1,6,6 # fo 1,1,2,2,6,6 # p 1,1,2,5,5,6 # fi 1,1,2,6,2,6 # p 1,1,2,6,3,6 # pg 1,1,2,6,6,6 # fi 1,1,5,2,5,6 # fi 1,1,5,5,2,6 # fi 1,1,6,2,2,6 # p 1,1,6,2,6,6 # fi 1,1,6,6,2,6 # fi 1,2,2,b,6,6 # pe 1,2,2,6,3,6 # pe 1,2,2,6,6,6 # c 1,2,3,b,6,6 # pe 1,2,3,6,3,6 # pe 1,2,6,2,6,6 # c 1,2,6,3,3,6 # pe 1,3,3,3,6,6 # pe 1,0,2,7,b,7 # pe 1,0,3,7,b,7 # pe 1,1,1,2,7,7 # fo 1,1,1,7,2,7 # fo 1,1,2,g,7,7 # fo,p 1,1,2,7,b,7 # p,pg 1,1,3,e,3,7 # t7 1,1,3,7,3,7 # t7 1,1,7,2,2,7 # p 1,2,2,b,7,7 # pe 1,2,2,7,3,7 # pe 1,2,2,7,7,7 # c 1,2,3,b,7,7 # pe 1,2,3,7,3,7 # pe 1,2,7,2,7,7 # c 1,2,7,3,3,7 # pe 1,3,3,3,7,7 # pe 2,0,h,0,6,0 # k,k,g 2,0,0,f,7,1 # s,x 2,0,0,7,1,1 # x = extend 2,0,1,0,7,1 # s 2,0,1,1,7,1 # x 2,0,1,7,1,1 # x 2,0,7,1,1,1 # x 2,1,1,1,7,1 # x 2,0,0,2,5,3 # qm = cell q change of state 2,0,0,4,2,3 # pm = cell p change of state 2,0,1,4,2,3 # pm (was missing in codd.r) 2,0,2,0,7,3 # g 2,0,2,5,1,3 # qm 2,0,3,0,n,3 # g 2,2,3,2,d,3 # g (was missing in codd.r) 3,0,0,2,n,0 # r,m 3,0,0,6,2,0 # r 3,0,0,7,2,0 # m 3,0,1,6,2,0 # pm 3,0,1,7,2,0 # m 3,0,2,6,1,0 # qm 3,0,2,7,1,0 # m 3,0,0,0,6,1 # s 3,0,0,2,5,1 # qm 3,0,0,4,2,1 # pm 3,2,3,2,d,2 # g 3,0,1,0,6,4 # e 3,0,1,0,7,7 # j 4,0,0,0,1,0 # e 4,0,0,1,2,0 # fi 4,0,0,2,1,0 # fi 4,0,1,0,2,0 # fi 4,0,1,1,2,0 # fo 4,0,1,2,1,0 # fo 4,0,1,2,2,0 # p 4,0,2,1,1,0 # fo 4,0,2,1,2,0 # p 4,0,2,2,1,0 # p 4,0,3,1,2,0 # pg 4,0,0,0,2,1 # xr 4,0,0,2,2,1 # c 4,0,2,0,2,1 # pe 4,0,2,2,2,1 # pe 4,0,2,2,3,1 # pe 4,0,2,3,2,1 # pe 4,0,2,3,3,1 # pe 4,0,3,2,2,1 # pe 4,0,3,2,3,1 # pe 4,0,3,3,2,1 # pe 4,0,3,3,3,1 # pe 5,0,0,0,1,0 # i 5,0,0,1,2,0 # fi 5,0,0,2,1,0 # fi 5,0,1,0,2,0 # fi 5,0,1,1,2,0 # fo 5,0,1,2,1,0 # fo 5,0,1,2,2,0 # p 5,0,2,1,1,0 # fo 5,0,2,1,2,0 # p 5,0,2,2,1,0 # p 5,0,3,1,2,0 # pg 5,0,0,0,2,1 # xl 5,0,0,2,2,1 # c 5,0,2,p,b,1 # pe 5,0,3,b,c,1 # pe (was missing in codd.r) 6,0,0,0,1,0 # sh 6,0,0,1,1,0 # sh 6,0,0,1,2,0 # fi 6,0,0,2,1,0 # fi 6,0,1,0,1,0 # sh 6,0,1,0,2,0 # fi 6,0,1,1,1,0 # i 6,0,1,1,2,0 # fo 6,0,1,2,1,0 # fo 6,0,1,2,2,0 # p 6,0,2,1,1,0 # fo 6,0,2,1,2,0 # p 6,0,2,2,1,0 # p 6,0,2,2,3,0 # pe 6,0,2,3,2,0 # pe 6,0,2,3,3,0 # pe 6,0,3,1,2,0 # pg 6,0,3,2,2,0 # pe 6,0,3,2,3,0 # pe 6,0,3,3,2,0 # pe 6,0,3,3,3,0 # pe 6,1,2,3,2,0 # s 6,0,0,0,0,1 # sh 6,0,0,0,2,1 # sh 6,0,0,2,2,1 # c 6,0,2,0,2,1 # pe 6,0,2,2,2,1 # sh 7,0,0,0,1,0 # j 7,0,1,1,2,0 # fo 7,0,1,2,1,0 # fo 7,0,1,2,2,0 # p 7,0,2,1,1,0 # fo 7,0,2,1,2,0 # p 7,0,2,2,1,0 # p 7,0,2,2,3,0 # pe 7,0,2,3,2,0 # pe 7,0,2,3,3,0 # pe 7,0,3,1,2,0 # pg 7,0,3,1,3,0 # pe 7,0,3,2,2,0 # pe 7,0,3,2,3,0 # pe 7,0,3,3,2,0 # pe 7,0,3,3,3,0 # pe 7,1,2,2,2,0 # s 7,0,0,0,2,1 # pe 7,0,0,2,2,1 # c 7,0,2,0,2,1 # pe 7,0,2,2,2,1 # x # End of ruleset @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 golly-2.5-src/Rules/CrittersMargolus_emulated.rule0000644000175100001440000000670712156145314017401 00000000000000@RULE CrittersMargolus_emulated @TREE num_states=5 num_neighbors=8 num_nodes=132 1 0 2 2 4 4 1 0 1 2 3 4 2 0 1 0 1 0 2 1 1 1 1 1 1 0 2 1 4 3 2 0 1 4 1 4 3 2 3 5 3 5 3 3 3 3 3 3 3 5 3 5 3 5 4 6 7 8 7 8 4 7 7 7 7 7 2 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 5 9 10 14 10 14 1 0 1 1 3 3 2 16 1 16 1 16 3 17 3 17 3 17 4 18 7 18 7 18 5 19 10 19 10 19 1 0 4 2 2 4 1 0 4 2 4 4 2 0 1 21 1 22 2 0 1 22 1 0 3 2 3 23 3 24 4 25 7 25 7 25 5 26 10 26 10 26 1 0 2 2 2 4 2 0 1 22 1 28 2 0 1 28 1 28 3 2 3 29 3 30 4 31 7 31 7 31 5 32 10 32 10 32 6 15 20 27 20 33 5 10 10 10 10 10 6 20 20 35 20 35 3 2 3 2 3 2 1 0 1 4 3 2 1 0 1 4 3 4 2 1 1 38 1 39 3 40 40 3 40 3 2 1 1 39 1 1 3 42 42 3 42 3 4 37 41 37 43 37 5 44 10 44 10 44 4 25 41 25 43 25 5 46 10 46 10 46 4 31 41 31 43 31 5 48 10 48 10 48 6 45 35 47 35 49 1 0 1 2 3 2 2 1 1 39 1 51 3 52 52 3 52 3 2 1 1 51 1 51 3 54 54 3 54 3 4 37 53 37 55 37 5 56 10 56 10 56 4 25 53 25 55 25 5 58 10 58 10 58 4 31 53 31 55 31 5 60 10 60 10 60 6 57 35 59 35 61 7 34 36 50 36 62 6 35 35 35 35 35 7 36 36 64 36 64 4 37 7 37 7 37 2 38 38 1 38 1 2 39 39 1 39 1 3 3 3 67 3 68 4 69 7 69 7 69 3 3 3 68 3 3 4 71 7 71 7 71 5 66 70 66 72 66 5 26 70 26 72 26 5 32 70 32 72 32 6 73 35 74 35 75 5 44 70 44 72 44 5 46 70 46 72 46 5 48 70 48 72 48 6 77 35 78 35 79 5 56 70 56 72 56 5 58 70 58 72 58 5 60 70 60 72 60 6 81 35 82 35 83 7 76 64 80 64 84 2 51 51 1 51 1 3 3 3 68 3 86 4 87 7 87 7 87 3 3 3 86 3 86 4 89 7 89 7 89 5 66 88 66 90 66 5 26 88 26 90 26 5 32 88 32 90 32 6 91 35 92 35 93 5 44 88 44 90 44 5 46 88 46 90 46 5 48 88 48 90 48 6 95 35 96 35 97 5 56 88 56 90 56 5 58 88 58 90 58 5 60 88 60 90 60 6 99 35 100 35 101 7 94 64 98 64 102 8 63 65 85 65 103 1 0 1 3 3 1 2 105 1 105 1 105 3 106 3 106 3 106 1 0 1 3 3 3 2 108 1 108 1 108 3 109 3 109 3 109 4 18 7 107 7 110 4 18 7 110 7 18 5 19 10 111 10 112 6 113 113 35 113 35 7 114 114 64 114 64 7 64 64 64 64 64 8 115 115 116 115 116 5 66 10 66 10 66 6 118 35 27 35 33 7 119 64 50 64 62 8 120 116 85 116 103 1 0 1 1 3 1 2 122 1 122 1 122 3 123 3 123 3 123 4 18 7 110 7 124 4 18 7 124 7 124 5 19 10 125 10 126 6 127 127 35 127 35 7 128 128 64 128 64 8 129 129 116 129 116 9 104 117 121 130 121 @COLORS 1 90 90 90 2 62 62 62 3 0 255 127 4 0 178 88 5 127 0 255 6 88 0 178 7 148 148 148 8 103 103 103 9 128 255 0 10 89 178 0 11 255 0 128 12 178 0 89 13 0 128 255 14 0 89 178 15 1 159 0 16 0 111 0 17 159 0 1 18 111 0 0 19 255 254 96 20 178 177 67 21 0 1 159 22 0 0 111 23 96 255 254 24 67 178 177 25 254 96 255 26 177 67 178 27 126 125 21 28 88 87 14 29 21 126 125 30 14 88 87 31 125 21 126 32 87 14 88 33 255 116 116 34 178 81 81 35 116 255 116 36 81 178 81 37 116 116 255 38 81 81 178 39 228 227 0 40 159 158 0 41 28 255 27 42 19 178 18 43 255 27 28 44 178 18 19 45 0 228 227 46 0 159 158 47 227 0 228 48 158 0 159 49 27 28 255 50 18 19 178 51 59 59 59 52 41 41 41 53 234 195 176 54 163 136 123 55 175 196 255 56 122 137 178 57 171 194 68 58 119 135 47 59 194 68 171 60 135 47 119 61 68 171 194 62 47 119 135 63 72 184 71 64 50 128 49 65 184 71 72 66 128 49 50 67 71 72 184 68 49 50 128 69 169 255 188 70 118 178 131 71 252 179 63 72 176 125 44 73 63 252 179 74 44 176 125 75 179 63 252 76 125 44 176 77 80 9 0 78 56 6 0 79 0 80 9 80 0 56 6 81 9 0 80 82 6 0 56 83 255 175 250 84 178 122 175 85 199 134 213 86 139 93 149 87 115 100 95 88 80 70 66 89 188 163 0 90 131 114 0 91 0 188 163 92 0 131 114 93 163 0 188 94 114 0 131 95 203 73 0 96 142 51 0 97 0 203 73 98 0 142 51 99 73 0 203 100 51 0 142 101 94 189 0 102 65 132 0 103 189 0 94 104 132 0 65 golly-2.5-src/Rules/Devore.rule0000644000175100001440000001442612156145314013431 00000000000000@RULE Devore Devore's cellular automaton (a variation on Codd's CA). See patterns in Patterns/Devore/. Devore,J. and Hightower,R. (1992) The Devore variation of the Codd self-replicating computer, Third Workshop on Artificial Life, Santa Fe, New Mexico, Original work carried out in the 1970s though apparently never published. Reported by John R. Koza, "Artificial life: spontaneous emergence of self-replicating and evolutionary self-improving computer programs," in Christopher G. Langton, Artificial Life III, Proc. Volume XVII Santa Fe Institute Studies in the Sciences of Complexity, Addison-Wesley Publishing Company, New York, 1994, p. 260. @TABLE n_states:8 neighborhood:vonNeumann symmetries:rotate4 var a={4,5} 0,0,0,0,4,0 # j 0,0,0,0,5,0 0,0,0,0,6,2 0,0,0,1,4,0 0,0,0,1,6,2 0,0,0,2,5,2 0,0,0,2,6,2 0,0,0,3,5,0 0,0,0,4,1,0 0,0,0,4,2,2 0,0,0,6,1,2 0,0,0,6,2,2 0,0,0,6,6,2 0,0,1,0,4,0 0,0,1,0,5,0 0,0,1,0,6,2 0,0,1,0,7,3 0,0,1,1,6,2 0,0,1,6,2,2 0,0,1,6,6,2 0,0,2,0,6,2 0,0,2,1,3,1 0,0,2,2,6,2 0,0,2,6,1,2 0,0,2,6,2,2 0,0,2,6,6,2 0,0,2,7,2,1 0,0,2,7,3,0 0,0,3,0,7,0 0,0,3,1,2,1 0,0,3,6,3,1 0,0,3,7,2,0 0,0,6,2,2,2 0,0,6,6,1,2 0,0,6,6,2,2 0,1,1,1,6,2 0,1,1,2,4,1 0,1,1,2,5,1 0,1,1,2,6,1 0,1,1,2,7,1 0,1,1,4,2,1 0,1,1,5,2,1 0,1,1,6,2,1 0,1,1,6,6,3 0,1,1,7,2,1 0,1,1,7,3,1 0,1,2,1,2,1 0,1,2,1,3,1 0,1,2,1,4,1 0,1,2,1,5,1 0,1,2,1,6,1 0,1,2,1,7,1 0,1,2,2,2,7 0,1,2,2,3,1 0,1,2,2,4,1 0,1,2,2,5,1 0,1,2,2,6,1 0,1,2,2,7,1 0,1,2,3,2,6 0,1,2,3,5,1 0,1,2,4,2,1 0,1,2,4,3,1 0,1,2,4,4,1 0,1,2,5,2,1 0,1,2,5,3,1 0,1,2,5,5,1 0,1,2,6,2,1 0,1,2,6,6,1 0,1,2,7,2,1 0,1,2,7,3,1 0,1,2,7,7,1 0,1,3,2,2,1 0,1,3,2,4,1 0,1,3,4,2,1 0,1,3,4,3,1 0,1,3,4,4,1 0,1,3,5,2,1 0,1,3,6,2,1 0,1,3,7,2,1 0,1,3,7,3,1 0,1,4,2,2,1 0,1,4,2,3,1 0,1,4,2,4,1 0,1,4,3,2,1 0,1,4,3,3,1 0,1,4,4,2,1 0,1,5,2,2,1 0,1,5,2,3,1 0,1,5,2,5,1 0,1,5,3,2,1 0,1,5,5,2,1 0,1,6,2,2,1 0,1,6,2,3,1 0,1,6,2,6,1 0,1,6,6,2,1 0,1,6,6,6,3 0,1,7,2,2,1 0,1,7,2,3,1 0,1,7,2,7,1 0,1,7,7,2,1 0,2,2,2,6,2 0,2,2,6,6,2 0,2,3,2,6,1 0,2,6,6,6,2 1,0,0,0,4,0 1,0,0,0,5,0 1,0,0,0,6,6 1,0,0,0,7,3 1,0,0,1,4,0 1,0,0,1,5,3 1,0,0,1,6,6 1,0,0,1,7,2 1,0,0,2,4,4 1,0,0,2,6,6 1,0,0,3,6,2 1,0,0,5,1,3 1,0,0,5,2,5 1,0,0,6,1,6 1,0,0,6,2,6 1,0,0,6,3,2 1,0,0,6,6,6 1,0,0,7,1,2 1,0,1,0,4,0 1,0,1,0,5,0 1,0,1,0,6,6 1,0,1,0,7,2 1,0,1,1,6,6 1,0,1,2,6,6 1,0,1,6,1,6 1,0,1,6,2,6 1,0,1,6,6,6 1,0,2,2,6,6 1,0,2,5,2,5 1,0,2,6,1,6 1,0,2,6,2,6 1,0,2,6,6,6 1,0,2,7,2,7 1,0,3,5,2,5 1,0,6,0,6,6 1,0,6,1,1,6 1,0,6,1,6,6 1,0,6,2,1,6 1,0,6,2,2,6 1,0,6,2,6,6 1,0,6,6,1,6 1,0,6,6,6,6 1,1,1,1,4,0 1,1,1,1,5,6 1,1,1,1,6,6 1,1,1,2,4,4 1,1,1,2,5,5 1,1,1,2,6,6 1,1,1,2,7,7 1,1,1,4,2,4 1,1,1,5,2,5 1,1,1,6,2,6 1,1,1,6,6,6 1,1,1,7,2,7 1,1,2,1,4,4 1,1,2,1,5,5 1,1,2,1,6,6 1,1,2,1,7,7 1,1,2,2,4,4 1,1,2,2,5,5 1,1,2,2,6,6 1,1,2,2,7,7 1,1,2,3,5,5 1,1,2,4,2,4 1,1,2,4,3,1 1,1,2,4,4,3 1,1,2,5,2,5 1,1,2,5,3,1 1,1,2,5,5,3 1,1,2,6,2,6 1,1,2,6,3,1 1,1,2,6,6,3 1,1,2,7,2,7 1,1,2,7,3,1 1,1,2,7,7,3 1,1,3,4,2,1 1,1,3,4,3,7 1,1,3,5,2,1 1,1,3,5,3,7 1,1,3,6,2,1 1,1,3,6,3,7 1,1,3,7,2,1 1,1,3,7,3,7 1,1,3,7,6,7 1,1,3,7,7,1 1,1,4,2,2,4 1,1,4,2,4,5 1,1,4,3,2,4 1,1,4,4,2,4 1,1,5,2,2,5 1,1,5,2,5,6 1,1,5,5,2,5 1,1,6,2,2,6 1,1,6,6,2,6 1,1,6,7,2,1 1,1,7,2,2,7 1,1,7,2,7,4 1,1,7,7,2,7 1,2,2,2,3,3 1,2,2,2,4,4 1,2,2,2,5,5 1,2,2,2,6,6 1,2,2,2,7,7 1,2,2,3,5,5 1,2,2,3,6,6 1,2,2,4,3,4 1,2,2,4,4,1 1,2,2,5,3,5 1,2,2,5,5,1 1,2,2,6,3,6 1,2,2,6,6,1 1,2,2,7,7,1 1,2,3,2,4,4 1,2,3,2,5,5 1,2,3,2,6,6 1,2,3,2,7,7 1,2,3,6,3,6 1,2,3,7,3,7 1,2,5,3,3,5 1,2,6,2,6,6 1,3,3,3,6,6 2,0,0,0,4,2 2,0,0,0,5,2 2,0,0,0,6,0 2,0,0,0,7,1 2,0,0,1,4,2 2,0,0,1,5,2 2,0,0,1,6,2 2,0,0,1,7,1 2,0,0,2,4,2 2,0,0,2,5,3 2,0,0,2,6,2 2,0,0,2,7,2 2,0,0,3,4,2 2,0,0,3,5,2 2,0,0,3,6,2 2,0,0,3,7,2 2,0,0,4,1,2 2,0,0,4,2,3 2,0,0,5,1,2 2,0,0,5,2,2 2,0,0,5,3,2 2,0,0,6,1,2 2,0,0,6,2,2 2,0,0,6,3,2 2,0,0,7,1,1 2,0,0,7,2,2 2,0,0,7,3,2 2,0,1,0,4,2 2,0,1,0,5,2 2,0,1,0,6,0 2,0,1,0,7,1 2,0,1,1,4,2 2,0,1,1,5,2 2,0,1,1,6,2 2,0,1,1,7,1 2,0,1,4,1,2 2,0,1,4,2,3 2,0,1,5,1,2 2,0,1,5,2,2 2,0,1,5,3,2 2,0,1,6,1,2 2,0,1,6,2,2 2,0,1,7,1,1 2,0,1,7,2,2 2,0,2,0,6,2 2,0,2,0,7,3 2,0,2,1,4,2 2,0,2,1,5,2 2,0,2,1,6,2 2,0,2,1,7,2 2,0,2,2,4,2 2,0,2,2,5,2 2,0,2,2,6,2 2,0,2,2,7,2 2,0,2,4,1,2 2,0,2,4,2,2 2,0,2,4,3,2 2,0,2,5,1,3 2,0,2,5,2,2 2,0,2,5,3,2 2,0,2,6,1,2 2,0,2,6,2,2 2,0,2,6,3,2 2,0,2,6,6,2 2,0,2,7,1,2 2,0,2,7,2,2 2,0,2,7,3,2 2,0,2,7,7,2 2,0,3,0,6,3 2,0,3,0,7,3 2,0,3,1,6,2 2,0,3,1,7,2 2,0,3,4,1,2 2,0,3,4,2,2 2,0,3,4,3,2 2,0,3,5,2,2 2,0,3,5,3,2 2,0,3,6,2,2 2,0,3,7,1,2 2,0,3,7,2,2 2,0,3,7,3,2 2,0,4,1,2,2 2,0,4,2,2,2 2,0,5,1,2,2 2,0,5,2,2,2 2,0,6,1,2,2 2,0,6,1,3,2 2,0,6,2,2,2 2,0,6,6,2,2 2,0,7,1,2,2 2,0,7,2,2,2 2,0,7,3,2,2 2,0,7,7,2,2 2,1,1,1,4,2 2,1,1,1,5,2 2,1,1,1,6,5 2,1,1,1,7,1 2,1,1,6,2,2 2,1,2,2,4,2 2,1,2,2,5,2 2,1,2,2,6,2 2,1,2,2,7,2 2,1,2,3,2,3 2,1,2,3,4,2 2,1,2,3,5,2 2,1,2,3,6,2 2,1,2,3,7,2 2,1,3,2,6,2 2,1,3,2,7,2 2,1,4,2,2,2 2,1,5,2,2,2 2,1,5,3,2,2 2,1,5,3,3,2 2,1,6,2,2,2 2,1,6,2,3,2 2,1,6,3,2,2 2,1,7,2,2,2 2,1,7,2,3,2 2,1,7,3,2,2 2,1,7,7,2,2 2,2,2,2,4,2 2,2,2,2,5,2 2,2,2,2,6,2 2,2,2,2,7,2 2,2,2,3,4,2 2,2,2,4,3,2 2,2,2,4,4,2 2,2,2,5,3,2 2,2,2,5,5,2 2,2,2,6,3,2 2,2,2,6,6,2 2,2,2,6,7,2 2,2,2,7,3,2 2,2,2,7,6,2 2,2,2,7,7,2 2,2,3,7,6,2 2,2,3,7,7,2 2,2,6,7,3,2 2,2,7,7,3,2 3,0,0,0,2,2 3,0,0,0,4,3 3,0,0,0,5,3 3,0,0,0,6,1 3,0,0,1,1,1 3,0,0,2,5,1 3,0,0,2,6,0 3,0,0,2,7,0 3,0,0,4,2,1 3,0,0,5,2,3 3,0,0,6,2,0 3,0,0,7,2,0 3,0,1,0,2,2 3,0,1,0,3,2 3,0,1,0,4,3 3,0,1,0,5,3 3,0,1,0,6,4 3,0,1,0,7,7 3,0,1,1,1,1 3,0,1,5,2,3 3,0,1,6,2,0 3,0,1,7,2,0 3,0,2,6,1,0 3,0,2,7,1,0 3,1,1,1,1,1 3,1,1,1,2,1 3,1,1,1,3,1 3,1,1,7,2,7 3,1,2,3,2,2 3,2,2,2,7,3 4,0,0,0,1,0 4,0,0,0,2,1 4,0,0,2,1,0 4,0,1,0,2,0 4,0,1,1,2,0 4,0,1,2,1,0 4,0,1,2,2,0 4,0,2,1,1,0 4,0,2,1,2,0 4,0,2,2,1,0 4,0,2,2,2,1 4,0,2,3,2,1 4,0,3,2,2,1 5,0,0,0,2,1 5,0,0,2,1,0 5,0,1,0,2,0 5,0,1,1,1,0 5,0,1,1,2,0 5,0,1,2,1,0 5,0,1,2,2,0 5,0,2,0,2,1 5,0,2,1,1,0 5,0,2,1,2,0 5,0,2,2,1,0 5,0,2,2,2,1 5,0,2,2,3,1 5,0,3,2,2,1 5,0,3,3,2,1 6,0,0,0,0,1 6,0,0,0,1,0 6,0,0,0,2,1 6,0,0,1,1,0 6,0,0,1,2,0 6,0,0,2,1,0 6,0,0,2,2,1 6,0,1,0,1,0 6,0,1,0,2,0 6,0,1,1,1,0 6,0,1,1,2,0 6,0,1,2,1,0 6,0,1,2,2,0 6,0,2,0,2,1 6,0,2,1,1,0 6,0,2,1,2,0 6,0,2,2,1,0 6,0,2,2,2,1 6,0,2,2,3,0 6,0,2,3,2,0 6,0,3,2,2,0 6,0,3,2,3,0 6,0,3,3,3,0 6,1,2,3,2,0 7,0,0,0,1,0 7,0,0,1,3,0 7,0,0,2,1,0 7,0,1,1,2,0 7,0,1,2,1,0 7,0,1,2,2,0 7,0,2,0,2,1 7,0,2,1,1,0 7,0,2,1,2,0 7,0,2,2,1,0 7,0,2,2,2,1 7,0,2,3,2,0 7,0,3,1,3,0 7,0,3,2,3,0 7,1,2,2,2,0 # End of ruleset @COLORS 1 0 0 255 2 0 220 0 3 255 255 0 4 0 255 255 5 255 0 255 6 255 0 0 7 255 255 255 golly-2.5-src/Rules/DLA-Margolus-emulated.rule0000644000175100001440000001107012156145314016162 00000000000000@RULE DLA-Margolus-emulated @TREE num_states=7 num_neighbors=8 num_nodes=204 1 0 2 2 4 4 6 6 1 0 1 2 3 4 5 6 2 0 1 0 1 0 1 0 2 1 1 1 1 1 1 1 1 0 2 1 4 3 6 5 2 0 1 4 1 4 1 4 3 2 3 5 3 5 3 5 3 3 3 3 3 3 3 3 3 5 3 5 3 5 3 5 4 6 7 8 7 8 7 8 4 7 7 7 7 7 7 7 2 4 1 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 7 13 5 9 10 14 10 14 10 14 1 0 1 1 3 3 5 5 2 16 1 16 1 16 1 16 3 17 3 17 3 17 3 17 4 18 7 18 7 18 7 18 5 19 10 19 10 19 10 19 1 0 2 2 2 4 6 6 1 0 2 2 6 4 6 6 2 0 1 21 1 0 1 22 1 0 4 2 4 4 6 6 2 0 1 0 1 24 1 0 2 0 1 22 1 0 1 0 3 2 3 23 3 25 3 26 4 27 7 27 7 27 7 27 5 28 10 28 10 28 10 28 1 0 4 2 2 4 6 6 2 0 1 30 1 0 1 0 2 0 1 21 1 24 1 0 3 2 3 31 3 32 3 2 4 33 7 33 7 33 7 33 5 34 10 34 10 34 10 34 2 0 1 0 1 0 1 22 3 2 3 36 3 2 3 26 4 37 7 37 7 37 7 37 5 38 10 38 10 38 10 38 6 15 20 29 20 35 20 39 5 10 10 10 10 10 10 10 6 20 20 41 20 41 20 41 3 2 3 2 3 2 3 2 1 0 1 2 3 2 5 6 1 0 1 2 3 6 5 6 2 1 1 44 1 1 1 45 3 46 46 3 46 3 46 3 1 0 1 4 3 4 5 6 2 1 1 1 1 48 1 1 3 49 49 3 49 3 49 3 2 1 1 45 1 1 1 1 3 51 51 3 51 3 51 3 4 43 47 43 50 43 52 43 5 53 10 53 10 53 10 53 4 27 47 27 50 27 52 27 5 55 10 55 10 55 10 55 4 33 47 33 50 33 52 33 5 57 10 57 10 57 10 57 4 37 47 37 50 37 52 37 5 59 10 59 10 59 10 59 6 54 41 56 41 58 41 60 1 0 1 4 3 2 5 6 2 1 1 62 1 44 1 1 3 63 63 3 63 3 63 3 4 43 64 43 50 43 7 43 5 65 10 65 10 65 10 65 4 27 64 27 50 27 7 27 5 67 10 67 10 67 10 67 4 33 64 33 50 33 7 33 5 69 10 69 10 69 10 69 4 37 64 37 50 37 7 37 5 71 10 71 10 71 10 71 6 66 41 68 41 70 41 72 2 1 1 1 1 1 1 45 3 74 74 3 74 3 74 3 4 43 75 43 7 43 52 43 5 76 10 76 10 76 10 76 4 27 75 27 7 27 52 27 5 78 10 78 10 78 10 78 4 33 75 33 7 33 52 33 5 80 10 80 10 80 10 80 4 37 75 37 7 37 52 37 5 82 10 82 10 82 10 82 6 77 41 79 41 81 41 83 7 40 42 61 42 73 42 84 6 41 41 41 41 41 41 41 7 42 42 86 42 86 42 86 4 43 7 43 7 43 7 43 2 44 44 1 44 1 44 1 2 45 45 1 45 1 45 1 3 3 3 89 3 3 3 90 4 91 7 91 7 91 7 91 2 48 48 1 48 1 48 1 3 3 3 3 3 93 3 3 4 94 7 94 7 94 7 94 3 3 3 90 3 3 3 3 4 96 7 96 7 96 7 96 5 88 92 88 95 88 97 88 5 28 92 28 95 28 97 28 5 34 92 34 95 34 97 34 5 38 92 38 95 38 97 38 6 98 41 99 41 100 41 101 5 53 92 53 95 53 97 53 5 55 92 55 95 55 97 55 5 57 92 57 95 57 97 57 5 59 92 59 95 59 97 59 6 103 41 104 41 105 41 106 5 65 92 65 95 65 97 65 5 67 92 67 95 67 97 67 5 69 92 69 95 69 97 69 5 71 92 71 95 71 97 71 6 108 41 109 41 110 41 111 5 76 92 76 95 76 97 76 5 78 92 78 95 78 97 78 5 80 92 80 95 80 97 80 5 82 92 82 95 82 97 82 6 113 41 114 41 115 41 116 7 102 86 107 86 112 86 117 2 62 62 1 62 1 62 1 3 3 3 119 3 3 3 3 4 120 7 120 7 120 7 120 3 3 3 89 3 93 3 3 4 122 7 122 7 122 7 122 5 88 121 88 123 88 10 88 5 28 121 28 123 28 10 28 5 34 121 34 123 34 10 34 5 38 121 38 123 38 10 38 6 124 41 125 41 126 41 127 5 53 121 53 123 53 10 53 5 55 121 55 123 55 10 55 5 57 121 57 123 57 10 57 5 59 121 59 123 59 10 59 6 129 41 130 41 131 41 132 5 65 121 65 123 65 10 65 5 67 121 67 123 67 10 67 5 69 121 69 123 69 10 69 5 71 121 71 123 71 10 71 6 134 41 135 41 136 41 137 5 76 121 76 123 76 10 76 5 78 121 78 123 78 10 78 5 80 121 80 123 80 10 80 5 82 121 82 123 82 10 82 6 139 41 140 41 141 41 142 7 128 86 133 86 138 86 143 3 3 3 3 3 3 3 90 4 145 7 145 7 145 7 145 5 88 146 88 10 88 97 88 5 28 146 28 10 28 97 28 5 34 146 34 10 34 97 34 5 38 146 38 10 38 97 38 6 147 41 148 41 149 41 150 5 53 146 53 10 53 97 53 5 55 146 55 10 55 97 55 5 57 146 57 10 57 97 57 5 59 146 59 10 59 97 59 6 152 41 153 41 154 41 155 5 65 146 65 10 65 97 65 5 67 146 67 10 67 97 67 5 69 146 69 10 69 97 69 5 71 146 71 10 71 97 71 6 157 41 158 41 159 41 160 5 76 146 76 10 76 97 76 5 78 146 78 10 78 97 78 5 80 146 80 10 80 97 80 5 82 146 82 10 82 97 82 6 162 41 163 41 164 41 165 7 151 86 156 86 161 86 166 8 85 87 118 87 144 87 167 1 0 1 1 3 1 5 5 2 169 1 169 1 169 1 169 3 170 3 170 3 170 3 170 1 0 1 1 3 5 5 5 2 172 1 172 1 172 1 172 3 173 3 173 3 173 3 173 4 18 7 171 7 18 7 174 1 0 1 3 3 3 5 5 2 176 1 176 1 176 1 176 3 177 3 177 3 177 3 177 4 18 7 18 7 178 7 18 4 18 7 174 7 18 7 18 5 19 10 175 10 179 10 180 6 181 181 41 181 41 181 41 7 182 182 86 182 86 182 86 7 86 86 86 86 86 86 86 8 183 183 184 183 184 183 184 5 88 10 88 10 88 10 88 6 186 41 29 41 35 41 39 7 187 86 61 86 73 86 84 8 188 184 118 184 144 184 167 1 0 1 3 3 1 5 5 2 190 1 190 1 190 1 190 3 191 3 191 3 191 3 191 4 18 7 192 7 171 7 18 5 19 10 193 10 179 10 19 6 194 194 41 194 41 194 41 7 195 195 86 195 86 195 86 8 196 196 184 196 184 196 184 4 18 7 18 7 18 7 174 5 19 10 198 10 19 10 180 6 199 199 41 199 41 199 41 7 200 200 86 200 86 200 86 8 201 201 184 201 184 201 184 9 168 185 189 197 189 202 189 @COLORS 1 90 90 90 2 62 62 62 3 0 0 255 4 0 0 220 5 255 255 255 6 220 220 220 golly-2.5-src/Rules/Ed-rep.rule0000644000175100001440000000202412156145314013310 00000000000000@RULE Ed-rep Rule tree written automatically by Scripts/Python/Rule-Generators/FredkinModN-gen.py. Winograd's generalization of Fredkin's parity rule (B1357/S1357) to modulo-n: c,{s} -> sum(s)%n, where n=2 for original rule. Winograd, T. (1970) A simple algorithm for self-replication A. I. Memo 197, Project MAC. MIT. http://hdl.handle.net/1721.1/5843 @TREE num_states=7 num_neighbors=4 num_nodes=29 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 3 3 3 3 3 3 3 1 4 4 4 4 4 4 4 1 5 5 5 5 5 5 5 1 6 6 6 6 6 6 6 2 0 1 2 3 4 5 6 2 1 2 3 4 5 6 0 2 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 2 4 5 6 0 1 2 3 2 5 6 0 1 2 3 4 2 6 0 1 2 3 4 5 3 7 8 9 10 11 12 13 3 8 9 10 11 12 13 7 3 9 10 11 12 13 7 8 3 10 11 12 13 7 8 9 3 11 12 13 7 8 9 10 3 12 13 7 8 9 10 11 3 13 7 8 9 10 11 12 4 14 15 16 17 18 19 20 4 15 16 17 18 19 20 14 4 16 17 18 19 20 14 15 4 17 18 19 20 14 15 16 4 18 19 20 14 15 16 17 4 19 20 14 15 16 17 18 4 20 14 15 16 17 18 19 5 21 22 23 24 25 26 27 @COLORS 1 56 32 16 2 104 80 56 3 120 120 72 4 168 120 104 5 200 168 120 6 216 176 168 golly-2.5-src/Rules/Evoloop-finite.rule0000644000175100001440000001036512156145314015102 00000000000000@RULE Evoloop-finite @TABLE # a mod of Evoloop, using state 9 as the background # rules: 132 n_states:10 neighborhood:vonNeumann symmetries:rotate4 var a={9,2,5} var b={9,1,2,3,4,5,6,7} var c={9,1,2,3,4,5,6,7} var d={1,4,6,7} var e={1,4} var f={9,1} var g={9,1,2,3,4,5,6,7,8} var h={9,1,2,3,4,5,6,7,8} var i={2,3,4,5,6,7} var j={9,2,3,5} var k={9,2,3,4,5,6,7} var l={4,6,7} var m={2,5} var n={9,1,8} var o={9,3,5} var p={2,3,5} var q={3,5} var r={2,4,6,7} var s={9,1} var t={9,1} var u={9,1,2,3,4,7} var v={5,6} var w={1,6,7} var x={9,3,5} var y={9,3,5} var z={1,3,5} var A={9,1,3,5} var B={9,1,3,5} var C={1,3,5} var D={1,3,5} var E={9,1,2,3,4,5} var F={9,1,2,4,5} var G={1,2,4} var H={9,1,3,4,5,6} var I={9,1,2,3,4,5,6} var J={1,2,4,6} var K={9,1,2,4,5,6,7} var L={9,1,2,3,4,5,7} var M={1,2,4,6,7} var N={9,3} var O={9,1,2,3,5} var P={9,1,2,3,4} var Q={9,2,3,5,6} var R={9,1,3,4,5,6,7} var S={1,3} var T={1,2,3,5} var U={9,1,3,4,5} var V={9,1,4,5,6} var W={1,4,6} var X={2,3,5} var Y={9,5} var Z={1,2} var aa={9,1,5} var ab={9,2} var ac={2,3,4,5} var ad={2,3,4,5,6} var ae={9,3} var af={9,3} var ag={3,7} var ah={2,8} var ai={9,2,8} var aj={9,8} var ak={9,2,8} var al={6,8} var am={9,1,4,5,6,7} var an={9,1,4,5,6,7} var ao={1,4,6,7} var ap={1,3,4,5,6,7} var aq={2,3,5,8} var ar={9,1,2,3,4,5,6,7,8} var as={9,1,4,6,7} var at={1,5,6} var au={4,7} var av={1,3,4,5,7} var aw={9,4,5,7} var ax={1,4,5,6,7} var ay={9,4,5,7} var az={1,4,5,6,7} var aA={9,1,3,5,6,7} var aB={1,2,3,4,5,7} var aC={9,1,4,7} var aD={2,4,6,7,8} var aE={3,5,6} var aF={2,3,5,6} var aG={2,3,5,6} var aH={2,3} var aI={9,1,3,4,7} var aJ={2,5,6,7} var aK={1,2,3,4,6,7} var aL={1,3,4,7} var aM={9,2,3} var aN={1,2,4,7} var aO={3,6} var aP={1,2,3,4,7} var aQ={3,4,7} var aR={1,2,3,4,5,6,7} var aS={3,4,6,7,8} var aT={9,3,6} var aU={3,4,5,7} var aV={2,3,6} var aW={1,2,3,4,5,6,7} var aX={9,8} var aY={9,8} var aZ={4,5,6,7} var ba={4,6,7,8} var bb={1,2,4,6,7} var bc={4,5} var bd={4,7,8} var be={9,1,4,5,7} var bf={4,5,7} var bg={1,2,4,5,7} var bh={1,2,4,5,7} var bi={9,1,2,3,4,6,7} var bj={2,5,6} var bk={1,3,4,6,7} var bl={9,4,6,7} var bm={6,7,8} var bn={1,3,4,5,6,7} var bo={1,4,7} var bp={2,3,5,6} var bq={2,3,5,6} var br={9,1,2,3,4,5,6,7} var bs={9,1,2,3,4,5,6,7} 9,a,9,9,1,2 9,9,9,9,4,3 9,b,c,1,d,1 9,9,9,2,e,2 f,g,h,i,8,8 9,j,k,l,1,1 9,9,9,4,m,2 9,9,9,7,5,2 f,b,n,8,i,8 9,o,1,j,d,1 9,9,1,9,2,2 9,o,1,2,p,1 9,j,1,q,r,1 f,s,i,t,8,8 9,u,2,1,p,1 9,9,r,p,1,1 9,9,2,3,2,2 9,9,q,1,2,1 9,o,q,2,1,1 9,1,2,v,2,6 w,o,x,y,k,8 z,A,B,C,D,8 1,E,F,G,4,4 1,H,I,J,6,6 1,K,L,M,7,7 1,N,A,j,p,8 1,O,P,4,G,4 1,Q,I,6,J,6 1,b,R,7,M,7 1,N,S,f,T,8 1,O,e,o,4,4 1,U,J,o,6,6 1,V,M,I,7,7 1,I,W,7,3,7 1,o,2,N,4,4 S,j,p,O,5,8 C,j,p,2,X,8 1,9,2,3,2,4 1,f,2,5,2,7 1,f,2,5,4,3 1,f,2,7,3,5 1,Y,3,Z,4,4 C,aa,q,ab,D,8 1,o,5,4,Z,4 1,f,6,2,4,4 1,o,7,3,M,7 C,f,2,X,q,8 1,e,ac,6,2,6 C,f,A,5,ab,8 1,1,4,3,3,4 1,X,2,5,4,4 1,ad,2,7,3,7 1,2,4,3,3,3 1,2,6,2,7,6 X,9,9,9,9,8 2,N,ae,af,ag,1 ah,ai,aj,ak,al,9 X,am,an,d,ao,8 2,b,R,ap,3,1 aq,g,h,ar,8,9 2,as,ab,3,ap,1 2,9,9,3,2,4 2,9,9,4,2,3 X,am,an,v,at,8 2,ab,9,5,au,5 2,9,9,8,av,9 X,aw,ax,ay,az,8 2,aA,ap,ab,3,1 2,9,aB,9,8,9 2,aC,2,9,6,5 2,9,2,9,7,3 2,am,2,ax,3,1 2,aC,2,3,2,3 2,9,2,5,2,5 aD,9,2,6,Y,9 2,9,3,2,ax,1 2,ab,3,aE,2,1 2,2,aF,aG,3,1 2,2,3,4,5,1 3,9,9,9,aH,2 3,R,k,b,v,8 3,9,9,9,7,4 3,aI,R,aJ,aK,8 3,9,9,3,2,2 3,u,U,aL,ao,8 3,9,9,4,2,1 3,aM,b,aN,aO,8 3,9,1,9,2,1 3,f,aP,s,aQ,8 q,R,ax,aR,aK,8 aS,9,1,2,5,9 3,9,2,aT,2,8 3,aC,2,5,2,1 3,9,3,3,2,1 aU,ap,aR,aV,aW,8 4,aj,aX,aY,ai,1 aZ,o,x,y,ap,8 ba,9,am,M,bb,9 l,ar,g,h,8,1 4,o,x,2,q,8 bc,9,o,q,2,8 4,9,9,8,ap,1 ba,9,ao,o,M,9 4,9,ap,9,8,1 ba,9,M,bb,ap,9 bd,9,2,be,M,9 4,9,2,9,q,8 ba,9,2,C,ao,9 4,9,2,aH,2,1 au,9,2,6,2,6 ba,9,3,ao,M,9 ba,9,3,2,ao,9 4,9,3,2,2,1 bf,bg,bh,aR,aW,8 5,b,bi,aF,bj,8 5,9,9,2,3,2 5,aI,bk,bl,bi,8 5,9,1,2,1,8 5,9,2,9,m,2 5,9,2,1,5,2 5,9,2,au,5,8 5,9,3,1,2,9 6,9,2,aC,2,2 al,9,2,aF,2,9 bm,9,3,2,2,9 6,ap,bn,aR,aW,8 6,ap,2,bn,2,8 al,bo,2,2,2,9 6,aF,aG,bp,bq,8 7,9,2,2,2,1 7,9,2,3,2,9 8,b,c,br,bs,9 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 # this is the background state for Evoloop-finite 9 0 0 0 golly-2.5-src/Rules/Evoloop.rule0000644000175100001440000003760712156145314013636 00000000000000@RULE Evoloop Hiroki Sayama "Toward the Realization of an Evolving Ecosystem on Cellular Automata", Proceedings of the Fourth International Symposium on Artificial Life and Robotics (AROB 4th '99), M. Sugisaka and H. Tanaka, eds., pp.254-257, Beppu, Oita, Japan, 1999. Transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java Credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" Note that the transition table given in the above link is incomplete, and is patched by the function set_undefined_rule(). The table below has these changes incorporated, and was produced automatically by a bottom-up merging procedure from the full 9^5 rule table. See Rules/TableGenerators/make_ruletable.cpp @TABLE # rules: 132 # variables: 123 # format: C,N,E,S,W,C' # # Variables are bound within each transition. # For example, if a={1,2} then 4,a,0->a represents # two transitions: 4,1,0->1 and 4,2,0->2 n_states:9 neighborhood:vonNeumann symmetries:rotate4 var a={0,2,5} var b={0,1,2,3,4,5,6,7} var c={0,1,2,3,4,5,6,7} var d={1,4,6,7} var e={1,4} var f={0,1} var g={0,1,2,3,4,5,6,7,8} var h={0,1,2,3,4,5,6,7,8} var i={2,3,4,5,6,7} var j={0,2,3,5} var k={0,2,3,4,5,6,7} var l={4,6,7} var m={2,5} var n={0,1,8} var o={0,3,5} var p={2,3,5} var q={3,5} var r={2,4,6,7} var s={0,1} var t={0,1} var u={0,1,2,3,4,7} var v={5,6} var w={1,6,7} var x={0,3,5} var y={0,3,5} var z={1,3,5} var A={0,1,3,5} var B={0,1,3,5} var C={1,3,5} var D={1,3,5} var E={0,1,2,3,4,5} var F={0,1,2,4,5} var G={1,2,4} var H={0,1,3,4,5,6} var I={0,1,2,3,4,5,6} var J={1,2,4,6} var K={0,1,2,4,5,6,7} var L={0,1,2,3,4,5,7} var M={1,2,4,6,7} var N={0,3} var O={0,1,2,3,5} var P={0,1,2,3,4} var Q={0,2,3,5,6} var R={0,1,3,4,5,6,7} var S={1,3} var T={1,2,3,5} var U={0,1,3,4,5} var V={0,1,4,5,6} var W={1,4,6} var X={2,3,5} var Y={0,5} var Z={1,2} var aa={0,1,5} var ab={0,2} var ac={2,3,4,5} var ad={2,3,4,5,6} var ae={0,3} var af={0,3} var ag={3,7} var ah={2,8} var ai={0,2,8} var aj={0,8} var ak={0,2,8} var al={6,8} var am={0,1,4,5,6,7} var an={0,1,4,5,6,7} var ao={1,4,6,7} var ap={1,3,4,5,6,7} var aq={2,3,5,8} var ar={0,1,2,3,4,5,6,7,8} var as={0,1,4,6,7} var at={1,5,6} var au={4,7} var av={1,3,4,5,7} var aw={0,4,5,7} var ax={1,4,5,6,7} var ay={0,4,5,7} var az={1,4,5,6,7} var aA={0,1,3,5,6,7} var aB={1,2,3,4,5,7} var aC={0,1,4,7} var aD={2,4,6,7,8} var aE={3,5,6} var aF={2,3,5,6} var aG={2,3,5,6} var aH={2,3} var aI={0,1,3,4,7} var aJ={2,5,6,7} var aK={1,2,3,4,6,7} var aL={1,3,4,7} var aM={0,2,3} var aN={1,2,4,7} var aO={3,6} var aP={1,2,3,4,7} var aQ={3,4,7} var aR={1,2,3,4,5,6,7} var aS={3,4,6,7,8} var aT={0,3,6} var aU={3,4,5,7} var aV={2,3,6} var aW={1,2,3,4,5,6,7} var aX={0,8} var aY={0,8} var aZ={4,5,6,7} var ba={4,6,7,8} var bb={1,2,4,6,7} var bc={4,5} var bd={4,7,8} var be={0,1,4,5,7} var bf={4,5,7} var bg={1,2,4,5,7} var bh={1,2,4,5,7} var bi={0,1,2,3,4,6,7} var bj={2,5,6} var bk={1,3,4,6,7} var bl={0,4,6,7} var bm={6,7,8} var bn={1,3,4,5,6,7} var bo={1,4,7} var bp={2,3,5,6} var bq={2,3,5,6} var br={0,1,2,3,4,5,6,7} var bs={0,1,2,3,4,5,6,7} 0,a,0,0,1,2 0,0,0,0,4,3 0,b,c,1,d,1 0,0,0,2,e,2 f,g,h,i,8,8 0,j,k,l,1,1 0,0,0,4,m,2 0,0,0,7,5,2 f,b,n,8,i,8 0,o,1,j,d,1 0,0,1,0,2,2 0,o,1,2,p,1 0,j,1,q,r,1 f,s,i,t,8,8 0,u,2,1,p,1 0,0,r,p,1,1 0,0,2,3,2,2 0,0,q,1,2,1 0,o,q,2,1,1 0,1,2,v,2,6 w,o,x,y,k,8 z,A,B,C,D,8 1,E,F,G,4,4 1,H,I,J,6,6 1,K,L,M,7,7 1,N,A,j,p,8 1,O,P,4,G,4 1,Q,I,6,J,6 1,b,R,7,M,7 1,N,S,f,T,8 1,O,e,o,4,4 1,U,J,o,6,6 1,V,M,I,7,7 1,I,W,7,3,7 1,o,2,N,4,4 S,j,p,O,5,8 C,j,p,2,X,8 1,0,2,3,2,4 1,f,2,5,2,7 1,f,2,5,4,3 1,f,2,7,3,5 1,Y,3,Z,4,4 C,aa,q,ab,D,8 1,o,5,4,Z,4 1,f,6,2,4,4 1,o,7,3,M,7 C,f,2,X,q,8 1,e,ac,6,2,6 C,f,A,5,ab,8 1,1,4,3,3,4 1,X,2,5,4,4 1,ad,2,7,3,7 1,2,4,3,3,3 1,2,6,2,7,6 X,0,0,0,0,8 2,N,ae,af,ag,1 ah,ai,aj,ak,al,0 X,am,an,d,ao,8 2,b,R,ap,3,1 aq,g,h,ar,8,0 2,as,ab,3,ap,1 2,0,0,3,2,4 2,0,0,4,2,3 X,am,an,v,at,8 2,ab,0,5,au,5 2,0,0,8,av,0 X,aw,ax,ay,az,8 2,aA,ap,ab,3,1 2,0,aB,0,8,0 2,aC,2,0,6,5 2,0,2,0,7,3 2,am,2,ax,3,1 2,aC,2,3,2,3 2,0,2,5,2,5 aD,0,2,6,Y,0 2,0,3,2,ax,1 2,ab,3,aE,2,1 2,2,aF,aG,3,1 2,2,3,4,5,1 3,0,0,0,aH,2 3,R,k,b,v,8 3,0,0,0,7,4 3,aI,R,aJ,aK,8 3,0,0,3,2,2 3,u,U,aL,ao,8 3,0,0,4,2,1 3,aM,b,aN,aO,8 3,0,1,0,2,1 3,f,aP,s,aQ,8 q,R,ax,aR,aK,8 aS,0,1,2,5,0 3,0,2,aT,2,8 3,aC,2,5,2,1 3,0,3,3,2,1 aU,ap,aR,aV,aW,8 4,aj,aX,aY,ai,1 aZ,o,x,y,ap,8 ba,0,am,M,bb,0 l,ar,g,h,8,1 4,o,x,2,q,8 bc,0,o,q,2,8 4,0,0,8,ap,1 ba,0,ao,o,M,0 4,0,ap,0,8,1 ba,0,M,bb,ap,0 bd,0,2,be,M,0 4,0,2,0,q,8 ba,0,2,C,ao,0 4,0,2,aH,2,1 au,0,2,6,2,6 ba,0,3,ao,M,0 ba,0,3,2,ao,0 4,0,3,2,2,1 bf,bg,bh,aR,aW,8 5,b,bi,aF,bj,8 5,0,0,2,3,2 5,aI,bk,bl,bi,8 5,0,1,2,1,8 5,0,2,0,m,2 5,0,2,1,5,2 5,0,2,au,5,8 5,0,3,1,2,0 6,0,2,aC,2,2 al,0,2,aF,2,0 bm,0,3,2,2,0 6,ap,bn,aR,aW,8 6,ap,2,bn,2,8 al,bo,2,2,2,0 6,aF,aG,bp,bq,8 7,0,2,2,2,1 7,0,2,3,2,0 8,b,c,br,bs,0 @TREE num_states=9 num_neighbors=4 num_nodes=377 1 0 8 8 8 1 8 8 8 0 1 2 1 2 3 8 8 8 8 0 1 0 8 2 2 1 5 8 8 0 1 0 8 1 2 8 8 8 8 0 1 3 8 2 3 8 8 8 8 0 1 0 8 2 8 8 8 8 8 0 1 0 8 0 8 8 8 8 8 0 1 0 8 1 4 8 8 8 8 0 1 0 1 0 0 1 0 1 1 0 2 0 1 2 3 4 5 6 7 8 1 1 8 8 8 0 8 0 0 0 1 2 1 2 3 0 5 0 0 0 1 0 8 1 8 8 8 8 8 0 1 1 4 8 8 0 8 0 0 0 1 2 8 2 8 8 8 8 8 0 1 1 6 8 8 0 8 0 0 0 1 1 7 8 8 0 8 0 0 0 2 1 10 11 12 13 14 15 16 8 1 2 1 2 8 0 5 0 0 0 1 0 8 2 8 0 8 0 0 0 1 0 8 2 8 8 2 8 8 0 1 2 4 2 8 0 5 0 0 0 1 0 6 0 8 0 8 0 0 0 1 0 7 2 8 0 5 0 0 0 1 8 8 0 0 1 0 1 1 0 2 2 18 19 20 21 5 22 23 24 1 0 8 4 2 8 8 8 8 0 2 3 12 26 12 12 12 12 12 24 1 2 4 3 1 0 5 0 0 0 1 0 4 8 8 0 8 0 0 0 1 0 6 8 8 0 8 0 0 0 1 0 7 8 8 0 8 0 0 0 2 4 13 28 12 29 14 30 31 24 1 0 8 8 8 8 8 8 8 0 1 0 8 5 8 8 8 8 8 0 2 5 33 5 12 34 33 33 34 24 2 6 15 22 12 30 33 30 31 24 2 7 16 23 12 31 14 31 31 24 2 8 8 24 24 24 24 24 24 8 3 9 17 25 27 32 35 36 37 38 2 1 10 18 12 13 33 15 16 8 1 1 1 2 8 0 8 0 0 0 1 1 8 1 8 0 8 0 0 0 2 10 10 41 42 13 10 15 16 8 1 2 8 2 1 0 8 0 0 0 1 1 4 2 8 0 8 0 0 0 1 1 6 2 8 0 8 0 0 0 1 1 7 2 8 0 8 0 0 0 2 44 41 41 42 45 41 46 47 24 1 1 4 1 8 0 8 0 0 0 1 1 6 1 8 0 8 0 0 0 1 1 7 1 8 0 8 0 0 0 2 12 42 42 12 49 12 50 51 24 2 13 13 45 49 13 13 15 16 24 1 1 8 2 8 0 8 0 0 0 2 33 10 54 12 13 33 15 16 24 2 15 15 41 50 15 15 15 16 24 2 16 16 47 51 16 16 16 16 24 3 40 43 48 52 53 55 56 57 38 2 2 11 19 26 28 5 22 23 24 2 44 54 54 42 45 54 46 47 24 1 0 1 2 8 0 2 2 0 0 1 1 1 2 3 0 5 2 0 0 1 0 8 2 8 1 8 0 1 0 1 2 4 3 8 1 8 0 0 0 1 0 4 2 3 0 5 2 0 0 1 0 7 5 1 0 8 0 0 0 1 0 6 0 8 6 8 0 6 0 1 0 7 2 3 0 5 2 0 0 2 61 62 63 64 65 66 67 68 24 1 1 8 2 8 0 0 0 0 0 1 0 8 2 8 1 8 0 0 0 1 0 8 1 1 8 8 8 8 0 1 0 4 2 8 0 8 0 0 0 1 0 6 1 8 0 8 0 0 0 1 0 7 2 8 0 8 0 0 0 2 5 70 71 72 73 12 74 75 24 1 0 4 1 8 0 8 0 0 0 1 0 6 2 8 0 8 0 0 0 2 73 45 73 77 73 73 78 75 24 1 0 4 5 8 0 8 0 0 0 1 0 7 5 8 0 8 0 0 0 2 20 41 19 12 80 5 78 81 24 1 0 6 5 8 0 8 0 0 0 1 1 6 5 8 0 8 0 0 0 2 83 84 78 74 83 78 78 81 24 1 0 7 3 8 0 8 0 0 0 1 0 7 1 8 0 8 0 0 0 2 86 47 75 87 75 75 75 75 24 2 24 24 24 24 24 24 24 24 24 3 59 60 69 76 79 82 85 88 89 2 3 12 20 12 12 12 12 12 24 1 1 1 1 8 0 8 0 0 0 1 0 5 1 8 0 8 0 0 0 2 5 92 19 12 77 12 74 93 24 2 12 12 12 12 12 12 12 12 24 2 12 49 77 12 77 12 74 87 24 2 12 50 74 12 74 12 74 87 24 2 12 51 87 12 87 12 87 87 24 3 91 52 94 95 96 95 97 98 89 2 4 13 21 12 29 34 30 31 24 1 0 3 2 8 0 8 0 0 0 2 73 45 73 77 73 101 78 75 24 2 29 13 73 77 29 29 30 31 24 2 33 13 73 12 29 33 30 31 24 2 30 15 73 74 30 30 30 31 24 2 31 16 75 87 31 31 31 31 24 3 100 53 102 96 103 104 105 106 89 2 5 14 5 12 14 33 33 14 24 1 1 8 2 0 0 8 0 0 0 2 33 10 109 12 13 33 15 16 24 1 1 8 2 8 0 2 0 0 0 2 20 111 19 12 73 5 22 75 24 2 12 12 12 12 5 12 12 12 24 2 33 33 5 12 33 33 33 33 24 2 33 15 78 12 30 33 30 31 24 2 33 16 75 12 31 33 31 31 24 3 108 110 112 113 104 114 115 116 89 2 15 15 46 50 15 15 15 16 24 2 83 46 78 74 78 78 78 75 24 2 30 15 78 74 30 30 30 31 24 3 36 118 119 97 120 115 120 106 89 2 7 16 23 12 31 34 31 31 24 3 122 57 88 98 106 116 106 106 89 3 38 38 89 89 89 89 89 89 38 4 39 58 90 99 107 117 121 123 124 2 1 10 44 12 13 33 15 16 8 2 10 10 54 42 13 10 15 16 8 2 11 41 54 42 45 109 46 47 24 2 14 10 54 12 13 33 15 16 24 3 126 127 128 52 53 129 118 57 38 1 1 8 8 8 8 8 8 8 0 1 1 1 2 8 8 8 8 8 0 1 1 8 1 8 8 8 8 8 0 1 1 4 8 8 8 8 8 8 0 1 1 6 8 8 8 8 8 8 0 1 1 7 8 8 8 8 8 8 0 2 10 131 132 133 134 131 135 136 8 1 1 4 2 8 8 8 8 8 0 1 1 6 2 8 8 8 8 8 0 1 1 7 2 8 8 8 8 8 0 2 54 132 132 133 138 132 139 140 24 1 1 4 1 8 8 8 8 8 0 1 1 6 1 8 8 8 8 8 0 1 1 7 1 8 8 8 8 8 0 2 42 133 133 133 142 133 143 144 24 2 13 134 138 142 134 134 135 136 24 1 1 8 2 8 8 8 8 8 0 2 10 131 147 133 134 131 135 136 24 2 15 135 132 143 135 135 135 136 24 2 16 136 140 144 136 136 136 136 24 3 43 137 141 145 146 148 149 150 38 2 18 41 41 42 45 54 41 47 24 2 41 132 132 133 138 147 132 140 24 1 1 1 2 3 8 8 8 8 0 1 1 1 2 8 8 8 0 8 0 1 1 1 3 8 8 8 8 8 0 1 1 4 2 3 8 8 8 8 0 1 6 7 2 1 8 8 8 8 0 1 6 6 2 8 8 8 8 8 0 1 1 7 2 3 8 8 8 8 0 2 62 154 155 156 157 158 159 160 24 1 1 1 1 8 8 8 8 8 0 2 92 162 132 162 142 133 143 144 24 2 45 138 138 142 138 138 139 140 24 2 111 132 147 133 138 147 139 140 24 2 46 139 139 143 139 139 139 140 24 2 47 140 140 144 140 140 140 140 24 3 152 153 161 163 164 165 166 167 89 1 1 5 1 8 8 8 8 8 0 2 70 162 147 133 142 133 143 169 24 2 12 133 133 12 142 12 143 144 24 2 49 142 142 142 142 142 143 144 24 2 50 143 143 143 143 143 143 144 24 2 51 144 144 144 144 144 144 144 24 3 52 145 170 171 172 171 173 174 89 1 1 3 2 8 8 8 8 8 0 2 45 138 138 142 138 176 139 140 24 2 15 135 138 143 135 135 135 136 24 3 53 146 177 172 146 146 178 150 89 2 33 10 41 12 13 33 15 16 24 2 10 131 132 133 134 131 135 136 24 2 41 132 147 133 138 147 139 140 24 2 33 131 147 12 134 33 135 136 24 2 15 135 139 143 135 135 135 136 24 3 180 181 182 171 146 183 184 150 89 2 84 139 139 143 139 139 139 140 24 3 118 184 186 173 184 184 184 150 89 3 57 150 167 174 150 150 150 150 89 4 130 151 168 175 179 185 187 188 124 2 2 44 61 5 73 20 83 86 24 2 18 41 62 92 45 111 46 47 24 2 19 41 63 19 73 19 78 75 24 2 20 42 64 12 77 12 74 87 24 2 21 45 65 77 73 73 78 75 24 2 5 41 66 12 101 5 78 75 24 2 22 46 67 74 78 22 78 75 24 2 23 47 68 93 75 75 75 75 24 3 190 191 192 193 194 195 196 197 89 2 11 54 62 70 45 41 84 47 24 2 41 132 154 162 138 132 139 140 24 2 54 132 155 147 138 147 139 140 24 2 42 133 156 133 142 133 143 144 24 2 45 138 157 142 138 138 139 140 24 2 109 132 158 133 176 147 139 140 24 2 46 139 159 143 139 139 139 140 24 2 47 140 160 169 140 140 140 140 24 3 199 200 201 202 203 204 205 206 89 2 19 54 63 71 73 19 78 75 24 2 41 132 155 132 138 147 139 140 24 1 0 4 2 8 8 8 0 8 0 1 0 6 2 8 8 8 8 8 0 1 0 7 2 8 8 8 0 8 0 2 63 155 5 12 210 5 211 212 24 1 0 4 2 8 8 8 8 8 0 1 0 6 1 8 8 8 8 8 0 1 0 7 2 8 8 8 8 8 0 2 19 147 12 12 214 12 215 216 24 2 73 138 210 214 214 214 211 216 24 2 19 147 5 12 214 5 211 216 24 2 78 139 211 215 211 211 211 216 24 2 75 140 212 216 216 216 216 216 24 3 208 209 213 217 218 219 220 221 89 2 26 42 64 72 77 12 74 87 24 2 42 133 156 162 142 133 143 144 24 2 71 132 12 12 214 12 215 216 24 1 0 4 1 8 8 8 8 8 0 1 0 7 1 8 8 8 8 8 0 2 12 133 12 12 226 12 215 227 24 1 0 4 3 8 8 8 8 8 0 1 0 3 1 8 8 8 8 8 0 2 77 142 229 230 226 226 215 227 24 2 74 143 215 215 215 215 215 227 24 1 0 7 3 8 8 8 8 8 0 2 87 144 233 227 227 227 227 227 24 3 223 224 225 228 231 228 232 234 89 2 28 45 65 73 73 80 83 75 24 2 77 142 229 226 226 226 215 227 24 1 0 4 2 3 8 8 8 8 0 2 73 138 238 226 214 214 211 216 24 1 0 4 2 1 8 8 8 8 0 2 73 138 240 226 214 214 211 216 24 1 0 7 2 3 8 8 8 8 0 2 75 140 242 227 216 216 216 216 24 3 236 203 218 237 239 241 220 243 89 2 5 54 66 12 73 5 78 75 24 2 54 147 158 133 138 147 139 140 24 2 5 147 5 12 214 5 211 216 24 1 0 7 2 1 8 8 8 8 0 2 75 140 248 227 216 216 216 216 24 3 245 246 219 228 241 247 220 249 89 2 22 46 67 74 78 78 78 75 24 2 41 132 159 143 139 139 139 140 24 2 73 138 211 215 211 211 211 216 24 2 75 140 211 227 216 216 216 216 24 3 251 252 220 232 253 220 220 254 89 2 23 47 68 75 75 81 81 75 24 2 47 140 160 144 140 140 140 140 24 3 256 257 221 234 243 249 254 243 89 3 89 89 89 89 89 89 89 89 89 4 198 207 222 235 244 250 255 258 259 2 3 12 5 12 12 12 12 12 24 2 12 42 70 12 49 12 50 51 24 2 26 42 71 12 77 12 74 87 24 2 12 12 72 12 12 12 12 12 24 2 12 49 73 12 77 5 74 87 24 2 12 51 75 12 87 12 87 87 24 3 261 262 263 264 265 95 97 266 89 2 12 42 92 12 49 12 50 51 24 2 42 133 162 133 142 133 143 144 24 2 42 133 132 133 142 133 143 144 24 2 12 133 162 12 142 12 143 144 24 3 268 269 270 271 172 171 173 174 89 2 20 42 19 12 77 12 74 87 24 2 42 133 147 133 142 133 143 144 24 2 64 156 12 12 229 12 215 233 24 2 77 142 214 226 226 226 215 227 24 2 87 144 216 227 227 227 227 227 24 3 273 274 275 228 276 228 232 277 89 2 72 162 12 12 230 12 215 227 24 2 12 142 226 12 226 12 215 227 24 2 12 143 215 12 215 12 215 227 24 2 12 144 227 12 227 12 227 227 24 3 95 171 279 95 280 95 281 282 89 2 12 142 230 12 226 12 215 227 24 2 77 142 226 226 226 226 215 227 24 2 87 144 227 227 227 227 227 227 24 3 96 172 276 284 285 280 232 286 89 3 95 171 228 95 280 95 281 282 89 3 97 173 232 281 232 281 232 286 89 2 12 51 93 12 87 12 87 87 24 2 51 144 169 144 144 144 144 144 24 3 290 291 277 282 286 282 286 286 89 4 267 272 278 283 287 288 289 292 259 2 4 13 73 12 29 33 30 31 24 2 28 45 73 77 73 73 78 75 24 2 14 13 73 12 29 33 30 31 24 3 294 53 295 96 103 296 120 106 89 3 53 146 164 172 146 146 184 150 89 2 21 45 73 77 73 73 73 75 24 2 45 138 138 142 138 138 138 140 24 2 65 157 210 229 238 240 211 242 24 2 77 142 214 230 226 226 215 227 24 2 73 138 214 226 214 214 211 216 24 2 75 140 216 227 216 216 216 216 24 3 299 300 301 302 303 303 220 304 89 2 73 142 214 226 226 226 215 227 24 2 5 142 226 12 226 12 215 227 24 3 96 172 306 280 285 307 232 286 89 1 0 4 8 8 8 8 8 8 0 1 0 6 8 8 8 8 8 8 0 1 0 7 8 8 8 8 8 8 0 2 29 134 214 226 309 309 310 311 24 2 30 135 211 215 310 310 310 311 24 2 31 136 216 227 311 311 311 311 24 3 103 146 303 285 312 312 313 314 89 2 34 13 101 12 29 33 30 31 24 2 13 134 176 142 134 134 135 136 24 2 80 138 214 226 214 214 211 216 24 2 33 134 214 12 309 33 310 311 24 3 316 317 318 280 312 319 313 314 89 2 83 139 211 215 211 211 211 216 24 3 120 184 321 232 313 313 313 314 89 3 106 150 304 286 314 314 314 314 89 4 297 298 305 308 315 320 322 323 259 2 5 33 20 12 33 33 33 33 24 2 5 54 19 12 73 5 78 75 24 2 34 13 80 12 29 33 30 31 24 2 34 16 81 12 31 33 31 31 24 3 325 180 326 95 327 114 115 328 89 2 14 10 111 12 13 33 15 16 24 2 54 147 147 133 138 147 139 140 24 3 330 181 331 171 146 183 184 150 89 2 5 109 19 12 73 5 78 75 24 2 66 158 5 12 240 5 211 248 24 2 101 176 214 226 214 214 211 216 24 3 333 182 334 228 335 247 220 304 89 2 14 13 73 5 29 33 30 31 24 3 337 146 303 280 312 319 313 314 89 2 33 135 211 12 310 33 310 311 24 2 33 136 216 12 311 33 311 311 24 3 114 183 247 95 319 114 339 340 89 2 33 15 22 12 30 33 30 31 24 3 342 184 220 281 313 339 313 314 89 2 14 16 75 12 31 33 31 31 24 3 344 150 304 282 314 340 314 314 89 4 329 332 336 288 338 341 343 345 259 2 6 15 83 12 30 33 30 31 24 2 15 15 84 50 15 15 15 16 24 2 22 41 78 74 73 78 78 75 24 2 30 15 83 74 30 30 30 31 24 2 31 16 81 87 31 31 31 31 24 3 347 348 349 97 350 115 120 351 89 2 46 132 139 143 138 139 139 140 24 3 118 184 353 173 184 184 184 150 89 2 22 46 78 74 78 78 78 75 24 2 67 159 211 215 211 211 211 211 24 2 22 139 211 215 211 211 211 216 24 3 355 166 356 232 220 357 220 304 89 3 120 184 220 232 313 313 313 314 89 3 115 184 220 281 313 339 313 314 89 4 352 354 358 289 359 360 359 323 259 2 7 16 86 12 31 33 31 31 24 2 23 47 75 87 75 75 75 75 24 3 362 57 363 98 106 344 106 106 89 2 68 160 212 233 242 248 211 242 24 2 93 169 216 227 227 227 227 227 24 3 363 167 365 366 304 304 304 304 89 2 75 144 216 227 227 227 227 227 24 3 98 174 368 282 286 282 286 286 89 2 34 16 75 12 31 33 31 31 24 2 81 140 216 227 216 216 216 216 24 3 370 150 371 282 314 340 314 314 89 3 106 150 371 286 314 314 314 314 89 4 364 188 367 369 323 372 373 323 259 4 124 124 259 259 259 259 259 259 124 5 125 189 260 293 324 346 361 374 375 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 # this is the background state for Evoloop-finite 9 0 0 0 golly-2.5-src/Rules/HPPMargolus_emulated.rule0000644000175100001440000000426112156145314016222 00000000000000@RULE HPPMargolus_emulated @TREE num_states=5 num_neighbors=8 num_nodes=132 1 0 2 2 4 4 1 0 1 2 3 4 2 0 1 0 1 0 2 1 1 1 1 1 1 0 2 1 4 3 2 0 1 4 1 4 3 2 3 5 3 5 3 3 3 3 3 3 3 5 3 5 3 5 4 6 7 8 7 8 4 7 7 7 7 7 2 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 5 9 10 14 10 14 1 0 1 1 3 3 2 16 1 16 1 16 3 17 3 17 3 17 4 18 7 18 7 18 5 19 10 19 10 19 1 0 2 2 2 4 2 0 1 21 1 21 1 0 4 2 2 4 2 0 1 21 1 23 3 2 3 22 3 24 4 25 7 25 7 25 5 26 10 26 10 26 1 0 4 2 4 4 2 0 1 23 1 28 2 0 1 28 1 28 3 2 3 29 3 30 4 31 7 31 7 31 5 32 10 32 10 32 6 15 20 27 20 33 5 10 10 10 10 10 6 20 20 35 20 35 3 2 3 2 3 2 1 0 1 2 3 2 2 1 1 38 1 38 3 39 39 3 39 3 1 0 1 4 3 2 2 1 1 38 1 41 3 42 42 3 42 3 4 37 40 37 43 37 5 44 10 44 10 44 4 25 40 25 43 25 5 46 10 46 10 46 4 31 40 31 43 31 5 48 10 48 10 48 6 45 35 47 35 49 1 0 1 4 3 4 2 1 1 41 1 51 3 52 52 3 52 3 2 1 1 51 1 51 3 54 54 3 54 3 4 37 53 37 55 37 5 56 10 56 10 56 4 25 53 25 55 25 5 58 10 58 10 58 4 31 53 31 55 31 5 60 10 60 10 60 6 57 35 59 35 61 7 34 36 50 36 62 6 35 35 35 35 35 7 36 36 64 36 64 4 37 7 37 7 37 2 38 38 1 38 1 3 3 3 67 3 67 4 68 7 68 7 68 2 41 41 1 41 1 3 3 3 67 3 70 4 71 7 71 7 71 5 66 69 66 72 66 5 26 69 26 72 26 5 32 69 32 72 32 6 73 35 74 35 75 5 44 69 44 72 44 5 46 69 46 72 46 5 48 69 48 72 48 6 77 35 78 35 79 5 56 69 56 72 56 5 58 69 58 72 58 5 60 69 60 72 60 6 81 35 82 35 83 7 76 64 80 64 84 2 51 51 1 51 1 3 3 3 70 3 86 4 87 7 87 7 87 3 3 3 86 3 86 4 89 7 89 7 89 5 66 88 66 90 66 5 26 88 26 90 26 5 32 88 32 90 32 6 91 35 92 35 93 5 44 88 44 90 44 5 46 88 46 90 46 5 48 88 48 90 48 6 95 35 96 35 97 5 56 88 56 90 56 5 58 88 58 90 58 5 60 88 60 90 60 6 99 35 100 35 101 7 94 64 98 64 102 8 63 65 85 65 103 1 0 1 1 3 1 2 105 1 105 1 105 3 106 3 106 3 106 4 18 7 107 7 107 1 0 1 3 3 1 2 109 1 109 1 109 3 110 3 110 3 110 4 18 7 107 7 111 5 19 10 108 10 112 6 113 113 35 113 35 7 114 114 64 114 64 7 64 64 64 64 64 8 115 115 116 115 116 5 66 10 66 10 66 6 118 35 27 35 33 7 119 64 50 64 62 8 120 116 85 116 103 1 0 1 3 3 3 2 122 1 122 1 122 3 123 3 123 3 123 4 18 7 111 7 124 4 18 7 124 7 124 5 19 10 125 10 126 6 127 127 35 127 35 7 128 128 64 128 64 8 129 129 116 129 116 9 104 117 121 130 121 @COLORS 1 90 90 90 2 62 62 62 3 0 255 127 4 0 178 88 golly-2.5-src/Rules/HPP.rule0000644000175100001440000006466112156145314012642 00000000000000@RULE HPP HPP Lattice gas J. Hardy, O. de Pazzis, and Y. Pomeau (1973) J. Math. Phys. 14, 470. The earliest lattice gas model. Later made obsolete by the FHP gas on a hexagonal lattice, which has better physical properties. States following http://pages.cs.wisc.edu/~wylie/doc/PhD_thesis.pdf Each cell can contain up to 4 particles, each moving in one of the four directions. Outgoing directions SENW map onto 4 bits, so W=0001=1, SEW=1101=13, etc. Next state is simply the collected inputs, in most cases. The exceptions are 5 (EW) and 10 (NS) which get swapped (bounce on collision). To make the gas useful in Golly's infinite area, I've added reflecting boundary states, 16-31. These work in the same way as gas particles (collecting inputs) but reverse their direction. Contact: Tim Hutton Sink boundary: (or you can vent to the outside but this way is neater) 32 Source boundary: (haven't really worked out how to use this well yet) 33 The HPP gas can also be run using the Margolus-neighborhood emulator in Golly (see e.g. Patterns/Margolus/BBM.rle) but this CA is neater. @TABLE n_states:34 neighborhood:vonNeumann symmetries:none # a = any of the gas states var a={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} # b = any of the reflecting boundary states var b={16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31} # s = has an outgoing south particle var s={8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31,33} # Ns = doesn't have an outgoing south particle var Ns={0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23,32} # e = has an outgoing east particle var e={4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31,33} # Ne = doesn't have an outgoing east particle var Ne={0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27,32} # n = has an outgoing north particle var n={2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31,33} # Nn = doesn't have an outgoing north particle var Nn={0,1,4,5,8,9,12,13,16,17,20,21,24,25,28,29,32} # w = has an outgoing west particle var w={1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33} # Nw = doesn't have an outgoing north particle var Nw={0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32} # straightforward transport (no interactions) except 5 and 10 which are swapped a,Ns,Nw,Nn,Ne,0 a,Ns,w,Nn,Ne,1 a,Ns,Nw,n,Ne,2 a,Ns,w,n,Ne,3 a,Ns,Nw,Nn,e,4 a,Ns,w,Nn,e,10 a,Ns,Nw,n,e,6 a,Ns,w,n,e,7 a,s,Nw,Nn,Ne,8 a,s,w,Nn,Ne,9 a,s,Nw,n,Ne,5 a,s,w,n,Ne,11 a,s,Nw,Nn,e,12 a,s,w,Nn,e,13 a,s,Nw,n,e,14 a,s,w,n,e,15 # reflecting boundaries: b,Ns,Nw,Nn,Ne,16 b,Ns,Nw,Nn,e,17 b,s,Nw,Nn,Ne,18 b,s,Nw,Nn,e,19 b,Ns,w,Nn,Ne,20 b,Ns,w,Nn,e,21 b,s,w,Nn,Ne,22 b,s,w,Nn,e,23 b,Ns,Nw,n,Ne,24 b,Ns,Nw,n,e,25 b,s,Nw,n,Ne,26 b,s,Nw,n,e,27 b,Ns,w,n,Ne,28 b,Ns,w,n,e,29 b,s,w,n,Ne,30 b,s,w,n,e,31 @COLORS # the grey-level intensity is proportional to the number of particles # in the square 1 120 120 120 2 120 120 120 3 160 160 160 4 120 120 120 5 160 160 160 6 160 160 160 7 220 220 220 8 120 120 120 9 160 160 160 10 160 160 160 11 220 220 220 12 160 160 160 13 220 220 220 14 220 220 220 15 255 255 255 16 200 180 0 17 255 255 0 18 255 255 0 19 255 255 0 20 255 255 0 21 255 255 0 22 255 255 0 23 255 255 0 24 255 255 0 25 255 255 0 26 255 255 0 27 255 255 0 28 255 255 0 29 255 255 0 30 255 255 0 31 255 255 0 32 255 0 0 33 0 255 0 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 496 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".....B........................." "....BB........................." "...BBB........................." "..BBBB........................." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "..BBBB........................." "...BBB........................." "....BB........................." ".....B........................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 2 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............................." "..............................." "..............................." "..............................." /* icon for state 3 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB.............." "....BB........BBB.............." "...BBB........BBB.............." "..BBBB........BBB.............." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "..BBBB........BBB.............." "...BBB........BBB.............." "....BB........BBB.............." ".....B........BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".........................B....." ".........................BB...." ".........................BBB..." ".........................BBBB.." "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBB." ".........................BBBB.." ".........................BBB..." ".........................BB...." ".........................B....." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".....B...................B....." "....BB...................BB...." "...BBB...................BBB..." "..BBBB...................BBBB.." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "..BBBB...................BBBB.." "...BBB...................BBB..." "....BB...................BB...." ".....B...................B....." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB........B....." "..............BBB........BB...." "..............BBB........BBB..." "..............BBB........BBBB.." "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "..............BBB........BBBB.." "..............BBB........BBB..." "..............BBB........BB...." "..............BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............................." "..............................." "..............................." "..............................." /* icon for state 7 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB........B....." "....BB........BBB........BB...." "...BBB........BBB........BBB..." "..BBBB........BBB........BBBB.." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "..BBBB........BBB........BBBB.." "...BBB........BBB........BBB..." "....BB........BBB........BB...." ".....B........BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............................." "..............................." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 9 */ "..............................." "..............................." "..............................." "..............................." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB.............." "....BB........BBB.............." "...BBB........BBB.............." "..BBBB........BBB.............." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "..BBBB........BBB.............." "...BBB........BBB.............." "....BB........BBB.............." ".....B........BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 10 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 11 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB.............." "....BB........BBB.............." "...BBB........BBB.............." "..BBBB........BBB.............." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." ".BBBBBBBBBBBBBBBBBBBBBBBBBB...." "..BBBB........BBB.............." "...BBB........BBB.............." "....BB........BBB.............." ".....B........BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 12 */ "..............................." "..............................." "..............................." "..............................." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB........B....." "..............BBB........BB...." "..............BBB........BBB..." "..............BBB........BBBB.." "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "..............BBB........BBBB.." "..............BBB........BBB..." "..............BBB........BB...." "..............BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 13 */ "..............................." "..............................." "..............................." "..............................." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB........B....." "....BB........BBB........BB...." "...BBB........BBB........BBB..." "..BBBB........BBB........BBBB.." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "..BBBB........BBB........BBBB.." "...BBB........BBB........BBB..." "....BB........BBB........BB...." ".....B........BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 14 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB........B....." "..............BBB........BB...." "..............BBB........BBB..." "..............BBB........BBBB.." "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBB." "..............BBB........BBBB.." "..............BBB........BBB..." "..............BBB........BB...." "..............BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 15 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." ".....B........BBB........B....." "....BB........BBB........BB...." "...BBB........BBB........BBB..." "..BBBB........BBB........BBBB.." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBB." "..BBBB........BBB........BBBB.." "...BBB........BBB........BBB..." "....BB........BBB........BB...." ".....B........BBB........B....." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..............BBB.............." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for states 16 to 33 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" XPM /* width height num_colors chars_per_pixel */ "15 240 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." "..............." "..............." "..............." "..............." "..B............" ".BB............" "BBBBBBBBBBBBB.." ".BB............" "..B............" "..............." "..............." "..............." "..............." "..............." /* icon for state 2 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." "..............." "..............." /* icon for state 3 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." "..B....B......." ".BB....B......." "BBBBBBBBBBBBB.." ".BB....B......." "..B....B......." ".......B......." ".......B......." ".......B......." "..............." "..............." /* icon for state 4 */ "..............." "..............." "..............." "..............." "..............." "............B.." "............BB." "..BBBBBBBBBBBBB" "............BB." "............B.." "..............." "..............." "..............." "..............." "..............." /* icon for state 5 */ "..............." "..............." "..............." "..............." "..............." "..B.........B.." ".BB.........BB." "BBBBBBBBBBBBBBB" ".BB.........BB." "..B.........B.." "..............." "..............." "..............." "..............." "..............." /* icon for state 6 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." ".......B....B.." ".......B....BB." "..BBBBBBBBBBBBB" ".......B....BB." ".......B....B.." ".......B......." ".......B......." ".......B......." "..............." "..............." /* icon for state 7 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." "..B....B....B.." ".BB....B....BB." "BBBBBBBBBBBBBBB" ".BB....B....BB." "..B....B....B.." ".......B......." ".......B......." ".......B......." "..............." "..............." /* icon for state 8 */ "..............." "..............." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 9 */ "..............." "..............." ".......B......." ".......B......." ".......B......." "..B....B......." ".BB....B......." "BBBBBBBBBBBBB.." ".BB....B......." "..B....B......." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 10 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 11 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." "..B....B......." ".BB....B......." "BBBBBBBBBBBBB.." ".BB....B......." "..B....B......." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 12 */ "..............." "..............." ".......B......." ".......B......." ".......B......." ".......B....B.." ".......B....BB." "..BBBBBBBBBBBBB" ".......B....BB." ".......B....B.." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 13 */ "..............." "..............." ".......B......." ".......B......." ".......B......." "..B....B....B.." ".BB....B....BB." "BBBBBBBBBBBBBBB" ".BB....B....BB." "..B....B....B.." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 14 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." ".......B....B.." ".......B....BB." "..BBBBBBBBBBBBB" ".......B....BB." ".......B....B.." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 15 */ ".......B......." "......BBB......" ".....BBBBB....." ".......B......." ".......B......." "..B....B....B.." ".BB....B....BB." "BBBBBBBBBBBBBBB" ".BB....B....BB." "..B....B....B.." ".......B......." ".......B......." ".....BBBBB....." "......BBB......" ".......B......." /* icon for states 16 to 33 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" XPM /* width height num_colors chars_per_pixel */ "7 112 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "......." "......." ".B....." "BBBBBB." ".B....." "......." "......." /* icon for state 2 */ "...B..." "..BBB.." "...B..." "...B..." "...B..." "...B..." "......." /* icon for state 3 */ "...B..." "..BBB.." ".B.B..." "BBBBBB." ".B.B..." "...B..." "......." /* icon for state 4 */ "......." "......." ".....B." ".BBBBBB" ".....B." "......." "......." /* icon for state 5 */ "......." "......." ".B...B." "BBBBBBB" ".B...B." "......." "......." /* icon for state 6 */ "...B..." "..BBB.." "...B.B." ".BBBBBB" "...B.B." "...B..." "......." /* icon for state 7 */ "...B..." "..BBB.." ".B.B.B." "BBBBBBB" ".B.B.B." "...B..." "......." /* icon for state 8 */ "......." "...B..." "...B..." "...B..." "...B..." "..BBB.." "...B..." /* icon for state 9 */ "......." "......." ".B....." "BBBB..." ".B.B..." "..BBB.." "...B..." /* icon for state 10 */ "...B..." "..BBB.." "...B..." "...B..." "...B..." "..BBB.." "...B..." /* icon for state 11 */ "...B..." "..BBB.." ".B.B..." "BBBBBB." ".B.B..." "..BBB.." "...B..." /* icon for state 12 */ "......." "...B..." "...B.B." ".BBBBBB" "...B.B." "..BBB.." "...B..." /* icon for state 13 */ "......." "...B..." ".B.B.B." "BBBBBBB" ".B.B.B." "..BBB.." "...B..." /* icon for state 14 */ "...B..." "..BBB.." "...B.B." ".BBBBBB" "...B.B." "..BBB.." "...B..." /* icon for state 15 */ "...B..." "..BBB.." ".B.B.B." "BBBBBBB" ".B.B.B." "..BBB.." "...B..." /* icon for states 16 to 33 */ "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" golly-2.5-src/Rules/LangtonsAnt_LLRR.rule0000644000175100001440000007175312156145314015276 00000000000000@RULE LangtonsAnt_LLRR @TREE num_states=20 num_neighbors=4 num_nodes=17 1 0 1 2 3 1 1 1 1 2 2 2 2 3 3 3 3 0 0 0 0 1 4 8 12 16 8 8 8 8 12 12 12 12 16 16 16 16 4 4 4 4 2 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1 1 7 11 15 19 11 11 11 11 15 15 15 15 19 19 19 19 7 7 7 7 2 3 3 3 3 3 0 3 3 3 0 3 3 3 3 3 0 3 3 3 0 3 2 2 2 2 4 2 2 2 4 2 2 2 2 2 4 2 2 2 4 2 1 5 9 13 17 9 9 9 9 13 13 13 13 17 17 17 17 5 5 5 5 2 6 6 6 6 6 0 6 6 6 0 6 6 6 6 6 0 6 6 6 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 7 7 7 7 8 7 7 7 8 7 7 7 7 7 8 7 7 7 8 7 4 5 5 5 5 5 5 9 5 5 5 9 5 9 5 5 5 9 5 5 5 1 6 10 14 18 10 10 10 10 14 14 14 14 18 18 18 18 6 6 6 6 2 11 11 11 11 11 0 11 11 11 0 11 11 11 11 11 0 11 11 11 0 3 12 12 12 12 8 12 12 12 8 12 12 12 12 12 8 12 12 12 8 12 3 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 4 13 13 13 13 13 13 14 13 13 13 14 13 14 13 13 13 14 13 13 13 5 10 10 10 10 10 10 10 15 10 10 10 15 10 15 10 10 10 15 10 10 @COLORS 0 0 0 0 1 0 155 67 2 127 0 255 3 128 128 128 4 186 185 102 5 186 185 102 6 186 185 102 7 186 185 102 8 32 160 73 9 32 160 73 10 32 160 73 11 32 160 73 12 137 32 228 13 137 32 228 14 137 32 228 15 137 32 228 16 138 138 123 17 138 138 123 18 138 138 123 19 138 138 123 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 589 10 1" /* colors */ "A c #009B43" "B c #7F00FF" "C c #808080" ". c #000000" "E c #B9B860" "F c #5C5C30" "G c #5CA951" "H c #9C5CAF" "I c #9C9C70" "J c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 3 */ "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" /* icon for state 4 */ "..............................." ".......E...............E......." ".......E...............E......." "........E.............E........" "........E.............E........" ".........EEEJJEEEJJEEE........." "............JJEEEJJ............" ".............EEEEE............." "........EE....EEE....EE........" ".........EE...EEE...EE........." "..........EE..EEE..EE.........." "...........EEEEEEEEE..........." "............EEEEEEE............" "..............EEE.............." "..............EEE.............." "...........EEEEEEEEE..........." "..........EEEEEEEEEEE.........." ".........EE...EEE...EE........." "........EE....EEE....EE........" ".............EEEEE............." "............EEEEEEE............" "...........EE.EEE.EE..........." "..........EE..EEE..EE.........." ".........EE...EEE...EE........." "........EE...FEEEF...EE........" ".............EEEEE............." ".............EEEEE............." ".............FEEEF............." "..............EEE.............." "..............................." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................EE." "......E.....E.........E...EE..." "......EE....EE.......EE..E....." ".......EE....EE.....EE...E....." "........EE....EE...EE....E....." ".........EE...EE..EE....JJ....." "...FEEF...EE..EE..EE...EJJ....." "..EEEEEEEEEEEEEEEEEEEEEEEE....." "..EEEEEEEEEEEEEEEEEEEEEEEE....." "..EEEEEEEEEEEEEEEEEEEEEEEE....." "...FEEF...EE..EE..EE...EJJ....." ".........EE...EE..EE....JJ....." "........EE....EE...EE....E....." ".......EE....EE.....EE...E....." "......EE....EE.......EE..E....." "......E.....E.........E...EE..." "............................EE." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "..............................." "..............................." "..............EEE.............." ".............FEEEF............." ".............EEEEE............." ".............EEEEE............." "........EE...FEEEF...EE........" ".........EE...EEE...EE........." "..........EE..EEE..EE.........." "...........EE.EEE.EE..........." "............EEEEEEE............" ".............EEEEE............." "........EE....EEE....EE........" ".........EE...EEE...EE........." "..........EEEEEEEEEEE.........." "...........EEEEEEEEE..........." "..............EEE.............." "..............EEE.............." "............EEEEEEE............" "...........EEEEEEEEE..........." "..........EE..EEE..EE.........." ".........EE...EEE...EE........." "........EE....EEE....EE........" ".............EEEEE............." "............JJEEEJJ............" ".........EEEJJEEEJJEEE........." "........E.............E........" "........E.............E........" ".......E...............E......." ".......E...............E......." "..............................." /* icon for state 7 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".EE............................" "...EE...E.........E.....E......" ".....E..EE.......EE....EE......" ".....E...EE.....EE....EE......." ".....E....EE...EE....EE........" ".....JJ....EE..EE...EE........." ".....JJE...EE..EE..EE...FEEF..." ".....EEEEEEEEEEEEEEEEEEEEEEEE.." ".....EEEEEEEEEEEEEEEEEEEEEEEE.." ".....EEEEEEEEEEEEEEEEEEEEEEEE.." ".....JJE...EE..EE..EE...FEEF..." ".....JJ....EE..EE...EE........." ".....E....EE...EE....EE........" ".....E...EE.....EE....EE......." ".....E..EE.......EE....EE......" "...EE...E.........E.....E......" ".EE............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAEAAAAAAAAAAAAAAAEAAAAAAA" "AAAAAAAEAAAAAAAAAAAAAAAEAAAAAAA" "AAAAAAAAEAAAAAAAAAAAAAEAAAAAAAA" "AAAAAAAAEAAAAAAAAAAAAAEAAAAAAAA" "AAAAAAAAAEEEJJEEEJJEEEAAAAAAAAA" "AAAAAAAAAAAAJJEEEJJAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAEEAAAAEEEAAAAEEAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAAAEEAAEEEAAEEAAAAAAAAAA" "AAAAAAAAAAAEEEEEEEEEAAAAAAAAAAA" "AAAAAAAAAAAAEEEEEEEAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAEEEEEEEEEAAAAAAAAAAA" "AAAAAAAAAAEEEEEEEEEEEAAAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAEEAAAAEEEAAAAEEAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAEEEEEEEAAAAAAAAAAAA" "AAAAAAAAAAAEEAEEEAEEAAAAAAAAAAA" "AAAAAAAAAAEEAAEEEAAEEAAAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAEEAAAGEEEGAAAEEAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAAGEEEGAAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 9 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAEEA" "AAAAAAEAAAAAEAAAAAAAAAEAAAEEAAA" "AAAAAAEEAAAAEEAAAAAAAEEAAEAAAAA" "AAAAAAAEEAAAAEEAAAAAEEAAAEAAAAA" "AAAAAAAAEEAAAAEEAAAEEAAAAEAAAAA" "AAAAAAAAAEEAAAEEAAEEAAAAJJAAAAA" "AAAGEEGAAAEEAAEEAAEEAAAEJJAAAAA" "AAEEEEEEEEEEEEEEEEEEEEEEEEAAAAA" "AAEEEEEEEEEEEEEEEEEEEEEEEEAAAAA" "AAEEEEEEEEEEEEEEEEEEEEEEEEAAAAA" "AAAGEEGAAAEEAAEEAAEEAAAEJJAAAAA" "AAAAAAAAAEEAAAEEAAEEAAAAJJAAAAA" "AAAAAAAAEEAAAAEEAAAEEAAAAEAAAAA" "AAAAAAAEEAAAAEEAAAAAEEAAAEAAAAA" "AAAAAAEEAAAAEEAAAAAAAEEAAEAAAAA" "AAAAAAEAAAAAEAAAAAAAAAEAAAEEAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAEEA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 10 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGEEEGAAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAEEAAAGEEEGAAAEEAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAAAEEAAEEEAAEEAAAAAAAAAA" "AAAAAAAAAAAEEAEEEAEEAAAAAAAAAAA" "AAAAAAAAAAAAEEEEEEEAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAEEAAAAEEEAAAAEEAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAAAEEEEEEEEEEEAAAAAAAAAA" "AAAAAAAAAAAEEEEEEEEEAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAEEEEEEEAAAAAAAAAAAA" "AAAAAAAAAAAEEEEEEEEEAAAAAAAAAAA" "AAAAAAAAAAEEAAEEEAAEEAAAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAEEAAAAEEEAAAAEEAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAJJEEEJJAAAAAAAAAAAA" "AAAAAAAAAEEEJJEEEJJEEEAAAAAAAAA" "AAAAAAAAEAAAAAAAAAAAAAEAAAAAAAA" "AAAAAAAAEAAAAAAAAAAAAAEAAAAAAAA" "AAAAAAAEAAAAAAAAAAAAAAAEAAAAAAA" "AAAAAAAEAAAAAAAAAAAAAAAEAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AEEAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAEEAAAEAAAAAAAAAEAAAAAEAAAAAA" "AAAAAEAAEEAAAAAAAEEAAAAEEAAAAAA" "AAAAAEAAAEEAAAAAEEAAAAEEAAAAAAA" "AAAAAEAAAAEEAAAEEAAAAEEAAAAAAAA" "AAAAAJJAAAAEEAAEEAAAEEAAAAAAAAA" "AAAAAJJEAAAEEAAEEAAEEAAAGEEGAAA" "AAAAAEEEEEEEEEEEEEEEEEEEEEEEEAA" "AAAAAEEEEEEEEEEEEEEEEEEEEEEEEAA" "AAAAAEEEEEEEEEEEEEEEEEEEEEEEEAA" "AAAAAJJEAAAEEAAEEAAEEAAAGEEGAAA" "AAAAAJJAAAAEEAAEEAAAEEAAAAAAAAA" "AAAAAEAAAAEEAAAEEAAAAEEAAAAAAAA" "AAAAAEAAAEEAAAAAEEAAAAEEAAAAAAA" "AAAAAEAAEEAAAAAAAEEAAAAEEAAAAAA" "AAAEEAAAEAAAAAAAAAEAAAAAEAAAAAA" "AEEAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 12 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBEBBBBBBBBBBBBBBBEBBBBBBB" "BBBBBBBEBBBBBBBBBBBBBBBEBBBBBBB" "BBBBBBBBEBBBBBBBBBBBBBEBBBBBBBB" "BBBBBBBBEBBBBBBBBBBBBBEBBBBBBBB" "BBBBBBBBBEEEJJEEEJJEEEBBBBBBBBB" "BBBBBBBBBBBBJJEEEJJBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBEEBBBBEEEBBBBEEBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBBBEEBBEEEBBEEBBBBBBBBBB" "BBBBBBBBBBBEEEEEEEEEBBBBBBBBBBB" "BBBBBBBBBBBBEEEEEEEBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBEEEEEEEEEBBBBBBBBBBB" "BBBBBBBBBBEEEEEEEEEEEBBBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBEEBBBBEEEBBBBEEBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBEEEEEEEBBBBBBBBBBBB" "BBBBBBBBBBBEEBEEEBEEBBBBBBBBBBB" "BBBBBBBBBBEEBBEEEBBEEBBBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBEEBBBHEEEHBBBEEBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBBHEEEHBBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 13 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBEEB" "BBBBBBEBBBBBEBBBBBBBBBEBBBEEBBB" "BBBBBBEEBBBBEEBBBBBBBEEBBEBBBBB" "BBBBBBBEEBBBBEEBBBBBEEBBBEBBBBB" "BBBBBBBBEEBBBBEEBBBEEBBBBEBBBBB" "BBBBBBBBBEEBBBEEBBEEBBBBJJBBBBB" "BBBHEEHBBBEEBBEEBBEEBBBEJJBBBBB" "BBEEEEEEEEEEEEEEEEEEEEEEEEBBBBB" "BBEEEEEEEEEEEEEEEEEEEEEEEEBBBBB" "BBEEEEEEEEEEEEEEEEEEEEEEEEBBBBB" "BBBHEEHBBBEEBBEEBBEEBBBEJJBBBBB" "BBBBBBBBBEEBBBEEBBEEBBBBJJBBBBB" "BBBBBBBBEEBBBBEEBBBEEBBBBEBBBBB" "BBBBBBBEEBBBBEEBBBBBEEBBBEBBBBB" "BBBBBBEEBBBBEEBBBBBBBEEBBEBBBBB" "BBBBBBEBBBBBEBBBBBBBBBEBBBEEBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBEEB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 14 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBBHEEEHBBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBEEBBBHEEEHBBBEEBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBBBEEBBEEEBBEEBBBBBBBBBB" "BBBBBBBBBBBEEBEEEBEEBBBBBBBBBBB" "BBBBBBBBBBBBEEEEEEEBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBEEBBBBEEEBBBBEEBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBBBEEEEEEEEEEEBBBBBBBBBB" "BBBBBBBBBBBEEEEEEEEEBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBEEEEEEEBBBBBBBBBBBB" "BBBBBBBBBBBEEEEEEEEEBBBBBBBBBBB" "BBBBBBBBBBEEBBEEEBBEEBBBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBEEBBBBEEEBBBBEEBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBJJEEEJJBBBBBBBBBBBB" "BBBBBBBBBEEEJJEEEJJEEEBBBBBBBBB" "BBBBBBBBEBBBBBBBBBBBBBEBBBBBBBB" "BBBBBBBBEBBBBBBBBBBBBBEBBBBBBBB" "BBBBBBBEBBBBBBBBBBBBBBBEBBBBBBB" "BBBBBBBEBBBBBBBBBBBBBBBEBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 15 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BEEBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBEEBBBEBBBBBBBBBEBBBBBEBBBBBB" "BBBBBEBBEEBBBBBBBEEBBBBEEBBBBBB" "BBBBBEBBBEEBBBBBEEBBBBEEBBBBBBB" "BBBBBEBBBBEEBBBEEBBBBEEBBBBBBBB" "BBBBBJJBBBBEEBBEEBBBEEBBBBBBBBB" "BBBBBJJEBBBEEBBEEBBEEBBBHEEHBBB" "BBBBBEEEEEEEEEEEEEEEEEEEEEEEEBB" "BBBBBEEEEEEEEEEEEEEEEEEEEEEEEBB" "BBBBBEEEEEEEEEEEEEEEEEEEEEEEEBB" "BBBBBJJEBBBEEBBEEBBEEBBBHEEHBBB" "BBBBBJJBBBBEEBBEEBBBEEBBBBBBBBB" "BBBBBEBBBBEEBBBEEBBBBEEBBBBBBBB" "BBBBBEBBBEEBBBBBEEBBBBEEBBBBBBB" "BBBBBEBBEEBBBBBBBEEBBBBEEBBBBBB" "BBBEEBBBEBBBBBBBBBEBBBBBEBBBBBB" "BEEBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 16 */ "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCECCCCCCCCCCCCCCCECCCCCCC" "CCCCCCCECCCCCCCCCCCCCCCECCCCCCC" "CCCCCCCCECCCCCCCCCCCCCECCCCCCCC" "CCCCCCCCECCCCCCCCCCCCCECCCCCCCC" "CCCCCCCCCEEEJJEEEJJEEECCCCCCCCC" "CCCCCCCCCCCCJJEEEJJCCCCCCCCCCCC" "CCCCCCCCCCCCCEEEEECCCCCCCCCCCCC" "CCCCCCCCEECCCCEEECCCCEECCCCCCCC" "CCCCCCCCCEECCCEEECCCEECCCCCCCCC" "CCCCCCCCCCEECCEEECCEECCCCCCCCCC" "CCCCCCCCCCCEEEEEEEEECCCCCCCCCCC" "CCCCCCCCCCCCEEEEEEECCCCCCCCCCCC" "CCCCCCCCCCCCCCEEECCCCCCCCCCCCCC" "CCCCCCCCCCCCCCEEECCCCCCCCCCCCCC" "CCCCCCCCCCCEEEEEEEEECCCCCCCCCCC" "CCCCCCCCCCEEEEEEEEEEECCCCCCCCCC" "CCCCCCCCCEECCCEEECCCEECCCCCCCCC" "CCCCCCCCEECCCCEEECCCCEECCCCCCCC" "CCCCCCCCCCCCCEEEEECCCCCCCCCCCCC" "CCCCCCCCCCCCEEEEEEECCCCCCCCCCCC" "CCCCCCCCCCCEECEEECEECCCCCCCCCCC" "CCCCCCCCCCEECCEEECCEECCCCCCCCCC" "CCCCCCCCCEECCCEEECCCEECCCCCCCCC" "CCCCCCCCEECCCIEEEICCCEECCCCCCCC" "CCCCCCCCCCCCCEEEEECCCCCCCCCCCCC" "CCCCCCCCCCCCCEEEEECCCCCCCCCCCCC" "CCCCCCCCCCCCCIEEEICCCCCCCCCCCCC" "CCCCCCCCCCCCCCEEECCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" /* icon for state 17 */ "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCEEC" "CCCCCCECCCCCECCCCCCCCCECCCEECCC" "CCCCCCEECCCCEECCCCCCCEECCECCCCC" "CCCCCCCEECCCCEECCCCCEECCCECCCCC" "CCCCCCCCEECCCCEECCCEECCCCECCCCC" "CCCCCCCCCEECCCEECCEECCCCJJCCCCC" "CCCIEEICCCEECCEECCEECCCEJJCCCCC" "CCEEEEEEEEEEEEEEEEEEEEEEEECCCCC" "CCEEEEEEEEEEEEEEEEEEEEEEEECCCCC" "CCEEEEEEEEEEEEEEEEEEEEEEEECCCCC" "CCCIEEICCCEECCEECCEECCCEJJCCCCC" "CCCCCCCCCEECCCEECCEECCCCJJCCCCC" "CCCCCCCCEECCCCEECCCEECCCCECCCCC" "CCCCCCCEECCCCEECCCCCEECCCECCCCC" "CCCCCCEECCCCEECCCCCCCEECCECCCCC" "CCCCCCECCCCCECCCCCCCCCECCCEECCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCEEC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" /* icon for state 18 */ "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCEEECCCCCCCCCCCCCC" "CCCCCCCCCCCCCIEEEICCCCCCCCCCCCC" "CCCCCCCCCCCCCEEEEECCCCCCCCCCCCC" "CCCCCCCCCCCCCEEEEECCCCCCCCCCCCC" "CCCCCCCCEECCCIEEEICCCEECCCCCCCC" "CCCCCCCCCEECCCEEECCCEECCCCCCCCC" "CCCCCCCCCCEECCEEECCEECCCCCCCCCC" "CCCCCCCCCCCEECEEECEECCCCCCCCCCC" "CCCCCCCCCCCCEEEEEEECCCCCCCCCCCC" "CCCCCCCCCCCCCEEEEECCCCCCCCCCCCC" "CCCCCCCCEECCCCEEECCCCEECCCCCCCC" "CCCCCCCCCEECCCEEECCCEECCCCCCCCC" "CCCCCCCCCCEEEEEEEEEEECCCCCCCCCC" "CCCCCCCCCCCEEEEEEEEECCCCCCCCCCC" "CCCCCCCCCCCCCCEEECCCCCCCCCCCCCC" "CCCCCCCCCCCCCCEEECCCCCCCCCCCCCC" "CCCCCCCCCCCCEEEEEEECCCCCCCCCCCC" "CCCCCCCCCCCEEEEEEEEECCCCCCCCCCC" "CCCCCCCCCCEECCEEECCEECCCCCCCCCC" "CCCCCCCCCEECCCEEECCCEECCCCCCCCC" "CCCCCCCCEECCCCEEECCCCEECCCCCCCC" "CCCCCCCCCCCCCEEEEECCCCCCCCCCCCC" "CCCCCCCCCCCCJJEEEJJCCCCCCCCCCCC" "CCCCCCCCCEEEJJEEEJJEEECCCCCCCCC" "CCCCCCCCECCCCCCCCCCCCCECCCCCCCC" "CCCCCCCCECCCCCCCCCCCCCECCCCCCCC" "CCCCCCCECCCCCCCCCCCCCCCECCCCCCC" "CCCCCCCECCCCCCCCCCCCCCCECCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" /* icon for state 19 */ "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CEECCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCEECCCECCCCCCCCCECCCCCECCCCCC" "CCCCCECCEECCCCCCCEECCCCEECCCCCC" "CCCCCECCCEECCCCCEECCCCEECCCCCCC" "CCCCCECCCCEECCCEECCCCEECCCCCCCC" "CCCCCJJCCCCEECCEECCCEECCCCCCCCC" "CCCCCJJECCCEECCEECCEECCCIEEICCC" "CCCCCEEEEEEEEEEEEEEEEEEEEEEEECC" "CCCCCEEEEEEEEEEEEEEEEEEEEEEEECC" "CCCCCEEEEEEEEEEEEEEEEEEEEEEEECC" "CCCCCJJECCCEECCEECCEECCCIEEICCC" "CCCCCJJCCCCEECCEECCCEECCCCCCCCC" "CCCCCECCCCEECCCEECCCCEECCCCCCCC" "CCCCCECCCEECCCCCEECCCCEECCCCCCC" "CCCCCECCEECCCCCCCEECCCCEECCCCCC" "CCCEECCCECCCCCCCCCECCCCCECCCCCC" "CEECCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" XPM /* width height num_colors chars_per_pixel */ "15 285 10 1" /* colors */ "A c #009B43" "B c #7F00FF" "C c #808080" ". c #000000" "E c #B9B860" "F c #5C5C30" "G c #5CA951" "H c #9C5CAF" "I c #9C9C70" "J c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 3 */ "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" /* icon for state 4 */ "....E.....E...." ".....E...E....." "......JEJ......" "...E..EEE..E..." "....E..E..E...." ".....EEEEE....." ".......E......." "....EEEEEEE...." "...E...E...E..." ".....EEEEE....." "....E..E..E...." "...E..FEF..E..." "......EEE......" "......FEF......" "..............." /* icon for state 5 */ "..............." "..............." "..............." "...E..E....E..." "....E..E..E...E" ".....E.E.E...E." ".FEF.E.E.E.EJ.." ".EEEEEEEEEEEE.." ".FEF.E.E.E.EJ.." ".....E.E.E...E." "....E..E..E...E" "...E..E....E..." "..............." "..............." "..............." /* icon for state 6 */ "..............." "......FEF......" "......EEE......" "...E..FEF..E..." "....E..E..E...." ".....EEEEE....." "...E...E...E..." "....EEEEEEE...." ".......E......." ".....EEEEE....." "....E..E..E...." "...E..EEE..E..." "......JEJ......" ".....E...E....." "....E.....E...." /* icon for state 7 */ "..............." "..............." "..............." "...E....E..E..." "E...E..E..E...." ".E...E.E.E....." "..JE.E.E.E.FEF." "..EEEEEEEEEEEE." "..JE.E.E.E.FEF." ".E...E.E.E....." "E...E..E..E...." "...E....E..E..." "..............." "..............." "..............." /* icon for state 8 */ "AAAAEAAAAAEAAAA" "AAAAAEAAAEAAAAA" "AAAAAAJEJAAAAAA" "AAAEAAEEEAAEAAA" "AAAAEAAEAAEAAAA" "AAAAAEEEEEAAAAA" "AAAAAAAEAAAAAAA" "AAAAEEEEEEEAAAA" "AAAEAAAEAAAEAAA" "AAAAAEEEEEAAAAA" "AAAAEAAEAAEAAAA" "AAAEAAGEGAAEAAA" "AAAAAAEEEAAAAAA" "AAAAAAGEGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 9 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAEAAEAAAAEAAA" "AAAAEAAEAAEAAAE" "AAAAAEAEAEAAAEA" "AGEGAEAEAEAEJAA" "AEEEEEEEEEEEEAA" "AGEGAEAEAEAEJAA" "AAAAAEAEAEAAAEA" "AAAAEAAEAAEAAAE" "AAAEAAEAAAAEAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 10 */ "AAAAAAAAAAAAAAA" "AAAAAAGEGAAAAAA" "AAAAAAEEEAAAAAA" "AAAEAAGEGAAEAAA" "AAAAEAAEAAEAAAA" "AAAAAEEEEEAAAAA" "AAAEAAAEAAAEAAA" "AAAAEEEEEEEAAAA" "AAAAAAAEAAAAAAA" "AAAAAEEEEEAAAAA" "AAAAEAAEAAEAAAA" "AAAEAAEEEAAEAAA" "AAAAAAJEJAAAAAA" "AAAAAEAAAEAAAAA" "AAAAEAAAAAEAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAEAAAAEAAEAAA" "EAAAEAAEAAEAAAA" "AEAAAEAEAEAAAAA" "AAJEAEAEAEAGEGA" "AAEEEEEEEEEEEEA" "AAJEAEAEAEAGEGA" "AEAAAEAEAEAAAAA" "EAAAEAAEAAEAAAA" "AAAEAAAAEAAEAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 12 */ "BBBBEBBBBBEBBBB" "BBBBBEBBBEBBBBB" "BBBBBBJEJBBBBBB" "BBBEBBEEEBBEBBB" "BBBBEBBEBBEBBBB" "BBBBBEEEEEBBBBB" "BBBBBBBEBBBBBBB" "BBBBEEEEEEEBBBB" "BBBEBBBEBBBEBBB" "BBBBBEEEEEBBBBB" "BBBBEBBEBBEBBBB" "BBBEBBHEHBBEBBB" "BBBBBBEEEBBBBBB" "BBBBBBHEHBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 13 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBEBBEBBBBEBBB" "BBBBEBBEBBEBBBE" "BBBBBEBEBEBBBEB" "BHEHBEBEBEBEJBB" "BEEEEEEEEEEEEBB" "BHEHBEBEBEBEJBB" "BBBBBEBEBEBBBEB" "BBBBEBBEBBEBBBE" "BBBEBBEBBBBEBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 14 */ "BBBBBBBBBBBBBBB" "BBBBBBHEHBBBBBB" "BBBBBBEEEBBBBBB" "BBBEBBHEHBBEBBB" "BBBBEBBEBBEBBBB" "BBBBBEEEEEBBBBB" "BBBEBBBEBBBEBBB" "BBBBEEEEEEEBBBB" "BBBBBBBEBBBBBBB" "BBBBBEEEEEBBBBB" "BBBBEBBEBBEBBBB" "BBBEBBEEEBBEBBB" "BBBBBBJEJBBBBBB" "BBBBBEBBBEBBBBB" "BBBBEBBBBBEBBBB" /* icon for state 15 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBEBBBBEBBEBBB" "EBBBEBBEBBEBBBB" "BEBBBEBEBEBBBBB" "BBJEBEBEBEBHEHB" "BBEEEEEEEEEEEEB" "BBJEBEBEBEBHEHB" "BEBBBEBEBEBBBBB" "EBBBEBBEBBEBBBB" "BBBEBBBBEBBEBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 16 */ "CCCCECCCCCECCCC" "CCCCCECCCECCCCC" "CCCCCCJEJCCCCCC" "CCCECCEEECCECCC" "CCCCECCECCECCCC" "CCCCCEEEEECCCCC" "CCCCCCCECCCCCCC" "CCCCEEEEEEECCCC" "CCCECCCECCCECCC" "CCCCCEEEEECCCCC" "CCCCECCECCECCCC" "CCCECCIEICCECCC" "CCCCCCEEECCCCCC" "CCCCCCIEICCCCCC" "CCCCCCCCCCCCCCC" /* icon for state 17 */ "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCECCECCCCECCC" "CCCCECCECCECCCE" "CCCCCECECECCCEC" "CIEICECECECEJCC" "CEEEEEEEEEEEECC" "CIEICECECECEJCC" "CCCCCECECECCCEC" "CCCCECCECCECCCE" "CCCECCECCCCECCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" /* icon for state 18 */ "CCCCCCCCCCCCCCC" "CCCCCCIEICCCCCC" "CCCCCCEEECCCCCC" "CCCECCIEICCECCC" "CCCCECCECCECCCC" "CCCCCEEEEECCCCC" "CCCECCCECCCECCC" "CCCCEEEEEEECCCC" "CCCCCCCECCCCCCC" "CCCCCEEEEECCCCC" "CCCCECCECCECCCC" "CCCECCEEECCECCC" "CCCCCCJEJCCCCCC" "CCCCCECCCECCCCC" "CCCCECCCCCECCCC" /* icon for state 19 */ "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCECCCCECCECCC" "ECCCECCECCECCCC" "CECCCECECECCCCC" "CCJECECECECIEIC" "CCEEEEEEEEEEEEC" "CCJECECECECIEIC" "CECCCECECECCCCC" "ECCCECCECCECCCC" "CCCECCCCECCECCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" "CCCCCCCCCCCCCCC" XPM /* width height num_colors chars_per_pixel */ "7 133 10 1" /* colors */ "A c #009B43" "B c #7F00FF" "C c #808080" ". c #000000" "E c #B9B860" "F c #5C5C30" "G c #5CA951" "H c #9C5CAF" "I c #9C9C70" "J c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" /* icon for state 3 */ "CCCCCCC" "CCCCCCC" "CCCCCCC" "CCCCCCC" "CCCCCCC" "CCCCCCC" "CCCCCCC" /* icon for state 4 */ ".E...E." "..JEJ.." "...E..." ".EEEEE." "...E..." ".EEEEE." "...E..." /* icon for state 5 */ "......." ".E.E..E" ".E.E.J." "EEEEEE." ".E.E.J." ".E.E..E" "......." /* icon for state 6 */ "...E..." ".EEEEE." "...E..." ".EEEEE." "...E..." "..JEJ.." ".E...E." /* icon for state 7 */ "......." "E..E.E." ".J.E.E." ".EEEEEE" ".J.E.E." "E..E.E." "......." /* icon for state 8 */ "AEAAAEA" "AAJEJAA" "AAAEAAA" "AEEEEEA" "AAAEAAA" "AEEEEEA" "AAAEAAA" /* icon for state 9 */ "AAAAAAA" "AEAEAAE" "AEAEAJA" "EEEEEEA" "AEAEAJA" "AEAEAAE" "AAAAAAA" /* icon for state 10 */ "AAAEAAA" "AEEEEEA" "AAAEAAA" "AEEEEEA" "AAAEAAA" "AAJEJAA" "AEAAAEA" /* icon for state 11 */ "AAAAAAA" "EAAEAEA" "AJAEAEA" "AEEEEEE" "AJAEAEA" "EAAEAEA" "AAAAAAA" /* icon for state 12 */ "BEBBBEB" "BBJEJBB" "BBBEBBB" "BEEEEEB" "BBBEBBB" "BEEEEEB" "BBBEBBB" /* icon for state 13 */ "BBBBBBB" "BEBEBBE" "BEBEBJB" "EEEEEEB" "BEBEBJB" "BEBEBBE" "BBBBBBB" /* icon for state 14 */ "BBBEBBB" "BEEEEEB" "BBBEBBB" "BEEEEEB" "BBBEBBB" "BBJEJBB" "BEBBBEB" /* icon for state 15 */ "BBBBBBB" "EBBEBEB" "BJBEBEB" "BEEEEEE" "BJBEBEB" "EBBEBEB" "BBBBBBB" /* icon for state 16 */ "CECCCEC" "CCJEJCC" "CCCECCC" "CEEEEEC" "CCCECCC" "CEEEEEC" "CCCECCC" /* icon for state 17 */ "CCCCCCC" "CECECCE" "CECECJC" "EEEEEEC" "CECECJC" "CECECCE" "CCCCCCC" /* icon for state 18 */ "CCCECCC" "CEEEEEC" "CCCECCC" "CEEEEEC" "CCCECCC" "CCJEJCC" "CECCCEC" /* icon for state 19 */ "CCCCCCC" "ECCECEC" "CJCECEC" "CEEEEEE" "CJCECEC" "ECCECEC" "CCCCCCC" golly-2.5-src/Rules/Langtons-Ant.rule0000644000175100001440000003336012156145314014510 00000000000000@RULE Langtons-Ant @TREE num_states=10 num_neighbors=4 num_nodes=17 1 0 1 1 1 1 1 0 0 0 0 1 2 6 6 6 6 6 2 2 2 2 2 0 0 0 0 0 1 0 1 0 0 1 5 9 9 9 9 9 5 5 5 5 2 3 3 3 3 3 0 3 0 3 3 3 2 2 2 2 4 2 4 2 2 2 1 3 7 7 7 7 7 3 3 3 3 2 6 6 6 6 6 0 6 0 6 6 2 0 0 0 0 0 0 0 0 0 0 3 7 7 7 7 8 7 8 7 7 7 4 5 5 9 5 5 5 5 5 9 5 1 4 8 8 8 8 8 4 4 4 4 2 11 11 11 11 11 0 11 0 11 11 3 12 12 12 12 8 12 8 12 12 12 3 8 8 8 8 8 8 8 8 8 8 4 13 13 14 13 13 13 13 13 14 13 5 10 10 10 15 10 10 10 10 10 15 @COLORS 0 255 255 255 1 0 0 0 2 0 0 0 3 0 0 0 4 0 0 0 5 0 0 0 6 0 0 0 7 0 0 0 8 0 0 0 9 0 0 0 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 279 2 1" /* colors */ "A c #FFFFFF" ". c #000000" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ ".........A...........A........." ".........A...........A........." "..........A.........A.........." "...........A.......A..........." "............AAAAAAA............" "............A.AAA.A............" ".......A....AAAAAAA....A......." ".......A.....AAAAA.....A......." "........A.....AAA.....A........" ".........A....AAA....A........." "..........AAAAAAAAAAA.........." "...........AAAAAAAAA..........." "..............AAA.............." "..............AAA.............." "..........AAAAAAAAAAA.........." ".........AAAAAAAAAAAAA........." "........AA....AAA....AA........" ".......A......AAA......A......." "......A.......AAA.......A......" "...........AAAAAAAAA..........." "..........AAAAAAAAAAA.........." ".........AA...AAA...AA........." "........A.....AAA.....A........" ".......A.....AAAAA.....A......." "......A.....AAAAAAA.....A......" "............AAAAAAA............" "............AAAAAAA............" "............AAAAAAA............" ".............AAAAA............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "......A.....A.................." ".......A.....A.........AA......" "........A.....A.......A........" ".........A....AA.....A.......AA" ".........AA....AA...A.......A.." "..........AA...AA..AA......A..." "...AAAA...AA...AA..AA...AAA...." "..AAAAAA..AA...AA..AA..AA.A...." "..AAAAAAAAAAAAAAAAAAAAAAAAA...." "..AAAAAAAAAAAAAAAAAAAAAAAAA...." "..AAAAAAAAAAAAAAAAAAAAAAAAA...." "..AAAAAA..AA...AA..AA..AA.A...." "...AAAA...AA...AA..AA...AAA...." "..........AA...AA..AA......A..." ".........AA....AA...A.......A.." ".........A....AA.....A.......AA" "........A.....A.......A........" ".......A.....A.........AA......" "......A.....A.................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." ".............AAAAA............." "............AAAAAAA............" "............AAAAAAA............" "............AAAAAAA............" "......A.....AAAAAAA.....A......" ".......A.....AAAAA.....A......." "........A.....AAA.....A........" ".........AA...AAA...AA........." "..........AAAAAAAAAAA.........." "...........AAAAAAAAA..........." "......A.......AAA.......A......" ".......A......AAA......A......." "........AA....AAA....AA........" ".........AAAAAAAAAAAAA........." "..........AAAAAAAAAAA.........." "..............AAA.............." "..............AAA.............." "...........AAAAAAAAA..........." "..........AAAAAAAAAAA.........." ".........A....AAA....A........." "........A.....AAA.....A........" ".......A.....AAAAA.....A......." ".......A....AAAAAAA....A......." "............A.AAA.A............" "............AAAAAAA............" "...........A.......A..........." "..........A.........A.........." ".........A...........A........." ".........A...........A........." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..................A.....A......" "......AA.........A.....A......." "........A.......A.....A........" "AA.......A.....AA....A........." "..A.......A...AA....AA........." "...A......AA..AA...AA.........." "....AAA...AA..AA...AA...AAAA..." "....A.AA..AA..AA...AA..AAAAAA.." "....AAAAAAAAAAAAAAAAAAAAAAAAA.." "....AAAAAAAAAAAAAAAAAAAAAAAAA.." "....AAAAAAAAAAAAAAAAAAAAAAAAA.." "....A.AA..AA..AA...AA..AAAAAA.." "....AAA...AA..AA...AA...AAAA..." "...A......AA..AA...AA.........." "..A.......A...AA....AA........." "AA.......A.....AA....A........." "........A.......A.....A........" "......AA.........A.....A......." "..................A.....A......" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "AAAAAAAAA.AAAAAAAAAAA.AAAAAAAAA" "AAAAAAAAA.AAAAAAAAAAA.AAAAAAAAA" "AAAAAAAAAA.AAAAAAAAA.AAAAAAAAAA" "AAAAAAAAAAA.AAAAAAA.AAAAAAAAAAA" "AAAAAAAAAAAA.......AAAAAAAAAAAA" "AAAAAAAAAAAA.A...A.AAAAAAAAAAAA" "AAAAAAA.AAAA.......AAAA.AAAAAAA" "AAAAAAA.AAAAA.....AAAAA.AAAAAAA" "AAAAAAAA.AAAAA...AAAAA.AAAAAAAA" "AAAAAAAAA.AAAA...AAAA.AAAAAAAAA" "AAAAAAAAAA...........AAAAAAAAAA" "AAAAAAAAAAA.........AAAAAAAAAAA" "AAAAAAAAAAAAAA...AAAAAAAAAAAAAA" "AAAAAAAAAAAAAA...AAAAAAAAAAAAAA" "AAAAAAAAAA...........AAAAAAAAAA" "AAAAAAAAA.............AAAAAAAAA" "AAAAAAAA..AAAA...AAAA..AAAAAAAA" "AAAAAAA.AAAAAA...AAAAAA.AAAAAAA" "AAAAAA.AAAAAAA...AAAAAAA.AAAAAA" "AAAAAAAAAAA.........AAAAAAAAAAA" "AAAAAAAAAA...........AAAAAAAAAA" "AAAAAAAAA..AAA...AAA..AAAAAAAAA" "AAAAAAAA.AAAAA...AAAAA.AAAAAAAA" "AAAAAAA.AAAAA.....AAAAA.AAAAAAA" "AAAAAA.AAAAA.......AAAAA.AAAAAA" "AAAAAAAAAAAA.......AAAAAAAAAAAA" "AAAAAAAAAAAA.......AAAAAAAAAAAA" "AAAAAAAAAAAA.......AAAAAAAAAAAA" "AAAAAAAAAAAAA.....AAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 7 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAA.AAAAA.AAAAAAAAAAAAAAAAAA" "AAAAAAA.AAAAA.AAAAAAAAA..AAAAAA" "AAAAAAAA.AAAAA.AAAAAAA.AAAAAAAA" "AAAAAAAAA.AAAA..AAAAA.AAAAAAA.." "AAAAAAAAA..AAAA..AAA.AAAAAAA.AA" "AAAAAAAAAA..AAA..AA..AAAAAA.AAA" "AAA....AAA..AAA..AA..AAA...AAAA" "AA......AA..AAA..AA..AA..A.AAAA" "AA.........................AAAA" "AA.........................AAAA" "AA.........................AAAA" "AA......AA..AAA..AA..AA..A.AAAA" "AAA....AAA..AAA..AA..AAA...AAAA" "AAAAAAAAAA..AAA..AA..AAAAAA.AAA" "AAAAAAAAA..AAAA..AAA.AAAAAAA.AA" "AAAAAAAAA.AAAA..AAAAA.AAAAAAA.." "AAAAAAAA.AAAAA.AAAAAAA.AAAAAAAA" "AAAAAAA.AAAAA.AAAAAAAAA..AAAAAA" "AAAAAA.AAAAA.AAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 8 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAA.....AAAAAAAAAAAAA" "AAAAAAAAAAAA.......AAAAAAAAAAAA" "AAAAAAAAAAAA.......AAAAAAAAAAAA" "AAAAAAAAAAAA.......AAAAAAAAAAAA" "AAAAAA.AAAAA.......AAAAA.AAAAAA" "AAAAAAA.AAAAA.....AAAAA.AAAAAAA" "AAAAAAAA.AAAAA...AAAAA.AAAAAAAA" "AAAAAAAAA..AAA...AAA..AAAAAAAAA" "AAAAAAAAAA...........AAAAAAAAAA" "AAAAAAAAAAA.........AAAAAAAAAAA" "AAAAAA.AAAAAAA...AAAAAAA.AAAAAA" "AAAAAAA.AAAAAA...AAAAAA.AAAAAAA" "AAAAAAAA..AAAA...AAAA..AAAAAAAA" "AAAAAAAAA.............AAAAAAAAA" "AAAAAAAAAA...........AAAAAAAAAA" "AAAAAAAAAAAAAA...AAAAAAAAAAAAAA" "AAAAAAAAAAAAAA...AAAAAAAAAAAAAA" "AAAAAAAAAAA.........AAAAAAAAAAA" "AAAAAAAAAA...........AAAAAAAAAA" "AAAAAAAAA.AAAA...AAAA.AAAAAAAAA" "AAAAAAAA.AAAAA...AAAAA.AAAAAAAA" "AAAAAAA.AAAAA.....AAAAA.AAAAAAA" "AAAAAAA.AAAA.......AAAA.AAAAAAA" "AAAAAAAAAAAA.A...A.AAAAAAAAAAAA" "AAAAAAAAAAAA.......AAAAAAAAAAAA" "AAAAAAAAAAA.AAAAAAA.AAAAAAAAAAA" "AAAAAAAAAA.AAAAAAAAA.AAAAAAAAAA" "AAAAAAAAA.AAAAAAAAAAA.AAAAAAAAA" "AAAAAAAAA.AAAAAAAAAAA.AAAAAAAAA" /* icon for state 9 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAA.AAAAA.AAAAAA" "AAAAAA..AAAAAAAAA.AAAAA.AAAAAAA" "AAAAAAAA.AAAAAAA.AAAAA.AAAAAAAA" "..AAAAAAA.AAAAA..AAAA.AAAAAAAAA" "AA.AAAAAAA.AAA..AAAA..AAAAAAAAA" "AAA.AAAAAA..AA..AAA..AAAAAAAAAA" "AAAA...AAA..AA..AAA..AAA....AAA" "AAAA.A..AA..AA..AAA..AA......AA" "AAAA.........................AA" "AAAA.........................AA" "AAAA.........................AA" "AAAA.A..AA..AA..AAA..AA......AA" "AAAA...AAA..AA..AAA..AAA....AAA" "AAA.AAAAAA..AA..AAA..AAAAAAAAAA" "AA.AAAAAAA.AAA..AAAA..AAAAAAAAA" "..AAAAAAA.AAAAA..AAAA.AAAAAAAAA" "AAAAAAAA.AAAAAAA.AAAAA.AAAAAAAA" "AAAAAA..AAAAAAAAA.AAAAA.AAAAAAA" "AAAAAAAAAAAAAAAAAA.AAAAA.AAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 135 2 1" /* colors */ "A c #FFFFFF" ". c #000000" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "....A.....A...." ".....A...A....." "......AAA......" "...A..AAA..A..." "....A..A..A...." ".....AAAAA....." ".......A......." "....AAAAAAA...." "...A...A...A..." ".....AAAAA....." "....A..A..A...." "...A..AAA..A..." "......AAA......" "......AAA......" "..............." /* icon for state 3 */ "..............." "..............." "..............." "...A..A....A..." "....A..A..A...A" ".....A.A.A...A." ".AAA.A.A.A.AA.." ".AAAAAAAAAAAA.." ".AAA.A.A.A.AA.." ".....A.A.A...A." "....A..A..A...A" "...A..A....A..." "..............." "..............." "..............." /* icon for state 4 */ "..............." "......AAA......" "......AAA......" "...A..AAA..A..." "....A..A..A...." ".....AAAAA....." "...A...A...A..." "....AAAAAAA...." ".......A......." ".....AAAAA....." "....A..A..A...." "...A..AAA..A..." "......AAA......" ".....A...A....." "....A.....A...." /* icon for state 5 */ "..............." "..............." "..............." "...A....A..A..." "A...A..A..A...." ".A...A.A.A....." "..AA.A.A.A.AAA." "..AAAAAAAAAAAA." "..AA.A.A.A.AAA." ".A...A.A.A....." "A...A..A..A...." "...A....A..A..." "..............." "..............." "..............." /* icon for state 6 */ "AAAA.AAAAA.AAAA" "AAAAA.AAA.AAAAA" "AAAAAA...AAAAAA" "AAA.AA...AA.AAA" "AAAA.AA.AA.AAAA" "AAAAA.....AAAAA" "AAAAAAA.AAAAAAA" "AAAA.......AAAA" "AAA.AAA.AAA.AAA" "AAAAA.....AAAAA" "AAAA.AA.AA.AAAA" "AAA.AA...AA.AAA" "AAAAAA...AAAAAA" "AAAAAA...AAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 7 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAA.AA.AAAA.AAA" "AAAA.AA.AA.AAA." "AAAAA.A.A.AAA.A" "A...A.A.A.A..AA" "A............AA" "A...A.A.A.A..AA" "AAAAA.A.A.AAA.A" "AAAA.AA.AA.AAA." "AAA.AA.AAAA.AAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 8 */ "AAAAAAAAAAAAAAA" "AAAAAA...AAAAAA" "AAAAAA...AAAAAA" "AAA.AA...AA.AAA" "AAAA.AA.AA.AAAA" "AAAAA.....AAAAA" "AAA.AAA.AAA.AAA" "AAAA.......AAAA" "AAAAAAA.AAAAAAA" "AAAAA.....AAAAA" "AAAA.AA.AA.AAAA" "AAA.AA...AA.AAA" "AAAAAA...AAAAAA" "AAAAA.AAA.AAAAA" "AAAA.AAAAA.AAAA" /* icon for state 9 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAA.AAAA.AA.AAA" ".AAA.AA.AA.AAAA" "A.AAA.A.A.AAAAA" "AA..A.A.A.A...A" "AA............A" "AA..A.A.A.A...A" "A.AAA.A.A.AAAAA" ".AAA.AA.AA.AAAA" "AAA.AAAA.AA.AAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 63 2 1" /* colors */ "A c #FFFFFF" ". c #000000" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ ".A...A." "..AAA.." "...A..." ".AAAAA." "...A..." ".AAAAA." "...A..." /* icon for state 3 */ "......." ".A.A..A" ".A.A.A." "AAAAAA." ".A.A.A." ".A.A..A" "......." /* icon for state 4 */ "...A..." ".AAAAA." "...A..." ".AAAAA." "...A..." "..AAA.." ".A...A." /* icon for state 5 */ "......." "A..A.A." ".A.A.A." ".AAAAAA" ".A.A.A." "A..A.A." "......." /* icon for state 6 */ "A.AAA.A" "AA...AA" "AAA.AAA" "A.....A" "AAA.AAA" "A.....A" "AAA.AAA" /* icon for state 7 */ "AAAAAAA" "A.A.AA." "A.A.A.A" "......A" "A.A.A.A" "A.A.AA." "AAAAAAA" /* icon for state 8 */ "AAA.AAA" "A.....A" "AAA.AAA" "A.....A" "AAA.AAA" "AA...AA" "A.AAA.A" /* icon for state 9 */ "AAAAAAA" ".AA.A.A" "A.A.A.A" "A......" "A.A.A.A" ".AA.A.A" "AAAAAAA" golly-2.5-src/Rules/Langtons-Loops.rule0000644000175100001440000001574612156145314015072 00000000000000@RULE Langtons-Loops C.G.Langton. "Self-reproduction in cellular automata." Physica D, Vol. 10, pages 135-144, 1984. Transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java Credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" @TABLE # rules: 219 # format: CNESWC' n_states:8 neighborhood:vonNeumann symmetries:rotate4 000000 000012 000020 000030 000050 000063 000071 000112 000122 000132 000212 000220 000230 000262 000272 000320 000525 000622 000722 001022 001120 002020 002030 002050 002125 002220 002322 005222 012321 012421 012525 012621 012721 012751 014221 014321 014421 014721 016251 017221 017255 017521 017621 017721 025271 100011 100061 100077 100111 100121 100211 100244 100277 100511 101011 101111 101244 101277 102026 102121 102211 102244 102263 102277 102327 102424 102626 102644 102677 102710 102727 105427 111121 111221 111244 111251 111261 111277 111522 112121 112221 112244 112251 112277 112321 112424 112621 112727 113221 122244 122277 122434 122547 123244 123277 124255 124267 125275 200012 200022 200042 200071 200122 200152 200212 200222 200232 200242 200250 200262 200272 200326 200423 200517 200522 200575 200722 201022 201122 201222 201422 201722 202022 202032 202052 202073 202122 202152 202212 202222 202272 202321 202422 202452 202520 202552 202622 202722 203122 203216 203226 203422 204222 205122 205212 205222 205521 205725 206222 206722 207122 207222 207422 207722 211222 211261 212222 212242 212262 212272 214222 215222 216222 217222 222272 222442 222462 222762 222772 300013 300022 300041 300076 300123 300421 300622 301021 301220 302511 401120 401220 401250 402120 402221 402326 402520 403221 500022 500215 500225 500232 500272 500520 502022 502122 502152 502220 502244 502722 512122 512220 512422 512722 600011 600021 602120 612125 612131 612225 700077 701120 701220 701250 702120 702221 702251 702321 702525 702720 @TREE num_states=8 num_neighbors=4 num_nodes=222 1 0 1 2 3 4 5 6 7 1 2 1 2 3 4 5 1 7 1 0 1 2 2 4 2 1 7 1 0 1 2 1 4 5 6 7 1 3 1 2 3 4 5 6 7 1 1 7 1 6 4 5 6 7 2 0 1 2 0 3 0 4 5 1 2 1 2 3 4 5 6 7 2 1 7 7 7 0 0 0 0 1 0 1 2 3 4 2 6 7 1 0 4 2 3 4 5 6 7 1 0 1 0 3 4 5 6 7 1 2 7 2 3 4 2 6 7 2 2 7 0 9 10 11 7 12 1 0 1 6 3 4 5 6 7 2 0 0 14 0 0 0 0 0 1 0 1 3 1 4 5 6 7 2 3 0 16 0 0 0 0 0 1 0 1 7 3 4 5 6 7 1 5 1 2 3 4 0 6 7 1 0 1 5 3 4 5 6 7 2 0 18 19 0 0 0 0 20 1 2 1 2 2 4 5 6 7 2 4 0 22 0 0 0 0 0 2 5 0 7 0 0 0 0 0 3 6 8 13 15 17 21 23 24 2 1 7 7 0 0 18 0 0 2 0 0 0 0 0 0 0 0 1 2 1 2 1 4 5 6 7 1 0 0 2 3 4 5 6 7 2 28 0 0 0 0 3 0 29 3 26 27 30 15 27 27 27 27 2 2 7 0 14 16 19 22 7 1 0 1 2 3 0 5 6 0 1 0 1 2 0 0 5 6 0 2 28 33 34 0 0 0 0 0 1 0 6 2 3 4 2 6 7 1 5 1 2 3 0 2 0 0 1 0 1 2 3 1 0 6 1 1 2 7 1 3 6 5 6 1 1 0 1 0 3 0 5 6 5 1 0 6 2 3 4 5 6 7 1 0 7 2 3 4 2 6 0 2 36 37 38 39 10 40 41 42 1 0 1 6 3 1 5 6 7 2 0 0 44 0 0 0 0 0 1 0 7 2 3 4 5 6 7 1 0 1 1 3 4 5 6 7 2 0 0 7 0 46 47 0 20 1 0 1 3 3 4 5 6 7 2 49 0 0 0 0 0 0 0 3 32 35 43 45 27 48 27 50 2 0 7 9 0 0 0 0 0 3 52 27 27 27 27 27 27 27 2 3 0 10 0 0 0 0 0 2 0 0 10 0 0 0 0 0 1 0 4 2 3 4 4 6 7 2 0 0 56 0 0 0 10 0 3 54 55 57 27 27 27 27 27 2 0 0 11 0 0 0 0 0 2 0 0 33 0 0 0 0 0 1 0 1 2 3 4 5 6 1 2 0 9 61 0 0 0 0 0 3 59 60 62 27 27 27 27 27 2 4 0 7 0 0 0 0 0 1 0 3 2 3 4 5 6 7 2 0 0 65 0 0 0 0 0 3 64 27 66 27 27 27 27 27 2 5 0 12 0 0 20 0 0 2 0 0 46 0 0 0 0 0 2 49 0 46 0 0 0 46 0 3 68 69 70 27 27 27 27 27 4 25 31 51 53 58 63 67 71 2 1 0 28 0 0 0 0 0 2 7 0 33 0 0 0 0 0 2 7 0 34 0 10 33 0 46 2 7 0 0 0 0 0 0 0 3 73 74 75 76 27 27 27 27 2 33 0 0 0 10 0 47 46 1 0 2 2 3 4 5 6 7 2 0 0 79 0 0 0 0 0 3 76 27 78 27 27 80 27 27 2 7 0 0 14 0 0 0 0 2 0 0 0 0 0 79 0 0 1 0 1 2 3 4 2 5 7 1 0 1 2 3 4 0 5 7 1 1 1 2 3 4 5 6 7 1 1 4 2 3 4 2 6 7 1 5 1 2 3 4 5 6 7 1 1 7 2 3 4 2 6 7 2 37 84 85 86 87 88 86 89 1 0 1 2 3 4 5 1 7 2 0 91 0 0 0 0 0 0 2 0 0 86 86 86 0 0 86 2 9 0 0 0 0 0 0 0 2 0 0 86 0 0 86 86 86 3 82 83 90 92 93 94 27 95 3 27 27 92 27 27 27 27 27 3 27 55 55 27 27 27 27 27 2 18 0 3 0 0 0 0 0 2 0 0 0 0 0 0 0 86 2 0 0 86 0 0 0 0 0 2 0 0 88 0 0 0 0 0 3 99 27 100 27 27 27 101 102 2 0 0 47 0 0 0 0 0 3 27 104 27 27 27 27 27 27 2 0 0 29 0 0 0 0 0 3 106 69 69 27 27 27 27 27 4 77 81 96 97 98 103 105 107 2 2 28 36 0 0 0 0 49 2 7 0 37 0 0 9 0 0 2 0 0 38 0 56 61 65 46 2 9 0 39 0 0 0 0 0 2 10 0 10 0 0 0 0 0 2 11 3 40 0 0 0 0 0 2 7 0 41 0 10 0 0 46 2 12 29 42 0 0 0 0 0 3 109 110 111 112 113 114 115 116 2 7 33 37 0 0 0 0 0 2 0 0 84 91 0 0 0 0 2 34 0 85 0 10 0 0 46 2 10 10 87 0 0 0 0 0 2 33 0 88 0 0 0 0 0 2 0 47 86 0 0 0 0 0 2 46 46 89 0 0 86 0 0 3 118 119 120 101 121 122 123 124 2 0 34 38 44 0 7 0 0 2 0 0 85 0 86 0 0 86 2 38 85 0 0 10 0 0 46 2 56 10 10 10 0 0 0 0 2 61 0 0 0 46 0 0 0 2 65 0 0 0 0 0 0 0 2 46 46 46 0 0 0 0 0 3 126 127 128 27 129 130 131 132 2 14 0 39 0 0 0 0 0 2 14 0 86 0 86 0 0 0 2 44 0 0 0 10 0 0 0 3 134 135 136 27 55 27 27 69 2 16 0 10 0 0 46 0 0 2 0 0 87 0 86 0 0 0 2 0 86 10 0 0 46 0 0 1 0 5 2 3 4 5 6 7 2 0 0 141 0 0 0 0 0 3 138 139 140 55 27 142 69 27 2 19 0 40 0 0 47 0 0 2 0 79 88 0 0 0 0 86 1 1 5 2 3 4 5 6 7 2 0 0 146 0 0 0 0 0 3 144 145 76 27 142 27 27 147 2 22 0 41 0 0 0 0 0 2 0 0 86 0 0 0 0 86 2 0 86 0 0 0 0 0 0 3 149 150 27 27 69 151 27 27 2 7 0 42 0 0 20 0 0 2 0 0 89 0 86 0 0 86 2 0 86 46 0 0 0 0 0 2 0 88 146 0 0 0 0 0 3 153 154 155 69 27 156 27 27 4 117 125 133 137 143 148 152 157 2 14 14 44 0 0 0 0 0 3 27 27 159 27 27 27 27 27 2 0 0 91 0 0 0 0 0 3 76 161 27 27 27 27 27 27 2 39 86 0 0 10 0 0 46 3 94 27 163 27 27 27 27 27 3 27 27 27 27 27 27 27 27 2 0 86 10 0 0 0 0 0 3 27 27 166 27 27 27 27 27 4 160 162 164 165 167 165 165 165 2 3 0 0 0 0 0 0 0 2 16 0 0 0 0 0 0 0 3 169 27 170 27 27 27 27 27 3 27 27 101 101 101 27 27 101 2 10 10 56 0 0 0 0 0 2 0 10 10 0 0 0 0 0 2 10 87 10 10 0 141 46 0 3 173 174 175 55 27 27 27 27 3 27 27 151 27 27 27 27 27 2 46 0 46 0 0 0 0 0 3 27 27 178 27 27 27 27 27 3 55 27 27 27 27 27 27 27 4 171 172 176 165 177 179 180 165 2 18 0 0 0 0 0 0 0 2 19 0 7 0 0 0 0 0 2 20 0 20 0 0 0 0 0 3 27 182 183 27 69 104 27 184 2 0 0 9 0 0 0 0 0 2 0 79 0 0 0 0 0 0 3 186 27 187 27 27 27 27 27 2 11 33 61 0 0 0 0 0 2 3 0 0 0 0 0 86 88 2 40 88 0 0 141 0 0 146 3 189 190 191 27 69 27 27 27 2 47 0 0 0 0 0 0 0 3 27 27 193 27 27 27 27 27 3 27 101 151 27 27 27 27 27 4 185 188 192 165 165 194 165 195 2 4 0 0 0 0 0 0 0 2 22 0 0 0 0 0 0 0 3 197 27 198 27 27 27 27 27 2 0 0 0 0 0 86 0 0 3 27 27 200 27 27 27 27 27 2 7 0 65 0 0 0 0 0 2 0 47 0 0 0 0 0 0 2 41 86 0 0 46 0 0 0 2 10 0 0 0 0 0 0 0 2 46 0 0 0 0 0 0 0 3 202 203 204 27 205 27 27 206 4 199 201 207 165 165 165 165 177 2 5 0 49 0 0 0 0 0 3 209 27 76 27 27 27 27 27 2 0 0 86 0 0 88 0 0 3 27 27 211 27 27 101 101 101 2 12 46 46 0 0 0 0 0 2 29 46 46 0 0 0 0 0 2 42 89 46 46 0 146 0 0 3 213 214 215 27 27 151 27 27 2 20 0 0 0 0 0 0 0 3 217 27 217 27 27 27 27 27 3 69 27 27 27 27 27 27 27 4 210 212 216 165 177 218 219 177 5 72 108 158 168 181 196 208 220 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 golly-2.5-src/Rules/LifeHistory.rule0000644000175100001440000002622212156145314014443 00000000000000@RULE LifeHistory A variant of HistoricalLife with two extra ON states and two extra OFF states, for annotation purposes: state 0: OFF state 1: ON state 2: history/envelope (state=2 if cell was ever ON) state 3: marked ON (may change to OFF but will always remain marked) state 4: marked OFF (may change to ON but will always remain marked) state 5: start ON (becomes a normal marked OFF cell when it dies) state 6: boundary OFF (can never turn on -- can keep subpatterns in a stamp collection from interfering with each other) @TABLE n_states:7 neighborhood:Moore symmetries:rotate8 var a={0,2,4,6} var b={0,2,4,6} var c={0,2,4,6} var d={0,2,4,6} var e={0,2,4,6} var f={0,2,4,6} var g={3,5} var h={0,1,2} var i={0,1,2,3,4,5,6} var j={0,1,2,3,4,5,6} var k={0,1,2,3,4,5,6} var l={0,1,2,3,4,5,6} var m={0,1,2,3,4,5,6} var n={0,1,2,3,4,5,6} var o={0,1,2,3,4,5,6} var p={0,1,2,3,4,5,6} var q={1,3,5} var R={1,3,5} var S={1,3,5} var T={1,3,5} var u={3,4,5} # boundary cell always stays a boundary cell 6,i,j,k,l,m,n,o,p,6 # anything else that touches a boundary cell dies # (using 'u' instead of 'g' below lets gliders survive as blocks) g,6,i,j,k,l,m,n,o,4 1,6,i,j,k,l,m,n,o,2 # marked 3-neighbour birth # (has to be separate from the next section # only to handle the extra 'start' state 5) 4,R,S,T,a,b,c,d,e,3 4,R,S,a,T,b,c,d,e,3 4,R,S,a,b,T,c,d,e,3 4,R,S,a,b,c,T,d,e,3 4,R,S,a,b,c,d,T,e,3 4,R,a,S,b,T,c,d,e,3 4,R,a,S,b,c,T,d,e,3 # marked 3-neighbour survival g,R,S,T,a,b,c,d,e,g g,R,S,a,T,b,c,d,e,g g,R,S,a,b,T,c,d,e,g g,R,S,a,b,c,T,d,e,g g,R,S,a,b,c,d,T,e,g g,R,a,S,b,T,c,d,e,g g,R,a,S,b,c,T,d,e,g # normal 3-neighbour birth h,R,S,T,a,b,c,d,e,1 h,R,S,a,T,b,c,d,e,1 h,R,S,a,b,T,c,d,e,1 h,R,S,a,b,c,T,d,e,1 h,R,S,a,b,c,d,T,e,1 h,R,a,S,b,T,c,d,e,1 h,R,a,S,b,c,T,d,e,1 # 2-neighbour survival q,R,S,a,b,c,d,e,f,q q,R,a,S,b,c,d,e,f,q q,R,a,b,S,c,d,e,f,q q,R,a,b,c,S,d,e,f,q # ON states 3 and 5 go to history state 4 if they don't survive g,i,j,k,l,m,n,o,p,4 # Otherwise ON states die and become the history state q,i,j,k,l,m,n,o,p,2 @COLORS 1 0 255 0 2 0 0 128 3 216 255 216 4 255 0 0 5 255 255 0 6 96 96 96 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 186 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "..........BCDEEEEEDCB.........." ".........CEEEEEEEEEEEC........." ".......BEEEEEEEEEEEEEEEB......." "......DEEEEEEEEEEEEEEEEED......" ".....DEEEEEEEEEEEEEEEEEEED....." "....BEEEEEEEEEEEEEEEEEEEEEB...." "....EEEEEEEEEEEEEEEEEEEEEEE...." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "....EEEEEEEEEEEEEEEEEEEEEEE...." "....BEEEEEEEEEEEEEEEEEEEEEB...." ".....DEEEEEEEEEEEEEEEEEEED....." "......DEEEEEEEEEEEEEEEEED......" ".......BEEEEEEEEEEEEEEEB......." ".........CEEEEEEEEEEEC........." "..........BCDEEEEEDCB.........." "..............................." "..............................." /* icon for state 2 */ ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." /* icon for state 3 */ "..............................." "..............................." "..........BCDEEEEEDCB.........." ".........CEEEEEEEEEEEC........." ".......BEEEEEEEEEEEEEEEB......." "......DEEEEEEEEEEEEEEEEED......" ".....DEEEEEEEEEEEEEEEEEEED....." "....BEEEEEEEEEEEEEEEEEEEEEB...." "....EEEEEEEEEEEEEEEEEEEEEEE...." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "....EEEEEEEEEEEEEEEEEEEEEEE...." "....BEEEEEEEEEEEEEEEEEEEEEB...." ".....DEEEEEEEEEEEEEEEEEEED....." "......DEEEEEEEEEEEEEEEEED......" ".......BEEEEEEEEEEEEEEEB......." ".........CEEEEEEEEEEEC........." "..........BCDEEEEEDCB.........." "..............................." "..............................." /* icon for state 4 */ ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." /* icon for state 5 */ "..............................." "..............................." "..........BCDEEEEEDCB.........." ".........CEEEEEEEEEEEC........." ".......BEEEEEEEEEEEEEEEB......." "......DEEEEEEEEEEEEEEEEED......" ".....DEEEEEEEEEEEEEEEEEEED....." "....BEEEEEEEEEEEEEEEEEEEEEB...." "....EEEEEEEEEEEEEEEEEEEEEEE...." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "....EEEEEEEEEEEEEEEEEEEEEEE...." "....BEEEEEEEEEEEEEEEEEEEEEB...." ".....DEEEEEEEEEEEEEEEEEEED....." "......DEEEEEEEEEEEEEEEEED......" ".......BEEEEEEEEEEEEEEEB......." ".........CEEEEEEEEEEEC........." "..........BCDEEEEEDCB.........." "..............................." "..............................." /* icon for state 6 */ ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E.E.E.E.E.E.E.E.E." XPM /* width height num_colors chars_per_pixel */ "15 90 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............." "....BDEEEDB...." "...DEEEEEEED..." "..DEEEEEEEEED.." ".BEEEEEEEEEEEB." ".DEEEEEEEEEEED." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".DEEEEEEEEEEED." ".BEEEEEEEEEEEB." "..DEEEEEEEEED.." "...DEEEEEEED..." "....BDEEEDB...." "..............." /* icon for state 2 */ ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." /* icon for state 3 */ "..............." "....BDEEEDB...." "...DEEEEEEED..." "..DEEEEEEEEED.." ".BEEEEEEEEEEEB." ".DEEEEEEEEEEED." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".DEEEEEEEEEEED." ".BEEEEEEEEEEEB." "..DEEEEEEEEED.." "...DEEEEEEED..." "....BDEEEDB...." "..............." /* icon for state 4 */ "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" /* icon for state 5 */ "..............." "....BDEEEDB...." "...DEEEEEEED..." "..DEEEEEEEEED.." ".BEEEEEEEEEEEB." ".DEEEEEEEEEEED." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".DEEEEEEEEEEED." ".BEEEEEEEEEEEB." "..DEEEEEEEEED.." "...DEEEEEEED..." "....BDEEEDB...." "..............." /* icon for state 6 */ "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" ".E.E.E.E.E.E.E." "E.E.E.E.E.E.E.E" XPM /* width height num_colors chars_per_pixel */ "7 42 6 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" "F c #E0E0E0" /* icon for state 1 */ ".BFEFB." "BEEEEEB" "FEEEEEF" "EEEEEEE" "FEEEEEF" "BEEEEEB" ".BFEFB." /* icon for state 2 */ ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." /* icon for state 3 */ ".BFEFB." "BEEEEEB" "FEEEEEF" "EEEEEEE" "FEEEEEF" "BEEEEEB" ".BFEFB." /* icon for state 4 */ "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" /* icon for state 5 */ ".BFEFB." "BEEEEEB" "FEEEEEF" "EEEEEEE" "FEEEEEF" "BEEEEEB" ".BFEFB." /* icon for state 6 */ "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" ".E.E.E." "E.E.E.E" golly-2.5-src/Rules/LifeOnTheEdge.rule0000644000175100001440000001257712156145314014614 00000000000000@RULE LifeOnTheEdge @TREE num_states=4 num_neighbors=8 num_nodes=58 1 0 0 0 3 1 0 1 1 2 1 1 0 0 2 2 0 1 1 2 1 0 2 2 1 1 0 3 3 0 1 1 2 2 0 2 4 5 5 6 1 2 0 0 1 1 2 1 1 0 1 3 0 0 0 2 8 9 9 10 3 3 7 7 11 1 0 2 2 0 2 5 6 6 13 1 2 0 0 0 2 9 10 10 15 1 0 1 1 0 1 1 0 0 0 1 0 0 0 0 2 17 18 18 19 3 14 16 16 20 4 12 12 21 21 2 10 15 15 15 2 18 19 19 19 3 23 24 24 24 4 21 21 25 25 5 22 26 22 26 6 27 27 27 27 1 0 0 0 2 2 1 2 2 29 3 30 14 14 16 2 6 13 13 13 3 32 23 23 24 4 31 31 33 33 2 15 15 15 15 2 19 19 19 19 3 35 36 36 36 4 33 33 37 37 5 34 38 34 38 6 39 39 39 39 7 28 28 40 40 1 0 0 0 1 2 42 17 17 18 3 7 11 11 43 3 16 20 20 20 4 44 44 45 45 3 24 24 24 24 4 45 45 47 47 5 46 48 46 48 6 49 49 49 49 3 36 36 36 36 4 25 25 51 51 5 26 52 26 52 6 53 53 53 53 7 50 50 54 54 8 41 55 41 55 9 56 56 56 56 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 93 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "..............................." "..............................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." /* icon for state 2 */ "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 3 */ "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." "BBBB..........................." XPM /* width height num_colors chars_per_pixel */ "15 45 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." "..............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." /* icon for state 2 */ "..BBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." /* icon for state 3 */ "..BBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." "BB............." XPM /* width height num_colors chars_per_pixel */ "7 21 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "......." "B......" "B......" "B......" "B......" "B......" "B......" /* icon for state 2 */ ".BBBBBB" "......." "......." "......." "......." "......." "......." /* icon for state 3 */ ".BBBBBB" "B......" "B......" "B......" "B......" "B......" "B......" golly-2.5-src/Rules/LifeOnTheSlope.rule0000644000175100001440000001010412156145314015012 00000000000000@RULE LifeOnTheSlope @TREE num_states=3 num_neighbors=8 num_nodes=78 1 0 0 0 1 0 0 2 1 0 1 0 2 0 1 2 1 2 2 0 1 0 1 2 2 1 4 5 1 1 0 1 2 2 5 7 3 3 6 8 1 2 0 0 2 4 0 10 1 1 0 0 2 5 10 12 3 6 11 13 2 7 12 0 3 8 13 15 4 9 14 16 2 0 0 2 1 0 2 1 2 10 2 19 3 11 18 20 2 12 19 1 3 13 20 22 4 14 21 23 2 0 1 0 3 15 22 25 4 16 23 26 5 17 24 27 2 2 2 7 2 19 7 4 3 20 29 30 2 1 4 1 3 22 30 32 4 23 31 33 3 25 32 25 4 26 33 35 5 27 34 36 6 28 37 28 3 18 18 29 4 21 39 31 5 24 40 34 2 7 7 0 3 29 29 42 2 4 0 4 3 30 42 44 4 31 43 45 3 32 44 32 4 33 45 47 5 34 46 48 6 41 49 41 7 38 38 50 4 39 39 43 5 40 52 46 2 0 0 0 3 42 42 54 4 43 43 55 3 44 54 44 4 45 55 57 5 46 56 58 6 53 59 53 7 50 50 60 8 51 51 61 4 35 47 35 5 36 48 63 6 37 64 37 4 47 57 47 5 48 58 66 6 49 67 49 7 65 65 68 3 54 54 54 4 55 55 70 4 57 70 57 5 58 71 72 6 59 73 59 7 68 68 74 8 69 69 75 9 62 76 62 @COLORS 1 200 200 255 pale blue 2 200 200 255 pale blue @ICONS XPM /* width height num_colors chars_per_pixel */ "31 62 2 1" /* colors */ "A c #FFFFFF" ". c #000000" /* icon for state 1 */ "AAA............................" "AAAA..........................." "AAAAA.........................." ".AAAAA........................." "..AAAAA........................" "...AAAAA......................." "....AAAAA......................" ".....AAAAA....................." "......AAAAA...................." ".......AAAAA..................." "........AAAAA.................." ".........AAAAA................." "..........AAAAA................" "...........AAAAA..............." "............AAAAA.............." ".............AAAAA............." "..............AAAAA............" "...............AAAAA..........." "................AAAAA.........." ".................AAAAA........." "..................AAAAA........" "...................AAAAA......." "....................AAAAA......" ".....................AAAAA....." "......................AAAAA...." ".......................AAAAA..." "........................AAAAA.." ".........................AAAAA." "..........................AAAAA" "...........................AAAA" "............................AAA" /* icon for state 2 */ "............................AAA" "...........................AAAA" "..........................AAAAA" ".........................AAAAA." "........................AAAAA.." ".......................AAAAA..." "......................AAAAA...." ".....................AAAAA....." "....................AAAAA......" "...................AAAAA......." "..................AAAAA........" ".................AAAAA........." "................AAAAA.........." "...............AAAAA..........." "..............AAAAA............" ".............AAAAA............." "............AAAAA.............." "...........AAAAA..............." "..........AAAAA................" ".........AAAAA................." "........AAAAA.................." ".......AAAAA..................." "......AAAAA...................." ".....AAAAA....................." "....AAAAA......................" "...AAAAA......................." "..AAAAA........................" ".AAAAA........................." "AAAAA.........................." "AAAA..........................." "AAA............................" XPM /* width height num_colors chars_per_pixel */ "15 30 2 1" /* colors */ "A c #FFFFFF" ". c #000000" /* icon for state 1 */ "AA............." "AAA............" ".AAA..........." "..AAA.........." "...AAA........." "....AAA........" ".....AAA......." "......AAA......" ".......AAA....." "........AAA...." ".........AAA..." "..........AAA.." "...........AAA." "............AAA" ".............AA" /* icon for state 2 */ ".............AA" "............AAA" "...........AAA." "..........AAA.." ".........AAA..." "........AAA...." ".......AAA....." "......AAA......" ".....AAA......." "....AAA........" "...AAA........." "..AAA.........." ".AAA..........." "AAA............" "AA............." XPM /* width height num_colors chars_per_pixel */ "7 14 2 1" /* colors */ "A c #FFFFFF" ". c #000000" /* icon for state 1 */ "A......" ".A....." "..A...." "...A..." "....A.." ".....A." "......A" /* icon for state 2 */ "......A" ".....A." "....A.." "...A..." "..A...." ".A....." "A......" golly-2.5-src/Rules/Life.rule0000644000175100001440000000044112156145314013054 00000000000000@RULE Life @TREE num_states=2 num_neighbors=8 num_nodes=32 1 0 0 2 0 0 1 0 1 2 0 2 3 1 3 1 1 1 2 2 5 3 3 6 4 4 7 2 5 0 3 6 9 4 7 10 5 8 11 3 9 1 4 10 13 5 11 14 6 12 15 3 1 1 4 13 17 5 14 18 6 15 19 7 16 20 4 17 17 5 18 22 6 19 23 7 20 24 8 21 25 5 22 22 6 23 27 7 24 28 8 25 29 9 26 30 golly-2.5-src/Rules/Perrier.rule0000644000175100001440000002454712156145314013622 00000000000000@RULE Perrier J.-Y. Perrier, M. Sipper, and J. Zahnd "Toward a viable, self-reproducing universal computer" Physica D, vol. 97, pp. 335-352, 1996 Thanks to Gianluca Tempesti for the transition table and the pattern. Two small changes have been made. Firstly a conflicting rule has been removed. This only causes a problem in some packages, where the first applicable rule is used - other packages used the last applicable rule. Secondly a rule has been added to correct what appears to be a rare bug that shows up when trying to write to the first entry on the data tape. Other such cases might exist. Contact: tim.hutton@gmail.com @TABLE # rules: 637 n_states:64 neighborhood:vonNeumann symmetries:none var a={14,15,16} var b={11,12} var c={4,5,6,7,8,9,10} var d={32,33,34,35,36,37,38} var e={0,1,2,14,15,16} var f={32,33,34,35,36,37,38} var g={39,40} var h={39,40} var i={28,29,30,31,41} var j={28,29,30,31,41} var k={4,5,6,7,8} var l={9,10} var m={11,12} var n={2,28,29,30,31,41} var o={11,12} var p={47,48} 1,2,a,2,0,a 0,2,1,2,a,1 a,2,0,2,1,0 1,a,2,0,2,a a,0,2,1,2,0 0,1,2,a,2,1 1,2,0,2,a,a a,2,1,2,0,0 0,2,a,2,1,1 1,1,2,a,2,a 0,a,2,1,2,1 1,2,a,0,2,a 0,1,a,3,2,1 a,1,1,2,0,0 a,2,2,0,1,0 1,2,1,2,a,a a,2,0,1,2,0 1,a,0,3,2,a 0,a,a,2,1,1 a,1,2,0,2,0 0,2,2,1,a,1 0,2,1,a,2,1 a,0,1,3,2,0 1,0,0,2,a,a 1,0,2,a,2,a 1,2,2,2,a,a a,2,2,2,0,1 2,0,0,0,14,1 0,0,0,1,2,2 0,0,0,0,1,2 0,1,0,0,2,2 1,2,2,a,1,a 1,2,a,2,1,a 1,2,2,a,0,a 1,2,a,1,2,a 1,a,2,1,2,a 1,a,1,3,2,a 1,1,1,2,a,a 2,0,0,15,2,17 0,17,2,1,a,1 17,0,0,0,2,2 2,0,15,2,0,17 0,2,1,a,17,1 17,0,0,2,0,2 1,17,2,2,15,15 17,0,0,15,2,1 15,17,2,2,0,1 0,0,0,1,0,2 0,0,0,2,1,2 1,1,2,2,a,a 1,2,2,a,2,a a,1,2,2,0,0 2,0,0,14,0,1 14,2,2,0,2,1 0,a,2,2,1,1 0,0,1,2,0,2 1,0,2,2,a,a 15,2,2,0,2,1 1,2,2,15,17,15 17,0,15,2,0,1 15,2,2,0,17,1 0,0,2,1,0,2 0,0,1,0,0,2 1,2,a,2,2,a 2,0,14,0,0,1 14,2,0,2,2,1 0,1,2,0,0,2 2,15,2,0,0,17 15,2,0,2,2,1 1,2,15,17,2,15 17,15,2,0,0,1 15,2,0,17,2,1 0,2,1,0,0,2 0,1,0,0,0,2 1,a,2,2,2,a 2,14,0,0,0,1 14,0,2,2,2,1 0,2,0,0,1,2 0,1,0,2,0,2 2,14,0,2,0,17 2,17,2,0,2,1 17,1,0,2,0,1 0,2,1,2,0,2 1,1,0,2,14,0 1,2,0,2,0,16 0,2,0,2,1,18 18,2,0,2,1,2 1,14,18,1,2,19 1,19,2,0,2,19 19,0,2,1,2,0 0,1,2,19,2,1 18,2,0,2,14,2 14,2,18,2,0,18 0,1,16,2,18,1 1,19,0,2,2,19 2,0,2,18,2,0 18,2,2,2,1,0 1,2,18,2,14,18 2,19,2,0,2,20 1,2,0,2,19,14 19,0,1,2,2,0 0,14,18,2,1,1 2,18,2,2,2,18 18,2,0,2,0,2 0,1,a,20,2,1 2,1,18,b,2,18 18,2,2,2,2,2 a,1,2,18,0,0 18,15,2,b,2,2 2,0,18,2,2,18 2,18,0,2,b,21 1,2,0,18,a,a 18,1,2,2,2,2 2,a,18,0,2,18 0,2,a,18,1,1 18,0,2,0,2,2 2,1,18,0,2,18 2,16,0,0,2,20 18,1,2,0,2,2 0,a,2,20,1,1 1,a,0,20,2,a a,0,1,20,2,0 1,0,2,20,a,a a,1,2,20,0,0 a,2,1,18,0,0 18,a,2,0,2,2 2,0,18,2,3,18 18,1,2,2,3,2 2,18,0,2,c,18 18,2,0,2,4,32 18,2,0,2,5,33 18,2,0,2,6,34 18,2,0,2,7,35 18,2,0,2,8,36 18,2,0,2,9,37 18,2,0,2,10,38 18,d,0,2,6,34 18,d,0,2,5,33 18,d,0,2,7,35 18,d,0,2,8,36 18,d,0,2,9,37 18,d,0,2,10,38 d,2,0,18,c,2 2,e,2,d,3,d 1,2,0,d,a,a d,e,2,2,3,2 2,e,2,0,d,d 2,f,0,d,c,d d,e,2,0,2,2 2,e,f,d,3,d d,2,0,2,c,2 2,e,f,0,d,d 0,2,e,d,1,1 2,e,2,2,d,d a,2,1,d,0,0 1,a,1,20,2,a d,e,2,2,2,2 2,e,2,b,d,d 2,2,2,21,d,d d,e,2,b,2,2 1,0,2,d,a,a 2,e,f,2,d,d 2,18,0,0,c,18 d,2,2,21,2,2 2,e,f,b,d,d 18,f,0,0,6,34 18,f,0,0,4,32 18,f,0,0,5,33 18,f,0,0,7,35 18,f,0,0,8,36 18,f,0,0,9,37 18,f,0,0,10,38 2,2,f,21,d,d 0,20,0,0,0,22 2,2,20,0,d,d d,2,20,0,2,2 0,d,22,0,0,d 0,a,2,d,1,1 a,1,2,d,0,0 2,2,20,f,d,d 22,20,0,0,32,4 22,20,0,0,33,5 22,20,0,0,34,6 22,20,0,0,35,7 22,20,0,0,36,8 22,20,0,0,37,9 22,20,0,0,38,10 d,2,22,0,0,2 0,2,0,0,c,2 0,c,0,0,0,22 2,d,c,0,0,d d,2,20,2,2,2 d,2,c,0,0,2 22,c,0,0,34,6 22,c,0,0,33,5 22,c,0,0,32,4 22,c,0,0,35,7 22,c,0,0,36,8 22,c,0,0,37,9 22,c,0,0,38,10 2,d,c,f,0,d 1,1,2,20,14,14 d,2,c,2,0,2 d,2,0,0,c,23 d,2,0,23,c,23 23,d,0,0,c,2 23,d,0,2,c,2 d,e,2,23,3,23 23,e,d,2,3,2 d,e,2,0,23,23 23,e,d,0,2,2 d,e,2,2,23,23 23,e,d,2,2,2 d,e,2,b,23,23 23,e,d,b,2,2 d,2,2,21,23,23 23,2,d,21,2,2 d,2,20,2,23,23 d,23,c,2,0,23 23,2,20,d,2,2 23,2,c,d,0,2 d,23,c,0,0,23 d,23,22,0,0,23 0,23,22,0,0,23 23,2,c,23,0,2 23,23,22,0,0,0 22,c,0,0,23,2 21,23,0,2,b,24 24,2,0,2,12,40 24,2,0,2,11,39 2,24,0,2,b,24 2,2,2,g,2,g g,2,0,24,b,2 24,g,0,2,11,39 24,g,0,2,12,40 2,0,2,0,g,g g,2,2,2,2,2 2,h,0,g,b,g g,0,2,0,2,2 2,2,h,g,2,g g,2,0,2,b,2 1,14,1,2,2,14 2,e,2,c,g,g 2,0,h,0,g,g a,0,1,2,2,0 2,e,2,2,g,g g,0,2,c,2,2 2,2,h,2,g,g 0,1,a,g,2,1 2,24,0,0,b,24 2,e,2,0,g,g g,0,2,2,2,2 0,2,a,g,1,1 2,1,h,c,g,g 24,g,0,0,12,40 24,g,0,0,11,39 1,a,0,2,2,a 2,1,h,2,g,g g,a,2,c,2,2 40,2,0,0,12,13 39,2,0,0,11,13 2,1,h,0,g,g g,a,2,2,2,2 a,2,1,g,0,0 0,1,a,2,2,1 2,0,h,c,g,g g,2,0,13,b,13 13,g,0,0,b,2 g,a,2,0,2,2 2,0,h,2,g,g g,1,2,c,2,2 1,a,0,g,2,a 13,g,0,2,b,2 2,e,20,0,g,g g,1,2,2,2,2 1,2,0,g,a,a 2,a,h,c,g,g 0,g,22,0,0,g g,e,20,0,2,2 g,1,2,0,2,2 2,a,h,2,g,g 22,20,0,0,40,12 22,20,0,0,39,11 g,2,22,0,0,2 2,e,20,h,g,g 2,a,h,0,g,g a,0,1,g,2,0 0,0,0,0,b,2 0,b,0,0,0,22 2,g,b,0,0,g g,e,20,2,2,2 g,2,b,0,0,2 g,2,2,13,2,13 g,0,2,0,13,13 13,2,g,2,2,2 2,e,13,b,2,13 2,g,b,h,0,g 2,g,22,0,0,g g,2,b,2,0,2 g,2,2,2,13,13 13,0,g,0,2,0 22,b,0,0,39,11 22,b,0,0,40,12 0,2,0,0,b,2 13,e,2,b,2,2 2,e,13,2,2,13 0,a,2,13,1,1 13,2,g,2,0,2 a,2,1,13,0,0 13,e,2,2,2,2 2,e,13,0,2,13 2,13,b,2,0,25 g,e,2,2,3,3 13,e,2,0,2,2 1,2,0,13,a,a 25,2,b,2,0,26 g,e,2,0,3,3 3,e,g,2,3,2 0,2,26,0,0,25 26,2,b,2,0,2 0,2,a,13,1,1 3,e,g,0,2,2 2,e,13,2,3,13 13,e,2,2,3,2 2,13,0,2,c,25 g,e,20,2,3,3 1,2,0,3,a,a g,3,b,2,0,23 20,e,0,b,3,3 3,e,20,g,2,2 0,2,0,2,3,3 3,e,0,b,2,2 g,23,b,2,0,23 23,2,b,g,0,2 1,0,2,3,a,a 2,2,0,3,e,26 3,2,0,2,2,2 0,a,26,2,1,1 a,1,26,2,0,0 g,23,11,0,0,23 g,23,22,0,0,23 22,b,0,0,23,2 23,2,b,23,0,2 1,1,26,2,14,14 1,0,26,2,14,14 1,0,26,2,15,15 1,0,26,2,16,17 1,0,2,17,2,14 17,1,26,2,0,0 0,2,17,2,1,1 26,2,0,2,17,27 27,2,0,2,0,1 0,14,27,2,1,1 0,0,0,0,27,17 1,0,1,2,14,14 1,2,17,2,14,14 14,2,17,2,0,1 17,0,0,0,14,27 27,0,0,0,1,1 1,2,17,2,15,15 17,0,0,0,15,1 15,2,17,2,0,27 17,0,0,27,2,2 0,0,0,1,17,2 27,17,1,2,1,1 1,2,27,2,15,14 25,2,0,2,4,28 25,2,0,2,5,29 25,2,0,2,6,30 25,2,0,2,7,31 25,2,0,2,8,41 2,e,2,i,3,i i,2,0,25,c,2 25,i,0,2,4,28 25,i,0,2,5,29 25,i,0,2,6,30 25,i,0,2,7,31 25,i,0,2,8,41 a,2,1,i,0,0 2,e,2,0,i,i 2,j,0,i,c,i i,e,2,0,2,2 2,e,j,i,3,i i,2,0,2,c,2 1,2,0,i,a,a i,e,2,2,3,2 2,e,j,0,i,i 2,25,0,2,k,25 2,25,0,2,l,42 i,2,0,42,8,2 2,e,2,25,i,i 2,e,2,2,28,28 i,e,2,25,2,2 2,e,2,2,29,29 2,e,2,2,30,30 2,e,2,2,31,43 2,e,2,2,41,41 0,2,a,i,1,1 2,e,j,25,i,i i,e,2,2,2,2 43,e,2,2,2,2 2,28,b,2,25,44 44,2,b,2,25,2 b,2,2,m,44,11 2,e,2,44,30,30 2,e,2,44,28,28 2,e,2,44,29,29 2,e,2,44,31,43 2,e,2,44,41,41 2,30,b,2,25,45 25,n,45,0,0,45 45,2,b,2,25,2 2,e,2,45,29,29 2,e,2,45,28,28 2,e,2,45,30,30 2,e,2,45,31,43 2,e,2,45,41,41 2,e,j,45,i,i 2,i,b,2,45,i 45,n,2,0,0,0 0,45,2,0,0,25 2,e,2,j,28,28 2,e,2,j,29,29 2,e,2,j,30,30 2,e,2,j,31,43 2,e,2,j,41,41 i,2,b,2,0,2 2,29,b,2,25,46 a,2,1,43,0,0 b,m,2,o,46,12 46,2,b,2,25,2 2,e,43,0,i,i 2,43,b,46,0,31 2,28,b,46,0,28 2,29,b,46,0,29 2,30,b,46,0,30 2,41,b,46,0,41 0,n,31,25,0,25 25,25,2,0,0,0 2,41,12,2,25,48 2,41,11,2,25,47 47,2,11,2,25,2 48,2,11,2,25,2 2,e,2,p,2,p 0,2,a,p,1,1 p,e,2,2,2,2 2,e,p,25,2,p a,2,1,p,0,0 p,e,2,25,2,2 2,e,p,0,2,p 1,2,0,p,a,a p,e,2,0,2,2 2,e,p,2,3,p p,e,2,2,3,2 2,p,0,2,c,p p,2,0,2,c,2 2,p,0,42,c,p p,2,0,42,c,2 42,47,0,2,c,49 49,2,0,2,c,2 2,49,0,2,l,49 2,49,0,2,k,25 2,2,0,i,c,i 2,25,0,0,c,25 25,i,0,0,6,30 25,i,0,0,5,29 25,i,0,0,4,28 25,i,0,0,7,31 25,i,0,0,8,41 i,2,0,0,c,2 25,0,45,0,0,45 2,i,b,45,0,i 45,0,2,0,0,0 2,i,b,j,0,i 20,e,2,c,23,2 2,30,b,0,25,50 25,0,50,0,0,0 50,2,b,0,25,2 0,50,2,0,0,50 2,i,b,50,0,i 0,0,50,0,0,25 50,2,2,0,0,2 2,b,0,0,50,11 0,50,22,0,0,50 0,50,0,0,0,51 0,b,0,0,51,2 51,2,0,0,0,0 2,41,11,51,25,47 2,41,12,51,25,48 2,32,b,51,25,44 2,33,b,51,25,46 2,30,b,51,25,50 2,43,b,45,0,31 2,43,b,i,0,31 0,0,31,25,0,25 2,e,43,25,31,31 2,43,b,2,25,52 0,2,a,43,1,1 1,2,0,43,a,a 2,e,2,52,31,43 2,e,2,52,28,28 2,e,2,52,29,29 2,e,2,52,30,30 2,52,b,2,0,53 53,52,b,2,0,52 2,53,b,2,0,53 52,52,b,53,0,25 52,25,b,53,0,2 52,2,b,53,0,2 2,53,b,0,0,53 0,53,2,0,0,53 53,52,b,0,0,52 2,b,0,0,53,b 53,52,2,0,0,2 b,m,2,2,52,53 0,53,0,0,0,52 0,b,0,0,52,2 52,2,0,0,0,0 53,b,2,m,2,b b,m,2,53,2,53 b,m,2,53,25,53 53,b,2,m,25,b b,2,2,53,52,53 53,2,2,b,52,11 52,43,53,25,25,53 25,53,b,2,0,2 53,i,11,25,25,2 53,43,11,25,25,2 43,e,2,2,i,2 i,e,2,2,j,2 1,2,1,i,14,14 1,2,1,43,14,14 i,e,2,25,j,2 i,e,2,0,j,2 52,2,53,25,25,53 53,2,11,25,25,2 g,e,2,c,13,3 1,2,1,f,14,14 1,2,0,23,a,a 1,0,2,23,a,a 1,2,1,13,14,14 i,e,2,j,3,2 2,e,43,25,i,i i,2,0,j,c,2 52,i,53,25,25,53 1,14,1,g,2,14 1,2,1,g,14,14 1,0,2,13,a,a a,2,1,3,0,0 a,1,2,3,0,0 48,2,12,2,25,2 42,48,0,2,10,55 55,2,0,2,10,54 2,55,0,2,10,55 55,54,0,2,10,54 54,54,0,56,c,2 2,57,0,2,k,56 57,2,0,2,c,2 2,54,0,57,c,54 54,54,0,2,c,2 2,54,0,56,c,54 2,54,0,54,c,54 54,2,0,2,c,2 2,55,0,2,k,56 56,54,0,2,c,57 56,2,0,2,k,58 54,2,0,58,k,2 58,54,0,2,l,57 58,2,0,2,k,25 2,2,b,p,0,p p,2,b,2,0,2 42,48,0,2,9,59 2,2,0,59,8,59 60,2,0,2,c,2 2,59,0,60,c,60 2,60,0,60,c,60 61,2,0,2,c,2 #2,2,0,61,c,59 - this rule is overwritten by later rules 59,2,0,2,l,2 2,61,0,60,c,60 59,2,0,2,k,62 62,2,0,60,k,61 60,62,0,2,c,2 2,59,0,2,10,63 2,59,0,63,c,60 2,63,0,2,10,63 63,2,0,2,10,2 2,60,0,63,c,60 62,2,0,2,c,25 2,i,b,2,0,i 2,41,12,0,25,48 2,41,11,0,25,47 48,2,12,0,25,2 47,2,11,0,25,2 2,43,b,2,0,31 g,23,b,0,0,23 18,d,0,2,4,32 2,57,0,2,l,57 58,54,0,2,k,57 57,54,0,2,c,2 54,2,0,58,l,2 0,2,a,23,1,1 0,a,2,23,1,1 a,1,2,13,0,0 2,57,0,0,k,56 56,2,0,0,k,58 58,54,0,0,k,2 0,2,a,3,1,1 58,2,0,0,k,25 25,2,0,0,6,30 25,2,0,0,5,29 25,2,0,0,4,28 25,2,0,0,7,31 25,2,0,0,8,41 2,2,0,61,k,59 2,2,0,61,l,61 0,a,2,3,1,1 2,63,0,0,10,63 63,2,0,0,10,2 b,m,2,o,44,11 b,2,2,m,46,12 2,43,b,44,0,31 2,28,b,44,0,28 2,29,b,44,0,29 2,30,b,44,0,30 2,31,b,44,0,31 2,41,b,44,0,41 a,2,1,23,0,0 a,1,2,23,0,0 1,2,1,p,14,14 2,29,b,0,25,46 46,2,b,0,25,2 b,m,2,2,46,12 b,m,2,2,44,11 2,28,b,0,25,44 44,2,12,0,25,2 2,e,2,52,41,41 2,e,2,46,i,i # rule added by TJH to correct an apparent bug @COLORS 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 9 159 116 187 10 255 135 128 11 184 25 181 12 235 199 185 13 187 40 166 14 99 110 94 15 226 149 86 16 52 181 122 17 221 138 196 18 97 152 80 19 57 189 164 20 252 38 183 21 211 148 59 22 59 241 164 23 203 170 40 24 222 164 132 25 162 204 172 26 179 133 87 27 55 203 233 28 92 71 22 29 188 231 154 30 145 96 127 31 112 205 26 32 40 94 120 33 28 29 23 34 31 70 253 35 29 80 34 36 174 45 190 37 143 50 251 38 227 98 100 39 41 115 190 40 167 65 28 41 243 50 195 42 104 21 68 43 40 30 20 44 73 82 194 45 176 35 168 46 216 102 181 47 90 199 188 48 83 70 120 49 211 218 78 50 174 115 98 51 205 183 158 52 179 112 83 53 220 158 134 54 80 190 199 55 108 218 146 56 45 94 219 57 211 176 68 58 246 20 49 59 91 92 85 60 188 165 228 61 71 246 39 62 232 202 95 63 169 99 242 golly-2.5-src/Rules/Sand-Margolus-emulated.rule0000644000175100001440000000622612156145314016456 00000000000000@RULE Sand-Margolus-emulated @TREE num_states=9 num_neighbors=8 num_nodes=113 1 0 2 2 4 4 6 6 8 8 1 0 1 2 3 4 5 6 7 8 2 0 1 0 1 0 1 0 1 0 2 1 1 1 1 1 1 1 1 1 1 0 2 1 4 3 6 5 8 7 2 0 1 4 1 4 1 4 1 4 3 2 3 5 3 5 3 5 3 5 3 3 3 3 3 3 3 3 3 3 3 5 3 5 3 5 3 5 3 5 4 6 7 8 7 8 7 8 7 8 4 7 7 7 7 7 7 7 7 7 2 4 1 4 1 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 7 13 7 13 5 9 10 14 10 14 10 14 10 14 1 0 1 1 3 3 5 5 7 7 2 16 1 16 1 16 1 16 1 16 3 17 3 17 3 17 3 17 3 17 4 18 7 18 7 18 7 18 7 18 5 19 10 19 10 19 10 19 10 19 1 0 2 2 2 4 6 6 8 8 2 0 1 21 1 21 1 21 1 21 2 0 1 21 1 0 1 0 1 0 3 2 3 22 3 23 3 23 3 23 4 24 7 24 7 24 7 24 7 24 5 25 10 25 10 25 10 25 10 25 3 2 3 23 3 23 3 23 3 23 4 27 7 27 7 27 7 27 7 27 5 28 10 28 10 28 10 28 10 28 6 15 20 26 20 29 20 29 20 29 5 10 10 10 10 10 10 10 10 10 6 20 20 31 20 31 20 31 20 31 3 2 3 2 3 2 3 2 3 2 1 0 1 2 3 2 5 6 7 8 2 1 1 34 1 34 1 34 1 34 3 35 35 3 35 3 35 3 35 3 2 1 1 34 1 1 1 1 1 1 3 37 37 3 37 3 37 3 37 3 4 33 36 33 38 33 38 33 38 33 5 39 10 39 10 39 10 39 10 39 4 24 36 24 38 24 38 24 38 24 5 41 10 41 10 41 10 41 10 41 4 27 36 27 38 27 38 27 38 27 5 43 10 43 10 43 10 43 10 43 6 40 31 42 31 44 31 44 31 44 4 33 38 33 38 33 38 33 38 33 5 46 10 46 10 46 10 46 10 46 4 24 38 24 38 24 38 24 38 24 5 48 10 48 10 48 10 48 10 48 4 27 38 27 38 27 38 27 38 27 5 50 10 50 10 50 10 50 10 50 6 47 31 49 31 51 31 51 31 51 7 30 32 45 32 52 32 52 32 52 6 31 31 31 31 31 31 31 31 31 7 32 32 54 32 54 32 54 32 54 4 33 7 33 7 33 7 33 7 33 1 0 1 4 3 4 5 6 7 8 2 57 57 1 57 1 57 1 57 1 3 3 3 58 3 58 3 58 3 58 4 59 7 59 7 59 7 59 7 59 5 56 10 56 60 56 10 56 60 56 5 25 10 25 60 25 10 25 60 25 5 28 10 28 60 28 10 28 60 28 6 61 31 62 31 63 31 63 31 63 5 39 10 39 60 39 10 39 60 39 5 41 10 41 60 41 10 41 60 41 5 43 10 43 60 43 10 43 60 43 6 65 31 66 31 67 31 67 31 67 5 46 10 46 60 46 10 46 60 46 5 48 10 48 60 48 10 48 60 48 5 50 10 50 60 50 10 50 60 50 6 69 31 70 31 71 31 71 31 71 7 64 54 68 54 72 54 72 54 72 3 3 3 3 3 58 3 58 3 58 4 74 7 74 7 74 7 74 7 74 5 56 75 56 60 56 10 56 75 56 5 25 75 25 60 25 10 25 75 25 5 28 75 28 60 28 10 28 75 28 6 76 31 77 31 78 31 78 31 78 5 39 75 39 60 39 10 39 75 39 5 41 75 41 60 41 10 41 75 41 5 43 75 43 60 43 10 43 75 43 6 80 31 81 31 82 31 82 31 82 5 46 75 46 60 46 10 46 75 46 5 48 75 48 60 48 10 48 75 48 5 50 75 50 60 50 10 50 75 50 6 84 31 85 31 86 31 86 31 86 7 79 54 83 54 87 54 87 54 87 8 53 55 73 55 88 55 73 55 73 1 0 1 3 3 3 5 5 7 7 2 90 1 90 1 90 1 90 1 90 3 91 3 91 3 91 3 91 3 91 4 18 7 92 7 92 7 92 7 92 5 19 10 19 10 93 10 19 10 93 6 94 94 31 94 31 94 31 94 31 7 95 95 54 95 54 95 54 95 54 7 54 54 54 54 54 54 54 54 54 8 96 96 97 96 97 96 97 96 97 5 56 10 56 10 56 10 56 10 56 6 99 31 26 31 29 31 29 31 29 7 100 54 45 54 52 54 52 54 52 8 101 97 73 97 88 97 73 97 73 4 18 7 18 7 92 7 92 7 92 5 19 10 103 10 93 10 19 10 103 6 104 104 31 104 31 104 31 104 31 7 105 105 54 105 54 105 54 105 54 8 106 106 97 106 97 106 97 106 97 5 19 10 19 10 93 10 19 10 103 6 108 108 31 108 31 108 31 108 31 7 109 109 54 109 54 109 54 109 54 8 110 110 97 110 97 110 97 110 97 9 89 98 102 107 102 98 102 111 102 @COLORS 1 90 90 90 2 62 62 62 3 255 255 0 4 220 220 0 5 120 100 0 6 100 80 0 7 148 148 148 8 103 103 103 golly-2.5-src/Rules/Sand-square4cyclic_emulated.rule0000644000175100001440000003503212156145314017517 00000000000000@RULE Sand-square4cyclic_emulated @TREE num_states=9 num_neighbors=8 num_nodes=460 1 0 1 1 3 3 5 5 7 7 1 0 1 2 3 4 5 6 7 8 2 0 1 0 1 0 1 0 1 0 1 0 2 1 4 3 6 5 8 7 1 0 2 2 4 4 6 6 8 8 2 3 4 3 4 3 4 3 4 3 2 1 1 0 1 0 1 0 1 0 3 2 5 6 5 6 5 6 5 6 2 1 1 1 1 1 1 1 1 1 3 5 5 8 5 8 5 8 5 8 3 6 8 6 8 6 8 6 8 6 4 7 9 10 9 10 9 10 9 10 2 4 4 1 4 1 4 1 4 1 3 8 12 8 12 8 12 8 12 8 3 12 12 8 12 8 12 8 12 8 3 8 8 8 8 8 8 8 8 8 4 13 14 15 14 15 14 15 14 15 2 3 1 3 1 3 1 3 1 3 3 2 17 2 17 2 17 2 17 2 3 17 17 8 17 8 17 8 17 8 3 2 8 2 8 2 8 2 8 2 4 18 19 20 19 20 19 20 19 20 5 11 16 21 16 21 16 21 16 21 2 0 1 3 1 3 1 3 1 3 1 0 1 2 3 2 5 6 7 8 2 4 24 4 24 4 24 4 24 4 2 4 24 4 1 4 1 4 1 4 3 23 25 2 26 2 26 2 26 2 2 4 1 4 1 4 1 4 1 4 3 28 25 8 26 8 26 8 26 8 4 27 29 20 29 20 29 20 29 20 2 1 24 1 24 1 24 1 24 1 2 1 24 1 1 1 1 1 1 1 3 8 31 8 32 8 32 8 32 8 4 33 33 15 33 15 33 15 33 15 3 17 28 2 28 2 28 2 28 2 3 28 28 8 28 8 28 8 28 8 4 35 36 20 36 20 36 20 36 20 5 30 34 37 34 37 34 37 34 37 2 0 4 0 4 0 4 0 4 0 2 3 4 0 4 0 4 0 4 0 1 0 1 2 1 4 5 6 7 8 2 1 1 41 1 41 1 41 1 41 2 1 1 41 1 1 1 1 1 1 3 39 40 42 40 43 40 43 40 43 3 40 40 8 40 8 40 8 40 8 3 8 8 42 8 43 8 43 8 43 4 44 45 46 45 46 45 46 45 46 4 14 14 15 14 15 14 15 14 15 3 2 2 42 2 43 2 43 2 43 3 2 2 8 2 8 2 8 2 8 4 49 50 46 50 46 50 46 50 46 5 47 48 51 48 51 48 51 48 51 3 23 26 2 26 2 26 2 26 2 3 28 26 8 26 8 26 8 26 8 4 53 54 20 54 20 54 20 54 20 3 8 32 8 32 8 32 8 32 8 4 56 56 15 56 15 56 15 56 15 5 55 57 37 57 37 57 37 57 37 3 39 40 43 40 43 40 43 40 43 3 8 8 43 8 43 8 43 8 43 4 59 45 60 45 60 45 60 45 60 3 2 2 43 2 43 2 43 2 43 4 62 50 60 50 60 50 60 50 60 5 61 48 63 48 63 48 63 48 63 6 22 38 52 58 64 58 64 58 64 3 23 28 2 28 2 28 2 28 2 2 0 41 0 41 0 41 0 41 0 3 67 8 67 8 67 8 67 8 67 2 0 41 0 1 0 1 0 1 0 3 69 8 69 8 69 8 69 8 69 4 66 36 68 36 70 36 70 36 70 2 1 41 1 41 1 41 1 41 1 3 72 8 72 8 72 8 72 8 72 2 1 41 1 1 1 1 1 1 1 3 74 8 74 8 74 8 74 8 74 4 15 15 73 15 75 15 75 15 75 5 71 76 37 76 37 76 37 76 37 4 27 29 68 29 70 29 70 29 70 4 33 33 73 33 75 33 75 33 75 5 78 79 37 79 37 79 37 79 37 4 15 15 15 15 15 15 15 15 15 5 81 81 81 81 81 81 81 81 81 4 53 54 68 54 70 54 70 54 70 4 56 56 73 56 75 56 75 56 75 5 83 84 37 84 37 84 37 84 37 6 77 80 82 85 82 85 82 85 82 3 39 40 8 40 8 40 8 40 8 1 0 1 1 3 1 5 5 7 7 2 3 4 88 4 88 4 88 4 88 3 89 89 8 89 8 89 8 89 8 2 3 4 88 4 0 4 0 4 0 3 91 91 8 91 8 91 8 91 8 4 87 90 15 92 15 92 15 92 15 2 0 1 88 1 88 1 88 1 88 3 94 94 8 94 8 94 8 94 8 2 0 1 88 1 0 1 0 1 0 3 96 96 8 96 8 96 8 96 8 4 50 95 15 97 15 97 15 97 15 5 93 48 98 48 98 48 98 48 98 4 44 90 46 92 46 92 46 92 46 4 49 95 46 97 46 97 46 97 46 5 100 48 101 48 101 48 101 48 101 4 59 90 60 92 60 92 60 92 60 4 62 95 60 97 60 97 60 97 60 5 103 48 104 48 104 48 104 48 104 6 99 82 102 82 105 82 105 82 105 4 66 36 70 36 70 36 70 36 70 4 15 15 75 15 75 15 75 15 75 5 107 108 37 108 37 108 37 108 37 4 27 29 70 29 70 29 70 29 70 4 33 33 75 33 75 33 75 33 75 5 110 111 37 111 37 111 37 111 37 4 53 54 70 54 70 54 70 54 70 4 56 56 75 56 75 56 75 56 75 5 113 114 37 114 37 114 37 114 37 6 109 112 82 115 82 115 82 115 82 4 87 92 15 92 15 92 15 92 15 4 50 97 15 97 15 97 15 97 15 5 117 48 118 48 118 48 118 48 118 4 44 92 46 92 46 92 46 92 46 4 49 97 46 97 46 97 46 97 46 5 120 48 121 48 121 48 121 48 121 4 59 92 60 92 60 92 60 92 60 4 62 97 60 97 60 97 60 97 60 5 123 48 124 48 124 48 124 48 124 6 119 82 122 82 125 82 125 82 125 7 65 86 106 116 126 116 126 116 126 4 66 36 20 36 20 36 20 36 20 1 0 4 2 4 4 6 6 8 8 2 129 1 129 1 129 1 129 1 129 3 17 130 2 130 2 130 2 130 2 3 28 130 8 130 8 130 8 130 8 4 131 132 20 132 20 132 20 132 20 5 128 81 37 81 133 81 37 81 133 5 30 34 37 34 133 34 37 34 133 5 55 57 37 57 133 57 37 57 133 6 134 135 82 136 82 136 82 136 82 5 71 76 37 76 133 76 37 76 133 5 78 79 37 79 133 79 37 79 133 5 83 84 37 84 133 84 37 84 133 6 138 139 82 140 82 140 82 140 82 6 82 82 82 82 82 82 82 82 82 5 107 108 37 108 133 108 37 108 133 5 110 111 37 111 133 111 37 111 133 5 113 114 37 114 133 114 37 114 133 6 143 144 82 145 82 145 82 145 82 7 137 141 142 146 142 146 142 146 142 4 87 45 15 45 15 45 15 45 15 4 50 50 15 50 15 50 15 50 15 1 0 1 4 3 4 5 6 7 8 2 150 150 1 150 1 150 1 150 1 3 12 12 151 12 151 12 151 12 151 3 8 8 151 8 151 8 151 8 151 4 152 14 153 14 153 14 153 14 153 5 148 48 149 154 149 48 149 154 149 5 47 48 51 154 51 48 51 154 51 5 61 48 63 154 63 48 63 154 63 6 155 82 156 82 157 82 157 82 157 5 93 48 98 154 98 48 98 154 98 5 100 48 101 154 101 48 101 154 101 5 103 48 104 154 104 48 104 154 104 6 159 82 160 82 161 82 161 82 161 5 117 48 118 154 118 48 118 154 118 5 120 48 121 154 121 48 121 154 121 5 123 48 124 154 124 48 124 154 124 6 163 82 164 82 165 82 165 82 165 7 158 142 162 142 166 142 166 142 166 3 17 28 2 130 2 130 2 130 2 3 28 28 8 130 8 130 8 130 8 4 168 169 20 169 20 169 20 169 20 5 128 81 170 81 133 81 37 81 170 5 30 34 170 34 133 34 37 34 170 5 55 57 170 57 133 57 37 57 170 6 171 172 82 173 82 173 82 173 82 5 71 76 170 76 133 76 37 76 170 5 78 79 170 79 133 79 37 79 170 5 83 84 170 84 133 84 37 84 170 6 175 176 82 177 82 177 82 177 82 5 107 108 170 108 133 108 37 108 170 5 110 111 170 111 133 111 37 111 170 5 113 114 170 114 133 114 37 114 170 6 179 180 82 181 82 181 82 181 82 7 174 178 142 182 142 182 142 182 142 3 12 12 8 12 151 12 151 12 151 3 8 8 8 8 151 8 151 8 151 4 184 14 185 14 185 14 185 14 185 5 148 186 149 154 149 48 149 186 149 5 47 186 51 154 51 48 51 186 51 5 61 186 63 154 63 48 63 186 63 6 187 82 188 82 189 82 189 82 189 5 93 186 98 154 98 48 98 186 98 5 100 186 101 154 101 48 101 186 101 5 103 186 104 154 104 48 104 186 104 6 191 82 192 82 193 82 193 82 193 5 117 186 118 154 118 48 118 186 118 5 120 186 121 154 121 48 121 186 121 5 123 186 124 154 124 48 124 186 124 6 195 82 196 82 197 82 197 82 197 7 190 142 194 142 198 142 198 142 198 8 127 147 167 183 199 147 167 147 167 1 0 1 3 3 3 5 5 7 7 2 201 1 201 1 201 1 201 1 201 3 202 8 202 8 202 8 202 8 202 4 35 36 203 36 203 36 203 36 203 5 128 81 37 81 204 81 37 81 204 5 30 34 37 34 204 34 37 34 204 5 55 57 37 57 204 57 37 57 204 6 205 206 82 207 82 207 82 207 82 5 71 76 37 76 204 76 37 76 204 5 78 79 37 79 204 79 37 79 204 5 83 84 37 84 204 84 37 84 204 6 209 210 82 211 82 211 82 211 82 5 107 108 37 108 204 108 37 108 204 5 110 111 37 111 204 111 37 111 204 5 113 114 37 114 204 114 37 114 204 6 213 214 82 215 82 215 82 215 82 7 208 212 142 216 142 216 142 216 142 4 131 132 203 132 203 132 203 132 203 5 128 81 37 81 218 81 37 81 218 5 30 34 37 34 218 34 37 34 218 5 55 57 37 57 218 57 37 57 218 6 219 220 82 221 82 221 82 221 82 5 71 76 37 76 218 76 37 76 218 5 78 79 37 79 218 79 37 79 218 5 83 84 37 84 218 84 37 84 218 6 223 224 82 225 82 225 82 225 82 5 107 108 37 108 218 108 37 108 218 5 110 111 37 111 218 111 37 111 218 5 113 114 37 114 218 114 37 114 218 6 227 228 82 229 82 229 82 229 82 7 222 226 142 230 142 230 142 230 142 7 142 142 142 142 142 142 142 142 142 4 168 169 203 169 203 169 203 169 203 5 128 81 170 81 218 81 37 81 233 5 30 34 170 34 218 34 37 34 233 5 55 57 170 57 218 57 37 57 233 6 234 235 82 236 82 236 82 236 82 5 71 76 170 76 218 76 37 76 233 5 78 79 170 79 218 79 37 79 233 5 83 84 170 84 218 84 37 84 233 6 238 239 82 240 82 240 82 240 82 5 107 108 170 108 218 108 37 108 233 5 110 111 170 111 218 111 37 111 233 5 113 114 170 114 218 114 37 114 233 6 242 243 82 244 82 244 82 244 82 7 237 241 142 245 142 245 142 245 142 8 217 231 232 246 232 231 232 231 232 2 129 129 1 129 1 129 1 129 1 3 248 248 8 248 8 248 8 248 8 4 14 249 15 249 15 249 15 249 15 5 148 48 149 250 149 48 149 250 149 5 47 48 51 250 51 48 51 250 51 5 61 48 63 250 63 48 63 250 63 6 251 82 252 82 253 82 253 82 253 5 93 48 98 250 98 48 98 250 98 5 100 48 101 250 101 48 101 250 101 5 103 48 104 250 104 48 104 250 104 6 255 82 256 82 257 82 257 82 257 5 117 48 118 250 118 48 118 250 118 5 120 48 121 250 121 48 121 250 121 5 123 48 124 250 124 48 124 250 124 6 259 82 260 82 261 82 261 82 261 7 254 142 258 142 262 142 262 142 262 4 152 249 153 249 153 249 153 249 153 5 148 48 149 264 149 48 149 264 149 5 47 48 51 264 51 48 51 264 51 5 61 48 63 264 63 48 63 264 63 6 265 82 266 82 267 82 267 82 267 5 93 48 98 264 98 48 98 264 98 5 100 48 101 264 101 48 101 264 101 5 103 48 104 264 104 48 104 264 104 6 269 82 270 82 271 82 271 82 271 5 117 48 118 264 118 48 118 264 118 5 120 48 121 264 121 48 121 264 121 5 123 48 124 264 124 48 124 264 124 6 273 82 274 82 275 82 275 82 275 7 268 142 272 142 276 142 276 142 276 4 184 249 185 249 185 249 185 249 185 5 148 186 149 264 149 48 149 278 149 5 47 186 51 264 51 48 51 278 51 5 61 186 63 264 63 48 63 278 63 6 279 82 280 82 281 82 281 82 281 5 93 186 98 264 98 48 98 278 98 5 100 186 101 264 101 48 101 278 101 5 103 186 104 264 104 48 104 278 104 6 283 82 284 82 285 82 285 82 285 5 117 186 118 264 118 48 118 278 118 5 120 186 121 264 121 48 121 278 121 5 123 186 124 264 124 48 124 278 124 6 287 82 288 82 289 82 289 82 289 7 282 142 286 142 290 142 290 142 290 8 263 232 277 232 291 232 277 232 277 4 35 36 20 36 203 36 203 36 203 5 128 81 293 81 204 81 37 81 293 5 30 34 293 34 204 34 37 34 293 5 55 57 293 57 204 57 37 57 293 6 294 295 82 296 82 296 82 296 82 5 71 76 293 76 204 76 37 76 293 5 78 79 293 79 204 79 37 79 293 5 83 84 293 84 204 84 37 84 293 6 298 299 82 300 82 300 82 300 82 5 107 108 293 108 204 108 37 108 293 5 110 111 293 111 204 111 37 111 293 5 113 114 293 114 204 114 37 114 293 6 302 303 82 304 82 304 82 304 82 7 297 301 142 305 142 305 142 305 142 4 131 132 20 132 203 132 203 132 203 5 128 81 293 81 218 81 37 81 307 5 30 34 293 34 218 34 37 34 307 5 55 57 293 57 218 57 37 57 307 6 308 309 82 310 82 310 82 310 82 5 71 76 293 76 218 76 37 76 307 5 78 79 293 79 218 79 37 79 307 5 83 84 293 84 218 84 37 84 307 6 312 313 82 314 82 314 82 314 82 5 107 108 293 108 218 108 37 108 307 5 110 111 293 111 218 111 37 111 307 5 113 114 293 114 218 114 37 114 307 6 316 317 82 318 82 318 82 318 82 7 311 315 142 319 142 319 142 319 142 4 168 169 20 169 203 169 203 169 203 5 128 81 321 81 218 81 37 81 321 5 30 34 321 34 218 34 37 34 321 5 55 57 321 57 218 57 37 57 321 6 322 323 82 324 82 324 82 324 82 5 71 76 321 76 218 76 37 76 321 5 78 79 321 79 218 79 37 79 321 5 83 84 321 84 218 84 37 84 321 6 326 327 82 328 82 328 82 328 82 5 107 108 321 108 218 108 37 108 321 5 110 111 321 111 218 111 37 111 321 5 113 114 321 114 218 114 37 114 321 6 330 331 82 332 82 332 82 332 82 7 325 329 142 333 142 333 142 333 142 8 306 320 232 334 232 320 232 320 232 4 14 14 15 249 15 249 15 249 15 5 148 336 149 250 149 48 149 336 149 5 47 336 51 250 51 48 51 336 51 5 61 336 63 250 63 48 63 336 63 6 337 82 338 82 339 82 339 82 339 5 93 336 98 250 98 48 98 336 98 5 100 336 101 250 101 48 101 336 101 5 103 336 104 250 104 48 104 336 104 6 341 82 342 82 343 82 343 82 343 5 117 336 118 250 118 48 118 336 118 5 120 336 121 250 121 48 121 336 121 5 123 336 124 250 124 48 124 336 124 6 345 82 346 82 347 82 347 82 347 7 340 142 344 142 348 142 348 142 348 4 152 14 153 249 153 249 153 249 153 5 148 336 149 264 149 48 149 350 149 5 47 336 51 264 51 48 51 350 51 5 61 336 63 264 63 48 63 350 63 6 351 82 352 82 353 82 353 82 353 5 93 336 98 264 98 48 98 350 98 5 100 336 101 264 101 48 101 350 101 5 103 336 104 264 104 48 104 350 104 6 355 82 356 82 357 82 357 82 357 5 117 336 118 264 118 48 118 350 118 5 120 336 121 264 121 48 121 350 121 5 123 336 124 264 124 48 124 350 124 6 359 82 360 82 361 82 361 82 361 7 354 142 358 142 362 142 362 142 362 4 184 14 185 249 185 249 185 249 185 5 148 364 149 264 149 48 149 364 149 5 47 364 51 264 51 48 51 364 51 5 61 364 63 264 63 48 63 364 63 6 365 82 366 82 367 82 367 82 367 5 93 364 98 264 98 48 98 364 98 5 100 364 101 264 101 48 101 364 101 5 103 364 104 264 104 48 104 364 104 6 369 82 370 82 371 82 371 82 371 5 117 364 118 264 118 48 118 364 118 5 120 364 121 264 121 48 121 364 121 5 123 364 124 264 124 48 124 364 124 6 373 82 374 82 375 82 375 82 375 7 368 142 372 142 376 142 376 142 376 8 349 232 363 232 377 232 363 232 363 5 128 81 37 81 204 81 37 81 293 5 30 34 37 34 204 34 37 34 293 5 55 57 37 57 204 57 37 57 293 6 379 380 82 381 82 381 82 381 82 5 71 76 37 76 204 76 37 76 293 5 78 79 37 79 204 79 37 79 293 5 83 84 37 84 204 84 37 84 293 6 383 384 82 385 82 385 82 385 82 5 107 108 37 108 204 108 37 108 293 5 110 111 37 111 204 111 37 111 293 5 113 114 37 114 204 114 37 114 293 6 387 388 82 389 82 389 82 389 82 7 382 386 142 390 142 390 142 390 142 5 128 81 37 81 218 81 37 81 307 5 30 34 37 34 218 34 37 34 307 5 55 57 37 57 218 57 37 57 307 6 392 393 82 394 82 394 82 394 82 5 71 76 37 76 218 76 37 76 307 5 78 79 37 79 218 79 37 79 307 5 83 84 37 84 218 84 37 84 307 6 396 397 82 398 82 398 82 398 82 5 107 108 37 108 218 108 37 108 307 5 110 111 37 111 218 111 37 111 307 5 113 114 37 114 218 114 37 114 307 6 400 401 82 402 82 402 82 402 82 7 395 399 142 403 142 403 142 403 142 5 128 81 170 81 218 81 37 81 321 5 30 34 170 34 218 34 37 34 321 5 55 57 170 57 218 57 37 57 321 6 405 406 82 407 82 407 82 407 82 5 71 76 170 76 218 76 37 76 321 5 78 79 170 79 218 79 37 79 321 5 83 84 170 84 218 84 37 84 321 6 409 410 82 411 82 411 82 411 82 5 107 108 170 108 218 108 37 108 321 5 110 111 170 111 218 111 37 111 321 5 113 114 170 114 218 114 37 114 321 6 413 414 82 415 82 415 82 415 82 7 408 412 142 416 142 416 142 416 142 8 391 404 232 417 232 404 232 404 232 5 148 48 149 250 149 48 149 336 149 5 47 48 51 250 51 48 51 336 51 5 61 48 63 250 63 48 63 336 63 6 419 82 420 82 421 82 421 82 421 5 93 48 98 250 98 48 98 336 98 5 100 48 101 250 101 48 101 336 101 5 103 48 104 250 104 48 104 336 104 6 423 82 424 82 425 82 425 82 425 5 117 48 118 250 118 48 118 336 118 5 120 48 121 250 121 48 121 336 121 5 123 48 124 250 124 48 124 336 124 6 427 82 428 82 429 82 429 82 429 7 422 142 426 142 430 142 430 142 430 5 148 48 149 264 149 48 149 350 149 5 47 48 51 264 51 48 51 350 51 5 61 48 63 264 63 48 63 350 63 6 432 82 433 82 434 82 434 82 434 5 93 48 98 264 98 48 98 350 98 5 100 48 101 264 101 48 101 350 101 5 103 48 104 264 104 48 104 350 104 6 436 82 437 82 438 82 438 82 438 5 117 48 118 264 118 48 118 350 118 5 120 48 121 264 121 48 121 350 121 5 123 48 124 264 124 48 124 350 124 6 440 82 441 82 442 82 442 82 442 7 435 142 439 142 443 142 443 142 443 5 148 186 149 264 149 48 149 364 149 5 47 186 51 264 51 48 51 364 51 5 61 186 63 264 63 48 63 364 63 6 445 82 446 82 447 82 447 82 447 5 93 186 98 264 98 48 98 364 98 5 100 186 101 264 101 48 101 364 101 5 103 186 104 264 104 48 104 364 104 6 449 82 450 82 451 82 451 82 451 5 117 186 118 264 118 48 118 364 118 5 120 186 121 264 121 48 121 364 121 5 123 186 124 264 124 48 124 364 124 6 453 82 454 82 455 82 455 82 455 7 448 142 452 142 456 142 456 142 456 8 431 232 444 232 457 232 444 232 444 9 200 247 292 335 378 247 292 418 458 @COLORS 1 90 90 90 2 62 62 62 3 255 255 0 4 220 220 0 5 120 100 0 6 100 80 0 7 148 148 148 8 103 103 103 golly-2.5-src/Rules/SDSR-Loop.rule0000644000175100001440000003531112156145314013663 00000000000000@RULE SDSR-Loop Hiroki Sayama. "Introduction of Structural Dissolution into Langton's Self-Reproducing Loop." Artificial Life VI: Proceedings of the Sixth International Conference on Artificial Life, C. Adami, R. K. Belew, H. Kitano, and C. E. Taylor, eds., pp.114-122, Los Angeles, California, 1998, MIT Press. Transition rules from: http://necsi.org/postdocs/sayama/sdsr/java/loops.java Credits: "Self-Replicating Loops & Ant, Programmed by Eli Bachmutsky, Copyleft Feb.1999" Note that the transition table given in the above link is incomplete (it's the original Langton's Loops one), and is patched by the function set_undefined_rule(). The table below has these changes incorporated, and was produced automatically by a bottom-up merging procedure from the full 9^5 rule table. Tim Hutton @TABLE # rules: 142 # variables: 123 # format: CNESWC' # # Variables are bound within each transition. # For example, if a={1,2} then 4,a,0->a represents # two transitions: 4,1,0->1 and 4,2,0->2 n_states:9 neighborhood:vonNeumann symmetries:rotate4 var a={0,1,2} var b={0,1} var c={0,1} var d={0,1} var e={2,3} var f={0,1,2,3,4,5,6,7} var g={0,1,2,3,4,6,7} var h={4,6,7} var i={6,7} var j={0,1,2,3,4,5,6,7,8} var k={0,1,2,3,4,5,6,7,8} var l={2,3,4,5,6,7} var m={0,1,2,3,5} var n={0,1,8} var o={1,4,6,7} var p={0,1,3,5} var q={1,2,4,6,7} var r={3,5} var s={2,3,4,5,6} var t={0,3,5} var u={1,3,5} var v={0,5} var w={2,3,5} var x={0,2} var y={1,4,7} var z={0,3,5} var A={0,3,5} var B={0,2,3,4,5} var C={0,2,4,6,7} var D={0,1,2,4,6,7} var E={0,1,2,4,6,7} var F={1,3,4,6,7} var G={0,1,2,3,4,5} var H={0,1,2,3,4} var I={1,2,4} var J={0,3,5,6} var K={0,1,3,4,5,6} var L={1,2,4,6} var M={0,3} var N={0,2,3,5} var O={1,3,4,5,6,7} var P={0,1,3,4} var Q={1,2} var R={2,4,6,7} var S={0,1,2,3,4,5,6} var T={0,1,3,4,5,6,7} var U={1,5} var V={0,1,3,4,5} var W={1,3,5} var X={1,3,5} var Y={0,3,4,5,6} var Z={0,6} var aa={0,6} var ab={1,3} var ac={2,5} var ad={2,3,5} var ae={0,7} var af={2,7} var ag={1,4,6,7,8} var ah={1,3,5} var ai={1,2,3,4,5} var aj={1,4,5,6,7} var ak={1,2,3,5} var al={1,2,3,5} var am={4,7} var an={0,5,6} var ao={0,5,6} var ap={0,5,6} var aq={0,5,6} var ar={0,3} var as={0,3} var at={3,7} var au={2,3,5,8} var av={0,1,2,3,4,5,6,7,8} var aw={0,1,4,5,6,7} var ax={0,1,4,5,6,7} var ay={1,4,6,7} var az={0,1,2,3,4,5,6,7} var aA={2,8} var aB={4,5,6,7} var aC={4,5,6} var aD={0,1,5} var aE={0,1,5} var aF={1,4,5,6,7} var aG={0,1,2,4,5,6,7} var aH={5,6,7} var aI={0,2,3,4,5,6,7} var aJ={0,4,6,7} var aK={2,3,5,7} var aL={1,2,3,4,6,7} var aM={1,2,3,4,5,6,7} var aN={3,4,6,7,8} var aO={1,3,4,5,6,7} var aP={2,4,6,7} var aQ={4,5} var aR={0,1,3,4,6,7} var aS={4,6,7,8} var aT={1,2,4,6,7} var aU={4,6,8} var aV={1,2,3,4,5,6,7} var aW={1,2,3,4,5,6,7} var aX={1,2,3,4,5,6,7} var aY={0,3,7} var aZ={0,1,2,3} var ba={0,3,4,5,6,7} var bb={5,8} var bc={0,1,7} var bd={0,1,3,7} var be={1,2,7} var bf={1,3,6,7} var bg={0,1,2,3,7} var bh={3,6} var bi={5,6} var bj={2,3,4,5,6,7} var bk={2,3,4,5,6,7} var bl={2,3,4,5,6,7} var bm={6,8} var bn={6,7,8} var bo={3,4,6,7} var bp={1,6} var bq={0,1,4,6,7} var br={0,1,2,3,4,5,6,7} var bs={0,1,2,3,4,5,6,7} 0,0,0,a,1,2 0,0,0,0,6,3 0,b,c,d,7,1 0,0,0,1,e,2 0,f,g,1,h,1 0,0,0,2,i,2 b,j,k,l,8,8 0,m,f,h,1,1 0,0,0,5,2,5 0,0,0,i,2,2 b,f,n,8,l,8 0,m,1,f,o,1 0,0,1,0,2,2 0,p,1,q,r,1 0,m,1,s,2,1 b,c,l,d,8,8 0,t,2,1,u,1 0,v,2,1,2,5 0,0,2,w,1,1 0,0,2,3,2,2 0,0,r,1,q,1 0,0,r,2,1,1 0,0,5,2,2,2 x,1,q,3,f,1 0,1,7,2,5,5 0,2,5,2,7,1 y,t,z,A,B,8 1,C,D,E,7,7 F,A,t,f,r,8 1,G,H,I,4,4 1,J,K,L,6,6 1,M,p,N,w,8 O,A,t,3,f,8 1,m,P,4,Q,4 F,0,A,5,R,8 1,S,K,6,L,6 1,f,T,7,q,7 U,M,u,m,w,8 1,p,I,A,4,4 1,A,L,V,6,6 u,A,W,w,X,8 1,p,q,f,7,7 1,p,L,7,Y,7 1,Z,2,aa,2,6 1,A,w,U,W,8 ab,N,w,ac,ad,8 1,0,2,2,6,3 1,ae,af,3,2,7 1,B,2,6,W,6 1,0,2,6,4,4 ag,0,2,7,1,0 O,A,r,v,D,8 1,b,s,L,7,7 1,p,5,I,4,4 1,A,5,4,1,4 1,x,5,4,2,7 1,0,7,r,L,7 O,W,X,u,ah,8 1,1,Q,2,7,7 ab,m,Q,5,x,8 1,ai,2,6,4,6 aj,ak,5,ad,al,8 1,W,5,4,2,4 1,2,ad,2,6,6 1,2,am,2,5,5 1,2,4,2,6,7 ad,an,ao,ap,aq,8 2,M,ar,as,at,1 au,j,k,av,8,0 ad,aw,ax,o,ay,8 2,f,az,O,3,1 aA,x,0,2,5,0 2,aw,x,3,aj,1 2,a,0,3,2,6 2,0,0,4,2,3 ad,aw,ax,aB,aC,8 2,0,0,5,1,7 2,0,b,5,aC,8 2,x,0,5,7,5 ad,aD,aj,aE,aF,8 2,0,O,x,3,1 2,0,2,0,7,3 2,aG,l,2,3,1 af,0,2,3,2,1 2,0,3,2,aB,1 2,0,3,aH,2,1 2,0,5,5,2,1 2,1,1,2,6,1 3,0,0,Z,2,2 3,aI,az,f,r,8 3,x,0,0,4,1 3,0,0,0,7,6 3,D,aJ,aK,aL,8 3,v,1,0,2,1 3,az,aM,F,aL,8 aN,0,1,2,2,0 r,T,O,az,aO,8 3,0,R,0,aP,8 aQ,A,0,v,aR,8 h,av,j,k,8,1 aS,0,aw,q,aT,0 aS,0,ay,A,aT,0 aU,0,aT,q,O,0 aU,0,2,aw,aT,0 aS,0,2,aM,ay,0 4,0,e,2,2,1 4,0,2,3,2,6 aS,0,e,ay,aT,0 aS,0,3,2,ay,0 am,aM,aV,aW,aX,8 5,aY,0,0,2,2 5,aZ,T,F,az,8 5,az,ba,e,aC,8 bb,0,0,5,2,0 5,b,2,bc,2,2 5,0,e,bd,h,8 5,v,e,be,bf,8 5,0,2,1,5,2 bb,b,2,2,2,0 5,0,2,2,4,4 5,0,2,af,5,8 5,bg,2,bh,2,8 5,1,2,4,2,2 bi,l,bj,bk,bl,8 6,0,0,0,aJ,8 6,0,0,0,Q,1 i,0,0,5,1,8 bm,0,2,e,2,0 bn,0,3,2,2,0 6,O,aF,aM,bj,8 6,1,2,Q,2,5 6,1,2,1,3,1 6,1,e,bo,2,8 6,1,3,2,2,8 7,0,0,0,bp,8 7,0,ay,aT,r,0 7,0,2,bq,2,0 7,0,2,ay,r,0 7,0,2,2,ac,1 7,0,2,2,3,0 7,0,2,5,2,5 8,az,f,br,bs,0 @TREE num_states=9 num_neighbors=4 num_nodes=339 1 0 8 8 8 8 8 8 8 0 1 2 1 2 3 8 8 1 8 0 1 0 8 2 2 8 2 1 8 0 1 0 8 1 8 8 8 8 8 0 1 0 8 2 1 8 8 8 8 0 1 3 1 8 8 8 8 8 8 0 1 1 7 1 6 8 8 8 7 0 1 0 1 0 0 1 0 1 1 0 2 0 1 2 3 4 0 5 6 7 1 2 1 8 8 0 8 0 0 0 1 2 1 2 3 0 8 0 0 0 1 2 8 1 8 8 8 8 8 0 1 1 4 8 8 0 8 0 0 0 1 0 8 2 8 8 8 8 8 0 1 1 6 8 8 0 8 0 0 0 1 1 7 8 8 0 8 0 0 0 2 1 9 10 11 12 13 14 15 7 1 2 1 2 8 0 5 0 0 0 1 0 8 2 8 0 5 0 0 0 1 0 8 2 8 8 2 8 8 0 1 0 4 2 8 0 8 0 0 0 1 0 8 0 8 8 8 8 8 0 1 2 6 2 8 0 8 0 0 0 1 2 7 2 8 0 2 0 0 0 1 8 8 0 0 1 0 1 1 0 2 2 17 18 19 20 21 22 23 24 1 0 8 6 8 8 8 8 8 0 2 3 3 26 3 3 3 3 3 24 1 0 4 3 1 0 8 0 0 0 1 0 4 8 8 0 8 0 0 0 1 0 6 8 8 0 8 0 0 0 1 0 7 8 8 0 8 0 0 0 2 4 12 28 3 29 0 30 31 24 1 0 1 7 8 8 8 8 8 0 1 5 8 2 8 8 0 8 8 0 1 0 8 5 8 8 8 8 8 0 2 0 33 34 3 0 0 0 35 24 1 2 6 2 2 0 8 0 0 0 2 5 14 37 3 30 0 30 31 24 1 2 7 2 8 0 8 0 0 0 2 6 15 39 3 31 0 31 31 24 2 7 7 24 24 24 24 24 24 7 3 8 16 25 27 32 36 38 40 41 2 1 9 17 3 12 33 14 15 7 1 1 1 8 8 0 8 0 0 0 1 1 8 2 8 0 8 0 0 0 1 1 8 1 8 0 8 0 0 0 1 1 8 8 8 0 8 0 0 0 2 44 44 45 46 12 47 14 15 7 1 2 8 2 1 0 8 0 0 0 1 1 1 2 8 0 8 0 0 0 1 1 4 2 8 0 8 0 0 0 1 1 8 2 1 0 8 0 0 0 1 1 6 2 8 0 8 0 0 0 1 1 0 2 8 0 8 0 0 0 2 49 45 50 46 51 52 53 54 24 1 1 8 6 8 0 8 0 0 0 1 1 4 1 8 0 8 0 0 0 1 1 6 1 8 0 8 0 0 0 1 1 7 1 8 0 8 0 0 0 2 3 46 56 3 57 3 58 59 24 2 12 12 51 57 12 12 14 15 24 2 0 47 45 3 12 0 14 15 24 2 14 14 53 58 14 14 14 15 24 1 1 7 2 8 0 8 0 0 0 2 15 15 64 59 15 15 15 15 24 3 43 48 55 60 61 62 63 65 41 2 2 10 18 26 28 34 37 39 24 1 0 8 2 8 0 8 0 0 0 1 1 8 2 0 0 8 0 0 0 2 49 68 69 46 51 45 53 64 24 1 0 6 2 8 0 2 0 0 0 1 5 1 2 8 0 2 0 0 0 1 0 8 2 8 1 0 0 1 0 1 2 7 1 8 6 8 0 1 0 1 0 8 0 8 0 8 0 5 0 1 0 6 2 8 0 8 0 0 0 1 0 7 2 8 0 2 0 0 0 2 71 72 73 74 20 75 76 77 24 1 0 8 6 8 1 8 0 0 0 1 0 6 1 8 0 8 0 0 0 1 0 7 1 8 0 8 0 0 0 2 13 45 79 3 20 3 80 81 24 1 0 4 1 8 0 8 0 0 0 1 0 7 2 8 0 8 0 0 0 2 20 51 20 83 20 20 76 84 24 1 2 8 2 8 0 8 0 0 0 1 0 7 5 8 0 8 0 0 0 2 13 45 86 3 84 3 76 87 24 2 76 53 76 80 76 76 76 84 24 1 0 7 3 8 0 8 0 0 0 2 90 64 84 81 84 84 84 84 24 2 24 24 24 24 24 24 24 24 24 3 67 70 78 82 85 88 89 91 92 2 3 11 19 3 3 3 3 3 24 2 3 46 46 3 57 3 58 59 24 1 0 8 1 8 0 8 0 0 0 2 13 46 96 3 83 3 80 81 24 2 3 3 3 3 3 3 3 3 24 2 3 57 83 3 83 3 80 81 24 2 3 58 80 3 80 3 80 81 24 2 3 59 81 3 81 3 81 81 24 3 94 95 97 98 99 98 100 101 92 2 4 12 20 3 29 0 30 31 24 1 0 4 2 8 0 4 0 0 0 2 20 51 104 83 20 20 20 84 24 2 29 12 20 83 29 29 30 31 24 2 0 12 20 3 29 0 30 31 24 2 30 14 76 80 30 30 30 31 24 2 31 15 84 81 31 31 31 31 24 3 103 61 105 99 106 107 108 109 92 2 0 13 21 3 0 0 0 0 24 1 1 8 2 8 0 2 0 0 0 1 0 8 2 8 0 8 0 1 0 2 13 112 113 3 20 13 76 84 24 2 0 0 13 3 0 0 0 0 24 2 0 14 76 3 30 0 30 31 24 2 0 15 84 3 31 0 31 31 24 3 111 62 114 98 107 115 116 117 92 2 5 14 22 3 30 0 30 31 24 1 0 3 2 8 0 8 0 0 0 2 76 53 120 80 76 76 76 84 24 3 119 63 121 100 108 116 108 109 92 2 6 15 23 3 31 35 31 31 24 3 123 65 91 101 109 117 109 109 92 3 41 41 92 92 92 92 92 92 41 4 42 66 93 102 110 118 122 124 125 2 1 44 49 3 12 0 14 15 7 2 9 44 68 46 12 47 14 15 7 2 10 45 69 46 51 45 53 64 24 2 11 46 46 3 57 3 58 59 24 2 13 47 45 3 12 0 14 15 24 3 127 128 129 130 61 131 63 65 41 2 9 44 45 46 12 47 14 15 7 1 1 8 8 8 8 8 8 8 0 1 1 1 2 8 8 8 8 8 0 1 1 8 1 8 8 8 8 8 0 1 1 4 8 8 8 8 8 8 0 1 1 6 8 8 8 8 8 8 0 1 1 7 8 8 8 8 8 8 0 2 44 134 135 136 137 134 138 139 7 1 1 4 2 8 8 8 8 8 0 1 1 1 1 8 8 8 8 8 0 1 1 7 2 8 8 8 8 8 0 2 68 135 135 136 141 135 142 143 24 1 1 4 1 8 8 8 8 8 0 1 1 6 1 8 8 8 8 8 0 1 1 7 1 8 8 8 8 8 0 2 46 136 136 136 145 136 146 147 24 2 12 137 141 145 137 137 138 139 24 1 1 8 2 8 8 8 8 8 0 2 47 134 150 136 137 134 138 139 24 1 1 6 2 8 8 8 8 8 0 2 14 138 152 146 138 138 138 139 24 2 15 139 143 147 139 139 139 139 24 3 133 140 144 148 149 151 153 154 41 2 17 45 50 56 51 45 53 64 24 2 45 135 135 136 141 150 152 143 24 1 1 1 2 8 8 2 5 8 0 1 1 1 2 8 8 0 5 8 0 1 1 4 2 8 8 2 8 8 0 1 5 8 2 8 8 8 8 8 0 1 1 7 2 8 8 2 8 8 0 2 72 158 159 142 160 161 135 162 24 1 1 8 1 8 8 8 1 8 0 2 46 164 142 136 145 136 146 147 24 2 51 141 141 145 141 141 152 143 24 2 112 150 150 136 141 150 152 143 24 2 53 152 152 146 152 152 152 143 24 2 64 143 143 147 143 143 143 143 24 3 156 157 163 165 166 167 168 169 92 2 45 164 136 136 145 136 146 147 24 2 3 136 136 3 145 3 146 147 24 2 57 145 145 145 145 145 146 147 24 2 58 146 146 146 146 146 146 147 24 2 59 147 147 147 147 147 147 147 24 3 95 148 171 172 173 172 174 175 92 3 61 149 166 173 149 149 153 154 92 2 33 47 52 3 12 0 14 15 24 2 47 134 135 136 137 134 138 139 24 2 45 150 135 136 141 150 152 143 24 2 0 134 150 3 137 0 138 139 24 1 5 7 2 8 8 8 8 8 0 2 15 139 182 147 139 139 139 139 24 3 178 179 180 172 149 181 153 183 92 2 14 138 142 146 138 138 138 139 24 3 63 185 168 174 153 153 153 154 92 2 15 15 54 59 15 15 15 15 24 3 187 154 169 175 154 154 154 154 92 4 132 155 170 176 177 184 186 188 125 2 2 49 71 13 20 13 76 90 24 2 17 45 72 46 51 112 53 64 24 2 18 50 73 96 104 113 120 84 24 2 19 46 74 3 83 3 80 81 24 2 21 52 75 3 20 13 76 84 24 2 22 53 76 80 20 76 76 84 24 2 23 54 77 81 84 84 84 84 24 3 190 191 192 193 85 194 195 196 92 2 10 68 72 45 51 45 53 64 24 2 45 135 158 164 141 150 152 143 24 2 69 135 159 136 141 135 152 143 24 2 46 136 142 136 145 136 146 147 24 2 51 141 160 145 141 141 152 143 24 2 45 135 161 136 141 150 152 143 24 2 53 142 135 146 152 152 152 143 24 2 64 143 162 147 143 143 143 143 24 3 198 199 200 201 202 203 204 205 92 2 18 69 73 79 20 86 76 84 24 2 50 135 159 142 141 150 152 143 24 1 0 4 2 8 8 8 8 8 0 1 0 6 2 8 8 8 8 8 0 1 0 7 2 8 8 8 8 8 0 2 73 159 13 3 209 13 210 211 24 1 0 4 1 8 8 8 8 8 0 1 0 6 1 8 8 8 8 8 0 1 0 7 1 8 8 8 8 8 0 2 96 136 3 3 213 3 214 215 24 2 104 141 209 213 209 209 210 211 24 2 113 135 13 3 211 13 210 211 24 2 120 152 210 214 210 210 210 211 24 2 84 143 211 215 211 211 211 211 24 3 207 208 212 216 217 218 219 220 92 2 26 46 74 3 83 3 80 81 24 2 56 136 142 136 145 136 146 147 24 2 79 142 3 3 213 3 214 215 24 2 3 136 3 3 213 3 214 215 24 2 83 145 213 213 213 213 214 215 24 2 80 146 214 214 214 214 214 215 24 2 81 147 215 215 215 215 215 215 24 3 222 223 224 225 226 225 227 228 92 2 28 51 20 20 20 84 76 84 24 2 20 141 209 213 209 211 210 211 24 2 20 141 209 213 209 209 210 211 24 1 0 5 2 8 8 8 8 8 0 2 20 141 233 213 209 209 210 211 24 2 76 152 211 214 210 210 210 211 24 3 230 202 231 226 232 234 235 220 92 2 34 45 75 3 20 3 76 84 24 2 45 150 161 136 141 150 152 143 24 2 86 150 13 3 209 13 210 211 24 2 13 150 13 3 209 13 210 211 24 2 76 152 210 214 210 210 210 211 24 1 1 5 2 8 8 8 8 8 0 2 84 143 242 215 211 211 211 211 24 3 237 238 239 225 234 240 241 243 92 2 37 53 76 80 76 76 76 84 24 2 53 152 135 146 152 152 152 143 24 3 245 246 241 227 235 241 241 220 92 2 39 64 77 81 84 87 84 84 24 2 84 182 242 215 211 211 211 211 24 3 248 205 220 228 220 249 220 220 92 3 92 92 92 92 92 92 92 92 92 4 197 206 221 229 236 244 247 250 251 2 3 3 13 3 3 3 3 3 24 2 3 46 45 3 57 3 58 59 24 2 26 56 79 3 83 3 80 81 24 2 3 57 20 3 83 3 80 81 24 3 253 254 255 98 256 98 100 101 92 2 46 136 164 136 145 136 146 147 24 3 130 258 201 172 173 172 174 175 92 2 19 46 96 3 83 3 80 81 24 2 74 142 3 3 213 3 214 215 24 3 260 148 261 225 226 225 227 228 92 2 3 145 213 3 213 3 214 215 24 2 3 146 214 3 214 3 214 215 24 2 3 147 215 3 215 3 215 215 24 3 98 172 225 98 263 98 264 265 92 3 99 173 226 263 226 263 227 228 92 3 100 174 227 264 227 264 227 228 92 3 101 175 228 265 228 265 228 228 92 4 257 259 262 266 267 266 268 269 251 2 28 51 20 83 20 20 76 84 24 3 103 61 271 99 106 107 108 109 92 2 20 51 104 83 20 20 76 84 24 2 20 160 209 213 209 233 211 211 24 3 273 166 274 226 232 232 241 220 92 2 20 145 213 213 213 213 214 215 24 3 99 173 276 263 226 263 227 228 92 1 0 4 8 8 8 8 8 8 0 1 0 6 8 8 8 8 8 8 0 1 0 7 8 8 8 8 8 8 0 2 29 137 209 213 278 278 279 280 24 2 30 138 210 214 279 279 279 280 24 2 31 139 211 215 280 280 280 280 24 3 106 149 232 226 281 281 282 283 92 2 84 141 211 213 209 209 210 211 24 2 0 137 209 3 278 0 279 280 24 3 107 149 285 263 281 286 282 283 92 2 30 14 20 80 30 30 30 31 24 3 288 153 241 227 282 282 282 283 92 3 109 154 220 228 283 283 283 283 92 4 272 177 275 277 284 287 289 290 251 2 33 47 45 3 12 0 14 15 24 2 34 45 86 3 20 13 76 84 24 2 0 12 84 3 29 0 30 31 24 2 0 0 3 3 0 0 0 0 24 2 35 15 87 3 31 0 31 31 24 3 115 292 293 98 294 295 116 296 92 2 13 47 112 3 12 0 14 15 24 2 45 150 150 136 141 150 152 143 24 3 298 151 299 172 149 181 153 154 92 2 21 45 113 3 20 13 76 84 24 2 52 135 135 136 141 150 152 182 24 2 75 161 13 3 233 13 210 242 24 2 20 141 211 213 209 209 210 211 24 3 301 302 303 225 304 240 241 220 92 3 107 149 232 263 281 286 282 283 92 2 3 150 13 3 209 13 210 211 24 2 0 138 210 3 279 0 279 280 24 2 0 139 211 3 280 0 280 280 24 3 115 181 307 98 286 115 308 309 92 3 116 153 241 264 282 308 282 283 92 3 117 154 220 265 283 309 283 283 92 4 297 300 305 266 306 310 311 312 251 2 5 14 76 3 30 0 30 31 24 3 314 63 245 100 108 116 108 109 92 3 63 153 168 174 153 153 153 154 92 2 22 53 120 80 76 76 76 84 24 2 53 142 152 146 152 152 152 143 24 2 76 135 210 214 211 210 210 211 24 2 20 152 210 214 210 210 210 211 24 3 317 318 319 227 320 241 241 220 92 3 108 153 241 227 282 282 282 283 92 4 315 316 321 268 322 311 322 290 251 2 6 15 90 3 31 0 31 31 24 2 39 64 84 81 84 84 84 84 24 3 324 65 325 101 109 117 109 109 92 2 64 143 143 147 143 182 143 143 24 3 65 154 327 175 154 154 154 154 92 2 23 64 84 81 84 84 84 84 24 2 54 143 143 147 143 143 143 143 24 2 77 162 211 215 211 242 211 211 24 3 329 330 331 228 220 220 220 220 92 2 35 15 84 3 31 0 31 31 24 2 87 143 211 215 211 211 211 211 24 3 333 154 334 265 283 309 283 283 92 4 326 328 332 269 290 335 290 290 251 4 125 125 251 251 251 251 251 251 125 5 126 189 252 270 291 313 323 336 337 @COLORS # colors from # http://necsi.org/postdocs/sayama/sdsr/java/loops.java # Color.black,Color.blue,Color.red,Color.green, # Color.yellow,Color.magenta,Color.white,Color.cyan,Color.orange 1 0 0 255 2 255 0 0 3 0 255 0 4 255 255 0 5 255 0 255 6 255 255 255 7 0 255 255 8 255 128 0 golly-2.5-src/Rules/StarWars.rule0000644000175100001440000000076712156145314013756 00000000000000@RULE StarWars @TREE num_states=4 num_neighbors=8 num_nodes=36 1 0 2 3 0 2 0 0 0 0 1 1 2 3 0 2 0 2 0 0 3 1 3 1 1 1 0 1 3 0 2 2 5 2 2 3 3 6 3 3 4 4 7 4 4 2 5 5 5 5 3 6 9 6 6 4 7 10 7 7 5 8 11 8 8 3 9 9 9 9 4 10 13 10 10 5 11 14 11 11 6 12 15 12 12 2 5 0 5 5 3 9 17 9 9 4 13 18 13 13 5 14 19 14 14 6 15 20 15 15 7 16 21 16 16 3 17 1 17 17 4 18 23 18 18 5 19 24 19 19 6 20 25 20 20 7 21 26 21 21 8 22 27 22 22 3 1 1 1 1 4 23 29 23 23 5 24 30 24 24 6 25 31 25 25 7 26 32 26 26 8 27 33 27 27 9 28 34 28 28 golly-2.5-src/Rules/Tempesti.rule0000644000175100001440000005320512156145314013775 00000000000000@RULE Tempesti Transitions rules for Tempesti's self-replicating loops. Converted from rules given in Tempesti's thesis: http://lslwww.epfl.ch/pages/embryonics/thesis/ Note that there's an error in the text, where it says that states are given as clockwise from north: PS,N,NE,E,... but actually they start at NW: PS,NW,N,NE,... Note also that Table A-3 in his thesis has rules that are rotationally symmetric, but Table A-4's rules are not, despite what footnote 39 says. To make a single rule file we've had to expand A-3, giving 175*4+326=1026 rules. Hopefully this can be compressed further. As in Tempesti's thesis, variables are bound within each transition. For example, if a={1,2} then 4,a,0->a represents two transitions: 4,1,0->1 and 4,2,0->2 @TABLE # rules: 1026 # variables: 4 # format: C,N,NE,E,SE,S,SW,W,NW,C' # remaining cases default: state doesn't change # symmetry: none (no rotation/reflection) n_states:10 neighborhood:Moore symmetries:none var a={5,6,7,8,9} var b={5,6,7,8,9} var c={5,6,7,8,9} var d={5,6,7,8,9} 2,b,0,0,0,a,1,1,1,a a,0,0,b,1,1,1,2,0,b b,0,1,c,1,1,1,a,0,c b,1,0,c,d,1,1,a,0,c b,0,0,0,0,c,1,a,1,c c,b,0,0,0,d,1,1,a,d b,a,0,0,0,2,1,1,1,2 b,0,0,c,1,1,1,a,0,c c,b,0,0,0,2,1,1,a,2 b,0,0,0,0,2,1,a,1,2 2,b,0,0,0,a,1,1,c,a b,1,0,c,2,1,1,a,0,c b,2,0,0,0,c,1,1,a,c b,1,0,2,c,1,1,a,0,2 2,0,0,0,0,b,1,a,1,b 0,0,0,0,0,2,a,1,0,2 b,0,1,2,1,1,1,a,0,2 b,c,0,0,0,a,1,1,2,a 2,1,2,b,c,1,1,a,0,b a,2,0,0,0,b,1,2,1,b 0,0,0,0,2,2,0,0,0,2 2,0,0,0,0,a,2,2,0,0 2,0,1,b,1,1,1,a,0,b a,1,0,b,c,1,1,2,0,b 0,0,0,0,0,0,1,2,0,2 a,0,1,b,1,1,1,2,0,b 2,0,0,0,0,0,1,2,0,0 0,0,0,0,0,2,a,1,1,2 2,0,0,0,0,a,2,1,1,0 0,0,0,0,0,2,1,1,1,2 2,0,0,0,0,0,1,1,1,0 0,2,0,0,0,2,1,1,2,2 0,0,0,0,0,2,1,1,2,3 0,0,0,0,3,3,0,0,0,3 3,0,0,0,0,0,1,3,0,0 3,0,0,3,0,1,0,0,0,1 0,0,0,0,0,0,1,3,0,3 0,3,0,0,0,2,1,1,3,2 0,0,0,0,0,2,1,1,3,2 3,3,2,1,0,0,0,3,0,2 3,0,3,2,0,0,0,0,0,1 0,2,1,0,0,0,0,0,3,3 2,3,2,1,0,0,0,3,0,3 1,2,0,1,0,0,0,2,3,3 3,0,0,2,3,3,1,0,0,0 2,0,0,0,1,3,3,3,0,0 3,3,2,3,0,3,0,1,0,0 0,3,1,0,0,0,0,3,3,3 3,2,0,1,0,0,3,3,3,1 3,1,1,0,0,0,0,3,0,1 3,0,1,3,0,0,0,0,1,0 0,0,0,2,1,1,0,0,0,2 0,0,0,2,1,0,1,0,0,2 0,2,0,1,1,0,0,1,0,2 0,2,1,1,1,0,0,0,1,2 2,0,0,0,1,2,1,0,0,0 2,0,1,1,1,0,0,0,1,0 0,1,1,0,3,3,0,0,1,1 0,1,1,1,1,0,0,2,1,3 1,0,1,1,1,0,2,1,0,3 1,1,0,0,0,1,0,3,3,3 1,1,0,0,0,1,3,3,0,3 3,3,1,1,1,0,0,0,1,0 3,0,1,1,1,3,0,1,0,1 0,0,0,0,0,2,1,3,3,3 3,3,0,0,2,1,0,0,1,1 2,0,0,0,0,0,1,1,3,0 0,0,0,0,0,3,1,3,1,2 3,0,0,0,0,0,1,1,3,0 3,1,0,0,3,1,0,1,0,1 0,3,0,0,0,0,1,1,1,3 3,0,0,0,0,0,1,1,1,0 3,0,0,0,0,2,1,1,1,2 2,3,0,0,0,0,1,1,1,3 3,2,0,0,0,0,1,1,1,0 2,0,0,0,0,3,1,1,1,0 0,a,b,1,1,3,0,0,0,3 a,2,1,b,1,3,0,0,0,2 b,1,1,c,0,1,3,a,2,a b,1,1,c,0,1,3,2,a,2 3,2,a,1,1,0,0,0,0,2 2,b,1,a,1,3,0,0,0,b 1,a,b,0,0,1,0,3,2,2 0,2,2,1,1,0,0,0,0,2 2,a,2,2,1,0,0,0,0,a a,b,1,2,2,2,0,0,0,b a,2,1,1,1,b,0,0,2,2 2,1,1,c,0,2,2,a,b,a 2,2,b,0,0,1,0,2,a,1 2,a,1,1,1,0,0,0,0,a a,b,a,1,1,2,0,0,0,b a,1,1,2,0,1,a,b,c,b b,c,1,a,1,a,0,0,0,c b,c,b,1,1,a,0,0,0,c a,1,1,d,0,1,a,b,c,b 2,a,1,1,1,3,0,0,0,a 2,a,1,1,3,0,0,0,0,a 3,a,1,1,3,0,0,0,0,a a,b,1,1,1,3,0,0,0,b b,2,1,a,1,a,0,0,0,3 b,1,1,c,0,1,b,a,2,a b,3,c,1,1,a,0,0,0,3 a,1,1,b,0,1,a,3,c,2 3,a,1,b,1,b,0,0,0,a a,b,1,1,c,3,0,0,0,b b,3,1,1,1,a,0,0,0,3 2,1,1,a,0,1,3,b,c,b a,b,1,2,1,3,0,0,0,b 3,b,2,1,1,a,0,0,0,b 3,b,1,1,1,a,0,0,0,b a,b,a,1,1,3,0,0,0,b 2,a,1,1,0,0,0,0,0,a a,b,1,1,0,2,0,0,0,b 2,a,1,0,1,0,0,0,0,a 0,1,1,0,0,1,0,2,a,2 a,b,1,2,1,0,0,0,0,b 2,1,1,0,0,1,0,a,b,a 2,1,1,0,0,0,1,a,1,a c,3,1,1,a,b,0,0,0,2 0,0,0,0,a,3,1,1,1,4 3,0,0,a,1,3,1,1,1,a a,0,0,b,1,1,3,3,0,b 3,3,a,1,0,0,1,1,1,1 1,1,4,c,1,1,a,b,3,c a,4,0,b,1,1,1,1,1,b b,0,0,c,1,1,1,a,4,c 1,1,0,4,b,1,a,3,b,4 4,0,0,0,b,a,1,1,1,0 3,b,4,b,1,a,0,0,0,b 4,1,0,0,a,b,3,b,a,0 b,4,0,c,1,1,a,3,b,c a,b,1,4,a,3,0,0,0,0 1,1,0,0,0,4,a,b,c,4 3,b,c,1,1,a,0,0,0,b a,0,0,b,1,3,0,0,0,b b,0,0,c,1,1,3,a,0,c a,b,1,4,0,0,0,0,0,0 4,1,0,0,0,0,0,a,b,0 0,0,0,a,3,0,0,0,0,1 a,b,c,1,1,3,0,0,1,b b,0,0,c,1,a,0,1,0,c b,c,d,1,1,a,0,0,1,c 1,1,0,0,0,4,a,b,3,4 b,c,1,1,4,a,0,0,0,c b,c,b,1,4,a,0,0,0,1 1,b,a,0,0,4,a,b,c,0 a,2,1,b,0,1,0,0,0,2 b,1,1,c,0,0,1,a,2,a 1,a,b,0,0,0,0,0,2,2 2,2,b,0,0,0,0,2,a,1 2,2,0,1,0,0,0,0,0,1 1,1,0,0,0,2,0,0,2,3 2,3,3,2,0,0,0,0,0,3 2,3,0,0,0,0,0,2,3,3 3,1,0,0,0,2,2,3,0,1 3,0,1,3,2,2,0,0,0,0 0,3,3,2,0,0,0,0,0,3 2,3,0,0,0,0,0,0,3,3 3,1,0,0,0,2,0,3,0,1 3,0,1,3,2,0,0,0,0,0 2,0,1,1,0,0,0,0,0,0 2,1,1,0,0,1,0,2,0,0 2,a,1,b,0,1,0,0,0,a b,1,1,c,0,0,1,2,a,2 a,b,1,2,0,1,0,0,0,b 2,1,1,a,0,0,1,b,c,b a,1,1,2,0,0,1,b,c,b 1,1,0,0,0,0,0,0,0,4 2,0,1,1,4,0,0,0,0,0 4,1,0,0,0,0,0,0,0,0 1,1,0,0,0,4,0,0,0,4 0,a,b,1,4,0,0,0,0,1 1,b,c,0,0,4,0,0,a,0 2,a,2,1,4,0,0,0,0,0 1,b,2,0,0,4,0,0,a,0 2,0,0,a,1,1,1,b,0,a a,b,1,1,1,2,0,0,0,b b,c,1,1,1,a,0,0,1,c b,c,d,1,1,a,0,1,0,c b,0,0,c,1,a,1,0,0,c c,0,0,d,1,1,a,b,0,d b,0,0,2,1,1,1,a,0,2 b,c,1,1,1,a,0,0,0,c c,0,0,2,1,1,a,b,0,2 b,0,0,2,1,a,1,0,0,2 2,0,0,a,1,1,c,b,0,a b,c,2,1,1,a,0,1,0,c b,0,0,c,1,1,a,2,0,c b,2,c,1,1,a,0,1,0,2 2,0,0,b,1,a,1,0,0,b 0,0,0,2,a,1,0,0,0,2 b,2,1,1,1,a,0,0,1,2 b,0,0,a,1,1,2,c,0,a 2,b,c,1,1,a,0,1,2,b a,0,0,b,1,2,1,2,0,b 0,0,2,2,0,0,0,0,0,2 2,0,0,a,2,2,0,0,0,0 2,b,1,1,1,a,0,0,1,b a,b,c,1,1,2,0,1,0,b 0,0,0,0,1,2,0,0,0,2 a,b,1,1,1,2,0,0,1,b 2,0,0,0,1,2,0,0,0,0 0,0,0,2,a,1,1,0,0,2 2,0,0,a,2,1,1,0,0,0 0,0,0,2,1,1,1,0,0,2 2,0,0,0,1,1,1,0,0,0 0,0,0,2,1,1,2,2,0,2 0,0,0,2,1,1,2,0,0,3 0,0,3,3,0,0,0,0,0,3 3,0,0,0,1,3,0,0,0,0 3,3,0,1,0,0,0,0,0,1 0,0,0,0,1,3,0,0,0,3 0,0,0,2,1,1,3,3,0,2 0,0,0,2,1,1,3,0,0,2 3,1,0,0,0,3,0,3,2,2 3,2,0,0,0,0,0,0,3,1 0,0,0,0,0,0,3,2,1,3 2,1,0,0,0,3,0,3,2,3 1,1,0,0,0,2,3,2,0,3 3,2,3,3,1,0,0,0,0,0 2,0,1,3,3,3,0,0,0,0 3,3,0,3,0,1,0,3,2,0 0,0,0,0,0,3,3,3,1,3 3,1,0,0,3,3,3,2,0,1 3,0,0,0,0,3,0,1,1,1 3,3,0,0,0,0,1,0,1,0 0,2,1,1,0,0,0,0,0,2 0,2,1,0,1,0,0,0,0,2 0,1,1,0,0,1,0,2,0,2 0,1,1,0,0,0,1,2,1,2 2,0,1,2,1,0,0,0,0,0 2,1,1,0,0,0,1,0,1,0 0,0,3,3,0,0,1,1,1,1 0,1,1,0,0,2,1,1,1,3 1,1,1,0,2,1,0,0,1,3 1,0,0,1,0,3,3,1,0,3 1,0,0,1,3,3,0,1,0,3 3,1,1,0,0,0,1,3,1,0 3,1,1,3,0,1,0,0,1,1 0,0,0,2,1,3,3,0,0,3 3,0,2,1,0,0,1,3,0,1 2,0,0,0,1,1,3,0,0,0 0,0,0,3,1,3,1,0,0,2 3,0,0,0,1,1,3,0,0,0 3,0,3,1,0,1,0,1,0,1 0,0,0,0,1,1,1,3,0,3 3,0,0,0,1,1,1,0,0,0 3,0,0,2,1,1,1,0,0,2 2,0,0,0,1,1,1,3,0,3 3,0,0,0,1,1,1,2,0,0 2,0,0,3,1,1,1,0,0,0 0,1,1,3,0,0,0,a,b,3 a,b,1,3,0,0,0,2,1,2 b,c,0,1,3,a,2,1,1,a b,c,0,1,3,2,a,1,1,2 3,1,1,0,0,0,0,2,a,2 2,a,1,3,0,0,0,b,1,b 1,0,0,1,0,3,2,a,b,2 0,1,1,0,0,0,0,2,2,2 2,2,1,0,0,0,0,a,2,a a,2,2,2,0,0,0,b,1,b a,1,1,b,0,0,2,2,1,2 2,c,0,2,2,a,b,1,1,a 2,0,0,1,0,2,a,2,b,1 2,1,1,0,0,0,0,a,1,a a,1,1,2,0,0,0,b,a,b a,2,0,1,a,b,c,1,1,b b,a,1,a,0,0,0,c,1,c b,1,1,a,0,0,0,c,b,c a,d,0,1,a,b,c,1,1,b 2,1,1,3,0,0,0,a,1,a 2,1,3,0,0,0,0,a,1,a 3,1,3,0,0,0,0,a,1,a a,1,1,3,0,0,0,b,1,b b,a,1,a,0,0,0,2,1,3 b,c,0,1,b,a,2,1,1,a b,1,1,a,0,0,0,3,c,3 a,b,0,1,a,3,c,1,1,2 3,b,1,b,0,0,0,a,1,a a,1,c,3,0,0,0,b,1,b b,1,1,a,0,0,0,3,1,3 2,a,0,1,3,b,c,1,1,b a,2,1,3,0,0,0,b,1,b 3,1,1,a,0,0,0,b,2,b 3,1,1,a,0,0,0,b,1,b a,1,1,3,0,0,0,b,a,b 2,1,0,0,0,0,0,a,1,a a,1,0,2,0,0,0,b,1,b 2,0,1,0,0,0,0,a,1,a 0,0,0,1,0,2,a,1,1,2 a,2,1,0,0,0,0,b,1,b 2,0,0,1,0,a,b,1,1,a 2,0,0,0,1,a,1,1,1,a c,1,a,b,0,0,0,3,1,2 0,0,a,3,1,1,1,0,0,4 3,a,1,3,1,1,1,0,0,a a,b,1,1,3,3,0,0,0,b 3,1,0,0,1,1,1,3,a,1 1,c,1,1,a,b,3,1,4,c a,b,1,1,1,1,1,4,0,b b,c,1,1,1,a,4,0,0,c 1,4,b,1,a,3,b,1,0,4 4,0,b,a,1,1,1,0,0,0 3,b,1,a,0,0,0,b,4,b 4,0,a,b,3,b,a,1,0,0 b,c,1,1,a,3,b,4,0,c a,4,a,3,0,0,0,b,1,0 1,0,0,4,a,b,c,1,0,4 3,1,1,a,0,0,0,b,c,b a,b,1,3,0,0,0,0,0,b b,c,1,1,3,a,0,0,0,c a,4,0,0,0,0,0,b,1,0 4,0,0,0,0,a,b,1,0,0 0,a,3,0,0,0,0,0,0,1 a,1,1,3,0,0,1,b,c,b b,c,1,a,0,1,0,0,0,c b,1,1,a,0,0,1,c,d,c 1,0,0,4,a,b,3,1,0,4 b,1,4,a,0,0,0,c,1,c b,1,4,a,0,0,0,c,b,1 1,0,0,4,a,b,c,b,a,0 a,b,0,1,0,0,0,2,1,2 b,c,0,0,1,a,2,1,1,a 1,0,0,0,0,0,2,a,b,2 2,0,0,0,0,2,a,2,b,1 2,1,0,0,0,0,0,2,0,1 1,0,0,2,0,0,2,1,0,3 2,2,0,0,0,0,0,3,3,3 2,0,0,0,0,2,3,3,0,3 3,0,0,2,2,3,0,1,0,1 3,3,2,2,0,0,0,0,1,0 0,2,0,0,0,0,0,3,3,3 2,0,0,0,0,0,3,3,0,3 3,0,0,2,0,3,0,1,0,1 3,3,2,0,0,0,0,0,1,0 2,1,0,0,0,0,0,0,1,0 2,0,0,1,0,2,0,1,1,0 2,b,0,1,0,0,0,a,1,a b,c,0,0,1,2,a,1,1,2 a,2,0,1,0,0,0,b,1,b 2,a,0,0,1,b,c,1,1,b a,2,0,0,1,b,c,1,1,b 1,0,0,0,0,0,0,1,0,4 2,1,4,0,0,0,0,0,1,0 4,0,0,0,0,0,0,1,0,0 1,0,0,4,0,0,0,1,0,4 0,1,4,0,0,0,0,a,b,1 1,0,0,4,0,0,a,b,c,0 2,1,4,0,0,0,0,a,2,0 1,0,0,4,0,0,a,b,2,0 2,a,1,1,1,b,0,0,0,a a,1,1,2,0,0,0,b,1,b b,1,1,a,0,0,1,c,1,c b,1,1,a,0,1,0,c,d,c b,c,1,a,1,0,0,0,0,c c,d,1,1,a,b,0,0,0,d b,2,1,1,1,a,0,0,0,2 b,1,1,a,0,0,0,c,1,c c,2,1,1,a,b,0,0,0,2 b,2,1,a,1,0,0,0,0,2 2,a,1,1,c,b,0,0,0,a b,1,1,a,0,1,0,c,2,c b,c,1,1,a,2,0,0,0,c b,1,1,a,0,1,0,2,c,2 2,b,1,a,1,0,0,0,0,b 0,2,a,1,0,0,0,0,0,2 b,1,1,a,0,0,1,2,1,2 b,a,1,1,2,c,0,0,0,a 2,1,1,a,0,1,2,b,c,b a,b,1,2,1,2,0,0,0,b 0,2,0,0,0,0,0,0,2,2 2,a,2,2,0,0,0,0,0,0 2,1,1,a,0,0,1,b,1,b a,1,1,2,0,1,0,b,c,b 0,0,1,2,0,0,0,0,0,2 a,1,1,2,0,0,1,b,1,b 2,0,1,2,0,0,0,0,0,0 0,2,a,1,1,0,0,0,0,2 2,a,2,1,1,0,0,0,0,0 0,2,1,1,1,0,0,0,0,2 2,0,1,1,1,0,0,0,0,0 0,2,1,1,2,2,0,0,0,2 0,2,1,1,2,0,0,0,0,3 0,3,0,0,0,0,0,0,3,3 3,0,1,3,0,0,0,0,0,0 3,1,0,0,0,0,0,3,0,1 0,0,1,3,0,0,0,0,0,3 0,2,1,1,3,3,0,0,0,2 0,2,1,1,3,0,0,0,0,2 3,0,0,3,0,3,2,1,0,2 3,0,0,0,0,0,3,2,0,1 0,0,0,0,3,2,1,0,0,3 2,0,0,3,0,3,2,1,0,3 1,0,0,2,3,2,0,1,0,3 3,3,1,0,0,0,0,2,3,0 2,3,3,3,0,0,0,0,1,0 3,3,0,1,0,3,2,3,0,0 0,0,0,3,3,3,1,0,0,3 3,0,3,3,3,2,0,1,0,1 3,0,0,3,0,1,1,0,0,1 3,0,0,0,1,0,1,3,0,0 0,1,0,0,0,0,0,2,1,2 0,0,1,0,0,0,0,2,1,2 0,0,0,1,0,2,0,1,1,2 0,0,0,0,1,2,1,1,1,2 2,2,1,0,0,0,0,0,1,0 2,0,0,0,1,0,1,1,1,0 0,3,0,0,1,1,1,0,3,1 0,0,0,2,1,1,1,1,1,3 1,0,2,1,0,0,1,1,1,3 1,1,0,3,3,1,0,0,0,3 1,1,3,3,0,1,0,0,0,3 3,0,0,0,1,3,1,1,1,0 3,3,0,1,0,0,1,1,1,1 0,2,1,3,3,0,0,0,0,3 3,1,0,0,1,3,0,0,2,1 2,0,1,1,3,0,0,0,0,0 0,3,1,3,1,0,0,0,0,2 3,0,1,1,3,0,0,0,0,0 3,1,0,1,0,1,0,0,3,1 0,0,1,1,1,3,0,0,0,3 3,0,1,1,1,0,0,0,0,0 3,2,1,1,1,0,0,0,0,2 2,0,1,1,1,3,0,0,0,3 3,0,1,1,1,2,0,0,0,0 2,3,1,1,1,0,0,0,0,0 0,3,0,0,0,a,b,1,1,3 a,3,0,0,0,2,1,b,1,2 b,1,3,a,2,1,1,c,0,a b,1,3,2,a,1,1,c,0,2 3,0,0,0,0,2,a,1,1,2 2,3,0,0,0,b,1,a,1,b 1,1,0,3,2,a,b,0,0,2 0,0,0,0,0,2,2,1,1,2 2,0,0,0,0,a,2,2,1,a a,2,0,0,0,b,1,2,2,b a,b,0,0,2,2,1,1,1,2 2,2,2,a,b,1,1,c,0,a 2,1,0,2,a,2,b,0,0,1 2,0,0,0,0,a,1,1,1,a a,2,0,0,0,b,a,1,1,b a,1,a,b,c,1,1,2,0,b b,a,0,0,0,c,1,a,1,c b,a,0,0,0,c,b,1,1,c a,1,a,b,c,1,1,d,0,b 2,3,0,0,0,a,1,1,1,a 2,0,0,0,0,a,1,1,3,a 3,0,0,0,0,a,1,1,3,a a,3,0,0,0,b,1,1,1,b b,a,0,0,0,2,1,a,1,3 b,1,b,a,2,1,1,c,0,a b,a,0,0,0,3,c,1,1,3 a,1,a,3,c,1,1,b,0,2 3,b,0,0,0,a,1,b,1,a a,3,0,0,0,b,1,1,c,b b,a,0,0,0,3,1,1,1,3 2,1,3,b,c,1,1,a,0,b a,3,0,0,0,b,1,2,1,b 3,a,0,0,0,b,2,1,1,b 3,a,0,0,0,b,1,1,1,b a,3,0,0,0,b,a,1,1,b 2,0,0,0,0,a,1,1,0,a a,2,0,0,0,b,1,1,0,b 2,0,0,0,0,a,1,0,1,a 0,1,0,2,a,1,1,0,0,2 a,0,0,0,0,b,1,2,1,b 2,1,0,a,b,1,1,0,0,a 2,0,1,a,1,1,1,0,0,a c,b,0,0,0,3,1,1,a,2 0,3,1,1,1,0,0,0,a,4 3,3,1,1,1,0,0,a,1,a a,1,3,3,0,0,0,b,1,b 3,0,1,1,1,3,a,1,0,1 1,1,a,b,3,1,4,c,1,c a,1,1,1,1,4,0,b,1,b b,1,1,a,4,0,0,c,1,c 1,1,a,3,b,1,0,4,b,4 4,a,1,1,1,0,0,0,b,0 3,a,0,0,0,b,4,b,1,b 4,b,3,b,a,1,0,0,a,0 b,1,a,3,b,4,0,c,1,c a,3,0,0,0,b,1,4,a,0 1,4,a,b,c,1,0,0,0,4 3,a,0,0,0,b,c,1,1,b a,3,0,0,0,0,0,b,1,b b,1,3,a,0,0,0,c,1,c a,0,0,0,0,b,1,4,0,0 4,0,0,a,b,1,0,0,0,0 0,0,0,0,0,0,0,a,3,1 a,3,0,0,1,b,c,1,1,b b,a,0,1,0,0,0,c,1,c b,a,0,0,1,c,d,1,1,c 1,4,a,b,3,1,0,0,0,4 b,a,0,0,0,c,1,1,4,c b,a,0,0,0,c,b,1,4,1 1,4,a,b,c,b,a,0,0,0 a,1,0,0,0,2,1,b,0,2 b,0,1,a,2,1,1,c,0,a 1,0,0,0,2,a,b,0,0,2 2,0,0,2,a,2,b,0,0,1 2,0,0,0,0,2,0,1,0,1 1,2,0,0,2,1,0,0,0,3 2,0,0,0,0,3,3,2,0,3 2,0,0,2,3,3,0,0,0,3 3,2,2,3,0,1,0,0,0,1 3,2,0,0,0,0,1,3,2,0 0,0,0,0,0,3,3,2,0,3 2,0,0,0,3,3,0,0,0,3 3,2,0,3,0,1,0,0,0,1 3,0,0,0,0,0,1,3,2,0 2,0,0,0,0,0,1,1,0,0 2,1,0,2,0,1,1,0,0,0 2,1,0,0,0,a,1,b,0,a b,0,1,2,a,1,1,c,0,2 a,1,0,0,0,b,1,2,0,b 2,0,1,b,c,1,1,a,0,b a,0,1,b,c,1,1,2,0,b 1,0,0,0,0,1,0,0,0,4 2,0,0,0,0,0,1,1,4,0 4,0,0,0,0,1,0,0,0,0 1,4,0,0,0,1,0,0,0,4 0,0,0,0,0,a,b,1,4,1 1,4,0,0,a,b,c,0,0,0 2,0,0,0,0,a,2,1,4,0 1,4,0,0,a,b,2,0,0,0 2,1,1,b,0,0,0,a,1,a a,2,0,0,0,b,1,1,1,b b,a,0,0,1,c,1,1,1,c b,a,0,1,0,c,d,1,1,c b,a,1,0,0,0,0,c,1,c c,1,a,b,0,0,0,d,1,d b,1,1,a,0,0,0,2,1,2 b,a,0,0,0,c,1,1,1,c c,1,a,b,0,0,0,2,1,2 b,a,1,0,0,0,0,2,1,2 2,1,c,b,0,0,0,a,1,a b,a,0,1,0,c,2,1,1,c b,1,a,2,0,0,0,c,1,c b,a,0,1,0,2,c,1,1,2 2,a,1,0,0,0,0,b,1,b 0,1,0,0,0,0,0,2,a,2 b,a,0,0,1,2,1,1,1,2 b,1,2,c,0,0,0,a,1,a 2,a,0,1,2,b,c,1,1,b a,2,1,2,0,0,0,b,1,b 0,0,0,0,0,0,2,2,0,2 2,2,0,0,0,0,0,a,2,0 2,a,0,0,1,b,1,1,1,b a,2,0,1,0,b,c,1,1,b 0,2,0,0,0,0,0,0,1,2 a,2,0,0,1,b,1,1,1,b 2,2,0,0,0,0,0,0,1,0 0,1,1,0,0,0,0,2,a,2 2,1,1,0,0,0,0,a,2,0 0,1,1,0,0,0,0,2,1,2 2,1,1,0,0,0,0,0,1,0 0,1,2,2,0,0,0,2,1,2 0,1,2,0,0,0,0,2,1,3 0,0,0,0,0,0,3,3,0,3 3,3,0,0,0,0,0,0,1,0 3,0,0,0,0,3,0,1,0,1 0,3,0,0,0,0,0,0,1,3 0,1,3,3,0,0,0,2,1,2 0,1,3,0,0,0,0,2,1,2 3,3,0,3,2,1,0,0,0,2 3,0,0,0,3,2,0,0,0,1 0,0,3,2,1,0,0,0,0,3 2,3,0,3,2,1,0,0,0,3 1,2,3,2,0,1,0,0,0,3 3,0,0,0,0,2,3,3,1,0 2,3,0,0,0,0,1,3,3,0 3,1,0,3,2,3,0,3,0,0 0,3,3,3,1,0,0,0,0,3 3,3,3,2,0,1,0,0,3,1 3,3,0,1,1,0,0,0,0,1 3,0,1,0,1,3,0,0,0,0 0,0,0,0,0,2,1,1,0,2 0,0,0,0,0,2,1,0,1,2 0,1,0,2,0,1,1,0,0,2 0,0,1,2,1,1,1,0,0,2 2,0,0,0,0,0,1,2,1,0 2,0,1,0,1,1,1,0,0,0 0,0,1,1,1,0,3,3,0,1 0,2,1,1,1,1,1,0,0,3 1,1,0,0,1,1,1,0,2,3 1,3,3,1,0,0,0,1,0,3 1,3,0,1,0,0,0,1,3,3 3,0,1,3,1,1,1,0,0,0 3,1,0,0,1,1,1,3,0,1 0,3,3,0,0,0,0,2,1,3 3,0,1,3,0,0,2,1,0,1 2,1,3,0,0,0,0,0,1,0 0,3,1,0,0,0,0,3,1,2 3,1,3,0,0,0,0,0,1,0 3,1,0,1,0,0,3,1,0,1 0,1,1,3,0,0,0,0,1,3 3,1,1,0,0,0,0,0,1,0 3,1,1,0,0,0,0,2,1,2 2,1,1,3,0,0,0,0,1,3 3,1,1,2,0,0,0,0,1,0 2,1,1,0,0,0,0,3,1,0 0,0,0,a,b,1,1,3,0,3 a,0,0,2,1,b,1,3,0,2 b,a,2,1,1,c,0,1,3,a b,2,a,1,1,c,0,1,3,2 3,0,0,2,a,1,1,0,0,2 2,0,0,b,1,a,1,3,0,b 1,3,2,a,b,0,0,1,0,2 0,0,0,2,2,1,1,0,0,2 2,0,0,a,2,2,1,0,0,a a,0,0,b,1,2,2,2,0,b a,0,2,2,1,1,1,b,0,2 2,a,b,1,1,c,0,2,2,a 2,2,a,2,b,0,0,1,0,1 2,0,0,a,1,1,1,0,0,a a,0,0,b,a,1,1,2,0,b a,b,c,1,1,2,0,1,a,b b,0,0,c,1,a,1,a,0,c b,0,0,c,b,1,1,a,0,c a,b,c,1,1,d,0,1,a,b 2,0,0,a,1,1,1,3,0,a 2,0,0,a,1,1,3,0,0,a 3,0,0,a,1,1,3,0,0,a a,0,0,b,1,1,1,3,0,b b,0,0,2,1,a,1,a,0,3 b,a,2,1,1,c,0,1,b,a b,0,0,3,c,1,1,a,0,3 a,3,c,1,1,b,0,1,a,2 3,0,0,a,1,b,1,b,0,a a,0,0,b,1,1,c,3,0,b b,0,0,3,1,1,1,a,0,3 2,b,c,1,1,a,0,1,3,b a,0,0,b,1,2,1,3,0,b 3,0,0,b,2,1,1,a,0,b 3,0,0,b,1,1,1,a,0,b a,0,0,b,a,1,1,3,0,b 2,0,0,a,1,1,0,0,0,a a,0,0,b,1,1,0,2,0,b 2,0,0,a,1,0,1,0,0,a 0,2,a,1,1,0,0,1,0,2 a,0,0,b,1,2,1,0,0,b 2,a,b,1,1,0,0,1,0,a 2,a,1,1,1,0,0,0,1,a c,0,0,3,1,1,a,b,0,2 0,1,1,0,0,0,a,3,1,4 3,1,1,0,0,a,1,3,1,a a,3,0,0,0,b,1,1,3,b 3,1,1,3,a,1,0,0,1,1 1,b,3,1,4,c,1,1,a,c a,1,1,4,0,b,1,1,1,b b,a,4,0,0,c,1,1,1,c 1,3,b,1,0,4,b,1,a,4 4,1,1,0,0,0,b,a,1,0 3,0,0,b,4,b,1,a,0,b 4,b,a,1,0,0,a,b,3,0 b,3,b,4,0,c,1,1,a,c a,0,0,b,1,4,a,3,0,0 1,b,c,1,0,0,0,4,a,4 3,0,0,b,c,1,1,a,0,b a,0,0,0,0,b,1,3,0,b b,a,0,0,0,c,1,1,3,c a,0,0,b,1,4,0,0,0,0 4,a,b,1,0,0,0,0,0,0 0,0,0,0,0,a,3,0,0,1 a,0,1,b,c,1,1,3,0,b b,1,0,0,0,c,1,a,0,c b,0,1,c,d,1,1,a,0,c 1,b,3,1,0,0,0,4,a,4 b,0,0,c,1,1,4,a,0,c b,0,0,c,b,1,4,a,0,1 1,b,c,b,a,0,0,4,a,0 a,0,0,2,1,b,0,1,0,2 b,a,2,1,1,c,0,0,1,a 1,0,2,a,b,0,0,0,0,2 2,2,a,2,b,0,0,0,0,1 2,0,0,2,0,1,0,0,0,1 1,0,2,1,0,0,0,2,0,3 2,0,0,3,3,2,0,0,0,3 2,2,3,3,0,0,0,0,0,3 3,3,0,1,0,0,0,2,2,1 3,0,0,0,1,3,2,2,0,0 0,0,0,3,3,2,0,0,0,3 2,0,3,3,0,0,0,0,0,3 3,3,0,1,0,0,0,2,0,1 3,0,0,0,1,3,2,0,0,0 2,0,0,0,1,1,0,0,0,0 2,2,0,1,1,0,0,1,0,0 2,0,0,a,1,b,0,1,0,a b,2,a,1,1,c,0,0,1,2 a,0,0,b,1,2,0,1,0,b 2,b,c,1,1,a,0,0,1,b a,b,c,1,1,2,0,0,1,b 1,0,0,1,0,0,0,0,0,4 2,0,0,0,1,1,4,0,0,0 4,0,0,1,0,0,0,0,0,0 1,0,0,1,0,0,0,4,0,4 0,0,0,a,b,1,4,0,0,1 1,0,a,b,c,0,0,4,0,0 2,0,0,a,2,1,4,0,0,0 1,0,a,b,2,0,0,4,0,0 # # rules for construction: # 1,7,2,1,0,0,1,1,5,5 7,0,0,2,5,1,5,5,0,2 2,0,0,7,1,5,1,7,0,7 1,7,5,1,0,0,0,5,2,5 5,2,7,1,0,0,1,1,7,1 7,0,0,5,5,1,1,2,0,5 5,0,0,6,1,5,1,7,0,6 1,6,6,1,0,0,0,5,5,6 0,5,6,0,0,0,0,0,1,5 0,6,1,0,0,0,0,5,5,6 0,5,6,0,0,0,0,0,0,5 0,6,0,0,0,0,0,5,5,6 6,0,0,7,1,6,5,6,0,7 6,7,6,1,0,6,5,5,6,7 6,0,0,7,6,5,1,6,0,7 7,0,0,6,1,6,5,6,0,6 7,6,6,1,0,6,5,5,7,6 6,7,1,0,0,6,5,5,5,7 6,0,0,9,1,6,5,6,0,9 7,6,1,0,0,6,5,5,5,6 6,7,0,0,0,6,5,5,5,7 7,6,0,0,0,6,5,5,5,6 6,0,0,9,6,5,1,6,0,9 6,9,6,1,0,6,5,5,6,9 9,0,0,6,1,6,5,6,0,6 9,0,0,6,9,5,1,6,0,6 6,9,1,0,0,6,5,5,5,9 9,6,1,0,0,6,5,5,5,6 6,9,0,0,0,6,5,5,5,9 9,6,0,0,0,6,5,5,5,6 2,0,0,6,1,6,5,6,0,6 2,0,0,6,6,5,1,6,0,6 9,6,2,1,0,6,5,5,9,6 6,0,0,2,1,9,5,9,0,2 6,0,0,2,6,5,1,9,0,2 6,7,0,0,0,0,5,5,5,7 6,7,0,0,0,0,0,5,5,7 5,5,7,0,0,0,0,0,0,7 0,7,0,0,0,0,0,5,5,7 0,0,0,0,0,0,0,7,6,7 7,6,0,0,0,0,5,5,5,6 6,9,0,0,7,6,5,5,5,9 7,0,0,0,0,0,7,6,6,6 7,5,6,7,0,0,0,0,0,5 7,6,7,0,0,0,0,7,5,5 0,7,0,0,0,0,0,7,6,5 0,0,0,0,0,0,0,5,6,5 9,6,0,0,6,6,5,5,5,6 6,9,0,6,5,5,5,5,5,9 6,0,0,8,1,6,5,6,0,8 6,8,6,1,0,6,5,5,6,8 6,0,0,8,6,5,1,6,0,8 8,0,0,6,1,6,5,6,0,6 0,0,0,0,0,5,5,6,0,6 6,0,0,0,5,5,5,9,6,9 9,6,0,6,5,5,5,5,5,6 6,8,1,0,0,6,5,5,5,8 8,0,0,6,8,5,1,6,0,6 8,6,6,1,0,6,5,5,8,6 6,8,0,0,0,6,5,5,5,8 8,6,1,0,0,6,5,5,5,6 8,6,0,0,0,6,5,5,5,6 6,0,0,0,0,5,5,9,0,9 9,0,0,6,5,5,5,6,6,6 9,0,0,0,5,5,5,6,0,6 5,0,0,0,0,0,0,5,9,7 0,0,0,0,0,5,5,9,0,9 6,7,0,0,6,6,5,5,5,7 9,0,0,0,0,7,5,6,0,6 0,0,0,0,0,0,0,7,9,6 7,9,0,0,0,0,0,5,6,0 7,6,0,0,6,6,5,5,5,6 6,7,0,6,5,5,5,5,5,7 0,0,0,0,0,6,0,6,0,6 7,6,0,6,5,5,5,5,5,6 6,0,0,6,5,5,5,7,6,7 6,6,0,0,0,0,0,0,6,5 6,0,0,6,0,5,5,7,0,7 7,0,0,6,5,5,5,6,6,6 6,7,0,0,7,6,5,5,5,7 6,0,0,6,5,0,5,7,0,7 7,0,0,6,0,5,5,6,0,6 7,0,0,6,5,0,5,6,0,6 6,0,0,6,5,5,0,7,0,7 6,8,0,0,7,6,5,5,5,8 7,0,0,6,5,5,0,6,0,6 6,0,0,0,5,5,5,7,0,7 6,9,2,1,0,6,5,5,6,9 9,0,0,2,1,6,5,6,0,2 9,0,0,2,9,5,1,6,0,2 2,0,0,6,1,9,5,9,0,6 9,2,6,1,0,6,5,5,9,6 2,0,0,6,6,5,1,9,0,6 7,0,0,6,5,5,5,6,0,6 6,0,0,0,0,5,5,7,0,7 0,0,0,0,0,5,5,7,0,7 5,0,0,0,0,0,0,5,7,7 0,0,0,0,0,7,6,0,0,7 7,0,0,0,5,5,5,6,0,6 7,0,0,0,7,6,6,0,0,6 6,0,7,6,5,5,5,7,0,7 7,0,0,0,0,7,5,6,7,5 7,7,0,0,0,0,0,5,6,5 0,0,0,0,0,7,6,7,0,5 0,0,0,0,0,5,6,0,0,5 6,6,5,5,5,5,5,7,0,7 7,0,6,6,5,5,5,6,0,6 6,8,0,6,5,5,5,5,5,8 8,6,0,0,6,6,5,5,5,6 6,0,0,6,5,5,5,8,6,8 8,6,0,6,5,5,5,5,5,6 8,0,0,6,5,5,5,6,6,6 6,0,0,6,0,5,5,8,0,8 6,0,0,6,5,0,5,8,0,8 8,0,0,6,0,5,5,6,0,6 8,0,0,6,5,0,5,6,0,6 7,6,5,5,5,5,5,6,0,6 0,0,0,5,5,6,0,0,0,6 6,0,5,5,5,7,6,0,0,7 6,0,0,6,5,5,0,8,0,8 6,8,0,0,6,6,5,5,5,8 6,0,7,6,5,5,5,8,0,8 6,0,0,5,5,7,0,0,0,7 7,6,5,5,5,6,6,0,0,6 8,0,0,6,5,5,0,6,0,6 0,0,0,5,5,7,0,0,0,7 5,0,0,0,0,5,7,0,0,7 0,0,0,7,6,0,0,0,0,7 7,0,5,5,5,6,0,0,0,6 6,6,5,5,5,5,5,8,0,8 8,0,6,6,5,5,5,6,0,6 0,0,0,7,6,7,0,0,0,5 7,0,0,7,5,6,7,0,0,5 7,0,0,0,0,5,6,7,0,5 7,0,7,6,6,0,0,0,0,6 8,6,5,5,5,5,5,6,0,6 6,6,5,5,5,8,6,0,7,8 6,5,5,5,5,8,0,6,5,8 8,6,5,5,5,6,6,0,6,6 0,0,0,5,6,0,0,0,0,5 6,0,0,8,1,6,5,2,0,8 6,0,0,8,6,5,1,2,0,8 6,0,0,8,5,1,1,2,0,8 6,5,5,8,6,0,0,0,5,8 0,5,5,6,0,0,0,0,0,6 8,5,5,5,5,6,0,6,5,6 6,9,0,0,6,6,5,5,5,9 6,5,5,8,0,0,0,0,0,8 6,0,6,6,5,5,5,8,0,8 6,0,0,6,5,5,5,9,6,9 8,5,5,6,6,0,0,6,5,6 6,0,0,6,0,5,5,9,0,9 0,5,5,8,0,0,0,0,0,8 6,8,0,0,9,6,5,5,5,8 8,5,5,6,0,0,0,0,5,6 5,0,0,5,6,8,0,0,0,8 6,6,5,5,5,8,6,0,6,8 6,0,0,6,5,0,5,9,0,9 9,0,0,6,0,5,5,6,0,6 8,5,5,6,0,0,0,0,0,6 6,0,0,6,5,5,0,9,0,9 8,0,0,5,6,6,0,0,0,6 9,0,0,6,5,0,5,6,0,6 0,0,0,0,5,5,8,0,0,5 6,0,0,5,1,6,5,6,0,5 6,5,5,8,6,0,0,6,5,8 6,0,6,6,5,5,5,9,0,9 9,0,0,6,5,5,0,6,0,6 6,0,0,5,6,5,1,6,0,5 6,5,5,1,0,6,5,5,6,5 6,5,5,8,0,0,0,6,6,8 9,0,6,6,5,5,5,6,0,6 6,6,5,5,5,5,5,9,0,9 6,5,1,0,0,6,5,5,5,5 6,5,0,0,0,6,5,5,5,0 5,5,5,6,6,5,0,0,0,0 5,5,1,0,0,6,5,5,5,0 5,5,5,5,6,5,0,0,1,0 6,6,5,8,0,0,0,0,0,8 6,6,5,5,5,9,6,0,6,9 8,5,5,6,0,0,0,6,6,6 9,6,5,5,5,5,5,6,0,6 6,0,0,0,0,6,5,5,0,0 6,6,5,5,6,8,0,0,0,8 6,0,9,6,5,5,5,8,0,8 6,5,5,5,5,9,0,6,5,9 9,6,5,5,5,6,6,0,6,6 8,6,5,6,0,0,0,0,0,6 6,0,0,0,0,6,5,5,5,0 6,5,5,9,6,0,0,6,5,9 6,6,5,5,5,8,0,0,0,8 8,6,5,5,6,6,0,0,0,6 9,5,5,5,5,6,0,6,5,6 8,6,5,5,5,6,0,0,0,6 9,5,5,6,6,0,0,6,5,6 6,6,5,5,5,8,6,0,9,8 6,5,5,9,0,0,0,6,6,9 6,0,5,5,5,8,0,0,0,8 6,6,5,9,0,0,0,0,0,9 9,5,5,6,0,0,0,6,6,6 6,0,0,5,5,8,0,0,0,8 6,6,5,5,6,9,0,0,0,9 9,6,5,6,0,0,0,0,0,6 0,0,0,5,5,8,0,0,0,8 6,6,5,5,5,9,0,0,0,9 6,5,5,8,0,0,0,6,9,8 9,6,5,5,6,6,0,0,0,6 8,0,5,5,5,6,0,0,0,6 8,0,0,5,5,6,0,0,0,6 9,6,5,5,5,6,0,0,0,6 5,0,0,0,0,5,6,8,0,8 8,0,0,0,0,5,6,6,0,6 0,0,0,0,0,0,5,5,8,5 6,0,0,0,7,6,5,5,5,0 6,0,0,6,5,5,5,5,5,0 6,6,6,5,5,9,0,0,0,9 6,0,0,6,5,9,0,0,0,9 9,6,6,5,5,6,0,0,0,6 6,0,0,6,5,5,5,0,0,0 6,0,0,6,0,5,5,0,0,0 6,0,6,6,5,5,5,7,0,7 6,0,0,6,5,5,6,9,0,9 9,0,0,6,5,6,0,0,0,6 9,0,0,6,5,5,6,6,0,6 6,0,0,6,5,5,5,9,0,9 6,6,9,5,5,8,0,0,0,8 6,0,0,6,5,0,5,0,0,0 6,6,5,5,5,7,6,0,6,7 6,0,0,6,5,5,0,0,0,0 6,0,0,6,5,8,0,0,0,8 6,0,0,0,5,5,5,9,0,9 8,6,6,5,5,6,0,0,0,6 9,0,0,6,5,5,5,6,0,6 6,0,0,6,5,5,6,8,0,8 8,0,0,6,5,6,0,0,0,6 8,0,0,6,5,5,6,6,0,6 7,6,5,5,5,6,6,0,6,6 6,5,5,5,5,7,0,6,5,7 6,0,0,6,5,5,5,8,0,8 6,0,7,6,5,5,5,0,0,0 6,6,5,5,5,5,5,0,0,0 6,5,5,7,6,0,0,6,5,7 8,0,0,6,5,5,5,6,0,6 7,5,5,5,5,6,0,6,5,6 6,5,5,7,0,0,0,6,6,7 7,5,5,6,6,0,0,6,5,6 6,6,5,5,5,0,0,0,7,0 6,0,0,6,6,0,5,8,0,8 6,6,5,7,0,0,0,0,0,7 7,5,5,6,0,0,0,6,6,6 6,5,5,5,5,0,0,6,5,0 6,0,0,0,0,5,0,8,0,8 6,6,5,5,6,7,0,0,0,7 7,6,5,6,0,0,0,0,0,6 6,5,5,0,0,0,0,6,5,0 0,0,0,0,0,5,5,8,0,8 8,0,0,0,5,5,0,6,0,6 5,8,0,0,0,0,0,5,6,8 8,0,0,0,0,5,5,6,0,6 8,6,0,0,0,0,0,5,6,6 0,5,8,0,0,0,0,0,0,5 6,6,5,5,5,7,0,0,0,7 7,6,5,5,6,6,0,0,0,6 6,5,5,0,0,0,0,6,7,0 6,6,5,0,0,0,0,0,0,0 7,6,5,5,5,6,0,0,0,6 6,6,5,5,0,0,0,0,0,0 6,6,5,5,5,0,0,0,0,0 6,6,6,5,5,7,0,0,0,7 6,0,0,6,5,7,0,0,0,7 7,6,6,5,5,6,0,0,0,6 7,0,0,6,5,6,0,0,0,6 6,0,0,6,5,5,6,7,0,7 7,0,0,6,6,0,0,0,0,0 6,6,7,5,5,0,0,0,7,0 7,0,0,6,5,5,6,6,0,6 6,0,0,6,5,5,5,7,0,7 6,0,0,6,5,0,0,0,0,0 6,0,0,6,6,5,0,7,0,7 6,0,0,0,0,6,5,7,0,7 7,0,0,6,6,5,0,6,0,6 7,0,0,0,0,6,5,6,0,6 6,7,0,0,0,6,5,5,6,7 7,6,0,0,0,6,5,5,6,6 6,0,0,6,7,5,0,0,0,0 6,0,0,0,0,6,5,0,0,0 6,0,0,0,0,5,5,0,0,0 6,0,0,0,5,5,5,0,0,0 5,5,5,1,0,5,5,5,5,7 5,0,0,2,1,7,5,5,0,2 5,0,0,2,7,5,1,5,0,2 2,0,0,5,1,7,5,5,0,5 2,0,0,5,7,5,1,5,0,5 a,0,0,b,1,7,5,c,0,b a,0,0,b,7,5,1,c,0,b 7,0,0,2,1,7,5,5,0,2 7,0,0,2,7,5,1,5,0,2 2,0,0,7,1,7,5,7,0,7 2,0,0,7,7,5,1,7,0,7 7,0,0,5,1,7,5,2,0,5 7,0,0,5,7,5,1,2,0,5 6,0,0,2,1,7,5,9,0,2 6,0,0,2,7,5,1,9,0,2 2,0,0,6,1,7,5,6,0,6 2,0,0,6,7,5,1,6,0,6 9,0,0,2,1,7,5,6,0,2 9,0,0,2,7,5,1,6,0,2 2,0,0,6,1,7,5,9,0,6 2,0,0,6,7,5,1,9,0,6 6,0,0,8,1,7,5,2,0,8 6,0,0,8,7,5,1,2,0,8 6,0,0,7,5,1,1,6,0,7 7,0,0,6,5,1,1,6,0,6 6,0,0,9,5,1,1,6,0,9 9,0,0,6,5,1,1,6,0,6 6,0,0,2,5,1,1,9,0,2 2,0,0,6,5,1,1,6,0,6 6,0,0,8,5,1,1,6,0,8 8,0,0,6,5,1,1,6,0,6 9,0,0,2,5,1,1,6,0,2 2,0,0,6,5,1,1,9,0,6 6,0,0,5,5,1,1,6,0,5 5,0,0,2,5,1,1,5,0,2 2,0,0,5,5,1,1,5,0,5 7,0,0,2,5,1,1,5,0,2 2,0,0,7,5,1,1,7,0,7 @COLORS # colors from # http://lslwww.epfl.ch/pages/embryonics/thesis/AppendixA.html 1 255 255 255 2 255 0 0 3 0 255 255 4 0 255 0 5 255 0 255 6 0 0 255 7 255 255 0 8 85 85 85 9 170 170 170 golly-2.5-src/Rules/TMGasMargolus_emulated.rule0000644000175100001440000002421712156145314016551 00000000000000@RULE TMGasMargolus_emulated @TREE num_states=9 num_neighbors=8 num_nodes=340 1 0 2 2 4 4 6 6 8 8 1 0 1 2 3 4 5 6 7 8 2 0 1 0 1 0 1 0 1 0 2 1 1 1 1 1 1 1 1 1 1 0 2 1 4 3 6 5 8 7 2 0 1 4 1 4 1 4 1 4 3 2 3 5 3 5 3 5 3 5 3 3 3 3 3 3 3 3 3 3 3 5 3 5 3 5 3 5 3 5 4 6 7 8 7 8 7 8 7 8 4 7 7 7 7 7 7 7 7 7 2 4 1 4 1 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 7 13 7 13 5 9 10 14 10 14 10 14 10 14 1 0 1 1 3 3 5 5 7 7 2 16 1 16 1 16 1 16 1 16 3 17 3 17 3 17 3 17 3 17 4 18 7 18 7 18 7 18 7 18 5 19 10 19 10 19 10 19 10 19 1 0 2 2 4 4 2 6 2 8 1 0 2 2 4 4 8 6 6 8 1 0 8 2 4 4 8 6 8 8 1 0 2 2 4 4 6 6 2 8 2 0 1 21 1 22 1 23 1 24 1 0 2 2 4 4 8 6 8 8 1 0 2 2 4 4 6 6 6 8 2 0 1 22 1 22 1 26 1 27 1 0 2 2 4 4 2 6 8 8 2 0 1 29 1 26 1 26 1 0 1 0 6 2 4 4 6 6 6 8 2 0 1 31 1 27 1 0 1 27 3 2 3 25 3 28 3 30 3 32 4 33 7 33 7 33 7 33 7 33 5 34 10 34 10 34 10 34 10 34 2 0 1 26 1 26 1 26 1 0 2 0 1 27 1 27 1 0 1 27 3 2 3 28 3 28 3 36 3 37 4 38 7 38 7 38 7 38 7 38 5 39 10 39 10 39 10 39 10 39 2 0 1 26 1 26 1 23 1 0 2 0 1 29 1 26 1 23 1 0 3 2 3 41 3 36 3 42 3 2 4 43 7 43 7 43 7 43 7 43 5 44 10 44 10 44 10 44 10 44 2 0 1 27 1 27 1 0 1 24 2 0 1 31 1 27 1 0 1 31 3 2 3 46 3 37 3 2 3 47 4 48 7 48 7 48 7 48 7 48 5 49 10 49 10 49 10 49 10 49 6 15 20 35 20 40 20 45 20 50 5 10 10 10 10 10 10 10 10 10 6 20 20 52 20 52 20 52 20 52 3 2 3 2 3 2 3 2 3 2 1 0 1 2 3 4 5 2 7 2 1 0 1 2 3 4 5 8 7 6 1 0 1 2 3 4 5 2 7 8 1 0 1 6 3 4 5 6 7 6 2 1 1 55 1 56 1 57 1 58 3 59 59 3 59 3 59 3 59 3 1 0 1 2 3 4 5 8 7 8 1 0 1 2 3 4 5 6 7 6 2 1 1 56 1 56 1 61 1 62 3 63 63 3 63 3 63 3 63 3 1 0 1 8 3 4 5 8 7 8 2 1 1 65 1 61 1 61 1 1 3 66 66 3 66 3 66 3 66 3 1 0 1 2 3 4 5 6 7 2 2 1 1 68 1 62 1 1 1 62 3 69 69 3 69 3 69 3 69 3 4 54 60 54 64 54 67 54 70 54 5 71 10 71 10 71 10 71 10 71 4 33 60 33 64 33 67 33 70 33 5 73 10 73 10 73 10 73 10 73 4 38 60 38 64 38 67 38 70 38 5 75 10 75 10 75 10 75 10 75 4 43 60 43 64 43 67 43 70 43 5 77 10 77 10 77 10 77 10 77 4 48 60 48 64 48 67 48 70 48 5 79 10 79 10 79 10 79 10 79 6 72 52 74 52 76 52 78 52 80 2 1 1 61 1 61 1 61 1 1 3 82 82 3 82 3 82 3 82 3 2 1 1 62 1 62 1 1 1 62 3 84 84 3 84 3 84 3 84 3 4 54 64 54 64 54 83 54 85 54 5 86 10 86 10 86 10 86 10 86 4 33 64 33 64 33 83 33 85 33 5 88 10 88 10 88 10 88 10 88 4 38 64 38 64 38 83 38 85 38 5 90 10 90 10 90 10 90 10 90 4 43 64 43 64 43 83 43 85 43 5 92 10 92 10 92 10 92 10 92 4 48 64 48 64 48 83 48 85 48 5 94 10 94 10 94 10 94 10 94 6 87 52 89 52 91 52 93 52 95 2 1 1 61 1 61 1 57 1 1 3 97 97 3 97 3 97 3 97 3 2 1 1 65 1 61 1 65 1 1 3 99 99 3 99 3 99 3 99 3 4 54 98 54 83 54 100 54 7 54 5 101 10 101 10 101 10 101 10 101 4 33 98 33 83 33 100 33 7 33 5 103 10 103 10 103 10 103 10 103 4 38 98 38 83 38 100 38 7 38 5 105 10 105 10 105 10 105 10 105 4 43 98 43 83 43 100 43 7 43 5 107 10 107 10 107 10 107 10 107 4 48 98 48 83 48 100 48 7 48 5 109 10 109 10 109 10 109 10 109 6 102 52 104 52 106 52 108 52 110 2 1 1 62 1 62 1 1 1 58 3 112 112 3 112 3 112 3 112 3 2 1 1 68 1 62 1 1 1 58 3 114 114 3 114 3 114 3 114 3 4 54 113 54 85 54 7 54 115 54 5 116 10 116 10 116 10 116 10 116 4 33 113 33 85 33 7 33 115 33 5 118 10 118 10 118 10 118 10 118 4 38 113 38 85 38 7 38 115 38 5 120 10 120 10 120 10 120 10 120 4 43 113 43 85 43 7 43 115 43 5 122 10 122 10 122 10 122 10 122 4 48 113 48 85 48 7 48 115 48 5 124 10 124 10 124 10 124 10 124 6 117 52 119 52 121 52 123 52 125 7 51 53 81 53 96 53 111 53 126 6 52 52 52 52 52 52 52 52 52 7 53 53 128 53 128 53 128 53 128 4 54 7 54 7 54 7 54 7 54 2 55 55 1 55 1 55 1 55 1 2 56 56 1 56 1 56 1 56 1 2 65 65 1 65 1 65 1 65 1 2 68 68 1 68 1 68 1 68 1 3 3 3 131 3 132 3 133 3 134 4 135 7 135 7 135 7 135 7 135 2 61 61 1 61 1 61 1 61 1 2 62 62 1 62 1 62 1 62 1 3 3 3 132 3 132 3 137 3 138 4 139 7 139 7 139 7 139 7 139 2 57 57 1 57 1 57 1 57 1 3 3 3 141 3 137 3 137 3 3 4 142 7 142 7 142 7 142 7 142 2 58 58 1 58 1 58 1 58 1 3 3 3 144 3 138 3 3 3 138 4 145 7 145 7 145 7 145 7 145 5 130 136 130 140 130 143 130 146 130 5 34 136 34 140 34 143 34 146 34 5 39 136 39 140 39 143 39 146 39 5 44 136 44 140 44 143 44 146 44 5 49 136 49 140 49 143 49 146 49 6 147 52 148 52 149 52 150 52 151 5 71 136 71 140 71 143 71 146 71 5 73 136 73 140 73 143 73 146 73 5 75 136 75 140 75 143 75 146 75 5 77 136 77 140 77 143 77 146 77 5 79 136 79 140 79 143 79 146 79 6 153 52 154 52 155 52 156 52 157 5 86 136 86 140 86 143 86 146 86 5 88 136 88 140 88 143 88 146 88 5 90 136 90 140 90 143 90 146 90 5 92 136 92 140 92 143 92 146 92 5 94 136 94 140 94 143 94 146 94 6 159 52 160 52 161 52 162 52 163 5 101 136 101 140 101 143 101 146 101 5 103 136 103 140 103 143 103 146 103 5 105 136 105 140 105 143 105 146 105 5 107 136 107 140 107 143 107 146 107 5 109 136 109 140 109 143 109 146 109 6 165 52 166 52 167 52 168 52 169 5 116 136 116 140 116 143 116 146 116 5 118 136 118 140 118 143 118 146 118 5 120 136 120 140 120 143 120 146 120 5 122 136 122 140 122 143 122 146 122 5 124 136 124 140 124 143 124 146 124 6 171 52 172 52 173 52 174 52 175 7 152 128 158 128 164 128 170 128 176 3 3 3 137 3 137 3 137 3 3 4 178 7 178 7 178 7 178 7 178 3 3 3 138 3 138 3 3 3 138 4 180 7 180 7 180 7 180 7 180 5 130 140 130 140 130 179 130 181 130 5 34 140 34 140 34 179 34 181 34 5 39 140 39 140 39 179 39 181 39 5 44 140 44 140 44 179 44 181 44 5 49 140 49 140 49 179 49 181 49 6 182 52 183 52 184 52 185 52 186 5 71 140 71 140 71 179 71 181 71 5 73 140 73 140 73 179 73 181 73 5 75 140 75 140 75 179 75 181 75 5 77 140 77 140 77 179 77 181 77 5 79 140 79 140 79 179 79 181 79 6 188 52 189 52 190 52 191 52 192 5 86 140 86 140 86 179 86 181 86 5 88 140 88 140 88 179 88 181 88 5 90 140 90 140 90 179 90 181 90 5 92 140 92 140 92 179 92 181 92 5 94 140 94 140 94 179 94 181 94 6 194 52 195 52 196 52 197 52 198 5 101 140 101 140 101 179 101 181 101 5 103 140 103 140 103 179 103 181 103 5 105 140 105 140 105 179 105 181 105 5 107 140 107 140 107 179 107 181 107 5 109 140 109 140 109 179 109 181 109 6 200 52 201 52 202 52 203 52 204 5 116 140 116 140 116 179 116 181 116 5 118 140 118 140 118 179 118 181 118 5 120 140 120 140 120 179 120 181 120 5 122 140 122 140 122 179 122 181 122 5 124 140 124 140 124 179 124 181 124 6 206 52 207 52 208 52 209 52 210 7 187 128 193 128 199 128 205 128 211 3 3 3 137 3 137 3 133 3 3 4 213 7 213 7 213 7 213 7 213 3 3 3 141 3 137 3 133 3 3 4 215 7 215 7 215 7 215 7 215 5 130 214 130 179 130 216 130 10 130 5 34 214 34 179 34 216 34 10 34 5 39 214 39 179 39 216 39 10 39 5 44 214 44 179 44 216 44 10 44 5 49 214 49 179 49 216 49 10 49 6 217 52 218 52 219 52 220 52 221 5 71 214 71 179 71 216 71 10 71 5 73 214 73 179 73 216 73 10 73 5 75 214 75 179 75 216 75 10 75 5 77 214 77 179 77 216 77 10 77 5 79 214 79 179 79 216 79 10 79 6 223 52 224 52 225 52 226 52 227 5 86 214 86 179 86 216 86 10 86 5 88 214 88 179 88 216 88 10 88 5 90 214 90 179 90 216 90 10 90 5 92 214 92 179 92 216 92 10 92 5 94 214 94 179 94 216 94 10 94 6 229 52 230 52 231 52 232 52 233 5 101 214 101 179 101 216 101 10 101 5 103 214 103 179 103 216 103 10 103 5 105 214 105 179 105 216 105 10 105 5 107 214 107 179 107 216 107 10 107 5 109 214 109 179 109 216 109 10 109 6 235 52 236 52 237 52 238 52 239 5 116 214 116 179 116 216 116 10 116 5 118 214 118 179 118 216 118 10 118 5 120 214 120 179 120 216 120 10 120 5 122 214 122 179 122 216 122 10 122 5 124 214 124 179 124 216 124 10 124 6 241 52 242 52 243 52 244 52 245 7 222 128 228 128 234 128 240 128 246 3 3 3 138 3 138 3 3 3 134 4 248 7 248 7 248 7 248 7 248 3 3 3 144 3 138 3 3 3 144 4 250 7 250 7 250 7 250 7 250 5 130 249 130 181 130 10 130 251 130 5 34 249 34 181 34 10 34 251 34 5 39 249 39 181 39 10 39 251 39 5 44 249 44 181 44 10 44 251 44 5 49 249 49 181 49 10 49 251 49 6 252 52 253 52 254 52 255 52 256 5 71 249 71 181 71 10 71 251 71 5 73 249 73 181 73 10 73 251 73 5 75 249 75 181 75 10 75 251 75 5 77 249 77 181 77 10 77 251 77 5 79 249 79 181 79 10 79 251 79 6 258 52 259 52 260 52 261 52 262 5 86 249 86 181 86 10 86 251 86 5 88 249 88 181 88 10 88 251 88 5 90 249 90 181 90 10 90 251 90 5 92 249 92 181 92 10 92 251 92 5 94 249 94 181 94 10 94 251 94 6 264 52 265 52 266 52 267 52 268 5 101 249 101 181 101 10 101 251 101 5 103 249 103 181 103 10 103 251 103 5 105 249 105 181 105 10 105 251 105 5 107 249 107 181 107 10 107 251 107 5 109 249 109 181 109 10 109 251 109 6 270 52 271 52 272 52 273 52 274 5 116 249 116 181 116 10 116 251 116 5 118 249 118 181 118 10 118 251 118 5 120 249 120 181 120 10 120 251 120 5 122 249 122 181 122 10 122 251 122 5 124 249 124 181 124 10 124 251 124 6 276 52 277 52 278 52 279 52 280 7 257 128 263 128 269 128 275 128 281 8 127 129 177 129 212 129 247 129 282 1 0 1 1 3 3 5 1 7 1 2 284 1 284 1 284 1 284 1 284 3 285 3 285 3 285 3 285 3 285 1 0 1 1 3 3 5 7 7 5 2 287 1 287 1 287 1 287 1 287 3 288 3 288 3 288 3 288 3 288 1 0 1 1 3 3 5 1 7 7 2 290 1 290 1 290 1 290 1 290 3 291 3 291 3 291 3 291 3 291 1 0 1 5 3 3 5 5 7 5 2 293 1 293 1 293 1 293 1 293 3 294 3 294 3 294 3 294 3 294 4 18 7 286 7 289 7 292 7 295 1 0 1 1 3 3 5 7 7 7 2 297 1 297 1 297 1 297 1 297 3 298 3 298 3 298 3 298 3 298 1 0 1 1 3 3 5 5 7 5 2 300 1 300 1 300 1 300 1 300 3 301 3 301 3 301 3 301 3 301 4 18 7 289 7 289 7 299 7 302 1 0 1 7 3 3 5 7 7 7 2 304 1 304 1 304 1 304 1 304 3 305 3 305 3 305 3 305 3 305 4 18 7 306 7 299 7 299 7 18 1 0 1 1 3 3 5 5 7 1 2 308 1 308 1 308 1 308 1 308 3 309 3 309 3 309 3 309 3 309 4 18 7 310 7 302 7 18 7 302 5 19 10 296 10 303 10 307 10 311 6 312 312 52 312 52 312 52 312 52 7 313 313 128 313 128 313 128 313 128 7 128 128 128 128 128 128 128 128 128 8 314 314 315 314 315 314 315 314 315 5 130 10 130 10 130 10 130 10 130 6 317 52 35 52 40 52 45 52 50 7 318 128 81 128 96 128 111 128 126 8 319 315 177 315 212 315 247 315 282 4 18 7 299 7 299 7 299 7 18 4 18 7 302 7 302 7 18 7 302 5 19 10 303 10 303 10 321 10 322 6 323 323 52 323 52 323 52 323 52 7 324 324 128 324 128 324 128 324 128 8 325 325 315 325 315 325 315 325 315 4 18 7 299 7 299 7 292 7 18 4 18 7 306 7 299 7 306 7 18 5 19 10 327 10 321 10 328 10 19 6 329 329 52 329 52 329 52 329 52 7 330 330 128 330 128 330 128 330 128 8 331 331 315 331 315 331 315 331 315 4 18 7 302 7 302 7 18 7 295 4 18 7 310 7 302 7 18 7 295 5 19 10 333 10 322 10 19 10 334 6 335 335 52 335 52 335 52 335 52 7 336 336 128 336 128 336 128 336 128 8 337 337 315 337 315 337 315 337 315 9 283 316 320 326 320 332 320 338 320 @COLORS 1 90 90 90 2 62 62 62 3 0 255 127 4 0 178 88 5 255 255 255 6 220 220 220 7 255 255 0 8 220 220 0 golly-2.5-src/Rules/TripATronMargolus_emulated.rule0000644000175100001440000000357712156145314017466 00000000000000@RULE TripATronMargolus_emulated @TREE num_states=5 num_neighbors=8 num_nodes=114 1 0 2 2 4 4 1 0 1 2 3 4 2 0 1 0 1 0 2 1 1 1 1 1 1 0 2 1 4 3 2 0 1 4 1 4 3 2 3 5 3 5 3 3 3 3 3 3 3 5 3 5 3 5 4 6 7 8 7 8 4 7 7 7 7 7 2 4 1 4 1 4 3 2 3 11 3 11 3 11 3 11 3 11 4 12 7 13 7 13 5 9 10 14 10 14 1 0 1 1 3 3 2 16 1 16 1 16 3 17 3 17 3 17 4 18 7 18 7 18 5 19 10 19 10 19 1 0 4 2 4 4 2 0 1 21 1 0 3 2 3 22 3 2 4 23 7 23 7 23 5 24 10 24 10 24 1 0 2 2 2 4 2 0 1 0 1 26 3 2 3 2 3 27 4 28 7 28 7 28 5 29 10 29 10 29 6 15 20 25 20 30 5 10 10 10 10 10 6 20 20 32 20 32 3 2 3 2 3 2 1 0 1 4 3 4 2 1 1 35 1 1 3 36 36 3 36 3 4 34 37 34 7 34 5 38 10 38 10 38 4 23 37 23 7 23 5 40 10 40 10 40 4 28 37 28 7 28 5 42 10 42 10 42 6 39 32 41 32 43 1 0 1 2 3 2 2 1 1 1 1 45 3 46 46 3 46 3 4 34 7 34 47 34 5 48 10 48 10 48 4 23 7 23 47 23 5 50 10 50 10 50 4 28 7 28 47 28 5 52 10 52 10 52 6 49 32 51 32 53 7 31 33 44 33 54 6 32 32 32 32 32 7 33 33 56 33 56 4 34 7 34 7 34 2 35 35 1 35 1 3 3 3 59 3 3 4 60 7 60 7 60 5 58 61 58 10 58 5 24 61 24 10 24 5 29 61 29 10 29 6 62 32 63 32 64 5 38 61 38 10 38 5 40 61 40 10 40 5 42 61 42 10 42 6 66 32 67 32 68 5 48 61 48 10 48 5 50 61 50 10 50 5 52 61 52 10 52 6 70 32 71 32 72 7 65 56 69 56 73 2 45 45 1 45 1 3 3 3 3 3 75 4 76 7 76 7 76 5 58 10 58 77 58 5 24 10 24 77 24 5 29 10 29 77 29 6 78 32 79 32 80 5 38 10 38 77 38 5 40 10 40 77 40 5 42 10 42 77 42 6 82 32 83 32 84 5 48 10 48 77 48 5 50 10 50 77 50 5 52 10 52 77 52 6 86 32 87 32 88 7 81 56 85 56 89 8 55 57 74 57 90 1 0 1 3 3 3 2 92 1 92 1 92 3 93 3 93 3 93 4 18 7 94 7 18 5 19 10 95 10 19 6 96 96 32 96 32 7 97 97 56 97 56 7 56 56 56 56 56 8 98 98 99 98 99 5 58 10 58 10 58 6 101 32 25 32 30 7 102 56 44 56 54 8 103 99 74 99 90 1 0 1 1 3 1 2 105 1 105 1 105 3 106 3 106 3 106 4 18 7 18 7 107 5 19 10 19 10 108 6 109 109 32 109 32 7 110 110 56 110 56 8 111 111 99 111 99 9 91 100 104 112 104 @COLORS 1 90 90 90 2 62 62 62 3 0 255 127 4 0 178 88 golly-2.5-src/Rules/TriTurmite_120010.rule0000644000175100001440000007471712156145314015131 00000000000000@RULE TriTurmite_120010 @TREE num_states=64 num_neighbors=4 num_nodes=31 1 0 1 1 17 1 0 0 16 8 9 9 41 9 8 8 40 8 9 9 41 9 8 8 40 10 13 13 45 13 10 10 42 8 9 9 41 9 8 8 40 0 1 1 17 1 0 0 16 0 1 1 17 1 0 0 16 2 5 5 21 5 2 2 18 1 3 6 6 22 6 3 3 19 11 14 14 46 14 11 11 43 11 14 14 46 14 11 11 43 8 9 9 41 9 8 8 40 11 14 14 46 14 11 11 43 3 6 6 22 6 3 3 19 3 6 6 22 6 3 3 19 0 1 1 17 1 0 0 16 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 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 32 33 33 1 33 32 32 0 56 57 57 9 57 56 56 8 56 57 57 9 57 56 56 8 58 61 61 13 61 58 58 10 56 57 57 9 57 56 56 8 32 33 33 1 33 32 32 0 32 33 33 1 33 32 32 0 34 37 37 5 37 34 34 2 1 35 38 38 6 38 35 35 3 59 62 62 14 62 59 59 11 59 62 62 14 62 59 59 11 56 57 57 9 57 56 56 8 59 62 62 14 62 59 59 11 35 38 38 6 38 35 35 3 35 38 38 6 38 35 35 3 32 33 33 1 33 32 32 0 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 2 2 5 2 1 4 7 7 23 7 4 4 20 12 15 15 47 15 12 12 44 12 15 15 47 15 12 12 44 8 9 9 41 9 8 8 40 12 15 15 47 15 12 12 44 4 7 7 23 7 4 4 20 4 7 7 23 7 4 4 20 0 1 1 17 1 0 0 16 1 0 1 1 17 1 0 0 16 8 9 9 41 9 8 8 40 8 9 9 41 9 8 8 40 8 9 9 41 9 8 8 40 8 9 9 41 9 8 8 40 0 1 1 17 1 0 0 16 0 1 1 17 1 0 0 16 0 1 1 17 1 0 0 16 2 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 1 36 39 39 7 39 36 36 4 60 63 63 15 63 60 60 12 60 63 63 15 63 60 60 12 56 57 57 9 57 56 56 8 60 63 63 15 63 60 60 12 36 39 39 7 39 36 36 4 36 39 39 7 39 36 36 4 32 33 33 1 33 32 32 0 1 32 33 33 1 33 32 32 0 56 57 57 9 57 56 56 8 56 57 57 9 57 56 56 8 56 57 57 9 57 56 56 8 56 57 57 9 57 56 56 8 32 33 33 1 33 32 32 0 32 33 33 1 33 32 32 0 32 33 33 1 33 32 32 0 2 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 3 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 9 9 12 9 4 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 13 13 13 13 13 13 13 13 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 13 13 13 13 13 13 13 13 6 6 6 6 6 6 6 6 1 24 25 25 1 25 24 24 0 48 49 49 9 49 48 48 8 48 49 49 9 49 48 48 8 50 53 53 13 53 50 50 10 48 49 49 9 49 48 48 8 24 25 25 1 25 24 24 0 24 25 25 1 25 24 24 0 26 29 29 5 29 26 26 2 1 27 30 30 6 30 27 27 3 51 54 54 14 54 51 51 11 51 54 54 14 54 51 51 11 48 49 49 9 49 48 48 8 51 54 54 14 54 51 51 11 27 30 30 6 30 27 27 3 27 30 30 6 30 27 27 3 24 25 25 1 25 24 24 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 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 1 0 1 1 1 1 0 0 0 8 9 9 9 9 8 8 8 8 9 9 9 9 8 8 8 10 13 13 13 13 10 10 10 8 9 9 9 9 8 8 8 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 2 5 5 5 5 2 2 2 1 3 6 6 6 6 3 3 3 11 14 14 14 14 11 11 11 11 14 14 14 14 11 11 11 8 9 9 9 9 8 8 8 11 14 14 14 14 11 11 11 3 6 6 6 6 3 3 3 3 6 6 6 6 3 3 3 0 1 1 1 1 0 0 0 2 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 3 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 17 17 20 17 1 28 31 31 7 31 28 28 4 52 55 55 15 55 52 52 12 52 55 55 15 55 52 52 12 48 49 49 9 49 48 48 8 52 55 55 15 55 52 52 12 28 31 31 7 31 28 28 4 28 31 31 7 31 28 28 4 24 25 25 1 25 24 24 0 1 24 25 25 1 25 24 24 0 48 49 49 9 49 48 48 8 48 49 49 9 49 48 48 8 48 49 49 9 49 48 48 8 48 49 49 9 49 48 48 8 24 25 25 1 25 24 24 0 24 25 25 1 25 24 24 0 24 25 25 1 25 24 24 0 2 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 1 4 7 7 7 7 4 4 4 12 15 15 15 15 12 12 12 12 15 15 15 15 12 12 12 8 9 9 9 9 8 8 8 12 15 15 15 15 12 12 12 4 7 7 7 7 4 4 4 4 7 7 7 7 4 4 4 0 1 1 1 1 0 0 0 1 0 1 1 1 1 0 0 0 8 9 9 9 9 8 8 8 8 9 9 9 9 8 8 8 8 9 9 9 9 8 8 8 8 9 9 9 9 8 8 8 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 2 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 26 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 3 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 24 24 27 24 4 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 28 28 28 28 28 28 28 28 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 21 28 28 28 28 28 28 28 28 21 21 21 21 21 21 21 21 5 14 14 14 14 29 29 14 14 14 14 14 14 29 29 14 14 14 14 14 14 29 29 14 14 14 14 14 14 29 29 14 14 14 14 14 14 29 29 14 14 14 14 14 14 29 29 14 14 14 14 14 14 29 29 14 14 14 14 14 14 29 29 14 14 @COLORS 0 0 0 0 1 0 155 67 2 127 0 255 3 127 0 255 4 127 0 255 5 13 138 86 6 18 132 93 7 18 132 93 8 0 155 67 9 0 155 67 10 12 140 84 11 15 135 90 12 15 135 90 13 6 146 76 14 9 143 80 15 9 143 80 16 127 0 255 17 12 140 84 18 127 0 255 19 127 0 255 20 127 0 255 21 24 125 102 22 28 120 109 23 28 120 109 24 127 0 255 25 15 135 90 26 127 0 255 27 127 0 255 28 127 0 255 29 27 121 107 30 31 116 114 31 31 116 114 32 127 0 255 33 15 135 90 34 127 0 255 35 127 0 255 36 127 0 255 37 27 121 107 38 31 116 114 39 31 116 114 40 13 138 86 41 6 146 76 42 24 125 102 43 27 121 107 44 27 121 107 45 13 138 86 46 15 135 90 47 15 135 90 48 18 132 93 49 9 143 80 50 28 120 109 51 31 116 114 52 31 116 114 53 15 135 90 54 18 132 93 55 18 132 93 56 18 132 93 57 9 143 80 58 28 120 109 59 31 116 114 60 31 116 114 61 15 135 90 62 18 132 93 63 18 132 93 @ICONS XPM /* width height num_colors chars_per_pixel */ "15 960 3 1" /* colors */ ". c #000000" "B c #009B43" "C c #7F00FF" /* icon for state 1 */ "..............." "B.............." "BB............." "BBB............" "BBBB..........." "BBBBB.........." "BBBBBB........." "BBBBBBB........" "BBBBBBBB......." "BBBBBBBBB......" "BBBBBBBBBB....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 2 */ "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "......C........" "..C..C........." "..C.C.........." "..CC..........." "..CCCC........." "..............." "..............." /* icon for state 3 */ "..............." "..............." "..............." "..............." "..............." "..C............" "..CC..........." "..CCC.........." "..CC..........." "..C.C.........." "....C.........." ".....C........." ".....C........." "......C........" "......C........" /* icon for state 4 */ "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "CC............." "..CC..........." "....CC.C......." "......CCC......" ".....CCCCC....." "..............." "..............." /* icon for state 5 */ "..............." "B.............." "BB............." "BBB............" "BBBB..........." "BBBBB.........." "BBBBBB........." "BBBBBBB........" "BBBBBBCB......." "BBCBBCBBB......" "BBCBCBBBBB....." "BBCCBBBBBBB...." "BBCCCCBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 6 */ "..............." "B.............." "BB............." "BBB............" "BBBB..........." "BBCBB.........." "BBCCBB........." "BBCCCBB........" "BBCCBBBB......." "BBCBCBBBB......" "BBBBCBBBBB....." "BBBBBCBBBBB...." "BBBBBCBBBBBB..." "BBBBBBCBBBBBB.." "BBBBBBCBBBBBBB." /* icon for state 7 */ "..............." "B.............." "BB............." "BBB............" "BBBB..........." "BBBBB.........." "BBBBBB........." "BBBBBBB........" "CCBBBBBB......." "BBCCBBBBB......" "BBBBCCBCBB....." "BBBBBBCCCBB...." "BBBBBCCCCCBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 8 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....BBBBBBBBBB" "......BBBBBBBBB" ".......BBBBBBBB" "........BBBBBBB" ".........BBBBBB" "..........BBBBB" "...........BBBB" "............BBB" ".............BB" "..............B" "..............." /* icon for state 9 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBBBBBBB" "BBB.BBBBBBBBBBB" "BBBB.BBBBBBBBBB" "BBBBB.BBBBBBBBB" "BBBBBB.BBBBBBBB" "BBBBBBB.BBBBBBB" "BBBBBBBB.BBBBBB" "BBBBBBBBB.BBBBB" "BBBBBBBBBB.BBBB" "BBBBBBBBBBB.BBB" "BBBBBBBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 10 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....BBBBBBBBBB" "......BBBBBBBBB" ".......BBBBBBBB" "........BBBBBBB" "......C..BBBBBB" "..C..C....BBBBB" "..C.C......BBBB" "..CC........BBB" "..CCCC.......BB" "..............B" "..............." /* icon for state 11 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....BBBBBBBBBB" "..C...BBBBBBBBB" "..CC...BBBBBBBB" "..CCC...BBBBBBB" "..CC.....BBBBBB" "..C.C.....BBBBB" "....C......BBBB" ".....C......BBB" ".....C.......BB" "......C.......B" "......C........" /* icon for state 12 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....BBBBBBBBBB" "......BBBBBBBBB" ".......BBBBBBBB" "........BBBBBBB" "CC.......BBBBBB" "..CC......BBBBB" "....CC.C...BBBB" "......CCC...BBB" ".....CCCCC...BB" "..............B" "..............." /* icon for state 13 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBBBBBBB" "BBB.BBBBBBBBBBB" "BBBB.BBBBBBBBBB" "BBBBB.BBBBBBBBB" "BBBBBB.BBBBBBBB" "BBBBBBB.BBBBBBB" "BBBBBBCB.BBBBBB" "BBCBBCBBB.BBBBB" "BBCBCBBBBB.BBBB" "BBCCBBBBBBB.BBB" "BBCCCCBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 14 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBBBBBBB" "BBB.BBBBBBBBBBB" "BBBB.BBBBBBBBBB" "BBCBB.BBBBBBBBB" "BBCCBB.BBBBBBBB" "BBCCCBB.BBBBBBB" "BBCCBBBB.BBBBBB" "BBCBCBBBB.BBBBB" "BBBBCBBBBB.BBBB" "BBBBBCBBBBB.BBB" "BBBBBCBBBBBB.BB" "BBBBBBCBBBBBB.B" "BBBBBBCBBBBBBB." /* icon for state 15 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBBBBBBB" "BBB.BBBBBBBBBBB" "BBBB.BBBBBBBBBB" "BBBBB.BBBBBBBBB" "BBBBBB.BBBBBBBB" "BBBBBBB.BBBBBBB" "CCBBBBBB.BBBBBB" "BBCCBBBBB.BBBBB" "BBBBCCBCBB.BBBB" "BBBBBBCCCBB.BBB" "BBBBBCCCCCBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 16 */ "..............." "..............." ".........CCCC.." "...........CC.." "..........C.C.." ".........C..C.." "........C......" "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." /* icon for state 17 */ "..............." "B.............." "BB.......CCCC.." "BBB........CC.." "BBBB......C.C.." "BBBBB....C..C.." "BBBBBB..C......" "BBBBBBB........" "BBBBBBBB......." "BBBBBBBBB......" "BBBBBBBBBB....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 18 */ "..............." "..............." ".........CCCC.." "...........CC.." "..........C.C.." ".........C..C.." "........C......" "..............." "......C........" "..C..C........." "..C.C.........." "..CC..........." "..CCCC........." "..............." "..............." /* icon for state 19 */ "..............." "..............." ".........CCCC.." "...........CC.." "..........C.C.." "..C......C..C.." "..CC....C......" "..CCC.........." "..CC..........." "..C.C.........." "....C.........." ".....C........." ".....C........." "......C........" "......C........" /* icon for state 20 */ "..............." "..............." ".........CCCC.." "...........CC.." "..........C.C.." ".........C..C.." "........C......" "..............." "CC............." "..CC..........." "....CC.C......." "......CCC......" ".....CCCCC....." "..............." "..............." /* icon for state 21 */ "..............." "B.............." "BB.......CCCC.." "BBB........CC.." "BBBB......C.C.." "BBBBB....C..C.." "BBBBBB..C......" "BBBBBBB........" "BBBBBBCB......." "BBCBBCBBB......" "BBCBCBBBBB....." "BBCCBBBBBBB...." "BBCCCCBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 22 */ "..............." "B.............." "BB.......CCCC.." "BBB........CC.." "BBBB......C.C.." "BBCBB....C..C.." "BBCCBB..C......" "BBCCCBB........" "BBCCBBBB......." "BBCBCBBBB......" "BBBBCBBBBB....." "BBBBBCBBBBB...." "BBBBBCBBBBBB..." "BBBBBBCBBBBBB.." "BBBBBBCBBBBBBB." /* icon for state 23 */ "..............." "B.............." "BB.......CCCC.." "BBB........CC.." "BBBB......C.C.." "BBBBB....C..C.." "BBBBBB..C......" "BBBBBBB........" "CCBBBBBB......." "BBCCBBBBB......" "BBBBCCBCBB....." "BBBBBBCCCBB...." "BBBBBCCCCCBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 24 */ "........C......" "........C......" ".........C....." ".........C....." "..........C...." "..........C.C.." "...........CC.." "..........CCC.." "...........CC.." "............C.." "..............." "..............." "..............." "..............." "..............." /* icon for state 25 */ "........C......" "B.......C......" "BB.......C....." "BBB......C....." "BBBB......C...." "BBBBB.....C.C.." "BBBBBB.....CC.." "BBBBBBB...CCC.." "BBBBBBBB...CC.." "BBBBBBBBB...C.." "BBBBBBBBBB....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 26 */ "........C......" "........C......" ".........C....." ".........C....." "..........C...." "..........C.C.." "...........CC.." "..........CCC.." "......C....CC.." "..C..C......C.." "..C.C.........." "..CC..........." "..CCCC........." "..............." "..............." /* icon for state 27 */ "........C......" "........C......" ".........C....." ".........C....." "..........C...." "..C.......C.C.." "..CC.......CC.." "..CCC.....CCC.." "..CC.......CC.." "..C.C.......C.." "....C.........." ".....C........." ".....C........." "......C........" "......C........" /* icon for state 28 */ "........C......" "........C......" ".........C....." ".........C....." "..........C...." "..........C.C.." "...........CC.." "..........CCC.." "CC.........CC.." "..CC........C.." "....CC.C......." "......CCC......" ".....CCCCC....." "..............." "..............." /* icon for state 29 */ "........C......" "B.......C......" "BB.......C....." "BBB......C....." "BBBB......C...." "BBBBB.....C.C.." "BBBBBB.....CC.." "BBBBBBB...CCC.." "BBBBBBCB...CC.." "BBCBBCBBB...C.." "BBCBCBBBBB....." "BBCCBBBBBBB...." "BBCCCCBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 30 */ "........C......" "B.......C......" "BB.......C....." "BBB......C....." "BBBB......C...." "BBCBB.....C.C.." "BBCCBB.....CC.." "BBCCCBB...CCC.." "BBCCBBBB...CC.." "BBCBCBBBB...C.." "BBBBCBBBBB....." "BBBBBCBBBBB...." "BBBBBCBBBBBB..." "BBBBBBCBBBBBB.." "BBBBBBCBBBBBBB." /* icon for state 31 */ "........C......" "B.......C......" "BB.......C....." "BBB......C....." "BBBB......C...." "BBBBB.....C.C.." "BBBBBB.....CC.." "BBBBBBB...CCC.." "CCBBBBBB...CC.." "BBCCBBBBB...C.." "BBBBCCBCBB....." "BBBBBBCCCBB...." "BBBBBCCCCCBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 32 */ "..............." "..............." ".....CCCCC....." "......CCC......" ".......C.CC...." "...........CC.." ".............CC" "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." /* icon for state 33 */ "..............." "B.............." "BB...CCCCC....." "BBB...CCC......" "BBBB...C.CC...." "BBBBB......CC.." "BBBBBB.......CC" "BBBBBBB........" "BBBBBBBB......." "BBBBBBBBB......" "BBBBBBBBBB....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 34 */ "..............." "..............." ".....CCCCC....." "......CCC......" ".......C.CC...." "...........CC.." ".............CC" "..............." "......C........" "..C..C........." "..C.C.........." "..CC..........." "..CCCC........." "..............." "..............." /* icon for state 35 */ "..............." "..............." ".....CCCCC....." "......CCC......" ".......C.CC...." "..C........CC.." "..CC.........CC" "..CCC.........." "..CC..........." "..C.C.........." "....C.........." ".....C........." ".....C........." "......C........" "......C........" /* icon for state 36 */ "..............." "..............." ".....CCCCC....." "......CCC......" ".......C.CC...." "...........CC.." ".............CC" "..............." "CC............." "..CC..........." "....CC.C......." "......CCC......" ".....CCCCC....." "..............." "..............." /* icon for state 37 */ "..............." "B.............." "BB...CCCCC....." "BBB...CCC......" "BBBB...C.CC...." "BBBBB......CC.." "BBBBBB.......CC" "BBBBBBB........" "BBBBBBCB......." "BBCBBCBBB......" "BBCBCBBBBB....." "BBCCBBBBBBB...." "BBCCCCBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 38 */ "..............." "B.............." "BB...CCCCC....." "BBB...CCC......" "BBBB...C.CC...." "BBCBB......CC.." "BBCCBB.......CC" "BBCCCBB........" "BBCCBBBB......." "BBCBCBBBB......" "BBBBCBBBBB....." "BBBBBCBBBBB...." "BBBBBCBBBBBB..." "BBBBBBCBBBBBB.." "BBBBBBCBBBBBBB." /* icon for state 39 */ "..............." "B.............." "BB...CCCCC....." "BBB...CCC......" "BBBB...C.CC...." "BBBBB......CC.." "BBBBBB.......CC" "BBBBBBB........" "CCBBBBBB......." "BBCCBBBBB......" "BBBBCCBCBB....." "BBBBBBCCCBB...." "BBBBBCCCCCBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 40 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBCCCCBB" "....BBBBBBBCCBB" ".....BBBBBCBCBB" "......BBBCBBCBB" ".......BCBBBBBB" "........BBBBBBB" ".........BBBBBB" "..........BBBBB" "...........BBBB" "............BBB" ".............BB" "..............B" "..............." /* icon for state 41 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBCCCCBB" "BBB.BBBBBBBCCBB" "BBBB.BBBBBCBCBB" "BBBBB.BBBCBBCBB" "BBBBBB.BCBBBBBB" "BBBBBBB.BBBBBBB" "BBBBBBBB.BBBBBB" "BBBBBBBBB.BBBBB" "BBBBBBBBBB.BBBB" "BBBBBBBBBBB.BBB" "BBBBBBBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 42 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBCCCCBB" "....BBBBBBBCCBB" ".....BBBBBCBCBB" "......BBBCBBCBB" ".......BCBBBBBB" "........BBBBBBB" "......C..BBBBBB" "..C..C....BBBBB" "..C.C......BBBB" "..CC........BBB" "..CCCC.......BB" "..............B" "..............." /* icon for state 43 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBCCCCBB" "....BBBBBBBCCBB" ".....BBBBBCBCBB" "..C...BBBCBBCBB" "..CC...BCBBBBBB" "..CCC...BBBBBBB" "..CC.....BBBBBB" "..C.C.....BBBBB" "....C......BBBB" ".....C......BBB" ".....C.......BB" "......C.......B" "......C........" /* icon for state 44 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBCCCCBB" "....BBBBBBBCCBB" ".....BBBBBCBCBB" "......BBBCBBCBB" ".......BCBBBBBB" "........BBBBBBB" "CC.......BBBBBB" "..CC......BBBBB" "....CC.C...BBBB" "......CCC...BBB" ".....CCCCC...BB" "..............B" "..............." /* icon for state 45 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBCCCCBB" "BBB.BBBBBBBCCBB" "BBBB.BBBBBCBCBB" "BBBBB.BBBCBBCBB" "BBBBBB.BCBBBBBB" "BBBBBBB.BBBBBBB" "BBBBBBCB.BBBBBB" "BBCBBCBBB.BBBBB" "BBCBCBBBBB.BBBB" "BBCCBBBBBBB.BBB" "BBCCCCBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 46 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBCCCCBB" "BBB.BBBBBBBCCBB" "BBBB.BBBBBCBCBB" "BBCBB.BBBCBBCBB" "BBCCBB.BCBBBBBB" "BBCCCBB.BBBBBBB" "BBCCBBBB.BBBBBB" "BBCBCBBBB.BBBBB" "BBBBCBBBBB.BBBB" "BBBBBCBBBBB.BBB" "BBBBBCBBBBBB.BB" "BBBBBBCBBBBBB.B" "BBBBBBCBBBBBBB." /* icon for state 47 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBCCCCBB" "BBB.BBBBBBBCCBB" "BBBB.BBBBBCBCBB" "BBBBB.BBBCBBCBB" "BBBBBB.BCBBBBBB" "BBBBBBB.BBBBBBB" "CCBBBBBB.BBBBBB" "BBCCBBBBB.BBBBB" "BBBBCCBCBB.BBBB" "BBBBBBCCCBB.BBB" "BBBBBCCCCCBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 48 */ ".BBBBBBBCBBBBBB" "..BBBBBBCBBBBBB" "...BBBBBBCBBBBB" "....BBBBBCBBBBB" ".....BBBBBCBBBB" "......BBBBCBCBB" ".......BBBBCCBB" "........BBCCCBB" ".........BBCCBB" "..........BBCBB" "...........BBBB" "............BBB" ".............BB" "..............B" "..............." /* icon for state 49 */ ".BBBBBBBCBBBBBB" "B.BBBBBBCBBBBBB" "BB.BBBBBBCBBBBB" "BBB.BBBBBCBBBBB" "BBBB.BBBBBCBBBB" "BBBBB.BBBBCBCBB" "BBBBBB.BBBBCCBB" "BBBBBBB.BBCCCBB" "BBBBBBBB.BBCCBB" "BBBBBBBBB.BBCBB" "BBBBBBBBBB.BBBB" "BBBBBBBBBBB.BBB" "BBBBBBBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 50 */ ".BBBBBBBCBBBBBB" "..BBBBBBCBBBBBB" "...BBBBBBCBBBBB" "....BBBBBCBBBBB" ".....BBBBBCBBBB" "......BBBBCBCBB" ".......BBBBCCBB" "........BBCCCBB" "......C..BBCCBB" "..C..C....BBCBB" "..C.C......BBBB" "..CC........BBB" "..CCCC.......BB" "..............B" "..............." /* icon for state 51 */ ".BBBBBBBCBBBBBB" "..BBBBBBCBBBBBB" "...BBBBBBCBBBBB" "....BBBBBCBBBBB" ".....BBBBBCBBBB" "..C...BBBBCBCBB" "..CC...BBBBCCBB" "..CCC...BBCCCBB" "..CC.....BBCCBB" "..C.C.....BBCBB" "....C......BBBB" ".....C......BBB" ".....C.......BB" "......C.......B" "......C........" /* icon for state 52 */ ".BBBBBBBCBBBBBB" "..BBBBBBCBBBBBB" "...BBBBBBCBBBBB" "....BBBBBCBBBBB" ".....BBBBBCBBBB" "......BBBBCBCBB" ".......BBBBCCBB" "........BBCCCBB" "CC.......BBCCBB" "..CC......BBCBB" "....CC.C...BBBB" "......CCC...BBB" ".....CCCCC...BB" "..............B" "..............." /* icon for state 53 */ ".BBBBBBBCBBBBBB" "B.BBBBBBCBBBBBB" "BB.BBBBBBCBBBBB" "BBB.BBBBBCBBBBB" "BBBB.BBBBBCBBBB" "BBBBB.BBBBCBCBB" "BBBBBB.BBBBCCBB" "BBBBBBB.BBCCCBB" "BBBBBBCB.BBCCBB" "BBCBBCBBB.BBCBB" "BBCBCBBBBB.BBBB" "BBCCBBBBBBB.BBB" "BBCCCCBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 54 */ ".BBBBBBBCBBBBBB" "B.BBBBBBCBBBBBB" "BB.BBBBBBCBBBBB" "BBB.BBBBBCBBBBB" "BBBB.BBBBBCBBBB" "BBCBB.BBBBCBCBB" "BBCCBB.BBBBCCBB" "BBCCCBB.BBCCCBB" "BBCCBBBB.BBCCBB" "BBCBCBBBB.BBCBB" "BBBBCBBBBB.BBBB" "BBBBBCBBBBB.BBB" "BBBBBCBBBBBB.BB" "BBBBBBCBBBBBB.B" "BBBBBBCBBBBBBB." /* icon for state 55 */ ".BBBBBBBCBBBBBB" "B.BBBBBBCBBBBBB" "BB.BBBBBBCBBBBB" "BBB.BBBBBCBBBBB" "BBBB.BBBBBCBBBB" "BBBBB.BBBBCBCBB" "BBBBBB.BBBBCCBB" "BBBBBBB.BBCCCBB" "CCBBBBBB.BBCCBB" "BBCCBBBBB.BBCBB" "BBBBCCBCBB.BBBB" "BBBBBBCCCBB.BBB" "BBBBBCCCCCBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 56 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBCCCCCBBBBB" "....BBCCCBBBBBB" ".....BBCBCCBBBB" "......BBBBBCCBB" ".......BBBBBBCC" "........BBBBBBB" ".........BBBBBB" "..........BBBBB" "...........BBBB" "............BBB" ".............BB" "..............B" "..............." /* icon for state 57 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBCCCCCBBBBB" "BBB.BBCCCBBBBBB" "BBBB.BBCBCCBBBB" "BBBBB.BBBBBCCBB" "BBBBBB.BBBBBBCC" "BBBBBBB.BBBBBBB" "BBBBBBBB.BBBBBB" "BBBBBBBBB.BBBBB" "BBBBBBBBBB.BBBB" "BBBBBBBBBBB.BBB" "BBBBBBBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 58 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBCCCCCBBBBB" "....BBCCCBBBBBB" ".....BBCBCCBBBB" "......BBBBBCCBB" ".......BBBBBBCC" "........BBBBBBB" "......C..BBBBBB" "..C..C....BBBBB" "..C.C......BBBB" "..CC........BBB" "..CCCC.......BB" "..............B" "..............." /* icon for state 59 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBCCCCCBBBBB" "....BBCCCBBBBBB" ".....BBCBCCBBBB" "..C...BBBBBCCBB" "..CC...BBBBBBCC" "..CCC...BBBBBBB" "..CC.....BBBBBB" "..C.C.....BBBBB" "....C......BBBB" ".....C......BBB" ".....C.......BB" "......C.......B" "......C........" /* icon for state 60 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBCCCCCBBBBB" "....BBCCCBBBBBB" ".....BBCBCCBBBB" "......BBBBBCCBB" ".......BBBBBBCC" "........BBBBBBB" "CC.......BBBBBB" "..CC......BBBBB" "....CC.C...BBBB" "......CCC...BBB" ".....CCCCC...BB" "..............B" "..............." /* icon for state 61 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBCCCCCBBBBB" "BBB.BBCCCBBBBBB" "BBBB.BBCBCCBBBB" "BBBBB.BBBBBCCBB" "BBBBBB.BBBBBBCC" "BBBBBBB.BBBBBBB" "BBBBBBCB.BBBBBB" "BBCBBCBBB.BBBBB" "BBCBCBBBBB.BBBB" "BBCCBBBBBBB.BBB" "BBCCCCBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 62 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBCCCCCBBBBB" "BBB.BBCCCBBBBBB" "BBBB.BBCBCCBBBB" "BBCBB.BBBBBCCBB" "BBCCBB.BBBBBBCC" "BBCCCBB.BBBBBBB" "BBCCBBBB.BBBBBB" "BBCBCBBBB.BBBBB" "BBBBCBBBBB.BBBB" "BBBBBCBBBBB.BBB" "BBBBBCBBBBBB.BB" "BBBBBBCBBBBBB.B" "BBBBBBCBBBBBBB." /* icon for state 63 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBCCCCCBBBBB" "BBB.BBCCCBBBBBB" "BBBB.BBCBCCBBBB" "BBBBB.BBBBBCCBB" "BBBBBB.BBBBBBCC" "BBBBBBB.BBBBBBB" "CCBBBBBB.BBBBBB" "BBCCBBBBB.BBBBB" "BBBBCCBCBB.BBBB" "BBBBBBCCCBB.BBB" "BBBBBCCCCCBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." /* icon for state 64 */ "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." "..............." XPM /* width height num_colors chars_per_pixel */ "7 448 3 1" /* colors */ ". c #000000" "B c #009B43" "C c #7F00FF" /* icon for state 1 */ "......." "B......" "BB....." "BBB...." "BBBB..." "BBBBB.." "BBBBBB." /* icon for state 2 */ "......." "......." "......." ".C....." ".C....." ".CCC..." "......." /* icon for state 3 */ "......." "......." "......." ".C....." ".CC...." ".C....." "......." /* icon for state 4 */ "......." "......." "......." "......." "..C...." ".CCC..." "......." /* icon for state 5 */ "......." "B......" "BB....." "BCB...." "BCBB..." "BCCCB.." "BBBBBB." /* icon for state 6 */ "......." "B......" "BB....." "BCB...." "BCCB..." "BCBBB.." "BBBBBB." /* icon for state 7 */ "......." "B......" "BB....." "BBB...." "BBCB..." "BCCCB.." "BBBBBB." /* icon for state 8 */ ".BBBBBB" "..BBBBB" "...BBBB" "....BBB" ".....BB" "......B" "......." /* icon for state 9 */ ".BBBBBB" "B.BBBBB" "BB.BBBB" "BBB.BBB" "BBBB.BB" "BBBBB.B" "BBBBBB." /* icon for state 10 */ ".BBBBBB" "..BBBBB" "...BBBB" ".C..BBB" ".C...BB" ".CCC..B" "......." /* icon for state 11 */ ".BBBBBB" "..BBBBB" "...BBBB" ".C..BBB" ".CC..BB" ".C....B" "......." /* icon for state 12 */ ".BBBBBB" "..BBBBB" "...BBBB" "....BBB" "..C..BB" ".CCC..B" "......." /* icon for state 13 */ ".BBBBBB" "B.BBBBB" "BB.BBBB" "BCB.BBB" "BCBB.BB" "BCCCB.B" "BBBBBB." /* icon for state 14 */ ".BBBBBB" "B.BBBBB" "BB.BBBB" "BCB.BBB" "BCCB.BB" "BCBBB.B" "BBBBBB." /* icon for state 15 */ ".BBBBBB" "B.BBBBB" "BB.BBBB" "BBB.BBB" "BBCB.BB" "BCCCB.B" "BBBBBB." /* icon for state 16 */ "......." "...CCC." ".....C." ".....C." "......." "......." "......." /* icon for state 17 */ "......." "B..CCC." "BB...C." "BBB..C." "BBBB..." "BBBBB.." "BBBBBB." /* icon for state 18 */ "......." "...CCC." ".....C." ".C...C." ".C....." ".CCC..." "......." /* icon for state 19 */ "......." "...CCC." ".....C." ".C...C." ".CC...." ".C....." "......." /* icon for state 20 */ "......." "...CCC." ".....C." ".....C." "..C...." ".CCC..." "......." /* icon for state 21 */ "......." "B..CCC." "BB...C." "BCB..C." "BCBB..." "BCCCB.." "BBBBBB." /* icon for state 22 */ "......." "B..CCC." "BB...C." "BCB..C." "BCCB..." "BCBBB.." "BBBBBB." /* icon for state 23 */ "......." "B..CCC." "BB...C." "BBB..C." "BBCB..." "BCCCB.." "BBBBBB." /* icon for state 24 */ "......." ".....C." "....CC." ".....C." "......." "......." "......." /* icon for state 25 */ "......." "B....C." "BB..CC." "BBB..C." "BBBB..." "BBBBB.." "BBBBBB." /* icon for state 26 */ "......." ".....C." "....CC." ".C...C." ".C....." ".CCC..." "......." /* icon for state 27 */ "......." ".....C." "....CC." ".C...C." ".CC...." ".C....." "......." /* icon for state 28 */ "......." ".....C." "....CC." ".....C." "..C...." ".CCC..." "......." /* icon for state 29 */ "......." "B....C." "BB..CC." "BCB..C." "BCBB..." "BCCCB.." "BBBBBB." /* icon for state 30 */ "......." "B....C." "BB..CC." "BCB..C." "BCCB..." "BCBBB.." "BBBBBB." /* icon for state 31 */ "......." "B....C." "BB..CC." "BBB..C." "BBCB..." "BCCCB.." "BBBBBB." /* icon for state 32 */ "......." "...CCC." "....C.." "......." "......." "......." "......." /* icon for state 33 */ "......." "B..CCC." "BB..C.." "BBB...." "BBBB..." "BBBBB.." "BBBBBB." /* icon for state 34 */ "......." "...CCC." "....C.." ".C....." ".C....." ".CCC..." "......." /* icon for state 35 */ "......." "...CCC." "....C.." ".C....." ".CC...." ".C....." "......." /* icon for state 36 */ "......." "...CCC." "....C.." "......." "..C...." ".CCC..." "......." /* icon for state 37 */ "......." "B..CCC." "BB..C.." "BCB...." "BCBB..." "BCCCB.." "BBBBBB." /* icon for state 38 */ "......." "B..CCC." "BB..C.." "BCB...." "BCCB..." "BCBBB.." "BBBBBB." /* icon for state 39 */ "......." "B..CCC." "BB..C.." "BBB...." "BBCB..." "BCCCB.." "BBBBBB." /* icon for state 40 */ ".BBBBBB" "..BCCCB" "...BBCB" "....BCB" ".....BB" "......B" "......." /* icon for state 41 */ ".BBBBBB" "B.BCCCB" "BB.BBCB" "BBB.BCB" "BBBB.BB" "BBBBB.B" "BBBBBB." /* icon for state 42 */ ".BBBBBB" "..BCCCB" "...BBCB" ".C..BCB" ".C...BB" ".CCC..B" "......." /* icon for state 43 */ ".BBBBBB" "..BCCCB" "...BBCB" ".C..BCB" ".CC..BB" ".C....B" "......." /* icon for state 44 */ ".BBBBBB" "..BCCCB" "...BBCB" "....BCB" "..C..BB" ".CCC..B" "......." /* icon for state 45 */ ".BBBBBB" "B.BCCCB" "BB.BBCB" "BCB.BCB" "BCBB.BB" "BCCCB.B" "BBBBBB." /* icon for state 46 */ ".BBBBBB" "B.BCCCB" "BB.BBCB" "BCB.BCB" "BCCB.BB" "BCBBB.B" "BBBBBB." /* icon for state 47 */ ".BBBBBB" "B.BCCCB" "BB.BBCB" "BBB.BCB" "BBCB.BB" "BCCCB.B" "BBBBBB." /* icon for state 48 */ ".BBBBBB" "..BBBCB" "...BCCB" "....BCB" ".....BB" "......B" "......." /* icon for state 49 */ ".BBBBBB" "B.BBBCB" "BB.BCCB" "BBB.BCB" "BBBB.BB" "BBBBB.B" "BBBBBB." /* icon for state 50 */ ".BBBBBB" "..BBBCB" "...BCCB" ".C..BCB" ".C...BB" ".CCC..B" "......." /* icon for state 51 */ ".BBBBBB" "..BBBCB" "...BCCB" ".C..BCB" ".CC..BB" ".C....B" "......." /* icon for state 52 */ ".BBBBBB" "..BBBCB" "...BCCB" "....BCB" "..C..BB" ".CCC..B" "......." /* icon for state 53 */ ".BBBBBB" "B.BBBCB" "BB.BCCB" "BCB.BCB" "BCBB.BB" "BCCCB.B" "BBBBBB." /* icon for state 54 */ ".BBBBBB" "B.BBBCB" "BB.BCCB" "BCB.BCB" "BCCB.BB" "BCBBB.B" "BBBBBB." /* icon for state 55 */ ".BBBBBB" "B.BBBCB" "BB.BCCB" "BBB.BCB" "BBCB.BB" "BCCCB.B" "BBBBBB." /* icon for state 56 */ ".BBBBBB" "..BCCCB" "...BCBB" "....BBB" ".....BB" "......B" "......." /* icon for state 57 */ ".BBBBBB" "B.BCCCB" "BB.BCBB" "BBB.BBB" "BBBB.BB" "BBBBB.B" "BBBBBB." /* icon for state 58 */ ".BBBBBB" "..BCCCB" "...BCBB" ".C..BBB" ".C...BB" ".CCC..B" "......." /* icon for state 59 */ ".BBBBBB" "..BCCCB" "...BCBB" ".C..BBB" ".CC..BB" ".C....B" "......." /* icon for state 60 */ ".BBBBBB" "..BCCCB" "...BCBB" "....BBB" "..C..BB" ".CCC..B" "......." /* icon for state 61 */ ".BBBBBB" "B.BCCCB" "BB.BCBB" "BCB.BBB" "BCBB.BB" "BCCCB.B" "BBBBBB." /* icon for state 62 */ ".BBBBBB" "B.BCCCB" "BB.BCBB" "BCB.BBB" "BCCB.BB" "BCBBB.B" "BBBBBB." /* icon for state 63 */ ".BBBBBB" "B.BCCCB" "BB.BCBB" "BBB.BBB" "BBCB.BB" "BCCCB.B" "BBBBBB." /* icon for state 64 */ "......." "......." "......." "......." "......." "......." "......." golly-2.5-src/Rules/Turmite_1202822111121111812a0281282.rule0000644000175100001440000016754512156145314016606 00000000000000@RULE Turmite_1202822111121111812a0281282 @TREE num_states=39 num_neighbors=4 num_nodes=37 1 0 1 2 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 1 3 15 27 15 15 15 15 15 15 15 15 27 27 27 27 27 27 27 27 15 15 15 15 27 27 27 27 27 27 27 27 15 15 15 15 27 27 27 27 1 11 23 35 23 23 23 23 23 23 23 23 35 35 35 35 35 35 35 35 23 23 23 23 35 35 35 35 35 35 35 35 23 23 23 23 35 35 35 35 1 7 19 31 19 19 19 19 19 19 19 19 31 31 31 31 31 31 31 31 19 19 19 19 31 31 31 31 31 31 31 31 19 19 19 19 31 31 31 31 2 0 0 0 0 0 0 1 2 0 0 0 0 1 0 1 0 2 0 0 3 0 0 0 0 3 0 0 3 0 0 0 0 3 0 0 0 2 0 0 1 6 18 30 18 18 18 18 18 18 18 18 30 30 30 30 30 30 30 30 18 18 18 18 30 30 30 30 30 30 30 30 18 18 18 18 30 30 30 30 2 5 5 5 5 5 5 0 0 5 5 5 5 0 5 0 5 0 5 5 0 5 5 5 5 0 5 5 0 5 5 5 5 0 5 5 5 0 5 5 1 14 26 38 26 26 26 26 26 26 26 26 38 38 38 38 38 38 38 38 26 26 26 26 38 38 38 38 38 38 38 38 26 26 26 26 38 38 38 38 2 7 7 7 7 7 7 0 0 7 7 7 7 0 7 0 7 0 7 7 0 7 7 7 7 0 7 7 0 7 7 7 7 0 7 7 7 0 7 7 1 10 22 34 22 22 22 22 22 22 22 22 34 34 34 34 34 34 34 34 22 22 22 22 34 34 34 34 34 34 34 34 22 22 22 22 34 34 34 34 2 9 9 9 9 9 9 0 0 9 9 9 9 0 9 0 9 0 9 9 0 9 9 9 9 0 9 9 0 9 9 9 9 0 9 9 9 0 9 9 3 4 4 4 4 4 6 4 4 4 4 8 6 4 6 4 8 4 4 4 4 4 4 10 10 4 4 4 4 4 4 10 10 4 4 4 8 4 4 4 1 4 16 28 16 16 16 16 16 16 16 16 28 28 28 28 28 28 28 28 16 16 16 16 28 28 28 28 28 28 28 28 16 16 16 16 28 28 28 28 2 12 12 12 12 12 12 0 0 12 12 12 12 0 12 0 12 0 12 12 0 12 12 12 12 0 12 12 0 12 12 12 12 0 12 12 12 0 12 12 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 0 0 0 3 13 13 13 13 13 14 13 13 13 13 14 14 13 14 13 14 13 13 13 13 13 13 14 14 13 13 13 13 13 13 14 14 13 13 13 14 13 13 13 1 12 24 36 24 24 24 24 24 24 24 24 36 36 36 36 36 36 36 36 24 24 24 24 36 36 36 36 36 36 36 36 24 24 24 24 36 36 36 36 2 16 16 16 16 16 16 0 0 16 16 16 16 0 16 0 16 0 16 16 0 16 16 16 16 0 16 16 0 16 16 16 16 0 16 16 16 0 16 16 3 17 17 17 17 17 14 17 17 17 17 14 14 17 14 17 14 17 17 17 17 17 17 14 14 17 17 17 17 17 17 14 14 17 17 17 14 17 17 17 1 8 20 32 20 20 20 20 20 20 20 20 32 32 32 32 32 32 32 32 20 20 20 20 32 32 32 32 32 32 32 32 20 20 20 20 32 32 32 32 2 19 19 19 19 19 19 0 0 19 19 19 19 0 19 0 19 0 19 19 0 19 19 19 19 0 19 19 0 19 19 19 19 0 19 19 19 0 19 19 3 20 20 20 20 20 14 20 20 20 20 14 14 20 14 20 14 20 20 20 20 20 20 14 14 20 20 20 20 20 20 14 14 20 20 20 14 20 20 20 4 11 11 11 15 11 11 11 11 18 11 11 15 11 15 11 11 11 18 11 11 21 11 11 11 11 21 11 11 21 11 11 11 11 21 11 11 11 18 11 1 5 17 29 17 17 17 17 17 17 17 17 29 29 29 29 29 29 29 29 17 17 17 17 29 29 29 29 29 29 29 29 17 17 17 17 29 29 29 29 2 23 23 23 23 23 23 0 0 23 23 23 23 0 23 0 23 0 23 23 0 23 23 23 23 0 23 23 0 23 23 23 23 0 23 23 23 0 23 23 3 24 24 24 24 24 14 24 24 24 24 14 14 24 14 24 14 24 24 24 24 24 24 14 14 24 24 24 24 24 24 14 14 24 24 24 14 24 24 24 3 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 4 25 25 25 26 25 25 25 25 26 25 25 26 25 26 25 25 25 26 25 25 26 25 25 25 25 26 25 25 26 25 25 25 25 26 25 25 25 26 25 1 13 25 37 25 25 25 25 25 25 25 25 37 37 37 37 37 37 37 37 25 25 25 25 37 37 37 37 37 37 37 37 25 25 25 25 37 37 37 37 2 28 28 28 28 28 28 0 0 28 28 28 28 0 28 0 28 0 28 28 0 28 28 28 28 0 28 28 0 28 28 28 28 0 28 28 28 0 28 28 3 29 29 29 29 29 14 29 29 29 29 14 14 29 14 29 14 29 29 29 29 29 29 14 14 29 29 29 29 29 29 14 14 29 29 29 14 29 29 29 4 30 30 30 26 30 30 30 30 26 30 30 26 30 26 30 30 30 26 30 30 26 30 30 30 30 26 30 30 26 30 30 30 30 26 30 30 30 26 30 1 9 21 33 21 21 21 21 21 21 21 21 33 33 33 33 33 33 33 33 21 21 21 21 33 33 33 33 33 33 33 33 21 21 21 21 33 33 33 33 2 32 32 32 32 32 32 0 0 32 32 32 32 0 32 0 32 0 32 32 0 32 32 32 32 0 32 32 0 32 32 32 32 0 32 32 32 0 32 32 3 33 33 33 33 33 14 33 33 33 33 14 14 33 14 33 14 33 33 33 33 33 33 14 14 33 33 33 33 33 33 14 14 33 33 33 14 33 33 33 4 34 34 34 26 34 34 34 34 26 34 34 26 34 26 34 34 34 26 34 34 26 34 34 34 34 26 34 34 26 34 34 34 34 26 34 34 34 26 34 5 22 22 22 22 27 22 22 22 22 31 22 22 27 22 27 22 22 22 31 22 22 35 22 22 22 22 35 22 22 35 22 22 22 22 35 22 22 22 31 @COLORS 0 0 0 0 1 0 155 67 2 127 0 255 3 132 132 132 4 132 132 132 5 132 132 132 6 132 132 132 7 186 185 102 8 186 185 102 9 186 185 102 10 186 185 102 11 12 106 251 12 12 106 251 13 12 106 251 14 12 106 251 15 23 151 78 16 23 151 78 17 23 151 78 18 23 151 78 19 32 160 73 20 32 160 73 21 32 160 73 22 32 160 73 23 2 146 99 24 2 146 99 25 2 146 99 26 2 146 99 27 128 23 233 28 128 23 233 29 128 23 233 30 128 23 233 31 137 32 228 32 137 32 228 33 137 32 228 34 137 32 228 35 106 18 255 36 106 18 255 37 106 18 255 38 106 18 255 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 1178 16 1" /* colors */ "A c #009B43" "B c #7F00FF" ". c #000000" "D c #808080" "E c #B9B860" "F c #0064FF" "G c #404040" "H c #5C5C30" "I c #00327F" "J c #408D61" "K c #5CA951" "L c #007FA1" "M c #7F40BF" "N c #9C5CAF" "O c #3F32FF" "P c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 3 */ "..............................." ".......D...............D......." ".......D...............D......." "........D.............D........" "........D.............D........" ".........DDDPPDDDPPDDD........." "............PPDDDPP............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DDDDDDDDD..........." "............DDDDDDD............" "..............DDD.............." "..............DDD.............." "...........DDDDDDDDD..........." "..........DDDDDDDDDDD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............DDDDDDD............" "...........DD.DDD.DD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD...GDDDG...DD........" ".............DDDDD............." ".............DDDDD............." ".............GDDDG............." "..............DDD.............." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................DD." "......D.....D.........D...DD..." "......DD....DD.......DD..D....." ".......DD....DD.....DD...D....." "........DD....DD...DD....D....." ".........DD...DD..DD....PP....." "...GDDG...DD..DD..DD...DPP....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "...GDDG...DD..DD..DD...DPP....." ".........DD...DD..DD....PP....." "........DD....DD...DD....D....." ".......DD....DD.....DD...D....." "......DD....DD.......DD..D....." "......D.....D.........D...DD..." "............................DD." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............DDD.............." ".............GDDDG............." ".............DDDDD............." ".............DDDDD............." "........DD...GDDDG...DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DD.DDD.DD..........." "............DDDDDDD............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DDDDDDDDDDD.........." "...........DDDDDDDDD..........." "..............DDD.............." "..............DDD.............." "............DDDDDDD............" "...........DDDDDDDDD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............PPDDDPP............" ".........DDDPPDDDPPDDD........." "........D.............D........" "........D.............D........" ".......D...............D......." ".......D...............D......." "..............................." /* icon for state 6 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".DD............................" "...DD...D.........D.....D......" ".....D..DD.......DD....DD......" ".....D...DD.....DD....DD......." ".....D....DD...DD....DD........" ".....PP....DD..DD...DD........." ".....PPD...DD..DD..DD...GDDG..." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....PPD...DD..DD..DD...GDDG..." ".....PP....DD..DD...DD........." ".....D....DD...DD....DD........" ".....D...DD.....DD....DD......." ".....D..DD.......DD....DD......" "...DD...D.........D.....D......" ".DD............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 7 */ "..............................." ".......E...............E......." ".......E...............E......." "........E.............E........" "........E.............E........" ".........EEEPPEEEPPEEE........." "............PPEEEPP............" ".............EEEEE............." "........EE....EEE....EE........" ".........EE...EEE...EE........." "..........EE..EEE..EE.........." "...........EEEEEEEEE..........." "............EEEEEEE............" "..............EEE.............." "..............EEE.............." "...........EEEEEEEEE..........." "..........EEEEEEEEEEE.........." ".........EE...EEE...EE........." "........EE....EEE....EE........" ".............EEEEE............." "............EEEEEEE............" "...........EE.EEE.EE..........." "..........EE..EEE..EE.........." ".........EE...EEE...EE........." "........EE...HEEEH...EE........" ".............EEEEE............." ".............EEEEE............." ".............HEEEH............." "..............EEE.............." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................EE." "......E.....E.........E...EE..." "......EE....EE.......EE..E....." ".......EE....EE.....EE...E....." "........EE....EE...EE....E....." ".........EE...EE..EE....PP....." "...HEEH...EE..EE..EE...EPP....." "..EEEEEEEEEEEEEEEEEEEEEEEE....." "..EEEEEEEEEEEEEEEEEEEEEEEE....." "..EEEEEEEEEEEEEEEEEEEEEEEE....." "...HEEH...EE..EE..EE...EPP....." ".........EE...EE..EE....PP....." "........EE....EE...EE....E....." ".......EE....EE.....EE...E....." "......EE....EE.......EE..E....." "......E.....E.........E...EE..." "............................EE." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 9 */ "..............................." "..............................." "..............EEE.............." ".............HEEEH............." ".............EEEEE............." ".............EEEEE............." "........EE...HEEEH...EE........" ".........EE...EEE...EE........." "..........EE..EEE..EE.........." "...........EE.EEE.EE..........." "............EEEEEEE............" ".............EEEEE............." "........EE....EEE....EE........" ".........EE...EEE...EE........." "..........EEEEEEEEEEE.........." "...........EEEEEEEEE..........." "..............EEE.............." "..............EEE.............." "............EEEEEEE............" "...........EEEEEEEEE..........." "..........EE..EEE..EE.........." ".........EE...EEE...EE........." "........EE....EEE....EE........" ".............EEEEE............." "............PPEEEPP............" ".........EEEPPEEEPPEEE........." "........E.............E........" "........E.............E........" ".......E...............E......." ".......E...............E......." "..............................." /* icon for state 10 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".EE............................" "...EE...E.........E.....E......" ".....E..EE.......EE....EE......" ".....E...EE.....EE....EE......." ".....E....EE...EE....EE........" ".....PP....EE..EE...EE........." ".....PPE...EE..EE..EE...HEEH..." ".....EEEEEEEEEEEEEEEEEEEEEEEE.." ".....EEEEEEEEEEEEEEEEEEEEEEEE.." ".....EEEEEEEEEEEEEEEEEEEEEEEE.." ".....PPE...EE..EE..EE...HEEH..." ".....PP....EE..EE...EE........." ".....E....EE...EE....EE........" ".....E...EE.....EE....EE......." ".....E..EE.......EE....EE......" "...EE...E.........E.....E......" ".EE............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 11 */ "..............................." ".......F...............F......." ".......F...............F......." "........F.............F........" "........F.............F........" ".........FFFPPFFFPPFFF........." "............PPFFFPP............" ".............FFFFF............." "........FF....FFF....FF........" ".........FF...FFF...FF........." "..........FF..FFF..FF.........." "...........FFFFFFFFF..........." "............FFFFFFF............" "..............FFF.............." "..............FFF.............." "...........FFFFFFFFF..........." "..........FFFFFFFFFFF.........." ".........FF...FFF...FF........." "........FF....FFF....FF........" ".............FFFFF............." "............FFFFFFF............" "...........FF.FFF.FF..........." "..........FF..FFF..FF.........." ".........FF...FFF...FF........." "........FF...IFFFI...FF........" ".............FFFFF............." ".............FFFFF............." ".............IFFFI............." "..............FFF.............." "..............................." "..............................." /* icon for state 12 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................FF." "......F.....F.........F...FF..." "......FF....FF.......FF..F....." ".......FF....FF.....FF...F....." "........FF....FF...FF....F....." ".........FF...FF..FF....PP....." "...IFFI...FF..FF..FF...FPP....." "..FFFFFFFFFFFFFFFFFFFFFFFF....." "..FFFFFFFFFFFFFFFFFFFFFFFF....." "..FFFFFFFFFFFFFFFFFFFFFFFF....." "...IFFI...FF..FF..FF...FPP....." ".........FF...FF..FF....PP....." "........FF....FF...FF....F....." ".......FF....FF.....FF...F....." "......FF....FF.......FF..F....." "......F.....F.........F...FF..." "............................FF." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 13 */ "..............................." "..............................." "..............FFF.............." ".............IFFFI............." ".............FFFFF............." ".............FFFFF............." "........FF...IFFFI...FF........" ".........FF...FFF...FF........." "..........FF..FFF..FF.........." "...........FF.FFF.FF..........." "............FFFFFFF............" ".............FFFFF............." "........FF....FFF....FF........" ".........FF...FFF...FF........." "..........FFFFFFFFFFF.........." "...........FFFFFFFFF..........." "..............FFF.............." "..............FFF.............." "............FFFFFFF............" "...........FFFFFFFFF..........." "..........FF..FFF..FF.........." ".........FF...FFF...FF........." "........FF....FFF....FF........" ".............FFFFF............." "............PPFFFPP............" ".........FFFPPFFFPPFFF........." "........F.............F........" "........F.............F........" ".......F...............F......." ".......F...............F......." "..............................." /* icon for state 14 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".FF............................" "...FF...F.........F.....F......" ".....F..FF.......FF....FF......" ".....F...FF.....FF....FF......." ".....F....FF...FF....FF........" ".....PP....FF..FF...FF........." ".....PPF...FF..FF..FF...IFFI..." ".....FFFFFFFFFFFFFFFFFFFFFFFF.." ".....FFFFFFFFFFFFFFFFFFFFFFFF.." ".....FFFFFFFFFFFFFFFFFFFFFFFF.." ".....PPF...FF..FF..FF...IFFI..." ".....PP....FF..FF...FF........." ".....F....FF...FF....FF........" ".....F...FF.....FF....FF......." ".....F..FF.......FF....FF......" "...FF...F.........F.....F......" ".FF............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 15 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAAADDDPPDDDPPDDDAAAAAAAAA" "AAAAAAAAAAAAPPDDDPPAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAJDDDJAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAAJDDDJAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAAAADDAAADDAADDAAAAPPAAAAA" "AAAJDDJAAADDAADDAADDAAADPPAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AAAJDDJAAADDAADDAADDAAADPPAAAAA" "AAAAAAAAADDAAADDAADDAAAAPPAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAJDDDJAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAJDDDJAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAPPDDDPPAAAAAAAAAAAA" "AAAAAAAAADDDPPDDDPPDDDAAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 18 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAAPPAAAADDAADDAAADDAAAAAAAAA" "AAAAAPPDAAADDAADDAADDAAAJDDJAAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAAPPDAAADDAADDAADDAAAJDDJAAA" "AAAAAPPAAAADDAADDAAADDAAAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 19 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAEAAAAAAAAAAAAAAAEAAAAAAA" "AAAAAAAEAAAAAAAAAAAAAAAEAAAAAAA" "AAAAAAAAEAAAAAAAAAAAAAEAAAAAAAA" "AAAAAAAAEAAAAAAAAAAAAAEAAAAAAAA" "AAAAAAAAAEEEPPEEEPPEEEAAAAAAAAA" "AAAAAAAAAAAAPPEEEPPAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAEEAAAAEEEAAAAEEAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAAAEEAAEEEAAEEAAAAAAAAAA" "AAAAAAAAAAAEEEEEEEEEAAAAAAAAAAA" "AAAAAAAAAAAAEEEEEEEAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAEEEEEEEEEAAAAAAAAAAA" "AAAAAAAAAAEEEEEEEEEEEAAAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAEEAAAAEEEAAAAEEAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAEEEEEEEAAAAAAAAAAAA" "AAAAAAAAAAAEEAEEEAEEAAAAAAAAAAA" "AAAAAAAAAAEEAAEEEAAEEAAAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAEEAAAKEEEKAAAEEAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAAKEEEKAAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 20 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAEEA" "AAAAAAEAAAAAEAAAAAAAAAEAAAEEAAA" "AAAAAAEEAAAAEEAAAAAAAEEAAEAAAAA" "AAAAAAAEEAAAAEEAAAAAEEAAAEAAAAA" "AAAAAAAAEEAAAAEEAAAEEAAAAEAAAAA" "AAAAAAAAAEEAAAEEAAEEAAAAPPAAAAA" "AAAKEEKAAAEEAAEEAAEEAAAEPPAAAAA" "AAEEEEEEEEEEEEEEEEEEEEEEEEAAAAA" "AAEEEEEEEEEEEEEEEEEEEEEEEEAAAAA" "AAEEEEEEEEEEEEEEEEEEEEEEEEAAAAA" "AAAKEEKAAAEEAAEEAAEEAAAEPPAAAAA" "AAAAAAAAAEEAAAEEAAEEAAAAPPAAAAA" "AAAAAAAAEEAAAAEEAAAEEAAAAEAAAAA" "AAAAAAAEEAAAAEEAAAAAEEAAAEAAAAA" "AAAAAAEEAAAAEEAAAAAAAEEAAEAAAAA" "AAAAAAEAAAAAEAAAAAAAAAEAAAEEAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAEEA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 21 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAAKEEEKAAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAEEAAAKEEEKAAAEEAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAAAEEAAEEEAAEEAAAAAAAAAA" "AAAAAAAAAAAEEAEEEAEEAAAAAAAAAAA" "AAAAAAAAAAAAEEEEEEEAAAAAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAEEAAAAEEEAAAAEEAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAAAEEEEEEEEEEEAAAAAAAAAA" "AAAAAAAAAAAEEEEEEEEEAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAEEEAAAAAAAAAAAAAA" "AAAAAAAAAAAAEEEEEEEAAAAAAAAAAAA" "AAAAAAAAAAAEEEEEEEEEAAAAAAAAAAA" "AAAAAAAAAAEEAAEEEAAEEAAAAAAAAAA" "AAAAAAAAAEEAAAEEEAAAEEAAAAAAAAA" "AAAAAAAAEEAAAAEEEAAAAEEAAAAAAAA" "AAAAAAAAAAAAAEEEEEAAAAAAAAAAAAA" "AAAAAAAAAAAAPPEEEPPAAAAAAAAAAAA" "AAAAAAAAAEEEPPEEEPPEEEAAAAAAAAA" "AAAAAAAAEAAAAAAAAAAAAAEAAAAAAAA" "AAAAAAAAEAAAAAAAAAAAAAEAAAAAAAA" "AAAAAAAEAAAAAAAAAAAAAAAEAAAAAAA" "AAAAAAAEAAAAAAAAAAAAAAAEAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 22 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AEEAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAEEAAAEAAAAAAAAAEAAAAAEAAAAAA" "AAAAAEAAEEAAAAAAAEEAAAAEEAAAAAA" "AAAAAEAAAEEAAAAAEEAAAAEEAAAAAAA" "AAAAAEAAAAEEAAAEEAAAAEEAAAAAAAA" "AAAAAPPAAAAEEAAEEAAAEEAAAAAAAAA" "AAAAAPPEAAAEEAAEEAAEEAAAKEEKAAA" "AAAAAEEEEEEEEEEEEEEEEEEEEEEEEAA" "AAAAAEEEEEEEEEEEEEEEEEEEEEEEEAA" "AAAAAEEEEEEEEEEEEEEEEEEEEEEEEAA" "AAAAAPPEAAAEEAAEEAAEEAAAKEEKAAA" "AAAAAPPAAAAEEAAEEAAAEEAAAAAAAAA" "AAAAAEAAAAEEAAAEEAAAAEEAAAAAAAA" "AAAAAEAAAEEAAAAAEEAAAAEEAAAAAAA" "AAAAAEAAEEAAAAAAAEEAAAAEEAAAAAA" "AAAEEAAAEAAAAAAAAAEAAAAAEAAAAAA" "AEEAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 23 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAFAAAAAAAAAAAAAAAFAAAAAAA" "AAAAAAAFAAAAAAAAAAAAAAAFAAAAAAA" "AAAAAAAAFAAAAAAAAAAAAAFAAAAAAAA" "AAAAAAAAFAAAAAAAAAAAAAFAAAAAAAA" "AAAAAAAAAFFFPPFFFPPFFFAAAAAAAAA" "AAAAAAAAAAAAPPFFFPPAAAAAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAFFAAAAFFFAAAAFFAAAAAAAA" "AAAAAAAAAFFAAAFFFAAAFFAAAAAAAAA" "AAAAAAAAAAFFAAFFFAAFFAAAAAAAAAA" "AAAAAAAAAAAFFFFFFFFFAAAAAAAAAAA" "AAAAAAAAAAAAFFFFFFFAAAAAAAAAAAA" "AAAAAAAAAAAAAAFFFAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAFFFAAAAAAAAAAAAAA" "AAAAAAAAAAAFFFFFFFFFAAAAAAAAAAA" "AAAAAAAAAAFFFFFFFFFFFAAAAAAAAAA" "AAAAAAAAAFFAAAFFFAAAFFAAAAAAAAA" "AAAAAAAAFFAAAAFFFAAAAFFAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAAAAAFFFFFFFAAAAAAAAAAAA" "AAAAAAAAAAAFFAFFFAFFAAAAAAAAAAA" "AAAAAAAAAAFFAAFFFAAFFAAAAAAAAAA" "AAAAAAAAAFFAAAFFFAAAFFAAAAAAAAA" "AAAAAAAAFFAAALFFFLAAAFFAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAAAAAALFFFLAAAAAAAAAAAAA" "AAAAAAAAAAAAAAFFFAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 24 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAFFA" "AAAAAAFAAAAAFAAAAAAAAAFAAAFFAAA" "AAAAAAFFAAAAFFAAAAAAAFFAAFAAAAA" "AAAAAAAFFAAAAFFAAAAAFFAAAFAAAAA" "AAAAAAAAFFAAAAFFAAAFFAAAAFAAAAA" "AAAAAAAAAFFAAAFFAAFFAAAAPPAAAAA" "AAALFFLAAAFFAAFFAAFFAAAFPPAAAAA" "AAFFFFFFFFFFFFFFFFFFFFFFFFAAAAA" "AAFFFFFFFFFFFFFFFFFFFFFFFFAAAAA" "AAFFFFFFFFFFFFFFFFFFFFFFFFAAAAA" "AAALFFLAAAFFAAFFAAFFAAAFPPAAAAA" "AAAAAAAAAFFAAAFFAAFFAAAAPPAAAAA" "AAAAAAAAFFAAAAFFAAAFFAAAAFAAAAA" "AAAAAAAFFAAAAFFAAAAAFFAAAFAAAAA" "AAAAAAFFAAAAFFAAAAAAAFFAAFAAAAA" "AAAAAAFAAAAAFAAAAAAAAAFAAAFFAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAFFA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 25 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAFFFAAAAAAAAAAAAAA" "AAAAAAAAAAAAALFFFLAAAAAAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAFFAAALFFFLAAAFFAAAAAAAA" "AAAAAAAAAFFAAAFFFAAAFFAAAAAAAAA" "AAAAAAAAAAFFAAFFFAAFFAAAAAAAAAA" "AAAAAAAAAAAFFAFFFAFFAAAAAAAAAAA" "AAAAAAAAAAAAFFFFFFFAAAAAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAFFAAAAFFFAAAAFFAAAAAAAA" "AAAAAAAAAFFAAAFFFAAAFFAAAAAAAAA" "AAAAAAAAAAFFFFFFFFFFFAAAAAAAAAA" "AAAAAAAAAAAFFFFFFFFFAAAAAAAAAAA" "AAAAAAAAAAAAAAFFFAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAFFFAAAAAAAAAAAAAA" "AAAAAAAAAAAAFFFFFFFAAAAAAAAAAAA" "AAAAAAAAAAAFFFFFFFFFAAAAAAAAAAA" "AAAAAAAAAAFFAAFFFAAFFAAAAAAAAAA" "AAAAAAAAAFFAAAFFFAAAFFAAAAAAAAA" "AAAAAAAAFFAAAAFFFAAAAFFAAAAAAAA" "AAAAAAAAAAAAAFFFFFAAAAAAAAAAAAA" "AAAAAAAAAAAAPPFFFPPAAAAAAAAAAAA" "AAAAAAAAAFFFPPFFFPPFFFAAAAAAAAA" "AAAAAAAAFAAAAAAAAAAAAAFAAAAAAAA" "AAAAAAAAFAAAAAAAAAAAAAFAAAAAAAA" "AAAAAAAFAAAAAAAAAAAAAAAFAAAAAAA" "AAAAAAAFAAAAAAAAAAAAAAAFAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 26 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AFFAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAFFAAAFAAAAAAAAAFAAAAAFAAAAAA" "AAAAAFAAFFAAAAAAAFFAAAAFFAAAAAA" "AAAAAFAAAFFAAAAAFFAAAAFFAAAAAAA" "AAAAAFAAAAFFAAAFFAAAAFFAAAAAAAA" "AAAAAPPAAAAFFAAFFAAAFFAAAAAAAAA" "AAAAAPPFAAAFFAAFFAAFFAAALFFLAAA" "AAAAAFFFFFFFFFFFFFFFFFFFFFFFFAA" "AAAAAFFFFFFFFFFFFFFFFFFFFFFFFAA" "AAAAAFFFFFFFFFFFFFFFFFFFFFFFFAA" "AAAAAPPFAAAFFAAFFAAFFAAALFFLAAA" "AAAAAPPAAAAFFAAFFAAAFFAAAAAAAAA" "AAAAAFAAAAFFAAAFFAAAAFFAAAAAAAA" "AAAAAFAAAFFAAAAAFFAAAAFFAAAAAAA" "AAAAAFAAFFAAAAAAAFFAAAAFFAAAAAA" "AAAFFAAAFAAAAAAAAAFAAAAAFAAAAAA" "AFFAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 27 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBDBBBBBBBBBBBBBBBDBBBBBBB" "BBBBBBBDBBBBBBBBBBBBBBBDBBBBBBB" "BBBBBBBBDBBBBBBBBBBBBBDBBBBBBBB" "BBBBBBBBDBBBBBBBBBBBBBDBBBBBBBB" "BBBBBBBBBDDDPPDDDPPDDDBBBBBBBBB" "BBBBBBBBBBBBPPDDDPPBBBBBBBBBBBB" "BBBBBBBBBBBBBDDDDDBBBBBBBBBBBBB" "BBBBBBBBDDBBBBDDDBBBBDDBBBBBBBB" "BBBBBBBBBDDBBBDDDBBBDDBBBBBBBBB" "BBBBBBBBBBDDBBDDDBBDDBBBBBBBBBB" "BBBBBBBBBBBDDDDDDDDDBBBBBBBBBBB" "BBBBBBBBBBBBDDDDDDDBBBBBBBBBBBB" "BBBBBBBBBBBBBBDDDBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBDDDBBBBBBBBBBBBBB" "BBBBBBBBBBBDDDDDDDDDBBBBBBBBBBB" "BBBBBBBBBBDDDDDDDDDDDBBBBBBBBBB" "BBBBBBBBBDDBBBDDDBBBDDBBBBBBBBB" "BBBBBBBBDDBBBBDDDBBBBDDBBBBBBBB" "BBBBBBBBBBBBBDDDDDBBBBBBBBBBBBB" "BBBBBBBBBBBBDDDDDDDBBBBBBBBBBBB" "BBBBBBBBBBBDDBDDDBDDBBBBBBBBBBB" "BBBBBBBBBBDDBBDDDBBDDBBBBBBBBBB" "BBBBBBBBBDDBBBDDDBBBDDBBBBBBBBB" "BBBBBBBBDDBBBMDDDMBBBDDBBBBBBBB" "BBBBBBBBBBBBBDDDDDBBBBBBBBBBBBB" "BBBBBBBBBBBBBDDDDDBBBBBBBBBBBBB" "BBBBBBBBBBBBBMDDDMBBBBBBBBBBBBB" "BBBBBBBBBBBBBBDDDBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 28 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBDDB" "BBBBBBDBBBBBDBBBBBBBBBDBBBDDBBB" "BBBBBBDDBBBBDDBBBBBBBDDBBDBBBBB" "BBBBBBBDDBBBBDDBBBBBDDBBBDBBBBB" "BBBBBBBBDDBBBBDDBBBDDBBBBDBBBBB" "BBBBBBBBBDDBBBDDBBDDBBBBPPBBBBB" "BBBMDDMBBBDDBBDDBBDDBBBDPPBBBBB" "BBDDDDDDDDDDDDDDDDDDDDDDDDBBBBB" "BBDDDDDDDDDDDDDDDDDDDDDDDDBBBBB" "BBDDDDDDDDDDDDDDDDDDDDDDDDBBBBB" "BBBMDDMBBBDDBBDDBBDDBBBDPPBBBBB" "BBBBBBBBBDDBBBDDBBDDBBBBPPBBBBB" "BBBBBBBBDDBBBBDDBBBDDBBBBDBBBBB" "BBBBBBBDDBBBBDDBBBBBDDBBBDBBBBB" "BBBBBBDDBBBBDDBBBBBBBDDBBDBBBBB" "BBBBBBDBBBBBDBBBBBBBBBDBBBDDBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBDDB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 29 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBDDDBBBBBBBBBBBBBB" "BBBBBBBBBBBBBMDDDMBBBBBBBBBBBBB" "BBBBBBBBBBBBBDDDDDBBBBBBBBBBBBB" "BBBBBBBBBBBBBDDDDDBBBBBBBBBBBBB" "BBBBBBBBDDBBBMDDDMBBBDDBBBBBBBB" "BBBBBBBBBDDBBBDDDBBBDDBBBBBBBBB" "BBBBBBBBBBDDBBDDDBBDDBBBBBBBBBB" "BBBBBBBBBBBDDBDDDBDDBBBBBBBBBBB" "BBBBBBBBBBBBDDDDDDDBBBBBBBBBBBB" "BBBBBBBBBBBBBDDDDDBBBBBBBBBBBBB" "BBBBBBBBDDBBBBDDDBBBBDDBBBBBBBB" "BBBBBBBBBDDBBBDDDBBBDDBBBBBBBBB" "BBBBBBBBBBDDDDDDDDDDDBBBBBBBBBB" "BBBBBBBBBBBDDDDDDDDDBBBBBBBBBBB" "BBBBBBBBBBBBBBDDDBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBDDDBBBBBBBBBBBBBB" "BBBBBBBBBBBBDDDDDDDBBBBBBBBBBBB" "BBBBBBBBBBBDDDDDDDDDBBBBBBBBBBB" "BBBBBBBBBBDDBBDDDBBDDBBBBBBBBBB" "BBBBBBBBBDDBBBDDDBBBDDBBBBBBBBB" "BBBBBBBBDDBBBBDDDBBBBDDBBBBBBBB" "BBBBBBBBBBBBBDDDDDBBBBBBBBBBBBB" "BBBBBBBBBBBBPPDDDPPBBBBBBBBBBBB" "BBBBBBBBBDDDPPDDDPPDDDBBBBBBBBB" "BBBBBBBBDBBBBBBBBBBBBBDBBBBBBBB" "BBBBBBBBDBBBBBBBBBBBBBDBBBBBBBB" "BBBBBBBDBBBBBBBBBBBBBBBDBBBBBBB" "BBBBBBBDBBBBBBBBBBBBBBBDBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 30 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BDDBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBDDBBBDBBBBBBBBBDBBBBBDBBBBBB" "BBBBBDBBDDBBBBBBBDDBBBBDDBBBBBB" "BBBBBDBBBDDBBBBBDDBBBBDDBBBBBBB" "BBBBBDBBBBDDBBBDDBBBBDDBBBBBBBB" "BBBBBPPBBBBDDBBDDBBBDDBBBBBBBBB" "BBBBBPPDBBBDDBBDDBBDDBBBMDDMBBB" "BBBBBDDDDDDDDDDDDDDDDDDDDDDDDBB" "BBBBBDDDDDDDDDDDDDDDDDDDDDDDDBB" "BBBBBDDDDDDDDDDDDDDDDDDDDDDDDBB" "BBBBBPPDBBBDDBBDDBBDDBBBMDDMBBB" "BBBBBPPBBBBDDBBDDBBBDDBBBBBBBBB" "BBBBBDBBBBDDBBBDDBBBBDDBBBBBBBB" "BBBBBDBBBDDBBBBBDDBBBBDDBBBBBBB" "BBBBBDBBDDBBBBBBBDDBBBBDDBBBBBB" "BBBDDBBBDBBBBBBBBBDBBBBBDBBBBBB" "BDDBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 31 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBEBBBBBBBBBBBBBBBEBBBBBBB" "BBBBBBBEBBBBBBBBBBBBBBBEBBBBBBB" "BBBBBBBBEBBBBBBBBBBBBBEBBBBBBBB" "BBBBBBBBEBBBBBBBBBBBBBEBBBBBBBB" "BBBBBBBBBEEEPPEEEPPEEEBBBBBBBBB" "BBBBBBBBBBBBPPEEEPPBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBEEBBBBEEEBBBBEEBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBBBEEBBEEEBBEEBBBBBBBBBB" "BBBBBBBBBBBEEEEEEEEEBBBBBBBBBBB" "BBBBBBBBBBBBEEEEEEEBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBEEEEEEEEEBBBBBBBBBBB" "BBBBBBBBBBEEEEEEEEEEEBBBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBEEBBBBEEEBBBBEEBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBEEEEEEEBBBBBBBBBBBB" "BBBBBBBBBBBEEBEEEBEEBBBBBBBBBBB" "BBBBBBBBBBEEBBEEEBBEEBBBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBEEBBBNEEENBBBEEBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBBNEEENBBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 32 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBEEB" "BBBBBBEBBBBBEBBBBBBBBBEBBBEEBBB" "BBBBBBEEBBBBEEBBBBBBBEEBBEBBBBB" "BBBBBBBEEBBBBEEBBBBBEEBBBEBBBBB" "BBBBBBBBEEBBBBEEBBBEEBBBBEBBBBB" "BBBBBBBBBEEBBBEEBBEEBBBBPPBBBBB" "BBBNEENBBBEEBBEEBBEEBBBEPPBBBBB" "BBEEEEEEEEEEEEEEEEEEEEEEEEBBBBB" "BBEEEEEEEEEEEEEEEEEEEEEEEEBBBBB" "BBEEEEEEEEEEEEEEEEEEEEEEEEBBBBB" "BBBNEENBBBEEBBEEBBEEBBBEPPBBBBB" "BBBBBBBBBEEBBBEEBBEEBBBBPPBBBBB" "BBBBBBBBEEBBBBEEBBBEEBBBBEBBBBB" "BBBBBBBEEBBBBEEBBBBBEEBBBEBBBBB" "BBBBBBEEBBBBEEBBBBBBBEEBBEBBBBB" "BBBBBBEBBBBBEBBBBBBBBBEBBBEEBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBEEB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 33 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBBNEEENBBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBEEBBBNEEENBBBEEBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBBBEEBBEEEBBEEBBBBBBBBBB" "BBBBBBBBBBBEEBEEEBEEBBBBBBBBBBB" "BBBBBBBBBBBBEEEEEEEBBBBBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBEEBBBBEEEBBBBEEBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBBBEEEEEEEEEEEBBBBBBBBBB" "BBBBBBBBBBBEEEEEEEEEBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBEEEBBBBBBBBBBBBBB" "BBBBBBBBBBBBEEEEEEEBBBBBBBBBBBB" "BBBBBBBBBBBEEEEEEEEEBBBBBBBBBBB" "BBBBBBBBBBEEBBEEEBBEEBBBBBBBBBB" "BBBBBBBBBEEBBBEEEBBBEEBBBBBBBBB" "BBBBBBBBEEBBBBEEEBBBBEEBBBBBBBB" "BBBBBBBBBBBBBEEEEEBBBBBBBBBBBBB" "BBBBBBBBBBBBPPEEEPPBBBBBBBBBBBB" "BBBBBBBBBEEEPPEEEPPEEEBBBBBBBBB" "BBBBBBBBEBBBBBBBBBBBBBEBBBBBBBB" "BBBBBBBBEBBBBBBBBBBBBBEBBBBBBBB" "BBBBBBBEBBBBBBBBBBBBBBBEBBBBBBB" "BBBBBBBEBBBBBBBBBBBBBBBEBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 34 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BEEBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBEEBBBEBBBBBBBBBEBBBBBEBBBBBB" "BBBBBEBBEEBBBBBBBEEBBBBEEBBBBBB" "BBBBBEBBBEEBBBBBEEBBBBEEBBBBBBB" "BBBBBEBBBBEEBBBEEBBBBEEBBBBBBBB" "BBBBBPPBBBBEEBBEEBBBEEBBBBBBBBB" "BBBBBPPEBBBEEBBEEBBEEBBBNEENBBB" "BBBBBEEEEEEEEEEEEEEEEEEEEEEEEBB" "BBBBBEEEEEEEEEEEEEEEEEEEEEEEEBB" "BBBBBEEEEEEEEEEEEEEEEEEEEEEEEBB" "BBBBBPPEBBBEEBBEEBBEEBBBNEENBBB" "BBBBBPPBBBBEEBBEEBBBEEBBBBBBBBB" "BBBBBEBBBBEEBBBEEBBBBEEBBBBBBBB" "BBBBBEBBBEEBBBBBEEBBBBEEBBBBBBB" "BBBBBEBBEEBBBBBBBEEBBBBEEBBBBBB" "BBBEEBBBEBBBBBBBBBEBBBBBEBBBBBB" "BEEBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 35 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBFBBBBBBBBBBBBBBBFBBBBBBB" "BBBBBBBFBBBBBBBBBBBBBBBFBBBBBBB" "BBBBBBBBFBBBBBBBBBBBBBFBBBBBBBB" "BBBBBBBBFBBBBBBBBBBBBBFBBBBBBBB" "BBBBBBBBBFFFPPFFFPPFFFBBBBBBBBB" "BBBBBBBBBBBBPPFFFPPBBBBBBBBBBBB" "BBBBBBBBBBBBBFFFFFBBBBBBBBBBBBB" "BBBBBBBBFFBBBBFFFBBBBFFBBBBBBBB" "BBBBBBBBBFFBBBFFFBBBFFBBBBBBBBB" "BBBBBBBBBBFFBBFFFBBFFBBBBBBBBBB" "BBBBBBBBBBBFFFFFFFFFBBBBBBBBBBB" "BBBBBBBBBBBBFFFFFFFBBBBBBBBBBBB" "BBBBBBBBBBBBBBFFFBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBFFFBBBBBBBBBBBBBB" "BBBBBBBBBBBFFFFFFFFFBBBBBBBBBBB" "BBBBBBBBBBFFFFFFFFFFFBBBBBBBBBB" "BBBBBBBBBFFBBBFFFBBBFFBBBBBBBBB" "BBBBBBBBFFBBBBFFFBBBBFFBBBBBBBB" "BBBBBBBBBBBBBFFFFFBBBBBBBBBBBBB" "BBBBBBBBBBBBFFFFFFFBBBBBBBBBBBB" "BBBBBBBBBBBFFBFFFBFFBBBBBBBBBBB" "BBBBBBBBBBFFBBFFFBBFFBBBBBBBBBB" "BBBBBBBBBFFBBBFFFBBBFFBBBBBBBBB" "BBBBBBBBFFBBBOFFFOBBBFFBBBBBBBB" "BBBBBBBBBBBBBFFFFFBBBBBBBBBBBBB" "BBBBBBBBBBBBBFFFFFBBBBBBBBBBBBB" "BBBBBBBBBBBBBOFFFOBBBBBBBBBBBBB" "BBBBBBBBBBBBBBFFFBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 36 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBFFB" "BBBBBBFBBBBBFBBBBBBBBBFBBBFFBBB" "BBBBBBFFBBBBFFBBBBBBBFFBBFBBBBB" "BBBBBBBFFBBBBFFBBBBBFFBBBFBBBBB" "BBBBBBBBFFBBBBFFBBBFFBBBBFBBBBB" "BBBBBBBBBFFBBBFFBBFFBBBBPPBBBBB" "BBBOFFOBBBFFBBFFBBFFBBBFPPBBBBB" "BBFFFFFFFFFFFFFFFFFFFFFFFFBBBBB" "BBFFFFFFFFFFFFFFFFFFFFFFFFBBBBB" "BBFFFFFFFFFFFFFFFFFFFFFFFFBBBBB" "BBBOFFOBBBFFBBFFBBFFBBBFPPBBBBB" "BBBBBBBBBFFBBBFFBBFFBBBBPPBBBBB" "BBBBBBBBFFBBBBFFBBBFFBBBBFBBBBB" "BBBBBBBFFBBBBFFBBBBBFFBBBFBBBBB" "BBBBBBFFBBBBFFBBBBBBBFFBBFBBBBB" "BBBBBBFBBBBBFBBBBBBBBBFBBBFFBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBFFB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 37 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBFFFBBBBBBBBBBBBBB" "BBBBBBBBBBBBBOFFFOBBBBBBBBBBBBB" "BBBBBBBBBBBBBFFFFFBBBBBBBBBBBBB" "BBBBBBBBBBBBBFFFFFBBBBBBBBBBBBB" "BBBBBBBBFFBBBOFFFOBBBFFBBBBBBBB" "BBBBBBBBBFFBBBFFFBBBFFBBBBBBBBB" "BBBBBBBBBBFFBBFFFBBFFBBBBBBBBBB" "BBBBBBBBBBBFFBFFFBFFBBBBBBBBBBB" "BBBBBBBBBBBBFFFFFFFBBBBBBBBBBBB" "BBBBBBBBBBBBBFFFFFBBBBBBBBBBBBB" "BBBBBBBBFFBBBBFFFBBBBFFBBBBBBBB" "BBBBBBBBBFFBBBFFFBBBFFBBBBBBBBB" "BBBBBBBBBBFFFFFFFFFFFBBBBBBBBBB" "BBBBBBBBBBBFFFFFFFFFBBBBBBBBBBB" "BBBBBBBBBBBBBBFFFBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBFFFBBBBBBBBBBBBBB" "BBBBBBBBBBBBFFFFFFFBBBBBBBBBBBB" "BBBBBBBBBBBFFFFFFFFFBBBBBBBBBBB" "BBBBBBBBBBFFBBFFFBBFFBBBBBBBBBB" "BBBBBBBBBFFBBBFFFBBBFFBBBBBBBBB" "BBBBBBBBFFBBBBFFFBBBBFFBBBBBBBB" "BBBBBBBBBBBBBFFFFFBBBBBBBBBBBBB" "BBBBBBBBBBBBPPFFFPPBBBBBBBBBBBB" "BBBBBBBBBFFFPPFFFPPFFFBBBBBBBBB" "BBBBBBBBFBBBBBBBBBBBBBFBBBBBBBB" "BBBBBBBBFBBBBBBBBBBBBBFBBBBBBBB" "BBBBBBBFBBBBBBBBBBBBBBBFBBBBBBB" "BBBBBBBFBBBBBBBBBBBBBBBFBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* icon for state 38 */ "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BFFBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBFFBBBFBBBBBBBBBFBBBBBFBBBBBB" "BBBBBFBBFFBBBBBBBFFBBBBFFBBBBBB" "BBBBBFBBBFFBBBBBFFBBBBFFBBBBBBB" "BBBBBFBBBBFFBBBFFBBBBFFBBBBBBBB" "BBBBBPPBBBBFFBBFFBBBFFBBBBBBBBB" "BBBBBPPFBBBFFBBFFBBFFBBBOFFOBBB" "BBBBBFFFFFFFFFFFFFFFFFFFFFFFFBB" "BBBBBFFFFFFFFFFFFFFFFFFFFFFFFBB" "BBBBBFFFFFFFFFFFFFFFFFFFFFFFFBB" "BBBBBPPFBBBFFBBFFBBFFBBBOFFOBBB" "BBBBBPPBBBBFFBBFFBBBFFBBBBBBBBB" "BBBBBFBBBBFFBBBFFBBBBFFBBBBBBBB" "BBBBBFBBBFFBBBBBFFBBBBFFBBBBBBB" "BBBBBFBBFFBBBBBBBFFBBBBFFBBBBBB" "BBBFFBBBFBBBBBBBBBFBBBBBFBBBBBB" "BFFBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" XPM /* width height num_colors chars_per_pixel */ "15 570 16 1" /* colors */ "A c #009B43" "B c #7F00FF" ". c #000000" "D c #808080" "E c #B9B860" "F c #0064FF" "G c #404040" "H c #5C5C30" "I c #00327F" "J c #408D61" "K c #5CA951" "L c #007FA1" "M c #7F40BF" "N c #9C5CAF" "O c #3F32FF" "P c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 3 */ "....D.....D...." ".....D...D....." "......PDP......" "...D..DDD..D..." "....D..D..D...." ".....DDDDD....." ".......D......." "....DDDDDDD...." "...D...D...D..." ".....DDDDD....." "....D..D..D...." "...D..GDG..D..." "......DDD......" "......GDG......" "..............." /* icon for state 4 */ "..............." "..............." "..............." "...D..D....D..." "....D..D..D...D" ".....D.D.D...D." ".GDG.D.D.D.DP.." ".DDDDDDDDDDDD.." ".GDG.D.D.D.DP.." ".....D.D.D...D." "....D..D..D...D" "...D..D....D..." "..............." "..............." "..............." /* icon for state 5 */ "..............." "......GDG......" "......DDD......" "...D..GDG..D..." "....D..D..D...." ".....DDDDD....." "...D...D...D..." "....DDDDDDD...." ".......D......." ".....DDDDD....." "....D..D..D...." "...D..DDD..D..." "......PDP......" ".....D...D....." "....D.....D...." /* icon for state 6 */ "..............." "..............." "..............." "...D....D..D..." "D...D..D..D...." ".D...D.D.D....." "..PD.D.D.D.GDG." "..DDDDDDDDDDDD." "..PD.D.D.D.GDG." ".D...D.D.D....." "D...D..D..D...." "...D....D..D..." "..............." "..............." "..............." /* icon for state 7 */ "....E.....E...." ".....E...E....." "......PEP......" "...E..EEE..E..." "....E..E..E...." ".....EEEEE....." ".......E......." "....EEEEEEE...." "...E...E...E..." ".....EEEEE....." "....E..E..E...." "...E..HEH..E..." "......EEE......" "......HEH......" "..............." /* icon for state 8 */ "..............." "..............." "..............." "...E..E....E..." "....E..E..E...E" ".....E.E.E...E." ".HEH.E.E.E.EP.." ".EEEEEEEEEEEE.." ".HEH.E.E.E.EP.." ".....E.E.E...E." "....E..E..E...E" "...E..E....E..." "..............." "..............." "..............." /* icon for state 9 */ "..............." "......HEH......" "......EEE......" "...E..HEH..E..." "....E..E..E...." ".....EEEEE....." "...E...E...E..." "....EEEEEEE...." ".......E......." ".....EEEEE....." "....E..E..E...." "...E..EEE..E..." "......PEP......" ".....E...E....." "....E.....E...." /* icon for state 10 */ "..............." "..............." "..............." "...E....E..E..." "E...E..E..E...." ".E...E.E.E....." "..PE.E.E.E.HEH." "..EEEEEEEEEEEE." "..PE.E.E.E.HEH." ".E...E.E.E....." "E...E..E..E...." "...E....E..E..." "..............." "..............." "..............." /* icon for state 11 */ "....F.....F...." ".....F...F....." "......PFP......" "...F..FFF..F..." "....F..F..F...." ".....FFFFF....." ".......F......." "....FFFFFFF...." "...F...F...F..." ".....FFFFF....." "....F..F..F...." "...F..IFI..F..." "......FFF......" "......IFI......" "..............." /* icon for state 12 */ "..............." "..............." "..............." "...F..F....F..." "....F..F..F...F" ".....F.F.F...F." ".IFI.F.F.F.FP.." ".FFFFFFFFFFFF.." ".IFI.F.F.F.FP.." ".....F.F.F...F." "....F..F..F...F" "...F..F....F..." "..............." "..............." "..............." /* icon for state 13 */ "..............." "......IFI......" "......FFF......" "...F..IFI..F..." "....F..F..F...." ".....FFFFF....." "...F...F...F..." "....FFFFFFF...." ".......F......." ".....FFFFF....." "....F..F..F...." "...F..FFF..F..." "......PFP......" ".....F...F....." "....F.....F...." /* icon for state 14 */ "..............." "..............." "..............." "...F....F..F..." "F...F..F..F...." ".F...F.F.F....." "..PF.F.F.F.IFI." "..FFFFFFFFFFFF." "..PF.F.F.F.IFI." ".F...F.F.F....." "F...F..F..F...." "...F....F..F..." "..............." "..............." "..............." /* icon for state 15 */ "AAAADAAAAADAAAA" "AAAAADAAADAAAAA" "AAAAAAPDPAAAAAA" "AAADAADDDAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAAAAAADAAAAAAA" "AAAADDDDDDDAAAA" "AAADAAADAAADAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAAJDJAADAAA" "AAAAAADDDAAAAAA" "AAAAAAJDJAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAADAAAADAAA" "AAAADAADAADAAAD" "AAAAADADADAAADA" "AJDJADADADADPAA" "ADDDDDDDDDDDDAA" "AJDJADADADADPAA" "AAAAADADADAAADA" "AAAADAADAADAAAD" "AAADAADAAAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAA" "AAAAAAJDJAAAAAA" "AAAAAADDDAAAAAA" "AAADAAJDJAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAADAAADAAADAAA" "AAAADDDDDDDAAAA" "AAAAAAADAAAAAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAADDDAADAAA" "AAAAAAPDPAAAAAA" "AAAAADAAADAAAAA" "AAAADAAAAADAAAA" /* icon for state 18 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAAAADAADAAA" "DAAADAADAADAAAA" "ADAAADADADAAAAA" "AAPDADADADAJDJA" "AADDDDDDDDDDDDA" "AAPDADADADAJDJA" "ADAAADADADAAAAA" "DAAADAADAADAAAA" "AAADAAAADAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 19 */ "AAAAEAAAAAEAAAA" "AAAAAEAAAEAAAAA" "AAAAAAPEPAAAAAA" "AAAEAAEEEAAEAAA" "AAAAEAAEAAEAAAA" "AAAAAEEEEEAAAAA" "AAAAAAAEAAAAAAA" "AAAAEEEEEEEAAAA" "AAAEAAAEAAAEAAA" "AAAAAEEEEEAAAAA" "AAAAEAAEAAEAAAA" "AAAEAAKEKAAEAAA" "AAAAAAEEEAAAAAA" "AAAAAAKEKAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 20 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAEAAEAAAAEAAA" "AAAAEAAEAAEAAAE" "AAAAAEAEAEAAAEA" "AKEKAEAEAEAEPAA" "AEEEEEEEEEEEEAA" "AKEKAEAEAEAEPAA" "AAAAAEAEAEAAAEA" "AAAAEAAEAAEAAAE" "AAAEAAEAAAAEAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 21 */ "AAAAAAAAAAAAAAA" "AAAAAAKEKAAAAAA" "AAAAAAEEEAAAAAA" "AAAEAAKEKAAEAAA" "AAAAEAAEAAEAAAA" "AAAAAEEEEEAAAAA" "AAAEAAAEAAAEAAA" "AAAAEEEEEEEAAAA" "AAAAAAAEAAAAAAA" "AAAAAEEEEEAAAAA" "AAAAEAAEAAEAAAA" "AAAEAAEEEAAEAAA" "AAAAAAPEPAAAAAA" "AAAAAEAAAEAAAAA" "AAAAEAAAAAEAAAA" /* icon for state 22 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAEAAAAEAAEAAA" "EAAAEAAEAAEAAAA" "AEAAAEAEAEAAAAA" "AAPEAEAEAEAKEKA" "AAEEEEEEEEEEEEA" "AAPEAEAEAEAKEKA" "AEAAAEAEAEAAAAA" "EAAAEAAEAAEAAAA" "AAAEAAAAEAAEAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 23 */ "AAAAFAAAAAFAAAA" "AAAAAFAAAFAAAAA" "AAAAAAPFPAAAAAA" "AAAFAAFFFAAFAAA" "AAAAFAAFAAFAAAA" "AAAAAFFFFFAAAAA" "AAAAAAAFAAAAAAA" "AAAAFFFFFFFAAAA" "AAAFAAAFAAAFAAA" "AAAAAFFFFFAAAAA" "AAAAFAAFAAFAAAA" "AAAFAALFLAAFAAA" "AAAAAAFFFAAAAAA" "AAAAAALFLAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 24 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAFAAFAAAAFAAA" "AAAAFAAFAAFAAAF" "AAAAAFAFAFAAAFA" "ALFLAFAFAFAFPAA" "AFFFFFFFFFFFFAA" "ALFLAFAFAFAFPAA" "AAAAAFAFAFAAAFA" "AAAAFAAFAAFAAAF" "AAAFAAFAAAAFAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 25 */ "AAAAAAAAAAAAAAA" "AAAAAALFLAAAAAA" "AAAAAAFFFAAAAAA" "AAAFAALFLAAFAAA" "AAAAFAAFAAFAAAA" "AAAAAFFFFFAAAAA" "AAAFAAAFAAAFAAA" "AAAAFFFFFFFAAAA" "AAAAAAAFAAAAAAA" "AAAAAFFFFFAAAAA" "AAAAFAAFAAFAAAA" "AAAFAAFFFAAFAAA" "AAAAAAPFPAAAAAA" "AAAAAFAAAFAAAAA" "AAAAFAAAAAFAAAA" /* icon for state 26 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAFAAAAFAAFAAA" "FAAAFAAFAAFAAAA" "AFAAAFAFAFAAAAA" "AAPFAFAFAFALFLA" "AAFFFFFFFFFFFFA" "AAPFAFAFAFALFLA" "AFAAAFAFAFAAAAA" "FAAAFAAFAAFAAAA" "AAAFAAAAFAAFAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 27 */ "BBBBDBBBBBDBBBB" "BBBBBDBBBDBBBBB" "BBBBBBPDPBBBBBB" "BBBDBBDDDBBDBBB" "BBBBDBBDBBDBBBB" "BBBBBDDDDDBBBBB" "BBBBBBBDBBBBBBB" "BBBBDDDDDDDBBBB" "BBBDBBBDBBBDBBB" "BBBBBDDDDDBBBBB" "BBBBDBBDBBDBBBB" "BBBDBBMDMBBDBBB" "BBBBBBDDDBBBBBB" "BBBBBBMDMBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 28 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBDBBDBBBBDBBB" "BBBBDBBDBBDBBBD" "BBBBBDBDBDBBBDB" "BMDMBDBDBDBDPBB" "BDDDDDDDDDDDDBB" "BMDMBDBDBDBDPBB" "BBBBBDBDBDBBBDB" "BBBBDBBDBBDBBBD" "BBBDBBDBBBBDBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 29 */ "BBBBBBBBBBBBBBB" "BBBBBBMDMBBBBBB" "BBBBBBDDDBBBBBB" "BBBDBBMDMBBDBBB" "BBBBDBBDBBDBBBB" "BBBBBDDDDDBBBBB" "BBBDBBBDBBBDBBB" "BBBBDDDDDDDBBBB" "BBBBBBBDBBBBBBB" "BBBBBDDDDDBBBBB" "BBBBDBBDBBDBBBB" "BBBDBBDDDBBDBBB" "BBBBBBPDPBBBBBB" "BBBBBDBBBDBBBBB" "BBBBDBBBBBDBBBB" /* icon for state 30 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBDBBBBDBBDBBB" "DBBBDBBDBBDBBBB" "BDBBBDBDBDBBBBB" "BBPDBDBDBDBMDMB" "BBDDDDDDDDDDDDB" "BBPDBDBDBDBMDMB" "BDBBBDBDBDBBBBB" "DBBBDBBDBBDBBBB" "BBBDBBBBDBBDBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 31 */ "BBBBEBBBBBEBBBB" "BBBBBEBBBEBBBBB" "BBBBBBPEPBBBBBB" "BBBEBBEEEBBEBBB" "BBBBEBBEBBEBBBB" "BBBBBEEEEEBBBBB" "BBBBBBBEBBBBBBB" "BBBBEEEEEEEBBBB" "BBBEBBBEBBBEBBB" "BBBBBEEEEEBBBBB" "BBBBEBBEBBEBBBB" "BBBEBBNENBBEBBB" "BBBBBBEEEBBBBBB" "BBBBBBNENBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 32 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBEBBEBBBBEBBB" "BBBBEBBEBBEBBBE" "BBBBBEBEBEBBBEB" "BNENBEBEBEBEPBB" "BEEEEEEEEEEEEBB" "BNENBEBEBEBEPBB" "BBBBBEBEBEBBBEB" "BBBBEBBEBBEBBBE" "BBBEBBEBBBBEBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 33 */ "BBBBBBBBBBBBBBB" "BBBBBBNENBBBBBB" "BBBBBBEEEBBBBBB" "BBBEBBNENBBEBBB" "BBBBEBBEBBEBBBB" "BBBBBEEEEEBBBBB" "BBBEBBBEBBBEBBB" "BBBBEEEEEEEBBBB" "BBBBBBBEBBBBBBB" "BBBBBEEEEEBBBBB" "BBBBEBBEBBEBBBB" "BBBEBBEEEBBEBBB" "BBBBBBPEPBBBBBB" "BBBBBEBBBEBBBBB" "BBBBEBBBBBEBBBB" /* icon for state 34 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBEBBBBEBBEBBB" "EBBBEBBEBBEBBBB" "BEBBBEBEBEBBBBB" "BBPEBEBEBEBNENB" "BBEEEEEEEEEEEEB" "BBPEBEBEBEBNENB" "BEBBBEBEBEBBBBB" "EBBBEBBEBBEBBBB" "BBBEBBBBEBBEBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 35 */ "BBBBFBBBBBFBBBB" "BBBBBFBBBFBBBBB" "BBBBBBPFPBBBBBB" "BBBFBBFFFBBFBBB" "BBBBFBBFBBFBBBB" "BBBBBFFFFFBBBBB" "BBBBBBBFBBBBBBB" "BBBBFFFFFFFBBBB" "BBBFBBBFBBBFBBB" "BBBBBFFFFFBBBBB" "BBBBFBBFBBFBBBB" "BBBFBBOFOBBFBBB" "BBBBBBFFFBBBBBB" "BBBBBBOFOBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 36 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBFBBFBBBBFBBB" "BBBBFBBFBBFBBBF" "BBBBBFBFBFBBBFB" "BOFOBFBFBFBFPBB" "BFFFFFFFFFFFFBB" "BOFOBFBFBFBFPBB" "BBBBBFBFBFBBBFB" "BBBBFBBFBBFBBBF" "BBBFBBFBBBBFBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" /* icon for state 37 */ "BBBBBBBBBBBBBBB" "BBBBBBOFOBBBBBB" "BBBBBBFFFBBBBBB" "BBBFBBOFOBBFBBB" "BBBBFBBFBBFBBBB" "BBBBBFFFFFBBBBB" "BBBFBBBFBBBFBBB" "BBBBFFFFFFFBBBB" "BBBBBBBFBBBBBBB" "BBBBBFFFFFBBBBB" "BBBBFBBFBBFBBBB" "BBBFBBFFFBBFBBB" "BBBBBBPFPBBBBBB" "BBBBBFBBBFBBBBB" "BBBBFBBBBBFBBBB" /* icon for state 38 */ "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBFBBBBFBBFBBB" "FBBBFBBFBBFBBBB" "BFBBBFBFBFBBBBB" "BBPFBFBFBFBOFOB" "BBFFFFFFFFFFFFB" "BBPFBFBFBFBOFOB" "BFBBBFBFBFBBBBB" "FBBBFBBFBBFBBBB" "BBBFBBBBFBBFBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB" XPM /* width height num_colors chars_per_pixel */ "7 266 16 1" /* colors */ "A c #009B43" "B c #7F00FF" ". c #000000" "D c #808080" "E c #B9B860" "F c #0064FF" "G c #404040" "H c #5C5C30" "I c #00327F" "J c #408D61" "K c #5CA951" "L c #007FA1" "M c #7F40BF" "N c #9C5CAF" "O c #3F32FF" "P c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" "BBBBBBB" /* icon for state 3 */ ".D...D." "..PDP.." "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." /* icon for state 4 */ "......." ".D.D..D" ".D.D.P." "DDDDDD." ".D.D.P." ".D.D..D" "......." /* icon for state 5 */ "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." "..PDP.." ".D...D." /* icon for state 6 */ "......." "D..D.D." ".P.D.D." ".DDDDDD" ".P.D.D." "D..D.D." "......." /* icon for state 7 */ ".E...E." "..PEP.." "...E..." ".EEEEE." "...E..." ".EEEEE." "...E..." /* icon for state 8 */ "......." ".E.E..E" ".E.E.P." "EEEEEE." ".E.E.P." ".E.E..E" "......." /* icon for state 9 */ "...E..." ".EEEEE." "...E..." ".EEEEE." "...E..." "..PEP.." ".E...E." /* icon for state 10 */ "......." "E..E.E." ".P.E.E." ".EEEEEE" ".P.E.E." "E..E.E." "......." /* icon for state 11 */ ".F...F." "..PFP.." "...F..." ".FFFFF." "...F..." ".FFFFF." "...F..." /* icon for state 12 */ "......." ".F.F..F" ".F.F.P." "FFFFFF." ".F.F.P." ".F.F..F" "......." /* icon for state 13 */ "...F..." ".FFFFF." "...F..." ".FFFFF." "...F..." "..PFP.." ".F...F." /* icon for state 14 */ "......." "F..F.F." ".P.F.F." ".FFFFFF" ".P.F.F." "F..F.F." "......." /* icon for state 15 */ "ADAAADA" "AAPDPAA" "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" /* icon for state 16 */ "AAAAAAA" "ADADAAD" "ADADAPA" "DDDDDDA" "ADADAPA" "ADADAAD" "AAAAAAA" /* icon for state 17 */ "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" "AAPDPAA" "ADAAADA" /* icon for state 18 */ "AAAAAAA" "DAADADA" "APADADA" "ADDDDDD" "APADADA" "DAADADA" "AAAAAAA" /* icon for state 19 */ "AEAAAEA" "AAPEPAA" "AAAEAAA" "AEEEEEA" "AAAEAAA" "AEEEEEA" "AAAEAAA" /* icon for state 20 */ "AAAAAAA" "AEAEAAE" "AEAEAPA" "EEEEEEA" "AEAEAPA" "AEAEAAE" "AAAAAAA" /* icon for state 21 */ "AAAEAAA" "AEEEEEA" "AAAEAAA" "AEEEEEA" "AAAEAAA" "AAPEPAA" "AEAAAEA" /* icon for state 22 */ "AAAAAAA" "EAAEAEA" "APAEAEA" "AEEEEEE" "APAEAEA" "EAAEAEA" "AAAAAAA" /* icon for state 23 */ "AFAAAFA" "AAPFPAA" "AAAFAAA" "AFFFFFA" "AAAFAAA" "AFFFFFA" "AAAFAAA" /* icon for state 24 */ "AAAAAAA" "AFAFAAF" "AFAFAPA" "FFFFFFA" "AFAFAPA" "AFAFAAF" "AAAAAAA" /* icon for state 25 */ "AAAFAAA" "AFFFFFA" "AAAFAAA" "AFFFFFA" "AAAFAAA" "AAPFPAA" "AFAAAFA" /* icon for state 26 */ "AAAAAAA" "FAAFAFA" "APAFAFA" "AFFFFFF" "APAFAFA" "FAAFAFA" "AAAAAAA" /* icon for state 27 */ "BDBBBDB" "BBPDPBB" "BBBDBBB" "BDDDDDB" "BBBDBBB" "BDDDDDB" "BBBDBBB" /* icon for state 28 */ "BBBBBBB" "BDBDBBD" "BDBDBPB" "DDDDDDB" "BDBDBPB" "BDBDBBD" "BBBBBBB" /* icon for state 29 */ "BBBDBBB" "BDDDDDB" "BBBDBBB" "BDDDDDB" "BBBDBBB" "BBPDPBB" "BDBBBDB" /* icon for state 30 */ "BBBBBBB" "DBBDBDB" "BPBDBDB" "BDDDDDD" "BPBDBDB" "DBBDBDB" "BBBBBBB" /* icon for state 31 */ "BEBBBEB" "BBPEPBB" "BBBEBBB" "BEEEEEB" "BBBEBBB" "BEEEEEB" "BBBEBBB" /* icon for state 32 */ "BBBBBBB" "BEBEBBE" "BEBEBPB" "EEEEEEB" "BEBEBPB" "BEBEBBE" "BBBBBBB" /* icon for state 33 */ "BBBEBBB" "BEEEEEB" "BBBEBBB" "BEEEEEB" "BBBEBBB" "BBPEPBB" "BEBBBEB" /* icon for state 34 */ "BBBBBBB" "EBBEBEB" "BPBEBEB" "BEEEEEE" "BPBEBEB" "EBBEBEB" "BBBBBBB" /* icon for state 35 */ "BFBBBFB" "BBPFPBB" "BBBFBBB" "BFFFFFB" "BBBFBBB" "BFFFFFB" "BBBFBBB" /* icon for state 36 */ "BBBBBBB" "BFBFBBF" "BFBFBPB" "FFFFFFB" "BFBFBPB" "BFBFBBF" "BBBBBBB" /* icon for state 37 */ "BBBFBBB" "BFFFFFB" "BBBFBBB" "BFFFFFB" "BBBFBBB" "BBPFPBB" "BFBBBFB" /* icon for state 38 */ "BBBBBBB" "FBBFBFB" "BPBFBFB" "BFFFFFF" "BPBFBFB" "FBBFBFB" "BBBBBBB" golly-2.5-src/Rules/Turmite_121181121020.rule0000644000175100001440000006501612156145314015122 00000000000000@RULE Turmite_121181121020 @TREE num_states=18 num_neighbors=4 num_nodes=27 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 6 14 14 14 14 14 14 14 14 14 14 14 14 14 6 6 6 6 1 2 10 10 10 10 10 10 10 10 10 10 10 10 10 2 2 2 2 2 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 2 1 9 17 17 17 17 17 17 17 17 17 17 17 17 17 9 9 9 9 2 4 4 4 4 4 0 4 4 4 0 4 0 4 4 4 4 4 0 1 5 13 13 13 13 13 13 13 13 13 13 13 13 13 5 5 5 5 2 6 6 6 6 6 0 6 6 6 0 6 0 6 6 6 6 6 0 3 3 3 3 3 5 3 3 3 5 3 5 3 3 3 3 3 7 3 1 7 15 15 15 15 15 15 15 15 15 15 15 15 15 7 7 7 7 2 9 9 9 9 9 0 9 9 9 0 9 0 9 9 9 9 9 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 10 10 10 10 11 10 10 10 11 10 11 10 10 10 10 10 11 10 1 3 11 11 11 11 11 11 11 11 11 11 11 11 11 3 3 3 3 2 13 13 13 13 13 0 13 13 13 0 13 0 13 13 13 13 13 0 3 14 14 14 14 11 14 14 14 11 14 11 14 14 14 14 14 11 14 4 8 8 12 8 8 8 12 8 8 8 8 8 12 8 15 8 8 8 1 8 16 16 16 16 16 16 16 16 16 16 16 16 16 8 8 8 8 2 17 17 17 17 17 0 17 17 17 0 17 0 17 17 17 17 17 0 3 18 18 18 18 11 18 18 18 11 18 11 18 18 18 18 18 11 18 3 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 4 19 19 20 19 19 19 20 19 19 19 19 19 20 19 20 19 19 19 1 4 12 12 12 12 12 12 12 12 12 12 12 12 12 4 4 4 4 2 22 22 22 22 22 0 22 22 22 0 22 0 22 22 22 22 22 0 3 23 23 23 23 11 23 23 23 11 23 11 23 23 23 23 23 11 23 4 24 24 20 24 24 24 20 24 24 24 24 24 20 24 20 24 24 24 5 16 16 16 21 16 16 16 21 16 16 16 16 16 21 16 25 16 16 @COLORS 0 0 0 0 1 0 155 67 2 131 12 251 3 131 12 251 4 131 12 251 5 131 12 251 6 132 132 132 7 132 132 132 8 132 132 132 9 132 132 132 10 23 130 99 11 23 130 99 12 23 130 99 13 23 130 99 14 23 151 78 15 23 151 78 16 23 151 78 17 23 151 78 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 527 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "..............................." ".......C...............C......." ".......C...............C......." "........C.............C........" "........C.............C........" ".........CCCIICCCIICCC........." "............IICCCII............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CCCCCCCCC..........." "............CCCCCCC............" "..............CCC.............." "..............CCC.............." "...........CCCCCCCCC..........." "..........CCCCCCCCCCC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............CCCCCCC............" "...........CC.CCC.CC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC...ECCCE...CC........" ".............CCCCC............." ".............CCCCC............." ".............ECCCE............." "..............CCC.............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................CC." "......C.....C.........C...CC..." "......CC....CC.......CC..C....." ".......CC....CC.....CC...C....." "........CC....CC...CC....C....." ".........CC...CC..CC....II....." "...ECCE...CC..CC..CC...CII....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "...ECCE...CC..CC..CC...CII....." ".........CC...CC..CC....II....." "........CC....CC...CC....C....." ".......CC....CC.....CC...C....." "......CC....CC.......CC..C....." "......C.....C.........C...CC..." "............................CC." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............CCC.............." ".............ECCCE............." ".............CCCCC............." ".............CCCCC............." "........CC...ECCCE...CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CC.CCC.CC..........." "............CCCCCCC............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CCCCCCCCCCC.........." "...........CCCCCCCCC..........." "..............CCC.............." "..............CCC.............." "............CCCCCCC............" "...........CCCCCCCCC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............IICCCII............" ".........CCCIICCCIICCC........." "........C.............C........" "........C.............C........" ".......C...............C......." ".......C...............C......." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".CC............................" "...CC...C.........C.....C......" ".....C..CC.......CC....CC......" ".....C...CC.....CC....CC......." ".....C....CC...CC....CC........" ".....II....CC..CC...CC........." ".....IIC...CC..CC..CC...ECCE..." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....IIC...CC..CC..CC...ECCE..." ".....II....CC..CC...CC........." ".....C....CC...CC....CC........" ".....C...CC.....CC....CC......." ".....C..CC.......CC....CC......" "...CC...C.........C.....C......" ".CC............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "..............................." ".......D...............D......." ".......D...............D......." "........D.............D........" "........D.............D........" ".........DDDIIDDDIIDDD........." "............IIDDDII............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DDDDDDDDD..........." "............DDDDDDD............" "..............DDD.............." "..............DDD.............." "...........DDDDDDDDD..........." "..........DDDDDDDDDDD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............DDDDDDD............" "...........DD.DDD.DD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD...FDDDF...DD........" ".............DDDDD............." ".............DDDDD............." ".............FDDDF............." "..............DDD.............." "..............................." "..............................." /* icon for state 7 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................DD." "......D.....D.........D...DD..." "......DD....DD.......DD..D....." ".......DD....DD.....DD...D....." "........DD....DD...DD....D....." ".........DD...DD..DD....II....." "...FDDF...DD..DD..DD...DII....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "...FDDF...DD..DD..DD...DII....." ".........DD...DD..DD....II....." "........DD....DD...DD....D....." ".......DD....DD.....DD...D....." "......DD....DD.......DD..D....." "......D.....D.........D...DD..." "............................DD." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............DDD.............." ".............FDDDF............." ".............DDDDD............." ".............DDDDD............." "........DD...FDDDF...DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DD.DDD.DD..........." "............DDDDDDD............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DDDDDDDDDDD.........." "...........DDDDDDDDD..........." "..............DDD.............." "..............DDD.............." "............DDDDDDD............" "...........DDDDDDDDD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............IIDDDII............" ".........DDDIIDDDIIDDD........." "........D.............D........" "........D.............D........" ".......D...............D......." ".......D...............D......." "..............................." /* icon for state 9 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".DD............................" "...DD...D.........D.....D......" ".....D..DD.......DD....DD......" ".....D...DD.....DD....DD......." ".....D....DD...DD....DD........" ".....II....DD..DD...DD........." ".....IID...DD..DD..DD...FDDF..." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....IID...DD..DD..DD...FDDF..." ".....II....DD..DD...DD........." ".....D....DD...DD....DD........" ".....D...DD.....DD....DD......." ".....D..DD.......DD....DD......" "...DD...D.........D.....D......" ".DD............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 10 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 255 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "....C.....C...." ".....C...C....." "......ICI......" "...C..CCC..C..." "....C..C..C...." ".....CCCCC....." ".......C......." "....CCCCCCC...." "...C...C...C..." ".....CCCCC....." "....C..C..C...." "...C..ECE..C..." "......CCC......" "......ECE......" "..............." /* icon for state 3 */ "..............." "..............." "..............." "...C..C....C..." "....C..C..C...C" ".....C.C.C...C." ".ECE.C.C.C.CI.." ".CCCCCCCCCCCC.." ".ECE.C.C.C.CI.." ".....C.C.C...C." "....C..C..C...C" "...C..C....C..." "..............." "..............." "..............." /* icon for state 4 */ "..............." "......ECE......" "......CCC......" "...C..ECE..C..." "....C..C..C...." ".....CCCCC....." "...C...C...C..." "....CCCCCCC...." ".......C......." ".....CCCCC....." "....C..C..C...." "...C..CCC..C..." "......ICI......" ".....C...C....." "....C.....C...." /* icon for state 5 */ "..............." "..............." "..............." "...C....C..C..." "C...C..C..C...." ".C...C.C.C....." "..IC.C.C.C.ECE." "..CCCCCCCCCCCC." "..IC.C.C.C.ECE." ".C...C.C.C....." "C...C..C..C...." "...C....C..C..." "..............." "..............." "..............." /* icon for state 6 */ "....D.....D...." ".....D...D....." "......IDI......" "...D..DDD..D..." "....D..D..D...." ".....DDDDD....." ".......D......." "....DDDDDDD...." "...D...D...D..." ".....DDDDD....." "....D..D..D...." "...D..FDF..D..." "......DDD......" "......FDF......" "..............." /* icon for state 7 */ "..............." "..............." "..............." "...D..D....D..." "....D..D..D...D" ".....D.D.D...D." ".FDF.D.D.D.DI.." ".DDDDDDDDDDDD.." ".FDF.D.D.D.DI.." ".....D.D.D...D." "....D..D..D...D" "...D..D....D..." "..............." "..............." "..............." /* icon for state 8 */ "..............." "......FDF......" "......DDD......" "...D..FDF..D..." "....D..D..D...." ".....DDDDD....." "...D...D...D..." "....DDDDDDD...." ".......D......." ".....DDDDD....." "....D..D..D...." "...D..DDD..D..." "......IDI......" ".....D...D....." "....D.....D...." /* icon for state 9 */ "..............." "..............." "..............." "...D....D..D..." "D...D..D..D...." ".D...D.D.D....." "..ID.D.D.D.FDF." "..DDDDDDDDDDDD." "..ID.D.D.D.FDF." ".D...D.D.D....." "D...D..D..D...." "...D....D..D..." "..............." "..............." "..............." /* icon for state 10 */ "AAAACAAAAACAAAA" "AAAAACAAACAAAAA" "AAAAAAICIAAAAAA" "AAACAACCCAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAAAAAACAAAAAAA" "AAAACCCCCCCAAAA" "AAACAAACAAACAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAAGCGAACAAA" "AAAAAACCCAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAACAAAACAAA" "AAAACAACAACAAAC" "AAAAACACACAAACA" "AGCGACACACACIAA" "ACCCCCCCCCCCCAA" "AGCGACACACACIAA" "AAAAACACACAAACA" "AAAACAACAACAAAC" "AAACAACAAAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAACCCAAAAAA" "AAACAAGCGAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAACAAACAAACAAA" "AAAACCCCCCCAAAA" "AAAAAAACAAAAAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAACCCAACAAA" "AAAAAAICIAAAAAA" "AAAAACAAACAAAAA" "AAAACAAAAACAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAAAACAACAAA" "CAAACAACAACAAAA" "ACAAACACACAAAAA" "AAICACACACAGCGA" "AACCCCCCCCCCCCA" "AAICACACACAGCGA" "ACAAACACACAAAAA" "CAAACAACAACAAAA" "AAACAAAACAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAADAAAAADAAAA" "AAAAADAAADAAAAA" "AAAAAAIDIAAAAAA" "AAADAADDDAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAAAAAADAAAAAAA" "AAAADDDDDDDAAAA" "AAADAAADAAADAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAAHDHAADAAA" "AAAAAADDDAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAADAAAADAAA" "AAAADAADAADAAAD" "AAAAADADADAAADA" "AHDHADADADADIAA" "ADDDDDDDDDDDDAA" "AHDHADADADADIAA" "AAAAADADADAAADA" "AAAADAADAADAAAD" "AAADAADAAAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAADDDAAAAAA" "AAADAAHDHAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAADAAADAAADAAA" "AAAADDDDDDDAAAA" "AAAAAAADAAAAAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAADDDAADAAA" "AAAAAAIDIAAAAAA" "AAAAADAAADAAAAA" "AAAADAAAAADAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAAAADAADAAA" "DAAADAADAADAAAA" "ADAAADADADAAAAA" "AAIDADADADAHDHA" "AADDDDDDDDDDDDA" "AAIDADADADAHDHA" "ADAAADADADAAAAA" "DAAADAADAADAAAA" "AAADAAAADAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 119 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ ".C...C." "..ICI.." "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." /* icon for state 3 */ "......." ".C.C..C" ".C.C.I." "CCCCCC." ".C.C.I." ".C.C..C" "......." /* icon for state 4 */ "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." "..ICI.." ".C...C." /* icon for state 5 */ "......." "C..C.C." ".I.C.C." ".CCCCCC" ".I.C.C." "C..C.C." "......." /* icon for state 6 */ ".D...D." "..IDI.." "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." /* icon for state 7 */ "......." ".D.D..D" ".D.D.I." "DDDDDD." ".D.D.I." ".D.D..D" "......." /* icon for state 8 */ "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." "..IDI.." ".D...D." /* icon for state 9 */ "......." "D..D.D." ".I.D.D." ".DDDDDD" ".I.D.D." "D..D.D." "......." /* icon for state 10 */ "ACAAACA" "AAICIAA" "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" /* icon for state 11 */ "AAAAAAA" "ACACAAC" "ACACAIA" "CCCCCCA" "ACACAIA" "ACACAAC" "AAAAAAA" /* icon for state 12 */ "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" "AAICIAA" "ACAAACA" /* icon for state 13 */ "AAAAAAA" "CAACACA" "AIACACA" "ACCCCCC" "AIACACA" "CAACACA" "AAAAAAA" /* icon for state 14 */ "ADAAADA" "AAIDIAA" "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" /* icon for state 15 */ "AAAAAAA" "ADADAAD" "ADADAIA" "DDDDDDA" "ADADAIA" "ADADAAD" "AAAAAAA" /* icon for state 16 */ "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" "AAIDIAA" "ADAAADA" /* icon for state 17 */ "AAAAAAA" "DAADADA" "AIADADA" "ADDDDDD" "AIADADA" "DAADADA" "AAAAAAA" golly-2.5-src/Rules/Turmite_180121020081.rule0000644000175100001440000006475612156145314015140 00000000000000@RULE Turmite_180121020081 @TREE num_states=18 num_neighbors=4 num_nodes=27 1 0 1 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1 2 10 10 10 10 10 2 2 2 2 10 10 10 10 2 2 2 2 1 6 14 14 14 14 14 6 6 6 6 14 14 14 14 6 6 6 6 2 0 0 0 1 0 0 0 0 0 1 0 0 0 2 0 2 0 0 1 5 13 13 13 13 13 5 5 5 5 13 13 13 13 5 5 5 5 2 4 4 4 0 4 4 4 4 4 0 4 4 4 0 4 0 4 4 1 9 17 17 17 17 17 9 9 9 9 17 17 17 17 9 9 9 9 2 6 6 6 0 6 6 6 6 6 0 6 6 6 0 6 0 6 6 3 3 3 5 3 3 3 3 3 5 3 3 3 7 3 7 3 3 3 1 3 11 11 11 11 11 3 3 3 3 11 11 11 11 3 3 3 3 2 9 9 9 0 9 9 9 9 9 0 9 9 9 0 9 0 9 9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 10 10 11 10 10 10 10 10 11 10 10 10 11 10 11 10 10 10 1 7 15 15 15 15 15 7 7 7 7 15 15 15 15 7 7 7 7 2 13 13 13 0 13 13 13 13 13 0 13 13 13 0 13 0 13 13 3 14 14 11 14 14 14 14 14 11 14 14 14 11 14 11 14 14 14 4 8 8 8 8 12 8 12 8 8 8 15 8 8 8 8 8 15 8 1 4 12 12 12 12 12 4 4 4 4 12 12 12 12 4 4 4 4 2 17 17 17 0 17 17 17 17 17 0 17 17 17 0 17 0 17 17 3 18 18 11 18 18 18 18 18 11 18 18 18 11 18 11 18 18 18 3 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 4 19 19 19 19 20 19 20 19 19 19 20 19 19 19 19 19 20 19 1 8 16 16 16 16 16 8 8 8 8 16 16 16 16 8 8 8 8 2 22 22 22 0 22 22 22 22 22 0 22 22 22 0 22 0 22 22 3 23 23 11 23 23 23 23 23 11 23 23 23 11 23 11 23 23 23 4 24 24 24 24 20 24 20 24 24 24 20 24 24 24 24 24 20 24 5 16 16 16 16 16 21 16 21 16 16 16 25 16 16 16 16 16 25 @COLORS 0 0 0 0 1 0 155 67 2 131 12 251 3 131 12 251 4 131 12 251 5 131 12 251 6 132 132 132 7 132 132 132 8 132 132 132 9 132 132 132 10 23 130 99 11 23 130 99 12 23 130 99 13 23 130 99 14 23 151 78 15 23 151 78 16 23 151 78 17 23 151 78 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 527 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "..............................." ".......C...............C......." ".......C...............C......." "........C.............C........" "........C.............C........" ".........CCCIICCCIICCC........." "............IICCCII............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CCCCCCCCC..........." "............CCCCCCC............" "..............CCC.............." "..............CCC.............." "...........CCCCCCCCC..........." "..........CCCCCCCCCCC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............CCCCCCC............" "...........CC.CCC.CC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC...ECCCE...CC........" ".............CCCCC............." ".............CCCCC............." ".............ECCCE............." "..............CCC.............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................CC." "......C.....C.........C...CC..." "......CC....CC.......CC..C....." ".......CC....CC.....CC...C....." "........CC....CC...CC....C....." ".........CC...CC..CC....II....." "...ECCE...CC..CC..CC...CII....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "...ECCE...CC..CC..CC...CII....." ".........CC...CC..CC....II....." "........CC....CC...CC....C....." ".......CC....CC.....CC...C....." "......CC....CC.......CC..C....." "......C.....C.........C...CC..." "............................CC." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............CCC.............." ".............ECCCE............." ".............CCCCC............." ".............CCCCC............." "........CC...ECCCE...CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CC.CCC.CC..........." "............CCCCCCC............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CCCCCCCCCCC.........." "...........CCCCCCCCC..........." "..............CCC.............." "..............CCC.............." "............CCCCCCC............" "...........CCCCCCCCC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............IICCCII............" ".........CCCIICCCIICCC........." "........C.............C........" "........C.............C........" ".......C...............C......." ".......C...............C......." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".CC............................" "...CC...C.........C.....C......" ".....C..CC.......CC....CC......" ".....C...CC.....CC....CC......." ".....C....CC...CC....CC........" ".....II....CC..CC...CC........." ".....IIC...CC..CC..CC...ECCE..." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....IIC...CC..CC..CC...ECCE..." ".....II....CC..CC...CC........." ".....C....CC...CC....CC........" ".....C...CC.....CC....CC......." ".....C..CC.......CC....CC......" "...CC...C.........C.....C......" ".CC............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "..............................." ".......D...............D......." ".......D...............D......." "........D.............D........" "........D.............D........" ".........DDDIIDDDIIDDD........." "............IIDDDII............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DDDDDDDDD..........." "............DDDDDDD............" "..............DDD.............." "..............DDD.............." "...........DDDDDDDDD..........." "..........DDDDDDDDDDD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............DDDDDDD............" "...........DD.DDD.DD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD...FDDDF...DD........" ".............DDDDD............." ".............DDDDD............." ".............FDDDF............." "..............DDD.............." "..............................." "..............................." /* icon for state 7 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................DD." "......D.....D.........D...DD..." "......DD....DD.......DD..D....." ".......DD....DD.....DD...D....." "........DD....DD...DD....D....." ".........DD...DD..DD....II....." "...FDDF...DD..DD..DD...DII....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "...FDDF...DD..DD..DD...DII....." ".........DD...DD..DD....II....." "........DD....DD...DD....D....." ".......DD....DD.....DD...D....." "......DD....DD.......DD..D....." "......D.....D.........D...DD..." "............................DD." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............DDD.............." ".............FDDDF............." ".............DDDDD............." ".............DDDDD............." "........DD...FDDDF...DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DD.DDD.DD..........." "............DDDDDDD............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DDDDDDDDDDD.........." "...........DDDDDDDDD..........." "..............DDD.............." "..............DDD.............." "............DDDDDDD............" "...........DDDDDDDDD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............IIDDDII............" ".........DDDIIDDDIIDDD........." "........D.............D........" "........D.............D........" ".......D...............D......." ".......D...............D......." "..............................." /* icon for state 9 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".DD............................" "...DD...D.........D.....D......" ".....D..DD.......DD....DD......" ".....D...DD.....DD....DD......." ".....D....DD...DD....DD........" ".....II....DD..DD...DD........." ".....IID...DD..DD..DD...FDDF..." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....IID...DD..DD..DD...FDDF..." ".....II....DD..DD...DD........." ".....D....DD...DD....DD........" ".....D...DD.....DD....DD......." ".....D..DD.......DD....DD......" "...DD...D.........D.....D......" ".DD............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 10 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 255 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "....C.....C...." ".....C...C....." "......ICI......" "...C..CCC..C..." "....C..C..C...." ".....CCCCC....." ".......C......." "....CCCCCCC...." "...C...C...C..." ".....CCCCC....." "....C..C..C...." "...C..ECE..C..." "......CCC......" "......ECE......" "..............." /* icon for state 3 */ "..............." "..............." "..............." "...C..C....C..." "....C..C..C...C" ".....C.C.C...C." ".ECE.C.C.C.CI.." ".CCCCCCCCCCCC.." ".ECE.C.C.C.CI.." ".....C.C.C...C." "....C..C..C...C" "...C..C....C..." "..............." "..............." "..............." /* icon for state 4 */ "..............." "......ECE......" "......CCC......" "...C..ECE..C..." "....C..C..C...." ".....CCCCC....." "...C...C...C..." "....CCCCCCC...." ".......C......." ".....CCCCC....." "....C..C..C...." "...C..CCC..C..." "......ICI......" ".....C...C....." "....C.....C...." /* icon for state 5 */ "..............." "..............." "..............." "...C....C..C..." "C...C..C..C...." ".C...C.C.C....." "..IC.C.C.C.ECE." "..CCCCCCCCCCCC." "..IC.C.C.C.ECE." ".C...C.C.C....." "C...C..C..C...." "...C....C..C..." "..............." "..............." "..............." /* icon for state 6 */ "....D.....D...." ".....D...D....." "......IDI......" "...D..DDD..D..." "....D..D..D...." ".....DDDDD....." ".......D......." "....DDDDDDD...." "...D...D...D..." ".....DDDDD....." "....D..D..D...." "...D..FDF..D..." "......DDD......" "......FDF......" "..............." /* icon for state 7 */ "..............." "..............." "..............." "...D..D....D..." "....D..D..D...D" ".....D.D.D...D." ".FDF.D.D.D.DI.." ".DDDDDDDDDDDD.." ".FDF.D.D.D.DI.." ".....D.D.D...D." "....D..D..D...D" "...D..D....D..." "..............." "..............." "..............." /* icon for state 8 */ "..............." "......FDF......" "......DDD......" "...D..FDF..D..." "....D..D..D...." ".....DDDDD....." "...D...D...D..." "....DDDDDDD...." ".......D......." ".....DDDDD....." "....D..D..D...." "...D..DDD..D..." "......IDI......" ".....D...D....." "....D.....D...." /* icon for state 9 */ "..............." "..............." "..............." "...D....D..D..." "D...D..D..D...." ".D...D.D.D....." "..ID.D.D.D.FDF." "..DDDDDDDDDDDD." "..ID.D.D.D.FDF." ".D...D.D.D....." "D...D..D..D...." "...D....D..D..." "..............." "..............." "..............." /* icon for state 10 */ "AAAACAAAAACAAAA" "AAAAACAAACAAAAA" "AAAAAAICIAAAAAA" "AAACAACCCAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAAAAAACAAAAAAA" "AAAACCCCCCCAAAA" "AAACAAACAAACAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAAGCGAACAAA" "AAAAAACCCAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAACAAAACAAA" "AAAACAACAACAAAC" "AAAAACACACAAACA" "AGCGACACACACIAA" "ACCCCCCCCCCCCAA" "AGCGACACACACIAA" "AAAAACACACAAACA" "AAAACAACAACAAAC" "AAACAACAAAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAACCCAAAAAA" "AAACAAGCGAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAACAAACAAACAAA" "AAAACCCCCCCAAAA" "AAAAAAACAAAAAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAACCCAACAAA" "AAAAAAICIAAAAAA" "AAAAACAAACAAAAA" "AAAACAAAAACAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAAAACAACAAA" "CAAACAACAACAAAA" "ACAAACACACAAAAA" "AAICACACACAGCGA" "AACCCCCCCCCCCCA" "AAICACACACAGCGA" "ACAAACACACAAAAA" "CAAACAACAACAAAA" "AAACAAAACAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAADAAAAADAAAA" "AAAAADAAADAAAAA" "AAAAAAIDIAAAAAA" "AAADAADDDAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAAAAAADAAAAAAA" "AAAADDDDDDDAAAA" "AAADAAADAAADAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAAHDHAADAAA" "AAAAAADDDAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAADAAAADAAA" "AAAADAADAADAAAD" "AAAAADADADAAADA" "AHDHADADADADIAA" "ADDDDDDDDDDDDAA" "AHDHADADADADIAA" "AAAAADADADAAADA" "AAAADAADAADAAAD" "AAADAADAAAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAADDDAAAAAA" "AAADAAHDHAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAADAAADAAADAAA" "AAAADDDDDDDAAAA" "AAAAAAADAAAAAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAADDDAADAAA" "AAAAAAIDIAAAAAA" "AAAAADAAADAAAAA" "AAAADAAAAADAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAAAADAADAAA" "DAAADAADAADAAAA" "ADAAADADADAAAAA" "AAIDADADADAHDHA" "AADDDDDDDDDDDDA" "AAIDADADADAHDHA" "ADAAADADADAAAAA" "DAAADAADAADAAAA" "AAADAAAADAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 119 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ ".C...C." "..ICI.." "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." /* icon for state 3 */ "......." ".C.C..C" ".C.C.I." "CCCCCC." ".C.C.I." ".C.C..C" "......." /* icon for state 4 */ "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." "..ICI.." ".C...C." /* icon for state 5 */ "......." "C..C.C." ".I.C.C." ".CCCCCC" ".I.C.C." "C..C.C." "......." /* icon for state 6 */ ".D...D." "..IDI.." "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." /* icon for state 7 */ "......." ".D.D..D" ".D.D.I." "DDDDDD." ".D.D.I." ".D.D..D" "......." /* icon for state 8 */ "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." "..IDI.." ".D...D." /* icon for state 9 */ "......." "D..D.D." ".I.D.D." ".DDDDDD" ".I.D.D." "D..D.D." "......." /* icon for state 10 */ "ACAAACA" "AAICIAA" "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" /* icon for state 11 */ "AAAAAAA" "ACACAAC" "ACACAIA" "CCCCCCA" "ACACAIA" "ACACAAC" "AAAAAAA" /* icon for state 12 */ "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" "AAICIAA" "ACAAACA" /* icon for state 13 */ "AAAAAAA" "CAACACA" "AIACACA" "ACCCCCC" "AIACACA" "CAACACA" "AAAAAAA" /* icon for state 14 */ "ADAAADA" "AAIDIAA" "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" /* icon for state 15 */ "AAAAAAA" "ADADAAD" "ADADAIA" "DDDDDDA" "ADADAIA" "ADADAAD" "AAAAAAA" /* icon for state 16 */ "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" "AAIDIAA" "ADAAADA" /* icon for state 17 */ "AAAAAAA" "DAADADA" "AIADADA" "ADDDDDD" "AIADADA" "DAADADA" "AAAAAAA" golly-2.5-src/Rules/Turmite_181181121010.rule0000644000175100001440000006501612156145314015127 00000000000000@RULE Turmite_181181121010 @TREE num_states=18 num_neighbors=4 num_nodes=27 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 6 14 14 14 14 14 14 14 14 14 14 14 14 14 6 6 6 6 1 2 10 10 10 10 10 10 10 10 10 10 10 10 10 2 2 2 2 2 0 0 0 1 0 0 0 0 0 1 0 1 0 0 2 0 0 0 1 9 17 17 17 17 17 17 17 17 17 17 17 17 17 9 9 9 9 2 4 4 4 0 4 4 4 4 4 0 4 0 4 4 0 4 4 4 1 5 13 13 13 13 13 13 13 13 13 13 13 13 13 5 5 5 5 2 6 6 6 0 6 6 6 6 6 0 6 0 6 6 0 6 6 6 3 3 3 5 3 3 3 3 3 5 3 5 3 3 3 3 3 3 7 1 7 15 15 15 15 15 15 15 15 15 15 15 15 15 7 7 7 7 2 9 9 9 0 9 9 9 9 9 0 9 0 9 9 0 9 9 9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 10 10 11 10 10 10 10 10 11 10 11 10 10 10 10 10 10 11 1 3 11 11 11 11 11 11 11 11 11 11 11 11 11 3 3 3 3 2 13 13 13 0 13 13 13 13 13 0 13 0 13 13 0 13 13 13 3 14 14 11 14 14 14 14 14 11 14 11 14 14 14 14 14 14 11 4 8 8 8 8 12 8 12 8 8 8 8 8 12 8 8 15 8 8 1 8 16 16 16 16 16 16 16 16 16 16 16 16 16 8 8 8 8 2 17 17 17 0 17 17 17 17 17 0 17 0 17 17 0 17 17 17 3 18 18 11 18 18 18 18 18 11 18 11 18 18 18 18 18 18 11 3 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 4 19 19 19 19 20 19 20 19 19 19 19 19 20 19 19 20 19 19 1 4 12 12 12 12 12 12 12 12 12 12 12 12 12 4 4 4 4 2 22 22 22 0 22 22 22 22 22 0 22 0 22 22 0 22 22 22 3 23 23 11 23 23 23 23 23 11 23 11 23 23 23 23 23 23 11 4 24 24 24 24 20 24 20 24 24 24 24 24 20 24 24 20 24 24 5 16 16 16 16 16 21 16 21 16 16 16 16 16 21 16 16 25 16 @COLORS 0 0 0 0 1 0 155 67 2 131 12 251 3 131 12 251 4 131 12 251 5 131 12 251 6 132 132 132 7 132 132 132 8 132 132 132 9 132 132 132 10 23 130 99 11 23 130 99 12 23 130 99 13 23 130 99 14 23 151 78 15 23 151 78 16 23 151 78 17 23 151 78 @ICONS XPM /* width height num_colors chars_per_pixel */ "31 527 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 2 */ "..............................." ".......C...............C......." ".......C...............C......." "........C.............C........" "........C.............C........" ".........CCCIICCCIICCC........." "............IICCCII............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CCCCCCCCC..........." "............CCCCCCC............" "..............CCC.............." "..............CCC.............." "...........CCCCCCCCC..........." "..........CCCCCCCCCCC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............CCCCCCC............" "...........CC.CCC.CC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC...ECCCE...CC........" ".............CCCCC............." ".............CCCCC............." ".............ECCCE............." "..............CCC.............." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................CC." "......C.....C.........C...CC..." "......CC....CC.......CC..C....." ".......CC....CC.....CC...C....." "........CC....CC...CC....C....." ".........CC...CC..CC....II....." "...ECCE...CC..CC..CC...CII....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "..CCCCCCCCCCCCCCCCCCCCCCCC....." "...ECCE...CC..CC..CC...CII....." ".........CC...CC..CC....II....." "........CC....CC...CC....C....." ".......CC....CC.....CC...C....." "......CC....CC.......CC..C....." "......C.....C.........C...CC..." "............................CC." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............CCC.............." ".............ECCCE............." ".............CCCCC............." ".............CCCCC............." "........CC...ECCCE...CC........" ".........CC...CCC...CC........." "..........CC..CCC..CC.........." "...........CC.CCC.CC..........." "............CCCCCCC............" ".............CCCCC............." "........CC....CCC....CC........" ".........CC...CCC...CC........." "..........CCCCCCCCCCC.........." "...........CCCCCCCCC..........." "..............CCC.............." "..............CCC.............." "............CCCCCCC............" "...........CCCCCCCCC..........." "..........CC..CCC..CC.........." ".........CC...CCC...CC........." "........CC....CCC....CC........" ".............CCCCC............." "............IICCCII............" ".........CCCIICCCIICCC........." "........C.............C........" "........C.............C........" ".......C...............C......." ".......C...............C......." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".CC............................" "...CC...C.........C.....C......" ".....C..CC.......CC....CC......" ".....C...CC.....CC....CC......." ".....C....CC...CC....CC........" ".....II....CC..CC...CC........." ".....IIC...CC..CC..CC...ECCE..." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....CCCCCCCCCCCCCCCCCCCCCCCC.." ".....IIC...CC..CC..CC...ECCE..." ".....II....CC..CC...CC........." ".....C....CC...CC....CC........" ".....C...CC.....CC....CC......." ".....C..CC.......CC....CC......" "...CC...C.........C.....C......" ".CC............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "..............................." ".......D...............D......." ".......D...............D......." "........D.............D........" "........D.............D........" ".........DDDIIDDDIIDDD........." "............IIDDDII............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DDDDDDDDD..........." "............DDDDDDD............" "..............DDD.............." "..............DDD.............." "...........DDDDDDDDD..........." "..........DDDDDDDDDDD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............DDDDDDD............" "...........DD.DDD.DD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD...FDDDF...DD........" ".............DDDDD............." ".............DDDDD............." ".............FDDDF............." "..............DDD.............." "..............................." "..............................." /* icon for state 7 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "............................DD." "......D.....D.........D...DD..." "......DD....DD.......DD..D....." ".......DD....DD.....DD...D....." "........DD....DD...DD....D....." ".........DD...DD..DD....II....." "...FDDF...DD..DD..DD...DII....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "..DDDDDDDDDDDDDDDDDDDDDDDD....." "...FDDF...DD..DD..DD...DII....." ".........DD...DD..DD....II....." "........DD....DD...DD....D....." ".......DD....DD.....DD...D....." "......DD....DD.......DD..D....." "......D.....D.........D...DD..." "............................DD." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............DDD.............." ".............FDDDF............." ".............DDDDD............." ".............DDDDD............." "........DD...FDDDF...DD........" ".........DD...DDD...DD........." "..........DD..DDD..DD.........." "...........DD.DDD.DD..........." "............DDDDDDD............" ".............DDDDD............." "........DD....DDD....DD........" ".........DD...DDD...DD........." "..........DDDDDDDDDDD.........." "...........DDDDDDDDD..........." "..............DDD.............." "..............DDD.............." "............DDDDDDD............" "...........DDDDDDDDD..........." "..........DD..DDD..DD.........." ".........DD...DDD...DD........." "........DD....DDD....DD........" ".............DDDDD............." "............IIDDDII............" ".........DDDIIDDDIIDDD........." "........D.............D........" "........D.............D........" ".......D...............D......." ".......D...............D......." "..............................." /* icon for state 9 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".DD............................" "...DD...D.........D.....D......" ".....D..DD.......DD....DD......" ".....D...DD.....DD....DD......." ".....D....DD...DD....DD........" ".....II....DD..DD...DD........." ".....IID...DD..DD..DD...FDDF..." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....DDDDDDDDDDDDDDDDDDDDDDDD.." ".....IID...DD..DD..DD...FDDF..." ".....II....DD..DD...DD........." ".....D....DD...DD....DD........" ".....D...DD.....DD....DD......." ".....D..DD.......DD....DD......" "...DD...D.........D.....D......" ".DD............................" "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 10 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AACCCCCCCCCCCCCCCCCCCCCCCCAAAAA" "AAAGCCGAAACCAACCAACCAAACIIAAAAA" "AAAAAAAAACCAAACCAACCAAAAIIAAAAA" "AAAAAAAACCAAAACCAAACCAAAACAAAAA" "AAAAAAACCAAAACCAAAAACCAAACAAAAA" "AAAAAACCAAAACCAAAAAAACCAACAAAAA" "AAAAAACAAAAACAAAAAAAAACAAACCAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAACCA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAGCCCGAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAGCCCGAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAAAACCACCCACCAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAAAACCCCCCCCCCCAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAAAACCCAAAAAAAAAAAAAA" "AAAAAAAAAAAACCCCCCCAAAAAAAAAAAA" "AAAAAAAAAAACCCCCCCCCAAAAAAAAAAA" "AAAAAAAAAACCAACCCAACCAAAAAAAAAA" "AAAAAAAAACCAAACCCAAACCAAAAAAAAA" "AAAAAAAACCAAAACCCAAAACCAAAAAAAA" "AAAAAAAAAAAAACCCCCAAAAAAAAAAAAA" "AAAAAAAAAAAAIICCCIIAAAAAAAAAAAA" "AAAAAAAAACCCIICCCIICCCAAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAAACAAAAAAAAAAAAACAAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAACAAAAAAAAAAAAAAACAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAACCCCCCCCCCCCCCCCCCCCCCCCAA" "AAAAAIICAAACCAACCAACCAAAGCCGAAA" "AAAAAIIAAAACCAACCAAACCAAAAAAAAA" "AAAAACAAAACCAAACCAAAACCAAAAAAAA" "AAAAACAAACCAAAAACCAAAACCAAAAAAA" "AAAAACAACCAAAAAAACCAAAACCAAAAAA" "AAACCAAACAAAAAAAAACAAAAACAAAAAA" "ACCAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AADDDDDDDDDDDDDDDDDDDDDDDDAAAAA" "AAAHDDHAAADDAADDAADDAAADIIAAAAA" "AAAAAAAAADDAAADDAADDAAAAIIAAAAA" "AAAAAAAADDAAAADDAAADDAAAADAAAAA" "AAAAAAADDAAAADDAAAAADDAAADAAAAA" "AAAAAADDAAAADDAAAAAAADDAADAAAAA" "AAAAAADAAAAADAAAAAAAAADAAADDAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAADDA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAHDDDHAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAHDDDHAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAAAADDADDDADDAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAAAADDDDDDDDDDDAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAAAADDDAAAAAAAAAAAAAA" "AAAAAAAAAAAADDDDDDDAAAAAAAAAAAA" "AAAAAAAAAAADDDDDDDDDAAAAAAAAAAA" "AAAAAAAAAADDAADDDAADDAAAAAAAAAA" "AAAAAAAAADDAAADDDAAADDAAAAAAAAA" "AAAAAAAADDAAAADDDAAAADDAAAAAAAA" "AAAAAAAAAAAAADDDDDAAAAAAAAAAAAA" "AAAAAAAAAAAAIIDDDIIAAAAAAAAAAAA" "AAAAAAAAADDDIIDDDIIDDDAAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAAADAAAAAAAAAAAAADAAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAADAAAAAAAAAAAAAAADAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAADDDDDDDDDDDDDDDDDDDDDDDDAA" "AAAAAIIDAAADDAADDAADDAAAHDDHAAA" "AAAAAIIAAAADDAADDAAADDAAAAAAAAA" "AAAAADAAAADDAAADDAAAADDAAAAAAAA" "AAAAADAAADDAAAAADDAAAADDAAAAAAA" "AAAAADAADDAAAAAAADDAAAADDAAAAAA" "AAADDAAADAAAAAAAAADAAAAADAAAAAA" "ADDAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "15 255 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 2 */ "....C.....C...." ".....C...C....." "......ICI......" "...C..CCC..C..." "....C..C..C...." ".....CCCCC....." ".......C......." "....CCCCCCC...." "...C...C...C..." ".....CCCCC....." "....C..C..C...." "...C..ECE..C..." "......CCC......" "......ECE......" "..............." /* icon for state 3 */ "..............." "..............." "..............." "...C..C....C..." "....C..C..C...C" ".....C.C.C...C." ".ECE.C.C.C.CI.." ".CCCCCCCCCCCC.." ".ECE.C.C.C.CI.." ".....C.C.C...C." "....C..C..C...C" "...C..C....C..." "..............." "..............." "..............." /* icon for state 4 */ "..............." "......ECE......" "......CCC......" "...C..ECE..C..." "....C..C..C...." ".....CCCCC....." "...C...C...C..." "....CCCCCCC...." ".......C......." ".....CCCCC....." "....C..C..C...." "...C..CCC..C..." "......ICI......" ".....C...C....." "....C.....C...." /* icon for state 5 */ "..............." "..............." "..............." "...C....C..C..." "C...C..C..C...." ".C...C.C.C....." "..IC.C.C.C.ECE." "..CCCCCCCCCCCC." "..IC.C.C.C.ECE." ".C...C.C.C....." "C...C..C..C...." "...C....C..C..." "..............." "..............." "..............." /* icon for state 6 */ "....D.....D...." ".....D...D....." "......IDI......" "...D..DDD..D..." "....D..D..D...." ".....DDDDD....." ".......D......." "....DDDDDDD...." "...D...D...D..." ".....DDDDD....." "....D..D..D...." "...D..FDF..D..." "......DDD......" "......FDF......" "..............." /* icon for state 7 */ "..............." "..............." "..............." "...D..D....D..." "....D..D..D...D" ".....D.D.D...D." ".FDF.D.D.D.DI.." ".DDDDDDDDDDDD.." ".FDF.D.D.D.DI.." ".....D.D.D...D." "....D..D..D...D" "...D..D....D..." "..............." "..............." "..............." /* icon for state 8 */ "..............." "......FDF......" "......DDD......" "...D..FDF..D..." "....D..D..D...." ".....DDDDD....." "...D...D...D..." "....DDDDDDD...." ".......D......." ".....DDDDD....." "....D..D..D...." "...D..DDD..D..." "......IDI......" ".....D...D....." "....D.....D...." /* icon for state 9 */ "..............." "..............." "..............." "...D....D..D..." "D...D..D..D...." ".D...D.D.D....." "..ID.D.D.D.FDF." "..DDDDDDDDDDDD." "..ID.D.D.D.FDF." ".D...D.D.D....." "D...D..D..D...." "...D....D..D..." "..............." "..............." "..............." /* icon for state 10 */ "AAAACAAAAACAAAA" "AAAAACAAACAAAAA" "AAAAAAICIAAAAAA" "AAACAACCCAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAAAAAACAAAAAAA" "AAAACCCCCCCAAAA" "AAACAAACAAACAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAAGCGAACAAA" "AAAAAACCCAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 11 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAACAAAACAAA" "AAAACAACAACAAAC" "AAAAACACACAAACA" "AGCGACACACACIAA" "ACCCCCCCCCCCCAA" "AGCGACACACACIAA" "AAAAACACACAAACA" "AAAACAACAACAAAC" "AAACAACAAAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 12 */ "AAAAAAAAAAAAAAA" "AAAAAAGCGAAAAAA" "AAAAAACCCAAAAAA" "AAACAAGCGAACAAA" "AAAACAACAACAAAA" "AAAAACCCCCAAAAA" "AAACAAACAAACAAA" "AAAACCCCCCCAAAA" "AAAAAAACAAAAAAA" "AAAAACCCCCAAAAA" "AAAACAACAACAAAA" "AAACAACCCAACAAA" "AAAAAAICIAAAAAA" "AAAAACAAACAAAAA" "AAAACAAAAACAAAA" /* icon for state 13 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAACAAAACAACAAA" "CAAACAACAACAAAA" "ACAAACACACAAAAA" "AAICACACACAGCGA" "AACCCCCCCCCCCCA" "AAICACACACAGCGA" "ACAAACACACAAAAA" "CAAACAACAACAAAA" "AAACAAAACAACAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 14 */ "AAAADAAAAADAAAA" "AAAAADAAADAAAAA" "AAAAAAIDIAAAAAA" "AAADAADDDAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAAAAAADAAAAAAA" "AAAADDDDDDDAAAA" "AAADAAADAAADAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAAHDHAADAAA" "AAAAAADDDAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 15 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAADAAAADAAA" "AAAADAADAADAAAD" "AAAAADADADAAADA" "AHDHADADADADIAA" "ADDDDDDDDDDDDAA" "AHDHADADADADIAA" "AAAAADADADAAADA" "AAAADAADAADAAAD" "AAADAADAAAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" /* icon for state 16 */ "AAAAAAAAAAAAAAA" "AAAAAAHDHAAAAAA" "AAAAAADDDAAAAAA" "AAADAAHDHAADAAA" "AAAADAADAADAAAA" "AAAAADDDDDAAAAA" "AAADAAADAAADAAA" "AAAADDDDDDDAAAA" "AAAAAAADAAAAAAA" "AAAAADDDDDAAAAA" "AAAADAADAADAAAA" "AAADAADDDAADAAA" "AAAAAAIDIAAAAAA" "AAAAADAAADAAAAA" "AAAADAAAAADAAAA" /* icon for state 17 */ "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAADAAAADAADAAA" "DAAADAADAADAAAA" "ADAAADADADAAAAA" "AAIDADADADAHDHA" "AADDDDDDDDDDDDA" "AAIDADADADAHDHA" "ADAAADADADAAAAA" "DAAADAADAADAAAA" "AAADAAAADAADAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" "AAAAAAAAAAAAAAA" XPM /* width height num_colors chars_per_pixel */ "7 119 9 1" /* colors */ "A c #009B43" ". c #000000" "C c #7F00FF" "D c #808080" "E c #3F007F" "F c #404040" "G c #3F4DA1" "H c #408D61" "I c #FFFFFF" /* icon for state 1 */ "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" "AAAAAAA" /* icon for state 2 */ ".C...C." "..ICI.." "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." /* icon for state 3 */ "......." ".C.C..C" ".C.C.I." "CCCCCC." ".C.C.I." ".C.C..C" "......." /* icon for state 4 */ "...C..." ".CCCCC." "...C..." ".CCCCC." "...C..." "..ICI.." ".C...C." /* icon for state 5 */ "......." "C..C.C." ".I.C.C." ".CCCCCC" ".I.C.C." "C..C.C." "......." /* icon for state 6 */ ".D...D." "..IDI.." "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." /* icon for state 7 */ "......." ".D.D..D" ".D.D.I." "DDDDDD." ".D.D.I." ".D.D..D" "......." /* icon for state 8 */ "...D..." ".DDDDD." "...D..." ".DDDDD." "...D..." "..IDI.." ".D...D." /* icon for state 9 */ "......." "D..D.D." ".I.D.D." ".DDDDDD" ".I.D.D." "D..D.D." "......." /* icon for state 10 */ "ACAAACA" "AAICIAA" "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" /* icon for state 11 */ "AAAAAAA" "ACACAAC" "ACACAIA" "CCCCCCA" "ACACAIA" "ACACAAC" "AAAAAAA" /* icon for state 12 */ "AAACAAA" "ACCCCCA" "AAACAAA" "ACCCCCA" "AAACAAA" "AAICIAA" "ACAAACA" /* icon for state 13 */ "AAAAAAA" "CAACACA" "AIACACA" "ACCCCCC" "AIACACA" "CAACACA" "AAAAAAA" /* icon for state 14 */ "ADAAADA" "AAIDIAA" "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" /* icon for state 15 */ "AAAAAAA" "ADADAAD" "ADADAIA" "DDDDDDA" "ADADAIA" "ADADAAD" "AAAAAAA" /* icon for state 16 */ "AAADAAA" "ADDDDDA" "AAADAAA" "ADDDDDA" "AAADAAA" "AAIDIAA" "ADAAADA" /* icon for state 17 */ "AAAAAAA" "DAADADA" "AIADADA" "ADDDDDD" "AIADADA" "DAADADA" "AAAAAAA" golly-2.5-src/Rules/WireWorld.rule0000644000175100001440000000605612156145314014123 00000000000000@RULE WireWorld A 4-state CA created by Brian Silverman. WireWorld models the flow of currents in wires and makes it relatively easy to build logic gates and other digital circuits. @TABLE # Golly rule-table format. # Each rule: C,N,NE,E,SE,S,SW,W,NW,C' # # Default for transitions not listed: no change # # Variables are bound within each transition. # For example, if a={1,2} then 4,a,0->a represents # two transitions: 4,1,0->1 and 4,2,0->2 # (This is why we need to repeat the variables below. # In this case the method isn't really helping.) n_states:4 neighborhood:Moore symmetries:rotate8 var a={0,1,2,3} var b={0,1,2,3} var c={0,1,2,3} var d={0,1,2,3} var e={0,1,2,3} var f={0,1,2,3} var g={0,1,2,3} var h={0,1,2,3} var i={0,2,3} var j={0,2,3} var k={0,2,3} var l={0,2,3} var m={0,2,3} var n={0,2,3} 1,a,b,c,d,e,f,g,h,2 2,a,b,c,d,e,f,g,h,3 3,i,j,k,l,m,n,a,1,1 3,i,j,k,l,m,1,n,1,1 3,i,j,k,l,1,m,n,1,1 3,i,j,k,1,l,m,n,1,1 @NAMES # these state names are not yet used by Golly 0 empty 1 electron tail 2 electron head 3 copper wire @COLORS # same colors used at http://www.quinapalus.com/wi-index.html 0 48 48 48 dark gray 1 0 128 255 light blue 2 255 255 255 white 3 255 128 0 orange @ICONS # icon info is in XPM format (order is not important) XPM /* width height num_colors chars_per_pixel */ "31 31 5 1" /* colors */ ". c #000000" "D c #404040" "C c #808080" "B c #C0C0C0" "W c #FFFFFF" /* pixels */ "..............................." "..............................." "..........DCBWWWWWBCD.........." ".........CWWWWWWWWWWWC........." ".......DWWWWWWWWWWWWWWWD......." "......BWWWWWWWWWWWWWWWWWB......" ".....BWWWWWWWWWWWWWWWWWWWB....." "....DWWWWWWWWWWWWWWWWWWWWWD...." "....WWWWWWWWWWWWWWWWWWWWWWW...." "...CWWWWWWWWWWWWWWWWWWWWWWWC..." "..DWWWWWWWWWWWWWWWWWWWWWWWWWD.." "..CWWWWWWWWWWWWWWWWWWWWWWWWWC.." "..BWWWWWWWWWWWWWWWWWWWWWWWWWB.." "..WWWWWWWWWWWWWWWWWWWWWWWWWWW.." "..WWWWWWWWWWWWWWWWWWWWWWWWWWW.." "..WWWWWWWWWWWWWWWWWWWWWWWWWWW.." "..WWWWWWWWWWWWWWWWWWWWWWWWWWW.." "..WWWWWWWWWWWWWWWWWWWWWWWWWWW.." "..BWWWWWWWWWWWWWWWWWWWWWWWWWB.." "..CWWWWWWWWWWWWWWWWWWWWWWWWWC.." "..DWWWWWWWWWWWWWWWWWWWWWWWWWD.." "...CWWWWWWWWWWWWWWWWWWWWWWWC..." "....WWWWWWWWWWWWWWWWWWWWWWW...." "....DWWWWWWWWWWWWWWWWWWWWWD...." ".....BWWWWWWWWWWWWWWWWWWWB....." "......BWWWWWWWWWWWWWWWWWB......" ".......DWWWWWWWWWWWWWWWD......." ".........CWWWWWWWWWWWC........." "..........DCBWWWWWBCD.........." "..............................." "..............................." XPM /* width height num_colors chars_per_pixel */ "15 15 4 1" /* colors */ ". c #000000" "D c #404040" "B c #C0C0C0" "W c #FFFFFF" /* pixels */ "..............." "....DBWWWBD...." "...BWWWWWWWB..." "..BWWWWWWWWWB.." ".DWWWWWWWWWWWD." ".BWWWWWWWWWWWB." ".WWWWWWWWWWWWW." ".WWWWWWWWWWWWW." ".WWWWWWWWWWWWW." ".BWWWWWWWWWWWB." ".DWWWWWWWWWWWD." "..BWWWWWWWWWB.." "...BWWWWWWWB..." "....DBWWWBD...." "..............." XPM /* width height num_colors chars_per_pixel */ "7 7 4 1" /* colors */ ". c #000000" "D c #404040" "E c #E0E0E0" "W c #FFFFFF" /* pixels */ ".DEWED." "DWWWWWD" "EWWWWWE" "WWWWWWW" "EWWWWWE" "DWWWWWD" ".DEWED." golly-2.5-src/Rules/Worm-1040512.rule0000644000175100001440000001125112156145314013734 00000000000000@RULE Worm-1040512 Paterson's worms (by Dean Hickerson, 11/19/2008) Pattern #055 Sven Kahrkling's notation 1040512 Gardner's notation 1a2c3cbaa4b Finishes after 569804 steps, almost filling a regular hexagon. Points and lines of hexagonal grid are mapped to points of square grid as below. "*" is a point of the hex grid, "-", "/", and "\" are lines of the hex grid. +--+--+--+--+ |- |* |- |* | +--+--+--+--+ | /| \| /| \| +--+--+--+--+ |* |- |* |- | +--+--+--+--+ Each step of the worm is simulated by 2 gens in the rule. In even gens, there's an arrow at one point of the hex grid showing which way the worm will move next. In odd gens, there's an arrow on one line of the hex grid. The transitions from even to odd gens are the same for all worms. Those from odd to even depend on the specific type of worm: If a point (state 0 or 1) has a line with an arrow pointing at it, it becomes a 'point with arrow'; the direction depends on the 6 neighboring lines, which are the NW, N, E, S, SW, and W neighbors in the square grid. Gen 0 consists of a single point in state 1, a 'point with arrow' pointing east. (Starting with a point in state 2, 3, 4, 5, or 6 would also work, rotating the whole pattern.) States are: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var point={1,2,3,4,5,6} var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var n={8,11,14} var o={8,11,14} var p={8,11,14} var q={8,11,14} var b={0,7} # point with arrow becomes point that's been visited point,a0,a1,a2,a3,a4,a5,a6,a7,7 # line with arrow becomes line without arrow 9,a0,a1,a2,a3,a4,a5,a6,a7,8 10,a0,a1,a2,a3,a4,a5,a6,a7,8 12,a0,a1,a2,a3,a4,a5,a6,a7,11 13,a0,a1,a2,a3,a4,a5,a6,a7,11 15,a0,a1,a2,a3,a4,a5,a6,a7,14 16,a0,a1,a2,a3,a4,a5,a6,a7,14 # point with arrow creates line with arrow next to it 0,a0,a1,a2,a3,a4,a5,1,a6,9 0,2,a0,a1,a2,a3,a4,a5,a6,15 0,a0,3,a1,a2,a3,a4,a5,a6,13 0,a0,a1,4,a2,a3,a4,a5,a6,10 0,a0,a1,a2,5,a3,a4,a5,a6,16 0,a0,a1,a2,a3,6,a4,a5,a6,12 # 4 eaten: use only remaining direction # 0 (straight): b,0,a0,n,a1,o,12,p,q,6 b,n,a0,0,a1,o,p,9,q,1 b,n,a0,o,a1,0,p,q,15,2 b,13,a0,n,a1,o,0,p,q,3 b,n,a0,10,a1,o,p,0,q,4 b,n,a0,o,a1,16,p,q,0,5 # 1 (gentle right): b,n,a0,0,a1,o,12,p,q,1 b,n,a0,o,a1,0,p,9,q,2 b,n,a0,o,a1,p,0,q,15,3 b,13,a0,n,a1,o,p,0,q,4 b,n,a0,10,a1,o,p,q,0,5 b,0,a0,n,a1,16,o,p,q,6 # 2 (sharp right): b,n,a0,o,a1,0,12,p,q,2 b,n,a0,o,a1,p,0,9,q,3 b,n,a0,o,a1,p,q,0,15,4 b,13,a0,n,a1,o,p,q,0,5 b,0,a0,10,a1,n,o,p,q,6 b,n,a0,0,a1,16,o,p,q,1 # 4 (sharp left): b,n,a0,o,a1,p,12,0,q,4 b,n,a0,o,a1,p,q,9,0,5 b,0,a0,n,a1,o,p,q,15,6 b,13,a0,0,a1,n,o,p,q,1 b,n,a0,10,a1,0,o,p,q,2 b,n,a0,o,a1,16,0,p,q,3 # 5 (gentle left): b,n,a0,o,a1,p,12,q,0,5 b,0,a0,n,a1,o,p,9,q,6 b,n,a0,0,a1,o,p,q,15,1 b,13,a0,n,a1,0,o,p,q,2 b,n,a0,10,a1,o,0,p,q,3 b,n,a0,o,a1,16,p,0,q,4 # rule-specific transitions at point with arrow coming in # rule 1040512 # none eaten: 1 = gentle right b,0,a0,0,a1,0,12,0,0,1 b,0,a0,0,a1,0,0,9,0,2 b,0,a0,0,a1,0,0,0,15,3 b,13,a0,0,a1,0,0,0,0,4 b,0,a0,10,a1,0,0,0,0,5 b,0,a0,0,a1,16,0,0,0,6 # 1 eaten(1): 0 = straight b,0,a0,n,a1,0,12,0,0,6 b,0,a0,0,a1,n,0,9,0,1 b,0,a0,0,a1,0,n,0,15,2 b,13,a0,0,a1,0,0,n,0,3 b,0,a0,10,a1,0,0,0,n,4 b,n,a0,0,a1,16,0,0,0,5 # 2 eaten(02): 4 = sharp left b,n,a0,0,a1,o,12,0,0,4 b,0,a0,n,a1,0,o,9,0,5 b,0,a0,0,a1,n,0,o,15,6 b,13,a0,0,a1,0,n,0,o,1 b,o,a0,10,a1,0,0,n,0,2 b,0,a0,o,a1,16,0,0,n,3 # 2 eaten(15): 0 = straight b,0,a0,o,a1,0,12,0,n,6 b,n,a0,0,a1,o,0,9,0,1 b,0,a0,n,a1,0,o,0,15,2 b,13,a0,0,a1,n,0,o,0,3 b,0,a0,10,a1,0,n,0,o,4 b,o,a0,0,a1,16,0,n,0,5 # 2 eaten(24): 5 = gentle left b,0,a0,0,a1,n,12,o,0,5 b,0,a0,0,a1,0,n,9,o,6 b,o,a0,0,a1,0,0,n,15,1 b,13,a0,o,a1,0,0,0,n,2 b,n,a0,10,a1,o,0,0,0,3 b,0,a0,n,a1,16,o,0,0,4 # 2 eaten(04): 1 = gentle right b,n,a0,0,a1,0,12,o,0,1 b,0,a0,n,a1,0,0,9,o,2 b,o,a0,0,a1,n,0,0,15,3 b,13,a0,o,a1,0,n,0,0,4 b,0,a0,10,a1,o,0,n,0,5 b,0,a0,0,a1,16,o,0,n,6 # 3 eaten(145): 2 = sharp right b,0,a0,n,a1,0,12,o,p,2 b,p,a0,0,a1,n,0,9,o,3 b,o,a0,p,a1,0,n,0,15,4 b,13,a0,o,a1,p,0,n,0,5 b,0,a0,10,a1,o,p,0,n,6 b,n,a0,0,a1,16,o,p,0,1 golly-2.5-src/Rules/Worm-1042015.rule0000644000175100001440000001127212156145314013737 00000000000000@RULE Worm-1042015 Paterson's worms (by Dean Hickerson, 11/20/2008) Pattern #061 Sven Kahrkling's notation 1042015 Gardner's notation 1a2c3caca4a Final outcome unknown; doesn't finish within 1.3*10^18 steps. Very chaotic. Points and lines of hexagonal grid are mapped to points of square grid as below. "*" is a point of the hex grid, "-", "/", and "\" are lines of the hex grid. +--+--+--+--+ |- |* |- |* | +--+--+--+--+ | /| \| /| \| +--+--+--+--+ |* |- |* |- | +--+--+--+--+ Each step of the worm is simulated by 2 gens in the rule. In even gens, there's an arrow at one point of the hex grid showing which way the worm will move next. In odd gens, there's an arrow on one line of the hex grid. The transitions from even to odd gens are the same for all worms. Those from odd to even depend on the specific type of worm: If a point (state 0 or 1) has a line with an arrow pointing at it, it becomes a 'point with arrow'; the direction depends on the 6 neighboring lines, which are the NW, N, E, S, SW, and W neighbors in the square grid. Gen 0 consists of a single point in state 1, a 'point with arrow' pointing east. (Starting with a point in state 2, 3, 4, 5, or 6 would also work, rotating the whole pattern.) States are: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var point={1,2,3,4,5,6} var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var n={8,11,14} var o={8,11,14} var p={8,11,14} var q={8,11,14} var b={0,7} # point with arrow becomes point that's been visited point,a0,a1,a2,a3,a4,a5,a6,a7,7 # line with arrow becomes line without arrow 9,a0,a1,a2,a3,a4,a5,a6,a7,8 10,a0,a1,a2,a3,a4,a5,a6,a7,8 12,a0,a1,a2,a3,a4,a5,a6,a7,11 13,a0,a1,a2,a3,a4,a5,a6,a7,11 15,a0,a1,a2,a3,a4,a5,a6,a7,14 16,a0,a1,a2,a3,a4,a5,a6,a7,14 # point with arrow creates line with arrow next to it 0,a0,a1,a2,a3,a4,a5,1,a6,9 0,2,a0,a1,a2,a3,a4,a5,a6,15 0,a0,3,a1,a2,a3,a4,a5,a6,13 0,a0,a1,4,a2,a3,a4,a5,a6,10 0,a0,a1,a2,5,a3,a4,a5,a6,16 0,a0,a1,a2,a3,6,a4,a5,a6,12 # 4 eaten: use only remaining direction # 0 (straight): b,0,a0,n,a1,o,12,p,q,6 b,n,a0,0,a1,o,p,9,q,1 b,n,a0,o,a1,0,p,q,15,2 b,13,a0,n,a1,o,0,p,q,3 b,n,a0,10,a1,o,p,0,q,4 b,n,a0,o,a1,16,p,q,0,5 # 1 (gentle right): b,n,a0,0,a1,o,12,p,q,1 b,n,a0,o,a1,0,p,9,q,2 b,n,a0,o,a1,p,0,q,15,3 b,13,a0,n,a1,o,p,0,q,4 b,n,a0,10,a1,o,p,q,0,5 b,0,a0,n,a1,16,o,p,q,6 # 2 (sharp right): b,n,a0,o,a1,0,12,p,q,2 b,n,a0,o,a1,p,0,9,q,3 b,n,a0,o,a1,p,q,0,15,4 b,13,a0,n,a1,o,p,q,0,5 b,0,a0,10,a1,n,o,p,q,6 b,n,a0,0,a1,16,o,p,q,1 # 4 (sharp left): b,n,a0,o,a1,p,12,0,q,4 b,n,a0,o,a1,p,q,9,0,5 b,0,a0,n,a1,o,p,q,15,6 b,13,a0,0,a1,n,o,p,q,1 b,n,a0,10,a1,0,o,p,q,2 b,n,a0,o,a1,16,0,p,q,3 # 5 (gentle left): b,n,a0,o,a1,p,12,q,0,5 b,0,a0,n,a1,o,p,9,q,6 b,n,a0,0,a1,o,p,q,15,1 b,13,a0,n,a1,0,o,p,q,2 b,n,a0,10,a1,o,0,p,q,3 b,n,a0,o,a1,16,p,0,q,4 # rule-specific transitions at point with arrow coming in # rule 1042015 # none eaten: 1 = gentle right b,0,a0,0,a1,0,12,0,0,1 b,0,a0,0,a1,0,0,9,0,2 b,0,a0,0,a1,0,0,0,15,3 b,13,a0,0,a1,0,0,0,0,4 b,0,a0,10,a1,0,0,0,0,5 b,0,a0,0,a1,16,0,0,0,6 # 1 eaten(1): 0 = straight b,0,a0,n,a1,0,12,0,0,6 b,0,a0,0,a1,n,0,9,0,1 b,0,a0,0,a1,0,n,0,15,2 b,13,a0,0,a1,0,0,n,0,3 b,0,a0,10,a1,0,0,0,n,4 b,n,a0,0,a1,16,0,0,0,5 # 2 eaten(02): 4 = sharp left b,n,a0,0,a1,o,12,0,0,4 b,0,a0,n,a1,0,o,9,0,5 b,0,a0,0,a1,n,0,o,15,6 b,13,a0,0,a1,0,n,0,o,1 b,o,a0,10,a1,0,0,n,0,2 b,0,a0,o,a1,16,0,0,n,3 # 2 eaten(15): 2 = sharp right b,0,a0,o,a1,0,12,0,n,2 b,n,a0,0,a1,o,0,9,0,3 b,0,a0,n,a1,0,o,0,15,4 b,13,a0,0,a1,n,0,o,0,5 b,0,a0,10,a1,0,n,0,o,6 b,o,a0,0,a1,16,0,n,0,1 # 2 eaten(24): 0 = straight b,0,a0,0,a1,n,12,o,0,6 b,0,a0,0,a1,0,n,9,o,1 b,o,a0,0,a1,0,0,n,15,2 b,13,a0,o,a1,0,0,0,n,3 b,n,a0,10,a1,o,0,0,0,4 b,0,a0,n,a1,16,o,0,0,5 # 2 eaten(04): 1 = gentle right b,n,a0,0,a1,0,12,o,0,1 b,0,a0,n,a1,0,0,9,o,2 b,o,a0,0,a1,n,0,0,15,3 b,13,a0,o,a1,0,n,0,0,4 b,0,a0,10,a1,o,0,n,0,5 b,0,a0,0,a1,16,o,0,n,6 # 3 eaten(124): 5 = gentle left b,0,a0,n,a1,o,12,p,0,5 b,0,a0,0,a1,n,o,9,p,6 b,p,a0,0,a1,0,n,o,15,1 b,13,a0,p,a1,0,0,n,o,2 b,o,a0,10,a1,p,0,0,n,3 b,n,a0,o,a1,16,p,0,0,4 golly-2.5-src/Rules/Worm-1042020.rule0000644000175100001440000001122012156145314013724 00000000000000@RULE Worm-1042020 Paterson's worms (by Dean Hickerson, 11/25/2008) Pattern #062a Sven Kahrkling's notation 1042020 Gardner's notation 1a2c3aaca4a Finishes after 57,493,855,205,939 steps. Points and lines of hexagonal grid are mapped to points of square grid as below. "*" is a point of the hex grid, "-", "/", and "\" are lines of the hex grid. +--+--+--+--+ |- |* |- |* | +--+--+--+--+ | /| \| /| \| +--+--+--+--+ |* |- |* |- | +--+--+--+--+ Each step of the worm is simulated by 2 gens in the rule. In even gens, there's an arrow at one point of the hex grid showing which way the worm will move next. In odd gens, there's an arrow on one line of the hex grid. The transitions from even to odd gens are the same for all worms. Those from odd to even depend on the specific type of worm: If a point (state 0 or 1) has a line with an arrow pointing at it, it becomes a 'point with arrow'; the direction depends on the 6 neighboring lines, which are the NW, N, E, S, SW, and W neighbors in the square grid. Gen 0 consists of a single point in state 1, a 'point with arrow' pointing east. (Starting with a point in state 2, 3, 4, 5, or 6 would also work, rotating the whole pattern.) States are: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var point={1,2,3,4,5,6} var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var n={8,11,14} var o={8,11,14} var p={8,11,14} var q={8,11,14} var b={0,7} # point with arrow becomes point that's been visited point,a0,a1,a2,a3,a4,a5,a6,a7,7 # line with arrow becomes line without arrow 9,a0,a1,a2,a3,a4,a5,a6,a7,8 10,a0,a1,a2,a3,a4,a5,a6,a7,8 12,a0,a1,a2,a3,a4,a5,a6,a7,11 13,a0,a1,a2,a3,a4,a5,a6,a7,11 15,a0,a1,a2,a3,a4,a5,a6,a7,14 16,a0,a1,a2,a3,a4,a5,a6,a7,14 # point with arrow creates line with arrow next to it 0,a0,a1,a2,a3,a4,a5,1,a6,9 0,2,a0,a1,a2,a3,a4,a5,a6,15 0,a0,3,a1,a2,a3,a4,a5,a6,13 0,a0,a1,4,a2,a3,a4,a5,a6,10 0,a0,a1,a2,5,a3,a4,a5,a6,16 0,a0,a1,a2,a3,6,a4,a5,a6,12 # 4 eaten: use only remaining direction # 0 (straight): b,0,a0,n,a1,o,12,p,q,6 b,n,a0,0,a1,o,p,9,q,1 b,n,a0,o,a1,0,p,q,15,2 b,13,a0,n,a1,o,0,p,q,3 b,n,a0,10,a1,o,p,0,q,4 b,n,a0,o,a1,16,p,q,0,5 # 1 (gentle right): b,n,a0,0,a1,o,12,p,q,1 b,n,a0,o,a1,0,p,9,q,2 b,n,a0,o,a1,p,0,q,15,3 b,13,a0,n,a1,o,p,0,q,4 b,n,a0,10,a1,o,p,q,0,5 b,0,a0,n,a1,16,o,p,q,6 # 2 (sharp right): b,n,a0,o,a1,0,12,p,q,2 b,n,a0,o,a1,p,0,9,q,3 b,n,a0,o,a1,p,q,0,15,4 b,13,a0,n,a1,o,p,q,0,5 b,0,a0,10,a1,n,o,p,q,6 b,n,a0,0,a1,16,o,p,q,1 # 4 (sharp left): b,n,a0,o,a1,p,12,0,q,4 b,n,a0,o,a1,p,q,9,0,5 b,0,a0,n,a1,o,p,q,15,6 b,13,a0,0,a1,n,o,p,q,1 b,n,a0,10,a1,0,o,p,q,2 b,n,a0,o,a1,16,0,p,q,3 # 5 (gentle left): b,n,a0,o,a1,p,12,q,0,5 b,0,a0,n,a1,o,p,9,q,6 b,n,a0,0,a1,o,p,q,15,1 b,13,a0,n,a1,0,o,p,q,2 b,n,a0,10,a1,o,0,p,q,3 b,n,a0,o,a1,16,p,0,q,4 # rule-specific transitions at point with arrow coming in # rule 1042020 # none eaten: 1 = gentle right b,0,a0,0,a1,0,12,0,0,1 b,0,a0,0,a1,0,0,9,0,2 b,0,a0,0,a1,0,0,0,15,3 b,13,a0,0,a1,0,0,0,0,4 b,0,a0,10,a1,0,0,0,0,5 b,0,a0,0,a1,16,0,0,0,6 # 1 eaten(1): 0 = straight b,0,a0,n,a1,0,12,0,0,6 b,0,a0,0,a1,n,0,9,0,1 b,0,a0,0,a1,0,n,0,15,2 b,13,a0,0,a1,0,0,n,0,3 b,0,a0,10,a1,0,0,0,n,4 b,n,a0,0,a1,16,0,0,0,5 # 2 eaten(02): 4 = sharp left b,n,a0,0,a1,o,12,0,0,4 b,0,a0,n,a1,0,o,9,0,5 b,0,a0,0,a1,n,0,o,15,6 b,13,a0,0,a1,0,n,0,o,1 b,o,a0,10,a1,0,0,n,0,2 b,0,a0,o,a1,16,0,0,n,3 # 2 eaten(15): 2 = sharp right b,0,a0,o,a1,0,12,0,n,2 b,n,a0,0,a1,o,0,9,0,3 b,0,a0,n,a1,0,o,0,15,4 b,13,a0,0,a1,n,0,o,0,5 b,0,a0,10,a1,0,n,0,o,6 b,o,a0,0,a1,16,0,n,0,1 # 2 eaten(24): 0 = straight b,0,a0,0,a1,n,12,o,0,6 b,0,a0,0,a1,0,n,9,o,1 b,o,a0,0,a1,0,0,n,15,2 b,13,a0,o,a1,0,0,0,n,3 b,n,a0,10,a1,o,0,0,0,4 b,0,a0,n,a1,16,o,0,0,5 # 2 eaten(04): 2 = sharp right b,n,a0,0,a1,0,12,o,0,2 b,0,a0,n,a1,0,0,9,o,3 b,o,a0,0,a1,n,0,0,15,4 b,13,a0,o,a1,0,n,0,0,5 b,0,a0,10,a1,o,0,n,0,6 b,0,a0,0,a1,16,o,0,n,1 # 3 eaten(145): 0 = straight b,0,a0,n,a1,0,12,o,p,6 b,p,a0,0,a1,n,0,9,o,1 b,o,a0,p,a1,0,n,0,15,2 b,13,a0,o,a1,p,0,n,0,3 b,0,a0,10,a1,o,p,0,n,4 b,n,a0,0,a1,16,o,p,0,5 golly-2.5-src/Rules/Worm-1252121.rule0000644000175100001440000001135112156145314013736 00000000000000@RULE Worm-1252121 Paterson's worms (by Dean Hickerson, 11/20/2008) Pattern #155 Sven Kahrkling's notation 1252121 Gardner's notation 1a2d3cbcc4b Final outcome unknown; doesn't finish within 1.1*10^17 steps. Forms almost full regular hexagons at certain times. Points and lines of hexagonal grid are mapped to points of square grid as below. "*" is a point of the hex grid, "-", "/", and "\" are lines of the hex grid. +--+--+--+--+ |- |* |- |* | +--+--+--+--+ | /| \| /| \| +--+--+--+--+ |* |- |* |- | +--+--+--+--+ Each step of the worm is simulated by 2 gens in the rule. In even gens, there's an arrow at one point of the hex grid showing which way the worm will move next. In odd gens, there's an arrow on one line of the hex grid. The transitions from even to odd gens are the same for all worms. Those from odd to even depend on the specific type of worm: If a point (state 0 or 1) has a line with an arrow pointing at it, it becomes a 'point with arrow'; the direction depends on the 6 neighboring lines, which are the NW, N, E, S, SW, and W neighbors in the square grid. Gen 0 consists of a single point in state 1, a 'point with arrow' pointing east. (Starting with a point in state 2, 3, 4, 5, or 6 would also work, rotating the whole pattern.) States are: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var point={1,2,3,4,5,6} var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var n={8,11,14} var o={8,11,14} var p={8,11,14} var q={8,11,14} var b={0,7} # point with arrow becomes point that's been visited point,a0,a1,a2,a3,a4,a5,a6,a7,7 # line with arrow becomes line without arrow 9,a0,a1,a2,a3,a4,a5,a6,a7,8 10,a0,a1,a2,a3,a4,a5,a6,a7,8 12,a0,a1,a2,a3,a4,a5,a6,a7,11 13,a0,a1,a2,a3,a4,a5,a6,a7,11 15,a0,a1,a2,a3,a4,a5,a6,a7,14 16,a0,a1,a2,a3,a4,a5,a6,a7,14 # point with arrow creates line with arrow next to it 0,a0,a1,a2,a3,a4,a5,1,a6,9 0,2,a0,a1,a2,a3,a4,a5,a6,15 0,a0,3,a1,a2,a3,a4,a5,a6,13 0,a0,a1,4,a2,a3,a4,a5,a6,10 0,a0,a1,a2,5,a3,a4,a5,a6,16 0,a0,a1,a2,a3,6,a4,a5,a6,12 # 4 eaten: use only remaining direction # 0 (straight): b,0,a0,n,a1,o,12,p,q,6 b,n,a0,0,a1,o,p,9,q,1 b,n,a0,o,a1,0,p,q,15,2 b,13,a0,n,a1,o,0,p,q,3 b,n,a0,10,a1,o,p,0,q,4 b,n,a0,o,a1,16,p,q,0,5 # 1 (gentle right): b,n,a0,0,a1,o,12,p,q,1 b,n,a0,o,a1,0,p,9,q,2 b,n,a0,o,a1,p,0,q,15,3 b,13,a0,n,a1,o,p,0,q,4 b,n,a0,10,a1,o,p,q,0,5 b,0,a0,n,a1,16,o,p,q,6 # 2 (sharp right): b,n,a0,o,a1,0,12,p,q,2 b,n,a0,o,a1,p,0,9,q,3 b,n,a0,o,a1,p,q,0,15,4 b,13,a0,n,a1,o,p,q,0,5 b,0,a0,10,a1,n,o,p,q,6 b,n,a0,0,a1,16,o,p,q,1 # 4 (sharp left): b,n,a0,o,a1,p,12,0,q,4 b,n,a0,o,a1,p,q,9,0,5 b,0,a0,n,a1,o,p,q,15,6 b,13,a0,0,a1,n,o,p,q,1 b,n,a0,10,a1,0,o,p,q,2 b,n,a0,o,a1,16,0,p,q,3 # 5 (gentle left): b,n,a0,o,a1,p,12,q,0,5 b,0,a0,n,a1,o,p,9,q,6 b,n,a0,0,a1,o,p,q,15,1 b,13,a0,n,a1,0,o,p,q,2 b,n,a0,10,a1,o,0,p,q,3 b,n,a0,o,a1,16,p,0,q,4 # rule-specific transitions at point with arrow coming in # rule 1252121 # none eaten: 1 = gentle right b,0,a0,0,a1,0,12,0,0,1 b,0,a0,0,a1,0,0,9,0,2 b,0,a0,0,a1,0,0,0,15,3 b,13,a0,0,a1,0,0,0,0,4 b,0,a0,10,a1,0,0,0,0,5 b,0,a0,0,a1,16,0,0,0,6 # 1 eaten(1): 2 = sharp right b,0,a0,n,a1,0,12,0,0,2 b,0,a0,0,a1,n,0,9,0,3 b,0,a0,0,a1,0,n,0,15,4 b,13,a0,0,a1,0,0,n,0,5 b,0,a0,10,a1,0,0,0,n,6 b,n,a0,0,a1,16,0,0,0,1 # 2 eaten(24): 5 = gentle left b,0,a0,0,a1,n,12,o,0,5 b,0,a0,0,a1,0,n,9,o,6 b,o,a0,0,a1,0,0,n,15,1 b,13,a0,o,a1,0,0,0,n,2 b,n,a0,10,a1,o,0,0,0,3 b,0,a0,n,a1,16,o,0,0,4 # 3 eaten(045): 2 = sharp right b,n,a0,0,a1,0,12,o,p,2 b,p,a0,n,a1,0,0,9,o,3 b,o,a0,p,a1,n,0,0,15,4 b,13,a0,o,a1,p,n,0,0,5 b,0,a0,10,a1,o,p,n,0,6 b,0,a0,0,a1,16,o,p,n,1 # 2 eaten(04): 1 = gentle right b,n,a0,0,a1,0,12,o,0,1 b,0,a0,n,a1,0,0,9,o,2 b,o,a0,0,a1,n,0,0,15,3 b,13,a0,o,a1,0,n,0,0,4 b,0,a0,10,a1,o,0,n,0,5 b,0,a0,0,a1,16,o,0,n,6 # 2 eaten(15): 2 = sharp right b,0,a0,o,a1,0,12,0,n,2 b,n,a0,0,a1,o,0,9,0,3 b,0,a0,n,a1,0,o,0,15,4 b,13,a0,0,a1,n,0,o,0,5 b,0,a0,10,a1,0,n,0,o,6 b,o,a0,0,a1,16,0,n,0,1 # 2 eaten(02): 1 = gentle right b,n,a0,0,a1,o,12,0,0,1 b,0,a0,n,a1,0,o,9,0,2 b,0,a0,0,a1,n,0,o,15,3 b,13,a0,0,a1,0,n,0,o,4 b,o,a0,10,a1,0,0,n,0,5 b,0,a0,o,a1,16,0,0,n,6 golly-2.5-src/Rules/Worm-1525115.rule0000644000175100001440000001135112156145314013744 00000000000000@RULE Worm-1525115 Paterson's worms (by Dean Hickerson, 11/24/2008) Pattern #322 Sven Kahrkling's notation 1525115 Gardner's notation 1a2b3cbcc4a Final outcome unknown; doesn't finish within 1.4*10^17 steps. Forms almost full regular hexagons at certain times. Points and lines of hexagonal grid are mapped to points of square grid as below. "*" is a point of the hex grid, "-", "/", and "\" are lines of the hex grid. +--+--+--+--+ |- |* |- |* | +--+--+--+--+ | /| \| /| \| +--+--+--+--+ |* |- |* |- | +--+--+--+--+ Each step of the worm is simulated by 2 gens in the rule. In even gens, there's an arrow at one point of the hex grid showing which way the worm will move next. In odd gens, there's an arrow on one line of the hex grid. The transitions from even to odd gens are the same for all worms. Those from odd to even depend on the specific type of worm: If a point (state 0 or 1) has a line with an arrow pointing at it, it becomes a 'point with arrow'; the direction depends on the 6 neighboring lines, which are the NW, N, E, S, SW, and W neighbors in the square grid. Gen 0 consists of a single point in state 1, a 'point with arrow' pointing east. (Starting with a point in state 2, 3, 4, 5, or 6 would also work, rotating the whole pattern.) States are: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var point={1,2,3,4,5,6} var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var n={8,11,14} var o={8,11,14} var p={8,11,14} var q={8,11,14} var b={0,7} # point with arrow becomes point that's been visited point,a0,a1,a2,a3,a4,a5,a6,a7,7 # line with arrow becomes line without arrow 9,a0,a1,a2,a3,a4,a5,a6,a7,8 10,a0,a1,a2,a3,a4,a5,a6,a7,8 12,a0,a1,a2,a3,a4,a5,a6,a7,11 13,a0,a1,a2,a3,a4,a5,a6,a7,11 15,a0,a1,a2,a3,a4,a5,a6,a7,14 16,a0,a1,a2,a3,a4,a5,a6,a7,14 # point with arrow creates line with arrow next to it 0,a0,a1,a2,a3,a4,a5,1,a6,9 0,2,a0,a1,a2,a3,a4,a5,a6,15 0,a0,3,a1,a2,a3,a4,a5,a6,13 0,a0,a1,4,a2,a3,a4,a5,a6,10 0,a0,a1,a2,5,a3,a4,a5,a6,16 0,a0,a1,a2,a3,6,a4,a5,a6,12 # 4 eaten: use only remaining direction # 0 (straight): b,0,a0,n,a1,o,12,p,q,6 b,n,a0,0,a1,o,p,9,q,1 b,n,a0,o,a1,0,p,q,15,2 b,13,a0,n,a1,o,0,p,q,3 b,n,a0,10,a1,o,p,0,q,4 b,n,a0,o,a1,16,p,q,0,5 # 1 (gentle right): b,n,a0,0,a1,o,12,p,q,1 b,n,a0,o,a1,0,p,9,q,2 b,n,a0,o,a1,p,0,q,15,3 b,13,a0,n,a1,o,p,0,q,4 b,n,a0,10,a1,o,p,q,0,5 b,0,a0,n,a1,16,o,p,q,6 # 2 (sharp right): b,n,a0,o,a1,0,12,p,q,2 b,n,a0,o,a1,p,0,9,q,3 b,n,a0,o,a1,p,q,0,15,4 b,13,a0,n,a1,o,p,q,0,5 b,0,a0,10,a1,n,o,p,q,6 b,n,a0,0,a1,16,o,p,q,1 # 4 (sharp left): b,n,a0,o,a1,p,12,0,q,4 b,n,a0,o,a1,p,q,9,0,5 b,0,a0,n,a1,o,p,q,15,6 b,13,a0,0,a1,n,o,p,q,1 b,n,a0,10,a1,0,o,p,q,2 b,n,a0,o,a1,16,0,p,q,3 # 5 (gentle left): b,n,a0,o,a1,p,12,q,0,5 b,0,a0,n,a1,o,p,9,q,6 b,n,a0,0,a1,o,p,q,15,1 b,13,a0,n,a1,0,o,p,q,2 b,n,a0,10,a1,o,0,p,q,3 b,n,a0,o,a1,16,p,0,q,4 # rule-specific transitions at point with arrow coming in # rule 1525115 # none eaten: 1 = gentle right b,0,a0,0,a1,0,12,0,0,1 b,0,a0,0,a1,0,0,9,0,2 b,0,a0,0,a1,0,0,0,15,3 b,13,a0,0,a1,0,0,0,0,4 b,0,a0,10,a1,0,0,0,0,5 b,0,a0,0,a1,16,0,0,0,6 # 1 eaten(1): 5 = gentle left b,0,a0,n,a1,0,12,0,0,5 b,0,a0,0,a1,n,0,9,0,6 b,0,a0,0,a1,0,n,0,15,1 b,13,a0,0,a1,0,0,n,0,2 b,0,a0,10,a1,0,0,0,n,3 b,n,a0,0,a1,16,0,0,0,4 # 2 eaten(15): 2 = sharp right b,0,a0,o,a1,0,12,0,n,2 b,n,a0,0,a1,o,0,9,0,3 b,0,a0,n,a1,0,o,0,15,4 b,13,a0,0,a1,n,0,o,0,5 b,0,a0,10,a1,0,n,0,o,6 b,o,a0,0,a1,16,0,n,0,1 # 2 eaten(24): 5 = gentle left b,0,a0,0,a1,n,12,o,0,5 b,0,a0,0,a1,0,n,9,o,6 b,o,a0,0,a1,0,0,n,15,1 b,13,a0,o,a1,0,0,0,n,2 b,n,a0,10,a1,o,0,0,0,3 b,0,a0,n,a1,16,o,0,0,4 # 2 eaten(02): 1 = gentle right b,n,a0,0,a1,o,12,0,0,1 b,0,a0,n,a1,0,o,9,0,2 b,0,a0,0,a1,n,0,o,15,3 b,13,a0,0,a1,0,n,0,o,4 b,o,a0,10,a1,0,0,n,0,5 b,0,a0,o,a1,16,0,0,n,6 # 2 eaten(04): 1 = gentle right b,n,a0,0,a1,0,12,o,0,1 b,0,a0,n,a1,0,0,9,o,2 b,o,a0,0,a1,n,0,0,15,3 b,13,a0,o,a1,0,n,0,0,4 b,0,a0,10,a1,o,0,n,0,5 b,0,a0,0,a1,16,o,0,n,6 # 3 eaten(024): 5 = gentle left b,n,a0,0,a1,o,12,p,0,5 b,0,a0,n,a1,0,o,9,p,6 b,p,a0,0,a1,n,0,o,15,1 b,13,a0,p,a1,0,n,0,o,2 b,o,a0,10,a1,p,0,n,0,3 b,0,a0,o,a1,16,p,0,n,4 golly-2.5-src/Rules/Worm-complement.rule0000644000175100001440000000256512156145314015273 00000000000000@RULE Worm-complement Paterson's worms - Erase solid regions, leaving only points with at least one uneaten edge, and the single point or line with an arrow. Use this with rules like 1252121 and 1525115, which fill regions with density near 100%, to see the uneaten paths within the regions: After running such a rule for a while, switch to this rule and run for 1 generation. (by Dean Hickerson, 11/20/2008) States: 0 empty (unvisited point or line) 1-6 'point with arrow', showing direction of next movement (1=E; 2=SE; 3=SW; 4=W; 5=NW; 6=NE) 7 point that's been visited 8,9,10 edge - (8=line; 9=E arrow; 10=W arrow) 11,12,13 edge / (11=line; 12=NE arrow; 13=SW arrow) 14,15,16 edge \ (14=line; 15=SE arrow; 16=NW arrow) @TABLE n_states:17 neighborhood:Moore symmetries:none var a0={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a1={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a2={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a3={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a4={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a5={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a6={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var a7={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} var line={8,11,14} # visited point dies if it has 6 lines out from it 7,11,a0,8,a1,14,11,8,14,0 # undirected lines die line,a0,a1,a2,a3,a4,a5,a6,a7,0 golly-2.5-src/Rules/Worm-shared.rule0000644000175100001440000005660212156145314014377 00000000000000@RULE Worm-shared This file contains the icons shared by all Worm-* rules. @TABLE n_states:17 neighborhood:Moore symmetries:none # do nothing @ICONS XPM /* width height num_colors chars_per_pixel */ "31 496 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #C0C0C0" /* icon for state 1 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".....B........................." ".....BB........................" ".....BBB......................." ".....BBBB......................" "BBBBBBBBBB....................." "BBBBBBBBBBB...................." "BBBBBBBBBB....................." ".....BBBB......................" ".....BBB......................." ".....BB........................" ".....B........................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 2 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".B............................." "BBB............................" ".BBB..........................." "..BBB.....B...................." "...BBB...BB...................." "....BBB.BBB...................." ".....BBBBBB...................." "......BBBBB...................." ".....BBBBBB...................." "....BBBBBBB...................." "...BBBBBBBB...................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 3 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".........B....................." "........BBB...................." ".......BBB....................." "B.....BBB......................" "BB...BBB......................." "BBB.BBB........................" "BBBBBB........................." "BBBBB.........................." "BBBBBB........................." "BBBBBBB........................" "BBBBBBBB......................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 4 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".....B........................." "....BB........................." "...BBB........................." "..BBBB........................." ".BBBBBBBBBB...................." "BBBBBBBBBBB...................." ".BBBBBBBBBB...................." "..BBBB........................." "...BBB........................." "....BB........................." ".....B........................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 5 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "BBBBBBBB......................." "BBBBBBB........................" "BBBBBB........................." "BBBBB.........................." "BBBBBB........................." "BBB.BBB........................" "BB...BBB......................." "B.....BBB......................" ".......BBB....................." "........BBB...................." ".........B....................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 6 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "...BBBBBBBB...................." "....BBBBBBB...................." ".....BBBBBB...................." "......BBBBB...................." ".....BBBBBB...................." "....BBB.BBB...................." "...BBB...BB...................." "..BBB.....B...................." ".BBB..........................." "BBB............................" ".B............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 7 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..BB......BB..................." "..BBB....BBB..................." "...BBB..BBB...................." "....BBBBBB....................." ".....BBBB......................" "......BB......................." "BBBBBBBBBBBBBB................." "BBBBBBBBBBBBBB................." "BBBBBBBBBBBBBB................." "......BB......................." ".....BBBB......................" "....BBBBBB....................." "...BBB..BBB...................." "..BBB....BBB..................." "..BB......BB..................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 8 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 9 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".....................B........." ".....................BB........" ".....................BBB......." ".....................BBBB......" ".....................BBBBB....." ".....................BBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBBB..." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.." "BBBBBBBBBBBBBBBBBBBBBBBBBBBB..." ".....................BBBBBB...." ".....................BBBBB....." ".....................BBBB......" ".....................BBB......." ".....................BB........" ".....................B........." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 10 */ "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." ".......B......................." "......BB......................." ".....BBB......................." "....BBBB......................." "...BBBBB......................." "..BBBBBB......................." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBB.." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.." ".BBBBBBBBBBBBBBBBBBBBBBBBBBBB.." "..BBBBBB......................." "...BBBBB......................." "....BBBB......................." ".....BBB......................." "......BB......................." ".......B......................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." "..............................." /* icon for state 11 */ ".............................BB" "............................CBB" "............................BBC" "...........................CBB." "...........................BBC." "..........................CBB.." "..........................BBC.." ".........................CBB..." ".........................BBC..." "........................CBB...." "........................BBC...." ".......................CBB....." ".......................BBC....." "......................CBB......" "......................BBC......" ".....................CBB......." ".....................BBC......." "....................CBB........" "....................BBC........" "...................CBB........." "...................BBC........." "..................CBB.........." "..................BBC.........." ".................CBB..........." ".................BBC..........." "................CBB............" "................BBC............" "...............CBB............." "...............BBC............." "..............CBB.............." "..............BBC.............." /* icon for state 12 */ ".....................BBBBBBBBBB" "......................BBBBBBBBB" ".......................BBBBBBBB" "........................BBBBBBB" ".........................BBBBBB" "..........................BBBBB" "..........................BBBBB" ".........................CBBBBB" ".........................BBC.BB" "........................CBB...B" "........................BBC...." ".......................CBB....." ".......................BBC....." "......................CBB......" "......................BBC......" ".....................CBB......." ".....................BBC......." "....................CBB........" "....................BBC........" "...................CBB........." "...................BBC........." "..................CBB.........." "..................BBC.........." ".................CBB..........." ".................BBC..........." "................CBB............" "................BBC............" "...............CBB............." "...............BBC............." "..............CBB.............." "..............BBC.............." /* icon for state 13 */ ".............................BB" "............................CBB" "............................BBC" "...........................CBB." "...........................BBC." "..........................CBB.." "..........................BBC.." ".........................CBB..." ".........................BBC..." "........................CBB...." "........................BBC...." ".......................CBB....." ".......................BBC....." "......................CBB......" "......................BBC......" ".....................CBB......." ".....................BBC......." "....................CBB........" "....................BBC........" "...................CBB........." "...................BBC........." "..................CBB.........." "..................BBC.........." "........BBBBBBBBBBBBBBB........" ".........BBBBBBBBBBBBB........." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." /* icon for state 14 */ "..............BB..............." "..............BBC.............." "..............CBB.............." "...............BBC............." "...............CBB............." "................BBC............" "................CBB............" ".................BBC..........." ".................CBB..........." "..................BBC.........." "..................CBB.........." "...................BBC........." "...................CBB........." "....................BBC........" "....................CBB........" ".....................BBC......." ".....................CBB......." "......................BBC......" "......................CBB......" ".......................BBC....." ".......................CBB....." "........................BBC...." "........................CBB...." ".........................BBC..." ".........................CBB..." "..........................BBC.." "..........................CBB.." "...........................BBC." "...........................CBB." "............................BBC" "............................CBB" /* icon for state 15 */ "..............BB..............." "..............BBC.............." "..............CBB.............." "...............BBC............." "...............CBB............." "................BBC............" "................CBB............" ".................BBC..........." ".................CBB..........." "..................BBC.........." "..................CBB.........." "...................BBC........." "...................CBB........." "....................BBC........" "....................CBB........" ".....................BBC......." ".....................CBB......." "......................BBC......" "......................CBB......" ".......................BBC....." ".......................CBB....." "........................BBC...B" "........................CBB..BB" ".........................BBCBBB" ".........................CBBBBB" "..........................BBBBB" ".........................BBBBBB" "........................BBBBBBB" ".......................BBBBBBBB" "......................BBBBBBBBB" ".....................BBBBBBBBBB" /* icon for state 16 */ "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." ".........BBBBBBBBBBBBB........." "........BBBBBBBBBBBBBBB........" "..................BBC.........." "..................CBB.........." "...................BBC........." "...................CBB........." "....................BBC........" "....................CBB........" ".....................BBC......." ".....................CBB......." "......................BBC......" "......................CBB......" ".......................BBC....." ".......................CBB....." "........................BBC...." "........................CBB...." ".........................BBC..." ".........................CBB..." "..........................BBC.." "..........................CBB.." "...........................BBC." "...........................CBB." "............................BBC" "............................CBB" ".............................BB" XPM /* width height num_colors chars_per_pixel */ "15 240 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #C0C0C0" /* icon for state 1 */ "..............." "..............." "..............." "..............." "..............." "..B............" "...B..........." "BBBBB.........." "...B..........." "..B............" "..............." "..............." "..............." "..............." "..............." /* icon for state 2 */ "..............." "..............." "..............." "..............." "..............." "B.............." ".B............." "..B.B.........." "...BB.........." "..BBB.........." "..............." "..............." "..............." "..............." "..............." /* icon for state 3 */ "..............." "..............." "..............." "..............." "..............." "....B.........." "...B..........." "B.B............" "BB............." "BBB............" "..............." "..............." "..............." "..............." "..............." /* icon for state 4 */ "..............." "..............." "..............." "..............." "..............." "..B............" ".B............." "BBBBB.........." ".B............." "..B............" "..............." "..............." "..............." "..............." "..............." /* icon for state 5 */ "..............." "..............." "..............." "..............." "..............." "BBB............" "BB............." "B.B............" "...B..........." "....B.........." "..............." "..............." "..............." "..............." "..............." /* icon for state 6 */ "..............." "..............." "..............." "..............." "..............." "..BBB.........." "...BB.........." "..B.B.........." ".B............." "B.............." "..............." "..............." "..............." "..............." "..............." /* icon for state 7 */ "..............." "..............." "..............." "..............." ".B...B........." "..B.B.........." "...B..........." "BBBBBBB........" "...B..........." "..B.B.........." ".B...B........." "..............." "..............." "..............." "..............." /* icon for state 8 */ "..............." "..............." "..............." "..............." "..............." "..............." "..............." "BBBBBBBBBBBBBB." "..............." "..............." "..............." "..............." "..............." "..............." "..............." /* icon for state 9 */ "..............." "..............." "..............." "..............." "..........B...." "..........BB..." "..........BBB.." "BBBBBBBBBBBBBB." "..........BBB.." "..........BB..." "..........B...." "..............." "..............." "..............." "..............." /* icon for state 10 */ "..............." "..............." "..............." "..............." "...B..........." "..BB..........." ".BBB..........." "BBBBBBBBBBBBBB." ".BBB..........." "..BB..........." "...B..........." "..............." "..............." "..............." "..............." /* icon for state 11 */ "..............B" ".............B." ".............B." "............B.." "............B.." "...........B..." "...........B..." "..........B...." "..........B...." ".........B....." ".........B....." "........B......" "........B......" ".......B......." ".......B......." /* icon for state 12 */ "..........BBBBB" "...........BBBB" "............BBB" "............BBB" "...........B..B" "...........B..." "...........B..." "..........B...." "..........B...." ".........B....." ".........B....." "........B......" "........B......" ".......B......." ".......B......." /* icon for state 13 */ "..............B" ".............B." ".............B." "............B.." "...........B..." "...........B..." "..........B...." "..........B...." ".........B....." ".........B....." "........B......" "....BBBBBBB...." ".....BBBBB....." "......BBB......" ".......B......." /* icon for state 14 */ ".......B......." ".......B......." "........B......" "........B......" ".........B....." ".........B....." "..........B...." "..........B...." "...........B..." "...........B..." "............B.." "............B.." ".............B." ".............B." "..............B" /* icon for state 15 */ ".......B......." ".......B......." "........B......" "........B......" ".........B....." ".........B....." "..........B...." "..........B...." "...........B..." "...........B..." "............B.B" "............BBB" "............BBB" "...........BBBB" "..........BBBBB" /* icon for state 16 */ ".......B......." "......BBB......" ".....BBBBB....." "....BBBBBBB...." "........B......" ".........B....." ".........B....." "..........B...." "..........B...." "...........B..." "...........B..." "............B.." ".............B." ".............B." "..............B" XPM /* width height num_colors chars_per_pixel */ "7 112 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #C0C0C0" /* icon for state 1 */ "......." "...B..." "....B.." ".BBBBB." "....B.." "...B..." "......." /* icon for state 2 */ "......." ".B....." "..B...." "...B.B." "....BB." "...BBB." "......." /* icon for state 3 */ "......." ".....B." "....B.." ".B.B..." ".BB...." ".BBB..." "......." /* icon for state 4 */ "......." "...B..." "..B...." ".BBBBB." "..B...." "...B..." "......." /* icon for state 5 */ "......." ".BBB..." ".BB...." ".B.B..." "....B.." ".....B." "......." /* icon for state 6 */ "......." "...BBB." "....BB." "...B.B." "..B...." ".B....." "......." /* icon for state 7 */ "......." "B.B...." ".B....." "BBB...." ".B....." "B.B...." "......." /* icon for state 8 */ "......." "......." "......." "BBBBBB." "......." "......." "......." /* icon for state 9 */ "......." "...B..." "....B.." "BBBBBB." "....B.." "...B..." "......." /* icon for state 10 */ "......." "..B...." ".B....." "BBBBBB." ".B....." "..B...." "......." /* icon for state 11 */ "......B" ".....B." ".....B." "....B.." "....B.." "...B..." "...B..." /* icon for state 12 */ "...BBBB" ".....BB" "....B.B" "....B.B" "....B.." "...B..." "...B..." /* icon for state 13 */ "......B" ".....B." "....B.." "...B..." ".B.B.B." "..BBB.." "...B..." /* icon for state 14 */ "...B..." "...B..." "....B.." "....B.." ".....B." ".....B." "......B" /* icon for state 15 */ "...B..." "...B..." "....B.." "....B.B" "....B.B" ".....BB" "...BBBB" /* icon for state 16 */ "...B..." "..BBB.." ".B.B.B." "...B..." "....B.." ".....B." "......B" golly-2.5-src/Scripts/0000755000175100001440000000000012156146014011720 500000000000000golly-2.5-src/Scripts/Perl/0000755000175100001440000000000012156146015012623 500000000000000golly-2.5-src/Scripts/Perl/density.pl0000644000175100001440000000056312156145314014564 00000000000000# Calculates the density of live cells in the current pattern. # Author: Andrew Trevorrow (andrew@trevorrow.com), June 2007. use strict; my @rect = g_getrect(); g_exit("The pattern is empty.") if @rect == 0; my $d = g_getpop() / ($rect[2] * $rect[3]); if ($d < 0.000001) { g_show(sprintf("Density = %.1e",$d)); } else { g_show(sprintf("Density = %.6f",$d)); } golly-2.5-src/Scripts/Perl/envelope.pl0000644000175100001440000001002012156145314014707 00000000000000# Use multiple layers to create a history of the current pattern. # The "envelope" layer remembers all live cells. # Author: Andrew Trevorrow (andrew@trevorrow.com), June 2007. # Updated to use new setcolors command, September 2008. use strict; g_exit("There is no pattern.") if g_empty(); my $currindex = g_getlayer(); my $startindex; my $envindex; my $startname = "starting pattern"; my $envname = "envelope"; if ($currindex > 1 and g_getname($currindex - 1) eq $startname and g_getname($currindex - 2) eq $envname) { # continue from where we left off $startindex = $currindex - 1; $envindex = $currindex - 2; } elsif ($currindex + 2 < g_numlayers() and g_getname($currindex + 1) eq $startname and g_getname($currindex) eq $envname) { # switch from envelope layer to current layer and continue $currindex += 2; g_setlayer($currindex); $startindex = $currindex - 1; $envindex = $currindex - 2; } elsif ($currindex + 1 < g_numlayers() and g_getname($currindex) eq $startname and g_getname($currindex - 1) eq $envname) { # switch from starting layer to current layer and continue $currindex += 1; g_setlayer($currindex); $startindex = $currindex - 1; $envindex = $currindex - 2; } else { # start a new envelope using pattern in current layer if (g_numlayers() + 1 > g_maxlayers()) { g_exit("You need to delete a couple of layers."); } if (g_numlayers() + 2 > g_maxlayers()) { g_exit("You need to delete a layer."); } # get current layer's starting pattern my $startpatt = g_getcells(g_getrect()); $envindex = g_addlayer(); # create layer for remembering all live cells g_setcolors([-1,100,100,100]); # set all states to darkish gray g_putcells($startpatt); # copy starting pattern into this layer $startindex = g_addlayer(); # create layer for starting pattern g_setcolors([-1,0,255,0]); # set all states to green g_putcells($startpatt); # copy starting pattern into this layer # move currindex to above the envelope and starting pattern g_movelayer($currindex, $envindex); g_movelayer($envindex, $startindex); $currindex = $startindex; $startindex = $currindex - 1; $envindex = $currindex - 2; # name the starting and envelope layers so user can run script # again and continue from where it was stopped g_setname($startname, $startindex); g_setname($envname, $envindex); } # ------------------------------------------------------------------------------ sub envelope { # draw stacked layers using same location and scale g_setoption("stacklayers", 1); g_show("Hit escape key to stop script..."); while (1) { g_run(1); if (g_empty()) { g_show("Pattern died out."); last; } # copy current pattern to envelope layer; # we temporarily disable event checking so thumb scrolling # and other mouse events won't cause confusing changes my $currpatt = g_getcells(g_getrect()); g_check(0); g_setlayer($envindex); g_putcells($currpatt); g_setlayer($currindex); g_check(1); my $step = 1; my $expo = g_getstep(); if ($expo > 0) { $step = g_getbase()**$expo; } if (g_getgen() % $step == 0) { # display all 3 layers (envelope, start, current) g_update(); } } } # ------------------------------------------------------------------------------ # show status bar but hide layer & edit bars (faster, and avoids flashing) my $oldstatus = g_setoption("showstatusbar", 1); my $oldlayerbar = g_setoption("showlayerbar", 0); my $oldeditbar = g_setoption("showeditbar", 0); envelope(); END { # this code is always executed, even after escape/error; # restore original state of status/layer/edit bars g_setoption("showstatusbar", $oldstatus); g_setoption("showlayerbar", $oldlayerbar); g_setoption("showeditbar", $oldeditbar); } golly-2.5-src/Scripts/Perl/giffer.pl0000644000175100001440000001047212156145314014347 00000000000000# Runs the current selection for a given number of steps and # creates a black and white animated GIF file. # Based on code by Tony Smith. use strict; g_exit("There is no pattern.") if g_empty(); my @rect = g_getselrect(); g_exit("There is no selection.") if @rect == 0; my $x = $rect[0]; my $y = $rect[1]; my $width = $rect[2]; my $height = $rect[3]; my $s = g_getstring("Enter the number of frames, the pause time between\n". "each frame (in centisecs) and the output file:", "100 1 out.gif", "Create animated GIF"); my ($frames, $pause, $filename) = split(' ', $s, 3); $frames = 100 if $frames eq ""; $pause = 1 if $pause eq ""; $filename = "out.gif" if $filename eq ""; g_exit("Number of frames is not an integer: $frames") if $frames !~ /^\d+$/; g_exit("Pause time is not an integer: $pause") if $pause !~ /^\d+$/; # ------------------------------------------------------------------------------ { my $header = "GIF89a"; my $global = pack('v2B8c2', $width, $height, '10000000', 0, 0); my $colortable = pack('H*', 'FFFFFF000000'); my $applic = chr(11) . 'NETSCAPE2.0' . pack('c2vc', 3, 1, 0, 0); my $descriptor = pack('v4B8', 0, 0, $width, $height, '00000000'); open GIF, '>', $filename; print GIF $header, $global, $colortable; print GIF '!', chr(0xFF), $applic; for (my $f = 0; $f < $frames; $f++) { print GIF '!', chr(0xF9), pack('cB8vc2', 4, '00000000', $pause, 0, 0); # get data for this frame print GIF ',', $descriptor, chr(2), &compress( &getdata() ); my $finc = $f + 1; g_show "frame: $finc/$frames"; if ($finc < $frames) { g_step(); g_update(); } } print GIF ';'; close(GIF); g_show "GIF animation saved in $filename"; } # ------------------------------------------------------------------------------ sub getdata { my @lines = (); # each array element is a line of 0 and 1 characters for (my $row = $y; $row < $y + $height; $row++) { my $line = ""; for (my $col = $x; $col < $x + $width; $col++) { if (g_getcell($col, $row)) { $line .= "1"; } else { $line .= "0"; } } push(@lines, $line); } return \@lines; } # ------------------------------------------------------------------------------ sub compress { # black and white special my @lines = @{$_[0]}; # array reference is parameter my %table = ('0' => 0, '1' => 1); my $curr = my $cc = 4; my $used = my $eoi = 5; my $bits = my $size = 3; my $mask = 7; my $output = my $code = ''; foreach my $input (@lines) { while (length($input)) { my $next = substr($input, 0, 1, ''); if (exists $table{"$code$next"}) {$code .= $next} else { $used++; $table{"$code$next"} = $used; $curr += $table{$code} << $bits; $bits += $size; while ($bits >= 8) { $output .= chr($curr & 255); $curr = $curr >> 8; $bits -= 8; } if ($used > $mask) { if ($size < 12) { $size ++; $mask = $mask * 2 + 1; } else { $curr += $cc << $bits; # output cc in current width $bits += $size; while ($bits >= 8) { $output .= chr($curr & 255); $curr = $curr >> 8; $bits -= 8; } %table = ('0' => 0, '1' => 1); # reset table $used = 5; $size = 3; $mask = 7; } } $code = $next; } } } $curr += $table{$code} << $bits; $bits += $size; while ($bits >= 8) { $output .= chr($curr & 255); $curr = $curr >> 8; $bits -= 8; } $output .= chr($curr); my $subbed = ''; while (length($output) > 255) {$subbed .= chr(255) . substr($output, 0, 255, '')} return $subbed . chr(length($output)) . $output . chr(0); } golly-2.5-src/Scripts/Perl/goto.pl0000644000175100001440000000711212156145314014052 00000000000000# Go to a requested generation. The given generation can be an # absolute number like 1,000,000 (commas are optional) or a number # relative to the current generation like +9 or -6. If the target # generation is less than the current generation then we go back # to the starting generation (normally 0) and advance to the target. # Authors: Andrew Trevorrow and Dave Greene, June 2007. use strict; use Time::HiRes qw ( time ); # -------------------------------------------------------------------- sub go_to { my $gen = shift; my $currgen = g_getgen(); my $newgen = $gen; if (substr($gen,0,1) eq '+') { $newgen = $currgen + $gen; } elsif (substr($gen,0,1) eq '-') { my $n = -$gen; if ($currgen > $n) { $newgen = $currgen - $n; } else { $newgen = 0; } } if ($newgen < $currgen) { # try to go back to starting gen (not necessarily 0) and # then forwards to newgen; note that reset() also restores # algorithm and/or rule, so too bad if user changed those # after the starting info was saved; # first save current location and scale my ($midx, $midy) = g_getpos(); my $mag = g_getmag(); g_reset(); # restore location and scale g_setpos($midx, $midy); g_setmag($mag); # current gen might be > 0 if user loaded a pattern file # that set the gen count $currgen = g_getgen(); if ($newgen < $currgen) { g_error("Can't go back any further; pattern was saved ". "at generation $currgen."); return; } } return if $newgen == $currgen; g_show("Hit escape to abort..."); my $oldsecs = time; # do 1 step first, to ensure a reasonable value is saved for the step size: g_run(1); ++$currgen; my $base = g_getbase(); my $todo = $newgen - $currgen; my $exp = 0; while ($todo > 0) { my $num_steps = $todo % $base; g_setstep($exp++); $todo = ($todo - $num_steps)/$base; while ($num_steps-- > 0) { if (g_empty()) { g_show("Pattern is empty."); return; } g_step(); my $newsecs = time; if ($newsecs - $oldsecs >= 1.0) { # do an update every sec $oldsecs = $newsecs; g_update(); } } } g_show(""); } # -------------------------------------------------------------------- sub savegen { my ($filename, $gen) = @_; if (not open(OUTFILE, ">".$filename)) { g_warn("Can't save gen in $filename:\n$!"); } else { print OUTFILE $gen; close OUTFILE; } } # -------------------------------------------------------------------- # use same file name as in goto.py my $GotoINIFileName = g_getdir("data")."goto.ini"; my $previousgen = ""; if (open(INFILE, $GotoINIFileName)) { $previousgen = ; close INFILE; } my $gen = g_getstring("Enter the desired generation number,\n". "or -n/+n to go back/forwards by n:", $previousgen, "Go to generation"); if ($gen eq "") { g_exit(); } elsif ($gen eq '+' or $gen eq '-') { # clear the default savegen($GotoINIFileName, ""); } elsif ($gen !~ /^[+-]?\d[\d,]*$/) { g_exit("Sorry, but \"$gen\" is not a valid integer."); } else { # best to save given gen now in case user aborts script savegen($GotoINIFileName, $gen); $gen =~ s/,//g; my $oldstep = g_getstep(); go_to($gen); g_setstep($oldstep); } golly-2.5-src/Scripts/Perl/invert.pl0000644000175100001440000000142612156145314014413 00000000000000# Invert all cell states in the current selection. # Author: Andrew Trevorrow (andrew@trevorrow.com), May 2007. # Updated to use g_numstates command, Jun 2008. use strict; use Time::HiRes qw (time); my @rect = g_getselrect(); g_exit("There is no selection.") if @rect == 0; my $x = $rect[0]; my $y = $rect[1]; my $wd = $rect[2]; my $ht = $rect[3]; my $oldsecs = time; my $maxstate = g_numstates() - 1; for (my $row = $y; $row < $y + $ht; $row++) { # if large selection then give some indication of progress my $newsecs = time; if ($newsecs - $oldsecs >= 1.0) { $oldsecs = $newsecs; g_update(); } for (my $col = $x; $col < $x + $wd; $col++) { g_setcell($col, $row, $maxstate - g_getcell($col, $row)); } } g_fitsel() if !g_visrect(@rect); golly-2.5-src/Scripts/Perl/make-torus.pl0000644000175100001440000000133612156145314015173 00000000000000# Use the current selection to create a toroidal universe. # Author: Andrew Trevorrow (andrew@trevorrow.com), Oct 2010. use strict; my @selrect = g_getselrect(); g_exit("There is no selection.") if @selrect == 0; my $x = $selrect[0]; my $y = $selrect[1]; my $wd = $selrect[2]; my $ht = $selrect[3]; my $selcells = g_getcells(@selrect); if (!g_empty()) { g_clear(0); g_clear(1); } # get current rule, remove any existing suffix, then add new suffix my ($rule, $suffix) = split(":",g_getrule(),2); g_setrule("$rule:T$wd,$ht"); my $newx = -int($wd/2); my $newy = -int($ht/2); $selrect[0] = $newx; $selrect[1] = $newy; g_select(@selrect); g_putcells($selcells, $newx - $x, $newy - $y) if length($selcells) > 0; g_fitsel(); golly-2.5-src/Scripts/Perl/oscar.pl0000644000175100001440000001557512156145314014225 00000000000000# Oscar is an OSCillation AnalyzeR for use with Golly. # Author: Andrew Trevorrow (andrew@trevorrow.com), June 2007. # Modified to use Math::BigInt, December 2008. # Modified to handle B0-and-not-S8 rules, August 2009. # This script uses Gabriel Nivasch's "keep minima" algorithm. # For each generation, calculate a hash value for the pattern. Keep all of # the record-breaking minimal hashes in a list, with the oldest first. # For example, after 5 generations the saved hash values might be: # # 8 12 16 24 25, # # If the next hash goes down to 13 then the list can be shortened: # # 8 12 13. # # If the current hash matches one of the saved hashes, it is highly likely # the pattern is oscillating. By keeping a corresponding list of generation # counts we can calculate the period. We also keep lists of population # counts and bounding boxes to reduce the chance of spurious oscillator # detection due to hash collisions. The bounding box info also allows us # to detect moving oscillators (spaceships/knightships). use strict; use Time::HiRes qw ( time ); use Math::BigInt; # use arbitrarily big integers # -------------------------------------------------------------------- # initialize lists my @hashlist = (); # for pattern hash values my @genlist = (); # corresponding generation counts my @poplist = (); # corresponding population counts my @boxlist = (); # corresponding bounding boxes # -------------------------------------------------------------------- sub show_spaceship_speed { # we found a moving oscillator my ($period, $deltax, $deltay) = @_; if ($period == 1) { g_show("Spaceship detected (speed = c)"); } elsif ($deltax == $deltay or $deltax == 0 or $deltay == 0) { my $speed = ""; if ($deltax == 0 or $deltay == 0) { # orthogonal spaceship if ($deltax > 1 or $deltay > 1) { $speed .= ($deltax + $deltay); } } else { # diagonal spaceship (deltax == deltay) if ($deltax > 1) { $speed .= $deltax; } } g_show("Spaceship detected (speed = $speed"."c/$period)"); } else { # deltax != deltay and both > 0 my $speed = "$deltay,$deltax"; g_show("Knightship detected (speed = $speed"."c/$period)"); } } # -------------------------------------------------------------------- sub oscillating { # return 1 if the pattern is empty, stable or oscillating # first get current pattern's bounding box my @pbox = g_getrect(); if (@pbox == 0) { g_show("The pattern is empty."); return 1; } # get current pattern and create "normalized" version -- ie. shift its # top left corner to 0,0 -- so we can detect spaceships and knightships ## my $shifted = g_transform(g_getcells(@pbox), -$pbox[0], -$pbox[1]); # create hash value of shifted pattern ## my $h = 0; ## foreach (@{$shifted}) { ## $h = ($h % 10000000) * 33 + $_; ## } # use g_hash command (5 times faster than above code) my $h = g_hash(@pbox); # check if outer-totalistic rule has B0 but not S8 my $rule = g_getrule(); my ($prefix, $suffix) = split(':', $rule, 2); my $hasB0notS8 = ($prefix =~ m/^B0/ and $prefix =~ m|/| and $prefix !~ m/8$/); # determine where to insert h into hashlist my $pos = 0; while ($pos < @hashlist) { if ($h > $hashlist[$pos]) { $pos += 1; } elsif ($h < $hashlist[$pos]) { # shorten lists and append info below splice(@hashlist, $pos); splice(@genlist, $pos); splice(@poplist, $pos); splice(@boxlist, $pos); last; } else { # h == hashlist[pos] so pattern is probably oscillating, but just in # case this is a hash collision we also compare pop count and box size my @rect = @{$boxlist[$pos]}; my $currpop = Math::BigInt->new(g_getpop()); if ( $currpop->bcmp($poplist[$pos]) == 0 and $pbox[2] == $rect[2] and $pbox[3] == $rect[3] ) { my $currgen = Math::BigInt->new(g_getgen()); my $bigp = $currgen->bsub($genlist[$pos]); my $period = $bigp->numify(); if ($hasB0notS8 and ($period % 2) and $pbox[0] == $rect[0] and $pbox[1] == $rect[1] and $pbox[2] == $rect[2] and $pbox[3] == $rect[3]) { # ignore this hash value because B0-and-not-S8 rules are # emulated by using different rules for odd and even gens, # so it's possible to have identical patterns at gen G and # gen G+p if p is odd return 0; } if ($period == 1) { if ($pbox[0] == $rect[0] and $pbox[1] == $rect[1] and $pbox[2] == $rect[2] and $pbox[3] == $rect[3]) { g_show("The pattern is stable."); } else { show_spaceship_speed(1, 0, 0); } } elsif ($pbox[0] == $rect[0] and $pbox[1] == $rect[1] and $pbox[2] == $rect[2] and $pbox[3] == $rect[3]) { g_show("Oscillator detected (period = $period)"); } else { my $deltax = abs($rect[0] - $pbox[0]); my $deltay = abs($rect[1] - $pbox[1]); show_spaceship_speed($period, $deltax, $deltay); } return 1; } else { # look at next matching hash value or insert if no more $pos += 1; } } } # store hash/gen/pop/box info at same position in various lists splice(@hashlist, $pos, 0, $h); splice(@genlist, $pos, 0, Math::BigInt->new(g_getgen())); splice(@poplist, $pos, 0, Math::BigInt->new(g_getpop())); splice(@boxlist, $pos, 0, \@pbox); return 0; } # -------------------------------------------------------------------- sub fit_if_not_visible { # fit pattern in viewport if not empty and not completely visible my @r = g_getrect(); if (@r > 0 and !g_visrect(@r)) { g_fit() } } # -------------------------------------------------------------------- g_show("Checking for oscillation... (hit escape to abort)"); my $oldsecs = time; while ( not oscillating() ) { g_run(1); my $newsecs = time; if ($newsecs - $oldsecs >= 1.0) { # show pattern every second $oldsecs = $newsecs; fit_if_not_visible(); g_update(); } } fit_if_not_visible(); golly-2.5-src/Scripts/Perl/p1100-MWSS-gun.pl0000644000175100001440000001632412156145314015226 00000000000000# Bill Gosper's pure-period p1100 double MWSS gun, circa 1984 use strict; g_new("P1100 gun"); g_setalgo("HashLife"); g_setrule("B3/S23"); # update status bar now so we don't see different colors when # g_show is called g_update(); my $glider = g_parse('bo$bbo$3o!'); my $block = g_parse('oo$oo!'); my $eater = g_parse('oo$bo$bobo$bboo!'); my $bhept = g_parse('bbo$boo$oo$boo!'); my $centinal = $eater; push @$centinal,@{g_transform($bhept,8,3)}; push @$centinal,@{g_evolve(g_transform($centinal,51,0,-1,0,0,1),1)}; push @$centinal,@{g_transform($centinal,0,16,1,0,0,-1)}; my @temp = (@{g_transform(g_evolve($centinal,1),16,3,0,-1,1,0)}, @{g_transform(g_evolve($centinal,19),52,0,0,-1,1,0)}, @{g_transform(g_evolve($centinal,81),55,51,0,1,-1,0)}, @{g_transform(g_evolve($centinal,99),91,54,0,1,-1,0)}); my $overpass = \@temp; # build the source signal -- the most compact set of gliders # from which all other gliders and spaceships can be generated. # Also add the first four centinals to guide the recipe gliders my @MWSSrecipes = ( @{g_transform($glider,5759,738,0,1,-1,0)}, @{g_transform($glider,6325,667,-1,0,0,1)}, @{g_transform(g_evolve($glider,3),5824,896,-1,0,0,1)}, @{g_transform(g_evolve($glider,2),5912,1264)}, @{g_transform(g_evolve($glider,2),6135,1261,-1,0,0,1)}, @{g_transform(g_evolve($glider,1),5912,1490,1,0,0,-1)}, @{g_transform($glider,6229,4717,-1,0,0,1)}, @{g_transform(g_evolve($glider,1),6229,5029,-1,0,0,-1)}, @{g_transform(g_evolve($glider,1),5920,5032,1,0,0,-1)}, @{g_transform($glider,6230,5188,-1,0,0,-1)}, @{g_transform(g_evolve($glider,3),6230,5306,-1,0,0,-1)}, @{g_transform(g_evolve($glider,3),5959,5309,1,0,0,-1)}, @{g_transform(g_evolve($centinal,44),6185,5096,-1,0,0,1)}, @{g_transform(g_evolve($centinal,73),5897,1066)}, @{g_transform(g_evolve($centinal,42),5782,690)}, @{g_transform(g_evolve($centinal,25),5793,897,0,-1,1,0)}, 6095,-65,6075,228); # suppress outbound MWSSes with two extra cells # to change behavior at center, comment out one of the options below: # true p1100 gun #my @all = (@{g_transform($eater,6018,5924,0,1,-1,0)}, # @{g_transform($eater,6037,5943,0,1,-1,0)}); # synch center to recreate original p1100x5 gun pattern: my @all = @{g_transform($block,6018,6787)}; # generate the MWSSes for the glider-fanout ladder for (my $i = 0; $i < 7; $i += 1) { g_show("Building rung $i of ladder..."); push @all, @MWSSrecipes; @all = @{g_evolve(\@all,1100)}; } # add the actual glider-fanout ladder -- six rungs for (my $i = 0; $i < 6; $i += 1) { push @all, @{g_transform($glider,6030,1706+550*$i,0,-1,-1,0)}, @{g_transform(g_evolve($centinal,15),6102,1585+550*$i)}, @{g_transform($block,6029,1721+550*$i)}, @{g_transform(g_evolve($centinal,34),5996,1725+550*$i,0,1,-1,0)}, @{g_transform($block,6087,1747+550*$i)}, @{g_transform(g_evolve($centinal,87),6122,1745+550*$i,0,-1,1,0)}; } # add the rest of the centinals to guide the ladder's output gliders g_show("Adding centinal reflectors..."); push @all, @{g_transform(g_evolve($centinal,88),5704,0)}, @{g_transform(g_evolve($centinal,29),6423,295,-1,0,0,1)}, @{g_transform(g_evolve($centinal,74),5616,298)}, @{g_transform(g_evolve($centinal,40),6361,613,0,-1,1,0)}, @{g_transform(g_evolve($centinal,23),6502,620,-1,0,0,1)}, @{g_transform(g_evolve($centinal,36),5636,986)}, @{g_transform(g_evolve($centinal,38),6370,1008,0,-1,1,0)}, @{g_transform(g_evolve($centinal,19),5747,1347,0,-1,1,0)}, @{g_transform(g_evolve($centinal,67),5851,1516)}, @{g_transform($centinal,4061,2605,0,1,-1,0)}, @{g_transform(g_evolve($centinal,10),5376,3908,0,1,-1,0)}, @{g_transform(g_evolve($centinal,77),8191,4407,-1,0,0,1)}, @{g_transform(g_evolve($centinal,6),4988,4606)}, @{g_transform(g_evolve($centinal,34),6357,4608,-1,0,0,1)}, @{g_transform(g_evolve($centinal,27),8129,4621,-1,0,0,1)}, @{g_transform(g_evolve($centinal,92),5159,5051)}, @{g_transform(g_evolve($centinal,53),7991,5201,-1,0,0,1)}, @{g_transform(g_evolve($centinal,94),7038,5370,0,1,-1,0)}, @{g_transform(g_evolve($centinal,13),5591,5379,0,1,-1,0)}, @{g_transform(g_evolve($centinal,3),5858,5428,0,1,-1,0)}, @{g_transform(g_evolve($centinal,87),7805,5511,-1,0,0,1)}, @{g_transform(g_evolve($centinal,98),401,5557,0,1,-1,0)}, @{g_transform(g_evolve($centinal,14),955,5561,0,1,-1,0)}, @{g_transform(g_evolve($centinal,8),6592,5584,0,1,-1,0)}, @{g_transform(g_evolve($centinal,39),6933,5698,-1,0,0,1)}, @{g_transform(g_evolve($centinal,32),6230,5881)}, @{g_transform(g_evolve($centinal,47),11676,5854,0,1,-1,0)}, @{g_transform(g_evolve($centinal,68),0,5748,0,1,-1,0)}, @{g_transform(g_evolve($centinal,89),6871,5912,-1,0,0,1)}, @{g_transform(g_evolve($centinal,45),12095,6027,0,1,-1,0)}, @{g_transform(g_evolve($centinal,86),6209,6134)}, @{g_transform(g_evolve($centinal,55),6868,6357,-1,0,0,1)}, @{g_transform(g_evolve($centinal,95),9939,6491,0,1,-1,0)}, @{g_transform(g_evolve($centinal,23),8782,6548,0,1,-1,0)}, @{g_transform(g_evolve($centinal,58),3066,6572,0,1,-1,0)}, @{g_transform(g_evolve($centinal,21),9326,6596,0,1,-1,0)}, @{g_transform(g_evolve($centinal,80),3628,6626,0,1,-1,0)}, @{g_transform(g_evolve($centinal,45),6821,6528,-1,0,0,1)}, @{g_transform(g_evolve($centinal,33),10373,6649,0,1,-1,0)}, @{g_transform(g_evolve($centinal,16),2587,6685,0,1,-1,0)}; # reflect the symmetrical part and add the center asymmetric stuff -- push @all, @{g_transform(\@all,0,13583,1,0,0,-1)}, @{g_transform($block,1081,6791)}, @{g_transform($block,2731,6791)}, @{g_transform($block,3831,6791)}, @{g_transform($block,9108,6791)}, @{g_transform($block,10208,6791)}, @{g_transform($block,11308,6791)}, @{g_transform($overpass,8475,6737)}, @{g_transform(g_evolve($overpass,39),3365,6737,-1,0,0,1)}, @{g_transform($overpass,9575,6737)}, @{g_transform(g_evolve($overpass,39),2265,6737,-1,0,0,1)}, @{g_transform($overpass,10675,6737)}, @{g_transform(g_evolve($overpass,39),1715,6737,-1,0,0,1)}; push @MWSSrecipes,@{g_transform(\@MWSSrecipes,0,13583,1,0,0,-1)}; g_putcells(\@all); g_fit(); # Different glider paths are different lengths, so incomplete # glider recipes must be overwritten for a while to prevent disaster. for (my $i = 0; $i < 46; $i += 1) { my $t = 49500 - $i*1100; g_show("Filling glider tracks -- $t ticks left."); g_update(); g_putcells(\@MWSSrecipes); g_run(1100); } g_show(""); # reset gen count to 0 g_setgen("0"); golly-2.5-src/Scripts/Perl/pop-plot.pl0000644000175100001440000002721212156145314014657 00000000000000# Run the current pattern for a given number of steps (using current # step size) and create a plot of population vs time in separate layer. # Author: Andrew Trevorrow (andrew@trevorrow.com), June 2007. use strict; use Time::HiRes qw (time); use List::Util qw (min max); # ------------------------------------------------------------------------------ # size of plot my $xlen = 500; # length of x axis my $ylen = 500; # length of y axis # ------------------------------------------------------------------------------ # create a mono-spaced ASCII font my %mfont; $mfont{' '} = g_parse(''); $mfont{'!'} = g_parse('2bo$2bo$2bo$2bo$2bo2$2bo!'); $mfont{'"'} = g_parse('bobo$bobo$bobo!'); $mfont{'#'} = g_parse('bobo$bobo$5o$bobo$5o$bobo$bobo!'); $mfont{'$'} = g_parse('b3o$obobo$obo$b3o$2bobo$obobo$b3o!'); $mfont{'%'} = g_parse('2o2bo$2o2bo$3bo$2bo$bo$o2b2o$o2b2o!'); $mfont{'&'} = g_parse('b2o$o2bo$o2bo$b2o$o2bo$o2bo$b2obo!'); $mfont{'\''} = g_parse('2bo$2bo$2bo!'); $mfont{'('} = g_parse('3bo$2bo$2bo$2bo$2bo$2bo$3bo!'); $mfont{')'} = g_parse('bo$2bo$2bo$2bo$2bo$2bo$bo!'); $mfont{'*'} = g_parse('$obobo$b3o$5o$b3o$obobo!'); $mfont{'+'} = g_parse('$2bo$2bo$5o$2bo$2bo!'); $mfont{','} = g_parse('6$2bo$2bo$bo!'); $mfont{'-'} = g_parse('3$5o!'); $mfont{'.'} = g_parse('6$2bo!'); $mfont{'/'} = g_parse('3bo$3bo$2bo$2bo$2bo$bo$bo!'); $mfont{'0'} = g_parse('b3o$o3bo$o2b2o$obobo$2o2bo$o3bo$b3o!'); $mfont{'1'} = g_parse('2bo$b2o$2bo$2bo$2bo$2bo$b3o!'); $mfont{'2'} = g_parse('b3o$o3bo$4bo$3bo$2bo$bo$5o!'); $mfont{'3'} = g_parse('b3o$o3bo$4bo$2b2o$4bo$o3bo$b3o!'); $mfont{'4'} = g_parse('3bo$2b2o$bobo$o2bo$5o$3bo$3bo!'); $mfont{'5'} = g_parse('5o$o$o$b3o$4bo$o3bo$b3o!'); $mfont{'6'} = g_parse('b3o$o$o$4o$o3bo$o3bo$b3o!'); $mfont{'7'} = g_parse('5o$4bo$3bo$2bo$bo$o$o!'); $mfont{'8'} = g_parse('b3o$o3bo$o3bo$b3o$o3bo$o3bo$b3o!'); $mfont{'9'} = g_parse('b3o$o3bo$o3bo$b4o$4bo$4bo$b3o!'); $mfont{':'} = g_parse('2$2bo4$2bo!'); $mfont{';'} = g_parse('2$2bo4$2bo$2bo$bo!'); $mfont{'<'} = g_parse('$3bo$2bo$bo$2bo$3bo!'); $mfont{'='} = g_parse('2$5o2$5o!'); $mfont{'>'} = g_parse('$bo$2bo$3bo$2bo$bo!'); $mfont{'?'} = g_parse('b3o$o3bo$4bo$2b2o$2bo2$2bo!'); $mfont{'@'} = g_parse('b3o$o3bo$ob3o$obobo$ob2o$o$b3o!'); $mfont{'A'} = g_parse('b3o$o3bo$o3bo$5o$o3bo$o3bo$o3bo!'); $mfont{'B'} = g_parse('4o$o3bo$o3bo$4o$o3bo$o3bo$4o!'); $mfont{'C'} = g_parse('b3o$o3bo$o$o$o$o3bo$b3o!'); $mfont{'D'} = g_parse('4o$o3bo$o3bo$o3bo$o3bo$o3bo$4o!'); $mfont{'E'} = g_parse('5o$o$o$3o$o$o$5o!'); $mfont{'F'} = g_parse('5o$o$o$3o$o$o$o!'); $mfont{'G'} = g_parse('b3o$o3bo$o$o2b2o$o3bo$o3bo$b3o!'); $mfont{'H'} = g_parse('o3bo$o3bo$o3bo$5o$o3bo$o3bo$o3bo!'); $mfont{'I'} = g_parse('b3o$2bo$2bo$2bo$2bo$2bo$b3o!'); $mfont{'J'} = g_parse('2b3o$3bo$3bo$3bo$3bo$o2bo$b2o!'); $mfont{'K'} = g_parse('o3bo$o2bo$obo$2o$obo$o2bo$o3bo!'); $mfont{'L'} = g_parse('o$o$o$o$o$o$5o!'); $mfont{'M'} = g_parse('o3bo$2ob2o$obobo$obobo$o3bo$o3bo$o3bo!'); $mfont{'N'} = g_parse('o3bo$2o2bo$obobo$o2b2o$o3bo$o3bo$o3bo!'); $mfont{'O'} = g_parse('b3o$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!'); $mfont{'P'} = g_parse('4o$o3bo$o3bo$4o$o$o$o!'); $mfont{'Q'} = g_parse('b3o$o3bo$o3bo$o3bo$obobo$o2bo$b2obo!'); $mfont{'R'} = g_parse('4o$o3bo$o3bo$4o$o2bo$o3bo$o3bo!'); $mfont{'S'} = g_parse('b3o$o3bo$o$b3o$4bo$o3bo$b3o!'); $mfont{'T'} = g_parse('5o$2bo$2bo$2bo$2bo$2bo$2bo!'); $mfont{'U'} = g_parse('o3bo$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!'); $mfont{'V'} = g_parse('o3bo$o3bo$o3bo$o3bo$o3bo$bobo$2bo!'); $mfont{'W'} = g_parse('o3bo$o3bo$o3bo$obobo$obobo$2ob2o$o3bo!'); $mfont{'X'} = g_parse('o3bo$o3bo$bobo$2bo$bobo$o3bo$o3bo!'); $mfont{'Y'} = g_parse('o3bo$o3bo$bobo$2bo$2bo$2bo$2bo!'); $mfont{'Z'} = g_parse('5o$4bo$3bo$2bo$bo$o$5o!'); $mfont{'['} = g_parse('2b2o$2bo$2bo$2bo$2bo$2bo$2b2o!'); $mfont{'\\'} = g_parse('bo$bo$2bo$2bo$2bo$3bo$3bo!'); $mfont{']'} = g_parse('b2o$2bo$2bo$2bo$2bo$2bo$b2o!'); $mfont{'^'} = g_parse('2bo$bobo$o3bo!'); $mfont{'_'} = g_parse('6$5o!'); $mfont{'`'} = g_parse('o$bo!'); $mfont{'a'} = g_parse('2$b4o$o3bo$o3bo$o3bo$b4o!'); $mfont{'b'} = g_parse('o$o$4o$o3bo$o3bo$o3bo$4o!'); $mfont{'c'} = g_parse('2$b4o$o$o$o$b4o!'); $mfont{'d'} = g_parse('4bo$4bo$b4o$o3bo$o3bo$o3bo$b4o!'); $mfont{'e'} = g_parse('2$b3o$o3bo$5o$o$b4o!'); $mfont{'f'} = g_parse('2b2o$bo2bo$bo$3o$bo$bo$bo!'); $mfont{'g'} = g_parse('2$b3o$o3bo$o3bo$o3bo$b4o$4bo$b3o!'); $mfont{'h'} = g_parse('o$o$ob2o$2o2bo$o3bo$o3bo$o3bo!'); $mfont{'i'} = g_parse('$2bo2$2bo$2bo$2bo$2b2o!'); $mfont{'j'} = g_parse('$3bo2$3bo$3bo$3bo$3bo$o2bo$b2o!'); $mfont{'k'} = g_parse('o$o$o2bo$obo$3o$o2bo$o3bo!'); $mfont{'l'} = g_parse('b2o$2bo$2bo$2bo$2bo$2bo$2b2o!'); $mfont{'m'} = g_parse('2$bobo$obobo$obobo$o3bo$o3bo!'); $mfont{'n'} = g_parse('2$4o$o3bo$o3bo$o3bo$o3bo!'); $mfont{'o'} = g_parse('2$b3o$o3bo$o3bo$o3bo$b3o!'); $mfont{'p'} = g_parse('2$4o$o3bo$o3bo$o3bo$4o$o$o!'); $mfont{'q'} = g_parse('2$b4o$o3bo$o3bo$o3bo$b4o$4bo$4bo!'); $mfont{'r'} = g_parse('2$ob2o$2o2bo$o$o$o!'); $mfont{'s'} = g_parse('2$b4o$o$b3o$4bo$4o!'); $mfont{'t'} = g_parse('$2bo$5o$2bo$2bo$2bo$3b2o!'); $mfont{'u'} = g_parse('2$o3bo$o3bo$o3bo$o3bo$b4o!'); $mfont{'v'} = g_parse('2$o3bo$o3bo$o3bo$bobo$2bo!'); $mfont{'w'} = g_parse('2$o3bo$o3bo$obobo$2ob2o$o3bo!'); $mfont{'x'} = g_parse('2$o3bo$bobo$2bo$bobo$o3bo!'); $mfont{'y'} = g_parse('2$o3bo$o3bo$o3bo$o3bo$b4o$4bo$b3o!'); $mfont{'z'} = g_parse('2$5o$3bo$2bo$bo$5o!'); $mfont{'{'} = g_parse('3bo$2bo$2bo$bo$2bo$2bo$3bo!'); $mfont{'|'} = g_parse('2bo$2bo$2bo$2bo$2bo$2bo$2bo!'); $mfont{'}'} = g_parse('bo$2bo$2bo$3bo$2bo$2bo$bo!'); $mfont{'~'} = g_parse('2$bo$obobo$3bo!'); # ------------------------------------------------------------------------------ # convert given string to a cell array using above mono-spaced font sub make_text { my $string = shift; my @p = (); my $x = 0; for my $ch (split(//,$string)) { $ch = '?' if not exists $mfont{$ch}; my $symbol = g_transform($mfont{$ch}, $x, 0); push(@p, @{$symbol}); $x += 6; } return \@p; } # ------------------------------------------------------------------------------ # draw a line of cells from x1,y1 to x2,y2 using Bresenham's algorithm sub draw_line { my ($x1, $y1, $x2, $y2) = @_; g_setcell($x1, $y1, 1); return if $x1 == $x2 and $y1 == $y2; my $dx = $x2 - $x1; my $ax = abs($dx) * 2; my $sx = 1; $sx = -1 if $dx < 0; my $dy = $y2 - $y1; my $ay = abs($dy) * 2; my $sy = 1; $sy = -1 if $dy < 0; if ($ax > $ay) { my $d = $ay - ($ax / 2); while ($x1 != $x2) { g_setcell($x1, $y1, 1); if ($d >= 0) { $y1 += $sy; $d -= $ax; } $x1 += $sx; $d += $ay; } } else { my $d = $ax - ($ay / 2); while ($y1 != $y2) { g_setcell($x1, $y1, 1); if ($d >= 0) { $x1 += $sx; $d -= $ay; } $y1 += $sy; $d += $ax; } } g_setcell($x2, $y2, 1); } # ------------------------------------------------------------------------------ # fit pattern in viewport if not empty and not completely visible sub fit_if_not_visible { my @r = g_getrect(); if (@r > 0 and !g_visrect(@r)) { g_fit() } } # ------------------------------------------------------------------------------ # return a rect which is the minimal bounding box of the given pattern; # note that the pattern is two-state so we don't have to worry about # getting a multi-state cell array here sub getminbox { my $cells = shift; my $len = @{$cells}; return () if $len < 2; my $minx = $cells->[0]; my $miny = $cells->[1]; my $maxx = $minx; my $maxy = $miny; for (my $x = 0; $x < $len; $x += 2) { if ($cells->[$x] < $minx) { $minx = $cells->[$x] } if ($cells->[$x] > $maxx) { $maxx = $cells->[$x] } } for (my $y = 1; $y < $len; $y += 2) { if ($cells->[$y] < $miny) { $miny = $cells->[$y] } if ($cells->[$y] > $maxy) { $maxy = $cells->[$y] } } return ($minx, $miny, $maxx - $minx + 1, $maxy - $miny + 1); } # ------------------------------------------------------------------------------ g_exit("There is no pattern.") if g_empty(); # check that a layer is available for population plot my $layername = "population plot"; my $poplayer = -1; for my $i (0..g_numlayers()-1) { if (g_getname($i) eq $layername) { $poplayer = $i; last; } } if ($poplayer == -1 and g_numlayers() == g_maxlayers()) { g_exit("You need to delete a layer."); } # prompt user for number of steps my $s = g_getstring("Enter the number of steps:", $xlen, "Population plotter"); g_exit() if length($s) == 0; g_exit("Number of steps is not a +ve integer: $s") if $s !~ /^\d+$/ or $s == 0; my $numsteps = $s; # generate pattern for given number of steps my @poplist = ( int(g_getpop()) ); my @genlist = ( int(g_getgen()) ); my $oldsecs = time; for my $i (0..$numsteps-1) { g_step(); push(@poplist, int(g_getpop())); push(@genlist, int(g_getgen())); my $newsecs = time; if ($newsecs - $oldsecs >= 1.0) { # show pattern every second $oldsecs = $newsecs; fit_if_not_visible(); g_update(); g_show(sprintf("Step %d of %d", $i+1, $numsteps)); } } fit_if_not_visible(); # save some info before we switch layers my $stepsize = sprintf("%d^%d", g_getbase(), g_getstep()); my $pattname = g_getname(); # create population plot in separate layer g_setoption("stacklayers", 0); g_setoption("tilelayers", 0); g_setoption("showlayerbar", 1); if ($poplayer == -1) { $poplayer = g_addlayer(); } else { g_setlayer($poplayer); } g_new($layername); # use same rule but without any suffix (we don't want a bounded grid) my ($rule, $suffix) = split(":",g_getrule(),2); g_setrule($rule); my ($deadr, $deadg, $deadb) = g_getcolor("deadcells"); if (($deadr + $deadg + $deadb) / 3 > 128) { # use black if light background g_setcolors([1,0,0,0]); } else { # use white if dark background g_setcolors([1,255,255,255]); } my $minpop = min(@poplist); my $maxpop = max(@poplist); if ($minpop == $maxpop) { # avoid division by zero $minpop -= 1; } my $popscale = ($maxpop - $minpop) / $ylen; my $mingen = min(@genlist); my $maxgen = max(@genlist); my $genscale = ($maxgen - $mingen) / $xlen; # draw axes with origin at 0,0 draw_line(0, 0, $xlen, 0); draw_line(0, 0, 0, -$ylen); # add annotation using mono-spaced ASCII font my $t = make_text(uc($pattname)); my @tbox = getminbox($t); g_putcells($t, ($xlen - $tbox[2]) / 2, -$ylen - 10 - $tbox[3]); $t = make_text("POPULATION"); @tbox = getminbox($t); g_putcells($t, -10 - $tbox[3], -($ylen - $tbox[2]) / 2, 0, 1, -1, 0); $t = make_text("$minpop"); @tbox = getminbox($t); g_putcells($t, -$tbox[2] - 10, -$tbox[3] / 2); $t = make_text("$maxpop"); @tbox = getminbox($t); g_putcells($t, -$tbox[2] - 10, -$ylen - $tbox[3] / 2); $t = make_text("GENERATION (step=$stepsize)"); @tbox = getminbox($t); g_putcells($t, ($xlen - $tbox[2]) / 2, 10); $t = make_text("$mingen"); @tbox = getminbox($t); g_putcells($t, -$tbox[2] / 2, 10); $t = make_text("$maxgen"); @tbox = getminbox($t); g_putcells($t, $xlen - $tbox[2] / 2, 10); # display result at scale 1:1 g_fit(); g_setmag(0); g_show(""); # plot the data (do last because it could take a while if numsteps is huge) my $x = int(($genlist[0] - $mingen) / $genscale); my $y = int(($poplist[0] - $minpop) / $popscale); $oldsecs = time; for my $i (0..$numsteps-1) { my $newx = int(($genlist[$i+1] - $mingen) / $genscale); my $newy = int(($poplist[$i+1] - $minpop) / $popscale); draw_line($x, -$y, $newx, -$newy); $x = $newx; $y = $newy; my $newsecs = time; if ($newsecs - $oldsecs >= 1.0) { # show pattern every second $oldsecs = $newsecs; g_update(); } } golly-2.5-src/Scripts/Perl/shift.pl0000644000175100001440000000403212156145314014215 00000000000000# Shift current selection by given x y amounts using optional mode. # Author: Andrew Trevorrow (andrew@trevorrow.com), June 2007. # Updated to check for bounded grid, Oct 2010. use strict; my @selrect = g_getselrect(); g_exit("There is no selection.") if @selrect == 0; my $s = g_getstring("Enter x y shift amounts and an optional mode\n". "(valid modes are copy/or/xor, default is or):", "0 0 or", "Shift selection"); my ($x, $y, $mode) = split(' ', $s, 3); # check x and y g_exit() if $x eq ""; g_exit("Enter x and y amounts separated by a space.") if $y eq ""; g_exit("Bad x value: $x") unless $x =~ /^[+-]?\d+$/; g_exit("Bad y value: $y") unless $y =~ /^[+-]?\d+$/; # check optional mode if ($mode eq "") { $mode = "or"; } else { $mode = lc($mode); $mode = "copy" if $mode eq "c"; $mode = "or" if $mode eq "o"; $mode = "xor" if $mode eq "x"; if (not ($mode eq "copy" or $mode eq "or" or $mode eq "xor")) { g_exit("Unknown mode: $mode (must be copy/or/xor)"); } } # abort shift if the new selection would be outside a bounded grid if (g_getwidth() > 0) { my $gridl = -int(g_getwidth()/2); my $gridr = $gridl + g_getwidth() - 1; my $newl = $selrect[0] + $x; my $newr = $newl + $selrect[2] - 1; if ($newl < $gridl or $newr > $gridr) { g_exit("New selection would be outside grid."); } } if (g_getheight() > 0) { my $gridt = -int(g_getheight()/2); my $gridb = $gridt + g_getheight() - 1; my $newt = $selrect[1] + $y; my $newb = $newt + $selrect[3] - 1; if ($newt < $gridt or $newb > $gridb) { g_exit("New selection would be outside grid."); } } # do the shift by cutting the current selection and pasting it into # the new position without changing the current clipboard pattern my $selcells = g_getcells(@selrect); g_clear(0); $selrect[0] += $x; $selrect[1] += $y; g_select(@selrect); g_clear(0) if $mode eq "copy"; g_putcells($selcells, $x, $y, 1, 0, 0, 1, $mode); g_fitsel() if !g_visrect(@selrect); golly-2.5-src/Scripts/Perl/tile.pl0000644000175100001440000001311312156145314014035 00000000000000# Tile current selection with pattern inside selection. # Author: Andrew Trevorrow (andrew@trevorrow.com), June 2007. # Updated to handle multi-state patterns, Aug 2008. use strict; my @selrect = g_getselrect(); g_exit("There is no selection.") if @selrect == 0; my $selpatt = g_getcells(@selrect); g_exit("No pattern in selection.") if @{$selpatt} == 0; # determine if selpatt is one-state or multi-state my $inc = 2; if (@{$selpatt} & 1 == 1) { $inc = 3 } # ------------------------------------------------------------------------------ # return a rect which is the minimal bounding box of given pattern sub getminbox { my $cells = shift; my $len = @{$cells}; return () if $len < 2; my $minx = $cells->[0]; my $miny = $cells->[1]; my $maxx = $minx; my $maxy = $miny; # ignore padding int if present $len -= 1 if ($inc == 3) and ($len % 3 == 1); for (my $x = 0; $x < $len; $x += $inc) { if ($cells->[$x] < $minx) { $minx = $cells->[$x] } if ($cells->[$x] > $maxx) { $maxx = $cells->[$x] } } for (my $y = 1; $y < $len; $y += $inc) { if ($cells->[$y] < $miny) { $miny = $cells->[$y] } if ($cells->[$y] > $maxy) { $maxy = $cells->[$y] } } return ($minx, $miny, $maxx - $minx + 1, $maxy - $miny + 1); } # ------------------------------------------------------------------------------ sub clip_left { my ($cells, $left) = @_; my $len = @{$cells}; my $x = 0; if ($inc == 3) { # ignore padding int if present $len -= 1 if $len % 3 == 1; while ($x < $len) { if ($cells->[$x] >= $left) { g_setcell($cells->[$x], $cells->[$x+1], $cells->[$x+2]); } $x += 3; } } else { while ($x < $len) { if ($cells->[$x] >= $left) { g_setcell($cells->[$x], $cells->[$x+1], 1); } $x += 2; } } } # ------------------------------------------------------------------------------ sub clip_right { my ($cells, $right) = @_; my $len = @{$cells}; my $x = 0; if ($inc == 3) { # ignore padding int if present $len -= 1 if $len % 3 == 1; while ($x < $len) { if ($cells->[$x] <= $right) { g_setcell($cells->[$x], $cells->[$x+1], $cells->[$x+2]); } $x += 3; } } else { while ($x < $len) { if ($cells->[$x] <= $right) { g_setcell($cells->[$x], $cells->[$x+1], 1); } $x += 2; } } } # ------------------------------------------------------------------------------ sub clip_top { my ($cells, $top) = @_; my $len = @{$cells}; my $y = 1; if ($inc == 3) { # ignore padding int if present $len -= 1 if $len % 3 == 1; while ($y < $len) { if ($cells->[$y] >= $top) { g_setcell($cells->[$y-1], $cells->[$y], $cells->[$y+1]); } $y += 3; } } else { while ($y < $len) { if ($cells->[$y] >= $top) { g_setcell($cells->[$y-1], $cells->[$y], 1); } $y += 2; } } } # ------------------------------------------------------------------------------ sub clip_bottom { my ($cells, $bottom) = @_; my $len = @{$cells}; my $y = 1; if ($inc == 3) { # ignore padding int if present $len -= 1 if $len % 3 == 1; while ($y < $len) { if ($cells->[$y] <= $bottom) { g_setcell($cells->[$y-1], $cells->[$y], $cells->[$y+1]); } $y += 3; } } else { while ($y < $len) { if ($cells->[$y] <= $bottom) { g_setcell($cells->[$y-1], $cells->[$y], 1); } $y += 2; } } } # ------------------------------------------------------------------------------ # set selection edges my $selleft = $selrect[0]; my $seltop = $selrect[1]; my $selright = $selleft + $selrect[2] - 1; my $selbottom = $seltop + $selrect[3] - 1; # find selpatt's minimal bounding box my @bbox = getminbox($selpatt); my $i; # first tile selpatt horizontally, clipping where necessary my $left = $bbox[0]; my $right = $left + $bbox[2] - 1; $i = 0; while ($left > $selleft) { $left -= $bbox[2]; $i += 1; if ($left >= $selleft) { g_putcells($selpatt, -$bbox[2] * $i, 0); } else { my $tempcells = g_transform($selpatt, -$bbox[2] * $i, 0); clip_left($tempcells, $selleft); } } $i = 0; while ($right < $selright) { $right += $bbox[2]; $i += 1; if ($right <= $selright) { g_putcells($selpatt, $bbox[2] * $i, 0); } else { my $tempcells = g_transform($selpatt, $bbox[2] * $i, 0); clip_right($tempcells, $selright); } } # get new selection pattern and tile vertically, clipping where necessary $selpatt = g_getcells(@selrect); @bbox = getminbox($selpatt); my $top = $bbox[1]; my $bottom = $top + $bbox[3] - 1; $i = 0; while ($top > $seltop) { $top -= $bbox[3]; $i += 1; if ($top >= $seltop) { g_putcells($selpatt, 0, -$bbox[3] * $i); } else { my $tempcells = g_transform($selpatt, 0, -$bbox[3] * $i); clip_top($tempcells, $seltop); } } $i = 0; while ($bottom < $selbottom) { $bottom += $bbox[3]; $i += 1; if ($bottom <= $selbottom) { g_putcells($selpatt, 0, $bbox[3] * $i); } else { my $tempcells = g_transform($selpatt, 0, $bbox[3] * $i); clip_bottom($tempcells, $selbottom); } } g_fitsel() if !g_visrect(@selrect); golly-2.5-src/Scripts/Perl/tile-with-clip.pl0000644000175100001440000000427312156145314015742 00000000000000# Tile current selection with clipboard pattern. # Author: Andrew Trevorrow (andrew@trevorrow.com), June 2007. # Updated to handle multi-state patterns, Aug 2008. use strict; # assume one-state cell array (may change below) my $multistate = 0; # ------------------------------------------------------------------------------ sub clip_rb { # set given cells except those outside given right and bottom edges my ($cells, $right, $bottom) = @_; my $len = @{$cells}; my $x = 0; my $y = 1; if ($multistate) { # ignore padding int if present $len -= 1 if $len % 3 == 1; while ($x < $len) { if (($cells->[$x] <= $right) and ($cells->[$y] <= $bottom)) { g_setcell($cells->[$x], $cells->[$y], $cells->[$x+2]); } $x += 3; $y += 3; } } else { while ($x < $len) { if (($cells->[$x] <= $right) and ($cells->[$y] <= $bottom)) { g_setcell($cells->[$x], $cells->[$y], 1); } $x += 2; $y += 2; } } } # ------------------------------------------------------------------------------ my @selrect = g_getselrect(); g_exit("There is no selection.") if @selrect == 0; # set selection edges my $selleft = $selrect[0]; my $seltop = $selrect[1]; my $selright = $selleft + $selrect[2] - 1; my $selbottom = $seltop + $selrect[3] - 1; my $p = g_getclip(); # 1st 2 items are wd,ht my $pwidth = shift(@{$p}); my $pheight = shift(@{$p}); if (@{$p} & 1 == 1) { $multistate = 1 } g_clear(0); if (@{$p} > 0) { # tile selrect with p, clipping right & bottom edges if necessary my $y = $seltop; while ($y <= $selbottom) { my $bottom = $y + $pheight - 1; my $x = $selleft; while ($x <= $selright) { my $right = $x + $pwidth - 1; if (($right <= $selright) and ($bottom <= $selbottom)) { g_putcells($p, $x, $y); } else { my $tempcells = g_transform($p, $x, $y); clip_rb($tempcells, $selright, $selbottom); } $x += $pwidth; } $y += $pheight; } } g_fitsel() if !g_visrect(@selrect); golly-2.5-src/Scripts/Python/0000755000175100001440000000000012156146015013202 500000000000000golly-2.5-src/Scripts/Python/glife/0000755000175100001440000000000012156146015014270 500000000000000golly-2.5-src/Scripts/Python/glife/base.py0000644000175100001440000001041712156145314015500 00000000000000from glife import * block = pattern (""" ** ** """) blinker = pattern ("***", -1, 0) glider = pattern (""" .** **. ..* """) lwss = pattern (""" ****. *...* *.... .*..* """) mwss = pattern (""" *****. *....* *..... .*...* ...*.. """) hwss = pattern (""" ******. *.....* *...... .*....* ...**.. """) eater = hook = pattern (""" ** * .*** ...* """) queenbee = pattern (""" **.. ..*. ...* ...* ...* ..*. **.. """) herschel = pattern (""" ***. .*.. .*** """) bheptomino = pattern (""" **. .** **. *.. """) tub = pattern (""" .*. *.* .*. """, -1, -1) boat = pattern (""" **. *.* .*. """) long_boat = pattern (""" **. *.* .*.* ..* """) ship = pattern (""" **. *.* .** """, -1, -1) beehive = pattern (""" .**. *..* .**. """, 0, -1) loaf = pattern (""" .**. *..* *.*. .*.. """) snake = pattern (""" *.** **.* """) aircraft_carrier = pattern (""" **.. *..* ..** """) honeyfarm = pattern (""" ......*...... .....*.*..... .....*.*..... ......*...... ............. .**.......**. *..*.....*..* .**.......**. ............. ......*...... .....*.*..... .....*.*..... ......*...... """, -6, -6) beacon = pattern (""" **.. *... ...* ..** """) blocker = pattern (""" ......*.*. .....*.... **..*....* **.*..*.** ....**.... """) clock = pattern (""" ..*. **.. ..** .*.. """) dart = pattern (""" ........*. .......*.* ......**.. .........* .....*...* ..*..*.... .*.*..**** *..*...... .*.*..**** ..*..*.... .....*...* .........* ......**.. .......*.* ........*. """, 0, -7) big_beacon = pattern (""" ***... ***... ***... ...*** ...*** ...*** """) middleweight_volcano = pattern (""" ...*******... .***.***.***. *....***....* .****.*.***.* ...........*. *.**.*.*.*... **.*.*.*.**.. ....*..*.*... .....**..*... .........**.. """, -6, 0) heavyweight_volcano = pattern (""" .........*.......................... ........*.*......................... ......***.*......................... .....*....**.*...................... .....*.**...**......**.............. ....**.*.**.........*.*............. .........*.*****......*..*.**....... ..*.**.**.*.....*....**.*.**.*...... .....**.....****........*....*...... *...*.*..*...*.*....**.*.****.**.... *...*.*..**.*.**.**....*.*....*.*... .....**...***.**.*.***.*..***...*... ..*.**.**.**.............*.*..*.*.** ...........*......*.*.*.*..**.*.*.*. ....**.*.*.**......**.*.*.*...*.*.*. .....*.**.*..*.......*.**..****.**.. .....*....*.*........*...**......... ....**....**........**...*..*....... ...........................**....... """) galaxy = pattern (""" ******.** ******.** .......** **.....** **.....** **.....** **....... **.****** **.****** """, -4, -4) orion = pattern (""" ...**......... ...*.*........ ...*.......... **.*.......... *....*........ *.**......***. .....***....** ......***.*.*. .............* ......*.*..... .....**.*..... ......*....... ....**.*...... .......*...... .....**....... """) pentadecathlon = pattern (""" ..*....*.. **.****.** ..*....*.. """, 0, -1) pi = pattern (""" *** *.* *.* """) pond = pattern (""" .**. *..* *..* .**. """) pulsar = pattern (""" ..***...***.. ............. *....*.*....* *....*.*....* *....*.*....* ..***...***.. ............. ..***...***.. *....*.*....* *....*.*....* *....*.*....* ............. ..***...***.. """, -6, -6) rpentomino = pattern (""" .** ** .* """) rabbits = pattern (""" *...*** ***..*. .*..... """) spider = pattern (""" .........*.......*......... ...**.*.*.**...**.*.*.**... ***.*.***.........***.*.*** *...*.*.....*.*.....*.*...* ....**......*.*......**.... .**.........*.*.........**. .**.**...............**.**. .....*...............*..... """, -13, 0) lightweight_volcano = pattern (""" ...**..**... .***.**.***. *..........* .****..****. ....*..*.... .**......**. .*..*..*..*. ..***..***.. ............ ****.**.**** *..**..**..* """) unix = pattern (""" ..**.... ....*.** *..*..** *.*..... .*...... ........ .**..... .**..... """) biblocker = pattern (""" ..................*........... .................*.**......... .................*.**......... ..................**.......... .............................. .......**............**....... .......**............**....... .............................. .............................. ......*.*..................... .....*..................**.... **..*....*..........**.*..*.** **.*..*.**..........**..*....* ....**...................*.... ..........................*.*. """) golly-2.5-src/Scripts/Python/glife/BuiltinIcons.py0000644000175100001440000002523512156145314017174 00000000000000# This module defines strings containing XPM data that matches # Golly's built-in icons (see the XPM data in wxalgos.cpp). # The strings are used by icon-importer.py and icon_exporter.py. circles = ''' XPM /* width height num_colors chars_per_pixel */ "31 31 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "..........BCDEEEEEDCB.........." ".........CEEEEEEEEEEEC........." ".......BEEEEEEEEEEEEEEEB......." "......DEEEEEEEEEEEEEEEEED......" ".....DEEEEEEEEEEEEEEEEEEED....." "....BEEEEEEEEEEEEEEEEEEEEEB...." "....EEEEEEEEEEEEEEEEEEEEEEE...." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..EEEEEEEEEEEEEEEEEEEEEEEEEEE.." "..DEEEEEEEEEEEEEEEEEEEEEEEEED.." "..CEEEEEEEEEEEEEEEEEEEEEEEEEC.." "..BEEEEEEEEEEEEEEEEEEEEEEEEEB.." "...CEEEEEEEEEEEEEEEEEEEEEEEC..." "....EEEEEEEEEEEEEEEEEEEEEEE...." "....BEEEEEEEEEEEEEEEEEEEEEB...." ".....DEEEEEEEEEEEEEEEEEEED....." "......DEEEEEEEEEEEEEEEEED......" ".......BEEEEEEEEEEEEEEEB......." ".........CEEEEEEEEEEEC........." "..........BCDEEEEEDCB.........." "..............................." "..............................." XPM /* width height num_colors chars_per_pixel */ "15 15 5 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" /* icon for state 1 */ "..............." "....BDEEEDB...." "...DEEEEEEED..." "..DEEEEEEEEED.." ".BEEEEEEEEEEEB." ".DEEEEEEEEEEED." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".EEEEEEEEEEEEE." ".DEEEEEEEEEEED." ".BEEEEEEEEEEEB." "..DEEEEEEEEED.." "...DEEEEEEED..." "....BDEEEDB...." "..............." XPM /* width height num_colors chars_per_pixel */ "7 7 6 1" /* colors */ ". c #000000" "B c #404040" "C c #808080" "D c #C0C0C0" "E c #FFFFFF" "F c #E0E0E0" /* icon for state 1 */ ".BFEFB." "BEEEEEB" "FEEEEEF" "EEEEEEE" "FEEEEEF" "BEEEEEB" ".BFEFB." ''' diamonds = ''' XPM /* width height num_colors chars_per_pixel */ "31 31 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "..............................." "...............B..............." "..............BBB.............." ".............BBBBB............." "............BBBBBBB............" "...........BBBBBBBBB..........." "..........BBBBBBBBBBB.........." ".........BBBBBBBBBBBBB........." "........BBBBBBBBBBBBBBB........" ".......BBBBBBBBBBBBBBBBB......." "......BBBBBBBBBBBBBBBBBBB......" ".....BBBBBBBBBBBBBBBBBBBBB....." "....BBBBBBBBBBBBBBBBBBBBBBB...." "...BBBBBBBBBBBBBBBBBBBBBBBBB..." "..BBBBBBBBBBBBBBBBBBBBBBBBBBB.." "...BBBBBBBBBBBBBBBBBBBBBBBBB..." "....BBBBBBBBBBBBBBBBBBBBBBB...." ".....BBBBBBBBBBBBBBBBBBBBB....." "......BBBBBBBBBBBBBBBBBBB......" ".......BBBBBBBBBBBBBBBBB......." "........BBBBBBBBBBBBBBB........" ".........BBBBBBBBBBBBB........." "..........BBBBBBBBBBB.........." "...........BBBBBBBBB..........." "............BBBBBBB............" ".............BBBBB............." "..............BBB.............." "...............B..............." "..............................." "..............................." XPM /* width height num_colors chars_per_pixel */ "15 15 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." ".......B......." "......BBB......" ".....BBBBB....." "....BBBBBBB...." "...BBBBBBBBB..." "..BBBBBBBBBBB.." ".BBBBBBBBBBBBB." "..BBBBBBBBBBB.." "...BBBBBBBBB..." "....BBBBBBB...." ".....BBBBB....." "......BBB......" ".......B......." "..............." XPM /* width height num_colors chars_per_pixel */ "7 7 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "...B..." "..BBB.." ".BBBBB." "BBBBBBB" ".BBBBB." "..BBB.." "...B..." ''' hexagons = ''' XPM /* width height num_colors chars_per_pixel */ "31 31 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #808080" /* icon for state 1 */ ".....BBC......................." "....BBBBBC....................." "...BBBBBBBBC..................." "..BBBBBBBBBBBC................." ".BBBBBBBBBBBBBBC..............." "BBBBBBBBBBBBBBBBBC............." "BBBBBBBBBBBBBBBBBBBC..........." "CBBBBBBBBBBBBBBBBBBBBC........." ".BBBBBBBBBBBBBBBBBBBBBB........" ".CBBBBBBBBBBBBBBBBBBBBBC......." "..BBBBBBBBBBBBBBBBBBBBBB......." "..CBBBBBBBBBBBBBBBBBBBBBC......" "...BBBBBBBBBBBBBBBBBBBBBB......" "...CBBBBBBBBBBBBBBBBBBBBBC....." "....BBBBBBBBBBBBBBBBBBBBBB....." "....CBBBBBBBBBBBBBBBBBBBBBC...." ".....BBBBBBBBBBBBBBBBBBBBBB...." ".....CBBBBBBBBBBBBBBBBBBBBBC..." "......BBBBBBBBBBBBBBBBBBBBBB..." "......CBBBBBBBBBBBBBBBBBBBBBC.." ".......BBBBBBBBBBBBBBBBBBBBBB.." ".......CBBBBBBBBBBBBBBBBBBBBBC." "........BBBBBBBBBBBBBBBBBBBBBB." ".........CBBBBBBBBBBBBBBBBBBBBC" "...........CBBBBBBBBBBBBBBBBBBB" ".............CBBBBBBBBBBBBBBBBB" "...............CBBBBBBBBBBBBBB." ".................CBBBBBBBBBBB.." "...................CBBBBBBBB..." ".....................CBBBBB...." ".......................CBB....." XPM /* width height num_colors chars_per_pixel */ "15 15 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #808080" /* icon for state 1 */ "...BBC........." "..BBBBBC......." ".BBBBBBBBC....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "CBBBBBBBBBBBC.." ".BBBBBBBBBBBB.." ".CBBBBBBBBBBBC." "..BBBBBBBBBBBB." "..CBBBBBBBBBBBC" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....CBBBBBBBB." ".......CBBBBB.." ".........CBB..." XPM /* width height num_colors chars_per_pixel */ "7 7 3 1" /* colors */ ". c #000000" "B c #FFFFFF" "C c #808080" /* icon for state 1 */ ".BBC..." "BBBBB.." "BBBBBB." "CBBBBBC" ".BBBBBB" "..BBBBB" "...CBB." ''' triangles = ''' XPM /* width height num_colors chars_per_pixel */ "31 93 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............................." "B.............................." "BB............................." "BBB............................" "BBBB..........................." "BBBBB.........................." "BBBBBB........................." "BBBBBBB........................" "BBBBBBBB......................." "BBBBBBBBB......................" "BBBBBBBBBB....................." "BBBBBBBBBBB...................." "BBBBBBBBBBBB..................." "BBBBBBBBBBBBB.................." "BBBBBBBBBBBBBB................." "BBBBBBBBBBBBBBB................" "BBBBBBBBBBBBBBBB..............." "BBBBBBBBBBBBBBBBB.............." "BBBBBBBBBBBBBBBBBB............." "BBBBBBBBBBBBBBBBBBB............" "BBBBBBBBBBBBBBBBBBBB..........." "BBBBBBBBBBBBBBBBBBBBB.........." "BBBBBBBBBBBBBBBBBBBBBB........." "BBBBBBBBBBBBBBBBBBBBBBB........" "BBBBBBBBBBBBBBBBBBBBBBBB......." "BBBBBBBBBBBBBBBBBBBBBBBBB......" "BBBBBBBBBBBBBBBBBBBBBBBBBB....." "BBBBBBBBBBBBBBBBBBBBBBBBBBB...." "BBBBBBBBBBBBBBBBBBBBBBBBBBBB..." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.." "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB." /* icon for state 2 */ ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "..BBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "...BBBBBBBBBBBBBBBBBBBBBBBBBBBB" "....BBBBBBBBBBBBBBBBBBBBBBBBBBB" ".....BBBBBBBBBBBBBBBBBBBBBBBBBB" "......BBBBBBBBBBBBBBBBBBBBBBBBB" ".......BBBBBBBBBBBBBBBBBBBBBBBB" "........BBBBBBBBBBBBBBBBBBBBBBB" ".........BBBBBBBBBBBBBBBBBBBBBB" "..........BBBBBBBBBBBBBBBBBBBBB" "...........BBBBBBBBBBBBBBBBBBBB" "............BBBBBBBBBBBBBBBBBBB" ".............BBBBBBBBBBBBBBBBBB" "..............BBBBBBBBBBBBBBBBB" "...............BBBBBBBBBBBBBBBB" "................BBBBBBBBBBBBBBB" ".................BBBBBBBBBBBBBB" "..................BBBBBBBBBBBBB" "...................BBBBBBBBBBBB" "....................BBBBBBBBBBB" ".....................BBBBBBBBBB" "......................BBBBBBBBB" ".......................BBBBBBBB" "........................BBBBBBB" ".........................BBBBBB" "..........................BBBBB" "...........................BBBB" "............................BBB" ".............................BB" "..............................B" "..............................." /* icon for state 3 */ ".BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "B.BBBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BB.BBBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBB.BBBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBB.BBBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBB.BBBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBB.BBBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBB.BBBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBB.BBBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBB.BBBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBB.BBBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBB.BBBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBB.BBBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBB.BBBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBB.BBBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBB.BBBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBB.BBBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBB.BBBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBB.BBBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBB.BBBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBB.BBBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBB.BBBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBB.BBBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBB.BBBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBB.BBBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBB.BBBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBB.BBBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBB.BBB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBB.BB" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBB.B" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB." XPM /* width height num_colors chars_per_pixel */ "15 45 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "..............." "B.............." "BB............." "BBB............" "BBBB..........." "BBBBB.........." "BBBBBB........." "BBBBBBB........" "BBBBBBBB......." "BBBBBBBBB......" "BBBBBBBBBB....." "BBBBBBBBBBB...." "BBBBBBBBBBBB..." "BBBBBBBBBBBBB.." "BBBBBBBBBBBBBB." /* icon for state 2 */ ".BBBBBBBBBBBBBB" "..BBBBBBBBBBBBB" "...BBBBBBBBBBBB" "....BBBBBBBBBBB" ".....BBBBBBBBBB" "......BBBBBBBBB" ".......BBBBBBBB" "........BBBBBBB" ".........BBBBBB" "..........BBBBB" "...........BBBB" "............BBB" ".............BB" "..............B" "..............." /* icon for state 3 */ ".BBBBBBBBBBBBBB" "B.BBBBBBBBBBBBB" "BB.BBBBBBBBBBBB" "BBB.BBBBBBBBBBB" "BBBB.BBBBBBBBBB" "BBBBB.BBBBBBBBB" "BBBBBB.BBBBBBBB" "BBBBBBB.BBBBBBB" "BBBBBBBB.BBBBBB" "BBBBBBBBB.BBBBB" "BBBBBBBBBB.BBBB" "BBBBBBBBBBB.BBB" "BBBBBBBBBBBB.BB" "BBBBBBBBBBBBB.B" "BBBBBBBBBBBBBB." XPM /* width height num_colors chars_per_pixel */ "7 21 2 1" /* colors */ ". c #000000" "B c #FFFFFF" /* icon for state 1 */ "......." "B......" "BB....." "BBB...." "BBBB..." "BBBBB.." "BBBBBB." /* icon for state 2 */ ".BBBBBB" "..BBBBB" "...BBBB" "....BBB" ".....BB" "......B" "......." /* icon for state 3 */ ".BBBBBB" "B.BBBBB" "BB.BBBB" "BBB.BBB" "BBBB.BB" "BBBBB.B" "BBBBBB." ''' golly-2.5-src/Scripts/Python/glife/EmulateHexagonal.py0000644000175100001440000001171012156145314020006 00000000000000import os from glife.RuleTree import * def HexagonalTransitionsToRuleTree(neighborhood,n_states,transitions,rule_name): '''Convert a set of hexagonal neighborhood transitions to a Moore neighborhood rule tree.''' tree = RuleTree(n_states,8) for t in transitions: # C,S,E,W,N,SE,(SW),(NE),NW tree.add_rule([t[0],t[4],t[2],t[5],t[1],t[3],range(n_states),range(n_states),t[6]],t[7][0]) tree.write( golly.getdir('rules')+rule_name+".tree" ) def MakePlainHexagonalIcons(n_states,rule_name): '''Make some monochrome hexagonal icons.''' width = 31*(n_states-1) height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] huge = [[0,0,0,0,0,1,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,1,1,1,1,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,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,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,1,1,0,0,0,0,0]] big = [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]] small = [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,1,1,1,1,0], [0,1,1,1,1,1,0], [0,1,1,1,1,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]] fg = (255,255,255) bg = (0,0,0) for s in range(1,n_states): for row in range(31): for column in range(31): pixels[row][(s-1)*31+column] = [bg,fg][huge[row][column]] for row in range(15): for column in range(15): pixels[31+row][(s-1)*31+column] = [bg,fg][big[row][column]] for row in range(7): for column in range(7): pixels[46+row][(s-1)*31+column] = [bg,fg][small[row][column]] return pixels def EmulateHexagonal(neighborhood,n_states,transitions,input_filename): '''Emulate a hexagonal neighborhood rule table with a Moore neighborhood rule tree.''' rule_name = os.path.splitext(os.path.split(input_filename)[1])[0] HexagonalTransitionsToRuleTree(neighborhood,n_states,transitions,rule_name) pixels = MakePlainHexagonalIcons(n_states,rule_name) # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, n_states, pixels) return rule_name golly-2.5-src/Scripts/Python/glife/EmulateMargolus.py0000644000175100001440000001671312156145314017701 00000000000000# We emulate Margolus and related partitioning neighborhoods by making a 2-layer CA, with a # background layer (0,1) that alternates a sort-of-checker pattern, and the normal states on top. # # For the Margolus neighborhood there is only one 'phase'; one background pattern, that alternates # between top-left and bottom-right of a 2x2 region. # # For the square4_* neighborhoods we need two phases since the background shifts in different # directions to make a figure-8 or cyclic pattern. # # By looking at the nearby background states, each cell can work out where in the partition it is # and what the current phase is. It can therefore update the cell states layer correctly, and also # update the background layer for the next phase. import golly import os from glife.RuleTree import * # state s (0,N-1) on background state b (0,1) becomes 1+b+2s with 0 = off-grid def encode(s,b): # (s is a list) return [ 1+b+2*se for se in s ] # The BackgroundInputs array tells us where we are in the block: # # Phase 1: 0 1 (the lone 0 is the top-left of the block to be updated) # 1 1 # # Phase 2: 1 0 (the lone 1 is the top-left of the block to be updated) # 0 0 # # (imagine the blocks stacked together to see why this gives the values below) # BackgroundInputs = [ # each C,S,E,W,N,SE,SW,NE,NW [0,1,1,1,1,1,1,1,1], # this pattern of background states means that this is top-left, phase 1 [1,1,0,0,1,1,1,1,1], # top-right, phase 1 [1,0,1,1,0,1,1,1,1], # bottom-left, phase 1 [1,1,1,1,1,0,0,0,0], # bottom-right, phase 1 [1,0,0,0,0,0,0,0,0], # top-left, phase 2 [0,0,1,1,0,0,0,0,0], # top-right, phase 2 [0,1,0,0,1,0,0,0,0], # bottom-left, phase 2 [0,0,0,0,0,1,1,1,1], # bottom-right, phase 2 ] # The BackgroundOutputs array tells us how the background pattern changes: # # Margolus: 0 1 become 1 1 (block moves diagonally) # 1 1 1 0 # # square4_figure8v: 0 1 becomes 0 0 (block moves diagonally) # 1 1 0 1 # # 1 0 becomes 1 0 (block moves horizontally) # 0 0 1 1 # # square4_figure8h: 0 1 becomes 0 0 (block moves diagonally) # 1 1 0 1 # # 1 0 becomes 1 1 (block moves vertically) # 0 0 0 1 # # square4_cyclic : 0 1 becomes 0 0 (block moves vertically) # 1 1 1 0 # # 1 0 becomes 1 0 (block moves horizontally) # 0 0 1 1 # # (Following Tim Tyler: http://www.cell-auto.com/neighbourhood/square4/index.html) # BackgroundOutputs = { # (top-left, top-right, bottom-left, bottom-right)*2 (or *1 for Margolus) "Margolus": [1,1,1,0], # phase 1 -> phase 1 "square4_figure8v":[0,0,0,1,1,0,1,1], # phase 1 <--> phase 2 "square4_figure8h":[0,0,0,1,1,1,0,1], # phase 1 <--> phase 2 "square4_cyclic": [0,0,1,0,1,0,1,1], # phase 1 <--> phase 2 } # The ForegroundInputs array tells us, for each of the 4 positions (0=top-left, 1=top-right, # 2=bottom-left, 3=bottom-right), where the other positions are found in our Moore neighborhood # e.g. if we're 0 (top-left) then the first row tells us that to our South is position 2 (bottom-left) # and to our South-East is position 3 (bottom-right). # (N.B. these values don't depend on the phase or the background pattern) ForegroundInputs = [ [0,2,1,-1,-1,3,-1,-1,-1], # what surrounds this entry? [1,3,-1,0,-1,-1,2,-1,-1], # (C,S,E,W,N,SE,SW,NE,NW) [2,-1,3,-1,0,-1,-1,1,-1], # (-1 = anything) [3,-1,-1,2,1,-1,-1,-1,0] # (0,1,2,3 = index of Margolus input) ] def EmulateMargolus(neighborhood,n_states,transitions,input_filename): '''Emulate a Margolus or square4_* neighborhood rule table with a Moore neighborhood rule tree.''' rule_name = os.path.splitext(os.path.split(input_filename)[1])[0] total_states = 1+2*n_states tree = RuleTree(total_states,8) # now work through the transitions for tr in transitions: for iOutput,background_output in enumerate(BackgroundOutputs[neighborhood]): bg_inputs = BackgroundInputs[iOutput] iEntry = iOutput % 4 # (0=top-left, 1=top-right, 2=bottom-left, 3=bottom-right) rule_inputs = [] for i in range(9): if ForegroundInputs[iEntry][i]==-1: rule_inputs.append(encode( range(n_states), bg_inputs[i] ) + [0]) # wildcard else: rule_inputs.append(encode( tr[ForegroundInputs[iEntry][i]], bg_inputs[i] )) tree.add_rule( rule_inputs, encode( tr[iEntry+4], background_output )[0] ) # supply default behaviour: background still changes even if the state doesn't for iState in range(n_states): for iOutput,background_output in enumerate(BackgroundOutputs[neighborhood]): bg_inputs = BackgroundInputs[iOutput] tree.add_rule( [ encode( [iState], bg_inputs[0] ) ] + [ encode( range(n_states), bg_inputs[i] )+[0] for i in range(1,9) ], # wildcard encode( [iState], background_output )[0] ) # output the rule tree golly.show("Compressing rule tree and saving to file...") tree.write(golly.getdir('rules') + rule_name + '.tree') # also save a .colors file golly.show("Generating colors...") # read rule_name+'.colors' file if it exists cfn = os.path.split(input_filename)[0] + '/' + os.path.splitext(os.path.split(input_filename)[1])[0] + ".colors" try: cf = open(cfn,'r') except IOError: # use Golly's default random colours random_colors=[[90,90,90],[0,255,127],[127,0,255],[148,148,148],[128,255,0],[255,0,128],[0,128,255],[1,159,0], [159,0,1],[255,254,96],[0,1,159],[96,255,254],[254,96,255],[126,125,21],[21,126,125],[125,21,126], [255,116,116],[116,255,116],[116,116,255],[228,227,0],[28,255,27],[255,27,28],[0,228,227], [227,0,228],[27,28,255],[59,59,59],[234,195,176],[175,196,255],[171,194,68],[194,68,171], [68,171,194],[72,184,71],[184,71,72],[71,72,184],[169,255,188],[252,179,63],[63,252,179], [179,63,252],[80,9,0],[0,80,9],[9,0,80],[255,175,250],[199,134,213],[115,100,95],[188,163,0], [0,188,163],[163,0,188],[203,73,0],[0,203,73],[73,0,203],[94,189,0],[189,0,94]] colors = dict(zip(range(len(random_colors)),random_colors)) else: # read from the .colors file colors = {} for line in cf: if line[0:5]=='color': entries = map(int,line[5:].replace('=',' ').replace('\n',' ').split()) if len(entries)<4: continue # too few entries, ignore colors.update({entries[0]:[entries[1],entries[2],entries[3]]}) # (TODO: support gradients in .colors) # provide a deep blue background if none provided if not 0 in colors: colors.update({0:[0,0,120]}) c = open(golly.getdir('rules')+rule_name+".colors",'w') for col in colors.items()[:n_states]: c.write('color='+str(col[0]*2+1)+' '+' '.join(map(str,col[1]))+'\n') c.write('color='+str(col[0]*2+2)+' '+' '.join([ str(int(x*0.7)) for x in col[1] ])+'\n') # (darken slightly) c.flush() c.close() # use rule_name.tree and rule_name.colors to create rule_name.rule (no icon info) ConvertTreeToRule(rule_name, total_states, []) return rule_name golly-2.5-src/Scripts/Python/glife/EmulateOneDimensional.py0000644000175100001440000000117012156145314021003 00000000000000import os from glife.RuleTree import * def EmulateOneDimensional(neighborhood,n_states,transitions,input_filename): '''Emulate a oneDimensional neighborhood rule table with a vonNeumann neighborhood rule tree.''' rule_name = os.path.splitext(os.path.split(input_filename)[1])[0] tree = RuleTree(n_states,4) for t in transitions: tree.add_rule([t[0],range(n_states),t[2],t[1],range(n_states)],t[3][0]) # C,S,E,W,N,C' tree.write( golly.getdir('rules')+rule_name+".tree" ) # use rule_name.tree to create rule_name.rule (no icon info) ConvertTreeToRule(rule_name, n_states, []) return rule_name golly-2.5-src/Scripts/Python/glife/EmulateTriangular.py0000644000175100001440000004602312156145314020215 00000000000000# Inspired by Andrew Trevorrow's work on TriLife.py try: set except NameError: # use sets module if Python version is < 2.4 from sets import Set as set import golly import os from glife.RuleTree import * # We support two emulation methods: # 1) square-splitting: each square holds two triangles: one up, one down # 2) checkerboard: each square holds one triangle, either up or down # # The first method has better appearance but requires N*N states. The second requires only 2N # states but user must respect the checkerboard when drawing. For triangularMoore emulation, only # the first is possible (since Golly only natively supports vonNeumann and Moore). Thus we choose # the first where possible, only using the second for triangularVonNeumann when N>16. # # 1) Square-splitting emulation: (following Andrew Trevorrow's TriLife.py) # # triangularVonNeumann -> vonNeumann: # # lower upper # +--+ +--+ # |\ | |\ | # | \| |2\| (any rotation would work too) # +--+--+--+ +--+--+--+ # |\3|\1|\ | |\ |\0|\ | # | \|0\| \| | \|1\|3\| # +--+--+--+ +--+--+--+ # |\2| |\ | # | \| | \| # +--+ +--+ # # triangularMoore -> Moore: # # lower upper # +--+--+--+ +--+--+--+ # |\B|\ |\ | |\6|\7|\ | where A=10, B=11, C=12 # |A\|C\| \| |5\|2\|8\| # +--+--+--+ +--+--+--+ # |\3|\1|\ | |\4|\0|\9| # |9\|0\|4\| | \|1\|3\| # +--+--+--+ +--+--+--+ # |\8|\2|\5| |\ |\C|\A| # | \|7\|6\| | \| \|B\| # +--+--+--+ +--+--+--+ # # 2) Checkerboard emulation: (drawn using A and V to represent triangles in two orientations) # # A V A V A V A V where each A has 3 V neighbors: V A V # V A V A V A V A V # A V A V A V A V # V A V A V A V A and each V has 3 A neighbors: A # A V A V A V A V A V A # V A V A V A V A def TriangularTransitionsToRuleTree_SplittingMethod(neighborhood,n_states,transitions_list,rule_name): # each square cell is j*N+i where i is the lower triangle, j is the upper triangle # each i,j in (0,N] # (lower and upper are lists) def encode(lower,upper): return [ up*n_states+low for up in upper for low in lower ] # what neighbors of the lower triangle overlap neighbors of the upper triangle? lower2upper = { "triangularVonNeumann": [(0,1),(1,0)], "triangularMoore": [(0,1),(1,0),(2,12),(3,4),(4,3),(5,10),(6,11),(10,5),(11,6),(12,2)], } numNeighbors = { "triangularVonNeumann":4, "triangularMoore":8 } # convert transitions to list of list of sets for speed transitions = [[set(e) for e in t] for t in transitions_list] tree = RuleTree(n_states*n_states,numNeighbors[neighborhood]) # for each transition pair, see if we can apply them both at once to a square for i,t1 in enumerate(transitions): # as lower golly.show("Building rule tree... (pass 1 of 2: "+str(100*i/len(transitions))+"%)") for t2 in transitions: # as upper # we can only apply both rules at once if they overlap to some extent ### AKT: any() and isdisjoint() are not available in Python 2.3: ### if any( t1[j].isdisjoint(t2[k]) for j,k in lower2upper[neighborhood] ): ### continue any_disjoint = False for j,k in lower2upper[neighborhood]: if len(t1[j] & t2[k]) == 0: any_disjoint = True break if any_disjoint: continue # take the intersection of their inputs if neighborhood=="triangularVonNeumann": tree.add_rule( [ encode(t1[0]&t2[1],t1[1]&t2[0]), # C encode(range(n_states),t1[2]), # S encode(t2[3],range(n_states)), # E encode(range(n_states),t1[3]), # W encode(t2[2],range(n_states)) ], # N encode(t1[4],t2[4])[0] ) # C' elif neighborhood=="triangularMoore": tree.add_rule( [ encode(t1[0]&t2[1],t1[1]&t2[0]), # C encode(t1[7],t1[2]&t2[12]), # S encode(t1[4]&t2[3],t2[9]), # E encode(t1[9],t1[3]&t2[4]), # W encode(t1[12]&t2[2],t2[7]), # N encode(t1[6]&t2[11],t1[5]&t2[10]), # SE encode(range(n_states),t1[8]), # SW encode(t2[8],range(n_states)), # NE encode(t1[10]&t2[5],t1[11]&t2[6]) ], # NW encode(t1[13],t2[13])[0] ) # C' # apply each transition to an individual triangle, leaving the other unchanged for i,t in enumerate(transitions): golly.show("Building rule tree... (pass 2 of 2: "+str(100*i/len(transitions))+"%)") for t_1 in t[1]: if neighborhood=="triangularVonNeumann": # as lower triangle: tree.add_rule( [ encode(t[0],[t_1]), # C encode(range(n_states),t[2]), # S range(n_states*n_states), # E encode(range(n_states),t[3]), # W range(n_states*n_states) ], # N encode(t[4],[t_1])[0] ) # C' # as upper triangle: tree.add_rule( [ encode([t_1],t[0]), # C range(n_states*n_states), # S encode(t[3],range(n_states)), # E range(n_states*n_states), # W encode(t[2],range(n_states)) ], # N encode([t_1],t[4])[0] ) # C' elif neighborhood=="triangularMoore": # as lower triangle: tree.add_rule( [encode(t[0],[t_1]), # C encode(t[7],t[2]), # S encode(t[4],range(n_states)), # E encode(t[9],t[3]), # W encode(t[12],range(n_states)), # N encode(t[6],t[5]), # SE encode(range(n_states),t[8]), # SW range(n_states*n_states), # NE encode(t[10],t[11]) ], # NW encode(t[13],[t_1])[0] ) # C' # as upper triangle: tree.add_rule( [encode([t_1],t[0]), encode(range(n_states),t[12]), # S encode(t[3],t[9]), # E encode(range(n_states),t[4]), # W encode(t[2],t[7]), # N encode(t[11],t[10]), # SE range(n_states*n_states), # SW encode(t[8],range(n_states)), # NE encode(t[5],t[6]) ], # NW encode([t_1],t[13])[0] ) # C' # output the rule tree golly.show("Compressing rule tree and saving to file...") tree.write(golly.getdir('rules') + rule_name + '.tree') def TriangularTransitionsToRuleTree_CheckerboardMethod(neighborhood,n_states,transitions,rule_name): # Background state 0 has no checkerboard, we infer it from its neighboring cells. def encode_lower(s): return s def encode_upper(s): ### AKT: this code causes syntax error in Python 2.3: ### return [0 if se==0 else n_states+se-1 for se in s] temp = [] for se in s: if se==0: temp.append(0) else: temp.append(n_states+se-1) return temp total_states = n_states*2 - 1 if total_states>256: golly.warn("Number of states exceeds Golly's limit of 256!") golly.exit() tree = RuleTree(total_states,4) for t in transitions: # as lower tree.add_rule([encode_lower(t[0]), # C encode_upper(t[2]), # S encode_upper(t[1]), # E encode_upper(t[3]), # W range(total_states)], # N encode_lower(t[4])[0]) # C' # as upper tree.add_rule([encode_upper(t[0]), # C range(total_states), # S encode_lower(t[3]), # E encode_lower(t[1]), # W encode_lower(t[2])], # N encode_upper(t[4])[0]) # C' # output the rule tree golly.show("Compressing rule tree and saving to file...") tree.write(golly.getdir('rules') + rule_name + '.tree') def MakeTriangularIcons_SplittingMethod(n_states,colors,force_background,rule_name): width = 31*(n_states*n_states-1) if force_background and n_states>2: width+=31 height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] for row in range(height): for column in range(width): if force_background and n_states>2 and column>=width-31: # add extra 'icon' filled with the intended background color pixels[row][column] = background_color else: # decide if this pixel is a lower or upper triangle iState = int(column/31) upper = int((iState+1) / n_states) lower = (iState+1) - upper*n_states is_upper = False is_lower = False if row<31: # 31x31 icon if (column-iState*31) > row: is_upper = True elif (column-iState*31) < row: is_lower = True elif row<46 and (column-iState*31)<15: # 15x15 icon if (column-iState*31) > row-31: is_upper = True elif (column-iState*31) < row-31: is_lower = True elif (column-iState*31)<7: # 7x7 icon if (column-iState*31) > row-46: is_upper = True elif (column-iState*31) < row-46: is_lower = True if is_upper: pixels[row][column] = colors[upper] elif is_lower: pixels[row][column] = colors[lower] else: pixels[row][column] = 0,0,0 return pixels def MakeTriangularIcons_CheckerboardMethod(n_states,colors,force_background,rule_name): width = 31*(n_states*2-1) if force_background and n_states>2: width+=31 height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] lower31x31 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,1,1,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,1,1,1,1,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,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,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,0,0,0], [0,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,0,0], [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,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,1,1,1,1,1,1,1,1,1,1,1,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] lower15x15 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,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], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] lower7x7 = [[0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,1,0,0,0], [0,0,1,1,1,0,0], [0,1,1,1,1,1,0], [1,1,1,1,1,1,1], [0,0,0,0,0,0,0]] if force_background: bg_color = colors[0] else: bg_color = (0,0,0) for i in range(1,n_states): fg_color = colors[i] # draw 31x31 icons for row in range(31): for column in range(31): # draw lower triangle icons pixels[row][31*(i-1) + column] = [bg_color,fg_color][lower31x31[row][column]] # draw upper triangle icons pixels[row][31*(n_states+i-2) + column] = [bg_color,fg_color][lower31x31[28-row][column]] # draw 15x15 icons for row in range(15): for column in range(15): # draw lower triangle icons pixels[31+row][31*(i-1) + column] = [bg_color,fg_color][lower15x15[row][column]] # draw upper triangle icons pixels[31+row][31*(n_states+i-2) + column] = [bg_color,fg_color][lower15x15[13-row][column]] # draw 7x7 icons for row in range(7): for column in range(7): # draw lower triangle icons pixels[46+row][31*(i-1) + column] = [bg_color,fg_color][lower7x7[row][column]] # draw upper triangle icons pixels[46+row][31*(n_states+i-2) + column] = [bg_color,fg_color][lower7x7[6-row][column]] return pixels def EmulateTriangular(neighborhood,n_states,transitions_list,input_filename): '''Emulate a triangularVonNeumann or triangularMoore neighborhood rule table with a rule tree.''' input_rulename = os.path.splitext(os.path.split(input_filename)[1])[0] # read rule_name+'.colors' file if it exists force_background = False background_color = [0,0,0] cfn = os.path.split(input_filename)[0] + "/" + input_rulename + ".colors" try: cf = open(cfn,'r') except IOError: # use Golly's default random colours random_colors=[[0,0,0],[0,255,127],[127,0,255],[148,148,148],[128,255,0],[255,0,128],[0,128,255],[1,159,0], [159,0,1],[255,254,96],[0,1,159],[96,255,254],[254,96,255],[126,125,21],[21,126,125],[125,21,126], [255,116,116],[116,255,116],[116,116,255],[228,227,0],[28,255,27],[255,27,28],[0,228,227], [227,0,228],[27,28,255],[59,59,59],[234,195,176],[175,196,255],[171,194,68],[194,68,171], [68,171,194],[72,184,71],[184,71,72],[71,72,184],[169,255,188],[252,179,63],[63,252,179], [179,63,252],[80,9,0],[0,80,9],[9,0,80],[255,175,250],[199,134,213],[115,100,95],[188,163,0], [0,188,163],[163,0,188],[203,73,0],[0,203,73],[73,0,203],[94,189,0],[189,0,94]] colors = dict(zip(range(len(random_colors)),random_colors)) else: # read from the .colors file colors = {0:[0,0,0]} # background is black for line in cf: if line[0:6]=='color ': entries = map(int,line[6:].replace('=',' ').replace('\n',' ').split()) if len(entries)<4: continue # too few entries, ignore if entries[0]==0: force_background = True background_color = [entries[1],entries[2],entries[3]] else: colors.update({entries[0]:[entries[1],entries[2],entries[3]]}) # (we don't support gradients in .colors) rule_name = input_rulename + '_emulated' # (we use a special suffix to avoid picking up any existing .colors or .icons) # make a rule tree and some icons if n_states <= 16: TriangularTransitionsToRuleTree_SplittingMethod(neighborhood,n_states,transitions_list,rule_name) pixels = MakeTriangularIcons_SplittingMethod(n_states,colors,force_background,rule_name) total_states = n_states * n_states elif neighborhood=='triangularVonNeumann' and n_states <= 128: TriangularTransitionsToRuleTree_CheckerboardMethod(neighborhood,n_states,transitions_list,rule_name) pixels = MakeTriangularIcons_CheckerboardMethod(n_states,colors,force_background,rule_name) total_states = n_states * 2 - 1 else: golly.warn('Only support triangularMoore with 16 states or fewer, and triangularVonNeumann\n'+\ 'with 128 states or fewer.') golly.exit() if n_states==2: # the icons we wrote are monochrome, so we need a .colors file to avoid # them all having different colors or similar from Golly's preferences c = open(golly.getdir('rules')+rule_name+".colors",'w') if force_background: c.write('color = 0 '+' '.join(map(str,background_color))+'\n') for i in range(1,total_states): c.write('color = '+str(i)+' '+' '.join(map(str,colors[1]))+'\n') c.flush() c.close() # use rule_name.tree and rule_name.colors and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) return rule_name golly-2.5-src/Scripts/Python/glife/gun24.py0000644000175100001440000000140312156145314015520 00000000000000from glife import * # an aligned gun shooting SE: gun24 = pattern (""" 23bo2bo$21b6o$17b2obo8bo$13b2obobobob8o2bo$11b3ob2o3bobo7b3o$10bo 4b3o2bo3bo3b2o$11b3o3b2ob4obo3bob2o$12bobo3bo5bo4bo2bo4b2obo$10b o8bob2o2b2o2b2o5bob2obo$10b5ob4obo4b3o7bo4bo$15b2o4bo4bob3o2b2ob ob2ob2o$12b5ob3o4b2ob2o3bobobobobo$11bo5b2o4b2obob2o5bo5bo$12b5o 6b2obo3bo3bobob2ob2o$2ob2o9b2o2bo5bobo4bo2b3obobo$bobobobob2o3b3o bo6bo2bobo4b3o2bo$o2bo7bo6b2o3b3o8bobob2o$3o2bo4b2o11bo10bo$5b4o bo17b2o4b2o$2b2obo6bo14bo3bo2b2o$bo4bo3bo16bo6b2o$b3obo4bo16bo3b o2bo$11bo2bo3bo9b2o4bobob2o$b3obo4bo8b2o3bo10b3o2bo$bo4bo3bo7bo6b o8b3obobo$2b2obo6bo10b3o8bobob2ob2o$5b4obo24bo5bo$3o2bo4b2o21bob obobobo$o2bo7bo9b2o10b2obob2ob2o$bobobobob2o10bo8bo5bo4bo$2ob2o17b 3o6bo4bob2obo$24bo4b3o5b2obo!""", -32, -32) golly-2.5-src/Scripts/Python/glife/gun256.py0000644000175100001440000000042112156145314015606 00000000000000from glife.herschel import * __c64 = hc64 (9, 0) __stub = eater (4, -16, rccw) gun256_full = herschel (9, 0) + __c64 + __c64.apply (rcw) + __c64.apply (flip) + __c64.apply (rccw) gun256 = (gun256_full + __stub + __stub.apply (rccw) + __stub.apply (flip)) (-25, -12) golly-2.5-src/Scripts/Python/glife/gun30.py0000644000175100001440000000065112156145314015521 00000000000000from glife.base import * rule() # use Life rule to evolve phases __gun30 = queenbee + block (12, 2) + (queenbee[5] + block (12, 2)) (-9, 2, flip_x) __gun30_asym = queenbee + eater (10, 1, rccw) + (queenbee[5] + block (12, 2)) (-9, 2, flip_x) gun30 = __gun30 (1, -7) # aligned gun shooting SE gun30_a = __gun30_asym (1, -7) # aligned gun shooting SE gun60 = gun30 + gun30_a[26] (-4, 11, flip_y) golly-2.5-src/Scripts/Python/glife/gun46.py0000644000175100001440000000046012156145314015526 00000000000000from glife.base import * rule() # use Life rule to evolve phases __half = bheptomino (0, 2, flip_x) + bheptomino (0, -2, flip) + block (16, -4) + block (16, 3) gun46_double = __half (7, -2) + __half (-8, 2, flip_x) gun46 = __half[1] (1, -7) + __half (-13, -4, flip_x) # aligned version shooting SE golly-2.5-src/Scripts/Python/glife/herschel.py0000644000175100001440000000324112156145314016360 00000000000000from glife.base import * herschel_ghost = pattern (""" *** . .*.* """) # A Herschel conduit is represented by its pattern and # the transformation it applies to the Herschel. # Hence the additional .transform field. hc64 = block (14, -8) + block (9, -13) + block (13, -15) + block (7, -19) hc64.transform = (-9, -9, rccw) hc77 = block (9, -13) + eater (10, 0, swap_xy) + eater (-7, -12, swap_xy_flip) hc77.transform = (10, -25, flip_x) hc112 = block (16, -10) + block (-3, -11) + aircraft_carrier (13, -3, swap_xy) + \ eater (10, 1) + eater (-3, -14, flip) + eater (9, -16, flip_y) hc112.transform = (35, -12, rcw) hc117 = eater (10, 1) + eater (13, -9, swap_xy) + eater (0, -12, swap_xy_flip) + block (8, -22) + snake (15, -19) hc117.transform = (6, -40, identity) hc119 = block (-14, -3) + block (-13, -8) + block (-19, -9) + eater (-17, -2, rcw) hc119.transform = (-12, -20, flip_x) hc156 = eater (10, 0, swap_xy) + eater (12, -9, swap_xy) + eater (0, -12, swap_xy_flip) + eater (17, -21, flip_y) + \ snake (21, -5, rccw) + block (24, -15) + tub (11, -24) hc156.transform = (43, -17, rcw) hc158 = eater (-2, -13, flip) + eater (-3, -8, rcw) + eater (20, -19, rccw) + pattern (""" .....** .....*.* .......* .......*.*.** ..**.*.*.**.* ..**.**.* ........* ..**.*** ...*.* ...*.* **.** *.* ..* ..** """, 14, -12) hc158.transform = (7, -27, flip_x) hc190 = eater (-3, -8, rcw) + eater (-10, -12, swap_xy) + eater (-3, -12, swap_xy_flip) + \ eater (-8, -17) + eater (11, -27, flip_y) + block (2, -25) + snake (5, -31, rccw) + \ pattern (""" ..**.* ..**.*** ........* ..**.*** ...*.* ...*.* **.** *.* ..* ..** """, 14, -8) hc190.transform = (-16, -22, rccw) golly-2.5-src/Scripts/Python/glife/__init__.py0000644000175100001440000002045512156145314016330 00000000000000# Initialization script executed by using "import glife". # Based on python/life/__init__.py in Eugene Langvagen's PLife. import golly import sys import time __doc__ = """High-level scripting aids for Golly."""; # -------------------------------------------------------------------- class rect(list): """A simple class to make it easier to manipulate rectangles.""" def visible(self): """Return true if rect is completely visible in viewport.""" return golly.visrect( [self.x, self.y, self.wd, self.ht] ) def __init__(self, R = []): if len(R) == 0: self.empty = True elif len(R) == 4: self.empty = False self.x = self.left = R[0] self.y = self.top = R[1] self.wd = self.width = R[2] self.ht = self.height = R[3] if self.wd <= 0: raise ValueError("rect width must be > 0") if self.ht <= 0: raise ValueError("rect height must be > 0") self.right = self.left + self.wd - 1 self.bottom = self.top + self.ht - 1 else: raise TypeError("rect arg must be [] or [x,y,wd,ht]") list.__init__(self, R) # -------------------------------------------------------------------- # Define some useful synonyms: # for golly.clear and golly.advance inside = 0 outside = 1 # for golly.flip left_right = 0 top_bottom = 1 up_down = 1 # for golly.rotate clockwise = 0 anticlockwise = 1 # for golly.setcursor (must match strings in Cursor Mode submenu) draw = "Draw" pick = "Pick" select = "Select" move = "Move" zoomin = "Zoom In" zoomout = "Zoom Out" # -------------------------------------------------------------------- # Define some transformation matrices: identity = ( 1, 0, 0, 1) flip = (-1, 0, 0, -1) flip_x = (-1, 0, 0, 1) flip_y = ( 1, 0, 0, -1) swap_xy = ( 0, 1, 1, 0) swap_xy_flip = ( 0, -1, -1, 0) # Rotation: rcw = ( 0, -1, 1, 0) rccw = ( 0, 1, -1, 0) # -------------------------------------------------------------------- def rule(s = "B3/S23"): """\ Set the rule for the Game of Life. Although it affects subsequent calls to pattern.evolve(), only the last call to this function matters for the viewer.""" golly.setrule(s) # -------------------------------------------------------------------- def description(s): """Supply a textual description to the whole pattern.""" for line in s.split("\n"): print "#D", line # -------------------------------------------------------------------- def compose(S, T): """\ Return the composition of two transformations S and T. A transformation is a tuple of the form (x, y, A), which denotes multiplying by matrix A and then translating by vector (x, y). These tuples can be passed to pattern.__call__().""" x = S[0]; y = S[1]; A = S[2] s = T[0]; t = T[1]; B = T[2] return (x * B[0] + y * B[1] + s, x * B[2] + y * B[3] + t, (A[0] * B[0] + A[2] * B[1], A[1] * B[0] + A[3] * B[1], A[0] * B[2] + A[2] * B[3], A[1] * B[2] + A[3] * B[3])) # -------------------------------------------------------------------- class pattern(list): """This class represents a cell list.""" def __add__(self, q): """Join patterns.""" return pattern(golly.join(self, q)) def __getitem__(self, N): """\ The __getitem__() function is an alias to evolve(). It allows to access the pattern's phases as elements of an array.""" return self.evolve(N) def __call__(self, x, y, A = identity): """The same as 'apply(A).translate(x, y)'.""" return pattern(golly.transform(self, x, y, *A)) def translate(self, x, y): """Translate the pattern.""" return self(x, y) def apply(self, A): """\ Apply a matrix transformation to the pattern. Predefined matrices are: identity, flip, flip_x, flip_y, swap_xy, swap_xy_flip, rcw (rotate clockwise) and rccw (rotate counter-clockwise).""" return self(0, 0, A) def put(self, x = 0, y = 0, A = identity): """Paste pattern into current universe.""" golly.putcells(self, x, y, *A) def display(self, title = "untitled", x = 0, y = 0, A = identity): """Paste pattern into new universe and display it all.""" golly.new(title) golly.putcells(self, x, y, *A) golly.fit() golly.setcursor(zoomin) def save(self, fn, desc = None): """\ Save the pattern to file 'fn' in RLE format. An optional description 'desc' may be given.""" golly.store(self, fn, desc) def evolve(self, N): """\ Return N-th generation of the pattern. Once computed, the N-th generation is remembered and quickly accessible. It is also the base for computing generations subsequent to N-th.""" if N < 0: raise ValueError("backward evolving requested") if self.__phases.has_key(N): return self.__phases[N] M = 0 for k in self.__phases.keys(): if M < k < N: M = k p = self.__phases[N] = pattern(golly.evolve(self.__phases[M], N - M)) return p def __init__(self, P = [], x0 = 0, y0 = 0, A = identity): """\ Initialize a pattern from argument P. P may be another pattern, a cell list, or a multi-line string. A cell list should look like [x1, y1, x2, y2, ...]; a string may be in one of the two autodetected formats: 'visual' or 'RLE'. o 'visual' format means that the pattern is represented in a visual way using symbols '*' (on cell), '.' (off cell) and '\\n' (newline), just like in Life 1.05 format. (Note that an empty line should contain at least one dot). o 'RLE' format means that a string is Run-Length Encoded. The format uses 'o' for on-cells, 'b' for off-cells and '$' for newlines. Moreover, any of these symbols may be prefixed by a number, to denote that symbol repeated that number of times. When P is a string, an optional transformation (x0, y0, A) may be specified. """ self.__phases = dict() if type(P) == list: list.__init__(self, P) elif type(P) == pattern: list.__init__(self, list(P)) elif type(P) == str: list.__init__(self, golly.parse(P, x0, y0, *A)) else: raise TypeError("list or string is required here") self.__phases[0] = self # -------------------------------------------------------------------- def load(fn): # note that top left cell of bounding box will be at 0,0 return pattern(golly.load(fn)) # -------------------------------------------------------------------- def getminbox(patt): # return a rect which is the minimal bounding box of given pattern; # note that if the pattern is a multi-state list then any dead cells # are included in the bounding box minx = sys.maxint maxx = -sys.maxint miny = sys.maxint maxy = -sys.maxint clist = list(patt) clen = len(clist) inc = 2 if clen & 1 == 1: # multi-state list (3 ints per cell) inc = 3 # ignore padding int if it is present if clen % 3 == 1: clen -= 1 for x in xrange(0, clen, inc): if clist[x] < minx: minx = clist[x] if clist[x] > maxx: maxx = clist[x] for y in xrange(1, clen, inc): if clist[y] < miny: miny = clist[y] if clist[y] > maxy: maxy = clist[y] return rect( [ minx, miny, maxx - minx + 1, maxy - miny + 1 ] ) # -------------------------------------------------------------------- def validint(s): # return True if given string represents a valid integer if len(s) == 0: return False s = s.replace(",","") if s[0] == '+' or s[0] == '-': s = s[1:] return s.isdigit() # -------------------------------------------------------------------- def getposint(): # return current viewport position as integer coords x, y = golly.getpos() return int(x), int(y) # -------------------------------------------------------------------- def setposint(x,y): # convert integer coords to strings and set viewport position golly.setpos(str(x), str(y)) # -------------------------------------------------------------------- def getstring(prompt): # this routine is deprecated golly.warn("Change the script to use the getstring() command\n"+ "from golly rather than from glife.") golly.exit("") golly-2.5-src/Scripts/Python/glife/ReadRuleTable.py0000644000175100001440000002532412156145314017244 00000000000000try: set except NameError: # use sets module if Python version is < 2.4 from sets import Set as set import golly # generate permutations where the input list may have duplicates # e.g. [1,2,1] -> [[1, 2, 1], [1, 1, 2], [2, 1, 1]] # (itertools.permutations would yield 6 and removing duplicates afterwards is less efficient) # http://code.activestate.com/recipes/496819/ (PSF license) def permu2(xs): if len(xs)<2: yield xs else: h = [] for x in xs: h.append(x) if x in h[:-1]: continue ts = xs[:]; ts.remove(x) for ps in permu2(ts): yield [x]+ps # With some neighborhoods we permute after building each transition, to avoid # creating lots of copies of the same rule. The others are permuted explicitly # because we haven't worked out how to permute the Margolus neighborhood while # allowing for duplicates. PermuteLater = ['vonNeumann','Moore','hexagonal','triangularVonNeumann', 'triangularMoore','oneDimensional'] SupportedSymmetries = { "vonNeumann": { 'none':[[0,1,2,3,4,5]], 'rotate4':[[0,1,2,3,4,5],[0,2,3,4,1,5],[0,3,4,1,2,5],[0,4,1,2,3,5]], 'rotate4reflect':[[0,1,2,3,4,5],[0,2,3,4,1,5],[0,3,4,1,2,5],[0,4,1,2,3,5], [0,4,3,2,1,5],[0,3,2,1,4,5],[0,2,1,4,3,5],[0,1,4,3,2,5]], 'reflect_horizontal':[[0,1,2,3,4,5],[0,1,4,3,2,5]], 'permute':[[0,1,2,3,4,5]], # (gets done later) }, "Moore": { 'none':[[0,1,2,3,4,5,6,7,8,9]], 'rotate4':[[0,1,2,3,4,5,6,7,8,9],[0,3,4,5,6,7,8,1,2,9],[0,5,6,7,8,1,2,3,4,9],[0,7,8,1,2,3,4,5,6,9]], 'rotate8':[[0,1,2,3,4,5,6,7,8,9],[0,2,3,4,5,6,7,8,1,9],[0,3,4,5,6,7,8,1,2,9],[0,4,5,6,7,8,1,2,3,9],\ [0,5,6,7,8,1,2,3,4,9],[0,6,7,8,1,2,3,4,5,9],[0,7,8,1,2,3,4,5,6,9],[0,8,1,2,3,4,5,6,7,9]], 'rotate4reflect':[[0,1,2,3,4,5,6,7,8,9],[0,3,4,5,6,7,8,1,2,9],[0,5,6,7,8,1,2,3,4,9],[0,7,8,1,2,3,4,5,6,9],\ [0,1,8,7,6,5,4,3,2,9],[0,7,6,5,4,3,2,1,8,9],[0,5,4,3,2,1,8,7,6,9],[0,3,2,1,8,7,6,5,4,9]], 'rotate8reflect':[[0,1,2,3,4,5,6,7,8,9],[0,2,3,4,5,6,7,8,1,9],[0,3,4,5,6,7,8,1,2,9],[0,4,5,6,7,8,1,2,3,9],\ [0,5,6,7,8,1,2,3,4,9],[0,6,7,8,1,2,3,4,5,9],[0,7,8,1,2,3,4,5,6,9],[0,8,1,2,3,4,5,6,7,9],\ [0,8,7,6,5,4,3,2,1,9],[0,7,6,5,4,3,2,1,8,9],[0,6,5,4,3,2,1,8,7,9],[0,5,4,3,2,1,8,7,6,9],\ [0,4,3,2,1,8,7,6,5,9],[0,3,2,1,8,7,6,5,4,9],[0,2,1,8,7,6,5,4,3,9],[0,1,8,7,6,5,4,3,2,9]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7,8,9],[0,1,8,7,6,5,4,3,2,9]], 'permute':[[0,1,2,3,4,5,6,7,8,9]] # (gets done later) }, "Margolus": { 'none':[[0,1,2,3,4,5,6,7]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7],[1,0,3,2,5,4,7,6]], 'reflect_vertical':[[0,1,2,3,4,5,6,7],[2,3,0,1,6,7,4,5]], 'rotate4': [[0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6]], 'rotate4reflect':[ [0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6], [1,0,3,2,5,4,7,6],[0,2,1,3,4,6,5,7],[2,3,0,1,6,7,4,5],[3,1,2,0,7,5,6,4]], 'permute':[p+map(lambda x:x+4,p) for p in permu2(range(4))] }, "square4_figure8v": # same symmetries as Margolus { 'none':[[0,1,2,3,4,5,6,7]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7],[1,0,3,2,5,4,7,6]], 'reflect_vertical':[[0,1,2,3,4,5,6,7],[2,3,0,1,6,7,4,5]], 'rotate4': [[0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6]], 'rotate4reflect':[ [0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6], [1,0,3,2,5,4,7,6],[0,2,1,3,4,6,5,7],[2,3,0,1,6,7,4,5],[3,1,2,0,7,5,6,4]], 'permute':[p+map(lambda x:x+4,p) for p in permu2(range(4))] }, "square4_figure8h": # same symmetries as Margolus { 'none':[[0,1,2,3,4,5,6,7]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7],[1,0,3,2,5,4,7,6]], 'reflect_vertical':[[0,1,2,3,4,5,6,7],[2,3,0,1,6,7,4,5]], 'rotate4': [[0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6]], 'rotate4reflect':[ [0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6], [1,0,3,2,5,4,7,6],[0,2,1,3,4,6,5,7],[2,3,0,1,6,7,4,5],[3,1,2,0,7,5,6,4]], 'permute':[p+map(lambda x:x+4,p) for p in permu2(range(4))] }, "square4_cyclic": # same symmetries as Margolus { 'none':[[0,1,2,3,4,5,6,7]], 'reflect_horizontal':[[0,1,2,3,4,5,6,7],[1,0,3,2,5,4,7,6]], 'reflect_vertical':[[0,1,2,3,4,5,6,7],[2,3,0,1,6,7,4,5]], 'rotate4': [[0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6]], 'rotate4reflect':[ [0,1,2,3,4,5,6,7],[2,0,3,1,6,4,7,5],[3,2,1,0,7,6,5,4],[1,3,0,2,5,7,4,6], [1,0,3,2,5,4,7,6],[0,2,1,3,4,6,5,7],[2,3,0,1,6,7,4,5],[3,1,2,0,7,5,6,4]], 'permute':[p+map(lambda x:x+4,p) for p in permu2(range(4))] }, "triangularVonNeumann": { 'none':[[0,1,2,3,4]], 'rotate':[[0,1,2,3,4],[0,3,1,2,4],[0,2,3,1,4]], 'rotate_reflect':[[0,1,2,3,4],[0,3,1,2,4],[0,2,3,1,4],[0,3,2,1,4],[0,1,3,2,4],[0,2,1,3,4]], 'permute':[[0,1,2,3,4]] # (gets done later) }, "triangularMoore": { 'none':[[0,1,2,3,4,5,6,7,8,9,10,11,12,13]], 'rotate':[[0,1,2,3,4,5,6,7,8,9,10,11,12,13], [0,2,3,1,7,8,9,10,11,12,4,5,6,13], [0,3,1,2,10,11,12,4,5,6,7,8,9,13]], 'rotate_reflect':[[0,1,2,3,4,5,6,7,8,9,10,11,12,13], [0,2,3,1,7,8,9,10,11,12,4,5,6,13], [0,3,1,2,10,11,12,4,5,6,7,8,9,13], [0,3,2,1,9,8,7,6,5,4,12,11,10,13], [0,2,1,3,6,5,4,12,11,10,9,8,7,13], [0,1,3,2,12,11,10,9,8,7,6,5,4,13]], 'permute':[[0,1,2,3,4,5,6,7,8,9,10,11,12,13]], # (gets done later) }, "oneDimensional": { 'none':[[0,1,2,3]], 'reflect':[[0,1,2,3],[0,2,1,3]], 'permute':[[0,1,2,3]], # (gets done later) }, "hexagonal": { 'none':[[0,1,2,3,4,5,6,7]], 'rotate2':[[0,1,2,3,4,5,6,7],[0,4,5,6,1,2,3,7]], 'rotate3':[[0,1,2,3,4,5,6,7],[0,3,4,5,6,1,2,7],[0,5,6,1,2,3,4,7]], 'rotate6':[[0,1,2,3,4,5,6,7],[0,2,3,4,5,6,1,7],[0,3,4,5,6,1,2,7], [0,4,5,6,1,2,3,7],[0,5,6,1,2,3,4,7],[0,6,1,2,3,4,5,7]], 'rotate6reflect':[[0,1,2,3,4,5,6,7],[0,2,3,4,5,6,1,7],[0,3,4,5,6,1,2,7], [0,4,5,6,1,2,3,7],[0,5,6,1,2,3,4,7],[0,6,1,2,3,4,5,7], [0,6,5,4,3,2,1,7],[0,5,4,3,2,1,6,7],[0,4,3,2,1,6,5,7], [0,3,2,1,6,5,4,7],[0,2,1,6,5,4,3,7],[0,1,6,5,4,3,2,7]], 'permute':[[0,1,2,3,4,5,6,7]], # (gets done later) }, } def ReadRuleTable(filename): ''' Return n_states, neighborhood, transitions e.g. 2, "vonNeumann", [[0],[0,1],[0],[0],[1],[1]] Transitions are expanded for symmetries and bound variables. ''' f=open(filename,'r') vars={} symmetry_string = '' symmetry = [] n_states = 0 neighborhood = '' transitions = [] numParams = 0 for line in f: if line[0]=='#' or line.strip()=='': pass elif line[0:9]=='n_states:': n_states = int(line[9:]) if n_states<0 or n_states>256: golly.warn('n_states out of range: '+n_states) golly.exit() elif line[0:13]=='neighborhood:': neighborhood = line[13:].strip() if not neighborhood in SupportedSymmetries: golly.warn('Unknown neighborhood: '+neighborhood) golly.exit() numParams = len(SupportedSymmetries[neighborhood].items()[0][1][0]) elif line[0:11]=='symmetries:': symmetry_string = line[11:].strip() if not symmetry_string in SupportedSymmetries[neighborhood]: golly.warn('Unknown symmetry: '+symmetry_string) golly.exit() symmetry = SupportedSymmetries[neighborhood][symmetry_string] elif line[0:4]=='var ': line = line[4:] # strip var keyword if '#' in line: line = line[:line.find('#')] # strip any trailing comment # read each variable into a dictionary mapping string to list of ints entries = line.replace('=',' ').replace('{',' ').replace(',',' ').\ replace(':',' ').replace('}',' ').replace('\n','').split() vars[entries[0]] = [] for e in entries[1:]: if e in vars: vars[entries[0]] += vars[e] # vars allowed in later vars else: vars[entries[0]].append(int(e)) else: # assume line is a transition if '#' in line: line = line[:line.find('#')] # strip any trailing comment if ',' in line: entries = line.replace('\n','').replace(',',' ').replace(':',' ').split() else: entries = list(line.strip()) # special no-comma format if not len(entries)==numParams: golly.warn('Wrong number of entries on line: '+line+' (expected '+str(numParams)+')') golly.exit() # retrieve the variables that repeat within the transition, these are 'bound' bound_vars = [ e for e in set(entries) if entries.count(e)>1 and e in vars ] # iterate through all the possible values of each bound variable var_val_indices = dict(zip(bound_vars,[0]*len(bound_vars))) while True: ### AKT: this code causes syntax error in Python 2.3: ### transition = [ [vars[e][var_val_indices[e]]] if e in bound_vars \ ### else vars[e] if e in vars \ ### else [int(e)] \ ### for e in entries ] transition = [] for e in entries: if e in bound_vars: transition.append([vars[e][var_val_indices[e]]]) elif e in vars: transition.append(vars[e]) else: transition.append([int(e)]) if symmetry_string=='permute' and neighborhood in PermuteLater: # permute all but C,C' (first and last entries) for permuted_section in permu2(transition[1:-1]): permuted_transition = [transition[0]]+permuted_section+[transition[-1]] if not permuted_transition in transitions: transitions.append(permuted_transition) else: # expand for symmetry using the explicit list for s in symmetry: tran = [transition[i] for i in s] if not tran in transitions: transitions.append(tran) # increment the variable values (or break out if done) var_val_to_change = 0 while var_val_to_change= len(bound_vars): break f.close() return n_states, neighborhood, transitions golly-2.5-src/Scripts/Python/glife/RuleTree.py0000644000175100001440000004276712156145314016332 00000000000000# Only the neighborhoods supported by ruletree_algo are supported: # a) vonNeumann: 4 neighbors: C,S,E,W,N, # b) Moore: 8 neighbors: C,S,E,W,N,SE,SW,NE,NW # # This file contains two ways of building rule trees: # # 1) RuleTree Usage example: # # tree = RuleTree(14,4) # 14 states, 4 neighbors = von Neumann neighborhood # tree.add_rule([[1],[1,2,3],[3],[0,1],[2]],7) # inputs: [C,S,E,W,N], output # tree.write("Test.tree") # # 2) MakeRuleTreeFromTransitionFunction usage example: # # MakeRuleTreeFromTransitionFunction( 2, 4, lambda a:(a[0]+a[1]+a[2])%2, 'Parity.tree' ) # import golly import os from tempfile import mkstemp from shutil import move # ------------------------------------------------------------------------------ class RuleTree: ''' Usage example: tree = RuleTree(14,4) # 14 states, 4 neighbors = von Neumann neighborhood tree.add_rule([[1],[1,2,3],[3],[0,1],[2]],7) # inputs: [C,S,E,W,N], output tree.write("Test.tree") For vonNeumann neighborhood, inputs are: C,S,E,W,N For Moore neighborhood, inputs are: C,S,E,W,N,SE,SW,NE,NW ''' def __init__(self,numStates,numNeighbors): self.numParams = numNeighbors + 1 ; self.world = {} # dictionary mapping node tuples to node index (for speedy access by value) self.seq = [] # same node tuples but stored in a list (for access by index) # each node tuple is ( depth, index0, index1, .. index(numStates-1) ) # where each index is an index into self.seq self.nodeSeq = 0 self.curndd = -1 self.numStates = numStates self.numNeighbors = numNeighbors self.cache = {} self.shrinksize = 100 self._init_tree() def _init_tree(self): self.curndd = -1 for i in range(self.numParams): node = tuple( [i+1] + [self.curndd]*self.numStates ) self.curndd = self._getNode(node) def _getNode(self,node): if node in self.world: return self.world[node] else: iNewNode = self.nodeSeq self.nodeSeq += 1 self.seq.append(node) self.world[node] = iNewNode return iNewNode def _add(self,inputs,output,nddr,at): if at == 0: # this is a leaf node if nddr<0: return output # return the output of the transition else: return nddr # return the node index if nddr in self.cache: return self.cache[nddr] # replace the node entry at each input with the index of the node from a recursive call to the next level down ### AKT: this code causes syntax error in Python 2.3: ### node = tuple( [at] + [ self._add(inputs,output,self.seq[nddr][i+1],at-1) if i in inputs[at-1] \ ### else self.seq[nddr][i+1] for i in range(self.numStates) ] ) temp = [] for i in range(self.numStates): if i in inputs[at-1]: temp.append( self._add(inputs,output,self.seq[nddr][i+1],at-1) ) else: temp.append( self.seq[nddr][i+1] ) node = tuple( [at] + temp ) r = self._getNode(node) self.cache[nddr] = r return r def _recreate(self,oseq,nddr,lev): if lev == 0: return nddr if nddr in self.cache: return self.cache[nddr] # each node entry is the node index retrieved from a recursive call to the next level down node = tuple( [lev] + [ self._recreate(oseq,oseq[nddr][i+1],lev-1) for i in range(self.numStates) ] ) r = self._getNode(node) self.cache[nddr] = r return r def _shrink(self): self.world = {} oseq = self.seq self.seq = [] self.cache = {} self.nodeSeq = 0 ; self.curndd = self._recreate(oseq, self.curndd, self.numParams) self.shrinksize = len(self.seq) * 2 def add_rule(self,inputs,output): self.cache = {} self.curndd = self._add(inputs,output,self.curndd,self.numParams) if self.nodeSeq > self.shrinksize: self._shrink() def _setdefaults(self,nddr,off,at): if at == 0: if nddr<0: return off else: return nddr if nddr in self.cache: return self.cache[nddr] # each node entry is the node index retrieved from a recursive call to the next level down node = tuple( [at] + [ self._setdefaults(self.seq[nddr][i+1],i,at-1) for i in range(self.numStates) ] ) node_index = self._getNode(node) self.cache[nddr] = node_index return node_index def _setDefaults(self): self.cache = {} self.curndd = self._setdefaults(self.curndd, -1, self.numParams) def write(self,filename): self._setDefaults() self._shrink() out = open(filename,'w') out.write("num_states=" + str(self.numStates)+'\n') out.write("num_neighbors=" + str(self.numNeighbors)+'\n') out.write("num_nodes=" + str(len(self.seq))+'\n') for rule in self.seq: out.write(' '.join(map(str,rule))+'\n') out.flush() out.close() # ------------------------------------------------------------------------------ class MakeRuleTreeFromTransitionFunction: ''' Usage example: MakeRuleTreeFromTransitionFunction( 2, 4, lambda a:(a[0]+a[1]+a[2])%2, 'Parity.tree' ) For vonNeumann neighborhood, inputs are: N,W,E,S,C For Moore neighborhood, inputs are NW,NE,SW,SE,N,W,E,S,C ''' def __init__(self,numStates,numNeighbors,f,filename): self.numParams = numNeighbors + 1 ; self.numStates = numStates self.numNeighbors = numNeighbors self.world = {} self.seq = [] self.params = [0]*self.numParams self.nodeSeq = 0 self.f = f self._recur(self.numParams) self._write(filename) def _getNode(self,node): if node in self.world: return self.world[node] else: iNewNode = self.nodeSeq self.nodeSeq += 1 self.seq.append(node) self.world[node] = iNewNode return iNewNode def _recur(self,at): if at == 0: return self.f(self.params) node = tuple([at]) for i in range(self.numStates): self.params[self.numParams-at] = i node += tuple( [self._recur(at-1)] ) return self._getNode(node) def _write(self,filename): out = open(filename,'w') out.write("num_states=" + str(self.numStates)+'\n') out.write("num_neighbors=" + str(self.numNeighbors)+'\n') out.write("num_nodes=" + str(len(self.seq))+'\n') for rule in self.seq: out.write(' '.join(map(str,rule))+'\n') out.flush() out.close() # ------------------------------------------------------------------------------ def ReplaceTreeSection(rulepath, newtree): # replace @TREE section in existing .rule file with new tree data try: rulefile = open(rulepath,'r') except: golly.exit('Failed to open existing .rule file: '+rulepath) # create a temporary file for writing new rule info temphdl, temppath = mkstemp() tempfile = open(temppath,'w') skiplines = False for line in rulefile: if line.startswith('@TREE'): tempfile.write('@TREE\n\n') tempfile.write(newtree) skiplines = True elif skiplines and line.startswith('@'): tempfile.write('\n') skiplines = False if not skiplines: tempfile.write(line) # close files rulefile.close() tempfile.flush() tempfile.close() os.close(temphdl) # remove original .rule file and rename temporary file os.remove(rulepath) move(temppath, rulepath) # ------------------------------------------------------------------------------ def GetColors(icon_pixels, wd, ht): colors = [] multi_colored = False for row in xrange(ht): for col in xrange(wd): R,G,B = icon_pixels[row][col] if R != G or G != B: multi_colored = True # not grayscale found = False index = 0 for count, RGB in colors: if (R,G,B) == RGB: found = True break index += 1 if found: colors[index][0] += 1 else: colors.append([1, (R,G,B)]) return colors, multi_colored # ------------------------------------------------------------------------------ def hex2(i): # convert number from 0..255 into 2 hex digits hexdigit = "0123456789ABCDEF" result = hexdigit[i / 16] result += hexdigit[i % 16] return result # ------------------------------------------------------------------------------ def CreateXPMIcons(colors, icon_pixels, iconsize, yoffset, xoffset, numicons, rulefile): # write out the XPM data for given icon size rulefile.write("\nXPM\n") cindex = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" numcolors = len(colors) charsperpixel = 1 if numcolors > 26: charsperpixel = 2 # AABA..PA, ABBB..PB, ... , APBP..PP rulefile.write("/* width height num_colors chars_per_pixel */\n") rulefile.write("\"" + str(iconsize) + " " + str(iconsize*numicons) + " " + \ str(numcolors) + " " + str(charsperpixel) + "\"\n") rulefile.write("/* colors */\n") n = 0 for count, RGB in colors: R,G,B = RGB if R == 0 and G == 0 and B == 0: # nicer to show . or .. for black pixels rulefile.write("\".") if charsperpixel == 2: rulefile.write(".") rulefile.write(" c #000000\"\n") else: hexcolor = "#" + hex2(R) + hex2(G) + hex2(B) rulefile.write("\"") if charsperpixel == 1: rulefile.write(cindex[n]) else: rulefile.write(cindex[n % 16] + cindex[n / 16]) rulefile.write(" c " + hexcolor + "\"\n") n += 1 for i in xrange(numicons): rulefile.write("/* icon for state " + str(i+1) + " */\n") for row in xrange(iconsize): rulefile.write("\"") for col in xrange(iconsize): R,G,B = icon_pixels[row + yoffset][col + xoffset*i] if R == 0 and G == 0 and B == 0: # nicer to show . or .. for black pixels rulefile.write(".") if charsperpixel == 2: rulefile.write(".") else: n = 0 thisRGB = (R,G,B) for count, RGB in colors: if thisRGB == RGB: break n += 1 if charsperpixel == 1: rulefile.write(cindex[n]) else: rulefile.write(cindex[n % 16] + cindex[n / 16]) rulefile.write("\"\n") # ------------------------------------------------------------------------------ def ConvertTreeToRule(rule_name, total_states, icon_pixels): ''' Convert rule_name.tree to rule_name.rule and delete the .tree file. If rule_name.colors exists then use it to create an @COLORS section and delete the .colors file. If icon_pixels is supplied then add an @ICONS section. Format of icon_pixels (in this example there are 4 icons at each size): --------------------------------------------------------- | | | | | | | | | | | 31x31 | 31x31 | 31x31 | 31x31 | | | | | | | | | | | --------------------------------------------------------- | |.....| |.....| |.....| |.....| | 15x15 |.....| 15x15 |.....| 15x15 |.....| 15x15 |.....| | |.....| |.....| |.....| |.....| --------------------------------------------------------- |7x7|.........|7x7|.........|7x7|.........|7x7|.........| --------------------------------------------------------- The top layer of 31x31 icons is optional -- if not supplied (ie. the height is 22) then there are no gaps between the 15x15 icons. ''' rulepath = golly.getdir('rules')+rule_name+'.rule' treepath = golly.getdir('rules')+rule_name+'.tree' colorspath = golly.getdir('rules')+rule_name+'.colors' # get contents of .tree file try: treefile = open(treepath,'r') treedata = treefile.read() treefile.close() except: golly.exit('Failed to open .tree file: '+treepath) # if the .rule file already exists then only replace the @TREE section # so we don't clobber any other info added by the user if os.path.isfile(rulepath): ReplaceTreeSection(rulepath, treedata) os.remove(treepath) if os.path.isfile(colorspath): os.remove(colorspath) return # create a new .rule file rulefile = open(rulepath,'w') rulefile.write('@RULE '+rule_name+'\n\n') rulefile.write('@TREE\n\n') # append contents of .tree file, then delete that file rulefile.write(treedata) os.remove(treepath) # if .colors file exists then append @COLORS section and delete file if os.path.isfile(colorspath): colorsfile = open(colorspath,'r') rulefile.write('\n@COLORS\n\n') for line in colorsfile: if line.startswith('color') or line.startswith('gradient'): # strip off everything before 1st digit line = line.lstrip('colorgadient= \t') rulefile.write(line) colorsfile.close() os.remove(colorspath) # if icon pixels are supplied then append @ICONS section if len(icon_pixels) > 0: wd = len(icon_pixels[0]) ht = len(icon_pixels) iconsize = 15 # size of icons in top row if ht > 22: iconsize = 31 # 31x31 icons are present numicons = wd / iconsize # get colors used in all icons (we assume each icon size uses the same set of colors) colors, multi_colored = GetColors(icon_pixels, wd, ht) if len(colors) > 256: golly.warn('Icons use more than 256 colors!') rulefile.flush() rulefile.close() return if multi_colored: # create @COLORS section using color info in icon_pixels (not grayscale) rulefile.write('\n@COLORS\n\n') if numicons >= total_states: # extra icon is present so use top right pixel to set the color of state 0 R,G,B = icon_pixels[0][wd-1] rulefile.write('0 ' + str(R) + ' ' + str(G) + ' ' + str(B) + '\n') numicons -= 1 # set colors for each live state to the average of the non-black pixels # in each icon on top row (note we've skipped the extra icon detected above) for i in xrange(numicons): nbcount = 0 totalR = 0 totalG = 0 totalB = 0 for row in xrange(iconsize): for col in xrange(iconsize): R,G,B = icon_pixels[row][col + i*iconsize] if R > 0 or G > 0 or B > 0: nbcount += 1 totalR += R totalG += G totalB += B if nbcount > 0: rulefile.write(str(i+1) + ' ' + str(totalR / nbcount) + ' ' \ + str(totalG / nbcount) + ' ' \ + str(totalB / nbcount) + '\n') else: # avoid div by zero rulefile.write(str(i+1) + ' 0 0 0\n') # create @ICONS section using (r,g,b) triples in icon_pixels[row][col] rulefile.write('\n@ICONS\n') if ht > 22: # top row of icons is 31x31 CreateXPMIcons(colors, icon_pixels, 31, 0, 31, numicons, rulefile) CreateXPMIcons(colors, icon_pixels, 15, 31, 31, numicons, rulefile) CreateXPMIcons(colors, icon_pixels, 7, 46, 31, numicons, rulefile) else: # top row of icons is 15x15 CreateXPMIcons(colors, icon_pixels, 15, 0, 15, numicons, rulefile) CreateXPMIcons(colors, icon_pixels, 7, 15, 15, numicons, rulefile) rulefile.flush() rulefile.close() # ------------------------------------------------------------------------------ def ConvertRuleTableTransitionsToRuleTree(neighborhood,n_states,transitions,input_filename): '''Convert a set of vonNeumann or Moore transitions directly to a rule tree.''' rule_name = os.path.splitext(os.path.split(input_filename)[1])[0] remap = { "vonNeumann":[0,3,2,4,1], # CNESW->CSEWN "Moore":[0,5,3,7,1,4,6,2,8] # C,N,NE,E,SE,S,SW,W,NW -> C,S,E,W,N,SE,SW,NE,NW } numNeighbors = len(remap[neighborhood])-1 tree = RuleTree(n_states,numNeighbors) for i,t in enumerate(transitions): golly.show("Building rule tree... ("+str(100*i/len(transitions))+"%)") tree.add_rule([ t[j] for j in remap[neighborhood] ],t[-1][0]) tree.write(golly.getdir('rules')+rule_name+".tree" ) # use rule_name.tree to create rule_name.rule (no icons) ConvertTreeToRule(rule_name, n_states, []) return rule_name golly-2.5-src/Scripts/Python/glife/text.py0000644000175100001440000001751012156145314015553 00000000000000from glife import * from string import * # each symbol is a pattern with an additional field .width # Eric Angelini integer font __eafont = dict () __eafont['0'] = pattern ("3o$obo$obo$obo$3o!", 0, -5) __eafont['0'].width = 4 __eafont['1'] = pattern ("o$o$o$o$o!", 0, -5) __eafont['1'].width = 2 __eafont['2'] = pattern ("3o$2bo$3o$o$3o!", 0, -5) __eafont['2'].width = 4 __eafont['3'] = pattern ("3o$2bo$3o$2bo$3o!", 0, -5) __eafont['3'].width = 4 __eafont['4'] = pattern ("obo$obo$3o$2bo$2bo!", 0, -5) __eafont['4'].width = 4 __eafont['5'] = pattern ("3o$o$3o$2bo$3o!", 0, -5) __eafont['5'].width = 4 __eafont['6'] = pattern ("3o$o$3o$obo$3o!", 0, -5) __eafont['6'].width = 4 __eafont['7'] = pattern ("3o$2bo$2bo$2bo$2bo!", 0, -5) __eafont['7'].width = 4 __eafont['8'] = pattern ("3o$obo$3o$obo$3o!", 0, -5) __eafont['8'].width = 4 __eafont['9'] = pattern ("3o$obo$3o$2bo$3o!", 0, -5) __eafont['9'].width = 4 __eafont[' '] = pattern ("", 0, 0) __eafont[' '].width=2 # allow spaces to mark unknown characters __eafont['-'] = pattern ("", 0, 0) __eafont['-'].width=0 # # Mono-spaced ASCII font __mfont = dict() __mfont[' '] = pattern("") __mfont['!'] = pattern("2bo$2bo$2bo$2bo$2bo2$2bo!") __mfont['"'] = pattern("bobo$bobo$bobo!") __mfont['#'] = pattern("bobo$bobo$5o$bobo$5o$bobo$bobo!") __mfont['$'] = pattern("b3o$obobo$obo$b3o$2bobo$obobo$b3o!") __mfont['%'] = pattern("2o2bo$2o2bo$3bo$2bo$bo$o2b2o$o2b2o!") __mfont['&'] = pattern("b2o$o2bo$o2bo$b2o$o2bo$o2bo$b2obo!") __mfont['\''] = pattern("2bo$2bo$2bo!") __mfont['('] = pattern("3bo$2bo$2bo$2bo$2bo$2bo$3bo!") __mfont[')'] = pattern("bo$2bo$2bo$2bo$2bo$2bo$bo!") __mfont['*'] = pattern("$obobo$b3o$5o$b3o$obobo!") __mfont['+'] = pattern("$2bo$2bo$5o$2bo$2bo!") __mfont[','] = pattern("6$2bo$2bo$bo!") __mfont['-'] = pattern("3$5o!") __mfont['.'] = pattern("6$2bo!") __mfont['/'] = pattern("3bo$3bo$2bo$2bo$2bo$bo$bo!") __mfont['0'] = pattern("b3o$o3bo$o2b2o$obobo$2o2bo$o3bo$b3o!") __mfont['1'] = pattern("2bo$b2o$2bo$2bo$2bo$2bo$b3o!") __mfont['2'] = pattern("b3o$o3bo$4bo$3bo$2bo$bo$5o!") __mfont['3'] = pattern("b3o$o3bo$4bo$2b2o$4bo$o3bo$b3o!") __mfont['4'] = pattern("3bo$2b2o$bobo$o2bo$5o$3bo$3bo!") __mfont['5'] = pattern("5o$o$o$b3o$4bo$o3bo$b3o!") __mfont['6'] = pattern("b3o$o$o$4o$o3bo$o3bo$b3o!") __mfont['7'] = pattern("5o$4bo$3bo$2bo$bo$o$o!") __mfont['8'] = pattern("b3o$o3bo$o3bo$b3o$o3bo$o3bo$b3o!") __mfont['9'] = pattern("b3o$o3bo$o3bo$b4o$4bo$4bo$b3o!") __mfont[':'] = pattern("2$2bo4$2bo!") __mfont[';'] = pattern("2$2bo4$2bo$2bo$bo!") __mfont['<'] = pattern("$3bo$2bo$bo$2bo$3bo!") __mfont['='] = pattern("2$5o2$5o!") __mfont['>'] = pattern("$bo$2bo$3bo$2bo$bo!") __mfont['?'] = pattern("b3o$o3bo$4bo$2b2o$2bo2$2bo!") __mfont['@'] = pattern("b3o$o3bo$ob3o$obobo$ob2o$o$b3o!") __mfont['A'] = pattern("b3o$o3bo$o3bo$5o$o3bo$o3bo$o3bo!") __mfont['B'] = pattern("4o$o3bo$o3bo$4o$o3bo$o3bo$4o!") __mfont['C'] = pattern("b3o$o3bo$o$o$o$o3bo$b3o!") __mfont['D'] = pattern("4o$o3bo$o3bo$o3bo$o3bo$o3bo$4o!") __mfont['E'] = pattern("5o$o$o$3o$o$o$5o!") __mfont['F'] = pattern("5o$o$o$3o$o$o$o!") __mfont['G'] = pattern("b3o$o3bo$o$o2b2o$o3bo$o3bo$b3o!") __mfont['H'] = pattern("o3bo$o3bo$o3bo$5o$o3bo$o3bo$o3bo!") __mfont['I'] = pattern("b3o$2bo$2bo$2bo$2bo$2bo$b3o!") __mfont['J'] = pattern("2b3o$3bo$3bo$3bo$3bo$o2bo$b2o!") __mfont['K'] = pattern("o3bo$o2bo$obo$2o$obo$o2bo$o3bo!") __mfont['L'] = pattern("o$o$o$o$o$o$5o!") __mfont['M'] = pattern("o3bo$2ob2o$obobo$obobo$o3bo$o3bo$o3bo!") __mfont['N'] = pattern("o3bo$2o2bo$obobo$o2b2o$o3bo$o3bo$o3bo!") __mfont['O'] = pattern("b3o$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!") __mfont['P'] = pattern("4o$o3bo$o3bo$4o$o$o$o!") __mfont['Q'] = pattern("b3o$o3bo$o3bo$o3bo$obobo$o2bo$b2obo!") __mfont['R'] = pattern("4o$o3bo$o3bo$4o$o2bo$o3bo$o3bo!") __mfont['S'] = pattern("b3o$o3bo$o$b3o$4bo$o3bo$b3o!") __mfont['T'] = pattern("5o$2bo$2bo$2bo$2bo$2bo$2bo!") __mfont['U'] = pattern("o3bo$o3bo$o3bo$o3bo$o3bo$o3bo$b3o!") __mfont['V'] = pattern("o3bo$o3bo$o3bo$o3bo$o3bo$bobo$2bo!") __mfont['W'] = pattern("o3bo$o3bo$o3bo$obobo$obobo$2ob2o$o3bo!") __mfont['X'] = pattern("o3bo$o3bo$bobo$2bo$bobo$o3bo$o3bo!") __mfont['Y'] = pattern("o3bo$o3bo$bobo$2bo$2bo$2bo$2bo!") __mfont['Z'] = pattern("5o$4bo$3bo$2bo$bo$o$5o!") __mfont['['] = pattern("2b2o$2bo$2bo$2bo$2bo$2bo$2b2o!") __mfont['\\'] = pattern("bo$bo$2bo$2bo$2bo$3bo$3bo!") __mfont[']'] = pattern("b2o$2bo$2bo$2bo$2bo$2bo$b2o!") __mfont['^'] = pattern("2bo$bobo$o3bo!") __mfont['_'] = pattern("6$5o!") __mfont['`'] = pattern("o$bo!") __mfont['a'] = pattern("2$b4o$o3bo$o3bo$o3bo$b4o!") __mfont['b'] = pattern("o$o$4o$o3bo$o3bo$o3bo$4o!") __mfont['c'] = pattern("2$b4o$o$o$o$b4o!") __mfont['d'] = pattern("4bo$4bo$b4o$o3bo$o3bo$o3bo$b4o!") __mfont['e'] = pattern("2$b3o$o3bo$5o$o$b4o!") __mfont['f'] = pattern("2b2o$bo2bo$bo$3o$bo$bo$bo!") __mfont['g'] = pattern("2$b3o$o3bo$o3bo$o3bo$b4o$4bo$b3o!") __mfont['h'] = pattern("o$o$ob2o$2o2bo$o3bo$o3bo$o3bo!") __mfont['i'] = pattern("$2bo2$2bo$2bo$2bo$2b2o!") __mfont['j'] = pattern("$3bo2$3bo$3bo$3bo$3bo$o2bo$b2o!") __mfont['k'] = pattern("o$o$o2bo$obo$3o$o2bo$o3bo!") __mfont['l'] = pattern("b2o$2bo$2bo$2bo$2bo$2bo$2b2o!") __mfont['m'] = pattern("2$bobo$obobo$obobo$o3bo$o3bo!") __mfont['n'] = pattern("2$4o$o3bo$o3bo$o3bo$o3bo!") __mfont['o'] = pattern("2$b3o$o3bo$o3bo$o3bo$b3o!") __mfont['p'] = pattern("2$4o$o3bo$o3bo$o3bo$4o$o$o!") __mfont['q'] = pattern("2$b4o$o3bo$o3bo$o3bo$b4o$4bo$4bo!") __mfont['r'] = pattern("2$ob2o$2o2bo$o$o$o!") __mfont['s'] = pattern("2$b4o$o$b3o$4bo$4o!") __mfont['t'] = pattern("$2bo$5o$2bo$2bo$2bo$3b2o!") __mfont['u'] = pattern("2$o3bo$o3bo$o3bo$o3bo$b4o!") __mfont['v'] = pattern("2$o3bo$o3bo$o3bo$bobo$2bo!") __mfont['w'] = pattern("2$o3bo$o3bo$obobo$2ob2o$o3bo!") __mfont['x'] = pattern("2$o3bo$bobo$2bo$bobo$o3bo!") __mfont['y'] = pattern("2$o3bo$o3bo$o3bo$o3bo$b4o$4bo$b3o!") __mfont['z'] = pattern("2$5o$3bo$2bo$bo$5o!") __mfont['{'] = pattern("3bo$2bo$2bo$bo$2bo$2bo$3bo!") __mfont['|'] = pattern("2bo$2bo$2bo$2bo$2bo$2bo$2bo!") __mfont['}'] = pattern("bo$2bo$2bo$3bo$2bo$2bo$bo!") __mfont['~'] = pattern("2$bo$obobo$3bo!") for key in __mfont: __mfont[key].width = 6 # Snakial font (all chars are stable Life patterns) __sfont = dict () __sfont['0'] = pattern ("2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$o5bo$bo5bo$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!", 0, -14) __sfont['0'].width = 10 __sfont['1'] = pattern ("2o$bo$o$2o2$2o$bo$o$2o2$2o$bo$o$2o!", 1, -14) __sfont['1'].width = 6 __sfont['2'] = pattern ("2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o!", 0, -14) __sfont['2'].width = 10 __sfont['3'] = pattern ("2obo$ob2o$4b2o$4bo$5bo$4b2o$2obo$ob2o$4b2o$4bo$5bo$4b2o$2obo$ob2o!", 0, -14) __sfont['3'].width = 8 __sfont['4'] = pattern ("2o3b2o$2o3b2o2$2o3b2o$obobobo$2bobo$b2obo$5b2o$6bo$5bo$5b2o$6bo$5bo$5b2o!", 0, -14) __sfont['4'].width = 9 __sfont['5'] = pattern ("2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o!", 0, -14) __sfont['5'].width = 10 __sfont['6'] = pattern ("2b2obo$2bob2o$2o$o$bo$2o$2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!", 0, -14) __sfont['6'].width = 10 __sfont['7'] = pattern ("ob2o$2obo$4b2o$5bo$4bo$4b2o$2b2o$3bo$2bo$2b2o$2o$bo$o$2o!", 0, -14) __sfont['7'].width = 8 __sfont['8'] = pattern ("2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o!", 0, -14) __sfont['8'].width = 10 __sfont['9'] = pattern ("2b2obo$2bob2o$2o4b2o$o5bo$bo5bo$2o4b2o$2b2obo$2bob2o$6b2o$6bo$7bo$6b2o$2b2obo$2bob2o!", 0, -14) __sfont['9'].width = 10 __sfont['-'] = pattern ("2obo$ob2o!", 0, -8) __sfont['-'].width = 6 def make_text (string, font='Snakial'): p = pattern () x = 0 if lower(font[:2]) == "ea": f = __eafont unknown = '-' elif lower(font) == "mono": f = __mfont unknown = '?' else: f = __sfont unknown = '-' for c in string: if not f.has_key (c): c = unknown symbol = f[c] p += symbol (x, 0) x += symbol.width return p golly-2.5-src/Scripts/Python/glife/WriteBMP.py0000644000175100001440000000603612156145314016221 00000000000000# Just to save the user having to install PIL. # BMP code from: http://pseentertainmentcorp.com/smf/index.php?topic=2034.0 # Distributed with kind permission from James Main import struct def WriteBMP(pixels,filename): ''' Write a BMP to filename from the (r,g,b) triples in pixels[row][column]. Usage example: WriteBMP( [[(255,0,0),(0,255,0),(255,255,0)],[(0,0,255),(0,0,0),(0,255,255)]], "test.bmp" ) ''' # Here is a minimal dictionary with header values. d = { 'mn1':66, 'mn2':77, 'filesize':0, 'undef1':0, 'undef2':0, 'offset':54, 'headerlength':40, 'width':len(pixels[0]), 'height':len(pixels), 'colorplanes':1, 'colordepth':24, 'compression':0, 'imagesize':0, 'res_hor':0, 'res_vert':0, 'palette':0, 'importantcolors':0 } # Build the byte array. This code takes the height # and width values from the dictionary above and # generates the pixels row by row. The row_mod and padding # stuff is necessary to ensure that the byte count for each # row is divisible by 4. This is part of the specification. bytes = '' for row in range(d['height']-1,-1,-1): # (BMPs are encoded left-to-right from the bottom-left) for column in range(d['width']): r,g,b = pixels[row][column] pixel = struct.pack(' import os import golly from glife.ReadRuleTable import * from glife.EmulateMargolus import * # ask the user for the MCell string to convert (comma-separated works too) s = golly.getstring( '''Enter a specification string. This can either be an MCell format Margolus string or just a comma-separated list of the 16 case indices. See: http://psoup.math.wisc.edu/mcell/rullex_marg.html ''', "MS,D0;8;4;3;2;5;9;7;1;6;10;11;12;13;14;15","Enter Margolus specification") # defaults to BBM # pull out the 16 numeric tokens that tell us what each partition becomes becomes = map(int,s.replace('M',' ').replace('S',' ').replace(',',' ').replace('D',' ').replace(';',' ').split()) # write straight into the user's rules folder, so we can call setrule immediately folder = golly.getdir('rules') # construct a rule_name from next case indices rule_name = 'Margolus-' + '-'.join(map(str,becomes)) # ask the user to confirm this name or suggest a more readable one (e.g. "BBM") rule_name = golly.getstring("Enter a name for the rule:",rule_name,"Enter rule name") # todo: detect slashes and tildes, tell user that can't change dir like that # open the rule table file for writing tablepath = folder + rule_name + '.table' f = open(tablepath,'w') # write the initial descriptors and some variables f.write('# Emulation of Margolus neighbourhood for MCell string:\n# %s\n\n'%s) f.write('# (see: http://psoup.math.wisc.edu/mcell/rullex_marg.html )\n') f.write('#\n') f.write('# Rule table produced by convert-MCell-string.py, which can\n') f.write('# convert any MCell Margolus specification into a rule table.\n') f.write('#\n') f.write('n_states:2\nneighborhood:Margolus\nsymmetries:none\n\n') # the 16 cases of the (two-state) Margolus partition are: dot = (0,0,0,0),(1,0,0,0),(0,1,0,0),(1,1,0,0),(0,0,1,0),(1,0,1,0),(0,1,1,0),(1,1,1,0),\ (0,0,0,1),(1,0,0,1),(0,1,0,1),(1,1,0,1),(0,0,1,1),(1,0,1,1),(0,1,1,1),(1,1,1,1) # cell order: 1 2 # 3 4 # (see: http://psoup.math.wisc.edu/mcell/rullex_marg.html ) for i in range(16): if not i==becomes[i]: # (we can skip no-change transitions) f.write(','.join(map(str,dot[i]))+' : '+\ ','.join(map(str,dot[becomes[i]]))+\ ' # '+str(i)+' -> '+str(becomes[i])+'\n') f.flush() f.close() # emulate the rule table with tree data in a .rule file n_states, neighborhood, transitions = ReadRuleTable(tablepath) golly.show("Building rule...") rule_name = EmulateMargolus(neighborhood, n_states, transitions, tablepath) os.remove(tablepath) golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.show('Created '+rule_name+'.rule and selected that rule.') golly-2.5-src/Scripts/Python/Margolus/export.py0000644000175100001440000000053212156145314016607 00000000000000# Change the entire pattern from emulated-Margolus states to N-state: from glife import rect import golly as g r = rect( g.getrect() ) if r.empty: g.exit("There is no pattern.") for row in xrange(r.top, r.top + r.height): for col in xrange(r.left, r.left + r.width): s = g.getcell(col,row) g.setcell(col, row, (s+s%2)/2-1) golly-2.5-src/Scripts/Python/Margolus/import.py0000644000175100001440000000077412156145314016610 00000000000000# Change the selected area from N states to emulated-Margolus states: # s -> 1+2s (if in the top-left of the partition) # s -> 2+2s (if not) from glife import rect import golly as g r = rect( g.getselrect() ) if r.empty: g.exit("There is no selection.") for row in xrange(r.top, r.top + r.height): for col in xrange(r.left, r.left + r.width): if (col%2) and (row%2): g.setcell(col, row, 1+g.getcell(col,row)*2) else: g.setcell(col, row, 2+g.getcell(col,row)*2) golly-2.5-src/Scripts/Python/Rule-Generators/0000755000175100001440000000000012156146015016220 500000000000000golly-2.5-src/Scripts/Python/Rule-Generators/AbsoluteHexTurmite-gen.py0000644000175100001440000003077212156145314023070 00000000000000# Generator for Absolute-movement Hexagonal Turmite rules import golly import random from glife.EmulateHexagonal import * from glife.WriteRuleTable import * # AKT: Python 2.3 doesn't have "set" built-in try: set except NameError: from sets import Set as set prefix = 'AbsoluteHexTurmite' dirs = ['A','B','C','D','E','F'] opposite_dirs = [3,4,5,0,1,2] # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] # Generate a random rule, while filtering out the dull ones. # More to try: # - if turmite can get stuck in period-2 cycles then rule is bad (or might it avoid them?) example_spec = "{{{1, 'A', 0}, {0, 'B', 0}}}" ns = 2 nc = 3 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_color = random.randint(0,nc-1) dir_to_turn = dirs[random.randint(0,len(dirs)-1)] # (we don't consider splitting and dying here) new_state = random.randint(0,ns-1) example_spec += '{' + str(new_color) + ",'" + dir_to_turn + "'," + str(new_state) + '}' example_spec += '}' example_spec += '}' is_rule_acceptable = True action_table = eval(example_spec.replace('}',']').replace('{','[')) # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does Turmite write every non-zero color? colors_written = set([]) for state in range(ns): for color in range(nc): colors_written.add(action_table[state][color][0]) if not colors_written==set(range(1,nc)): is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # so was the rule acceptable, in the end? if is_rule_acceptable: break spec = golly.getstring( '''This script will create an Absolute-movement HexTurmite CA for a given specification. Enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the Turmite to move ('A', 'B', .. , 'F') c: the new internal state of the Turmite Example: {{{1, 'A', 0}, {0, 'B', 0}}} Has 1 state and 2 colors. The triple {1,'A',0} says: 1. set the color of the square to 1 2. move in direction 'A' 3. adopt state 0 Enter string: ''', example_spec, 'Enter AbsoluteHexTurmite specification:') # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(spec.replace('}',']').replace('{','[')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) n_dirs = 6 # TODO: check table is full and valid total_states = n_colors + n_colors*n_states if total_states > 256: golly.warn("Number of states required exceeds Golly's limit of 256.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s): # turmite on color c in state s return n_colors + n_states*c + s # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = '_'.join(map(str,flatten(action_table))) # (ambiguous but we have to try something) not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): moveset = action_table[state][color][1] for iMove,move in enumerate(dirs): if not move in moveset: # didn't turn this way not_arriving_from_here[opposite_dirs[iMove]] += [encode(color,state)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state)] # we can't build the rule tree directly so we collect the transitions ready for emulation transitions = [] # A single turmite is entering this square: for s in range(n_states): for dir in range(n_dirs): # collect all the possibilities for a turmite to arrive in state s from direction dir inputs = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: if dirs[opposite_dirs[dir]] in action_table[state][color][1]: inputs += [encode(color,state)] if len(inputs)>0: for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in range(n_dirs) ] + \ ### [ [encode(central_color,s)] ] transition = [leaving_color_behind[central_color]] for i in range(n_dirs): if i==dir: transition.append(inputs) else: transition.append(not_arriving_from_here[i]) transition += [ [encode(central_color,s)] ] transitions += [transition] # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): transition = [inputs]+[range(total_states)]*n_dirs+[[output_color]] transitions += [transition] rule_name = prefix+'_'+spec_string # To see the intermediate output as a rule table: #WriteRuleTable('hexagonal',total_states,transitions,golly.getdir('rules')+rule_name+'_asTable.table') HexagonalTransitionsToRuleTree('hexagonal',total_states,transitions,rule_name) # -- make some icons -- palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] width = 31*(total_states-1) height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] huge = [[0,0,0,0,0,1,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,1,1,1,1,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,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,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,1,1,0,0,0,0,0]] big = [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,2,2,2,1,1,1,0,0,0], [0,1,1,1,1,2,2,2,2,2,1,1,0,0,0], [0,1,1,1,2,2,2,2,2,2,2,1,1,0,0], [0,0,1,1,2,2,2,2,2,2,2,1,1,0,0], [0,0,1,1,2,2,2,2,2,2,2,1,1,1,0], [0,0,0,1,1,2,2,2,2,2,1,1,1,1,0], [0,0,0,1,1,1,2,2,2,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]] small = [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,2,2,2,1,0], [0,1,2,2,2,1,0], [0,1,2,2,2,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]] for color in range(n_colors): bg = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = [palette[0],bg,bg][huge[row][column]] for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = [palette[0],bg,bg][big[row][column]] for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = [palette[0],bg,bg][small[row][column]] for state in range(n_states): fg = palette[n_colors+state] # draw the 31x31 icon for row in range(31): for column in range(31): pixels[row][(encode(color,state)-1)*31+column] = [palette[0],bg,fg][huge[row][column]] # draw the 15x15 icon for row in range(15): for column in range(15): pixels[31+row][(encode(color,state)-1)*31+column] = [palette[0],bg,fg][big[row][column]] # draw the 7x7 icon for row in range(7): for column in range(7): pixels[46+row][(encode(color,state)-1)*31+column] = [palette[0],bg,fg][small[row][column]] # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # -- select the new rule -- golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') golly-2.5-src/Scripts/Python/Rule-Generators/AbsoluteTurmite-gen.py0000644000175100001440000003266112156145314022422 00000000000000# Generator for AbsoluteTurmites rules. Also known as 2D Turing machines. # # contact: tim.hutton@gmail.com import golly import random from glife.RuleTree import * dirs=['N','E','S','W'] opposite_dirs = [ 2, 3, 0, 1 ] prefix = 'AbsoluteTurmite' # N.B. All 'relative' Turmites (including Langton's ant and the n-Color family) # can be expressed as Absolute Turmites but require 4n states instead of n. # e.g. {{{1,'E',1},{0,'W',3}},{{1,'S',2},{0,'N',0}},{{1,'W',3},{0,'E',1}},{{1,'N',0},{0,'S',2}}} # is a 4-state 2-color Absolute Turmite that matches Langton's ant # Likewise all normal 1D Turing machines can be expressed as Absolute Turmites in a # straightforward fashion. # e.g. {{{1,'E',1},{1,'W',1}},{{1,'W',0},{1,'',0}}} # is a 2-state 2-color busy beaver # In both cases the opposite transform is usually not possible. Thus Absolute Turmites # are a deeper generalization. # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] example_spec = "{{{1,'E',1},{1,'W',1}},{{1,'W',0},{1,'',0}}}" # Generate a random rule, filtering out the most boring import random ns = 3 nc = 2 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_state = random.randint(0,ns-1) new_color = random.randint(0,nc-1) dir_to_move = dirs[random.randint(0,3)] example_spec += '{' + str(new_color) + ",'" + dir_to_move + "'," + str(new_state) + '}' example_spec += '}' example_spec += '}' # is rule acceptable? is_rule_acceptable = True action_table = eval(example_spec.replace('{','[').replace('}',']')) # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # 1-move lookahead: will turmite zip off when placed on 0? for state in range(ns): if action_table[state][0][2] == state: is_rule_acceptable = False # turmite must write each colour at least once for color in range(nc): if not "{"+str(color)+"," in example_spec: is_rule_acceptable = False # does turmite move in all directions? for dir in dirs: if not "'"+dir+"'" in example_spec: is_rule_acceptable = False if is_rule_acceptable: break spec = golly.getstring( '''This script will create an AbsoluteTurmite CA for a given specification. Enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the turmite to move: 'NESW' c: the new internal state of the turmite Example: {{{1,'E',1},{1,'W',1}},{{1,'W',0},{1,'',0}}} (example pattern #1) Has 2 states and 2 colors. The triple {1,'W',0} says: 1. set the color of the square to 1 2. move West 3. adopt state 0 and move forward one square This is a 1D busy beaver Enter specification string: (default is a random example)''', example_spec, 'Enter Absolute Turmite specification:') # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(spec.replace('{','[').replace('}',']')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of turmites is given by the # "encoding" section below.) n_dirs = 4 # TODO: check table is full and valid total_states = n_colors + n_colors*n_states # problem if we try to export more than 255 states if total_states > 255: golly.warn("Number of states required exceeds Golly's limit of 255.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s): # turmite on color c in state s return n_colors + n_states*c + s # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = ''.join(map(str,map(str,flatten(action_table)))) # (ambiguous but we have to try something) rule_name = prefix+'_'+spec_string remap = [2,1,3,0] # N,E,S,W -> S,E,W,N not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): moveset = action_table[state][color][1] for iMove,move in enumerate(dirs): if not move in moveset: not_arriving_from_here[opposite_dirs[iMove]] += [encode(color,state)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state)] tree = RuleTree(total_states,4) # A single turmite is entering this square: for s in range(n_states): # collect all the possibilities for a turmite to arrive in state s... inputs_sc = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: inputs_sc += [(state,color)] # ...from direction dir for dir in range(n_dirs): inputs = [] for state,color in inputs_sc: moveset = action_table[state][color][1] if dirs[opposite_dirs[dir]] in moveset: # e.g. is there one to the S about to move N inputs += [encode(color,state)] if len(inputs)==0: continue for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition_inputs = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in remap ] transition_inputs = [leaving_color_behind[central_color]] for i in remap: if i==dir: transition_inputs.append(inputs) else: transition_inputs.append(not_arriving_from_here[i]) transition_output = encode(central_color,s) tree.add_rule( transition_inputs, transition_output ) # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): tree.add_rule([inputs]+[range(total_states)]*4,output_color) tree.write(golly.getdir('rules')+rule_name+'.tree') # Write some colour icons so we can see what the turmite is doing # A simple ball drawing, with specular highlights (2) and anti-aliasing (3): icon31x31 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,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,3,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0], [0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0], [0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0], [0,0,0,0,3,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0], [0,0,0,0,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,3,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0], [0,0,0,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,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,0,0,0], [0,0,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,0,0,0], [0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0], [0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0], [0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0], [0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,1,1,1,1,3,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,3,1,1,1,1,1,1,1,1,1,3,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,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,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] icon15x15 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,3,3,3,0,0,0,0,0,0], [0,0,0,0,3,1,1,1,1,1,3,0,0,0,0], [0,0,0,3,1,1,1,1,1,1,1,3,0,0,0], [0,0,3,1,1,2,1,1,1,1,1,1,3,0,0], [0,0,1,1,2,1,1,1,1,1,1,1,1,0,0], [0,3,1,1,2,1,1,1,1,1,1,1,1,3,0], [0,3,1,1,1,1,1,1,1,1,1,1,1,3,0], [0,3,1,1,1,1,1,1,1,1,1,1,1,3,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,3,1,1,1,1,1,1,1,1,1,3,0,0], [0,0,0,3,1,1,1,1,1,1,1,3,0,0,0], [0,0,0,0,3,1,1,1,1,1,3,0,0,0,0], [0,0,0,0,0,0,3,3,3,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] icon7x7 = [ [0,0,3,3,3,0,0], [0,3,1,1,1,3,0], [3,1,2,1,1,1,3], [3,1,1,1,1,1,3], [3,1,1,1,1,1,3], [0,3,1,1,1,3,0], [0,0,3,3,3,0,0] ] palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] highlight=(255,255,255) pixels = [[palette[0] for column in range(total_states)*31] for row in range(53)] for state in range(n_states): for color in range(n_colors): bg_col = palette[color] fg_col = palette[state+n_colors] mid = [(f+b)/2 for f,b in zip(fg_col,bg_col)] for row in range(31): for column in range(31): pixels[row][(encode(color,state)-1)*31+column] = [bg_col,fg_col,highlight,mid][icon31x31[row][column]] for row in range(15): for column in range(15): pixels[31+row][(encode(color,state)-1)*31+column] = [bg_col,fg_col,highlight,mid][icon15x15[row][column]] for row in range(7): for column in range(7): pixels[46+row][(encode(color,state)-1)*31+column] = [bg_col,fg_col,highlight,mid][icon7x7[row][column]] for color in range(n_colors): bg_col = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = bg_col for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = bg_col for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = bg_col # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # now we can switch to the new rule golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') golly-2.5-src/Scripts/Python/Rule-Generators/FredkinModN-gen.py0000644000175100001440000000466612156145314021436 00000000000000import golly import random import time from glife.EmulateHexagonal import * from glife.EmulateTriangular import * from glife.RuleTree import * # AKT: itertools.product is new in Python 2.6 try: from itertools import product except ImportError: # see http://docs.python.org/library/itertools.html#itertools.product def product(*args, **kwds): pools = map(tuple, args) * kwds.get('repeat', 1) result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod) spec = golly.getstring( '''This script will write and select the rule "Fredkin-mod-n", for a given N. This rule is the Winograd extension of the Fredkin Replicator rule (the parity rule): c,{s} -> sum(s)%N (where N=2 for the original parity rule) If N is prime, this will result in any pattern being replicated at N^m timesteps (if the pattern is small enough that it doesn't overlap its copies). Specify the neighborhood (N = von Neumann, M = Moore, T = triangular von Neumann, H = hexagonal, TM = triangular Moore) and the value of N (2-255). e.g. H2, N7 (Larger values of N can take a long time.) ''', 'N3', 'Enter specification:') # work out what the string meant nhood = '' nhoods = {'N':'vonNeumann','TM':'triangularMoore','M':'Moore', 'T':'triangularVonNeumann','H':'hexagonal'} for nh in nhoods.keys(): if nh in spec: nhood = nhoods[nh] n = int(spec.replace(nh,'')) break if nhood=='': golly.exit('Unsupported string: '+spec) if n<2 or n>255: golly.exit('Value of N must lie between 2 and 255.') # assemble the transitions nbors = {'vonNeumann':4,'Moore':8,'hexagonal':6,'triangularVonNeumann':3, 'triangularMoore':12} transitions = [] for sl in product(range(n),repeat=nbors[nhood]): transitions += [ [range(n)] + [[s] for s in sl] + [[sum(sl)%n]] ] rule_name = 'Fredkin_mod'+str(n)+'_'+nhood Converters = { "vonNeumann":ConvertRuleTableTransitionsToRuleTree, "Moore":ConvertRuleTableTransitionsToRuleTree, "triangularVonNeumann":EmulateTriangular, "triangularMoore":EmulateTriangular, "hexagonal":EmulateHexagonal, } golly.show("Building rule...") rule_name = Converters[nhood]( nhood, n, transitions, rule_name+'.tree' ) golly.setrule(rule_name) golly.show('Created '+rule_name+'.rule and selected that rule.') golly-2.5-src/Scripts/Python/Rule-Generators/HexTurmite-gen.py0000644000175100001440000007504712156145314021375 00000000000000# Generator for Hexagonal Turmite rules import golly import random import string from glife.EmulateHexagonal import * from glife.WriteRuleTable import * # AKT: Python 2.3 doesn't have "set" built-in try: set except NameError: from sets import Set as set prefix = 'HexTurmite' turns = [1,2,4,8,16,32] # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] # Generate a random rule, while filtering out the dull ones. # More to try: # - if turmite can get stuck in period-2 cycles then rule is bad (or might it avoid them?) # - (extending) if turmite has (c,2 (or 8),s) for state s and color c then will loop on the spot (unlikely to avoid?) example_spec = '{{{1, 2, 0}, {0, 1, 0}}}' import random ns = 2 nc = 3 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_color = random.randint(0,nc-1) dir_to_turn = turns[random.randint(0,len(turns)-1)] # (we don't consider splitting and dying here) new_state = random.randint(0,ns-1) example_spec += '{' + str(new_color) + "," + str(dir_to_turn) + "," + str(new_state) + '}' example_spec += '}' example_spec += '}' is_rule_acceptable = True action_table = eval(string.replace(string.replace(example_spec,'}',']'),'{','[')) # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does Turmite write every non-zero color? colors_written = set([]) for state in range(ns): for color in range(nc): colors_written.add(action_table[state][color][0]) if not colors_written==set(range(1,nc)): is_rule_acceptable = False # does Turmite ever turn? turmite_turns = False for state in range(ns): for color in range(nc): if not action_table[state][color][1] in [1,32]: # forward, u-turn turmite_turns = True if not turmite_turns: is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # does turmite wobble on the spot? (u-turn that doesn't change color or state) for state in range(ns): for color in range(nc): if action_table[state][color][0]==color and action_table[state][color][1]==32 and action_table[state][color][2]==state: is_rule_acceptable = False # so was the rule acceptable, in the end? if is_rule_acceptable: break ''' Some interesting rules, mostly discovered through random search: 1-state 2-color: In search of Langton's ant: {{{1,4,0},{0,2,0}}} : with gentle turns we get the same as on the triangular grid (symmetric) # (by only allowing gentle turns of course a hex grid is the same as a tri grid) {{{1,16,0},{0,8,0}}} : with sharp turns we get a period-8 glider {{{1,16,0},{0,2,0}}} : with one sharp and one gentle turn we get a pleasing chaos, with a highway after ~5million steps {{{1,4,0},{0,8,0}}} : the other way round. You'd think it would be the same but no highway so far (30million steps) 2-state 2-color rules: {{{1,8,1},{1,1,0}},{{1,8,0},{1,2,0}}} - iceskater makes a thick highway after 40k its {{{1,2,1},{1,1,0}},{{1,4,1},{1,16,0}}} - loose loopy growth {{{1,2,0},{1,16,1}},{{1,1,0},{1,1,1}}} - frustrated space filler {{{1,4,1},{1,1,0}},{{1,1,0},{1,1,1}}} - katana: a 2-speed twin-highway {{{1,4,0},{1,8,1}},{{1,2,0},{1,16,0}}} - highway after 300k its 3-state 2-color rules: {{{1,1,2},{1,4,2}},{{1,2,0},{1,1,2}},{{1,32,0},{1,1,1}}} - shuriken iceskater makes a twin-highway after a few false starts {{{1,16,2},{1,2,2}},{{1,8,0},{1,1,1}},{{1,2,1},{1,4,0}}} - similar 2-state 3-color rules: {{{2,16,1},{2,16,0},{1,8,1}},{{1,32,1},{2,4,0},{1,2,0}}} - loose growth {{{1,1,1},{2,32,1},{1,8,1}},{{2,8,0},{2,16,1},{1,1,0}}} - loose geode growth ''' spec = golly.getstring( '''This script will create a HexTurmite CA for a given specification. Enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the Turmite to turn (1=Forward, 2=Left, 4=Right, 8=Back-left, 16=Back-right, 32=U-turn) c: the new internal state of the Turmite Example: {{{1, 4, 0}, {0, 2, 0}}} Has 1 state and 2 colors. The triple {1,4,0} says: 1. set the color of the square to 1 2. turn right (4) 3. adopt state 0 and move forward one square This is the equivalent of Langton's Ant. Enter string: ''', example_spec, 'Enter HexTurmite specification:') # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(string.replace(string.replace(spec,'}',']'),'{','[')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) n_dirs = 6 # TODO: check table is full and valid total_states = n_colors + n_colors*n_states*n_dirs # problem if we try to export more than 255 states if total_states > 255: golly.warn("Number of states required exceeds Golly's limit of 255.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s,d): # turmite on color c in state s facing away from direction d return n_colors + n_dirs*(n_states*c + s) + d # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = '_'.join(map(str,flatten(action_table))) # (ambiguous but we have to try something) # what direction would a turmite have been facing to end up here from direction # d if it turned t: would_have_been_facing[t][d] would_have_been_facing={ 1:[0,1,2,3,4,5], # forward 2:[1,2,3,4,5,0], # left 4:[5,0,1,2,3,4], # right 8:[2,3,4,5,0,1], # back-left 16:[4,5,0,1,2,3], # back-right 32:[3,4,5,0,1,2], # u-turn } not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): turnset = action_table[state][color][1] for turn in turns: if not turn&turnset: # didn't turn this way for dir in range(n_dirs): facing = would_have_been_facing[turn][dir] not_arriving_from_here[dir] += [encode(color,state,facing)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state,d) for d in range(n_dirs)] # any direction # we can't build the rule tree directly so we collect the transitions ready for emulation transitions = [] # A single turmite is entering this square: for s in range(n_states): for dir in range(n_dirs): # collect all the possibilities for a turmite to arrive in state s from direction dir inputs = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: turnset = action_table[state][color][1] # sum of all turns inputs += [encode(color,state,would_have_been_facing[turn][dir]) \ for turn in turns if turn&turnset] if len(inputs)>0: for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in range(n_dirs) ] + \ ### [ [encode(central_color,s,dir)] ] transition = [leaving_color_behind[central_color]] for i in range(n_dirs): if i==dir: transition.append(inputs) else: transition.append(not_arriving_from_here[i]) transition += [ [encode(central_color,s,dir)] ] transitions += [transition] # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): transition = [inputs]+[range(total_states)]*n_dirs+[[output_color]] transitions += [transition] rule_name = prefix+'_'+spec_string # To see the intermediate output as a rule table: #WriteRuleTable('hexagonal',total_states,transitions,golly.getdir('rules')+rule_name+'_asTable.table') HexagonalTransitionsToRuleTree('hexagonal',total_states,transitions,rule_name) # -- make some icons -- palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] width = 31*(total_states-1) height = 53 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] huge = [[[0,0,0,0,0,1,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,1,1,1,1,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,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,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,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,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,1,1,1,1,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,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,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,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,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,1,1,1,1,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,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,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,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,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,1,1,1,1,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,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,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,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,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,1,1,1,1,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,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,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,1,1,0,0,0,0,0]], [[0,0,0,0,0,1,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,1,1,1,1,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,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0], [0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,2,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,0,0,0], [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,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,1,1,1,1,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,1,1,0,0,0,0,0]]] big = [[[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,2,1,1,1,1,1,1,0], [0,0,0,1,1,2,1,2,1,2,1,1,1,1,1], [0,0,0,0,1,1,2,2,2,1,1,1,1,1,1], [0,0,0,0,0,0,1,2,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,2,1,1,1,1,1,1,1,0,0,0], [0,1,1,2,1,1,1,1,1,1,1,1,1,0,0], [0,0,2,2,2,2,2,2,2,1,1,1,1,0,0], [0,0,1,2,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,2,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,2,2,2,2,1,1,1,0,0,0,0,0,0], [1,1,2,2,1,1,1,1,1,1,1,0,0,0,0], [1,1,2,1,2,1,1,1,1,1,1,1,0,0,0], [0,1,2,1,1,2,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,2,1,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,1,2,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,2,1,0,0,0,0,0,0], [1,1,1,1,1,1,2,2,2,1,1,0,0,0,0], [1,1,1,1,1,2,1,2,1,2,1,1,0,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,2,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,2,1,0,0], [0,0,1,1,1,1,2,2,2,2,2,2,2,0,0], [0,0,1,1,1,1,1,1,1,1,1,2,1,1,0], [0,0,0,1,1,1,1,1,1,1,2,1,1,1,0], [0,0,0,1,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1], [0,0,0,0,0,0,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]], [[0,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,1,1,1,1,1,0,0,0,0,0,0,0,0], [0,1,1,1,1,1,1,1,1,0,0,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,0,0,0,0], [1,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,1,1,1,1,1,1,0,0,0], [0,1,1,1,1,1,2,1,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,2,1,1,1,1,1,0,0], [0,0,1,1,1,1,1,1,2,1,1,1,1,1,0], [0,0,0,1,1,1,1,1,1,2,1,1,2,1,0], [0,0,0,1,1,1,1,1,1,1,2,1,2,1,1], [0,0,0,0,1,1,1,1,1,1,1,2,2,1,1], [0,0,0,0,0,0,1,1,1,2,2,2,2,1,0], [0,0,0,0,0,0,0,0,1,1,1,1,1,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,0]]] small = [[[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,1,2,1,1,0], [0,1,1,2,1,1,0], [0,1,2,2,2,1,1], [0,0,1,2,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,2,1,1,1,0], [0,2,2,2,2,1,0], [0,1,2,1,1,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,2,2,1,1,0,0], [1,2,2,1,1,1,0], [0,1,1,2,1,1,0], [0,1,1,1,2,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,1,1,2,1,0,0], [1,1,2,2,2,1,0], [0,1,1,2,1,1,0], [0,1,1,2,1,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,1,1,2,1,0], [0,1,2,2,2,2,0], [0,1,1,1,2,1,1], [0,0,1,1,1,1,1], [0,0,0,0,1,1,0]], [[0,1,1,0,0,0,0], [1,1,1,1,1,0,0], [1,1,2,1,1,1,0], [0,1,1,2,1,1,0], [0,1,1,1,2,2,1], [0,0,1,1,2,2,1], [0,0,0,0,1,1,0]]] for color in range(n_colors): bg = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = [palette[0],bg,bg][huge[0][row][column]] for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = [palette[0],bg,bg][big[0][row][column]] for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = [palette[0],bg,bg][small[0][row][column]] for state in range(n_states): fg = palette[n_colors+state] for dir in range(n_dirs): # draw the 31x31 icon for row in range(31): for column in range(31): pixels[row][(encode(color,state,dir)-1)*31+column] = [palette[0],bg,fg][huge[dir][row][column]] # draw the 15x15 icon for row in range(15): for column in range(15): pixels[31+row][(encode(color,state,dir)-1)*31+column] = [palette[0],bg,fg][big[dir][row][column]] # draw the 7x7 icon for row in range(7): for column in range(7): pixels[46+row][(encode(color,state,dir)-1)*31+column] = [palette[0],bg,fg][small[dir][row][column]] # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # -- select the new rule -- golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') golly-2.5-src/Scripts/Python/Rule-Generators/icon-exporter.py0000644000175100001440000002752712156145314021326 00000000000000# Extract icon images in current layer (created by icon-importer.py) # and either create or update the appropriate .rule file. # Author: Andrew Trevorrow (andrew@trevorrow.com), Feb 2013. import golly as g from glife import getminbox, pattern from glife.BuiltinIcons import circles, diamonds, hexagons, triangles import os from tempfile import mkstemp from shutil import move iconcolors = [] # list of (r,g,b) colors used in all icons allcolors = g.getcolors() deadrgb = (allcolors[1], allcolors[2], allcolors[3]) # this flag becomes True only if an icon uses a non-gray color (ignoring deadrgb) multi_color_icons = False # grayscale # ------------------------------------------------------------------------------ def hex2(i): # convert number from 0..255 into 2 hex digits hexdigit = "0123456789ABCDEF" result = hexdigit[i / 16] result += hexdigit[i % 16] return result # -------------------------------------------------------------------- def extract_icons(iconsize): global iconcolors, allcolors, deadrgb, multi_color_icons # do 1st pass to determine the colors used and the number of icons numicons = 0 while True: blank = True x = numicons*32 y = 0 if iconsize == 15: y = 32 if iconsize == 7: y = 48 for row in xrange(iconsize): for col in xrange(iconsize): state = g.getcell(x+col, y+row) rgb = (allcolors[state*4+1], allcolors[state*4+2], allcolors[state*4+3]) if not rgb in iconcolors: iconcolors.append(rgb) if rgb != deadrgb: R,G,B = rgb if R != G or G != B: multi_color_icons = True if state > 0: blank = False if blank: break numicons += 1 if numicons == 0: return "" # build string of lines suitable for @ICONS section charsperpixel = 1 numcolors = len(iconcolors) if numcolors > 26: charsperpixel = 2 icondata = "\nXPM\n" icondata += "/* width height num_colors chars_per_pixel */\n" icondata += "\"" + str(iconsize) + " " + str(iconsize*numicons) + " " + \ str(numcolors) + " " + str(charsperpixel) + "\"\n" icondata += "/* colors */\n" cindex = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" n = 0 for RGB in iconcolors: R,G,B = RGB hexcolor = "#" + hex2(R) + hex2(G) + hex2(B) if RGB == deadrgb: # use . or .. for background color icondata += "\"." if charsperpixel == 2: icondata += "." if not multi_color_icons: # grayscale icons so specify black as the background color hexcolor = "#000000" else: icondata += "\"" if charsperpixel == 1: icondata += cindex[n] else: icondata += cindex[n % 16] + cindex[n / 16] icondata += " c " + hexcolor + "\"\n" n += 1 for i in xrange(numicons): icondata += "/* icon for state " + str(i+1) + " */\n" x = i*32 y = 0 if iconsize == 15: y = 32 if iconsize == 7: y = 48 for row in xrange(iconsize): icondata += "\"" for col in xrange(iconsize): state = g.getcell(x+col, y+row) if state == 0: # show . or .. for background color icondata += "." if charsperpixel == 2: icondata += "." else: rgb = (allcolors[state*4+1], allcolors[state*4+2], allcolors[state*4+3]) n = 0 for RGB in iconcolors: if rgb == RGB: break n += 1 if charsperpixel == 1: icondata += cindex[n] else: icondata += cindex[n % 16] + cindex[n / 16] icondata += "\"\n" return icondata # -------------------------------------------------------------------- def parse_hex(hexstr): # parse a string like "FF00EE" or "FFFF0000EEEE" R, G, B = (0, 0, 0) if len(hexstr) == 6: R = int(hexstr[0:2],16) G = int(hexstr[2:4],16) B = int(hexstr[4:6],16) elif len(hexstr) == 12: # only use upper 2 hex digits R = int(hexstr[0:2],16) G = int(hexstr[4:6],16) B = int(hexstr[8:10],16) else: g.warn("Unexpected hex string: " + hexstr) return (R,G,B) # -------------------------------------------------------------------- def create_average_colors(iconsection): global deadrgb colordata = "@COLORS\n\n" R, G, B = deadrgb colordata += "0 " + str(R) + " " + str(G) + " " + str(B) + "\n" width = 0 height = 0 num_colors = 0 chars_per_pixel = 0 xpmcount = 0 colordict = {} row = 0 state = 0 nbcount = 0 totalR = 0 totalG = 0 totalB = 0 for line in iconsection.splitlines(): if len(line) > 0 and line[0] == "\"": # extract the stuff inside double quotes line = line.lstrip("\"").rstrip("\"") xpmcount += 1 if xpmcount == 1: # parse "width height num_colors chars_per_pixel" header = line.split() width = int(header[0]) height = int(header[1]) num_colors = int(header[2]) chars_per_pixel = int(header[3]) elif xpmcount > 1 and xpmcount <= 1 + num_colors: # parse color index line like "A c #FFFFFF" or "AB c #FF009900BB00" key, c, hexrgb = line.split() rgb = parse_hex(hexrgb.lstrip("#")) colordict[key] = rgb elif xpmcount <= 1 + num_colors + height: # parse pixel data in line like "......AAA......" for col in xrange(width): offset = col*chars_per_pixel key = line[offset : offset + chars_per_pixel] if not key in colordict: g.warn("Unexpected key in icon data: " + key) return colordata if key[0] != ".": R, G, B = colordict[key] nbcount += 1 totalR += R totalG += G totalB += B row += 1 if row == width: # we've done this icon state += 1 if nbcount > 0: colordata += str(state) + " " + str(totalR / nbcount) + " " \ + str(totalG / nbcount) + " " \ + str(totalB / nbcount) + "\n" else: # avoid div by zero colordata += str(state) + " 0 0 0\n" # reset counts for next icon row = 0 nbcount = 0 totalR = 0 totalG = 0 totalB = 0 if xpmcount == 1 + num_colors + height: break colordata += "\n" return colordata # -------------------------------------------------------------------- def get_color_section(rulepath): colordata = "" rulefile = open(rulepath,"rU") copylines = False for line in rulefile: if line.startswith("@COLORS"): copylines = True elif copylines and line.startswith("@"): break if copylines: colordata += line rulefile.close() return colordata # -------------------------------------------------------------------- def export_icons(iconsection, rulename): global multi_color_icons if multi_color_icons: # prepend a new @COLORS section with the average colors in each icon iconsection = create_average_colors(iconsection) + iconsection # replace any illegal filename chars with underscores filename = rulename.replace("/","_").replace("\\","_") # we will only create/update a .rule file in the user's rules folder # (ie. we don't modify the supplied Rules folder) rulepath = g.getdir("rules") + filename + ".rule" fileexists = os.path.isfile(rulepath) if fileexists: # .rule file already exists so replace or add @ICONS section rulefile = open(rulepath,"rU") # create a temporary file for writing new rule info temphdl, temppath = mkstemp() tempfile = open(temppath,"w") wroteicons = False skiplines = False for line in rulefile: if line.startswith("@ICONS"): # replace the existing @ICONS section tempfile.write(iconsection) wroteicons = True skiplines = True elif line.startswith("@COLORS") and multi_color_icons: # skip the existing @COLORS section # (iconsection contains a new @COLORS section) skiplines = True elif skiplines and line.startswith("@"): if wroteicons: tempfile.write("\n") skiplines = False if not skiplines: tempfile.write(line) if not wroteicons: # .rule file had no @ICONS section tempfile.write("\n") tempfile.write(iconsection) # close files rulefile.close() tempfile.flush() tempfile.close() os.close(temphdl) # remove original .rule file and rename temporary file os.remove(rulepath) move(temppath, rulepath) else: # .rule file doesn't exist so create it rulefile = open(rulepath,"w") rulefile.write("@RULE " + filename + "\n\n") if not multi_color_icons: # grayscale icons, so check if Rules/filename.rule exists # and if so copy any existing @COLORS section suppliedrule = g.getdir("app") + "Rules/" + filename + ".rule" if os.path.isfile(suppliedrule): colordata = get_color_section(suppliedrule) if len(colordata) > 0: rulefile.write(colordata) rulefile.write(iconsection) rulefile.flush() rulefile.close() # create another layer for displaying the new icons if g.numlayers() < g.maxlayers(): g.addlayer() g.new("icon test") g.setrule(rulename) for i in xrange(g.numstates()-1): g.setcell(i, 0, i+1) g.fit() g.setoption("showicons",True) g.update() if fileexists: g.note("Updated the icon data in " + rulepath) else: g.note("Created " + rulepath) # -------------------------------------------------------------------- # WARNING: changing this prefix will require same change in icon-importer.py layerprefix = "imported icons for " # check that the current layer was created by icon-importer.py layername = g.getname() if not layername.startswith(layerprefix): g.exit("The current layer wasn't created by icon-importer.py.") # get the original rule rulename = layername.split(" for ")[1] icondata = extract_icons(31) icondata += extract_icons(15) icondata += extract_icons(7) if len(icondata) == 0: g.exit("There are no icon images to export.") if not multi_color_icons: # check if the icon data matches Golly's built-in grayscale icons if icondata == circles: icondata = "\ncircles\n" elif icondata == diamonds: icondata = "\ndiamonds\n" elif icondata == hexagons: icondata = "\nhexagons\n" elif icondata == triangles: icondata = "\ntriangles\n" export_icons("@ICONS\n" + icondata, rulename) golly-2.5-src/Scripts/Python/Rule-Generators/icon-importer.py0000644000175100001440000004635412156145314021316 00000000000000# Import any icons for the current rule so the user can edit them # and when finished run icon-exporter.py. # Author: Andrew Trevorrow (andrew@trevorrow.com), Feb 2013. import golly as g from glife import getminbox, pattern from glife.text import make_text from glife.BuiltinIcons import circles, diamonds, hexagons, triangles from colorsys import hsv_to_rgb import os iconinfo31 = [] # info for 31x31 icons iconinfo15 = [] # info for 15x15 icons iconinfo7 = [] # info for 7x7 icons iconcolors = [] # list of (r,g,b) colors used in ALL icon sizes colorstate = {} # dictionary for mapping (r,g,b) colors to cell states # -------------------------------------------------------------------- def parse_hex(hexstr): # parse a string like "FF00EE" or "FFFF0000EEEE" R, G, B = (0, 0, 0) if len(hexstr) == 6: R = int(hexstr[0:2],16) G = int(hexstr[2:4],16) B = int(hexstr[4:6],16) elif len(hexstr) == 12: # only use upper 2 hex digits R = int(hexstr[0:2],16) G = int(hexstr[4:6],16) B = int(hexstr[8:10],16) else: g.warn("Unexpected hex string: " + hexstr) return (R,G,B) # -------------------------------------------------------------------- def use_builtin_icons(shape): global iconinfo31, iconinfo15, iconinfo7, iconcolors if shape == "circles": lines = circles.split('\n') if shape == "diamonds": lines = diamonds.split('\n') if shape == "hexagons": lines = hexagons.split('\n') if shape == "triangles": lines = triangles.split('\n') xpmcount = 0 width = 0 height = 0 num_colors = 0 chars_per_pixel = 0 iconinfo = [] colordict = {} iconcolors = [] for line in lines: if line == "XPM": xpmcount = 1 iconinfo = [] colordict = {} elif xpmcount > 0 and line[0] == "\"": # extract the stuff inside double quotes, ignoring anything after 2nd one line = line.lstrip("\"").split("\"")[0] if xpmcount == 1: # parse "width height num_colors chars_per_pixel" header = line.split() width = int(header[0]) height = int(header[1]) num_colors = int(header[2]) chars_per_pixel = int(header[3]) iconinfo.append(width) iconinfo.append(height) iconinfo.append(num_colors) iconinfo.append(chars_per_pixel) elif xpmcount > 1 and xpmcount <= 1 + num_colors: # parse color index line like "A c #FFFFFF" or "AB c #FF009900BB00" key, c, hexrgb = line.split() rgb = parse_hex(hexrgb.lstrip("#")) if not rgb in iconcolors: iconcolors.append(rgb) colordict[key] = rgb if xpmcount == 1 + num_colors: iconinfo.append(colordict) elif xpmcount <= 1 + num_colors + height: # simply append pixel data in line like "......AAA......" iconinfo.append(line) if xpmcount == 1 + num_colors + height: if width == 31: iconinfo31 = iconinfo if width == 15: iconinfo15 = iconinfo if width == 7: iconinfo7 = iconinfo xpmcount = 0 # skip any extra lines else: xpmcount += 1 # -------------------------------------------------------------------- def import_icons(rulename): global iconinfo31, iconinfo15, iconinfo7, iconcolors # replace any illegal filename chars with underscores rulename = rulename.replace("/","_").replace("\\","_") rulepath = g.getdir("rules") + rulename + ".rule" if not os.path.isfile(rulepath): rulepath = g.getdir("app") + "Rules/" + rulename + ".rule" if not os.path.isfile(rulepath): # there is no .rule file return try: # open in universal newline mode to handle LF, CR, or CR+LF rulefile = open(rulepath,"rU") except: g.exit("Failed to open .rule file: " + rulepath) foundicons = False xpmcount = 0 width = 0 height = 0 num_colors = 0 chars_per_pixel = 0 iconinfo = [] colordict = {} iconcolors = [] # WARNING: The code below must agree with how Golly looks for icon info # (see LoadRuleInfo and ParseIcons in wxlayer.cpp). In particular, if # there are multiple @ICONS sections then only the 1st one is used. for line in rulefile: if foundicons and line.startswith("@"): # start of another section (possibly another @ICONS section) break line = line.rstrip("\n") if line == "@ICONS": foundicons = True elif foundicons and line == "XPM": xpmcount = 1 iconinfo = [] colordict = {} elif foundicons and line in ("circles","diamonds","hexagons","triangles"): use_builtin_icons(line) # don't break (agrees with Golly) elif xpmcount > 0 and line[0] == "\"": # extract the stuff inside double quotes, ignoring anything after 2nd one line = line.lstrip("\"").split("\"")[0] if xpmcount == 1: # parse "width height num_colors chars_per_pixel" header = line.split() width = int(header[0]) height = int(header[1]) num_colors = int(header[2]) chars_per_pixel = int(header[3]) iconinfo.append(width) iconinfo.append(height) iconinfo.append(num_colors) iconinfo.append(chars_per_pixel) elif xpmcount > 1 and xpmcount <= 1 + num_colors: # parse color index line like "A c #FFFFFF" or "AB c #FF009900BB00" key, c, hexrgb = line.split() rgb = parse_hex(hexrgb.lstrip("#")) if not rgb in iconcolors: iconcolors.append(rgb) colordict[key] = rgb if xpmcount == 1 + num_colors: iconinfo.append(colordict) elif xpmcount <= 1 + num_colors + height: # simply append pixel data in line like "......AAA......" iconinfo.append(line) if xpmcount == 1 + num_colors + height: if width == 31: iconinfo31 = iconinfo if width == 15: iconinfo15 = iconinfo if width == 7: iconinfo7 = iconinfo xpmcount = 0 # skip any extra lines else: xpmcount += 1 rulefile.close() # -------------------------------------------------------------------- def check_for_shared_rule(rulename): # rulename has at least one hyphen so get all chars before the last hyphen prefix = rulename.rsplit('-',1)[0] # replace any illegal filename chars with underscores filename = prefix.replace("/","_").replace("\\","_") + "-shared.rule" rulepath = g.getdir("rules") + filename if not os.path.isfile(rulepath): rulepath = g.getdir("app") + "Rules/" + filename if not os.path.isfile(rulepath): # there is no prefix-shared.rule file return "" # ask user if they would prefer to edit icons in shared file sharedname = prefix + "-shared" try: answer = g.getstring("There are no icons in " + rulename + ".rule.\n" + "Would you prefer to edit the icons in " + sharedname + ".rule?", "Yes", "Edit icons in shared rule?") except: # user hit Cancel (which would normally abort script) return "" if len(answer) == 0 or (answer[0] != "Y" and answer[0] != "y"): return "" return sharedname # user said Yes # -------------------------------------------------------------------- def draw_line(x1, y1, x2, y2, state = 1): # draw a line of cells in given state from x1,y1 to x2,y2 g.setcell(x1, y1, state) if x1 == x2 and y1 == y2: return dx = x2 - x1 ax = abs(dx) * 2 sx = 1 if dx < 0: sx = -1 dy = y2 - y1 ay = abs(dy) * 2 sy = 1 if dy < 0: sy = -1 if ax > ay: d = ay - (ax / 2) while x1 != x2: g.setcell(x1, y1, state) if d >= 0: y1 += sy d -= ax x1 += sx d += ay else: d = ax - (ay / 2) while y1 != y2: g.setcell(x1, y1, state) if d >= 0: x1 += sx d -= ay y1 += sy d += ax g.setcell(x2, y2, state) # -------------------------------------------------------------------- def color_text(string, extrastate): t = make_text(string, "mono") bbox = getminbox(t) # convert two-state pattern to multi-state and set state to extrastate mlist = [] tlist = list(t) for i in xrange(0, len(tlist), 2): mlist.append(tlist[i]) mlist.append(tlist[i+1]) mlist.append(extrastate) if len(mlist) % 2 == 0: mlist.append(0) p = pattern(mlist) return p, bbox.wd, bbox.ht # -------------------------------------------------------------------- def init_colors(): global iconcolors, colorstate if len(iconcolors) > 240: g.exit("The imported icons use too many colors!") # start with gradient from white to black (this makes it easier to # copy grayscale icons from one rule to another rule) s = 1 g.setcolors([s,255,255,255]) colorstate[(255,255,255)] = s s += 1 graylevel = 256 while graylevel > 0: graylevel -= 32 g.setcolors([s, graylevel, graylevel, graylevel]) colorstate[(graylevel, graylevel, graylevel)] = s s += 1 # now add all the colors used in the imported icons (unless added above) for rgb in iconcolors: if not rgb in colorstate: R,G,B = rgb g.setcolors([s,R,G,B]) colorstate[rgb] = s s += 1 # finally add rainbow colors in various shades (bright, pale, dark) for hue in xrange(12): if s > 255: break R,G,B = hsv_to_rgb(hue/12.0, 1.0, 1.0) g.setcolors([s, int(255*R), int(255*G), int(255*B)]) s += 1 for hue in xrange(12): if s > 255: break R,G,B = hsv_to_rgb(hue/12.0, 0.5, 1.0) g.setcolors([s, int(255*R), int(255*G), int(255*B)]) s += 1 for hue in xrange(12): if s > 255: break R,G,B = hsv_to_rgb(hue/12.0, 1.0, 0.5) g.setcolors([s, int(255*R), int(255*G), int(255*B)]) s += 1 # return the 50% gray state (used for drawing boxes and text) return colorstate[(128,128,128)] # -------------------------------------------------------------------- def draw_icon_boxes(numicons, linestate): for i in xrange(numicons): x = -1 + i*32 y = -1 # draw boxes for 31x31 icons draw_line(x, y, x, y+32, linestate) draw_line(x, y, x+32, y, linestate) draw_line(x+32, y, x+32, y+32, linestate) draw_line(x, y+32, x+32, y+32, linestate) # draw boxes for 15x15 icons draw_line(x, y+32, x, y+32+16, linestate) draw_line(x, y+32+16, x+16, y+32+16, linestate) draw_line(x+16, y+32, x+16, y+32+16, linestate) # draw boxes for 7x7 icons draw_line(x, y+32+16, x, y+32+16+8, linestate) draw_line(x, y+32+16+8, x+8, y+32+16+8, linestate) draw_line(x+8, y+32+16, x+8, y+32+16+8, linestate) # show state number above top row of icons t, twd, tht = color_text(str(i+1), linestate) t.put(x + 32/2 - twd/2, y - 2 - tht) # -------------------------------------------------------------------- def draw_icons(iconinfo, transparent): global colorstate if len(iconinfo) == 0: return width = iconinfo[0] height = iconinfo[1] num_colors = iconinfo[2] chars_per_pixel = iconinfo[3] colordict = iconinfo[4] pos = 5 numicons = height/width for i in xrange(numicons): x = i*32 y = 0 if width == 15: y = 32 if width == 7: y = 48 for row in xrange(width): pxls = iconinfo[pos] pos += 1 for col in xrange(width): offset = col*chars_per_pixel key = pxls[offset : offset + chars_per_pixel] if not key in colordict: g.exit("Unexpected key in icon data: " + key) rgb = colordict[key] if rgb != transparent: g.setcell(x+col, y+row, colorstate[rgb]) # -------------------------------------------------------------------- def create31x31icons(): # scale up the 15x15 bitmaps into 31x31 bitmaps using a simple # algorithm that conserves any vertical or horizontal symmetry global iconinfo15 width = 15 middle = 7 # middle row or column in 15x15 icon height = iconinfo15[1] numicons = height/width for i in xrange(numicons): x = i*32 y = 32 for row in xrange(width): for col in xrange(width): state = g.getcell(x+col, y+row) if state > 0: if row == middle and col == middle: # expand middle cell into 9 cells xx = i*32+15 yy = 15 g.setcell(xx, yy, state) g.setcell(xx, yy+1, state) g.setcell(xx, yy-1, state) g.setcell(xx+1, yy, state) g.setcell(xx-1, yy, state) g.setcell(xx+1, yy+1, state) g.setcell(xx+1, yy-1, state) g.setcell(xx-1, yy+1, state) g.setcell(xx-1, yy-1, state) elif row == middle: # expand cell in middle row into 6 cells xx = i*32+col*2 yy = row*2 if col > middle: xx += 1 g.setcell(xx, yy, state) g.setcell(xx, yy+1, state) g.setcell(xx+1, yy, state) g.setcell(xx+1, yy+1, state) g.setcell(xx, yy+2, state) g.setcell(xx+1, yy+2, state) elif col == middle: # expand cell in middle column into 6 cells xx = i*32+col*2 yy = row*2 if row > middle: yy += 1 g.setcell(xx, yy, state) g.setcell(xx, yy+1, state) g.setcell(xx+1, yy, state) g.setcell(xx+1, yy+1, state) g.setcell(xx+2, yy, state) g.setcell(xx+2, yy+1, state) else: # expand all other cells into 4 cells xx = i*32+col*2 yy = row*2 if col > middle: xx += 1 if row > middle: yy += 1 g.setcell(xx, yy, state) g.setcell(xx, yy+1, state) g.setcell(xx+1, yy, state) g.setcell(xx+1, yy+1, state) # -------------------------------------------------------------------- def create_smaller_icons(big, small): # scale down the big x big bitmaps into small x small bitmaps # using a simple sampling algorithm global iconinfo15, iconinfo31 if big == 15: numicons = iconinfo15[1] / 15 ybig = 32 else: # big = 31 numicons = iconinfo31[1] / 31 ybig = 0 if small == 7: y = 48 else: # small = 15 y = 32 sample = big / small offset = sample / 2 for i in xrange(numicons): x = i*32 for row in xrange(small): for col in xrange(small): state = g.getcell(x + offset + col*sample, ybig + offset + row*sample) if state > 0: g.setcell(x+col, y+row, state) # -------------------------------------------------------------------- def multi_color_icons(iconcolors): # return True if at least one icon color isn't a shade of gray for R,G,B in iconcolors: if R != G or G != B: return True # grayscale return False # -------------------------------------------------------------------- # check that a layer is available if g.numlayers() == g.maxlayers(): g.exit("You need to delete a layer.") # WARNING: changing this prefix will require same change in icon-exporter.py layerprefix = "imported icons for " if g.getname().startswith(layerprefix): g.exit("You probably meant to run icon-exporter.py.") g.addlayer() rulename = g.getrule().split(":")[0] # search for rulename.rule and import any icon data (also builds iconcolors) import_icons(rulename) if len(iconcolors) == 0 and ("-" in rulename) and not (rulename.endswith("-shared")): # rulename.rule has no icons and rulename contains a hyphen, so # check if prefix-shared.rule exists and ask user if they want to edit # the icons in that file sharedname = check_for_shared_rule(rulename) if len(sharedname) > 0: rulename = sharedname import_icons(rulename) iconnote = "" if len(iconcolors) == 0: iconnote = "There are currently no icons for this rule.\n\n" # check if icons are grayscale grayscale_icons = not multi_color_icons(iconcolors) g.new(layerprefix + rulename) livestates = g.numstates() - 1 deadcolor = g.getcolors(0) deadrgb = (deadcolor[1], deadcolor[2], deadcolor[3]) # switch to a Generations rule so we can have lots of colors g.setrule("//256") if grayscale_icons and deadrgb == (255,255,255): # if icons are grayscale and state 0 color was white then switch # to black background to avoid confusion (ie. we want black pixels # to be transparent) g.setcolors([0,0,0,0]) else: g.setcolors(deadcolor) graystate = init_colors() # if icons are grayscale then change deadrgb to black so that draw_icons # will treat black pixels as transparent if grayscale_icons: deadrgb = (0,0,0) draw_icon_boxes(livestates, graystate) draw_icons(iconinfo31, deadrgb) draw_icons(iconinfo15, deadrgb) draw_icons(iconinfo7, deadrgb) # create missing icons by scaling up/down the existing icons if len(iconinfo31) == 0 and len(iconinfo15) > 0: create31x31icons() iconnote += "The 31x31 icons were created by scaling up the 15x15 icons.\n\n" if len(iconinfo15) == 0 and len(iconinfo31) > 0: create_smaller_icons(31, 15) iconnote += "The 15x15 icons were created by scaling down the 31x31 icons.\n\n" if len(iconinfo7) == 0: if len(iconinfo15) > 0: create_smaller_icons(15, 7) iconnote += "The 7x7 icons were created by scaling down the 15x15 icons.\n\n" elif len(iconinfo31) > 0: create_smaller_icons(31, 7) iconnote += "The 7x7 icons were created by scaling down the 31x31 icons.\n\n" g.setoption("showlayerbar",True) g.setoption("showallstates",True) g.setoption("showicons",False) g.fit() g.update() g.note(iconnote + "Edit the icons and then run icon-exporter.py.") golly-2.5-src/Scripts/Python/Rule-Generators/Langtons-Ant-gen.py0000644000175100001440000002563312156145314021600 00000000000000# generator for Langton's Ant rules # inspired by Aldoaldoz: http://www.youtube.com/watch?v=1X-gtr4pEBU # contact: tim.hutton@gmail.com import golly import random from glife.RuleTree import * opposite_dirs=[2,3,0,1] # index of opposite direction # encoding: # (0-n_colors: empty square) def encode(c,s,d): # turmite on color c in state s facing direction d return n_colors + n_dirs*(n_states*c+s) + d prefix = 'LangtonsAnt' # (We choose a different name to the inbuilt Langtons-Ant rule to avoid # name collision between the rules we output and the existing icons.) spec = golly.getstring( '''This script will create a Langton's Ant CA for a given string of actions. The string specifies which way to turn when standing on a square of each state. Examples: RL (Langton's Ant), RLR (Chaos), LLRR (Cardioid), LRRL (structure) Permitted moves: 'L':Left, 'R':Right, 'U':U-turn, 'N':No turn Enter string:''', 'RL', 'Enter string:') n_colors = len(spec) d={'R':'2','L':'8','U':'4','N':'1'} # 1=noturn, 2=right, 4=u-turn, 8=left turmite_spec = "{{"+','.join(['{'+str((i+1)%n_colors)+','+d[spec[i]]+',0}' for i in range(n_colors)])+"}}" rule_name = prefix+'_'+spec action_table = eval(turmite_spec.replace('}',']').replace('{','[')) n_states = len(action_table) n_dirs=4 # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) total_states = n_colors+n_colors*n_states*n_dirs # problem if we try to export more than 255 states if total_states>255: golly.warn("Number of states required exceeds Golly's limit of 255\n\nMaximum 51 turns allowed.") golly.exit() # what direction would a turmite have been facing to end up here from direction # d if it turned t: would_have_been_facing[t][d] would_have_been_facing={ 1:[2,3,0,1], # no turn 2:[1,2,3,0], # right 4:[0,1,2,3], # u-turn 8:[3,0,1,2], # left } remap = [2,1,3,0] # N,E,S,W -> S,E,W,N not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): turnset = action_table[state][color][1] for turn in [1,2,4,8]: if not turn&turnset: # didn't turn this way for dir in range(n_dirs): facing = would_have_been_facing[turn][dir] not_arriving_from_here[dir] += [encode(color,state,facing)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state,d) for d in range(n_dirs)] # any direction tree = RuleTree(total_states,4) # A single turmite is entering this square: for s in range(n_states): # collect all the possibilities for a turmite to arrive in state s... inputs_sc = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: inputs_sc += [(state,color)] # ...from direction dir for dir in range(n_dirs): inputs = [] for state,color in inputs_sc: turnset = action_table[state][color][1] # sum of all turns inputs += [encode(color,state,would_have_been_facing[turn][dir]) for turn in [1,2,4,8] if turn&turnset] if len(inputs)==0: continue for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition_inputs = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in remap ] transition_inputs = [leaving_color_behind[central_color]] for i in remap: if i==dir: transition_inputs.append(inputs) else: transition_inputs.append(not_arriving_from_here[i]) transition_output = encode(central_color,s,opposite_dirs[dir]) tree.add_rule( transition_inputs, transition_output ) # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): tree.add_rule([inputs]+[range(total_states)]*4,output_color) tree.write(golly.getdir('rules')+rule_name+'.tree') # Create some multi-colour icons so we can see what the ant is doing # Andrew's ant drawing: (with added eyes (2) and anti-aliasing (3)) ant31x31 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,1,2,2,1,1,1,2,2,1,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,1,1,2,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,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,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,1,1,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,1,1,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,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,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,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,3,1,1,1,3,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,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,1,1,1,1,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,3,1,1,1,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,1,1,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,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] ant15x15 = [[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,1,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,2,1,2,0,0,0,0,0,0], [0,0,0,1,0,0,1,1,1,0,0,1,0,0,0], [0,0,0,0,1,0,0,1,0,0,1,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,1,0,0,0,1,0,0,0,1,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,0,0,1,0,0,1,0,0,0,0], [0,0,0,1,0,0,3,1,3,0,0,1,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,0,3,1,3,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] ant7x7 = [ [0,1,0,0,0,1,0], [0,0,2,1,2,0,0], [0,0,0,1,0,0,0], [0,1,1,1,1,1,0], [0,0,0,1,0,0,0], [0,1,1,1,1,1,0], [0,0,0,1,0,0,0] ] palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] eyes = (255,255,255) rotate4 = [ [[1,0],[0,1]], [[0,-1],[1,0]], [[-1,0],[0,-1]], [[0,1],[-1,0]] ] offset4 = [ [0,0], [1,0], [1,1], [0,1] ] pixels = [[palette[0] for column in range(total_states)*31] for row in range(53)] for state in range(n_states): for color in range(n_colors): for dir in range(n_dirs): bg_col = palette[color] fg_col = palette[state+n_colors] mid = [(f+b)/2 for f,b in zip(fg_col,bg_col)] for x in range(31): for y in range(31): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*30 row = rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*30 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant31x31[y][x]] for x in range(15): for y in range(15): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*14 row = 31 + rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*14 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant15x15[y][x]] for x in range(7): for y in range(7): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*6 row = 46 + rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*6 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant7x7[y][x]] for color in range(n_colors): bg_col = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = bg_col for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = bg_col for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = bg_col # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # now we can switch to the new rule golly.new(rule_name+' demo') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,n_colors+3) # start with an ant facing west golly.show('Created '+rule_name+'.rule and selected that rule.') golly-2.5-src/Scripts/Python/Rule-Generators/make-ruletree.py0000644000175100001440000000414412156145314021260 00000000000000# Generates a rule tree using a given Python transition function # passed in via the clipboard. # Here's an example function for Conway's Life # (copy all the lines between the triple quotes): ''' # B3/S23: name = "LifeTest" n_states = 2 n_neighbors = 8 # order for 8 neighbors is NW, NE, SW, SE, N, W, E, S, C def transition_function(a): n = a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7] if n==2 and a[8]==1: return 1 if n==3: return 1 return 0 ''' # Another example, but using the vonNeumann neighborhood: ''' name = "ParityNWE" n_states = 5 n_neighbors = 4 # order for 4 neighbors is N, W, E, S, C def transition_function ( s ) : return ( s[0] + s[1] + s[2] ) % 5 ''' import golly from glife.RuleTree import * # exec() only works if all lines end with LF, so we need to convert # any Win line endings (CR+LF) or Mac line endings (CR) to LF CR = chr(13) LF = chr(10) try: exec(golly.getclipstr().replace(CR+LF,LF).replace(CR,LF)) MakeRuleTreeFromTransitionFunction( n_states, n_neighbors, transition_function, golly.getdir("rules")+name+".tree" ) # use name.tree to create name.rule (with no icons); # note that if name.rule already exists then we only replace the info in # the @TREE section to avoid clobbering any other info added by the user ConvertTreeToRule(name, n_states, []) golly.setalgo("RuleLoader") golly.setrule(name) golly.show("Created "+golly.getdir("rules")+name+".rule and switched to that rule.") except: import sys import traceback exception, msg, tb = sys.exc_info() golly.warn(\ '''To use this script, copy a Python format rule definition into the clipboard, e.g.: name = "ParityNWE" n_states = 5 n_neighbors = 4 # order for 4 neighbors is N, W, E, S, C def transition_function ( s ) : return ( s[0] + s[1] + s[2] ) % 5 For more examples, see the script file (right-click on it). ____________________________________________________ A problem was encountered with the supplied rule: '''+ '\n'.join(traceback.format_exception(exception, msg, tb))) golly.exit() golly-2.5-src/Scripts/Python/Rule-Generators/RuleTableToTree.py0000644000175100001440000000316012156145314021515 00000000000000import golly import os from glife.ReadRuleTable import * from glife.RuleTree import * from glife.EmulateTriangular import * from glife.EmulateMargolus import * from glife.EmulateOneDimensional import * from glife.EmulateHexagonal import * # ask user to select .table file filename = golly.opendialog('Open a rule table to convert:', 'Rule tables (*.table)|*.table', golly.getdir('rules')) if len(filename) == 0: golly.exit() # user hit Cancel # add new converters here as they become available: Converters = { "vonNeumann":ConvertRuleTableTransitionsToRuleTree, "Moore":ConvertRuleTableTransitionsToRuleTree, "triangularVonNeumann":EmulateTriangular, "triangularMoore":EmulateTriangular, "Margolus":EmulateMargolus, "square4_figure8v":EmulateMargolus, "square4_figure8h":EmulateMargolus, "square4_cyclic":EmulateMargolus, "oneDimensional":EmulateOneDimensional, "hexagonal":EmulateHexagonal, } golly.show("Reading from rule table file...") n_states, neighborhood, transitions = ReadRuleTable(filename) if not neighborhood in Converters: golly.warn("Unsupported neighborhood: "+neighborhood) golly.show('') golly.exit() # all converters now create a .rule file golly.show("Building rule...") rule_name = Converters[neighborhood]( neighborhood, n_states, transitions, filename ) golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.show('Created '+rule_name+'.rule and selected that rule.') golly-2.5-src/Scripts/Python/Rule-Generators/TriTurmite-gen.py0000644000175100001440000006105512156145314021401 00000000000000# Generator for Triangular Turmite rules import golly import random import string from glife.EmulateTriangular import * from glife.WriteRuleTable import * prefix = 'TriTurmite' # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] # Generate a random rule, while filtering out the dull ones. # More to try: # - if turmite can get stuck in period-2 cycles then rule is bad (or might it avoid them?) # - (extending) if turmite has (c,2 (or 8),s) for state s and color c then will loop on the spot (unlikely to avoid?) example_spec = '{{{1, 2, 0}, {0, 1, 0}}}' import random ns = 2 nc = 3 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_color = random.randint(0,nc-1) dir_to_turn = [1,2,4][random.randint(0,2)] # (we don't consider splitting and dying here) new_state = random.randint(0,ns-1) example_spec += '{' + str(new_color) + "," + str(dir_to_turn) + "," + str(new_state) + '}' example_spec += '}' example_spec += '}' is_rule_acceptable = True action_table = eval(string.replace(string.replace(example_spec,'}',']'),'{','[')) # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does Turmite write every non-zero color? colors_written = set([]) for state in range(ns): for color in range(nc): colors_written.add(action_table[state][color][0]) if not colors_written==set(range(1,nc)): is_rule_acceptable = False # does Turmite ever turn? turmite_turns = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] in [4]: # u-turn turmite_turns = True if not turmite_turns: is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # does turmite wobble on the spot? (u-turn that doesn't change color or state) for state in range(ns): for color in range(nc): if action_table[state][color][0]==color and action_table[state][color][1]==4 and action_table[state][color][2]==state: is_rule_acceptable = False # so was the rule acceptable, in the end? if is_rule_acceptable: break spec = golly.getstring( '''This script will create a TriTurmite CA for a given specification. Enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the Turmite to turn (1=Left, 2=Right, 4=U-turn) c: the new internal state of the Turmite Example: {{{1, 2, 0}, {0, 1, 0}}} Has 1 state and 2 colors. The triple {1,2,0} says: 1. set the color of the square to 1 2. turn right (2) 3. adopt state 0 (no change) and move forward one square This is the equivalent of Langton's Ant. Enter string: ''', example_spec, 'Enter TriTurmite specification:') '''Some interesting rule found with this script: {{{2,4,0},{2,4,0},{1,2,1}},{{1,2,1},{2,1,0},{1,4,1}}} - lightning cloud {{{1,1,1},{1,2,0},{2,1,1}},{{2,2,1},{2,2,1},{1,4,0}}} - makes a highway (seems to be rarer in tri grids compared to square grids?) {{{2,2,1},{1,2,0},{1,1,1}},{{1,2,0},{2,1,0},{1,4,1}}} - data pyramid {{{2,1,0},{1,4,1},{1,1,0}},{{2,4,0},{2,2,1},{1,1,1}}} - a filled version of the tri-grid Langton's ant {{{1,1,0},{2,2,1},{1,1,0}},{{1,4,0},{2,2,0},{2,2,0}}} - hypnodisc ''' # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(string.replace(string.replace(spec,'}',']'),'{','[')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) n_dirs = 3 # TODO: check table is full and valid total_states = n_colors+n_colors*n_states*3 # problem if we try to export more than 255 states if total_states > 128: # max allowed using checkerboard emulation (see EmulateTriangular) golly.warn("Number of states required exceeds Golly's limit of 255.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s,d): # turmite on color c in state s facing away from direction d return n_colors + 3*(n_states*c+s) + d # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = ''.join(map(str,map(lambda x:hex(x)[2:],flatten(action_table)))) # (ambiguous but we have to try something) # what direction would a turmite have been facing to end up here from direction # d if it turned t: would_have_been_facing[t][d] would_have_been_facing={ 1:[2,0,1], # left 2:[1,2,0], # right 4:[0,1,2], # u-turn } not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): turnset = action_table[state][color][1] for turn in [1,2,4]: if not turn&turnset: # didn't turn this way for dir in range(n_dirs): facing = would_have_been_facing[turn][dir] not_arriving_from_here[dir] += [encode(color,state,facing)] # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state,d) for d in range(n_dirs)] # any direction # we can't build the rule tree directly so we collect the transitions ready for emulation transitions = [] # A single turmite is entering this square: for s in range(n_states): for dir in range(n_dirs): # collect all the possibilities for a turmite to arrive in state s from direction dir inputs = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: turnset = action_table[state][color][1] # sum of all turns inputs += [encode(color,state,would_have_been_facing[turn][dir]) \ for turn in [1,2,4] if turn&turnset] if len(inputs)>0: for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in range(n_dirs) ] + \ ### [ [encode(central_color,s,dir)] ] transition = [leaving_color_behind[central_color]] for i in range(n_dirs): if i==dir: transition.append(inputs) else: transition.append(not_arriving_from_here[i]) transition += [ [encode(central_color,s,dir)] ] transitions += [transition] # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): transition = [inputs]+[range(total_states)]*n_dirs+[[output_color]] transitions += [transition] rule_name = prefix+'_'+spec_string # To see the intermediate output as a rule table (can use RuleTableToTree.py to load it): #WriteRuleTable("triangularVonNeumann",total_states,transitions,golly.getdir('rules')+rule_name+'_asTable.table') # -- make some icons -- palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] if total_states<=16: TriangularTransitionsToRuleTree_SplittingMethod("triangularVonNeumann",total_states,transitions,rule_name) width = 15*(total_states*total_states-1) + 15 # we set the background color height = 22 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] # turmite icons: 0=black, 1=background color, 2=turmite color turmite_big = [[[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,0,1,1,1,1,1,1,2,2,2,2,1,1], [1,1,1,0,1,1,1,1,1,1,1,2,2,1,1], [1,1,1,1,0,1,1,1,1,1,2,1,2,1,1], [1,1,1,1,1,0,1,1,1,2,1,1,2,1,1], [1,1,1,1,1,1,0,1,2,1,1,1,1,1,1], [1,1,1,1,1,1,1,0,1,1,1,1,1,1,1], [1,1,1,1,1,1,2,1,0,1,1,1,1,1,1], [1,1,2,1,1,2,1,1,1,0,1,1,1,1,1], [1,1,2,1,2,1,1,1,1,1,0,1,1,1,1], [1,1,2,2,1,1,1,1,1,1,1,0,1,1,1], [1,1,2,2,2,2,1,1,1,1,1,1,0,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,0,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0]], [[0,1,1,1,1,1,1,1,2,1,1,1,1,1,1], [1,0,1,1,1,1,1,1,2,1,1,1,1,1,1], [1,1,0,1,1,1,1,1,1,2,1,1,1,1,1], [1,1,1,0,1,1,1,1,1,2,1,1,1,1,1], [1,1,1,1,0,1,1,1,1,1,2,1,1,1,1], [1,1,2,1,1,0,1,1,1,1,2,1,2,1,1], [1,1,2,2,1,1,0,1,1,1,1,2,2,1,1], [1,1,2,2,2,1,1,0,1,1,2,2,2,1,1], [1,1,2,2,1,1,1,1,0,1,1,2,2,1,1], [1,1,2,1,2,1,1,1,1,0,1,1,2,1,1], [1,1,1,1,2,1,1,1,1,1,0,1,1,1,1], [1,1,1,1,1,2,1,1,1,1,1,0,1,1,1], [1,1,1,1,1,2,1,1,1,1,1,1,0,1,1], [1,1,1,1,1,1,2,1,1,1,1,1,1,0,1], [1,1,1,1,1,1,2,1,1,1,1,1,1,1,0]], [[0,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,0,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,0,1,1,2,2,2,2,2,1,1,1,1,1], [1,1,1,0,1,1,2,2,2,1,1,1,1,1,1], [1,1,1,1,0,1,1,2,1,2,2,1,1,1,1], [1,1,1,1,1,0,1,1,1,1,1,2,2,1,1], [1,1,1,1,1,1,0,1,1,1,1,1,1,2,2], [1,1,1,1,1,1,1,0,1,1,1,1,1,1,1], [2,2,1,1,1,1,1,1,0,1,1,1,1,1,1], [1,1,2,2,1,1,1,1,1,0,1,1,1,1,1], [1,1,1,1,2,2,1,2,1,1,0,1,1,1,1], [1,1,1,1,1,1,2,2,2,1,1,0,1,1,1], [1,1,1,1,1,2,2,2,2,2,1,1,0,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,0,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,0]]] turmite_small = [[[0,1,1,1,1,1,1], [1,0,1,2,2,2,1], [1,1,0,1,1,2,1], [1,2,1,0,1,2,1], [1,2,1,1,0,1,1], [1,2,2,2,1,0,1], [1,1,1,1,1,1,0]], [[0,1,1,1,1,1,1], [1,0,1,1,1,2,1], [1,1,0,1,2,2,1], [1,2,1,0,1,2,1], [1,2,2,1,0,1,1], [1,2,1,1,1,0,1], [1,1,1,1,1,1,0]], [[0,1,1,1,1,1,1], [1,0,1,2,2,2,1], [1,1,0,1,2,1,1], [1,1,1,0,1,1,1], [1,1,2,1,0,1,1], [1,2,2,2,1,0,1], [1,1,1,1,1,1,0]]] # TODO: do something about this horrible code for lc in range(n_colors): for uc in range(n_colors): '''draw the cells with no turmites''' golly_state = uc * total_states + lc for row in range(15): for column in range(15): if column>row: # upper pixels[row][(golly_state-1)*15+column] = palette[uc] elif columnrow: # upper pixels[15+row][(golly_state-1)*15+column] = palette[uc] elif columnrow: # upper bg_col = palette[uc] fg_col = palette[n_colors+us] pixels[row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_big[ud][row][column]] elif columnrow: # upper bg_col = palette[uc] fg_col = palette[n_colors+us] pixels[15+row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_small[ud][row][column]] elif columncolumn: # lower bg_col = palette[lc] fg_col = palette[n_colors+ls] pixels[row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_big[ld][row][column]] elif column>row: # upper pixels[row][(golly_state-1)*15+column] = palette[uc] for row in range(7): for column in range(7): if row>column: # lower bg_col = palette[lc] fg_col = palette[n_colors+ls] pixels[15+row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_small[ld][row][column]] elif column>row: # upper pixels[15+row][(golly_state-1)*15+column] = palette[uc] '''draw the cells with a turmite in both halves''' for us in range(n_states): for ud in range(n_dirs): upper = encode(uc,us,ud) golly_state = upper * total_states + lower for row in range(15): for column in range(15): if row>column: # lower bg_col = palette[lc] fg_col = palette[n_colors+ls] pixels[row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_big[ld][row][column]] elif column>row: # upper bg_col = palette[uc] fg_col = palette[n_colors+us] pixels[row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_big[ud][row][column]] for row in range(7): for column in range(7): if row>column: # lower bg_col = palette[lc] fg_col = palette[n_colors+ls] pixels[15+row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_small[ld][row][column]] elif column>row: # upper bg_col = palette[uc] fg_col = palette[n_colors+us] pixels[15+row][(golly_state-1)*15+column] = [palette[0],bg_col,fg_col][turmite_small[ud][row][column]] ConvertTreeToRule(rule_name, total_states, pixels) elif total_states<=128: TriangularTransitionsToRuleTree_CheckerboardMethod("triangularVonNeumann",total_states,transitions,rule_name) width = 15*(total_states*2-2) + 15 # we set the background color height = 22 pixels = [[(0,0,0) for x in range(width)] for y in range(height)] # turmite icons: 0=black, 1=background color, 2=turmite color lower = [[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,2,0,0,0,0], [0,0,0,1,1,1,1,1,2,2,1,1,0,0,0], [0,0,1,1,2,1,2,2,1,1,1,1,1,0,0], [0,1,1,2,2,2,1,1,1,1,1,1,1,1,0], [1,1,2,2,2,2,2,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,0,0]], [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,1,1,2,1,1,1,0,0,0,0], [0,0,0,1,1,1,2,2,2,1,1,1,0,0,0], [0,0,1,1,1,2,2,2,2,2,1,1,1,0,0], [0,1,1,1,1,1,1,2,1,1,1,1,1,1,0], [1,1,1,1,1,1,1,2,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,2,1,1,1,1,1,1,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,0,0]], [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,2,1,1,1,1,1,1,0,0,0,0], [0,0,0,1,1,2,2,1,1,1,1,1,0,0,0], [0,0,1,1,1,1,1,2,2,1,2,1,1,0,0], [0,1,1,1,1,1,1,1,1,2,2,2,1,1,0], [1,1,1,1,1,1,1,1,2,2,2,2,2,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,0,0]]] lower7x7 = [[[0,0,0,0,0,0,0], [0,0,0,0,0,0,0], [0,0,0,1,0,0,0], [0,0,1,1,1,0,0], [0,1,2,2,1,1,0], [1,1,1,1,1,1,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,1,0,0,0], [0,0,1,2,1,0,0], [0,1,2,1,2,1,0], [1,1,1,1,1,1,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,1,0,0,0], [0,0,1,1,1,0,0], [0,1,1,2,2,1,0], [1,1,1,1,1,1,1], [0,0,0,0,0,0,0]]] # (we invert the lower triangle to get the upper triangle) for color in range(n_colors): bg_color = palette[color] # draw the 15x15 icon for row in range(15): for column in range(15): # lower triangle pixels[row][(color-1)*15+column] = \ [palette[0],bg_color,bg_color][lower[0][row][column]] # upper triangle pixels[row][(color+total_states-2)*15+column] = \ [palette[0],bg_color,bg_color][lower[0][13-row][column]] # draw the 7x7 icon for row in range(7): for column in range(7): # lower triangle pixels[15+row][(color-1)*15+column] = \ [palette[0],bg_color,bg_color][lower7x7[0][row][column]] # upper triangle pixels[15+row][(color+total_states-2)*15+column] = \ [palette[0],bg_color,bg_color][lower7x7[0][6-row][column]] for state in range(n_states): fg_color = palette[n_colors+state] for dir in range(n_dirs): # draw the 15x15 icon for row in range(15): for column in range(15): # lower triangle pixels[row][(encode(color,state,dir)-1)*15+column] = \ [palette[0],bg_color,fg_color][lower[dir][row][column]] # upper triangle pixels[row][(encode(color,state,dir)+total_states-2)*15+column] = \ [palette[0],bg_color,fg_color][lower[2-dir][13-row][column]] # draw the 7x7 icon for row in range(7): for column in range(7): # lower triangle pixels[15+row][(encode(color,state,dir)-1)*15+column] = \ [palette[0],bg_color,fg_color][lower7x7[dir][row][column]] # upper triangle pixels[15+row][(encode(color,state,dir)+total_states-2)*15+column] = \ [palette[0],bg_color,fg_color][lower7x7[2-dir][6-row][column]] ConvertTreeToRule(rule_name, total_states, pixels) else: golly.warn('Too many states!') golly.exit() # -- select the rule -- golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') golly-2.5-src/Scripts/Python/Rule-Generators/Turmite-gen.py0000644000175100001440000006706012156145314020724 00000000000000# Generator for Turmite rules # # Following work of Ed Pegg Jr. # specifically the Mathematica notebook linked-to from here: # http://www.mathpuzzle.com/26Mar03.html # # contact: tim.hutton@gmail.com import golly import random from glife.RuleTree import * dirs=['N','E','S','W'] opposite_dirs=[2,3,0,1] # index of opposite direction turn={ # index of new direction 1:[0,1,2,3], # no turn 2:[1,2,3,0], # right 4:[2,3,0,1], # u-turn 8:[3,0,1,2], # left } prefix = 'Turmite' # N.B. Translating from Langtons-Ant-nColor to Turmite is easy: # e.g. LLRR is (1 state, 4 color) {{{1,8,0},{2,8,0},{3,2,0},{0,2,0}}} # but translating the other way is only possible if the Turmite has # exactly 1 state and only moves left or right EdPeggJrTurmiteLibrary = [ # source: http://demonstrations.wolfram.com/Turmites/ # Translated into his later notation: 1=noturn, 2=right, 4=u-turn, 8=left # (old notation was: 0=noturn,1=right,-1=left) # (all these are 2-color patterns) "{{{1, 2, 0}, {0, 8, 0}}}", # 1: Langton's ant "{{{1, 2, 0}, {0, 1, 0}}}", # 2: binary counter "{{{0, 8, 1}, {1, 2, 1}}, {{1, 1, 0}, {1, 1, 1}}}", # 3: (filled triangle) "{{{0, 1, 1}, {0, 8, 1}}, {{1, 2, 0}, {0, 1, 1}}}", # 4: spiral in a box "{{{0, 2, 1}, {0, 8, 0}}, {{1, 8, 1}, {0, 2, 0}}}", # 5: stripe-filled spiral "{{{0, 2, 1}, {0, 8, 0}}, {{1, 8, 1}, {1, 1, 0}}}", # 6: stepped pyramid "{{{0, 2, 1}, {0, 1, 1}}, {{1, 2, 1}, {1, 8, 0}}}", # 7: contoured island "{{{0, 2, 1}, {0, 2, 1}}, {{1, 1, 0}, {0, 2, 1}}}", # 8: woven placemat "{{{0, 2, 1}, {1, 2, 1}}, {{1, 8, 1}, {1, 8, 0}}}", # 9: snowflake-ish (mimics Jordan's ice-skater) "{{{1, 8, 0}, {0, 1, 1}}, {{0, 8, 0}, {0, 8, 1}}}", # 10: slow city builder "{{{1, 8, 0}, {1, 2, 1}}, {{0, 2, 0}, {0, 8, 1}}}", # 11: framed computer art "{{{1, 8, 0}, {1, 2, 1}}, {{0, 2, 1}, {1, 8, 0}}}", # 12: balloon bursting (makes a spreading highway) "{{{1, 8, 1}, {0, 8, 0}}, {{1, 1, 0}, {0, 1, 0}}}", # 13: makes a horizontal highway "{{{1, 8, 1}, {0, 8, 0}}, {{1, 2, 1}, {1, 2, 0}}}", # 14: makes a 45 degree highway "{{{1, 8, 1}, {0, 8, 1}}, {{1, 2, 1}, {0, 8, 0}}}", # 15: makes a 45 degree highway "{{{1, 8, 1}, {0, 1, 0}}, {{1, 1, 0}, {1, 2, 0}}}", # 16: spiral in a filled box "{{{1, 8, 1}, {0, 2, 0}}, {{0, 8, 0}, {0, 8, 0}}}", # 17: glaciers "{{{1, 8, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 1, 0}}}", # 18: golden rectangle! "{{{1, 8, 1}, {1, 2, 0}}, {{0, 8, 0}, {0, 8, 0}}}", # 19: fizzy spill "{{{1, 8, 1}, {1, 2, 1}}, {{1, 1, 0}, {0, 1, 1}}}", # 20: nested cabinets "{{{1, 1, 1}, {0, 8, 1}}, {{1, 2, 0}, {1, 1, 1}}}", # 21: (cross) "{{{1, 1, 1}, {0, 1, 0}}, {{0, 2, 0}, {1, 8, 0}}}", # 22: saw-tipped growth "{{{1, 1, 1}, {0, 1, 1}}, {{1, 2, 1}, {0, 1, 0}}}", # 23: curves in blocks growth "{{{1, 1, 1}, {0, 2, 0}}, {{0, 8, 0}, {0, 8, 0}}}", # 24: textured growth "{{{1, 1, 1}, {0, 2, 1}}, {{1, 8, 0}, {1, 2, 0}}}", # 25: (diamond growth) "{{{1, 1, 1}, {1, 8, 0}}, {{1, 2, 1}, {0, 1, 0}}}", # 26: coiled rope "{{{1, 2, 0}, {0, 8, 1}}, {{1, 8, 0}, {0, 1, 1}}}", # 27: (growth) "{{{1, 2, 0}, {0, 8, 1}}, {{1, 8, 0}, {0, 2, 1}}}", # 28: (square spiral) "{{{1, 2, 0}, {1, 2, 1}}, {{0, 1, 0}, {0, 1, 1}}}", # 29: loopy growth with holes "{{{1, 2, 1}, {0, 8, 1}}, {{1, 1, 0}, {0, 1, 0}}}", # 30: Langton's Ant drawn with squares "{{{1, 2, 1}, {0, 2, 0}}, {{0, 8, 1}, {1, 8, 0}}}", # 31: growth with curves and blocks "{{{1, 2, 1}, {0, 2, 0}}, {{0, 1, 0}, {1, 2, 1}}}", # 32: distracted spiral builder "{{{1, 2, 1}, {0, 2, 1}}, {{1, 1, 0}, {1, 1, 1}}}", # 33: cauliflower stalk (45 deg highway) "{{{1, 2, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 2, 0}}}", # 34: worm trails (eventually turns cyclic!) "{{{1, 2, 1}, {1, 1, 0}}, {{1, 1, 0}, {0, 1, 1}}}", # 35: eventually makes a two-way highway! "{{{1, 2, 1}, {1, 2, 0}}, {{0, 1, 0}, {0, 1, 0}}}", # 36: almost symmetric mould bloom "{{{1, 2, 1}, {1, 2, 0}}, {{0, 2, 0}, {1, 1, 1}}}", # 37: makes a 1 in 2 gradient highway "{{{1, 2, 1}, {1, 2, 1}}, {{1, 8, 1}, {0, 2, 0}}}", # 38: immediately makes a 1 in 3 highway "{{{0, 2, 1}, {1, 2, 1}}, {{0, 8, 2}, {0, 8, 0}}, {{1, 2, 2}, {1, 8, 0}}}", # 39: squares and diagonals growth "{{{1, 8, 1}, {0, 1, 0}}, {{0, 2, 2}, {1, 8, 0}}, {{1, 2, 1}, {1, 1, 0}}}", # 40: streak at approx. an 8.1 in 1 gradient "{{{1, 8, 1}, {0, 1, 2}}, {{0, 2, 2}, {1, 1, 1}}, {{1, 2, 1}, {1, 1, 0}}}", # 41: streak at approx. a 1.14 in 1 gradient "{{{1, 8, 1}, {1, 8, 1}}, {{1, 1, 0}, {0, 1, 2}}, {{0, 8, 1}, {1, 1, 1}}}", # 42: maze-like growth "{{{1, 8, 2}, {0, 2, 0}}, {{1, 8, 0}, {0, 2, 0}}, {{0, 8, 0}, {0, 8, 1}}}", # 43: growth by cornices "{{{1, 2, 0}, {0, 2, 2}}, {{0, 8, 0}, {0, 2, 0}}, {{0, 1, 1}, {1, 8, 0}}}", # 44: makes a 1 in 7 highway "{{{1, 2, 1}, {0, 8, 0}}, {{1, 2, 2}, {0, 1, 0}}, {{1, 8, 0}, {0, 8, 0}}}", # 45: makes a 4 in 1 highway # source: http://www.mathpuzzle.com/Turmite5.nb # via: http://www.mathpuzzle.com/26Mar03.html # "I wondered what would happen if a turmite could split as an action... say Left and Right. # In addition, I added the rule that when two turmites met, they annihilated each other. # Some interesting patterns came out from my initial study. My main interest is finding # turmites that will grow for a long time, then self-annihilate." "{{{1, 8, 0}, {1, 2, 1}}, {{0, 10, 0}, {0, 8, 1}}}", # 46: stops at 11 gens "{{{1, 8, 0}, {1, 2, 1}}, {{1, 10, 0}, {1, 8, 1}}}", # 47: stops at 12 gens "{{{1, 15, 0}, {0, 2, 1}}, {{0, 10, 0}, {0, 8, 1}}}", # 48: snowflake-like growth "{{{1, 2, 0}, {0, 15, 0}}}", # 49: blob growth "{{{1, 3, 0}, {0, 3, 0}}}", # 50: (spiral) - like SDSR-Loop on a macro level "{{{1, 3, 0}, {0, 1, 0}}}", # 51: (spiral) "{{{1, 10, 0}, {0, 1, 0}}}", # 52: snowflake-like growth "{{{1, 10, 1}, {0, 1, 1}}, {{0, 2, 0}, {0, 0, 0}}}", # 53: interesting square growth "{{{1, 10, 1}, {0, 5, 1}}, {{1, 2, 0}, {0, 8, 0}}}", # 54: interesting square growth "{{{1, 2, 0}, {0, 1, 1}}, {{1, 2, 0}, {0, 6, 0}}}", # 55: growth "{{{1, 2, 0}, {1, 1, 1}}, {{0, 2, 0}, {0, 11, 0}}}", # 56: wedge growth with internal snakes "{{{1, 2, 1}, {0, 2, 1}}, {{1, 15, 0}, {1, 8, 0}}}", # 57: divided square growth "{{{1, 2, 0}, {2, 8, 2}, {1, 1, 1}}, {{1, 1, 2}, {0, 2, 1}, {2, 8, 1}}, {{0, 11, 0}, {1, 1, 1}, {0, 2, 2}}}", # 58: semi-chaotic growth with spikes "{{{1, 2, 0}, {2, 8, 2}, {2, 1, 1}}, {{1, 1, 2}, {1, 1, 1}, {1, 8, 1}}, {{2, 10, 0}, {2, 8, 1}, {2, 8, 2}}}" # 59: halts after 204 gens (256 non-zero cells written) ] # N.B. the images in the demonstration project http://demonstrations.wolfram.com/Turmites/ # are mirrored - e.g. Langton's ant turns left instead of right. # (Also example #45 isn't easily accessed in the demonstration, you need to open both 'advanced' controls, # then type 45 in the top text edit box, then click in the bottom one.) # just some discoveries of my own, discovered through random search TimHuttonTurmiteLibrary = [ # One-turmite effects: "{{{1,2,1},{0,4,1}},{{1,1,0},{0,8,0}}}", # makes a period-12578 gradient 23 in 29 speed c/340 highway (what is the highest period highway?) "{{{0,2,1},{0,8,0}},{{1,8,1},{1,4,0}}}", # makes a period-68 (speed c/34) glider (what is the highest period glider?) # (or alternatively, what are the *slowest* highways and gliders?) "{{{1,4,1},{1,2,1}},{{1,8,0},{1,1,1}}}", # another ice-skater rule, makes H-fractal-like shapes "{{{1,1,1},{0,2,1}},{{0,2,1},{1,8,0}}}", # period-9 glider "{{{1,2,1},{0,8,1}},{{1,4,0},{1,8,0}}}", # another ice-skater "{{{1,4,1},{1,8,1}},{{1,4,0},{0,1,0}}}", # Langton's ant (rot 45) on a 1 background but maze-like on a 0 background "{{{0,2,1},{0,8,1}},{{1,1,0},{1,8,1}}}", # slow ice-skater makes furry shape "{{{1,8,0},{1,1,1}},{{1,8,0},{0,2,1}}}", # busy beaver (goes cyclic) <50k "{{{0,8,1},{1,8,1}},{{1,2,1},{0,2,0}}}", # interesting texture "{{{1,1,1},{0,1,0}},{{1,2,0},{1,2,1}}}", # period-17 1 in 3 gradient highway (but needs debris to get started...) "{{{0,2,1},{1,8,1}},{{1,4,0},{0,2,1}}}", # period-56 speed-28 horizontal highway "{{{1,8,0},{0,1,1}},{{1,2,0},{1,8,0}}}", # somewhat loose growth # Some two-turmite rules below: (ones that are dull with 1 turmite but fun with 2) # Guessing this behaviour may be quite common, because turmites alternate between black-and-white squares # on a checkerboard. To discover these I use a turmite testbed which includes a set of turmite pairs as # starting conditions. "{{{1,4,0},{0,1,1}},{{1,4,1},{0,2,0}}}", # loose loopy growth (but only works with two ants together, e.g. 2,2) "{{{0,1,1},{0,4,0}},{{1,2,0},{1,8,1}}}", # spiral growth on its own but changing density + structure with 2 turmites, e.g. 2,2 "{{{1,2,1},{1,1,0}},{{1,1,0},{0,2,1}}}", # extender on its own but mould v. aerials with 2, e.g. 2,3 "{{{1,1,1},{0,8,1}},{{1,8,0},{0,8,0}}}", # together they build a highway ] ''' We can scale any tumite by a factor of N: (need n_states+N new states) e.g. for the turmite: "{{{1,2,0},{0,1,0}}}", # normal binary counter "{{{1,2,1},{0,1,1}},{{0,1,0},{0,0,0}}}", # scale 2 binary counter (sparse version) (Takes twice as long.) "{{{1,2,1},{0,1,1}},{{0,1,2},{0,0,0}},{{0,1,0},{0,0,0}}}", # scale 3 binary counter, etc. (Takes three times as long.) Note that the state 1+ color 1+ transitions are never used if started on a zero background - we set them to {0,0,0} (die) simply to make this clear. Or you can step these cells. Or redraw them. e.g. for Langton's ant: "{{{1, 2, 0}, {0, 8, 0}}}", # normal Langton's ant "{{{1,2,1},{0,8,1}},{{0,1,0},{0,0,0}}}", # Langton's Ant at scale 2 (sparse version) (See also Ed Pegg Jr.'s rule #30.) This is a bit like Langton's original formulation of his ants, only using 2 colors instead of 3, and with states to keep track of when to turn instead of using color for this. We can rotate any turmites too: (need e.g. 2*n_states states for 45 degree rotation) e.g. for the binary counter: "{{{1,2,0},{0,1,0}}}", # normal binary counter "{{{1,1,1},{0,8,1}},{{0,2,0},{0,0,0}}}", # diagonal counter (turning right on off-steps) "{{{1,4,1},{0,2,1}},{{0,8,0},{0,0,0}}}", # diagonal counter (turning left on off-steps) e.g. for Langton's ant: "{{{1,2,0},{0,8,0}}}", # normal Langton's ant "{{{1,1,1},{0,4,1}},{{0,2,0},{0,0,0}}}", # Langton's ant at 45 degrees (turning right on off-steps) "{{{1,4,1},{0,1,1}},{{0,8,0},{0,0,0}}}", # Langton's ant at 45 degrees (turning left on off-steps) (These take twice as long as the normal versions.) "{{{1,1,1},{0,4,1}},{{0,2,2},{0,0,0}},{{0,1,0},{0,0,0}}}", # knight's move rotated "{{{1,1,1},{0,4,1}},{{0,1,2},{0,0,0}},{{0,2,0},{0,0,0}}}", # knight's move rotated v2 (These take three times as long.) We can increase the number of straight-ahead steps to achieve any angle of highway we want, e.g. "{{{1,1,1},{0,4,1}},{{0,2,2},{0,0,0}},{{0,1,3},{0,0,0}},{{0,1,0},{0,0,0}}}", # long knight's move rotated We can rotate twice, for fun: "{{{1,8,1},{0,2,1}},{{0,2,2},{0,0,0}},{{0,1,3},{0,0,0}},{{0,2,0},{0,0,0}}}", # rotated twice (expanded version) (same as scale 2 version) (These take four times as long.) "{{{1,8,1},{0,2,1}},{{0,2,2},{1,2,2}},{{0,2,0},{1,2,0}}}", # rotated twice (compact version) Note that with the compact version we have to walk over 'live' cells without changing them - we can't set those transitions to 'die'. This makes exactly the same pattern as Langtons Ant but takes 3 times as long. For turmites with more states, e.g.: "{{{1,8,0},{1,2,1}},{{0,2,0},{0,8,1}}}", # 11: framed computer art "{{{1,4,2},{1,1,3}},{{0,1,2},{0,4,3}},{{0,2,0},{0,0,0}},{{0,2,1},{0,0,0}}}", # framed computer art rotated # 2 states become 4 states for 45 degree rotation # (sparse version, turning right on off-steps: hence turns N becomes L,L->U,R->N,U->R) # here the new states are used as off-step storage of the old states: state 2 says I will become state 0, # state 3 says I will become state 1 Can we detect when a smaller version of a turmite is possible - can we apply it in reverse? 1=noturn, 2=right, 4=u-turn, 8=left ''' # http://bytes.com/topic/python/answers/25176-list-subsets get_subsets = lambda items: [[x for (pos,x) in zip(range(len(items)), items) if (2**pos) & switches] for switches in range(2**len(items))] example_spec = "{{{1, 8, 1}, {1, 8, 1}}, {{1, 2, 1}, {0, 1, 0}}}" # Generate a random rule, filtering out the most boring ones. # TODO: # - if turmite can get stuck in period-2 cycles then rule is bad (or might it avoid them?) # - (extending) if turmite has (c,2 (or 8),s) for state s and color c then will loop on the spot (unlikely to avoid?) ns = 2 nc = 2 while True: # (we break out if ok) example_spec = '{' for state in range(ns): if state > 0: example_spec += ',' example_spec += '{' for color in range(nc): if color > 0: example_spec += ',' new_state = random.randint(0,ns-1) new_color = random.randint(0,nc-1) dir_to_turn = [1,2,4,8][random.randint(0,3)] # (we don't consider splitting and dying here) example_spec += '{' + str(new_color) + "," + str(dir_to_turn) + "," + str(new_state) + '}' example_spec += '}' example_spec += '}' is_rule_acceptable = True action_table = eval(example_spec.replace('}',']').replace('{','[')) # will turmite zip off? if on color 0 with state s the turmite does (?,1,s) then rule is bad for state in range(ns): if action_table[state][0][1]==1 and action_table[state][0][2]==state: is_rule_acceptable = False # does Turmite change at least one color? changes_one = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] == color: changes_one = True if not changes_one: is_rule_acceptable = False # does Turmite ever turn? turmite_turns = False for state in range(ns): for color in range(nc): if not action_table[state][color][0] in [1,4]: # forward or u-turn turmite_turns = True if not turmite_turns: is_rule_acceptable = False # does turmite get stuck in any subset of states? for subset in get_subsets(range(ns)): if len(subset)==0 or len(subset)==ns: # (just an optimisation) continue leaves_subset = False for state in subset: for color in range(nc): if not action_table[state][color][2] in subset: leaves_subset = True if not leaves_subset: is_rule_acceptable = False break # (just an optimisation) # does turmite wobble on the spot? (u-turn that doesn't change color or state) for state in range(ns): for color in range(nc): if action_table[state][color][0]==color and action_table[state][color][1]==4 and action_table[state][color][2]==state: is_rule_acceptable = False # so was the rule acceptable, in the end? if is_rule_acceptable: break spec = golly.getstring( '''This script will create a Turmite CA for a given specification. Enter a number (1-59) for an example Turmite from Ed Pegg Jr.'s (extended) library. (see http://demonstrations.wolfram.com/Turmites/ or the code of this script) Otherwise enter a specification string: a curly-bracketed table of n_states rows and n_colors columns, where each entry is a triple of integers. The elements of each triple are: a: the new color of the square b: the direction(s) for the Turmite to turn (1=noturn, 2=right, 4=u-turn, 8=left) c: the new internal state of the Turmite Example: {{{1, 2, 0}, {0, 8, 0}}} (example pattern #1) Has 1 state and 2 colors. The triple {1,2,0} says: 1. set the color of the square to 1 2. turn right (2) 3. adopt state 0 (no change) and move forward one square This is Langton's Ant. Enter integer or string: (default is a random example)''', example_spec, 'Enter Turmite specification:') if spec.isdigit(): spec = EdPeggJrTurmiteLibrary[int(spec)-1] # (his demonstration project UI is 1-based) # convert the specification string into action_table[state][color] # (convert Mathematica code to Python and run eval) action_table = eval(spec.replace('}',']').replace('{','[')) n_states = len(action_table) n_colors = len(action_table[0]) # (N.B. The terminology 'state' here refers to the internal state of the finite # state machine that each Turmite is using, not the contents of each Golly # cell. We use the term 'color' to denote the symbol on the 2D 'tape'. The # actual 'Golly state' in this emulation of Turmites is given by the # "encoding" section below.) n_dirs=4 # TODO: check table is full and valid total_states = n_colors+n_colors*n_states*n_dirs # problem if we try to export more than 255 states if total_states > 255: golly.warn("Number of states required exceeds Golly's limit of 255.") golly.exit() # encoding: # (0-n_colors: empty square) def encode(c,s,d): # turmite on color c in state s facing direction d return n_colors + n_dirs*(n_states*c+s) + d # http://rightfootin.blogspot.com/2006/09/more-on-python-flatten.html def flatten(l, ltypes=(list, tuple)): ltype = type(l) l = list(l) i = 0 while i < len(l): while isinstance(l[i], ltypes): if not l[i]: l.pop(i) i -= 1 break else: l[i:i + 1] = l[i] i += 1 return ltype(l) # convert the string to a form we can embed in a filename spec_string = ''.join(map(str,map(lambda x:hex(x)[2:],flatten(action_table)))) # (ambiguous but we have to try something) # what direction would a turmite have been facing to end up here from direction # d if it turned t: would_have_been_facing[t][d] would_have_been_facing={ 1:[2,3,0,1], # no turn 2:[1,2,3,0], # right 4:[0,1,2,3], # u-turn 8:[3,0,1,2], # left } remap = [2,1,3,0] # N,E,S,W -> S,E,W,N not_arriving_from_here = [range(n_colors) for i in range(n_dirs)] # (we're going to modify them) for color in range(n_colors): for state in range(n_states): turnset = action_table[state][color][1] for turn in [1,2,4,8]: if not turn&turnset: # didn't turn this way for dir in range(n_dirs): facing = would_have_been_facing[turn][dir] not_arriving_from_here[dir] += [encode(color,state,facing)] #golly.warn(str(not_arriving_from_here)) # What states leave output_color behind? leaving_color_behind = {} for output_color in range(n_colors): leaving_color_behind[output_color] = [output_color] # (no turmite present) for state in range(n_states): for color in range(n_colors): if action_table[state][color][0]==output_color: leaving_color_behind[output_color] += [encode(color,state,d) for d in range(n_dirs)] # any direction tree = RuleTree(total_states,4) # A single turmite is entering this square: for s in range(n_states): # collect all the possibilities for a turmite to arrive in state s... inputs_sc = [] for state in range(n_states): for color in range(n_colors): if action_table[state][color][2]==s: inputs_sc += [(state,color)] # ...from direction dir for dir in range(n_dirs): inputs = [] for state,color in inputs_sc: turnset = action_table[state][color][1] # sum of all turns inputs += [encode(color,state,would_have_been_facing[turn][dir]) for turn in [1,2,4,8] if turn&turnset] if len(inputs)==0: continue for central_color in range(n_colors): # output the required transition ### AKT: this code causes syntax error in Python 2.3: ### transition_inputs = [leaving_color_behind[central_color]] + \ ### [ inputs if i==dir else not_arriving_from_here[i] for i in remap ] transition_inputs = [leaving_color_behind[central_color]] for i in remap: if i==dir: transition_inputs.append(inputs) else: transition_inputs.append(not_arriving_from_here[i]) transition_output = encode(central_color,s,opposite_dirs[dir]) tree.add_rule( transition_inputs, transition_output ) # default: square is left with no turmite present for output_color,inputs in leaving_color_behind.items(): tree.add_rule([inputs]+[range(total_states)]*4,output_color) rule_name = prefix+'_'+spec_string tree.write(golly.getdir('rules')+rule_name+'.tree') # Create some multi-colour icons so we can see what the turmite is doing # Andrew's ant drawing: (with added eyes (2) and anti-aliasing (3)) ant31x31 = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,1,2,2,1,1,1,2,2,1,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,2,2,1,1,1,2,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,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,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,1,1,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,1,1,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,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,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,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,1,0,0,0,3,1,1,1,3,0,0,0,1,1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,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,1,1,1,1,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,3,1,1,1,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,1,1,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,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] ant15x15 = [[0,0,0,0,1,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,1,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,2,1,2,0,0,0,0,0,0], [0,0,0,1,0,0,1,1,1,0,0,1,0,0,0], [0,0,0,0,1,0,0,1,0,0,1,0,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0,0,0,0,1,1,1,1,1,1,1,0,0,0,0], [0,0,0,1,0,0,0,1,0,0,0,1,0,0,0], [0,0,0,0,0,1,1,1,1,1,0,0,0,0,0], [0,0,0,0,1,0,0,1,0,0,1,0,0,0,0], [0,0,0,1,0,0,3,1,3,0,0,1,0,0,0], [0,0,0,0,0,0,1,1,1,0,0,0,0,0,0], [0,0,0,0,0,0,3,1,3,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] ant7x7 = [ [0,1,0,0,0,1,0], [0,0,2,1,2,0,0], [0,0,0,1,0,0,0], [0,1,1,1,1,1,0], [0,0,0,1,0,0,0], [0,1,1,1,1,1,0], [0,0,0,1,0,0,0] ] palette=[[0,0,0],[0,155,67],[127,0,255],[128,128,128],[185,184,96],[0,100,255],[196,255,254], [254,96,255],[126,125,21],[21,126,125],[255,116,116],[116,255,116],[116,116,255], [228,227,0],[28,255,27],[255,27,28],[0,228,227],[227,0,228],[27,28,255],[59,59,59], [234,195,176],[175,196,255],[171,194,68],[194,68,171],[68,171,194],[72,184,71],[184,71,72], [71,72,184],[169,255,188],[252,179,63],[63,252,179],[179,63,252],[80,9,0],[0,80,9],[9,0,80], [255,175,250],[199,134,213],[115,100,95],[188,163,0],[0,188,163],[163,0,188],[203,73,0], [0,203,73],[73,0,203],[94,189,0],[189,0,94]] eyes = (255,255,255) rotate4 = [ [[1,0],[0,1]], [[0,-1],[1,0]], [[-1,0],[0,-1]], [[0,1],[-1,0]] ] offset4 = [ [0,0], [1,0], [1,1], [0,1] ] pixels = [[palette[0] for column in range(total_states)*31] for row in range(53)] for state in range(n_states): for color in range(n_colors): for dir in range(n_dirs): bg_col = palette[color] fg_col = palette[state+n_colors] mid = [(f+b)/2 for f,b in zip(fg_col,bg_col)] for x in range(31): for y in range(31): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*30 row = rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*30 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant31x31[y][x]] for x in range(15): for y in range(15): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*14 row = 31 + rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*14 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant15x15[y][x]] for x in range(7): for y in range(7): column = (encode(color,state,dir)-1)*31 + rotate4[dir][0][0]*x + \ rotate4[dir][0][1]*y + offset4[dir][0]*6 row = 46 + rotate4[dir][1][0]*x + rotate4[dir][1][1]*y + offset4[dir][1]*6 pixels[row][column] = [bg_col,fg_col,eyes,mid][ant7x7[y][x]] for color in range(n_colors): bg_col = palette[color] for row in range(31): for column in range(31): pixels[row][(color-1)*31+column] = bg_col for row in range(15): for column in range(15): pixels[31+row][(color-1)*31+column] = bg_col for row in range(7): for column in range(7): pixels[46+row][(color-1)*31+column] = bg_col # use rule_name.tree and icon info to create rule_name.rule ConvertTreeToRule(rule_name, total_states, pixels) # switch to the new rule golly.new(rule_name+'-demo.rle') golly.setalgo('RuleLoader') golly.setrule(rule_name) golly.setcell(0,0,encode(0,0,0)) # start with a single turmite golly.show('Created '+rule_name+'.rule and selected that rule.') ''' # we make a turmite testbed so we don't miss interesting behaviour # create an area of random initial configuration with a few turmites for x in range(-300,-100): for y in range(-100,100): if x%50==0 and y%50==0: golly.setcell(x,y,n_colors) # start with a turmite facing N else: golly.setcell(x,y,random.randint(0,n_colors-1)) # create a totally random area (many turmites) for x in range(-200,-100): for y in range(200,300): golly.setcell(x,y,random.randint(0,total_states-1)) # also start with some pairs of turmites # (because of checkerboard rule, sometimes turmites work in pairs) pair_separation = 30 x=0 y=100 for t1 in range(n_colors,total_states): for t2 in range(n_colors,total_states): golly.setcell(x,y,t1) golly.setcell(x+1,y,t2) x += pair_separation x = 0 y += pair_separation # also start with a filled-in area of a color for color in range(n_colors): for x in range(color*200,color*200+100): for y in range(-50,50): if x==color*200+50 and y==0: golly.setcell(x,y,encode(color,0,0)) # start with a turmite facing N else: golly.setcell(x,y,color) golly.fit() ''' golly-2.5-src/Scripts/Python/bricklayer.py0000644000175100001440000000145712156145314015633 00000000000000# Based on bricklayer.py from PLife (http://plife.sourceforge.net/). from glife import * rule () # Life p22_half = pattern("2o$bo$bobo$2b2o3bo$6bob2o$5bo4bo$6bo3bo$7b3o!") p22 = p22_half + p22_half(26, 9, flip) gun22 = p22 + p22[1](-18, 11) gun154 = gun22[27] + gun22[5](49, 12, rcw) + gun22(5, 53, flip_y) p7_reflector = pattern(""" 2b2o5b2o$2b2o5bo$7bobo$7b2o$3b2o$3bobo$4bo3$13bo$10bo2b3o3b2o$3b5o 2b3o3bo2bo$b3obob3o4b2obobo$o4bo4b4obobo2b2o$2ob2ob4o3bobob2obo$ 4bobobobobo2bo2bobo$4bobobo2bo2bob3ob2o$3b2obob4o6bobo$7bo4b6o2b o$9bo2bo2bo4b2o$8b2o!""") pre_lom = pattern("2bo$2ob2o$2ob2o2$b2ob2o$b2ob2o$3bo!") all = gun154[210](-52, -38) + gun154[254](52, -38, flip_x) + p7_reflector(8, 23) \ + pre_lom(-3, 30) ### all.save ("bricklayer.lif", "David Bell, 29 Sep 2002") all.display("bricklayer") golly-2.5-src/Scripts/Python/density.py0000644000175100001440000000066412156145314015162 00000000000000# Calculates the density of live cells in the current pattern. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. # Updated to use exit command, Nov 2006. from glife import rect import golly as g bbox = rect( g.getrect() ) if bbox.empty: g.exit("The pattern is empty.") d = float( g.getpop() ) / ( float(bbox.wd) * float(bbox.ht) ) if d < 0.000001: g.show("Density = %.1e" % d) else: g.show("Density = %.6f" % d) golly-2.5-src/Scripts/Python/draw-lines.py0000644000175100001440000000764712156145314015560 00000000000000# Allow user to draw one or more straight lines by clicking end points. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jan 2011. import golly as g # ------------------------------------------------------------------------------ def drawline(x1, y1, x2, y2): # draw a line of cells from x1,y1 to x2,y2 using Bresenham's algorithm; # we also return the old cells in the line so we can erase line later oldcells = [] # note that x1,y1 has already been drawn # oldcells.append( (x1, y1, g.getcell(x1, y1)) ) # g.setcell(x1, y1, drawstate) if x1 == x2 and y1 == y2: g.update() return oldcells dx = x2 - x1 ax = abs(dx) * 2 sx = 1 if dx < 0: sx = -1 dy = y2 - y1 ay = abs(dy) * 2 sy = 1 if dy < 0: sy = -1 if ax > ay: d = ay - (ax / 2) while x1 != x2: oldcells.append( (x1, y1, g.getcell(x1, y1)) ) g.setcell(x1, y1, drawstate) if d >= 0: y1 += sy d -= ax x1 += sx d += ay else: d = ax - (ay / 2) while y1 != y2: oldcells.append( (x1, y1, g.getcell(x1, y1)) ) g.setcell(x1, y1, drawstate) if d >= 0: x1 += sx d -= ay y1 += sy d += ax oldcells.append( (x2, y2, g.getcell(x2, y2)) ) g.setcell(x2, y2, drawstate) g.update() return oldcells # ------------------------------------------------------------------------------ def eraseline(oldcells): for t in oldcells: x, y, s = t g.setcell(x, y, s) # ------------------------------------------------------------------------------ def drawlines(): global oldline, firstcell started = False oldmouse = "" while True: event = g.getevent() if event.startswith("click"): # event is a string like "click 10 20 left altctrlshift" evt, x, y, butt, mods = event.split() oldmouse = x + ' ' + y if started: # draw permanent line from start pos to end pos endx = int(x) endy = int(y) drawline(startx, starty, endx, endy) # this is also the start of another line startx = endx starty = endy oldline = [] firstcell = [] else: # start first line startx = int(x) starty = int(y) firstcell = [ startx, starty, g.getcell(startx, starty) ] g.setcell(startx, starty, drawstate) g.update() started = True g.show("Click where to end this line (and start another line)...") else: # event might be "" or "key m none" if len(event) > 0: g.doevent(event) mousepos = g.getxy() if started and len(mousepos) == 0: # erase old line if mouse is not over grid if len(oldline) > 0: eraseline(oldline) oldline = [] g.update() elif started and len(mousepos) > 0 and mousepos != oldmouse: # mouse has moved, so erase old line (if any) and draw new line if len(oldline) > 0: eraseline(oldline) x, y = mousepos.split() oldline = drawline(startx, starty, int(x), int(y)) oldmouse = mousepos # ------------------------------------------------------------------------------ g.show("Click where to start line...") oldcursor = g.getcursor() g.setcursor("Draw") drawstate = g.getoption("drawingstate") oldline = [] firstcell = [] # pos and state of the 1st cell clicked try: drawlines() finally: g.setcursor(oldcursor) if len(oldline) > 0: eraseline(oldline) if len(firstcell) > 0: x, y, s = firstcell g.setcell(x, y, s) golly-2.5-src/Scripts/Python/envelope.py0000644000175100001440000000767312156145314015327 00000000000000# Use multiple layers to create a history of the current pattern. # The "envelope" layer remembers all live cells. # Author: Andrew Trevorrow (andrew@trevorrow.com), December 2006. # Updated for better compatibility with envelope.pl, June 2007. # Updated to use new setcolors command, September 2008. import golly as g if g.empty(): g.exit("There is no pattern.") currindex = g.getlayer() startindex = 0 envindex = 0 startname = "starting pattern" envname = "envelope" if currindex > 1 and g.getname(currindex - 1) == startname \ and g.getname(currindex - 2) == envname : # continue from where we left off startindex = currindex - 1 envindex = currindex - 2 elif currindex + 2 < g.numlayers() \ and g.getname(currindex + 1) == startname \ and g.getname(currindex) == envname : # switch from envelope layer to current layer and continue currindex += 2 g.setlayer(currindex) startindex = currindex - 1 envindex = currindex - 2 elif currindex + 1 < g.numlayers() \ and g.getname(currindex) == startname \ and g.getname(currindex - 1) == envname : # switch from starting layer to current layer and continue currindex += 1 g.setlayer(currindex) startindex = currindex - 1 envindex = currindex - 2 else: # start a new envelope using pattern in current layer if g.numlayers() + 1 > g.maxlayers(): g.exit("You need to delete a couple of layers.") if g.numlayers() + 2 > g.maxlayers(): g.exit("You need to delete a layer.") # get current layer's starting pattern startpatt = g.getcells(g.getrect()) envindex = g.addlayer() # create layer for remembering all live cells g.setcolors([-1,100,100,100]) # set all states to darkish gray g.putcells(startpatt) # copy starting pattern into this layer startindex = g.addlayer() # create layer for starting pattern g.setcolors([-1,0,255,0]) # set all states to green g.putcells(startpatt) # copy starting pattern into this layer # move currindex to above the envelope and starting pattern g.movelayer(currindex, envindex) g.movelayer(envindex, startindex) currindex = startindex startindex = currindex - 1 envindex = currindex - 2 # name the starting and envelope layers so user can run script # again and continue from where it was stopped g.setname(startname, startindex) g.setname(envname, envindex) # ------------------------------------------------------------------------------ def envelope (): # draw stacked layers using same location and scale g.setoption("stacklayers", 1) g.show("Hit escape key to stop script...") while True: g.run(1) if g.empty(): g.show("Pattern died out.") break # copy current pattern to envelope layer; # we temporarily disable event checking so thumb scrolling # and other mouse events won't cause confusing changes currpatt = g.getcells(g.getrect()) g.check(0) g.setlayer(envindex) g.putcells(currpatt) g.setlayer(currindex) g.check(1) step = 1 exp = g.getstep() if exp > 0: step = g.getbase()**exp if int(g.getgen()) % step == 0: # display all 3 layers (envelope, start, current) g.update() # ------------------------------------------------------------------------------ # show status bar but hide layer & edit bars (faster, and avoids flashing) oldstatus = g.setoption("showstatusbar", True) oldlayerbar = g.setoption("showlayerbar", False) oldeditbar = g.setoption("showeditbar", False) try: envelope() finally: # this code is always executed, even after escape/error; # restore original state of status/layer/edit bars g.setoption("showstatusbar", oldstatus) g.setoption("showlayerbar", oldlayerbar) g.setoption("showeditbar", oldeditbar) golly-2.5-src/Scripts/Python/flood-fill.py0000644000175100001440000001106512156145314015527 00000000000000# Fill clicked region with current drawing state. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jan 2011. import golly as g from time import time # avoid an unbounded fill if g.empty(): if g.getwidth() == 0 or g.getheight() == 0: g.exit("You cannot fill an empty universe that is unbounded!") else: # set fill limits to the pattern's bounding box # (these will be extended below if the grid is bounded) r = g.getrect() minx = r[0] miny = r[1] maxx = minx + r[2] - 1 maxy = miny + r[3] - 1 # allow filling to extend to the edges of bounded grid if g.getwidth() > 0: minx = -int(g.getwidth()/2) maxx = minx + g.getwidth() - 1 if g.getheight() > 0: miny = -int(g.getheight()/2) maxy = miny + g.getheight() - 1 # ------------------------------------------------------------------------------ def checkneighbor(x, y, oldstate): # first check if x,y is outside fill limits if x < minx or x > maxx: return False if y < miny or y > maxy: return False return g.getcell(x, y) == oldstate # ------------------------------------------------------------------------------ def floodfill(): newstate = g.getoption("drawingstate") oldstate = newstate # wait for user to click a cell g.show("Click the region you wish to fill... (hit escape to abort)") while oldstate == newstate: event = g.getevent() if event.startswith("click"): # event is a string like "click 10 20 left none" evt, xstr, ystr, butt, mods = event.split() x = int(xstr) y = int(ystr) if x < minx or x > maxx or y < miny or y > maxy: # click is outside pattern's bounding box in unbounded universe g.warn("Click within the pattern's bounding box\n"+ "otherwise the fill will be unbounded.") else: # note that user might have changed drawing state newstate = g.getoption("drawingstate") oldstate = g.getcell(x, y) if oldstate == newstate: g.warn("The clicked cell must have a different state\n"+ "to the current drawing state.") else: g.doevent(event) # tell Golly to handle all further keyboard/mouse events g.getevent(False) # do flood fill starting with clicked cell g.show("Filling clicked region... (hit escape to stop)") clist = [ (x,y) ] g.setcell(x, y, newstate) oldsecs = time() while len(clist) > 0: # remove cell from start of clist x, y = clist.pop(0) newsecs = time() if newsecs - oldsecs >= 0.5: # show changed pattern every half second oldsecs = newsecs g.update() # check if any orthogonal neighboring cells are in oldstate if checkneighbor( x, y-1, oldstate): clist.append( (x, y-1) ) g.setcell( x, y-1, newstate) if checkneighbor( x, y+1, oldstate): clist.append( (x, y+1) ) g.setcell( x, y+1, newstate) if checkneighbor( x+1, y, oldstate): clist.append( (x+1, y) ) g.setcell( x+1, y, newstate) if checkneighbor( x-1, y, oldstate): clist.append( (x-1, y) ) g.setcell( x-1, y, newstate) # diagonal neighbors are more complicated because we don't # want to cross a diagonal line of live cells if checkneighbor( x+1, y+1, oldstate) and (g.getcell(x, y+1) == 0 or g.getcell(x+1, y) == 0): clist.append( (x+1, y+1) ) g.setcell( x+1, y+1, newstate) if checkneighbor( x+1, y-1, oldstate) and (g.getcell(x, y-1) == 0 or g.getcell(x+1, y) == 0): clist.append( (x+1, y-1) ) g.setcell( x+1, y-1, newstate) if checkneighbor( x-1, y+1, oldstate) and (g.getcell(x, y+1) == 0 or g.getcell(x-1, y) == 0): clist.append( (x-1, y+1) ) g.setcell( x-1, y+1, newstate) if checkneighbor( x-1, y-1, oldstate) and (g.getcell(x, y-1) == 0 or g.getcell(x-1, y) == 0): clist.append( (x-1, y-1) ) g.setcell( x-1, y-1, newstate) # ------------------------------------------------------------------------------ oldcursor = g.getcursor() g.setcursor("Draw") try: floodfill() finally: g.setcursor(oldcursor) g.show(" ") golly-2.5-src/Scripts/Python/goto_expression.py0000644000175100001440000003211712156145314016730 00000000000000# Go to a requested generation. The given generation can be: # # * an absolute number like 1,000,000 (commas are optional) # * a number relative to the current generation like +9 or -6 # * an expression like "17*(2^(3*143)+2^(2*3*27))" # * an expression starting with + or -, indicating a relative move # * any of the above preceded by "f" (fast). This wil set the base # step to 2 and provide less visual feedback of progress # # If the target generation is less than the current generation then # we go back to the starting generation (normally 0) and advance to # the target. # # If the input is preceded by F "fast" or q "quick" then we use the # algorithm of goto-fast.py, which sets the base to 2 and jumps by # powers of 2. # # Authors: # Original goto.py by Andrew Trevorrow and Dave Greene, April 2006. # Updated Sept-Oct 2006 -- XRLE support and reusable default value. # Updated April 2010 -- much faster, thanks to PM 2Ring. # goto-expression.py by Robert Munafo, using regexp expression # evaluation like Hypercalc (mrob.com/pub/perl/hypercalc.html) # 20111103 First stand-alone version of "expr.py" written as an # exercise to learn me some Python # 20111105 Add expr_2 using re.sub (a cleaner implementation) # 20120624 Remove whitespace before evaluating # 20130213 Move expr_2 code to "goto-expression.py" for Golly. # 20130214 Fix precedednce bugs, add expr_3 # 20130215 Remove redundant g.getstep and g.setstep calls. Full handling # of scientific notation and leading signs (like "300+-3") # # TODO: # Allow decimal point in EE notation, so "6.02e23" would work (right # now you have to do "602e21") # Make - and / associate left-to-right, so 100-10+1 gives 91 instead of 89 # Remove use of deprecated string.find and string.replace functions # Why is it much faster when you start from gen 0? For example, start # with puffer-train.rle, use this script to goto 10^100 then goto 2*10^100 # it's much faster if you start from gen 0 and go directly to 2*10^100 # Given that gofast saves and restores the base, should we use it always? # Note that patterns with a lot of period-P oscillators run more # efficiently when the base is set to P or a factor of P, so this # is not a simple decision. from glife import validint from time import time import golly as g import re # -------------------------------------------------------------------- # Regexp-based expression evaluator. The main loop contains match # cases for each type of operation, and performs one operation per # loop until there are none left to match. We use re.sub and pass # functions for the repl parameter. See: # http://docs.python.org/2/library/re.html#re.sub # http://docs.python.org/2/library/re.html#re.MatchObject.group p_whitespace = re.compile('[ \t]+') p_paren = re.compile('\((\d+)\)') p_parexp = re.compile('\((\d+[*/+-^][^()]*\d)\)') p_exp = re.compile('(\d+)\^(\d+)') p_mul = re.compile('(\d+)([*/])(n?\d+)') p_add = re.compile('(\d+)([-+])(n?\d+)') p_ee = re.compile('([.0-9]+)e([+-]?\d+)') p_mantissa = re.compile('^n?\d*\.?\d+$') p_leadn = re.compile('^n') p_digits = re.compile('^[+-]?\d+$') p_dot = re.compile('\.') p_plusminus = re.compile('([-+])([-+])') # erf = expression replace function def erf_paren(match): "Remove parentheses: (123) -> 123" a = match.group(1) return a # ee_approx - Python-like integer approximation of a number in scientific # notation. The mantissa and exponent are given separately and # may be either numeric or string. (the caller is expected to # generate them separately, e.g. by using a regexp to match # parts of a string). The exponent must be an integer or an # equivalent string; more flexibility is available for the # mantissa (see examples) # All of the following examples evaluate to True: # ee_approx(2.0, 20) == 2*10**20 # ee_approx('2.', 20) == 2*10**20 # ee_approx('12000', -3) == 12 # ee_approx(12e+03, '-3') == 12 # The following return 0 because of an error: # ee_approx(2.3, 4.0) # Exponent may not be a float # ee_approx(6.02, '23.') # Exponent may not contain '.' # The following evaluate to False because of roundoff error: # ee_approx('.02', 22) == 2*10**20 def ee_approx(m, e): "Integer approximation of m*10^e given m and e" m = str(m) # Make sure mantissa matches its pattern if p_dot.search(m): m = m + '0' else: m = m + '.0' if not p_mantissa.search(m): return 0 m = float(m) m = int(m * float(2**64) * (1.0+2.0**-52.0)) e = str(e) if not p_digits.search(e): return 0 e = int(e) if e<0: e = 10**(-e) return m/(e*2**64) else: e = 10**e return (m*e)/(2**64) def erf_ee(match): "Scientific notation: 1.2e5 -> 120000" a = match.group(1) b = match.group(2) return str(ee_approx(a,b)) def erf_exp(match): "Exponentiation: 2^24 -> 16777216" a = int(match.group(1)) b = int(match.group(2)) return str(a**b) def erf_mul(match): "Multiplication and (integer) division" a = int(match.group(1)) # match.group(2) is operator b = match.group(3) # Check for leading 'n' if p_leadn.search(b): b = p_leadn.sub('-', b) b = int(b) if(match.group(2) == '*'): return str(a*b) else: return str(a//b) def erf_add(match): "Addition and subtraction" a = int(match.group(1)) # match.group(2) is operator b = match.group(3) # Check for leading 'n' if p_leadn.search(b): b = p_leadn.sub('-', b) b = int(b) if(match.group(2) == '+'): return str(a+b) else: return str(a-b) """ Evaluate an expression without parentheses, like 2+3*4^5 = 3074 The precedence is: If we match something like "6.02e23", expand it Else if we match something like "4^5", expand it Else if we match something like "3*17", expand it Else if we match something like "2+456", expand it Else return It loops in all cases but the last """ def expr_2(p): going = 1 # print 'e2:', p while going: if p_ee.search(p): p = p_ee.sub(erf_ee, p, count=1) # print 'e2 ee, got:', p elif p_exp.search(p): p = p_exp.sub(erf_exp, p, count=1) # print 'e2 exp, got:', p elif p_mul.search(p): p = p_mul.sub(erf_mul, p, count=1) # print 'e2 mul, got:', p elif p_add.search(p): p = p_add.sub(erf_add, p, count=1) # print 'e2 add, got:', p else: # print 'e2 done' going = 0 # print 'e2 return:', p return p def erf_e2(match): "Parenthesized bare expression" a = expr_2(match.group(1)) return str(a) def erf_plusminus(match): "--, -+, +-, or ++" if match.group(2) == '-': return match.group(1)+'n' return match.group(1) """ Evaluate an expression possibly including parenthesized sub-expressions and numbers in scientific notation, like 17*4^((7^2-3)*6^2+2e6)+602e21 The precedence is: If we match something like "6.02e23", expand it Else if we match something like "(3+4*5)", expand it using expr_2 Else if we match something like "(23456)", remove the parens Else expand the whole string using expr_2 and return It loops in all cases but the last """ def expr_3(p): p = p_whitespace.sub('', p) if p_plusminus.search(p): p = p_plusminus.sub(erf_plusminus, p) going = 1 while going: if p_ee.search(p): p = p_ee.sub(erf_ee, p, count=1) elif p_parexp.search(p): p = p_parexp.sub(erf_e2, p, count=1) elif p_paren.search(p): p = p_paren.sub(erf_paren, p, count=1) else: p = expr_2(p) going = 0 return p # -------------------------------------------------------------------- """ gt_setup computes how many generations to move forwards. If we need to move backwards, it rewinds as far as possible, then returns the number of generations we need to move forwards. """ def gt_setup(gen): currgen = int(g.getgen()) # Remove leading '+' or '-' if any, and convert rest to int or long if gen[0] == '+': n = int(gen[1:]) newgen = currgen + n elif gen[0] == '-': n = int(gen[1:]) if currgen > n: newgen = currgen - n else: newgen = 0 else: newgen = int(gen) if newgen < currgen: # try to go back to starting gen (not necessarily 0) and # then forwards to newgen; note that reset() also restores # algorithm and/or rule, so too bad if user changed those # after the starting info was saved; # first save current location and scale midx, midy = g.getpos() mag = g.getmag() g.reset() # restore location and scale g.setpos(midx, midy) g.setmag(mag) # current gen might be > 0 if user loaded a pattern file # that set the gen count currgen = int(g.getgen()) if newgen < currgen: g.error("Can't go back any further; pattern was saved " + "at generation " + str(currgen) + ".") return 0 return newgen - currgen elif newgen > currgen: return newgen - currgen else: return 0 # -------------------------------------------------------------------- def intbase(n, b): # convert integer n >= 0 to a base b digit list (thanks to PM 2Ring) digits = [] while n > 0: digits += [n % b] n //= b return digits or [0] def goto(newgen, delay): g.show("goto running, hit escape to abort...") oldsecs = time() # before stepping we advance by 1 generation, for two reasons: # 1. if we're at the starting gen then the *current* step size # will be saved (and restored upon Reset/Undo) rather than a # possibly very large step size # 2. it increases the chances the user will see updates and so # get some idea of how long the script will take to finish # (otherwise if the base is 10 and a gen like 1,000,000,000 # is given then only a single step() of 10^9 would be done) if delay <= 1.0: g.run(1) newgen -= 1 # use fast stepping (thanks to PM 2Ring) for i, d in enumerate(intbase(newgen, g.getbase())): if d > 0: g.setstep(i) for j in xrange(d): if g.empty(): g.show("Pattern is empty.") return g.step() newsecs = time() if newsecs - oldsecs >= delay: # time to do an update? oldsecs = newsecs g.update() g.show("") # -------------------------------------------------------------------- # This is the "fast goto" algorithm from goto-fast.py that uses # binary stepsizes and does not do that initial step by 1 generation. def intbits(n): ''' Convert integer n to a bit list ''' bits = [] while n: bits += [n & 1] n >>= 1 return bits def gofast(newgen, delay): ''' Fast goto ''' #Save current settings oldbase = g.getbase() # oldhash = g.setoption("hashing", True) g.show('gofast running, hit escape to abort') oldsecs = time() #Advance by binary powers, to maximize advantage of hashing g.setbase(2) for i, b in enumerate(intbits(newgen)): if b: g.setstep(i) g.step() g.dokey(g.getkey()) newsecs = time() if newsecs - oldsecs >= delay: # do an update every sec oldsecs = newsecs g.update() if g.empty(): break g.show('') #Restore settings # g.setoption("hashing", oldhash) g.setbase(oldbase) # -------------------------------------------------------------------- def savegen(filename, gen): try: f = open(filename, 'w') f.write(gen) f.close() except: g.warn("Unable to save given gen in file:\n" + filename) # -------------------------------------------------------------------- # use same file name as in goto.pl GotoINIFileName = g.getdir("data") + "goto.ini" previousgen = "" try: f = open(GotoINIFileName, 'r') previousgen = f.readline() f.close() if not validint(previousgen): previousgen = "" except: # should only happen 1st time (GotoINIFileName doesn't exist) pass gen = g.getstring("Enter the desired generation number as an\n" + "expression, prepend -/+ for relative\n" + "move back/forwards, prepend f to use faster\n" "powers-of-2 steps:", previousgen, "Go to generation") # Evaluate the expression. This leaves leading "f" and/or "+/-" # intact. gen = expr_3(gen) # Find out if they want to get there quickly # %%% TODO: Use re instead of string.find and string.replace (which are # deprecated in later versions of Python) fastmode = 0 if(gen.find("f") == 0): gen = gen.replace("f","") fastmode = 1 if len(gen) == 0: g.exit() elif gen == "+" or gen == "-": # clear the default savegen(GotoINIFileName, "") elif not validint(gen): g.exit('Sorry, but "' + gen + '" is not a valid integer.') else: # best to save given gen now in case user aborts script savegen(GotoINIFileName, gen) oldstep = g.getstep() # %%% TODO: Use re instead of string.replace to remove the commas newgen = gt_setup(gen.replace(",","")) if newgen > 0: if fastmode: gofast(newgen, 10.0) else: goto(newgen, 1.0) g.setstep(oldstep) golly-2.5-src/Scripts/Python/goto.py0000644000175100001440000001057112156145314014451 00000000000000# Go to a requested generation. The given generation can be an # absolute number like 1,000,000 (commas are optional) or a number # relative to the current generation like +9 or -6. If the target # generation is less than the current generation then we go back # to the starting generation (normally 0) and advance to the target. # Authors: Andrew Trevorrow and Dave Greene, April 2006. # Updated Sept-Oct 2006 -- XRLE support and reusable default value. # Updated April 2010 -- much faster, thanks to PM 2Ring. # Save and restore step setting after PM 2Ring algorithm (Munafo) from glife import validint from time import time import golly as g # -------------------------------------------------------------------- def intbase(n, b): # convert integer n >= 0 to a base b digit list (thanks to PM 2Ring) digits = [] while n > 0: digits += [n % b] n //= b return digits or [0] # -------------------------------------------------------------------- def goto(gen): currgen = int(g.getgen()) if gen[0] == '+': n = int(gen[1:]) newgen = currgen + n elif gen[0] == '-': n = int(gen[1:]) if currgen > n: newgen = currgen - n else: newgen = 0 else: newgen = int(gen) if newgen < currgen: # try to go back to starting gen (not necessarily 0) and # then forwards to newgen; note that reset() also restores # algorithm and/or rule, so too bad if user changed those # after the starting info was saved; # first save current location and scale midx, midy = g.getpos() mag = g.getmag() g.reset() # restore location and scale g.setpos(midx, midy) g.setmag(mag) # current gen might be > 0 if user loaded a pattern file # that set the gen count currgen = int(g.getgen()) if newgen < currgen: g.error("Can't go back any further; pattern was saved " + "at generation " + str(currgen) + ".") return if newgen == currgen: return g.show("Hit escape to abort...") oldsecs = time() # before stepping we advance by 1 generation, for two reasons: # 1. if we're at the starting gen then the *current* step size # will be saved (and restored upon Reset/Undo) rather than a # possibly very large step size # 2. it increases the chances the user will see updates and so # get some idea of how long the script will take to finish # (otherwise if the base is 10 and a gen like 1,000,000,000 # is given then only a single step() of 10^9 would be done) g.run(1) currgen += 1 # use fast stepping (thanks to PM 2Ring) oldstep = g.getstep() for i, d in enumerate(intbase(newgen - currgen, g.getbase())): if d > 0: g.setstep(i) for j in xrange(d): if g.empty(): g.show("Pattern is empty.") return g.step() newsecs = time() if newsecs - oldsecs >= 1.0: # do an update every sec oldsecs = newsecs g.update() g.setstep(oldstep) g.show("") # -------------------------------------------------------------------- def savegen(filename, gen): try: f = open(filename, 'w') f.write(gen) f.close() except: g.warn("Unable to save given gen in file:\n" + filename) # -------------------------------------------------------------------- # use same file name as in goto.pl GotoINIFileName = g.getdir("data") + "goto.ini" previousgen = "" try: f = open(GotoINIFileName, 'r') previousgen = f.readline() f.close() if not validint(previousgen): previousgen = "" except: # should only happen 1st time (GotoINIFileName doesn't exist) pass gen = g.getstring("Enter the desired generation number,\n" + "or -n/+n to go back/forwards by n:", previousgen, "Go to generation") if len(gen) == 0: g.exit() elif gen == "+" or gen == "-": # clear the default savegen(GotoINIFileName, "") elif not validint(gen): g.exit('Sorry, but "' + gen + '" is not a valid integer.') else: # best to save given gen now in case user aborts script savegen(GotoINIFileName, gen) oldstep = g.getstep() goto(gen.replace(",","")) g.setstep(oldstep) golly-2.5-src/Scripts/Python/gun-demo.py0000644000175100001440000000252312156145314015212 00000000000000# Glider guns used in this script are 'aligned', which means gliders start in the # origin and go SE. # Based on gun_demo.py from PLife (http://plife.sourceforge.net/). from glife.base import * from glife.gun24 import * from glife.gun30 import * from glife.gun46 import * rule () # Life def mirror_gun (glider_gun): """mirror an 'aligned' glider gun and preserve its timing""" return glider_gun[2] (-1, 0, swap_xy) def compose_lwss_gun (glider_gun, A = -1, B = -1, C = -1): """construct an lwss gun using 3 copies of an 'aligned' glider gun. A, B and C are distances from the glider collision point to NE, NW and SW guns respectively""" if (A < 0): A = 40 if (B < 0): B = A; if (C < 0): C = A; m = min (A, B, C) a = A - m b = B - m c = C - m return \ glider_gun[4 * a] ( A, -A - 3, flip_x) + \ glider_gun[4 * b] (-B + 2, -B + 1) + \ glider_gun[4 * c + 1] (-C + 6, C, flip_y) lwss_eater = eater (4, 2, swap_xy) all = \ compose_lwss_gun (mirror_gun (gun24), 12, 11, 12) (0, -100) + lwss_eater (100, -100) + \ compose_lwss_gun (gun24, 11, 13, 4) + lwss_eater (100, 0) + \ compose_lwss_gun (gun30, 13, 11, 4) (0, 70) + lwss_eater (100, 70) + \ compose_lwss_gun (gun46, 22, 13, 3) (0, 130) + lwss_eater (100, 130) all.display ("gun-demo") golly-2.5-src/Scripts/Python/heisenburp.py0000644000175100001440000005727512156145314015661 00000000000000# Stable pseudo-Heisenburp device. # Show several views of a multi-stage signal-processing circuit, # optionally using Golly 1.2+'s layer-cloning system. # Author: Dave Greene, 27 February 2007. # Latest changes: # - corrected timing of signal-tracking selection highlight # - switched to three spaces per indent # - replaced long instruction message with Help note # - added rule() to be sure to run in the right universe (B3/S23) # - removed "x = ..." lines from pattern strings from glife import getstring, validint from time import sleep import os import golly as g from glife import * from string import * import sys def burp(): test_signal=pattern(""" 40bo$41bo$39b3o17$40bo4bo4bo4bo4bo$41bo4bo4bo4bo4bo$39b3o2b3o2b3o2b3o 2b3o3$40bo4bo4bo4bo4bo$41bo4bo4bo4bo4bo$39b3o2b3o2b3o2b3o2b3o3$40bo4bo 4bo4bo4bo$41bo4bo4bo4bo4bo$39b3o2b3o2b3o2b3o2b3o3$40bo4bo4bo4bo4bo$41b o4bo4bo4bo4bo$39b3o2b3o2b3o2b3o2b3o3$bo38bo4bo4bo4bo4bo18bo$2bo38bo4bo 4bo4bo4bo18bo$3o36b3o2b3o2b3o2b3o2b3o16b3o37$40bo$41bo$39b3o!""") prepare_burp() ticks=0 tickstep=5 last_signal=-99999 viewport_speed=16 sel_speed=0.0 delta_sel=0.0 delay=-1.0 run_flag=False ch="" selx=600.0 sely=365.0 place_signal=3 helpstring="""Use ENTER and SPACE to run or halt the pattern; use + and - to change the step size or delay value; use arrow keys and mouse tools to pan and zoom in any pane; T toggles between a tiled view and a single-pane view; S creates another signal fleet near the detection mechanism; R resets the Heisenburp device to its initial state; Q quits out of the script and restores original settings.""" instr="Press H for help. " g.show(instr + str(tickstep)) g.select([selx,sely,50,50]) # keyboard handling while ch<>"q": if place_signal>0: if ticks-last_signal>1846: test_signal.put(-150,60) last_signal=ticks place_signal-=1 if place_signal>0 and run_flag==True: show_status_text("Next signal placement in " \ + str(1847 - ticks + last_signal) + " ticks. " + instr, delay, tickstep) else: show_status_text(instr,delay,tickstep) event = g.getevent() if event.startswith("key"): evt, ch, mods = event.split() else: ch = "" if ch=="r": prepare_burp() ticks=0 last_signal=-99999 viewport_speed=16 sel_speed=0 run_flag=False selx=600.0 sely=365.0 place_signal=3 g.select([selx,sely,50,50]) elif ch=="h": g.note(helpstring) elif ch=="t": g.setoption("tilelayers",1-g.getoption("tilelayers")) elif ch=="=" or ch=="+": if delay>.01: delay/=2 elif delay==.01: delay=-1 else: if tickstep==1: tickstep=3 elif tickstep<250: tickstep=(tickstep-1)*2+1 elif ch=="-" or ch=="_": if delay==-1: if tickstep==1: delay=.01 else: if tickstep==3: tickstep=1 else: tickstep=(tickstep-1)/2+1 else: if delay<1: delay*=2 elif ch=="space": run_flag=False elif ch=="return": run_flag=not run_flag elif ch=="s": place_signal+=1 else: # just pass any other keyboard/mouse event through to Golly g.doevent(event) # generation and selection speed handling if ch=="space" or run_flag==True: g.run(tickstep) currlayer = g.getlayer() if currlayer != 4: # user has switched layer so temporarily change it back # so we only change location of bottom right layer g.check(False) g.setlayer(4) x, y = getposint() oldticks=ticks ticks+=tickstep delta_view=int(ticks/viewport_speed) - int(oldticks/viewport_speed) if delta_view <> 0: # assumes diagonal motion for now setposint(x + delta_view, y + delta_view) sel = g.getselrect() if len(sel)<>0: x, y, w, h = sel if int(selx)<>x: # user changed selection # prepare to move new selection instead (!?!) # -- use floating-point selx, sely to account for fractional speeds selx=x sely=y else: selx+=sel_speed*tickstep sely+=sel_speed*tickstep g.select([selx, sely, w, h]) else: g.select([selx, sely, 50, 50]) if currlayer != 4: g.setlayer(currlayer) g.check(True) # change viewport speed at appropriate times to follow the action if oldticks<4570 and ticks>=4570: sel_speed=.666667 # one-time correction to catch up with the signal at high sim speeds g.select([600+(ticks-4570)*1.5, 365+(ticks-4570)*1.5, w, h]) if selx>2125: sel_speed=0 g.select([2125, sely+2125-selx, w, h]) if oldticks<4750 and ticks>=4750: viewport_speed=1.5 if oldticks<6125 and ticks>=6125: viewport_speed=16 if oldticks>=11995: viewport_speed=99999.9 # stop automatically after the last signal passes through the device if oldticks - last_signal<8705 and ticks - last_signal>=8705: run_flag=False if run_flag==True and delay>0: sleep(delay) g.update() # ----------------------------------------------------- def prepare_burp(): highway_robber=pattern(""" 143bo$143b3o$146bo$145b2o2$126bo42bo$126b3o38b3o$129bo36bo$128b2o11b2o 23b2o7b2o$141b2o32bo$108bo64bobo$108b3o6b2o54b2o$111bo5b2o$110b2o3$ 111b2o$111b2o3b2o$116b2o35b2o23bo$154bo22bobo$151b3o8b2o14bo$151bo11bo $98bo7bo53b3o$86bo11b3o5b3o51bo$84b3o14bo7bo32b2o$68bo14bo16b2o6b2o32b obo30b2o$68b3o12b2o59bo30bobo$71bo72b2o31bo$70b2o105b2o$159bob2o$159b 2obo$71b2o$71b2o17b2o76b2o$90b2o76b2o5$104b2o$87b2o14bobo$87bo15bo74b 2o$88b3o11b2o74bo$90bo85bobo$84b2o90b2o$84bo$85b3o$87bo2$158b2o$159bo$ 68b2o89bobo$67bobo90b2o$67bo25b2o$66b2o25bo$74b2o15bobo$74b2o15b2o98b 2o6bo$187bobo2bo4b3o$185b3ob2o5bo$184bo11b2o$185b3ob2o$177b2o8bob2o$ 177b2o2$161b2o32b2o3b2o$161b2o32b2o3b2o$153b2o$88b2o2b2ob2o57bo18b2ob 2o$73b2o13bobo2bobo58bobo16b2obo$72bobo16b2o3bo58b2o21bo26bo$72bo19bob 2o76bob5o25bobo$71b2o16bo2bobo77b2o31bo$88bobobobo80b2o$89b2ob2o82bo$ 173b3o$173bo33bo$171bobo31b3o$171b2o31bo$187b2o14bobo$187b2o15bo$83b2o $83b2o$202b2o$202b2o2$175b2o$175b2o$72b2o123b2o$73bo19b2o102bo$73bobo 17bo76b2o26b3o$74b2o15bobo60b2o14b2o28bo$86bo4b2o62bo$85bobo64b3o$54bo 30bobo64bo$54b3o17b2o10bo$57bo15bobo$56b2o15bo116b2o$72b2o116bo$36b2o 49b2o102b3o$29b2o5b2o49bo105bo$29b2o57b3o6bo$90bo4b3o$94bo$31b2o17b2o 29b2o11b2o14b2o$31b2o17bo30b2o27b2o$25b2o21bobo$25b2o21b2o$116b2o$116b 2o36b2o$112b2o41bo$112b2o41bobo$156b2o$56b2o122b2o$56b2o11b2o109b2o$ 69bo47b2o$70b3o44b2o$72bo2$22bo$22b3o55b2o96b2o$25bo53bobo96bo$24b2o 47b2o4bo99b3o$73b2o3b2o101bo$179b2o$76b4o99bo$75bo3bo97bobo$75b2o100b 2o$53b2o33bo22b2o$19b2o32b2o33b3o20bo$20bo70bo20b3o$20bobo67b2o22bo44b o$21b2o136b3o$162bo$115bo45b2o$35b2o28b2o46b3o$35bobo27b2o45bo$37bo41b 2o6b2o23b2o$37b2o40b2o6bo2b2o$83b2o3b2obo$83b2o4bo89b2o$17bob2o68bo89b o$17b2obo67b2obob2o18b2o62bobo$87bo2b2ob2o18bobo61b2o$26b2o60bo26bo$ 26b2o33b2o26b3ob2o20b2o$60bo2bo27bobo66b2o$61bobo29bo66b2o15b2o$62bo 29b2ob2o80bobo$94bobo82bo$94bo84b2o$93b2o3$160b2o$160bo$158bobo$158b2o 2$16bo$16b3o$19bo33bo121b2obo$18b2o33b3o53b2o64bob2o$56bo52b2o$11bo43b obo110b2o$11b3o42bo111b2o$14bo123bo$13b2o121b3o$57b2o19bo56bo$57b2o17b 3o19b2o20bo14b2o$75bo23bo19bobo$75b2o22bobo17bobo$100b2o15bobobobo34b 2o$10b2o19b2o79bo4b2o3b2o10bo24bo$10b2o19b2o47b2o29bobo19bobo23bobo$ 80b2o29bobo19bobo24b2o$4bo95b2o10bo21bo4b2o$4b3o25b2o65bobo20b2o15bobo $2o5bo24bo57b2o7bo21bobo17bo$bo4b2o25b3o54bo7b2o21bo19b2o36bo$bobo31bo 52bobo22b2o5b2o55b3o$2b2o29b2o53b2o23bo62bo$33bo17b2o61b3o28b2o29b2o$ 31bobo4bo11bobo63bo28bo$31b2o3b3o11bo92bobo$35bo13b2o92b2o$35b2o94b2o$ 61b2o68b2o$61b2o$b2o178b2o$b2o178bo$36b2o141bobo$36b2o141b2o3$27b2o37b 2o97b2o$27b2o36bobo51b2o43bobo$65bo54bo43bo$64b2o54bobo40b2o$121b2o2$ 181b2obo$181bob2o2$40bo133b2o$38b3o133b2o$37bo$37b2o$138b2o$138b2o$42b 2o$42b2o78b2o$122b2o$114b2o$52b2o61bo18b2ob2o$52bo62bobo16b2obo$50bobo 63b2o21bo$50b2o81bob5o$13b2o118b2o$12bobo121b2o$12bo124bo$11b2o99bobo 19b3o$112b2obo18bo$23b2o90b3o$23b2o87b2o4bo$112bob5o$114bo$113bo3b2o$ 108bo3bo3bobo$106b3o3b2o3bo$105bo$28b2o75b2o29b2o39b2o$27bobo106b2o38b o2bo$27bo149b2o$26b2o2$131b2o$131b2o$135b2o$14b2o119b2o$14b2o35bo$49b 3o$48bo80b2o$48b2o63b2o14b2o$79bo33bo$68b2o7b3o34b3o$69bo6bo39bo$69bob o4b2o$70b2o$109b2o$109bobo$111bo$111b2o7$103b2o$103bo$104b3o$106bo$13b o19b2o$12bobo10b2o6bo5b2o41b2o$11bo2bo10bo8b3obobo41bo$12b2o9bobo10bob o7b2o28b2obo3b3o$23b2o12b2o7b2o28b2ob4o2bo$82bo$64b2o6b2o2b2ob2o$63bob o6bo4bobo$63bo9b4o2bo$62b2o7bobo2bobo$71b2o4bo!""") connecting_neck=pattern(""" 24bo$22b3o$21bo$21b2o$6b2o$7bo$7bobo$8b2o10bo$19bobo$19bobo$20bo4b2o$ 8b2o15bobo$7bobo17bo$7bo19b2o$6b2o6$17b2o$17b2o7$23b2ob2o$22bobobobo$ 5b2o16bo2bobo$6bo19bob2o$6bobo16b2o3bo$7b2o13bobo2bobo$22b2o2b2ob2o11$ 8b2o15b2o$8b2o15bobo$2o25bo$bo25b2o$bobo$2b2o4$21bo107bo$19b3o106bobo$ 18bo109bobo$18b2o106b3ob2o$24bo100bo$22b3o12bo84bo2b4ob2o$21bo15b3o82b 3o3bob2o$21b2o17bo84bo$39b2o83b2o26b2o$152bo$150bobo$150b2o2$24b2o$5b 2o17b2o76bo$5b2o95b3o6b2o$105bo5b2o41b2obo$104b2o48bob2o$4b2o$5bo141b 2o$2b3o12b2o86b2o40b2o$2bo14bo16b2o6b2o61b2o3b2o$18b3o14bo7bo66b2o$20b o11b3o5b3o$32bo7bo$78bo51b2o3b2o$76b3o13bo38bo3bo$75bo16b3o33b3o5b3o$ 50b2o23b2o18bo32bo9bo$45b2o3b2o42b2o42bobo$45b2o92b2o3$44b2o76b2o$45bo 5b2o69b2o$42b3o6b2o104b2o$42bo41b2o71bo$84b2o69bobo$61b2o92b2o$60bobo 62bo$60bo62b3o$59b2o10b2o49bo$72bo48bobo$69b3o9b2o39bo43b2o$69bo11bo 19b2o56b2o6bo$82bo17bobo56bo6bo$81b2o17bo19b2o35bobo6b2o$99b2o19b2o35b 2o$116b2o$116bo$117b3o24b2o$119bo23bobo$143bo25b2o$142b2o25b2o4$146b2o $145bobo$145bo4b2o$144b2o5bo$148b3o5bo$148bo6bobo$156bo!""") transmitter2c3=pattern(""" 180b2o$180b2o$219bo$219b3o$178b2o42bo$116bo61b2o41b2o$115bobo47b2o99b 2o14bo$116bo49bo74b2o24bo14b3o$166bobo73bo13b2o6b3o18bo$167b2o73bobo 11b2o6bo19b2o12bo$110b2o51b2o78b2o53b3o$110b2o23b2o26b2o136bo$102b2o 31bo164b2o$103bo29bobo$103bobo27b2o$104b2o4b2o$110b2o162b2o$274b2o$ 144b2o30b2o$102b2o40bo31b2o$102bo39bobo$104bob2o34b2o43b2o144b2o$103b 2ob2o78bo2bo143b2o$124b2o60bobo23b2o57b2o$103b2ob2o16b2o61bo20bo3b2o 57bo20b2o$104bobo100bobo26b2o14b2o3b2o13bo20bo$104bobo99bobo21b2o5bo 15bo3bo13b2o17b3o61b2o$105bo100bo23bobob3o13b3o5b3o29bo63b2o5b2o$205b 2o16b2o7bobo15bo9bo100b2o$223b2o7b2o152b2o6bo$169b2o125b2o84bobo2bo4b 3o$169b2o124bobo61b2o19b3ob2o5bo$295bo63b2o18bo11b2o$294b2o69b2o13b3ob 2o$365b2o15bob2o$131b2o151bo$131b2o149b3o12b2o$281bo16bo91b2o3b2o$271b 2o8b2o12b3o92b2o3b2o$272bo22bo$272bobo27b2o30b2o$273b2o28bo17b2o11b2o$ 39bo82bo136bo27b2o11b3o19bo77bo$38bobo79b3o136b3o25b2o11bo18b3o77bobo$ 39bo79bo142bo56bo80bo$108bo10b2o140b2o$37b5o65bobo228b2o$37bo4bo64bobo 177b2o50bo28b2o$40bo2bo61b3ob2o20bo155b2o47b3o29bo$12bo27b2obo60bo24b 3o204bo29bobo$12b3o10b2o10bo5bob2obo49bo6b3ob2o17bo104bo132b2o$15bo9b 2o9bobo4bobob2o49b3o6bob2o17b2o103b3o146b2o$4b2o8b2o20bo2bo2b2obo30b2o 23bo134bo145b2o$5bo31b2o6bo31bo6b2o14b2o133b2o11b2o13b2o$5bobo37b3o29b obo4b2o39b2o121b2o13b2o$6b2o40bo23b2o4b2o44bo2bo87bo73b2o$47b2o23bobo 50b2o88b3o5b2o64bo$70bobob3o141bo4b2o62bobo$66b2o2b2o5bo139b2o68b2o81b 2o$4bob2o58b2o8b2o292b2o$2b3ob2o384b2o$bo216b2o172bo$2b3ob2o80b2o128b 2o3b2o123b2o15b2o26b3o$4bobo30b2o49b2o23b2o108b2o122bobo15b2o28bo$4bob o30b2o74bo233bo$5bo108b3o229b2o$116bo77b2o7b2o$100b2o24b2o66b2o7bobo$ 28b2o66bo3b2o24bo30b2o42bobob3o$28b2o65bobo29b3o2b2o24bo42b2o5bo40b2o 18b2obo112b2o$34b2o58bobo32bo3bo13b2o6b3o49b2o40bobo17bob2o112bo$34bo 19b2o38bo38bobo11b2o6bo95bo134b3o$30bo5bo16bobo37b2o24b2o13b2o115b2o 135bo$29bobo3b2o16bo65b2o164b2obo$30bo21b2o231bob2o$31b3o$33bo79b2o 163b2o$113b2o163b2o$117b2o46b2o$66b2o49b2o46b2o$66b2o$349b2o$350bo$71b 2o39b2o98b2o136bobo$70bobo39b2o99bo54b2o81b2o$70bo91b2o46b3o56bo105b2o $69b2o91bo47bo58bobo103b2o$143b2o3b2o13bo106b2o$82b2o60bo3bo13b2o$82b 2o57b3o5b3o$141bo9bo40b2o$193bo$27bo162b3o180b2o$26bobo161bo182bo$26bo 2bo262b2o80b3o$27b2o263bo83bo$118b2o22bo147bobo81b2o$119bo20b3o99bo18b o28b2ob2o79bo$116b3o20bo102b3o7b2o5b3o31bobo76bobo$116bo22b2o104bo6b2o 4bo34bobo76b2o$5b2o237b2o12b2o10b2o20b2ob2o$5b2o264bo24bo$9b2o104bo 155bobo18b2obo$9b2o104b3o139b2o13b2o18b2obobo56bo$23b2o93bo133b2o3b2o 37b2o56b3o$23b2o92b2o23b2o108b2o103bo$139b2o2bo212b2o28b2o$139bob2o71b 2o56b2o112bo$141bo71bobo55bobo110bobo$141bo71bo49bo7bo108b2o2b2o$116b 2o18b2obob2o69b2o47b3o5b3o108b2o$35b2o78bobo18b2ob2o2bo116bo7bo$35b2o 78bo26bo117b2o6b2o$13b2o99b2o20b2ob3o$14bo122bobo239b2o4b2o$11b3o123bo 241b2o4b2o$11bo90b2o30b2ob2o$102bo31bobo$100bobo5b2o26bo$99bobo6b2o26b 2o140b2o$95b2o3bo177b2o72b2o35bo$95b2o254bobo33b3o$20b2o69b2o194b2o62b o34bo$21bo70bo194bo62b2o34b2o$18b3o71bobo193b3o63b2o$18bo74b2o195bo63b 2o3bo$233bo47b2o75bobo6b2o$233b3o46bo76bobo5b2o$236bo44bo79bo$235bobo 43b2o78b2o$120b2o4b2o108bo30bo$120b2o4b2o139b3o$270bo$237b2o30b2o8b2o 74bo$237b2o40bo61bo13b3o35b2o$121b2o154bobo59b3o16bo34b2o$121b2o2b2o 150b2o59bo18b2o$125bobo93bo41b2o73b2o$127bo92bobo40b2o26b2o$97b2o28b2o 91bobo68bo23bo72b2o$98bo119b3ob2o65bobo23b3o70b2o$95b3o119bo71b2o27bo 73b2o$95bo118bo2b4ob2o39b2o52b2o73b2o$214b3o3bob2o39b2o$217bo130b2o$ 175bo40b2o26b2o102b2o36b2o$113b2o60b3o66bo126b2o13b2o$113bobo46b2o3b2o 9bo14b2o47bobo126bobo$77bo37bo2bo2bo40b2o3b2o8b2o15bo47b2o43b2o84bo$ 77b3o35b7o71bo93b2o72b2o10b2o$80bo112b2o113b2o51bo$38b2o39b2o36b5o33b 2o151b2o41b2o9b3o$38b2o77bo4bo2b2o29bo174b2o19bo11bo$120bo2bo2bo29bobo 87b2obo81bobo17bo$120b2obobo31b2o87bob2o83bo17b2o$117bo5bob2o194b2o10b 2o$105b2o9bobo4bo72b2o41b2o80bo$105b2o9bo2bo2b2o72b2o41b2o70b2o9b3o$ 117b2o193bo11bo$96b2obo211bo$96bob2o211b2o$160b2o$61b2o98bo60b2o3b2o$ 61b2o8b2o85b3o28b2o32bo3bo$72bo85bo31bo15b2o12b3o5b3o29b2o$69b3o117bo 17bo12bo9bo28bobo$47b2o20bo119b2o13b3o23bobo26bo$48bo155bo26b2o25b2o 14b2o$10b2o33b3o70b2o153bo2bo$10b2o33bo29b2o41b2o154b2o$6bo50b2o15bobo $6b3o48bo16bo98b2o$9bo48b3o12b2o98b2o54b2o$8b2o11bo38bo103b2o64bo$20bo bo7b2o131bobo51b2o11bobo$20bobo7b2o44b2o85bo54bo12b2o$21bo55bo84b2o54b obo$74b3o142b2o2b2o$74bo148b2o$81b2o34b2o$82bo34bobo$18b2o59b3o37bo$ 18b2o59bo39b2o97b2o4b2o$4b2o212b2o4b2o$4b2o$2o$2o162bo$107bob2o3b2o48b 3o$105b3ob2o3bo52bo$104bo10b3o48b2o$105b3ob2o6bo101b2o$107b2o2bo106bob o$110b2o106bo$217b2o2$164b2o$164b2o$188b2o$188bobo$190bo$24b2o164b2o$ 23bobo$24bo4$132bo4b2o$131bobo2bobo7b2o$130bo2b4o9bo$26b2obo100bobo4bo 6bobo$26bob2o99b2ob2o2b2o6b2o$127bo$19b2o103bo2b4ob2o$19b2o103b3o3bob 2o$127bo40b2o$126b2o39bobo$52b2o103bo9bo$52b2o49b2o52b3o5b3o54b2o$104b o55bo3bo57b2o$91bo11bo55b2o3b2o$9b2o39b2o39b3o9b2o$10bo39b2o42bo$10bob o24b2o42b2o10b2o$11b2o25bo43bo150b2o$38bobo41bobo91b2o55bo$39b2o42b2o 91b2o53bobo$35b2o69b2o123b2o$35b2o69b2o75bob2o$29b2o152b2obo$29bo188b 2o$27bobo187bobo$27b2o109b2o77bo$132b2o4bobo75b2o$133bo6bo38b2o$48b2o 66b2o12b3o7b2o37bobo$48b2o47b2o18bo12bo50bo$97bo16b3o36b2o26b2o$59b2o 37b3o13bo39bo$58bo2bo38bo50b3o3bob2o59b2o$58bobo23b2o65bo2b4ob2o58bobo $59bo20bo3b2o68bo64bo$79bobo73b3ob2o57b2o$7b2o69bobo76b2o2bo$7b2o17b2o 50bo81b2o84bo$26b2o49b2o165b3o$243bo$41b2o200b2o$41b2o2$219bo$219b3o$ 222bo$221b2o23b2o$243b2o2bo$243bob2o$245bo$245bo$220b2o18b2obob2o$219b obo18b2ob2o2bo$219bo26bo$218b2o20b2ob3o$241bobo$51bo189bo$12b2o35b3o 186b2ob2o$12b2o34bo189bobo$48b2o190bo$81bo158b2o$81b3o$17b2o65bo$17b2o 64b2o$13b2o$13b2o2$57b2o159b2o$19b2o36b2o158bobo$19b2o13b2o181bo$33bob o180b2o$33bo181bo$32b2o10b2o74bo94b3o$45bo72b3o97bo$42b3o9b2o61bo99b2o $42bo11bo20b2o40b2o17bo39bo$55bo20bo59b3o37b3o$54b2o17b3o63bo39bo$73bo 64b2o38b2o12bo$192b3o$159bo35bo19b2o$79b2o78b3o32b2o19b2o$78bobo81bo 76b2o$78bo82b2o11b2o63bobo$77b2o95b2o65bo$241b2o2$80b2o$81bo$78b3o$78b o$85b2o30b2o$86bo17b2o11b2o$83b3o19bo80b2o$83bo18b3o82bo$102bo81b3o$ 184bo2$153b2o$147b2o5bo20b2o13b2o$147bobob3o21bobo11bobo$140b2o7bobo 25bo11bo$140b2o7b2o26b2o9b2o3$191b2o$192bo$189b3o19b2o21b2o$189bo20bob o21b2o$196b2o12bo17b2o$197bo11b2o17b2o$194b3o$194bo$230b2o$223b2o5b2o$ 223b2o5$89b2o$89b2o8$63bo$62bobo$62bobo$61b2ob2o16b2o$82b2o$61b2ob2o$ 62bob2o34b2o$60bo39bobo$60b2o40bo$102b2o2$68b2o$62b2o4b2o$61bobo27b2o$ 61bo29bobo$60b2o31bo$68b2o23b2o$68b2o$86b2o$82bo3b2o$74bo6bobo$73bobo 4bobo$74bo5bo$79b2o!""") head2c3=pattern("8b2o$3bo2bo2bo$3b6o2$3b6o$2bo6bo$2bo2b5o$obobo$2o2bo$4bo$3b2o!") body2c3=pattern("6bo$b6o$o$o2b6o$obo6bo$obo2b5o$b2obo$4bo$4bo$3b2o!") tail2c3=pattern("5b2o$5b2o2$b6o$o5bo$o2b3o$obo$o2bo$b2o!") wire2c3=head2c3(625,388) + tail2c3(2143,1905) for i in range(631,2142,6): # 251 body segments wire2c3+=body2c3(i,i-236) # first one at (631, 395) receiver2c3=pattern(""" 208bo$207bobo$208bo3$213b2o$188b2o23b2o$189bo31b2o$189bobo29bo$190b2o 27bobo$213b2o4b2o$213b2o2$179b2o$180bo40b2o$180bobo39bo$181b2o34b2obo$ 217b2ob2o$199b2o$199b2o16b2ob2o$218bobo$218bobo$219bo8$192b2o$192b2o8$ 55b2o$48b2o5b2o$48b2o$85bo$83b3o$50b2o17b2o11bo$50b2o17bo12b2o$44b2o 21bobo20bo$44b2o21b2o19b3o$87bo$87b2o3$90b2o9b2o26b2o7b2o$90bo11bo25bo bo7b2o$88bobo11bobo21b3obobo$88b2o13b2o20bo5b2o39bo$125b2o45b3o$175bo 14bo$95bo78b2o12b3o$41bo51b3o91bo$41b3o48bo94b2o$44bo47b2o$43b2o$186b 2o$167b2o17b2o$167b2o3$61b2o$61bo$59bobo42b2o$59b2o43b2o11b2o51b2o$ 117bo53bo$84b2o32b3o48bo$42b2o40bo35bo48b2o$42b2o15b2o24b3o85b2o$59bob o25bo12b2o38b2o32bo$61bo38bo39bo30b3o$61b2o38b3o37b3o27bo$103bo39bo3$ 42b2o$42bo$40bobo$40b2o4$57b2obo$57bob2o2$50b2o$50b2o122b2o$173bobo$ 173bo29b2o$172b2o29bobo$205bo$178b2o25b2o$177bobo4b2o$40b2o135bo7bo$ 41bo134b2o4b3o$41bobo138bo$42b2o146b2o$189bobo$189bo$188b2o$61bo$59b3o $58bo$58b2o$206b2o$182bo23bobo$63b2o117b3o23bo$63b2o120bo22b2o$184b2o 14b2o$200b2o$73b2o$73bo$71bobo$71b2o$34b2o$33bobo$33bo$32b2o2$44b2o$ 44b2o$160b2o7b2o30b2o$92b2o66b2o7bobo29bobo$92b2o45bo27bobob3o29bo$ 139b3o25b2o5bo28b2o$142bo30b2o$90b2o49b2o$49b2o39b2o$48bobo26b2o43bo$ 48bo29bo43b3o$47b2o29bobo44bo$79b2o43b2o11b2o$75b2o60b2o$75b2o4$177b2o 21b2o$66b2o108bobo21b2o$66bo109bo17b2o$64bobo21b2o85b2o17b2o$48b2o14b 2o22b2o$48b2o93b2o$52bo46b2o39b2o2bo2b2o47b2o$48b2o2b3o43bo2bo38b2obo 3bo41b2o5b2o$48b2o5bo42bobo23b2o17bobobo10b2o29b2o$54b2o43bo20bo3b2o 14b2obob2o12bo$119bobo12b2o4bo2bo12b3o$118bobo13b2o6b2o12bo$67b2o49bo$ 66bobo48b2o$67bo$81b2o$81b2o4$47b2o$47b2o5$49bo$19b2o28b3o$12b2o5b2o 31bo92bo$12b2o37b2o90b3o11bo$47b2o93bo14b3o$47bo94b2o16bo14bo$14b2o33b o109b2o12b3o$14b2o32b2o69bo52bo$8b2o109b3o50b2o$8b2o112bo$121b2o$171b 2o$152b2o17b2o$45b2o105b2o$45b2o17b2o$64b2o3$65b2o$65bo89b2o$52b2o12b 3o41bo23b2o20bo$35b2o16bo14bo40bobo22bo19bo$35bo14b3o57bo14b2o8b3o16b 2o$28bo7b3o11bo74bo11bo20b2o$26b3o9bo87b3o30bo$25bo102bo27b3o$25b2o 129bo$17b2o93b2o$17b2o92bobo$111bo$110b2o62b2o$126b2obo44bobo$126bob2o 46bo$176b2o$34b2o83b2o$34bo84b2o$32bobo$32b2o3$166b2o$166b2o2$157b2obo $157bob2o2$36b2o$36bobo$38bo91b2o44b2o$38b2o90bo44bobo$28b2o98bobo44bo $28b2o98b2o44b2o$9bob2o$9b2obo2$18b2o135b2o$18b2o136bo$156bobo$157b2o 15b2o$114b2o58b2o$114bo2b2o$115b2obo$116bo40b2o$28b2o86bobo4b2o31bobo$ 28bo88b2o5bo31bo$26bobo94bo31b2o$26b2o68b2o25b2o$70bo25bo$58bo11b3o21b obo$56b3o14bo20b2o$40bo14bo16b2o$40b3o12b2o70b2o44b2o$43bo58b2o24bo44b o$4b2o36b2o59bo13b2o6b3o46b3o$5bo97bobo11b2o6bo50bo$5bobo96b2o$3b2ob2o 35b2o$2bobo38b2o17b2o$2bobo57b2o$b2ob2o20b2o$bo24bo$2bob2o18bobo108b2o $obob2o18b2o109b2o$2o$59b2o32b2o$59bo20b2o11b2o$24b2o35bo19bo67b2o21b 2o$24bobo33b2o16b3o67bobo21b2o$26bo29b2o20bo53b2o14bo17b2o$26b3o27bo 75bo14b2o17b2o$29bo27b3o37b2o14b2o3b2o13bo$28b2o29bo38bo15bo3bo13b2o$ 95b3o13b3o5b3o46b2o$95bo15bo9bo39b2o5b2o$161b2o4$18b2o$18b2o2$9b2o$10b o$7b3o45b2o$7bo47b2o$15b2o32b2o$15bo33b2o$16bo$15b2o$51b2o$44b2o5b2o$ 44b2o!""") inserter2c3=pattern(""" 51bo$49b3o$23b2o23bo$24bo23b2o$24bobo$25b2o2b2o37bo$29b2o35b3o15bo9bo$ 65bo18b3o5b3o$52b2o11b2o20bo3bo$52b2o32b2o3b2o8$23b2o52b2o$22bobo16b2o 34b2o$22bo18bobo45b2o$21b2o20bo44bo2bo$37b2o4b2o44b2o4b2o$37bo2bo54bob o$39b2o56bo$30b2o65b2o$30b2o20b2o33b2o$53bo34bo$50b3o32b3o$50bo34bo2$ 19bo$19b3o$22bo$21b2o2$85b2o$85bo$86b3o$88bo2$40b2o$40bo$38bobo$38b2o 12$20b2o15b2o$19bobo15b2o$19bo$18b2o6$25bo$25b3o$28bo$27b2o28b2o$57bo$ 55bobo$51b2o2b2o$51b2o4$50b2o4b2o$50b2o4b2o5$23b2o35bo$22bobo33b3o$22b o34bo$21b2o34b2o$25b2o$25b2o3bo$29bobo6b2o$30bobo5b2o$32bo$32b2o$24b2o $25bo$25bobo$26b2o2b2o$30b2o32b2o$64b2o4$59b2o$59b2o$63b2o$63b2o3$24b 2o31b2o$23bobo16b2o13b2o$23bo18bobo$22b2o20bo$38b2o4b2o$38bo2bo$40b2o$ 31b2o$31b2o7$21b2o$22bo$22bobo$23b2o$39bo$37b3o$36bo$36b2o3$10b2o$10b 2o7$43b2o$43b2o4$38b2o$38b2o$2o40b2o$2o40b2o3$36b2o$21b2o13b2o$21bobo$ 23bo$23b2o!""") all=highway_robber(86,0) + connecting_neck(195,262) + transmitter2c3(347,219) \ + wire2c3 + receiver2c3(2103,1763) + inserter2c3(2024,2042) while g.numlayers()>1: g.dellayer() all.display("Stable Pseudo-Heisenburp Device") g.setmag(0) setposint(120,200) g.setname("Highway Robber") g.clone() g.setname("2c/3 Transmitter") setposint(500,400) g.clone() g.setname("2c/3 Receiver") setposint(2175,2000) g.clone() g.setname("Stable Pseudo-Heisenburp Device") g.clone() g.setname("Glider Fleet") setposint(330,290) # since the tiles change size depending on how many layers have been created, # have to create all five layers before checking visibility of components -- # now go back and check that the critical areas are all visible: g.setlayer(0) while not g.visrect([100,100,150,175]): g.setmag(g.getmag()-1) g.setlayer(1) while not g.visrect([350,225,400,350]): g.setmag(g.getmag()-1) g.setlayer(2) while not g.visrect([2100,1750,225,300]): g.setmag(g.getmag()-1) g.setlayer(3) g.fit() g.setlayer(4) while not g.visrect([0,200,300,400]): g.setmag(g.getmag()-1) g.update() # ----------------------------------------------------- def show_status_text(s, d, t): if d==-1: if t==1: g.show(s + "Speed is " + str(t) + " tick per step.") else: g.show(s + "Speed is " + str(t) + " ticks per step.") else: g.show(s + "Delay between ticks is " + str(d) + " seconds.") # ----------------------------------------------------- # if there are multiple layers, get permission to remove them if g.numlayers() > 1: answer = g.getstring("All existing layers will be removed. OK?") if lower(answer[:1]) == "n": g.exit() oldswitch = g.setoption("switchlayers", True) # allow user to switch layers oldtile = g.setoption("tilelayers", True) rule() try: burp() finally: # remove the cloned layers added by the script while g.numlayers() > 1: g.dellayer() g.setname("Stable Pseudo-Heisenburp Device") g.setoption("tilelayers", oldtile) g.setoption("switchlayers", oldswitch) g.show("") golly-2.5-src/Scripts/Python/invert.py0000644000175100001440000000133312156145314015004 00000000000000# Invert all cell states in the current selection. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jun 2006. # Updated to use exit command, Nov 2006. # Updated to use numstates command, Jun 2008. from glife import rect from time import time import golly as g r = rect( g.getselrect() ) if r.empty: g.exit("There is no selection.") oldsecs = time() maxstate = g.numstates() - 1 for row in xrange(r.top, r.top + r.height): # if large selection then give some indication of progress newsecs = time() if newsecs - oldsecs >= 1.0: oldsecs = newsecs g.update() for col in xrange(r.left, r.left + r.width): g.setcell(col, row, maxstate - g.getcell(col, row)) if not r.visible(): g.fitsel() golly-2.5-src/Scripts/Python/life-integer-gun30.py0000644000175100001440000000315212156145314017002 00000000000000# Based on text_test.py from PLife (http://plife.sourceforge.net/). # Universal* font described by Eric Angelini on SeqFan list # Construction universality* demonstrated by Dean Hickerson # # Integers can be written in this font that stabilize into # (almost*) any Life pattern known to be glider-constructible. # # * Possible caveats involve a very small percentage # (possibly zero percent!) of glider constructions -- in # particular, constructions that require large numbers # of very closely spaced gliders. The existence of objects # whose constructions require non-integer-constructable # closely-packed fleets of gliders is an open question; # no such objects are currently known. from glife.text import * rule() all = make_text (""" 411-31041653546-11-31041653546-1144444444444444444444444444444 31041653546-11-31041653546-11444444444444444-31041653546-11 31041653546-11444444444444444444-31041653546-11-31041653546 111444444444444-15073-114444-5473-11444444444-2474640508-444444 2474640508-444444444444444444444-2474640508-444444-2474640508-4444 2474640508-444444-2474640508-4444444444444444444444-2474640508 444444-2474640508-414-7297575-114-9471155613-414444444444 31041653546-11-2534474376-1-9471155613-414444444444-31041653546-114 7297575-114-9471155613-414444444444-31041653546-114-7297575-118 9471155613-414444444444-31041653546-18-6703-1444-107579-1114444 2474640508-51-947742-414444444441-947742-414444444444-2474640508 51-947742-414444444441-947742-41444-2474640508-51-947742-414 2474640508-414444444444444-2474640508-51-947742-414444444441 947742-414""","EAlvetica") all.display ("Eric Angelini integer glider gun") golly-2.5-src/Scripts/Python/make-Banks-IV-constructor.py0000644000175100001440000001117012156145314020345 00000000000000# Make a pattern from states 3 and 0, select it and then # run this script to make a Banks-IV CA pattern that will then # construct the pattern. # # The machine will attempt to activate the pattern by injecting # a signal at a special trigger point. # See: Patterns/Banks/Banks-IV-constructor.rle.gz # # You may need to change trigger_row for your pattern, or disable # triggering. # # Tim Hutton from glife import rect from time import time import golly as g r = rect( g.getselrect() ) if r.empty: g.exit("There is no selection.") oldsecs = time() maxstate = g.numstates() - 1 top_tape = '00' bottom_tape = '00' # write a state 3 to the required position, relative to the centre of the face def write_cell(x,y): global top_tape global bottom_tape # delay one of the tapes, to select the correct row if y<0: top_tape += '00'*abs(y) elif y>0: bottom_tape += '00'*y # send out a write arm to the right length arm_length=2 while arm_length < x: top_tape += '120' + '00'*arm_length + '12000' bottom_tape += '120' + '00'*arm_length + '12000' arm_length += 1 # send an erasing wing down the arm, to write a cell at the end top_tape += '120' + '00'*(arm_length-3) + '120000' bottom_tape += '120' + '00'*(arm_length-3) + '120000' # undo the delay on the tapes (could just add the difference but this is simpler) if y<0: bottom_tape += '00'*abs(y) elif y>0: top_tape += '00'*y # we first write the commands to 2 strings, and then to the grid H_OFFSET = 10 # how far from the construction face should the new pattern be? half_height = (r.height-(r.height%2))/2 # write the cells that are in state 1 (can ignore the zeros) # (still plenty of room for optimisation here) for col in xrange(r.left + r.width-1, r.left-1,-1): # if large selection then give some indication of progress newsecs = time() if newsecs - oldsecs >= 1.0: oldsecs = newsecs g.update() for row in xrange(r.top, r.top + r.height): if g.getcell(col,row)==3: write_cell(H_OFFSET + col-r.left,row - r.top - half_height) # trigger trigger_row = 3 # from the vertical middle write_cell(H_OFFSET + 2,trigger_row) # (optional) restore the trigger input write_cell(H_OFFSET-3, trigger_row-1) write_cell(H_OFFSET-2, trigger_row+2) write_cell(H_OFFSET-2, trigger_row+1) # actually just sends an erasing wing write_cell(H_OFFSET, trigger_row-2) write_cell(H_OFFSET, trigger_row+2) fx = r.left-20 # constructing face fy = r.top+r.height*2 # centre of constructing face half_height += 10 # draw the constructing face for cy in range(fy-(half_height-6),fy+(half_height-6)+1): g.setcell(fx,cy,3) # draw the top shoulder g.setcell(fx,fy-half_height,3) g.setcell(fx,fy-half_height-3,3) g.setcell(fx-1,fy-half_height-3,3) g.setcell(fx+1,fy-half_height-3,3) g.setcell(fx-1,fy-half_height-2,3) g.setcell(fx+1,fy-half_height-2,3) g.setcell(fx+1,fy-half_height-1,3) g.setcell(fx+1,fy-half_height+1,3) g.setcell(fx+1,fy-half_height+2,3) g.setcell(fx+1,fy-half_height+3,3) g.setcell(fx+1,fy-half_height+4,3) g.setcell(fx+1,fy-half_height+5,3) g.setcell(fx-1,fy-half_height+2,3) g.setcell(fx-1,fy-half_height+3,3) g.setcell(fx-1,fy-half_height+4,3) g.setcell(fx-1,fy-half_height+5,3) g.setcell(fx+2,fy-half_height-1,3) g.setcell(fx+3,fy-half_height-1,3) g.setcell(fx+3,fy-half_height,3) g.setcell(fx+2,fy-half_height+1,3) g.setcell(fx+3,fy-half_height+1,3) g.setcell(fx+2,fy-half_height+4,3) g.setcell(fx-2,fy-half_height+5,3) # draw the bottom shoulder g.setcell(fx,fy+half_height,3) g.setcell(fx,fy+half_height+3,3) g.setcell(fx-1,fy+half_height+3,3) g.setcell(fx+1,fy+half_height+3,3) g.setcell(fx-1,fy+half_height+2,3) g.setcell(fx+1,fy+half_height+2,3) g.setcell(fx+1,fy+half_height+1,3) g.setcell(fx+1,fy+half_height-1,3) g.setcell(fx+1,fy+half_height-2,3) g.setcell(fx+1,fy+half_height-3,3) g.setcell(fx+1,fy+half_height-4,3) g.setcell(fx+1,fy+half_height-5,3) g.setcell(fx-1,fy+half_height-2,3) g.setcell(fx-1,fy+half_height-3,3) g.setcell(fx-1,fy+half_height-4,3) g.setcell(fx-1,fy+half_height-5,3) g.setcell(fx+2,fy+half_height-1,3) g.setcell(fx+3,fy+half_height-1,3) g.setcell(fx+3,fy+half_height,3) g.setcell(fx+2,fy+half_height+1,3) g.setcell(fx+3,fy+half_height+1,3) g.setcell(fx+2,fy+half_height-4,3) g.setcell(fx-2,fy+half_height-5,3) # draw the tapes x = fx-1 for c in range(0,len(top_tape)): g.setcell(x,fy-half_height-1,3) g.setcell(x,fy-half_height,int(top_tape[c])) g.setcell(x,fy-half_height+1,3) x -= 1 x = fx-1 for c in range(0,len(bottom_tape)): g.setcell(x,fy+half_height-1,3) g.setcell(x,fy+half_height,int(bottom_tape[c])) g.setcell(x,fy+half_height+1,3) x -= 1 golly-2.5-src/Scripts/Python/make-Codd-constructor.py0000644000175100001440000000437012156145314017650 00000000000000# Make a pattern from states 1 and 0, select it and then # run this script to make a Codd CA pattern that will then # construct the pattern. The constructor will then attempt # to inject sheathing and triggering signals to a point one # up from the pattern's bottom-left corner. # # See example: Patterns/Codd/golly-constructor.rle # # Tim Hutton from glife import rect from time import time import golly as g r = rect( g.getselrect() ) if r.empty: g.exit("There is no selection.") oldsecs = time() maxstate = g.numstates() - 1 # these are the commands: extend = '70116011' extend_left = '4011401150116011' extend_right = '5011501140116011' retract = '4011501160116011' retract_left = '5011601160116011' retract_right = '4011601160116011' mark = '701160114011501170116011' erase = '601170114011501160116011' sense = '70117011' cap = '40116011' inject_sheath = '701150116011' inject_trigger = '60117011701160116011' # (sometimes you don't need two blanks after each command but I haven't analysed this fully) # we first write the commands to a string, and then to the grid # (we start off facing right, at the bottom-left of the construction area) # write the cells that are in state 1 (can ignore the zeros) # (still plenty of room for optimisation here) tape = '11' for row in xrange(r.top, r.top + r.height): # if large selection then give some indication of progress newsecs = time() if newsecs - oldsecs >= 1.0: oldsecs = newsecs g.update() for col in xrange(r.left, r.left + r.width): if g.getcell(col, row)==1: tape += extend*(4+col-r.left) + extend_left + extend*(r.top+r.height-row) tape += mark tape += retract*(r.top+r.height-row) + retract_left + retract*(4+col-r.left) elif g.getcell(col,row)!=0: g.exit('Cells in the selected area must be in states 0 or 1 only.') # finally we sheath and trigger and retract tape += extend_left + extend*4 + extend_right + extend tape += inject_sheath + '1'*50 + inject_trigger tape += retract*2 + retract_right + retract*4 + retract_left # now write the tape out x = r.left+r.width+10 y = r.top+r.height+10 g.setcell(x+1,y,2) for i in tape: g.setcell(x,y-1,2) g.setcell(x,y,int(i)) g.setcell(x,y+1,2) x-=1 golly-2.5-src/Scripts/Python/make-Devore-tape.py0000644000175100001440000004301712156145314016570 00000000000000# ================================================= # A Golly script to write the program and data # tapes for the Devore UCC. Load Devore-body.rle # and run this script, then set the machine running. # # Tape length: 105k # Rep period: 1.02 x 10^11 (102 billion) timesteps # # Script license: public domain # # Contact: tim.hutton@gmail.com # Thanks to Ron Hightower and John Devore # ================================================= import golly as g program_tape_x = 322 program_tape_y = 233 data_tape_x = 330 data_tape_y = 8 # range from start to stop (either direction) # twoway_range(0,10,2)==[0,2,4,6,8] # twoway_range(0,-10,2)==[0,-2,-4,-6,-8] def twoway_range(start,stop,step=1): return range(start,stop,(-1 if (stop-start)<0 else 1)*abs(step)) # range from start to stop including both end points (either direction) # inclusive_range(0,10,2)==[0,2,4,6,8,10] # inclusive_range(10,0,2)==[10,8,6,4,2,0] # inclusive_range(0,-10,2)==[0,-2,-4,-6,-8,-10] def inclusive_range(start,stop,step=1): return twoway_range(start,stop+(-1 if (stop-start)<0 else 1)*abs(step),step) ''' Devore instruction set: (the program tape) 0000 goto (following bits give destination) 0001 move data head (D) left 0010 move data head right 0011 jump_if_one [from whichever path is open] (following bits give destination) 0100 m (mark_if_zero) [affects whichever path is open] 0101 e (erase_if_one) [affects whichever path is open] 0110 switch between construction path and data path [D open by default] 0111 x (extend) [all these below only affect C] 1000 xl 1001 xr 1010 r (retract) 1011 rl 1100 rr 1101 i (inject sheath) # legacy from Codd, don't use this! (see below) 1110 j (inject trigger) 1111 stop Destination bits: first is sign (0=backwards, 1=forwards), followed by unary count of marks and zero terminator. E.g. 111110=+4, 011110=-4 Marks lie 6 cells below the program tape, and appear on the column before the start of the command they mark. Not every command needs a mark, just those jumped-to. Destination says how many marks forward or backwards to jump. Exception is when a goto is immediately followed by a mark - in this case the goto destination is decremented because the next mark is skipped over anyway. For injection, use the pattern: 1 1 1 1 1 1 1 1 1 Approach from the left into the receiver, then retract. This injects the sheathing signal. Then call the inject_trigger command. You can then safely retract away. The inject_sheath command was used by Codd but is now redundant, it appears. ''' goto = '0000' toggle_C_or_D = '0110' data_head_left = '0001' data_head_right = '0010' extend = '0111' extend_left = '1000' extend_right = '1001' retract = '1010' retract_left = '1011' retract_right = '1100' mark = '0100' erase = '0101' jump_if_one = '0011' inject_sheath = '1101' inject_trigger = '1110' stop = '1111' def write_string(s): global program_tape_x, program_tape_y for c in s: if c=='1': g.setcell(program_tape_x,program_tape_y,1) program_tape_x += 1 def write_data_string(s): global data_tape_x, data_tape_y for c in s: if c=='1': g.setcell(data_tape_x,data_tape_y,1) data_tape_x += 1 def write_program(program): global program_tape_x, program_tape_y # find all the labels labels = [c[:-1] for c in program if c[-1]==':'] iCurrentLabel=0 for i,c in enumerate(program): if 'jump_if_one:' in c: write_string(jump_if_one) jump = labels.index(c[c.index(':')+1:])+1-iCurrentLabel if jump<1: jump-=1 if jump>1 and program[i+1][-1]==':': jump -= 1 # (if next command is a label we don't need to jump so far) if jump<0: write_string('0') else: write_string('1') write_string('1'*abs(jump)+'0') elif 'goto:' in c: write_string(goto) jump = labels.index(c[c.index(':')+1:])+1-iCurrentLabel if jump<1: jump-=1 if jump>1 and program[i+1][-1]==':': jump -= 1 # (if next command is a label we don't need to jump so far) if jump<0: write_string('0') else: write_string('1') write_string('1'*abs(jump)+'0') elif c[-1]==':': # a label, make a mark on the marker tape g.setcell(program_tape_x-1,program_tape_y-6,1) iCurrentLabel+=1 else: # a normal command write_string(c) # ------------------------------------ # create the program: # ------------------------------------ program = [ # ---------- data tape copying phase: ------------------------ 'goto:extendup', 'write1:', # == 1 == extend_right,toggle_C_or_D,mark,toggle_C_or_D,retract_right,extend, 'nextread:', data_head_left, 'jump_if_one:write1', # 0: extend, data_head_left, 'jump_if_one:write1', # == 00 == extend, data_head_left, 'jump_if_one:write1', # == 000 == # -- end of copy -- data_head_right, # we overshot (first data entry is 01) toggle_C_or_D, # open C 'retractcopy:', retract,extend_left,extend,'jump_if_one:retractdown', retract,retract_left,'goto:retractcopy', # ---------- construction phase: ------------------------ 'rowstart:', # move into writing position extend_right,extend,extend,extend, # (make a mark at the start of the row for retraction) extend_left,extend,toggle_C_or_D,mark,toggle_C_or_D,retract,retract_left, 'nextcolumn:', data_head_right, 'jump_if_one:1', # 0: data_head_right, 'jump_if_one:01', # == 00 == data_head_right, 'jump_if_one:001', # == 000 == # (assume came immediately after start of a new row) extend_left,extend,toggle_C_or_D,erase,retract,retract_left, retract,retract,retract,retract_right, 'retractcolumn:', extend_left,extend,'jump_if_one:doneretractcolumn', retract,retract_left,retract,'goto:retractcolumn', 'doneretractcolumn:',erase,retract,retract_left, 'goto:inject', '001:', # == 001 == # -- retract row -- toggle_C_or_D, # open C 'retractrow:', retract,extend_left,extend,'jump_if_one:doneretractrow', retract,retract_left,'goto:retractrow', 'doneretractrow:', erase,retract,retract_left,toggle_C_or_D,retract,retract,retract,retract_right, extend, 'goto:rowstart', '01:', # == 01 == # -- write N 0's -- extend,extend,extend, 'goto:nextcolumn', '1:', data_head_right, 'jump_if_one:11', # == 10 == # -- write a 0 -- extend, 'goto:nextcolumn', '11:', # == 11 == # -- write a 1 -- extend_right, toggle_C_or_D, # open C mark, toggle_C_or_D, # close C retract_right, extend, 'goto:nextcolumn', # ------------------------ subroutines (here for speed): ----------------- 'extendup:', # move the construction arm into the starting position extend_right,extend,extend,extend,extend,extend,extend,extend,extend, # move up to the right height extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend, # move into writing position extend_right,extend,extend,extend, # (make a mark at the start of the copy for retraction) extend_left,extend,toggle_C_or_D,mark,toggle_C_or_D,retract,retract_left, 'goto:nextread', 'retractdown:', erase,retract,retract_left,toggle_C_or_D,retract,retract,retract,retract_right, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract,retract,retract,retract,retract,retract,retract, retract,retract,retract,retract, extend_left, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend, extend_right,extend,extend,extend,extend,extend,extend,extend,extend, # (make a mark at the bottom-left for final retraction) extend_left,extend,toggle_C_or_D,mark,toggle_C_or_D,retract,retract_left, 'goto:rowstart', # -- end of construction: retract and inject sheath+trigger -- 'inject:', retract,extend_right,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend,extend,extend,extend,extend,extend, extend,extend,extend,extend,extend, retract,inject_trigger, retract,retract,retract, stop ] # -------------------------------- # now write the tapes: # -------------------------------- # Our data tape contains coded construction instructions: # 11 : write a 1 # 10 : write a 0 # 01 : write n 0's (where n is the value below) # 001 : end of row # 000 : end of construction # # Each row is scanned from the left edge to the last 1. (A temporary marker # is used at the beginning for retraction, so rows can be any length.) Because # each row ends with a 1, we know that the sequence 000 cannot appear on the # data tape until the very end. This allows us to detect (reading backwards) # the 000 sequence, in order to know when to stop copying. # # For retracting vertically after construction another temporary marker is used. # # Following Ron Hightower's work (thanks Ron!) we copy the data tape first and # then read it from the far end. The data read head is made slightly prominent # to allow the 000 to be skipped (else it would be detected during tape-copy and # would cause it to end), but read correctly from the blank space at the end of # the data tape nearest the machine. # # The instruction set above was just one that I tried. I'm quite sure it is # possible to do this more efficiently. n=3 # found through experiment to give the shortest data tape # must match the "write N 0's" section of the program above # (I would have expected 10 or so to be better but anyway.) # first we write the program and marker tapes # then we encode the whole pattern onto the data tape # (program length is mostly unrelated to machine size, so it all works) write_program(program) # write the data tape data_tape = '' rect = g.getrect() # copy everything within the bounding rectangle width = rect[2] height = rect[3] x = rect[0] y = rect[1] for row in inclusive_range(y+height-1,y): far_right = x+width-1 while g.getcell(far_right,row)==0: far_right -= 1 if far_right 0: g.putcells(selcells, newx - x, newy - y) g.fitsel() golly-2.5-src/Scripts/Python/metafier.py0000644000175100001440000012357012156145314015301 00000000000000# metafier.py: # Uses the current selection to build a Brice Due metapixel pattern. # See http://otcametapixel.blogspot.com for more info. # Original author: Dave Greene, 12 June 2006. # # Dave Greene, 23 June 2006: added non-Conway's-Life rule support. # Also reduced the script size by a factor of six, at the expense of # adding a moderate-sized [constant] performance hit at the start # [due to composing the base tiles from smaller subpatterns.] # # The delay is almost all due to running CellCenter[3680] at the end # to produce the large filled area for the ONcell. Subpatterns are # generally (with some exceptions) defined to match the labeled slides at # http://otcametapixel.blogspot.com/2006/05/how-does-it-work.html . # # It's still possible to simplify the script by another factor of # two or more, by replacing the four main types of P46 oscillators # [which are often quoted as flat patterns] with predefined library # versions in the correct phase; see samples in the slide-24 section. # # 24 June 2006: the script now saves a reference copy of the OFFcell # and (particularly) the slow-to-construct ONcell, so these only have # to be constructed from scratch once, the first time the script runs. # # If metapixel-ON.rle and metapixel-OFF.rle become corrupted, they # should be deleted so the script can re-generate them. # # 3 July 2007: added code to avoid errors in rules like Seeds, # where the Golly canonical form of the rule doesn't include a '/' # # Modified by Andrew Trevorrow, 20 July 2006 (faster, simpler and # doesn't change the current clipboard). # # Modified by Andrew Trevorrow, 5 October 2007 (metafied pattern is # created in a separate layer so we don't clobber the selection). import os import golly as g from glife import * selrect = g.getselrect() if len(selrect) == 0: g.exit("There is no selection.") # check that a layer is available for the metafied pattern; # if metafied layer already exists then we'll use that layername = "metafied" metalayer = -1 for i in xrange(g.numlayers()): if g.getname(i) == layername: metalayer = i break if metalayer < 0 and g.numlayers() == g.maxlayers(): g.exit("You need to delete a layer.") # note that getrule returns canonical rule string rulestr = g.getrule().split(":")[0] if (not rulestr.startswith("B")) or (rulestr.find("/S") == -1): g.exit("This script only works with B*/S* rules.") # get the current selection slist = g.getcells(selrect) selwidth = selrect[2] selheight = selrect[3] # create a 2D list of 0s and 1s representing entire selection livecell = [[0 for y in xrange(selheight)] for x in xrange(selwidth)] for i in xrange(0, len(slist), 2): livecell[slist[i] - selrect[0]][slist[i+1] - selrect[1]] = 1 # build a patch pattern based on the current rule # that fixes the appropriate broken eaters in the rules table r1, r2 = rulestr.split("/") if r1[:1] == "B": Bvalues, Svalues = r1.replace("B",""), r2.replace("S","") elif r1[:1] == "S": Svalues, Bvalues = r1.replace("S",""), r2.replace("B","") else: Svalues, Bvalues = r1, r2 # create metafied pattern in separate layer if metalayer >= 0: g.setlayer(metalayer) # switch to existing layer else: metalayer = g.addlayer() # create new layer # set rule to Life rule() Brle = Srle = "b10$b10$b26$b10$b10$b26$b10$b10$b!" for ch in Bvalues: ind = 32-int(ch)*4 # because B and S values are highest at the top! Brle = Brle[:ind] + "o" + Brle[ind+1:] for ch in Svalues: ind = 32-int(ch)*4 Srle = Srle[:ind] + "o" + Srle[ind+1:] RuleBits = pattern(Brle, 148, 1404) + pattern(Srle, 162, 1406) # load or generate the OFFcell tile: OFFcellFileName = g.getdir("data") + "metapixel-OFF.rle" ONcellFileName = g.getdir("data") + "metapixel-ON.rle" if os.access(OFFcellFileName, os.R_OK) and os.access(ONcellFileName, os.R_OK): g.show("Opening metapixel-OFF and metapixel-ON from saved pattern file.") OFFcell = pattern(g.transform(g.load(OFFcellFileName),-5,-5,1,0,0,1)) ONcell = pattern(g.transform(g.load(ONcellFileName),-5,-5,1,0,0,1)) else: g.show("Building OFF metacell definition...") # slide #21: programmables -------------------- LWSS = pattern("b4o$o3bo$4bo$o2bo!", 8, 0) DiagProximityFuse = pattern(""" bo$obo$bo2$4b2o$4b2o$59b2o$59b2o3$58b2o2b2o$9b2o3bo5bo5bo5bo5bo5bo5bo 7b2o2b2o$9bo3bobo3bobo3bobo3bobo3bobo3bobo3bobo$10bo2bo2bo2bo2bo2bo2bo 2bo2bo2bo2bo2bo2bo2bo2bo$11bobo3bobo3bobo3bobo3bobo3bobo3bobo3bo5b2o$ 12bo5bo5bo5bo5bo5bo5bo5bo3bobo$55bo2bo$56bobo$57bo! """, -5, -5) OrthoProximityFuse = pattern("2o41b2o$2o41bo$41bobo$41b2o!", 1001, 0) ProximityFuses = LWSS + DiagProximityFuse + OrthoProximityFuse AllFuses = pattern() for i in range(0,4): # place four sets of fuses around cell perimeter AllFuses = AllFuses(2047, 0, rcw) + ProximityFuses temp = pattern("o$3o$3bo$2bo!") # broken eater temp += temp(0, 10) + temp(0, 20) temp += temp(0, 46) + temp(0, 92) TableEaters = temp(145, 1401) + temp(165, 1521, flip) HoneyBitsB = pattern(""" bo$obo$obo$bo7$bo$obo$obo$bo7$bo$obo$obo$bo23$bo$obo$obo$bo7$bo$obo$ob o$bo7$bo$obo$obo$bo23$bo$obo$obo$bo7$bo$obo$obo$bo7$bo$obo$obo$bo! """, 123, 1384) HoneyBitsS = HoneyBitsB(57, 34) temp = pattern("2bobo2$obobo2$obo2$obo2$2bobo4$obo2$obobo2$2bobo!") S = temp + temp(10, 16, flip) # just practicing... B = S + pattern("o6$8bobo2$o2$obo6$o!") # ditto temp = pattern("2bobo2$obobo2$obo2$obo2$obo2$obo2$obo2$obobo2$2bobo!") O = temp + temp(10, 16, flip) temp = pattern("obo2$obo2$obobo2$obobo2$obo2bo2$obo2$obo2$obo2$obo!") N = temp + temp(10, 16, flip) temp = pattern("obobobobo2$obobobobo2$obo2$obo2$obo2$obo!") F = temp + temp(0,6) # overlap, just to try it out... Eatr = pattern("4bobo2$" * 2 + "obo2$" * 2 \ + "4bobobobobobo2$" * 2 + "12bobo2$"*2) Eater = Eatr + pattern("obo2$"*2) LabelDigits = pattern(""" obobo2$o3bo2$obobo2$o3bo2$obobo5$obobo2$4bo2$4bo2$4bo2$4bo5$obobo2$o2$ obobo2$o3bo2$obobo12$obobo2$o2$obobo2$4bo2$obobo5$o3bo2$o3bo2$obobo2$ 4bo2$4bo5$obobo2$4bo2$obobo2$4bo2$obobo12$obobo2$4bo2$obobo2$o2$obobo 5$2bo2$2bo2$2bo2$2bo2$2bo5$obobo2$o3bo2$o3bo2$o3bo2$obobo!""") VLine = pattern("o2$" * 25) VLine2 = pattern("o2$" * 71) HLine = pattern("ob" * 38) TableLabels = VLine(18, 1440) + VLine(96, 1440) + Eater(77, 1446) \ + HLine(20, 1440) + HLine(20, 1488) + O(39, 1444) + N(55, 1444) \ + O(23, 1468) + F(39, 1468) + F(55, 1468) + Eatr(77, 1470) TableLabels += pattern("ob" * 29 + "8bobobo", 120, 1533) \ + HLine(118, 1391) + VLine2(118, 1393) + VLine2(192, 1393) \ + B(123, 1410) + B(123, 1456) + B(123, 1502) \ + S(177, 1398) + S(177, 1444) + S(177, 1490) \ + LabelDigits(138, 1396) + LabelDigits(168, 1401) all = AllFuses + TableEaters + TableLabels + HoneyBitsB + HoneyBitsS # slide 22: linear clock -------------------- LinearClockGun = pattern(""" 19bo$17b3o$16bo$16b2o$30bo$28b3o$27bo$27b2o$13b3o$12bo2b2o$11bo3b2o$ 12b3o$12b2o$15bo$13b2o$13b2o$2b2o5b2o2b2o$bobo9b2o8b2o$bo6b3o12b2o$2o 8b4o$12b3o$12bob2o$11b2o2bo$11b2ob2o$12bobo$13bo2$6b2o$5bobo$5bo$4b2o$ 10b2o36bo6b2o$11bo37b2o4b2o$8b3o37b2o$8bo$57bo$15b2o39bobo$14bobo15b2o 23bo$13b2obo15b2o24b3o63b2o$8bo5b2o44bo63b2o$6b3o6bo$5bo112bo5bo$6b3o 6bo15b2o84b3o3b3o$8bo5b2o15b2o20b2o62bo2bobo2bo$13b2obo35b2ob2o62b2ob 2o$14bobo18b3o15b4o$15b2o18bobo16b2o$35bobo$36bobo78bo7bo$38bo79bobobo bo$70bo47bobobobo$70b3o44bob2ob2obo$37bo35bo43b2o5b2o$37bo34b2o20b2o$ 59bo35bo$59b3o33bobo$62bo33b2o$61b2o4$28b2o7b2o11bo24bo$28bob2o3b2obo 10b3o22b3o$28bo3bobo3bo9b2obo21b2o2bo41b2ob2o$28b2o2bobo2b2o9b3o21b2o 3b2o11b2o28bobo$29b3o3b3o11b2o19bobo2bobo13bo10b3o8b2o5bobo$30bo5bo33b 2o3b2o9b2o3bobo7bo2bo4bo3b2o6bo$65b2o19bobo3b2o6bo3bo3bobo$65b2o21bo 11bo7bobo$25b2o13b2o46b2o13bo$25b2o2b2o5b2o2b2o58b2obo$29b2o5b2o$121b 2o$103bob2o14bobo$103b3o17bo$40bo63bo18b2o$40bo2b2o72b2o$39bo5bo36b2o 33bo$40bobo2b2o35bobo33b3o$27bo12bo3b2o38bo35bo$25b3o14b3o39b2o20b2o$ 24bo41b2o10b2o26bo$25b3o14b3o20bo2bo9bo28b3o$27bo12bo3b2o20b2o11b3o27b o$40bobo2b2o4b2o28bo$39bo5bo5b2o$40bo2b2o$40bo! """, 46, 1924) Gap = "3bo7bo7bo$b3o5b3o5b3o$o7bo7bo$2o6b2o6b2o21$" # string, not pattern! LinearClockEaters = pattern("3bo$b3o$o$2o5$" * 36 + Gap \ + "3bo$b3o$o$2o5$" * 10 + "24$" + "3bo$b3o$o$2o5$" * 17 \ + Gap + "3bo$b3o$o$2o5$" * 42 + Gap \ + "3bo$b3o$o$2o5$3bo7bo$b3o5b3o$o7bo$2o6b2o13$" \ + "3bo$b3o$o$2o5$" * 30 + "8$" + "3bo$b3o$o$2o5$" * 2 + Gap + "16$" \ + "3bo$b3o$o$2o5$" * 11 + "8$" + "3bo$b3o$o$2o5$" * 19, 101, 422) LinearClockCap = pattern(""" 3b2o13bo7bo$2bo2bo10b3o5b3o$bobobo9bo7bo14b2o$3obo10b2o6b2o13bobo$3o 29bo6b3o$30b2ob2ob3ob2o$30b2ob2ob5o$32bo5bo$2b2o29b2ob2o$2b2o3$32bo5bo $31b2o5b2o$30bob2o3b2obo$30bob2o3b2obo$31b3o3b3o$31b3o3b3o10$33b2ob2o$ 34bobo$34bobo$35bo! """, 83, 401) all += LinearClockGun[1840] + LinearClockEaters + LinearClockCap # slide 23: MWSS track -------------------- MWSS = pattern("b5o$o4bo$5bo$o3bo$2bo!", 521, 1973) P46Osc = pattern(""" 40bo$31b2o5b3o$10b3o14b2o3bo4bo$10bo3bo12b2o3bobo3bo$3bo6bo4bo17bobo3b o$b3o7bo3bo18bo3b2o$o$b3o7bo3bo7b3o$3bo6bo4bo5b2obob2o$10bo3bo5bo5b2o$ 10b3o8b2obob2o$23b3o!""") P46Gun = pattern(""" 31b2o$30b2o$31b5o9bo$16b3o13b4o9b3o$14bo3bo29bo$3bo9bo4bo13b4o9b3o$b3o 9bo3bo13b5o9bo$o29b2o$b3o9bo3bo13b2o$3bo9bo4bo$14bo3bo$16b3o!""") GliderToMWSS = P46Osc(449, 1963) + P46Gun(474, 1981) # exact match would be P46Gun[46](474, 1981), but that glider is absorbed StateBit = pattern("b2o$obo$bo!", 569, 1970) Snake = pattern("2o$o$bo$2o!", 570, 1965) BitKeeper = pattern(""" 15bobo2b2o19b2o$14bo3bob3o19bo$15bo6b2o15b3o$3bo12b5obo16bo$b3o15b3o$o $b3o15b3o$3bo12b5obo$15bo6b2o3b2o$14bo3bob3o4b2o$15bobo2b2o! """, 524, 1982) GliderFromTheBlue = pattern(""" 23b2o$23bo2bobo$25b2ob3o$31bo$25b2ob3o$12bo3bo8b2obo$11bo5bo$17bo$3bo 8bo3b2o$b3o9b3o$o$b3o9b3o19bo$3bo8bo3b2o7bo7b3o$17bo4bo2bob2o3bo$11bo 5bo10bo4bo$12bo3bo10bo4b2o2$23b5o$24b4o$26bo!""") GliderToLWSS = pattern(""" 3bo$2bobo$bo3bo3b2o$b5o3b2o$obobobo$bo3bo2$bo3bo$obobobo$b5o$bo3bo$2bo bo$3bo6$b3o5b3o$2ob2o3b2ob2o$2obobobobob2o$bo3bobo3bo$bo2bo3bo2bo$2b3o 3b3o4$4b2ob2o$5bobo$5bobo$6bo!""", 663, 1931) # P46Osc really ReflectLWSS = pattern(""" b2o$b2o8$b3o3b3o$o2bo3bo2bo$2obo3bob2o14$3b2ob2o$4bobo$4bobo$5bo! """, 589, 1940) ReflectLWSS2 = pattern(""" 15b2o3bo$15b3obob2o4b2o$15b3o4bo4b2o$3bo14bo3bo$b3o15b3o$o$b3o15b3o$3b o14bo3bo$15b3o4bo$15b3obob2o$15b2o3bo!""", 573, 1884) # P46Osc really LWSStoBoat = pattern(""" 2o14b2o9b2o$2o15b2o8b2o$13b5o$13b4o2$3b2o8b4o$2bobob2o5b5o$b2o3b2o9b2o 8b2o$2bobob2o8b2o9b2o$3b2o!""", 821, 1883) # P46Osc really ReflectMWSS = pattern(""" 22b2o5b2o$18b2o2b2o5b2o2b2o$18b2o2b2o5b2o2b2o$22b3o3b3o$21bo2bo3bo2bo$ 25bobo$21b2o7b2o$21b2o7b2o$24bo3bo$24b2ob2o$22b3o3b3o$22b2o5b2o$22bo7b o10$b2o27b2o$b2o25b2ob2o$26bo2bobo$6bo3b2o14bo$2o2b2obob3o14bo4bo$2o2b o4b3o15bo3bo$4bo3bo15b2o2b3o$5b3o16b2o2$5b3o$4bo3bo$2o2bo4b3o13b2o$2o 2b2obob3o13b2o$6bo3b2o2$b2o$b2o!""") HoneyBit = pattern("b2o$o2bo$b2o!") CornerSignalSystem = pattern() CornerSignalSystem += pattern(""" 4b2o4b3o$4b2o3bo3bo$9b2ob2o$10bobo2$10bobo$9b2ob2o$9bo3bo$10b3o9$3b3o 5b3o$3bo2b2ob2o2bo$4b3o3b3o$5bo5bo4$2o13b2o$2o2b2o5b2o2b2o$4b2o5b2o! """, 70, 9) # P46OscAlt1 really # include stopper for pattern corners, destroyed in the interior of # multi-cell metapatterns by the tub-LWSS-fuse combination CornerSignalSystem += pattern("5b2o$5b2o3$2o2b2o$2o2b2o!", 86, 1) CornerSignalSystem += pattern(""" 11b2o$11b2o12$4b3o3b3o$4b3o3b3o$3bob2o3b2obo$3bob2o3b2obo$4b2o5b2o$5bo 5bo6$2o13b2o$2o2b2o5b2o2b2o$4b2o5b2o!""", 159, 0) # P46OscAlt1 really SignalSystem = pattern() for i in range(0,3): # place three sets of mechanisms to signal neighbors SignalSystem = SignalSystem[32](2047, 0, rcw) \ + HoneyBit(42, 111, rcw) + ReflectMWSS(38, 46) + GliderFromTheBlue(73, 52) \ + CornerSignalSystem + HoneyBit(964, 40) + GliderFromTheBlue[12](953, 52) # need to add the fourth (west) side separately because signal stops there, # so two-thirds of the pieces are customized or in slighly different locations # (could have started in SW corner and used range(0,4) for some of it, # but I happened to start in the NW corner and now I'm feeling lazy) # west edge: SignalSystem += HoneyBit(48, 1086, rcw) + pattern(""" 11b2o$12bo$12bob2o$13bobo$3bo$2bobo$2bobo$b2ob2o$4bo$b2o2bo7bo$2bo2bo 7bobo$o8b3o$2o9b3o2bo$9b2o4b2o$13b2o6$8bo3bo$8bo3bo3$5b2obo3bob2o$6b3o 3b3o$7bo5bo6$8b2ob2o$9bobo$9bobo$10bo!""", 52, 1059) # GliderFromTheBlue really # southwest corner: SignalSystem += pattern(""" 11b2o$12bo$12bob2o$13bobo$3bo$2bobo$2bobo$b2ob2o2$b2ob2o7b3o$2bob2o6bo 2bo$o13b2o$2o9bo3bo$11bo2b2o$13bob2o9$5b2o7b2o$5bob2o3b2obo$5bo3bobo3b o$5b2o2bobo2b2o$6b3o3b3o$7bo5bo4$8b2ob2o$9bobo6b2o$9bobo7bo$10bo5b3o$ 16bo!""", 52, 1885) # GliderFromTheBlue plus a terminating eater really SignalSystem += pattern(""" 24b2o$24b2o3$2o14b3o6b2o$2o12bo3bo6b2o$13bo4bo$13bo3bo2$3b3o7bo3bo$b2o bob2o5bo4bo$b2o5bo5bo3bo6b2o$b2obob2o8b3o6b2o$3b3o2$24b2o$24b2o! """, 0, 1818) # P46OscAlt1 really -- lengthened version of CornerSignalSystem SignalSystem += pattern("2o$2o2b2o$4b2o3$4b2o$4b2o!", 1, 1955) + pattern(""" 24b2o$24b2o2$14b3o$13bo4bo6b2o$12bo5bo6b2o$13bo$14b2o2$14b2o$13bo$2o 10bo5bo6b2o$2o11bo4bo6b2o$14b3o2$24b2o$24b2o!""", 9, 1961) # P46OscAlt1 really all += SignalSystem + GliderToMWSS + MWSS + Snake + BitKeeper all += GliderFromTheBlue(607, 1953) + GliderToLWSS + ReflectLWSS \ + ReflectLWSS2 + LWSStoBoat # all += StateBit # do this later on, when defining OFFcell and ONcell # slide 24: LWSS track -------------------- # [phase adjusters and a bunch of honeybits] PhaseAdjuster = P46Gun(2, 11, flip_y) + P46Gun[12](0, 32) \ + pattern("o$3o$3bo$2b2o!", 0, 13) \ + pattern("2b2o$bobo$bo$2o!", 2, 26) # eaters really all += PhaseAdjuster[43](1772,10) + PhaseAdjuster[26](2037, 1772, rcw) all += PhaseAdjuster[43](269, 2037, flip) + PhaseAdjuster[9](58, 1203, swap_xy_flip) # the third adjuster was a different shape in the original metacell, # but one of the same shape could be substituted with no ill effects LWSSPacketGun = pattern(""" 50b2o$52bo$37b2o10b2o2bo$37b2o11bo2bo$51bobo8bo$51b2o9b3o$65bo$40b2o9b 2o9b3o$38bo3b2o7bobo8bo$38bo4bo6bo2bo$38bo3b2o5b2o2bo$40b2o10bo$50b2o 5$52bo$52b3o$55bo$54b2o$41bo$41b3o$b2o5b2o34bo$b2o5b2o33b2o3$45b2o$43b o3bo5b2o9b2o$42bo5bo3bo2bo4b3o2bo$42bo4bo5bo4bo2b5o$42bo2bo7bo2b4o$43b obo8bob2o3bo$44bo8b2obob3o7b2o$55bo3bo8bobo$52b3o15bo$53bo16b2o$bo7bo$ b2o5b2o$b3o3b3o$3b2ob2o45b2o$3bo3bo22b2o21b2o$2o7b2o20bo$2o7b2o17b3o$ 4bobo21bo35b2o$o2bo3bo2bo53bobo$b3o3b3o56bo$66b2o$60b2o$60bo$b2o25b2o 31b3o$b2o25b2o33bo2$19b2o$17b2o2bo7b2o$17b6o6b2o$17b4o4$17b4o$17b6o6b 2o$17b2o2bo7b2o$19b2o2$28b2o$12bobo13b2o$13b2o$13bo5$17b2o$17b2o19$49b o3b3o$48bobo2b5o3b2o$48bo3b2o3b2o2b2o$49bo2bo3b2o$50b3o3bo2$50b3o3bo$ 49bo2bo3b2o$34b2o12bo3b2o3b2o2b2o$34b2o12bobo2b5o3b2o$49bo3b3o5$39bo$ 17b3o19b3o$17bo2bo21bo$17bo23b2o$17bo10bo$18bobo7b3o$31bo$30b2o$43bo3b o$42b5obo$41b3o4b2o$41b2ob5o$43b3o2$45bo$41bo2b3o$40b2obo3bo7b2o$34b2o 3b2ob3obo2b2o4bobo$34b2o3b3ob2o4b2o6bo$39b3o15b2o4$41bo$41bob3o$42bo3b o$13b2o3b2o8bo17bo$12bo2bobo2bo7bo2b2o10b2obo4b2o$11bo9bo5bo5bo11bo5bo bo$10b2o9b2o5bobo2b2o18bo$11bo9bo6bo3b2o3bo15b2o$12bo2bobo2bo9b3o4b3o 7b2o$13b2o3b2o20bo6bo$30b3o4b3o8b3o$28bo3b2o3bo12bo$12b2o14bobo2b2o$ 12b2o13bo5bo$28bo2b2o$28bo!""", 108, 710) all += LWSSPacketGun + pattern(""" b2o$b2o$7b3o$6bo3bo$6b2ob2o2$6b2ob2o$8bo4$bo7bo$o2bo3bo2bo$4bobo$4bobo $4bobo$o2bo3bo2bo$b3o3b3o8$3b2ob2o$4bobo$4bobo$5bo!""", 18, 725) # P46Osc really P46OscAlt1 = pattern(""" b2o$b2o2$6bo3b2o$2o2b2obob3o13b2o$2o2bo4b3o13b2o$4bo3bo$5b3o$19b2o3b2o $5b3o10b3o3b3o$4bo3bo7b3o7b3o$2o2bo4b3o4b3o7b3o$2o2b2obob3o4b3o7b3o$6b o3b2o6b3o3b3o$19b2o3b2o$b2o$b2o!""") all += P46OscAlt1(4, 24) + P46OscAlt1[12](224, 67, swap_xy_flip) P46OscAlt2 = pattern(""" 2o8b3o14b2o$2o8bo3bo12b2o$10bo4bo$11bo3bo2$11bo3bo7b3o$10bo4bo5b2obob 2o$2o8bo3bo5bo5b2o$2o8b3o8b2obob2o$23b3o!""") all += P46OscAlt2(179, 19) + P46OscAlt1[29](2023, 4, rcw) # got impatient here, started throwing in placeholders instead of true definitions -- # NE corner along E edge: all += pattern(""" b2o$b2o2$8b2o9b2o3b2o$2o5bobo8bob2ob2obo$2o4b2obo8bo7bo$7b2o9bob2ob2ob o$8bo10b2o3b2o2$8bo$7b2o$2o4b2obo15b2o$2o5bobo15b2o$8b2o2$b2o$b2o! """, 1980, 208) + pattern(""" 2b2o5b2o$2b2o5b2o15$b3o5b3o$2ob2o3b2ob2o$2obobobobob2o$bo3bobo3bo$bo2b o3bo2bo$2b3o3b3o6$9b2o$9b2o!""", 2018, 179) # both P46OscAlt really # SE corner: all += pattern(""" 24b2o$24b2o$14bo$13bo2bo$12b5o8b2o$11b2ob3o8b2o$12bob2o$13b2o2$13b2o$ 12bob2o$2o9b2ob3o8b2o$2o10b5o8b2o$13bo2bo$14bo$24b2o$24b2o! """, 2017, 2007) # P46OscAlt really # SE corner along S edge: all += pattern(""" 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o10$4bo7bo$3bobo5bobo$6bo3bo$3bo2bo3bo2b o$4bobo3bobo$6b2ob2o$3b2ob2ob2ob2o$3b2o2bobo2b2o$4b3o3b3o$5bo5bo4$4b2o $4b2o!""", 1823, 1980) + pattern(""" 20bo$15bo3bo$14bo8b2o2b2o$14bo2b2o5bo2b2o$15b2o5bobo$16b3o3b2o2$16b3o 3b2o$15b2o5bobo$2o12bo2b2o5bo2b2o$2o12bo8b2o2b2o$15bo3bo$20bo! """, 1840, 2018) # both P46OscAlt really # SW corner: all += pattern(""" 4b2o4b3o$4b2o3bo3bo$9b2ob2o$10bobo2$10bobo$9b2ob2o$9bo3bo$10b3o9$3b3o 5b3o$3bo2b2ob2o2bo$4b3o3b3o$5bo5bo4$2o13b2o$2o2b2o5b2o2b2o$4b2o5b2o! """, 24, 2017) # P46OscAlt really # SW corner along W edge: all += pattern(""" 24b2o$24b2o3$2o14b2o7b2o$2o15b2o6b2o$13b5o$13b4o2$3b2o8b4o$2bobob2o5b 5o$b2o3b2o9b2o6b2o$2bobob2o8b2o7b2o$3b2o2$24b2o$24b2o! """, 41, 1769) + pattern(""" b2o5bo$b2o4bobo$6bo3bo$6bo3bo$5b3ob3o$6bo3bo$6b2ob2o$7bobo$8bo5$3bo3bo $3bo3bo3$2obo3bob2o$b3o3b3o$2bo5bo8$b2o5b2o$b2o5b2o! """, 6, 1786) # both P46OscAlt really # LWSS -> G -> LWSS timing adjustment, middle of W edge: all += pattern(""" b2o5b2o$b2o5b2o16$3o5b3o$o2b2ob2o2bo$b3o3b3o$2bo5bo7$b2o$b2o! """, 10, 1217) + pattern(""" 4bo$2b5o10bo$bo2bob2o9b2o8b2o$o7bo9b2o7b2o$bo2bob2o5b2o2b2o$2b5o$4bo2$ 13b2o2b2o$2o16b2o7b2o$2o15b2o8b2o$17bo! """, 35, 1269) # both P46OscAlt really # final LWSS reflector, middle of W edge: all += pattern(""" 15bo$14b2o$13b3obo9b2o$12b2o13b2o$3bo9b2o$b3o10bo$o$b3o10bo10bo$3bo9b 2o8b2obo$12b2o8b2ob3o$13b3obo5bo2bo$14b2o8b2o$15bo! """, 8, 973) # P46Osc really # slide 25: decode -------------------- # sync buffer: all += pattern(""" b2o5b2o$b2o5b2o7$2bo5bo$b3o3b3o$o2b2ob2o2bo$3o5b3o9$b3o$o3bo$2ob2o$bob o2$bobo$2ob2o$o3bo3b2o$b3o4b2o!""", 150, 958) # P46OscAlt3 really all += pattern(""" 10b2o$2o6b2ob2o14b2o$2o6bo2bo15b2o$8bo2bo$9b2o2$9b2o$8bo2bo$8bo2bo15b 2o$8b2ob2o14b2o$10b2o!""", 155, 998) # P46OscAlt3 really all += pattern(""" 15bobo2b2o$2o12bo3bob3o4b2o$2o13bo6b2o3b2o$16b5obo$19b3o2$19b3o$16b5ob o$2o13bo6b2o$2o12bo3bob3o$15bobo2b2o!""", 114, 1008) # P46OscAlt3 really all += pattern(""" b2o$b2o11$2bo5bo$bobo3bobo$o3bobo3bo$o3bobo3bo$o9bo2$b2o5b2o3$3b2ob2o$ 4bobo$3b2ob2o$4bobo$3b2ob2o$4bobo$4bobo$5bo!""", 141, 1024) # P46OscAlt3 really # P46 to P40 converter: all += pattern(""" 14bo$14b3o$17bo$16b2o50bo$10b2o54b3o$11bo53bo$11bobo51b2o$12b2o57b2o$ 48b2o21bo$48bo20bobo$33bo12bobo20b2o$33b3o10b2o$36bo$35b2o2$6b2o$7bo 22bo$7bobo19b2o$8b2o10bo4bo49b2o$19b2o3b2o30bo18bo$18b2o3b2o29b4o15bob o$19b2o4bo27b2o3b2o13b2o$20b2o34bo3bo$56bo3bo$56bo2b2o$54bo3bo2$33b2o$ 33bo$34b3o$36bo11b2o$22b2o25bo$22bo23b3o$19bo3b3o20bo$17b3o5bo33b2o$ 16bo43bo$16b2o39b3o8bo$30bo26bo8b3o$28b3o34bo$27bo37b2o$27b2o42b2o$48b 2o21bo$17b2ob2o26bo20bobo$17b2ob2o11bo12bobo20b2o$33b3o10b2o$24b2o10bo $24b2o9b2o21b2o$58b2o$16b2o$2b2o11b2obo15bo$bobo12bob4o13bo$bo15bo2b3o 10b3o39b2o$2o16bo3bo52bo$18b4o51bobo$20bo8b3o34b2o5b2o$31bo21b3o7bo2b 3o$17b2o11bo21b2ob2o2b4o2bo2bo$17b2o15b2o15bo4b2ob4ob2o2bo$34b2o16b6o 6b2obo$53b2o2bo8bo$6b2o49b2obo$5bobo50bobo$5bo52bo$4b2o42b2o$10b2o37bo $11bo34b3o$8b3o35bo$8bo50b2o$60bo$57b3o$8bo48bo$6bobo$7bobo$7bo2$19b2o $19b2o4$2b2o13b2o$3bo11bo2bo$3bobo9bo2bo$4b2o8b2ob2o$13b2ob2o$12b2o3b 2o$13b3o2bo$18bo$15bobo15b2o$16bo16bobo$35bo$35b2o$29b2o$29bo$30b3o$ 32bo$18b2o$18bo$14bo4b3o$14b3o4bo$17bo$16b2o50bo$10b2o54b3o$11bo53bo$ 11bobo51b2o$12b2o57b2o$48b2o21bo$48bo20bobo$23b2o8bo12bobo20b2o$23b2o 8b3o10b2o$36bo$35b2o21b2o$58b2o$6b2o16bo$7bo15b3o$7bobo8bo3bo$8b2o7b3o bob2o8bo41b2o$16bo3b2obo8bobo19bo20bo$18b4o2bo7bo2bo17bobo3bobo4bo6bob o$12b5o2bo4bo5bo4bo16bo3b3obobo2bobo5b2o$12bo2b3o4bo2bo3bo5bo15b2o2bo 4bobobo3b2o$12b2o9b2o5bo3bo15b2ob3o5bo3b2o$31b2o16bo4bo$50b4o6b2o4bo2b o$51b2o6bo6bobo$33b2o24b3o4b2o$33bo24b2o$34b3o21bo$36bo11b2o$14bo7b2o 25bo$14b3o5bo23b3o$17bo5b3o20bo$16b2o7bo33b2o7bo$10b2o48bo5b3o$11bo45b 3o5bo$11bobo43bo7b2o$12b2o57b2o$48b2o21bo$18b2o28bo20bobo$18b2o13bo12b obo20b2o$33b3o10b2o$20bo15bo26b2o$14b3o3b2ob2o10b2o26b2o$14b2o5bobobo 32bo$6b2o8bo4bob2o31b2obo$7bo12b3o37bo5b2o$7bobo6b2o2bobo33b2o2bo5b2o$ 8b2o6b6o37bob2o12b2o$16b3o4b2o32bobob2o3b2o7bo$23b2o34bo2bo3b2o5bobo$ 57bob2o12b2o$59bob2o$60b2o4$33b2o$33bo$34b3o$36bo11b2o$14bo7b2o25bo$ 14b3o5bo23b3o$17bo5b3o20bo$16b2o7bo33b2o7bo$10b2o48bo5b3o$11bo45b3o5bo $11bobo43bo7b2o$12b2o57b2o$48b2o21bo$48bo20bobo$33bo12bobo20b2o$33b3o 10b2o$36bo$35b2o2$6b2o$7bo10b3o8b2o$7bobo7bo2bo4bo3b2o$8b2o6bo3bo3bobo 48b2o$16bo7bobo25bo22bo$19bo32b2o19bobo$16b2obo37bo4bo10b2o$57b2o3b2o$ 58b2o3b2o$19bob2o34bo4b2o$19b3o39b2o$20bo$33b2o$33bo$34b3o$36bo11b2o$ 22b2o25bo$22bo23b3o$19bo3b3o20bo$17b3o5bo33b2o$16bo43bo$16b2o39b3o8bo$ 30bo26bo8b3o$28b3o34bo$27bo37b2o$27b2o42b2o$48b2o21bo$17b2ob2o26bo20bo bo$17b2ob2o11bo12bobo20b2o$33b3o10b2o$16b2o6b2o10bo$14bo3bo5b2o9b2o21b 2o$13bo4b2o38b2o$13bo5bo$2b2o$bobo10bo4bo$bo12b2obob2obo34b3o15b2o$2o 30bo2b3o19b4o14bo$31bo3bobo14b2o3b2ob2o3b2o6bobo$32bob3o14bo7bo5b3o5b 2o$49bo2bo5b3o3bob3o$49bo2bo5b2obo2b2obo$34b2o12bo3bo8b2ob2obo$34b2o 13b3o7bobo3bobo$60bo4bo2bo$6b2o57b3o$5bobo50b2o6bo$5bo52b2o$4b2o42b2o$ 10b2o37bo$11bo34b3o$8b3o35bo$8bo50b2o$60bo$57b3o$8bo48bo$6bobo$7bobo$ 7bo2$19b2o$19b2o4$2b2o$3bo$3bobo$4b2o4b4o$9b2o2bo5b2o$8b2o2bo4bobob2o$ 9bo2bo2b2o5bo$10b2o6bo3bo$15bo5bo11b2o$16b4o13bobo$18bo16bo$35b2o$29b 2o$29bo$30b3o$32bo$18b2o$18bo$19b3o$21bo!""", 116, 1059) # really 14 p184 guns # logic core latches: all += pattern(""" 24bo2bo$14b3o7bo$13bo4bo9bo$12bo5bo8b2o$3bo9bo8bo$b3o10b2o8b2o$o$b3o 10b2o8b2o$3bo9bo8bo3bo$12bo5bo4bo2bo$13bo4bo4bo2bo$14b3o7b2o! """, 33, 1332) # P46Osc really all += pattern(""" 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o2$4b3o3b3o$4bo2bobo2bo$3bo3bobo3bo$4bo 2bobo2bo$6bo3bo$4b2o5b2o$3b3o5b3o$3b3o5b3o5$10b3o$10b3o$9b5o$8b2o3b2o$ 8b2o3b2o4$8b2o3b2o$4b2o2b2o3b2o$4b2o3b5o$10b3o$10b3o!""", 35, 1348) # P46OscAlt1 really all += pattern(""" b2o$b2o2$13bobo2b2o$2o10bo3bob3o$2o11bo6b2o$14b5obo$17b3o2$17b3o$14b5o bo$2o11bo6b2o3b2o$2o10bo3bob3o4b2o$13bobo2b2o2$b2o$b2o! """, 24, 1661) # P46OscAlt1 really all += pattern(""" b2o$b2o12$b3o3b3o$b3o3b3o$ob2o3b2obo$ob2o3b2obo$b2o5b2o$2bo5bo3$3b2ob 2o$4bobo$4bobo$4bobo$3b2ob2o$4bobo$4bobo$5bo!""", 49, 1679) # P46Osc really all += pattern(""" b2o$o2bo$o7bo$o2bo3bobo$2ob2ob2ob2o$4bobo$3b2ob2o5$b3o3b3o$o9bo$o3bobo 3bo$b3o3b3o$2bo5bo10$3b2ob2o$4bobo$4bobo$5bo!""", 140, 1546) # P46Osc really all += pattern(""" 2b3o$2b3o4b2o$bo3bo3b2o$o5bo$b2ob2o2$b2ob2o$o5bo$bo3bo$2b3o$2b3o7$b2o 7b2o$bob2o3b2obo$bo3bobo3bo$b2o2bobo2b2o$2b3o3b3o$3bo5bo6$2b2o5b2o$2b 2o5b2o!""", 184, 1538) # P46OscAlt3 really all += pattern("2o$o$b3o$3bo!", 159, 1537) # eater really # slide 26: read B/S table -------------------- # most of the B/S logic latches -- missing some reflectors off to the left (?) # TODO: take this apart and integrate with missing pieces all += pattern(""" 34bo$33bobo$33bobo$32b2ob2o11$30bo7bo22b2o5b2o$29bobo5bobo21b2o5b2o$ 32bo3bo$29bo2bo3bo2bo$30bobo3bobo$32b2ob2o$29b2ob2ob2ob2o$29b2o2bobo2b 2o$30b3o3b3o$31bo5bo23b3o3b3o$60bo2bo3bo2bo$60b2obo3bob2o2$37b2o$37b2o 6$62bo$60b2ob2o$60b2ob2o15b2o5b2o$80b2o5b2o$59bobobobo2$60b2ob2o$61b3o 4b2o$62bo5b2o4$81bo5bo$80b3o3b3o$80bob2ob2obo$82b2ob2o$82b2ob2o$82b2ob 2o6$80b3o$80b3o2$79b2ob2o$79bo3bo$80b3o$81bo5b2o$87b2o199$51bo$50bobo$ 50bobo$49b2ob2o13$47bo7bo$46b4o3b4o$46bo3bobo3bo$47bo2bobo2bo$47b3o3b 3o7$47b2o$47b2o9$62b3ob3o9b2o$61bob2ob2obo7b2ob2o6b2o$60b2o7b2o7bo2bo 6b2o$61bob2ob2obo8bo2bo$62b3ob3o10b2o2$79b2o$78bo2bo$61b2o15bo2bo6b2o$ 61b2o14b2ob2o6b2o$78b2o5$80b2o5b2o$80b2o5b2o11$81bo5bo$80bobo3bobo$79b o3bobo3bo$79bo3bobo3bo$79bo9bo2$80b2o5b2o4$82bo3bo$80b2o$79bo3bobo3b2o $79bo3bobo$80b3o$87bo2bo$87b2o12$8b2o$8b2o13$b2o5b2o$o2bo3bo2bo$bo2bob o2bo$4bobo$2b3ob3o$3o5b3o$2o7b2o$2o7b2o$bob2ob2obo$bob2ob2obo2$3b2ob2o $4bobo$4bobo$5bo26$9bo$8bobo$8bobo$7b2ob2o11$5b2o5b2o$4bo2bo3bo2bo$7b 2ob2o$6bobobobo$6bobobobo$4bo9bo$3bo11bo2$7b2ob2o$5bo2bobo2bo$5b3o3b3o 3$5b2o$5b2o38$10bo$9bobo28bo$9bobo21b2o4bobo$8b2ob2o20bo5bobo$31bobo4b 2ob2o$18b2o11b2o$19bo18b2ob2o$19bobo$20b2o16b2ob2o3$23b2o$22bobo11bo7b o$24bo$6b2o5b2o19b3o7b3o$5bo2bo3bo2bo19b2ob2ob2ob2o$6bo2bobo2bo15b2o4b 3o3b3o$9bobo18bobo4bo5bo$7b3ob3o16bo$5b3o5b3o$5b2o7b2o$5b2o7b2o$6bob2o b2obo$6b3o3b3o$7bo5bo$9b3o3b3o$8bo2bo3bo2bo$12bobo$8b2o7b2o$8b2o7b2o$ 11bo3bo$11b2ob2o$9b3o3b3o$9b2o5b2o16bo5bo$9bo7bo15bobo3bobo$32bo3bobo 3bo$32bo3bobo3bo$32bo9bo2$33b2o5b2o3$35b2ob2o$36bobo$35b2ob2o$11b2ob2o 20bobo$12bobo20b2ob2o$12bobo21bobo$13bo22bobo$37bo3$52b2o$51b5o$35b2o 14bo4bo5b2o$35b2o14b3o2bo5b2o$52bo2b2o$53b2o$37bo3bo$35b2obobob2o9b2o$ 34bob2o3b2obo7bo2b2o$33bo2bo5bo2bo5b3o2bo5b2o$34bob2o3b2obo6bo4bo5b2o$ 35b2obobob2o7b5o$37bo3bo10b2o8$19b2o$18bo2bo$18bobo2bo$19bo$20b2obo$ 22bo3$21b2o$21b2o4b3o$27b3o$26bo3bo$26b2ob2o$26bo3bo$27bobo$27bobo$28b o5$23b2ob2o$22bo5bo2$21bo7bo$21bo2bobo2bo$21b3o3b3o9$21b2o5b2o$21b2o5b 2o23$9bo2bo$12bo7b3o$8bo9bo4bo$8b2o8bo5bo35bo$14bo8bo36b2o$11b2o8b2o 24b2o9bob3o$47b2o13b2o$11b2o8b2o38b2o$14bo8bo37bo$8b2o8bo5bo10b2o$8bo 9bo4bo11b2o24bo$12bo7b3o38b2o$9bo2bo34b2o13b2o10b2o$47b2o9bob3o11b2o$ 60b2o$60bo!""", 108, 1317) # slide 27: boat logic -------------------- all += pattern(""" 32b4o$31b2o2bo$30b2o2bo$26bo4bo2bo25b2o$24b3o5b2o25b2ob2o$23bo36bo2bo$ 24b3o5b2o26bo2bo4bo$26bo4bo2bo26b2o5b3o$30b2o2bo36bo$31b2o2bo25b2o5b3o $32b4o7bo16bo2bo4bo$41b2o17bo2bo$42b2o15b2ob2o$60b2o3$b2o$b2o2$14b4o$ 2o12bo2b2o$2o13bo2b2o$15bo2bo$16b2o2$16b2o15b2ob2o$15bo2bo12bobo3bo$2o 13bo2b2o5b2o3bobo3bo$2o12bo2b2o6b2o3bo4bo$14b4o11b2o5b3o$38bo$b2o$b2o! """, 209, 1852) # P46Osc plus P46Gun plus custom eater really # boat-logic: need to add outlying pieces to west, break up into 12 all += pattern(""" 119bo$35b2o81b2ob2o$34b5o11b2o54b2o10b2o2bo3b2o217b2o$34bo4bo11bo53bo 2bo11bob2o3bo217bo7b3o5b4o$34b3o2bo10bo49bo4bo2b2o9bo2bo3bo219bo6bo7b 2obo$21bo13bo2b2o11b3o43bo3bo3bo2bo11b2o5b3o213b3o7b2obo7bo10bo$19b3o 14b2o15bo41b7o5bo12bo8bo213bo11b2o5b2o11b3o$18bo75bo283bo$19b3o14b2o 57b7o5bo247b2o5b2o11b3o$21bo13bo2b2o57bo3bo3bo2bo246b2o7bo10bo$34b3o2b o60bo4bo2b2o251b2obo$34bo4bo65bo2bo252b4o$34b5o4b2obo59b2o11b2obo227bo $35b2o6b2ob3o70b2ob3o223b6o$49bo75bo221bo4bo$43b2ob3o70b2ob3o223b3ob2o $41bo2bobo70bo2bobo227bobo2bo$41b2o74b2o235b2o11$53bo37b2o$48bo3bo28b 2o7bobo187bo3bo$47bo7bo25b2o6b2obo186bo5bo$47bo2b2o5bo32b2o14bo107bobo 2b2o58bo$36bo11b2o5b2obo32bo14b3o90b2o12bo3bob3o4b2o43bo7b2o3bo8bo$34b 3o12b3o3b2ob3o48bo89b2o13bo6b2o3b2o41b3o9b3o9b3o$33bo27bo29bo14b3o106b 5obo46bo27bo$34b3o12b3o3b2ob3o29b2o14bo111b3o48b3o9b3o9b3o$36bo11b2o5b 2obo30b2obo17bo88bobo3bobo63bo7b2o3bo8bo$47bo2b2o5bo32bobo17b3o88bo3bo 12b3o58bo$47bo7bo35b2o20bo83bo11bo5b5obo57bo5bo$48bo3bo59b2o82bo3bo5bo 3bo3bo6b2o3b2o52bo3bo$53bo143bo11bo3bo3bob3o4b2o$201bo3bo8bobo2b2o$ 199bobo3bobo12$2b2o5b2o$2b2o5b2o$59bo229bob2o$58b2o228bo2b2o2b3o$57b2o 229bo6b2o$51bo6b2o2b2o9bo101b2o109b4o3b3o12bo$49b3o21b3o99bo108b3o3bo 3bo13b3o$48bo27bo99b3o70bo33bo27bo$49b3o21b3o102bo70b3o32b3o3bo3bo13b 3o$51bo6b2o2b2o9bo178bo33b4o3b3o12bo$57b2o192b2o35bo6b2o$58b2o228bo2b 2o2b3o$59bo229bob2o$2b3o3b3o$2b3o3b3o$bob2o3b2obo$bob2o3b2obo$2b2o5b2o $3bo5bo4$4b2ob2o$3bo5bo$b5ob2ob2o$2ob3ob2ob2o$3o6bo$bobo$2b2o263b4o5b 6o$212b6o5b4o40bob2o7b4o$212b4o7b2obo40bo7bob2o$76b2o46b2o89b2obo7bo 41b2o5b2o$75bo2bo44bo2bo90b2o5b2o$76b2o46b2o142b2o5b2o$217b2o5b2o41bo 7bob2o$215b2obo7bo26b2o12bob2o7b4o$212b4o7b2obo12b2o12b2o12b4o5b6o$ 212b6o5b4o12b2o!""", 679, 1875) # P46Osc1-4 boat logic # mystery stuff along bottom edge that needs a home in a slide: all += pattern(""" b2o5b2o$b2o5b2o14$3o5b3o$3o5b3o$b2o5b2o$3bo3bo$bo2bobo2bo$o3bobo3bo$bo 2bobo2bo$b3o3b3o5$8b2o$8b2o!""", 514, 1887) # P46OscAlt3 really all += pattern(""" 4bo7b2o$3b2o6bo2bo$2bo8bo2b2o$3b2obo4bo2bo10bo$4b3o6bo11b3o$28bo$4b3o 6bo11b3o$bob2obo4bo2bo10bo$o10bo2b2o$o3bo6bo2bo$b4o7b2o! """, 791, 1929) # P46Osc really all += pattern(""" 8bo$9bo3bo$2o2b2o8bo$2o2bo5b2o2bo$4bobo5b2o11bo$5b2o3b3o12b3o$28bo$5b 2o3b3o12b3o$4bobo5b2o11bo$4bo5b2o2bo$4b2o8bo$9bo3bo$8bo! """, 845, 1905) # P46Osc really all += pattern(""" 10b2o$2o6b2ob2o14b2o$2o6bo2bo15b2o$8bo2bo$9b2o2$9b2o10b3ob3o$8bo2bo8bo b2ob2obo$2o6bo2bo7b2o7b2o$2o6b2ob2o7bob2ob2obo$10b2o9b3ob3o! """, 1050, 1903) # P46OscAlt2 really all += pattern(""" 9b2o$9b2o11$2b3o3b3o$bo3bobo3bo$o3b2ob2o3bo$ob2o5b2obo$2bo7bo11$2b2o5b 2o$2b2o5b2o!""", 1088, 1920) # P46OscAlt2 really all += pattern(""" 11bo$10b4o9bo$2b2o4b2o3bo9bo2b2o$2bo5b2o12bo5bo$3bo4b3o12bobo2b2o$3o 20bo3b2o3bo$o24b3o4b3o$35bo$25b3o4b3o$23bo3b2o3bo$23bobo2b2o$22bo5bo$ 7bob2o12bo2b2o$5b3ob2o12bo$4bo$5b3ob2o$7bobo2bo$11b2o! """, 1106, 1875) # P46OscAlt4 (boat-bit catcher?) really [not defined yet] all += pattern(""" 25bobo$26bo$17b2o13b2o$16b2ob2o12bo$17bo2bo11bo$3bo13bo2bo4b2o6b3o$b3o 14b2o15bo$o$b3o14b2o$3bo13bo2bo$17bo2bo$16b2ob2o$17b2o6b2obo$25b2ob3o$ 31bo$25b2ob3o$23bo2bobo$23b2o!""", 1227, 1875) # P46OscAlt4 really all += pattern("2o$obo$2bo$2b2o!", 1281, 1873) # eater all += pattern(""" 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o4$4b3o3b3o$4bo2bobo2bo$3bo3bobo3bo$3b4o 3b4o$4bo7bo7$5bo$4b3o$3bo3bo$3b2ob2o$3b2ob2o2$3b2ob2o$3b2ob2o$3bo3bo3b 2o$4b3o4b2o$5bo!""", 1375, 1980) # P46OscAlt1 really # slide 28: clean up and start over -------------------- LWSSToGlider = pattern(""" 4b2o5b2o$2obobo5bobob2o$2ob2o7b2ob2o$2b6ob6o$4bob2ob2obo2$2bo11bo$3bo 9bo$5bobobobo$5bobobobo$6b2ob2o$3bo2bo3bo2bo$4b2o5b2o13$4b2o$4b2o! """, 443, 1980) # slide 29: toggle dist [not sure what that means, actually] -------------------- BoatLatchNE = pattern(""" 78b2o5b2o$78b2o5b2o15$77b2o7b2o$77bob2o3b2obo$77bo3bobo3bo$46b2o5b2o 22b2o2bobo2b2o$46b2o5b2o23b3o3b3o$79bo5bo4$47bo5bo$46b3o3b3o$45bo2b2ob 2o2bo22b2o$45bo3bobo3bo22b2o$47bobobobo2$44b2ob2o3b2ob2o$46bo7bo5$47bo $46b3o$45bo3bo$44bo5bo$44bo5bo$45bo3bo2$45bo3bo$44bo5bo$44bo5bo2b2o$ 45bo3bo3b2o$46b3o$47bo7$45b2o$45bo$46b3o$48bo20$13b2o$15bo$2o10b2o2bo 10b2o$2o11bo2bo10b2o$14bobo$14b2o2$14b2o$14bobo$2o11bo2bo$2o10b2o2bo$ 15bo$13b2o12$47b4o$46b2o2bo14b2o$45b2o2bo15b2o$46bo2bo$47b2o2$47b2o$ 46bo2bo$38b2o5b2o2bo15b2o$38b2o6b2o2bo14b2o$47b4o!""", 120, 232) # four P46osc really BoatLatchSW = pattern(""" 76bo$75bo2bo$74b5o10b2o$73b2ob3o10b2o$74bob2o$75b2o72b2o5b2o$145b2o3bo 5bo3b2o$75b2o68bo15bo$74bob2o68bo13bo$62b2o9b2ob3o10b2o$62b2o10b5o10b 2o$75bo2bo$76bo2$149b2o5b2o$149b2obobob2o$73b2o74bo2bobo2bo$73b2o74b3o 3b3o2$82b2o$72b2o7bo2b2o11b2o$57b2o5b2o6b2o6b6o11b2o$53b2o2b2o5b2o2b2o 12b4o77b2o89bo$53b2o13b2o93b2o84bo3bo$173bo60b2o12bo8b2o2b2o$173b2o59b 2o12bo2b2o5bo2b2o$6bo75b4o76b2o7bob3o11b2o60b2o5bobo$5bobo64b2o6b6o76b 2o11b2o10b2o61b3o3b2o$5bobo64b2o7bo2b2o88b2o$4b2ob2o73b2o90bo75b3o3b2o $156b2o64b2o25b2o5bobo$57b3o3b3o7b2o81b2o16bo48bo24bo2b2o5bo2b2o$56bo 3bobo3bo6b2o99b2o47bobo22bo8b2o2b2o$55bo3b2ob2o3bo94b2o11b2o47b2o23bo 3bo$55bob2o5b2obo94b2o7bob3o78bo$57bo7bo107b2o$173bo$163b2o$163b2o3$ 57b3o$b3o5b3o45bobo$2ob2o3b2ob2o43bo3bo$2obobobobob2o43bo3bo$bo3bobo3b o$bo2bo3bo2bo45b3o4b2o$2b3o3b3o53b2o6$2b2o$2b2o37$27b2o90b2o$27b2o81b 2o7b2o79b2o$110b2o88b2o$47b3o53b3o25bobo2b2o$26b2o6b3o8b2obob2o50bo3bo 11b2o10bo3bob3o$26b2o6bo3bo5bo5b2o50b2ob2o11b2o11bo6b2o54bo5bo$34bo4bo 5b2obob2o80b5obo54b3o3b3o$35bo3bo7b3o52b2ob2o28b3o55bob2ob2obo$104bo 87b2o7b2o$35bo3bo95b3o54b2o7b2o$34bo4bo92b5obo53b3o5b3o$26b2o6bo3bo12b 2o65b2o11bo6b2o3b2o49b3ob3o$26b2o6b3o14b2o50bo7bo6b2o10bo3bob3o4b2o51b obo$102bo2bo3bo2bo18bobo2b2o55bo2bobo2bo$106bobo83bo2bo3bo2bo$27b2o77b obo10b2o72b2o5b2o$27b2o77bobo10b2o$102bo2bo3bo2bo$103b3o3b3o7$99b2o13b 2o73b2o13b2o$99b2o2b2o5b2o2b2o73b2o2b2o5b2o2b2o$103b2o5b2o81b2o5b2o! """, 1534, 1849) # really eleven P45OscAlt1 plus an eater all += BoatLatchNE + BoatLatchSW + pattern(""" 273b2o$272bo2bo$140b2o130bobobo10b2o2bobo$140b2o131bo2bo3b2o4b3obo3bo 12b2o$277bo2b2o3b2o6bo13b2o$274bobo9bob5o$287b3o2$287b3o$286bob5o$285b 2o6bo13b2o$286b3obo3bo12b2o$287b2o2bobo3$175b2o$140b3o3b3o22bobo2bo$ 140bo2bobo2bo20b3ob2o79b2o$140b2obobob2o19bo84bo2bo$140b2o5b2o20b4o80b o7bo$171bob2o13bo64bo2bo3bobo$188b2o63b2ob2ob2ob2o$189b2o66bobo$184b2o 2b2o6bo42b2o15b2ob2o$142b2ob2o28bobo18b3o40b2o$140bo2bobo2bo26bobo21bo 3bo$140bobo3bobo15bo10b2o19b3o4b3o5b2o11b4o$140b3o3b3o15b3o9bo7b2o2b2o 6bo9bo4bo3b2o6b2o2bo12b2o$140b2o5b2o18bo5b2obobo10b2o14bo3bobo3b2o5b2o 2bo13b2o12b3o3b3o$140b2o5b2o17bo11bo9b2o14bo3bobo12bo2bo26bo9bo$140b2o 5b2o17b2o6bo2bo10bo15b2ob2o15b2o27bo3bobo3bo$176b2o76b3o3b3o$224b2o29b o5bo$223bo2bo$222b2o2bo13b2o$223b2o2bo12b2o$224b4o2$11b2o226b2o$10bobo 226b2o$10bo30b2o$9b2o30b2o226b2o5b2o$33b2o4bo13bo3b3o55b2o63b2o74b2ob 2o4b2obobo5bobob2o$33bo3b3o12bobo2b5o53bo7b3o5b4o35b2o6b2ob2o15b2o57bo bo5b2ob2o7b2ob2o$34bo3bobo11bo3b2o58bo6bo7b2obo35b2o6bo2bo17b2o34b2o5b 2o13bobo7b6ob6o$31b3o5b2o12bo2bo3b2obo49b3o7b2obo7bo10bo32bo2bo16bo7b 4o21b2o2b2o5b2o2b2o10bo10bob2ob2obo$31bo22b3o3b2ob3o47bo11b2o5b2o11b3o 31b2o25bo2b2o20b2o13b2o$66bo81bo58bo2b2o55bo11bo$54b3o3b2ob3o59b2o5b2o 11b3o31b2o26bo2bo4bo52bo9bo$53bo2bo3b2obo61b2o7bo10bo32bo2bo26b2o5b3o 52bobobobo$52bo3b2o73b2obo35b2o6bo2bo36bo51bobobobo$52bobo2b5o69b4o35b 2o6b2ob2o25b2o5b3o53b2ob2o$38bob2o11bo3b3o60bo59b2o25bo2bo4bo52bo2bo3b o2bo$36b3ob2o76b6o83bo2b2o23bo7bo25b2o5b2o$35bo81bo4bo83bo2b2o$36b3ob 2o76b3ob2o82b4o23b3o7b3o$38bobo2bo76bobo2bo108b2ob2ob2ob2o$42b2o80b2o 109b3o3b3o$236bo5bo2$114bo$10b2o9b3ob3o82b2o2bo$8b2ob2o7bob2ob2obo80bo 5bo$8bo2bo7b2o7b2o78b2o2bobo$3bo4bo2bo8bob2ob2obo80b2o3bo12bo$b3o5b2o 10b3ob3o82b3o14b3o$o129bo138b2o$b3o5b2o99b3o14b3o107b2ob2o27b2o$3bo4bo 2bo97b2o3bo12bo110bobo$8bo2bo15b2o73b2o4b2o2bobo123bobo$8b2ob2o14b2o 73b2o5bo5bo123bo$10b2o98b2o2bo$114bo13$170b2o2b2o4bo2b2o12b2o$170b2ob 2o6b2obo12b2o$174bobo6bo$175b2o4b3o2$175b2o4b3o$174bobo6bo$170b2ob2o6b 2obo$170b2o2b2o4bo2b2o!""", 178, 1939) # really P46Guns and Oscs, etc. all += pattern(""" 4b2o5b2o$2o2b2o5b2o2b2o$2o13b2o8$5bo5bo$4b3o3b3o$3b2ob2ob2ob2o$2b3o7b 3o2$4bo7bo5$5bo$4b3o$3bo2bo$3bobobo$4b3o$5bo5b2o$11b2o! """, 557, 1931) # P46OscAlt1 really # this particular one reflects a B signal from the above sync-buffer circuitry; # the resulting LWSS is converted to a glider which is stored as a boat-bit. # a few more outlying LWSS reflectors: all += pattern(""" 12b3o$10bo4bo11b2o$10bo5bo10b2o$3bobobo7bo$b7o5b2o$o$b7o5b2o$3bobobo7b o$10bo5bo$10bo4bo$12b3o!""", 257,1840) + pattern(""" 15b2o$13b2o2bo$13b6o$13b4o4bo3bo$21b7o$28bo$21b7o$13b4o4bo3bo$2o11b6o$ 2o11b2o2bo$15b2o!""", 885, 2033) # both P46Osc really # slide 30: HWSS control -------------------- HWSSGun = pattern(""" 21b2o23b2o$22bo22bobo$22bobo$23b2o$36b4o8bo$36bob2o7b2o$36bo$37b2o2$ 37b2o$36bo$7b2o2bobo22bob2o7b2o$2o4b3obo3bo21b4o8bo$2o3b2o6bo$6bob5o$ 7b3o35bobo$46b2o$7b3o$6bob5o14b2o$2o3b2o6bo8bo5bo$2o4b3obo3bo7bo4bo4b 2o$7b2o2bobo12b3o3b2o$23bob2ob2o$25bo$22bo2b3o11b2o$2b2o18b2o2b2o9bo4b o$2b2o20bo2bo15bo$24b3o10bo5bo$16b2o20b6o$b2o13bobo$b2o13bob2o$17b2o$ 17bo13b2o$30bobo$17bo13bo67b2o$17b2o80b2o$b2o13bob2o29b2o2bo4b2o16b2o 3b2o8bo$b2o13bobo30bob2o6b2o14bo2bobo2bo7bo2b2o$16b2o20bo11bo6bobo14bo 9bo5bo5bo3b2o$36b3o11b3o4b2o14b2o9b2o5bobo2b2o2b2o$2b2o31bo38bo9bo6bo 3b2o$2b2o32b3o11b3o4b2o16bo2bobo2bo9b3o$38bo11bo6bobo16b2o3b2o$24bo24b ob2o6b2o32b3o$23b3o23b2o2bo4b2o31bo3b2o$23bob2o35bo12b2o14bobo2b2o2b2o $24b3o11b2o22b2o11b2o13bo5bo3b2o$24b3o11bobo20bobo27bo2b2o$20b3ob3o13b o50bo$24b3o11b3o5bo52b2o$24b2o20b3o50b2o$2b2o45bo$2b2o19bo22b3o$11bo 10bo15b3o5bo$7b2o2bo10bo17bo$b2o3bo5bo25bobo$b2o2b2o2bobo12bo13b2o$6b 2o3bo38b2o$7b3o41b2o$50bo$7b3o$6b2o3bo$b2o2b2o2bobo$b2o3bo5bo48b2o$7b 2o2bo13b2o34b2o$11bo13bobo$2b2o23bo16b3o3bo$2b2o23b2o13b5o2bobo10b2o$ 41b2o3b2o3bo10b2o$42b2o3bo2bo$43bo3b3o2$43bo3b3o$42b2o3bo2bo$41b2o3b2o 3bo10b2o$42b5o2bobo10b2o$42bob3o3bo$40b2o$34b2o4b3o18b2o$34b2o3bo3bo 17b2o$38bo5bo$39b2ob2o2$39b2ob2o$38bo5bo$39bo3bo$40b3o$40b3o7$33b2o7b 2o$33bob2o3b2obo$33bo3bobo3bo$33b2o2bobo2b2o$34b3o3b3o$35bo5bo6$34b2o 5b2o$34b2o5b2o3$40bo2bo$30b3o7bo$16b2o11bo4bo9bo$16b2o10bo5bo8b2o$29bo 8bo$30b2o8b2o2$30b2o8b2o$29bo8bo3bo$16b2o10bo5bo4bo2bo$16b2o11bo4bo4bo 2bo$30b3o7b2o4$79b2o$78bo2bo$73bo7bo$72bobo3bo2bo$22bo48b2ob2ob2ob2o$ 20b3o52bobo$19bo54b2ob2o$19b2o$33bo$31b3o$14b2o14bo$15bo14b2o40b3o3b3o $15b2obo17b2o33bo9bo$18bo17bo34bo3bobo3bo$19b2o13bobo35b3o3b3o$15b3o2b 2o12b2o37bo5bo$17b2o$15bo2bo4bo$14bobobo3bo$13bo4bo$5b2o6bo2bob3o5bo$ 4bobo7bo3b3ob2o3bo$4bo10b2o5bo4bo$3b2o10b2o3b2o2bobo$15bo4bo$20b3o51b 2ob2o$16b2o57bobo$75bobo$12b2o2b3o57bo$13bobobo$14b4o$9b2o4bo$8bobo$8b o$7b2o7bobo$17b2o$17bo3$7b2o$8bo$8bobo$9b2o2$13bob2o$13bob2o2$22bo$12b 2o4bob2obo$12b2o2bo5bo$3b2o11bo5bo$4bo7b2o6b2o4b2o$4bobo5b2o4bobo5b2o$ 5b2o11b2o5$34b2o$34bobo$36bo$36b2o$30b2o$30bo$31b3o$33bo$19b2o$19bo$ 20b3o$22bo$34b2o7b2o$32b2o2bo6b2o$32b6o4bo2bo$22bo9b4o5bob2o$20b3o18bo b2o$19bo$20b3o18bob2o$22bo9b4o5bob2o14b2o$32b6o4b3ob2o11bo$32b2o2bo6bo bobo12b3o$34b2o7b4o15bo$44b2o!""") # TODO: take this apart further LWSSFromTheBlue = pattern(""" 27b2o5b2o$23b2o2b2o5b2o2b2o$23b2o13b2o2$28bo5bo$27b3o3b3o$26bo2b2ob2o 2bo$26bo3bobo3bo$28bobobobo2$25b2ob2o3b2ob2o$27bo7bo8$10b2o$8b2ob2o$8b o2bo$3bo4bo2bo$b3o5b2o15bo$o21b5o$b3o5b2o10bo2b3o7b2o$3bo4bo2bo10b2o 10b2o$8bo2bo$8b2ob2o$10b2o$25bo$25bo!""") # P46Osc really RowOfLWSSFTB = pattern("o$3o$3bo$2b2o!", 1737, 24) for i in range(43): RowOfLWSSFTB += LWSSFromTheBlue[(i*12) % 46](40*i, 0) HWSSHalfControl = HWSSGun(106, 87) + RowOfLWSSFTB(188, 79) CellCenter = HWSSHalfControl + HWSSHalfControl(2047, 2047, swap_xy_flip) OFFcell = all + CellCenter + StateBit # The metafier-OFF and -ON files technically should not exist (we just checked # at the beginning of the script). Shouldn't do any harm to check again, though: if os.access(OFFcellFileName, os.W_OK) or not os.access(OFFcellFileName, os.F_OK): try: OFFcell.save (OFFcellFileName, "Metapixel OFF cell: Brice Due, Spring 2006") except: # if tile can't be saved, it will be rebuilt next time -- # no need for an annoying error, just a note in the status bar g.show("Failed to save file version of OFF cell: " + OFFcellFileName) os.remove (OFFcellFileName) # slide 31: display on -------------------- g.show("Building ON metacell definition...") # switch on the HWSS guns: CellCenter += pattern("2o$2o!", 171, 124) + pattern("2o$2o!", 1922, 1875) # now generate the ONcell HWSSs and LWSSs # add rest of pattern after the center area is filled in # and p184 HWSS guns are in the same phase (3680 = 184 * 40) ONcell = all + CellCenter[3680] if os.access(ONcellFileName, os.W_OK) or not os.access(ONcellFileName, os.F_OK): try: ONcell.save (ONcellFileName, "Metapixel ON cell: Brice Due, Spring 2006") except: g.show("Failed to save file version of ON cell: " + ONcellFileName) os.remove(ONcellFileName) OFFcell += RuleBits ONcell += RuleBits g.autoupdate(True) g.new(layername) g.setalgo("QuickLife") # qlife's setcell is faster for j in xrange(selheight): for i in xrange(selwidth): golly.show("Placing (" + str(i+1) + "," + str(j+1) + ") tile" + " in a " + str(selwidth) + " by " + str(selheight) + " rectangle.") if livecell[i][j]: ONcell.put(2048 * i - 5, 2048 * j - 5) else: OFFcell.put(2048 * i - 5, 2048 * j - 5) g.fit() g.show("") g.setalgo("HashLife") # no point running a metapattern without hashing g.setoption("hyperspeed", False) # avoid going too fast g.setbase(8) g.setstep(4) g.step() # save start and populate hash tables # g.run(35328) # run one full cycle (can lock up Golly if construction has failed) # # Note that the first cycle is abnormal, since it does not advance the metapattern by # one metageneration: the first set of communication signals to adjacent cells is # generated during this first cycle. Thus at the end of 35328 ticks, the pattern # is ready to start its first "normal" metageneration (where cell states may change). # # It should be possible to define a version of ONcell that is not fully populated # with LWSSs and HWSSs until the end of the first full cycle. This would be much # quicker to generate from a script definition, and so it wouldn't be necessary to # save it to a file. The only disadvantage is that ONcells would be visually # indistinguishable from OFFcells until after the initial construction phase. golly-2.5-src/Scripts/Python/move-object.py0000644000175100001440000002454312156145314015717 00000000000000# Allow user to move a connected group of live cells. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jan 2011. import golly as g from glife import rect, getminbox ncells = [] # list of neighboring live cells # set edges of bounded grid for later use if g.getwidth() > 0: gridl = -int(g.getwidth()/2) gridr = gridl + g.getwidth() - 1 if g.getheight() > 0: gridt = -int(g.getheight()/2) gridb = gridt + g.getheight() - 1 helpmsg = " (hit 'h' for help)" # -------------------------------------------------------------------- def showhelp1(): g.note( """Hit the escape key to abort the script. Note that alt-clicking on an object allows you to COPY it to another location (the original object is not deleted).""") # -------------------------------------------------------------------- def showhelp2(): g.note( """While moving the object the following keys can be used: x -- flip object left-right y -- flip object top-bottom > -- rotate object clockwise < -- rotate object anticlockwise h -- show this help escape -- abort and restore the object""") # ------------------------------------------------------------------------------ def getstate(x, y): # first check if x,y is outside bounded grid if g.getwidth() > 0 and (x < gridl or x > gridr): return 0 if g.getheight() > 0 and (y < gridt or y > gridb): return 0 return g.getcell(x, y) # ------------------------------------------------------------------------------ def findlivecell(x, y): if g.getcell(x, y) > 0: return [x, y] # spiral outwards from x,y looking for a nearby live cell; # the smaller the scale the smaller the area searched maxd = 10 mag = g.getmag() if mag > 0: # mag can be 1..5 (ie. scales 1:2 to 1:32) maxd = 2 * (6 - mag) # 10, 8, 6, 4, 2 d = 1 while d <= maxd: x -= 1 y -= 1 for i in xrange(2*d): x += 1 # move east if getstate(x, y) > 0: return [x, y] for i in xrange(2*d): y += 1 # move south if getstate(x, y) > 0: return [x, y] for i in xrange(2*d): x -= 1 # move west if getstate(x, y) > 0: return [x, y] for i in xrange(2*d): y -= 1 # move north if getstate(x, y) > 0: return [x, y] d += 1 return [] # failed to find a live cell # ------------------------------------------------------------------------------ def checkneighbor(x, y): # first check if x,y is outside bounded grid if g.getwidth() > 0 and (x < gridl or x > gridr): return if g.getheight() > 0 and (y < gridt or y > gridb): return if g.getcell(x, y) == 0: return # no need for next test because we kill cell after adding it to ncells # if (x, y) in ncells: return False ncells.append( (x, y, g.getcell(x,y)) ) g.setcell(x, y, 0) # ------------------------------------------------------------------------------ def getobject(x, y): object = [] ncells.append( (x, y, g.getcell(x,y)) ) g.setcell(x, y, 0) while len(ncells) > 0: # remove cell from end of ncells and append to object x, y, s = ncells.pop() object.append(x) object.append(y) object.append(s) # add any live neighbors to ncells checkneighbor(x , y+1) checkneighbor(x , y-1) checkneighbor(x+1, y ) checkneighbor(x-1, y ) checkneighbor(x+1, y+1) checkneighbor(x+1, y-1) checkneighbor(x-1, y+1) checkneighbor(x-1, y-1) # append padding int if necessary if len(object) > 0 and (len(object) & 1) == 0: object.append(0) g.putcells(object) return object # ------------------------------------------------------------------------------ def underneath(object): # return list of live cells underneath given object (a multi-state list) cells = [] objlen = len(object) if objlen % 3 == 1: objlen -= 1 # ignore padding int i = 0 while i < objlen: x = object[i] y = object[i+1] s = g.getcell(x, y) if s > 0: cells.append(x) cells.append(y) cells.append(s) i += 3 # append padding int if necessary if len(cells) > 0 and (len(cells) & 1) == 0: cells.append(0) return cells # ------------------------------------------------------------------------------ def rectingrid(r): # return True if all of given rectangle is inside grid if g.getwidth() > 0 and (r[0] < gridl or r[0] + r[2] - 1 > gridr): return False if g.getheight() > 0 and (r[1] < gridt or r[1] + r[3] - 1 > gridb): return False return True # ------------------------------------------------------------------------------ def lookforkeys(event): global oldcells, object # look for keys used to flip/rotate object if event == "key x none" or event == "key y none": # flip floating object left-right or top-bottom g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") # erase object if len(oldcells) > 0: g.putcells(oldcells) obox = getminbox(object) if event == "key x none": # translate object so that bounding box doesn't change xshift = 2 * (obox.left + int(obox.wd/2)) if obox.wd % 2 == 0: xshift -= 1 object = g.transform(object, xshift, 0, -1, 0, 0, 1) else: # translate object so that bounding box doesn't change yshift = 2 * (obox.top + int(obox.ht/2)) if obox.ht % 2 == 0: yshift -= 1 object = g.transform(object, 0, yshift, 1, 0, 0, -1) oldcells = underneath(object) g.putcells(object) g.update() return if event == "key > none" or event == "key < none": # rotate floating object clockwise or anticlockwise # about the center of the object's bounding box obox = getminbox(object) midx = obox.left + int(obox.wd/2) midy = obox.top + int(obox.ht/2) newleft = midx + obox.top - midy newtop = midy + obox.left - midx rotrect = [ newleft, newtop, obox.ht, obox.wd ] if not rectingrid(rotrect): g.warn("Rotation is not allowed if object would be outside grid.") return g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") # erase object if len(oldcells) > 0: g.putcells(oldcells) if event == "key > none": # rotate clockwise object = g.transform(object, 0, 0, 0, -1, 1, 0) else: # rotate anticlockwise object = g.transform(object, 0, 0, 0, 1, -1, 0) # shift rotated object to same position as rotrect obox = getminbox(object) object = g.transform(object, newleft - obox.left, newtop - obox.top) oldcells = underneath(object) g.putcells(object) g.update() return if event == "key h none": showhelp2() return g.doevent(event) # ------------------------------------------------------------------------------ def moveobject(): global oldcells, object, object1 # wait for 1st click in live cell while True: event = g.getevent() if event.startswith("click"): # event is a string like "click 10 20 left none" evt, xstr, ystr, butt, mods = event.split() result = findlivecell(int(xstr), int(ystr)) if len(result) > 0: prevx = int(xstr) prevy = int(ystr) oldmouse = xstr + ' ' + ystr g.show("Extracting object...") x, y = result object = getobject(x, y) object1 = list(object) # save in case user aborts script if mods == "alt": # don't delete object oldcells = list(object) break else: g.warn("Click on or near a live cell belonging to the desired object.") elif event == "key h none": showhelp1() else: g.doevent(event) # wait for 2nd click while moving object g.show("Move mouse and click again..." + helpmsg) gotclick = False while not gotclick: event = g.getevent() if event.startswith("click"): evt, x, y, butt, mods = event.split() mousepos = x+' '+y gotclick = True else: if len(event) > 0: lookforkeys(event) mousepos = g.getxy() if len(mousepos) > 0 and mousepos != oldmouse: # mouse has moved, so move object g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") # erase object if len(oldcells) > 0: g.putcells(oldcells) xstr, ystr = mousepos.split() x = int(xstr) y = int(ystr) if g.getwidth() > 0: # ensure object doesn't move beyond left/right edge of grid obox = getminbox( g.transform(object, x - prevx, y - prevy) ) if obox.left < gridl: x += gridl - obox.left elif obox.right > gridr: x -= obox.right - gridr if g.getheight() > 0: # ensure object doesn't move beyond top/bottom edge of grid obox = getminbox( g.transform(object, x - prevx, y - prevy) ) if obox.top < gridt: y += gridt - obox.top elif obox.bottom > gridb: y -= obox.bottom - gridb object = g.transform(object, x - prevx, y - prevy) oldcells = underneath(object) g.putcells(object) prevx = x prevy = y oldmouse = mousepos g.update() # ------------------------------------------------------------------------------ if len(g.getrect()) == 0: g.exit("There are no objects.") g.show("Click on or near live cell in object, move mouse and click again..." + helpmsg) oldcursor = g.getcursor() g.setcursor("Move") oldcells = [] # cells under moved object object = [] # cells in moving object object1 = [] # cells in initial object try: aborted = True moveobject() aborted = False finally: g.setcursor(oldcursor) if aborted: # erase object if it moved if len(object) > 0: g.putcells(object, 0, 0, 1, 0, 0, 1, "xor") if len(oldcells) > 0: g.putcells(oldcells) if len(object1) > 0: g.putcells(object1) else: g.show(" ") golly-2.5-src/Scripts/Python/move-selection.py0000644000175100001440000001642512156145314016436 00000000000000# Allow user to move the current selection. # Author: Andrew Trevorrow (andrew@trevorrow.com), Jan 2011. import golly as g # set edges of bounded grid for later use if g.getwidth() > 0: gridl = -int(g.getwidth()/2) gridr = gridl + g.getwidth() - 1 if g.getheight() > 0: gridt = -int(g.getheight()/2) gridb = gridt + g.getheight() - 1 helpmsg = " (hit 'h' for help)" # -------------------------------------------------------------------- def showhelp1(): g.note( """Hit the escape key to abort the script. Note that alt-clicking in the selection allows you to COPY it to another location (the original selection is not deleted).""") # -------------------------------------------------------------------- def showhelp2(): g.note( """While moving the selection the following keys can be used: x -- flip selection left-right y -- flip selection top-bottom > -- rotate selection clockwise < -- rotate selection anticlockwise h -- show this help escape -- abort and restore the selection""") # ------------------------------------------------------------------------------ def cellinrect(x, y, r): # return True if given cell position is inside given rectangle if x < r[0] or x >= r[0] + r[2]: return False if y < r[1] or y >= r[1] + r[3]: return False return True # ------------------------------------------------------------------------------ def rectingrid(r): # return True if all of given rectangle is inside grid if g.getwidth() > 0 and (r[0] < gridl or r[0] + r[2] - 1 > gridr): return False if g.getheight() > 0 and (r[1] < gridt or r[1] + r[3] - 1 > gridb): return False return True # ------------------------------------------------------------------------------ def lookforkeys(event, deltax, deltay): global oldcells, selrect, selpatt # look for keys used to flip/rotate selection if event == "key x none" or event == "key y none": # flip floating selection left-right or top-bottom if len(oldcells) > 0: g.clear(0) g.putcells(selpatt, deltax, deltay) if " x " in event: g.flip(0) else: g.flip(1) selpatt = g.transform(g.getcells(selrect), -deltax, -deltay) if len(oldcells) > 0: g.clear(0) g.putcells(oldcells) g.putcells(selpatt, deltax, deltay) g.update() return if event == "key > none" or event == "key < none": # rotate floating selection clockwise or anticlockwise; # because we use g.rotate below we have to use the exact same # calculation (see Selection::Rotate in wxselect.cpp) for rotrect: midx = selrect[0] + int((selrect[2]-1)/2) midy = selrect[1] + int((selrect[3]-1)/2) newleft = midx + selrect[1] - midy newtop = midy + selrect[0] - midx rotrect = [ newleft, newtop, selrect[3], selrect[2] ] if not rectingrid(rotrect): g.warn("Rotation is not allowed if selection would be outside grid.") return g.clear(0) if len(oldcells) > 0: g.putcells(oldcells) oldcells = g.join(oldcells, g.getcells(rotrect)) g.clear(0) g.select(rotrect) g.clear(0) g.select(selrect) g.putcells(selpatt, deltax, deltay) if " > " in event: g.rotate(0) else: g.rotate(1) selrect = g.getselrect() if selrect != rotrect: g.warn("Bug: selrect != rotrect") selpatt = g.transform(g.getcells(selrect), -deltax, -deltay) if len(oldcells) > 0: g.clear(0) g.putcells(oldcells) g.putcells(selpatt, deltax, deltay) g.update() return if event == "key h none": showhelp2() return g.doevent(event) # ------------------------------------------------------------------------------ def moveselection(): global oldcells, selrect, selpatt # wait for 1st click in selection while True: event = g.getevent() if event.startswith("click"): # event is a string like "click 10 20 left none" evt, xstr, ystr, butt, mods = event.split() x = int(xstr) y = int(ystr) if cellinrect(x, y, selrect): oldmouse = xstr + ' ' + ystr firstx = x firsty = y xoffset = firstx - selrect[0] yoffset = firsty - selrect[1] if mods == "alt": # don't delete pattern in selection oldcells = g.getcells(selrect) break elif event == "key h none": showhelp1() else: g.doevent(event) # wait for 2nd click while moving selection g.show("Move mouse and click again..." + helpmsg) gotclick = False while not gotclick: event = g.getevent() if event.startswith("click"): evt, x, y, butt, mods = event.split() mousepos = x+' '+y gotclick = True else: if len(event) > 0: lookforkeys(event, x - firstx, y - firsty) # update xoffset,yoffset in case selection was rotated xoffset = x - selrect[0] yoffset = y - selrect[1] mousepos = g.getxy() if len(mousepos) > 0 and mousepos != oldmouse: # mouse has moved, so move selection rect and pattern g.clear(0) if len(oldcells) > 0: g.putcells(oldcells) xstr, ystr = mousepos.split() x = int(xstr) y = int(ystr) selrect[0] = x - xoffset selrect[1] = y - yoffset if g.getwidth() > 0: # ensure selrect doesn't move beyond left/right edge of grid if selrect[0] < gridl: selrect[0] = gridl x = selrect[0] + xoffset elif selrect[0] + selrect[2] - 1 > gridr: selrect[0] = gridr + 1 - selrect[2] x = selrect[0] + xoffset if g.getheight() > 0: # ensure selrect doesn't move beyond top/bottom edge of grid if selrect[1] < gridt: selrect[1] = gridt y = selrect[1] + yoffset elif selrect[1] + selrect[3] - 1 > gridb: selrect[1] = gridb + 1 - selrect[3] y = selrect[1] + yoffset g.select(selrect) oldcells = g.getcells(selrect) g.putcells(selpatt, x - firstx, y - firsty) oldmouse = mousepos g.update() # ------------------------------------------------------------------------------ selrect = g.getselrect() if len(selrect) == 0: g.exit("There is no selection.") selpatt = g.getcells(selrect) # remember initial selection in case user aborts script firstrect = g.getselrect() firstpatt = g.getcells(selrect) g.show("Click anywhere in selection, move mouse and click again..." + helpmsg) oldcursor = g.getcursor() g.setcursor("Move") oldcells = [] try: aborted = True moveselection() aborted = False finally: g.setcursor(oldcursor) if aborted: g.clear(0) if len(oldcells) > 0: g.putcells(oldcells) g.putcells(firstpatt) g.select(firstrect) else: g.show(" ") golly-2.5-src/Scripts/Python/oscar.py0000644000175100001440000001332012156145314014603 00000000000000# Oscar is an OSCillation AnalyzeR for use with Golly. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. # Modified to handle B0-and-not-S8 rules, August 2009. # This script uses Gabriel Nivasch's "keep minima" algorithm. # For each generation, calculate a hash value for the pattern. Keep all of # the record-breaking minimal hashes in a list, with the oldest first. # For example, after 5 generations the saved hash values might be: # # 8 12 16 24 25, # # If the next hash goes down to 13 then the list can be shortened: # # 8 12 13. # # When the current hash matches one of the saved hashes, it is highly likely # the pattern is oscillating. By keeping a corresponding list of generation # counts we can calculate the period. We also keep lists of population # counts and bounding boxes; they are used to reduce the chance of spurious # oscillator detection due to hash collisions. The bounding box info also # allows us to detect moving oscillators (spaceships/knightships). import golly as g from glife import rect, pattern from time import time # -------------------------------------------------------------------- # initialize lists hashlist = [] # for pattern hash values genlist = [] # corresponding generation counts poplist = [] # corresponding population counts boxlist = [] # corresponding bounding boxes # -------------------------------------------------------------------- def show_spaceship_speed(period, deltax, deltay): # we found a moving oscillator if period == 1: g.show("Spaceship detected (speed = c)") elif (deltax == deltay) or (deltax == 0) or (deltay == 0): speed = "" if (deltax == 0) or (deltay == 0): # orthogonal spaceship if (deltax > 1) or (deltay > 1): speed += str(deltax + deltay) else: # diagonal spaceship (deltax == deltay) if deltax > 1: speed += str(deltax) g.show("Spaceship detected (speed = " + speed + "c/" +str(period) + ")") else: # deltax != deltay and both > 0 speed = str(deltay) + "," + str(deltax) g.show("Knightship detected (speed = " + speed + "c/" + str(period) + ")") # -------------------------------------------------------------------- def oscillating(): # return True if the pattern is empty, stable or oscillating # first get current pattern's bounding box prect = g.getrect() pbox = rect(prect) if pbox.empty: g.show("The pattern is empty.") return True # get current pattern and create hash of "normalized" version -- ie. shift # its top left corner to 0,0 -- so we can detect spaceships and knightships ## currpatt = pattern( g.getcells(prect) ) ## h = hash( tuple( currpatt(-pbox.left, -pbox.top) ) ) # use Golly's hash command (3 times faster than above code) h = g.hash(prect) # check if outer-totalistic rule has B0 but not S8 rule = g.getrule().split(":")[0] hasB0notS8 = rule.startswith("B0") and (rule.find("/") > 1) and not rule.endswith("8") # determine where to insert h into hashlist pos = 0 listlen = len(hashlist) while pos < listlen: if h > hashlist[pos]: pos += 1 elif h < hashlist[pos]: # shorten lists and append info below del hashlist[pos : listlen] del genlist[pos : listlen] del poplist[pos : listlen] del boxlist[pos : listlen] break else: # h == hashlist[pos] so pattern is probably oscillating, but just in # case this is a hash collision we also compare pop count and box size if (int(g.getpop()) == poplist[pos]) and \ (pbox.wd == boxlist[pos].wd) and \ (pbox.ht == boxlist[pos].ht): period = int(g.getgen()) - genlist[pos] if hasB0notS8 and (period % 2 > 0) and (pbox == boxlist[pos]): # ignore this hash value because B0-and-not-S8 rules are # emulated by using different rules for odd and even gens, # so it's possible to have identical patterns at gen G and # gen G+p if p is odd return False if period == 1: if pbox == boxlist[pos]: g.show("The pattern is stable.") else: show_spaceship_speed(1, 0, 0) elif pbox == boxlist[pos]: g.show("Oscillator detected (period = " + str(period) + ")") else: deltax = abs(boxlist[pos].x - pbox.x) deltay = abs(boxlist[pos].y - pbox.y) show_spaceship_speed(period, deltax, deltay) return True else: # look at next matching hash value or insert if no more pos += 1 # store hash/gen/pop/box info at same position in various lists hashlist.insert(pos, h) genlist.insert(pos, int(g.getgen())) poplist.insert(pos, int(g.getpop())) boxlist.insert(pos, pbox) return False # -------------------------------------------------------------------- def fit_if_not_visible(): # fit pattern in viewport if not empty and not completely visible r = rect(g.getrect()) if (not r.empty) and (not r.visible()): g.fit() # -------------------------------------------------------------------- g.show("Checking for oscillation... (hit escape to abort)") oldsecs = time() while not oscillating(): g.run(1) newsecs = time() if newsecs - oldsecs >= 1.0: # show pattern every second oldsecs = newsecs fit_if_not_visible() g.update() fit_if_not_visible() golly-2.5-src/Scripts/Python/p1100-MWSS-gun.py0000644000175100001440000001037312156145314015620 00000000000000# Bill Gosper's pure-period p1100 double MWSS gun, circa 1984. import golly as g from glife import * g.new("P1100 gun") g.setalgo("HashLife") g.setrule("B3/S23") # update status bar now so we don't see different colors when # g.show is called g.update() glider = pattern("bo$bbo$3o!") block = pattern("oo$oo!") eater = pattern("oo$bo$bobo$bboo!") bhept = pattern("bbo$boo$oo$boo!") twobits = eater + bhept(8,3) half = twobits + twobits[1](51,0,flip_x) centinal = half + half(0,16,flip_y) passthrough = centinal[1](16,3,rcw) + centinal[19](52,0,rcw) \ + centinal[81](55,51,rccw) + centinal[99](91,54,rccw) # build the source signal -- the most compact set of gliders # from which all other gliders and spaceships can be generated MWSSrecipes = glider(5759,738,rccw) + glider(6325,667,flip_x) \ + glider[3](5824,896,flip_x) + glider[2](5912,1264) \ + glider[2](6135,1261,flip_x) + glider[1](5912,1490,flip_y) \ + glider(6229,4717,flip_x) + glider[1](6229,5029,flip) \ + glider[1](5920,5032,flip_y) + glider(6230,5188,flip) \ + glider[3](6230,5306,flip) + glider[3](5959,5309,flip_y) # suppress output MWSSes as long as gliders are being added MWSSrecipes += pattern("o!",6095,-65) + pattern("o!",6075,228) # add the first four centinals to guide the recipe gliders all = centinal[44](6185,5096,flip_x) + centinal[73](5897,1066) all += centinal[42](5782,690) + centinal[25](5793,897,rcw) # generate the MWSSes for the glider-fanout ladder for i in range(7): g.show("Building rung " + str(i+1) + " of ladder...") all = (all + MWSSrecipes)[1100] # add the actual glider-fanout ladder -- six rungs for i in range(6): all += glider(6030,1706+550*i,swap_xy_flip) \ + centinal[15](6102,1585+550*i) \ + block(6029,1721+550*i) + centinal[34](5996,1725+550*i,rccw) \ + block(6087,1747+550*i) + centinal[87](6122,1745+550*i,rcw) \ # add the rest of the centinals to guide the ladder's output gliders g.show("Adding centinal reflectors...") all += centinal[88](5704,0) + centinal[29](6423,295,flip_x) \ + centinal[74](5616,298) + centinal[40](6361,613,rcw) \ + centinal[23](6502,620,flip_x) + centinal[36](5636,986) \ + centinal[38](6370,1008,rcw) + centinal[19](5747,1347,rcw) \ + centinal[67](5851,1516) + centinal(4061,2605,rccw) \ + centinal[10](5376,3908,rccw) + centinal[77](8191,4407,flip_x) \ + centinal[6](4988,4606) + centinal[34](6357,4608,flip_x) \ + centinal[27](8129,4621,flip_x) + centinal[92](5159,5051) \ + centinal[53](7991,5201,flip_x) + centinal[94](7038,5370,rccw) \ + centinal[13](5591,5379,rccw) + centinal[3](5858,5428,rccw) \ + centinal[87](7805,5511,flip_x) + centinal[98](401,5557,rccw) \ + centinal[14](955,5561,rccw) + centinal[8](6592,5584,rccw) \ + centinal[39](6933,5698,flip_x) + centinal[32](6230,5881) \ + centinal[47](11676,5854,rccw) + centinal[68](0,5748,rccw) \ + centinal[89](6871,5912,flip_x) + centinal[45](12095,6027,rccw) \ + centinal[86](6209,6134) + centinal[55](6868,6357,flip_x) \ + centinal[95](9939,6491,rccw) + centinal[23](8782,6548,rccw) \ + centinal[58](3066,6572,rccw) + centinal[21](9326,6596,rccw) \ + centinal[80](3628,6626,rccw) + centinal[45](6821,6528,flip_x) \ + centinal[33](10373,6649,rccw) + centinal[16](2587,6685,rccw) # to change behavior at center, comment out one of the lines below all += eater(6018,5924,rccw) + eater(6037,5943,rccw) # true p1100 gun # all += block(6018,6787) # synch center to recreate original p1100x5 center = block(1081,6791) + block(2731,6791) + block(3831,6791) \ + block(9108,6791) + block(10208,6791) + block(11308,6791) \ + passthrough(8475,6737) + passthrough[39](3365,6737,flip_x) \ + passthrough(9575,6737) + passthrough[39](2265,6737,flip_x) \ + passthrough(10675,6737) + passthrough[39](1715,6737,flip_x) # add asymmetric Equator to mirror-symmetric North and South MWSSrecipes += MWSSrecipes(0,13583,flip_y) all += all(0,13583,flip_y) + center g.putcells(all) g.fit() # Different glider paths are different lengths, so incomplete # glider recipes must be overwritten for a while to prevent disaster. for i in range(46): g.show("Filling glider tracks -- " \ + str(49500 - i*1100) + " ticks left.") g.update() g.putcells(MWSSrecipes) g.run(1100) g.show("") # reset gen count to 0 g.setgen("0") golly-2.5-src/Scripts/Python/pd-glider.py0000644000175100001440000000063112156145314015344 00000000000000# Creates a large set of pentadecathlon + glider collisions. # Based on pd_glider.py from PLife (http://plife.sourceforge.net/). from glife.base import * rule("B3/S23") def collision (i, j): return pentadecathlon + glider[i + 11] (-8 + j, -10, flip) all = pattern () for i in xrange (-7, 8): for j in xrange (-9, 10): all += collision (i, j) (100 * i, 100 * j) all.display ("pd-glider") golly-2.5-src/Scripts/Python/pop-plot.py0000644000175100001440000001167712156145314015263 00000000000000# Run the current pattern for a given number of steps (using current # step size) and create a plot of population vs time in separate layer. # Author: Andrew Trevorrow (andrew@trevorrow.com), May 2007. import golly as g from glife import getminbox, rect, rccw from glife.text import make_text from time import time # -------------------------------------------------------------------- # size of plot xlen = 500 # length of x axis ylen = 500 # length of y axis # -------------------------------------------------------------------- # draw a line of cells from x1,y1 to x2,y2 using Bresenham's algorithm def draw_line(x1, y1, x2, y2): g.setcell(x1, y1, 1) if x1 == x2 and y1 == y2: return dx = x2 - x1 ax = abs(dx) * 2 sx = 1 if dx < 0: sx = -1 dy = y2 - y1 ay = abs(dy) * 2 sy = 1 if dy < 0: sy = -1 if ax > ay: d = ay - (ax / 2) while x1 != x2: g.setcell(x1, y1, 1) if d >= 0: y1 += sy d -= ax x1 += sx d += ay else: d = ax - (ay / 2) while y1 != y2: g.setcell(x1, y1, 1) if d >= 0: x1 += sx d -= ay y1 += sy d += ax g.setcell(x2, y2, 1) # -------------------------------------------------------------------- # fit pattern in viewport if not empty and not completely visible def fit_if_not_visible(): try: r = rect(g.getrect()) if (not r.empty) and (not r.visible()): g.fit() except: # getrect failed because pattern is too big g.fit() # -------------------------------------------------------------------- if g.empty(): g.exit("There is no pattern.") # check that a layer is available for population plot layername = "population plot" poplayer = -1 for i in xrange(g.numlayers()): if g.getname(i) == layername: poplayer = i break if poplayer == -1 and g.numlayers() == g.maxlayers(): g.exit("You need to delete a layer.") # prompt user for number of steps numsteps = xlen s = g.getstring("Enter the number of steps:", str(numsteps), "Population plotter") if len(s) > 0: numsteps = int(s) if numsteps <= 0: g.exit() # generate pattern for given number of steps poplist = [ int(g.getpop()) ] genlist = [ int(g.getgen()) ] oldsecs = time() for i in xrange(numsteps): g.step() poplist.append( int(g.getpop()) ) genlist.append( int(g.getgen()) ) newsecs = time() if newsecs - oldsecs >= 1.0: # show pattern every second oldsecs = newsecs fit_if_not_visible() g.update() g.show("Step %i of %i" % (i+1, numsteps)) fit_if_not_visible() # save some info before we switch layers stepsize = "%i^%i" % (g.getbase(), g.getstep()) pattname = g.getname() # create population plot in separate layer g.setoption("stacklayers", 0) g.setoption("tilelayers", 0) g.setoption("showlayerbar", 1) if poplayer == -1: poplayer = g.addlayer() else: g.setlayer(poplayer) g.new(layername) # use same rule but without any suffix (we don't want a bounded grid) g.setrule(g.getrule().split(":")[0]) deadr, deadg, deadb = g.getcolor("deadcells") if (deadr + deadg + deadb) / 3 > 128: # use black if light background g.setcolors([1,0,0,0]) else: # use white if dark background g.setcolors([1,255,255,255]) minpop = min(poplist) maxpop = max(poplist) if minpop == maxpop: # avoid division by zero minpop -= 1 popscale = float(maxpop - minpop) / float(ylen) mingen = min(genlist) maxgen = max(genlist) genscale = float(maxgen - mingen) / float(xlen) # draw axes with origin at 0,0 draw_line(0, 0, xlen, 0) draw_line(0, 0, 0, -ylen) # add annotation using mono-spaced ASCII font t = make_text(pattname.upper(), "mono") bbox = getminbox(t) t.put((xlen - bbox.wd) / 2, -ylen - 10 - bbox.ht) t = make_text("POPULATION", "mono") bbox = getminbox(t) t.put(-10 - bbox.ht, -(ylen - bbox.wd) / 2, rccw) t = make_text(str(minpop), "mono") bbox = getminbox(t) t.put(-bbox.wd - 10, -bbox.ht / 2) t = make_text(str(maxpop), "mono") bbox = getminbox(t) t.put(-bbox.wd - 10, -ylen - bbox.ht / 2) t = make_text("GENERATION (step=%s)" % stepsize, "mono") bbox = getminbox(t) t.put((xlen - bbox.wd) / 2, 10) t = make_text(str(mingen), "mono") bbox = getminbox(t) t.put(-bbox.wd / 2, 10) t = make_text(str(maxgen), "mono") bbox = getminbox(t) t.put(xlen - bbox.wd / 2, 10) # display result at scale 1:1 g.fit() g.setmag(0) g.show("") # plot the data (do last because it could take a while if numsteps is huge) x = int(float(genlist[0] - mingen) / genscale) y = int(float(poplist[0] - minpop) / popscale) oldsecs = time() for i in xrange(numsteps): newx = int(float(genlist[i+1] - mingen) / genscale) newy = int(float(poplist[i+1] - minpop) / popscale) draw_line(x, -y, newx, -newy) x = newx y = newy newsecs = time() if newsecs - oldsecs >= 1.0: # update plot every second oldsecs = newsecs g.update() golly-2.5-src/Scripts/Python/shift.py0000644000175100001440000000407112156145314014614 00000000000000# Shift current selection by given x y amounts using optional mode. # Author: Andrew Trevorrow (andrew@trevorrow.com), June 2006. # Updated to use exit command, Nov 2006. # Updated to check for bounded grid, Oct 2010. from glife import validint, inside from string import lower import golly as g selrect = g.getselrect() if len(selrect) == 0: g.exit("There is no selection.") answer = g.getstring("Enter x y shift amounts and an optional mode\n" + "(valid modes are copy/or/xor, default is or):", "0 0 or", "Shift selection") xym = answer.split() # extract x and y amounts if len(xym) == 0: g.exit() if len(xym) == 1: g.exit("Supply x and y amounts separated by a space.") if not validint(xym[0]): g.exit("Bad x value: " + xym[0]) if not validint(xym[1]): g.exit("Bad y value: " + xym[1]) x = int(xym[0]) y = int(xym[1]) # extract optional mode if len(xym) > 2: mode = lower(xym[2]) if mode=="c": mode="copy" if mode=="o": mode="or" if mode=="x": mode="xor" if not (mode == "copy" or mode == "or" or mode == "xor"): g.exit("Unknown mode: " + xym[2] + " (must be copy/or/xor)") else: mode = "or" # abort shift if the new selection would be outside a bounded grid if g.getwidth() > 0: gridl = -int(g.getwidth()/2) gridr = gridl + g.getwidth() - 1 newl = selrect[0] + x newr = newl + selrect[2] - 1 if newl < gridl or newr > gridr: g.exit("New selection would be outside grid.") if g.getheight() > 0: gridt = -int(g.getheight()/2) gridb = gridt + g.getheight() - 1 newt = selrect[1] + y newb = newt + selrect[3] - 1 if newt < gridt or newb > gridb: g.exit("New selection would be outside grid.") # do the shift by cutting the current selection and pasting it into # the new position without changing the current clipboard pattern selcells = g.getcells(selrect) g.clear(inside) selrect[0] += x selrect[1] += y g.select(selrect) if mode == "copy": g.clear(inside) g.putcells(selcells, x, y, 1, 0, 0, 1, mode) if not g.visrect(selrect): g.fitsel() golly-2.5-src/Scripts/Python/slide-show.py0000644000175100001440000000452712156145314015563 00000000000000# Display all patterns in Golly's Patterns folder. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. import golly as g import os from os.path import join from time import sleep # ------------------------------------------------------------------------------ def slideshow (): oldalgo = g.getalgo() oldrule = g.getrule() message = "Hit space to continue or escape to exit the slide show..." g.show(message) for root, dirs, files in os.walk(g.getdir("app") + "Patterns"): for name in files: if name.startswith("."): # ignore hidden files (like .DS_Store on Mac) pass else: fullname = join(root, name) g.open(fullname, False) # don't add file to Open/Run Recent submenu g.update() if name.endswith(".pl") or name.endswith(".py"): # reshow message in case it was changed by script g.show(message) while True: event = g.getevent() if event == "key space none": break g.doevent(event) # allow keyboard/mouse interaction sleep(0.01) # avoid hogging cpu # if all patterns have been displayed then restore original algo and rule # (don't do this if user hits escape in case they want to explore pattern) g.new("untitled") g.setalgo(oldalgo) g.setrule(oldrule) # ------------------------------------------------------------------------------ # show status bar but hide other info to maximize viewport oldstatus = g.setoption("showstatusbar", True) oldtoolbar = g.setoption("showtoolbar", False) oldlayerbar = g.setoption("showlayerbar", False) oldeditbar = g.setoption("showeditbar", False) oldscripts = g.setoption("showscripts", False) oldpatterns = g.setoption("showpatterns", False) try: slideshow() finally: # this code is always executed, even after escape/error; # clear message line in case there was no escape/error g.show("") # restore original state g.setoption("showstatusbar", oldstatus) g.setoption("showtoolbar", oldtoolbar) g.setoption("showlayerbar", oldlayerbar) g.setoption("showeditbar", oldeditbar) g.setoption("showscripts", oldscripts) g.setoption("showpatterns", oldpatterns) golly-2.5-src/Scripts/Python/tile.py0000644000175100001440000000757712156145314014452 00000000000000# Tile current selection with pattern inside selection. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. # Updated to use exit command, Nov 2006. # Updated to handle multi-state patterns, Aug 2008. from glife import * import golly as g selrect = rect( g.getselrect() ) if selrect.empty: g.exit("There is no selection.") selpatt = pattern( g.getcells(g.getselrect()) ) if len(selpatt) == 0: g.exit("No pattern in selection.") # determine if selpatt is one-state or multi-state inc = 2 if len(selpatt) & 1 == 1: inc = 3 # ------------------------------------------------------------------------------ def clip_left (patt, left): clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() x = 0 while x < len(clist): if clist[x] < left: clist[x : x+inc] = [] # remove cell from list else: x += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ def clip_right (patt, right): clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() x = 0 while x < len(clist): if clist[x] > right: clist[x : x+inc] = [] # remove cell from list else: x += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ def clip_top (patt, top): clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() y = 1 while y < len(clist): if clist[y] < top: clist[y-1 : y-1+inc] = [] # remove cell from list else: y += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ def clip_bottom (patt, bottom): clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() y = 1 while y < len(clist): if clist[y] > bottom: clist[y-1 : y-1+inc] = [] # remove cell from list else: y += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ # find selpatt's minimal bounding box bbox = getminbox(selpatt) # first tile selpatt horizontally, clipping where necessary left = bbox.left i = 0 while left > selrect.left: left -= bbox.width i += 1 if left >= selrect.left: selpatt.put(-bbox.width * i, 0) else: clip_left( selpatt(-bbox.width * i, 0), selrect.left ).put() right = bbox.right i = 0 while right < selrect.right: right += bbox.width i += 1 if right <= selrect.right: selpatt.put(bbox.width * i, 0) else: clip_right( selpatt(bbox.width * i, 0), selrect.right ).put() # get new selection pattern and tile vertically, clipping where necessary selpatt = pattern( g.getcells(g.getselrect()) ) bbox = getminbox(selpatt) top = bbox.top i = 0 while top > selrect.top: top -= bbox.height i += 1 if top >= selrect.top: selpatt.put(0, -bbox.height * i) else: clip_top( selpatt(0, -bbox.height * i), selrect.top ).put() bottom = bbox.bottom i = 0 while bottom < selrect.bottom: bottom += bbox.height i += 1 if bottom <= selrect.bottom: selpatt.put(0, bbox.height * i) else: clip_bottom( selpatt(0, bbox.height * i), selrect.bottom ).put() if not selrect.visible(): g.fitsel() golly-2.5-src/Scripts/Python/tile-with-clip.py0000644000175100001440000000362412156145314016335 00000000000000# Tile current selection with clipboard pattern. # Author: Andrew Trevorrow (andrew@trevorrow.com), March 2006. # Updated to use exit command, Nov 2006. # Updated to handle multi-state patterns, Aug 2008. from glife import * import golly as g # assume one-state cell list (may change below) inc = 2 # ------------------------------------------------------------------------------ def clip_rb (patt, right, bottom): # remove any cells outside given right and bottom edges clist = list(patt) # remove padding int if present if (inc == 3) and (len(clist) % 3 == 1): clist.pop() x = 0 y = 1 while x < len(clist): if (clist[x] > right) or (clist[y] > bottom): # remove cell from list clist[x : x+inc] = [] else: x += inc y += inc # append padding int if necessary if (inc == 3) and (len(clist) & 1 == 0): clist.append(0) return pattern(clist) # ------------------------------------------------------------------------------ selrect = rect( g.getselrect() ) if selrect.empty: g.exit("There is no selection.") cliplist = g.getclip() # 1st 2 items are wd,ht pbox = rect( [0, 0] + cliplist[0 : 2] ) cliplist[0 : 2] = [] # remove wd,ht p = pattern( cliplist ) if len(cliplist) & 1 == 1: inc = 3 # multi-state? g.clear(inside) if len(cliplist) > 0: # tile selrect with p, clipping right & bottom edges if necessary y = selrect.top while y <= selrect.bottom: bottom = y + pbox.height - 1 x = selrect.left while x <= selrect.right: right = x + pbox.width - 1 if (right <= selrect.right) and (bottom <= selrect.bottom): p.put(x, y) else: clip_rb( p(x, y), selrect.right, selrect.bottom ).put() x += pbox.width y += pbox.height if not selrect.visible(): g.fitsel() golly-2.5-src/docs/0000755000175100001440000000000012156145314011223 500000000000000golly-2.5-src/docs/Build.html0000644000175100001440000004547012156145314013102 00000000000000 How to build Golly

This document contains instructions for how to build Golly.

Contents

How to install wxWidgets
      On Windows
      On Mac OS X
      On Linux
How to install Perl and Python
How to build Golly
      On Windows
      On Mac OS X
      On Linux
Building Golly using configure
Building Golly using CMake
How to build bgolly
Source code road map
      Directory structure
      High-level GUI code
      Low-level base code

How to install wxWidgets

If you want to build Golly from source code then you'll have to install wxWidgets first. Visit http://www.wxwidgets.org/downloads and grab the appropriate source archive for your platform:

  • On Windows (XP+), get the wxMSW source installer.
  • On Mac OS X (10.6+), get the 2.9.x source archive with Unix line endings.
  • On Linux, get the wxGTK source archive.

Golly should compile with wxWidgets 2.8.0 or later, but it's best to use the latest version. Mac users should get 2.9 or later (this is necessary for a 64-bit Cocoa build).

On Windows

If you've installed wxWidgets to (say) C:\wxWidgets then, from a DOS or Visual Studio command prompt:

   cd \wxWidgets\build\msw
   nmake -f makefile.vc BUILD=release RUNTIME_LIBS=static UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0
On 64-bit Windows add TARGET_CPU=AMD64 to the above nmake command.

On Mac OS X

Unpack the wxWidgets source archive wherever you like, start up Terminal and type these commands (using the correct version number):

   cd /path/to/wxWidgets-2.9.4
   mkdir build-osx
   cd build-osx
   ../configure --with-osx_cocoa --disable-shared --enable-unicode
   make

If you plan to build Golly using CMake (see below) then also do "sudo make install".

On Linux

Unpack the wxGTK source archive wherever you like, start up a terminal session and type these commands (using the correct version number):

   cd /path/to/wxGTK-2.8.12
   mkdir build-gtk
   cd build-gtk
   ../configure --with-gtk --disable-shared --enable-unicode
   make
   sudo make install
   sudo ldconfig

This installs the wx libraries in a suitable directory. It also installs the wx-config program which will be called by makefile-gtk to set the appropriate compile and link options for building Golly.

How to install Perl and Python

Golly uses Perl and Python for scripting, so you'll need to make sure both are installed. Mac OS X users don't have to do anything because Perl and Python are already installed.

If you are running Linux, you probably have Perl installed. Type "perl -v" at the command line to print out the version. Golly's code should compile happily with Perl 5.10.x or later, but support for interpreter threads is required.

Windows users are advised to download the ActivePerl installer from
http://www.activestate.com/Products/ActivePerl.

Windows and Linux users can download a Python installer from
http://www.python.org/download.

How to build Golly

Once wxWidgets, Perl and Python are installed, building Golly should be relatively easy:

On Windows

First, locate local-win-template.mk in the gui-wx folder and copy it to a new file called local-win.mk. This file is included by makefile-win. Edit local-win.mk and specify where wxWidgets is installed by changing the WX_DIR path near the start of the file. Also make sure WX_RELEASE specifies the first two digits of your wxWidgets version. The headers for Perl and Python must also be included, so change the paths for PERL_INCLUDE and PYTHON_INCLUDE if necessary. Now you're ready to build Golly.

On 32-bit Windows (from a DOS or Visual Studio command prompt):

   cd \path\to\golly\gui-wx
   nmake -f makefile-win BUILD=release RUNTIME_LIBS=static UNICODE=1 DEBUG_INFO=0 DEBUG_FLAG=0

On 64-bit Windows add TARGET_CPU=AMD64 to the above nmake command.

On Mac OS X

Go to the gui-wx folder and make a copy of makefile-mac called makefile. Edit makefile and specify where wxWidgets is installed by changing the WX_DIR path near the start of the file. Also make sure WX_RELEASE specifies the first two digits of your wxWidgets version.

On Mac OS 10.6 or later you can then build a 64-bit Cocoa version of Golly by opening a Terminal window and doing:

   cd /path/to/golly/gui-wx
   make

On Linux

You might need to add some development packages first. For example, from a default Ubuntu install (at the time of writing) you will need to install the following packages: libgtk2.0-dev, python2.6-dev (for GTK and Python respectively).

Open a terminal window and build the golly executable by doing:

   cd /path/to/golly/gui-wx
   make -f makefile-gtk

Note that the CXXFLAGS and LDFLAGS environmental variables may be used to append to (and override) the package default flags. Additionally, GOLLYDIR specifies an absolute directory path to look for the application data files. For system-wide installation, it probably makes sense to set GOLLYDIR to /usr/share/golly and install the Help, Patterns, Scripts and Rules directories in there.

Aternative methods for building Golly are also available, as discussed in the following two sections.

Building Golly using configure

Golly can be built using the standard GNU build tools. If you obtained the Golly source code from the Git repository instead of a source release, you need to generate the configure script first:

   cd /path/to/golly/gui-wx/configure
   ./autogen.sh

This requires that autoconf, automake and Perl 5.x are installed.

The configure script offers various options to customize building and installation. For an overview of the available options, run:

   ./configure --help

Run the configure script to create an appropriate Makefile for your operating system and then run make to build Golly. For example, for a system-wide installation, you could do this:

   cd /path/to/golly/gui-wx/configure
   ./configure
   make
   make install

Building Golly using CMake

The CMakeLists.txt file included in the gui-wx directory allows Golly to be built using CMake. Visit http://www.cmake.org to download a suitable installer for your operating system.

Once CMake is installed, you can build Golly using these commands:

   cd /path/to/golly/gui-wx     (location of CMakeLists.txt)
   mkdir cmakedir               (use any name for this subdirectory)
   cd cmakedir
   cmake ..
   make                         (or nmake on Windows)

CMake also comes with a GUI application if you'd prefer not to use the command line.

Some notes:

  • Although wxWidgets comes pre-installed on Mac OS X, it tends to be out-of-date and inappropriate for building Golly, so CMakeLists.txt sets wxWidgets_CONFIG_EXECUTABLE to /usr/local/bin/wx-config where /usr/local/bin is the default location for wx-config if you do "sudo make install" after building the wxWidgets libraries.
  • Also on Mac OS X, PERL_INCLUDE_PATH and PERL_LIBRARY are overridden to avoid statically linking the Perl library. Their settings assume Perl 5.10 so you might need to change the version numbers.

How to build bgolly

The above make/nmake commands will also create bgolly, a simple "batch mode" version of Golly without any GUI. To build bgolly separately, just specify bgolly as the target of the make/nmake command. For example, on Linux:

   make -f makefile-gtk bgolly

You don't need to install wxWidgets, Perl or Python to build bgolly.

Source code road map

If you'd like to modify Golly then the following information should help you get started.

Directory structure

Golly's source code can be downloaded from Sourceforge as a Git repository or as a .tar.gz file. You should see the following directories:

cmdline

Contains the source files for bgolly and RuleTableToTree (the latter program is no longer included in the binary distribution).

docs

Contains documentation in the form of .html files.

gollybase

Contains the low-level source code used by the client code in cmdline, gui-wx and gui-ios. See below for a description of the various files.

gui-ios

Contains all the files for the iPad version of Golly. You'll only see this directory if you cloned the Git repository.

gui-wx

Contains the high-level source code for the wxWidgets version of Golly (see below for more details). Also contains other files and resources needed to build Golly (make files, bitmap files, icon files, etc).

Help

Contains various .html files that are accessed from Golly's Help menu.

Patterns

Contains a state-of-the-art pattern collection.

Rules

Contains sample rules loaded by the RuleTable and RuleTree algorithms, along with matching icon and color files.

Scripts

Contains Perl and Python scripts that can be run by Golly.

Note that the executables (Golly and bgolly) are created in the same location as the above directories. This means you can test a new Golly build without having to copy it somewhere else because the required directories (Help, Patterns, Rules and Scripts) are in the correct location.

High-level GUI code

The desktop version of Golly uses wxWidgets to implement the graphical user interface. All the GUI code is stored in the gui-wx directory in a number of wx* files. Each module is described in (roughly) top-down order, and some key routines are mentioned:

wxgolly.*

Defines the GollyApp class.
GollyApp::OnInit() is where it all starts.

wxmain.*

Defines the MainFrame class for the main window.
MainFrame::OnMenu() handles all menu commands.
MainFrame::UpdateEverything() updates all parts of the GUI.

wxfile.cpp

Implements various File menu functions.
MainFrame::NewPattern() creates a new, empty universe.
MainFrame::LoadPattern() reads in a pattern file.

wxcontrol.cpp

Implements various Control menu functions.
MainFrame::GeneratePattern() runs the current pattern.
MainFrame::ChangeAlgorithm() switches to a new algorithm.

wxtimeline.*

Users can record/play a sequence of steps called a "timeline".
CreateTimelineBar() creates timeline bar below the viewport window.
StartStopRecording() starts or stops recording a timeline.
DeleteTimeline() deletes an existing timeline.

wxrule.*

Users can change the current rule.
ChangeRule() opens the Set Rule dialog.

wxedit.*

Implements edit bar functions.
CreateEditBar() creates the edit bar above the viewport window.
ToggleEditBar() shows/hides the edit bar.

wxselect.*

Defines the Selection class for operations on selections.
Selection::CopyToClipboard() copies the selection to the clipboard.
Selection::RandomFill() randomly fills the current selection.
Selection::Rotate() rotates the current selection.
Selection::Flip() flips the current selection.

wxview.*

Defines the PatternView class for the viewport window.
PatternView::ProcessKey() processes keyboard shortcuts.
PatternView::ProcessClick() processes mouse clicks.

wxrender.*

Implements rendering routines for updating the viewport.
DrawView() draws the pattern, grid lines, selection, etc.

wxalgos.*

Implements support for multiple algorithms.
InitAlgorithms() initializes all algorithms and algoinfo data.
CreateNewUniverse() creates a new universe of given type.

wxlayer.*

Defines the Layer class and implements Layer menu functions.
AddLayer() adds a new, empty layer.
DeleteLayer() deletes the current layer.
SetLayerColors() lets user change the current layer's colors.

wxundo.*

Defines the UndoRedo class for unlimited undo/redo.
UndoRedo::RememberCellChanges() saves cell state changes.
UndoRedo::UndoChange() undoes a recent change.
UndoRedo::RedoChange() redoes an undone change.

wxstatus.*

Implements a status bar at the top of the main window.
StatusBar::DrawStatusBar() shows gen count, pop count, etc.
StatusBar::DisplayMessage() shows message in bottom line.

wxhelp.*

Implements a modeless help window.
ShowHelp() displays a given .html file.

wxinfo.*

Implements a modeless info window.
ShowInfo() displays the comments in a given pattern file.

wxscript.*

Implements the high-level scripting interface.
RunScript() runs a given script file.

wxperl.*

Implements Perl script support.
RunPerlScript() runs a given .pl file.

wxpython.*

Implements Python script support.
RunPythonScript() runs a given .py file.

wxprefs.*

Routines for loading, saving and changing user preferences.
GetPrefs() loads data from GollyPrefs file.
SavePrefs() writes data to GollyPrefs file.
ChangePrefs() opens the Preferences dialog.

wxutils.*

Implements various utility routines.
Warning() displays message in modal dialog.
Fatal() displays message and exits the app.

Low-level base code

The gollybase directory contains low-level code used by all the various clients (Golly, bgolly, and the iPad version of Golly):

platform.h

Platform specific defines (eg. 64-bit changes).

lifealgo.*

Defines abstract Life algorithm operations:
lifealgo::setcell() sets given cell to given state.
lifealgo::getcell() gets state of given cell.
lifealgo::nextcell() finds next live cell in current row.
lifealgo::step() advances pattern by current increment.
lifealgo::fit() fits pattern within given viewport.
lifealgo::draw() renders pattern in given viewport.

liferules.*

Defines routines for setting/getting rules.
liferules::setrule() parses and validates a given rule string.
liferules::getrule() returns the current rule in canonical form.

lifepoll.*

Allows lifealgo routines to do event processing.
lifepoll::checkevents() processes any pending events.

viewport.*

Defines abstract viewport operations:
viewport::zoom() zooms into a given location.
viewport::unzoom() zooms out from a given location.
viewport::setmag() sets the magnification.
viewport::move() scrolls view by given number of pixels.

liferender.*

Defines abstract routines for rendering a pattern:
liferender::killrect() fills an area with the dead cell color.
liferender::pixblit() draws an area with at least one live cell.

qlifealgo.*

Implements QuickLife, a fast, conventional algorithm.

hlifealgo.*

Implements HashLife, a super fast hashing algorithm.

ghashbase.*

Defines an abstract class so other algorithms can use hashlife in a multi-state universe.

generationsalgo.*

Implements the Generations family of rules.

jvnalgo.*

Implements John von Neumann's 29-state CA and 32-state variants by Renato Nobili and Tim Hutton.

ruleloaderalgo.*

Implements the RuleLoader algorithm which loads externally specified rules stored in .table or .tree files.

ruletable_algo.*

Used by the RuleLoader algorithm to load .table files.

ruletreealgo.*

Used by the RuleLoader algorithm to load .tree files.

qlifedraw.cpp

Implements rendering routines for QuickLife.

hlifedraw.cpp

Implements rendering routines for HashLife.

ghashdraw.cpp

Implements rendering routines for all algos that use ghashbase.

readpattern.*

Reads pattern files in a variety of formats.
readpattern() loads a pattern into the given universe.
readcomments() extracts comments from the given file.

writepattern.*

Saves the current pattern in a file.
writepattern() saves the pattern in a specified format.

bigint.*

Implements operations on arbitrarily large integers.

util.*

Utilities for displaying errors and progress info.
warning() displays error message.
fatal() displays error message and exits.

Have fun, and please let us know if you make any changes!

Andrew Trevorrow (andrew@trevorrow.com)
Tom Rokicki (rokicki@gmail.com)
(on behalf of The Golly Gang)

golly-2.5-src/docs/License.html0000644000175100001440000007602412156145314013424 00000000000000 License info for Golly
		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  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.

    
    Copyright (C)   

    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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  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.

  , 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.

======================================================================

Golly uses an embedded Python interpreter for its scripting language.
Here is the official license for the Python 2.4 release:

A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

In May 2000, Guido and the Python core development team moved to
BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
year, the PythonLabs team moved to Digital Creations (now Zope
Corporation, see http://www.zope.com).  In 2001, the Python Software
Foundation (PSF, see http://www.python.org/psf/) was formed, a
non-profit organization created specifically to own Python-related
Intellectual Property.  Zope Corporation is a sponsoring member of
the PSF.

All Python releases are Open Source (see http://www.opensource.org for
the Open Source Definition).  Historically, most, but not all, Python
releases have also been GPL-compatible; the table below summarizes
the various releases.

    Release         Derived     Year        Owner       GPL-
                    from                                compatible? (1)

    0.9.0 thru 1.2              1991-1995   CWI         yes
    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
    1.6             1.5.2       2000        CNRI        no
    2.0             1.6         2000        BeOpen.com  no
    1.6.1           1.6         2001        CNRI        yes (2)
    2.1             2.0+1.6.1   2001        PSF         no
    2.0.1           2.0+1.6.1   2001        PSF         yes
    2.1.1           2.1+2.0.1   2001        PSF         yes
    2.2             2.1.1       2001        PSF         yes
    2.1.2           2.1.1       2002        PSF         yes
    2.1.3           2.1.2       2002        PSF         yes
    2.2.1           2.2         2002        PSF         yes
    2.2.2           2.2.1       2002        PSF         yes
    2.2.3           2.2.2       2003        PSF         yes
    2.3             2.2.2       2002-2003   PSF         yes
    2.3.1           2.3         2002-2003   PSF         yes
    2.3.2           2.3.1       2002-2003   PSF         yes
    2.3.3           2.3.2       2002-2003   PSF         yes
    2.3.4           2.3.3       2004        PSF         yes
    2.3.5           2.3.4       2005        PSF         yes
    2.4             2.3         2004        PSF         yes
    2.4.1           2.4         2005        PSF         yes
    2.4.2           2.4.1       2005        PSF         yes

Footnotes:

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
    a modified version without making your changes open source.  The
    GPL-compatible licenses make it possible to combine Python with
    other software that is released under the GPL; the others don't.

(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
    because its license has a choice of law clause.  According to
    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
    is "not incompatible" with the GPL.

Thanks to the many outside volunteers who have worked under Guido's
direction to make these releases possible.


B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
===============================================================

PSF LICENSE AGREEMENT FOR PYTHON 2.4
------------------------------------

1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using Python 2.4 software in source or binary form and its
associated documentation.

2. Subject to the terms and conditions of this License Agreement, PSF
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 2.4
alone or in any derivative version, provided, however, that PSF's
License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved"
are retained in Python 2.4 alone or in any derivative version prepared
by Licensee.

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 2.4 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 2.4.

4. PSF is making Python 2.4 available to Licensee on an "AS IS"
basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.4 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
2.4 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.4,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee.  This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.

8. By copying, installing or otherwise using Python 2.4, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
-------------------------------------------

BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1

1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
Individual or Organization ("Licensee") accessing and otherwise using
this software in source or binary form and its associated
documentation ("the Software").

2. Subject to the terms and conditions of this BeOpen Python License
Agreement, BeOpen hereby grants Licensee a non-exclusive,
royalty-free, world-wide license to reproduce, analyze, test, perform
and/or display publicly, prepare derivative works, distribute, and
otherwise use the Software alone or in any derivative version,
provided, however, that the BeOpen Python License is retained in the
Software, alone or in any derivative version prepared by Licensee.

3. BeOpen is making the Software available to Licensee on an "AS IS"
basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

5. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

6. This License Agreement shall be governed by and interpreted in all
respects by the law of the State of California, excluding conflict of
law provisions.  Nothing in this License Agreement shall be deemed to
create any relationship of agency, partnership, or joint venture
between BeOpen and Licensee.  This License Agreement does not grant
permission to use BeOpen trademarks or trade names in a trademark
sense to endorse or promote products or services of Licensee, or any
third party.  As an exception, the "BeOpen Python" logos available at
http://www.pythonlabs.com/logos.html may be used according to the
permissions granted on that web page.

7. By copying, installing or otherwise using the software, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.


CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
---------------------------------------

1. This LICENSE AGREEMENT is between the Corporation for National
Research Initiatives, having an office at 1895 Preston White Drive,
Reston, VA 20191 ("CNRI"), and the Individual or Organization
("Licensee") accessing and otherwise using Python 1.6.1 software in
source or binary form and its associated documentation.

2. Subject to the terms and conditions of this License Agreement, CNRI
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 1.6.1
alone or in any derivative version, provided, however, that CNRI's
License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
1995-2001 Corporation for National Research Initiatives; All Rights
Reserved" are retained in Python 1.6.1 alone or in any derivative
version prepared by Licensee.  Alternately, in lieu of CNRI's License
Agreement, Licensee may substitute the following text (omitting the
quotes): "Python 1.6.1 is made available subject to the terms and
conditions in CNRI's License Agreement.  This Agreement together with
Python 1.6.1 may be located on the Internet using the following
unique, persistent identifier (known as a handle): 1895.22/1013.  This
Agreement may also be obtained from a proxy server on the Internet
using the following URL: http://hdl.handle.net/1895.22/1013".

3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 1.6.1 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 1.6.1.

4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.

5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.

6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.

7. This License Agreement shall be governed by the federal
intellectual property law of the United States, including without
limitation the federal copyright law, and, to the extent such
U.S. federal law does not apply, by the law of the Commonwealth of
Virginia, excluding Virginia's conflict of law provisions.
Notwithstanding the foregoing, with regard to derivative works based
on Python 1.6.1 that incorporate non-separable material that was
previously distributed under the GNU General Public License (GPL), the
law of the Commonwealth of Virginia shall govern this License
Agreement only as to issues arising under or with respect to
Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
License Agreement shall be deemed to create any relationship of
agency, partnership, or joint venture between CNRI and Licensee.  This
License Agreement does not grant permission to use CNRI trademarks or
trade name in a trademark sense to endorse or promote products or
services of Licensee, or any third party.

8. By clicking on the "ACCEPT" button where indicated, or by copying,
installing or otherwise using Python 1.6.1, Licensee agrees to be
bound by the terms and conditions of this License Agreement.


CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
--------------------------------------------------

Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
The Netherlands.  All rights reserved.

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, and that the name of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
golly-2.5-src/docs/ReadMe.html0000644000175100001440000000465412156145314013177 00000000000000 Read Me for Golly

Welcome to Golly, a sophisticated tool for exploring Conway's Game of Life and many other types of cellular automata.

Key features:

  • Free, open source and cross-platform (Windows, Mac, Linux).
  • Supports both bounded and unbounded universes.
  • Supports various topologies (plane, torus, Klein bottle, etc.).
  • Supports multi-state universes (cells can have up to 256 states).
  • Includes QuickLife, a fast, memory-efficient algorithm.
  • Use the HashLife algorithm to see large patterns evolve at huge time scales.
  • Supports many different rules, including Wolfram's 1D rules, WireWorld, Generations, and John von Neumann's 29-state CA.
  • Use the RuleLoader algorithm to load your own rules.
  • Responsive even while generating or garbage collecting.
  • Reads RLE, macrocell, Life 1.05/1.06, dblife, and MCell files.
  • Can also read common graphic formats: BMP, PNG, GIF, TIFF.
  • Can extract patterns, scripts and rules from zip files.
  • Download files from online archives.
  • Includes a state-of-the-art pattern collection.
  • Fast loading of large patterns.
  • Paste in patterns from the clipboard.
  • Unlimited undo/redo.
  • Unbounded zooming out for astronomical patterns.
  • Auto fit option keeps a generating pattern within view.
  • Full screen option (no menu/status/tool/scroll bars).
  • Supports multiple layers, including cloned layers.
  • HTML-based help with an integrated Life Lexicon.
  • Scriptable via Perl or Python.
  • User-configurable keyboard shortcuts.

The Golly application can be installed anywhere you like, but make sure you move the whole folder because the various subfolders must be kept with the application.

We also provide bgolly, a GUI-less version of Golly that can be run from the command line.

The latest information is available at the Golly web site:

http://golly.sourceforge.net/

Now go forth and generate!

Andrew Trevorrow (andrew@trevorrow.com)
Tom Rokicki (rokicki@gmail.com)
(on behalf of The Golly Gang)

golly-2.5-src/docs/ToDo.html0000644000175100001440000001123612156145314012701 00000000000000 To-do notes for Golly
Andrew's list:
==============

- Optimize rendering by using OpenGL (see iGolly code).

- Auto stop script if it creates too many temp files (for undo).
  This can happen if a long-running script doesn't call new/open
  when it probably should.  See my email to Nathaniel with subject
  "Re: Golly methuselah search script".

- Change all Python commands to g_* for consistency with Perl commands.
  Unfortutely, we can't really keep the old commands in same module
  because doing "from golly import *" exposes old and new commands and
  so a script like goto.py that calls a non-Golly open command will fail.
  We could put old commands in a separate module called "oldgolly".
  Maybe best to leave this change for when the scripting API needs
  significant changes due to multi-rect selections.

- Avoid any remaining algo assumptions (search *_ALGO):
  - Need IsParityShifted() method to avoid QLIFE_ALGO assumption?

- Allow dragging zoom-in cursor to zoom into rect.

- Stop generating if pattern becomes empty, constant or p2 (qlife only)
  and display suitable message in status bar.  Or maybe just add
  Gabriel's oscillation detection as an option (see oscar.py).

- Allow non-rectangular (and disjoint) selections.

- Add simple methuselah/spaceship/osc/still-life searches as in LifeLab???

- Fix glitches in the way the algo button works:
  - On Mac we want button to look selected before menu appears.
  - On Win we want to be able to press-select-release.

- Add case studies to BUILD file: how to add a new menu item, how to add
  a new algorithm, etc.


Tom's list:
===========

File I/O

- Have hlifealgo .mc compatible with ghashbase .mc
- Generalized RLE in MC?

Algos

- Unzoom color merging
- Better status reports (% of hashtable full)

Scripting

- Tape construction script for replicator

Samples

- Small JVN examples

Fun

- htreebase
- hgridbase (finite universe; torus, etc.)
- allow (base) x (slow) algorithm "multiplication"
- pluggability of externally-defined algos
- perl/python slowcalc callbacks
- cache of slowcalc
- generational gc
- 32-bit indexed hashlife on 64-bit platforms

Other

- Improve batchmode.

- Fix qlifealgo::lowerRightPixel to prevent off-by-one error when
  selecting large pattern like caterpillar.


User suggestions:
=================

Nick Gotts:
- Need a way to copy exact gen/pop counts to clipboard.
  [No longer necessary now that a script can get this info.]

Jason Summers:
- For better viewing of patterns that move, have a way to automatically
  move the view X cells horizontally and Y cells vertically every Z gens.
  [Could be done quite easily via a script that prompts for X,Y,Z.]
- Allow diagonal selection rectangles.

Dave Greene:
- Provide a way to click-and-drag a selection to move it around.
- Make page and arrow scrolling amounts configurable (in Prefs > View).
- Add a getview() script command that returns current viewport rect
  and a setview(rect) command to change viewport size and location.
- Make info window a floating window and keep it open (but update
  its contents) when user loads another pattern.

H. Koenig:
- Multiple windows.  [No real need now that we have multiple layers.]

Gabriel Nivasch:
- Make paste pattern semi-transparent.  [Tried it -- somewhat confusing.]
- Add a Default button to each Preferences pane (at bottom left?).

Bill Gosper:
- Modify info window so it can be used to edit and save comments.
- For scales > 1:1 make the pixel color depend on lg(# of ones in it).

Brice Due:
- Provide MCell-like editing capabilities.
- Provide a thumbnail option as an alternative to tiled layers;
  ie. the current layer would be displayed in a large "focal" viewport.
  All layers would be displayed as small, active thumbnails (at left
  or top edge of focal viewport, depending on aspect ratio?).
- Allow mc files to set step base and/or exponent via comment line like
  #X stepbase=8 stepexp=3
  [No need now that zip files can contain pattern + script?]

Tim Hutton:
- Add a script command to save comments in a pattern file.  Add optional
  param to existing save() command?

William R. Buckley:
- Provide an option to increase spacing between buttons.

Dean Hickerson:
- Make Duplicate Layer faster by writing current pattern to temp file
  and reading it into new layer.

tod222:
- Provide a way to cleanly shut down Golly from within a script.
  Maybe just use special exit() string like exit("QUIT GOLLY")?
  [No need -- can now call doevent("key q cmd").]
- Allow a command line argument (-minimize?) to start up with the
  main window in minimized state.  Shoule be possible in OnInit.